geolens/static/js/bundle.js
2024-10-29 03:00:35 -07:00

2052 lines
No EOL
2.1 MiB
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./src/ts/Map.ts":
/*!***********************!*\
!*** ./src/ts/Map.ts ***!
\***********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var pmtiles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pmtiles */ "./node_modules/pmtiles/dist/index.js");
/* harmony import */ var maplibre_gl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! maplibre-gl */ "./node_modules/maplibre-gl/dist/maplibre-gl.js");
/* harmony import */ var maplibre_gl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(maplibre_gl__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _modules_MapLayerSpecificationModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/MapLayerSpecificationModule */ "./src/ts/modules/MapLayerSpecificationModule.ts");
/* harmony import */ var _modules_AddCountryBorderModule__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/AddCountryBorderModule */ "./src/ts/modules/AddCountryBorderModule.ts");
var protocol = new pmtiles__WEBPACK_IMPORTED_MODULE_0__.Protocol();
maplibre_gl__WEBPACK_IMPORTED_MODULE_1__.addProtocol("pmtiles", protocol.tile);
var map = new maplibre_gl__WEBPACK_IMPORTED_MODULE_1__.Map({
container: "map",
zoom: 1,
minZoom: 2,
maxZoom: 6,
center: [0, 0],
style: {
version: 8,
sources: {
tiles: {
type: "vector",
url: "pmtiles://https://nbg1.your-objectstorage.com/maps/map.pmtiles",
},
},
layers: _modules_MapLayerSpecificationModule__WEBPACK_IMPORTED_MODULE_2__.layerSpecification,
},
});
map.addControl(new maplibre_gl__WEBPACK_IMPORTED_MODULE_1__.NavigationControl());
(0,_modules_AddCountryBorderModule__WEBPACK_IMPORTED_MODULE_3__.addCountryBorder)(map);
/***/ }),
/***/ "./src/ts/modules/AddCountryBorderModule.ts":
/*!**************************************************!*\
!*** ./src/ts/modules/AddCountryBorderModule.ts ***!
\**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ addCountryBorder: () => (/* binding */ addCountryBorder)
/* harmony export */ });
var hoveredStateId = null;
var addCountryBorder = function (map) {
map.on("load", function () {
map.addSource("states", {
type: "geojson",
data: "/static/src/earth.geojson",
promoteId: "iso_n3",
});
map.addLayer({
id: "state-fills",
type: "fill",
source: "states",
layout: {},
paint: {
"fill-color": "#627BC1",
"fill-opacity": [
"case",
["boolean", ["feature-state", "hover"], false],
0.2,
0,
],
},
});
map.addLayer({
id: "state-borders",
type: "line",
source: "states",
layout: {
"line-join": "round",
"line-cap": "round",
},
paint: {
"line-color": "#4b4b4b",
"line-width": [
"case",
["boolean", ["feature-state", "hover"], false],
1,
0.5,
],
"line-opacity": 1,
},
});
map.on("mousemove", "state-fills", function (e) {
if (e.features.length > 0) {
if (hoveredStateId) {
map.setFeatureState({ source: "states", id: hoveredStateId }, { hover: false });
}
hoveredStateId = e.features[0].id;
map.setFeatureState({ source: "states", id: hoveredStateId }, { hover: true });
}
});
map.on("mouseleave", "state-fills", function () {
if (hoveredStateId) {
map.setFeatureState({ source: "states", id: hoveredStateId }, { hover: false });
}
hoveredStateId = null;
});
});
};
/***/ }),
/***/ "./src/ts/modules/MapLayerSpecificationModule.ts":
/*!*******************************************************!*\
!*** ./src/ts/modules/MapLayerSpecificationModule.ts ***!
\*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ layerSpecification: () => (/* binding */ layerSpecification)
/* harmony export */ });
var layerSpecification = [
{
id: "forest",
source: "tiles",
"source-layer": "forest",
type: "fill",
paint: {
"fill-color": "#90ee90",
},
},
{
id: "water",
source: "tiles",
"source-layer": "water",
filter: ["==", ["geometry-type"], "Polygon"],
type: "fill",
paint: {
"fill-color": "#add8e6",
},
},
{
id: "buildings",
source: "tiles",
"source-layer": "buildings",
type: "fill",
paint: {
"fill-color": "#ffffc5",
},
},
{
id: "roads",
source: "tiles",
"source-layer": "roads",
type: "line",
paint: {
"line-color": "#d3d3d3",
},
},
];
/***/ }),
/***/ "./node_modules/maplibre-gl/dist/maplibre-gl.js":
/*!******************************************************!*\
!*** ./node_modules/maplibre-gl/dist/maplibre-gl.js ***!
\******************************************************/
/***/ (function(module) {
/**
* MapLibre GL JS
* @license 3-Clause BSD. Full text of license: https://github.com/maplibre/maplibre-gl-js/blob/v4.7.1/LICENSE.txt
*/
(function (global, factory) {
true ? module.exports = factory() :
0;
})(this, (function () { 'use strict';
/* eslint-disable */
var maplibregl = {};
var modules = {};
function define(moduleName, _dependencies, moduleFactory) {
modules[moduleName] = moduleFactory;
// to get the list of modules see generated dist/maplibre-gl-dev.js file (look for `define(` calls)
if (moduleName !== 'index') {
return;
}
// we assume that when an index module is initializing then other modules are loaded already
var workerBundleString = 'var sharedModule = {}; (' + modules.shared + ')(sharedModule); (' + modules.worker + ')(sharedModule);'
var sharedModule = {};
// the order of arguments of a module factory depends on rollup (it decides who is whose dependency)
// to check the correct order, see dist/maplibre-gl-dev.js file (look for `define(` calls)
// we assume that for our 3 chunks it will generate 3 modules and their order is predefined like the following
modules.shared(sharedModule);
modules.index(maplibregl, sharedModule);
if (typeof window !== 'undefined') {
maplibregl.setWorkerUrl(window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' })));
}
return maplibregl;
};
define("shared",["exports"],(function(t){"use strict";function e(t,e,r,n){return new(r||(r=Promise))((function(i,s){function a(t){try{l(n.next(t));}catch(t){s(t);}}function o(t){try{l(n.throw(t));}catch(t){s(t);}}function l(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e);}))).then(a,o);}l((n=n.apply(t,e||[])).next());}))}function r(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}"function"==typeof SuppressedError&&SuppressedError;var n=i;function i(t,e){this.x=t,this.y=e;}i.prototype={clone:function(){return new i(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},multByPoint:function(t){return this.clone()._multByPoint(t)},divByPoint:function(t){return this.clone()._divByPoint(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},rotateAround:function(t,e){return this.clone()._rotateAround(t,e)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,r=t.y-this.y;return e*e+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[2]*this.x+t[3]*this.y;return this.x=t[0]*this.x+t[1]*this.y,this.y=e,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_multByPoint:function(t){return this.x*=t.x,this.y*=t.y,this},_divByPoint:function(t){return this.x/=t.x,this.y/=t.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),r=Math.sin(t),n=r*this.x+e*this.y;return this.x=e*this.x-r*this.y,this.y=n,this},_rotateAround:function(t,e){var r=Math.cos(t),n=Math.sin(t),i=e.y+n*(this.x-e.x)+r*(this.y-e.y);return this.x=e.x+r*(this.x-e.x)-n*(this.y-e.y),this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},i.convert=function(t){return t instanceof i?t:Array.isArray(t)?new i(t[0],t[1]):t};var s=r(n),a=o;function o(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=e,this.p2x=r,this.p2y=n;}o.prototype={sampleCurveX:function(t){return ((this.ax*t+this.bx)*t+this.cx)*t},sampleCurveY:function(t){return ((this.ay*t+this.by)*t+this.cy)*t},sampleCurveDerivativeX:function(t){return (3*this.ax*t+2*this.bx)*t+this.cx},solveCurveX:function(t,e){if(void 0===e&&(e=1e-6),t<0)return 0;if(t>1)return 1;for(var r=t,n=0;n<8;n++){var i=this.sampleCurveX(r)-t;if(Math.abs(i)<e)return r;var s=this.sampleCurveDerivativeX(r);if(Math.abs(s)<1e-6)break;r-=i/s;}var a=0,o=1;for(r=t,n=0;n<20&&(i=this.sampleCurveX(r),!(Math.abs(i-t)<e));n++)t>i?a=r:o=r,r=.5*(o-a)+a;return r},solve:function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}};var l=r(a);let u,c;function h(){return null==u&&(u="undefined"!=typeof OffscreenCanvas&&new OffscreenCanvas(1,1).getContext("2d")&&"function"==typeof createImageBitmap),u}function p(){if(null==c&&(c=!1,h())){const t=5,e=new OffscreenCanvas(t,t).getContext("2d",{willReadFrequently:!0});if(e){for(let r=0;r<t*t;r++){const n=4*r;e.fillStyle=`rgb(${n},${n+1},${n+2})`,e.fillRect(r%t,Math.floor(r/t),1,1);}const r=e.getImageData(0,0,t,t).data;for(let e=0;e<t*t*4;e++)if(e%4!=3&&r[e]!==e){c=!0;break}}}return c||!1}function f(t,e,r,n){const i=new l(t,e,r,n);return t=>i.solve(t)}const d=f(.25,.1,.25,1);function y(t,e,r){return Math.min(r,Math.max(e,t))}function m(t,e,r){const n=r-e,i=((t-e)%n+n)%n+e;return i===e?r:i}function g(t,...e){for(const r of e)for(const e in r)t[e]=r[e];return t}let x=1;function v(t,e,r){const n={};for(const r in t)n[r]=e.call(this,t[r],r,t);return n}function b(t,e,r){const n={};for(const r in t)e.call(this,t[r],r,t)&&(n[r]=t[r]);return n}function w(t){return Array.isArray(t)?t.map(w):"object"==typeof t&&t?v(t,w):t}const _={};function A(t){_[t]||("undefined"!=typeof console&&console.warn(t),_[t]=!0);}function S(t,e,r){return (r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function k(t){return "undefined"!=typeof WorkerGlobalScope&&void 0!==t&&t instanceof WorkerGlobalScope}let M=null;function I(t){return "undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap}const z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";function P(t,r,n,i,s){return e(this,void 0,void 0,(function*(){if("undefined"==typeof VideoFrame)throw new Error("VideoFrame not supported");const e=new VideoFrame(t,{timestamp:0});try{const a=null==e?void 0:e.format;if(!a||!a.startsWith("BGR")&&!a.startsWith("RGB"))throw new Error(`Unrecognized format ${a}`);const o=a.startsWith("BGR"),l=new Uint8ClampedArray(i*s*4);if(yield e.copyTo(l,function(t,e,r,n,i){const s=4*Math.max(-e,0),a=(Math.max(0,r)-r)*n*4+s,o=4*n,l=Math.max(0,e),u=Math.max(0,r);return {rect:{x:l,y:u,width:Math.min(t.width,e+n)-l,height:Math.min(t.height,r+i)-u},layout:[{offset:a,stride:o}]}}(t,r,n,i,s)),o)for(let t=0;t<l.length;t+=4){const e=l[t];l[t]=l[t+2],l[t+2]=e;}return l}finally{e.close();}}))}let C,B;const V="AbortError";function E(){return new Error(V)}const F={MAX_PARALLEL_IMAGE_REQUESTS:16,MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME:8,MAX_TILE_CACHE_ZOOM_LEVELS:5,REGISTERED_PROTOCOLS:{},WORKER_URL:""};function T(t){return F.REGISTERED_PROTOCOLS[t.substring(0,t.indexOf("://"))]}const $="global-dispatcher";class L extends Error{constructor(t,e,r,n){super(`AJAXError: ${e} (${t}): ${r}`),this.status=t,this.statusText=e,this.url=r,this.body=n;}}const D=()=>k(self)?self.worker&&self.worker.referrer:("blob:"===window.location.protocol?window.parent:window).location.href,O=function(t,r){if(/:\/\//.test(t.url)&&!/^https?:|^file:/.test(t.url)){const e=T(t.url);if(e)return e(t,r);if(k(self)&&self.worker&&self.worker.actor)return self.worker.actor.sendAsync({type:"GR",data:t,targetMapId:$},r)}if(!(/^file:/.test(n=t.url)||/^file:/.test(D())&&!/^\w+:/.test(n))){if(fetch&&Request&&AbortController&&Object.prototype.hasOwnProperty.call(Request.prototype,"signal"))return function(t,r){return e(this,void 0,void 0,(function*(){const e=new Request(t.url,{method:t.method||"GET",body:t.body,credentials:t.credentials,headers:t.headers,cache:t.cache,referrer:D(),signal:r.signal});"json"!==t.type||e.headers.has("Accept")||e.headers.set("Accept","application/json");const n=yield fetch(e);if(!n.ok){const e=yield n.blob();throw new L(n.status,n.statusText,t.url,e)}let i;i="arrayBuffer"===t.type||"image"===t.type?n.arrayBuffer():"json"===t.type?n.json():n.text();const s=yield i;if(r.signal.aborted)throw E();return {data:s,cacheControl:n.headers.get("Cache-Control"),expires:n.headers.get("Expires")}}))}(t,r);if(k(self)&&self.worker&&self.worker.actor)return self.worker.actor.sendAsync({type:"GR",data:t,mustQueue:!0,targetMapId:$},r)}var n;return function(t,e){return new Promise(((r,n)=>{var i;const s=new XMLHttpRequest;s.open(t.method||"GET",t.url,!0),"arrayBuffer"!==t.type&&"image"!==t.type||(s.responseType="arraybuffer");for(const e in t.headers)s.setRequestHeader(e,t.headers[e]);"json"===t.type&&(s.responseType="text",(null===(i=t.headers)||void 0===i?void 0:i.Accept)||s.setRequestHeader("Accept","application/json")),s.withCredentials="include"===t.credentials,s.onerror=()=>{n(new Error(s.statusText));},s.onload=()=>{if(!e.signal.aborted)if((s.status>=200&&s.status<300||0===s.status)&&null!==s.response){let e=s.response;if("json"===t.type)try{e=JSON.parse(s.response);}catch(t){return void n(t)}r({data:e,cacheControl:s.getResponseHeader("Cache-Control"),expires:s.getResponseHeader("Expires")});}else {const e=new Blob([s.response],{type:s.getResponseHeader("Content-Type")});n(new L(s.status,s.statusText,t.url,e));}},e.signal.addEventListener("abort",(()=>{s.abort(),n(E());})),s.send(t.body);}))}(t,r)};function j(t){if(!t||t.indexOf("://")<=0||0===t.indexOf("data:image/")||0===t.indexOf("blob:"))return !0;const e=new URL(t),r=window.location;return e.protocol===r.protocol&&e.host===r.host}function R(t,e,r){r[t]&&-1!==r[t].indexOf(e)||(r[t]=r[t]||[],r[t].push(e));}function U(t,e,r){if(r&&r[t]){const n=r[t].indexOf(e);-1!==n&&r[t].splice(n,1);}}class q{constructor(t,e={}){g(this,e),this.type=t;}}class N extends q{constructor(t,e={}){super("error",g({error:t},e));}}class Z{on(t,e){return this._listeners=this._listeners||{},R(t,e,this._listeners),this}off(t,e){return U(t,e,this._listeners),U(t,e,this._oneTimeListeners),this}once(t,e){return e?(this._oneTimeListeners=this._oneTimeListeners||{},R(t,e,this._oneTimeListeners),this):new Promise((e=>this.once(t,e)))}fire(t,e){"string"==typeof t&&(t=new q(t,e||{}));const r=t.type;if(this.listens(r)){t.target=this;const e=this._listeners&&this._listeners[r]?this._listeners[r].slice():[];for(const r of e)r.call(this,t);const n=this._oneTimeListeners&&this._oneTimeListeners[r]?this._oneTimeListeners[r].slice():[];for(const e of n)U(r,e,this._oneTimeListeners),e.call(this,t);const i=this._eventedParent;i&&(g(t,"function"==typeof this._eventedParentData?this._eventedParentData():this._eventedParentData),i.fire(t));}else t instanceof N&&console.error(t.error);return this}listens(t){return this._listeners&&this._listeners[t]&&this._listeners[t].length>0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t)}setEventedParent(t,e){return this._eventedParent=t,this._eventedParentData=e,this}}var G={$version:8,$root:{version:{required:!0,type:"enum",values:[8]},name:{type:"string"},metadata:{type:"*"},center:{type:"array",value:"number"},zoom:{type:"number"},bearing:{type:"number",default:0,period:360,units:"degrees"},pitch:{type:"number",default:0,units:"degrees"},light:{type:"light"},sky:{type:"sky"},projection:{type:"projection"},terrain:{type:"terrain"},sources:{required:!0,type:"sources"},sprite:{type:"sprite"},glyphs:{type:"string"},transition:{type:"transition"},layers:{required:!0,type:"array",value:"layer"}},sources:{"*":{type:"source"}},source:["source_vector","source_raster","source_raster_dem","source_geojson","source_video","source_image"],source_vector:{type:{required:!0,type:"enum",values:{vector:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},attribution:{type:"string"},promoteId:{type:"promoteId"},volatile:{type:"boolean",default:!1},"*":{type:"*"}},source_raster:{type:{required:!0,type:"enum",values:{raster:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},attribution:{type:"string"},volatile:{type:"boolean",default:!1},"*":{type:"*"}},source_raster_dem:{type:{required:!0,type:"enum",values:{"raster-dem":{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},attribution:{type:"string"},encoding:{type:"enum",values:{terrarium:{},mapbox:{},custom:{}},default:"mapbox"},redFactor:{type:"number",default:1},blueFactor:{type:"number",default:1},greenFactor:{type:"number",default:1},baseShift:{type:"number",default:0},volatile:{type:"boolean",default:!1},"*":{type:"*"}},source_geojson:{type:{required:!0,type:"enum",values:{geojson:{}}},data:{required:!0,type:"*"},maxzoom:{type:"number",default:18},attribution:{type:"string"},buffer:{type:"number",default:128,maximum:512,minimum:0},filter:{type:"*"},tolerance:{type:"number",default:.375},cluster:{type:"boolean",default:!1},clusterRadius:{type:"number",default:50,minimum:0},clusterMaxZoom:{type:"number"},clusterMinPoints:{type:"number"},clusterProperties:{type:"*"},lineMetrics:{type:"boolean",default:!1},generateId:{type:"boolean",default:!1},promoteId:{type:"promoteId"}},source_video:{type:{required:!0,type:"enum",values:{video:{}}},urls:{required:!0,type:"array",value:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},source_image:{type:{required:!0,type:"enum",values:{image:{}}},url:{required:!0,type:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},layer:{id:{type:"string",required:!0},type:{type:"enum",values:{fill:{},line:{},symbol:{},circle:{},heatmap:{},"fill-extrusion":{},raster:{},hillshade:{},background:{}},required:!0},metadata:{type:"*"},source:{type:"string"},"source-layer":{type:"string"},minzoom:{type:"number",minimum:0,maximum:24},maxzoom:{type:"number",minimum:0,maximum:24},filter:{type:"filter"},layout:{type:"layout"},paint:{type:"paint"}},layout:["layout_fill","layout_line","layout_circle","layout_heatmap","layout_fill-extrusion","layout_symbol","layout_raster","layout_hillshade","layout_background"],layout_background:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_fill:{"fill-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_circle:{"circle-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_heatmap:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},"layout_fill-extrusion":{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_line:{"line-cap":{type:"enum",values:{butt:{},round:{},square:{}},default:"butt",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-join":{type:"enum",values:{bevel:{},round:{},miter:{}},default:"miter",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"line-miter-limit":{type:"number",default:2,requires:[{"line-join":"miter"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-round-limit":{type:"number",default:1.05,requires:[{"line-join":"round"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_symbol:{"symbol-placement":{type:"enum",values:{point:{},line:{},"line-center":{}},default:"point",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-spacing":{type:"number",default:250,minimum:1,units:"pixels",requires:[{"symbol-placement":"line"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"symbol-avoid-edges":{type:"boolean",default:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"symbol-z-order":{type:"enum",values:{auto:{},"viewport-y":{},source:{}},default:"auto",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-allow-overlap":{type:"boolean",default:!1,requires:["icon-image",{"!":"icon-overlap"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-overlap":{type:"enum",values:{never:{},always:{},cooperative:{}},requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-ignore-placement":{type:"boolean",default:!1,requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-optional":{type:"boolean",default:!1,requires:["icon-image","text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-rotation-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-size":{type:"number",default:1,minimum:0,units:"factor of the original icon size",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-text-fit":{type:"enum",values:{none:{},width:{},height:{},both:{}},default:"none",requires:["icon-image","text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-text-fit-padding":{type:"array",value:"number",length:4,default:[0,0,0,0],units:"pixels",requires:["icon-image","text-field",{"icon-text-fit":["both","width","height"]}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-image":{type:"resolvedImage",tokens:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-rotate":{type:"number",default:0,period:360,units:"degrees",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-padding":{type:"padding",default:[2],units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-keep-upright":{type:"boolean",default:!1,requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-offset":{type:"array",value:"number",length:2,default:[0,0],requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-anchor":{type:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-pitch-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-pitch-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotation-alignment":{type:"enum",values:{map:{},viewport:{},"viewport-glyph":{},auto:{}},default:"auto",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-field":{type:"formatted",default:"",tokens:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-font":{type:"array",value:"string",default:["Open Sans Regular","Arial Unicode MS Regular"],requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-size":{type:"number",default:16,minimum:0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-width":{type:"number",default:10,minimum:0,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-line-height":{type:"number",default:1.2,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-letter-spacing":{type:"number",default:0,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-justify":{type:"enum",values:{auto:{},left:{},center:{},right:{}},default:"center",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-radial-offset":{type:"number",units:"ems",default:0,requires:["text-field"],"property-type":"data-driven",expression:{interpolated:!0,parameters:["zoom","feature"]}},"text-variable-anchor":{type:"array",value:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-variable-anchor-offset":{type:"variableAnchorOffsetCollection",requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-anchor":{type:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["text-field",{"!":"text-variable-anchor"}],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-angle":{type:"number",default:45,units:"degrees",requires:["text-field",{"symbol-placement":["line","line-center"]}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-writing-mode":{type:"array",value:"enum",values:{horizontal:{},vertical:{}},requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotate":{type:"number",default:0,period:360,units:"degrees",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-padding":{type:"number",default:2,minimum:0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-keep-upright":{type:"boolean",default:!0,requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-transform":{type:"enum",values:{none:{},uppercase:{},lowercase:{}},default:"none",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-offset":{type:"array",value:"number",units:"ems",length:2,default:[0,0],requires:["text-field",{"!":"text-radial-offset"}],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-allow-overlap":{type:"boolean",default:!1,requires:["text-field",{"!":"text-overlap"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-overlap":{type:"enum",values:{never:{},always:{},cooperative:{}},requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-ignore-placement":{type:"boolean",default:!1,requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-optional":{type:"boolean",default:!1,requires:["text-field","icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_raster:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_hillshade:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},filter:{type:"array",value:"*"},filter_operator:{type:"enum",values:{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},in:{},"!in":{},all:{},any:{},none:{},has:{},"!has":{}}},geometry_type:{type:"enum",values:{Point:{},LineString:{},Polygon:{}}},function:{expression:{type:"expression"},stops:{type:"array",value:"function_stop"},base:{type:"number",default:1,minimum:0},property:{type:"string",default:"$zoom"},type:{type:"enum",values:{identity:{},exponential:{},interval:{},categorical:{}},default:"exponential"},colorSpace:{type:"enum",values:{rgb:{},lab:{},hcl:{}},default:"rgb"},default:{type:"*",required:!1}},function_stop:{type:"array",minimum:0,maximum:24,value:["number","color"],length:2},expression:{type:"array",value:"*",minimum:1},light:{anchor:{type:"enum",default:"viewport",values:{map:{},viewport:{}},"property-type":"data-constant",transition:!1,expression:{interpolated:!1,parameters:["zoom"]}},position:{type:"array",default:[1.15,210,30],length:3,value:"number","property-type":"data-constant",transition:!0,expression:{interpolated:!0,parameters:["zoom"]}},color:{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0},intensity:{type:"number","property-type":"data-constant",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0}},sky:{"sky-color":{type:"color","property-type":"data-constant",default:"#88C6FC",expression:{interpolated:!0,parameters:["zoom"]},transition:!0},"horizon-color":{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0},"fog-color":{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0},"fog-ground-blend":{type:"number","property-type":"data-constant",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0},"horizon-fog-blend":{type:"number","property-type":"data-constant",default:.8,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0},"sky-horizon-blend":{type:"number","property-type":"data-constant",default:.8,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0},"atmosphere-blend":{type:"number","property-type":"data-constant",default:.8,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0}},terrain:{source:{type:"string",required:!0},exaggeration:{type:"number",minimum:0,default:1}},projection:{type:{type:"enum",default:"mercator",values:{mercator:{},globe:{}}}},paint:["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background"],paint_fill:{"fill-antialias":{type:"boolean",default:!0,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"fill-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-outline-color":{type:"color",transition:!0,requires:[{"!":"fill-pattern"},{"fill-antialias":!0}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["fill-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"}},"paint_fill-extrusion":{"fill-extrusion-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"fill-extrusion-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["fill-extrusion-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"fill-extrusion-height":{type:"number",default:0,minimum:0,units:"meters",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-base":{type:"number",default:0,minimum:0,units:"meters",transition:!0,requires:["fill-extrusion-height"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-vertical-gradient":{type:"boolean",default:!0,transition:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_line:{"line-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"line-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["line-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-width":{type:"number",default:1,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-gap-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-offset":{type:"number",default:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-dasharray":{type:"array",value:"number",minimum:0,transition:!0,units:"line widths",requires:[{"!":"line-pattern"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"line-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-gradient":{type:"color",transition:!1,requires:[{"!":"line-dasharray"},{"!":"line-pattern"},{source:"geojson",has:{lineMetrics:!0}}],expression:{interpolated:!0,parameters:["line-progress"]},"property-type":"color-ramp"}},paint_circle:{"circle-radius":{type:"number",default:5,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-blur":{type:"number",default:0,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"circle-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["circle-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-scale":{type:"enum",values:{map:{},viewport:{}},default:"map",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-alignment":{type:"enum",values:{map:{},viewport:{}},default:"viewport",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-stroke-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"}},paint_heatmap:{"heatmap-radius":{type:"number",default:30,minimum:1,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-weight":{type:"number",default:1,minimum:0,transition:!1,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-intensity":{type:"number",default:1,minimum:0,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"heatmap-color":{type:"color",default:["interpolate",["linear"],["heatmap-density"],0,"rgba(0, 0, 255, 0)",.1,"royalblue",.3,"cyan",.5,"lime",.7,"yellow",1,"red"],transition:!1,expression:{interpolated:!0,parameters:["heatmap-density"]},"property-type":"color-ramp"},"heatmap-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_symbol:{"icon-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-color":{type:"color",default:"#000000",transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["icon-image","icon-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-color":{type:"color",default:"#000000",transition:!0,overridable:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["text-field","text-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_raster:{"raster-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-hue-rotate":{type:"number",default:0,period:360,transition:!0,units:"degrees",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-min":{type:"number",default:0,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-max":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-saturation":{type:"number",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-contrast":{type:"number",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-resampling":{type:"enum",values:{linear:{},nearest:{}},default:"linear",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"raster-fade-duration":{type:"number",default:300,minimum:0,transition:!1,units:"milliseconds",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_hillshade:{"hillshade-illumination-direction":{type:"number",default:335,minimum:0,maximum:359,transition:!1,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-illumination-anchor":{type:"enum",values:{map:{},viewport:{}},default:"viewport",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-exaggeration":{type:"number",default:.5,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-shadow-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-highlight-color":{type:"color",default:"#FFFFFF",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-accent-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_background:{"background-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"background-pattern"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"background-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"background-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},transition:{duration:{type:"number",default:300,minimum:0,units:"milliseconds"},delay:{type:"number",default:0,minimum:0,units:"milliseconds"}},"property-type":{"data-driven":{type:"property-type"},"cross-faded":{type:"property-type"},"cross-faded-data-driven":{type:"property-type"},"color-ramp":{type:"property-type"},"data-constant":{type:"property-type"},constant:{type:"property-type"}},promoteId:{"*":{type:"string"}}};const K=["type","source","source-layer","minzoom","maxzoom","filter","layout"];function X(t,e){const r={};for(const e in t)"ref"!==e&&(r[e]=t[e]);return K.forEach((t=>{t in e&&(r[t]=e[t]);})),r}function H(t,e){if(Array.isArray(t)){if(!Array.isArray(e)||t.length!==e.length)return !1;for(let r=0;r<t.length;r++)if(!H(t[r],e[r]))return !1;return !0}if("object"==typeof t&&null!==t&&null!==e){if("object"!=typeof e)return !1;if(Object.keys(t).length!==Object.keys(e).length)return !1;for(const r in t)if(!H(t[r],e[r]))return !1;return !0}return t===e}function Y(t,e){t.push(e);}function J(t,e,r){Y(r,{command:"addSource",args:[t,e[t]]});}function W(t,e,r){Y(e,{command:"removeSource",args:[t]}),r[t]=!0;}function Q(t,e,r,n){W(t,r,n),J(t,e,r);}function tt(t,e,r){let n;for(n in t[r])if(Object.prototype.hasOwnProperty.call(t[r],n)&&"data"!==n&&!H(t[r][n],e[r][n]))return !1;for(n in e[r])if(Object.prototype.hasOwnProperty.call(e[r],n)&&"data"!==n&&!H(t[r][n],e[r][n]))return !1;return !0}function et(t,e,r,n,i,s){t=t||{},e=e||{};for(const a in t)Object.prototype.hasOwnProperty.call(t,a)&&(H(t[a],e[a])||r.push({command:s,args:[n,a,e[a],i]}));for(const a in e)Object.prototype.hasOwnProperty.call(e,a)&&!Object.prototype.hasOwnProperty.call(t,a)&&(H(t[a],e[a])||r.push({command:s,args:[n,a,e[a],i]}));}function rt(t){return t.id}function nt(t,e){return t[e.id]=e,t}class it{constructor(t,e,r,n){this.message=(t?`${t}: `:"")+r,n&&(this.identifier=n),null!=e&&e.__line__&&(this.line=e.__line__);}}function st(t,...e){for(const r of e)for(const e in r)t[e]=r[e];return t}class at extends Error{constructor(t,e){super(e),this.message=e,this.key=t;}}class ot{constructor(t,e=[]){this.parent=t,this.bindings={};for(const[t,r]of e)this.bindings[t]=r;}concat(t){return new ot(this,t)}get(t){if(this.bindings[t])return this.bindings[t];if(this.parent)return this.parent.get(t);throw new Error(`${t} not found in scope.`)}has(t){return !!this.bindings[t]||!!this.parent&&this.parent.has(t)}}const lt={kind:"null"},ut={kind:"number"},ct={kind:"string"},ht={kind:"boolean"},pt={kind:"color"},ft={kind:"object"},dt={kind:"value"},yt={kind:"collator"},mt={kind:"formatted"},gt={kind:"padding"},xt={kind:"resolvedImage"},vt={kind:"variableAnchorOffsetCollection"};function bt(t,e){return {kind:"array",itemType:t,N:e}}function wt(t){if("array"===t.kind){const e=wt(t.itemType);return "number"==typeof t.N?`array<${e}, ${t.N}>`:"value"===t.itemType.kind?"array":`array<${e}>`}return t.kind}const _t=[lt,ut,ct,ht,pt,mt,ft,bt(dt),gt,xt,vt];function At(t,e){if("error"===e.kind)return null;if("array"===t.kind){if("array"===e.kind&&(0===e.N&&"value"===e.itemType.kind||!At(t.itemType,e.itemType))&&("number"!=typeof t.N||t.N===e.N))return null}else {if(t.kind===e.kind)return null;if("value"===t.kind)for(const t of _t)if(!At(t,e))return null}return `Expected ${wt(t)} but found ${wt(e)} instead.`}function St(t,e){return e.some((e=>e.kind===t.kind))}function kt(t,e){return e.some((e=>"null"===e?null===t:"array"===e?Array.isArray(t):"object"===e?t&&!Array.isArray(t)&&"object"==typeof t:e===typeof t))}function Mt(t,e){return "array"===t.kind&&"array"===e.kind?t.itemType.kind===e.itemType.kind&&"number"==typeof t.N:t.kind===e.kind}const It=.96422,zt=.82521,Pt=4/29,Ct=6/29,Bt=3*Ct*Ct,Vt=Ct*Ct*Ct,Et=Math.PI/180,Ft=180/Math.PI;function Tt(t){return (t%=360)<0&&(t+=360),t}function $t([t,e,r,n]){let i,s;const a=Dt((.2225045*(t=Lt(t))+.7168786*(e=Lt(e))+.0606169*(r=Lt(r)))/1);t===e&&e===r?i=s=a:(i=Dt((.4360747*t+.3850649*e+.1430804*r)/It),s=Dt((.0139322*t+.0971045*e+.7141733*r)/zt));const o=116*a-16;return [o<0?0:o,500*(i-a),200*(a-s),n]}function Lt(t){return t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Dt(t){return t>Vt?Math.pow(t,1/3):t/Bt+Pt}function Ot([t,e,r,n]){let i=(t+16)/116,s=isNaN(e)?i:i+e/500,a=isNaN(r)?i:i-r/200;return i=1*Rt(i),s=It*Rt(s),a=zt*Rt(a),[jt(3.1338561*s-1.6168667*i-.4906146*a),jt(-.9787684*s+1.9161415*i+.033454*a),jt(.0719453*s-.2289914*i+1.4052427*a),n]}function jt(t){return (t=t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055)<0?0:t>1?1:t}function Rt(t){return t>Ct?t*t*t:Bt*(t-Pt)}function Ut(t){return parseInt(t.padEnd(2,t),16)/255}function qt(t,e){return Nt(e?t/100:t,0,1)}function Nt(t,e,r){return Math.min(Math.max(e,t),r)}function Zt(t){return !t.some(Number.isNaN)}const Gt={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};class Kt{constructor(t,e,r,n=1,i=!0){this.r=t,this.g=e,this.b=r,this.a=n,i||(this.r*=n,this.g*=n,this.b*=n,n||this.overwriteGetter("rgb",[t,e,r,n]));}static parse(t){if(t instanceof Kt)return t;if("string"!=typeof t)return;const e=function(t){if("transparent"===(t=t.toLowerCase().trim()))return [0,0,0,0];const e=Gt[t];if(e){const[t,r,n]=e;return [t/255,r/255,n/255,1]}if(t.startsWith("#")&&/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(t)){const e=t.length<6?1:2;let r=1;return [Ut(t.slice(r,r+=e)),Ut(t.slice(r,r+=e)),Ut(t.slice(r,r+=e)),Ut(t.slice(r,r+e)||"ff")]}if(t.startsWith("rgb")){const e=t.match(/^rgba?\(\s*([\de.+-]+)(%)?(?:\s+|\s*(,)\s*)([\de.+-]+)(%)?(?:\s+|\s*(,)\s*)([\de.+-]+)(%)?(?:\s*([,\/])\s*([\de.+-]+)(%)?)?\s*\)$/);if(e){const[t,r,n,i,s,a,o,l,u,c,h,p]=e,f=[i||" ",o||" ",c].join("");if(" "===f||" /"===f||",,"===f||",,,"===f){const t=[n,a,u].join(""),e="%%%"===t?100:""===t?255:0;if(e){const t=[Nt(+r/e,0,1),Nt(+s/e,0,1),Nt(+l/e,0,1),h?qt(+h,p):1];if(Zt(t))return t}}return}}const r=t.match(/^hsla?\(\s*([\de.+-]+)(?:deg)?(?:\s+|\s*(,)\s*)([\de.+-]+)%(?:\s+|\s*(,)\s*)([\de.+-]+)%(?:\s*([,\/])\s*([\de.+-]+)(%)?)?\s*\)$/);if(r){const[t,e,n,i,s,a,o,l,u]=r,c=[n||" ",s||" ",o].join("");if(" "===c||" /"===c||",,"===c||",,,"===c){const t=[+e,Nt(+i,0,100),Nt(+a,0,100),l?qt(+l,u):1];if(Zt(t))return function([t,e,r,n]){function i(n){const i=(n+t/30)%12,s=e*Math.min(r,1-r);return r-s*Math.max(-1,Math.min(i-3,9-i,1))}return t=Tt(t),e/=100,r/=100,[i(0),i(8),i(4),n]}(t)}}}(t);return e?new Kt(...e,!1):void 0}get rgb(){const{r:t,g:e,b:r,a:n}=this,i=n||1/0;return this.overwriteGetter("rgb",[t/i,e/i,r/i,n])}get hcl(){return this.overwriteGetter("hcl",function(t){const[e,r,n,i]=$t(t),s=Math.sqrt(r*r+n*n);return [Math.round(1e4*s)?Tt(Math.atan2(n,r)*Ft):NaN,s,e,i]}(this.rgb))}get lab(){return this.overwriteGetter("lab",$t(this.rgb))}overwriteGetter(t,e){return Object.defineProperty(this,t,{value:e}),e}toString(){const[t,e,r,n]=this.rgb;return `rgba(${[t,e,r].map((t=>Math.round(255*t))).join(",")},${n})`}}Kt.black=new Kt(0,0,0,1),Kt.white=new Kt(1,1,1,1),Kt.transparent=new Kt(0,0,0,0),Kt.red=new Kt(1,0,0,1);class Xt{constructor(t,e,r){this.sensitivity=t?e?"variant":"case":e?"accent":"base",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:"search"});}compare(t,e){return this.collator.compare(t,e)}resolvedLocale(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale}}class Ht{constructor(t,e,r,n,i){this.text=t,this.image=e,this.scale=r,this.fontStack=n,this.textColor=i;}}class Yt{constructor(t){this.sections=t;}static fromString(t){return new Yt([new Ht(t,null,null,null,null)])}isEmpty(){return 0===this.sections.length||!this.sections.some((t=>0!==t.text.length||t.image&&0!==t.image.name.length))}static factory(t){return t instanceof Yt?t:Yt.fromString(t)}toString(){return 0===this.sections.length?"":this.sections.map((t=>t.text)).join("")}}class Jt{constructor(t){this.values=t.slice();}static parse(t){if(t instanceof Jt)return t;if("number"==typeof t)return new Jt([t,t,t,t]);if(Array.isArray(t)&&!(t.length<1||t.length>4)){for(const e of t)if("number"!=typeof e)return;switch(t.length){case 1:t=[t[0],t[0],t[0],t[0]];break;case 2:t=[t[0],t[1],t[0],t[1]];break;case 3:t=[t[0],t[1],t[2],t[1]];}return new Jt(t)}}toString(){return JSON.stringify(this.values)}}const Wt=new Set(["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"]);class Qt{constructor(t){this.values=t.slice();}static parse(t){if(t instanceof Qt)return t;if(Array.isArray(t)&&!(t.length<1)&&t.length%2==0){for(let e=0;e<t.length;e+=2){const r=t[e],n=t[e+1];if("string"!=typeof r||!Wt.has(r))return;if(!Array.isArray(n)||2!==n.length||"number"!=typeof n[0]||"number"!=typeof n[1])return}return new Qt(t)}}toString(){return JSON.stringify(this.values)}}class te{constructor(t){this.name=t.name,this.available=t.available;}toString(){return this.name}static fromString(t){return t?new te({name:t,available:!1}):null}}function ee(t,e,r,n){return "number"==typeof t&&t>=0&&t<=255&&"number"==typeof e&&e>=0&&e<=255&&"number"==typeof r&&r>=0&&r<=255?void 0===n||"number"==typeof n&&n>=0&&n<=1?null:`Invalid rgba value [${[t,e,r,n].join(", ")}]: 'a' must be between 0 and 1.`:`Invalid rgba value [${("number"==typeof n?[t,e,r,n]:[t,e,r]).join(", ")}]: 'r', 'g', and 'b' must be between 0 and 255.`}function re(t){if(null===t||"string"==typeof t||"boolean"==typeof t||"number"==typeof t||t instanceof Kt||t instanceof Xt||t instanceof Yt||t instanceof Jt||t instanceof Qt||t instanceof te)return !0;if(Array.isArray(t)){for(const e of t)if(!re(e))return !1;return !0}if("object"==typeof t){for(const e in t)if(!re(t[e]))return !1;return !0}return !1}function ne(t){if(null===t)return lt;if("string"==typeof t)return ct;if("boolean"==typeof t)return ht;if("number"==typeof t)return ut;if(t instanceof Kt)return pt;if(t instanceof Xt)return yt;if(t instanceof Yt)return mt;if(t instanceof Jt)return gt;if(t instanceof Qt)return vt;if(t instanceof te)return xt;if(Array.isArray(t)){const e=t.length;let r;for(const e of t){const t=ne(e);if(r){if(r===t)continue;r=dt;break}r=t;}return bt(r||dt,e)}return ft}function ie(t){const e=typeof t;return null===t?"":"string"===e||"number"===e||"boolean"===e?String(t):t instanceof Kt||t instanceof Yt||t instanceof Jt||t instanceof Qt||t instanceof te?t.toString():JSON.stringify(t)}class se{constructor(t,e){this.type=t,this.value=e;}static parse(t,e){if(2!==t.length)return e.error(`'literal' expression requires exactly one argument, but found ${t.length-1} instead.`);if(!re(t[1]))return e.error("invalid value");const r=t[1];let n=ne(r);const i=e.expectedType;return "array"!==n.kind||0!==n.N||!i||"array"!==i.kind||"number"==typeof i.N&&0!==i.N||(n=i),new se(n,r)}evaluate(){return this.value}eachChild(){}outputDefined(){return !0}}class ae{constructor(t){this.name="ExpressionEvaluationError",this.message=t;}toJSON(){return this.message}}const oe={string:ct,number:ut,boolean:ht,object:ft};class le{constructor(t,e){this.type=t,this.args=e;}static parse(t,e){if(t.length<2)return e.error("Expected at least one argument.");let r,n=1;const i=t[0];if("array"===i){let i,s;if(t.length>2){const r=t[1];if("string"!=typeof r||!(r in oe)||"object"===r)return e.error('The item type argument of "array" must be one of string, number, boolean',1);i=oe[r],n++;}else i=dt;if(t.length>3){if(null!==t[2]&&("number"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return e.error('The length argument to "array" must be a positive integer literal',2);s=t[2],n++;}r=bt(i,s);}else {if(!oe[i])throw new Error(`Types doesn't contain name = ${i}`);r=oe[i];}const s=[];for(;n<t.length;n++){const r=e.parse(t[n],n,dt);if(!r)return null;s.push(r);}return new le(r,s)}evaluate(t){for(let e=0;e<this.args.length;e++){const r=this.args[e].evaluate(t);if(!At(this.type,ne(r)))return r;if(e===this.args.length-1)throw new ae(`Expected value to be of type ${wt(this.type)}, but found ${wt(ne(r))} instead.`)}throw new Error}eachChild(t){this.args.forEach(t);}outputDefined(){return this.args.every((t=>t.outputDefined()))}}const ue={"to-boolean":ht,"to-color":pt,"to-number":ut,"to-string":ct};class ce{constructor(t,e){this.type=t,this.args=e;}static parse(t,e){if(t.length<2)return e.error("Expected at least one argument.");const r=t[0];if(!ue[r])throw new Error(`Can't parse ${r} as it is not part of the known types`);if(("to-boolean"===r||"to-string"===r)&&2!==t.length)return e.error("Expected one argument.");const n=ue[r],i=[];for(let r=1;r<t.length;r++){const n=e.parse(t[r],r,dt);if(!n)return null;i.push(n);}return new ce(n,i)}evaluate(t){switch(this.type.kind){case"boolean":return Boolean(this.args[0].evaluate(t));case"color":{let e,r;for(const n of this.args){if(e=n.evaluate(t),r=null,e instanceof Kt)return e;if("string"==typeof e){const r=t.parseColor(e);if(r)return r}else if(Array.isArray(e)&&(r=e.length<3||e.length>4?`Invalid rbga value ${JSON.stringify(e)}: expected an array containing either three or four numeric values.`:ee(e[0],e[1],e[2],e[3]),!r))return new Kt(e[0]/255,e[1]/255,e[2]/255,e[3])}throw new ae(r||`Could not parse color from value '${"string"==typeof e?e:JSON.stringify(e)}'`)}case"padding":{let e;for(const r of this.args){e=r.evaluate(t);const n=Jt.parse(e);if(n)return n}throw new ae(`Could not parse padding from value '${"string"==typeof e?e:JSON.stringify(e)}'`)}case"variableAnchorOffsetCollection":{let e;for(const r of this.args){e=r.evaluate(t);const n=Qt.parse(e);if(n)return n}throw new ae(`Could not parse variableAnchorOffsetCollection from value '${"string"==typeof e?e:JSON.stringify(e)}'`)}case"number":{let e=null;for(const r of this.args){if(e=r.evaluate(t),null===e)return 0;const n=Number(e);if(!isNaN(n))return n}throw new ae(`Could not convert ${JSON.stringify(e)} to number.`)}case"formatted":return Yt.fromString(ie(this.args[0].evaluate(t)));case"resolvedImage":return te.fromString(ie(this.args[0].evaluate(t)));default:return ie(this.args[0].evaluate(t))}}eachChild(t){this.args.forEach(t);}outputDefined(){return this.args.every((t=>t.outputDefined()))}}const he=["Unknown","Point","LineString","Polygon"];class pe{constructor(){this.globals=null,this.feature=null,this.featureState=null,this.formattedSection=null,this._parseColorCache={},this.availableImages=null,this.canonical=null;}id(){return this.feature&&"id"in this.feature?this.feature.id:null}geometryType(){return this.feature?"number"==typeof this.feature.type?he[this.feature.type]:this.feature.type:null}geometry(){return this.feature&&"geometry"in this.feature?this.feature.geometry:null}canonicalID(){return this.canonical}properties(){return this.feature&&this.feature.properties||{}}parseColor(t){let e=this._parseColorCache[t];return e||(e=this._parseColorCache[t]=Kt.parse(t)),e}}class fe{constructor(t,e,r=[],n,i=new ot,s=[]){this.registry=t,this.path=r,this.key=r.map((t=>`[${t}]`)).join(""),this.scope=i,this.errors=s,this.expectedType=n,this._isConstant=e;}parse(t,e,r,n,i={}){return e?this.concat(e,r,n)._parse(t,i):this._parse(t,i)}_parse(t,e){function r(t,e,r){return "assert"===r?new le(e,[t]):"coerce"===r?new ce(e,[t]):t}if(null!==t&&"string"!=typeof t&&"boolean"!=typeof t&&"number"!=typeof t||(t=["literal",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');const n=t[0];if("string"!=typeof n)return this.error(`Expression name must be a string, but found ${typeof n} instead. If you wanted a literal array, use ["literal", [...]].`,0),null;const i=this.registry[n];if(i){let n=i.parse(t,this);if(!n)return null;if(this.expectedType){const t=this.expectedType,i=n.type;if("string"!==t.kind&&"number"!==t.kind&&"boolean"!==t.kind&&"object"!==t.kind&&"array"!==t.kind||"value"!==i.kind)if("color"!==t.kind&&"formatted"!==t.kind&&"resolvedImage"!==t.kind||"value"!==i.kind&&"string"!==i.kind)if("padding"!==t.kind||"value"!==i.kind&&"number"!==i.kind&&"array"!==i.kind)if("variableAnchorOffsetCollection"!==t.kind||"value"!==i.kind&&"array"!==i.kind){if(this.checkSubtype(t,i))return null}else n=r(n,t,e.typeAnnotation||"coerce");else n=r(n,t,e.typeAnnotation||"coerce");else n=r(n,t,e.typeAnnotation||"coerce");else n=r(n,t,e.typeAnnotation||"assert");}if(!(n instanceof se)&&"resolvedImage"!==n.type.kind&&this._isConstant(n)){const t=new pe;try{n=new se(n.type,n.evaluate(t));}catch(t){return this.error(t.message),null}}return n}return this.error(`Unknown expression "${n}". If you wanted a literal array, use ["literal", [...]].`,0)}return this.error(void 0===t?"'undefined' value invalid. Use null instead.":"object"==typeof t?'Bare objects invalid. Use ["literal", {...}] instead.':`Expected an array, but found ${typeof t} instead.`)}concat(t,e,r){const n="number"==typeof t?this.path.concat(t):this.path,i=r?this.scope.concat(r):this.scope;return new fe(this.registry,this._isConstant,n,e||null,i,this.errors)}error(t,...e){const r=`${this.key}${e.map((t=>`[${t}]`)).join("")}`;this.errors.push(new at(r,t));}checkSubtype(t,e){const r=At(t,e);return r&&this.error(r),r}}class de{constructor(t,e){this.type=e.type,this.bindings=[].concat(t),this.result=e;}evaluate(t){return this.result.evaluate(t)}eachChild(t){for(const e of this.bindings)t(e[1]);t(this.result);}static parse(t,e){if(t.length<4)return e.error(`Expected at least 3 arguments, but found ${t.length-1} instead.`);const r=[];for(let n=1;n<t.length-1;n+=2){const i=t[n];if("string"!=typeof i)return e.error(`Expected string, but found ${typeof i} instead.`,n);if(/[^a-zA-Z0-9_]/.test(i))return e.error("Variable names must contain only alphanumeric characters or '_'.",n);const s=e.parse(t[n+1],n+1);if(!s)return null;r.push([i,s]);}const n=e.parse(t[t.length-1],t.length-1,e.expectedType,r);return n?new de(r,n):null}outputDefined(){return this.result.outputDefined()}}class ye{constructor(t,e){this.type=e.type,this.name=t,this.boundExpression=e;}static parse(t,e){if(2!==t.length||"string"!=typeof t[1])return e.error("'var' expression requires exactly one string literal argument.");const r=t[1];return e.scope.has(r)?new ye(r,e.scope.get(r)):e.error(`Unknown variable "${r}". Make sure "${r}" has been bound in an enclosing "let" expression before using it.`,1)}evaluate(t){return this.boundExpression.evaluate(t)}eachChild(){}outputDefined(){return !1}}class me{constructor(t,e,r){this.type=t,this.index=e,this.input=r;}static parse(t,e){if(3!==t.length)return e.error(`Expected 2 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,ut),n=e.parse(t[2],2,bt(e.expectedType||dt));return r&&n?new me(n.type.itemType,r,n):null}evaluate(t){const e=this.index.evaluate(t),r=this.input.evaluate(t);if(e<0)throw new ae(`Array index out of bounds: ${e} < 0.`);if(e>=r.length)throw new ae(`Array index out of bounds: ${e} > ${r.length-1}.`);if(e!==Math.floor(e))throw new ae(`Array index must be an integer, but found ${e} instead.`);return r[e]}eachChild(t){t(this.index),t(this.input);}outputDefined(){return !1}}class ge{constructor(t,e){this.type=ht,this.needle=t,this.haystack=e;}static parse(t,e){if(3!==t.length)return e.error(`Expected 2 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,dt),n=e.parse(t[2],2,dt);return r&&n?St(r.type,[ht,ct,ut,lt,dt])?new ge(r,n):e.error(`Expected first argument to be of type boolean, string, number or null, but found ${wt(r.type)} instead`):null}evaluate(t){const e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!r)return !1;if(!kt(e,["boolean","string","number","null"]))throw new ae(`Expected first argument to be of type boolean, string, number or null, but found ${wt(ne(e))} instead.`);if(!kt(r,["string","array"]))throw new ae(`Expected second argument to be of type array or string, but found ${wt(ne(r))} instead.`);return r.indexOf(e)>=0}eachChild(t){t(this.needle),t(this.haystack);}outputDefined(){return !0}}class xe{constructor(t,e,r){this.type=ut,this.needle=t,this.haystack=e,this.fromIndex=r;}static parse(t,e){if(t.length<=2||t.length>=5)return e.error(`Expected 3 or 4 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,dt),n=e.parse(t[2],2,dt);if(!r||!n)return null;if(!St(r.type,[ht,ct,ut,lt,dt]))return e.error(`Expected first argument to be of type boolean, string, number or null, but found ${wt(r.type)} instead`);if(4===t.length){const i=e.parse(t[3],3,ut);return i?new xe(r,n,i):null}return new xe(r,n)}evaluate(t){const e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!kt(e,["boolean","string","number","null"]))throw new ae(`Expected first argument to be of type boolean, string, number or null, but found ${wt(ne(e))} instead.`);let n;if(this.fromIndex&&(n=this.fromIndex.evaluate(t)),kt(r,["string"])){const t=r.indexOf(e,n);return -1===t?-1:[...r.slice(0,t)].length}if(kt(r,["array"]))return r.indexOf(e,n);throw new ae(`Expected second argument to be of type array or string, but found ${wt(ne(r))} instead.`)}eachChild(t){t(this.needle),t(this.haystack),this.fromIndex&&t(this.fromIndex);}outputDefined(){return !1}}class ve{constructor(t,e,r,n,i,s){this.inputType=t,this.type=e,this.input=r,this.cases=n,this.outputs=i,this.otherwise=s;}static parse(t,e){if(t.length<5)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if(t.length%2!=1)return e.error("Expected an even number of arguments.");let r,n;e.expectedType&&"value"!==e.expectedType.kind&&(n=e.expectedType);const i={},s=[];for(let a=2;a<t.length-1;a+=2){let o=t[a];const l=t[a+1];Array.isArray(o)||(o=[o]);const u=e.concat(a);if(0===o.length)return u.error("Expected at least one branch label.");for(const t of o){if("number"!=typeof t&&"string"!=typeof t)return u.error("Branch labels must be numbers or strings.");if("number"==typeof t&&Math.abs(t)>Number.MAX_SAFE_INTEGER)return u.error(`Branch labels must be integers no larger than ${Number.MAX_SAFE_INTEGER}.`);if("number"==typeof t&&Math.floor(t)!==t)return u.error("Numeric branch labels must be integer values.");if(r){if(u.checkSubtype(r,ne(t)))return null}else r=ne(t);if(void 0!==i[String(t)])return u.error("Branch labels must be unique.");i[String(t)]=s.length;}const c=e.parse(l,a,n);if(!c)return null;n=n||c.type,s.push(c);}const a=e.parse(t[1],1,dt);if(!a)return null;const o=e.parse(t[t.length-1],t.length-1,n);return o?"value"!==a.type.kind&&e.concat(1).checkSubtype(r,a.type)?null:new ve(r,n,a,i,s,o):null}evaluate(t){const e=this.input.evaluate(t);return (ne(e)===this.inputType&&this.outputs[this.cases[e]]||this.otherwise).evaluate(t)}eachChild(t){t(this.input),this.outputs.forEach(t),t(this.otherwise);}outputDefined(){return this.outputs.every((t=>t.outputDefined()))&&this.otherwise.outputDefined()}}class be{constructor(t,e,r){this.type=t,this.branches=e,this.otherwise=r;}static parse(t,e){if(t.length<4)return e.error(`Expected at least 3 arguments, but found only ${t.length-1}.`);if(t.length%2!=0)return e.error("Expected an odd number of arguments.");let r;e.expectedType&&"value"!==e.expectedType.kind&&(r=e.expectedType);const n=[];for(let i=1;i<t.length-1;i+=2){const s=e.parse(t[i],i,ht);if(!s)return null;const a=e.parse(t[i+1],i+1,r);if(!a)return null;n.push([s,a]),r=r||a.type;}const i=e.parse(t[t.length-1],t.length-1,r);if(!i)return null;if(!r)throw new Error("Can't infer output type");return new be(r,n,i)}evaluate(t){for(const[e,r]of this.branches)if(e.evaluate(t))return r.evaluate(t);return this.otherwise.evaluate(t)}eachChild(t){for(const[e,r]of this.branches)t(e),t(r);t(this.otherwise);}outputDefined(){return this.branches.every((([t,e])=>e.outputDefined()))&&this.otherwise.outputDefined()}}class we{constructor(t,e,r,n){this.type=t,this.input=e,this.beginIndex=r,this.endIndex=n;}static parse(t,e){if(t.length<=2||t.length>=5)return e.error(`Expected 3 or 4 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,dt),n=e.parse(t[2],2,ut);if(!r||!n)return null;if(!St(r.type,[bt(dt),ct,dt]))return e.error(`Expected first argument to be of type array or string, but found ${wt(r.type)} instead`);if(4===t.length){const i=e.parse(t[3],3,ut);return i?new we(r.type,r,n,i):null}return new we(r.type,r,n)}evaluate(t){const e=this.input.evaluate(t),r=this.beginIndex.evaluate(t);let n;if(this.endIndex&&(n=this.endIndex.evaluate(t)),kt(e,["string"]))return [...e].slice(r,n).join("");if(kt(e,["array"]))return e.slice(r,n);throw new ae(`Expected first argument to be of type array or string, but found ${wt(ne(e))} instead.`)}eachChild(t){t(this.input),t(this.beginIndex),this.endIndex&&t(this.endIndex);}outputDefined(){return !1}}function _e(t,e){const r=t.length-1;let n,i,s=0,a=r,o=0;for(;s<=a;)if(o=Math.floor((s+a)/2),n=t[o],i=t[o+1],n<=e){if(o===r||e<i)return o;s=o+1;}else {if(!(n>e))throw new ae("Input is not a number.");a=o-1;}return 0}class Ae{constructor(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(const[t,e]of r)this.labels.push(t),this.outputs.push(e);}static parse(t,e){if(t.length-1<4)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");const r=e.parse(t[1],1,ut);if(!r)return null;const n=[];let i=null;e.expectedType&&"value"!==e.expectedType.kind&&(i=e.expectedType);for(let r=1;r<t.length;r+=2){const s=1===r?-1/0:t[r],a=t[r+1],o=r,l=r+1;if("number"!=typeof s)return e.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.',o);if(n.length&&n[n.length-1][0]>=s)return e.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.',o);const u=e.parse(a,l,i);if(!u)return null;i=i||u.type,n.push([s,u]);}return new Ae(i,r,n)}evaluate(t){const e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);const n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);const i=e.length;return n>=e[i-1]?r[i-1].evaluate(t):r[_e(e,n)].evaluate(t)}eachChild(t){t(this.input);for(const e of this.outputs)t(e);}outputDefined(){return this.outputs.every((t=>t.outputDefined()))}}function Se(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var ke=Me;function Me(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=e,this.p2x=r,this.p2y=n;}Me.prototype={sampleCurveX:function(t){return ((this.ax*t+this.bx)*t+this.cx)*t},sampleCurveY:function(t){return ((this.ay*t+this.by)*t+this.cy)*t},sampleCurveDerivativeX:function(t){return (3*this.ax*t+2*this.bx)*t+this.cx},solveCurveX:function(t,e){if(void 0===e&&(e=1e-6),t<0)return 0;if(t>1)return 1;for(var r=t,n=0;n<8;n++){var i=this.sampleCurveX(r)-t;if(Math.abs(i)<e)return r;var s=this.sampleCurveDerivativeX(r);if(Math.abs(s)<1e-6)break;r-=i/s;}var a=0,o=1;for(r=t,n=0;n<20&&(i=this.sampleCurveX(r),!(Math.abs(i-t)<e));n++)t>i?a=r:o=r,r=.5*(o-a)+a;return r},solve:function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}};var Ie=Se(ke);function ze(t,e,r){return t+r*(e-t)}function Pe(t,e,r){return t.map(((t,n)=>ze(t,e[n],r)))}const Ce={number:ze,color:function(t,e,r,n="rgb"){switch(n){case"rgb":{const[n,i,s,a]=Pe(t.rgb,e.rgb,r);return new Kt(n,i,s,a,!1)}case"hcl":{const[n,i,s,a]=t.hcl,[o,l,u,c]=e.hcl;let h,p;if(isNaN(n)||isNaN(o))isNaN(n)?isNaN(o)?h=NaN:(h=o,1!==s&&0!==s||(p=l)):(h=n,1!==u&&0!==u||(p=i));else {let t=o-n;o>n&&t>180?t-=360:o<n&&n-o>180&&(t+=360),h=n+r*t;}const[f,d,y,m]=function([t,e,r,n]){return t=isNaN(t)?0:t*Et,Ot([r,Math.cos(t)*e,Math.sin(t)*e,n])}([h,null!=p?p:ze(i,l,r),ze(s,u,r),ze(a,c,r)]);return new Kt(f,d,y,m,!1)}case"lab":{const[n,i,s,a]=Ot(Pe(t.lab,e.lab,r));return new Kt(n,i,s,a,!1)}}},array:Pe,padding:function(t,e,r){return new Jt(Pe(t.values,e.values,r))},variableAnchorOffsetCollection:function(t,e,r){const n=t.values,i=e.values;if(n.length!==i.length)throw new ae(`Cannot interpolate values of different length. from: ${t.toString()}, to: ${e.toString()}`);const s=[];for(let t=0;t<n.length;t+=2){if(n[t]!==i[t])throw new ae(`Cannot interpolate values containing mismatched anchors. from[${t}]: ${n[t]}, to[${t}]: ${i[t]}`);s.push(n[t]);const[e,a]=n[t+1],[o,l]=i[t+1];s.push([ze(e,o,r),ze(a,l,r)]);}return new Qt(s)}};class Be{constructor(t,e,r,n,i){this.type=t,this.operator=e,this.interpolation=r,this.input=n,this.labels=[],this.outputs=[];for(const[t,e]of i)this.labels.push(t),this.outputs.push(e);}static interpolationFactor(t,e,r,n){let i=0;if("exponential"===t.name)i=Ve(e,t.base,r,n);else if("linear"===t.name)i=Ve(e,1,r,n);else if("cubic-bezier"===t.name){const s=t.controlPoints;i=new Ie(s[0],s[1],s[2],s[3]).solve(Ve(e,1,r,n));}return i}static parse(t,e){let[r,n,i,...s]=t;if(!Array.isArray(n)||0===n.length)return e.error("Expected an interpolation type expression.",1);if("linear"===n[0])n={name:"linear"};else if("exponential"===n[0]){const t=n[1];if("number"!=typeof t)return e.error("Exponential interpolation requires a numeric base.",1,1);n={name:"exponential",base:t};}else {if("cubic-bezier"!==n[0])return e.error(`Unknown interpolation type ${String(n[0])}`,1,0);{const t=n.slice(1);if(4!==t.length||t.some((t=>"number"!=typeof t||t<0||t>1)))return e.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.",1);n={name:"cubic-bezier",controlPoints:t};}}if(t.length-1<4)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");if(i=e.parse(i,2,ut),!i)return null;const a=[];let o=null;"interpolate-hcl"===r||"interpolate-lab"===r?o=pt:e.expectedType&&"value"!==e.expectedType.kind&&(o=e.expectedType);for(let t=0;t<s.length;t+=2){const r=s[t],n=s[t+1],i=t+3,l=t+4;if("number"!=typeof r)return e.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.',i);if(a.length&&a[a.length-1][0]>=r)return e.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.',i);const u=e.parse(n,l,o);if(!u)return null;o=o||u.type,a.push([r,u]);}return Mt(o,ut)||Mt(o,pt)||Mt(o,gt)||Mt(o,vt)||Mt(o,bt(ut))?new Be(o,r,n,i,a):e.error(`Type ${wt(o)} is not interpolatable.`)}evaluate(t){const e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);const n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);const i=e.length;if(n>=e[i-1])return r[i-1].evaluate(t);const s=_e(e,n),a=Be.interpolationFactor(this.interpolation,n,e[s],e[s+1]),o=r[s].evaluate(t),l=r[s+1].evaluate(t);switch(this.operator){case"interpolate":return Ce[this.type.kind](o,l,a);case"interpolate-hcl":return Ce.color(o,l,a,"hcl");case"interpolate-lab":return Ce.color(o,l,a,"lab")}}eachChild(t){t(this.input);for(const e of this.outputs)t(e);}outputDefined(){return this.outputs.every((t=>t.outputDefined()))}}function Ve(t,e,r,n){const i=n-r,s=t-r;return 0===i?0:1===e?s/i:(Math.pow(e,s)-1)/(Math.pow(e,i)-1)}class Ee{constructor(t,e){this.type=t,this.args=e;}static parse(t,e){if(t.length<2)return e.error("Expectected at least one argument.");let r=null;const n=e.expectedType;n&&"value"!==n.kind&&(r=n);const i=[];for(const n of t.slice(1)){const t=e.parse(n,1+i.length,r,void 0,{typeAnnotation:"omit"});if(!t)return null;r=r||t.type,i.push(t);}if(!r)throw new Error("No output type");const s=n&&i.some((t=>At(n,t.type)));return new Ee(s?dt:r,i)}evaluate(t){let e,r=null,n=0;for(const i of this.args)if(n++,r=i.evaluate(t),r&&r instanceof te&&!r.available&&(e||(e=r.name),r=null,n===this.args.length&&(r=e)),null!==r)break;return r}eachChild(t){this.args.forEach(t);}outputDefined(){return this.args.every((t=>t.outputDefined()))}}function Fe(t,e){return "=="===t||"!="===t?"boolean"===e.kind||"string"===e.kind||"number"===e.kind||"null"===e.kind||"value"===e.kind:"string"===e.kind||"number"===e.kind||"value"===e.kind}function Te(t,e,r,n){return 0===n.compare(e,r)}function $e(t,e,r){const n="=="!==t&&"!="!==t;return class i{constructor(t,e,r){this.type=ht,this.lhs=t,this.rhs=e,this.collator=r,this.hasUntypedArgument="value"===t.type.kind||"value"===e.type.kind;}static parse(t,e){if(3!==t.length&&4!==t.length)return e.error("Expected two or three arguments.");const r=t[0];let s=e.parse(t[1],1,dt);if(!s)return null;if(!Fe(r,s.type))return e.concat(1).error(`"${r}" comparisons are not supported for type '${wt(s.type)}'.`);let a=e.parse(t[2],2,dt);if(!a)return null;if(!Fe(r,a.type))return e.concat(2).error(`"${r}" comparisons are not supported for type '${wt(a.type)}'.`);if(s.type.kind!==a.type.kind&&"value"!==s.type.kind&&"value"!==a.type.kind)return e.error(`Cannot compare types '${wt(s.type)}' and '${wt(a.type)}'.`);n&&("value"===s.type.kind&&"value"!==a.type.kind?s=new le(a.type,[s]):"value"!==s.type.kind&&"value"===a.type.kind&&(a=new le(s.type,[a])));let o=null;if(4===t.length){if("string"!==s.type.kind&&"string"!==a.type.kind&&"value"!==s.type.kind&&"value"!==a.type.kind)return e.error("Cannot use collator to compare non-string types.");if(o=e.parse(t[3],3,yt),!o)return null}return new i(s,a,o)}evaluate(i){const s=this.lhs.evaluate(i),a=this.rhs.evaluate(i);if(n&&this.hasUntypedArgument){const e=ne(s),r=ne(a);if(e.kind!==r.kind||"string"!==e.kind&&"number"!==e.kind)throw new ae(`Expected arguments for "${t}" to be (string, string) or (number, number), but found (${e.kind}, ${r.kind}) instead.`)}if(this.collator&&!n&&this.hasUntypedArgument){const t=ne(s),r=ne(a);if("string"!==t.kind||"string"!==r.kind)return e(i,s,a)}return this.collator?r(i,s,a,this.collator.evaluate(i)):e(i,s,a)}eachChild(t){t(this.lhs),t(this.rhs),this.collator&&t(this.collator);}outputDefined(){return !0}}}const Le=$e("==",(function(t,e,r){return e===r}),Te),De=$e("!=",(function(t,e,r){return e!==r}),(function(t,e,r,n){return !Te(0,e,r,n)})),Oe=$e("<",(function(t,e,r){return e<r}),(function(t,e,r,n){return n.compare(e,r)<0})),je=$e(">",(function(t,e,r){return e>r}),(function(t,e,r,n){return n.compare(e,r)>0})),Re=$e("<=",(function(t,e,r){return e<=r}),(function(t,e,r,n){return n.compare(e,r)<=0})),Ue=$e(">=",(function(t,e,r){return e>=r}),(function(t,e,r,n){return n.compare(e,r)>=0}));class qe{constructor(t,e,r){this.type=yt,this.locale=r,this.caseSensitive=t,this.diacriticSensitive=e;}static parse(t,e){if(2!==t.length)return e.error("Expected one argument.");const r=t[1];if("object"!=typeof r||Array.isArray(r))return e.error("Collator options argument must be an object.");const n=e.parse(void 0!==r["case-sensitive"]&&r["case-sensitive"],1,ht);if(!n)return null;const i=e.parse(void 0!==r["diacritic-sensitive"]&&r["diacritic-sensitive"],1,ht);if(!i)return null;let s=null;return r.locale&&(s=e.parse(r.locale,1,ct),!s)?null:new qe(n,i,s)}evaluate(t){return new Xt(this.caseSensitive.evaluate(t),this.diacriticSensitive.evaluate(t),this.locale?this.locale.evaluate(t):null)}eachChild(t){t(this.caseSensitive),t(this.diacriticSensitive),this.locale&&t(this.locale);}outputDefined(){return !1}}class Ne{constructor(t,e,r,n,i){this.type=ct,this.number=t,this.locale=e,this.currency=r,this.minFractionDigits=n,this.maxFractionDigits=i;}static parse(t,e){if(3!==t.length)return e.error("Expected two arguments.");const r=e.parse(t[1],1,ut);if(!r)return null;const n=t[2];if("object"!=typeof n||Array.isArray(n))return e.error("NumberFormat options argument must be an object.");let i=null;if(n.locale&&(i=e.parse(n.locale,1,ct),!i))return null;let s=null;if(n.currency&&(s=e.parse(n.currency,1,ct),!s))return null;let a=null;if(n["min-fraction-digits"]&&(a=e.parse(n["min-fraction-digits"],1,ut),!a))return null;let o=null;return n["max-fraction-digits"]&&(o=e.parse(n["max-fraction-digits"],1,ut),!o)?null:new Ne(r,i,s,a,o)}evaluate(t){return new Intl.NumberFormat(this.locale?this.locale.evaluate(t):[],{style:this.currency?"currency":"decimal",currency:this.currency?this.currency.evaluate(t):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(t):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(t):void 0}).format(this.number.evaluate(t))}eachChild(t){t(this.number),this.locale&&t(this.locale),this.currency&&t(this.currency),this.minFractionDigits&&t(this.minFractionDigits),this.maxFractionDigits&&t(this.maxFractionDigits);}outputDefined(){return !1}}class Ze{constructor(t){this.type=mt,this.sections=t;}static parse(t,e){if(t.length<2)return e.error("Expected at least one argument.");const r=t[1];if(!Array.isArray(r)&&"object"==typeof r)return e.error("First argument must be an image or text section.");const n=[];let i=!1;for(let r=1;r<=t.length-1;++r){const s=t[r];if(i&&"object"==typeof s&&!Array.isArray(s)){i=!1;let t=null;if(s["font-scale"]&&(t=e.parse(s["font-scale"],1,ut),!t))return null;let r=null;if(s["text-font"]&&(r=e.parse(s["text-font"],1,bt(ct)),!r))return null;let a=null;if(s["text-color"]&&(a=e.parse(s["text-color"],1,pt),!a))return null;const o=n[n.length-1];o.scale=t,o.font=r,o.textColor=a;}else {const s=e.parse(t[r],1,dt);if(!s)return null;const a=s.type.kind;if("string"!==a&&"value"!==a&&"null"!==a&&"resolvedImage"!==a)return e.error("Formatted text type must be 'string', 'value', 'image' or 'null'.");i=!0,n.push({content:s,scale:null,font:null,textColor:null});}}return new Ze(n)}evaluate(t){return new Yt(this.sections.map((e=>{const r=e.content.evaluate(t);return ne(r)===xt?new Ht("",r,null,null,null):new Ht(ie(r),null,e.scale?e.scale.evaluate(t):null,e.font?e.font.evaluate(t).join(","):null,e.textColor?e.textColor.evaluate(t):null)})))}eachChild(t){for(const e of this.sections)t(e.content),e.scale&&t(e.scale),e.font&&t(e.font),e.textColor&&t(e.textColor);}outputDefined(){return !1}}class Ge{constructor(t){this.type=xt,this.input=t;}static parse(t,e){if(2!==t.length)return e.error("Expected two arguments.");const r=e.parse(t[1],1,ct);return r?new Ge(r):e.error("No image name provided.")}evaluate(t){const e=this.input.evaluate(t),r=te.fromString(e);return r&&t.availableImages&&(r.available=t.availableImages.indexOf(e)>-1),r}eachChild(t){t(this.input);}outputDefined(){return !1}}class Ke{constructor(t){this.type=ut,this.input=t;}static parse(t,e){if(2!==t.length)return e.error(`Expected 1 argument, but found ${t.length-1} instead.`);const r=e.parse(t[1],1);return r?"array"!==r.type.kind&&"string"!==r.type.kind&&"value"!==r.type.kind?e.error(`Expected argument of type string or array, but found ${wt(r.type)} instead.`):new Ke(r):null}evaluate(t){const e=this.input.evaluate(t);if("string"==typeof e)return [...e].length;if(Array.isArray(e))return e.length;throw new ae(`Expected value to be of type string or array, but found ${wt(ne(e))} instead.`)}eachChild(t){t(this.input);}outputDefined(){return !1}}const Xe=8192;function He(t,e){const r=(180+t[0])/360,n=(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t[1]*Math.PI/360)))/360,i=Math.pow(2,e.z);return [Math.round(r*i*Xe),Math.round(n*i*Xe)]}function Ye(t,e){const r=Math.pow(2,e.z);return [(i=(t[0]/Xe+e.x)/r,360*i-180),(n=(t[1]/Xe+e.y)/r,360/Math.PI*Math.atan(Math.exp((180-360*n)*Math.PI/180))-90)];var n,i;}function Je(t,e){t[0]=Math.min(t[0],e[0]),t[1]=Math.min(t[1],e[1]),t[2]=Math.max(t[2],e[0]),t[3]=Math.max(t[3],e[1]);}function We(t,e){return !(t[0]<=e[0]||t[2]>=e[2]||t[1]<=e[1]||t[3]>=e[3])}function Qe(t,e,r){const n=t[0]-e[0],i=t[1]-e[1],s=t[0]-r[0],a=t[1]-r[1];return n*a-s*i==0&&n*s<=0&&i*a<=0}function tr(t,e,r,n){return 0!=(i=[n[0]-r[0],n[1]-r[1]])[0]*(s=[e[0]-t[0],e[1]-t[1]])[1]-i[1]*s[0]&&!(!ar(t,e,r,n)||!ar(r,n,t,e));var i,s;}function er(t,e,r){for(const n of r)for(let r=0;r<n.length-1;++r)if(tr(t,e,n[r],n[r+1]))return !0;return !1}function rr(t,e,r=!1){let n=!1;for(const o of e)for(let e=0;e<o.length-1;e++){if(Qe(t,o[e],o[e+1]))return r;(s=o[e])[1]>(i=t)[1]!=(a=o[e+1])[1]>i[1]&&i[0]<(a[0]-s[0])*(i[1]-s[1])/(a[1]-s[1])+s[0]&&(n=!n);}var i,s,a;return n}function nr(t,e){for(const r of e)if(rr(t,r))return !0;return !1}function ir(t,e){for(const r of t)if(!rr(r,e))return !1;for(let r=0;r<t.length-1;++r)if(er(t[r],t[r+1],e))return !1;return !0}function sr(t,e){for(const r of e)if(ir(t,r))return !0;return !1}function ar(t,e,r,n){const i=n[0]-r[0],s=n[1]-r[1],a=(t[0]-r[0])*s-i*(t[1]-r[1]),o=(e[0]-r[0])*s-i*(e[1]-r[1]);return a>0&&o<0||a<0&&o>0}function or(t,e,r){const n=[];for(let i=0;i<t.length;i++){const s=[];for(let n=0;n<t[i].length;n++){const a=He(t[i][n],r);Je(e,a),s.push(a);}n.push(s);}return n}function lr(t,e,r){const n=[];for(let i=0;i<t.length;i++){const s=or(t[i],e,r);n.push(s);}return n}function ur(t,e,r,n){if(t[0]<r[0]||t[0]>r[2]){const e=.5*n;let i=t[0]-r[0]>e?-n:r[0]-t[0]>e?n:0;0===i&&(i=t[0]-r[2]>e?-n:r[2]-t[0]>e?n:0),t[0]+=i;}Je(e,t);}function cr(t,e,r,n){const i=Math.pow(2,n.z)*Xe,s=[n.x*Xe,n.y*Xe],a=[];for(const n of t)for(const t of n){const n=[t.x+s[0],t.y+s[1]];ur(n,e,r,i),a.push(n);}return a}function hr(t,e,r,n){const i=Math.pow(2,n.z)*Xe,s=[n.x*Xe,n.y*Xe],a=[];for(const r of t){const t=[];for(const n of r){const r=[n.x+s[0],n.y+s[1]];Je(e,r),t.push(r);}a.push(t);}if(e[2]-e[0]<=i/2){(o=e)[0]=o[1]=1/0,o[2]=o[3]=-1/0;for(const t of a)for(const n of t)ur(n,e,r,i);}var o;return a}class pr{constructor(t,e){this.type=ht,this.geojson=t,this.geometries=e;}static parse(t,e){if(2!==t.length)return e.error(`'within' expression requires exactly one argument, but found ${t.length-1} instead.`);if(re(t[1])){const e=t[1];if("FeatureCollection"===e.type){const t=[];for(const r of e.features){const{type:e,coordinates:n}=r.geometry;"Polygon"===e&&t.push(n),"MultiPolygon"===e&&t.push(...n);}if(t.length)return new pr(e,{type:"MultiPolygon",coordinates:t})}else if("Feature"===e.type){const t=e.geometry.type;if("Polygon"===t||"MultiPolygon"===t)return new pr(e,e.geometry)}else if("Polygon"===e.type||"MultiPolygon"===e.type)return new pr(e,e)}return e.error("'within' expression requires valid geojson object that contains polygon geometry type.")}evaluate(t){if(null!=t.geometry()&&null!=t.canonicalID()){if("Point"===t.geometryType())return function(t,e){const r=[1/0,1/0,-1/0,-1/0],n=[1/0,1/0,-1/0,-1/0],i=t.canonicalID();if("Polygon"===e.type){const s=or(e.coordinates,n,i),a=cr(t.geometry(),r,n,i);if(!We(r,n))return !1;for(const t of a)if(!rr(t,s))return !1}if("MultiPolygon"===e.type){const s=lr(e.coordinates,n,i),a=cr(t.geometry(),r,n,i);if(!We(r,n))return !1;for(const t of a)if(!nr(t,s))return !1}return !0}(t,this.geometries);if("LineString"===t.geometryType())return function(t,e){const r=[1/0,1/0,-1/0,-1/0],n=[1/0,1/0,-1/0,-1/0],i=t.canonicalID();if("Polygon"===e.type){const s=or(e.coordinates,n,i),a=hr(t.geometry(),r,n,i);if(!We(r,n))return !1;for(const t of a)if(!ir(t,s))return !1}if("MultiPolygon"===e.type){const s=lr(e.coordinates,n,i),a=hr(t.geometry(),r,n,i);if(!We(r,n))return !1;for(const t of a)if(!sr(t,s))return !1}return !0}(t,this.geometries)}return !1}eachChild(){}outputDefined(){return !0}}let fr=class{constructor(t=[],e=((t,e)=>t<e?-1:t>e?1:0)){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t);}push(t){this.data.push(t),this._up(this.length++);}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return --this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:r}=this,n=e[t];for(;t>0;){const i=t-1>>1,s=e[i];if(r(n,s)>=0)break;e[t]=s,t=i;}e[t]=n;}_down(t){const{data:e,compare:r}=this,n=this.length>>1,i=e[t];for(;t<n;){let n=1+(t<<1);const s=n+1;if(s<this.length&&r(e[s],e[n])<0&&(n=s),r(e[n],i)>=0)break;e[t]=e[n],t=n;}e[t]=i;}};function dr(t,e,r,n,i){yr(t,e,r,n||t.length-1,i||gr);}function yr(t,e,r,n,i){for(;n>r;){if(n-r>600){var s=n-r+1,a=e-r+1,o=Math.log(s),l=.5*Math.exp(2*o/3),u=.5*Math.sqrt(o*l*(s-l)/s)*(a-s/2<0?-1:1);yr(t,e,Math.max(r,Math.floor(e-a*l/s+u)),Math.min(n,Math.floor(e+(s-a)*l/s+u)),i);}var c=t[e],h=r,p=n;for(mr(t,r,e),i(t[n],c)>0&&mr(t,r,n);h<p;){for(mr(t,h,p),h++,p--;i(t[h],c)<0;)h++;for(;i(t[p],c)>0;)p--;}0===i(t[r],c)?mr(t,r,p):mr(t,++p,n),p<=e&&(r=p+1),e<=p&&(n=p-1);}}function mr(t,e,r){var n=t[e];t[e]=t[r],t[r]=n;}function gr(t,e){return t<e?-1:t>e?1:0}function xr(t,e){if(t.length<=1)return [t];const r=[];let n,i;for(const e of t){const t=br(e);0!==t&&(e.area=Math.abs(t),void 0===i&&(i=t<0),i===t<0?(n&&r.push(n),n=[e]):n.push(e));}if(n&&r.push(n),e>1)for(let t=0;t<r.length;t++)r[t].length<=e||(dr(r[t],e,1,r[t].length-1,vr),r[t]=r[t].slice(0,e));return r}function vr(t,e){return e.area-t.area}function br(t){let e=0;for(let r,n,i=0,s=t.length,a=s-1;i<s;a=i++)r=t[i],n=t[a],e+=(n.x-r.x)*(r.y+n.y);return e}const wr=1/298.257223563,_r=wr*(2-wr),Ar=Math.PI/180;class Sr{constructor(t){const e=6378.137*Ar*1e3,r=Math.cos(t*Ar),n=1/(1-_r*(1-r*r)),i=Math.sqrt(n);this.kx=e*i*r,this.ky=e*i*n*(1-_r);}distance(t,e){const r=this.wrap(t[0]-e[0])*this.kx,n=(t[1]-e[1])*this.ky;return Math.sqrt(r*r+n*n)}pointOnLine(t,e){let r,n,i,s,a=1/0;for(let o=0;o<t.length-1;o++){let l=t[o][0],u=t[o][1],c=this.wrap(t[o+1][0]-l)*this.kx,h=(t[o+1][1]-u)*this.ky,p=0;0===c&&0===h||(p=(this.wrap(e[0]-l)*this.kx*c+(e[1]-u)*this.ky*h)/(c*c+h*h),p>1?(l=t[o+1][0],u=t[o+1][1]):p>0&&(l+=c/this.kx*p,u+=h/this.ky*p)),c=this.wrap(e[0]-l)*this.kx,h=(e[1]-u)*this.ky;const f=c*c+h*h;f<a&&(a=f,r=l,n=u,i=o,s=p);}return {point:[r,n],index:i,t:Math.max(0,Math.min(1,s))}}wrap(t){for(;t<-180;)t+=360;for(;t>180;)t-=360;return t}}function kr(t,e){return e[0]-t[0]}function Mr(t){return t[1]-t[0]+1}function Ir(t,e){return t[1]>=t[0]&&t[1]<e}function zr(t,e){if(t[0]>t[1])return [null,null];const r=Mr(t);if(e){if(2===r)return [t,null];const e=Math.floor(r/2);return [[t[0],t[0]+e],[t[0]+e,t[1]]]}if(1===r)return [t,null];const n=Math.floor(r/2)-1;return [[t[0],t[0]+n],[t[0]+n+1,t[1]]]}function Pr(t,e){if(!Ir(e,t.length))return [1/0,1/0,-1/0,-1/0];const r=[1/0,1/0,-1/0,-1/0];for(let n=e[0];n<=e[1];++n)Je(r,t[n]);return r}function Cr(t){const e=[1/0,1/0,-1/0,-1/0];for(const r of t)for(const t of r)Je(e,t);return e}function Br(t){return t[0]!==-1/0&&t[1]!==-1/0&&t[2]!==1/0&&t[3]!==1/0}function Vr(t,e,r){if(!Br(t)||!Br(e))return NaN;let n=0,i=0;return t[2]<e[0]&&(n=e[0]-t[2]),t[0]>e[2]&&(n=t[0]-e[2]),t[1]>e[3]&&(i=t[1]-e[3]),t[3]<e[1]&&(i=e[1]-t[3]),r.distance([0,0],[n,i])}function Er(t,e,r){const n=r.pointOnLine(e,t);return r.distance(t,n.point)}function Fr(t,e,r,n,i){const s=Math.min(Er(t,[r,n],i),Er(e,[r,n],i)),a=Math.min(Er(r,[t,e],i),Er(n,[t,e],i));return Math.min(s,a)}function Tr(t,e,r,n,i){if(!Ir(e,t.length)||!Ir(n,r.length))return 1/0;let s=1/0;for(let a=e[0];a<e[1];++a){const e=t[a],o=t[a+1];for(let t=n[0];t<n[1];++t){const n=r[t],a=r[t+1];if(tr(e,o,n,a))return 0;s=Math.min(s,Fr(e,o,n,a,i));}}return s}function $r(t,e,r,n,i){if(!Ir(e,t.length)||!Ir(n,r.length))return NaN;let s=1/0;for(let a=e[0];a<=e[1];++a)for(let e=n[0];e<=n[1];++e)if(s=Math.min(s,i.distance(t[a],r[e])),0===s)return s;return s}function Lr(t,e,r){if(rr(t,e,!0))return 0;let n=1/0;for(const i of e){const e=i[0],s=i[i.length-1];if(e!==s&&(n=Math.min(n,Er(t,[s,e],r)),0===n))return n;const a=r.pointOnLine(i,t);if(n=Math.min(n,r.distance(t,a.point)),0===n)return n}return n}function Dr(t,e,r,n){if(!Ir(e,t.length))return NaN;for(let n=e[0];n<=e[1];++n)if(rr(t[n],r,!0))return 0;let i=1/0;for(let s=e[0];s<e[1];++s){const e=t[s],a=t[s+1];for(const t of r)for(let r=0,s=t.length,o=s-1;r<s;o=r++){const s=t[o],l=t[r];if(tr(e,a,s,l))return 0;i=Math.min(i,Fr(e,a,s,l,n));}}return i}function Or(t,e){for(const r of t)for(const t of r)if(rr(t,e,!0))return !0;return !1}function jr(t,e,r,n=1/0){const i=Cr(t),s=Cr(e);if(n!==1/0&&Vr(i,s,r)>=n)return n;if(We(i,s)){if(Or(t,e))return 0}else if(Or(e,t))return 0;let a=1/0;for(const n of t)for(let t=0,i=n.length,s=i-1;t<i;s=t++){const i=n[s],o=n[t];for(const t of e)for(let e=0,n=t.length,s=n-1;e<n;s=e++){const n=t[s],l=t[e];if(tr(i,o,n,l))return 0;a=Math.min(a,Fr(i,o,n,l,r));}}return a}function Rr(t,e,r,n,i,s){if(!s)return;const a=Vr(Pr(n,s),i,r);a<e&&t.push([a,s,[0,0]]);}function Ur(t,e,r,n,i,s,a){if(!s||!a)return;const o=Vr(Pr(n,s),Pr(i,a),r);o<e&&t.push([o,s,a]);}function qr(t,e,r,n,i=1/0){let s=Math.min(n.distance(t[0],r[0][0]),i);if(0===s)return s;const a=new fr([[0,[0,t.length-1],[0,0]]],kr),o=Cr(r);for(;a.length>0;){const i=a.pop();if(i[0]>=s)continue;const l=i[1],u=e?50:100;if(Mr(l)<=u){if(!Ir(l,t.length))return NaN;if(e){const e=Dr(t,l,r,n);if(isNaN(e)||0===e)return e;s=Math.min(s,e);}else for(let e=l[0];e<=l[1];++e){const i=Lr(t[e],r,n);if(s=Math.min(s,i),0===s)return 0}}else {const r=zr(l,e);Rr(a,s,n,t,o,r[0]),Rr(a,s,n,t,o,r[1]);}}return s}function Nr(t,e,r,n,i,s=1/0){let a=Math.min(s,i.distance(t[0],r[0]));if(0===a)return a;const o=new fr([[0,[0,t.length-1],[0,r.length-1]]],kr);for(;o.length>0;){const s=o.pop();if(s[0]>=a)continue;const l=s[1],u=s[2],c=e?50:100,h=n?50:100;if(Mr(l)<=c&&Mr(u)<=h){if(!Ir(l,t.length)&&Ir(u,r.length))return NaN;let s;if(e&&n)s=Tr(t,l,r,u,i),a=Math.min(a,s);else if(e&&!n){const e=t.slice(l[0],l[1]+1);for(let t=u[0];t<=u[1];++t)if(s=Er(r[t],e,i),a=Math.min(a,s),0===a)return a}else if(!e&&n){const e=r.slice(u[0],u[1]+1);for(let r=l[0];r<=l[1];++r)if(s=Er(t[r],e,i),a=Math.min(a,s),0===a)return a}else s=$r(t,l,r,u,i),a=Math.min(a,s);}else {const s=zr(l,e),c=zr(u,n);Ur(o,a,i,t,r,s[0],c[0]),Ur(o,a,i,t,r,s[0],c[1]),Ur(o,a,i,t,r,s[1],c[0]),Ur(o,a,i,t,r,s[1],c[1]);}}return a}function Zr(t){return "MultiPolygon"===t.type?t.coordinates.map((t=>({type:"Polygon",coordinates:t}))):"MultiLineString"===t.type?t.coordinates.map((t=>({type:"LineString",coordinates:t}))):"MultiPoint"===t.type?t.coordinates.map((t=>({type:"Point",coordinates:t}))):[t]}class Gr{constructor(t,e){this.type=ut,this.geojson=t,this.geometries=e;}static parse(t,e){if(2!==t.length)return e.error(`'distance' expression requires exactly one argument, but found ${t.length-1} instead.`);if(re(t[1])){const e=t[1];if("FeatureCollection"===e.type)return new Gr(e,e.features.map((t=>Zr(t.geometry))).flat());if("Feature"===e.type)return new Gr(e,Zr(e.geometry));if("type"in e&&"coordinates"in e)return new Gr(e,Zr(e))}return e.error("'distance' expression requires valid geojson object that contains polygon geometry type.")}evaluate(t){if(null!=t.geometry()&&null!=t.canonicalID()){if("Point"===t.geometryType())return function(t,e){const r=t.geometry(),n=r.flat().map((e=>Ye([e.x,e.y],t.canonical)));if(0===r.length)return NaN;const i=new Sr(n[0][1]);let s=1/0;for(const t of e){switch(t.type){case"Point":s=Math.min(s,Nr(n,!1,[t.coordinates],!1,i,s));break;case"LineString":s=Math.min(s,Nr(n,!1,t.coordinates,!0,i,s));break;case"Polygon":s=Math.min(s,qr(n,!1,t.coordinates,i,s));}if(0===s)return s}return s}(t,this.geometries);if("LineString"===t.geometryType())return function(t,e){const r=t.geometry(),n=r.flat().map((e=>Ye([e.x,e.y],t.canonical)));if(0===r.length)return NaN;const i=new Sr(n[0][1]);let s=1/0;for(const t of e){switch(t.type){case"Point":s=Math.min(s,Nr(n,!0,[t.coordinates],!1,i,s));break;case"LineString":s=Math.min(s,Nr(n,!0,t.coordinates,!0,i,s));break;case"Polygon":s=Math.min(s,qr(n,!0,t.coordinates,i,s));}if(0===s)return s}return s}(t,this.geometries);if("Polygon"===t.geometryType())return function(t,e){const r=t.geometry();if(0===r.length||0===r[0].length)return NaN;const n=xr(r,0).map((e=>e.map((e=>e.map((e=>Ye([e.x,e.y],t.canonical))))))),i=new Sr(n[0][0][0][1]);let s=1/0;for(const t of e)for(const e of n){switch(t.type){case"Point":s=Math.min(s,qr([t.coordinates],!1,e,i,s));break;case"LineString":s=Math.min(s,qr(t.coordinates,!0,e,i,s));break;case"Polygon":s=Math.min(s,jr(e,t.coordinates,i,s));}if(0===s)return s}return s}(t,this.geometries)}return NaN}eachChild(){}outputDefined(){return !0}}const Kr={"==":Le,"!=":De,">":je,"<":Oe,">=":Ue,"<=":Re,array:le,at:me,boolean:le,case:be,coalesce:Ee,collator:qe,format:Ze,image:Ge,in:ge,"index-of":xe,interpolate:Be,"interpolate-hcl":Be,"interpolate-lab":Be,length:Ke,let:de,literal:se,match:ve,number:le,"number-format":Ne,object:le,slice:we,step:Ae,string:le,"to-boolean":ce,"to-color":ce,"to-number":ce,"to-string":ce,var:ye,within:pr,distance:Gr};class Xr{constructor(t,e,r,n){this.name=t,this.type=e,this._evaluate=r,this.args=n;}evaluate(t){return this._evaluate(t,this.args)}eachChild(t){this.args.forEach(t);}outputDefined(){return !1}static parse(t,e){const r=t[0],n=Xr.definitions[r];if(!n)return e.error(`Unknown expression "${r}". If you wanted a literal array, use ["literal", [...]].`,0);const i=Array.isArray(n)?n[0]:n.type,s=Array.isArray(n)?[[n[1],n[2]]]:n.overloads,a=s.filter((([e])=>!Array.isArray(e)||e.length===t.length-1));let o=null;for(const[n,s]of a){o=new fe(e.registry,Qr,e.path,null,e.scope);const a=[];let l=!1;for(let e=1;e<t.length;e++){const r=t[e],i=Array.isArray(n)?n[e-1]:n.type,s=o.parse(r,1+a.length,i);if(!s){l=!0;break}a.push(s);}if(!l)if(Array.isArray(n)&&n.length!==a.length)o.error(`Expected ${n.length} arguments, but found ${a.length} instead.`);else {for(let t=0;t<a.length;t++){const e=Array.isArray(n)?n[t]:n.type,r=a[t];o.concat(t+1).checkSubtype(e,r.type);}if(0===o.errors.length)return new Xr(r,i,s,a)}}if(1===a.length)e.errors.push(...o.errors);else {const r=(a.length?a:s).map((([t])=>{return e=t,Array.isArray(e)?`(${e.map(wt).join(", ")})`:`(${wt(e.type)}...)`;var e;})).join(" | "),n=[];for(let r=1;r<t.length;r++){const i=e.parse(t[r],1+n.length);if(!i)return null;n.push(wt(i.type));}e.error(`Expected arguments of type ${r}, but found (${n.join(", ")}) instead.`);}return null}static register(t,e){Xr.definitions=e;for(const r in e)t[r]=Xr;}}function Hr(t,[e,r,n,i]){e=e.evaluate(t),r=r.evaluate(t),n=n.evaluate(t);const s=i?i.evaluate(t):1,a=ee(e,r,n,s);if(a)throw new ae(a);return new Kt(e/255,r/255,n/255,s,!1)}function Yr(t,e){return t in e}function Jr(t,e){const r=e[t];return void 0===r?null:r}function Wr(t){return {type:t}}function Qr(t){if(t instanceof ye)return Qr(t.boundExpression);if(t instanceof Xr&&"error"===t.name)return !1;if(t instanceof qe)return !1;if(t instanceof pr)return !1;if(t instanceof Gr)return !1;const e=t instanceof ce||t instanceof le;let r=!0;return t.eachChild((t=>{r=e?r&&Qr(t):r&&t instanceof se;})),!!r&&tn(t)&&rn(t,["zoom","heatmap-density","line-progress","accumulated","is-supported-script"])}function tn(t){if(t instanceof Xr){if("get"===t.name&&1===t.args.length)return !1;if("feature-state"===t.name)return !1;if("has"===t.name&&1===t.args.length)return !1;if("properties"===t.name||"geometry-type"===t.name||"id"===t.name)return !1;if(/^filter-/.test(t.name))return !1}if(t instanceof pr)return !1;if(t instanceof Gr)return !1;let e=!0;return t.eachChild((t=>{e&&!tn(t)&&(e=!1);})),e}function en(t){if(t instanceof Xr&&"feature-state"===t.name)return !1;let e=!0;return t.eachChild((t=>{e&&!en(t)&&(e=!1);})),e}function rn(t,e){if(t instanceof Xr&&e.indexOf(t.name)>=0)return !1;let r=!0;return t.eachChild((t=>{r&&!rn(t,e)&&(r=!1);})),r}function nn(t){return {result:"success",value:t}}function sn(t){return {result:"error",value:t}}function an(t){return "data-driven"===t["property-type"]||"cross-faded-data-driven"===t["property-type"]}function on(t){return !!t.expression&&t.expression.parameters.indexOf("zoom")>-1}function ln(t){return !!t.expression&&t.expression.interpolated}function un(t){return t instanceof Number?"number":t instanceof String?"string":t instanceof Boolean?"boolean":Array.isArray(t)?"array":null===t?"null":typeof t}function cn(t){return "object"==typeof t&&null!==t&&!Array.isArray(t)}function hn(t){return t}function pn(t,e){const r="color"===e.type,n=t.stops&&"object"==typeof t.stops[0][0],i=n||!(n||void 0!==t.property),s=t.type||(ln(e)?"exponential":"interval");if(r||"padding"===e.type){const n=r?Kt.parse:Jt.parse;(t=st({},t)).stops&&(t.stops=t.stops.map((t=>[t[0],n(t[1])]))),t.default=n(t.default?t.default:e.default);}if(t.colorSpace&&"rgb"!==(a=t.colorSpace)&&"hcl"!==a&&"lab"!==a)throw new Error(`Unknown color space: "${t.colorSpace}"`);var a;let o,l,u;if("exponential"===s)o=mn;else if("interval"===s)o=yn;else if("categorical"===s){o=dn,l=Object.create(null);for(const e of t.stops)l[e[0]]=e[1];u=typeof t.stops[0][0];}else {if("identity"!==s)throw new Error(`Unknown function type "${s}"`);o=gn;}if(n){const r={},n=[];for(let e=0;e<t.stops.length;e++){const i=t.stops[e],s=i[0].zoom;void 0===r[s]&&(r[s]={zoom:s,type:t.type,property:t.property,default:t.default,stops:[]},n.push(s)),r[s].stops.push([i[0].value,i[1]]);}const i=[];for(const t of n)i.push([r[t].zoom,pn(r[t],e)]);const s={name:"linear"};return {kind:"composite",interpolationType:s,interpolationFactor:Be.interpolationFactor.bind(void 0,s),zoomStops:i.map((t=>t[0])),evaluate:({zoom:r},n)=>mn({stops:i,base:t.base},e,r).evaluate(r,n)}}if(i){const r="exponential"===s?{name:"exponential",base:void 0!==t.base?t.base:1}:null;return {kind:"camera",interpolationType:r,interpolationFactor:Be.interpolationFactor.bind(void 0,r),zoomStops:t.stops.map((t=>t[0])),evaluate:({zoom:r})=>o(t,e,r,l,u)}}return {kind:"source",evaluate(r,n){const i=n&&n.properties?n.properties[t.property]:void 0;return void 0===i?fn(t.default,e.default):o(t,e,i,l,u)}}}function fn(t,e,r){return void 0!==t?t:void 0!==e?e:void 0!==r?r:void 0}function dn(t,e,r,n,i){return fn(typeof r===i?n[r]:void 0,t.default,e.default)}function yn(t,e,r){if("number"!==un(r))return fn(t.default,e.default);const n=t.stops.length;if(1===n)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[n-1][0])return t.stops[n-1][1];const i=_e(t.stops.map((t=>t[0])),r);return t.stops[i][1]}function mn(t,e,r){const n=void 0!==t.base?t.base:1;if("number"!==un(r))return fn(t.default,e.default);const i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];const s=_e(t.stops.map((t=>t[0])),r),a=function(t,e,r,n){const i=n-r,s=t-r;return 0===i?0:1===e?s/i:(Math.pow(e,s)-1)/(Math.pow(e,i)-1)}(r,n,t.stops[s][0],t.stops[s+1][0]),o=t.stops[s][1],l=t.stops[s+1][1],u=Ce[e.type]||hn;return "function"==typeof o.evaluate?{evaluate(...e){const r=o.evaluate.apply(void 0,e),n=l.evaluate.apply(void 0,e);if(void 0!==r&&void 0!==n)return u(r,n,a,t.colorSpace)}}:u(o,l,a,t.colorSpace)}function gn(t,e,r){switch(e.type){case"color":r=Kt.parse(r);break;case"formatted":r=Yt.fromString(r.toString());break;case"resolvedImage":r=te.fromString(r.toString());break;case"padding":r=Jt.parse(r);break;default:un(r)===e.type||"enum"===e.type&&e.values[r]||(r=void 0);}return fn(r,t.default,e.default)}Xr.register(Kr,{error:[{kind:"error"},[ct],(t,[e])=>{throw new ae(e.evaluate(t))}],typeof:[ct,[dt],(t,[e])=>wt(ne(e.evaluate(t)))],"to-rgba":[bt(ut,4),[pt],(t,[e])=>{const[r,n,i,s]=e.evaluate(t).rgb;return [255*r,255*n,255*i,s]}],rgb:[pt,[ut,ut,ut],Hr],rgba:[pt,[ut,ut,ut,ut],Hr],has:{type:ht,overloads:[[[ct],(t,[e])=>Yr(e.evaluate(t),t.properties())],[[ct,ft],(t,[e,r])=>Yr(e.evaluate(t),r.evaluate(t))]]},get:{type:dt,overloads:[[[ct],(t,[e])=>Jr(e.evaluate(t),t.properties())],[[ct,ft],(t,[e,r])=>Jr(e.evaluate(t),r.evaluate(t))]]},"feature-state":[dt,[ct],(t,[e])=>Jr(e.evaluate(t),t.featureState||{})],properties:[ft,[],t=>t.properties()],"geometry-type":[ct,[],t=>t.geometryType()],id:[dt,[],t=>t.id()],zoom:[ut,[],t=>t.globals.zoom],"heatmap-density":[ut,[],t=>t.globals.heatmapDensity||0],"line-progress":[ut,[],t=>t.globals.lineProgress||0],accumulated:[dt,[],t=>void 0===t.globals.accumulated?null:t.globals.accumulated],"+":[ut,Wr(ut),(t,e)=>{let r=0;for(const n of e)r+=n.evaluate(t);return r}],"*":[ut,Wr(ut),(t,e)=>{let r=1;for(const n of e)r*=n.evaluate(t);return r}],"-":{type:ut,overloads:[[[ut,ut],(t,[e,r])=>e.evaluate(t)-r.evaluate(t)],[[ut],(t,[e])=>-e.evaluate(t)]]},"/":[ut,[ut,ut],(t,[e,r])=>e.evaluate(t)/r.evaluate(t)],"%":[ut,[ut,ut],(t,[e,r])=>e.evaluate(t)%r.evaluate(t)],ln2:[ut,[],()=>Math.LN2],pi:[ut,[],()=>Math.PI],e:[ut,[],()=>Math.E],"^":[ut,[ut,ut],(t,[e,r])=>Math.pow(e.evaluate(t),r.evaluate(t))],sqrt:[ut,[ut],(t,[e])=>Math.sqrt(e.evaluate(t))],log10:[ut,[ut],(t,[e])=>Math.log(e.evaluate(t))/Math.LN10],ln:[ut,[ut],(t,[e])=>Math.log(e.evaluate(t))],log2:[ut,[ut],(t,[e])=>Math.log(e.evaluate(t))/Math.LN2],sin:[ut,[ut],(t,[e])=>Math.sin(e.evaluate(t))],cos:[ut,[ut],(t,[e])=>Math.cos(e.evaluate(t))],tan:[ut,[ut],(t,[e])=>Math.tan(e.evaluate(t))],asin:[ut,[ut],(t,[e])=>Math.asin(e.evaluate(t))],acos:[ut,[ut],(t,[e])=>Math.acos(e.evaluate(t))],atan:[ut,[ut],(t,[e])=>Math.atan(e.evaluate(t))],min:[ut,Wr(ut),(t,e)=>Math.min(...e.map((e=>e.evaluate(t))))],max:[ut,Wr(ut),(t,e)=>Math.max(...e.map((e=>e.evaluate(t))))],abs:[ut,[ut],(t,[e])=>Math.abs(e.evaluate(t))],round:[ut,[ut],(t,[e])=>{const r=e.evaluate(t);return r<0?-Math.round(-r):Math.round(r)}],floor:[ut,[ut],(t,[e])=>Math.floor(e.evaluate(t))],ceil:[ut,[ut],(t,[e])=>Math.ceil(e.evaluate(t))],"filter-==":[ht,[ct,dt],(t,[e,r])=>t.properties()[e.value]===r.value],"filter-id-==":[ht,[dt],(t,[e])=>t.id()===e.value],"filter-type-==":[ht,[ct],(t,[e])=>t.geometryType()===e.value],"filter-<":[ht,[ct,dt],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n<i}],"filter-id-<":[ht,[dt],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r<n}],"filter->":[ht,[ct,dt],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n>i}],"filter-id->":[ht,[dt],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r>n}],"filter-<=":[ht,[ct,dt],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n<=i}],"filter-id-<=":[ht,[dt],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r<=n}],"filter->=":[ht,[ct,dt],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n>=i}],"filter-id->=":[ht,[dt],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r>=n}],"filter-has":[ht,[dt],(t,[e])=>e.value in t.properties()],"filter-has-id":[ht,[],t=>null!==t.id()&&void 0!==t.id()],"filter-type-in":[ht,[bt(ct)],(t,[e])=>e.value.indexOf(t.geometryType())>=0],"filter-id-in":[ht,[bt(dt)],(t,[e])=>e.value.indexOf(t.id())>=0],"filter-in-small":[ht,[ct,bt(dt)],(t,[e,r])=>r.value.indexOf(t.properties()[e.value])>=0],"filter-in-large":[ht,[ct,bt(dt)],(t,[e,r])=>function(t,e,r,n){for(;r<=n;){const i=r+n>>1;if(e[i]===t)return !0;e[i]>t?n=i-1:r=i+1;}return !1}(t.properties()[e.value],r.value,0,r.value.length-1)],all:{type:ht,overloads:[[[ht,ht],(t,[e,r])=>e.evaluate(t)&&r.evaluate(t)],[Wr(ht),(t,e)=>{for(const r of e)if(!r.evaluate(t))return !1;return !0}]]},any:{type:ht,overloads:[[[ht,ht],(t,[e,r])=>e.evaluate(t)||r.evaluate(t)],[Wr(ht),(t,e)=>{for(const r of e)if(r.evaluate(t))return !0;return !1}]]},"!":[ht,[ht],(t,[e])=>!e.evaluate(t)],"is-supported-script":[ht,[ct],(t,[e])=>{const r=t.globals&&t.globals.isSupportedScript;return !r||r(e.evaluate(t))}],upcase:[ct,[ct],(t,[e])=>e.evaluate(t).toUpperCase()],downcase:[ct,[ct],(t,[e])=>e.evaluate(t).toLowerCase()],concat:[ct,Wr(dt),(t,e)=>e.map((e=>ie(e.evaluate(t)))).join("")],"resolved-locale":[ct,[yt],(t,[e])=>e.evaluate(t).resolvedLocale()]});class xn{constructor(t,e){var r;this.expression=t,this._warningHistory={},this._evaluator=new pe,this._defaultValue=e?"color"===(r=e).type&&cn(r.default)?new Kt(0,0,0,0):"color"===r.type?Kt.parse(r.default)||null:"padding"===r.type?Jt.parse(r.default)||null:"variableAnchorOffsetCollection"===r.type?Qt.parse(r.default)||null:void 0===r.default?null:r.default:null,this._enumValues=e&&"enum"===e.type?e.values:null;}evaluateWithoutErrorHandling(t,e,r,n,i,s){return this._evaluator.globals=t,this._evaluator.feature=e,this._evaluator.featureState=r,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=s,this.expression.evaluate(this._evaluator)}evaluate(t,e,r,n,i,s){this._evaluator.globals=t,this._evaluator.feature=e||null,this._evaluator.featureState=r||null,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=s||null;try{const t=this.expression.evaluate(this._evaluator);if(null==t||"number"==typeof t&&t!=t)return this._defaultValue;if(this._enumValues&&!(t in this._enumValues))throw new ae(`Expected value to be one of ${Object.keys(this._enumValues).map((t=>JSON.stringify(t))).join(", ")}, but found ${JSON.stringify(t)} instead.`);return t}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,"undefined"!=typeof console&&console.warn(t.message)),this._defaultValue}}}function vn(t){return Array.isArray(t)&&t.length>0&&"string"==typeof t[0]&&t[0]in Kr}function bn(t,e){const r=new fe(Kr,Qr,[],e?function(t){const e={color:pt,string:ct,number:ut,enum:ct,boolean:ht,formatted:mt,padding:gt,resolvedImage:xt,variableAnchorOffsetCollection:vt};return "array"===t.type?bt(e[t.value]||dt,t.length):e[t.type]}(e):void 0),n=r.parse(t,void 0,void 0,void 0,e&&"string"===e.type?{typeAnnotation:"coerce"}:void 0);return n?nn(new xn(n,e)):sn(r.errors)}class wn{constructor(t,e){this.kind=t,this._styleExpression=e,this.isStateDependent="constant"!==t&&!en(e.expression);}evaluateWithoutErrorHandling(t,e,r,n,i,s){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,s)}evaluate(t,e,r,n,i,s){return this._styleExpression.evaluate(t,e,r,n,i,s)}}class _n{constructor(t,e,r,n){this.kind=t,this.zoomStops=r,this._styleExpression=e,this.isStateDependent="camera"!==t&&!en(e.expression),this.interpolationType=n;}evaluateWithoutErrorHandling(t,e,r,n,i,s){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,s)}evaluate(t,e,r,n,i,s){return this._styleExpression.evaluate(t,e,r,n,i,s)}interpolationFactor(t,e,r){return this.interpolationType?Be.interpolationFactor(this.interpolationType,t,e,r):0}}function An(t,e){const r=bn(t,e);if("error"===r.result)return r;const n=r.value.expression,i=tn(n);if(!i&&!an(e))return sn([new at("","data expressions not supported")]);const s=rn(n,["zoom"]);if(!s&&!on(e))return sn([new at("","zoom expressions not supported")]);const a=kn(n);return a||s?a instanceof at?sn([a]):a instanceof Be&&!ln(e)?sn([new at("",'"interpolate" expressions cannot be used with this property')]):nn(a?new _n(i?"camera":"composite",r.value,a.labels,a instanceof Be?a.interpolation:void 0):new wn(i?"constant":"source",r.value)):sn([new at("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')])}class Sn{constructor(t,e){this._parameters=t,this._specification=e,st(this,pn(this._parameters,this._specification));}static deserialize(t){return new Sn(t._parameters,t._specification)}static serialize(t){return {_parameters:t._parameters,_specification:t._specification}}}function kn(t){let e=null;if(t instanceof de)e=kn(t.result);else if(t instanceof Ee){for(const r of t.args)if(e=kn(r),e)break}else (t instanceof Ae||t instanceof Be)&&t.input instanceof Xr&&"zoom"===t.input.name&&(e=t);return e instanceof at||t.eachChild((t=>{const r=kn(t);r instanceof at?e=r:!e&&r?e=new at("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'):e&&r&&e!==r&&(e=new at("",'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'));})),e}function Mn(t){if(!0===t||!1===t)return !0;if(!Array.isArray(t)||0===t.length)return !1;switch(t[0]){case"has":return t.length>=2&&"$id"!==t[1]&&"$type"!==t[1];case"in":return t.length>=3&&("string"!=typeof t[1]||Array.isArray(t[2]));case"!in":case"!has":case"none":return !1;case"==":case"!=":case">":case">=":case"<":case"<=":return 3!==t.length||Array.isArray(t[1])||Array.isArray(t[2]);case"any":case"all":for(const e of t.slice(1))if(!Mn(e)&&"boolean"!=typeof e)return !1;return !0;default:return !0}}const In={type:"boolean",default:!1,transition:!1,"property-type":"data-driven",expression:{interpolated:!1,parameters:["zoom","feature"]}};function zn(t){if(null==t)return {filter:()=>!0,needGeometry:!1};Mn(t)||(t=Bn(t));const e=bn(t,In);if("error"===e.result)throw new Error(e.value.map((t=>`${t.key}: ${t.message}`)).join(", "));return {filter:(t,r,n)=>e.value.evaluate(t,r,{},n),needGeometry:Cn(t)}}function Pn(t,e){return t<e?-1:t>e?1:0}function Cn(t){if(!Array.isArray(t))return !1;if("within"===t[0]||"distance"===t[0])return !0;for(let e=1;e<t.length;e++)if(Cn(t[e]))return !0;return !1}function Bn(t){if(!t)return !0;const e=t[0];return t.length<=1?"any"!==e:"=="===e?Vn(t[1],t[2],"=="):"!="===e?Tn(Vn(t[1],t[2],"==")):"<"===e||">"===e||"<="===e||">="===e?Vn(t[1],t[2],e):"any"===e?(r=t.slice(1),["any"].concat(r.map(Bn))):"all"===e?["all"].concat(t.slice(1).map(Bn)):"none"===e?["all"].concat(t.slice(1).map(Bn).map(Tn)):"in"===e?En(t[1],t.slice(2)):"!in"===e?Tn(En(t[1],t.slice(2))):"has"===e?Fn(t[1]):"!has"!==e||Tn(Fn(t[1]));var r;}function Vn(t,e,r){switch(t){case"$type":return [`filter-type-${r}`,e];case"$id":return [`filter-id-${r}`,e];default:return [`filter-${r}`,t,e]}}function En(t,e){if(0===e.length)return !1;switch(t){case"$type":return ["filter-type-in",["literal",e]];case"$id":return ["filter-id-in",["literal",e]];default:return e.length>200&&!e.some((t=>typeof t!=typeof e[0]))?["filter-in-large",t,["literal",e.sort(Pn)]]:["filter-in-small",t,["literal",e]]}}function Fn(t){switch(t){case"$type":return !0;case"$id":return ["filter-has-id"];default:return ["filter-has",t]}}function Tn(t){return ["!",t]}function $n(t){const e=typeof t;if("number"===e||"boolean"===e||"string"===e||null==t)return JSON.stringify(t);if(Array.isArray(t)){let e="[";for(const r of t)e+=`${$n(r)},`;return `${e}]`}const r=Object.keys(t).sort();let n="{";for(let e=0;e<r.length;e++)n+=`${JSON.stringify(r[e])}:${$n(t[r[e]])},`;return `${n}}`}function Ln(t){let e="";for(const r of K)e+=`/${$n(t[r])}`;return e}function Dn(t){const e=t.value;return e?[new it(t.key,e,"constants have been deprecated as of v8")]:[]}function On(t){return t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():t}function jn(t){if(Array.isArray(t))return t.map(jn);if(t instanceof Object&&!(t instanceof Number||t instanceof String||t instanceof Boolean)){const e={};for(const r in t)e[r]=jn(t[r]);return e}return On(t)}function Rn(t){const e=t.key,r=t.value,n=t.valueSpec||{},i=t.objectElementValidators||{},s=t.style,a=t.styleSpec,o=t.validateSpec;let l=[];const u=un(r);if("object"!==u)return [new it(e,r,`object expected, ${u} found`)];for(const t in r){const u=t.split(".")[0],c=n[u]||n["*"];let h;if(i[u])h=i[u];else if(n[u])h=o;else if(i["*"])h=i["*"];else {if(!n["*"]){l.push(new it(e,r[t],`unknown property "${t}"`));continue}h=o;}l=l.concat(h({key:(e?`${e}.`:e)+t,value:r[t],valueSpec:c,style:s,styleSpec:a,object:r,objectKey:t,validateSpec:o},r));}for(const t in n)i[t]||n[t].required&&void 0===n[t].default&&void 0===r[t]&&l.push(new it(e,r,`missing required property "${t}"`));return l}function Un(t){const e=t.value,r=t.valueSpec,n=t.style,i=t.styleSpec,s=t.key,a=t.arrayElementValidator||t.validateSpec;if("array"!==un(e))return [new it(s,e,`array expected, ${un(e)} found`)];if(r.length&&e.length!==r.length)return [new it(s,e,`array length ${r.length} expected, length ${e.length} found`)];if(r["min-length"]&&e.length<r["min-length"])return [new it(s,e,`array length at least ${r["min-length"]} expected, length ${e.length} found`)];let o={type:r.value,values:r.values};i.$version<7&&(o.function=r.function),"object"===un(r.value)&&(o=r.value);let l=[];for(let r=0;r<e.length;r++)l=l.concat(a({array:e,arrayIndex:r,value:e[r],valueSpec:o,validateSpec:t.validateSpec,style:n,styleSpec:i,key:`${s}[${r}]`}));return l}function qn(t){const e=t.key,r=t.value,n=t.valueSpec;let i=un(r);return "number"===i&&r!=r&&(i="NaN"),"number"!==i?[new it(e,r,`number expected, ${i} found`)]:"minimum"in n&&r<n.minimum?[new it(e,r,`${r} is less than the minimum value ${n.minimum}`)]:"maximum"in n&&r>n.maximum?[new it(e,r,`${r} is greater than the maximum value ${n.maximum}`)]:[]}function Nn(t){const e=t.valueSpec,r=On(t.value.type);let n,i,s,a={};const o="categorical"!==r&&void 0===t.value.property,l=!o,u="array"===un(t.value.stops)&&"array"===un(t.value.stops[0])&&"object"===un(t.value.stops[0][0]),c=Rn({key:t.key,value:t.value,valueSpec:t.styleSpec.function,validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if("identity"===r)return [new it(t.key,t.value,'identity function may not have a "stops" property')];let e=[];const n=t.value;return e=e.concat(Un({key:t.key,value:n,valueSpec:t.valueSpec,validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:h})),"array"===un(n)&&0===n.length&&e.push(new it(t.key,n,"array must have at least one stop")),e},default:function(t){return t.validateSpec({key:t.key,value:t.value,valueSpec:e,validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec})}}});return "identity"===r&&o&&c.push(new it(t.key,t.value,'missing required property "property"')),"identity"===r||t.value.stops||c.push(new it(t.key,t.value,'missing required property "stops"')),"exponential"===r&&t.valueSpec.expression&&!ln(t.valueSpec)&&c.push(new it(t.key,t.value,"exponential functions not supported")),t.styleSpec.$version>=8&&(l&&!an(t.valueSpec)?c.push(new it(t.key,t.value,"property functions not supported")):o&&!on(t.valueSpec)&&c.push(new it(t.key,t.value,"zoom functions not supported"))),"categorical"!==r&&!u||void 0!==t.value.property||c.push(new it(t.key,t.value,'"property" property is required')),c;function h(t){let r=[];const n=t.value,o=t.key;if("array"!==un(n))return [new it(o,n,`array expected, ${un(n)} found`)];if(2!==n.length)return [new it(o,n,`array length 2 expected, length ${n.length} found`)];if(u){if("object"!==un(n[0]))return [new it(o,n,`object expected, ${un(n[0])} found`)];if(void 0===n[0].zoom)return [new it(o,n,"object stop key must have zoom")];if(void 0===n[0].value)return [new it(o,n,"object stop key must have value")];if(s&&s>On(n[0].zoom))return [new it(o,n[0].zoom,"stop zoom values must appear in ascending order")];On(n[0].zoom)!==s&&(s=On(n[0].zoom),i=void 0,a={}),r=r.concat(Rn({key:`${o}[0]`,value:n[0],valueSpec:{zoom:{}},validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:qn,value:p}}));}else r=r.concat(p({key:`${o}[0]`,value:n[0],valueSpec:{},validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec},n));return vn(jn(n[1]))?r.concat([new it(`${o}[1]`,n[1],"expressions are not allowed in function stops.")]):r.concat(t.validateSpec({key:`${o}[1]`,value:n[1],valueSpec:e,validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec}))}function p(t,s){const o=un(t.value),l=On(t.value),u=null!==t.value?t.value:s;if(n){if(o!==n)return [new it(t.key,u,`${o} stop domain type must match previous stop domain type ${n}`)]}else n=o;if("number"!==o&&"string"!==o&&"boolean"!==o)return [new it(t.key,u,"stop domain value must be a number, string, or boolean")];if("number"!==o&&"categorical"!==r){let n=`number expected, ${o} found`;return an(e)&&void 0===r&&(n+='\nIf you intended to use a categorical function, specify `"type": "categorical"`.'),[new it(t.key,u,n)]}return "categorical"!==r||"number"!==o||isFinite(l)&&Math.floor(l)===l?"categorical"!==r&&"number"===o&&void 0!==i&&l<i?[new it(t.key,u,"stop domain values must appear in ascending order")]:(i=l,"categorical"===r&&l in a?[new it(t.key,u,"stop domain values must be unique")]:(a[l]=!0,[])):[new it(t.key,u,`integer expected, found ${l}`)]}}function Zn(t){const e=("property"===t.expressionContext?An:bn)(jn(t.value),t.valueSpec);if("error"===e.result)return e.value.map((e=>new it(`${t.key}${e.key}`,t.value,e.message)));const r=e.value.expression||e.value._styleExpression.expression;if("property"===t.expressionContext&&"text-font"===t.propertyKey&&!r.outputDefined())return [new it(t.key,t.value,`Invalid data expression for "${t.propertyKey}". Output values must be contained as literals within the expression.`)];if("property"===t.expressionContext&&"layout"===t.propertyType&&!en(r))return [new it(t.key,t.value,'"feature-state" data expressions are not supported with layout properties.')];if("filter"===t.expressionContext&&!en(r))return [new it(t.key,t.value,'"feature-state" data expressions are not supported with filters.')];if(t.expressionContext&&0===t.expressionContext.indexOf("cluster")){if(!rn(r,["zoom","feature-state"]))return [new it(t.key,t.value,'"zoom" and "feature-state" expressions are not supported with cluster properties.')];if("cluster-initial"===t.expressionContext&&!tn(r))return [new it(t.key,t.value,"Feature data expressions are not supported with initial expression part of cluster properties.")]}return []}function Gn(t){const e=t.key,r=t.value,n=t.valueSpec,i=[];return Array.isArray(n.values)?-1===n.values.indexOf(On(r))&&i.push(new it(e,r,`expected one of [${n.values.join(", ")}], ${JSON.stringify(r)} found`)):-1===Object.keys(n.values).indexOf(On(r))&&i.push(new it(e,r,`expected one of [${Object.keys(n.values).join(", ")}], ${JSON.stringify(r)} found`)),i}function Kn(t){return Mn(jn(t.value))?Zn(st({},t,{expressionContext:"filter",valueSpec:{value:"boolean"}})):Xn(t)}function Xn(t){const e=t.value,r=t.key;if("array"!==un(e))return [new it(r,e,`array expected, ${un(e)} found`)];const n=t.styleSpec;let i,s=[];if(e.length<1)return [new it(r,e,"filter array must have at least 1 element")];switch(s=s.concat(Gn({key:`${r}[0]`,value:e[0],valueSpec:n.filter_operator,style:t.style,styleSpec:t.styleSpec})),On(e[0])){case"<":case"<=":case">":case">=":e.length>=2&&"$type"===On(e[1])&&s.push(new it(r,e,`"$type" cannot be use with operator "${e[0]}"`));case"==":case"!=":3!==e.length&&s.push(new it(r,e,`filter array for operator "${e[0]}" must have 3 elements`));case"in":case"!in":e.length>=2&&(i=un(e[1]),"string"!==i&&s.push(new it(`${r}[1]`,e[1],`string expected, ${i} found`)));for(let a=2;a<e.length;a++)i=un(e[a]),"$type"===On(e[1])?s=s.concat(Gn({key:`${r}[${a}]`,value:e[a],valueSpec:n.geometry_type,style:t.style,styleSpec:t.styleSpec})):"string"!==i&&"number"!==i&&"boolean"!==i&&s.push(new it(`${r}[${a}]`,e[a],`string, number, or boolean expected, ${i} found`));break;case"any":case"all":case"none":for(let n=1;n<e.length;n++)s=s.concat(Xn({key:`${r}[${n}]`,value:e[n],style:t.style,styleSpec:t.styleSpec}));break;case"has":case"!has":i=un(e[1]),2!==e.length?s.push(new it(r,e,`filter array for "${e[0]}" operator must have 2 elements`)):"string"!==i&&s.push(new it(`${r}[1]`,e[1],`string expected, ${i} found`));}return s}function Hn(t,e){const r=t.key,n=t.validateSpec,i=t.style,s=t.styleSpec,a=t.value,o=t.objectKey,l=s[`${e}_${t.layerType}`];if(!l)return [];const u=o.match(/^(.*)-transition$/);if("paint"===e&&u&&l[u[1]]&&l[u[1]].transition)return n({key:r,value:a,valueSpec:s.transition,style:i,styleSpec:s});const c=t.valueSpec||l[o];if(!c)return [new it(r,a,`unknown property "${o}"`)];let h;if("string"===un(a)&&an(c)&&!c.tokens&&(h=/^{([^}]+)}$/.exec(a)))return [new it(r,a,`"${o}" does not support interpolation syntax\nUse an identity property function instead: \`{ "type": "identity", "property": ${JSON.stringify(h[1])} }\`.`)];const p=[];return "symbol"===t.layerType&&("text-field"===o&&i&&!i.glyphs&&p.push(new it(r,a,'use of "text-field" requires a style "glyphs" property')),"text-font"===o&&cn(jn(a))&&"identity"===On(a.type)&&p.push(new it(r,a,'"text-font" does not support identity functions'))),p.concat(n({key:t.key,value:a,valueSpec:c,style:i,styleSpec:s,expressionContext:"property",propertyType:e,propertyKey:o}))}function Yn(t){return Hn(t,"paint")}function Jn(t){return Hn(t,"layout")}function Wn(t){let e=[];const r=t.value,n=t.key,i=t.style,s=t.styleSpec;r.type||r.ref||e.push(new it(n,r,'either "type" or "ref" is required'));let a=On(r.type);const o=On(r.ref);if(r.id){const s=On(r.id);for(let a=0;a<t.arrayIndex;a++){const t=i.layers[a];On(t.id)===s&&e.push(new it(n,r.id,`duplicate layer id "${r.id}", previously used at line ${t.id.__line__}`));}}if("ref"in r){let t;["type","source","source-layer","filter","layout"].forEach((t=>{t in r&&e.push(new it(n,r[t],`"${t}" is prohibited for ref layers`));})),i.layers.forEach((e=>{On(e.id)===o&&(t=e);})),t?t.ref?e.push(new it(n,r.ref,"ref cannot reference another ref layer")):a=On(t.type):e.push(new it(n,r.ref,`ref layer "${o}" not found`));}else if("background"!==a)if(r.source){const t=i.sources&&i.sources[r.source],s=t&&On(t.type);t?"vector"===s&&"raster"===a?e.push(new it(n,r.source,`layer "${r.id}" requires a raster source`)):"raster-dem"!==s&&"hillshade"===a?e.push(new it(n,r.source,`layer "${r.id}" requires a raster-dem source`)):"raster"===s&&"raster"!==a?e.push(new it(n,r.source,`layer "${r.id}" requires a vector source`)):"vector"!==s||r["source-layer"]?"raster-dem"===s&&"hillshade"!==a?e.push(new it(n,r.source,"raster-dem source can only be used with layer type 'hillshade'.")):"line"!==a||!r.paint||!r.paint["line-gradient"]||"geojson"===s&&t.lineMetrics||e.push(new it(n,r,`layer "${r.id}" specifies a line-gradient, which requires a GeoJSON source with \`lineMetrics\` enabled.`)):e.push(new it(n,r,`layer "${r.id}" must specify a "source-layer"`)):e.push(new it(n,r.source,`source "${r.source}" not found`));}else e.push(new it(n,r,'missing required property "source"'));return e=e.concat(Rn({key:n,value:r,valueSpec:s.layer,style:t.style,styleSpec:t.styleSpec,validateSpec:t.validateSpec,objectElementValidators:{"*":()=>[],type:()=>t.validateSpec({key:`${n}.type`,value:r.type,valueSpec:s.layer.type,style:t.style,styleSpec:t.styleSpec,validateSpec:t.validateSpec,object:r,objectKey:"type"}),filter:Kn,layout:t=>Rn({layer:r,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,validateSpec:t.validateSpec,objectElementValidators:{"*":t=>Jn(st({layerType:a},t))}}),paint:t=>Rn({layer:r,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,validateSpec:t.validateSpec,objectElementValidators:{"*":t=>Yn(st({layerType:a},t))}})}})),e}function Qn(t){const e=t.value,r=t.key,n=un(e);return "string"!==n?[new it(r,e,`string expected, ${n} found`)]:[]}const ti={promoteId:function({key:t,value:e}){if("string"===un(e))return Qn({key:t,value:e});{const r=[];for(const n in e)r.push(...Qn({key:`${t}.${n}`,value:e[n]}));return r}}};function ei(t){const e=t.value,r=t.key,n=t.styleSpec,i=t.style,s=t.validateSpec;if(!e.type)return [new it(r,e,'"type" is required')];const a=On(e.type);let o;switch(a){case"vector":case"raster":return o=Rn({key:r,value:e,valueSpec:n[`source_${a.replace("-","_")}`],style:t.style,styleSpec:n,objectElementValidators:ti,validateSpec:s}),o;case"raster-dem":return o=function(t){var e;const r=null!==(e=t.sourceName)&&void 0!==e?e:"",n=t.value,i=t.styleSpec,s=i.source_raster_dem,a=t.style;let o=[];const l=un(n);if(void 0===n)return o;if("object"!==l)return o.push(new it("source_raster_dem",n,`object expected, ${l} found`)),o;const u="custom"===On(n.encoding),c=["redFactor","greenFactor","blueFactor","baseShift"],h=t.value.encoding?`"${t.value.encoding}"`:"Default";for(const e in n)!u&&c.includes(e)?o.push(new it(e,n[e],`In "${r}": "${e}" is only valid when "encoding" is set to "custom". ${h} encoding found`)):s[e]?o=o.concat(t.validateSpec({key:e,value:n[e],valueSpec:s[e],validateSpec:t.validateSpec,style:a,styleSpec:i})):o.push(new it(e,n[e],`unknown property "${e}"`));return o}({sourceName:r,value:e,style:t.style,styleSpec:n,validateSpec:s}),o;case"geojson":if(o=Rn({key:r,value:e,valueSpec:n.source_geojson,style:i,styleSpec:n,validateSpec:s,objectElementValidators:ti}),e.cluster)for(const t in e.clusterProperties){const[n,i]=e.clusterProperties[t],a="string"==typeof n?[n,["accumulated"],["get",t]]:n;o.push(...Zn({key:`${r}.${t}.map`,value:i,validateSpec:s,expressionContext:"cluster-map"})),o.push(...Zn({key:`${r}.${t}.reduce`,value:a,validateSpec:s,expressionContext:"cluster-reduce"}));}return o;case"video":return Rn({key:r,value:e,valueSpec:n.source_video,style:i,validateSpec:s,styleSpec:n});case"image":return Rn({key:r,value:e,valueSpec:n.source_image,style:i,validateSpec:s,styleSpec:n});case"canvas":return [new it(r,null,"Please use runtime APIs to add canvas sources, rather than including them in stylesheets.","source.canvas")];default:return Gn({key:`${r}.type`,value:e.type,valueSpec:{values:["vector","raster","raster-dem","geojson","video","image"]},style:i,validateSpec:s,styleSpec:n})}}function ri(t){const e=t.value,r=t.styleSpec,n=r.light,i=t.style;let s=[];const a=un(e);if(void 0===e)return s;if("object"!==a)return s=s.concat([new it("light",e,`object expected, ${a} found`)]),s;for(const a in e){const o=a.match(/^(.*)-transition$/);s=s.concat(o&&n[o[1]]&&n[o[1]].transition?t.validateSpec({key:a,value:e[a],valueSpec:r.transition,validateSpec:t.validateSpec,style:i,styleSpec:r}):n[a]?t.validateSpec({key:a,value:e[a],valueSpec:n[a],validateSpec:t.validateSpec,style:i,styleSpec:r}):[new it(a,e[a],`unknown property "${a}"`)]);}return s}function ni(t){const e=t.value,r=t.styleSpec,n=r.sky,i=t.style,s=un(e);if(void 0===e)return [];if("object"!==s)return [new it("sky",e,`object expected, ${s} found`)];let a=[];for(const s in e)a=a.concat(n[s]?t.validateSpec({key:s,value:e[s],valueSpec:n[s],style:i,styleSpec:r}):[new it(s,e[s],`unknown property "${s}"`)]);return a}function ii(t){const e=t.value,r=t.styleSpec,n=r.terrain,i=t.style;let s=[];const a=un(e);if(void 0===e)return s;if("object"!==a)return s=s.concat([new it("terrain",e,`object expected, ${a} found`)]),s;for(const a in e)s=s.concat(n[a]?t.validateSpec({key:a,value:e[a],valueSpec:n[a],validateSpec:t.validateSpec,style:i,styleSpec:r}):[new it(a,e[a],`unknown property "${a}"`)]);return s}function si(t){let e=[];const r=t.value,n=t.key;if(Array.isArray(r)){const i=[],s=[];for(const a in r)r[a].id&&i.includes(r[a].id)&&e.push(new it(n,r,`all the sprites' ids must be unique, but ${r[a].id} is duplicated`)),i.push(r[a].id),r[a].url&&s.includes(r[a].url)&&e.push(new it(n,r,`all the sprites' URLs must be unique, but ${r[a].url} is duplicated`)),s.push(r[a].url),e=e.concat(Rn({key:`${n}[${a}]`,value:r[a],valueSpec:{id:{type:"string",required:!0},url:{type:"string",required:!0}},validateSpec:t.validateSpec}));return e}return Qn({key:n,value:r})}const ai={"*":()=>[],array:Un,boolean:function(t){const e=t.value,r=t.key,n=un(e);return "boolean"!==n?[new it(r,e,`boolean expected, ${n} found`)]:[]},number:qn,color:function(t){const e=t.key,r=t.value,n=un(r);return "string"!==n?[new it(e,r,`color expected, ${n} found`)]:Kt.parse(String(r))?[]:[new it(e,r,`color expected, "${r}" found`)]},constants:Dn,enum:Gn,filter:Kn,function:Nn,layer:Wn,object:Rn,source:ei,light:ri,sky:ni,terrain:ii,projection:function(t){const e=t.value,r=t.styleSpec,n=r.projection,i=t.style,s=un(e);if(void 0===e)return [];if("object"!==s)return [new it("projection",e,`object expected, ${s} found`)];let a=[];for(const s in e)a=a.concat(n[s]?t.validateSpec({key:s,value:e[s],valueSpec:n[s],style:i,styleSpec:r}):[new it(s,e[s],`unknown property "${s}"`)]);return a},string:Qn,formatted:function(t){return 0===Qn(t).length?[]:Zn(t)},resolvedImage:function(t){return 0===Qn(t).length?[]:Zn(t)},padding:function(t){const e=t.key,r=t.value;if("array"===un(r)){if(r.length<1||r.length>4)return [new it(e,r,`padding requires 1 to 4 values; ${r.length} values found`)];const n={type:"number"};let i=[];for(let s=0;s<r.length;s++)i=i.concat(t.validateSpec({key:`${e}[${s}]`,value:r[s],validateSpec:t.validateSpec,valueSpec:n}));return i}return qn({key:e,value:r,valueSpec:{}})},variableAnchorOffsetCollection:function(t){const e=t.key,r=t.value,n=un(r),i=t.styleSpec;if("array"!==n||r.length<1||r.length%2!=0)return [new it(e,r,"variableAnchorOffsetCollection requires a non-empty array of even length")];let s=[];for(let n=0;n<r.length;n+=2)s=s.concat(Gn({key:`${e}[${n}]`,value:r[n],valueSpec:i.layout_symbol["text-anchor"]})),s=s.concat(Un({key:`${e}[${n+1}]`,value:r[n+1],valueSpec:{length:2,value:"number"},validateSpec:t.validateSpec,style:t.style,styleSpec:i}));return s},sprite:si};function oi(t){const e=t.value,r=t.valueSpec,n=t.styleSpec;return t.validateSpec=oi,r.expression&&cn(On(e))?Nn(t):r.expression&&vn(jn(e))?Zn(t):r.type&&ai[r.type]?ai[r.type](t):Rn(st({},t,{valueSpec:r.type?n[r.type]:r}))}function li(t){const e=t.value,r=t.key,n=Qn(t);return n.length||(-1===e.indexOf("{fontstack}")&&n.push(new it(r,e,'"glyphs" url must include a "{fontstack}" token')),-1===e.indexOf("{range}")&&n.push(new it(r,e,'"glyphs" url must include a "{range}" token'))),n}function ui(t,e=G){let r=[];return r=r.concat(oi({key:"",value:t,valueSpec:e.$root,styleSpec:e,style:t,validateSpec:oi,objectElementValidators:{glyphs:li,"*":()=>[]}})),t.constants&&(r=r.concat(Dn({key:"constants",value:t.constants,style:t,styleSpec:e,validateSpec:oi}))),hi(r)}function ci(t){return function(e){return t({...e,validateSpec:oi})}}function hi(t){return [].concat(t).sort(((t,e)=>t.line-e.line))}function pi(t){return function(...e){return hi(t.apply(this,e))}}ui.source=pi(ci(ei)),ui.sprite=pi(ci(si)),ui.glyphs=pi(ci(li)),ui.light=pi(ci(ri)),ui.sky=pi(ci(ni)),ui.terrain=pi(ci(ii)),ui.layer=pi(ci(Wn)),ui.filter=pi(ci(Kn)),ui.paintProperty=pi(ci(Yn)),ui.layoutProperty=pi(ci(Jn));const fi=ui,di=fi.light,yi=fi.sky,mi=fi.paintProperty,gi=fi.layoutProperty;function xi(t,e){let r=!1;if(e&&e.length)for(const n of e)t.fire(new N(new Error(n.message))),r=!0;return r}class vi{constructor(t,e,r){const n=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;const i=new Int32Array(this.arrayBuffer);t=i[0],this.d=(e=i[1])+2*(r=i[2]);for(let t=0;t<this.d*this.d;t++){const e=i[3+t],r=i[3+t+1];n.push(e===r?null:i.subarray(e,r));}const s=i[3+n.length+1];this.keys=i.subarray(i[3+n.length],s),this.bboxes=i.subarray(s),this.insert=this._insertReadonly;}else {this.d=e+2*r;for(let t=0;t<this.d*this.d;t++)n.push([]);this.keys=[],this.bboxes=[];}this.n=e,this.extent=t,this.padding=r,this.scale=e/t,this.uid=0;const i=r/e*t;this.min=-i,this.max=t+i;}insert(t,e,r,n,i){this._forEachCell(e,r,n,i,this._insertCell,this.uid++,void 0,void 0),this.keys.push(t),this.bboxes.push(e),this.bboxes.push(r),this.bboxes.push(n),this.bboxes.push(i);}_insertReadonly(){throw new Error("Cannot insert into a GridIndex created from an ArrayBuffer.")}_insertCell(t,e,r,n,i,s){this.cells[i].push(s);}query(t,e,r,n,i){const s=this.min,a=this.max;if(t<=s&&e<=s&&a<=r&&a<=n&&!i)return Array.prototype.slice.call(this.keys);{const s=[];return this._forEachCell(t,e,r,n,this._queryCell,s,{},i),s}}_queryCell(t,e,r,n,i,s,a,o){const l=this.cells[i];if(null!==l){const i=this.keys,u=this.bboxes;for(let c=0;c<l.length;c++){const h=l[c];if(void 0===a[h]){const l=4*h;(o?o(u[l+0],u[l+1],u[l+2],u[l+3]):t<=u[l+2]&&e<=u[l+3]&&r>=u[l+0]&&n>=u[l+1])?(a[h]=!0,s.push(i[h])):a[h]=!1;}}}}_forEachCell(t,e,r,n,i,s,a,o){const l=this._convertToCellCoord(t),u=this._convertToCellCoord(e),c=this._convertToCellCoord(r),h=this._convertToCellCoord(n);for(let p=l;p<=c;p++)for(let l=u;l<=h;l++){const u=this.d*l+p;if((!o||o(this._convertFromCellCoord(p),this._convertFromCellCoord(l),this._convertFromCellCoord(p+1),this._convertFromCellCoord(l+1)))&&i.call(this,t,e,r,n,u,s,a,o))return}}_convertFromCellCoord(t){return (t-this.padding)/this.scale}_convertToCellCoord(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))}toArrayBuffer(){if(this.arrayBuffer)return this.arrayBuffer;const t=this.cells,e=3+this.cells.length+1+1;let r=0;for(let t=0;t<this.cells.length;t++)r+=this.cells[t].length;const n=new Int32Array(e+r+this.keys.length+this.bboxes.length);n[0]=this.extent,n[1]=this.n,n[2]=this.padding;let i=e;for(let e=0;e<t.length;e++){const r=t[e];n[3+e]=i,n.set(r,i),i+=r.length;}return n[3+t.length]=i,n.set(this.keys,i),i+=this.keys.length,n[3+t.length+1]=i,n.set(this.bboxes,i),i+=this.bboxes.length,n.buffer}static serialize(t,e){const r=t.toArrayBuffer();return e&&e.push(r),{buffer:r}}static deserialize(t){return new vi(t.buffer)}}const bi={};function wi(t,e,r={}){if(bi[t])throw new Error(`${t} is already registered.`);Object.defineProperty(e,"_classRegistryKey",{value:t,writeable:!1}),bi[t]={klass:e,omit:r.omit||[],shallow:r.shallow||[]};}wi("Object",Object),wi("TransferableGridIndex",vi),wi("Color",Kt),wi("Error",Error),wi("AJAXError",L),wi("ResolvedImage",te),wi("StylePropertyFunction",Sn),wi("StyleExpression",xn,{omit:["_evaluator"]}),wi("ZoomDependentExpression",_n),wi("ZoomConstantExpression",wn),wi("CompoundExpression",Xr,{omit:["_evaluate"]});for(const t in Kr)Kr[t]._classRegistryKey||wi(`Expression_${t}`,Kr[t]);function _i(t){return t&&"undefined"!=typeof ArrayBuffer&&(t instanceof ArrayBuffer||t.constructor&&"ArrayBuffer"===t.constructor.name)}function Ai(t){return t.$name||t.constructor._classRegistryKey}function Si(t){return !function(t){if(null===t||"object"!=typeof t)return !1;const e=Ai(t);return !(!e||"Object"===e)}(t)&&(null==t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||t instanceof Blob||t instanceof Error||_i(t)||I(t)||ArrayBuffer.isView(t)||t instanceof ImageData)}function ki(t,e){if(Si(t))return (_i(t)||I(t))&&e&&e.push(t),ArrayBuffer.isView(t)&&e&&e.push(t.buffer),t instanceof ImageData&&e&&e.push(t.data.buffer),t;if(Array.isArray(t)){const r=[];for(const n of t)r.push(ki(n,e));return r}if("object"!=typeof t)throw new Error("can't serialize object of type "+typeof t);const r=Ai(t);if(!r)throw new Error(`can't serialize object of unregistered class ${t.constructor.name}`);if(!bi[r])throw new Error(`${r} is not registered.`);const{klass:n}=bi[r],i=n.serialize?n.serialize(t,e):{};if(n.serialize){if(e&&i===e[e.length-1])throw new Error("statically serialized object won't survive transfer of $name property")}else {for(const n in t){if(!t.hasOwnProperty(n))continue;if(bi[r].omit.indexOf(n)>=0)continue;const s=t[n];i[n]=bi[r].shallow.indexOf(n)>=0?s:ki(s,e);}t instanceof Error&&(i.message=t.message);}if(i.$name)throw new Error("$name property is reserved for worker serialization logic.");return "Object"!==r&&(i.$name=r),i}function Mi(t){if(Si(t))return t;if(Array.isArray(t))return t.map(Mi);if("object"!=typeof t)throw new Error("can't deserialize object of type "+typeof t);const e=Ai(t)||"Object";if(!bi[e])throw new Error(`can't deserialize unregistered class ${e}`);const{klass:r}=bi[e];if(!r)throw new Error(`can't deserialize unregistered class ${e}`);if(r.deserialize)return r.deserialize(t);const n=Object.create(r.prototype);for(const r of Object.keys(t)){if("$name"===r)continue;const i=t[r];n[r]=bi[e].shallow.indexOf(r)>=0?i:Mi(i);}return n}class Ii{constructor(){this.first=!0;}update(t,e){const r=Math.floor(t);return this.first?(this.first=!1,this.lastIntegerZoom=r,this.lastIntegerZoomTime=0,this.lastZoom=t,this.lastFloorZoom=r,!0):(this.lastFloorZoom>r?(this.lastIntegerZoom=r+1,this.lastIntegerZoomTime=e):this.lastFloorZoom<r&&(this.lastIntegerZoom=r,this.lastIntegerZoomTime=e),t!==this.lastZoom&&(this.lastZoom=t,this.lastFloorZoom=r,!0))}}const zi={"Latin-1 Supplement":t=>t>=128&&t<=255,"Hangul Jamo":t=>t>=4352&&t<=4607,Khmer:t=>t>=6016&&t<=6143,"General Punctuation":t=>t>=8192&&t<=8303,"Letterlike Symbols":t=>t>=8448&&t<=8527,"Number Forms":t=>t>=8528&&t<=8591,"Miscellaneous Technical":t=>t>=8960&&t<=9215,"Control Pictures":t=>t>=9216&&t<=9279,"Optical Character Recognition":t=>t>=9280&&t<=9311,"Enclosed Alphanumerics":t=>t>=9312&&t<=9471,"Geometric Shapes":t=>t>=9632&&t<=9727,"Miscellaneous Symbols":t=>t>=9728&&t<=9983,"Miscellaneous Symbols and Arrows":t=>t>=11008&&t<=11263,"Ideographic Description Characters":t=>t>=12272&&t<=12287,"CJK Symbols and Punctuation":t=>t>=12288&&t<=12351,Katakana:t=>t>=12448&&t<=12543,Kanbun:t=>t>=12688&&t<=12703,"CJK Strokes":t=>t>=12736&&t<=12783,"Enclosed CJK Letters and Months":t=>t>=12800&&t<=13055,"CJK Compatibility":t=>t>=13056&&t<=13311,"Yijing Hexagram Symbols":t=>t>=19904&&t<=19967,"Private Use Area":t=>t>=57344&&t<=63743,"Vertical Forms":t=>t>=65040&&t<=65055,"CJK Compatibility Forms":t=>t>=65072&&t<=65103,"Small Form Variants":t=>t>=65104&&t<=65135,"Halfwidth and Fullwidth Forms":t=>t>=65280&&t<=65519};function Pi(t){for(const e of t)if(Ti(e.charCodeAt(0)))return !0;return !1}function Ci(t){for(const e of t)if(!Ei(e.charCodeAt(0)))return !1;return !0}function Bi(t){const e=t.map((t=>{try{return new RegExp(`\\p{sc=${t}}`,"u").source}catch(t){return null}})).filter((t=>t));return new RegExp(e.join("|"),"u")}const Vi=Bi(["Arab","Dupl","Mong","Ougr","Syrc"]);function Ei(t){return !Vi.test(String.fromCodePoint(t))}const Fi=Bi(["Bopo","Hani","Hira","Kana","Kits","Nshu","Tang","Yiii"]);function Ti(t){return !(746!==t&&747!==t&&(t<4352||!(zi["CJK Compatibility Forms"](t)&&!(t>=65097&&t<=65103)||zi["CJK Compatibility"](t)||zi["CJK Strokes"](t)||!(!zi["CJK Symbols and Punctuation"](t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||zi["Enclosed CJK Letters and Months"](t)||zi["Ideographic Description Characters"](t)||zi.Kanbun(t)||zi.Katakana(t)&&12540!==t||!(!zi["Halfwidth and Fullwidth Forms"](t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||!(!zi["Small Form Variants"](t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||zi["Vertical Forms"](t)||zi["Yijing Hexagram Symbols"](t)||/\p{sc=Cans}/u.test(String.fromCodePoint(t))||/\p{sc=Hang}/u.test(String.fromCodePoint(t))||Fi.test(String.fromCodePoint(t)))))}function $i(t){return !(Ti(t)||function(t){return !!(zi["Latin-1 Supplement"](t)&&(167===t||169===t||174===t||177===t||188===t||189===t||190===t||215===t||247===t)||zi["General Punctuation"](t)&&(8214===t||8224===t||8225===t||8240===t||8241===t||8251===t||8252===t||8258===t||8263===t||8264===t||8265===t||8273===t)||zi["Letterlike Symbols"](t)||zi["Number Forms"](t)||zi["Miscellaneous Technical"](t)&&(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215)||zi["Control Pictures"](t)&&9251!==t||zi["Optical Character Recognition"](t)||zi["Enclosed Alphanumerics"](t)||zi["Geometric Shapes"](t)||zi["Miscellaneous Symbols"](t)&&!(t>=9754&&t<=9759)||zi["Miscellaneous Symbols and Arrows"](t)&&(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243)||zi["CJK Symbols and Punctuation"](t)||zi.Katakana(t)||zi["Private Use Area"](t)||zi["CJK Compatibility Forms"](t)||zi["Small Form Variants"](t)||zi["Halfwidth and Fullwidth Forms"](t)||8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)}(t))}const Li=Bi(["Adlm","Arab","Armi","Avst","Chrs","Cprt","Egyp","Elym","Gara","Hatr","Hebr","Hung","Khar","Lydi","Mand","Mani","Mend","Merc","Mero","Narb","Nbat","Nkoo","Orkh","Palm","Phli","Phlp","Phnx","Prti","Rohg","Samr","Sarb","Sogo","Syrc","Thaa","Todr","Yezi"]);function Di(t){return Li.test(String.fromCodePoint(t))}function Oi(t,e){return !(!e&&Di(t)||t>=2304&&t<=3583||t>=3840&&t<=4255||zi.Khmer(t))}function ji(t){for(const e of t)if(Di(e.charCodeAt(0)))return !0;return !1}const Ri=new class{constructor(){this.applyArabicShaping=null,this.processBidirectionalText=null,this.processStyledBidirectionalText=null,this.pluginStatus="unavailable",this.pluginURL=null;}setState(t){this.pluginStatus=t.pluginStatus,this.pluginURL=t.pluginURL;}getState(){return {pluginStatus:this.pluginStatus,pluginURL:this.pluginURL}}setMethods(t){this.applyArabicShaping=t.applyArabicShaping,this.processBidirectionalText=t.processBidirectionalText,this.processStyledBidirectionalText=t.processStyledBidirectionalText;}isParsed(){return null!=this.applyArabicShaping&&null!=this.processBidirectionalText&&null!=this.processStyledBidirectionalText}getPluginURL(){return this.pluginURL}getRTLTextPluginStatus(){return this.pluginStatus}};class Ui{constructor(t,e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.zoomHistory=e.zoomHistory,this.transition=e.transition):(this.now=0,this.fadeDuration=0,this.zoomHistory=new Ii,this.transition={});}isSupportedScript(t){return function(t,e){for(const r of t)if(!Oi(r.charCodeAt(0),e))return !1;return !0}(t,"loaded"===Ri.getRTLTextPluginStatus())}crossFadingFactor(){return 0===this.fadeDuration?1:Math.min((this.now-this.zoomHistory.lastIntegerZoomTime)/this.fadeDuration,1)}getCrossfadeParameters(){const t=this.zoom,e=t-Math.floor(t),r=this.crossFadingFactor();return t>this.zoomHistory.lastIntegerZoom?{fromScale:2,toScale:1,t:e+(1-e)*r}:{fromScale:.5,toScale:1,t:1-(1-r)*e}}}class qi{constructor(t,e){this.property=t,this.value=e,this.expression=function(t,e){if(cn(t))return new Sn(t,e);if(vn(t)){const r=An(t,e);if("error"===r.result)throw new Error(r.value.map((t=>`${t.key}: ${t.message}`)).join(", "));return r.value}{let r=t;return "color"===e.type&&"string"==typeof t?r=Kt.parse(t):"padding"!==e.type||"number"!=typeof t&&!Array.isArray(t)?"variableAnchorOffsetCollection"===e.type&&Array.isArray(t)&&(r=Qt.parse(t)):r=Jt.parse(t),{kind:"constant",evaluate:()=>r}}}(void 0===e?t.specification.default:e,t.specification);}isDataDriven(){return "source"===this.expression.kind||"composite"===this.expression.kind}possiblyEvaluate(t,e,r){return this.property.possiblyEvaluate(this,t,e,r)}}class Ni{constructor(t){this.property=t,this.value=new qi(t,void 0);}transitioned(t,e){return new Gi(this.property,this.value,e,g({},t.transition,this.transition),t.now)}untransitioned(){return new Gi(this.property,this.value,null,{},0)}}class Zi{constructor(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues);}getValue(t){return w(this._values[t].value.value)}setValue(t,e){Object.prototype.hasOwnProperty.call(this._values,t)||(this._values[t]=new Ni(this._values[t].property)),this._values[t].value=new qi(this._values[t].property,null===e?void 0:w(e));}getTransition(t){return w(this._values[t].transition)}setTransition(t,e){Object.prototype.hasOwnProperty.call(this._values,t)||(this._values[t]=new Ni(this._values[t].property)),this._values[t].transition=w(e)||void 0;}serialize(){const t={};for(const e of Object.keys(this._values)){const r=this.getValue(e);void 0!==r&&(t[e]=r);const n=this.getTransition(e);void 0!==n&&(t[`${e}-transition`]=n);}return t}transitioned(t,e){const r=new Ki(this._properties);for(const n of Object.keys(this._values))r._values[n]=this._values[n].transitioned(t,e._values[n]);return r}untransitioned(){const t=new Ki(this._properties);for(const e of Object.keys(this._values))t._values[e]=this._values[e].untransitioned();return t}}class Gi{constructor(t,e,r,n,i){this.property=t,this.value=e,this.begin=i+n.delay||0,this.end=this.begin+n.duration||0,t.specification.transition&&(n.delay||n.duration)&&(this.prior=r);}possiblyEvaluate(t,e,r){const n=t.now||0,i=this.value.possiblyEvaluate(t,e,r),s=this.prior;if(s){if(n>this.end)return this.prior=null,i;if(this.value.isDataDriven())return this.prior=null,i;if(n<this.begin)return s.possiblyEvaluate(t,e,r);{const a=(n-this.begin)/(this.end-this.begin);return this.property.interpolate(s.possiblyEvaluate(t,e,r),i,function(t){if(t<=0)return 0;if(t>=1)return 1;const e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}(a))}}return i}}class Ki{constructor(t){this._properties=t,this._values=Object.create(t.defaultTransitioningPropertyValues);}possiblyEvaluate(t,e,r){const n=new Yi(this._properties);for(const i of Object.keys(this._values))n._values[i]=this._values[i].possiblyEvaluate(t,e,r);return n}hasTransition(){for(const t of Object.keys(this._values))if(this._values[t].prior)return !0;return !1}}class Xi{constructor(t){this._properties=t,this._values=Object.create(t.defaultPropertyValues);}hasValue(t){return void 0!==this._values[t].value}getValue(t){return w(this._values[t].value)}setValue(t,e){this._values[t]=new qi(this._values[t].property,null===e?void 0:w(e));}serialize(){const t={};for(const e of Object.keys(this._values)){const r=this.getValue(e);void 0!==r&&(t[e]=r);}return t}possiblyEvaluate(t,e,r){const n=new Yi(this._properties);for(const i of Object.keys(this._values))n._values[i]=this._values[i].possiblyEvaluate(t,e,r);return n}}class Hi{constructor(t,e,r){this.property=t,this.value=e,this.parameters=r;}isConstant(){return "constant"===this.value.kind}constantOr(t){return "constant"===this.value.kind?this.value.value:t}evaluate(t,e,r,n){return this.property.evaluate(this.value,this.parameters,t,e,r,n)}}class Yi{constructor(t){this._properties=t,this._values=Object.create(t.defaultPossiblyEvaluatedValues);}get(t){return this._values[t]}}class Ji{constructor(t){this.specification=t;}possiblyEvaluate(t,e){if(t.isDataDriven())throw new Error("Value should not be data driven");return t.expression.evaluate(e)}interpolate(t,e,r){const n=Ce[this.specification.type];return n?n(t,e,r):t}}class Wi{constructor(t,e){this.specification=t,this.overrides=e;}possiblyEvaluate(t,e,r,n){return new Hi(this,"constant"===t.expression.kind||"camera"===t.expression.kind?{kind:"constant",value:t.expression.evaluate(e,null,{},r,n)}:t.expression,e)}interpolate(t,e,r){if("constant"!==t.value.kind||"constant"!==e.value.kind)return t;if(void 0===t.value.value||void 0===e.value.value)return new Hi(this,{kind:"constant",value:void 0},t.parameters);const n=Ce[this.specification.type];if(n){const i=n(t.value.value,e.value.value,r);return new Hi(this,{kind:"constant",value:i},t.parameters)}return t}evaluate(t,e,r,n,i,s){return "constant"===t.kind?t.value:t.evaluate(e,r,n,i,s)}}class Qi extends Wi{possiblyEvaluate(t,e,r,n){if(void 0===t.value)return new Hi(this,{kind:"constant",value:void 0},e);if("constant"===t.expression.kind){const i=t.expression.evaluate(e,null,{},r,n),s="resolvedImage"===t.property.specification.type&&"string"!=typeof i?i.name:i,a=this._calculate(s,s,s,e);return new Hi(this,{kind:"constant",value:a},e)}if("camera"===t.expression.kind){const r=this._calculate(t.expression.evaluate({zoom:e.zoom-1}),t.expression.evaluate({zoom:e.zoom}),t.expression.evaluate({zoom:e.zoom+1}),e);return new Hi(this,{kind:"constant",value:r},e)}return new Hi(this,t.expression,e)}evaluate(t,e,r,n,i,s){if("source"===t.kind){const a=t.evaluate(e,r,n,i,s);return this._calculate(a,a,a,e)}return "composite"===t.kind?this._calculate(t.evaluate({zoom:Math.floor(e.zoom)-1},r,n),t.evaluate({zoom:Math.floor(e.zoom)},r,n),t.evaluate({zoom:Math.floor(e.zoom)+1},r,n),e):t.value}_calculate(t,e,r,n){return n.zoom>n.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}}interpolate(t){return t}}class ts{constructor(t){this.specification=t;}possiblyEvaluate(t,e,r,n){if(void 0!==t.value){if("constant"===t.expression.kind){const i=t.expression.evaluate(e,null,{},r,n);return this._calculate(i,i,i,e)}return this._calculate(t.expression.evaluate(new Ui(Math.floor(e.zoom-1),e)),t.expression.evaluate(new Ui(Math.floor(e.zoom),e)),t.expression.evaluate(new Ui(Math.floor(e.zoom+1),e)),e)}}_calculate(t,e,r,n){return n.zoom>n.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}}interpolate(t){return t}}class es{constructor(t){this.specification=t;}possiblyEvaluate(t,e,r,n){return !!t.expression.evaluate(e,null,{},r,n)}interpolate(){return !1}}class rs{constructor(t){this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},this.overridableProperties=[];for(const e in t){const r=t[e];r.specification.overridable&&this.overridableProperties.push(e);const n=this.defaultPropertyValues[e]=new qi(r,void 0),i=this.defaultTransitionablePropertyValues[e]=new Ni(r);this.defaultTransitioningPropertyValues[e]=i.untransitioned(),this.defaultPossiblyEvaluatedValues[e]=n.possiblyEvaluate({});}}}wi("DataDrivenProperty",Wi),wi("DataConstantProperty",Ji),wi("CrossFadedDataDrivenProperty",Qi),wi("CrossFadedProperty",ts),wi("ColorRampProperty",es);const ns="-transition";class is extends Z{constructor(t,e){if(super(),this.id=t.id,this.type=t.type,this._featureFilter={filter:()=>!0,needGeometry:!1},"custom"!==t.type&&(this.metadata=t.metadata,this.minzoom=t.minzoom,this.maxzoom=t.maxzoom,"background"!==t.type&&(this.source=t.source,this.sourceLayer=t["source-layer"],this.filter=t.filter),e.layout&&(this._unevaluatedLayout=new Xi(e.layout)),e.paint)){this._transitionablePaint=new Zi(e.paint);for(const e in t.paint)this.setPaintProperty(e,t.paint[e],{validate:!1});for(const e in t.layout)this.setLayoutProperty(e,t.layout[e],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned(),this.paint=new Yi(e.paint);}}getCrossfadeParameters(){return this._crossfadeParameters}getLayoutProperty(t){return "visibility"===t?this.visibility:this._unevaluatedLayout.getValue(t)}setLayoutProperty(t,e,r={}){null!=e&&this._validate(gi,`layers.${this.id}.layout.${t}`,t,e,r)||("visibility"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility=e);}getPaintProperty(t){return t.endsWith(ns)?this._transitionablePaint.getTransition(t.slice(0,-11)):this._transitionablePaint.getValue(t)}setPaintProperty(t,e,r={}){if(null!=e&&this._validate(mi,`layers.${this.id}.paint.${t}`,t,e,r))return !1;if(t.endsWith(ns))return this._transitionablePaint.setTransition(t.slice(0,-11),e||void 0),!1;{const r=this._transitionablePaint._values[t],n="cross-faded-data-driven"===r.property.specification["property-type"],i=r.value.isDataDriven(),s=r.value;this._transitionablePaint.setValue(t,e),this._handleSpecialPaintPropertyUpdate(t);const a=this._transitionablePaint._values[t].value;return a.isDataDriven()||i||n||this._handleOverridablePaintPropertyUpdate(t,s,a)}}_handleSpecialPaintPropertyUpdate(t){}_handleOverridablePaintPropertyUpdate(t,e,r){return !1}isHidden(t){return !!(this.minzoom&&t<this.minzoom)||!!(this.maxzoom&&t>=this.maxzoom)||"none"===this.visibility}updateTransitions(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint);}hasTransition(){return this._transitioningPaint.hasTransition()}recalculate(t,e){t.getCrossfadeParameters&&(this._crossfadeParameters=t.getCrossfadeParameters()),this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t,void 0,e)),this.paint=this._transitioningPaint.possiblyEvaluate(t,void 0,e);}serialize(){const t={id:this.id,type:this.type,source:this.source,"source-layer":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return this.visibility&&(t.layout=t.layout||{},t.layout.visibility=this.visibility),b(t,((t,e)=>!(void 0===t||"layout"===e&&!Object.keys(t).length||"paint"===e&&!Object.keys(t).length)))}_validate(t,e,r,n,i={}){return (!i||!1!==i.validate)&&xi(this,t.call(fi,{key:e,layerType:this.type,objectKey:r,value:n,styleSpec:G,style:{glyphs:!0,sprite:!0}}))}is3D(){return !1}isTileClipped(){return !1}hasOffscreenPass(){return !1}resize(){}isStateDependent(){for(const t in this.paint._values){const e=this.paint.get(t);if(e instanceof Hi&&an(e.property.specification)&&("source"===e.value.kind||"composite"===e.value.kind)&&e.value.isStateDependent)return !0}return !1}}const ss={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array};class as{constructor(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8;}}class os{constructor(){this.isTransferred=!1,this.capacity=-1,this.resize(0);}static serialize(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}}static deserialize(t){const e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e}_trim(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews());}clear(){this.length=0;}resize(t){this.reserve(t),this.length=t;}reserve(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);const e=this.uint8;this._refreshViews(),e&&this.uint8.set(e);}}_refreshViews(){throw new Error("_refreshViews() must be implemented by each concrete StructArray layout")}}function ls(t,e=1){let r=0,n=0;return {members:t.map((t=>{const i=ss[t.type].BYTES_PER_ELEMENT,s=r=us(r,Math.max(e,i)),a=t.components||1;return n=Math.max(n,i),r+=i*a,{name:t.name,type:t.type,components:a,offset:s}})),size:us(r,Math.max(n,e)),alignment:e}}function us(t,e){return Math.ceil(t/e)*e}class cs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.int16[n+0]=e,this.int16[n+1]=r,t}}cs.prototype.bytesPerElement=4,wi("StructArrayLayout2i4",cs);class hs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.int16[i+0]=e,this.int16[i+1]=r,this.int16[i+2]=n,t}}hs.prototype.bytesPerElement=6,wi("StructArrayLayout3i6",hs);class ps extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const s=4*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,t}}ps.prototype.bytesPerElement=8,wi("StructArrayLayout4i8",ps);class fs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s){const a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i,s)}emplace(t,e,r,n,i,s,a){const o=6*t;return this.int16[o+0]=e,this.int16[o+1]=r,this.int16[o+2]=n,this.int16[o+3]=i,this.int16[o+4]=s,this.int16[o+5]=a,t}}fs.prototype.bytesPerElement=12,wi("StructArrayLayout2i4i12",fs);class ds extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s){const a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i,s)}emplace(t,e,r,n,i,s,a){const o=4*t,l=8*t;return this.int16[o+0]=e,this.int16[o+1]=r,this.uint8[l+4]=n,this.uint8[l+5]=i,this.uint8[l+6]=s,this.uint8[l+7]=a,t}}ds.prototype.bytesPerElement=8,wi("StructArrayLayout2i4ub8",ds);class ys extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.float32[n+0]=e,this.float32[n+1]=r,t}}ys.prototype.bytesPerElement=8,wi("StructArrayLayout2f8",ys);class ms extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l,u){const c=this.length;return this.resize(c+1),this.emplace(c,t,e,r,n,i,s,a,o,l,u)}emplace(t,e,r,n,i,s,a,o,l,u,c){const h=10*t;return this.uint16[h+0]=e,this.uint16[h+1]=r,this.uint16[h+2]=n,this.uint16[h+3]=i,this.uint16[h+4]=s,this.uint16[h+5]=a,this.uint16[h+6]=o,this.uint16[h+7]=l,this.uint16[h+8]=u,this.uint16[h+9]=c,t}}ms.prototype.bytesPerElement=20,wi("StructArrayLayout10ui20",ms);class gs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l,u,c,h){const p=this.length;return this.resize(p+1),this.emplace(p,t,e,r,n,i,s,a,o,l,u,c,h)}emplace(t,e,r,n,i,s,a,o,l,u,c,h,p){const f=12*t;return this.int16[f+0]=e,this.int16[f+1]=r,this.int16[f+2]=n,this.int16[f+3]=i,this.uint16[f+4]=s,this.uint16[f+5]=a,this.uint16[f+6]=o,this.uint16[f+7]=l,this.int16[f+8]=u,this.int16[f+9]=c,this.int16[f+10]=h,this.int16[f+11]=p,t}}gs.prototype.bytesPerElement=24,wi("StructArrayLayout4i4ui4i24",gs);class xs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.float32[i+0]=e,this.float32[i+1]=r,this.float32[i+2]=n,t}}xs.prototype.bytesPerElement=12,wi("StructArrayLayout3f12",xs);class vs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.uint32[1*t+0]=e,t}}vs.prototype.bytesPerElement=4,wi("StructArrayLayout1ul4",vs);class bs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l){const u=this.length;return this.resize(u+1),this.emplace(u,t,e,r,n,i,s,a,o,l)}emplace(t,e,r,n,i,s,a,o,l,u){const c=10*t,h=5*t;return this.int16[c+0]=e,this.int16[c+1]=r,this.int16[c+2]=n,this.int16[c+3]=i,this.int16[c+4]=s,this.int16[c+5]=a,this.uint32[h+3]=o,this.uint16[c+8]=l,this.uint16[c+9]=u,t}}bs.prototype.bytesPerElement=20,wi("StructArrayLayout6i1ul2ui20",bs);class ws extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s){const a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i,s)}emplace(t,e,r,n,i,s,a){const o=6*t;return this.int16[o+0]=e,this.int16[o+1]=r,this.int16[o+2]=n,this.int16[o+3]=i,this.int16[o+4]=s,this.int16[o+5]=a,t}}ws.prototype.bytesPerElement=12,wi("StructArrayLayout2i2i2i12",ws);class _s extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i){const s=this.length;return this.resize(s+1),this.emplace(s,t,e,r,n,i)}emplace(t,e,r,n,i,s){const a=4*t,o=8*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,this.int16[o+6]=i,this.int16[o+7]=s,t}}_s.prototype.bytesPerElement=16,wi("StructArrayLayout2f1f2i16",_s);class As extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s){const a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i,s)}emplace(t,e,r,n,i,s,a){const o=16*t,l=4*t,u=8*t;return this.uint8[o+0]=e,this.uint8[o+1]=r,this.float32[l+1]=n,this.float32[l+2]=i,this.int16[u+6]=s,this.int16[u+7]=a,t}}As.prototype.bytesPerElement=16,wi("StructArrayLayout2ub2f2i16",As);class Ss extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.uint16[i+0]=e,this.uint16[i+1]=r,this.uint16[i+2]=n,t}}Ss.prototype.bytesPerElement=6,wi("StructArrayLayout3ui6",Ss);class ks extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m){const g=this.length;return this.resize(g+1),this.emplace(g,t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m)}emplace(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g){const x=24*t,v=12*t,b=48*t;return this.int16[x+0]=e,this.int16[x+1]=r,this.uint16[x+2]=n,this.uint16[x+3]=i,this.uint32[v+2]=s,this.uint32[v+3]=a,this.uint32[v+4]=o,this.uint16[x+10]=l,this.uint16[x+11]=u,this.uint16[x+12]=c,this.float32[v+7]=h,this.float32[v+8]=p,this.uint8[b+36]=f,this.uint8[b+37]=d,this.uint8[b+38]=y,this.uint32[v+10]=m,this.int16[x+22]=g,t}}ks.prototype.bytesPerElement=48,wi("StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48",ks);class Ms extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w,_,A,S,k,M,I){const z=this.length;return this.resize(z+1),this.emplace(z,t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w,_,A,S,k,M,I)}emplace(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w,_,A,S,k,M,I,z){const P=32*t,C=16*t;return this.int16[P+0]=e,this.int16[P+1]=r,this.int16[P+2]=n,this.int16[P+3]=i,this.int16[P+4]=s,this.int16[P+5]=a,this.int16[P+6]=o,this.int16[P+7]=l,this.uint16[P+8]=u,this.uint16[P+9]=c,this.uint16[P+10]=h,this.uint16[P+11]=p,this.uint16[P+12]=f,this.uint16[P+13]=d,this.uint16[P+14]=y,this.uint16[P+15]=m,this.uint16[P+16]=g,this.uint16[P+17]=x,this.uint16[P+18]=v,this.uint16[P+19]=b,this.uint16[P+20]=w,this.uint16[P+21]=_,this.uint16[P+22]=A,this.uint32[C+12]=S,this.float32[C+13]=k,this.float32[C+14]=M,this.uint16[P+30]=I,this.uint16[P+31]=z,t}}Ms.prototype.bytesPerElement=64,wi("StructArrayLayout8i15ui1ul2f2ui64",Ms);class Is extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.float32[1*t+0]=e,t}}Is.prototype.bytesPerElement=4,wi("StructArrayLayout1f4",Is);class zs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.uint16[6*t+0]=e,this.float32[i+1]=r,this.float32[i+2]=n,t}}zs.prototype.bytesPerElement=12,wi("StructArrayLayout1ui2f12",zs);class Ps extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=4*t;return this.uint32[2*t+0]=e,this.uint16[i+2]=r,this.uint16[i+3]=n,t}}Ps.prototype.bytesPerElement=8,wi("StructArrayLayout1ul2ui8",Ps);class Cs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.uint16[n+0]=e,this.uint16[n+1]=r,t}}Cs.prototype.bytesPerElement=4,wi("StructArrayLayout2ui4",Cs);class Bs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.uint16[1*t+0]=e,t}}Bs.prototype.bytesPerElement=2,wi("StructArrayLayout1ui2",Bs);class Vs extends os{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const s=4*t;return this.float32[s+0]=e,this.float32[s+1]=r,this.float32[s+2]=n,this.float32[s+3]=i,t}}Vs.prototype.bytesPerElement=16,wi("StructArrayLayout4f16",Vs);class Es extends as{get anchorPointX(){return this._structArray.int16[this._pos2+0]}get anchorPointY(){return this._structArray.int16[this._pos2+1]}get x1(){return this._structArray.int16[this._pos2+2]}get y1(){return this._structArray.int16[this._pos2+3]}get x2(){return this._structArray.int16[this._pos2+4]}get y2(){return this._structArray.int16[this._pos2+5]}get featureIndex(){return this._structArray.uint32[this._pos4+3]}get sourceLayerIndex(){return this._structArray.uint16[this._pos2+8]}get bucketIndex(){return this._structArray.uint16[this._pos2+9]}get anchorPoint(){return new s(this.anchorPointX,this.anchorPointY)}}Es.prototype.size=20;class Fs extends bs{get(t){return new Es(this,t)}}wi("CollisionBoxArray",Fs);class Ts extends as{get anchorX(){return this._structArray.int16[this._pos2+0]}get anchorY(){return this._structArray.int16[this._pos2+1]}get glyphStartIndex(){return this._structArray.uint16[this._pos2+2]}get numGlyphs(){return this._structArray.uint16[this._pos2+3]}get vertexStartIndex(){return this._structArray.uint32[this._pos4+2]}get lineStartIndex(){return this._structArray.uint32[this._pos4+3]}get lineLength(){return this._structArray.uint32[this._pos4+4]}get segment(){return this._structArray.uint16[this._pos2+10]}get lowerSize(){return this._structArray.uint16[this._pos2+11]}get upperSize(){return this._structArray.uint16[this._pos2+12]}get lineOffsetX(){return this._structArray.float32[this._pos4+7]}get lineOffsetY(){return this._structArray.float32[this._pos4+8]}get writingMode(){return this._structArray.uint8[this._pos1+36]}get placedOrientation(){return this._structArray.uint8[this._pos1+37]}set placedOrientation(t){this._structArray.uint8[this._pos1+37]=t;}get hidden(){return this._structArray.uint8[this._pos1+38]}set hidden(t){this._structArray.uint8[this._pos1+38]=t;}get crossTileID(){return this._structArray.uint32[this._pos4+10]}set crossTileID(t){this._structArray.uint32[this._pos4+10]=t;}get associatedIconIndex(){return this._structArray.int16[this._pos2+22]}}Ts.prototype.size=48;class $s extends ks{get(t){return new Ts(this,t)}}wi("PlacedSymbolArray",$s);class Ls extends as{get anchorX(){return this._structArray.int16[this._pos2+0]}get anchorY(){return this._structArray.int16[this._pos2+1]}get rightJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+2]}get centerJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+3]}get leftJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+4]}get verticalPlacedTextSymbolIndex(){return this._structArray.int16[this._pos2+5]}get placedIconSymbolIndex(){return this._structArray.int16[this._pos2+6]}get verticalPlacedIconSymbolIndex(){return this._structArray.int16[this._pos2+7]}get key(){return this._structArray.uint16[this._pos2+8]}get textBoxStartIndex(){return this._structArray.uint16[this._pos2+9]}get textBoxEndIndex(){return this._structArray.uint16[this._pos2+10]}get verticalTextBoxStartIndex(){return this._structArray.uint16[this._pos2+11]}get verticalTextBoxEndIndex(){return this._structArray.uint16[this._pos2+12]}get iconBoxStartIndex(){return this._structArray.uint16[this._pos2+13]}get iconBoxEndIndex(){return this._structArray.uint16[this._pos2+14]}get verticalIconBoxStartIndex(){return this._structArray.uint16[this._pos2+15]}get verticalIconBoxEndIndex(){return this._structArray.uint16[this._pos2+16]}get featureIndex(){return this._structArray.uint16[this._pos2+17]}get numHorizontalGlyphVertices(){return this._structArray.uint16[this._pos2+18]}get numVerticalGlyphVertices(){return this._structArray.uint16[this._pos2+19]}get numIconVertices(){return this._structArray.uint16[this._pos2+20]}get numVerticalIconVertices(){return this._structArray.uint16[this._pos2+21]}get useRuntimeCollisionCircles(){return this._structArray.uint16[this._pos2+22]}get crossTileID(){return this._structArray.uint32[this._pos4+12]}set crossTileID(t){this._structArray.uint32[this._pos4+12]=t;}get textBoxScale(){return this._structArray.float32[this._pos4+13]}get collisionCircleDiameter(){return this._structArray.float32[this._pos4+14]}get textAnchorOffsetStartIndex(){return this._structArray.uint16[this._pos2+30]}get textAnchorOffsetEndIndex(){return this._structArray.uint16[this._pos2+31]}}Ls.prototype.size=64;class Ds extends Ms{get(t){return new Ls(this,t)}}wi("SymbolInstanceArray",Ds);class Os extends Is{getoffsetX(t){return this.float32[1*t+0]}}wi("GlyphOffsetArray",Os);class js extends hs{getx(t){return this.int16[3*t+0]}gety(t){return this.int16[3*t+1]}gettileUnitDistanceFromAnchor(t){return this.int16[3*t+2]}}wi("SymbolLineVertexArray",js);class Rs extends as{get textAnchor(){return this._structArray.uint16[this._pos2+0]}get textOffset0(){return this._structArray.float32[this._pos4+1]}get textOffset1(){return this._structArray.float32[this._pos4+2]}}Rs.prototype.size=12;class Us extends zs{get(t){return new Rs(this,t)}}wi("TextAnchorOffsetArray",Us);class qs extends as{get featureIndex(){return this._structArray.uint32[this._pos4+0]}get sourceLayerIndex(){return this._structArray.uint16[this._pos2+2]}get bucketIndex(){return this._structArray.uint16[this._pos2+3]}}qs.prototype.size=8;class Ns extends Ps{get(t){return new qs(this,t)}}wi("FeatureIndexArray",Ns);class Zs extends cs{}class Gs extends cs{}class Ks extends cs{}class Xs extends fs{}class Hs extends ds{}class Ys extends ys{}class Js extends ms{}class Ws extends gs{}class Qs extends xs{}class ta extends vs{}class ea extends ws{}class ra extends As{}class na extends Ss{}class ia extends Cs{}const sa=ls([{name:"a_pos",components:2,type:"Int16"}],4),{members:aa}=sa;class oa{constructor(t=[]){this.segments=t;}prepareSegment(t,e,r,n){let i=this.segments[this.segments.length-1];return t>oa.MAX_VERTEX_ARRAY_LENGTH&&A(`Max vertices per segment is ${oa.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${t}`),(!i||i.vertexLength+t>oa.MAX_VERTEX_ARRAY_LENGTH||i.sortKey!==n)&&(i={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},void 0!==n&&(i.sortKey=n),this.segments.push(i)),i}get(){return this.segments}destroy(){for(const t of this.segments)for(const e in t.vaos)t.vaos[e].destroy();}static simpleSegment(t,e,r,n){return new oa([{vertexOffset:t,primitiveOffset:e,vertexLength:r,primitiveLength:n,vaos:{},sortKey:0}])}}function la(t,e){return 256*(t=y(Math.floor(t),0,255))+y(Math.floor(e),0,255)}oa.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,wi("SegmentVector",oa);const ua=ls([{name:"a_pattern_from",components:4,type:"Uint16"},{name:"a_pattern_to",components:4,type:"Uint16"},{name:"a_pixel_ratio_from",components:1,type:"Uint16"},{name:"a_pixel_ratio_to",components:1,type:"Uint16"}]);var ca={exports:{}},ha={exports:{}};ha.exports=function(t,e){var r,n,i,s,a,o,l,u;for(n=t.length-(r=3&t.length),i=e,a=3432918353,o=461845907,u=0;u<n;)l=255&t.charCodeAt(u)|(255&t.charCodeAt(++u))<<8|(255&t.charCodeAt(++u))<<16|(255&t.charCodeAt(++u))<<24,++u,i=27492+(65535&(s=5*(65535&(i=(i^=l=(65535&(l=(l=(65535&l)*a+(((l>>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*o+(((l>>>16)*o&65535)<<16)&4294967295)<<13|i>>>19))+((5*(i>>>16)&65535)<<16)&4294967295))+((58964+(s>>>16)&65535)<<16);switch(l=0,r){case 3:l^=(255&t.charCodeAt(u+2))<<16;case 2:l^=(255&t.charCodeAt(u+1))<<8;case 1:i^=l=(65535&(l=(l=(65535&(l^=255&t.charCodeAt(u)))*a+(((l>>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*o+(((l>>>16)*o&65535)<<16)&4294967295;}return i^=t.length,i=2246822507*(65535&(i^=i>>>16))+((2246822507*(i>>>16)&65535)<<16)&4294967295,i=3266489909*(65535&(i^=i>>>13))+((3266489909*(i>>>16)&65535)<<16)&4294967295,(i^=i>>>16)>>>0};var pa=ha.exports,fa={exports:{}};fa.exports=function(t,e){for(var r,n=t.length,i=e^n,s=0;n>=4;)r=1540483477*(65535&(r=255&t.charCodeAt(s)|(255&t.charCodeAt(++s))<<8|(255&t.charCodeAt(++s))<<16|(255&t.charCodeAt(++s))<<24))+((1540483477*(r>>>16)&65535)<<16),i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16)^(r=1540483477*(65535&(r^=r>>>24))+((1540483477*(r>>>16)&65535)<<16)),n-=4,++s;switch(n){case 3:i^=(255&t.charCodeAt(s+2))<<16;case 2:i^=(255&t.charCodeAt(s+1))<<8;case 1:i=1540483477*(65535&(i^=255&t.charCodeAt(s)))+((1540483477*(i>>>16)&65535)<<16);}return i=1540483477*(65535&(i^=i>>>13))+((1540483477*(i>>>16)&65535)<<16),(i^=i>>>15)>>>0};var da=pa,ya=fa.exports;ca.exports=da,ca.exports.murmur3=da,ca.exports.murmur2=ya;var ma=r(ca.exports);class ga{constructor(){this.ids=[],this.positions=[],this.indexed=!1;}add(t,e,r,n){this.ids.push(xa(t)),this.positions.push(e,r,n);}getPositions(t){if(!this.indexed)throw new Error("Trying to get index, but feature positions are not indexed");const e=xa(t);let r=0,n=this.ids.length-1;for(;r<n;){const t=r+n>>1;this.ids[t]>=e?n=t:r=t+1;}const i=[];for(;this.ids[r]===e;)i.push({index:this.positions[3*r],start:this.positions[3*r+1],end:this.positions[3*r+2]}),r++;return i}static serialize(t,e){const r=new Float64Array(t.ids),n=new Uint32Array(t.positions);return va(r,n,0,r.length-1),e&&e.push(r.buffer,n.buffer),{ids:r,positions:n}}static deserialize(t){const e=new ga;return e.ids=t.ids,e.positions=t.positions,e.indexed=!0,e}}function xa(t){const e=+t;return !isNaN(e)&&e<=Number.MAX_SAFE_INTEGER?e:ma(String(t))}function va(t,e,r,n){for(;r<n;){const i=t[r+n>>1];let s=r-1,a=n+1;for(;;){do{s++;}while(t[s]<i);do{a--;}while(t[a]>i);if(s>=a)break;ba(t,s,a),ba(e,3*s,3*a),ba(e,3*s+1,3*a+1),ba(e,3*s+2,3*a+2);}a-r<n-a?(va(t,e,r,a),r=a+1):(va(t,e,a+1,n),n=a);}}function ba(t,e,r){const n=t[e];t[e]=t[r],t[r]=n;}wi("FeaturePositionMap",ga);class wa{constructor(t,e){this.gl=t.gl,this.location=e;}}class _a extends wa{constructor(t,e){super(t,e),this.current=0;}set(t){this.current!==t&&(this.current=t,this.gl.uniform1f(this.location,t));}}class Aa extends wa{constructor(t,e){super(t,e),this.current=[0,0,0,0];}set(t){t[0]===this.current[0]&&t[1]===this.current[1]&&t[2]===this.current[2]&&t[3]===this.current[3]||(this.current=t,this.gl.uniform4f(this.location,t[0],t[1],t[2],t[3]));}}class Sa extends wa{constructor(t,e){super(t,e),this.current=Kt.transparent;}set(t){t.r===this.current.r&&t.g===this.current.g&&t.b===this.current.b&&t.a===this.current.a||(this.current=t,this.gl.uniform4f(this.location,t.r,t.g,t.b,t.a));}}const ka=new Float32Array(16);function Ma(t){return [la(255*t.r,255*t.g),la(255*t.b,255*t.a)]}class Ia{constructor(t,e,r){this.value=t,this.uniformNames=e.map((t=>`u_${t}`)),this.type=r;}setUniform(t,e,r){t.set(r.constantOr(this.value));}getBinding(t,e,r){return "color"===this.type?new Sa(t,e):new _a(t,e)}}class za{constructor(t,e){this.uniformNames=e.map((t=>`u_${t}`)),this.patternFrom=null,this.patternTo=null,this.pixelRatioFrom=1,this.pixelRatioTo=1;}setConstantPatternPositions(t,e){this.pixelRatioFrom=e.pixelRatio,this.pixelRatioTo=t.pixelRatio,this.patternFrom=e.tlbr,this.patternTo=t.tlbr;}setUniform(t,e,r,n){const i="u_pattern_to"===n?this.patternTo:"u_pattern_from"===n?this.patternFrom:"u_pixel_ratio_to"===n?this.pixelRatioTo:"u_pixel_ratio_from"===n?this.pixelRatioFrom:null;i&&t.set(i);}getBinding(t,e,r){return "u_pattern"===r.substr(0,9)?new Aa(t,e):new _a(t,e)}}class Pa{constructor(t,e,r,n){this.expression=t,this.type=r,this.maxValue=0,this.paintVertexAttributes=e.map((t=>({name:`a_${t}`,type:"Float32",components:"color"===r?2:1,offset:0}))),this.paintVertexArray=new n;}populatePaintArray(t,e,r,n,i){const s=this.paintVertexArray.length,a=this.expression.evaluate(new Ui(0),e,{},n,[],i);this.paintVertexArray.resize(t),this._setPaintValue(s,t,a);}updatePaintArray(t,e,r,n){const i=this.expression.evaluate({zoom:0},r,n);this._setPaintValue(t,e,i);}_setPaintValue(t,e,r){if("color"===this.type){const n=Ma(r);for(let r=t;r<e;r++)this.paintVertexArray.emplace(r,n[0],n[1]);}else {for(let n=t;n<e;n++)this.paintVertexArray.emplace(n,r);this.maxValue=Math.max(this.maxValue,Math.abs(r));}}upload(t){this.paintVertexArray&&this.paintVertexArray.arrayBuffer&&(this.paintVertexBuffer&&this.paintVertexBuffer.buffer?this.paintVertexBuffer.updateData(this.paintVertexArray):this.paintVertexBuffer=t.createVertexBuffer(this.paintVertexArray,this.paintVertexAttributes,this.expression.isStateDependent));}destroy(){this.paintVertexBuffer&&this.paintVertexBuffer.destroy();}}class Ca{constructor(t,e,r,n,i,s){this.expression=t,this.uniformNames=e.map((t=>`u_${t}_t`)),this.type=r,this.useIntegerZoom=n,this.zoom=i,this.maxValue=0,this.paintVertexAttributes=e.map((t=>({name:`a_${t}`,type:"Float32",components:"color"===r?4:2,offset:0}))),this.paintVertexArray=new s;}populatePaintArray(t,e,r,n,i){const s=this.expression.evaluate(new Ui(this.zoom),e,{},n,[],i),a=this.expression.evaluate(new Ui(this.zoom+1),e,{},n,[],i),o=this.paintVertexArray.length;this.paintVertexArray.resize(t),this._setPaintValue(o,t,s,a);}updatePaintArray(t,e,r,n){const i=this.expression.evaluate({zoom:this.zoom},r,n),s=this.expression.evaluate({zoom:this.zoom+1},r,n);this._setPaintValue(t,e,i,s);}_setPaintValue(t,e,r,n){if("color"===this.type){const i=Ma(r),s=Ma(n);for(let r=t;r<e;r++)this.paintVertexArray.emplace(r,i[0],i[1],s[0],s[1]);}else {for(let i=t;i<e;i++)this.paintVertexArray.emplace(i,r,n);this.maxValue=Math.max(this.maxValue,Math.abs(r),Math.abs(n));}}upload(t){this.paintVertexArray&&this.paintVertexArray.arrayBuffer&&(this.paintVertexBuffer&&this.paintVertexBuffer.buffer?this.paintVertexBuffer.updateData(this.paintVertexArray):this.paintVertexBuffer=t.createVertexBuffer(this.paintVertexArray,this.paintVertexAttributes,this.expression.isStateDependent));}destroy(){this.paintVertexBuffer&&this.paintVertexBuffer.destroy();}setUniform(t,e){const r=this.useIntegerZoom?Math.floor(e.zoom):e.zoom,n=y(this.expression.interpolationFactor(r,this.zoom,this.zoom+1),0,1);t.set(n);}getBinding(t,e,r){return new _a(t,e)}}class Ba{constructor(t,e,r,n,i,s){this.expression=t,this.type=e,this.useIntegerZoom=r,this.zoom=n,this.layerId=s,this.zoomInPaintVertexArray=new i,this.zoomOutPaintVertexArray=new i;}populatePaintArray(t,e,r){const n=this.zoomInPaintVertexArray.length;this.zoomInPaintVertexArray.resize(t),this.zoomOutPaintVertexArray.resize(t),this._setPaintValues(n,t,e.patterns&&e.patterns[this.layerId],r);}updatePaintArray(t,e,r,n,i){this._setPaintValues(t,e,r.patterns&&r.patterns[this.layerId],i);}_setPaintValues(t,e,r,n){if(!n||!r)return;const{min:i,mid:s,max:a}=r,o=n[i],l=n[s],u=n[a];if(o&&l&&u)for(let r=t;r<e;r++)this.zoomInPaintVertexArray.emplace(r,l.tl[0],l.tl[1],l.br[0],l.br[1],o.tl[0],o.tl[1],o.br[0],o.br[1],l.pixelRatio,o.pixelRatio),this.zoomOutPaintVertexArray.emplace(r,l.tl[0],l.tl[1],l.br[0],l.br[1],u.tl[0],u.tl[1],u.br[0],u.br[1],l.pixelRatio,u.pixelRatio);}upload(t){this.zoomInPaintVertexArray&&this.zoomInPaintVertexArray.arrayBuffer&&this.zoomOutPaintVertexArray&&this.zoomOutPaintVertexArray.arrayBuffer&&(this.zoomInPaintVertexBuffer=t.createVertexBuffer(this.zoomInPaintVertexArray,ua.members,this.expression.isStateDependent),this.zoomOutPaintVertexBuffer=t.createVertexBuffer(this.zoomOutPaintVertexArray,ua.members,this.expression.isStateDependent));}destroy(){this.zoomOutPaintVertexBuffer&&this.zoomOutPaintVertexBuffer.destroy(),this.zoomInPaintVertexBuffer&&this.zoomInPaintVertexBuffer.destroy();}}class Va{constructor(t,e,r){this.binders={},this._buffers=[];const n=[];for(const i in t.paint._values){if(!r(i))continue;const s=t.paint.get(i);if(!(s instanceof Hi&&an(s.property.specification)))continue;const a=Fa(i,t.type),o=s.value,l=s.property.specification.type,u=s.property.useIntegerZoom,c=s.property.specification["property-type"],h="cross-faded"===c||"cross-faded-data-driven"===c;if("constant"===o.kind)this.binders[i]=h?new za(o.value,a):new Ia(o.value,a,l),n.push(`/u_${i}`);else if("source"===o.kind||h){const r=Ta(i,l,"source");this.binders[i]=h?new Ba(o,l,u,e,r,t.id):new Pa(o,a,l,r),n.push(`/a_${i}`);}else {const t=Ta(i,l,"composite");this.binders[i]=new Ca(o,a,l,u,e,t),n.push(`/z_${i}`);}}this.cacheKey=n.sort().join("");}getMaxValue(t){const e=this.binders[t];return e instanceof Pa||e instanceof Ca?e.maxValue:0}populatePaintArrays(t,e,r,n,i){for(const s in this.binders){const a=this.binders[s];(a instanceof Pa||a instanceof Ca||a instanceof Ba)&&a.populatePaintArray(t,e,r,n,i);}}setConstantPatternPositions(t,e){for(const r in this.binders){const n=this.binders[r];n instanceof za&&n.setConstantPatternPositions(t,e);}}updatePaintArrays(t,e,r,n,i){let s=!1;for(const a in t){const o=e.getPositions(a);for(const e of o){const o=r.feature(e.index);for(const r in this.binders){const l=this.binders[r];if((l instanceof Pa||l instanceof Ca||l instanceof Ba)&&!0===l.expression.isStateDependent){const u=n.paint.get(r);l.expression=u.value,l.updatePaintArray(e.start,e.end,o,t[a],i),s=!0;}}}}return s}defines(){const t=[];for(const e in this.binders){const r=this.binders[e];(r instanceof Ia||r instanceof za)&&t.push(...r.uniformNames.map((t=>`#define HAS_UNIFORM_${t}`)));}return t}getBinderAttributes(){const t=[];for(const e in this.binders){const r=this.binders[e];if(r instanceof Pa||r instanceof Ca)for(let e=0;e<r.paintVertexAttributes.length;e++)t.push(r.paintVertexAttributes[e].name);else if(r instanceof Ba)for(let e=0;e<ua.members.length;e++)t.push(ua.members[e].name);}return t}getBinderUniforms(){const t=[];for(const e in this.binders){const r=this.binders[e];if(r instanceof Ia||r instanceof za||r instanceof Ca)for(const e of r.uniformNames)t.push(e);}return t}getPaintVertexBuffers(){return this._buffers}getUniforms(t,e){const r=[];for(const n in this.binders){const i=this.binders[n];if(i instanceof Ia||i instanceof za||i instanceof Ca)for(const s of i.uniformNames)if(e[s]){const a=i.getBinding(t,e[s],s);r.push({name:s,property:n,binding:a});}}return r}setUniforms(t,e,r,n){for(const{name:t,property:i,binding:s}of e)this.binders[i].setUniform(s,n,r.get(i),t);}updatePaintBuffers(t){this._buffers=[];for(const e in this.binders){const r=this.binders[e];if(t&&r instanceof Ba){const e=2===t.fromScale?r.zoomInPaintVertexBuffer:r.zoomOutPaintVertexBuffer;e&&this._buffers.push(e);}else (r instanceof Pa||r instanceof Ca)&&r.paintVertexBuffer&&this._buffers.push(r.paintVertexBuffer);}}upload(t){for(const e in this.binders){const r=this.binders[e];(r instanceof Pa||r instanceof Ca||r instanceof Ba)&&r.upload(t);}this.updatePaintBuffers();}destroy(){for(const t in this.binders){const e=this.binders[t];(e instanceof Pa||e instanceof Ca||e instanceof Ba)&&e.destroy();}}}class Ea{constructor(t,e,r=(()=>!0)){this.programConfigurations={};for(const n of t)this.programConfigurations[n.id]=new Va(n,e,r);this.needsUpload=!1,this._featureMap=new ga,this._bufferOffset=0;}populatePaintArrays(t,e,r,n,i,s){for(const r in this.programConfigurations)this.programConfigurations[r].populatePaintArrays(t,e,n,i,s);void 0!==e.id&&this._featureMap.add(e.id,r,this._bufferOffset,t),this._bufferOffset=t,this.needsUpload=!0;}updatePaintArrays(t,e,r,n){for(const i of r)this.needsUpload=this.programConfigurations[i.id].updatePaintArrays(t,this._featureMap,e,i,n)||this.needsUpload;}get(t){return this.programConfigurations[t]}upload(t){if(this.needsUpload){for(const e in this.programConfigurations)this.programConfigurations[e].upload(t);this.needsUpload=!1;}}destroy(){for(const t in this.programConfigurations)this.programConfigurations[t].destroy();}}function Fa(t,e){return {"text-opacity":["opacity"],"icon-opacity":["opacity"],"text-color":["fill_color"],"icon-color":["fill_color"],"text-halo-color":["halo_color"],"icon-halo-color":["halo_color"],"text-halo-blur":["halo_blur"],"icon-halo-blur":["halo_blur"],"text-halo-width":["halo_width"],"icon-halo-width":["halo_width"],"line-gap-width":["gapwidth"],"line-pattern":["pattern_to","pattern_from","pixel_ratio_to","pixel_ratio_from"],"fill-pattern":["pattern_to","pattern_from","pixel_ratio_to","pixel_ratio_from"],"fill-extrusion-pattern":["pattern_to","pattern_from","pixel_ratio_to","pixel_ratio_from"]}[t]||[t.replace(`${e}-`,"").replace(/-/g,"_")]}function Ta(t,e,r){const n={color:{source:ys,composite:Vs},number:{source:Is,composite:ys}},i=function(t){return {"line-pattern":{source:Js,composite:Js},"fill-pattern":{source:Js,composite:Js},"fill-extrusion-pattern":{source:Js,composite:Js}}[t]}(t);return i&&i[r]||n[e][r]}wi("ConstantBinder",Ia),wi("CrossFadedConstantBinder",za),wi("SourceExpressionBinder",Pa),wi("CrossFadedCompositeBinder",Ba),wi("CompositeExpressionBinder",Ca),wi("ProgramConfiguration",Va,{omit:["_buffers"]}),wi("ProgramConfigurationSet",Ea);const $a=8192,La=Math.pow(2,14)-1,Da=-La-1;function Oa(t){const e=$a/t.extent,r=t.loadGeometry();for(let t=0;t<r.length;t++){const n=r[t];for(let t=0;t<n.length;t++){const r=n[t],i=Math.round(r.x*e),s=Math.round(r.y*e);r.x=y(i,Da,La),r.y=y(s,Da,La),(i<r.x||i>r.x+1||s<r.y||s>r.y+1)&&A("Geometry exceeds allowed extent, reduce your vector tile buffer size");}}return r}function ja(t,e){return {type:t.type,id:t.id,properties:t.properties,geometry:e?Oa(t):[]}}function Ra(t,e,r,n,i){t.emplaceBack(2*e+(n+1)/2,2*r+(i+1)/2);}class Ua{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new Gs,this.indexArray=new na,this.segments=new oa,this.programConfigurations=new Ea(t.layers,t.zoom),this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id));}populate(t,e,r){const n=this.layers[0],i=[];let s=null,a=!1;"circle"===n.type&&(s=n.layout.get("circle-sort-key"),a=!s.isConstant());for(const{feature:e,id:n,index:o,sourceLayerIndex:l}of t){const t=this.layers[0]._featureFilter.needGeometry,u=ja(e,t);if(!this.layers[0]._featureFilter.filter(new Ui(this.zoom),u,r))continue;const c=a?s.evaluate(u,{},r):void 0,h={id:n,properties:e.properties,type:e.type,sourceLayerIndex:l,index:o,geometry:t?u.geometry:Oa(e),patterns:{},sortKey:c};i.push(h);}a&&i.sort(((t,e)=>t.sortKey-e.sortKey));for(const n of i){const{geometry:i,index:s,sourceLayerIndex:a}=n,o=t[s].feature;this.addFeature(n,i,s,r),e.featureIndex.insert(o,i,s,a,this.index);}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,aa),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy());}addFeature(t,e,r,n){for(const r of e)for(const e of r){const r=e.x,n=e.y;if(r<0||r>=$a||n<0||n>=$a)continue;const i=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray,t.sortKey),s=i.vertexLength;Ra(this.layoutVertexArray,r,n,-1,-1),Ra(this.layoutVertexArray,r,n,1,-1),Ra(this.layoutVertexArray,r,n,1,1),Ra(this.layoutVertexArray,r,n,-1,1),this.indexArray.emplaceBack(s,s+1,s+2),this.indexArray.emplaceBack(s,s+3,s+2),i.vertexLength+=4,i.primitiveLength+=2;}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,{},n);}}function qa(t,e){for(let r=0;r<t.length;r++)if(Wa(e,t[r]))return !0;for(let r=0;r<e.length;r++)if(Wa(t,e[r]))return !0;return !!Ka(t,e)}function Na(t,e,r){return !!Wa(t,e)||!!Ha(e,t,r)}function Za(t,e){if(1===t.length)return Ja(e,t[0]);for(let r=0;r<e.length;r++){const n=e[r];for(let e=0;e<n.length;e++)if(Wa(t,n[e]))return !0}for(let r=0;r<t.length;r++)if(Ja(e,t[r]))return !0;for(let r=0;r<e.length;r++)if(Ka(t,e[r]))return !0;return !1}function Ga(t,e,r){if(t.length>1){if(Ka(t,e))return !0;for(let n=0;n<e.length;n++)if(Ha(e[n],t,r))return !0}for(let n=0;n<t.length;n++)if(Ha(t[n],e,r))return !0;return !1}function Ka(t,e){if(0===t.length||0===e.length)return !1;for(let r=0;r<t.length-1;r++){const n=t[r],i=t[r+1];for(let t=0;t<e.length-1;t++)if(Xa(n,i,e[t],e[t+1]))return !0}return !1}function Xa(t,e,r,n){return S(t,r,n)!==S(e,r,n)&&S(t,e,r)!==S(t,e,n)}function Ha(t,e,r){const n=r*r;if(1===e.length)return t.distSqr(e[0])<n;for(let r=1;r<e.length;r++)if(Ya(t,e[r-1],e[r])<n)return !0;return !1}function Ya(t,e,r){const n=e.distSqr(r);if(0===n)return t.distSqr(e);const i=((t.x-e.x)*(r.x-e.x)+(t.y-e.y)*(r.y-e.y))/n;return t.distSqr(i<0?e:i>1?r:r.sub(e)._mult(i)._add(e))}function Ja(t,e){let r,n,i,s=!1;for(let a=0;a<t.length;a++){r=t[a];for(let t=0,a=r.length-1;t<r.length;a=t++)n=r[t],i=r[a],n.y>e.y!=i.y>e.y&&e.x<(i.x-n.x)*(e.y-n.y)/(i.y-n.y)+n.x&&(s=!s);}return s}function Wa(t,e){let r=!1;for(let n=0,i=t.length-1;n<t.length;i=n++){const s=t[n],a=t[i];s.y>e.y!=a.y>e.y&&e.x<(a.x-s.x)*(e.y-s.y)/(a.y-s.y)+s.x&&(r=!r);}return r}function Qa(t,e,r){const n=r[0],i=r[2];if(t.x<n.x&&e.x<n.x||t.x>i.x&&e.x>i.x||t.y<n.y&&e.y<n.y||t.y>i.y&&e.y>i.y)return !1;const s=S(t,e,r[0]);return s!==S(t,e,r[1])||s!==S(t,e,r[2])||s!==S(t,e,r[3])}function to(t,e,r){const n=e.paint.get(t).value;return "constant"===n.kind?n.value:r.programConfigurations.get(e.id).getMaxValue(t)}function eo(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function ro(t,e,r,n,i){if(!e[0]&&!e[1])return t;const a=s.convert(e)._mult(i);"viewport"===r&&a._rotate(-n);const o=[];for(let e=0;e<t.length;e++)o.push(t[e].sub(a));return o}let no,io;wi("CircleBucket",Ua,{omit:["layers"]});var so={get paint(){return io=io||new rs({"circle-radius":new Wi(G.paint_circle["circle-radius"]),"circle-color":new Wi(G.paint_circle["circle-color"]),"circle-blur":new Wi(G.paint_circle["circle-blur"]),"circle-opacity":new Wi(G.paint_circle["circle-opacity"]),"circle-translate":new Ji(G.paint_circle["circle-translate"]),"circle-translate-anchor":new Ji(G.paint_circle["circle-translate-anchor"]),"circle-pitch-scale":new Ji(G.paint_circle["circle-pitch-scale"]),"circle-pitch-alignment":new Ji(G.paint_circle["circle-pitch-alignment"]),"circle-stroke-width":new Wi(G.paint_circle["circle-stroke-width"]),"circle-stroke-color":new Wi(G.paint_circle["circle-stroke-color"]),"circle-stroke-opacity":new Wi(G.paint_circle["circle-stroke-opacity"])})},get layout(){return no=no||new rs({"circle-sort-key":new Wi(G.layout_circle["circle-sort-key"])})}},ao=1e-6,oo="undefined"!=typeof Float32Array?Float32Array:Array;function lo(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function uo(t,e,r){var n=e[0],i=e[1],s=e[2],a=e[3],o=e[4],l=e[5],u=e[6],c=e[7],h=e[8],p=e[9],f=e[10],d=e[11],y=e[12],m=e[13],g=e[14],x=e[15],v=r[0],b=r[1],w=r[2],_=r[3];return t[0]=v*n+b*o+w*h+_*y,t[1]=v*i+b*l+w*p+_*m,t[2]=v*s+b*u+w*f+_*g,t[3]=v*a+b*c+w*d+_*x,t[4]=(v=r[4])*n+(b=r[5])*o+(w=r[6])*h+(_=r[7])*y,t[5]=v*i+b*l+w*p+_*m,t[6]=v*s+b*u+w*f+_*g,t[7]=v*a+b*c+w*d+_*x,t[8]=(v=r[8])*n+(b=r[9])*o+(w=r[10])*h+(_=r[11])*y,t[9]=v*i+b*l+w*p+_*m,t[10]=v*s+b*u+w*f+_*g,t[11]=v*a+b*c+w*d+_*x,t[12]=(v=r[12])*n+(b=r[13])*o+(w=r[14])*h+(_=r[15])*y,t[13]=v*i+b*l+w*p+_*m,t[14]=v*s+b*u+w*f+_*g,t[15]=v*a+b*c+w*d+_*x,t}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});var co,ho=uo;function po(t,e,r){var n=e[0],i=e[1],s=e[2],a=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*s+r[12]*a,t[1]=r[1]*n+r[5]*i+r[9]*s+r[13]*a,t[2]=r[2]*n+r[6]*i+r[10]*s+r[14]*a,t[3]=r[3]*n+r[7]*i+r[11]*s+r[15]*a,t}co=new oo(4),oo!=Float32Array&&(co[0]=0,co[1]=0,co[2]=0,co[3]=0);class fo extends is{constructor(t){super(t,so);}createBucket(t){return new Ua(t)}queryRadius(t){const e=t;return to("circle-radius",this,e)+to("circle-stroke-width",this,e)+eo(this.paint.get("circle-translate"))}queryIntersectsFeature(t,e,r,n,i,s,a,o){const l=ro(t,this.paint.get("circle-translate"),this.paint.get("circle-translate-anchor"),s.angle,a),u=this.paint.get("circle-radius").evaluate(e,r)+this.paint.get("circle-stroke-width").evaluate(e,r),c="map"===this.paint.get("circle-pitch-alignment"),h=c?l:function(t,e){return t.map((t=>yo(t,e)))}(l,o),p=c?u*a:u;for(const t of n)for(const e of t){const t=c?e:yo(e,o);let r=p;const n=po([],[e.x,e.y,0,1],o);if("viewport"===this.paint.get("circle-pitch-scale")&&"map"===this.paint.get("circle-pitch-alignment")?r*=n[3]/s.cameraToCenterDistance:"map"===this.paint.get("circle-pitch-scale")&&"viewport"===this.paint.get("circle-pitch-alignment")&&(r*=s.cameraToCenterDistance/n[3]),Na(h,t,r))return !0}return !1}}function yo(t,e){const r=po([],[t.x,t.y,0,1],e);return new s(r[0]/r[3],r[1]/r[3])}class mo extends Ua{}let go;wi("HeatmapBucket",mo,{omit:["layers"]});var xo={get paint(){return go=go||new rs({"heatmap-radius":new Wi(G.paint_heatmap["heatmap-radius"]),"heatmap-weight":new Wi(G.paint_heatmap["heatmap-weight"]),"heatmap-intensity":new Ji(G.paint_heatmap["heatmap-intensity"]),"heatmap-color":new es(G.paint_heatmap["heatmap-color"]),"heatmap-opacity":new Ji(G.paint_heatmap["heatmap-opacity"])})}};function vo(t,{width:e,height:r},n,i){if(i){if(i instanceof Uint8ClampedArray)i=new Uint8Array(i.buffer);else if(i.length!==e*r*n)throw new RangeError(`mismatched image size. expected: ${i.length} but got: ${e*r*n}`)}else i=new Uint8Array(e*r*n);return t.width=e,t.height=r,t.data=i,t}function bo(t,{width:e,height:r},n){if(e===t.width&&r===t.height)return;const i=vo({},{width:e,height:r},n);wo(t,i,{x:0,y:0},{x:0,y:0},{width:Math.min(t.width,e),height:Math.min(t.height,r)},n),t.width=e,t.height=r,t.data=i.data;}function wo(t,e,r,n,i,s){if(0===i.width||0===i.height)return e;if(i.width>t.width||i.height>t.height||r.x>t.width-i.width||r.y>t.height-i.height)throw new RangeError("out of range source coordinates for image copy");if(i.width>e.width||i.height>e.height||n.x>e.width-i.width||n.y>e.height-i.height)throw new RangeError("out of range destination coordinates for image copy");const a=t.data,o=e.data;if(a===o)throw new Error("srcData equals dstData, so image is already copied");for(let l=0;l<i.height;l++){const u=((r.y+l)*t.width+r.x)*s,c=((n.y+l)*e.width+n.x)*s;for(let t=0;t<i.width*s;t++)o[c+t]=a[u+t];}return e}class _o{constructor(t,e){vo(this,t,1,e);}resize(t){bo(this,t,1);}clone(){return new _o({width:this.width,height:this.height},new Uint8Array(this.data))}static copy(t,e,r,n,i){wo(t,e,r,n,i,1);}}class Ao{constructor(t,e){vo(this,t,4,e);}resize(t){bo(this,t,4);}replace(t,e){e?this.data.set(t):this.data=t instanceof Uint8ClampedArray?new Uint8Array(t.buffer):t;}clone(){return new Ao({width:this.width,height:this.height},new Uint8Array(this.data))}static copy(t,e,r,n,i){wo(t,e,r,n,i,4);}}function So(t){const e={},r=t.resolution||256,n=t.clips?t.clips.length:1,i=t.image||new Ao({width:r,height:n});if(Math.log(r)/Math.LN2%1!=0)throw new Error(`width is not a power of 2 - ${r}`);const s=(r,n,s)=>{e[t.evaluationKey]=s;const a=t.expression.evaluate(e);i.data[r+n+0]=Math.floor(255*a.r/a.a),i.data[r+n+1]=Math.floor(255*a.g/a.a),i.data[r+n+2]=Math.floor(255*a.b/a.a),i.data[r+n+3]=Math.floor(255*a.a);};if(t.clips)for(let e=0,i=0;e<n;++e,i+=4*r)for(let n=0,a=0;n<r;n++,a+=4){const o=n/(r-1),{start:l,end:u}=t.clips[e];s(i,a,l*(1-o)+u*o);}else for(let t=0,e=0;t<r;t++,e+=4)s(0,e,t/(r-1));return i}wi("AlphaImage",_o),wi("RGBAImage",Ao);const ko="big-fb";class Mo extends is{createBucket(t){return new mo(t)}constructor(t){super(t,xo),this.heatmapFbos=new Map,this._updateColorRamp();}_handleSpecialPaintPropertyUpdate(t){"heatmap-color"===t&&this._updateColorRamp();}_updateColorRamp(){this.colorRamp=So({expression:this._transitionablePaint._values["heatmap-color"].value.expression,evaluationKey:"heatmapDensity",image:this.colorRamp}),this.colorRampTexture=null;}resize(){this.heatmapFbos.has(ko)&&this.heatmapFbos.delete(ko);}queryRadius(){return 0}queryIntersectsFeature(){return !1}hasOffscreenPass(){return 0!==this.paint.get("heatmap-opacity")&&"none"!==this.visibility}}let Io;var zo={get paint(){return Io=Io||new rs({"hillshade-illumination-direction":new Ji(G.paint_hillshade["hillshade-illumination-direction"]),"hillshade-illumination-anchor":new Ji(G.paint_hillshade["hillshade-illumination-anchor"]),"hillshade-exaggeration":new Ji(G.paint_hillshade["hillshade-exaggeration"]),"hillshade-shadow-color":new Ji(G.paint_hillshade["hillshade-shadow-color"]),"hillshade-highlight-color":new Ji(G.paint_hillshade["hillshade-highlight-color"]),"hillshade-accent-color":new Ji(G.paint_hillshade["hillshade-accent-color"])})}};class Po extends is{constructor(t){super(t,zo);}hasOffscreenPass(){return 0!==this.paint.get("hillshade-exaggeration")&&"none"!==this.visibility}}const Co=ls([{name:"a_pos",components:2,type:"Int16"}],4),{members:Bo}=Co;function Vo(t,e,r=2){const n=e&&e.length,i=n?e[0]*r:t.length;let s=Eo(t,0,i,r,!0);const a=[];if(!s||s.next===s.prev)return a;let o,l,u;if(n&&(s=function(t,e,r,n){const i=[];for(let r=0,s=e.length;r<s;r++){const a=Eo(t,e[r]*n,r<s-1?e[r+1]*n:t.length,n,!1);a===a.next&&(a.steiner=!0),i.push(No(a));}i.sort(jo);for(let t=0;t<i.length;t++)r=Ro(i[t],r);return r}(t,e,s,r)),t.length>80*r){o=1/0,l=1/0;let e=-1/0,n=-1/0;for(let s=r;s<i;s+=r){const r=t[s],i=t[s+1];r<o&&(o=r),i<l&&(l=i),r>e&&(e=r),i>n&&(n=i);}u=Math.max(e-o,n-l),u=0!==u?32767/u:0;}return To(s,a,r,o,l,u,0),a}function Eo(t,e,r,n,i){let s;if(i===function(t,e,r,n){let i=0;for(let s=e,a=r-n;s<r;s+=n)i+=(t[a]-t[s])*(t[s+1]+t[a+1]),a=s;return i}(t,e,r,n)>0)for(let i=e;i<r;i+=n)s=tl(i/n|0,t[i],t[i+1],s);else for(let i=r-n;i>=e;i-=n)s=tl(i/n|0,t[i],t[i+1],s);return s&&Xo(s,s.next)&&(el(s),s=s.next),s}function Fo(t,e){if(!t)return t;e||(e=t);let r,n=t;do{if(r=!1,n.steiner||!Xo(n,n.next)&&0!==Ko(n.prev,n,n.next))n=n.next;else {if(el(n),n=e=n.prev,n===n.next)break;r=!0;}}while(r||n!==e);return e}function To(t,e,r,n,i,s,a){if(!t)return;!a&&s&&function(t,e,r,n){let i=t;do{0===i.z&&(i.z=qo(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){let e,r=1;do{let n,i=t;t=null;let s=null;for(e=0;i;){e++;let a=i,o=0;for(let t=0;t<r&&(o++,a=a.nextZ,a);t++);let l=r;for(;o>0||l>0&&a;)0!==o&&(0===l||!a||i.z<=a.z)?(n=i,i=i.nextZ,o--):(n=a,a=a.nextZ,l--),s?s.nextZ=n:t=n,n.prevZ=s,s=n;i=a;}s.nextZ=null,r*=2;}while(e>1)}(i);}(t,n,i,s);let o=t;for(;t.prev!==t.next;){const l=t.prev,u=t.next;if(s?Lo(t,n,i,s):$o(t))e.push(l.i,t.i,u.i),el(t),t=u.next,o=u.next;else if((t=u)===o){a?1===a?To(t=Do(Fo(t),e),e,r,n,i,s,2):2===a&&Oo(t,e,r,n,i,s):To(Fo(t),e,r,n,i,s,1);break}}}function $o(t){const e=t.prev,r=t,n=t.next;if(Ko(e,r,n)>=0)return !1;const i=e.x,s=r.x,a=n.x,o=e.y,l=r.y,u=n.y,c=i<s?i<a?i:a:s<a?s:a,h=o<l?o<u?o:u:l<u?l:u,p=i>s?i>a?i:a:s>a?s:a,f=o>l?o>u?o:u:l>u?l:u;let d=n.next;for(;d!==e;){if(d.x>=c&&d.x<=p&&d.y>=h&&d.y<=f&&Zo(i,o,s,l,a,u,d.x,d.y)&&Ko(d.prev,d,d.next)>=0)return !1;d=d.next;}return !0}function Lo(t,e,r,n){const i=t.prev,s=t,a=t.next;if(Ko(i,s,a)>=0)return !1;const o=i.x,l=s.x,u=a.x,c=i.y,h=s.y,p=a.y,f=o<l?o<u?o:u:l<u?l:u,d=c<h?c<p?c:p:h<p?h:p,y=o>l?o>u?o:u:l>u?l:u,m=c>h?c>p?c:p:h>p?h:p,g=qo(f,d,e,r,n),x=qo(y,m,e,r,n);let v=t.prevZ,b=t.nextZ;for(;v&&v.z>=g&&b&&b.z<=x;){if(v.x>=f&&v.x<=y&&v.y>=d&&v.y<=m&&v!==i&&v!==a&&Zo(o,c,l,h,u,p,v.x,v.y)&&Ko(v.prev,v,v.next)>=0)return !1;if(v=v.prevZ,b.x>=f&&b.x<=y&&b.y>=d&&b.y<=m&&b!==i&&b!==a&&Zo(o,c,l,h,u,p,b.x,b.y)&&Ko(b.prev,b,b.next)>=0)return !1;b=b.nextZ;}for(;v&&v.z>=g;){if(v.x>=f&&v.x<=y&&v.y>=d&&v.y<=m&&v!==i&&v!==a&&Zo(o,c,l,h,u,p,v.x,v.y)&&Ko(v.prev,v,v.next)>=0)return !1;v=v.prevZ;}for(;b&&b.z<=x;){if(b.x>=f&&b.x<=y&&b.y>=d&&b.y<=m&&b!==i&&b!==a&&Zo(o,c,l,h,u,p,b.x,b.y)&&Ko(b.prev,b,b.next)>=0)return !1;b=b.nextZ;}return !0}function Do(t,e){let r=t;do{const n=r.prev,i=r.next.next;!Xo(n,i)&&Ho(n,r,r.next,i)&&Wo(n,i)&&Wo(i,n)&&(e.push(n.i,r.i,i.i),el(r),el(r.next),r=t=i),r=r.next;}while(r!==t);return Fo(r)}function Oo(t,e,r,n,i,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Go(a,t)){let o=Qo(a,t);return a=Fo(a,a.next),o=Fo(o,o.next),To(a,e,r,n,i,s,0),void To(o,e,r,n,i,s,0)}t=t.next;}a=a.next;}while(a!==t)}function jo(t,e){return t.x-e.x}function Ro(t,e){const r=function(t,e){let r=e;const n=t.x,i=t.y;let s,a=-1/0;do{if(i<=r.y&&i>=r.next.y&&r.next.y!==r.y){const t=r.x+(i-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(t<=n&&t>a&&(a=t,s=r.x<r.next.x?r:r.next,t===n))return s}r=r.next;}while(r!==e);if(!s)return null;const o=s,l=s.x,u=s.y;let c=1/0;r=s;do{if(n>=r.x&&r.x>=l&&n!==r.x&&Zo(i<u?n:a,i,l,u,i<u?a:n,i,r.x,r.y)){const e=Math.abs(i-r.y)/(n-r.x);Wo(r,t)&&(e<c||e===c&&(r.x>s.x||r.x===s.x&&Uo(s,r)))&&(s=r,c=e);}r=r.next;}while(r!==o);return s}(t,e);if(!r)return e;const n=Qo(r,t);return Fo(n,n.next),Fo(r,r.next)}function Uo(t,e){return Ko(t.prev,t,e.prev)<0&&Ko(e.next,t,t.next)<0}function qo(t,e,r,n,i){return (t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-r)*i|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*i|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function No(t){let e=t,r=t;do{(e.x<r.x||e.x===r.x&&e.y<r.y)&&(r=e),e=e.next;}while(e!==t);return r}function Zo(t,e,r,n,i,s,a,o){return (i-a)*(e-o)>=(t-a)*(s-o)&&(t-a)*(n-o)>=(r-a)*(e-o)&&(r-a)*(s-o)>=(i-a)*(n-o)}function Go(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&Ho(r,r.next,t,e))return !0;r=r.next;}while(r!==t);return !1}(t,e)&&(Wo(t,e)&&Wo(e,t)&&function(t,e){let r=t,n=!1;const i=(t.x+e.x)/2,s=(t.y+e.y)/2;do{r.y>s!=r.next.y>s&&r.next.y!==r.y&&i<(r.next.x-r.x)*(s-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;}while(r!==t);return n}(t,e)&&(Ko(t.prev,t,e.prev)||Ko(t,e.prev,e))||Xo(t,e)&&Ko(t.prev,t,t.next)>0&&Ko(e.prev,e,e.next)>0)}function Ko(t,e,r){return (e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function Xo(t,e){return t.x===e.x&&t.y===e.y}function Ho(t,e,r,n){const i=Jo(Ko(t,e,r)),s=Jo(Ko(t,e,n)),a=Jo(Ko(r,n,t)),o=Jo(Ko(r,n,e));return i!==s&&a!==o||!(0!==i||!Yo(t,r,e))||!(0!==s||!Yo(t,n,e))||!(0!==a||!Yo(r,t,n))||!(0!==o||!Yo(r,e,n))}function Yo(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function Jo(t){return t>0?1:t<0?-1:0}function Wo(t,e){return Ko(t.prev,t,t.next)<0?Ko(t,e,t.next)>=0&&Ko(t,t.prev,e)>=0:Ko(t,e,t.prev)<0||Ko(t,t.next,e)<0}function Qo(t,e){const r=rl(t.i,t.x,t.y),n=rl(e.i,e.x,e.y),i=t.next,s=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,s.next=n,n.prev=s,n}function tl(t,e,r,n){const i=rl(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function el(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ);}function rl(t,e,r){return {i:t,x:e,y:r,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function nl(t,e,r){const n=r.patternDependencies;let i=!1;for(const r of e){const e=r.paint.get(`${t}-pattern`);e.isConstant()||(i=!0);const s=e.constantOr(null);s&&(i=!0,n[s.to]=!0,n[s.from]=!0);}return i}function il(t,e,r,n,i){const s=i.patternDependencies;for(const a of e){const e=a.paint.get(`${t}-pattern`).value;if("constant"!==e.kind){let t=e.evaluate({zoom:n-1},r,{},i.availableImages),o=e.evaluate({zoom:n},r,{},i.availableImages),l=e.evaluate({zoom:n+1},r,{},i.availableImages);t=t&&t.name?t.name:t,o=o&&o.name?o.name:o,l=l&&l.name?l.name:l,s[t]=!0,s[o]=!0,s[l]=!0,r.patterns[a.id]={min:t,mid:o,max:l};}}return r}class sl{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.layoutVertexArray=new Ks,this.indexArray=new na,this.indexArray2=new ia,this.programConfigurations=new Ea(t.layers,t.zoom),this.segments=new oa,this.segments2=new oa,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id));}populate(t,e,r){this.hasPattern=nl("fill",this.layers,e);const n=this.layers[0].layout.get("fill-sort-key"),i=!n.isConstant(),s=[];for(const{feature:a,id:o,index:l,sourceLayerIndex:u}of t){const t=this.layers[0]._featureFilter.needGeometry,c=ja(a,t);if(!this.layers[0]._featureFilter.filter(new Ui(this.zoom),c,r))continue;const h=i?n.evaluate(c,{},r,e.availableImages):void 0,p={id:o,properties:a.properties,type:a.type,sourceLayerIndex:u,index:l,geometry:t?c.geometry:Oa(a),patterns:{},sortKey:h};s.push(p);}i&&s.sort(((t,e)=>t.sortKey-e.sortKey));for(const n of s){const{geometry:i,index:s,sourceLayerIndex:a}=n;if(this.hasPattern){const t=il("fill",this.layers,n,this.zoom,e);this.patternFeatures.push(t);}else this.addFeature(n,i,s,r,{});e.featureIndex.insert(t[s].feature,i,s,a,this.index);}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r);}addFeatures(t,e,r){for(const t of this.patternFeatures)this.addFeature(t,t.geometry,t.index,e,r);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Bo),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.indexBuffer2=t.createIndexBuffer(this.indexArray2)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.indexBuffer2.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.segments2.destroy());}addFeature(t,e,r,n,i){for(const t of xr(e,500)){let e=0;for(const r of t)e+=r.length;const r=this.segments.prepareSegment(e,this.layoutVertexArray,this.indexArray),n=r.vertexLength,i=[],s=[];for(const e of t){if(0===e.length)continue;e!==t[0]&&s.push(i.length/2);const r=this.segments2.prepareSegment(e.length,this.layoutVertexArray,this.indexArray2),n=r.vertexLength;this.layoutVertexArray.emplaceBack(e[0].x,e[0].y),this.indexArray2.emplaceBack(n+e.length-1,n),i.push(e[0].x),i.push(e[0].y);for(let t=1;t<e.length;t++)this.layoutVertexArray.emplaceBack(e[t].x,e[t].y),this.indexArray2.emplaceBack(n+t-1,n+t),i.push(e[t].x),i.push(e[t].y);r.vertexLength+=e.length,r.primitiveLength+=e.length;}const a=Vo(i,s);for(let t=0;t<a.length;t+=3)this.indexArray.emplaceBack(n+a[t],n+a[t+1],n+a[t+2]);r.vertexLength+=e,r.primitiveLength+=a.length/3;}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,i,n);}}let al,ol;wi("FillBucket",sl,{omit:["layers","patternFeatures"]});var ll={get paint(){return ol=ol||new rs({"fill-antialias":new Ji(G.paint_fill["fill-antialias"]),"fill-opacity":new Wi(G.paint_fill["fill-opacity"]),"fill-color":new Wi(G.paint_fill["fill-color"]),"fill-outline-color":new Wi(G.paint_fill["fill-outline-color"]),"fill-translate":new Ji(G.paint_fill["fill-translate"]),"fill-translate-anchor":new Ji(G.paint_fill["fill-translate-anchor"]),"fill-pattern":new Qi(G.paint_fill["fill-pattern"])})},get layout(){return al=al||new rs({"fill-sort-key":new Wi(G.layout_fill["fill-sort-key"])})}};class ul extends is{constructor(t){super(t,ll);}recalculate(t,e){super.recalculate(t,e);const r=this.paint._values["fill-outline-color"];"constant"===r.value.kind&&void 0===r.value.value&&(this.paint._values["fill-outline-color"]=this.paint._values["fill-color"]);}createBucket(t){return new sl(t)}queryRadius(){return eo(this.paint.get("fill-translate"))}queryIntersectsFeature(t,e,r,n,i,s,a){return Za(ro(t,this.paint.get("fill-translate"),this.paint.get("fill-translate-anchor"),s.angle,a),n)}isTileClipped(){return !0}}const cl=ls([{name:"a_pos",components:2,type:"Int16"},{name:"a_normal_ed",components:4,type:"Int16"}],4),hl=ls([{name:"a_centroid",components:2,type:"Int16"}],4),{members:pl}=cl;var fl={},dl=n,yl=ml;function ml(t,e,r,n,i){this.properties={},this.extent=r,this.type=0,this._pbf=t,this._geometry=-1,this._keys=n,this._values=i,t.readFields(gl,this,e);}function gl(t,e,r){1==t?e.id=r.readVarint():2==t?function(t,e){for(var r=t.readVarint()+t.pos;t.pos<r;){var n=e._keys[t.readVarint()],i=e._values[t.readVarint()];e.properties[n]=i;}}(r,e):3==t?e.type=r.readVarint():4==t&&(e._geometry=r.pos);}function xl(t){for(var e,r,n=0,i=0,s=t.length,a=s-1;i<s;a=i++)n+=((r=t[a]).x-(e=t[i]).x)*(e.y+r.y);return n}ml.types=["Unknown","Point","LineString","Polygon"],ml.prototype.loadGeometry=function(){var t=this._pbf;t.pos=this._geometry;for(var e,r=t.readVarint()+t.pos,n=1,i=0,s=0,a=0,o=[];t.pos<r;){if(i<=0){var l=t.readVarint();n=7&l,i=l>>3;}if(i--,1===n||2===n)s+=t.readSVarint(),a+=t.readSVarint(),1===n&&(e&&o.push(e),e=[]),e.push(new dl(s,a));else {if(7!==n)throw new Error("unknown command "+n);e&&e.push(e[0].clone());}}return e&&o.push(e),o},ml.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,n=0,i=0,s=0,a=1/0,o=-1/0,l=1/0,u=-1/0;t.pos<e;){if(n<=0){var c=t.readVarint();r=7&c,n=c>>3;}if(n--,1===r||2===r)(i+=t.readSVarint())<a&&(a=i),i>o&&(o=i),(s+=t.readSVarint())<l&&(l=s),s>u&&(u=s);else if(7!==r)throw new Error("unknown command "+r)}return [a,l,o,u]},ml.prototype.toGeoJSON=function(t,e,r){var n,i,s=this.extent*Math.pow(2,r),a=this.extent*t,o=this.extent*e,l=this.loadGeometry(),u=ml.types[this.type];function c(t){for(var e=0;e<t.length;e++){var r=t[e];t[e]=[360*(r.x+a)/s-180,360/Math.PI*Math.atan(Math.exp((180-360*(r.y+o)/s)*Math.PI/180))-90];}}switch(this.type){case 1:var h=[];for(n=0;n<l.length;n++)h[n]=l[n][0];c(l=h);break;case 2:for(n=0;n<l.length;n++)c(l[n]);break;case 3:for(l=function(t){var e=t.length;if(e<=1)return [t];for(var r,n,i=[],s=0;s<e;s++){var a=xl(t[s]);0!==a&&(void 0===n&&(n=a<0),n===a<0?(r&&i.push(r),r=[t[s]]):r.push(t[s]));}return r&&i.push(r),i}(l),n=0;n<l.length;n++)for(i=0;i<l[n].length;i++)c(l[n][i]);}1===l.length?l=l[0]:u="Multi"+u;var p={type:"Feature",geometry:{type:u,coordinates:l},properties:this.properties};return "id"in this&&(p.id=this.id),p};var vl=yl,bl=wl;function wl(t,e){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=t,this._keys=[],this._values=[],this._features=[],t.readFields(_l,this,e),this.length=this._features.length;}function _l(t,e,r){15===t?e.version=r.readVarint():1===t?e.name=r.readString():5===t?e.extent=r.readVarint():2===t?e._features.push(r.pos):3===t?e._keys.push(r.readString()):4===t&&e._values.push(function(t){for(var e=null,r=t.readVarint()+t.pos;t.pos<r;){var n=t.readVarint()>>3;e=1===n?t.readString():2===n?t.readFloat():3===n?t.readDouble():4===n?t.readVarint64():5===n?t.readVarint():6===n?t.readSVarint():7===n?t.readBoolean():null;}return e}(r));}wl.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new vl(this._pbf,e,this.extent,this._keys,this._values)};var Al=bl;function Sl(t,e,r){if(3===t){var n=new Al(r,r.readVarint()+r.pos);n.length&&(e[n.name]=n);}}fl.VectorTile=function(t,e){this.layers=t.readFields(Sl,{},e);},fl.VectorTileFeature=yl,fl.VectorTileLayer=bl;const kl=fl.VectorTileFeature.types,Ml=Math.pow(2,13);function Il(t,e,r,n,i,s,a,o){t.emplaceBack(e,r,2*Math.floor(n*Ml)+a,i*Ml*2,s*Ml*2,Math.round(o));}class zl{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new Xs,this.centroidVertexArray=new Zs,this.indexArray=new na,this.programConfigurations=new Ea(t.layers,t.zoom),this.segments=new oa,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id));}populate(t,e,r){this.features=[],this.hasPattern=nl("fill-extrusion",this.layers,e);for(const{feature:n,id:i,index:s,sourceLayerIndex:a}of t){const t=this.layers[0]._featureFilter.needGeometry,o=ja(n,t);if(!this.layers[0]._featureFilter.filter(new Ui(this.zoom),o,r))continue;const l={id:i,sourceLayerIndex:a,index:s,geometry:t?o.geometry:Oa(n),properties:n.properties,type:n.type,patterns:{}};this.hasPattern?this.features.push(il("fill-extrusion",this.layers,l,this.zoom,e)):this.addFeature(l,l.geometry,s,r,{}),e.featureIndex.insert(n,l.geometry,s,a,this.index,!0);}}addFeatures(t,e,r){for(const t of this.features){const{geometry:n}=t;this.addFeature(t,n,t.index,e,r);}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r);}isEmpty(){return 0===this.layoutVertexArray.length&&0===this.centroidVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,pl),this.centroidVertexBuffer=t.createVertexBuffer(this.centroidVertexArray,hl.members,!0),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.centroidVertexBuffer.destroy());}addFeature(t,e,r,n,i){for(const r of xr(e,500)){const e={x:0,y:0,vertexCount:0};let n=0;for(const t of r)n+=t.length;let i=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray);for(const t of r){if(0===t.length)continue;if(Cl(t))continue;let r=0;for(let n=0;n<t.length;n++){const s=t[n];if(n>=1){const a=t[n-1];if(!Pl(s,a)){i.vertexLength+4>oa.MAX_VERTEX_ARRAY_LENGTH&&(i=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray));const t=s.sub(a)._perp()._unit(),n=a.dist(s);r+n>32768&&(r=0),Il(this.layoutVertexArray,s.x,s.y,t.x,t.y,0,0,r),Il(this.layoutVertexArray,s.x,s.y,t.x,t.y,0,1,r),e.x+=2*s.x,e.y+=2*s.y,e.vertexCount+=2,r+=n,Il(this.layoutVertexArray,a.x,a.y,t.x,t.y,0,0,r),Il(this.layoutVertexArray,a.x,a.y,t.x,t.y,0,1,r),e.x+=2*a.x,e.y+=2*a.y,e.vertexCount+=2;const o=i.vertexLength;this.indexArray.emplaceBack(o,o+2,o+1),this.indexArray.emplaceBack(o+1,o+2,o+3),i.vertexLength+=4,i.primitiveLength+=2;}}}}if(i.vertexLength+n>oa.MAX_VERTEX_ARRAY_LENGTH&&(i=this.segments.prepareSegment(n,this.layoutVertexArray,this.indexArray)),"Polygon"!==kl[t.type])continue;const s=[],a=[],o=i.vertexLength;for(const t of r)if(0!==t.length){t!==r[0]&&a.push(s.length/2);for(let r=0;r<t.length;r++){const n=t[r];Il(this.layoutVertexArray,n.x,n.y,0,0,1,1,0),e.x+=n.x,e.y+=n.y,e.vertexCount+=1,s.push(n.x),s.push(n.y);}}const l=Vo(s,a);for(let t=0;t<l.length;t+=3)this.indexArray.emplaceBack(o+l[t],o+l[t+2],o+l[t+1]);i.primitiveLength+=l.length/3,i.vertexLength+=n;for(let t=0;t<e.vertexCount;t++){const t=Math.floor(e.x/e.vertexCount),r=Math.floor(e.y/e.vertexCount);this.centroidVertexArray.emplaceBack(t,r);}}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,i,n);}}function Pl(t,e){return t.x===e.x&&(t.x<0||t.x>$a)||t.y===e.y&&(t.y<0||t.y>$a)}function Cl(t){return t.every((t=>t.x<0))||t.every((t=>t.x>$a))||t.every((t=>t.y<0))||t.every((t=>t.y>$a))}let Bl;wi("FillExtrusionBucket",zl,{omit:["layers","features"]});var Vl={get paint(){return Bl=Bl||new rs({"fill-extrusion-opacity":new Ji(G["paint_fill-extrusion"]["fill-extrusion-opacity"]),"fill-extrusion-color":new Wi(G["paint_fill-extrusion"]["fill-extrusion-color"]),"fill-extrusion-translate":new Ji(G["paint_fill-extrusion"]["fill-extrusion-translate"]),"fill-extrusion-translate-anchor":new Ji(G["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]),"fill-extrusion-pattern":new Qi(G["paint_fill-extrusion"]["fill-extrusion-pattern"]),"fill-extrusion-height":new Wi(G["paint_fill-extrusion"]["fill-extrusion-height"]),"fill-extrusion-base":new Wi(G["paint_fill-extrusion"]["fill-extrusion-base"]),"fill-extrusion-vertical-gradient":new Ji(G["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"])})}};class El extends is{constructor(t){super(t,Vl);}createBucket(t){return new zl(t)}queryRadius(){return eo(this.paint.get("fill-extrusion-translate"))}is3D(){return !0}queryIntersectsFeature(t,e,r,n,i,a,o,l){const u=ro(t,this.paint.get("fill-extrusion-translate"),this.paint.get("fill-extrusion-translate-anchor"),a.angle,o),c=this.paint.get("fill-extrusion-height").evaluate(e,r),h=this.paint.get("fill-extrusion-base").evaluate(e,r),p=function(t,e,r,n){const i=[];for(const r of t){const t=[r.x,r.y,0,1];po(t,t,e),i.push(new s(t[0]/t[3],t[1]/t[3]));}return i}(u,l),f=function(t,e,r,n){const i=[],a=[],o=n[8]*e,l=n[9]*e,u=n[10]*e,c=n[11]*e,h=n[8]*r,p=n[9]*r,f=n[10]*r,d=n[11]*r;for(const e of t){const t=[],r=[];for(const i of e){const e=i.x,a=i.y,y=n[0]*e+n[4]*a+n[12],m=n[1]*e+n[5]*a+n[13],g=n[2]*e+n[6]*a+n[14],x=n[3]*e+n[7]*a+n[15],v=g+u,b=x+c,w=y+h,_=m+p,A=g+f,S=x+d,k=new s((y+o)/b,(m+l)/b);k.z=v/b,t.push(k);const M=new s(w/S,_/S);M.z=A/S,r.push(M);}i.push(t),a.push(r);}return [i,a]}(n,h,c,l);return function(t,e,r){let n=1/0;Za(r,e)&&(n=Tl(r,e[0]));for(let i=0;i<e.length;i++){const s=e[i],a=t[i];for(let t=0;t<s.length-1;t++){const e=s[t],i=[e,s[t+1],a[t+1],a[t],e];qa(r,i)&&(n=Math.min(n,Tl(r,i)));}}return n!==1/0&&n}(f[0],f[1],p)}}function Fl(t,e){return t.x*e.x+t.y*e.y}function Tl(t,e){if(1===t.length){let r=0;const n=e[r++];let i;for(;!i||n.equals(i);)if(i=e[r++],!i)return 1/0;for(;r<e.length;r++){const s=e[r],a=t[0],o=i.sub(n),l=s.sub(n),u=a.sub(n),c=Fl(o,o),h=Fl(o,l),p=Fl(l,l),f=Fl(u,o),d=Fl(u,l),y=c*p-h*h,m=(p*f-h*d)/y,g=(c*d-h*f)/y,x=n.z*(1-m-g)+i.z*m+s.z*g;if(isFinite(x))return x}return 1/0}{let t=1/0;for(const r of e)t=Math.min(t,r.z);return t}}const $l=ls([{name:"a_pos_normal",components:2,type:"Int16"},{name:"a_data",components:4,type:"Uint8"}],4),{members:Ll}=$l,Dl=ls([{name:"a_uv_x",components:1,type:"Float32"},{name:"a_split_index",components:1,type:"Float32"}]),{members:Ol}=Dl,jl=fl.VectorTileFeature.types,Rl=Math.cos(Math.PI/180*37.5),Ul=Math.pow(2,14)/.5;class ql{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.lineClipsArray=[],this.gradients={},this.layers.forEach((t=>{this.gradients[t.id]={};})),this.layoutVertexArray=new Hs,this.layoutVertexArray2=new Ys,this.indexArray=new na,this.programConfigurations=new Ea(t.layers,t.zoom),this.segments=new oa,this.maxLineLength=0,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id));}populate(t,e,r){this.hasPattern=nl("line",this.layers,e);const n=this.layers[0].layout.get("line-sort-key"),i=!n.isConstant(),s=[];for(const{feature:e,id:a,index:o,sourceLayerIndex:l}of t){const t=this.layers[0]._featureFilter.needGeometry,u=ja(e,t);if(!this.layers[0]._featureFilter.filter(new Ui(this.zoom),u,r))continue;const c=i?n.evaluate(u,{},r):void 0,h={id:a,properties:e.properties,type:e.type,sourceLayerIndex:l,index:o,geometry:t?u.geometry:Oa(e),patterns:{},sortKey:c};s.push(h);}i&&s.sort(((t,e)=>t.sortKey-e.sortKey));for(const n of s){const{geometry:i,index:s,sourceLayerIndex:a}=n;if(this.hasPattern){const t=il("line",this.layers,n,this.zoom,e);this.patternFeatures.push(t);}else this.addFeature(n,i,s,r,{});e.featureIndex.insert(t[s].feature,i,s,a,this.index);}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r);}addFeatures(t,e,r){for(const t of this.patternFeatures)this.addFeature(t,t.geometry,t.index,e,r);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(0!==this.layoutVertexArray2.length&&(this.layoutVertexBuffer2=t.createVertexBuffer(this.layoutVertexArray2,Ol)),this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Ll),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy());}lineFeatureClips(t){if(t.properties&&Object.prototype.hasOwnProperty.call(t.properties,"mapbox_clip_start")&&Object.prototype.hasOwnProperty.call(t.properties,"mapbox_clip_end"))return {start:+t.properties.mapbox_clip_start,end:+t.properties.mapbox_clip_end}}addFeature(t,e,r,n,i){const s=this.layers[0].layout,a=s.get("line-join").evaluate(t,{}),o=s.get("line-cap"),l=s.get("line-miter-limit"),u=s.get("line-round-limit");this.lineClips=this.lineFeatureClips(t);for(const r of e)this.addLine(r,t,a,o,l,u);this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,i,n);}addLine(t,e,r,n,i,s){if(this.distance=0,this.scaledDistance=0,this.totalDistance=0,this.lineClips){this.lineClipsArray.push(this.lineClips);for(let e=0;e<t.length-1;e++)this.totalDistance+=t[e].dist(t[e+1]);this.updateScaledDistance(),this.maxLineLength=Math.max(this.maxLineLength,this.totalDistance);}const a="Polygon"===jl[e.type];let o=t.length;for(;o>=2&&t[o-1].equals(t[o-2]);)o--;let l=0;for(;l<o-1&&t[l].equals(t[l+1]);)l++;if(o<(a?3:2))return;"bevel"===r&&(i=1.05);const u=this.overscaling<=16?15*$a/(512*this.overscaling):0,c=this.segments.prepareSegment(10*o,this.layoutVertexArray,this.indexArray);let h,p,f,d,y;this.e1=this.e2=-1,a&&(h=t[o-2],y=t[l].sub(h)._unit()._perp());for(let e=l;e<o;e++){if(f=e===o-1?a?t[l+1]:void 0:t[e+1],f&&t[e].equals(f))continue;y&&(d=y),h&&(p=h),h=t[e],y=f?f.sub(h)._unit()._perp():d,d=d||y;let m=d.add(y);0===m.x&&0===m.y||m._unit();const g=d.x*y.x+d.y*y.y,x=m.x*y.x+m.y*y.y,v=0!==x?1/x:1/0,b=2*Math.sqrt(2-2*x),w=x<Rl&&p&&f,_=d.x*y.y-d.y*y.x>0;if(w&&e>l){const t=h.dist(p);if(t>2*u){const e=h.sub(h.sub(p)._mult(u/t)._round());this.updateDistance(p,e),this.addCurrentVertex(e,d,0,0,c),p=e;}}const A=p&&f;let S=A?r:a?"butt":n;if(A&&"round"===S&&(v<s?S="miter":v<=2&&(S="fakeround")),"miter"===S&&v>i&&(S="bevel"),"bevel"===S&&(v>2&&(S="flipbevel"),v<i&&(S="miter")),p&&this.updateDistance(p,h),"miter"===S)m._mult(v),this.addCurrentVertex(h,m,0,0,c);else if("flipbevel"===S){if(v>100)m=y.mult(-1);else {const t=v*d.add(y).mag()/d.sub(y).mag();m._perp()._mult(t*(_?-1:1));}this.addCurrentVertex(h,m,0,0,c),this.addCurrentVertex(h,m.mult(-1),0,0,c);}else if("bevel"===S||"fakeround"===S){const t=-Math.sqrt(v*v-1),e=_?t:0,r=_?0:t;if(p&&this.addCurrentVertex(h,d,e,r,c),"fakeround"===S){const t=Math.round(180*b/Math.PI/20);for(let e=1;e<t;e++){let r=e/t;if(.5!==r){const t=r-.5;r+=r*t*(r-1)*((1.0904+g*(g*(3.55645-1.43519*g)-3.2452))*t*t+(.848013+g*(.215638*g-1.06021)));}const n=y.sub(d)._mult(r)._add(d)._unit()._mult(_?-1:1);this.addHalfVertex(h,n.x,n.y,!1,_,0,c);}}f&&this.addCurrentVertex(h,y,-e,-r,c);}else if("butt"===S)this.addCurrentVertex(h,m,0,0,c);else if("square"===S){const t=p?1:-1;this.addCurrentVertex(h,m,t,t,c);}else "round"===S&&(p&&(this.addCurrentVertex(h,d,0,0,c),this.addCurrentVertex(h,d,1,1,c,!0)),f&&(this.addCurrentVertex(h,y,-1,-1,c,!0),this.addCurrentVertex(h,y,0,0,c)));if(w&&e<o-1){const t=h.dist(f);if(t>2*u){const e=h.add(f.sub(h)._mult(u/t)._round());this.updateDistance(h,e),this.addCurrentVertex(e,y,0,0,c),h=e;}}}}addCurrentVertex(t,e,r,n,i,s=!1){const a=e.y*n-e.x,o=-e.y-e.x*n;this.addHalfVertex(t,e.x+e.y*r,e.y-e.x*r,s,!1,r,i),this.addHalfVertex(t,a,o,s,!0,-n,i),this.distance>Ul/2&&0===this.totalDistance&&(this.distance=0,this.updateScaledDistance(),this.addCurrentVertex(t,e,r,n,i,s));}addHalfVertex({x:t,y:e},r,n,i,s,a,o){const l=.5*(this.lineClips?this.scaledDistance*(Ul-1):this.scaledDistance);this.layoutVertexArray.emplaceBack((t<<1)+(i?1:0),(e<<1)+(s?1:0),Math.round(63*r)+128,Math.round(63*n)+128,1+(0===a?0:a<0?-1:1)|(63&l)<<2,l>>6),this.lineClips&&this.layoutVertexArray2.emplaceBack((this.scaledDistance-this.lineClips.start)/(this.lineClips.end-this.lineClips.start),this.lineClipsArray.length);const u=o.vertexLength++;this.e1>=0&&this.e2>=0&&(this.indexArray.emplaceBack(this.e1,this.e2,u),o.primitiveLength++),s?this.e2=u:this.e1=u;}updateScaledDistance(){this.scaledDistance=this.lineClips?this.lineClips.start+(this.lineClips.end-this.lineClips.start)*this.distance/this.totalDistance:this.distance;}updateDistance(t,e){this.distance+=t.dist(e),this.updateScaledDistance();}}let Nl,Zl;wi("LineBucket",ql,{omit:["layers","patternFeatures"]});var Gl={get paint(){return Zl=Zl||new rs({"line-opacity":new Wi(G.paint_line["line-opacity"]),"line-color":new Wi(G.paint_line["line-color"]),"line-translate":new Ji(G.paint_line["line-translate"]),"line-translate-anchor":new Ji(G.paint_line["line-translate-anchor"]),"line-width":new Wi(G.paint_line["line-width"]),"line-gap-width":new Wi(G.paint_line["line-gap-width"]),"line-offset":new Wi(G.paint_line["line-offset"]),"line-blur":new Wi(G.paint_line["line-blur"]),"line-dasharray":new ts(G.paint_line["line-dasharray"]),"line-pattern":new Qi(G.paint_line["line-pattern"]),"line-gradient":new es(G.paint_line["line-gradient"])})},get layout(){return Nl=Nl||new rs({"line-cap":new Ji(G.layout_line["line-cap"]),"line-join":new Wi(G.layout_line["line-join"]),"line-miter-limit":new Ji(G.layout_line["line-miter-limit"]),"line-round-limit":new Ji(G.layout_line["line-round-limit"]),"line-sort-key":new Wi(G.layout_line["line-sort-key"])})}};class Kl extends Wi{possiblyEvaluate(t,e){return e=new Ui(Math.floor(e.zoom),{now:e.now,fadeDuration:e.fadeDuration,zoomHistory:e.zoomHistory,transition:e.transition}),super.possiblyEvaluate(t,e)}evaluate(t,e,r,n){return e=g({},e,{zoom:Math.floor(e.zoom)}),super.evaluate(t,e,r,n)}}let Xl;class Hl extends is{constructor(t){super(t,Gl),this.gradientVersion=0,Xl||(Xl=new Kl(Gl.paint.properties["line-width"].specification),Xl.useIntegerZoom=!0);}_handleSpecialPaintPropertyUpdate(t){if("line-gradient"===t){const t=this.gradientExpression();this.stepInterpolant=!!function(t){return void 0!==t._styleExpression}(t)&&t._styleExpression.expression instanceof Ae,this.gradientVersion=(this.gradientVersion+1)%Number.MAX_SAFE_INTEGER;}}gradientExpression(){return this._transitionablePaint._values["line-gradient"].value.expression}recalculate(t,e){super.recalculate(t,e),this.paint._values["line-floorwidth"]=Xl.possiblyEvaluate(this._transitioningPaint._values["line-width"].value,t);}createBucket(t){return new ql(t)}queryRadius(t){const e=t,r=Yl(to("line-width",this,e),to("line-gap-width",this,e)),n=to("line-offset",this,e);return r/2+Math.abs(n)+eo(this.paint.get("line-translate"))}queryIntersectsFeature(t,e,r,n,i,a,o){const l=ro(t,this.paint.get("line-translate"),this.paint.get("line-translate-anchor"),a.angle,o),u=o/2*Yl(this.paint.get("line-width").evaluate(e,r),this.paint.get("line-gap-width").evaluate(e,r)),c=this.paint.get("line-offset").evaluate(e,r);return c&&(n=function(t,e){const r=[];for(let n=0;n<t.length;n++){const i=t[n],a=[];for(let t=0;t<i.length;t++){const r=i[t-1],n=i[t],o=i[t+1],l=0===t?new s(0,0):n.sub(r)._unit()._perp(),u=t===i.length-1?new s(0,0):o.sub(n)._unit()._perp(),c=l._add(u)._unit(),h=c.x*u.x+c.y*u.y;0!==h&&c._mult(1/h),a.push(c._mult(e)._add(n));}r.push(a);}return r}(n,c*o)),function(t,e,r){for(let n=0;n<e.length;n++){const i=e[n];if(t.length>=3)for(let e=0;e<i.length;e++)if(Wa(t,i[e]))return !0;if(Ga(t,i,r))return !0}return !1}(l,n,u)}isTileClipped(){return !0}}function Yl(t,e){return e>0?e+2*t:t}const Jl=ls([{name:"a_pos_offset",components:4,type:"Int16"},{name:"a_data",components:4,type:"Uint16"},{name:"a_pixeloffset",components:4,type:"Int16"}],4),Wl=ls([{name:"a_projected_pos",components:3,type:"Float32"}],4);ls([{name:"a_fade_opacity",components:1,type:"Uint32"}],4);const Ql=ls([{name:"a_placed",components:2,type:"Uint8"},{name:"a_shift",components:2,type:"Float32"},{name:"a_box_real",components:2,type:"Int16"}]);ls([{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Int16",name:"x1"},{type:"Int16",name:"y1"},{type:"Int16",name:"x2"},{type:"Int16",name:"y2"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"}]);const tu=ls([{name:"a_pos",components:2,type:"Int16"},{name:"a_anchor_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"}],4),eu=ls([{name:"a_pos",components:2,type:"Float32"},{name:"a_radius",components:1,type:"Float32"},{name:"a_flags",components:2,type:"Int16"}],4);function ru(t,e,r){return t.sections.forEach((t=>{t.text=function(t,e,r){const n=e.layout.get("text-transform").evaluate(r,{});return "uppercase"===n?t=t.toLocaleUpperCase():"lowercase"===n&&(t=t.toLocaleLowerCase()),Ri.applyArabicShaping&&(t=Ri.applyArabicShaping(t)),t}(t.text,e,r);})),t}ls([{name:"triangle",components:3,type:"Uint16"}]),ls([{type:"Int16",name:"anchorX"},{type:"Int16",name:"anchorY"},{type:"Uint16",name:"glyphStartIndex"},{type:"Uint16",name:"numGlyphs"},{type:"Uint32",name:"vertexStartIndex"},{type:"Uint32",name:"lineStartIndex"},{type:"Uint32",name:"lineLength"},{type:"Uint16",name:"segment"},{type:"Uint16",name:"lowerSize"},{type:"Uint16",name:"upperSize"},{type:"Float32",name:"lineOffsetX"},{type:"Float32",name:"lineOffsetY"},{type:"Uint8",name:"writingMode"},{type:"Uint8",name:"placedOrientation"},{type:"Uint8",name:"hidden"},{type:"Uint32",name:"crossTileID"},{type:"Int16",name:"associatedIconIndex"}]),ls([{type:"Int16",name:"anchorX"},{type:"Int16",name:"anchorY"},{type:"Int16",name:"rightJustifiedTextSymbolIndex"},{type:"Int16",name:"centerJustifiedTextSymbolIndex"},{type:"Int16",name:"leftJustifiedTextSymbolIndex"},{type:"Int16",name:"verticalPlacedTextSymbolIndex"},{type:"Int16",name:"placedIconSymbolIndex"},{type:"Int16",name:"verticalPlacedIconSymbolIndex"},{type:"Uint16",name:"key"},{type:"Uint16",name:"textBoxStartIndex"},{type:"Uint16",name:"textBoxEndIndex"},{type:"Uint16",name:"verticalTextBoxStartIndex"},{type:"Uint16",name:"verticalTextBoxEndIndex"},{type:"Uint16",name:"iconBoxStartIndex"},{type:"Uint16",name:"iconBoxEndIndex"},{type:"Uint16",name:"verticalIconBoxStartIndex"},{type:"Uint16",name:"verticalIconBoxEndIndex"},{type:"Uint16",name:"featureIndex"},{type:"Uint16",name:"numHorizontalGlyphVertices"},{type:"Uint16",name:"numVerticalGlyphVertices"},{type:"Uint16",name:"numIconVertices"},{type:"Uint16",name:"numVerticalIconVertices"},{type:"Uint16",name:"useRuntimeCollisionCircles"},{type:"Uint32",name:"crossTileID"},{type:"Float32",name:"textBoxScale"},{type:"Float32",name:"collisionCircleDiameter"},{type:"Uint16",name:"textAnchorOffsetStartIndex"},{type:"Uint16",name:"textAnchorOffsetEndIndex"}]),ls([{type:"Float32",name:"offsetX"}]),ls([{type:"Int16",name:"x"},{type:"Int16",name:"y"},{type:"Int16",name:"tileUnitDistanceFromAnchor"}]),ls([{type:"Uint16",name:"textAnchor"},{type:"Float32",components:2,name:"textOffset"}]);const nu={"!":"︕","#":"",$:"","%":"","&":"","(":"︵",")":"︶","*":"","+":"",",":"︐","-":"︲",".":"・","/":"",":":"︓",";":"︔","<":"︿","=":"",">":"﹀","?":"︖","@":"","[":"﹇","\\":"","]":"﹈","^":"",_:"︳","`":"","{":"︷","|":"―","}":"︸","~":"","¢":"¢","£":"£","¥":"¥","¦":"¦","¬":"¬","¯":" ̄","":"︲","—":"︱","":"﹃","":"﹄","“":"﹁","”":"﹂","…":"︙","‧":"・","₩":"₩","、":"︑","。":"︒","〈":"︿","〉":"﹀","《":"︽","》":"︾","「":"﹁","」":"﹂","『":"﹃","』":"﹄","【":"︻","】":"︼","":"︹","":"︺","〖":"︗","〗":"︘","":"︕","":"︵","":"︶","":"︐","":"︲","":"・","":"︓","":"︔","":"︿","":"﹀","":"︖","":"﹇","":"﹈","_":"︳","":"︷","":"―","":"︸","⦅":"︵","⦆":"︶","。":"︒","「":"﹁","」":"﹂"};var iu=24,su=lu,au=function(t,e,r,n,i){var s,a,o=8*i-n-1,l=(1<<o)-1,u=l>>1,c=-7,h=r?i-1:0,p=r?-1:1,f=t[e+h];for(h+=p,s=f&(1<<-c)-1,f>>=-c,c+=o;c>0;s=256*s+t[e+h],h+=p,c-=8);for(a=s&(1<<-c)-1,s>>=-c,c+=n;c>0;a=256*a+t[e+h],h+=p,c-=8);if(0===s)s=1-u;else {if(s===l)return a?NaN:1/0*(f?-1:1);a+=Math.pow(2,n),s-=u;}return (f?-1:1)*a*Math.pow(2,s-n)},ou=function(t,e,r,n,i,s){var a,o,l,u=8*s-i-1,c=(1<<u)-1,h=c>>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:s-1,d=n?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(o=isNaN(e)?1:0,a=c):(a=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-a))<1&&(a--,l*=2),(e+=a+h>=1?p/l:p*Math.pow(2,1-h))*l>=2&&(a++,l/=2),a+h>=c?(o=0,a=c):a+h>=1?(o=(e*l-1)*Math.pow(2,i),a+=h):(o=e*Math.pow(2,h-1)*Math.pow(2,i),a=0));i>=8;t[r+f]=255&o,f+=d,o/=256,i-=8);for(a=a<<i|o,u+=i;u>0;t[r+f]=255&a,f+=d,a/=256,u-=8);t[r+f-d]|=128*y;};function lu(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length;}lu.Varint=0,lu.Fixed64=1,lu.Bytes=2,lu.Fixed32=5;var uu=4294967296,cu=1/uu,hu="undefined"==typeof TextDecoder?null:new TextDecoder("utf-8");function pu(t){return t.type===lu.Bytes?t.readVarint()+t.pos:t.pos+1}function fu(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function du(t,e,r){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=t;i--)r.buf[i+n]=r.buf[i];}function yu(t,e){for(var r=0;r<t.length;r++)e.writeVarint(t[r]);}function mu(t,e){for(var r=0;r<t.length;r++)e.writeSVarint(t[r]);}function gu(t,e){for(var r=0;r<t.length;r++)e.writeFloat(t[r]);}function xu(t,e){for(var r=0;r<t.length;r++)e.writeDouble(t[r]);}function vu(t,e){for(var r=0;r<t.length;r++)e.writeBoolean(t[r]);}function bu(t,e){for(var r=0;r<t.length;r++)e.writeFixed32(t[r]);}function wu(t,e){for(var r=0;r<t.length;r++)e.writeSFixed32(t[r]);}function _u(t,e){for(var r=0;r<t.length;r++)e.writeFixed64(t[r]);}function Au(t,e){for(var r=0;r<t.length;r++)e.writeSFixed64(t[r]);}function Su(t,e){return (t[e]|t[e+1]<<8|t[e+2]<<16)+16777216*t[e+3]}function ku(t,e,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24;}function Mu(t,e){return (t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}lu.prototype={destroy:function(){this.buf=null;},readFields:function(t,e,r){for(r=r||this.length;this.pos<r;){var n=this.readVarint(),i=n>>3,s=this.pos;this.type=7&n,t(i,e,this),this.pos===s&&this.skip(n);}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=Su(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=Mu(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=Su(this.buf,this.pos)+Su(this.buf,this.pos+4)*uu;return this.pos+=8,t},readSFixed64:function(){var t=Su(this.buf,this.pos)+Mu(this.buf,this.pos+4)*uu;return this.pos+=8,t},readFloat:function(){var t=au(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=au(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,n=this.buf;return e=127&(r=n[this.pos++]),r<128?e:(e|=(127&(r=n[this.pos++]))<<7,r<128?e:(e|=(127&(r=n[this.pos++]))<<14,r<128?e:(e|=(127&(r=n[this.pos++]))<<21,r<128?e:function(t,e,r){var n,i,s=r.buf;if(n=(112&(i=s[r.pos++]))>>4,i<128)return fu(t,n,e);if(n|=(127&(i=s[r.pos++]))<<3,i<128)return fu(t,n,e);if(n|=(127&(i=s[r.pos++]))<<10,i<128)return fu(t,n,e);if(n|=(127&(i=s[r.pos++]))<<17,i<128)return fu(t,n,e);if(n|=(127&(i=s[r.pos++]))<<24,i<128)return fu(t,n,e);if(n|=(1&(i=s[r.pos++]))<<31,i<128)return fu(t,n,e);throw new Error("Expected varint not more than 10 bytes")}(e|=(15&(r=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.pos;return this.pos=t,t-e>=12&&hu?function(t,e,r){return hu.decode(t.subarray(e,r))}(this.buf,e,t):function(t,e,r){for(var n="",i=e;i<r;){var s,a,o,l=t[i],u=null,c=l>239?4:l>223?3:l>191?2:1;if(i+c>r)break;1===c?l<128&&(u=l):2===c?128==(192&(s=t[i+1]))&&(u=(31&l)<<6|63&s)<=127&&(u=null):3===c?(a=t[i+2],128==(192&(s=t[i+1]))&&128==(192&a)&&((u=(15&l)<<12|(63&s)<<6|63&a)<=2047||u>=55296&&u<=57343)&&(u=null)):4===c&&(a=t[i+2],o=t[i+3],128==(192&(s=t[i+1]))&&128==(192&a)&&128==(192&o)&&((u=(15&l)<<18|(63&s)<<12|(63&a)<<6|63&o)<=65535||u>=1114112)&&(u=null)),null===u?(u=65533,c=1):u>65535&&(u-=65536,n+=String.fromCharCode(u>>>10&1023|55296),u=56320|1023&u),n+=String.fromCharCode(u),i+=c;}return n}(this.buf,e,t)},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==lu.Bytes)return t.push(this.readVarint(e));var r=pu(this);for(t=t||[];this.pos<r;)t.push(this.readVarint(e));return t},readPackedSVarint:function(t){if(this.type!==lu.Bytes)return t.push(this.readSVarint());var e=pu(this);for(t=t||[];this.pos<e;)t.push(this.readSVarint());return t},readPackedBoolean:function(t){if(this.type!==lu.Bytes)return t.push(this.readBoolean());var e=pu(this);for(t=t||[];this.pos<e;)t.push(this.readBoolean());return t},readPackedFloat:function(t){if(this.type!==lu.Bytes)return t.push(this.readFloat());var e=pu(this);for(t=t||[];this.pos<e;)t.push(this.readFloat());return t},readPackedDouble:function(t){if(this.type!==lu.Bytes)return t.push(this.readDouble());var e=pu(this);for(t=t||[];this.pos<e;)t.push(this.readDouble());return t},readPackedFixed32:function(t){if(this.type!==lu.Bytes)return t.push(this.readFixed32());var e=pu(this);for(t=t||[];this.pos<e;)t.push(this.readFixed32());return t},readPackedSFixed32:function(t){if(this.type!==lu.Bytes)return t.push(this.readSFixed32());var e=pu(this);for(t=t||[];this.pos<e;)t.push(this.readSFixed32());return t},readPackedFixed64:function(t){if(this.type!==lu.Bytes)return t.push(this.readFixed64());var e=pu(this);for(t=t||[];this.pos<e;)t.push(this.readFixed64());return t},readPackedSFixed64:function(t){if(this.type!==lu.Bytes)return t.push(this.readSFixed64());var e=pu(this);for(t=t||[];this.pos<e;)t.push(this.readSFixed64());return t},skip:function(t){var e=7&t;if(e===lu.Varint)for(;this.buf[this.pos++]>127;);else if(e===lu.Bytes)this.pos=this.readVarint()+this.pos;else if(e===lu.Fixed32)this.pos+=4;else {if(e!==lu.Fixed64)throw new Error("Unimplemented type: "+e);this.pos+=8;}},writeTag:function(t,e){this.writeVarint(t<<3|e);},realloc:function(t){for(var e=this.length||16;e<this.pos+t;)e*=2;if(e!==this.length){var r=new Uint8Array(e);r.set(this.buf),this.buf=r,this.length=e;}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)},writeFixed32:function(t){this.realloc(4),ku(this.buf,t,this.pos),this.pos+=4;},writeSFixed32:function(t){this.realloc(4),ku(this.buf,t,this.pos),this.pos+=4;},writeFixed64:function(t){this.realloc(8),ku(this.buf,-1&t,this.pos),ku(this.buf,Math.floor(t*cu),this.pos+4),this.pos+=8;},writeSFixed64:function(t){this.realloc(8),ku(this.buf,-1&t,this.pos),ku(this.buf,Math.floor(t*cu),this.pos+4),this.pos+=8;},writeVarint:function(t){(t=+t||0)>268435455||t<0?function(t,e){var r,n;if(t>=0?(r=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,n=n+1|0)),t>=0x10000000000000000||t<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,r.buf[r.pos]=127&(t>>>=7);}(r,0,e),function(t,e){var r=(7&t)<<4;e.buf[e.pos++]|=r|((t>>>=3)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t)))));}(n,e);}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))));},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t);},writeBoolean:function(t){this.writeVarint(Boolean(t));},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var n,i,s=0;s<e.length;s++){if((n=e.charCodeAt(s))>55295&&n<57344){if(!i){n>56319||s+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):i=n;continue}if(n<56320){t[r++]=239,t[r++]=191,t[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null;}else i&&(t[r++]=239,t[r++]=191,t[r++]=189,i=null);n<128?t[r++]=n:(n<2048?t[r++]=n>>6|192:(n<65536?t[r++]=n>>12|224:(t[r++]=n>>18|240,t[r++]=n>>12&63|128),t[r++]=n>>6&63|128),t[r++]=63&n|128);}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&du(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r;},writeFloat:function(t){this.realloc(4),ou(this.buf,t,this.pos,!0,23,4),this.pos+=4;},writeDouble:function(t){this.realloc(8),ou(this.buf,t,this.pos,!0,52,8),this.pos+=8;},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r<e;r++)this.buf[this.pos++]=t[r];},writeRawMessage:function(t,e){this.pos++;var r=this.pos;t(e,this);var n=this.pos-r;n>=128&&du(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n;},writeMessage:function(t,e,r){this.writeTag(t,lu.Bytes),this.writeRawMessage(e,r);},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,yu,e);},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,mu,e);},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,vu,e);},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,gu,e);},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,xu,e);},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,bu,e);},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,wu,e);},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,_u,e);},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,Au,e);},writeBytesField:function(t,e){this.writeTag(t,lu.Bytes),this.writeBytes(e);},writeFixed32Field:function(t,e){this.writeTag(t,lu.Fixed32),this.writeFixed32(e);},writeSFixed32Field:function(t,e){this.writeTag(t,lu.Fixed32),this.writeSFixed32(e);},writeFixed64Field:function(t,e){this.writeTag(t,lu.Fixed64),this.writeFixed64(e);},writeSFixed64Field:function(t,e){this.writeTag(t,lu.Fixed64),this.writeSFixed64(e);},writeVarintField:function(t,e){this.writeTag(t,lu.Varint),this.writeVarint(e);},writeSVarintField:function(t,e){this.writeTag(t,lu.Varint),this.writeSVarint(e);},writeStringField:function(t,e){this.writeTag(t,lu.Bytes),this.writeString(e);},writeFloatField:function(t,e){this.writeTag(t,lu.Fixed32),this.writeFloat(e);},writeDoubleField:function(t,e){this.writeTag(t,lu.Fixed64),this.writeDouble(e);},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e));}};var Iu=r(su);const zu=3;function Pu(t,e,r){1===t&&r.readMessage(Cu,e);}function Cu(t,e,r){if(3===t){const{id:t,bitmap:n,width:i,height:s,left:a,top:o,advance:l}=r.readMessage(Bu,{});e.push({id:t,bitmap:new _o({width:i+2*zu,height:s+2*zu},n),metrics:{width:i,height:s,left:a,top:o,advance:l}});}}function Bu(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint());}const Vu=zu;function Eu(t){let e=0,r=0;for(const n of t)e+=n.w*n.h,r=Math.max(r,n.w);t.sort(((t,e)=>e.h-t.h));const n=[{x:0,y:0,w:Math.max(Math.ceil(Math.sqrt(e/.95)),r),h:1/0}];let i=0,s=0;for(const e of t)for(let t=n.length-1;t>=0;t--){const r=n[t];if(!(e.w>r.w||e.h>r.h)){if(e.x=r.x,e.y=r.y,s=Math.max(s,e.y+e.h),i=Math.max(i,e.x+e.w),e.w===r.w&&e.h===r.h){const e=n.pop();t<n.length&&(n[t]=e);}else e.h===r.h?(r.x+=e.w,r.w-=e.w):e.w===r.w?(r.y+=e.h,r.h-=e.h):(n.push({x:r.x+e.w,y:r.y,w:r.w-e.w,h:e.h}),r.y+=e.h,r.h-=e.h);break}}return {w:i,h:s,fill:e/(i*s)||0}}const Fu=1;class Tu{constructor(t,{pixelRatio:e,version:r,stretchX:n,stretchY:i,content:s,textFitWidth:a,textFitHeight:o}){this.paddedRect=t,this.pixelRatio=e,this.stretchX=n,this.stretchY=i,this.content=s,this.version=r,this.textFitWidth=a,this.textFitHeight=o;}get tl(){return [this.paddedRect.x+Fu,this.paddedRect.y+Fu]}get br(){return [this.paddedRect.x+this.paddedRect.w-Fu,this.paddedRect.y+this.paddedRect.h-Fu]}get tlbr(){return this.tl.concat(this.br)}get displaySize(){return [(this.paddedRect.w-2*Fu)/this.pixelRatio,(this.paddedRect.h-2*Fu)/this.pixelRatio]}}class $u{constructor(t,e){const r={},n={};this.haveRenderCallbacks=[];const i=[];this.addImages(t,r,i),this.addImages(e,n,i);const{w:s,h:a}=Eu(i),o=new Ao({width:s||1,height:a||1});for(const e in t){const n=t[e],i=r[e].paddedRect;Ao.copy(n.data,o,{x:0,y:0},{x:i.x+Fu,y:i.y+Fu},n.data);}for(const t in e){const r=e[t],i=n[t].paddedRect,s=i.x+Fu,a=i.y+Fu,l=r.data.width,u=r.data.height;Ao.copy(r.data,o,{x:0,y:0},{x:s,y:a},r.data),Ao.copy(r.data,o,{x:0,y:u-1},{x:s,y:a-1},{width:l,height:1}),Ao.copy(r.data,o,{x:0,y:0},{x:s,y:a+u},{width:l,height:1}),Ao.copy(r.data,o,{x:l-1,y:0},{x:s-1,y:a},{width:1,height:u}),Ao.copy(r.data,o,{x:0,y:0},{x:s+l,y:a},{width:1,height:u});}this.image=o,this.iconPositions=r,this.patternPositions=n;}addImages(t,e,r){for(const n in t){const i=t[n],s={x:0,y:0,w:i.data.width+2*Fu,h:i.data.height+2*Fu};r.push(s),e[n]=new Tu(s,i),i.hasRenderCallback&&this.haveRenderCallbacks.push(n);}}patchUpdatedImages(t,e){t.dispatchRenderCallbacks(this.haveRenderCallbacks);for(const r in t.updatedImages)this.patchUpdatedImage(this.iconPositions[r],t.getImage(r),e),this.patchUpdatedImage(this.patternPositions[r],t.getImage(r),e);}patchUpdatedImage(t,e,r){if(!t||!e)return;if(t.version===e.version)return;t.version=e.version;const[n,i]=t.tl;r.update(e.data,void 0,{x:n,y:i});}}var Lu;wi("ImagePosition",Tu),wi("ImageAtlas",$u),t.ah=void 0,(Lu=t.ah||(t.ah={}))[Lu.none=0]="none",Lu[Lu.horizontal=1]="horizontal",Lu[Lu.vertical=2]="vertical",Lu[Lu.horizontalOnly=3]="horizontalOnly";const Du=-17;class Ou{constructor(){this.scale=1,this.fontStack="",this.imageName=null;}static forText(t,e){const r=new Ou;return r.scale=t||1,r.fontStack=e,r}static forImage(t){const e=new Ou;return e.imageName=t,e}}class ju{constructor(){this.text="",this.sectionIndex=[],this.sections=[],this.imageSectionID=null;}static fromFeature(t,e){const r=new ju;for(let n=0;n<t.sections.length;n++){const i=t.sections[n];i.image?r.addImageSection(i):r.addTextSection(i,e);}return r}length(){return this.text.length}getSection(t){return this.sections[this.sectionIndex[t]]}getSectionIndex(t){return this.sectionIndex[t]}getCharCode(t){return this.text.charCodeAt(t)}verticalizePunctuation(){this.text=function(t){let e="";for(let r=0;r<t.length;r++){const n=t.charCodeAt(r+1)||null,i=t.charCodeAt(r-1)||null;e+=n&&$i(n)&&!nu[t[r+1]]||i&&$i(i)&&!nu[t[r-1]]||!nu[t[r]]?t[r]:nu[t[r]];}return e}(this.text);}trim(){let t=0;for(let e=0;e<this.text.length&&Uu[this.text.charCodeAt(e)];e++)t++;let e=this.text.length;for(let r=this.text.length-1;r>=0&&r>=t&&Uu[this.text.charCodeAt(r)];r--)e--;this.text=this.text.substring(t,e),this.sectionIndex=this.sectionIndex.slice(t,e);}substring(t,e){const r=new ju;return r.text=this.text.substring(t,e),r.sectionIndex=this.sectionIndex.slice(t,e),r.sections=this.sections,r}toString(){return this.text}getMaxScale(){return this.sectionIndex.reduce(((t,e)=>Math.max(t,this.sections[e].scale)),0)}addTextSection(t,e){this.text+=t.text,this.sections.push(Ou.forText(t.scale,t.fontStack||e));const r=this.sections.length-1;for(let e=0;e<t.text.length;++e)this.sectionIndex.push(r);}addImageSection(t){const e=t.image?t.image.name:"";if(0===e.length)return void A("Can't add FormattedSection with an empty image.");const r=this.getNextImageSectionCharCode();r?(this.text+=String.fromCharCode(r),this.sections.push(Ou.forImage(e)),this.sectionIndex.push(this.sections.length-1)):A("Reached maximum number of images 6401");}getNextImageSectionCharCode(){return this.imageSectionID?this.imageSectionID>=63743?null:++this.imageSectionID:(this.imageSectionID=57344,this.imageSectionID)}}function Ru(e,r,n,i,s,a,o,l,u,c,h,p,f,d,y){const m=ju.fromFeature(e,s);let g;p===t.ah.vertical&&m.verticalizePunctuation();const{processBidirectionalText:x,processStyledBidirectionalText:v}=Ri;if(x&&1===m.sections.length){g=[];const t=x(m.toString(),Yu(m,c,a,r,i,d));for(const e of t){const t=new ju;t.text=e,t.sections=m.sections;for(let r=0;r<e.length;r++)t.sectionIndex.push(0);g.push(t);}}else if(v){g=[];const t=v(m.text,m.sectionIndex,Yu(m,c,a,r,i,d));for(const e of t){const t=new ju;t.text=e[0],t.sectionIndex=e[1],t.sections=m.sections,g.push(t);}}else g=function(t,e){const r=[],n=t.text;let i=0;for(const n of e)r.push(t.substring(i,n)),i=n;return i<n.length&&r.push(t.substring(i,n.length)),r}(m,Yu(m,c,a,r,i,d));const b=[],w={positionedLines:b,text:m.toString(),top:h[1],bottom:h[1],left:h[0],right:h[0],writingMode:p,iconsInText:!1,verticalizable:!1};return function(e,r,n,i,s,a,o,l,u,c,h,p){let f=0,d=Du,y=0,m=0;const g="right"===l?1:"left"===l?0:.5;let x=0;for(const o of s){o.trim();const s=o.getMaxScale(),l=(s-1)*iu,b={positionedGlyphs:[],lineOffset:0};e.positionedLines[x]=b;const w=b.positionedGlyphs;let _=0;if(!o.length()){d+=a,++x;continue}for(let a=0;a<o.length();a++){const y=o.getSection(a),m=o.getSectionIndex(a),g=o.getCharCode(a);let x=0,b=null,A=null,S=null,k=iu;const M=!(u===t.ah.horizontal||!h&&!Ti(g)||h&&(Uu[g]||(v=g,/\p{sc=Arab}/u.test(String.fromCodePoint(v)))));if(y.imageName){const t=i[y.imageName];if(!t)continue;S=y.imageName,e.iconsInText=e.iconsInText||!0,A=t.paddedRect;const r=t.displaySize;y.scale=y.scale*iu/p,b={width:r[0],height:r[1],left:Fu,top:-Vu,advance:M?r[1]:r[0]},x=l+(iu-r[1]*y.scale),k=b.advance;const n=M?r[0]*y.scale-iu*s:r[1]*y.scale-iu*s;n>0&&n>_&&(_=n);}else {const t=n[y.fontStack],e=t&&t[g];if(e&&e.rect)A=e.rect,b=e.metrics;else {const t=r[y.fontStack],e=t&&t[g];if(!e)continue;b=e.metrics;}x=(s-y.scale)*iu;}M?(e.verticalizable=!0,w.push({glyph:g,imageName:S,x:f,y:d+x,vertical:M,scale:y.scale,fontStack:y.fontStack,sectionIndex:m,metrics:b,rect:A}),f+=k*y.scale+c):(w.push({glyph:g,imageName:S,x:f,y:d+x,vertical:M,scale:y.scale,fontStack:y.fontStack,sectionIndex:m,metrics:b,rect:A}),f+=b.advance*y.scale+c);}0!==w.length&&(y=Math.max(f-c,y),Wu(w,0,w.length-1,g,_)),f=0;const A=a*s+_;b.lineOffset=Math.max(_,l),d+=A,m=Math.max(A,m),++x;}var v;const b=d-Du,{horizontalAlign:w,verticalAlign:_}=Ju(o);((function(t,e,r,n,i,s,a,o,l){const u=(e-r)*i;let c=0;c=s!==a?-o*n-Du:(-n*l+.5)*a;for(const e of t)for(const t of e.positionedGlyphs)t.x+=u,t.y+=c;}))(e.positionedLines,g,w,_,y,m,a,b,s.length),e.top+=-_*b,e.bottom=e.top+b,e.left+=-w*y,e.right=e.left+y;}(w,r,n,i,g,o,l,u,p,c,f,y),!function(t){for(const e of t)if(0!==e.positionedGlyphs.length)return !1;return !0}(b)&&w}const Uu={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},qu={10:!0,32:!0,38:!0,41:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0,8231:!0},Nu={40:!0};function Zu(t,e,r,n,i,s){if(e.imageName){const t=n[e.imageName];return t?t.displaySize[0]*e.scale*iu/s+i:0}{const n=r[e.fontStack],s=n&&n[t];return s?s.metrics.advance*e.scale+i:0}}function Gu(t,e,r,n){const i=Math.pow(t-e,2);return n?t<e?i/2:2*i:i+Math.abs(r)*r}function Ku(t,e,r){let n=0;return 10===t&&(n-=1e4),r&&(n+=150),40!==t&&65288!==t||(n+=50),41!==e&&65289!==e||(n+=50),n}function Xu(t,e,r,n,i,s){let a=null,o=Gu(e,r,i,s);for(const t of n){const n=Gu(e-t.x,r,i,s)+t.badness;n<=o&&(a=t,o=n);}return {index:t,x:e,priorBreak:a,badness:o}}function Hu(t){return t?Hu(t.priorBreak).concat(t.index):[]}function Yu(t,e,r,n,i,s){if(!t)return [];const a=[],o=function(t,e,r,n,i,s){let a=0;for(let r=0;r<t.length();r++){const o=t.getSection(r);a+=Zu(t.getCharCode(r),o,n,i,e,s);}return a/Math.max(1,Math.ceil(a/r))}(t,e,r,n,i,s),l=t.text.indexOf("")>=0;let u=0;for(let r=0;r<t.length();r++){const h=t.getSection(r),p=t.getCharCode(r);if(Uu[p]||(u+=Zu(p,h,n,i,e,s)),r<t.length()-1){const e=!((c=p)<11904)&&(!!zi["CJK Compatibility Forms"](c)||!!zi["CJK Compatibility"](c)||!!zi["CJK Strokes"](c)||!!zi["CJK Symbols and Punctuation"](c)||!!zi["Enclosed CJK Letters and Months"](c)||!!zi["Halfwidth and Fullwidth Forms"](c)||!!zi["Ideographic Description Characters"](c)||!!zi["Vertical Forms"](c)||Fi.test(String.fromCodePoint(c)));(qu[p]||e||h.imageName||r!==t.length()-2&&Nu[t.getCharCode(r+1)])&&a.push(Xu(r+1,u,o,a,Ku(p,t.getCharCode(r+1),e&&l),!1));}}var c;return Hu(Xu(t.length(),u,o,a,0,!0))}function Ju(t){let e=.5,r=.5;switch(t){case"right":case"top-right":case"bottom-right":e=1;break;case"left":case"top-left":case"bottom-left":e=0;}switch(t){case"bottom":case"bottom-right":case"bottom-left":r=1;break;case"top":case"top-right":case"top-left":r=0;}return {horizontalAlign:e,verticalAlign:r}}function Wu(t,e,r,n,i){if(!n&&!i)return;const s=t[r],a=(t[r].x+s.metrics.advance*s.scale)*n;for(let n=e;n<=r;n++)t[n].x-=a,t[n].y+=i;}function Qu(t,e,r){const{horizontalAlign:n,verticalAlign:i}=Ju(r),s=e[0]-t.displaySize[0]*n,a=e[1]-t.displaySize[1]*i;return {image:t,top:a,bottom:a+t.displaySize[1],left:s,right:s+t.displaySize[0]}}function tc(t){var e,r;let n=t.left,i=t.top,s=t.right-n,a=t.bottom-i;const o=null!==(e=t.image.textFitWidth)&&void 0!==e?e:"stretchOrShrink",l=null!==(r=t.image.textFitHeight)&&void 0!==r?r:"stretchOrShrink",u=(t.image.content[2]-t.image.content[0])/(t.image.content[3]-t.image.content[1]);if("proportional"===l){if("stretchOnly"===o&&s/a<u||"proportional"===o){const t=Math.ceil(a*u);n*=t/s,s=t;}}else if("proportional"===o&&"stretchOnly"===l&&0!==u&&s/a>u){const t=Math.ceil(s/u);i*=t/a,a=t;}return {x1:n,y1:i,x2:n+s,y2:i+a}}function ec(t,e,r,n,i,s){const a=t.image;let o;if(a.content){const t=a.content,e=a.pixelRatio||1;o=[t[0]/e,t[1]/e,a.displaySize[0]-t[2]/e,a.displaySize[1]-t[3]/e];}const l=e.left*s,u=e.right*s;let c,h,p,f;"width"===r||"both"===r?(f=i[0]+l-n[3],h=i[0]+u+n[1]):(f=i[0]+(l+u-a.displaySize[0])/2,h=f+a.displaySize[0]);const d=e.top*s,y=e.bottom*s;return "height"===r||"both"===r?(c=i[1]+d-n[0],p=i[1]+y+n[2]):(c=i[1]+(d+y-a.displaySize[1])/2,p=c+a.displaySize[1]),{image:a,top:c,right:h,bottom:p,left:f,collisionPadding:o}}const rc=255,nc=128,ic=rc*nc;function sc(t,e){const{expression:r}=e;if("constant"===r.kind)return {kind:"constant",layoutSize:r.evaluate(new Ui(t+1))};if("source"===r.kind)return {kind:"source"};{const{zoomStops:e,interpolationType:n}=r;let i=0;for(;i<e.length&&e[i]<=t;)i++;i=Math.max(0,i-1);let s=i;for(;s<e.length&&e[s]<t+1;)s++;s=Math.min(e.length-1,s);const a=e[i],o=e[s];return "composite"===r.kind?{kind:"composite",minZoom:a,maxZoom:o,interpolationType:n}:{kind:"camera",minZoom:a,maxZoom:o,minSize:r.evaluate(new Ui(a)),maxSize:r.evaluate(new Ui(o)),interpolationType:n}}}function ac(t,e,r){let n="never";const i=t.get(e);return i?n=i:t.get(r)&&(n="always"),n}const oc=fl.VectorTileFeature.types,lc=[{name:"a_fade_opacity",components:1,type:"Uint8",offset:0}];function uc(t,e,r,n,i,s,a,o,l,u,c,h,p){const f=o?Math.min(ic,Math.round(o[0])):0,d=o?Math.min(ic,Math.round(o[1])):0;t.emplaceBack(e,r,Math.round(32*n),Math.round(32*i),s,a,(f<<1)+(l?1:0),d,16*u,16*c,256*h,256*p);}function cc(t,e,r){t.emplaceBack(e.x,e.y,r),t.emplaceBack(e.x,e.y,r),t.emplaceBack(e.x,e.y,r),t.emplaceBack(e.x,e.y,r);}function hc(t){for(const e of t.sections)if(ji(e.text))return !0;return !1}class pc{constructor(t){this.layoutVertexArray=new Ws,this.indexArray=new na,this.programConfigurations=t,this.segments=new oa,this.dynamicLayoutVertexArray=new Qs,this.opacityVertexArray=new ta,this.hasVisibleVertices=!1,this.placedSymbolArray=new $s;}isEmpty(){return 0===this.layoutVertexArray.length&&0===this.indexArray.length&&0===this.dynamicLayoutVertexArray.length&&0===this.opacityVertexArray.length}upload(t,e,r,n){this.isEmpty()||(r&&(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Jl.members),this.indexBuffer=t.createIndexBuffer(this.indexArray,e),this.dynamicLayoutVertexBuffer=t.createVertexBuffer(this.dynamicLayoutVertexArray,Wl.members,!0),this.opacityVertexBuffer=t.createVertexBuffer(this.opacityVertexArray,lc,!0),this.opacityVertexBuffer.itemSize=1),(r||n)&&this.programConfigurations.upload(t));}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.dynamicLayoutVertexBuffer.destroy(),this.opacityVertexBuffer.destroy());}}wi("SymbolBuffers",pc);class fc{constructor(t,e,r){this.layoutVertexArray=new t,this.layoutAttributes=e,this.indexArray=new r,this.segments=new oa,this.collisionVertexArray=new ra;}upload(t){this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,this.layoutAttributes),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.collisionVertexBuffer=t.createVertexBuffer(this.collisionVertexArray,Ql.members,!0);}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.segments.destroy(),this.collisionVertexBuffer.destroy());}}wi("CollisionBuffers",fc);class dc{constructor(e){this.collisionBoxArray=e.collisionBoxArray,this.zoom=e.zoom,this.overscaling=e.overscaling,this.layers=e.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=e.index,this.pixelRatio=e.pixelRatio,this.sourceLayerIndex=e.sourceLayerIndex,this.hasPattern=!1,this.hasRTLText=!1,this.sortKeyRanges=[],this.collisionCircleArray=[],this.placementInvProjMatrix=lo([]),this.placementViewportMatrix=lo([]);const r=this.layers[0]._unevaluatedLayout._values;this.textSizeData=sc(this.zoom,r["text-size"]),this.iconSizeData=sc(this.zoom,r["icon-size"]);const n=this.layers[0].layout,i=n.get("symbol-sort-key"),s=n.get("symbol-z-order");this.canOverlap="never"!==ac(n,"text-overlap","text-allow-overlap")||"never"!==ac(n,"icon-overlap","icon-allow-overlap")||n.get("text-ignore-placement")||n.get("icon-ignore-placement"),this.sortFeaturesByKey="viewport-y"!==s&&!i.isConstant(),this.sortFeaturesByY=("viewport-y"===s||"auto"===s&&!this.sortFeaturesByKey)&&this.canOverlap,"point"===n.get("symbol-placement")&&(this.writingModes=n.get("text-writing-mode").map((e=>t.ah[e]))),this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id)),this.sourceID=e.sourceID;}createArrays(){this.text=new pc(new Ea(this.layers,this.zoom,(t=>/^text/.test(t)))),this.icon=new pc(new Ea(this.layers,this.zoom,(t=>/^icon/.test(t)))),this.glyphOffsetArray=new Os,this.lineVertexArray=new js,this.symbolInstances=new Ds,this.textAnchorOffsets=new Us;}calculateGlyphDependencies(t,e,r,n,i){for(let s=0;s<t.length;s++)if(e[t.charCodeAt(s)]=!0,(r||n)&&i){const r=nu[t.charAt(s)];r&&(e[r.charCodeAt(0)]=!0);}}populate(e,r,n){const i=this.layers[0],s=i.layout,a=s.get("text-font"),o=s.get("text-field"),l=s.get("icon-image"),u=("constant"!==o.value.kind||o.value.value instanceof Yt&&!o.value.value.isEmpty()||o.value.value.toString().length>0)&&("constant"!==a.value.kind||a.value.value.length>0),c="constant"!==l.value.kind||!!l.value.value||Object.keys(l.parameters).length>0,h=s.get("symbol-sort-key");if(this.features=[],!u&&!c)return;const p=r.iconDependencies,f=r.glyphDependencies,d=r.availableImages,y=new Ui(this.zoom);for(const{feature:r,id:o,index:l,sourceLayerIndex:m}of e){const e=i._featureFilter.needGeometry,g=ja(r,e);if(!i._featureFilter.filter(y,g,n))continue;let x,v;if(e||(g.geometry=Oa(r)),u){const t=i.getValueAndResolveTokens("text-field",g,n,d),e=Yt.factory(t),r=this.hasRTLText=this.hasRTLText||hc(e);(!r||"unavailable"===Ri.getRTLTextPluginStatus()||r&&Ri.isParsed())&&(x=ru(e,i,g));}if(c){const t=i.getValueAndResolveTokens("icon-image",g,n,d);v=t instanceof te?t:te.fromString(t);}if(!x&&!v)continue;const b=this.sortFeaturesByKey?h.evaluate(g,{},n):void 0;if(this.features.push({id:o,text:x,icon:v,index:l,sourceLayerIndex:m,geometry:g.geometry,properties:r.properties,type:oc[r.type],sortKey:b}),v&&(p[v.name]=!0),x){const e=a.evaluate(g,{},n).join(","),r="viewport"!==s.get("text-rotation-alignment")&&"point"!==s.get("symbol-placement");this.allowVerticalPlacement=this.writingModes&&this.writingModes.indexOf(t.ah.vertical)>=0;for(const t of x.sections)if(t.image)p[t.image.name]=!0;else {const n=Pi(x.toString()),i=t.fontStack||e,s=f[i]=f[i]||{};this.calculateGlyphDependencies(t.text,s,r,this.allowVerticalPlacement,n);}}}"line"===s.get("symbol-placement")&&(this.features=function(t){const e={},r={},n=[];let i=0;function s(e){n.push(t[e]),i++;}function a(t,e,i){const s=r[t];return delete r[t],r[e]=s,n[s].geometry[0].pop(),n[s].geometry[0]=n[s].geometry[0].concat(i[0]),s}function o(t,r,i){const s=e[r];return delete e[r],e[t]=s,n[s].geometry[0].shift(),n[s].geometry[0]=i[0].concat(n[s].geometry[0]),s}function l(t,e,r){const n=r?e[0][e[0].length-1]:e[0][0];return `${t}:${n.x}:${n.y}`}for(let u=0;u<t.length;u++){const c=t[u],h=c.geometry,p=c.text?c.text.toString():null;if(!p){s(u);continue}const f=l(p,h),d=l(p,h,!0);if(f in r&&d in e&&r[f]!==e[d]){const t=o(f,d,h),i=a(f,d,n[t].geometry);delete e[f],delete r[d],r[l(p,n[i].geometry,!0)]=i,n[t].geometry=null;}else f in r?a(f,d,h):d in e?o(f,d,h):(s(u),e[f]=i-1,r[d]=i-1);}return n.filter((t=>t.geometry))}(this.features)),this.sortFeaturesByKey&&this.features.sort(((t,e)=>t.sortKey-e.sortKey));}update(t,e,r){this.stateDependentLayers.length&&(this.text.programConfigurations.updatePaintArrays(t,e,this.layers,r),this.icon.programConfigurations.updatePaintArrays(t,e,this.layers,r));}isEmpty(){return 0===this.symbolInstances.length&&!this.hasRTLText}uploadPending(){return !this.uploaded||this.text.programConfigurations.needsUpload||this.icon.programConfigurations.needsUpload}upload(t){!this.uploaded&&this.hasDebugData()&&(this.textCollisionBox.upload(t),this.iconCollisionBox.upload(t)),this.text.upload(t,this.sortFeaturesByY,!this.uploaded,this.text.programConfigurations.needsUpload),this.icon.upload(t,this.sortFeaturesByY,!this.uploaded,this.icon.programConfigurations.needsUpload),this.uploaded=!0;}destroyDebugData(){this.textCollisionBox.destroy(),this.iconCollisionBox.destroy();}destroy(){this.text.destroy(),this.icon.destroy(),this.hasDebugData()&&this.destroyDebugData();}addToLineVertexArray(t,e){const r=this.lineVertexArray.length;if(void 0!==t.segment){let r=t.dist(e[t.segment+1]),n=t.dist(e[t.segment]);const i={};for(let n=t.segment+1;n<e.length;n++)i[n]={x:e[n].x,y:e[n].y,tileUnitDistanceFromAnchor:r},n<e.length-1&&(r+=e[n+1].dist(e[n]));for(let r=t.segment||0;r>=0;r--)i[r]={x:e[r].x,y:e[r].y,tileUnitDistanceFromAnchor:n},r>0&&(n+=e[r-1].dist(e[r]));for(let t=0;t<e.length;t++){const e=i[t];this.lineVertexArray.emplaceBack(e.x,e.y,e.tileUnitDistanceFromAnchor);}}return {lineStartIndex:r,lineLength:this.lineVertexArray.length-r}}addSymbols(e,r,n,i,s,a,o,l,u,c,h,p){const f=e.indexArray,d=e.layoutVertexArray,y=e.segments.prepareSegment(4*r.length,d,f,this.canOverlap?a.sortKey:void 0),m=this.glyphOffsetArray.length,g=y.vertexLength,x=this.allowVerticalPlacement&&o===t.ah.vertical?Math.PI/2:0,v=a.text&&a.text.sections;for(let t=0;t<r.length;t++){const{tl:i,tr:s,bl:o,br:u,tex:c,pixelOffsetTL:h,pixelOffsetBR:m,minFontScaleX:g,minFontScaleY:b,glyphOffset:w,isSDF:_,sectionIndex:A}=r[t],S=y.vertexLength,k=w[1];uc(d,l.x,l.y,i.x,k+i.y,c.x,c.y,n,_,h.x,h.y,g,b),uc(d,l.x,l.y,s.x,k+s.y,c.x+c.w,c.y,n,_,m.x,h.y,g,b),uc(d,l.x,l.y,o.x,k+o.y,c.x,c.y+c.h,n,_,h.x,m.y,g,b),uc(d,l.x,l.y,u.x,k+u.y,c.x+c.w,c.y+c.h,n,_,m.x,m.y,g,b),cc(e.dynamicLayoutVertexArray,l,x),f.emplaceBack(S,S+1,S+2),f.emplaceBack(S+1,S+2,S+3),y.vertexLength+=4,y.primitiveLength+=2,this.glyphOffsetArray.emplaceBack(w[0]),t!==r.length-1&&A===r[t+1].sectionIndex||e.programConfigurations.populatePaintArrays(d.length,a,a.index,{},p,v&&v[A]);}e.placedSymbolArray.emplaceBack(l.x,l.y,m,this.glyphOffsetArray.length-m,g,u,c,l.segment,n?n[0]:0,n?n[1]:0,i[0],i[1],o,0,!1,0,h);}_addCollisionDebugVertex(t,e,r,n,i,s){return e.emplaceBack(0,0),t.emplaceBack(r.x,r.y,n,i,Math.round(s.x),Math.round(s.y))}addCollisionDebugVertices(t,e,r,n,i,a,o){const l=i.segments.prepareSegment(4,i.layoutVertexArray,i.indexArray),u=l.vertexLength,c=i.layoutVertexArray,h=i.collisionVertexArray,p=o.anchorX,f=o.anchorY;this._addCollisionDebugVertex(c,h,a,p,f,new s(t,e)),this._addCollisionDebugVertex(c,h,a,p,f,new s(r,e)),this._addCollisionDebugVertex(c,h,a,p,f,new s(r,n)),this._addCollisionDebugVertex(c,h,a,p,f,new s(t,n)),l.vertexLength+=4;const d=i.indexArray;d.emplaceBack(u,u+1),d.emplaceBack(u+1,u+2),d.emplaceBack(u+2,u+3),d.emplaceBack(u+3,u),l.primitiveLength+=4;}addDebugCollisionBoxes(t,e,r,n){for(let i=t;i<e;i++){const t=this.collisionBoxArray.get(i);this.addCollisionDebugVertices(t.x1,t.y1,t.x2,t.y2,n?this.textCollisionBox:this.iconCollisionBox,t.anchorPoint,r);}}generateCollisionDebugBuffers(){this.hasDebugData()&&this.destroyDebugData(),this.textCollisionBox=new fc(ea,tu.members,ia),this.iconCollisionBox=new fc(ea,tu.members,ia);for(let t=0;t<this.symbolInstances.length;t++){const e=this.symbolInstances.get(t);this.addDebugCollisionBoxes(e.textBoxStartIndex,e.textBoxEndIndex,e,!0),this.addDebugCollisionBoxes(e.verticalTextBoxStartIndex,e.verticalTextBoxEndIndex,e,!0),this.addDebugCollisionBoxes(e.iconBoxStartIndex,e.iconBoxEndIndex,e,!1),this.addDebugCollisionBoxes(e.verticalIconBoxStartIndex,e.verticalIconBoxEndIndex,e,!1);}}_deserializeCollisionBoxesForSymbol(t,e,r,n,i,s,a,o,l){const u={};for(let n=e;n<r;n++){const e=t.get(n);u.textBox={x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,anchorPointX:e.anchorPointX,anchorPointY:e.anchorPointY},u.textFeatureIndex=e.featureIndex;break}for(let e=n;e<i;e++){const r=t.get(e);u.verticalTextBox={x1:r.x1,y1:r.y1,x2:r.x2,y2:r.y2,anchorPointX:r.anchorPointX,anchorPointY:r.anchorPointY},u.verticalTextFeatureIndex=r.featureIndex;break}for(let e=s;e<a;e++){const r=t.get(e);u.iconBox={x1:r.x1,y1:r.y1,x2:r.x2,y2:r.y2,anchorPointX:r.anchorPointX,anchorPointY:r.anchorPointY},u.iconFeatureIndex=r.featureIndex;break}for(let e=o;e<l;e++){const r=t.get(e);u.verticalIconBox={x1:r.x1,y1:r.y1,x2:r.x2,y2:r.y2,anchorPointX:r.anchorPointX,anchorPointY:r.anchorPointY},u.verticalIconFeatureIndex=r.featureIndex;break}return u}deserializeCollisionBoxes(t){this.collisionArrays=[];for(let e=0;e<this.symbolInstances.length;e++){const r=this.symbolInstances.get(e);this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(t,r.textBoxStartIndex,r.textBoxEndIndex,r.verticalTextBoxStartIndex,r.verticalTextBoxEndIndex,r.iconBoxStartIndex,r.iconBoxEndIndex,r.verticalIconBoxStartIndex,r.verticalIconBoxEndIndex));}}hasTextData(){return this.text.segments.get().length>0}hasIconData(){return this.icon.segments.get().length>0}hasDebugData(){return this.textCollisionBox&&this.iconCollisionBox}hasTextCollisionBoxData(){return this.hasDebugData()&&this.textCollisionBox.segments.get().length>0}hasIconCollisionBoxData(){return this.hasDebugData()&&this.iconCollisionBox.segments.get().length>0}addIndicesForPlacedSymbol(t,e){const r=t.placedSymbolArray.get(e),n=r.vertexStartIndex+4*r.numGlyphs;for(let e=r.vertexStartIndex;e<n;e+=4)t.indexArray.emplaceBack(e,e+1,e+2),t.indexArray.emplaceBack(e+1,e+2,e+3);}getSortedSymbolIndexes(t){if(this.sortedAngle===t&&void 0!==this.symbolInstanceIndexes)return this.symbolInstanceIndexes;const e=Math.sin(t),r=Math.cos(t),n=[],i=[],s=[];for(let t=0;t<this.symbolInstances.length;++t){s.push(t);const a=this.symbolInstances.get(t);n.push(0|Math.round(e*a.anchorX+r*a.anchorY)),i.push(a.featureIndex);}return s.sort(((t,e)=>n[t]-n[e]||i[e]-i[t])),s}addToSortKeyRanges(t,e){const r=this.sortKeyRanges[this.sortKeyRanges.length-1];r&&r.sortKey===e?r.symbolInstanceEnd=t+1:this.sortKeyRanges.push({sortKey:e,symbolInstanceStart:t,symbolInstanceEnd:t+1});}sortFeatures(t){if(this.sortFeaturesByY&&this.sortedAngle!==t&&!(this.text.segments.get().length>1||this.icon.segments.get().length>1)){this.symbolInstanceIndexes=this.getSortedSymbolIndexes(t),this.sortedAngle=t,this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(const t of this.symbolInstanceIndexes){const e=this.symbolInstances.get(t);this.featureSortOrder.push(e.featureIndex),[e.rightJustifiedTextSymbolIndex,e.centerJustifiedTextSymbolIndex,e.leftJustifiedTextSymbolIndex].forEach(((t,e,r)=>{t>=0&&r.indexOf(t)===e&&this.addIndicesForPlacedSymbol(this.text,t);})),e.verticalPlacedTextSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.text,e.verticalPlacedTextSymbolIndex),e.placedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,e.placedIconSymbolIndex),e.verticalPlacedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,e.verticalPlacedIconSymbolIndex);}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray);}}}let yc,mc;wi("SymbolBucket",dc,{omit:["layers","collisionBoxArray","features","compareText"]}),dc.MAX_GLYPHS=65535,dc.addDynamicAttributes=cc;var gc={get paint(){return mc=mc||new rs({"icon-opacity":new Wi(G.paint_symbol["icon-opacity"]),"icon-color":new Wi(G.paint_symbol["icon-color"]),"icon-halo-color":new Wi(G.paint_symbol["icon-halo-color"]),"icon-halo-width":new Wi(G.paint_symbol["icon-halo-width"]),"icon-halo-blur":new Wi(G.paint_symbol["icon-halo-blur"]),"icon-translate":new Ji(G.paint_symbol["icon-translate"]),"icon-translate-anchor":new Ji(G.paint_symbol["icon-translate-anchor"]),"text-opacity":new Wi(G.paint_symbol["text-opacity"]),"text-color":new Wi(G.paint_symbol["text-color"],{runtimeType:pt,getOverride:t=>t.textColor,hasOverride:t=>!!t.textColor}),"text-halo-color":new Wi(G.paint_symbol["text-halo-color"]),"text-halo-width":new Wi(G.paint_symbol["text-halo-width"]),"text-halo-blur":new Wi(G.paint_symbol["text-halo-blur"]),"text-translate":new Ji(G.paint_symbol["text-translate"]),"text-translate-anchor":new Ji(G.paint_symbol["text-translate-anchor"])})},get layout(){return yc=yc||new rs({"symbol-placement":new Ji(G.layout_symbol["symbol-placement"]),"symbol-spacing":new Ji(G.layout_symbol["symbol-spacing"]),"symbol-avoid-edges":new Ji(G.layout_symbol["symbol-avoid-edges"]),"symbol-sort-key":new Wi(G.layout_symbol["symbol-sort-key"]),"symbol-z-order":new Ji(G.layout_symbol["symbol-z-order"]),"icon-allow-overlap":new Ji(G.layout_symbol["icon-allow-overlap"]),"icon-overlap":new Ji(G.layout_symbol["icon-overlap"]),"icon-ignore-placement":new Ji(G.layout_symbol["icon-ignore-placement"]),"icon-optional":new Ji(G.layout_symbol["icon-optional"]),"icon-rotation-alignment":new Ji(G.layout_symbol["icon-rotation-alignment"]),"icon-size":new Wi(G.layout_symbol["icon-size"]),"icon-text-fit":new Ji(G.layout_symbol["icon-text-fit"]),"icon-text-fit-padding":new Ji(G.layout_symbol["icon-text-fit-padding"]),"icon-image":new Wi(G.layout_symbol["icon-image"]),"icon-rotate":new Wi(G.layout_symbol["icon-rotate"]),"icon-padding":new Wi(G.layout_symbol["icon-padding"]),"icon-keep-upright":new Ji(G.layout_symbol["icon-keep-upright"]),"icon-offset":new Wi(G.layout_symbol["icon-offset"]),"icon-anchor":new Wi(G.layout_symbol["icon-anchor"]),"icon-pitch-alignment":new Ji(G.layout_symbol["icon-pitch-alignment"]),"text-pitch-alignment":new Ji(G.layout_symbol["text-pitch-alignment"]),"text-rotation-alignment":new Ji(G.layout_symbol["text-rotation-alignment"]),"text-field":new Wi(G.layout_symbol["text-field"]),"text-font":new Wi(G.layout_symbol["text-font"]),"text-size":new Wi(G.layout_symbol["text-size"]),"text-max-width":new Wi(G.layout_symbol["text-max-width"]),"text-line-height":new Ji(G.layout_symbol["text-line-height"]),"text-letter-spacing":new Wi(G.layout_symbol["text-letter-spacing"]),"text-justify":new Wi(G.layout_symbol["text-justify"]),"text-radial-offset":new Wi(G.layout_symbol["text-radial-offset"]),"text-variable-anchor":new Ji(G.layout_symbol["text-variable-anchor"]),"text-variable-anchor-offset":new Wi(G.layout_symbol["text-variable-anchor-offset"]),"text-anchor":new Wi(G.layout_symbol["text-anchor"]),"text-max-angle":new Ji(G.layout_symbol["text-max-angle"]),"text-writing-mode":new Ji(G.layout_symbol["text-writing-mode"]),"text-rotate":new Wi(G.layout_symbol["text-rotate"]),"text-padding":new Ji(G.layout_symbol["text-padding"]),"text-keep-upright":new Ji(G.layout_symbol["text-keep-upright"]),"text-transform":new Wi(G.layout_symbol["text-transform"]),"text-offset":new Wi(G.layout_symbol["text-offset"]),"text-allow-overlap":new Ji(G.layout_symbol["text-allow-overlap"]),"text-overlap":new Ji(G.layout_symbol["text-overlap"]),"text-ignore-placement":new Ji(G.layout_symbol["text-ignore-placement"]),"text-optional":new Ji(G.layout_symbol["text-optional"])})}};class xc{constructor(t){if(void 0===t.property.overrides)throw new Error("overrides must be provided to instantiate FormatSectionOverride class");this.type=t.property.overrides?t.property.overrides.runtimeType:lt,this.defaultValue=t;}evaluate(t){if(t.formattedSection){const e=this.defaultValue.property.overrides;if(e&&e.hasOverride(t.formattedSection))return e.getOverride(t.formattedSection)}return t.feature&&t.featureState?this.defaultValue.evaluate(t.feature,t.featureState):this.defaultValue.property.specification.default}eachChild(t){this.defaultValue.isConstant()||t(this.defaultValue.value._styleExpression.expression);}outputDefined(){return !1}serialize(){return null}}wi("FormatSectionOverride",xc,{omit:["defaultValue"]});class vc extends is{constructor(t){super(t,gc);}recalculate(t,e){if(super.recalculate(t,e),"auto"===this.layout.get("icon-rotation-alignment")&&(this.layout._values["icon-rotation-alignment"]="point"!==this.layout.get("symbol-placement")?"map":"viewport"),"auto"===this.layout.get("text-rotation-alignment")&&(this.layout._values["text-rotation-alignment"]="point"!==this.layout.get("symbol-placement")?"map":"viewport"),"auto"===this.layout.get("text-pitch-alignment")&&(this.layout._values["text-pitch-alignment"]="map"===this.layout.get("text-rotation-alignment")?"map":"viewport"),"auto"===this.layout.get("icon-pitch-alignment")&&(this.layout._values["icon-pitch-alignment"]=this.layout.get("icon-rotation-alignment")),"point"===this.layout.get("symbol-placement")){const t=this.layout.get("text-writing-mode");if(t){const e=[];for(const r of t)e.indexOf(r)<0&&e.push(r);this.layout._values["text-writing-mode"]=e;}else this.layout._values["text-writing-mode"]=["horizontal"];}this._setPaintOverrides();}getValueAndResolveTokens(t,e,r,n){const i=this.layout.get(t).evaluate(e,{},r,n),s=this._unevaluatedLayout._values[t];return s.isDataDriven()||vn(s.value)||!i?i:function(t,e){return e.replace(/{([^{}]+)}/g,((e,r)=>t&&r in t?String(t[r]):""))}(e.properties,i)}createBucket(t){return new dc(t)}queryRadius(){return 0}queryIntersectsFeature(){throw new Error("Should take a different path in FeatureIndex")}_setPaintOverrides(){for(const t of gc.paint.overridableProperties){if(!vc.hasPaintOverride(this.layout,t))continue;const e=this.paint.get(t),r=new xc(e),n=new xn(r,e.property.specification);let i=null;i="constant"===e.value.kind||"source"===e.value.kind?new wn("source",n):new _n("composite",n,e.value.zoomStops),this.paint._values[t]=new Hi(e.property,i,e.parameters);}}_handleOverridablePaintPropertyUpdate(t,e,r){return !(!this.layout||e.isDataDriven()||r.isDataDriven())&&vc.hasPaintOverride(this.layout,t)}static hasPaintOverride(t,e){const r=t.get("text-field"),n=gc.paint.properties[e];let i=!1;const s=t=>{for(const e of t)if(n.overrides&&n.overrides.hasOverride(e))return void(i=!0)};if("constant"===r.value.kind&&r.value.value instanceof Yt)s(r.value.value.sections);else if("source"===r.value.kind){const t=e=>{i||(e instanceof se&&ne(e.value)===mt?s(e.value.sections):e instanceof Ze?s(e.sections):e.eachChild(t));},e=r.value;e._styleExpression&&t(e._styleExpression.expression);}return i}}let bc;var wc={get paint(){return bc=bc||new rs({"background-color":new Ji(G.paint_background["background-color"]),"background-pattern":new ts(G.paint_background["background-pattern"]),"background-opacity":new Ji(G.paint_background["background-opacity"])})}};class _c extends is{constructor(t){super(t,wc);}}let Ac;var Sc={get paint(){return Ac=Ac||new rs({"raster-opacity":new Ji(G.paint_raster["raster-opacity"]),"raster-hue-rotate":new Ji(G.paint_raster["raster-hue-rotate"]),"raster-brightness-min":new Ji(G.paint_raster["raster-brightness-min"]),"raster-brightness-max":new Ji(G.paint_raster["raster-brightness-max"]),"raster-saturation":new Ji(G.paint_raster["raster-saturation"]),"raster-contrast":new Ji(G.paint_raster["raster-contrast"]),"raster-resampling":new Ji(G.paint_raster["raster-resampling"]),"raster-fade-duration":new Ji(G.paint_raster["raster-fade-duration"])})}};class kc extends is{constructor(t){super(t,Sc);}}class Mc extends is{constructor(t){super(t,{}),this.onAdd=t=>{this.implementation.onAdd&&this.implementation.onAdd(t,t.painter.context.gl);},this.onRemove=t=>{this.implementation.onRemove&&this.implementation.onRemove(t,t.painter.context.gl);},this.implementation=t;}is3D(){return "3d"===this.implementation.renderingMode}hasOffscreenPass(){return void 0!==this.implementation.prerender}recalculate(){}updateTransitions(){}hasTransition(){return !1}serialize(){throw new Error("Custom layers cannot be serialized")}}class Ic{constructor(t){this._methodToThrottle=t,this._triggered=!1,"undefined"!=typeof MessageChannel&&(this._channel=new MessageChannel,this._channel.port2.onmessage=()=>{this._triggered=!1,this._methodToThrottle();});}trigger(){this._triggered||(this._triggered=!0,this._channel?this._channel.port1.postMessage(!0):setTimeout((()=>{this._triggered=!1,this._methodToThrottle();}),0));}remove(){delete this._channel,this._methodToThrottle=()=>{};}}const zc=6371008.8;class Pc{constructor(t,e){if(isNaN(t)||isNaN(e))throw new Error(`Invalid LngLat object: (${t}, ${e})`);if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")}wrap(){return new Pc(m(this.lng,-180,180),this.lat)}toArray(){return [this.lng,this.lat]}toString(){return `LngLat(${this.lng}, ${this.lat})`}distanceTo(t){const e=Math.PI/180,r=this.lat*e,n=t.lat*e,i=Math.sin(r)*Math.sin(n)+Math.cos(r)*Math.cos(n)*Math.cos((t.lng-this.lng)*e);return zc*Math.acos(Math.min(i,1))}static convert(t){if(t instanceof Pc)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new Pc(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&"object"==typeof t&&null!==t)return new Pc(Number("lng"in t?t.lng:t.lon),Number(t.lat));throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: <lng>, lat: <lat>}, an object {lon: <lng>, lat: <lat>}, or an array of [<lng>, <lat>]")}}const Cc=2*Math.PI*zc;function Bc(t){return Cc*Math.cos(t*Math.PI/180)}function Vc(t){return (180+t)/360}function Ec(t){return (180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))/360}function Fc(t,e){return t/Bc(e)}function Tc(t){return 360/Math.PI*Math.atan(Math.exp((180-360*t)*Math.PI/180))-90}class $c{constructor(t,e,r=0){this.x=+t,this.y=+e,this.z=+r;}static fromLngLat(t,e=0){const r=Pc.convert(t);return new $c(Vc(r.lng),Ec(r.lat),Fc(e,r.lat))}toLngLat(){return new Pc(360*this.x-180,Tc(this.y))}toAltitude(){return this.z*Bc(Tc(this.y))}meterInMercatorCoordinateUnits(){return 1/Cc*(t=Tc(this.y),1/Math.cos(t*Math.PI/180));var t;}}function Lc(t,e,r){var n=2*Math.PI*6378137/256/Math.pow(2,r);return [t*n-2*Math.PI*6378137/2,e*n-2*Math.PI*6378137/2]}class Dc{constructor(t,e,r){if(!function(t,e,r){return !(t<0||t>25||r<0||r>=Math.pow(2,t)||e<0||e>=Math.pow(2,t))}(t,e,r))throw new Error(`x=${e}, y=${r}, z=${t} outside of bounds. 0<=x<${Math.pow(2,t)}, 0<=y<${Math.pow(2,t)} 0<=z<=25 `);this.z=t,this.x=e,this.y=r,this.key=Rc(0,t,t,e,r);}equals(t){return this.z===t.z&&this.x===t.x&&this.y===t.y}url(t,e,r){const n=(s=this.y,a=this.z,o=Lc(256*(i=this.x),256*(s=Math.pow(2,a)-s-1),a),l=Lc(256*(i+1),256*(s+1),a),o[0]+","+o[1]+","+l[0]+","+l[1]);var i,s,a,o,l;const u=function(t,e,r){let n,i="";for(let s=t;s>0;s--)n=1<<s-1,i+=(e&n?1:0)+(r&n?2:0);return i}(this.z,this.x,this.y);return t[(this.x+this.y)%t.length].replace(/{prefix}/g,(this.x%16).toString(16)+(this.y%16).toString(16)).replace(/{z}/g,String(this.z)).replace(/{x}/g,String(this.x)).replace(/{y}/g,String("tms"===r?Math.pow(2,this.z)-this.y-1:this.y)).replace(/{ratio}/g,e>1?"@2x":"").replace(/{quadkey}/g,u).replace(/{bbox-epsg-3857}/g,n)}isChildOf(t){const e=this.z-t.z;return e>0&&t.x===this.x>>e&&t.y===this.y>>e}getTilePoint(t){const e=Math.pow(2,this.z);return new s((t.x*e-this.x)*$a,(t.y*e-this.y)*$a)}toString(){return `${this.z}/${this.x}/${this.y}`}}class Oc{constructor(t,e){this.wrap=t,this.canonical=e,this.key=Rc(t,e.z,e.z,e.x,e.y);}}class jc{constructor(t,e,r,n,i){if(t<r)throw new Error(`overscaledZ should be >= z; overscaledZ = ${t}; z = ${r}`);this.overscaledZ=t,this.wrap=e,this.canonical=new Dc(r,+n,+i),this.key=Rc(e,t,r,n,i);}clone(){return new jc(this.overscaledZ,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)}equals(t){return this.overscaledZ===t.overscaledZ&&this.wrap===t.wrap&&this.canonical.equals(t.canonical)}scaledTo(t){if(t>this.overscaledZ)throw new Error(`targetZ > this.overscaledZ; targetZ = ${t}; overscaledZ = ${this.overscaledZ}`);const e=this.canonical.z-t;return t>this.canonical.z?new jc(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new jc(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)}calculateScaledKey(t,e){if(t>this.overscaledZ)throw new Error(`targetZ > this.overscaledZ; targetZ = ${t}; overscaledZ = ${this.overscaledZ}`);const r=this.canonical.z-t;return t>this.canonical.z?Rc(this.wrap*+e,t,this.canonical.z,this.canonical.x,this.canonical.y):Rc(this.wrap*+e,t,t,this.canonical.x>>r,this.canonical.y>>r)}isChildOf(t){if(t.wrap!==this.wrap)return !1;const e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ<this.overscaledZ&&t.canonical.x===this.canonical.x>>e&&t.canonical.y===this.canonical.y>>e}children(t){if(this.overscaledZ>=t)return [new jc(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];const e=this.canonical.z+1,r=2*this.canonical.x,n=2*this.canonical.y;return [new jc(e,this.wrap,e,r,n),new jc(e,this.wrap,e,r+1,n),new jc(e,this.wrap,e,r,n+1),new jc(e,this.wrap,e,r+1,n+1)]}isLessThan(t){return this.wrap<t.wrap||!(this.wrap>t.wrap)&&(this.overscaledZ<t.overscaledZ||!(this.overscaledZ>t.overscaledZ)&&(this.canonical.x<t.canonical.x||!(this.canonical.x>t.canonical.x)&&this.canonical.y<t.canonical.y))}wrapped(){return new jc(this.overscaledZ,0,this.canonical.z,this.canonical.x,this.canonical.y)}unwrapTo(t){return new jc(this.overscaledZ,t,this.canonical.z,this.canonical.x,this.canonical.y)}overscaleFactor(){return Math.pow(2,this.overscaledZ-this.canonical.z)}toUnwrapped(){return new Oc(this.wrap,this.canonical)}toString(){return `${this.overscaledZ}/${this.canonical.x}/${this.canonical.y}`}getTilePoint(t){return this.canonical.getTilePoint(new $c(t.x-this.wrap,t.y))}}function Rc(t,e,r,n,i){(t*=2)<0&&(t=-1*t-1);const s=1<<r;return (s*s*t+s*i+n).toString(36)+r.toString(36)+e.toString(36)}wi("CanonicalTileID",Dc),wi("OverscaledTileID",jc,{omit:["posMatrix"]});class Uc{constructor(t,e,r,n=1,i=1,s=1,a=0){if(this.uid=t,e.height!==e.width)throw new RangeError("DEM tiles must be square");if(r&&!["mapbox","terrarium","custom"].includes(r))return void A(`"${r}" is not a valid encoding type. Valid types include "mapbox", "terrarium" and "custom".`);this.stride=e.height;const o=this.dim=e.height-2;switch(this.data=new Uint32Array(e.data.buffer),r){case"terrarium":this.redFactor=256,this.greenFactor=1,this.blueFactor=1/256,this.baseShift=32768;break;case"custom":this.redFactor=n,this.greenFactor=i,this.blueFactor=s,this.baseShift=a;break;default:this.redFactor=6553.6,this.greenFactor=25.6,this.blueFactor=.1,this.baseShift=1e4;}for(let t=0;t<o;t++)this.data[this._idx(-1,t)]=this.data[this._idx(0,t)],this.data[this._idx(o,t)]=this.data[this._idx(o-1,t)],this.data[this._idx(t,-1)]=this.data[this._idx(t,0)],this.data[this._idx(t,o)]=this.data[this._idx(t,o-1)];this.data[this._idx(-1,-1)]=this.data[this._idx(0,0)],this.data[this._idx(o,-1)]=this.data[this._idx(o-1,0)],this.data[this._idx(-1,o)]=this.data[this._idx(0,o-1)],this.data[this._idx(o,o)]=this.data[this._idx(o-1,o-1)],this.min=Number.MAX_SAFE_INTEGER,this.max=Number.MIN_SAFE_INTEGER;for(let t=0;t<o;t++)for(let e=0;e<o;e++){const r=this.get(t,e);r>this.max&&(this.max=r),r<this.min&&(this.min=r);}}get(t,e){const r=new Uint8Array(this.data.buffer),n=4*this._idx(t,e);return this.unpack(r[n],r[n+1],r[n+2])}getUnpackVector(){return [this.redFactor,this.greenFactor,this.blueFactor,this.baseShift]}_idx(t,e){if(t<-1||t>=this.dim+1||e<-1||e>=this.dim+1)throw new RangeError("out of range source coordinates for DEM data");return (e+1)*this.stride+(t+1)}unpack(t,e,r){return t*this.redFactor+e*this.greenFactor+r*this.blueFactor-this.baseShift}getPixels(){return new Ao({width:this.stride,height:this.stride},new Uint8Array(this.data.buffer))}backfillBorder(t,e,r){if(this.dim!==t.dim)throw new Error("dem dimension mismatch");let n=e*this.dim,i=e*this.dim+this.dim,s=r*this.dim,a=r*this.dim+this.dim;switch(e){case-1:n=i-1;break;case 1:i=n+1;}switch(r){case-1:s=a-1;break;case 1:a=s+1;}const o=-e*this.dim,l=-r*this.dim;for(let e=s;e<a;e++)for(let r=n;r<i;r++)this.data[this._idx(r,e)]=t.data[this._idx(r+o,e+l)];}}wi("DEMData",Uc);class qc{constructor(t){this._stringToNumber={},this._numberToString=[];for(let e=0;e<t.length;e++){const r=t[e];this._stringToNumber[r]=e,this._numberToString[e]=r;}}encode(t){return this._stringToNumber[t]}decode(t){if(t>=this._numberToString.length)throw new Error(`Out of bounds. Index requested n=${t} can't be >= this._numberToString.length ${this._numberToString.length}`);return this._numberToString[t]}}class Nc{constructor(t,e,r,n,i){this.type="Feature",this._vectorTileFeature=t,t._z=e,t._x=r,t._y=n,this.properties=t.properties,this.id=i;}get geometry(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry}set geometry(t){this._geometry=t;}toJSON(){const t={geometry:this.geometry};for(const e in this)"_geometry"!==e&&"_vectorTileFeature"!==e&&(t[e]=this[e]);return t}}class Zc{constructor(t,e){this.tileID=t,this.x=t.canonical.x,this.y=t.canonical.y,this.z=t.canonical.z,this.grid=new vi($a,16,0),this.grid3D=new vi($a,16,0),this.featureIndexArray=new Ns,this.promoteId=e;}insert(t,e,r,n,i,s){const a=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(r,n,i);const o=s?this.grid3D:this.grid;for(let t=0;t<e.length;t++){const r=e[t],n=[1/0,1/0,-1/0,-1/0];for(let t=0;t<r.length;t++){const e=r[t];n[0]=Math.min(n[0],e.x),n[1]=Math.min(n[1],e.y),n[2]=Math.max(n[2],e.x),n[3]=Math.max(n[3],e.y);}n[0]<$a&&n[1]<$a&&n[2]>=0&&n[3]>=0&&o.insert(a,n[0],n[1],n[2],n[3]);}}loadVTLayers(){return this.vtLayers||(this.vtLayers=new fl.VectorTile(new Iu(this.rawTileData)).layers,this.sourceLayerCoder=new qc(this.vtLayers?Object.keys(this.vtLayers).sort():["_geojsonTileLayer"])),this.vtLayers}query(t,e,r,n){this.loadVTLayers();const i=t.params||{},a=$a/t.tileSize/t.scale,o=zn(i.filter),l=t.queryGeometry,u=t.queryPadding*a,c=Kc(l),h=this.grid.query(c.minX-u,c.minY-u,c.maxX+u,c.maxY+u),p=Kc(t.cameraQueryGeometry),f=this.grid3D.query(p.minX-u,p.minY-u,p.maxX+u,p.maxY+u,((e,r,n,i)=>function(t,e,r,n,i){for(const s of t)if(e<=s.x&&r<=s.y&&n>=s.x&&i>=s.y)return !0;const a=[new s(e,r),new s(e,i),new s(n,i),new s(n,r)];if(t.length>2)for(const e of a)if(Wa(t,e))return !0;for(let e=0;e<t.length-1;e++)if(Qa(t[e],t[e+1],a))return !0;return !1}(t.cameraQueryGeometry,e-u,r-u,n+u,i+u)));for(const t of f)h.push(t);h.sort(Xc);const d={};let y;for(let s=0;s<h.length;s++){const u=h[s];if(u===y)continue;y=u;const c=this.featureIndexArray.get(u);let p=null;this.loadMatchingFeature(d,c.bucketIndex,c.sourceLayerIndex,c.featureIndex,o,i.layers,i.availableImages,e,r,n,((e,r,n)=>(p||(p=Oa(e)),r.queryIntersectsFeature(l,e,n,p,this.z,t.transform,a,t.pixelPosMatrix))));}return d}loadMatchingFeature(t,e,r,n,i,s,a,o,l,u,c){const h=this.bucketLayerIDs[e];if(s&&!function(t,e){for(let r=0;r<t.length;r++)if(e.indexOf(t[r])>=0)return !0;return !1}(s,h))return;const p=this.sourceLayerCoder.decode(r),f=this.vtLayers[p].feature(n);if(i.needGeometry){const t=ja(f,!0);if(!i.filter(new Ui(this.tileID.overscaledZ),t,this.tileID.canonical))return}else if(!i.filter(new Ui(this.tileID.overscaledZ),f))return;const d=this.getId(f,p);for(let e=0;e<h.length;e++){const r=h[e];if(s&&s.indexOf(r)<0)continue;const i=o[r];if(!i)continue;let p={};d&&u&&(p=u.getState(i.sourceLayer||"_geojsonTileLayer",d));const y=g({},l[r]);y.paint=Gc(y.paint,i.paint,f,p,a),y.layout=Gc(y.layout,i.layout,f,p,a);const m=!c||c(f,i,p);if(!m)continue;const x=new Nc(f,this.z,this.x,this.y,d);x.layer=y;let v=t[r];void 0===v&&(v=t[r]=[]),v.push({featureIndex:n,feature:x,intersectionZ:m});}}lookupSymbolFeatures(t,e,r,n,i,s,a,o){const l={};this.loadVTLayers();const u=zn(i);for(const i of t)this.loadMatchingFeature(l,r,n,i,u,s,a,o,e);return l}hasLayer(t){for(const e of this.bucketLayerIDs)for(const r of e)if(t===r)return !0;return !1}getId(t,e){let r=t.id;return this.promoteId&&(r=t.properties["string"==typeof this.promoteId?this.promoteId:this.promoteId[e]],"boolean"==typeof r&&(r=Number(r))),r}}function Gc(t,e,r,n,i){return v(t,((t,s)=>{const a=e instanceof Yi?e.get(s):null;return a&&a.evaluate?a.evaluate(r,n,i):a}))}function Kc(t){let e=1/0,r=1/0,n=-1/0,i=-1/0;for(const s of t)e=Math.min(e,s.x),r=Math.min(r,s.y),n=Math.max(n,s.x),i=Math.max(i,s.y);return {minX:e,minY:r,maxX:n,maxY:i}}function Xc(t,e){return e-t}function Hc(t,e,r,n,i){const a=[];for(let o=0;o<t.length;o++){const l=t[o];let u;for(let t=0;t<l.length-1;t++){let o=l[t],c=l[t+1];o.x<e&&c.x<e||(o.x<e?o=new s(e,o.y+(e-o.x)/(c.x-o.x)*(c.y-o.y))._round():c.x<e&&(c=new s(e,o.y+(e-o.x)/(c.x-o.x)*(c.y-o.y))._round()),o.y<r&&c.y<r||(o.y<r?o=new s(o.x+(r-o.y)/(c.y-o.y)*(c.x-o.x),r)._round():c.y<r&&(c=new s(o.x+(r-o.y)/(c.y-o.y)*(c.x-o.x),r)._round()),o.x>=n&&c.x>=n||(o.x>=n?o=new s(n,o.y+(n-o.x)/(c.x-o.x)*(c.y-o.y))._round():c.x>=n&&(c=new s(n,o.y+(n-o.x)/(c.x-o.x)*(c.y-o.y))._round()),o.y>=i&&c.y>=i||(o.y>=i?o=new s(o.x+(i-o.y)/(c.y-o.y)*(c.x-o.x),i)._round():c.y>=i&&(c=new s(o.x+(i-o.y)/(c.y-o.y)*(c.x-o.x),i)._round()),u&&o.equals(u[u.length-1])||(u=[o],a.push(u)),u.push(c)))));}}return a}wi("FeatureIndex",Zc,{omit:["rawTileData","sourceLayerCoder"]});class Yc extends s{constructor(t,e,r,n){super(t,e),this.angle=r,void 0!==n&&(this.segment=n);}clone(){return new Yc(this.x,this.y,this.angle,this.segment)}}function Jc(t,e,r,n,i){if(void 0===e.segment||0===r)return !0;let s=e,a=e.segment+1,o=0;for(;o>-r/2;){if(a--,a<0)return !1;o-=t[a].dist(s),s=t[a];}o+=t[a].dist(t[a+1]),a++;const l=[];let u=0;for(;o<r/2;){const e=t[a],r=t[a+1];if(!r)return !1;let s=t[a-1].angleTo(e)-e.angleTo(r);for(s=Math.abs((s+3*Math.PI)%(2*Math.PI)-Math.PI),l.push({distance:o,angleDelta:s}),u+=s;o-l[0].distance>n;)u-=l.shift().angleDelta;if(u>i)return !1;a++,o+=e.dist(r);}return !0}function Wc(t){let e=0;for(let r=0;r<t.length-1;r++)e+=t[r].dist(t[r+1]);return e}function Qc(t,e,r){return t?.6*e*r:0}function th(t,e){return Math.max(t?t.right-t.left:0,e?e.right-e.left:0)}function eh(t,e,r,n,i,s){const a=Qc(r,i,s),o=th(r,n)*s;let l=0;const u=Wc(t)/2;for(let r=0;r<t.length-1;r++){const n=t[r],i=t[r+1],s=n.dist(i);if(l+s>u){const c=(u-l)/s,h=Ce.number(n.x,i.x,c),p=Ce.number(n.y,i.y,c),f=new Yc(h,p,i.angleTo(n),r);return f._round(),!a||Jc(t,f,o,a,e)?f:void 0}l+=s;}}function rh(t,e,r,n,i,s,a,o,l){const u=Qc(n,s,a),c=th(n,i),h=c*a,p=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;return e-h<e/4&&(e=h+e/4),nh(t,p?e/2*o%e:(c/2+2*s)*a*o%e,e,u,r,h,p,!1,l)}function nh(t,e,r,n,i,s,a,o,l){const u=s/2,c=Wc(t);let h=0,p=e-r,f=[];for(let e=0;e<t.length-1;e++){const a=t[e],o=t[e+1],d=a.dist(o),y=o.angleTo(a);for(;p+r<h+d;){p+=r;const m=(p-h)/d,g=Ce.number(a.x,o.x,m),x=Ce.number(a.y,o.y,m);if(g>=0&&g<l&&x>=0&&x<l&&p-u>=0&&p+u<=c){const r=new Yc(g,x,y,e);r._round(),n&&!Jc(t,r,s,n,i)||f.push(r);}}h+=d;}return o||f.length||a||(f=nh(t,h/2,r,n,i,s,a,!0,l)),f}wi("Anchor",Yc);const ih=Fu;function sh(t,e,r,n){const i=[],a=t.image,o=a.pixelRatio,l=a.paddedRect.w-2*ih,u=a.paddedRect.h-2*ih;let c={x1:t.left,y1:t.top,x2:t.right,y2:t.bottom};const h=a.stretchX||[[0,l]],p=a.stretchY||[[0,u]],f=(t,e)=>t+e[1]-e[0],d=h.reduce(f,0),y=p.reduce(f,0),m=l-d,g=u-y;let x=0,v=d,b=0,w=y,_=0,A=m,S=0,k=g;if(a.content&&n){const e=a.content,r=e[2]-e[0],n=e[3]-e[1];(a.textFitWidth||a.textFitHeight)&&(c=tc(t)),x=ah(h,0,e[0]),b=ah(p,0,e[1]),v=ah(h,e[0],e[2]),w=ah(p,e[1],e[3]),_=e[0]-x,S=e[1]-b,A=r-v,k=n-w;}const M=c.x1,I=c.y1,z=c.x2-M,P=c.y2-I,C=(t,n,i,l)=>{const u=lh(t.stretch-x,v,z,M),c=uh(t.fixed-_,A,t.stretch,d),h=lh(n.stretch-b,w,P,I),p=uh(n.fixed-S,k,n.stretch,y),f=lh(i.stretch-x,v,z,M),m=uh(i.fixed-_,A,i.stretch,d),g=lh(l.stretch-b,w,P,I),C=uh(l.fixed-S,k,l.stretch,y),B=new s(u,h),V=new s(f,h),E=new s(f,g),F=new s(u,g),T=new s(c/o,p/o),$=new s(m/o,C/o),L=e*Math.PI/180;if(L){const t=Math.sin(L),e=Math.cos(L),r=[e,-t,t,e];B._matMult(r),V._matMult(r),F._matMult(r),E._matMult(r);}const D=t.stretch+t.fixed,O=n.stretch+n.fixed;return {tl:B,tr:V,bl:F,br:E,tex:{x:a.paddedRect.x+ih+D,y:a.paddedRect.y+ih+O,w:i.stretch+i.fixed-D,h:l.stretch+l.fixed-O},writingMode:void 0,glyphOffset:[0,0],sectionIndex:0,pixelOffsetTL:T,pixelOffsetBR:$,minFontScaleX:A/o/z,minFontScaleY:k/o/P,isSDF:r}};if(n&&(a.stretchX||a.stretchY)){const t=oh(h,m,d),e=oh(p,g,y);for(let r=0;r<t.length-1;r++){const n=t[r],s=t[r+1];for(let t=0;t<e.length-1;t++)i.push(C(n,e[t],s,e[t+1]));}}else i.push(C({fixed:0,stretch:-1},{fixed:0,stretch:-1},{fixed:0,stretch:l+1},{fixed:0,stretch:u+1}));return i}function ah(t,e,r){let n=0;for(const i of t)n+=Math.max(e,Math.min(r,i[1]))-Math.max(e,Math.min(r,i[0]));return n}function oh(t,e,r){const n=[{fixed:-ih,stretch:0}];for(const[e,r]of t){const t=n[n.length-1];n.push({fixed:e-t.stretch,stretch:t.stretch}),n.push({fixed:e-t.stretch,stretch:t.stretch+(r-e)});}return n.push({fixed:e+ih,stretch:r}),n}function lh(t,e,r,n){return t/e*r+n}function uh(t,e,r,n){return t-e*r/n}class ch{constructor(t,e,r,n,i,a,o,l,u,c){var h;if(this.boxStartIndex=t.length,u){let t=a.top,e=a.bottom;const r=a.collisionPadding;r&&(t-=r[1],e+=r[3]);let n=e-t;n>0&&(n=Math.max(10,n),this.circleDiameter=n);}else {const u=(null===(h=a.image)||void 0===h?void 0:h.content)&&(a.image.textFitWidth||a.image.textFitHeight)?tc(a):{x1:a.left,y1:a.top,x2:a.right,y2:a.bottom};u.y1=u.y1*o-l[0],u.y2=u.y2*o+l[2],u.x1=u.x1*o-l[3],u.x2=u.x2*o+l[1];const p=a.collisionPadding;if(p&&(u.x1-=p[0]*o,u.y1-=p[1]*o,u.x2+=p[2]*o,u.y2+=p[3]*o),c){const t=new s(u.x1,u.y1),e=new s(u.x2,u.y1),r=new s(u.x1,u.y2),n=new s(u.x2,u.y2),i=c*Math.PI/180;t._rotate(i),e._rotate(i),r._rotate(i),n._rotate(i),u.x1=Math.min(t.x,e.x,r.x,n.x),u.x2=Math.max(t.x,e.x,r.x,n.x),u.y1=Math.min(t.y,e.y,r.y,n.y),u.y2=Math.max(t.y,e.y,r.y,n.y);}t.emplaceBack(e.x,e.y,u.x1,u.y1,u.x2,u.y2,r,n,i);}this.boxEndIndex=t.length;}}class hh{constructor(t=[],e=((t,e)=>t<e?-1:t>e?1:0)){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t);}push(t){this.data.push(t),this._up(this.length++);}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return --this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:r}=this,n=e[t];for(;t>0;){const i=t-1>>1,s=e[i];if(r(n,s)>=0)break;e[t]=s,t=i;}e[t]=n;}_down(t){const{data:e,compare:r}=this,n=this.length>>1,i=e[t];for(;t<n;){let n=1+(t<<1);const s=n+1;if(s<this.length&&r(e[s],e[n])<0&&(n=s),r(e[n],i)>=0)break;e[t]=e[n],t=n;}e[t]=i;}}function ph(t,e=1,r=!1){let n=1/0,i=1/0,a=-1/0,o=-1/0;const l=t[0];for(let t=0;t<l.length;t++){const e=l[t];(!t||e.x<n)&&(n=e.x),(!t||e.y<i)&&(i=e.y),(!t||e.x>a)&&(a=e.x),(!t||e.y>o)&&(o=e.y);}const u=Math.min(a-n,o-i);let c=u/2;const h=new hh([],fh);if(0===u)return new s(n,i);for(let e=n;e<a;e+=u)for(let r=i;r<o;r+=u)h.push(new dh(e+c,r+c,c,t));let p=function(t){let e=0,r=0,n=0;const i=t[0];for(let t=0,s=i.length,a=s-1;t<s;a=t++){const s=i[t],o=i[a],l=s.x*o.y-o.x*s.y;r+=(s.x+o.x)*l,n+=(s.y+o.y)*l,e+=3*l;}return new dh(r/e,n/e,0,t)}(t),f=h.length;for(;h.length;){const n=h.pop();(n.d>p.d||!p.d)&&(p=n,r&&console.log("found best %d after %d probes",Math.round(1e4*n.d)/1e4,f)),n.max-p.d<=e||(c=n.h/2,h.push(new dh(n.p.x-c,n.p.y-c,c,t)),h.push(new dh(n.p.x+c,n.p.y-c,c,t)),h.push(new dh(n.p.x-c,n.p.y+c,c,t)),h.push(new dh(n.p.x+c,n.p.y+c,c,t)),f+=4);}return r&&(console.log(`num probes: ${f}`),console.log(`best distance: ${p.d}`)),p.p}function fh(t,e){return e.max-t.max}function dh(t,e,r,n){this.p=new s(t,e),this.h=r,this.d=function(t,e){let r=!1,n=1/0;for(let i=0;i<e.length;i++){const s=e[i];for(let e=0,i=s.length,a=i-1;e<i;a=e++){const i=s[e],o=s[a];i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(r=!r),n=Math.min(n,Ya(t,i,o));}}return (r?1:-1)*Math.sqrt(n)}(this.p,n),this.max=this.d+this.h*Math.SQRT2;}var yh;t.aq=void 0,(yh=t.aq||(t.aq={}))[yh.center=1]="center",yh[yh.left=2]="left",yh[yh.right=3]="right",yh[yh.top=4]="top",yh[yh.bottom=5]="bottom",yh[yh["top-left"]=6]="top-left",yh[yh["top-right"]=7]="top-right",yh[yh["bottom-left"]=8]="bottom-left",yh[yh["bottom-right"]=9]="bottom-right";const mh=7,gh=Number.POSITIVE_INFINITY;function xh(t,e){return e[1]!==gh?function(t,e,r){let n=0,i=0;switch(e=Math.abs(e),r=Math.abs(r),t){case"top-right":case"top-left":case"top":i=r-mh;break;case"bottom-right":case"bottom-left":case"bottom":i=-r+mh;}switch(t){case"top-right":case"bottom-right":case"right":n=-e;break;case"top-left":case"bottom-left":case"left":n=e;}return [n,i]}(t,e[0],e[1]):function(t,e){let r=0,n=0;e<0&&(e=0);const i=e/Math.SQRT2;switch(t){case"top-right":case"top-left":n=i-mh;break;case"bottom-right":case"bottom-left":n=-i+mh;break;case"bottom":n=-e+mh;break;case"top":n=e-mh;}switch(t){case"top-right":case"bottom-right":r=-i;break;case"top-left":case"bottom-left":r=i;break;case"left":r=e;break;case"right":r=-e;}return [r,n]}(t,e[0])}function vh(t,e,r){var n;const i=t.layout,s=null===(n=i.get("text-variable-anchor-offset"))||void 0===n?void 0:n.evaluate(e,{},r);if(s){const t=s.values,e=[];for(let r=0;r<t.length;r+=2){const n=e[r]=t[r],i=t[r+1].map((t=>t*iu));n.startsWith("top")?i[1]-=mh:n.startsWith("bottom")&&(i[1]+=mh),e[r+1]=i;}return new Qt(e)}const a=i.get("text-variable-anchor");if(a){let n;n=void 0!==t._unevaluatedLayout.getValue("text-radial-offset")?[i.get("text-radial-offset").evaluate(e,{},r)*iu,gh]:i.get("text-offset").evaluate(e,{},r).map((t=>t*iu));const s=[];for(const t of a)s.push(t,xh(t,n));return new Qt(s)}return null}function bh(t){switch(t){case"right":case"top-right":case"bottom-right":return "right";case"left":case"top-left":case"bottom-left":return "left"}return "center"}function wh(e,r,n,i,s,a,o,l,u,c,h){let p=a.textMaxSize.evaluate(r,{});void 0===p&&(p=o);const f=e.layers[0].layout,d=f.get("icon-offset").evaluate(r,{},h),y=Ah(n.horizontal),m=o/24,g=e.tilePixelRatio*m,x=e.tilePixelRatio*p/24,v=e.tilePixelRatio*l,b=e.tilePixelRatio*f.get("symbol-spacing"),w=f.get("text-padding")*e.tilePixelRatio,_=function(t,e,r,n=1){const i=t.get("icon-padding").evaluate(e,{},r),s=i&&i.values;return [s[0]*n,s[1]*n,s[2]*n,s[3]*n]}(f,r,h,e.tilePixelRatio),S=f.get("text-max-angle")/180*Math.PI,k="viewport"!==f.get("text-rotation-alignment")&&"point"!==f.get("symbol-placement"),M="map"===f.get("icon-rotation-alignment")&&"point"!==f.get("symbol-placement"),I=f.get("symbol-placement"),z=b/2,P=f.get("icon-text-fit");let C;i&&"none"!==P&&(e.allowVerticalPlacement&&n.vertical&&(C=ec(i,n.vertical,P,f.get("icon-text-fit-padding"),d,m)),y&&(i=ec(i,y,P,f.get("icon-text-fit-padding"),d,m)));const B=(l,p)=>{p.x<0||p.x>=$a||p.y<0||p.y>=$a||function(e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w,_,S,k,M){const I=e.addToLineVertexArray(r,n);let z,P,C,B,V=0,E=0,F=0,T=0,$=-1,L=-1;const D={};let O=ma("");if(e.allowVerticalPlacement&&i.vertical){const t=l.layout.get("text-rotate").evaluate(w,{},k)+90;C=new ch(u,r,c,h,p,i.vertical,f,d,y,t),o&&(B=new ch(u,r,c,h,p,o,g,x,y,t));}if(s){const n=l.layout.get("icon-rotate").evaluate(w,{}),i="none"!==l.layout.get("icon-text-fit"),a=sh(s,n,S,i),f=o?sh(o,n,S,i):void 0;P=new ch(u,r,c,h,p,s,g,x,!1,n),V=4*a.length;const d=e.iconSizeData;let y=null;"source"===d.kind?(y=[nc*l.layout.get("icon-size").evaluate(w,{})],y[0]>ic&&A(`${e.layerIds[0]}: Value for "icon-size" is >= ${rc}. Reduce your "icon-size".`)):"composite"===d.kind&&(y=[nc*_.compositeIconSizes[0].evaluate(w,{},k),nc*_.compositeIconSizes[1].evaluate(w,{},k)],(y[0]>ic||y[1]>ic)&&A(`${e.layerIds[0]}: Value for "icon-size" is >= ${rc}. Reduce your "icon-size".`)),e.addSymbols(e.icon,a,y,b,v,w,t.ah.none,r,I.lineStartIndex,I.lineLength,-1,k),$=e.icon.placedSymbolArray.length-1,f&&(E=4*f.length,e.addSymbols(e.icon,f,y,b,v,w,t.ah.vertical,r,I.lineStartIndex,I.lineLength,-1,k),L=e.icon.placedSymbolArray.length-1);}const j=Object.keys(i.horizontal);for(const n of j){const s=i.horizontal[n];if(!z){O=ma(s.text);const t=l.layout.get("text-rotate").evaluate(w,{},k);z=new ch(u,r,c,h,p,s,f,d,y,t);}const o=1===s.positionedLines.length;if(F+=_h(e,r,s,a,l,y,w,m,I,i.vertical?t.ah.horizontal:t.ah.horizontalOnly,o?j:[n],D,$,_,k),o)break}i.vertical&&(T+=_h(e,r,i.vertical,a,l,y,w,m,I,t.ah.vertical,["vertical"],D,L,_,k));const R=z?z.boxStartIndex:e.collisionBoxArray.length,U=z?z.boxEndIndex:e.collisionBoxArray.length,q=C?C.boxStartIndex:e.collisionBoxArray.length,N=C?C.boxEndIndex:e.collisionBoxArray.length,Z=P?P.boxStartIndex:e.collisionBoxArray.length,G=P?P.boxEndIndex:e.collisionBoxArray.length,K=B?B.boxStartIndex:e.collisionBoxArray.length,X=B?B.boxEndIndex:e.collisionBoxArray.length;let H=-1;const Y=(t,e)=>t&&t.circleDiameter?Math.max(t.circleDiameter,e):e;H=Y(z,H),H=Y(C,H),H=Y(P,H),H=Y(B,H);const J=H>-1?1:0;J&&(H*=M/iu),e.glyphOffsetArray.length>=dc.MAX_GLYPHS&&A("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"),void 0!==w.sortKey&&e.addToSortKeyRanges(e.symbolInstances.length,w.sortKey);const W=vh(l,w,k),[Q,tt]=function(e,r){const n=e.length,i=null==r?void 0:r.values;if((null==i?void 0:i.length)>0)for(let r=0;r<i.length;r+=2){const n=i[r+1];e.emplaceBack(t.aq[i[r]],n[0],n[1]);}return [n,e.length]}(e.textAnchorOffsets,W);e.symbolInstances.emplaceBack(r.x,r.y,D.right>=0?D.right:-1,D.center>=0?D.center:-1,D.left>=0?D.left:-1,D.vertical||-1,$,L,O,R,U,q,N,Z,G,K,X,c,F,T,V,E,J,0,f,H,Q,tt);}(e,p,l,n,i,s,C,e.layers[0],e.collisionBoxArray,r.index,r.sourceLayerIndex,e.index,g,[w,w,w,w],k,u,v,_,M,d,r,a,c,h,o);};if("line"===I)for(const t of Hc(r.geometry,0,0,$a,$a)){const r=rh(t,b,S,n.vertical||y,i,24,x,e.overscaling,$a);for(const n of r)y&&Sh(e,y.text,z,n)||B(t,n);}else if("line-center"===I){for(const t of r.geometry)if(t.length>1){const e=eh(t,S,n.vertical||y,i,24,x);e&&B(t,e);}}else if("Polygon"===r.type)for(const t of xr(r.geometry,0)){const e=ph(t,16);B(t[0],new Yc(e.x,e.y,0));}else if("LineString"===r.type)for(const t of r.geometry)B(t,new Yc(t[0].x,t[0].y,0));else if("Point"===r.type)for(const t of r.geometry)for(const e of t)B([e],new Yc(e.x,e.y,0));}function _h(t,e,r,n,i,a,o,l,u,c,h,p,f,d,y){const m=function(t,e,r,n,i,a,o,l){const u=n.layout.get("text-rotate").evaluate(a,{})*Math.PI/180,c=[];for(const t of e.positionedLines)for(const n of t.positionedGlyphs){if(!n.rect)continue;const a=n.rect||{};let h=Vu+1,p=!0,f=1,d=0;const y=(i||l)&&n.vertical,m=n.metrics.advance*n.scale/2;if(l&&e.verticalizable&&(d=t.lineOffset/2-(n.imageName?-(iu-n.metrics.width*n.scale)/2:(n.scale-1)*iu)),n.imageName){const t=o[n.imageName];p=t.sdf,f=t.pixelRatio,h=Fu/f;}const g=i?[n.x+m,n.y]:[0,0];let x=i?[0,0]:[n.x+m+r[0],n.y+r[1]-d],v=[0,0];y&&(v=x,x=[0,0]);const b=n.metrics.isDoubleResolution?2:1,w=(n.metrics.left-h)*n.scale-m+x[0],_=(-n.metrics.top-h)*n.scale+x[1],A=w+a.w/b*n.scale/f,S=_+a.h/b*n.scale/f,k=new s(w,_),M=new s(A,_),I=new s(w,S),z=new s(A,S);if(y){const t=new s(-m,m-Du),e=-Math.PI/2,r=iu/2-m,i=new s(5-Du-r,-(n.imageName?r:0)),a=new s(...v);k._rotateAround(e,t)._add(i)._add(a),M._rotateAround(e,t)._add(i)._add(a),I._rotateAround(e,t)._add(i)._add(a),z._rotateAround(e,t)._add(i)._add(a);}if(u){const t=Math.sin(u),e=Math.cos(u),r=[e,-t,t,e];k._matMult(r),M._matMult(r),I._matMult(r),z._matMult(r);}const P=new s(0,0),C=new s(0,0);c.push({tl:k,tr:M,bl:I,br:z,tex:a,writingMode:e.writingMode,glyphOffset:g,sectionIndex:n.sectionIndex,isSDF:p,pixelOffsetTL:P,pixelOffsetBR:C,minFontScaleX:0,minFontScaleY:0});}return c}(0,r,l,i,a,o,n,t.allowVerticalPlacement),g=t.textSizeData;let x=null;"source"===g.kind?(x=[nc*i.layout.get("text-size").evaluate(o,{})],x[0]>ic&&A(`${t.layerIds[0]}: Value for "text-size" is >= ${rc}. Reduce your "text-size".`)):"composite"===g.kind&&(x=[nc*d.compositeTextSizes[0].evaluate(o,{},y),nc*d.compositeTextSizes[1].evaluate(o,{},y)],(x[0]>ic||x[1]>ic)&&A(`${t.layerIds[0]}: Value for "text-size" is >= ${rc}. Reduce your "text-size".`)),t.addSymbols(t.text,m,x,l,a,o,c,e,u.lineStartIndex,u.lineLength,f,y);for(const e of h)p[e]=t.text.placedSymbolArray.length-1;return 4*m.length}function Ah(t){for(const e in t)return t[e];return null}function Sh(t,e,r,n){const i=t.compareText;if(e in i){const t=i[e];for(let e=t.length-1;e>=0;e--)if(n.dist(t[e])<r)return !0}else i[e]=[];return i[e].push(n),!1}const kh=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];class Mh{static from(t){if(!(t instanceof ArrayBuffer))throw new Error("Data must be an instance of ArrayBuffer.");const[e,r]=new Uint8Array(t,0,2);if(219!==e)throw new Error("Data does not appear to be in a KDBush format.");const n=r>>4;if(1!==n)throw new Error(`Got v${n} data when expected v1.`);const i=kh[15&r];if(!i)throw new Error("Unrecognized array type.");const[s]=new Uint16Array(t,2,1),[a]=new Uint32Array(t,4,1);return new Mh(a,s,i,t)}constructor(t,e=64,r=Float64Array,n){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535),this.ArrayType=r,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;const i=kh.indexOf(this.ArrayType),s=2*t*this.ArrayType.BYTES_PER_ELEMENT,a=t*this.IndexArrayType.BYTES_PER_ELEMENT,o=(8-a%8)%8;if(i<0)throw new Error(`Unexpected typed array class: ${r}.`);n&&n instanceof ArrayBuffer?(this.data=n,this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+a+o,2*t),this._pos=2*t,this._finished=!0):(this.data=new ArrayBuffer(8+s+a+o),this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+a+o,2*t),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,16+i]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t);}add(t,e){const r=this._pos>>1;return this.ids[r]=r,this.coords[this._pos++]=t,this.coords[this._pos++]=e,r}finish(){const t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return Ih(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,e,r,n){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:i,coords:s,nodeSize:a}=this,o=[0,i.length-1,0],l=[];for(;o.length;){const u=o.pop()||0,c=o.pop()||0,h=o.pop()||0;if(c-h<=a){for(let a=h;a<=c;a++){const o=s[2*a],u=s[2*a+1];o>=t&&o<=r&&u>=e&&u<=n&&l.push(i[a]);}continue}const p=h+c>>1,f=s[2*p],d=s[2*p+1];f>=t&&f<=r&&d>=e&&d<=n&&l.push(i[p]),(0===u?t<=f:e<=d)&&(o.push(h),o.push(p-1),o.push(1-u)),(0===u?r>=f:n>=d)&&(o.push(p+1),o.push(c),o.push(1-u));}return l}within(t,e,r){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:n,coords:i,nodeSize:s}=this,a=[0,n.length-1,0],o=[],l=r*r;for(;a.length;){const u=a.pop()||0,c=a.pop()||0,h=a.pop()||0;if(c-h<=s){for(let r=h;r<=c;r++)Bh(i[2*r],i[2*r+1],t,e)<=l&&o.push(n[r]);continue}const p=h+c>>1,f=i[2*p],d=i[2*p+1];Bh(f,d,t,e)<=l&&o.push(n[p]),(0===u?t-r<=f:e-r<=d)&&(a.push(h),a.push(p-1),a.push(1-u)),(0===u?t+r>=f:e+r>=d)&&(a.push(p+1),a.push(c),a.push(1-u));}return o}}function Ih(t,e,r,n,i,s){if(i-n<=r)return;const a=n+i>>1;zh(t,e,a,n,i,s),Ih(t,e,r,n,a-1,1-s),Ih(t,e,r,a+1,i,1-s);}function zh(t,e,r,n,i,s){for(;i>n;){if(i-n>600){const a=i-n+1,o=r-n+1,l=Math.log(a),u=.5*Math.exp(2*l/3),c=.5*Math.sqrt(l*u*(a-u)/a)*(o-a/2<0?-1:1);zh(t,e,r,Math.max(n,Math.floor(r-o*u/a+c)),Math.min(i,Math.floor(r+(a-o)*u/a+c)),s);}const a=e[2*r+s];let o=n,l=i;for(Ph(t,e,n,r),e[2*i+s]>a&&Ph(t,e,n,i);o<l;){for(Ph(t,e,o,l),o++,l--;e[2*o+s]<a;)o++;for(;e[2*l+s]>a;)l--;}e[2*n+s]===a?Ph(t,e,n,l):(l++,Ph(t,e,l,i)),l<=r&&(n=l+1),r<=l&&(i=l-1);}}function Ph(t,e,r,n){Ch(t,r,n),Ch(e,2*r,2*n),Ch(e,2*r+1,2*n+1);}function Ch(t,e,r){const n=t[e];t[e]=t[r],t[r]=n;}function Bh(t,e,r,n){const i=t-r,s=e-n;return i*i+s*s}var Vh;t.bg=void 0,(Vh=t.bg||(t.bg={})).create="create",Vh.load="load",Vh.fullLoad="fullLoad";let Eh=null,Fh=[];const Th=1e3/60,$h="loadTime",Lh="fullLoadTime",Dh={mark(t){performance.mark(t);},frame(t){const e=t;null!=Eh&&Fh.push(e-Eh),Eh=e;},clearMetrics(){Eh=null,Fh=[],performance.clearMeasures($h),performance.clearMeasures(Lh);for(const e in t.bg)performance.clearMarks(t.bg[e]);},getPerformanceMetrics(){performance.measure($h,t.bg.create,t.bg.load),performance.measure(Lh,t.bg.create,t.bg.fullLoad);const e=performance.getEntriesByName($h)[0].duration,r=performance.getEntriesByName(Lh)[0].duration,n=Fh.length,i=1/(Fh.reduce(((t,e)=>t+e),0)/n/1e3),s=Fh.filter((t=>t>Th)).reduce(((t,e)=>t+(e-Th)/Th),0);return {loadTime:e,fullLoadTime:r,fps:i,percentDroppedFrames:s/(n+s)*100,totalFrames:n}}};t.$=class extends ps{},t.A=oo,t.B=yi,t.C=function(t){if(null==M){const e=t.navigator?t.navigator.userAgent:null;M=!!t.safari||!(!e||!(/\b(iPad|iPhone|iPod)\b/.test(e)||e.match("Safari")&&!e.match("Chrome")));}return M},t.D=Ji,t.E=Z,t.F=class{constructor(t,e){this.target=t,this.mapId=e,this.resolveRejects={},this.tasks={},this.taskQueue=[],this.abortControllers={},this.messageHandlers={},this.invoker=new Ic((()=>this.process())),this.subscription=function(t,e,r,n){return t.addEventListener(e,r,!1),{unsubscribe:()=>{t.removeEventListener(e,r,!1);}}}(this.target,"message",(t=>this.receive(t))),this.globalScope=k(self)?t:window;}registerMessageHandler(t,e){this.messageHandlers[t]=e;}sendAsync(t,e){return new Promise(((r,n)=>{const i=Math.round(1e18*Math.random()).toString(36).substring(0,10);this.resolveRejects[i]={resolve:r,reject:n},e&&e.signal.addEventListener("abort",(()=>{delete this.resolveRejects[i];const e={id:i,type:"<cancel>",origin:location.origin,targetMapId:t.targetMapId,sourceMapId:this.mapId};this.target.postMessage(e);}),{once:!0});const s=[],a=Object.assign(Object.assign({},t),{id:i,sourceMapId:this.mapId,origin:location.origin,data:ki(t.data,s)});this.target.postMessage(a,{transfer:s});}))}receive(t){const e=t.data,r=e.id;if(!("file://"!==e.origin&&"file://"!==location.origin&&"resource://android"!==e.origin&&"resource://android"!==location.origin&&e.origin!==location.origin||e.targetMapId&&this.mapId!==e.targetMapId)){if("<cancel>"===e.type){delete this.tasks[r];const t=this.abortControllers[r];return delete this.abortControllers[r],void(t&&t.abort())}if(k(self)||e.mustQueue)return this.tasks[r]=e,this.taskQueue.push(r),void this.invoker.trigger();this.processTask(r,e);}}process(){if(0===this.taskQueue.length)return;const t=this.taskQueue.shift(),e=this.tasks[t];delete this.tasks[t],this.taskQueue.length>0&&this.invoker.trigger(),e&&this.processTask(t,e);}processTask(t,r){return e(this,void 0,void 0,(function*(){if("<response>"===r.type){const e=this.resolveRejects[t];if(delete this.resolveRejects[t],!e)return;return void(r.error?e.reject(Mi(r.error)):e.resolve(Mi(r.data)))}if(!this.messageHandlers[r.type])return void this.completeTask(t,new Error(`Could not find a registered handler for ${r.type}, map ID: ${this.mapId}, available handlers: ${Object.keys(this.messageHandlers).join(", ")}`));const e=Mi(r.data),n=new AbortController;this.abortControllers[t]=n;try{const i=yield this.messageHandlers[r.type](r.sourceMapId,e,n);this.completeTask(t,null,i);}catch(e){this.completeTask(t,e);}}))}completeTask(t,e,r){const n=[];delete this.abortControllers[t];const i={id:t,type:"<response>",sourceMapId:this.mapId,origin:location.origin,error:e?ki(e):null,data:ki(r,n)};this.target.postMessage(i,{transfer:n});}remove(){this.invoker.remove(),this.subscription.unsubscribe();}},t.G=$,t.H=function(){var t=new oo(16);return oo!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},t.I=Tu,t.J=function(t,e,r){var n,i,s,a,o,l,u,c,h,p,f,d,y=r[0],m=r[1],g=r[2];return e===t?(t[12]=e[0]*y+e[4]*m+e[8]*g+e[12],t[13]=e[1]*y+e[5]*m+e[9]*g+e[13],t[14]=e[2]*y+e[6]*m+e[10]*g+e[14],t[15]=e[3]*y+e[7]*m+e[11]*g+e[15]):(i=e[1],s=e[2],a=e[3],o=e[4],l=e[5],u=e[6],c=e[7],h=e[8],p=e[9],f=e[10],d=e[11],t[0]=n=e[0],t[1]=i,t[2]=s,t[3]=a,t[4]=o,t[5]=l,t[6]=u,t[7]=c,t[8]=h,t[9]=p,t[10]=f,t[11]=d,t[12]=n*y+o*m+h*g+e[12],t[13]=i*y+l*m+p*g+e[13],t[14]=s*y+u*m+f*g+e[14],t[15]=a*y+c*m+d*g+e[15]),t},t.K=function(t,e,r){var n=r[0],i=r[1],s=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*s,t[9]=e[9]*s,t[10]=e[10]*s,t[11]=e[11]*s,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},t.L=uo,t.M=function(t,e){const r={};for(let n=0;n<e.length;n++){const i=e[n];i in t&&(r[i]=t[i]);}return r},t.N=Pc,t.O=Vc,t.P=s,t.Q=Ec,t.R=Ao,t.S=jc,t.T=Zi,t.U=h,t.V=p,t.W=P,t.X=$a,t.Y=ls,t.Z=$c,t._=e,t.a=F,t.a$=function(t,e){var r=t[0],n=t[1],i=t[2],s=t[3],a=t[4],o=t[5],l=t[6],u=t[7],c=t[8],h=t[9],p=t[10],f=t[11],d=t[12],y=t[13],m=t[14],g=t[15],x=e[0],v=e[1],b=e[2],w=e[3],_=e[4],A=e[5],S=e[6],k=e[7],M=e[8],I=e[9],z=e[10],P=e[11],C=e[12],B=e[13],V=e[14],E=e[15];return Math.abs(r-x)<=ao*Math.max(1,Math.abs(r),Math.abs(x))&&Math.abs(n-v)<=ao*Math.max(1,Math.abs(n),Math.abs(v))&&Math.abs(i-b)<=ao*Math.max(1,Math.abs(i),Math.abs(b))&&Math.abs(s-w)<=ao*Math.max(1,Math.abs(s),Math.abs(w))&&Math.abs(a-_)<=ao*Math.max(1,Math.abs(a),Math.abs(_))&&Math.abs(o-A)<=ao*Math.max(1,Math.abs(o),Math.abs(A))&&Math.abs(l-S)<=ao*Math.max(1,Math.abs(l),Math.abs(S))&&Math.abs(u-k)<=ao*Math.max(1,Math.abs(u),Math.abs(k))&&Math.abs(c-M)<=ao*Math.max(1,Math.abs(c),Math.abs(M))&&Math.abs(h-I)<=ao*Math.max(1,Math.abs(h),Math.abs(I))&&Math.abs(p-z)<=ao*Math.max(1,Math.abs(p),Math.abs(z))&&Math.abs(f-P)<=ao*Math.max(1,Math.abs(f),Math.abs(P))&&Math.abs(d-C)<=ao*Math.max(1,Math.abs(d),Math.abs(C))&&Math.abs(y-B)<=ao*Math.max(1,Math.abs(y),Math.abs(B))&&Math.abs(m-V)<=ao*Math.max(1,Math.abs(m),Math.abs(V))&&Math.abs(g-E)<=ao*Math.max(1,Math.abs(g),Math.abs(E))},t.a0=oa,t.a1=Dc,t.a2=it,t.a3=t=>{const e=window.document.createElement("video");return e.muted=!0,new Promise((r=>{e.onloadstart=()=>{r(e);};for(const r of t){const t=window.document.createElement("source");j(r)||(e.crossOrigin="Anonymous"),t.src=r,e.appendChild(t);}}))},t.a4=function(){return x++},t.a5=Fs,t.a6=dc,t.a7=zn,t.a8=ja,t.a9=Nc,t.aA=function(t){if("custom"===t.type)return new Mc(t);switch(t.type){case"background":return new _c(t);case"circle":return new fo(t);case"fill":return new ul(t);case"fill-extrusion":return new El(t);case"heatmap":return new Mo(t);case"hillshade":return new Po(t);case"line":return new Hl(t);case"raster":return new kc(t);case"symbol":return new vc(t)}},t.aB=w,t.aC=function(t,e){if(!t)return [{command:"setStyle",args:[e]}];let r=[];try{if(!H(t.version,e.version))return [{command:"setStyle",args:[e]}];H(t.center,e.center)||r.push({command:"setCenter",args:[e.center]}),H(t.zoom,e.zoom)||r.push({command:"setZoom",args:[e.zoom]}),H(t.bearing,e.bearing)||r.push({command:"setBearing",args:[e.bearing]}),H(t.pitch,e.pitch)||r.push({command:"setPitch",args:[e.pitch]}),H(t.sprite,e.sprite)||r.push({command:"setSprite",args:[e.sprite]}),H(t.glyphs,e.glyphs)||r.push({command:"setGlyphs",args:[e.glyphs]}),H(t.transition,e.transition)||r.push({command:"setTransition",args:[e.transition]}),H(t.light,e.light)||r.push({command:"setLight",args:[e.light]}),H(t.terrain,e.terrain)||r.push({command:"setTerrain",args:[e.terrain]}),H(t.sky,e.sky)||r.push({command:"setSky",args:[e.sky]}),H(t.projection,e.projection)||r.push({command:"setProjection",args:[e.projection]});const n={},i=[];!function(t,e,r,n){let i;for(i in e=e||{},t=t||{})Object.prototype.hasOwnProperty.call(t,i)&&(Object.prototype.hasOwnProperty.call(e,i)||W(i,r,n));for(i in e)Object.prototype.hasOwnProperty.call(e,i)&&(Object.prototype.hasOwnProperty.call(t,i)?H(t[i],e[i])||("geojson"===t[i].type&&"geojson"===e[i].type&&tt(t,e,i)?Y(r,{command:"setGeoJSONSourceData",args:[i,e[i].data]}):Q(i,e,r,n)):J(i,e,r));}(t.sources,e.sources,i,n);const s=[];t.layers&&t.layers.forEach((t=>{"source"in t&&n[t.source]?r.push({command:"removeLayer",args:[t.id]}):s.push(t);})),r=r.concat(i),function(t,e,r){e=e||[];const n=(t=t||[]).map(rt),i=e.map(rt),s=t.reduce(nt,{}),a=e.reduce(nt,{}),o=n.slice(),l=Object.create(null);let u,c,h,p,f;for(let t=0,e=0;t<n.length;t++)u=n[t],Object.prototype.hasOwnProperty.call(a,u)?e++:(Y(r,{command:"removeLayer",args:[u]}),o.splice(o.indexOf(u,e),1));for(let t=0,e=0;t<i.length;t++)u=i[i.length-1-t],o[o.length-1-t]!==u&&(Object.prototype.hasOwnProperty.call(s,u)?(Y(r,{command:"removeLayer",args:[u]}),o.splice(o.lastIndexOf(u,o.length-e),1)):e++,p=o[o.length-t],Y(r,{command:"addLayer",args:[a[u],p]}),o.splice(o.length-t,0,u),l[u]=!0);for(let t=0;t<i.length;t++)if(u=i[t],c=s[u],h=a[u],!l[u]&&!H(c,h))if(H(c.source,h.source)&&H(c["source-layer"],h["source-layer"])&&H(c.type,h.type)){for(f in et(c.layout,h.layout,r,u,null,"setLayoutProperty"),et(c.paint,h.paint,r,u,null,"setPaintProperty"),H(c.filter,h.filter)||Y(r,{command:"setFilter",args:[u,h.filter]}),H(c.minzoom,h.minzoom)&&H(c.maxzoom,h.maxzoom)||Y(r,{command:"setLayerZoomRange",args:[u,h.minzoom,h.maxzoom]}),c)Object.prototype.hasOwnProperty.call(c,f)&&"layout"!==f&&"paint"!==f&&"filter"!==f&&"metadata"!==f&&"minzoom"!==f&&"maxzoom"!==f&&(0===f.indexOf("paint.")?et(c[f],h[f],r,u,f.slice(6),"setPaintProperty"):H(c[f],h[f])||Y(r,{command:"setLayerProperty",args:[u,f,h[f]]}));for(f in h)Object.prototype.hasOwnProperty.call(h,f)&&!Object.prototype.hasOwnProperty.call(c,f)&&"layout"!==f&&"paint"!==f&&"filter"!==f&&"metadata"!==f&&"minzoom"!==f&&"maxzoom"!==f&&(0===f.indexOf("paint.")?et(c[f],h[f],r,u,f.slice(6),"setPaintProperty"):H(c[f],h[f])||Y(r,{command:"setLayerProperty",args:[u,f,h[f]]}));}else Y(r,{command:"removeLayer",args:[u]}),p=o[o.lastIndexOf(u)+1],Y(r,{command:"addLayer",args:[h,p]});}(s,e.layers,r);}catch(t){console.warn("Unable to compute style diff:",t),r=[{command:"setStyle",args:[e]}];}return r},t.aD=function(t){const e=[],r=t.id;return void 0===r&&e.push({message:`layers.${r}: missing required property "id"`}),void 0===t.render&&e.push({message:`layers.${r}: missing required method "render"`}),t.renderingMode&&"2d"!==t.renderingMode&&"3d"!==t.renderingMode&&e.push({message:`layers.${r}: property "renderingMode" must be either "2d" or "3d"`}),e},t.aE=function t(e,r){if(Array.isArray(e)){if(!Array.isArray(r)||e.length!==r.length)return !1;for(let n=0;n<e.length;n++)if(!t(e[n],r[n]))return !1;return !0}if("object"==typeof e&&null!==e&&null!==r){if("object"!=typeof r)return !1;if(Object.keys(e).length!==Object.keys(r).length)return !1;for(const n in e)if(!t(e[n],r[n]))return !1;return !0}return e===r},t.aF=v,t.aG=b,t.aH=class extends wa{constructor(t,e){super(t,e),this.current=0;}set(t){this.current!==t&&(this.current=t,this.gl.uniform1i(this.location,t));}},t.aI=_a,t.aJ=class extends wa{constructor(t,e){super(t,e),this.current=ka;}set(t){if(t[12]!==this.current[12]||t[0]!==this.current[0])return this.current=t,void this.gl.uniformMatrix4fv(this.location,!1,t);for(let e=1;e<16;e++)if(t[e]!==this.current[e]){this.current=t,this.gl.uniformMatrix4fv(this.location,!1,t);break}}},t.aK=Aa,t.aL=Sa,t.aM=Kt,t.aN=class extends wa{constructor(t,e){super(t,e),this.current=[0,0,0];}set(t){t[0]===this.current[0]&&t[1]===this.current[1]&&t[2]===this.current[2]||(this.current=t,this.gl.uniform3f(this.location,t[0],t[1],t[2]));}},t.aO=class extends wa{constructor(t,e){super(t,e),this.current=[0,0];}set(t){t[0]===this.current[0]&&t[1]===this.current[1]||(this.current=t,this.gl.uniform2f(this.location,t[0],t[1]));}},t.aP=function(t,e,r,n,i,s,a){var o=1/(e-r),l=1/(n-i),u=1/(s-a);return t[0]=-2*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+r)*o,t[13]=(i+n)*l,t[14]=(a+s)*u,t[15]=1,t},t.aQ=ho,t.aR=class extends _s{},t.aS=eu,t.aT=class extends Ss{},t.aU=ko,t.aV=function(t){return t<=1?1:Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},t.aW=So,t.aX=Zs,t.aY=na,t.aZ=class extends Bs{},t.a_=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]&&t[6]===e[6]&&t[7]===e[7]&&t[8]===e[8]&&t[9]===e[9]&&t[10]===e[10]&&t[11]===e[11]&&t[12]===e[12]&&t[13]===e[13]&&t[14]===e[14]&&t[15]===e[15]},t.aa=function(t){const e={};if(t.replace(/(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g,((t,r,n,i)=>{const s=n||i;return e[r]=!s||s.toLowerCase(),""})),e["max-age"]){const t=parseInt(e["max-age"],10);isNaN(t)?delete e["max-age"]:e["max-age"]=t;}return e},t.ab=function(t,e){const r=[];for(const n in t)n in e||r.push(n);return r},t.ac=y,t.ad=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),s=e[0],a=e[1],o=e[2],l=e[3],u=e[4],c=e[5],h=e[6],p=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=s*i+u*n,t[1]=a*i+c*n,t[2]=o*i+h*n,t[3]=l*i+p*n,t[4]=u*i-s*n,t[5]=c*i-a*n,t[6]=h*i-o*n,t[7]=p*i-l*n,t},t.ae=function(t){var e=new oo(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},t.af=po,t.ag=function(t,e){let r=0,n=0;if("constant"===t.kind)n=t.layoutSize;else if("source"!==t.kind){const{interpolationType:i,minZoom:s,maxZoom:a}=t,o=i?y(Be.interpolationFactor(i,e,s,a),0,1):0;"camera"===t.kind?n=Ce.number(t.minSize,t.maxSize,o):r=o;}return {uSizeT:r,uSize:n}},t.ai=function(t,{uSize:e,uSizeT:r},{lowerSize:n,upperSize:i}){return "source"===t.kind?n/nc:"composite"===t.kind?Ce.number(n/nc,i/nc,r):e},t.aj=cc,t.ak=function(t,e,r,n){const i=e.y-t.y,a=e.x-t.x,o=n.y-r.y,l=n.x-r.x,u=o*a-l*i;if(0===u)return null;const c=(l*(t.y-r.y)-o*(t.x-r.x))/u;return new s(t.x+c*a,t.y+c*i)},t.al=Hc,t.am=qa,t.an=lo,t.ao=function(t){let e=1/0,r=1/0,n=-1/0,i=-1/0;for(const s of t)e=Math.min(e,s.x),r=Math.min(r,s.y),n=Math.max(n,s.x),i=Math.max(i,s.y);return [e,r,n,i]},t.ap=iu,t.ar=ac,t.as=function(t,e){var r=e[0],n=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8],h=e[9],p=e[10],f=e[11],d=e[12],y=e[13],m=e[14],g=e[15],x=r*o-n*a,v=r*l-i*a,b=r*u-s*a,w=n*l-i*o,_=n*u-s*o,A=i*u-s*l,S=c*y-h*d,k=c*m-p*d,M=c*g-f*d,I=h*m-p*y,z=h*g-f*y,P=p*g-f*m,C=x*P-v*z+b*I+w*M-_*k+A*S;return C?(t[0]=(o*P-l*z+u*I)*(C=1/C),t[1]=(i*z-n*P-s*I)*C,t[2]=(y*A-m*_+g*w)*C,t[3]=(p*_-h*A-f*w)*C,t[4]=(l*M-a*P-u*k)*C,t[5]=(r*P-i*M+s*k)*C,t[6]=(m*b-d*A-g*v)*C,t[7]=(c*A-p*b+f*v)*C,t[8]=(a*z-o*M+u*S)*C,t[9]=(n*M-r*z-s*S)*C,t[10]=(d*_-y*b+g*x)*C,t[11]=(h*b-c*_-f*x)*C,t[12]=(o*k-a*I-l*S)*C,t[13]=(r*I-n*k+i*S)*C,t[14]=(y*v-d*w-m*x)*C,t[15]=(c*w-h*v+p*x)*C,t):null},t.at=bh,t.au=Ju,t.av=Mh,t.aw=function(){const t={},e=G.$version;for(const r in G.$root){const n=G.$root[r];if(n.required){let i=null;i="version"===r?e:"array"===n.type?[]:{},null!=i&&(t[r]=i);}}return t},t.ax=Ii,t.ay=D,t.az=function(t){t=t.slice();const e=Object.create(null);for(let r=0;r<t.length;r++)e[t[r].id]=t[r];for(let r=0;r<t.length;r++)"ref"in t[r]&&(t[r]=X(t[r],e[t[r].ref]));return t},t.b=I,t.b0=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},t.b1=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t},t.b2=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},t.b3=m,t.b4=Oc,t.b5=Fc,t.b6=function(t,e,r,n,i){var s,a=1/Math.tan(e/2);return t[0]=a/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=i&&i!==1/0?(t[10]=(i+n)*(s=1/(n-i)),t[14]=2*i*n*s):(t[10]=-1,t[14]=-2*n),t},t.b7=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),s=e[4],a=e[5],o=e[6],l=e[7],u=e[8],c=e[9],h=e[10],p=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=s*i+u*n,t[5]=a*i+c*n,t[6]=o*i+h*n,t[7]=l*i+p*n,t[8]=u*i-s*n,t[9]=c*i-a*n,t[10]=h*i-o*n,t[11]=p*i-l*n,t},t.b8=f,t.b9=d,t.bA=su,t.bB=function(t){return t.message===V},t.bC=bn,t.bD=Ri,t.ba=function(t){return t*Math.PI/180},t.bb=function(t,e){const{x:r,y:n}=$c.fromLngLat(e);return !(t<0||t>25||n<0||n>=1||r<0||r>=1)},t.bc=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=e[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},t.bd=class extends hs{},t.be=zc,t.bf=Dh,t.bh=L,t.bi=function(t,e){F.REGISTERED_PROTOCOLS[t]=e;},t.bj=function(t){delete F.REGISTERED_PROTOCOLS[t];},t.bk=function(t,e){const r={};for(let n=0;n<t.length;n++){const i=e&&e[t[n].id]||Ln(t[n]);e&&(e[t[n].id]=i);let s=r[i];s||(s=r[i]=[]),s.push(t[n]);}const n=[];for(const t in r)n.push(r[t]);return n},t.bl=wi,t.bm=qc,t.bn=Zc,t.bo=$u,t.bp=function(e){e.bucket.createArrays(),e.bucket.tilePixelRatio=$a/(512*e.bucket.overscaling),e.bucket.compareText={},e.bucket.iconsNeedLinear=!1;const r=e.bucket.layers[0],n=r.layout,i=r._unevaluatedLayout._values,s={layoutIconSize:i["icon-size"].possiblyEvaluate(new Ui(e.bucket.zoom+1),e.canonical),layoutTextSize:i["text-size"].possiblyEvaluate(new Ui(e.bucket.zoom+1),e.canonical),textMaxSize:i["text-size"].possiblyEvaluate(new Ui(18))};if("composite"===e.bucket.textSizeData.kind){const{minZoom:t,maxZoom:r}=e.bucket.textSizeData;s.compositeTextSizes=[i["text-size"].possiblyEvaluate(new Ui(t),e.canonical),i["text-size"].possiblyEvaluate(new Ui(r),e.canonical)];}if("composite"===e.bucket.iconSizeData.kind){const{minZoom:t,maxZoom:r}=e.bucket.iconSizeData;s.compositeIconSizes=[i["icon-size"].possiblyEvaluate(new Ui(t),e.canonical),i["icon-size"].possiblyEvaluate(new Ui(r),e.canonical)];}const a=n.get("text-line-height")*iu,o="viewport"!==n.get("text-rotation-alignment")&&"point"!==n.get("symbol-placement"),l=n.get("text-keep-upright"),u=n.get("text-size");for(const i of e.bucket.features){const c=n.get("text-font").evaluate(i,{},e.canonical).join(","),h=u.evaluate(i,{},e.canonical),p=s.layoutTextSize.evaluate(i,{},e.canonical),f=s.layoutIconSize.evaluate(i,{},e.canonical),d={horizontal:{},vertical:void 0},y=i.text;let m,g=[0,0];if(y){const s=y.toString(),u=n.get("text-letter-spacing").evaluate(i,{},e.canonical)*iu,f=Ci(s)?u:0,m=n.get("text-anchor").evaluate(i,{},e.canonical),x=vh(r,i,e.canonical);if(!x){const t=n.get("text-radial-offset").evaluate(i,{},e.canonical);g=t?xh(m,[t*iu,gh]):n.get("text-offset").evaluate(i,{},e.canonical).map((t=>t*iu));}let v=o?"center":n.get("text-justify").evaluate(i,{},e.canonical);const b="point"===n.get("symbol-placement")?n.get("text-max-width").evaluate(i,{},e.canonical)*iu:1/0,w=()=>{e.bucket.allowVerticalPlacement&&Pi(s)&&(d.vertical=Ru(y,e.glyphMap,e.glyphPositions,e.imagePositions,c,b,a,m,"left",f,g,t.ah.vertical,!0,p,h));};if(!o&&x){const r=new Set;if("auto"===v)for(let t=0;t<x.values.length;t+=2)r.add(bh(x.values[t]));else r.add(v);let n=!1;for(const i of r)if(!d.horizontal[i])if(n)d.horizontal[i]=d.horizontal[0];else {const r=Ru(y,e.glyphMap,e.glyphPositions,e.imagePositions,c,b,a,"center",i,f,g,t.ah.horizontal,!1,p,h);r&&(d.horizontal[i]=r,n=1===r.positionedLines.length);}w();}else {"auto"===v&&(v=bh(m));const r=Ru(y,e.glyphMap,e.glyphPositions,e.imagePositions,c,b,a,m,v,f,g,t.ah.horizontal,!1,p,h);r&&(d.horizontal[v]=r),w(),Pi(s)&&o&&l&&(d.vertical=Ru(y,e.glyphMap,e.glyphPositions,e.imagePositions,c,b,a,m,v,f,g,t.ah.vertical,!1,p,h));}}let x=!1;if(i.icon&&i.icon.name){const t=e.imageMap[i.icon.name];t&&(m=Qu(e.imagePositions[i.icon.name],n.get("icon-offset").evaluate(i,{},e.canonical),n.get("icon-anchor").evaluate(i,{},e.canonical)),x=!!t.sdf,void 0===e.bucket.sdfIcons?e.bucket.sdfIcons=x:e.bucket.sdfIcons!==x&&A("Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer"),(t.pixelRatio!==e.bucket.pixelRatio||0!==n.get("icon-rotate").constantOr(1))&&(e.bucket.iconsNeedLinear=!0));}const v=Ah(d.horizontal)||d.vertical;e.bucket.iconsInText=!!v&&v.iconsInText,(v||m)&&wh(e.bucket,i,d,m,e.imageMap,s,p,f,g,x,e.canonical);}e.showCollisionBoxes&&e.bucket.generateCollisionDebugBuffers();},t.bq=ql,t.br=sl,t.bs=zl,t.bt=fl,t.bu=Iu,t.bv=class{constructor(t){this._marks={start:[t.url,"start"].join("#"),end:[t.url,"end"].join("#"),measure:t.url.toString()},performance.mark(this._marks.start);}finish(){performance.mark(this._marks.end);let t=performance.getEntriesByName(this._marks.measure);return 0===t.length&&(performance.measure(this._marks.measure,this._marks.start,this._marks.end),t=performance.getEntriesByName(this._marks.measure),performance.clearMarks(this._marks.start),performance.clearMarks(this._marks.end),performance.clearMeasures(this._marks.measure)),t}},t.bw=function(t,r,n,i,s){return e(this,void 0,void 0,(function*(){if(p())try{return yield P(t,r,n,i,s)}catch(t){}return function(t,e,r,n,i){const s=t.width,a=t.height;C&&B||(C=new OffscreenCanvas(s,a),B=C.getContext("2d",{willReadFrequently:!0})),C.width=s,C.height=a,B.drawImage(t,0,0,s,a);const o=B.getImageData(e,r,n,i);return B.clearRect(0,0,s,a),o.data}(t,r,n,i,s)}))},t.bx=Uc,t.by=r,t.bz=n,t.c=E,t.d=t=>e(void 0,void 0,void 0,(function*(){if(0===t.byteLength)return createImageBitmap(new ImageData(1,1));const e=new Blob([new Uint8Array(t)],{type:"image/png"});try{return createImageBitmap(e)}catch(t){throw new Error(`Could not load image because of ${t.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`)}})),t.e=g,t.f=t=>new Promise(((e,r)=>{const n=new Image;n.onload=()=>{e(n),URL.revokeObjectURL(n.src),n.onload=null,window.requestAnimationFrame((()=>{n.src=z;}));},n.onerror=()=>r(new Error("Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported."));const i=new Blob([new Uint8Array(t)],{type:"image/png"});n.src=t.byteLength?URL.createObjectURL(i):z;})),t.g=T,t.h=(t,e)=>O(g(t,{type:"json"}),e),t.i=k,t.j=N,t.k=q,t.l=(t,e)=>O(g(t,{type:"arrayBuffer"}),e),t.m=O,t.n=function(t){return new Iu(t).readFields(Pu,[])},t.o=_o,t.p=Eu,t.q=rs,t.r=di,t.s=j,t.t=xi,t.u=fi,t.v=G,t.w=A,t.x=function([t,e,r]){return e+=90,e*=Math.PI/180,r*=Math.PI/180,{x:t*Math.cos(e)*Math.sin(r),y:t*Math.sin(e)*Math.sin(r),z:t*Math.cos(r)}},t.y=Ce,t.z=Ui;}));
define("worker",["./shared"],(function(e){"use strict";class t{constructor(e){this.keyCache={},e&&this.replace(e);}replace(e){this._layerConfigs={},this._layers={},this.update(e,[]);}update(t,o){for(const o of t){this._layerConfigs[o.id]=o;const t=this._layers[o.id]=e.aA(o);t._featureFilter=e.a7(t.filter),this.keyCache[o.id]&&delete this.keyCache[o.id];}for(const e of o)delete this.keyCache[e],delete this._layerConfigs[e],delete this._layers[e];this.familiesBySource={};const i=e.bk(Object.values(this._layerConfigs),this.keyCache);for(const e of i){const t=e.map((e=>this._layers[e.id])),o=t[0];if("none"===o.visibility)continue;const i=o.source||"";let s=this.familiesBySource[i];s||(s=this.familiesBySource[i]={});const r=o.sourceLayer||"_geojsonTileLayer";let n=s[r];n||(n=s[r]=[]),n.push(t);}}}class o{constructor(t){const o={},i=[];for(const e in t){const s=t[e],r=o[e]={};for(const e in s){const t=s[+e];if(!t||0===t.bitmap.width||0===t.bitmap.height)continue;const o={x:0,y:0,w:t.bitmap.width+2,h:t.bitmap.height+2};i.push(o),r[e]={rect:o,metrics:t.metrics};}}const{w:s,h:r}=e.p(i),n=new e.o({width:s||1,height:r||1});for(const i in t){const s=t[i];for(const t in s){const r=s[+t];if(!r||0===r.bitmap.width||0===r.bitmap.height)continue;const a=o[i][t].rect;e.o.copy(r.bitmap,n,{x:0,y:0},{x:a.x+1,y:a.y+1},r.bitmap);}}this.image=n,this.positions=o;}}e.bl("GlyphAtlas",o);class i{constructor(t){this.tileID=new e.S(t.tileID.overscaledZ,t.tileID.wrap,t.tileID.canonical.z,t.tileID.canonical.x,t.tileID.canonical.y),this.uid=t.uid,this.zoom=t.zoom,this.pixelRatio=t.pixelRatio,this.tileSize=t.tileSize,this.source=t.source,this.overscaling=this.tileID.overscaleFactor(),this.showCollisionBoxes=t.showCollisionBoxes,this.collectResourceTiming=!!t.collectResourceTiming,this.returnDependencies=!!t.returnDependencies,this.promoteId=t.promoteId,this.inFlightDependencies=[];}parse(t,i,r,n){return e._(this,void 0,void 0,(function*(){this.status="parsing",this.data=t,this.collisionBoxArray=new e.a5;const a=new e.bm(Object.keys(t.layers).sort()),l=new e.bn(this.tileID,this.promoteId);l.bucketLayerIDs=[];const c={},u={featureIndex:l,iconDependencies:{},patternDependencies:{},glyphDependencies:{},availableImages:r},h=i.familiesBySource[this.source];for(const o in h){const i=t.layers[o];if(!i)continue;1===i.version&&e.w(`Vector tile source "${this.source}" layer "${o}" does not use vector tile spec v2 and therefore may have some rendering errors.`);const n=a.encode(o),d=[];for(let e=0;e<i.length;e++){const t=i.feature(e),s=l.getId(t,o);d.push({feature:t,id:s,index:e,sourceLayerIndex:n});}for(const t of h[o]){const o=t[0];o.source!==this.source&&e.w(`layer.source = ${o.source} does not equal this.source = ${this.source}`),o.minzoom&&this.zoom<Math.floor(o.minzoom)||o.maxzoom&&this.zoom>=o.maxzoom||"none"!==o.visibility&&(s(t,this.zoom,r),(c[o.id]=o.createBucket({index:l.bucketLayerIDs.length,layers:t,zoom:this.zoom,pixelRatio:this.pixelRatio,overscaling:this.overscaling,collisionBoxArray:this.collisionBoxArray,sourceLayerIndex:n,sourceID:this.source})).populate(d,u,this.tileID.canonical),l.bucketLayerIDs.push(t.map((e=>e.id))));}}const d=e.aF(u.glyphDependencies,(e=>Object.keys(e).map(Number)));this.inFlightDependencies.forEach((e=>null==e?void 0:e.abort())),this.inFlightDependencies=[];let f=Promise.resolve({});if(Object.keys(d).length){const e=new AbortController;this.inFlightDependencies.push(e),f=n.sendAsync({type:"GG",data:{stacks:d,source:this.source,tileID:this.tileID,type:"glyphs"}},e);}const g=Object.keys(u.iconDependencies);let p=Promise.resolve({});if(g.length){const e=new AbortController;this.inFlightDependencies.push(e),p=n.sendAsync({type:"GI",data:{icons:g,source:this.source,tileID:this.tileID,type:"icons"}},e);}const m=Object.keys(u.patternDependencies);let y=Promise.resolve({});if(m.length){const e=new AbortController;this.inFlightDependencies.push(e),y=n.sendAsync({type:"GI",data:{icons:m,source:this.source,tileID:this.tileID,type:"patterns"}},e);}const[v,w,x]=yield Promise.all([f,p,y]),b=new o(v),S=new e.bo(w,x);for(const t in c){const o=c[t];o instanceof e.a6?(s(o.layers,this.zoom,r),e.bp({bucket:o,glyphMap:v,glyphPositions:b.positions,imageMap:w,imagePositions:S.iconPositions,showCollisionBoxes:this.showCollisionBoxes,canonical:this.tileID.canonical})):o.hasPattern&&(o instanceof e.bq||o instanceof e.br||o instanceof e.bs)&&(s(o.layers,this.zoom,r),o.addFeatures(u,this.tileID.canonical,S.patternPositions));}return this.status="done",{buckets:Object.values(c).filter((e=>!e.isEmpty())),featureIndex:l,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:b.image,imageAtlas:S,glyphMap:this.returnDependencies?v:null,iconMap:this.returnDependencies?w:null,glyphPositions:this.returnDependencies?b.positions:null}}))}}function s(t,o,i){const s=new e.z(o);for(const e of t)e.recalculate(s,i);}class r{constructor(e,t,o){this.actor=e,this.layerIndex=t,this.availableImages=o,this.fetching={},this.loading={},this.loaded={};}loadVectorTile(t,o){return e._(this,void 0,void 0,(function*(){const i=yield e.l(t.request,o);try{return {vectorTile:new e.bt.VectorTile(new e.bu(i.data)),rawData:i.data,cacheControl:i.cacheControl,expires:i.expires}}catch(e){const o=new Uint8Array(i.data);let s=`Unable to parse the tile at ${t.request.url}, `;throw s+=31===o[0]&&139===o[1]?"please make sure the data is not gzipped and that you have configured the relevant header in the server":`got error: ${e.message}`,new Error(s)}}))}loadTile(t){return e._(this,void 0,void 0,(function*(){const o=t.uid,s=!!(t&&t.request&&t.request.collectResourceTiming)&&new e.bv(t.request),r=new i(t);this.loading[o]=r;const n=new AbortController;r.abort=n;try{const i=yield this.loadVectorTile(t,n);if(delete this.loading[o],!i)return null;const a=i.rawData,l={};i.expires&&(l.expires=i.expires),i.cacheControl&&(l.cacheControl=i.cacheControl);const c={};if(s){const e=s.finish();e&&(c.resourceTiming=JSON.parse(JSON.stringify(e)));}r.vectorTile=i.vectorTile;const u=r.parse(i.vectorTile,this.layerIndex,this.availableImages,this.actor);this.loaded[o]=r,this.fetching[o]={rawTileData:a,cacheControl:l,resourceTiming:c};try{const t=yield u;return e.e({rawTileData:a.slice(0)},t,l,c)}finally{delete this.fetching[o];}}catch(e){throw delete this.loading[o],r.status="done",this.loaded[o]=r,e}}))}reloadTile(t){return e._(this,void 0,void 0,(function*(){const o=t.uid;if(!this.loaded||!this.loaded[o])throw new Error("Should not be trying to reload a tile that was never loaded or has been removed");const i=this.loaded[o];if(i.showCollisionBoxes=t.showCollisionBoxes,"parsing"===i.status){const t=yield i.parse(i.vectorTile,this.layerIndex,this.availableImages,this.actor);let s;if(this.fetching[o]){const{rawTileData:i,cacheControl:r,resourceTiming:n}=this.fetching[o];delete this.fetching[o],s=e.e({rawTileData:i.slice(0)},t,r,n);}else s=t;return s}if("done"===i.status&&i.vectorTile)return i.parse(i.vectorTile,this.layerIndex,this.availableImages,this.actor)}))}abortTile(t){return e._(this,void 0,void 0,(function*(){const e=this.loading,o=t.uid;e&&e[o]&&e[o].abort&&(e[o].abort.abort(),delete e[o]);}))}removeTile(t){return e._(this,void 0,void 0,(function*(){this.loaded&&this.loaded[t.uid]&&delete this.loaded[t.uid];}))}}class n{constructor(){this.loaded={};}loadTile(t){return e._(this,void 0,void 0,(function*(){const{uid:o,encoding:i,rawImageData:s,redFactor:r,greenFactor:n,blueFactor:a,baseShift:l}=t,c=s.width+2,u=s.height+2,h=e.b(s)?new e.R({width:c,height:u},yield e.bw(s,-1,-1,c,u)):s,d=new e.bx(o,h,i,r,n,a,l);return this.loaded=this.loaded||{},this.loaded[o]=d,d}))}removeTile(e){const t=this.loaded,o=e.uid;t&&t[o]&&delete t[o];}}function a(e,t){if(0!==e.length){l(e[0],t);for(var o=1;o<e.length;o++)l(e[o],!t);}}function l(e,t){for(var o=0,i=0,s=0,r=e.length,n=r-1;s<r;n=s++){var a=(e[s][0]-e[n][0])*(e[n][1]+e[s][1]),l=o+a;i+=Math.abs(o)>=Math.abs(a)?o-l+a:a-l+o,o=l;}o+i>=0!=!!t&&e.reverse();}var c=e.by((function e(t,o){var i,s=t&&t.type;if("FeatureCollection"===s)for(i=0;i<t.features.length;i++)e(t.features[i],o);else if("GeometryCollection"===s)for(i=0;i<t.geometries.length;i++)e(t.geometries[i],o);else if("Feature"===s)e(t.geometry,o);else if("Polygon"===s)a(t.coordinates,o);else if("MultiPolygon"===s)for(i=0;i<t.coordinates.length;i++)a(t.coordinates[i],o);return t}));const u=e.bt.VectorTileFeature.prototype.toGeoJSON;var h={exports:{}},d=e.bz,f=e.bt.VectorTileFeature,g=p;function p(e,t){this.options=t||{},this.features=e,this.length=e.length;}function m(e,t){this.id="number"==typeof e.id?e.id:void 0,this.type=e.type,this.rawGeometry=1===e.type?[e.geometry]:e.geometry,this.properties=e.tags,this.extent=t||4096;}p.prototype.feature=function(e){return new m(this.features[e],this.options.extent)},m.prototype.loadGeometry=function(){var e=this.rawGeometry;this.geometry=[];for(var t=0;t<e.length;t++){for(var o=e[t],i=[],s=0;s<o.length;s++)i.push(new d(o[s][0],o[s][1]));this.geometry.push(i);}return this.geometry},m.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var e=this.geometry,t=1/0,o=-1/0,i=1/0,s=-1/0,r=0;r<e.length;r++)for(var n=e[r],a=0;a<n.length;a++){var l=n[a];t=Math.min(t,l.x),o=Math.max(o,l.x),i=Math.min(i,l.y),s=Math.max(s,l.y);}return [t,i,o,s]},m.prototype.toGeoJSON=f.prototype.toGeoJSON;var y=e.bA,v=g;function w(e){var t=new y;return function(e,t){for(var o in e.layers)t.writeMessage(3,x,e.layers[o]);}(e,t),t.finish()}function x(e,t){var o;t.writeVarintField(15,e.version||1),t.writeStringField(1,e.name||""),t.writeVarintField(5,e.extent||4096);var i={keys:[],values:[],keycache:{},valuecache:{}};for(o=0;o<e.length;o++)i.feature=e.feature(o),t.writeMessage(2,b,i);var s=i.keys;for(o=0;o<s.length;o++)t.writeStringField(3,s[o]);var r=i.values;for(o=0;o<r.length;o++)t.writeMessage(4,P,r[o]);}function b(e,t){var o=e.feature;void 0!==o.id&&t.writeVarintField(1,o.id),t.writeMessage(2,S,e),t.writeVarintField(3,o.type),t.writeMessage(4,I,o);}function S(e,t){var o=e.feature,i=e.keys,s=e.values,r=e.keycache,n=e.valuecache;for(var a in o.properties){var l=o.properties[a],c=r[a];if(null!==l){void 0===c&&(i.push(a),r[a]=c=i.length-1),t.writeVarint(c);var u=typeof l;"string"!==u&&"boolean"!==u&&"number"!==u&&(l=JSON.stringify(l));var h=u+":"+l,d=n[h];void 0===d&&(s.push(l),n[h]=d=s.length-1),t.writeVarint(d);}}}function _(e,t){return (t<<3)+(7&e)}function M(e){return e<<1^e>>31}function I(e,t){for(var o=e.loadGeometry(),i=e.type,s=0,r=0,n=o.length,a=0;a<n;a++){var l=o[a],c=1;1===i&&(c=l.length),t.writeVarint(_(1,c));for(var u=3===i?l.length-1:l.length,h=0;h<u;h++){1===h&&1!==i&&t.writeVarint(_(2,u-1));var d=l[h].x-s,f=l[h].y-r;t.writeVarint(M(d)),t.writeVarint(M(f)),s+=d,r+=f;}3===i&&t.writeVarint(_(7,1));}}function P(e,t){var o=typeof e;"string"===o?t.writeStringField(1,e):"boolean"===o?t.writeBooleanField(7,e):"number"===o&&(e%1!=0?t.writeDoubleField(3,e):e<0?t.writeSVarintField(6,e):t.writeVarintField(5,e));}h.exports=w,h.exports.fromVectorTileJs=w,h.exports.fromGeojsonVt=function(e,t){t=t||{};var o={};for(var i in e)o[i]=new v(e[i].features,t),o[i].name=i,o[i].version=t.version,o[i].extent=t.extent;return w({layers:o})},h.exports.GeoJSONWrapper=v;var k=e.by(h.exports);const T={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:e=>e},D=Math.fround||(C=new Float32Array(1),e=>(C[0]=+e,C[0]));var C;const L=3,O=5,F=6;class z{constructor(e){this.options=Object.assign(Object.create(T),e),this.trees=new Array(this.options.maxZoom+1),this.stride=this.options.reduce?7:6,this.clusterProps=[];}load(e){const{log:t,minZoom:o,maxZoom:i}=this.options;t&&console.time("total time");const s=`prepare ${e.length} points`;t&&console.time(s),this.points=e;const r=[];for(let t=0;t<e.length;t++){const o=e[t];if(!o.geometry)continue;const[i,s]=o.geometry.coordinates,n=D(G(i)),a=D(j(s));r.push(n,a,1/0,t,-1,1),this.options.reduce&&r.push(0);}let n=this.trees[i+1]=this._createTree(r);t&&console.timeEnd(s);for(let e=i;e>=o;e--){const o=+Date.now();n=this.trees[e]=this._createTree(this._cluster(n,e)),t&&console.log("z%d: %d clusters in %dms",e,n.numItems,+Date.now()-o);}return t&&console.timeEnd("total time"),this}getClusters(e,t){let o=((e[0]+180)%360+360)%360-180;const i=Math.max(-90,Math.min(90,e[1]));let s=180===e[2]?180:((e[2]+180)%360+360)%360-180;const r=Math.max(-90,Math.min(90,e[3]));if(e[2]-e[0]>=360)o=-180,s=180;else if(o>s){const e=this.getClusters([o,i,180,r],t),n=this.getClusters([-180,i,s,r],t);return e.concat(n)}const n=this.trees[this._limitZoom(t)],a=n.range(G(o),j(r),G(s),j(i)),l=n.data,c=[];for(const e of a){const t=this.stride*e;c.push(l[t+O]>1?A(l,t,this.clusterProps):this.points[l[t+L]]);}return c}getChildren(e){const t=this._getOriginId(e),o=this._getOriginZoom(e),i="No cluster with the specified id.",s=this.trees[o];if(!s)throw new Error(i);const r=s.data;if(t*this.stride>=r.length)throw new Error(i);const n=this.options.radius/(this.options.extent*Math.pow(2,o-1)),a=s.within(r[t*this.stride],r[t*this.stride+1],n),l=[];for(const t of a){const o=t*this.stride;r[o+4]===e&&l.push(r[o+O]>1?A(r,o,this.clusterProps):this.points[r[o+L]]);}if(0===l.length)throw new Error(i);return l}getLeaves(e,t,o){const i=[];return this._appendLeaves(i,e,t=t||10,o=o||0,0),i}getTile(e,t,o){const i=this.trees[this._limitZoom(e)],s=Math.pow(2,e),{extent:r,radius:n}=this.options,a=n/r,l=(o-a)/s,c=(o+1+a)/s,u={features:[]};return this._addTileFeatures(i.range((t-a)/s,l,(t+1+a)/s,c),i.data,t,o,s,u),0===t&&this._addTileFeatures(i.range(1-a/s,l,1,c),i.data,s,o,s,u),t===s-1&&this._addTileFeatures(i.range(0,l,a/s,c),i.data,-1,o,s,u),u.features.length?u:null}getClusterExpansionZoom(e){let t=this._getOriginZoom(e)-1;for(;t<=this.options.maxZoom;){const o=this.getChildren(e);if(t++,1!==o.length)break;e=o[0].properties.cluster_id;}return t}_appendLeaves(e,t,o,i,s){const r=this.getChildren(t);for(const t of r){const r=t.properties;if(r&&r.cluster?s+r.point_count<=i?s+=r.point_count:s=this._appendLeaves(e,r.cluster_id,o,i,s):s<i?s++:e.push(t),e.length===o)break}return s}_createTree(t){const o=new e.av(t.length/this.stride|0,this.options.nodeSize,Float32Array);for(let e=0;e<t.length;e+=this.stride)o.add(t[e],t[e+1]);return o.finish(),o.data=t,o}_addTileFeatures(e,t,o,i,s,r){for(const n of e){const e=n*this.stride,a=t[e+O]>1;let l,c,u;if(a)l=E(t,e,this.clusterProps),c=t[e],u=t[e+1];else {const o=this.points[t[e+L]];l=o.properties;const[i,s]=o.geometry.coordinates;c=G(i),u=j(s);}const h={type:1,geometry:[[Math.round(this.options.extent*(c*s-o)),Math.round(this.options.extent*(u*s-i))]],tags:l};let d;d=a||this.options.generateId?t[e+L]:this.points[t[e+L]].id,void 0!==d&&(h.id=d),r.features.push(h);}}_limitZoom(e){return Math.max(this.options.minZoom,Math.min(Math.floor(+e),this.options.maxZoom+1))}_cluster(e,t){const{radius:o,extent:i,reduce:s,minPoints:r}=this.options,n=o/(i*Math.pow(2,t)),a=e.data,l=[],c=this.stride;for(let o=0;o<a.length;o+=c){if(a[o+2]<=t)continue;a[o+2]=t;const i=a[o],u=a[o+1],h=e.within(a[o],a[o+1],n),d=a[o+O];let f=d;for(const e of h){const o=e*c;a[o+2]>t&&(f+=a[o+O]);}if(f>d&&f>=r){let e,r=i*d,n=u*d,g=-1;const p=((o/c|0)<<5)+(t+1)+this.points.length;for(const i of h){const l=i*c;if(a[l+2]<=t)continue;a[l+2]=t;const u=a[l+O];r+=a[l]*u,n+=a[l+1]*u,a[l+4]=p,s&&(e||(e=this._map(a,o,!0),g=this.clusterProps.length,this.clusterProps.push(e)),s(e,this._map(a,l)));}a[o+4]=p,l.push(r/f,n/f,1/0,p,-1,f),s&&l.push(g);}else {for(let e=0;e<c;e++)l.push(a[o+e]);if(f>1)for(const e of h){const o=e*c;if(!(a[o+2]<=t)){a[o+2]=t;for(let e=0;e<c;e++)l.push(a[o+e]);}}}}return l}_getOriginId(e){return e-this.points.length>>5}_getOriginZoom(e){return (e-this.points.length)%32}_map(e,t,o){if(e[t+O]>1){const i=this.clusterProps[e[t+F]];return o?Object.assign({},i):i}const i=this.points[e[t+L]].properties,s=this.options.map(i);return o&&s===i?Object.assign({},s):s}}function A(e,t,o){return {type:"Feature",id:e[t+L],properties:E(e,t,o),geometry:{type:"Point",coordinates:[(i=e[t],360*(i-.5)),R(e[t+1])]}};var i;}function E(e,t,o){const i=e[t+O],s=i>=1e4?`${Math.round(i/1e3)}k`:i>=1e3?Math.round(i/100)/10+"k":i,r=e[t+F],n=-1===r?{}:Object.assign({},o[r]);return Object.assign(n,{cluster:!0,cluster_id:e[t+L],point_count:i,point_count_abbreviated:s})}function G(e){return e/360+.5}function j(e){const t=Math.sin(e*Math.PI/180),o=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return o<0?0:o>1?1:o}function R(e){const t=(180-360*e)*Math.PI/180;return 360*Math.atan(Math.exp(t))/Math.PI-90}function Z(e,t,o,i){let s=i;const r=t+(o-t>>1);let n,a=o-t;const l=e[t],c=e[t+1],u=e[o],h=e[o+1];for(let i=t+3;i<o;i+=3){const t=N(e[i],e[i+1],l,c,u,h);if(t>s)n=i,s=t;else if(t===s){const e=Math.abs(i-r);e<a&&(n=i,a=e);}}s>i&&(n-t>3&&Z(e,t,n,i),e[n+2]=s,o-n>3&&Z(e,n,o,i));}function N(e,t,o,i,s,r){let n=s-o,a=r-i;if(0!==n||0!==a){const l=((e-o)*n+(t-i)*a)/(n*n+a*a);l>1?(o=s,i=r):l>0&&(o+=n*l,i+=a*l);}return n=e-o,a=t-i,n*n+a*a}function J(e,t,o,i){const s={id:null==e?null:e,type:t,geometry:o,tags:i,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};if("Point"===t||"MultiPoint"===t||"LineString"===t)W(s,o);else if("Polygon"===t)W(s,o[0]);else if("MultiLineString"===t)for(const e of o)W(s,e);else if("MultiPolygon"===t)for(const e of o)W(s,e[0]);return s}function W(e,t){for(let o=0;o<t.length;o+=3)e.minX=Math.min(e.minX,t[o]),e.minY=Math.min(e.minY,t[o+1]),e.maxX=Math.max(e.maxX,t[o]),e.maxY=Math.max(e.maxY,t[o+1]);}function Y(e,t,o,i){if(!t.geometry)return;const s=t.geometry.coordinates;if(s&&0===s.length)return;const r=t.geometry.type,n=Math.pow(o.tolerance/((1<<o.maxZoom)*o.extent),2);let a=[],l=t.id;if(o.promoteId?l=t.properties[o.promoteId]:o.generateId&&(l=i||0),"Point"===r)V(s,a);else if("MultiPoint"===r)for(const e of s)V(e,a);else if("LineString"===r)X(s,a,n,!1);else if("MultiLineString"===r){if(o.lineMetrics){for(const o of s)a=[],X(o,a,n,!1),e.push(J(l,"LineString",a,t.properties));return}q(s,a,n,!1);}else if("Polygon"===r)q(s,a,n,!0);else {if("MultiPolygon"!==r){if("GeometryCollection"===r){for(const s of t.geometry.geometries)Y(e,{id:l,geometry:s,properties:t.properties},o,i);return}throw new Error("Input data is not a valid GeoJSON object.")}for(const e of s){const t=[];q(e,t,n,!0),a.push(t);}}e.push(J(l,r,a,t.properties));}function V(e,t){t.push(H(e[0]),B(e[1]),0);}function X(e,t,o,i){let s,r,n=0;for(let o=0;o<e.length;o++){const a=H(e[o][0]),l=B(e[o][1]);t.push(a,l,0),o>0&&(n+=i?(s*l-a*r)/2:Math.sqrt(Math.pow(a-s,2)+Math.pow(l-r,2))),s=a,r=l;}const a=t.length-3;t[2]=1,Z(t,0,a,o),t[a+2]=1,t.size=Math.abs(n),t.start=0,t.end=t.size;}function q(e,t,o,i){for(let s=0;s<e.length;s++){const r=[];X(e[s],r,o,i),t.push(r);}}function H(e){return e/360+.5}function B(e){const t=Math.sin(e*Math.PI/180),o=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return o<0?0:o>1?1:o}function U(e,t,o,i,s,r,n,a){if(i/=t,r>=(o/=t)&&n<i)return e;if(n<o||r>=i)return null;const l=[];for(const t of e){const e=t.geometry;let r=t.type;const n=0===s?t.minX:t.minY,c=0===s?t.maxX:t.maxY;if(n>=o&&c<i){l.push(t);continue}if(c<o||n>=i)continue;let u=[];if("Point"===r||"MultiPoint"===r)$(e,u,o,i,s);else if("LineString"===r)K(e,u,o,i,s,!1,a.lineMetrics);else if("MultiLineString"===r)ee(e,u,o,i,s,!1);else if("Polygon"===r)ee(e,u,o,i,s,!0);else if("MultiPolygon"===r)for(const t of e){const e=[];ee(t,e,o,i,s,!0),e.length&&u.push(e);}if(u.length){if(a.lineMetrics&&"LineString"===r){for(const e of u)l.push(J(t.id,r,e,t.tags));continue}"LineString"!==r&&"MultiLineString"!==r||(1===u.length?(r="LineString",u=u[0]):r="MultiLineString"),"Point"!==r&&"MultiPoint"!==r||(r=3===u.length?"Point":"MultiPoint"),l.push(J(t.id,r,u,t.tags));}}return l.length?l:null}function $(e,t,o,i,s){for(let r=0;r<e.length;r+=3){const n=e[r+s];n>=o&&n<=i&&te(t,e[r],e[r+1],e[r+2]);}}function K(e,t,o,i,s,r,n){let a=Q(e);const l=0===s?oe:ie;let c,u,h=e.start;for(let d=0;d<e.length-3;d+=3){const f=e[d],g=e[d+1],p=e[d+2],m=e[d+3],y=e[d+4],v=0===s?f:g,w=0===s?m:y;let x=!1;n&&(c=Math.sqrt(Math.pow(f-m,2)+Math.pow(g-y,2))),v<o?w>o&&(u=l(a,f,g,m,y,o),n&&(a.start=h+c*u)):v>i?w<i&&(u=l(a,f,g,m,y,i),n&&(a.start=h+c*u)):te(a,f,g,p),w<o&&v>=o&&(u=l(a,f,g,m,y,o),x=!0),w>i&&v<=i&&(u=l(a,f,g,m,y,i),x=!0),!r&&x&&(n&&(a.end=h+c*u),t.push(a),a=Q(e)),n&&(h+=c);}let d=e.length-3;const f=e[d],g=e[d+1],p=0===s?f:g;p>=o&&p<=i&&te(a,f,g,e[d+2]),d=a.length-3,r&&d>=3&&(a[d]!==a[0]||a[d+1]!==a[1])&&te(a,a[0],a[1],a[2]),a.length&&t.push(a);}function Q(e){const t=[];return t.size=e.size,t.start=e.start,t.end=e.end,t}function ee(e,t,o,i,s,r){for(const n of e)K(n,t,o,i,s,r,!1);}function te(e,t,o,i){e.push(t,o,i);}function oe(e,t,o,i,s,r){const n=(r-t)/(i-t);return te(e,r,o+(s-o)*n,1),n}function ie(e,t,o,i,s,r){const n=(r-o)/(s-o);return te(e,t+(i-t)*n,r,1),n}function se(e,t){const o=[];for(let i=0;i<e.length;i++){const s=e[i],r=s.type;let n;if("Point"===r||"MultiPoint"===r||"LineString"===r)n=re(s.geometry,t);else if("MultiLineString"===r||"Polygon"===r){n=[];for(const e of s.geometry)n.push(re(e,t));}else if("MultiPolygon"===r){n=[];for(const e of s.geometry){const o=[];for(const i of e)o.push(re(i,t));n.push(o);}}o.push(J(s.id,r,n,s.tags));}return o}function re(e,t){const o=[];o.size=e.size,void 0!==e.start&&(o.start=e.start,o.end=e.end);for(let i=0;i<e.length;i+=3)o.push(e[i]+t,e[i+1],e[i+2]);return o}function ne(e,t){if(e.transformed)return e;const o=1<<e.z,i=e.x,s=e.y;for(const r of e.features){const e=r.geometry,n=r.type;if(r.geometry=[],1===n)for(let n=0;n<e.length;n+=2)r.geometry.push(ae(e[n],e[n+1],t,o,i,s));else for(let n=0;n<e.length;n++){const a=[];for(let r=0;r<e[n].length;r+=2)a.push(ae(e[n][r],e[n][r+1],t,o,i,s));r.geometry.push(a);}}return e.transformed=!0,e}function ae(e,t,o,i,s,r){return [Math.round(o*(e*i-s)),Math.round(o*(t*i-r))]}function le(e,t,o,i,s){const r=t===s.maxZoom?0:s.tolerance/((1<<t)*s.extent),n={features:[],numPoints:0,numSimplified:0,numFeatures:e.length,source:null,x:o,y:i,z:t,transformed:!1,minX:2,minY:1,maxX:-1,maxY:0};for(const t of e)ce(n,t,r,s);return n}function ce(e,t,o,i){const s=t.geometry,r=t.type,n=[];if(e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),"Point"===r||"MultiPoint"===r)for(let t=0;t<s.length;t+=3)n.push(s[t],s[t+1]),e.numPoints++,e.numSimplified++;else if("LineString"===r)ue(n,s,e,o,!1,!1);else if("MultiLineString"===r||"Polygon"===r)for(let t=0;t<s.length;t++)ue(n,s[t],e,o,"Polygon"===r,0===t);else if("MultiPolygon"===r)for(let t=0;t<s.length;t++){const i=s[t];for(let t=0;t<i.length;t++)ue(n,i[t],e,o,!0,0===t);}if(n.length){let o=t.tags||null;if("LineString"===r&&i.lineMetrics){o={};for(const e in t.tags)o[e]=t.tags[e];o.mapbox_clip_start=s.start/s.size,o.mapbox_clip_end=s.end/s.size;}const a={geometry:n,type:"Polygon"===r||"MultiPolygon"===r?3:"LineString"===r||"MultiLineString"===r?2:1,tags:o};null!==t.id&&(a.id=t.id),e.features.push(a);}}function ue(e,t,o,i,s,r){const n=i*i;if(i>0&&t.size<(s?n:i))return void(o.numPoints+=t.length/3);const a=[];for(let e=0;e<t.length;e+=3)(0===i||t[e+2]>n)&&(o.numSimplified++,a.push(t[e],t[e+1])),o.numPoints++;s&&function(e,t){let o=0;for(let t=0,i=e.length,s=i-2;t<i;s=t,t+=2)o+=(e[t]-e[s])*(e[t+1]+e[s+1]);if(o>0===t)for(let t=0,o=e.length;t<o/2;t+=2){const i=e[t],s=e[t+1];e[t]=e[o-2-t],e[t+1]=e[o-1-t],e[o-2-t]=i,e[o-1-t]=s;}}(a,r),e.push(a);}const he={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,debug:0};class de{constructor(e,t){const o=(t=this.options=function(e,t){for(const o in t)e[o]=t[o];return e}(Object.create(he),t)).debug;if(o&&console.time("preprocess data"),t.maxZoom<0||t.maxZoom>24)throw new Error("maxZoom should be in the 0-24 range");if(t.promoteId&&t.generateId)throw new Error("promoteId and generateId cannot be used together.");let i=function(e,t){const o=[];if("FeatureCollection"===e.type)for(let i=0;i<e.features.length;i++)Y(o,e.features[i],t,i);else Y(o,"Feature"===e.type?e:{geometry:e},t);return o}(e,t);this.tiles={},this.tileCoords=[],o&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",t.indexMaxZoom,t.indexMaxPoints),console.time("generate tiles"),this.stats={},this.total=0),i=function(e,t){const o=t.buffer/t.extent;let i=e;const s=U(e,1,-1-o,o,0,-1,2,t),r=U(e,1,1-o,2+o,0,-1,2,t);return (s||r)&&(i=U(e,1,-o,1+o,0,-1,2,t)||[],s&&(i=se(s,1).concat(i)),r&&(i=i.concat(se(r,-1)))),i}(i,t),i.length&&this.splitTile(i,0,0,0),o&&(i.length&&console.log("features: %d, points: %d",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd("generate tiles"),console.log("tiles generated:",this.total,JSON.stringify(this.stats)));}splitTile(e,t,o,i,s,r,n){const a=[e,t,o,i],l=this.options,c=l.debug;for(;a.length;){i=a.pop(),o=a.pop(),t=a.pop(),e=a.pop();const u=1<<t,h=fe(t,o,i);let d=this.tiles[h];if(!d&&(c>1&&console.time("creation"),d=this.tiles[h]=le(e,t,o,i,l),this.tileCoords.push({z:t,x:o,y:i}),c)){c>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,o,i,d.numFeatures,d.numPoints,d.numSimplified),console.timeEnd("creation"));const e=`z${t}`;this.stats[e]=(this.stats[e]||0)+1,this.total++;}if(d.source=e,null==s){if(t===l.indexMaxZoom||d.numPoints<=l.indexMaxPoints)continue}else {if(t===l.maxZoom||t===s)continue;if(null!=s){const e=s-t;if(o!==r>>e||i!==n>>e)continue}}if(d.source=null,0===e.length)continue;c>1&&console.time("clipping");const f=.5*l.buffer/l.extent,g=.5-f,p=.5+f,m=1+f;let y=null,v=null,w=null,x=null,b=U(e,u,o-f,o+p,0,d.minX,d.maxX,l),S=U(e,u,o+g,o+m,0,d.minX,d.maxX,l);e=null,b&&(y=U(b,u,i-f,i+p,1,d.minY,d.maxY,l),v=U(b,u,i+g,i+m,1,d.minY,d.maxY,l),b=null),S&&(w=U(S,u,i-f,i+p,1,d.minY,d.maxY,l),x=U(S,u,i+g,i+m,1,d.minY,d.maxY,l),S=null),c>1&&console.timeEnd("clipping"),a.push(y||[],t+1,2*o,2*i),a.push(v||[],t+1,2*o,2*i+1),a.push(w||[],t+1,2*o+1,2*i),a.push(x||[],t+1,2*o+1,2*i+1);}}getTile(e,t,o){e=+e,t=+t,o=+o;const i=this.options,{extent:s,debug:r}=i;if(e<0||e>24)return null;const n=1<<e,a=fe(e,t=t+n&n-1,o);if(this.tiles[a])return ne(this.tiles[a],s);r>1&&console.log("drilling down to z%d-%d-%d",e,t,o);let l,c=e,u=t,h=o;for(;!l&&c>0;)c--,u>>=1,h>>=1,l=this.tiles[fe(c,u,h)];return l&&l.source?(r>1&&(console.log("found parent tile z%d-%d-%d",c,u,h),console.time("drilling down")),this.splitTile(l.source,c,u,h,e,t,o),r>1&&console.timeEnd("drilling down"),this.tiles[a]?ne(this.tiles[a],s):null):null}}function fe(e,t,o){return 32*((1<<e)*o+t)+e}function ge(e,t){return t?e.properties[t]:e.id}function pe(e,t){if(null==e)return !0;if("Feature"===e.type)return null!=ge(e,t);if("FeatureCollection"===e.type){const o=new Set;for(const i of e.features){const e=ge(i,t);if(null==e)return !1;if(o.has(e))return !1;o.add(e);}return !0}return !1}function me(e,t){const o=new Map;if(null==e);else if("Feature"===e.type)o.set(ge(e,t),e);else for(const i of e.features)o.set(ge(i,t),i);return o}class ye extends r{constructor(){super(...arguments),this._dataUpdateable=new Map;}loadVectorTile(t,o){return e._(this,void 0,void 0,(function*(){const o=t.tileID.canonical;if(!this._geoJSONIndex)throw new Error("Unable to parse the data into a cluster or geojson");const i=this._geoJSONIndex.getTile(o.z,o.x,o.y);if(!i)return null;const s=new class{constructor(t){this.layers={_geojsonTileLayer:this},this.name="_geojsonTileLayer",this.extent=e.X,this.length=t.length,this._features=t;}feature(t){return new class{constructor(t){this._feature=t,this.extent=e.X,this.type=t.type,this.properties=t.tags,"id"in t&&!isNaN(t.id)&&(this.id=parseInt(t.id,10));}loadGeometry(){if(1===this._feature.type){const t=[];for(const o of this._feature.geometry)t.push([new e.P(o[0],o[1])]);return t}{const t=[];for(const o of this._feature.geometry){const i=[];for(const t of o)i.push(new e.P(t[0],t[1]));t.push(i);}return t}}toGeoJSON(e,t,o){return u.call(this,e,t,o)}}(this._features[t])}}(i.features);let r=k(s);return 0===r.byteOffset&&r.byteLength===r.buffer.byteLength||(r=new Uint8Array(r)),{vectorTile:s,rawData:r.buffer}}))}loadData(t){return e._(this,void 0,void 0,(function*(){var o;null===(o=this._pendingRequest)||void 0===o||o.abort();const i=!!(t&&t.request&&t.request.collectResourceTiming)&&new e.bv(t.request);this._pendingRequest=new AbortController;try{this._pendingData=this.loadAndProcessGeoJSON(t,this._pendingRequest),this._geoJSONIndex=t.cluster?new z(function({superclusterOptions:t,clusterProperties:o}){if(!o||!t)return t;const i={},s={},r={accumulated:null,zoom:0},n={properties:null},a=Object.keys(o);for(const t of a){const[r,n]=o[t],a=e.bC(n),l=e.bC("string"==typeof r?[r,["accumulated"],["get",t]]:r);i[t]=a.value,s[t]=l.value;}return t.map=e=>{n.properties=e;const t={};for(const e of a)t[e]=i[e].evaluate(r,n);return t},t.reduce=(e,t)=>{n.properties=t;for(const t of a)r.accumulated=e[t],e[t]=s[t].evaluate(r,n);},t}(t)).load((yield this._pendingData).features):(s=yield this._pendingData,new de(s,t.geojsonVtOptions)),this.loaded={};const o={};if(i){const e=i.finish();e&&(o.resourceTiming={},o.resourceTiming[t.source]=JSON.parse(JSON.stringify(e)));}return o}catch(t){if(delete this._pendingRequest,e.bB(t))return {abandoned:!0};throw t}var s;}))}getData(){return e._(this,void 0,void 0,(function*(){return this._pendingData}))}reloadTile(e){const t=this.loaded;return t&&t[e.uid]?super.reloadTile(e):this.loadTile(e)}loadAndProcessGeoJSON(t,o){return e._(this,void 0,void 0,(function*(){let i=yield this.loadGeoJSON(t,o);if(delete this._pendingRequest,"object"!=typeof i)throw new Error(`Input data given to '${t.source}' is not a valid GeoJSON object.`);if(c(i,!0),t.filter){const o=e.bC(t.filter,{type:"boolean","property-type":"data-driven",overridable:!1,transition:!1});if("error"===o.result)throw new Error(o.value.map((e=>`${e.key}: ${e.message}`)).join(", "));const s=i.features.filter((e=>o.value.evaluate({zoom:0},e)));i={type:"FeatureCollection",features:s};}return i}))}loadGeoJSON(t,o){return e._(this,void 0,void 0,(function*(){const{promoteId:i}=t;if(t.request){const s=yield e.h(t.request,o);return this._dataUpdateable=pe(s.data,i)?me(s.data,i):void 0,s.data}if("string"==typeof t.data)try{const e=JSON.parse(t.data);return this._dataUpdateable=pe(e,i)?me(e,i):void 0,e}catch(e){throw new Error(`Input data given to '${t.source}' is not a valid GeoJSON object.`)}if(!t.dataDiff)throw new Error(`Input data given to '${t.source}' is not a valid GeoJSON object.`);if(!this._dataUpdateable)throw new Error(`Cannot update existing geojson data in ${t.source}`);return function(e,t,o){var i,s,r,n;if(t.removeAll&&e.clear(),t.remove)for(const o of t.remove)e.delete(o);if(t.add)for(const i of t.add){const t=ge(i,o);null!=t&&e.set(t,i);}if(t.update)for(const o of t.update){let t=e.get(o.id);if(null==t)continue;const a=!o.removeAllProperties&&((null===(i=o.removeProperties)||void 0===i?void 0:i.length)>0||(null===(s=o.addOrUpdateProperties)||void 0===s?void 0:s.length)>0);if((o.newGeometry||o.removeAllProperties||a)&&(t=Object.assign({},t),e.set(o.id,t),a&&(t.properties=Object.assign({},t.properties))),o.newGeometry&&(t.geometry=o.newGeometry),o.removeAllProperties)t.properties={};else if((null===(r=o.removeProperties)||void 0===r?void 0:r.length)>0)for(const e of o.removeProperties)Object.prototype.hasOwnProperty.call(t.properties,e)&&delete t.properties[e];if((null===(n=o.addOrUpdateProperties)||void 0===n?void 0:n.length)>0)for(const{key:e,value:i}of o.addOrUpdateProperties)t.properties[e]=i;}}(this._dataUpdateable,t.dataDiff,i),{type:"FeatureCollection",features:Array.from(this._dataUpdateable.values())}}))}removeSource(t){return e._(this,void 0,void 0,(function*(){this._pendingRequest&&this._pendingRequest.abort();}))}getClusterExpansionZoom(e){return this._geoJSONIndex.getClusterExpansionZoom(e.clusterId)}getClusterChildren(e){return this._geoJSONIndex.getChildren(e.clusterId)}getClusterLeaves(e){return this._geoJSONIndex.getLeaves(e.clusterId,e.limit,e.offset)}}class ve{constructor(t){this.self=t,this.actor=new e.F(t),this.layerIndexes={},this.availableImages={},this.workerSources={},this.demWorkerSources={},this.externalWorkerSourceTypes={},this.self.registerWorkerSource=(e,t)=>{if(this.externalWorkerSourceTypes[e])throw new Error(`Worker source with name "${e}" already registered.`);this.externalWorkerSourceTypes[e]=t;},this.self.addProtocol=e.bi,this.self.removeProtocol=e.bj,this.self.registerRTLTextPlugin=t=>{if(e.bD.isParsed())throw new Error("RTL text plugin already registered.");e.bD.setMethods(t);},this.actor.registerMessageHandler("LDT",((e,t)=>this._getDEMWorkerSource(e,t.source).loadTile(t))),this.actor.registerMessageHandler("RDT",((t,o)=>e._(this,void 0,void 0,(function*(){this._getDEMWorkerSource(t,o.source).removeTile(o);})))),this.actor.registerMessageHandler("GCEZ",((t,o)=>e._(this,void 0,void 0,(function*(){return this._getWorkerSource(t,o.type,o.source).getClusterExpansionZoom(o)})))),this.actor.registerMessageHandler("GCC",((t,o)=>e._(this,void 0,void 0,(function*(){return this._getWorkerSource(t,o.type,o.source).getClusterChildren(o)})))),this.actor.registerMessageHandler("GCL",((t,o)=>e._(this,void 0,void 0,(function*(){return this._getWorkerSource(t,o.type,o.source).getClusterLeaves(o)})))),this.actor.registerMessageHandler("LD",((e,t)=>this._getWorkerSource(e,t.type,t.source).loadData(t))),this.actor.registerMessageHandler("GD",((e,t)=>this._getWorkerSource(e,t.type,t.source).getData())),this.actor.registerMessageHandler("LT",((e,t)=>this._getWorkerSource(e,t.type,t.source).loadTile(t))),this.actor.registerMessageHandler("RT",((e,t)=>this._getWorkerSource(e,t.type,t.source).reloadTile(t))),this.actor.registerMessageHandler("AT",((e,t)=>this._getWorkerSource(e,t.type,t.source).abortTile(t))),this.actor.registerMessageHandler("RMT",((e,t)=>this._getWorkerSource(e,t.type,t.source).removeTile(t))),this.actor.registerMessageHandler("RS",((t,o)=>e._(this,void 0,void 0,(function*(){if(!this.workerSources[t]||!this.workerSources[t][o.type]||!this.workerSources[t][o.type][o.source])return;const e=this.workerSources[t][o.type][o.source];delete this.workerSources[t][o.type][o.source],void 0!==e.removeSource&&e.removeSource(o);})))),this.actor.registerMessageHandler("RM",(t=>e._(this,void 0,void 0,(function*(){delete this.layerIndexes[t],delete this.availableImages[t],delete this.workerSources[t],delete this.demWorkerSources[t];})))),this.actor.registerMessageHandler("SR",((t,o)=>e._(this,void 0,void 0,(function*(){this.referrer=o;})))),this.actor.registerMessageHandler("SRPS",((e,t)=>this._syncRTLPluginState(e,t))),this.actor.registerMessageHandler("IS",((t,o)=>e._(this,void 0,void 0,(function*(){this.self.importScripts(o);})))),this.actor.registerMessageHandler("SI",((e,t)=>this._setImages(e,t))),this.actor.registerMessageHandler("UL",((t,o)=>e._(this,void 0,void 0,(function*(){this._getLayerIndex(t).update(o.layers,o.removedIds);})))),this.actor.registerMessageHandler("SL",((t,o)=>e._(this,void 0,void 0,(function*(){this._getLayerIndex(t).replace(o);}))));}_setImages(t,o){return e._(this,void 0,void 0,(function*(){this.availableImages[t]=o;for(const e in this.workerSources[t]){const i=this.workerSources[t][e];for(const e in i)i[e].availableImages=o;}}))}_syncRTLPluginState(t,o){return e._(this,void 0,void 0,(function*(){if(e.bD.isParsed())return e.bD.getState();if("loading"!==o.pluginStatus)return e.bD.setState(o),o;const t=o.pluginURL;if(this.self.importScripts(t),e.bD.isParsed()){const o={pluginStatus:"loaded",pluginURL:t};return e.bD.setState(o),o}throw e.bD.setState({pluginStatus:"error",pluginURL:""}),new Error(`RTL Text Plugin failed to import scripts from ${t}`)}))}_getAvailableImages(e){let t=this.availableImages[e];return t||(t=[]),t}_getLayerIndex(e){let o=this.layerIndexes[e];return o||(o=this.layerIndexes[e]=new t),o}_getWorkerSource(e,t,o){if(this.workerSources[e]||(this.workerSources[e]={}),this.workerSources[e][t]||(this.workerSources[e][t]={}),!this.workerSources[e][t][o]){const i={sendAsync:(t,o)=>(t.targetMapId=e,this.actor.sendAsync(t,o))};switch(t){case"vector":this.workerSources[e][t][o]=new r(i,this._getLayerIndex(e),this._getAvailableImages(e));break;case"geojson":this.workerSources[e][t][o]=new ye(i,this._getLayerIndex(e),this._getAvailableImages(e));break;default:this.workerSources[e][t][o]=new this.externalWorkerSourceTypes[t](i,this._getLayerIndex(e),this._getAvailableImages(e));}}return this.workerSources[e][t][o]}_getDEMWorkerSource(e,t){return this.demWorkerSources[e]||(this.demWorkerSources[e]={}),this.demWorkerSources[e][t]||(this.demWorkerSources[e][t]=new n),this.demWorkerSources[e][t]}}return e.i(self)&&(self.worker=new ve(self)),ve}));
define("index",["exports","./shared"],(function(t,e){"use strict";var i="4.7.1";let a,s;const o={now:"undefined"!=typeof performance&&performance&&performance.now?performance.now.bind(performance):Date.now.bind(Date),frameAsync:t=>new Promise(((i,a)=>{const s=requestAnimationFrame(i);t.signal.addEventListener("abort",(()=>{cancelAnimationFrame(s),a(e.c());}));})),getImageData(t,e=0){return this.getImageCanvasContext(t).getImageData(-e,-e,t.width+2*e,t.height+2*e)},getImageCanvasContext(t){const e=window.document.createElement("canvas"),i=e.getContext("2d",{willReadFrequently:!0});if(!i)throw new Error("failed to create canvas 2d context");return e.width=t.width,e.height=t.height,i.drawImage(t,0,0,t.width,t.height),i},resolveURL:t=>(a||(a=document.createElement("a")),a.href=t,a.href),hardwareConcurrency:"undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,get prefersReducedMotion(){return !!matchMedia&&(null==s&&(s=matchMedia("(prefers-reduced-motion: reduce)")),s.matches)}};class r{static testProp(t){if(!r.docStyle)return t[0];for(let e=0;e<t.length;e++)if(t[e]in r.docStyle)return t[e];return t[0]}static create(t,e,i){const a=window.document.createElement(t);return void 0!==e&&(a.className=e),i&&i.appendChild(a),a}static createNS(t,e){return window.document.createElementNS(t,e)}static disableDrag(){r.docStyle&&r.selectProp&&(r.userSelect=r.docStyle[r.selectProp],r.docStyle[r.selectProp]="none");}static enableDrag(){r.docStyle&&r.selectProp&&(r.docStyle[r.selectProp]=r.userSelect);}static setTransform(t,e){t.style[r.transformProp]=e;}static addEventListener(t,e,i,a={}){t.addEventListener(e,i,"passive"in a?a:a.capture);}static removeEventListener(t,e,i,a={}){t.removeEventListener(e,i,"passive"in a?a:a.capture);}static suppressClickInternal(t){t.preventDefault(),t.stopPropagation(),window.removeEventListener("click",r.suppressClickInternal,!0);}static suppressClick(){window.addEventListener("click",r.suppressClickInternal,!0),window.setTimeout((()=>{window.removeEventListener("click",r.suppressClickInternal,!0);}),0);}static getScale(t){const e=t.getBoundingClientRect();return {x:e.width/t.offsetWidth||1,y:e.height/t.offsetHeight||1,boundingClientRect:e}}static getPoint(t,i,a){const s=i.boundingClientRect;return new e.P((a.clientX-s.left)/i.x-t.clientLeft,(a.clientY-s.top)/i.y-t.clientTop)}static mousePos(t,e){const i=r.getScale(t);return r.getPoint(t,i,e)}static touchPos(t,e){const i=[],a=r.getScale(t);for(let s=0;s<e.length;s++)i.push(r.getPoint(t,a,e[s]));return i}static mouseButton(t){return t.button}static remove(t){t.parentNode&&t.parentNode.removeChild(t);}}r.docStyle="undefined"!=typeof window&&window.document&&window.document.documentElement.style,r.selectProp=r.testProp(["userSelect","MozUserSelect","WebkitUserSelect","msUserSelect"]),r.transformProp=r.testProp(["transform","WebkitTransform"]);const n={supported:!1,testSupport:function(t){!c&&h&&(u?d(t):l=t);}};let l,h,c=!1,u=!1;function d(t){const e=t.createTexture();t.bindTexture(t.TEXTURE_2D,e);try{if(t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,h),t.isContextLost())return;n.supported=!0;}catch(t){}t.deleteTexture(e),c=!0;}var _;"undefined"!=typeof document&&(h=document.createElement("img"),h.onload=()=>{l&&d(l),l=null,u=!0;},h.onerror=()=>{c=!0,l=null;},h.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA="),function(t){let i,a,s,o;t.resetRequestQueue=()=>{i=[],a=0,s=0,o={};},t.addThrottleControl=t=>{const e=s++;return o[e]=t,e},t.removeThrottleControl=t=>{delete o[t],l();},t.getImage=(t,a,s=!0)=>new Promise(((o,r)=>{n.supported&&(t.headers||(t.headers={}),t.headers.accept="image/webp,*/*"),e.e(t,{type:"image"}),i.push({abortController:a,requestParameters:t,supportImageRefresh:s,state:"queued",onError:t=>{r(t);},onSuccess:t=>{o(t);}}),l();}));const r=t=>e._(this,void 0,void 0,(function*(){t.state="running";const{requestParameters:i,supportImageRefresh:s,onError:o,onSuccess:r,abortController:n}=t,c=!1===s&&!e.i(self)&&!e.g(i.url)&&(!i.headers||Object.keys(i.headers).reduce(((t,e)=>t&&"accept"===e),!0));a++;const u=c?h(i,n):e.m(i,n);try{const i=yield u;delete t.abortController,t.state="completed",i.data instanceof HTMLImageElement||e.b(i.data)?r(i):i.data&&r({data:yield(d=i.data,"function"==typeof createImageBitmap?e.d(d):e.f(d)),cacheControl:i.cacheControl,expires:i.expires});}catch(e){delete t.abortController,o(e);}finally{a--,l();}var d;})),l=()=>{const t=(()=>{for(const t of Object.keys(o))if(o[t]())return !0;return !1})()?e.a.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME:e.a.MAX_PARALLEL_IMAGE_REQUESTS;for(let e=a;e<t&&i.length>0;e++){const t=i.shift();t.abortController.signal.aborted?e--:r(t);}},h=(t,i)=>new Promise(((a,s)=>{const o=new Image,r=t.url,n=t.credentials;n&&"include"===n?o.crossOrigin="use-credentials":(n&&"same-origin"===n||!e.s(r))&&(o.crossOrigin="anonymous"),i.signal.addEventListener("abort",(()=>{o.src="",s(e.c());})),o.fetchPriority="high",o.onload=()=>{o.onerror=o.onload=null,a({data:o});},o.onerror=()=>{o.onerror=o.onload=null,i.signal.aborted||s(new Error("Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported."));},o.src=r;}));}(_||(_={})),_.resetRequestQueue();class p{constructor(t){this._transformRequestFn=t;}transformRequest(t,e){return this._transformRequestFn&&this._transformRequestFn(t,e)||{url:t}}setTransformRequest(t){this._transformRequestFn=t;}}function m(t){var i=new e.A(3);return i[0]=t[0],i[1]=t[1],i[2]=t[2],i}var f,g=function(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t[2]=e[2]-i[2],t};f=new e.A(3),e.A!=Float32Array&&(f[0]=0,f[1]=0,f[2]=0);var v=function(t){var e=t[0],i=t[1];return e*e+i*i};function x(t){const e=[];if("string"==typeof t)e.push({id:"default",url:t});else if(t&&t.length>0){const i=[];for(const{id:a,url:s}of t){const t=`${a}${s}`;-1===i.indexOf(t)&&(i.push(t),e.push({id:a,url:s}));}}return e}function y(t,e,i){const a=t.split("?");return a[0]+=`${e}${i}`,a.join("?")}!function(){var t=new e.A(2);e.A!=Float32Array&&(t[0]=0,t[1]=0);}();class b{constructor(t,e,i,a){this.context=t,this.format=i,this.texture=t.gl.createTexture(),this.update(e,a);}update(t,i,a){const{width:s,height:o}=t,r=!(this.size&&this.size[0]===s&&this.size[1]===o||a),{context:n}=this,{gl:l}=n;if(this.useMipmap=Boolean(i&&i.useMipmap),l.bindTexture(l.TEXTURE_2D,this.texture),n.pixelStoreUnpackFlipY.set(!1),n.pixelStoreUnpack.set(1),n.pixelStoreUnpackPremultiplyAlpha.set(this.format===l.RGBA&&(!i||!1!==i.premultiply)),r)this.size=[s,o],t instanceof HTMLImageElement||t instanceof HTMLCanvasElement||t instanceof HTMLVideoElement||t instanceof ImageData||e.b(t)?l.texImage2D(l.TEXTURE_2D,0,this.format,this.format,l.UNSIGNED_BYTE,t):l.texImage2D(l.TEXTURE_2D,0,this.format,s,o,0,this.format,l.UNSIGNED_BYTE,t.data);else {const{x:i,y:r}=a||{x:0,y:0};t instanceof HTMLImageElement||t instanceof HTMLCanvasElement||t instanceof HTMLVideoElement||t instanceof ImageData||e.b(t)?l.texSubImage2D(l.TEXTURE_2D,0,i,r,l.RGBA,l.UNSIGNED_BYTE,t):l.texSubImage2D(l.TEXTURE_2D,0,i,r,s,o,l.RGBA,l.UNSIGNED_BYTE,t.data);}this.useMipmap&&this.isSizePowerOfTwo()&&l.generateMipmap(l.TEXTURE_2D);}bind(t,e,i){const{context:a}=this,{gl:s}=a;s.bindTexture(s.TEXTURE_2D,this.texture),i!==s.LINEAR_MIPMAP_NEAREST||this.isSizePowerOfTwo()||(i=s.LINEAR),t!==this.filter&&(s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MAG_FILTER,t),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,i||t),this.filter=t),e!==this.wrap&&(s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,e),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,e),this.wrap=e);}isSizePowerOfTwo(){return this.size[0]===this.size[1]&&Math.log(this.size[0])/Math.LN2%1==0}destroy(){const{gl:t}=this.context;t.deleteTexture(this.texture),this.texture=null;}}function w(t){const{userImage:e}=t;return !!(e&&e.render&&e.render())&&(t.data.replace(new Uint8Array(e.data.buffer)),!0)}class T extends e.E{constructor(){super(),this.images={},this.updatedImages={},this.callbackDispatchedThisFrame={},this.loaded=!1,this.requestors=[],this.patterns={},this.atlasImage=new e.R({width:1,height:1}),this.dirty=!0;}isLoaded(){return this.loaded}setLoaded(t){if(this.loaded!==t&&(this.loaded=t,t)){for(const{ids:t,promiseResolve:e}of this.requestors)e(this._getImagesForIds(t));this.requestors=[];}}getImage(t){const i=this.images[t];if(i&&!i.data&&i.spriteData){const t=i.spriteData;i.data=new e.R({width:t.width,height:t.height},t.context.getImageData(t.x,t.y,t.width,t.height).data),i.spriteData=null;}return i}addImage(t,e){if(this.images[t])throw new Error(`Image id ${t} already exist, use updateImage instead`);this._validate(t,e)&&(this.images[t]=e);}_validate(t,i){let a=!0;const s=i.data||i.spriteData;return this._validateStretch(i.stretchX,s&&s.width)||(this.fire(new e.j(new Error(`Image "${t}" has invalid "stretchX" value`))),a=!1),this._validateStretch(i.stretchY,s&&s.height)||(this.fire(new e.j(new Error(`Image "${t}" has invalid "stretchY" value`))),a=!1),this._validateContent(i.content,i)||(this.fire(new e.j(new Error(`Image "${t}" has invalid "content" value`))),a=!1),a}_validateStretch(t,e){if(!t)return !0;let i=0;for(const a of t){if(a[0]<i||a[1]<a[0]||e<a[1])return !1;i=a[1];}return !0}_validateContent(t,e){if(!t)return !0;if(4!==t.length)return !1;const i=e.spriteData,a=i&&i.width||e.data.width,s=i&&i.height||e.data.height;return !(t[0]<0||a<t[0]||t[1]<0||s<t[1]||t[2]<0||a<t[2]||t[3]<0||s<t[3]||t[2]<t[0]||t[3]<t[1])}updateImage(t,e,i=!0){const a=this.getImage(t);if(i&&(a.data.width!==e.data.width||a.data.height!==e.data.height))throw new Error(`size mismatch between old image (${a.data.width}x${a.data.height}) and new image (${e.data.width}x${e.data.height}).`);e.version=a.version+1,this.images[t]=e,this.updatedImages[t]=!0;}removeImage(t){const e=this.images[t];delete this.images[t],delete this.patterns[t],e.userImage&&e.userImage.onRemove&&e.userImage.onRemove();}listImages(){return Object.keys(this.images)}getImages(t){return new Promise(((e,i)=>{let a=!0;if(!this.isLoaded())for(const e of t)this.images[e]||(a=!1);this.isLoaded()||a?e(this._getImagesForIds(t)):this.requestors.push({ids:t,promiseResolve:e});}))}_getImagesForIds(t){const i={};for(const a of t){let t=this.getImage(a);t||(this.fire(new e.k("styleimagemissing",{id:a})),t=this.getImage(a)),t?i[a]={data:t.data.clone(),pixelRatio:t.pixelRatio,sdf:t.sdf,version:t.version,stretchX:t.stretchX,stretchY:t.stretchY,content:t.content,textFitWidth:t.textFitWidth,textFitHeight:t.textFitHeight,hasRenderCallback:Boolean(t.userImage&&t.userImage.render)}:e.w(`Image "${a}" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.`);}return i}getPixelSize(){const{width:t,height:e}=this.atlasImage;return {width:t,height:e}}getPattern(t){const i=this.patterns[t],a=this.getImage(t);if(!a)return null;if(i&&i.position.version===a.version)return i.position;if(i)i.position.version=a.version;else {const i={w:a.data.width+2,h:a.data.height+2,x:0,y:0},s=new e.I(i,a);this.patterns[t]={bin:i,position:s};}return this._updatePatternAtlas(),this.patterns[t].position}bind(t){const e=t.gl;this.atlasTexture?this.dirty&&(this.atlasTexture.update(this.atlasImage),this.dirty=!1):this.atlasTexture=new b(t,this.atlasImage,e.RGBA),this.atlasTexture.bind(e.LINEAR,e.CLAMP_TO_EDGE);}_updatePatternAtlas(){const t=[];for(const e in this.patterns)t.push(this.patterns[e].bin);const{w:i,h:a}=e.p(t),s=this.atlasImage;s.resize({width:i||1,height:a||1});for(const t in this.patterns){const{bin:i}=this.patterns[t],a=i.x+1,o=i.y+1,r=this.getImage(t).data,n=r.width,l=r.height;e.R.copy(r,s,{x:0,y:0},{x:a,y:o},{width:n,height:l}),e.R.copy(r,s,{x:0,y:l-1},{x:a,y:o-1},{width:n,height:1}),e.R.copy(r,s,{x:0,y:0},{x:a,y:o+l},{width:n,height:1}),e.R.copy(r,s,{x:n-1,y:0},{x:a-1,y:o},{width:1,height:l}),e.R.copy(r,s,{x:0,y:0},{x:a+n,y:o},{width:1,height:l});}this.dirty=!0;}beginFrame(){this.callbackDispatchedThisFrame={};}dispatchRenderCallbacks(t){for(const i of t){if(this.callbackDispatchedThisFrame[i])continue;this.callbackDispatchedThisFrame[i]=!0;const t=this.getImage(i);t||e.w(`Image with ID: "${i}" was not found`),w(t)&&this.updateImage(i,t);}}}const I=1e20;function E(t,e,i,a,s,o,r,n,l){for(let h=e;h<e+a;h++)P(t,i*o+h,o,s,r,n,l);for(let h=i;h<i+s;h++)P(t,h*o+e,1,a,r,n,l);}function P(t,e,i,a,s,o,r){o[0]=0,r[0]=-I,r[1]=I,s[0]=t[e];for(let n=1,l=0,h=0;n<a;n++){s[n]=t[e+n*i];const a=n*n;do{const t=o[l];h=(s[n]-s[t]+a-t*t)/(n-t)/2;}while(h<=r[l]&&--l>-1);l++,o[l]=n,r[l]=h,r[l+1]=I;}for(let n=0,l=0;n<a;n++){for(;r[l+1]<n;)l++;const a=o[l],h=n-a;t[e+n*i]=s[a]+h*h;}}class C{constructor(t,e){this.requestManager=t,this.localIdeographFontFamily=e,this.entries={};}setURL(t){this.url=t;}getGlyphs(t){return e._(this,void 0,void 0,(function*(){const e=[];for(const i in t)for(const a of t[i])e.push(this._getAndCacheGlyphsPromise(i,a));const i=yield Promise.all(e),a={};for(const{stack:t,id:e,glyph:s}of i)a[t]||(a[t]={}),a[t][e]=s&&{id:s.id,bitmap:s.bitmap.clone(),metrics:s.metrics};return a}))}_getAndCacheGlyphsPromise(t,i){return e._(this,void 0,void 0,(function*(){let e=this.entries[t];e||(e=this.entries[t]={glyphs:{},requests:{},ranges:{}});let a=e.glyphs[i];if(void 0!==a)return {stack:t,id:i,glyph:a};if(a=this._tinySDF(e,t,i),a)return e.glyphs[i]=a,{stack:t,id:i,glyph:a};const s=Math.floor(i/256);if(256*s>65535)throw new Error("glyphs > 65535 not supported");if(e.ranges[s])return {stack:t,id:i,glyph:a};if(!this.url)throw new Error("glyphsUrl is not set");if(!e.requests[s]){const i=C.loadGlyphRange(t,s,this.url,this.requestManager);e.requests[s]=i;}const o=yield e.requests[s];for(const t in o)this._doesCharSupportLocalGlyph(+t)||(e.glyphs[+t]=o[+t]);return e.ranges[s]=!0,{stack:t,id:i,glyph:o[i]||null}}))}_doesCharSupportLocalGlyph(t){return !!this.localIdeographFontFamily&&/\p{Ideo}|\p{sc=Hang}|\p{sc=Hira}|\p{sc=Kana}/u.test(String.fromCodePoint(t))}_tinySDF(t,i,a){const s=this.localIdeographFontFamily;if(!s)return;if(!this._doesCharSupportLocalGlyph(a))return;let o=t.tinySDF;if(!o){let e="400";/bold/i.test(i)?e="900":/medium/i.test(i)?e="500":/light/i.test(i)&&(e="200"),o=t.tinySDF=new C.TinySDF({fontSize:48,buffer:6,radius:16,cutoff:.25,fontFamily:s,fontWeight:e});}const r=o.draw(String.fromCharCode(a));return {id:a,bitmap:new e.o({width:r.width||60,height:r.height||60},r.data),metrics:{width:r.glyphWidth/2||24,height:r.glyphHeight/2||24,left:r.glyphLeft/2+.5||0,top:r.glyphTop/2-27.5||-8,advance:r.glyphAdvance/2||24,isDoubleResolution:!0}}}}C.loadGlyphRange=function(t,i,a,s){return e._(this,void 0,void 0,(function*(){const o=256*i,r=o+255,n=s.transformRequest(a.replace("{fontstack}",t).replace("{range}",`${o}-${r}`),"Glyphs"),l=yield e.l(n,new AbortController);if(!l||!l.data)throw new Error(`Could not load glyph range. range: ${i}, ${o}-${r}`);const h={};for(const t of e.n(l.data))h[t.id]=t;return h}))},C.TinySDF=class{constructor({fontSize:t=24,buffer:e=3,radius:i=8,cutoff:a=.25,fontFamily:s="sans-serif",fontWeight:o="normal",fontStyle:r="normal"}={}){this.buffer=e,this.cutoff=a,this.radius=i;const n=this.size=t+4*e,l=this._createCanvas(n),h=this.ctx=l.getContext("2d",{willReadFrequently:!0});h.font=`${r} ${o} ${t}px ${s}`,h.textBaseline="alphabetic",h.textAlign="left",h.fillStyle="black",this.gridOuter=new Float64Array(n*n),this.gridInner=new Float64Array(n*n),this.f=new Float64Array(n),this.z=new Float64Array(n+1),this.v=new Uint16Array(n);}_createCanvas(t){const e=document.createElement("canvas");return e.width=e.height=t,e}draw(t){const{width:e,actualBoundingBoxAscent:i,actualBoundingBoxDescent:a,actualBoundingBoxLeft:s,actualBoundingBoxRight:o}=this.ctx.measureText(t),r=Math.ceil(i),n=Math.max(0,Math.min(this.size-this.buffer,Math.ceil(o-s))),l=Math.min(this.size-this.buffer,r+Math.ceil(a)),h=n+2*this.buffer,c=l+2*this.buffer,u=Math.max(h*c,0),d=new Uint8ClampedArray(u),_={data:d,width:h,height:c,glyphWidth:n,glyphHeight:l,glyphTop:r,glyphLeft:0,glyphAdvance:e};if(0===n||0===l)return _;const{ctx:p,buffer:m,gridInner:f,gridOuter:g}=this;p.clearRect(m,m,n,l),p.fillText(t,m,m+r);const v=p.getImageData(m,m,n,l);g.fill(I,0,u),f.fill(0,0,u);for(let t=0;t<l;t++)for(let e=0;e<n;e++){const i=v.data[4*(t*n+e)+3]/255;if(0===i)continue;const a=(t+m)*h+e+m;if(1===i)g[a]=0,f[a]=I;else {const t=.5-i;g[a]=t>0?t*t:0,f[a]=t<0?t*t:0;}}E(g,0,0,h,c,h,this.f,this.v,this.z),E(f,m,m,n,l,h,this.f,this.v,this.z);for(let t=0;t<u;t++){const e=Math.sqrt(g[t])-Math.sqrt(f[t]);d[t]=Math.round(255-255*(e/this.radius+this.cutoff));}return _}};class S{constructor(){this.specification=e.v.light.position;}possiblyEvaluate(t,i){return e.x(t.expression.evaluate(i))}interpolate(t,i,a){return {x:e.y.number(t.x,i.x,a),y:e.y.number(t.y,i.y,a),z:e.y.number(t.z,i.z,a)}}}let z;class D extends e.E{constructor(t){super(),z=z||new e.q({anchor:new e.D(e.v.light.anchor),position:new S,color:new e.D(e.v.light.color),intensity:new e.D(e.v.light.intensity)}),this._transitionable=new e.T(z),this.setLight(t),this._transitioning=this._transitionable.untransitioned();}getLight(){return this._transitionable.serialize()}setLight(t,i={}){if(!this._validate(e.r,t,i))for(const e in t){const i=t[e];e.endsWith("-transition")?this._transitionable.setTransition(e.slice(0,-11),i):this._transitionable.setValue(e,i);}}updateTransitions(t){this._transitioning=this._transitionable.transitioned(t,this._transitioning);}hasTransition(){return this._transitioning.hasTransition()}recalculate(t){this.properties=this._transitioning.possiblyEvaluate(t);}_validate(t,i,a){return (!a||!1!==a.validate)&&e.t(this,t.call(e.u,{value:i,style:{glyphs:!0,sprite:!0},styleSpec:e.v}))}}const M=new e.q({"sky-color":new e.D(e.v.sky["sky-color"]),"horizon-color":new e.D(e.v.sky["horizon-color"]),"fog-color":new e.D(e.v.sky["fog-color"]),"fog-ground-blend":new e.D(e.v.sky["fog-ground-blend"]),"horizon-fog-blend":new e.D(e.v.sky["horizon-fog-blend"]),"sky-horizon-blend":new e.D(e.v.sky["sky-horizon-blend"]),"atmosphere-blend":new e.D(e.v.sky["atmosphere-blend"])});class A extends e.E{constructor(t){super(),this._transitionable=new e.T(M),this.setSky(t),this._transitioning=this._transitionable.untransitioned(),this.recalculate(new e.z(0));}setSky(t,i={}){if(!this._validate(e.B,t,i)){t||(t={"sky-color":"transparent","horizon-color":"transparent","fog-color":"transparent","fog-ground-blend":1,"atmosphere-blend":0});for(const e in t){const i=t[e];e.endsWith("-transition")?this._transitionable.setTransition(e.slice(0,-11),i):this._transitionable.setValue(e,i);}}}getSky(){return this._transitionable.serialize()}updateTransitions(t){this._transitioning=this._transitionable.transitioned(t,this._transitioning);}hasTransition(){return this._transitioning.hasTransition()}recalculate(t){this.properties=this._transitioning.possiblyEvaluate(t);}_validate(t,i,a={}){return !1!==(null==a?void 0:a.validate)&&e.t(this,t.call(e.u,e.e({value:i,style:{glyphs:!0,sprite:!0},styleSpec:e.v})))}calculateFogBlendOpacity(t){return t<60?0:t<70?(t-60)/10:1}}class R{constructor(t,e){this.width=t,this.height=e,this.nextRow=0,this.data=new Uint8Array(this.width*this.height),this.dashEntry={};}getDash(t,e){const i=t.join(",")+String(e);return this.dashEntry[i]||(this.dashEntry[i]=this.addDash(t,e)),this.dashEntry[i]}getDashRanges(t,e,i){const a=[];let s=t.length%2==1?-t[t.length-1]*i:0,o=t[0]*i,r=!0;a.push({left:s,right:o,isDash:r,zeroLength:0===t[0]});let n=t[0];for(let e=1;e<t.length;e++){r=!r;const l=t[e];s=n*i,n+=l,o=n*i,a.push({left:s,right:o,isDash:r,zeroLength:0===l});}return a}addRoundDash(t,e,i){const a=e/2;for(let e=-i;e<=i;e++){const s=this.width*(this.nextRow+i+e);let o=0,r=t[o];for(let n=0;n<this.width;n++){n/r.right>1&&(r=t[++o]);const l=Math.abs(n-r.left),h=Math.abs(n-r.right),c=Math.min(l,h);let u;const d=e/i*(a+1);if(r.isDash){const t=a-Math.abs(d);u=Math.sqrt(c*c+t*t);}else u=a-Math.sqrt(c*c+d*d);this.data[s+n]=Math.max(0,Math.min(255,u+128));}}}addRegularDash(t){for(let e=t.length-1;e>=0;--e){const i=t[e],a=t[e+1];i.zeroLength?t.splice(e,1):a&&a.isDash===i.isDash&&(a.left=i.left,t.splice(e,1));}const e=t[0],i=t[t.length-1];e.isDash===i.isDash&&(e.left=i.left-this.width,i.right=e.right+this.width);const a=this.width*this.nextRow;let s=0,o=t[s];for(let e=0;e<this.width;e++){e/o.right>1&&(o=t[++s]);const i=Math.abs(e-o.left),r=Math.abs(e-o.right),n=Math.min(i,r);this.data[a+e]=Math.max(0,Math.min(255,(o.isDash?n:-n)+128));}}addDash(t,i){const a=i?7:0,s=2*a+1;if(this.nextRow+s>this.height)return e.w("LineAtlas out of space"),null;let o=0;for(let e=0;e<t.length;e++)o+=t[e];if(0!==o){const e=this.width/o,s=this.getDashRanges(t,this.width,e);i?this.addRoundDash(s,e,a):this.addRegularDash(s);}const r={y:(this.nextRow+a+.5)/this.height,height:2*a/this.height,width:o};return this.nextRow+=s,this.dirty=!0,r}bind(t){const e=t.gl;this.texture?(e.bindTexture(e.TEXTURE_2D,this.texture),this.dirty&&(this.dirty=!1,e.texSubImage2D(e.TEXTURE_2D,0,0,0,this.width,this.height,e.ALPHA,e.UNSIGNED_BYTE,this.data))):(this.texture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texImage2D(e.TEXTURE_2D,0,e.ALPHA,this.width,this.height,0,e.ALPHA,e.UNSIGNED_BYTE,this.data));}}const k="maplibre_preloaded_worker_pool";class L{constructor(){this.active={};}acquire(t){if(!this.workers)for(this.workers=[];this.workers.length<L.workerCount;)this.workers.push(new Worker(e.a.WORKER_URL));return this.active[t]=!0,this.workers.slice()}release(t){delete this.active[t],0===this.numActive()&&(this.workers.forEach((t=>{t.terminate();})),this.workers=null);}isPreloaded(){return !!this.active[k]}numActive(){return Object.keys(this.active).length}}const F=Math.floor(o.hardwareConcurrency/2);let B,O;function N(){return B||(B=new L),B}L.workerCount=e.C(globalThis)?Math.max(Math.min(F,3),1):1;class U{constructor(t,i){this.workerPool=t,this.actors=[],this.currentActor=0,this.id=i;const a=this.workerPool.acquire(i);for(let t=0;t<a.length;t++){const s=new e.F(a[t],i);s.name=`Worker ${t}`,this.actors.push(s);}if(!this.actors.length)throw new Error("No actors found")}broadcast(t,e){const i=[];for(const a of this.actors)i.push(a.sendAsync({type:t,data:e}));return Promise.all(i)}getActor(){return this.currentActor=(this.currentActor+1)%this.actors.length,this.actors[this.currentActor]}remove(t=!0){this.actors.forEach((t=>{t.remove();})),this.actors=[],t&&this.workerPool.release(this.id);}registerMessageHandler(t,e){for(const i of this.actors)i.registerMessageHandler(t,e);}}function j(){return O||(O=new U(N(),e.G),O.registerMessageHandler("GR",((t,i,a)=>e.m(i,a)))),O}function Z(t,i){const a=e.H();return e.J(a,a,[1,1,0]),e.K(a,a,[.5*t.width,.5*t.height,1]),e.L(a,a,t.calculatePosMatrix(i.toUnwrapped()))}function q(t,e,i,a,s,o){const r=function(t,e,i){if(t)for(const a of t){const t=e[a];if(t&&t.source===i&&"fill-extrusion"===t.type)return !0}else for(const t in e){const a=e[t];if(a.source===i&&"fill-extrusion"===a.type)return !0}return !1}(s&&s.layers,e,t.id),n=o.maxPitchScaleFactor(),l=t.tilesIn(a,n,r);l.sort(V);const h=[];for(const a of l)h.push({wrappedTileID:a.tileID.wrapped().key,queryResults:a.tile.queryRenderedFeatures(e,i,t._state,a.queryGeometry,a.cameraQueryGeometry,a.scale,s,o,n,Z(t.transform,a.tileID))});const c=function(t){const e={},i={};for(const a of t){const t=a.queryResults,s=a.wrappedTileID,o=i[s]=i[s]||{};for(const i in t){const a=t[i],s=o[i]=o[i]||{},r=e[i]=e[i]||[];for(const t of a)s[t.featureIndex]||(s[t.featureIndex]=!0,r.push(t));}}return e}(h);for(const e in c)c[e].forEach((e=>{const i=e.feature,a=t.getFeatureState(i.layer["source-layer"],i.id);i.source=i.layer.source,i.layer["source-layer"]&&(i.sourceLayer=i.layer["source-layer"]),i.state=a;}));return c}function V(t,e){const i=t.tileID,a=e.tileID;return i.overscaledZ-a.overscaledZ||i.canonical.y-a.canonical.y||i.wrap-a.wrap||i.canonical.x-a.canonical.x}function G(t,i,a){return e._(this,void 0,void 0,(function*(){let s=t;if(t.url?s=(yield e.h(i.transformRequest(t.url,"Source"),a)).data:yield o.frameAsync(a),!s)return null;const r=e.M(e.e(s,t),["tiles","minzoom","maxzoom","attribution","bounds","scheme","tileSize","encoding"]);return "vector_layers"in s&&s.vector_layers&&(r.vectorLayerIds=s.vector_layers.map((t=>t.id))),r}))}class H{constructor(t,e){t&&(e?this.setSouthWest(t).setNorthEast(e):Array.isArray(t)&&(4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1])));}setNorthEast(t){return this._ne=t instanceof e.N?new e.N(t.lng,t.lat):e.N.convert(t),this}setSouthWest(t){return this._sw=t instanceof e.N?new e.N(t.lng,t.lat):e.N.convert(t),this}extend(t){const i=this._sw,a=this._ne;let s,o;if(t instanceof e.N)s=t,o=t;else {if(!(t instanceof H))return Array.isArray(t)?4===t.length||t.every(Array.isArray)?this.extend(H.convert(t)):this.extend(e.N.convert(t)):t&&("lng"in t||"lon"in t)&&"lat"in t?this.extend(e.N.convert(t)):this;if(s=t._sw,o=t._ne,!s||!o)return this}return i||a?(i.lng=Math.min(s.lng,i.lng),i.lat=Math.min(s.lat,i.lat),a.lng=Math.max(o.lng,a.lng),a.lat=Math.max(o.lat,a.lat)):(this._sw=new e.N(s.lng,s.lat),this._ne=new e.N(o.lng,o.lat)),this}getCenter(){return new e.N((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)}getSouthWest(){return this._sw}getNorthEast(){return this._ne}getNorthWest(){return new e.N(this.getWest(),this.getNorth())}getSouthEast(){return new e.N(this.getEast(),this.getSouth())}getWest(){return this._sw.lng}getSouth(){return this._sw.lat}getEast(){return this._ne.lng}getNorth(){return this._ne.lat}toArray(){return [this._sw.toArray(),this._ne.toArray()]}toString(){return `LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`}isEmpty(){return !(this._sw&&this._ne)}contains(t){const{lng:i,lat:a}=e.N.convert(t);let s=this._sw.lng<=i&&i<=this._ne.lng;return this._sw.lng>this._ne.lng&&(s=this._sw.lng>=i&&i>=this._ne.lng),this._sw.lat<=a&&a<=this._ne.lat&&s}static convert(t){return t instanceof H?t:t?new H(t):t}static fromLngLat(t,i=0){const a=360*i/40075017,s=a/Math.cos(Math.PI/180*t.lat);return new H(new e.N(t.lng-s,t.lat-a),new e.N(t.lng+s,t.lat+a))}adjustAntiMeridian(){const t=new e.N(this._sw.lng,this._sw.lat),i=new e.N(this._ne.lng,this._ne.lat);return new H(t,t.lng>i.lng?new e.N(i.lng+360,i.lat):i)}}class W{constructor(t,e,i){this.bounds=H.convert(this.validateBounds(t)),this.minzoom=e||0,this.maxzoom=i||24;}validateBounds(t){return Array.isArray(t)&&4===t.length?[Math.max(-180,t[0]),Math.max(-90,t[1]),Math.min(180,t[2]),Math.min(90,t[3])]:[-180,-90,180,90]}contains(t){const i=Math.pow(2,t.z),a=Math.floor(e.O(this.bounds.getWest())*i),s=Math.floor(e.Q(this.bounds.getNorth())*i),o=Math.ceil(e.O(this.bounds.getEast())*i),r=Math.ceil(e.Q(this.bounds.getSouth())*i);return t.x>=a&&t.x<o&&t.y>=s&&t.y<r}}class $ extends e.E{constructor(t,i,a,s){if(super(),this.id=t,this.dispatcher=a,this.type="vector",this.minzoom=0,this.maxzoom=22,this.scheme="xyz",this.tileSize=512,this.reparseOverscaled=!0,this.isTileClipped=!0,this._loaded=!1,e.e(this,e.M(i,["url","scheme","tileSize","promoteId"])),this._options=e.e({type:"vector"},i),this._collectResourceTiming=i.collectResourceTiming,512!==this.tileSize)throw new Error("vector tile sources must have a tileSize of 512");this.setEventedParent(s);}load(){return e._(this,void 0,void 0,(function*(){this._loaded=!1,this.fire(new e.k("dataloading",{dataType:"source"})),this._tileJSONRequest=new AbortController;try{const t=yield G(this._options,this.map._requestManager,this._tileJSONRequest);this._tileJSONRequest=null,this._loaded=!0,this.map.style.sourceCaches[this.id].clearTiles(),t&&(e.e(this,t),t.bounds&&(this.tileBounds=new W(t.bounds,this.minzoom,this.maxzoom)),this.fire(new e.k("data",{dataType:"source",sourceDataType:"metadata"})),this.fire(new e.k("data",{dataType:"source",sourceDataType:"content"})));}catch(t){this._tileJSONRequest=null,this.fire(new e.j(t));}}))}loaded(){return this._loaded}hasTile(t){return !this.tileBounds||this.tileBounds.contains(t.canonical)}onAdd(t){this.map=t,this.load();}setSourceProperty(t){this._tileJSONRequest&&this._tileJSONRequest.abort(),t(),this.load();}setTiles(t){return this.setSourceProperty((()=>{this._options.tiles=t;})),this}setUrl(t){return this.setSourceProperty((()=>{this.url=t,this._options.url=t;})),this}onRemove(){this._tileJSONRequest&&(this._tileJSONRequest.abort(),this._tileJSONRequest=null);}serialize(){return e.e({},this._options)}loadTile(t){return e._(this,void 0,void 0,(function*(){const e=t.tileID.canonical.url(this.tiles,this.map.getPixelRatio(),this.scheme),i={request:this.map._requestManager.transformRequest(e,"Tile"),uid:t.uid,tileID:t.tileID,zoom:t.tileID.overscaledZ,tileSize:this.tileSize*t.tileID.overscaleFactor(),type:this.type,source:this.id,pixelRatio:this.map.getPixelRatio(),showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId};i.request.collectResourceTiming=this._collectResourceTiming;let a="RT";if(t.actor&&"expired"!==t.state){if("loading"===t.state)return new Promise(((e,i)=>{t.reloadPromise={resolve:e,reject:i};}))}else t.actor=this.dispatcher.getActor(),a="LT";t.abortController=new AbortController;try{const e=yield t.actor.sendAsync({type:a,data:i},t.abortController);if(delete t.abortController,t.aborted)return;this._afterTileLoadWorkerResponse(t,e);}catch(e){if(delete t.abortController,t.aborted)return;if(e&&404!==e.status)throw e;this._afterTileLoadWorkerResponse(t,null);}}))}_afterTileLoadWorkerResponse(t,e){if(e&&e.resourceTiming&&(t.resourceTiming=e.resourceTiming),e&&this.map._refreshExpiredTiles&&t.setExpiryData(e),t.loadVectorData(e,this.map.painter),t.reloadPromise){const e=t.reloadPromise;t.reloadPromise=null,this.loadTile(t).then(e.resolve).catch(e.reject);}}abortTile(t){return e._(this,void 0,void 0,(function*(){t.abortController&&(t.abortController.abort(),delete t.abortController),t.actor&&(yield t.actor.sendAsync({type:"AT",data:{uid:t.uid,type:this.type,source:this.id}}));}))}unloadTile(t){return e._(this,void 0,void 0,(function*(){t.unloadVectorData(),t.actor&&(yield t.actor.sendAsync({type:"RMT",data:{uid:t.uid,type:this.type,source:this.id}}));}))}hasTransition(){return !1}}class X extends e.E{constructor(t,i,a,s){super(),this.id=t,this.dispatcher=a,this.setEventedParent(s),this.type="raster",this.minzoom=0,this.maxzoom=22,this.roundZoom=!0,this.scheme="xyz",this.tileSize=512,this._loaded=!1,this._options=e.e({type:"raster"},i),e.e(this,e.M(i,["url","scheme","tileSize"]));}load(){return e._(this,void 0,void 0,(function*(){this._loaded=!1,this.fire(new e.k("dataloading",{dataType:"source"})),this._tileJSONRequest=new AbortController;try{const t=yield G(this._options,this.map._requestManager,this._tileJSONRequest);this._tileJSONRequest=null,this._loaded=!0,t&&(e.e(this,t),t.bounds&&(this.tileBounds=new W(t.bounds,this.minzoom,this.maxzoom)),this.fire(new e.k("data",{dataType:"source",sourceDataType:"metadata"})),this.fire(new e.k("data",{dataType:"source",sourceDataType:"content"})));}catch(t){this._tileJSONRequest=null,this.fire(new e.j(t));}}))}loaded(){return this._loaded}onAdd(t){this.map=t,this.load();}onRemove(){this._tileJSONRequest&&(this._tileJSONRequest.abort(),this._tileJSONRequest=null);}setSourceProperty(t){this._tileJSONRequest&&(this._tileJSONRequest.abort(),this._tileJSONRequest=null),t(),this.load();}setTiles(t){return this.setSourceProperty((()=>{this._options.tiles=t;})),this}setUrl(t){return this.setSourceProperty((()=>{this.url=t,this._options.url=t;})),this}serialize(){return e.e({},this._options)}hasTile(t){return !this.tileBounds||this.tileBounds.contains(t.canonical)}loadTile(t){return e._(this,void 0,void 0,(function*(){const e=t.tileID.canonical.url(this.tiles,this.map.getPixelRatio(),this.scheme);t.abortController=new AbortController;try{const i=yield _.getImage(this.map._requestManager.transformRequest(e,"Tile"),t.abortController,this.map._refreshExpiredTiles);if(delete t.abortController,t.aborted)return void(t.state="unloaded");if(i&&i.data){this.map._refreshExpiredTiles&&i.cacheControl&&i.expires&&t.setExpiryData({cacheControl:i.cacheControl,expires:i.expires});const e=this.map.painter.context,a=e.gl,s=i.data;t.texture=this.map.painter.getTileTexture(s.width),t.texture?t.texture.update(s,{useMipmap:!0}):(t.texture=new b(e,s,a.RGBA,{useMipmap:!0}),t.texture.bind(a.LINEAR,a.CLAMP_TO_EDGE,a.LINEAR_MIPMAP_NEAREST)),t.state="loaded";}}catch(e){if(delete t.abortController,t.aborted)t.state="unloaded";else if(e)throw t.state="errored",e}}))}abortTile(t){return e._(this,void 0,void 0,(function*(){t.abortController&&(t.abortController.abort(),delete t.abortController);}))}unloadTile(t){return e._(this,void 0,void 0,(function*(){t.texture&&this.map.painter.saveTileTexture(t.texture);}))}hasTransition(){return !1}}class K extends X{constructor(t,i,a,s){super(t,i,a,s),this.type="raster-dem",this.maxzoom=22,this._options=e.e({type:"raster-dem"},i),this.encoding=i.encoding||"mapbox",this.redFactor=i.redFactor,this.greenFactor=i.greenFactor,this.blueFactor=i.blueFactor,this.baseShift=i.baseShift;}loadTile(t){return e._(this,void 0,void 0,(function*(){const i=t.tileID.canonical.url(this.tiles,this.map.getPixelRatio(),this.scheme),a=this.map._requestManager.transformRequest(i,"Tile");t.neighboringTiles=this._getNeighboringTiles(t.tileID),t.abortController=new AbortController;try{const i=yield _.getImage(a,t.abortController,this.map._refreshExpiredTiles);if(delete t.abortController,t.aborted)return void(t.state="unloaded");if(i&&i.data){const a=i.data;this.map._refreshExpiredTiles&&i.cacheControl&&i.expires&&t.setExpiryData({cacheControl:i.cacheControl,expires:i.expires});const s=e.b(a)&&e.U()?a:yield this.readImageNow(a),o={type:this.type,uid:t.uid,source:this.id,rawImageData:s,encoding:this.encoding,redFactor:this.redFactor,greenFactor:this.greenFactor,blueFactor:this.blueFactor,baseShift:this.baseShift};if(!t.actor||"expired"===t.state){t.actor=this.dispatcher.getActor();const e=yield t.actor.sendAsync({type:"LDT",data:o});t.dem=e,t.needsHillshadePrepare=!0,t.needsTerrainPrepare=!0,t.state="loaded";}}}catch(e){if(delete t.abortController,t.aborted)t.state="unloaded";else if(e)throw t.state="errored",e}}))}readImageNow(t){return e._(this,void 0,void 0,(function*(){if("undefined"!=typeof VideoFrame&&e.V()){const i=t.width+2,a=t.height+2;try{return new e.R({width:i,height:a},yield e.W(t,-1,-1,i,a))}catch(t){}}return o.getImageData(t,1)}))}_getNeighboringTiles(t){const i=t.canonical,a=Math.pow(2,i.z),s=(i.x-1+a)%a,o=0===i.x?t.wrap-1:t.wrap,r=(i.x+1+a)%a,n=i.x+1===a?t.wrap+1:t.wrap,l={};return l[new e.S(t.overscaledZ,o,i.z,s,i.y).key]={backfilled:!1},l[new e.S(t.overscaledZ,n,i.z,r,i.y).key]={backfilled:!1},i.y>0&&(l[new e.S(t.overscaledZ,o,i.z,s,i.y-1).key]={backfilled:!1},l[new e.S(t.overscaledZ,t.wrap,i.z,i.x,i.y-1).key]={backfilled:!1},l[new e.S(t.overscaledZ,n,i.z,r,i.y-1).key]={backfilled:!1}),i.y+1<a&&(l[new e.S(t.overscaledZ,o,i.z,s,i.y+1).key]={backfilled:!1},l[new e.S(t.overscaledZ,t.wrap,i.z,i.x,i.y+1).key]={backfilled:!1},l[new e.S(t.overscaledZ,n,i.z,r,i.y+1).key]={backfilled:!1}),l}unloadTile(t){return e._(this,void 0,void 0,(function*(){t.demTexture&&this.map.painter.saveTileTexture(t.demTexture),t.fbo&&(t.fbo.destroy(),delete t.fbo),t.dem&&delete t.dem,delete t.neighboringTiles,t.state="unloaded",t.actor&&(yield t.actor.sendAsync({type:"RDT",data:{type:this.type,uid:t.uid,source:this.id}}));}))}}class J extends e.E{constructor(t,i,a,s){super(),this.id=t,this.type="geojson",this.minzoom=0,this.maxzoom=18,this.tileSize=512,this.isTileClipped=!0,this.reparseOverscaled=!0,this._removed=!1,this._pendingLoads=0,this.actor=a.getActor(),this.setEventedParent(s),this._data=i.data,this._options=e.e({},i),this._collectResourceTiming=i.collectResourceTiming,void 0!==i.maxzoom&&(this.maxzoom=i.maxzoom),i.type&&(this.type=i.type),i.attribution&&(this.attribution=i.attribution),this.promoteId=i.promoteId;const o=e.X/this.tileSize;void 0!==i.clusterMaxZoom&&this.maxzoom<=i.clusterMaxZoom&&e.w(`The maxzoom value "${this.maxzoom}" is expected to be greater than the clusterMaxZoom value "${i.clusterMaxZoom}".`),this.workerOptions=e.e({source:this.id,cluster:i.cluster||!1,geojsonVtOptions:{buffer:(void 0!==i.buffer?i.buffer:128)*o,tolerance:(void 0!==i.tolerance?i.tolerance:.375)*o,extent:e.X,maxZoom:this.maxzoom,lineMetrics:i.lineMetrics||!1,generateId:i.generateId||!1},superclusterOptions:{maxZoom:void 0!==i.clusterMaxZoom?i.clusterMaxZoom:this.maxzoom-1,minPoints:Math.max(2,i.clusterMinPoints||2),extent:e.X,radius:(i.clusterRadius||50)*o,log:!1,generateId:i.generateId||!1},clusterProperties:i.clusterProperties,filter:i.filter},i.workerOptions),"string"==typeof this.promoteId&&(this.workerOptions.promoteId=this.promoteId);}load(){return e._(this,void 0,void 0,(function*(){yield this._updateWorkerData();}))}onAdd(t){this.map=t,this.load();}setData(t){return this._data=t,this._updateWorkerData(),this}updateData(t){return this._updateWorkerData(t),this}getData(){return e._(this,void 0,void 0,(function*(){const t=e.e({type:this.type},this.workerOptions);return this.actor.sendAsync({type:"GD",data:t})}))}setClusterOptions(t){return this.workerOptions.cluster=t.cluster,t&&(void 0!==t.clusterRadius&&(this.workerOptions.superclusterOptions.radius=t.clusterRadius),void 0!==t.clusterMaxZoom&&(this.workerOptions.superclusterOptions.maxZoom=t.clusterMaxZoom)),this._updateWorkerData(),this}getClusterExpansionZoom(t){return this.actor.sendAsync({type:"GCEZ",data:{type:this.type,clusterId:t,source:this.id}})}getClusterChildren(t){return this.actor.sendAsync({type:"GCC",data:{type:this.type,clusterId:t,source:this.id}})}getClusterLeaves(t,e,i){return this.actor.sendAsync({type:"GCL",data:{type:this.type,source:this.id,clusterId:t,limit:e,offset:i}})}_updateWorkerData(t){return e._(this,void 0,void 0,(function*(){const i=e.e({type:this.type},this.workerOptions);t?i.dataDiff=t:"string"==typeof this._data?(i.request=this.map._requestManager.transformRequest(o.resolveURL(this._data),"Source"),i.request.collectResourceTiming=this._collectResourceTiming):i.data=JSON.stringify(this._data),this._pendingLoads++,this.fire(new e.k("dataloading",{dataType:"source"}));try{const t=yield this.actor.sendAsync({type:"LD",data:i});if(this._pendingLoads--,this._removed||t.abandoned)return void this.fire(new e.k("dataabort",{dataType:"source"}));let a=null;t.resourceTiming&&t.resourceTiming[this.id]&&(a=t.resourceTiming[this.id].slice(0));const s={dataType:"source"};this._collectResourceTiming&&a&&a.length>0&&e.e(s,{resourceTiming:a}),this.fire(new e.k("data",Object.assign(Object.assign({},s),{sourceDataType:"metadata"}))),this.fire(new e.k("data",Object.assign(Object.assign({},s),{sourceDataType:"content"})));}catch(t){if(this._pendingLoads--,this._removed)return void this.fire(new e.k("dataabort",{dataType:"source"}));this.fire(new e.j(t));}}))}loaded(){return 0===this._pendingLoads}loadTile(t){return e._(this,void 0,void 0,(function*(){const e=t.actor?"RT":"LT";t.actor=this.actor;const i={type:this.type,uid:t.uid,tileID:t.tileID,zoom:t.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:this.map.getPixelRatio(),showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId};t.abortController=new AbortController;const a=yield this.actor.sendAsync({type:e,data:i},t.abortController);delete t.abortController,t.unloadVectorData(),t.aborted||t.loadVectorData(a,this.map.painter,"RT"===e);}))}abortTile(t){return e._(this,void 0,void 0,(function*(){t.abortController&&(t.abortController.abort(),delete t.abortController),t.aborted=!0;}))}unloadTile(t){return e._(this,void 0,void 0,(function*(){t.unloadVectorData(),yield this.actor.sendAsync({type:"RMT",data:{uid:t.uid,type:this.type,source:this.id}});}))}onRemove(){this._removed=!0,this.actor.sendAsync({type:"RS",data:{type:this.type,source:this.id}});}serialize(){return e.e({},this._options,{type:this.type,data:this._data})}hasTransition(){return !1}}var Y=e.Y([{name:"a_pos",type:"Int16",components:2},{name:"a_texture_pos",type:"Int16",components:2}]);class Q extends e.E{constructor(t,e,i,a){super(),this.id=t,this.dispatcher=i,this.coordinates=e.coordinates,this.type="image",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this._loaded=!1,this.setEventedParent(a),this.options=e;}load(t){return e._(this,void 0,void 0,(function*(){this._loaded=!1,this.fire(new e.k("dataloading",{dataType:"source"})),this.url=this.options.url,this._request=new AbortController;try{const e=yield _.getImage(this.map._requestManager.transformRequest(this.url,"Image"),this._request);this._request=null,this._loaded=!0,e&&e.data&&(this.image=e.data,t&&(this.coordinates=t),this._finishLoading());}catch(t){this._request=null,this._loaded=!0,this.fire(new e.j(t));}}))}loaded(){return this._loaded}updateImage(t){return t.url?(this._request&&(this._request.abort(),this._request=null),this.options.url=t.url,this.load(t.coordinates).finally((()=>{this.texture=null;})),this):this}_finishLoading(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new e.k("data",{dataType:"source",sourceDataType:"metadata"})));}onAdd(t){this.map=t,this.load();}onRemove(){this._request&&(this._request.abort(),this._request=null);}setCoordinates(t){this.coordinates=t;const i=t.map(e.Z.fromLngLat);this.tileID=function(t){let i=1/0,a=1/0,s=-1/0,o=-1/0;for(const e of t)i=Math.min(i,e.x),a=Math.min(a,e.y),s=Math.max(s,e.x),o=Math.max(o,e.y);const r=Math.max(s-i,o-a),n=Math.max(0,Math.floor(-Math.log(r)/Math.LN2)),l=Math.pow(2,n);return new e.a1(n,Math.floor((i+s)/2*l),Math.floor((a+o)/2*l))}(i),this.minzoom=this.maxzoom=this.tileID.z;const a=i.map((t=>this.tileID.getTilePoint(t)._round()));return this._boundsArray=new e.$,this._boundsArray.emplaceBack(a[0].x,a[0].y,0,0),this._boundsArray.emplaceBack(a[1].x,a[1].y,e.X,0),this._boundsArray.emplaceBack(a[3].x,a[3].y,0,e.X),this._boundsArray.emplaceBack(a[2].x,a[2].y,e.X,e.X),this.boundsBuffer&&(this.boundsBuffer.destroy(),delete this.boundsBuffer),this.fire(new e.k("data",{dataType:"source",sourceDataType:"content"})),this}prepare(){if(0===Object.keys(this.tiles).length||!this.image)return;const t=this.map.painter.context,i=t.gl;this.boundsBuffer||(this.boundsBuffer=t.createVertexBuffer(this._boundsArray,Y.members)),this.boundsSegments||(this.boundsSegments=e.a0.simpleSegment(0,0,4,2)),this.texture||(this.texture=new b(t,this.image,i.RGBA),this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE));let a=!1;for(const t in this.tiles){const e=this.tiles[t];"loaded"!==e.state&&(e.state="loaded",e.texture=this.texture,a=!0);}a&&this.fire(new e.k("data",{dataType:"source",sourceDataType:"idle",sourceId:this.id}));}loadTile(t){return e._(this,void 0,void 0,(function*(){this.tileID&&this.tileID.equals(t.tileID.canonical)?(this.tiles[String(t.tileID.wrap)]=t,t.buckets={}):t.state="errored";}))}serialize(){return {type:"image",url:this.options.url,coordinates:this.coordinates}}hasTransition(){return !1}}class tt extends Q{constructor(t,e,i,a){super(t,e,i,a),this.roundZoom=!0,this.type="video",this.options=e;}load(){return e._(this,void 0,void 0,(function*(){this._loaded=!1;const t=this.options;this.urls=[];for(const e of t.urls)this.urls.push(this.map._requestManager.transformRequest(e,"Source").url);try{const t=yield e.a3(this.urls);if(this._loaded=!0,!t)return;this.video=t,this.video.loop=!0,this.video.addEventListener("playing",(()=>{this.map.triggerRepaint();})),this.map&&this.video.play(),this._finishLoading();}catch(t){this.fire(new e.j(t));}}))}pause(){this.video&&this.video.pause();}play(){this.video&&this.video.play();}seek(t){if(this.video){const i=this.video.seekable;t<i.start(0)||t>i.end(0)?this.fire(new e.j(new e.a2(`sources.${this.id}`,null,`Playback for this video can be set only between the ${i.start(0)} and ${i.end(0)}-second mark.`))):this.video.currentTime=t;}}getVideo(){return this.video}onAdd(t){this.map||(this.map=t,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)));}prepare(){if(0===Object.keys(this.tiles).length||this.video.readyState<2)return;const t=this.map.painter.context,i=t.gl;this.boundsBuffer||(this.boundsBuffer=t.createVertexBuffer(this._boundsArray,Y.members)),this.boundsSegments||(this.boundsSegments=e.a0.simpleSegment(0,0,4,2)),this.texture?this.video.paused||(this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE),i.texSubImage2D(i.TEXTURE_2D,0,0,0,i.RGBA,i.UNSIGNED_BYTE,this.video)):(this.texture=new b(t,this.video,i.RGBA),this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE));let a=!1;for(const t in this.tiles){const e=this.tiles[t];"loaded"!==e.state&&(e.state="loaded",e.texture=this.texture,a=!0);}a&&this.fire(new e.k("data",{dataType:"source",sourceDataType:"idle",sourceId:this.id}));}serialize(){return {type:"video",urls:this.urls,coordinates:this.coordinates}}hasTransition(){return this.video&&!this.video.paused}}class et extends Q{constructor(t,i,a,s){super(t,i,a,s),i.coordinates?Array.isArray(i.coordinates)&&4===i.coordinates.length&&!i.coordinates.some((t=>!Array.isArray(t)||2!==t.length||t.some((t=>"number"!=typeof t))))||this.fire(new e.j(new e.a2(`sources.${t}`,null,'"coordinates" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new e.j(new e.a2(`sources.${t}`,null,'missing required property "coordinates"'))),i.animate&&"boolean"!=typeof i.animate&&this.fire(new e.j(new e.a2(`sources.${t}`,null,'optional "animate" property must be a boolean value'))),i.canvas?"string"==typeof i.canvas||i.canvas instanceof HTMLCanvasElement||this.fire(new e.j(new e.a2(`sources.${t}`,null,'"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new e.j(new e.a2(`sources.${t}`,null,'missing required property "canvas"'))),this.options=i,this.animate=void 0===i.animate||i.animate;}load(){return e._(this,void 0,void 0,(function*(){this._loaded=!0,this.canvas||(this.canvas=this.options.canvas instanceof HTMLCanvasElement?this.options.canvas:document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new e.j(new Error("Canvas dimensions cannot be less than or equal to zero."))):(this.play=function(){this._playing=!0,this.map.triggerRepaint();},this.pause=function(){this._playing&&(this.prepare(),this._playing=!1);},this._finishLoading());}))}getCanvas(){return this.canvas}onAdd(t){this.map=t,this.load(),this.canvas&&this.animate&&this.play();}onRemove(){this.pause();}prepare(){let t=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,t=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,t=!0),this._hasInvalidDimensions())return;if(0===Object.keys(this.tiles).length)return;const i=this.map.painter.context,a=i.gl;this.boundsBuffer||(this.boundsBuffer=i.createVertexBuffer(this._boundsArray,Y.members)),this.boundsSegments||(this.boundsSegments=e.a0.simpleSegment(0,0,4,2)),this.texture?(t||this._playing)&&this.texture.update(this.canvas,{premultiply:!0}):this.texture=new b(i,this.canvas,a.RGBA,{premultiply:!0});let s=!1;for(const t in this.tiles){const e=this.tiles[t];"loaded"!==e.state&&(e.state="loaded",e.texture=this.texture,s=!0);}s&&this.fire(new e.k("data",{dataType:"source",sourceDataType:"idle",sourceId:this.id}));}serialize(){return {type:"canvas",coordinates:this.coordinates}}hasTransition(){return this._playing}_hasInvalidDimensions(){for(const t of [this.canvas.width,this.canvas.height])if(isNaN(t)||t<=0)return !0;return !1}}const it={},at=t=>{switch(t){case"geojson":return J;case"image":return Q;case"raster":return X;case"raster-dem":return K;case"vector":return $;case"video":return tt;case"canvas":return et}return it[t]},st="RTLPluginLoaded";class ot extends e.E{constructor(){super(...arguments),this.status="unavailable",this.url=null,this.dispatcher=j();}_syncState(t){return this.status=t,this.dispatcher.broadcast("SRPS",{pluginStatus:t,pluginURL:this.url}).catch((t=>{throw this.status="error",t}))}getRTLTextPluginStatus(){return this.status}clearRTLTextPlugin(){this.status="unavailable",this.url=null;}setRTLTextPlugin(t){return e._(this,arguments,void 0,(function*(t,e=!1){if(this.url)throw new Error("setRTLTextPlugin cannot be called multiple times.");if(this.url=o.resolveURL(t),!this.url)throw new Error(`requested url ${t} is invalid`);if("unavailable"===this.status){if(!e)return this._requestImport();this.status="deferred",this._syncState(this.status);}else if("requested"===this.status)return this._requestImport()}))}_requestImport(){return e._(this,void 0,void 0,(function*(){yield this._syncState("loading"),this.status="loaded",this.fire(new e.k(st));}))}lazyLoad(){"unavailable"===this.status?this.status="requested":"deferred"===this.status&&this._requestImport();}}let rt=null;function nt(){return rt||(rt=new ot),rt}class lt{constructor(t,i){this.timeAdded=0,this.fadeEndTime=0,this.tileID=t,this.uid=e.a4(),this.uses=0,this.tileSize=i,this.buckets={},this.expirationTime=null,this.queryPadding=0,this.hasSymbolBuckets=!1,this.hasRTLText=!1,this.dependencies={},this.rtt=[],this.rttCoords={},this.expiredRequestCount=0,this.state="loading";}registerFadeDuration(t){const e=t+this.timeAdded;e<this.fadeEndTime||(this.fadeEndTime=e);}wasRequested(){return "errored"===this.state||"loaded"===this.state||"reloading"===this.state}clearTextures(t){this.demTexture&&t.saveTileTexture(this.demTexture),this.demTexture=null;}loadVectorData(t,i,a){if(this.hasData()&&this.unloadVectorData(),this.state="loaded",t){t.featureIndex&&(this.latestFeatureIndex=t.featureIndex,t.rawTileData?(this.latestRawTileData=t.rawTileData,this.latestFeatureIndex.rawTileData=t.rawTileData):this.latestRawTileData&&(this.latestFeatureIndex.rawTileData=this.latestRawTileData)),this.collisionBoxArray=t.collisionBoxArray,this.buckets=function(t,e){const i={};if(!e)return i;for(const a of t){const t=a.layerIds.map((t=>e.getLayer(t))).filter(Boolean);if(0!==t.length){a.layers=t,a.stateDependentLayerIds&&(a.stateDependentLayers=a.stateDependentLayerIds.map((e=>t.filter((t=>t.id===e))[0])));for(const e of t)i[e.id]=a;}}return i}(t.buckets,i.style),this.hasSymbolBuckets=!1;for(const t in this.buckets){const i=this.buckets[t];if(i instanceof e.a6){if(this.hasSymbolBuckets=!0,!a)break;i.justReloaded=!0;}}if(this.hasRTLText=!1,this.hasSymbolBuckets)for(const t in this.buckets){const i=this.buckets[t];if(i instanceof e.a6&&i.hasRTLText){this.hasRTLText=!0,nt().lazyLoad();break}}this.queryPadding=0;for(const t in this.buckets){const e=this.buckets[t];this.queryPadding=Math.max(this.queryPadding,i.style.getLayer(t).queryRadius(e));}t.imageAtlas&&(this.imageAtlas=t.imageAtlas),t.glyphAtlasImage&&(this.glyphAtlasImage=t.glyphAtlasImage);}else this.collisionBoxArray=new e.a5;}unloadVectorData(){for(const t in this.buckets)this.buckets[t].destroy();this.buckets={},this.imageAtlasTexture&&this.imageAtlasTexture.destroy(),this.imageAtlas&&(this.imageAtlas=null),this.glyphAtlasTexture&&this.glyphAtlasTexture.destroy(),this.latestFeatureIndex=null,this.state="unloaded";}getBucket(t){return this.buckets[t.id]}upload(t){for(const e in this.buckets){const i=this.buckets[e];i.uploadPending()&&i.upload(t);}const e=t.gl;this.imageAtlas&&!this.imageAtlas.uploaded&&(this.imageAtlasTexture=new b(t,this.imageAtlas.image,e.RGBA),this.imageAtlas.uploaded=!0),this.glyphAtlasImage&&(this.glyphAtlasTexture=new b(t,this.glyphAtlasImage,e.ALPHA),this.glyphAtlasImage=null);}prepare(t){this.imageAtlas&&this.imageAtlas.patchUpdatedImages(t,this.imageAtlasTexture);}queryRenderedFeatures(t,e,i,a,s,o,r,n,l,h){return this.latestFeatureIndex&&this.latestFeatureIndex.rawTileData?this.latestFeatureIndex.query({queryGeometry:a,cameraQueryGeometry:s,scale:o,tileSize:this.tileSize,pixelPosMatrix:h,transform:n,params:r,queryPadding:this.queryPadding*l},t,e,i):{}}querySourceFeatures(t,i){const a=this.latestFeatureIndex;if(!a||!a.rawTileData)return;const s=a.loadVTLayers(),o=i&&i.sourceLayer?i.sourceLayer:"",r=s._geojsonTileLayer||s[o];if(!r)return;const n=e.a7(i&&i.filter),{z:l,x:h,y:c}=this.tileID.canonical,u={z:l,x:h,y:c};for(let i=0;i<r.length;i++){const s=r.feature(i);if(n.needGeometry){const t=e.a8(s,!0);if(!n.filter(new e.z(this.tileID.overscaledZ),t,this.tileID.canonical))continue}else if(!n.filter(new e.z(this.tileID.overscaledZ),s))continue;const d=a.getId(s,o),_=new e.a9(s,l,h,c,d);_.tile=u,t.push(_);}}hasData(){return "loaded"===this.state||"reloading"===this.state||"expired"===this.state}patternsLoaded(){return this.imageAtlas&&!!Object.keys(this.imageAtlas.patternPositions).length}setExpiryData(t){const i=this.expirationTime;if(t.cacheControl){const i=e.aa(t.cacheControl);i["max-age"]&&(this.expirationTime=Date.now()+1e3*i["max-age"]);}else t.expires&&(this.expirationTime=new Date(t.expires).getTime());if(this.expirationTime){const t=Date.now();let e=!1;if(this.expirationTime>t)e=!1;else if(i)if(this.expirationTime<i)e=!0;else {const a=this.expirationTime-i;a?this.expirationTime=t+Math.max(a,3e4):e=!0;}else e=!0;e?(this.expiredRequestCount++,this.state="expired"):this.expiredRequestCount=0;}}getExpiryTimeout(){if(this.expirationTime)return this.expiredRequestCount?1e3*(1<<Math.min(this.expiredRequestCount-1,31)):Math.min(this.expirationTime-(new Date).getTime(),Math.pow(2,31)-1)}setFeatureState(t,e){if(!this.latestFeatureIndex||!this.latestFeatureIndex.rawTileData||0===Object.keys(t).length)return;const i=this.latestFeatureIndex.loadVTLayers();for(const a in this.buckets){if(!e.style.hasLayer(a))continue;const s=this.buckets[a],o=s.layers[0].sourceLayer||"_geojsonTileLayer",r=i[o],n=t[o];if(!r||!n||0===Object.keys(n).length)continue;s.update(n,r,this.imageAtlas&&this.imageAtlas.patternPositions||{});const l=e&&e.style&&e.style.getLayer(a);l&&(this.queryPadding=Math.max(this.queryPadding,l.queryRadius(s)));}}holdingForFade(){return void 0!==this.symbolFadeHoldUntil}symbolFadeFinished(){return !this.symbolFadeHoldUntil||this.symbolFadeHoldUntil<o.now()}clearFadeHold(){this.symbolFadeHoldUntil=void 0;}setHoldDuration(t){this.symbolFadeHoldUntil=o.now()+t;}setDependencies(t,e){const i={};for(const t of e)i[t]=!0;this.dependencies[t]=i;}hasDependency(t,e){for(const i of t){const t=this.dependencies[i];if(t)for(const i of e)if(t[i])return !0}return !1}}class ht{constructor(t,e){this.max=t,this.onRemove=e,this.reset();}reset(){for(const t in this.data)for(const e of this.data[t])e.timeout&&clearTimeout(e.timeout),this.onRemove(e.value);return this.data={},this.order=[],this}add(t,e,i){const a=t.wrapped().key;void 0===this.data[a]&&(this.data[a]=[]);const s={value:e,timeout:void 0};if(void 0!==i&&(s.timeout=setTimeout((()=>{this.remove(t,s);}),i)),this.data[a].push(s),this.order.push(a),this.order.length>this.max){const t=this._getAndRemoveByKey(this.order[0]);t&&this.onRemove(t);}return this}has(t){return t.wrapped().key in this.data}getAndRemove(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null}_getAndRemoveByKey(t){const e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value}getByKey(t){const e=this.data[t];return e?e[0].value:null}get(t){return this.has(t)?this.data[t.wrapped().key][0].value:null}remove(t,e){if(!this.has(t))return this;const i=t.wrapped().key,a=void 0===e?0:this.data[i].indexOf(e),s=this.data[i][a];return this.data[i].splice(a,1),s.timeout&&clearTimeout(s.timeout),0===this.data[i].length&&delete this.data[i],this.onRemove(s.value),this.order.splice(this.order.indexOf(i),1),this}setMaxSize(t){for(this.max=t;this.order.length>this.max;){const t=this._getAndRemoveByKey(this.order[0]);t&&this.onRemove(t);}return this}filter(t){const e=[];for(const i in this.data)for(const a of this.data[i])t(a.value)||e.push(a);for(const t of e)this.remove(t.value.tileID,t);}}class ct{constructor(){this.state={},this.stateChanges={},this.deletedStates={};}updateState(t,i,a){const s=String(i);if(this.stateChanges[t]=this.stateChanges[t]||{},this.stateChanges[t][s]=this.stateChanges[t][s]||{},e.e(this.stateChanges[t][s],a),null===this.deletedStates[t]){this.deletedStates[t]={};for(const e in this.state[t])e!==s&&(this.deletedStates[t][e]=null);}else if(this.deletedStates[t]&&null===this.deletedStates[t][s]){this.deletedStates[t][s]={};for(const e in this.state[t][s])a[e]||(this.deletedStates[t][s][e]=null);}else for(const e in a)this.deletedStates[t]&&this.deletedStates[t][s]&&null===this.deletedStates[t][s][e]&&delete this.deletedStates[t][s][e];}removeFeatureState(t,e,i){if(null===this.deletedStates[t])return;const a=String(e);if(this.deletedStates[t]=this.deletedStates[t]||{},i&&void 0!==e)null!==this.deletedStates[t][a]&&(this.deletedStates[t][a]=this.deletedStates[t][a]||{},this.deletedStates[t][a][i]=null);else if(void 0!==e)if(this.stateChanges[t]&&this.stateChanges[t][a])for(i in this.deletedStates[t][a]={},this.stateChanges[t][a])this.deletedStates[t][a][i]=null;else this.deletedStates[t][a]=null;else this.deletedStates[t]=null;}getState(t,i){const a=String(i),s=e.e({},(this.state[t]||{})[a],(this.stateChanges[t]||{})[a]);if(null===this.deletedStates[t])return {};if(this.deletedStates[t]){const e=this.deletedStates[t][i];if(null===e)return {};for(const t in e)delete s[t];}return s}initializeTileState(t,e){t.setFeatureState(this.state,e);}coalesceChanges(t,i){const a={};for(const t in this.stateChanges){this.state[t]=this.state[t]||{};const i={};for(const a in this.stateChanges[t])this.state[t][a]||(this.state[t][a]={}),e.e(this.state[t][a],this.stateChanges[t][a]),i[a]=this.state[t][a];a[t]=i;}for(const t in this.deletedStates){this.state[t]=this.state[t]||{};const i={};if(null===this.deletedStates[t])for(const e in this.state[t])i[e]={},this.state[t][e]={};else for(const e in this.deletedStates[t]){if(null===this.deletedStates[t][e])this.state[t][e]={};else for(const i of Object.keys(this.deletedStates[t][e]))delete this.state[t][e][i];i[e]=this.state[t][e];}a[t]=a[t]||{},e.e(a[t],i);}if(this.stateChanges={},this.deletedStates={},0!==Object.keys(a).length)for(const e in t)t[e].setFeatureState(a,i);}}class ut extends e.E{constructor(t,e,i){super(),this.id=t,this.dispatcher=i,this.on("data",(t=>this._dataHandler(t))),this.on("dataloading",(()=>{this._sourceErrored=!1;})),this.on("error",(()=>{this._sourceErrored=this._source.loaded();})),this._source=((t,e,i,a)=>{const s=new(at(e.type))(t,e,i,a);if(s.id!==t)throw new Error(`Expected Source id to be ${t} instead of ${s.id}`);return s})(t,e,i,this),this._tiles={},this._cache=new ht(0,(t=>this._unloadTile(t))),this._timers={},this._cacheTimers={},this._maxTileCacheSize=null,this._maxTileCacheZoomLevels=null,this._loadedParentTiles={},this._coveredTiles={},this._state=new ct,this._didEmitContent=!1,this._updated=!1;}onAdd(t){this.map=t,this._maxTileCacheSize=t?t._maxTileCacheSize:null,this._maxTileCacheZoomLevels=t?t._maxTileCacheZoomLevels:null,this._source&&this._source.onAdd&&this._source.onAdd(t);}onRemove(t){this.clearTiles(),this._source&&this._source.onRemove&&this._source.onRemove(t);}loaded(){if(this._sourceErrored)return !0;if(!this._sourceLoaded)return !1;if(!this._source.loaded())return !1;if(!(void 0===this.used&&void 0===this.usedForTerrain||this.used||this.usedForTerrain))return !0;if(!this._updated)return !1;for(const t in this._tiles){const e=this._tiles[t];if("loaded"!==e.state&&"errored"!==e.state)return !1}return !0}getSource(){return this._source}pause(){this._paused=!0;}resume(){if(!this._paused)return;const t=this._shouldReloadOnResume;this._paused=!1,this._shouldReloadOnResume=!1,t&&this.reload(),this.transform&&this.update(this.transform,this.terrain);}_loadTile(t,i,a){return e._(this,void 0,void 0,(function*(){try{yield this._source.loadTile(t),this._tileLoaded(t,i,a);}catch(i){t.state="errored",404!==i.status?this._source.fire(new e.j(i,{tile:t})):this.update(this.transform,this.terrain);}}))}_unloadTile(t){this._source.unloadTile&&this._source.unloadTile(t);}_abortTile(t){this._source.abortTile&&this._source.abortTile(t),this._source.fire(new e.k("dataabort",{tile:t,coord:t.tileID,dataType:"source"}));}serialize(){return this._source.serialize()}prepare(t){this._source.prepare&&this._source.prepare(),this._state.coalesceChanges(this._tiles,this.map?this.map.painter:null);for(const e in this._tiles){const i=this._tiles[e];i.upload(t),i.prepare(this.map.style.imageManager);}}getIds(){return Object.values(this._tiles).map((t=>t.tileID)).sort(dt).map((t=>t.key))}getRenderableIds(t){const i=[];for(const e in this._tiles)this._isIdRenderable(e,t)&&i.push(this._tiles[e]);return t?i.sort(((t,i)=>{const a=t.tileID,s=i.tileID,o=new e.P(a.canonical.x,a.canonical.y)._rotate(this.transform.angle),r=new e.P(s.canonical.x,s.canonical.y)._rotate(this.transform.angle);return a.overscaledZ-s.overscaledZ||r.y-o.y||r.x-o.x})).map((t=>t.tileID.key)):i.map((t=>t.tileID)).sort(dt).map((t=>t.key))}hasRenderableParent(t){const e=this.findLoadedParent(t,0);return !!e&&this._isIdRenderable(e.tileID.key)}_isIdRenderable(t,e){return this._tiles[t]&&this._tiles[t].hasData()&&!this._coveredTiles[t]&&(e||!this._tiles[t].holdingForFade())}reload(){if(this._paused)this._shouldReloadOnResume=!0;else {this._cache.reset();for(const t in this._tiles)"errored"!==this._tiles[t].state&&this._reloadTile(t,"reloading");}}_reloadTile(t,i){return e._(this,void 0,void 0,(function*(){const e=this._tiles[t];e&&("loading"!==e.state&&(e.state=i),yield this._loadTile(e,t,i));}))}_tileLoaded(t,i,a){t.timeAdded=o.now(),"expired"===a&&(t.refreshedUponExpiration=!0),this._setTileReloadTimer(i,t),"raster-dem"===this.getSource().type&&t.dem&&this._backfillDEM(t),this._state.initializeTileState(t,this.map?this.map.painter:null),t.aborted||this._source.fire(new e.k("data",{dataType:"source",tile:t,coord:t.tileID}));}_backfillDEM(t){const e=this.getRenderableIds();for(let a=0;a<e.length;a++){const s=e[a];if(t.neighboringTiles&&t.neighboringTiles[s]){const e=this.getTileByID(s);i(t,e),i(e,t);}}function i(t,e){t.needsHillshadePrepare=!0,t.needsTerrainPrepare=!0;let i=e.tileID.canonical.x-t.tileID.canonical.x;const a=e.tileID.canonical.y-t.tileID.canonical.y,s=Math.pow(2,t.tileID.canonical.z),o=e.tileID.key;0===i&&0===a||Math.abs(a)>1||(Math.abs(i)>1&&(1===Math.abs(i+s)?i+=s:1===Math.abs(i-s)&&(i-=s)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,i,a),t.neighboringTiles&&t.neighboringTiles[o]&&(t.neighboringTiles[o].backfilled=!0)));}}getTile(t){return this.getTileByID(t.key)}getTileByID(t){return this._tiles[t]}_retainLoadedChildren(t,e,i,a){for(const s in this._tiles){let o=this._tiles[s];if(a[s]||!o.hasData()||o.tileID.overscaledZ<=e||o.tileID.overscaledZ>i)continue;let r=o.tileID;for(;o&&o.tileID.overscaledZ>e+1;){const t=o.tileID.scaledTo(o.tileID.overscaledZ-1);o=this._tiles[t.key],o&&o.hasData()&&(r=t);}let n=r;for(;n.overscaledZ>e;)if(n=n.scaledTo(n.overscaledZ-1),t[n.key]){a[r.key]=r;break}}}findLoadedParent(t,e){if(t.key in this._loadedParentTiles){const i=this._loadedParentTiles[t.key];return i&&i.tileID.overscaledZ>=e?i:null}for(let i=t.overscaledZ-1;i>=e;i--){const e=t.scaledTo(i),a=this._getLoadedTile(e);if(a)return a}}findLoadedSibling(t){return this._getLoadedTile(t)}_getLoadedTile(t){const e=this._tiles[t.key];return e&&e.hasData()?e:this._cache.getByKey(t.wrapped().key)}updateCacheSize(t){const i=Math.ceil(t.width/this._source.tileSize)+1,a=Math.ceil(t.height/this._source.tileSize)+1,s=Math.floor(i*a*(null===this._maxTileCacheZoomLevels?e.a.MAX_TILE_CACHE_ZOOM_LEVELS:this._maxTileCacheZoomLevels)),o="number"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,s):s;this._cache.setMaxSize(o);}handleWrapJump(t){const e=Math.round((t-(void 0===this._prevLng?t:this._prevLng))/360);if(this._prevLng=t,e){const t={};for(const i in this._tiles){const a=this._tiles[i];a.tileID=a.tileID.unwrapTo(a.tileID.wrap+e),t[a.tileID.key]=a;}this._tiles=t;for(const t in this._timers)clearTimeout(this._timers[t]),delete this._timers[t];for(const t in this._tiles)this._setTileReloadTimer(t,this._tiles[t]);}}_updateCoveredAndRetainedTiles(t,e,i,a,s,r){const n={},l={},h=Object.keys(t),c=o.now();for(const i of h){const a=t[i],s=this._tiles[i];if(!s||0!==s.fadeEndTime&&s.fadeEndTime<=c)continue;const o=this.findLoadedParent(a,e),r=this.findLoadedSibling(a),h=o||r||null;h&&(this._addTile(h.tileID),n[h.tileID.key]=h.tileID),l[i]=a;}this._retainLoadedChildren(l,a,i,t);for(const e in n)t[e]||(this._coveredTiles[e]=!0,t[e]=n[e]);if(r){const e={},i={};for(const t of s)this._tiles[t.key].hasData()?e[t.key]=t:i[t.key]=t;for(const a in i){const s=i[a].children(this._source.maxzoom);this._tiles[s[0].key]&&this._tiles[s[1].key]&&this._tiles[s[2].key]&&this._tiles[s[3].key]&&(e[s[0].key]=t[s[0].key]=s[0],e[s[1].key]=t[s[1].key]=s[1],e[s[2].key]=t[s[2].key]=s[2],e[s[3].key]=t[s[3].key]=s[3],delete i[a]);}for(const a in i){const s=i[a],o=this.findLoadedParent(s,this._source.minzoom),r=this.findLoadedSibling(s),n=o||r||null;if(n){e[n.tileID.key]=t[n.tileID.key]=n.tileID;for(const t in e)e[t].isChildOf(n.tileID)&&delete e[t];}}for(const t in this._tiles)e[t]||(this._coveredTiles[t]=!0);}}update(t,i){if(!this._sourceLoaded||this._paused)return;let a;this.transform=t,this.terrain=i,this.updateCacheSize(t),this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used||this.usedForTerrain?this._source.tileID?a=t.getVisibleUnwrappedCoordinates(this._source.tileID).map((t=>new e.S(t.canonical.z,t.wrap,t.canonical.z,t.canonical.x,t.canonical.y))):(a=t.coveringTiles({tileSize:this.usedForTerrain?this.tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:!this.usedForTerrain&&this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled,terrain:i}),this._source.hasTile&&(a=a.filter((t=>this._source.hasTile(t))))):a=[];const s=t.coveringZoomLevel(this._source),o=Math.max(s-ut.maxOverzooming,this._source.minzoom),r=Math.max(s+ut.maxUnderzooming,this._source.minzoom);if(this.usedForTerrain){const t={};for(const e of a)if(e.canonical.z>this._source.minzoom){const i=e.scaledTo(e.canonical.z-1);t[i.key]=i;const a=e.scaledTo(Math.max(this._source.minzoom,Math.min(e.canonical.z,5)));t[a.key]=a;}a=a.concat(Object.values(t));}const n=0===a.length&&!this._updated&&this._didEmitContent;this._updated=!0,n&&this.fire(new e.k("data",{sourceDataType:"idle",dataType:"source",sourceId:this.id}));const l=this._updateRetainedTiles(a,s);_t(this._source.type)&&this._updateCoveredAndRetainedTiles(l,o,r,s,a,i);for(const t in l)this._tiles[t].clearFadeHold();const h=e.ab(this._tiles,l);for(const t of h){const e=this._tiles[t];e.hasSymbolBuckets&&!e.holdingForFade()?e.setHoldDuration(this.map._fadeDuration):e.hasSymbolBuckets&&!e.symbolFadeFinished()||this._removeTile(t);}this._updateLoadedParentTileCache(),this._updateLoadedSiblingTileCache();}releaseSymbolFadeTiles(){for(const t in this._tiles)this._tiles[t].holdingForFade()&&this._removeTile(t);}_updateRetainedTiles(t,e){var i;const a={},s={},o=Math.max(e-ut.maxOverzooming,this._source.minzoom),r=Math.max(e+ut.maxUnderzooming,this._source.minzoom),n={};for(const i of t){const t=this._addTile(i);a[i.key]=i,t.hasData()||e<this._source.maxzoom&&(n[i.key]=i);}this._retainLoadedChildren(n,e,r,a);for(const r of t){let t=this._tiles[r.key];if(t.hasData())continue;if(e+1>this._source.maxzoom){const t=r.children(this._source.maxzoom)[0],e=this.getTile(t);if(e&&e.hasData()){a[t.key]=t;continue}}else {const t=r.children(this._source.maxzoom);if(a[t[0].key]&&a[t[1].key]&&a[t[2].key]&&a[t[3].key])continue}let n=t.wasRequested();for(let e=r.overscaledZ-1;e>=o;--e){const o=r.scaledTo(e);if(s[o.key])break;if(s[o.key]=!0,t=this.getTile(o),!t&&n&&(t=this._addTile(o)),t){const e=t.hasData();if((e||!(null===(i=this.map)||void 0===i?void 0:i.cancelPendingTileRequestsWhileZooming)||n)&&(a[o.key]=o),n=t.wasRequested(),e)break}}}return a}_updateLoadedParentTileCache(){this._loadedParentTiles={};for(const t in this._tiles){const e=[];let i,a=this._tiles[t].tileID;for(;a.overscaledZ>0;){if(a.key in this._loadedParentTiles){i=this._loadedParentTiles[a.key];break}e.push(a.key);const t=a.scaledTo(a.overscaledZ-1);if(i=this._getLoadedTile(t),i)break;a=t;}for(const t of e)this._loadedParentTiles[t]=i;}}_updateLoadedSiblingTileCache(){this._loadedSiblingTiles={};for(const t in this._tiles){const e=this._tiles[t].tileID,i=this._getLoadedTile(e);this._loadedSiblingTiles[e.key]=i;}}_addTile(t){let i=this._tiles[t.key];if(i)return i;i=this._cache.getAndRemove(t),i&&(this._setTileReloadTimer(t.key,i),i.tileID=t,this._state.initializeTileState(i,this.map?this.map.painter:null),this._cacheTimers[t.key]&&(clearTimeout(this._cacheTimers[t.key]),delete this._cacheTimers[t.key],this._setTileReloadTimer(t.key,i)));const a=i;return i||(i=new lt(t,this._source.tileSize*t.overscaleFactor()),this._loadTile(i,t.key,i.state)),i.uses++,this._tiles[t.key]=i,a||this._source.fire(new e.k("dataloading",{tile:i,coord:i.tileID,dataType:"source"})),i}_setTileReloadTimer(t,e){t in this._timers&&(clearTimeout(this._timers[t]),delete this._timers[t]);const i=e.getExpiryTimeout();i&&(this._timers[t]=setTimeout((()=>{this._reloadTile(t,"expired"),delete this._timers[t];}),i));}_removeTile(t){const e=this._tiles[t];e&&(e.uses--,delete this._tiles[t],this._timers[t]&&(clearTimeout(this._timers[t]),delete this._timers[t]),e.uses>0||(e.hasData()&&"reloading"!==e.state?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))));}_dataHandler(t){const e=t.sourceDataType;"source"===t.dataType&&"metadata"===e&&(this._sourceLoaded=!0),this._sourceLoaded&&!this._paused&&"source"===t.dataType&&"content"===e&&(this.reload(),this.transform&&this.update(this.transform,this.terrain),this._didEmitContent=!0);}clearTiles(){this._shouldReloadOnResume=!1,this._paused=!1;for(const t in this._tiles)this._removeTile(t);this._cache.reset();}tilesIn(t,i,a){const s=[],o=this.transform;if(!o)return s;const r=a?o.getCameraQueryGeometry(t):t,n=t.map((t=>o.pointCoordinate(t,this.terrain))),l=r.map((t=>o.pointCoordinate(t,this.terrain))),h=this.getIds();let c=1/0,u=1/0,d=-1/0,_=-1/0;for(const t of l)c=Math.min(c,t.x),u=Math.min(u,t.y),d=Math.max(d,t.x),_=Math.max(_,t.y);for(let t=0;t<h.length;t++){const a=this._tiles[h[t]];if(a.holdingForFade())continue;const r=a.tileID,p=Math.pow(2,o.zoom-a.tileID.overscaledZ),m=i*a.queryPadding*e.X/a.tileSize/p,f=[r.getTilePoint(new e.Z(c,u)),r.getTilePoint(new e.Z(d,_))];if(f[0].x-m<e.X&&f[0].y-m<e.X&&f[1].x+m>=0&&f[1].y+m>=0){const t=n.map((t=>r.getTilePoint(t))),e=l.map((t=>r.getTilePoint(t)));s.push({tile:a,tileID:r,queryGeometry:t,cameraQueryGeometry:e,scale:p});}}return s}getVisibleCoordinates(t){const e=this.getRenderableIds(t).map((t=>this._tiles[t].tileID));for(const t of e)t.posMatrix=this.transform.calculatePosMatrix(t.toUnwrapped());return e}hasTransition(){if(this._source.hasTransition())return !0;if(_t(this._source.type)){const t=o.now();for(const e in this._tiles)if(this._tiles[e].fadeEndTime>=t)return !0}return !1}setFeatureState(t,e,i){this._state.updateState(t=t||"_geojsonTileLayer",e,i);}removeFeatureState(t,e,i){this._state.removeFeatureState(t=t||"_geojsonTileLayer",e,i);}getFeatureState(t,e){return this._state.getState(t=t||"_geojsonTileLayer",e)}setDependencies(t,e,i){const a=this._tiles[t];a&&a.setDependencies(e,i);}reloadTilesForDependencies(t,e){for(const i in this._tiles)this._tiles[i].hasDependency(t,e)&&this._reloadTile(i,"reloading");this._cache.filter((i=>!i.hasDependency(t,e)));}}function dt(t,e){const i=Math.abs(2*t.wrap)-+(t.wrap<0),a=Math.abs(2*e.wrap)-+(e.wrap<0);return t.overscaledZ-e.overscaledZ||a-i||e.canonical.y-t.canonical.y||e.canonical.x-t.canonical.x}function _t(t){return "raster"===t||"image"===t||"video"===t}ut.maxOverzooming=10,ut.maxUnderzooming=3;class pt{constructor(t,e){this.reset(t,e);}reset(t,e){this.points=t||[],this._distances=[0];for(let t=1;t<this.points.length;t++)this._distances[t]=this._distances[t-1]+this.points[t].dist(this.points[t-1]);this.length=this._distances[this._distances.length-1],this.padding=Math.min(e||0,.5*this.length),this.paddedLength=this.length-2*this.padding;}lerp(t){if(1===this.points.length)return this.points[0];t=e.ac(t,0,1);let i=1,a=this._distances[i];const s=t*this.paddedLength+this.padding;for(;a<s&&i<this._distances.length;)a=this._distances[++i];const o=i-1,r=this._distances[o],n=a-r,l=n>0?(s-r)/n:0;return this.points[o].mult(1-l).add(this.points[i].mult(l))}}function mt(t,e){let i=!0;return "always"===t||"never"!==t&&"never"!==e||(i=!1),i}class ft{constructor(t,e,i){const a=this.boxCells=[],s=this.circleCells=[];this.xCellCount=Math.ceil(t/i),this.yCellCount=Math.ceil(e/i);for(let t=0;t<this.xCellCount*this.yCellCount;t++)a.push([]),s.push([]);this.circleKeys=[],this.boxKeys=[],this.bboxes=[],this.circles=[],this.width=t,this.height=e,this.xScale=this.xCellCount/t,this.yScale=this.yCellCount/e,this.boxUid=0,this.circleUid=0;}keysLength(){return this.boxKeys.length+this.circleKeys.length}insert(t,e,i,a,s){this._forEachCell(e,i,a,s,this._insertBoxCell,this.boxUid++),this.boxKeys.push(t),this.bboxes.push(e),this.bboxes.push(i),this.bboxes.push(a),this.bboxes.push(s);}insertCircle(t,e,i,a){this._forEachCell(e-a,i-a,e+a,i+a,this._insertCircleCell,this.circleUid++),this.circleKeys.push(t),this.circles.push(e),this.circles.push(i),this.circles.push(a);}_insertBoxCell(t,e,i,a,s,o){this.boxCells[s].push(o);}_insertCircleCell(t,e,i,a,s,o){this.circleCells[s].push(o);}_query(t,e,i,a,s,o,r){if(i<0||t>this.width||a<0||e>this.height)return [];const n=[];if(t<=0&&e<=0&&this.width<=i&&this.height<=a){if(s)return [{key:null,x1:t,y1:e,x2:i,y2:a}];for(let t=0;t<this.boxKeys.length;t++)n.push({key:this.boxKeys[t],x1:this.bboxes[4*t],y1:this.bboxes[4*t+1],x2:this.bboxes[4*t+2],y2:this.bboxes[4*t+3]});for(let t=0;t<this.circleKeys.length;t++){const e=this.circles[3*t],i=this.circles[3*t+1],a=this.circles[3*t+2];n.push({key:this.circleKeys[t],x1:e-a,y1:i-a,x2:e+a,y2:i+a});}}else this._forEachCell(t,e,i,a,this._queryCell,n,{hitTest:s,overlapMode:o,seenUids:{box:{},circle:{}}},r);return n}query(t,e,i,a){return this._query(t,e,i,a,!1,null)}hitTest(t,e,i,a,s,o){return this._query(t,e,i,a,!0,s,o).length>0}hitTestCircle(t,e,i,a,s){const o=t-i,r=t+i,n=e-i,l=e+i;if(r<0||o>this.width||l<0||n>this.height)return !1;const h=[];return this._forEachCell(o,n,r,l,this._queryCellCircle,h,{hitTest:!0,overlapMode:a,circle:{x:t,y:e,radius:i},seenUids:{box:{},circle:{}}},s),h.length>0}_queryCell(t,e,i,a,s,o,r,n){const{seenUids:l,hitTest:h,overlapMode:c}=r,u=this.boxCells[s];if(null!==u){const s=this.bboxes;for(const r of u)if(!l.box[r]){l.box[r]=!0;const u=4*r,d=this.boxKeys[r];if(t<=s[u+2]&&e<=s[u+3]&&i>=s[u+0]&&a>=s[u+1]&&(!n||n(d))&&(!h||!mt(c,d.overlapMode))&&(o.push({key:d,x1:s[u],y1:s[u+1],x2:s[u+2],y2:s[u+3]}),h))return !0}}const d=this.circleCells[s];if(null!==d){const s=this.circles;for(const r of d)if(!l.circle[r]){l.circle[r]=!0;const u=3*r,d=this.circleKeys[r];if(this._circleAndRectCollide(s[u],s[u+1],s[u+2],t,e,i,a)&&(!n||n(d))&&(!h||!mt(c,d.overlapMode))){const t=s[u],e=s[u+1],i=s[u+2];if(o.push({key:d,x1:t-i,y1:e-i,x2:t+i,y2:e+i}),h)return !0}}}return !1}_queryCellCircle(t,e,i,a,s,o,r,n){const{circle:l,seenUids:h,overlapMode:c}=r,u=this.boxCells[s];if(null!==u){const t=this.bboxes;for(const e of u)if(!h.box[e]){h.box[e]=!0;const i=4*e,a=this.boxKeys[e];if(this._circleAndRectCollide(l.x,l.y,l.radius,t[i+0],t[i+1],t[i+2],t[i+3])&&(!n||n(a))&&!mt(c,a.overlapMode))return o.push(!0),!0}}const d=this.circleCells[s];if(null!==d){const t=this.circles;for(const e of d)if(!h.circle[e]){h.circle[e]=!0;const i=3*e,a=this.circleKeys[e];if(this._circlesCollide(t[i],t[i+1],t[i+2],l.x,l.y,l.radius)&&(!n||n(a))&&!mt(c,a.overlapMode))return o.push(!0),!0}}}_forEachCell(t,e,i,a,s,o,r,n){const l=this._convertToXCellCoord(t),h=this._convertToYCellCoord(e),c=this._convertToXCellCoord(i),u=this._convertToYCellCoord(a);for(let d=l;d<=c;d++)for(let l=h;l<=u;l++)if(s.call(this,t,e,i,a,this.xCellCount*l+d,o,r,n))return}_convertToXCellCoord(t){return Math.max(0,Math.min(this.xCellCount-1,Math.floor(t*this.xScale)))}_convertToYCellCoord(t){return Math.max(0,Math.min(this.yCellCount-1,Math.floor(t*this.yScale)))}_circlesCollide(t,e,i,a,s,o){const r=a-t,n=s-e,l=i+o;return l*l>r*r+n*n}_circleAndRectCollide(t,e,i,a,s,o,r){const n=(o-a)/2,l=Math.abs(t-(a+n));if(l>n+i)return !1;const h=(r-s)/2,c=Math.abs(e-(s+h));if(c>h+i)return !1;if(l<=n||c<=h)return !0;const u=l-n,d=c-h;return u*u+d*d<=i*i}}function gt(t,i,a,s,o){const r=e.H();return i?(e.K(r,r,[1/o,1/o,1]),a||e.ad(r,r,s.angle)):e.L(r,s.labelPlaneMatrix,t),r}function vt(t,i,a,s,o){if(i){const i=e.ae(t);return e.K(i,i,[o,o,1]),a||e.ad(i,i,-s.angle),i}return s.glCoordMatrix}function xt(t,i,a,s){let o;s?(o=[t,i,s(t,i),1],e.af(o,o,a)):(o=[t,i,0,1],kt(o,o,a));const r=o[3];return {point:new e.P(o[0]/r,o[1]/r),signedDistanceFromCamera:r,isOccluded:!1}}function yt(t,e){return .5+t/e*.5}function bt(t,e){return t.x>=-e[0]&&t.x<=e[0]&&t.y>=-e[1]&&t.y<=e[1]}function wt(t,i,a,s,o,r,n,l,h,c,u,d,_,p,m){const f=s?t.textSizeData:t.iconSizeData,g=e.ag(f,a.transform.zoom),v=[256/a.width*2+1,256/a.height*2+1],x=s?t.text.dynamicLayoutVertexArray:t.icon.dynamicLayoutVertexArray;x.clear();const y=t.lineVertexArray,b=s?t.text.placedSymbolArray:t.icon.placedSymbolArray,w=a.transform.width/a.transform.height;let T=!1;for(let s=0;s<b.length;s++){const I=b.get(s);if(I.hidden||I.writingMode===e.ah.vertical&&!T){Rt(I.numGlyphs,x);continue}T=!1;const E=xt(I.anchorX,I.anchorY,i,m);if(!bt(E.point,v)){Rt(I.numGlyphs,x);continue}const P=yt(a.transform.cameraToCenterDistance,E.signedDistanceFromCamera),C=e.ai(f,g,I),S=n?C/P:C*P,z={getElevation:m,labelPlaneMatrix:o,lineVertexArray:y,pitchWithMap:n,projectionCache:{projections:{},offsets:{},cachedAnchorPoint:void 0,anyProjectionOccluded:!1},projection:c,tileAnchorPoint:new e.P(I.anchorX,I.anchorY),unwrappedTileID:u,width:d,height:_,translation:p},D=Et(z,I,S,!1,l,i,r,t.glyphOffsetArray,x,w,h);T=D.useVertical,(D.notEnoughRoom||T||D.needsFlipping&&Et(z,I,S,!0,l,i,r,t.glyphOffsetArray,x,w,h).notEnoughRoom)&&Rt(I.numGlyphs,x);}s?t.text.dynamicLayoutVertexBuffer.updateData(x):t.icon.dynamicLayoutVertexBuffer.updateData(x);}function Tt(t,e,i,a,s,o,r,n){const l=o.glyphStartIndex+o.numGlyphs,h=o.lineStartIndex,c=o.lineStartIndex+o.lineLength,u=e.getoffsetX(o.glyphStartIndex),d=e.getoffsetX(l-1),_=Mt(t*u,i,a,s,o.segment,h,c,n,r);if(!_)return null;const p=Mt(t*d,i,a,s,o.segment,h,c,n,r);return p?n.projectionCache.anyProjectionOccluded?null:{first:_,last:p}:null}function It(t,i,a,s){return t===e.ah.horizontal&&Math.abs(a.y-i.y)>Math.abs(a.x-i.x)*s?{useVertical:!0}:(t===e.ah.vertical?i.y<a.y:i.x>a.x)?{needsFlipping:!0}:null}function Et(t,i,a,s,o,r,n,l,h,c,u){const d=a/24,_=i.lineOffsetX*d,p=i.lineOffsetY*d;let m;if(i.numGlyphs>1){const e=i.glyphStartIndex+i.numGlyphs,a=i.lineStartIndex,r=i.lineStartIndex+i.lineLength,h=Tt(d,l,_,p,s,i,u,t);if(!h)return {notEnoughRoom:!0};const f=xt(h.first.point.x,h.first.point.y,n,t.getElevation).point,g=xt(h.last.point.x,h.last.point.y,n,t.getElevation).point;if(o&&!s){const t=It(i.writingMode,f,g,c);if(t)return t}m=[h.first];for(let o=i.glyphStartIndex+1;o<e-1;o++)m.push(Mt(d*l.getoffsetX(o),_,p,s,i.segment,a,r,t,u));m.push(h.last);}else {if(o&&!s){const a=xt(t.tileAnchorPoint.x,t.tileAnchorPoint.y,r,t.getElevation).point,s=i.lineStartIndex+i.segment+1,o=new e.P(t.lineVertexArray.getx(s),t.lineVertexArray.gety(s)),n=xt(o.x,o.y,r,t.getElevation),l=n.signedDistanceFromCamera>0?n.point:function(t,e,i,a,s,o){return Pt(t,e,i,1,s,o)}(t.tileAnchorPoint,o,a,0,r,t),h=It(i.writingMode,a,l,c);if(h)return h}const a=Mt(d*l.getoffsetX(i.glyphStartIndex),_,p,s,i.segment,i.lineStartIndex,i.lineStartIndex+i.lineLength,t,u);if(!a||t.projectionCache.anyProjectionOccluded)return {notEnoughRoom:!0};m=[a];}for(const t of m)e.aj(h,t.point,t.angle);return {}}function Pt(t,e,i,a,s,o){const r=t.add(t.sub(e)._unit()),n=void 0!==s?xt(r.x,r.y,s,o.getElevation).point:St(r.x,r.y,o).point,l=i.sub(n);return i.add(l._mult(a/l.mag()))}function Ct(t,i,a){const s=i.projectionCache;if(s.projections[t])return s.projections[t];const o=new e.P(i.lineVertexArray.getx(t),i.lineVertexArray.gety(t)),r=St(o.x,o.y,i);if(r.signedDistanceFromCamera>0)return s.projections[t]=r.point,s.anyProjectionOccluded=s.anyProjectionOccluded||r.isOccluded,r.point;const n=t-a.direction;return function(t,e,i,a,s){return Pt(t,e,i,a,void 0,s)}(0===a.distanceFromAnchor?i.tileAnchorPoint:new e.P(i.lineVertexArray.getx(n),i.lineVertexArray.gety(n)),o,a.previousVertex,a.absOffsetX-a.distanceFromAnchor+1,i)}function St(t,e,i){const a=t+i.translation[0],s=e+i.translation[1];let o;return !i.pitchWithMap&&i.projection.useSpecialProjectionForSymbols?(o=i.projection.projectTileCoordinates(a,s,i.unwrappedTileID,i.getElevation),o.point.x=(.5*o.point.x+.5)*i.width,o.point.y=(.5*-o.point.y+.5)*i.height):(o=xt(a,s,i.labelPlaneMatrix,i.getElevation),o.isOccluded=!1),o}function zt(t,e,i){return t._unit()._perp()._mult(e*i)}function Dt(t,i,a,s,o,r,n,l,h){if(l.projectionCache.offsets[t])return l.projectionCache.offsets[t];const c=a.add(i);if(t+h.direction<s||t+h.direction>=o)return l.projectionCache.offsets[t]=c,c;const u=Ct(t+h.direction,l,h),d=zt(u.sub(a),n,h.direction),_=a.add(d),p=u.add(d);return l.projectionCache.offsets[t]=e.ak(r,c,_,p)||c,l.projectionCache.offsets[t]}function Mt(t,e,i,a,s,o,r,n,l){const h=a?t-e:t+e;let c=h>0?1:-1,u=0;a&&(c*=-1,u=Math.PI),c<0&&(u+=Math.PI);let d,_=c>0?o+s:o+s+1;n.projectionCache.cachedAnchorPoint?d=n.projectionCache.cachedAnchorPoint:(d=St(n.tileAnchorPoint.x,n.tileAnchorPoint.y,n).point,n.projectionCache.cachedAnchorPoint=d);let p,m,f=d,g=d,v=0,x=0;const y=Math.abs(h),b=[];let w;for(;v+x<=y;){if(_+=c,_<o||_>=r)return null;v+=x,g=f,m=p;const t={absOffsetX:y,direction:c,distanceFromAnchor:v,previousVertex:g};if(f=Ct(_,n,t),0===i)b.push(g),w=f.sub(g);else {let e;const a=f.sub(g);e=0===a.mag()?zt(Ct(_+c,n,t).sub(f),i,c):zt(a,i,c),m||(m=g.add(e)),p=Dt(_,e,f,o,r,m,i,n,t),b.push(m),w=p.sub(m);}x=w.mag();}const T=w._mult((y-v)/x)._add(m||g),I=u+Math.atan2(f.y-g.y,f.x-g.x);return b.push(T),{point:T,angle:l?I:0,path:b}}const At=new Float32Array([-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0]);function Rt(t,e){for(let i=0;i<t;i++){const t=e.length;e.resize(t+4),e.float32.set(At,3*t);}}function kt(t,e,i){const a=e[0],s=e[1];return t[0]=i[0]*a+i[4]*s+i[12],t[1]=i[1]*a+i[5]*s+i[13],t[3]=i[3]*a+i[7]*s+i[15],t}const Lt=100;class Ft{constructor(t,e,i=new ft(t.width+200,t.height+200,25),a=new ft(t.width+200,t.height+200,25)){this.transform=t,this.mapProjection=e,this.grid=i,this.ignoredGrid=a,this.pitchFactor=Math.cos(t._pitch)*t.cameraToCenterDistance,this.screenRightBoundary=t.width+Lt,this.screenBottomBoundary=t.height+Lt,this.gridRightBoundary=t.width+200,this.gridBottomBoundary=t.height+200,this.perspectiveRatioCutoff=.6;}placeCollisionBox(t,e,i,a,s,o,r,n,l,h,c){const u=t.anchorPointX+n[0],d=t.anchorPointY+n[1],_=this.projectAndGetPerspectiveRatio(a,u,d,s,h),p=i*_.perspectiveRatio;let m;if(o||r)m=this._projectCollisionBox(t,p,a,s,o,r,n,_,h,c);else {const e=_.point.x+(c?c.x*p:0),i=_.point.y+(c?c.y*p:0);m={allPointsOccluded:!1,box:[e+t.x1*p,i+t.y1*p,e+t.x2*p,i+t.y2*p]};}const[f,g,v,x]=m.box;return this.mapProjection.useSpecialProjectionForSymbols&&(o?m.allPointsOccluded:this.mapProjection.isOccluded(u,d,s))||_.perspectiveRatio<this.perspectiveRatioCutoff||!this.isInsideGrid(f,g,v,x)||"always"!==e&&this.grid.hitTest(f,g,v,x,e,l)?{box:[f,g,v,x],placeable:!1,offscreen:!1}:{box:[f,g,v,x],placeable:!0,offscreen:this.isOffscreen(f,g,v,x)}}placeCollisionCircles(t,i,a,s,o,r,n,l,h,c,u,d,_,p,m,f){const g=[],v=new e.P(i.anchorX,i.anchorY),x=this.getPerspectiveRatio(r,v.x,v.y,n,f),y=(u?o/x:o*x)/e.ap,b={getElevation:f,labelPlaneMatrix:l,lineVertexArray:a,pitchWithMap:u,projectionCache:{projections:{},offsets:{},cachedAnchorPoint:void 0,anyProjectionOccluded:!1},projection:this.mapProjection,tileAnchorPoint:v,unwrappedTileID:n,width:this.transform.width,height:this.transform.height,translation:m},w=Tt(y,s,i.lineOffsetX*y,i.lineOffsetY*y,!1,i,!1,b);let T=!1,I=!1,E=!0;if(w){const i=.5*_*x+p,a=new e.P(-100,-100),s=new e.P(this.screenRightBoundary,this.screenBottomBoundary),o=new pt,r=w.first,n=w.last;let l=[];for(let t=r.path.length-1;t>=1;t--)l.push(r.path[t]);for(let t=1;t<n.path.length;t++)l.push(n.path[t]);const u=2.5*i;if(h){const t=this.projectPathToScreenSpace(l,b,h);l=t.some((t=>t.signedDistanceFromCamera<=0))?[]:t.map((t=>t.point));}let m=[];if(l.length>0){const t=l[0].clone(),i=l[0].clone();for(let e=1;e<l.length;e++)t.x=Math.min(t.x,l[e].x),t.y=Math.min(t.y,l[e].y),i.x=Math.max(i.x,l[e].x),i.y=Math.max(i.y,l[e].y);m=t.x>=a.x&&i.x<=s.x&&t.y>=a.y&&i.y<=s.y?[l]:i.x<a.x||t.x>s.x||i.y<a.y||t.y>s.y?[]:e.al([l],a.x,a.y,s.x,s.y);}for(const e of m){o.reset(e,.25*i);let a=0;a=o.length<=.5*i?1:Math.ceil(o.paddedLength/u)+1;for(let e=0;e<a;e++){const s=e/Math.max(a-1,1),r=o.lerp(s),n=r.x+Lt,l=r.y+Lt;g.push(n,l,i,0);const h=n-i,u=l-i,_=n+i,p=l+i;if(E=E&&this.isOffscreen(h,u,_,p),I=I||this.isInsideGrid(h,u,_,p),"always"!==t&&this.grid.hitTestCircle(n,l,i,t,d)&&(T=!0,!c))return {circles:[],offscreen:!1,collisionDetected:T}}}}return {circles:!c&&T||!I||x<this.perspectiveRatioCutoff?[]:g,offscreen:E,collisionDetected:T}}projectPathToScreenSpace(t,e,i){return t.map((t=>xt(t.x,t.y,i,e.getElevation)))}queryRenderedSymbols(t){if(0===t.length||0===this.grid.keysLength()&&0===this.ignoredGrid.keysLength())return {};const i=[];let a=1/0,s=1/0,o=-1/0,r=-1/0;for(const n of t){const t=new e.P(n.x+Lt,n.y+Lt);a=Math.min(a,t.x),s=Math.min(s,t.y),o=Math.max(o,t.x),r=Math.max(r,t.y),i.push(t);}const n=this.grid.query(a,s,o,r).concat(this.ignoredGrid.query(a,s,o,r)),l={},h={};for(const t of n){const a=t.key;if(void 0===l[a.bucketInstanceId]&&(l[a.bucketInstanceId]={}),l[a.bucketInstanceId][a.featureIndex])continue;const s=[new e.P(t.x1,t.y1),new e.P(t.x2,t.y1),new e.P(t.x2,t.y2),new e.P(t.x1,t.y2)];e.am(i,s)&&(l[a.bucketInstanceId][a.featureIndex]=!0,void 0===h[a.bucketInstanceId]&&(h[a.bucketInstanceId]=[]),h[a.bucketInstanceId].push(a.featureIndex));}return h}insertCollisionBox(t,e,i,a,s,o){(i?this.ignoredGrid:this.grid).insert({bucketInstanceId:a,featureIndex:s,collisionGroupID:o,overlapMode:e},t[0],t[1],t[2],t[3]);}insertCollisionCircles(t,e,i,a,s,o){const r=i?this.ignoredGrid:this.grid,n={bucketInstanceId:a,featureIndex:s,collisionGroupID:o,overlapMode:e};for(let e=0;e<t.length;e+=4)r.insertCircle(n,t[e],t[e+1],t[e+2]);}projectAndGetPerspectiveRatio(t,i,a,s,o){let r;o?(r=[i,a,o(i,a),1],e.af(r,r,t)):(r=[i,a,0,1],kt(r,r,t));const n=r[3];return {point:new e.P((r[0]/n+1)/2*this.transform.width+Lt,(-r[1]/n+1)/2*this.transform.height+Lt),perspectiveRatio:.5+this.transform.cameraToCenterDistance/n*.5,isOccluded:!1,signedDistanceFromCamera:n}}getPerspectiveRatio(t,e,i,a,s){const o=this.mapProjection.useSpecialProjectionForSymbols?this.mapProjection.projectTileCoordinates(e,i,a,s):xt(e,i,t,s);return .5+this.transform.cameraToCenterDistance/o.signedDistanceFromCamera*.5}isOffscreen(t,e,i,a){return i<Lt||t>=this.screenRightBoundary||a<Lt||e>this.screenBottomBoundary}isInsideGrid(t,e,i,a){return i>=0&&t<this.gridRightBoundary&&a>=0&&e<this.gridBottomBoundary}getViewportMatrix(){const t=e.an([]);return e.J(t,t,[-100,-100,0]),t}_projectCollisionBox(t,i,a,s,o,r,n,l,h,c){let u=new e.P(1,0),d=new e.P(0,1);const _=new e.P(t.anchorPointX+n[0],t.anchorPointY+n[1]);if(r&&!o){const t=this.projectAndGetPerspectiveRatio(a,_.x+1,_.y,s,h).point.sub(l.point).unit(),i=Math.atan(t.y/t.x)+(t.x<0?Math.PI:0),o=Math.sin(i),r=Math.cos(i);u=new e.P(r,o),d=new e.P(-o,r);}else if(!r&&o){const t=-this.transform.angle,i=Math.sin(t),a=Math.cos(t);u=new e.P(a,i),d=new e.P(-i,a);}let p=l.point,m=i;if(o){p=_;const t=this.transform.zoom-Math.floor(this.transform.zoom);m=Math.pow(2,-t),m*=this.mapProjection.getPitchedTextCorrection(this.transform,_,s),c||(m*=e.ac(.5+l.signedDistanceFromCamera/this.transform.cameraToCenterDistance*.5,0,4));}c&&(p=p.add(u.mult(c.x*m)).add(d.mult(c.y*m)));const f=t.x1*m,g=t.x2*m,v=(f+g)/2,x=t.y1*m,y=t.y2*m,b=(x+y)/2,w=[{offsetX:f,offsetY:x},{offsetX:v,offsetY:x},{offsetX:g,offsetY:x},{offsetX:g,offsetY:b},{offsetX:g,offsetY:y},{offsetX:v,offsetY:y},{offsetX:f,offsetY:y},{offsetX:f,offsetY:b}];let T=[];for(const{offsetX:t,offsetY:i}of w)T.push(new e.P(p.x+u.x*t+d.x*i,p.y+u.y*t+d.y*i));let I=!1;if(o){const t=T.map((t=>this.projectAndGetPerspectiveRatio(a,t.x,t.y,s,h)));I=t.some((t=>!t.isOccluded)),T=t.map((t=>t.point));}else I=!0;return {box:e.ao(T),allPointsOccluded:!I}}}function Bt(t,i,a){return i*(e.X/(t.tileSize*Math.pow(2,a-t.tileID.overscaledZ)))}class Ot{constructor(t,e,i,a){this.opacity=t?Math.max(0,Math.min(1,t.opacity+(t.placed?e:-e))):a&&i?1:0,this.placed=i;}isHidden(){return 0===this.opacity&&!this.placed}}class Nt{constructor(t,e,i,a,s){this.text=new Ot(t?t.text:null,e,i,s),this.icon=new Ot(t?t.icon:null,e,a,s);}isHidden(){return this.text.isHidden()&&this.icon.isHidden()}}class Ut{constructor(t,e,i){this.text=t,this.icon=e,this.skipFade=i;}}class jt{constructor(){this.invProjMatrix=e.H(),this.viewportMatrix=e.H(),this.circles=[];}}class Zt{constructor(t,e,i,a,s){this.bucketInstanceId=t,this.featureIndex=e,this.sourceLayerIndex=i,this.bucketIndex=a,this.tileID=s;}}class qt{constructor(t){this.crossSourceCollisions=t,this.maxGroupID=0,this.collisionGroups={};}get(t){if(this.crossSourceCollisions)return {ID:0,predicate:null};if(!this.collisionGroups[t]){const e=++this.maxGroupID;this.collisionGroups[t]={ID:e,predicate:t=>t.collisionGroupID===e};}return this.collisionGroups[t]}}function Vt(t,i,a,s,o){const{horizontalAlign:r,verticalAlign:n}=e.au(t);return new e.P(-(r-.5)*i+s[0]*o,-(n-.5)*a+s[1]*o)}class Gt{constructor(t,e,i,a,s,o){this.transform=t.clone(),this.terrain=i,this.collisionIndex=new Ft(this.transform,e),this.placements={},this.opacities={},this.variableOffsets={},this.stale=!1,this.commitTime=0,this.fadeDuration=a,this.retainedQueryData={},this.collisionGroups=new qt(s),this.collisionCircleArrays={},this.collisionBoxArrays=new Map,this.prevPlacement=o,o&&(o.prevPlacement=void 0),this.placedOrientations={};}_getTerrainElevationFunc(t){const e=this.terrain;return e?(i,a)=>e.getElevation(t,i,a):null}getBucketParts(t,i,a,s){const o=a.getBucket(i),r=a.latestFeatureIndex;if(!o||!r||i.id!==o.layerIds[0])return;const n=a.collisionBoxArray,l=o.layers[0].layout,h=o.layers[0].paint,c=Math.pow(2,this.transform.zoom-a.tileID.overscaledZ),u=a.tileSize/e.X,d=a.tileID.toUnwrapped(),_=this.transform.calculatePosMatrix(d),p="map"===l.get("text-pitch-alignment"),m="map"===l.get("text-rotation-alignment"),f=Bt(a,1,this.transform.zoom),g=this.collisionIndex.mapProjection.translatePosition(this.transform,a,h.get("text-translate"),h.get("text-translate-anchor")),v=this.collisionIndex.mapProjection.translatePosition(this.transform,a,h.get("icon-translate"),h.get("icon-translate-anchor")),x=gt(_,p,m,this.transform,f);let y=null;if(p){const t=vt(_,p,m,this.transform,f);y=e.L([],this.transform.labelPlaneMatrix,t);}this.retainedQueryData[o.bucketInstanceId]=new Zt(o.bucketInstanceId,r,o.sourceLayerIndex,o.index,a.tileID);const b={bucket:o,layout:l,translationText:g,translationIcon:v,posMatrix:_,unwrappedTileID:d,textLabelPlaneMatrix:x,labelToScreenMatrix:y,scale:c,textPixelRatio:u,holdingForFade:a.holdingForFade(),collisionBoxArray:n,partiallyEvaluatedTextSize:e.ag(o.textSizeData,this.transform.zoom),collisionGroup:this.collisionGroups.get(o.sourceID)};if(s)for(const e of o.sortKeyRanges){const{sortKey:i,symbolInstanceStart:a,symbolInstanceEnd:s}=e;t.push({sortKey:i,symbolInstanceStart:a,symbolInstanceEnd:s,parameters:b});}else t.push({symbolInstanceStart:0,symbolInstanceEnd:o.symbolInstances.length,parameters:b});}attemptAnchorPlacement(t,i,a,s,o,r,n,l,h,c,u,d,_,p,m,f,g,v,x){const y=e.aq[t.textAnchor],b=[t.textOffset0,t.textOffset1],w=Vt(y,a,s,b,o),T=this.collisionIndex.placeCollisionBox(i,d,l,h,c,n,r,f,u.predicate,x,w);if((!v||this.collisionIndex.placeCollisionBox(v,d,l,h,c,n,r,g,u.predicate,x,w).placeable)&&T.placeable){let t;if(this.prevPlacement&&this.prevPlacement.variableOffsets[_.crossTileID]&&this.prevPlacement.placements[_.crossTileID]&&this.prevPlacement.placements[_.crossTileID].text&&(t=this.prevPlacement.variableOffsets[_.crossTileID].anchor),0===_.crossTileID)throw new Error("symbolInstance.crossTileID can't be 0");return this.variableOffsets[_.crossTileID]={textOffset:b,width:a,height:s,anchor:y,textBoxScale:o,prevAnchor:t},this.markUsedJustification(p,y,_,m),p.allowVerticalPlacement&&(this.markUsedOrientation(p,m,_),this.placedOrientations[_.crossTileID]=m),{shift:w,placedGlyphBoxes:T}}}placeLayerBucketPart(t,i,a){const{bucket:s,layout:o,translationText:r,translationIcon:n,posMatrix:l,unwrappedTileID:h,textLabelPlaneMatrix:c,labelToScreenMatrix:u,textPixelRatio:d,holdingForFade:_,collisionBoxArray:p,partiallyEvaluatedTextSize:m,collisionGroup:f}=t.parameters,g=o.get("text-optional"),v=o.get("icon-optional"),x=e.ar(o,"text-overlap","text-allow-overlap"),y="always"===x,b=e.ar(o,"icon-overlap","icon-allow-overlap"),w="always"===b,T="map"===o.get("text-rotation-alignment"),I="map"===o.get("text-pitch-alignment"),E="none"!==o.get("icon-text-fit"),P="viewport-y"===o.get("symbol-z-order"),C=y&&(w||!s.hasIconData()||v),S=w&&(y||!s.hasTextData()||g);!s.collisionArrays&&p&&s.deserializeCollisionBoxes(p);const z=this._getTerrainElevationFunc(this.retainedQueryData[s.bucketInstanceId].tileID),D=(t,p,w)=>{var P,D;if(i[t.crossTileID])return;if(_)return void(this.placements[t.crossTileID]=new Ut(!1,!1,!1));let M=!1,A=!1,R=!0,k=null,L={box:null,placeable:!1,offscreen:null},F={box:null,placeable:!1,offscreen:null},B=null,O=null,N=null,U=0,j=0,Z=0;p.textFeatureIndex?U=p.textFeatureIndex:t.useRuntimeCollisionCircles&&(U=t.featureIndex),p.verticalTextFeatureIndex&&(j=p.verticalTextFeatureIndex);const q=p.textBox;if(q){const i=i=>{let a=e.ah.horizontal;if(s.allowVerticalPlacement&&!i&&this.prevPlacement){const e=this.prevPlacement.placedOrientations[t.crossTileID];e&&(this.placedOrientations[t.crossTileID]=e,a=e,this.markUsedOrientation(s,a,t));}return a},o=(i,a)=>{if(s.allowVerticalPlacement&&t.numVerticalGlyphVertices>0&&p.verticalTextBox){for(const t of s.writingModes)if(t===e.ah.vertical?(L=a(),F=L):L=i(),L&&L.placeable)break}else L=i();},c=t.textAnchorOffsetStartIndex,u=t.textAnchorOffsetEndIndex;if(u===c){const a=(e,i)=>{const a=this.collisionIndex.placeCollisionBox(e,x,d,l,h,I,T,r,f.predicate,z);return a&&a.placeable&&(this.markUsedOrientation(s,i,t),this.placedOrientations[t.crossTileID]=i),a};o((()=>a(q,e.ah.horizontal)),(()=>{const i=p.verticalTextBox;return s.allowVerticalPlacement&&t.numVerticalGlyphVertices>0&&i?a(i,e.ah.vertical):{box:null,offscreen:null}})),i(L&&L.placeable);}else {let _=e.aq[null===(D=null===(P=this.prevPlacement)||void 0===P?void 0:P.variableOffsets[t.crossTileID])||void 0===D?void 0:D.anchor];const m=(i,o,p)=>{const m=i.x2-i.x1,g=i.y2-i.y1,v=t.textBoxScale,y=E&&"never"===b?o:null;let w=null,P="never"===x?1:2,C="never";_&&P++;for(let e=0;e<P;e++){for(let e=c;e<u;e++){const a=s.textAnchorOffsets.get(e);if(_&&a.textAnchor!==_)continue;const o=this.attemptAnchorPlacement(a,i,m,g,v,T,I,d,l,h,f,C,t,s,p,r,n,y,z);if(o&&(w=o.placedGlyphBoxes,w&&w.placeable))return M=!0,k=o.shift,w}_?_=null:C=x;}return a&&!w&&(w={box:this.collisionIndex.placeCollisionBox(q,"always",d,l,h,I,T,r,f.predicate,z,new e.P(0,0)).box,offscreen:!1,placeable:!1}),w};o((()=>m(q,p.iconBox,e.ah.horizontal)),(()=>{const i=p.verticalTextBox;return s.allowVerticalPlacement&&(!L||!L.placeable)&&t.numVerticalGlyphVertices>0&&i?m(i,p.verticalIconBox,e.ah.vertical):{box:null,occluded:!0,offscreen:null}})),L&&(M=L.placeable,R=L.offscreen);const g=i(L&&L.placeable);if(!M&&this.prevPlacement){const e=this.prevPlacement.variableOffsets[t.crossTileID];e&&(this.variableOffsets[t.crossTileID]=e,this.markUsedJustification(s,e.anchor,t,g));}}}if(B=L,M=B&&B.placeable,R=B&&B.offscreen,t.useRuntimeCollisionCircles){const i=s.text.placedSymbolArray.get(t.centerJustifiedTextSymbolIndex),n=e.ai(s.textSizeData,m,i),d=o.get("text-padding");O=this.collisionIndex.placeCollisionCircles(x,i,s.lineVertexArray,s.glyphOffsetArray,n,l,h,c,u,a,I,f.predicate,t.collisionCircleDiameter,d,r,z),O.circles.length&&O.collisionDetected&&!a&&e.w("Collisions detected, but collision boxes are not shown"),M=y||O.circles.length>0&&!O.collisionDetected,R=R&&O.offscreen;}if(p.iconFeatureIndex&&(Z=p.iconFeatureIndex),p.iconBox){const t=t=>this.collisionIndex.placeCollisionBox(t,b,d,l,h,I,T,n,f.predicate,z,E&&k?k:void 0);F&&F.placeable&&p.verticalIconBox?(N=t(p.verticalIconBox),A=N.placeable):(N=t(p.iconBox),A=N.placeable),R=R&&N.offscreen;}const V=g||0===t.numHorizontalGlyphVertices&&0===t.numVerticalGlyphVertices,G=v||0===t.numIconVertices;V||G?G?V||(A=A&&M):M=A&&M:A=M=A&&M;const H=A&&N.placeable;if(M&&B.placeable&&this.collisionIndex.insertCollisionBox(B.box,x,o.get("text-ignore-placement"),s.bucketInstanceId,F&&F.placeable&&j?j:U,f.ID),H&&this.collisionIndex.insertCollisionBox(N.box,b,o.get("icon-ignore-placement"),s.bucketInstanceId,Z,f.ID),O&&M&&this.collisionIndex.insertCollisionCircles(O.circles,x,o.get("text-ignore-placement"),s.bucketInstanceId,U,f.ID),a&&this.storeCollisionData(s.bucketInstanceId,w,p,B,N,O),0===t.crossTileID)throw new Error("symbolInstance.crossTileID can't be 0");if(0===s.bucketInstanceId)throw new Error("bucket.bucketInstanceId can't be 0");this.placements[t.crossTileID]=new Ut(M||C,A||S,R||s.justReloaded),i[t.crossTileID]=!0;};if(P){if(0!==t.symbolInstanceStart)throw new Error("bucket.bucketInstanceId should be 0");const e=s.getSortedSymbolIndexes(this.transform.angle);for(let t=e.length-1;t>=0;--t){const i=e[t];D(s.symbolInstances.get(i),s.collisionArrays[i],i);}}else for(let e=t.symbolInstanceStart;e<t.symbolInstanceEnd;e++)D(s.symbolInstances.get(e),s.collisionArrays[e],e);if(a&&s.bucketInstanceId in this.collisionCircleArrays){const t=this.collisionCircleArrays[s.bucketInstanceId];e.as(t.invProjMatrix,l),t.viewportMatrix=this.collisionIndex.getViewportMatrix();}s.justReloaded=!1;}storeCollisionData(t,e,i,a,s,o){if(i.textBox||i.iconBox){let o,r;this.collisionBoxArrays.has(t)?o=this.collisionBoxArrays.get(t):(o=new Map,this.collisionBoxArrays.set(t,o)),o.has(e)?r=o.get(e):(r={text:null,icon:null},o.set(e,r)),i.textBox&&(r.text=a.box),i.iconBox&&(r.icon=s.box);}if(o){let e=this.collisionCircleArrays[t];void 0===e&&(e=this.collisionCircleArrays[t]=new jt);for(let t=0;t<o.circles.length;t+=4)e.circles.push(o.circles[t+0]),e.circles.push(o.circles[t+1]),e.circles.push(o.circles[t+2]),e.circles.push(o.collisionDetected?1:0);}}markUsedJustification(t,i,a,s){let o;o=s===e.ah.vertical?a.verticalPlacedTextSymbolIndex:{left:a.leftJustifiedTextSymbolIndex,center:a.centerJustifiedTextSymbolIndex,right:a.rightJustifiedTextSymbolIndex}[e.at(i)];const r=[a.leftJustifiedTextSymbolIndex,a.centerJustifiedTextSymbolIndex,a.rightJustifiedTextSymbolIndex,a.verticalPlacedTextSymbolIndex];for(const e of r)e>=0&&(t.text.placedSymbolArray.get(e).crossTileID=o>=0&&e!==o?0:a.crossTileID);}markUsedOrientation(t,i,a){const s=i===e.ah.horizontal||i===e.ah.horizontalOnly?i:0,o=i===e.ah.vertical?i:0,r=[a.leftJustifiedTextSymbolIndex,a.centerJustifiedTextSymbolIndex,a.rightJustifiedTextSymbolIndex];for(const e of r)t.text.placedSymbolArray.get(e).placedOrientation=s;a.verticalPlacedTextSymbolIndex&&(t.text.placedSymbolArray.get(a.verticalPlacedTextSymbolIndex).placedOrientation=o);}commit(t){this.commitTime=t,this.zoomAtLastRecencyCheck=this.transform.zoom;const e=this.prevPlacement;let i=!1;this.prevZoomAdjustment=e?e.zoomAdjustment(this.transform.zoom):0;const a=e?e.symbolFadeChange(t):1,s=e?e.opacities:{},o=e?e.variableOffsets:{},r=e?e.placedOrientations:{};for(const t in this.placements){const e=this.placements[t],o=s[t];o?(this.opacities[t]=new Nt(o,a,e.text,e.icon),i=i||e.text!==o.text.placed||e.icon!==o.icon.placed):(this.opacities[t]=new Nt(null,a,e.text,e.icon,e.skipFade),i=i||e.text||e.icon);}for(const t in s){const e=s[t];if(!this.opacities[t]){const s=new Nt(e,a,!1,!1);s.isHidden()||(this.opacities[t]=s,i=i||e.text.placed||e.icon.placed);}}for(const t in o)this.variableOffsets[t]||!this.opacities[t]||this.opacities[t].isHidden()||(this.variableOffsets[t]=o[t]);for(const t in r)this.placedOrientations[t]||!this.opacities[t]||this.opacities[t].isHidden()||(this.placedOrientations[t]=r[t]);if(e&&void 0===e.lastPlacementChangeTime)throw new Error("Last placement time for previous placement is not defined");i?this.lastPlacementChangeTime=t:"number"!=typeof this.lastPlacementChangeTime&&(this.lastPlacementChangeTime=e?e.lastPlacementChangeTime:t);}updateLayerOpacities(t,e){const i={};for(const a of e){const e=a.getBucket(t);e&&a.latestFeatureIndex&&t.id===e.layerIds[0]&&this.updateBucketOpacities(e,a.tileID,i,a.collisionBoxArray);}}updateBucketOpacities(t,i,a,s){t.hasTextData()&&(t.text.opacityVertexArray.clear(),t.text.hasVisibleVertices=!1),t.hasIconData()&&(t.icon.opacityVertexArray.clear(),t.icon.hasVisibleVertices=!1),t.hasIconCollisionBoxData()&&t.iconCollisionBox.collisionVertexArray.clear(),t.hasTextCollisionBoxData()&&t.textCollisionBox.collisionVertexArray.clear();const o=t.layers[0],r=o.layout,n=new Nt(null,0,!1,!1,!0),l=r.get("text-allow-overlap"),h=r.get("icon-allow-overlap"),c=o._unevaluatedLayout.hasValue("text-variable-anchor")||o._unevaluatedLayout.hasValue("text-variable-anchor-offset"),u="map"===r.get("text-rotation-alignment"),d="map"===r.get("text-pitch-alignment"),_="none"!==r.get("icon-text-fit"),p=new Nt(null,0,l&&(h||!t.hasIconData()||r.get("icon-optional")),h&&(l||!t.hasTextData()||r.get("text-optional")),!0);!t.collisionArrays&&s&&(t.hasIconCollisionBoxData()||t.hasTextCollisionBoxData())&&t.deserializeCollisionBoxes(s);const m=(t,e,i)=>{for(let a=0;a<e/4;a++)t.opacityVertexArray.emplaceBack(i);t.hasVisibleVertices=t.hasVisibleVertices||i!==ee;},f=this.collisionBoxArrays.get(t.bucketInstanceId);for(let i=0;i<t.symbolInstances.length;i++){const s=t.symbolInstances.get(i),{numHorizontalGlyphVertices:o,numVerticalGlyphVertices:r,crossTileID:l}=s;let h=this.opacities[l];a[l]?h=n:h||(h=p,this.opacities[l]=h),a[l]=!0;const g=s.numIconVertices>0,v=this.placedOrientations[s.crossTileID],x=v===e.ah.vertical,y=v===e.ah.horizontal||v===e.ah.horizontalOnly;if(o>0||r>0){const e=te(h.text);m(t.text,o,x?ee:e),m(t.text,r,y?ee:e);const i=h.text.isHidden();[s.rightJustifiedTextSymbolIndex,s.centerJustifiedTextSymbolIndex,s.leftJustifiedTextSymbolIndex].forEach((e=>{e>=0&&(t.text.placedSymbolArray.get(e).hidden=i||x?1:0);})),s.verticalPlacedTextSymbolIndex>=0&&(t.text.placedSymbolArray.get(s.verticalPlacedTextSymbolIndex).hidden=i||y?1:0);const a=this.variableOffsets[s.crossTileID];a&&this.markUsedJustification(t,a.anchor,s,v);const n=this.placedOrientations[s.crossTileID];n&&(this.markUsedJustification(t,"left",s,n),this.markUsedOrientation(t,n,s));}if(g){const e=te(h.icon),i=!(_&&s.verticalPlacedIconSymbolIndex&&x);s.placedIconSymbolIndex>=0&&(m(t.icon,s.numIconVertices,i?e:ee),t.icon.placedSymbolArray.get(s.placedIconSymbolIndex).hidden=h.icon.isHidden()),s.verticalPlacedIconSymbolIndex>=0&&(m(t.icon,s.numVerticalIconVertices,i?ee:e),t.icon.placedSymbolArray.get(s.verticalPlacedIconSymbolIndex).hidden=h.icon.isHidden());}const b=f&&f.has(i)?f.get(i):{text:null,icon:null};if(t.hasIconCollisionBoxData()||t.hasTextCollisionBoxData()){const a=t.collisionArrays[i];if(a){let i=new e.P(0,0);if(a.textBox||a.verticalTextBox){let e=!0;if(c){const t=this.variableOffsets[l];t?(i=Vt(t.anchor,t.width,t.height,t.textOffset,t.textBoxScale),u&&i._rotate(d?this.transform.angle:-this.transform.angle)):e=!1;}if(a.textBox||a.verticalTextBox){let s;a.textBox&&(s=x),a.verticalTextBox&&(s=y),Ht(t.textCollisionBox.collisionVertexArray,h.text.placed,!e||s,b.text,i.x,i.y);}}if(a.iconBox||a.verticalIconBox){const e=Boolean(!y&&a.verticalIconBox);let s;a.iconBox&&(s=e),a.verticalIconBox&&(s=!e),Ht(t.iconCollisionBox.collisionVertexArray,h.icon.placed,s,b.icon,_?i.x:0,_?i.y:0);}}}}if(t.sortFeatures(this.transform.angle),this.retainedQueryData[t.bucketInstanceId]&&(this.retainedQueryData[t.bucketInstanceId].featureSortOrder=t.featureSortOrder),t.hasTextData()&&t.text.opacityVertexBuffer&&t.text.opacityVertexBuffer.updateData(t.text.opacityVertexArray),t.hasIconData()&&t.icon.opacityVertexBuffer&&t.icon.opacityVertexBuffer.updateData(t.icon.opacityVertexArray),t.hasIconCollisionBoxData()&&t.iconCollisionBox.collisionVertexBuffer&&t.iconCollisionBox.collisionVertexBuffer.updateData(t.iconCollisionBox.collisionVertexArray),t.hasTextCollisionBoxData()&&t.textCollisionBox.collisionVertexBuffer&&t.textCollisionBox.collisionVertexBuffer.updateData(t.textCollisionBox.collisionVertexArray),t.text.opacityVertexArray.length!==t.text.layoutVertexArray.length/4)throw new Error(`bucket.text.opacityVertexArray.length (= ${t.text.opacityVertexArray.length}) !== bucket.text.layoutVertexArray.length (= ${t.text.layoutVertexArray.length}) / 4`);if(t.icon.opacityVertexArray.length!==t.icon.layoutVertexArray.length/4)throw new Error(`bucket.icon.opacityVertexArray.length (= ${t.icon.opacityVertexArray.length}) !== bucket.icon.layoutVertexArray.length (= ${t.icon.layoutVertexArray.length}) / 4`);if(t.bucketInstanceId in this.collisionCircleArrays){const e=this.collisionCircleArrays[t.bucketInstanceId];t.placementInvProjMatrix=e.invProjMatrix,t.placementViewportMatrix=e.viewportMatrix,t.collisionCircleArray=e.circles,delete this.collisionCircleArrays[t.bucketInstanceId];}}symbolFadeChange(t){return 0===this.fadeDuration?1:(t-this.commitTime)/this.fadeDuration+this.prevZoomAdjustment}zoomAdjustment(t){return Math.max(0,(this.transform.zoom-t)/1.5)}hasTransitions(t){return this.stale||t-this.lastPlacementChangeTime<this.fadeDuration}stillRecent(t,e){const i=this.zoomAtLastRecencyCheck===e?1-this.zoomAdjustment(e):1;return this.zoomAtLastRecencyCheck=e,this.commitTime+this.fadeDuration*i>t}setStale(){this.stale=!0;}}function Ht(t,e,i,a,s,o){a&&0!==a.length||(a=[0,0,0,0]);const r=a[0]-Lt,n=a[1]-Lt,l=a[2]-Lt,h=a[3]-Lt;t.emplaceBack(e?1:0,i?1:0,s||0,o||0,r,n),t.emplaceBack(e?1:0,i?1:0,s||0,o||0,l,n),t.emplaceBack(e?1:0,i?1:0,s||0,o||0,l,h),t.emplaceBack(e?1:0,i?1:0,s||0,o||0,r,h);}const Wt=Math.pow(2,25),$t=Math.pow(2,24),Xt=Math.pow(2,17),Kt=Math.pow(2,16),Jt=Math.pow(2,9),Yt=Math.pow(2,8),Qt=Math.pow(2,1);function te(t){if(0===t.opacity&&!t.placed)return 0;if(1===t.opacity&&t.placed)return 4294967295;const e=t.placed?1:0,i=Math.floor(127*t.opacity);return i*Wt+e*$t+i*Xt+e*Kt+i*Jt+e*Yt+i*Qt+e}const ee=0;function ie(){return {isOccluded:(t,e,i)=>!1,getPitchedTextCorrection:(t,e,i)=>1,get useSpecialProjectionForSymbols(){return !1},projectTileCoordinates(t,e,i,a){throw new Error("Not implemented.")},translatePosition:(t,e,i,a)=>function(t,e,i,a,s=!1){if(!i[0]&&!i[1])return [0,0];const o=s?"map"===a?t.angle:0:"viewport"===a?-t.angle:0;if(o){const t=Math.sin(o),e=Math.cos(o);i=[i[0]*e-i[1]*t,i[0]*t+i[1]*e];}return [s?i[0]:Bt(e,i[0],t.zoom),s?i[1]:Bt(e,i[1],t.zoom)]}(t,e,i,a),getCircleRadiusCorrection:t=>1}}class ae{constructor(t){this._sortAcrossTiles="viewport-y"!==t.layout.get("symbol-z-order")&&!t.layout.get("symbol-sort-key").isConstant(),this._currentTileIndex=0,this._currentPartIndex=0,this._seenCrossTileIDs={},this._bucketParts=[];}continuePlacement(t,e,i,a,s){const o=this._bucketParts;for(;this._currentTileIndex<t.length;)if(e.getBucketParts(o,a,t[this._currentTileIndex],this._sortAcrossTiles),this._currentTileIndex++,s())return !0;for(this._sortAcrossTiles&&(this._sortAcrossTiles=!1,o.sort(((t,e)=>t.sortKey-e.sortKey)));this._currentPartIndex<o.length;)if(e.placeLayerBucketPart(o[this._currentPartIndex],this._seenCrossTileIDs,i),this._currentPartIndex++,s())return !0;return !1}}class se{constructor(t,e,i,a,s,o,r,n){this.placement=new Gt(t,ie(),e,o,r,n),this._currentPlacementIndex=i.length-1,this._forceFullPlacement=a,this._showCollisionBoxes=s,this._done=!1;}isDone(){return this._done}continuePlacement(t,e,i){const a=o.now(),s=()=>!this._forceFullPlacement&&o.now()-a>2;for(;this._currentPlacementIndex>=0;){const a=e[t[this._currentPlacementIndex]],o=this.placement.collisionIndex.transform.zoom;if("symbol"===a.type&&(!a.minzoom||a.minzoom<=o)&&(!a.maxzoom||a.maxzoom>o)){if(this._inProgressLayer||(this._inProgressLayer=new ae(a)),this._inProgressLayer.continuePlacement(i[a.source],this.placement,this._showCollisionBoxes,a,s))return;delete this._inProgressLayer;}this._currentPlacementIndex--;}this._done=!0;}commit(t){return this.placement.commit(t),this.placement}}const oe=512/e.X/2;class re{constructor(t,i,a){this.tileID=t,this.bucketInstanceId=a,this._symbolsByKey={};const s=new Map;for(let t=0;t<i.length;t++){const e=i.get(t),a=e.key,o=s.get(a);o?o.push(e):s.set(a,[e]);}for(const[t,i]of s){const a={positions:i.map((t=>({x:Math.floor(t.anchorX*oe),y:Math.floor(t.anchorY*oe)}))),crossTileIDs:i.map((t=>t.crossTileID))};if(a.positions.length>128){const t=new e.av(a.positions.length,16,Uint16Array);for(const{x:e,y:i}of a.positions)t.add(e,i);t.finish(),delete a.positions,a.index=t;}this._symbolsByKey[t]=a;}}getScaledCoordinates(t,i){const{x:a,y:s,z:o}=this.tileID.canonical,{x:r,y:n,z:l}=i.canonical,h=oe/Math.pow(2,l-o),c=(n*e.X+t.anchorY)*h,u=s*e.X*oe;return {x:Math.floor((r*e.X+t.anchorX)*h-a*e.X*oe),y:Math.floor(c-u)}}findMatches(t,e,i){const a=this.tileID.canonical.z<e.canonical.z?1:Math.pow(2,this.tileID.canonical.z-e.canonical.z);for(let s=0;s<t.length;s++){const o=t.get(s);if(o.crossTileID)continue;const r=this._symbolsByKey[o.key];if(!r)continue;const n=this.getScaledCoordinates(o,e);if(r.index){const t=r.index.range(n.x-a,n.y-a,n.x+a,n.y+a).sort();for(const e of t){const t=r.crossTileIDs[e];if(!i[t]){i[t]=!0,o.crossTileID=t;break}}}else if(r.positions)for(let t=0;t<r.positions.length;t++){const e=r.positions[t],s=r.crossTileIDs[t];if(Math.abs(e.x-n.x)<=a&&Math.abs(e.y-n.y)<=a&&!i[s]){i[s]=!0,o.crossTileID=s;break}}}}getCrossTileIDsLists(){return Object.values(this._symbolsByKey).map((({crossTileIDs:t})=>t))}}class ne{constructor(){this.maxCrossTileID=0;}generate(){return ++this.maxCrossTileID}}class le{constructor(){this.indexes={},this.usedCrossTileIDs={},this.lng=0;}handleWrapJump(t){const e=Math.round((t-this.lng)/360);if(0!==e)for(const t in this.indexes){const i=this.indexes[t],a={};for(const t in i){const s=i[t];s.tileID=s.tileID.unwrapTo(s.tileID.wrap+e),a[s.tileID.key]=s;}this.indexes[t]=a;}this.lng=t;}addBucket(t,e,i){if(this.indexes[t.overscaledZ]&&this.indexes[t.overscaledZ][t.key]){if(this.indexes[t.overscaledZ][t.key].bucketInstanceId===e.bucketInstanceId)return !1;this.removeBucketCrossTileIDs(t.overscaledZ,this.indexes[t.overscaledZ][t.key]);}for(let t=0;t<e.symbolInstances.length;t++)e.symbolInstances.get(t).crossTileID=0;this.usedCrossTileIDs[t.overscaledZ]||(this.usedCrossTileIDs[t.overscaledZ]={});const a=this.usedCrossTileIDs[t.overscaledZ];for(const i in this.indexes){const s=this.indexes[i];if(Number(i)>t.overscaledZ)for(const i in s){const o=s[i];o.tileID.isChildOf(t)&&o.findMatches(e.symbolInstances,t,a);}else {const o=s[t.scaledTo(Number(i)).key];o&&o.findMatches(e.symbolInstances,t,a);}}for(let t=0;t<e.symbolInstances.length;t++){const s=e.symbolInstances.get(t);s.crossTileID||(s.crossTileID=i.generate(),a[s.crossTileID]=!0);}return void 0===this.indexes[t.overscaledZ]&&(this.indexes[t.overscaledZ]={}),this.indexes[t.overscaledZ][t.key]=new re(t,e.symbolInstances,e.bucketInstanceId),!0}removeBucketCrossTileIDs(t,e){for(const i of e.getCrossTileIDsLists())for(const e of i)delete this.usedCrossTileIDs[t][e];}removeStaleBuckets(t){let e=!1;for(const i in this.indexes){const a=this.indexes[i];for(const s in a)t[a[s].bucketInstanceId]||(this.removeBucketCrossTileIDs(i,a[s]),delete a[s],e=!0);}return e}}class he{constructor(){this.layerIndexes={},this.crossTileIDs=new ne,this.maxBucketInstanceId=0,this.bucketsInCurrentPlacement={};}addLayer(t,e,i){let a=this.layerIndexes[t.id];void 0===a&&(a=this.layerIndexes[t.id]=new le);let s=!1;const o={};a.handleWrapJump(i);for(const i of e){const e=i.getBucket(t);e&&t.id===e.layerIds[0]&&(e.bucketInstanceId||(e.bucketInstanceId=++this.maxBucketInstanceId),a.addBucket(i.tileID,e,this.crossTileIDs)&&(s=!0),o[e.bucketInstanceId]=!0);}return a.removeStaleBuckets(o)&&(s=!0),s}pruneUnusedLayers(t){const e={};t.forEach((t=>{e[t]=!0;}));for(const t in this.layerIndexes)e[t]||delete this.layerIndexes[t];}}const ce=(t,i)=>e.t(t,i&&i.filter((t=>"source.canvas"!==t.identifier))),ue=e.aw();class de extends e.E{constructor(t,i={}){super(),this._rtlPluginLoaded=()=>{for(const t in this.sourceCaches){const e=this.sourceCaches[t].getSource().type;"vector"!==e&&"geojson"!==e||this.sourceCaches[t].reload();}},this.map=t,this.dispatcher=new U(N(),t._getMapId()),this.dispatcher.registerMessageHandler("GG",((t,e)=>this.getGlyphs(t,e))),this.dispatcher.registerMessageHandler("GI",((t,e)=>this.getImages(t,e))),this.imageManager=new T,this.imageManager.setEventedParent(this),this.glyphManager=new C(t._requestManager,i.localIdeographFontFamily),this.lineAtlas=new R(256,512),this.crossTileSymbolIndex=new he,this._spritesImagesIds={},this._layers={},this._order=[],this.sourceCaches={},this.zoomHistory=new e.ax,this._loaded=!1,this._availableImages=[],this._resetUpdates(),this.dispatcher.broadcast("SR",e.ay()),nt().on(st,this._rtlPluginLoaded),this.on("data",(t=>{if("source"!==t.dataType||"metadata"!==t.sourceDataType)return;const e=this.sourceCaches[t.sourceId];if(!e)return;const i=e.getSource();if(i&&i.vectorLayerIds)for(const t in this._layers){const e=this._layers[t];e.source===i.id&&this._validateLayer(e);}}));}loadURL(t,i={},a){this.fire(new e.k("dataloading",{dataType:"style"})),i.validate="boolean"!=typeof i.validate||i.validate;const s=this.map._requestManager.transformRequest(t,"Style");this._loadStyleRequest=new AbortController;const o=this._loadStyleRequest;e.h(s,this._loadStyleRequest).then((t=>{this._loadStyleRequest=null,this._load(t.data,i,a);})).catch((t=>{this._loadStyleRequest=null,t&&!o.signal.aborted&&this.fire(new e.j(t));}));}loadJSON(t,i={},a){this.fire(new e.k("dataloading",{dataType:"style"})),this._frameRequest=new AbortController,o.frameAsync(this._frameRequest).then((()=>{this._frameRequest=null,i.validate=!1!==i.validate,this._load(t,i,a);})).catch((()=>{}));}loadEmpty(){this.fire(new e.k("dataloading",{dataType:"style"})),this._load(ue,{validate:!1});}_load(t,i,a){var s;const o=i.transformStyle?i.transformStyle(a,t):t;if(!i.validate||!ce(this,e.u(o))){this._loaded=!0,this.stylesheet=o;for(const t in o.sources)this.addSource(t,o.sources[t],{validate:!1});o.sprite?this._loadSprite(o.sprite):this.imageManager.setLoaded(!0),this.glyphManager.setURL(o.glyphs),this._createLayers(),this.light=new D(this.stylesheet.light),this.sky=new A(this.stylesheet.sky),this.map.setTerrain(null!==(s=this.stylesheet.terrain)&&void 0!==s?s:null),this.fire(new e.k("data",{dataType:"style"})),this.fire(new e.k("style.load"));}}_createLayers(){const t=e.az(this.stylesheet.layers);this.dispatcher.broadcast("SL",t),this._order=t.map((t=>t.id)),this._layers={},this._serializedLayers=null;for(const i of t){const t=e.aA(i);t.setEventedParent(this,{layer:{id:i.id}}),this._layers[i.id]=t;}}_loadSprite(t,i=!1,a=void 0){let s;this.imageManager.setLoaded(!1),this._spriteRequest=new AbortController,function(t,i,a,s){return e._(this,void 0,void 0,(function*(){const r=x(t),n=a>1?"@2x":"",l={},h={};for(const{id:t,url:a}of r){const o=i.transformRequest(y(a,n,".json"),"SpriteJSON");l[t]=e.h(o,s);const r=i.transformRequest(y(a,n,".png"),"SpriteImage");h[t]=_.getImage(r,s);}return yield Promise.all([...Object.values(l),...Object.values(h)]),function(t,i){return e._(this,void 0,void 0,(function*(){const e={};for(const a in t){e[a]={};const s=o.getImageCanvasContext((yield i[a]).data),r=(yield t[a]).data;for(const t in r){const{width:i,height:o,x:n,y:l,sdf:h,pixelRatio:c,stretchX:u,stretchY:d,content:_,textFitWidth:p,textFitHeight:m}=r[t];e[a][t]={data:null,pixelRatio:c,sdf:h,stretchX:u,stretchY:d,content:_,textFitWidth:p,textFitHeight:m,spriteData:{width:i,height:o,x:n,y:l,context:s}};}}return e}))}(l,h)}))}(t,this.map._requestManager,this.map.getPixelRatio(),this._spriteRequest).then((t=>{if(this._spriteRequest=null,t)for(const e in t){this._spritesImagesIds[e]=[];const a=this._spritesImagesIds[e]?this._spritesImagesIds[e].filter((e=>!(e in t))):[];for(const t of a)this.imageManager.removeImage(t),this._changedImages[t]=!0;for(const a in t[e]){const s="default"===e?a:`${e}:${a}`;this._spritesImagesIds[e].push(s),s in this.imageManager.images?this.imageManager.updateImage(s,t[e][a],!1):this.imageManager.addImage(s,t[e][a]),i&&(this._changedImages[s]=!0);}}})).catch((t=>{this._spriteRequest=null,s=t,this.fire(new e.j(s));})).finally((()=>{this.imageManager.setLoaded(!0),this._availableImages=this.imageManager.listImages(),i&&(this._changed=!0),this.dispatcher.broadcast("SI",this._availableImages),this.fire(new e.k("data",{dataType:"style"})),a&&a(s);}));}_unloadSprite(){for(const t of Object.values(this._spritesImagesIds).flat())this.imageManager.removeImage(t),this._changedImages[t]=!0;this._spritesImagesIds={},this._availableImages=this.imageManager.listImages(),this._changed=!0,this.dispatcher.broadcast("SI",this._availableImages),this.fire(new e.k("data",{dataType:"style"}));}_validateLayer(t){const i=this.sourceCaches[t.source];if(!i)return;const a=t.sourceLayer;if(!a)return;const s=i.getSource();("geojson"===s.type||s.vectorLayerIds&&-1===s.vectorLayerIds.indexOf(a))&&this.fire(new e.j(new Error(`Source layer "${a}" does not exist on source "${s.id}" as specified by style layer "${t.id}".`)));}loaded(){if(!this._loaded)return !1;if(Object.keys(this._updatedSources).length)return !1;for(const t in this.sourceCaches)if(!this.sourceCaches[t].loaded())return !1;return !!this.imageManager.isLoaded()}_serializeByIds(t,i=!1){const a=this._serializedAllLayers();if(!t||0===t.length)return Object.values(i?e.aB(a):a);const s=[];for(const o of t)if(a[o]){const t=i?e.aB(a[o]):a[o];s.push(t);}return s}_serializedAllLayers(){let t=this._serializedLayers;if(t)return t;t=this._serializedLayers={};const e=Object.keys(this._layers);for(const i of e){const e=this._layers[i];"custom"!==e.type&&(t[i]=e.serialize());}return t}hasTransitions(){if(this.light&&this.light.hasTransition())return !0;if(this.sky&&this.sky.hasTransition())return !0;for(const t in this.sourceCaches)if(this.sourceCaches[t].hasTransition())return !0;for(const t in this._layers)if(this._layers[t].hasTransition())return !0;return !1}_checkLoaded(){if(!this._loaded)throw new Error("Style is not done loading.")}update(t){if(!this._loaded)return;const i=this._changed;if(i){const e=Object.keys(this._updatedLayers),i=Object.keys(this._removedLayers);(e.length||i.length)&&this._updateWorkerLayers(e,i);for(const t in this._updatedSources){const e=this._updatedSources[t];if("reload"===e)this._reloadSource(t);else {if("clear"!==e)throw new Error(`Invalid action ${e}`);this._clearSource(t);}}this._updateTilesForChangedImages(),this._updateTilesForChangedGlyphs();for(const e in this._updatedPaintProps)this._layers[e].updateTransitions(t);this.light.updateTransitions(t),this.sky.updateTransitions(t),this._resetUpdates();}const a={};for(const t in this.sourceCaches){const e=this.sourceCaches[t];a[t]=e.used,e.used=!1;}for(const e of this._order){const i=this._layers[e];i.recalculate(t,this._availableImages),!i.isHidden(t.zoom)&&i.source&&(this.sourceCaches[i.source].used=!0);}for(const t in a){const i=this.sourceCaches[t];!!a[t]!=!!i.used&&i.fire(new e.k("data",{sourceDataType:"visibility",dataType:"source",sourceId:t}));}this.light.recalculate(t),this.sky.recalculate(t),this.z=t.zoom,i&&this.fire(new e.k("data",{dataType:"style"}));}_updateTilesForChangedImages(){const t=Object.keys(this._changedImages);if(t.length){for(const e in this.sourceCaches)this.sourceCaches[e].reloadTilesForDependencies(["icons","patterns"],t);this._changedImages={};}}_updateTilesForChangedGlyphs(){if(this._glyphsDidChange){for(const t in this.sourceCaches)this.sourceCaches[t].reloadTilesForDependencies(["glyphs"],[""]);this._glyphsDidChange=!1;}}_updateWorkerLayers(t,e){this.dispatcher.broadcast("UL",{layers:this._serializeByIds(t,!1),removedIds:e});}_resetUpdates(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSources={},this._updatedPaintProps={},this._changedImages={},this._glyphsDidChange=!1;}setState(t,i={}){var a;this._checkLoaded();const s=this.serialize();if(t=i.transformStyle?i.transformStyle(s,t):t,(null===(a=i.validate)||void 0===a||a)&&ce(this,e.u(t)))return !1;(t=e.aB(t)).layers=e.az(t.layers);const o=e.aC(s,t),r=this._getOperationsToPerform(o);if(r.unimplemented.length>0)throw new Error(`Unimplemented: ${r.unimplemented.join(", ")}.`);if(0===r.operations.length)return !1;for(const t of r.operations)t();return this.stylesheet=t,this._serializedLayers=null,!0}_getOperationsToPerform(t){const e=[],i=[];for(const a of t)switch(a.command){case"setCenter":case"setZoom":case"setBearing":case"setPitch":continue;case"addLayer":e.push((()=>this.addLayer.apply(this,a.args)));break;case"removeLayer":e.push((()=>this.removeLayer.apply(this,a.args)));break;case"setPaintProperty":e.push((()=>this.setPaintProperty.apply(this,a.args)));break;case"setLayoutProperty":e.push((()=>this.setLayoutProperty.apply(this,a.args)));break;case"setFilter":e.push((()=>this.setFilter.apply(this,a.args)));break;case"addSource":e.push((()=>this.addSource.apply(this,a.args)));break;case"removeSource":e.push((()=>this.removeSource.apply(this,a.args)));break;case"setLayerZoomRange":e.push((()=>this.setLayerZoomRange.apply(this,a.args)));break;case"setLight":e.push((()=>this.setLight.apply(this,a.args)));break;case"setGeoJSONSourceData":e.push((()=>this.setGeoJSONSourceData.apply(this,a.args)));break;case"setGlyphs":e.push((()=>this.setGlyphs.apply(this,a.args)));break;case"setSprite":e.push((()=>this.setSprite.apply(this,a.args)));break;case"setSky":e.push((()=>this.setSky.apply(this,a.args)));break;case"setTerrain":e.push((()=>this.map.setTerrain.apply(this,a.args)));break;case"setTransition":e.push((()=>{}));break;default:i.push(a.command);}return {operations:e,unimplemented:i}}addImage(t,i){if(this.getImage(t))return this.fire(new e.j(new Error(`An image named "${t}" already exists.`)));this.imageManager.addImage(t,i),this._afterImageUpdated(t);}updateImage(t,e){this.imageManager.updateImage(t,e);}getImage(t){return this.imageManager.getImage(t)}removeImage(t){if(!this.getImage(t))return this.fire(new e.j(new Error(`An image named "${t}" does not exist.`)));this.imageManager.removeImage(t),this._afterImageUpdated(t);}_afterImageUpdated(t){this._availableImages=this.imageManager.listImages(),this._changedImages[t]=!0,this._changed=!0,this.dispatcher.broadcast("SI",this._availableImages),this.fire(new e.k("data",{dataType:"style"}));}listImages(){return this._checkLoaded(),this.imageManager.listImages()}addSource(t,i,a={}){if(this._checkLoaded(),void 0!==this.sourceCaches[t])throw new Error(`Source "${t}" already exists.`);if(!i.type)throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(i).join(", ")}.`);if(["vector","raster","geojson","video","image"].indexOf(i.type)>=0&&this._validate(e.u.source,`sources.${t}`,i,null,a))return;this.map&&this.map._collectResourceTiming&&(i.collectResourceTiming=!0);const s=this.sourceCaches[t]=new ut(t,i,this.dispatcher);s.style=this,s.setEventedParent(this,(()=>({isSourceLoaded:s.loaded(),source:s.serialize(),sourceId:t}))),s.onAdd(this.map),this._changed=!0;}removeSource(t){if(this._checkLoaded(),void 0===this.sourceCaches[t])throw new Error("There is no source with this ID");for(const i in this._layers)if(this._layers[i].source===t)return this.fire(new e.j(new Error(`Source "${t}" cannot be removed while layer "${i}" is using it.`)));const i=this.sourceCaches[t];delete this.sourceCaches[t],delete this._updatedSources[t],i.fire(new e.k("data",{sourceDataType:"metadata",dataType:"source",sourceId:t})),i.setEventedParent(null),i.onRemove(this.map),this._changed=!0;}setGeoJSONSourceData(t,e){if(this._checkLoaded(),void 0===this.sourceCaches[t])throw new Error(`There is no source with this ID=${t}`);const i=this.sourceCaches[t].getSource();if("geojson"!==i.type)throw new Error(`geojsonSource.type is ${i.type}, which is !== 'geojson`);i.setData(e),this._changed=!0;}getSource(t){return this.sourceCaches[t]&&this.sourceCaches[t].getSource()}addLayer(t,i,a={}){this._checkLoaded();const s=t.id;if(this.getLayer(s))return void this.fire(new e.j(new Error(`Layer "${s}" already exists on this map.`)));let o;if("custom"===t.type){if(ce(this,e.aD(t)))return;o=e.aA(t);}else {if("source"in t&&"object"==typeof t.source&&(this.addSource(s,t.source),t=e.aB(t),t=e.e(t,{source:s})),this._validate(e.u.layer,`layers.${s}`,t,{arrayIndex:-1},a))return;o=e.aA(t),this._validateLayer(o),o.setEventedParent(this,{layer:{id:s}});}const r=i?this._order.indexOf(i):this._order.length;if(i&&-1===r)this.fire(new e.j(new Error(`Cannot add layer "${s}" before non-existing layer "${i}".`)));else {if(this._order.splice(r,0,s),this._layerOrderChanged=!0,this._layers[s]=o,this._removedLayers[s]&&o.source&&"custom"!==o.type){const t=this._removedLayers[s];delete this._removedLayers[s],t.type!==o.type?this._updatedSources[o.source]="clear":(this._updatedSources[o.source]="reload",this.sourceCaches[o.source].pause());}this._updateLayer(o),o.onAdd&&o.onAdd(this.map);}}moveLayer(t,i){if(this._checkLoaded(),this._changed=!0,!this._layers[t])return void this.fire(new e.j(new Error(`The layer '${t}' does not exist in the map's style and cannot be moved.`)));if(t===i)return;const a=this._order.indexOf(t);this._order.splice(a,1);const s=i?this._order.indexOf(i):this._order.length;i&&-1===s?this.fire(new e.j(new Error(`Cannot move layer "${t}" before non-existing layer "${i}".`))):(this._order.splice(s,0,t),this._layerOrderChanged=!0);}removeLayer(t){this._checkLoaded();const i=this._layers[t];if(!i)return void this.fire(new e.j(new Error(`Cannot remove non-existing layer "${t}".`)));i.setEventedParent(null);const a=this._order.indexOf(t);this._order.splice(a,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[t]=i,delete this._layers[t],this._serializedLayers&&delete this._serializedLayers[t],delete this._updatedLayers[t],delete this._updatedPaintProps[t],i.onRemove&&i.onRemove(this.map);}getLayer(t){return this._layers[t]}getLayersOrder(){return [...this._order]}hasLayer(t){return t in this._layers}setLayerZoomRange(t,i,a){this._checkLoaded();const s=this.getLayer(t);s?s.minzoom===i&&s.maxzoom===a||(null!=i&&(s.minzoom=i),null!=a&&(s.maxzoom=a),this._updateLayer(s)):this.fire(new e.j(new Error(`Cannot set the zoom range of non-existing layer "${t}".`)));}setFilter(t,i,a={}){this._checkLoaded();const s=this.getLayer(t);if(s){if(!e.aE(s.filter,i))return null==i?(s.filter=void 0,void this._updateLayer(s)):void(this._validate(e.u.filter,`layers.${s.id}.filter`,i,null,a)||(s.filter=e.aB(i),this._updateLayer(s)))}else this.fire(new e.j(new Error(`Cannot filter non-existing layer "${t}".`)));}getFilter(t){return e.aB(this.getLayer(t).filter)}setLayoutProperty(t,i,a,s={}){this._checkLoaded();const o=this.getLayer(t);o?e.aE(o.getLayoutProperty(i),a)||(o.setLayoutProperty(i,a,s),this._updateLayer(o)):this.fire(new e.j(new Error(`Cannot style non-existing layer "${t}".`)));}getLayoutProperty(t,i){const a=this.getLayer(t);if(a)return a.getLayoutProperty(i);this.fire(new e.j(new Error(`Cannot get style of non-existing layer "${t}".`)));}setPaintProperty(t,i,a,s={}){this._checkLoaded();const o=this.getLayer(t);o?e.aE(o.getPaintProperty(i),a)||(o.setPaintProperty(i,a,s)&&this._updateLayer(o),this._changed=!0,this._updatedPaintProps[t]=!0,this._serializedLayers=null):this.fire(new e.j(new Error(`Cannot style non-existing layer "${t}".`)));}getPaintProperty(t,e){return this.getLayer(t).getPaintProperty(e)}setFeatureState(t,i){this._checkLoaded();const a=t.source,s=t.sourceLayer,o=this.sourceCaches[a];if(void 0===o)return void this.fire(new e.j(new Error(`The source '${a}' does not exist in the map's style.`)));const r=o.getSource().type;"geojson"===r&&s?this.fire(new e.j(new Error("GeoJSON sources cannot have a sourceLayer parameter."))):"vector"!==r||s?(void 0===t.id&&this.fire(new e.j(new Error("The feature id parameter must be provided."))),o.setFeatureState(s,t.id,i)):this.fire(new e.j(new Error("The sourceLayer parameter must be provided for vector source types.")));}removeFeatureState(t,i){this._checkLoaded();const a=t.source,s=this.sourceCaches[a];if(void 0===s)return void this.fire(new e.j(new Error(`The source '${a}' does not exist in the map's style.`)));const o=s.getSource().type,r="vector"===o?t.sourceLayer:void 0;"vector"!==o||r?i&&"string"!=typeof t.id&&"number"!=typeof t.id?this.fire(new e.j(new Error("A feature id is required to remove its specific state property."))):s.removeFeatureState(r,t.id,i):this.fire(new e.j(new Error("The sourceLayer parameter must be provided for vector source types.")));}getFeatureState(t){this._checkLoaded();const i=t.source,a=t.sourceLayer,s=this.sourceCaches[i];if(void 0!==s)return "vector"!==s.getSource().type||a?(void 0===t.id&&this.fire(new e.j(new Error("The feature id parameter must be provided."))),s.getFeatureState(a,t.id)):void this.fire(new e.j(new Error("The sourceLayer parameter must be provided for vector source types.")));this.fire(new e.j(new Error(`The source '${i}' does not exist in the map's style.`)));}getTransition(){return e.e({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)}serialize(){if(!this._loaded)return;const t=e.aF(this.sourceCaches,(t=>t.serialize())),i=this._serializeByIds(this._order,!0),a=this.map.getTerrain()||void 0,s=this.stylesheet;return e.aG({version:s.version,name:s.name,metadata:s.metadata,light:s.light,sky:s.sky,center:s.center,zoom:s.zoom,bearing:s.bearing,pitch:s.pitch,sprite:s.sprite,glyphs:s.glyphs,transition:s.transition,sources:t,layers:i,terrain:a},(t=>void 0!==t))}_updateLayer(t){this._updatedLayers[t.id]=!0,t.source&&!this._updatedSources[t.source]&&"raster"!==this.sourceCaches[t.source].getSource().type&&(this._updatedSources[t.source]="reload",this.sourceCaches[t.source].pause()),this._serializedLayers=null,this._changed=!0;}_flattenAndSortRenderedFeatures(t){const e=t=>"fill-extrusion"===this._layers[t].type,i={},a=[];for(let s=this._order.length-1;s>=0;s--){const o=this._order[s];if(e(o)){i[o]=s;for(const e of t){const t=e[o];if(t)for(const e of t)a.push(e);}}}a.sort(((t,e)=>e.intersectionZ-t.intersectionZ));const s=[];for(let o=this._order.length-1;o>=0;o--){const r=this._order[o];if(e(r))for(let t=a.length-1;t>=0;t--){const e=a[t].feature;if(i[e.layer.id]<o)break;s.push(e),a.pop();}else for(const e of t){const t=e[r];if(t)for(const e of t)s.push(e.feature);}}return s}queryRenderedFeatures(t,i,a){i&&i.filter&&this._validate(e.u.filter,"queryRenderedFeatures.filter",i.filter,null,i);const s={};if(i&&i.layers){if(!Array.isArray(i.layers))return this.fire(new e.j(new Error("parameters.layers must be an Array."))),[];for(const t of i.layers){const i=this._layers[t];if(!i)return this.fire(new e.j(new Error(`The layer '${t}' does not exist in the map's style and cannot be queried for features.`))),[];s[i.source]=!0;}}const o=[];i.availableImages=this._availableImages;const r=this._serializedAllLayers();for(const e in this.sourceCaches)i.layers&&!s[e]||o.push(q(this.sourceCaches[e],this._layers,r,t,i,a));return this.placement&&o.push(function(t,e,i,a,s,o,r){const n={},l=o.queryRenderedSymbols(a),h=[];for(const t of Object.keys(l).map(Number))h.push(r[t]);h.sort(V);for(const i of h){const a=i.featureIndex.lookupSymbolFeatures(l[i.bucketInstanceId],e,i.bucketIndex,i.sourceLayerIndex,s.filter,s.layers,s.availableImages,t);for(const t in a){const e=n[t]=n[t]||[],s=a[t];s.sort(((t,e)=>{const a=i.featureSortOrder;if(a){const i=a.indexOf(t.featureIndex);return a.indexOf(e.featureIndex)-i}return e.featureIndex-t.featureIndex}));for(const t of s)e.push(t);}}for(const e in n)n[e].forEach((a=>{const s=a.feature,o=i[t[e].source].getFeatureState(s.layer["source-layer"],s.id);s.source=s.layer.source,s.layer["source-layer"]&&(s.sourceLayer=s.layer["source-layer"]),s.state=o;}));return n}(this._layers,r,this.sourceCaches,t,i,this.placement.collisionIndex,this.placement.retainedQueryData)),this._flattenAndSortRenderedFeatures(o)}querySourceFeatures(t,i){i&&i.filter&&this._validate(e.u.filter,"querySourceFeatures.filter",i.filter,null,i);const a=this.sourceCaches[t];return a?function(t,e){const i=t.getRenderableIds().map((e=>t.getTileByID(e))),a=[],s={};for(let t=0;t<i.length;t++){const o=i[t],r=o.tileID.canonical.key;s[r]||(s[r]=!0,o.querySourceFeatures(a,e));}return a}(a,i):[]}getLight(){return this.light.getLight()}setLight(t,i={}){this._checkLoaded();const a=this.light.getLight();let s=!1;for(const i in t)if(!e.aE(t[i],a[i])){s=!0;break}if(!s)return;const r={now:o.now(),transition:e.e({duration:300,delay:0},this.stylesheet.transition)};this.light.setLight(t,i),this.light.updateTransitions(r);}getSky(){var t;return null===(t=this.stylesheet)||void 0===t?void 0:t.sky}setSky(t,i={}){const a=this.getSky();let s=!1;if(!t&&!a)return;if(t&&!a)s=!0;else if(!t&&a)s=!0;else for(const i in t)if(!e.aE(t[i],a[i])){s=!0;break}if(!s)return;const r={now:o.now(),transition:e.e({duration:300,delay:0},this.stylesheet.transition)};this.stylesheet.sky=t,this.sky.setSky(t,i),this.sky.updateTransitions(r);}_validate(t,i,a,s,o={}){return (!o||!1!==o.validate)&&ce(this,t.call(e.u,e.e({key:i,style:this.serialize(),value:a,styleSpec:e.v},s)))}_remove(t=!0){this._frameRequest&&(this._frameRequest.abort(),this._frameRequest=null),this._loadStyleRequest&&(this._loadStyleRequest.abort(),this._loadStyleRequest=null),this._spriteRequest&&(this._spriteRequest.abort(),this._spriteRequest=null),nt().off(st,this._rtlPluginLoaded);for(const t in this._layers)this._layers[t].setEventedParent(null);for(const t in this.sourceCaches){const e=this.sourceCaches[t];e.setEventedParent(null),e.onRemove(this.map);}this.imageManager.setEventedParent(null),this.setEventedParent(null),t&&this.dispatcher.broadcast("RM",void 0),this.dispatcher.remove(t);}_clearSource(t){this.sourceCaches[t].clearTiles();}_reloadSource(t){this.sourceCaches[t].resume(),this.sourceCaches[t].reload();}_updateSources(t){for(const e in this.sourceCaches)this.sourceCaches[e].update(t,this.map.terrain);}_generateCollisionBoxes(){for(const t in this.sourceCaches)this._reloadSource(t);}_updatePlacement(t,e,i,a,s=!1){let r=!1,n=!1;const l={};for(const e of this._order){const i=this._layers[e];if("symbol"!==i.type)continue;if(!l[i.source]){const t=this.sourceCaches[i.source];l[i.source]=t.getRenderableIds(!0).map((e=>t.getTileByID(e))).sort(((t,e)=>e.tileID.overscaledZ-t.tileID.overscaledZ||(t.tileID.isLessThan(e.tileID)?-1:1)));}const a=this.crossTileSymbolIndex.addLayer(i,l[i.source],t.center.lng);r=r||a;}if(this.crossTileSymbolIndex.pruneUnusedLayers(this._order),((s=s||this._layerOrderChanged||0===i)||!this.pauseablePlacement||this.pauseablePlacement.isDone()&&!this.placement.stillRecent(o.now(),t.zoom))&&(this.pauseablePlacement=new se(t,this.map.terrain,this._order,s,e,i,a,this.placement),this._layerOrderChanged=!1),this.pauseablePlacement.isDone()?this.placement.setStale():(this.pauseablePlacement.continuePlacement(this._order,this._layers,l),this.pauseablePlacement.isDone()&&(this.placement=this.pauseablePlacement.commit(o.now()),n=!0),r&&this.pauseablePlacement.placement.setStale()),n||r)for(const t of this._order){const e=this._layers[t];"symbol"===e.type&&this.placement.updateLayerOpacities(e,l[e.source]);}return !this.pauseablePlacement.isDone()||this.placement.hasTransitions(o.now())}_releaseSymbolFadeTiles(){for(const t in this.sourceCaches)this.sourceCaches[t].releaseSymbolFadeTiles();}getImages(t,i){return e._(this,void 0,void 0,(function*(){const t=yield this.imageManager.getImages(i.icons);this._updateTilesForChangedImages();const e=this.sourceCaches[i.source];return e&&e.setDependencies(i.tileID.key,i.type,i.icons),t}))}getGlyphs(t,i){return e._(this,void 0,void 0,(function*(){const t=yield this.glyphManager.getGlyphs(i.stacks),e=this.sourceCaches[i.source];return e&&e.setDependencies(i.tileID.key,i.type,[""]),t}))}getGlyphsUrl(){return this.stylesheet.glyphs||null}setGlyphs(t,i={}){this._checkLoaded(),t&&this._validate(e.u.glyphs,"glyphs",t,null,i)||(this._glyphsDidChange=!0,this.stylesheet.glyphs=t,this.glyphManager.entries={},this.glyphManager.setURL(t));}addSprite(t,i,a={},s){this._checkLoaded();const o=[{id:t,url:i}],r=[...x(this.stylesheet.sprite),...o];this._validate(e.u.sprite,"sprite",r,null,a)||(this.stylesheet.sprite=r,this._loadSprite(o,!0,s));}removeSprite(t){this._checkLoaded();const i=x(this.stylesheet.sprite);if(i.find((e=>e.id===t))){if(this._spritesImagesIds[t])for(const e of this._spritesImagesIds[t])this.imageManager.removeImage(e),this._changedImages[e]=!0;i.splice(i.findIndex((e=>e.id===t)),1),this.stylesheet.sprite=i.length>0?i:void 0,delete this._spritesImagesIds[t],this._availableImages=this.imageManager.listImages(),this._changed=!0,this.dispatcher.broadcast("SI",this._availableImages),this.fire(new e.k("data",{dataType:"style"}));}else this.fire(new e.j(new Error(`Sprite "${t}" doesn't exists on this map.`)));}getSprite(){return x(this.stylesheet.sprite)}setSprite(t,i={},a){this._checkLoaded(),t&&this._validate(e.u.sprite,"sprite",t,null,i)||(this.stylesheet.sprite=t,t?this._loadSprite(t,!0,a):(this._unloadSprite(),a&&a(null)));}}var _e=e.Y([{name:"a_pos",type:"Int16",components:2}]);const pe={prelude:me("#ifdef GL_ES\nprecision mediump float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif\n","#ifdef GL_ES\nprecision highp float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(unpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}\n#ifdef TERRAIN3D\nuniform sampler2D u_terrain;uniform float u_terrain_dim;uniform mat4 u_terrain_matrix;uniform vec4 u_terrain_unpack;uniform float u_terrain_exaggeration;uniform highp sampler2D u_depth;\n#endif\nconst highp vec4 bitSh=vec4(256.*256.*256.,256.*256.,256.,1.);const highp vec4 bitShifts=vec4(1.)/bitSh;highp float unpack(highp vec4 color) {return dot(color,bitShifts);}highp float depthOpacity(vec3 frag) {\n#ifdef TERRAIN3D\nhighp float d=unpack(texture2D(u_depth,frag.xy*0.5+0.5))+0.0001-frag.z;return 1.0-max(0.0,min(1.0,-d*500.0));\n#else\nreturn 1.0;\n#endif\n}float calculate_visibility(vec4 pos) {\n#ifdef TERRAIN3D\nvec3 frag=pos.xyz/pos.w;highp float d=depthOpacity(frag);if (d > 0.95) return 1.0;return (d+depthOpacity(frag+vec3(0.0,0.01,0.0)))/2.0;\n#else\nreturn 1.0;\n#endif\n}float ele(vec2 pos) {\n#ifdef TERRAIN3D\nvec4 rgb=(texture2D(u_terrain,pos)*255.0)*u_terrain_unpack;return rgb.r+rgb.g+rgb.b-u_terrain_unpack.a;\n#else\nreturn 0.0;\n#endif\n}float get_elevation(vec2 pos) {\n#ifdef TERRAIN3D\nvec2 coord=(u_terrain_matrix*vec4(pos,0.0,1.0)).xy*u_terrain_dim+1.0;vec2 f=fract(coord);vec2 c=(floor(coord)+0.5)/(u_terrain_dim+2.0);float d=1.0/(u_terrain_dim+2.0);float tl=ele(c);float tr=ele(c+vec2(d,0.0));float bl=ele(c+vec2(0.0,d));float br=ele(c+vec2(d,d));float elevation=mix(mix(tl,tr,f.x),mix(bl,br,f.x),f.y);return elevation*u_terrain_exaggeration;\n#else\nreturn 0.0;\n#endif\n}"),background:me("uniform vec4 u_color;uniform float u_opacity;void main() {gl_FragColor=u_color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),backgroundPattern:me("uniform vec2 u_pattern_tl_a;uniform vec2 u_pattern_br_a;uniform vec2 u_pattern_tl_b;uniform vec2 u_pattern_br_b;uniform vec2 u_texsize;uniform float u_mix;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(u_pattern_tl_a/u_texsize,u_pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(u_pattern_tl_b/u_texsize,u_pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_mix)*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pattern_size_a;uniform vec2 u_pattern_size_b;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_scale_a;uniform float u_scale_b;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_a*u_pattern_size_a,u_tile_units_to_pixels,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_b*u_pattern_size_b,u_tile_units_to_pixels,a_pos);}"),circle:me("varying vec3 v_data;varying float v_visibility;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);float antialiased_blur=v_data.z;float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(antialiased_blur,0.0,extrude_length-radius/(radius+stroke_width));gl_FragColor=v_visibility*opacity_t*mix(color*opacity,stroke_color*stroke_opacity,color_t);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform bool u_scale_with_map;uniform bool u_pitch_with_map;uniform vec2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;varying vec3 v_data;varying float v_visibility;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvoid main(void) {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);float ele=get_elevation(circle_center);v_visibility=calculate_visibility(u_matrix*vec4(circle_center,ele,1.0));if (u_pitch_with_map) {vec2 corner_position=circle_center;if (u_scale_with_map) {corner_position+=extrude*(radius+stroke_width)*u_extrude_scale;} else {vec4 projected_center=u_matrix*vec4(circle_center,0,1);corner_position+=extrude*(radius+stroke_width)*u_extrude_scale*(projected_center.w/u_camera_to_center_distance);}gl_Position=u_matrix*vec4(corner_position,ele,1);} else {gl_Position=u_matrix*vec4(circle_center,ele,1);if (u_scale_with_map) {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*u_camera_to_center_distance;} else {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*gl_Position.w;}}float antialiasblur=-max(1.0/u_device_pixel_ratio/(radius+stroke_width),blur);v_data=vec3(extrude.x,extrude.y,antialiasblur);}"),clippingMask:me("void main() {gl_FragColor=vec4(1.0);}","attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),heatmap:me("uniform highp float u_intensity;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#define GAUSS_COEF 0.3989422804014327\nvoid main() {\n#pragma mapbox: initialize highp float weight\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\nconst highp float ZERO=1.0/255.0/16.0;\n#define GAUSS_COEF 0.3989422804014327\nvoid main(void) {\n#pragma mapbox: initialize highp float weight\n#pragma mapbox: initialize mediump float radius\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec4 pos=vec4(floor(a_pos*0.5)+extrude,get_elevation(floor(a_pos*0.5)),1);gl_Position=u_matrix*pos;}"),heatmapTexture:me("uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(0.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_world;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos*u_world,0,1);v_pos.x=a_pos.x;v_pos.y=1.0-a_pos.y;}"),collisionBox:me("varying float v_placed;varying float v_notUsed;void main() {float alpha=0.5;gl_FragColor=vec4(1.0,0.0,0.0,1.0)*alpha;if (v_placed > 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}","attribute vec2 a_anchor_pos;attribute vec2 a_placed;attribute vec2 a_box_real;uniform mat4 u_matrix;uniform vec2 u_pixel_extrude_scale;varying float v_placed;varying float v_notUsed;vec4 projectTileWithElevation(vec2 posInTile,float elevation) {return u_matrix*vec4(posInTile,elevation,1.0);}void main() {gl_Position=projectTileWithElevation(a_anchor_pos,get_elevation(a_anchor_pos));gl_Position.xy=((a_box_real+0.5)*u_pixel_extrude_scale*2.0-1.0)*vec2(1.0,-1.0)*gl_Position.w;if (gl_Position.z/gl_Position.w < 1.1) {gl_Position.z=0.5;}v_placed=a_placed.x;v_notUsed=a_placed.y;}"),collisionCircle:me("varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}","attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}"),debug:me("uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}","attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,get_elevation(a_pos),1);}"),fill:me("#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_FragColor=color*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);}"),fillOutline:me("varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),fillOutlinePattern:me("uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),fillPattern:me("#ifdef GL_ES\nprecision highp float;\n#endif\nuniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}"),fillExtrusion:me("varying vec4 v_color;void main() {gl_FragColor=v_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;\n#ifdef TERRAIN3D\nattribute vec2 a_centroid;\n#endif\nvarying vec4 v_color;\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n#pragma mapbox: define highp vec4 color\nvoid main() {\n#pragma mapbox: initialize highp float base\n#pragma mapbox: initialize highp float height\n#pragma mapbox: initialize highp vec4 color\nvec3 normal=a_normal_ed.xyz;\n#ifdef TERRAIN3D\nfloat height_terrain3d_offset=get_elevation(a_centroid);float base_terrain3d_offset=height_terrain3d_offset-(base > 0.0 ? 0.0 : 10.0);\n#else\nfloat height_terrain3d_offset=0.0;float base_terrain3d_offset=0.0;\n#endif\nbase=max(0.0,base)+base_terrain3d_offset;height=max(0.0,height)+height_terrain3d_offset;float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}"),fillExtrusionPattern:me("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;\n#ifdef TERRAIN3D\nattribute vec2 a_centroid;\n#endif\nvarying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;\n#ifdef TERRAIN3D\nfloat height_terrain3d_offset=get_elevation(a_centroid);float base_terrain3d_offset=height_terrain3d_offset-(base > 0.0 ? 0.0 : 10.0);\n#else\nfloat height_terrain3d_offset=0.0;float base_terrain3d_offset=0.0;\n#endif\nbase=max(0.0,base)+base_terrain3d_offset;height=max(0.0,height)+height_terrain3d_offset;float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\n? a_pos\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}"),hillshadePrepare:me("#ifdef GL_ES\nprecision highp float;\n#endif\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}"),hillshade:me("uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\n#define PI 3.141592653589793\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}"),line:me("uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifdef TERRAIN3D\nv_gamma_scale=1.0;\n#else\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#endif\nv_width2=vec2(outset,inset);}"),lineGradient:me("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifdef TERRAIN3D\nv_gamma_scale=1.0;\n#else\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#endif\nv_width2=vec2(outset,inset);}"),linePattern:me("#ifdef GL_ES\nprecision highp float;\n#endif\nuniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifdef TERRAIN3D\nv_gamma_scale=1.0;\n#else\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#endif\nv_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}"),lineSDF:me("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifdef TERRAIN3D\nv_gamma_scale=1.0;\n#else\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#endif\nv_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}"),raster:me("uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}"),symbolIcon:me("uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;uniform bool u_is_along_line;uniform bool u_is_variable_anchor;uniform vec2 u_translation;uniform float u_pitched_scale;varying vec2 v_tex;varying float v_fade_opacity;vec4 projectTileWithElevation(vec2 posInTile,float elevation) {return u_matrix*vec4(posInTile,elevation,1.0);}\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;float ele=get_elevation(a_pos);highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 translated_a_pos=a_pos+u_translation;vec4 projectedPoint=projectTileWithElevation(translated_a_pos,ele);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=projectTileWithElevation(translated_a_pos+vec2(1,0),ele);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos;if (u_is_along_line || u_is_variable_anchor) {projected_pos=vec4(a_projected_pos.xy,ele,1.0);} else if (u_pitch_with_map) {projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy+u_translation,ele,1.0);} else {projected_pos=u_label_plane_matrix*projectTileWithElevation(a_projected_pos.xy+u_translation,ele);}float z=float(u_pitch_with_map)*projected_pos.z/projected_pos.w;float projectionScaling=1.0;vec4 finalPos=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0)*projectionScaling,z,1.0);if(u_pitch_with_map) {finalPos=projectTileWithElevation(finalPos.xy,finalPos.z);}gl_Position=finalPos;v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float visibility=calculate_visibility(projectedPoint);v_fade_opacity=max(0.0,min(visibility,fade_opacity[0]+fade_change));}"),symbolSDF:me("#define SDF_PX 8.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float inner_edge=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);inner_edge=inner_edge+gamma*gamma_scale;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(inner_edge-gamma_scaled,inner_edge+gamma_scaled,dist);if (u_is_halo) {lowp float halo_edge=(6.0-halo_width/fontScale)/SDF_PX;alpha=min(smoothstep(halo_edge-gamma_scaled,halo_edge+gamma_scaled,dist),1.0-alpha);}gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform bool u_is_along_line;uniform bool u_is_variable_anchor;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_translation;uniform float u_pitched_scale;varying vec2 v_data0;varying vec3 v_data1;vec4 projectTileWithElevation(vec2 posInTile,float elevation) {return u_matrix*vec4(posInTile,elevation,1.0);}\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;float ele=get_elevation(a_pos);highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 translated_a_pos=a_pos+u_translation;vec4 projectedPoint=projectTileWithElevation(translated_a_pos,ele);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=projectTileWithElevation(translated_a_pos+vec2(1,0),ele);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos;if (u_is_along_line || u_is_variable_anchor) {projected_pos=vec4(a_projected_pos.xy,ele,1.0);} else if (u_pitch_with_map) {projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy+u_translation,ele,1.0);} else {projected_pos=u_label_plane_matrix*projectTileWithElevation(a_projected_pos.xy+u_translation,ele);}float z=float(u_pitch_with_map)*projected_pos.z/projected_pos.w;float projectionScaling=1.0;vec4 finalPos=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset)*projectionScaling,z,1.0);if(u_pitch_with_map) {finalPos=projectTileWithElevation(finalPos.xy,finalPos.z);}float gamma_scale=finalPos.w;gl_Position=finalPos;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float visibility=calculate_visibility(projectedPoint);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(visibility,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}"),symbolTextAndIcon:me("#define SDF_PX 8.0\n#define SDF 1.0\n#define ICON 0.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;uniform bool u_is_along_line;uniform bool u_is_variable_anchor;uniform vec2 u_translation;uniform float u_pitched_scale;varying vec4 v_data0;varying vec4 v_data1;vec4 projectTileWithElevation(vec2 posInTile,float elevation) {return u_matrix*vec4(posInTile,elevation,1.0);}\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;float ele=get_elevation(a_pos);highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 translated_a_pos=a_pos+u_translation;vec4 projectedPoint=projectTileWithElevation(translated_a_pos,ele);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=projectTileWithElevation(translated_a_pos+vec2(1,0),ele);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos;if (u_is_along_line || u_is_variable_anchor) {projected_pos=vec4(a_projected_pos.xy,ele,1.0);} else if (u_pitch_with_map) {projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy+u_translation,ele,1.0);} else {projected_pos=u_label_plane_matrix*projectTileWithElevation(a_projected_pos.xy+u_translation,ele);}float z=float(u_pitch_with_map)*projected_pos.z/projected_pos.w;float projectionScaling=1.0;vec4 finalPos=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale)*projectionScaling,z,1.0);if(u_pitch_with_map) {finalPos=projectTileWithElevation(finalPos.xy,finalPos.z);}float gamma_scale=finalPos.w;gl_Position=finalPos;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float visibility=calculate_visibility(projectedPoint);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(visibility,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}"),terrain:me("uniform sampler2D u_texture;uniform vec4 u_fog_color;uniform vec4 u_horizon_color;uniform float u_fog_ground_blend;uniform float u_fog_ground_blend_opacity;uniform float u_horizon_fog_blend;varying vec2 v_texture_pos;varying float v_fog_depth;const float gamma=2.2;vec4 gammaToLinear(vec4 color) {return pow(color,vec4(gamma));}vec4 linearToGamma(vec4 color) {return pow(color,vec4(1.0/gamma));}void main() {vec4 surface_color=texture2D(u_texture,v_texture_pos);if (v_fog_depth > u_fog_ground_blend) {vec4 surface_color_linear=gammaToLinear(surface_color);float blend_color=smoothstep(0.0,1.0,max((v_fog_depth-u_horizon_fog_blend)/(1.0-u_horizon_fog_blend),0.0));vec4 fog_horizon_color_linear=mix(gammaToLinear(u_fog_color),gammaToLinear(u_horizon_color),blend_color);float factor_fog=max(v_fog_depth-u_fog_ground_blend,0.0)/(1.0-u_fog_ground_blend);gl_FragColor=linearToGamma(mix(surface_color_linear,fog_horizon_color_linear,pow(factor_fog,2.0)*u_fog_ground_blend_opacity));} else {gl_FragColor=surface_color;}}","attribute vec3 a_pos3d;uniform mat4 u_matrix;uniform mat4 u_fog_matrix;uniform float u_ele_delta;varying vec2 v_texture_pos;varying float v_fog_depth;void main() {float ele=get_elevation(a_pos3d.xy);float ele_delta=a_pos3d.z==1.0 ? u_ele_delta : 0.0;v_texture_pos=a_pos3d.xy/8192.0;gl_Position=u_matrix*vec4(a_pos3d.xy,ele-ele_delta,1.0);vec4 pos=u_fog_matrix*vec4(a_pos3d.xy,ele,1.0);v_fog_depth=pos.z/pos.w*0.5+0.5;}"),terrainDepth:me("varying float v_depth;const highp vec4 bitSh=vec4(256.*256.*256.,256.*256.,256.,1.);const highp vec4 bitMsk=vec4(0.,vec3(1./256.0));highp vec4 pack(highp float value) {highp vec4 comp=fract(value*bitSh);comp-=comp.xxyz*bitMsk;return comp;}void main() {gl_FragColor=pack(v_depth);}","attribute vec3 a_pos3d;uniform mat4 u_matrix;uniform float u_ele_delta;varying float v_depth;void main() {float ele=get_elevation(a_pos3d.xy);float ele_delta=a_pos3d.z==1.0 ? u_ele_delta : 0.0;gl_Position=u_matrix*vec4(a_pos3d.xy,ele-ele_delta,1.0);v_depth=gl_Position.z/gl_Position.w;}"),terrainCoords:me("precision mediump float;uniform sampler2D u_texture;uniform float u_terrain_coords_id;varying vec2 v_texture_pos;void main() {vec4 rgba=texture2D(u_texture,v_texture_pos);gl_FragColor=vec4(rgba.r,rgba.g,rgba.b,u_terrain_coords_id);}","attribute vec3 a_pos3d;uniform mat4 u_matrix;uniform float u_ele_delta;varying vec2 v_texture_pos;void main() {float ele=get_elevation(a_pos3d.xy);float ele_delta=a_pos3d.z==1.0 ? u_ele_delta : 0.0;v_texture_pos=a_pos3d.xy/8192.0;gl_Position=u_matrix*vec4(a_pos3d.xy,ele-ele_delta,1.0);}"),sky:me("uniform vec4 u_sky_color;uniform vec4 u_horizon_color;uniform float u_horizon;uniform float u_sky_horizon_blend;void main() {float y=gl_FragCoord.y;if (y > u_horizon) {float blend=y-u_horizon;if (blend < u_sky_horizon_blend) {gl_FragColor=mix(u_sky_color,u_horizon_color,pow(1.0-blend/u_sky_horizon_blend,2.0));} else {gl_FragColor=u_sky_color;}}}","attribute vec2 a_pos;void main() {gl_Position=vec4(a_pos,1.0,1.0);}")};function me(t,e){const i=/#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g,a=e.match(/attribute ([\w]+) ([\w]+)/g),s=t.match(/uniform ([\w]+) ([\w]+)([\s]*)([\w]*)/g),o=e.match(/uniform ([\w]+) ([\w]+)([\s]*)([\w]*)/g),r=o?o.concat(s):s,n={};return {fragmentSource:t=t.replace(i,((t,e,i,a,s)=>(n[s]=!0,"define"===e?`\n#ifndef HAS_UNIFORM_u_${s}\nvarying ${i} ${a} ${s};\n#else\nuniform ${i} ${a} u_${s};\n#endif\n`:`\n#ifdef HAS_UNIFORM_u_${s}\n ${i} ${a} ${s} = u_${s};\n#endif\n`))),vertexSource:e=e.replace(i,((t,e,i,a,s)=>{const o="float"===a?"vec2":"vec4",r=s.match(/color/)?"color":o;return n[s]?"define"===e?`\n#ifndef HAS_UNIFORM_u_${s}\nuniform lowp float u_${s}_t;\nattribute ${i} ${o} a_${s};\nvarying ${i} ${a} ${s};\n#else\nuniform ${i} ${a} u_${s};\n#endif\n`:"vec4"===r?`\n#ifndef HAS_UNIFORM_u_${s}\n ${s} = a_${s};\n#else\n ${i} ${a} ${s} = u_${s};\n#endif\n`:`\n#ifndef HAS_UNIFORM_u_${s}\n ${s} = unpack_mix_${r}(a_${s}, u_${s}_t);\n#else\n ${i} ${a} ${s} = u_${s};\n#endif\n`:"define"===e?`\n#ifndef HAS_UNIFORM_u_${s}\nuniform lowp float u_${s}_t;\nattribute ${i} ${o} a_${s};\n#else\nuniform ${i} ${a} u_${s};\n#endif\n`:"vec4"===r?`\n#ifndef HAS_UNIFORM_u_${s}\n ${i} ${a} ${s} = a_${s};\n#else\n ${i} ${a} ${s} = u_${s};\n#endif\n`:`\n#ifndef HAS_UNIFORM_u_${s}\n ${i} ${a} ${s} = unpack_mix_${r}(a_${s}, u_${s}_t);\n#else\n ${i} ${a} ${s} = u_${s};\n#endif\n`})),staticAttributes:a,staticUniforms:r}}class fe{constructor(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffer=null,this.vao=null;}bind(t,e,i,a,s,o,r,n,l){this.context=t;let h=this.boundPaintVertexBuffers.length!==a.length;for(let t=0;!h&&t<a.length;t++)this.boundPaintVertexBuffers[t]!==a[t]&&(h=!0);!this.vao||this.boundProgram!==e||this.boundLayoutVertexBuffer!==i||h||this.boundIndexBuffer!==s||this.boundVertexOffset!==o||this.boundDynamicVertexBuffer!==r||this.boundDynamicVertexBuffer2!==n||this.boundDynamicVertexBuffer3!==l?this.freshBind(e,i,a,s,o,r,n,l):(t.bindVertexArray.set(this.vao),r&&r.bind(),s&&s.dynamicDraw&&s.bind(),n&&n.bind(),l&&l.bind());}freshBind(t,e,i,a,s,o,r,n){const l=t.numAttributes,h=this.context,c=h.gl;this.vao&&this.destroy(),this.vao=h.createVertexArray(),h.bindVertexArray.set(this.vao),this.boundProgram=t,this.boundLayoutVertexBuffer=e,this.boundPaintVertexBuffers=i,this.boundIndexBuffer=a,this.boundVertexOffset=s,this.boundDynamicVertexBuffer=o,this.boundDynamicVertexBuffer2=r,this.boundDynamicVertexBuffer3=n,e.enableAttributes(c,t);for(const e of i)e.enableAttributes(c,t);o&&o.enableAttributes(c,t),r&&r.enableAttributes(c,t),n&&n.enableAttributes(c,t),e.bind(),e.setVertexAttribPointers(c,t,s);for(const e of i)e.bind(),e.setVertexAttribPointers(c,t,s);o&&(o.bind(),o.setVertexAttribPointers(c,t,s)),a&&a.bind(),r&&(r.bind(),r.setVertexAttribPointers(c,t,s)),n&&(n.bind(),n.setVertexAttribPointers(c,t,s)),h.currentNumAttributes=l;}destroy(){this.vao&&(this.context.deleteVertexArray(this.vao),this.vao=null);}}const ge=(t,i,a,s,o)=>({u_matrix:t,u_texture:0,u_ele_delta:i,u_fog_matrix:a,u_fog_color:s?s.properties.get("fog-color"):e.aM.white,u_fog_ground_blend:s?s.properties.get("fog-ground-blend"):1,u_fog_ground_blend_opacity:s?s.calculateFogBlendOpacity(o):0,u_horizon_color:s?s.properties.get("horizon-color"):e.aM.white,u_horizon_fog_blend:s?s.properties.get("horizon-fog-blend"):1});function ve(t){const e=[];for(let i=0;i<t.length;i++){if(null===t[i])continue;const a=t[i].split(" ");e.push(a.pop());}return e}class xe{constructor(t,i,a,s,o,r){const n=t.gl;this.program=n.createProgram();const l=ve(i.staticAttributes),h=a?a.getBinderAttributes():[],c=l.concat(h),u=pe.prelude.staticUniforms?ve(pe.prelude.staticUniforms):[],d=i.staticUniforms?ve(i.staticUniforms):[],_=a?a.getBinderUniforms():[],p=u.concat(d).concat(_),m=[];for(const t of p)m.indexOf(t)<0&&m.push(t);const f=a?a.defines():[];o&&f.push("#define OVERDRAW_INSPECTOR;"),r&&f.push("#define TERRAIN3D;");const g=f.concat(pe.prelude.fragmentSource,i.fragmentSource).join("\n"),v=f.concat(pe.prelude.vertexSource,i.vertexSource).join("\n"),x=n.createShader(n.FRAGMENT_SHADER);if(n.isContextLost())return void(this.failedToCreate=!0);if(n.shaderSource(x,g),n.compileShader(x),!n.getShaderParameter(x,n.COMPILE_STATUS))throw new Error(`Could not compile fragment shader: ${n.getShaderInfoLog(x)}`);n.attachShader(this.program,x);const y=n.createShader(n.VERTEX_SHADER);if(n.isContextLost())return void(this.failedToCreate=!0);if(n.shaderSource(y,v),n.compileShader(y),!n.getShaderParameter(y,n.COMPILE_STATUS))throw new Error(`Could not compile vertex shader: ${n.getShaderInfoLog(y)}`);n.attachShader(this.program,y),this.attributes={};const b={};this.numAttributes=c.length;for(let t=0;t<this.numAttributes;t++)c[t]&&(n.bindAttribLocation(this.program,t,c[t]),this.attributes[c[t]]=t);if(n.linkProgram(this.program),!n.getProgramParameter(this.program,n.LINK_STATUS))throw new Error(`Program failed to link: ${n.getProgramInfoLog(this.program)}`);n.deleteShader(y),n.deleteShader(x);for(let t=0;t<m.length;t++){const e=m[t];if(e&&!b[e]){const t=n.getUniformLocation(this.program,e);t&&(b[e]=t);}}this.fixedUniforms=s(t,b),this.terrainUniforms=((t,i)=>({u_depth:new e.aH(t,i.u_depth),u_terrain:new e.aH(t,i.u_terrain),u_terrain_dim:new e.aI(t,i.u_terrain_dim),u_terrain_matrix:new e.aJ(t,i.u_terrain_matrix),u_terrain_unpack:new e.aK(t,i.u_terrain_unpack),u_terrain_exaggeration:new e.aI(t,i.u_terrain_exaggeration)}))(t,b),this.binderUniforms=a?a.getUniforms(t,b):[];}draw(t,e,i,a,s,o,r,n,l,h,c,u,d,_,p,m,f,g){const v=t.gl;if(this.failedToCreate)return;if(t.program.set(this.program),t.setDepthMode(i),t.setStencilMode(a),t.setColorMode(s),t.setCullFace(o),n){t.activeTexture.set(v.TEXTURE2),v.bindTexture(v.TEXTURE_2D,n.depthTexture),t.activeTexture.set(v.TEXTURE3),v.bindTexture(v.TEXTURE_2D,n.texture);for(const t in this.terrainUniforms)this.terrainUniforms[t].set(n[t]);}for(const t in this.fixedUniforms)this.fixedUniforms[t].set(r[t]);p&&p.setUniforms(t,this.binderUniforms,d,{zoom:_});let x=0;switch(e){case v.LINES:x=2;break;case v.TRIANGLES:x=3;break;case v.LINE_STRIP:x=1;}for(const i of u.get()){const a=i.vaos||(i.vaos={});(a[l]||(a[l]=new fe)).bind(t,this,h,p?p.getPaintVertexBuffers():[],c,i.vertexOffset,m,f,g),v.drawElements(e,i.primitiveLength*x,v.UNSIGNED_SHORT,i.primitiveOffset*x*2);}}}function ye(t,e,i){const a=1/Bt(i,1,e.transform.tileZoom),s=Math.pow(2,i.tileID.overscaledZ),o=i.tileSize*Math.pow(2,e.transform.tileZoom)/s,r=o*(i.tileID.canonical.x+i.tileID.wrap*s),n=o*i.tileID.canonical.y;return {u_image:0,u_texsize:i.imageAtlasTexture.size,u_scale:[a,t.fromScale,t.toScale],u_fade:t.t,u_pixel_coord_upper:[r>>16,n>>16],u_pixel_coord_lower:[65535&r,65535&n]}}const be=(t,i,a,s)=>{const o=i.style.light,r=o.properties.get("position"),n=[r.x,r.y,r.z],l=function(){var t=new e.A(9);return e.A!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t}();"viewport"===o.properties.get("anchor")&&function(t,e){var i=Math.sin(e),a=Math.cos(e);t[0]=a,t[1]=i,t[2]=0,t[3]=-i,t[4]=a,t[5]=0,t[6]=0,t[7]=0,t[8]=1;}(l,-i.transform.angle),function(t,e,i){var a=e[0],s=e[1],o=e[2];t[0]=a*i[0]+s*i[3]+o*i[6],t[1]=a*i[1]+s*i[4]+o*i[7],t[2]=a*i[2]+s*i[5]+o*i[8];}(n,n,l);const h=o.properties.get("color");return {u_matrix:t,u_lightpos:n,u_lightintensity:o.properties.get("intensity"),u_lightcolor:[h.r,h.g,h.b],u_vertical_gradient:+a,u_opacity:s}},we=(t,i,a,s,o,r,n)=>e.e(be(t,i,a,s),ye(r,i,n),{u_height_factor:-Math.pow(2,o.overscaledZ)/n.tileSize/8}),Te=t=>({u_matrix:t}),Ie=(t,i,a,s)=>e.e(Te(t),ye(a,i,s)),Ee=(t,e)=>({u_matrix:t,u_world:e}),Pe=(t,i,a,s,o)=>e.e(Ie(t,i,a,s),{u_world:o}),Ce=(t,e,i,a)=>{const s=t.transform;let o,r;if("map"===a.paint.get("circle-pitch-alignment")){const t=Bt(i,1,s.zoom);o=!0,r=[t,t];}else o=!1,r=s.pixelsToGLUnits;return {u_camera_to_center_distance:s.cameraToCenterDistance,u_scale_with_map:+("map"===a.paint.get("circle-pitch-scale")),u_matrix:t.translatePosMatrix(e.posMatrix,i,a.paint.get("circle-translate"),a.paint.get("circle-translate-anchor")),u_pitch_with_map:+o,u_device_pixel_ratio:t.pixelRatio,u_extrude_scale:r}},Se=(t,e,i)=>({u_matrix:t,u_inv_matrix:e,u_camera_to_center_distance:i.cameraToCenterDistance,u_viewport_size:[i.width,i.height]}),ze=(t,e,i=1)=>({u_matrix:t,u_color:e,u_overlay:0,u_overlay_scale:i}),De=t=>({u_matrix:t}),Me=(t,e,i,a)=>({u_matrix:t,u_extrude_scale:Bt(e,1,i),u_intensity:a}),Ae=(t,i,a,s)=>{const o=e.H();e.aP(o,0,t.width,t.height,0,0,1);const r=t.context.gl;return {u_matrix:o,u_world:[r.drawingBufferWidth,r.drawingBufferHeight],u_image:a,u_color_ramp:s,u_opacity:i.paint.get("heatmap-opacity")}};function Re(t,i){const a=Math.pow(2,i.canonical.z),s=i.canonical.y;return [new e.Z(0,s/a).toLngLat().lat,new e.Z(0,(s+1)/a).toLngLat().lat]}const ke=(t,e,i,a)=>{const s=t.transform;return {u_matrix:Ne(t,e,i,a),u_ratio:1/Bt(e,1,s.zoom),u_device_pixel_ratio:t.pixelRatio,u_units_to_pixels:[1/s.pixelsToGLUnits[0],1/s.pixelsToGLUnits[1]]}},Le=(t,i,a,s,o)=>e.e(ke(t,i,a,o),{u_image:0,u_image_height:s}),Fe=(t,e,i,a,s)=>{const o=t.transform,r=Oe(e,o);return {u_matrix:Ne(t,e,i,s),u_texsize:e.imageAtlasTexture.size,u_ratio:1/Bt(e,1,o.zoom),u_device_pixel_ratio:t.pixelRatio,u_image:0,u_scale:[r,a.fromScale,a.toScale],u_fade:a.t,u_units_to_pixels:[1/o.pixelsToGLUnits[0],1/o.pixelsToGLUnits[1]]}},Be=(t,i,a,s,o,r)=>{const n=t.lineAtlas,l=Oe(i,t.transform),h="round"===a.layout.get("line-cap"),c=n.getDash(s.from,h),u=n.getDash(s.to,h),d=c.width*o.fromScale,_=u.width*o.toScale;return e.e(ke(t,i,a,r),{u_patternscale_a:[l/d,-c.height/2],u_patternscale_b:[l/_,-u.height/2],u_sdfgamma:n.width/(256*Math.min(d,_)*t.pixelRatio)/2,u_image:0,u_tex_y_a:c.y,u_tex_y_b:u.y,u_mix:o.t})};function Oe(t,e){return 1/Bt(t,1,e.tileZoom)}function Ne(t,e,i,a){return t.translatePosMatrix(a?a.posMatrix:e.tileID.posMatrix,e,i.paint.get("line-translate"),i.paint.get("line-translate-anchor"))}const Ue=(t,e,i,a,s)=>{return {u_matrix:t,u_tl_parent:e,u_scale_parent:i,u_buffer_scale:1,u_fade_t:a.mix,u_opacity:a.opacity*s.paint.get("raster-opacity"),u_image0:0,u_image1:1,u_brightness_low:s.paint.get("raster-brightness-min"),u_brightness_high:s.paint.get("raster-brightness-max"),u_saturation_factor:(r=s.paint.get("raster-saturation"),r>0?1-1/(1.001-r):-r),u_contrast_factor:(o=s.paint.get("raster-contrast"),o>0?1/(1-o):1+o),u_spin_weights:je(s.paint.get("raster-hue-rotate"))};var o,r;};function je(t){t*=Math.PI/180;const e=Math.sin(t),i=Math.cos(t);return [(2*i+1)/3,(-Math.sqrt(3)*e-i+1)/3,(Math.sqrt(3)*e-i+1)/3]}const Ze=(t,e,i,a,s,o,r,n,l,h,c,u,d,_)=>{const p=r.transform;return {u_is_size_zoom_constant:+("constant"===t||"source"===t),u_is_size_feature_constant:+("constant"===t||"camera"===t),u_size_t:e?e.uSizeT:0,u_size:e?e.uSize:0,u_camera_to_center_distance:p.cameraToCenterDistance,u_pitch:p.pitch/360*2*Math.PI,u_rotate_symbol:+i,u_aspect_ratio:p.width/p.height,u_fade_change:r.options.fadeDuration?r.symbolFadeChange:1,u_matrix:n,u_label_plane_matrix:l,u_coord_matrix:h,u_is_text:+u,u_pitch_with_map:+a,u_is_along_line:s,u_is_variable_anchor:o,u_texsize:d,u_texture:0,u_translation:c,u_pitched_scale:_}},qe=(t,i,a,s,o,r,n,l,h,c,u,d,_,p,m)=>{const f=n.transform;return e.e(Ze(t,i,a,s,o,r,n,l,h,c,u,d,_,m),{u_gamma_scale:s?Math.cos(f._pitch)*f.cameraToCenterDistance:1,u_device_pixel_ratio:n.pixelRatio,u_is_halo:+p})},Ve=(t,i,a,s,o,r,n,l,h,c,u,d,_,p)=>e.e(qe(t,i,a,s,o,r,n,l,h,c,u,!0,d,!0,p),{u_texsize_icon:_,u_texture_icon:1}),Ge=(t,e,i)=>({u_matrix:t,u_opacity:e,u_color:i}),He=(t,i,a,s,o,r)=>e.e(function(t,e,i,a){const s=i.imageManager.getPattern(t.from.toString()),o=i.imageManager.getPattern(t.to.toString()),{width:r,height:n}=i.imageManager.getPixelSize(),l=Math.pow(2,a.tileID.overscaledZ),h=a.tileSize*Math.pow(2,i.transform.tileZoom)/l,c=h*(a.tileID.canonical.x+a.tileID.wrap*l),u=h*a.tileID.canonical.y;return {u_image:0,u_pattern_tl_a:s.tl,u_pattern_br_a:s.br,u_pattern_tl_b:o.tl,u_pattern_br_b:o.br,u_texsize:[r,n],u_mix:e.t,u_pattern_size_a:s.displaySize,u_pattern_size_b:o.displaySize,u_scale_a:e.fromScale,u_scale_b:e.toScale,u_tile_units_to_pixels:1/Bt(a,1,i.transform.tileZoom),u_pixel_coord_upper:[c>>16,u>>16],u_pixel_coord_lower:[65535&c,65535&u]}}(s,r,a,o),{u_matrix:t,u_opacity:i}),We={fillExtrusion:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_lightpos:new e.aN(t,i.u_lightpos),u_lightintensity:new e.aI(t,i.u_lightintensity),u_lightcolor:new e.aN(t,i.u_lightcolor),u_vertical_gradient:new e.aI(t,i.u_vertical_gradient),u_opacity:new e.aI(t,i.u_opacity)}),fillExtrusionPattern:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_lightpos:new e.aN(t,i.u_lightpos),u_lightintensity:new e.aI(t,i.u_lightintensity),u_lightcolor:new e.aN(t,i.u_lightcolor),u_vertical_gradient:new e.aI(t,i.u_vertical_gradient),u_height_factor:new e.aI(t,i.u_height_factor),u_image:new e.aH(t,i.u_image),u_texsize:new e.aO(t,i.u_texsize),u_pixel_coord_upper:new e.aO(t,i.u_pixel_coord_upper),u_pixel_coord_lower:new e.aO(t,i.u_pixel_coord_lower),u_scale:new e.aN(t,i.u_scale),u_fade:new e.aI(t,i.u_fade),u_opacity:new e.aI(t,i.u_opacity)}),fill:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix)}),fillPattern:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_image:new e.aH(t,i.u_image),u_texsize:new e.aO(t,i.u_texsize),u_pixel_coord_upper:new e.aO(t,i.u_pixel_coord_upper),u_pixel_coord_lower:new e.aO(t,i.u_pixel_coord_lower),u_scale:new e.aN(t,i.u_scale),u_fade:new e.aI(t,i.u_fade)}),fillOutline:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_world:new e.aO(t,i.u_world)}),fillOutlinePattern:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_world:new e.aO(t,i.u_world),u_image:new e.aH(t,i.u_image),u_texsize:new e.aO(t,i.u_texsize),u_pixel_coord_upper:new e.aO(t,i.u_pixel_coord_upper),u_pixel_coord_lower:new e.aO(t,i.u_pixel_coord_lower),u_scale:new e.aN(t,i.u_scale),u_fade:new e.aI(t,i.u_fade)}),circle:(t,i)=>({u_camera_to_center_distance:new e.aI(t,i.u_camera_to_center_distance),u_scale_with_map:new e.aH(t,i.u_scale_with_map),u_pitch_with_map:new e.aH(t,i.u_pitch_with_map),u_extrude_scale:new e.aO(t,i.u_extrude_scale),u_device_pixel_ratio:new e.aI(t,i.u_device_pixel_ratio),u_matrix:new e.aJ(t,i.u_matrix)}),collisionBox:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_pixel_extrude_scale:new e.aO(t,i.u_pixel_extrude_scale)}),collisionCircle:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_inv_matrix:new e.aJ(t,i.u_inv_matrix),u_camera_to_center_distance:new e.aI(t,i.u_camera_to_center_distance),u_viewport_size:new e.aO(t,i.u_viewport_size)}),debug:(t,i)=>({u_color:new e.aL(t,i.u_color),u_matrix:new e.aJ(t,i.u_matrix),u_overlay:new e.aH(t,i.u_overlay),u_overlay_scale:new e.aI(t,i.u_overlay_scale)}),clippingMask:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix)}),heatmap:(t,i)=>({u_extrude_scale:new e.aI(t,i.u_extrude_scale),u_intensity:new e.aI(t,i.u_intensity),u_matrix:new e.aJ(t,i.u_matrix)}),heatmapTexture:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_world:new e.aO(t,i.u_world),u_image:new e.aH(t,i.u_image),u_color_ramp:new e.aH(t,i.u_color_ramp),u_opacity:new e.aI(t,i.u_opacity)}),hillshade:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_image:new e.aH(t,i.u_image),u_latrange:new e.aO(t,i.u_latrange),u_light:new e.aO(t,i.u_light),u_shadow:new e.aL(t,i.u_shadow),u_highlight:new e.aL(t,i.u_highlight),u_accent:new e.aL(t,i.u_accent)}),hillshadePrepare:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_image:new e.aH(t,i.u_image),u_dimension:new e.aO(t,i.u_dimension),u_zoom:new e.aI(t,i.u_zoom),u_unpack:new e.aK(t,i.u_unpack)}),line:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_ratio:new e.aI(t,i.u_ratio),u_device_pixel_ratio:new e.aI(t,i.u_device_pixel_ratio),u_units_to_pixels:new e.aO(t,i.u_units_to_pixels)}),lineGradient:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_ratio:new e.aI(t,i.u_ratio),u_device_pixel_ratio:new e.aI(t,i.u_device_pixel_ratio),u_units_to_pixels:new e.aO(t,i.u_units_to_pixels),u_image:new e.aH(t,i.u_image),u_image_height:new e.aI(t,i.u_image_height)}),linePattern:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_texsize:new e.aO(t,i.u_texsize),u_ratio:new e.aI(t,i.u_ratio),u_device_pixel_ratio:new e.aI(t,i.u_device_pixel_ratio),u_image:new e.aH(t,i.u_image),u_units_to_pixels:new e.aO(t,i.u_units_to_pixels),u_scale:new e.aN(t,i.u_scale),u_fade:new e.aI(t,i.u_fade)}),lineSDF:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_ratio:new e.aI(t,i.u_ratio),u_device_pixel_ratio:new e.aI(t,i.u_device_pixel_ratio),u_units_to_pixels:new e.aO(t,i.u_units_to_pixels),u_patternscale_a:new e.aO(t,i.u_patternscale_a),u_patternscale_b:new e.aO(t,i.u_patternscale_b),u_sdfgamma:new e.aI(t,i.u_sdfgamma),u_image:new e.aH(t,i.u_image),u_tex_y_a:new e.aI(t,i.u_tex_y_a),u_tex_y_b:new e.aI(t,i.u_tex_y_b),u_mix:new e.aI(t,i.u_mix)}),raster:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_tl_parent:new e.aO(t,i.u_tl_parent),u_scale_parent:new e.aI(t,i.u_scale_parent),u_buffer_scale:new e.aI(t,i.u_buffer_scale),u_fade_t:new e.aI(t,i.u_fade_t),u_opacity:new e.aI(t,i.u_opacity),u_image0:new e.aH(t,i.u_image0),u_image1:new e.aH(t,i.u_image1),u_brightness_low:new e.aI(t,i.u_brightness_low),u_brightness_high:new e.aI(t,i.u_brightness_high),u_saturation_factor:new e.aI(t,i.u_saturation_factor),u_contrast_factor:new e.aI(t,i.u_contrast_factor),u_spin_weights:new e.aN(t,i.u_spin_weights)}),symbolIcon:(t,i)=>({u_is_size_zoom_constant:new e.aH(t,i.u_is_size_zoom_constant),u_is_size_feature_constant:new e.aH(t,i.u_is_size_feature_constant),u_size_t:new e.aI(t,i.u_size_t),u_size:new e.aI(t,i.u_size),u_camera_to_center_distance:new e.aI(t,i.u_camera_to_center_distance),u_pitch:new e.aI(t,i.u_pitch),u_rotate_symbol:new e.aH(t,i.u_rotate_symbol),u_aspect_ratio:new e.aI(t,i.u_aspect_ratio),u_fade_change:new e.aI(t,i.u_fade_change),u_matrix:new e.aJ(t,i.u_matrix),u_label_plane_matrix:new e.aJ(t,i.u_label_plane_matrix),u_coord_matrix:new e.aJ(t,i.u_coord_matrix),u_is_text:new e.aH(t,i.u_is_text),u_pitch_with_map:new e.aH(t,i.u_pitch_with_map),u_is_along_line:new e.aH(t,i.u_is_along_line),u_is_variable_anchor:new e.aH(t,i.u_is_variable_anchor),u_texsize:new e.aO(t,i.u_texsize),u_texture:new e.aH(t,i.u_texture),u_translation:new e.aO(t,i.u_translation),u_pitched_scale:new e.aI(t,i.u_pitched_scale)}),symbolSDF:(t,i)=>({u_is_size_zoom_constant:new e.aH(t,i.u_is_size_zoom_constant),u_is_size_feature_constant:new e.aH(t,i.u_is_size_feature_constant),u_size_t:new e.aI(t,i.u_size_t),u_size:new e.aI(t,i.u_size),u_camera_to_center_distance:new e.aI(t,i.u_camera_to_center_distance),u_pitch:new e.aI(t,i.u_pitch),u_rotate_symbol:new e.aH(t,i.u_rotate_symbol),u_aspect_ratio:new e.aI(t,i.u_aspect_ratio),u_fade_change:new e.aI(t,i.u_fade_change),u_matrix:new e.aJ(t,i.u_matrix),u_label_plane_matrix:new e.aJ(t,i.u_label_plane_matrix),u_coord_matrix:new e.aJ(t,i.u_coord_matrix),u_is_text:new e.aH(t,i.u_is_text),u_pitch_with_map:new e.aH(t,i.u_pitch_with_map),u_is_along_line:new e.aH(t,i.u_is_along_line),u_is_variable_anchor:new e.aH(t,i.u_is_variable_anchor),u_texsize:new e.aO(t,i.u_texsize),u_texture:new e.aH(t,i.u_texture),u_gamma_scale:new e.aI(t,i.u_gamma_scale),u_device_pixel_ratio:new e.aI(t,i.u_device_pixel_ratio),u_is_halo:new e.aH(t,i.u_is_halo),u_translation:new e.aO(t,i.u_translation),u_pitched_scale:new e.aI(t,i.u_pitched_scale)}),symbolTextAndIcon:(t,i)=>({u_is_size_zoom_constant:new e.aH(t,i.u_is_size_zoom_constant),u_is_size_feature_constant:new e.aH(t,i.u_is_size_feature_constant),u_size_t:new e.aI(t,i.u_size_t),u_size:new e.aI(t,i.u_size),u_camera_to_center_distance:new e.aI(t,i.u_camera_to_center_distance),u_pitch:new e.aI(t,i.u_pitch),u_rotate_symbol:new e.aH(t,i.u_rotate_symbol),u_aspect_ratio:new e.aI(t,i.u_aspect_ratio),u_fade_change:new e.aI(t,i.u_fade_change),u_matrix:new e.aJ(t,i.u_matrix),u_label_plane_matrix:new e.aJ(t,i.u_label_plane_matrix),u_coord_matrix:new e.aJ(t,i.u_coord_matrix),u_is_text:new e.aH(t,i.u_is_text),u_pitch_with_map:new e.aH(t,i.u_pitch_with_map),u_is_along_line:new e.aH(t,i.u_is_along_line),u_is_variable_anchor:new e.aH(t,i.u_is_variable_anchor),u_texsize:new e.aO(t,i.u_texsize),u_texsize_icon:new e.aO(t,i.u_texsize_icon),u_texture:new e.aH(t,i.u_texture),u_texture_icon:new e.aH(t,i.u_texture_icon),u_gamma_scale:new e.aI(t,i.u_gamma_scale),u_device_pixel_ratio:new e.aI(t,i.u_device_pixel_ratio),u_is_halo:new e.aH(t,i.u_is_halo),u_translation:new e.aO(t,i.u_translation),u_pitched_scale:new e.aI(t,i.u_pitched_scale)}),background:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_opacity:new e.aI(t,i.u_opacity),u_color:new e.aL(t,i.u_color)}),backgroundPattern:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_opacity:new e.aI(t,i.u_opacity),u_image:new e.aH(t,i.u_image),u_pattern_tl_a:new e.aO(t,i.u_pattern_tl_a),u_pattern_br_a:new e.aO(t,i.u_pattern_br_a),u_pattern_tl_b:new e.aO(t,i.u_pattern_tl_b),u_pattern_br_b:new e.aO(t,i.u_pattern_br_b),u_texsize:new e.aO(t,i.u_texsize),u_mix:new e.aI(t,i.u_mix),u_pattern_size_a:new e.aO(t,i.u_pattern_size_a),u_pattern_size_b:new e.aO(t,i.u_pattern_size_b),u_scale_a:new e.aI(t,i.u_scale_a),u_scale_b:new e.aI(t,i.u_scale_b),u_pixel_coord_upper:new e.aO(t,i.u_pixel_coord_upper),u_pixel_coord_lower:new e.aO(t,i.u_pixel_coord_lower),u_tile_units_to_pixels:new e.aI(t,i.u_tile_units_to_pixels)}),terrain:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_texture:new e.aH(t,i.u_texture),u_ele_delta:new e.aI(t,i.u_ele_delta),u_fog_matrix:new e.aJ(t,i.u_fog_matrix),u_fog_color:new e.aL(t,i.u_fog_color),u_fog_ground_blend:new e.aI(t,i.u_fog_ground_blend),u_fog_ground_blend_opacity:new e.aI(t,i.u_fog_ground_blend_opacity),u_horizon_color:new e.aL(t,i.u_horizon_color),u_horizon_fog_blend:new e.aI(t,i.u_horizon_fog_blend)}),terrainDepth:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_ele_delta:new e.aI(t,i.u_ele_delta)}),terrainCoords:(t,i)=>({u_matrix:new e.aJ(t,i.u_matrix),u_texture:new e.aH(t,i.u_texture),u_terrain_coords_id:new e.aI(t,i.u_terrain_coords_id),u_ele_delta:new e.aI(t,i.u_ele_delta)}),sky:(t,i)=>({u_sky_color:new e.aL(t,i.u_sky_color),u_horizon_color:new e.aL(t,i.u_horizon_color),u_horizon:new e.aI(t,i.u_horizon),u_sky_horizon_blend:new e.aI(t,i.u_sky_horizon_blend)})};class $e{constructor(t,e,i){this.context=t;const a=t.gl;this.buffer=a.createBuffer(),this.dynamicDraw=Boolean(i),this.context.unbindVAO(),t.bindElementBuffer.set(this.buffer),a.bufferData(a.ELEMENT_ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?a.DYNAMIC_DRAW:a.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer;}bind(){this.context.bindElementBuffer.set(this.buffer);}updateData(t){const e=this.context.gl;if(!this.dynamicDraw)throw new Error("Attempted to update data while not in dynamic mode.");this.context.unbindVAO(),this.bind(),e.bufferSubData(e.ELEMENT_ARRAY_BUFFER,0,t.arrayBuffer);}destroy(){this.buffer&&(this.context.gl.deleteBuffer(this.buffer),delete this.buffer);}}const Xe={Int8:"BYTE",Uint8:"UNSIGNED_BYTE",Int16:"SHORT",Uint16:"UNSIGNED_SHORT",Int32:"INT",Uint32:"UNSIGNED_INT",Float32:"FLOAT"};class Ke{constructor(t,e,i,a){this.length=e.length,this.attributes=i,this.itemSize=e.bytesPerElement,this.dynamicDraw=a,this.context=t;const s=t.gl;this.buffer=s.createBuffer(),t.bindVertexBuffer.set(this.buffer),s.bufferData(s.ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?s.DYNAMIC_DRAW:s.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer;}bind(){this.context.bindVertexBuffer.set(this.buffer);}updateData(t){if(t.length!==this.length)throw new Error(`Length of new data is ${t.length}, which doesn't match current length of ${this.length}`);const e=this.context.gl;this.bind(),e.bufferSubData(e.ARRAY_BUFFER,0,t.arrayBuffer);}enableAttributes(t,e){for(let i=0;i<this.attributes.length;i++){const a=e.attributes[this.attributes[i].name];void 0!==a&&t.enableVertexAttribArray(a);}}setVertexAttribPointers(t,e,i){for(let a=0;a<this.attributes.length;a++){const s=this.attributes[a],o=e.attributes[s.name];void 0!==o&&t.vertexAttribPointer(o,s.components,t[Xe[s.type]],!1,this.itemSize,s.offset+this.itemSize*(i||0));}}destroy(){this.buffer&&(this.context.gl.deleteBuffer(this.buffer),delete this.buffer);}}const Je=new WeakMap;function Ye(t){var e;if(Je.has(t))return Je.get(t);{const i=null===(e=t.getParameter(t.VERSION))||void 0===e?void 0:e.startsWith("WebGL 2.0");return Je.set(t,i),i}}class Qe{constructor(t){this.gl=t.gl,this.default=this.getDefault(),this.current=this.default,this.dirty=!1;}get(){return this.current}set(t){}getDefault(){return this.default}setDefault(){this.set(this.default);}}class ti extends Qe{getDefault(){return e.aM.transparent}set(t){const e=this.current;(t.r!==e.r||t.g!==e.g||t.b!==e.b||t.a!==e.a||this.dirty)&&(this.gl.clearColor(t.r,t.g,t.b,t.a),this.current=t,this.dirty=!1);}}class ei extends Qe{getDefault(){return 1}set(t){(t!==this.current||this.dirty)&&(this.gl.clearDepth(t),this.current=t,this.dirty=!1);}}class ii extends Qe{getDefault(){return 0}set(t){(t!==this.current||this.dirty)&&(this.gl.clearStencil(t),this.current=t,this.dirty=!1);}}class ai extends Qe{getDefault(){return [!0,!0,!0,!0]}set(t){const e=this.current;(t[0]!==e[0]||t[1]!==e[1]||t[2]!==e[2]||t[3]!==e[3]||this.dirty)&&(this.gl.colorMask(t[0],t[1],t[2],t[3]),this.current=t,this.dirty=!1);}}class si extends Qe{getDefault(){return !0}set(t){(t!==this.current||this.dirty)&&(this.gl.depthMask(t),this.current=t,this.dirty=!1);}}class oi extends Qe{getDefault(){return 255}set(t){(t!==this.current||this.dirty)&&(this.gl.stencilMask(t),this.current=t,this.dirty=!1);}}class ri extends Qe{getDefault(){return {func:this.gl.ALWAYS,ref:0,mask:255}}set(t){const e=this.current;(t.func!==e.func||t.ref!==e.ref||t.mask!==e.mask||this.dirty)&&(this.gl.stencilFunc(t.func,t.ref,t.mask),this.current=t,this.dirty=!1);}}class ni extends Qe{getDefault(){const t=this.gl;return [t.KEEP,t.KEEP,t.KEEP]}set(t){const e=this.current;(t[0]!==e[0]||t[1]!==e[1]||t[2]!==e[2]||this.dirty)&&(this.gl.stencilOp(t[0],t[1],t[2]),this.current=t,this.dirty=!1);}}class li extends Qe{getDefault(){return !1}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;t?e.enable(e.STENCIL_TEST):e.disable(e.STENCIL_TEST),this.current=t,this.dirty=!1;}}class hi extends Qe{getDefault(){return [0,1]}set(t){const e=this.current;(t[0]!==e[0]||t[1]!==e[1]||this.dirty)&&(this.gl.depthRange(t[0],t[1]),this.current=t,this.dirty=!1);}}class ci extends Qe{getDefault(){return !1}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;t?e.enable(e.DEPTH_TEST):e.disable(e.DEPTH_TEST),this.current=t,this.dirty=!1;}}class ui extends Qe{getDefault(){return this.gl.LESS}set(t){(t!==this.current||this.dirty)&&(this.gl.depthFunc(t),this.current=t,this.dirty=!1);}}class di extends Qe{getDefault(){return !1}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;t?e.enable(e.BLEND):e.disable(e.BLEND),this.current=t,this.dirty=!1;}}class _i extends Qe{getDefault(){const t=this.gl;return [t.ONE,t.ZERO]}set(t){const e=this.current;(t[0]!==e[0]||t[1]!==e[1]||this.dirty)&&(this.gl.blendFunc(t[0],t[1]),this.current=t,this.dirty=!1);}}class pi extends Qe{getDefault(){return e.aM.transparent}set(t){const e=this.current;(t.r!==e.r||t.g!==e.g||t.b!==e.b||t.a!==e.a||this.dirty)&&(this.gl.blendColor(t.r,t.g,t.b,t.a),this.current=t,this.dirty=!1);}}class mi extends Qe{getDefault(){return this.gl.FUNC_ADD}set(t){(t!==this.current||this.dirty)&&(this.gl.blendEquation(t),this.current=t,this.dirty=!1);}}class fi extends Qe{getDefault(){return !1}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;t?e.enable(e.CULL_FACE):e.disable(e.CULL_FACE),this.current=t,this.dirty=!1;}}class gi extends Qe{getDefault(){return this.gl.BACK}set(t){(t!==this.current||this.dirty)&&(this.gl.cullFace(t),this.current=t,this.dirty=!1);}}class vi extends Qe{getDefault(){return this.gl.CCW}set(t){(t!==this.current||this.dirty)&&(this.gl.frontFace(t),this.current=t,this.dirty=!1);}}class xi extends Qe{getDefault(){return null}set(t){(t!==this.current||this.dirty)&&(this.gl.useProgram(t),this.current=t,this.dirty=!1);}}class yi extends Qe{getDefault(){return this.gl.TEXTURE0}set(t){(t!==this.current||this.dirty)&&(this.gl.activeTexture(t),this.current=t,this.dirty=!1);}}class bi extends Qe{getDefault(){const t=this.gl;return [0,0,t.drawingBufferWidth,t.drawingBufferHeight]}set(t){const e=this.current;(t[0]!==e[0]||t[1]!==e[1]||t[2]!==e[2]||t[3]!==e[3]||this.dirty)&&(this.gl.viewport(t[0],t[1],t[2],t[3]),this.current=t,this.dirty=!1);}}class wi extends Qe{getDefault(){return null}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;e.bindFramebuffer(e.FRAMEBUFFER,t),this.current=t,this.dirty=!1;}}class Ti extends Qe{getDefault(){return null}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;e.bindRenderbuffer(e.RENDERBUFFER,t),this.current=t,this.dirty=!1;}}class Ii extends Qe{getDefault(){return null}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;e.bindTexture(e.TEXTURE_2D,t),this.current=t,this.dirty=!1;}}class Ei extends Qe{getDefault(){return null}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;e.bindBuffer(e.ARRAY_BUFFER,t),this.current=t,this.dirty=!1;}}class Pi extends Qe{getDefault(){return null}set(t){const e=this.gl;e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t),this.current=t,this.dirty=!1;}}class Ci extends Qe{getDefault(){return null}set(t){var e;if(t===this.current&&!this.dirty)return;const i=this.gl;Ye(i)?i.bindVertexArray(t):null===(e=i.getExtension("OES_vertex_array_object"))||void 0===e||e.bindVertexArrayOES(t),this.current=t,this.dirty=!1;}}class Si extends Qe{getDefault(){return 4}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;e.pixelStorei(e.UNPACK_ALIGNMENT,t),this.current=t,this.dirty=!1;}}class zi extends Qe{getDefault(){return !1}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t),this.current=t,this.dirty=!1;}}class Di extends Qe{getDefault(){return !1}set(t){if(t===this.current&&!this.dirty)return;const e=this.gl;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,t),this.current=t,this.dirty=!1;}}class Mi extends Qe{constructor(t,e){super(t),this.context=t,this.parent=e;}getDefault(){return null}}class Ai extends Mi{setDirty(){this.dirty=!0;}set(t){if(t===this.current&&!this.dirty)return;this.context.bindFramebuffer.set(this.parent);const e=this.gl;e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0),this.current=t,this.dirty=!1;}}class Ri extends Mi{set(t){if(t===this.current&&!this.dirty)return;this.context.bindFramebuffer.set(this.parent);const e=this.gl;e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,t),this.current=t,this.dirty=!1;}}class ki extends Mi{set(t){if(t===this.current&&!this.dirty)return;this.context.bindFramebuffer.set(this.parent);const e=this.gl;e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,t),this.current=t,this.dirty=!1;}}class Li{constructor(t,e,i,a,s){this.context=t,this.width=e,this.height=i;const o=t.gl,r=this.framebuffer=o.createFramebuffer();if(this.colorAttachment=new Ai(t,r),a)this.depthAttachment=s?new ki(t,r):new Ri(t,r);else if(s)throw new Error("Stencil cannot be set without depth");if(o.checkFramebufferStatus(o.FRAMEBUFFER)!==o.FRAMEBUFFER_COMPLETE)throw new Error("Framebuffer is not complete")}destroy(){const t=this.context.gl,e=this.colorAttachment.get();if(e&&t.deleteTexture(e),this.depthAttachment){const e=this.depthAttachment.get();e&&t.deleteRenderbuffer(e);}t.deleteFramebuffer(this.framebuffer);}}class Fi{constructor(t,e,i){this.blendFunction=t,this.blendColor=e,this.mask=i;}}Fi.Replace=[1,0],Fi.disabled=new Fi(Fi.Replace,e.aM.transparent,[!1,!1,!1,!1]),Fi.unblended=new Fi(Fi.Replace,e.aM.transparent,[!0,!0,!0,!0]),Fi.alphaBlended=new Fi([1,771],e.aM.transparent,[!0,!0,!0,!0]);class Bi{constructor(t){var e,i;if(this.gl=t,this.clearColor=new ti(this),this.clearDepth=new ei(this),this.clearStencil=new ii(this),this.colorMask=new ai(this),this.depthMask=new si(this),this.stencilMask=new oi(this),this.stencilFunc=new ri(this),this.stencilOp=new ni(this),this.stencilTest=new li(this),this.depthRange=new hi(this),this.depthTest=new ci(this),this.depthFunc=new ui(this),this.blend=new di(this),this.blendFunc=new _i(this),this.blendColor=new pi(this),this.blendEquation=new mi(this),this.cullFace=new fi(this),this.cullFaceSide=new gi(this),this.frontFace=new vi(this),this.program=new xi(this),this.activeTexture=new yi(this),this.viewport=new bi(this),this.bindFramebuffer=new wi(this),this.bindRenderbuffer=new Ti(this),this.bindTexture=new Ii(this),this.bindVertexBuffer=new Ei(this),this.bindElementBuffer=new Pi(this),this.bindVertexArray=new Ci(this),this.pixelStoreUnpack=new Si(this),this.pixelStoreUnpackPremultiplyAlpha=new zi(this),this.pixelStoreUnpackFlipY=new Di(this),this.extTextureFilterAnisotropic=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic"),this.extTextureFilterAnisotropic&&(this.extTextureFilterAnisotropicMax=t.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT)),this.maxTextureSize=t.getParameter(t.MAX_TEXTURE_SIZE),Ye(t)){this.HALF_FLOAT=t.HALF_FLOAT;const a=t.getExtension("EXT_color_buffer_half_float");this.RGBA16F=null!==(e=t.RGBA16F)&&void 0!==e?e:null==a?void 0:a.RGBA16F_EXT,this.RGB16F=null!==(i=t.RGB16F)&&void 0!==i?i:null==a?void 0:a.RGB16F_EXT,t.getExtension("EXT_color_buffer_float");}else {t.getExtension("EXT_color_buffer_half_float"),t.getExtension("OES_texture_half_float_linear");const e=t.getExtension("OES_texture_half_float");this.HALF_FLOAT=null==e?void 0:e.HALF_FLOAT_OES;}}setDefault(){this.unbindVAO(),this.clearColor.setDefault(),this.clearDepth.setDefault(),this.clearStencil.setDefault(),this.colorMask.setDefault(),this.depthMask.setDefault(),this.stencilMask.setDefault(),this.stencilFunc.setDefault(),this.stencilOp.setDefault(),this.stencilTest.setDefault(),this.depthRange.setDefault(),this.depthTest.setDefault(),this.depthFunc.setDefault(),this.blend.setDefault(),this.blendFunc.setDefault(),this.blendColor.setDefault(),this.blendEquation.setDefault(),this.cullFace.setDefault(),this.cullFaceSide.setDefault(),this.frontFace.setDefault(),this.program.setDefault(),this.activeTexture.setDefault(),this.bindFramebuffer.setDefault(),this.pixelStoreUnpack.setDefault(),this.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.pixelStoreUnpackFlipY.setDefault();}setDirty(){this.clearColor.dirty=!0,this.clearDepth.dirty=!0,this.clearStencil.dirty=!0,this.colorMask.dirty=!0,this.depthMask.dirty=!0,this.stencilMask.dirty=!0,this.stencilFunc.dirty=!0,this.stencilOp.dirty=!0,this.stencilTest.dirty=!0,this.depthRange.dirty=!0,this.depthTest.dirty=!0,this.depthFunc.dirty=!0,this.blend.dirty=!0,this.blendFunc.dirty=!0,this.blendColor.dirty=!0,this.blendEquation.dirty=!0,this.cullFace.dirty=!0,this.cullFaceSide.dirty=!0,this.frontFace.dirty=!0,this.program.dirty=!0,this.activeTexture.dirty=!0,this.viewport.dirty=!0,this.bindFramebuffer.dirty=!0,this.bindRenderbuffer.dirty=!0,this.bindTexture.dirty=!0,this.bindVertexBuffer.dirty=!0,this.bindElementBuffer.dirty=!0,this.bindVertexArray.dirty=!0,this.pixelStoreUnpack.dirty=!0,this.pixelStoreUnpackPremultiplyAlpha.dirty=!0,this.pixelStoreUnpackFlipY.dirty=!0;}createIndexBuffer(t,e){return new $e(this,t,e)}createVertexBuffer(t,e,i){return new Ke(this,t,e,i)}createRenderbuffer(t,e,i){const a=this.gl,s=a.createRenderbuffer();return this.bindRenderbuffer.set(s),a.renderbufferStorage(a.RENDERBUFFER,t,e,i),this.bindRenderbuffer.set(null),s}createFramebuffer(t,e,i,a){return new Li(this,t,e,i,a)}clear({color:t,depth:e,stencil:i}){const a=this.gl;let s=0;t&&(s|=a.COLOR_BUFFER_BIT,this.clearColor.set(t),this.colorMask.set([!0,!0,!0,!0])),void 0!==e&&(s|=a.DEPTH_BUFFER_BIT,this.depthRange.set([0,1]),this.clearDepth.set(e),this.depthMask.set(!0)),void 0!==i&&(s|=a.STENCIL_BUFFER_BIT,this.clearStencil.set(i),this.stencilMask.set(255)),a.clear(s);}setCullFace(t){!1===t.enable?this.cullFace.set(!1):(this.cullFace.set(!0),this.cullFaceSide.set(t.mode),this.frontFace.set(t.frontFace));}setDepthMode(t){t.func!==this.gl.ALWAYS||t.mask?(this.depthTest.set(!0),this.depthFunc.set(t.func),this.depthMask.set(t.mask),this.depthRange.set(t.range)):this.depthTest.set(!1);}setStencilMode(t){t.test.func!==this.gl.ALWAYS||t.mask?(this.stencilTest.set(!0),this.stencilMask.set(t.mask),this.stencilOp.set([t.fail,t.depthFail,t.pass]),this.stencilFunc.set({func:t.test.func,ref:t.ref,mask:t.test.mask})):this.stencilTest.set(!1);}setColorMode(t){e.aE(t.blendFunction,Fi.Replace)?this.blend.set(!1):(this.blend.set(!0),this.blendFunc.set(t.blendFunction),this.blendColor.set(t.blendColor)),this.colorMask.set(t.mask);}createVertexArray(){var t;return Ye(this.gl)?this.gl.createVertexArray():null===(t=this.gl.getExtension("OES_vertex_array_object"))||void 0===t?void 0:t.createVertexArrayOES()}deleteVertexArray(t){var e;return Ye(this.gl)?this.gl.deleteVertexArray(t):null===(e=this.gl.getExtension("OES_vertex_array_object"))||void 0===e?void 0:e.deleteVertexArrayOES(t)}unbindVAO(){this.bindVertexArray.set(null);}}class Oi{constructor(t,e,i){this.func=t,this.mask=e,this.range=i;}}Oi.ReadOnly=!1,Oi.ReadWrite=!0,Oi.disabled=new Oi(519,Oi.ReadOnly,[0,1]);const Ni=7680;class Ui{constructor(t,e,i,a,s,o){this.test=t,this.ref=e,this.mask=i,this.fail=a,this.depthFail=s,this.pass=o;}}Ui.disabled=new Ui({func:519,mask:0},0,0,Ni,Ni,Ni);class ji{constructor(t,e,i){this.enable=t,this.mode=e,this.frontFace=i;}}let Zi;function qi(t,i,a,s,o){const r=t.context,n=r.gl,l=t.useProgram("collisionBox"),h=[];let c=0,u=0;for(let _=0;_<s.length;_++){const p=s[_],m=i.getTile(p).getBucket(a);if(!m)continue;const f=o?m.textCollisionBox:m.iconCollisionBox,g=m.collisionCircleArray;if(g.length>0){const i=e.H();e.aQ(i,m.placementInvProjMatrix,t.transform.glCoordMatrix),e.aQ(i,i,m.placementViewportMatrix),h.push({circleArray:g,circleOffset:u,transform:p.posMatrix,invTransform:i,coord:p}),c+=g.length/4,u=c;}f&&l.draw(r,n.LINES,Oi.disabled,Ui.disabled,t.colorModeForRenderPass(),ji.disabled,{u_matrix:p.posMatrix,u_pixel_extrude_scale:[1/(d=t.transform).width,1/d.height]},t.style.map.terrain&&t.style.map.terrain.getTerrainData(p),a.id,f.layoutVertexBuffer,f.indexBuffer,f.segments,null,t.transform.zoom,null,null,f.collisionVertexBuffer);}var d;if(!o||!h.length)return;const _=t.useProgram("collisionCircle"),p=new e.aR;p.resize(4*c),p._trim();let m=0;for(const t of h)for(let e=0;e<t.circleArray.length/4;e++){const i=4*e,a=t.circleArray[i+0],s=t.circleArray[i+1],o=t.circleArray[i+2],r=t.circleArray[i+3];p.emplace(m++,a,s,o,r,0),p.emplace(m++,a,s,o,r,1),p.emplace(m++,a,s,o,r,2),p.emplace(m++,a,s,o,r,3);}(!Zi||Zi.length<2*c)&&(Zi=function(t){const i=2*t,a=new e.aT;a.resize(i),a._trim();for(let t=0;t<i;t++){const e=6*t;a.uint16[e+0]=4*t+0,a.uint16[e+1]=4*t+1,a.uint16[e+2]=4*t+2,a.uint16[e+3]=4*t+2,a.uint16[e+4]=4*t+3,a.uint16[e+5]=4*t+0;}return a}(c));const f=r.createIndexBuffer(Zi,!0),g=r.createVertexBuffer(p,e.aS.members,!0);for(const i of h){const s=Se(i.transform,i.invTransform,t.transform);_.draw(r,n.TRIANGLES,Oi.disabled,Ui.disabled,t.colorModeForRenderPass(),ji.disabled,s,t.style.map.terrain&&t.style.map.terrain.getTerrainData(i.coord),a.id,g,f,e.a0.simpleSegment(0,2*i.circleOffset,i.circleArray.length,i.circleArray.length/2),null,t.transform.zoom,null,null,null);}g.destroy(),f.destroy();}ji.disabled=new ji(!1,1029,2305),ji.backCCW=new ji(!0,1029,2305);const Vi=e.an(new Float32Array(16));function Gi(t,i,a,s,o,r){const{horizontalAlign:n,verticalAlign:l}=e.au(t);return new e.P((-(n-.5)*i/o+s[0])*r,(-(l-.5)*a/o+s[1])*r)}function Hi(t,i,a,s,o,r){const n=i.tileAnchorPoint.add(new e.P(i.translation[0],i.translation[1]));if(i.pitchWithMap){let t=s.mult(r);a||(t=t.rotate(-o));const e=n.add(t);return xt(e.x,e.y,i.labelPlaneMatrix,i.getElevation).point}if(a){const e=St(i.tileAnchorPoint.x+1,i.tileAnchorPoint.y,i).point.sub(t),a=Math.atan(e.y/e.x)+(e.x<0?Math.PI:0);return t.add(s.rotate(a))}return t.add(s)}function Wi(t,i,a,s,o,r,n,l,h,c,u,d,_,p){const m=t.text.placedSymbolArray,f=t.text.dynamicLayoutVertexArray,g=t.icon.dynamicLayoutVertexArray,v={};f.clear();for(let g=0;g<m.length;g++){const x=m.get(g),y=x.hidden||!x.crossTileID||t.allowVerticalPlacement&&!x.placedOrientation?null:s[x.crossTileID];if(y){const s=new e.P(x.anchorX,x.anchorY),m={getElevation:p,width:o.width,height:o.height,labelPlaneMatrix:r,lineVertexArray:null,pitchWithMap:a,projection:u,projectionCache:null,tileAnchorPoint:s,translation:d,unwrappedTileID:_},g=a?xt(s.x,s.y,n,p):St(s.x,s.y,m),b=yt(o.cameraToCenterDistance,g.signedDistanceFromCamera);let w=e.ai(t.textSizeData,h,x)*b/e.ap;a&&(w*=t.tilePixelRatio/l);const{width:T,height:I,anchor:E,textOffset:P,textBoxScale:C}=y,S=Gi(E,T,I,P,C,w),z=u.getPitchedTextCorrection(o,s.add(new e.P(d[0],d[1])),_),D=Hi(g.point,m,i,S,o.angle,z),M=t.allowVerticalPlacement&&x.placedOrientation===e.ah.vertical?Math.PI/2:0;for(let t=0;t<x.numGlyphs;t++)e.aj(f,D,M);c&&x.associatedIconIndex>=0&&(v[x.associatedIconIndex]={shiftedAnchor:D,angle:M});}else Rt(x.numGlyphs,f);}if(c){g.clear();const i=t.icon.placedSymbolArray;for(let t=0;t<i.length;t++){const a=i.get(t);if(a.hidden)Rt(a.numGlyphs,g);else {const i=v[t];if(i)for(let t=0;t<a.numGlyphs;t++)e.aj(g,i.shiftedAnchor,i.angle);else Rt(a.numGlyphs,g);}}t.icon.dynamicLayoutVertexBuffer.updateData(g);}t.text.dynamicLayoutVertexBuffer.updateData(f);}function $i(t,e,i){return i.iconsInText&&e?"symbolTextAndIcon":t?"symbolSDF":"symbolIcon"}function Xi(t,i,a,s,o,r,n,l,h,c,u,d){const _=t.context,p=_.gl,m=t.transform,f=ie(),g="map"===l,v="map"===h,x="viewport"!==l&&"point"!==a.layout.get("symbol-placement"),y=g&&!v&&!x,b=!v&&x,w=!a.layout.get("symbol-sort-key").isConstant();let T=!1;const I=t.depthModeForSublayer(0,Oi.ReadOnly),E=a._unevaluatedLayout.hasValue("text-variable-anchor")||a._unevaluatedLayout.hasValue("text-variable-anchor-offset"),P=[],C=f.getCircleRadiusCorrection(m);for(const l of s){const s=i.getTile(l),h=s.getBucket(a);if(!h)continue;const u=o?h.text:h.icon;if(!u||!u.segments.get().length||!u.hasVisibleVertices)continue;const d=u.programConfigurations.get(a.id),_=o||h.sdfIcons,I=o?h.textSizeData:h.iconSizeData,S=v||0!==m.pitch,z=t.useProgram($i(_,o,h),d),D=e.ag(I,m.zoom),M=t.style.map.terrain&&t.style.map.terrain.getTerrainData(l);let A,R,k,L,F=[0,0],B=null;if(o)R=s.glyphAtlasTexture,k=p.LINEAR,A=s.glyphAtlasTexture.size,h.iconsInText&&(F=s.imageAtlasTexture.size,B=s.imageAtlasTexture,L=S||t.options.rotating||t.options.zooming||"composite"===I.kind||"camera"===I.kind?p.LINEAR:p.NEAREST);else {const e=1!==a.layout.get("icon-size").constantOr(0)||h.iconsNeedLinear;R=s.imageAtlasTexture,k=_||t.options.rotating||t.options.zooming||e||S?p.LINEAR:p.NEAREST,A=s.imageAtlasTexture.size;}const O=Bt(s,1,t.transform.zoom),N=b?l.posMatrix:Vi,U=gt(N,v,g,t.transform,O),j=vt(N,v,g,t.transform,O),Z=vt(l.posMatrix,v,g,t.transform,O),q=f.translatePosition(t.transform,s,r,n),V=E&&h.hasTextData(),G="none"!==a.layout.get("icon-text-fit")&&V&&h.hasIconData();if(x){const e=t.style.map.terrain?(e,i)=>t.style.map.terrain.getElevation(l,e,i):null,i="map"===a.layout.get("text-rotation-alignment");wt(h,l.posMatrix,t,o,U,Z,v,c,i,f,l.toUnwrapped(),m.width,m.height,q,e);}const H=l.posMatrix,W=o&&E||G,$=x||W?Vi:U,X=j,K=_&&0!==a.paint.get(o?"text-halo-width":"icon-halo-width").constantOr(1);let J;J=_?h.iconsInText?Ve(I.kind,D,y,v,x,W,t,H,$,X,q,A,F,C):qe(I.kind,D,y,v,x,W,t,H,$,X,q,o,A,!0,C):Ze(I.kind,D,y,v,x,W,t,H,$,X,q,o,A,C);const Y={program:z,buffers:u,uniformValues:J,atlasTexture:R,atlasTextureIcon:B,atlasInterpolation:k,atlasInterpolationIcon:L,isSDF:_,hasHalo:K};if(w&&h.canOverlap){T=!0;const t=u.segments.get();for(const i of t)P.push({segments:new e.a0([i]),sortKey:i.sortKey,state:Y,terrainData:M});}else P.push({segments:u.segments,sortKey:0,state:Y,terrainData:M});}T&&P.sort(((t,e)=>t.sortKey-e.sortKey));for(const e of P){const i=e.state;if(_.activeTexture.set(p.TEXTURE0),i.atlasTexture.bind(i.atlasInterpolation,p.CLAMP_TO_EDGE),i.atlasTextureIcon&&(_.activeTexture.set(p.TEXTURE1),i.atlasTextureIcon&&i.atlasTextureIcon.bind(i.atlasInterpolationIcon,p.CLAMP_TO_EDGE)),i.isSDF){const s=i.uniformValues;i.hasHalo&&(s.u_is_halo=1,Ki(i.buffers,e.segments,a,t,i.program,I,u,d,s,e.terrainData)),s.u_is_halo=0;}Ki(i.buffers,e.segments,a,t,i.program,I,u,d,i.uniformValues,e.terrainData);}}function Ki(t,e,i,a,s,o,r,n,l,h){const c=a.context;s.draw(c,c.gl.TRIANGLES,o,r,n,ji.disabled,l,h,i.id,t.layoutVertexBuffer,t.indexBuffer,e,i.paint,a.transform.zoom,t.programConfigurations.get(i.id),t.dynamicLayoutVertexBuffer,t.opacityVertexBuffer);}function Ji(t,i,a,s){const o=t.context,r=o.gl,n=Ui.disabled,l=new Fi([r.ONE,r.ONE],e.aM.transparent,[!0,!0,!0,!0]),h=i.getBucket(a);if(!h)return;const c=s.key;let u=a.heatmapFbos.get(c);u||(u=Qi(o,i.tileSize,i.tileSize),a.heatmapFbos.set(c,u)),o.bindFramebuffer.set(u.framebuffer),o.viewport.set([0,0,i.tileSize,i.tileSize]),o.clear({color:e.aM.transparent});const d=h.programConfigurations.get(a.id),_=t.useProgram("heatmap",d),p=t.style.map.terrain.getTerrainData(s);_.draw(o,r.TRIANGLES,Oi.disabled,n,l,ji.disabled,Me(s.posMatrix,i,t.transform.zoom,a.paint.get("heatmap-intensity")),p,a.id,h.layoutVertexBuffer,h.indexBuffer,h.segments,a.paint,t.transform.zoom,d);}function Yi(t,e,i){const a=t.context,s=a.gl;a.setColorMode(t.colorModeForRenderPass());const o=ta(a,e),r=i.key,n=e.heatmapFbos.get(r);n&&(a.activeTexture.set(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,n.colorAttachment.get()),a.activeTexture.set(s.TEXTURE1),o.bind(s.LINEAR,s.CLAMP_TO_EDGE),t.useProgram("heatmapTexture").draw(a,s.TRIANGLES,Oi.disabled,Ui.disabled,t.colorModeForRenderPass(),ji.disabled,Ae(t,e,0,1),null,e.id,t.rasterBoundsBuffer,t.quadTriangleIndexBuffer,t.rasterBoundsSegments,e.paint,t.transform.zoom),n.destroy(),e.heatmapFbos.delete(r));}function Qi(t,e,i){var a,s;const o=t.gl,r=o.createTexture();o.bindTexture(o.TEXTURE_2D,r),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.LINEAR);const n=null!==(a=t.HALF_FLOAT)&&void 0!==a?a:o.UNSIGNED_BYTE,l=null!==(s=t.RGBA16F)&&void 0!==s?s:o.RGBA;o.texImage2D(o.TEXTURE_2D,0,l,e,i,0,o.RGBA,n,null);const h=t.createFramebuffer(e,i,!1,!1);return h.colorAttachment.set(r),h}function ta(t,e){return e.colorRampTexture||(e.colorRampTexture=new b(t,e.colorRamp,t.gl.RGBA)),e.colorRampTexture}function ea(t,e,i,a,s){if(!i||!a||!a.imageAtlas)return;const o=a.imageAtlas.patternPositions;let r=o[i.to.toString()],n=o[i.from.toString()];if(!r&&n&&(r=n),!n&&r&&(n=r),!r||!n){const t=s.getPaintProperty(e);r=o[t],n=o[t];}r&&n&&t.setConstantPatternPositions(r,n);}function ia(t,e,i,a,s,o,r){const n=t.context.gl,l="fill-pattern",h=i.paint.get(l),c=h&&h.constantOr(1),u=i.getCrossfadeParameters();let d,_,p,m,f;r?(_=c&&!i.getPaintProperty("fill-outline-color")?"fillOutlinePattern":"fillOutline",d=n.LINES):(_=c?"fillPattern":"fill",d=n.TRIANGLES);const g=h.constantOr(null);for(const h of a){const a=e.getTile(h);if(c&&!a.patternsLoaded())continue;const v=a.getBucket(i);if(!v)continue;const x=v.programConfigurations.get(i.id),y=t.useProgram(_,x),b=t.style.map.terrain&&t.style.map.terrain.getTerrainData(h);c&&(t.context.activeTexture.set(n.TEXTURE0),a.imageAtlasTexture.bind(n.LINEAR,n.CLAMP_TO_EDGE),x.updatePaintBuffers(u)),ea(x,l,g,a,i);const w=b?h:null,T=t.translatePosMatrix(w?w.posMatrix:h.posMatrix,a,i.paint.get("fill-translate"),i.paint.get("fill-translate-anchor"));if(r){m=v.indexBuffer2,f=v.segments2;const e=[n.drawingBufferWidth,n.drawingBufferHeight];p="fillOutlinePattern"===_&&c?Pe(T,t,u,a,e):Ee(T,e);}else m=v.indexBuffer,f=v.segments,p=c?Ie(T,t,u,a):Te(T);y.draw(t.context,d,s,t.stencilModeForClipping(h),o,ji.disabled,p,b,i.id,v.layoutVertexBuffer,m,f,i.paint,t.transform.zoom,x);}}function aa(t,e,i,a,s,o,r){const n=t.context,l=n.gl,h="fill-extrusion-pattern",c=i.paint.get(h),u=c.constantOr(1),d=i.getCrossfadeParameters(),_=i.paint.get("fill-extrusion-opacity"),p=c.constantOr(null);for(const c of a){const a=e.getTile(c),m=a.getBucket(i);if(!m)continue;const f=t.style.map.terrain&&t.style.map.terrain.getTerrainData(c),g=m.programConfigurations.get(i.id),v=t.useProgram(u?"fillExtrusionPattern":"fillExtrusion",g);u&&(t.context.activeTexture.set(l.TEXTURE0),a.imageAtlasTexture.bind(l.LINEAR,l.CLAMP_TO_EDGE),g.updatePaintBuffers(d)),ea(g,h,p,a,i);const x=t.translatePosMatrix(c.posMatrix,a,i.paint.get("fill-extrusion-translate"),i.paint.get("fill-extrusion-translate-anchor")),y=i.paint.get("fill-extrusion-vertical-gradient"),b=u?we(x,t,y,_,c,d,a):be(x,t,y,_);v.draw(n,n.gl.TRIANGLES,s,o,r,ji.backCCW,b,f,i.id,m.layoutVertexBuffer,m.indexBuffer,m.segments,i.paint,t.transform.zoom,g,t.style.map.terrain&&m.centroidVertexBuffer);}}function sa(t,e,i,a,s,o,r){const n=t.context,l=n.gl,h=i.fbo;if(!h)return;const c=t.useProgram("hillshade"),u=t.style.map.terrain&&t.style.map.terrain.getTerrainData(e);n.activeTexture.set(l.TEXTURE0),l.bindTexture(l.TEXTURE_2D,h.colorAttachment.get()),c.draw(n,l.TRIANGLES,s,o,r,ji.disabled,((t,e,i,a)=>{const s=i.paint.get("hillshade-shadow-color"),o=i.paint.get("hillshade-highlight-color"),r=i.paint.get("hillshade-accent-color");let n=i.paint.get("hillshade-illumination-direction")*(Math.PI/180);"viewport"===i.paint.get("hillshade-illumination-anchor")&&(n-=t.transform.angle);const l=!t.options.moving;return {u_matrix:a?a.posMatrix:t.transform.calculatePosMatrix(e.tileID.toUnwrapped(),l),u_image:0,u_latrange:Re(0,e.tileID),u_light:[i.paint.get("hillshade-exaggeration"),n],u_shadow:s,u_highlight:o,u_accent:r}})(t,i,a,u?e:null),u,a.id,t.rasterBoundsBuffer,t.quadTriangleIndexBuffer,t.rasterBoundsSegments);}function oa(t,i,a,s,o,r){const n=t.context,l=n.gl,h=i.dem;if(h&&h.data){const c=h.dim,u=h.stride,d=h.getPixels();if(n.activeTexture.set(l.TEXTURE1),n.pixelStoreUnpackPremultiplyAlpha.set(!1),i.demTexture=i.demTexture||t.getTileTexture(u),i.demTexture){const t=i.demTexture;t.update(d,{premultiply:!1}),t.bind(l.NEAREST,l.CLAMP_TO_EDGE);}else i.demTexture=new b(n,d,l.RGBA,{premultiply:!1}),i.demTexture.bind(l.NEAREST,l.CLAMP_TO_EDGE);n.activeTexture.set(l.TEXTURE0);let _=i.fbo;if(!_){const t=new b(n,{width:c,height:c,data:null},l.RGBA);t.bind(l.LINEAR,l.CLAMP_TO_EDGE),_=i.fbo=n.createFramebuffer(c,c,!0,!1),_.colorAttachment.set(t.texture);}n.bindFramebuffer.set(_.framebuffer),n.viewport.set([0,0,c,c]),t.useProgram("hillshadePrepare").draw(n,l.TRIANGLES,s,o,r,ji.disabled,((t,i)=>{const a=i.stride,s=e.H();return e.aP(s,0,e.X,-e.X,0,0,1),e.J(s,s,[0,-e.X,0]),{u_matrix:s,u_image:1,u_dimension:[a,a],u_zoom:t.overscaledZ,u_unpack:i.getUnpackVector()}})(i.tileID,h),null,a.id,t.rasterBoundsBuffer,t.quadTriangleIndexBuffer,t.rasterBoundsSegments),i.needsHillshadePrepare=!1;}}function ra(t,i,a,s,r,n){const l=s.paint.get("raster-fade-duration");if(!n&&l>0){const s=o.now(),n=(s-t.timeAdded)/l,h=i?(s-i.timeAdded)/l:-1,c=a.getSource(),u=r.coveringZoomLevel({tileSize:c.tileSize,roundZoom:c.roundZoom}),d=!i||Math.abs(i.tileID.overscaledZ-u)>Math.abs(t.tileID.overscaledZ-u),_=d&&t.refreshedUponExpiration?1:e.ac(d?n:1-h,0,1);return t.refreshedUponExpiration&&n>=1&&(t.refreshedUponExpiration=!1),i?{opacity:1,mix:1-_}:{opacity:_,mix:0}}return {opacity:1,mix:0}}const na=new e.aM(1,0,0,1),la=new e.aM(0,1,0,1),ha=new e.aM(0,0,1,1),ca=new e.aM(1,0,1,1),ua=new e.aM(0,1,1,1);function da(t,e,i,a){pa(t,0,e+i/2,t.transform.width,i,a);}function _a(t,e,i,a){pa(t,e-i/2,0,i,t.transform.height,a);}function pa(t,e,i,a,s,o){const r=t.context,n=r.gl;n.enable(n.SCISSOR_TEST),n.scissor(e*t.pixelRatio,i*t.pixelRatio,a*t.pixelRatio,s*t.pixelRatio),r.clear({color:o}),n.disable(n.SCISSOR_TEST);}function ma(t,i,a){const s=t.context,o=s.gl,r=a.posMatrix,n=t.useProgram("debug"),l=Oi.disabled,h=Ui.disabled,c=t.colorModeForRenderPass(),u="$debug",d=t.style.map.terrain&&t.style.map.terrain.getTerrainData(a);s.activeTexture.set(o.TEXTURE0);const _=i.getTileByID(a.key).latestRawTileData,p=Math.floor((_&&_.byteLength||0)/1024),m=i.getTile(a).tileSize,f=512/Math.min(m,512)*(a.overscaledZ/t.transform.zoom)*.5;let g=a.canonical.toString();a.overscaledZ!==a.canonical.z&&(g+=` => ${a.overscaledZ}`),function(t,e){t.initDebugOverlayCanvas();const i=t.debugOverlayCanvas,a=t.context.gl,s=t.debugOverlayCanvas.getContext("2d");s.clearRect(0,0,i.width,i.height),s.shadowColor="white",s.shadowBlur=2,s.lineWidth=1.5,s.strokeStyle="white",s.textBaseline="top",s.font="bold 36px Open Sans, sans-serif",s.fillText(e,5,5),s.strokeText(e,5,5),t.debugOverlayTexture.update(i),t.debugOverlayTexture.bind(a.LINEAR,a.CLAMP_TO_EDGE);}(t,`${g} ${p}kB`),n.draw(s,o.TRIANGLES,l,h,Fi.alphaBlended,ji.disabled,ze(r,e.aM.transparent,f),null,u,t.debugBuffer,t.quadTriangleIndexBuffer,t.debugSegments),n.draw(s,o.LINE_STRIP,l,h,c,ji.disabled,ze(r,e.aM.red),d,u,t.debugBuffer,t.tileBorderIndexBuffer,t.debugSegments);}function fa(t,e,i){const a=t.context,s=a.gl,o=t.colorModeForRenderPass(),r=new Oi(s.LEQUAL,Oi.ReadWrite,t.depthRangeFor3D),n=t.useProgram("terrain"),l=e.getTerrainMesh();a.bindFramebuffer.set(null),a.viewport.set([0,0,t.width,t.height]);for(const h of i){const i=t.renderToTexture.getTexture(h),c=e.getTerrainData(h.tileID);a.activeTexture.set(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,i.texture);const u=t.transform.calculatePosMatrix(h.tileID.toUnwrapped()),d=e.getMeshFrameDelta(t.transform.zoom),_=t.transform.calculateFogMatrix(h.tileID.toUnwrapped()),p=ge(u,d,_,t.style.sky,t.transform.pitch);n.draw(a,s.TRIANGLES,r,Ui.disabled,o,ji.backCCW,p,c,"terrain",l.vertexBuffer,l.indexBuffer,l.segments);}}class ga{constructor(t,e,i){this.vertexBuffer=t,this.indexBuffer=e,this.segments=i;}destroy(){this.vertexBuffer.destroy(),this.indexBuffer.destroy(),this.segments.destroy(),this.vertexBuffer=null,this.indexBuffer=null,this.segments=null;}}class va{constructor(t,i){this.context=new Bi(t),this.transform=i,this._tileTextures={},this.terrainFacilitator={dirty:!0,matrix:e.an(new Float64Array(16)),renderTime:0},this.setup(),this.numSublayers=ut.maxUnderzooming+ut.maxOverzooming+1,this.depthEpsilon=1/Math.pow(2,16),this.crossTileSymbolIndex=new he;}resize(t,e,i){if(this.width=Math.floor(t*i),this.height=Math.floor(e*i),this.pixelRatio=i,this.context.viewport.set([0,0,this.width,this.height]),this.style)for(const t of this.style._order)this.style._layers[t].resize();}setup(){const t=this.context,i=new e.aX;i.emplaceBack(0,0),i.emplaceBack(e.X,0),i.emplaceBack(0,e.X),i.emplaceBack(e.X,e.X),this.tileExtentBuffer=t.createVertexBuffer(i,_e.members),this.tileExtentSegments=e.a0.simpleSegment(0,0,4,2);const a=new e.aX;a.emplaceBack(0,0),a.emplaceBack(e.X,0),a.emplaceBack(0,e.X),a.emplaceBack(e.X,e.X),this.debugBuffer=t.createVertexBuffer(a,_e.members),this.debugSegments=e.a0.simpleSegment(0,0,4,5);const s=new e.$;s.emplaceBack(0,0,0,0),s.emplaceBack(e.X,0,e.X,0),s.emplaceBack(0,e.X,0,e.X),s.emplaceBack(e.X,e.X,e.X,e.X),this.rasterBoundsBuffer=t.createVertexBuffer(s,Y.members),this.rasterBoundsSegments=e.a0.simpleSegment(0,0,4,2);const o=new e.aX;o.emplaceBack(0,0),o.emplaceBack(1,0),o.emplaceBack(0,1),o.emplaceBack(1,1),this.viewportBuffer=t.createVertexBuffer(o,_e.members),this.viewportSegments=e.a0.simpleSegment(0,0,4,2);const r=new e.aZ;r.emplaceBack(0),r.emplaceBack(1),r.emplaceBack(3),r.emplaceBack(2),r.emplaceBack(0),this.tileBorderIndexBuffer=t.createIndexBuffer(r);const n=new e.aY;n.emplaceBack(0,1,2),n.emplaceBack(2,1,3),this.quadTriangleIndexBuffer=t.createIndexBuffer(n);const l=this.context.gl;this.stencilClearMode=new Ui({func:l.ALWAYS,mask:0},0,255,l.ZERO,l.ZERO,l.ZERO);}clearStencil(){const t=this.context,i=t.gl;this.nextStencilID=1,this.currentStencilSource=void 0;const a=e.H();e.aP(a,0,this.width,this.height,0,0,1),e.K(a,a,[i.drawingBufferWidth,i.drawingBufferHeight,0]),this.useProgram("clippingMask").draw(t,i.TRIANGLES,Oi.disabled,this.stencilClearMode,Fi.disabled,ji.disabled,De(a),null,"$clipping",this.viewportBuffer,this.quadTriangleIndexBuffer,this.viewportSegments);}_renderTileClippingMasks(t,e){if(this.currentStencilSource===t.source||!t.isTileClipped()||!e||!e.length)return;this.currentStencilSource=t.source;const i=this.context,a=i.gl;this.nextStencilID+e.length>256&&this.clearStencil(),i.setColorMode(Fi.disabled),i.setDepthMode(Oi.disabled);const s=this.useProgram("clippingMask");this._tileClippingMaskIDs={};for(const t of e){const e=this._tileClippingMaskIDs[t.key]=this.nextStencilID++,o=this.style.map.terrain&&this.style.map.terrain.getTerrainData(t);s.draw(i,a.TRIANGLES,Oi.disabled,new Ui({func:a.ALWAYS,mask:0},e,255,a.KEEP,a.KEEP,a.REPLACE),Fi.disabled,ji.disabled,De(t.posMatrix),o,"$clipping",this.tileExtentBuffer,this.quadTriangleIndexBuffer,this.tileExtentSegments);}}stencilModeFor3D(){this.currentStencilSource=void 0,this.nextStencilID+1>256&&this.clearStencil();const t=this.nextStencilID++,e=this.context.gl;return new Ui({func:e.NOTEQUAL,mask:255},t,255,e.KEEP,e.KEEP,e.REPLACE)}stencilModeForClipping(t){const e=this.context.gl;return new Ui({func:e.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,e.KEEP,e.KEEP,e.REPLACE)}stencilConfigForOverlap(t){const e=this.context.gl,i=t.sort(((t,e)=>e.overscaledZ-t.overscaledZ)),a=i[i.length-1].overscaledZ,s=i[0].overscaledZ-a+1;if(s>1){this.currentStencilSource=void 0,this.nextStencilID+s>256&&this.clearStencil();const t={};for(let i=0;i<s;i++)t[i+a]=new Ui({func:e.GEQUAL,mask:255},i+this.nextStencilID,255,e.KEEP,e.KEEP,e.REPLACE);return this.nextStencilID+=s,[t,i]}return [{[a]:Ui.disabled},i]}colorModeForRenderPass(){const t=this.context.gl;if(this._showOverdrawInspector){const i=1/8;return new Fi([t.CONSTANT_COLOR,t.ONE],new e.aM(i,i,i,0),[!0,!0,!0,!0])}return "opaque"===this.renderPass?Fi.unblended:Fi.alphaBlended}depthModeForSublayer(t,e,i){if(!this.opaquePassEnabledForLayer())return Oi.disabled;const a=1-((1+this.currentLayer)*this.numSublayers+t)*this.depthEpsilon;return new Oi(i||this.context.gl.LEQUAL,e,[a,a])}opaquePassEnabledForLayer(){return this.currentLayer<this.opaquePassCutoff}render(t,i){this.style=t,this.options=i,this.lineAtlas=t.lineAtlas,this.imageManager=t.imageManager,this.glyphManager=t.glyphManager,this.symbolFadeChange=t.placement.symbolFadeChange(o.now()),this.imageManager.beginFrame();const a=this.style._order,s=this.style.sourceCaches,r={},n={},l={};for(const t in s){const e=s[t];e.used&&e.prepare(this.context),r[t]=e.getVisibleCoordinates(),n[t]=r[t].slice().reverse(),l[t]=e.getVisibleCoordinates(!0).reverse();}this.opaquePassCutoff=1/0;for(let t=0;t<a.length;t++)if(this.style._layers[a[t]].is3D()){this.opaquePassCutoff=t;break}this.maybeDrawDepthAndCoords(!1),this.renderToTexture&&(this.renderToTexture.prepareForRender(this.style,this.transform.zoom),this.opaquePassCutoff=0),this.renderPass="offscreen";for(const t of a){const e=this.style._layers[t];if(!e.hasOffscreenPass()||e.isHidden(this.transform.zoom))continue;const i=n[e.source];("custom"===e.type||i.length)&&this.renderLayer(this,s[e.source],e,i);}if(this.context.bindFramebuffer.set(null),this.context.clear({color:i.showOverdrawInspector?e.aM.black:e.aM.transparent,depth:1}),this.clearStencil(),this.style.sky&&function(t,i){const a=t.context,s=a.gl,o=((t,e,i)=>({u_sky_color:t.properties.get("sky-color"),u_horizon_color:t.properties.get("horizon-color"),u_horizon:(e.height/2+e.getHorizon())*i,u_sky_horizon_blend:t.properties.get("sky-horizon-blend")*e.height/2*i}))(i,t.style.map.transform,t.pixelRatio),r=new Oi(s.LEQUAL,Oi.ReadWrite,[0,1]),n=Ui.disabled,l=t.colorModeForRenderPass(),h=t.useProgram("sky");if(!i.mesh){const t=new e.aX;t.emplaceBack(-1,-1),t.emplaceBack(1,-1),t.emplaceBack(1,1),t.emplaceBack(-1,1);const s=new e.aY;s.emplaceBack(0,1,2),s.emplaceBack(0,2,3),i.mesh=new ga(a.createVertexBuffer(t,_e.members),a.createIndexBuffer(s),e.a0.simpleSegment(0,0,t.length,s.length));}h.draw(a,s.TRIANGLES,r,n,l,ji.disabled,o,void 0,"sky",i.mesh.vertexBuffer,i.mesh.indexBuffer,i.mesh.segments);}(this,this.style.sky),this._showOverdrawInspector=i.showOverdrawInspector,this.depthRangeFor3D=[0,1-(t._order.length+2)*this.numSublayers*this.depthEpsilon],!this.renderToTexture)for(this.renderPass="opaque",this.currentLayer=a.length-1;this.currentLayer>=0;this.currentLayer--){const t=this.style._layers[a[this.currentLayer]],e=s[t.source],i=r[t.source];this._renderTileClippingMasks(t,i),this.renderLayer(this,e,t,i);}for(this.renderPass="translucent",this.currentLayer=0;this.currentLayer<a.length;this.currentLayer++){const t=this.style._layers[a[this.currentLayer]],e=s[t.source];if(this.renderToTexture&&this.renderToTexture.renderLayer(t))continue;const i=("symbol"===t.type?l:n)[t.source];this._renderTileClippingMasks(t,r[t.source]),this.renderLayer(this,e,t,i);}if(this.options.showTileBoundaries){const t=function(t,e){let i=null;const a=Object.values(t._layers).flatMap((i=>i.source&&!i.isHidden(e)?[t.sourceCaches[i.source]]:[])),s=a.filter((t=>"vector"===t.getSource().type)),o=a.filter((t=>"vector"!==t.getSource().type)),r=t=>{(!i||i.getSource().maxzoom<t.getSource().maxzoom)&&(i=t);};return s.forEach((t=>r(t))),i||o.forEach((t=>r(t))),i}(this.style,this.transform.zoom);t&&function(t,e,i){for(let a=0;a<i.length;a++)ma(t,e,i[a]);}(this,t,t.getVisibleCoordinates());}this.options.showPadding&&function(t){const e=t.transform.padding;da(t,t.transform.height-(e.top||0),3,na),da(t,e.bottom||0,3,la),_a(t,e.left||0,3,ha),_a(t,t.transform.width-(e.right||0),3,ca);const i=t.transform.centerPoint;!function(t,e,i,a){pa(t,e-1,i-10,2,20,a),pa(t,e-10,i-1,20,2,a);}(t,i.x,t.transform.height-i.y,ua);}(this),this.context.setDefault();}maybeDrawDepthAndCoords(t){if(!this.style||!this.style.map||!this.style.map.terrain)return;const i=this.terrainFacilitator.matrix,a=this.transform.modelViewProjectionMatrix;let s=this.terrainFacilitator.dirty;s||(s=t?!e.a_(i,a):!e.a$(i,a)),s||(s=this.style.map.terrain.sourceCache.tilesAfterTime(this.terrainFacilitator.renderTime).length>0),s&&(e.b0(i,a),this.terrainFacilitator.renderTime=Date.now(),this.terrainFacilitator.dirty=!1,function(t,i){const a=t.context,s=a.gl,o=Fi.unblended,r=new Oi(s.LEQUAL,Oi.ReadWrite,[0,1]),n=i.getTerrainMesh(),l=i.sourceCache.getRenderableTiles(),h=t.useProgram("terrainDepth");a.bindFramebuffer.set(i.getFramebuffer("depth").framebuffer),a.viewport.set([0,0,t.width/devicePixelRatio,t.height/devicePixelRatio]),a.clear({color:e.aM.transparent,depth:1});for(const e of l){const l=i.getTerrainData(e.tileID),c={u_matrix:t.transform.calculatePosMatrix(e.tileID.toUnwrapped()),u_ele_delta:i.getMeshFrameDelta(t.transform.zoom)};h.draw(a,s.TRIANGLES,r,Ui.disabled,o,ji.backCCW,c,l,"terrain",n.vertexBuffer,n.indexBuffer,n.segments);}a.bindFramebuffer.set(null),a.viewport.set([0,0,t.width,t.height]);}(this,this.style.map.terrain),function(t,i){const a=t.context,s=a.gl,o=Fi.unblended,r=new Oi(s.LEQUAL,Oi.ReadWrite,[0,1]),n=i.getTerrainMesh(),l=i.getCoordsTexture(),h=i.sourceCache.getRenderableTiles(),c=t.useProgram("terrainCoords");a.bindFramebuffer.set(i.getFramebuffer("coords").framebuffer),a.viewport.set([0,0,t.width/devicePixelRatio,t.height/devicePixelRatio]),a.clear({color:e.aM.transparent,depth:1}),i.coordsIndex=[];for(const e of h){const h=i.getTerrainData(e.tileID);a.activeTexture.set(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,l.texture);const u={u_matrix:t.transform.calculatePosMatrix(e.tileID.toUnwrapped()),u_terrain_coords_id:(255-i.coordsIndex.length)/255,u_texture:0,u_ele_delta:i.getMeshFrameDelta(t.transform.zoom)};c.draw(a,s.TRIANGLES,r,Ui.disabled,o,ji.backCCW,u,h,"terrain",n.vertexBuffer,n.indexBuffer,n.segments),i.coordsIndex.push(e.tileID.key);}a.bindFramebuffer.set(null),a.viewport.set([0,0,t.width,t.height]);}(this,this.style.map.terrain));}renderLayer(t,i,a,s){if(!a.isHidden(this.transform.zoom)&&("background"===a.type||"custom"===a.type||(s||[]).length))switch(this.id=a.id,a.type){case"symbol":!function(t,i,a,s,o){if("translucent"!==t.renderPass)return;const r=Ui.disabled,n=t.colorModeForRenderPass();(a._unevaluatedLayout.hasValue("text-variable-anchor")||a._unevaluatedLayout.hasValue("text-variable-anchor-offset"))&&function(t,i,a,s,o,r,n,l,h){const c=i.transform,u=ie(),d="map"===o,_="map"===r;for(const o of t){const t=s.getTile(o),r=t.getBucket(a);if(!r||!r.text||!r.text.segments.get().length)continue;const p=e.ag(r.textSizeData,c.zoom),m=Bt(t,1,i.transform.zoom),f=gt(o.posMatrix,_,d,i.transform,m),g="none"!==a.layout.get("icon-text-fit")&&r.hasIconData();if(p){const e=Math.pow(2,c.zoom-t.tileID.overscaledZ),a=i.style.map.terrain?(t,e)=>i.style.map.terrain.getElevation(o,t,e):null,s=u.translatePosition(c,t,n,l);Wi(r,d,_,h,c,f,o.posMatrix,e,p,g,u,s,o.toUnwrapped(),a);}}}(s,t,a,i,a.layout.get("text-rotation-alignment"),a.layout.get("text-pitch-alignment"),a.paint.get("text-translate"),a.paint.get("text-translate-anchor"),o),0!==a.paint.get("icon-opacity").constantOr(1)&&Xi(t,i,a,s,!1,a.paint.get("icon-translate"),a.paint.get("icon-translate-anchor"),a.layout.get("icon-rotation-alignment"),a.layout.get("icon-pitch-alignment"),a.layout.get("icon-keep-upright"),r,n),0!==a.paint.get("text-opacity").constantOr(1)&&Xi(t,i,a,s,!0,a.paint.get("text-translate"),a.paint.get("text-translate-anchor"),a.layout.get("text-rotation-alignment"),a.layout.get("text-pitch-alignment"),a.layout.get("text-keep-upright"),r,n),i.map.showCollisionBoxes&&(qi(t,i,a,s,!0),qi(t,i,a,s,!1));}(t,i,a,s,this.style.placement.variableOffsets);break;case"circle":!function(t,i,a,s){if("translucent"!==t.renderPass)return;const o=a.paint.get("circle-opacity"),r=a.paint.get("circle-stroke-width"),n=a.paint.get("circle-stroke-opacity"),l=!a.layout.get("circle-sort-key").isConstant();if(0===o.constantOr(1)&&(0===r.constantOr(1)||0===n.constantOr(1)))return;const h=t.context,c=h.gl,u=t.depthModeForSublayer(0,Oi.ReadOnly),d=Ui.disabled,_=t.colorModeForRenderPass(),p=[];for(let o=0;o<s.length;o++){const r=s[o],n=i.getTile(r),h=n.getBucket(a);if(!h)continue;const c=h.programConfigurations.get(a.id),u=t.useProgram("circle",c),d=h.layoutVertexBuffer,_=h.indexBuffer,m=t.style.map.terrain&&t.style.map.terrain.getTerrainData(r),f={programConfiguration:c,program:u,layoutVertexBuffer:d,indexBuffer:_,uniformValues:Ce(t,r,n,a),terrainData:m};if(l){const t=h.segments.get();for(const i of t)p.push({segments:new e.a0([i]),sortKey:i.sortKey,state:f});}else p.push({segments:h.segments,sortKey:0,state:f});}l&&p.sort(((t,e)=>t.sortKey-e.sortKey));for(const e of p){const{programConfiguration:i,program:s,layoutVertexBuffer:o,indexBuffer:r,uniformValues:n,terrainData:l}=e.state;s.draw(h,c.TRIANGLES,u,d,_,ji.disabled,n,l,a.id,o,r,e.segments,a.paint,t.transform.zoom,i);}}(t,i,a,s);break;case"heatmap":!function(t,i,a,s){if(0===a.paint.get("heatmap-opacity"))return;const o=t.context;if(t.style.map.terrain){for(const e of s){const s=i.getTile(e);i.hasRenderableParent(e)||("offscreen"===t.renderPass?Ji(t,s,a,e):"translucent"===t.renderPass&&Yi(t,a,e));}o.viewport.set([0,0,t.width,t.height]);}else "offscreen"===t.renderPass?function(t,i,a,s){const o=t.context,r=o.gl,n=Ui.disabled,l=new Fi([r.ONE,r.ONE],e.aM.transparent,[!0,!0,!0,!0]);((function(t,i,a){const s=t.gl;t.activeTexture.set(s.TEXTURE1),t.viewport.set([0,0,i.width/4,i.height/4]);let o=a.heatmapFbos.get(e.aU);o?(s.bindTexture(s.TEXTURE_2D,o.colorAttachment.get()),t.bindFramebuffer.set(o.framebuffer)):(o=Qi(t,i.width/4,i.height/4),a.heatmapFbos.set(e.aU,o));}))(o,t,a),o.clear({color:e.aM.transparent});for(let e=0;e<s.length;e++){const h=s[e];if(i.hasRenderableParent(h))continue;const c=i.getTile(h),u=c.getBucket(a);if(!u)continue;const d=u.programConfigurations.get(a.id),_=t.useProgram("heatmap",d),{zoom:p}=t.transform;_.draw(o,r.TRIANGLES,Oi.disabled,n,l,ji.disabled,Me(h.posMatrix,c,p,a.paint.get("heatmap-intensity")),null,a.id,u.layoutVertexBuffer,u.indexBuffer,u.segments,a.paint,t.transform.zoom,d);}o.viewport.set([0,0,t.width,t.height]);}(t,i,a,s):"translucent"===t.renderPass&&function(t,i){const a=t.context,s=a.gl;a.setColorMode(t.colorModeForRenderPass());const o=i.heatmapFbos.get(e.aU);o&&(a.activeTexture.set(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,o.colorAttachment.get()),a.activeTexture.set(s.TEXTURE1),ta(a,i).bind(s.LINEAR,s.CLAMP_TO_EDGE),t.useProgram("heatmapTexture").draw(a,s.TRIANGLES,Oi.disabled,Ui.disabled,t.colorModeForRenderPass(),ji.disabled,Ae(t,i,0,1),null,i.id,t.viewportBuffer,t.quadTriangleIndexBuffer,t.viewportSegments,i.paint,t.transform.zoom));}(t,a);}(t,i,a,s);break;case"line":!function(t,i,a,s){if("translucent"!==t.renderPass)return;const o=a.paint.get("line-opacity"),r=a.paint.get("line-width");if(0===o.constantOr(1)||0===r.constantOr(1))return;const n=t.depthModeForSublayer(0,Oi.ReadOnly),l=t.colorModeForRenderPass(),h=a.paint.get("line-dasharray"),c=a.paint.get("line-pattern"),u=c.constantOr(1),d=a.paint.get("line-gradient"),_=a.getCrossfadeParameters(),p=u?"linePattern":h?"lineSDF":d?"lineGradient":"line",m=t.context,f=m.gl;let g=!0;for(const o of s){const s=i.getTile(o);if(u&&!s.patternsLoaded())continue;const r=s.getBucket(a);if(!r)continue;const v=r.programConfigurations.get(a.id),x=t.context.program.get(),y=t.useProgram(p,v),w=g||y.program!==x,T=t.style.map.terrain&&t.style.map.terrain.getTerrainData(o),I=c.constantOr(null);if(I&&s.imageAtlas){const t=s.imageAtlas,e=t.patternPositions[I.to.toString()],i=t.patternPositions[I.from.toString()];e&&i&&v.setConstantPatternPositions(e,i);}const E=T?o:null,P=u?Fe(t,s,a,_,E):h?Be(t,s,a,h,_,E):d?Le(t,s,a,r.lineClipsArray.length,E):ke(t,s,a,E);if(u)m.activeTexture.set(f.TEXTURE0),s.imageAtlasTexture.bind(f.LINEAR,f.CLAMP_TO_EDGE),v.updatePaintBuffers(_);else if(h&&(w||t.lineAtlas.dirty))m.activeTexture.set(f.TEXTURE0),t.lineAtlas.bind(m);else if(d){const s=r.gradients[a.id];let n=s.texture;if(a.gradientVersion!==s.version){let l=256;if(a.stepInterpolant){const a=i.getSource().maxzoom,s=o.canonical.z===a?Math.ceil(1<<t.transform.maxZoom-o.canonical.z):1;l=e.ac(e.aV(r.maxLineLength/e.X*1024*s),256,m.maxTextureSize);}s.gradient=e.aW({expression:a.gradientExpression(),evaluationKey:"lineProgress",resolution:l,image:s.gradient||void 0,clips:r.lineClipsArray}),s.texture?s.texture.update(s.gradient):s.texture=new b(m,s.gradient,f.RGBA),s.version=a.gradientVersion,n=s.texture;}m.activeTexture.set(f.TEXTURE0),n.bind(a.stepInterpolant?f.NEAREST:f.LINEAR,f.CLAMP_TO_EDGE);}y.draw(m,f.TRIANGLES,n,t.stencilModeForClipping(o),l,ji.disabled,P,T,a.id,r.layoutVertexBuffer,r.indexBuffer,r.segments,a.paint,t.transform.zoom,v,r.layoutVertexBuffer2),g=!1;}}(t,i,a,s);break;case"fill":!function(t,i,a,s){const o=a.paint.get("fill-color"),r=a.paint.get("fill-opacity");if(0===r.constantOr(1))return;const n=t.colorModeForRenderPass(),l=a.paint.get("fill-pattern"),h=t.opaquePassEnabledForLayer()&&!l.constantOr(1)&&1===o.constantOr(e.aM.transparent).a&&1===r.constantOr(0)?"opaque":"translucent";if(t.renderPass===h){const e=t.depthModeForSublayer(1,"opaque"===t.renderPass?Oi.ReadWrite:Oi.ReadOnly);ia(t,i,a,s,e,n,!1);}if("translucent"===t.renderPass&&a.paint.get("fill-antialias")){const e=t.depthModeForSublayer(a.getPaintProperty("fill-outline-color")?2:0,Oi.ReadOnly);ia(t,i,a,s,e,n,!0);}}(t,i,a,s);break;case"fill-extrusion":!function(t,e,i,a){const s=i.paint.get("fill-extrusion-opacity");if(0!==s&&"translucent"===t.renderPass){const o=new Oi(t.context.gl.LEQUAL,Oi.ReadWrite,t.depthRangeFor3D);if(1!==s||i.paint.get("fill-extrusion-pattern").constantOr(1))aa(t,e,i,a,o,Ui.disabled,Fi.disabled),aa(t,e,i,a,o,t.stencilModeFor3D(),t.colorModeForRenderPass());else {const s=t.colorModeForRenderPass();aa(t,e,i,a,o,Ui.disabled,s);}}}(t,i,a,s);break;case"hillshade":!function(t,e,i,a){if("offscreen"!==t.renderPass&&"translucent"!==t.renderPass)return;const s=t.context,o=t.depthModeForSublayer(0,Oi.ReadOnly),r=t.colorModeForRenderPass(),[n,l]="translucent"===t.renderPass?t.stencilConfigForOverlap(a):[{},a];for(const a of l){const s=e.getTile(a);void 0!==s.needsHillshadePrepare&&s.needsHillshadePrepare&&"offscreen"===t.renderPass?oa(t,s,i,o,Ui.disabled,r):"translucent"===t.renderPass&&sa(t,a,s,i,o,n[a.overscaledZ],r);}s.viewport.set([0,0,t.width,t.height]);}(t,i,a,s);break;case"raster":!function(t,e,i,a){if("translucent"!==t.renderPass)return;if(0===i.paint.get("raster-opacity"))return;if(!a.length)return;const s=t.context,o=s.gl,r=e.getSource(),n=t.useProgram("raster"),l=t.colorModeForRenderPass(),[h,c]=r instanceof Q?[{},a]:t.stencilConfigForOverlap(a),u=c[c.length-1].overscaledZ,d=!t.options.moving;for(const a of c){const c=t.depthModeForSublayer(a.overscaledZ-u,1===i.paint.get("raster-opacity")?Oi.ReadWrite:Oi.ReadOnly,o.LESS),_=e.getTile(a);_.registerFadeDuration(i.paint.get("raster-fade-duration"));const p=e.findLoadedParent(a,0),m=e.findLoadedSibling(a),f=ra(_,p||m||null,e,i,t.transform,t.style.map.terrain);let g,v;const x="nearest"===i.paint.get("raster-resampling")?o.NEAREST:o.LINEAR;s.activeTexture.set(o.TEXTURE0),_.texture.bind(x,o.CLAMP_TO_EDGE,o.LINEAR_MIPMAP_NEAREST),s.activeTexture.set(o.TEXTURE1),p?(p.texture.bind(x,o.CLAMP_TO_EDGE,o.LINEAR_MIPMAP_NEAREST),g=Math.pow(2,p.tileID.overscaledZ-_.tileID.overscaledZ),v=[_.tileID.canonical.x*g%1,_.tileID.canonical.y*g%1]):_.texture.bind(x,o.CLAMP_TO_EDGE,o.LINEAR_MIPMAP_NEAREST),_.texture.useMipmap&&s.extTextureFilterAnisotropic&&t.transform.pitch>20&&o.texParameterf(o.TEXTURE_2D,s.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,s.extTextureFilterAnisotropicMax);const y=t.style.map.terrain&&t.style.map.terrain.getTerrainData(a),b=y?a:null,w=b?b.posMatrix:t.transform.calculatePosMatrix(a.toUnwrapped(),d),T=Ue(w,v||[0,0],g||1,f,i);r instanceof Q?n.draw(s,o.TRIANGLES,c,Ui.disabled,l,ji.disabled,T,y,i.id,r.boundsBuffer,t.quadTriangleIndexBuffer,r.boundsSegments):n.draw(s,o.TRIANGLES,c,h[a.overscaledZ],l,ji.disabled,T,y,i.id,t.rasterBoundsBuffer,t.quadTriangleIndexBuffer,t.rasterBoundsSegments);}}(t,i,a,s);break;case"background":!function(t,e,i,a){const s=i.paint.get("background-color"),o=i.paint.get("background-opacity");if(0===o)return;const r=t.context,n=r.gl,l=t.transform,h=l.tileSize,c=i.paint.get("background-pattern");if(t.isPatternMissing(c))return;const u=!c&&1===s.a&&1===o&&t.opaquePassEnabledForLayer()?"opaque":"translucent";if(t.renderPass!==u)return;const d=Ui.disabled,_=t.depthModeForSublayer(0,"opaque"===u?Oi.ReadWrite:Oi.ReadOnly),p=t.colorModeForRenderPass(),m=t.useProgram(c?"backgroundPattern":"background"),f=a||l.coveringTiles({tileSize:h,terrain:t.style.map.terrain});c&&(r.activeTexture.set(n.TEXTURE0),t.imageManager.bind(t.context));const g=i.getCrossfadeParameters();for(const e of f){const l=a?e.posMatrix:t.transform.calculatePosMatrix(e.toUnwrapped()),u=c?He(l,o,t,c,{tileID:e,tileSize:h},g):Ge(l,o,s),f=t.style.map.terrain&&t.style.map.terrain.getTerrainData(e);m.draw(r,n.TRIANGLES,_,d,p,ji.disabled,u,f,i.id,t.tileExtentBuffer,t.quadTriangleIndexBuffer,t.tileExtentSegments);}}(t,0,a,s);break;case"custom":!function(t,e,i){const a=t.context,s=i.implementation;if("offscreen"===t.renderPass){const e=s.prerender;e&&(t.setCustomLayerDefaults(),a.setColorMode(t.colorModeForRenderPass()),e.call(s,a.gl,t.transform.customLayerMatrix()),a.setDirty(),t.setBaseState());}else if("translucent"===t.renderPass){t.setCustomLayerDefaults(),a.setColorMode(t.colorModeForRenderPass()),a.setStencilMode(Ui.disabled);const e="3d"===s.renderingMode?new Oi(t.context.gl.LEQUAL,Oi.ReadWrite,t.depthRangeFor3D):t.depthModeForSublayer(0,Oi.ReadOnly);a.setDepthMode(e),s.render(a.gl,t.transform.customLayerMatrix(),{farZ:t.transform.farZ,nearZ:t.transform.nearZ,fov:t.transform._fov,modelViewProjectionMatrix:t.transform.modelViewProjectionMatrix,projectionMatrix:t.transform.projectionMatrix}),a.setDirty(),t.setBaseState(),a.bindFramebuffer.set(null);}}(t,0,a);}}translatePosMatrix(t,i,a,s,o){if(!a[0]&&!a[1])return t;const r=o?"map"===s?this.transform.angle:0:"viewport"===s?-this.transform.angle:0;if(r){const t=Math.sin(r),e=Math.cos(r);a=[a[0]*e-a[1]*t,a[0]*t+a[1]*e];}const n=[o?a[0]:Bt(i,a[0],this.transform.zoom),o?a[1]:Bt(i,a[1],this.transform.zoom),0],l=new Float32Array(16);return e.J(l,t,n),l}saveTileTexture(t){const e=this._tileTextures[t.size[0]];e?e.push(t):this._tileTextures[t.size[0]]=[t];}getTileTexture(t){const e=this._tileTextures[t];return e&&e.length>0?e.pop():null}isPatternMissing(t){if(!t)return !1;if(!t.from||!t.to)return !0;const e=this.imageManager.getPattern(t.from.toString()),i=this.imageManager.getPattern(t.to.toString());return !e||!i}useProgram(t,e){this.cache=this.cache||{};const i=t+(e?e.cacheKey:"")+(this._showOverdrawInspector?"/overdraw":"")+(this.style.map.terrain?"/terrain":"");return this.cache[i]||(this.cache[i]=new xe(this.context,pe[t],e,We[t],this._showOverdrawInspector,this.style.map.terrain)),this.cache[i]}setCustomLayerDefaults(){this.context.unbindVAO(),this.context.cullFace.setDefault(),this.context.activeTexture.setDefault(),this.context.pixelStoreUnpack.setDefault(),this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.context.pixelStoreUnpackFlipY.setDefault();}setBaseState(){const t=this.context.gl;this.context.cullFace.set(!1),this.context.viewport.set([0,0,this.width,this.height]),this.context.blendEquation.set(t.FUNC_ADD);}initDebugOverlayCanvas(){null==this.debugOverlayCanvas&&(this.debugOverlayCanvas=document.createElement("canvas"),this.debugOverlayCanvas.width=512,this.debugOverlayCanvas.height=512,this.debugOverlayTexture=new b(this.context,this.debugOverlayCanvas,this.context.gl.RGBA));}destroy(){this.debugOverlayTexture&&this.debugOverlayTexture.destroy();}overLimit(){const{drawingBufferWidth:t,drawingBufferHeight:e}=this.context.gl;return this.width!==t||this.height!==e}}class xa{constructor(t,e){this.points=t,this.planes=e;}static fromInvProjectionMatrix(t,i,a){const s=Math.pow(2,a),o=[[-1,1,-1,1],[1,1,-1,1],[1,-1,-1,1],[-1,-1,-1,1],[-1,1,1,1],[1,1,1,1],[1,-1,1,1],[-1,-1,1,1]].map((a=>{const o=1/(a=e.af([],a,t))[3]/i*s;return e.b1(a,a,[o,o,1/a[3],o])})),r=[[0,1,2],[6,5,4],[0,3,7],[2,1,5],[3,2,6],[0,4,5]].map((t=>{const e=function(t,e){var i=e[0],a=e[1],s=e[2],o=i*i+a*a+s*s;return o>0&&(o=1/Math.sqrt(o)),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o,t}([],function(t,e,i){var a=e[0],s=e[1],o=e[2],r=i[0],n=i[1],l=i[2];return t[0]=s*l-o*n,t[1]=o*r-a*l,t[2]=a*n-s*r,t}([],g([],o[t[0]],o[t[1]]),g([],o[t[2]],o[t[1]]))),i=-((a=e)[0]*(s=o[t[1]])[0]+a[1]*s[1]+a[2]*s[2]);var a,s;return e.concat(i)}));return new xa(o,r)}}class ya{constructor(t,e){this.min=t,this.max=e,this.center=function(t,e,i){return t[0]=.5*e[0],t[1]=.5*e[1],t[2]=.5*e[2],t}([],function(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t[2]=e[2]+i[2],t}([],this.min,this.max));}quadrant(t){const e=[t%2==0,t<2],i=m(this.min),a=m(this.max);for(let t=0;t<e.length;t++)i[t]=e[t]?this.min[t]:this.center[t],a[t]=e[t]?this.center[t]:this.max[t];return a[2]=this.max[2],new ya(i,a)}distanceX(t){return Math.max(Math.min(this.max[0],t[0]),this.min[0])-t[0]}distanceY(t){return Math.max(Math.min(this.max[1],t[1]),this.min[1])-t[1]}intersects(t){const i=[[this.min[0],this.min[1],this.min[2],1],[this.max[0],this.min[1],this.min[2],1],[this.max[0],this.max[1],this.min[2],1],[this.min[0],this.max[1],this.min[2],1],[this.min[0],this.min[1],this.max[2],1],[this.max[0],this.min[1],this.max[2],1],[this.max[0],this.max[1],this.max[2],1],[this.min[0],this.max[1],this.max[2],1]];let a=!0;for(let s=0;s<t.planes.length;s++){const o=t.planes[s];let r=0;for(let t=0;t<i.length;t++)e.b2(o,i[t])>=0&&r++;if(0===r)return 0;r!==i.length&&(a=!1);}if(a)return 2;for(let e=0;e<3;e++){let i=Number.MAX_VALUE,a=-Number.MAX_VALUE;for(let s=0;s<t.points.length;s++){const o=t.points[s][e]-this.min[e];i=Math.min(i,o),a=Math.max(a,o);}if(a<0||i>this.max[e]-this.min[e])return 0}return 1}}class ba{constructor(t=0,e=0,i=0,a=0){if(isNaN(t)||t<0||isNaN(e)||e<0||isNaN(i)||i<0||isNaN(a)||a<0)throw new Error("Invalid value for edge-insets, top, bottom, left and right must all be numbers");this.top=t,this.bottom=e,this.left=i,this.right=a;}interpolate(t,i,a){return null!=i.top&&null!=t.top&&(this.top=e.y.number(t.top,i.top,a)),null!=i.bottom&&null!=t.bottom&&(this.bottom=e.y.number(t.bottom,i.bottom,a)),null!=i.left&&null!=t.left&&(this.left=e.y.number(t.left,i.left,a)),null!=i.right&&null!=t.right&&(this.right=e.y.number(t.right,i.right,a)),this}getCenter(t,i){const a=e.ac((this.left+t-this.right)/2,0,t),s=e.ac((this.top+i-this.bottom)/2,0,i);return new e.P(a,s)}equals(t){return this.top===t.top&&this.bottom===t.bottom&&this.left===t.left&&this.right===t.right}clone(){return new ba(this.top,this.bottom,this.left,this.right)}toJSON(){return {top:this.top,bottom:this.bottom,left:this.left,right:this.right}}}const wa=85.051129;class Ta{constructor(t,i,a,s,o){this.tileSize=512,this._renderWorldCopies=void 0===o||!!o,this._minZoom=t||0,this._maxZoom=i||22,this._minPitch=null==a?0:a,this._maxPitch=null==s?60:s,this.setMaxBounds(),this.width=0,this.height=0,this._center=new e.N(0,0),this._elevation=0,this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0,this._edgeInsets=new ba,this._posMatrixCache={},this._alignedPosMatrixCache={},this._fogMatrixCache={},this.minElevationForCurrentTile=0;}clone(){const t=new Ta(this._minZoom,this._maxZoom,this._minPitch,this.maxPitch,this._renderWorldCopies);return t.apply(this),t}apply(t){this.tileSize=t.tileSize,this.latRange=t.latRange,this.lngRange=t.lngRange,this.width=t.width,this.height=t.height,this._center=t._center,this._elevation=t._elevation,this.minElevationForCurrentTile=t.minElevationForCurrentTile,this.zoom=t.zoom,this.angle=t.angle,this._fov=t._fov,this._pitch=t._pitch,this._unmodified=t._unmodified,this._edgeInsets=t._edgeInsets.clone(),this._calcMatrices();}get minZoom(){return this._minZoom}set minZoom(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t));}get maxZoom(){return this._maxZoom}set maxZoom(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t));}get minPitch(){return this._minPitch}set minPitch(t){this._minPitch!==t&&(this._minPitch=t,this.pitch=Math.max(this.pitch,t));}get maxPitch(){return this._maxPitch}set maxPitch(t){this._maxPitch!==t&&(this._maxPitch=t,this.pitch=Math.min(this.pitch,t));}get renderWorldCopies(){return this._renderWorldCopies}set renderWorldCopies(t){void 0===t?t=!0:null===t&&(t=!1),this._renderWorldCopies=t;}get worldSize(){return this.tileSize*this.scale}get centerOffset(){return this.centerPoint._sub(this.size._div(2))}get size(){return new e.P(this.width,this.height)}get bearing(){return -this.angle/Math.PI*180}set bearing(t){const i=-e.b3(t,-180,180)*Math.PI/180;this.angle!==i&&(this._unmodified=!1,this.angle=i,this._calcMatrices(),this.rotationMatrix=function(){var t=new e.A(4);return e.A!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t}(),function(t,e,i){var a=e[0],s=e[1],o=e[2],r=e[3],n=Math.sin(i),l=Math.cos(i);t[0]=a*l+o*n,t[1]=s*l+r*n,t[2]=a*-n+o*l,t[3]=s*-n+r*l;}(this.rotationMatrix,this.rotationMatrix,this.angle));}get pitch(){return this._pitch/Math.PI*180}set pitch(t){const i=e.ac(t,this.minPitch,this.maxPitch)/180*Math.PI;this._pitch!==i&&(this._unmodified=!1,this._pitch=i,this._calcMatrices());}get fov(){return this._fov/Math.PI*180}set fov(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices());}get zoom(){return this._zoom}set zoom(t){const e=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==e&&(this._unmodified=!1,this._zoom=e,this.tileZoom=Math.max(0,Math.floor(e)),this.scale=this.zoomScale(e),this._constrain(),this._calcMatrices());}get center(){return this._center}set center(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices());}get elevation(){return this._elevation}set elevation(t){t!==this._elevation&&(this._elevation=t,this._constrain(),this._calcMatrices());}get padding(){return this._edgeInsets.toJSON()}set padding(t){this._edgeInsets.equals(t)||(this._unmodified=!1,this._edgeInsets.interpolate(this._edgeInsets,t,1),this._calcMatrices());}get centerPoint(){return this._edgeInsets.getCenter(this.width,this.height)}isPaddingEqual(t){return this._edgeInsets.equals(t)}interpolatePadding(t,e,i){this._unmodified=!1,this._edgeInsets.interpolate(t,e,i),this._constrain(),this._calcMatrices();}coveringZoomLevel(t){const e=(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize));return Math.max(0,e)}getVisibleUnwrappedCoordinates(t){const i=[new e.b4(0,t)];if(this._renderWorldCopies){const a=this.pointCoordinate(new e.P(0,0)),s=this.pointCoordinate(new e.P(this.width,0)),o=this.pointCoordinate(new e.P(this.width,this.height)),r=this.pointCoordinate(new e.P(0,this.height)),n=Math.floor(Math.min(a.x,s.x,o.x,r.x)),l=Math.floor(Math.max(a.x,s.x,o.x,r.x)),h=1;for(let a=n-h;a<=l+h;a++)0!==a&&i.push(new e.b4(a,t));}return i}coveringTiles(t){var i,a;let s=this.coveringZoomLevel(t);const o=s;if(void 0!==t.minzoom&&s<t.minzoom)return [];void 0!==t.maxzoom&&s>t.maxzoom&&(s=t.maxzoom);const r=this.pointCoordinate(this.getCameraPoint()),n=e.Z.fromLngLat(this.center),l=Math.pow(2,s),h=[l*r.x,l*r.y,0],c=[l*n.x,l*n.y,0],u=xa.fromInvProjectionMatrix(this.invModelViewProjectionMatrix,this.worldSize,s);let d=t.minzoom||0;!t.terrain&&this.pitch<=60&&this._edgeInsets.top<.1&&(d=s);const _=t.terrain?2/Math.min(this.tileSize,t.tileSize)*this.tileSize:3,p=t=>({aabb:new ya([t*l,0,0],[(t+1)*l,l,0]),zoom:0,x:0,y:0,wrap:t,fullyVisible:!1}),m=[],f=[],g=s,x=t.reparseOverscaled?o:s;if(this._renderWorldCopies)for(let t=1;t<=3;t++)m.push(p(-t)),m.push(p(t));for(m.push(p(0));m.length>0;){const s=m.pop(),o=s.x,r=s.y;let n=s.fullyVisible;if(!n){const t=s.aabb.intersects(u);if(0===t)continue;n=2===t;}const l=t.terrain?h:c,p=s.aabb.distanceX(l),y=s.aabb.distanceY(l),b=Math.max(Math.abs(p),Math.abs(y));if(s.zoom===g||b>_+(1<<g-s.zoom)-2&&s.zoom>=d){const t=g-s.zoom,i=h[0]-.5-(o<<t),a=h[1]-.5-(r<<t);f.push({tileID:new e.S(s.zoom===g?x:s.zoom,s.wrap,s.zoom,o,r),distanceSq:v([c[0]-.5-o,c[1]-.5-r]),tileDistanceToCamera:Math.sqrt(i*i+a*a)});}else for(let l=0;l<4;l++){const h=(o<<1)+l%2,c=(r<<1)+(l>>1),u=s.zoom+1;let d=s.aabb.quadrant(l);if(t.terrain){const o=new e.S(u,s.wrap,u,h,c),r=t.terrain.getMinMaxElevation(o),n=null!==(i=r.minElevation)&&void 0!==i?i:this.elevation,l=null!==(a=r.maxElevation)&&void 0!==a?a:this.elevation;d=new ya([d.min[0],d.min[1],n],[d.max[0],d.max[1],l]);}m.push({aabb:d,zoom:u,x:h,y:c,wrap:s.wrap,fullyVisible:n});}}return f.sort(((t,e)=>t.distanceSq-e.distanceSq)).map((t=>t.tileID))}resize(t,e){this.width=t,this.height=e,this.pixelsToGLUnits=[2/t,-2/e],this._constrain(),this._calcMatrices();}get unmodified(){return this._unmodified}zoomScale(t){return Math.pow(2,t)}scaleZoom(t){return Math.log(t)/Math.LN2}project(t){const i=e.ac(t.lat,-85.051129,wa);return new e.P(e.O(t.lng)*this.worldSize,e.Q(i)*this.worldSize)}unproject(t){return new e.Z(t.x/this.worldSize,t.y/this.worldSize).toLngLat()}get point(){return this.project(this.center)}getCameraPosition(){return {lngLat:this.pointLocation(this.getCameraPoint()),altitude:Math.cos(this._pitch)*this.cameraToCenterDistance/this._pixelPerMeter+this.elevation}}recalculateZoom(t){const i=this.elevation,a=Math.cos(this._pitch)*this.cameraToCenterDistance/this._pixelPerMeter,s=this.pointLocation(this.centerPoint,t),o=t.getElevationForLngLatZoom(s,this.tileZoom);if(!(this.elevation-o))return;const r=a+i-o,n=Math.cos(this._pitch)*this.cameraToCenterDistance/r/e.b5(1,s.lat),l=this.scaleZoom(n/this.tileSize);this._elevation=o,this._center=s,this.zoom=l;}setLocationAtPoint(t,i){const a=this.pointCoordinate(i),s=this.pointCoordinate(this.centerPoint),o=this.locationCoordinate(t),r=new e.Z(o.x-(a.x-s.x),o.y-(a.y-s.y));this.center=this.coordinateLocation(r),this._renderWorldCopies&&(this.center=this.center.wrap());}locationPoint(t,e){return e?this.coordinatePoint(this.locationCoordinate(t),e.getElevationForLngLatZoom(t,this.tileZoom),this.pixelMatrix3D):this.coordinatePoint(this.locationCoordinate(t))}pointLocation(t,e){return this.coordinateLocation(this.pointCoordinate(t,e))}locationCoordinate(t){return e.Z.fromLngLat(t)}coordinateLocation(t){return t&&t.toLngLat()}pointCoordinate(t,i){if(i){const e=i.pointCoordinate(t);if(null!=e)return e}const a=[t.x,t.y,0,1],s=[t.x,t.y,1,1];e.af(a,a,this.pixelMatrixInverse),e.af(s,s,this.pixelMatrixInverse);const o=a[3],r=s[3],n=a[1]/o,l=s[1]/r,h=a[2]/o,c=s[2]/r,u=h===c?0:(0-h)/(c-h);return new e.Z(e.y.number(a[0]/o,s[0]/r,u)/this.worldSize,e.y.number(n,l,u)/this.worldSize)}coordinatePoint(t,i=0,a=this.pixelMatrix){const s=[t.x*this.worldSize,t.y*this.worldSize,i,1];return e.af(s,s,a),new e.P(s[0]/s[3],s[1]/s[3])}getBounds(){const t=Math.max(0,this.height/2-this.getHorizon());return (new H).extend(this.pointLocation(new e.P(0,t))).extend(this.pointLocation(new e.P(this.width,t))).extend(this.pointLocation(new e.P(this.width,this.height))).extend(this.pointLocation(new e.P(0,this.height)))}getMaxBounds(){return this.latRange&&2===this.latRange.length&&this.lngRange&&2===this.lngRange.length?new H([this.lngRange[0],this.latRange[0]],[this.lngRange[1],this.latRange[1]]):null}getHorizon(){return Math.tan(Math.PI/2-this._pitch)*this.cameraToCenterDistance*.85}setMaxBounds(t){t?(this.lngRange=[t.getWest(),t.getEast()],this.latRange=[t.getSouth(),t.getNorth()],this._constrain()):(this.lngRange=null,this.latRange=[-85.051129,wa]);}calculateTileMatrix(t){const i=t.canonical,a=this.worldSize/this.zoomScale(i.z),s=i.x+Math.pow(2,i.z)*t.wrap,o=e.an(new Float64Array(16));return e.J(o,o,[s*a,i.y*a,0]),e.K(o,o,[a/e.X,a/e.X,1]),o}calculatePosMatrix(t,i=!1){const a=t.key,s=i?this._alignedPosMatrixCache:this._posMatrixCache;if(s[a])return s[a];const o=this.calculateTileMatrix(t);return e.L(o,i?this.alignedModelViewProjectionMatrix:this.modelViewProjectionMatrix,o),s[a]=new Float32Array(o),s[a]}calculateFogMatrix(t){const i=t.key,a=this._fogMatrixCache;if(a[i])return a[i];const s=this.calculateTileMatrix(t);return e.L(s,this.fogMatrix,s),a[i]=new Float32Array(s),a[i]}customLayerMatrix(){return this.mercatorMatrix.slice()}getConstrained(t,i){i=e.ac(+i,this.minZoom,this.maxZoom);const a={center:new e.N(t.lng,t.lat),zoom:i};let s=this.lngRange;if(!this._renderWorldCopies&&null===s){const t=180-1e-10;s=[-t,t];}const o=this.tileSize*this.zoomScale(a.zoom);let r=0,n=o,l=0,h=o,c=0,u=0;const{x:d,y:_}=this.size;if(this.latRange){const t=this.latRange;r=e.Q(t[1])*o,n=e.Q(t[0])*o,n-r<_&&(c=_/(n-r));}s&&(l=e.b3(e.O(s[0])*o,0,o),h=e.b3(e.O(s[1])*o,0,o),h<l&&(h+=o),h-l<d&&(u=d/(h-l)));const{x:p,y:m}=this.project.call({worldSize:o},t);let f,g;const v=Math.max(u||0,c||0);if(v){const t=new e.P(u?(h+l)/2:p,c?(n+r)/2:m);return a.center=this.unproject.call({worldSize:o},t).wrap(),a.zoom+=this.scaleZoom(v),a}if(this.latRange){const t=_/2;m-t<r&&(g=r+t),m+t>n&&(g=n-t);}if(s){const t=(l+h)/2;let i=p;this._renderWorldCopies&&(i=e.b3(p,t-o/2,t+o/2));const a=d/2;i-a<l&&(f=l+a),i+a>h&&(f=h-a);}if(void 0!==f||void 0!==g){const t=new e.P(null!=f?f:p,null!=g?g:m);a.center=this.unproject.call({worldSize:o},t).wrap();}return a}_constrain(){if(!this.center||!this.width||!this.height||this._constraining)return;this._constraining=!0;const t=this._unmodified,{center:e,zoom:i}=this.getConstrained(this.center,this.zoom);this.center=e,this.zoom=i,this._unmodified=t,this._constraining=!1;}_calcMatrices(){if(!this.height)return;const t=this.centerOffset,i=this.point.x,a=this.point.y;this.cameraToCenterDistance=.5/Math.tan(this._fov/2)*this.height,this._pixelPerMeter=e.b5(1,this.center.lat)*this.worldSize;let s=e.an(new Float64Array(16));e.K(s,s,[this.width/2,-this.height/2,1]),e.J(s,s,[1,-1,0]),this.labelPlaneMatrix=s,s=e.an(new Float64Array(16)),e.K(s,s,[1,-1,1]),e.J(s,s,[-1,-1,0]),e.K(s,s,[2/this.width,2/this.height,1]),this.glCoordMatrix=s;const o=this.cameraToCenterDistance+this._elevation*this._pixelPerMeter/Math.cos(this._pitch),r=Math.min(this.elevation,this.minElevationForCurrentTile),n=o-r*this._pixelPerMeter/Math.cos(this._pitch),l=r<0?n:o,h=Math.PI/2+this._pitch,c=this._fov*(.5+t.y/this.height),u=Math.sin(c)*l/Math.sin(e.ac(Math.PI-h-c,.01,Math.PI-.01)),d=this.getHorizon(),_=2*Math.atan(d/this.cameraToCenterDistance)*(.5+t.y/(2*d)),p=Math.sin(_)*l/Math.sin(e.ac(Math.PI-h-_,.01,Math.PI-.01)),m=Math.min(u,p);this.farZ=1.01*(Math.cos(Math.PI/2-this._pitch)*m+l),this.nearZ=this.height/50,s=new Float64Array(16),e.b6(s,this._fov,this.width/this.height,this.nearZ,this.farZ),s[8]=2*-t.x/this.width,s[9]=2*t.y/this.height,this.projectionMatrix=e.ae(s),e.K(s,s,[1,-1,1]),e.J(s,s,[0,0,-this.cameraToCenterDistance]),e.b7(s,s,this._pitch),e.ad(s,s,this.angle),e.J(s,s,[-i,-a,0]),this.mercatorMatrix=e.K([],s,[this.worldSize,this.worldSize,this.worldSize]),e.K(s,s,[1,1,this._pixelPerMeter]),this.pixelMatrix=e.L(new Float64Array(16),this.labelPlaneMatrix,s),e.J(s,s,[0,0,-this.elevation]),this.modelViewProjectionMatrix=s,this.invModelViewProjectionMatrix=e.as([],s),this.fogMatrix=new Float64Array(16),e.b6(this.fogMatrix,this._fov,this.width/this.height,o,this.farZ),this.fogMatrix[8]=2*-t.x/this.width,this.fogMatrix[9]=2*t.y/this.height,e.K(this.fogMatrix,this.fogMatrix,[1,-1,1]),e.J(this.fogMatrix,this.fogMatrix,[0,0,-this.cameraToCenterDistance]),e.b7(this.fogMatrix,this.fogMatrix,this._pitch),e.ad(this.fogMatrix,this.fogMatrix,this.angle),e.J(this.fogMatrix,this.fogMatrix,[-i,-a,0]),e.K(this.fogMatrix,this.fogMatrix,[1,1,this._pixelPerMeter]),e.J(this.fogMatrix,this.fogMatrix,[0,0,-this.elevation]),this.pixelMatrix3D=e.L(new Float64Array(16),this.labelPlaneMatrix,s);const f=this.width%2/2,g=this.height%2/2,v=Math.cos(this.angle),x=Math.sin(this.angle),y=i-Math.round(i)+v*f+x*g,b=a-Math.round(a)+v*g+x*f,w=new Float64Array(s);if(e.J(w,w,[y>.5?y-1:y,b>.5?b-1:b,0]),this.alignedModelViewProjectionMatrix=w,s=e.as(new Float64Array(16),this.pixelMatrix),!s)throw new Error("failed to invert matrix");this.pixelMatrixInverse=s,this._posMatrixCache={},this._alignedPosMatrixCache={},this._fogMatrixCache={};}maxPitchScaleFactor(){if(!this.pixelMatrixInverse)return 1;const t=this.pointCoordinate(new e.P(0,0)),i=[t.x*this.worldSize,t.y*this.worldSize,0,1];return e.af(i,i,this.pixelMatrix)[3]/this.cameraToCenterDistance}getCameraPoint(){const t=Math.tan(this._pitch)*(this.cameraToCenterDistance||1);return this.centerPoint.add(new e.P(0,t))}getCameraQueryGeometry(t){const i=this.getCameraPoint();if(1===t.length)return [t[0],i];{let a=i.x,s=i.y,o=i.x,r=i.y;for(const e of t)a=Math.min(a,e.x),s=Math.min(s,e.y),o=Math.max(o,e.x),r=Math.max(r,e.y);return [new e.P(a,s),new e.P(o,s),new e.P(o,r),new e.P(a,r),new e.P(a,s)]}}lngLatToCameraDepth(t,i){const a=this.locationCoordinate(t),s=[a.x*this.worldSize,a.y*this.worldSize,i,1];return e.af(s,s,this.modelViewProjectionMatrix),s[2]/s[3]}}function Ia(t,e){let i,a=!1,s=null,o=null;const r=()=>{s=null,a&&(t.apply(o,i),s=setTimeout(r,e),a=!1);};return (...t)=>(a=!0,o=this,i=t,s||r(),s)}class Ea{constructor(t){this._getCurrentHash=()=>{const t=window.location.hash.replace("#","");if(this._hashName){let e;return t.split("&").map((t=>t.split("="))).forEach((t=>{t[0]===this._hashName&&(e=t);})),(e&&e[1]||"").split("/")}return t.split("/")},this._onHashChange=()=>{const t=this._getCurrentHash();if(t.length>=3&&!t.some((t=>isNaN(t)))){const e=this._map.dragRotate.isEnabled()&&this._map.touchZoomRotate.isEnabled()?+(t[3]||0):this._map.getBearing();return this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:e,pitch:+(t[4]||0)}),!0}return !1},this._updateHashUnthrottled=()=>{const t=window.location.href.replace(/(#.*)?$/,this.getHashString());window.history.replaceState(window.history.state,null,t);},this._removeHash=()=>{const t=this._getCurrentHash();if(0===t.length)return;const e=t.join("/");let i=e;i.split("&").length>0&&(i=i.split("&")[0]),this._hashName&&(i=`${this._hashName}=${e}`);let a=window.location.hash.replace(i,"");a.startsWith("#&")?a=a.slice(0,1)+a.slice(2):"#"===a&&(a="");let s=window.location.href.replace(/(#.+)?$/,a);s=s.replace("&&","&"),window.history.replaceState(window.history.state,null,s);},this._updateHash=Ia(this._updateHashUnthrottled,300),this._hashName=t&&encodeURIComponent(t);}addTo(t){return this._map=t,addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this}remove(){return removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),clearTimeout(this._updateHash()),this._removeHash(),delete this._map,this}getHashString(t){const e=this._map.getCenter(),i=Math.round(100*this._map.getZoom())/100,a=Math.ceil((i*Math.LN2+Math.log(512/360/.5))/Math.LN10),s=Math.pow(10,a),o=Math.round(e.lng*s)/s,r=Math.round(e.lat*s)/s,n=this._map.getBearing(),l=this._map.getPitch();let h="";if(h+=t?`/${o}/${r}/${i}`:`${i}/${r}/${o}`,(n||l)&&(h+="/"+Math.round(10*n)/10),l&&(h+=`/${Math.round(l)}`),this._hashName){const t=this._hashName;let e=!1;const i=window.location.hash.slice(1).split("&").map((i=>{const a=i.split("=")[0];return a===t?(e=!0,`${a}=${h}`):i})).filter((t=>t));return e||i.push(`${t}=${h}`),`#${i.join("&")}`}return `#${h}`}}const Pa={linearity:.3,easing:e.b8(0,0,.3,1)},Ca=e.e({deceleration:2500,maxSpeed:1400},Pa),Sa=e.e({deceleration:20,maxSpeed:1400},Pa),za=e.e({deceleration:1e3,maxSpeed:360},Pa),Da=e.e({deceleration:1e3,maxSpeed:90},Pa);class Ma{constructor(t){this._map=t,this.clear();}clear(){this._inertiaBuffer=[];}record(t){this._drainInertiaBuffer(),this._inertiaBuffer.push({time:o.now(),settings:t});}_drainInertiaBuffer(){const t=this._inertiaBuffer,e=o.now();for(;t.length>0&&e-t[0].time>160;)t.shift();}_onMoveEnd(t){if(this._drainInertiaBuffer(),this._inertiaBuffer.length<2)return;const i={zoom:0,bearing:0,pitch:0,pan:new e.P(0,0),pinchAround:void 0,around:void 0};for(const{settings:t}of this._inertiaBuffer)i.zoom+=t.zoomDelta||0,i.bearing+=t.bearingDelta||0,i.pitch+=t.pitchDelta||0,t.panDelta&&i.pan._add(t.panDelta),t.around&&(i.around=t.around),t.pinchAround&&(i.pinchAround=t.pinchAround);const a=this._inertiaBuffer[this._inertiaBuffer.length-1].time-this._inertiaBuffer[0].time,s={};if(i.pan.mag()){const o=Ra(i.pan.mag(),a,e.e({},Ca,t||{}));s.offset=i.pan.mult(o.amount/i.pan.mag()),s.center=this._map.transform.center,Aa(s,o);}if(i.zoom){const t=Ra(i.zoom,a,Sa);s.zoom=this._map.transform.zoom+t.amount,Aa(s,t);}if(i.bearing){const t=Ra(i.bearing,a,za);s.bearing=this._map.transform.bearing+e.ac(t.amount,-179,179),Aa(s,t);}if(i.pitch){const t=Ra(i.pitch,a,Da);s.pitch=this._map.transform.pitch+t.amount,Aa(s,t);}if(s.zoom||s.bearing){const t=void 0===i.pinchAround?i.around:i.pinchAround;s.around=t?this._map.unproject(t):this._map.getCenter();}return this.clear(),e.e(s,{noMoveStart:!0})}}function Aa(t,e){(!t.duration||t.duration<e.duration)&&(t.duration=e.duration,t.easing=e.easing);}function Ra(t,i,a){const{maxSpeed:s,linearity:o,deceleration:r}=a,n=e.ac(t*o/(i/1e3),-s,s),l=Math.abs(n)/(r*o);return {easing:a.easing,duration:1e3*l,amount:n*(l/2)}}class ka extends e.k{preventDefault(){this._defaultPrevented=!0;}get defaultPrevented(){return this._defaultPrevented}constructor(t,i,a,s={}){const o=r.mousePos(i.getCanvas(),a),n=i.unproject(o);super(t,e.e({point:o,lngLat:n,originalEvent:a},s)),this._defaultPrevented=!1,this.target=i;}}class La extends e.k{preventDefault(){this._defaultPrevented=!0;}get defaultPrevented(){return this._defaultPrevented}constructor(t,i,a){const s="touchend"===t?a.changedTouches:a.touches,o=r.touchPos(i.getCanvasContainer(),s),n=o.map((t=>i.unproject(t))),l=o.reduce(((t,e,i,a)=>t.add(e.div(a.length))),new e.P(0,0));super(t,{points:o,point:l,lngLats:n,lngLat:i.unproject(l),originalEvent:a}),this._defaultPrevented=!1;}}class Fa extends e.k{preventDefault(){this._defaultPrevented=!0;}get defaultPrevented(){return this._defaultPrevented}constructor(t,e,i){super(t,{originalEvent:i}),this._defaultPrevented=!1;}}class Ba{constructor(t,e){this._map=t,this._clickTolerance=e.clickTolerance;}reset(){delete this._mousedownPos;}wheel(t){return this._firePreventable(new Fa(t.type,this._map,t))}mousedown(t,e){return this._mousedownPos=e,this._firePreventable(new ka(t.type,this._map,t))}mouseup(t){this._map.fire(new ka(t.type,this._map,t));}click(t,e){this._mousedownPos&&this._mousedownPos.dist(e)>=this._clickTolerance||this._map.fire(new ka(t.type,this._map,t));}dblclick(t){return this._firePreventable(new ka(t.type,this._map,t))}mouseover(t){this._map.fire(new ka(t.type,this._map,t));}mouseout(t){this._map.fire(new ka(t.type,this._map,t));}touchstart(t){return this._firePreventable(new La(t.type,this._map,t))}touchmove(t){this._map.fire(new La(t.type,this._map,t));}touchend(t){this._map.fire(new La(t.type,this._map,t));}touchcancel(t){this._map.fire(new La(t.type,this._map,t));}_firePreventable(t){if(this._map.fire(t),t.defaultPrevented)return {}}isEnabled(){return !0}isActive(){return !1}enable(){}disable(){}}class Oa{constructor(t){this._map=t;}reset(){this._delayContextMenu=!1,this._ignoreContextMenu=!0,delete this._contextMenuEvent;}mousemove(t){this._map.fire(new ka(t.type,this._map,t));}mousedown(){this._delayContextMenu=!0,this._ignoreContextMenu=!1;}mouseup(){this._delayContextMenu=!1,this._contextMenuEvent&&(this._map.fire(new ka("contextmenu",this._map,this._contextMenuEvent)),delete this._contextMenuEvent);}contextmenu(t){this._delayContextMenu?this._contextMenuEvent=t:this._ignoreContextMenu||this._map.fire(new ka(t.type,this._map,t)),this._map.listens("contextmenu")&&t.preventDefault();}isEnabled(){return !0}isActive(){return !1}enable(){}disable(){}}class Na{constructor(t){this._map=t;}get transform(){return this._map._requestedCameraState||this._map.transform}get center(){return {lng:this.transform.center.lng,lat:this.transform.center.lat}}get zoom(){return this.transform.zoom}get pitch(){return this.transform.pitch}get bearing(){return this.transform.bearing}unproject(t){return this.transform.pointLocation(e.P.convert(t),this._map.terrain)}}class Ua{constructor(t,e){this._map=t,this._tr=new Na(t),this._el=t.getCanvasContainer(),this._container=t.getContainer(),this._clickTolerance=e.clickTolerance||1;}isEnabled(){return !!this._enabled}isActive(){return !!this._active}enable(){this.isEnabled()||(this._enabled=!0);}disable(){this.isEnabled()&&(this._enabled=!1);}mousedown(t,e){this.isEnabled()&&t.shiftKey&&0===t.button&&(r.disableDrag(),this._startPos=this._lastPos=e,this._active=!0);}mousemoveWindow(t,e){if(!this._active)return;const i=e;if(this._lastPos.equals(i)||!this._box&&i.dist(this._startPos)<this._clickTolerance)return;const a=this._startPos;this._lastPos=i,this._box||(this._box=r.create("div","maplibregl-boxzoom",this._container),this._container.classList.add("maplibregl-crosshair"),this._fireEvent("boxzoomstart",t));const s=Math.min(a.x,i.x),o=Math.max(a.x,i.x),n=Math.min(a.y,i.y),l=Math.max(a.y,i.y);r.setTransform(this._box,`translate(${s}px,${n}px)`),this._box.style.width=o-s+"px",this._box.style.height=l-n+"px";}mouseupWindow(t,i){if(!this._active)return;if(0!==t.button)return;const a=this._startPos,s=i;if(this.reset(),r.suppressClick(),a.x!==s.x||a.y!==s.y)return this._map.fire(new e.k("boxzoomend",{originalEvent:t})),{cameraAnimation:t=>t.fitScreenCoordinates(a,s,this._tr.bearing,{linear:!0})};this._fireEvent("boxzoomcancel",t);}keydown(t){this._active&&27===t.keyCode&&(this.reset(),this._fireEvent("boxzoomcancel",t));}reset(){this._active=!1,this._container.classList.remove("maplibregl-crosshair"),this._box&&(r.remove(this._box),this._box=null),r.enableDrag(),delete this._startPos,delete this._lastPos;}_fireEvent(t,i){return this._map.fire(new e.k(t,{originalEvent:i}))}}function ja(t,e){if(t.length!==e.length)throw new Error(`The number of touches and points are not equal - touches ${t.length}, points ${e.length}`);const i={};for(let a=0;a<t.length;a++)i[t[a].identifier]=e[a];return i}class Za{constructor(t){this.reset(),this.numTouches=t.numTouches;}reset(){delete this.centroid,delete this.startTime,delete this.touches,this.aborted=!1;}touchstart(t,i,a){(this.centroid||a.length>this.numTouches)&&(this.aborted=!0),this.aborted||(void 0===this.startTime&&(this.startTime=t.timeStamp),a.length===this.numTouches&&(this.centroid=function(t){const i=new e.P(0,0);for(const e of t)i._add(e);return i.div(t.length)}(i),this.touches=ja(a,i)));}touchmove(t,e,i){if(this.aborted||!this.centroid)return;const a=ja(i,e);for(const t in this.touches){const e=a[t];(!e||e.dist(this.touches[t])>30)&&(this.aborted=!0);}}touchend(t,e,i){if((!this.centroid||t.timeStamp-this.startTime>500)&&(this.aborted=!0),0===i.length){const t=!this.aborted&&this.centroid;if(this.reset(),t)return t}}}class qa{constructor(t){this.singleTap=new Za(t),this.numTaps=t.numTaps,this.reset();}reset(){this.lastTime=1/0,delete this.lastTap,this.count=0,this.singleTap.reset();}touchstart(t,e,i){this.singleTap.touchstart(t,e,i);}touchmove(t,e,i){this.singleTap.touchmove(t,e,i);}touchend(t,e,i){const a=this.singleTap.touchend(t,e,i);if(a){const e=t.timeStamp-this.lastTime<500,i=!this.lastTap||this.lastTap.dist(a)<30;if(e&&i||this.reset(),this.count++,this.lastTime=t.timeStamp,this.lastTap=a,this.count===this.numTaps)return this.reset(),a}}}class Va{constructor(t){this._tr=new Na(t),this._zoomIn=new qa({numTouches:1,numTaps:2}),this._zoomOut=new qa({numTouches:2,numTaps:1}),this.reset();}reset(){this._active=!1,this._zoomIn.reset(),this._zoomOut.reset();}touchstart(t,e,i){this._zoomIn.touchstart(t,e,i),this._zoomOut.touchstart(t,e,i);}touchmove(t,e,i){this._zoomIn.touchmove(t,e,i),this._zoomOut.touchmove(t,e,i);}touchend(t,e,i){const a=this._zoomIn.touchend(t,e,i),s=this._zoomOut.touchend(t,e,i),o=this._tr;return a?(this._active=!0,t.preventDefault(),setTimeout((()=>this.reset()),0),{cameraAnimation:e=>e.easeTo({duration:300,zoom:o.zoom+1,around:o.unproject(a)},{originalEvent:t})}):s?(this._active=!0,t.preventDefault(),setTimeout((()=>this.reset()),0),{cameraAnimation:e=>e.easeTo({duration:300,zoom:o.zoom-1,around:o.unproject(s)},{originalEvent:t})}):void 0}touchcancel(){this.reset();}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class Ga{constructor(t){this._enabled=!!t.enable,this._moveStateManager=t.moveStateManager,this._clickTolerance=t.clickTolerance||1,this._moveFunction=t.move,this._activateOnStart=!!t.activateOnStart,t.assignEvents(this),this.reset();}reset(t){this._active=!1,this._moved=!1,delete this._lastPoint,this._moveStateManager.endMove(t);}_move(...t){const e=this._moveFunction(...t);if(e.bearingDelta||e.pitchDelta||e.around||e.panDelta)return this._active=!0,e}dragStart(t,e){this.isEnabled()&&!this._lastPoint&&this._moveStateManager.isValidStartEvent(t)&&(this._moveStateManager.startMove(t),this._lastPoint=e.length?e[0]:e,this._activateOnStart&&this._lastPoint&&(this._active=!0));}dragMove(t,e){if(!this.isEnabled())return;const i=this._lastPoint;if(!i)return;if(t.preventDefault(),!this._moveStateManager.isValidMoveEvent(t))return void this.reset(t);const a=e.length?e[0]:e;return !this._moved&&a.dist(i)<this._clickTolerance?void 0:(this._moved=!0,this._lastPoint=a,this._move(i,a))}dragEnd(t){this.isEnabled()&&this._lastPoint&&this._moveStateManager.isValidEndEvent(t)&&(this._moved&&r.suppressClick(),this.reset(t));}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}getClickTolerance(){return this._clickTolerance}}const Ha={0:1,2:2};class Wa{constructor(t){this._correctEvent=t.checkCorrectEvent;}startMove(t){const e=r.mouseButton(t);this._eventButton=e;}endMove(t){delete this._eventButton;}isValidStartEvent(t){return this._correctEvent(t)}isValidMoveEvent(t){return !function(t,e){const i=Ha[e];return void 0===t.buttons||(t.buttons&i)!==i}(t,this._eventButton)}isValidEndEvent(t){return r.mouseButton(t)===this._eventButton}}class $a{constructor(){this._firstTouch=void 0;}_isOneFingerTouch(t){return 1===t.targetTouches.length}_isSameTouchEvent(t){return t.targetTouches[0].identifier===this._firstTouch}startMove(t){this._firstTouch=t.targetTouches[0].identifier;}endMove(t){delete this._firstTouch;}isValidStartEvent(t){return this._isOneFingerTouch(t)}isValidMoveEvent(t){return this._isOneFingerTouch(t)&&this._isSameTouchEvent(t)}isValidEndEvent(t){return this._isOneFingerTouch(t)&&this._isSameTouchEvent(t)}}const Xa=t=>{t.mousedown=t.dragStart,t.mousemoveWindow=t.dragMove,t.mouseup=t.dragEnd,t.contextmenu=t=>{t.preventDefault();};},Ka=({enable:t,clickTolerance:e,bearingDegreesPerPixelMoved:i=.8})=>{const a=new Wa({checkCorrectEvent:t=>0===r.mouseButton(t)&&t.ctrlKey||2===r.mouseButton(t)});return new Ga({clickTolerance:e,move:(t,e)=>({bearingDelta:(e.x-t.x)*i}),moveStateManager:a,enable:t,assignEvents:Xa})},Ja=({enable:t,clickTolerance:e,pitchDegreesPerPixelMoved:i=-.5})=>{const a=new Wa({checkCorrectEvent:t=>0===r.mouseButton(t)&&t.ctrlKey||2===r.mouseButton(t)});return new Ga({clickTolerance:e,move:(t,e)=>({pitchDelta:(e.y-t.y)*i}),moveStateManager:a,enable:t,assignEvents:Xa})};class Ya{constructor(t,e){this._clickTolerance=t.clickTolerance||1,this._map=e,this.reset();}reset(){this._active=!1,this._touches={},this._sum=new e.P(0,0);}_shouldBePrevented(t){return t<(this._map.cooperativeGestures.isEnabled()?2:1)}touchstart(t,e,i){return this._calculateTransform(t,e,i)}touchmove(t,e,i){if(this._active){if(!this._shouldBePrevented(i.length))return t.preventDefault(),this._calculateTransform(t,e,i);this._map.cooperativeGestures.notifyGestureBlocked("touch_pan",t);}}touchend(t,e,i){this._calculateTransform(t,e,i),this._active&&this._shouldBePrevented(i.length)&&this.reset();}touchcancel(){this.reset();}_calculateTransform(t,i,a){a.length>0&&(this._active=!0);const s=ja(a,i),o=new e.P(0,0),r=new e.P(0,0);let n=0;for(const t in s){const e=s[t],i=this._touches[t];i&&(o._add(e),r._add(e.sub(i)),n++,s[t]=e);}if(this._touches=s,this._shouldBePrevented(n)||!r.mag())return;const l=r.div(n);return this._sum._add(l),this._sum.mag()<this._clickTolerance?void 0:{around:o.div(n),panDelta:l}}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class Qa{constructor(){this.reset();}reset(){this._active=!1,delete this._firstTwoTouches;}touchstart(t,e,i){this._firstTwoTouches||i.length<2||(this._firstTwoTouches=[i[0].identifier,i[1].identifier],this._start([e[0],e[1]]));}touchmove(t,e,i){if(!this._firstTwoTouches)return;t.preventDefault();const[a,s]=this._firstTwoTouches,o=ts(i,e,a),r=ts(i,e,s);if(!o||!r)return;const n=this._aroundCenter?null:o.add(r).div(2);return this._move([o,r],n,t)}touchend(t,e,i){if(!this._firstTwoTouches)return;const[a,s]=this._firstTwoTouches,o=ts(i,e,a),n=ts(i,e,s);o&&n||(this._active&&r.suppressClick(),this.reset());}touchcancel(){this.reset();}enable(t){this._enabled=!0,this._aroundCenter=!!t&&"center"===t.around;}disable(){this._enabled=!1,this.reset();}isEnabled(){return !!this._enabled}isActive(){return !!this._active}}function ts(t,e,i){for(let a=0;a<t.length;a++)if(t[a].identifier===i)return e[a]}function es(t,e){return Math.log(t/e)/Math.LN2}class is extends Qa{reset(){super.reset(),delete this._distance,delete this._startDistance;}_start(t){this._startDistance=this._distance=t[0].dist(t[1]);}_move(t,e){const i=this._distance;if(this._distance=t[0].dist(t[1]),this._active||!(Math.abs(es(this._distance,this._startDistance))<.1))return this._active=!0,{zoomDelta:es(this._distance,i),pinchAround:e}}}function as(t,e){return 180*t.angleWith(e)/Math.PI}class ss extends Qa{reset(){super.reset(),delete this._minDiameter,delete this._startVector,delete this._vector;}_start(t){this._startVector=this._vector=t[0].sub(t[1]),this._minDiameter=t[0].dist(t[1]);}_move(t,e,i){const a=this._vector;if(this._vector=t[0].sub(t[1]),this._active||!this._isBelowThreshold(this._vector))return this._active=!0,{bearingDelta:as(this._vector,a),pinchAround:e}}_isBelowThreshold(t){this._minDiameter=Math.min(this._minDiameter,t.mag());const e=25/(Math.PI*this._minDiameter)*360,i=as(t,this._startVector);return Math.abs(i)<e}}function os(t){return Math.abs(t.y)>Math.abs(t.x)}class rs extends Qa{constructor(t){super(),this._currentTouchCount=0,this._map=t;}reset(){super.reset(),this._valid=void 0,delete this._firstMove,delete this._lastPoints;}touchstart(t,e,i){super.touchstart(t,e,i),this._currentTouchCount=i.length;}_start(t){this._lastPoints=t,os(t[0].sub(t[1]))&&(this._valid=!1);}_move(t,e,i){if(this._map.cooperativeGestures.isEnabled()&&this._currentTouchCount<3)return;const a=t[0].sub(this._lastPoints[0]),s=t[1].sub(this._lastPoints[1]);return this._valid=this.gestureBeginsVertically(a,s,i.timeStamp),this._valid?(this._lastPoints=t,this._active=!0,{pitchDelta:(a.y+s.y)/2*-.5}):void 0}gestureBeginsVertically(t,e,i){if(void 0!==this._valid)return this._valid;const a=t.mag()>=2,s=e.mag()>=2;if(!a&&!s)return;if(!a||!s)return void 0===this._firstMove&&(this._firstMove=i),i-this._firstMove<100&&void 0;const o=t.y>0==e.y>0;return os(t)&&os(e)&&o}}const ns={panStep:100,bearingStep:15,pitchStep:10};class ls{constructor(t){this._tr=new Na(t);const e=ns;this._panStep=e.panStep,this._bearingStep=e.bearingStep,this._pitchStep=e.pitchStep,this._rotationDisabled=!1;}reset(){this._active=!1;}keydown(t){if(t.altKey||t.ctrlKey||t.metaKey)return;let e=0,i=0,a=0,s=0,o=0;switch(t.keyCode){case 61:case 107:case 171:case 187:e=1;break;case 189:case 109:case 173:e=-1;break;case 37:t.shiftKey?i=-1:(t.preventDefault(),s=-1);break;case 39:t.shiftKey?i=1:(t.preventDefault(),s=1);break;case 38:t.shiftKey?a=1:(t.preventDefault(),o=-1);break;case 40:t.shiftKey?a=-1:(t.preventDefault(),o=1);break;default:return}return this._rotationDisabled&&(i=0,a=0),{cameraAnimation:r=>{const n=this._tr;r.easeTo({duration:300,easeId:"keyboardHandler",easing:hs,zoom:e?Math.round(n.zoom)+e*(t.shiftKey?2:1):n.zoom,bearing:n.bearing+i*this._bearingStep,pitch:n.pitch+a*this._pitchStep,offset:[-s*this._panStep,-o*this._panStep],center:n.center},{originalEvent:t});}}}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}disableRotation(){this._rotationDisabled=!0;}enableRotation(){this._rotationDisabled=!1;}}function hs(t){return t*(2-t)}const cs=4.000244140625;class us{constructor(t,e){this._onTimeout=t=>{this._type="wheel",this._delta-=this._lastValue,this._active||this._start(t);},this._map=t,this._tr=new Na(t),this._triggerRenderFrame=e,this._delta=0,this._defaultZoomRate=.01,this._wheelZoomRate=.0022222222222222222;}setZoomRate(t){this._defaultZoomRate=t;}setWheelZoomRate(t){this._wheelZoomRate=t;}isEnabled(){return !!this._enabled}isActive(){return !!this._active||void 0!==this._finishTimeout}isZooming(){return !!this._zooming}enable(t){this.isEnabled()||(this._enabled=!0,this._aroundCenter=!!t&&"center"===t.around);}disable(){this.isEnabled()&&(this._enabled=!1);}_shouldBePrevented(t){return !!this._map.cooperativeGestures.isEnabled()&&!(t.ctrlKey||this._map.cooperativeGestures.isBypassed(t))}wheel(t){if(!this.isEnabled())return;if(this._shouldBePrevented(t))return void this._map.cooperativeGestures.notifyGestureBlocked("wheel_zoom",t);let e=t.deltaMode===WheelEvent.DOM_DELTA_LINE?40*t.deltaY:t.deltaY;const i=o.now(),a=i-(this._lastWheelEventTime||0);this._lastWheelEventTime=i,0!==e&&e%cs==0?this._type="wheel":0!==e&&Math.abs(e)<4?this._type="trackpad":a>400?(this._type=null,this._lastValue=e,this._timeout=setTimeout(this._onTimeout,40,t)):this._type||(this._type=Math.abs(a*e)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,e+=this._lastValue)),t.shiftKey&&e&&(e/=4),this._type&&(this._lastWheelEvent=t,this._delta-=e,this._active||this._start(t)),t.preventDefault();}_start(t){if(!this._delta)return;this._frameId&&(this._frameId=null),this._active=!0,this.isZooming()||(this._zooming=!0),this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout);const i=r.mousePos(this._map.getCanvas(),t),a=this._tr;this._around=i.y>a.transform.height/2-a.transform.getHorizon()?e.N.convert(this._aroundCenter?a.center:a.unproject(i)):e.N.convert(a.center),this._aroundPoint=a.transform.locationPoint(this._around),this._frameId||(this._frameId=!0,this._triggerRenderFrame());}renderFrame(){if(!this._frameId)return;if(this._frameId=null,!this.isActive())return;const t=this._tr.transform;if(0!==this._delta){const e="wheel"===this._type&&Math.abs(this._delta)>cs?this._wheelZoomRate:this._defaultZoomRate;let i=2/(1+Math.exp(-Math.abs(this._delta*e)));this._delta<0&&0!==i&&(i=1/i);const a="number"==typeof this._targetZoom?t.zoomScale(this._targetZoom):t.scale;this._targetZoom=Math.min(t.maxZoom,Math.max(t.minZoom,t.scaleZoom(a*i))),"wheel"===this._type&&(this._startZoom=t.zoom,this._easing=this._smoothOutEasing(200)),this._delta=0;}const i="number"==typeof this._targetZoom?this._targetZoom:t.zoom,a=this._startZoom,s=this._easing;let r,n=!1;const l=o.now()-this._lastWheelEventTime;if("wheel"===this._type&&a&&s&&l){const t=Math.min(l/200,1),o=s(t);r=e.y.number(a,i,o),t<1?this._frameId||(this._frameId=!0):n=!0;}else r=i,n=!0;return this._active=!0,n&&(this._active=!1,this._finishTimeout=setTimeout((()=>{this._zooming=!1,this._triggerRenderFrame(),delete this._targetZoom,delete this._finishTimeout;}),200)),{noInertia:!0,needsRenderFrame:!n,zoomDelta:r-t.zoom,around:this._aroundPoint,originalEvent:this._lastWheelEvent}}_smoothOutEasing(t){let i=e.b9;if(this._prevEase){const t=this._prevEase,a=(o.now()-t.start)/t.duration,s=t.easing(a+.01)-t.easing(a),r=.27/Math.sqrt(s*s+1e-4)*.01,n=Math.sqrt(.0729-r*r);i=e.b8(r,n,.25,1);}return this._prevEase={start:o.now(),duration:t,easing:i},i}reset(){this._active=!1,this._zooming=!1,delete this._targetZoom,this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout);}}class ds{constructor(t,e){this._clickZoom=t,this._tapZoom=e;}enable(){this._clickZoom.enable(),this._tapZoom.enable();}disable(){this._clickZoom.disable(),this._tapZoom.disable();}isEnabled(){return this._clickZoom.isEnabled()&&this._tapZoom.isEnabled()}isActive(){return this._clickZoom.isActive()||this._tapZoom.isActive()}}class _s{constructor(t){this._tr=new Na(t),this.reset();}reset(){this._active=!1;}dblclick(t,e){return t.preventDefault(),{cameraAnimation:i=>{i.easeTo({duration:300,zoom:this._tr.zoom+(t.shiftKey?-1:1),around:this._tr.unproject(e)},{originalEvent:t});}}}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class ps{constructor(){this._tap=new qa({numTouches:1,numTaps:1}),this.reset();}reset(){this._active=!1,delete this._swipePoint,delete this._swipeTouch,delete this._tapTime,delete this._tapPoint,this._tap.reset();}touchstart(t,e,i){if(!this._swipePoint)if(this._tapTime){const a=e[0],s=t.timeStamp-this._tapTime<500,o=this._tapPoint.dist(a)<30;s&&o?i.length>0&&(this._swipePoint=a,this._swipeTouch=i[0].identifier):this.reset();}else this._tap.touchstart(t,e,i);}touchmove(t,e,i){if(this._tapTime){if(this._swipePoint){if(i[0].identifier!==this._swipeTouch)return;const a=e[0],s=a.y-this._swipePoint.y;return this._swipePoint=a,t.preventDefault(),this._active=!0,{zoomDelta:s/128}}}else this._tap.touchmove(t,e,i);}touchend(t,e,i){if(this._tapTime)this._swipePoint&&0===i.length&&this.reset();else {const a=this._tap.touchend(t,e,i);a&&(this._tapTime=t.timeStamp,this._tapPoint=a);}}touchcancel(){this.reset();}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class ms{constructor(t,e,i){this._el=t,this._mousePan=e,this._touchPan=i;}enable(t){this._inertiaOptions=t||{},this._mousePan.enable(),this._touchPan.enable(),this._el.classList.add("maplibregl-touch-drag-pan");}disable(){this._mousePan.disable(),this._touchPan.disable(),this._el.classList.remove("maplibregl-touch-drag-pan");}isEnabled(){return this._mousePan.isEnabled()&&this._touchPan.isEnabled()}isActive(){return this._mousePan.isActive()||this._touchPan.isActive()}}class fs{constructor(t,e,i){this._pitchWithRotate=t.pitchWithRotate,this._mouseRotate=e,this._mousePitch=i;}enable(){this._mouseRotate.enable(),this._pitchWithRotate&&this._mousePitch.enable();}disable(){this._mouseRotate.disable(),this._mousePitch.disable();}isEnabled(){return this._mouseRotate.isEnabled()&&(!this._pitchWithRotate||this._mousePitch.isEnabled())}isActive(){return this._mouseRotate.isActive()||this._mousePitch.isActive()}}class gs{constructor(t,e,i,a){this._el=t,this._touchZoom=e,this._touchRotate=i,this._tapDragZoom=a,this._rotationDisabled=!1,this._enabled=!0;}enable(t){this._touchZoom.enable(t),this._rotationDisabled||this._touchRotate.enable(t),this._tapDragZoom.enable(),this._el.classList.add("maplibregl-touch-zoom-rotate");}disable(){this._touchZoom.disable(),this._touchRotate.disable(),this._tapDragZoom.disable(),this._el.classList.remove("maplibregl-touch-zoom-rotate");}isEnabled(){return this._touchZoom.isEnabled()&&(this._rotationDisabled||this._touchRotate.isEnabled())&&this._tapDragZoom.isEnabled()}isActive(){return this._touchZoom.isActive()||this._touchRotate.isActive()||this._tapDragZoom.isActive()}disableRotation(){this._rotationDisabled=!0,this._touchRotate.disable();}enableRotation(){this._rotationDisabled=!1,this._touchZoom.isEnabled()&&this._touchRotate.enable();}}class vs{constructor(t,e){this._bypassKey=-1!==navigator.userAgent.indexOf("Mac")?"metaKey":"ctrlKey",this._map=t,this._options=e,this._enabled=!1;}isActive(){return !1}reset(){}_setupUI(){if(this._container)return;const t=this._map.getCanvasContainer();t.classList.add("maplibregl-cooperative-gestures"),this._container=r.create("div","maplibregl-cooperative-gesture-screen",t);let e=this._map._getUIString("CooperativeGesturesHandler.WindowsHelpText");"metaKey"===this._bypassKey&&(e=this._map._getUIString("CooperativeGesturesHandler.MacHelpText"));const i=this._map._getUIString("CooperativeGesturesHandler.MobileHelpText"),a=document.createElement("div");a.className="maplibregl-desktop-message",a.textContent=e,this._container.appendChild(a);const s=document.createElement("div");s.className="maplibregl-mobile-message",s.textContent=i,this._container.appendChild(s),this._container.setAttribute("aria-hidden","true");}_destroyUI(){this._container&&(r.remove(this._container),this._map.getCanvasContainer().classList.remove("maplibregl-cooperative-gestures")),delete this._container;}enable(){this._setupUI(),this._enabled=!0;}disable(){this._enabled=!1,this._destroyUI();}isEnabled(){return this._enabled}isBypassed(t){return t[this._bypassKey]}notifyGestureBlocked(t,i){this._enabled&&(this._map.fire(new e.k("cooperativegestureprevented",{gestureType:t,originalEvent:i})),this._container.classList.add("maplibregl-show"),setTimeout((()=>{this._container.classList.remove("maplibregl-show");}),100));}}const xs=t=>t.zoom||t.drag||t.pitch||t.rotate;class ys extends e.k{}function bs(t){return t.panDelta&&t.panDelta.mag()||t.zoomDelta||t.bearingDelta||t.pitchDelta}class ws{constructor(t,e){this.handleWindowEvent=t=>{this.handleEvent(t,`${t.type}Window`);},this.handleEvent=(t,e)=>{if("blur"===t.type)return void this.stop(!0);this._updatingCamera=!0;const i="renderFrame"===t.type?void 0:t,a={needsRenderFrame:!1},s={},o={},n=t.touches,l=n?this._getMapTouches(n):void 0,h=l?r.touchPos(this._map.getCanvas(),l):r.mousePos(this._map.getCanvas(),t);for(const{handlerName:r,handler:n,allowed:c}of this._handlers){if(!n.isEnabled())continue;let u;this._blockedByActive(o,c,r)?n.reset():n[e||t.type]&&(u=n[e||t.type](t,h,l),this.mergeHandlerResult(a,s,u,r,i),u&&u.needsRenderFrame&&this._triggerRenderFrame()),(u||n.isActive())&&(o[r]=n);}const c={};for(const t in this._previousActiveHandlers)o[t]||(c[t]=i);this._previousActiveHandlers=o,(Object.keys(c).length||bs(a))&&(this._changes.push([a,s,c]),this._triggerRenderFrame()),(Object.keys(o).length||bs(a))&&this._map._stop(!0),this._updatingCamera=!1;const{cameraAnimation:u}=a;u&&(this._inertia.clear(),this._fireEvents({},{},!0),this._changes=[],u(this._map));},this._map=t,this._el=this._map.getCanvasContainer(),this._handlers=[],this._handlersById={},this._changes=[],this._inertia=new Ma(t),this._bearingSnap=e.bearingSnap,this._previousActiveHandlers={},this._eventsInProgress={},this._addDefaultHandlers(e);const i=this._el;this._listeners=[[i,"touchstart",{passive:!0}],[i,"touchmove",{passive:!1}],[i,"touchend",void 0],[i,"touchcancel",void 0],[i,"mousedown",void 0],[i,"mousemove",void 0],[i,"mouseup",void 0],[document,"mousemove",{capture:!0}],[document,"mouseup",void 0],[i,"mouseover",void 0],[i,"mouseout",void 0],[i,"dblclick",void 0],[i,"click",void 0],[i,"keydown",{capture:!1}],[i,"keyup",void 0],[i,"wheel",{passive:!1}],[i,"contextmenu",void 0],[window,"blur",void 0]];for(const[t,e,i]of this._listeners)r.addEventListener(t,e,t===document?this.handleWindowEvent:this.handleEvent,i);}destroy(){for(const[t,e,i]of this._listeners)r.removeEventListener(t,e,t===document?this.handleWindowEvent:this.handleEvent,i);}_addDefaultHandlers(t){const e=this._map,i=e.getCanvasContainer();this._add("mapEvent",new Ba(e,t));const a=e.boxZoom=new Ua(e,t);this._add("boxZoom",a),t.interactive&&t.boxZoom&&a.enable();const s=e.cooperativeGestures=new vs(e,t.cooperativeGestures);this._add("cooperativeGestures",s),t.cooperativeGestures&&s.enable();const o=new Va(e),n=new _s(e);e.doubleClickZoom=new ds(n,o),this._add("tapZoom",o),this._add("clickZoom",n),t.interactive&&t.doubleClickZoom&&e.doubleClickZoom.enable();const l=new ps;this._add("tapDragZoom",l);const h=e.touchPitch=new rs(e);this._add("touchPitch",h),t.interactive&&t.touchPitch&&e.touchPitch.enable(t.touchPitch);const c=Ka(t),u=Ja(t);e.dragRotate=new fs(t,c,u),this._add("mouseRotate",c,["mousePitch"]),this._add("mousePitch",u,["mouseRotate"]),t.interactive&&t.dragRotate&&e.dragRotate.enable();const d=(({enable:t,clickTolerance:e})=>{const i=new Wa({checkCorrectEvent:t=>0===r.mouseButton(t)&&!t.ctrlKey});return new Ga({clickTolerance:e,move:(t,e)=>({around:e,panDelta:e.sub(t)}),activateOnStart:!0,moveStateManager:i,enable:t,assignEvents:Xa})})(t),_=new Ya(t,e);e.dragPan=new ms(i,d,_),this._add("mousePan",d),this._add("touchPan",_,["touchZoom","touchRotate"]),t.interactive&&t.dragPan&&e.dragPan.enable(t.dragPan);const p=new ss,m=new is;e.touchZoomRotate=new gs(i,m,p,l),this._add("touchRotate",p,["touchPan","touchZoom"]),this._add("touchZoom",m,["touchPan","touchRotate"]),t.interactive&&t.touchZoomRotate&&e.touchZoomRotate.enable(t.touchZoomRotate);const f=e.scrollZoom=new us(e,(()=>this._triggerRenderFrame()));this._add("scrollZoom",f,["mousePan"]),t.interactive&&t.scrollZoom&&e.scrollZoom.enable(t.scrollZoom);const g=e.keyboard=new ls(e);this._add("keyboard",g),t.interactive&&t.keyboard&&e.keyboard.enable(),this._add("blockableMapEvent",new Oa(e));}_add(t,e,i){this._handlers.push({handlerName:t,handler:e,allowed:i}),this._handlersById[t]=e;}stop(t){if(!this._updatingCamera){for(const{handler:t}of this._handlers)t.reset();this._inertia.clear(),this._fireEvents({},{},t),this._changes=[];}}isActive(){for(const{handler:t}of this._handlers)if(t.isActive())return !0;return !1}isZooming(){return !!this._eventsInProgress.zoom||this._map.scrollZoom.isZooming()}isRotating(){return !!this._eventsInProgress.rotate}isMoving(){return Boolean(xs(this._eventsInProgress))||this.isZooming()}_blockedByActive(t,e,i){for(const a in t)if(a!==i&&(!e||e.indexOf(a)<0))return !0;return !1}_getMapTouches(t){const e=[];for(const i of t)this._el.contains(i.target)&&e.push(i);return e}mergeHandlerResult(t,i,a,s,o){if(!a)return;e.e(t,a);const r={handlerName:s,originalEvent:a.originalEvent||o};void 0!==a.zoomDelta&&(i.zoom=r),void 0!==a.panDelta&&(i.drag=r),void 0!==a.pitchDelta&&(i.pitch=r),void 0!==a.bearingDelta&&(i.rotate=r);}_applyChanges(){const t={},i={},a={};for(const[s,o,r]of this._changes)s.panDelta&&(t.panDelta=(t.panDelta||new e.P(0,0))._add(s.panDelta)),s.zoomDelta&&(t.zoomDelta=(t.zoomDelta||0)+s.zoomDelta),s.bearingDelta&&(t.bearingDelta=(t.bearingDelta||0)+s.bearingDelta),s.pitchDelta&&(t.pitchDelta=(t.pitchDelta||0)+s.pitchDelta),void 0!==s.around&&(t.around=s.around),void 0!==s.pinchAround&&(t.pinchAround=s.pinchAround),s.noInertia&&(t.noInertia=s.noInertia),e.e(i,o),e.e(a,r);this._updateMapTransform(t,i,a),this._changes=[];}_updateMapTransform(t,e,i){const a=this._map,s=a._getTransformForUpdate(),o=a.terrain;if(!(bs(t)||o&&this._terrainMovement))return this._fireEvents(e,i,!0);let{panDelta:r,zoomDelta:n,bearingDelta:l,pitchDelta:h,around:c,pinchAround:u}=t;void 0!==u&&(c=u),a._stop(!0),c=c||a.transform.centerPoint;const d=s.pointLocation(r?c.sub(r):c);l&&(s.bearing+=l),h&&(s.pitch+=h),n&&(s.zoom+=n),o?this._terrainMovement||!e.drag&&!e.zoom?e.drag&&this._terrainMovement?s.center=s.pointLocation(s.centerPoint.sub(r)):s.setLocationAtPoint(d,c):(this._terrainMovement=!0,this._map._elevationFreeze=!0,s.setLocationAtPoint(d,c)):s.setLocationAtPoint(d,c),a._applyUpdatedTransform(s),this._map._update(),t.noInertia||this._inertia.record(t),this._fireEvents(e,i,!0);}_fireEvents(t,i,a){const s=xs(this._eventsInProgress),r=xs(t),n={};for(const e in t){const{originalEvent:i}=t[e];this._eventsInProgress[e]||(n[`${e}start`]=i),this._eventsInProgress[e]=t[e];}!s&&r&&this._fireEvent("movestart",r.originalEvent);for(const t in n)this._fireEvent(t,n[t]);r&&this._fireEvent("move",r.originalEvent);for(const e in t){const{originalEvent:i}=t[e];this._fireEvent(e,i);}const l={};let h;for(const t in this._eventsInProgress){const{handlerName:e,originalEvent:a}=this._eventsInProgress[t];this._handlersById[e].isActive()||(delete this._eventsInProgress[t],h=i[e]||a,l[`${t}end`]=h);}for(const t in l)this._fireEvent(t,l[t]);const c=xs(this._eventsInProgress),u=(s||r)&&!c;if(u&&this._terrainMovement){this._map._elevationFreeze=!1,this._terrainMovement=!1;const t=this._map._getTransformForUpdate();t.recalculateZoom(this._map.terrain),this._map._applyUpdatedTransform(t);}if(a&&u){this._updatingCamera=!0;const t=this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions),i=t=>0!==t&&-this._bearingSnap<t&&t<this._bearingSnap;!t||!t.essential&&o.prefersReducedMotion?(this._map.fire(new e.k("moveend",{originalEvent:h})),i(this._map.getBearing())&&this._map.resetNorth()):(i(t.bearing||this._map.getBearing())&&(t.bearing=0),t.freezeElevation=!0,this._map.easeTo(t,{originalEvent:h})),this._updatingCamera=!1;}}_fireEvent(t,i){this._map.fire(new e.k(t,i?{originalEvent:i}:{}));}_requestFrame(){return this._map.triggerRepaint(),this._map._renderTaskQueue.add((t=>{delete this._frameId,this.handleEvent(new ys("renderFrame",{timeStamp:t})),this._applyChanges();}))}_triggerRenderFrame(){void 0===this._frameId&&(this._frameId=this._requestFrame());}}class Ts extends e.E{constructor(t,e){super(),this._renderFrameCallback=()=>{const t=Math.min((o.now()-this._easeStart)/this._easeOptions.duration,1);this._onEaseFrame(this._easeOptions.easing(t)),t<1&&this._easeFrameId?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop();},this._moving=!1,this._zooming=!1,this.transform=t,this._bearingSnap=e.bearingSnap,this.on("moveend",(()=>{delete this._requestedCameraState;}));}getCenter(){return new e.N(this.transform.center.lng,this.transform.center.lat)}setCenter(t,e){return this.jumpTo({center:t},e)}panBy(t,i,a){return t=e.P.convert(t).mult(-1),this.panTo(this.transform.center,e.e({offset:t},i),a)}panTo(t,i,a){return this.easeTo(e.e({center:t},i),a)}getZoom(){return this.transform.zoom}setZoom(t,e){return this.jumpTo({zoom:t},e),this}zoomTo(t,i,a){return this.easeTo(e.e({zoom:t},i),a)}zoomIn(t,e){return this.zoomTo(this.getZoom()+1,t,e),this}zoomOut(t,e){return this.zoomTo(this.getZoom()-1,t,e),this}getBearing(){return this.transform.bearing}setBearing(t,e){return this.jumpTo({bearing:t},e),this}getPadding(){return this.transform.padding}setPadding(t,e){return this.jumpTo({padding:t},e),this}rotateTo(t,i,a){return this.easeTo(e.e({bearing:t},i),a)}resetNorth(t,i){return this.rotateTo(0,e.e({duration:1e3},t),i),this}resetNorthPitch(t,i){return this.easeTo(e.e({bearing:0,pitch:0,duration:1e3},t),i),this}snapToNorth(t,e){return Math.abs(this.getBearing())<this._bearingSnap?this.resetNorth(t,e):this}getPitch(){return this.transform.pitch}setPitch(t,e){return this.jumpTo({pitch:t},e),this}cameraForBounds(t,e){t=H.convert(t).adjustAntiMeridian();const i=e&&e.bearing||0;return this._cameraForBoxAndBearing(t.getNorthWest(),t.getSouthEast(),i,e)}_cameraForBoxAndBearing(t,i,a,s){const o={top:0,bottom:0,right:0,left:0};if("number"==typeof(s=e.e({padding:o,offset:[0,0],maxZoom:this.transform.maxZoom},s)).padding){const t=s.padding;s.padding={top:t,bottom:t,right:t,left:t};}s.padding=e.e(o,s.padding);const r=this.transform,n=r.padding,l=new H(t,i),h=r.project(l.getNorthWest()),c=r.project(l.getNorthEast()),u=r.project(l.getSouthEast()),d=r.project(l.getSouthWest()),_=e.ba(-a),p=h.rotate(_),m=c.rotate(_),f=u.rotate(_),g=d.rotate(_),v=new e.P(Math.max(p.x,m.x,g.x,f.x),Math.max(p.y,m.y,g.y,f.y)),x=new e.P(Math.min(p.x,m.x,g.x,f.x),Math.min(p.y,m.y,g.y,f.y)),y=v.sub(x),b=(r.width-(n.left+n.right+s.padding.left+s.padding.right))/y.x,w=(r.height-(n.top+n.bottom+s.padding.top+s.padding.bottom))/y.y;if(w<0||b<0)return void e.w("Map cannot fit within canvas with the given bounds, padding, and/or offset.");const T=Math.min(r.scaleZoom(r.scale*Math.min(b,w)),s.maxZoom),I=e.P.convert(s.offset),E=new e.P((s.padding.left-s.padding.right)/2,(s.padding.top-s.padding.bottom)/2).rotate(e.ba(a)),P=I.add(E).mult(r.scale/r.zoomScale(T));return {center:r.unproject(h.add(u).div(2).sub(P)),zoom:T,bearing:a}}fitBounds(t,e,i){return this._fitInternal(this.cameraForBounds(t,e),e,i)}fitScreenCoordinates(t,i,a,s,o){return this._fitInternal(this._cameraForBoxAndBearing(this.transform.pointLocation(e.P.convert(t)),this.transform.pointLocation(e.P.convert(i)),a,s),s,o)}_fitInternal(t,i,a){return t?(delete(i=e.e(t,i)).padding,i.linear?this.easeTo(i,a):this.flyTo(i,a)):this}jumpTo(t,i){this.stop();const a=this._getTransformForUpdate();let s=!1,o=!1,r=!1;return "zoom"in t&&a.zoom!==+t.zoom&&(s=!0,a.zoom=+t.zoom),void 0!==t.center&&(a.center=e.N.convert(t.center)),"bearing"in t&&a.bearing!==+t.bearing&&(o=!0,a.bearing=+t.bearing),"pitch"in t&&a.pitch!==+t.pitch&&(r=!0,a.pitch=+t.pitch),null==t.padding||a.isPaddingEqual(t.padding)||(a.padding=t.padding),this._applyUpdatedTransform(a),this.fire(new e.k("movestart",i)).fire(new e.k("move",i)),s&&this.fire(new e.k("zoomstart",i)).fire(new e.k("zoom",i)).fire(new e.k("zoomend",i)),o&&this.fire(new e.k("rotatestart",i)).fire(new e.k("rotate",i)).fire(new e.k("rotateend",i)),r&&this.fire(new e.k("pitchstart",i)).fire(new e.k("pitch",i)).fire(new e.k("pitchend",i)),this.fire(new e.k("moveend",i))}calculateCameraOptionsFromTo(t,i,a,s=0){const o=e.Z.fromLngLat(t,i),r=e.Z.fromLngLat(a,s),n=r.x-o.x,l=r.y-o.y,h=r.z-o.z,c=Math.hypot(n,l,h);if(0===c)throw new Error("Can't calculate camera options with same From and To");const u=Math.hypot(n,l),d=this.transform.scaleZoom(this.transform.cameraToCenterDistance/c/this.transform.tileSize),_=180*Math.atan2(n,-l)/Math.PI;let p=180*Math.acos(u/c)/Math.PI;return p=h<0?90-p:90+p,{center:r.toLngLat(),zoom:d,pitch:p,bearing:_}}easeTo(t,i){var a;this._stop(!1,t.easeId),(!1===(t=e.e({offset:[0,0],duration:500,easing:e.b9},t)).animate||!t.essential&&o.prefersReducedMotion)&&(t.duration=0);const s=this._getTransformForUpdate(),r=s.zoom,n=s.bearing,l=s.pitch,h=s.padding,c="bearing"in t?this._normalizeBearing(t.bearing,n):n,u="pitch"in t?+t.pitch:l,d="padding"in t?t.padding:s.padding,_=e.P.convert(t.offset);let p=s.centerPoint.add(_);const m=s.pointLocation(p),{center:f,zoom:g}=s.getConstrained(e.N.convert(t.center||m),null!==(a=t.zoom)&&void 0!==a?a:r);this._normalizeCenter(f,s);const v=s.project(m),x=s.project(f).sub(v),y=s.zoomScale(g-r);let b,w;t.around&&(b=e.N.convert(t.around),w=s.locationPoint(b));const T={moving:this._moving,zooming:this._zooming,rotating:this._rotating,pitching:this._pitching};return this._zooming=this._zooming||g!==r,this._rotating=this._rotating||n!==c,this._pitching=this._pitching||u!==l,this._padding=!s.isPaddingEqual(d),this._easeId=t.easeId,this._prepareEase(i,t.noMoveStart,T),this.terrain&&this._prepareElevation(f),this._ease((a=>{if(this._zooming&&(s.zoom=e.y.number(r,g,a)),this._rotating&&(s.bearing=e.y.number(n,c,a)),this._pitching&&(s.pitch=e.y.number(l,u,a)),this._padding&&(s.interpolatePadding(h,d,a),p=s.centerPoint.add(_)),this.terrain&&!t.freezeElevation&&this._updateElevation(a),b)s.setLocationAtPoint(b,w);else {const t=s.zoomScale(s.zoom-r),e=g>r?Math.min(2,y):Math.max(.5,y),i=Math.pow(e,1-a),o=s.unproject(v.add(x.mult(a*i)).mult(t));s.setLocationAtPoint(s.renderWorldCopies?o.wrap():o,p);}this._applyUpdatedTransform(s),this._fireMoveEvents(i);}),(e=>{this.terrain&&t.freezeElevation&&this._finalizeElevation(),this._afterEase(i,e);}),t),this}_prepareEase(t,i,a={}){this._moving=!0,i||a.moving||this.fire(new e.k("movestart",t)),this._zooming&&!a.zooming&&this.fire(new e.k("zoomstart",t)),this._rotating&&!a.rotating&&this.fire(new e.k("rotatestart",t)),this._pitching&&!a.pitching&&this.fire(new e.k("pitchstart",t));}_prepareElevation(t){this._elevationCenter=t,this._elevationStart=this.transform.elevation,this._elevationTarget=this.terrain.getElevationForLngLatZoom(t,this.transform.tileZoom),this._elevationFreeze=!0;}_updateElevation(t){this.transform.minElevationForCurrentTile=this.terrain.getMinTileElevationForLngLatZoom(this._elevationCenter,this.transform.tileZoom);const i=this.terrain.getElevationForLngLatZoom(this._elevationCenter,this.transform.tileZoom);if(t<1&&i!==this._elevationTarget){const e=this._elevationTarget-this._elevationStart;this._elevationStart+=t*(e-(i-(e*t+this._elevationStart))/(1-t)),this._elevationTarget=i;}this.transform.elevation=e.y.number(this._elevationStart,this._elevationTarget,t);}_finalizeElevation(){this._elevationFreeze=!1,this.transform.recalculateZoom(this.terrain);}_getTransformForUpdate(){return this.transformCameraUpdate||this.terrain?(this._requestedCameraState||(this._requestedCameraState=this.transform.clone()),this._requestedCameraState):this.transform}_elevateCameraIfInsideTerrain(t){const e=t.getCameraPosition(),i=this.terrain.getElevationForLngLatZoom(e.lngLat,t.zoom);if(e.altitude<i){const a=this.calculateCameraOptionsFromTo(e.lngLat,i,t.center,t.elevation);return {pitch:a.pitch,zoom:a.zoom}}return {}}_applyUpdatedTransform(t){const e=[];if(this.terrain&&e.push((t=>this._elevateCameraIfInsideTerrain(t))),this.transformCameraUpdate&&e.push((t=>this.transformCameraUpdate(t))),!e.length)return;const i=t.clone();for(const t of e){const e=i.clone(),{center:a,zoom:s,pitch:o,bearing:r,elevation:n}=t(e);a&&(e.center=a),void 0!==s&&(e.zoom=s),void 0!==o&&(e.pitch=o),void 0!==r&&(e.bearing=r),void 0!==n&&(e.elevation=n),i.apply(e);}this.transform.apply(i);}_fireMoveEvents(t){this.fire(new e.k("move",t)),this._zooming&&this.fire(new e.k("zoom",t)),this._rotating&&this.fire(new e.k("rotate",t)),this._pitching&&this.fire(new e.k("pitch",t));}_afterEase(t,i){if(this._easeId&&i&&this._easeId===i)return;delete this._easeId;const a=this._zooming,s=this._rotating,o=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,this._padding=!1,a&&this.fire(new e.k("zoomend",t)),s&&this.fire(new e.k("rotateend",t)),o&&this.fire(new e.k("pitchend",t)),this.fire(new e.k("moveend",t));}flyTo(t,i){var a;if(!t.essential&&o.prefersReducedMotion){const a=e.M(t,["center","zoom","bearing","pitch","around"]);return this.jumpTo(a,i)}this.stop(),t=e.e({offset:[0,0],speed:1.2,curve:1.42,easing:e.b9},t);const s=this._getTransformForUpdate(),r=s.zoom,n=s.bearing,l=s.pitch,h=s.padding,c="bearing"in t?this._normalizeBearing(t.bearing,n):n,u="pitch"in t?+t.pitch:l,d="padding"in t?t.padding:s.padding,_=e.P.convert(t.offset);let p=s.centerPoint.add(_);const m=s.pointLocation(p),{center:f,zoom:g}=s.getConstrained(e.N.convert(t.center||m),null!==(a=t.zoom)&&void 0!==a?a:r);this._normalizeCenter(f,s);const v=s.zoomScale(g-r),x=s.project(m),y=s.project(f).sub(x);let b=t.curve;const w=Math.max(s.width,s.height),T=w/v,I=y.mag();if("minZoom"in t){const i=e.ac(Math.min(t.minZoom,r,g),s.minZoom,s.maxZoom),a=w/s.zoomScale(i-r);b=Math.sqrt(a/I*2);}const E=b*b;function P(t){const e=(T*T-w*w+(t?-1:1)*E*E*I*I)/(2*(t?T:w)*E*I);return Math.log(Math.sqrt(e*e+1)-e)}function C(t){return (Math.exp(t)-Math.exp(-t))/2}function S(t){return (Math.exp(t)+Math.exp(-t))/2}const z=P(!1);let D=function(t){return S(z)/S(z+b*t)},M=function(t){return w*((S(z)*(C(e=z+b*t)/S(e))-C(z))/E)/I;var e;},A=(P(!0)-z)/b;if(Math.abs(I)<1e-6||!isFinite(A)){if(Math.abs(w-T)<1e-6)return this.easeTo(t,i);const e=T<w?-1:1;A=Math.abs(Math.log(T/w))/b,M=()=>0,D=t=>Math.exp(e*b*t);}return t.duration="duration"in t?+t.duration:1e3*A/("screenSpeed"in t?+t.screenSpeed/b:+t.speed),t.maxDuration&&t.duration>t.maxDuration&&(t.duration=0),this._zooming=!0,this._rotating=n!==c,this._pitching=u!==l,this._padding=!s.isPaddingEqual(d),this._prepareEase(i,!1),this.terrain&&this._prepareElevation(f),this._ease((a=>{const o=a*A,m=1/D(o);s.zoom=1===a?g:r+s.scaleZoom(m),this._rotating&&(s.bearing=e.y.number(n,c,a)),this._pitching&&(s.pitch=e.y.number(l,u,a)),this._padding&&(s.interpolatePadding(h,d,a),p=s.centerPoint.add(_)),this.terrain&&!t.freezeElevation&&this._updateElevation(a);const v=1===a?f:s.unproject(x.add(y.mult(M(o))).mult(m));s.setLocationAtPoint(s.renderWorldCopies?v.wrap():v,p),this._applyUpdatedTransform(s),this._fireMoveEvents(i);}),(()=>{this.terrain&&t.freezeElevation&&this._finalizeElevation(),this._afterEase(i);}),t),this}isEasing(){return !!this._easeFrameId}stop(){return this._stop()}_stop(t,e){var i;if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),delete this._easeFrameId,delete this._onEaseFrame),this._onEaseEnd){const t=this._onEaseEnd;delete this._onEaseEnd,t.call(this,e);}return t||null===(i=this.handlers)||void 0===i||i.stop(!1),this}_ease(t,e,i){!1===i.animate||0===i.duration?(t(1),e()):(this._easeStart=o.now(),this._easeOptions=i,this._onEaseFrame=t,this._onEaseEnd=e,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback));}_normalizeBearing(t,i){t=e.b3(t,-180,180);const a=Math.abs(t-i);return Math.abs(t-360-i)<a&&(t-=360),Math.abs(t+360-i)<a&&(t+=360),t}_normalizeCenter(t,e){if(!e.renderWorldCopies||e.lngRange)return;const i=t.lng-e.center.lng;t.lng+=i>180?-360:i<-180?360:0;}queryTerrainElevation(t){return this.terrain?this.terrain.getElevationForLngLatZoom(e.N.convert(t),this.transform.tileZoom)-this.transform.elevation:null}}const Is={compact:!0,customAttribution:'<a href="https://maplibre.org/" target="_blank">MapLibre</a>'};class Es{constructor(t=Is){this._toggleAttribution=()=>{this._container.classList.contains("maplibregl-compact")&&(this._container.classList.contains("maplibregl-compact-show")?(this._container.setAttribute("open",""),this._container.classList.remove("maplibregl-compact-show")):(this._container.classList.add("maplibregl-compact-show"),this._container.removeAttribute("open")));},this._updateData=t=>{!t||"metadata"!==t.sourceDataType&&"visibility"!==t.sourceDataType&&"style"!==t.dataType&&"terrain"!==t.type||this._updateAttributions();},this._updateCompact=()=>{this._map.getCanvasContainer().offsetWidth<=640||this._compact?!1===this._compact?this._container.setAttribute("open",""):this._container.classList.contains("maplibregl-compact")||this._container.classList.contains("maplibregl-attrib-empty")||(this._container.setAttribute("open",""),this._container.classList.add("maplibregl-compact","maplibregl-compact-show")):(this._container.setAttribute("open",""),this._container.classList.contains("maplibregl-compact")&&this._container.classList.remove("maplibregl-compact","maplibregl-compact-show"));},this._updateCompactMinimize=()=>{this._container.classList.contains("maplibregl-compact")&&this._container.classList.contains("maplibregl-compact-show")&&this._container.classList.remove("maplibregl-compact-show");},this.options=t;}getDefaultPosition(){return "bottom-right"}onAdd(t){return this._map=t,this._compact=this.options.compact,this._container=r.create("details","maplibregl-ctrl maplibregl-ctrl-attrib"),this._compactButton=r.create("summary","maplibregl-ctrl-attrib-button",this._container),this._compactButton.addEventListener("click",this._toggleAttribution),this._setElementTitle(this._compactButton,"ToggleAttribution"),this._innerContainer=r.create("div","maplibregl-ctrl-attrib-inner",this._container),this._updateAttributions(),this._updateCompact(),this._map.on("styledata",this._updateData),this._map.on("sourcedata",this._updateData),this._map.on("terrain",this._updateData),this._map.on("resize",this._updateCompact),this._map.on("drag",this._updateCompactMinimize),this._container}onRemove(){r.remove(this._container),this._map.off("styledata",this._updateData),this._map.off("sourcedata",this._updateData),this._map.off("terrain",this._updateData),this._map.off("resize",this._updateCompact),this._map.off("drag",this._updateCompactMinimize),this._map=void 0,this._compact=void 0,this._attribHTML=void 0;}_setElementTitle(t,e){const i=this._map._getUIString(`AttributionControl.${e}`);t.title=i,t.setAttribute("aria-label",i);}_updateAttributions(){if(!this._map.style)return;let t=[];if(this.options.customAttribution&&(Array.isArray(this.options.customAttribution)?t=t.concat(this.options.customAttribution.map((t=>"string"!=typeof t?"":t))):"string"==typeof this.options.customAttribution&&t.push(this.options.customAttribution)),this._map.style.stylesheet){const t=this._map.style.stylesheet;this.styleOwner=t.owner,this.styleId=t.id;}const e=this._map.style.sourceCaches;for(const i in e){const a=e[i];if(a.used||a.usedForTerrain){const e=a.getSource();e.attribution&&t.indexOf(e.attribution)<0&&t.push(e.attribution);}}t=t.filter((t=>String(t).trim())),t.sort(((t,e)=>t.length-e.length)),t=t.filter(((e,i)=>{for(let a=i+1;a<t.length;a++)if(t[a].indexOf(e)>=0)return !1;return !0}));const i=t.join(" | ");i!==this._attribHTML&&(this._attribHTML=i,t.length?(this._innerContainer.innerHTML=i,this._container.classList.remove("maplibregl-attrib-empty")):this._container.classList.add("maplibregl-attrib-empty"),this._updateCompact(),this._editLink=null);}}class Ps{constructor(t={}){this._updateCompact=()=>{const t=this._container.children;if(t.length){const e=t[0];this._map.getCanvasContainer().offsetWidth<=640||this._compact?!1!==this._compact&&e.classList.add("maplibregl-compact"):e.classList.remove("maplibregl-compact");}},this.options=t;}getDefaultPosition(){return "bottom-left"}onAdd(t){this._map=t,this._compact=this.options&&this.options.compact,this._container=r.create("div","maplibregl-ctrl");const e=r.create("a","maplibregl-ctrl-logo");return e.target="_blank",e.rel="noopener nofollow",e.href="https://maplibre.org/",e.setAttribute("aria-label",this._map._getUIString("LogoControl.Title")),e.setAttribute("rel","noopener nofollow"),this._container.appendChild(e),this._container.style.display="block",this._map.on("resize",this._updateCompact),this._updateCompact(),this._container}onRemove(){r.remove(this._container),this._map.off("resize",this._updateCompact),this._map=void 0,this._compact=void 0;}}class Cs{constructor(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1;}add(t){const e=++this._id;return this._queue.push({callback:t,id:e,cancelled:!1}),e}remove(t){const e=this._currentlyRunning,i=e?this._queue.concat(e):this._queue;for(const e of i)if(e.id===t)return void(e.cancelled=!0)}run(t=0){if(this._currentlyRunning)throw new Error("Attempting to run(), but is already running.");const e=this._currentlyRunning=this._queue;this._queue=[];for(const i of e)if(!i.cancelled&&(i.callback(t),this._cleared))break;this._cleared=!1,this._currentlyRunning=!1;}clear(){this._currentlyRunning&&(this._cleared=!0),this._queue=[];}}var Ss=e.Y([{name:"a_pos3d",type:"Int16",components:3}]);class zs extends e.E{constructor(t){super(),this.sourceCache=t,this._tiles={},this._renderableTilesKeys=[],this._sourceTileCache={},this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.deltaZoom=1,t.usedForTerrain=!0,t.tileSize=this.tileSize*2**this.deltaZoom;}destruct(){this.sourceCache.usedForTerrain=!1,this.sourceCache.tileSize=null;}update(t,i){this.sourceCache.update(t,i),this._renderableTilesKeys=[];const a={};for(const s of t.coveringTiles({tileSize:this.tileSize,minzoom:this.minzoom,maxzoom:this.maxzoom,reparseOverscaled:!1,terrain:i}))a[s.key]=!0,this._renderableTilesKeys.push(s.key),this._tiles[s.key]||(s.posMatrix=new Float64Array(16),e.aP(s.posMatrix,0,e.X,0,e.X,0,1),this._tiles[s.key]=new lt(s,this.tileSize));for(const t in this._tiles)a[t]||delete this._tiles[t];}freeRtt(t){for(const e in this._tiles){const i=this._tiles[e];(!t||i.tileID.equals(t)||i.tileID.isChildOf(t)||t.isChildOf(i.tileID))&&(i.rtt=[]);}}getRenderableTiles(){return this._renderableTilesKeys.map((t=>this.getTileByID(t)))}getTileByID(t){return this._tiles[t]}getTerrainCoords(t){const i={};for(const a of this._renderableTilesKeys){const s=this._tiles[a].tileID;if(s.canonical.equals(t.canonical)){const s=t.clone();s.posMatrix=new Float64Array(16),e.aP(s.posMatrix,0,e.X,0,e.X,0,1),i[a]=s;}else if(s.canonical.isChildOf(t.canonical)){const o=t.clone();o.posMatrix=new Float64Array(16);const r=s.canonical.z-t.canonical.z,n=s.canonical.x-(s.canonical.x>>r<<r),l=s.canonical.y-(s.canonical.y>>r<<r),h=e.X>>r;e.aP(o.posMatrix,0,h,0,h,0,1),e.J(o.posMatrix,o.posMatrix,[-n*h,-l*h,0]),i[a]=o;}else if(t.canonical.isChildOf(s.canonical)){const o=t.clone();o.posMatrix=new Float64Array(16);const r=t.canonical.z-s.canonical.z,n=t.canonical.x-(t.canonical.x>>r<<r),l=t.canonical.y-(t.canonical.y>>r<<r),h=e.X>>r;e.aP(o.posMatrix,0,e.X,0,e.X,0,1),e.J(o.posMatrix,o.posMatrix,[n*h,l*h,0]),e.K(o.posMatrix,o.posMatrix,[1/2**r,1/2**r,0]),i[a]=o;}}return i}getSourceTile(t,e){const i=this.sourceCache._source;let a=t.overscaledZ-this.deltaZoom;if(a>i.maxzoom&&(a=i.maxzoom),a<i.minzoom)return null;this._sourceTileCache[t.key]||(this._sourceTileCache[t.key]=t.scaledTo(a).key);let s=this.sourceCache.getTileByID(this._sourceTileCache[t.key]);if((!s||!s.dem)&&e)for(;a>=i.minzoom&&(!s||!s.dem);)s=this.sourceCache.getTileByID(t.scaledTo(a--).key);return s}tilesAfterTime(t=Date.now()){return Object.values(this._tiles).filter((e=>e.timeAdded>=t))}}class Ds{constructor(t,e,i){this.painter=t,this.sourceCache=new zs(e),this.options=i,this.exaggeration="number"==typeof i.exaggeration?i.exaggeration:1,this.qualityFactor=2,this.meshSize=128,this._demMatrixCache={},this.coordsIndex=[],this._coordsTextureSize=1024;}getDEMElevation(t,i,a,s=e.X){var o;if(!(i>=0&&i<s&&a>=0&&a<s))return 0;const r=this.getTerrainData(t),n=null===(o=r.tile)||void 0===o?void 0:o.dem;if(!n)return 0;const l=function(t,e,i){var a=e[0],s=e[1];return t[0]=i[0]*a+i[4]*s+i[12],t[1]=i[1]*a+i[5]*s+i[13],t}([],[i/s*e.X,a/s*e.X],r.u_terrain_matrix),h=[l[0]*n.dim,l[1]*n.dim],c=Math.floor(h[0]),u=Math.floor(h[1]),d=h[0]-c,_=h[1]-u;return n.get(c,u)*(1-d)*(1-_)+n.get(c+1,u)*d*(1-_)+n.get(c,u+1)*(1-d)*_+n.get(c+1,u+1)*d*_}getElevationForLngLatZoom(t,i){if(!e.bb(i,t.wrap()))return 0;const{tileID:a,mercatorX:s,mercatorY:o}=this._getOverscaledTileIDFromLngLatZoom(t,i);return this.getElevation(a,s%e.X,o%e.X,e.X)}getElevation(t,i,a,s=e.X){return this.getDEMElevation(t,i,a,s)*this.exaggeration}getTerrainData(t){if(!this._emptyDemTexture){const t=this.painter.context,i=new e.R({width:1,height:1},new Uint8Array(4));this._emptyDepthTexture=new b(t,i,t.gl.RGBA,{premultiply:!1}),this._emptyDemUnpack=[0,0,0,0],this._emptyDemTexture=new b(t,new e.R({width:1,height:1}),t.gl.RGBA,{premultiply:!1}),this._emptyDemTexture.bind(t.gl.NEAREST,t.gl.CLAMP_TO_EDGE),this._emptyDemMatrix=e.an([]);}const i=this.sourceCache.getSourceTile(t,!0);if(i&&i.dem&&(!i.demTexture||i.needsTerrainPrepare)){const t=this.painter.context;i.demTexture=this.painter.getTileTexture(i.dem.stride),i.demTexture?i.demTexture.update(i.dem.getPixels(),{premultiply:!1}):i.demTexture=new b(t,i.dem.getPixels(),t.gl.RGBA,{premultiply:!1}),i.demTexture.bind(t.gl.NEAREST,t.gl.CLAMP_TO_EDGE),i.needsTerrainPrepare=!1;}const a=i&&i+i.tileID.key+t.key;if(a&&!this._demMatrixCache[a]){const a=this.sourceCache.sourceCache._source.maxzoom;let s=t.canonical.z-i.tileID.canonical.z;t.overscaledZ>t.canonical.z&&(t.canonical.z>=a?s=t.canonical.z-a:e.w("cannot calculate elevation if elevation maxzoom > source.maxzoom"));const o=t.canonical.x-(t.canonical.x>>s<<s),r=t.canonical.y-(t.canonical.y>>s<<s),n=e.bc(new Float64Array(16),[1/(e.X<<s),1/(e.X<<s),0]);e.J(n,n,[o*e.X,r*e.X,0]),this._demMatrixCache[t.key]={matrix:n,coord:t};}return {u_depth:2,u_terrain:3,u_terrain_dim:i&&i.dem&&i.dem.dim||1,u_terrain_matrix:a?this._demMatrixCache[t.key].matrix:this._emptyDemMatrix,u_terrain_unpack:i&&i.dem&&i.dem.getUnpackVector()||this._emptyDemUnpack,u_terrain_exaggeration:this.exaggeration,texture:(i&&i.demTexture||this._emptyDemTexture).texture,depthTexture:(this._fboDepthTexture||this._emptyDepthTexture).texture,tile:i}}getFramebuffer(t){const e=this.painter,i=e.width/devicePixelRatio,a=e.height/devicePixelRatio;return !this._fbo||this._fbo.width===i&&this._fbo.height===a||(this._fbo.destroy(),this._fboCoordsTexture.destroy(),this._fboDepthTexture.destroy(),delete this._fbo,delete this._fboDepthTexture,delete this._fboCoordsTexture),this._fboCoordsTexture||(this._fboCoordsTexture=new b(e.context,{width:i,height:a,data:null},e.context.gl.RGBA,{premultiply:!1}),this._fboCoordsTexture.bind(e.context.gl.NEAREST,e.context.gl.CLAMP_TO_EDGE)),this._fboDepthTexture||(this._fboDepthTexture=new b(e.context,{width:i,height:a,data:null},e.context.gl.RGBA,{premultiply:!1}),this._fboDepthTexture.bind(e.context.gl.NEAREST,e.context.gl.CLAMP_TO_EDGE)),this._fbo||(this._fbo=e.context.createFramebuffer(i,a,!0,!1),this._fbo.depthAttachment.set(e.context.createRenderbuffer(e.context.gl.DEPTH_COMPONENT16,i,a))),this._fbo.colorAttachment.set("coords"===t?this._fboCoordsTexture.texture:this._fboDepthTexture.texture),this._fbo}getCoordsTexture(){const t=this.painter.context;if(this._coordsTexture)return this._coordsTexture;const i=new Uint8Array(this._coordsTextureSize*this._coordsTextureSize*4);for(let t=0,e=0;t<this._coordsTextureSize;t++)for(let a=0;a<this._coordsTextureSize;a++,e+=4)i[e+0]=255&a,i[e+1]=255&t,i[e+2]=a>>8<<4|t>>8,i[e+3]=0;const a=new e.R({width:this._coordsTextureSize,height:this._coordsTextureSize},new Uint8Array(i.buffer)),s=new b(t,a,t.gl.RGBA,{premultiply:!1});return s.bind(t.gl.NEAREST,t.gl.CLAMP_TO_EDGE),this._coordsTexture=s,s}pointCoordinate(t){this.painter.maybeDrawDepthAndCoords(!0);const i=new Uint8Array(4),a=this.painter.context,s=a.gl,o=Math.round(t.x*this.painter.pixelRatio/devicePixelRatio),r=Math.round(t.y*this.painter.pixelRatio/devicePixelRatio),n=Math.round(this.painter.height/devicePixelRatio);a.bindFramebuffer.set(this.getFramebuffer("coords").framebuffer),s.readPixels(o,n-r-1,1,1,s.RGBA,s.UNSIGNED_BYTE,i),a.bindFramebuffer.set(null);const l=i[0]+(i[2]>>4<<8),h=i[1]+((15&i[2])<<8),c=this.coordsIndex[255-i[3]],u=c&&this.sourceCache.getTileByID(c);if(!u)return null;const d=this._coordsTextureSize,_=(1<<u.tileID.canonical.z)*d;return new e.Z((u.tileID.canonical.x*d+l)/_+u.tileID.wrap,(u.tileID.canonical.y*d+h)/_,this.getElevation(u.tileID,l,h,d))}depthAtPoint(t){const e=new Uint8Array(4),i=this.painter.context,a=i.gl;return i.bindFramebuffer.set(this.getFramebuffer("depth").framebuffer),a.readPixels(t.x,this.painter.height/devicePixelRatio-t.y-1,1,1,a.RGBA,a.UNSIGNED_BYTE,e),i.bindFramebuffer.set(null),(e[0]/16777216+e[1]/65536+e[2]/256+e[3])/256}getTerrainMesh(){if(this._mesh)return this._mesh;const t=this.painter.context,i=new e.bd,a=new e.aY,s=this.meshSize,o=e.X/s,r=s*s;for(let t=0;t<=s;t++)for(let e=0;e<=s;e++)i.emplaceBack(e*o,t*o,0);for(let t=0;t<r;t+=s+1)for(let e=0;e<s;e++)a.emplaceBack(e+t,s+e+t+1,s+e+t+2),a.emplaceBack(e+t,s+e+t+2,e+t+1);const n=i.length,l=n+2*(s+1);for(const t of [0,1])for(let a=0;a<=s;a++)for(const s of [0,1])i.emplaceBack(a*o,t*e.X,s);for(let t=0;t<2*s;t+=2)a.emplaceBack(l+t,l+t+1,l+t+3),a.emplaceBack(l+t,l+t+3,l+t+2),a.emplaceBack(n+t,n+t+3,n+t+1),a.emplaceBack(n+t,n+t+2,n+t+3);const h=i.length,c=h+2*(s+1);for(const t of [0,1])for(let a=0;a<=s;a++)for(const s of [0,1])i.emplaceBack(t*e.X,a*o,s);for(let t=0;t<2*s;t+=2)a.emplaceBack(h+t,h+t+1,h+t+3),a.emplaceBack(h+t,h+t+3,h+t+2),a.emplaceBack(c+t,c+t+3,c+t+1),a.emplaceBack(c+t,c+t+2,c+t+3);return this._mesh=new ga(t.createVertexBuffer(i,Ss.members),t.createIndexBuffer(a),e.a0.simpleSegment(0,0,i.length,a.length)),this._mesh}getMeshFrameDelta(t){return 2*Math.PI*e.be/Math.pow(2,t)/5}getMinTileElevationForLngLatZoom(t,e){var i;const{tileID:a}=this._getOverscaledTileIDFromLngLatZoom(t,e);return null!==(i=this.getMinMaxElevation(a).minElevation)&&void 0!==i?i:0}getMinMaxElevation(t){const e=this.getTerrainData(t).tile,i={minElevation:null,maxElevation:null};return e&&e.dem&&(i.minElevation=e.dem.min*this.exaggeration,i.maxElevation=e.dem.max*this.exaggeration),i}_getOverscaledTileIDFromLngLatZoom(t,i){const a=e.Z.fromLngLat(t.wrap()),s=(1<<i)*e.X,o=a.x*s,r=a.y*s,n=Math.floor(o/e.X),l=Math.floor(r/e.X);return {tileID:new e.S(i,0,i,n,l),mercatorX:o,mercatorY:r}}}class Ms{constructor(t,e,i){this._context=t,this._size=e,this._tileSize=i,this._objects=[],this._recentlyUsed=[],this._stamp=0;}destruct(){for(const t of this._objects)t.texture.destroy(),t.fbo.destroy();}_createObject(t){const e=this._context.createFramebuffer(this._tileSize,this._tileSize,!0,!0),i=new b(this._context,{width:this._tileSize,height:this._tileSize,data:null},this._context.gl.RGBA);return i.bind(this._context.gl.LINEAR,this._context.gl.CLAMP_TO_EDGE),e.depthAttachment.set(this._context.createRenderbuffer(this._context.gl.DEPTH_STENCIL,this._tileSize,this._tileSize)),e.colorAttachment.set(i.texture),{id:t,fbo:e,texture:i,stamp:-1,inUse:!1}}getObjectForId(t){return this._objects[t]}useObject(t){t.inUse=!0,this._recentlyUsed=this._recentlyUsed.filter((e=>t.id!==e)),this._recentlyUsed.push(t.id);}stampObject(t){t.stamp=++this._stamp;}getOrCreateFreeObject(){for(const t of this._recentlyUsed)if(!this._objects[t].inUse)return this._objects[t];if(this._objects.length>=this._size)throw new Error("No free RenderPool available, call freeAllObjects() required!");const t=this._createObject(this._objects.length);return this._objects.push(t),t}freeObject(t){t.inUse=!1;}freeAllObjects(){for(const t of this._objects)this.freeObject(t);}isFull(){return !(this._objects.length<this._size)&&!1===this._objects.some((t=>!t.inUse))}}const As={background:!0,fill:!0,line:!0,raster:!0,hillshade:!0};class Rs{constructor(t,e){this.painter=t,this.terrain=e,this.pool=new Ms(t.context,30,e.sourceCache.tileSize*e.qualityFactor);}destruct(){this.pool.destruct();}getTexture(t){return this.pool.getObjectForId(t.rtt[this._stacks.length-1].id).texture}prepareForRender(t,e){this._stacks=[],this._prevType=null,this._rttTiles=[],this._renderableTiles=this.terrain.sourceCache.getRenderableTiles(),this._renderableLayerIds=t._order.filter((i=>!t._layers[i].isHidden(e))),this._coordsDescendingInv={};for(const e in t.sourceCaches){this._coordsDescendingInv[e]={};const i=t.sourceCaches[e].getVisibleCoordinates();for(const t of i){const i=this.terrain.sourceCache.getTerrainCoords(t);for(const t in i)this._coordsDescendingInv[e][t]||(this._coordsDescendingInv[e][t]=[]),this._coordsDescendingInv[e][t].push(i[t]);}}this._coordsDescendingInvStr={};for(const e of t._order){const i=t._layers[e],a=i.source;if(As[i.type]&&!this._coordsDescendingInvStr[a]){this._coordsDescendingInvStr[a]={};for(const t in this._coordsDescendingInv[a])this._coordsDescendingInvStr[a][t]=this._coordsDescendingInv[a][t].map((t=>t.key)).sort().join();}}for(const t of this._renderableTiles)for(const e in this._coordsDescendingInvStr){const i=this._coordsDescendingInvStr[e][t.tileID.key];i&&i!==t.rttCoords[e]&&(t.rtt=[]);}}renderLayer(t){if(t.isHidden(this.painter.transform.zoom))return !1;const i=t.type,a=this.painter,s=this._renderableLayerIds[this._renderableLayerIds.length-1]===t.id;if(As[i]&&(this._prevType&&As[this._prevType]||this._stacks.push([]),this._prevType=i,this._stacks[this._stacks.length-1].push(t.id),!s))return !0;if(As[this._prevType]||As[i]&&s){this._prevType=i;const t=this._stacks.length-1,s=this._stacks[t]||[];for(const i of this._renderableTiles){if(this.pool.isFull()&&(fa(this.painter,this.terrain,this._rttTiles),this._rttTiles=[],this.pool.freeAllObjects()),this._rttTiles.push(i),i.rtt[t]){const e=this.pool.getObjectForId(i.rtt[t].id);if(e.stamp===i.rtt[t].stamp){this.pool.useObject(e);continue}}const o=this.pool.getOrCreateFreeObject();this.pool.useObject(o),this.pool.stampObject(o),i.rtt[t]={id:o.id,stamp:o.stamp},a.context.bindFramebuffer.set(o.fbo.framebuffer),a.context.clear({color:e.aM.transparent,stencil:0}),a.currentStencilSource=void 0;for(let t=0;t<s.length;t++){const e=a.style._layers[s[t]],r=e.source?this._coordsDescendingInv[e.source][i.tileID.key]:[i.tileID];a.context.viewport.set([0,0,o.fbo.width,o.fbo.height]),a._renderTileClippingMasks(e,r),a.renderLayer(a,a.style.sourceCaches[e.source],e,r),e.source&&(i.rttCoords[e.source]=this._coordsDescendingInvStr[e.source][i.tileID.key]);}}return fa(this.painter,this.terrain,this._rttTiles),this._rttTiles=[],this.pool.freeAllObjects(),As[i]}return !1}}const ks={"AttributionControl.ToggleAttribution":"Toggle attribution","AttributionControl.MapFeedback":"Map feedback","FullscreenControl.Enter":"Enter fullscreen","FullscreenControl.Exit":"Exit fullscreen","GeolocateControl.FindMyLocation":"Find my location","GeolocateControl.LocationNotAvailable":"Location not available","LogoControl.Title":"MapLibre logo","Map.Title":"Map","Marker.Title":"Map marker","NavigationControl.ResetBearing":"Reset bearing to north","NavigationControl.ZoomIn":"Zoom in","NavigationControl.ZoomOut":"Zoom out","Popup.Close":"Close popup","ScaleControl.Feet":"ft","ScaleControl.Meters":"m","ScaleControl.Kilometers":"km","ScaleControl.Miles":"mi","ScaleControl.NauticalMiles":"nm","TerrainControl.Enable":"Enable terrain","TerrainControl.Disable":"Disable terrain","CooperativeGesturesHandler.WindowsHelpText":"Use Ctrl + scroll to zoom the map","CooperativeGesturesHandler.MacHelpText":"Use ⌘ + scroll to zoom the map","CooperativeGesturesHandler.MobileHelpText":"Use two fingers to move the map"},Ls=i,Fs={hash:!1,interactive:!0,bearingSnap:7,attributionControl:Is,maplibreLogo:!1,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1,refreshExpiredTiles:!0,scrollZoom:!0,minZoom:-2,maxZoom:22,minPitch:0,maxPitch:60,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,touchZoomRotate:!0,touchPitch:!0,cooperativeGestures:!1,trackResize:!0,center:[0,0],zoom:0,bearing:0,pitch:0,renderWorldCopies:!0,maxTileCacheSize:null,maxTileCacheZoomLevels:e.a.MAX_TILE_CACHE_ZOOM_LEVELS,transformRequest:null,transformCameraUpdate:null,fadeDuration:300,crossSourceCollisions:!0,clickTolerance:3,localIdeographFontFamily:"sans-serif",pitchWithRotate:!0,validateStyle:!0,maxCanvasSize:[4096,4096],cancelPendingTileRequestsWhileZooming:!0},Bs=t=>{t.touchstart=t.dragStart,t.touchmoveWindow=t.dragMove,t.touchend=t.dragEnd;},Os={showCompass:!0,showZoom:!0,visualizePitch:!1};class Ns{constructor(t,i,a=!1){this.mousedown=t=>{this.startMouse(e.e({},t,{ctrlKey:!0,preventDefault:()=>t.preventDefault()}),r.mousePos(this.element,t)),r.addEventListener(window,"mousemove",this.mousemove),r.addEventListener(window,"mouseup",this.mouseup);},this.mousemove=t=>{this.moveMouse(t,r.mousePos(this.element,t));},this.mouseup=t=>{this.mouseRotate.dragEnd(t),this.mousePitch&&this.mousePitch.dragEnd(t),this.offTemp();},this.touchstart=t=>{1!==t.targetTouches.length?this.reset():(this._startPos=this._lastPos=r.touchPos(this.element,t.targetTouches)[0],this.startTouch(t,this._startPos),r.addEventListener(window,"touchmove",this.touchmove,{passive:!1}),r.addEventListener(window,"touchend",this.touchend));},this.touchmove=t=>{1!==t.targetTouches.length?this.reset():(this._lastPos=r.touchPos(this.element,t.targetTouches)[0],this.moveTouch(t,this._lastPos));},this.touchend=t=>{0===t.targetTouches.length&&this._startPos&&this._lastPos&&this._startPos.dist(this._lastPos)<this._clickTolerance&&this.element.click(),delete this._startPos,delete this._lastPos,this.offTemp();},this.reset=()=>{this.mouseRotate.reset(),this.mousePitch&&this.mousePitch.reset(),this.touchRotate.reset(),this.touchPitch&&this.touchPitch.reset(),delete this._startPos,delete this._lastPos,this.offTemp();},this._clickTolerance=10;const s=t.dragRotate._mouseRotate.getClickTolerance(),o=t.dragRotate._mousePitch.getClickTolerance();this.element=i,this.mouseRotate=Ka({clickTolerance:s,enable:!0}),this.touchRotate=(({enable:t,clickTolerance:e,bearingDegreesPerPixelMoved:i=.8})=>{const a=new $a;return new Ga({clickTolerance:e,move:(t,e)=>({bearingDelta:(e.x-t.x)*i}),moveStateManager:a,enable:t,assignEvents:Bs})})({clickTolerance:s,enable:!0}),this.map=t,a&&(this.mousePitch=Ja({clickTolerance:o,enable:!0}),this.touchPitch=(({enable:t,clickTolerance:e,pitchDegreesPerPixelMoved:i=-.5})=>{const a=new $a;return new Ga({clickTolerance:e,move:(t,e)=>({pitchDelta:(e.y-t.y)*i}),moveStateManager:a,enable:t,assignEvents:Bs})})({clickTolerance:o,enable:!0})),r.addEventListener(i,"mousedown",this.mousedown),r.addEventListener(i,"touchstart",this.touchstart,{passive:!1}),r.addEventListener(i,"touchcancel",this.reset);}startMouse(t,e){this.mouseRotate.dragStart(t,e),this.mousePitch&&this.mousePitch.dragStart(t,e),r.disableDrag();}startTouch(t,e){this.touchRotate.dragStart(t,e),this.touchPitch&&this.touchPitch.dragStart(t,e),r.disableDrag();}moveMouse(t,e){const i=this.map,{bearingDelta:a}=this.mouseRotate.dragMove(t,e)||{};if(a&&i.setBearing(i.getBearing()+a),this.mousePitch){const{pitchDelta:a}=this.mousePitch.dragMove(t,e)||{};a&&i.setPitch(i.getPitch()+a);}}moveTouch(t,e){const i=this.map,{bearingDelta:a}=this.touchRotate.dragMove(t,e)||{};if(a&&i.setBearing(i.getBearing()+a),this.touchPitch){const{pitchDelta:a}=this.touchPitch.dragMove(t,e)||{};a&&i.setPitch(i.getPitch()+a);}}off(){const t=this.element;r.removeEventListener(t,"mousedown",this.mousedown),r.removeEventListener(t,"touchstart",this.touchstart,{passive:!1}),r.removeEventListener(window,"touchmove",this.touchmove,{passive:!1}),r.removeEventListener(window,"touchend",this.touchend),r.removeEventListener(t,"touchcancel",this.reset),this.offTemp();}offTemp(){r.enableDrag(),r.removeEventListener(window,"mousemove",this.mousemove),r.removeEventListener(window,"mouseup",this.mouseup),r.removeEventListener(window,"touchmove",this.touchmove,{passive:!1}),r.removeEventListener(window,"touchend",this.touchend);}}let Us;function js(t,i,a){const s=new e.N(t.lng,t.lat);if(t=new e.N(t.lng,t.lat),i){const s=new e.N(t.lng-360,t.lat),o=new e.N(t.lng+360,t.lat),r=a.locationPoint(t).distSqr(i);a.locationPoint(s).distSqr(i)<r?t=s:a.locationPoint(o).distSqr(i)<r&&(t=o);}for(;Math.abs(t.lng-a.center.lng)>180;){const e=a.locationPoint(t);if(e.x>=0&&e.y>=0&&e.x<=a.width&&e.y<=a.height)break;t.lng>a.center.lng?t.lng-=360:t.lng+=360;}return t.lng!==s.lng&&a.locationPoint(t).y>a.height/2-a.getHorizon()?t:s}const Zs={center:"translate(-50%,-50%)",top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"};function qs(t,e,i){const a=t.classList;for(const t in Zs)a.remove(`maplibregl-${i}-anchor-${t}`);a.add(`maplibregl-${i}-anchor-${e}`);}class Vs extends e.E{constructor(t){if(super(),this._onKeyPress=t=>{const e=t.code,i=t.charCode||t.keyCode;"Space"!==e&&"Enter"!==e&&32!==i&&13!==i||this.togglePopup();},this._onMapClick=t=>{const e=t.originalEvent.target,i=this._element;this._popup&&(e===i||i.contains(e))&&this.togglePopup();},this._update=t=>{var e;if(!this._map)return;const i=this._map.loaded()&&!this._map.isMoving();("terrain"===(null==t?void 0:t.type)||"render"===(null==t?void 0:t.type)&&!i)&&this._map.once("render",this._update),this._lngLat=this._map.transform.renderWorldCopies?js(this._lngLat,this._flatPos,this._map.transform):null===(e=this._lngLat)||void 0===e?void 0:e.wrap(),this._flatPos=this._pos=this._map.project(this._lngLat)._add(this._offset),this._map.terrain&&(this._flatPos=this._map.transform.locationPoint(this._lngLat)._add(this._offset));let a="";"viewport"===this._rotationAlignment||"auto"===this._rotationAlignment?a=`rotateZ(${this._rotation}deg)`:"map"===this._rotationAlignment&&(a=`rotateZ(${this._rotation-this._map.getBearing()}deg)`);let s="";"viewport"===this._pitchAlignment||"auto"===this._pitchAlignment?s="rotateX(0deg)":"map"===this._pitchAlignment&&(s=`rotateX(${this._map.getPitch()}deg)`),this._subpixelPositioning||t&&"moveend"!==t.type||(this._pos=this._pos.round()),r.setTransform(this._element,`${Zs[this._anchor]} translate(${this._pos.x}px, ${this._pos.y}px) ${s} ${a}`),o.frameAsync(new AbortController).then((()=>{this._updateOpacity(t&&"moveend"===t.type);})).catch((()=>{}));},this._onMove=t=>{if(!this._isDragging){const e=this._clickTolerance||this._map._clickTolerance;this._isDragging=t.point.dist(this._pointerdownPos)>=e;}this._isDragging&&(this._pos=t.point.sub(this._positionDelta),this._lngLat=this._map.unproject(this._pos),this.setLngLat(this._lngLat),this._element.style.pointerEvents="none","pending"===this._state&&(this._state="active",this.fire(new e.k("dragstart"))),this.fire(new e.k("drag")));},this._onUp=()=>{this._element.style.pointerEvents="auto",this._positionDelta=null,this._pointerdownPos=null,this._isDragging=!1,this._map.off("mousemove",this._onMove),this._map.off("touchmove",this._onMove),"active"===this._state&&this.fire(new e.k("dragend")),this._state="inactive";},this._addDragHandler=t=>{this._element.contains(t.originalEvent.target)&&(t.preventDefault(),this._positionDelta=t.point.sub(this._pos).add(this._offset),this._pointerdownPos=t.point,this._state="pending",this._map.on("mousemove",this._onMove),this._map.on("touchmove",this._onMove),this._map.once("mouseup",this._onUp),this._map.once("touchend",this._onUp));},this._anchor=t&&t.anchor||"center",this._color=t&&t.color||"#3FB1CE",this._scale=t&&t.scale||1,this._draggable=t&&t.draggable||!1,this._clickTolerance=t&&t.clickTolerance||0,this._subpixelPositioning=t&&t.subpixelPositioning||!1,this._isDragging=!1,this._state="inactive",this._rotation=t&&t.rotation||0,this._rotationAlignment=t&&t.rotationAlignment||"auto",this._pitchAlignment=t&&t.pitchAlignment&&"auto"!==t.pitchAlignment?t.pitchAlignment:this._rotationAlignment,this.setOpacity(),this.setOpacity(null==t?void 0:t.opacity,null==t?void 0:t.opacityWhenCovered),t&&t.element)this._element=t.element,this._offset=e.P.convert(t&&t.offset||[0,0]);else {this._defaultMarker=!0,this._element=r.create("div");const i=r.createNS("http://www.w3.org/2000/svg","svg"),a=41,s=27;i.setAttributeNS(null,"display","block"),i.setAttributeNS(null,"height",`${a}px`),i.setAttributeNS(null,"width",`${s}px`),i.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`);const o=r.createNS("http://www.w3.org/2000/svg","g");o.setAttributeNS(null,"stroke","none"),o.setAttributeNS(null,"stroke-width","1"),o.setAttributeNS(null,"fill","none"),o.setAttributeNS(null,"fill-rule","evenodd");const n=r.createNS("http://www.w3.org/2000/svg","g");n.setAttributeNS(null,"fill-rule","nonzero");const l=r.createNS("http://www.w3.org/2000/svg","g");l.setAttributeNS(null,"transform","translate(3.0, 29.0)"),l.setAttributeNS(null,"fill","#000000");const h=[{rx:"10.5",ry:"5.25002273"},{rx:"10.5",ry:"5.25002273"},{rx:"9.5",ry:"4.77275007"},{rx:"8.5",ry:"4.29549936"},{rx:"7.5",ry:"3.81822308"},{rx:"6.5",ry:"3.34094679"},{rx:"5.5",ry:"2.86367051"},{rx:"4.5",ry:"2.38636864"}];for(const t of h){const e=r.createNS("http://www.w3.org/2000/svg","ellipse");e.setAttributeNS(null,"opacity","0.04"),e.setAttributeNS(null,"cx","10.5"),e.setAttributeNS(null,"cy","5.80029008"),e.setAttributeNS(null,"rx",t.rx),e.setAttributeNS(null,"ry",t.ry),l.appendChild(e);}const c=r.createNS("http://www.w3.org/2000/svg","g");c.setAttributeNS(null,"fill",this._color);const u=r.createNS("http://www.w3.org/2000/svg","path");u.setAttributeNS(null,"d","M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z"),c.appendChild(u);const d=r.createNS("http://www.w3.org/2000/svg","g");d.setAttributeNS(null,"opacity","0.25"),d.setAttributeNS(null,"fill","#000000");const _=r.createNS("http://www.w3.org/2000/svg","path");_.setAttributeNS(null,"d","M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z"),d.appendChild(_);const p=r.createNS("http://www.w3.org/2000/svg","g");p.setAttributeNS(null,"transform","translate(6.0, 7.0)"),p.setAttributeNS(null,"fill","#FFFFFF");const m=r.createNS("http://www.w3.org/2000/svg","g");m.setAttributeNS(null,"transform","translate(8.0, 8.0)");const f=r.createNS("http://www.w3.org/2000/svg","circle");f.setAttributeNS(null,"fill","#000000"),f.setAttributeNS(null,"opacity","0.25"),f.setAttributeNS(null,"cx","5.5"),f.setAttributeNS(null,"cy","5.5"),f.setAttributeNS(null,"r","5.4999962");const g=r.createNS("http://www.w3.org/2000/svg","circle");g.setAttributeNS(null,"fill","#FFFFFF"),g.setAttributeNS(null,"cx","5.5"),g.setAttributeNS(null,"cy","5.5"),g.setAttributeNS(null,"r","5.4999962"),m.appendChild(f),m.appendChild(g),n.appendChild(l),n.appendChild(c),n.appendChild(d),n.appendChild(p),n.appendChild(m),i.appendChild(n),i.setAttributeNS(null,"height",a*this._scale+"px"),i.setAttributeNS(null,"width",s*this._scale+"px"),this._element.appendChild(i),this._offset=e.P.convert(t&&t.offset||[0,-14]);}if(this._element.classList.add("maplibregl-marker"),this._element.addEventListener("dragstart",(t=>{t.preventDefault();})),this._element.addEventListener("mousedown",(t=>{t.preventDefault();})),qs(this._element,this._anchor,"marker"),t&&t.className)for(const e of t.className.split(" "))this._element.classList.add(e);this._popup=null;}addTo(t){return this.remove(),this._map=t,this._element.setAttribute("aria-label",t._getUIString("Marker.Title")),t.getCanvasContainer().appendChild(this._element),t.on("move",this._update),t.on("moveend",this._update),t.on("terrain",this._update),this.setDraggable(this._draggable),this._update(),this._map.on("click",this._onMapClick),this}remove(){return this._opacityTimeout&&(clearTimeout(this._opacityTimeout),delete this._opacityTimeout),this._map&&(this._map.off("click",this._onMapClick),this._map.off("move",this._update),this._map.off("moveend",this._update),this._map.off("terrain",this._update),this._map.off("mousedown",this._addDragHandler),this._map.off("touchstart",this._addDragHandler),this._map.off("mouseup",this._onUp),this._map.off("touchend",this._onUp),this._map.off("mousemove",this._onMove),this._map.off("touchmove",this._onMove),delete this._map),r.remove(this._element),this._popup&&this._popup.remove(),this}getLngLat(){return this._lngLat}setLngLat(t){return this._lngLat=e.N.convert(t),this._pos=null,this._popup&&this._popup.setLngLat(this._lngLat),this._update(),this}getElement(){return this._element}setPopup(t){if(this._popup&&(this._popup.remove(),this._popup=null,this._element.removeEventListener("keypress",this._onKeyPress),this._originalTabIndex||this._element.removeAttribute("tabindex")),t){if(!("offset"in t.options)){const e=38.1,i=13.5,a=Math.abs(i)/Math.SQRT2;t.options.offset=this._defaultMarker?{top:[0,0],"top-left":[0,0],"top-right":[0,0],bottom:[0,-e],"bottom-left":[a,-1*(e-i+a)],"bottom-right":[-a,-1*(e-i+a)],left:[i,-1*(e-i)],right:[-i,-1*(e-i)]}:this._offset;}this._popup=t,this._originalTabIndex=this._element.getAttribute("tabindex"),this._originalTabIndex||this._element.setAttribute("tabindex","0"),this._element.addEventListener("keypress",this._onKeyPress);}return this}setSubpixelPositioning(t){return this._subpixelPositioning=t,this}getPopup(){return this._popup}togglePopup(){const t=this._popup;return this._element.style.opacity===this._opacityWhenCovered?this:t?(t.isOpen()?t.remove():(t.setLngLat(this._lngLat),t.addTo(this._map)),this):this}_updateOpacity(t=!1){var i,a;if(!(null===(i=this._map)||void 0===i?void 0:i.terrain))return void(this._element.style.opacity!==this._opacity&&(this._element.style.opacity=this._opacity));if(t)this._opacityTimeout=null;else {if(this._opacityTimeout)return;this._opacityTimeout=setTimeout((()=>{this._opacityTimeout=null;}),100);}const s=this._map,o=s.terrain.depthAtPoint(this._pos),r=s.terrain.getElevationForLngLatZoom(this._lngLat,s.transform.tileZoom);if(s.transform.lngLatToCameraDepth(this._lngLat,r)-o<.006)return void(this._element.style.opacity=this._opacity);const n=-this._offset.y/s.transform._pixelPerMeter,l=Math.sin(s.getPitch()*Math.PI/180)*n,h=s.terrain.depthAtPoint(new e.P(this._pos.x,this._pos.y-this._offset.y)),c=s.transform.lngLatToCameraDepth(this._lngLat,r+l)-h>.006;(null===(a=this._popup)||void 0===a?void 0:a.isOpen())&&c&&this._popup.remove(),this._element.style.opacity=c?this._opacityWhenCovered:this._opacity;}getOffset(){return this._offset}setOffset(t){return this._offset=e.P.convert(t),this._update(),this}addClassName(t){this._element.classList.add(t);}removeClassName(t){this._element.classList.remove(t);}toggleClassName(t){return this._element.classList.toggle(t)}setDraggable(t){return this._draggable=!!t,this._map&&(t?(this._map.on("mousedown",this._addDragHandler),this._map.on("touchstart",this._addDragHandler)):(this._map.off("mousedown",this._addDragHandler),this._map.off("touchstart",this._addDragHandler))),this}isDraggable(){return this._draggable}setRotation(t){return this._rotation=t||0,this._update(),this}getRotation(){return this._rotation}setRotationAlignment(t){return this._rotationAlignment=t||"auto",this._update(),this}getRotationAlignment(){return this._rotationAlignment}setPitchAlignment(t){return this._pitchAlignment=t&&"auto"!==t?t:this._rotationAlignment,this._update(),this}getPitchAlignment(){return this._pitchAlignment}setOpacity(t,e){return void 0===t&&void 0===e&&(this._opacity="1",this._opacityWhenCovered="0.2"),void 0!==t&&(this._opacity=t),void 0!==e&&(this._opacityWhenCovered=e),this._map&&this._updateOpacity(!0),this}}const Gs={positionOptions:{enableHighAccuracy:!1,maximumAge:0,timeout:6e3},fitBoundsOptions:{maxZoom:15},trackUserLocation:!1,showAccuracyCircle:!0,showUserLocation:!0};let Hs=0,Ws=!1;const $s={maxWidth:100,unit:"metric"};function Xs(t,e,i){const a=i&&i.maxWidth||100,s=t._container.clientHeight/2,o=t.unproject([0,s]),r=t.unproject([a,s]),n=o.distanceTo(r);if(i&&"imperial"===i.unit){const i=3.2808*n;i>5280?Ks(e,a,i/5280,t._getUIString("ScaleControl.Miles")):Ks(e,a,i,t._getUIString("ScaleControl.Feet"));}else i&&"nautical"===i.unit?Ks(e,a,n/1852,t._getUIString("ScaleControl.NauticalMiles")):n>=1e3?Ks(e,a,n/1e3,t._getUIString("ScaleControl.Kilometers")):Ks(e,a,n,t._getUIString("ScaleControl.Meters"));}function Ks(t,e,i,a){const s=function(t){const e=Math.pow(10,`${Math.floor(t)}`.length-1);let i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:i>=1?1:function(t){const e=Math.pow(10,Math.ceil(-Math.log(t)/Math.LN10));return Math.round(t*e)/e}(i),e*i}(i);t.style.width=e*(s/i)+"px",t.innerHTML=`${s}&nbsp;${a}`;}const Js={closeButton:!0,closeOnClick:!0,focusAfterOpen:!0,className:"",maxWidth:"240px",subpixelPositioning:!1},Ys=["a[href]","[tabindex]:not([tabindex='-1'])","[contenteditable]:not([contenteditable='false'])","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].join(", ");function Qs(t){if(t){if("number"==typeof t){const i=Math.round(Math.abs(t)/Math.SQRT2);return {center:new e.P(0,0),top:new e.P(0,t),"top-left":new e.P(i,i),"top-right":new e.P(-i,i),bottom:new e.P(0,-t),"bottom-left":new e.P(i,-i),"bottom-right":new e.P(-i,-i),left:new e.P(t,0),right:new e.P(-t,0)}}if(t instanceof e.P||Array.isArray(t)){const i=e.P.convert(t);return {center:i,top:i,"top-left":i,"top-right":i,bottom:i,"bottom-left":i,"bottom-right":i,left:i,right:i}}return {center:e.P.convert(t.center||[0,0]),top:e.P.convert(t.top||[0,0]),"top-left":e.P.convert(t["top-left"]||[0,0]),"top-right":e.P.convert(t["top-right"]||[0,0]),bottom:e.P.convert(t.bottom||[0,0]),"bottom-left":e.P.convert(t["bottom-left"]||[0,0]),"bottom-right":e.P.convert(t["bottom-right"]||[0,0]),left:e.P.convert(t.left||[0,0]),right:e.P.convert(t.right||[0,0])}}return Qs(new e.P(0,0))}const to=i;t.AJAXError=e.bh,t.Evented=e.E,t.LngLat=e.N,t.MercatorCoordinate=e.Z,t.Point=e.P,t.addProtocol=e.bi,t.config=e.a,t.removeProtocol=e.bj,t.AttributionControl=Es,t.BoxZoomHandler=Ua,t.CanvasSource=et,t.CooperativeGesturesHandler=vs,t.DoubleClickZoomHandler=ds,t.DragPanHandler=ms,t.DragRotateHandler=fs,t.EdgeInsets=ba,t.FullscreenControl=class extends e.E{constructor(t={}){super(),this._onFullscreenChange=()=>{var t;let e=window.document.fullscreenElement||window.document.mozFullScreenElement||window.document.webkitFullscreenElement||window.document.msFullscreenElement;for(;null===(t=null==e?void 0:e.shadowRoot)||void 0===t?void 0:t.fullscreenElement;)e=e.shadowRoot.fullscreenElement;e===this._container!==this._fullscreen&&this._handleFullscreenChange();},this._onClickFullscreen=()=>{this._isFullscreen()?this._exitFullscreen():this._requestFullscreen();},this._fullscreen=!1,t&&t.container&&(t.container instanceof HTMLElement?this._container=t.container:e.w("Full screen control 'container' must be a DOM element.")),"onfullscreenchange"in document?this._fullscreenchange="fullscreenchange":"onmozfullscreenchange"in document?this._fullscreenchange="mozfullscreenchange":"onwebkitfullscreenchange"in document?this._fullscreenchange="webkitfullscreenchange":"onmsfullscreenchange"in document&&(this._fullscreenchange="MSFullscreenChange");}onAdd(t){return this._map=t,this._container||(this._container=this._map.getContainer()),this._controlContainer=r.create("div","maplibregl-ctrl maplibregl-ctrl-group"),this._setupUI(),this._controlContainer}onRemove(){r.remove(this._controlContainer),this._map=null,window.document.removeEventListener(this._fullscreenchange,this._onFullscreenChange);}_setupUI(){const t=this._fullscreenButton=r.create("button","maplibregl-ctrl-fullscreen",this._controlContainer);r.create("span","maplibregl-ctrl-icon",t).setAttribute("aria-hidden","true"),t.type="button",this._updateTitle(),this._fullscreenButton.addEventListener("click",this._onClickFullscreen),window.document.addEventListener(this._fullscreenchange,this._onFullscreenChange);}_updateTitle(){const t=this._getTitle();this._fullscreenButton.setAttribute("aria-label",t),this._fullscreenButton.title=t;}_getTitle(){return this._map._getUIString(this._isFullscreen()?"FullscreenControl.Exit":"FullscreenControl.Enter")}_isFullscreen(){return this._fullscreen}_handleFullscreenChange(){this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle("maplibregl-ctrl-shrink"),this._fullscreenButton.classList.toggle("maplibregl-ctrl-fullscreen"),this._updateTitle(),this._fullscreen?(this.fire(new e.k("fullscreenstart")),this._prevCooperativeGesturesEnabled=this._map.cooperativeGestures.isEnabled(),this._map.cooperativeGestures.disable()):(this.fire(new e.k("fullscreenend")),this._prevCooperativeGesturesEnabled&&this._map.cooperativeGestures.enable());}_exitFullscreen(){window.document.exitFullscreen?window.document.exitFullscreen():window.document.mozCancelFullScreen?window.document.mozCancelFullScreen():window.document.msExitFullscreen?window.document.msExitFullscreen():window.document.webkitCancelFullScreen?window.document.webkitCancelFullScreen():this._togglePseudoFullScreen();}_requestFullscreen(){this._container.requestFullscreen?this._container.requestFullscreen():this._container.mozRequestFullScreen?this._container.mozRequestFullScreen():this._container.msRequestFullscreen?this._container.msRequestFullscreen():this._container.webkitRequestFullscreen?this._container.webkitRequestFullscreen():this._togglePseudoFullScreen();}_togglePseudoFullScreen(){this._container.classList.toggle("maplibregl-pseudo-fullscreen"),this._handleFullscreenChange(),this._map.resize();}},t.GeoJSONSource=J,t.GeolocateControl=class extends e.E{constructor(t){super(),this._onSuccess=t=>{if(this._map){if(this._isOutOfMapMaxBounds(t))return this._setErrorState(),this.fire(new e.k("outofmaxbounds",t)),this._updateMarker(),void this._finish();if(this.options.trackUserLocation)switch(this._lastKnownPosition=t,this._watchState){case"WAITING_ACTIVE":case"ACTIVE_LOCK":case"ACTIVE_ERROR":this._watchState="ACTIVE_LOCK",this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active-error"),this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active");break;case"BACKGROUND":case"BACKGROUND_ERROR":this._watchState="BACKGROUND",this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background-error"),this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-background");break;default:throw new Error(`Unexpected watchState ${this._watchState}`)}this.options.showUserLocation&&"OFF"!==this._watchState&&this._updateMarker(t),this.options.trackUserLocation&&"ACTIVE_LOCK"!==this._watchState||this._updateCamera(t),this.options.showUserLocation&&this._dotElement.classList.remove("maplibregl-user-location-dot-stale"),this.fire(new e.k("geolocate",t)),this._finish();}},this._updateCamera=t=>{const i=new e.N(t.coords.longitude,t.coords.latitude),a=t.coords.accuracy,s=this._map.getBearing(),o=e.e({bearing:s},this.options.fitBoundsOptions),r=H.fromLngLat(i,a);this._map.fitBounds(r,o,{geolocateSource:!0});},this._updateMarker=t=>{if(t){const i=new e.N(t.coords.longitude,t.coords.latitude);this._accuracyCircleMarker.setLngLat(i).addTo(this._map),this._userLocationDotMarker.setLngLat(i).addTo(this._map),this._accuracy=t.coords.accuracy,this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius();}else this._userLocationDotMarker.remove(),this._accuracyCircleMarker.remove();},this._onZoom=()=>{this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius();},this._onError=t=>{if(this._map){if(this.options.trackUserLocation)if(1===t.code){this._watchState="OFF",this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active-error"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background-error"),this._geolocateButton.disabled=!0;const t=this._map._getUIString("GeolocateControl.LocationNotAvailable");this._geolocateButton.title=t,this._geolocateButton.setAttribute("aria-label",t),void 0!==this._geolocationWatchID&&this._clearWatch();}else {if(3===t.code&&Ws)return;this._setErrorState();}"OFF"!==this._watchState&&this.options.showUserLocation&&this._dotElement.classList.add("maplibregl-user-location-dot-stale"),this.fire(new e.k("error",t)),this._finish();}},this._finish=()=>{this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0;},this._setupUI=()=>{this._map&&(this._container.addEventListener("contextmenu",(t=>t.preventDefault())),this._geolocateButton=r.create("button","maplibregl-ctrl-geolocate",this._container),r.create("span","maplibregl-ctrl-icon",this._geolocateButton).setAttribute("aria-hidden","true"),this._geolocateButton.type="button",this._geolocateButton.disabled=!0);},this._finishSetupUI=t=>{if(this._map){if(!1===t){e.w("Geolocation support is not available so the GeolocateControl will be disabled.");const t=this._map._getUIString("GeolocateControl.LocationNotAvailable");this._geolocateButton.disabled=!0,this._geolocateButton.title=t,this._geolocateButton.setAttribute("aria-label",t);}else {const t=this._map._getUIString("GeolocateControl.FindMyLocation");this._geolocateButton.disabled=!1,this._geolocateButton.title=t,this._geolocateButton.setAttribute("aria-label",t);}this.options.trackUserLocation&&(this._geolocateButton.setAttribute("aria-pressed","false"),this._watchState="OFF"),this.options.showUserLocation&&(this._dotElement=r.create("div","maplibregl-user-location-dot"),this._userLocationDotMarker=new Vs({element:this._dotElement}),this._circleElement=r.create("div","maplibregl-user-location-accuracy-circle"),this._accuracyCircleMarker=new Vs({element:this._circleElement,pitchAlignment:"map"}),this.options.trackUserLocation&&(this._watchState="OFF"),this._map.on("zoom",this._onZoom)),this._geolocateButton.addEventListener("click",(()=>this.trigger())),this._setup=!0,this.options.trackUserLocation&&this._map.on("movestart",(t=>{t.geolocateSource||"ACTIVE_LOCK"!==this._watchState||t.originalEvent&&"resize"===t.originalEvent.type||(this._watchState="BACKGROUND",this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"),this.fire(new e.k("trackuserlocationend")),this.fire(new e.k("userlocationlostfocus")));}));}},this.options=e.e({},Gs,t);}onAdd(t){return this._map=t,this._container=r.create("div","maplibregl-ctrl maplibregl-ctrl-group"),this._setupUI(),function(){return e._(this,arguments,void 0,(function*(t=!1){if(void 0!==Us&&!t)return Us;if(void 0===window.navigator.permissions)return Us=!!window.navigator.geolocation,Us;try{const t=yield window.navigator.permissions.query({name:"geolocation"});Us="denied"!==t.state;}catch(t){Us=!!window.navigator.geolocation;}return Us}))}().then((t=>this._finishSetupUI(t))),this._container}onRemove(){void 0!==this._geolocationWatchID&&(window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0),this.options.showUserLocation&&this._userLocationDotMarker&&this._userLocationDotMarker.remove(),this.options.showAccuracyCircle&&this._accuracyCircleMarker&&this._accuracyCircleMarker.remove(),r.remove(this._container),this._map.off("zoom",this._onZoom),this._map=void 0,Hs=0,Ws=!1;}_isOutOfMapMaxBounds(t){const e=this._map.getMaxBounds(),i=t.coords;return e&&(i.longitude<e.getWest()||i.longitude>e.getEast()||i.latitude<e.getSouth()||i.latitude>e.getNorth())}_setErrorState(){switch(this._watchState){case"WAITING_ACTIVE":this._watchState="ACTIVE_ERROR",this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"),this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active-error");break;case"ACTIVE_LOCK":this._watchState="ACTIVE_ERROR",this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"),this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active-error"),this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting");break;case"BACKGROUND":this._watchState="BACKGROUND_ERROR",this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background"),this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-background-error"),this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting");break;case"ACTIVE_ERROR":break;default:throw new Error(`Unexpected watchState ${this._watchState}`)}}_updateCircleRadius(){const t=this._map.getBounds(),e=t.getSouthEast(),i=t.getNorthEast(),a=e.distanceTo(i),s=Math.ceil(this._accuracy/(a/this._map._container.clientHeight)*2);this._circleElement.style.width=`${s}px`,this._circleElement.style.height=`${s}px`;}trigger(){if(!this._setup)return e.w("Geolocate control triggered before added to a map"),!1;if(this.options.trackUserLocation){switch(this._watchState){case"OFF":this._watchState="WAITING_ACTIVE",this.fire(new e.k("trackuserlocationstart"));break;case"WAITING_ACTIVE":case"ACTIVE_LOCK":case"ACTIVE_ERROR":case"BACKGROUND_ERROR":Hs--,Ws=!1,this._watchState="OFF",this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active-error"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background-error"),this.fire(new e.k("trackuserlocationend"));break;case"BACKGROUND":this._watchState="ACTIVE_LOCK",this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background"),this._lastKnownPosition&&this._updateCamera(this._lastKnownPosition),this.fire(new e.k("trackuserlocationstart")),this.fire(new e.k("userlocationfocus"));break;default:throw new Error(`Unexpected watchState ${this._watchState}`)}switch(this._watchState){case"WAITING_ACTIVE":this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active");break;case"ACTIVE_LOCK":this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active");break;case"OFF":break;default:throw new Error(`Unexpected watchState ${this._watchState}`)}if("OFF"===this._watchState&&void 0!==this._geolocationWatchID)this._clearWatch();else if(void 0===this._geolocationWatchID){let t;this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting"),this._geolocateButton.setAttribute("aria-pressed","true"),Hs++,Hs>1?(t={maximumAge:6e5,timeout:0},Ws=!0):(t=this.options.positionOptions,Ws=!1),this._geolocationWatchID=window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,t);}}else window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,this.options.positionOptions),this._timeoutId=setTimeout(this._finish,1e4);return !0}_clearWatch(){window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0,this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"),this._geolocateButton.setAttribute("aria-pressed","false"),this.options.showUserLocation&&this._updateMarker(null);}},t.Hash=Ea,t.ImageSource=Q,t.KeyboardHandler=ls,t.LngLatBounds=H,t.LogoControl=Ps,t.Map=class extends Ts{constructor(t){e.bf.mark(e.bg.create);const i=Object.assign(Object.assign({},Fs),t);if(null!=i.minZoom&&null!=i.maxZoom&&i.minZoom>i.maxZoom)throw new Error("maxZoom must be greater than or equal to minZoom");if(null!=i.minPitch&&null!=i.maxPitch&&i.minPitch>i.maxPitch)throw new Error("maxPitch must be greater than or equal to minPitch");if(null!=i.minPitch&&i.minPitch<0)throw new Error("minPitch must be greater than or equal to 0");if(null!=i.maxPitch&&i.maxPitch>85)throw new Error("maxPitch must be less than or equal to 85");if(super(new Ta(i.minZoom,i.maxZoom,i.minPitch,i.maxPitch,i.renderWorldCopies),{bearingSnap:i.bearingSnap}),this._idleTriggered=!1,this._crossFadingFactor=1,this._renderTaskQueue=new Cs,this._controls=[],this._mapId=e.a4(),this._contextLost=t=>{t.preventDefault(),this._frameRequest&&(this._frameRequest.abort(),this._frameRequest=null),this.fire(new e.k("webglcontextlost",{originalEvent:t}));},this._contextRestored=t=>{this._setupPainter(),this.resize(),this._update(),this.fire(new e.k("webglcontextrestored",{originalEvent:t}));},this._onMapScroll=t=>{if(t.target===this._container)return this._container.scrollTop=0,this._container.scrollLeft=0,!1},this._onWindowOnline=()=>{this._update();},this._interactive=i.interactive,this._maxTileCacheSize=i.maxTileCacheSize,this._maxTileCacheZoomLevels=i.maxTileCacheZoomLevels,this._failIfMajorPerformanceCaveat=!0===i.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=!0===i.preserveDrawingBuffer,this._antialias=!0===i.antialias,this._trackResize=!0===i.trackResize,this._bearingSnap=i.bearingSnap,this._refreshExpiredTiles=!0===i.refreshExpiredTiles,this._fadeDuration=i.fadeDuration,this._crossSourceCollisions=!0===i.crossSourceCollisions,this._collectResourceTiming=!0===i.collectResourceTiming,this._locale=Object.assign(Object.assign({},ks),i.locale),this._clickTolerance=i.clickTolerance,this._overridePixelRatio=i.pixelRatio,this._maxCanvasSize=i.maxCanvasSize,this.transformCameraUpdate=i.transformCameraUpdate,this.cancelPendingTileRequestsWhileZooming=!0===i.cancelPendingTileRequestsWhileZooming,this._imageQueueHandle=_.addThrottleControl((()=>this.isMoving())),this._requestManager=new p(i.transformRequest),"string"==typeof i.container){if(this._container=document.getElementById(i.container),!this._container)throw new Error(`Container '${i.container}' not found.`)}else {if(!(i.container instanceof HTMLElement))throw new Error("Invalid type: 'container' must be a String or HTMLElement.");this._container=i.container;}if(i.maxBounds&&this.setMaxBounds(i.maxBounds),this._setupContainer(),this._setupPainter(),this.on("move",(()=>this._update(!1))).on("moveend",(()=>this._update(!1))).on("zoom",(()=>this._update(!0))).on("terrain",(()=>{this.painter.terrainFacilitator.dirty=!0,this._update(!0);})).once("idle",(()=>{this._idleTriggered=!0;})),"undefined"!=typeof window){addEventListener("online",this._onWindowOnline,!1);let t=!1;const e=Ia((t=>{this._trackResize&&!this._removed&&(this.resize(t),this.redraw());}),50);this._resizeObserver=new ResizeObserver((i=>{t?e(i):t=!0;})),this._resizeObserver.observe(this._container);}this.handlers=new ws(this,i),this._hash=i.hash&&new Ea("string"==typeof i.hash&&i.hash||void 0).addTo(this),this._hash&&this._hash._onHashChange()||(this.jumpTo({center:i.center,zoom:i.zoom,bearing:i.bearing,pitch:i.pitch}),i.bounds&&(this.resize(),this.fitBounds(i.bounds,e.e({},i.fitBoundsOptions,{duration:0})))),this.resize(),this._localIdeographFontFamily=i.localIdeographFontFamily,this._validateStyle=i.validateStyle,i.style&&this.setStyle(i.style,{localIdeographFontFamily:i.localIdeographFontFamily}),i.attributionControl&&this.addControl(new Es("boolean"==typeof i.attributionControl?void 0:i.attributionControl)),i.maplibreLogo&&this.addControl(new Ps,i.logoPosition),this.on("style.load",(()=>{this.transform.unmodified&&this.jumpTo(this.style.stylesheet);})),this.on("data",(t=>{this._update("style"===t.dataType),this.fire(new e.k(`${t.dataType}data`,t));})),this.on("dataloading",(t=>{this.fire(new e.k(`${t.dataType}dataloading`,t));})),this.on("dataabort",(t=>{this.fire(new e.k("sourcedataabort",t));}));}_getMapId(){return this._mapId}addControl(t,i){if(void 0===i&&(i=t.getDefaultPosition?t.getDefaultPosition():"top-right"),!t||!t.onAdd)return this.fire(new e.j(new Error("Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.")));const a=t.onAdd(this);this._controls.push(t);const s=this._controlPositions[i];return -1!==i.indexOf("bottom")?s.insertBefore(a,s.firstChild):s.appendChild(a),this}removeControl(t){if(!t||!t.onRemove)return this.fire(new e.j(new Error("Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.")));const i=this._controls.indexOf(t);return i>-1&&this._controls.splice(i,1),t.onRemove(this),this}hasControl(t){return this._controls.indexOf(t)>-1}calculateCameraOptionsFromTo(t,e,i,a){return null==a&&this.terrain&&(a=this.terrain.getElevationForLngLatZoom(i,this.transform.tileZoom)),super.calculateCameraOptionsFromTo(t,e,i,a)}resize(t){var i;const a=this._containerDimensions(),s=a[0],o=a[1],r=this._getClampedPixelRatio(s,o);if(this._resizeCanvas(s,o,r),this.painter.resize(s,o,r),this.painter.overLimit()){const t=this.painter.context.gl;this._maxCanvasSize=[t.drawingBufferWidth,t.drawingBufferHeight];const e=this._getClampedPixelRatio(s,o);this._resizeCanvas(s,o,e),this.painter.resize(s,o,e);}this.transform.resize(s,o),null===(i=this._requestedCameraState)||void 0===i||i.resize(s,o);const n=!this._moving;return n&&(this.stop(),this.fire(new e.k("movestart",t)).fire(new e.k("move",t))),this.fire(new e.k("resize",t)),n&&this.fire(new e.k("moveend",t)),this}_getClampedPixelRatio(t,e){const{0:i,1:a}=this._maxCanvasSize,s=this.getPixelRatio(),o=t*s,r=e*s;return Math.min(o>i?i/o:1,r>a?a/r:1)*s}getPixelRatio(){var t;return null!==(t=this._overridePixelRatio)&&void 0!==t?t:devicePixelRatio}setPixelRatio(t){this._overridePixelRatio=t,this.resize();}getBounds(){return this.transform.getBounds()}getMaxBounds(){return this.transform.getMaxBounds()}setMaxBounds(t){return this.transform.setMaxBounds(H.convert(t)),this._update()}setMinZoom(t){if((t=null==t?-2:t)>=-2&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()<t&&this.setZoom(t),this;throw new Error("minZoom must be between -2 and the current maxZoom, inclusive")}getMinZoom(){return this.transform.minZoom}setMaxZoom(t){if((t=null==t?22:t)>=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error("maxZoom must be greater than the current minZoom")}getMaxZoom(){return this.transform.maxZoom}setMinPitch(t){if((t=null==t?0:t)<0)throw new Error("minPitch must be greater than or equal to 0");if(t>=0&&t<=this.transform.maxPitch)return this.transform.minPitch=t,this._update(),this.getPitch()<t&&this.setPitch(t),this;throw new Error("minPitch must be between 0 and the current maxPitch, inclusive")}getMinPitch(){return this.transform.minPitch}setMaxPitch(t){if((t=null==t?60:t)>85)throw new Error("maxPitch must be less than or equal to 85");if(t>=this.transform.minPitch)return this.transform.maxPitch=t,this._update(),this.getPitch()>t&&this.setPitch(t),this;throw new Error("maxPitch must be greater than the current minPitch")}getMaxPitch(){return this.transform.maxPitch}getRenderWorldCopies(){return this.transform.renderWorldCopies}setRenderWorldCopies(t){return this.transform.renderWorldCopies=t,this._update()}project(t){return this.transform.locationPoint(e.N.convert(t),this.style&&this.terrain)}unproject(t){return this.transform.pointLocation(e.P.convert(t),this.terrain)}isMoving(){var t;return this._moving||(null===(t=this.handlers)||void 0===t?void 0:t.isMoving())}isZooming(){var t;return this._zooming||(null===(t=this.handlers)||void 0===t?void 0:t.isZooming())}isRotating(){var t;return this._rotating||(null===(t=this.handlers)||void 0===t?void 0:t.isRotating())}_createDelegatedListener(t,e,i){if("mouseenter"===t||"mouseover"===t){let a=!1;const s=s=>{const o=e.filter((t=>this.getLayer(t))),r=0!==o.length?this.queryRenderedFeatures(s.point,{layers:o}):[];r.length?a||(a=!0,i.call(this,new ka(t,this,s.originalEvent,{features:r}))):a=!1;};return {layers:e,listener:i,delegates:{mousemove:s,mouseout:()=>{a=!1;}}}}if("mouseleave"===t||"mouseout"===t){let a=!1;const s=s=>{const o=e.filter((t=>this.getLayer(t)));(0!==o.length?this.queryRenderedFeatures(s.point,{layers:o}):[]).length?a=!0:a&&(a=!1,i.call(this,new ka(t,this,s.originalEvent)));},o=e=>{a&&(a=!1,i.call(this,new ka(t,this,e.originalEvent)));};return {layers:e,listener:i,delegates:{mousemove:s,mouseout:o}}}{const a=t=>{const a=e.filter((t=>this.getLayer(t))),s=0!==a.length?this.queryRenderedFeatures(t.point,{layers:a}):[];s.length&&(t.features=s,i.call(this,t),delete t.features);};return {layers:e,listener:i,delegates:{[t]:a}}}}_saveDelegatedListener(t,e){this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[t]=this._delegatedListeners[t]||[],this._delegatedListeners[t].push(e);}_removeDelegatedListener(t,e,i){if(!this._delegatedListeners||!this._delegatedListeners[t])return;const a=this._delegatedListeners[t];for(let t=0;t<a.length;t++){const s=a[t];if(s.listener===i&&s.layers.length===e.length&&s.layers.every((t=>e.includes(t)))){for(const t in s.delegates)this.off(t,s.delegates[t]);return void a.splice(t,1)}}}on(t,e,i){if(void 0===i)return super.on(t,e);const a=this._createDelegatedListener(t,"string"==typeof e?[e]:e,i);this._saveDelegatedListener(t,a);for(const t in a.delegates)this.on(t,a.delegates[t]);return this}once(t,e,i){if(void 0===i)return super.once(t,e);const a="string"==typeof e?[e]:e,s=this._createDelegatedListener(t,a,i);for(const e in s.delegates){const o=s.delegates[e];s.delegates[e]=(...e)=>{this._removeDelegatedListener(t,a,i),o(...e);};}this._saveDelegatedListener(t,s);for(const t in s.delegates)this.once(t,s.delegates[t]);return this}off(t,e,i){return void 0===i?super.off(t,e):(this._removeDelegatedListener(t,"string"==typeof e?[e]:e,i),this)}queryRenderedFeatures(t,i){if(!this.style)return [];let a;const s=t instanceof e.P||Array.isArray(t),o=s?t:[[0,0],[this.transform.width,this.transform.height]];if(i=i||(s?{}:t)||{},o instanceof e.P||"number"==typeof o[0])a=[e.P.convert(o)];else {const t=e.P.convert(o[0]),i=e.P.convert(o[1]);a=[t,new e.P(i.x,t.y),i,new e.P(t.x,i.y),t];}return this.style.queryRenderedFeatures(a,i,this.transform)}querySourceFeatures(t,e){return this.style.querySourceFeatures(t,e)}setStyle(t,i){return !1!==(i=e.e({},{localIdeographFontFamily:this._localIdeographFontFamily,validate:this._validateStyle},i)).diff&&i.localIdeographFontFamily===this._localIdeographFontFamily&&this.style&&t?(this._diffStyle(t,i),this):(this._localIdeographFontFamily=i.localIdeographFontFamily,this._updateStyle(t,i))}setTransformRequest(t){return this._requestManager.setTransformRequest(t),this}_getUIString(t){const e=this._locale[t];if(null==e)throw new Error(`Missing UI string '${t}'`);return e}_updateStyle(t,e){if(e.transformStyle&&this.style&&!this.style._loaded)return void this.style.once("style.load",(()=>this._updateStyle(t,e)));const i=this.style&&e.transformStyle?this.style.serialize():void 0;return this.style&&(this.style.setEventedParent(null),this.style._remove(!t)),t?(this.style=new de(this,e||{}),this.style.setEventedParent(this,{style:this.style}),"string"==typeof t?this.style.loadURL(t,e,i):this.style.loadJSON(t,e,i),this):(delete this.style,this)}_lazyInitEmptyStyle(){this.style||(this.style=new de(this,{}),this.style.setEventedParent(this,{style:this.style}),this.style.loadEmpty());}_diffStyle(t,i){if("string"==typeof t){const a=this._requestManager.transformRequest(t,"Style");e.h(a,new AbortController).then((t=>{this._updateDiff(t.data,i);})).catch((t=>{t&&this.fire(new e.j(t));}));}else "object"==typeof t&&this._updateDiff(t,i);}_updateDiff(t,i){try{this.style.setState(t,i)&&this._update(!0);}catch(a){e.w(`Unable to perform style diff: ${a.message||a.error||a}. Rebuilding the style from scratch.`),this._updateStyle(t,i);}}getStyle(){if(this.style)return this.style.serialize()}isStyleLoaded(){return this.style?this.style.loaded():e.w("There is no style added to the map.")}addSource(t,e){return this._lazyInitEmptyStyle(),this.style.addSource(t,e),this._update(!0)}isSourceLoaded(t){const i=this.style&&this.style.sourceCaches[t];if(void 0!==i)return i.loaded();this.fire(new e.j(new Error(`There is no source with ID '${t}'`)));}setTerrain(t){if(this.style._checkLoaded(),this._terrainDataCallback&&this.style.off("data",this._terrainDataCallback),t){const i=this.style.sourceCaches[t.source];if(!i)throw new Error(`cannot load terrain, because there exists no source with ID: ${t.source}`);null===this.terrain&&i.reload();for(const i in this.style._layers){const a=this.style._layers[i];"hillshade"===a.type&&a.source===t.source&&e.w("You are using the same source for a hillshade layer and for 3D terrain. Please consider using two separate sources to improve rendering quality.");}this.terrain=new Ds(this.painter,i,t),this.painter.renderToTexture=new Rs(this.painter,this.terrain),this.transform.minElevationForCurrentTile=this.terrain.getMinTileElevationForLngLatZoom(this.transform.center,this.transform.tileZoom),this.transform.elevation=this.terrain.getElevationForLngLatZoom(this.transform.center,this.transform.tileZoom),this._terrainDataCallback=e=>{"style"===e.dataType?this.terrain.sourceCache.freeRtt():"source"===e.dataType&&e.tile&&(e.sourceId!==t.source||this._elevationFreeze||(this.transform.minElevationForCurrentTile=this.terrain.getMinTileElevationForLngLatZoom(this.transform.center,this.transform.tileZoom),this.transform.elevation=this.terrain.getElevationForLngLatZoom(this.transform.center,this.transform.tileZoom)),this.terrain.sourceCache.freeRtt(e.tile.tileID));},this.style.on("data",this._terrainDataCallback);}else this.terrain&&this.terrain.sourceCache.destruct(),this.terrain=null,this.painter.renderToTexture&&this.painter.renderToTexture.destruct(),this.painter.renderToTexture=null,this.transform.minElevationForCurrentTile=0,this.transform.elevation=0;return this.fire(new e.k("terrain",{terrain:t})),this}getTerrain(){var t,e;return null!==(e=null===(t=this.terrain)||void 0===t?void 0:t.options)&&void 0!==e?e:null}areTilesLoaded(){const t=this.style&&this.style.sourceCaches;for(const e in t){const i=t[e]._tiles;for(const t in i){const e=i[t];if("loaded"!==e.state&&"errored"!==e.state)return !1}}return !0}removeSource(t){return this.style.removeSource(t),this._update(!0)}getSource(t){return this.style.getSource(t)}addImage(t,i,a={}){const{pixelRatio:s=1,sdf:r=!1,stretchX:n,stretchY:l,content:h,textFitWidth:c,textFitHeight:u}=a;if(this._lazyInitEmptyStyle(),!(i instanceof HTMLImageElement||e.b(i))){if(void 0===i.width||void 0===i.height)return this.fire(new e.j(new Error("Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`")));{const{width:a,height:o,data:d}=i,_=i;return this.style.addImage(t,{data:new e.R({width:a,height:o},new Uint8Array(d)),pixelRatio:s,stretchX:n,stretchY:l,content:h,textFitWidth:c,textFitHeight:u,sdf:r,version:0,userImage:_}),_.onAdd&&_.onAdd(this,t),this}}{const{width:a,height:d,data:_}=o.getImageData(i);this.style.addImage(t,{data:new e.R({width:a,height:d},_),pixelRatio:s,stretchX:n,stretchY:l,content:h,textFitWidth:c,textFitHeight:u,sdf:r,version:0});}}updateImage(t,i){const a=this.style.getImage(t);if(!a)return this.fire(new e.j(new Error("The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.")));const s=i instanceof HTMLImageElement||e.b(i)?o.getImageData(i):i,{width:r,height:n,data:l}=s;if(void 0===r||void 0===n)return this.fire(new e.j(new Error("Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`")));if(r!==a.data.width||n!==a.data.height)return this.fire(new e.j(new Error("The width and height of the updated image must be that same as the previous version of the image")));const h=!(i instanceof HTMLImageElement||e.b(i));return a.data.replace(l,h),this.style.updateImage(t,a),this}getImage(t){return this.style.getImage(t)}hasImage(t){return t?!!this.style.getImage(t):(this.fire(new e.j(new Error("Missing required image id"))),!1)}removeImage(t){this.style.removeImage(t);}loadImage(t){return _.getImage(this._requestManager.transformRequest(t,"Image"),new AbortController)}listImages(){return this.style.listImages()}addLayer(t,e){return this._lazyInitEmptyStyle(),this.style.addLayer(t,e),this._update(!0)}moveLayer(t,e){return this.style.moveLayer(t,e),this._update(!0)}removeLayer(t){return this.style.removeLayer(t),this._update(!0)}getLayer(t){return this.style.getLayer(t)}getLayersOrder(){return this.style.getLayersOrder()}setLayerZoomRange(t,e,i){return this.style.setLayerZoomRange(t,e,i),this._update(!0)}setFilter(t,e,i={}){return this.style.setFilter(t,e,i),this._update(!0)}getFilter(t){return this.style.getFilter(t)}setPaintProperty(t,e,i,a={}){return this.style.setPaintProperty(t,e,i,a),this._update(!0)}getPaintProperty(t,e){return this.style.getPaintProperty(t,e)}setLayoutProperty(t,e,i,a={}){return this.style.setLayoutProperty(t,e,i,a),this._update(!0)}getLayoutProperty(t,e){return this.style.getLayoutProperty(t,e)}setGlyphs(t,e={}){return this._lazyInitEmptyStyle(),this.style.setGlyphs(t,e),this._update(!0)}getGlyphs(){return this.style.getGlyphsUrl()}addSprite(t,e,i={}){return this._lazyInitEmptyStyle(),this.style.addSprite(t,e,i,(t=>{t||this._update(!0);})),this}removeSprite(t){return this._lazyInitEmptyStyle(),this.style.removeSprite(t),this._update(!0)}getSprite(){return this.style.getSprite()}setSprite(t,e={}){return this._lazyInitEmptyStyle(),this.style.setSprite(t,e,(t=>{t||this._update(!0);})),this}setLight(t,e={}){return this._lazyInitEmptyStyle(),this.style.setLight(t,e),this._update(!0)}getLight(){return this.style.getLight()}setSky(t){return this._lazyInitEmptyStyle(),this.style.setSky(t),this._update(!0)}getSky(){return this.style.getSky()}setFeatureState(t,e){return this.style.setFeatureState(t,e),this._update()}removeFeatureState(t,e){return this.style.removeFeatureState(t,e),this._update()}getFeatureState(t){return this.style.getFeatureState(t)}getContainer(){return this._container}getCanvasContainer(){return this._canvasContainer}getCanvas(){return this._canvas}_containerDimensions(){let t=0,e=0;return this._container&&(t=this._container.clientWidth||400,e=this._container.clientHeight||300),[t,e]}_setupContainer(){const t=this._container;t.classList.add("maplibregl-map");const e=this._canvasContainer=r.create("div","maplibregl-canvas-container",t);this._interactive&&e.classList.add("maplibregl-interactive"),this._canvas=r.create("canvas","maplibregl-canvas",e),this._canvas.addEventListener("webglcontextlost",this._contextLost,!1),this._canvas.addEventListener("webglcontextrestored",this._contextRestored,!1),this._canvas.setAttribute("tabindex",this._interactive?"0":"-1"),this._canvas.setAttribute("aria-label",this._getUIString("Map.Title")),this._canvas.setAttribute("role","region");const i=this._containerDimensions(),a=this._getClampedPixelRatio(i[0],i[1]);this._resizeCanvas(i[0],i[1],a);const s=this._controlContainer=r.create("div","maplibregl-control-container",t),o=this._controlPositions={};["top-left","top-right","bottom-left","bottom-right"].forEach((t=>{o[t]=r.create("div",`maplibregl-ctrl-${t} `,s);})),this._container.addEventListener("scroll",this._onMapScroll,!1);}_resizeCanvas(t,e,i){this._canvas.width=Math.floor(i*t),this._canvas.height=Math.floor(i*e),this._canvas.style.width=`${t}px`,this._canvas.style.height=`${e}px`;}_setupPainter(){const t={alpha:!0,stencil:!0,depth:!0,failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer,antialias:this._antialias||!1};let e=null;this._canvas.addEventListener("webglcontextcreationerror",(i=>{e={requestedAttributes:t},i&&(e.statusMessage=i.statusMessage,e.type=i.type);}),{once:!0});const i=this._canvas.getContext("webgl2",t)||this._canvas.getContext("webgl",t);if(!i){const t="Failed to initialize WebGL";throw e?(e.message=t,new Error(JSON.stringify(e))):new Error(t)}this.painter=new va(i,this.transform),n.testSupport(i);}loaded(){return !this._styleDirty&&!this._sourcesDirty&&!!this.style&&this.style.loaded()}_update(t){return this.style&&this.style._loaded?(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this.triggerRepaint(),this):this}_requestRenderFrame(t){return this._update(),this._renderTaskQueue.add(t)}_cancelRenderFrame(t){this._renderTaskQueue.remove(t);}_render(t){const i=this._idleTriggered?this._fadeDuration:0;if(this.painter.context.setDirty(),this.painter.setBaseState(),this._renderTaskQueue.run(t),this._removed)return;let a=!1;if(this.style&&this._styleDirty){this._styleDirty=!1;const t=this.transform.zoom,s=o.now();this.style.zoomHistory.update(t,s);const r=new e.z(t,{now:s,fadeDuration:i,zoomHistory:this.style.zoomHistory,transition:this.style.getTransition()}),n=r.crossFadingFactor();1===n&&n===this._crossFadingFactor||(a=!0,this._crossFadingFactor=n),this.style.update(r);}this.style&&this._sourcesDirty&&(this._sourcesDirty=!1,this.style._updateSources(this.transform)),this.terrain?(this.terrain.sourceCache.update(this.transform,this.terrain),this.transform.minElevationForCurrentTile=this.terrain.getMinTileElevationForLngLatZoom(this.transform.center,this.transform.tileZoom),this._elevationFreeze||(this.transform.elevation=this.terrain.getElevationForLngLatZoom(this.transform.center,this.transform.tileZoom))):(this.transform.minElevationForCurrentTile=0,this.transform.elevation=0),this._placementDirty=this.style&&this.style._updatePlacement(this.painter.transform,this.showCollisionBoxes,i,this._crossSourceCollisions),this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showOverdrawInspector:this._showOverdrawInspector,rotating:this.isRotating(),zooming:this.isZooming(),moving:this.isMoving(),fadeDuration:i,showPadding:this.showPadding}),this.fire(new e.k("render")),this.loaded()&&!this._loaded&&(this._loaded=!0,e.bf.mark(e.bg.load),this.fire(new e.k("load"))),this.style&&(this.style.hasTransitions()||a)&&(this._styleDirty=!0),this.style&&!this._placementDirty&&this.style._releaseSymbolFadeTiles();const s=this._sourcesDirty||this._styleDirty||this._placementDirty;return s||this._repaint?this.triggerRepaint():!this.isMoving()&&this.loaded()&&this.fire(new e.k("idle")),!this._loaded||this._fullyLoaded||s||(this._fullyLoaded=!0,e.bf.mark(e.bg.fullLoad)),this}redraw(){return this.style&&(this._frameRequest&&(this._frameRequest.abort(),this._frameRequest=null),this._render(0)),this}remove(){var t;this._hash&&this._hash.remove();for(const t of this._controls)t.onRemove(this);this._controls=[],this._frameRequest&&(this._frameRequest.abort(),this._frameRequest=null),this._renderTaskQueue.clear(),this.painter.destroy(),this.handlers.destroy(),delete this.handlers,this.setStyle(null),"undefined"!=typeof window&&removeEventListener("online",this._onWindowOnline,!1),_.removeThrottleControl(this._imageQueueHandle),null===(t=this._resizeObserver)||void 0===t||t.disconnect();const i=this.painter.context.gl.getExtension("WEBGL_lose_context");(null==i?void 0:i.loseContext)&&i.loseContext(),this._canvas.removeEventListener("webglcontextrestored",this._contextRestored,!1),this._canvas.removeEventListener("webglcontextlost",this._contextLost,!1),r.remove(this._canvasContainer),r.remove(this._controlContainer),this._container.classList.remove("maplibregl-map"),e.bf.clearMetrics(),this._removed=!0,this.fire(new e.k("remove"));}triggerRepaint(){this.style&&!this._frameRequest&&(this._frameRequest=new AbortController,o.frameAsync(this._frameRequest).then((t=>{e.bf.frame(t),this._frameRequest=null,this._render(t);})).catch((()=>{})));}get showTileBoundaries(){return !!this._showTileBoundaries}set showTileBoundaries(t){this._showTileBoundaries!==t&&(this._showTileBoundaries=t,this._update());}get showPadding(){return !!this._showPadding}set showPadding(t){this._showPadding!==t&&(this._showPadding=t,this._update());}get showCollisionBoxes(){return !!this._showCollisionBoxes}set showCollisionBoxes(t){this._showCollisionBoxes!==t&&(this._showCollisionBoxes=t,t?this.style._generateCollisionBoxes():this._update());}get showOverdrawInspector(){return !!this._showOverdrawInspector}set showOverdrawInspector(t){this._showOverdrawInspector!==t&&(this._showOverdrawInspector=t,this._update());}get repaint(){return !!this._repaint}set repaint(t){this._repaint!==t&&(this._repaint=t,this.triggerRepaint());}get vertices(){return !!this._vertices}set vertices(t){this._vertices=t,this._update();}get version(){return Ls}getCameraTargetElevation(){return this.transform.elevation}},t.MapMouseEvent=ka,t.MapTouchEvent=La,t.MapWheelEvent=Fa,t.Marker=Vs,t.NavigationControl=class{constructor(t){this._updateZoomButtons=()=>{const t=this._map.getZoom(),e=t===this._map.getMaxZoom(),i=t===this._map.getMinZoom();this._zoomInButton.disabled=e,this._zoomOutButton.disabled=i,this._zoomInButton.setAttribute("aria-disabled",e.toString()),this._zoomOutButton.setAttribute("aria-disabled",i.toString());},this._rotateCompassArrow=()=>{const t=this.options.visualizePitch?`scale(${1/Math.pow(Math.cos(this._map.transform.pitch*(Math.PI/180)),.5)}) rotateX(${this._map.transform.pitch}deg) rotateZ(${this._map.transform.angle*(180/Math.PI)}deg)`:`rotate(${this._map.transform.angle*(180/Math.PI)}deg)`;this._compassIcon.style.transform=t;},this._setButtonTitle=(t,e)=>{const i=this._map._getUIString(`NavigationControl.${e}`);t.title=i,t.setAttribute("aria-label",i);},this.options=e.e({},Os,t),this._container=r.create("div","maplibregl-ctrl maplibregl-ctrl-group"),this._container.addEventListener("contextmenu",(t=>t.preventDefault())),this.options.showZoom&&(this._zoomInButton=this._createButton("maplibregl-ctrl-zoom-in",(t=>this._map.zoomIn({},{originalEvent:t}))),r.create("span","maplibregl-ctrl-icon",this._zoomInButton).setAttribute("aria-hidden","true"),this._zoomOutButton=this._createButton("maplibregl-ctrl-zoom-out",(t=>this._map.zoomOut({},{originalEvent:t}))),r.create("span","maplibregl-ctrl-icon",this._zoomOutButton).setAttribute("aria-hidden","true")),this.options.showCompass&&(this._compass=this._createButton("maplibregl-ctrl-compass",(t=>{this.options.visualizePitch?this._map.resetNorthPitch({},{originalEvent:t}):this._map.resetNorth({},{originalEvent:t});})),this._compassIcon=r.create("span","maplibregl-ctrl-icon",this._compass),this._compassIcon.setAttribute("aria-hidden","true"));}onAdd(t){return this._map=t,this.options.showZoom&&(this._setButtonTitle(this._zoomInButton,"ZoomIn"),this._setButtonTitle(this._zoomOutButton,"ZoomOut"),this._map.on("zoom",this._updateZoomButtons),this._updateZoomButtons()),this.options.showCompass&&(this._setButtonTitle(this._compass,"ResetBearing"),this.options.visualizePitch&&this._map.on("pitch",this._rotateCompassArrow),this._map.on("rotate",this._rotateCompassArrow),this._rotateCompassArrow(),this._handler=new Ns(this._map,this._compass,this.options.visualizePitch)),this._container}onRemove(){r.remove(this._container),this.options.showZoom&&this._map.off("zoom",this._updateZoomButtons),this.options.showCompass&&(this.options.visualizePitch&&this._map.off("pitch",this._rotateCompassArrow),this._map.off("rotate",this._rotateCompassArrow),this._handler.off(),delete this._handler),delete this._map;}_createButton(t,e){const i=r.create("button",t,this._container);return i.type="button",i.addEventListener("click",e),i}},t.Popup=class extends e.E{constructor(t){super(),this.remove=()=>(this._content&&r.remove(this._content),this._container&&(r.remove(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("move",this._onClose),this._map.off("click",this._onClose),this._map.off("remove",this.remove),this._map.off("mousemove",this._onMouseMove),this._map.off("mouseup",this._onMouseUp),this._map.off("drag",this._onDrag),this._map._canvasContainer.classList.remove("maplibregl-track-pointer"),delete this._map,this.fire(new e.k("close"))),this),this._onMouseUp=t=>{this._update(t.point);},this._onMouseMove=t=>{this._update(t.point);},this._onDrag=t=>{this._update(t.point);},this._update=t=>{var e;if(!this._map||!this._lngLat&&!this._trackPointer||!this._content)return;if(!this._container){if(this._container=r.create("div","maplibregl-popup",this._map.getContainer()),this._tip=r.create("div","maplibregl-popup-tip",this._container),this._container.appendChild(this._content),this.options.className)for(const t of this.options.className.split(" "))this._container.classList.add(t);this._closeButton&&this._closeButton.setAttribute("aria-label",this._map._getUIString("Popup.Close")),this._trackPointer&&this._container.classList.add("maplibregl-popup-track-pointer");}if(this.options.maxWidth&&this._container.style.maxWidth!==this.options.maxWidth&&(this._container.style.maxWidth=this.options.maxWidth),this._lngLat=this._map.transform.renderWorldCopies&&!this._trackPointer?js(this._lngLat,this._flatPos,this._map.transform):null===(e=this._lngLat)||void 0===e?void 0:e.wrap(),this._trackPointer&&!t)return;const i=this._flatPos=this._pos=this._trackPointer&&t?t:this._map.project(this._lngLat);this._map.terrain&&(this._flatPos=this._trackPointer&&t?t:this._map.transform.locationPoint(this._lngLat));let a=this.options.anchor;const s=Qs(this.options.offset);if(!a){const t=this._container.offsetWidth,e=this._container.offsetHeight;let o;o=i.y+s.bottom.y<e?["top"]:i.y>this._map.transform.height-e?["bottom"]:[],i.x<t/2?o.push("left"):i.x>this._map.transform.width-t/2&&o.push("right"),a=0===o.length?"bottom":o.join("-");}let o=i.add(s[a]);this.options.subpixelPositioning||(o=o.round()),r.setTransform(this._container,`${Zs[a]} translate(${o.x}px,${o.y}px)`),qs(this._container,a,"popup");},this._onClose=()=>{this.remove();},this.options=e.e(Object.create(Js),t);}addTo(t){return this._map&&this.remove(),this._map=t,this.options.closeOnClick&&this._map.on("click",this._onClose),this.options.closeOnMove&&this._map.on("move",this._onClose),this._map.on("remove",this.remove),this._update(),this._focusFirstElement(),this._trackPointer?(this._map.on("mousemove",this._onMouseMove),this._map.on("mouseup",this._onMouseUp),this._container&&this._container.classList.add("maplibregl-popup-track-pointer"),this._map._canvasContainer.classList.add("maplibregl-track-pointer")):this._map.on("move",this._update),this.fire(new e.k("open")),this}isOpen(){return !!this._map}getLngLat(){return this._lngLat}setLngLat(t){return this._lngLat=e.N.convert(t),this._pos=null,this._flatPos=null,this._trackPointer=!1,this._update(),this._map&&(this._map.on("move",this._update),this._map.off("mousemove",this._onMouseMove),this._container&&this._container.classList.remove("maplibregl-popup-track-pointer"),this._map._canvasContainer.classList.remove("maplibregl-track-pointer")),this}trackPointer(){return this._trackPointer=!0,this._pos=null,this._flatPos=null,this._update(),this._map&&(this._map.off("move",this._update),this._map.on("mousemove",this._onMouseMove),this._map.on("drag",this._onDrag),this._container&&this._container.classList.add("maplibregl-popup-track-pointer"),this._map._canvasContainer.classList.add("maplibregl-track-pointer")),this}getElement(){return this._container}setText(t){return this.setDOMContent(document.createTextNode(t))}setHTML(t){const e=document.createDocumentFragment(),i=document.createElement("body");let a;for(i.innerHTML=t;a=i.firstChild,a;)e.appendChild(a);return this.setDOMContent(e)}getMaxWidth(){var t;return null===(t=this._container)||void 0===t?void 0:t.style.maxWidth}setMaxWidth(t){return this.options.maxWidth=t,this._update(),this}setDOMContent(t){if(this._content)for(;this._content.hasChildNodes();)this._content.firstChild&&this._content.removeChild(this._content.firstChild);else this._content=r.create("div","maplibregl-popup-content",this._container);return this._content.appendChild(t),this._createCloseButton(),this._update(),this._focusFirstElement(),this}addClassName(t){return this._container&&this._container.classList.add(t),this}removeClassName(t){return this._container&&this._container.classList.remove(t),this}setOffset(t){return this.options.offset=t,this._update(),this}toggleClassName(t){if(this._container)return this._container.classList.toggle(t)}setSubpixelPositioning(t){this.options.subpixelPositioning=t;}_createCloseButton(){this.options.closeButton&&(this._closeButton=r.create("button","maplibregl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.innerHTML="&#215;",this._closeButton.addEventListener("click",this._onClose));}_focusFirstElement(){if(!this.options.focusAfterOpen||!this._container)return;const t=this._container.querySelector(Ys);t&&t.focus();}},t.RasterDEMTileSource=K,t.RasterTileSource=X,t.ScaleControl=class{constructor(t){this._onMove=()=>{Xs(this._map,this._container,this.options);},this.setUnit=t=>{this.options.unit=t,Xs(this._map,this._container,this.options);},this.options=Object.assign(Object.assign({},$s),t);}getDefaultPosition(){return "bottom-left"}onAdd(t){return this._map=t,this._container=r.create("div","maplibregl-ctrl maplibregl-ctrl-scale",t.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container}onRemove(){r.remove(this._container),this._map.off("move",this._onMove),this._map=void 0;}},t.ScrollZoomHandler=us,t.Style=de,t.TerrainControl=class{constructor(t){this._toggleTerrain=()=>{this._map.getTerrain()?this._map.setTerrain(null):this._map.setTerrain(this.options),this._updateTerrainIcon();},this._updateTerrainIcon=()=>{this._terrainButton.classList.remove("maplibregl-ctrl-terrain"),this._terrainButton.classList.remove("maplibregl-ctrl-terrain-enabled"),this._map.terrain?(this._terrainButton.classList.add("maplibregl-ctrl-terrain-enabled"),this._terrainButton.title=this._map._getUIString("TerrainControl.Disable")):(this._terrainButton.classList.add("maplibregl-ctrl-terrain"),this._terrainButton.title=this._map._getUIString("TerrainControl.Enable"));},this.options=t;}onAdd(t){return this._map=t,this._container=r.create("div","maplibregl-ctrl maplibregl-ctrl-group"),this._terrainButton=r.create("button","maplibregl-ctrl-terrain",this._container),r.create("span","maplibregl-ctrl-icon",this._terrainButton).setAttribute("aria-hidden","true"),this._terrainButton.type="button",this._terrainButton.addEventListener("click",this._toggleTerrain),this._updateTerrainIcon(),this._map.on("terrain",this._updateTerrainIcon),this._container}onRemove(){r.remove(this._container),this._map.off("terrain",this._updateTerrainIcon),this._map=void 0;}},t.TwoFingersTouchPitchHandler=rs,t.TwoFingersTouchRotateHandler=ss,t.TwoFingersTouchZoomHandler=is,t.TwoFingersTouchZoomRotateHandler=gs,t.VectorTileSource=$,t.VideoSource=tt,t.addSourceType=(t,i)=>e._(void 0,void 0,void 0,(function*(){if(at(t))throw new Error(`A source type called "${t}" already exists.`);((t,e)=>{it[t]=e;})(t,i);})),t.clearPrewarmedResources=function(){const t=B;t&&(t.isPreloaded()&&1===t.numActive()?(t.release(k),B=null):console.warn("Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()"));},t.getMaxParallelImageRequests=function(){return e.a.MAX_PARALLEL_IMAGE_REQUESTS},t.getRTLTextPluginStatus=function(){return nt().getRTLTextPluginStatus()},t.getVersion=function(){return to},t.getWorkerCount=function(){return L.workerCount},t.getWorkerUrl=function(){return e.a.WORKER_URL},t.importScriptInWorkers=function(t){return j().broadcast("IS",t)},t.prewarm=function(){N().acquire(k);},t.setMaxParallelImageRequests=function(t){e.a.MAX_PARALLEL_IMAGE_REQUESTS=t;},t.setRTLTextPlugin=function(t,e){return nt().setRTLTextPlugin(t,e)},t.setWorkerCount=function(t){L.workerCount=t;},t.setWorkerUrl=function(t){e.a.WORKER_URL=t;};}));
//
// Our custom intro provides a specialized "define()" function, called by the
// AMD modules below, that sets up the worker blob URL and then executes the
// main module, storing its exported value as 'maplibregl'
var maplibregl$1 = maplibregl;
return maplibregl$1;
}));
//# sourceMappingURL=maplibre-gl.js.map
/***/ }),
/***/ "./node_modules/pmtiles/dist/index.js":
/*!********************************************!*\
!*** ./node_modules/pmtiles/dist/index.js ***!
\********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ Compression: () => (/* binding */ Compression),
/* harmony export */ EtagMismatch: () => (/* binding */ EtagMismatch),
/* harmony export */ FetchSource: () => (/* binding */ FetchSource),
/* harmony export */ FileSource: () => (/* binding */ FileSource),
/* harmony export */ PMTiles: () => (/* binding */ PMTiles),
/* harmony export */ Protocol: () => (/* binding */ Protocol),
/* harmony export */ ResolvedValueCache: () => (/* binding */ ResolvedValueCache),
/* harmony export */ SharedPromiseCache: () => (/* binding */ SharedPromiseCache),
/* harmony export */ TileType: () => (/* binding */ TileType),
/* harmony export */ bytesToHeader: () => (/* binding */ bytesToHeader),
/* harmony export */ findTile: () => (/* binding */ findTile),
/* harmony export */ getUint64: () => (/* binding */ getUint64),
/* harmony export */ leafletRasterLayer: () => (/* binding */ leafletRasterLayer),
/* harmony export */ readVarint: () => (/* binding */ readVarint),
/* harmony export */ tileIdToZxy: () => (/* binding */ tileIdToZxy),
/* harmony export */ tileTypeExt: () => (/* binding */ tileTypeExt),
/* harmony export */ zxyToTileId: () => (/* binding */ zxyToTileId)
/* harmony export */ });
var __pow = Math.pow;
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// node_modules/fflate/esm/browser.js
var u8 = Uint8Array;
var u16 = Uint16Array;
var i32 = Int32Array;
var fleb = new u8([
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
2,
2,
2,
2,
3,
3,
3,
3,
4,
4,
4,
4,
5,
5,
5,
5,
0,
/* unused */
0,
0,
/* impossible */
0
]);
var fdeb = new u8([
0,
0,
0,
0,
1,
1,
2,
2,
3,
3,
4,
4,
5,
5,
6,
6,
7,
7,
8,
8,
9,
9,
10,
10,
11,
11,
12,
12,
13,
13,
/* unused */
0,
0
]);
var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
var freb = function(eb, start) {
var b = new u16(31);
for (var i = 0; i < 31; ++i) {
b[i] = start += 1 << eb[i - 1];
}
var r = new i32(b[30]);
for (var i = 1; i < 30; ++i) {
for (var j = b[i]; j < b[i + 1]; ++j) {
r[j] = j - b[i] << 5 | i;
}
}
return { b, r };
};
var _a = freb(fleb, 2);
var fl = _a.b;
var revfl = _a.r;
fl[28] = 258, revfl[258] = 28;
var _b = freb(fdeb, 0);
var fd = _b.b;
var revfd = _b.r;
var rev = new u16(32768);
for (i = 0; i < 32768; ++i) {
x = (i & 43690) >> 1 | (i & 21845) << 1;
x = (x & 52428) >> 2 | (x & 13107) << 2;
x = (x & 61680) >> 4 | (x & 3855) << 4;
rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
}
var x;
var i;
var hMap = function(cd, mb, r) {
var s = cd.length;
var i = 0;
var l = new u16(mb);
for (; i < s; ++i) {
if (cd[i])
++l[cd[i] - 1];
}
var le = new u16(mb);
for (i = 1; i < mb; ++i) {
le[i] = le[i - 1] + l[i - 1] << 1;
}
var co;
if (r) {
co = new u16(1 << mb);
var rvb = 15 - mb;
for (i = 0; i < s; ++i) {
if (cd[i]) {
var sv = i << 4 | cd[i];
var r_1 = mb - cd[i];
var v = le[cd[i] - 1]++ << r_1;
for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
co[rev[v] >> rvb] = sv;
}
}
}
} else {
co = new u16(s);
for (i = 0; i < s; ++i) {
if (cd[i]) {
co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
}
}
}
return co;
};
var flt = new u8(288);
for (i = 0; i < 144; ++i)
flt[i] = 8;
var i;
for (i = 144; i < 256; ++i)
flt[i] = 9;
var i;
for (i = 256; i < 280; ++i)
flt[i] = 7;
var i;
for (i = 280; i < 288; ++i)
flt[i] = 8;
var i;
var fdt = new u8(32);
for (i = 0; i < 32; ++i)
fdt[i] = 5;
var i;
var flrm = /* @__PURE__ */ hMap(flt, 9, 1);
var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
var max = function(a) {
var m = a[0];
for (var i = 1; i < a.length; ++i) {
if (a[i] > m)
m = a[i];
}
return m;
};
var bits = function(d, p, m) {
var o = p / 8 | 0;
return (d[o] | d[o + 1] << 8) >> (p & 7) & m;
};
var bits16 = function(d, p) {
var o = p / 8 | 0;
return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
};
var shft = function(p) {
return (p + 7) / 8 | 0;
};
var slc = function(v, s, e) {
if (s == null || s < 0)
s = 0;
if (e == null || e > v.length)
e = v.length;
var n = new u8(e - s);
n.set(v.subarray(s, e));
return n;
};
var ec = [
"unexpected EOF",
"invalid block type",
"invalid length/literal",
"invalid distance",
"stream finished",
"no stream handler",
,
"no callback",
"invalid UTF-8 data",
"extra field too long",
"date not in range 1980-2099",
"filename too long",
"stream finishing",
"invalid zip data"
// determined by unknown compression method
];
var err = function(ind, msg, nt) {
var e = new Error(msg || ec[ind]);
e.code = ind;
if (Error.captureStackTrace)
Error.captureStackTrace(e, err);
if (!nt)
throw e;
return e;
};
var inflt = function(dat, st, buf, dict) {
var sl = dat.length, dl = dict ? dict.length : 0;
if (!sl || st.f && !st.l)
return buf || new u8(0);
var noBuf = !buf || st.i != 2;
var noSt = st.i;
if (!buf)
buf = new u8(sl * 3);
var cbuf = function(l2) {
var bl = buf.length;
if (l2 > bl) {
var nbuf = new u8(Math.max(bl * 2, l2));
nbuf.set(buf);
buf = nbuf;
}
};
var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
var tbts = sl * 8;
do {
if (!lm) {
final = bits(dat, pos, 1);
var type = bits(dat, pos + 1, 3);
pos += 3;
if (!type) {
var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;
if (t > sl) {
if (noSt)
err(0);
break;
}
if (noBuf)
cbuf(bt + l);
buf.set(dat.subarray(s, t), bt);
st.b = bt += l, st.p = pos = t * 8, st.f = final;
continue;
} else if (type == 1)
lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
else if (type == 2) {
var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
var tl = hLit + bits(dat, pos + 5, 31) + 1;
pos += 14;
var ldt = new u8(tl);
var clt = new u8(19);
for (var i = 0; i < hcLen; ++i) {
clt[clim[i]] = bits(dat, pos + i * 3, 7);
}
pos += hcLen * 3;
var clb = max(clt), clbmsk = (1 << clb) - 1;
var clm = hMap(clt, clb, 1);
for (var i = 0; i < tl; ) {
var r = clm[bits(dat, pos, clbmsk)];
pos += r & 15;
var s = r >> 4;
if (s < 16) {
ldt[i++] = s;
} else {
var c = 0, n = 0;
if (s == 16)
n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
else if (s == 17)
n = 3 + bits(dat, pos, 7), pos += 3;
else if (s == 18)
n = 11 + bits(dat, pos, 127), pos += 7;
while (n--)
ldt[i++] = c;
}
}
var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
lbt = max(lt);
dbt = max(dt);
lm = hMap(lt, lbt, 1);
dm = hMap(dt, dbt, 1);
} else
err(1);
if (pos > tbts) {
if (noSt)
err(0);
break;
}
}
if (noBuf)
cbuf(bt + 131072);
var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
var lpos = pos;
for (; ; lpos = pos) {
var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
pos += c & 15;
if (pos > tbts) {
if (noSt)
err(0);
break;
}
if (!c)
err(2);
if (sym < 256)
buf[bt++] = sym;
else if (sym == 256) {
lpos = pos, lm = null;
break;
} else {
var add = sym - 254;
if (sym > 264) {
var i = sym - 257, b = fleb[i];
add = bits(dat, pos, (1 << b) - 1) + fl[i];
pos += b;
}
var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
if (!d)
err(3);
pos += d & 15;
var dt = fd[dsym];
if (dsym > 3) {
var b = fdeb[dsym];
dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
}
if (pos > tbts) {
if (noSt)
err(0);
break;
}
if (noBuf)
cbuf(bt + 131072);
var end = bt + add;
if (bt < dt) {
var shift2 = dl - dt, dend = Math.min(dt, end);
if (shift2 + bt < 0)
err(3);
for (; bt < dend; ++bt)
buf[bt] = dict[shift2 + bt];
}
for (; bt < end; bt += 4) {
buf[bt] = buf[bt - dt];
buf[bt + 1] = buf[bt + 1 - dt];
buf[bt + 2] = buf[bt + 2 - dt];
buf[bt + 3] = buf[bt + 3 - dt];
}
bt = end;
}
}
st.l = lm, st.p = lpos, st.b = bt, st.f = final;
if (lm)
final = 1, st.m = lbt, st.d = dm, st.n = dbt;
} while (!final);
return bt == buf.length ? buf : slc(buf, 0, bt);
};
var et = /* @__PURE__ */ new u8(0);
var gzs = function(d) {
if (d[0] != 31 || d[1] != 139 || d[2] != 8)
err(6, "invalid gzip data");
var flg = d[3];
var st = 10;
if (flg & 4)
st += (d[10] | d[11] << 8) + 2;
for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])
;
return st + (flg & 2);
};
var gzl = function(d) {
var l = d.length;
return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;
};
var zls = function(d, dict) {
if ((d[0] & 15) != 8 || d[0] >> 4 > 7 || (d[0] << 8 | d[1]) % 31)
err(6, "invalid zlib data");
if ((d[1] >> 5 & 1) == +!dict)
err(6, "invalid zlib data: " + (d[1] & 32 ? "need" : "unexpected") + " dictionary");
return (d[1] >> 3 & 4) + 2;
};
function inflateSync(data, opts) {
return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);
}
function gunzipSync(data, opts) {
var st = gzs(data);
if (st + 8 > data.length)
err(6, "invalid gzip data");
return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);
}
function unzlibSync(data, opts) {
return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);
}
function decompressSync(data, opts) {
return data[0] == 31 && data[1] == 139 && data[2] == 8 ? gunzipSync(data, opts) : (data[0] & 15) != 8 || data[0] >> 4 > 7 || (data[0] << 8 | data[1]) % 31 ? inflateSync(data, opts) : unzlibSync(data, opts);
}
var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
var tds = 0;
try {
td.decode(et, { stream: true });
tds = 1;
} catch (e) {
}
// v2.ts
var shift = (n, shift2) => {
return n * __pow(2, shift2);
};
var unshift = (n, shift2) => {
return Math.floor(n / __pow(2, shift2));
};
var getUint24 = (view, pos) => {
return shift(view.getUint16(pos + 1, true), 8) + view.getUint8(pos);
};
var getUint48 = (view, pos) => {
return shift(view.getUint32(pos + 2, true), 16) + view.getUint16(pos, true);
};
var compare = (tz, tx, ty, view, i) => {
if (tz !== view.getUint8(i))
return tz - view.getUint8(i);
const x = getUint24(view, i + 1);
if (tx !== x)
return tx - x;
const y = getUint24(view, i + 4);
if (ty !== y)
return ty - y;
return 0;
};
var queryLeafdir = (view, z, x, y) => {
const offsetLen = queryView(view, z | 128, x, y);
if (offsetLen) {
return {
z,
x,
y,
offset: offsetLen[0],
length: offsetLen[1],
isDir: true
};
}
return null;
};
var queryTile = (view, z, x, y) => {
const offsetLen = queryView(view, z, x, y);
if (offsetLen) {
return {
z,
x,
y,
offset: offsetLen[0],
length: offsetLen[1],
isDir: false
};
}
return null;
};
var queryView = (view, z, x, y) => {
let m = 0;
let n = view.byteLength / 17 - 1;
while (m <= n) {
const k = n + m >> 1;
const cmp = compare(z, x, y, view, k * 17);
if (cmp > 0) {
m = k + 1;
} else if (cmp < 0) {
n = k - 1;
} else {
return [getUint48(view, k * 17 + 7), view.getUint32(k * 17 + 13, true)];
}
}
return null;
};
var entrySort = (a, b) => {
if (a.isDir && !b.isDir) {
return 1;
}
if (!a.isDir && b.isDir) {
return -1;
}
if (a.z !== b.z) {
return a.z - b.z;
}
if (a.x !== b.x) {
return a.x - b.x;
}
return a.y - b.y;
};
var parseEntry = (dataview, i) => {
const zRaw = dataview.getUint8(i * 17);
const z = zRaw & 127;
return {
z,
x: getUint24(dataview, i * 17 + 1),
y: getUint24(dataview, i * 17 + 4),
offset: getUint48(dataview, i * 17 + 7),
length: dataview.getUint32(i * 17 + 13, true),
isDir: zRaw >> 7 === 1
};
};
var sortDir = (a) => {
const entries = [];
const view = new DataView(a);
for (let i = 0; i < view.byteLength / 17; i++) {
entries.push(parseEntry(view, i));
}
return createDirectory(entries);
};
var createDirectory = (entries) => {
entries.sort(entrySort);
const buffer = new ArrayBuffer(17 * entries.length);
const arr = new Uint8Array(buffer);
for (let i = 0; i < entries.length; i++) {
const entry = entries[i];
let z = entry.z;
if (entry.isDir)
z = z | 128;
arr[i * 17] = z;
arr[i * 17 + 1] = entry.x & 255;
arr[i * 17 + 2] = entry.x >> 8 & 255;
arr[i * 17 + 3] = entry.x >> 16 & 255;
arr[i * 17 + 4] = entry.y & 255;
arr[i * 17 + 5] = entry.y >> 8 & 255;
arr[i * 17 + 6] = entry.y >> 16 & 255;
arr[i * 17 + 7] = entry.offset & 255;
arr[i * 17 + 8] = unshift(entry.offset, 8) & 255;
arr[i * 17 + 9] = unshift(entry.offset, 16) & 255;
arr[i * 17 + 10] = unshift(entry.offset, 24) & 255;
arr[i * 17 + 11] = unshift(entry.offset, 32) & 255;
arr[i * 17 + 12] = unshift(entry.offset, 48) & 255;
arr[i * 17 + 13] = entry.length & 255;
arr[i * 17 + 14] = entry.length >> 8 & 255;
arr[i * 17 + 15] = entry.length >> 16 & 255;
arr[i * 17 + 16] = entry.length >> 24 & 255;
}
return buffer;
};
var deriveLeaf = (view, tile) => {
if (view.byteLength < 17)
return null;
const numEntries = view.byteLength / 17;
const entry = parseEntry(view, numEntries - 1);
if (entry.isDir) {
const leafLevel = entry.z;
const levelDiff = tile.z - leafLevel;
const leafX = Math.trunc(tile.x / (1 << levelDiff));
const leafY = Math.trunc(tile.y / (1 << levelDiff));
return { z: leafLevel, x: leafX, y: leafY };
}
return null;
};
function getHeader(source) {
return __async(this, null, function* () {
const resp = yield source.getBytes(0, 512e3);
const dataview = new DataView(resp.data);
const jsonSize = dataview.getUint32(4, true);
const rootEntries = dataview.getUint16(8, true);
const dec = new TextDecoder("utf-8");
const jsonMetadata = JSON.parse(
dec.decode(new DataView(resp.data, 10, jsonSize))
);
let tileCompression = 0 /* Unknown */;
if (jsonMetadata.compression === "gzip") {
tileCompression = 2 /* Gzip */;
}
let minzoom = 0;
if ("minzoom" in jsonMetadata) {
minzoom = +jsonMetadata.minzoom;
}
let maxzoom = 0;
if ("maxzoom" in jsonMetadata) {
maxzoom = +jsonMetadata.maxzoom;
}
let centerLon = 0;
let centerLat = 0;
let centerZoom = 0;
let minLon = -180;
let minLat = -85;
let maxLon = 180;
let maxLat = 85;
if (jsonMetadata.bounds) {
const split = jsonMetadata.bounds.split(",");
minLon = +split[0];
minLat = +split[1];
maxLon = +split[2];
maxLat = +split[3];
}
if (jsonMetadata.center) {
const split = jsonMetadata.center.split(",");
centerLon = +split[0];
centerLat = +split[1];
centerZoom = +split[2];
}
const header = {
specVersion: dataview.getUint16(2, true),
rootDirectoryOffset: 10 + jsonSize,
rootDirectoryLength: rootEntries * 17,
jsonMetadataOffset: 10,
jsonMetadataLength: jsonSize,
leafDirectoryOffset: 0,
leafDirectoryLength: void 0,
tileDataOffset: 0,
tileDataLength: void 0,
numAddressedTiles: 0,
numTileEntries: 0,
numTileContents: 0,
clustered: false,
internalCompression: 1 /* None */,
tileCompression,
tileType: 1 /* Mvt */,
minZoom: minzoom,
maxZoom: maxzoom,
minLon,
minLat,
maxLon,
maxLat,
centerZoom,
centerLon,
centerLat,
etag: resp.etag
};
return header;
});
}
function getZxy(header, source, cache, z, x, y, signal) {
return __async(this, null, function* () {
let rootDir = yield cache.getArrayBuffer(
source,
header.rootDirectoryOffset,
header.rootDirectoryLength,
header
);
if (header.specVersion === 1) {
rootDir = sortDir(rootDir);
}
const entry = queryTile(new DataView(rootDir), z, x, y);
if (entry) {
const resp = yield source.getBytes(entry.offset, entry.length, signal);
let tileData = resp.data;
const view = new DataView(tileData);
if (view.getUint8(0) === 31 && view.getUint8(1) === 139) {
tileData = decompressSync(new Uint8Array(tileData));
}
return {
data: tileData
};
}
const leafcoords = deriveLeaf(new DataView(rootDir), { z, x, y });
if (leafcoords) {
const leafdirEntry = queryLeafdir(
new DataView(rootDir),
leafcoords.z,
leafcoords.x,
leafcoords.y
);
if (leafdirEntry) {
let leafDir = yield cache.getArrayBuffer(
source,
leafdirEntry.offset,
leafdirEntry.length,
header
);
if (header.specVersion === 1) {
leafDir = sortDir(leafDir);
}
const tileEntry = queryTile(new DataView(leafDir), z, x, y);
if (tileEntry) {
const resp = yield source.getBytes(
tileEntry.offset,
tileEntry.length,
signal
);
let tileData = resp.data;
const view = new DataView(tileData);
if (view.getUint8(0) === 31 && view.getUint8(1) === 139) {
tileData = decompressSync(new Uint8Array(tileData));
}
return {
data: tileData
};
}
}
}
return void 0;
});
}
var v2_default = {
getHeader,
getZxy
};
// adapters.ts
var leafletRasterLayer = (source, options) => {
let loaded = false;
let mimeType = "";
const cls = L.GridLayer.extend({
createTile: (coord, done) => {
const el = document.createElement("img");
const controller = new AbortController();
const signal = controller.signal;
el.cancel = () => {
controller.abort();
};
if (!loaded) {
source.getHeader().then((header) => {
if (header.tileType === 1 /* Mvt */) {
console.error(
"Error: archive contains MVT vector tiles, but leafletRasterLayer is for displaying raster tiles. See https://github.com/protomaps/PMTiles/tree/main/js for details."
);
} else if (header.tileType === 2) {
mimeType = "image/png";
} else if (header.tileType === 3) {
mimeType = "image/jpeg";
} else if (header.tileType === 4) {
mimeType = "image/webp";
} else if (header.tileType === 5) {
mimeType = "image/avif";
}
});
loaded = true;
}
source.getZxy(coord.z, coord.x, coord.y, signal).then((arr) => {
if (arr) {
const blob = new Blob([arr.data], { type: mimeType });
const imageUrl = window.URL.createObjectURL(blob);
el.src = imageUrl;
el.cancel = void 0;
done(void 0, el);
}
}).catch((e) => {
if (e.name !== "AbortError") {
throw e;
}
});
return el;
},
_removeTile: function(key) {
const tile = this._tiles[key];
if (!tile) {
return;
}
if (tile.el.cancel)
tile.el.cancel();
tile.el.width = 0;
tile.el.height = 0;
tile.el.deleted = true;
L.DomUtil.remove(tile.el);
delete this._tiles[key];
this.fire("tileunload", {
tile: tile.el,
coords: this._keyToTileCoords(key)
});
}
});
return new cls(options);
};
var v3compat = (v4) => (requestParameters, arg2) => {
if (arg2 instanceof AbortController) {
return v4(requestParameters, arg2);
}
const abortController = new AbortController();
v4(requestParameters, abortController).then(
(result) => {
return arg2(
void 0,
result.data,
result.cacheControl || "",
result.expires || ""
);
},
(err2) => {
return arg2(err2);
}
).catch((e) => {
return arg2(e);
});
return { cancel: () => abortController.abort() };
};
var Protocol = class {
/**
* Initialize the MapLibre PMTiles protocol.
*
* * metadata: also load the metadata section of the PMTiles. required for some "inspect" functionality
* and to automatically populate the map attribution. Requires an extra HTTP request.
*/
constructor(options) {
/** @hidden */
this.tilev4 = (params, abortController) => __async(this, null, function* () {
if (params.type === "json") {
const pmtilesUrl2 = params.url.substr(10);
let instance2 = this.tiles.get(pmtilesUrl2);
if (!instance2) {
instance2 = new PMTiles(pmtilesUrl2);
this.tiles.set(pmtilesUrl2, instance2);
}
if (this.metadata) {
return {
data: yield instance2.getTileJson(params.url)
};
}
const h = yield instance2.getHeader();
return {
data: {
tiles: [`${params.url}/{z}/{x}/{y}`],
minzoom: h.minZoom,
maxzoom: h.maxZoom,
bounds: [h.minLon, h.minLat, h.maxLon, h.maxLat]
}
};
}
const re = new RegExp(/pmtiles:\/\/(.+)\/(\d+)\/(\d+)\/(\d+)/);
const result = params.url.match(re);
if (!result) {
throw new Error("Invalid PMTiles protocol URL");
}
const pmtilesUrl = result[1];
let instance = this.tiles.get(pmtilesUrl);
if (!instance) {
instance = new PMTiles(pmtilesUrl);
this.tiles.set(pmtilesUrl, instance);
}
const z = result[2];
const x = result[3];
const y = result[4];
const header = yield instance.getHeader();
const resp = yield instance == null ? void 0 : instance.getZxy(+z, +x, +y, abortController.signal);
if (resp) {
return {
data: new Uint8Array(resp.data),
cacheControl: resp.cacheControl,
expires: resp.expires
};
}
if (header.tileType === 1 /* Mvt */) {
return { data: new Uint8Array() };
}
return { data: null };
});
this.tile = v3compat(this.tilev4);
this.tiles = /* @__PURE__ */ new Map();
this.metadata = (options == null ? void 0 : options.metadata) || false;
}
/**
* Add a {@link PMTiles} instance to the global protocol instance.
*
* For remote fetch sources, references in MapLibre styles like pmtiles://http://...
* will resolve to the same instance if the URLs match.
*/
add(p) {
this.tiles.set(p.source.getKey(), p);
}
/**
* Fetch a {@link PMTiles} instance by URL, for remote PMTiles instances.
*/
get(url) {
return this.tiles.get(url);
}
};
// index.ts
function toNum(low, high) {
return (high >>> 0) * 4294967296 + (low >>> 0);
}
function readVarintRemainder(l, p) {
const buf = p.buf;
let b = buf[p.pos++];
let h = (b & 112) >> 4;
if (b < 128)
return toNum(l, h);
b = buf[p.pos++];
h |= (b & 127) << 3;
if (b < 128)
return toNum(l, h);
b = buf[p.pos++];
h |= (b & 127) << 10;
if (b < 128)
return toNum(l, h);
b = buf[p.pos++];
h |= (b & 127) << 17;
if (b < 128)
return toNum(l, h);
b = buf[p.pos++];
h |= (b & 127) << 24;
if (b < 128)
return toNum(l, h);
b = buf[p.pos++];
h |= (b & 1) << 31;
if (b < 128)
return toNum(l, h);
throw new Error("Expected varint not more than 10 bytes");
}
function readVarint(p) {
const buf = p.buf;
let b = buf[p.pos++];
let val = b & 127;
if (b < 128)
return val;
b = buf[p.pos++];
val |= (b & 127) << 7;
if (b < 128)
return val;
b = buf[p.pos++];
val |= (b & 127) << 14;
if (b < 128)
return val;
b = buf[p.pos++];
val |= (b & 127) << 21;
if (b < 128)
return val;
b = buf[p.pos];
val |= (b & 15) << 28;
return readVarintRemainder(val, p);
}
function rotate(n, xy, rx, ry) {
if (ry === 0) {
if (rx === 1) {
xy[0] = n - 1 - xy[0];
xy[1] = n - 1 - xy[1];
}
const t = xy[0];
xy[0] = xy[1];
xy[1] = t;
}
}
function idOnLevel(z, pos) {
const n = __pow(2, z);
let rx = pos;
let ry = pos;
let t = pos;
const xy = [0, 0];
let s = 1;
while (s < n) {
rx = 1 & t / 2;
ry = 1 & (t ^ rx);
rotate(s, xy, rx, ry);
xy[0] += s * rx;
xy[1] += s * ry;
t = t / 4;
s *= 2;
}
return [z, xy[0], xy[1]];
}
var tzValues = [
0,
1,
5,
21,
85,
341,
1365,
5461,
21845,
87381,
349525,
1398101,
5592405,
22369621,
89478485,
357913941,
1431655765,
5726623061,
22906492245,
91625968981,
366503875925,
1466015503701,
5864062014805,
23456248059221,
93824992236885,
375299968947541,
1501199875790165
];
function zxyToTileId(z, x, y) {
if (z > 26) {
throw Error("Tile zoom level exceeds max safe number limit (26)");
}
if (x > __pow(2, z) - 1 || y > __pow(2, z) - 1) {
throw Error("tile x/y outside zoom level bounds");
}
const acc = tzValues[z];
const n = __pow(2, z);
let rx = 0;
let ry = 0;
let d = 0;
const xy = [x, y];
let s = n / 2;
while (s > 0) {
rx = (xy[0] & s) > 0 ? 1 : 0;
ry = (xy[1] & s) > 0 ? 1 : 0;
d += s * s * (3 * rx ^ ry);
rotate(s, xy, rx, ry);
s = s / 2;
}
return acc + d;
}
function tileIdToZxy(i) {
let acc = 0;
const z = 0;
for (let z2 = 0; z2 < 27; z2++) {
const numTiles = (1 << z2) * (1 << z2);
if (acc + numTiles > i) {
return idOnLevel(z2, i - acc);
}
acc += numTiles;
}
throw Error("Tile zoom level exceeds max safe number limit (26)");
}
var Compression = /* @__PURE__ */ ((Compression2) => {
Compression2[Compression2["Unknown"] = 0] = "Unknown";
Compression2[Compression2["None"] = 1] = "None";
Compression2[Compression2["Gzip"] = 2] = "Gzip";
Compression2[Compression2["Brotli"] = 3] = "Brotli";
Compression2[Compression2["Zstd"] = 4] = "Zstd";
return Compression2;
})(Compression || {});
function defaultDecompress(buf, compression) {
return __async(this, null, function* () {
if (compression === 1 /* None */ || compression === 0 /* Unknown */) {
return buf;
}
if (compression === 2 /* Gzip */) {
if (typeof globalThis.DecompressionStream === "undefined") {
return decompressSync(new Uint8Array(buf));
}
const stream = new Response(buf).body;
if (!stream) {
throw Error("Failed to read response stream");
}
const result = stream.pipeThrough(
// biome-ignore lint: needed to detect DecompressionStream in browser+node+cloudflare workers
new globalThis.DecompressionStream("gzip")
);
return new Response(result).arrayBuffer();
}
throw Error("Compression method not supported");
});
}
var TileType = /* @__PURE__ */ ((TileType2) => {
TileType2[TileType2["Unknown"] = 0] = "Unknown";
TileType2[TileType2["Mvt"] = 1] = "Mvt";
TileType2[TileType2["Png"] = 2] = "Png";
TileType2[TileType2["Jpeg"] = 3] = "Jpeg";
TileType2[TileType2["Webp"] = 4] = "Webp";
TileType2[TileType2["Avif"] = 5] = "Avif";
return TileType2;
})(TileType || {});
function tileTypeExt(t) {
if (t === 1 /* Mvt */)
return ".mvt";
if (t === 2 /* Png */)
return ".png";
if (t === 3 /* Jpeg */)
return ".jpg";
if (t === 4 /* Webp */)
return ".webp";
if (t === 5 /* Avif */)
return ".avif";
return "";
}
var HEADER_SIZE_BYTES = 127;
function findTile(entries, tileId) {
let m = 0;
let n = entries.length - 1;
while (m <= n) {
const k = n + m >> 1;
const cmp = tileId - entries[k].tileId;
if (cmp > 0) {
m = k + 1;
} else if (cmp < 0) {
n = k - 1;
} else {
return entries[k];
}
}
if (n >= 0) {
if (entries[n].runLength === 0) {
return entries[n];
}
if (tileId - entries[n].tileId < entries[n].runLength) {
return entries[n];
}
}
return null;
}
var FileSource = class {
constructor(file) {
this.file = file;
}
getKey() {
return this.file.name;
}
getBytes(offset, length) {
return __async(this, null, function* () {
const blob = this.file.slice(offset, offset + length);
const a = yield blob.arrayBuffer();
return { data: a };
});
}
};
var FetchSource = class {
constructor(url, customHeaders = new Headers()) {
this.url = url;
this.customHeaders = customHeaders;
this.mustReload = false;
let userAgent = "";
if ("navigator" in globalThis) {
userAgent = globalThis.navigator.userAgent || "";
}
const isWindows = userAgent.indexOf("Windows") > -1;
const isChromiumBased = /Chrome|Chromium|Edg|OPR|Brave/.test(userAgent);
this.chromeWindowsNoCache = false;
if (isWindows && isChromiumBased) {
this.chromeWindowsNoCache = true;
}
}
getKey() {
return this.url;
}
/**
* Mutate the custom [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) set for all requests to the remote archive.
*/
setHeaders(customHeaders) {
this.customHeaders = customHeaders;
}
getBytes(offset, length, passedSignal, etag) {
return __async(this, null, function* () {
let controller;
let signal;
if (passedSignal) {
signal = passedSignal;
} else {
controller = new AbortController();
signal = controller.signal;
}
const requestHeaders = new Headers(this.customHeaders);
requestHeaders.set("range", `bytes=${offset}-${offset + length - 1}`);
let cache;
if (this.mustReload) {
cache = "reload";
} else if (this.chromeWindowsNoCache) {
cache = "no-store";
}
let resp = yield fetch(this.url, {
signal,
cache,
headers: requestHeaders
//biome-ignore lint: "cache" is incompatible between cloudflare workers and browser
});
if (offset === 0 && resp.status === 416) {
const contentRange = resp.headers.get("Content-Range");
if (!contentRange || !contentRange.startsWith("bytes */")) {
throw Error("Missing content-length on 416 response");
}
const actualLength = +contentRange.substr(8);
resp = yield fetch(this.url, {
signal,
cache: "reload",
headers: { range: `bytes=0-${actualLength - 1}` }
//biome-ignore lint: "cache" is incompatible between cloudflare workers and browser
});
}
let newEtag = resp.headers.get("Etag");
if (newEtag == null ? void 0 : newEtag.startsWith("W/")) {
newEtag = null;
}
if (resp.status === 416 || etag && newEtag && newEtag !== etag) {
this.mustReload = true;
throw new EtagMismatch(
`Server returned non-matching ETag ${etag} after one retry. Check browser extensions and servers for issues that may affect correct ETag headers.`
);
}
if (resp.status >= 300) {
throw Error(`Bad response code: ${resp.status}`);
}
const contentLength = resp.headers.get("Content-Length");
if (resp.status === 200 && (!contentLength || +contentLength > length)) {
if (controller)
controller.abort();
throw Error(
"Server returned no content-length header or content-length exceeding request. Check that your storage backend supports HTTP Byte Serving."
);
}
const a = yield resp.arrayBuffer();
return {
data: a,
etag: newEtag || void 0,
cacheControl: resp.headers.get("Cache-Control") || void 0,
expires: resp.headers.get("Expires") || void 0
};
});
}
};
function getUint64(v, offset) {
const wh = v.getUint32(offset + 4, true);
const wl = v.getUint32(offset + 0, true);
return wh * __pow(2, 32) + wl;
}
function bytesToHeader(bytes, etag) {
const v = new DataView(bytes);
const specVersion = v.getUint8(7);
if (specVersion > 3) {
throw Error(
`Archive is spec version ${specVersion} but this library supports up to spec version 3`
);
}
return {
specVersion,
rootDirectoryOffset: getUint64(v, 8),
rootDirectoryLength: getUint64(v, 16),
jsonMetadataOffset: getUint64(v, 24),
jsonMetadataLength: getUint64(v, 32),
leafDirectoryOffset: getUint64(v, 40),
leafDirectoryLength: getUint64(v, 48),
tileDataOffset: getUint64(v, 56),
tileDataLength: getUint64(v, 64),
numAddressedTiles: getUint64(v, 72),
numTileEntries: getUint64(v, 80),
numTileContents: getUint64(v, 88),
clustered: v.getUint8(96) === 1,
internalCompression: v.getUint8(97),
tileCompression: v.getUint8(98),
tileType: v.getUint8(99),
minZoom: v.getUint8(100),
maxZoom: v.getUint8(101),
minLon: v.getInt32(102, true) / 1e7,
minLat: v.getInt32(106, true) / 1e7,
maxLon: v.getInt32(110, true) / 1e7,
maxLat: v.getInt32(114, true) / 1e7,
centerZoom: v.getUint8(118),
centerLon: v.getInt32(119, true) / 1e7,
centerLat: v.getInt32(123, true) / 1e7,
etag
};
}
function deserializeIndex(buffer) {
const p = { buf: new Uint8Array(buffer), pos: 0 };
const numEntries = readVarint(p);
const entries = [];
let lastId = 0;
for (let i = 0; i < numEntries; i++) {
const v = readVarint(p);
entries.push({ tileId: lastId + v, offset: 0, length: 0, runLength: 1 });
lastId += v;
}
for (let i = 0; i < numEntries; i++) {
entries[i].runLength = readVarint(p);
}
for (let i = 0; i < numEntries; i++) {
entries[i].length = readVarint(p);
}
for (let i = 0; i < numEntries; i++) {
const v = readVarint(p);
if (v === 0 && i > 0) {
entries[i].offset = entries[i - 1].offset + entries[i - 1].length;
} else {
entries[i].offset = v - 1;
}
}
return entries;
}
function detectVersion(a) {
const v = new DataView(a);
if (v.getUint16(2, true) === 2) {
console.warn(
"PMTiles spec version 2 has been deprecated; please see github.com/protomaps/PMTiles for tools to upgrade"
);
return 2;
}
if (v.getUint16(2, true) === 1) {
console.warn(
"PMTiles spec version 1 has been deprecated; please see github.com/protomaps/PMTiles for tools to upgrade"
);
return 1;
}
return 3;
}
var EtagMismatch = class extends Error {
};
function getHeaderAndRoot(source, decompress) {
return __async(this, null, function* () {
const resp = yield source.getBytes(0, 16384);
const v = new DataView(resp.data);
if (v.getUint16(0, true) !== 19792) {
throw new Error("Wrong magic number for PMTiles archive");
}
if (detectVersion(resp.data) < 3) {
return [yield v2_default.getHeader(source)];
}
const headerData = resp.data.slice(0, HEADER_SIZE_BYTES);
const header = bytesToHeader(headerData, resp.etag);
const rootDirData = resp.data.slice(
header.rootDirectoryOffset,
header.rootDirectoryOffset + header.rootDirectoryLength
);
const dirKey = `${source.getKey()}|${header.etag || ""}|${header.rootDirectoryOffset}|${header.rootDirectoryLength}`;
const rootDir = deserializeIndex(
yield decompress(rootDirData, header.internalCompression)
);
return [header, [dirKey, rootDir.length, rootDir]];
});
}
function getDirectory(source, decompress, offset, length, header) {
return __async(this, null, function* () {
const resp = yield source.getBytes(offset, length, void 0, header.etag);
const data = yield decompress(resp.data, header.internalCompression);
const directory = deserializeIndex(data);
if (directory.length === 0) {
throw new Error("Empty directory is invalid");
}
return directory;
});
}
var ResolvedValueCache = class {
constructor(maxCacheEntries = 100, prefetch = true, decompress = defaultDecompress) {
this.cache = /* @__PURE__ */ new Map();
this.maxCacheEntries = maxCacheEntries;
this.counter = 1;
this.decompress = decompress;
}
getHeader(source) {
return __async(this, null, function* () {
const cacheKey = source.getKey();
const cacheValue = this.cache.get(cacheKey);
if (cacheValue) {
cacheValue.lastUsed = this.counter++;
const data = cacheValue.data;
return data;
}
const res = yield getHeaderAndRoot(source, this.decompress);
if (res[1]) {
this.cache.set(res[1][0], {
lastUsed: this.counter++,
data: res[1][2]
});
}
this.cache.set(cacheKey, {
lastUsed: this.counter++,
data: res[0]
});
this.prune();
return res[0];
});
}
getDirectory(source, offset, length, header) {
return __async(this, null, function* () {
const cacheKey = `${source.getKey()}|${header.etag || ""}|${offset}|${length}`;
const cacheValue = this.cache.get(cacheKey);
if (cacheValue) {
cacheValue.lastUsed = this.counter++;
const data = cacheValue.data;
return data;
}
const directory = yield getDirectory(
source,
this.decompress,
offset,
length,
header
);
this.cache.set(cacheKey, {
lastUsed: this.counter++,
data: directory
});
this.prune();
return directory;
});
}
// for v2 backwards compatibility
getArrayBuffer(source, offset, length, header) {
return __async(this, null, function* () {
const cacheKey = `${source.getKey()}|${header.etag || ""}|${offset}|${length}`;
const cacheValue = this.cache.get(cacheKey);
if (cacheValue) {
cacheValue.lastUsed = this.counter++;
const data = yield cacheValue.data;
return data;
}
const resp = yield source.getBytes(offset, length, void 0, header.etag);
this.cache.set(cacheKey, {
lastUsed: this.counter++,
data: resp.data
});
this.prune();
return resp.data;
});
}
prune() {
if (this.cache.size > this.maxCacheEntries) {
let minUsed = Infinity;
let minKey = void 0;
this.cache.forEach((cacheValue, key) => {
if (cacheValue.lastUsed < minUsed) {
minUsed = cacheValue.lastUsed;
minKey = key;
}
});
if (minKey) {
this.cache.delete(minKey);
}
}
}
invalidate(source) {
return __async(this, null, function* () {
this.cache.delete(source.getKey());
});
}
};
var SharedPromiseCache = class {
constructor(maxCacheEntries = 100, prefetch = true, decompress = defaultDecompress) {
this.cache = /* @__PURE__ */ new Map();
this.invalidations = /* @__PURE__ */ new Map();
this.maxCacheEntries = maxCacheEntries;
this.counter = 1;
this.decompress = decompress;
}
getHeader(source) {
return __async(this, null, function* () {
const cacheKey = source.getKey();
const cacheValue = this.cache.get(cacheKey);
if (cacheValue) {
cacheValue.lastUsed = this.counter++;
const data = yield cacheValue.data;
return data;
}
const p = new Promise((resolve, reject) => {
getHeaderAndRoot(source, this.decompress).then((res) => {
if (res[1]) {
this.cache.set(res[1][0], {
lastUsed: this.counter++,
data: Promise.resolve(res[1][2])
});
}
resolve(res[0]);
this.prune();
}).catch((e) => {
reject(e);
});
});
this.cache.set(cacheKey, { lastUsed: this.counter++, data: p });
return p;
});
}
getDirectory(source, offset, length, header) {
return __async(this, null, function* () {
const cacheKey = `${source.getKey()}|${header.etag || ""}|${offset}|${length}`;
const cacheValue = this.cache.get(cacheKey);
if (cacheValue) {
cacheValue.lastUsed = this.counter++;
const data = yield cacheValue.data;
return data;
}
const p = new Promise((resolve, reject) => {
getDirectory(source, this.decompress, offset, length, header).then((directory) => {
resolve(directory);
this.prune();
}).catch((e) => {
reject(e);
});
});
this.cache.set(cacheKey, { lastUsed: this.counter++, data: p });
return p;
});
}
// for v2 backwards compatibility
getArrayBuffer(source, offset, length, header) {
return __async(this, null, function* () {
const cacheKey = `${source.getKey()}|${header.etag || ""}|${offset}|${length}`;
const cacheValue = this.cache.get(cacheKey);
if (cacheValue) {
cacheValue.lastUsed = this.counter++;
const data = yield cacheValue.data;
return data;
}
const p = new Promise((resolve, reject) => {
source.getBytes(offset, length, void 0, header.etag).then((resp) => {
resolve(resp.data);
if (this.cache.has(cacheKey)) {
}
this.prune();
}).catch((e) => {
reject(e);
});
});
this.cache.set(cacheKey, { lastUsed: this.counter++, data: p });
return p;
});
}
prune() {
if (this.cache.size >= this.maxCacheEntries) {
let minUsed = Infinity;
let minKey = void 0;
this.cache.forEach((cacheValue, key) => {
if (cacheValue.lastUsed < minUsed) {
minUsed = cacheValue.lastUsed;
minKey = key;
}
});
if (minKey) {
this.cache.delete(minKey);
}
}
}
invalidate(source) {
return __async(this, null, function* () {
const key = source.getKey();
if (this.invalidations.get(key)) {
return yield this.invalidations.get(key);
}
this.cache.delete(source.getKey());
const p = new Promise((resolve, reject) => {
this.getHeader(source).then((h) => {
resolve();
this.invalidations.delete(key);
}).catch((e) => {
reject(e);
});
});
this.invalidations.set(key, p);
});
}
};
var PMTiles = class {
constructor(source, cache, decompress) {
if (typeof source === "string") {
this.source = new FetchSource(source);
} else {
this.source = source;
}
if (decompress) {
this.decompress = decompress;
} else {
this.decompress = defaultDecompress;
}
if (cache) {
this.cache = cache;
} else {
this.cache = new SharedPromiseCache();
}
}
/**
* Return the header of the archive,
* including information such as tile type, min/max zoom, bounds, and summary statistics.
*/
getHeader() {
return __async(this, null, function* () {
return yield this.cache.getHeader(this.source);
});
}
/** @hidden */
getZxyAttempt(z, x, y, signal) {
return __async(this, null, function* () {
const tileId = zxyToTileId(z, x, y);
const header = yield this.cache.getHeader(this.source);
if (header.specVersion < 3) {
return v2_default.getZxy(header, this.source, this.cache, z, x, y, signal);
}
if (z < header.minZoom || z > header.maxZoom) {
return void 0;
}
let dO = header.rootDirectoryOffset;
let dL = header.rootDirectoryLength;
for (let depth = 0; depth <= 3; depth++) {
const directory = yield this.cache.getDirectory(
this.source,
dO,
dL,
header
);
const entry = findTile(directory, tileId);
if (entry) {
if (entry.runLength > 0) {
const resp = yield this.source.getBytes(
header.tileDataOffset + entry.offset,
entry.length,
signal,
header.etag
);
return {
data: yield this.decompress(resp.data, header.tileCompression),
cacheControl: resp.cacheControl,
expires: resp.expires
};
}
dO = header.leafDirectoryOffset + entry.offset;
dL = entry.length;
} else {
return void 0;
}
}
throw Error("Maximum directory depth exceeded");
});
}
/**
* Primary method to get a single tile's bytes from an archive.
*
* Returns undefined if the tile does not exist in the archive.
*/
getZxy(z, x, y, signal) {
return __async(this, null, function* () {
try {
return yield this.getZxyAttempt(z, x, y, signal);
} catch (e) {
if (e instanceof EtagMismatch) {
this.cache.invalidate(this.source);
return yield this.getZxyAttempt(z, x, y, signal);
}
throw e;
}
});
}
/** @hidden */
getMetadataAttempt() {
return __async(this, null, function* () {
const header = yield this.cache.getHeader(this.source);
const resp = yield this.source.getBytes(
header.jsonMetadataOffset,
header.jsonMetadataLength,
void 0,
header.etag
);
const decompressed = yield this.decompress(
resp.data,
header.internalCompression
);
const dec = new TextDecoder("utf-8");
return JSON.parse(dec.decode(decompressed));
});
}
/**
* Return the arbitrary JSON metadata of the archive.
*/
getMetadata() {
return __async(this, null, function* () {
try {
return yield this.getMetadataAttempt();
} catch (e) {
if (e instanceof EtagMismatch) {
this.cache.invalidate(this.source);
return yield this.getMetadataAttempt();
}
throw e;
}
});
}
/**
* Construct a [TileJSON](https://github.com/mapbox/tilejson-spec) object.
*
* baseTilesUrl is the desired tiles URL, excluding the suffix `/{z}/{x}/{y}.{ext}`.
* For example, if the desired URL is `http://example.com/tileset/{z}/{x}/{y}.mvt`,
* the baseTilesUrl should be `https://example.com/tileset`.
*/
getTileJson(baseTilesUrl) {
return __async(this, null, function* () {
const header = yield this.getHeader();
const metadata = yield this.getMetadata();
const ext = tileTypeExt(header.tileType);
return {
tilejson: "3.0.0",
scheme: "xyz",
tiles: [`${baseTilesUrl}/{z}/{x}/{y}${ext}`],
// biome-ignore lint: TileJSON spec
vector_layers: metadata.vector_layers,
attribution: metadata.attribution,
description: metadata.description,
name: metadata.name,
version: metadata.version,
bounds: [header.minLon, header.minLat, header.maxLon, header.maxLat],
center: [header.centerLon, header.centerLat, header.centerZoom],
minzoom: header.minZoom,
maxzoom: header.maxZoom
};
});
}
};
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
"use strict";
/*!************************!*\
!*** ./src/ts/Main.ts ***!
\************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _Map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Map */ "./src/ts/Map.ts");
})();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFdBQVc7QUFDNUI7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFFBQVE7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLE1BQU07QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxNQUFNO0FBQzlDO0FBQ0E7QUFDQSx3RUFBd0UsTUFBTTtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRCxTQUFTO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGdCQUFnQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxlQUFlO0FBQ2YsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGVBQWU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsZUFBZTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7QUNOZSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy90cy9NYXAudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL21vZHVsZXMvQWRkQ291bnRyeUJvcmRlck1vZHVsZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvbW9kdWxlcy9NYXBMYXllclNwZWNpZmljYXRpb25Nb2R1bGUudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21hcGxpYnJlLWdsL2Rpc3QvbWFwbGlicmUtZ2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3BtdGlsZXMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL01haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcG10aWxlcyBmcm9tIFwicG10aWxlc1wiO1xuaW1wb3J0ICogYXMgbWFwbGlicmVnbCBmcm9tIFwibWFwbGlicmUtZ2xcIjtcbmltcG9ydCB7IGxheWVyU3BlY2lmaWNhdGlvbiB9IGZyb20gXCIuL21vZHVsZXMvTWFwTGF5ZXJTcGVjaWZpY2F0aW9uTW9kdWxlXCI7XG5pbXBvcnQgeyBhZGRDb3VudHJ5Qm9yZGVyIH0gZnJvbSBcIi4vbW9kdWxlcy9BZGRDb3VudHJ5Qm9yZGVyTW9kdWxlXCI7XG5cbi8vIHJlYWQgaHR0cHM6Ly9tYXBsaWJyZS5vcmcvbWFwbGlicmUtZ2wtanMvZG9jcy9leGFtcGxlcy9wbXRpbGVzL1xuLy8gYWRkIHBtdGlsZXMgcHJvdG9jb2xcbmxldCBwcm90b2NvbCA9IG5ldyBwbXRpbGVzLlByb3RvY29sKCk7XG5tYXBsaWJyZWdsLmFkZFByb3RvY29sKFwicG10aWxlc1wiLCBwcm90b2NvbC50aWxlKTtcblxuLy8gY3JlYXRlIG1hcCB0aWxlc1xuY29uc3QgbWFwID0gbmV3IG1hcGxpYnJlZ2wuTWFwKHtcbiAgY29udGFpbmVyOiBcIm1hcFwiLFxuICB6b29tOiAxLFxuICBtaW5ab29tOiAyLFxuICBtYXhab29tOiA2LFxuICBjZW50ZXI6IFswLCAwXSxcbiAgc3R5bGU6IHtcbiAgICB2ZXJzaW9uOiA4LFxuICAgIHNvdXJjZXM6IHtcbiAgICAgIHRpbGVzOiB7XG4gICAgICAgIHR5cGU6IFwidmVjdG9yXCIsXG4gICAgICAgIC8vIHJlYWQgaHR0cHM6Ly9tYXBsaWJyZS5vcmcvbWFwbGlicmUtc3R5bGUtc3BlYy9zb3VyY2VzLyN2ZWN0b3JcbiAgICAgICAgdXJsOiBcInBtdGlsZXM6Ly9odHRwczovL25iZzEueW91ci1vYmplY3RzdG9yYWdlLmNvbS9tYXBzL21hcC5wbXRpbGVzXCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy9cbiAgICBsYXllcnM6IGxheWVyU3BlY2lmaWNhdGlvbixcbiAgfSxcbn0pO1xuXG4vLyBkZWJ1Z1xuLy9tYXAuc2hvd1RpbGVCb3VuZGFyaWVzID0gdHJ1ZTtcblxuLy8gYWRkIHpvb20gYW5kIHJvdGF0aW9uIGNvbnRyb2xzXG5tYXAuYWRkQ29udHJvbChuZXcgbWFwbGlicmVnbC5OYXZpZ2F0aW9uQ29udHJvbCgpKTtcblxuYWRkQ291bnRyeUJvcmRlcihtYXApO1xuIiwibGV0IGhvdmVyZWRTdGF0ZUlkID0gbnVsbDtcblxuZXhwb3J0IGNvbnN0IGFkZENvdW50cnlCb3JkZXIgPSAobWFwOiBtYXBsaWJyZWdsLk1hcCkgPT4ge1xuICBtYXAub24oXCJsb2FkXCIsICgpID0+IHtcbiAgICBtYXAuYWRkU291cmNlKFwic3RhdGVzXCIsIHtcbiAgICAgIHR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgZGF0YTogXCIvc3RhdGljL3NyYy9lYXJ0aC5nZW9qc29uXCIsXG4gICAgICBwcm9tb3RlSWQ6IFwiaXNvX24zXCIsIC8vIHVzZSB0aGlzIGZpZWxkIGFzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZWFjaCBjb3VudHJ5XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgZmVhdHVyZS1zdGF0ZSBkZXBlbmRlbnQgZmlsbC1vcGFjaXR5IGV4cHJlc3Npb24gd2lsbCByZW5kZXIgdGhlIGhvdmVyIGVmZmVjdFxuICAgIC8vIHdoZW4gYSBmZWF0dXJlJ3MgaG92ZXIgc3RhdGUgaXMgc2V0IHRvIHRydWUuXG4gICAgbWFwLmFkZExheWVyKHtcbiAgICAgIGlkOiBcInN0YXRlLWZpbGxzXCIsXG4gICAgICB0eXBlOiBcImZpbGxcIixcbiAgICAgIHNvdXJjZTogXCJzdGF0ZXNcIixcbiAgICAgIGxheW91dDoge30sXG4gICAgICBwYWludDoge1xuICAgICAgICBcImZpbGwtY29sb3JcIjogXCIjNjI3QkMxXCIsXG4gICAgICAgIFwiZmlsbC1vcGFjaXR5XCI6IFtcbiAgICAgICAgICBcImNhc2VcIixcbiAgICAgICAgICBbXCJib29sZWFuXCIsIFtcImZlYXR1cmUtc3RhdGVcIiwgXCJob3ZlclwiXSwgZmFsc2VdLFxuICAgICAgICAgIDAuMixcbiAgICAgICAgICAwLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1hcC5hZGRMYXllcih7XG4gICAgICBpZDogXCJzdGF0ZS1ib3JkZXJzXCIsXG4gICAgICB0eXBlOiBcImxpbmVcIixcbiAgICAgIHNvdXJjZTogXCJzdGF0ZXNcIixcbiAgICAgIGxheW91dDoge1xuICAgICAgICBcImxpbmUtam9pblwiOiBcInJvdW5kXCIsXG4gICAgICAgIFwibGluZS1jYXBcIjogXCJyb3VuZFwiLFxuICAgICAgfSxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgIFwibGluZS1jb2xvclwiOiBcIiM0YjRiNGJcIiwgLy8gQm9yZGVyIGNvbG9yXG4gICAgICAgIFwibGluZS13aWR0aFwiOiBbXG4gICAgICAgICAgXCJjYXNlXCIsXG4gICAgICAgICAgW1wiYm9vbGVhblwiLCBbXCJmZWF0dXJlLXN0YXRlXCIsIFwiaG92ZXJcIl0sIGZhbHNlXSwgLy8gQ2hlY2sgaWYgaG92ZXJlZFxuICAgICAgICAgIDEsIC8vIFRoaWNrZXIgYm9yZGVyIG9uIGhvdmVyXG4gICAgICAgICAgMC41LCAvLyBSZWd1bGFyIGJvcmRlciB3aWR0aFxuICAgICAgICBdLFxuICAgICAgICBcImxpbmUtb3BhY2l0eVwiOiAxLCAvLyBGdWxsIG9wYWNpdHkgZm9yIGJvcmRlcnNcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBXaGVuIHRoZSB1c2VyIG1vdmVzIHRoZWlyIG1vdXNlIG92ZXIgdGhlIHN0YXRlLWZpbGwgbGF5ZXIsIHdlJ2xsIHVwZGF0ZSB0aGVcbiAgICAvLyBmZWF0dXJlIHN0YXRlIGZvciB0aGUgZmVhdHVyZSB1bmRlciB0aGUgbW91c2UuXG4gICAgbWFwLm9uKFwibW91c2Vtb3ZlXCIsIFwic3RhdGUtZmlsbHNcIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGhvdmVyZWRTdGF0ZUlkKSB7XG4gICAgICAgICAgbWFwLnNldEZlYXR1cmVTdGF0ZShcbiAgICAgICAgICAgIHsgc291cmNlOiBcInN0YXRlc1wiLCBpZDogaG92ZXJlZFN0YXRlSWQgfSxcbiAgICAgICAgICAgIHsgaG92ZXI6IGZhbHNlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGhvdmVyZWRTdGF0ZUlkID0gZS5mZWF0dXJlc1swXS5pZDtcbiAgICAgICAgbWFwLnNldEZlYXR1cmVTdGF0ZShcbiAgICAgICAgICB7IHNvdXJjZTogXCJzdGF0ZXNcIiwgaWQ6IGhvdmVyZWRTdGF0ZUlkIH0sXG4gICAgICAgICAgeyBob3ZlcjogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBXaGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIHN0YXRlLWZpbGwgbGF5ZXIsIHVwZGF0ZSB0aGUgZmVhdHVyZSBzdGF0ZSBvZiB0aGVcbiAgICAvLyBwcmV2aW91c2x5IGhvdmVyZWQgZmVhdHVyZS5cbiAgICBtYXAub24oXCJtb3VzZWxlYXZlXCIsIFwic3RhdGUtZmlsbHNcIiwgKCkgPT4ge1xuICAgICAgaWYgKGhvdmVyZWRTdGF0ZUlkKSB7XG4gICAgICAgIG1hcC5zZXRGZWF0dXJlU3RhdGUoXG4gICAgICAgICAgeyBzb3VyY2U6IFwic3RhdGVzXCIsIGlkOiBob3ZlcmVkU3RhdGVJZCB9LFxuICAgICAgICAgIHsgaG92ZXI6IGZhbHNlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGhvdmVyZWRTdGF0ZUlkID0gbnVsbDtcbiAgICB9KTtcbiAgfSk7XG59O1xuIiwiaW1wb3J0IHsgTGF5ZXJTcGVjaWZpY2F0aW9uIH0gZnJvbSBcIm1hcGxpYnJlLWdsXCI7XG5cbmV4cG9ydCBjb25zdCBsYXllclNwZWNpZmljYXRpb246IExheWVyU3BlY2lmaWNhdGlvbltdID0gW1xuICB7XG4gICAgaWQ6IFwiZm9yZXN0XCIsXG4gICAgc291cmNlOiBcInRpbGVzXCIsXG4gICAgXCJzb3VyY2UtbGF5ZXJcIjogXCJmb3Jlc3RcIixcbiAgICB0eXBlOiBcImZpbGxcIixcbiAgICBwYWludDoge1xuICAgICAgXCJmaWxsLWNvbG9yXCI6IFwiIzkwZWU5MFwiLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ3YXRlclwiLFxuICAgIHNvdXJjZTogXCJ0aWxlc1wiLFxuICAgIFwic291cmNlLWxheWVyXCI6IFwid2F0ZXJcIixcbiAgICBmaWx0ZXI6IFtcIj09XCIsIFtcImdlb21ldHJ5LXR5cGVcIl0sIFwiUG9seWdvblwiXSxcbiAgICB0eXBlOiBcImZpbGxcIixcbiAgICBwYWludDoge1xuICAgICAgXCJmaWxsLWNvbG9yXCI6IFwiI2FkZDhlNlwiLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBpZDogXCJidWlsZGluZ3NcIixcbiAgICBzb3VyY2U6IFwidGlsZXNcIixcbiAgICBcInNvdXJjZS1sYXllclwiOiBcImJ1aWxkaW5nc1wiLFxuICAgIHR5cGU6IFwiZmlsbFwiLFxuICAgIHBhaW50OiB7XG4gICAgICBcImZpbGwtY29sb3JcIjogXCIjZmZmZmM1XCIsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIGlkOiBcInJvYWRzXCIsXG4gICAgc291cmNlOiBcInRpbGVzXCIsXG4gICAgXCJzb3VyY2UtbGF5ZXJcIjogXCJyb2Fkc1wiLFxuICAgIHR5cGU6IFwibGluZVwiLFxuICAgIHBhaW50OiB7XG4gICAgICBcImxpbmUtY29sb3JcIjogXCIjZDNkM2QzXCIsXG4gICAgfSxcbiAgfSxcbl07XG4iLCIvKipcbiAqIE1hcExpYnJlIEdMIEpTXG4gKiBAbGljZW5zZSAzLUNsYXVzZSBCU0QuIEZ1bGwgdGV4dCBvZiBsaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vbWFwbGlicmUvbWFwbGlicmUtZ2wtanMvYmxvYi92NC43LjEvTElDRU5TRS50eHRcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbnR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbnR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4oZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwubWFwbGlicmVnbCA9IGZhY3RvcnkoKSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbnZhciBtYXBsaWJyZWdsID0ge307XG52YXIgbW9kdWxlcyA9IHt9O1xuZnVuY3Rpb24gZGVmaW5lKG1vZHVsZU5hbWUsIF9kZXBlbmRlbmNpZXMsIG1vZHVsZUZhY3RvcnkpIHtcbiAgICBtb2R1bGVzW21vZHVsZU5hbWVdID0gbW9kdWxlRmFjdG9yeTtcblxuICAgIC8vIHRvIGdldCB0aGUgbGlzdCBvZiBtb2R1bGVzIHNlZSBnZW5lcmF0ZWQgZGlzdC9tYXBsaWJyZS1nbC1kZXYuanMgZmlsZSAobG9vayBmb3IgYGRlZmluZShgIGNhbGxzKVxuICAgIGlmIChtb2R1bGVOYW1lICE9PSAnaW5kZXgnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB3ZSBhc3N1bWUgdGhhdCB3aGVuIGFuIGluZGV4IG1vZHVsZSBpcyBpbml0aWFsaXppbmcgdGhlbiBvdGhlciBtb2R1bGVzIGFyZSBsb2FkZWQgYWxyZWFkeVxuICAgIHZhciB3b3JrZXJCdW5kbGVTdHJpbmcgPSAndmFyIHNoYXJlZE1vZHVsZSA9IHt9OyAoJyArIG1vZHVsZXMuc2hhcmVkICsgJykoc2hhcmVkTW9kdWxlKTsgKCcgKyBtb2R1bGVzLndvcmtlciArICcpKHNoYXJlZE1vZHVsZSk7J1xuXG4gICAgdmFyIHNoYXJlZE1vZHVsZSA9IHt9O1xuICAgIC8vIHRoZSBvcmRlciBvZiBhcmd1bWVudHMgb2YgYSBtb2R1bGUgZmFjdG9yeSBkZXBlbmRzIG9uIHJvbGx1cCAoaXQgZGVjaWRlcyB3aG8gaXMgd2hvc2UgZGVwZW5kZW5jeSlcbiAgICAvLyB0byBjaGVjayB0aGUgY29ycmVjdCBvcmRlciwgc2VlIGRpc3QvbWFwbGlicmUtZ2wtZGV2LmpzIGZpbGUgKGxvb2sgZm9yIGBkZWZpbmUoYCBjYWxscylcbiAgICAvLyB3ZSBhc3N1bWUgdGhhdCBmb3Igb3VyIDMgY2h1bmtzIGl0IHdpbGwgZ2VuZXJhdGUgMyBtb2R1bGVzIGFuZCB0aGVpciBvcmRlciBpcyBwcmVkZWZpbmVkIGxpa2UgdGhlIGZvbGxvd2luZ1xuICAgIG1vZHVsZXMuc2hhcmVkKHNoYXJlZE1vZHVsZSk7XG4gICAgbW9kdWxlcy5pbmRleChtYXBsaWJyZWdsLCBzaGFyZWRNb2R1bGUpO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG1hcGxpYnJlZ2wuc2V0V29ya2VyVXJsKHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt3b3JrZXJCdW5kbGVTdHJpbmddLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcGxpYnJlZ2w7XG59O1xuXG5cblxuZGVmaW5lKFwic2hhcmVkXCIsW1wiZXhwb3J0c1wiXSwoZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZSh0LGUscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxzKXtmdW5jdGlvbiBhKHQpe3RyeXtsKG4ubmV4dCh0KSk7fWNhdGNoKHQpe3ModCk7fX1mdW5jdGlvbiBvKHQpe3RyeXtsKG4udGhyb3codCkpO31jYXRjaCh0KXtzKHQpO319ZnVuY3Rpb24gbCh0KXt2YXIgZTt0LmRvbmU/aSh0LnZhbHVlKTooZT10LnZhbHVlLGUgaW5zdGFuY2VvZiByP2U6bmV3IHIoKGZ1bmN0aW9uKHQpe3QoZSk7fSkpKS50aGVuKGEsbyk7fWwoKG49bi5hcHBseSh0LGV8fFtdKSkubmV4dCgpKTt9KSl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxcImRlZmF1bHRcIik/dC5kZWZhdWx0OnR9XCJmdW5jdGlvblwiPT10eXBlb2YgU3VwcHJlc3NlZEVycm9yJiZTdXBwcmVzc2VkRXJyb3I7dmFyIG49aTtmdW5jdGlvbiBpKHQsZSl7dGhpcy54PXQsdGhpcy55PWU7fWkucHJvdG90eXBlPXtjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgaSh0aGlzLngsdGhpcy55KX0sYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2FkZCh0KX0sc3ViOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1Yih0KX0sbXVsdEJ5UG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdEJ5UG9pbnQodCl9LGRpdkJ5UG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2QnlQb2ludCh0KX0sbXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KHQpfSxkaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KHQpfSxyb3RhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKHQpfSxyb3RhdGVBcm91bmQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGVBcm91bmQodCxlKX0sbWF0TXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KHQpfSx1bml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpfSxwZXJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpfSxyb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCl9LG1hZzpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sZXF1YWxzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng9PT10LngmJnRoaXMueT09PXQueX0sZGlzdDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcih0KSl9LGRpc3RTcXI6ZnVuY3Rpb24odCl7dmFyIGU9dC54LXRoaXMueCxyPXQueS10aGlzLnk7cmV0dXJuIGUqZStyKnJ9LGFuZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LHRoaXMueCl9LGFuZ2xlVG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LXQueSx0aGlzLngtdC54KX0sYW5nbGVXaXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFuZ2xlV2l0aFNlcCh0LngsdC55KX0sYW5nbGVXaXRoU2VwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy54KmUtdGhpcy55KnQsdGhpcy54KnQrdGhpcy55KmUpfSxfbWF0TXVsdDpmdW5jdGlvbih0KXt2YXIgZT10WzJdKnRoaXMueCt0WzNdKnRoaXMueTtyZXR1cm4gdGhpcy54PXRbMF0qdGhpcy54K3RbMV0qdGhpcy55LHRoaXMueT1lLHRoaXN9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LF9zdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LF9tdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LF9kaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sX211bHRCeVBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfSxfZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc30sX3VuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGl2KHRoaXMubWFnKCkpLHRoaXN9LF9wZXJwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0tdCx0aGlzfSxfcm90YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguY29zKHQpLHI9TWF0aC5zaW4odCksbj1yKnRoaXMueCtlKnRoaXMueTtyZXR1cm4gdGhpcy54PWUqdGhpcy54LXIqdGhpcy55LHRoaXMueT1uLHRoaXN9LF9yb3RhdGVBcm91bmQ6ZnVuY3Rpb24odCxlKXt2YXIgcj1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpLGk9ZS55K24qKHRoaXMueC1lLngpK3IqKHRoaXMueS1lLnkpO3JldHVybiB0aGlzLng9ZS54K3IqKHRoaXMueC1lLngpLW4qKHRoaXMueS1lLnkpLHRoaXMueT1pLHRoaXN9LF9yb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc319LGkuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGk/dDpBcnJheS5pc0FycmF5KHQpP25ldyBpKHRbMF0sdFsxXSk6dH07dmFyIHM9cihuKSxhPW87ZnVuY3Rpb24gbyh0LGUscixuKXt0aGlzLmN4PTMqdCx0aGlzLmJ4PTMqKHItdCktdGhpcy5jeCx0aGlzLmF4PTEtdGhpcy5jeC10aGlzLmJ4LHRoaXMuY3k9MyplLHRoaXMuYnk9Myoobi1lKS10aGlzLmN5LHRoaXMuYXk9MS10aGlzLmN5LXRoaXMuYnksdGhpcy5wMXg9dCx0aGlzLnAxeT1lLHRoaXMucDJ4PXIsdGhpcy5wMnk9bjt9by5wcm90b3R5cGU9e3NhbXBsZUN1cnZlWDpmdW5jdGlvbih0KXtyZXR1cm4gKCh0aGlzLmF4KnQrdGhpcy5ieCkqdCt0aGlzLmN4KSp0fSxzYW1wbGVDdXJ2ZVk6ZnVuY3Rpb24odCl7cmV0dXJuICgodGhpcy5heSp0K3RoaXMuYnkpKnQrdGhpcy5jeSkqdH0sc2FtcGxlQ3VydmVEZXJpdmF0aXZlWDpmdW5jdGlvbih0KXtyZXR1cm4gKDMqdGhpcy5heCp0KzIqdGhpcy5ieCkqdCt0aGlzLmN4fSxzb2x2ZUN1cnZlWDpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PWUmJihlPTFlLTYpLHQ8MClyZXR1cm4gMDtpZih0PjEpcmV0dXJuIDE7Zm9yKHZhciByPXQsbj0wO248ODtuKyspe3ZhciBpPXRoaXMuc2FtcGxlQ3VydmVYKHIpLXQ7aWYoTWF0aC5hYnMoaSk8ZSlyZXR1cm4gcjt2YXIgcz10aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgocik7aWYoTWF0aC5hYnMocyk8MWUtNilicmVhaztyLT1pL3M7fXZhciBhPTAsbz0xO2ZvcihyPXQsbj0wO248MjAmJihpPXRoaXMuc2FtcGxlQ3VydmVYKHIpLCEoTWF0aC5hYnMoaS10KTxlKSk7bisrKXQ+aT9hPXI6bz1yLHI9LjUqKG8tYSkrYTtyZXR1cm4gcn0sc29sdmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh0LGUpKX19O3ZhciBsPXIoYSk7bGV0IHUsYztmdW5jdGlvbiBoKCl7cmV0dXJuIG51bGw9PXUmJih1PVwidW5kZWZpbmVkXCIhPXR5cGVvZiBPZmZzY3JlZW5DYW52YXMmJm5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKS5nZXRDb250ZXh0KFwiMmRcIikmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwKSx1fWZ1bmN0aW9uIHAoKXtpZihudWxsPT1jJiYoYz0hMSxoKCkpKXtjb25zdCB0PTUsZT1uZXcgT2Zmc2NyZWVuQ2FudmFzKHQsdCkuZ2V0Q29udGV4dChcIjJkXCIse3dpbGxSZWFkRnJlcXVlbnRseTohMH0pO2lmKGUpe2ZvcihsZXQgcj0wO3I8dCp0O3IrKyl7Y29uc3Qgbj00KnI7ZS5maWxsU3R5bGU9YHJnYigke259LCR7bisxfSwke24rMn0pYCxlLmZpbGxSZWN0KHIldCxNYXRoLmZsb29yKHIvdCksMSwxKTt9Y29uc3Qgcj1lLmdldEltYWdlRGF0YSgwLDAsdCx0KS5kYXRhO2ZvcihsZXQgZT0wO2U8dCp0KjQ7ZSsrKWlmKGUlNCE9MyYmcltlXSE9PWUpe2M9ITA7YnJlYWt9fX1yZXR1cm4gY3x8ITF9ZnVuY3Rpb24gZih0LGUscixuKXtjb25zdCBpPW5ldyBsKHQsZSxyLG4pO3JldHVybiB0PT5pLnNvbHZlKHQpfWNvbnN0IGQ9ZiguMjUsLjEsLjI1LDEpO2Z1bmN0aW9uIHkodCxlLHIpe3JldHVybiBNYXRoLm1pbihyLE1hdGgubWF4KGUsdCkpfWZ1bmN0aW9uIG0odCxlLHIpe2NvbnN0IG49ci1lLGk9KCh0LWUpJW4rbiklbitlO3JldHVybiBpPT09ZT9yOml9ZnVuY3Rpb24gZyh0LC4uLmUpe2Zvcihjb25zdCByIG9mIGUpZm9yKGNvbnN0IGUgaW4gcil0W2VdPXJbZV07cmV0dXJuIHR9bGV0IHg9MTtmdW5jdGlvbiB2KHQsZSxyKXtjb25zdCBuPXt9O2Zvcihjb25zdCByIGluIHQpbltyXT1lLmNhbGwodGhpcyx0W3JdLHIsdCk7cmV0dXJuIG59ZnVuY3Rpb24gYih0LGUscil7Y29uc3Qgbj17fTtmb3IoY29uc3QgciBpbiB0KWUuY2FsbCh0aGlzLHRbcl0scix0KSYmKG5bcl09dFtyXSk7cmV0dXJuIG59ZnVuY3Rpb24gdyh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90Lm1hcCh3KTpcIm9iamVjdFwiPT10eXBlb2YgdCYmdD92KHQsdyk6dH1jb25zdCBfPXt9O2Z1bmN0aW9uIEEodCl7X1t0XXx8KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4odCksX1t0XT0hMCk7fWZ1bmN0aW9uIFModCxlLHIpe3JldHVybiAoci55LXQueSkqKGUueC10LngpPihlLnktdC55KSooci54LXQueCl9ZnVuY3Rpb24gayh0KXtyZXR1cm4gXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZ2b2lkIDAhPT10JiZ0IGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGV9bGV0IE09bnVsbDtmdW5jdGlvbiBJKHQpe3JldHVybiBcInVuZGVmaW5lZFwiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcH1jb25zdCB6PVwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FZQUFBQWZGY1NKQUFBQUMwbEVRVlFZVjJOZ0FBSUFBQVVBQWFyVnlGRUFBQUFBU1VWT1JLNUNZSUk9XCI7ZnVuY3Rpb24gUCh0LHIsbixpLHMpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFZpZGVvRnJhbWUpdGhyb3cgbmV3IEVycm9yKFwiVmlkZW9GcmFtZSBub3Qgc3VwcG9ydGVkXCIpO2NvbnN0IGU9bmV3IFZpZGVvRnJhbWUodCx7dGltZXN0YW1wOjB9KTt0cnl7Y29uc3QgYT1udWxsPT1lP3ZvaWQgMDplLmZvcm1hdDtpZighYXx8IWEuc3RhcnRzV2l0aChcIkJHUlwiKSYmIWEuc3RhcnRzV2l0aChcIlJHQlwiKSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBmb3JtYXQgJHthfWApO2NvbnN0IG89YS5zdGFydHNXaXRoKFwiQkdSXCIpLGw9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGkqcyo0KTtpZih5aWVsZCBlLmNvcHlUbyhsLGZ1bmN0aW9uKHQsZSxyLG4saSl7Y29uc3Qgcz00Kk1hdGgubWF4KC1lLDApLGE9KE1hdGgubWF4KDAsciktcikqbio0K3Msbz00Km4sbD1NYXRoLm1heCgwLGUpLHU9TWF0aC5tYXgoMCxyKTtyZXR1cm4ge3JlY3Q6e3g6bCx5OnUsd2lkdGg6TWF0aC5taW4odC53aWR0aCxlK24pLWwsaGVpZ2h0Ok1hdGgubWluKHQuaGVpZ2h0LHIraSktdX0sbGF5b3V0Olt7b2Zmc2V0OmEsc3RyaWRlOm99XX19KHQscixuLGkscykpLG8pZm9yKGxldCB0PTA7dDxsLmxlbmd0aDt0Kz00KXtjb25zdCBlPWxbdF07bFt0XT1sW3QrMl0sbFt0KzJdPWU7fXJldHVybiBsfWZpbmFsbHl7ZS5jbG9zZSgpO319KSl9bGV0IEMsQjtjb25zdCBWPVwiQWJvcnRFcnJvclwiO2Z1bmN0aW9uIEUoKXtyZXR1cm4gbmV3IEVycm9yKFYpfWNvbnN0IEY9e01BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUzoxNixNQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFNfUEVSX0ZSQU1FOjgsTUFYX1RJTEVfQ0FDSEVfWk9PTV9MRVZFTFM6NSxSRUdJU1RFUkVEX1BST1RPQ09MUzp7fSxXT1JLRVJfVVJMOlwiXCJ9O2Z1bmN0aW9uIFQodCl7cmV0dXJuIEYuUkVHSVNURVJFRF9QUk9UT0NPTFNbdC5zdWJzdHJpbmcoMCx0LmluZGV4T2YoXCI6Ly9cIikpXX1jb25zdCAkPVwiZ2xvYmFsLWRpc3BhdGNoZXJcIjtjbGFzcyBMIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxlLHIsbil7c3VwZXIoYEFKQVhFcnJvcjogJHtlfSAoJHt0fSk6ICR7cn1gKSx0aGlzLnN0YXR1cz10LHRoaXMuc3RhdHVzVGV4dD1lLHRoaXMudXJsPXIsdGhpcy5ib2R5PW47fX1jb25zdCBEPSgpPT5rKHNlbGYpP3NlbGYud29ya2VyJiZzZWxmLndvcmtlci5yZWZlcnJlcjooXCJibG9iOlwiPT09d2luZG93LmxvY2F0aW9uLnByb3RvY29sP3dpbmRvdy5wYXJlbnQ6d2luZG93KS5sb2NhdGlvbi5ocmVmLE89ZnVuY3Rpb24odCxyKXtpZigvOlxcL1xcLy8udGVzdCh0LnVybCkmJiEvXmh0dHBzPzp8XmZpbGU6Ly50ZXN0KHQudXJsKSl7Y29uc3QgZT1UKHQudXJsKTtpZihlKXJldHVybiBlKHQscik7aWYoayhzZWxmKSYmc2VsZi53b3JrZXImJnNlbGYud29ya2VyLmFjdG9yKXJldHVybiBzZWxmLndvcmtlci5hY3Rvci5zZW5kQXN5bmMoe3R5cGU6XCJHUlwiLGRhdGE6dCx0YXJnZXRNYXBJZDokfSxyKX1pZighKC9eZmlsZTovLnRlc3Qobj10LnVybCl8fC9eZmlsZTovLnRlc3QoRCgpKSYmIS9eXFx3KzovLnRlc3QobikpKXtpZihmZXRjaCYmUmVxdWVzdCYmQWJvcnRDb250cm9sbGVyJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUsXCJzaWduYWxcIikpcmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPW5ldyBSZXF1ZXN0KHQudXJsLHttZXRob2Q6dC5tZXRob2R8fFwiR0VUXCIsYm9keTp0LmJvZHksY3JlZGVudGlhbHM6dC5jcmVkZW50aWFscyxoZWFkZXJzOnQuaGVhZGVycyxjYWNoZTp0LmNhY2hlLHJlZmVycmVyOkQoKSxzaWduYWw6ci5zaWduYWx9KTtcImpzb25cIiE9PXQudHlwZXx8ZS5oZWFkZXJzLmhhcyhcIkFjY2VwdFwiKXx8ZS5oZWFkZXJzLnNldChcIkFjY2VwdFwiLFwiYXBwbGljYXRpb24vanNvblwiKTtjb25zdCBuPXlpZWxkIGZldGNoKGUpO2lmKCFuLm9rKXtjb25zdCBlPXlpZWxkIG4uYmxvYigpO3Rocm93IG5ldyBMKG4uc3RhdHVzLG4uc3RhdHVzVGV4dCx0LnVybCxlKX1sZXQgaTtpPVwiYXJyYXlCdWZmZXJcIj09PXQudHlwZXx8XCJpbWFnZVwiPT09dC50eXBlP24uYXJyYXlCdWZmZXIoKTpcImpzb25cIj09PXQudHlwZT9uLmpzb24oKTpuLnRleHQoKTtjb25zdCBzPXlpZWxkIGk7aWYoci5zaWduYWwuYWJvcnRlZCl0aHJvdyBFKCk7cmV0dXJuIHtkYXRhOnMsY2FjaGVDb250cm9sOm4uaGVhZGVycy5nZXQoXCJDYWNoZS1Db250cm9sXCIpLGV4cGlyZXM6bi5oZWFkZXJzLmdldChcIkV4cGlyZXNcIil9fSkpfSh0LHIpO2lmKGsoc2VsZikmJnNlbGYud29ya2VyJiZzZWxmLndvcmtlci5hY3RvcilyZXR1cm4gc2VsZi53b3JrZXIuYWN0b3Iuc2VuZEFzeW5jKHt0eXBlOlwiR1JcIixkYXRhOnQsbXVzdFF1ZXVlOiEwLHRhcmdldE1hcElkOiR9LHIpfXZhciBuO3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgUHJvbWlzZSgoKHIsbik9Pnt2YXIgaTtjb25zdCBzPW5ldyBYTUxIdHRwUmVxdWVzdDtzLm9wZW4odC5tZXRob2R8fFwiR0VUXCIsdC51cmwsITApLFwiYXJyYXlCdWZmZXJcIiE9PXQudHlwZSYmXCJpbWFnZVwiIT09dC50eXBlfHwocy5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiKTtmb3IoY29uc3QgZSBpbiB0LmhlYWRlcnMpcy5zZXRSZXF1ZXN0SGVhZGVyKGUsdC5oZWFkZXJzW2VdKTtcImpzb25cIj09PXQudHlwZSYmKHMucmVzcG9uc2VUeXBlPVwidGV4dFwiLChudWxsPT09KGk9dC5oZWFkZXJzKXx8dm9pZCAwPT09aT92b2lkIDA6aS5BY2NlcHQpfHxzLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIixcImFwcGxpY2F0aW9uL2pzb25cIikpLHMud2l0aENyZWRlbnRpYWxzPVwiaW5jbHVkZVwiPT09dC5jcmVkZW50aWFscyxzLm9uZXJyb3I9KCk9PntuKG5ldyBFcnJvcihzLnN0YXR1c1RleHQpKTt9LHMub25sb2FkPSgpPT57aWYoIWUuc2lnbmFsLmFib3J0ZWQpaWYoKHMuc3RhdHVzPj0yMDAmJnMuc3RhdHVzPDMwMHx8MD09PXMuc3RhdHVzKSYmbnVsbCE9PXMucmVzcG9uc2Upe2xldCBlPXMucmVzcG9uc2U7aWYoXCJqc29uXCI9PT10LnR5cGUpdHJ5e2U9SlNPTi5wYXJzZShzLnJlc3BvbnNlKTt9Y2F0Y2godCl7cmV0dXJuIHZvaWQgbih0KX1yKHtkYXRhOmUsY2FjaGVDb250cm9sOnMuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIpLGV4cGlyZXM6cy5nZXRSZXNwb25zZUhlYWRlcihcIkV4cGlyZXNcIil9KTt9ZWxzZSB7Y29uc3QgZT1uZXcgQmxvYihbcy5yZXNwb25zZV0se3R5cGU6cy5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKX0pO24obmV3IEwocy5zdGF0dXMscy5zdGF0dXNUZXh0LHQudXJsLGUpKTt9fSxlLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwoKCk9PntzLmFib3J0KCksbihFKCkpO30pKSxzLnNlbmQodC5ib2R5KTt9KSl9KHQscil9O2Z1bmN0aW9uIGoodCl7aWYoIXR8fHQuaW5kZXhPZihcIjovL1wiKTw9MHx8MD09PXQuaW5kZXhPZihcImRhdGE6aW1hZ2UvXCIpfHwwPT09dC5pbmRleE9mKFwiYmxvYjpcIikpcmV0dXJuICEwO2NvbnN0IGU9bmV3IFVSTCh0KSxyPXdpbmRvdy5sb2NhdGlvbjtyZXR1cm4gZS5wcm90b2NvbD09PXIucHJvdG9jb2wmJmUuaG9zdD09PXIuaG9zdH1mdW5jdGlvbiBSKHQsZSxyKXtyW3RdJiYtMSE9PXJbdF0uaW5kZXhPZihlKXx8KHJbdF09clt0XXx8W10sclt0XS5wdXNoKGUpKTt9ZnVuY3Rpb24gVSh0LGUscil7aWYociYmclt0XSl7Y29uc3Qgbj1yW3RdLmluZGV4T2YoZSk7LTEhPT1uJiZyW3RdLnNwbGljZShuLDEpO319Y2xhc3MgcXtjb25zdHJ1Y3Rvcih0LGU9e30pe2codGhpcyxlKSx0aGlzLnR5cGU9dDt9fWNsYXNzIE4gZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHQsZT17fSl7c3VwZXIoXCJlcnJvclwiLGcoe2Vycm9yOnR9LGUpKTt9fWNsYXNzIFp7b24odCxlKXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVyc3x8e30sUih0LGUsdGhpcy5fbGlzdGVuZXJzKSx0aGlzfW9mZih0LGUpe3JldHVybiBVKHQsZSx0aGlzLl9saXN0ZW5lcnMpLFUodCxlLHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpLHRoaXN9b25jZSh0LGUpe3JldHVybiBlPyh0aGlzLl9vbmVUaW1lTGlzdGVuZXJzPXRoaXMuX29uZVRpbWVMaXN0ZW5lcnN8fHt9LFIodCxlLHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpLHRoaXMpOm5ldyBQcm9taXNlKChlPT50aGlzLm9uY2UodCxlKSkpfWZpcmUodCxlKXtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9bmV3IHEodCxlfHx7fSkpO2NvbnN0IHI9dC50eXBlO2lmKHRoaXMubGlzdGVucyhyKSl7dC50YXJnZXQ9dGhpcztjb25zdCBlPXRoaXMuX2xpc3RlbmVycyYmdGhpcy5fbGlzdGVuZXJzW3JdP3RoaXMuX2xpc3RlbmVyc1tyXS5zbGljZSgpOltdO2Zvcihjb25zdCByIG9mIGUpci5jYWxsKHRoaXMsdCk7Y29uc3Qgbj10aGlzLl9vbmVUaW1lTGlzdGVuZXJzJiZ0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3JdP3RoaXMuX29uZVRpbWVMaXN0ZW5lcnNbcl0uc2xpY2UoKTpbXTtmb3IoY29uc3QgZSBvZiBuKVUocixlLHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpLGUuY2FsbCh0aGlzLHQpO2NvbnN0IGk9dGhpcy5fZXZlbnRlZFBhcmVudDtpJiYoZyh0LFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhP3RoaXMuX2V2ZW50ZWRQYXJlbnREYXRhKCk6dGhpcy5fZXZlbnRlZFBhcmVudERhdGEpLGkuZmlyZSh0KSk7fWVsc2UgdCBpbnN0YW5jZW9mIE4mJmNvbnNvbGUuZXJyb3IodC5lcnJvcik7cmV0dXJuIHRoaXN9bGlzdGVucyh0KXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzJiZ0aGlzLl9saXN0ZW5lcnNbdF0mJnRoaXMuX2xpc3RlbmVyc1t0XS5sZW5ndGg+MHx8dGhpcy5fb25lVGltZUxpc3RlbmVycyYmdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0XSYmdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0XS5sZW5ndGg+MHx8dGhpcy5fZXZlbnRlZFBhcmVudCYmdGhpcy5fZXZlbnRlZFBhcmVudC5saXN0ZW5zKHQpfXNldEV2ZW50ZWRQYXJlbnQodCxlKXtyZXR1cm4gdGhpcy5fZXZlbnRlZFBhcmVudD10LHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhPWUsdGhpc319dmFyIEc9eyR2ZXJzaW9uOjgsJHJvb3Q6e3ZlcnNpb246e3JlcXVpcmVkOiEwLHR5cGU6XCJlbnVtXCIsdmFsdWVzOls4XX0sbmFtZTp7dHlwZTpcInN0cmluZ1wifSxtZXRhZGF0YTp7dHlwZTpcIipcIn0sY2VudGVyOnt0eXBlOlwiYXJyYXlcIix2YWx1ZTpcIm51bWJlclwifSx6b29tOnt0eXBlOlwibnVtYmVyXCJ9LGJlYXJpbmc6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAscGVyaW9kOjM2MCx1bml0czpcImRlZ3JlZXNcIn0scGl0Y2g6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAsdW5pdHM6XCJkZWdyZWVzXCJ9LGxpZ2h0Ont0eXBlOlwibGlnaHRcIn0sc2t5Ont0eXBlOlwic2t5XCJ9LHByb2plY3Rpb246e3R5cGU6XCJwcm9qZWN0aW9uXCJ9LHRlcnJhaW46e3R5cGU6XCJ0ZXJyYWluXCJ9LHNvdXJjZXM6e3JlcXVpcmVkOiEwLHR5cGU6XCJzb3VyY2VzXCJ9LHNwcml0ZTp7dHlwZTpcInNwcml0ZVwifSxnbHlwaHM6e3R5cGU6XCJzdHJpbmdcIn0sdHJhbnNpdGlvbjp7dHlwZTpcInRyYW5zaXRpb25cIn0sbGF5ZXJzOntyZXF1aXJlZDohMCx0eXBlOlwiYXJyYXlcIix2YWx1ZTpcImxheWVyXCJ9fSxzb3VyY2VzOntcIipcIjp7dHlwZTpcInNvdXJjZVwifX0sc291cmNlOltcInNvdXJjZV92ZWN0b3JcIixcInNvdXJjZV9yYXN0ZXJcIixcInNvdXJjZV9yYXN0ZXJfZGVtXCIsXCJzb3VyY2VfZ2VvanNvblwiLFwic291cmNlX3ZpZGVvXCIsXCJzb3VyY2VfaW1hZ2VcIl0sc291cmNlX3ZlY3Rvcjp7dHlwZTp7cmVxdWlyZWQ6ITAsdHlwZTpcImVudW1cIix2YWx1ZXM6e3ZlY3Rvcjp7fX19LHVybDp7dHlwZTpcInN0cmluZ1wifSx0aWxlczp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJzdHJpbmdcIn0sYm91bmRzOnt0eXBlOlwiYXJyYXlcIix2YWx1ZTpcIm51bWJlclwiLGxlbmd0aDo0LGRlZmF1bHQ6Wy0xODAsLTg1LjA1MTEyOSwxODAsODUuMDUxMTI5XX0sc2NoZW1lOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7eHl6Ont9LHRtczp7fX0sZGVmYXVsdDpcInh5elwifSxtaW56b29tOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowfSxtYXh6b29tOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoyMn0sYXR0cmlidXRpb246e3R5cGU6XCJzdHJpbmdcIn0scHJvbW90ZUlkOnt0eXBlOlwicHJvbW90ZUlkXCJ9LHZvbGF0aWxlOnt0eXBlOlwiYm9vbGVhblwiLGRlZmF1bHQ6ITF9LFwiKlwiOnt0eXBlOlwiKlwifX0sc291cmNlX3Jhc3Rlcjp7dHlwZTp7cmVxdWlyZWQ6ITAsdHlwZTpcImVudW1cIix2YWx1ZXM6e3Jhc3Rlcjp7fX19LHVybDp7dHlwZTpcInN0cmluZ1wifSx0aWxlczp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJzdHJpbmdcIn0sYm91bmRzOnt0eXBlOlwiYXJyYXlcIix2YWx1ZTpcIm51bWJlclwiLGxlbmd0aDo0LGRlZmF1bHQ6Wy0xODAsLTg1LjA1MTEyOSwxODAsODUuMDUxMTI5XX0sbWluem9vbTp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MH0sbWF4em9vbTp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MjJ9LHRpbGVTaXplOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDo1MTIsdW5pdHM6XCJwaXhlbHNcIn0sc2NoZW1lOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7eHl6Ont9LHRtczp7fX0sZGVmYXVsdDpcInh5elwifSxhdHRyaWJ1dGlvbjp7dHlwZTpcInN0cmluZ1wifSx2b2xhdGlsZTp7dHlwZTpcImJvb2xlYW5cIixkZWZhdWx0OiExfSxcIipcIjp7dHlwZTpcIipcIn19LHNvdXJjZV9yYXN0ZXJfZGVtOnt0eXBlOntyZXF1aXJlZDohMCx0eXBlOlwiZW51bVwiLHZhbHVlczp7XCJyYXN0ZXItZGVtXCI6e319fSx1cmw6e3R5cGU6XCJzdHJpbmdcIn0sdGlsZXM6e3R5cGU6XCJhcnJheVwiLHZhbHVlOlwic3RyaW5nXCJ9LGJvdW5kczp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJudW1iZXJcIixsZW5ndGg6NCxkZWZhdWx0OlstMTgwLC04NS4wNTExMjksMTgwLDg1LjA1MTEyOV19LG1pbnpvb206e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjB9LG1heHpvb206e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjIyfSx0aWxlU2l6ZTp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6NTEyLHVuaXRzOlwicGl4ZWxzXCJ9LGF0dHJpYnV0aW9uOnt0eXBlOlwic3RyaW5nXCJ9LGVuY29kaW5nOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7dGVycmFyaXVtOnt9LG1hcGJveDp7fSxjdXN0b206e319LGRlZmF1bHQ6XCJtYXBib3hcIn0scmVkRmFjdG9yOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoxfSxibHVlRmFjdG9yOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoxfSxncmVlbkZhY3Rvcjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MX0sYmFzZVNoaWZ0Ont0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowfSx2b2xhdGlsZTp7dHlwZTpcImJvb2xlYW5cIixkZWZhdWx0OiExfSxcIipcIjp7dHlwZTpcIipcIn19LHNvdXJjZV9nZW9qc29uOnt0eXBlOntyZXF1aXJlZDohMCx0eXBlOlwiZW51bVwiLHZhbHVlczp7Z2VvanNvbjp7fX19LGRhdGE6e3JlcXVpcmVkOiEwLHR5cGU6XCIqXCJ9LG1heHpvb206e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjE4fSxhdHRyaWJ1dGlvbjp7dHlwZTpcInN0cmluZ1wifSxidWZmZXI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjEyOCxtYXhpbXVtOjUxMixtaW5pbXVtOjB9LGZpbHRlcjp7dHlwZTpcIipcIn0sdG9sZXJhbmNlOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDouMzc1fSxjbHVzdGVyOnt0eXBlOlwiYm9vbGVhblwiLGRlZmF1bHQ6ITF9LGNsdXN0ZXJSYWRpdXM6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjUwLG1pbmltdW06MH0sY2x1c3Rlck1heFpvb206e3R5cGU6XCJudW1iZXJcIn0sY2x1c3Rlck1pblBvaW50czp7dHlwZTpcIm51bWJlclwifSxjbHVzdGVyUHJvcGVydGllczp7dHlwZTpcIipcIn0sbGluZU1ldHJpY3M6e3R5cGU6XCJib29sZWFuXCIsZGVmYXVsdDohMX0sZ2VuZXJhdGVJZDp7dHlwZTpcImJvb2xlYW5cIixkZWZhdWx0OiExfSxwcm9tb3RlSWQ6e3R5cGU6XCJwcm9tb3RlSWRcIn19LHNvdXJjZV92aWRlbzp7dHlwZTp7cmVxdWlyZWQ6ITAsdHlwZTpcImVudW1cIix2YWx1ZXM6e3ZpZGVvOnt9fX0sdXJsczp7cmVxdWlyZWQ6ITAsdHlwZTpcImFycmF5XCIsdmFsdWU6XCJzdHJpbmdcIn0sY29vcmRpbmF0ZXM6e3JlcXVpcmVkOiEwLHR5cGU6XCJhcnJheVwiLGxlbmd0aDo0LHZhbHVlOnt0eXBlOlwiYXJyYXlcIixsZW5ndGg6Mix2YWx1ZTpcIm51bWJlclwifX19LHNvdXJjZV9pbWFnZTp7dHlwZTp7cmVxdWlyZWQ6ITAsdHlwZTpcImVudW1cIix2YWx1ZXM6e2ltYWdlOnt9fX0sdXJsOntyZXF1aXJlZDohMCx0eXBlOlwic3RyaW5nXCJ9LGNvb3JkaW5hdGVzOntyZXF1aXJlZDohMCx0eXBlOlwiYXJyYXlcIixsZW5ndGg6NCx2YWx1ZTp7dHlwZTpcImFycmF5XCIsbGVuZ3RoOjIsdmFsdWU6XCJudW1iZXJcIn19fSxsYXllcjp7aWQ6e3R5cGU6XCJzdHJpbmdcIixyZXF1aXJlZDohMH0sdHlwZTp7dHlwZTpcImVudW1cIix2YWx1ZXM6e2ZpbGw6e30sbGluZTp7fSxzeW1ib2w6e30sY2lyY2xlOnt9LGhlYXRtYXA6e30sXCJmaWxsLWV4dHJ1c2lvblwiOnt9LHJhc3Rlcjp7fSxoaWxsc2hhZGU6e30sYmFja2dyb3VuZDp7fX0scmVxdWlyZWQ6ITB9LG1ldGFkYXRhOnt0eXBlOlwiKlwifSxzb3VyY2U6e3R5cGU6XCJzdHJpbmdcIn0sXCJzb3VyY2UtbGF5ZXJcIjp7dHlwZTpcInN0cmluZ1wifSxtaW56b29tOnt0eXBlOlwibnVtYmVyXCIsbWluaW11bTowLG1heGltdW06MjR9LG1heHpvb206e3R5cGU6XCJudW1iZXJcIixtaW5pbXVtOjAsbWF4aW11bToyNH0sZmlsdGVyOnt0eXBlOlwiZmlsdGVyXCJ9LGxheW91dDp7dHlwZTpcImxheW91dFwifSxwYWludDp7dHlwZTpcInBhaW50XCJ9fSxsYXlvdXQ6W1wibGF5b3V0X2ZpbGxcIixcImxheW91dF9saW5lXCIsXCJsYXlvdXRfY2lyY2xlXCIsXCJsYXlvdXRfaGVhdG1hcFwiLFwibGF5b3V0X2ZpbGwtZXh0cnVzaW9uXCIsXCJsYXlvdXRfc3ltYm9sXCIsXCJsYXlvdXRfcmFzdGVyXCIsXCJsYXlvdXRfaGlsbHNoYWRlXCIsXCJsYXlvdXRfYmFja2dyb3VuZFwiXSxsYXlvdXRfYmFja2dyb3VuZDp7dmlzaWJpbGl0eTp7dHlwZTpcImVudW1cIix2YWx1ZXM6e3Zpc2libGU6e30sbm9uZTp7fX0sZGVmYXVsdDpcInZpc2libGVcIixcInByb3BlcnR5LXR5cGVcIjpcImNvbnN0YW50XCJ9fSxsYXlvdXRfZmlsbDp7XCJmaWxsLXNvcnQta2V5XCI6e3R5cGU6XCJudW1iZXJcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LHZpc2liaWxpdHk6e3R5cGU6XCJlbnVtXCIsdmFsdWVzOnt2aXNpYmxlOnt9LG5vbmU6e319LGRlZmF1bHQ6XCJ2aXNpYmxlXCIsXCJwcm9wZXJ0eS10eXBlXCI6XCJjb25zdGFudFwifX0sbGF5b3V0X2NpcmNsZTp7XCJjaXJjbGUtc29ydC1rZXlcIjp7dHlwZTpcIm51bWJlclwiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sdmlzaWJpbGl0eTp7dHlwZTpcImVudW1cIix2YWx1ZXM6e3Zpc2libGU6e30sbm9uZTp7fX0sZGVmYXVsdDpcInZpc2libGVcIixcInByb3BlcnR5LXR5cGVcIjpcImNvbnN0YW50XCJ9fSxsYXlvdXRfaGVhdG1hcDp7dmlzaWJpbGl0eTp7dHlwZTpcImVudW1cIix2YWx1ZXM6e3Zpc2libGU6e30sbm9uZTp7fX0sZGVmYXVsdDpcInZpc2libGVcIixcInByb3BlcnR5LXR5cGVcIjpcImNvbnN0YW50XCJ9fSxcImxheW91dF9maWxsLWV4dHJ1c2lvblwiOnt2aXNpYmlsaXR5Ont0eXBlOlwiZW51bVwiLHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSxkZWZhdWx0OlwidmlzaWJsZVwiLFwicHJvcGVydHktdHlwZVwiOlwiY29uc3RhbnRcIn19LGxheW91dF9saW5lOntcImxpbmUtY2FwXCI6e3R5cGU6XCJlbnVtXCIsdmFsdWVzOntidXR0Ont9LHJvdW5kOnt9LHNxdWFyZTp7fX0sZGVmYXVsdDpcImJ1dHRcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJsaW5lLWpvaW5cIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e2JldmVsOnt9LHJvdW5kOnt9LG1pdGVyOnt9fSxkZWZhdWx0OlwibWl0ZXJcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwibGluZS1taXRlci1saW1pdFwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoyLHJlcXVpcmVzOlt7XCJsaW5lLWpvaW5cIjpcIm1pdGVyXCJ9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJsaW5lLXJvdW5kLWxpbWl0XCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjEuMDUscmVxdWlyZXM6W3tcImxpbmUtam9pblwiOlwicm91bmRcIn1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImxpbmUtc29ydC1rZXlcIjp7dHlwZTpcIm51bWJlclwiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sdmlzaWJpbGl0eTp7dHlwZTpcImVudW1cIix2YWx1ZXM6e3Zpc2libGU6e30sbm9uZTp7fX0sZGVmYXVsdDpcInZpc2libGVcIixcInByb3BlcnR5LXR5cGVcIjpcImNvbnN0YW50XCJ9fSxsYXlvdXRfc3ltYm9sOntcInN5bWJvbC1wbGFjZW1lbnRcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e3BvaW50Ont9LGxpbmU6e30sXCJsaW5lLWNlbnRlclwiOnt9fSxkZWZhdWx0OlwicG9pbnRcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJzeW1ib2wtc3BhY2luZ1wiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoyNTAsbWluaW11bToxLHVuaXRzOlwicGl4ZWxzXCIscmVxdWlyZXM6W3tcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInN5bWJvbC1hdm9pZC1lZGdlc1wiOnt0eXBlOlwiYm9vbGVhblwiLGRlZmF1bHQ6ITEsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwic3ltYm9sLXNvcnQta2V5XCI6e3R5cGU6XCJudW1iZXJcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwic3ltYm9sLXotb3JkZXJcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e2F1dG86e30sXCJ2aWV3cG9ydC15XCI6e30sc291cmNlOnt9fSxkZWZhdWx0OlwiYXV0b1wiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImljb24tYWxsb3ctb3ZlcmxhcFwiOnt0eXBlOlwiYm9vbGVhblwiLGRlZmF1bHQ6ITEscmVxdWlyZXM6W1wiaWNvbi1pbWFnZVwiLHtcIiFcIjpcImljb24tb3ZlcmxhcFwifV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaWNvbi1vdmVybGFwXCI6e3R5cGU6XCJlbnVtXCIsdmFsdWVzOntuZXZlcjp7fSxhbHdheXM6e30sY29vcGVyYXRpdmU6e319LHJlcXVpcmVzOltcImljb24taW1hZ2VcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6e3R5cGU6XCJib29sZWFuXCIsZGVmYXVsdDohMSxyZXF1aXJlczpbXCJpY29uLWltYWdlXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImljb24tb3B0aW9uYWxcIjp7dHlwZTpcImJvb2xlYW5cIixkZWZhdWx0OiExLHJlcXVpcmVzOltcImljb24taW1hZ2VcIixcInRleHQtZmllbGRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fSxhdXRvOnt9fSxkZWZhdWx0OlwiYXV0b1wiLHJlcXVpcmVzOltcImljb24taW1hZ2VcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaWNvbi1zaXplXCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjEsbWluaW11bTowLHVuaXRzOlwiZmFjdG9yIG9mIHRoZSBvcmlnaW5hbCBpY29uIHNpemVcIixyZXF1aXJlczpbXCJpY29uLWltYWdlXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJpY29uLXRleHQtZml0XCI6e3R5cGU6XCJlbnVtXCIsdmFsdWVzOntub25lOnt9LHdpZHRoOnt9LGhlaWdodDp7fSxib3RoOnt9fSxkZWZhdWx0Olwibm9uZVwiLHJlcXVpcmVzOltcImljb24taW1hZ2VcIixcInRleHQtZmllbGRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCI6e3R5cGU6XCJhcnJheVwiLHZhbHVlOlwibnVtYmVyXCIsbGVuZ3RoOjQsZGVmYXVsdDpbMCwwLDAsMF0sdW5pdHM6XCJwaXhlbHNcIixyZXF1aXJlczpbXCJpY29uLWltYWdlXCIsXCJ0ZXh0LWZpZWxkXCIse1wiaWNvbi10ZXh0LWZpdFwiOltcImJvdGhcIixcIndpZHRoXCIsXCJoZWlnaHRcIl19XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJpY29uLWltYWdlXCI6e3R5cGU6XCJyZXNvbHZlZEltYWdlXCIsdG9rZW5zOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJpY29uLXJvdGF0ZVwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowLHBlcmlvZDozNjAsdW5pdHM6XCJkZWdyZWVzXCIscmVxdWlyZXM6W1wiaWNvbi1pbWFnZVwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwiaWNvbi1wYWRkaW5nXCI6e3R5cGU6XCJwYWRkaW5nXCIsZGVmYXVsdDpbMl0sdW5pdHM6XCJwaXhlbHNcIixyZXF1aXJlczpbXCJpY29uLWltYWdlXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJpY29uLWtlZXAtdXByaWdodFwiOnt0eXBlOlwiYm9vbGVhblwiLGRlZmF1bHQ6ITEscmVxdWlyZXM6W1wiaWNvbi1pbWFnZVwiLHtcImljb24tcm90YXRpb24tYWxpZ25tZW50XCI6XCJtYXBcIn0se1wic3ltYm9sLXBsYWNlbWVudFwiOltcImxpbmVcIixcImxpbmUtY2VudGVyXCJdfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaWNvbi1vZmZzZXRcIjp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJudW1iZXJcIixsZW5ndGg6MixkZWZhdWx0OlswLDBdLHJlcXVpcmVzOltcImljb24taW1hZ2VcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImljb24tYW5jaG9yXCI6e3R5cGU6XCJlbnVtXCIsdmFsdWVzOntjZW50ZXI6e30sbGVmdDp7fSxyaWdodDp7fSx0b3A6e30sYm90dG9tOnt9LFwidG9wLWxlZnRcIjp7fSxcInRvcC1yaWdodFwiOnt9LFwiYm90dG9tLWxlZnRcIjp7fSxcImJvdHRvbS1yaWdodFwiOnt9fSxkZWZhdWx0OlwiY2VudGVyXCIscmVxdWlyZXM6W1wiaWNvbi1pbWFnZVwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwiaWNvbi1waXRjaC1hbGlnbm1lbnRcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fSxhdXRvOnt9fSxkZWZhdWx0OlwiYXV0b1wiLHJlcXVpcmVzOltcImljb24taW1hZ2VcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fSxhdXRvOnt9fSxkZWZhdWx0OlwiYXV0b1wiLHJlcXVpcmVzOltcInRleHQtZmllbGRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fSxcInZpZXdwb3J0LWdseXBoXCI6e30sYXV0bzp7fX0sZGVmYXVsdDpcImF1dG9cIixyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInRleHQtZmllbGRcIjp7dHlwZTpcImZvcm1hdHRlZFwiLGRlZmF1bHQ6XCJcIix0b2tlbnM6ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcInRleHQtZm9udFwiOnt0eXBlOlwiYXJyYXlcIix2YWx1ZTpcInN0cmluZ1wiLGRlZmF1bHQ6W1wiT3BlbiBTYW5zIFJlZ3VsYXJcIixcIkFyaWFsIFVuaWNvZGUgTVMgUmVndWxhclwiXSxyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJ0ZXh0LXNpemVcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MTYsbWluaW11bTowLHVuaXRzOlwicGl4ZWxzXCIscmVxdWlyZXM6W1widGV4dC1maWVsZFwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwidGV4dC1tYXgtd2lkdGhcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MTAsbWluaW11bTowLHVuaXRzOlwiZW1zXCIscmVxdWlyZXM6W1widGV4dC1maWVsZFwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwidGV4dC1saW5lLWhlaWdodFwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoxLjIsdW5pdHM6XCJlbXNcIixyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInRleHQtbGV0dGVyLXNwYWNpbmdcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MCx1bml0czpcImVtc1wiLHJlcXVpcmVzOltcInRleHQtZmllbGRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcInRleHQtanVzdGlmeVwiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7YXV0bzp7fSxsZWZ0Ont9LGNlbnRlcjp7fSxyaWdodDp7fX0sZGVmYXVsdDpcImNlbnRlclwiLHJlcXVpcmVzOltcInRleHQtZmllbGRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcInRleHQtcmFkaWFsLW9mZnNldFwiOnt0eXBlOlwibnVtYmVyXCIsdW5pdHM6XCJlbXNcIixkZWZhdWx0OjAscmVxdWlyZXM6W1widGV4dC1maWVsZFwiXSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiXX19LFwidGV4dC12YXJpYWJsZS1hbmNob3JcIjp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJlbnVtXCIsdmFsdWVzOntjZW50ZXI6e30sbGVmdDp7fSxyaWdodDp7fSx0b3A6e30sYm90dG9tOnt9LFwidG9wLWxlZnRcIjp7fSxcInRvcC1yaWdodFwiOnt9LFwiYm90dG9tLWxlZnRcIjp7fSxcImJvdHRvbS1yaWdodFwiOnt9fSxyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCIse1wic3ltYm9sLXBsYWNlbWVudFwiOltcInBvaW50XCJdfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwidGV4dC12YXJpYWJsZS1hbmNob3Itb2Zmc2V0XCI6e3R5cGU6XCJ2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb25cIixyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCIse1wic3ltYm9sLXBsYWNlbWVudFwiOltcInBvaW50XCJdfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcInRleHQtYW5jaG9yXCI6e3R5cGU6XCJlbnVtXCIsdmFsdWVzOntjZW50ZXI6e30sbGVmdDp7fSxyaWdodDp7fSx0b3A6e30sYm90dG9tOnt9LFwidG9wLWxlZnRcIjp7fSxcInRvcC1yaWdodFwiOnt9LFwiYm90dG9tLWxlZnRcIjp7fSxcImJvdHRvbS1yaWdodFwiOnt9fSxkZWZhdWx0OlwiY2VudGVyXCIscmVxdWlyZXM6W1widGV4dC1maWVsZFwiLHtcIiFcIjpcInRleHQtdmFyaWFibGUtYW5jaG9yXCJ9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwidGV4dC1tYXgtYW5nbGVcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6NDUsdW5pdHM6XCJkZWdyZWVzXCIscmVxdWlyZXM6W1widGV4dC1maWVsZFwiLHtcInN5bWJvbC1wbGFjZW1lbnRcIjpbXCJsaW5lXCIsXCJsaW5lLWNlbnRlclwiXX1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInRleHQtd3JpdGluZy1tb2RlXCI6e3R5cGU6XCJhcnJheVwiLHZhbHVlOlwiZW51bVwiLHZhbHVlczp7aG9yaXpvbnRhbDp7fSx2ZXJ0aWNhbDp7fX0scmVxdWlyZXM6W1widGV4dC1maWVsZFwiLHtcInN5bWJvbC1wbGFjZW1lbnRcIjpbXCJwb2ludFwiXX1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInRleHQtcm90YXRlXCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAscGVyaW9kOjM2MCx1bml0czpcImRlZ3JlZXNcIixyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJ0ZXh0LXBhZGRpbmdcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MixtaW5pbXVtOjAsdW5pdHM6XCJwaXhlbHNcIixyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInRleHQta2VlcC11cHJpZ2h0XCI6e3R5cGU6XCJib29sZWFuXCIsZGVmYXVsdDohMCxyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCIse1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6W1wibGluZVwiLFwibGluZS1jZW50ZXJcIl19XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJ0ZXh0LXRyYW5zZm9ybVwiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7bm9uZTp7fSx1cHBlcmNhc2U6e30sbG93ZXJjYXNlOnt9fSxkZWZhdWx0Olwibm9uZVwiLHJlcXVpcmVzOltcInRleHQtZmllbGRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcInRleHQtb2Zmc2V0XCI6e3R5cGU6XCJhcnJheVwiLHZhbHVlOlwibnVtYmVyXCIsdW5pdHM6XCJlbXNcIixsZW5ndGg6MixkZWZhdWx0OlswLDBdLHJlcXVpcmVzOltcInRleHQtZmllbGRcIix7XCIhXCI6XCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIn1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjp7dHlwZTpcImJvb2xlYW5cIixkZWZhdWx0OiExLHJlcXVpcmVzOltcInRleHQtZmllbGRcIix7XCIhXCI6XCJ0ZXh0LW92ZXJsYXBcIn1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInRleHQtb3ZlcmxhcFwiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7bmV2ZXI6e30sYWx3YXlzOnt9LGNvb3BlcmF0aXZlOnt9fSxyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOnt0eXBlOlwiYm9vbGVhblwiLGRlZmF1bHQ6ITEscmVxdWlyZXM6W1widGV4dC1maWVsZFwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJ0ZXh0LW9wdGlvbmFsXCI6e3R5cGU6XCJib29sZWFuXCIsZGVmYXVsdDohMSxyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCIsXCJpY29uLWltYWdlXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSx2aXNpYmlsaXR5Ont0eXBlOlwiZW51bVwiLHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSxkZWZhdWx0OlwidmlzaWJsZVwiLFwicHJvcGVydHktdHlwZVwiOlwiY29uc3RhbnRcIn19LGxheW91dF9yYXN0ZXI6e3Zpc2liaWxpdHk6e3R5cGU6XCJlbnVtXCIsdmFsdWVzOnt2aXNpYmxlOnt9LG5vbmU6e319LGRlZmF1bHQ6XCJ2aXNpYmxlXCIsXCJwcm9wZXJ0eS10eXBlXCI6XCJjb25zdGFudFwifX0sbGF5b3V0X2hpbGxzaGFkZTp7dmlzaWJpbGl0eTp7dHlwZTpcImVudW1cIix2YWx1ZXM6e3Zpc2libGU6e30sbm9uZTp7fX0sZGVmYXVsdDpcInZpc2libGVcIixcInByb3BlcnR5LXR5cGVcIjpcImNvbnN0YW50XCJ9fSxmaWx0ZXI6e3R5cGU6XCJhcnJheVwiLHZhbHVlOlwiKlwifSxmaWx0ZXJfb3BlcmF0b3I6e3R5cGU6XCJlbnVtXCIsdmFsdWVzOntcIj09XCI6e30sXCIhPVwiOnt9LFwiPlwiOnt9LFwiPj1cIjp7fSxcIjxcIjp7fSxcIjw9XCI6e30saW46e30sXCIhaW5cIjp7fSxhbGw6e30sYW55Ont9LG5vbmU6e30saGFzOnt9LFwiIWhhc1wiOnt9fX0sZ2VvbWV0cnlfdHlwZTp7dHlwZTpcImVudW1cIix2YWx1ZXM6e1BvaW50Ont9LExpbmVTdHJpbmc6e30sUG9seWdvbjp7fX19LGZ1bmN0aW9uOntleHByZXNzaW9uOnt0eXBlOlwiZXhwcmVzc2lvblwifSxzdG9wczp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJmdW5jdGlvbl9zdG9wXCJ9LGJhc2U6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjEsbWluaW11bTowfSxwcm9wZXJ0eTp7dHlwZTpcInN0cmluZ1wiLGRlZmF1bHQ6XCIkem9vbVwifSx0eXBlOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7aWRlbnRpdHk6e30sZXhwb25lbnRpYWw6e30saW50ZXJ2YWw6e30sY2F0ZWdvcmljYWw6e319LGRlZmF1bHQ6XCJleHBvbmVudGlhbFwifSxjb2xvclNwYWNlOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7cmdiOnt9LGxhYjp7fSxoY2w6e319LGRlZmF1bHQ6XCJyZ2JcIn0sZGVmYXVsdDp7dHlwZTpcIipcIixyZXF1aXJlZDohMX19LGZ1bmN0aW9uX3N0b3A6e3R5cGU6XCJhcnJheVwiLG1pbmltdW06MCxtYXhpbXVtOjI0LHZhbHVlOltcIm51bWJlclwiLFwiY29sb3JcIl0sbGVuZ3RoOjJ9LGV4cHJlc3Npb246e3R5cGU6XCJhcnJheVwiLHZhbHVlOlwiKlwiLG1pbmltdW06MX0sbGlnaHQ6e2FuY2hvcjp7dHlwZTpcImVudW1cIixkZWZhdWx0Olwidmlld3BvcnRcIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCIsdHJhbnNpdGlvbjohMSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCJdfX0scG9zaXRpb246e3R5cGU6XCJhcnJheVwiLGRlZmF1bHQ6WzEuMTUsMjEwLDMwXSxsZW5ndGg6Myx2YWx1ZTpcIm51bWJlclwiLFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwiLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX19LGNvbG9yOnt0eXBlOlwiY29sb3JcIixcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIixkZWZhdWx0OlwiI2ZmZmZmZlwiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LHRyYW5zaXRpb246ITB9LGludGVuc2l0eTp7dHlwZTpcIm51bWJlclwiLFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwiLGRlZmF1bHQ6LjUsbWluaW11bTowLG1heGltdW06MSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSx0cmFuc2l0aW9uOiEwfX0sc2t5OntcInNreS1jb2xvclwiOnt0eXBlOlwiY29sb3JcIixcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIixkZWZhdWx0OlwiIzg4QzZGQ1wiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LHRyYW5zaXRpb246ITB9LFwiaG9yaXpvbi1jb2xvclwiOnt0eXBlOlwiY29sb3JcIixcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIixkZWZhdWx0OlwiI2ZmZmZmZlwiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LHRyYW5zaXRpb246ITB9LFwiZm9nLWNvbG9yXCI6e3R5cGU6XCJjb2xvclwiLFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwiLGRlZmF1bHQ6XCIjZmZmZmZmXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sdHJhbnNpdGlvbjohMH0sXCJmb2ctZ3JvdW5kLWJsZW5kXCI6e3R5cGU6XCJudW1iZXJcIixcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIixkZWZhdWx0Oi41LG1pbmltdW06MCxtYXhpbXVtOjEsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sdHJhbnNpdGlvbjohMH0sXCJob3Jpem9uLWZvZy1ibGVuZFwiOnt0eXBlOlwibnVtYmVyXCIsXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCIsZGVmYXVsdDouOCxtaW5pbXVtOjAsbWF4aW11bToxLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LHRyYW5zaXRpb246ITB9LFwic2t5LWhvcml6b24tYmxlbmRcIjp7dHlwZTpcIm51bWJlclwiLFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwiLGRlZmF1bHQ6LjgsbWluaW11bTowLG1heGltdW06MSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSx0cmFuc2l0aW9uOiEwfSxcImF0bW9zcGhlcmUtYmxlbmRcIjp7dHlwZTpcIm51bWJlclwiLFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwiLGRlZmF1bHQ6LjgsbWluaW11bTowLG1heGltdW06MSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSx0cmFuc2l0aW9uOiEwfX0sdGVycmFpbjp7c291cmNlOnt0eXBlOlwic3RyaW5nXCIscmVxdWlyZWQ6ITB9LGV4YWdnZXJhdGlvbjp7dHlwZTpcIm51bWJlclwiLG1pbmltdW06MCxkZWZhdWx0OjF9fSxwcm9qZWN0aW9uOnt0eXBlOnt0eXBlOlwiZW51bVwiLGRlZmF1bHQ6XCJtZXJjYXRvclwiLHZhbHVlczp7bWVyY2F0b3I6e30sZ2xvYmU6e319fX0scGFpbnQ6W1wicGFpbnRfZmlsbFwiLFwicGFpbnRfbGluZVwiLFwicGFpbnRfY2lyY2xlXCIsXCJwYWludF9oZWF0bWFwXCIsXCJwYWludF9maWxsLWV4dHJ1c2lvblwiLFwicGFpbnRfc3ltYm9sXCIsXCJwYWludF9yYXN0ZXJcIixcInBhaW50X2hpbGxzaGFkZVwiLFwicGFpbnRfYmFja2dyb3VuZFwiXSxwYWludF9maWxsOntcImZpbGwtYW50aWFsaWFzXCI6e3R5cGU6XCJib29sZWFuXCIsZGVmYXVsdDohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJmaWxsLW9wYWNpdHlcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImZpbGwtY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsZGVmYXVsdDpcIiMwMDAwMDBcIix0cmFuc2l0aW9uOiEwLHJlcXVpcmVzOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIixcImZlYXR1cmUtc3RhdGVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJmaWxsLW91dGxpbmUtY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsdHJhbnNpdGlvbjohMCxyZXF1aXJlczpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9LHtcImZpbGwtYW50aWFsaWFzXCI6ITB9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCIsXCJmZWF0dXJlLXN0YXRlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwiZmlsbC10cmFuc2xhdGVcIjp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJudW1iZXJcIixsZW5ndGg6MixkZWZhdWx0OlswLDBdLHRyYW5zaXRpb246ITAsdW5pdHM6XCJwaXhlbHNcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sZGVmYXVsdDpcIm1hcFwiLHJlcXVpcmVzOltcImZpbGwtdHJhbnNsYXRlXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImZpbGwtcGF0dGVyblwiOnt0eXBlOlwicmVzb2x2ZWRJbWFnZVwiLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlblwifX0sXCJwYWludF9maWxsLWV4dHJ1c2lvblwiOntcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiZmlsbC1leHRydXNpb24tY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsZGVmYXVsdDpcIiMwMDAwMDBcIix0cmFuc2l0aW9uOiEwLHJlcXVpcmVzOlt7XCIhXCI6XCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCJ9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCIsXCJmZWF0dXJlLXN0YXRlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCI6e3R5cGU6XCJhcnJheVwiLHZhbHVlOlwibnVtYmVyXCIsbGVuZ3RoOjIsZGVmYXVsdDpbMCwwXSx0cmFuc2l0aW9uOiEwLHVuaXRzOlwicGl4ZWxzXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9fSxkZWZhdWx0OlwibWFwXCIscmVxdWlyZXM6W1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjp7dHlwZTpcInJlc29sdmVkSW1hZ2VcIix0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5cIn0sXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MCxtaW5pbXVtOjAsdW5pdHM6XCJtZXRlcnNcIix0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIixcImZlYXR1cmUtc3RhdGVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAsbWluaW11bTowLHVuaXRzOlwibWV0ZXJzXCIsdHJhbnNpdGlvbjohMCxyZXF1aXJlczpbXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCI6e3R5cGU6XCJib29sZWFuXCIsZGVmYXVsdDohMCx0cmFuc2l0aW9uOiExLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifX0scGFpbnRfbGluZTp7XCJsaW5lLW9wYWNpdHlcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImxpbmUtY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsZGVmYXVsdDpcIiMwMDAwMDBcIix0cmFuc2l0aW9uOiEwLHJlcXVpcmVzOlt7XCIhXCI6XCJsaW5lLXBhdHRlcm5cIn1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIixcImZlYXR1cmUtc3RhdGVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJsaW5lLXRyYW5zbGF0ZVwiOnt0eXBlOlwiYXJyYXlcIix2YWx1ZTpcIm51bWJlclwiLGxlbmd0aDoyLGRlZmF1bHQ6WzAsMF0sdHJhbnNpdGlvbjohMCx1bml0czpcInBpeGVsc1wiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9fSxkZWZhdWx0OlwibWFwXCIscmVxdWlyZXM6W1wibGluZS10cmFuc2xhdGVcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwibGluZS13aWR0aFwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoxLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOlwicGl4ZWxzXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImxpbmUtZ2FwLXdpZHRoXCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAsbWluaW11bTowLHRyYW5zaXRpb246ITAsdW5pdHM6XCJwaXhlbHNcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCIsXCJmZWF0dXJlLXN0YXRlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwibGluZS1vZmZzZXRcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MCx0cmFuc2l0aW9uOiEwLHVuaXRzOlwicGl4ZWxzXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImxpbmUtYmx1clwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOlwicGl4ZWxzXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImxpbmUtZGFzaGFycmF5XCI6e3R5cGU6XCJhcnJheVwiLHZhbHVlOlwibnVtYmVyXCIsbWluaW11bTowLHRyYW5zaXRpb246ITAsdW5pdHM6XCJsaW5lIHdpZHRoc1wiLHJlcXVpcmVzOlt7XCIhXCI6XCJsaW5lLXBhdHRlcm5cIn1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiY3Jvc3MtZmFkZWRcIn0sXCJsaW5lLXBhdHRlcm5cIjp7dHlwZTpcInJlc29sdmVkSW1hZ2VcIix0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5cIn0sXCJsaW5lLWdyYWRpZW50XCI6e3R5cGU6XCJjb2xvclwiLHRyYW5zaXRpb246ITEscmVxdWlyZXM6W3tcIiFcIjpcImxpbmUtZGFzaGFycmF5XCJ9LHtcIiFcIjpcImxpbmUtcGF0dGVyblwifSx7c291cmNlOlwiZ2VvanNvblwiLGhhczp7bGluZU1ldHJpY3M6ITB9fV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wibGluZS1wcm9ncmVzc1wiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJjb2xvci1yYW1wXCJ9fSxwYWludF9jaXJjbGU6e1wiY2lyY2xlLXJhZGl1c1wiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDo1LG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOlwicGl4ZWxzXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImNpcmNsZS1jb2xvclwiOnt0eXBlOlwiY29sb3JcIixkZWZhdWx0OlwiIzAwMDAwMFwiLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImNpcmNsZS1ibHVyXCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCIsXCJmZWF0dXJlLXN0YXRlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwiY2lyY2xlLW9wYWNpdHlcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImNpcmNsZS10cmFuc2xhdGVcIjp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJudW1iZXJcIixsZW5ndGg6MixkZWZhdWx0OlswLDBdLHRyYW5zaXRpb246ITAsdW5pdHM6XCJwaXhlbHNcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9fSxkZWZhdWx0OlwibWFwXCIscmVxdWlyZXM6W1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sZGVmYXVsdDpcIm1hcFwiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sZGVmYXVsdDpcInZpZXdwb3J0XCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOlwicGl4ZWxzXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImNpcmNsZS1zdHJva2UtY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsZGVmYXVsdDpcIiMwMDAwMDBcIix0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIixcImZlYXR1cmUtc3RhdGVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifX0scGFpbnRfaGVhdG1hcDp7XCJoZWF0bWFwLXJhZGl1c1wiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDozMCxtaW5pbXVtOjEsdHJhbnNpdGlvbjohMCx1bml0czpcInBpeGVsc1wiLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIixcImZlYXR1cmUtc3RhdGVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJoZWF0bWFwLXdlaWdodFwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoxLG1pbmltdW06MCx0cmFuc2l0aW9uOiExLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIixcImZlYXR1cmUtc3RhdGVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJoZWF0bWFwLWludGVuc2l0eVwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoxLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImhlYXRtYXAtY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsZGVmYXVsdDpbXCJpbnRlcnBvbGF0ZVwiLFtcImxpbmVhclwiXSxbXCJoZWF0bWFwLWRlbnNpdHlcIl0sMCxcInJnYmEoMCwgMCwgMjU1LCAwKVwiLC4xLFwicm95YWxibHVlXCIsLjMsXCJjeWFuXCIsLjUsXCJsaW1lXCIsLjcsXCJ5ZWxsb3dcIiwxLFwicmVkXCJdLHRyYW5zaXRpb246ITEsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiaGVhdG1hcC1kZW5zaXR5XCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImNvbG9yLXJhbXBcIn0sXCJoZWF0bWFwLW9wYWNpdHlcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9fSxwYWludF9zeW1ib2w6e1wiaWNvbi1vcGFjaXR5XCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjEsbWluaW11bTowLG1heGltdW06MSx0cmFuc2l0aW9uOiEwLHJlcXVpcmVzOltcImljb24taW1hZ2VcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImljb24tY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsZGVmYXVsdDpcIiMwMDAwMDBcIix0cmFuc2l0aW9uOiEwLHJlcXVpcmVzOltcImljb24taW1hZ2VcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcImljb24taGFsby1jb2xvclwiOnt0eXBlOlwiY29sb3JcIixkZWZhdWx0OlwicmdiYSgwLCAwLCAwLCAwKVwiLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W1wiaWNvbi1pbWFnZVwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCIsXCJmZWF0dXJlLXN0YXRlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwiaWNvbi1oYWxvLXdpZHRoXCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAsbWluaW11bTowLHRyYW5zaXRpb246ITAsdW5pdHM6XCJwaXhlbHNcIixyZXF1aXJlczpbXCJpY29uLWltYWdlXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIixcImZlYXR1cmUtc3RhdGVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJpY29uLWhhbG8tYmx1clwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOlwicGl4ZWxzXCIscmVxdWlyZXM6W1wiaWNvbi1pbWFnZVwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCIsXCJmZWF0dXJlLXN0YXRlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwiaWNvbi10cmFuc2xhdGVcIjp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJudW1iZXJcIixsZW5ndGg6MixkZWZhdWx0OlswLDBdLHRyYW5zaXRpb246ITAsdW5pdHM6XCJwaXhlbHNcIixyZXF1aXJlczpbXCJpY29uLWltYWdlXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImljb24tdHJhbnNsYXRlLWFuY2hvclwiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9fSxkZWZhdWx0OlwibWFwXCIscmVxdWlyZXM6W1wiaWNvbi1pbWFnZVwiLFwiaWNvbi10cmFuc2xhdGVcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwidGV4dC1vcGFjaXR5XCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjEsbWluaW11bTowLG1heGltdW06MSx0cmFuc2l0aW9uOiEwLHJlcXVpcmVzOltcInRleHQtZmllbGRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcInRleHQtY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsZGVmYXVsdDpcIiMwMDAwMDBcIix0cmFuc2l0aW9uOiEwLG92ZXJyaWRhYmxlOiEwLHJlcXVpcmVzOltcInRleHQtZmllbGRcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiLFwiZmVhdHVyZVwiLFwiZmVhdHVyZS1zdGF0ZVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwifSxcInRleHQtaGFsby1jb2xvclwiOnt0eXBlOlwiY29sb3JcIixkZWZhdWx0OlwicmdiYSgwLCAwLCAwLCAwKVwiLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W1widGV4dC1maWVsZFwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCIsXCJmZWF0dXJlLXN0YXRlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwidGV4dC1oYWxvLXdpZHRoXCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAsbWluaW11bTowLHRyYW5zaXRpb246ITAsdW5pdHM6XCJwaXhlbHNcIixyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIixcImZlYXR1cmVcIixcImZlYXR1cmUtc3RhdGVcIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIn0sXCJ0ZXh0LWhhbG8tYmx1clwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOlwicGl4ZWxzXCIscmVxdWlyZXM6W1widGV4dC1maWVsZFwiXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCIsXCJmZWF0dXJlLXN0YXRlXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtZHJpdmVuXCJ9LFwidGV4dC10cmFuc2xhdGVcIjp7dHlwZTpcImFycmF5XCIsdmFsdWU6XCJudW1iZXJcIixsZW5ndGg6MixkZWZhdWx0OlswLDBdLHRyYW5zaXRpb246ITAsdW5pdHM6XCJwaXhlbHNcIixyZXF1aXJlczpbXCJ0ZXh0LWZpZWxkXCJdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9fSxkZWZhdWx0OlwibWFwXCIscmVxdWlyZXM6W1widGV4dC1maWVsZFwiLFwidGV4dC10cmFuc2xhdGVcIl0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9fSxwYWludF9yYXN0ZXI6e1wicmFzdGVyLW9wYWNpdHlcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwicmFzdGVyLWh1ZS1yb3RhdGVcIjp7dHlwZTpcIm51bWJlclwiLGRlZmF1bHQ6MCxwZXJpb2Q6MzYwLHRyYW5zaXRpb246ITAsdW5pdHM6XCJkZWdyZWVzXCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwicmFzdGVyLWJyaWdodG5lc3MtbWluXCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAsbWluaW11bTowLG1heGltdW06MSx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoxLG1pbmltdW06MCxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJyYXN0ZXItc2F0dXJhdGlvblwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowLG1pbmltdW06LTEsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwicmFzdGVyLWNvbnRyYXN0XCI6e3R5cGU6XCJudW1iZXJcIixkZWZhdWx0OjAsbWluaW11bTotMSxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJyYXN0ZXItcmVzYW1wbGluZ1wiOnt0eXBlOlwiZW51bVwiLHZhbHVlczp7bGluZWFyOnt9LG5lYXJlc3Q6e319LGRlZmF1bHQ6XCJsaW5lYXJcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn0sXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDozMDAsbWluaW11bTowLHRyYW5zaXRpb246ITEsdW5pdHM6XCJtaWxsaXNlY29uZHNcIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn19LHBhaW50X2hpbGxzaGFkZTp7XCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDozMzUsbWluaW11bTowLG1heGltdW06MzU5LHRyYW5zaXRpb246ITEsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIjp7dHlwZTpcImVudW1cIix2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sZGVmYXVsdDpcInZpZXdwb3J0XCIsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDouNSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiOnt0eXBlOlwiY29sb3JcIixkZWZhdWx0OlwiIzAwMDAwMFwiLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiOnt0eXBlOlwiY29sb3JcIixkZWZhdWx0OlwiI0ZGRkZGRlwiLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9LFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiOnt0eXBlOlwiY29sb3JcIixkZWZhdWx0OlwiIzAwMDAwMFwiLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWNvbnN0YW50XCJ9fSxwYWludF9iYWNrZ3JvdW5kOntcImJhY2tncm91bmQtY29sb3JcIjp7dHlwZTpcImNvbG9yXCIsZGVmYXVsdDpcIiMwMDAwMDBcIix0cmFuc2l0aW9uOiEwLHJlcXVpcmVzOlt7XCIhXCI6XCJiYWNrZ3JvdW5kLXBhdHRlcm5cIn1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltcInpvb21cIl19LFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1jb25zdGFudFwifSxcImJhY2tncm91bmQtcGF0dGVyblwiOnt0eXBlOlwicmVzb2x2ZWRJbWFnZVwiLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W1wiem9vbVwiXX0sXCJwcm9wZXJ0eS10eXBlXCI6XCJjcm9zcy1mYWRlZFwifSxcImJhY2tncm91bmQtb3BhY2l0eVwiOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDoxLG1pbmltdW06MCxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbXCJ6b29tXCJdfSxcInByb3BlcnR5LXR5cGVcIjpcImRhdGEtY29uc3RhbnRcIn19LHRyYW5zaXRpb246e2R1cmF0aW9uOnt0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDozMDAsbWluaW11bTowLHVuaXRzOlwibWlsbGlzZWNvbmRzXCJ9LGRlbGF5Ont0eXBlOlwibnVtYmVyXCIsZGVmYXVsdDowLG1pbmltdW06MCx1bml0czpcIm1pbGxpc2Vjb25kc1wifX0sXCJwcm9wZXJ0eS10eXBlXCI6e1wiZGF0YS1kcml2ZW5cIjp7dHlwZTpcInByb3BlcnR5LXR5cGVcIn0sXCJjcm9zcy1mYWRlZFwiOnt0eXBlOlwicHJvcGVydHktdHlwZVwifSxcImNyb3NzLWZhZGVkLWRhdGEtZHJpdmVuXCI6e3R5cGU6XCJwcm9wZXJ0eS10eXBlXCJ9LFwiY29sb3ItcmFtcFwiOnt0eXBlOlwicHJvcGVydHktdHlwZVwifSxcImRhdGEtY29uc3RhbnRcIjp7dHlwZTpcInByb3BlcnR5LXR5cGVcIn0sY29uc3RhbnQ6e3R5cGU6XCJwcm9wZXJ0eS10eXBlXCJ9fSxwcm9tb3RlSWQ6e1wiKlwiOnt0eXBlOlwic3RyaW5nXCJ9fX07Y29uc3QgSz1bXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwibWluem9vbVwiLFwibWF4em9vbVwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIl07ZnVuY3Rpb24gWCh0LGUpe2NvbnN0IHI9e307Zm9yKGNvbnN0IGUgaW4gdClcInJlZlwiIT09ZSYmKHJbZV09dFtlXSk7cmV0dXJuIEsuZm9yRWFjaCgodD0+e3QgaW4gZSYmKHJbdF09ZVt0XSk7fSkpLHJ9ZnVuY3Rpb24gSCh0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKCFBcnJheS5pc0FycmF5KGUpfHx0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiAhMTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKylpZighSCh0W3JdLGVbcl0pKXJldHVybiAhMTtyZXR1cm4gITB9aWYoXCJvYmplY3RcIj09dHlwZW9mIHQmJm51bGwhPT10JiZudWxsIT09ZSl7aWYoXCJvYmplY3RcIiE9dHlwZW9mIGUpcmV0dXJuICExO2lmKE9iamVjdC5rZXlzKHQpLmxlbmd0aCE9PU9iamVjdC5rZXlzKGUpLmxlbmd0aClyZXR1cm4gITE7Zm9yKGNvbnN0IHIgaW4gdClpZighSCh0W3JdLGVbcl0pKXJldHVybiAhMTtyZXR1cm4gITB9cmV0dXJuIHQ9PT1lfWZ1bmN0aW9uIFkodCxlKXt0LnB1c2goZSk7fWZ1bmN0aW9uIEoodCxlLHIpe1kocix7Y29tbWFuZDpcImFkZFNvdXJjZVwiLGFyZ3M6W3QsZVt0XV19KTt9ZnVuY3Rpb24gVyh0LGUscil7WShlLHtjb21tYW5kOlwicmVtb3ZlU291cmNlXCIsYXJnczpbdF19KSxyW3RdPSEwO31mdW5jdGlvbiBRKHQsZSxyLG4pe1codCxyLG4pLEoodCxlLHIpO31mdW5jdGlvbiB0dCh0LGUscil7bGV0IG47Zm9yKG4gaW4gdFtyXSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodFtyXSxuKSYmXCJkYXRhXCIhPT1uJiYhSCh0W3JdW25dLGVbcl1bbl0pKXJldHVybiAhMTtmb3IobiBpbiBlW3JdKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlW3JdLG4pJiZcImRhdGFcIiE9PW4mJiFIKHRbcl1bbl0sZVtyXVtuXSkpcmV0dXJuICExO3JldHVybiAhMH1mdW5jdGlvbiBldCh0LGUscixuLGkscyl7dD10fHx7fSxlPWV8fHt9O2Zvcihjb25zdCBhIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsYSkmJihIKHRbYV0sZVthXSl8fHIucHVzaCh7Y29tbWFuZDpzLGFyZ3M6W24sYSxlW2FdLGldfSkpO2Zvcihjb25zdCBhIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsYSkmJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxhKSYmKEgodFthXSxlW2FdKXx8ci5wdXNoKHtjb21tYW5kOnMsYXJnczpbbixhLGVbYV0saV19KSk7fWZ1bmN0aW9uIHJ0KHQpe3JldHVybiB0LmlkfWZ1bmN0aW9uIG50KHQsZSl7cmV0dXJuIHRbZS5pZF09ZSx0fWNsYXNzIGl0e2NvbnN0cnVjdG9yKHQsZSxyLG4pe3RoaXMubWVzc2FnZT0odD9gJHt0fTogYDpcIlwiKStyLG4mJih0aGlzLmlkZW50aWZpZXI9biksbnVsbCE9ZSYmZS5fX2xpbmVfXyYmKHRoaXMubGluZT1lLl9fbGluZV9fKTt9fWZ1bmN0aW9uIHN0KHQsLi4uZSl7Zm9yKGNvbnN0IHIgb2YgZSlmb3IoY29uc3QgZSBpbiByKXRbZV09cltlXTtyZXR1cm4gdH1jbGFzcyBhdCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSksdGhpcy5tZXNzYWdlPWUsdGhpcy5rZXk9dDt9fWNsYXNzIG90e2NvbnN0cnVjdG9yKHQsZT1bXSl7dGhpcy5wYXJlbnQ9dCx0aGlzLmJpbmRpbmdzPXt9O2Zvcihjb25zdFt0LHJdb2YgZSl0aGlzLmJpbmRpbmdzW3RdPXI7fWNvbmNhdCh0KXtyZXR1cm4gbmV3IG90KHRoaXMsdCl9Z2V0KHQpe2lmKHRoaXMuYmluZGluZ3NbdF0pcmV0dXJuIHRoaXMuYmluZGluZ3NbdF07aWYodGhpcy5wYXJlbnQpcmV0dXJuIHRoaXMucGFyZW50LmdldCh0KTt0aHJvdyBuZXcgRXJyb3IoYCR7dH0gbm90IGZvdW5kIGluIHNjb3BlLmApfWhhcyh0KXtyZXR1cm4gISF0aGlzLmJpbmRpbmdzW3RdfHwhIXRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5oYXModCl9fWNvbnN0IGx0PXtraW5kOlwibnVsbFwifSx1dD17a2luZDpcIm51bWJlclwifSxjdD17a2luZDpcInN0cmluZ1wifSxodD17a2luZDpcImJvb2xlYW5cIn0scHQ9e2tpbmQ6XCJjb2xvclwifSxmdD17a2luZDpcIm9iamVjdFwifSxkdD17a2luZDpcInZhbHVlXCJ9LHl0PXtraW5kOlwiY29sbGF0b3JcIn0sbXQ9e2tpbmQ6XCJmb3JtYXR0ZWRcIn0sZ3Q9e2tpbmQ6XCJwYWRkaW5nXCJ9LHh0PXtraW5kOlwicmVzb2x2ZWRJbWFnZVwifSx2dD17a2luZDpcInZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvblwifTtmdW5jdGlvbiBidCh0LGUpe3JldHVybiB7a2luZDpcImFycmF5XCIsaXRlbVR5cGU6dCxOOmV9fWZ1bmN0aW9uIHd0KHQpe2lmKFwiYXJyYXlcIj09PXQua2luZCl7Y29uc3QgZT13dCh0Lml0ZW1UeXBlKTtyZXR1cm4gXCJudW1iZXJcIj09dHlwZW9mIHQuTj9gYXJyYXk8JHtlfSwgJHt0Lk59PmA6XCJ2YWx1ZVwiPT09dC5pdGVtVHlwZS5raW5kP1wiYXJyYXlcIjpgYXJyYXk8JHtlfT5gfXJldHVybiB0LmtpbmR9Y29uc3QgX3Q9W2x0LHV0LGN0LGh0LHB0LG10LGZ0LGJ0KGR0KSxndCx4dCx2dF07ZnVuY3Rpb24gQXQodCxlKXtpZihcImVycm9yXCI9PT1lLmtpbmQpcmV0dXJuIG51bGw7aWYoXCJhcnJheVwiPT09dC5raW5kKXtpZihcImFycmF5XCI9PT1lLmtpbmQmJigwPT09ZS5OJiZcInZhbHVlXCI9PT1lLml0ZW1UeXBlLmtpbmR8fCFBdCh0Lml0ZW1UeXBlLGUuaXRlbVR5cGUpKSYmKFwibnVtYmVyXCIhPXR5cGVvZiB0Lk58fHQuTj09PWUuTikpcmV0dXJuIG51bGx9ZWxzZSB7aWYodC5raW5kPT09ZS5raW5kKXJldHVybiBudWxsO2lmKFwidmFsdWVcIj09PXQua2luZClmb3IoY29uc3QgdCBvZiBfdClpZighQXQodCxlKSlyZXR1cm4gbnVsbH1yZXR1cm4gYEV4cGVjdGVkICR7d3QodCl9IGJ1dCBmb3VuZCAke3d0KGUpfSBpbnN0ZWFkLmB9ZnVuY3Rpb24gU3QodCxlKXtyZXR1cm4gZS5zb21lKChlPT5lLmtpbmQ9PT10LmtpbmQpKX1mdW5jdGlvbiBrdCh0LGUpe3JldHVybiBlLnNvbWUoKGU9PlwibnVsbFwiPT09ZT9udWxsPT09dDpcImFycmF5XCI9PT1lP0FycmF5LmlzQXJyYXkodCk6XCJvYmplY3RcIj09PWU/dCYmIUFycmF5LmlzQXJyYXkodCkmJlwib2JqZWN0XCI9PXR5cGVvZiB0OmU9PT10eXBlb2YgdCkpfWZ1bmN0aW9uIE10KHQsZSl7cmV0dXJuIFwiYXJyYXlcIj09PXQua2luZCYmXCJhcnJheVwiPT09ZS5raW5kP3QuaXRlbVR5cGUua2luZD09PWUuaXRlbVR5cGUua2luZCYmXCJudW1iZXJcIj09dHlwZW9mIHQuTjp0LmtpbmQ9PT1lLmtpbmR9Y29uc3QgSXQ9Ljk2NDIyLHp0PS44MjUyMSxQdD00LzI5LEN0PTYvMjksQnQ9MypDdCpDdCxWdD1DdCpDdCpDdCxFdD1NYXRoLlBJLzE4MCxGdD0xODAvTWF0aC5QSTtmdW5jdGlvbiBUdCh0KXtyZXR1cm4gKHQlPTM2MCk8MCYmKHQrPTM2MCksdH1mdW5jdGlvbiAkdChbdCxlLHIsbl0pe2xldCBpLHM7Y29uc3QgYT1EdCgoLjIyMjUwNDUqKHQ9THQodCkpKy43MTY4Nzg2KihlPUx0KGUpKSsuMDYwNjE2OSoocj1MdChyKSkpLzEpO3Q9PT1lJiZlPT09cj9pPXM9YTooaT1EdCgoLjQzNjA3NDcqdCsuMzg1MDY0OSplKy4xNDMwODA0KnIpL0l0KSxzPUR0KCguMDEzOTMyMip0Ky4wOTcxMDQ1KmUrLjcxNDE3MzMqcikvenQpKTtjb25zdCBvPTExNiphLTE2O3JldHVybiBbbzwwPzA6byw1MDAqKGktYSksMjAwKihhLXMpLG5dfWZ1bmN0aW9uIEx0KHQpe3JldHVybiB0PD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIER0KHQpe3JldHVybiB0PlZ0P01hdGgucG93KHQsMS8zKTp0L0J0K1B0fWZ1bmN0aW9uIE90KFt0LGUscixuXSl7bGV0IGk9KHQrMTYpLzExNixzPWlzTmFOKGUpP2k6aStlLzUwMCxhPWlzTmFOKHIpP2k6aS1yLzIwMDtyZXR1cm4gaT0xKlJ0KGkpLHM9SXQqUnQocyksYT16dCpSdChhKSxbanQoMy4xMzM4NTYxKnMtMS42MTY4NjY3KmktLjQ5MDYxNDYqYSksanQoLS45Nzg3Njg0KnMrMS45MTYxNDE1KmkrLjAzMzQ1NCphKSxqdCguMDcxOTQ1MypzLS4yMjg5OTE0KmkrMS40MDUyNDI3KmEpLG5dfWZ1bmN0aW9uIGp0KHQpe3JldHVybiAodD10PD0uMDAzMDQ/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KTwwPzA6dD4xPzE6dH1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gdD5DdD90KnQqdDpCdCoodC1QdCl9ZnVuY3Rpb24gVXQodCl7cmV0dXJuIHBhcnNlSW50KHQucGFkRW5kKDIsdCksMTYpLzI1NX1mdW5jdGlvbiBxdCh0LGUpe3JldHVybiBOdChlP3QvMTAwOnQsMCwxKX1mdW5jdGlvbiBOdCh0LGUscil7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUsdCkscil9ZnVuY3Rpb24gWnQodCl7cmV0dXJuICF0LnNvbWUoTnVtYmVyLmlzTmFOKX1jb25zdCBHdD17YWxpY2VibHVlOlsyNDAsMjQ4LDI1NV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNV0sYXF1YTpbMCwyNTUsMjU1XSxhcXVhbWFyaW5lOlsxMjcsMjU1LDIxMl0sYXp1cmU6WzI0MCwyNTUsMjU1XSxiZWlnZTpbMjQ1LDI0NSwyMjBdLGJpc3F1ZTpbMjU1LDIyOCwxOTZdLGJsYWNrOlswLDAsMF0sYmxhbmNoZWRhbG1vbmQ6WzI1NSwyMzUsMjA1XSxibHVlOlswLDAsMjU1XSxibHVldmlvbGV0OlsxMzgsNDMsMjI2XSxicm93bjpbMTY1LDQyLDQyXSxidXJseXdvb2Q6WzIyMiwxODQsMTM1XSxjYWRldGJsdWU6Wzk1LDE1OCwxNjBdLGNoYXJ0cmV1c2U6WzEyNywyNTUsMF0sY2hvY29sYXRlOlsyMTAsMTA1LDMwXSxjb3JhbDpbMjU1LDEyNyw4MF0sY29ybmZsb3dlcmJsdWU6WzEwMCwxNDksMjM3XSxjb3Juc2lsazpbMjU1LDI0OCwyMjBdLGNyaW1zb246WzIyMCwyMCw2MF0sY3lhbjpbMCwyNTUsMjU1XSxkYXJrYmx1ZTpbMCwwLDEzOV0sZGFya2N5YW46WzAsMTM5LDEzOV0sZGFya2dvbGRlbnJvZDpbMTg0LDEzNCwxMV0sZGFya2dyYXk6WzE2OSwxNjksMTY5XSxkYXJrZ3JlZW46WzAsMTAwLDBdLGRhcmtncmV5OlsxNjksMTY5LDE2OV0sZGFya2toYWtpOlsxODksMTgzLDEwN10sZGFya21hZ2VudGE6WzEzOSwwLDEzOV0sZGFya29saXZlZ3JlZW46Wzg1LDEwNyw0N10sZGFya29yYW5nZTpbMjU1LDE0MCwwXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0XSxkYXJrcmVkOlsxMzksMCwwXSxkYXJrc2FsbW9uOlsyMzMsMTUwLDEyMl0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0M10sZGFya3NsYXRlYmx1ZTpbNzIsNjEsMTM5XSxkYXJrc2xhdGVncmF5Ols0Nyw3OSw3OV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzldLGRhcmt0dXJxdW9pc2U6WzAsMjA2LDIwOV0sZGFya3Zpb2xldDpbMTQ4LDAsMjExXSxkZWVwcGluazpbMjU1LDIwLDE0N10sZGVlcHNreWJsdWU6WzAsMTkxLDI1NV0sZGltZ3JheTpbMTA1LDEwNSwxMDVdLGRpbWdyZXk6WzEwNSwxMDUsMTA1XSxkb2RnZXJibHVlOlszMCwxNDQsMjU1XSxmaXJlYnJpY2s6WzE3OCwzNCwzNF0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwXSxmb3Jlc3RncmVlbjpbMzQsMTM5LDM0XSxmdWNoc2lhOlsyNTUsMCwyNTVdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjBdLGdob3N0d2hpdGU6WzI0OCwyNDgsMjU1XSxnb2xkOlsyNTUsMjE1LDBdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMl0sZ3JheTpbMTI4LDEyOCwxMjhdLGdyZWVuOlswLDEyOCwwXSxncmVlbnllbGxvdzpbMTczLDI1NSw0N10sZ3JleTpbMTI4LDEyOCwxMjhdLGhvbmV5ZGV3OlsyNDAsMjU1LDI0MF0saG90cGluazpbMjU1LDEwNSwxODBdLGluZGlhbnJlZDpbMjA1LDkyLDkyXSxpbmRpZ286Wzc1LDAsMTMwXSxpdm9yeTpbMjU1LDI1NSwyNDBdLGtoYWtpOlsyNDAsMjMwLDE0MF0sbGF2ZW5kZXI6WzIzMCwyMzAsMjUwXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NV0sbGF3bmdyZWVuOlsxMjQsMjUyLDBdLGxlbW9uY2hpZmZvbjpbMjU1LDI1MCwyMDVdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzBdLGxpZ2h0Y29yYWw6WzI0MCwxMjgsMTI4XSxsaWdodGN5YW46WzIyNCwyNTUsMjU1XSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTBdLGxpZ2h0Z3JheTpbMjExLDIxMSwyMTFdLGxpZ2h0Z3JlZW46WzE0NCwyMzgsMTQ0XSxsaWdodGdyZXk6WzIxMSwyMTEsMjExXSxsaWdodHBpbms6WzI1NSwxODIsMTkzXSxsaWdodHNhbG1vbjpbMjU1LDE2MCwxMjJdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzBdLGxpZ2h0c2t5Ymx1ZTpbMTM1LDIwNiwyNTBdLGxpZ2h0c2xhdGVncmF5OlsxMTksMTM2LDE1M10sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzXSxsaWdodHN0ZWVsYmx1ZTpbMTc2LDE5NiwyMjJdLGxpZ2h0eWVsbG93OlsyNTUsMjU1LDIyNF0sbGltZTpbMCwyNTUsMF0sbGltZWdyZWVuOls1MCwyMDUsNTBdLGxpbmVuOlsyNTAsMjQwLDIzMF0sbWFnZW50YTpbMjU1LDAsMjU1XSxtYXJvb246WzEyOCwwLDBdLG1lZGl1bWFxdWFtYXJpbmU6WzEwMiwyMDUsMTcwXSxtZWRpdW1ibHVlOlswLDAsMjA1XSxtZWRpdW1vcmNoaWQ6WzE4Niw4NSwyMTFdLG1lZGl1bXB1cnBsZTpbMTQ3LDExMiwyMTldLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzXSxtZWRpdW1zbGF0ZWJsdWU6WzEyMywxMDQsMjM4XSxtZWRpdW1zcHJpbmdncmVlbjpbMCwyNTAsMTU0XSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDRdLG1lZGl1bXZpb2xldHJlZDpbMTk5LDIxLDEzM10sbWlkbmlnaHRibHVlOlsyNSwyNSwxMTJdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTBdLG1pc3R5cm9zZTpbMjU1LDIyOCwyMjVdLG1vY2Nhc2luOlsyNTUsMjI4LDE4MV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczXSxuYXZ5OlswLDAsMTI4XSxvbGRsYWNlOlsyNTMsMjQ1LDIzMF0sb2xpdmU6WzEyOCwxMjgsMF0sb2xpdmVkcmFiOlsxMDcsMTQyLDM1XSxvcmFuZ2U6WzI1NSwxNjUsMF0sb3JhbmdlcmVkOlsyNTUsNjksMF0sb3JjaGlkOlsyMTgsMTEyLDIxNF0scGFsZWdvbGRlbnJvZDpbMjM4LDIzMiwxNzBdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTJdLHBhbGV0dXJxdW9pc2U6WzE3NSwyMzgsMjM4XSxwYWxldmlvbGV0cmVkOlsyMTksMTEyLDE0N10scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTNdLHBlYWNocHVmZjpbMjU1LDIxOCwxODVdLHBlcnU6WzIwNSwxMzMsNjNdLHBpbms6WzI1NSwxOTIsMjAzXSxwbHVtOlsyMjEsMTYwLDIyMV0scG93ZGVyYmx1ZTpbMTc2LDIyNCwyMzBdLHB1cnBsZTpbMTI4LDAsMTI4XSxyZWJlY2NhcHVycGxlOlsxMDIsNTEsMTUzXSxyZWQ6WzI1NSwwLDBdLHJvc3licm93bjpbMTg4LDE0MywxNDNdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNV0sc2FkZGxlYnJvd246WzEzOSw2OSwxOV0sc2FsbW9uOlsyNTAsMTI4LDExNF0sc2FuZHlicm93bjpbMjQ0LDE2NCw5Nl0sc2VhZ3JlZW46WzQ2LDEzOSw4N10sc2Vhc2hlbGw6WzI1NSwyNDUsMjM4XSxzaWVubmE6WzE2MCw4Miw0NV0sc2lsdmVyOlsxOTIsMTkyLDE5Ml0sc2t5Ymx1ZTpbMTM1LDIwNiwyMzVdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNV0sc2xhdGVncmF5OlsxMTIsMTI4LDE0NF0sc2xhdGVncmV5OlsxMTIsMTI4LDE0NF0sc25vdzpbMjU1LDI1MCwyNTBdLHNwcmluZ2dyZWVuOlswLDI1NSwxMjddLHN0ZWVsYmx1ZTpbNzAsMTMwLDE4MF0sdGFuOlsyMTAsMTgwLDE0MF0sdGVhbDpbMCwxMjgsMTI4XSx0aGlzdGxlOlsyMTYsMTkxLDIxNl0sdG9tYXRvOlsyNTUsOTksNzFdLHR1cnF1b2lzZTpbNjQsMjI0LDIwOF0sdmlvbGV0OlsyMzgsMTMwLDIzOF0sd2hlYXQ6WzI0NSwyMjIsMTc5XSx3aGl0ZTpbMjU1LDI1NSwyNTVdLHdoaXRlc21va2U6WzI0NSwyNDUsMjQ1XSx5ZWxsb3c6WzI1NSwyNTUsMF0seWVsbG93Z3JlZW46WzE1NCwyMDUsNTBdfTtjbGFzcyBLdHtjb25zdHJ1Y3Rvcih0LGUscixuPTEsaT0hMCl7dGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPXIsdGhpcy5hPW4saXx8KHRoaXMucio9bix0aGlzLmcqPW4sdGhpcy5iKj1uLG58fHRoaXMub3ZlcndyaXRlR2V0dGVyKFwicmdiXCIsW3QsZSxyLG5dKSk7fXN0YXRpYyBwYXJzZSh0KXtpZih0IGluc3RhbmNlb2YgS3QpcmV0dXJuIHQ7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpcmV0dXJuO2NvbnN0IGU9ZnVuY3Rpb24odCl7aWYoXCJ0cmFuc3BhcmVudFwiPT09KHQ9dC50b0xvd2VyQ2FzZSgpLnRyaW0oKSkpcmV0dXJuIFswLDAsMCwwXTtjb25zdCBlPUd0W3RdO2lmKGUpe2NvbnN0W3QscixuXT1lO3JldHVybiBbdC8yNTUsci8yNTUsbi8yNTUsMV19aWYodC5zdGFydHNXaXRoKFwiI1wiKSYmL14jKD86WzAtOWEtZl17Myw0fXxbMC05YS1mXXs2fXxbMC05YS1mXXs4fSkkLy50ZXN0KHQpKXtjb25zdCBlPXQubGVuZ3RoPDY/MToyO2xldCByPTE7cmV0dXJuIFtVdCh0LnNsaWNlKHIscis9ZSkpLFV0KHQuc2xpY2UocixyKz1lKSksVXQodC5zbGljZShyLHIrPWUpKSxVdCh0LnNsaWNlKHIscitlKXx8XCJmZlwiKV19aWYodC5zdGFydHNXaXRoKFwicmdiXCIpKXtjb25zdCBlPXQubWF0Y2goL15yZ2JhP1xcKFxccyooW1xcZGUuKy1dKykoJSk/KD86XFxzK3xcXHMqKCwpXFxzKikoW1xcZGUuKy1dKykoJSk/KD86XFxzK3xcXHMqKCwpXFxzKikoW1xcZGUuKy1dKykoJSk/KD86XFxzKihbLFxcL10pXFxzKihbXFxkZS4rLV0rKSglKT8pP1xccypcXCkkLyk7aWYoZSl7Y29uc3RbdCxyLG4saSxzLGEsbyxsLHUsYyxoLHBdPWUsZj1baXx8XCIgXCIsb3x8XCIgXCIsY10uam9pbihcIlwiKTtpZihcIiAgXCI9PT1mfHxcIiAgL1wiPT09Znx8XCIsLFwiPT09Znx8XCIsLCxcIj09PWYpe2NvbnN0IHQ9W24sYSx1XS5qb2luKFwiXCIpLGU9XCIlJSVcIj09PXQ/MTAwOlwiXCI9PT10PzI1NTowO2lmKGUpe2NvbnN0IHQ9W050KCtyL2UsMCwxKSxOdCgrcy9lLDAsMSksTnQoK2wvZSwwLDEpLGg/cXQoK2gscCk6MV07aWYoWnQodCkpcmV0dXJuIHR9fXJldHVybn19Y29uc3Qgcj10Lm1hdGNoKC9eaHNsYT9cXChcXHMqKFtcXGRlListXSspKD86ZGVnKT8oPzpcXHMrfFxccyooLClcXHMqKShbXFxkZS4rLV0rKSUoPzpcXHMrfFxccyooLClcXHMqKShbXFxkZS4rLV0rKSUoPzpcXHMqKFssXFwvXSlcXHMqKFtcXGRlListXSspKCUpPyk/XFxzKlxcKSQvKTtpZihyKXtjb25zdFt0LGUsbixpLHMsYSxvLGwsdV09cixjPVtufHxcIiBcIixzfHxcIiBcIixvXS5qb2luKFwiXCIpO2lmKFwiICBcIj09PWN8fFwiICAvXCI9PT1jfHxcIiwsXCI9PT1jfHxcIiwsLFwiPT09Yyl7Y29uc3QgdD1bK2UsTnQoK2ksMCwxMDApLE50KCthLDAsMTAwKSxsP3F0KCtsLHUpOjFdO2lmKFp0KHQpKXJldHVybiBmdW5jdGlvbihbdCxlLHIsbl0pe2Z1bmN0aW9uIGkobil7Y29uc3QgaT0obit0LzMwKSUxMixzPWUqTWF0aC5taW4ociwxLXIpO3JldHVybiByLXMqTWF0aC5tYXgoLTEsTWF0aC5taW4oaS0zLDktaSwxKSl9cmV0dXJuIHQ9VHQodCksZS89MTAwLHIvPTEwMCxbaSgwKSxpKDgpLGkoNCksbl19KHQpfX19KHQpO3JldHVybiBlP25ldyBLdCguLi5lLCExKTp2b2lkIDB9Z2V0IHJnYigpe2NvbnN0e3I6dCxnOmUsYjpyLGE6bn09dGhpcyxpPW58fDEvMDtyZXR1cm4gdGhpcy5vdmVyd3JpdGVHZXR0ZXIoXCJyZ2JcIixbdC9pLGUvaSxyL2ksbl0pfWdldCBoY2woKXtyZXR1cm4gdGhpcy5vdmVyd3JpdGVHZXR0ZXIoXCJoY2xcIixmdW5jdGlvbih0KXtjb25zdFtlLHIsbixpXT0kdCh0KSxzPU1hdGguc3FydChyKnIrbipuKTtyZXR1cm4gW01hdGgucm91bmQoMWU0KnMpP1R0KE1hdGguYXRhbjIobixyKSpGdCk6TmFOLHMsZSxpXX0odGhpcy5yZ2IpKX1nZXQgbGFiKCl7cmV0dXJuIHRoaXMub3ZlcndyaXRlR2V0dGVyKFwibGFiXCIsJHQodGhpcy5yZ2IpKX1vdmVyd3JpdGVHZXR0ZXIodCxlKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7dmFsdWU6ZX0pLGV9dG9TdHJpbmcoKXtjb25zdFt0LGUscixuXT10aGlzLnJnYjtyZXR1cm4gYHJnYmEoJHtbdCxlLHJdLm1hcCgodD0+TWF0aC5yb3VuZCgyNTUqdCkpKS5qb2luKFwiLFwiKX0sJHtufSlgfX1LdC5ibGFjaz1uZXcgS3QoMCwwLDAsMSksS3Qud2hpdGU9bmV3IEt0KDEsMSwxLDEpLEt0LnRyYW5zcGFyZW50PW5ldyBLdCgwLDAsMCwwKSxLdC5yZWQ9bmV3IEt0KDEsMCwwLDEpO2NsYXNzIFh0e2NvbnN0cnVjdG9yKHQsZSxyKXt0aGlzLnNlbnNpdGl2aXR5PXQ/ZT9cInZhcmlhbnRcIjpcImNhc2VcIjplP1wiYWNjZW50XCI6XCJiYXNlXCIsdGhpcy5sb2NhbGU9cix0aGlzLmNvbGxhdG9yPW5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlP3RoaXMubG9jYWxlOltdLHtzZW5zaXRpdml0eTp0aGlzLnNlbnNpdGl2aXR5LHVzYWdlOlwic2VhcmNoXCJ9KTt9Y29tcGFyZSh0LGUpe3JldHVybiB0aGlzLmNvbGxhdG9yLmNvbXBhcmUodCxlKX1yZXNvbHZlZExvY2FsZSgpe3JldHVybiBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZT90aGlzLmxvY2FsZTpbXSkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlfX1jbGFzcyBIdHtjb25zdHJ1Y3Rvcih0LGUscixuLGkpe3RoaXMudGV4dD10LHRoaXMuaW1hZ2U9ZSx0aGlzLnNjYWxlPXIsdGhpcy5mb250U3RhY2s9bix0aGlzLnRleHRDb2xvcj1pO319Y2xhc3MgWXR7Y29uc3RydWN0b3IodCl7dGhpcy5zZWN0aW9ucz10O31zdGF0aWMgZnJvbVN0cmluZyh0KXtyZXR1cm4gbmV3IFl0KFtuZXcgSHQodCxudWxsLG51bGwsbnVsbCxudWxsKV0pfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMuc2VjdGlvbnMubGVuZ3RofHwhdGhpcy5zZWN0aW9ucy5zb21lKCh0PT4wIT09dC50ZXh0Lmxlbmd0aHx8dC5pbWFnZSYmMCE9PXQuaW1hZ2UubmFtZS5sZW5ndGgpKX1zdGF0aWMgZmFjdG9yeSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFl0P3Q6WXQuZnJvbVN0cmluZyh0KX10b1N0cmluZygpe3JldHVybiAwPT09dGhpcy5zZWN0aW9ucy5sZW5ndGg/XCJcIjp0aGlzLnNlY3Rpb25zLm1hcCgodD0+dC50ZXh0KSkuam9pbihcIlwiKX19Y2xhc3MgSnR7Y29uc3RydWN0b3IodCl7dGhpcy52YWx1ZXM9dC5zbGljZSgpO31zdGF0aWMgcGFyc2UodCl7aWYodCBpbnN0YW5jZW9mIEp0KXJldHVybiB0O2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXJldHVybiBuZXcgSnQoW3QsdCx0LHRdKTtpZihBcnJheS5pc0FycmF5KHQpJiYhKHQubGVuZ3RoPDF8fHQubGVuZ3RoPjQpKXtmb3IoY29uc3QgZSBvZiB0KWlmKFwibnVtYmVyXCIhPXR5cGVvZiBlKXJldHVybjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTp0PVt0WzBdLHRbMF0sdFswXSx0WzBdXTticmVhaztjYXNlIDI6dD1bdFswXSx0WzFdLHRbMF0sdFsxXV07YnJlYWs7Y2FzZSAzOnQ9W3RbMF0sdFsxXSx0WzJdLHRbMV1dO31yZXR1cm4gbmV3IEp0KHQpfX10b1N0cmluZygpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlcyl9fWNvbnN0IFd0PW5ldyBTZXQoW1wiY2VudGVyXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwidG9wXCIsXCJib3R0b21cIixcInRvcC1sZWZ0XCIsXCJ0b3AtcmlnaHRcIixcImJvdHRvbS1sZWZ0XCIsXCJib3R0b20tcmlnaHRcIl0pO2NsYXNzIFF0e2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWVzPXQuc2xpY2UoKTt9c3RhdGljIHBhcnNlKHQpe2lmKHQgaW5zdGFuY2VvZiBRdClyZXR1cm4gdDtpZihBcnJheS5pc0FycmF5KHQpJiYhKHQubGVuZ3RoPDEpJiZ0Lmxlbmd0aCUyPT0wKXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrPTIpe2NvbnN0IHI9dFtlXSxuPXRbZSsxXTtpZihcInN0cmluZ1wiIT10eXBlb2Ygcnx8IVd0LmhhcyhyKSlyZXR1cm47aWYoIUFycmF5LmlzQXJyYXkobil8fDIhPT1uLmxlbmd0aHx8XCJudW1iZXJcIiE9dHlwZW9mIG5bMF18fFwibnVtYmVyXCIhPXR5cGVvZiBuWzFdKXJldHVybn1yZXR1cm4gbmV3IFF0KHQpfX10b1N0cmluZygpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlcyl9fWNsYXNzIHRle2NvbnN0cnVjdG9yKHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5hdmFpbGFibGU9dC5hdmFpbGFibGU7fXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMubmFtZX1zdGF0aWMgZnJvbVN0cmluZyh0KXtyZXR1cm4gdD9uZXcgdGUoe25hbWU6dCxhdmFpbGFibGU6ITF9KTpudWxsfX1mdW5jdGlvbiBlZSh0LGUscixuKXtyZXR1cm4gXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTAmJnQ8PTI1NSYmXCJudW1iZXJcIj09dHlwZW9mIGUmJmU+PTAmJmU8PTI1NSYmXCJudW1iZXJcIj09dHlwZW9mIHImJnI+PTAmJnI8PTI1NT92b2lkIDA9PT1ufHxcIm51bWJlclwiPT10eXBlb2YgbiYmbj49MCYmbjw9MT9udWxsOmBJbnZhbGlkIHJnYmEgdmFsdWUgWyR7W3QsZSxyLG5dLmpvaW4oXCIsIFwiKX1dOiAnYScgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuYDpgSW52YWxpZCByZ2JhIHZhbHVlIFskeyhcIm51bWJlclwiPT10eXBlb2Ygbj9bdCxlLHIsbl06W3QsZSxyXSkuam9pbihcIiwgXCIpfV06ICdyJywgJ2cnLCBhbmQgJ2InIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUuYH1mdW5jdGlvbiByZSh0KXtpZihudWxsPT09dHx8XCJzdHJpbmdcIj09dHlwZW9mIHR8fFwiYm9vbGVhblwiPT10eXBlb2YgdHx8XCJudW1iZXJcIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBLdHx8dCBpbnN0YW5jZW9mIFh0fHx0IGluc3RhbmNlb2YgWXR8fHQgaW5zdGFuY2VvZiBKdHx8dCBpbnN0YW5jZW9mIFF0fHx0IGluc3RhbmNlb2YgdGUpcmV0dXJuICEwO2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcihjb25zdCBlIG9mIHQpaWYoIXJlKGUpKXJldHVybiAhMTtyZXR1cm4gITB9aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpe2Zvcihjb25zdCBlIGluIHQpaWYoIXJlKHRbZV0pKXJldHVybiAhMTtyZXR1cm4gITB9cmV0dXJuICExfWZ1bmN0aW9uIG5lKHQpe2lmKG51bGw9PT10KXJldHVybiBsdDtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gY3Q7aWYoXCJib29sZWFuXCI9PXR5cGVvZiB0KXJldHVybiBodDtpZihcIm51bWJlclwiPT10eXBlb2YgdClyZXR1cm4gdXQ7aWYodCBpbnN0YW5jZW9mIEt0KXJldHVybiBwdDtpZih0IGluc3RhbmNlb2YgWHQpcmV0dXJuIHl0O2lmKHQgaW5zdGFuY2VvZiBZdClyZXR1cm4gbXQ7aWYodCBpbnN0YW5jZW9mIEp0KXJldHVybiBndDtpZih0IGluc3RhbmNlb2YgUXQpcmV0dXJuIHZ0O2lmKHQgaW5zdGFuY2VvZiB0ZSlyZXR1cm4geHQ7aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3QgZT10Lmxlbmd0aDtsZXQgcjtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PW5lKGUpO2lmKHIpe2lmKHI9PT10KWNvbnRpbnVlO3I9ZHQ7YnJlYWt9cj10O31yZXR1cm4gYnQocnx8ZHQsZSl9cmV0dXJuIGZ0fWZ1bmN0aW9uIGllKHQpe2NvbnN0IGU9dHlwZW9mIHQ7cmV0dXJuIG51bGw9PT10P1wiXCI6XCJzdHJpbmdcIj09PWV8fFwibnVtYmVyXCI9PT1lfHxcImJvb2xlYW5cIj09PWU/U3RyaW5nKHQpOnQgaW5zdGFuY2VvZiBLdHx8dCBpbnN0YW5jZW9mIFl0fHx0IGluc3RhbmNlb2YgSnR8fHQgaW5zdGFuY2VvZiBRdHx8dCBpbnN0YW5jZW9mIHRlP3QudG9TdHJpbmcoKTpKU09OLnN0cmluZ2lmeSh0KX1jbGFzcyBzZXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudHlwZT10LHRoaXMudmFsdWU9ZTt9c3RhdGljIHBhcnNlKHQsZSl7aWYoMiE9PXQubGVuZ3RoKXJldHVybiBlLmVycm9yKGAnbGl0ZXJhbCcgZXhwcmVzc2lvbiByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtpZighcmUodFsxXSkpcmV0dXJuIGUuZXJyb3IoXCJpbnZhbGlkIHZhbHVlXCIpO2NvbnN0IHI9dFsxXTtsZXQgbj1uZShyKTtjb25zdCBpPWUuZXhwZWN0ZWRUeXBlO3JldHVybiBcImFycmF5XCIhPT1uLmtpbmR8fDAhPT1uLk58fCFpfHxcImFycmF5XCIhPT1pLmtpbmR8fFwibnVtYmVyXCI9PXR5cGVvZiBpLk4mJjAhPT1pLk58fChuPWkpLG5ldyBzZShuLHIpfWV2YWx1YXRlKCl7cmV0dXJuIHRoaXMudmFsdWV9ZWFjaENoaWxkKCl7fW91dHB1dERlZmluZWQoKXtyZXR1cm4gITB9fWNsYXNzIGFle2NvbnN0cnVjdG9yKHQpe3RoaXMubmFtZT1cIkV4cHJlc3Npb25FdmFsdWF0aW9uRXJyb3JcIix0aGlzLm1lc3NhZ2U9dDt9dG9KU09OKCl7cmV0dXJuIHRoaXMubWVzc2FnZX19Y29uc3Qgb2U9e3N0cmluZzpjdCxudW1iZXI6dXQsYm9vbGVhbjpodCxvYmplY3Q6ZnR9O2NsYXNzIGxle2NvbnN0cnVjdG9yKHQsZSl7dGhpcy50eXBlPXQsdGhpcy5hcmdzPWU7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKHQubGVuZ3RoPDIpcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO2xldCByLG49MTtjb25zdCBpPXRbMF07aWYoXCJhcnJheVwiPT09aSl7bGV0IGkscztpZih0Lmxlbmd0aD4yKXtjb25zdCByPXRbMV07aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHJ8fCEociBpbiBvZSl8fFwib2JqZWN0XCI9PT1yKXJldHVybiBlLmVycm9yKCdUaGUgaXRlbSB0eXBlIGFyZ3VtZW50IG9mIFwiYXJyYXlcIiBtdXN0IGJlIG9uZSBvZiBzdHJpbmcsIG51bWJlciwgYm9vbGVhbicsMSk7aT1vZVtyXSxuKys7fWVsc2UgaT1kdDtpZih0Lmxlbmd0aD4zKXtpZihudWxsIT09dFsyXSYmKFwibnVtYmVyXCIhPXR5cGVvZiB0WzJdfHx0WzJdPDB8fHRbMl0hPT1NYXRoLmZsb29yKHRbMl0pKSlyZXR1cm4gZS5lcnJvcignVGhlIGxlbmd0aCBhcmd1bWVudCB0byBcImFycmF5XCIgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgbGl0ZXJhbCcsMik7cz10WzJdLG4rKzt9cj1idChpLHMpO31lbHNlIHtpZighb2VbaV0pdGhyb3cgbmV3IEVycm9yKGBUeXBlcyBkb2Vzbid0IGNvbnRhaW4gbmFtZSA9ICR7aX1gKTtyPW9lW2ldO31jb25zdCBzPVtdO2Zvcig7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9ZS5wYXJzZSh0W25dLG4sZHQpO2lmKCFyKXJldHVybiBudWxsO3MucHVzaChyKTt9cmV0dXJuIG5ldyBsZShyLHMpfWV2YWx1YXRlKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5hcmdzLmxlbmd0aDtlKyspe2NvbnN0IHI9dGhpcy5hcmdzW2VdLmV2YWx1YXRlKHQpO2lmKCFBdCh0aGlzLnR5cGUsbmUocikpKXJldHVybiByO2lmKGU9PT10aGlzLmFyZ3MubGVuZ3RoLTEpdGhyb3cgbmV3IGFlKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlICR7d3QodGhpcy50eXBlKX0sIGJ1dCBmb3VuZCAke3d0KG5lKHIpKX0gaW5zdGVhZC5gKX10aHJvdyBuZXcgRXJyb3J9ZWFjaENoaWxkKHQpe3RoaXMuYXJncy5mb3JFYWNoKHQpO31vdXRwdXREZWZpbmVkKCl7cmV0dXJuIHRoaXMuYXJncy5ldmVyeSgodD0+dC5vdXRwdXREZWZpbmVkKCkpKX19Y29uc3QgdWU9e1widG8tYm9vbGVhblwiOmh0LFwidG8tY29sb3JcIjpwdCxcInRvLW51bWJlclwiOnV0LFwidG8tc3RyaW5nXCI6Y3R9O2NsYXNzIGNle2NvbnN0cnVjdG9yKHQsZSl7dGhpcy50eXBlPXQsdGhpcy5hcmdzPWU7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKHQubGVuZ3RoPDIpcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO2NvbnN0IHI9dFswXTtpZighdWVbcl0pdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSAke3J9IGFzIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBrbm93biB0eXBlc2ApO2lmKChcInRvLWJvb2xlYW5cIj09PXJ8fFwidG8tc3RyaW5nXCI9PT1yKSYmMiE9PXQubGVuZ3RoKXJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgb25lIGFyZ3VtZW50LlwiKTtjb25zdCBuPXVlW3JdLGk9W107Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IG49ZS5wYXJzZSh0W3JdLHIsZHQpO2lmKCFuKXJldHVybiBudWxsO2kucHVzaChuKTt9cmV0dXJuIG5ldyBjZShuLGkpfWV2YWx1YXRlKHQpe3N3aXRjaCh0aGlzLnR5cGUua2luZCl7Y2FzZVwiYm9vbGVhblwiOnJldHVybiBCb29sZWFuKHRoaXMuYXJnc1swXS5ldmFsdWF0ZSh0KSk7Y2FzZVwiY29sb3JcIjp7bGV0IGUscjtmb3IoY29uc3QgbiBvZiB0aGlzLmFyZ3Mpe2lmKGU9bi5ldmFsdWF0ZSh0KSxyPW51bGwsZSBpbnN0YW5jZW9mIEt0KXJldHVybiBlO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKXtjb25zdCByPXQucGFyc2VDb2xvcihlKTtpZihyKXJldHVybiByfWVsc2UgaWYoQXJyYXkuaXNBcnJheShlKSYmKHI9ZS5sZW5ndGg8M3x8ZS5sZW5ndGg+ND9gSW52YWxpZCByYmdhIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoZSl9OiBleHBlY3RlZCBhbiBhcnJheSBjb250YWluaW5nIGVpdGhlciB0aHJlZSBvciBmb3VyIG51bWVyaWMgdmFsdWVzLmA6ZWUoZVswXSxlWzFdLGVbMl0sZVszXSksIXIpKXJldHVybiBuZXcgS3QoZVswXS8yNTUsZVsxXS8yNTUsZVsyXS8yNTUsZVszXSl9dGhyb3cgbmV3IGFlKHJ8fGBDb3VsZCBub3QgcGFyc2UgY29sb3IgZnJvbSB2YWx1ZSAnJHtcInN0cmluZ1wiPT10eXBlb2YgZT9lOkpTT04uc3RyaW5naWZ5KGUpfSdgKX1jYXNlXCJwYWRkaW5nXCI6e2xldCBlO2Zvcihjb25zdCByIG9mIHRoaXMuYXJncyl7ZT1yLmV2YWx1YXRlKHQpO2NvbnN0IG49SnQucGFyc2UoZSk7aWYobilyZXR1cm4gbn10aHJvdyBuZXcgYWUoYENvdWxkIG5vdCBwYXJzZSBwYWRkaW5nIGZyb20gdmFsdWUgJyR7XCJzdHJpbmdcIj09dHlwZW9mIGU/ZTpKU09OLnN0cmluZ2lmeShlKX0nYCl9Y2FzZVwidmFyaWFibGVBbmNob3JPZmZzZXRDb2xsZWN0aW9uXCI6e2xldCBlO2Zvcihjb25zdCByIG9mIHRoaXMuYXJncyl7ZT1yLmV2YWx1YXRlKHQpO2NvbnN0IG49UXQucGFyc2UoZSk7aWYobilyZXR1cm4gbn10aHJvdyBuZXcgYWUoYENvdWxkIG5vdCBwYXJzZSB2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb24gZnJvbSB2YWx1ZSAnJHtcInN0cmluZ1wiPT10eXBlb2YgZT9lOkpTT04uc3RyaW5naWZ5KGUpfSdgKX1jYXNlXCJudW1iZXJcIjp7bGV0IGU9bnVsbDtmb3IoY29uc3QgciBvZiB0aGlzLmFyZ3Mpe2lmKGU9ci5ldmFsdWF0ZSh0KSxudWxsPT09ZSlyZXR1cm4gMDtjb25zdCBuPU51bWJlcihlKTtpZighaXNOYU4obikpcmV0dXJuIG59dGhyb3cgbmV3IGFlKGBDb3VsZCBub3QgY29udmVydCAke0pTT04uc3RyaW5naWZ5KGUpfSB0byBudW1iZXIuYCl9Y2FzZVwiZm9ybWF0dGVkXCI6cmV0dXJuIFl0LmZyb21TdHJpbmcoaWUodGhpcy5hcmdzWzBdLmV2YWx1YXRlKHQpKSk7Y2FzZVwicmVzb2x2ZWRJbWFnZVwiOnJldHVybiB0ZS5mcm9tU3RyaW5nKGllKHRoaXMuYXJnc1swXS5ldmFsdWF0ZSh0KSkpO2RlZmF1bHQ6cmV0dXJuIGllKHRoaXMuYXJnc1swXS5ldmFsdWF0ZSh0KSl9fWVhY2hDaGlsZCh0KXt0aGlzLmFyZ3MuZm9yRWFjaCh0KTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiB0aGlzLmFyZ3MuZXZlcnkoKHQ9PnQub3V0cHV0RGVmaW5lZCgpKSl9fWNvbnN0IGhlPVtcIlVua25vd25cIixcIlBvaW50XCIsXCJMaW5lU3RyaW5nXCIsXCJQb2x5Z29uXCJdO2NsYXNzIHBle2NvbnN0cnVjdG9yKCl7dGhpcy5nbG9iYWxzPW51bGwsdGhpcy5mZWF0dXJlPW51bGwsdGhpcy5mZWF0dXJlU3RhdGU9bnVsbCx0aGlzLmZvcm1hdHRlZFNlY3Rpb249bnVsbCx0aGlzLl9wYXJzZUNvbG9yQ2FjaGU9e30sdGhpcy5hdmFpbGFibGVJbWFnZXM9bnVsbCx0aGlzLmNhbm9uaWNhbD1udWxsO31pZCgpe3JldHVybiB0aGlzLmZlYXR1cmUmJlwiaWRcImluIHRoaXMuZmVhdHVyZT90aGlzLmZlYXR1cmUuaWQ6bnVsbH1nZW9tZXRyeVR5cGUoKXtyZXR1cm4gdGhpcy5mZWF0dXJlP1wibnVtYmVyXCI9PXR5cGVvZiB0aGlzLmZlYXR1cmUudHlwZT9oZVt0aGlzLmZlYXR1cmUudHlwZV06dGhpcy5mZWF0dXJlLnR5cGU6bnVsbH1nZW9tZXRyeSgpe3JldHVybiB0aGlzLmZlYXR1cmUmJlwiZ2VvbWV0cnlcImluIHRoaXMuZmVhdHVyZT90aGlzLmZlYXR1cmUuZ2VvbWV0cnk6bnVsbH1jYW5vbmljYWxJRCgpe3JldHVybiB0aGlzLmNhbm9uaWNhbH1wcm9wZXJ0aWVzKCl7cmV0dXJuIHRoaXMuZmVhdHVyZSYmdGhpcy5mZWF0dXJlLnByb3BlcnRpZXN8fHt9fXBhcnNlQ29sb3IodCl7bGV0IGU9dGhpcy5fcGFyc2VDb2xvckNhY2hlW3RdO3JldHVybiBlfHwoZT10aGlzLl9wYXJzZUNvbG9yQ2FjaGVbdF09S3QucGFyc2UodCkpLGV9fWNsYXNzIGZle2NvbnN0cnVjdG9yKHQsZSxyPVtdLG4saT1uZXcgb3Qscz1bXSl7dGhpcy5yZWdpc3RyeT10LHRoaXMucGF0aD1yLHRoaXMua2V5PXIubWFwKCh0PT5gWyR7dH1dYCkpLmpvaW4oXCJcIiksdGhpcy5zY29wZT1pLHRoaXMuZXJyb3JzPXMsdGhpcy5leHBlY3RlZFR5cGU9bix0aGlzLl9pc0NvbnN0YW50PWU7fXBhcnNlKHQsZSxyLG4saT17fSl7cmV0dXJuIGU/dGhpcy5jb25jYXQoZSxyLG4pLl9wYXJzZSh0LGkpOnRoaXMuX3BhcnNlKHQsaSl9X3BhcnNlKHQsZSl7ZnVuY3Rpb24gcih0LGUscil7cmV0dXJuIFwiYXNzZXJ0XCI9PT1yP25ldyBsZShlLFt0XSk6XCJjb2VyY2VcIj09PXI/bmV3IGNlKGUsW3RdKTp0fWlmKG51bGwhPT10JiZcInN0cmluZ1wiIT10eXBlb2YgdCYmXCJib29sZWFuXCIhPXR5cGVvZiB0JiZcIm51bWJlclwiIT10eXBlb2YgdHx8KHQ9W1wibGl0ZXJhbFwiLHRdKSxBcnJheS5pc0FycmF5KHQpKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHRoaXMuZXJyb3IoJ0V4cGVjdGVkIGFuIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbXV0uJyk7Y29uc3Qgbj10WzBdO2lmKFwic3RyaW5nXCIhPXR5cGVvZiBuKXJldHVybiB0aGlzLmVycm9yKGBFeHByZXNzaW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgYnV0IGZvdW5kICR7dHlwZW9mIG59IGluc3RlYWQuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwwKSxudWxsO2NvbnN0IGk9dGhpcy5yZWdpc3RyeVtuXTtpZihpKXtsZXQgbj1pLnBhcnNlKHQsdGhpcyk7aWYoIW4pcmV0dXJuIG51bGw7aWYodGhpcy5leHBlY3RlZFR5cGUpe2NvbnN0IHQ9dGhpcy5leHBlY3RlZFR5cGUsaT1uLnR5cGU7aWYoXCJzdHJpbmdcIiE9PXQua2luZCYmXCJudW1iZXJcIiE9PXQua2luZCYmXCJib29sZWFuXCIhPT10LmtpbmQmJlwib2JqZWN0XCIhPT10LmtpbmQmJlwiYXJyYXlcIiE9PXQua2luZHx8XCJ2YWx1ZVwiIT09aS5raW5kKWlmKFwiY29sb3JcIiE9PXQua2luZCYmXCJmb3JtYXR0ZWRcIiE9PXQua2luZCYmXCJyZXNvbHZlZEltYWdlXCIhPT10LmtpbmR8fFwidmFsdWVcIiE9PWkua2luZCYmXCJzdHJpbmdcIiE9PWkua2luZClpZihcInBhZGRpbmdcIiE9PXQua2luZHx8XCJ2YWx1ZVwiIT09aS5raW5kJiZcIm51bWJlclwiIT09aS5raW5kJiZcImFycmF5XCIhPT1pLmtpbmQpaWYoXCJ2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb25cIiE9PXQua2luZHx8XCJ2YWx1ZVwiIT09aS5raW5kJiZcImFycmF5XCIhPT1pLmtpbmQpe2lmKHRoaXMuY2hlY2tTdWJ0eXBlKHQsaSkpcmV0dXJuIG51bGx9ZWxzZSBuPXIobix0LGUudHlwZUFubm90YXRpb258fFwiY29lcmNlXCIpO2Vsc2Ugbj1yKG4sdCxlLnR5cGVBbm5vdGF0aW9ufHxcImNvZXJjZVwiKTtlbHNlIG49cihuLHQsZS50eXBlQW5ub3RhdGlvbnx8XCJjb2VyY2VcIik7ZWxzZSBuPXIobix0LGUudHlwZUFubm90YXRpb258fFwiYXNzZXJ0XCIpO31pZighKG4gaW5zdGFuY2VvZiBzZSkmJlwicmVzb2x2ZWRJbWFnZVwiIT09bi50eXBlLmtpbmQmJnRoaXMuX2lzQ29uc3RhbnQobikpe2NvbnN0IHQ9bmV3IHBlO3RyeXtuPW5ldyBzZShuLnR5cGUsbi5ldmFsdWF0ZSh0KSk7fWNhdGNoKHQpe3JldHVybiB0aGlzLmVycm9yKHQubWVzc2FnZSksbnVsbH19cmV0dXJuIG59cmV0dXJuIHRoaXMuZXJyb3IoYFVua25vd24gZXhwcmVzc2lvbiBcIiR7bn1cIi4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFsuLi5dXS5gLDApfXJldHVybiB0aGlzLmVycm9yKHZvaWQgMD09PXQ/XCIndW5kZWZpbmVkJyB2YWx1ZSBpbnZhbGlkLiBVc2UgbnVsbCBpbnN0ZWFkLlwiOlwib2JqZWN0XCI9PXR5cGVvZiB0PydCYXJlIG9iamVjdHMgaW52YWxpZC4gVXNlIFtcImxpdGVyYWxcIiwgey4uLn1dIGluc3RlYWQuJzpgRXhwZWN0ZWQgYW4gYXJyYXksIGJ1dCBmb3VuZCAke3R5cGVvZiB0fSBpbnN0ZWFkLmApfWNvbmNhdCh0LGUscil7Y29uc3Qgbj1cIm51bWJlclwiPT10eXBlb2YgdD90aGlzLnBhdGguY29uY2F0KHQpOnRoaXMucGF0aCxpPXI/dGhpcy5zY29wZS5jb25jYXQocik6dGhpcy5zY29wZTtyZXR1cm4gbmV3IGZlKHRoaXMucmVnaXN0cnksdGhpcy5faXNDb25zdGFudCxuLGV8fG51bGwsaSx0aGlzLmVycm9ycyl9ZXJyb3IodCwuLi5lKXtjb25zdCByPWAke3RoaXMua2V5fSR7ZS5tYXAoKHQ9PmBbJHt0fV1gKSkuam9pbihcIlwiKX1gO3RoaXMuZXJyb3JzLnB1c2gobmV3IGF0KHIsdCkpO31jaGVja1N1YnR5cGUodCxlKXtjb25zdCByPUF0KHQsZSk7cmV0dXJuIHImJnRoaXMuZXJyb3Iocikscn19Y2xhc3MgZGV7Y29uc3RydWN0b3IodCxlKXt0aGlzLnR5cGU9ZS50eXBlLHRoaXMuYmluZGluZ3M9W10uY29uY2F0KHQpLHRoaXMucmVzdWx0PWU7fWV2YWx1YXRlKHQpe3JldHVybiB0aGlzLnJlc3VsdC5ldmFsdWF0ZSh0KX1lYWNoQ2hpbGQodCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5iaW5kaW5ncyl0KGVbMV0pO3QodGhpcy5yZXN1bHQpO31zdGF0aWMgcGFyc2UodCxlKXtpZih0Lmxlbmd0aDw0KXJldHVybiBlLmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtjb25zdCByPVtdO2ZvcihsZXQgbj0xO248dC5sZW5ndGgtMTtuKz0yKXtjb25zdCBpPXRbbl07aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGkpcmV0dXJuIGUuZXJyb3IoYEV4cGVjdGVkIHN0cmluZywgYnV0IGZvdW5kICR7dHlwZW9mIGl9IGluc3RlYWQuYCxuKTtpZigvW15hLXpBLVowLTlfXS8udGVzdChpKSlyZXR1cm4gZS5lcnJvcihcIlZhcmlhYmxlIG5hbWVzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yICdfJy5cIixuKTtjb25zdCBzPWUucGFyc2UodFtuKzFdLG4rMSk7aWYoIXMpcmV0dXJuIG51bGw7ci5wdXNoKFtpLHNdKTt9Y29uc3Qgbj1lLnBhcnNlKHRbdC5sZW5ndGgtMV0sdC5sZW5ndGgtMSxlLmV4cGVjdGVkVHlwZSxyKTtyZXR1cm4gbj9uZXcgZGUocixuKTpudWxsfW91dHB1dERlZmluZWQoKXtyZXR1cm4gdGhpcy5yZXN1bHQub3V0cHV0RGVmaW5lZCgpfX1jbGFzcyB5ZXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudHlwZT1lLnR5cGUsdGhpcy5uYW1lPXQsdGhpcy5ib3VuZEV4cHJlc3Npb249ZTt9c3RhdGljIHBhcnNlKHQsZSl7aWYoMiE9PXQubGVuZ3RofHxcInN0cmluZ1wiIT10eXBlb2YgdFsxXSlyZXR1cm4gZS5lcnJvcihcIid2YXInIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgc3RyaW5nIGxpdGVyYWwgYXJndW1lbnQuXCIpO2NvbnN0IHI9dFsxXTtyZXR1cm4gZS5zY29wZS5oYXMocik/bmV3IHllKHIsZS5zY29wZS5nZXQocikpOmUuZXJyb3IoYFVua25vd24gdmFyaWFibGUgXCIke3J9XCIuIE1ha2Ugc3VyZSBcIiR7cn1cIiBoYXMgYmVlbiBib3VuZCBpbiBhbiBlbmNsb3NpbmcgXCJsZXRcIiBleHByZXNzaW9uIGJlZm9yZSB1c2luZyBpdC5gLDEpfWV2YWx1YXRlKHQpe3JldHVybiB0aGlzLmJvdW5kRXhwcmVzc2lvbi5ldmFsdWF0ZSh0KX1lYWNoQ2hpbGQoKXt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMX19Y2xhc3MgbWV7Y29uc3RydWN0b3IodCxlLHIpe3RoaXMudHlwZT10LHRoaXMuaW5kZXg9ZSx0aGlzLmlucHV0PXI7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKDMhPT10Lmxlbmd0aClyZXR1cm4gZS5lcnJvcihgRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7Y29uc3Qgcj1lLnBhcnNlKHRbMV0sMSx1dCksbj1lLnBhcnNlKHRbMl0sMixidChlLmV4cGVjdGVkVHlwZXx8ZHQpKTtyZXR1cm4gciYmbj9uZXcgbWUobi50eXBlLml0ZW1UeXBlLHIsbik6bnVsbH1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMuaW5kZXguZXZhbHVhdGUodCkscj10aGlzLmlucHV0LmV2YWx1YXRlKHQpO2lmKGU8MCl0aHJvdyBuZXcgYWUoYEFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6ICR7ZX0gPCAwLmApO2lmKGU+PXIubGVuZ3RoKXRocm93IG5ldyBhZShgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHtlfSA+ICR7ci5sZW5ndGgtMX0uYCk7aWYoZSE9PU1hdGguZmxvb3IoZSkpdGhyb3cgbmV3IGFlKGBBcnJheSBpbmRleCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBmb3VuZCAke2V9IGluc3RlYWQuYCk7cmV0dXJuIHJbZV19ZWFjaENoaWxkKHQpe3QodGhpcy5pbmRleCksdCh0aGlzLmlucHV0KTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMX19Y2xhc3MgZ2V7Y29uc3RydWN0b3IodCxlKXt0aGlzLnR5cGU9aHQsdGhpcy5uZWVkbGU9dCx0aGlzLmhheXN0YWNrPWU7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKDMhPT10Lmxlbmd0aClyZXR1cm4gZS5lcnJvcihgRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7Y29uc3Qgcj1lLnBhcnNlKHRbMV0sMSxkdCksbj1lLnBhcnNlKHRbMl0sMixkdCk7cmV0dXJuIHImJm4/U3Qoci50eXBlLFtodCxjdCx1dCxsdCxkdF0pP25ldyBnZShyLG4pOmUuZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7d3Qoci50eXBlKX0gaW5zdGVhZGApOm51bGx9ZXZhbHVhdGUodCl7Y29uc3QgZT10aGlzLm5lZWRsZS5ldmFsdWF0ZSh0KSxyPXRoaXMuaGF5c3RhY2suZXZhbHVhdGUodCk7aWYoIXIpcmV0dXJuICExO2lmKCFrdChlLFtcImJvb2xlYW5cIixcInN0cmluZ1wiLFwibnVtYmVyXCIsXCJudWxsXCJdKSl0aHJvdyBuZXcgYWUoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7d3QobmUoZSkpfSBpbnN0ZWFkLmApO2lmKCFrdChyLFtcInN0cmluZ1wiLFwiYXJyYXlcIl0pKXRocm93IG5ldyBhZShgRXhwZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt3dChuZShyKSl9IGluc3RlYWQuYCk7cmV0dXJuIHIuaW5kZXhPZihlKT49MH1lYWNoQ2hpbGQodCl7dCh0aGlzLm5lZWRsZSksdCh0aGlzLmhheXN0YWNrKTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMH19Y2xhc3MgeGV7Y29uc3RydWN0b3IodCxlLHIpe3RoaXMudHlwZT11dCx0aGlzLm5lZWRsZT10LHRoaXMuaGF5c3RhY2s9ZSx0aGlzLmZyb21JbmRleD1yO31zdGF0aWMgcGFyc2UodCxlKXtpZih0Lmxlbmd0aDw9Mnx8dC5sZW5ndGg+PTUpcmV0dXJuIGUuZXJyb3IoYEV4cGVjdGVkIDMgb3IgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7Y29uc3Qgcj1lLnBhcnNlKHRbMV0sMSxkdCksbj1lLnBhcnNlKHRbMl0sMixkdCk7aWYoIXJ8fCFuKXJldHVybiBudWxsO2lmKCFTdChyLnR5cGUsW2h0LGN0LHV0LGx0LGR0XSkpcmV0dXJuIGUuZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7d3Qoci50eXBlKX0gaW5zdGVhZGApO2lmKDQ9PT10Lmxlbmd0aCl7Y29uc3QgaT1lLnBhcnNlKHRbM10sMyx1dCk7cmV0dXJuIGk/bmV3IHhlKHIsbixpKTpudWxsfXJldHVybiBuZXcgeGUocixuKX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMubmVlZGxlLmV2YWx1YXRlKHQpLHI9dGhpcy5oYXlzdGFjay5ldmFsdWF0ZSh0KTtpZigha3QoZSxbXCJib29sZWFuXCIsXCJzdHJpbmdcIixcIm51bWJlclwiLFwibnVsbFwiXSkpdGhyb3cgbmV3IGFlKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCAke3d0KG5lKGUpKX0gaW5zdGVhZC5gKTtsZXQgbjtpZih0aGlzLmZyb21JbmRleCYmKG49dGhpcy5mcm9tSW5kZXguZXZhbHVhdGUodCkpLGt0KHIsW1wic3RyaW5nXCJdKSl7Y29uc3QgdD1yLmluZGV4T2YoZSxuKTtyZXR1cm4gLTE9PT10Py0xOlsuLi5yLnNsaWNlKDAsdCldLmxlbmd0aH1pZihrdChyLFtcImFycmF5XCJdKSlyZXR1cm4gci5pbmRleE9mKGUsbik7dGhyb3cgbmV3IGFlKGBFeHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3d0KG5lKHIpKX0gaW5zdGVhZC5gKX1lYWNoQ2hpbGQodCl7dCh0aGlzLm5lZWRsZSksdCh0aGlzLmhheXN0YWNrKSx0aGlzLmZyb21JbmRleCYmdCh0aGlzLmZyb21JbmRleCk7fW91dHB1dERlZmluZWQoKXtyZXR1cm4gITF9fWNsYXNzIHZle2NvbnN0cnVjdG9yKHQsZSxyLG4saSxzKXt0aGlzLmlucHV0VHlwZT10LHRoaXMudHlwZT1lLHRoaXMuaW5wdXQ9cix0aGlzLmNhc2VzPW4sdGhpcy5vdXRwdXRzPWksdGhpcy5vdGhlcndpc2U9czt9c3RhdGljIHBhcnNlKHQsZSl7aWYodC5sZW5ndGg8NSlyZXR1cm4gZS5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7dC5sZW5ndGgtMX0uYCk7aWYodC5sZW5ndGglMiE9MSlyZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5cIik7bGV0IHIsbjtlLmV4cGVjdGVkVHlwZSYmXCJ2YWx1ZVwiIT09ZS5leHBlY3RlZFR5cGUua2luZCYmKG49ZS5leHBlY3RlZFR5cGUpO2NvbnN0IGk9e30scz1bXTtmb3IobGV0IGE9MjthPHQubGVuZ3RoLTE7YSs9Mil7bGV0IG89dFthXTtjb25zdCBsPXRbYSsxXTtBcnJheS5pc0FycmF5KG8pfHwobz1bb10pO2NvbnN0IHU9ZS5jb25jYXQoYSk7aWYoMD09PW8ubGVuZ3RoKXJldHVybiB1LmVycm9yKFwiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGJyYW5jaCBsYWJlbC5cIik7Zm9yKGNvbnN0IHQgb2Ygbyl7aWYoXCJudW1iZXJcIiE9dHlwZW9mIHQmJlwic3RyaW5nXCIhPXR5cGVvZiB0KXJldHVybiB1LmVycm9yKFwiQnJhbmNoIGxhYmVscyBtdXN0IGJlIG51bWJlcnMgb3Igc3RyaW5ncy5cIik7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQmJk1hdGguYWJzKHQpPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXJldHVybiB1LmVycm9yKGBCcmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlcnMgbm8gbGFyZ2VyIHRoYW4gJHtOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn0uYCk7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQmJk1hdGguZmxvb3IodCkhPT10KXJldHVybiB1LmVycm9yKFwiTnVtZXJpYyBicmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlciB2YWx1ZXMuXCIpO2lmKHIpe2lmKHUuY2hlY2tTdWJ0eXBlKHIsbmUodCkpKXJldHVybiBudWxsfWVsc2Ugcj1uZSh0KTtpZih2b2lkIDAhPT1pW1N0cmluZyh0KV0pcmV0dXJuIHUuZXJyb3IoXCJCcmFuY2ggbGFiZWxzIG11c3QgYmUgdW5pcXVlLlwiKTtpW1N0cmluZyh0KV09cy5sZW5ndGg7fWNvbnN0IGM9ZS5wYXJzZShsLGEsbik7aWYoIWMpcmV0dXJuIG51bGw7bj1ufHxjLnR5cGUscy5wdXNoKGMpO31jb25zdCBhPWUucGFyc2UodFsxXSwxLGR0KTtpZighYSlyZXR1cm4gbnVsbDtjb25zdCBvPWUucGFyc2UodFt0Lmxlbmd0aC0xXSx0Lmxlbmd0aC0xLG4pO3JldHVybiBvP1widmFsdWVcIiE9PWEudHlwZS5raW5kJiZlLmNvbmNhdCgxKS5jaGVja1N1YnR5cGUocixhLnR5cGUpP251bGw6bmV3IHZlKHIsbixhLGkscyxvKTpudWxsfWV2YWx1YXRlKHQpe2NvbnN0IGU9dGhpcy5pbnB1dC5ldmFsdWF0ZSh0KTtyZXR1cm4gKG5lKGUpPT09dGhpcy5pbnB1dFR5cGUmJnRoaXMub3V0cHV0c1t0aGlzLmNhc2VzW2VdXXx8dGhpcy5vdGhlcndpc2UpLmV2YWx1YXRlKHQpfWVhY2hDaGlsZCh0KXt0KHRoaXMuaW5wdXQpLHRoaXMub3V0cHV0cy5mb3JFYWNoKHQpLHQodGhpcy5vdGhlcndpc2UpO31vdXRwdXREZWZpbmVkKCl7cmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeSgodD0+dC5vdXRwdXREZWZpbmVkKCkpKSYmdGhpcy5vdGhlcndpc2Uub3V0cHV0RGVmaW5lZCgpfX1jbGFzcyBiZXtjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy50eXBlPXQsdGhpcy5icmFuY2hlcz1lLHRoaXMub3RoZXJ3aXNlPXI7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKHQubGVuZ3RoPDQpcmV0dXJuIGUuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDMgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke3QubGVuZ3RoLTF9LmApO2lmKHQubGVuZ3RoJTIhPTApcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhbiBvZGQgbnVtYmVyIG9mIGFyZ3VtZW50cy5cIik7bGV0IHI7ZS5leHBlY3RlZFR5cGUmJlwidmFsdWVcIiE9PWUuZXhwZWN0ZWRUeXBlLmtpbmQmJihyPWUuZXhwZWN0ZWRUeXBlKTtjb25zdCBuPVtdO2ZvcihsZXQgaT0xO2k8dC5sZW5ndGgtMTtpKz0yKXtjb25zdCBzPWUucGFyc2UodFtpXSxpLGh0KTtpZighcylyZXR1cm4gbnVsbDtjb25zdCBhPWUucGFyc2UodFtpKzFdLGkrMSxyKTtpZighYSlyZXR1cm4gbnVsbDtuLnB1c2goW3MsYV0pLHI9cnx8YS50eXBlO31jb25zdCBpPWUucGFyc2UodFt0Lmxlbmd0aC0xXSx0Lmxlbmd0aC0xLHIpO2lmKCFpKXJldHVybiBudWxsO2lmKCFyKXRocm93IG5ldyBFcnJvcihcIkNhbid0IGluZmVyIG91dHB1dCB0eXBlXCIpO3JldHVybiBuZXcgYmUocixuLGkpfWV2YWx1YXRlKHQpe2Zvcihjb25zdFtlLHJdb2YgdGhpcy5icmFuY2hlcylpZihlLmV2YWx1YXRlKHQpKXJldHVybiByLmV2YWx1YXRlKHQpO3JldHVybiB0aGlzLm90aGVyd2lzZS5ldmFsdWF0ZSh0KX1lYWNoQ2hpbGQodCl7Zm9yKGNvbnN0W2Uscl1vZiB0aGlzLmJyYW5jaGVzKXQoZSksdChyKTt0KHRoaXMub3RoZXJ3aXNlKTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiB0aGlzLmJyYW5jaGVzLmV2ZXJ5KCgoW3QsZV0pPT5lLm91dHB1dERlZmluZWQoKSkpJiZ0aGlzLm90aGVyd2lzZS5vdXRwdXREZWZpbmVkKCl9fWNsYXNzIHdle2NvbnN0cnVjdG9yKHQsZSxyLG4pe3RoaXMudHlwZT10LHRoaXMuaW5wdXQ9ZSx0aGlzLmJlZ2luSW5kZXg9cix0aGlzLmVuZEluZGV4PW47fXN0YXRpYyBwYXJzZSh0LGUpe2lmKHQubGVuZ3RoPD0yfHx0Lmxlbmd0aD49NSlyZXR1cm4gZS5lcnJvcihgRXhwZWN0ZWQgMyBvciA0IGFyZ3VtZW50cywgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtjb25zdCByPWUucGFyc2UodFsxXSwxLGR0KSxuPWUucGFyc2UodFsyXSwyLHV0KTtpZighcnx8IW4pcmV0dXJuIG51bGw7aWYoIVN0KHIudHlwZSxbYnQoZHQpLGN0LGR0XSkpcmV0dXJuIGUuZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt3dChyLnR5cGUpfSBpbnN0ZWFkYCk7aWYoND09PXQubGVuZ3RoKXtjb25zdCBpPWUucGFyc2UodFszXSwzLHV0KTtyZXR1cm4gaT9uZXcgd2Uoci50eXBlLHIsbixpKTpudWxsfXJldHVybiBuZXcgd2Uoci50eXBlLHIsbil9ZXZhbHVhdGUodCl7Y29uc3QgZT10aGlzLmlucHV0LmV2YWx1YXRlKHQpLHI9dGhpcy5iZWdpbkluZGV4LmV2YWx1YXRlKHQpO2xldCBuO2lmKHRoaXMuZW5kSW5kZXgmJihuPXRoaXMuZW5kSW5kZXguZXZhbHVhdGUodCkpLGt0KGUsW1wic3RyaW5nXCJdKSlyZXR1cm4gWy4uLmVdLnNsaWNlKHIsbikuam9pbihcIlwiKTtpZihrdChlLFtcImFycmF5XCJdKSlyZXR1cm4gZS5zbGljZShyLG4pO3Rocm93IG5ldyBhZShgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3d0KG5lKGUpKX0gaW5zdGVhZC5gKX1lYWNoQ2hpbGQodCl7dCh0aGlzLmlucHV0KSx0KHRoaXMuYmVnaW5JbmRleCksdGhpcy5lbmRJbmRleCYmdCh0aGlzLmVuZEluZGV4KTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMX19ZnVuY3Rpb24gX2UodCxlKXtjb25zdCByPXQubGVuZ3RoLTE7bGV0IG4saSxzPTAsYT1yLG89MDtmb3IoO3M8PWE7KWlmKG89TWF0aC5mbG9vcigocythKS8yKSxuPXRbb10saT10W28rMV0sbjw9ZSl7aWYobz09PXJ8fGU8aSlyZXR1cm4gbztzPW8rMTt9ZWxzZSB7aWYoIShuPmUpKXRocm93IG5ldyBhZShcIklucHV0IGlzIG5vdCBhIG51bWJlci5cIik7YT1vLTE7fXJldHVybiAwfWNsYXNzIEFle2NvbnN0cnVjdG9yKHQsZSxyKXt0aGlzLnR5cGU9dCx0aGlzLmlucHV0PWUsdGhpcy5sYWJlbHM9W10sdGhpcy5vdXRwdXRzPVtdO2Zvcihjb25zdFt0LGVdb2Ygcil0aGlzLmxhYmVscy5wdXNoKHQpLHRoaXMub3V0cHV0cy5wdXNoKGUpO31zdGF0aWMgcGFyc2UodCxlKXtpZih0Lmxlbmd0aC0xPDQpcmV0dXJuIGUuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke3QubGVuZ3RoLTF9LmApO2lmKCh0Lmxlbmd0aC0xKSUyIT0wKXJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLlwiKTtjb25zdCByPWUucGFyc2UodFsxXSwxLHV0KTtpZighcilyZXR1cm4gbnVsbDtjb25zdCBuPVtdO2xldCBpPW51bGw7ZS5leHBlY3RlZFR5cGUmJlwidmFsdWVcIiE9PWUuZXhwZWN0ZWRUeXBlLmtpbmQmJihpPWUuZXhwZWN0ZWRUeXBlKTtmb3IobGV0IHI9MTtyPHQubGVuZ3RoO3IrPTIpe2NvbnN0IHM9MT09PXI/LTEvMDp0W3JdLGE9dFtyKzFdLG89cixsPXIrMTtpZihcIm51bWJlclwiIT10eXBlb2YgcylyZXR1cm4gZS5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGRlZmluZWQgdXNpbmcgbGl0ZXJhbCBudW1lcmljIHZhbHVlcyAobm90IGNvbXB1dGVkIGV4cHJlc3Npb25zKSBmb3IgdGhlIGlucHV0IHZhbHVlcy4nLG8pO2lmKG4ubGVuZ3RoJiZuW24ubGVuZ3RoLTFdWzBdPj1zKXJldHVybiBlLmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwic3RlcFwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsbyk7Y29uc3QgdT1lLnBhcnNlKGEsbCxpKTtpZighdSlyZXR1cm4gbnVsbDtpPWl8fHUudHlwZSxuLnB1c2goW3MsdV0pO31yZXR1cm4gbmV3IEFlKGkscixuKX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMubGFiZWxzLHI9dGhpcy5vdXRwdXRzO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gclswXS5ldmFsdWF0ZSh0KTtjb25zdCBuPXRoaXMuaW5wdXQuZXZhbHVhdGUodCk7aWYobjw9ZVswXSlyZXR1cm4gclswXS5ldmFsdWF0ZSh0KTtjb25zdCBpPWUubGVuZ3RoO3JldHVybiBuPj1lW2ktMV0/cltpLTFdLmV2YWx1YXRlKHQpOnJbX2UoZSxuKV0uZXZhbHVhdGUodCl9ZWFjaENoaWxkKHQpe3QodGhpcy5pbnB1dCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5vdXRwdXRzKXQoZSk7fW91dHB1dERlZmluZWQoKXtyZXR1cm4gdGhpcy5vdXRwdXRzLmV2ZXJ5KCh0PT50Lm91dHB1dERlZmluZWQoKSkpfX1mdW5jdGlvbiBTZSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxcImRlZmF1bHRcIik/dC5kZWZhdWx0OnR9dmFyIGtlPU1lO2Z1bmN0aW9uIE1lKHQsZSxyLG4pe3RoaXMuY3g9Myp0LHRoaXMuYng9Myooci10KS10aGlzLmN4LHRoaXMuYXg9MS10aGlzLmN4LXRoaXMuYngsdGhpcy5jeT0zKmUsdGhpcy5ieT0zKihuLWUpLXRoaXMuY3ksdGhpcy5heT0xLXRoaXMuY3ktdGhpcy5ieSx0aGlzLnAxeD10LHRoaXMucDF5PWUsdGhpcy5wMng9cix0aGlzLnAyeT1uO31NZS5wcm90b3R5cGU9e3NhbXBsZUN1cnZlWDpmdW5jdGlvbih0KXtyZXR1cm4gKCh0aGlzLmF4KnQrdGhpcy5ieCkqdCt0aGlzLmN4KSp0fSxzYW1wbGVDdXJ2ZVk6ZnVuY3Rpb24odCl7cmV0dXJuICgodGhpcy5heSp0K3RoaXMuYnkpKnQrdGhpcy5jeSkqdH0sc2FtcGxlQ3VydmVEZXJpdmF0aXZlWDpmdW5jdGlvbih0KXtyZXR1cm4gKDMqdGhpcy5heCp0KzIqdGhpcy5ieCkqdCt0aGlzLmN4fSxzb2x2ZUN1cnZlWDpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PWUmJihlPTFlLTYpLHQ8MClyZXR1cm4gMDtpZih0PjEpcmV0dXJuIDE7Zm9yKHZhciByPXQsbj0wO248ODtuKyspe3ZhciBpPXRoaXMuc2FtcGxlQ3VydmVYKHIpLXQ7aWYoTWF0aC5hYnMoaSk8ZSlyZXR1cm4gcjt2YXIgcz10aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgocik7aWYoTWF0aC5hYnMocyk8MWUtNilicmVhaztyLT1pL3M7fXZhciBhPTAsbz0xO2ZvcihyPXQsbj0wO248MjAmJihpPXRoaXMuc2FtcGxlQ3VydmVYKHIpLCEoTWF0aC5hYnMoaS10KTxlKSk7bisrKXQ+aT9hPXI6bz1yLHI9LjUqKG8tYSkrYTtyZXR1cm4gcn0sc29sdmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh0LGUpKX19O3ZhciBJZT1TZShrZSk7ZnVuY3Rpb24gemUodCxlLHIpe3JldHVybiB0K3IqKGUtdCl9ZnVuY3Rpb24gUGUodCxlLHIpe3JldHVybiB0Lm1hcCgoKHQsbik9PnplKHQsZVtuXSxyKSkpfWNvbnN0IENlPXtudW1iZXI6emUsY29sb3I6ZnVuY3Rpb24odCxlLHIsbj1cInJnYlwiKXtzd2l0Y2gobil7Y2FzZVwicmdiXCI6e2NvbnN0W24saSxzLGFdPVBlKHQucmdiLGUucmdiLHIpO3JldHVybiBuZXcgS3QobixpLHMsYSwhMSl9Y2FzZVwiaGNsXCI6e2NvbnN0W24saSxzLGFdPXQuaGNsLFtvLGwsdSxjXT1lLmhjbDtsZXQgaCxwO2lmKGlzTmFOKG4pfHxpc05hTihvKSlpc05hTihuKT9pc05hTihvKT9oPU5hTjooaD1vLDEhPT1zJiYwIT09c3x8KHA9bCkpOihoPW4sMSE9PXUmJjAhPT11fHwocD1pKSk7ZWxzZSB7bGV0IHQ9by1uO28+biYmdD4xODA/dC09MzYwOm88biYmbi1vPjE4MCYmKHQrPTM2MCksaD1uK3IqdDt9Y29uc3RbZixkLHksbV09ZnVuY3Rpb24oW3QsZSxyLG5dKXtyZXR1cm4gdD1pc05hTih0KT8wOnQqRXQsT3QoW3IsTWF0aC5jb3ModCkqZSxNYXRoLnNpbih0KSplLG5dKX0oW2gsbnVsbCE9cD9wOnplKGksbCxyKSx6ZShzLHUsciksemUoYSxjLHIpXSk7cmV0dXJuIG5ldyBLdChmLGQseSxtLCExKX1jYXNlXCJsYWJcIjp7Y29uc3RbbixpLHMsYV09T3QoUGUodC5sYWIsZS5sYWIscikpO3JldHVybiBuZXcgS3QobixpLHMsYSwhMSl9fX0sYXJyYXk6UGUscGFkZGluZzpmdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBKdChQZSh0LnZhbHVlcyxlLnZhbHVlcyxyKSl9LHZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvbjpmdW5jdGlvbih0LGUscil7Y29uc3Qgbj10LnZhbHVlcyxpPWUudmFsdWVzO2lmKG4ubGVuZ3RoIT09aS5sZW5ndGgpdGhyb3cgbmV3IGFlKGBDYW5ub3QgaW50ZXJwb2xhdGUgdmFsdWVzIG9mIGRpZmZlcmVudCBsZW5ndGguIGZyb206ICR7dC50b1N0cmluZygpfSwgdG86ICR7ZS50b1N0cmluZygpfWApO2NvbnN0IHM9W107Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kz0yKXtpZihuW3RdIT09aVt0XSl0aHJvdyBuZXcgYWUoYENhbm5vdCBpbnRlcnBvbGF0ZSB2YWx1ZXMgY29udGFpbmluZyBtaXNtYXRjaGVkIGFuY2hvcnMuIGZyb21bJHt0fV06ICR7blt0XX0sIHRvWyR7dH1dOiAke2lbdF19YCk7cy5wdXNoKG5bdF0pO2NvbnN0W2UsYV09blt0KzFdLFtvLGxdPWlbdCsxXTtzLnB1c2goW3plKGUsbyxyKSx6ZShhLGwscildKTt9cmV0dXJuIG5ldyBRdChzKX19O2NsYXNzIEJle2NvbnN0cnVjdG9yKHQsZSxyLG4saSl7dGhpcy50eXBlPXQsdGhpcy5vcGVyYXRvcj1lLHRoaXMuaW50ZXJwb2xhdGlvbj1yLHRoaXMuaW5wdXQ9bix0aGlzLmxhYmVscz1bXSx0aGlzLm91dHB1dHM9W107Zm9yKGNvbnN0W3QsZV1vZiBpKXRoaXMubGFiZWxzLnB1c2godCksdGhpcy5vdXRwdXRzLnB1c2goZSk7fXN0YXRpYyBpbnRlcnBvbGF0aW9uRmFjdG9yKHQsZSxyLG4pe2xldCBpPTA7aWYoXCJleHBvbmVudGlhbFwiPT09dC5uYW1lKWk9VmUoZSx0LmJhc2UscixuKTtlbHNlIGlmKFwibGluZWFyXCI9PT10Lm5hbWUpaT1WZShlLDEscixuKTtlbHNlIGlmKFwiY3ViaWMtYmV6aWVyXCI9PT10Lm5hbWUpe2NvbnN0IHM9dC5jb250cm9sUG9pbnRzO2k9bmV3IEllKHNbMF0sc1sxXSxzWzJdLHNbM10pLnNvbHZlKFZlKGUsMSxyLG4pKTt9cmV0dXJuIGl9c3RhdGljIHBhcnNlKHQsZSl7bGV0W3IsbixpLC4uLnNdPXQ7aWYoIUFycmF5LmlzQXJyYXkobil8fDA9PT1uLmxlbmd0aClyZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGFuIGludGVycG9sYXRpb24gdHlwZSBleHByZXNzaW9uLlwiLDEpO2lmKFwibGluZWFyXCI9PT1uWzBdKW49e25hbWU6XCJsaW5lYXJcIn07ZWxzZSBpZihcImV4cG9uZW50aWFsXCI9PT1uWzBdKXtjb25zdCB0PW5bMV07aWYoXCJudW1iZXJcIiE9dHlwZW9mIHQpcmV0dXJuIGUuZXJyb3IoXCJFeHBvbmVudGlhbCBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGEgbnVtZXJpYyBiYXNlLlwiLDEsMSk7bj17bmFtZTpcImV4cG9uZW50aWFsXCIsYmFzZTp0fTt9ZWxzZSB7aWYoXCJjdWJpYy1iZXppZXJcIiE9PW5bMF0pcmV0dXJuIGUuZXJyb3IoYFVua25vd24gaW50ZXJwb2xhdGlvbiB0eXBlICR7U3RyaW5nKG5bMF0pfWAsMSwwKTt7Y29uc3QgdD1uLnNsaWNlKDEpO2lmKDQhPT10Lmxlbmd0aHx8dC5zb21lKCh0PT5cIm51bWJlclwiIT10eXBlb2YgdHx8dDwwfHx0PjEpKSlyZXR1cm4gZS5lcnJvcihcIkN1YmljIGJlemllciBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGZvdXIgbnVtZXJpYyBhcmd1bWVudHMgd2l0aCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLlwiLDEpO249e25hbWU6XCJjdWJpYy1iZXppZXJcIixjb250cm9sUG9pbnRzOnR9O319aWYodC5sZW5ndGgtMTw0KXJldHVybiBlLmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHt0Lmxlbmd0aC0xfS5gKTtpZigodC5sZW5ndGgtMSklMiE9MClyZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5cIik7aWYoaT1lLnBhcnNlKGksMix1dCksIWkpcmV0dXJuIG51bGw7Y29uc3QgYT1bXTtsZXQgbz1udWxsO1wiaW50ZXJwb2xhdGUtaGNsXCI9PT1yfHxcImludGVycG9sYXRlLWxhYlwiPT09cj9vPXB0OmUuZXhwZWN0ZWRUeXBlJiZcInZhbHVlXCIhPT1lLmV4cGVjdGVkVHlwZS5raW5kJiYobz1lLmV4cGVjdGVkVHlwZSk7Zm9yKGxldCB0PTA7dDxzLmxlbmd0aDt0Kz0yKXtjb25zdCByPXNbdF0sbj1zW3QrMV0saT10KzMsbD10KzQ7aWYoXCJudW1iZXJcIiE9dHlwZW9mIHIpcmV0dXJuIGUuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgZGVmaW5lZCB1c2luZyBsaXRlcmFsIG51bWVyaWMgdmFsdWVzIChub3QgY29tcHV0ZWQgZXhwcmVzc2lvbnMpIGZvciB0aGUgaW5wdXQgdmFsdWVzLicsaSk7aWYoYS5sZW5ndGgmJmFbYS5sZW5ndGgtMV1bMF0+PXIpcmV0dXJuIGUuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsaSk7Y29uc3QgdT1lLnBhcnNlKG4sbCxvKTtpZighdSlyZXR1cm4gbnVsbDtvPW98fHUudHlwZSxhLnB1c2goW3IsdV0pO31yZXR1cm4gTXQobyx1dCl8fE10KG8scHQpfHxNdChvLGd0KXx8TXQobyx2dCl8fE10KG8sYnQodXQpKT9uZXcgQmUobyxyLG4saSxhKTplLmVycm9yKGBUeXBlICR7d3Qobyl9IGlzIG5vdCBpbnRlcnBvbGF0YWJsZS5gKX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMubGFiZWxzLHI9dGhpcy5vdXRwdXRzO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gclswXS5ldmFsdWF0ZSh0KTtjb25zdCBuPXRoaXMuaW5wdXQuZXZhbHVhdGUodCk7aWYobjw9ZVswXSlyZXR1cm4gclswXS5ldmFsdWF0ZSh0KTtjb25zdCBpPWUubGVuZ3RoO2lmKG4+PWVbaS0xXSlyZXR1cm4gcltpLTFdLmV2YWx1YXRlKHQpO2NvbnN0IHM9X2UoZSxuKSxhPUJlLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uLG4sZVtzXSxlW3MrMV0pLG89cltzXS5ldmFsdWF0ZSh0KSxsPXJbcysxXS5ldmFsdWF0ZSh0KTtzd2l0Y2godGhpcy5vcGVyYXRvcil7Y2FzZVwiaW50ZXJwb2xhdGVcIjpyZXR1cm4gQ2VbdGhpcy50eXBlLmtpbmRdKG8sbCxhKTtjYXNlXCJpbnRlcnBvbGF0ZS1oY2xcIjpyZXR1cm4gQ2UuY29sb3IobyxsLGEsXCJoY2xcIik7Y2FzZVwiaW50ZXJwb2xhdGUtbGFiXCI6cmV0dXJuIENlLmNvbG9yKG8sbCxhLFwibGFiXCIpfX1lYWNoQ2hpbGQodCl7dCh0aGlzLmlucHV0KTtmb3IoY29uc3QgZSBvZiB0aGlzLm91dHB1dHMpdChlKTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiB0aGlzLm91dHB1dHMuZXZlcnkoKHQ9PnQub3V0cHV0RGVmaW5lZCgpKSl9fWZ1bmN0aW9uIFZlKHQsZSxyLG4pe2NvbnN0IGk9bi1yLHM9dC1yO3JldHVybiAwPT09aT8wOjE9PT1lP3MvaTooTWF0aC5wb3coZSxzKS0xKS8oTWF0aC5wb3coZSxpKS0xKX1jbGFzcyBFZXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudHlwZT10LHRoaXMuYXJncz1lO31zdGF0aWMgcGFyc2UodCxlKXtpZih0Lmxlbmd0aDwyKXJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LlwiKTtsZXQgcj1udWxsO2NvbnN0IG49ZS5leHBlY3RlZFR5cGU7biYmXCJ2YWx1ZVwiIT09bi5raW5kJiYocj1uKTtjb25zdCBpPVtdO2Zvcihjb25zdCBuIG9mIHQuc2xpY2UoMSkpe2NvbnN0IHQ9ZS5wYXJzZShuLDEraS5sZW5ndGgscix2b2lkIDAse3R5cGVBbm5vdGF0aW9uOlwib21pdFwifSk7aWYoIXQpcmV0dXJuIG51bGw7cj1yfHx0LnR5cGUsaS5wdXNoKHQpO31pZighcil0aHJvdyBuZXcgRXJyb3IoXCJObyBvdXRwdXQgdHlwZVwiKTtjb25zdCBzPW4mJmkuc29tZSgodD0+QXQobix0LnR5cGUpKSk7cmV0dXJuIG5ldyBFZShzP2R0OnIsaSl9ZXZhbHVhdGUodCl7bGV0IGUscj1udWxsLG49MDtmb3IoY29uc3QgaSBvZiB0aGlzLmFyZ3MpaWYobisrLHI9aS5ldmFsdWF0ZSh0KSxyJiZyIGluc3RhbmNlb2YgdGUmJiFyLmF2YWlsYWJsZSYmKGV8fChlPXIubmFtZSkscj1udWxsLG49PT10aGlzLmFyZ3MubGVuZ3RoJiYocj1lKSksbnVsbCE9PXIpYnJlYWs7cmV0dXJuIHJ9ZWFjaENoaWxkKHQpe3RoaXMuYXJncy5mb3JFYWNoKHQpO31vdXRwdXREZWZpbmVkKCl7cmV0dXJuIHRoaXMuYXJncy5ldmVyeSgodD0+dC5vdXRwdXREZWZpbmVkKCkpKX19ZnVuY3Rpb24gRmUodCxlKXtyZXR1cm4gXCI9PVwiPT09dHx8XCIhPVwiPT09dD9cImJvb2xlYW5cIj09PWUua2luZHx8XCJzdHJpbmdcIj09PWUua2luZHx8XCJudW1iZXJcIj09PWUua2luZHx8XCJudWxsXCI9PT1lLmtpbmR8fFwidmFsdWVcIj09PWUua2luZDpcInN0cmluZ1wiPT09ZS5raW5kfHxcIm51bWJlclwiPT09ZS5raW5kfHxcInZhbHVlXCI9PT1lLmtpbmR9ZnVuY3Rpb24gVGUodCxlLHIsbil7cmV0dXJuIDA9PT1uLmNvbXBhcmUoZSxyKX1mdW5jdGlvbiAkZSh0LGUscil7Y29uc3Qgbj1cIj09XCIhPT10JiZcIiE9XCIhPT10O3JldHVybiBjbGFzcyBpe2NvbnN0cnVjdG9yKHQsZSxyKXt0aGlzLnR5cGU9aHQsdGhpcy5saHM9dCx0aGlzLnJocz1lLHRoaXMuY29sbGF0b3I9cix0aGlzLmhhc1VudHlwZWRBcmd1bWVudD1cInZhbHVlXCI9PT10LnR5cGUua2luZHx8XCJ2YWx1ZVwiPT09ZS50eXBlLmtpbmQ7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKDMhPT10Lmxlbmd0aCYmNCE9PXQubGVuZ3RoKXJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5cIik7Y29uc3Qgcj10WzBdO2xldCBzPWUucGFyc2UodFsxXSwxLGR0KTtpZighcylyZXR1cm4gbnVsbDtpZighRmUocixzLnR5cGUpKXJldHVybiBlLmNvbmNhdCgxKS5lcnJvcihgXCIke3J9XCIgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJyR7d3Qocy50eXBlKX0nLmApO2xldCBhPWUucGFyc2UodFsyXSwyLGR0KTtpZighYSlyZXR1cm4gbnVsbDtpZighRmUocixhLnR5cGUpKXJldHVybiBlLmNvbmNhdCgyKS5lcnJvcihgXCIke3J9XCIgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJyR7d3QoYS50eXBlKX0nLmApO2lmKHMudHlwZS5raW5kIT09YS50eXBlLmtpbmQmJlwidmFsdWVcIiE9PXMudHlwZS5raW5kJiZcInZhbHVlXCIhPT1hLnR5cGUua2luZClyZXR1cm4gZS5lcnJvcihgQ2Fubm90IGNvbXBhcmUgdHlwZXMgJyR7d3Qocy50eXBlKX0nIGFuZCAnJHt3dChhLnR5cGUpfScuYCk7biYmKFwidmFsdWVcIj09PXMudHlwZS5raW5kJiZcInZhbHVlXCIhPT1hLnR5cGUua2luZD9zPW5ldyBsZShhLnR5cGUsW3NdKTpcInZhbHVlXCIhPT1zLnR5cGUua2luZCYmXCJ2YWx1ZVwiPT09YS50eXBlLmtpbmQmJihhPW5ldyBsZShzLnR5cGUsW2FdKSkpO2xldCBvPW51bGw7aWYoND09PXQubGVuZ3RoKXtpZihcInN0cmluZ1wiIT09cy50eXBlLmtpbmQmJlwic3RyaW5nXCIhPT1hLnR5cGUua2luZCYmXCJ2YWx1ZVwiIT09cy50eXBlLmtpbmQmJlwidmFsdWVcIiE9PWEudHlwZS5raW5kKXJldHVybiBlLmVycm9yKFwiQ2Fubm90IHVzZSBjb2xsYXRvciB0byBjb21wYXJlIG5vbi1zdHJpbmcgdHlwZXMuXCIpO2lmKG89ZS5wYXJzZSh0WzNdLDMseXQpLCFvKXJldHVybiBudWxsfXJldHVybiBuZXcgaShzLGEsbyl9ZXZhbHVhdGUoaSl7Y29uc3Qgcz10aGlzLmxocy5ldmFsdWF0ZShpKSxhPXRoaXMucmhzLmV2YWx1YXRlKGkpO2lmKG4mJnRoaXMuaGFzVW50eXBlZEFyZ3VtZW50KXtjb25zdCBlPW5lKHMpLHI9bmUoYSk7aWYoZS5raW5kIT09ci5raW5kfHxcInN0cmluZ1wiIT09ZS5raW5kJiZcIm51bWJlclwiIT09ZS5raW5kKXRocm93IG5ldyBhZShgRXhwZWN0ZWQgYXJndW1lbnRzIGZvciBcIiR7dH1cIiB0byBiZSAoc3RyaW5nLCBzdHJpbmcpIG9yIChudW1iZXIsIG51bWJlciksIGJ1dCBmb3VuZCAoJHtlLmtpbmR9LCAke3Iua2luZH0pIGluc3RlYWQuYCl9aWYodGhpcy5jb2xsYXRvciYmIW4mJnRoaXMuaGFzVW50eXBlZEFyZ3VtZW50KXtjb25zdCB0PW5lKHMpLHI9bmUoYSk7aWYoXCJzdHJpbmdcIiE9PXQua2luZHx8XCJzdHJpbmdcIiE9PXIua2luZClyZXR1cm4gZShpLHMsYSl9cmV0dXJuIHRoaXMuY29sbGF0b3I/cihpLHMsYSx0aGlzLmNvbGxhdG9yLmV2YWx1YXRlKGkpKTplKGkscyxhKX1lYWNoQ2hpbGQodCl7dCh0aGlzLmxocyksdCh0aGlzLnJocyksdGhpcy5jb2xsYXRvciYmdCh0aGlzLmNvbGxhdG9yKTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMH19fWNvbnN0IExlPSRlKFwiPT1cIiwoZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPT09cn0pLFRlKSxEZT0kZShcIiE9XCIsKGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZSE9PXJ9KSwoZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuICFUZSgwLGUscixuKX0pKSxPZT0kZShcIjxcIiwoZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPHJ9KSwoZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIG4uY29tcGFyZShlLHIpPDB9KSksamU9JGUoXCI+XCIsKGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT5yfSksKGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBuLmNvbXBhcmUoZSxyKT4wfSkpLFJlPSRlKFwiPD1cIiwoZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPD1yfSksKGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBuLmNvbXBhcmUoZSxyKTw9MH0pKSxVZT0kZShcIj49XCIsKGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT49cn0pLChmdW5jdGlvbih0LGUscixuKXtyZXR1cm4gbi5jb21wYXJlKGUscik+PTB9KSk7Y2xhc3MgcWV7Y29uc3RydWN0b3IodCxlLHIpe3RoaXMudHlwZT15dCx0aGlzLmxvY2FsZT1yLHRoaXMuY2FzZVNlbnNpdGl2ZT10LHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlPWU7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKDIhPT10Lmxlbmd0aClyZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIG9uZSBhcmd1bWVudC5cIik7Y29uc3Qgcj10WzFdO2lmKFwib2JqZWN0XCIhPXR5cGVvZiByfHxBcnJheS5pc0FycmF5KHIpKXJldHVybiBlLmVycm9yKFwiQ29sbGF0b3Igb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5cIik7Y29uc3Qgbj1lLnBhcnNlKHZvaWQgMCE9PXJbXCJjYXNlLXNlbnNpdGl2ZVwiXSYmcltcImNhc2Utc2Vuc2l0aXZlXCJdLDEsaHQpO2lmKCFuKXJldHVybiBudWxsO2NvbnN0IGk9ZS5wYXJzZSh2b2lkIDAhPT1yW1wiZGlhY3JpdGljLXNlbnNpdGl2ZVwiXSYmcltcImRpYWNyaXRpYy1zZW5zaXRpdmVcIl0sMSxodCk7aWYoIWkpcmV0dXJuIG51bGw7bGV0IHM9bnVsbDtyZXR1cm4gci5sb2NhbGUmJihzPWUucGFyc2Uoci5sb2NhbGUsMSxjdCksIXMpP251bGw6bmV3IHFlKG4saSxzKX1ldmFsdWF0ZSh0KXtyZXR1cm4gbmV3IFh0KHRoaXMuY2FzZVNlbnNpdGl2ZS5ldmFsdWF0ZSh0KSx0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5ldmFsdWF0ZSh0KSx0aGlzLmxvY2FsZT90aGlzLmxvY2FsZS5ldmFsdWF0ZSh0KTpudWxsKX1lYWNoQ2hpbGQodCl7dCh0aGlzLmNhc2VTZW5zaXRpdmUpLHQodGhpcy5kaWFjcml0aWNTZW5zaXRpdmUpLHRoaXMubG9jYWxlJiZ0KHRoaXMubG9jYWxlKTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMX19Y2xhc3MgTmV7Y29uc3RydWN0b3IodCxlLHIsbixpKXt0aGlzLnR5cGU9Y3QsdGhpcy5udW1iZXI9dCx0aGlzLmxvY2FsZT1lLHRoaXMuY3VycmVuY3k9cix0aGlzLm1pbkZyYWN0aW9uRGlnaXRzPW4sdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cz1pO31zdGF0aWMgcGFyc2UodCxlKXtpZigzIT09dC5sZW5ndGgpcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCB0d28gYXJndW1lbnRzLlwiKTtjb25zdCByPWUucGFyc2UodFsxXSwxLHV0KTtpZighcilyZXR1cm4gbnVsbDtjb25zdCBuPXRbMl07aWYoXCJvYmplY3RcIiE9dHlwZW9mIG58fEFycmF5LmlzQXJyYXkobikpcmV0dXJuIGUuZXJyb3IoXCJOdW1iZXJGb3JtYXQgb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5cIik7bGV0IGk9bnVsbDtpZihuLmxvY2FsZSYmKGk9ZS5wYXJzZShuLmxvY2FsZSwxLGN0KSwhaSkpcmV0dXJuIG51bGw7bGV0IHM9bnVsbDtpZihuLmN1cnJlbmN5JiYocz1lLnBhcnNlKG4uY3VycmVuY3ksMSxjdCksIXMpKXJldHVybiBudWxsO2xldCBhPW51bGw7aWYobltcIm1pbi1mcmFjdGlvbi1kaWdpdHNcIl0mJihhPWUucGFyc2UobltcIm1pbi1mcmFjdGlvbi1kaWdpdHNcIl0sMSx1dCksIWEpKXJldHVybiBudWxsO2xldCBvPW51bGw7cmV0dXJuIG5bXCJtYXgtZnJhY3Rpb24tZGlnaXRzXCJdJiYobz1lLnBhcnNlKG5bXCJtYXgtZnJhY3Rpb24tZGlnaXRzXCJdLDEsdXQpLCFvKT9udWxsOm5ldyBOZShyLGkscyxhLG8pfWV2YWx1YXRlKHQpe3JldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGU/dGhpcy5sb2NhbGUuZXZhbHVhdGUodCk6W10se3N0eWxlOnRoaXMuY3VycmVuY3k/XCJjdXJyZW5jeVwiOlwiZGVjaW1hbFwiLGN1cnJlbmN5OnRoaXMuY3VycmVuY3k/dGhpcy5jdXJyZW5jeS5ldmFsdWF0ZSh0KTp2b2lkIDAsbWluaW11bUZyYWN0aW9uRGlnaXRzOnRoaXMubWluRnJhY3Rpb25EaWdpdHM/dGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZSh0KTp2b2lkIDAsbWF4aW11bUZyYWN0aW9uRGlnaXRzOnRoaXMubWF4RnJhY3Rpb25EaWdpdHM/dGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZSh0KTp2b2lkIDB9KS5mb3JtYXQodGhpcy5udW1iZXIuZXZhbHVhdGUodCkpfWVhY2hDaGlsZCh0KXt0KHRoaXMubnVtYmVyKSx0aGlzLmxvY2FsZSYmdCh0aGlzLmxvY2FsZSksdGhpcy5jdXJyZW5jeSYmdCh0aGlzLmN1cnJlbmN5KSx0aGlzLm1pbkZyYWN0aW9uRGlnaXRzJiZ0KHRoaXMubWluRnJhY3Rpb25EaWdpdHMpLHRoaXMubWF4RnJhY3Rpb25EaWdpdHMmJnQodGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyk7fW91dHB1dERlZmluZWQoKXtyZXR1cm4gITF9fWNsYXNzIFple2NvbnN0cnVjdG9yKHQpe3RoaXMudHlwZT1tdCx0aGlzLnNlY3Rpb25zPXQ7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKHQubGVuZ3RoPDIpcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO2NvbnN0IHI9dFsxXTtpZighQXJyYXkuaXNBcnJheShyKSYmXCJvYmplY3RcIj09dHlwZW9mIHIpcmV0dXJuIGUuZXJyb3IoXCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIGltYWdlIG9yIHRleHQgc2VjdGlvbi5cIik7Y29uc3Qgbj1bXTtsZXQgaT0hMTtmb3IobGV0IHI9MTtyPD10Lmxlbmd0aC0xOysrcil7Y29uc3Qgcz10W3JdO2lmKGkmJlwib2JqZWN0XCI9PXR5cGVvZiBzJiYhQXJyYXkuaXNBcnJheShzKSl7aT0hMTtsZXQgdD1udWxsO2lmKHNbXCJmb250LXNjYWxlXCJdJiYodD1lLnBhcnNlKHNbXCJmb250LXNjYWxlXCJdLDEsdXQpLCF0KSlyZXR1cm4gbnVsbDtsZXQgcj1udWxsO2lmKHNbXCJ0ZXh0LWZvbnRcIl0mJihyPWUucGFyc2Uoc1tcInRleHQtZm9udFwiXSwxLGJ0KGN0KSksIXIpKXJldHVybiBudWxsO2xldCBhPW51bGw7aWYoc1tcInRleHQtY29sb3JcIl0mJihhPWUucGFyc2Uoc1tcInRleHQtY29sb3JcIl0sMSxwdCksIWEpKXJldHVybiBudWxsO2NvbnN0IG89bltuLmxlbmd0aC0xXTtvLnNjYWxlPXQsby5mb250PXIsby50ZXh0Q29sb3I9YTt9ZWxzZSB7Y29uc3Qgcz1lLnBhcnNlKHRbcl0sMSxkdCk7aWYoIXMpcmV0dXJuIG51bGw7Y29uc3QgYT1zLnR5cGUua2luZDtpZihcInN0cmluZ1wiIT09YSYmXCJ2YWx1ZVwiIT09YSYmXCJudWxsXCIhPT1hJiZcInJlc29sdmVkSW1hZ2VcIiE9PWEpcmV0dXJuIGUuZXJyb3IoXCJGb3JtYXR0ZWQgdGV4dCB0eXBlIG11c3QgYmUgJ3N0cmluZycsICd2YWx1ZScsICdpbWFnZScgb3IgJ251bGwnLlwiKTtpPSEwLG4ucHVzaCh7Y29udGVudDpzLHNjYWxlOm51bGwsZm9udDpudWxsLHRleHRDb2xvcjpudWxsfSk7fX1yZXR1cm4gbmV3IFplKG4pfWV2YWx1YXRlKHQpe3JldHVybiBuZXcgWXQodGhpcy5zZWN0aW9ucy5tYXAoKGU9Pntjb25zdCByPWUuY29udGVudC5ldmFsdWF0ZSh0KTtyZXR1cm4gbmUocik9PT14dD9uZXcgSHQoXCJcIixyLG51bGwsbnVsbCxudWxsKTpuZXcgSHQoaWUociksbnVsbCxlLnNjYWxlP2Uuc2NhbGUuZXZhbHVhdGUodCk6bnVsbCxlLmZvbnQ/ZS5mb250LmV2YWx1YXRlKHQpLmpvaW4oXCIsXCIpOm51bGwsZS50ZXh0Q29sb3I/ZS50ZXh0Q29sb3IuZXZhbHVhdGUodCk6bnVsbCl9KSkpfWVhY2hDaGlsZCh0KXtmb3IoY29uc3QgZSBvZiB0aGlzLnNlY3Rpb25zKXQoZS5jb250ZW50KSxlLnNjYWxlJiZ0KGUuc2NhbGUpLGUuZm9udCYmdChlLmZvbnQpLGUudGV4dENvbG9yJiZ0KGUudGV4dENvbG9yKTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMX19Y2xhc3MgR2V7Y29uc3RydWN0b3IodCl7dGhpcy50eXBlPXh0LHRoaXMuaW5wdXQ9dDt9c3RhdGljIHBhcnNlKHQsZSl7aWYoMiE9PXQubGVuZ3RoKXJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cy5cIik7Y29uc3Qgcj1lLnBhcnNlKHRbMV0sMSxjdCk7cmV0dXJuIHI/bmV3IEdlKHIpOmUuZXJyb3IoXCJObyBpbWFnZSBuYW1lIHByb3ZpZGVkLlwiKX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMuaW5wdXQuZXZhbHVhdGUodCkscj10ZS5mcm9tU3RyaW5nKGUpO3JldHVybiByJiZ0LmF2YWlsYWJsZUltYWdlcyYmKHIuYXZhaWxhYmxlPXQuYXZhaWxhYmxlSW1hZ2VzLmluZGV4T2YoZSk+LTEpLHJ9ZWFjaENoaWxkKHQpe3QodGhpcy5pbnB1dCk7fW91dHB1dERlZmluZWQoKXtyZXR1cm4gITF9fWNsYXNzIEtle2NvbnN0cnVjdG9yKHQpe3RoaXMudHlwZT11dCx0aGlzLmlucHV0PXQ7fXN0YXRpYyBwYXJzZSh0LGUpe2lmKDIhPT10Lmxlbmd0aClyZXR1cm4gZS5lcnJvcihgRXhwZWN0ZWQgMSBhcmd1bWVudCwgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtjb25zdCByPWUucGFyc2UodFsxXSwxKTtyZXR1cm4gcj9cImFycmF5XCIhPT1yLnR5cGUua2luZCYmXCJzdHJpbmdcIiE9PXIudHlwZS5raW5kJiZcInZhbHVlXCIhPT1yLnR5cGUua2luZD9lLmVycm9yKGBFeHBlY3RlZCBhcmd1bWVudCBvZiB0eXBlIHN0cmluZyBvciBhcnJheSwgYnV0IGZvdW5kICR7d3Qoci50eXBlKX0gaW5zdGVhZC5gKTpuZXcgS2Uocik6bnVsbH1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMuaW5wdXQuZXZhbHVhdGUodCk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIFsuLi5lXS5sZW5ndGg7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZS5sZW5ndGg7dGhyb3cgbmV3IGFlKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlIHN0cmluZyBvciBhcnJheSwgYnV0IGZvdW5kICR7d3QobmUoZSkpfSBpbnN0ZWFkLmApfWVhY2hDaGlsZCh0KXt0KHRoaXMuaW5wdXQpO31vdXRwdXREZWZpbmVkKCl7cmV0dXJuICExfX1jb25zdCBYZT04MTkyO2Z1bmN0aW9uIEhlKHQsZSl7Y29uc3Qgcj0oMTgwK3RbMF0pLzM2MCxuPSgxODAtMTgwL01hdGguUEkqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K3RbMV0qTWF0aC5QSS8zNjApKSkvMzYwLGk9TWF0aC5wb3coMixlLnopO3JldHVybiBbTWF0aC5yb3VuZChyKmkqWGUpLE1hdGgucm91bmQobippKlhlKV19ZnVuY3Rpb24gWWUodCxlKXtjb25zdCByPU1hdGgucG93KDIsZS56KTtyZXR1cm4gWyhpPSh0WzBdL1hlK2UueCkvciwzNjAqaS0xODApLChuPSh0WzFdL1hlK2UueSkvciwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoKDE4MC0zNjAqbikqTWF0aC5QSS8xODApKS05MCldO3ZhciBuLGk7fWZ1bmN0aW9uIEplKHQsZSl7dFswXT1NYXRoLm1pbih0WzBdLGVbMF0pLHRbMV09TWF0aC5taW4odFsxXSxlWzFdKSx0WzJdPU1hdGgubWF4KHRbMl0sZVswXSksdFszXT1NYXRoLm1heCh0WzNdLGVbMV0pO31mdW5jdGlvbiBXZSh0LGUpe3JldHVybiAhKHRbMF08PWVbMF18fHRbMl0+PWVbMl18fHRbMV08PWVbMV18fHRbM10+PWVbM10pfWZ1bmN0aW9uIFFlKHQsZSxyKXtjb25zdCBuPXRbMF0tZVswXSxpPXRbMV0tZVsxXSxzPXRbMF0tclswXSxhPXRbMV0tclsxXTtyZXR1cm4gbiphLXMqaT09MCYmbipzPD0wJiZpKmE8PTB9ZnVuY3Rpb24gdHIodCxlLHIsbil7cmV0dXJuIDAhPShpPVtuWzBdLXJbMF0sblsxXS1yWzFdXSlbMF0qKHM9W2VbMF0tdFswXSxlWzFdLXRbMV1dKVsxXS1pWzFdKnNbMF0mJiEoIWFyKHQsZSxyLG4pfHwhYXIocixuLHQsZSkpO3ZhciBpLHM7fWZ1bmN0aW9uIGVyKHQsZSxyKXtmb3IoY29uc3QgbiBvZiByKWZvcihsZXQgcj0wO3I8bi5sZW5ndGgtMTsrK3IpaWYodHIodCxlLG5bcl0sbltyKzFdKSlyZXR1cm4gITA7cmV0dXJuICExfWZ1bmN0aW9uIHJyKHQsZSxyPSExKXtsZXQgbj0hMTtmb3IoY29uc3QgbyBvZiBlKWZvcihsZXQgZT0wO2U8by5sZW5ndGgtMTtlKyspe2lmKFFlKHQsb1tlXSxvW2UrMV0pKXJldHVybiByOyhzPW9bZV0pWzFdPihpPXQpWzFdIT0oYT1vW2UrMV0pWzFdPmlbMV0mJmlbMF08KGFbMF0tc1swXSkqKGlbMV0tc1sxXSkvKGFbMV0tc1sxXSkrc1swXSYmKG49IW4pO312YXIgaSxzLGE7cmV0dXJuIG59ZnVuY3Rpb24gbnIodCxlKXtmb3IoY29uc3QgciBvZiBlKWlmKHJyKHQscikpcmV0dXJuICEwO3JldHVybiAhMX1mdW5jdGlvbiBpcih0LGUpe2Zvcihjb25zdCByIG9mIHQpaWYoIXJyKHIsZSkpcmV0dXJuICExO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGgtMTsrK3IpaWYoZXIodFtyXSx0W3IrMV0sZSkpcmV0dXJuICExO3JldHVybiAhMH1mdW5jdGlvbiBzcih0LGUpe2Zvcihjb25zdCByIG9mIGUpaWYoaXIodCxyKSlyZXR1cm4gITA7cmV0dXJuICExfWZ1bmN0aW9uIGFyKHQsZSxyLG4pe2NvbnN0IGk9blswXS1yWzBdLHM9blsxXS1yWzFdLGE9KHRbMF0tclswXSkqcy1pKih0WzFdLXJbMV0pLG89KGVbMF0tclswXSkqcy1pKihlWzFdLXJbMV0pO3JldHVybiBhPjAmJm88MHx8YTwwJiZvPjB9ZnVuY3Rpb24gb3IodCxlLHIpe2NvbnN0IG49W107Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IHM9W107Zm9yKGxldCBuPTA7bjx0W2ldLmxlbmd0aDtuKyspe2NvbnN0IGE9SGUodFtpXVtuXSxyKTtKZShlLGEpLHMucHVzaChhKTt9bi5wdXNoKHMpO31yZXR1cm4gbn1mdW5jdGlvbiBscih0LGUscil7Y29uc3Qgbj1bXTtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7Y29uc3Qgcz1vcih0W2ldLGUscik7bi5wdXNoKHMpO31yZXR1cm4gbn1mdW5jdGlvbiB1cih0LGUscixuKXtpZih0WzBdPHJbMF18fHRbMF0+clsyXSl7Y29uc3QgZT0uNSpuO2xldCBpPXRbMF0tclswXT5lPy1uOnJbMF0tdFswXT5lP246MDswPT09aSYmKGk9dFswXS1yWzJdPmU/LW46clsyXS10WzBdPmU/bjowKSx0WzBdKz1pO31KZShlLHQpO31mdW5jdGlvbiBjcih0LGUscixuKXtjb25zdCBpPU1hdGgucG93KDIsbi56KSpYZSxzPVtuLngqWGUsbi55KlhlXSxhPVtdO2Zvcihjb25zdCBuIG9mIHQpZm9yKGNvbnN0IHQgb2Ygbil7Y29uc3Qgbj1bdC54K3NbMF0sdC55K3NbMV1dO3VyKG4sZSxyLGkpLGEucHVzaChuKTt9cmV0dXJuIGF9ZnVuY3Rpb24gaHIodCxlLHIsbil7Y29uc3QgaT1NYXRoLnBvdygyLG4ueikqWGUscz1bbi54KlhlLG4ueSpYZV0sYT1bXTtmb3IoY29uc3QgciBvZiB0KXtjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIHIpe2NvbnN0IHI9W24ueCtzWzBdLG4ueStzWzFdXTtKZShlLHIpLHQucHVzaChyKTt9YS5wdXNoKHQpO31pZihlWzJdLWVbMF08PWkvMil7KG89ZSlbMF09b1sxXT0xLzAsb1syXT1vWzNdPS0xLzA7Zm9yKGNvbnN0IHQgb2YgYSlmb3IoY29uc3QgbiBvZiB0KXVyKG4sZSxyLGkpO312YXIgbztyZXR1cm4gYX1jbGFzcyBwcntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudHlwZT1odCx0aGlzLmdlb2pzb249dCx0aGlzLmdlb21ldHJpZXM9ZTt9c3RhdGljIHBhcnNlKHQsZSl7aWYoMiE9PXQubGVuZ3RoKXJldHVybiBlLmVycm9yKGAnd2l0aGluJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBidXQgZm91bmQgJHt0Lmxlbmd0aC0xfSBpbnN0ZWFkLmApO2lmKHJlKHRbMV0pKXtjb25zdCBlPXRbMV07aWYoXCJGZWF0dXJlQ29sbGVjdGlvblwiPT09ZS50eXBlKXtjb25zdCB0PVtdO2Zvcihjb25zdCByIG9mIGUuZmVhdHVyZXMpe2NvbnN0e3R5cGU6ZSxjb29yZGluYXRlczpufT1yLmdlb21ldHJ5O1wiUG9seWdvblwiPT09ZSYmdC5wdXNoKG4pLFwiTXVsdGlQb2x5Z29uXCI9PT1lJiZ0LnB1c2goLi4ubik7fWlmKHQubGVuZ3RoKXJldHVybiBuZXcgcHIoZSx7dHlwZTpcIk11bHRpUG9seWdvblwiLGNvb3JkaW5hdGVzOnR9KX1lbHNlIGlmKFwiRmVhdHVyZVwiPT09ZS50eXBlKXtjb25zdCB0PWUuZ2VvbWV0cnkudHlwZTtpZihcIlBvbHlnb25cIj09PXR8fFwiTXVsdGlQb2x5Z29uXCI9PT10KXJldHVybiBuZXcgcHIoZSxlLmdlb21ldHJ5KX1lbHNlIGlmKFwiUG9seWdvblwiPT09ZS50eXBlfHxcIk11bHRpUG9seWdvblwiPT09ZS50eXBlKXJldHVybiBuZXcgcHIoZSxlKX1yZXR1cm4gZS5lcnJvcihcIid3aXRoaW4nIGV4cHJlc3Npb24gcmVxdWlyZXMgdmFsaWQgZ2VvanNvbiBvYmplY3QgdGhhdCBjb250YWlucyBwb2x5Z29uIGdlb21ldHJ5IHR5cGUuXCIpfWV2YWx1YXRlKHQpe2lmKG51bGwhPXQuZ2VvbWV0cnkoKSYmbnVsbCE9dC5jYW5vbmljYWxJRCgpKXtpZihcIlBvaW50XCI9PT10Lmdlb21ldHJ5VHlwZSgpKXJldHVybiBmdW5jdGlvbih0LGUpe2NvbnN0IHI9WzEvMCwxLzAsLTEvMCwtMS8wXSxuPVsxLzAsMS8wLC0xLzAsLTEvMF0saT10LmNhbm9uaWNhbElEKCk7aWYoXCJQb2x5Z29uXCI9PT1lLnR5cGUpe2NvbnN0IHM9b3IoZS5jb29yZGluYXRlcyxuLGkpLGE9Y3IodC5nZW9tZXRyeSgpLHIsbixpKTtpZighV2UocixuKSlyZXR1cm4gITE7Zm9yKGNvbnN0IHQgb2YgYSlpZighcnIodCxzKSlyZXR1cm4gITF9aWYoXCJNdWx0aVBvbHlnb25cIj09PWUudHlwZSl7Y29uc3Qgcz1scihlLmNvb3JkaW5hdGVzLG4saSksYT1jcih0Lmdlb21ldHJ5KCkscixuLGkpO2lmKCFXZShyLG4pKXJldHVybiAhMTtmb3IoY29uc3QgdCBvZiBhKWlmKCFucih0LHMpKXJldHVybiAhMX1yZXR1cm4gITB9KHQsdGhpcy5nZW9tZXRyaWVzKTtpZihcIkxpbmVTdHJpbmdcIj09PXQuZ2VvbWV0cnlUeXBlKCkpcmV0dXJuIGZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj1bMS8wLDEvMCwtMS8wLC0xLzBdLG49WzEvMCwxLzAsLTEvMCwtMS8wXSxpPXQuY2Fub25pY2FsSUQoKTtpZihcIlBvbHlnb25cIj09PWUudHlwZSl7Y29uc3Qgcz1vcihlLmNvb3JkaW5hdGVzLG4saSksYT1ocih0Lmdlb21ldHJ5KCkscixuLGkpO2lmKCFXZShyLG4pKXJldHVybiAhMTtmb3IoY29uc3QgdCBvZiBhKWlmKCFpcih0LHMpKXJldHVybiAhMX1pZihcIk11bHRpUG9seWdvblwiPT09ZS50eXBlKXtjb25zdCBzPWxyKGUuY29vcmRpbmF0ZXMsbixpKSxhPWhyKHQuZ2VvbWV0cnkoKSxyLG4saSk7aWYoIVdlKHIsbikpcmV0dXJuICExO2Zvcihjb25zdCB0IG9mIGEpaWYoIXNyKHQscykpcmV0dXJuICExfXJldHVybiAhMH0odCx0aGlzLmdlb21ldHJpZXMpfXJldHVybiAhMX1lYWNoQ2hpbGQoKXt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMH19bGV0IGZyPWNsYXNze2NvbnN0cnVjdG9yKHQ9W10sZT0oKHQsZSk9PnQ8ZT8tMTp0PmU/MTowKSl7aWYodGhpcy5kYXRhPXQsdGhpcy5sZW5ndGg9dGhpcy5kYXRhLmxlbmd0aCx0aGlzLmNvbXBhcmU9ZSx0aGlzLmxlbmd0aD4wKWZvcihsZXQgdD0odGhpcy5sZW5ndGg+PjEpLTE7dD49MDt0LS0pdGhpcy5fZG93bih0KTt9cHVzaCh0KXt0aGlzLmRhdGEucHVzaCh0KSx0aGlzLl91cCh0aGlzLmxlbmd0aCsrKTt9cG9wKCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybjtjb25zdCB0PXRoaXMuZGF0YVswXSxlPXRoaXMuZGF0YS5wb3AoKTtyZXR1cm4gLS10aGlzLmxlbmd0aD4wJiYodGhpcy5kYXRhWzBdPWUsdGhpcy5fZG93bigwKSksdH1wZWVrKCl7cmV0dXJuIHRoaXMuZGF0YVswXX1fdXAodCl7Y29uc3R7ZGF0YTplLGNvbXBhcmU6cn09dGhpcyxuPWVbdF07Zm9yKDt0PjA7KXtjb25zdCBpPXQtMT4+MSxzPWVbaV07aWYocihuLHMpPj0wKWJyZWFrO2VbdF09cyx0PWk7fWVbdF09bjt9X2Rvd24odCl7Y29uc3R7ZGF0YTplLGNvbXBhcmU6cn09dGhpcyxuPXRoaXMubGVuZ3RoPj4xLGk9ZVt0XTtmb3IoO3Q8bjspe2xldCBuPTErKHQ8PDEpO2NvbnN0IHM9bisxO2lmKHM8dGhpcy5sZW5ndGgmJnIoZVtzXSxlW25dKTwwJiYobj1zKSxyKGVbbl0saSk+PTApYnJlYWs7ZVt0XT1lW25dLHQ9bjt9ZVt0XT1pO319O2Z1bmN0aW9uIGRyKHQsZSxyLG4saSl7eXIodCxlLHIsbnx8dC5sZW5ndGgtMSxpfHxncik7fWZ1bmN0aW9uIHlyKHQsZSxyLG4saSl7Zm9yKDtuPnI7KXtpZihuLXI+NjAwKXt2YXIgcz1uLXIrMSxhPWUtcisxLG89TWF0aC5sb2cocyksbD0uNSpNYXRoLmV4cCgyKm8vMyksdT0uNSpNYXRoLnNxcnQobypsKihzLWwpL3MpKihhLXMvMjwwPy0xOjEpO3lyKHQsZSxNYXRoLm1heChyLE1hdGguZmxvb3IoZS1hKmwvcyt1KSksTWF0aC5taW4obixNYXRoLmZsb29yKGUrKHMtYSkqbC9zK3UpKSxpKTt9dmFyIGM9dFtlXSxoPXIscD1uO2Zvcihtcih0LHIsZSksaSh0W25dLGMpPjAmJm1yKHQscixuKTtoPHA7KXtmb3IobXIodCxoLHApLGgrKyxwLS07aSh0W2hdLGMpPDA7KWgrKztmb3IoO2kodFtwXSxjKT4wOylwLS07fTA9PT1pKHRbcl0sYyk/bXIodCxyLHApOm1yKHQsKytwLG4pLHA8PWUmJihyPXArMSksZTw9cCYmKG49cC0xKTt9fWZ1bmN0aW9uIG1yKHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW47fWZ1bmN0aW9uIGdyKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTowfWZ1bmN0aW9uIHhyKHQsZSl7aWYodC5sZW5ndGg8PTEpcmV0dXJuIFt0XTtjb25zdCByPVtdO2xldCBuLGk7Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1icihlKTswIT09dCYmKGUuYXJlYT1NYXRoLmFicyh0KSx2b2lkIDA9PT1pJiYoaT10PDApLGk9PT10PDA/KG4mJnIucHVzaChuKSxuPVtlXSk6bi5wdXNoKGUpKTt9aWYobiYmci5wdXNoKG4pLGU+MSlmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdLmxlbmd0aDw9ZXx8KGRyKHJbdF0sZSwxLHJbdF0ubGVuZ3RoLTEsdnIpLHJbdF09clt0XS5zbGljZSgwLGUpKTtyZXR1cm4gcn1mdW5jdGlvbiB2cih0LGUpe3JldHVybiBlLmFyZWEtdC5hcmVhfWZ1bmN0aW9uIGJyKHQpe2xldCBlPTA7Zm9yKGxldCByLG4saT0wLHM9dC5sZW5ndGgsYT1zLTE7aTxzO2E9aSsrKXI9dFtpXSxuPXRbYV0sZSs9KG4ueC1yLngpKihyLnkrbi55KTtyZXR1cm4gZX1jb25zdCB3cj0xLzI5OC4yNTcyMjM1NjMsX3I9d3IqKDItd3IpLEFyPU1hdGguUEkvMTgwO2NsYXNzIFNye2NvbnN0cnVjdG9yKHQpe2NvbnN0IGU9NjM3OC4xMzcqQXIqMWUzLHI9TWF0aC5jb3ModCpBciksbj0xLygxLV9yKigxLXIqcikpLGk9TWF0aC5zcXJ0KG4pO3RoaXMua3g9ZSppKnIsdGhpcy5reT1lKmkqbiooMS1fcik7fWRpc3RhbmNlKHQsZSl7Y29uc3Qgcj10aGlzLndyYXAodFswXS1lWzBdKSp0aGlzLmt4LG49KHRbMV0tZVsxXSkqdGhpcy5reTtyZXR1cm4gTWF0aC5zcXJ0KHIqcituKm4pfXBvaW50T25MaW5lKHQsZSl7bGV0IHIsbixpLHMsYT0xLzA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aC0xO28rKyl7bGV0IGw9dFtvXVswXSx1PXRbb11bMV0sYz10aGlzLndyYXAodFtvKzFdWzBdLWwpKnRoaXMua3gsaD0odFtvKzFdWzFdLXUpKnRoaXMua3kscD0wOzA9PT1jJiYwPT09aHx8KHA9KHRoaXMud3JhcChlWzBdLWwpKnRoaXMua3gqYysoZVsxXS11KSp0aGlzLmt5KmgpLyhjKmMraCpoKSxwPjE/KGw9dFtvKzFdWzBdLHU9dFtvKzFdWzFdKTpwPjAmJihsKz1jL3RoaXMua3gqcCx1Kz1oL3RoaXMua3kqcCkpLGM9dGhpcy53cmFwKGVbMF0tbCkqdGhpcy5reCxoPShlWzFdLXUpKnRoaXMua3k7Y29uc3QgZj1jKmMraCpoO2Y8YSYmKGE9ZixyPWwsbj11LGk9byxzPXApO31yZXR1cm4ge3BvaW50OltyLG5dLGluZGV4OmksdDpNYXRoLm1heCgwLE1hdGgubWluKDEscykpfX13cmFwKHQpe2Zvcig7dDwtMTgwOyl0Kz0zNjA7Zm9yKDt0PjE4MDspdC09MzYwO3JldHVybiB0fX1mdW5jdGlvbiBrcih0LGUpe3JldHVybiBlWzBdLXRbMF19ZnVuY3Rpb24gTXIodCl7cmV0dXJuIHRbMV0tdFswXSsxfWZ1bmN0aW9uIElyKHQsZSl7cmV0dXJuIHRbMV0+PXRbMF0mJnRbMV08ZX1mdW5jdGlvbiB6cih0LGUpe2lmKHRbMF0+dFsxXSlyZXR1cm4gW251bGwsbnVsbF07Y29uc3Qgcj1Ncih0KTtpZihlKXtpZigyPT09cilyZXR1cm4gW3QsbnVsbF07Y29uc3QgZT1NYXRoLmZsb29yKHIvMik7cmV0dXJuIFtbdFswXSx0WzBdK2VdLFt0WzBdK2UsdFsxXV1dfWlmKDE9PT1yKXJldHVybiBbdCxudWxsXTtjb25zdCBuPU1hdGguZmxvb3Ioci8yKS0xO3JldHVybiBbW3RbMF0sdFswXStuXSxbdFswXStuKzEsdFsxXV1dfWZ1bmN0aW9uIFByKHQsZSl7aWYoIUlyKGUsdC5sZW5ndGgpKXJldHVybiBbMS8wLDEvMCwtMS8wLC0xLzBdO2NvbnN0IHI9WzEvMCwxLzAsLTEvMCwtMS8wXTtmb3IobGV0IG49ZVswXTtuPD1lWzFdOysrbilKZShyLHRbbl0pO3JldHVybiByfWZ1bmN0aW9uIENyKHQpe2NvbnN0IGU9WzEvMCwxLzAsLTEvMCwtMS8wXTtmb3IoY29uc3QgciBvZiB0KWZvcihjb25zdCB0IG9mIHIpSmUoZSx0KTtyZXR1cm4gZX1mdW5jdGlvbiBCcih0KXtyZXR1cm4gdFswXSE9PS0xLzAmJnRbMV0hPT0tMS8wJiZ0WzJdIT09MS8wJiZ0WzNdIT09MS8wfWZ1bmN0aW9uIFZyKHQsZSxyKXtpZighQnIodCl8fCFCcihlKSlyZXR1cm4gTmFOO2xldCBuPTAsaT0wO3JldHVybiB0WzJdPGVbMF0mJihuPWVbMF0tdFsyXSksdFswXT5lWzJdJiYobj10WzBdLWVbMl0pLHRbMV0+ZVszXSYmKGk9dFsxXS1lWzNdKSx0WzNdPGVbMV0mJihpPWVbMV0tdFszXSksci5kaXN0YW5jZShbMCwwXSxbbixpXSl9ZnVuY3Rpb24gRXIodCxlLHIpe2NvbnN0IG49ci5wb2ludE9uTGluZShlLHQpO3JldHVybiByLmRpc3RhbmNlKHQsbi5wb2ludCl9ZnVuY3Rpb24gRnIodCxlLHIsbixpKXtjb25zdCBzPU1hdGgubWluKEVyKHQsW3Isbl0saSksRXIoZSxbcixuXSxpKSksYT1NYXRoLm1pbihFcihyLFt0LGVdLGkpLEVyKG4sW3QsZV0saSkpO3JldHVybiBNYXRoLm1pbihzLGEpfWZ1bmN0aW9uIFRyKHQsZSxyLG4saSl7aWYoIUlyKGUsdC5sZW5ndGgpfHwhSXIobixyLmxlbmd0aCkpcmV0dXJuIDEvMDtsZXQgcz0xLzA7Zm9yKGxldCBhPWVbMF07YTxlWzFdOysrYSl7Y29uc3QgZT10W2FdLG89dFthKzFdO2ZvcihsZXQgdD1uWzBdO3Q8blsxXTsrK3Qpe2NvbnN0IG49clt0XSxhPXJbdCsxXTtpZih0cihlLG8sbixhKSlyZXR1cm4gMDtzPU1hdGgubWluKHMsRnIoZSxvLG4sYSxpKSk7fX1yZXR1cm4gc31mdW5jdGlvbiAkcih0LGUscixuLGkpe2lmKCFJcihlLHQubGVuZ3RoKXx8IUlyKG4sci5sZW5ndGgpKXJldHVybiBOYU47bGV0IHM9MS8wO2ZvcihsZXQgYT1lWzBdO2E8PWVbMV07KythKWZvcihsZXQgZT1uWzBdO2U8PW5bMV07KytlKWlmKHM9TWF0aC5taW4ocyxpLmRpc3RhbmNlKHRbYV0scltlXSkpLDA9PT1zKXJldHVybiBzO3JldHVybiBzfWZ1bmN0aW9uIExyKHQsZSxyKXtpZihycih0LGUsITApKXJldHVybiAwO2xldCBuPTEvMDtmb3IoY29uc3QgaSBvZiBlKXtjb25zdCBlPWlbMF0scz1pW2kubGVuZ3RoLTFdO2lmKGUhPT1zJiYobj1NYXRoLm1pbihuLEVyKHQsW3MsZV0scikpLDA9PT1uKSlyZXR1cm4gbjtjb25zdCBhPXIucG9pbnRPbkxpbmUoaSx0KTtpZihuPU1hdGgubWluKG4sci5kaXN0YW5jZSh0LGEucG9pbnQpKSwwPT09bilyZXR1cm4gbn1yZXR1cm4gbn1mdW5jdGlvbiBEcih0LGUscixuKXtpZighSXIoZSx0Lmxlbmd0aCkpcmV0dXJuIE5hTjtmb3IobGV0IG49ZVswXTtuPD1lWzFdOysrbilpZihycih0W25dLHIsITApKXJldHVybiAwO2xldCBpPTEvMDtmb3IobGV0IHM9ZVswXTtzPGVbMV07KytzKXtjb25zdCBlPXRbc10sYT10W3MrMV07Zm9yKGNvbnN0IHQgb2Ygcilmb3IobGV0IHI9MCxzPXQubGVuZ3RoLG89cy0xO3I8cztvPXIrKyl7Y29uc3Qgcz10W29dLGw9dFtyXTtpZih0cihlLGEscyxsKSlyZXR1cm4gMDtpPU1hdGgubWluKGksRnIoZSxhLHMsbCxuKSk7fX1yZXR1cm4gaX1mdW5jdGlvbiBPcih0LGUpe2Zvcihjb25zdCByIG9mIHQpZm9yKGNvbnN0IHQgb2YgcilpZihycih0LGUsITApKXJldHVybiAhMDtyZXR1cm4gITF9ZnVuY3Rpb24ganIodCxlLHIsbj0xLzApe2NvbnN0IGk9Q3IodCkscz1DcihlKTtpZihuIT09MS8wJiZWcihpLHMscik+PW4pcmV0dXJuIG47aWYoV2UoaSxzKSl7aWYoT3IodCxlKSlyZXR1cm4gMH1lbHNlIGlmKE9yKGUsdCkpcmV0dXJuIDA7bGV0IGE9MS8wO2Zvcihjb25zdCBuIG9mIHQpZm9yKGxldCB0PTAsaT1uLmxlbmd0aCxzPWktMTt0PGk7cz10Kyspe2NvbnN0IGk9bltzXSxvPW5bdF07Zm9yKGNvbnN0IHQgb2YgZSlmb3IobGV0IGU9MCxuPXQubGVuZ3RoLHM9bi0xO2U8bjtzPWUrKyl7Y29uc3Qgbj10W3NdLGw9dFtlXTtpZih0cihpLG8sbixsKSlyZXR1cm4gMDthPU1hdGgubWluKGEsRnIoaSxvLG4sbCxyKSk7fX1yZXR1cm4gYX1mdW5jdGlvbiBScih0LGUscixuLGkscyl7aWYoIXMpcmV0dXJuO2NvbnN0IGE9VnIoUHIobixzKSxpLHIpO2E8ZSYmdC5wdXNoKFthLHMsWzAsMF1dKTt9ZnVuY3Rpb24gVXIodCxlLHIsbixpLHMsYSl7aWYoIXN8fCFhKXJldHVybjtjb25zdCBvPVZyKFByKG4scyksUHIoaSxhKSxyKTtvPGUmJnQucHVzaChbbyxzLGFdKTt9ZnVuY3Rpb24gcXIodCxlLHIsbixpPTEvMCl7bGV0IHM9TWF0aC5taW4obi5kaXN0YW5jZSh0WzBdLHJbMF1bMF0pLGkpO2lmKDA9PT1zKXJldHVybiBzO2NvbnN0IGE9bmV3IGZyKFtbMCxbMCx0Lmxlbmd0aC0xXSxbMCwwXV1dLGtyKSxvPUNyKHIpO2Zvcig7YS5sZW5ndGg+MDspe2NvbnN0IGk9YS5wb3AoKTtpZihpWzBdPj1zKWNvbnRpbnVlO2NvbnN0IGw9aVsxXSx1PWU/NTA6MTAwO2lmKE1yKGwpPD11KXtpZighSXIobCx0Lmxlbmd0aCkpcmV0dXJuIE5hTjtpZihlKXtjb25zdCBlPURyKHQsbCxyLG4pO2lmKGlzTmFOKGUpfHwwPT09ZSlyZXR1cm4gZTtzPU1hdGgubWluKHMsZSk7fWVsc2UgZm9yKGxldCBlPWxbMF07ZTw9bFsxXTsrK2Upe2NvbnN0IGk9THIodFtlXSxyLG4pO2lmKHM9TWF0aC5taW4ocyxpKSwwPT09cylyZXR1cm4gMH19ZWxzZSB7Y29uc3Qgcj16cihsLGUpO1JyKGEscyxuLHQsbyxyWzBdKSxScihhLHMsbix0LG8sclsxXSk7fX1yZXR1cm4gc31mdW5jdGlvbiBOcih0LGUscixuLGkscz0xLzApe2xldCBhPU1hdGgubWluKHMsaS5kaXN0YW5jZSh0WzBdLHJbMF0pKTtpZigwPT09YSlyZXR1cm4gYTtjb25zdCBvPW5ldyBmcihbWzAsWzAsdC5sZW5ndGgtMV0sWzAsci5sZW5ndGgtMV1dXSxrcik7Zm9yKDtvLmxlbmd0aD4wOyl7Y29uc3Qgcz1vLnBvcCgpO2lmKHNbMF0+PWEpY29udGludWU7Y29uc3QgbD1zWzFdLHU9c1syXSxjPWU/NTA6MTAwLGg9bj81MDoxMDA7aWYoTXIobCk8PWMmJk1yKHUpPD1oKXtpZighSXIobCx0Lmxlbmd0aCkmJklyKHUsci5sZW5ndGgpKXJldHVybiBOYU47bGV0IHM7aWYoZSYmbilzPVRyKHQsbCxyLHUsaSksYT1NYXRoLm1pbihhLHMpO2Vsc2UgaWYoZSYmIW4pe2NvbnN0IGU9dC5zbGljZShsWzBdLGxbMV0rMSk7Zm9yKGxldCB0PXVbMF07dDw9dVsxXTsrK3QpaWYocz1FcihyW3RdLGUsaSksYT1NYXRoLm1pbihhLHMpLDA9PT1hKXJldHVybiBhfWVsc2UgaWYoIWUmJm4pe2NvbnN0IGU9ci5zbGljZSh1WzBdLHVbMV0rMSk7Zm9yKGxldCByPWxbMF07cjw9bFsxXTsrK3IpaWYocz1Fcih0W3JdLGUsaSksYT1NYXRoLm1pbihhLHMpLDA9PT1hKXJldHVybiBhfWVsc2Ugcz0kcih0LGwscix1LGkpLGE9TWF0aC5taW4oYSxzKTt9ZWxzZSB7Y29uc3Qgcz16cihsLGUpLGM9enIodSxuKTtVcihvLGEsaSx0LHIsc1swXSxjWzBdKSxVcihvLGEsaSx0LHIsc1swXSxjWzFdKSxVcihvLGEsaSx0LHIsc1sxXSxjWzBdKSxVcihvLGEsaSx0LHIsc1sxXSxjWzFdKTt9fXJldHVybiBhfWZ1bmN0aW9uIFpyKHQpe3JldHVybiBcIk11bHRpUG9seWdvblwiPT09dC50eXBlP3QuY29vcmRpbmF0ZXMubWFwKCh0PT4oe3R5cGU6XCJQb2x5Z29uXCIsY29vcmRpbmF0ZXM6dH0pKSk6XCJNdWx0aUxpbmVTdHJpbmdcIj09PXQudHlwZT90LmNvb3JkaW5hdGVzLm1hcCgodD0+KHt0eXBlOlwiTGluZVN0cmluZ1wiLGNvb3JkaW5hdGVzOnR9KSkpOlwiTXVsdGlQb2ludFwiPT09dC50eXBlP3QuY29vcmRpbmF0ZXMubWFwKCh0PT4oe3R5cGU6XCJQb2ludFwiLGNvb3JkaW5hdGVzOnR9KSkpOlt0XX1jbGFzcyBHcntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudHlwZT11dCx0aGlzLmdlb2pzb249dCx0aGlzLmdlb21ldHJpZXM9ZTt9c3RhdGljIHBhcnNlKHQsZSl7aWYoMiE9PXQubGVuZ3RoKXJldHVybiBlLmVycm9yKGAnZGlzdGFuY2UnIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7aWYocmUodFsxXSkpe2NvbnN0IGU9dFsxXTtpZihcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT1lLnR5cGUpcmV0dXJuIG5ldyBHcihlLGUuZmVhdHVyZXMubWFwKCh0PT5acih0Lmdlb21ldHJ5KSkpLmZsYXQoKSk7aWYoXCJGZWF0dXJlXCI9PT1lLnR5cGUpcmV0dXJuIG5ldyBHcihlLFpyKGUuZ2VvbWV0cnkpKTtpZihcInR5cGVcImluIGUmJlwiY29vcmRpbmF0ZXNcImluIGUpcmV0dXJuIG5ldyBHcihlLFpyKGUpKX1yZXR1cm4gZS5lcnJvcihcIidkaXN0YW5jZScgZXhwcmVzc2lvbiByZXF1aXJlcyB2YWxpZCBnZW9qc29uIG9iamVjdCB0aGF0IGNvbnRhaW5zIHBvbHlnb24gZ2VvbWV0cnkgdHlwZS5cIil9ZXZhbHVhdGUodCl7aWYobnVsbCE9dC5nZW9tZXRyeSgpJiZudWxsIT10LmNhbm9uaWNhbElEKCkpe2lmKFwiUG9pbnRcIj09PXQuZ2VvbWV0cnlUeXBlKCkpcmV0dXJuIGZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10Lmdlb21ldHJ5KCksbj1yLmZsYXQoKS5tYXAoKGU9PlllKFtlLngsZS55XSx0LmNhbm9uaWNhbCkpKTtpZigwPT09ci5sZW5ndGgpcmV0dXJuIE5hTjtjb25zdCBpPW5ldyBTcihuWzBdWzFdKTtsZXQgcz0xLzA7Zm9yKGNvbnN0IHQgb2YgZSl7c3dpdGNoKHQudHlwZSl7Y2FzZVwiUG9pbnRcIjpzPU1hdGgubWluKHMsTnIobiwhMSxbdC5jb29yZGluYXRlc10sITEsaSxzKSk7YnJlYWs7Y2FzZVwiTGluZVN0cmluZ1wiOnM9TWF0aC5taW4ocyxOcihuLCExLHQuY29vcmRpbmF0ZXMsITAsaSxzKSk7YnJlYWs7Y2FzZVwiUG9seWdvblwiOnM9TWF0aC5taW4ocyxxcihuLCExLHQuY29vcmRpbmF0ZXMsaSxzKSk7fWlmKDA9PT1zKXJldHVybiBzfXJldHVybiBzfSh0LHRoaXMuZ2VvbWV0cmllcyk7aWYoXCJMaW5lU3RyaW5nXCI9PT10Lmdlb21ldHJ5VHlwZSgpKXJldHVybiBmdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5nZW9tZXRyeSgpLG49ci5mbGF0KCkubWFwKChlPT5ZZShbZS54LGUueV0sdC5jYW5vbmljYWwpKSk7aWYoMD09PXIubGVuZ3RoKXJldHVybiBOYU47Y29uc3QgaT1uZXcgU3IoblswXVsxXSk7bGV0IHM9MS8wO2Zvcihjb25zdCB0IG9mIGUpe3N3aXRjaCh0LnR5cGUpe2Nhc2VcIlBvaW50XCI6cz1NYXRoLm1pbihzLE5yKG4sITAsW3QuY29vcmRpbmF0ZXNdLCExLGkscykpO2JyZWFrO2Nhc2VcIkxpbmVTdHJpbmdcIjpzPU1hdGgubWluKHMsTnIobiwhMCx0LmNvb3JkaW5hdGVzLCEwLGkscykpO2JyZWFrO2Nhc2VcIlBvbHlnb25cIjpzPU1hdGgubWluKHMscXIobiwhMCx0LmNvb3JkaW5hdGVzLGkscykpO31pZigwPT09cylyZXR1cm4gc31yZXR1cm4gc30odCx0aGlzLmdlb21ldHJpZXMpO2lmKFwiUG9seWdvblwiPT09dC5nZW9tZXRyeVR5cGUoKSlyZXR1cm4gZnVuY3Rpb24odCxlKXtjb25zdCByPXQuZ2VvbWV0cnkoKTtpZigwPT09ci5sZW5ndGh8fDA9PT1yWzBdLmxlbmd0aClyZXR1cm4gTmFOO2NvbnN0IG49eHIociwwKS5tYXAoKGU9PmUubWFwKChlPT5lLm1hcCgoZT0+WWUoW2UueCxlLnldLHQuY2Fub25pY2FsKSkpKSkpKSxpPW5ldyBTcihuWzBdWzBdWzBdWzFdKTtsZXQgcz0xLzA7Zm9yKGNvbnN0IHQgb2YgZSlmb3IoY29uc3QgZSBvZiBuKXtzd2l0Y2godC50eXBlKXtjYXNlXCJQb2ludFwiOnM9TWF0aC5taW4ocyxxcihbdC5jb29yZGluYXRlc10sITEsZSxpLHMpKTticmVhaztjYXNlXCJMaW5lU3RyaW5nXCI6cz1NYXRoLm1pbihzLHFyKHQuY29vcmRpbmF0ZXMsITAsZSxpLHMpKTticmVhaztjYXNlXCJQb2x5Z29uXCI6cz1NYXRoLm1pbihzLGpyKGUsdC5jb29yZGluYXRlcyxpLHMpKTt9aWYoMD09PXMpcmV0dXJuIHN9cmV0dXJuIHN9KHQsdGhpcy5nZW9tZXRyaWVzKX1yZXR1cm4gTmFOfWVhY2hDaGlsZCgpe31vdXRwdXREZWZpbmVkKCl7cmV0dXJuICEwfX1jb25zdCBLcj17XCI9PVwiOkxlLFwiIT1cIjpEZSxcIj5cIjpqZSxcIjxcIjpPZSxcIj49XCI6VWUsXCI8PVwiOlJlLGFycmF5OmxlLGF0Om1lLGJvb2xlYW46bGUsY2FzZTpiZSxjb2FsZXNjZTpFZSxjb2xsYXRvcjpxZSxmb3JtYXQ6WmUsaW1hZ2U6R2UsaW46Z2UsXCJpbmRleC1vZlwiOnhlLGludGVycG9sYXRlOkJlLFwiaW50ZXJwb2xhdGUtaGNsXCI6QmUsXCJpbnRlcnBvbGF0ZS1sYWJcIjpCZSxsZW5ndGg6S2UsbGV0OmRlLGxpdGVyYWw6c2UsbWF0Y2g6dmUsbnVtYmVyOmxlLFwibnVtYmVyLWZvcm1hdFwiOk5lLG9iamVjdDpsZSxzbGljZTp3ZSxzdGVwOkFlLHN0cmluZzpsZSxcInRvLWJvb2xlYW5cIjpjZSxcInRvLWNvbG9yXCI6Y2UsXCJ0by1udW1iZXJcIjpjZSxcInRvLXN0cmluZ1wiOmNlLHZhcjp5ZSx3aXRoaW46cHIsZGlzdGFuY2U6R3J9O2NsYXNzIFhye2NvbnN0cnVjdG9yKHQsZSxyLG4pe3RoaXMubmFtZT10LHRoaXMudHlwZT1lLHRoaXMuX2V2YWx1YXRlPXIsdGhpcy5hcmdzPW47fWV2YWx1YXRlKHQpe3JldHVybiB0aGlzLl9ldmFsdWF0ZSh0LHRoaXMuYXJncyl9ZWFjaENoaWxkKHQpe3RoaXMuYXJncy5mb3JFYWNoKHQpO31vdXRwdXREZWZpbmVkKCl7cmV0dXJuICExfXN0YXRpYyBwYXJzZSh0LGUpe2NvbnN0IHI9dFswXSxuPVhyLmRlZmluaXRpb25zW3JdO2lmKCFuKXJldHVybiBlLmVycm9yKGBVbmtub3duIGV4cHJlc3Npb24gXCIke3J9XCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwwKTtjb25zdCBpPUFycmF5LmlzQXJyYXkobik/blswXTpuLnR5cGUscz1BcnJheS5pc0FycmF5KG4pP1tbblsxXSxuWzJdXV06bi5vdmVybG9hZHMsYT1zLmZpbHRlcigoKFtlXSk9PiFBcnJheS5pc0FycmF5KGUpfHxlLmxlbmd0aD09PXQubGVuZ3RoLTEpKTtsZXQgbz1udWxsO2Zvcihjb25zdFtuLHNdb2YgYSl7bz1uZXcgZmUoZS5yZWdpc3RyeSxRcixlLnBhdGgsbnVsbCxlLnNjb3BlKTtjb25zdCBhPVtdO2xldCBsPSExO2ZvcihsZXQgZT0xO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCByPXRbZV0saT1BcnJheS5pc0FycmF5KG4pP25bZS0xXTpuLnR5cGUscz1vLnBhcnNlKHIsMSthLmxlbmd0aCxpKTtpZighcyl7bD0hMDticmVha31hLnB1c2gocyk7fWlmKCFsKWlmKEFycmF5LmlzQXJyYXkobikmJm4ubGVuZ3RoIT09YS5sZW5ndGgpby5lcnJvcihgRXhwZWN0ZWQgJHtuLmxlbmd0aH0gYXJndW1lbnRzLCBidXQgZm91bmQgJHthLmxlbmd0aH0gaW5zdGVhZC5gKTtlbHNlIHtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKyl7Y29uc3QgZT1BcnJheS5pc0FycmF5KG4pP25bdF06bi50eXBlLHI9YVt0XTtvLmNvbmNhdCh0KzEpLmNoZWNrU3VidHlwZShlLHIudHlwZSk7fWlmKDA9PT1vLmVycm9ycy5sZW5ndGgpcmV0dXJuIG5ldyBYcihyLGkscyxhKX19aWYoMT09PWEubGVuZ3RoKWUuZXJyb3JzLnB1c2goLi4uby5lcnJvcnMpO2Vsc2Uge2NvbnN0IHI9KGEubGVuZ3RoP2E6cykubWFwKCgoW3RdKT0+e3JldHVybiBlPXQsQXJyYXkuaXNBcnJheShlKT9gKCR7ZS5tYXAod3QpLmpvaW4oXCIsIFwiKX0pYDpgKCR7d3QoZS50eXBlKX0uLi4pYDt2YXIgZTt9KSkuam9pbihcIiB8IFwiKSxuPVtdO2ZvcihsZXQgcj0xO3I8dC5sZW5ndGg7cisrKXtjb25zdCBpPWUucGFyc2UodFtyXSwxK24ubGVuZ3RoKTtpZighaSlyZXR1cm4gbnVsbDtuLnB1c2god3QoaS50eXBlKSk7fWUuZXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50cyBvZiB0eXBlICR7cn0sIGJ1dCBmb3VuZCAoJHtuLmpvaW4oXCIsIFwiKX0pIGluc3RlYWQuYCk7fXJldHVybiBudWxsfXN0YXRpYyByZWdpc3Rlcih0LGUpe1hyLmRlZmluaXRpb25zPWU7Zm9yKGNvbnN0IHIgaW4gZSl0W3JdPVhyO319ZnVuY3Rpb24gSHIodCxbZSxyLG4saV0pe2U9ZS5ldmFsdWF0ZSh0KSxyPXIuZXZhbHVhdGUodCksbj1uLmV2YWx1YXRlKHQpO2NvbnN0IHM9aT9pLmV2YWx1YXRlKHQpOjEsYT1lZShlLHIsbixzKTtpZihhKXRocm93IG5ldyBhZShhKTtyZXR1cm4gbmV3IEt0KGUvMjU1LHIvMjU1LG4vMjU1LHMsITEpfWZ1bmN0aW9uIFlyKHQsZSl7cmV0dXJuIHQgaW4gZX1mdW5jdGlvbiBKcih0LGUpe2NvbnN0IHI9ZVt0XTtyZXR1cm4gdm9pZCAwPT09cj9udWxsOnJ9ZnVuY3Rpb24gV3IodCl7cmV0dXJuIHt0eXBlOnR9fWZ1bmN0aW9uIFFyKHQpe2lmKHQgaW5zdGFuY2VvZiB5ZSlyZXR1cm4gUXIodC5ib3VuZEV4cHJlc3Npb24pO2lmKHQgaW5zdGFuY2VvZiBYciYmXCJlcnJvclwiPT09dC5uYW1lKXJldHVybiAhMTtpZih0IGluc3RhbmNlb2YgcWUpcmV0dXJuICExO2lmKHQgaW5zdGFuY2VvZiBwcilyZXR1cm4gITE7aWYodCBpbnN0YW5jZW9mIEdyKXJldHVybiAhMTtjb25zdCBlPXQgaW5zdGFuY2VvZiBjZXx8dCBpbnN0YW5jZW9mIGxlO2xldCByPSEwO3JldHVybiB0LmVhY2hDaGlsZCgodD0+e3I9ZT9yJiZRcih0KTpyJiZ0IGluc3RhbmNlb2Ygc2U7fSkpLCEhciYmdG4odCkmJnJuKHQsW1wiem9vbVwiLFwiaGVhdG1hcC1kZW5zaXR5XCIsXCJsaW5lLXByb2dyZXNzXCIsXCJhY2N1bXVsYXRlZFwiLFwiaXMtc3VwcG9ydGVkLXNjcmlwdFwiXSl9ZnVuY3Rpb24gdG4odCl7aWYodCBpbnN0YW5jZW9mIFhyKXtpZihcImdldFwiPT09dC5uYW1lJiYxPT09dC5hcmdzLmxlbmd0aClyZXR1cm4gITE7aWYoXCJmZWF0dXJlLXN0YXRlXCI9PT10Lm5hbWUpcmV0dXJuICExO2lmKFwiaGFzXCI9PT10Lm5hbWUmJjE9PT10LmFyZ3MubGVuZ3RoKXJldHVybiAhMTtpZihcInByb3BlcnRpZXNcIj09PXQubmFtZXx8XCJnZW9tZXRyeS10eXBlXCI9PT10Lm5hbWV8fFwiaWRcIj09PXQubmFtZSlyZXR1cm4gITE7aWYoL15maWx0ZXItLy50ZXN0KHQubmFtZSkpcmV0dXJuICExfWlmKHQgaW5zdGFuY2VvZiBwcilyZXR1cm4gITE7aWYodCBpbnN0YW5jZW9mIEdyKXJldHVybiAhMTtsZXQgZT0hMDtyZXR1cm4gdC5lYWNoQ2hpbGQoKHQ9PntlJiYhdG4odCkmJihlPSExKTt9KSksZX1mdW5jdGlvbiBlbih0KXtpZih0IGluc3RhbmNlb2YgWHImJlwiZmVhdHVyZS1zdGF0ZVwiPT09dC5uYW1lKXJldHVybiAhMTtsZXQgZT0hMDtyZXR1cm4gdC5lYWNoQ2hpbGQoKHQ9PntlJiYhZW4odCkmJihlPSExKTt9KSksZX1mdW5jdGlvbiBybih0LGUpe2lmKHQgaW5zdGFuY2VvZiBYciYmZS5pbmRleE9mKHQubmFtZSk+PTApcmV0dXJuICExO2xldCByPSEwO3JldHVybiB0LmVhY2hDaGlsZCgodD0+e3ImJiFybih0LGUpJiYocj0hMSk7fSkpLHJ9ZnVuY3Rpb24gbm4odCl7cmV0dXJuIHtyZXN1bHQ6XCJzdWNjZXNzXCIsdmFsdWU6dH19ZnVuY3Rpb24gc24odCl7cmV0dXJuIHtyZXN1bHQ6XCJlcnJvclwiLHZhbHVlOnR9fWZ1bmN0aW9uIGFuKHQpe3JldHVybiBcImRhdGEtZHJpdmVuXCI9PT10W1wicHJvcGVydHktdHlwZVwiXXx8XCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlblwiPT09dFtcInByb3BlcnR5LXR5cGVcIl19ZnVuY3Rpb24gb24odCl7cmV0dXJuICEhdC5leHByZXNzaW9uJiZ0LmV4cHJlc3Npb24ucGFyYW1ldGVycy5pbmRleE9mKFwiem9vbVwiKT4tMX1mdW5jdGlvbiBsbih0KXtyZXR1cm4gISF0LmV4cHJlc3Npb24mJnQuZXhwcmVzc2lvbi5pbnRlcnBvbGF0ZWR9ZnVuY3Rpb24gdW4odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBOdW1iZXI/XCJudW1iZXJcIjp0IGluc3RhbmNlb2YgU3RyaW5nP1wic3RyaW5nXCI6dCBpbnN0YW5jZW9mIEJvb2xlYW4/XCJib29sZWFuXCI6QXJyYXkuaXNBcnJheSh0KT9cImFycmF5XCI6bnVsbD09PXQ/XCJudWxsXCI6dHlwZW9mIHR9ZnVuY3Rpb24gY24odCl7cmV0dXJuIFwib2JqZWN0XCI9PXR5cGVvZiB0JiZudWxsIT09dCYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gaG4odCl7cmV0dXJuIHR9ZnVuY3Rpb24gcG4odCxlKXtjb25zdCByPVwiY29sb3JcIj09PWUudHlwZSxuPXQuc3RvcHMmJlwib2JqZWN0XCI9PXR5cGVvZiB0LnN0b3BzWzBdWzBdLGk9bnx8IShufHx2b2lkIDAhPT10LnByb3BlcnR5KSxzPXQudHlwZXx8KGxuKGUpP1wiZXhwb25lbnRpYWxcIjpcImludGVydmFsXCIpO2lmKHJ8fFwicGFkZGluZ1wiPT09ZS50eXBlKXtjb25zdCBuPXI/S3QucGFyc2U6SnQucGFyc2U7KHQ9c3Qoe30sdCkpLnN0b3BzJiYodC5zdG9wcz10LnN0b3BzLm1hcCgodD0+W3RbMF0sbih0WzFdKV0pKSksdC5kZWZhdWx0PW4odC5kZWZhdWx0P3QuZGVmYXVsdDplLmRlZmF1bHQpO31pZih0LmNvbG9yU3BhY2UmJlwicmdiXCIhPT0oYT10LmNvbG9yU3BhY2UpJiZcImhjbFwiIT09YSYmXCJsYWJcIiE9PWEpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbG9yIHNwYWNlOiBcIiR7dC5jb2xvclNwYWNlfVwiYCk7dmFyIGE7bGV0IG8sbCx1O2lmKFwiZXhwb25lbnRpYWxcIj09PXMpbz1tbjtlbHNlIGlmKFwiaW50ZXJ2YWxcIj09PXMpbz15bjtlbHNlIGlmKFwiY2F0ZWdvcmljYWxcIj09PXMpe289ZG4sbD1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdCBlIG9mIHQuc3RvcHMpbFtlWzBdXT1lWzFdO3U9dHlwZW9mIHQuc3RvcHNbMF1bMF07fWVsc2Uge2lmKFwiaWRlbnRpdHlcIiE9PXMpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZ1bmN0aW9uIHR5cGUgXCIke3N9XCJgKTtvPWduO31pZihuKXtjb25zdCByPXt9LG49W107Zm9yKGxldCBlPTA7ZTx0LnN0b3BzLmxlbmd0aDtlKyspe2NvbnN0IGk9dC5zdG9wc1tlXSxzPWlbMF0uem9vbTt2b2lkIDA9PT1yW3NdJiYocltzXT17em9vbTpzLHR5cGU6dC50eXBlLHByb3BlcnR5OnQucHJvcGVydHksZGVmYXVsdDp0LmRlZmF1bHQsc3RvcHM6W119LG4ucHVzaChzKSkscltzXS5zdG9wcy5wdXNoKFtpWzBdLnZhbHVlLGlbMV1dKTt9Y29uc3QgaT1bXTtmb3IoY29uc3QgdCBvZiBuKWkucHVzaChbclt0XS56b29tLHBuKHJbdF0sZSldKTtjb25zdCBzPXtuYW1lOlwibGluZWFyXCJ9O3JldHVybiB7a2luZDpcImNvbXBvc2l0ZVwiLGludGVycG9sYXRpb25UeXBlOnMsaW50ZXJwb2xhdGlvbkZhY3RvcjpCZS5pbnRlcnBvbGF0aW9uRmFjdG9yLmJpbmQodm9pZCAwLHMpLHpvb21TdG9wczppLm1hcCgodD0+dFswXSkpLGV2YWx1YXRlOih7em9vbTpyfSxuKT0+bW4oe3N0b3BzOmksYmFzZTp0LmJhc2V9LGUscikuZXZhbHVhdGUocixuKX19aWYoaSl7Y29uc3Qgcj1cImV4cG9uZW50aWFsXCI9PT1zP3tuYW1lOlwiZXhwb25lbnRpYWxcIixiYXNlOnZvaWQgMCE9PXQuYmFzZT90LmJhc2U6MX06bnVsbDtyZXR1cm4ge2tpbmQ6XCJjYW1lcmFcIixpbnRlcnBvbGF0aW9uVHlwZTpyLGludGVycG9sYXRpb25GYWN0b3I6QmUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHZvaWQgMCxyKSx6b29tU3RvcHM6dC5zdG9wcy5tYXAoKHQ9PnRbMF0pKSxldmFsdWF0ZTooe3pvb206cn0pPT5vKHQsZSxyLGwsdSl9fXJldHVybiB7a2luZDpcInNvdXJjZVwiLGV2YWx1YXRlKHIsbil7Y29uc3QgaT1uJiZuLnByb3BlcnRpZXM/bi5wcm9wZXJ0aWVzW3QucHJvcGVydHldOnZvaWQgMDtyZXR1cm4gdm9pZCAwPT09aT9mbih0LmRlZmF1bHQsZS5kZWZhdWx0KTpvKHQsZSxpLGwsdSl9fX1mdW5jdGlvbiBmbih0LGUscil7cmV0dXJuIHZvaWQgMCE9PXQ/dDp2b2lkIDAhPT1lP2U6dm9pZCAwIT09cj9yOnZvaWQgMH1mdW5jdGlvbiBkbih0LGUscixuLGkpe3JldHVybiBmbih0eXBlb2Ygcj09PWk/bltyXTp2b2lkIDAsdC5kZWZhdWx0LGUuZGVmYXVsdCl9ZnVuY3Rpb24geW4odCxlLHIpe2lmKFwibnVtYmVyXCIhPT11bihyKSlyZXR1cm4gZm4odC5kZWZhdWx0LGUuZGVmYXVsdCk7Y29uc3Qgbj10LnN0b3BzLmxlbmd0aDtpZigxPT09bilyZXR1cm4gdC5zdG9wc1swXVsxXTtpZihyPD10LnN0b3BzWzBdWzBdKXJldHVybiB0LnN0b3BzWzBdWzFdO2lmKHI+PXQuc3RvcHNbbi0xXVswXSlyZXR1cm4gdC5zdG9wc1tuLTFdWzFdO2NvbnN0IGk9X2UodC5zdG9wcy5tYXAoKHQ9PnRbMF0pKSxyKTtyZXR1cm4gdC5zdG9wc1tpXVsxXX1mdW5jdGlvbiBtbih0LGUscil7Y29uc3Qgbj12b2lkIDAhPT10LmJhc2U/dC5iYXNlOjE7aWYoXCJudW1iZXJcIiE9PXVuKHIpKXJldHVybiBmbih0LmRlZmF1bHQsZS5kZWZhdWx0KTtjb25zdCBpPXQuc3RvcHMubGVuZ3RoO2lmKDE9PT1pKXJldHVybiB0LnN0b3BzWzBdWzFdO2lmKHI8PXQuc3RvcHNbMF1bMF0pcmV0dXJuIHQuc3RvcHNbMF1bMV07aWYocj49dC5zdG9wc1tpLTFdWzBdKXJldHVybiB0LnN0b3BzW2ktMV1bMV07Y29uc3Qgcz1fZSh0LnN0b3BzLm1hcCgodD0+dFswXSkpLHIpLGE9ZnVuY3Rpb24odCxlLHIsbil7Y29uc3QgaT1uLXIscz10LXI7cmV0dXJuIDA9PT1pPzA6MT09PWU/cy9pOihNYXRoLnBvdyhlLHMpLTEpLyhNYXRoLnBvdyhlLGkpLTEpfShyLG4sdC5zdG9wc1tzXVswXSx0LnN0b3BzW3MrMV1bMF0pLG89dC5zdG9wc1tzXVsxXSxsPXQuc3RvcHNbcysxXVsxXSx1PUNlW2UudHlwZV18fGhuO3JldHVybiBcImZ1bmN0aW9uXCI9PXR5cGVvZiBvLmV2YWx1YXRlP3tldmFsdWF0ZSguLi5lKXtjb25zdCByPW8uZXZhbHVhdGUuYXBwbHkodm9pZCAwLGUpLG49bC5ldmFsdWF0ZS5hcHBseSh2b2lkIDAsZSk7aWYodm9pZCAwIT09ciYmdm9pZCAwIT09bilyZXR1cm4gdShyLG4sYSx0LmNvbG9yU3BhY2UpfX06dShvLGwsYSx0LmNvbG9yU3BhY2UpfWZ1bmN0aW9uIGduKHQsZSxyKXtzd2l0Y2goZS50eXBlKXtjYXNlXCJjb2xvclwiOnI9S3QucGFyc2Uocik7YnJlYWs7Y2FzZVwiZm9ybWF0dGVkXCI6cj1ZdC5mcm9tU3RyaW5nKHIudG9TdHJpbmcoKSk7YnJlYWs7Y2FzZVwicmVzb2x2ZWRJbWFnZVwiOnI9dGUuZnJvbVN0cmluZyhyLnRvU3RyaW5nKCkpO2JyZWFrO2Nhc2VcInBhZGRpbmdcIjpyPUp0LnBhcnNlKHIpO2JyZWFrO2RlZmF1bHQ6dW4ocik9PT1lLnR5cGV8fFwiZW51bVwiPT09ZS50eXBlJiZlLnZhbHVlc1tyXXx8KHI9dm9pZCAwKTt9cmV0dXJuIGZuKHIsdC5kZWZhdWx0LGUuZGVmYXVsdCl9WHIucmVnaXN0ZXIoS3Ise2Vycm9yOlt7a2luZDpcImVycm9yXCJ9LFtjdF0sKHQsW2VdKT0+e3Rocm93IG5ldyBhZShlLmV2YWx1YXRlKHQpKX1dLHR5cGVvZjpbY3QsW2R0XSwodCxbZV0pPT53dChuZShlLmV2YWx1YXRlKHQpKSldLFwidG8tcmdiYVwiOltidCh1dCw0KSxbcHRdLCh0LFtlXSk9Pntjb25zdFtyLG4saSxzXT1lLmV2YWx1YXRlKHQpLnJnYjtyZXR1cm4gWzI1NSpyLDI1NSpuLDI1NSppLHNdfV0scmdiOltwdCxbdXQsdXQsdXRdLEhyXSxyZ2JhOltwdCxbdXQsdXQsdXQsdXRdLEhyXSxoYXM6e3R5cGU6aHQsb3ZlcmxvYWRzOltbW2N0XSwodCxbZV0pPT5ZcihlLmV2YWx1YXRlKHQpLHQucHJvcGVydGllcygpKV0sW1tjdCxmdF0sKHQsW2Uscl0pPT5ZcihlLmV2YWx1YXRlKHQpLHIuZXZhbHVhdGUodCkpXV19LGdldDp7dHlwZTpkdCxvdmVybG9hZHM6W1tbY3RdLCh0LFtlXSk9PkpyKGUuZXZhbHVhdGUodCksdC5wcm9wZXJ0aWVzKCkpXSxbW2N0LGZ0XSwodCxbZSxyXSk9PkpyKGUuZXZhbHVhdGUodCksci5ldmFsdWF0ZSh0KSldXX0sXCJmZWF0dXJlLXN0YXRlXCI6W2R0LFtjdF0sKHQsW2VdKT0+SnIoZS5ldmFsdWF0ZSh0KSx0LmZlYXR1cmVTdGF0ZXx8e30pXSxwcm9wZXJ0aWVzOltmdCxbXSx0PT50LnByb3BlcnRpZXMoKV0sXCJnZW9tZXRyeS10eXBlXCI6W2N0LFtdLHQ9PnQuZ2VvbWV0cnlUeXBlKCldLGlkOltkdCxbXSx0PT50LmlkKCldLHpvb206W3V0LFtdLHQ9PnQuZ2xvYmFscy56b29tXSxcImhlYXRtYXAtZGVuc2l0eVwiOlt1dCxbXSx0PT50Lmdsb2JhbHMuaGVhdG1hcERlbnNpdHl8fDBdLFwibGluZS1wcm9ncmVzc1wiOlt1dCxbXSx0PT50Lmdsb2JhbHMubGluZVByb2dyZXNzfHwwXSxhY2N1bXVsYXRlZDpbZHQsW10sdD0+dm9pZCAwPT09dC5nbG9iYWxzLmFjY3VtdWxhdGVkP251bGw6dC5nbG9iYWxzLmFjY3VtdWxhdGVkXSxcIitcIjpbdXQsV3IodXQpLCh0LGUpPT57bGV0IHI9MDtmb3IoY29uc3QgbiBvZiBlKXIrPW4uZXZhbHVhdGUodCk7cmV0dXJuIHJ9XSxcIipcIjpbdXQsV3IodXQpLCh0LGUpPT57bGV0IHI9MTtmb3IoY29uc3QgbiBvZiBlKXIqPW4uZXZhbHVhdGUodCk7cmV0dXJuIHJ9XSxcIi1cIjp7dHlwZTp1dCxvdmVybG9hZHM6W1tbdXQsdXRdLCh0LFtlLHJdKT0+ZS5ldmFsdWF0ZSh0KS1yLmV2YWx1YXRlKHQpXSxbW3V0XSwodCxbZV0pPT4tZS5ldmFsdWF0ZSh0KV1dfSxcIi9cIjpbdXQsW3V0LHV0XSwodCxbZSxyXSk9PmUuZXZhbHVhdGUodCkvci5ldmFsdWF0ZSh0KV0sXCIlXCI6W3V0LFt1dCx1dF0sKHQsW2Uscl0pPT5lLmV2YWx1YXRlKHQpJXIuZXZhbHVhdGUodCldLGxuMjpbdXQsW10sKCk9Pk1hdGguTE4yXSxwaTpbdXQsW10sKCk9Pk1hdGguUEldLGU6W3V0LFtdLCgpPT5NYXRoLkVdLFwiXlwiOlt1dCxbdXQsdXRdLCh0LFtlLHJdKT0+TWF0aC5wb3coZS5ldmFsdWF0ZSh0KSxyLmV2YWx1YXRlKHQpKV0sc3FydDpbdXQsW3V0XSwodCxbZV0pPT5NYXRoLnNxcnQoZS5ldmFsdWF0ZSh0KSldLGxvZzEwOlt1dCxbdXRdLCh0LFtlXSk9Pk1hdGgubG9nKGUuZXZhbHVhdGUodCkpL01hdGguTE4xMF0sbG46W3V0LFt1dF0sKHQsW2VdKT0+TWF0aC5sb2coZS5ldmFsdWF0ZSh0KSldLGxvZzI6W3V0LFt1dF0sKHQsW2VdKT0+TWF0aC5sb2coZS5ldmFsdWF0ZSh0KSkvTWF0aC5MTjJdLHNpbjpbdXQsW3V0XSwodCxbZV0pPT5NYXRoLnNpbihlLmV2YWx1YXRlKHQpKV0sY29zOlt1dCxbdXRdLCh0LFtlXSk9Pk1hdGguY29zKGUuZXZhbHVhdGUodCkpXSx0YW46W3V0LFt1dF0sKHQsW2VdKT0+TWF0aC50YW4oZS5ldmFsdWF0ZSh0KSldLGFzaW46W3V0LFt1dF0sKHQsW2VdKT0+TWF0aC5hc2luKGUuZXZhbHVhdGUodCkpXSxhY29zOlt1dCxbdXRdLCh0LFtlXSk9Pk1hdGguYWNvcyhlLmV2YWx1YXRlKHQpKV0sYXRhbjpbdXQsW3V0XSwodCxbZV0pPT5NYXRoLmF0YW4oZS5ldmFsdWF0ZSh0KSldLG1pbjpbdXQsV3IodXQpLCh0LGUpPT5NYXRoLm1pbiguLi5lLm1hcCgoZT0+ZS5ldmFsdWF0ZSh0KSkpKV0sbWF4Olt1dCxXcih1dCksKHQsZSk9Pk1hdGgubWF4KC4uLmUubWFwKChlPT5lLmV2YWx1YXRlKHQpKSkpXSxhYnM6W3V0LFt1dF0sKHQsW2VdKT0+TWF0aC5hYnMoZS5ldmFsdWF0ZSh0KSldLHJvdW5kOlt1dCxbdXRdLCh0LFtlXSk9Pntjb25zdCByPWUuZXZhbHVhdGUodCk7cmV0dXJuIHI8MD8tTWF0aC5yb3VuZCgtcik6TWF0aC5yb3VuZChyKX1dLGZsb29yOlt1dCxbdXRdLCh0LFtlXSk9Pk1hdGguZmxvb3IoZS5ldmFsdWF0ZSh0KSldLGNlaWw6W3V0LFt1dF0sKHQsW2VdKT0+TWF0aC5jZWlsKGUuZXZhbHVhdGUodCkpXSxcImZpbHRlci09PVwiOltodCxbY3QsZHRdLCh0LFtlLHJdKT0+dC5wcm9wZXJ0aWVzKClbZS52YWx1ZV09PT1yLnZhbHVlXSxcImZpbHRlci1pZC09PVwiOltodCxbZHRdLCh0LFtlXSk9PnQuaWQoKT09PWUudmFsdWVdLFwiZmlsdGVyLXR5cGUtPT1cIjpbaHQsW2N0XSwodCxbZV0pPT50Lmdlb21ldHJ5VHlwZSgpPT09ZS52YWx1ZV0sXCJmaWx0ZXItPFwiOltodCxbY3QsZHRdLCh0LFtlLHJdKT0+e2NvbnN0IG49dC5wcm9wZXJ0aWVzKClbZS52YWx1ZV0saT1yLnZhbHVlO3JldHVybiB0eXBlb2Ygbj09dHlwZW9mIGkmJm48aX1dLFwiZmlsdGVyLWlkLTxcIjpbaHQsW2R0XSwodCxbZV0pPT57Y29uc3Qgcj10LmlkKCksbj1lLnZhbHVlO3JldHVybiB0eXBlb2Ygcj09dHlwZW9mIG4mJnI8bn1dLFwiZmlsdGVyLT5cIjpbaHQsW2N0LGR0XSwodCxbZSxyXSk9Pntjb25zdCBuPXQucHJvcGVydGllcygpW2UudmFsdWVdLGk9ci52YWx1ZTtyZXR1cm4gdHlwZW9mIG49PXR5cGVvZiBpJiZuPml9XSxcImZpbHRlci1pZC0+XCI6W2h0LFtkdF0sKHQsW2VdKT0+e2NvbnN0IHI9dC5pZCgpLG49ZS52YWx1ZTtyZXR1cm4gdHlwZW9mIHI9PXR5cGVvZiBuJiZyPm59XSxcImZpbHRlci08PVwiOltodCxbY3QsZHRdLCh0LFtlLHJdKT0+e2NvbnN0IG49dC5wcm9wZXJ0aWVzKClbZS52YWx1ZV0saT1yLnZhbHVlO3JldHVybiB0eXBlb2Ygbj09dHlwZW9mIGkmJm48PWl9XSxcImZpbHRlci1pZC08PVwiOltodCxbZHRdLCh0LFtlXSk9Pntjb25zdCByPXQuaWQoKSxuPWUudmFsdWU7cmV0dXJuIHR5cGVvZiByPT10eXBlb2YgbiYmcjw9bn1dLFwiZmlsdGVyLT49XCI6W2h0LFtjdCxkdF0sKHQsW2Uscl0pPT57Y29uc3Qgbj10LnByb3BlcnRpZXMoKVtlLnZhbHVlXSxpPXIudmFsdWU7cmV0dXJuIHR5cGVvZiBuPT10eXBlb2YgaSYmbj49aX1dLFwiZmlsdGVyLWlkLT49XCI6W2h0LFtkdF0sKHQsW2VdKT0+e2NvbnN0IHI9dC5pZCgpLG49ZS52YWx1ZTtyZXR1cm4gdHlwZW9mIHI9PXR5cGVvZiBuJiZyPj1ufV0sXCJmaWx0ZXItaGFzXCI6W2h0LFtkdF0sKHQsW2VdKT0+ZS52YWx1ZSBpbiB0LnByb3BlcnRpZXMoKV0sXCJmaWx0ZXItaGFzLWlkXCI6W2h0LFtdLHQ9Pm51bGwhPT10LmlkKCkmJnZvaWQgMCE9PXQuaWQoKV0sXCJmaWx0ZXItdHlwZS1pblwiOltodCxbYnQoY3QpXSwodCxbZV0pPT5lLnZhbHVlLmluZGV4T2YodC5nZW9tZXRyeVR5cGUoKSk+PTBdLFwiZmlsdGVyLWlkLWluXCI6W2h0LFtidChkdCldLCh0LFtlXSk9PmUudmFsdWUuaW5kZXhPZih0LmlkKCkpPj0wXSxcImZpbHRlci1pbi1zbWFsbFwiOltodCxbY3QsYnQoZHQpXSwodCxbZSxyXSk9PnIudmFsdWUuaW5kZXhPZih0LnByb3BlcnRpZXMoKVtlLnZhbHVlXSk+PTBdLFwiZmlsdGVyLWluLWxhcmdlXCI6W2h0LFtjdCxidChkdCldLCh0LFtlLHJdKT0+ZnVuY3Rpb24odCxlLHIsbil7Zm9yKDtyPD1uOyl7Y29uc3QgaT1yK24+PjE7aWYoZVtpXT09PXQpcmV0dXJuICEwO2VbaV0+dD9uPWktMTpyPWkrMTt9cmV0dXJuICExfSh0LnByb3BlcnRpZXMoKVtlLnZhbHVlXSxyLnZhbHVlLDAsci52YWx1ZS5sZW5ndGgtMSldLGFsbDp7dHlwZTpodCxvdmVybG9hZHM6W1tbaHQsaHRdLCh0LFtlLHJdKT0+ZS5ldmFsdWF0ZSh0KSYmci5ldmFsdWF0ZSh0KV0sW1dyKGh0KSwodCxlKT0+e2Zvcihjb25zdCByIG9mIGUpaWYoIXIuZXZhbHVhdGUodCkpcmV0dXJuICExO3JldHVybiAhMH1dXX0sYW55Ont0eXBlOmh0LG92ZXJsb2FkczpbW1todCxodF0sKHQsW2Uscl0pPT5lLmV2YWx1YXRlKHQpfHxyLmV2YWx1YXRlKHQpXSxbV3IoaHQpLCh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZihyLmV2YWx1YXRlKHQpKXJldHVybiAhMDtyZXR1cm4gITF9XV19LFwiIVwiOltodCxbaHRdLCh0LFtlXSk9PiFlLmV2YWx1YXRlKHQpXSxcImlzLXN1cHBvcnRlZC1zY3JpcHRcIjpbaHQsW2N0XSwodCxbZV0pPT57Y29uc3Qgcj10Lmdsb2JhbHMmJnQuZ2xvYmFscy5pc1N1cHBvcnRlZFNjcmlwdDtyZXR1cm4gIXJ8fHIoZS5ldmFsdWF0ZSh0KSl9XSx1cGNhc2U6W2N0LFtjdF0sKHQsW2VdKT0+ZS5ldmFsdWF0ZSh0KS50b1VwcGVyQ2FzZSgpXSxkb3duY2FzZTpbY3QsW2N0XSwodCxbZV0pPT5lLmV2YWx1YXRlKHQpLnRvTG93ZXJDYXNlKCldLGNvbmNhdDpbY3QsV3IoZHQpLCh0LGUpPT5lLm1hcCgoZT0+aWUoZS5ldmFsdWF0ZSh0KSkpKS5qb2luKFwiXCIpXSxcInJlc29sdmVkLWxvY2FsZVwiOltjdCxbeXRdLCh0LFtlXSk9PmUuZXZhbHVhdGUodCkucmVzb2x2ZWRMb2NhbGUoKV19KTtjbGFzcyB4bntjb25zdHJ1Y3Rvcih0LGUpe3ZhciByO3RoaXMuZXhwcmVzc2lvbj10LHRoaXMuX3dhcm5pbmdIaXN0b3J5PXt9LHRoaXMuX2V2YWx1YXRvcj1uZXcgcGUsdGhpcy5fZGVmYXVsdFZhbHVlPWU/XCJjb2xvclwiPT09KHI9ZSkudHlwZSYmY24oci5kZWZhdWx0KT9uZXcgS3QoMCwwLDAsMCk6XCJjb2xvclwiPT09ci50eXBlP0t0LnBhcnNlKHIuZGVmYXVsdCl8fG51bGw6XCJwYWRkaW5nXCI9PT1yLnR5cGU/SnQucGFyc2Uoci5kZWZhdWx0KXx8bnVsbDpcInZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvblwiPT09ci50eXBlP1F0LnBhcnNlKHIuZGVmYXVsdCl8fG51bGw6dm9pZCAwPT09ci5kZWZhdWx0P251bGw6ci5kZWZhdWx0Om51bGwsdGhpcy5fZW51bVZhbHVlcz1lJiZcImVudW1cIj09PWUudHlwZT9lLnZhbHVlczpudWxsO31ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKHQsZSxyLG4saSxzKXtyZXR1cm4gdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHM9dCx0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZT1lLHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlU3RhdGU9cix0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsPW4sdGhpcy5fZXZhbHVhdG9yLmF2YWlsYWJsZUltYWdlcz1pfHxudWxsLHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uPXMsdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHRoaXMuX2V2YWx1YXRvcil9ZXZhbHVhdGUodCxlLHIsbixpLHMpe3RoaXMuX2V2YWx1YXRvci5nbG9iYWxzPXQsdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmU9ZXx8bnVsbCx0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZVN0YXRlPXJ8fG51bGwsdGhpcy5fZXZhbHVhdG9yLmNhbm9uaWNhbD1uLHRoaXMuX2V2YWx1YXRvci5hdmFpbGFibGVJbWFnZXM9aXx8bnVsbCx0aGlzLl9ldmFsdWF0b3IuZm9ybWF0dGVkU2VjdGlvbj1zfHxudWxsO3RyeXtjb25zdCB0PXRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0aGlzLl9ldmFsdWF0b3IpO2lmKG51bGw9PXR8fFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0IT10KXJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7aWYodGhpcy5fZW51bVZhbHVlcyYmISh0IGluIHRoaXMuX2VudW1WYWx1ZXMpKXRocm93IG5ldyBhZShgRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb25lIG9mICR7T2JqZWN0LmtleXModGhpcy5fZW51bVZhbHVlcykubWFwKCh0PT5KU09OLnN0cmluZ2lmeSh0KSkpLmpvaW4oXCIsIFwiKX0sIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KHQpfSBpbnN0ZWFkLmApO3JldHVybiB0fWNhdGNoKHQpe3JldHVybiB0aGlzLl93YXJuaW5nSGlzdG9yeVt0Lm1lc3NhZ2VdfHwodGhpcy5fd2FybmluZ0hpc3RvcnlbdC5tZXNzYWdlXT0hMCxcInVuZGVmaW5lZFwiIT10eXBlb2YgY29uc29sZSYmY29uc29sZS53YXJuKHQubWVzc2FnZSkpLHRoaXMuX2RlZmF1bHRWYWx1ZX19fWZ1bmN0aW9uIHZuKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aD4wJiZcInN0cmluZ1wiPT10eXBlb2YgdFswXSYmdFswXWluIEtyfWZ1bmN0aW9uIGJuKHQsZSl7Y29uc3Qgcj1uZXcgZmUoS3IsUXIsW10sZT9mdW5jdGlvbih0KXtjb25zdCBlPXtjb2xvcjpwdCxzdHJpbmc6Y3QsbnVtYmVyOnV0LGVudW06Y3QsYm9vbGVhbjpodCxmb3JtYXR0ZWQ6bXQscGFkZGluZzpndCxyZXNvbHZlZEltYWdlOnh0LHZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvbjp2dH07cmV0dXJuIFwiYXJyYXlcIj09PXQudHlwZT9idChlW3QudmFsdWVdfHxkdCx0Lmxlbmd0aCk6ZVt0LnR5cGVdfShlKTp2b2lkIDApLG49ci5wYXJzZSh0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLGUmJlwic3RyaW5nXCI9PT1lLnR5cGU/e3R5cGVBbm5vdGF0aW9uOlwiY29lcmNlXCJ9OnZvaWQgMCk7cmV0dXJuIG4/bm4obmV3IHhuKG4sZSkpOnNuKHIuZXJyb3JzKX1jbGFzcyB3bntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMua2luZD10LHRoaXMuX3N0eWxlRXhwcmVzc2lvbj1lLHRoaXMuaXNTdGF0ZURlcGVuZGVudD1cImNvbnN0YW50XCIhPT10JiYhZW4oZS5leHByZXNzaW9uKTt9ZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyh0LGUscixuLGkscyl7cmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKHQsZSxyLG4saSxzKX1ldmFsdWF0ZSh0LGUscixuLGkscyl7cmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZSh0LGUscixuLGkscyl9fWNsYXNzIF9ue2NvbnN0cnVjdG9yKHQsZSxyLG4pe3RoaXMua2luZD10LHRoaXMuem9vbVN0b3BzPXIsdGhpcy5fc3R5bGVFeHByZXNzaW9uPWUsdGhpcy5pc1N0YXRlRGVwZW5kZW50PVwiY2FtZXJhXCIhPT10JiYhZW4oZS5leHByZXNzaW9uKSx0aGlzLmludGVycG9sYXRpb25UeXBlPW47fWV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcodCxlLHIsbixpLHMpe3JldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyh0LGUscixuLGkscyl9ZXZhbHVhdGUodCxlLHIsbixpLHMpe3JldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGUodCxlLHIsbixpLHMpfWludGVycG9sYXRpb25GYWN0b3IodCxlLHIpe3JldHVybiB0aGlzLmludGVycG9sYXRpb25UeXBlP0JlLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uVHlwZSx0LGUscik6MH19ZnVuY3Rpb24gQW4odCxlKXtjb25zdCByPWJuKHQsZSk7aWYoXCJlcnJvclwiPT09ci5yZXN1bHQpcmV0dXJuIHI7Y29uc3Qgbj1yLnZhbHVlLmV4cHJlc3Npb24saT10bihuKTtpZighaSYmIWFuKGUpKXJldHVybiBzbihbbmV3IGF0KFwiXCIsXCJkYXRhIGV4cHJlc3Npb25zIG5vdCBzdXBwb3J0ZWRcIildKTtjb25zdCBzPXJuKG4sW1wiem9vbVwiXSk7aWYoIXMmJiFvbihlKSlyZXR1cm4gc24oW25ldyBhdChcIlwiLFwiem9vbSBleHByZXNzaW9ucyBub3Qgc3VwcG9ydGVkXCIpXSk7Y29uc3QgYT1rbihuKTtyZXR1cm4gYXx8cz9hIGluc3RhbmNlb2YgYXQ/c24oW2FdKTphIGluc3RhbmNlb2YgQmUmJiFsbihlKT9zbihbbmV3IGF0KFwiXCIsJ1wiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgcHJvcGVydHknKV0pOm5uKGE/bmV3IF9uKGk/XCJjYW1lcmFcIjpcImNvbXBvc2l0ZVwiLHIudmFsdWUsYS5sYWJlbHMsYSBpbnN0YW5jZW9mIEJlP2EuaW50ZXJwb2xhdGlvbjp2b2lkIDApOm5ldyB3bihpP1wiY29uc3RhbnRcIjpcInNvdXJjZVwiLHIudmFsdWUpKTpzbihbbmV3IGF0KFwiXCIsJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKV0pfWNsYXNzIFNue2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fcGFyYW1ldGVycz10LHRoaXMuX3NwZWNpZmljYXRpb249ZSxzdCh0aGlzLHBuKHRoaXMuX3BhcmFtZXRlcnMsdGhpcy5fc3BlY2lmaWNhdGlvbikpO31zdGF0aWMgZGVzZXJpYWxpemUodCl7cmV0dXJuIG5ldyBTbih0Ll9wYXJhbWV0ZXJzLHQuX3NwZWNpZmljYXRpb24pfXN0YXRpYyBzZXJpYWxpemUodCl7cmV0dXJuIHtfcGFyYW1ldGVyczp0Ll9wYXJhbWV0ZXJzLF9zcGVjaWZpY2F0aW9uOnQuX3NwZWNpZmljYXRpb259fX1mdW5jdGlvbiBrbih0KXtsZXQgZT1udWxsO2lmKHQgaW5zdGFuY2VvZiBkZSllPWtuKHQucmVzdWx0KTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBFZSl7Zm9yKGNvbnN0IHIgb2YgdC5hcmdzKWlmKGU9a24ociksZSlicmVha31lbHNlICh0IGluc3RhbmNlb2YgQWV8fHQgaW5zdGFuY2VvZiBCZSkmJnQuaW5wdXQgaW5zdGFuY2VvZiBYciYmXCJ6b29tXCI9PT10LmlucHV0Lm5hbWUmJihlPXQpO3JldHVybiBlIGluc3RhbmNlb2YgYXR8fHQuZWFjaENoaWxkKCh0PT57Y29uc3Qgcj1rbih0KTtyIGluc3RhbmNlb2YgYXQ/ZT1yOiFlJiZyP2U9bmV3IGF0KFwiXCIsJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKTplJiZyJiZlIT09ciYmKGU9bmV3IGF0KFwiXCIsJ09ubHkgb25lIHpvb20tYmFzZWQgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIHN1YmV4cHJlc3Npb24gbWF5IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4nKSk7fSkpLGV9ZnVuY3Rpb24gTW4odCl7aWYoITA9PT10fHwhMT09PXQpcmV0dXJuICEwO2lmKCFBcnJheS5pc0FycmF5KHQpfHwwPT09dC5sZW5ndGgpcmV0dXJuICExO3N3aXRjaCh0WzBdKXtjYXNlXCJoYXNcIjpyZXR1cm4gdC5sZW5ndGg+PTImJlwiJGlkXCIhPT10WzFdJiZcIiR0eXBlXCIhPT10WzFdO2Nhc2VcImluXCI6cmV0dXJuIHQubGVuZ3RoPj0zJiYoXCJzdHJpbmdcIiE9dHlwZW9mIHRbMV18fEFycmF5LmlzQXJyYXkodFsyXSkpO2Nhc2VcIiFpblwiOmNhc2VcIiFoYXNcIjpjYXNlXCJub25lXCI6cmV0dXJuICExO2Nhc2VcIj09XCI6Y2FzZVwiIT1cIjpjYXNlXCI+XCI6Y2FzZVwiPj1cIjpjYXNlXCI8XCI6Y2FzZVwiPD1cIjpyZXR1cm4gMyE9PXQubGVuZ3RofHxBcnJheS5pc0FycmF5KHRbMV0pfHxBcnJheS5pc0FycmF5KHRbMl0pO2Nhc2VcImFueVwiOmNhc2VcImFsbFwiOmZvcihjb25zdCBlIG9mIHQuc2xpY2UoMSkpaWYoIU1uKGUpJiZcImJvb2xlYW5cIiE9dHlwZW9mIGUpcmV0dXJuICExO3JldHVybiAhMDtkZWZhdWx0OnJldHVybiAhMH19Y29uc3QgSW49e3R5cGU6XCJib29sZWFuXCIsZGVmYXVsdDohMSx0cmFuc2l0aW9uOiExLFwicHJvcGVydHktdHlwZVwiOlwiZGF0YS1kcml2ZW5cIixleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbXCJ6b29tXCIsXCJmZWF0dXJlXCJdfX07ZnVuY3Rpb24gem4odCl7aWYobnVsbD09dClyZXR1cm4ge2ZpbHRlcjooKT0+ITAsbmVlZEdlb21ldHJ5OiExfTtNbih0KXx8KHQ9Qm4odCkpO2NvbnN0IGU9Ym4odCxJbik7aWYoXCJlcnJvclwiPT09ZS5yZXN1bHQpdGhyb3cgbmV3IEVycm9yKGUudmFsdWUubWFwKCh0PT5gJHt0LmtleX06ICR7dC5tZXNzYWdlfWApKS5qb2luKFwiLCBcIikpO3JldHVybiB7ZmlsdGVyOih0LHIsbik9PmUudmFsdWUuZXZhbHVhdGUodCxyLHt9LG4pLG5lZWRHZW9tZXRyeTpDbih0KX19ZnVuY3Rpb24gUG4odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9ZnVuY3Rpb24gQ24odCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuICExO2lmKFwid2l0aGluXCI9PT10WzBdfHxcImRpc3RhbmNlXCI9PT10WzBdKXJldHVybiAhMDtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrKylpZihDbih0W2VdKSlyZXR1cm4gITA7cmV0dXJuICExfWZ1bmN0aW9uIEJuKHQpe2lmKCF0KXJldHVybiAhMDtjb25zdCBlPXRbMF07cmV0dXJuIHQubGVuZ3RoPD0xP1wiYW55XCIhPT1lOlwiPT1cIj09PWU/Vm4odFsxXSx0WzJdLFwiPT1cIik6XCIhPVwiPT09ZT9UbihWbih0WzFdLHRbMl0sXCI9PVwiKSk6XCI8XCI9PT1lfHxcIj5cIj09PWV8fFwiPD1cIj09PWV8fFwiPj1cIj09PWU/Vm4odFsxXSx0WzJdLGUpOlwiYW55XCI9PT1lPyhyPXQuc2xpY2UoMSksW1wiYW55XCJdLmNvbmNhdChyLm1hcChCbikpKTpcImFsbFwiPT09ZT9bXCJhbGxcIl0uY29uY2F0KHQuc2xpY2UoMSkubWFwKEJuKSk6XCJub25lXCI9PT1lP1tcImFsbFwiXS5jb25jYXQodC5zbGljZSgxKS5tYXAoQm4pLm1hcChUbikpOlwiaW5cIj09PWU/RW4odFsxXSx0LnNsaWNlKDIpKTpcIiFpblwiPT09ZT9UbihFbih0WzFdLHQuc2xpY2UoMikpKTpcImhhc1wiPT09ZT9Gbih0WzFdKTpcIiFoYXNcIiE9PWV8fFRuKEZuKHRbMV0pKTt2YXIgcjt9ZnVuY3Rpb24gVm4odCxlLHIpe3N3aXRjaCh0KXtjYXNlXCIkdHlwZVwiOnJldHVybiBbYGZpbHRlci10eXBlLSR7cn1gLGVdO2Nhc2VcIiRpZFwiOnJldHVybiBbYGZpbHRlci1pZC0ke3J9YCxlXTtkZWZhdWx0OnJldHVybiBbYGZpbHRlci0ke3J9YCx0LGVdfX1mdW5jdGlvbiBFbih0LGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gITE7c3dpdGNoKHQpe2Nhc2VcIiR0eXBlXCI6cmV0dXJuIFtcImZpbHRlci10eXBlLWluXCIsW1wibGl0ZXJhbFwiLGVdXTtjYXNlXCIkaWRcIjpyZXR1cm4gW1wiZmlsdGVyLWlkLWluXCIsW1wibGl0ZXJhbFwiLGVdXTtkZWZhdWx0OnJldHVybiBlLmxlbmd0aD4yMDAmJiFlLnNvbWUoKHQ9PnR5cGVvZiB0IT10eXBlb2YgZVswXSkpP1tcImZpbHRlci1pbi1sYXJnZVwiLHQsW1wibGl0ZXJhbFwiLGUuc29ydChQbildXTpbXCJmaWx0ZXItaW4tc21hbGxcIix0LFtcImxpdGVyYWxcIixlXV19fWZ1bmN0aW9uIEZuKHQpe3N3aXRjaCh0KXtjYXNlXCIkdHlwZVwiOnJldHVybiAhMDtjYXNlXCIkaWRcIjpyZXR1cm4gW1wiZmlsdGVyLWhhcy1pZFwiXTtkZWZhdWx0OnJldHVybiBbXCJmaWx0ZXItaGFzXCIsdF19fWZ1bmN0aW9uIFRuKHQpe3JldHVybiBbXCIhXCIsdF19ZnVuY3Rpb24gJG4odCl7Y29uc3QgZT10eXBlb2YgdDtpZihcIm51bWJlclwiPT09ZXx8XCJib29sZWFuXCI9PT1lfHxcInN0cmluZ1wiPT09ZXx8bnVsbD09dClyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCk7aWYoQXJyYXkuaXNBcnJheSh0KSl7bGV0IGU9XCJbXCI7Zm9yKGNvbnN0IHIgb2YgdCllKz1gJHskbihyKX0sYDtyZXR1cm4gYCR7ZX1dYH1jb25zdCByPU9iamVjdC5rZXlzKHQpLnNvcnQoKTtsZXQgbj1cIntcIjtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKyluKz1gJHtKU09OLnN0cmluZ2lmeShyW2VdKX06JHskbih0W3JbZV1dKX0sYDtyZXR1cm4gYCR7bn19YH1mdW5jdGlvbiBMbih0KXtsZXQgZT1cIlwiO2Zvcihjb25zdCByIG9mIEspZSs9YC8keyRuKHRbcl0pfWA7cmV0dXJuIGV9ZnVuY3Rpb24gRG4odCl7Y29uc3QgZT10LnZhbHVlO3JldHVybiBlP1tuZXcgaXQodC5rZXksZSxcImNvbnN0YW50cyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhcyBvZiB2OFwiKV06W119ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBOdW1iZXJ8fHQgaW5zdGFuY2VvZiBTdHJpbmd8fHQgaW5zdGFuY2VvZiBCb29sZWFuP3QudmFsdWVPZigpOnR9ZnVuY3Rpb24gam4odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5tYXAoam4pO2lmKHQgaW5zdGFuY2VvZiBPYmplY3QmJiEodCBpbnN0YW5jZW9mIE51bWJlcnx8dCBpbnN0YW5jZW9mIFN0cmluZ3x8dCBpbnN0YW5jZW9mIEJvb2xlYW4pKXtjb25zdCBlPXt9O2Zvcihjb25zdCByIGluIHQpZVtyXT1qbih0W3JdKTtyZXR1cm4gZX1yZXR1cm4gT24odCl9ZnVuY3Rpb24gUm4odCl7Y29uc3QgZT10LmtleSxyPXQudmFsdWUsbj10LnZhbHVlU3BlY3x8e30saT10Lm9iamVjdEVsZW1lbnRWYWxpZGF0b3JzfHx7fSxzPXQuc3R5bGUsYT10LnN0eWxlU3BlYyxvPXQudmFsaWRhdGVTcGVjO2xldCBsPVtdO2NvbnN0IHU9dW4ocik7aWYoXCJvYmplY3RcIiE9PXUpcmV0dXJuIFtuZXcgaXQoZSxyLGBvYmplY3QgZXhwZWN0ZWQsICR7dX0gZm91bmRgKV07Zm9yKGNvbnN0IHQgaW4gcil7Y29uc3QgdT10LnNwbGl0KFwiLlwiKVswXSxjPW5bdV18fG5bXCIqXCJdO2xldCBoO2lmKGlbdV0paD1pW3VdO2Vsc2UgaWYoblt1XSloPW87ZWxzZSBpZihpW1wiKlwiXSloPWlbXCIqXCJdO2Vsc2Uge2lmKCFuW1wiKlwiXSl7bC5wdXNoKG5ldyBpdChlLHJbdF0sYHVua25vd24gcHJvcGVydHkgXCIke3R9XCJgKSk7Y29udGludWV9aD1vO31sPWwuY29uY2F0KGgoe2tleTooZT9gJHtlfS5gOmUpK3QsdmFsdWU6clt0XSx2YWx1ZVNwZWM6YyxzdHlsZTpzLHN0eWxlU3BlYzphLG9iamVjdDpyLG9iamVjdEtleTp0LHZhbGlkYXRlU3BlYzpvfSxyKSk7fWZvcihjb25zdCB0IGluIG4paVt0XXx8blt0XS5yZXF1aXJlZCYmdm9pZCAwPT09blt0XS5kZWZhdWx0JiZ2b2lkIDA9PT1yW3RdJiZsLnB1c2gobmV3IGl0KGUscixgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcIiR7dH1cImApKTtyZXR1cm4gbH1mdW5jdGlvbiBVbih0KXtjb25zdCBlPXQudmFsdWUscj10LnZhbHVlU3BlYyxuPXQuc3R5bGUsaT10LnN0eWxlU3BlYyxzPXQua2V5LGE9dC5hcnJheUVsZW1lbnRWYWxpZGF0b3J8fHQudmFsaWRhdGVTcGVjO2lmKFwiYXJyYXlcIiE9PXVuKGUpKXJldHVybiBbbmV3IGl0KHMsZSxgYXJyYXkgZXhwZWN0ZWQsICR7dW4oZSl9IGZvdW5kYCldO2lmKHIubGVuZ3RoJiZlLmxlbmd0aCE9PXIubGVuZ3RoKXJldHVybiBbbmV3IGl0KHMsZSxgYXJyYXkgbGVuZ3RoICR7ci5sZW5ndGh9IGV4cGVjdGVkLCBsZW5ndGggJHtlLmxlbmd0aH0gZm91bmRgKV07aWYocltcIm1pbi1sZW5ndGhcIl0mJmUubGVuZ3RoPHJbXCJtaW4tbGVuZ3RoXCJdKXJldHVybiBbbmV3IGl0KHMsZSxgYXJyYXkgbGVuZ3RoIGF0IGxlYXN0ICR7cltcIm1pbi1sZW5ndGhcIl19IGV4cGVjdGVkLCBsZW5ndGggJHtlLmxlbmd0aH0gZm91bmRgKV07bGV0IG89e3R5cGU6ci52YWx1ZSx2YWx1ZXM6ci52YWx1ZXN9O2kuJHZlcnNpb248NyYmKG8uZnVuY3Rpb249ci5mdW5jdGlvbiksXCJvYmplY3RcIj09PXVuKHIudmFsdWUpJiYobz1yLnZhbHVlKTtsZXQgbD1bXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylsPWwuY29uY2F0KGEoe2FycmF5OmUsYXJyYXlJbmRleDpyLHZhbHVlOmVbcl0sdmFsdWVTcGVjOm8sdmFsaWRhdGVTcGVjOnQudmFsaWRhdGVTcGVjLHN0eWxlOm4sc3R5bGVTcGVjOmksa2V5OmAke3N9WyR7cn1dYH0pKTtyZXR1cm4gbH1mdW5jdGlvbiBxbih0KXtjb25zdCBlPXQua2V5LHI9dC52YWx1ZSxuPXQudmFsdWVTcGVjO2xldCBpPXVuKHIpO3JldHVybiBcIm51bWJlclwiPT09aSYmciE9ciYmKGk9XCJOYU5cIiksXCJudW1iZXJcIiE9PWk/W25ldyBpdChlLHIsYG51bWJlciBleHBlY3RlZCwgJHtpfSBmb3VuZGApXTpcIm1pbmltdW1cImluIG4mJnI8bi5taW5pbXVtP1tuZXcgaXQoZSxyLGAke3J9IGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAke24ubWluaW11bX1gKV06XCJtYXhpbXVtXCJpbiBuJiZyPm4ubWF4aW11bT9bbmV3IGl0KGUscixgJHtyfSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJHtuLm1heGltdW19YCldOltdfWZ1bmN0aW9uIE5uKHQpe2NvbnN0IGU9dC52YWx1ZVNwZWMscj1Pbih0LnZhbHVlLnR5cGUpO2xldCBuLGkscyxhPXt9O2NvbnN0IG89XCJjYXRlZ29yaWNhbFwiIT09ciYmdm9pZCAwPT09dC52YWx1ZS5wcm9wZXJ0eSxsPSFvLHU9XCJhcnJheVwiPT09dW4odC52YWx1ZS5zdG9wcykmJlwiYXJyYXlcIj09PXVuKHQudmFsdWUuc3RvcHNbMF0pJiZcIm9iamVjdFwiPT09dW4odC52YWx1ZS5zdG9wc1swXVswXSksYz1Sbih7a2V5OnQua2V5LHZhbHVlOnQudmFsdWUsdmFsdWVTcGVjOnQuc3R5bGVTcGVjLmZ1bmN0aW9uLHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlYyxzdHlsZTp0LnN0eWxlLHN0eWxlU3BlYzp0LnN0eWxlU3BlYyxvYmplY3RFbGVtZW50VmFsaWRhdG9yczp7c3RvcHM6ZnVuY3Rpb24odCl7aWYoXCJpZGVudGl0eVwiPT09cilyZXR1cm4gW25ldyBpdCh0LmtleSx0LnZhbHVlLCdpZGVudGl0eSBmdW5jdGlvbiBtYXkgbm90IGhhdmUgYSBcInN0b3BzXCIgcHJvcGVydHknKV07bGV0IGU9W107Y29uc3Qgbj10LnZhbHVlO3JldHVybiBlPWUuY29uY2F0KFVuKHtrZXk6dC5rZXksdmFsdWU6bix2YWx1ZVNwZWM6dC52YWx1ZVNwZWMsdmFsaWRhdGVTcGVjOnQudmFsaWRhdGVTcGVjLHN0eWxlOnQuc3R5bGUsc3R5bGVTcGVjOnQuc3R5bGVTcGVjLGFycmF5RWxlbWVudFZhbGlkYXRvcjpofSkpLFwiYXJyYXlcIj09PXVuKG4pJiYwPT09bi5sZW5ndGgmJmUucHVzaChuZXcgaXQodC5rZXksbixcImFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcFwiKSksZX0sZGVmYXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdC52YWxpZGF0ZVNwZWMoe2tleTp0LmtleSx2YWx1ZTp0LnZhbHVlLHZhbHVlU3BlYzplLHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlYyxzdHlsZTp0LnN0eWxlLHN0eWxlU3BlYzp0LnN0eWxlU3BlY30pfX19KTtyZXR1cm4gXCJpZGVudGl0eVwiPT09ciYmbyYmYy5wdXNoKG5ldyBpdCh0LmtleSx0LnZhbHVlLCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKSxcImlkZW50aXR5XCI9PT1yfHx0LnZhbHVlLnN0b3BzfHxjLnB1c2gobmV3IGl0KHQua2V5LHQudmFsdWUsJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzdG9wc1wiJykpLFwiZXhwb25lbnRpYWxcIj09PXImJnQudmFsdWVTcGVjLmV4cHJlc3Npb24mJiFsbih0LnZhbHVlU3BlYykmJmMucHVzaChuZXcgaXQodC5rZXksdC52YWx1ZSxcImV4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkXCIpKSx0LnN0eWxlU3BlYy4kdmVyc2lvbj49OCYmKGwmJiFhbih0LnZhbHVlU3BlYyk/Yy5wdXNoKG5ldyBpdCh0LmtleSx0LnZhbHVlLFwicHJvcGVydHkgZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWRcIikpOm8mJiFvbih0LnZhbHVlU3BlYykmJmMucHVzaChuZXcgaXQodC5rZXksdC52YWx1ZSxcInpvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWRcIikpKSxcImNhdGVnb3JpY2FsXCIhPT1yJiYhdXx8dm9pZCAwIT09dC52YWx1ZS5wcm9wZXJ0eXx8Yy5wdXNoKG5ldyBpdCh0LmtleSx0LnZhbHVlLCdcInByb3BlcnR5XCIgcHJvcGVydHkgaXMgcmVxdWlyZWQnKSksYztmdW5jdGlvbiBoKHQpe2xldCByPVtdO2NvbnN0IG49dC52YWx1ZSxvPXQua2V5O2lmKFwiYXJyYXlcIiE9PXVuKG4pKXJldHVybiBbbmV3IGl0KG8sbixgYXJyYXkgZXhwZWN0ZWQsICR7dW4obil9IGZvdW5kYCldO2lmKDIhPT1uLmxlbmd0aClyZXR1cm4gW25ldyBpdChvLG4sYGFycmF5IGxlbmd0aCAyIGV4cGVjdGVkLCBsZW5ndGggJHtuLmxlbmd0aH0gZm91bmRgKV07aWYodSl7aWYoXCJvYmplY3RcIiE9PXVuKG5bMF0pKXJldHVybiBbbmV3IGl0KG8sbixgb2JqZWN0IGV4cGVjdGVkLCAke3VuKG5bMF0pfSBmb3VuZGApXTtpZih2b2lkIDA9PT1uWzBdLnpvb20pcmV0dXJuIFtuZXcgaXQobyxuLFwib2JqZWN0IHN0b3Aga2V5IG11c3QgaGF2ZSB6b29tXCIpXTtpZih2b2lkIDA9PT1uWzBdLnZhbHVlKXJldHVybiBbbmV3IGl0KG8sbixcIm9iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgdmFsdWVcIildO2lmKHMmJnM+T24oblswXS56b29tKSlyZXR1cm4gW25ldyBpdChvLG5bMF0uem9vbSxcInN0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyXCIpXTtPbihuWzBdLnpvb20pIT09cyYmKHM9T24oblswXS56b29tKSxpPXZvaWQgMCxhPXt9KSxyPXIuY29uY2F0KFJuKHtrZXk6YCR7b31bMF1gLHZhbHVlOm5bMF0sdmFsdWVTcGVjOnt6b29tOnt9fSx2YWxpZGF0ZVNwZWM6dC52YWxpZGF0ZVNwZWMsc3R5bGU6dC5zdHlsZSxzdHlsZVNwZWM6dC5zdHlsZVNwZWMsb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6e3pvb206cW4sdmFsdWU6cH19KSk7fWVsc2Ugcj1yLmNvbmNhdChwKHtrZXk6YCR7b31bMF1gLHZhbHVlOm5bMF0sdmFsdWVTcGVjOnt9LHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlYyxzdHlsZTp0LnN0eWxlLHN0eWxlU3BlYzp0LnN0eWxlU3BlY30sbikpO3JldHVybiB2bihqbihuWzFdKSk/ci5jb25jYXQoW25ldyBpdChgJHtvfVsxXWAsblsxXSxcImV4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiBzdG9wcy5cIildKTpyLmNvbmNhdCh0LnZhbGlkYXRlU3BlYyh7a2V5OmAke299WzFdYCx2YWx1ZTpuWzFdLHZhbHVlU3BlYzplLHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlYyxzdHlsZTp0LnN0eWxlLHN0eWxlU3BlYzp0LnN0eWxlU3BlY30pKX1mdW5jdGlvbiBwKHQscyl7Y29uc3Qgbz11bih0LnZhbHVlKSxsPU9uKHQudmFsdWUpLHU9bnVsbCE9PXQudmFsdWU/dC52YWx1ZTpzO2lmKG4pe2lmKG8hPT1uKXJldHVybiBbbmV3IGl0KHQua2V5LHUsYCR7b30gc3RvcCBkb21haW4gdHlwZSBtdXN0IG1hdGNoIHByZXZpb3VzIHN0b3AgZG9tYWluIHR5cGUgJHtufWApXX1lbHNlIG49bztpZihcIm51bWJlclwiIT09byYmXCJzdHJpbmdcIiE9PW8mJlwiYm9vbGVhblwiIT09bylyZXR1cm4gW25ldyBpdCh0LmtleSx1LFwic3RvcCBkb21haW4gdmFsdWUgbXVzdCBiZSBhIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuXCIpXTtpZihcIm51bWJlclwiIT09byYmXCJjYXRlZ29yaWNhbFwiIT09cil7bGV0IG49YG51bWJlciBleHBlY3RlZCwgJHtvfSBmb3VuZGA7cmV0dXJuIGFuKGUpJiZ2b2lkIDA9PT1yJiYobis9J1xcbklmIHlvdSBpbnRlbmRlZCB0byB1c2UgYSBjYXRlZ29yaWNhbCBmdW5jdGlvbiwgc3BlY2lmeSBgXCJ0eXBlXCI6IFwiY2F0ZWdvcmljYWxcImAuJyksW25ldyBpdCh0LmtleSx1LG4pXX1yZXR1cm4gXCJjYXRlZ29yaWNhbFwiIT09cnx8XCJudW1iZXJcIiE9PW98fGlzRmluaXRlKGwpJiZNYXRoLmZsb29yKGwpPT09bD9cImNhdGVnb3JpY2FsXCIhPT1yJiZcIm51bWJlclwiPT09byYmdm9pZCAwIT09aSYmbDxpP1tuZXcgaXQodC5rZXksdSxcInN0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGFwcGVhciBpbiBhc2NlbmRpbmcgb3JkZXJcIildOihpPWwsXCJjYXRlZ29yaWNhbFwiPT09ciYmbCBpbiBhP1tuZXcgaXQodC5rZXksdSxcInN0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZVwiKV06KGFbbF09ITAsW10pKTpbbmV3IGl0KHQua2V5LHUsYGludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICR7bH1gKV19fWZ1bmN0aW9uIFpuKHQpe2NvbnN0IGU9KFwicHJvcGVydHlcIj09PXQuZXhwcmVzc2lvbkNvbnRleHQ/QW46Ym4pKGpuKHQudmFsdWUpLHQudmFsdWVTcGVjKTtpZihcImVycm9yXCI9PT1lLnJlc3VsdClyZXR1cm4gZS52YWx1ZS5tYXAoKGU9Pm5ldyBpdChgJHt0LmtleX0ke2Uua2V5fWAsdC52YWx1ZSxlLm1lc3NhZ2UpKSk7Y29uc3Qgcj1lLnZhbHVlLmV4cHJlc3Npb258fGUudmFsdWUuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uO2lmKFwicHJvcGVydHlcIj09PXQuZXhwcmVzc2lvbkNvbnRleHQmJlwidGV4dC1mb250XCI9PT10LnByb3BlcnR5S2V5JiYhci5vdXRwdXREZWZpbmVkKCkpcmV0dXJuIFtuZXcgaXQodC5rZXksdC52YWx1ZSxgSW52YWxpZCBkYXRhIGV4cHJlc3Npb24gZm9yIFwiJHt0LnByb3BlcnR5S2V5fVwiLiBPdXRwdXQgdmFsdWVzIG11c3QgYmUgY29udGFpbmVkIGFzIGxpdGVyYWxzIHdpdGhpbiB0aGUgZXhwcmVzc2lvbi5gKV07aWYoXCJwcm9wZXJ0eVwiPT09dC5leHByZXNzaW9uQ29udGV4dCYmXCJsYXlvdXRcIj09PXQucHJvcGVydHlUeXBlJiYhZW4ocikpcmV0dXJuIFtuZXcgaXQodC5rZXksdC52YWx1ZSwnXCJmZWF0dXJlLXN0YXRlXCIgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGxheW91dCBwcm9wZXJ0aWVzLicpXTtpZihcImZpbHRlclwiPT09dC5leHByZXNzaW9uQ29udGV4dCYmIWVuKHIpKXJldHVybiBbbmV3IGl0KHQua2V5LHQudmFsdWUsJ1wiZmVhdHVyZS1zdGF0ZVwiIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBmaWx0ZXJzLicpXTtpZih0LmV4cHJlc3Npb25Db250ZXh0JiYwPT09dC5leHByZXNzaW9uQ29udGV4dC5pbmRleE9mKFwiY2x1c3RlclwiKSl7aWYoIXJuKHIsW1wiem9vbVwiLFwiZmVhdHVyZS1zdGF0ZVwiXSkpcmV0dXJuIFtuZXcgaXQodC5rZXksdC52YWx1ZSwnXCJ6b29tXCIgYW5kIFwiZmVhdHVyZS1zdGF0ZVwiIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggY2x1c3RlciBwcm9wZXJ0aWVzLicpXTtpZihcImNsdXN0ZXItaW5pdGlhbFwiPT09dC5leHByZXNzaW9uQ29udGV4dCYmIXRuKHIpKXJldHVybiBbbmV3IGl0KHQua2V5LHQudmFsdWUsXCJGZWF0dXJlIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBpbml0aWFsIGV4cHJlc3Npb24gcGFydCBvZiBjbHVzdGVyIHByb3BlcnRpZXMuXCIpXX1yZXR1cm4gW119ZnVuY3Rpb24gR24odCl7Y29uc3QgZT10LmtleSxyPXQudmFsdWUsbj10LnZhbHVlU3BlYyxpPVtdO3JldHVybiBBcnJheS5pc0FycmF5KG4udmFsdWVzKT8tMT09PW4udmFsdWVzLmluZGV4T2YoT24ocikpJiZpLnB1c2gobmV3IGl0KGUscixgZXhwZWN0ZWQgb25lIG9mIFske24udmFsdWVzLmpvaW4oXCIsIFwiKX1dLCAke0pTT04uc3RyaW5naWZ5KHIpfSBmb3VuZGApKTotMT09PU9iamVjdC5rZXlzKG4udmFsdWVzKS5pbmRleE9mKE9uKHIpKSYmaS5wdXNoKG5ldyBpdChlLHIsYGV4cGVjdGVkIG9uZSBvZiBbJHtPYmplY3Qua2V5cyhuLnZhbHVlcykuam9pbihcIiwgXCIpfV0sICR7SlNPTi5zdHJpbmdpZnkocil9IGZvdW5kYCkpLGl9ZnVuY3Rpb24gS24odCl7cmV0dXJuIE1uKGpuKHQudmFsdWUpKT9abihzdCh7fSx0LHtleHByZXNzaW9uQ29udGV4dDpcImZpbHRlclwiLHZhbHVlU3BlYzp7dmFsdWU6XCJib29sZWFuXCJ9fSkpOlhuKHQpfWZ1bmN0aW9uIFhuKHQpe2NvbnN0IGU9dC52YWx1ZSxyPXQua2V5O2lmKFwiYXJyYXlcIiE9PXVuKGUpKXJldHVybiBbbmV3IGl0KHIsZSxgYXJyYXkgZXhwZWN0ZWQsICR7dW4oZSl9IGZvdW5kYCldO2NvbnN0IG49dC5zdHlsZVNwZWM7bGV0IGkscz1bXTtpZihlLmxlbmd0aDwxKXJldHVybiBbbmV3IGl0KHIsZSxcImZpbHRlciBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3QgMSBlbGVtZW50XCIpXTtzd2l0Y2gocz1zLmNvbmNhdChHbih7a2V5OmAke3J9WzBdYCx2YWx1ZTplWzBdLHZhbHVlU3BlYzpuLmZpbHRlcl9vcGVyYXRvcixzdHlsZTp0LnN0eWxlLHN0eWxlU3BlYzp0LnN0eWxlU3BlY30pKSxPbihlWzBdKSl7Y2FzZVwiPFwiOmNhc2VcIjw9XCI6Y2FzZVwiPlwiOmNhc2VcIj49XCI6ZS5sZW5ndGg+PTImJlwiJHR5cGVcIj09PU9uKGVbMV0pJiZzLnB1c2gobmV3IGl0KHIsZSxgXCIkdHlwZVwiIGNhbm5vdCBiZSB1c2Ugd2l0aCBvcGVyYXRvciBcIiR7ZVswXX1cImApKTtjYXNlXCI9PVwiOmNhc2VcIiE9XCI6MyE9PWUubGVuZ3RoJiZzLnB1c2gobmV3IGl0KHIsZSxgZmlsdGVyIGFycmF5IGZvciBvcGVyYXRvciBcIiR7ZVswXX1cIiBtdXN0IGhhdmUgMyBlbGVtZW50c2ApKTtjYXNlXCJpblwiOmNhc2VcIiFpblwiOmUubGVuZ3RoPj0yJiYoaT11bihlWzFdKSxcInN0cmluZ1wiIT09aSYmcy5wdXNoKG5ldyBpdChgJHtyfVsxXWAsZVsxXSxgc3RyaW5nIGV4cGVjdGVkLCAke2l9IGZvdW5kYCkpKTtmb3IobGV0IGE9MjthPGUubGVuZ3RoO2ErKylpPXVuKGVbYV0pLFwiJHR5cGVcIj09PU9uKGVbMV0pP3M9cy5jb25jYXQoR24oe2tleTpgJHtyfVske2F9XWAsdmFsdWU6ZVthXSx2YWx1ZVNwZWM6bi5nZW9tZXRyeV90eXBlLHN0eWxlOnQuc3R5bGUsc3R5bGVTcGVjOnQuc3R5bGVTcGVjfSkpOlwic3RyaW5nXCIhPT1pJiZcIm51bWJlclwiIT09aSYmXCJib29sZWFuXCIhPT1pJiZzLnB1c2gobmV3IGl0KGAke3J9WyR7YX1dYCxlW2FdLGBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJHtpfSBmb3VuZGApKTticmVhaztjYXNlXCJhbnlcIjpjYXNlXCJhbGxcIjpjYXNlXCJub25lXCI6Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspcz1zLmNvbmNhdChYbih7a2V5OmAke3J9WyR7bn1dYCx2YWx1ZTplW25dLHN0eWxlOnQuc3R5bGUsc3R5bGVTcGVjOnQuc3R5bGVTcGVjfSkpO2JyZWFrO2Nhc2VcImhhc1wiOmNhc2VcIiFoYXNcIjppPXVuKGVbMV0pLDIhPT1lLmxlbmd0aD9zLnB1c2gobmV3IGl0KHIsZSxgZmlsdGVyIGFycmF5IGZvciBcIiR7ZVswXX1cIiBvcGVyYXRvciBtdXN0IGhhdmUgMiBlbGVtZW50c2ApKTpcInN0cmluZ1wiIT09aSYmcy5wdXNoKG5ldyBpdChgJHtyfVsxXWAsZVsxXSxgc3RyaW5nIGV4cGVjdGVkLCAke2l9IGZvdW5kYCkpO31yZXR1cm4gc31mdW5jdGlvbiBIbih0LGUpe2NvbnN0IHI9dC5rZXksbj10LnZhbGlkYXRlU3BlYyxpPXQuc3R5bGUscz10LnN0eWxlU3BlYyxhPXQudmFsdWUsbz10Lm9iamVjdEtleSxsPXNbYCR7ZX1fJHt0LmxheWVyVHlwZX1gXTtpZighbClyZXR1cm4gW107Y29uc3QgdT1vLm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO2lmKFwicGFpbnRcIj09PWUmJnUmJmxbdVsxXV0mJmxbdVsxXV0udHJhbnNpdGlvbilyZXR1cm4gbih7a2V5OnIsdmFsdWU6YSx2YWx1ZVNwZWM6cy50cmFuc2l0aW9uLHN0eWxlOmksc3R5bGVTcGVjOnN9KTtjb25zdCBjPXQudmFsdWVTcGVjfHxsW29dO2lmKCFjKXJldHVybiBbbmV3IGl0KHIsYSxgdW5rbm93biBwcm9wZXJ0eSBcIiR7b31cImApXTtsZXQgaDtpZihcInN0cmluZ1wiPT09dW4oYSkmJmFuKGMpJiYhYy50b2tlbnMmJihoPS9eeyhbXn1dKyl9JC8uZXhlYyhhKSkpcmV0dXJuIFtuZXcgaXQocixhLGBcIiR7b31cIiBkb2VzIG5vdCBzdXBwb3J0IGludGVycG9sYXRpb24gc3ludGF4XFxuVXNlIGFuIGlkZW50aXR5IHByb3BlcnR5IGZ1bmN0aW9uIGluc3RlYWQ6IFxcYHsgXCJ0eXBlXCI6IFwiaWRlbnRpdHlcIiwgXCJwcm9wZXJ0eVwiOiAke0pTT04uc3RyaW5naWZ5KGhbMV0pfSB9XFxgLmApXTtjb25zdCBwPVtdO3JldHVybiBcInN5bWJvbFwiPT09dC5sYXllclR5cGUmJihcInRleHQtZmllbGRcIj09PW8mJmkmJiFpLmdseXBocyYmcC5wdXNoKG5ldyBpdChyLGEsJ3VzZSBvZiBcInRleHQtZmllbGRcIiByZXF1aXJlcyBhIHN0eWxlIFwiZ2x5cGhzXCIgcHJvcGVydHknKSksXCJ0ZXh0LWZvbnRcIj09PW8mJmNuKGpuKGEpKSYmXCJpZGVudGl0eVwiPT09T24oYS50eXBlKSYmcC5wdXNoKG5ldyBpdChyLGEsJ1widGV4dC1mb250XCIgZG9lcyBub3Qgc3VwcG9ydCBpZGVudGl0eSBmdW5jdGlvbnMnKSkpLHAuY29uY2F0KG4oe2tleTp0LmtleSx2YWx1ZTphLHZhbHVlU3BlYzpjLHN0eWxlOmksc3R5bGVTcGVjOnMsZXhwcmVzc2lvbkNvbnRleHQ6XCJwcm9wZXJ0eVwiLHByb3BlcnR5VHlwZTplLHByb3BlcnR5S2V5Om99KSl9ZnVuY3Rpb24gWW4odCl7cmV0dXJuIEhuKHQsXCJwYWludFwiKX1mdW5jdGlvbiBKbih0KXtyZXR1cm4gSG4odCxcImxheW91dFwiKX1mdW5jdGlvbiBXbih0KXtsZXQgZT1bXTtjb25zdCByPXQudmFsdWUsbj10LmtleSxpPXQuc3R5bGUscz10LnN0eWxlU3BlYztyLnR5cGV8fHIucmVmfHxlLnB1c2gobmV3IGl0KG4sciwnZWl0aGVyIFwidHlwZVwiIG9yIFwicmVmXCIgaXMgcmVxdWlyZWQnKSk7bGV0IGE9T24oci50eXBlKTtjb25zdCBvPU9uKHIucmVmKTtpZihyLmlkKXtjb25zdCBzPU9uKHIuaWQpO2ZvcihsZXQgYT0wO2E8dC5hcnJheUluZGV4O2ErKyl7Y29uc3QgdD1pLmxheWVyc1thXTtPbih0LmlkKT09PXMmJmUucHVzaChuZXcgaXQobixyLmlkLGBkdXBsaWNhdGUgbGF5ZXIgaWQgXCIke3IuaWR9XCIsIHByZXZpb3VzbHkgdXNlZCBhdCBsaW5lICR7dC5pZC5fX2xpbmVfX31gKSk7fX1pZihcInJlZlwiaW4gcil7bGV0IHQ7W1widHlwZVwiLFwic291cmNlXCIsXCJzb3VyY2UtbGF5ZXJcIixcImZpbHRlclwiLFwibGF5b3V0XCJdLmZvckVhY2goKHQ9Pnt0IGluIHImJmUucHVzaChuZXcgaXQobixyW3RdLGBcIiR7dH1cIiBpcyBwcm9oaWJpdGVkIGZvciByZWYgbGF5ZXJzYCkpO30pKSxpLmxheWVycy5mb3JFYWNoKChlPT57T24oZS5pZCk9PT1vJiYodD1lKTt9KSksdD90LnJlZj9lLnB1c2gobmV3IGl0KG4sci5yZWYsXCJyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllclwiKSk6YT1Pbih0LnR5cGUpOmUucHVzaChuZXcgaXQobixyLnJlZixgcmVmIGxheWVyIFwiJHtvfVwiIG5vdCBmb3VuZGApKTt9ZWxzZSBpZihcImJhY2tncm91bmRcIiE9PWEpaWYoci5zb3VyY2Upe2NvbnN0IHQ9aS5zb3VyY2VzJiZpLnNvdXJjZXNbci5zb3VyY2VdLHM9dCYmT24odC50eXBlKTt0P1widmVjdG9yXCI9PT1zJiZcInJhc3RlclwiPT09YT9lLnB1c2gobmV3IGl0KG4sci5zb3VyY2UsYGxheWVyIFwiJHtyLmlkfVwiIHJlcXVpcmVzIGEgcmFzdGVyIHNvdXJjZWApKTpcInJhc3Rlci1kZW1cIiE9PXMmJlwiaGlsbHNoYWRlXCI9PT1hP2UucHVzaChuZXcgaXQobixyLnNvdXJjZSxgbGF5ZXIgXCIke3IuaWR9XCIgcmVxdWlyZXMgYSByYXN0ZXItZGVtIHNvdXJjZWApKTpcInJhc3RlclwiPT09cyYmXCJyYXN0ZXJcIiE9PWE/ZS5wdXNoKG5ldyBpdChuLHIuc291cmNlLGBsYXllciBcIiR7ci5pZH1cIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2VgKSk6XCJ2ZWN0b3JcIiE9PXN8fHJbXCJzb3VyY2UtbGF5ZXJcIl0/XCJyYXN0ZXItZGVtXCI9PT1zJiZcImhpbGxzaGFkZVwiIT09YT9lLnB1c2gobmV3IGl0KG4sci5zb3VyY2UsXCJyYXN0ZXItZGVtIHNvdXJjZSBjYW4gb25seSBiZSB1c2VkIHdpdGggbGF5ZXIgdHlwZSAnaGlsbHNoYWRlJy5cIikpOlwibGluZVwiIT09YXx8IXIucGFpbnR8fCFyLnBhaW50W1wibGluZS1ncmFkaWVudFwiXXx8XCJnZW9qc29uXCI9PT1zJiZ0LmxpbmVNZXRyaWNzfHxlLnB1c2gobmV3IGl0KG4scixgbGF5ZXIgXCIke3IuaWR9XCIgc3BlY2lmaWVzIGEgbGluZS1ncmFkaWVudCwgd2hpY2ggcmVxdWlyZXMgYSBHZW9KU09OIHNvdXJjZSB3aXRoIFxcYGxpbmVNZXRyaWNzXFxgIGVuYWJsZWQuYCkpOmUucHVzaChuZXcgaXQobixyLGBsYXllciBcIiR7ci5pZH1cIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiYCkpOmUucHVzaChuZXcgaXQobixyLnNvdXJjZSxgc291cmNlIFwiJHtyLnNvdXJjZX1cIiBub3QgZm91bmRgKSk7fWVsc2UgZS5wdXNoKG5ldyBpdChuLHIsJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcIicpKTtyZXR1cm4gZT1lLmNvbmNhdChSbih7a2V5Om4sdmFsdWU6cix2YWx1ZVNwZWM6cy5sYXllcixzdHlsZTp0LnN0eWxlLHN0eWxlU3BlYzp0LnN0eWxlU3BlYyx2YWxpZGF0ZVNwZWM6dC52YWxpZGF0ZVNwZWMsb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6e1wiKlwiOigpPT5bXSx0eXBlOigpPT50LnZhbGlkYXRlU3BlYyh7a2V5OmAke259LnR5cGVgLHZhbHVlOnIudHlwZSx2YWx1ZVNwZWM6cy5sYXllci50eXBlLHN0eWxlOnQuc3R5bGUsc3R5bGVTcGVjOnQuc3R5bGVTcGVjLHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlYyxvYmplY3Q6cixvYmplY3RLZXk6XCJ0eXBlXCJ9KSxmaWx0ZXI6S24sbGF5b3V0OnQ9PlJuKHtsYXllcjpyLGtleTp0LmtleSx2YWx1ZTp0LnZhbHVlLHN0eWxlOnQuc3R5bGUsc3R5bGVTcGVjOnQuc3R5bGVTcGVjLHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlYyxvYmplY3RFbGVtZW50VmFsaWRhdG9yczp7XCIqXCI6dD0+Sm4oc3Qoe2xheWVyVHlwZTphfSx0KSl9fSkscGFpbnQ6dD0+Um4oe2xheWVyOnIsa2V5OnQua2V5LHZhbHVlOnQudmFsdWUsc3R5bGU6dC5zdHlsZSxzdHlsZVNwZWM6dC5zdHlsZVNwZWMsdmFsaWRhdGVTcGVjOnQudmFsaWRhdGVTcGVjLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOntcIipcIjp0PT5ZbihzdCh7bGF5ZXJUeXBlOmF9LHQpKX19KX19KSksZX1mdW5jdGlvbiBRbih0KXtjb25zdCBlPXQudmFsdWUscj10LmtleSxuPXVuKGUpO3JldHVybiBcInN0cmluZ1wiIT09bj9bbmV3IGl0KHIsZSxgc3RyaW5nIGV4cGVjdGVkLCAke259IGZvdW5kYCldOltdfWNvbnN0IHRpPXtwcm9tb3RlSWQ6ZnVuY3Rpb24oe2tleTp0LHZhbHVlOmV9KXtpZihcInN0cmluZ1wiPT09dW4oZSkpcmV0dXJuIFFuKHtrZXk6dCx2YWx1ZTplfSk7e2NvbnN0IHI9W107Zm9yKGNvbnN0IG4gaW4gZSlyLnB1c2goLi4uUW4oe2tleTpgJHt0fS4ke259YCx2YWx1ZTplW25dfSkpO3JldHVybiByfX19O2Z1bmN0aW9uIGVpKHQpe2NvbnN0IGU9dC52YWx1ZSxyPXQua2V5LG49dC5zdHlsZVNwZWMsaT10LnN0eWxlLHM9dC52YWxpZGF0ZVNwZWM7aWYoIWUudHlwZSlyZXR1cm4gW25ldyBpdChyLGUsJ1widHlwZVwiIGlzIHJlcXVpcmVkJyldO2NvbnN0IGE9T24oZS50eXBlKTtsZXQgbztzd2l0Y2goYSl7Y2FzZVwidmVjdG9yXCI6Y2FzZVwicmFzdGVyXCI6cmV0dXJuIG89Um4oe2tleTpyLHZhbHVlOmUsdmFsdWVTcGVjOm5bYHNvdXJjZV8ke2EucmVwbGFjZShcIi1cIixcIl9cIil9YF0sc3R5bGU6dC5zdHlsZSxzdHlsZVNwZWM6bixvYmplY3RFbGVtZW50VmFsaWRhdG9yczp0aSx2YWxpZGF0ZVNwZWM6c30pLG87Y2FzZVwicmFzdGVyLWRlbVwiOnJldHVybiBvPWZ1bmN0aW9uKHQpe3ZhciBlO2NvbnN0IHI9bnVsbCE9PShlPXQuc291cmNlTmFtZSkmJnZvaWQgMCE9PWU/ZTpcIlwiLG49dC52YWx1ZSxpPXQuc3R5bGVTcGVjLHM9aS5zb3VyY2VfcmFzdGVyX2RlbSxhPXQuc3R5bGU7bGV0IG89W107Y29uc3QgbD11bihuKTtpZih2b2lkIDA9PT1uKXJldHVybiBvO2lmKFwib2JqZWN0XCIhPT1sKXJldHVybiBvLnB1c2gobmV3IGl0KFwic291cmNlX3Jhc3Rlcl9kZW1cIixuLGBvYmplY3QgZXhwZWN0ZWQsICR7bH0gZm91bmRgKSksbztjb25zdCB1PVwiY3VzdG9tXCI9PT1PbihuLmVuY29kaW5nKSxjPVtcInJlZEZhY3RvclwiLFwiZ3JlZW5GYWN0b3JcIixcImJsdWVGYWN0b3JcIixcImJhc2VTaGlmdFwiXSxoPXQudmFsdWUuZW5jb2Rpbmc/YFwiJHt0LnZhbHVlLmVuY29kaW5nfVwiYDpcIkRlZmF1bHRcIjtmb3IoY29uc3QgZSBpbiBuKSF1JiZjLmluY2x1ZGVzKGUpP28ucHVzaChuZXcgaXQoZSxuW2VdLGBJbiBcIiR7cn1cIjogXCIke2V9XCIgaXMgb25seSB2YWxpZCB3aGVuIFwiZW5jb2RpbmdcIiBpcyBzZXQgdG8gXCJjdXN0b21cIi4gJHtofSBlbmNvZGluZyBmb3VuZGApKTpzW2VdP289by5jb25jYXQodC52YWxpZGF0ZVNwZWMoe2tleTplLHZhbHVlOm5bZV0sdmFsdWVTcGVjOnNbZV0sdmFsaWRhdGVTcGVjOnQudmFsaWRhdGVTcGVjLHN0eWxlOmEsc3R5bGVTcGVjOml9KSk6by5wdXNoKG5ldyBpdChlLG5bZV0sYHVua25vd24gcHJvcGVydHkgXCIke2V9XCJgKSk7cmV0dXJuIG99KHtzb3VyY2VOYW1lOnIsdmFsdWU6ZSxzdHlsZTp0LnN0eWxlLHN0eWxlU3BlYzpuLHZhbGlkYXRlU3BlYzpzfSksbztjYXNlXCJnZW9qc29uXCI6aWYobz1Sbih7a2V5OnIsdmFsdWU6ZSx2YWx1ZVNwZWM6bi5zb3VyY2VfZ2VvanNvbixzdHlsZTppLHN0eWxlU3BlYzpuLHZhbGlkYXRlU3BlYzpzLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOnRpfSksZS5jbHVzdGVyKWZvcihjb25zdCB0IGluIGUuY2x1c3RlclByb3BlcnRpZXMpe2NvbnN0W24saV09ZS5jbHVzdGVyUHJvcGVydGllc1t0XSxhPVwic3RyaW5nXCI9PXR5cGVvZiBuP1tuLFtcImFjY3VtdWxhdGVkXCJdLFtcImdldFwiLHRdXTpuO28ucHVzaCguLi5abih7a2V5OmAke3J9LiR7dH0ubWFwYCx2YWx1ZTppLHZhbGlkYXRlU3BlYzpzLGV4cHJlc3Npb25Db250ZXh0OlwiY2x1c3Rlci1tYXBcIn0pKSxvLnB1c2goLi4uWm4oe2tleTpgJHtyfS4ke3R9LnJlZHVjZWAsdmFsdWU6YSx2YWxpZGF0ZVNwZWM6cyxleHByZXNzaW9uQ29udGV4dDpcImNsdXN0ZXItcmVkdWNlXCJ9KSk7fXJldHVybiBvO2Nhc2VcInZpZGVvXCI6cmV0dXJuIFJuKHtrZXk6cix2YWx1ZTplLHZhbHVlU3BlYzpuLnNvdXJjZV92aWRlbyxzdHlsZTppLHZhbGlkYXRlU3BlYzpzLHN0eWxlU3BlYzpufSk7Y2FzZVwiaW1hZ2VcIjpyZXR1cm4gUm4oe2tleTpyLHZhbHVlOmUsdmFsdWVTcGVjOm4uc291cmNlX2ltYWdlLHN0eWxlOmksdmFsaWRhdGVTcGVjOnMsc3R5bGVTcGVjOm59KTtjYXNlXCJjYW52YXNcIjpyZXR1cm4gW25ldyBpdChyLG51bGwsXCJQbGVhc2UgdXNlIHJ1bnRpbWUgQVBJcyB0byBhZGQgY2FudmFzIHNvdXJjZXMsIHJhdGhlciB0aGFuIGluY2x1ZGluZyB0aGVtIGluIHN0eWxlc2hlZXRzLlwiLFwic291cmNlLmNhbnZhc1wiKV07ZGVmYXVsdDpyZXR1cm4gR24oe2tleTpgJHtyfS50eXBlYCx2YWx1ZTplLnR5cGUsdmFsdWVTcGVjOnt2YWx1ZXM6W1widmVjdG9yXCIsXCJyYXN0ZXJcIixcInJhc3Rlci1kZW1cIixcImdlb2pzb25cIixcInZpZGVvXCIsXCJpbWFnZVwiXX0sc3R5bGU6aSx2YWxpZGF0ZVNwZWM6cyxzdHlsZVNwZWM6bn0pfX1mdW5jdGlvbiByaSh0KXtjb25zdCBlPXQudmFsdWUscj10LnN0eWxlU3BlYyxuPXIubGlnaHQsaT10LnN0eWxlO2xldCBzPVtdO2NvbnN0IGE9dW4oZSk7aWYodm9pZCAwPT09ZSlyZXR1cm4gcztpZihcIm9iamVjdFwiIT09YSlyZXR1cm4gcz1zLmNvbmNhdChbbmV3IGl0KFwibGlnaHRcIixlLGBvYmplY3QgZXhwZWN0ZWQsICR7YX0gZm91bmRgKV0pLHM7Zm9yKGNvbnN0IGEgaW4gZSl7Y29uc3Qgbz1hLm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO3M9cy5jb25jYXQobyYmbltvWzFdXSYmbltvWzFdXS50cmFuc2l0aW9uP3QudmFsaWRhdGVTcGVjKHtrZXk6YSx2YWx1ZTplW2FdLHZhbHVlU3BlYzpyLnRyYW5zaXRpb24sdmFsaWRhdGVTcGVjOnQudmFsaWRhdGVTcGVjLHN0eWxlOmksc3R5bGVTcGVjOnJ9KTpuW2FdP3QudmFsaWRhdGVTcGVjKHtrZXk6YSx2YWx1ZTplW2FdLHZhbHVlU3BlYzpuW2FdLHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlYyxzdHlsZTppLHN0eWxlU3BlYzpyfSk6W25ldyBpdChhLGVbYV0sYHVua25vd24gcHJvcGVydHkgXCIke2F9XCJgKV0pO31yZXR1cm4gc31mdW5jdGlvbiBuaSh0KXtjb25zdCBlPXQudmFsdWUscj10LnN0eWxlU3BlYyxuPXIuc2t5LGk9dC5zdHlsZSxzPXVuKGUpO2lmKHZvaWQgMD09PWUpcmV0dXJuIFtdO2lmKFwib2JqZWN0XCIhPT1zKXJldHVybiBbbmV3IGl0KFwic2t5XCIsZSxgb2JqZWN0IGV4cGVjdGVkLCAke3N9IGZvdW5kYCldO2xldCBhPVtdO2Zvcihjb25zdCBzIGluIGUpYT1hLmNvbmNhdChuW3NdP3QudmFsaWRhdGVTcGVjKHtrZXk6cyx2YWx1ZTplW3NdLHZhbHVlU3BlYzpuW3NdLHN0eWxlOmksc3R5bGVTcGVjOnJ9KTpbbmV3IGl0KHMsZVtzXSxgdW5rbm93biBwcm9wZXJ0eSBcIiR7c31cImApXSk7cmV0dXJuIGF9ZnVuY3Rpb24gaWkodCl7Y29uc3QgZT10LnZhbHVlLHI9dC5zdHlsZVNwZWMsbj1yLnRlcnJhaW4saT10LnN0eWxlO2xldCBzPVtdO2NvbnN0IGE9dW4oZSk7aWYodm9pZCAwPT09ZSlyZXR1cm4gcztpZihcIm9iamVjdFwiIT09YSlyZXR1cm4gcz1zLmNvbmNhdChbbmV3IGl0KFwidGVycmFpblwiLGUsYG9iamVjdCBleHBlY3RlZCwgJHthfSBmb3VuZGApXSkscztmb3IoY29uc3QgYSBpbiBlKXM9cy5jb25jYXQoblthXT90LnZhbGlkYXRlU3BlYyh7a2V5OmEsdmFsdWU6ZVthXSx2YWx1ZVNwZWM6blthXSx2YWxpZGF0ZVNwZWM6dC52YWxpZGF0ZVNwZWMsc3R5bGU6aSxzdHlsZVNwZWM6cn0pOltuZXcgaXQoYSxlW2FdLGB1bmtub3duIHByb3BlcnR5IFwiJHthfVwiYCldKTtyZXR1cm4gc31mdW5jdGlvbiBzaSh0KXtsZXQgZT1bXTtjb25zdCByPXQudmFsdWUsbj10LmtleTtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCBpPVtdLHM9W107Zm9yKGNvbnN0IGEgaW4gcilyW2FdLmlkJiZpLmluY2x1ZGVzKHJbYV0uaWQpJiZlLnB1c2gobmV3IGl0KG4scixgYWxsIHRoZSBzcHJpdGVzJyBpZHMgbXVzdCBiZSB1bmlxdWUsIGJ1dCAke3JbYV0uaWR9IGlzIGR1cGxpY2F0ZWRgKSksaS5wdXNoKHJbYV0uaWQpLHJbYV0udXJsJiZzLmluY2x1ZGVzKHJbYV0udXJsKSYmZS5wdXNoKG5ldyBpdChuLHIsYGFsbCB0aGUgc3ByaXRlcycgVVJMcyBtdXN0IGJlIHVuaXF1ZSwgYnV0ICR7clthXS51cmx9IGlzIGR1cGxpY2F0ZWRgKSkscy5wdXNoKHJbYV0udXJsKSxlPWUuY29uY2F0KFJuKHtrZXk6YCR7bn1bJHthfV1gLHZhbHVlOnJbYV0sdmFsdWVTcGVjOntpZDp7dHlwZTpcInN0cmluZ1wiLHJlcXVpcmVkOiEwfSx1cmw6e3R5cGU6XCJzdHJpbmdcIixyZXF1aXJlZDohMH19LHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlY30pKTtyZXR1cm4gZX1yZXR1cm4gUW4oe2tleTpuLHZhbHVlOnJ9KX1jb25zdCBhaT17XCIqXCI6KCk9PltdLGFycmF5OlVuLGJvb2xlYW46ZnVuY3Rpb24odCl7Y29uc3QgZT10LnZhbHVlLHI9dC5rZXksbj11bihlKTtyZXR1cm4gXCJib29sZWFuXCIhPT1uP1tuZXcgaXQocixlLGBib29sZWFuIGV4cGVjdGVkLCAke259IGZvdW5kYCldOltdfSxudW1iZXI6cW4sY29sb3I6ZnVuY3Rpb24odCl7Y29uc3QgZT10LmtleSxyPXQudmFsdWUsbj11bihyKTtyZXR1cm4gXCJzdHJpbmdcIiE9PW4/W25ldyBpdChlLHIsYGNvbG9yIGV4cGVjdGVkLCAke259IGZvdW5kYCldOkt0LnBhcnNlKFN0cmluZyhyKSk/W106W25ldyBpdChlLHIsYGNvbG9yIGV4cGVjdGVkLCBcIiR7cn1cIiBmb3VuZGApXX0sY29uc3RhbnRzOkRuLGVudW06R24sZmlsdGVyOktuLGZ1bmN0aW9uOk5uLGxheWVyOlduLG9iamVjdDpSbixzb3VyY2U6ZWksbGlnaHQ6cmksc2t5Om5pLHRlcnJhaW46aWkscHJvamVjdGlvbjpmdW5jdGlvbih0KXtjb25zdCBlPXQudmFsdWUscj10LnN0eWxlU3BlYyxuPXIucHJvamVjdGlvbixpPXQuc3R5bGUscz11bihlKTtpZih2b2lkIDA9PT1lKXJldHVybiBbXTtpZihcIm9iamVjdFwiIT09cylyZXR1cm4gW25ldyBpdChcInByb2plY3Rpb25cIixlLGBvYmplY3QgZXhwZWN0ZWQsICR7c30gZm91bmRgKV07bGV0IGE9W107Zm9yKGNvbnN0IHMgaW4gZSlhPWEuY29uY2F0KG5bc10/dC52YWxpZGF0ZVNwZWMoe2tleTpzLHZhbHVlOmVbc10sdmFsdWVTcGVjOm5bc10sc3R5bGU6aSxzdHlsZVNwZWM6cn0pOltuZXcgaXQocyxlW3NdLGB1bmtub3duIHByb3BlcnR5IFwiJHtzfVwiYCldKTtyZXR1cm4gYX0sc3RyaW5nOlFuLGZvcm1hdHRlZDpmdW5jdGlvbih0KXtyZXR1cm4gMD09PVFuKHQpLmxlbmd0aD9bXTpabih0KX0scmVzb2x2ZWRJbWFnZTpmdW5jdGlvbih0KXtyZXR1cm4gMD09PVFuKHQpLmxlbmd0aD9bXTpabih0KX0scGFkZGluZzpmdW5jdGlvbih0KXtjb25zdCBlPXQua2V5LHI9dC52YWx1ZTtpZihcImFycmF5XCI9PT11bihyKSl7aWYoci5sZW5ndGg8MXx8ci5sZW5ndGg+NClyZXR1cm4gW25ldyBpdChlLHIsYHBhZGRpbmcgcmVxdWlyZXMgMSB0byA0IHZhbHVlczsgJHtyLmxlbmd0aH0gdmFsdWVzIGZvdW5kYCldO2NvbnN0IG49e3R5cGU6XCJudW1iZXJcIn07bGV0IGk9W107Zm9yKGxldCBzPTA7czxyLmxlbmd0aDtzKyspaT1pLmNvbmNhdCh0LnZhbGlkYXRlU3BlYyh7a2V5OmAke2V9WyR7c31dYCx2YWx1ZTpyW3NdLHZhbGlkYXRlU3BlYzp0LnZhbGlkYXRlU3BlYyx2YWx1ZVNwZWM6bn0pKTtyZXR1cm4gaX1yZXR1cm4gcW4oe2tleTplLHZhbHVlOnIsdmFsdWVTcGVjOnt9fSl9LHZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvbjpmdW5jdGlvbih0KXtjb25zdCBlPXQua2V5LHI9dC52YWx1ZSxuPXVuKHIpLGk9dC5zdHlsZVNwZWM7aWYoXCJhcnJheVwiIT09bnx8ci5sZW5ndGg8MXx8ci5sZW5ndGglMiE9MClyZXR1cm4gW25ldyBpdChlLHIsXCJ2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb24gcmVxdWlyZXMgYSBub24tZW1wdHkgYXJyYXkgb2YgZXZlbiBsZW5ndGhcIildO2xldCBzPVtdO2ZvcihsZXQgbj0wO248ci5sZW5ndGg7bis9MilzPXMuY29uY2F0KEduKHtrZXk6YCR7ZX1bJHtufV1gLHZhbHVlOnJbbl0sdmFsdWVTcGVjOmkubGF5b3V0X3N5bWJvbFtcInRleHQtYW5jaG9yXCJdfSkpLHM9cy5jb25jYXQoVW4oe2tleTpgJHtlfVske24rMX1dYCx2YWx1ZTpyW24rMV0sdmFsdWVTcGVjOntsZW5ndGg6Mix2YWx1ZTpcIm51bWJlclwifSx2YWxpZGF0ZVNwZWM6dC52YWxpZGF0ZVNwZWMsc3R5bGU6dC5zdHlsZSxzdHlsZVNwZWM6aX0pKTtyZXR1cm4gc30sc3ByaXRlOnNpfTtmdW5jdGlvbiBvaSh0KXtjb25zdCBlPXQudmFsdWUscj10LnZhbHVlU3BlYyxuPXQuc3R5bGVTcGVjO3JldHVybiB0LnZhbGlkYXRlU3BlYz1vaSxyLmV4cHJlc3Npb24mJmNuKE9uKGUpKT9Obih0KTpyLmV4cHJlc3Npb24mJnZuKGpuKGUpKT9abih0KTpyLnR5cGUmJmFpW3IudHlwZV0/YWlbci50eXBlXSh0KTpSbihzdCh7fSx0LHt2YWx1ZVNwZWM6ci50eXBlP25bci50eXBlXTpyfSkpfWZ1bmN0aW9uIGxpKHQpe2NvbnN0IGU9dC52YWx1ZSxyPXQua2V5LG49UW4odCk7cmV0dXJuIG4ubGVuZ3RofHwoLTE9PT1lLmluZGV4T2YoXCJ7Zm9udHN0YWNrfVwiKSYmbi5wdXNoKG5ldyBpdChyLGUsJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie2ZvbnRzdGFja31cIiB0b2tlbicpKSwtMT09PWUuaW5kZXhPZihcIntyYW5nZX1cIikmJm4ucHVzaChuZXcgaXQocixlLCdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntyYW5nZX1cIiB0b2tlbicpKSksbn1mdW5jdGlvbiB1aSh0LGU9Ryl7bGV0IHI9W107cmV0dXJuIHI9ci5jb25jYXQob2koe2tleTpcIlwiLHZhbHVlOnQsdmFsdWVTcGVjOmUuJHJvb3Qsc3R5bGVTcGVjOmUsc3R5bGU6dCx2YWxpZGF0ZVNwZWM6b2ksb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6e2dseXBoczpsaSxcIipcIjooKT0+W119fSkpLHQuY29uc3RhbnRzJiYocj1yLmNvbmNhdChEbih7a2V5OlwiY29uc3RhbnRzXCIsdmFsdWU6dC5jb25zdGFudHMsc3R5bGU6dCxzdHlsZVNwZWM6ZSx2YWxpZGF0ZVNwZWM6b2l9KSkpLGhpKHIpfWZ1bmN0aW9uIGNpKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCh7Li4uZSx2YWxpZGF0ZVNwZWM6b2l9KX19ZnVuY3Rpb24gaGkodCl7cmV0dXJuIFtdLmNvbmNhdCh0KS5zb3J0KCgodCxlKT0+dC5saW5lLWUubGluZSkpfWZ1bmN0aW9uIHBpKHQpe3JldHVybiBmdW5jdGlvbiguLi5lKXtyZXR1cm4gaGkodC5hcHBseSh0aGlzLGUpKX19dWkuc291cmNlPXBpKGNpKGVpKSksdWkuc3ByaXRlPXBpKGNpKHNpKSksdWkuZ2x5cGhzPXBpKGNpKGxpKSksdWkubGlnaHQ9cGkoY2kocmkpKSx1aS5za3k9cGkoY2kobmkpKSx1aS50ZXJyYWluPXBpKGNpKGlpKSksdWkubGF5ZXI9cGkoY2koV24pKSx1aS5maWx0ZXI9cGkoY2koS24pKSx1aS5wYWludFByb3BlcnR5PXBpKGNpKFluKSksdWkubGF5b3V0UHJvcGVydHk9cGkoY2koSm4pKTtjb25zdCBmaT11aSxkaT1maS5saWdodCx5aT1maS5za3ksbWk9ZmkucGFpbnRQcm9wZXJ0eSxnaT1maS5sYXlvdXRQcm9wZXJ0eTtmdW5jdGlvbiB4aSh0LGUpe2xldCByPSExO2lmKGUmJmUubGVuZ3RoKWZvcihjb25zdCBuIG9mIGUpdC5maXJlKG5ldyBOKG5ldyBFcnJvcihuLm1lc3NhZ2UpKSkscj0hMDtyZXR1cm4gcn1jbGFzcyB2aXtjb25zdHJ1Y3Rvcih0LGUscil7Y29uc3Qgbj10aGlzLmNlbGxzPVtdO2lmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7dGhpcy5hcnJheUJ1ZmZlcj10O2NvbnN0IGk9bmV3IEludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7dD1pWzBdLHRoaXMuZD0oZT1pWzFdKSsyKihyPWlbMl0pO2ZvcihsZXQgdD0wO3Q8dGhpcy5kKnRoaXMuZDt0Kyspe2NvbnN0IGU9aVszK3RdLHI9aVszK3QrMV07bi5wdXNoKGU9PT1yP251bGw6aS5zdWJhcnJheShlLHIpKTt9Y29uc3Qgcz1pWzMrbi5sZW5ndGgrMV07dGhpcy5rZXlzPWkuc3ViYXJyYXkoaVszK24ubGVuZ3RoXSxzKSx0aGlzLmJib3hlcz1pLnN1YmFycmF5KHMpLHRoaXMuaW5zZXJ0PXRoaXMuX2luc2VydFJlYWRvbmx5O31lbHNlIHt0aGlzLmQ9ZSsyKnI7Zm9yKGxldCB0PTA7dDx0aGlzLmQqdGhpcy5kO3QrKyluLnB1c2goW10pO3RoaXMua2V5cz1bXSx0aGlzLmJib3hlcz1bXTt9dGhpcy5uPWUsdGhpcy5leHRlbnQ9dCx0aGlzLnBhZGRpbmc9cix0aGlzLnNjYWxlPWUvdCx0aGlzLnVpZD0wO2NvbnN0IGk9ci9lKnQ7dGhpcy5taW49LWksdGhpcy5tYXg9dCtpO31pbnNlcnQodCxlLHIsbixpKXt0aGlzLl9mb3JFYWNoQ2VsbChlLHIsbixpLHRoaXMuX2luc2VydENlbGwsdGhpcy51aWQrKyx2b2lkIDAsdm9pZCAwKSx0aGlzLmtleXMucHVzaCh0KSx0aGlzLmJib3hlcy5wdXNoKGUpLHRoaXMuYmJveGVzLnB1c2gociksdGhpcy5iYm94ZXMucHVzaChuKSx0aGlzLmJib3hlcy5wdXNoKGkpO31faW5zZXJ0UmVhZG9ubHkoKXt0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaW5zZXJ0IGludG8gYSBHcmlkSW5kZXggY3JlYXRlZCBmcm9tIGFuIEFycmF5QnVmZmVyLlwiKX1faW5zZXJ0Q2VsbCh0LGUscixuLGkscyl7dGhpcy5jZWxsc1tpXS5wdXNoKHMpO31xdWVyeSh0LGUscixuLGkpe2NvbnN0IHM9dGhpcy5taW4sYT10aGlzLm1heDtpZih0PD1zJiZlPD1zJiZhPD1yJiZhPD1uJiYhaSlyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTt7Y29uc3Qgcz1bXTtyZXR1cm4gdGhpcy5fZm9yRWFjaENlbGwodCxlLHIsbix0aGlzLl9xdWVyeUNlbGwscyx7fSxpKSxzfX1fcXVlcnlDZWxsKHQsZSxyLG4saSxzLGEsbyl7Y29uc3QgbD10aGlzLmNlbGxzW2ldO2lmKG51bGwhPT1sKXtjb25zdCBpPXRoaXMua2V5cyx1PXRoaXMuYmJveGVzO2ZvcihsZXQgYz0wO2M8bC5sZW5ndGg7YysrKXtjb25zdCBoPWxbY107aWYodm9pZCAwPT09YVtoXSl7Y29uc3QgbD00Kmg7KG8/byh1W2wrMF0sdVtsKzFdLHVbbCsyXSx1W2wrM10pOnQ8PXVbbCsyXSYmZTw9dVtsKzNdJiZyPj11W2wrMF0mJm4+PXVbbCsxXSk/KGFbaF09ITAscy5wdXNoKGlbaF0pKTphW2hdPSExO319fX1fZm9yRWFjaENlbGwodCxlLHIsbixpLHMsYSxvKXtjb25zdCBsPXRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZCh0KSx1PXRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChlKSxjPXRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChyKSxoPXRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChuKTtmb3IobGV0IHA9bDtwPD1jO3ArKylmb3IobGV0IGw9dTtsPD1oO2wrKyl7Y29uc3QgdT10aGlzLmQqbCtwO2lmKCghb3x8byh0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZChwKSx0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZChsKSx0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZChwKzEpLHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKGwrMSkpKSYmaS5jYWxsKHRoaXMsdCxlLHIsbix1LHMsYSxvKSlyZXR1cm59fV9jb252ZXJ0RnJvbUNlbGxDb29yZCh0KXtyZXR1cm4gKHQtdGhpcy5wYWRkaW5nKS90aGlzLnNjYWxlfV9jb252ZXJ0VG9DZWxsQ29vcmQodCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5kLTEsTWF0aC5mbG9vcih0KnRoaXMuc2NhbGUpK3RoaXMucGFkZGluZykpfXRvQXJyYXlCdWZmZXIoKXtpZih0aGlzLmFycmF5QnVmZmVyKXJldHVybiB0aGlzLmFycmF5QnVmZmVyO2NvbnN0IHQ9dGhpcy5jZWxscyxlPTMrdGhpcy5jZWxscy5sZW5ndGgrMSsxO2xldCByPTA7Zm9yKGxldCB0PTA7dDx0aGlzLmNlbGxzLmxlbmd0aDt0Kyspcis9dGhpcy5jZWxsc1t0XS5sZW5ndGg7Y29uc3Qgbj1uZXcgSW50MzJBcnJheShlK3IrdGhpcy5rZXlzLmxlbmd0aCt0aGlzLmJib3hlcy5sZW5ndGgpO25bMF09dGhpcy5leHRlbnQsblsxXT10aGlzLm4sblsyXT10aGlzLnBhZGRpbmc7bGV0IGk9ZTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3Qgcj10W2VdO25bMytlXT1pLG4uc2V0KHIsaSksaSs9ci5sZW5ndGg7fXJldHVybiBuWzMrdC5sZW5ndGhdPWksbi5zZXQodGhpcy5rZXlzLGkpLGkrPXRoaXMua2V5cy5sZW5ndGgsblszK3QubGVuZ3RoKzFdPWksbi5zZXQodGhpcy5iYm94ZXMsaSksaSs9dGhpcy5iYm94ZXMubGVuZ3RoLG4uYnVmZmVyfXN0YXRpYyBzZXJpYWxpemUodCxlKXtjb25zdCByPXQudG9BcnJheUJ1ZmZlcigpO3JldHVybiBlJiZlLnB1c2gocikse2J1ZmZlcjpyfX1zdGF0aWMgZGVzZXJpYWxpemUodCl7cmV0dXJuIG5ldyB2aSh0LmJ1ZmZlcil9fWNvbnN0IGJpPXt9O2Z1bmN0aW9uIHdpKHQsZSxyPXt9KXtpZihiaVt0XSl0aHJvdyBuZXcgRXJyb3IoYCR7dH0gaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX2NsYXNzUmVnaXN0cnlLZXlcIix7dmFsdWU6dCx3cml0ZWFibGU6ITF9KSxiaVt0XT17a2xhc3M6ZSxvbWl0OnIub21pdHx8W10sc2hhbGxvdzpyLnNoYWxsb3d8fFtdfTt9d2koXCJPYmplY3RcIixPYmplY3QpLHdpKFwiVHJhbnNmZXJhYmxlR3JpZEluZGV4XCIsdmkpLHdpKFwiQ29sb3JcIixLdCksd2koXCJFcnJvclwiLEVycm9yKSx3aShcIkFKQVhFcnJvclwiLEwpLHdpKFwiUmVzb2x2ZWRJbWFnZVwiLHRlKSx3aShcIlN0eWxlUHJvcGVydHlGdW5jdGlvblwiLFNuKSx3aShcIlN0eWxlRXhwcmVzc2lvblwiLHhuLHtvbWl0OltcIl9ldmFsdWF0b3JcIl19KSx3aShcIlpvb21EZXBlbmRlbnRFeHByZXNzaW9uXCIsX24pLHdpKFwiWm9vbUNvbnN0YW50RXhwcmVzc2lvblwiLHduKSx3aShcIkNvbXBvdW5kRXhwcmVzc2lvblwiLFhyLHtvbWl0OltcIl9ldmFsdWF0ZVwiXX0pO2Zvcihjb25zdCB0IGluIEtyKUtyW3RdLl9jbGFzc1JlZ2lzdHJ5S2V5fHx3aShgRXhwcmVzc2lvbl8ke3R9YCxLclt0XSk7ZnVuY3Rpb24gX2kodCl7cmV0dXJuIHQmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dC5jb25zdHJ1Y3RvciYmXCJBcnJheUJ1ZmZlclwiPT09dC5jb25zdHJ1Y3Rvci5uYW1lKX1mdW5jdGlvbiBBaSh0KXtyZXR1cm4gdC4kbmFtZXx8dC5jb25zdHJ1Y3Rvci5fY2xhc3NSZWdpc3RyeUtleX1mdW5jdGlvbiBTaSh0KXtyZXR1cm4gIWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10fHxcIm9iamVjdFwiIT10eXBlb2YgdClyZXR1cm4gITE7Y29uc3QgZT1BaSh0KTtyZXR1cm4gISghZXx8XCJPYmplY3RcIj09PWUpfSh0KSYmKG51bGw9PXR8fFwiYm9vbGVhblwiPT10eXBlb2YgdHx8XCJudW1iZXJcIj09dHlwZW9mIHR8fFwic3RyaW5nXCI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2YgQm9vbGVhbnx8dCBpbnN0YW5jZW9mIE51bWJlcnx8dCBpbnN0YW5jZW9mIFN0cmluZ3x8dCBpbnN0YW5jZW9mIERhdGV8fHQgaW5zdGFuY2VvZiBSZWdFeHB8fHQgaW5zdGFuY2VvZiBCbG9ifHx0IGluc3RhbmNlb2YgRXJyb3J8fF9pKHQpfHxJKHQpfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBJbWFnZURhdGEpfWZ1bmN0aW9uIGtpKHQsZSl7aWYoU2kodCkpcmV0dXJuIChfaSh0KXx8SSh0KSkmJmUmJmUucHVzaCh0KSxBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJmUmJmUucHVzaCh0LmJ1ZmZlciksdCBpbnN0YW5jZW9mIEltYWdlRGF0YSYmZSYmZS5wdXNoKHQuZGF0YS5idWZmZXIpLHQ7aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgcj1bXTtmb3IoY29uc3QgbiBvZiB0KXIucHVzaChraShuLGUpKTtyZXR1cm4gcn1pZihcIm9iamVjdFwiIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoXCJjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgXCIrdHlwZW9mIHQpO2NvbnN0IHI9QWkodCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHVucmVnaXN0ZXJlZCBjbGFzcyAke3QuY29uc3RydWN0b3IubmFtZX1gKTtpZighYmlbcl0pdGhyb3cgbmV3IEVycm9yKGAke3J9IGlzIG5vdCByZWdpc3RlcmVkLmApO2NvbnN0e2tsYXNzOm59PWJpW3JdLGk9bi5zZXJpYWxpemU/bi5zZXJpYWxpemUodCxlKTp7fTtpZihuLnNlcmlhbGl6ZSl7aWYoZSYmaT09PWVbZS5sZW5ndGgtMV0pdGhyb3cgbmV3IEVycm9yKFwic3RhdGljYWxseSBzZXJpYWxpemVkIG9iamVjdCB3b24ndCBzdXJ2aXZlIHRyYW5zZmVyIG9mICRuYW1lIHByb3BlcnR5XCIpfWVsc2Uge2Zvcihjb25zdCBuIGluIHQpe2lmKCF0Lmhhc093blByb3BlcnR5KG4pKWNvbnRpbnVlO2lmKGJpW3JdLm9taXQuaW5kZXhPZihuKT49MCljb250aW51ZTtjb25zdCBzPXRbbl07aVtuXT1iaVtyXS5zaGFsbG93LmluZGV4T2Yobik+PTA/czpraShzLGUpO310IGluc3RhbmNlb2YgRXJyb3ImJihpLm1lc3NhZ2U9dC5tZXNzYWdlKTt9aWYoaS4kbmFtZSl0aHJvdyBuZXcgRXJyb3IoXCIkbmFtZSBwcm9wZXJ0eSBpcyByZXNlcnZlZCBmb3Igd29ya2VyIHNlcmlhbGl6YXRpb24gbG9naWMuXCIpO3JldHVybiBcIk9iamVjdFwiIT09ciYmKGkuJG5hbWU9ciksaX1mdW5jdGlvbiBNaSh0KXtpZihTaSh0KSlyZXR1cm4gdDtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0Lm1hcChNaSk7aWYoXCJvYmplY3RcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3QgZGVzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgXCIrdHlwZW9mIHQpO2NvbnN0IGU9QWkodCl8fFwiT2JqZWN0XCI7aWYoIWJpW2VdKXRocm93IG5ldyBFcnJvcihgY2FuJ3QgZGVzZXJpYWxpemUgdW5yZWdpc3RlcmVkIGNsYXNzICR7ZX1gKTtjb25zdHtrbGFzczpyfT1iaVtlXTtpZighcil0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGRlc2VyaWFsaXplIHVucmVnaXN0ZXJlZCBjbGFzcyAke2V9YCk7aWYoci5kZXNlcmlhbGl6ZSlyZXR1cm4gci5kZXNlcmlhbGl6ZSh0KTtjb25zdCBuPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO2Zvcihjb25zdCByIG9mIE9iamVjdC5rZXlzKHQpKXtpZihcIiRuYW1lXCI9PT1yKWNvbnRpbnVlO2NvbnN0IGk9dFtyXTtuW3JdPWJpW2VdLnNoYWxsb3cuaW5kZXhPZihyKT49MD9pOk1pKGkpO31yZXR1cm4gbn1jbGFzcyBJaXtjb25zdHJ1Y3Rvcigpe3RoaXMuZmlyc3Q9ITA7fXVwZGF0ZSh0LGUpe2NvbnN0IHI9TWF0aC5mbG9vcih0KTtyZXR1cm4gdGhpcy5maXJzdD8odGhpcy5maXJzdD0hMSx0aGlzLmxhc3RJbnRlZ2VyWm9vbT1yLHRoaXMubGFzdEludGVnZXJab29tVGltZT0wLHRoaXMubGFzdFpvb209dCx0aGlzLmxhc3RGbG9vclpvb209ciwhMCk6KHRoaXMubGFzdEZsb29yWm9vbT5yPyh0aGlzLmxhc3RJbnRlZ2VyWm9vbT1yKzEsdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lPWUpOnRoaXMubGFzdEZsb29yWm9vbTxyJiYodGhpcy5sYXN0SW50ZWdlclpvb209cix0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWU9ZSksdCE9PXRoaXMubGFzdFpvb20mJih0aGlzLmxhc3Rab29tPXQsdGhpcy5sYXN0Rmxvb3Jab29tPXIsITApKX19Y29uc3Qgemk9e1wiTGF0aW4tMSBTdXBwbGVtZW50XCI6dD0+dD49MTI4JiZ0PD0yNTUsXCJIYW5ndWwgSmFtb1wiOnQ9PnQ+PTQzNTImJnQ8PTQ2MDcsS2htZXI6dD0+dD49NjAxNiYmdDw9NjE0MyxcIkdlbmVyYWwgUHVuY3R1YXRpb25cIjp0PT50Pj04MTkyJiZ0PD04MzAzLFwiTGV0dGVybGlrZSBTeW1ib2xzXCI6dD0+dD49ODQ0OCYmdDw9ODUyNyxcIk51bWJlciBGb3Jtc1wiOnQ9PnQ+PTg1MjgmJnQ8PTg1OTEsXCJNaXNjZWxsYW5lb3VzIFRlY2huaWNhbFwiOnQ9PnQ+PTg5NjAmJnQ8PTkyMTUsXCJDb250cm9sIFBpY3R1cmVzXCI6dD0+dD49OTIxNiYmdDw9OTI3OSxcIk9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uXCI6dD0+dD49OTI4MCYmdDw9OTMxMSxcIkVuY2xvc2VkIEFscGhhbnVtZXJpY3NcIjp0PT50Pj05MzEyJiZ0PD05NDcxLFwiR2VvbWV0cmljIFNoYXBlc1wiOnQ9PnQ+PTk2MzImJnQ8PTk3MjcsXCJNaXNjZWxsYW5lb3VzIFN5bWJvbHNcIjp0PT50Pj05NzI4JiZ0PD05OTgzLFwiTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBBcnJvd3NcIjp0PT50Pj0xMTAwOCYmdDw9MTEyNjMsXCJJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzXCI6dD0+dD49MTIyNzImJnQ8PTEyMjg3LFwiQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uXCI6dD0+dD49MTIyODgmJnQ8PTEyMzUxLEthdGFrYW5hOnQ9PnQ+PTEyNDQ4JiZ0PD0xMjU0MyxLYW5idW46dD0+dD49MTI2ODgmJnQ8PTEyNzAzLFwiQ0pLIFN0cm9rZXNcIjp0PT50Pj0xMjczNiYmdDw9MTI3ODMsXCJFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzXCI6dD0+dD49MTI4MDAmJnQ8PTEzMDU1LFwiQ0pLIENvbXBhdGliaWxpdHlcIjp0PT50Pj0xMzA1NiYmdDw9MTMzMTEsXCJZaWppbmcgSGV4YWdyYW0gU3ltYm9sc1wiOnQ9PnQ+PTE5OTA0JiZ0PD0xOTk2NyxcIlByaXZhdGUgVXNlIEFyZWFcIjp0PT50Pj01NzM0NCYmdDw9NjM3NDMsXCJWZXJ0aWNhbCBGb3Jtc1wiOnQ9PnQ+PTY1MDQwJiZ0PD02NTA1NSxcIkNKSyBDb21wYXRpYmlsaXR5IEZvcm1zXCI6dD0+dD49NjUwNzImJnQ8PTY1MTAzLFwiU21hbGwgRm9ybSBWYXJpYW50c1wiOnQ9PnQ+PTY1MTA0JiZ0PD02NTEzNSxcIkhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXCI6dD0+dD49NjUyODAmJnQ8PTY1NTE5fTtmdW5jdGlvbiBQaSh0KXtmb3IoY29uc3QgZSBvZiB0KWlmKFRpKGUuY2hhckNvZGVBdCgwKSkpcmV0dXJuICEwO3JldHVybiAhMX1mdW5jdGlvbiBDaSh0KXtmb3IoY29uc3QgZSBvZiB0KWlmKCFFaShlLmNoYXJDb2RlQXQoMCkpKXJldHVybiAhMTtyZXR1cm4gITB9ZnVuY3Rpb24gQmkodCl7Y29uc3QgZT10Lm1hcCgodD0+e3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChgXFxcXHB7c2M9JHt0fX1gLFwidVwiKS5zb3VyY2V9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSkpLmZpbHRlcigodD0+dCkpO3JldHVybiBuZXcgUmVnRXhwKGUuam9pbihcInxcIiksXCJ1XCIpfWNvbnN0IFZpPUJpKFtcIkFyYWJcIixcIkR1cGxcIixcIk1vbmdcIixcIk91Z3JcIixcIlN5cmNcIl0pO2Z1bmN0aW9uIEVpKHQpe3JldHVybiAhVmkudGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludCh0KSl9Y29uc3QgRmk9QmkoW1wiQm9wb1wiLFwiSGFuaVwiLFwiSGlyYVwiLFwiS2FuYVwiLFwiS2l0c1wiLFwiTnNodVwiLFwiVGFuZ1wiLFwiWWlpaVwiXSk7ZnVuY3Rpb24gVGkodCl7cmV0dXJuICEoNzQ2IT09dCYmNzQ3IT09dCYmKHQ8NDM1Mnx8ISh6aVtcIkNKSyBDb21wYXRpYmlsaXR5IEZvcm1zXCJdKHQpJiYhKHQ+PTY1MDk3JiZ0PD02NTEwMyl8fHppW1wiQ0pLIENvbXBhdGliaWxpdHlcIl0odCl8fHppW1wiQ0pLIFN0cm9rZXNcIl0odCl8fCEoIXppW1wiQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uXCJdKHQpfHx0Pj0xMjI5NiYmdDw9MTIzMDV8fHQ+PTEyMzA4JiZ0PD0xMjMxOXx8MTIzMzY9PT10KXx8emlbXCJFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzXCJdKHQpfHx6aVtcIklkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnNcIl0odCl8fHppLkthbmJ1bih0KXx8emkuS2F0YWthbmEodCkmJjEyNTQwIT09dHx8ISghemlbXCJIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1wiXSh0KXx8NjUyODg9PT10fHw2NTI4OT09PXR8fDY1MjkzPT09dHx8dD49NjUzMDYmJnQ8PTY1MzEwfHw2NTMzOT09PXR8fDY1MzQxPT09dHx8NjUzNDM9PT10fHx0Pj02NTM3MSYmdDw9NjU1MDN8fDY1NTA3PT09dHx8dD49NjU1MTImJnQ8PTY1NTE5KXx8ISghemlbXCJTbWFsbCBGb3JtIFZhcmlhbnRzXCJdKHQpfHx0Pj02NTExMiYmdDw9NjUxMTh8fHQ+PTY1MTIzJiZ0PD02NTEyNil8fHppW1wiVmVydGljYWwgRm9ybXNcIl0odCl8fHppW1wiWWlqaW5nIEhleGFncmFtIFN5bWJvbHNcIl0odCl8fC9cXHB7c2M9Q2Fuc30vdS50ZXN0KFN0cmluZy5mcm9tQ29kZVBvaW50KHQpKXx8L1xccHtzYz1IYW5nfS91LnRlc3QoU3RyaW5nLmZyb21Db2RlUG9pbnQodCkpfHxGaS50ZXN0KFN0cmluZy5mcm9tQ29kZVBvaW50KHQpKSkpKX1mdW5jdGlvbiAkaSh0KXtyZXR1cm4gIShUaSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuICEhKHppW1wiTGF0aW4tMSBTdXBwbGVtZW50XCJdKHQpJiYoMTY3PT09dHx8MTY5PT09dHx8MTc0PT09dHx8MTc3PT09dHx8MTg4PT09dHx8MTg5PT09dHx8MTkwPT09dHx8MjE1PT09dHx8MjQ3PT09dCl8fHppW1wiR2VuZXJhbCBQdW5jdHVhdGlvblwiXSh0KSYmKDgyMTQ9PT10fHw4MjI0PT09dHx8ODIyNT09PXR8fDgyNDA9PT10fHw4MjQxPT09dHx8ODI1MT09PXR8fDgyNTI9PT10fHw4MjU4PT09dHx8ODI2Mz09PXR8fDgyNjQ9PT10fHw4MjY1PT09dHx8ODI3Mz09PXQpfHx6aVtcIkxldHRlcmxpa2UgU3ltYm9sc1wiXSh0KXx8emlbXCJOdW1iZXIgRm9ybXNcIl0odCl8fHppW1wiTWlzY2VsbGFuZW91cyBUZWNobmljYWxcIl0odCkmJih0Pj04OTYwJiZ0PD04OTY3fHx0Pj04OTcyJiZ0PD04OTkxfHx0Pj04OTk2JiZ0PD05ZTN8fDkwMDM9PT10fHx0Pj05MDg1JiZ0PD05MTE0fHx0Pj05MTUwJiZ0PD05MTY1fHw5MTY3PT09dHx8dD49OTE2OSYmdDw9OTE3OXx8dD49OTE4NiYmdDw9OTIxNSl8fHppW1wiQ29udHJvbCBQaWN0dXJlc1wiXSh0KSYmOTI1MSE9PXR8fHppW1wiT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb25cIl0odCl8fHppW1wiRW5jbG9zZWQgQWxwaGFudW1lcmljc1wiXSh0KXx8emlbXCJHZW9tZXRyaWMgU2hhcGVzXCJdKHQpfHx6aVtcIk1pc2NlbGxhbmVvdXMgU3ltYm9sc1wiXSh0KSYmISh0Pj05NzU0JiZ0PD05NzU5KXx8emlbXCJNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93c1wiXSh0KSYmKHQ+PTExMDI2JiZ0PD0xMTA1NXx8dD49MTEwODgmJnQ8PTExMDk3fHx0Pj0xMTE5MiYmdDw9MTEyNDMpfHx6aVtcIkNKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvblwiXSh0KXx8emkuS2F0YWthbmEodCl8fHppW1wiUHJpdmF0ZSBVc2UgQXJlYVwiXSh0KXx8emlbXCJDSksgQ29tcGF0aWJpbGl0eSBGb3Jtc1wiXSh0KXx8emlbXCJTbWFsbCBGb3JtIFZhcmlhbnRzXCJdKHQpfHx6aVtcIkhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXCJdKHQpfHw4NzM0PT09dHx8ODc1Nj09PXR8fDg3NTc9PT10fHx0Pj05OTg0JiZ0PD0xMDA4N3x8dD49MTAxMDImJnQ8PTEwMTMxfHw2NTUzMj09PXR8fDY1NTMzPT09dCl9KHQpKX1jb25zdCBMaT1CaShbXCJBZGxtXCIsXCJBcmFiXCIsXCJBcm1pXCIsXCJBdnN0XCIsXCJDaHJzXCIsXCJDcHJ0XCIsXCJFZ3lwXCIsXCJFbHltXCIsXCJHYXJhXCIsXCJIYXRyXCIsXCJIZWJyXCIsXCJIdW5nXCIsXCJLaGFyXCIsXCJMeWRpXCIsXCJNYW5kXCIsXCJNYW5pXCIsXCJNZW5kXCIsXCJNZXJjXCIsXCJNZXJvXCIsXCJOYXJiXCIsXCJOYmF0XCIsXCJOa29vXCIsXCJPcmtoXCIsXCJQYWxtXCIsXCJQaGxpXCIsXCJQaGxwXCIsXCJQaG54XCIsXCJQcnRpXCIsXCJSb2hnXCIsXCJTYW1yXCIsXCJTYXJiXCIsXCJTb2dvXCIsXCJTeXJjXCIsXCJUaGFhXCIsXCJUb2RyXCIsXCJZZXppXCJdKTtmdW5jdGlvbiBEaSh0KXtyZXR1cm4gTGkudGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludCh0KSl9ZnVuY3Rpb24gT2kodCxlKXtyZXR1cm4gISghZSYmRGkodCl8fHQ+PTIzMDQmJnQ8PTM1ODN8fHQ+PTM4NDAmJnQ8PTQyNTV8fHppLktobWVyKHQpKX1mdW5jdGlvbiBqaSh0KXtmb3IoY29uc3QgZSBvZiB0KWlmKERpKGUuY2hhckNvZGVBdCgwKSkpcmV0dXJuICEwO3JldHVybiAhMX1jb25zdCBSaT1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmFwcGx5QXJhYmljU2hhcGluZz1udWxsLHRoaXMucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0PW51bGwsdGhpcy5wcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ9bnVsbCx0aGlzLnBsdWdpblN0YXR1cz1cInVuYXZhaWxhYmxlXCIsdGhpcy5wbHVnaW5VUkw9bnVsbDt9c2V0U3RhdGUodCl7dGhpcy5wbHVnaW5TdGF0dXM9dC5wbHVnaW5TdGF0dXMsdGhpcy5wbHVnaW5VUkw9dC5wbHVnaW5VUkw7fWdldFN0YXRlKCl7cmV0dXJuIHtwbHVnaW5TdGF0dXM6dGhpcy5wbHVnaW5TdGF0dXMscGx1Z2luVVJMOnRoaXMucGx1Z2luVVJMfX1zZXRNZXRob2RzKHQpe3RoaXMuYXBwbHlBcmFiaWNTaGFwaW5nPXQuYXBwbHlBcmFiaWNTaGFwaW5nLHRoaXMucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0PXQucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0LHRoaXMucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0PXQucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0O31pc1BhcnNlZCgpe3JldHVybiBudWxsIT10aGlzLmFwcGx5QXJhYmljU2hhcGluZyYmbnVsbCE9dGhpcy5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQmJm51bGwhPXRoaXMucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0fWdldFBsdWdpblVSTCgpe3JldHVybiB0aGlzLnBsdWdpblVSTH1nZXRSVExUZXh0UGx1Z2luU3RhdHVzKCl7cmV0dXJuIHRoaXMucGx1Z2luU3RhdHVzfX07Y2xhc3MgVWl7Y29uc3RydWN0b3IodCxlKXt0aGlzLnpvb209dCxlPyh0aGlzLm5vdz1lLm5vdyx0aGlzLmZhZGVEdXJhdGlvbj1lLmZhZGVEdXJhdGlvbix0aGlzLnpvb21IaXN0b3J5PWUuem9vbUhpc3RvcnksdGhpcy50cmFuc2l0aW9uPWUudHJhbnNpdGlvbik6KHRoaXMubm93PTAsdGhpcy5mYWRlRHVyYXRpb249MCx0aGlzLnpvb21IaXN0b3J5PW5ldyBJaSx0aGlzLnRyYW5zaXRpb249e30pO31pc1N1cHBvcnRlZFNjcmlwdCh0KXtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IoY29uc3QgciBvZiB0KWlmKCFPaShyLmNoYXJDb2RlQXQoMCksZSkpcmV0dXJuICExO3JldHVybiAhMH0odCxcImxvYWRlZFwiPT09UmkuZ2V0UlRMVGV4dFBsdWdpblN0YXR1cygpKX1jcm9zc0ZhZGluZ0ZhY3Rvcigpe3JldHVybiAwPT09dGhpcy5mYWRlRHVyYXRpb24/MTpNYXRoLm1pbigodGhpcy5ub3ctdGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb21UaW1lKS90aGlzLmZhZGVEdXJhdGlvbiwxKX1nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCl7Y29uc3QgdD10aGlzLnpvb20sZT10LU1hdGguZmxvb3IodCkscj10aGlzLmNyb3NzRmFkaW5nRmFjdG9yKCk7cmV0dXJuIHQ+dGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20/e2Zyb21TY2FsZToyLHRvU2NhbGU6MSx0OmUrKDEtZSkqcn06e2Zyb21TY2FsZTouNSx0b1NjYWxlOjEsdDoxLSgxLXIpKmV9fX1jbGFzcyBxaXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucHJvcGVydHk9dCx0aGlzLnZhbHVlPWUsdGhpcy5leHByZXNzaW9uPWZ1bmN0aW9uKHQsZSl7aWYoY24odCkpcmV0dXJuIG5ldyBTbih0LGUpO2lmKHZuKHQpKXtjb25zdCByPUFuKHQsZSk7aWYoXCJlcnJvclwiPT09ci5yZXN1bHQpdGhyb3cgbmV3IEVycm9yKHIudmFsdWUubWFwKCh0PT5gJHt0LmtleX06ICR7dC5tZXNzYWdlfWApKS5qb2luKFwiLCBcIikpO3JldHVybiByLnZhbHVlfXtsZXQgcj10O3JldHVybiBcImNvbG9yXCI9PT1lLnR5cGUmJlwic3RyaW5nXCI9PXR5cGVvZiB0P3I9S3QucGFyc2UodCk6XCJwYWRkaW5nXCIhPT1lLnR5cGV8fFwibnVtYmVyXCIhPXR5cGVvZiB0JiYhQXJyYXkuaXNBcnJheSh0KT9cInZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvblwiPT09ZS50eXBlJiZBcnJheS5pc0FycmF5KHQpJiYocj1RdC5wYXJzZSh0KSk6cj1KdC5wYXJzZSh0KSx7a2luZDpcImNvbnN0YW50XCIsZXZhbHVhdGU6KCk9PnJ9fX0odm9pZCAwPT09ZT90LnNwZWNpZmljYXRpb24uZGVmYXVsdDplLHQuc3BlY2lmaWNhdGlvbik7fWlzRGF0YURyaXZlbigpe3JldHVybiBcInNvdXJjZVwiPT09dGhpcy5leHByZXNzaW9uLmtpbmR8fFwiY29tcG9zaXRlXCI9PT10aGlzLmV4cHJlc3Npb24ua2luZH1wb3NzaWJseUV2YWx1YXRlKHQsZSxyKXtyZXR1cm4gdGhpcy5wcm9wZXJ0eS5wb3NzaWJseUV2YWx1YXRlKHRoaXMsdCxlLHIpfX1jbGFzcyBOaXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnByb3BlcnR5PXQsdGhpcy52YWx1ZT1uZXcgcWkodCx2b2lkIDApO310cmFuc2l0aW9uZWQodCxlKXtyZXR1cm4gbmV3IEdpKHRoaXMucHJvcGVydHksdGhpcy52YWx1ZSxlLGcoe30sdC50cmFuc2l0aW9uLHRoaXMudHJhbnNpdGlvbiksdC5ub3cpfXVudHJhbnNpdGlvbmVkKCl7cmV0dXJuIG5ldyBHaSh0aGlzLnByb3BlcnR5LHRoaXMudmFsdWUsbnVsbCx7fSwwKX19Y2xhc3MgWml7Y29uc3RydWN0b3IodCl7dGhpcy5fcHJvcGVydGllcz10LHRoaXMuX3ZhbHVlcz1PYmplY3QuY3JlYXRlKHQuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXMpO31nZXRWYWx1ZSh0KXtyZXR1cm4gdyh0aGlzLl92YWx1ZXNbdF0udmFsdWUudmFsdWUpfXNldFZhbHVlKHQsZSl7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3ZhbHVlcyx0KXx8KHRoaXMuX3ZhbHVlc1t0XT1uZXcgTmkodGhpcy5fdmFsdWVzW3RdLnByb3BlcnR5KSksdGhpcy5fdmFsdWVzW3RdLnZhbHVlPW5ldyBxaSh0aGlzLl92YWx1ZXNbdF0ucHJvcGVydHksbnVsbD09PWU/dm9pZCAwOncoZSkpO31nZXRUcmFuc2l0aW9uKHQpe3JldHVybiB3KHRoaXMuX3ZhbHVlc1t0XS50cmFuc2l0aW9uKX1zZXRUcmFuc2l0aW9uKHQsZSl7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3ZhbHVlcyx0KXx8KHRoaXMuX3ZhbHVlc1t0XT1uZXcgTmkodGhpcy5fdmFsdWVzW3RdLnByb3BlcnR5KSksdGhpcy5fdmFsdWVzW3RdLnRyYW5zaXRpb249dyhlKXx8dm9pZCAwO31zZXJpYWxpemUoKXtjb25zdCB0PXt9O2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpe2NvbnN0IHI9dGhpcy5nZXRWYWx1ZShlKTt2b2lkIDAhPT1yJiYodFtlXT1yKTtjb25zdCBuPXRoaXMuZ2V0VHJhbnNpdGlvbihlKTt2b2lkIDAhPT1uJiYodFtgJHtlfS10cmFuc2l0aW9uYF09bik7fXJldHVybiB0fXRyYW5zaXRpb25lZCh0LGUpe2NvbnN0IHI9bmV3IEtpKHRoaXMuX3Byb3BlcnRpZXMpO2Zvcihjb25zdCBuIG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpci5fdmFsdWVzW25dPXRoaXMuX3ZhbHVlc1tuXS50cmFuc2l0aW9uZWQodCxlLl92YWx1ZXNbbl0pO3JldHVybiByfXVudHJhbnNpdGlvbmVkKCl7Y29uc3QgdD1uZXcgS2kodGhpcy5fcHJvcGVydGllcyk7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSl0Ll92YWx1ZXNbZV09dGhpcy5fdmFsdWVzW2VdLnVudHJhbnNpdGlvbmVkKCk7cmV0dXJuIHR9fWNsYXNzIEdpe2NvbnN0cnVjdG9yKHQsZSxyLG4saSl7dGhpcy5wcm9wZXJ0eT10LHRoaXMudmFsdWU9ZSx0aGlzLmJlZ2luPWkrbi5kZWxheXx8MCx0aGlzLmVuZD10aGlzLmJlZ2luK24uZHVyYXRpb258fDAsdC5zcGVjaWZpY2F0aW9uLnRyYW5zaXRpb24mJihuLmRlbGF5fHxuLmR1cmF0aW9uKSYmKHRoaXMucHJpb3I9cik7fXBvc3NpYmx5RXZhbHVhdGUodCxlLHIpe2NvbnN0IG49dC5ub3d8fDAsaT10aGlzLnZhbHVlLnBvc3NpYmx5RXZhbHVhdGUodCxlLHIpLHM9dGhpcy5wcmlvcjtpZihzKXtpZihuPnRoaXMuZW5kKXJldHVybiB0aGlzLnByaW9yPW51bGwsaTtpZih0aGlzLnZhbHVlLmlzRGF0YURyaXZlbigpKXJldHVybiB0aGlzLnByaW9yPW51bGwsaTtpZihuPHRoaXMuYmVnaW4pcmV0dXJuIHMucG9zc2libHlFdmFsdWF0ZSh0LGUscik7e2NvbnN0IGE9KG4tdGhpcy5iZWdpbikvKHRoaXMuZW5kLXRoaXMuYmVnaW4pO3JldHVybiB0aGlzLnByb3BlcnR5LmludGVycG9sYXRlKHMucG9zc2libHlFdmFsdWF0ZSh0LGUsciksaSxmdW5jdGlvbih0KXtpZih0PD0wKXJldHVybiAwO2lmKHQ+PTEpcmV0dXJuIDE7Y29uc3QgZT10KnQscj1lKnQ7cmV0dXJuIDQqKHQ8LjU/cjozKih0LWUpK3ItLjc1KX0oYSkpfX1yZXR1cm4gaX19Y2xhc3MgS2l7Y29uc3RydWN0b3IodCl7dGhpcy5fcHJvcGVydGllcz10LHRoaXMuX3ZhbHVlcz1PYmplY3QuY3JlYXRlKHQuZGVmYXVsdFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlcyk7fXBvc3NpYmx5RXZhbHVhdGUodCxlLHIpe2NvbnN0IG49bmV3IFlpKHRoaXMuX3Byb3BlcnRpZXMpO2Zvcihjb25zdCBpIG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpbi5fdmFsdWVzW2ldPXRoaXMuX3ZhbHVlc1tpXS5wb3NzaWJseUV2YWx1YXRlKHQsZSxyKTtyZXR1cm4gbn1oYXNUcmFuc2l0aW9uKCl7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSlpZih0aGlzLl92YWx1ZXNbdF0ucHJpb3IpcmV0dXJuICEwO3JldHVybiAhMX19Y2xhc3MgWGl7Y29uc3RydWN0b3IodCl7dGhpcy5fcHJvcGVydGllcz10LHRoaXMuX3ZhbHVlcz1PYmplY3QuY3JlYXRlKHQuZGVmYXVsdFByb3BlcnR5VmFsdWVzKTt9aGFzVmFsdWUodCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3ZhbHVlc1t0XS52YWx1ZX1nZXRWYWx1ZSh0KXtyZXR1cm4gdyh0aGlzLl92YWx1ZXNbdF0udmFsdWUpfXNldFZhbHVlKHQsZSl7dGhpcy5fdmFsdWVzW3RdPW5ldyBxaSh0aGlzLl92YWx1ZXNbdF0ucHJvcGVydHksbnVsbD09PWU/dm9pZCAwOncoZSkpO31zZXJpYWxpemUoKXtjb25zdCB0PXt9O2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpe2NvbnN0IHI9dGhpcy5nZXRWYWx1ZShlKTt2b2lkIDAhPT1yJiYodFtlXT1yKTt9cmV0dXJuIHR9cG9zc2libHlFdmFsdWF0ZSh0LGUscil7Y29uc3Qgbj1uZXcgWWkodGhpcy5fcHJvcGVydGllcyk7Zm9yKGNvbnN0IGkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSluLl92YWx1ZXNbaV09dGhpcy5fdmFsdWVzW2ldLnBvc3NpYmx5RXZhbHVhdGUodCxlLHIpO3JldHVybiBufX1jbGFzcyBIaXtjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy5wcm9wZXJ0eT10LHRoaXMudmFsdWU9ZSx0aGlzLnBhcmFtZXRlcnM9cjt9aXNDb25zdGFudCgpe3JldHVybiBcImNvbnN0YW50XCI9PT10aGlzLnZhbHVlLmtpbmR9Y29uc3RhbnRPcih0KXtyZXR1cm4gXCJjb25zdGFudFwiPT09dGhpcy52YWx1ZS5raW5kP3RoaXMudmFsdWUudmFsdWU6dH1ldmFsdWF0ZSh0LGUscixuKXtyZXR1cm4gdGhpcy5wcm9wZXJ0eS5ldmFsdWF0ZSh0aGlzLnZhbHVlLHRoaXMucGFyYW1ldGVycyx0LGUscixuKX19Y2xhc3MgWWl7Y29uc3RydWN0b3IodCl7dGhpcy5fcHJvcGVydGllcz10LHRoaXMuX3ZhbHVlcz1PYmplY3QuY3JlYXRlKHQuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzKTt9Z2V0KHQpe3JldHVybiB0aGlzLl92YWx1ZXNbdF19fWNsYXNzIEppe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3BlY2lmaWNhdGlvbj10O31wb3NzaWJseUV2YWx1YXRlKHQsZSl7aWYodC5pc0RhdGFEcml2ZW4oKSl0aHJvdyBuZXcgRXJyb3IoXCJWYWx1ZSBzaG91bGQgbm90IGJlIGRhdGEgZHJpdmVuXCIpO3JldHVybiB0LmV4cHJlc3Npb24uZXZhbHVhdGUoZSl9aW50ZXJwb2xhdGUodCxlLHIpe2NvbnN0IG49Q2VbdGhpcy5zcGVjaWZpY2F0aW9uLnR5cGVdO3JldHVybiBuP24odCxlLHIpOnR9fWNsYXNzIFdpe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zcGVjaWZpY2F0aW9uPXQsdGhpcy5vdmVycmlkZXM9ZTt9cG9zc2libHlFdmFsdWF0ZSh0LGUscixuKXtyZXR1cm4gbmV3IEhpKHRoaXMsXCJjb25zdGFudFwiPT09dC5leHByZXNzaW9uLmtpbmR8fFwiY2FtZXJhXCI9PT10LmV4cHJlc3Npb24ua2luZD97a2luZDpcImNvbnN0YW50XCIsdmFsdWU6dC5leHByZXNzaW9uLmV2YWx1YXRlKGUsbnVsbCx7fSxyLG4pfTp0LmV4cHJlc3Npb24sZSl9aW50ZXJwb2xhdGUodCxlLHIpe2lmKFwiY29uc3RhbnRcIiE9PXQudmFsdWUua2luZHx8XCJjb25zdGFudFwiIT09ZS52YWx1ZS5raW5kKXJldHVybiB0O2lmKHZvaWQgMD09PXQudmFsdWUudmFsdWV8fHZvaWQgMD09PWUudmFsdWUudmFsdWUpcmV0dXJuIG5ldyBIaSh0aGlzLHtraW5kOlwiY29uc3RhbnRcIix2YWx1ZTp2b2lkIDB9LHQucGFyYW1ldGVycyk7Y29uc3Qgbj1DZVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07aWYobil7Y29uc3QgaT1uKHQudmFsdWUudmFsdWUsZS52YWx1ZS52YWx1ZSxyKTtyZXR1cm4gbmV3IEhpKHRoaXMse2tpbmQ6XCJjb25zdGFudFwiLHZhbHVlOml9LHQucGFyYW1ldGVycyl9cmV0dXJuIHR9ZXZhbHVhdGUodCxlLHIsbixpLHMpe3JldHVybiBcImNvbnN0YW50XCI9PT10LmtpbmQ/dC52YWx1ZTp0LmV2YWx1YXRlKGUscixuLGkscyl9fWNsYXNzIFFpIGV4dGVuZHMgV2l7cG9zc2libHlFdmFsdWF0ZSh0LGUscixuKXtpZih2b2lkIDA9PT10LnZhbHVlKXJldHVybiBuZXcgSGkodGhpcyx7a2luZDpcImNvbnN0YW50XCIsdmFsdWU6dm9pZCAwfSxlKTtpZihcImNvbnN0YW50XCI9PT10LmV4cHJlc3Npb24ua2luZCl7Y29uc3QgaT10LmV4cHJlc3Npb24uZXZhbHVhdGUoZSxudWxsLHt9LHIsbikscz1cInJlc29sdmVkSW1hZ2VcIj09PXQucHJvcGVydHkuc3BlY2lmaWNhdGlvbi50eXBlJiZcInN0cmluZ1wiIT10eXBlb2YgaT9pLm5hbWU6aSxhPXRoaXMuX2NhbGN1bGF0ZShzLHMscyxlKTtyZXR1cm4gbmV3IEhpKHRoaXMse2tpbmQ6XCJjb25zdGFudFwiLHZhbHVlOmF9LGUpfWlmKFwiY2FtZXJhXCI9PT10LmV4cHJlc3Npb24ua2luZCl7Y29uc3Qgcj10aGlzLl9jYWxjdWxhdGUodC5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOmUuem9vbS0xfSksdC5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOmUuem9vbX0pLHQuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTplLnpvb20rMX0pLGUpO3JldHVybiBuZXcgSGkodGhpcyx7a2luZDpcImNvbnN0YW50XCIsdmFsdWU6cn0sZSl9cmV0dXJuIG5ldyBIaSh0aGlzLHQuZXhwcmVzc2lvbixlKX1ldmFsdWF0ZSh0LGUscixuLGkscyl7aWYoXCJzb3VyY2VcIj09PXQua2luZCl7Y29uc3QgYT10LmV2YWx1YXRlKGUscixuLGkscyk7cmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShhLGEsYSxlKX1yZXR1cm4gXCJjb21wb3NpdGVcIj09PXQua2luZD90aGlzLl9jYWxjdWxhdGUodC5ldmFsdWF0ZSh7em9vbTpNYXRoLmZsb29yKGUuem9vbSktMX0scixuKSx0LmV2YWx1YXRlKHt6b29tOk1hdGguZmxvb3IoZS56b29tKX0scixuKSx0LmV2YWx1YXRlKHt6b29tOk1hdGguZmxvb3IoZS56b29tKSsxfSxyLG4pLGUpOnQudmFsdWV9X2NhbGN1bGF0ZSh0LGUscixuKXtyZXR1cm4gbi56b29tPm4uem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tP3tmcm9tOnQsdG86ZX06e2Zyb206cix0bzplfX1pbnRlcnBvbGF0ZSh0KXtyZXR1cm4gdH19Y2xhc3MgdHN7Y29uc3RydWN0b3IodCl7dGhpcy5zcGVjaWZpY2F0aW9uPXQ7fXBvc3NpYmx5RXZhbHVhdGUodCxlLHIsbil7aWYodm9pZCAwIT09dC52YWx1ZSl7aWYoXCJjb25zdGFudFwiPT09dC5leHByZXNzaW9uLmtpbmQpe2NvbnN0IGk9dC5leHByZXNzaW9uLmV2YWx1YXRlKGUsbnVsbCx7fSxyLG4pO3JldHVybiB0aGlzLl9jYWxjdWxhdGUoaSxpLGksZSl9cmV0dXJuIHRoaXMuX2NhbGN1bGF0ZSh0LmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IFVpKE1hdGguZmxvb3IoZS56b29tLTEpLGUpKSx0LmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IFVpKE1hdGguZmxvb3IoZS56b29tKSxlKSksdC5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBVaShNYXRoLmZsb29yKGUuem9vbSsxKSxlKSksZSl9fV9jYWxjdWxhdGUodCxlLHIsbil7cmV0dXJuIG4uem9vbT5uLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbT97ZnJvbTp0LHRvOmV9Ontmcm9tOnIsdG86ZX19aW50ZXJwb2xhdGUodCl7cmV0dXJuIHR9fWNsYXNzIGVze2NvbnN0cnVjdG9yKHQpe3RoaXMuc3BlY2lmaWNhdGlvbj10O31wb3NzaWJseUV2YWx1YXRlKHQsZSxyLG4pe3JldHVybiAhIXQuZXhwcmVzc2lvbi5ldmFsdWF0ZShlLG51bGwse30scixuKX1pbnRlcnBvbGF0ZSgpe3JldHVybiAhMX19Y2xhc3MgcnN7Y29uc3RydWN0b3IodCl7dGhpcy5wcm9wZXJ0aWVzPXQsdGhpcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXM9e30sdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlcz17fSx0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXM9e30sdGhpcy5kZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXM9e30sdGhpcy5vdmVycmlkYWJsZVByb3BlcnRpZXM9W107Zm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgcj10W2VdO3Iuc3BlY2lmaWNhdGlvbi5vdmVycmlkYWJsZSYmdGhpcy5vdmVycmlkYWJsZVByb3BlcnRpZXMucHVzaChlKTtjb25zdCBuPXRoaXMuZGVmYXVsdFByb3BlcnR5VmFsdWVzW2VdPW5ldyBxaShyLHZvaWQgMCksaT10aGlzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzW2VdPW5ldyBOaShyKTt0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXNbZV09aS51bnRyYW5zaXRpb25lZCgpLHRoaXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzW2VdPW4ucG9zc2libHlFdmFsdWF0ZSh7fSk7fX19d2koXCJEYXRhRHJpdmVuUHJvcGVydHlcIixXaSksd2koXCJEYXRhQ29uc3RhbnRQcm9wZXJ0eVwiLEppKSx3aShcIkNyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHlcIixRaSksd2koXCJDcm9zc0ZhZGVkUHJvcGVydHlcIix0cyksd2koXCJDb2xvclJhbXBQcm9wZXJ0eVwiLGVzKTtjb25zdCBucz1cIi10cmFuc2l0aW9uXCI7Y2xhc3MgaXMgZXh0ZW5kcyBae2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSx0aGlzLmlkPXQuaWQsdGhpcy50eXBlPXQudHlwZSx0aGlzLl9mZWF0dXJlRmlsdGVyPXtmaWx0ZXI6KCk9PiEwLG5lZWRHZW9tZXRyeTohMX0sXCJjdXN0b21cIiE9PXQudHlwZSYmKHRoaXMubWV0YWRhdGE9dC5tZXRhZGF0YSx0aGlzLm1pbnpvb209dC5taW56b29tLHRoaXMubWF4em9vbT10Lm1heHpvb20sXCJiYWNrZ3JvdW5kXCIhPT10LnR5cGUmJih0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLnNvdXJjZUxheWVyPXRbXCJzb3VyY2UtbGF5ZXJcIl0sdGhpcy5maWx0ZXI9dC5maWx0ZXIpLGUubGF5b3V0JiYodGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQ9bmV3IFhpKGUubGF5b3V0KSksZS5wYWludCkpe3RoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQ9bmV3IFppKGUucGFpbnQpO2Zvcihjb25zdCBlIGluIHQucGFpbnQpdGhpcy5zZXRQYWludFByb3BlcnR5KGUsdC5wYWludFtlXSx7dmFsaWRhdGU6ITF9KTtmb3IoY29uc3QgZSBpbiB0LmxheW91dCl0aGlzLnNldExheW91dFByb3BlcnR5KGUsdC5sYXlvdXRbZV0se3ZhbGlkYXRlOiExfSk7dGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50PXRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudW50cmFuc2l0aW9uZWQoKSx0aGlzLnBhaW50PW5ldyBZaShlLnBhaW50KTt9fWdldENyb3NzZmFkZVBhcmFtZXRlcnMoKXtyZXR1cm4gdGhpcy5fY3Jvc3NmYWRlUGFyYW1ldGVyc31nZXRMYXlvdXRQcm9wZXJ0eSh0KXtyZXR1cm4gXCJ2aXNpYmlsaXR5XCI9PT10P3RoaXMudmlzaWJpbGl0eTp0aGlzLl91bmV2YWx1YXRlZExheW91dC5nZXRWYWx1ZSh0KX1zZXRMYXlvdXRQcm9wZXJ0eSh0LGUscj17fSl7bnVsbCE9ZSYmdGhpcy5fdmFsaWRhdGUoZ2ksYGxheWVycy4ke3RoaXMuaWR9LmxheW91dC4ke3R9YCx0LGUscil8fChcInZpc2liaWxpdHlcIiE9PXQ/dGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2V0VmFsdWUodCxlKTp0aGlzLnZpc2liaWxpdHk9ZSk7fWdldFBhaW50UHJvcGVydHkodCl7cmV0dXJuIHQuZW5kc1dpdGgobnMpP3RoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuZ2V0VHJhbnNpdGlvbih0LnNsaWNlKDAsLTExKSk6dGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRWYWx1ZSh0KX1zZXRQYWludFByb3BlcnR5KHQsZSxyPXt9KXtpZihudWxsIT1lJiZ0aGlzLl92YWxpZGF0ZShtaSxgbGF5ZXJzLiR7dGhpcy5pZH0ucGFpbnQuJHt0fWAsdCxlLHIpKXJldHVybiAhMTtpZih0LmVuZHNXaXRoKG5zKSlyZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5zZXRUcmFuc2l0aW9uKHQuc2xpY2UoMCwtMTEpLGV8fHZvaWQgMCksITE7e2NvbnN0IHI9dGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW3RdLG49XCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlblwiPT09ci5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uW1wicHJvcGVydHktdHlwZVwiXSxpPXIudmFsdWUuaXNEYXRhRHJpdmVuKCkscz1yLnZhbHVlO3RoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2V0VmFsdWUodCxlKSx0aGlzLl9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZSh0KTtjb25zdCBhPXRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1t0XS52YWx1ZTtyZXR1cm4gYS5pc0RhdGFEcml2ZW4oKXx8aXx8bnx8dGhpcy5faGFuZGxlT3ZlcnJpZGFibGVQYWludFByb3BlcnR5VXBkYXRlKHQscyxhKX19X2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKHQpe31faGFuZGxlT3ZlcnJpZGFibGVQYWludFByb3BlcnR5VXBkYXRlKHQsZSxyKXtyZXR1cm4gITF9aXNIaWRkZW4odCl7cmV0dXJuICEhKHRoaXMubWluem9vbSYmdDx0aGlzLm1pbnpvb20pfHwhISh0aGlzLm1heHpvb20mJnQ+PXRoaXMubWF4em9vbSl8fFwibm9uZVwiPT09dGhpcy52aXNpYmlsaXR5fXVwZGF0ZVRyYW5zaXRpb25zKHQpe3RoaXMuX3RyYW5zaXRpb25pbmdQYWludD10aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnRyYW5zaXRpb25lZCh0LHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCk7fWhhc1RyYW5zaXRpb24oKXtyZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50Lmhhc1RyYW5zaXRpb24oKX1yZWNhbGN1bGF0ZSh0LGUpe3QuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycyYmKHRoaXMuX2Nyb3NzZmFkZVBhcmFtZXRlcnM9dC5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCkpLHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0JiYodGhpcy5sYXlvdXQ9dGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQucG9zc2libHlFdmFsdWF0ZSh0LHZvaWQgMCxlKSksdGhpcy5wYWludD10aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQucG9zc2libHlFdmFsdWF0ZSh0LHZvaWQgMCxlKTt9c2VyaWFsaXplKCl7Y29uc3QgdD17aWQ6dGhpcy5pZCx0eXBlOnRoaXMudHlwZSxzb3VyY2U6dGhpcy5zb3VyY2UsXCJzb3VyY2UtbGF5ZXJcIjp0aGlzLnNvdXJjZUxheWVyLG1ldGFkYXRhOnRoaXMubWV0YWRhdGEsbWluem9vbTp0aGlzLm1pbnpvb20sbWF4em9vbTp0aGlzLm1heHpvb20sZmlsdGVyOnRoaXMuZmlsdGVyLGxheW91dDp0aGlzLl91bmV2YWx1YXRlZExheW91dCYmdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2VyaWFsaXplKCkscGFpbnQ6dGhpcy5fdHJhbnNpdGlvbmFibGVQYWludCYmdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5zZXJpYWxpemUoKX07cmV0dXJuIHRoaXMudmlzaWJpbGl0eSYmKHQubGF5b3V0PXQubGF5b3V0fHx7fSx0LmxheW91dC52aXNpYmlsaXR5PXRoaXMudmlzaWJpbGl0eSksYih0LCgodCxlKT0+ISh2b2lkIDA9PT10fHxcImxheW91dFwiPT09ZSYmIU9iamVjdC5rZXlzKHQpLmxlbmd0aHx8XCJwYWludFwiPT09ZSYmIU9iamVjdC5rZXlzKHQpLmxlbmd0aCkpKX1fdmFsaWRhdGUodCxlLHIsbixpPXt9KXtyZXR1cm4gKCFpfHwhMSE9PWkudmFsaWRhdGUpJiZ4aSh0aGlzLHQuY2FsbChmaSx7a2V5OmUsbGF5ZXJUeXBlOnRoaXMudHlwZSxvYmplY3RLZXk6cix2YWx1ZTpuLHN0eWxlU3BlYzpHLHN0eWxlOntnbHlwaHM6ITAsc3ByaXRlOiEwfX0pKX1pczNEKCl7cmV0dXJuICExfWlzVGlsZUNsaXBwZWQoKXtyZXR1cm4gITF9aGFzT2Zmc2NyZWVuUGFzcygpe3JldHVybiAhMX1yZXNpemUoKXt9aXNTdGF0ZURlcGVuZGVudCgpe2Zvcihjb25zdCB0IGluIHRoaXMucGFpbnQuX3ZhbHVlcyl7Y29uc3QgZT10aGlzLnBhaW50LmdldCh0KTtpZihlIGluc3RhbmNlb2YgSGkmJmFuKGUucHJvcGVydHkuc3BlY2lmaWNhdGlvbikmJihcInNvdXJjZVwiPT09ZS52YWx1ZS5raW5kfHxcImNvbXBvc2l0ZVwiPT09ZS52YWx1ZS5raW5kKSYmZS52YWx1ZS5pc1N0YXRlRGVwZW5kZW50KXJldHVybiAhMH1yZXR1cm4gITF9fWNvbnN0IHNzPXtJbnQ4OkludDhBcnJheSxVaW50ODpVaW50OEFycmF5LEludDE2OkludDE2QXJyYXksVWludDE2OlVpbnQxNkFycmF5LEludDMyOkludDMyQXJyYXksVWludDMyOlVpbnQzMkFycmF5LEZsb2F0MzI6RmxvYXQzMkFycmF5fTtjbGFzcyBhc3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3N0cnVjdEFycmF5PXQsdGhpcy5fcG9zMT1lKnRoaXMuc2l6ZSx0aGlzLl9wb3MyPXRoaXMuX3BvczEvMix0aGlzLl9wb3M0PXRoaXMuX3BvczEvNCx0aGlzLl9wb3M4PXRoaXMuX3BvczEvODt9fWNsYXNzIG9ze2NvbnN0cnVjdG9yKCl7dGhpcy5pc1RyYW5zZmVycmVkPSExLHRoaXMuY2FwYWNpdHk9LTEsdGhpcy5yZXNpemUoMCk7fXN0YXRpYyBzZXJpYWxpemUodCxlKXtyZXR1cm4gdC5fdHJpbSgpLGUmJih0LmlzVHJhbnNmZXJyZWQ9ITAsZS5wdXNoKHQuYXJyYXlCdWZmZXIpKSx7bGVuZ3RoOnQubGVuZ3RoLGFycmF5QnVmZmVyOnQuYXJyYXlCdWZmZXJ9fXN0YXRpYyBkZXNlcmlhbGl6ZSh0KXtjb25zdCBlPU9iamVjdC5jcmVhdGUodGhpcy5wcm90b3R5cGUpO3JldHVybiBlLmFycmF5QnVmZmVyPXQuYXJyYXlCdWZmZXIsZS5sZW5ndGg9dC5sZW5ndGgsZS5jYXBhY2l0eT10LmFycmF5QnVmZmVyLmJ5dGVMZW5ndGgvZS5ieXRlc1BlckVsZW1lbnQsZS5fcmVmcmVzaFZpZXdzKCksZX1fdHJpbSgpe3RoaXMubGVuZ3RoIT09dGhpcy5jYXBhY2l0eSYmKHRoaXMuY2FwYWNpdHk9dGhpcy5sZW5ndGgsdGhpcy5hcnJheUJ1ZmZlcj10aGlzLmFycmF5QnVmZmVyLnNsaWNlKDAsdGhpcy5sZW5ndGgqdGhpcy5ieXRlc1BlckVsZW1lbnQpLHRoaXMuX3JlZnJlc2hWaWV3cygpKTt9Y2xlYXIoKXt0aGlzLmxlbmd0aD0wO31yZXNpemUodCl7dGhpcy5yZXNlcnZlKHQpLHRoaXMubGVuZ3RoPXQ7fXJlc2VydmUodCl7aWYodD50aGlzLmNhcGFjaXR5KXt0aGlzLmNhcGFjaXR5PU1hdGgubWF4KHQsTWF0aC5mbG9vcig1KnRoaXMuY2FwYWNpdHkpLDEyOCksdGhpcy5hcnJheUJ1ZmZlcj1uZXcgQXJyYXlCdWZmZXIodGhpcy5jYXBhY2l0eSp0aGlzLmJ5dGVzUGVyRWxlbWVudCk7Y29uc3QgZT10aGlzLnVpbnQ4O3RoaXMuX3JlZnJlc2hWaWV3cygpLGUmJnRoaXMudWludDguc2V0KGUpO319X3JlZnJlc2hWaWV3cygpe3Rocm93IG5ldyBFcnJvcihcIl9yZWZyZXNoVmlld3MoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggY29uY3JldGUgU3RydWN0QXJyYXkgbGF5b3V0XCIpfX1mdW5jdGlvbiBscyh0LGU9MSl7bGV0IHI9MCxuPTA7cmV0dXJuIHttZW1iZXJzOnQubWFwKCh0PT57Y29uc3QgaT1zc1t0LnR5cGVdLkJZVEVTX1BFUl9FTEVNRU5ULHM9cj11cyhyLE1hdGgubWF4KGUsaSkpLGE9dC5jb21wb25lbnRzfHwxO3JldHVybiBuPU1hdGgubWF4KG4saSkscis9aSphLHtuYW1lOnQubmFtZSx0eXBlOnQudHlwZSxjb21wb25lbnRzOmEsb2Zmc2V0OnN9fSkpLHNpemU6dXMocixNYXRoLm1heChuLGUpKSxhbGlnbm1lbnQ6ZX19ZnVuY3Rpb24gdXModCxlKXtyZXR1cm4gTWF0aC5jZWlsKHQvZSkqZX1jbGFzcyBjcyBleHRlbmRzIG9ze19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQsZSl7Y29uc3Qgcj10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUocisxKSx0aGlzLmVtcGxhY2Uocix0LGUpfWVtcGxhY2UodCxlLHIpe2NvbnN0IG49Mip0O3JldHVybiB0aGlzLmludDE2W24rMF09ZSx0aGlzLmludDE2W24rMV09cix0fX1jcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTQsd2koXCJTdHJ1Y3RBcnJheUxheW91dDJpNFwiLGNzKTtjbGFzcyBocyBleHRlbmRzIG9ze19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQsZSxyKXtjb25zdCBuPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShuKzEpLHRoaXMuZW1wbGFjZShuLHQsZSxyKX1lbXBsYWNlKHQsZSxyLG4pe2NvbnN0IGk9Myp0O3JldHVybiB0aGlzLmludDE2W2krMF09ZSx0aGlzLmludDE2W2krMV09cix0aGlzLmludDE2W2krMl09bix0fX1ocy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTYsd2koXCJTdHJ1Y3RBcnJheUxheW91dDNpNlwiLGhzKTtjbGFzcyBwcyBleHRlbmRzIG9ze19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQsZSxyLG4pe2NvbnN0IGk9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKGkrMSksdGhpcy5lbXBsYWNlKGksdCxlLHIsbil9ZW1wbGFjZSh0LGUscixuLGkpe2NvbnN0IHM9NCp0O3JldHVybiB0aGlzLmludDE2W3MrMF09ZSx0aGlzLmludDE2W3MrMV09cix0aGlzLmludDE2W3MrMl09bix0aGlzLmludDE2W3MrM109aSx0fX1wcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTgsd2koXCJTdHJ1Y3RBcnJheUxheW91dDRpOFwiLHBzKTtjbGFzcyBmcyBleHRlbmRzIG9ze19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQsZSxyLG4saSxzKXtjb25zdCBhPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShhKzEpLHRoaXMuZW1wbGFjZShhLHQsZSxyLG4saSxzKX1lbXBsYWNlKHQsZSxyLG4saSxzLGEpe2NvbnN0IG89Nip0O3JldHVybiB0aGlzLmludDE2W28rMF09ZSx0aGlzLmludDE2W28rMV09cix0aGlzLmludDE2W28rMl09bix0aGlzLmludDE2W28rM109aSx0aGlzLmludDE2W28rNF09cyx0aGlzLmludDE2W28rNV09YSx0fX1mcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTEyLHdpKFwiU3RydWN0QXJyYXlMYXlvdXQyaTRpMTJcIixmcyk7Y2xhc3MgZHMgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmludDE2PW5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO31lbXBsYWNlQmFjayh0LGUscixuLGkscyl7Y29uc3QgYT10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoYSsxKSx0aGlzLmVtcGxhY2UoYSx0LGUscixuLGkscyl9ZW1wbGFjZSh0LGUscixuLGkscyxhKXtjb25zdCBvPTQqdCxsPTgqdDtyZXR1cm4gdGhpcy5pbnQxNltvKzBdPWUsdGhpcy5pbnQxNltvKzFdPXIsdGhpcy51aW50OFtsKzRdPW4sdGhpcy51aW50OFtsKzVdPWksdGhpcy51aW50OFtsKzZdPXMsdGhpcy51aW50OFtsKzddPWEsdH19ZHMucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD04LHdpKFwiU3RydWN0QXJyYXlMYXlvdXQyaTR1YjhcIixkcyk7Y2xhc3MgeXMgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTt9ZW1wbGFjZUJhY2sodCxlKXtjb25zdCByPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShyKzEpLHRoaXMuZW1wbGFjZShyLHQsZSl9ZW1wbGFjZSh0LGUscil7Y29uc3Qgbj0yKnQ7cmV0dXJuIHRoaXMuZmxvYXQzMltuKzBdPWUsdGhpcy5mbG9hdDMyW24rMV09cix0fX15cy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTgsd2koXCJTdHJ1Y3RBcnJheUxheW91dDJmOFwiLHlzKTtjbGFzcyBtcyBleHRlbmRzIG9ze19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTt9ZW1wbGFjZUJhY2sodCxlLHIsbixpLHMsYSxvLGwsdSl7Y29uc3QgYz10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoYysxKSx0aGlzLmVtcGxhY2UoYyx0LGUscixuLGkscyxhLG8sbCx1KX1lbXBsYWNlKHQsZSxyLG4saSxzLGEsbyxsLHUsYyl7Y29uc3QgaD0xMCp0O3JldHVybiB0aGlzLnVpbnQxNltoKzBdPWUsdGhpcy51aW50MTZbaCsxXT1yLHRoaXMudWludDE2W2grMl09bix0aGlzLnVpbnQxNltoKzNdPWksdGhpcy51aW50MTZbaCs0XT1zLHRoaXMudWludDE2W2grNV09YSx0aGlzLnVpbnQxNltoKzZdPW8sdGhpcy51aW50MTZbaCs3XT1sLHRoaXMudWludDE2W2grOF09dSx0aGlzLnVpbnQxNltoKzldPWMsdH19bXMucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD0yMCx3aShcIlN0cnVjdEFycmF5TGF5b3V0MTB1aTIwXCIsbXMpO2NsYXNzIGdzIGV4dGVuZHMgb3N7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy5pbnQxNj1uZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLnVpbnQxNj1uZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQsZSxyLG4saSxzLGEsbyxsLHUsYyxoKXtjb25zdCBwPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShwKzEpLHRoaXMuZW1wbGFjZShwLHQsZSxyLG4saSxzLGEsbyxsLHUsYyxoKX1lbXBsYWNlKHQsZSxyLG4saSxzLGEsbyxsLHUsYyxoLHApe2NvbnN0IGY9MTIqdDtyZXR1cm4gdGhpcy5pbnQxNltmKzBdPWUsdGhpcy5pbnQxNltmKzFdPXIsdGhpcy5pbnQxNltmKzJdPW4sdGhpcy5pbnQxNltmKzNdPWksdGhpcy51aW50MTZbZis0XT1zLHRoaXMudWludDE2W2YrNV09YSx0aGlzLnVpbnQxNltmKzZdPW8sdGhpcy51aW50MTZbZis3XT1sLHRoaXMuaW50MTZbZis4XT11LHRoaXMuaW50MTZbZis5XT1jLHRoaXMuaW50MTZbZisxMF09aCx0aGlzLmludDE2W2YrMTFdPXAsdH19Z3MucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD0yNCx3aShcIlN0cnVjdEFycmF5TGF5b3V0NGk0dWk0aTI0XCIsZ3MpO2NsYXNzIHhzIGV4dGVuZHMgb3N7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy5mbG9hdDMyPW5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQsZSxyKXtjb25zdCBuPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShuKzEpLHRoaXMuZW1wbGFjZShuLHQsZSxyKX1lbXBsYWNlKHQsZSxyLG4pe2NvbnN0IGk9Myp0O3JldHVybiB0aGlzLmZsb2F0MzJbaSswXT1lLHRoaXMuZmxvYXQzMltpKzFdPXIsdGhpcy5mbG9hdDMyW2krMl09bix0fX14cy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTEyLHdpKFwiU3RydWN0QXJyYXlMYXlvdXQzZjEyXCIseHMpO2NsYXNzIHZzIGV4dGVuZHMgb3N7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MzI9bmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO31lbXBsYWNlQmFjayh0KXtjb25zdCBlPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShlKzEpLHRoaXMuZW1wbGFjZShlLHQpfWVtcGxhY2UodCxlKXtyZXR1cm4gdGhpcy51aW50MzJbMSp0KzBdPWUsdH19dnMucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD00LHdpKFwiU3RydWN0QXJyYXlMYXlvdXQxdWw0XCIsdnMpO2NsYXNzIGJzIGV4dGVuZHMgb3N7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy5pbnQxNj1uZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLnVpbnQzMj1uZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MTY9bmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO31lbXBsYWNlQmFjayh0LGUscixuLGkscyxhLG8sbCl7Y29uc3QgdT10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUodSsxKSx0aGlzLmVtcGxhY2UodSx0LGUscixuLGkscyxhLG8sbCl9ZW1wbGFjZSh0LGUscixuLGkscyxhLG8sbCx1KXtjb25zdCBjPTEwKnQsaD01KnQ7cmV0dXJuIHRoaXMuaW50MTZbYyswXT1lLHRoaXMuaW50MTZbYysxXT1yLHRoaXMuaW50MTZbYysyXT1uLHRoaXMuaW50MTZbYyszXT1pLHRoaXMuaW50MTZbYys0XT1zLHRoaXMuaW50MTZbYys1XT1hLHRoaXMudWludDMyW2grM109byx0aGlzLnVpbnQxNltjKzhdPWwsdGhpcy51aW50MTZbYys5XT11LHR9fWJzLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9MjAsd2koXCJTdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMjBcIixicyk7Y2xhc3Mgd3MgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmludDE2PW5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO31lbXBsYWNlQmFjayh0LGUscixuLGkscyl7Y29uc3QgYT10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoYSsxKSx0aGlzLmVtcGxhY2UoYSx0LGUscixuLGkscyl9ZW1wbGFjZSh0LGUscixuLGkscyxhKXtjb25zdCBvPTYqdDtyZXR1cm4gdGhpcy5pbnQxNltvKzBdPWUsdGhpcy5pbnQxNltvKzFdPXIsdGhpcy5pbnQxNltvKzJdPW4sdGhpcy5pbnQxNltvKzNdPWksdGhpcy5pbnQxNltvKzRdPXMsdGhpcy5pbnQxNltvKzVdPWEsdH19d3MucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD0xMix3aShcIlN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTJcIix3cyk7Y2xhc3MgX3MgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmludDE2PW5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO31lbXBsYWNlQmFjayh0LGUscixuLGkpe2NvbnN0IHM9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKHMrMSksdGhpcy5lbXBsYWNlKHMsdCxlLHIsbixpKX1lbXBsYWNlKHQsZSxyLG4saSxzKXtjb25zdCBhPTQqdCxvPTgqdDtyZXR1cm4gdGhpcy5mbG9hdDMyW2ErMF09ZSx0aGlzLmZsb2F0MzJbYSsxXT1yLHRoaXMuZmxvYXQzMlthKzJdPW4sdGhpcy5pbnQxNltvKzZdPWksdGhpcy5pbnQxNltvKzddPXMsdH19X3MucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD0xNix3aShcIlN0cnVjdEFycmF5TGF5b3V0MmYxZjJpMTZcIixfcyk7Y2xhc3MgQXMgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmludDE2PW5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO31lbXBsYWNlQmFjayh0LGUscixuLGkscyl7Y29uc3QgYT10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoYSsxKSx0aGlzLmVtcGxhY2UoYSx0LGUscixuLGkscyl9ZW1wbGFjZSh0LGUscixuLGkscyxhKXtjb25zdCBvPTE2KnQsbD00KnQsdT04KnQ7cmV0dXJuIHRoaXMudWludDhbbyswXT1lLHRoaXMudWludDhbbysxXT1yLHRoaXMuZmxvYXQzMltsKzFdPW4sdGhpcy5mbG9hdDMyW2wrMl09aSx0aGlzLmludDE2W3UrNl09cyx0aGlzLmludDE2W3UrN109YSx0fX1Bcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTE2LHdpKFwiU3RydWN0QXJyYXlMYXlvdXQydWIyZjJpMTZcIixBcyk7Y2xhc3MgU3MgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLnVpbnQxNj1uZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQsZSxyKXtjb25zdCBuPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShuKzEpLHRoaXMuZW1wbGFjZShuLHQsZSxyKX1lbXBsYWNlKHQsZSxyLG4pe2NvbnN0IGk9Myp0O3JldHVybiB0aGlzLnVpbnQxNltpKzBdPWUsdGhpcy51aW50MTZbaSsxXT1yLHRoaXMudWludDE2W2krMl09bix0fX1Tcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTYsd2koXCJTdHJ1Y3RBcnJheUxheW91dDN1aTZcIixTcyk7Y2xhc3Mga3MgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmludDE2PW5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLnVpbnQzMj1uZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy5mbG9hdDMyPW5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQsZSxyLG4saSxzLGEsbyxsLHUsYyxoLHAsZixkLHksbSl7Y29uc3QgZz10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoZysxKSx0aGlzLmVtcGxhY2UoZyx0LGUscixuLGkscyxhLG8sbCx1LGMsaCxwLGYsZCx5LG0pfWVtcGxhY2UodCxlLHIsbixpLHMsYSxvLGwsdSxjLGgscCxmLGQseSxtLGcpe2NvbnN0IHg9MjQqdCx2PTEyKnQsYj00OCp0O3JldHVybiB0aGlzLmludDE2W3grMF09ZSx0aGlzLmludDE2W3grMV09cix0aGlzLnVpbnQxNlt4KzJdPW4sdGhpcy51aW50MTZbeCszXT1pLHRoaXMudWludDMyW3YrMl09cyx0aGlzLnVpbnQzMlt2KzNdPWEsdGhpcy51aW50MzJbdis0XT1vLHRoaXMudWludDE2W3grMTBdPWwsdGhpcy51aW50MTZbeCsxMV09dSx0aGlzLnVpbnQxNlt4KzEyXT1jLHRoaXMuZmxvYXQzMlt2KzddPWgsdGhpcy5mbG9hdDMyW3YrOF09cCx0aGlzLnVpbnQ4W2IrMzZdPWYsdGhpcy51aW50OFtiKzM3XT1kLHRoaXMudWludDhbYiszOF09eSx0aGlzLnVpbnQzMlt2KzEwXT1tLHRoaXMuaW50MTZbeCsyMl09Zyx0fX1rcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTQ4LHdpKFwiU3RydWN0QXJyYXlMYXlvdXQyaTJ1aTN1bDN1aTJmM3ViMXVsMWk0OFwiLGtzKTtjbGFzcyBNcyBleHRlbmRzIG9ze19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MTY9bmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDMyPW5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTt9ZW1wbGFjZUJhY2sodCxlLHIsbixpLHMsYSxvLGwsdSxjLGgscCxmLGQseSxtLGcseCx2LGIsdyxfLEEsUyxrLE0sSSl7Y29uc3Qgej10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoeisxKSx0aGlzLmVtcGxhY2Uoeix0LGUscixuLGkscyxhLG8sbCx1LGMsaCxwLGYsZCx5LG0sZyx4LHYsYix3LF8sQSxTLGssTSxJKX1lbXBsYWNlKHQsZSxyLG4saSxzLGEsbyxsLHUsYyxoLHAsZixkLHksbSxnLHgsdixiLHcsXyxBLFMsayxNLEkseil7Y29uc3QgUD0zMip0LEM9MTYqdDtyZXR1cm4gdGhpcy5pbnQxNltQKzBdPWUsdGhpcy5pbnQxNltQKzFdPXIsdGhpcy5pbnQxNltQKzJdPW4sdGhpcy5pbnQxNltQKzNdPWksdGhpcy5pbnQxNltQKzRdPXMsdGhpcy5pbnQxNltQKzVdPWEsdGhpcy5pbnQxNltQKzZdPW8sdGhpcy5pbnQxNltQKzddPWwsdGhpcy51aW50MTZbUCs4XT11LHRoaXMudWludDE2W1ArOV09Yyx0aGlzLnVpbnQxNltQKzEwXT1oLHRoaXMudWludDE2W1ArMTFdPXAsdGhpcy51aW50MTZbUCsxMl09Zix0aGlzLnVpbnQxNltQKzEzXT1kLHRoaXMudWludDE2W1ArMTRdPXksdGhpcy51aW50MTZbUCsxNV09bSx0aGlzLnVpbnQxNltQKzE2XT1nLHRoaXMudWludDE2W1ArMTddPXgsdGhpcy51aW50MTZbUCsxOF09dix0aGlzLnVpbnQxNltQKzE5XT1iLHRoaXMudWludDE2W1ArMjBdPXcsdGhpcy51aW50MTZbUCsyMV09Xyx0aGlzLnVpbnQxNltQKzIyXT1BLHRoaXMudWludDMyW0MrMTJdPVMsdGhpcy5mbG9hdDMyW0MrMTNdPWssdGhpcy5mbG9hdDMyW0MrMTRdPU0sdGhpcy51aW50MTZbUCszMF09SSx0aGlzLnVpbnQxNltQKzMxXT16LHR9fU1zLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9NjQsd2koXCJTdHJ1Y3RBcnJheUxheW91dDhpMTV1aTF1bDJmMnVpNjRcIixNcyk7Y2xhc3MgSXMgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTt9ZW1wbGFjZUJhY2sodCl7Y29uc3QgZT10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoZSsxKSx0aGlzLmVtcGxhY2UoZSx0KX1lbXBsYWNlKHQsZSl7cmV0dXJuIHRoaXMuZmxvYXQzMlsxKnQrMF09ZSx0fX1Jcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTQsd2koXCJTdHJ1Y3RBcnJheUxheW91dDFmNFwiLElzKTtjbGFzcyB6cyBleHRlbmRzIG9ze19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTt9ZW1wbGFjZUJhY2sodCxlLHIpe2NvbnN0IG49dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKG4rMSksdGhpcy5lbXBsYWNlKG4sdCxlLHIpfWVtcGxhY2UodCxlLHIsbil7Y29uc3QgaT0zKnQ7cmV0dXJuIHRoaXMudWludDE2WzYqdCswXT1lLHRoaXMuZmxvYXQzMltpKzFdPXIsdGhpcy5mbG9hdDMyW2krMl09bix0fX16cy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTEyLHdpKFwiU3RydWN0QXJyYXlMYXlvdXQxdWkyZjEyXCIsenMpO2NsYXNzIFBzIGV4dGVuZHMgb3N7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MzI9bmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTt9ZW1wbGFjZUJhY2sodCxlLHIpe2NvbnN0IG49dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKG4rMSksdGhpcy5lbXBsYWNlKG4sdCxlLHIpfWVtcGxhY2UodCxlLHIsbil7Y29uc3QgaT00KnQ7cmV0dXJuIHRoaXMudWludDMyWzIqdCswXT1lLHRoaXMudWludDE2W2krMl09cix0aGlzLnVpbnQxNltpKzNdPW4sdH19UHMucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD04LHdpKFwiU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4XCIsUHMpO2NsYXNzIENzIGV4dGVuZHMgb3N7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MTY9bmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO31lbXBsYWNlQmFjayh0LGUpe2NvbnN0IHI9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKHIrMSksdGhpcy5lbXBsYWNlKHIsdCxlKX1lbXBsYWNlKHQsZSxyKXtjb25zdCBuPTIqdDtyZXR1cm4gdGhpcy51aW50MTZbbiswXT1lLHRoaXMudWludDE2W24rMV09cix0fX1Dcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTQsd2koXCJTdHJ1Y3RBcnJheUxheW91dDJ1aTRcIixDcyk7Y2xhc3MgQnMgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLnVpbnQxNj1uZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7fWVtcGxhY2VCYWNrKHQpe2NvbnN0IGU9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKGUrMSksdGhpcy5lbXBsYWNlKGUsdCl9ZW1wbGFjZSh0LGUpe3JldHVybiB0aGlzLnVpbnQxNlsxKnQrMF09ZSx0fX1Ccy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTIsd2koXCJTdHJ1Y3RBcnJheUxheW91dDF1aTJcIixCcyk7Y2xhc3MgVnMgZXh0ZW5kcyBvc3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTt9ZW1wbGFjZUJhY2sodCxlLHIsbil7Y29uc3QgaT10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoaSsxKSx0aGlzLmVtcGxhY2UoaSx0LGUscixuKX1lbXBsYWNlKHQsZSxyLG4saSl7Y29uc3Qgcz00KnQ7cmV0dXJuIHRoaXMuZmxvYXQzMltzKzBdPWUsdGhpcy5mbG9hdDMyW3MrMV09cix0aGlzLmZsb2F0MzJbcysyXT1uLHRoaXMuZmxvYXQzMltzKzNdPWksdH19VnMucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD0xNix3aShcIlN0cnVjdEFycmF5TGF5b3V0NGYxNlwiLFZzKTtjbGFzcyBFcyBleHRlbmRzIGFze2dldCBhbmNob3JQb2ludFgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiswXX1nZXQgYW5jaG9yUG9pbnRZKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrMV19Z2V0IHgxKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrMl19Z2V0IHkxKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrM119Z2V0IHgyKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrNF19Z2V0IHkyKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrNV19Z2V0IGZlYXR1cmVJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCszXX1nZXQgc291cmNlTGF5ZXJJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMis4XX1nZXQgYnVja2V0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrOV19Z2V0IGFuY2hvclBvaW50KCl7cmV0dXJuIG5ldyBzKHRoaXMuYW5jaG9yUG9pbnRYLHRoaXMuYW5jaG9yUG9pbnRZKX19RXMucHJvdG90eXBlLnNpemU9MjA7Y2xhc3MgRnMgZXh0ZW5kcyBic3tnZXQodCl7cmV0dXJuIG5ldyBFcyh0aGlzLHQpfX13aShcIkNvbGxpc2lvbkJveEFycmF5XCIsRnMpO2NsYXNzIFRzIGV4dGVuZHMgYXN7Z2V0IGFuY2hvclgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiswXX1nZXQgYW5jaG9yWSgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyKzFdfWdldCBnbHlwaFN0YXJ0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMl19Z2V0IG51bUdseXBocygpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiszXX1nZXQgdmVydGV4U3RhcnRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCsyXX1nZXQgbGluZVN0YXJ0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQrM119Z2V0IGxpbmVMZW5ndGgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQrNF19Z2V0IHNlZ21lbnQoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTBdfWdldCBsb3dlclNpemUoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTFdfWdldCB1cHBlclNpemUoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTJdfWdldCBsaW5lT2Zmc2V0WCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQrN119Z2V0IGxpbmVPZmZzZXRZKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCs4XX1nZXQgd3JpdGluZ01vZGUoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSszNl19Z2V0IHBsYWNlZE9yaWVudGF0aW9uKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczErMzddfXNldCBwbGFjZWRPcmllbnRhdGlvbih0KXt0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxKzM3XT10O31nZXQgaGlkZGVuKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczErMzhdfXNldCBoaWRkZW4odCl7dGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSszOF09dDt9Z2V0IGNyb3NzVGlsZUlEKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0KzEwXX1zZXQgY3Jvc3NUaWxlSUQodCl7dGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQrMTBdPXQ7fWdldCBhc3NvY2lhdGVkSWNvbkluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrMjJdfX1Ucy5wcm90b3R5cGUuc2l6ZT00ODtjbGFzcyAkcyBleHRlbmRzIGtze2dldCh0KXtyZXR1cm4gbmV3IFRzKHRoaXMsdCl9fXdpKFwiUGxhY2VkU3ltYm9sQXJyYXlcIiwkcyk7Y2xhc3MgTHMgZXh0ZW5kcyBhc3tnZXQgYW5jaG9yWCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyKzBdfWdldCBhbmNob3JZKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrMV19Z2V0IHJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrMl19Z2V0IGNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyKzNdfWdldCBsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrNF19Z2V0IHZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrNV19Z2V0IHBsYWNlZEljb25TeW1ib2xJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyKzZdfWdldCB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyKzddfWdldCBrZXkoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrOF19Z2V0IHRleHRCb3hTdGFydEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzldfWdldCB0ZXh0Qm94RW5kSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTBdfWdldCB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzExXX1nZXQgdmVydGljYWxUZXh0Qm94RW5kSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTJdfWdldCBpY29uQm94U3RhcnRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisxM119Z2V0IGljb25Cb3hFbmRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisxNF19Z2V0IHZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTVdfWdldCB2ZXJ0aWNhbEljb25Cb3hFbmRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisxNl19Z2V0IGZlYXR1cmVJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisxN119Z2V0IG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzE4XX1nZXQgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzE5XX1nZXQgbnVtSWNvblZlcnRpY2VzKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzIwXX1nZXQgbnVtVmVydGljYWxJY29uVmVydGljZXMoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMjFdfWdldCB1c2VSdW50aW1lQ29sbGlzaW9uQ2lyY2xlcygpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisyMl19Z2V0IGNyb3NzVGlsZUlEKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0KzEyXX1zZXQgY3Jvc3NUaWxlSUQodCl7dGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQrMTJdPXQ7fWdldCB0ZXh0Qm94U2NhbGUoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0KzEzXX1nZXQgY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXIoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0KzE0XX1nZXQgdGV4dEFuY2hvck9mZnNldFN0YXJ0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMzBdfWdldCB0ZXh0QW5jaG9yT2Zmc2V0RW5kSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMzFdfX1Mcy5wcm90b3R5cGUuc2l6ZT02NDtjbGFzcyBEcyBleHRlbmRzIE1ze2dldCh0KXtyZXR1cm4gbmV3IExzKHRoaXMsdCl9fXdpKFwiU3ltYm9sSW5zdGFuY2VBcnJheVwiLERzKTtjbGFzcyBPcyBleHRlbmRzIElze2dldG9mZnNldFgodCl7cmV0dXJuIHRoaXMuZmxvYXQzMlsxKnQrMF19fXdpKFwiR2x5cGhPZmZzZXRBcnJheVwiLE9zKTtjbGFzcyBqcyBleHRlbmRzIGhze2dldHgodCl7cmV0dXJuIHRoaXMuaW50MTZbMyp0KzBdfWdldHkodCl7cmV0dXJuIHRoaXMuaW50MTZbMyp0KzFdfWdldHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yKHQpe3JldHVybiB0aGlzLmludDE2WzMqdCsyXX19d2koXCJTeW1ib2xMaW5lVmVydGV4QXJyYXlcIixqcyk7Y2xhc3MgUnMgZXh0ZW5kcyBhc3tnZXQgdGV4dEFuY2hvcigpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiswXX1nZXQgdGV4dE9mZnNldDAoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0KzFdfWdldCB0ZXh0T2Zmc2V0MSgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQrMl19fVJzLnByb3RvdHlwZS5zaXplPTEyO2NsYXNzIFVzIGV4dGVuZHMgenN7Z2V0KHQpe3JldHVybiBuZXcgUnModGhpcyx0KX19d2koXCJUZXh0QW5jaG9yT2Zmc2V0QXJyYXlcIixVcyk7Y2xhc3MgcXMgZXh0ZW5kcyBhc3tnZXQgZmVhdHVyZUluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0KzBdfWdldCBzb3VyY2VMYXllckluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzJdfWdldCBidWNrZXRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiszXX19cXMucHJvdG90eXBlLnNpemU9ODtjbGFzcyBOcyBleHRlbmRzIFBze2dldCh0KXtyZXR1cm4gbmV3IHFzKHRoaXMsdCl9fXdpKFwiRmVhdHVyZUluZGV4QXJyYXlcIixOcyk7Y2xhc3MgWnMgZXh0ZW5kcyBjc3t9Y2xhc3MgR3MgZXh0ZW5kcyBjc3t9Y2xhc3MgS3MgZXh0ZW5kcyBjc3t9Y2xhc3MgWHMgZXh0ZW5kcyBmc3t9Y2xhc3MgSHMgZXh0ZW5kcyBkc3t9Y2xhc3MgWXMgZXh0ZW5kcyB5c3t9Y2xhc3MgSnMgZXh0ZW5kcyBtc3t9Y2xhc3MgV3MgZXh0ZW5kcyBnc3t9Y2xhc3MgUXMgZXh0ZW5kcyB4c3t9Y2xhc3MgdGEgZXh0ZW5kcyB2c3t9Y2xhc3MgZWEgZXh0ZW5kcyB3c3t9Y2xhc3MgcmEgZXh0ZW5kcyBBc3t9Y2xhc3MgbmEgZXh0ZW5kcyBTc3t9Y2xhc3MgaWEgZXh0ZW5kcyBDc3t9Y29uc3Qgc2E9bHMoW3tuYW1lOlwiYV9wb3NcIixjb21wb25lbnRzOjIsdHlwZTpcIkludDE2XCJ9XSw0KSx7bWVtYmVyczphYX09c2E7Y2xhc3Mgb2F7Y29uc3RydWN0b3IodD1bXSl7dGhpcy5zZWdtZW50cz10O31wcmVwYXJlU2VnbWVudCh0LGUscixuKXtsZXQgaT10aGlzLnNlZ21lbnRzW3RoaXMuc2VnbWVudHMubGVuZ3RoLTFdO3JldHVybiB0Pm9hLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIJiZBKGBNYXggdmVydGljZXMgcGVyIHNlZ21lbnQgaXMgJHtvYS5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSH06IGJ1Y2tldCByZXF1ZXN0ZWQgJHt0fWApLCghaXx8aS52ZXJ0ZXhMZW5ndGgrdD5vYS5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSHx8aS5zb3J0S2V5IT09bikmJihpPXt2ZXJ0ZXhPZmZzZXQ6ZS5sZW5ndGgscHJpbWl0aXZlT2Zmc2V0OnIubGVuZ3RoLHZlcnRleExlbmd0aDowLHByaW1pdGl2ZUxlbmd0aDowfSx2b2lkIDAhPT1uJiYoaS5zb3J0S2V5PW4pLHRoaXMuc2VnbWVudHMucHVzaChpKSksaX1nZXQoKXtyZXR1cm4gdGhpcy5zZWdtZW50c31kZXN0cm95KCl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5zZWdtZW50cylmb3IoY29uc3QgZSBpbiB0LnZhb3MpdC52YW9zW2VdLmRlc3Ryb3koKTt9c3RhdGljIHNpbXBsZVNlZ21lbnQodCxlLHIsbil7cmV0dXJuIG5ldyBvYShbe3ZlcnRleE9mZnNldDp0LHByaW1pdGl2ZU9mZnNldDplLHZlcnRleExlbmd0aDpyLHByaW1pdGl2ZUxlbmd0aDpuLHZhb3M6e30sc29ydEtleTowfV0pfX1mdW5jdGlvbiBsYSh0LGUpe3JldHVybiAyNTYqKHQ9eShNYXRoLmZsb29yKHQpLDAsMjU1KSkreShNYXRoLmZsb29yKGUpLDAsMjU1KX1vYS5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSD1NYXRoLnBvdygyLDE2KS0xLHdpKFwiU2VnbWVudFZlY3RvclwiLG9hKTtjb25zdCB1YT1scyhbe25hbWU6XCJhX3BhdHRlcm5fZnJvbVwiLGNvbXBvbmVudHM6NCx0eXBlOlwiVWludDE2XCJ9LHtuYW1lOlwiYV9wYXR0ZXJuX3RvXCIsY29tcG9uZW50czo0LHR5cGU6XCJVaW50MTZcIn0se25hbWU6XCJhX3BpeGVsX3JhdGlvX2Zyb21cIixjb21wb25lbnRzOjEsdHlwZTpcIlVpbnQxNlwifSx7bmFtZTpcImFfcGl4ZWxfcmF0aW9fdG9cIixjb21wb25lbnRzOjEsdHlwZTpcIlVpbnQxNlwifV0pO3ZhciBjYT17ZXhwb3J0czp7fX0saGE9e2V4cG9ydHM6e319O2hhLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGkscyxhLG8sbCx1O2ZvcihuPXQubGVuZ3RoLShyPTMmdC5sZW5ndGgpLGk9ZSxhPTM0MzI5MTgzNTMsbz00NjE4NDU5MDcsdT0wO3U8bjspbD0yNTUmdC5jaGFyQ29kZUF0KHUpfCgyNTUmdC5jaGFyQ29kZUF0KCsrdSkpPDw4fCgyNTUmdC5jaGFyQ29kZUF0KCsrdSkpPDwxNnwoMjU1JnQuY2hhckNvZGVBdCgrK3UpKTw8MjQsKyt1LGk9Mjc0OTIrKDY1NTM1JihzPTUqKDY1NTM1JihpPShpXj1sPSg2NTUzNSYobD0obD0oNjU1MzUmbCkqYSsoKChsPj4+MTYpKmEmNjU1MzUpPDwxNikmNDI5NDk2NzI5NSk8PDE1fGw+Pj4xNykpKm8rKCgobD4+PjE2KSpvJjY1NTM1KTw8MTYpJjQyOTQ5NjcyOTUpPDwxM3xpPj4+MTkpKSsoKDUqKGk+Pj4xNikmNjU1MzUpPDwxNikmNDI5NDk2NzI5NSkpKygoNTg5NjQrKHM+Pj4xNikmNjU1MzUpPDwxNik7c3dpdGNoKGw9MCxyKXtjYXNlIDM6bF49KDI1NSZ0LmNoYXJDb2RlQXQodSsyKSk8PDE2O2Nhc2UgMjpsXj0oMjU1JnQuY2hhckNvZGVBdCh1KzEpKTw8ODtjYXNlIDE6aV49bD0oNjU1MzUmKGw9KGw9KDY1NTM1JihsXj0yNTUmdC5jaGFyQ29kZUF0KHUpKSkqYSsoKChsPj4+MTYpKmEmNjU1MzUpPDwxNikmNDI5NDk2NzI5NSk8PDE1fGw+Pj4xNykpKm8rKCgobD4+PjE2KSpvJjY1NTM1KTw8MTYpJjQyOTQ5NjcyOTU7fXJldHVybiBpXj10Lmxlbmd0aCxpPTIyNDY4MjI1MDcqKDY1NTM1JihpXj1pPj4+MTYpKSsoKDIyNDY4MjI1MDcqKGk+Pj4xNikmNjU1MzUpPDwxNikmNDI5NDk2NzI5NSxpPTMyNjY0ODk5MDkqKDY1NTM1JihpXj1pPj4+MTMpKSsoKDMyNjY0ODk5MDkqKGk+Pj4xNikmNjU1MzUpPDwxNikmNDI5NDk2NzI5NSwoaV49aT4+PjE2KT4+PjB9O3ZhciBwYT1oYS5leHBvcnRzLGZhPXtleHBvcnRzOnt9fTtmYS5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG49dC5sZW5ndGgsaT1lXm4scz0wO24+PTQ7KXI9MTU0MDQ4MzQ3NyooNjU1MzUmKHI9MjU1JnQuY2hhckNvZGVBdChzKXwoMjU1JnQuY2hhckNvZGVBdCgrK3MpKTw8OHwoMjU1JnQuY2hhckNvZGVBdCgrK3MpKTw8MTZ8KDI1NSZ0LmNoYXJDb2RlQXQoKytzKSk8PDI0KSkrKCgxNTQwNDgzNDc3KihyPj4+MTYpJjY1NTM1KTw8MTYpLGk9MTU0MDQ4MzQ3NyooNjU1MzUmaSkrKCgxNTQwNDgzNDc3KihpPj4+MTYpJjY1NTM1KTw8MTYpXihyPTE1NDA0ODM0NzcqKDY1NTM1JihyXj1yPj4+MjQpKSsoKDE1NDA0ODM0NzcqKHI+Pj4xNikmNjU1MzUpPDwxNikpLG4tPTQsKytzO3N3aXRjaChuKXtjYXNlIDM6aV49KDI1NSZ0LmNoYXJDb2RlQXQocysyKSk8PDE2O2Nhc2UgMjppXj0oMjU1JnQuY2hhckNvZGVBdChzKzEpKTw8ODtjYXNlIDE6aT0xNTQwNDgzNDc3Kig2NTUzNSYoaV49MjU1JnQuY2hhckNvZGVBdChzKSkpKygoMTU0MDQ4MzQ3NyooaT4+PjE2KSY2NTUzNSk8PDE2KTt9cmV0dXJuIGk9MTU0MDQ4MzQ3NyooNjU1MzUmKGlePWk+Pj4xMykpKygoMTU0MDQ4MzQ3NyooaT4+PjE2KSY2NTUzNSk8PDE2KSwoaV49aT4+PjE1KT4+PjB9O3ZhciBkYT1wYSx5YT1mYS5leHBvcnRzO2NhLmV4cG9ydHM9ZGEsY2EuZXhwb3J0cy5tdXJtdXIzPWRhLGNhLmV4cG9ydHMubXVybXVyMj15YTt2YXIgbWE9cihjYS5leHBvcnRzKTtjbGFzcyBnYXtjb25zdHJ1Y3Rvcigpe3RoaXMuaWRzPVtdLHRoaXMucG9zaXRpb25zPVtdLHRoaXMuaW5kZXhlZD0hMTt9YWRkKHQsZSxyLG4pe3RoaXMuaWRzLnB1c2goeGEodCkpLHRoaXMucG9zaXRpb25zLnB1c2goZSxyLG4pO31nZXRQb3NpdGlvbnModCl7aWYoIXRoaXMuaW5kZXhlZCl0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gZ2V0IGluZGV4LCBidXQgZmVhdHVyZSBwb3NpdGlvbnMgYXJlIG5vdCBpbmRleGVkXCIpO2NvbnN0IGU9eGEodCk7bGV0IHI9MCxuPXRoaXMuaWRzLmxlbmd0aC0xO2Zvcig7cjxuOyl7Y29uc3QgdD1yK24+PjE7dGhpcy5pZHNbdF0+PWU/bj10OnI9dCsxO31jb25zdCBpPVtdO2Zvcig7dGhpcy5pZHNbcl09PT1lOylpLnB1c2goe2luZGV4OnRoaXMucG9zaXRpb25zWzMqcl0sc3RhcnQ6dGhpcy5wb3NpdGlvbnNbMypyKzFdLGVuZDp0aGlzLnBvc2l0aW9uc1szKnIrMl19KSxyKys7cmV0dXJuIGl9c3RhdGljIHNlcmlhbGl6ZSh0LGUpe2NvbnN0IHI9bmV3IEZsb2F0NjRBcnJheSh0Lmlkcyksbj1uZXcgVWludDMyQXJyYXkodC5wb3NpdGlvbnMpO3JldHVybiB2YShyLG4sMCxyLmxlbmd0aC0xKSxlJiZlLnB1c2goci5idWZmZXIsbi5idWZmZXIpLHtpZHM6cixwb3NpdGlvbnM6bn19c3RhdGljIGRlc2VyaWFsaXplKHQpe2NvbnN0IGU9bmV3IGdhO3JldHVybiBlLmlkcz10LmlkcyxlLnBvc2l0aW9ucz10LnBvc2l0aW9ucyxlLmluZGV4ZWQ9ITAsZX19ZnVuY3Rpb24geGEodCl7Y29uc3QgZT0rdDtyZXR1cm4gIWlzTmFOKGUpJiZlPD1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUj9lOm1hKFN0cmluZyh0KSl9ZnVuY3Rpb24gdmEodCxlLHIsbil7Zm9yKDtyPG47KXtjb25zdCBpPXRbcituPj4xXTtsZXQgcz1yLTEsYT1uKzE7Zm9yKDs7KXtkb3tzKys7fXdoaWxlKHRbc108aSk7ZG97YS0tO313aGlsZSh0W2FdPmkpO2lmKHM+PWEpYnJlYWs7YmEodCxzLGEpLGJhKGUsMypzLDMqYSksYmEoZSwzKnMrMSwzKmErMSksYmEoZSwzKnMrMiwzKmErMik7fWEtcjxuLWE/KHZhKHQsZSxyLGEpLHI9YSsxKToodmEodCxlLGErMSxuKSxuPWEpO319ZnVuY3Rpb24gYmEodCxlLHIpe2NvbnN0IG49dFtlXTt0W2VdPXRbcl0sdFtyXT1uO313aShcIkZlYXR1cmVQb3NpdGlvbk1hcFwiLGdhKTtjbGFzcyB3YXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuZ2w9dC5nbCx0aGlzLmxvY2F0aW9uPWU7fX1jbGFzcyBfYSBleHRlbmRzIHdhe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmN1cnJlbnQ9MDt9c2V0KHQpe3RoaXMuY3VycmVudCE9PXQmJih0aGlzLmN1cnJlbnQ9dCx0aGlzLmdsLnVuaWZvcm0xZih0aGlzLmxvY2F0aW9uLHQpKTt9fWNsYXNzIEFhIGV4dGVuZHMgd2F7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuY3VycmVudD1bMCwwLDAsMF07fXNldCh0KXt0WzBdPT09dGhpcy5jdXJyZW50WzBdJiZ0WzFdPT09dGhpcy5jdXJyZW50WzFdJiZ0WzJdPT09dGhpcy5jdXJyZW50WzJdJiZ0WzNdPT09dGhpcy5jdXJyZW50WzNdfHwodGhpcy5jdXJyZW50PXQsdGhpcy5nbC51bmlmb3JtNGYodGhpcy5sb2NhdGlvbix0WzBdLHRbMV0sdFsyXSx0WzNdKSk7fX1jbGFzcyBTYSBleHRlbmRzIHdhe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmN1cnJlbnQ9S3QudHJhbnNwYXJlbnQ7fXNldCh0KXt0LnI9PT10aGlzLmN1cnJlbnQuciYmdC5nPT09dGhpcy5jdXJyZW50LmcmJnQuYj09PXRoaXMuY3VycmVudC5iJiZ0LmE9PT10aGlzLmN1cnJlbnQuYXx8KHRoaXMuY3VycmVudD10LHRoaXMuZ2wudW5pZm9ybTRmKHRoaXMubG9jYXRpb24sdC5yLHQuZyx0LmIsdC5hKSk7fX1jb25zdCBrYT1uZXcgRmxvYXQzMkFycmF5KDE2KTtmdW5jdGlvbiBNYSh0KXtyZXR1cm4gW2xhKDI1NSp0LnIsMjU1KnQuZyksbGEoMjU1KnQuYiwyNTUqdC5hKV19Y2xhc3MgSWF7Y29uc3RydWN0b3IodCxlLHIpe3RoaXMudmFsdWU9dCx0aGlzLnVuaWZvcm1OYW1lcz1lLm1hcCgodD0+YHVfJHt0fWApKSx0aGlzLnR5cGU9cjt9c2V0VW5pZm9ybSh0LGUscil7dC5zZXQoci5jb25zdGFudE9yKHRoaXMudmFsdWUpKTt9Z2V0QmluZGluZyh0LGUscil7cmV0dXJuIFwiY29sb3JcIj09PXRoaXMudHlwZT9uZXcgU2EodCxlKTpuZXcgX2EodCxlKX19Y2xhc3MgemF7Y29uc3RydWN0b3IodCxlKXt0aGlzLnVuaWZvcm1OYW1lcz1lLm1hcCgodD0+YHVfJHt0fWApKSx0aGlzLnBhdHRlcm5Gcm9tPW51bGwsdGhpcy5wYXR0ZXJuVG89bnVsbCx0aGlzLnBpeGVsUmF0aW9Gcm9tPTEsdGhpcy5waXhlbFJhdGlvVG89MTt9c2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHQsZSl7dGhpcy5waXhlbFJhdGlvRnJvbT1lLnBpeGVsUmF0aW8sdGhpcy5waXhlbFJhdGlvVG89dC5waXhlbFJhdGlvLHRoaXMucGF0dGVybkZyb209ZS50bGJyLHRoaXMucGF0dGVyblRvPXQudGxicjt9c2V0VW5pZm9ybSh0LGUscixuKXtjb25zdCBpPVwidV9wYXR0ZXJuX3RvXCI9PT1uP3RoaXMucGF0dGVyblRvOlwidV9wYXR0ZXJuX2Zyb21cIj09PW4/dGhpcy5wYXR0ZXJuRnJvbTpcInVfcGl4ZWxfcmF0aW9fdG9cIj09PW4/dGhpcy5waXhlbFJhdGlvVG86XCJ1X3BpeGVsX3JhdGlvX2Zyb21cIj09PW4/dGhpcy5waXhlbFJhdGlvRnJvbTpudWxsO2kmJnQuc2V0KGkpO31nZXRCaW5kaW5nKHQsZSxyKXtyZXR1cm4gXCJ1X3BhdHRlcm5cIj09PXIuc3Vic3RyKDAsOSk/bmV3IEFhKHQsZSk6bmV3IF9hKHQsZSl9fWNsYXNzIFBhe2NvbnN0cnVjdG9yKHQsZSxyLG4pe3RoaXMuZXhwcmVzc2lvbj10LHRoaXMudHlwZT1yLHRoaXMubWF4VmFsdWU9MCx0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcz1lLm1hcCgodD0+KHtuYW1lOmBhXyR7dH1gLHR5cGU6XCJGbG9hdDMyXCIsY29tcG9uZW50czpcImNvbG9yXCI9PT1yPzI6MSxvZmZzZXQ6MH0pKSksdGhpcy5wYWludFZlcnRleEFycmF5PW5ldyBuO31wb3B1bGF0ZVBhaW50QXJyYXkodCxlLHIsbixpKXtjb25zdCBzPXRoaXMucGFpbnRWZXJ0ZXhBcnJheS5sZW5ndGgsYT10aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IFVpKDApLGUse30sbixbXSxpKTt0aGlzLnBhaW50VmVydGV4QXJyYXkucmVzaXplKHQpLHRoaXMuX3NldFBhaW50VmFsdWUocyx0LGEpO311cGRhdGVQYWludEFycmF5KHQsZSxyLG4pe2NvbnN0IGk9dGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOjB9LHIsbik7dGhpcy5fc2V0UGFpbnRWYWx1ZSh0LGUsaSk7fV9zZXRQYWludFZhbHVlKHQsZSxyKXtpZihcImNvbG9yXCI9PT10aGlzLnR5cGUpe2NvbnN0IG49TWEocik7Zm9yKGxldCByPXQ7cjxlO3IrKyl0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShyLG5bMF0sblsxXSk7fWVsc2Uge2ZvcihsZXQgbj10O248ZTtuKyspdGhpcy5wYWludFZlcnRleEFycmF5LmVtcGxhY2UobixyKTt0aGlzLm1heFZhbHVlPU1hdGgubWF4KHRoaXMubWF4VmFsdWUsTWF0aC5hYnMocikpO319dXBsb2FkKHQpe3RoaXMucGFpbnRWZXJ0ZXhBcnJheSYmdGhpcy5wYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyJiYodGhpcy5wYWludFZlcnRleEJ1ZmZlciYmdGhpcy5wYWludFZlcnRleEJ1ZmZlci5idWZmZXI/dGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSk6dGhpcy5wYWludFZlcnRleEJ1ZmZlcj10LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMsdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpKTt9ZGVzdHJveSgpe3RoaXMucGFpbnRWZXJ0ZXhCdWZmZXImJnRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO319Y2xhc3MgQ2F7Y29uc3RydWN0b3IodCxlLHIsbixpLHMpe3RoaXMuZXhwcmVzc2lvbj10LHRoaXMudW5pZm9ybU5hbWVzPWUubWFwKCh0PT5gdV8ke3R9X3RgKSksdGhpcy50eXBlPXIsdGhpcy51c2VJbnRlZ2VyWm9vbT1uLHRoaXMuem9vbT1pLHRoaXMubWF4VmFsdWU9MCx0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcz1lLm1hcCgodD0+KHtuYW1lOmBhXyR7dH1gLHR5cGU6XCJGbG9hdDMyXCIsY29tcG9uZW50czpcImNvbG9yXCI9PT1yPzQ6MixvZmZzZXQ6MH0pKSksdGhpcy5wYWludFZlcnRleEFycmF5PW5ldyBzO31wb3B1bGF0ZVBhaW50QXJyYXkodCxlLHIsbixpKXtjb25zdCBzPXRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgVWkodGhpcy56b29tKSxlLHt9LG4sW10saSksYT10aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IFVpKHRoaXMuem9vbSsxKSxlLHt9LG4sW10saSksbz10aGlzLnBhaW50VmVydGV4QXJyYXkubGVuZ3RoO3RoaXMucGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUodCksdGhpcy5fc2V0UGFpbnRWYWx1ZShvLHQscyxhKTt9dXBkYXRlUGFpbnRBcnJheSh0LGUscixuKXtjb25zdCBpPXRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTp0aGlzLnpvb219LHIsbikscz10aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206dGhpcy56b29tKzF9LHIsbik7dGhpcy5fc2V0UGFpbnRWYWx1ZSh0LGUsaSxzKTt9X3NldFBhaW50VmFsdWUodCxlLHIsbil7aWYoXCJjb2xvclwiPT09dGhpcy50eXBlKXtjb25zdCBpPU1hKHIpLHM9TWEobik7Zm9yKGxldCByPXQ7cjxlO3IrKyl0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShyLGlbMF0saVsxXSxzWzBdLHNbMV0pO31lbHNlIHtmb3IobGV0IGk9dDtpPGU7aSsrKXRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKGkscixuKTt0aGlzLm1heFZhbHVlPU1hdGgubWF4KHRoaXMubWF4VmFsdWUsTWF0aC5hYnMociksTWF0aC5hYnMobikpO319dXBsb2FkKHQpe3RoaXMucGFpbnRWZXJ0ZXhBcnJheSYmdGhpcy5wYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyJiYodGhpcy5wYWludFZlcnRleEJ1ZmZlciYmdGhpcy5wYWludFZlcnRleEJ1ZmZlci5idWZmZXI/dGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSk6dGhpcy5wYWludFZlcnRleEJ1ZmZlcj10LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMsdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpKTt9ZGVzdHJveSgpe3RoaXMucGFpbnRWZXJ0ZXhCdWZmZXImJnRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO31zZXRVbmlmb3JtKHQsZSl7Y29uc3Qgcj10aGlzLnVzZUludGVnZXJab29tP01hdGguZmxvb3IoZS56b29tKTplLnpvb20sbj15KHRoaXMuZXhwcmVzc2lvbi5pbnRlcnBvbGF0aW9uRmFjdG9yKHIsdGhpcy56b29tLHRoaXMuem9vbSsxKSwwLDEpO3Quc2V0KG4pO31nZXRCaW5kaW5nKHQsZSxyKXtyZXR1cm4gbmV3IF9hKHQsZSl9fWNsYXNzIEJhe2NvbnN0cnVjdG9yKHQsZSxyLG4saSxzKXt0aGlzLmV4cHJlc3Npb249dCx0aGlzLnR5cGU9ZSx0aGlzLnVzZUludGVnZXJab29tPXIsdGhpcy56b29tPW4sdGhpcy5sYXllcklkPXMsdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5PW5ldyBpLHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXk9bmV3IGk7fXBvcHVsYXRlUGFpbnRBcnJheSh0LGUscil7Y29uc3Qgbj10aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkubGVuZ3RoO3RoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUodCksdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUodCksdGhpcy5fc2V0UGFpbnRWYWx1ZXMobix0LGUucGF0dGVybnMmJmUucGF0dGVybnNbdGhpcy5sYXllcklkXSxyKTt9dXBkYXRlUGFpbnRBcnJheSh0LGUscixuLGkpe3RoaXMuX3NldFBhaW50VmFsdWVzKHQsZSxyLnBhdHRlcm5zJiZyLnBhdHRlcm5zW3RoaXMubGF5ZXJJZF0saSk7fV9zZXRQYWludFZhbHVlcyh0LGUscixuKXtpZighbnx8IXIpcmV0dXJuO2NvbnN0e21pbjppLG1pZDpzLG1heDphfT1yLG89bltpXSxsPW5bc10sdT1uW2FdO2lmKG8mJmwmJnUpZm9yKGxldCByPXQ7cjxlO3IrKyl0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShyLGwudGxbMF0sbC50bFsxXSxsLmJyWzBdLGwuYnJbMV0sby50bFswXSxvLnRsWzFdLG8uYnJbMF0sby5iclsxXSxsLnBpeGVsUmF0aW8sby5waXhlbFJhdGlvKSx0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LmVtcGxhY2UocixsLnRsWzBdLGwudGxbMV0sbC5iclswXSxsLmJyWzFdLHUudGxbMF0sdS50bFsxXSx1LmJyWzBdLHUuYnJbMV0sbC5waXhlbFJhdGlvLHUucGl4ZWxSYXRpbyk7fXVwbG9hZCh0KXt0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkmJnRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheS5hcnJheUJ1ZmZlciYmdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSYmdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheS5hcnJheUJ1ZmZlciYmKHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LHVhLm1lbWJlcnMsdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpLHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyPXQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXksdWEubWVtYmVycyx0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCkpO31kZXN0cm95KCl7dGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXImJnRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyJiZ0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTt9fWNsYXNzIFZhe2NvbnN0cnVjdG9yKHQsZSxyKXt0aGlzLmJpbmRlcnM9e30sdGhpcy5fYnVmZmVycz1bXTtjb25zdCBuPVtdO2Zvcihjb25zdCBpIGluIHQucGFpbnQuX3ZhbHVlcyl7aWYoIXIoaSkpY29udGludWU7Y29uc3Qgcz10LnBhaW50LmdldChpKTtpZighKHMgaW5zdGFuY2VvZiBIaSYmYW4ocy5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKSkpY29udGludWU7Y29uc3QgYT1GYShpLHQudHlwZSksbz1zLnZhbHVlLGw9cy5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLnR5cGUsdT1zLnByb3BlcnR5LnVzZUludGVnZXJab29tLGM9cy5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uW1wicHJvcGVydHktdHlwZVwiXSxoPVwiY3Jvc3MtZmFkZWRcIj09PWN8fFwiY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5cIj09PWM7aWYoXCJjb25zdGFudFwiPT09by5raW5kKXRoaXMuYmluZGVyc1tpXT1oP25ldyB6YShvLnZhbHVlLGEpOm5ldyBJYShvLnZhbHVlLGEsbCksbi5wdXNoKGAvdV8ke2l9YCk7ZWxzZSBpZihcInNvdXJjZVwiPT09by5raW5kfHxoKXtjb25zdCByPVRhKGksbCxcInNvdXJjZVwiKTt0aGlzLmJpbmRlcnNbaV09aD9uZXcgQmEobyxsLHUsZSxyLHQuaWQpOm5ldyBQYShvLGEsbCxyKSxuLnB1c2goYC9hXyR7aX1gKTt9ZWxzZSB7Y29uc3QgdD1UYShpLGwsXCJjb21wb3NpdGVcIik7dGhpcy5iaW5kZXJzW2ldPW5ldyBDYShvLGEsbCx1LGUsdCksbi5wdXNoKGAvel8ke2l9YCk7fX10aGlzLmNhY2hlS2V5PW4uc29ydCgpLmpvaW4oXCJcIik7fWdldE1heFZhbHVlKHQpe2NvbnN0IGU9dGhpcy5iaW5kZXJzW3RdO3JldHVybiBlIGluc3RhbmNlb2YgUGF8fGUgaW5zdGFuY2VvZiBDYT9lLm1heFZhbHVlOjB9cG9wdWxhdGVQYWludEFycmF5cyh0LGUscixuLGkpe2Zvcihjb25zdCBzIGluIHRoaXMuYmluZGVycyl7Y29uc3QgYT10aGlzLmJpbmRlcnNbc107KGEgaW5zdGFuY2VvZiBQYXx8YSBpbnN0YW5jZW9mIENhfHxhIGluc3RhbmNlb2YgQmEpJiZhLnBvcHVsYXRlUGFpbnRBcnJheSh0LGUscixuLGkpO319c2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHQsZSl7Zm9yKGNvbnN0IHIgaW4gdGhpcy5iaW5kZXJzKXtjb25zdCBuPXRoaXMuYmluZGVyc1tyXTtuIGluc3RhbmNlb2YgemEmJm4uc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHQsZSk7fX11cGRhdGVQYWludEFycmF5cyh0LGUscixuLGkpe2xldCBzPSExO2Zvcihjb25zdCBhIGluIHQpe2NvbnN0IG89ZS5nZXRQb3NpdGlvbnMoYSk7Zm9yKGNvbnN0IGUgb2Ygbyl7Y29uc3Qgbz1yLmZlYXR1cmUoZS5pbmRleCk7Zm9yKGNvbnN0IHIgaW4gdGhpcy5iaW5kZXJzKXtjb25zdCBsPXRoaXMuYmluZGVyc1tyXTtpZigobCBpbnN0YW5jZW9mIFBhfHxsIGluc3RhbmNlb2YgQ2F8fGwgaW5zdGFuY2VvZiBCYSkmJiEwPT09bC5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpe2NvbnN0IHU9bi5wYWludC5nZXQocik7bC5leHByZXNzaW9uPXUudmFsdWUsbC51cGRhdGVQYWludEFycmF5KGUuc3RhcnQsZS5lbmQsbyx0W2FdLGkpLHM9ITA7fX19fXJldHVybiBzfWRlZmluZXMoKXtjb25zdCB0PVtdO2Zvcihjb25zdCBlIGluIHRoaXMuYmluZGVycyl7Y29uc3Qgcj10aGlzLmJpbmRlcnNbZV07KHIgaW5zdGFuY2VvZiBJYXx8ciBpbnN0YW5jZW9mIHphKSYmdC5wdXNoKC4uLnIudW5pZm9ybU5hbWVzLm1hcCgodD0+YCNkZWZpbmUgSEFTX1VOSUZPUk1fJHt0fWApKSk7fXJldHVybiB0fWdldEJpbmRlckF0dHJpYnV0ZXMoKXtjb25zdCB0PVtdO2Zvcihjb25zdCBlIGluIHRoaXMuYmluZGVycyl7Y29uc3Qgcj10aGlzLmJpbmRlcnNbZV07aWYociBpbnN0YW5jZW9mIFBhfHxyIGluc3RhbmNlb2YgQ2EpZm9yKGxldCBlPTA7ZTxyLnBhaW50VmVydGV4QXR0cmlidXRlcy5sZW5ndGg7ZSsrKXQucHVzaChyLnBhaW50VmVydGV4QXR0cmlidXRlc1tlXS5uYW1lKTtlbHNlIGlmKHIgaW5zdGFuY2VvZiBCYSlmb3IobGV0IGU9MDtlPHVhLm1lbWJlcnMubGVuZ3RoO2UrKyl0LnB1c2godWEubWVtYmVyc1tlXS5uYW1lKTt9cmV0dXJuIHR9Z2V0QmluZGVyVW5pZm9ybXMoKXtjb25zdCB0PVtdO2Zvcihjb25zdCBlIGluIHRoaXMuYmluZGVycyl7Y29uc3Qgcj10aGlzLmJpbmRlcnNbZV07aWYociBpbnN0YW5jZW9mIElhfHxyIGluc3RhbmNlb2YgemF8fHIgaW5zdGFuY2VvZiBDYSlmb3IoY29uc3QgZSBvZiByLnVuaWZvcm1OYW1lcyl0LnB1c2goZSk7fXJldHVybiB0fWdldFBhaW50VmVydGV4QnVmZmVycygpe3JldHVybiB0aGlzLl9idWZmZXJzfWdldFVuaWZvcm1zKHQsZSl7Y29uc3Qgcj1bXTtmb3IoY29uc3QgbiBpbiB0aGlzLmJpbmRlcnMpe2NvbnN0IGk9dGhpcy5iaW5kZXJzW25dO2lmKGkgaW5zdGFuY2VvZiBJYXx8aSBpbnN0YW5jZW9mIHphfHxpIGluc3RhbmNlb2YgQ2EpZm9yKGNvbnN0IHMgb2YgaS51bmlmb3JtTmFtZXMpaWYoZVtzXSl7Y29uc3QgYT1pLmdldEJpbmRpbmcodCxlW3NdLHMpO3IucHVzaCh7bmFtZTpzLHByb3BlcnR5Om4sYmluZGluZzphfSk7fX1yZXR1cm4gcn1zZXRVbmlmb3Jtcyh0LGUscixuKXtmb3IoY29uc3R7bmFtZTp0LHByb3BlcnR5OmksYmluZGluZzpzfW9mIGUpdGhpcy5iaW5kZXJzW2ldLnNldFVuaWZvcm0ocyxuLHIuZ2V0KGkpLHQpO311cGRhdGVQYWludEJ1ZmZlcnModCl7dGhpcy5fYnVmZmVycz1bXTtmb3IoY29uc3QgZSBpbiB0aGlzLmJpbmRlcnMpe2NvbnN0IHI9dGhpcy5iaW5kZXJzW2VdO2lmKHQmJnIgaW5zdGFuY2VvZiBCYSl7Y29uc3QgZT0yPT09dC5mcm9tU2NhbGU/ci56b29tSW5QYWludFZlcnRleEJ1ZmZlcjpyLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlcjtlJiZ0aGlzLl9idWZmZXJzLnB1c2goZSk7fWVsc2UgKHIgaW5zdGFuY2VvZiBQYXx8ciBpbnN0YW5jZW9mIENhKSYmci5wYWludFZlcnRleEJ1ZmZlciYmdGhpcy5fYnVmZmVycy5wdXNoKHIucGFpbnRWZXJ0ZXhCdWZmZXIpO319dXBsb2FkKHQpe2Zvcihjb25zdCBlIGluIHRoaXMuYmluZGVycyl7Y29uc3Qgcj10aGlzLmJpbmRlcnNbZV07KHIgaW5zdGFuY2VvZiBQYXx8ciBpbnN0YW5jZW9mIENhfHxyIGluc3RhbmNlb2YgQmEpJiZyLnVwbG9hZCh0KTt9dGhpcy51cGRhdGVQYWludEJ1ZmZlcnMoKTt9ZGVzdHJveSgpe2Zvcihjb25zdCB0IGluIHRoaXMuYmluZGVycyl7Y29uc3QgZT10aGlzLmJpbmRlcnNbdF07KGUgaW5zdGFuY2VvZiBQYXx8ZSBpbnN0YW5jZW9mIENhfHxlIGluc3RhbmNlb2YgQmEpJiZlLmRlc3Ryb3koKTt9fX1jbGFzcyBFYXtjb25zdHJ1Y3Rvcih0LGUscj0oKCk9PiEwKSl7dGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnM9e307Zm9yKGNvbnN0IG4gb2YgdCl0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tuLmlkXT1uZXcgVmEobixlLHIpO3RoaXMubmVlZHNVcGxvYWQ9ITEsdGhpcy5fZmVhdHVyZU1hcD1uZXcgZ2EsdGhpcy5fYnVmZmVyT2Zmc2V0PTA7fXBvcHVsYXRlUGFpbnRBcnJheXModCxlLHIsbixpLHMpe2Zvcihjb25zdCByIGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKXRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW3JdLnBvcHVsYXRlUGFpbnRBcnJheXModCxlLG4saSxzKTt2b2lkIDAhPT1lLmlkJiZ0aGlzLl9mZWF0dXJlTWFwLmFkZChlLmlkLHIsdGhpcy5fYnVmZmVyT2Zmc2V0LHQpLHRoaXMuX2J1ZmZlck9mZnNldD10LHRoaXMubmVlZHNVcGxvYWQ9ITA7fXVwZGF0ZVBhaW50QXJyYXlzKHQsZSxyLG4pe2Zvcihjb25zdCBpIG9mIHIpdGhpcy5uZWVkc1VwbG9hZD10aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tpLmlkXS51cGRhdGVQYWludEFycmF5cyh0LHRoaXMuX2ZlYXR1cmVNYXAsZSxpLG4pfHx0aGlzLm5lZWRzVXBsb2FkO31nZXQodCl7cmV0dXJuIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW3RdfXVwbG9hZCh0KXtpZih0aGlzLm5lZWRzVXBsb2FkKXtmb3IoY29uc3QgZSBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyl0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tlXS51cGxvYWQodCk7dGhpcy5uZWVkc1VwbG9hZD0hMTt9fWRlc3Ryb3koKXtmb3IoY29uc3QgdCBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyl0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1t0XS5kZXN0cm95KCk7fX1mdW5jdGlvbiBGYSh0LGUpe3JldHVybiB7XCJ0ZXh0LW9wYWNpdHlcIjpbXCJvcGFjaXR5XCJdLFwiaWNvbi1vcGFjaXR5XCI6W1wib3BhY2l0eVwiXSxcInRleHQtY29sb3JcIjpbXCJmaWxsX2NvbG9yXCJdLFwiaWNvbi1jb2xvclwiOltcImZpbGxfY29sb3JcIl0sXCJ0ZXh0LWhhbG8tY29sb3JcIjpbXCJoYWxvX2NvbG9yXCJdLFwiaWNvbi1oYWxvLWNvbG9yXCI6W1wiaGFsb19jb2xvclwiXSxcInRleHQtaGFsby1ibHVyXCI6W1wiaGFsb19ibHVyXCJdLFwiaWNvbi1oYWxvLWJsdXJcIjpbXCJoYWxvX2JsdXJcIl0sXCJ0ZXh0LWhhbG8td2lkdGhcIjpbXCJoYWxvX3dpZHRoXCJdLFwiaWNvbi1oYWxvLXdpZHRoXCI6W1wiaGFsb193aWR0aFwiXSxcImxpbmUtZ2FwLXdpZHRoXCI6W1wiZ2Fwd2lkdGhcIl0sXCJsaW5lLXBhdHRlcm5cIjpbXCJwYXR0ZXJuX3RvXCIsXCJwYXR0ZXJuX2Zyb21cIixcInBpeGVsX3JhdGlvX3RvXCIsXCJwaXhlbF9yYXRpb19mcm9tXCJdLFwiZmlsbC1wYXR0ZXJuXCI6W1wicGF0dGVybl90b1wiLFwicGF0dGVybl9mcm9tXCIsXCJwaXhlbF9yYXRpb190b1wiLFwicGl4ZWxfcmF0aW9fZnJvbVwiXSxcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjpbXCJwYXR0ZXJuX3RvXCIsXCJwYXR0ZXJuX2Zyb21cIixcInBpeGVsX3JhdGlvX3RvXCIsXCJwaXhlbF9yYXRpb19mcm9tXCJdfVt0XXx8W3QucmVwbGFjZShgJHtlfS1gLFwiXCIpLnJlcGxhY2UoLy0vZyxcIl9cIildfWZ1bmN0aW9uIFRhKHQsZSxyKXtjb25zdCBuPXtjb2xvcjp7c291cmNlOnlzLGNvbXBvc2l0ZTpWc30sbnVtYmVyOntzb3VyY2U6SXMsY29tcG9zaXRlOnlzfX0saT1mdW5jdGlvbih0KXtyZXR1cm4ge1wibGluZS1wYXR0ZXJuXCI6e3NvdXJjZTpKcyxjb21wb3NpdGU6SnN9LFwiZmlsbC1wYXR0ZXJuXCI6e3NvdXJjZTpKcyxjb21wb3NpdGU6SnN9LFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiOntzb3VyY2U6SnMsY29tcG9zaXRlOkpzfX1bdF19KHQpO3JldHVybiBpJiZpW3JdfHxuW2VdW3JdfXdpKFwiQ29uc3RhbnRCaW5kZXJcIixJYSksd2koXCJDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXJcIix6YSksd2koXCJTb3VyY2VFeHByZXNzaW9uQmluZGVyXCIsUGEpLHdpKFwiQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlclwiLEJhKSx3aShcIkNvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXJcIixDYSksd2koXCJQcm9ncmFtQ29uZmlndXJhdGlvblwiLFZhLHtvbWl0OltcIl9idWZmZXJzXCJdfSksd2koXCJQcm9ncmFtQ29uZmlndXJhdGlvblNldFwiLEVhKTtjb25zdCAkYT04MTkyLExhPU1hdGgucG93KDIsMTQpLTEsRGE9LUxhLTE7ZnVuY3Rpb24gT2EodCl7Y29uc3QgZT0kYS90LmV4dGVudCxyPXQubG9hZEdlb21ldHJ5KCk7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspe2NvbnN0IG49clt0XTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7Y29uc3Qgcj1uW3RdLGk9TWF0aC5yb3VuZChyLngqZSkscz1NYXRoLnJvdW5kKHIueSplKTtyLng9eShpLERhLExhKSxyLnk9eShzLERhLExhKSwoaTxyLnh8fGk+ci54KzF8fHM8ci55fHxzPnIueSsxKSYmQShcIkdlb21ldHJ5IGV4Y2VlZHMgYWxsb3dlZCBleHRlbnQsIHJlZHVjZSB5b3VyIHZlY3RvciB0aWxlIGJ1ZmZlciBzaXplXCIpO319cmV0dXJuIHJ9ZnVuY3Rpb24gamEodCxlKXtyZXR1cm4ge3R5cGU6dC50eXBlLGlkOnQuaWQscHJvcGVydGllczp0LnByb3BlcnRpZXMsZ2VvbWV0cnk6ZT9PYSh0KTpbXX19ZnVuY3Rpb24gUmEodCxlLHIsbixpKXt0LmVtcGxhY2VCYWNrKDIqZSsobisxKS8yLDIqcisoaSsxKS8yKTt9Y2xhc3MgVWF7Y29uc3RydWN0b3IodCl7dGhpcy56b29tPXQuem9vbSx0aGlzLm92ZXJzY2FsaW5nPXQub3ZlcnNjYWxpbmcsdGhpcy5sYXllcnM9dC5sYXllcnMsdGhpcy5sYXllcklkcz10aGlzLmxheWVycy5tYXAoKHQ9PnQuaWQpKSx0aGlzLmluZGV4PXQuaW5kZXgsdGhpcy5oYXNQYXR0ZXJuPSExLHRoaXMubGF5b3V0VmVydGV4QXJyYXk9bmV3IEdzLHRoaXMuaW5kZXhBcnJheT1uZXcgbmEsdGhpcy5zZWdtZW50cz1uZXcgb2EsdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnM9bmV3IEVhKHQubGF5ZXJzLHQuem9vbSksdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzPXRoaXMubGF5ZXJzLmZpbHRlcigodD0+dC5pc1N0YXRlRGVwZW5kZW50KCkpKS5tYXAoKHQ9PnQuaWQpKTt9cG9wdWxhdGUodCxlLHIpe2NvbnN0IG49dGhpcy5sYXllcnNbMF0saT1bXTtsZXQgcz1udWxsLGE9ITE7XCJjaXJjbGVcIj09PW4udHlwZSYmKHM9bi5sYXlvdXQuZ2V0KFwiY2lyY2xlLXNvcnQta2V5XCIpLGE9IXMuaXNDb25zdGFudCgpKTtmb3IoY29uc3R7ZmVhdHVyZTplLGlkOm4saW5kZXg6byxzb3VyY2VMYXllckluZGV4Omx9b2YgdCl7Y29uc3QgdD10aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnksdT1qYShlLHQpO2lmKCF0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5maWx0ZXIobmV3IFVpKHRoaXMuem9vbSksdSxyKSljb250aW51ZTtjb25zdCBjPWE/cy5ldmFsdWF0ZSh1LHt9LHIpOnZvaWQgMCxoPXtpZDpuLHByb3BlcnRpZXM6ZS5wcm9wZXJ0aWVzLHR5cGU6ZS50eXBlLHNvdXJjZUxheWVySW5kZXg6bCxpbmRleDpvLGdlb21ldHJ5OnQ/dS5nZW9tZXRyeTpPYShlKSxwYXR0ZXJuczp7fSxzb3J0S2V5OmN9O2kucHVzaChoKTt9YSYmaS5zb3J0KCgodCxlKT0+dC5zb3J0S2V5LWUuc29ydEtleSkpO2Zvcihjb25zdCBuIG9mIGkpe2NvbnN0e2dlb21ldHJ5OmksaW5kZXg6cyxzb3VyY2VMYXllckluZGV4OmF9PW4sbz10W3NdLmZlYXR1cmU7dGhpcy5hZGRGZWF0dXJlKG4saSxzLHIpLGUuZmVhdHVyZUluZGV4Lmluc2VydChvLGkscyxhLHRoaXMuaW5kZXgpO319dXBkYXRlKHQsZSxyKXt0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCYmdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXModCxlLHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMscik7fWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RofXVwbG9hZFBlbmRpbmcoKXtyZXR1cm4gIXRoaXMudXBsb2FkZWR8fHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkfXVwbG9hZCh0KXt0aGlzLnVwbG9hZGVkfHwodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSxhYSksdGhpcy5pbmRleEJ1ZmZlcj10LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSkpLHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZCh0KSx0aGlzLnVwbG9hZGVkPSEwO31kZXN0cm95KCl7dGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXImJih0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpLHRoaXMuc2VnbWVudHMuZGVzdHJveSgpKTt9YWRkRmVhdHVyZSh0LGUscixuKXtmb3IoY29uc3QgciBvZiBlKWZvcihjb25zdCBlIG9mIHIpe2NvbnN0IHI9ZS54LG49ZS55O2lmKHI8MHx8cj49JGF8fG48MHx8bj49JGEpY29udGludWU7Y29uc3QgaT10aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSx0aGlzLmluZGV4QXJyYXksdC5zb3J0S2V5KSxzPWkudmVydGV4TGVuZ3RoO1JhKHRoaXMubGF5b3V0VmVydGV4QXJyYXkscixuLC0xLC0xKSxSYSh0aGlzLmxheW91dFZlcnRleEFycmF5LHIsbiwxLC0xKSxSYSh0aGlzLmxheW91dFZlcnRleEFycmF5LHIsbiwxLDEpLFJhKHRoaXMubGF5b3V0VmVydGV4QXJyYXkscixuLC0xLDEpLHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhzLHMrMSxzKzIpLHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhzLHMrMyxzKzIpLGkudmVydGV4TGVuZ3RoKz00LGkucHJpbWl0aXZlTGVuZ3RoKz0yO310aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLHQscix7fSxuKTt9fWZ1bmN0aW9uIHFhKHQsZSl7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspaWYoV2EoZSx0W3JdKSlyZXR1cm4gITA7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoV2EodCxlW3JdKSlyZXR1cm4gITA7cmV0dXJuICEhS2EodCxlKX1mdW5jdGlvbiBOYSh0LGUscil7cmV0dXJuICEhV2EodCxlKXx8ISFIYShlLHQscil9ZnVuY3Rpb24gWmEodCxlKXtpZigxPT09dC5sZW5ndGgpcmV0dXJuIEphKGUsdFswXSk7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2NvbnN0IG49ZVtyXTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKylpZihXYSh0LG5bZV0pKXJldHVybiAhMH1mb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKylpZihKYShlLHRbcl0pKXJldHVybiAhMDtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihLYSh0LGVbcl0pKXJldHVybiAhMDtyZXR1cm4gITF9ZnVuY3Rpb24gR2EodCxlLHIpe2lmKHQubGVuZ3RoPjEpe2lmKEthKHQsZSkpcmV0dXJuICEwO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKEhhKGVbbl0sdCxyKSlyZXR1cm4gITB9Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoSGEodFtuXSxlLHIpKXJldHVybiAhMDtyZXR1cm4gITF9ZnVuY3Rpb24gS2EodCxlKXtpZigwPT09dC5sZW5ndGh8fDA9PT1lLmxlbmd0aClyZXR1cm4gITE7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aC0xO3IrKyl7Y29uc3Qgbj10W3JdLGk9dFtyKzFdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGgtMTt0KyspaWYoWGEobixpLGVbdF0sZVt0KzFdKSlyZXR1cm4gITB9cmV0dXJuICExfWZ1bmN0aW9uIFhhKHQsZSxyLG4pe3JldHVybiBTKHQscixuKSE9PVMoZSxyLG4pJiZTKHQsZSxyKSE9PVModCxlLG4pfWZ1bmN0aW9uIEhhKHQsZSxyKXtjb25zdCBuPXIqcjtpZigxPT09ZS5sZW5ndGgpcmV0dXJuIHQuZGlzdFNxcihlWzBdKTxuO2ZvcihsZXQgcj0xO3I8ZS5sZW5ndGg7cisrKWlmKFlhKHQsZVtyLTFdLGVbcl0pPG4pcmV0dXJuICEwO3JldHVybiAhMX1mdW5jdGlvbiBZYSh0LGUscil7Y29uc3Qgbj1lLmRpc3RTcXIocik7aWYoMD09PW4pcmV0dXJuIHQuZGlzdFNxcihlKTtjb25zdCBpPSgodC54LWUueCkqKHIueC1lLngpKyh0LnktZS55KSooci55LWUueSkpL247cmV0dXJuIHQuZGlzdFNxcihpPDA/ZTppPjE/cjpyLnN1YihlKS5fbXVsdChpKS5fYWRkKGUpKX1mdW5jdGlvbiBKYSh0LGUpe2xldCByLG4saSxzPSExO2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSsrKXtyPXRbYV07Zm9yKGxldCB0PTAsYT1yLmxlbmd0aC0xO3Q8ci5sZW5ndGg7YT10Kyspbj1yW3RdLGk9clthXSxuLnk+ZS55IT1pLnk+ZS55JiZlLng8KGkueC1uLngpKihlLnktbi55KS8oaS55LW4ueSkrbi54JiYocz0hcyk7fXJldHVybiBzfWZ1bmN0aW9uIFdhKHQsZSl7bGV0IHI9ITE7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aC0xO248dC5sZW5ndGg7aT1uKyspe2NvbnN0IHM9dFtuXSxhPXRbaV07cy55PmUueSE9YS55PmUueSYmZS54PChhLngtcy54KSooZS55LXMueSkvKGEueS1zLnkpK3MueCYmKHI9IXIpO31yZXR1cm4gcn1mdW5jdGlvbiBRYSh0LGUscil7Y29uc3Qgbj1yWzBdLGk9clsyXTtpZih0Lng8bi54JiZlLng8bi54fHx0Lng+aS54JiZlLng+aS54fHx0Lnk8bi55JiZlLnk8bi55fHx0Lnk+aS55JiZlLnk+aS55KXJldHVybiAhMTtjb25zdCBzPVModCxlLHJbMF0pO3JldHVybiBzIT09Uyh0LGUsclsxXSl8fHMhPT1TKHQsZSxyWzJdKXx8cyE9PVModCxlLHJbM10pfWZ1bmN0aW9uIHRvKHQsZSxyKXtjb25zdCBuPWUucGFpbnQuZ2V0KHQpLnZhbHVlO3JldHVybiBcImNvbnN0YW50XCI9PT1uLmtpbmQ/bi52YWx1ZTpyLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQoZS5pZCkuZ2V0TWF4VmFsdWUodCl9ZnVuY3Rpb24gZW8odCl7cmV0dXJuIE1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKX1mdW5jdGlvbiBybyh0LGUscixuLGkpe2lmKCFlWzBdJiYhZVsxXSlyZXR1cm4gdDtjb25zdCBhPXMuY29udmVydChlKS5fbXVsdChpKTtcInZpZXdwb3J0XCI9PT1yJiZhLl9yb3RhdGUoLW4pO2NvbnN0IG89W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspby5wdXNoKHRbZV0uc3ViKGEpKTtyZXR1cm4gb31sZXQgbm8saW87d2koXCJDaXJjbGVCdWNrZXRcIixVYSx7b21pdDpbXCJsYXllcnNcIl19KTt2YXIgc289e2dldCBwYWludCgpe3JldHVybiBpbz1pb3x8bmV3IHJzKHtcImNpcmNsZS1yYWRpdXNcIjpuZXcgV2koRy5wYWludF9jaXJjbGVbXCJjaXJjbGUtcmFkaXVzXCJdKSxcImNpcmNsZS1jb2xvclwiOm5ldyBXaShHLnBhaW50X2NpcmNsZVtcImNpcmNsZS1jb2xvclwiXSksXCJjaXJjbGUtYmx1clwiOm5ldyBXaShHLnBhaW50X2NpcmNsZVtcImNpcmNsZS1ibHVyXCJdKSxcImNpcmNsZS1vcGFjaXR5XCI6bmV3IFdpKEcucGFpbnRfY2lyY2xlW1wiY2lyY2xlLW9wYWNpdHlcIl0pLFwiY2lyY2xlLXRyYW5zbGF0ZVwiOm5ldyBKaShHLnBhaW50X2NpcmNsZVtcImNpcmNsZS10cmFuc2xhdGVcIl0pLFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjpuZXcgSmkoRy5wYWludF9jaXJjbGVbXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiXSksXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjpuZXcgSmkoRy5wYWludF9jaXJjbGVbXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIl0pLFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiOm5ldyBKaShHLnBhaW50X2NpcmNsZVtcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIl0pLFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOm5ldyBXaShHLnBhaW50X2NpcmNsZVtcImNpcmNsZS1zdHJva2Utd2lkdGhcIl0pLFwiY2lyY2xlLXN0cm9rZS1jb2xvclwiOm5ldyBXaShHLnBhaW50X2NpcmNsZVtcImNpcmNsZS1zdHJva2UtY29sb3JcIl0pLFwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCI6bmV3IFdpKEcucGFpbnRfY2lyY2xlW1wiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCJdKX0pfSxnZXQgbGF5b3V0KCl7cmV0dXJuIG5vPW5vfHxuZXcgcnMoe1wiY2lyY2xlLXNvcnQta2V5XCI6bmV3IFdpKEcubGF5b3V0X2NpcmNsZVtcImNpcmNsZS1zb3J0LWtleVwiXSl9KX19LGFvPTFlLTYsb289XCJ1bmRlZmluZWRcIiE9dHlwZW9mIEZsb2F0MzJBcnJheT9GbG9hdDMyQXJyYXk6QXJyYXk7ZnVuY3Rpb24gbG8odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fWZ1bmN0aW9uIHVvKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxzPWVbMl0sYT1lWzNdLG89ZVs0XSxsPWVbNV0sdT1lWzZdLGM9ZVs3XSxoPWVbOF0scD1lWzldLGY9ZVsxMF0sZD1lWzExXSx5PWVbMTJdLG09ZVsxM10sZz1lWzE0XSx4PWVbMTVdLHY9clswXSxiPXJbMV0sdz1yWzJdLF89clszXTtyZXR1cm4gdFswXT12Km4rYipvK3cqaCtfKnksdFsxXT12KmkrYipsK3cqcCtfKm0sdFsyXT12KnMrYip1K3cqZitfKmcsdFszXT12KmErYipjK3cqZCtfKngsdFs0XT0odj1yWzRdKSpuKyhiPXJbNV0pKm8rKHc9cls2XSkqaCsoXz1yWzddKSp5LHRbNV09dippK2IqbCt3KnArXyptLHRbNl09dipzK2IqdSt3KmYrXypnLHRbN109diphK2IqYyt3KmQrXyp4LHRbOF09KHY9cls4XSkqbisoYj1yWzldKSpvKyh3PXJbMTBdKSpoKyhfPXJbMTFdKSp5LHRbOV09dippK2IqbCt3KnArXyptLHRbMTBdPXYqcytiKnUrdypmK18qZyx0WzExXT12KmErYipjK3cqZCtfKngsdFsxMl09KHY9clsxMl0pKm4rKGI9clsxM10pKm8rKHc9clsxNF0pKmgrKF89clsxNV0pKnksdFsxM109dippK2IqbCt3KnArXyptLHRbMTRdPXYqcytiKnUrdypmK18qZyx0WzE1XT12KmErYipjK3cqZCtfKngsdH1NYXRoLmh5cG90fHwoTWF0aC5oeXBvdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9YXJndW1lbnRzLmxlbmd0aDtlLS07KXQrPWFyZ3VtZW50c1tlXSphcmd1bWVudHNbZV07cmV0dXJuIE1hdGguc3FydCh0KX0pO3ZhciBjbyxobz11bztmdW5jdGlvbiBwbyh0LGUscil7dmFyIG49ZVswXSxpPWVbMV0scz1lWzJdLGE9ZVszXTtyZXR1cm4gdFswXT1yWzBdKm4rcls0XSppK3JbOF0qcytyWzEyXSphLHRbMV09clsxXSpuK3JbNV0qaStyWzldKnMrclsxM10qYSx0WzJdPXJbMl0qbityWzZdKmkrclsxMF0qcytyWzE0XSphLHRbM109clszXSpuK3JbN10qaStyWzExXSpzK3JbMTVdKmEsdH1jbz1uZXcgb28oNCksb28hPUZsb2F0MzJBcnJheSYmKGNvWzBdPTAsY29bMV09MCxjb1syXT0wLGNvWzNdPTApO2NsYXNzIGZvIGV4dGVuZHMgaXN7Y29uc3RydWN0b3IodCl7c3VwZXIodCxzbyk7fWNyZWF0ZUJ1Y2tldCh0KXtyZXR1cm4gbmV3IFVhKHQpfXF1ZXJ5UmFkaXVzKHQpe2NvbnN0IGU9dDtyZXR1cm4gdG8oXCJjaXJjbGUtcmFkaXVzXCIsdGhpcyxlKSt0byhcImNpcmNsZS1zdHJva2Utd2lkdGhcIix0aGlzLGUpK2VvKHRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXRyYW5zbGF0ZVwiKSl9cXVlcnlJbnRlcnNlY3RzRmVhdHVyZSh0LGUscixuLGkscyxhLG8pe2NvbnN0IGw9cm8odCx0aGlzLnBhaW50LmdldChcImNpcmNsZS10cmFuc2xhdGVcIiksdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiKSxzLmFuZ2xlLGEpLHU9dGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcmFkaXVzXCIpLmV2YWx1YXRlKGUscikrdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCIpLmV2YWx1YXRlKGUsciksYz1cIm1hcFwiPT09dGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCIpLGg9Yz9sOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubWFwKCh0PT55byh0LGUpKSl9KGwsbykscD1jP3UqYTp1O2Zvcihjb25zdCB0IG9mIG4pZm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1jP2U6eW8oZSxvKTtsZXQgcj1wO2NvbnN0IG49cG8oW10sW2UueCxlLnksMCwxXSxvKTtpZihcInZpZXdwb3J0XCI9PT10aGlzLnBhaW50LmdldChcImNpcmNsZS1waXRjaC1zY2FsZVwiKSYmXCJtYXBcIj09PXRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiKT9yKj1uWzNdL3MuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTpcIm1hcFwiPT09dGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIikmJlwidmlld3BvcnRcIj09PXRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiKSYmKHIqPXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZS9uWzNdKSxOYShoLHQscikpcmV0dXJuICEwfXJldHVybiAhMX19ZnVuY3Rpb24geW8odCxlKXtjb25zdCByPXBvKFtdLFt0LngsdC55LDAsMV0sZSk7cmV0dXJuIG5ldyBzKHJbMF0vclszXSxyWzFdL3JbM10pfWNsYXNzIG1vIGV4dGVuZHMgVWF7fWxldCBnbzt3aShcIkhlYXRtYXBCdWNrZXRcIixtbyx7b21pdDpbXCJsYXllcnNcIl19KTt2YXIgeG89e2dldCBwYWludCgpe3JldHVybiBnbz1nb3x8bmV3IHJzKHtcImhlYXRtYXAtcmFkaXVzXCI6bmV3IFdpKEcucGFpbnRfaGVhdG1hcFtcImhlYXRtYXAtcmFkaXVzXCJdKSxcImhlYXRtYXAtd2VpZ2h0XCI6bmV3IFdpKEcucGFpbnRfaGVhdG1hcFtcImhlYXRtYXAtd2VpZ2h0XCJdKSxcImhlYXRtYXAtaW50ZW5zaXR5XCI6bmV3IEppKEcucGFpbnRfaGVhdG1hcFtcImhlYXRtYXAtaW50ZW5zaXR5XCJdKSxcImhlYXRtYXAtY29sb3JcIjpuZXcgZXMoRy5wYWludF9oZWF0bWFwW1wiaGVhdG1hcC1jb2xvclwiXSksXCJoZWF0bWFwLW9wYWNpdHlcIjpuZXcgSmkoRy5wYWludF9oZWF0bWFwW1wiaGVhdG1hcC1vcGFjaXR5XCJdKX0pfX07ZnVuY3Rpb24gdm8odCx7d2lkdGg6ZSxoZWlnaHQ6cn0sbixpKXtpZihpKXtpZihpIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpaT1uZXcgVWludDhBcnJheShpLmJ1ZmZlcik7ZWxzZSBpZihpLmxlbmd0aCE9PWUqcipuKXRocm93IG5ldyBSYW5nZUVycm9yKGBtaXNtYXRjaGVkIGltYWdlIHNpemUuIGV4cGVjdGVkOiAke2kubGVuZ3RofSBidXQgZ290OiAke2UqcipufWApfWVsc2UgaT1uZXcgVWludDhBcnJheShlKnIqbik7cmV0dXJuIHQud2lkdGg9ZSx0LmhlaWdodD1yLHQuZGF0YT1pLHR9ZnVuY3Rpb24gYm8odCx7d2lkdGg6ZSxoZWlnaHQ6cn0sbil7aWYoZT09PXQud2lkdGgmJnI9PT10LmhlaWdodClyZXR1cm47Y29uc3QgaT12byh7fSx7d2lkdGg6ZSxoZWlnaHQ6cn0sbik7d28odCxpLHt4OjAseTowfSx7eDowLHk6MH0se3dpZHRoOk1hdGgubWluKHQud2lkdGgsZSksaGVpZ2h0Ok1hdGgubWluKHQuaGVpZ2h0LHIpfSxuKSx0LndpZHRoPWUsdC5oZWlnaHQ9cix0LmRhdGE9aS5kYXRhO31mdW5jdGlvbiB3byh0LGUscixuLGkscyl7aWYoMD09PWkud2lkdGh8fDA9PT1pLmhlaWdodClyZXR1cm4gZTtpZihpLndpZHRoPnQud2lkdGh8fGkuaGVpZ2h0PnQuaGVpZ2h0fHxyLng+dC53aWR0aC1pLndpZHRofHxyLnk+dC5oZWlnaHQtaS5oZWlnaHQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgcmFuZ2Ugc291cmNlIGNvb3JkaW5hdGVzIGZvciBpbWFnZSBjb3B5XCIpO2lmKGkud2lkdGg+ZS53aWR0aHx8aS5oZWlnaHQ+ZS5oZWlnaHR8fG4ueD5lLndpZHRoLWkud2lkdGh8fG4ueT5lLmhlaWdodC1pLmhlaWdodCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBkZXN0aW5hdGlvbiBjb29yZGluYXRlcyBmb3IgaW1hZ2UgY29weVwiKTtjb25zdCBhPXQuZGF0YSxvPWUuZGF0YTtpZihhPT09byl0aHJvdyBuZXcgRXJyb3IoXCJzcmNEYXRhIGVxdWFscyBkc3REYXRhLCBzbyBpbWFnZSBpcyBhbHJlYWR5IGNvcGllZFwiKTtmb3IobGV0IGw9MDtsPGkuaGVpZ2h0O2wrKyl7Y29uc3QgdT0oKHIueStsKSp0LndpZHRoK3IueCkqcyxjPSgobi55K2wpKmUud2lkdGgrbi54KSpzO2ZvcihsZXQgdD0wO3Q8aS53aWR0aCpzO3QrKylvW2MrdF09YVt1K3RdO31yZXR1cm4gZX1jbGFzcyBfb3tjb25zdHJ1Y3Rvcih0LGUpe3ZvKHRoaXMsdCwxLGUpO31yZXNpemUodCl7Ym8odGhpcyx0LDEpO31jbG9uZSgpe3JldHVybiBuZXcgX28oe3dpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0fSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKX1zdGF0aWMgY29weSh0LGUscixuLGkpe3dvKHQsZSxyLG4saSwxKTt9fWNsYXNzIEFve2NvbnN0cnVjdG9yKHQsZSl7dm8odGhpcyx0LDQsZSk7fXJlc2l6ZSh0KXtibyh0aGlzLHQsNCk7fXJlcGxhY2UodCxlKXtlP3RoaXMuZGF0YS5zZXQodCk6dGhpcy5kYXRhPXQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheT9uZXcgVWludDhBcnJheSh0LmJ1ZmZlcik6dDt9Y2xvbmUoKXtyZXR1cm4gbmV3IEFvKHt3aWR0aDp0aGlzLndpZHRoLGhlaWdodDp0aGlzLmhlaWdodH0sbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhKSl9c3RhdGljIGNvcHkodCxlLHIsbixpKXt3byh0LGUscixuLGksNCk7fX1mdW5jdGlvbiBTbyh0KXtjb25zdCBlPXt9LHI9dC5yZXNvbHV0aW9ufHwyNTYsbj10LmNsaXBzP3QuY2xpcHMubGVuZ3RoOjEsaT10LmltYWdlfHxuZXcgQW8oe3dpZHRoOnIsaGVpZ2h0Om59KTtpZihNYXRoLmxvZyhyKS9NYXRoLkxOMiUxIT0wKXRocm93IG5ldyBFcnJvcihgd2lkdGggaXMgbm90IGEgcG93ZXIgb2YgMiAtICR7cn1gKTtjb25zdCBzPShyLG4scyk9PntlW3QuZXZhbHVhdGlvbktleV09cztjb25zdCBhPXQuZXhwcmVzc2lvbi5ldmFsdWF0ZShlKTtpLmRhdGFbcituKzBdPU1hdGguZmxvb3IoMjU1KmEuci9hLmEpLGkuZGF0YVtyK24rMV09TWF0aC5mbG9vcigyNTUqYS5nL2EuYSksaS5kYXRhW3IrbisyXT1NYXRoLmZsb29yKDI1NSphLmIvYS5hKSxpLmRhdGFbcituKzNdPU1hdGguZmxvb3IoMjU1KmEuYSk7fTtpZih0LmNsaXBzKWZvcihsZXQgZT0wLGk9MDtlPG47KytlLGkrPTQqcilmb3IobGV0IG49MCxhPTA7bjxyO24rKyxhKz00KXtjb25zdCBvPW4vKHItMSkse3N0YXJ0OmwsZW5kOnV9PXQuY2xpcHNbZV07cyhpLGEsbCooMS1vKSt1Km8pO31lbHNlIGZvcihsZXQgdD0wLGU9MDt0PHI7dCsrLGUrPTQpcygwLGUsdC8oci0xKSk7cmV0dXJuIGl9d2koXCJBbHBoYUltYWdlXCIsX28pLHdpKFwiUkdCQUltYWdlXCIsQW8pO2NvbnN0IGtvPVwiYmlnLWZiXCI7Y2xhc3MgTW8gZXh0ZW5kcyBpc3tjcmVhdGVCdWNrZXQodCl7cmV0dXJuIG5ldyBtbyh0KX1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHhvKSx0aGlzLmhlYXRtYXBGYm9zPW5ldyBNYXAsdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7fV9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZSh0KXtcImhlYXRtYXAtY29sb3JcIj09PXQmJnRoaXMuX3VwZGF0ZUNvbG9yUmFtcCgpO31fdXBkYXRlQ29sb3JSYW1wKCl7dGhpcy5jb2xvclJhbXA9U28oe2V4cHJlc3Npb246dGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW1wiaGVhdG1hcC1jb2xvclwiXS52YWx1ZS5leHByZXNzaW9uLGV2YWx1YXRpb25LZXk6XCJoZWF0bWFwRGVuc2l0eVwiLGltYWdlOnRoaXMuY29sb3JSYW1wfSksdGhpcy5jb2xvclJhbXBUZXh0dXJlPW51bGw7fXJlc2l6ZSgpe3RoaXMuaGVhdG1hcEZib3MuaGFzKGtvKSYmdGhpcy5oZWF0bWFwRmJvcy5kZWxldGUoa28pO31xdWVyeVJhZGl1cygpe3JldHVybiAwfXF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUoKXtyZXR1cm4gITF9aGFzT2Zmc2NyZWVuUGFzcygpe3JldHVybiAwIT09dGhpcy5wYWludC5nZXQoXCJoZWF0bWFwLW9wYWNpdHlcIikmJlwibm9uZVwiIT09dGhpcy52aXNpYmlsaXR5fX1sZXQgSW87dmFyIHpvPXtnZXQgcGFpbnQoKXtyZXR1cm4gSW89SW98fG5ldyBycyh7XCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiOm5ldyBKaShHLnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCJdKSxcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCI6bmV3IEppKEcucGFpbnRfaGlsbHNoYWRlW1wiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIl0pLFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiOm5ldyBKaShHLnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIl0pLFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiOm5ldyBKaShHLnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIl0pLFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiOm5ldyBKaShHLnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIl0pLFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiOm5ldyBKaShHLnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIl0pfSl9fTtjbGFzcyBQbyBleHRlbmRzIGlze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsem8pO31oYXNPZmZzY3JlZW5QYXNzKCl7cmV0dXJuIDAhPT10aGlzLnBhaW50LmdldChcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIikmJlwibm9uZVwiIT09dGhpcy52aXNpYmlsaXR5fX1jb25zdCBDbz1scyhbe25hbWU6XCJhX3Bvc1wiLGNvbXBvbmVudHM6Mix0eXBlOlwiSW50MTZcIn1dLDQpLHttZW1iZXJzOkJvfT1DbztmdW5jdGlvbiBWbyh0LGUscj0yKXtjb25zdCBuPWUmJmUubGVuZ3RoLGk9bj9lWzBdKnI6dC5sZW5ndGg7bGV0IHM9RW8odCwwLGksciwhMCk7Y29uc3QgYT1bXTtpZighc3x8cy5uZXh0PT09cy5wcmV2KXJldHVybiBhO2xldCBvLGwsdTtpZihuJiYocz1mdW5jdGlvbih0LGUscixuKXtjb25zdCBpPVtdO2ZvcihsZXQgcj0wLHM9ZS5sZW5ndGg7cjxzO3IrKyl7Y29uc3QgYT1Fbyh0LGVbcl0qbixyPHMtMT9lW3IrMV0qbjp0Lmxlbmd0aCxuLCExKTthPT09YS5uZXh0JiYoYS5zdGVpbmVyPSEwKSxpLnB1c2goTm8oYSkpO31pLnNvcnQoam8pO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKXI9Um8oaVt0XSxyKTtyZXR1cm4gcn0odCxlLHMscikpLHQubGVuZ3RoPjgwKnIpe289MS8wLGw9MS8wO2xldCBlPS0xLzAsbj0tMS8wO2ZvcihsZXQgcz1yO3M8aTtzKz1yKXtjb25zdCByPXRbc10saT10W3MrMV07cjxvJiYobz1yKSxpPGwmJihsPWkpLHI+ZSYmKGU9ciksaT5uJiYobj1pKTt9dT1NYXRoLm1heChlLW8sbi1sKSx1PTAhPT11PzMyNzY3L3U6MDt9cmV0dXJuIFRvKHMsYSxyLG8sbCx1LDApLGF9ZnVuY3Rpb24gRW8odCxlLHIsbixpKXtsZXQgcztpZihpPT09ZnVuY3Rpb24odCxlLHIsbil7bGV0IGk9MDtmb3IobGV0IHM9ZSxhPXItbjtzPHI7cys9bilpKz0odFthXS10W3NdKSoodFtzKzFdK3RbYSsxXSksYT1zO3JldHVybiBpfSh0LGUscixuKT4wKWZvcihsZXQgaT1lO2k8cjtpKz1uKXM9dGwoaS9ufDAsdFtpXSx0W2krMV0scyk7ZWxzZSBmb3IobGV0IGk9ci1uO2k+PWU7aS09bilzPXRsKGkvbnwwLHRbaV0sdFtpKzFdLHMpO3JldHVybiBzJiZYbyhzLHMubmV4dCkmJihlbChzKSxzPXMubmV4dCksc31mdW5jdGlvbiBGbyh0LGUpe2lmKCF0KXJldHVybiB0O2V8fChlPXQpO2xldCByLG49dDtkb3tpZihyPSExLG4uc3RlaW5lcnx8IVhvKG4sbi5uZXh0KSYmMCE9PUtvKG4ucHJldixuLG4ubmV4dCkpbj1uLm5leHQ7ZWxzZSB7aWYoZWwobiksbj1lPW4ucHJldixuPT09bi5uZXh0KWJyZWFrO3I9ITA7fX13aGlsZShyfHxuIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gVG8odCxlLHIsbixpLHMsYSl7aWYoIXQpcmV0dXJuOyFhJiZzJiZmdW5jdGlvbih0LGUscixuKXtsZXQgaT10O2RvezA9PT1pLnomJihpLno9cW8oaS54LGkueSxlLHIsbikpLGkucHJldlo9aS5wcmV2LGkubmV4dFo9aS5uZXh0LGk9aS5uZXh0O313aGlsZShpIT09dCk7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxmdW5jdGlvbih0KXtsZXQgZSxyPTE7ZG97bGV0IG4saT10O3Q9bnVsbDtsZXQgcz1udWxsO2ZvcihlPTA7aTspe2UrKztsZXQgYT1pLG89MDtmb3IobGV0IHQ9MDt0PHImJihvKyssYT1hLm5leHRaLGEpO3QrKyk7bGV0IGw9cjtmb3IoO28+MHx8bD4wJiZhOykwIT09byYmKDA9PT1sfHwhYXx8aS56PD1hLnopPyhuPWksaT1pLm5leHRaLG8tLSk6KG49YSxhPWEubmV4dFosbC0tKSxzP3MubmV4dFo9bjp0PW4sbi5wcmV2Wj1zLHM9bjtpPWE7fXMubmV4dFo9bnVsbCxyKj0yO313aGlsZShlPjEpfShpKTt9KHQsbixpLHMpO2xldCBvPXQ7Zm9yKDt0LnByZXYhPT10Lm5leHQ7KXtjb25zdCBsPXQucHJldix1PXQubmV4dDtpZihzP0xvKHQsbixpLHMpOiRvKHQpKWUucHVzaChsLmksdC5pLHUuaSksZWwodCksdD11Lm5leHQsbz11Lm5leHQ7ZWxzZSBpZigodD11KT09PW8pe2E/MT09PWE/VG8odD1EbyhGbyh0KSxlKSxlLHIsbixpLHMsMik6Mj09PWEmJk9vKHQsZSxyLG4saSxzKTpUbyhGbyh0KSxlLHIsbixpLHMsMSk7YnJlYWt9fX1mdW5jdGlvbiAkbyh0KXtjb25zdCBlPXQucHJldixyPXQsbj10Lm5leHQ7aWYoS28oZSxyLG4pPj0wKXJldHVybiAhMTtjb25zdCBpPWUueCxzPXIueCxhPW4ueCxvPWUueSxsPXIueSx1PW4ueSxjPWk8cz9pPGE/aTphOnM8YT9zOmEsaD1vPGw/bzx1P286dTpsPHU/bDp1LHA9aT5zP2k+YT9pOmE6cz5hP3M6YSxmPW8+bD9vPnU/bzp1Omw+dT9sOnU7bGV0IGQ9bi5uZXh0O2Zvcig7ZCE9PWU7KXtpZihkLng+PWMmJmQueDw9cCYmZC55Pj1oJiZkLnk8PWYmJlpvKGksbyxzLGwsYSx1LGQueCxkLnkpJiZLbyhkLnByZXYsZCxkLm5leHQpPj0wKXJldHVybiAhMTtkPWQubmV4dDt9cmV0dXJuICEwfWZ1bmN0aW9uIExvKHQsZSxyLG4pe2NvbnN0IGk9dC5wcmV2LHM9dCxhPXQubmV4dDtpZihLbyhpLHMsYSk+PTApcmV0dXJuICExO2NvbnN0IG89aS54LGw9cy54LHU9YS54LGM9aS55LGg9cy55LHA9YS55LGY9bzxsP288dT9vOnU6bDx1P2w6dSxkPWM8aD9jPHA/YzpwOmg8cD9oOnAseT1vPmw/bz51P286dTpsPnU/bDp1LG09Yz5oP2M+cD9jOnA6aD5wP2g6cCxnPXFvKGYsZCxlLHIsbikseD1xbyh5LG0sZSxyLG4pO2xldCB2PXQucHJldlosYj10Lm5leHRaO2Zvcig7diYmdi56Pj1nJiZiJiZiLno8PXg7KXtpZih2Lng+PWYmJnYueDw9eSYmdi55Pj1kJiZ2Lnk8PW0mJnYhPT1pJiZ2IT09YSYmWm8obyxjLGwsaCx1LHAsdi54LHYueSkmJktvKHYucHJldix2LHYubmV4dCk+PTApcmV0dXJuICExO2lmKHY9di5wcmV2WixiLng+PWYmJmIueDw9eSYmYi55Pj1kJiZiLnk8PW0mJmIhPT1pJiZiIT09YSYmWm8obyxjLGwsaCx1LHAsYi54LGIueSkmJktvKGIucHJldixiLGIubmV4dCk+PTApcmV0dXJuICExO2I9Yi5uZXh0Wjt9Zm9yKDt2JiZ2Lno+PWc7KXtpZih2Lng+PWYmJnYueDw9eSYmdi55Pj1kJiZ2Lnk8PW0mJnYhPT1pJiZ2IT09YSYmWm8obyxjLGwsaCx1LHAsdi54LHYueSkmJktvKHYucHJldix2LHYubmV4dCk+PTApcmV0dXJuICExO3Y9di5wcmV2Wjt9Zm9yKDtiJiZiLno8PXg7KXtpZihiLng+PWYmJmIueDw9eSYmYi55Pj1kJiZiLnk8PW0mJmIhPT1pJiZiIT09YSYmWm8obyxjLGwsaCx1LHAsYi54LGIueSkmJktvKGIucHJldixiLGIubmV4dCk+PTApcmV0dXJuICExO2I9Yi5uZXh0Wjt9cmV0dXJuICEwfWZ1bmN0aW9uIERvKHQsZSl7bGV0IHI9dDtkb3tjb25zdCBuPXIucHJldixpPXIubmV4dC5uZXh0OyFYbyhuLGkpJiZIbyhuLHIsci5uZXh0LGkpJiZXbyhuLGkpJiZXbyhpLG4pJiYoZS5wdXNoKG4uaSxyLmksaS5pKSxlbChyKSxlbChyLm5leHQpLHI9dD1pKSxyPXIubmV4dDt9d2hpbGUociE9PXQpO3JldHVybiBGbyhyKX1mdW5jdGlvbiBPbyh0LGUscixuLGkscyl7bGV0IGE9dDtkb3tsZXQgdD1hLm5leHQubmV4dDtmb3IoO3QhPT1hLnByZXY7KXtpZihhLmkhPT10LmkmJkdvKGEsdCkpe2xldCBvPVFvKGEsdCk7cmV0dXJuIGE9Rm8oYSxhLm5leHQpLG89Rm8obyxvLm5leHQpLFRvKGEsZSxyLG4saSxzLDApLHZvaWQgVG8obyxlLHIsbixpLHMsMCl9dD10Lm5leHQ7fWE9YS5uZXh0O313aGlsZShhIT09dCl9ZnVuY3Rpb24gam8odCxlKXtyZXR1cm4gdC54LWUueH1mdW5jdGlvbiBSbyh0LGUpe2NvbnN0IHI9ZnVuY3Rpb24odCxlKXtsZXQgcj1lO2NvbnN0IG49dC54LGk9dC55O2xldCBzLGE9LTEvMDtkb3tpZihpPD1yLnkmJmk+PXIubmV4dC55JiZyLm5leHQueSE9PXIueSl7Y29uc3QgdD1yLngrKGktci55KSooci5uZXh0Lngtci54KS8oci5uZXh0Lnktci55KTtpZih0PD1uJiZ0PmEmJihhPXQscz1yLng8ci5uZXh0Lng/cjpyLm5leHQsdD09PW4pKXJldHVybiBzfXI9ci5uZXh0O313aGlsZShyIT09ZSk7aWYoIXMpcmV0dXJuIG51bGw7Y29uc3Qgbz1zLGw9cy54LHU9cy55O2xldCBjPTEvMDtyPXM7ZG97aWYobj49ci54JiZyLng+PWwmJm4hPT1yLngmJlpvKGk8dT9uOmEsaSxsLHUsaTx1P2E6bixpLHIueCxyLnkpKXtjb25zdCBlPU1hdGguYWJzKGktci55KS8obi1yLngpO1dvKHIsdCkmJihlPGN8fGU9PT1jJiYoci54PnMueHx8ci54PT09cy54JiZVbyhzLHIpKSkmJihzPXIsYz1lKTt9cj1yLm5leHQ7fXdoaWxlKHIhPT1vKTtyZXR1cm4gc30odCxlKTtpZighcilyZXR1cm4gZTtjb25zdCBuPVFvKHIsdCk7cmV0dXJuIEZvKG4sbi5uZXh0KSxGbyhyLHIubmV4dCl9ZnVuY3Rpb24gVW8odCxlKXtyZXR1cm4gS28odC5wcmV2LHQsZS5wcmV2KTwwJiZLbyhlLm5leHQsdCx0Lm5leHQpPDB9ZnVuY3Rpb24gcW8odCxlLHIsbixpKXtyZXR1cm4gKHQ9MTQzMTY1NTc2NSYoKHQ9ODU4OTkzNDU5JigodD0yNTI2NDUxMzUmKCh0PTE2NzExOTM1JigodD0odC1yKSppfDApfHQ8PDgpKXx0PDw0KSl8dDw8MikpfHQ8PDEpKXwoZT0xNDMxNjU1NzY1JigoZT04NTg5OTM0NTkmKChlPTI1MjY0NTEzNSYoKGU9MTY3MTE5MzUmKChlPShlLW4pKml8MCl8ZTw8OCkpfGU8PDQpKXxlPDwyKSl8ZTw8MSkpPDwxfWZ1bmN0aW9uIE5vKHQpe2xldCBlPXQscj10O2RveyhlLng8ci54fHxlLng9PT1yLngmJmUueTxyLnkpJiYocj1lKSxlPWUubmV4dDt9d2hpbGUoZSE9PXQpO3JldHVybiByfWZ1bmN0aW9uIFpvKHQsZSxyLG4saSxzLGEsbyl7cmV0dXJuIChpLWEpKihlLW8pPj0odC1hKSoocy1vKSYmKHQtYSkqKG4tbyk+PShyLWEpKihlLW8pJiYoci1hKSoocy1vKT49KGktYSkqKG4tbyl9ZnVuY3Rpb24gR28odCxlKXtyZXR1cm4gdC5uZXh0LmkhPT1lLmkmJnQucHJldi5pIT09ZS5pJiYhZnVuY3Rpb24odCxlKXtsZXQgcj10O2Rve2lmKHIuaSE9PXQuaSYmci5uZXh0LmkhPT10LmkmJnIuaSE9PWUuaSYmci5uZXh0LmkhPT1lLmkmJkhvKHIsci5uZXh0LHQsZSkpcmV0dXJuICEwO3I9ci5uZXh0O313aGlsZShyIT09dCk7cmV0dXJuICExfSh0LGUpJiYoV28odCxlKSYmV28oZSx0KSYmZnVuY3Rpb24odCxlKXtsZXQgcj10LG49ITE7Y29uc3QgaT0odC54K2UueCkvMixzPSh0LnkrZS55KS8yO2Rve3IueT5zIT1yLm5leHQueT5zJiZyLm5leHQueSE9PXIueSYmaTwoci5uZXh0Lngtci54KSoocy1yLnkpLyhyLm5leHQueS1yLnkpK3IueCYmKG49IW4pLHI9ci5uZXh0O313aGlsZShyIT09dCk7cmV0dXJuIG59KHQsZSkmJihLbyh0LnByZXYsdCxlLnByZXYpfHxLbyh0LGUucHJldixlKSl8fFhvKHQsZSkmJktvKHQucHJldix0LHQubmV4dCk+MCYmS28oZS5wcmV2LGUsZS5uZXh0KT4wKX1mdW5jdGlvbiBLbyh0LGUscil7cmV0dXJuIChlLnktdC55KSooci54LWUueCktKGUueC10LngpKihyLnktZS55KX1mdW5jdGlvbiBYbyh0LGUpe3JldHVybiB0Lng9PT1lLngmJnQueT09PWUueX1mdW5jdGlvbiBIbyh0LGUscixuKXtjb25zdCBpPUpvKEtvKHQsZSxyKSkscz1KbyhLbyh0LGUsbikpLGE9Sm8oS28ocixuLHQpKSxvPUpvKEtvKHIsbixlKSk7cmV0dXJuIGkhPT1zJiZhIT09b3x8ISgwIT09aXx8IVlvKHQscixlKSl8fCEoMCE9PXN8fCFZbyh0LG4sZSkpfHwhKDAhPT1hfHwhWW8ocix0LG4pKXx8ISgwIT09b3x8IVlvKHIsZSxuKSl9ZnVuY3Rpb24gWW8odCxlLHIpe3JldHVybiBlLng8PU1hdGgubWF4KHQueCxyLngpJiZlLng+PU1hdGgubWluKHQueCxyLngpJiZlLnk8PU1hdGgubWF4KHQueSxyLnkpJiZlLnk+PU1hdGgubWluKHQueSxyLnkpfWZ1bmN0aW9uIEpvKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH1mdW5jdGlvbiBXbyh0LGUpe3JldHVybiBLbyh0LnByZXYsdCx0Lm5leHQpPDA/S28odCxlLHQubmV4dCk+PTAmJktvKHQsdC5wcmV2LGUpPj0wOktvKHQsZSx0LnByZXYpPDB8fEtvKHQsdC5uZXh0LGUpPDB9ZnVuY3Rpb24gUW8odCxlKXtjb25zdCByPXJsKHQuaSx0LngsdC55KSxuPXJsKGUuaSxlLngsZS55KSxpPXQubmV4dCxzPWUucHJldjtyZXR1cm4gdC5uZXh0PWUsZS5wcmV2PXQsci5uZXh0PWksaS5wcmV2PXIsbi5uZXh0PXIsci5wcmV2PW4scy5uZXh0PW4sbi5wcmV2PXMsbn1mdW5jdGlvbiB0bCh0LGUscixuKXtjb25zdCBpPXJsKHQsZSxyKTtyZXR1cm4gbj8oaS5uZXh0PW4ubmV4dCxpLnByZXY9bixuLm5leHQucHJldj1pLG4ubmV4dD1pKTooaS5wcmV2PWksaS5uZXh0PWkpLGl9ZnVuY3Rpb24gZWwodCl7dC5uZXh0LnByZXY9dC5wcmV2LHQucHJldi5uZXh0PXQubmV4dCx0LnByZXZaJiYodC5wcmV2Wi5uZXh0Wj10Lm5leHRaKSx0Lm5leHRaJiYodC5uZXh0Wi5wcmV2Wj10LnByZXZaKTt9ZnVuY3Rpb24gcmwodCxlLHIpe3JldHVybiB7aTp0LHg6ZSx5OnIscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIG5sKHQsZSxyKXtjb25zdCBuPXIucGF0dGVybkRlcGVuZGVuY2llcztsZXQgaT0hMTtmb3IoY29uc3QgciBvZiBlKXtjb25zdCBlPXIucGFpbnQuZ2V0KGAke3R9LXBhdHRlcm5gKTtlLmlzQ29uc3RhbnQoKXx8KGk9ITApO2NvbnN0IHM9ZS5jb25zdGFudE9yKG51bGwpO3MmJihpPSEwLG5bcy50b109ITAsbltzLmZyb21dPSEwKTt9cmV0dXJuIGl9ZnVuY3Rpb24gaWwodCxlLHIsbixpKXtjb25zdCBzPWkucGF0dGVybkRlcGVuZGVuY2llcztmb3IoY29uc3QgYSBvZiBlKXtjb25zdCBlPWEucGFpbnQuZ2V0KGAke3R9LXBhdHRlcm5gKS52YWx1ZTtpZihcImNvbnN0YW50XCIhPT1lLmtpbmQpe2xldCB0PWUuZXZhbHVhdGUoe3pvb206bi0xfSxyLHt9LGkuYXZhaWxhYmxlSW1hZ2VzKSxvPWUuZXZhbHVhdGUoe3pvb206bn0scix7fSxpLmF2YWlsYWJsZUltYWdlcyksbD1lLmV2YWx1YXRlKHt6b29tOm4rMX0scix7fSxpLmF2YWlsYWJsZUltYWdlcyk7dD10JiZ0Lm5hbWU/dC5uYW1lOnQsbz1vJiZvLm5hbWU/by5uYW1lOm8sbD1sJiZsLm5hbWU/bC5uYW1lOmwsc1t0XT0hMCxzW29dPSEwLHNbbF09ITAsci5wYXR0ZXJuc1thLmlkXT17bWluOnQsbWlkOm8sbWF4Omx9O319cmV0dXJuIHJ9Y2xhc3Mgc2x7Y29uc3RydWN0b3IodCl7dGhpcy56b29tPXQuem9vbSx0aGlzLm92ZXJzY2FsaW5nPXQub3ZlcnNjYWxpbmcsdGhpcy5sYXllcnM9dC5sYXllcnMsdGhpcy5sYXllcklkcz10aGlzLmxheWVycy5tYXAoKHQ9PnQuaWQpKSx0aGlzLmluZGV4PXQuaW5kZXgsdGhpcy5oYXNQYXR0ZXJuPSExLHRoaXMucGF0dGVybkZlYXR1cmVzPVtdLHRoaXMubGF5b3V0VmVydGV4QXJyYXk9bmV3IEtzLHRoaXMuaW5kZXhBcnJheT1uZXcgbmEsdGhpcy5pbmRleEFycmF5Mj1uZXcgaWEsdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnM9bmV3IEVhKHQubGF5ZXJzLHQuem9vbSksdGhpcy5zZWdtZW50cz1uZXcgb2EsdGhpcy5zZWdtZW50czI9bmV3IG9hLHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcz10aGlzLmxheWVycy5maWx0ZXIoKHQ9PnQuaXNTdGF0ZURlcGVuZGVudCgpKSkubWFwKCh0PT50LmlkKSk7fXBvcHVsYXRlKHQsZSxyKXt0aGlzLmhhc1BhdHRlcm49bmwoXCJmaWxsXCIsdGhpcy5sYXllcnMsZSk7Y29uc3Qgbj10aGlzLmxheWVyc1swXS5sYXlvdXQuZ2V0KFwiZmlsbC1zb3J0LWtleVwiKSxpPSFuLmlzQ29uc3RhbnQoKSxzPVtdO2Zvcihjb25zdHtmZWF0dXJlOmEsaWQ6byxpbmRleDpsLHNvdXJjZUxheWVySW5kZXg6dX1vZiB0KXtjb25zdCB0PXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeSxjPWphKGEsdCk7aWYoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgVWkodGhpcy56b29tKSxjLHIpKWNvbnRpbnVlO2NvbnN0IGg9aT9uLmV2YWx1YXRlKGMse30scixlLmF2YWlsYWJsZUltYWdlcyk6dm9pZCAwLHA9e2lkOm8scHJvcGVydGllczphLnByb3BlcnRpZXMsdHlwZTphLnR5cGUsc291cmNlTGF5ZXJJbmRleDp1LGluZGV4OmwsZ2VvbWV0cnk6dD9jLmdlb21ldHJ5Ok9hKGEpLHBhdHRlcm5zOnt9LHNvcnRLZXk6aH07cy5wdXNoKHApO31pJiZzLnNvcnQoKCh0LGUpPT50LnNvcnRLZXktZS5zb3J0S2V5KSk7Zm9yKGNvbnN0IG4gb2Ygcyl7Y29uc3R7Z2VvbWV0cnk6aSxpbmRleDpzLHNvdXJjZUxheWVySW5kZXg6YX09bjtpZih0aGlzLmhhc1BhdHRlcm4pe2NvbnN0IHQ9aWwoXCJmaWxsXCIsdGhpcy5sYXllcnMsbix0aGlzLnpvb20sZSk7dGhpcy5wYXR0ZXJuRmVhdHVyZXMucHVzaCh0KTt9ZWxzZSB0aGlzLmFkZEZlYXR1cmUobixpLHMscix7fSk7ZS5mZWF0dXJlSW5kZXguaW5zZXJ0KHRbc10uZmVhdHVyZSxpLHMsYSx0aGlzLmluZGV4KTt9fXVwZGF0ZSh0LGUscil7dGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgmJnRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHQsZSx0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLHIpO31hZGRGZWF0dXJlcyh0LGUscil7Zm9yKGNvbnN0IHQgb2YgdGhpcy5wYXR0ZXJuRmVhdHVyZXMpdGhpcy5hZGRGZWF0dXJlKHQsdC5nZW9tZXRyeSx0LmluZGV4LGUscik7fWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RofXVwbG9hZFBlbmRpbmcoKXtyZXR1cm4gIXRoaXMudXBsb2FkZWR8fHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkfXVwbG9hZCh0KXt0aGlzLnVwbG9hZGVkfHwodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSxCbyksdGhpcy5pbmRleEJ1ZmZlcj10LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSksdGhpcy5pbmRleEJ1ZmZlcjI9dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkyKSksdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKHQpLHRoaXMudXBsb2FkZWQ9ITA7fWRlc3Ryb3koKXt0aGlzLmxheW91dFZlcnRleEJ1ZmZlciYmKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLmluZGV4QnVmZmVyMi5kZXN0cm95KCksdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpLHRoaXMuc2VnbWVudHMuZGVzdHJveSgpLHRoaXMuc2VnbWVudHMyLmRlc3Ryb3koKSk7fWFkZEZlYXR1cmUodCxlLHIsbixpKXtmb3IoY29uc3QgdCBvZiB4cihlLDUwMCkpe2xldCBlPTA7Zm9yKGNvbnN0IHIgb2YgdCllKz1yLmxlbmd0aDtjb25zdCByPXRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoZSx0aGlzLmxheW91dFZlcnRleEFycmF5LHRoaXMuaW5kZXhBcnJheSksbj1yLnZlcnRleExlbmd0aCxpPVtdLHM9W107Zm9yKGNvbnN0IGUgb2YgdCl7aWYoMD09PWUubGVuZ3RoKWNvbnRpbnVlO2UhPT10WzBdJiZzLnB1c2goaS5sZW5ndGgvMik7Y29uc3Qgcj10aGlzLnNlZ21lbnRzMi5wcmVwYXJlU2VnbWVudChlLmxlbmd0aCx0aGlzLmxheW91dFZlcnRleEFycmF5LHRoaXMuaW5kZXhBcnJheTIpLG49ci52ZXJ0ZXhMZW5ndGg7dGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhlWzBdLngsZVswXS55KSx0aGlzLmluZGV4QXJyYXkyLmVtcGxhY2VCYWNrKG4rZS5sZW5ndGgtMSxuKSxpLnB1c2goZVswXS54KSxpLnB1c2goZVswXS55KTtmb3IobGV0IHQ9MTt0PGUubGVuZ3RoO3QrKyl0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKGVbdF0ueCxlW3RdLnkpLHRoaXMuaW5kZXhBcnJheTIuZW1wbGFjZUJhY2sobit0LTEsbit0KSxpLnB1c2goZVt0XS54KSxpLnB1c2goZVt0XS55KTtyLnZlcnRleExlbmd0aCs9ZS5sZW5ndGgsci5wcmltaXRpdmVMZW5ndGgrPWUubGVuZ3RoO31jb25zdCBhPVZvKGkscyk7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDt0Kz0zKXRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhuK2FbdF0sbithW3QrMV0sbithW3QrMl0pO3IudmVydGV4TGVuZ3RoKz1lLHIucHJpbWl0aXZlTGVuZ3RoKz1hLmxlbmd0aC8zO310aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLHQscixpLG4pO319bGV0IGFsLG9sO3dpKFwiRmlsbEJ1Y2tldFwiLHNsLHtvbWl0OltcImxheWVyc1wiLFwicGF0dGVybkZlYXR1cmVzXCJdfSk7dmFyIGxsPXtnZXQgcGFpbnQoKXtyZXR1cm4gb2w9b2x8fG5ldyBycyh7XCJmaWxsLWFudGlhbGlhc1wiOm5ldyBKaShHLnBhaW50X2ZpbGxbXCJmaWxsLWFudGlhbGlhc1wiXSksXCJmaWxsLW9wYWNpdHlcIjpuZXcgV2koRy5wYWludF9maWxsW1wiZmlsbC1vcGFjaXR5XCJdKSxcImZpbGwtY29sb3JcIjpuZXcgV2koRy5wYWludF9maWxsW1wiZmlsbC1jb2xvclwiXSksXCJmaWxsLW91dGxpbmUtY29sb3JcIjpuZXcgV2koRy5wYWludF9maWxsW1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdKSxcImZpbGwtdHJhbnNsYXRlXCI6bmV3IEppKEcucGFpbnRfZmlsbFtcImZpbGwtdHJhbnNsYXRlXCJdKSxcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOm5ldyBKaShHLnBhaW50X2ZpbGxbXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFwiZmlsbC1wYXR0ZXJuXCI6bmV3IFFpKEcucGFpbnRfZmlsbFtcImZpbGwtcGF0dGVyblwiXSl9KX0sZ2V0IGxheW91dCgpe3JldHVybiBhbD1hbHx8bmV3IHJzKHtcImZpbGwtc29ydC1rZXlcIjpuZXcgV2koRy5sYXlvdXRfZmlsbFtcImZpbGwtc29ydC1rZXlcIl0pfSl9fTtjbGFzcyB1bCBleHRlbmRzIGlze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsbGwpO31yZWNhbGN1bGF0ZSh0LGUpe3N1cGVyLnJlY2FsY3VsYXRlKHQsZSk7Y29uc3Qgcj10aGlzLnBhaW50Ll92YWx1ZXNbXCJmaWxsLW91dGxpbmUtY29sb3JcIl07XCJjb25zdGFudFwiPT09ci52YWx1ZS5raW5kJiZ2b2lkIDA9PT1yLnZhbHVlLnZhbHVlJiYodGhpcy5wYWludC5fdmFsdWVzW1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdPXRoaXMucGFpbnQuX3ZhbHVlc1tcImZpbGwtY29sb3JcIl0pO31jcmVhdGVCdWNrZXQodCl7cmV0dXJuIG5ldyBzbCh0KX1xdWVyeVJhZGl1cygpe3JldHVybiBlbyh0aGlzLnBhaW50LmdldChcImZpbGwtdHJhbnNsYXRlXCIpKX1xdWVyeUludGVyc2VjdHNGZWF0dXJlKHQsZSxyLG4saSxzLGEpe3JldHVybiBaYShybyh0LHRoaXMucGFpbnQuZ2V0KFwiZmlsbC10cmFuc2xhdGVcIiksdGhpcy5wYWludC5nZXQoXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIikscy5hbmdsZSxhKSxuKX1pc1RpbGVDbGlwcGVkKCl7cmV0dXJuICEwfX1jb25zdCBjbD1scyhbe25hbWU6XCJhX3Bvc1wiLGNvbXBvbmVudHM6Mix0eXBlOlwiSW50MTZcIn0se25hbWU6XCJhX25vcm1hbF9lZFwiLGNvbXBvbmVudHM6NCx0eXBlOlwiSW50MTZcIn1dLDQpLGhsPWxzKFt7bmFtZTpcImFfY2VudHJvaWRcIixjb21wb25lbnRzOjIsdHlwZTpcIkludDE2XCJ9XSw0KSx7bWVtYmVyczpwbH09Y2w7dmFyIGZsPXt9LGRsPW4seWw9bWw7ZnVuY3Rpb24gbWwodCxlLHIsbixpKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9cix0aGlzLnR5cGU9MCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPW4sdGhpcy5fdmFsdWVzPWksdC5yZWFkRmllbGRzKGdsLHRoaXMsZSk7fWZ1bmN0aW9uIGdsKHQsZSxyKXsxPT10P2UuaWQ9ci5yZWFkVmFyaW50KCk6Mj09dD9mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxyOyl7dmFyIG49ZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0saT1lLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO2UucHJvcGVydGllc1tuXT1pO319KHIsZSk6Mz09dD9lLnR5cGU9ci5yZWFkVmFyaW50KCk6ND09dCYmKGUuX2dlb21ldHJ5PXIucG9zKTt9ZnVuY3Rpb24geGwodCl7Zm9yKHZhciBlLHIsbj0wLGk9MCxzPXQubGVuZ3RoLGE9cy0xO2k8czthPWkrKyluKz0oKHI9dFthXSkueC0oZT10W2ldKS54KSooZS55K3IueSk7cmV0dXJuIG59bWwudHlwZXM9W1wiVW5rbm93blwiLFwiUG9pbnRcIixcIkxpbmVTdHJpbmdcIixcIlBvbHlnb25cIl0sbWwucHJvdG90eXBlLmxvYWRHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIGUscj10LnJlYWRWYXJpbnQoKSt0LnBvcyxuPTEsaT0wLHM9MCxhPTAsbz1bXTt0LnBvczxyOyl7aWYoaTw9MCl7dmFyIGw9dC5yZWFkVmFyaW50KCk7bj03JmwsaT1sPj4zO31pZihpLS0sMT09PW58fDI9PT1uKXMrPXQucmVhZFNWYXJpbnQoKSxhKz10LnJlYWRTVmFyaW50KCksMT09PW4mJihlJiZvLnB1c2goZSksZT1bXSksZS5wdXNoKG5ldyBkbChzLGEpKTtlbHNlIHtpZig3IT09bil0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGNvbW1hbmQgXCIrbik7ZSYmZS5wdXNoKGVbMF0uY2xvbmUoKSk7fX1yZXR1cm4gZSYmby5wdXNoKGUpLG99LG1sLnByb3RvdHlwZS5iYm94PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcGJmO3QucG9zPXRoaXMuX2dlb21ldHJ5O2Zvcih2YXIgZT10LnJlYWRWYXJpbnQoKSt0LnBvcyxyPTEsbj0wLGk9MCxzPTAsYT0xLzAsbz0tMS8wLGw9MS8wLHU9LTEvMDt0LnBvczxlOyl7aWYobjw9MCl7dmFyIGM9dC5yZWFkVmFyaW50KCk7cj03JmMsbj1jPj4zO31pZihuLS0sMT09PXJ8fDI9PT1yKShpKz10LnJlYWRTVmFyaW50KCkpPGEmJihhPWkpLGk+byYmKG89aSksKHMrPXQucmVhZFNWYXJpbnQoKSk8bCYmKGw9cykscz51JiYodT1zKTtlbHNlIGlmKDchPT1yKXRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIityKX1yZXR1cm4gW2EsbCxvLHVdfSxtbC5wcm90b3R5cGUudG9HZW9KU09OPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpLHM9dGhpcy5leHRlbnQqTWF0aC5wb3coMixyKSxhPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLGw9dGhpcy5sb2FkR2VvbWV0cnkoKSx1PW1sLnR5cGVzW3RoaXMudHlwZV07ZnVuY3Rpb24gYyh0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIHI9dFtlXTt0W2VdPVszNjAqKHIueCthKS9zLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoKDE4MC0zNjAqKHIueStvKS9zKSpNYXRoLlBJLzE4MCkpLTkwXTt9fXN3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgMTp2YXIgaD1bXTtmb3Iobj0wO248bC5sZW5ndGg7bisrKWhbbl09bFtuXVswXTtjKGw9aCk7YnJlYWs7Y2FzZSAyOmZvcihuPTA7bjxsLmxlbmd0aDtuKyspYyhsW25dKTticmVhaztjYXNlIDM6Zm9yKGw9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9MSlyZXR1cm4gW3RdO2Zvcih2YXIgcixuLGk9W10scz0wO3M8ZTtzKyspe3ZhciBhPXhsKHRbc10pOzAhPT1hJiYodm9pZCAwPT09biYmKG49YTwwKSxuPT09YTwwPyhyJiZpLnB1c2gocikscj1bdFtzXV0pOnIucHVzaCh0W3NdKSk7fXJldHVybiByJiZpLnB1c2gociksaX0obCksbj0wO248bC5sZW5ndGg7bisrKWZvcihpPTA7aTxsW25dLmxlbmd0aDtpKyspYyhsW25dW2ldKTt9MT09PWwubGVuZ3RoP2w9bFswXTp1PVwiTXVsdGlcIit1O3ZhciBwPXt0eXBlOlwiRmVhdHVyZVwiLGdlb21ldHJ5Ont0eXBlOnUsY29vcmRpbmF0ZXM6bH0scHJvcGVydGllczp0aGlzLnByb3BlcnRpZXN9O3JldHVybiBcImlkXCJpbiB0aGlzJiYocC5pZD10aGlzLmlkKSxwfTt2YXIgdmw9eWwsYmw9d2w7ZnVuY3Rpb24gd2wodCxlKXt0aGlzLnZlcnNpb249MSx0aGlzLm5hbWU9bnVsbCx0aGlzLmV4dGVudD00MDk2LHRoaXMubGVuZ3RoPTAsdGhpcy5fcGJmPXQsdGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fZmVhdHVyZXM9W10sdC5yZWFkRmllbGRzKF9sLHRoaXMsZSksdGhpcy5sZW5ndGg9dGhpcy5fZmVhdHVyZXMubGVuZ3RoO31mdW5jdGlvbiBfbCh0LGUscil7MTU9PT10P2UudmVyc2lvbj1yLnJlYWRWYXJpbnQoKToxPT09dD9lLm5hbWU9ci5yZWFkU3RyaW5nKCk6NT09PXQ/ZS5leHRlbnQ9ci5yZWFkVmFyaW50KCk6Mj09PXQ/ZS5fZmVhdHVyZXMucHVzaChyLnBvcyk6Mz09PXQ/ZS5fa2V5cy5wdXNoKHIucmVhZFN0cmluZygpKTo0PT09dCYmZS5fdmFsdWVzLnB1c2goZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwscj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxyOyl7dmFyIG49dC5yZWFkVmFyaW50KCk+PjM7ZT0xPT09bj90LnJlYWRTdHJpbmcoKToyPT09bj90LnJlYWRGbG9hdCgpOjM9PT1uP3QucmVhZERvdWJsZSgpOjQ9PT1uP3QucmVhZFZhcmludDY0KCk6NT09PW4/dC5yZWFkVmFyaW50KCk6Nj09PW4/dC5yZWFkU1ZhcmludCgpOjc9PT1uP3QucmVhZEJvb2xlYW4oKTpudWxsO31yZXR1cm4gZX0ocikpO313bC5wcm90b3R5cGUuZmVhdHVyZT1mdW5jdGlvbih0KXtpZih0PDB8fHQ+PXRoaXMuX2ZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHNcIik7dGhpcy5fcGJmLnBvcz10aGlzLl9mZWF0dXJlc1t0XTt2YXIgZT10aGlzLl9wYmYucmVhZFZhcmludCgpK3RoaXMuX3BiZi5wb3M7cmV0dXJuIG5ldyB2bCh0aGlzLl9wYmYsZSx0aGlzLmV4dGVudCx0aGlzLl9rZXlzLHRoaXMuX3ZhbHVlcyl9O3ZhciBBbD1ibDtmdW5jdGlvbiBTbCh0LGUscil7aWYoMz09PXQpe3ZhciBuPW5ldyBBbChyLHIucmVhZFZhcmludCgpK3IucG9zKTtuLmxlbmd0aCYmKGVbbi5uYW1lXT1uKTt9fWZsLlZlY3RvclRpbGU9ZnVuY3Rpb24odCxlKXt0aGlzLmxheWVycz10LnJlYWRGaWVsZHMoU2wse30sZSk7fSxmbC5WZWN0b3JUaWxlRmVhdHVyZT15bCxmbC5WZWN0b3JUaWxlTGF5ZXI9Ymw7Y29uc3Qga2w9ZmwuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMsTWw9TWF0aC5wb3coMiwxMyk7ZnVuY3Rpb24gSWwodCxlLHIsbixpLHMsYSxvKXt0LmVtcGxhY2VCYWNrKGUsciwyKk1hdGguZmxvb3IobipNbCkrYSxpKk1sKjIscypNbCoyLE1hdGgucm91bmQobykpO31jbGFzcyB6bHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnpvb209dC56b29tLHRoaXMub3ZlcnNjYWxpbmc9dC5vdmVyc2NhbGluZyx0aGlzLmxheWVycz10LmxheWVycyx0aGlzLmxheWVySWRzPXRoaXMubGF5ZXJzLm1hcCgodD0+dC5pZCkpLHRoaXMuaW5kZXg9dC5pbmRleCx0aGlzLmhhc1BhdHRlcm49ITEsdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheT1uZXcgWHMsdGhpcy5jZW50cm9pZFZlcnRleEFycmF5PW5ldyBacyx0aGlzLmluZGV4QXJyYXk9bmV3IG5hLHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zPW5ldyBFYSh0LmxheWVycyx0Lnpvb20pLHRoaXMuc2VnbWVudHM9bmV3IG9hLHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcz10aGlzLmxheWVycy5maWx0ZXIoKHQ9PnQuaXNTdGF0ZURlcGVuZGVudCgpKSkubWFwKCh0PT50LmlkKSk7fXBvcHVsYXRlKHQsZSxyKXt0aGlzLmZlYXR1cmVzPVtdLHRoaXMuaGFzUGF0dGVybj1ubChcImZpbGwtZXh0cnVzaW9uXCIsdGhpcy5sYXllcnMsZSk7Zm9yKGNvbnN0e2ZlYXR1cmU6bixpZDppLGluZGV4OnMsc291cmNlTGF5ZXJJbmRleDphfW9mIHQpe2NvbnN0IHQ9dGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5LG89amEobix0KTtpZighdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyBVaSh0aGlzLnpvb20pLG8scikpY29udGludWU7Y29uc3QgbD17aWQ6aSxzb3VyY2VMYXllckluZGV4OmEsaW5kZXg6cyxnZW9tZXRyeTp0P28uZ2VvbWV0cnk6T2EobikscHJvcGVydGllczpuLnByb3BlcnRpZXMsdHlwZTpuLnR5cGUscGF0dGVybnM6e319O3RoaXMuaGFzUGF0dGVybj90aGlzLmZlYXR1cmVzLnB1c2goaWwoXCJmaWxsLWV4dHJ1c2lvblwiLHRoaXMubGF5ZXJzLGwsdGhpcy56b29tLGUpKTp0aGlzLmFkZEZlYXR1cmUobCxsLmdlb21ldHJ5LHMscix7fSksZS5mZWF0dXJlSW5kZXguaW5zZXJ0KG4sbC5nZW9tZXRyeSxzLGEsdGhpcy5pbmRleCwhMCk7fX1hZGRGZWF0dXJlcyh0LGUscil7Zm9yKGNvbnN0IHQgb2YgdGhpcy5mZWF0dXJlcyl7Y29uc3R7Z2VvbWV0cnk6bn09dDt0aGlzLmFkZEZlYXR1cmUodCxuLHQuaW5kZXgsZSxyKTt9fXVwZGF0ZSh0LGUscil7dGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgmJnRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHQsZSx0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLHIpO31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCYmMD09PXRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGh9dXBsb2FkUGVuZGluZygpe3JldHVybiAhdGhpcy51cGxvYWRlZHx8dGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWR9dXBsb2FkKHQpe3RoaXMudXBsb2FkZWR8fCh0aGlzLmxheW91dFZlcnRleEJ1ZmZlcj10LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LHBsKSx0aGlzLmNlbnRyb2lkVmVydGV4QnVmZmVyPXQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheSxobC5tZW1iZXJzLCEwKSx0aGlzLmluZGV4QnVmZmVyPXQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KSksdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKHQpLHRoaXMudXBsb2FkZWQ9ITA7fWRlc3Ryb3koKXt0aGlzLmxheW91dFZlcnRleEJ1ZmZlciYmKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCksdGhpcy5zZWdtZW50cy5kZXN0cm95KCksdGhpcy5jZW50cm9pZFZlcnRleEJ1ZmZlci5kZXN0cm95KCkpO31hZGRGZWF0dXJlKHQsZSxyLG4saSl7Zm9yKGNvbnN0IHIgb2YgeHIoZSw1MDApKXtjb25zdCBlPXt4OjAseTowLHZlcnRleENvdW50OjB9O2xldCBuPTA7Zm9yKGNvbnN0IHQgb2YgciluKz10Lmxlbmd0aDtsZXQgaT10aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSx0aGlzLmluZGV4QXJyYXkpO2Zvcihjb25zdCB0IG9mIHIpe2lmKDA9PT10Lmxlbmd0aCljb250aW51ZTtpZihDbCh0KSljb250aW51ZTtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBzPXRbbl07aWYobj49MSl7Y29uc3QgYT10W24tMV07aWYoIVBsKHMsYSkpe2kudmVydGV4TGVuZ3RoKzQ+b2EuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgmJihpPXRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCx0aGlzLmxheW91dFZlcnRleEFycmF5LHRoaXMuaW5kZXhBcnJheSkpO2NvbnN0IHQ9cy5zdWIoYSkuX3BlcnAoKS5fdW5pdCgpLG49YS5kaXN0KHMpO3Irbj4zMjc2OCYmKHI9MCksSWwodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSxzLngscy55LHQueCx0LnksMCwwLHIpLElsKHRoaXMubGF5b3V0VmVydGV4QXJyYXkscy54LHMueSx0LngsdC55LDAsMSxyKSxlLngrPTIqcy54LGUueSs9MipzLnksZS52ZXJ0ZXhDb3VudCs9MixyKz1uLElsKHRoaXMubGF5b3V0VmVydGV4QXJyYXksYS54LGEueSx0LngsdC55LDAsMCxyKSxJbCh0aGlzLmxheW91dFZlcnRleEFycmF5LGEueCxhLnksdC54LHQueSwwLDEsciksZS54Kz0yKmEueCxlLnkrPTIqYS55LGUudmVydGV4Q291bnQrPTI7Y29uc3Qgbz1pLnZlcnRleExlbmd0aDt0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sobyxvKzIsbysxKSx0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sobysxLG8rMixvKzMpLGkudmVydGV4TGVuZ3RoKz00LGkucHJpbWl0aXZlTGVuZ3RoKz0yO319fX1pZihpLnZlcnRleExlbmd0aCtuPm9hLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIJiYoaT10aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KG4sdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSx0aGlzLmluZGV4QXJyYXkpKSxcIlBvbHlnb25cIiE9PWtsW3QudHlwZV0pY29udGludWU7Y29uc3Qgcz1bXSxhPVtdLG89aS52ZXJ0ZXhMZW5ndGg7Zm9yKGNvbnN0IHQgb2YgcilpZigwIT09dC5sZW5ndGgpe3QhPT1yWzBdJiZhLnB1c2gocy5sZW5ndGgvMik7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IG49dFtyXTtJbCh0aGlzLmxheW91dFZlcnRleEFycmF5LG4ueCxuLnksMCwwLDEsMSwwKSxlLngrPW4ueCxlLnkrPW4ueSxlLnZlcnRleENvdW50Kz0xLHMucHVzaChuLngpLHMucHVzaChuLnkpO319Y29uc3QgbD1WbyhzLGEpO2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7dCs9Myl0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sobytsW3RdLG8rbFt0KzJdLG8rbFt0KzFdKTtpLnByaW1pdGl2ZUxlbmd0aCs9bC5sZW5ndGgvMyxpLnZlcnRleExlbmd0aCs9bjtmb3IobGV0IHQ9MDt0PGUudmVydGV4Q291bnQ7dCsrKXtjb25zdCB0PU1hdGguZmxvb3IoZS54L2UudmVydGV4Q291bnQpLHI9TWF0aC5mbG9vcihlLnkvZS52ZXJ0ZXhDb3VudCk7dGhpcy5jZW50cm9pZFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHQscik7fX10aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLHQscixpLG4pO319ZnVuY3Rpb24gUGwodCxlKXtyZXR1cm4gdC54PT09ZS54JiYodC54PDB8fHQueD4kYSl8fHQueT09PWUueSYmKHQueTwwfHx0Lnk+JGEpfWZ1bmN0aW9uIENsKHQpe3JldHVybiB0LmV2ZXJ5KCh0PT50Lng8MCkpfHx0LmV2ZXJ5KCh0PT50Lng+JGEpKXx8dC5ldmVyeSgodD0+dC55PDApKXx8dC5ldmVyeSgodD0+dC55PiRhKSl9bGV0IEJsO3dpKFwiRmlsbEV4dHJ1c2lvbkJ1Y2tldFwiLHpsLHtvbWl0OltcImxheWVyc1wiLFwiZmVhdHVyZXNcIl19KTt2YXIgVmw9e2dldCBwYWludCgpe3JldHVybiBCbD1CbHx8bmV3IHJzKHtcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjpuZXcgSmkoR1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiXSksXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOm5ldyBXaShHW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiXSksXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIjpuZXcgSmkoR1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCJdKSxcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjpuZXcgSmkoR1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiXSksXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6bmV3IFFpKEdbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIl0pLFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCI6bmV3IFdpKEdbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiXSksXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6bmV3IFdpKEdbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWJhc2VcIl0pLFwiZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnRcIjpuZXcgSmkoR1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnRcIl0pfSl9fTtjbGFzcyBFbCBleHRlbmRzIGlze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsVmwpO31jcmVhdGVCdWNrZXQodCl7cmV0dXJuIG5ldyB6bCh0KX1xdWVyeVJhZGl1cygpe3JldHVybiBlbyh0aGlzLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiKSl9aXMzRCgpe3JldHVybiAhMH1xdWVyeUludGVyc2VjdHNGZWF0dXJlKHQsZSxyLG4saSxhLG8sbCl7Y29uc3QgdT1ybyh0LHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCIpLHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiKSxhLmFuZ2xlLG8pLGM9dGhpcy5wYWludC5nZXQoXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIikuZXZhbHVhdGUoZSxyKSxoPXRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tYmFzZVwiKS5ldmFsdWF0ZShlLHIpLHA9ZnVuY3Rpb24odCxlLHIsbil7Y29uc3QgaT1bXTtmb3IoY29uc3QgciBvZiB0KXtjb25zdCB0PVtyLngsci55LDAsMV07cG8odCx0LGUpLGkucHVzaChuZXcgcyh0WzBdL3RbM10sdFsxXS90WzNdKSk7fXJldHVybiBpfSh1LGwpLGY9ZnVuY3Rpb24odCxlLHIsbil7Y29uc3QgaT1bXSxhPVtdLG89bls4XSplLGw9bls5XSplLHU9blsxMF0qZSxjPW5bMTFdKmUsaD1uWzhdKnIscD1uWzldKnIsZj1uWzEwXSpyLGQ9blsxMV0qcjtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PVtdLHI9W107Zm9yKGNvbnN0IGkgb2YgZSl7Y29uc3QgZT1pLngsYT1pLnkseT1uWzBdKmUrbls0XSphK25bMTJdLG09blsxXSplK25bNV0qYStuWzEzXSxnPW5bMl0qZStuWzZdKmErblsxNF0seD1uWzNdKmUrbls3XSphK25bMTVdLHY9Zyt1LGI9eCtjLHc9eStoLF89bStwLEE9ZytmLFM9eCtkLGs9bmV3IHMoKHkrbykvYiwobStsKS9iKTtrLno9di9iLHQucHVzaChrKTtjb25zdCBNPW5ldyBzKHcvUyxfL1MpO00uej1BL1Msci5wdXNoKE0pO31pLnB1c2godCksYS5wdXNoKHIpO31yZXR1cm4gW2ksYV19KG4saCxjLGwpO3JldHVybiBmdW5jdGlvbih0LGUscil7bGV0IG49MS8wO1phKHIsZSkmJihuPVRsKHIsZVswXSkpO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtjb25zdCBzPWVbaV0sYT10W2ldO2ZvcihsZXQgdD0wO3Q8cy5sZW5ndGgtMTt0Kyspe2NvbnN0IGU9c1t0XSxpPVtlLHNbdCsxXSxhW3QrMV0sYVt0XSxlXTtxYShyLGkpJiYobj1NYXRoLm1pbihuLFRsKHIsaSkpKTt9fXJldHVybiBuIT09MS8wJiZufShmWzBdLGZbMV0scCl9fWZ1bmN0aW9uIEZsKHQsZSl7cmV0dXJuIHQueCplLngrdC55KmUueX1mdW5jdGlvbiBUbCh0LGUpe2lmKDE9PT10Lmxlbmd0aCl7bGV0IHI9MDtjb25zdCBuPWVbcisrXTtsZXQgaTtmb3IoOyFpfHxuLmVxdWFscyhpKTspaWYoaT1lW3IrK10sIWkpcmV0dXJuIDEvMDtmb3IoO3I8ZS5sZW5ndGg7cisrKXtjb25zdCBzPWVbcl0sYT10WzBdLG89aS5zdWIobiksbD1zLnN1YihuKSx1PWEuc3ViKG4pLGM9RmwobyxvKSxoPUZsKG8sbCkscD1GbChsLGwpLGY9RmwodSxvKSxkPUZsKHUsbCkseT1jKnAtaCpoLG09KHAqZi1oKmQpL3ksZz0oYypkLWgqZikveSx4PW4ueiooMS1tLWcpK2kueiptK3MueipnO2lmKGlzRmluaXRlKHgpKXJldHVybiB4fXJldHVybiAxLzB9e2xldCB0PTEvMDtmb3IoY29uc3QgciBvZiBlKXQ9TWF0aC5taW4odCxyLnopO3JldHVybiB0fX1jb25zdCAkbD1scyhbe25hbWU6XCJhX3Bvc19ub3JtYWxcIixjb21wb25lbnRzOjIsdHlwZTpcIkludDE2XCJ9LHtuYW1lOlwiYV9kYXRhXCIsY29tcG9uZW50czo0LHR5cGU6XCJVaW50OFwifV0sNCkse21lbWJlcnM6TGx9PSRsLERsPWxzKFt7bmFtZTpcImFfdXZfeFwiLGNvbXBvbmVudHM6MSx0eXBlOlwiRmxvYXQzMlwifSx7bmFtZTpcImFfc3BsaXRfaW5kZXhcIixjb21wb25lbnRzOjEsdHlwZTpcIkZsb2F0MzJcIn1dKSx7bWVtYmVyczpPbH09RGwsamw9ZmwuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMsUmw9TWF0aC5jb3MoTWF0aC5QSS8xODAqMzcuNSksVWw9TWF0aC5wb3coMiwxNCkvLjU7Y2xhc3MgcWx7Y29uc3RydWN0b3IodCl7dGhpcy56b29tPXQuem9vbSx0aGlzLm92ZXJzY2FsaW5nPXQub3ZlcnNjYWxpbmcsdGhpcy5sYXllcnM9dC5sYXllcnMsdGhpcy5sYXllcklkcz10aGlzLmxheWVycy5tYXAoKHQ9PnQuaWQpKSx0aGlzLmluZGV4PXQuaW5kZXgsdGhpcy5oYXNQYXR0ZXJuPSExLHRoaXMucGF0dGVybkZlYXR1cmVzPVtdLHRoaXMubGluZUNsaXBzQXJyYXk9W10sdGhpcy5ncmFkaWVudHM9e30sdGhpcy5sYXllcnMuZm9yRWFjaCgodD0+e3RoaXMuZ3JhZGllbnRzW3QuaWRdPXt9O30pKSx0aGlzLmxheW91dFZlcnRleEFycmF5PW5ldyBIcyx0aGlzLmxheW91dFZlcnRleEFycmF5Mj1uZXcgWXMsdGhpcy5pbmRleEFycmF5PW5ldyBuYSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucz1uZXcgRWEodC5sYXllcnMsdC56b29tKSx0aGlzLnNlZ21lbnRzPW5ldyBvYSx0aGlzLm1heExpbmVMZW5ndGg9MCx0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHM9dGhpcy5sYXllcnMuZmlsdGVyKCh0PT50LmlzU3RhdGVEZXBlbmRlbnQoKSkpLm1hcCgodD0+dC5pZCkpO31wb3B1bGF0ZSh0LGUscil7dGhpcy5oYXNQYXR0ZXJuPW5sKFwibGluZVwiLHRoaXMubGF5ZXJzLGUpO2NvbnN0IG49dGhpcy5sYXllcnNbMF0ubGF5b3V0LmdldChcImxpbmUtc29ydC1rZXlcIiksaT0hbi5pc0NvbnN0YW50KCkscz1bXTtmb3IoY29uc3R7ZmVhdHVyZTplLGlkOmEsaW5kZXg6byxzb3VyY2VMYXllckluZGV4Omx9b2YgdCl7Y29uc3QgdD10aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnksdT1qYShlLHQpO2lmKCF0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5maWx0ZXIobmV3IFVpKHRoaXMuem9vbSksdSxyKSljb250aW51ZTtjb25zdCBjPWk/bi5ldmFsdWF0ZSh1LHt9LHIpOnZvaWQgMCxoPXtpZDphLHByb3BlcnRpZXM6ZS5wcm9wZXJ0aWVzLHR5cGU6ZS50eXBlLHNvdXJjZUxheWVySW5kZXg6bCxpbmRleDpvLGdlb21ldHJ5OnQ/dS5nZW9tZXRyeTpPYShlKSxwYXR0ZXJuczp7fSxzb3J0S2V5OmN9O3MucHVzaChoKTt9aSYmcy5zb3J0KCgodCxlKT0+dC5zb3J0S2V5LWUuc29ydEtleSkpO2Zvcihjb25zdCBuIG9mIHMpe2NvbnN0e2dlb21ldHJ5OmksaW5kZXg6cyxzb3VyY2VMYXllckluZGV4OmF9PW47aWYodGhpcy5oYXNQYXR0ZXJuKXtjb25zdCB0PWlsKFwibGluZVwiLHRoaXMubGF5ZXJzLG4sdGhpcy56b29tLGUpO3RoaXMucGF0dGVybkZlYXR1cmVzLnB1c2godCk7fWVsc2UgdGhpcy5hZGRGZWF0dXJlKG4saSxzLHIse30pO2UuZmVhdHVyZUluZGV4Lmluc2VydCh0W3NdLmZlYXR1cmUsaSxzLGEsdGhpcy5pbmRleCk7fX11cGRhdGUodCxlLHIpe3RoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoJiZ0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyh0LGUsdGhpcy5zdGF0ZURlcGVuZGVudExheWVycyxyKTt9YWRkRmVhdHVyZXModCxlLHIpe2Zvcihjb25zdCB0IG9mIHRoaXMucGF0dGVybkZlYXR1cmVzKXRoaXMuYWRkRmVhdHVyZSh0LHQuZ2VvbWV0cnksdC5pbmRleCxlLHIpO31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aH11cGxvYWRQZW5kaW5nKCl7cmV0dXJuICF0aGlzLnVwbG9hZGVkfHx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZH11cGxvYWQodCl7dGhpcy51cGxvYWRlZHx8KDAhPT10aGlzLmxheW91dFZlcnRleEFycmF5Mi5sZW5ndGgmJih0aGlzLmxheW91dFZlcnRleEJ1ZmZlcjI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheTIsT2wpKSx0aGlzLmxheW91dFZlcnRleEJ1ZmZlcj10LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LExsKSx0aGlzLmluZGV4QnVmZmVyPXQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KSksdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKHQpLHRoaXMudXBsb2FkZWQ9ITA7fWRlc3Ryb3koKXt0aGlzLmxheW91dFZlcnRleEJ1ZmZlciYmKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCksdGhpcy5zZWdtZW50cy5kZXN0cm95KCkpO31saW5lRmVhdHVyZUNsaXBzKHQpe2lmKHQucHJvcGVydGllcyYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQucHJvcGVydGllcyxcIm1hcGJveF9jbGlwX3N0YXJ0XCIpJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodC5wcm9wZXJ0aWVzLFwibWFwYm94X2NsaXBfZW5kXCIpKXJldHVybiB7c3RhcnQ6K3QucHJvcGVydGllcy5tYXBib3hfY2xpcF9zdGFydCxlbmQ6K3QucHJvcGVydGllcy5tYXBib3hfY2xpcF9lbmR9fWFkZEZlYXR1cmUodCxlLHIsbixpKXtjb25zdCBzPXRoaXMubGF5ZXJzWzBdLmxheW91dCxhPXMuZ2V0KFwibGluZS1qb2luXCIpLmV2YWx1YXRlKHQse30pLG89cy5nZXQoXCJsaW5lLWNhcFwiKSxsPXMuZ2V0KFwibGluZS1taXRlci1saW1pdFwiKSx1PXMuZ2V0KFwibGluZS1yb3VuZC1saW1pdFwiKTt0aGlzLmxpbmVDbGlwcz10aGlzLmxpbmVGZWF0dXJlQ2xpcHModCk7Zm9yKGNvbnN0IHIgb2YgZSl0aGlzLmFkZExpbmUocix0LGEsbyxsLHUpO3RoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsdCxyLGksbik7fWFkZExpbmUodCxlLHIsbixpLHMpe2lmKHRoaXMuZGlzdGFuY2U9MCx0aGlzLnNjYWxlZERpc3RhbmNlPTAsdGhpcy50b3RhbERpc3RhbmNlPTAsdGhpcy5saW5lQ2xpcHMpe3RoaXMubGluZUNsaXBzQXJyYXkucHVzaCh0aGlzLmxpbmVDbGlwcyk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aC0xO2UrKyl0aGlzLnRvdGFsRGlzdGFuY2UrPXRbZV0uZGlzdCh0W2UrMV0pO3RoaXMudXBkYXRlU2NhbGVkRGlzdGFuY2UoKSx0aGlzLm1heExpbmVMZW5ndGg9TWF0aC5tYXgodGhpcy5tYXhMaW5lTGVuZ3RoLHRoaXMudG90YWxEaXN0YW5jZSk7fWNvbnN0IGE9XCJQb2x5Z29uXCI9PT1qbFtlLnR5cGVdO2xldCBvPXQubGVuZ3RoO2Zvcig7bz49MiYmdFtvLTFdLmVxdWFscyh0W28tMl0pOylvLS07bGV0IGw9MDtmb3IoO2w8by0xJiZ0W2xdLmVxdWFscyh0W2wrMV0pOylsKys7aWYobzwoYT8zOjIpKXJldHVybjtcImJldmVsXCI9PT1yJiYoaT0xLjA1KTtjb25zdCB1PXRoaXMub3ZlcnNjYWxpbmc8PTE2PzE1KiRhLyg1MTIqdGhpcy5vdmVyc2NhbGluZyk6MCxjPXRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoMTAqbyx0aGlzLmxheW91dFZlcnRleEFycmF5LHRoaXMuaW5kZXhBcnJheSk7bGV0IGgscCxmLGQseTt0aGlzLmUxPXRoaXMuZTI9LTEsYSYmKGg9dFtvLTJdLHk9dFtsXS5zdWIoaCkuX3VuaXQoKS5fcGVycCgpKTtmb3IobGV0IGU9bDtlPG87ZSsrKXtpZihmPWU9PT1vLTE/YT90W2wrMV06dm9pZCAwOnRbZSsxXSxmJiZ0W2VdLmVxdWFscyhmKSljb250aW51ZTt5JiYoZD15KSxoJiYocD1oKSxoPXRbZV0seT1mP2Yuc3ViKGgpLl91bml0KCkuX3BlcnAoKTpkLGQ9ZHx8eTtsZXQgbT1kLmFkZCh5KTswPT09bS54JiYwPT09bS55fHxtLl91bml0KCk7Y29uc3QgZz1kLngqeS54K2QueSp5LnkseD1tLngqeS54K20ueSp5Lnksdj0wIT09eD8xL3g6MS8wLGI9MipNYXRoLnNxcnQoMi0yKngpLHc9eDxSbCYmcCYmZixfPWQueCp5LnktZC55KnkueD4wO2lmKHcmJmU+bCl7Y29uc3QgdD1oLmRpc3QocCk7aWYodD4yKnUpe2NvbnN0IGU9aC5zdWIoaC5zdWIocCkuX211bHQodS90KS5fcm91bmQoKSk7dGhpcy51cGRhdGVEaXN0YW5jZShwLGUpLHRoaXMuYWRkQ3VycmVudFZlcnRleChlLGQsMCwwLGMpLHA9ZTt9fWNvbnN0IEE9cCYmZjtsZXQgUz1BP3I6YT9cImJ1dHRcIjpuO2lmKEEmJlwicm91bmRcIj09PVMmJih2PHM/Uz1cIm1pdGVyXCI6djw9MiYmKFM9XCJmYWtlcm91bmRcIikpLFwibWl0ZXJcIj09PVMmJnY+aSYmKFM9XCJiZXZlbFwiKSxcImJldmVsXCI9PT1TJiYodj4yJiYoUz1cImZsaXBiZXZlbFwiKSx2PGkmJihTPVwibWl0ZXJcIikpLHAmJnRoaXMudXBkYXRlRGlzdGFuY2UocCxoKSxcIm1pdGVyXCI9PT1TKW0uX211bHQodiksdGhpcy5hZGRDdXJyZW50VmVydGV4KGgsbSwwLDAsYyk7ZWxzZSBpZihcImZsaXBiZXZlbFwiPT09Uyl7aWYodj4xMDApbT15Lm11bHQoLTEpO2Vsc2Uge2NvbnN0IHQ9dipkLmFkZCh5KS5tYWcoKS9kLnN1Yih5KS5tYWcoKTttLl9wZXJwKCkuX211bHQodCooXz8tMToxKSk7fXRoaXMuYWRkQ3VycmVudFZlcnRleChoLG0sMCwwLGMpLHRoaXMuYWRkQ3VycmVudFZlcnRleChoLG0ubXVsdCgtMSksMCwwLGMpO31lbHNlIGlmKFwiYmV2ZWxcIj09PVN8fFwiZmFrZXJvdW5kXCI9PT1TKXtjb25zdCB0PS1NYXRoLnNxcnQodip2LTEpLGU9Xz90OjAscj1fPzA6dDtpZihwJiZ0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoaCxkLGUscixjKSxcImZha2Vyb3VuZFwiPT09Uyl7Y29uc3QgdD1NYXRoLnJvdW5kKDE4MCpiL01hdGguUEkvMjApO2ZvcihsZXQgZT0xO2U8dDtlKyspe2xldCByPWUvdDtpZiguNSE9PXIpe2NvbnN0IHQ9ci0uNTtyKz1yKnQqKHItMSkqKCgxLjA5MDQrZyooZyooMy41NTY0NS0xLjQzNTE5KmcpLTMuMjQ1MikpKnQqdCsoLjg0ODAxMytnKiguMjE1NjM4KmctMS4wNjAyMSkpKTt9Y29uc3Qgbj15LnN1YihkKS5fbXVsdChyKS5fYWRkKGQpLl91bml0KCkuX211bHQoXz8tMToxKTt0aGlzLmFkZEhhbGZWZXJ0ZXgoaCxuLngsbi55LCExLF8sMCxjKTt9fWYmJnRoaXMuYWRkQ3VycmVudFZlcnRleChoLHksLWUsLXIsYyk7fWVsc2UgaWYoXCJidXR0XCI9PT1TKXRoaXMuYWRkQ3VycmVudFZlcnRleChoLG0sMCwwLGMpO2Vsc2UgaWYoXCJzcXVhcmVcIj09PVMpe2NvbnN0IHQ9cD8xOi0xO3RoaXMuYWRkQ3VycmVudFZlcnRleChoLG0sdCx0LGMpO31lbHNlIFwicm91bmRcIj09PVMmJihwJiYodGhpcy5hZGRDdXJyZW50VmVydGV4KGgsZCwwLDAsYyksdGhpcy5hZGRDdXJyZW50VmVydGV4KGgsZCwxLDEsYywhMCkpLGYmJih0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoaCx5LC0xLC0xLGMsITApLHRoaXMuYWRkQ3VycmVudFZlcnRleChoLHksMCwwLGMpKSk7aWYodyYmZTxvLTEpe2NvbnN0IHQ9aC5kaXN0KGYpO2lmKHQ+Mip1KXtjb25zdCBlPWguYWRkKGYuc3ViKGgpLl9tdWx0KHUvdCkuX3JvdW5kKCkpO3RoaXMudXBkYXRlRGlzdGFuY2UoaCxlKSx0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoZSx5LDAsMCxjKSxoPWU7fX19fWFkZEN1cnJlbnRWZXJ0ZXgodCxlLHIsbixpLHM9ITEpe2NvbnN0IGE9ZS55Km4tZS54LG89LWUueS1lLngqbjt0aGlzLmFkZEhhbGZWZXJ0ZXgodCxlLngrZS55KnIsZS55LWUueCpyLHMsITEscixpKSx0aGlzLmFkZEhhbGZWZXJ0ZXgodCxhLG8scywhMCwtbixpKSx0aGlzLmRpc3RhbmNlPlVsLzImJjA9PT10aGlzLnRvdGFsRGlzdGFuY2UmJih0aGlzLmRpc3RhbmNlPTAsdGhpcy51cGRhdGVTY2FsZWREaXN0YW5jZSgpLHRoaXMuYWRkQ3VycmVudFZlcnRleCh0LGUscixuLGkscykpO31hZGRIYWxmVmVydGV4KHt4OnQseTplfSxyLG4saSxzLGEsbyl7Y29uc3QgbD0uNSoodGhpcy5saW5lQ2xpcHM/dGhpcy5zY2FsZWREaXN0YW5jZSooVWwtMSk6dGhpcy5zY2FsZWREaXN0YW5jZSk7dGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjaygodDw8MSkrKGk/MTowKSwoZTw8MSkrKHM/MTowKSxNYXRoLnJvdW5kKDYzKnIpKzEyOCxNYXRoLnJvdW5kKDYzKm4pKzEyOCwxKygwPT09YT8wOmE8MD8tMToxKXwoNjMmbCk8PDIsbD4+NiksdGhpcy5saW5lQ2xpcHMmJnRoaXMubGF5b3V0VmVydGV4QXJyYXkyLmVtcGxhY2VCYWNrKCh0aGlzLnNjYWxlZERpc3RhbmNlLXRoaXMubGluZUNsaXBzLnN0YXJ0KS8odGhpcy5saW5lQ2xpcHMuZW5kLXRoaXMubGluZUNsaXBzLnN0YXJ0KSx0aGlzLmxpbmVDbGlwc0FycmF5Lmxlbmd0aCk7Y29uc3QgdT1vLnZlcnRleExlbmd0aCsrO3RoaXMuZTE+PTAmJnRoaXMuZTI+PTAmJih0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodGhpcy5lMSx0aGlzLmUyLHUpLG8ucHJpbWl0aXZlTGVuZ3RoKyspLHM/dGhpcy5lMj11OnRoaXMuZTE9dTt9dXBkYXRlU2NhbGVkRGlzdGFuY2UoKXt0aGlzLnNjYWxlZERpc3RhbmNlPXRoaXMubGluZUNsaXBzP3RoaXMubGluZUNsaXBzLnN0YXJ0Kyh0aGlzLmxpbmVDbGlwcy5lbmQtdGhpcy5saW5lQ2xpcHMuc3RhcnQpKnRoaXMuZGlzdGFuY2UvdGhpcy50b3RhbERpc3RhbmNlOnRoaXMuZGlzdGFuY2U7fXVwZGF0ZURpc3RhbmNlKHQsZSl7dGhpcy5kaXN0YW5jZSs9dC5kaXN0KGUpLHRoaXMudXBkYXRlU2NhbGVkRGlzdGFuY2UoKTt9fWxldCBObCxabDt3aShcIkxpbmVCdWNrZXRcIixxbCx7b21pdDpbXCJsYXllcnNcIixcInBhdHRlcm5GZWF0dXJlc1wiXX0pO3ZhciBHbD17Z2V0IHBhaW50KCl7cmV0dXJuIFpsPVpsfHxuZXcgcnMoe1wibGluZS1vcGFjaXR5XCI6bmV3IFdpKEcucGFpbnRfbGluZVtcImxpbmUtb3BhY2l0eVwiXSksXCJsaW5lLWNvbG9yXCI6bmV3IFdpKEcucGFpbnRfbGluZVtcImxpbmUtY29sb3JcIl0pLFwibGluZS10cmFuc2xhdGVcIjpuZXcgSmkoRy5wYWludF9saW5lW1wibGluZS10cmFuc2xhdGVcIl0pLFwibGluZS10cmFuc2xhdGUtYW5jaG9yXCI6bmV3IEppKEcucGFpbnRfbGluZVtcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiXSksXCJsaW5lLXdpZHRoXCI6bmV3IFdpKEcucGFpbnRfbGluZVtcImxpbmUtd2lkdGhcIl0pLFwibGluZS1nYXAtd2lkdGhcIjpuZXcgV2koRy5wYWludF9saW5lW1wibGluZS1nYXAtd2lkdGhcIl0pLFwibGluZS1vZmZzZXRcIjpuZXcgV2koRy5wYWludF9saW5lW1wibGluZS1vZmZzZXRcIl0pLFwibGluZS1ibHVyXCI6bmV3IFdpKEcucGFpbnRfbGluZVtcImxpbmUtYmx1clwiXSksXCJsaW5lLWRhc2hhcnJheVwiOm5ldyB0cyhHLnBhaW50X2xpbmVbXCJsaW5lLWRhc2hhcnJheVwiXSksXCJsaW5lLXBhdHRlcm5cIjpuZXcgUWkoRy5wYWludF9saW5lW1wibGluZS1wYXR0ZXJuXCJdKSxcImxpbmUtZ3JhZGllbnRcIjpuZXcgZXMoRy5wYWludF9saW5lW1wibGluZS1ncmFkaWVudFwiXSl9KX0sZ2V0IGxheW91dCgpe3JldHVybiBObD1ObHx8bmV3IHJzKHtcImxpbmUtY2FwXCI6bmV3IEppKEcubGF5b3V0X2xpbmVbXCJsaW5lLWNhcFwiXSksXCJsaW5lLWpvaW5cIjpuZXcgV2koRy5sYXlvdXRfbGluZVtcImxpbmUtam9pblwiXSksXCJsaW5lLW1pdGVyLWxpbWl0XCI6bmV3IEppKEcubGF5b3V0X2xpbmVbXCJsaW5lLW1pdGVyLWxpbWl0XCJdKSxcImxpbmUtcm91bmQtbGltaXRcIjpuZXcgSmkoRy5sYXlvdXRfbGluZVtcImxpbmUtcm91bmQtbGltaXRcIl0pLFwibGluZS1zb3J0LWtleVwiOm5ldyBXaShHLmxheW91dF9saW5lW1wibGluZS1zb3J0LWtleVwiXSl9KX19O2NsYXNzIEtsIGV4dGVuZHMgV2l7cG9zc2libHlFdmFsdWF0ZSh0LGUpe3JldHVybiBlPW5ldyBVaShNYXRoLmZsb29yKGUuem9vbSkse25vdzplLm5vdyxmYWRlRHVyYXRpb246ZS5mYWRlRHVyYXRpb24sem9vbUhpc3Rvcnk6ZS56b29tSGlzdG9yeSx0cmFuc2l0aW9uOmUudHJhbnNpdGlvbn0pLHN1cGVyLnBvc3NpYmx5RXZhbHVhdGUodCxlKX1ldmFsdWF0ZSh0LGUscixuKXtyZXR1cm4gZT1nKHt9LGUse3pvb206TWF0aC5mbG9vcihlLnpvb20pfSksc3VwZXIuZXZhbHVhdGUodCxlLHIsbil9fWxldCBYbDtjbGFzcyBIbCBleHRlbmRzIGlze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsR2wpLHRoaXMuZ3JhZGllbnRWZXJzaW9uPTAsWGx8fChYbD1uZXcgS2woR2wucGFpbnQucHJvcGVydGllc1tcImxpbmUtd2lkdGhcIl0uc3BlY2lmaWNhdGlvbiksWGwudXNlSW50ZWdlclpvb209ITApO31faGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUodCl7aWYoXCJsaW5lLWdyYWRpZW50XCI9PT10KXtjb25zdCB0PXRoaXMuZ3JhZGllbnRFeHByZXNzaW9uKCk7dGhpcy5zdGVwSW50ZXJwb2xhbnQ9ISFmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dC5fc3R5bGVFeHByZXNzaW9ufSh0KSYmdC5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBBZSx0aGlzLmdyYWRpZW50VmVyc2lvbj0odGhpcy5ncmFkaWVudFZlcnNpb24rMSklTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7fX1ncmFkaWVudEV4cHJlc3Npb24oKXtyZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW1wibGluZS1ncmFkaWVudFwiXS52YWx1ZS5leHByZXNzaW9ufXJlY2FsY3VsYXRlKHQsZSl7c3VwZXIucmVjYWxjdWxhdGUodCxlKSx0aGlzLnBhaW50Ll92YWx1ZXNbXCJsaW5lLWZsb29yd2lkdGhcIl09WGwucG9zc2libHlFdmFsdWF0ZSh0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQuX3ZhbHVlc1tcImxpbmUtd2lkdGhcIl0udmFsdWUsdCk7fWNyZWF0ZUJ1Y2tldCh0KXtyZXR1cm4gbmV3IHFsKHQpfXF1ZXJ5UmFkaXVzKHQpe2NvbnN0IGU9dCxyPVlsKHRvKFwibGluZS13aWR0aFwiLHRoaXMsZSksdG8oXCJsaW5lLWdhcC13aWR0aFwiLHRoaXMsZSkpLG49dG8oXCJsaW5lLW9mZnNldFwiLHRoaXMsZSk7cmV0dXJuIHIvMitNYXRoLmFicyhuKStlbyh0aGlzLnBhaW50LmdldChcImxpbmUtdHJhbnNsYXRlXCIpKX1xdWVyeUludGVyc2VjdHNGZWF0dXJlKHQsZSxyLG4saSxhLG8pe2NvbnN0IGw9cm8odCx0aGlzLnBhaW50LmdldChcImxpbmUtdHJhbnNsYXRlXCIpLHRoaXMucGFpbnQuZ2V0KFwibGluZS10cmFuc2xhdGUtYW5jaG9yXCIpLGEuYW5nbGUsbyksdT1vLzIqWWwodGhpcy5wYWludC5nZXQoXCJsaW5lLXdpZHRoXCIpLmV2YWx1YXRlKGUsciksdGhpcy5wYWludC5nZXQoXCJsaW5lLWdhcC13aWR0aFwiKS5ldmFsdWF0ZShlLHIpKSxjPXRoaXMucGFpbnQuZ2V0KFwibGluZS1vZmZzZXRcIikuZXZhbHVhdGUoZSxyKTtyZXR1cm4gYyYmKG49ZnVuY3Rpb24odCxlKXtjb25zdCByPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPXRbbl0sYT1bXTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7Y29uc3Qgcj1pW3QtMV0sbj1pW3RdLG89aVt0KzFdLGw9MD09PXQ/bmV3IHMoMCwwKTpuLnN1YihyKS5fdW5pdCgpLl9wZXJwKCksdT10PT09aS5sZW5ndGgtMT9uZXcgcygwLDApOm8uc3ViKG4pLl91bml0KCkuX3BlcnAoKSxjPWwuX2FkZCh1KS5fdW5pdCgpLGg9Yy54KnUueCtjLnkqdS55OzAhPT1oJiZjLl9tdWx0KDEvaCksYS5wdXNoKGMuX211bHQoZSkuX2FkZChuKSk7fXIucHVzaChhKTt9cmV0dXJuIHJ9KG4sYypvKSksZnVuY3Rpb24odCxlLHIpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCBpPWVbbl07aWYodC5sZW5ndGg+PTMpZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspaWYoV2EodCxpW2VdKSlyZXR1cm4gITA7aWYoR2EodCxpLHIpKXJldHVybiAhMH1yZXR1cm4gITF9KGwsbix1KX1pc1RpbGVDbGlwcGVkKCl7cmV0dXJuICEwfX1mdW5jdGlvbiBZbCh0LGUpe3JldHVybiBlPjA/ZSsyKnQ6dH1jb25zdCBKbD1scyhbe25hbWU6XCJhX3Bvc19vZmZzZXRcIixjb21wb25lbnRzOjQsdHlwZTpcIkludDE2XCJ9LHtuYW1lOlwiYV9kYXRhXCIsY29tcG9uZW50czo0LHR5cGU6XCJVaW50MTZcIn0se25hbWU6XCJhX3BpeGVsb2Zmc2V0XCIsY29tcG9uZW50czo0LHR5cGU6XCJJbnQxNlwifV0sNCksV2w9bHMoW3tuYW1lOlwiYV9wcm9qZWN0ZWRfcG9zXCIsY29tcG9uZW50czozLHR5cGU6XCJGbG9hdDMyXCJ9XSw0KTtscyhbe25hbWU6XCJhX2ZhZGVfb3BhY2l0eVwiLGNvbXBvbmVudHM6MSx0eXBlOlwiVWludDMyXCJ9XSw0KTtjb25zdCBRbD1scyhbe25hbWU6XCJhX3BsYWNlZFwiLGNvbXBvbmVudHM6Mix0eXBlOlwiVWludDhcIn0se25hbWU6XCJhX3NoaWZ0XCIsY29tcG9uZW50czoyLHR5cGU6XCJGbG9hdDMyXCJ9LHtuYW1lOlwiYV9ib3hfcmVhbFwiLGNvbXBvbmVudHM6Mix0eXBlOlwiSW50MTZcIn1dKTtscyhbe3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJhbmNob3JQb2ludFhcIn0se3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJhbmNob3JQb2ludFlcIn0se3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJ4MVwifSx7dHlwZTpcIkludDE2XCIsbmFtZTpcInkxXCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwieDJcIn0se3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJ5MlwifSx7dHlwZTpcIlVpbnQzMlwiLG5hbWU6XCJmZWF0dXJlSW5kZXhcIn0se3R5cGU6XCJVaW50MTZcIixuYW1lOlwic291cmNlTGF5ZXJJbmRleFwifSx7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJidWNrZXRJbmRleFwifV0pO2NvbnN0IHR1PWxzKFt7bmFtZTpcImFfcG9zXCIsY29tcG9uZW50czoyLHR5cGU6XCJJbnQxNlwifSx7bmFtZTpcImFfYW5jaG9yX3Bvc1wiLGNvbXBvbmVudHM6Mix0eXBlOlwiSW50MTZcIn0se25hbWU6XCJhX2V4dHJ1ZGVcIixjb21wb25lbnRzOjIsdHlwZTpcIkludDE2XCJ9XSw0KSxldT1scyhbe25hbWU6XCJhX3Bvc1wiLGNvbXBvbmVudHM6Mix0eXBlOlwiRmxvYXQzMlwifSx7bmFtZTpcImFfcmFkaXVzXCIsY29tcG9uZW50czoxLHR5cGU6XCJGbG9hdDMyXCJ9LHtuYW1lOlwiYV9mbGFnc1wiLGNvbXBvbmVudHM6Mix0eXBlOlwiSW50MTZcIn1dLDQpO2Z1bmN0aW9uIHJ1KHQsZSxyKXtyZXR1cm4gdC5zZWN0aW9ucy5mb3JFYWNoKCh0PT57dC50ZXh0PWZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPWUubGF5b3V0LmdldChcInRleHQtdHJhbnNmb3JtXCIpLmV2YWx1YXRlKHIse30pO3JldHVybiBcInVwcGVyY2FzZVwiPT09bj90PXQudG9Mb2NhbGVVcHBlckNhc2UoKTpcImxvd2VyY2FzZVwiPT09biYmKHQ9dC50b0xvY2FsZUxvd2VyQ2FzZSgpKSxSaS5hcHBseUFyYWJpY1NoYXBpbmcmJih0PVJpLmFwcGx5QXJhYmljU2hhcGluZyh0KSksdH0odC50ZXh0LGUscik7fSkpLHR9bHMoW3tuYW1lOlwidHJpYW5nbGVcIixjb21wb25lbnRzOjMsdHlwZTpcIlVpbnQxNlwifV0pLGxzKFt7dHlwZTpcIkludDE2XCIsbmFtZTpcImFuY2hvclhcIn0se3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJhbmNob3JZXCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcImdseXBoU3RhcnRJbmRleFwifSx7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJudW1HbHlwaHNcIn0se3R5cGU6XCJVaW50MzJcIixuYW1lOlwidmVydGV4U3RhcnRJbmRleFwifSx7dHlwZTpcIlVpbnQzMlwiLG5hbWU6XCJsaW5lU3RhcnRJbmRleFwifSx7dHlwZTpcIlVpbnQzMlwiLG5hbWU6XCJsaW5lTGVuZ3RoXCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInNlZ21lbnRcIn0se3R5cGU6XCJVaW50MTZcIixuYW1lOlwibG93ZXJTaXplXCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInVwcGVyU2l6ZVwifSx7dHlwZTpcIkZsb2F0MzJcIixuYW1lOlwibGluZU9mZnNldFhcIn0se3R5cGU6XCJGbG9hdDMyXCIsbmFtZTpcImxpbmVPZmZzZXRZXCJ9LHt0eXBlOlwiVWludDhcIixuYW1lOlwid3JpdGluZ01vZGVcIn0se3R5cGU6XCJVaW50OFwiLG5hbWU6XCJwbGFjZWRPcmllbnRhdGlvblwifSx7dHlwZTpcIlVpbnQ4XCIsbmFtZTpcImhpZGRlblwifSx7dHlwZTpcIlVpbnQzMlwiLG5hbWU6XCJjcm9zc1RpbGVJRFwifSx7dHlwZTpcIkludDE2XCIsbmFtZTpcImFzc29jaWF0ZWRJY29uSW5kZXhcIn1dKSxscyhbe3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJhbmNob3JYXCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwiYW5jaG9yWVwifSx7dHlwZTpcIkludDE2XCIsbmFtZTpcInJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4XCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwiY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4XCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwibGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFwifSx7dHlwZTpcIkludDE2XCIsbmFtZTpcInZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4XCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwicGxhY2VkSWNvblN5bWJvbEluZGV4XCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwidmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXhcIn0se3R5cGU6XCJVaW50MTZcIixuYW1lOlwia2V5XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInRleHRCb3hTdGFydEluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInRleHRCb3hFbmRJbmRleFwifSx7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJ2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInZlcnRpY2FsVGV4dEJveEVuZEluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcImljb25Cb3hTdGFydEluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcImljb25Cb3hFbmRJbmRleFwifSx7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJ2ZXJ0aWNhbEljb25Cb3hTdGFydEluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInZlcnRpY2FsSWNvbkJveEVuZEluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcImZlYXR1cmVJbmRleFwifSx7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlc1wifSx7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJudW1WZXJ0aWNhbEdseXBoVmVydGljZXNcIn0se3R5cGU6XCJVaW50MTZcIixuYW1lOlwibnVtSWNvblZlcnRpY2VzXCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcIm51bVZlcnRpY2FsSWNvblZlcnRpY2VzXCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzXCJ9LHt0eXBlOlwiVWludDMyXCIsbmFtZTpcImNyb3NzVGlsZUlEXCJ9LHt0eXBlOlwiRmxvYXQzMlwiLG5hbWU6XCJ0ZXh0Qm94U2NhbGVcIn0se3R5cGU6XCJGbG9hdDMyXCIsbmFtZTpcImNvbGxpc2lvbkNpcmNsZURpYW1ldGVyXCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInRleHRBbmNob3JPZmZzZXRTdGFydEluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcInRleHRBbmNob3JPZmZzZXRFbmRJbmRleFwifV0pLGxzKFt7dHlwZTpcIkZsb2F0MzJcIixuYW1lOlwib2Zmc2V0WFwifV0pLGxzKFt7dHlwZTpcIkludDE2XCIsbmFtZTpcInhcIn0se3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJ5XCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwidGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3JcIn1dKSxscyhbe3R5cGU6XCJVaW50MTZcIixuYW1lOlwidGV4dEFuY2hvclwifSx7dHlwZTpcIkZsb2F0MzJcIixjb21wb25lbnRzOjIsbmFtZTpcInRleHRPZmZzZXRcIn1dKTtjb25zdCBudT17XCIhXCI6XCLvuJVcIixcIiNcIjpcIu+8g1wiLCQ6XCLvvIRcIixcIiVcIjpcIu+8hVwiLFwiJlwiOlwi77yGXCIsXCIoXCI6XCLvuLVcIixcIilcIjpcIu+4tlwiLFwiKlwiOlwi77yKXCIsXCIrXCI6XCLvvItcIixcIixcIjpcIu+4kFwiLFwiLVwiOlwi77iyXCIsXCIuXCI6XCLjg7tcIixcIi9cIjpcIu+8j1wiLFwiOlwiOlwi77iTXCIsXCI7XCI6XCLvuJRcIixcIjxcIjpcIu+4v1wiLFwiPVwiOlwi77ydXCIsXCI+XCI6XCLvuYBcIixcIj9cIjpcIu+4llwiLFwiQFwiOlwi77ygXCIsXCJbXCI6XCLvuYdcIixcIlxcXFxcIjpcIu+8vFwiLFwiXVwiOlwi77mIXCIsXCJeXCI6XCLvvL5cIixfOlwi77izXCIsXCJgXCI6XCLvvYBcIixcIntcIjpcIu+4t1wiLFwifFwiOlwi4oCVXCIsXCJ9XCI6XCLvuLhcIixcIn5cIjpcIu+9nlwiLFwiwqJcIjpcIu+/oFwiLFwiwqNcIjpcIu+/oVwiLFwiwqVcIjpcIu+/pVwiLFwiwqZcIjpcIu+/pFwiLFwiwqxcIjpcIu+/olwiLFwiwq9cIjpcIu+/o1wiLFwi4oCTXCI6XCLvuLJcIixcIuKAlFwiOlwi77ixXCIsXCLigJhcIjpcIu+5g1wiLFwi4oCZXCI6XCLvuYRcIixcIuKAnFwiOlwi77mBXCIsXCLigJ1cIjpcIu+5glwiLFwi4oCmXCI6XCLvuJlcIixcIuKAp1wiOlwi44O7XCIsXCLigqlcIjpcIu+/plwiLFwi44CBXCI6XCLvuJFcIixcIuOAglwiOlwi77iSXCIsXCLjgIhcIjpcIu+4v1wiLFwi44CJXCI6XCLvuYBcIixcIuOAilwiOlwi77i9XCIsXCLjgItcIjpcIu+4vlwiLFwi44CMXCI6XCLvuYFcIixcIuOAjVwiOlwi77mCXCIsXCLjgI5cIjpcIu+5g1wiLFwi44CPXCI6XCLvuYRcIixcIuOAkFwiOlwi77i7XCIsXCLjgJFcIjpcIu+4vFwiLFwi44CUXCI6XCLvuLlcIixcIuOAlVwiOlwi77i6XCIsXCLjgJZcIjpcIu+4l1wiLFwi44CXXCI6XCLvuJhcIixcIu+8gVwiOlwi77iVXCIsXCLvvIhcIjpcIu+4tVwiLFwi77yJXCI6XCLvuLZcIixcIu+8jFwiOlwi77iQXCIsXCLvvI1cIjpcIu+4slwiLFwi77yOXCI6XCLjg7tcIixcIu+8mlwiOlwi77iTXCIsXCLvvJtcIjpcIu+4lFwiLFwi77ycXCI6XCLvuL9cIixcIu+8nlwiOlwi77mAXCIsXCLvvJ9cIjpcIu+4llwiLFwi77y7XCI6XCLvuYdcIixcIu+8vVwiOlwi77mIXCIsXCLvvL9cIjpcIu+4s1wiLFwi772bXCI6XCLvuLdcIixcIu+9nFwiOlwi4oCVXCIsXCLvvZ1cIjpcIu+4uFwiLFwi772fXCI6XCLvuLVcIixcIu+9oFwiOlwi77i2XCIsXCLvvaFcIjpcIu+4klwiLFwi772iXCI6XCLvuYFcIixcIu+9o1wiOlwi77mCXCJ9O3ZhciBpdT0yNCxzdT1sdSxhdT1mdW5jdGlvbih0LGUscixuLGkpe3ZhciBzLGEsbz04Kmktbi0xLGw9KDE8PG8pLTEsdT1sPj4xLGM9LTcsaD1yP2ktMTowLHA9cj8tMToxLGY9dFtlK2hdO2ZvcihoKz1wLHM9ZiYoMTw8LWMpLTEsZj4+PS1jLGMrPW87Yz4wO3M9MjU2KnMrdFtlK2hdLGgrPXAsYy09OCk7Zm9yKGE9cyYoMTw8LWMpLTEscz4+PS1jLGMrPW47Yz4wO2E9MjU2KmErdFtlK2hdLGgrPXAsYy09OCk7aWYoMD09PXMpcz0xLXU7ZWxzZSB7aWYocz09PWwpcmV0dXJuIGE/TmFOOjEvMCooZj8tMToxKTthKz1NYXRoLnBvdygyLG4pLHMtPXU7fXJldHVybiAoZj8tMToxKSphKk1hdGgucG93KDIscy1uKX0sb3U9ZnVuY3Rpb24odCxlLHIsbixpLHMpe3ZhciBhLG8sbCx1PTgqcy1pLTEsYz0oMTw8dSktMSxoPWM+PjEscD0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGY9bj8wOnMtMSxkPW4/MTotMSx5PWU8MHx8MD09PWUmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8obz1pc05hTihlKT8xOjAsYT1jKTooYT1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKihsPU1hdGgucG93KDIsLWEpKTwxJiYoYS0tLGwqPTIpLChlKz1hK2g+PTE/cC9sOnAqTWF0aC5wb3coMiwxLWgpKSpsPj0yJiYoYSsrLGwvPTIpLGEraD49Yz8obz0wLGE9Yyk6YStoPj0xPyhvPShlKmwtMSkqTWF0aC5wb3coMixpKSxhKz1oKToobz1lKk1hdGgucG93KDIsaC0xKSpNYXRoLnBvdygyLGkpLGE9MCkpO2k+PTg7dFtyK2ZdPTI1NSZvLGYrPWQsby89MjU2LGktPTgpO2ZvcihhPWE8PGl8byx1Kz1pO3U+MDt0W3IrZl09MjU1JmEsZis9ZCxhLz0yNTYsdS09OCk7dFtyK2YtZF18PTEyOCp5O307ZnVuY3Rpb24gbHUodCl7dGhpcy5idWY9QXJyYXlCdWZmZXIuaXNWaWV3JiZBcnJheUJ1ZmZlci5pc1ZpZXcodCk/dDpuZXcgVWludDhBcnJheSh0fHwwKSx0aGlzLnBvcz0wLHRoaXMudHlwZT0wLHRoaXMubGVuZ3RoPXRoaXMuYnVmLmxlbmd0aDt9bHUuVmFyaW50PTAsbHUuRml4ZWQ2ND0xLGx1LkJ5dGVzPTIsbHUuRml4ZWQzMj01O3ZhciB1dT00Mjk0OTY3Mjk2LGN1PTEvdXUsaHU9XCJ1bmRlZmluZWRcIj09dHlwZW9mIFRleHREZWNvZGVyP251bGw6bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZnVuY3Rpb24gcHUodCl7cmV0dXJuIHQudHlwZT09PWx1LkJ5dGVzP3QucmVhZFZhcmludCgpK3QucG9zOnQucG9zKzF9ZnVuY3Rpb24gZnUodCxlLHIpe3JldHVybiByPzQyOTQ5NjcyOTYqZSsodD4+PjApOjQyOTQ5NjcyOTYqKGU+Pj4wKSsodD4+PjApfWZ1bmN0aW9uIGR1KHQsZSxyKXt2YXIgbj1lPD0xNjM4Mz8xOmU8PTIwOTcxNTE/MjplPD0yNjg0MzU0NTU/MzpNYXRoLmZsb29yKE1hdGgubG9nKGUpLyg3Kk1hdGguTE4yKSk7ci5yZWFsbG9jKG4pO2Zvcih2YXIgaT1yLnBvcy0xO2k+PXQ7aS0tKXIuYnVmW2krbl09ci5idWZbaV07fWZ1bmN0aW9uIHl1KHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspZS53cml0ZVZhcmludCh0W3JdKTt9ZnVuY3Rpb24gbXUodCxlKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyllLndyaXRlU1ZhcmludCh0W3JdKTt9ZnVuY3Rpb24gZ3UodCxlKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyllLndyaXRlRmxvYXQodFtyXSk7fWZ1bmN0aW9uIHh1KHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspZS53cml0ZURvdWJsZSh0W3JdKTt9ZnVuY3Rpb24gdnUodCxlKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyllLndyaXRlQm9vbGVhbih0W3JdKTt9ZnVuY3Rpb24gYnUodCxlKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyllLndyaXRlRml4ZWQzMih0W3JdKTt9ZnVuY3Rpb24gd3UodCxlKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyllLndyaXRlU0ZpeGVkMzIodFtyXSk7fWZ1bmN0aW9uIF91KHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspZS53cml0ZUZpeGVkNjQodFtyXSk7fWZ1bmN0aW9uIEF1KHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspZS53cml0ZVNGaXhlZDY0KHRbcl0pO31mdW5jdGlvbiBTdSh0LGUpe3JldHVybiAodFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrMTY3NzcyMTYqdFtlKzNdfWZ1bmN0aW9uIGt1KHQsZSxyKXt0W3JdPWUsdFtyKzFdPWU+Pj44LHRbcisyXT1lPj4+MTYsdFtyKzNdPWU+Pj4yNDt9ZnVuY3Rpb24gTXUodCxlKXtyZXR1cm4gKHRbZV18dFtlKzFdPDw4fHRbZSsyXTw8MTYpKyh0W2UrM108PDI0KX1sdS5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJ1Zj1udWxsO30scmVhZEZpZWxkczpmdW5jdGlvbih0LGUscil7Zm9yKHI9cnx8dGhpcy5sZW5ndGg7dGhpcy5wb3M8cjspe3ZhciBuPXRoaXMucmVhZFZhcmludCgpLGk9bj4+MyxzPXRoaXMucG9zO3RoaXMudHlwZT03Jm4sdChpLGUsdGhpcyksdGhpcy5wb3M9PT1zJiZ0aGlzLnNraXAobik7fXJldHVybiBlfSxyZWFkTWVzc2FnZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlYWRGaWVsZHModCxlLHRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zKX0scmVhZEZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD1TdSh0aGlzLmJ1Zix0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRTRml4ZWQzMjpmdW5jdGlvbigpe3ZhciB0PU11KHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsdH0scmVhZEZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD1TdSh0aGlzLmJ1Zix0aGlzLnBvcykrU3UodGhpcy5idWYsdGhpcy5wb3MrNCkqdXU7cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRTRml4ZWQ2NDpmdW5jdGlvbigpe3ZhciB0PVN1KHRoaXMuYnVmLHRoaXMucG9zKStNdSh0aGlzLmJ1Zix0aGlzLnBvcys0KSp1dTtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZEZsb2F0OmZ1bmN0aW9uKCl7dmFyIHQ9YXUodGhpcy5idWYsdGhpcy5wb3MsITAsMjMsNCk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD1hdSh0aGlzLmJ1Zix0aGlzLnBvcywhMCw1Miw4KTtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZFZhcmludDpmdW5jdGlvbih0KXt2YXIgZSxyLG49dGhpcy5idWY7cmV0dXJuIGU9MTI3JihyPW5bdGhpcy5wb3MrK10pLHI8MTI4P2U6KGV8PSgxMjcmKHI9blt0aGlzLnBvcysrXSkpPDw3LHI8MTI4P2U6KGV8PSgxMjcmKHI9blt0aGlzLnBvcysrXSkpPDwxNCxyPDEyOD9lOihlfD0oMTI3JihyPW5bdGhpcy5wb3MrK10pKTw8MjEscjwxMjg/ZTpmdW5jdGlvbih0LGUscil7dmFyIG4saSxzPXIuYnVmO2lmKG49KDExMiYoaT1zW3IucG9zKytdKSk+PjQsaTwxMjgpcmV0dXJuIGZ1KHQsbixlKTtpZihufD0oMTI3JihpPXNbci5wb3MrK10pKTw8MyxpPDEyOClyZXR1cm4gZnUodCxuLGUpO2lmKG58PSgxMjcmKGk9c1tyLnBvcysrXSkpPDwxMCxpPDEyOClyZXR1cm4gZnUodCxuLGUpO2lmKG58PSgxMjcmKGk9c1tyLnBvcysrXSkpPDwxNyxpPDEyOClyZXR1cm4gZnUodCxuLGUpO2lmKG58PSgxMjcmKGk9c1tyLnBvcysrXSkpPDwyNCxpPDEyOClyZXR1cm4gZnUodCxuLGUpO2lmKG58PSgxJihpPXNbci5wb3MrK10pKTw8MzEsaTwxMjgpcmV0dXJuIGZ1KHQsbixlKTt0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCB2YXJpbnQgbm90IG1vcmUgdGhhbiAxMCBieXRlc1wiKX0oZXw9KDE1JihyPW5bdGhpcy5wb3NdKSk8PDI4LHQsdGhpcykpKSl9LHJlYWRWYXJpbnQ2NDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRWYXJpbnQoITApfSxyZWFkU1ZhcmludDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0JTI9PTE/KHQrMSkvLTI6dC8yfSxyZWFkQm9vbGVhbjpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKX0scmVhZFN0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj0xMiYmaHU/ZnVuY3Rpb24odCxlLHIpe3JldHVybiBodS5kZWNvZGUodC5zdWJhcnJheShlLHIpKX0odGhpcy5idWYsZSx0KTpmdW5jdGlvbih0LGUscil7Zm9yKHZhciBuPVwiXCIsaT1lO2k8cjspe3ZhciBzLGEsbyxsPXRbaV0sdT1udWxsLGM9bD4yMzk/NDpsPjIyMz8zOmw+MTkxPzI6MTtpZihpK2M+cilicmVhazsxPT09Yz9sPDEyOCYmKHU9bCk6Mj09PWM/MTI4PT0oMTkyJihzPXRbaSsxXSkpJiYodT0oMzEmbCk8PDZ8NjMmcyk8PTEyNyYmKHU9bnVsbCk6Mz09PWM/KGE9dFtpKzJdLDEyOD09KDE5MiYocz10W2krMV0pKSYmMTI4PT0oMTkyJmEpJiYoKHU9KDE1JmwpPDwxMnwoNjMmcyk8PDZ8NjMmYSk8PTIwNDd8fHU+PTU1Mjk2JiZ1PD01NzM0MykmJih1PW51bGwpKTo0PT09YyYmKGE9dFtpKzJdLG89dFtpKzNdLDEyOD09KDE5MiYocz10W2krMV0pKSYmMTI4PT0oMTkyJmEpJiYxMjg9PSgxOTImbykmJigodT0oMTUmbCk8PDE4fCg2MyZzKTw8MTJ8KDYzJmEpPDw2fDYzJm8pPD02NTUzNXx8dT49MTExNDExMikmJih1PW51bGwpKSxudWxsPT09dT8odT02NTUzMyxjPTEpOnU+NjU1MzUmJih1LT02NTUzNixuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHU+Pj4xMCYxMDIzfDU1Mjk2KSx1PTU2MzIwfDEwMjMmdSksbis9U3RyaW5nLmZyb21DaGFyQ29kZSh1KSxpKz1jO31yZXR1cm4gbn0odGhpcy5idWYsZSx0KX0scmVhZEJ5dGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MsZT10aGlzLmJ1Zi5zdWJhcnJheSh0aGlzLnBvcyx0KTtyZXR1cm4gdGhpcy5wb3M9dCxlfSxyZWFkUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7aWYodGhpcy50eXBlIT09bHUuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRWYXJpbnQoZSkpO3ZhciByPXB1KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPHI7KXQucHVzaCh0aGlzLnJlYWRWYXJpbnQoZSkpO3JldHVybiB0fSxyZWFkUGFja2VkU1ZhcmludDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1sdS5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7dmFyIGU9cHUodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWx1LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTt2YXIgZT1wdSh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZsb2F0OmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWx1LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRmxvYXQoKSk7dmFyIGU9cHUodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO3JldHVybiB0fSxyZWFkUGFja2VkRG91YmxlOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWx1LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3ZhciBlPXB1KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWx1LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTt2YXIgZT1wdSh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWx1LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7dmFyIGU9cHUodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRml4ZWQ2NDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1sdS5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7dmFyIGU9cHUodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1sdS5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3ZhciBlPXB1KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtyZXR1cm4gdH0sc2tpcDpmdW5jdGlvbih0KXt2YXIgZT03JnQ7aWYoZT09PWx1LlZhcmludClmb3IoO3RoaXMuYnVmW3RoaXMucG9zKytdPjEyNzspO2Vsc2UgaWYoZT09PWx1LkJ5dGVzKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PWx1LkZpeGVkMzIpdGhpcy5wb3MrPTQ7ZWxzZSB7aWYoZSE9PWx1LkZpeGVkNjQpdGhyb3cgbmV3IEVycm9yKFwiVW5pbXBsZW1lbnRlZCB0eXBlOiBcIitlKTt0aGlzLnBvcys9ODt9fSx3cml0ZVRhZzpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVWYXJpbnQodDw8M3xlKTt9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGVuZ3RofHwxNjtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXt2YXIgcj1uZXcgVWludDhBcnJheShlKTtyLnNldCh0aGlzLmJ1ZiksdGhpcy5idWY9cix0aGlzLmxlbmd0aD1lO319LGZpbmlzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aD10aGlzLnBvcyx0aGlzLnBvcz0wLHRoaXMuYnVmLnN1YmFycmF5KDAsdGhpcy5sZW5ndGgpfSx3cml0ZUZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLGt1KHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00O30sd3JpdGVTRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksa3UodGhpcy5idWYsdCx0aGlzLnBvcyksdGhpcy5wb3MrPTQ7fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLGt1KHRoaXMuYnVmLC0xJnQsdGhpcy5wb3MpLGt1KHRoaXMuYnVmLE1hdGguZmxvb3IodCpjdSksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTg7fSx3cml0ZVNGaXhlZDY0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg4KSxrdSh0aGlzLmJ1ZiwtMSZ0LHRoaXMucG9zKSxrdSh0aGlzLmJ1ZixNYXRoLmZsb29yKHQqY3UpLHRoaXMucG9zKzQpLHRoaXMucG9zKz04O30sd3JpdGVWYXJpbnQ6ZnVuY3Rpb24odCl7KHQ9K3R8fDApPjI2ODQzNTQ1NXx8dDwwP2Z1bmN0aW9uKHQsZSl7dmFyIHIsbjtpZih0Pj0wPyhyPXQlNDI5NDk2NzI5NnwwLG49dC80Mjk0OTY3Mjk2fDApOihuPX4oLXQvNDI5NDk2NzI5NiksNDI5NDk2NzI5NV4ocj1+KC10JTQyOTQ5NjcyOTYpKT9yPXIrMXwwOihyPTAsbj1uKzF8MCkpLHQ+PTB4MTAwMDAwMDAwMDAwMDAwMDB8fHQ8LTB4MTAwMDAwMDAwMDAwMDAwMDApdGhyb3cgbmV3IEVycm9yKFwiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXNcIik7ZS5yZWFsbG9jKDEwKSxmdW5jdGlvbih0LGUscil7ci5idWZbci5wb3MrK109MTI3JnR8MTI4LHQ+Pj49NyxyLmJ1ZltyLnBvcysrXT0xMjcmdHwxMjgsdD4+Pj03LHIuYnVmW3IucG9zKytdPTEyNyZ0fDEyOCx0Pj4+PTcsci5idWZbci5wb3MrK109MTI3JnR8MTI4LHIuYnVmW3IucG9zXT0xMjcmKHQ+Pj49Nyk7fShyLDAsZSksZnVuY3Rpb24odCxlKXt2YXIgcj0oNyZ0KTw8NDtlLmJ1ZltlLnBvcysrXXw9cnwoKHQ+Pj49Myk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT0xMjcmdHwoKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT0xMjcmdHwoKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT0xMjcmdHwoKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT0xMjcmdHwoKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT0xMjcmdCkpKSkpO30obixlKTt9KHQsdGhpcyk6KHRoaXMucmVhbGxvYyg0KSx0aGlzLmJ1Zlt0aGlzLnBvcysrXT0xMjcmdHwodD4xMjc/MTI4OjApLHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPTEyNyYodD4+Pj03KXwodD4xMjc/MTI4OjApLHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPTEyNyYodD4+Pj03KXwodD4xMjc/MTI4OjApLHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj43JjEyNykpKSk7fSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCh0PDA/MiotdC0xOjIqdCk7fSx3cml0ZUJvb2xlYW46ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludChCb29sZWFuKHQpKTt9LHdyaXRlU3RyaW5nOmZ1bmN0aW9uKHQpe3Q9U3RyaW5nKHQpLHRoaXMucmVhbGxvYyg0KnQubGVuZ3RoKSx0aGlzLnBvcysrO3ZhciBlPXRoaXMucG9zO3RoaXMucG9zPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG4saSxzPTA7czxlLmxlbmd0aDtzKyspe2lmKChuPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJm48NTczNDQpe2lmKCFpKXtuPjU2MzE5fHxzKzE9PT1lLmxlbmd0aD8odFtyKytdPTIzOSx0W3IrK109MTkxLHRbcisrXT0xODkpOmk9bjtjb250aW51ZX1pZihuPDU2MzIwKXt0W3IrK109MjM5LHRbcisrXT0xOTEsdFtyKytdPTE4OSxpPW47Y29udGludWV9bj1pLTU1Mjk2PDwxMHxuLTU2MzIwfDY1NTM2LGk9bnVsbDt9ZWxzZSBpJiYodFtyKytdPTIzOSx0W3IrK109MTkxLHRbcisrXT0xODksaT1udWxsKTtuPDEyOD90W3IrK109bjoobjwyMDQ4P3RbcisrXT1uPj42fDE5Mjoobjw2NTUzNj90W3IrK109bj4+MTJ8MjI0Oih0W3IrK109bj4+MTh8MjQwLHRbcisrXT1uPj4xMiY2M3wxMjgpLHRbcisrXT1uPj42JjYzfDEyOCksdFtyKytdPTYzJm58MTI4KTt9cmV0dXJuIHJ9KHRoaXMuYnVmLHQsdGhpcy5wb3MpO3ZhciByPXRoaXMucG9zLWU7cj49MTI4JiZkdShlLHIsdGhpcyksdGhpcy5wb3M9ZS0xLHRoaXMud3JpdGVWYXJpbnQociksdGhpcy5wb3MrPXI7fSx3cml0ZUZsb2F0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSxvdSh0aGlzLmJ1Zix0LHRoaXMucG9zLCEwLDIzLDQpLHRoaXMucG9zKz00O30sd3JpdGVEb3VibGU6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLG91KHRoaXMuYnVmLHQsdGhpcy5wb3MsITAsNTIsOCksdGhpcy5wb3MrPTg7fSx3cml0ZUJ5dGVzOmZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO3RoaXMud3JpdGVWYXJpbnQoZSksdGhpcy5yZWFsbG9jKGUpO2Zvcih2YXIgcj0wO3I8ZTtyKyspdGhpcy5idWZbdGhpcy5wb3MrK109dFtyXTt9LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGUpe3RoaXMucG9zKys7dmFyIHI9dGhpcy5wb3M7dChlLHRoaXMpO3ZhciBuPXRoaXMucG9zLXI7bj49MTI4JiZkdShyLG4sdGhpcyksdGhpcy5wb3M9ci0xLHRoaXMud3JpdGVWYXJpbnQobiksdGhpcy5wb3MrPW47fSx3cml0ZU1lc3NhZ2U6ZnVuY3Rpb24odCxlLHIpe3RoaXMud3JpdGVUYWcodCxsdS5CeXRlcyksdGhpcy53cml0ZVJhd01lc3NhZ2UoZSxyKTt9LHdyaXRlUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQseXUsZSk7fSx3cml0ZVBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxtdSxlKTt9LHdyaXRlUGFja2VkQm9vbGVhbjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHZ1LGUpO30sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGd1LGUpO30sd3JpdGVQYWNrZWREb3VibGU6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCx4dSxlKTt9LHdyaXRlUGFja2VkRml4ZWQzMjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGJ1LGUpO30sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHd1LGUpO30sd3JpdGVQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsX3UsZSk7fSx3cml0ZVBhY2tlZFNGaXhlZDY0OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsQXUsZSk7fSx3cml0ZUJ5dGVzRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsbHUuQnl0ZXMpLHRoaXMud3JpdGVCeXRlcyhlKTt9LHdyaXRlRml4ZWQzMkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGx1LkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGUpO30sd3JpdGVTRml4ZWQzMkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGx1LkZpeGVkMzIpLHRoaXMud3JpdGVTRml4ZWQzMihlKTt9LHdyaXRlRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGx1LkZpeGVkNjQpLHRoaXMud3JpdGVGaXhlZDY0KGUpO30sd3JpdGVTRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGx1LkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChlKTt9LHdyaXRlVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsbHUuVmFyaW50KSx0aGlzLndyaXRlVmFyaW50KGUpO30sd3JpdGVTVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsbHUuVmFyaW50KSx0aGlzLndyaXRlU1ZhcmludChlKTt9LHdyaXRlU3RyaW5nRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsbHUuQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoZSk7fSx3cml0ZUZsb2F0RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsbHUuRml4ZWQzMiksdGhpcy53cml0ZUZsb2F0KGUpO30sd3JpdGVEb3VibGVGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxsdS5GaXhlZDY0KSx0aGlzLndyaXRlRG91YmxlKGUpO30sd3JpdGVCb29sZWFuRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50RmllbGQodCxCb29sZWFuKGUpKTt9fTt2YXIgSXU9cihzdSk7Y29uc3QgenU9MztmdW5jdGlvbiBQdSh0LGUscil7MT09PXQmJnIucmVhZE1lc3NhZ2UoQ3UsZSk7fWZ1bmN0aW9uIEN1KHQsZSxyKXtpZigzPT09dCl7Y29uc3R7aWQ6dCxiaXRtYXA6bix3aWR0aDppLGhlaWdodDpzLGxlZnQ6YSx0b3A6byxhZHZhbmNlOmx9PXIucmVhZE1lc3NhZ2UoQnUse30pO2UucHVzaCh7aWQ6dCxiaXRtYXA6bmV3IF9vKHt3aWR0aDppKzIqenUsaGVpZ2h0OnMrMip6dX0sbiksbWV0cmljczp7d2lkdGg6aSxoZWlnaHQ6cyxsZWZ0OmEsdG9wOm8sYWR2YW5jZTpsfX0pO319ZnVuY3Rpb24gQnUodCxlLHIpezE9PT10P2UuaWQ9ci5yZWFkVmFyaW50KCk6Mj09PXQ/ZS5iaXRtYXA9ci5yZWFkQnl0ZXMoKTozPT09dD9lLndpZHRoPXIucmVhZFZhcmludCgpOjQ9PT10P2UuaGVpZ2h0PXIucmVhZFZhcmludCgpOjU9PT10P2UubGVmdD1yLnJlYWRTVmFyaW50KCk6Nj09PXQ/ZS50b3A9ci5yZWFkU1ZhcmludCgpOjc9PT10JiYoZS5hZHZhbmNlPXIucmVhZFZhcmludCgpKTt9Y29uc3QgVnU9enU7ZnVuY3Rpb24gRXUodCl7bGV0IGU9MCxyPTA7Zm9yKGNvbnN0IG4gb2YgdCllKz1uLncqbi5oLHI9TWF0aC5tYXgocixuLncpO3Quc29ydCgoKHQsZSk9PmUuaC10LmgpKTtjb25zdCBuPVt7eDowLHk6MCx3Ok1hdGgubWF4KE1hdGguY2VpbChNYXRoLnNxcnQoZS8uOTUpKSxyKSxoOjEvMH1dO2xldCBpPTAscz0wO2Zvcihjb25zdCBlIG9mIHQpZm9yKGxldCB0PW4ubGVuZ3RoLTE7dD49MDt0LS0pe2NvbnN0IHI9blt0XTtpZighKGUudz5yLnd8fGUuaD5yLmgpKXtpZihlLng9ci54LGUueT1yLnkscz1NYXRoLm1heChzLGUueStlLmgpLGk9TWF0aC5tYXgoaSxlLngrZS53KSxlLnc9PT1yLncmJmUuaD09PXIuaCl7Y29uc3QgZT1uLnBvcCgpO3Q8bi5sZW5ndGgmJihuW3RdPWUpO31lbHNlIGUuaD09PXIuaD8oci54Kz1lLncsci53LT1lLncpOmUudz09PXIudz8oci55Kz1lLmgsci5oLT1lLmgpOihuLnB1c2goe3g6ci54K2Uudyx5OnIueSx3OnIudy1lLncsaDplLmh9KSxyLnkrPWUuaCxyLmgtPWUuaCk7YnJlYWt9fXJldHVybiB7dzppLGg6cyxmaWxsOmUvKGkqcyl8fDB9fWNvbnN0IEZ1PTE7Y2xhc3MgVHV7Y29uc3RydWN0b3IodCx7cGl4ZWxSYXRpbzplLHZlcnNpb246cixzdHJldGNoWDpuLHN0cmV0Y2hZOmksY29udGVudDpzLHRleHRGaXRXaWR0aDphLHRleHRGaXRIZWlnaHQ6b30pe3RoaXMucGFkZGVkUmVjdD10LHRoaXMucGl4ZWxSYXRpbz1lLHRoaXMuc3RyZXRjaFg9bix0aGlzLnN0cmV0Y2hZPWksdGhpcy5jb250ZW50PXMsdGhpcy52ZXJzaW9uPXIsdGhpcy50ZXh0Rml0V2lkdGg9YSx0aGlzLnRleHRGaXRIZWlnaHQ9bzt9Z2V0IHRsKCl7cmV0dXJuIFt0aGlzLnBhZGRlZFJlY3QueCtGdSx0aGlzLnBhZGRlZFJlY3QueStGdV19Z2V0IGJyKCl7cmV0dXJuIFt0aGlzLnBhZGRlZFJlY3QueCt0aGlzLnBhZGRlZFJlY3Qudy1GdSx0aGlzLnBhZGRlZFJlY3QueSt0aGlzLnBhZGRlZFJlY3QuaC1GdV19Z2V0IHRsYnIoKXtyZXR1cm4gdGhpcy50bC5jb25jYXQodGhpcy5icil9Z2V0IGRpc3BsYXlTaXplKCl7cmV0dXJuIFsodGhpcy5wYWRkZWRSZWN0LnctMipGdSkvdGhpcy5waXhlbFJhdGlvLCh0aGlzLnBhZGRlZFJlY3QuaC0yKkZ1KS90aGlzLnBpeGVsUmF0aW9dfX1jbGFzcyAkdXtjb25zdHJ1Y3Rvcih0LGUpe2NvbnN0IHI9e30sbj17fTt0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3M9W107Y29uc3QgaT1bXTt0aGlzLmFkZEltYWdlcyh0LHIsaSksdGhpcy5hZGRJbWFnZXMoZSxuLGkpO2NvbnN0e3c6cyxoOmF9PUV1KGkpLG89bmV3IEFvKHt3aWR0aDpzfHwxLGhlaWdodDphfHwxfSk7Zm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdLGk9cltlXS5wYWRkZWRSZWN0O0FvLmNvcHkobi5kYXRhLG8se3g6MCx5OjB9LHt4OmkueCtGdSx5OmkueStGdX0sbi5kYXRhKTt9Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgcj1lW3RdLGk9blt0XS5wYWRkZWRSZWN0LHM9aS54K0Z1LGE9aS55K0Z1LGw9ci5kYXRhLndpZHRoLHU9ci5kYXRhLmhlaWdodDtBby5jb3B5KHIuZGF0YSxvLHt4OjAseTowfSx7eDpzLHk6YX0sci5kYXRhKSxBby5jb3B5KHIuZGF0YSxvLHt4OjAseTp1LTF9LHt4OnMseTphLTF9LHt3aWR0aDpsLGhlaWdodDoxfSksQW8uY29weShyLmRhdGEsbyx7eDowLHk6MH0se3g6cyx5OmErdX0se3dpZHRoOmwsaGVpZ2h0OjF9KSxBby5jb3B5KHIuZGF0YSxvLHt4OmwtMSx5OjB9LHt4OnMtMSx5OmF9LHt3aWR0aDoxLGhlaWdodDp1fSksQW8uY29weShyLmRhdGEsbyx7eDowLHk6MH0se3g6cytsLHk6YX0se3dpZHRoOjEsaGVpZ2h0OnV9KTt9dGhpcy5pbWFnZT1vLHRoaXMuaWNvblBvc2l0aW9ucz1yLHRoaXMucGF0dGVyblBvc2l0aW9ucz1uO31hZGRJbWFnZXModCxlLHIpe2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IGk9dFtuXSxzPXt4OjAseTowLHc6aS5kYXRhLndpZHRoKzIqRnUsaDppLmRhdGEuaGVpZ2h0KzIqRnV9O3IucHVzaChzKSxlW25dPW5ldyBUdShzLGkpLGkuaGFzUmVuZGVyQ2FsbGJhY2smJnRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcy5wdXNoKG4pO319cGF0Y2hVcGRhdGVkSW1hZ2VzKHQsZSl7dC5kaXNwYXRjaFJlbmRlckNhbGxiYWNrcyh0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MpO2Zvcihjb25zdCByIGluIHQudXBkYXRlZEltYWdlcyl0aGlzLnBhdGNoVXBkYXRlZEltYWdlKHRoaXMuaWNvblBvc2l0aW9uc1tyXSx0LmdldEltYWdlKHIpLGUpLHRoaXMucGF0Y2hVcGRhdGVkSW1hZ2UodGhpcy5wYXR0ZXJuUG9zaXRpb25zW3JdLHQuZ2V0SW1hZ2UociksZSk7fXBhdGNoVXBkYXRlZEltYWdlKHQsZSxyKXtpZighdHx8IWUpcmV0dXJuO2lmKHQudmVyc2lvbj09PWUudmVyc2lvbilyZXR1cm47dC52ZXJzaW9uPWUudmVyc2lvbjtjb25zdFtuLGldPXQudGw7ci51cGRhdGUoZS5kYXRhLHZvaWQgMCx7eDpuLHk6aX0pO319dmFyIEx1O3dpKFwiSW1hZ2VQb3NpdGlvblwiLFR1KSx3aShcIkltYWdlQXRsYXNcIiwkdSksdC5haD12b2lkIDAsKEx1PXQuYWh8fCh0LmFoPXt9KSlbTHUubm9uZT0wXT1cIm5vbmVcIixMdVtMdS5ob3Jpem9udGFsPTFdPVwiaG9yaXpvbnRhbFwiLEx1W0x1LnZlcnRpY2FsPTJdPVwidmVydGljYWxcIixMdVtMdS5ob3Jpem9udGFsT25seT0zXT1cImhvcml6b250YWxPbmx5XCI7Y29uc3QgRHU9LTE3O2NsYXNzIE91e2NvbnN0cnVjdG9yKCl7dGhpcy5zY2FsZT0xLHRoaXMuZm9udFN0YWNrPVwiXCIsdGhpcy5pbWFnZU5hbWU9bnVsbDt9c3RhdGljIGZvclRleHQodCxlKXtjb25zdCByPW5ldyBPdTtyZXR1cm4gci5zY2FsZT10fHwxLHIuZm9udFN0YWNrPWUscn1zdGF0aWMgZm9ySW1hZ2UodCl7Y29uc3QgZT1uZXcgT3U7cmV0dXJuIGUuaW1hZ2VOYW1lPXQsZX19Y2xhc3MganV7Y29uc3RydWN0b3IoKXt0aGlzLnRleHQ9XCJcIix0aGlzLnNlY3Rpb25JbmRleD1bXSx0aGlzLnNlY3Rpb25zPVtdLHRoaXMuaW1hZ2VTZWN0aW9uSUQ9bnVsbDt9c3RhdGljIGZyb21GZWF0dXJlKHQsZSl7Y29uc3Qgcj1uZXcganU7Zm9yKGxldCBuPTA7bjx0LnNlY3Rpb25zLmxlbmd0aDtuKyspe2NvbnN0IGk9dC5zZWN0aW9uc1tuXTtpLmltYWdlP3IuYWRkSW1hZ2VTZWN0aW9uKGkpOnIuYWRkVGV4dFNlY3Rpb24oaSxlKTt9cmV0dXJuIHJ9bGVuZ3RoKCl7cmV0dXJuIHRoaXMudGV4dC5sZW5ndGh9Z2V0U2VjdGlvbih0KXtyZXR1cm4gdGhpcy5zZWN0aW9uc1t0aGlzLnNlY3Rpb25JbmRleFt0XV19Z2V0U2VjdGlvbkluZGV4KHQpe3JldHVybiB0aGlzLnNlY3Rpb25JbmRleFt0XX1nZXRDaGFyQ29kZSh0KXtyZXR1cm4gdGhpcy50ZXh0LmNoYXJDb2RlQXQodCl9dmVydGljYWxpemVQdW5jdHVhdGlvbigpe3RoaXMudGV4dD1mdW5jdGlvbih0KXtsZXQgZT1cIlwiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtjb25zdCBuPXQuY2hhckNvZGVBdChyKzEpfHxudWxsLGk9dC5jaGFyQ29kZUF0KHItMSl8fG51bGw7ZSs9biYmJGkobikmJiFudVt0W3IrMV1dfHxpJiYkaShpKSYmIW51W3Rbci0xXV18fCFudVt0W3JdXT90W3JdOm51W3Rbcl1dO31yZXR1cm4gZX0odGhpcy50ZXh0KTt9dHJpbSgpe2xldCB0PTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnRleHQubGVuZ3RoJiZVdVt0aGlzLnRleHQuY2hhckNvZGVBdChlKV07ZSsrKXQrKztsZXQgZT10aGlzLnRleHQubGVuZ3RoO2ZvcihsZXQgcj10aGlzLnRleHQubGVuZ3RoLTE7cj49MCYmcj49dCYmVXVbdGhpcy50ZXh0LmNoYXJDb2RlQXQocildO3ItLSllLS07dGhpcy50ZXh0PXRoaXMudGV4dC5zdWJzdHJpbmcodCxlKSx0aGlzLnNlY3Rpb25JbmRleD10aGlzLnNlY3Rpb25JbmRleC5zbGljZSh0LGUpO31zdWJzdHJpbmcodCxlKXtjb25zdCByPW5ldyBqdTtyZXR1cm4gci50ZXh0PXRoaXMudGV4dC5zdWJzdHJpbmcodCxlKSxyLnNlY3Rpb25JbmRleD10aGlzLnNlY3Rpb25JbmRleC5zbGljZSh0LGUpLHIuc2VjdGlvbnM9dGhpcy5zZWN0aW9ucyxyfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudGV4dH1nZXRNYXhTY2FsZSgpe3JldHVybiB0aGlzLnNlY3Rpb25JbmRleC5yZWR1Y2UoKCh0LGUpPT5NYXRoLm1heCh0LHRoaXMuc2VjdGlvbnNbZV0uc2NhbGUpKSwwKX1hZGRUZXh0U2VjdGlvbih0LGUpe3RoaXMudGV4dCs9dC50ZXh0LHRoaXMuc2VjdGlvbnMucHVzaChPdS5mb3JUZXh0KHQuc2NhbGUsdC5mb250U3RhY2t8fGUpKTtjb25zdCByPXRoaXMuc2VjdGlvbnMubGVuZ3RoLTE7Zm9yKGxldCBlPTA7ZTx0LnRleHQubGVuZ3RoOysrZSl0aGlzLnNlY3Rpb25JbmRleC5wdXNoKHIpO31hZGRJbWFnZVNlY3Rpb24odCl7Y29uc3QgZT10LmltYWdlP3QuaW1hZ2UubmFtZTpcIlwiO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gdm9pZCBBKFwiQ2FuJ3QgYWRkIEZvcm1hdHRlZFNlY3Rpb24gd2l0aCBhbiBlbXB0eSBpbWFnZS5cIik7Y29uc3Qgcj10aGlzLmdldE5leHRJbWFnZVNlY3Rpb25DaGFyQ29kZSgpO3I/KHRoaXMudGV4dCs9U3RyaW5nLmZyb21DaGFyQ29kZShyKSx0aGlzLnNlY3Rpb25zLnB1c2goT3UuZm9ySW1hZ2UoZSkpLHRoaXMuc2VjdGlvbkluZGV4LnB1c2godGhpcy5zZWN0aW9ucy5sZW5ndGgtMSkpOkEoXCJSZWFjaGVkIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyA2NDAxXCIpO31nZXROZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUoKXtyZXR1cm4gdGhpcy5pbWFnZVNlY3Rpb25JRD90aGlzLmltYWdlU2VjdGlvbklEPj02Mzc0Mz9udWxsOisrdGhpcy5pbWFnZVNlY3Rpb25JRDoodGhpcy5pbWFnZVNlY3Rpb25JRD01NzM0NCx0aGlzLmltYWdlU2VjdGlvbklEKX19ZnVuY3Rpb24gUnUoZSxyLG4saSxzLGEsbyxsLHUsYyxoLHAsZixkLHkpe2NvbnN0IG09anUuZnJvbUZlYXR1cmUoZSxzKTtsZXQgZztwPT09dC5haC52ZXJ0aWNhbCYmbS52ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKCk7Y29uc3R7cHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OngscHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0OnZ9PVJpO2lmKHgmJjE9PT1tLnNlY3Rpb25zLmxlbmd0aCl7Zz1bXTtjb25zdCB0PXgobS50b1N0cmluZygpLFl1KG0sYyxhLHIsaSxkKSk7Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1uZXcganU7dC50ZXh0PWUsdC5zZWN0aW9ucz1tLnNlY3Rpb25zO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXQuc2VjdGlvbkluZGV4LnB1c2goMCk7Zy5wdXNoKHQpO319ZWxzZSBpZih2KXtnPVtdO2NvbnN0IHQ9dihtLnRleHQsbS5zZWN0aW9uSW5kZXgsWXUobSxjLGEscixpLGQpKTtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PW5ldyBqdTt0LnRleHQ9ZVswXSx0LnNlY3Rpb25JbmRleD1lWzFdLHQuc2VjdGlvbnM9bS5zZWN0aW9ucyxnLnB1c2godCk7fX1lbHNlIGc9ZnVuY3Rpb24odCxlKXtjb25zdCByPVtdLG49dC50ZXh0O2xldCBpPTA7Zm9yKGNvbnN0IG4gb2YgZSlyLnB1c2godC5zdWJzdHJpbmcoaSxuKSksaT1uO3JldHVybiBpPG4ubGVuZ3RoJiZyLnB1c2godC5zdWJzdHJpbmcoaSxuLmxlbmd0aCkpLHJ9KG0sWXUobSxjLGEscixpLGQpKTtjb25zdCBiPVtdLHc9e3Bvc2l0aW9uZWRMaW5lczpiLHRleHQ6bS50b1N0cmluZygpLHRvcDpoWzFdLGJvdHRvbTpoWzFdLGxlZnQ6aFswXSxyaWdodDpoWzBdLHdyaXRpbmdNb2RlOnAsaWNvbnNJblRleHQ6ITEsdmVydGljYWxpemFibGU6ITF9O3JldHVybiBmdW5jdGlvbihlLHIsbixpLHMsYSxvLGwsdSxjLGgscCl7bGV0IGY9MCxkPUR1LHk9MCxtPTA7Y29uc3QgZz1cInJpZ2h0XCI9PT1sPzE6XCJsZWZ0XCI9PT1sPzA6LjU7bGV0IHg9MDtmb3IoY29uc3QgbyBvZiBzKXtvLnRyaW0oKTtjb25zdCBzPW8uZ2V0TWF4U2NhbGUoKSxsPShzLTEpKml1LGI9e3Bvc2l0aW9uZWRHbHlwaHM6W10sbGluZU9mZnNldDowfTtlLnBvc2l0aW9uZWRMaW5lc1t4XT1iO2NvbnN0IHc9Yi5wb3NpdGlvbmVkR2x5cGhzO2xldCBfPTA7aWYoIW8ubGVuZ3RoKCkpe2QrPWEsKyt4O2NvbnRpbnVlfWZvcihsZXQgYT0wO2E8by5sZW5ndGgoKTthKyspe2NvbnN0IHk9by5nZXRTZWN0aW9uKGEpLG09by5nZXRTZWN0aW9uSW5kZXgoYSksZz1vLmdldENoYXJDb2RlKGEpO2xldCB4PTAsYj1udWxsLEE9bnVsbCxTPW51bGwsaz1pdTtjb25zdCBNPSEodT09PXQuYWguaG9yaXpvbnRhbHx8IWgmJiFUaShnKXx8aCYmKFV1W2ddfHwodj1nLC9cXHB7c2M9QXJhYn0vdS50ZXN0KFN0cmluZy5mcm9tQ29kZVBvaW50KHYpKSkpKTtpZih5LmltYWdlTmFtZSl7Y29uc3QgdD1pW3kuaW1hZ2VOYW1lXTtpZighdCljb250aW51ZTtTPXkuaW1hZ2VOYW1lLGUuaWNvbnNJblRleHQ9ZS5pY29uc0luVGV4dHx8ITAsQT10LnBhZGRlZFJlY3Q7Y29uc3Qgcj10LmRpc3BsYXlTaXplO3kuc2NhbGU9eS5zY2FsZSppdS9wLGI9e3dpZHRoOnJbMF0saGVpZ2h0OnJbMV0sbGVmdDpGdSx0b3A6LVZ1LGFkdmFuY2U6TT9yWzFdOnJbMF19LHg9bCsoaXUtclsxXSp5LnNjYWxlKSxrPWIuYWR2YW5jZTtjb25zdCBuPU0/clswXSp5LnNjYWxlLWl1KnM6clsxXSp5LnNjYWxlLWl1KnM7bj4wJiZuPl8mJihfPW4pO31lbHNlIHtjb25zdCB0PW5beS5mb250U3RhY2tdLGU9dCYmdFtnXTtpZihlJiZlLnJlY3QpQT1lLnJlY3QsYj1lLm1ldHJpY3M7ZWxzZSB7Y29uc3QgdD1yW3kuZm9udFN0YWNrXSxlPXQmJnRbZ107aWYoIWUpY29udGludWU7Yj1lLm1ldHJpY3M7fXg9KHMteS5zY2FsZSkqaXU7fU0/KGUudmVydGljYWxpemFibGU9ITAsdy5wdXNoKHtnbHlwaDpnLGltYWdlTmFtZTpTLHg6Zix5OmQreCx2ZXJ0aWNhbDpNLHNjYWxlOnkuc2NhbGUsZm9udFN0YWNrOnkuZm9udFN0YWNrLHNlY3Rpb25JbmRleDptLG1ldHJpY3M6YixyZWN0OkF9KSxmKz1rKnkuc2NhbGUrYyk6KHcucHVzaCh7Z2x5cGg6ZyxpbWFnZU5hbWU6Uyx4OmYseTpkK3gsdmVydGljYWw6TSxzY2FsZTp5LnNjYWxlLGZvbnRTdGFjazp5LmZvbnRTdGFjayxzZWN0aW9uSW5kZXg6bSxtZXRyaWNzOmIscmVjdDpBfSksZis9Yi5hZHZhbmNlKnkuc2NhbGUrYyk7fTAhPT13Lmxlbmd0aCYmKHk9TWF0aC5tYXgoZi1jLHkpLFd1KHcsMCx3Lmxlbmd0aC0xLGcsXykpLGY9MDtjb25zdCBBPWEqcytfO2IubGluZU9mZnNldD1NYXRoLm1heChfLGwpLGQrPUEsbT1NYXRoLm1heChBLG0pLCsreDt9dmFyIHY7Y29uc3QgYj1kLUR1LHtob3Jpem9udGFsQWxpZ246dyx2ZXJ0aWNhbEFsaWduOl99PUp1KG8pOygoZnVuY3Rpb24odCxlLHIsbixpLHMsYSxvLGwpe2NvbnN0IHU9KGUtcikqaTtsZXQgYz0wO2M9cyE9PWE/LW8qbi1EdTooLW4qbCsuNSkqYTtmb3IoY29uc3QgZSBvZiB0KWZvcihjb25zdCB0IG9mIGUucG9zaXRpb25lZEdseXBocyl0LngrPXUsdC55Kz1jO30pKShlLnBvc2l0aW9uZWRMaW5lcyxnLHcsXyx5LG0sYSxiLHMubGVuZ3RoKSxlLnRvcCs9LV8qYixlLmJvdHRvbT1lLnRvcCtiLGUubGVmdCs9LXcqeSxlLnJpZ2h0PWUubGVmdCt5O30odyxyLG4saSxnLG8sbCx1LHAsYyxmLHkpLCFmdW5jdGlvbih0KXtmb3IoY29uc3QgZSBvZiB0KWlmKDAhPT1lLnBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoKXJldHVybiAhMTtyZXR1cm4gITB9KGIpJiZ3fWNvbnN0IFV1PXs5OiEwLDEwOiEwLDExOiEwLDEyOiEwLDEzOiEwLDMyOiEwfSxxdT17MTA6ITAsMzI6ITAsMzg6ITAsNDE6ITAsNDM6ITAsNDU6ITAsNDc6ITAsMTczOiEwLDE4MzohMCw4MjAzOiEwLDgyMDg6ITAsODIxMTohMCw4MjMxOiEwfSxOdT17NDA6ITB9O2Z1bmN0aW9uIFp1KHQsZSxyLG4saSxzKXtpZihlLmltYWdlTmFtZSl7Y29uc3QgdD1uW2UuaW1hZ2VOYW1lXTtyZXR1cm4gdD90LmRpc3BsYXlTaXplWzBdKmUuc2NhbGUqaXUvcytpOjB9e2NvbnN0IG49cltlLmZvbnRTdGFja10scz1uJiZuW3RdO3JldHVybiBzP3MubWV0cmljcy5hZHZhbmNlKmUuc2NhbGUraTowfX1mdW5jdGlvbiBHdSh0LGUscixuKXtjb25zdCBpPU1hdGgucG93KHQtZSwyKTtyZXR1cm4gbj90PGU/aS8yOjIqaTppK01hdGguYWJzKHIpKnJ9ZnVuY3Rpb24gS3UodCxlLHIpe2xldCBuPTA7cmV0dXJuIDEwPT09dCYmKG4tPTFlNCksciYmKG4rPTE1MCksNDAhPT10JiY2NTI4OCE9PXR8fChuKz01MCksNDEhPT1lJiY2NTI4OSE9PWV8fChuKz01MCksbn1mdW5jdGlvbiBYdSh0LGUscixuLGkscyl7bGV0IGE9bnVsbCxvPUd1KGUscixpLHMpO2Zvcihjb25zdCB0IG9mIG4pe2NvbnN0IG49R3UoZS10LngscixpLHMpK3QuYmFkbmVzcztuPD1vJiYoYT10LG89bik7fXJldHVybiB7aW5kZXg6dCx4OmUscHJpb3JCcmVhazphLGJhZG5lc3M6b319ZnVuY3Rpb24gSHUodCl7cmV0dXJuIHQ/SHUodC5wcmlvckJyZWFrKS5jb25jYXQodC5pbmRleCk6W119ZnVuY3Rpb24gWXUodCxlLHIsbixpLHMpe2lmKCF0KXJldHVybiBbXTtjb25zdCBhPVtdLG89ZnVuY3Rpb24odCxlLHIsbixpLHMpe2xldCBhPTA7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aCgpO3IrKyl7Y29uc3Qgbz10LmdldFNlY3Rpb24ocik7YSs9WnUodC5nZXRDaGFyQ29kZShyKSxvLG4saSxlLHMpO31yZXR1cm4gYS9NYXRoLm1heCgxLE1hdGguY2VpbChhL3IpKX0odCxlLHIsbixpLHMpLGw9dC50ZXh0LmluZGV4T2YoXCLigItcIik+PTA7bGV0IHU9MDtmb3IobGV0IHI9MDtyPHQubGVuZ3RoKCk7cisrKXtjb25zdCBoPXQuZ2V0U2VjdGlvbihyKSxwPXQuZ2V0Q2hhckNvZGUocik7aWYoVXVbcF18fCh1Kz1adShwLGgsbixpLGUscykpLHI8dC5sZW5ndGgoKS0xKXtjb25zdCBlPSEoKGM9cCk8MTE5MDQpJiYoISF6aVtcIkNKSyBDb21wYXRpYmlsaXR5IEZvcm1zXCJdKGMpfHwhIXppW1wiQ0pLIENvbXBhdGliaWxpdHlcIl0oYyl8fCEhemlbXCJDSksgU3Ryb2tlc1wiXShjKXx8ISF6aVtcIkNKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvblwiXShjKXx8ISF6aVtcIkVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHNcIl0oYyl8fCEhemlbXCJIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1wiXShjKXx8ISF6aVtcIklkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnNcIl0oYyl8fCEhemlbXCJWZXJ0aWNhbCBGb3Jtc1wiXShjKXx8RmkudGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludChjKSkpOyhxdVtwXXx8ZXx8aC5pbWFnZU5hbWV8fHIhPT10Lmxlbmd0aCgpLTImJk51W3QuZ2V0Q2hhckNvZGUocisxKV0pJiZhLnB1c2goWHUocisxLHUsbyxhLEt1KHAsdC5nZXRDaGFyQ29kZShyKzEpLGUmJmwpLCExKSk7fX12YXIgYztyZXR1cm4gSHUoWHUodC5sZW5ndGgoKSx1LG8sYSwwLCEwKSl9ZnVuY3Rpb24gSnUodCl7bGV0IGU9LjUscj0uNTtzd2l0Y2godCl7Y2FzZVwicmlnaHRcIjpjYXNlXCJ0b3AtcmlnaHRcIjpjYXNlXCJib3R0b20tcmlnaHRcIjplPTE7YnJlYWs7Y2FzZVwibGVmdFwiOmNhc2VcInRvcC1sZWZ0XCI6Y2FzZVwiYm90dG9tLWxlZnRcIjplPTA7fXN3aXRjaCh0KXtjYXNlXCJib3R0b21cIjpjYXNlXCJib3R0b20tcmlnaHRcIjpjYXNlXCJib3R0b20tbGVmdFwiOnI9MTticmVhaztjYXNlXCJ0b3BcIjpjYXNlXCJ0b3AtcmlnaHRcIjpjYXNlXCJ0b3AtbGVmdFwiOnI9MDt9cmV0dXJuIHtob3Jpem9udGFsQWxpZ246ZSx2ZXJ0aWNhbEFsaWduOnJ9fWZ1bmN0aW9uIFd1KHQsZSxyLG4saSl7aWYoIW4mJiFpKXJldHVybjtjb25zdCBzPXRbcl0sYT0odFtyXS54K3MubWV0cmljcy5hZHZhbmNlKnMuc2NhbGUpKm47Zm9yKGxldCBuPWU7bjw9cjtuKyspdFtuXS54LT1hLHRbbl0ueSs9aTt9ZnVuY3Rpb24gUXUodCxlLHIpe2NvbnN0e2hvcml6b250YWxBbGlnbjpuLHZlcnRpY2FsQWxpZ246aX09SnUocikscz1lWzBdLXQuZGlzcGxheVNpemVbMF0qbixhPWVbMV0tdC5kaXNwbGF5U2l6ZVsxXSppO3JldHVybiB7aW1hZ2U6dCx0b3A6YSxib3R0b206YSt0LmRpc3BsYXlTaXplWzFdLGxlZnQ6cyxyaWdodDpzK3QuZGlzcGxheVNpemVbMF19fWZ1bmN0aW9uIHRjKHQpe3ZhciBlLHI7bGV0IG49dC5sZWZ0LGk9dC50b3Ascz10LnJpZ2h0LW4sYT10LmJvdHRvbS1pO2NvbnN0IG89bnVsbCE9PShlPXQuaW1hZ2UudGV4dEZpdFdpZHRoKSYmdm9pZCAwIT09ZT9lOlwic3RyZXRjaE9yU2hyaW5rXCIsbD1udWxsIT09KHI9dC5pbWFnZS50ZXh0Rml0SGVpZ2h0KSYmdm9pZCAwIT09cj9yOlwic3RyZXRjaE9yU2hyaW5rXCIsdT0odC5pbWFnZS5jb250ZW50WzJdLXQuaW1hZ2UuY29udGVudFswXSkvKHQuaW1hZ2UuY29udGVudFszXS10LmltYWdlLmNvbnRlbnRbMV0pO2lmKFwicHJvcG9ydGlvbmFsXCI9PT1sKXtpZihcInN0cmV0Y2hPbmx5XCI9PT1vJiZzL2E8dXx8XCJwcm9wb3J0aW9uYWxcIj09PW8pe2NvbnN0IHQ9TWF0aC5jZWlsKGEqdSk7bio9dC9zLHM9dDt9fWVsc2UgaWYoXCJwcm9wb3J0aW9uYWxcIj09PW8mJlwic3RyZXRjaE9ubHlcIj09PWwmJjAhPT11JiZzL2E+dSl7Y29uc3QgdD1NYXRoLmNlaWwocy91KTtpKj10L2EsYT10O31yZXR1cm4ge3gxOm4seTE6aSx4MjpuK3MseTI6aSthfX1mdW5jdGlvbiBlYyh0LGUscixuLGkscyl7Y29uc3QgYT10LmltYWdlO2xldCBvO2lmKGEuY29udGVudCl7Y29uc3QgdD1hLmNvbnRlbnQsZT1hLnBpeGVsUmF0aW98fDE7bz1bdFswXS9lLHRbMV0vZSxhLmRpc3BsYXlTaXplWzBdLXRbMl0vZSxhLmRpc3BsYXlTaXplWzFdLXRbM10vZV07fWNvbnN0IGw9ZS5sZWZ0KnMsdT1lLnJpZ2h0KnM7bGV0IGMsaCxwLGY7XCJ3aWR0aFwiPT09cnx8XCJib3RoXCI9PT1yPyhmPWlbMF0rbC1uWzNdLGg9aVswXSt1K25bMV0pOihmPWlbMF0rKGwrdS1hLmRpc3BsYXlTaXplWzBdKS8yLGg9ZithLmRpc3BsYXlTaXplWzBdKTtjb25zdCBkPWUudG9wKnMseT1lLmJvdHRvbSpzO3JldHVybiBcImhlaWdodFwiPT09cnx8XCJib3RoXCI9PT1yPyhjPWlbMV0rZC1uWzBdLHA9aVsxXSt5K25bMl0pOihjPWlbMV0rKGQreS1hLmRpc3BsYXlTaXplWzFdKS8yLHA9YythLmRpc3BsYXlTaXplWzFdKSx7aW1hZ2U6YSx0b3A6YyxyaWdodDpoLGJvdHRvbTpwLGxlZnQ6Zixjb2xsaXNpb25QYWRkaW5nOm99fWNvbnN0IHJjPTI1NSxuYz0xMjgsaWM9cmMqbmM7ZnVuY3Rpb24gc2ModCxlKXtjb25zdHtleHByZXNzaW9uOnJ9PWU7aWYoXCJjb25zdGFudFwiPT09ci5raW5kKXJldHVybiB7a2luZDpcImNvbnN0YW50XCIsbGF5b3V0U2l6ZTpyLmV2YWx1YXRlKG5ldyBVaSh0KzEpKX07aWYoXCJzb3VyY2VcIj09PXIua2luZClyZXR1cm4ge2tpbmQ6XCJzb3VyY2VcIn07e2NvbnN0e3pvb21TdG9wczplLGludGVycG9sYXRpb25UeXBlOm59PXI7bGV0IGk9MDtmb3IoO2k8ZS5sZW5ndGgmJmVbaV08PXQ7KWkrKztpPU1hdGgubWF4KDAsaS0xKTtsZXQgcz1pO2Zvcig7czxlLmxlbmd0aCYmZVtzXTx0KzE7KXMrKztzPU1hdGgubWluKGUubGVuZ3RoLTEscyk7Y29uc3QgYT1lW2ldLG89ZVtzXTtyZXR1cm4gXCJjb21wb3NpdGVcIj09PXIua2luZD97a2luZDpcImNvbXBvc2l0ZVwiLG1pblpvb206YSxtYXhab29tOm8saW50ZXJwb2xhdGlvblR5cGU6bn06e2tpbmQ6XCJjYW1lcmFcIixtaW5ab29tOmEsbWF4Wm9vbTpvLG1pblNpemU6ci5ldmFsdWF0ZShuZXcgVWkoYSkpLG1heFNpemU6ci5ldmFsdWF0ZShuZXcgVWkobykpLGludGVycG9sYXRpb25UeXBlOm59fX1mdW5jdGlvbiBhYyh0LGUscil7bGV0IG49XCJuZXZlclwiO2NvbnN0IGk9dC5nZXQoZSk7cmV0dXJuIGk/bj1pOnQuZ2V0KHIpJiYobj1cImFsd2F5c1wiKSxufWNvbnN0IG9jPWZsLlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzLGxjPVt7bmFtZTpcImFfZmFkZV9vcGFjaXR5XCIsY29tcG9uZW50czoxLHR5cGU6XCJVaW50OFwiLG9mZnNldDowfV07ZnVuY3Rpb24gdWModCxlLHIsbixpLHMsYSxvLGwsdSxjLGgscCl7Y29uc3QgZj1vP01hdGgubWluKGljLE1hdGgucm91bmQob1swXSkpOjAsZD1vP01hdGgubWluKGljLE1hdGgucm91bmQob1sxXSkpOjA7dC5lbXBsYWNlQmFjayhlLHIsTWF0aC5yb3VuZCgzMipuKSxNYXRoLnJvdW5kKDMyKmkpLHMsYSwoZjw8MSkrKGw/MTowKSxkLDE2KnUsMTYqYywyNTYqaCwyNTYqcCk7fWZ1bmN0aW9uIGNjKHQsZSxyKXt0LmVtcGxhY2VCYWNrKGUueCxlLnksciksdC5lbXBsYWNlQmFjayhlLngsZS55LHIpLHQuZW1wbGFjZUJhY2soZS54LGUueSxyKSx0LmVtcGxhY2VCYWNrKGUueCxlLnkscik7fWZ1bmN0aW9uIGhjKHQpe2Zvcihjb25zdCBlIG9mIHQuc2VjdGlvbnMpaWYoamkoZS50ZXh0KSlyZXR1cm4gITA7cmV0dXJuICExfWNsYXNzIHBje2NvbnN0cnVjdG9yKHQpe3RoaXMubGF5b3V0VmVydGV4QXJyYXk9bmV3IFdzLHRoaXMuaW5kZXhBcnJheT1uZXcgbmEsdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnM9dCx0aGlzLnNlZ21lbnRzPW5ldyBvYSx0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheT1uZXcgUXMsdGhpcy5vcGFjaXR5VmVydGV4QXJyYXk9bmV3IHRhLHRoaXMuaGFzVmlzaWJsZVZlcnRpY2VzPSExLHRoaXMucGxhY2VkU3ltYm9sQXJyYXk9bmV3ICRzO31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCYmMD09PXRoaXMuaW5kZXhBcnJheS5sZW5ndGgmJjA9PT10aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgmJjA9PT10aGlzLm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGh9dXBsb2FkKHQsZSxyLG4pe3RoaXMuaXNFbXB0eSgpfHwociYmKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyPXQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksSmwubWVtYmVycyksdGhpcy5pbmRleEJ1ZmZlcj10LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSxlKSx0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXksV2wubWVtYmVycywhMCksdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyPXQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMub3BhY2l0eVZlcnRleEFycmF5LGxjLCEwKSx0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIuaXRlbVNpemU9MSksKHJ8fG4pJiZ0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQodCkpO31kZXN0cm95KCl7dGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXImJih0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpLHRoaXMuc2VnbWVudHMuZGVzdHJveSgpLHRoaXMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyLmRlc3Ryb3koKSk7fX13aShcIlN5bWJvbEJ1ZmZlcnNcIixwYyk7Y2xhc3MgZmN7Y29uc3RydWN0b3IodCxlLHIpe3RoaXMubGF5b3V0VmVydGV4QXJyYXk9bmV3IHQsdGhpcy5sYXlvdXRBdHRyaWJ1dGVzPWUsdGhpcy5pbmRleEFycmF5PW5ldyByLHRoaXMuc2VnbWVudHM9bmV3IG9hLHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXk9bmV3IHJhO311cGxvYWQodCl7dGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSx0aGlzLmxheW91dEF0dHJpYnV0ZXMpLHRoaXMuaW5kZXhCdWZmZXI9dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpLHRoaXMuY29sbGlzaW9uVmVydGV4QnVmZmVyPXQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXksUWwubWVtYmVycywhMCk7fWRlc3Ryb3koKXt0aGlzLmxheW91dFZlcnRleEJ1ZmZlciYmKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKSx0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlci5kZXN0cm95KCkpO319d2koXCJDb2xsaXNpb25CdWZmZXJzXCIsZmMpO2NsYXNzIGRje2NvbnN0cnVjdG9yKGUpe3RoaXMuY29sbGlzaW9uQm94QXJyYXk9ZS5jb2xsaXNpb25Cb3hBcnJheSx0aGlzLnpvb209ZS56b29tLHRoaXMub3ZlcnNjYWxpbmc9ZS5vdmVyc2NhbGluZyx0aGlzLmxheWVycz1lLmxheWVycyx0aGlzLmxheWVySWRzPXRoaXMubGF5ZXJzLm1hcCgodD0+dC5pZCkpLHRoaXMuaW5kZXg9ZS5pbmRleCx0aGlzLnBpeGVsUmF0aW89ZS5waXhlbFJhdGlvLHRoaXMuc291cmNlTGF5ZXJJbmRleD1lLnNvdXJjZUxheWVySW5kZXgsdGhpcy5oYXNQYXR0ZXJuPSExLHRoaXMuaGFzUlRMVGV4dD0hMSx0aGlzLnNvcnRLZXlSYW5nZXM9W10sdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheT1bXSx0aGlzLnBsYWNlbWVudEludlByb2pNYXRyaXg9bG8oW10pLHRoaXMucGxhY2VtZW50Vmlld3BvcnRNYXRyaXg9bG8oW10pO2NvbnN0IHI9dGhpcy5sYXllcnNbMF0uX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXM7dGhpcy50ZXh0U2l6ZURhdGE9c2ModGhpcy56b29tLHJbXCJ0ZXh0LXNpemVcIl0pLHRoaXMuaWNvblNpemVEYXRhPXNjKHRoaXMuem9vbSxyW1wiaWNvbi1zaXplXCJdKTtjb25zdCBuPXRoaXMubGF5ZXJzWzBdLmxheW91dCxpPW4uZ2V0KFwic3ltYm9sLXNvcnQta2V5XCIpLHM9bi5nZXQoXCJzeW1ib2wtei1vcmRlclwiKTt0aGlzLmNhbk92ZXJsYXA9XCJuZXZlclwiIT09YWMobixcInRleHQtb3ZlcmxhcFwiLFwidGV4dC1hbGxvdy1vdmVybGFwXCIpfHxcIm5ldmVyXCIhPT1hYyhuLFwiaWNvbi1vdmVybGFwXCIsXCJpY29uLWFsbG93LW92ZXJsYXBcIil8fG4uZ2V0KFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCIpfHxuLmdldChcImljb24taWdub3JlLXBsYWNlbWVudFwiKSx0aGlzLnNvcnRGZWF0dXJlc0J5S2V5PVwidmlld3BvcnQteVwiIT09cyYmIWkuaXNDb25zdGFudCgpLHRoaXMuc29ydEZlYXR1cmVzQnlZPShcInZpZXdwb3J0LXlcIj09PXN8fFwiYXV0b1wiPT09cyYmIXRoaXMuc29ydEZlYXR1cmVzQnlLZXkpJiZ0aGlzLmNhbk92ZXJsYXAsXCJwb2ludFwiPT09bi5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpJiYodGhpcy53cml0aW5nTW9kZXM9bi5nZXQoXCJ0ZXh0LXdyaXRpbmctbW9kZVwiKS5tYXAoKGU9PnQuYWhbZV0pKSksdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzPXRoaXMubGF5ZXJzLmZpbHRlcigodD0+dC5pc1N0YXRlRGVwZW5kZW50KCkpKS5tYXAoKHQ9PnQuaWQpKSx0aGlzLnNvdXJjZUlEPWUuc291cmNlSUQ7fWNyZWF0ZUFycmF5cygpe3RoaXMudGV4dD1uZXcgcGMobmV3IEVhKHRoaXMubGF5ZXJzLHRoaXMuem9vbSwodD0+L150ZXh0Ly50ZXN0KHQpKSkpLHRoaXMuaWNvbj1uZXcgcGMobmV3IEVhKHRoaXMubGF5ZXJzLHRoaXMuem9vbSwodD0+L15pY29uLy50ZXN0KHQpKSkpLHRoaXMuZ2x5cGhPZmZzZXRBcnJheT1uZXcgT3MsdGhpcy5saW5lVmVydGV4QXJyYXk9bmV3IGpzLHRoaXMuc3ltYm9sSW5zdGFuY2VzPW5ldyBEcyx0aGlzLnRleHRBbmNob3JPZmZzZXRzPW5ldyBVczt9Y2FsY3VsYXRlR2x5cGhEZXBlbmRlbmNpZXModCxlLHIsbixpKXtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKylpZihlW3QuY2hhckNvZGVBdChzKV09ITAsKHJ8fG4pJiZpKXtjb25zdCByPW51W3QuY2hhckF0KHMpXTtyJiYoZVtyLmNoYXJDb2RlQXQoMCldPSEwKTt9fXBvcHVsYXRlKGUscixuKXtjb25zdCBpPXRoaXMubGF5ZXJzWzBdLHM9aS5sYXlvdXQsYT1zLmdldChcInRleHQtZm9udFwiKSxvPXMuZ2V0KFwidGV4dC1maWVsZFwiKSxsPXMuZ2V0KFwiaWNvbi1pbWFnZVwiKSx1PShcImNvbnN0YW50XCIhPT1vLnZhbHVlLmtpbmR8fG8udmFsdWUudmFsdWUgaW5zdGFuY2VvZiBZdCYmIW8udmFsdWUudmFsdWUuaXNFbXB0eSgpfHxvLnZhbHVlLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoPjApJiYoXCJjb25zdGFudFwiIT09YS52YWx1ZS5raW5kfHxhLnZhbHVlLnZhbHVlLmxlbmd0aD4wKSxjPVwiY29uc3RhbnRcIiE9PWwudmFsdWUua2luZHx8ISFsLnZhbHVlLnZhbHVlfHxPYmplY3Qua2V5cyhsLnBhcmFtZXRlcnMpLmxlbmd0aD4wLGg9cy5nZXQoXCJzeW1ib2wtc29ydC1rZXlcIik7aWYodGhpcy5mZWF0dXJlcz1bXSwhdSYmIWMpcmV0dXJuO2NvbnN0IHA9ci5pY29uRGVwZW5kZW5jaWVzLGY9ci5nbHlwaERlcGVuZGVuY2llcyxkPXIuYXZhaWxhYmxlSW1hZ2VzLHk9bmV3IFVpKHRoaXMuem9vbSk7Zm9yKGNvbnN0e2ZlYXR1cmU6cixpZDpvLGluZGV4Omwsc291cmNlTGF5ZXJJbmRleDptfW9mIGUpe2NvbnN0IGU9aS5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnksZz1qYShyLGUpO2lmKCFpLl9mZWF0dXJlRmlsdGVyLmZpbHRlcih5LGcsbikpY29udGludWU7bGV0IHgsdjtpZihlfHwoZy5nZW9tZXRyeT1PYShyKSksdSl7Y29uc3QgdD1pLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucyhcInRleHQtZmllbGRcIixnLG4sZCksZT1ZdC5mYWN0b3J5KHQpLHI9dGhpcy5oYXNSVExUZXh0PXRoaXMuaGFzUlRMVGV4dHx8aGMoZSk7KCFyfHxcInVuYXZhaWxhYmxlXCI9PT1SaS5nZXRSVExUZXh0UGx1Z2luU3RhdHVzKCl8fHImJlJpLmlzUGFyc2VkKCkpJiYoeD1ydShlLGksZykpO31pZihjKXtjb25zdCB0PWkuZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKFwiaWNvbi1pbWFnZVwiLGcsbixkKTt2PXQgaW5zdGFuY2VvZiB0ZT90OnRlLmZyb21TdHJpbmcodCk7fWlmKCF4JiYhdiljb250aW51ZTtjb25zdCBiPXRoaXMuc29ydEZlYXR1cmVzQnlLZXk/aC5ldmFsdWF0ZShnLHt9LG4pOnZvaWQgMDtpZih0aGlzLmZlYXR1cmVzLnB1c2goe2lkOm8sdGV4dDp4LGljb246dixpbmRleDpsLHNvdXJjZUxheWVySW5kZXg6bSxnZW9tZXRyeTpnLmdlb21ldHJ5LHByb3BlcnRpZXM6ci5wcm9wZXJ0aWVzLHR5cGU6b2Nbci50eXBlXSxzb3J0S2V5OmJ9KSx2JiYocFt2Lm5hbWVdPSEwKSx4KXtjb25zdCBlPWEuZXZhbHVhdGUoZyx7fSxuKS5qb2luKFwiLFwiKSxyPVwidmlld3BvcnRcIiE9PXMuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIikmJlwicG9pbnRcIiE9PXMuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKTt0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQ9dGhpcy53cml0aW5nTW9kZXMmJnRoaXMud3JpdGluZ01vZGVzLmluZGV4T2YodC5haC52ZXJ0aWNhbCk+PTA7Zm9yKGNvbnN0IHQgb2YgeC5zZWN0aW9ucylpZih0LmltYWdlKXBbdC5pbWFnZS5uYW1lXT0hMDtlbHNlIHtjb25zdCBuPVBpKHgudG9TdHJpbmcoKSksaT10LmZvbnRTdGFja3x8ZSxzPWZbaV09ZltpXXx8e307dGhpcy5jYWxjdWxhdGVHbHlwaERlcGVuZGVuY2llcyh0LnRleHQscyxyLHRoaXMuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCxuKTt9fX1cImxpbmVcIj09PXMuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSYmKHRoaXMuZmVhdHVyZXM9ZnVuY3Rpb24odCl7Y29uc3QgZT17fSxyPXt9LG49W107bGV0IGk9MDtmdW5jdGlvbiBzKGUpe24ucHVzaCh0W2VdKSxpKys7fWZ1bmN0aW9uIGEodCxlLGkpe2NvbnN0IHM9clt0XTtyZXR1cm4gZGVsZXRlIHJbdF0scltlXT1zLG5bc10uZ2VvbWV0cnlbMF0ucG9wKCksbltzXS5nZW9tZXRyeVswXT1uW3NdLmdlb21ldHJ5WzBdLmNvbmNhdChpWzBdKSxzfWZ1bmN0aW9uIG8odCxyLGkpe2NvbnN0IHM9ZVtyXTtyZXR1cm4gZGVsZXRlIGVbcl0sZVt0XT1zLG5bc10uZ2VvbWV0cnlbMF0uc2hpZnQoKSxuW3NdLmdlb21ldHJ5WzBdPWlbMF0uY29uY2F0KG5bc10uZ2VvbWV0cnlbMF0pLHN9ZnVuY3Rpb24gbCh0LGUscil7Y29uc3Qgbj1yP2VbMF1bZVswXS5sZW5ndGgtMV06ZVswXVswXTtyZXR1cm4gYCR7dH06JHtuLnh9OiR7bi55fWB9Zm9yKGxldCB1PTA7dTx0Lmxlbmd0aDt1Kyspe2NvbnN0IGM9dFt1XSxoPWMuZ2VvbWV0cnkscD1jLnRleHQ/Yy50ZXh0LnRvU3RyaW5nKCk6bnVsbDtpZighcCl7cyh1KTtjb250aW51ZX1jb25zdCBmPWwocCxoKSxkPWwocCxoLCEwKTtpZihmIGluIHImJmQgaW4gZSYmcltmXSE9PWVbZF0pe2NvbnN0IHQ9byhmLGQsaCksaT1hKGYsZCxuW3RdLmdlb21ldHJ5KTtkZWxldGUgZVtmXSxkZWxldGUgcltkXSxyW2wocCxuW2ldLmdlb21ldHJ5LCEwKV09aSxuW3RdLmdlb21ldHJ5PW51bGw7fWVsc2UgZiBpbiByP2EoZixkLGgpOmQgaW4gZT9vKGYsZCxoKToocyh1KSxlW2ZdPWktMSxyW2RdPWktMSk7fXJldHVybiBuLmZpbHRlcigodD0+dC5nZW9tZXRyeSkpfSh0aGlzLmZlYXR1cmVzKSksdGhpcy5zb3J0RmVhdHVyZXNCeUtleSYmdGhpcy5mZWF0dXJlcy5zb3J0KCgodCxlKT0+dC5zb3J0S2V5LWUuc29ydEtleSkpO311cGRhdGUodCxlLHIpe3RoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoJiYodGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyh0LGUsdGhpcy5sYXllcnMsciksdGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyh0LGUsdGhpcy5sYXllcnMscikpO31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGgmJiF0aGlzLmhhc1JUTFRleHR9dXBsb2FkUGVuZGluZygpe3JldHVybiAhdGhpcy51cGxvYWRlZHx8dGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZHx8dGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZH11cGxvYWQodCl7IXRoaXMudXBsb2FkZWQmJnRoaXMuaGFzRGVidWdEYXRhKCkmJih0aGlzLnRleHRDb2xsaXNpb25Cb3gudXBsb2FkKHQpLHRoaXMuaWNvbkNvbGxpc2lvbkJveC51cGxvYWQodCkpLHRoaXMudGV4dC51cGxvYWQodCx0aGlzLnNvcnRGZWF0dXJlc0J5WSwhdGhpcy51cGxvYWRlZCx0aGlzLnRleHQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkKSx0aGlzLmljb24udXBsb2FkKHQsdGhpcy5zb3J0RmVhdHVyZXNCeVksIXRoaXMudXBsb2FkZWQsdGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCksdGhpcy51cGxvYWRlZD0hMDt9ZGVzdHJveURlYnVnRGF0YSgpe3RoaXMudGV4dENvbGxpc2lvbkJveC5kZXN0cm95KCksdGhpcy5pY29uQ29sbGlzaW9uQm94LmRlc3Ryb3koKTt9ZGVzdHJveSgpe3RoaXMudGV4dC5kZXN0cm95KCksdGhpcy5pY29uLmRlc3Ryb3koKSx0aGlzLmhhc0RlYnVnRGF0YSgpJiZ0aGlzLmRlc3Ryb3lEZWJ1Z0RhdGEoKTt9YWRkVG9MaW5lVmVydGV4QXJyYXkodCxlKXtjb25zdCByPXRoaXMubGluZVZlcnRleEFycmF5Lmxlbmd0aDtpZih2b2lkIDAhPT10LnNlZ21lbnQpe2xldCByPXQuZGlzdChlW3Quc2VnbWVudCsxXSksbj10LmRpc3QoZVt0LnNlZ21lbnRdKTtjb25zdCBpPXt9O2ZvcihsZXQgbj10LnNlZ21lbnQrMTtuPGUubGVuZ3RoO24rKylpW25dPXt4OmVbbl0ueCx5OmVbbl0ueSx0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcjpyfSxuPGUubGVuZ3RoLTEmJihyKz1lW24rMV0uZGlzdChlW25dKSk7Zm9yKGxldCByPXQuc2VnbWVudHx8MDtyPj0wO3ItLSlpW3JdPXt4OmVbcl0ueCx5OmVbcl0ueSx0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcjpufSxyPjAmJihuKz1lW3ItMV0uZGlzdChlW3JdKSk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IGU9aVt0XTt0aGlzLmxpbmVWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhlLngsZS55LGUudGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IpO319cmV0dXJuIHtsaW5lU3RhcnRJbmRleDpyLGxpbmVMZW5ndGg6dGhpcy5saW5lVmVydGV4QXJyYXkubGVuZ3RoLXJ9fWFkZFN5bWJvbHMoZSxyLG4saSxzLGEsbyxsLHUsYyxoLHApe2NvbnN0IGY9ZS5pbmRleEFycmF5LGQ9ZS5sYXlvdXRWZXJ0ZXhBcnJheSx5PWUuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCpyLmxlbmd0aCxkLGYsdGhpcy5jYW5PdmVybGFwP2Euc29ydEtleTp2b2lkIDApLG09dGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCxnPXkudmVydGV4TGVuZ3RoLHg9dGhpcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50JiZvPT09dC5haC52ZXJ0aWNhbD9NYXRoLlBJLzI6MCx2PWEudGV4dCYmYS50ZXh0LnNlY3Rpb25zO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXtjb25zdHt0bDppLHRyOnMsYmw6byxicjp1LHRleDpjLHBpeGVsT2Zmc2V0VEw6aCxwaXhlbE9mZnNldEJSOm0sbWluRm9udFNjYWxlWDpnLG1pbkZvbnRTY2FsZVk6YixnbHlwaE9mZnNldDp3LGlzU0RGOl8sc2VjdGlvbkluZGV4OkF9PXJbdF0sUz15LnZlcnRleExlbmd0aCxrPXdbMV07dWMoZCxsLngsbC55LGkueCxrK2kueSxjLngsYy55LG4sXyxoLngsaC55LGcsYiksdWMoZCxsLngsbC55LHMueCxrK3MueSxjLngrYy53LGMueSxuLF8sbS54LGgueSxnLGIpLHVjKGQsbC54LGwueSxvLngsaytvLnksYy54LGMueStjLmgsbixfLGgueCxtLnksZyxiKSx1YyhkLGwueCxsLnksdS54LGsrdS55LGMueCtjLncsYy55K2MuaCxuLF8sbS54LG0ueSxnLGIpLGNjKGUuZHluYW1pY0xheW91dFZlcnRleEFycmF5LGwseCksZi5lbXBsYWNlQmFjayhTLFMrMSxTKzIpLGYuZW1wbGFjZUJhY2soUysxLFMrMixTKzMpLHkudmVydGV4TGVuZ3RoKz00LHkucHJpbWl0aXZlTGVuZ3RoKz0yLHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5lbXBsYWNlQmFjayh3WzBdKSx0IT09ci5sZW5ndGgtMSYmQT09PXJbdCsxXS5zZWN0aW9uSW5kZXh8fGUucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXMoZC5sZW5ndGgsYSxhLmluZGV4LHt9LHAsdiYmdltBXSk7fWUucGxhY2VkU3ltYm9sQXJyYXkuZW1wbGFjZUJhY2sobC54LGwueSxtLHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5sZW5ndGgtbSxnLHUsYyxsLnNlZ21lbnQsbj9uWzBdOjAsbj9uWzFdOjAsaVswXSxpWzFdLG8sMCwhMSwwLGgpO31fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgodCxlLHIsbixpLHMpe3JldHVybiBlLmVtcGxhY2VCYWNrKDAsMCksdC5lbXBsYWNlQmFjayhyLngsci55LG4saSxNYXRoLnJvdW5kKHMueCksTWF0aC5yb3VuZChzLnkpKX1hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKHQsZSxyLG4saSxhLG8pe2NvbnN0IGw9aS5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LGkubGF5b3V0VmVydGV4QXJyYXksaS5pbmRleEFycmF5KSx1PWwudmVydGV4TGVuZ3RoLGM9aS5sYXlvdXRWZXJ0ZXhBcnJheSxoPWkuY29sbGlzaW9uVmVydGV4QXJyYXkscD1vLmFuY2hvclgsZj1vLmFuY2hvclk7dGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgoYyxoLGEscCxmLG5ldyBzKHQsZSkpLHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KGMsaCxhLHAsZixuZXcgcyhyLGUpKSx0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChjLGgsYSxwLGYsbmV3IHMocixuKSksdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgoYyxoLGEscCxmLG5ldyBzKHQsbikpLGwudmVydGV4TGVuZ3RoKz00O2NvbnN0IGQ9aS5pbmRleEFycmF5O2QuZW1wbGFjZUJhY2sodSx1KzEpLGQuZW1wbGFjZUJhY2sodSsxLHUrMiksZC5lbXBsYWNlQmFjayh1KzIsdSszKSxkLmVtcGxhY2VCYWNrKHUrMyx1KSxsLnByaW1pdGl2ZUxlbmd0aCs9NDt9YWRkRGVidWdDb2xsaXNpb25Cb3hlcyh0LGUscixuKXtmb3IobGV0IGk9dDtpPGU7aSsrKXtjb25zdCB0PXRoaXMuY29sbGlzaW9uQm94QXJyYXkuZ2V0KGkpO3RoaXMuYWRkQ29sbGlzaW9uRGVidWdWZXJ0aWNlcyh0LngxLHQueTEsdC54Mix0LnkyLG4/dGhpcy50ZXh0Q29sbGlzaW9uQm94OnRoaXMuaWNvbkNvbGxpc2lvbkJveCx0LmFuY2hvclBvaW50LHIpO319Z2VuZXJhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnMoKXt0aGlzLmhhc0RlYnVnRGF0YSgpJiZ0aGlzLmRlc3Ryb3lEZWJ1Z0RhdGEoKSx0aGlzLnRleHRDb2xsaXNpb25Cb3g9bmV3IGZjKGVhLHR1Lm1lbWJlcnMsaWEpLHRoaXMuaWNvbkNvbGxpc2lvbkJveD1uZXcgZmMoZWEsdHUubWVtYmVycyxpYSk7Zm9yKGxldCB0PTA7dDx0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7dCsrKXtjb25zdCBlPXRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldCh0KTt0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMoZS50ZXh0Qm94U3RhcnRJbmRleCxlLnRleHRCb3hFbmRJbmRleCxlLCEwKSx0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMoZS52ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LGUudmVydGljYWxUZXh0Qm94RW5kSW5kZXgsZSwhMCksdGhpcy5hZGREZWJ1Z0NvbGxpc2lvbkJveGVzKGUuaWNvbkJveFN0YXJ0SW5kZXgsZS5pY29uQm94RW5kSW5kZXgsZSwhMSksdGhpcy5hZGREZWJ1Z0NvbGxpc2lvbkJveGVzKGUudmVydGljYWxJY29uQm94U3RhcnRJbmRleCxlLnZlcnRpY2FsSWNvbkJveEVuZEluZGV4LGUsITEpO319X2Rlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXNGb3JTeW1ib2wodCxlLHIsbixpLHMsYSxvLGwpe2NvbnN0IHU9e307Zm9yKGxldCBuPWU7bjxyO24rKyl7Y29uc3QgZT10LmdldChuKTt1LnRleHRCb3g9e3gxOmUueDEseTE6ZS55MSx4MjplLngyLHkyOmUueTIsYW5jaG9yUG9pbnRYOmUuYW5jaG9yUG9pbnRYLGFuY2hvclBvaW50WTplLmFuY2hvclBvaW50WX0sdS50ZXh0RmVhdHVyZUluZGV4PWUuZmVhdHVyZUluZGV4O2JyZWFrfWZvcihsZXQgZT1uO2U8aTtlKyspe2NvbnN0IHI9dC5nZXQoZSk7dS52ZXJ0aWNhbFRleHRCb3g9e3gxOnIueDEseTE6ci55MSx4MjpyLngyLHkyOnIueTIsYW5jaG9yUG9pbnRYOnIuYW5jaG9yUG9pbnRYLGFuY2hvclBvaW50WTpyLmFuY2hvclBvaW50WX0sdS52ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXg9ci5mZWF0dXJlSW5kZXg7YnJlYWt9Zm9yKGxldCBlPXM7ZTxhO2UrKyl7Y29uc3Qgcj10LmdldChlKTt1Lmljb25Cb3g9e3gxOnIueDEseTE6ci55MSx4MjpyLngyLHkyOnIueTIsYW5jaG9yUG9pbnRYOnIuYW5jaG9yUG9pbnRYLGFuY2hvclBvaW50WTpyLmFuY2hvclBvaW50WX0sdS5pY29uRmVhdHVyZUluZGV4PXIuZmVhdHVyZUluZGV4O2JyZWFrfWZvcihsZXQgZT1vO2U8bDtlKyspe2NvbnN0IHI9dC5nZXQoZSk7dS52ZXJ0aWNhbEljb25Cb3g9e3gxOnIueDEseTE6ci55MSx4MjpyLngyLHkyOnIueTIsYW5jaG9yUG9pbnRYOnIuYW5jaG9yUG9pbnRYLGFuY2hvclBvaW50WTpyLmFuY2hvclBvaW50WX0sdS52ZXJ0aWNhbEljb25GZWF0dXJlSW5kZXg9ci5mZWF0dXJlSW5kZXg7YnJlYWt9cmV0dXJuIHV9ZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyh0KXt0aGlzLmNvbGxpc2lvbkFycmF5cz1bXTtmb3IobGV0IGU9MDtlPHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDtlKyspe2NvbnN0IHI9dGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KGUpO3RoaXMuY29sbGlzaW9uQXJyYXlzLnB1c2godGhpcy5fZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlc0ZvclN5bWJvbCh0LHIudGV4dEJveFN0YXJ0SW5kZXgsci50ZXh0Qm94RW5kSW5kZXgsci52ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LHIudmVydGljYWxUZXh0Qm94RW5kSW5kZXgsci5pY29uQm94U3RhcnRJbmRleCxyLmljb25Cb3hFbmRJbmRleCxyLnZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXgsci52ZXJ0aWNhbEljb25Cb3hFbmRJbmRleCkpO319aGFzVGV4dERhdGEoKXtyZXR1cm4gdGhpcy50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aD4wfWhhc0ljb25EYXRhKCl7cmV0dXJuIHRoaXMuaWNvbi5zZWdtZW50cy5nZXQoKS5sZW5ndGg+MH1oYXNEZWJ1Z0RhdGEoKXtyZXR1cm4gdGhpcy50ZXh0Q29sbGlzaW9uQm94JiZ0aGlzLmljb25Db2xsaXNpb25Cb3h9aGFzVGV4dENvbGxpc2lvbkJveERhdGEoKXtyZXR1cm4gdGhpcy5oYXNEZWJ1Z0RhdGEoKSYmdGhpcy50ZXh0Q29sbGlzaW9uQm94LnNlZ21lbnRzLmdldCgpLmxlbmd0aD4wfWhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCl7cmV0dXJuIHRoaXMuaGFzRGVidWdEYXRhKCkmJnRoaXMuaWNvbkNvbGxpc2lvbkJveC5zZWdtZW50cy5nZXQoKS5sZW5ndGg+MH1hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKHQsZSl7Y29uc3Qgcj10LnBsYWNlZFN5bWJvbEFycmF5LmdldChlKSxuPXIudmVydGV4U3RhcnRJbmRleCs0KnIubnVtR2x5cGhzO2ZvcihsZXQgZT1yLnZlcnRleFN0YXJ0SW5kZXg7ZTxuO2UrPTQpdC5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGUsZSsxLGUrMiksdC5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGUrMSxlKzIsZSszKTt9Z2V0U29ydGVkU3ltYm9sSW5kZXhlcyh0KXtpZih0aGlzLnNvcnRlZEFuZ2xlPT09dCYmdm9pZCAwIT09dGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXMpcmV0dXJuIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzO2NvbnN0IGU9TWF0aC5zaW4odCkscj1NYXRoLmNvcyh0KSxuPVtdLGk9W10scz1bXTtmb3IobGV0IHQ9MDt0PHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsrK3Qpe3MucHVzaCh0KTtjb25zdCBhPXRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldCh0KTtuLnB1c2goMHxNYXRoLnJvdW5kKGUqYS5hbmNob3JYK3IqYS5hbmNob3JZKSksaS5wdXNoKGEuZmVhdHVyZUluZGV4KTt9cmV0dXJuIHMuc29ydCgoKHQsZSk9Pm5bdF0tbltlXXx8aVtlXS1pW3RdKSksc31hZGRUb1NvcnRLZXlSYW5nZXModCxlKXtjb25zdCByPXRoaXMuc29ydEtleVJhbmdlc1t0aGlzLnNvcnRLZXlSYW5nZXMubGVuZ3RoLTFdO3ImJnIuc29ydEtleT09PWU/ci5zeW1ib2xJbnN0YW5jZUVuZD10KzE6dGhpcy5zb3J0S2V5UmFuZ2VzLnB1c2goe3NvcnRLZXk6ZSxzeW1ib2xJbnN0YW5jZVN0YXJ0OnQsc3ltYm9sSW5zdGFuY2VFbmQ6dCsxfSk7fXNvcnRGZWF0dXJlcyh0KXtpZih0aGlzLnNvcnRGZWF0dXJlc0J5WSYmdGhpcy5zb3J0ZWRBbmdsZSE9PXQmJiEodGhpcy50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aD4xfHx0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoPjEpKXt0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcz10aGlzLmdldFNvcnRlZFN5bWJvbEluZGV4ZXModCksdGhpcy5zb3J0ZWRBbmdsZT10LHRoaXMudGV4dC5pbmRleEFycmF5LmNsZWFyKCksdGhpcy5pY29uLmluZGV4QXJyYXkuY2xlYXIoKSx0aGlzLmZlYXR1cmVTb3J0T3JkZXI9W107Zm9yKGNvbnN0IHQgb2YgdGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXMpe2NvbnN0IGU9dGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KHQpO3RoaXMuZmVhdHVyZVNvcnRPcmRlci5wdXNoKGUuZmVhdHVyZUluZGV4KSxbZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhdLmZvckVhY2goKCh0LGUscik9Pnt0Pj0wJiZyLmluZGV4T2YodCk9PT1lJiZ0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy50ZXh0LHQpO30pKSxlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4Pj0wJiZ0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy50ZXh0LGUudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLGUucGxhY2VkSWNvblN5bWJvbEluZGV4Pj0wJiZ0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLGUucGxhY2VkSWNvblN5bWJvbEluZGV4KSxlLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4Pj0wJiZ0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLGUudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgpO310aGlzLnRleHQuaW5kZXhCdWZmZXImJnRoaXMudGV4dC5pbmRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMudGV4dC5pbmRleEFycmF5KSx0aGlzLmljb24uaW5kZXhCdWZmZXImJnRoaXMuaWNvbi5pbmRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMuaWNvbi5pbmRleEFycmF5KTt9fX1sZXQgeWMsbWM7d2koXCJTeW1ib2xCdWNrZXRcIixkYyx7b21pdDpbXCJsYXllcnNcIixcImNvbGxpc2lvbkJveEFycmF5XCIsXCJmZWF0dXJlc1wiLFwiY29tcGFyZVRleHRcIl19KSxkYy5NQVhfR0xZUEhTPTY1NTM1LGRjLmFkZER5bmFtaWNBdHRyaWJ1dGVzPWNjO3ZhciBnYz17Z2V0IHBhaW50KCl7cmV0dXJuIG1jPW1jfHxuZXcgcnMoe1wiaWNvbi1vcGFjaXR5XCI6bmV3IFdpKEcucGFpbnRfc3ltYm9sW1wiaWNvbi1vcGFjaXR5XCJdKSxcImljb24tY29sb3JcIjpuZXcgV2koRy5wYWludF9zeW1ib2xbXCJpY29uLWNvbG9yXCJdKSxcImljb24taGFsby1jb2xvclwiOm5ldyBXaShHLnBhaW50X3N5bWJvbFtcImljb24taGFsby1jb2xvclwiXSksXCJpY29uLWhhbG8td2lkdGhcIjpuZXcgV2koRy5wYWludF9zeW1ib2xbXCJpY29uLWhhbG8td2lkdGhcIl0pLFwiaWNvbi1oYWxvLWJsdXJcIjpuZXcgV2koRy5wYWludF9zeW1ib2xbXCJpY29uLWhhbG8tYmx1clwiXSksXCJpY29uLXRyYW5zbGF0ZVwiOm5ldyBKaShHLnBhaW50X3N5bWJvbFtcImljb24tdHJhbnNsYXRlXCJdKSxcImljb24tdHJhbnNsYXRlLWFuY2hvclwiOm5ldyBKaShHLnBhaW50X3N5bWJvbFtcImljb24tdHJhbnNsYXRlLWFuY2hvclwiXSksXCJ0ZXh0LW9wYWNpdHlcIjpuZXcgV2koRy5wYWludF9zeW1ib2xbXCJ0ZXh0LW9wYWNpdHlcIl0pLFwidGV4dC1jb2xvclwiOm5ldyBXaShHLnBhaW50X3N5bWJvbFtcInRleHQtY29sb3JcIl0se3J1bnRpbWVUeXBlOnB0LGdldE92ZXJyaWRlOnQ9PnQudGV4dENvbG9yLGhhc092ZXJyaWRlOnQ9PiEhdC50ZXh0Q29sb3J9KSxcInRleHQtaGFsby1jb2xvclwiOm5ldyBXaShHLnBhaW50X3N5bWJvbFtcInRleHQtaGFsby1jb2xvclwiXSksXCJ0ZXh0LWhhbG8td2lkdGhcIjpuZXcgV2koRy5wYWludF9zeW1ib2xbXCJ0ZXh0LWhhbG8td2lkdGhcIl0pLFwidGV4dC1oYWxvLWJsdXJcIjpuZXcgV2koRy5wYWludF9zeW1ib2xbXCJ0ZXh0LWhhbG8tYmx1clwiXSksXCJ0ZXh0LXRyYW5zbGF0ZVwiOm5ldyBKaShHLnBhaW50X3N5bWJvbFtcInRleHQtdHJhbnNsYXRlXCJdKSxcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiOm5ldyBKaShHLnBhaW50X3N5bWJvbFtcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiXSl9KX0sZ2V0IGxheW91dCgpe3JldHVybiB5Yz15Y3x8bmV3IHJzKHtcInN5bWJvbC1wbGFjZW1lbnRcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1wic3ltYm9sLXBsYWNlbWVudFwiXSksXCJzeW1ib2wtc3BhY2luZ1wiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJzeW1ib2wtc3BhY2luZ1wiXSksXCJzeW1ib2wtYXZvaWQtZWRnZXNcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1wic3ltYm9sLWF2b2lkLWVkZ2VzXCJdKSxcInN5bWJvbC1zb3J0LWtleVwiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJzeW1ib2wtc29ydC1rZXlcIl0pLFwic3ltYm9sLXotb3JkZXJcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1wic3ltYm9sLXotb3JkZXJcIl0pLFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6bmV3IEppKEcubGF5b3V0X3N5bWJvbFtcImljb24tYWxsb3ctb3ZlcmxhcFwiXSksXCJpY29uLW92ZXJsYXBcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1wiaWNvbi1vdmVybGFwXCJdKSxcImljb24taWdub3JlLXBsYWNlbWVudFwiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0pLFwiaWNvbi1vcHRpb25hbFwiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJpY29uLW9wdGlvbmFsXCJdKSxcImljb24tcm90YXRpb24tYWxpZ25tZW50XCI6bmV3IEppKEcubGF5b3V0X3N5bWJvbFtcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdKSxcImljb24tc2l6ZVwiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJpY29uLXNpemVcIl0pLFwiaWNvbi10ZXh0LWZpdFwiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJpY29uLXRleHQtZml0XCJdKSxcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIl0pLFwiaWNvbi1pbWFnZVwiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJpY29uLWltYWdlXCJdKSxcImljb24tcm90YXRlXCI6bmV3IFdpKEcubGF5b3V0X3N5bWJvbFtcImljb24tcm90YXRlXCJdKSxcImljb24tcGFkZGluZ1wiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJpY29uLXBhZGRpbmdcIl0pLFwiaWNvbi1rZWVwLXVwcmlnaHRcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1wiaWNvbi1rZWVwLXVwcmlnaHRcIl0pLFwiaWNvbi1vZmZzZXRcIjpuZXcgV2koRy5sYXlvdXRfc3ltYm9sW1wiaWNvbi1vZmZzZXRcIl0pLFwiaWNvbi1hbmNob3JcIjpuZXcgV2koRy5sYXlvdXRfc3ltYm9sW1wiaWNvbi1hbmNob3JcIl0pLFwiaWNvbi1waXRjaC1hbGlnbm1lbnRcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1wiaWNvbi1waXRjaC1hbGlnbm1lbnRcIl0pLFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1widGV4dC1waXRjaC1hbGlnbm1lbnRcIl0pLFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0pLFwidGV4dC1maWVsZFwiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LWZpZWxkXCJdKSxcInRleHQtZm9udFwiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LWZvbnRcIl0pLFwidGV4dC1zaXplXCI6bmV3IFdpKEcubGF5b3V0X3N5bWJvbFtcInRleHQtc2l6ZVwiXSksXCJ0ZXh0LW1heC13aWR0aFwiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LW1heC13aWR0aFwiXSksXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6bmV3IEppKEcubGF5b3V0X3N5bWJvbFtcInRleHQtbGluZS1oZWlnaHRcIl0pLFwidGV4dC1sZXR0ZXItc3BhY2luZ1wiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCJdKSxcInRleHQtanVzdGlmeVwiOm5ldyBXaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LWp1c3RpZnlcIl0pLFwidGV4dC1yYWRpYWwtb2Zmc2V0XCI6bmV3IFdpKEcubGF5b3V0X3N5bWJvbFtcInRleHQtcmFkaWFsLW9mZnNldFwiXSksXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiXSksXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvci1vZmZzZXRcIjpuZXcgV2koRy5sYXlvdXRfc3ltYm9sW1widGV4dC12YXJpYWJsZS1hbmNob3Itb2Zmc2V0XCJdKSxcInRleHQtYW5jaG9yXCI6bmV3IFdpKEcubGF5b3V0X3N5bWJvbFtcInRleHQtYW5jaG9yXCJdKSxcInRleHQtbWF4LWFuZ2xlXCI6bmV3IEppKEcubGF5b3V0X3N5bWJvbFtcInRleHQtbWF4LWFuZ2xlXCJdKSxcInRleHQtd3JpdGluZy1tb2RlXCI6bmV3IEppKEcubGF5b3V0X3N5bWJvbFtcInRleHQtd3JpdGluZy1tb2RlXCJdKSxcInRleHQtcm90YXRlXCI6bmV3IFdpKEcubGF5b3V0X3N5bWJvbFtcInRleHQtcm90YXRlXCJdKSxcInRleHQtcGFkZGluZ1wiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LXBhZGRpbmdcIl0pLFwidGV4dC1rZWVwLXVwcmlnaHRcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1widGV4dC1rZWVwLXVwcmlnaHRcIl0pLFwidGV4dC10cmFuc2Zvcm1cIjpuZXcgV2koRy5sYXlvdXRfc3ltYm9sW1widGV4dC10cmFuc2Zvcm1cIl0pLFwidGV4dC1vZmZzZXRcIjpuZXcgV2koRy5sYXlvdXRfc3ltYm9sW1widGV4dC1vZmZzZXRcIl0pLFwidGV4dC1hbGxvdy1vdmVybGFwXCI6bmV3IEppKEcubGF5b3V0X3N5bWJvbFtcInRleHQtYWxsb3ctb3ZlcmxhcFwiXSksXCJ0ZXh0LW92ZXJsYXBcIjpuZXcgSmkoRy5sYXlvdXRfc3ltYm9sW1widGV4dC1vdmVybGFwXCJdKSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl0pLFwidGV4dC1vcHRpb25hbFwiOm5ldyBKaShHLmxheW91dF9zeW1ib2xbXCJ0ZXh0LW9wdGlvbmFsXCJdKX0pfX07Y2xhc3MgeGN7Y29uc3RydWN0b3IodCl7aWYodm9pZCAwPT09dC5wcm9wZXJ0eS5vdmVycmlkZXMpdGhyb3cgbmV3IEVycm9yKFwib3ZlcnJpZGVzIG11c3QgYmUgcHJvdmlkZWQgdG8gaW5zdGFudGlhdGUgRm9ybWF0U2VjdGlvbk92ZXJyaWRlIGNsYXNzXCIpO3RoaXMudHlwZT10LnByb3BlcnR5Lm92ZXJyaWRlcz90LnByb3BlcnR5Lm92ZXJyaWRlcy5ydW50aW1lVHlwZTpsdCx0aGlzLmRlZmF1bHRWYWx1ZT10O31ldmFsdWF0ZSh0KXtpZih0LmZvcm1hdHRlZFNlY3Rpb24pe2NvbnN0IGU9dGhpcy5kZWZhdWx0VmFsdWUucHJvcGVydHkub3ZlcnJpZGVzO2lmKGUmJmUuaGFzT3ZlcnJpZGUodC5mb3JtYXR0ZWRTZWN0aW9uKSlyZXR1cm4gZS5nZXRPdmVycmlkZSh0LmZvcm1hdHRlZFNlY3Rpb24pfXJldHVybiB0LmZlYXR1cmUmJnQuZmVhdHVyZVN0YXRlP3RoaXMuZGVmYXVsdFZhbHVlLmV2YWx1YXRlKHQuZmVhdHVyZSx0LmZlYXR1cmVTdGF0ZSk6dGhpcy5kZWZhdWx0VmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvbi5kZWZhdWx0fWVhY2hDaGlsZCh0KXt0aGlzLmRlZmF1bHRWYWx1ZS5pc0NvbnN0YW50KCl8fHQodGhpcy5kZWZhdWx0VmFsdWUudmFsdWUuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uKTt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiAhMX1zZXJpYWxpemUoKXtyZXR1cm4gbnVsbH19d2koXCJGb3JtYXRTZWN0aW9uT3ZlcnJpZGVcIix4Yyx7b21pdDpbXCJkZWZhdWx0VmFsdWVcIl19KTtjbGFzcyB2YyBleHRlbmRzIGlze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsZ2MpO31yZWNhbGN1bGF0ZSh0LGUpe2lmKHN1cGVyLnJlY2FsY3VsYXRlKHQsZSksXCJhdXRvXCI9PT10aGlzLmxheW91dC5nZXQoXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiKSYmKHRoaXMubGF5b3V0Ll92YWx1ZXNbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXT1cInBvaW50XCIhPT10aGlzLmxheW91dC5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpP1wibWFwXCI6XCJ2aWV3cG9ydFwiKSxcImF1dG9cIj09PXRoaXMubGF5b3V0LmdldChcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpJiYodGhpcy5sYXlvdXQuX3ZhbHVlc1tcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCJdPVwicG9pbnRcIiE9PXRoaXMubGF5b3V0LmdldChcInN5bWJvbC1wbGFjZW1lbnRcIik/XCJtYXBcIjpcInZpZXdwb3J0XCIpLFwiYXV0b1wiPT09dGhpcy5sYXlvdXQuZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIikmJih0aGlzLmxheW91dC5fdmFsdWVzW1widGV4dC1waXRjaC1hbGlnbm1lbnRcIl09XCJtYXBcIj09PXRoaXMubGF5b3V0LmdldChcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpP1wibWFwXCI6XCJ2aWV3cG9ydFwiKSxcImF1dG9cIj09PXRoaXMubGF5b3V0LmdldChcImljb24tcGl0Y2gtYWxpZ25tZW50XCIpJiYodGhpcy5sYXlvdXQuX3ZhbHVlc1tcImljb24tcGl0Y2gtYWxpZ25tZW50XCJdPXRoaXMubGF5b3V0LmdldChcImljb24tcm90YXRpb24tYWxpZ25tZW50XCIpKSxcInBvaW50XCI9PT10aGlzLmxheW91dC5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpKXtjb25zdCB0PXRoaXMubGF5b3V0LmdldChcInRleHQtd3JpdGluZy1tb2RlXCIpO2lmKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IHIgb2YgdCllLmluZGV4T2Yocik8MCYmZS5wdXNoKHIpO3RoaXMubGF5b3V0Ll92YWx1ZXNbXCJ0ZXh0LXdyaXRpbmctbW9kZVwiXT1lO31lbHNlIHRoaXMubGF5b3V0Ll92YWx1ZXNbXCJ0ZXh0LXdyaXRpbmctbW9kZVwiXT1bXCJob3Jpem9udGFsXCJdO310aGlzLl9zZXRQYWludE92ZXJyaWRlcygpO31nZXRWYWx1ZUFuZFJlc29sdmVUb2tlbnModCxlLHIsbil7Y29uc3QgaT10aGlzLmxheW91dC5nZXQodCkuZXZhbHVhdGUoZSx7fSxyLG4pLHM9dGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlc1t0XTtyZXR1cm4gcy5pc0RhdGFEcml2ZW4oKXx8dm4ocy52YWx1ZSl8fCFpP2k6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5yZXBsYWNlKC97KFtee31dKyl9L2csKChlLHIpPT50JiZyIGluIHQ/U3RyaW5nKHRbcl0pOlwiXCIpKX0oZS5wcm9wZXJ0aWVzLGkpfWNyZWF0ZUJ1Y2tldCh0KXtyZXR1cm4gbmV3IGRjKHQpfXF1ZXJ5UmFkaXVzKCl7cmV0dXJuIDB9cXVlcnlJbnRlcnNlY3RzRmVhdHVyZSgpe3Rocm93IG5ldyBFcnJvcihcIlNob3VsZCB0YWtlIGEgZGlmZmVyZW50IHBhdGggaW4gRmVhdHVyZUluZGV4XCIpfV9zZXRQYWludE92ZXJyaWRlcygpe2Zvcihjb25zdCB0IG9mIGdjLnBhaW50Lm92ZXJyaWRhYmxlUHJvcGVydGllcyl7aWYoIXZjLmhhc1BhaW50T3ZlcnJpZGUodGhpcy5sYXlvdXQsdCkpY29udGludWU7Y29uc3QgZT10aGlzLnBhaW50LmdldCh0KSxyPW5ldyB4YyhlKSxuPW5ldyB4bihyLGUucHJvcGVydHkuc3BlY2lmaWNhdGlvbik7bGV0IGk9bnVsbDtpPVwiY29uc3RhbnRcIj09PWUudmFsdWUua2luZHx8XCJzb3VyY2VcIj09PWUudmFsdWUua2luZD9uZXcgd24oXCJzb3VyY2VcIixuKTpuZXcgX24oXCJjb21wb3NpdGVcIixuLGUudmFsdWUuem9vbVN0b3BzKSx0aGlzLnBhaW50Ll92YWx1ZXNbdF09bmV3IEhpKGUucHJvcGVydHksaSxlLnBhcmFtZXRlcnMpO319X2hhbmRsZU92ZXJyaWRhYmxlUGFpbnRQcm9wZXJ0eVVwZGF0ZSh0LGUscil7cmV0dXJuICEoIXRoaXMubGF5b3V0fHxlLmlzRGF0YURyaXZlbigpfHxyLmlzRGF0YURyaXZlbigpKSYmdmMuaGFzUGFpbnRPdmVycmlkZSh0aGlzLmxheW91dCx0KX1zdGF0aWMgaGFzUGFpbnRPdmVycmlkZSh0LGUpe2NvbnN0IHI9dC5nZXQoXCJ0ZXh0LWZpZWxkXCIpLG49Z2MucGFpbnQucHJvcGVydGllc1tlXTtsZXQgaT0hMTtjb25zdCBzPXQ9Pntmb3IoY29uc3QgZSBvZiB0KWlmKG4ub3ZlcnJpZGVzJiZuLm92ZXJyaWRlcy5oYXNPdmVycmlkZShlKSlyZXR1cm4gdm9pZChpPSEwKX07aWYoXCJjb25zdGFudFwiPT09ci52YWx1ZS5raW5kJiZyLnZhbHVlLnZhbHVlIGluc3RhbmNlb2YgWXQpcyhyLnZhbHVlLnZhbHVlLnNlY3Rpb25zKTtlbHNlIGlmKFwic291cmNlXCI9PT1yLnZhbHVlLmtpbmQpe2NvbnN0IHQ9ZT0+e2l8fChlIGluc3RhbmNlb2Ygc2UmJm5lKGUudmFsdWUpPT09bXQ/cyhlLnZhbHVlLnNlY3Rpb25zKTplIGluc3RhbmNlb2YgWmU/cyhlLnNlY3Rpb25zKTplLmVhY2hDaGlsZCh0KSk7fSxlPXIudmFsdWU7ZS5fc3R5bGVFeHByZXNzaW9uJiZ0KGUuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uKTt9cmV0dXJuIGl9fWxldCBiYzt2YXIgd2M9e2dldCBwYWludCgpe3JldHVybiBiYz1iY3x8bmV3IHJzKHtcImJhY2tncm91bmQtY29sb3JcIjpuZXcgSmkoRy5wYWludF9iYWNrZ3JvdW5kW1wiYmFja2dyb3VuZC1jb2xvclwiXSksXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjpuZXcgdHMoRy5wYWludF9iYWNrZ3JvdW5kW1wiYmFja2dyb3VuZC1wYXR0ZXJuXCJdKSxcImJhY2tncm91bmQtb3BhY2l0eVwiOm5ldyBKaShHLnBhaW50X2JhY2tncm91bmRbXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIl0pfSl9fTtjbGFzcyBfYyBleHRlbmRzIGlze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsd2MpO319bGV0IEFjO3ZhciBTYz17Z2V0IHBhaW50KCl7cmV0dXJuIEFjPUFjfHxuZXcgcnMoe1wicmFzdGVyLW9wYWNpdHlcIjpuZXcgSmkoRy5wYWludF9yYXN0ZXJbXCJyYXN0ZXItb3BhY2l0eVwiXSksXCJyYXN0ZXItaHVlLXJvdGF0ZVwiOm5ldyBKaShHLnBhaW50X3Jhc3RlcltcInJhc3Rlci1odWUtcm90YXRlXCJdKSxcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOm5ldyBKaShHLnBhaW50X3Jhc3RlcltcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiXSksXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjpuZXcgSmkoRy5wYWludF9yYXN0ZXJbXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIl0pLFwicmFzdGVyLXNhdHVyYXRpb25cIjpuZXcgSmkoRy5wYWludF9yYXN0ZXJbXCJyYXN0ZXItc2F0dXJhdGlvblwiXSksXCJyYXN0ZXItY29udHJhc3RcIjpuZXcgSmkoRy5wYWludF9yYXN0ZXJbXCJyYXN0ZXItY29udHJhc3RcIl0pLFwicmFzdGVyLXJlc2FtcGxpbmdcIjpuZXcgSmkoRy5wYWludF9yYXN0ZXJbXCJyYXN0ZXItcmVzYW1wbGluZ1wiXSksXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOm5ldyBKaShHLnBhaW50X3Jhc3RlcltcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCJdKX0pfX07Y2xhc3Mga2MgZXh0ZW5kcyBpc3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFNjKTt9fWNsYXNzIE1jIGV4dGVuZHMgaXN7Y29uc3RydWN0b3IodCl7c3VwZXIodCx7fSksdGhpcy5vbkFkZD10PT57dGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZCYmdGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZCh0LHQucGFpbnRlci5jb250ZXh0LmdsKTt9LHRoaXMub25SZW1vdmU9dD0+e3RoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUmJnRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUodCx0LnBhaW50ZXIuY29udGV4dC5nbCk7fSx0aGlzLmltcGxlbWVudGF0aW9uPXQ7fWlzM0QoKXtyZXR1cm4gXCIzZFwiPT09dGhpcy5pbXBsZW1lbnRhdGlvbi5yZW5kZXJpbmdNb2RlfWhhc09mZnNjcmVlblBhc3MoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5pbXBsZW1lbnRhdGlvbi5wcmVyZW5kZXJ9cmVjYWxjdWxhdGUoKXt9dXBkYXRlVHJhbnNpdGlvbnMoKXt9aGFzVHJhbnNpdGlvbigpe3JldHVybiAhMX1zZXJpYWxpemUoKXt0aHJvdyBuZXcgRXJyb3IoXCJDdXN0b20gbGF5ZXJzIGNhbm5vdCBiZSBzZXJpYWxpemVkXCIpfX1jbGFzcyBJY3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9tZXRob2RUb1Rocm90dGxlPXQsdGhpcy5fdHJpZ2dlcmVkPSExLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCYmKHRoaXMuX2NoYW5uZWw9bmV3IE1lc3NhZ2VDaGFubmVsLHRoaXMuX2NoYW5uZWwucG9ydDIub25tZXNzYWdlPSgpPT57dGhpcy5fdHJpZ2dlcmVkPSExLHRoaXMuX21ldGhvZFRvVGhyb3R0bGUoKTt9KTt9dHJpZ2dlcigpe3RoaXMuX3RyaWdnZXJlZHx8KHRoaXMuX3RyaWdnZXJlZD0hMCx0aGlzLl9jaGFubmVsP3RoaXMuX2NoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UoITApOnNldFRpbWVvdXQoKCgpPT57dGhpcy5fdHJpZ2dlcmVkPSExLHRoaXMuX21ldGhvZFRvVGhyb3R0bGUoKTt9KSwwKSk7fXJlbW92ZSgpe2RlbGV0ZSB0aGlzLl9jaGFubmVsLHRoaXMuX21ldGhvZFRvVGhyb3R0bGU9KCk9Pnt9O319Y29uc3QgemM9NjM3MTAwOC44O2NsYXNzIFBje2NvbnN0cnVjdG9yKHQsZSl7aWYoaXNOYU4odCl8fGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBMbmdMYXQgb2JqZWN0OiAoJHt0fSwgJHtlfSlgKTtpZih0aGlzLmxuZz0rdCx0aGlzLmxhdD0rZSx0aGlzLmxhdD45MHx8dGhpcy5sYXQ8LTkwKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTG5nTGF0IGxhdGl0dWRlIHZhbHVlOiBtdXN0IGJlIGJldHdlZW4gLTkwIGFuZCA5MFwiKX13cmFwKCl7cmV0dXJuIG5ldyBQYyhtKHRoaXMubG5nLC0xODAsMTgwKSx0aGlzLmxhdCl9dG9BcnJheSgpe3JldHVybiBbdGhpcy5sbmcsdGhpcy5sYXRdfXRvU3RyaW5nKCl7cmV0dXJuIGBMbmdMYXQoJHt0aGlzLmxuZ30sICR7dGhpcy5sYXR9KWB9ZGlzdGFuY2VUbyh0KXtjb25zdCBlPU1hdGguUEkvMTgwLHI9dGhpcy5sYXQqZSxuPXQubGF0KmUsaT1NYXRoLnNpbihyKSpNYXRoLnNpbihuKStNYXRoLmNvcyhyKSpNYXRoLmNvcyhuKSpNYXRoLmNvcygodC5sbmctdGhpcy5sbmcpKmUpO3JldHVybiB6YypNYXRoLmFjb3MoTWF0aC5taW4oaSwxKSl9c3RhdGljIGNvbnZlcnQodCl7aWYodCBpbnN0YW5jZW9mIFBjKXJldHVybiB0O2lmKEFycmF5LmlzQXJyYXkodCkmJigyPT09dC5sZW5ndGh8fDM9PT10Lmxlbmd0aCkpcmV0dXJuIG5ldyBQYyhOdW1iZXIodFswXSksTnVtYmVyKHRbMV0pKTtpZighQXJyYXkuaXNBcnJheSh0KSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJm51bGwhPT10KXJldHVybiBuZXcgUGMoTnVtYmVyKFwibG5nXCJpbiB0P3QubG5nOnQubG9uKSxOdW1iZXIodC5sYXQpKTt0aHJvdyBuZXcgRXJyb3IoXCJgTG5nTGF0TGlrZWAgYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBMbmdMYXQgaW5zdGFuY2UsIGFuIG9iamVjdCB7bG5nOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIGFuIG9iamVjdCB7bG9uOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIG9yIGFuIGFycmF5IG9mIFs8bG5nPiwgPGxhdD5dXCIpfX1jb25zdCBDYz0yKk1hdGguUEkqemM7ZnVuY3Rpb24gQmModCl7cmV0dXJuIENjKk1hdGguY29zKHQqTWF0aC5QSS8xODApfWZ1bmN0aW9uIFZjKHQpe3JldHVybiAoMTgwK3QpLzM2MH1mdW5jdGlvbiBFYyh0KXtyZXR1cm4gKDE4MC0xODAvTWF0aC5QSSpNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJLzQrdCpNYXRoLlBJLzM2MCkpKS8zNjB9ZnVuY3Rpb24gRmModCxlKXtyZXR1cm4gdC9CYyhlKX1mdW5jdGlvbiBUYyh0KXtyZXR1cm4gMzYwL01hdGguUEkqTWF0aC5hdGFuKE1hdGguZXhwKCgxODAtMzYwKnQpKk1hdGguUEkvMTgwKSktOTB9Y2xhc3MgJGN7Y29uc3RydWN0b3IodCxlLHI9MCl7dGhpcy54PSt0LHRoaXMueT0rZSx0aGlzLno9K3I7fXN0YXRpYyBmcm9tTG5nTGF0KHQsZT0wKXtjb25zdCByPVBjLmNvbnZlcnQodCk7cmV0dXJuIG5ldyAkYyhWYyhyLmxuZyksRWMoci5sYXQpLEZjKGUsci5sYXQpKX10b0xuZ0xhdCgpe3JldHVybiBuZXcgUGMoMzYwKnRoaXMueC0xODAsVGModGhpcy55KSl9dG9BbHRpdHVkZSgpe3JldHVybiB0aGlzLnoqQmMoVGModGhpcy55KSl9bWV0ZXJJbk1lcmNhdG9yQ29vcmRpbmF0ZVVuaXRzKCl7cmV0dXJuIDEvQ2MqKHQ9VGModGhpcy55KSwxL01hdGguY29zKHQqTWF0aC5QSS8xODApKTt2YXIgdDt9fWZ1bmN0aW9uIExjKHQsZSxyKXt2YXIgbj0yKk1hdGguUEkqNjM3ODEzNy8yNTYvTWF0aC5wb3coMixyKTtyZXR1cm4gW3Qqbi0yKk1hdGguUEkqNjM3ODEzNy8yLGUqbi0yKk1hdGguUEkqNjM3ODEzNy8yXX1jbGFzcyBEY3tjb25zdHJ1Y3Rvcih0LGUscil7aWYoIWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gISh0PDB8fHQ+MjV8fHI8MHx8cj49TWF0aC5wb3coMix0KXx8ZTwwfHxlPj1NYXRoLnBvdygyLHQpKX0odCxlLHIpKXRocm93IG5ldyBFcnJvcihgeD0ke2V9LCB5PSR7cn0sIHo9JHt0fSBvdXRzaWRlIG9mIGJvdW5kcy4gMDw9eDwke01hdGgucG93KDIsdCl9LCAwPD15PCR7TWF0aC5wb3coMix0KX0gMDw9ejw9MjUgYCk7dGhpcy56PXQsdGhpcy54PWUsdGhpcy55PXIsdGhpcy5rZXk9UmMoMCx0LHQsZSxyKTt9ZXF1YWxzKHQpe3JldHVybiB0aGlzLno9PT10LnomJnRoaXMueD09PXQueCYmdGhpcy55PT09dC55fXVybCh0LGUscil7Y29uc3Qgbj0ocz10aGlzLnksYT10aGlzLnosbz1MYygyNTYqKGk9dGhpcy54KSwyNTYqKHM9TWF0aC5wb3coMixhKS1zLTEpLGEpLGw9TGMoMjU2KihpKzEpLDI1NioocysxKSxhKSxvWzBdK1wiLFwiK29bMV0rXCIsXCIrbFswXStcIixcIitsWzFdKTt2YXIgaSxzLGEsbyxsO2NvbnN0IHU9ZnVuY3Rpb24odCxlLHIpe2xldCBuLGk9XCJcIjtmb3IobGV0IHM9dDtzPjA7cy0tKW49MTw8cy0xLGkrPShlJm4/MTowKSsociZuPzI6MCk7cmV0dXJuIGl9KHRoaXMueix0aGlzLngsdGhpcy55KTtyZXR1cm4gdFsodGhpcy54K3RoaXMueSkldC5sZW5ndGhdLnJlcGxhY2UoL3twcmVmaXh9L2csKHRoaXMueCUxNikudG9TdHJpbmcoMTYpKyh0aGlzLnklMTYpLnRvU3RyaW5nKDE2KSkucmVwbGFjZSgve3p9L2csU3RyaW5nKHRoaXMueikpLnJlcGxhY2UoL3t4fS9nLFN0cmluZyh0aGlzLngpKS5yZXBsYWNlKC97eX0vZyxTdHJpbmcoXCJ0bXNcIj09PXI/TWF0aC5wb3coMix0aGlzLnopLXRoaXMueS0xOnRoaXMueSkpLnJlcGxhY2UoL3tyYXRpb30vZyxlPjE/XCJAMnhcIjpcIlwiKS5yZXBsYWNlKC97cXVhZGtleX0vZyx1KS5yZXBsYWNlKC97YmJveC1lcHNnLTM4NTd9L2csbil9aXNDaGlsZE9mKHQpe2NvbnN0IGU9dGhpcy56LXQuejtyZXR1cm4gZT4wJiZ0Lng9PT10aGlzLng+PmUmJnQueT09PXRoaXMueT4+ZX1nZXRUaWxlUG9pbnQodCl7Y29uc3QgZT1NYXRoLnBvdygyLHRoaXMueik7cmV0dXJuIG5ldyBzKCh0LngqZS10aGlzLngpKiRhLCh0LnkqZS10aGlzLnkpKiRhKX10b1N0cmluZygpe3JldHVybiBgJHt0aGlzLnp9LyR7dGhpcy54fS8ke3RoaXMueX1gfX1jbGFzcyBPY3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMud3JhcD10LHRoaXMuY2Fub25pY2FsPWUsdGhpcy5rZXk9UmModCxlLnosZS56LGUueCxlLnkpO319Y2xhc3MgamN7Y29uc3RydWN0b3IodCxlLHIsbixpKXtpZih0PHIpdGhyb3cgbmV3IEVycm9yKGBvdmVyc2NhbGVkWiBzaG91bGQgYmUgPj0gejsgb3ZlcnNjYWxlZFogPSAke3R9OyB6ID0gJHtyfWApO3RoaXMub3ZlcnNjYWxlZFo9dCx0aGlzLndyYXA9ZSx0aGlzLmNhbm9uaWNhbD1uZXcgRGMociwrbiwraSksdGhpcy5rZXk9UmMoZSx0LHIsbixpKTt9Y2xvbmUoKXtyZXR1cm4gbmV3IGpjKHRoaXMub3ZlcnNjYWxlZFosdGhpcy53cmFwLHRoaXMuY2Fub25pY2FsLnosdGhpcy5jYW5vbmljYWwueCx0aGlzLmNhbm9uaWNhbC55KX1lcXVhbHModCl7cmV0dXJuIHRoaXMub3ZlcnNjYWxlZFo9PT10Lm92ZXJzY2FsZWRaJiZ0aGlzLndyYXA9PT10LndyYXAmJnRoaXMuY2Fub25pY2FsLmVxdWFscyh0LmNhbm9uaWNhbCl9c2NhbGVkVG8odCl7aWYodD50aGlzLm92ZXJzY2FsZWRaKXRocm93IG5ldyBFcnJvcihgdGFyZ2V0WiA+IHRoaXMub3ZlcnNjYWxlZFo7IHRhcmdldFogPSAke3R9OyBvdmVyc2NhbGVkWiA9ICR7dGhpcy5vdmVyc2NhbGVkWn1gKTtjb25zdCBlPXRoaXMuY2Fub25pY2FsLnotdDtyZXR1cm4gdD50aGlzLmNhbm9uaWNhbC56P25ldyBqYyh0LHRoaXMud3JhcCx0aGlzLmNhbm9uaWNhbC56LHRoaXMuY2Fub25pY2FsLngsdGhpcy5jYW5vbmljYWwueSk6bmV3IGpjKHQsdGhpcy53cmFwLHQsdGhpcy5jYW5vbmljYWwueD4+ZSx0aGlzLmNhbm9uaWNhbC55Pj5lKX1jYWxjdWxhdGVTY2FsZWRLZXkodCxlKXtpZih0PnRoaXMub3ZlcnNjYWxlZFopdGhyb3cgbmV3IEVycm9yKGB0YXJnZXRaID4gdGhpcy5vdmVyc2NhbGVkWjsgdGFyZ2V0WiA9ICR7dH07IG92ZXJzY2FsZWRaID0gJHt0aGlzLm92ZXJzY2FsZWRafWApO2NvbnN0IHI9dGhpcy5jYW5vbmljYWwuei10O3JldHVybiB0PnRoaXMuY2Fub25pY2FsLno/UmModGhpcy53cmFwKitlLHQsdGhpcy5jYW5vbmljYWwueix0aGlzLmNhbm9uaWNhbC54LHRoaXMuY2Fub25pY2FsLnkpOlJjKHRoaXMud3JhcCorZSx0LHQsdGhpcy5jYW5vbmljYWwueD4+cix0aGlzLmNhbm9uaWNhbC55Pj5yKX1pc0NoaWxkT2YodCl7aWYodC53cmFwIT09dGhpcy53cmFwKXJldHVybiAhMTtjb25zdCBlPXRoaXMuY2Fub25pY2FsLnotdC5jYW5vbmljYWwuejtyZXR1cm4gMD09PXQub3ZlcnNjYWxlZFp8fHQub3ZlcnNjYWxlZFo8dGhpcy5vdmVyc2NhbGVkWiYmdC5jYW5vbmljYWwueD09PXRoaXMuY2Fub25pY2FsLng+PmUmJnQuY2Fub25pY2FsLnk9PT10aGlzLmNhbm9uaWNhbC55Pj5lfWNoaWxkcmVuKHQpe2lmKHRoaXMub3ZlcnNjYWxlZFo+PXQpcmV0dXJuIFtuZXcgamModGhpcy5vdmVyc2NhbGVkWisxLHRoaXMud3JhcCx0aGlzLmNhbm9uaWNhbC56LHRoaXMuY2Fub25pY2FsLngsdGhpcy5jYW5vbmljYWwueSldO2NvbnN0IGU9dGhpcy5jYW5vbmljYWwueisxLHI9Mip0aGlzLmNhbm9uaWNhbC54LG49Mip0aGlzLmNhbm9uaWNhbC55O3JldHVybiBbbmV3IGpjKGUsdGhpcy53cmFwLGUscixuKSxuZXcgamMoZSx0aGlzLndyYXAsZSxyKzEsbiksbmV3IGpjKGUsdGhpcy53cmFwLGUscixuKzEpLG5ldyBqYyhlLHRoaXMud3JhcCxlLHIrMSxuKzEpXX1pc0xlc3NUaGFuKHQpe3JldHVybiB0aGlzLndyYXA8dC53cmFwfHwhKHRoaXMud3JhcD50LndyYXApJiYodGhpcy5vdmVyc2NhbGVkWjx0Lm92ZXJzY2FsZWRafHwhKHRoaXMub3ZlcnNjYWxlZFo+dC5vdmVyc2NhbGVkWikmJih0aGlzLmNhbm9uaWNhbC54PHQuY2Fub25pY2FsLnh8fCEodGhpcy5jYW5vbmljYWwueD50LmNhbm9uaWNhbC54KSYmdGhpcy5jYW5vbmljYWwueTx0LmNhbm9uaWNhbC55KSl9d3JhcHBlZCgpe3JldHVybiBuZXcgamModGhpcy5vdmVyc2NhbGVkWiwwLHRoaXMuY2Fub25pY2FsLnosdGhpcy5jYW5vbmljYWwueCx0aGlzLmNhbm9uaWNhbC55KX11bndyYXBUbyh0KXtyZXR1cm4gbmV3IGpjKHRoaXMub3ZlcnNjYWxlZFosdCx0aGlzLmNhbm9uaWNhbC56LHRoaXMuY2Fub25pY2FsLngsdGhpcy5jYW5vbmljYWwueSl9b3ZlcnNjYWxlRmFjdG9yKCl7cmV0dXJuIE1hdGgucG93KDIsdGhpcy5vdmVyc2NhbGVkWi10aGlzLmNhbm9uaWNhbC56KX10b1Vud3JhcHBlZCgpe3JldHVybiBuZXcgT2ModGhpcy53cmFwLHRoaXMuY2Fub25pY2FsKX10b1N0cmluZygpe3JldHVybiBgJHt0aGlzLm92ZXJzY2FsZWRafS8ke3RoaXMuY2Fub25pY2FsLnh9LyR7dGhpcy5jYW5vbmljYWwueX1gfWdldFRpbGVQb2ludCh0KXtyZXR1cm4gdGhpcy5jYW5vbmljYWwuZ2V0VGlsZVBvaW50KG5ldyAkYyh0LngtdGhpcy53cmFwLHQueSkpfX1mdW5jdGlvbiBSYyh0LGUscixuLGkpeyh0Kj0yKTwwJiYodD0tMSp0LTEpO2NvbnN0IHM9MTw8cjtyZXR1cm4gKHMqcyp0K3MqaStuKS50b1N0cmluZygzNikrci50b1N0cmluZygzNikrZS50b1N0cmluZygzNil9d2koXCJDYW5vbmljYWxUaWxlSURcIixEYyksd2koXCJPdmVyc2NhbGVkVGlsZUlEXCIsamMse29taXQ6W1wicG9zTWF0cml4XCJdfSk7Y2xhc3MgVWN7Y29uc3RydWN0b3IodCxlLHIsbj0xLGk9MSxzPTEsYT0wKXtpZih0aGlzLnVpZD10LGUuaGVpZ2h0IT09ZS53aWR0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkRFTSB0aWxlcyBtdXN0IGJlIHNxdWFyZVwiKTtpZihyJiYhW1wibWFwYm94XCIsXCJ0ZXJyYXJpdW1cIixcImN1c3RvbVwiXS5pbmNsdWRlcyhyKSlyZXR1cm4gdm9pZCBBKGBcIiR7cn1cIiBpcyBub3QgYSB2YWxpZCBlbmNvZGluZyB0eXBlLiBWYWxpZCB0eXBlcyBpbmNsdWRlIFwibWFwYm94XCIsIFwidGVycmFyaXVtXCIgYW5kIFwiY3VzdG9tXCIuYCk7dGhpcy5zdHJpZGU9ZS5oZWlnaHQ7Y29uc3Qgbz10aGlzLmRpbT1lLmhlaWdodC0yO3N3aXRjaCh0aGlzLmRhdGE9bmV3IFVpbnQzMkFycmF5KGUuZGF0YS5idWZmZXIpLHIpe2Nhc2VcInRlcnJhcml1bVwiOnRoaXMucmVkRmFjdG9yPTI1Nix0aGlzLmdyZWVuRmFjdG9yPTEsdGhpcy5ibHVlRmFjdG9yPTEvMjU2LHRoaXMuYmFzZVNoaWZ0PTMyNzY4O2JyZWFrO2Nhc2VcImN1c3RvbVwiOnRoaXMucmVkRmFjdG9yPW4sdGhpcy5ncmVlbkZhY3Rvcj1pLHRoaXMuYmx1ZUZhY3Rvcj1zLHRoaXMuYmFzZVNoaWZ0PWE7YnJlYWs7ZGVmYXVsdDp0aGlzLnJlZEZhY3Rvcj02NTUzLjYsdGhpcy5ncmVlbkZhY3Rvcj0yNS42LHRoaXMuYmx1ZUZhY3Rvcj0uMSx0aGlzLmJhc2VTaGlmdD0xZTQ7fWZvcihsZXQgdD0wO3Q8bzt0KyspdGhpcy5kYXRhW3RoaXMuX2lkeCgtMSx0KV09dGhpcy5kYXRhW3RoaXMuX2lkeCgwLHQpXSx0aGlzLmRhdGFbdGhpcy5faWR4KG8sdCldPXRoaXMuZGF0YVt0aGlzLl9pZHgoby0xLHQpXSx0aGlzLmRhdGFbdGhpcy5faWR4KHQsLTEpXT10aGlzLmRhdGFbdGhpcy5faWR4KHQsMCldLHRoaXMuZGF0YVt0aGlzLl9pZHgodCxvKV09dGhpcy5kYXRhW3RoaXMuX2lkeCh0LG8tMSldO3RoaXMuZGF0YVt0aGlzLl9pZHgoLTEsLTEpXT10aGlzLmRhdGFbdGhpcy5faWR4KDAsMCldLHRoaXMuZGF0YVt0aGlzLl9pZHgobywtMSldPXRoaXMuZGF0YVt0aGlzLl9pZHgoby0xLDApXSx0aGlzLmRhdGFbdGhpcy5faWR4KC0xLG8pXT10aGlzLmRhdGFbdGhpcy5faWR4KDAsby0xKV0sdGhpcy5kYXRhW3RoaXMuX2lkeChvLG8pXT10aGlzLmRhdGFbdGhpcy5faWR4KG8tMSxvLTEpXSx0aGlzLm1pbj1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUix0aGlzLm1heD1OdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtmb3IobGV0IHQ9MDt0PG87dCsrKWZvcihsZXQgZT0wO2U8bztlKyspe2NvbnN0IHI9dGhpcy5nZXQodCxlKTtyPnRoaXMubWF4JiYodGhpcy5tYXg9cikscjx0aGlzLm1pbiYmKHRoaXMubWluPXIpO319Z2V0KHQsZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSxuPTQqdGhpcy5faWR4KHQsZSk7cmV0dXJuIHRoaXMudW5wYWNrKHJbbl0scltuKzFdLHJbbisyXSl9Z2V0VW5wYWNrVmVjdG9yKCl7cmV0dXJuIFt0aGlzLnJlZEZhY3Rvcix0aGlzLmdyZWVuRmFjdG9yLHRoaXMuYmx1ZUZhY3Rvcix0aGlzLmJhc2VTaGlmdF19X2lkeCh0LGUpe2lmKHQ8LTF8fHQ+PXRoaXMuZGltKzF8fGU8LTF8fGU+PXRoaXMuZGltKzEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgcmFuZ2Ugc291cmNlIGNvb3JkaW5hdGVzIGZvciBERU0gZGF0YVwiKTtyZXR1cm4gKGUrMSkqdGhpcy5zdHJpZGUrKHQrMSl9dW5wYWNrKHQsZSxyKXtyZXR1cm4gdCp0aGlzLnJlZEZhY3RvcitlKnRoaXMuZ3JlZW5GYWN0b3Ircip0aGlzLmJsdWVGYWN0b3ItdGhpcy5iYXNlU2hpZnR9Z2V0UGl4ZWxzKCl7cmV0dXJuIG5ldyBBbyh7d2lkdGg6dGhpcy5zdHJpZGUsaGVpZ2h0OnRoaXMuc3RyaWRlfSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSl9YmFja2ZpbGxCb3JkZXIodCxlLHIpe2lmKHRoaXMuZGltIT09dC5kaW0pdGhyb3cgbmV3IEVycm9yKFwiZGVtIGRpbWVuc2lvbiBtaXNtYXRjaFwiKTtsZXQgbj1lKnRoaXMuZGltLGk9ZSp0aGlzLmRpbSt0aGlzLmRpbSxzPXIqdGhpcy5kaW0sYT1yKnRoaXMuZGltK3RoaXMuZGltO3N3aXRjaChlKXtjYXNlLTE6bj1pLTE7YnJlYWs7Y2FzZSAxOmk9bisxO31zd2l0Y2gocil7Y2FzZS0xOnM9YS0xO2JyZWFrO2Nhc2UgMTphPXMrMTt9Y29uc3Qgbz0tZSp0aGlzLmRpbSxsPS1yKnRoaXMuZGltO2ZvcihsZXQgZT1zO2U8YTtlKyspZm9yKGxldCByPW47cjxpO3IrKyl0aGlzLmRhdGFbdGhpcy5faWR4KHIsZSldPXQuZGF0YVt0aGlzLl9pZHgocitvLGUrbCldO319d2koXCJERU1EYXRhXCIsVWMpO2NsYXNzIHFje2NvbnN0cnVjdG9yKHQpe3RoaXMuX3N0cmluZ1RvTnVtYmVyPXt9LHRoaXMuX251bWJlclRvU3RyaW5nPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCByPXRbZV07dGhpcy5fc3RyaW5nVG9OdW1iZXJbcl09ZSx0aGlzLl9udW1iZXJUb1N0cmluZ1tlXT1yO319ZW5jb2RlKHQpe3JldHVybiB0aGlzLl9zdHJpbmdUb051bWJlclt0XX1kZWNvZGUodCl7aWYodD49dGhpcy5fbnVtYmVyVG9TdHJpbmcubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgT3V0IG9mIGJvdW5kcy4gSW5kZXggcmVxdWVzdGVkIG49JHt0fSBjYW4ndCBiZSA+PSB0aGlzLl9udW1iZXJUb1N0cmluZy5sZW5ndGggJHt0aGlzLl9udW1iZXJUb1N0cmluZy5sZW5ndGh9YCk7cmV0dXJuIHRoaXMuX251bWJlclRvU3RyaW5nW3RdfX1jbGFzcyBOY3tjb25zdHJ1Y3Rvcih0LGUscixuLGkpe3RoaXMudHlwZT1cIkZlYXR1cmVcIix0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZT10LHQuX3o9ZSx0Ll94PXIsdC5feT1uLHRoaXMucHJvcGVydGllcz10LnByb3BlcnRpZXMsdGhpcy5pZD1pO31nZXQgZ2VvbWV0cnkoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5fZ2VvbWV0cnkmJih0aGlzLl9nZW9tZXRyeT10aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS50b0dlb0pTT04odGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUuX3gsdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUuX3ksdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUuX3opLmdlb21ldHJ5KSx0aGlzLl9nZW9tZXRyeX1zZXQgZ2VvbWV0cnkodCl7dGhpcy5fZ2VvbWV0cnk9dDt9dG9KU09OKCl7Y29uc3QgdD17Z2VvbWV0cnk6dGhpcy5nZW9tZXRyeX07Zm9yKGNvbnN0IGUgaW4gdGhpcylcIl9nZW9tZXRyeVwiIT09ZSYmXCJfdmVjdG9yVGlsZUZlYXR1cmVcIiE9PWUmJih0W2VdPXRoaXNbZV0pO3JldHVybiB0fX1jbGFzcyBaY3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudGlsZUlEPXQsdGhpcy54PXQuY2Fub25pY2FsLngsdGhpcy55PXQuY2Fub25pY2FsLnksdGhpcy56PXQuY2Fub25pY2FsLnosdGhpcy5ncmlkPW5ldyB2aSgkYSwxNiwwKSx0aGlzLmdyaWQzRD1uZXcgdmkoJGEsMTYsMCksdGhpcy5mZWF0dXJlSW5kZXhBcnJheT1uZXcgTnMsdGhpcy5wcm9tb3RlSWQ9ZTt9aW5zZXJ0KHQsZSxyLG4saSxzKXtjb25zdCBhPXRoaXMuZmVhdHVyZUluZGV4QXJyYXkubGVuZ3RoO3RoaXMuZmVhdHVyZUluZGV4QXJyYXkuZW1wbGFjZUJhY2socixuLGkpO2NvbnN0IG89cz90aGlzLmdyaWQzRDp0aGlzLmdyaWQ7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IHI9ZVt0XSxuPVsxLzAsMS8wLC0xLzAsLTEvMF07Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspe2NvbnN0IGU9clt0XTtuWzBdPU1hdGgubWluKG5bMF0sZS54KSxuWzFdPU1hdGgubWluKG5bMV0sZS55KSxuWzJdPU1hdGgubWF4KG5bMl0sZS54KSxuWzNdPU1hdGgubWF4KG5bM10sZS55KTt9blswXTwkYSYmblsxXTwkYSYmblsyXT49MCYmblszXT49MCYmby5pbnNlcnQoYSxuWzBdLG5bMV0sblsyXSxuWzNdKTt9fWxvYWRWVExheWVycygpe3JldHVybiB0aGlzLnZ0TGF5ZXJzfHwodGhpcy52dExheWVycz1uZXcgZmwuVmVjdG9yVGlsZShuZXcgSXUodGhpcy5yYXdUaWxlRGF0YSkpLmxheWVycyx0aGlzLnNvdXJjZUxheWVyQ29kZXI9bmV3IHFjKHRoaXMudnRMYXllcnM/T2JqZWN0LmtleXModGhpcy52dExheWVycykuc29ydCgpOltcIl9nZW9qc29uVGlsZUxheWVyXCJdKSksdGhpcy52dExheWVyc31xdWVyeSh0LGUscixuKXt0aGlzLmxvYWRWVExheWVycygpO2NvbnN0IGk9dC5wYXJhbXN8fHt9LGE9JGEvdC50aWxlU2l6ZS90LnNjYWxlLG89em4oaS5maWx0ZXIpLGw9dC5xdWVyeUdlb21ldHJ5LHU9dC5xdWVyeVBhZGRpbmcqYSxjPUtjKGwpLGg9dGhpcy5ncmlkLnF1ZXJ5KGMubWluWC11LGMubWluWS11LGMubWF4WCt1LGMubWF4WSt1KSxwPUtjKHQuY2FtZXJhUXVlcnlHZW9tZXRyeSksZj10aGlzLmdyaWQzRC5xdWVyeShwLm1pblgtdSxwLm1pblktdSxwLm1heFgrdSxwLm1heFkrdSwoKGUscixuLGkpPT5mdW5jdGlvbih0LGUscixuLGkpe2Zvcihjb25zdCBzIG9mIHQpaWYoZTw9cy54JiZyPD1zLnkmJm4+PXMueCYmaT49cy55KXJldHVybiAhMDtjb25zdCBhPVtuZXcgcyhlLHIpLG5ldyBzKGUsaSksbmV3IHMobixpKSxuZXcgcyhuLHIpXTtpZih0Lmxlbmd0aD4yKWZvcihjb25zdCBlIG9mIGEpaWYoV2EodCxlKSlyZXR1cm4gITA7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aC0xO2UrKylpZihRYSh0W2VdLHRbZSsxXSxhKSlyZXR1cm4gITA7cmV0dXJuICExfSh0LmNhbWVyYVF1ZXJ5R2VvbWV0cnksZS11LHItdSxuK3UsaSt1KSkpO2Zvcihjb25zdCB0IG9mIGYpaC5wdXNoKHQpO2guc29ydChYYyk7Y29uc3QgZD17fTtsZXQgeTtmb3IobGV0IHM9MDtzPGgubGVuZ3RoO3MrKyl7Y29uc3QgdT1oW3NdO2lmKHU9PT15KWNvbnRpbnVlO3k9dTtjb25zdCBjPXRoaXMuZmVhdHVyZUluZGV4QXJyYXkuZ2V0KHUpO2xldCBwPW51bGw7dGhpcy5sb2FkTWF0Y2hpbmdGZWF0dXJlKGQsYy5idWNrZXRJbmRleCxjLnNvdXJjZUxheWVySW5kZXgsYy5mZWF0dXJlSW5kZXgsbyxpLmxheWVycyxpLmF2YWlsYWJsZUltYWdlcyxlLHIsbiwoKGUscixuKT0+KHB8fChwPU9hKGUpKSxyLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUobCxlLG4scCx0aGlzLnosdC50cmFuc2Zvcm0sYSx0LnBpeGVsUG9zTWF0cml4KSkpKTt9cmV0dXJuIGR9bG9hZE1hdGNoaW5nRmVhdHVyZSh0LGUscixuLGkscyxhLG8sbCx1LGMpe2NvbnN0IGg9dGhpcy5idWNrZXRMYXllcklEc1tlXTtpZihzJiYhZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKylpZihlLmluZGV4T2YodFtyXSk+PTApcmV0dXJuICEwO3JldHVybiAhMX0ocyxoKSlyZXR1cm47Y29uc3QgcD10aGlzLnNvdXJjZUxheWVyQ29kZXIuZGVjb2RlKHIpLGY9dGhpcy52dExheWVyc1twXS5mZWF0dXJlKG4pO2lmKGkubmVlZEdlb21ldHJ5KXtjb25zdCB0PWphKGYsITApO2lmKCFpLmZpbHRlcihuZXcgVWkodGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLHQsdGhpcy50aWxlSUQuY2Fub25pY2FsKSlyZXR1cm59ZWxzZSBpZighaS5maWx0ZXIobmV3IFVpKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSxmKSlyZXR1cm47Y29uc3QgZD10aGlzLmdldElkKGYscCk7Zm9yKGxldCBlPTA7ZTxoLmxlbmd0aDtlKyspe2NvbnN0IHI9aFtlXTtpZihzJiZzLmluZGV4T2Yocik8MCljb250aW51ZTtjb25zdCBpPW9bcl07aWYoIWkpY29udGludWU7bGV0IHA9e307ZCYmdSYmKHA9dS5nZXRTdGF0ZShpLnNvdXJjZUxheWVyfHxcIl9nZW9qc29uVGlsZUxheWVyXCIsZCkpO2NvbnN0IHk9Zyh7fSxsW3JdKTt5LnBhaW50PUdjKHkucGFpbnQsaS5wYWludCxmLHAsYSkseS5sYXlvdXQ9R2MoeS5sYXlvdXQsaS5sYXlvdXQsZixwLGEpO2NvbnN0IG09IWN8fGMoZixpLHApO2lmKCFtKWNvbnRpbnVlO2NvbnN0IHg9bmV3IE5jKGYsdGhpcy56LHRoaXMueCx0aGlzLnksZCk7eC5sYXllcj15O2xldCB2PXRbcl07dm9pZCAwPT09diYmKHY9dFtyXT1bXSksdi5wdXNoKHtmZWF0dXJlSW5kZXg6bixmZWF0dXJlOngsaW50ZXJzZWN0aW9uWjptfSk7fX1sb29rdXBTeW1ib2xGZWF0dXJlcyh0LGUscixuLGkscyxhLG8pe2NvbnN0IGw9e307dGhpcy5sb2FkVlRMYXllcnMoKTtjb25zdCB1PXpuKGkpO2Zvcihjb25zdCBpIG9mIHQpdGhpcy5sb2FkTWF0Y2hpbmdGZWF0dXJlKGwscixuLGksdSxzLGEsbyxlKTtyZXR1cm4gbH1oYXNMYXllcih0KXtmb3IoY29uc3QgZSBvZiB0aGlzLmJ1Y2tldExheWVySURzKWZvcihjb25zdCByIG9mIGUpaWYodD09PXIpcmV0dXJuICEwO3JldHVybiAhMX1nZXRJZCh0LGUpe2xldCByPXQuaWQ7cmV0dXJuIHRoaXMucHJvbW90ZUlkJiYocj10LnByb3BlcnRpZXNbXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMucHJvbW90ZUlkP3RoaXMucHJvbW90ZUlkOnRoaXMucHJvbW90ZUlkW2VdXSxcImJvb2xlYW5cIj09dHlwZW9mIHImJihyPU51bWJlcihyKSkpLHJ9fWZ1bmN0aW9uIEdjKHQsZSxyLG4saSl7cmV0dXJuIHYodCwoKHQscyk9Pntjb25zdCBhPWUgaW5zdGFuY2VvZiBZaT9lLmdldChzKTpudWxsO3JldHVybiBhJiZhLmV2YWx1YXRlP2EuZXZhbHVhdGUocixuLGkpOmF9KSl9ZnVuY3Rpb24gS2ModCl7bGV0IGU9MS8wLHI9MS8wLG49LTEvMCxpPS0xLzA7Zm9yKGNvbnN0IHMgb2YgdCllPU1hdGgubWluKGUscy54KSxyPU1hdGgubWluKHIscy55KSxuPU1hdGgubWF4KG4scy54KSxpPU1hdGgubWF4KGkscy55KTtyZXR1cm4ge21pblg6ZSxtaW5ZOnIsbWF4WDpuLG1heFk6aX19ZnVuY3Rpb24gWGModCxlKXtyZXR1cm4gZS10fWZ1bmN0aW9uIEhjKHQsZSxyLG4saSl7Y29uc3QgYT1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgbD10W29dO2xldCB1O2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGgtMTt0Kyspe2xldCBvPWxbdF0sYz1sW3QrMV07by54PGUmJmMueDxlfHwoby54PGU/bz1uZXcgcyhlLG8ueSsoZS1vLngpLyhjLngtby54KSooYy55LW8ueSkpLl9yb3VuZCgpOmMueDxlJiYoYz1uZXcgcyhlLG8ueSsoZS1vLngpLyhjLngtby54KSooYy55LW8ueSkpLl9yb3VuZCgpKSxvLnk8ciYmYy55PHJ8fChvLnk8cj9vPW5ldyBzKG8ueCsoci1vLnkpLyhjLnktby55KSooYy54LW8ueCkscikuX3JvdW5kKCk6Yy55PHImJihjPW5ldyBzKG8ueCsoci1vLnkpLyhjLnktby55KSooYy54LW8ueCkscikuX3JvdW5kKCkpLG8ueD49biYmYy54Pj1ufHwoby54Pj1uP289bmV3IHMobixvLnkrKG4tby54KS8oYy54LW8ueCkqKGMueS1vLnkpKS5fcm91bmQoKTpjLng+PW4mJihjPW5ldyBzKG4sby55KyhuLW8ueCkvKGMueC1vLngpKihjLnktby55KSkuX3JvdW5kKCkpLG8ueT49aSYmYy55Pj1pfHwoby55Pj1pP289bmV3IHMoby54KyhpLW8ueSkvKGMueS1vLnkpKihjLngtby54KSxpKS5fcm91bmQoKTpjLnk+PWkmJihjPW5ldyBzKG8ueCsoaS1vLnkpLyhjLnktby55KSooYy54LW8ueCksaSkuX3JvdW5kKCkpLHUmJm8uZXF1YWxzKHVbdS5sZW5ndGgtMV0pfHwodT1bb10sYS5wdXNoKHUpKSx1LnB1c2goYykpKSkpO319cmV0dXJuIGF9d2koXCJGZWF0dXJlSW5kZXhcIixaYyx7b21pdDpbXCJyYXdUaWxlRGF0YVwiLFwic291cmNlTGF5ZXJDb2RlclwiXX0pO2NsYXNzIFljIGV4dGVuZHMgc3tjb25zdHJ1Y3Rvcih0LGUscixuKXtzdXBlcih0LGUpLHRoaXMuYW5nbGU9cix2b2lkIDAhPT1uJiYodGhpcy5zZWdtZW50PW4pO31jbG9uZSgpe3JldHVybiBuZXcgWWModGhpcy54LHRoaXMueSx0aGlzLmFuZ2xlLHRoaXMuc2VnbWVudCl9fWZ1bmN0aW9uIEpjKHQsZSxyLG4saSl7aWYodm9pZCAwPT09ZS5zZWdtZW50fHwwPT09cilyZXR1cm4gITA7bGV0IHM9ZSxhPWUuc2VnbWVudCsxLG89MDtmb3IoO28+LXIvMjspe2lmKGEtLSxhPDApcmV0dXJuICExO28tPXRbYV0uZGlzdChzKSxzPXRbYV07fW8rPXRbYV0uZGlzdCh0W2ErMV0pLGErKztjb25zdCBsPVtdO2xldCB1PTA7Zm9yKDtvPHIvMjspe2NvbnN0IGU9dFthXSxyPXRbYSsxXTtpZighcilyZXR1cm4gITE7bGV0IHM9dFthLTFdLmFuZ2xlVG8oZSktZS5hbmdsZVRvKHIpO2ZvcihzPU1hdGguYWJzKChzKzMqTWF0aC5QSSklKDIqTWF0aC5QSSktTWF0aC5QSSksbC5wdXNoKHtkaXN0YW5jZTpvLGFuZ2xlRGVsdGE6c30pLHUrPXM7by1sWzBdLmRpc3RhbmNlPm47KXUtPWwuc2hpZnQoKS5hbmdsZURlbHRhO2lmKHU+aSlyZXR1cm4gITE7YSsrLG8rPWUuZGlzdChyKTt9cmV0dXJuICEwfWZ1bmN0aW9uIFdjKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aC0xO3IrKyllKz10W3JdLmRpc3QodFtyKzFdKTtyZXR1cm4gZX1mdW5jdGlvbiBRYyh0LGUscil7cmV0dXJuIHQ/LjYqZSpyOjB9ZnVuY3Rpb24gdGgodCxlKXtyZXR1cm4gTWF0aC5tYXgodD90LnJpZ2h0LXQubGVmdDowLGU/ZS5yaWdodC1lLmxlZnQ6MCl9ZnVuY3Rpb24gZWgodCxlLHIsbixpLHMpe2NvbnN0IGE9UWMocixpLHMpLG89dGgocixuKSpzO2xldCBsPTA7Y29uc3QgdT1XYyh0KS8yO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGgtMTtyKyspe2NvbnN0IG49dFtyXSxpPXRbcisxXSxzPW4uZGlzdChpKTtpZihsK3M+dSl7Y29uc3QgYz0odS1sKS9zLGg9Q2UubnVtYmVyKG4ueCxpLngsYykscD1DZS5udW1iZXIobi55LGkueSxjKSxmPW5ldyBZYyhoLHAsaS5hbmdsZVRvKG4pLHIpO3JldHVybiBmLl9yb3VuZCgpLCFhfHxKYyh0LGYsbyxhLGUpP2Y6dm9pZCAwfWwrPXM7fX1mdW5jdGlvbiByaCh0LGUscixuLGkscyxhLG8sbCl7Y29uc3QgdT1RYyhuLHMsYSksYz10aChuLGkpLGg9YyphLHA9MD09PXRbMF0ueHx8dFswXS54PT09bHx8MD09PXRbMF0ueXx8dFswXS55PT09bDtyZXR1cm4gZS1oPGUvNCYmKGU9aCtlLzQpLG5oKHQscD9lLzIqbyVlOihjLzIrMipzKSphKm8lZSxlLHUscixoLHAsITEsbCl9ZnVuY3Rpb24gbmgodCxlLHIsbixpLHMsYSxvLGwpe2NvbnN0IHU9cy8yLGM9V2ModCk7bGV0IGg9MCxwPWUtcixmPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMTtlKyspe2NvbnN0IGE9dFtlXSxvPXRbZSsxXSxkPWEuZGlzdChvKSx5PW8uYW5nbGVUbyhhKTtmb3IoO3ArcjxoK2Q7KXtwKz1yO2NvbnN0IG09KHAtaCkvZCxnPUNlLm51bWJlcihhLngsby54LG0pLHg9Q2UubnVtYmVyKGEueSxvLnksbSk7aWYoZz49MCYmZzxsJiZ4Pj0wJiZ4PGwmJnAtdT49MCYmcCt1PD1jKXtjb25zdCByPW5ldyBZYyhnLHgseSxlKTtyLl9yb3VuZCgpLG4mJiFKYyh0LHIscyxuLGkpfHxmLnB1c2gocik7fX1oKz1kO31yZXR1cm4gb3x8Zi5sZW5ndGh8fGF8fChmPW5oKHQsaC8yLHIsbixpLHMsYSwhMCxsKSksZn13aShcIkFuY2hvclwiLFljKTtjb25zdCBpaD1GdTtmdW5jdGlvbiBzaCh0LGUscixuKXtjb25zdCBpPVtdLGE9dC5pbWFnZSxvPWEucGl4ZWxSYXRpbyxsPWEucGFkZGVkUmVjdC53LTIqaWgsdT1hLnBhZGRlZFJlY3QuaC0yKmloO2xldCBjPXt4MTp0LmxlZnQseTE6dC50b3AseDI6dC5yaWdodCx5Mjp0LmJvdHRvbX07Y29uc3QgaD1hLnN0cmV0Y2hYfHxbWzAsbF1dLHA9YS5zdHJldGNoWXx8W1swLHVdXSxmPSh0LGUpPT50K2VbMV0tZVswXSxkPWgucmVkdWNlKGYsMCkseT1wLnJlZHVjZShmLDApLG09bC1kLGc9dS15O2xldCB4PTAsdj1kLGI9MCx3PXksXz0wLEE9bSxTPTAsaz1nO2lmKGEuY29udGVudCYmbil7Y29uc3QgZT1hLmNvbnRlbnQscj1lWzJdLWVbMF0sbj1lWzNdLWVbMV07KGEudGV4dEZpdFdpZHRofHxhLnRleHRGaXRIZWlnaHQpJiYoYz10Yyh0KSkseD1haChoLDAsZVswXSksYj1haChwLDAsZVsxXSksdj1haChoLGVbMF0sZVsyXSksdz1haChwLGVbMV0sZVszXSksXz1lWzBdLXgsUz1lWzFdLWIsQT1yLXYsaz1uLXc7fWNvbnN0IE09Yy54MSxJPWMueTEsej1jLngyLU0sUD1jLnkyLUksQz0odCxuLGksbCk9Pntjb25zdCB1PWxoKHQuc3RyZXRjaC14LHYseixNKSxjPXVoKHQuZml4ZWQtXyxBLHQuc3RyZXRjaCxkKSxoPWxoKG4uc3RyZXRjaC1iLHcsUCxJKSxwPXVoKG4uZml4ZWQtUyxrLG4uc3RyZXRjaCx5KSxmPWxoKGkuc3RyZXRjaC14LHYseixNKSxtPXVoKGkuZml4ZWQtXyxBLGkuc3RyZXRjaCxkKSxnPWxoKGwuc3RyZXRjaC1iLHcsUCxJKSxDPXVoKGwuZml4ZWQtUyxrLGwuc3RyZXRjaCx5KSxCPW5ldyBzKHUsaCksVj1uZXcgcyhmLGgpLEU9bmV3IHMoZixnKSxGPW5ldyBzKHUsZyksVD1uZXcgcyhjL28scC9vKSwkPW5ldyBzKG0vbyxDL28pLEw9ZSpNYXRoLlBJLzE4MDtpZihMKXtjb25zdCB0PU1hdGguc2luKEwpLGU9TWF0aC5jb3MoTCkscj1bZSwtdCx0LGVdO0IuX21hdE11bHQociksVi5fbWF0TXVsdChyKSxGLl9tYXRNdWx0KHIpLEUuX21hdE11bHQocik7fWNvbnN0IEQ9dC5zdHJldGNoK3QuZml4ZWQsTz1uLnN0cmV0Y2grbi5maXhlZDtyZXR1cm4ge3RsOkIsdHI6VixibDpGLGJyOkUsdGV4Ont4OmEucGFkZGVkUmVjdC54K2loK0QseTphLnBhZGRlZFJlY3QueStpaCtPLHc6aS5zdHJldGNoK2kuZml4ZWQtRCxoOmwuc3RyZXRjaCtsLmZpeGVkLU99LHdyaXRpbmdNb2RlOnZvaWQgMCxnbHlwaE9mZnNldDpbMCwwXSxzZWN0aW9uSW5kZXg6MCxwaXhlbE9mZnNldFRMOlQscGl4ZWxPZmZzZXRCUjokLG1pbkZvbnRTY2FsZVg6QS9vL3osbWluRm9udFNjYWxlWTprL28vUCxpc1NERjpyfX07aWYobiYmKGEuc3RyZXRjaFh8fGEuc3RyZXRjaFkpKXtjb25zdCB0PW9oKGgsbSxkKSxlPW9oKHAsZyx5KTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoLTE7cisrKXtjb25zdCBuPXRbcl0scz10W3IrMV07Zm9yKGxldCB0PTA7dDxlLmxlbmd0aC0xO3QrKylpLnB1c2goQyhuLGVbdF0scyxlW3QrMV0pKTt9fWVsc2UgaS5wdXNoKEMoe2ZpeGVkOjAsc3RyZXRjaDotMX0se2ZpeGVkOjAsc3RyZXRjaDotMX0se2ZpeGVkOjAsc3RyZXRjaDpsKzF9LHtmaXhlZDowLHN0cmV0Y2g6dSsxfSkpO3JldHVybiBpfWZ1bmN0aW9uIGFoKHQsZSxyKXtsZXQgbj0wO2Zvcihjb25zdCBpIG9mIHQpbis9TWF0aC5tYXgoZSxNYXRoLm1pbihyLGlbMV0pKS1NYXRoLm1heChlLE1hdGgubWluKHIsaVswXSkpO3JldHVybiBufWZ1bmN0aW9uIG9oKHQsZSxyKXtjb25zdCBuPVt7Zml4ZWQ6LWloLHN0cmV0Y2g6MH1dO2Zvcihjb25zdFtlLHJdb2YgdCl7Y29uc3QgdD1uW24ubGVuZ3RoLTFdO24ucHVzaCh7Zml4ZWQ6ZS10LnN0cmV0Y2gsc3RyZXRjaDp0LnN0cmV0Y2h9KSxuLnB1c2goe2ZpeGVkOmUtdC5zdHJldGNoLHN0cmV0Y2g6dC5zdHJldGNoKyhyLWUpfSk7fXJldHVybiBuLnB1c2goe2ZpeGVkOmUraWgsc3RyZXRjaDpyfSksbn1mdW5jdGlvbiBsaCh0LGUscixuKXtyZXR1cm4gdC9lKnIrbn1mdW5jdGlvbiB1aCh0LGUscixuKXtyZXR1cm4gdC1lKnIvbn1jbGFzcyBjaHtjb25zdHJ1Y3Rvcih0LGUscixuLGksYSxvLGwsdSxjKXt2YXIgaDtpZih0aGlzLmJveFN0YXJ0SW5kZXg9dC5sZW5ndGgsdSl7bGV0IHQ9YS50b3AsZT1hLmJvdHRvbTtjb25zdCByPWEuY29sbGlzaW9uUGFkZGluZztyJiYodC09clsxXSxlKz1yWzNdKTtsZXQgbj1lLXQ7bj4wJiYobj1NYXRoLm1heCgxMCxuKSx0aGlzLmNpcmNsZURpYW1ldGVyPW4pO31lbHNlIHtjb25zdCB1PShudWxsPT09KGg9YS5pbWFnZSl8fHZvaWQgMD09PWg/dm9pZCAwOmguY29udGVudCkmJihhLmltYWdlLnRleHRGaXRXaWR0aHx8YS5pbWFnZS50ZXh0Rml0SGVpZ2h0KT90YyhhKTp7eDE6YS5sZWZ0LHkxOmEudG9wLHgyOmEucmlnaHQseTI6YS5ib3R0b219O3UueTE9dS55MSpvLWxbMF0sdS55Mj11LnkyKm8rbFsyXSx1LngxPXUueDEqby1sWzNdLHUueDI9dS54MipvK2xbMV07Y29uc3QgcD1hLmNvbGxpc2lvblBhZGRpbmc7aWYocCYmKHUueDEtPXBbMF0qbyx1LnkxLT1wWzFdKm8sdS54Mis9cFsyXSpvLHUueTIrPXBbM10qbyksYyl7Y29uc3QgdD1uZXcgcyh1LngxLHUueTEpLGU9bmV3IHModS54Mix1LnkxKSxyPW5ldyBzKHUueDEsdS55Miksbj1uZXcgcyh1LngyLHUueTIpLGk9YypNYXRoLlBJLzE4MDt0Ll9yb3RhdGUoaSksZS5fcm90YXRlKGkpLHIuX3JvdGF0ZShpKSxuLl9yb3RhdGUoaSksdS54MT1NYXRoLm1pbih0LngsZS54LHIueCxuLngpLHUueDI9TWF0aC5tYXgodC54LGUueCxyLngsbi54KSx1LnkxPU1hdGgubWluKHQueSxlLnksci55LG4ueSksdS55Mj1NYXRoLm1heCh0LnksZS55LHIueSxuLnkpO310LmVtcGxhY2VCYWNrKGUueCxlLnksdS54MSx1LnkxLHUueDIsdS55MixyLG4saSk7fXRoaXMuYm94RW5kSW5kZXg9dC5sZW5ndGg7fX1jbGFzcyBoaHtjb25zdHJ1Y3Rvcih0PVtdLGU9KCh0LGUpPT50PGU/LTE6dD5lPzE6MCkpe2lmKHRoaXMuZGF0YT10LHRoaXMubGVuZ3RoPXRoaXMuZGF0YS5sZW5ndGgsdGhpcy5jb21wYXJlPWUsdGhpcy5sZW5ndGg+MClmb3IobGV0IHQ9KHRoaXMubGVuZ3RoPj4xKS0xO3Q+PTA7dC0tKXRoaXMuX2Rvd24odCk7fXB1c2godCl7dGhpcy5kYXRhLnB1c2godCksdGhpcy5fdXAodGhpcy5sZW5ndGgrKyk7fXBvcCgpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm47Y29uc3QgdD10aGlzLmRhdGFbMF0sZT10aGlzLmRhdGEucG9wKCk7cmV0dXJuIC0tdGhpcy5sZW5ndGg+MCYmKHRoaXMuZGF0YVswXT1lLHRoaXMuX2Rvd24oMCkpLHR9cGVlaygpe3JldHVybiB0aGlzLmRhdGFbMF19X3VwKHQpe2NvbnN0e2RhdGE6ZSxjb21wYXJlOnJ9PXRoaXMsbj1lW3RdO2Zvcig7dD4wOyl7Y29uc3QgaT10LTE+PjEscz1lW2ldO2lmKHIobixzKT49MClicmVhaztlW3RdPXMsdD1pO31lW3RdPW47fV9kb3duKHQpe2NvbnN0e2RhdGE6ZSxjb21wYXJlOnJ9PXRoaXMsbj10aGlzLmxlbmd0aD4+MSxpPWVbdF07Zm9yKDt0PG47KXtsZXQgbj0xKyh0PDwxKTtjb25zdCBzPW4rMTtpZihzPHRoaXMubGVuZ3RoJiZyKGVbc10sZVtuXSk8MCYmKG49cykscihlW25dLGkpPj0wKWJyZWFrO2VbdF09ZVtuXSx0PW47fWVbdF09aTt9fWZ1bmN0aW9uIHBoKHQsZT0xLHI9ITEpe2xldCBuPTEvMCxpPTEvMCxhPS0xLzAsbz0tMS8wO2NvbnN0IGw9dFswXTtmb3IobGV0IHQ9MDt0PGwubGVuZ3RoO3QrKyl7Y29uc3QgZT1sW3RdOyghdHx8ZS54PG4pJiYobj1lLngpLCghdHx8ZS55PGkpJiYoaT1lLnkpLCghdHx8ZS54PmEpJiYoYT1lLngpLCghdHx8ZS55Pm8pJiYobz1lLnkpO31jb25zdCB1PU1hdGgubWluKGEtbixvLWkpO2xldCBjPXUvMjtjb25zdCBoPW5ldyBoaChbXSxmaCk7aWYoMD09PXUpcmV0dXJuIG5ldyBzKG4saSk7Zm9yKGxldCBlPW47ZTxhO2UrPXUpZm9yKGxldCByPWk7cjxvO3IrPXUpaC5wdXNoKG5ldyBkaChlK2MscitjLGMsdCkpO2xldCBwPWZ1bmN0aW9uKHQpe2xldCBlPTAscj0wLG49MDtjb25zdCBpPXRbMF07Zm9yKGxldCB0PTAscz1pLmxlbmd0aCxhPXMtMTt0PHM7YT10Kyspe2NvbnN0IHM9aVt0XSxvPWlbYV0sbD1zLngqby55LW8ueCpzLnk7cis9KHMueCtvLngpKmwsbis9KHMueStvLnkpKmwsZSs9MypsO31yZXR1cm4gbmV3IGRoKHIvZSxuL2UsMCx0KX0odCksZj1oLmxlbmd0aDtmb3IoO2gubGVuZ3RoOyl7Y29uc3Qgbj1oLnBvcCgpOyhuLmQ+cC5kfHwhcC5kKSYmKHA9bixyJiZjb25zb2xlLmxvZyhcImZvdW5kIGJlc3QgJWQgYWZ0ZXIgJWQgcHJvYmVzXCIsTWF0aC5yb3VuZCgxZTQqbi5kKS8xZTQsZikpLG4ubWF4LXAuZDw9ZXx8KGM9bi5oLzIsaC5wdXNoKG5ldyBkaChuLnAueC1jLG4ucC55LWMsYyx0KSksaC5wdXNoKG5ldyBkaChuLnAueCtjLG4ucC55LWMsYyx0KSksaC5wdXNoKG5ldyBkaChuLnAueC1jLG4ucC55K2MsYyx0KSksaC5wdXNoKG5ldyBkaChuLnAueCtjLG4ucC55K2MsYyx0KSksZis9NCk7fXJldHVybiByJiYoY29uc29sZS5sb2coYG51bSBwcm9iZXM6ICR7Zn1gKSxjb25zb2xlLmxvZyhgYmVzdCBkaXN0YW5jZTogJHtwLmR9YCkpLHAucH1mdW5jdGlvbiBmaCh0LGUpe3JldHVybiBlLm1heC10Lm1heH1mdW5jdGlvbiBkaCh0LGUscixuKXt0aGlzLnA9bmV3IHModCxlKSx0aGlzLmg9cix0aGlzLmQ9ZnVuY3Rpb24odCxlKXtsZXQgcj0hMSxuPTEvMDtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7Y29uc3Qgcz1lW2ldO2ZvcihsZXQgZT0wLGk9cy5sZW5ndGgsYT1pLTE7ZTxpO2E9ZSsrKXtjb25zdCBpPXNbZV0sbz1zW2FdO2kueT50LnkhPW8ueT50LnkmJnQueDwoby54LWkueCkqKHQueS1pLnkpLyhvLnktaS55KStpLngmJihyPSFyKSxuPU1hdGgubWluKG4sWWEodCxpLG8pKTt9fXJldHVybiAocj8xOi0xKSpNYXRoLnNxcnQobil9KHRoaXMucCxuKSx0aGlzLm1heD10aGlzLmQrdGhpcy5oKk1hdGguU1FSVDI7fXZhciB5aDt0LmFxPXZvaWQgMCwoeWg9dC5hcXx8KHQuYXE9e30pKVt5aC5jZW50ZXI9MV09XCJjZW50ZXJcIix5aFt5aC5sZWZ0PTJdPVwibGVmdFwiLHloW3loLnJpZ2h0PTNdPVwicmlnaHRcIix5aFt5aC50b3A9NF09XCJ0b3BcIix5aFt5aC5ib3R0b209NV09XCJib3R0b21cIix5aFt5aFtcInRvcC1sZWZ0XCJdPTZdPVwidG9wLWxlZnRcIix5aFt5aFtcInRvcC1yaWdodFwiXT03XT1cInRvcC1yaWdodFwiLHloW3loW1wiYm90dG9tLWxlZnRcIl09OF09XCJib3R0b20tbGVmdFwiLHloW3loW1wiYm90dG9tLXJpZ2h0XCJdPTldPVwiYm90dG9tLXJpZ2h0XCI7Y29uc3QgbWg9NyxnaD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7ZnVuY3Rpb24geGgodCxlKXtyZXR1cm4gZVsxXSE9PWdoP2Z1bmN0aW9uKHQsZSxyKXtsZXQgbj0wLGk9MDtzd2l0Y2goZT1NYXRoLmFicyhlKSxyPU1hdGguYWJzKHIpLHQpe2Nhc2VcInRvcC1yaWdodFwiOmNhc2VcInRvcC1sZWZ0XCI6Y2FzZVwidG9wXCI6aT1yLW1oO2JyZWFrO2Nhc2VcImJvdHRvbS1yaWdodFwiOmNhc2VcImJvdHRvbS1sZWZ0XCI6Y2FzZVwiYm90dG9tXCI6aT0tcittaDt9c3dpdGNoKHQpe2Nhc2VcInRvcC1yaWdodFwiOmNhc2VcImJvdHRvbS1yaWdodFwiOmNhc2VcInJpZ2h0XCI6bj0tZTticmVhaztjYXNlXCJ0b3AtbGVmdFwiOmNhc2VcImJvdHRvbS1sZWZ0XCI6Y2FzZVwibGVmdFwiOm49ZTt9cmV0dXJuIFtuLGldfSh0LGVbMF0sZVsxXSk6ZnVuY3Rpb24odCxlKXtsZXQgcj0wLG49MDtlPDAmJihlPTApO2NvbnN0IGk9ZS9NYXRoLlNRUlQyO3N3aXRjaCh0KXtjYXNlXCJ0b3AtcmlnaHRcIjpjYXNlXCJ0b3AtbGVmdFwiOm49aS1taDticmVhaztjYXNlXCJib3R0b20tcmlnaHRcIjpjYXNlXCJib3R0b20tbGVmdFwiOm49LWkrbWg7YnJlYWs7Y2FzZVwiYm90dG9tXCI6bj0tZSttaDticmVhaztjYXNlXCJ0b3BcIjpuPWUtbWg7fXN3aXRjaCh0KXtjYXNlXCJ0b3AtcmlnaHRcIjpjYXNlXCJib3R0b20tcmlnaHRcIjpyPS1pO2JyZWFrO2Nhc2VcInRvcC1sZWZ0XCI6Y2FzZVwiYm90dG9tLWxlZnRcIjpyPWk7YnJlYWs7Y2FzZVwibGVmdFwiOnI9ZTticmVhaztjYXNlXCJyaWdodFwiOnI9LWU7fXJldHVybiBbcixuXX0odCxlWzBdKX1mdW5jdGlvbiB2aCh0LGUscil7dmFyIG47Y29uc3QgaT10LmxheW91dCxzPW51bGw9PT0obj1pLmdldChcInRleHQtdmFyaWFibGUtYW5jaG9yLW9mZnNldFwiKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZXZhbHVhdGUoZSx7fSxyKTtpZihzKXtjb25zdCB0PXMudmFsdWVzLGU9W107Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKz0yKXtjb25zdCBuPWVbcl09dFtyXSxpPXRbcisxXS5tYXAoKHQ9PnQqaXUpKTtuLnN0YXJ0c1dpdGgoXCJ0b3BcIik/aVsxXS09bWg6bi5zdGFydHNXaXRoKFwiYm90dG9tXCIpJiYoaVsxXSs9bWgpLGVbcisxXT1pO31yZXR1cm4gbmV3IFF0KGUpfWNvbnN0IGE9aS5nZXQoXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiKTtpZihhKXtsZXQgbjtuPXZvaWQgMCE9PXQuX3VuZXZhbHVhdGVkTGF5b3V0LmdldFZhbHVlKFwidGV4dC1yYWRpYWwtb2Zmc2V0XCIpP1tpLmdldChcInRleHQtcmFkaWFsLW9mZnNldFwiKS5ldmFsdWF0ZShlLHt9LHIpKml1LGdoXTppLmdldChcInRleHQtb2Zmc2V0XCIpLmV2YWx1YXRlKGUse30scikubWFwKCh0PT50Kml1KSk7Y29uc3Qgcz1bXTtmb3IoY29uc3QgdCBvZiBhKXMucHVzaCh0LHhoKHQsbikpO3JldHVybiBuZXcgUXQocyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gYmgodCl7c3dpdGNoKHQpe2Nhc2VcInJpZ2h0XCI6Y2FzZVwidG9wLXJpZ2h0XCI6Y2FzZVwiYm90dG9tLXJpZ2h0XCI6cmV0dXJuIFwicmlnaHRcIjtjYXNlXCJsZWZ0XCI6Y2FzZVwidG9wLWxlZnRcIjpjYXNlXCJib3R0b20tbGVmdFwiOnJldHVybiBcImxlZnRcIn1yZXR1cm4gXCJjZW50ZXJcIn1mdW5jdGlvbiB3aChlLHIsbixpLHMsYSxvLGwsdSxjLGgpe2xldCBwPWEudGV4dE1heFNpemUuZXZhbHVhdGUocix7fSk7dm9pZCAwPT09cCYmKHA9byk7Y29uc3QgZj1lLmxheWVyc1swXS5sYXlvdXQsZD1mLmdldChcImljb24tb2Zmc2V0XCIpLmV2YWx1YXRlKHIse30saCkseT1BaChuLmhvcml6b250YWwpLG09by8yNCxnPWUudGlsZVBpeGVsUmF0aW8qbSx4PWUudGlsZVBpeGVsUmF0aW8qcC8yNCx2PWUudGlsZVBpeGVsUmF0aW8qbCxiPWUudGlsZVBpeGVsUmF0aW8qZi5nZXQoXCJzeW1ib2wtc3BhY2luZ1wiKSx3PWYuZ2V0KFwidGV4dC1wYWRkaW5nXCIpKmUudGlsZVBpeGVsUmF0aW8sXz1mdW5jdGlvbih0LGUscixuPTEpe2NvbnN0IGk9dC5nZXQoXCJpY29uLXBhZGRpbmdcIikuZXZhbHVhdGUoZSx7fSxyKSxzPWkmJmkudmFsdWVzO3JldHVybiBbc1swXSpuLHNbMV0qbixzWzJdKm4sc1szXSpuXX0oZixyLGgsZS50aWxlUGl4ZWxSYXRpbyksUz1mLmdldChcInRleHQtbWF4LWFuZ2xlXCIpLzE4MCpNYXRoLlBJLGs9XCJ2aWV3cG9ydFwiIT09Zi5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSYmXCJwb2ludFwiIT09Zi5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpLE09XCJtYXBcIj09PWYuZ2V0KFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIikmJlwicG9pbnRcIiE9PWYuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSxJPWYuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSx6PWIvMixQPWYuZ2V0KFwiaWNvbi10ZXh0LWZpdFwiKTtsZXQgQztpJiZcIm5vbmVcIiE9PVAmJihlLmFsbG93VmVydGljYWxQbGFjZW1lbnQmJm4udmVydGljYWwmJihDPWVjKGksbi52ZXJ0aWNhbCxQLGYuZ2V0KFwiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCIpLGQsbSkpLHkmJihpPWVjKGkseSxQLGYuZ2V0KFwiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCIpLGQsbSkpKTtjb25zdCBCPShsLHApPT57cC54PDB8fHAueD49JGF8fHAueTwwfHxwLnk+PSRhfHxmdW5jdGlvbihlLHIsbixpLHMsYSxvLGwsdSxjLGgscCxmLGQseSxtLGcseCx2LGIsdyxfLFMsayxNKXtjb25zdCBJPWUuYWRkVG9MaW5lVmVydGV4QXJyYXkocixuKTtsZXQgeixQLEMsQixWPTAsRT0wLEY9MCxUPTAsJD0tMSxMPS0xO2NvbnN0IEQ9e307bGV0IE89bWEoXCJcIik7aWYoZS5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50JiZpLnZlcnRpY2FsKXtjb25zdCB0PWwubGF5b3V0LmdldChcInRleHQtcm90YXRlXCIpLmV2YWx1YXRlKHcse30saykrOTA7Qz1uZXcgY2godSxyLGMsaCxwLGkudmVydGljYWwsZixkLHksdCksbyYmKEI9bmV3IGNoKHUscixjLGgscCxvLGcseCx5LHQpKTt9aWYocyl7Y29uc3Qgbj1sLmxheW91dC5nZXQoXCJpY29uLXJvdGF0ZVwiKS5ldmFsdWF0ZSh3LHt9KSxpPVwibm9uZVwiIT09bC5sYXlvdXQuZ2V0KFwiaWNvbi10ZXh0LWZpdFwiKSxhPXNoKHMsbixTLGkpLGY9bz9zaChvLG4sUyxpKTp2b2lkIDA7UD1uZXcgY2godSxyLGMsaCxwLHMsZyx4LCExLG4pLFY9NCphLmxlbmd0aDtjb25zdCBkPWUuaWNvblNpemVEYXRhO2xldCB5PW51bGw7XCJzb3VyY2VcIj09PWQua2luZD8oeT1bbmMqbC5sYXlvdXQuZ2V0KFwiaWNvbi1zaXplXCIpLmV2YWx1YXRlKHcse30pXSx5WzBdPmljJiZBKGAke2UubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAke3JjfS4gUmVkdWNlIHlvdXIgXCJpY29uLXNpemVcIi5gKSk6XCJjb21wb3NpdGVcIj09PWQua2luZCYmKHk9W25jKl8uY29tcG9zaXRlSWNvblNpemVzWzBdLmV2YWx1YXRlKHcse30sayksbmMqXy5jb21wb3NpdGVJY29uU2l6ZXNbMV0uZXZhbHVhdGUodyx7fSxrKV0sKHlbMF0+aWN8fHlbMV0+aWMpJiZBKGAke2UubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAke3JjfS4gUmVkdWNlIHlvdXIgXCJpY29uLXNpemVcIi5gKSksZS5hZGRTeW1ib2xzKGUuaWNvbixhLHksYix2LHcsdC5haC5ub25lLHIsSS5saW5lU3RhcnRJbmRleCxJLmxpbmVMZW5ndGgsLTEsayksJD1lLmljb24ucGxhY2VkU3ltYm9sQXJyYXkubGVuZ3RoLTEsZiYmKEU9NCpmLmxlbmd0aCxlLmFkZFN5bWJvbHMoZS5pY29uLGYseSxiLHYsdyx0LmFoLnZlcnRpY2FsLHIsSS5saW5lU3RhcnRJbmRleCxJLmxpbmVMZW5ndGgsLTEsayksTD1lLmljb24ucGxhY2VkU3ltYm9sQXJyYXkubGVuZ3RoLTEpO31jb25zdCBqPU9iamVjdC5rZXlzKGkuaG9yaXpvbnRhbCk7Zm9yKGNvbnN0IG4gb2Ygail7Y29uc3Qgcz1pLmhvcml6b250YWxbbl07aWYoIXope089bWEocy50ZXh0KTtjb25zdCB0PWwubGF5b3V0LmdldChcInRleHQtcm90YXRlXCIpLmV2YWx1YXRlKHcse30sayk7ej1uZXcgY2godSxyLGMsaCxwLHMsZixkLHksdCk7fWNvbnN0IG89MT09PXMucG9zaXRpb25lZExpbmVzLmxlbmd0aDtpZihGKz1faChlLHIscyxhLGwseSx3LG0sSSxpLnZlcnRpY2FsP3QuYWguaG9yaXpvbnRhbDp0LmFoLmhvcml6b250YWxPbmx5LG8/ajpbbl0sRCwkLF8sayksbylicmVha31pLnZlcnRpY2FsJiYoVCs9X2goZSxyLGkudmVydGljYWwsYSxsLHksdyxtLEksdC5haC52ZXJ0aWNhbCxbXCJ2ZXJ0aWNhbFwiXSxELEwsXyxrKSk7Y29uc3QgUj16P3ouYm94U3RhcnRJbmRleDplLmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxVPXo/ei5ib3hFbmRJbmRleDplLmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxxPUM/Qy5ib3hTdGFydEluZGV4OmUuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLE49Qz9DLmJveEVuZEluZGV4OmUuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFo9UD9QLmJveFN0YXJ0SW5kZXg6ZS5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsRz1QP1AuYm94RW5kSW5kZXg6ZS5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsSz1CP0IuYm94U3RhcnRJbmRleDplLmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxYPUI/Qi5ib3hFbmRJbmRleDplLmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aDtsZXQgSD0tMTtjb25zdCBZPSh0LGUpPT50JiZ0LmNpcmNsZURpYW1ldGVyP01hdGgubWF4KHQuY2lyY2xlRGlhbWV0ZXIsZSk6ZTtIPVkoeixIKSxIPVkoQyxIKSxIPVkoUCxIKSxIPVkoQixIKTtjb25zdCBKPUg+LTE/MTowO0omJihIKj1NL2l1KSxlLmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoPj1kYy5NQVhfR0xZUEhTJiZBKFwiVG9vIG1hbnkgZ2x5cGhzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCIpLHZvaWQgMCE9PXcuc29ydEtleSYmZS5hZGRUb1NvcnRLZXlSYW5nZXMoZS5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoLHcuc29ydEtleSk7Y29uc3QgVz12aChsLHcsayksW1EsdHRdPWZ1bmN0aW9uKGUscil7Y29uc3Qgbj1lLmxlbmd0aCxpPW51bGw9PXI/dm9pZCAwOnIudmFsdWVzO2lmKChudWxsPT1pP3ZvaWQgMDppLmxlbmd0aCk+MClmb3IobGV0IHI9MDtyPGkubGVuZ3RoO3IrPTIpe2NvbnN0IG49aVtyKzFdO2UuZW1wbGFjZUJhY2sodC5hcVtpW3JdXSxuWzBdLG5bMV0pO31yZXR1cm4gW24sZS5sZW5ndGhdfShlLnRleHRBbmNob3JPZmZzZXRzLFcpO2Uuc3ltYm9sSW5zdGFuY2VzLmVtcGxhY2VCYWNrKHIueCxyLnksRC5yaWdodD49MD9ELnJpZ2h0Oi0xLEQuY2VudGVyPj0wP0QuY2VudGVyOi0xLEQubGVmdD49MD9ELmxlZnQ6LTEsRC52ZXJ0aWNhbHx8LTEsJCxMLE8sUixVLHEsTixaLEcsSyxYLGMsRixULFYsRSxKLDAsZixILFEsdHQpO30oZSxwLGwsbixpLHMsQyxlLmxheWVyc1swXSxlLmNvbGxpc2lvbkJveEFycmF5LHIuaW5kZXgsci5zb3VyY2VMYXllckluZGV4LGUuaW5kZXgsZyxbdyx3LHcsd10sayx1LHYsXyxNLGQscixhLGMsaCxvKTt9O2lmKFwibGluZVwiPT09SSlmb3IoY29uc3QgdCBvZiBIYyhyLmdlb21ldHJ5LDAsMCwkYSwkYSkpe2NvbnN0IHI9cmgodCxiLFMsbi52ZXJ0aWNhbHx8eSxpLDI0LHgsZS5vdmVyc2NhbGluZywkYSk7Zm9yKGNvbnN0IG4gb2Ygcil5JiZTaChlLHkudGV4dCx6LG4pfHxCKHQsbik7fWVsc2UgaWYoXCJsaW5lLWNlbnRlclwiPT09SSl7Zm9yKGNvbnN0IHQgb2Ygci5nZW9tZXRyeSlpZih0Lmxlbmd0aD4xKXtjb25zdCBlPWVoKHQsUyxuLnZlcnRpY2FsfHx5LGksMjQseCk7ZSYmQih0LGUpO319ZWxzZSBpZihcIlBvbHlnb25cIj09PXIudHlwZSlmb3IoY29uc3QgdCBvZiB4cihyLmdlb21ldHJ5LDApKXtjb25zdCBlPXBoKHQsMTYpO0IodFswXSxuZXcgWWMoZS54LGUueSwwKSk7fWVsc2UgaWYoXCJMaW5lU3RyaW5nXCI9PT1yLnR5cGUpZm9yKGNvbnN0IHQgb2Ygci5nZW9tZXRyeSlCKHQsbmV3IFljKHRbMF0ueCx0WzBdLnksMCkpO2Vsc2UgaWYoXCJQb2ludFwiPT09ci50eXBlKWZvcihjb25zdCB0IG9mIHIuZ2VvbWV0cnkpZm9yKGNvbnN0IGUgb2YgdClCKFtlXSxuZXcgWWMoZS54LGUueSwwKSk7fWZ1bmN0aW9uIF9oKHQsZSxyLG4saSxhLG8sbCx1LGMsaCxwLGYsZCx5KXtjb25zdCBtPWZ1bmN0aW9uKHQsZSxyLG4saSxhLG8sbCl7Y29uc3QgdT1uLmxheW91dC5nZXQoXCJ0ZXh0LXJvdGF0ZVwiKS5ldmFsdWF0ZShhLHt9KSpNYXRoLlBJLzE4MCxjPVtdO2Zvcihjb25zdCB0IG9mIGUucG9zaXRpb25lZExpbmVzKWZvcihjb25zdCBuIG9mIHQucG9zaXRpb25lZEdseXBocyl7aWYoIW4ucmVjdCljb250aW51ZTtjb25zdCBhPW4ucmVjdHx8e307bGV0IGg9VnUrMSxwPSEwLGY9MSxkPTA7Y29uc3QgeT0oaXx8bCkmJm4udmVydGljYWwsbT1uLm1ldHJpY3MuYWR2YW5jZSpuLnNjYWxlLzI7aWYobCYmZS52ZXJ0aWNhbGl6YWJsZSYmKGQ9dC5saW5lT2Zmc2V0LzItKG4uaW1hZ2VOYW1lPy0oaXUtbi5tZXRyaWNzLndpZHRoKm4uc2NhbGUpLzI6KG4uc2NhbGUtMSkqaXUpKSxuLmltYWdlTmFtZSl7Y29uc3QgdD1vW24uaW1hZ2VOYW1lXTtwPXQuc2RmLGY9dC5waXhlbFJhdGlvLGg9RnUvZjt9Y29uc3QgZz1pP1tuLngrbSxuLnldOlswLDBdO2xldCB4PWk/WzAsMF06W24ueCttK3JbMF0sbi55K3JbMV0tZF0sdj1bMCwwXTt5JiYodj14LHg9WzAsMF0pO2NvbnN0IGI9bi5tZXRyaWNzLmlzRG91YmxlUmVzb2x1dGlvbj8yOjEsdz0obi5tZXRyaWNzLmxlZnQtaCkqbi5zY2FsZS1tK3hbMF0sXz0oLW4ubWV0cmljcy50b3AtaCkqbi5zY2FsZSt4WzFdLEE9dythLncvYipuLnNjYWxlL2YsUz1fK2EuaC9iKm4uc2NhbGUvZixrPW5ldyBzKHcsXyksTT1uZXcgcyhBLF8pLEk9bmV3IHModyxTKSx6PW5ldyBzKEEsUyk7aWYoeSl7Y29uc3QgdD1uZXcgcygtbSxtLUR1KSxlPS1NYXRoLlBJLzIscj1pdS8yLW0saT1uZXcgcyg1LUR1LXIsLShuLmltYWdlTmFtZT9yOjApKSxhPW5ldyBzKC4uLnYpO2suX3JvdGF0ZUFyb3VuZChlLHQpLl9hZGQoaSkuX2FkZChhKSxNLl9yb3RhdGVBcm91bmQoZSx0KS5fYWRkKGkpLl9hZGQoYSksSS5fcm90YXRlQXJvdW5kKGUsdCkuX2FkZChpKS5fYWRkKGEpLHouX3JvdGF0ZUFyb3VuZChlLHQpLl9hZGQoaSkuX2FkZChhKTt9aWYodSl7Y29uc3QgdD1NYXRoLnNpbih1KSxlPU1hdGguY29zKHUpLHI9W2UsLXQsdCxlXTtrLl9tYXRNdWx0KHIpLE0uX21hdE11bHQociksSS5fbWF0TXVsdChyKSx6Ll9tYXRNdWx0KHIpO31jb25zdCBQPW5ldyBzKDAsMCksQz1uZXcgcygwLDApO2MucHVzaCh7dGw6ayx0cjpNLGJsOkksYnI6eix0ZXg6YSx3cml0aW5nTW9kZTplLndyaXRpbmdNb2RlLGdseXBoT2Zmc2V0Omcsc2VjdGlvbkluZGV4Om4uc2VjdGlvbkluZGV4LGlzU0RGOnAscGl4ZWxPZmZzZXRUTDpQLHBpeGVsT2Zmc2V0QlI6QyxtaW5Gb250U2NhbGVYOjAsbWluRm9udFNjYWxlWTowfSk7fXJldHVybiBjfSgwLHIsbCxpLGEsbyxuLHQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCksZz10LnRleHRTaXplRGF0YTtsZXQgeD1udWxsO1wic291cmNlXCI9PT1nLmtpbmQ/KHg9W25jKmkubGF5b3V0LmdldChcInRleHQtc2l6ZVwiKS5ldmFsdWF0ZShvLHt9KV0seFswXT5pYyYmQShgJHt0LmxheWVySWRzWzBdfTogVmFsdWUgZm9yIFwidGV4dC1zaXplXCIgaXMgPj0gJHtyY30uIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuYCkpOlwiY29tcG9zaXRlXCI9PT1nLmtpbmQmJih4PVtuYypkLmNvbXBvc2l0ZVRleHRTaXplc1swXS5ldmFsdWF0ZShvLHt9LHkpLG5jKmQuY29tcG9zaXRlVGV4dFNpemVzWzFdLmV2YWx1YXRlKG8se30seSldLCh4WzBdPmljfHx4WzFdPmljKSYmQShgJHt0LmxheWVySWRzWzBdfTogVmFsdWUgZm9yIFwidGV4dC1zaXplXCIgaXMgPj0gJHtyY30uIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuYCkpLHQuYWRkU3ltYm9scyh0LnRleHQsbSx4LGwsYSxvLGMsZSx1LmxpbmVTdGFydEluZGV4LHUubGluZUxlbmd0aCxmLHkpO2Zvcihjb25zdCBlIG9mIGgpcFtlXT10LnRleHQucGxhY2VkU3ltYm9sQXJyYXkubGVuZ3RoLTE7cmV0dXJuIDQqbS5sZW5ndGh9ZnVuY3Rpb24gQWgodCl7Zm9yKGNvbnN0IGUgaW4gdClyZXR1cm4gdFtlXTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBTaCh0LGUscixuKXtjb25zdCBpPXQuY29tcGFyZVRleHQ7aWYoZSBpbiBpKXtjb25zdCB0PWlbZV07Zm9yKGxldCBlPXQubGVuZ3RoLTE7ZT49MDtlLS0paWYobi5kaXN0KHRbZV0pPHIpcmV0dXJuICEwfWVsc2UgaVtlXT1bXTtyZXR1cm4gaVtlXS5wdXNoKG4pLCExfWNvbnN0IGtoPVtJbnQ4QXJyYXksVWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheV07Y2xhc3MgTWh7c3RhdGljIGZyb20odCl7aWYoISh0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXRocm93IG5ldyBFcnJvcihcIkRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheUJ1ZmZlci5cIik7Y29uc3RbZSxyXT1uZXcgVWludDhBcnJheSh0LDAsMik7aWYoMjE5IT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJEYXRhIGRvZXMgbm90IGFwcGVhciB0byBiZSBpbiBhIEtEQnVzaCBmb3JtYXQuXCIpO2NvbnN0IG49cj4+NDtpZigxIT09bil0aHJvdyBuZXcgRXJyb3IoYEdvdCB2JHtufSBkYXRhIHdoZW4gZXhwZWN0ZWQgdjEuYCk7Y29uc3QgaT1raFsxNSZyXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgYXJyYXkgdHlwZS5cIik7Y29uc3Rbc109bmV3IFVpbnQxNkFycmF5KHQsMiwxKSxbYV09bmV3IFVpbnQzMkFycmF5KHQsNCwxKTtyZXR1cm4gbmV3IE1oKGEscyxpLHQpfWNvbnN0cnVjdG9yKHQsZT02NCxyPUZsb2F0NjRBcnJheSxuKXtpZihpc05hTih0KXx8dDwwKXRocm93IG5ldyBFcnJvcihgVW5wZXhwZWN0ZWQgbnVtSXRlbXMgdmFsdWU6ICR7dH0uYCk7dGhpcy5udW1JdGVtcz0rdCx0aGlzLm5vZGVTaXplPU1hdGgubWluKE1hdGgubWF4KCtlLDIpLDY1NTM1KSx0aGlzLkFycmF5VHlwZT1yLHRoaXMuSW5kZXhBcnJheVR5cGU9dDw2NTUzNj9VaW50MTZBcnJheTpVaW50MzJBcnJheTtjb25zdCBpPWtoLmluZGV4T2YodGhpcy5BcnJheVR5cGUpLHM9Mip0KnRoaXMuQXJyYXlUeXBlLkJZVEVTX1BFUl9FTEVNRU5ULGE9dCp0aGlzLkluZGV4QXJyYXlUeXBlLkJZVEVTX1BFUl9FTEVNRU5ULG89KDgtYSU4KSU4O2lmKGk8MCl0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdHlwZWQgYXJyYXkgY2xhc3M6ICR7cn0uYCk7biYmbiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyPyh0aGlzLmRhdGE9bix0aGlzLmlkcz1uZXcgdGhpcy5JbmRleEFycmF5VHlwZSh0aGlzLmRhdGEsOCx0KSx0aGlzLmNvb3Jkcz1uZXcgdGhpcy5BcnJheVR5cGUodGhpcy5kYXRhLDgrYStvLDIqdCksdGhpcy5fcG9zPTIqdCx0aGlzLl9maW5pc2hlZD0hMCk6KHRoaXMuZGF0YT1uZXcgQXJyYXlCdWZmZXIoOCtzK2ErbyksdGhpcy5pZHM9bmV3IHRoaXMuSW5kZXhBcnJheVR5cGUodGhpcy5kYXRhLDgsdCksdGhpcy5jb29yZHM9bmV3IHRoaXMuQXJyYXlUeXBlKHRoaXMuZGF0YSw4K2ErbywyKnQpLHRoaXMuX3Bvcz0wLHRoaXMuX2ZpbmlzaGVkPSExLG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSwwLDIpLnNldChbMjE5LDE2K2ldKSxuZXcgVWludDE2QXJyYXkodGhpcy5kYXRhLDIsMSlbMF09ZSxuZXcgVWludDMyQXJyYXkodGhpcy5kYXRhLDQsMSlbMF09dCk7fWFkZCh0LGUpe2NvbnN0IHI9dGhpcy5fcG9zPj4xO3JldHVybiB0aGlzLmlkc1tyXT1yLHRoaXMuY29vcmRzW3RoaXMuX3BvcysrXT10LHRoaXMuY29vcmRzW3RoaXMuX3BvcysrXT1lLHJ9ZmluaXNoKCl7Y29uc3QgdD10aGlzLl9wb3M+PjE7aWYodCE9PXRoaXMubnVtSXRlbXMpdGhyb3cgbmV3IEVycm9yKGBBZGRlZCAke3R9IGl0ZW1zIHdoZW4gZXhwZWN0ZWQgJHt0aGlzLm51bUl0ZW1zfS5gKTtyZXR1cm4gSWgodGhpcy5pZHMsdGhpcy5jb29yZHMsdGhpcy5ub2RlU2l6ZSwwLHRoaXMubnVtSXRlbXMtMSwwKSx0aGlzLl9maW5pc2hlZD0hMCx0aGlzfXJhbmdlKHQsZSxyLG4pe2lmKCF0aGlzLl9maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoXCJEYXRhIG5vdCB5ZXQgaW5kZXhlZCAtIGNhbGwgaW5kZXguZmluaXNoKCkuXCIpO2NvbnN0e2lkczppLGNvb3JkczpzLG5vZGVTaXplOmF9PXRoaXMsbz1bMCxpLmxlbmd0aC0xLDBdLGw9W107Zm9yKDtvLmxlbmd0aDspe2NvbnN0IHU9by5wb3AoKXx8MCxjPW8ucG9wKCl8fDAsaD1vLnBvcCgpfHwwO2lmKGMtaDw9YSl7Zm9yKGxldCBhPWg7YTw9YzthKyspe2NvbnN0IG89c1syKmFdLHU9c1syKmErMV07bz49dCYmbzw9ciYmdT49ZSYmdTw9biYmbC5wdXNoKGlbYV0pO31jb250aW51ZX1jb25zdCBwPWgrYz4+MSxmPXNbMipwXSxkPXNbMipwKzFdO2Y+PXQmJmY8PXImJmQ+PWUmJmQ8PW4mJmwucHVzaChpW3BdKSwoMD09PXU/dDw9ZjplPD1kKSYmKG8ucHVzaChoKSxvLnB1c2gocC0xKSxvLnB1c2goMS11KSksKDA9PT11P3I+PWY6bj49ZCkmJihvLnB1c2gocCsxKSxvLnB1c2goYyksby5wdXNoKDEtdSkpO31yZXR1cm4gbH13aXRoaW4odCxlLHIpe2lmKCF0aGlzLl9maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoXCJEYXRhIG5vdCB5ZXQgaW5kZXhlZCAtIGNhbGwgaW5kZXguZmluaXNoKCkuXCIpO2NvbnN0e2lkczpuLGNvb3JkczppLG5vZGVTaXplOnN9PXRoaXMsYT1bMCxuLmxlbmd0aC0xLDBdLG89W10sbD1yKnI7Zm9yKDthLmxlbmd0aDspe2NvbnN0IHU9YS5wb3AoKXx8MCxjPWEucG9wKCl8fDAsaD1hLnBvcCgpfHwwO2lmKGMtaDw9cyl7Zm9yKGxldCByPWg7cjw9YztyKyspQmgoaVsyKnJdLGlbMipyKzFdLHQsZSk8PWwmJm8ucHVzaChuW3JdKTtjb250aW51ZX1jb25zdCBwPWgrYz4+MSxmPWlbMipwXSxkPWlbMipwKzFdO0JoKGYsZCx0LGUpPD1sJiZvLnB1c2gobltwXSksKDA9PT11P3Qtcjw9ZjplLXI8PWQpJiYoYS5wdXNoKGgpLGEucHVzaChwLTEpLGEucHVzaCgxLXUpKSwoMD09PXU/dCtyPj1mOmUrcj49ZCkmJihhLnB1c2gocCsxKSxhLnB1c2goYyksYS5wdXNoKDEtdSkpO31yZXR1cm4gb319ZnVuY3Rpb24gSWgodCxlLHIsbixpLHMpe2lmKGktbjw9cilyZXR1cm47Y29uc3QgYT1uK2k+PjE7emgodCxlLGEsbixpLHMpLEloKHQsZSxyLG4sYS0xLDEtcyksSWgodCxlLHIsYSsxLGksMS1zKTt9ZnVuY3Rpb24gemgodCxlLHIsbixpLHMpe2Zvcig7aT5uOyl7aWYoaS1uPjYwMCl7Y29uc3QgYT1pLW4rMSxvPXItbisxLGw9TWF0aC5sb2coYSksdT0uNSpNYXRoLmV4cCgyKmwvMyksYz0uNSpNYXRoLnNxcnQobCp1KihhLXUpL2EpKihvLWEvMjwwPy0xOjEpO3poKHQsZSxyLE1hdGgubWF4KG4sTWF0aC5mbG9vcihyLW8qdS9hK2MpKSxNYXRoLm1pbihpLE1hdGguZmxvb3IocisoYS1vKSp1L2ErYykpLHMpO31jb25zdCBhPWVbMipyK3NdO2xldCBvPW4sbD1pO2ZvcihQaCh0LGUsbixyKSxlWzIqaStzXT5hJiZQaCh0LGUsbixpKTtvPGw7KXtmb3IoUGgodCxlLG8sbCksbysrLGwtLTtlWzIqbytzXTxhOylvKys7Zm9yKDtlWzIqbCtzXT5hOylsLS07fWVbMipuK3NdPT09YT9QaCh0LGUsbixsKToobCsrLFBoKHQsZSxsLGkpKSxsPD1yJiYobj1sKzEpLHI8PWwmJihpPWwtMSk7fX1mdW5jdGlvbiBQaCh0LGUscixuKXtDaCh0LHIsbiksQ2goZSwyKnIsMipuKSxDaChlLDIqcisxLDIqbisxKTt9ZnVuY3Rpb24gQ2godCxlLHIpe2NvbnN0IG49dFtlXTt0W2VdPXRbcl0sdFtyXT1uO31mdW5jdGlvbiBCaCh0LGUscixuKXtjb25zdCBpPXQtcixzPWUtbjtyZXR1cm4gaSppK3Mqc312YXIgVmg7dC5iZz12b2lkIDAsKFZoPXQuYmd8fCh0LmJnPXt9KSkuY3JlYXRlPVwiY3JlYXRlXCIsVmgubG9hZD1cImxvYWRcIixWaC5mdWxsTG9hZD1cImZ1bGxMb2FkXCI7bGV0IEVoPW51bGwsRmg9W107Y29uc3QgVGg9MWUzLzYwLCRoPVwibG9hZFRpbWVcIixMaD1cImZ1bGxMb2FkVGltZVwiLERoPXttYXJrKHQpe3BlcmZvcm1hbmNlLm1hcmsodCk7fSxmcmFtZSh0KXtjb25zdCBlPXQ7bnVsbCE9RWgmJkZoLnB1c2goZS1FaCksRWg9ZTt9LGNsZWFyTWV0cmljcygpe0VoPW51bGwsRmg9W10scGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcygkaCkscGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyhMaCk7Zm9yKGNvbnN0IGUgaW4gdC5iZylwZXJmb3JtYW5jZS5jbGVhck1hcmtzKHQuYmdbZV0pO30sZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCl7cGVyZm9ybWFuY2UubWVhc3VyZSgkaCx0LmJnLmNyZWF0ZSx0LmJnLmxvYWQpLHBlcmZvcm1hbmNlLm1lYXN1cmUoTGgsdC5iZy5jcmVhdGUsdC5iZy5mdWxsTG9hZCk7Y29uc3QgZT1wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKCRoKVswXS5kdXJhdGlvbixyPXBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUoTGgpWzBdLmR1cmF0aW9uLG49RmgubGVuZ3RoLGk9MS8oRmgucmVkdWNlKCgodCxlKT0+dCtlKSwwKS9uLzFlMykscz1GaC5maWx0ZXIoKHQ9PnQ+VGgpKS5yZWR1Y2UoKCh0LGUpPT50KyhlLVRoKS9UaCksMCk7cmV0dXJuIHtsb2FkVGltZTplLGZ1bGxMb2FkVGltZTpyLGZwczppLHBlcmNlbnREcm9wcGVkRnJhbWVzOnMvKG4rcykqMTAwLHRvdGFsRnJhbWVzOm59fX07dC4kPWNsYXNzIGV4dGVuZHMgcHN7fSx0LkE9b28sdC5CPXlpLHQuQz1mdW5jdGlvbih0KXtpZihudWxsPT1NKXtjb25zdCBlPXQubmF2aWdhdG9yP3QubmF2aWdhdG9yLnVzZXJBZ2VudDpudWxsO009ISF0LnNhZmFyaXx8ISghZXx8ISgvXFxiKGlQYWR8aVBob25lfGlQb2QpXFxiLy50ZXN0KGUpfHxlLm1hdGNoKFwiU2FmYXJpXCIpJiYhZS5tYXRjaChcIkNocm9tZVwiKSkpO31yZXR1cm4gTX0sdC5EPUppLHQuRT1aLHQuRj1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudGFyZ2V0PXQsdGhpcy5tYXBJZD1lLHRoaXMucmVzb2x2ZVJlamVjdHM9e30sdGhpcy50YXNrcz17fSx0aGlzLnRhc2tRdWV1ZT1bXSx0aGlzLmFib3J0Q29udHJvbGxlcnM9e30sdGhpcy5tZXNzYWdlSGFuZGxlcnM9e30sdGhpcy5pbnZva2VyPW5ldyBJYygoKCk9PnRoaXMucHJvY2VzcygpKSksdGhpcy5zdWJzY3JpcHRpb249ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihlLHIsITEpLHt1bnN1YnNjcmliZTooKT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHIsITEpO319fSh0aGlzLnRhcmdldCxcIm1lc3NhZ2VcIiwodD0+dGhpcy5yZWNlaXZlKHQpKSksdGhpcy5nbG9iYWxTY29wZT1rKHNlbGYpP3Q6d2luZG93O31yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKHQsZSl7dGhpcy5tZXNzYWdlSGFuZGxlcnNbdF09ZTt9c2VuZEFzeW5jKHQsZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocixuKT0+e2NvbnN0IGk9TWF0aC5yb3VuZCgxZTE4Kk1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMCwxMCk7dGhpcy5yZXNvbHZlUmVqZWN0c1tpXT17cmVzb2x2ZTpyLHJlamVjdDpufSxlJiZlLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwoKCk9PntkZWxldGUgdGhpcy5yZXNvbHZlUmVqZWN0c1tpXTtjb25zdCBlPXtpZDppLHR5cGU6XCI8Y2FuY2VsPlwiLG9yaWdpbjpsb2NhdGlvbi5vcmlnaW4sdGFyZ2V0TWFwSWQ6dC50YXJnZXRNYXBJZCxzb3VyY2VNYXBJZDp0aGlzLm1hcElkfTt0aGlzLnRhcmdldC5wb3N0TWVzc2FnZShlKTt9KSx7b25jZTohMH0pO2NvbnN0IHM9W10sYT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2lkOmksc291cmNlTWFwSWQ6dGhpcy5tYXBJZCxvcmlnaW46bG9jYXRpb24ub3JpZ2luLGRhdGE6a2kodC5kYXRhLHMpfSk7dGhpcy50YXJnZXQucG9zdE1lc3NhZ2UoYSx7dHJhbnNmZXI6c30pO30pKX1yZWNlaXZlKHQpe2NvbnN0IGU9dC5kYXRhLHI9ZS5pZDtpZighKFwiZmlsZTovL1wiIT09ZS5vcmlnaW4mJlwiZmlsZTovL1wiIT09bG9jYXRpb24ub3JpZ2luJiZcInJlc291cmNlOi8vYW5kcm9pZFwiIT09ZS5vcmlnaW4mJlwicmVzb3VyY2U6Ly9hbmRyb2lkXCIhPT1sb2NhdGlvbi5vcmlnaW4mJmUub3JpZ2luIT09bG9jYXRpb24ub3JpZ2lufHxlLnRhcmdldE1hcElkJiZ0aGlzLm1hcElkIT09ZS50YXJnZXRNYXBJZCkpe2lmKFwiPGNhbmNlbD5cIj09PWUudHlwZSl7ZGVsZXRlIHRoaXMudGFza3Nbcl07Y29uc3QgdD10aGlzLmFib3J0Q29udHJvbGxlcnNbcl07cmV0dXJuIGRlbGV0ZSB0aGlzLmFib3J0Q29udHJvbGxlcnNbcl0sdm9pZCh0JiZ0LmFib3J0KCkpfWlmKGsoc2VsZil8fGUubXVzdFF1ZXVlKXJldHVybiB0aGlzLnRhc2tzW3JdPWUsdGhpcy50YXNrUXVldWUucHVzaChyKSx2b2lkIHRoaXMuaW52b2tlci50cmlnZ2VyKCk7dGhpcy5wcm9jZXNzVGFzayhyLGUpO319cHJvY2Vzcygpe2lmKDA9PT10aGlzLnRhc2tRdWV1ZS5sZW5ndGgpcmV0dXJuO2NvbnN0IHQ9dGhpcy50YXNrUXVldWUuc2hpZnQoKSxlPXRoaXMudGFza3NbdF07ZGVsZXRlIHRoaXMudGFza3NbdF0sdGhpcy50YXNrUXVldWUubGVuZ3RoPjAmJnRoaXMuaW52b2tlci50cmlnZ2VyKCksZSYmdGhpcy5wcm9jZXNzVGFzayh0LGUpO31wcm9jZXNzVGFzayh0LHIpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoXCI8cmVzcG9uc2U+XCI9PT1yLnR5cGUpe2NvbnN0IGU9dGhpcy5yZXNvbHZlUmVqZWN0c1t0XTtpZihkZWxldGUgdGhpcy5yZXNvbHZlUmVqZWN0c1t0XSwhZSlyZXR1cm47cmV0dXJuIHZvaWQoci5lcnJvcj9lLnJlamVjdChNaShyLmVycm9yKSk6ZS5yZXNvbHZlKE1pKHIuZGF0YSkpKX1pZighdGhpcy5tZXNzYWdlSGFuZGxlcnNbci50eXBlXSlyZXR1cm4gdm9pZCB0aGlzLmNvbXBsZXRlVGFzayh0LG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgYSByZWdpc3RlcmVkIGhhbmRsZXIgZm9yICR7ci50eXBlfSwgbWFwIElEOiAke3RoaXMubWFwSWR9LCBhdmFpbGFibGUgaGFuZGxlcnM6ICR7T2JqZWN0LmtleXModGhpcy5tZXNzYWdlSGFuZGxlcnMpLmpvaW4oXCIsIFwiKX1gKSk7Y29uc3QgZT1NaShyLmRhdGEpLG49bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLmFib3J0Q29udHJvbGxlcnNbdF09bjt0cnl7Y29uc3QgaT15aWVsZCB0aGlzLm1lc3NhZ2VIYW5kbGVyc1tyLnR5cGVdKHIuc291cmNlTWFwSWQsZSxuKTt0aGlzLmNvbXBsZXRlVGFzayh0LG51bGwsaSk7fWNhdGNoKGUpe3RoaXMuY29tcGxldGVUYXNrKHQsZSk7fX0pKX1jb21wbGV0ZVRhc2sodCxlLHIpe2NvbnN0IG49W107ZGVsZXRlIHRoaXMuYWJvcnRDb250cm9sbGVyc1t0XTtjb25zdCBpPXtpZDp0LHR5cGU6XCI8cmVzcG9uc2U+XCIsc291cmNlTWFwSWQ6dGhpcy5tYXBJZCxvcmlnaW46bG9jYXRpb24ub3JpZ2luLGVycm9yOmU/a2koZSk6bnVsbCxkYXRhOmtpKHIsbil9O3RoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKGkse3RyYW5zZmVyOm59KTt9cmVtb3ZlKCl7dGhpcy5pbnZva2VyLnJlbW92ZSgpLHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7fX0sdC5HPSQsdC5IPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG9vKDE2KTtyZXR1cm4gb28hPUZsb2F0MzJBcnJheSYmKHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCksdFswXT0xLHRbNV09MSx0WzEwXT0xLHRbMTVdPTEsdH0sdC5JPVR1LHQuSj1mdW5jdGlvbih0LGUscil7dmFyIG4saSxzLGEsbyxsLHUsYyxoLHAsZixkLHk9clswXSxtPXJbMV0sZz1yWzJdO3JldHVybiBlPT09dD8odFsxMl09ZVswXSp5K2VbNF0qbStlWzhdKmcrZVsxMl0sdFsxM109ZVsxXSp5K2VbNV0qbStlWzldKmcrZVsxM10sdFsxNF09ZVsyXSp5K2VbNl0qbStlWzEwXSpnK2VbMTRdLHRbMTVdPWVbM10qeStlWzddKm0rZVsxMV0qZytlWzE1XSk6KGk9ZVsxXSxzPWVbMl0sYT1lWzNdLG89ZVs0XSxsPWVbNV0sdT1lWzZdLGM9ZVs3XSxoPWVbOF0scD1lWzldLGY9ZVsxMF0sZD1lWzExXSx0WzBdPW49ZVswXSx0WzFdPWksdFsyXT1zLHRbM109YSx0WzRdPW8sdFs1XT1sLHRbNl09dSx0WzddPWMsdFs4XT1oLHRbOV09cCx0WzEwXT1mLHRbMTFdPWQsdFsxMl09bip5K28qbStoKmcrZVsxMl0sdFsxM109aSp5K2wqbStwKmcrZVsxM10sdFsxNF09cyp5K3UqbStmKmcrZVsxNF0sdFsxNV09YSp5K2MqbStkKmcrZVsxNV0pLHR9LHQuSz1mdW5jdGlvbih0LGUscil7dmFyIG49clswXSxpPXJbMV0scz1yWzJdO3JldHVybiB0WzBdPWVbMF0qbix0WzFdPWVbMV0qbix0WzJdPWVbMl0qbix0WzNdPWVbM10qbix0WzRdPWVbNF0qaSx0WzVdPWVbNV0qaSx0WzZdPWVbNl0qaSx0WzddPWVbN10qaSx0WzhdPWVbOF0qcyx0WzldPWVbOV0qcyx0WzEwXT1lWzEwXSpzLHRbMTFdPWVbMTFdKnMsdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0sdH0sdC5MPXVvLHQuTT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IGk9ZVtuXTtpIGluIHQmJihyW2ldPXRbaV0pO31yZXR1cm4gcn0sdC5OPVBjLHQuTz1WYyx0LlA9cyx0LlE9RWMsdC5SPUFvLHQuUz1qYyx0LlQ9WmksdC5VPWgsdC5WPXAsdC5XPVAsdC5YPSRhLHQuWT1scyx0Llo9JGMsdC5fPWUsdC5hPUYsdC5hJD1mdW5jdGlvbih0LGUpe3ZhciByPXRbMF0sbj10WzFdLGk9dFsyXSxzPXRbM10sYT10WzRdLG89dFs1XSxsPXRbNl0sdT10WzddLGM9dFs4XSxoPXRbOV0scD10WzEwXSxmPXRbMTFdLGQ9dFsxMl0seT10WzEzXSxtPXRbMTRdLGc9dFsxNV0seD1lWzBdLHY9ZVsxXSxiPWVbMl0sdz1lWzNdLF89ZVs0XSxBPWVbNV0sUz1lWzZdLGs9ZVs3XSxNPWVbOF0sST1lWzldLHo9ZVsxMF0sUD1lWzExXSxDPWVbMTJdLEI9ZVsxM10sVj1lWzE0XSxFPWVbMTVdO3JldHVybiBNYXRoLmFicyhyLXgpPD1hbypNYXRoLm1heCgxLE1hdGguYWJzKHIpLE1hdGguYWJzKHgpKSYmTWF0aC5hYnMobi12KTw9YW8qTWF0aC5tYXgoMSxNYXRoLmFicyhuKSxNYXRoLmFicyh2KSkmJk1hdGguYWJzKGktYik8PWFvKk1hdGgubWF4KDEsTWF0aC5hYnMoaSksTWF0aC5hYnMoYikpJiZNYXRoLmFicyhzLXcpPD1hbypNYXRoLm1heCgxLE1hdGguYWJzKHMpLE1hdGguYWJzKHcpKSYmTWF0aC5hYnMoYS1fKTw9YW8qTWF0aC5tYXgoMSxNYXRoLmFicyhhKSxNYXRoLmFicyhfKSkmJk1hdGguYWJzKG8tQSk8PWFvKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnMoQSkpJiZNYXRoLmFicyhsLVMpPD1hbypNYXRoLm1heCgxLE1hdGguYWJzKGwpLE1hdGguYWJzKFMpKSYmTWF0aC5hYnModS1rKTw9YW8qTWF0aC5tYXgoMSxNYXRoLmFicyh1KSxNYXRoLmFicyhrKSkmJk1hdGguYWJzKGMtTSk8PWFvKk1hdGgubWF4KDEsTWF0aC5hYnMoYyksTWF0aC5hYnMoTSkpJiZNYXRoLmFicyhoLUkpPD1hbypNYXRoLm1heCgxLE1hdGguYWJzKGgpLE1hdGguYWJzKEkpKSYmTWF0aC5hYnMocC16KTw9YW8qTWF0aC5tYXgoMSxNYXRoLmFicyhwKSxNYXRoLmFicyh6KSkmJk1hdGguYWJzKGYtUCk8PWFvKk1hdGgubWF4KDEsTWF0aC5hYnMoZiksTWF0aC5hYnMoUCkpJiZNYXRoLmFicyhkLUMpPD1hbypNYXRoLm1heCgxLE1hdGguYWJzKGQpLE1hdGguYWJzKEMpKSYmTWF0aC5hYnMoeS1CKTw9YW8qTWF0aC5tYXgoMSxNYXRoLmFicyh5KSxNYXRoLmFicyhCKSkmJk1hdGguYWJzKG0tVik8PWFvKk1hdGgubWF4KDEsTWF0aC5hYnMobSksTWF0aC5hYnMoVikpJiZNYXRoLmFicyhnLUUpPD1hbypNYXRoLm1heCgxLE1hdGguYWJzKGcpLE1hdGguYWJzKEUpKX0sdC5hMD1vYSx0LmExPURjLHQuYTI9aXQsdC5hMz10PT57Y29uc3QgZT13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO3JldHVybiBlLm11dGVkPSEwLG5ldyBQcm9taXNlKChyPT57ZS5vbmxvYWRzdGFydD0oKT0+e3IoZSk7fTtmb3IoY29uc3QgciBvZiB0KXtjb25zdCB0PXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic291cmNlXCIpO2oocil8fChlLmNyb3NzT3JpZ2luPVwiQW5vbnltb3VzXCIpLHQuc3JjPXIsZS5hcHBlbmRDaGlsZCh0KTt9fSkpfSx0LmE0PWZ1bmN0aW9uKCl7cmV0dXJuIHgrK30sdC5hNT1Gcyx0LmE2PWRjLHQuYTc9em4sdC5hOD1qYSx0LmE5PU5jLHQuYUE9ZnVuY3Rpb24odCl7aWYoXCJjdXN0b21cIj09PXQudHlwZSlyZXR1cm4gbmV3IE1jKHQpO3N3aXRjaCh0LnR5cGUpe2Nhc2VcImJhY2tncm91bmRcIjpyZXR1cm4gbmV3IF9jKHQpO2Nhc2VcImNpcmNsZVwiOnJldHVybiBuZXcgZm8odCk7Y2FzZVwiZmlsbFwiOnJldHVybiBuZXcgdWwodCk7Y2FzZVwiZmlsbC1leHRydXNpb25cIjpyZXR1cm4gbmV3IEVsKHQpO2Nhc2VcImhlYXRtYXBcIjpyZXR1cm4gbmV3IE1vKHQpO2Nhc2VcImhpbGxzaGFkZVwiOnJldHVybiBuZXcgUG8odCk7Y2FzZVwibGluZVwiOnJldHVybiBuZXcgSGwodCk7Y2FzZVwicmFzdGVyXCI6cmV0dXJuIG5ldyBrYyh0KTtjYXNlXCJzeW1ib2xcIjpyZXR1cm4gbmV3IHZjKHQpfX0sdC5hQj13LHQuYUM9ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gW3tjb21tYW5kOlwic2V0U3R5bGVcIixhcmdzOltlXX1dO2xldCByPVtdO3RyeXtpZighSCh0LnZlcnNpb24sZS52ZXJzaW9uKSlyZXR1cm4gW3tjb21tYW5kOlwic2V0U3R5bGVcIixhcmdzOltlXX1dO0godC5jZW50ZXIsZS5jZW50ZXIpfHxyLnB1c2goe2NvbW1hbmQ6XCJzZXRDZW50ZXJcIixhcmdzOltlLmNlbnRlcl19KSxIKHQuem9vbSxlLnpvb20pfHxyLnB1c2goe2NvbW1hbmQ6XCJzZXRab29tXCIsYXJnczpbZS56b29tXX0pLEgodC5iZWFyaW5nLGUuYmVhcmluZyl8fHIucHVzaCh7Y29tbWFuZDpcInNldEJlYXJpbmdcIixhcmdzOltlLmJlYXJpbmddfSksSCh0LnBpdGNoLGUucGl0Y2gpfHxyLnB1c2goe2NvbW1hbmQ6XCJzZXRQaXRjaFwiLGFyZ3M6W2UucGl0Y2hdfSksSCh0LnNwcml0ZSxlLnNwcml0ZSl8fHIucHVzaCh7Y29tbWFuZDpcInNldFNwcml0ZVwiLGFyZ3M6W2Uuc3ByaXRlXX0pLEgodC5nbHlwaHMsZS5nbHlwaHMpfHxyLnB1c2goe2NvbW1hbmQ6XCJzZXRHbHlwaHNcIixhcmdzOltlLmdseXBoc119KSxIKHQudHJhbnNpdGlvbixlLnRyYW5zaXRpb24pfHxyLnB1c2goe2NvbW1hbmQ6XCJzZXRUcmFuc2l0aW9uXCIsYXJnczpbZS50cmFuc2l0aW9uXX0pLEgodC5saWdodCxlLmxpZ2h0KXx8ci5wdXNoKHtjb21tYW5kOlwic2V0TGlnaHRcIixhcmdzOltlLmxpZ2h0XX0pLEgodC50ZXJyYWluLGUudGVycmFpbil8fHIucHVzaCh7Y29tbWFuZDpcInNldFRlcnJhaW5cIixhcmdzOltlLnRlcnJhaW5dfSksSCh0LnNreSxlLnNreSl8fHIucHVzaCh7Y29tbWFuZDpcInNldFNreVwiLGFyZ3M6W2Uuc2t5XX0pLEgodC5wcm9qZWN0aW9uLGUucHJvamVjdGlvbil8fHIucHVzaCh7Y29tbWFuZDpcInNldFByb2plY3Rpb25cIixhcmdzOltlLnByb2plY3Rpb25dfSk7Y29uc3Qgbj17fSxpPVtdOyFmdW5jdGlvbih0LGUscixuKXtsZXQgaTtmb3IoaSBpbiBlPWV8fHt9LHQ9dHx8e30pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKXx8VyhpLHIsbikpO2ZvcihpIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSkmJihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKT9IKHRbaV0sZVtpXSl8fChcImdlb2pzb25cIj09PXRbaV0udHlwZSYmXCJnZW9qc29uXCI9PT1lW2ldLnR5cGUmJnR0KHQsZSxpKT9ZKHIse2NvbW1hbmQ6XCJzZXRHZW9KU09OU291cmNlRGF0YVwiLGFyZ3M6W2ksZVtpXS5kYXRhXX0pOlEoaSxlLHIsbikpOkooaSxlLHIpKTt9KHQuc291cmNlcyxlLnNvdXJjZXMsaSxuKTtjb25zdCBzPVtdO3QubGF5ZXJzJiZ0LmxheWVycy5mb3JFYWNoKCh0PT57XCJzb3VyY2VcImluIHQmJm5bdC5zb3VyY2VdP3IucHVzaCh7Y29tbWFuZDpcInJlbW92ZUxheWVyXCIsYXJnczpbdC5pZF19KTpzLnB1c2godCk7fSkpLHI9ci5jb25jYXQoaSksZnVuY3Rpb24odCxlLHIpe2U9ZXx8W107Y29uc3Qgbj0odD10fHxbXSkubWFwKHJ0KSxpPWUubWFwKHJ0KSxzPXQucmVkdWNlKG50LHt9KSxhPWUucmVkdWNlKG50LHt9KSxvPW4uc2xpY2UoKSxsPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHUsYyxoLHAsZjtmb3IobGV0IHQ9MCxlPTA7dDxuLmxlbmd0aDt0KyspdT1uW3RdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLHUpP2UrKzooWShyLHtjb21tYW5kOlwicmVtb3ZlTGF5ZXJcIixhcmdzOlt1XX0pLG8uc3BsaWNlKG8uaW5kZXhPZih1LGUpLDEpKTtmb3IobGV0IHQ9MCxlPTA7dDxpLmxlbmd0aDt0KyspdT1pW2kubGVuZ3RoLTEtdF0sb1tvLmxlbmd0aC0xLXRdIT09dSYmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLHUpPyhZKHIse2NvbW1hbmQ6XCJyZW1vdmVMYXllclwiLGFyZ3M6W3VdfSksby5zcGxpY2Uoby5sYXN0SW5kZXhPZih1LG8ubGVuZ3RoLWUpLDEpKTplKysscD1vW28ubGVuZ3RoLXRdLFkocix7Y29tbWFuZDpcImFkZExheWVyXCIsYXJnczpbYVt1XSxwXX0pLG8uc3BsaWNlKG8ubGVuZ3RoLXQsMCx1KSxsW3VdPSEwKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKylpZih1PWlbdF0sYz1zW3VdLGg9YVt1XSwhbFt1XSYmIUgoYyxoKSlpZihIKGMuc291cmNlLGguc291cmNlKSYmSChjW1wic291cmNlLWxheWVyXCJdLGhbXCJzb3VyY2UtbGF5ZXJcIl0pJiZIKGMudHlwZSxoLnR5cGUpKXtmb3IoZiBpbiBldChjLmxheW91dCxoLmxheW91dCxyLHUsbnVsbCxcInNldExheW91dFByb3BlcnR5XCIpLGV0KGMucGFpbnQsaC5wYWludCxyLHUsbnVsbCxcInNldFBhaW50UHJvcGVydHlcIiksSChjLmZpbHRlcixoLmZpbHRlcil8fFkocix7Y29tbWFuZDpcInNldEZpbHRlclwiLGFyZ3M6W3UsaC5maWx0ZXJdfSksSChjLm1pbnpvb20saC5taW56b29tKSYmSChjLm1heHpvb20saC5tYXh6b29tKXx8WShyLHtjb21tYW5kOlwic2V0TGF5ZXJab29tUmFuZ2VcIixhcmdzOlt1LGgubWluem9vbSxoLm1heHpvb21dfSksYylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYyxmKSYmXCJsYXlvdXRcIiE9PWYmJlwicGFpbnRcIiE9PWYmJlwiZmlsdGVyXCIhPT1mJiZcIm1ldGFkYXRhXCIhPT1mJiZcIm1pbnpvb21cIiE9PWYmJlwibWF4em9vbVwiIT09ZiYmKDA9PT1mLmluZGV4T2YoXCJwYWludC5cIik/ZXQoY1tmXSxoW2ZdLHIsdSxmLnNsaWNlKDYpLFwic2V0UGFpbnRQcm9wZXJ0eVwiKTpIKGNbZl0saFtmXSl8fFkocix7Y29tbWFuZDpcInNldExheWVyUHJvcGVydHlcIixhcmdzOlt1LGYsaFtmXV19KSk7Zm9yKGYgaW4gaClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaCxmKSYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLGYpJiZcImxheW91dFwiIT09ZiYmXCJwYWludFwiIT09ZiYmXCJmaWx0ZXJcIiE9PWYmJlwibWV0YWRhdGFcIiE9PWYmJlwibWluem9vbVwiIT09ZiYmXCJtYXh6b29tXCIhPT1mJiYoMD09PWYuaW5kZXhPZihcInBhaW50LlwiKT9ldChjW2ZdLGhbZl0scix1LGYuc2xpY2UoNiksXCJzZXRQYWludFByb3BlcnR5XCIpOkgoY1tmXSxoW2ZdKXx8WShyLHtjb21tYW5kOlwic2V0TGF5ZXJQcm9wZXJ0eVwiLGFyZ3M6W3UsZixoW2ZdXX0pKTt9ZWxzZSBZKHIse2NvbW1hbmQ6XCJyZW1vdmVMYXllclwiLGFyZ3M6W3VdfSkscD1vW28ubGFzdEluZGV4T2YodSkrMV0sWShyLHtjb21tYW5kOlwiYWRkTGF5ZXJcIixhcmdzOltoLHBdfSk7fShzLGUubGF5ZXJzLHIpO31jYXRjaCh0KXtjb25zb2xlLndhcm4oXCJVbmFibGUgdG8gY29tcHV0ZSBzdHlsZSBkaWZmOlwiLHQpLHI9W3tjb21tYW5kOlwic2V0U3R5bGVcIixhcmdzOltlXX1dO31yZXR1cm4gcn0sdC5hRD1mdW5jdGlvbih0KXtjb25zdCBlPVtdLHI9dC5pZDtyZXR1cm4gdm9pZCAwPT09ciYmZS5wdXNoKHttZXNzYWdlOmBsYXllcnMuJHtyfTogbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImlkXCJgfSksdm9pZCAwPT09dC5yZW5kZXImJmUucHVzaCh7bWVzc2FnZTpgbGF5ZXJzLiR7cn06IG1pc3NpbmcgcmVxdWlyZWQgbWV0aG9kIFwicmVuZGVyXCJgfSksdC5yZW5kZXJpbmdNb2RlJiZcIjJkXCIhPT10LnJlbmRlcmluZ01vZGUmJlwiM2RcIiE9PXQucmVuZGVyaW5nTW9kZSYmZS5wdXNoKHttZXNzYWdlOmBsYXllcnMuJHtyfTogcHJvcGVydHkgXCJyZW5kZXJpbmdNb2RlXCIgbXVzdCBiZSBlaXRoZXIgXCIyZFwiIG9yIFwiM2RcImB9KSxlfSx0LmFFPWZ1bmN0aW9uIHQoZSxyKXtpZihBcnJheS5pc0FycmF5KGUpKXtpZighQXJyYXkuaXNBcnJheShyKXx8ZS5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4gITE7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIXQoZVtuXSxyW25dKSlyZXR1cm4gITE7cmV0dXJuICEwfWlmKFwib2JqZWN0XCI9PXR5cGVvZiBlJiZudWxsIT09ZSYmbnVsbCE9PXIpe2lmKFwib2JqZWN0XCIhPXR5cGVvZiByKXJldHVybiAhMTtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGghPT1PYmplY3Qua2V5cyhyKS5sZW5ndGgpcmV0dXJuICExO2Zvcihjb25zdCBuIGluIGUpaWYoIXQoZVtuXSxyW25dKSlyZXR1cm4gITE7cmV0dXJuICEwfXJldHVybiBlPT09cn0sdC5hRj12LHQuYUc9Yix0LmFIPWNsYXNzIGV4dGVuZHMgd2F7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuY3VycmVudD0wO31zZXQodCl7dGhpcy5jdXJyZW50IT09dCYmKHRoaXMuY3VycmVudD10LHRoaXMuZ2wudW5pZm9ybTFpKHRoaXMubG9jYXRpb24sdCkpO319LHQuYUk9X2EsdC5hSj1jbGFzcyBleHRlbmRzIHdhe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmN1cnJlbnQ9a2E7fXNldCh0KXtpZih0WzEyXSE9PXRoaXMuY3VycmVudFsxMl18fHRbMF0hPT10aGlzLmN1cnJlbnRbMF0pcmV0dXJuIHRoaXMuY3VycmVudD10LHZvaWQgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMubG9jYXRpb24sITEsdCk7Zm9yKGxldCBlPTE7ZTwxNjtlKyspaWYodFtlXSE9PXRoaXMuY3VycmVudFtlXSl7dGhpcy5jdXJyZW50PXQsdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMubG9jYXRpb24sITEsdCk7YnJlYWt9fX0sdC5hSz1BYSx0LmFMPVNhLHQuYU09S3QsdC5hTj1jbGFzcyBleHRlbmRzIHdhe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmN1cnJlbnQ9WzAsMCwwXTt9c2V0KHQpe3RbMF09PT10aGlzLmN1cnJlbnRbMF0mJnRbMV09PT10aGlzLmN1cnJlbnRbMV0mJnRbMl09PT10aGlzLmN1cnJlbnRbMl18fCh0aGlzLmN1cnJlbnQ9dCx0aGlzLmdsLnVuaWZvcm0zZih0aGlzLmxvY2F0aW9uLHRbMF0sdFsxXSx0WzJdKSk7fX0sdC5hTz1jbGFzcyBleHRlbmRzIHdhe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmN1cnJlbnQ9WzAsMF07fXNldCh0KXt0WzBdPT09dGhpcy5jdXJyZW50WzBdJiZ0WzFdPT09dGhpcy5jdXJyZW50WzFdfHwodGhpcy5jdXJyZW50PXQsdGhpcy5nbC51bmlmb3JtMmYodGhpcy5sb2NhdGlvbix0WzBdLHRbMV0pKTt9fSx0LmFQPWZ1bmN0aW9uKHQsZSxyLG4saSxzLGEpe3ZhciBvPTEvKGUtciksbD0xLyhuLWkpLHU9MS8ocy1hKTtyZXR1cm4gdFswXT0tMipvLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPS0yKmwsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTIqdSx0WzExXT0wLHRbMTJdPShlK3IpKm8sdFsxM109KGkrbikqbCx0WzE0XT0oYStzKSp1LHRbMTVdPTEsdH0sdC5hUT1obyx0LmFSPWNsYXNzIGV4dGVuZHMgX3N7fSx0LmFTPWV1LHQuYVQ9Y2xhc3MgZXh0ZW5kcyBTc3t9LHQuYVU9a28sdC5hVj1mdW5jdGlvbih0KXtyZXR1cm4gdDw9MT8xOk1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4yKSl9LHQuYVc9U28sdC5hWD1acyx0LmFZPW5hLHQuYVo9Y2xhc3MgZXh0ZW5kcyBCc3t9LHQuYV89ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXSYmdFszXT09PWVbM10mJnRbNF09PT1lWzRdJiZ0WzVdPT09ZVs1XSYmdFs2XT09PWVbNl0mJnRbN109PT1lWzddJiZ0WzhdPT09ZVs4XSYmdFs5XT09PWVbOV0mJnRbMTBdPT09ZVsxMF0mJnRbMTFdPT09ZVsxMV0mJnRbMTJdPT09ZVsxMl0mJnRbMTNdPT09ZVsxM10mJnRbMTRdPT09ZVsxNF0mJnRbMTVdPT09ZVsxNV19LHQuYWE9ZnVuY3Rpb24odCl7Y29uc3QgZT17fTtpZih0LnJlcGxhY2UoLyg/Ol58KD86XFxzKlxcLFxccyopKShbXlxceDAwLVxceDIwXFwoXFwpPD5AXFwsO1xcOlxcXFxcIlxcL1xcW1xcXVxcP1xcPVxce1xcfVxceDdGXSspKD86XFw9KD86KFteXFx4MDAtXFx4MjBcXChcXCk8PkBcXCw7XFw6XFxcXFwiXFwvXFxbXFxdXFw/XFw9XFx7XFx9XFx4N0ZdKyl8KD86XFxcIigoPzpbXlwiXFxcXF18XFxcXC4pKilcXFwiKSkpPy9nLCgodCxyLG4saSk9Pntjb25zdCBzPW58fGk7cmV0dXJuIGVbcl09IXN8fHMudG9Mb3dlckNhc2UoKSxcIlwifSkpLGVbXCJtYXgtYWdlXCJdKXtjb25zdCB0PXBhcnNlSW50KGVbXCJtYXgtYWdlXCJdLDEwKTtpc05hTih0KT9kZWxldGUgZVtcIm1heC1hZ2VcIl06ZVtcIm1heC1hZ2VcIl09dDt9cmV0dXJuIGV9LHQuYWI9ZnVuY3Rpb24odCxlKXtjb25zdCByPVtdO2Zvcihjb25zdCBuIGluIHQpbiBpbiBlfHxyLnB1c2gobik7cmV0dXJuIHJ9LHQuYWM9eSx0LmFkPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1NYXRoLnNpbihyKSxpPU1hdGguY29zKHIpLHM9ZVswXSxhPWVbMV0sbz1lWzJdLGw9ZVszXSx1PWVbNF0sYz1lWzVdLGg9ZVs2XSxwPWVbN107cmV0dXJuIGUhPT10JiYodFs4XT1lWzhdLHRbOV09ZVs5XSx0WzEwXT1lWzEwXSx0WzExXT1lWzExXSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSksdFswXT1zKmkrdSpuLHRbMV09YSppK2Mqbix0WzJdPW8qaStoKm4sdFszXT1sKmkrcCpuLHRbNF09dSppLXMqbix0WzVdPWMqaS1hKm4sdFs2XT1oKmktbypuLHRbN109cCppLWwqbix0fSx0LmFlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBvbygxNik7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzRdPXRbNF0sZVs1XT10WzVdLGVbNl09dFs2XSxlWzddPXRbN10sZVs4XT10WzhdLGVbOV09dFs5XSxlWzEwXT10WzEwXSxlWzExXT10WzExXSxlWzEyXT10WzEyXSxlWzEzXT10WzEzXSxlWzE0XT10WzE0XSxlWzE1XT10WzE1XSxlfSx0LmFmPXBvLHQuYWc9ZnVuY3Rpb24odCxlKXtsZXQgcj0wLG49MDtpZihcImNvbnN0YW50XCI9PT10LmtpbmQpbj10LmxheW91dFNpemU7ZWxzZSBpZihcInNvdXJjZVwiIT09dC5raW5kKXtjb25zdHtpbnRlcnBvbGF0aW9uVHlwZTppLG1pblpvb206cyxtYXhab29tOmF9PXQsbz1pP3koQmUuaW50ZXJwb2xhdGlvbkZhY3RvcihpLGUscyxhKSwwLDEpOjA7XCJjYW1lcmFcIj09PXQua2luZD9uPUNlLm51bWJlcih0Lm1pblNpemUsdC5tYXhTaXplLG8pOnI9bzt9cmV0dXJuIHt1U2l6ZVQ6cix1U2l6ZTpufX0sdC5haT1mdW5jdGlvbih0LHt1U2l6ZTplLHVTaXplVDpyfSx7bG93ZXJTaXplOm4sdXBwZXJTaXplOml9KXtyZXR1cm4gXCJzb3VyY2VcIj09PXQua2luZD9uL25jOlwiY29tcG9zaXRlXCI9PT10LmtpbmQ/Q2UubnVtYmVyKG4vbmMsaS9uYyxyKTplfSx0LmFqPWNjLHQuYWs9ZnVuY3Rpb24odCxlLHIsbil7Y29uc3QgaT1lLnktdC55LGE9ZS54LXQueCxvPW4ueS1yLnksbD1uLngtci54LHU9byphLWwqaTtpZigwPT09dSlyZXR1cm4gbnVsbDtjb25zdCBjPShsKih0Lnktci55KS1vKih0Lngtci54KSkvdTtyZXR1cm4gbmV3IHModC54K2MqYSx0LnkrYyppKX0sdC5hbD1IYyx0LmFtPXFhLHQuYW49bG8sdC5hbz1mdW5jdGlvbih0KXtsZXQgZT0xLzAscj0xLzAsbj0tMS8wLGk9LTEvMDtmb3IoY29uc3QgcyBvZiB0KWU9TWF0aC5taW4oZSxzLngpLHI9TWF0aC5taW4ocixzLnkpLG49TWF0aC5tYXgobixzLngpLGk9TWF0aC5tYXgoaSxzLnkpO3JldHVybiBbZSxyLG4saV19LHQuYXA9aXUsdC5hcj1hYyx0LmFzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLHM9ZVszXSxhPWVbNF0sbz1lWzVdLGw9ZVs2XSx1PWVbN10sYz1lWzhdLGg9ZVs5XSxwPWVbMTBdLGY9ZVsxMV0sZD1lWzEyXSx5PWVbMTNdLG09ZVsxNF0sZz1lWzE1XSx4PXIqby1uKmEsdj1yKmwtaSphLGI9cip1LXMqYSx3PW4qbC1pKm8sXz1uKnUtcypvLEE9aSp1LXMqbCxTPWMqeS1oKmQsaz1jKm0tcCpkLE09YypnLWYqZCxJPWgqbS1wKnksej1oKmctZip5LFA9cCpnLWYqbSxDPXgqUC12KnorYipJK3cqTS1fKmsrQSpTO3JldHVybiBDPyh0WzBdPShvKlAtbCp6K3UqSSkqKEM9MS9DKSx0WzFdPShpKnotbipQLXMqSSkqQyx0WzJdPSh5KkEtbSpfK2cqdykqQyx0WzNdPShwKl8taCpBLWYqdykqQyx0WzRdPShsKk0tYSpQLXUqaykqQyx0WzVdPShyKlAtaSpNK3MqaykqQyx0WzZdPShtKmItZCpBLWcqdikqQyx0WzddPShjKkEtcCpiK2YqdikqQyx0WzhdPShhKnotbypNK3UqUykqQyx0WzldPShuKk0tcip6LXMqUykqQyx0WzEwXT0oZCpfLXkqYitnKngpKkMsdFsxMV09KGgqYi1jKl8tZip4KSpDLHRbMTJdPShvKmstYSpJLWwqUykqQyx0WzEzXT0ocipJLW4qaytpKlMpKkMsdFsxNF09KHkqdi1kKnctbSp4KSpDLHRbMTVdPShjKnctaCp2K3AqeCkqQyx0KTpudWxsfSx0LmF0PWJoLHQuYXU9SnUsdC5hdj1NaCx0LmF3PWZ1bmN0aW9uKCl7Y29uc3QgdD17fSxlPUcuJHZlcnNpb247Zm9yKGNvbnN0IHIgaW4gRy4kcm9vdCl7Y29uc3Qgbj1HLiRyb290W3JdO2lmKG4ucmVxdWlyZWQpe2xldCBpPW51bGw7aT1cInZlcnNpb25cIj09PXI/ZTpcImFycmF5XCI9PT1uLnR5cGU/W106e30sbnVsbCE9aSYmKHRbcl09aSk7fX1yZXR1cm4gdH0sdC5heD1JaSx0LmF5PUQsdC5hej1mdW5jdGlvbih0KXt0PXQuc2xpY2UoKTtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZVt0W3JdLmlkXT10W3JdO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKVwicmVmXCJpbiB0W3JdJiYodFtyXT1YKHRbcl0sZVt0W3JdLnJlZl0pKTtyZXR1cm4gdH0sdC5iPUksdC5iMD1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbOF09ZVs4XSx0WzldPWVbOV0sdFsxMF09ZVsxMF0sdFsxMV09ZVsxMV0sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0sdH0sdC5iMT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyWzBdLHRbMV09ZVsxXSpyWzFdLHRbMl09ZVsyXSpyWzJdLHRbM109ZVszXSpyWzNdLHR9LHQuYjI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl0rdFszXSplWzNdfSx0LmIzPW0sdC5iND1PYyx0LmI1PUZjLHQuYjY9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgcyxhPTEvTWF0aC50YW4oZS8yKTtyZXR1cm4gdFswXT1hL3IsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09YSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMV09LTEsdFsxMl09MCx0WzEzXT0wLHRbMTVdPTAsbnVsbCE9aSYmaSE9PTEvMD8odFsxMF09KGkrbikqKHM9MS8obi1pKSksdFsxNF09MippKm4qcyk6KHRbMTBdPS0xLHRbMTRdPS0yKm4pLHR9LHQuYjc9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPU1hdGguc2luKHIpLGk9TWF0aC5jb3Mocikscz1lWzRdLGE9ZVs1XSxvPWVbNl0sbD1lWzddLHU9ZVs4XSxjPWVbOV0saD1lWzEwXSxwPWVbMTFdO3JldHVybiBlIT09dCYmKHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSksdFs0XT1zKmkrdSpuLHRbNV09YSppK2Mqbix0WzZdPW8qaStoKm4sdFs3XT1sKmkrcCpuLHRbOF09dSppLXMqbix0WzldPWMqaS1hKm4sdFsxMF09aCppLW8qbix0WzExXT1wKmktbCpuLHR9LHQuYjg9Zix0LmI5PWQsdC5iQT1zdSx0LmJCPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1lc3NhZ2U9PT1WfSx0LmJDPWJuLHQuYkQ9UmksdC5iYT1mdW5jdGlvbih0KXtyZXR1cm4gdCpNYXRoLlBJLzE4MH0sdC5iYj1mdW5jdGlvbih0LGUpe2NvbnN0e3g6cix5Om59PSRjLmZyb21MbmdMYXQoZSk7cmV0dXJuICEodDwwfHx0PjI1fHxuPDB8fG4+PTF8fHI8MHx8cj49MSl9LHQuYmM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPWVbMV0sdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPWVbMl0sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LHQuYmQ9Y2xhc3MgZXh0ZW5kcyBoc3t9LHQuYmU9emMsdC5iZj1EaCx0LmJoPUwsdC5iaT1mdW5jdGlvbih0LGUpe0YuUkVHSVNURVJFRF9QUk9UT0NPTFNbdF09ZTt9LHQuYmo9ZnVuY3Rpb24odCl7ZGVsZXRlIEYuUkVHSVNURVJFRF9QUk9UT0NPTFNbdF07fSx0LmJrPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj17fTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3QgaT1lJiZlW3Rbbl0uaWRdfHxMbih0W25dKTtlJiYoZVt0W25dLmlkXT1pKTtsZXQgcz1yW2ldO3N8fChzPXJbaV09W10pLHMucHVzaCh0W25dKTt9Y29uc3Qgbj1bXTtmb3IoY29uc3QgdCBpbiByKW4ucHVzaChyW3RdKTtyZXR1cm4gbn0sdC5ibD13aSx0LmJtPXFjLHQuYm49WmMsdC5ibz0kdSx0LmJwPWZ1bmN0aW9uKGUpe2UuYnVja2V0LmNyZWF0ZUFycmF5cygpLGUuYnVja2V0LnRpbGVQaXhlbFJhdGlvPSRhLyg1MTIqZS5idWNrZXQub3ZlcnNjYWxpbmcpLGUuYnVja2V0LmNvbXBhcmVUZXh0PXt9LGUuYnVja2V0Lmljb25zTmVlZExpbmVhcj0hMTtjb25zdCByPWUuYnVja2V0LmxheWVyc1swXSxuPXIubGF5b3V0LGk9ci5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlcyxzPXtsYXlvdXRJY29uU2l6ZTppW1wiaWNvbi1zaXplXCJdLnBvc3NpYmx5RXZhbHVhdGUobmV3IFVpKGUuYnVja2V0Lnpvb20rMSksZS5jYW5vbmljYWwpLGxheW91dFRleHRTaXplOmlbXCJ0ZXh0LXNpemVcIl0ucG9zc2libHlFdmFsdWF0ZShuZXcgVWkoZS5idWNrZXQuem9vbSsxKSxlLmNhbm9uaWNhbCksdGV4dE1heFNpemU6aVtcInRleHQtc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBVaSgxOCkpfTtpZihcImNvbXBvc2l0ZVwiPT09ZS5idWNrZXQudGV4dFNpemVEYXRhLmtpbmQpe2NvbnN0e21pblpvb206dCxtYXhab29tOnJ9PWUuYnVja2V0LnRleHRTaXplRGF0YTtzLmNvbXBvc2l0ZVRleHRTaXplcz1baVtcInRleHQtc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBVaSh0KSxlLmNhbm9uaWNhbCksaVtcInRleHQtc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBVaShyKSxlLmNhbm9uaWNhbCldO31pZihcImNvbXBvc2l0ZVwiPT09ZS5idWNrZXQuaWNvblNpemVEYXRhLmtpbmQpe2NvbnN0e21pblpvb206dCxtYXhab29tOnJ9PWUuYnVja2V0Lmljb25TaXplRGF0YTtzLmNvbXBvc2l0ZUljb25TaXplcz1baVtcImljb24tc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBVaSh0KSxlLmNhbm9uaWNhbCksaVtcImljb24tc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBVaShyKSxlLmNhbm9uaWNhbCldO31jb25zdCBhPW4uZ2V0KFwidGV4dC1saW5lLWhlaWdodFwiKSppdSxvPVwidmlld3BvcnRcIiE9PW4uZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIikmJlwicG9pbnRcIiE9PW4uZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSxsPW4uZ2V0KFwidGV4dC1rZWVwLXVwcmlnaHRcIiksdT1uLmdldChcInRleHQtc2l6ZVwiKTtmb3IoY29uc3QgaSBvZiBlLmJ1Y2tldC5mZWF0dXJlcyl7Y29uc3QgYz1uLmdldChcInRleHQtZm9udFwiKS5ldmFsdWF0ZShpLHt9LGUuY2Fub25pY2FsKS5qb2luKFwiLFwiKSxoPXUuZXZhbHVhdGUoaSx7fSxlLmNhbm9uaWNhbCkscD1zLmxheW91dFRleHRTaXplLmV2YWx1YXRlKGkse30sZS5jYW5vbmljYWwpLGY9cy5sYXlvdXRJY29uU2l6ZS5ldmFsdWF0ZShpLHt9LGUuY2Fub25pY2FsKSxkPXtob3Jpem9udGFsOnt9LHZlcnRpY2FsOnZvaWQgMH0seT1pLnRleHQ7bGV0IG0sZz1bMCwwXTtpZih5KXtjb25zdCBzPXkudG9TdHJpbmcoKSx1PW4uZ2V0KFwidGV4dC1sZXR0ZXItc3BhY2luZ1wiKS5ldmFsdWF0ZShpLHt9LGUuY2Fub25pY2FsKSppdSxmPUNpKHMpP3U6MCxtPW4uZ2V0KFwidGV4dC1hbmNob3JcIikuZXZhbHVhdGUoaSx7fSxlLmNhbm9uaWNhbCkseD12aChyLGksZS5jYW5vbmljYWwpO2lmKCF4KXtjb25zdCB0PW4uZ2V0KFwidGV4dC1yYWRpYWwtb2Zmc2V0XCIpLmV2YWx1YXRlKGkse30sZS5jYW5vbmljYWwpO2c9dD94aChtLFt0Kml1LGdoXSk6bi5nZXQoXCJ0ZXh0LW9mZnNldFwiKS5ldmFsdWF0ZShpLHt9LGUuY2Fub25pY2FsKS5tYXAoKHQ9PnQqaXUpKTt9bGV0IHY9bz9cImNlbnRlclwiOm4uZ2V0KFwidGV4dC1qdXN0aWZ5XCIpLmV2YWx1YXRlKGkse30sZS5jYW5vbmljYWwpO2NvbnN0IGI9XCJwb2ludFwiPT09bi5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpP24uZ2V0KFwidGV4dC1tYXgtd2lkdGhcIikuZXZhbHVhdGUoaSx7fSxlLmNhbm9uaWNhbCkqaXU6MS8wLHc9KCk9PntlLmJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50JiZQaShzKSYmKGQudmVydGljYWw9UnUoeSxlLmdseXBoTWFwLGUuZ2x5cGhQb3NpdGlvbnMsZS5pbWFnZVBvc2l0aW9ucyxjLGIsYSxtLFwibGVmdFwiLGYsZyx0LmFoLnZlcnRpY2FsLCEwLHAsaCkpO307aWYoIW8mJngpe2NvbnN0IHI9bmV3IFNldDtpZihcImF1dG9cIj09PXYpZm9yKGxldCB0PTA7dDx4LnZhbHVlcy5sZW5ndGg7dCs9MilyLmFkZChiaCh4LnZhbHVlc1t0XSkpO2Vsc2Ugci5hZGQodik7bGV0IG49ITE7Zm9yKGNvbnN0IGkgb2YgcilpZighZC5ob3Jpem9udGFsW2ldKWlmKG4pZC5ob3Jpem9udGFsW2ldPWQuaG9yaXpvbnRhbFswXTtlbHNlIHtjb25zdCByPVJ1KHksZS5nbHlwaE1hcCxlLmdseXBoUG9zaXRpb25zLGUuaW1hZ2VQb3NpdGlvbnMsYyxiLGEsXCJjZW50ZXJcIixpLGYsZyx0LmFoLmhvcml6b250YWwsITEscCxoKTtyJiYoZC5ob3Jpem9udGFsW2ldPXIsbj0xPT09ci5wb3NpdGlvbmVkTGluZXMubGVuZ3RoKTt9dygpO31lbHNlIHtcImF1dG9cIj09PXYmJih2PWJoKG0pKTtjb25zdCByPVJ1KHksZS5nbHlwaE1hcCxlLmdseXBoUG9zaXRpb25zLGUuaW1hZ2VQb3NpdGlvbnMsYyxiLGEsbSx2LGYsZyx0LmFoLmhvcml6b250YWwsITEscCxoKTtyJiYoZC5ob3Jpem9udGFsW3ZdPXIpLHcoKSxQaShzKSYmbyYmbCYmKGQudmVydGljYWw9UnUoeSxlLmdseXBoTWFwLGUuZ2x5cGhQb3NpdGlvbnMsZS5pbWFnZVBvc2l0aW9ucyxjLGIsYSxtLHYsZixnLHQuYWgudmVydGljYWwsITEscCxoKSk7fX1sZXQgeD0hMTtpZihpLmljb24mJmkuaWNvbi5uYW1lKXtjb25zdCB0PWUuaW1hZ2VNYXBbaS5pY29uLm5hbWVdO3QmJihtPVF1KGUuaW1hZ2VQb3NpdGlvbnNbaS5pY29uLm5hbWVdLG4uZ2V0KFwiaWNvbi1vZmZzZXRcIikuZXZhbHVhdGUoaSx7fSxlLmNhbm9uaWNhbCksbi5nZXQoXCJpY29uLWFuY2hvclwiKS5ldmFsdWF0ZShpLHt9LGUuY2Fub25pY2FsKSkseD0hIXQuc2RmLHZvaWQgMD09PWUuYnVja2V0LnNkZkljb25zP2UuYnVja2V0LnNkZkljb25zPXg6ZS5idWNrZXQuc2RmSWNvbnMhPT14JiZBKFwiU3R5bGUgc2hlZXQgd2FybmluZzogQ2Fubm90IG1peCBTREYgYW5kIG5vbi1TREYgaWNvbnMgaW4gb25lIGJ1ZmZlclwiKSwodC5waXhlbFJhdGlvIT09ZS5idWNrZXQucGl4ZWxSYXRpb3x8MCE9PW4uZ2V0KFwiaWNvbi1yb3RhdGVcIikuY29uc3RhbnRPcigxKSkmJihlLmJ1Y2tldC5pY29uc05lZWRMaW5lYXI9ITApKTt9Y29uc3Qgdj1BaChkLmhvcml6b250YWwpfHxkLnZlcnRpY2FsO2UuYnVja2V0Lmljb25zSW5UZXh0PSEhdiYmdi5pY29uc0luVGV4dCwodnx8bSkmJndoKGUuYnVja2V0LGksZCxtLGUuaW1hZ2VNYXAscyxwLGYsZyx4LGUuY2Fub25pY2FsKTt9ZS5zaG93Q29sbGlzaW9uQm94ZXMmJmUuYnVja2V0LmdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzKCk7fSx0LmJxPXFsLHQuYnI9c2wsdC5icz16bCx0LmJ0PWZsLHQuYnU9SXUsdC5idj1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9tYXJrcz17c3RhcnQ6W3QudXJsLFwic3RhcnRcIl0uam9pbihcIiNcIiksZW5kOlt0LnVybCxcImVuZFwiXS5qb2luKFwiI1wiKSxtZWFzdXJlOnQudXJsLnRvU3RyaW5nKCl9LHBlcmZvcm1hbmNlLm1hcmsodGhpcy5fbWFya3Muc3RhcnQpO31maW5pc2goKXtwZXJmb3JtYW5jZS5tYXJrKHRoaXMuX21hcmtzLmVuZCk7bGV0IHQ9cGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSh0aGlzLl9tYXJrcy5tZWFzdXJlKTtyZXR1cm4gMD09PXQubGVuZ3RoJiYocGVyZm9ybWFuY2UubWVhc3VyZSh0aGlzLl9tYXJrcy5tZWFzdXJlLHRoaXMuX21hcmtzLnN0YXJ0LHRoaXMuX21hcmtzLmVuZCksdD1wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKHRoaXMuX21hcmtzLm1lYXN1cmUpLHBlcmZvcm1hbmNlLmNsZWFyTWFya3ModGhpcy5fbWFya3Muc3RhcnQpLHBlcmZvcm1hbmNlLmNsZWFyTWFya3ModGhpcy5fbWFya3MuZW5kKSxwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKHRoaXMuX21hcmtzLm1lYXN1cmUpKSx0fX0sdC5idz1mdW5jdGlvbih0LHIsbixpLHMpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYocCgpKXRyeXtyZXR1cm4geWllbGQgUCh0LHIsbixpLHMpfWNhdGNoKHQpe31yZXR1cm4gZnVuY3Rpb24odCxlLHIsbixpKXtjb25zdCBzPXQud2lkdGgsYT10LmhlaWdodDtDJiZCfHwoQz1uZXcgT2Zmc2NyZWVuQ2FudmFzKHMsYSksQj1DLmdldENvbnRleHQoXCIyZFwiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KSksQy53aWR0aD1zLEMuaGVpZ2h0PWEsQi5kcmF3SW1hZ2UodCwwLDAscyxhKTtjb25zdCBvPUIuZ2V0SW1hZ2VEYXRhKGUscixuLGkpO3JldHVybiBCLmNsZWFyUmVjdCgwLDAscyxhKSxvLmRhdGF9KHQscixuLGkscyl9KSl9LHQuYng9VWMsdC5ieT1yLHQuYno9bix0LmM9RSx0LmQ9dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoMD09PXQuYnl0ZUxlbmd0aClyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAobmV3IEltYWdlRGF0YSgxLDEpKTtjb25zdCBlPW5ldyBCbG9iKFtuZXcgVWludDhBcnJheSh0KV0se3R5cGU6XCJpbWFnZS9wbmdcIn0pO3RyeXtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoZSl9Y2F0Y2godCl7dGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9hZCBpbWFnZSBiZWNhdXNlIG9mICR7dC5tZXNzYWdlfS4gUGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgYSBzdXBwb3J0ZWQgaW1hZ2UgdHlwZSBzdWNoIGFzIFBORyBvciBKUEVHLiBOb3RlIHRoYXQgU1ZHcyBhcmUgbm90IHN1cHBvcnRlZC5gKX19KSksdC5lPWcsdC5mPXQ9Pm5ldyBQcm9taXNlKCgoZSxyKT0+e2NvbnN0IG49bmV3IEltYWdlO24ub25sb2FkPSgpPT57ZShuKSxVUkwucmV2b2tlT2JqZWN0VVJMKG4uc3JjKSxuLm9ubG9hZD1udWxsLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57bi5zcmM9ejt9KSk7fSxuLm9uZXJyb3I9KCk9PnIobmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgaW1hZ2UuIFBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIGEgc3VwcG9ydGVkIGltYWdlIHR5cGUgc3VjaCBhcyBQTkcgb3IgSlBFRy4gTm90ZSB0aGF0IFNWR3MgYXJlIG5vdCBzdXBwb3J0ZWQuXCIpKTtjb25zdCBpPW5ldyBCbG9iKFtuZXcgVWludDhBcnJheSh0KV0se3R5cGU6XCJpbWFnZS9wbmdcIn0pO24uc3JjPXQuYnl0ZUxlbmd0aD9VUkwuY3JlYXRlT2JqZWN0VVJMKGkpOno7fSkpLHQuZz1ULHQuaD0odCxlKT0+TyhnKHQse3R5cGU6XCJqc29uXCJ9KSxlKSx0Lmk9ayx0Lmo9Tix0Lms9cSx0Lmw9KHQsZSk9Pk8oZyh0LHt0eXBlOlwiYXJyYXlCdWZmZXJcIn0pLGUpLHQubT1PLHQubj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEl1KHQpLnJlYWRGaWVsZHMoUHUsW10pfSx0Lm89X28sdC5wPUV1LHQucT1ycyx0LnI9ZGksdC5zPWosdC50PXhpLHQudT1maSx0LnY9Ryx0Lnc9QSx0Lng9ZnVuY3Rpb24oW3QsZSxyXSl7cmV0dXJuIGUrPTkwLGUqPU1hdGguUEkvMTgwLHIqPU1hdGguUEkvMTgwLHt4OnQqTWF0aC5jb3MoZSkqTWF0aC5zaW4ocikseTp0Kk1hdGguc2luKGUpKk1hdGguc2luKHIpLHo6dCpNYXRoLmNvcyhyKX19LHQueT1DZSx0Lno9VWk7fSkpO1xuXG5kZWZpbmUoXCJ3b3JrZXJcIixbXCIuL3NoYXJlZFwiXSwoZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7Y2xhc3MgdHtjb25zdHJ1Y3RvcihlKXt0aGlzLmtleUNhY2hlPXt9LGUmJnRoaXMucmVwbGFjZShlKTt9cmVwbGFjZShlKXt0aGlzLl9sYXllckNvbmZpZ3M9e30sdGhpcy5fbGF5ZXJzPXt9LHRoaXMudXBkYXRlKGUsW10pO311cGRhdGUodCxvKXtmb3IoY29uc3QgbyBvZiB0KXt0aGlzLl9sYXllckNvbmZpZ3Nbby5pZF09bztjb25zdCB0PXRoaXMuX2xheWVyc1tvLmlkXT1lLmFBKG8pO3QuX2ZlYXR1cmVGaWx0ZXI9ZS5hNyh0LmZpbHRlciksdGhpcy5rZXlDYWNoZVtvLmlkXSYmZGVsZXRlIHRoaXMua2V5Q2FjaGVbby5pZF07fWZvcihjb25zdCBlIG9mIG8pZGVsZXRlIHRoaXMua2V5Q2FjaGVbZV0sZGVsZXRlIHRoaXMuX2xheWVyQ29uZmlnc1tlXSxkZWxldGUgdGhpcy5fbGF5ZXJzW2VdO3RoaXMuZmFtaWxpZXNCeVNvdXJjZT17fTtjb25zdCBpPWUuYmsoT2JqZWN0LnZhbHVlcyh0aGlzLl9sYXllckNvbmZpZ3MpLHRoaXMua2V5Q2FjaGUpO2Zvcihjb25zdCBlIG9mIGkpe2NvbnN0IHQ9ZS5tYXAoKGU9PnRoaXMuX2xheWVyc1tlLmlkXSkpLG89dFswXTtpZihcIm5vbmVcIj09PW8udmlzaWJpbGl0eSljb250aW51ZTtjb25zdCBpPW8uc291cmNlfHxcIlwiO2xldCBzPXRoaXMuZmFtaWxpZXNCeVNvdXJjZVtpXTtzfHwocz10aGlzLmZhbWlsaWVzQnlTb3VyY2VbaV09e30pO2NvbnN0IHI9by5zb3VyY2VMYXllcnx8XCJfZ2VvanNvblRpbGVMYXllclwiO2xldCBuPXNbcl07bnx8KG49c1tyXT1bXSksbi5wdXNoKHQpO319fWNsYXNzIG97Y29uc3RydWN0b3IodCl7Y29uc3Qgbz17fSxpPVtdO2Zvcihjb25zdCBlIGluIHQpe2NvbnN0IHM9dFtlXSxyPW9bZV09e307Zm9yKGNvbnN0IGUgaW4gcyl7Y29uc3QgdD1zWytlXTtpZighdHx8MD09PXQuYml0bWFwLndpZHRofHwwPT09dC5iaXRtYXAuaGVpZ2h0KWNvbnRpbnVlO2NvbnN0IG89e3g6MCx5OjAsdzp0LmJpdG1hcC53aWR0aCsyLGg6dC5iaXRtYXAuaGVpZ2h0KzJ9O2kucHVzaChvKSxyW2VdPXtyZWN0Om8sbWV0cmljczp0Lm1ldHJpY3N9O319Y29uc3R7dzpzLGg6cn09ZS5wKGkpLG49bmV3IGUubyh7d2lkdGg6c3x8MSxoZWlnaHQ6cnx8MX0pO2Zvcihjb25zdCBpIGluIHQpe2NvbnN0IHM9dFtpXTtmb3IoY29uc3QgdCBpbiBzKXtjb25zdCByPXNbK3RdO2lmKCFyfHwwPT09ci5iaXRtYXAud2lkdGh8fDA9PT1yLmJpdG1hcC5oZWlnaHQpY29udGludWU7Y29uc3QgYT1vW2ldW3RdLnJlY3Q7ZS5vLmNvcHkoci5iaXRtYXAsbix7eDowLHk6MH0se3g6YS54KzEseTphLnkrMX0sci5iaXRtYXApO319dGhpcy5pbWFnZT1uLHRoaXMucG9zaXRpb25zPW87fX1lLmJsKFwiR2x5cGhBdGxhc1wiLG8pO2NsYXNzIGl7Y29uc3RydWN0b3IodCl7dGhpcy50aWxlSUQ9bmV3IGUuUyh0LnRpbGVJRC5vdmVyc2NhbGVkWix0LnRpbGVJRC53cmFwLHQudGlsZUlELmNhbm9uaWNhbC56LHQudGlsZUlELmNhbm9uaWNhbC54LHQudGlsZUlELmNhbm9uaWNhbC55KSx0aGlzLnVpZD10LnVpZCx0aGlzLnpvb209dC56b29tLHRoaXMucGl4ZWxSYXRpbz10LnBpeGVsUmF0aW8sdGhpcy50aWxlU2l6ZT10LnRpbGVTaXplLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMub3ZlcnNjYWxpbmc9dGhpcy50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCksdGhpcy5zaG93Q29sbGlzaW9uQm94ZXM9dC5zaG93Q29sbGlzaW9uQm94ZXMsdGhpcy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc9ISF0LmNvbGxlY3RSZXNvdXJjZVRpbWluZyx0aGlzLnJldHVybkRlcGVuZGVuY2llcz0hIXQucmV0dXJuRGVwZW5kZW5jaWVzLHRoaXMucHJvbW90ZUlkPXQucHJvbW90ZUlkLHRoaXMuaW5GbGlnaHREZXBlbmRlbmNpZXM9W107fXBhcnNlKHQsaSxyLG4pe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnN0YXR1cz1cInBhcnNpbmdcIix0aGlzLmRhdGE9dCx0aGlzLmNvbGxpc2lvbkJveEFycmF5PW5ldyBlLmE1O2NvbnN0IGE9bmV3IGUuYm0oT2JqZWN0LmtleXModC5sYXllcnMpLnNvcnQoKSksbD1uZXcgZS5ibih0aGlzLnRpbGVJRCx0aGlzLnByb21vdGVJZCk7bC5idWNrZXRMYXllcklEcz1bXTtjb25zdCBjPXt9LHU9e2ZlYXR1cmVJbmRleDpsLGljb25EZXBlbmRlbmNpZXM6e30scGF0dGVybkRlcGVuZGVuY2llczp7fSxnbHlwaERlcGVuZGVuY2llczp7fSxhdmFpbGFibGVJbWFnZXM6cn0saD1pLmZhbWlsaWVzQnlTb3VyY2VbdGhpcy5zb3VyY2VdO2Zvcihjb25zdCBvIGluIGgpe2NvbnN0IGk9dC5sYXllcnNbb107aWYoIWkpY29udGludWU7MT09PWkudmVyc2lvbiYmZS53KGBWZWN0b3IgdGlsZSBzb3VyY2UgXCIke3RoaXMuc291cmNlfVwiIGxheWVyIFwiJHtvfVwiIGRvZXMgbm90IHVzZSB2ZWN0b3IgdGlsZSBzcGVjIHYyIGFuZCB0aGVyZWZvcmUgbWF5IGhhdmUgc29tZSByZW5kZXJpbmcgZXJyb3JzLmApO2NvbnN0IG49YS5lbmNvZGUobyksZD1bXTtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl7Y29uc3QgdD1pLmZlYXR1cmUoZSkscz1sLmdldElkKHQsbyk7ZC5wdXNoKHtmZWF0dXJlOnQsaWQ6cyxpbmRleDplLHNvdXJjZUxheWVySW5kZXg6bn0pO31mb3IoY29uc3QgdCBvZiBoW29dKXtjb25zdCBvPXRbMF07by5zb3VyY2UhPT10aGlzLnNvdXJjZSYmZS53KGBsYXllci5zb3VyY2UgPSAke28uc291cmNlfSBkb2VzIG5vdCBlcXVhbCB0aGlzLnNvdXJjZSA9ICR7dGhpcy5zb3VyY2V9YCksby5taW56b29tJiZ0aGlzLnpvb208TWF0aC5mbG9vcihvLm1pbnpvb20pfHxvLm1heHpvb20mJnRoaXMuem9vbT49by5tYXh6b29tfHxcIm5vbmVcIiE9PW8udmlzaWJpbGl0eSYmKHModCx0aGlzLnpvb20sciksKGNbby5pZF09by5jcmVhdGVCdWNrZXQoe2luZGV4OmwuYnVja2V0TGF5ZXJJRHMubGVuZ3RoLGxheWVyczp0LHpvb206dGhpcy56b29tLHBpeGVsUmF0aW86dGhpcy5waXhlbFJhdGlvLG92ZXJzY2FsaW5nOnRoaXMub3ZlcnNjYWxpbmcsY29sbGlzaW9uQm94QXJyYXk6dGhpcy5jb2xsaXNpb25Cb3hBcnJheSxzb3VyY2VMYXllckluZGV4Om4sc291cmNlSUQ6dGhpcy5zb3VyY2V9KSkucG9wdWxhdGUoZCx1LHRoaXMudGlsZUlELmNhbm9uaWNhbCksbC5idWNrZXRMYXllcklEcy5wdXNoKHQubWFwKChlPT5lLmlkKSkpKTt9fWNvbnN0IGQ9ZS5hRih1LmdseXBoRGVwZW5kZW5jaWVzLChlPT5PYmplY3Qua2V5cyhlKS5tYXAoTnVtYmVyKSkpO3RoaXMuaW5GbGlnaHREZXBlbmRlbmNpZXMuZm9yRWFjaCgoZT0+bnVsbD09ZT92b2lkIDA6ZS5hYm9ydCgpKSksdGhpcy5pbkZsaWdodERlcGVuZGVuY2llcz1bXTtsZXQgZj1Qcm9taXNlLnJlc29sdmUoe30pO2lmKE9iamVjdC5rZXlzKGQpLmxlbmd0aCl7Y29uc3QgZT1uZXcgQWJvcnRDb250cm9sbGVyO3RoaXMuaW5GbGlnaHREZXBlbmRlbmNpZXMucHVzaChlKSxmPW4uc2VuZEFzeW5jKHt0eXBlOlwiR0dcIixkYXRhOntzdGFja3M6ZCxzb3VyY2U6dGhpcy5zb3VyY2UsdGlsZUlEOnRoaXMudGlsZUlELHR5cGU6XCJnbHlwaHNcIn19LGUpO31jb25zdCBnPU9iamVjdC5rZXlzKHUuaWNvbkRlcGVuZGVuY2llcyk7bGV0IHA9UHJvbWlzZS5yZXNvbHZlKHt9KTtpZihnLmxlbmd0aCl7Y29uc3QgZT1uZXcgQWJvcnRDb250cm9sbGVyO3RoaXMuaW5GbGlnaHREZXBlbmRlbmNpZXMucHVzaChlKSxwPW4uc2VuZEFzeW5jKHt0eXBlOlwiR0lcIixkYXRhOntpY29uczpnLHNvdXJjZTp0aGlzLnNvdXJjZSx0aWxlSUQ6dGhpcy50aWxlSUQsdHlwZTpcImljb25zXCJ9fSxlKTt9Y29uc3QgbT1PYmplY3Qua2V5cyh1LnBhdHRlcm5EZXBlbmRlbmNpZXMpO2xldCB5PVByb21pc2UucmVzb2x2ZSh7fSk7aWYobS5sZW5ndGgpe2NvbnN0IGU9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLmluRmxpZ2h0RGVwZW5kZW5jaWVzLnB1c2goZSkseT1uLnNlbmRBc3luYyh7dHlwZTpcIkdJXCIsZGF0YTp7aWNvbnM6bSxzb3VyY2U6dGhpcy5zb3VyY2UsdGlsZUlEOnRoaXMudGlsZUlELHR5cGU6XCJwYXR0ZXJuc1wifX0sZSk7fWNvbnN0W3Ysdyx4XT15aWVsZCBQcm9taXNlLmFsbChbZixwLHldKSxiPW5ldyBvKHYpLFM9bmV3IGUuYm8odyx4KTtmb3IoY29uc3QgdCBpbiBjKXtjb25zdCBvPWNbdF07byBpbnN0YW5jZW9mIGUuYTY/KHMoby5sYXllcnMsdGhpcy56b29tLHIpLGUuYnAoe2J1Y2tldDpvLGdseXBoTWFwOnYsZ2x5cGhQb3NpdGlvbnM6Yi5wb3NpdGlvbnMsaW1hZ2VNYXA6dyxpbWFnZVBvc2l0aW9uczpTLmljb25Qb3NpdGlvbnMsc2hvd0NvbGxpc2lvbkJveGVzOnRoaXMuc2hvd0NvbGxpc2lvbkJveGVzLGNhbm9uaWNhbDp0aGlzLnRpbGVJRC5jYW5vbmljYWx9KSk6by5oYXNQYXR0ZXJuJiYobyBpbnN0YW5jZW9mIGUuYnF8fG8gaW5zdGFuY2VvZiBlLmJyfHxvIGluc3RhbmNlb2YgZS5icykmJihzKG8ubGF5ZXJzLHRoaXMuem9vbSxyKSxvLmFkZEZlYXR1cmVzKHUsdGhpcy50aWxlSUQuY2Fub25pY2FsLFMucGF0dGVyblBvc2l0aW9ucykpO31yZXR1cm4gdGhpcy5zdGF0dXM9XCJkb25lXCIse2J1Y2tldHM6T2JqZWN0LnZhbHVlcyhjKS5maWx0ZXIoKGU9PiFlLmlzRW1wdHkoKSkpLGZlYXR1cmVJbmRleDpsLGNvbGxpc2lvbkJveEFycmF5OnRoaXMuY29sbGlzaW9uQm94QXJyYXksZ2x5cGhBdGxhc0ltYWdlOmIuaW1hZ2UsaW1hZ2VBdGxhczpTLGdseXBoTWFwOnRoaXMucmV0dXJuRGVwZW5kZW5jaWVzP3Y6bnVsbCxpY29uTWFwOnRoaXMucmV0dXJuRGVwZW5kZW5jaWVzP3c6bnVsbCxnbHlwaFBvc2l0aW9uczp0aGlzLnJldHVybkRlcGVuZGVuY2llcz9iLnBvc2l0aW9uczpudWxsfX0pKX19ZnVuY3Rpb24gcyh0LG8saSl7Y29uc3Qgcz1uZXcgZS56KG8pO2Zvcihjb25zdCBlIG9mIHQpZS5yZWNhbGN1bGF0ZShzLGkpO31jbGFzcyBye2NvbnN0cnVjdG9yKGUsdCxvKXt0aGlzLmFjdG9yPWUsdGhpcy5sYXllckluZGV4PXQsdGhpcy5hdmFpbGFibGVJbWFnZXM9byx0aGlzLmZldGNoaW5nPXt9LHRoaXMubG9hZGluZz17fSx0aGlzLmxvYWRlZD17fTt9bG9hZFZlY3RvclRpbGUodCxvKXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCBlLmwodC5yZXF1ZXN0LG8pO3RyeXtyZXR1cm4ge3ZlY3RvclRpbGU6bmV3IGUuYnQuVmVjdG9yVGlsZShuZXcgZS5idShpLmRhdGEpKSxyYXdEYXRhOmkuZGF0YSxjYWNoZUNvbnRyb2w6aS5jYWNoZUNvbnRyb2wsZXhwaXJlczppLmV4cGlyZXN9fWNhdGNoKGUpe2NvbnN0IG89bmV3IFVpbnQ4QXJyYXkoaS5kYXRhKTtsZXQgcz1gVW5hYmxlIHRvIHBhcnNlIHRoZSB0aWxlIGF0ICR7dC5yZXF1ZXN0LnVybH0sIGA7dGhyb3cgcys9MzE9PT1vWzBdJiYxMzk9PT1vWzFdP1wicGxlYXNlIG1ha2Ugc3VyZSB0aGUgZGF0YSBpcyBub3QgZ3ppcHBlZCBhbmQgdGhhdCB5b3UgaGF2ZSBjb25maWd1cmVkIHRoZSByZWxldmFudCBoZWFkZXIgaW4gdGhlIHNlcnZlclwiOmBnb3QgZXJyb3I6ICR7ZS5tZXNzYWdlfWAsbmV3IEVycm9yKHMpfX0pKX1sb2FkVGlsZSh0KXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgbz10LnVpZCxzPSEhKHQmJnQucmVxdWVzdCYmdC5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZykmJm5ldyBlLmJ2KHQucmVxdWVzdCkscj1uZXcgaSh0KTt0aGlzLmxvYWRpbmdbb109cjtjb25zdCBuPW5ldyBBYm9ydENvbnRyb2xsZXI7ci5hYm9ydD1uO3RyeXtjb25zdCBpPXlpZWxkIHRoaXMubG9hZFZlY3RvclRpbGUodCxuKTtpZihkZWxldGUgdGhpcy5sb2FkaW5nW29dLCFpKXJldHVybiBudWxsO2NvbnN0IGE9aS5yYXdEYXRhLGw9e307aS5leHBpcmVzJiYobC5leHBpcmVzPWkuZXhwaXJlcyksaS5jYWNoZUNvbnRyb2wmJihsLmNhY2hlQ29udHJvbD1pLmNhY2hlQ29udHJvbCk7Y29uc3QgYz17fTtpZihzKXtjb25zdCBlPXMuZmluaXNoKCk7ZSYmKGMucmVzb3VyY2VUaW1pbmc9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSkpO31yLnZlY3RvclRpbGU9aS52ZWN0b3JUaWxlO2NvbnN0IHU9ci5wYXJzZShpLnZlY3RvclRpbGUsdGhpcy5sYXllckluZGV4LHRoaXMuYXZhaWxhYmxlSW1hZ2VzLHRoaXMuYWN0b3IpO3RoaXMubG9hZGVkW29dPXIsdGhpcy5mZXRjaGluZ1tvXT17cmF3VGlsZURhdGE6YSxjYWNoZUNvbnRyb2w6bCxyZXNvdXJjZVRpbWluZzpjfTt0cnl7Y29uc3QgdD15aWVsZCB1O3JldHVybiBlLmUoe3Jhd1RpbGVEYXRhOmEuc2xpY2UoMCl9LHQsbCxjKX1maW5hbGx5e2RlbGV0ZSB0aGlzLmZldGNoaW5nW29dO319Y2F0Y2goZSl7dGhyb3cgZGVsZXRlIHRoaXMubG9hZGluZ1tvXSxyLnN0YXR1cz1cImRvbmVcIix0aGlzLmxvYWRlZFtvXT1yLGV9fSkpfXJlbG9hZFRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG89dC51aWQ7aWYoIXRoaXMubG9hZGVkfHwhdGhpcy5sb2FkZWRbb10pdGhyb3cgbmV3IEVycm9yKFwiU2hvdWxkIG5vdCBiZSB0cnlpbmcgdG8gcmVsb2FkIGEgdGlsZSB0aGF0IHdhcyBuZXZlciBsb2FkZWQgb3IgaGFzIGJlZW4gcmVtb3ZlZFwiKTtjb25zdCBpPXRoaXMubG9hZGVkW29dO2lmKGkuc2hvd0NvbGxpc2lvbkJveGVzPXQuc2hvd0NvbGxpc2lvbkJveGVzLFwicGFyc2luZ1wiPT09aS5zdGF0dXMpe2NvbnN0IHQ9eWllbGQgaS5wYXJzZShpLnZlY3RvclRpbGUsdGhpcy5sYXllckluZGV4LHRoaXMuYXZhaWxhYmxlSW1hZ2VzLHRoaXMuYWN0b3IpO2xldCBzO2lmKHRoaXMuZmV0Y2hpbmdbb10pe2NvbnN0e3Jhd1RpbGVEYXRhOmksY2FjaGVDb250cm9sOnIscmVzb3VyY2VUaW1pbmc6bn09dGhpcy5mZXRjaGluZ1tvXTtkZWxldGUgdGhpcy5mZXRjaGluZ1tvXSxzPWUuZSh7cmF3VGlsZURhdGE6aS5zbGljZSgwKX0sdCxyLG4pO31lbHNlIHM9dDtyZXR1cm4gc31pZihcImRvbmVcIj09PWkuc3RhdHVzJiZpLnZlY3RvclRpbGUpcmV0dXJuIGkucGFyc2UoaS52ZWN0b3JUaWxlLHRoaXMubGF5ZXJJbmRleCx0aGlzLmF2YWlsYWJsZUltYWdlcyx0aGlzLmFjdG9yKX0pKX1hYm9ydFRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9dGhpcy5sb2FkaW5nLG89dC51aWQ7ZSYmZVtvXSYmZVtvXS5hYm9ydCYmKGVbb10uYWJvcnQuYWJvcnQoKSxkZWxldGUgZVtvXSk7fSkpfXJlbW92ZVRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMubG9hZGVkJiZ0aGlzLmxvYWRlZFt0LnVpZF0mJmRlbGV0ZSB0aGlzLmxvYWRlZFt0LnVpZF07fSkpfX1jbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5sb2FkZWQ9e307fWxvYWRUaWxlKHQpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdHt1aWQ6byxlbmNvZGluZzppLHJhd0ltYWdlRGF0YTpzLHJlZEZhY3RvcjpyLGdyZWVuRmFjdG9yOm4sYmx1ZUZhY3RvcjphLGJhc2VTaGlmdDpsfT10LGM9cy53aWR0aCsyLHU9cy5oZWlnaHQrMixoPWUuYihzKT9uZXcgZS5SKHt3aWR0aDpjLGhlaWdodDp1fSx5aWVsZCBlLmJ3KHMsLTEsLTEsYyx1KSk6cyxkPW5ldyBlLmJ4KG8saCxpLHIsbixhLGwpO3JldHVybiB0aGlzLmxvYWRlZD10aGlzLmxvYWRlZHx8e30sdGhpcy5sb2FkZWRbb109ZCxkfSkpfXJlbW92ZVRpbGUoZSl7Y29uc3QgdD10aGlzLmxvYWRlZCxvPWUudWlkO3QmJnRbb10mJmRlbGV0ZSB0W29dO319ZnVuY3Rpb24gYShlLHQpe2lmKDAhPT1lLmxlbmd0aCl7bChlWzBdLHQpO2Zvcih2YXIgbz0xO288ZS5sZW5ndGg7bysrKWwoZVtvXSwhdCk7fX1mdW5jdGlvbiBsKGUsdCl7Zm9yKHZhciBvPTAsaT0wLHM9MCxyPWUubGVuZ3RoLG49ci0xO3M8cjtuPXMrKyl7dmFyIGE9KGVbc11bMF0tZVtuXVswXSkqKGVbbl1bMV0rZVtzXVsxXSksbD1vK2E7aSs9TWF0aC5hYnMobyk+PU1hdGguYWJzKGEpP28tbCthOmEtbCtvLG89bDt9bytpPj0wIT0hIXQmJmUucmV2ZXJzZSgpO312YXIgYz1lLmJ5KChmdW5jdGlvbiBlKHQsbyl7dmFyIGkscz10JiZ0LnR5cGU7aWYoXCJGZWF0dXJlQ29sbGVjdGlvblwiPT09cylmb3IoaT0wO2k8dC5mZWF0dXJlcy5sZW5ndGg7aSsrKWUodC5mZWF0dXJlc1tpXSxvKTtlbHNlIGlmKFwiR2VvbWV0cnlDb2xsZWN0aW9uXCI9PT1zKWZvcihpPTA7aTx0Lmdlb21ldHJpZXMubGVuZ3RoO2krKyllKHQuZ2VvbWV0cmllc1tpXSxvKTtlbHNlIGlmKFwiRmVhdHVyZVwiPT09cyllKHQuZ2VvbWV0cnksbyk7ZWxzZSBpZihcIlBvbHlnb25cIj09PXMpYSh0LmNvb3JkaW5hdGVzLG8pO2Vsc2UgaWYoXCJNdWx0aVBvbHlnb25cIj09PXMpZm9yKGk9MDtpPHQuY29vcmRpbmF0ZXMubGVuZ3RoO2krKylhKHQuY29vcmRpbmF0ZXNbaV0sbyk7cmV0dXJuIHR9KSk7Y29uc3QgdT1lLmJ0LlZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT047dmFyIGg9e2V4cG9ydHM6e319LGQ9ZS5ieixmPWUuYnQuVmVjdG9yVGlsZUZlYXR1cmUsZz1wO2Z1bmN0aW9uIHAoZSx0KXt0aGlzLm9wdGlvbnM9dHx8e30sdGhpcy5mZWF0dXJlcz1lLHRoaXMubGVuZ3RoPWUubGVuZ3RoO31mdW5jdGlvbiBtKGUsdCl7dGhpcy5pZD1cIm51bWJlclwiPT10eXBlb2YgZS5pZD9lLmlkOnZvaWQgMCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMucmF3R2VvbWV0cnk9MT09PWUudHlwZT9bZS5nZW9tZXRyeV06ZS5nZW9tZXRyeSx0aGlzLnByb3BlcnRpZXM9ZS50YWdzLHRoaXMuZXh0ZW50PXR8fDQwOTY7fXAucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBtKHRoaXMuZmVhdHVyZXNbZV0sdGhpcy5vcHRpb25zLmV4dGVudCl9LG0ucHJvdG90eXBlLmxvYWRHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmF3R2VvbWV0cnk7dGhpcy5nZW9tZXRyeT1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7Zm9yKHZhciBvPWVbdF0saT1bXSxzPTA7czxvLmxlbmd0aDtzKyspaS5wdXNoKG5ldyBkKG9bc11bMF0sb1tzXVsxXSkpO3RoaXMuZ2VvbWV0cnkucHVzaChpKTt9cmV0dXJuIHRoaXMuZ2VvbWV0cnl9LG0ucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXt0aGlzLmdlb21ldHJ5fHx0aGlzLmxvYWRHZW9tZXRyeSgpO2Zvcih2YXIgZT10aGlzLmdlb21ldHJ5LHQ9MS8wLG89LTEvMCxpPTEvMCxzPS0xLzAscj0wO3I8ZS5sZW5ndGg7cisrKWZvcih2YXIgbj1lW3JdLGE9MDthPG4ubGVuZ3RoO2ErKyl7dmFyIGw9blthXTt0PU1hdGgubWluKHQsbC54KSxvPU1hdGgubWF4KG8sbC54KSxpPU1hdGgubWluKGksbC55KSxzPU1hdGgubWF4KHMsbC55KTt9cmV0dXJuIFt0LGksbyxzXX0sbS5wcm90b3R5cGUudG9HZW9KU09OPWYucHJvdG90eXBlLnRvR2VvSlNPTjt2YXIgeT1lLmJBLHY9ZztmdW5jdGlvbiB3KGUpe3ZhciB0PW5ldyB5O3JldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbyBpbiBlLmxheWVycyl0LndyaXRlTWVzc2FnZSgzLHgsZS5sYXllcnNbb10pO30oZSx0KSx0LmZpbmlzaCgpfWZ1bmN0aW9uIHgoZSx0KXt2YXIgbzt0LndyaXRlVmFyaW50RmllbGQoMTUsZS52ZXJzaW9ufHwxKSx0LndyaXRlU3RyaW5nRmllbGQoMSxlLm5hbWV8fFwiXCIpLHQud3JpdGVWYXJpbnRGaWVsZCg1LGUuZXh0ZW50fHw0MDk2KTt2YXIgaT17a2V5czpbXSx2YWx1ZXM6W10sa2V5Y2FjaGU6e30sdmFsdWVjYWNoZTp7fX07Zm9yKG89MDtvPGUubGVuZ3RoO28rKylpLmZlYXR1cmU9ZS5mZWF0dXJlKG8pLHQud3JpdGVNZXNzYWdlKDIsYixpKTt2YXIgcz1pLmtleXM7Zm9yKG89MDtvPHMubGVuZ3RoO28rKyl0LndyaXRlU3RyaW5nRmllbGQoMyxzW29dKTt2YXIgcj1pLnZhbHVlcztmb3Iobz0wO288ci5sZW5ndGg7bysrKXQud3JpdGVNZXNzYWdlKDQsUCxyW29dKTt9ZnVuY3Rpb24gYihlLHQpe3ZhciBvPWUuZmVhdHVyZTt2b2lkIDAhPT1vLmlkJiZ0LndyaXRlVmFyaW50RmllbGQoMSxvLmlkKSx0LndyaXRlTWVzc2FnZSgyLFMsZSksdC53cml0ZVZhcmludEZpZWxkKDMsby50eXBlKSx0LndyaXRlTWVzc2FnZSg0LEksbyk7fWZ1bmN0aW9uIFMoZSx0KXt2YXIgbz1lLmZlYXR1cmUsaT1lLmtleXMscz1lLnZhbHVlcyxyPWUua2V5Y2FjaGUsbj1lLnZhbHVlY2FjaGU7Zm9yKHZhciBhIGluIG8ucHJvcGVydGllcyl7dmFyIGw9by5wcm9wZXJ0aWVzW2FdLGM9clthXTtpZihudWxsIT09bCl7dm9pZCAwPT09YyYmKGkucHVzaChhKSxyW2FdPWM9aS5sZW5ndGgtMSksdC53cml0ZVZhcmludChjKTt2YXIgdT10eXBlb2YgbDtcInN0cmluZ1wiIT09dSYmXCJib29sZWFuXCIhPT11JiZcIm51bWJlclwiIT09dSYmKGw9SlNPTi5zdHJpbmdpZnkobCkpO3ZhciBoPXUrXCI6XCIrbCxkPW5baF07dm9pZCAwPT09ZCYmKHMucHVzaChsKSxuW2hdPWQ9cy5sZW5ndGgtMSksdC53cml0ZVZhcmludChkKTt9fX1mdW5jdGlvbiBfKGUsdCl7cmV0dXJuICh0PDwzKSsoNyZlKX1mdW5jdGlvbiBNKGUpe3JldHVybiBlPDwxXmU+PjMxfWZ1bmN0aW9uIEkoZSx0KXtmb3IodmFyIG89ZS5sb2FkR2VvbWV0cnkoKSxpPWUudHlwZSxzPTAscj0wLG49by5sZW5ndGgsYT0wO2E8bjthKyspe3ZhciBsPW9bYV0sYz0xOzE9PT1pJiYoYz1sLmxlbmd0aCksdC53cml0ZVZhcmludChfKDEsYykpO2Zvcih2YXIgdT0zPT09aT9sLmxlbmd0aC0xOmwubGVuZ3RoLGg9MDtoPHU7aCsrKXsxPT09aCYmMSE9PWkmJnQud3JpdGVWYXJpbnQoXygyLHUtMSkpO3ZhciBkPWxbaF0ueC1zLGY9bFtoXS55LXI7dC53cml0ZVZhcmludChNKGQpKSx0LndyaXRlVmFyaW50KE0oZikpLHMrPWQscis9Zjt9Mz09PWkmJnQud3JpdGVWYXJpbnQoXyg3LDEpKTt9fWZ1bmN0aW9uIFAoZSx0KXt2YXIgbz10eXBlb2YgZTtcInN0cmluZ1wiPT09bz90LndyaXRlU3RyaW5nRmllbGQoMSxlKTpcImJvb2xlYW5cIj09PW8/dC53cml0ZUJvb2xlYW5GaWVsZCg3LGUpOlwibnVtYmVyXCI9PT1vJiYoZSUxIT0wP3Qud3JpdGVEb3VibGVGaWVsZCgzLGUpOmU8MD90LndyaXRlU1ZhcmludEZpZWxkKDYsZSk6dC53cml0ZVZhcmludEZpZWxkKDUsZSkpO31oLmV4cG9ydHM9dyxoLmV4cG9ydHMuZnJvbVZlY3RvclRpbGVKcz13LGguZXhwb3J0cy5mcm9tR2VvanNvblZ0PWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgbz17fTtmb3IodmFyIGkgaW4gZSlvW2ldPW5ldyB2KGVbaV0uZmVhdHVyZXMsdCksb1tpXS5uYW1lPWksb1tpXS52ZXJzaW9uPXQudmVyc2lvbixvW2ldLmV4dGVudD10LmV4dGVudDtyZXR1cm4gdyh7bGF5ZXJzOm99KX0saC5leHBvcnRzLkdlb0pTT05XcmFwcGVyPXY7dmFyIGs9ZS5ieShoLmV4cG9ydHMpO2NvbnN0IFQ9e21pblpvb206MCxtYXhab29tOjE2LG1pblBvaW50czoyLHJhZGl1czo0MCxleHRlbnQ6NTEyLG5vZGVTaXplOjY0LGxvZzohMSxnZW5lcmF0ZUlkOiExLHJlZHVjZTpudWxsLG1hcDplPT5lfSxEPU1hdGguZnJvdW5kfHwoQz1uZXcgRmxvYXQzMkFycmF5KDEpLGU9PihDWzBdPStlLENbMF0pKTt2YXIgQztjb25zdCBMPTMsTz01LEY9NjtjbGFzcyB6e2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVCksZSksdGhpcy50cmVlcz1uZXcgQXJyYXkodGhpcy5vcHRpb25zLm1heFpvb20rMSksdGhpcy5zdHJpZGU9dGhpcy5vcHRpb25zLnJlZHVjZT83OjYsdGhpcy5jbHVzdGVyUHJvcHM9W107fWxvYWQoZSl7Y29uc3R7bG9nOnQsbWluWm9vbTpvLG1heFpvb206aX09dGhpcy5vcHRpb25zO3QmJmNvbnNvbGUudGltZShcInRvdGFsIHRpbWVcIik7Y29uc3Qgcz1gcHJlcGFyZSAke2UubGVuZ3RofSBwb2ludHNgO3QmJmNvbnNvbGUudGltZShzKSx0aGlzLnBvaW50cz1lO2NvbnN0IHI9W107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG89ZVt0XTtpZighby5nZW9tZXRyeSljb250aW51ZTtjb25zdFtpLHNdPW8uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsbj1EKEcoaSkpLGE9RChqKHMpKTtyLnB1c2gobixhLDEvMCx0LC0xLDEpLHRoaXMub3B0aW9ucy5yZWR1Y2UmJnIucHVzaCgwKTt9bGV0IG49dGhpcy50cmVlc1tpKzFdPXRoaXMuX2NyZWF0ZVRyZWUocik7dCYmY29uc29sZS50aW1lRW5kKHMpO2ZvcihsZXQgZT1pO2U+PW87ZS0tKXtjb25zdCBvPStEYXRlLm5vdygpO249dGhpcy50cmVlc1tlXT10aGlzLl9jcmVhdGVUcmVlKHRoaXMuX2NsdXN0ZXIobixlKSksdCYmY29uc29sZS5sb2coXCJ6JWQ6ICVkIGNsdXN0ZXJzIGluICVkbXNcIixlLG4ubnVtSXRlbXMsK0RhdGUubm93KCktbyk7fXJldHVybiB0JiZjb25zb2xlLnRpbWVFbmQoXCJ0b3RhbCB0aW1lXCIpLHRoaXN9Z2V0Q2x1c3RlcnMoZSx0KXtsZXQgbz0oKGVbMF0rMTgwKSUzNjArMzYwKSUzNjAtMTgwO2NvbnN0IGk9TWF0aC5tYXgoLTkwLE1hdGgubWluKDkwLGVbMV0pKTtsZXQgcz0xODA9PT1lWzJdPzE4MDooKGVbMl0rMTgwKSUzNjArMzYwKSUzNjAtMTgwO2NvbnN0IHI9TWF0aC5tYXgoLTkwLE1hdGgubWluKDkwLGVbM10pKTtpZihlWzJdLWVbMF0+PTM2MClvPS0xODAscz0xODA7ZWxzZSBpZihvPnMpe2NvbnN0IGU9dGhpcy5nZXRDbHVzdGVycyhbbyxpLDE4MCxyXSx0KSxuPXRoaXMuZ2V0Q2x1c3RlcnMoWy0xODAsaSxzLHJdLHQpO3JldHVybiBlLmNvbmNhdChuKX1jb25zdCBuPXRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHQpXSxhPW4ucmFuZ2UoRyhvKSxqKHIpLEcocyksaihpKSksbD1uLmRhdGEsYz1bXTtmb3IoY29uc3QgZSBvZiBhKXtjb25zdCB0PXRoaXMuc3RyaWRlKmU7Yy5wdXNoKGxbdCtPXT4xP0EobCx0LHRoaXMuY2x1c3RlclByb3BzKTp0aGlzLnBvaW50c1tsW3QrTF1dKTt9cmV0dXJuIGN9Z2V0Q2hpbGRyZW4oZSl7Y29uc3QgdD10aGlzLl9nZXRPcmlnaW5JZChlKSxvPXRoaXMuX2dldE9yaWdpblpvb20oZSksaT1cIk5vIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLlwiLHM9dGhpcy50cmVlc1tvXTtpZighcyl0aHJvdyBuZXcgRXJyb3IoaSk7Y29uc3Qgcj1zLmRhdGE7aWYodCp0aGlzLnN0cmlkZT49ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGkpO2NvbnN0IG49dGhpcy5vcHRpb25zLnJhZGl1cy8odGhpcy5vcHRpb25zLmV4dGVudCpNYXRoLnBvdygyLG8tMSkpLGE9cy53aXRoaW4oclt0KnRoaXMuc3RyaWRlXSxyW3QqdGhpcy5zdHJpZGUrMV0sbiksbD1bXTtmb3IoY29uc3QgdCBvZiBhKXtjb25zdCBvPXQqdGhpcy5zdHJpZGU7cltvKzRdPT09ZSYmbC5wdXNoKHJbbytPXT4xP0EocixvLHRoaXMuY2x1c3RlclByb3BzKTp0aGlzLnBvaW50c1tyW28rTF1dKTt9aWYoMD09PWwubGVuZ3RoKXRocm93IG5ldyBFcnJvcihpKTtyZXR1cm4gbH1nZXRMZWF2ZXMoZSx0LG8pe2NvbnN0IGk9W107cmV0dXJuIHRoaXMuX2FwcGVuZExlYXZlcyhpLGUsdD10fHwxMCxvPW98fDAsMCksaX1nZXRUaWxlKGUsdCxvKXtjb25zdCBpPXRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKGUpXSxzPU1hdGgucG93KDIsZSkse2V4dGVudDpyLHJhZGl1czpufT10aGlzLm9wdGlvbnMsYT1uL3IsbD0oby1hKS9zLGM9KG8rMSthKS9zLHU9e2ZlYXR1cmVzOltdfTtyZXR1cm4gdGhpcy5fYWRkVGlsZUZlYXR1cmVzKGkucmFuZ2UoKHQtYSkvcyxsLCh0KzErYSkvcyxjKSxpLmRhdGEsdCxvLHMsdSksMD09PXQmJnRoaXMuX2FkZFRpbGVGZWF0dXJlcyhpLnJhbmdlKDEtYS9zLGwsMSxjKSxpLmRhdGEscyxvLHMsdSksdD09PXMtMSYmdGhpcy5fYWRkVGlsZUZlYXR1cmVzKGkucmFuZ2UoMCxsLGEvcyxjKSxpLmRhdGEsLTEsbyxzLHUpLHUuZmVhdHVyZXMubGVuZ3RoP3U6bnVsbH1nZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShlKXtsZXQgdD10aGlzLl9nZXRPcmlnaW5ab29tKGUpLTE7Zm9yKDt0PD10aGlzLm9wdGlvbnMubWF4Wm9vbTspe2NvbnN0IG89dGhpcy5nZXRDaGlsZHJlbihlKTtpZih0KyssMSE9PW8ubGVuZ3RoKWJyZWFrO2U9b1swXS5wcm9wZXJ0aWVzLmNsdXN0ZXJfaWQ7fXJldHVybiB0fV9hcHBlbmRMZWF2ZXMoZSx0LG8saSxzKXtjb25zdCByPXRoaXMuZ2V0Q2hpbGRyZW4odCk7Zm9yKGNvbnN0IHQgb2Ygcil7Y29uc3Qgcj10LnByb3BlcnRpZXM7aWYociYmci5jbHVzdGVyP3Mrci5wb2ludF9jb3VudDw9aT9zKz1yLnBvaW50X2NvdW50OnM9dGhpcy5fYXBwZW5kTGVhdmVzKGUsci5jbHVzdGVyX2lkLG8saSxzKTpzPGk/cysrOmUucHVzaCh0KSxlLmxlbmd0aD09PW8pYnJlYWt9cmV0dXJuIHN9X2NyZWF0ZVRyZWUodCl7Y29uc3Qgbz1uZXcgZS5hdih0Lmxlbmd0aC90aGlzLnN0cmlkZXwwLHRoaXMub3B0aW9ucy5ub2RlU2l6ZSxGbG9hdDMyQXJyYXkpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9dGhpcy5zdHJpZGUpby5hZGQodFtlXSx0W2UrMV0pO3JldHVybiBvLmZpbmlzaCgpLG8uZGF0YT10LG99X2FkZFRpbGVGZWF0dXJlcyhlLHQsbyxpLHMscil7Zm9yKGNvbnN0IG4gb2YgZSl7Y29uc3QgZT1uKnRoaXMuc3RyaWRlLGE9dFtlK09dPjE7bGV0IGwsYyx1O2lmKGEpbD1FKHQsZSx0aGlzLmNsdXN0ZXJQcm9wcyksYz10W2VdLHU9dFtlKzFdO2Vsc2Uge2NvbnN0IG89dGhpcy5wb2ludHNbdFtlK0xdXTtsPW8ucHJvcGVydGllcztjb25zdFtpLHNdPW8uZ2VvbWV0cnkuY29vcmRpbmF0ZXM7Yz1HKGkpLHU9aihzKTt9Y29uc3QgaD17dHlwZToxLGdlb21ldHJ5OltbTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMuZXh0ZW50KihjKnMtbykpLE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCoodSpzLWkpKV1dLHRhZ3M6bH07bGV0IGQ7ZD1hfHx0aGlzLm9wdGlvbnMuZ2VuZXJhdGVJZD90W2UrTF06dGhpcy5wb2ludHNbdFtlK0xdXS5pZCx2b2lkIDAhPT1kJiYoaC5pZD1kKSxyLmZlYXR1cmVzLnB1c2goaCk7fX1fbGltaXRab29tKGUpe3JldHVybiBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluWm9vbSxNYXRoLm1pbihNYXRoLmZsb29yKCtlKSx0aGlzLm9wdGlvbnMubWF4Wm9vbSsxKSl9X2NsdXN0ZXIoZSx0KXtjb25zdHtyYWRpdXM6byxleHRlbnQ6aSxyZWR1Y2U6cyxtaW5Qb2ludHM6cn09dGhpcy5vcHRpb25zLG49by8oaSpNYXRoLnBvdygyLHQpKSxhPWUuZGF0YSxsPVtdLGM9dGhpcy5zdHJpZGU7Zm9yKGxldCBvPTA7bzxhLmxlbmd0aDtvKz1jKXtpZihhW28rMl08PXQpY29udGludWU7YVtvKzJdPXQ7Y29uc3QgaT1hW29dLHU9YVtvKzFdLGg9ZS53aXRoaW4oYVtvXSxhW28rMV0sbiksZD1hW28rT107bGV0IGY9ZDtmb3IoY29uc3QgZSBvZiBoKXtjb25zdCBvPWUqYzthW28rMl0+dCYmKGYrPWFbbytPXSk7fWlmKGY+ZCYmZj49cil7bGV0IGUscj1pKmQsbj11KmQsZz0tMTtjb25zdCBwPSgoby9jfDApPDw1KSsodCsxKSt0aGlzLnBvaW50cy5sZW5ndGg7Zm9yKGNvbnN0IGkgb2YgaCl7Y29uc3QgbD1pKmM7aWYoYVtsKzJdPD10KWNvbnRpbnVlO2FbbCsyXT10O2NvbnN0IHU9YVtsK09dO3IrPWFbbF0qdSxuKz1hW2wrMV0qdSxhW2wrNF09cCxzJiYoZXx8KGU9dGhpcy5fbWFwKGEsbywhMCksZz10aGlzLmNsdXN0ZXJQcm9wcy5sZW5ndGgsdGhpcy5jbHVzdGVyUHJvcHMucHVzaChlKSkscyhlLHRoaXMuX21hcChhLGwpKSk7fWFbbys0XT1wLGwucHVzaChyL2Ysbi9mLDEvMCxwLC0xLGYpLHMmJmwucHVzaChnKTt9ZWxzZSB7Zm9yKGxldCBlPTA7ZTxjO2UrKylsLnB1c2goYVtvK2VdKTtpZihmPjEpZm9yKGNvbnN0IGUgb2YgaCl7Y29uc3Qgbz1lKmM7aWYoIShhW28rMl08PXQpKXthW28rMl09dDtmb3IobGV0IGU9MDtlPGM7ZSsrKWwucHVzaChhW28rZV0pO319fX1yZXR1cm4gbH1fZ2V0T3JpZ2luSWQoZSl7cmV0dXJuIGUtdGhpcy5wb2ludHMubGVuZ3RoPj41fV9nZXRPcmlnaW5ab29tKGUpe3JldHVybiAoZS10aGlzLnBvaW50cy5sZW5ndGgpJTMyfV9tYXAoZSx0LG8pe2lmKGVbdCtPXT4xKXtjb25zdCBpPXRoaXMuY2x1c3RlclByb3BzW2VbdCtGXV07cmV0dXJuIG8/T2JqZWN0LmFzc2lnbih7fSxpKTppfWNvbnN0IGk9dGhpcy5wb2ludHNbZVt0K0xdXS5wcm9wZXJ0aWVzLHM9dGhpcy5vcHRpb25zLm1hcChpKTtyZXR1cm4gbyYmcz09PWk/T2JqZWN0LmFzc2lnbih7fSxzKTpzfX1mdW5jdGlvbiBBKGUsdCxvKXtyZXR1cm4ge3R5cGU6XCJGZWF0dXJlXCIsaWQ6ZVt0K0xdLHByb3BlcnRpZXM6RShlLHQsbyksZ2VvbWV0cnk6e3R5cGU6XCJQb2ludFwiLGNvb3JkaW5hdGVzOlsoaT1lW3RdLDM2MCooaS0uNSkpLFIoZVt0KzFdKV19fTt2YXIgaTt9ZnVuY3Rpb24gRShlLHQsbyl7Y29uc3QgaT1lW3QrT10scz1pPj0xZTQ/YCR7TWF0aC5yb3VuZChpLzFlMyl9a2A6aT49MWUzP01hdGgucm91bmQoaS8xMDApLzEwK1wia1wiOmkscj1lW3QrRl0sbj0tMT09PXI/e306T2JqZWN0LmFzc2lnbih7fSxvW3JdKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihuLHtjbHVzdGVyOiEwLGNsdXN0ZXJfaWQ6ZVt0K0xdLHBvaW50X2NvdW50OmkscG9pbnRfY291bnRfYWJicmV2aWF0ZWQ6c30pfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGUvMzYwKy41fWZ1bmN0aW9uIGooZSl7Y29uc3QgdD1NYXRoLnNpbihlKk1hdGguUEkvMTgwKSxvPS41LS4yNSpNYXRoLmxvZygoMSt0KS8oMS10KSkvTWF0aC5QSTtyZXR1cm4gbzwwPzA6bz4xPzE6b31mdW5jdGlvbiBSKGUpe2NvbnN0IHQ9KDE4MC0zNjAqZSkqTWF0aC5QSS8xODA7cmV0dXJuIDM2MCpNYXRoLmF0YW4oTWF0aC5leHAodCkpL01hdGguUEktOTB9ZnVuY3Rpb24gWihlLHQsbyxpKXtsZXQgcz1pO2NvbnN0IHI9dCsoby10Pj4xKTtsZXQgbixhPW8tdDtjb25zdCBsPWVbdF0sYz1lW3QrMV0sdT1lW29dLGg9ZVtvKzFdO2ZvcihsZXQgaT10KzM7aTxvO2krPTMpe2NvbnN0IHQ9TihlW2ldLGVbaSsxXSxsLGMsdSxoKTtpZih0PnMpbj1pLHM9dDtlbHNlIGlmKHQ9PT1zKXtjb25zdCBlPU1hdGguYWJzKGktcik7ZTxhJiYobj1pLGE9ZSk7fX1zPmkmJihuLXQ+MyYmWihlLHQsbixpKSxlW24rMl09cyxvLW4+MyYmWihlLG4sbyxpKSk7fWZ1bmN0aW9uIE4oZSx0LG8saSxzLHIpe2xldCBuPXMtbyxhPXItaTtpZigwIT09bnx8MCE9PWEpe2NvbnN0IGw9KChlLW8pKm4rKHQtaSkqYSkvKG4qbithKmEpO2w+MT8obz1zLGk9cik6bD4wJiYobys9bipsLGkrPWEqbCk7fXJldHVybiBuPWUtbyxhPXQtaSxuKm4rYSphfWZ1bmN0aW9uIEooZSx0LG8saSl7Y29uc3Qgcz17aWQ6bnVsbD09ZT9udWxsOmUsdHlwZTp0LGdlb21ldHJ5Om8sdGFnczppLG1pblg6MS8wLG1pblk6MS8wLG1heFg6LTEvMCxtYXhZOi0xLzB9O2lmKFwiUG9pbnRcIj09PXR8fFwiTXVsdGlQb2ludFwiPT09dHx8XCJMaW5lU3RyaW5nXCI9PT10KVcocyxvKTtlbHNlIGlmKFwiUG9seWdvblwiPT09dClXKHMsb1swXSk7ZWxzZSBpZihcIk11bHRpTGluZVN0cmluZ1wiPT09dClmb3IoY29uc3QgZSBvZiBvKVcocyxlKTtlbHNlIGlmKFwiTXVsdGlQb2x5Z29uXCI9PT10KWZvcihjb25zdCBlIG9mIG8pVyhzLGVbMF0pO3JldHVybiBzfWZ1bmN0aW9uIFcoZSx0KXtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rPTMpZS5taW5YPU1hdGgubWluKGUubWluWCx0W29dKSxlLm1pblk9TWF0aC5taW4oZS5taW5ZLHRbbysxXSksZS5tYXhYPU1hdGgubWF4KGUubWF4WCx0W29dKSxlLm1heFk9TWF0aC5tYXgoZS5tYXhZLHRbbysxXSk7fWZ1bmN0aW9uIFkoZSx0LG8saSl7aWYoIXQuZ2VvbWV0cnkpcmV0dXJuO2NvbnN0IHM9dC5nZW9tZXRyeS5jb29yZGluYXRlcztpZihzJiYwPT09cy5sZW5ndGgpcmV0dXJuO2NvbnN0IHI9dC5nZW9tZXRyeS50eXBlLG49TWF0aC5wb3coby50b2xlcmFuY2UvKCgxPDxvLm1heFpvb20pKm8uZXh0ZW50KSwyKTtsZXQgYT1bXSxsPXQuaWQ7aWYoby5wcm9tb3RlSWQ/bD10LnByb3BlcnRpZXNbby5wcm9tb3RlSWRdOm8uZ2VuZXJhdGVJZCYmKGw9aXx8MCksXCJQb2ludFwiPT09cilWKHMsYSk7ZWxzZSBpZihcIk11bHRpUG9pbnRcIj09PXIpZm9yKGNvbnN0IGUgb2YgcylWKGUsYSk7ZWxzZSBpZihcIkxpbmVTdHJpbmdcIj09PXIpWChzLGEsbiwhMSk7ZWxzZSBpZihcIk11bHRpTGluZVN0cmluZ1wiPT09cil7aWYoby5saW5lTWV0cmljcyl7Zm9yKGNvbnN0IG8gb2YgcylhPVtdLFgobyxhLG4sITEpLGUucHVzaChKKGwsXCJMaW5lU3RyaW5nXCIsYSx0LnByb3BlcnRpZXMpKTtyZXR1cm59cShzLGEsbiwhMSk7fWVsc2UgaWYoXCJQb2x5Z29uXCI9PT1yKXEocyxhLG4sITApO2Vsc2Uge2lmKFwiTXVsdGlQb2x5Z29uXCIhPT1yKXtpZihcIkdlb21ldHJ5Q29sbGVjdGlvblwiPT09cil7Zm9yKGNvbnN0IHMgb2YgdC5nZW9tZXRyeS5nZW9tZXRyaWVzKVkoZSx7aWQ6bCxnZW9tZXRyeTpzLHByb3BlcnRpZXM6dC5wcm9wZXJ0aWVzfSxvLGkpO3JldHVybn10aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LlwiKX1mb3IoY29uc3QgZSBvZiBzKXtjb25zdCB0PVtdO3EoZSx0LG4sITApLGEucHVzaCh0KTt9fWUucHVzaChKKGwscixhLHQucHJvcGVydGllcykpO31mdW5jdGlvbiBWKGUsdCl7dC5wdXNoKEgoZVswXSksQihlWzFdKSwwKTt9ZnVuY3Rpb24gWChlLHQsbyxpKXtsZXQgcyxyLG49MDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7Y29uc3QgYT1IKGVbb11bMF0pLGw9QihlW29dWzFdKTt0LnB1c2goYSxsLDApLG8+MCYmKG4rPWk/KHMqbC1hKnIpLzI6TWF0aC5zcXJ0KE1hdGgucG93KGEtcywyKStNYXRoLnBvdyhsLXIsMikpKSxzPWEscj1sO31jb25zdCBhPXQubGVuZ3RoLTM7dFsyXT0xLFoodCwwLGEsbyksdFthKzJdPTEsdC5zaXplPU1hdGguYWJzKG4pLHQuc3RhcnQ9MCx0LmVuZD10LnNpemU7fWZ1bmN0aW9uIHEoZSx0LG8saSl7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IHI9W107WChlW3NdLHIsbyxpKSx0LnB1c2gocik7fX1mdW5jdGlvbiBIKGUpe3JldHVybiBlLzM2MCsuNX1mdW5jdGlvbiBCKGUpe2NvbnN0IHQ9TWF0aC5zaW4oZSpNYXRoLlBJLzE4MCksbz0uNS0uMjUqTWF0aC5sb2coKDErdCkvKDEtdCkpL01hdGguUEk7cmV0dXJuIG88MD8wOm8+MT8xOm99ZnVuY3Rpb24gVShlLHQsbyxpLHMscixuLGEpe2lmKGkvPXQscj49KG8vPXQpJiZuPGkpcmV0dXJuIGU7aWYobjxvfHxyPj1pKXJldHVybiBudWxsO2NvbnN0IGw9W107Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT10Lmdlb21ldHJ5O2xldCByPXQudHlwZTtjb25zdCBuPTA9PT1zP3QubWluWDp0Lm1pblksYz0wPT09cz90Lm1heFg6dC5tYXhZO2lmKG4+PW8mJmM8aSl7bC5wdXNoKHQpO2NvbnRpbnVlfWlmKGM8b3x8bj49aSljb250aW51ZTtsZXQgdT1bXTtpZihcIlBvaW50XCI9PT1yfHxcIk11bHRpUG9pbnRcIj09PXIpJChlLHUsbyxpLHMpO2Vsc2UgaWYoXCJMaW5lU3RyaW5nXCI9PT1yKUsoZSx1LG8saSxzLCExLGEubGluZU1ldHJpY3MpO2Vsc2UgaWYoXCJNdWx0aUxpbmVTdHJpbmdcIj09PXIpZWUoZSx1LG8saSxzLCExKTtlbHNlIGlmKFwiUG9seWdvblwiPT09cillZShlLHUsbyxpLHMsITApO2Vsc2UgaWYoXCJNdWx0aVBvbHlnb25cIj09PXIpZm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT1bXTtlZSh0LGUsbyxpLHMsITApLGUubGVuZ3RoJiZ1LnB1c2goZSk7fWlmKHUubGVuZ3RoKXtpZihhLmxpbmVNZXRyaWNzJiZcIkxpbmVTdHJpbmdcIj09PXIpe2Zvcihjb25zdCBlIG9mIHUpbC5wdXNoKEoodC5pZCxyLGUsdC50YWdzKSk7Y29udGludWV9XCJMaW5lU3RyaW5nXCIhPT1yJiZcIk11bHRpTGluZVN0cmluZ1wiIT09cnx8KDE9PT11Lmxlbmd0aD8ocj1cIkxpbmVTdHJpbmdcIix1PXVbMF0pOnI9XCJNdWx0aUxpbmVTdHJpbmdcIiksXCJQb2ludFwiIT09ciYmXCJNdWx0aVBvaW50XCIhPT1yfHwocj0zPT09dS5sZW5ndGg/XCJQb2ludFwiOlwiTXVsdGlQb2ludFwiKSxsLnB1c2goSih0LmlkLHIsdSx0LnRhZ3MpKTt9fXJldHVybiBsLmxlbmd0aD9sOm51bGx9ZnVuY3Rpb24gJChlLHQsbyxpLHMpe2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cis9Myl7Y29uc3Qgbj1lW3Irc107bj49byYmbjw9aSYmdGUodCxlW3JdLGVbcisxXSxlW3IrMl0pO319ZnVuY3Rpb24gSyhlLHQsbyxpLHMscixuKXtsZXQgYT1RKGUpO2NvbnN0IGw9MD09PXM/b2U6aWU7bGV0IGMsdSxoPWUuc3RhcnQ7Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aC0zO2QrPTMpe2NvbnN0IGY9ZVtkXSxnPWVbZCsxXSxwPWVbZCsyXSxtPWVbZCszXSx5PWVbZCs0XSx2PTA9PT1zP2Y6Zyx3PTA9PT1zP206eTtsZXQgeD0hMTtuJiYoYz1NYXRoLnNxcnQoTWF0aC5wb3coZi1tLDIpK01hdGgucG93KGcteSwyKSkpLHY8bz93Pm8mJih1PWwoYSxmLGcsbSx5LG8pLG4mJihhLnN0YXJ0PWgrYyp1KSk6dj5pP3c8aSYmKHU9bChhLGYsZyxtLHksaSksbiYmKGEuc3RhcnQ9aCtjKnUpKTp0ZShhLGYsZyxwKSx3PG8mJnY+PW8mJih1PWwoYSxmLGcsbSx5LG8pLHg9ITApLHc+aSYmdjw9aSYmKHU9bChhLGYsZyxtLHksaSkseD0hMCksIXImJngmJihuJiYoYS5lbmQ9aCtjKnUpLHQucHVzaChhKSxhPVEoZSkpLG4mJihoKz1jKTt9bGV0IGQ9ZS5sZW5ndGgtMztjb25zdCBmPWVbZF0sZz1lW2QrMV0scD0wPT09cz9mOmc7cD49byYmcDw9aSYmdGUoYSxmLGcsZVtkKzJdKSxkPWEubGVuZ3RoLTMsciYmZD49MyYmKGFbZF0hPT1hWzBdfHxhW2QrMV0hPT1hWzFdKSYmdGUoYSxhWzBdLGFbMV0sYVsyXSksYS5sZW5ndGgmJnQucHVzaChhKTt9ZnVuY3Rpb24gUShlKXtjb25zdCB0PVtdO3JldHVybiB0LnNpemU9ZS5zaXplLHQuc3RhcnQ9ZS5zdGFydCx0LmVuZD1lLmVuZCx0fWZ1bmN0aW9uIGVlKGUsdCxvLGkscyxyKXtmb3IoY29uc3QgbiBvZiBlKUsobix0LG8saSxzLHIsITEpO31mdW5jdGlvbiB0ZShlLHQsbyxpKXtlLnB1c2godCxvLGkpO31mdW5jdGlvbiBvZShlLHQsbyxpLHMscil7Y29uc3Qgbj0oci10KS8oaS10KTtyZXR1cm4gdGUoZSxyLG8rKHMtbykqbiwxKSxufWZ1bmN0aW9uIGllKGUsdCxvLGkscyxyKXtjb25zdCBuPShyLW8pLyhzLW8pO3JldHVybiB0ZShlLHQrKGktdCkqbixyLDEpLG59ZnVuY3Rpb24gc2UoZSx0KXtjb25zdCBvPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtjb25zdCBzPWVbaV0scj1zLnR5cGU7bGV0IG47aWYoXCJQb2ludFwiPT09cnx8XCJNdWx0aVBvaW50XCI9PT1yfHxcIkxpbmVTdHJpbmdcIj09PXIpbj1yZShzLmdlb21ldHJ5LHQpO2Vsc2UgaWYoXCJNdWx0aUxpbmVTdHJpbmdcIj09PXJ8fFwiUG9seWdvblwiPT09cil7bj1bXTtmb3IoY29uc3QgZSBvZiBzLmdlb21ldHJ5KW4ucHVzaChyZShlLHQpKTt9ZWxzZSBpZihcIk11bHRpUG9seWdvblwiPT09cil7bj1bXTtmb3IoY29uc3QgZSBvZiBzLmdlb21ldHJ5KXtjb25zdCBvPVtdO2Zvcihjb25zdCBpIG9mIGUpby5wdXNoKHJlKGksdCkpO24ucHVzaChvKTt9fW8ucHVzaChKKHMuaWQscixuLHMudGFncykpO31yZXR1cm4gb31mdW5jdGlvbiByZShlLHQpe2NvbnN0IG89W107by5zaXplPWUuc2l6ZSx2b2lkIDAhPT1lLnN0YXJ0JiYoby5zdGFydD1lLnN0YXJ0LG8uZW5kPWUuZW5kKTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krPTMpby5wdXNoKGVbaV0rdCxlW2krMV0sZVtpKzJdKTtyZXR1cm4gb31mdW5jdGlvbiBuZShlLHQpe2lmKGUudHJhbnNmb3JtZWQpcmV0dXJuIGU7Y29uc3Qgbz0xPDxlLnosaT1lLngscz1lLnk7Zm9yKGNvbnN0IHIgb2YgZS5mZWF0dXJlcyl7Y29uc3QgZT1yLmdlb21ldHJ5LG49ci50eXBlO2lmKHIuZ2VvbWV0cnk9W10sMT09PW4pZm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKz0yKXIuZ2VvbWV0cnkucHVzaChhZShlW25dLGVbbisxXSx0LG8saSxzKSk7ZWxzZSBmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3QgYT1bXTtmb3IobGV0IHI9MDtyPGVbbl0ubGVuZ3RoO3IrPTIpYS5wdXNoKGFlKGVbbl1bcl0sZVtuXVtyKzFdLHQsbyxpLHMpKTtyLmdlb21ldHJ5LnB1c2goYSk7fX1yZXR1cm4gZS50cmFuc2Zvcm1lZD0hMCxlfWZ1bmN0aW9uIGFlKGUsdCxvLGkscyxyKXtyZXR1cm4gW01hdGgucm91bmQobyooZSppLXMpKSxNYXRoLnJvdW5kKG8qKHQqaS1yKSldfWZ1bmN0aW9uIGxlKGUsdCxvLGkscyl7Y29uc3Qgcj10PT09cy5tYXhab29tPzA6cy50b2xlcmFuY2UvKCgxPDx0KSpzLmV4dGVudCksbj17ZmVhdHVyZXM6W10sbnVtUG9pbnRzOjAsbnVtU2ltcGxpZmllZDowLG51bUZlYXR1cmVzOmUubGVuZ3RoLHNvdXJjZTpudWxsLHg6byx5Omksejp0LHRyYW5zZm9ybWVkOiExLG1pblg6MixtaW5ZOjEsbWF4WDotMSxtYXhZOjB9O2Zvcihjb25zdCB0IG9mIGUpY2Uobix0LHIscyk7cmV0dXJuIG59ZnVuY3Rpb24gY2UoZSx0LG8saSl7Y29uc3Qgcz10Lmdlb21ldHJ5LHI9dC50eXBlLG49W107aWYoZS5taW5YPU1hdGgubWluKGUubWluWCx0Lm1pblgpLGUubWluWT1NYXRoLm1pbihlLm1pblksdC5taW5ZKSxlLm1heFg9TWF0aC5tYXgoZS5tYXhYLHQubWF4WCksZS5tYXhZPU1hdGgubWF4KGUubWF4WSx0Lm1heFkpLFwiUG9pbnRcIj09PXJ8fFwiTXVsdGlQb2ludFwiPT09cilmb3IobGV0IHQ9MDt0PHMubGVuZ3RoO3QrPTMpbi5wdXNoKHNbdF0sc1t0KzFdKSxlLm51bVBvaW50cysrLGUubnVtU2ltcGxpZmllZCsrO2Vsc2UgaWYoXCJMaW5lU3RyaW5nXCI9PT1yKXVlKG4scyxlLG8sITEsITEpO2Vsc2UgaWYoXCJNdWx0aUxpbmVTdHJpbmdcIj09PXJ8fFwiUG9seWdvblwiPT09cilmb3IobGV0IHQ9MDt0PHMubGVuZ3RoO3QrKyl1ZShuLHNbdF0sZSxvLFwiUG9seWdvblwiPT09ciwwPT09dCk7ZWxzZSBpZihcIk11bHRpUG9seWdvblwiPT09cilmb3IobGV0IHQ9MDt0PHMubGVuZ3RoO3QrKyl7Y29uc3QgaT1zW3RdO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKXVlKG4saVt0XSxlLG8sITAsMD09PXQpO31pZihuLmxlbmd0aCl7bGV0IG89dC50YWdzfHxudWxsO2lmKFwiTGluZVN0cmluZ1wiPT09ciYmaS5saW5lTWV0cmljcyl7bz17fTtmb3IoY29uc3QgZSBpbiB0LnRhZ3Mpb1tlXT10LnRhZ3NbZV07by5tYXBib3hfY2xpcF9zdGFydD1zLnN0YXJ0L3Muc2l6ZSxvLm1hcGJveF9jbGlwX2VuZD1zLmVuZC9zLnNpemU7fWNvbnN0IGE9e2dlb21ldHJ5Om4sdHlwZTpcIlBvbHlnb25cIj09PXJ8fFwiTXVsdGlQb2x5Z29uXCI9PT1yPzM6XCJMaW5lU3RyaW5nXCI9PT1yfHxcIk11bHRpTGluZVN0cmluZ1wiPT09cj8yOjEsdGFnczpvfTtudWxsIT09dC5pZCYmKGEuaWQ9dC5pZCksZS5mZWF0dXJlcy5wdXNoKGEpO319ZnVuY3Rpb24gdWUoZSx0LG8saSxzLHIpe2NvbnN0IG49aSppO2lmKGk+MCYmdC5zaXplPChzP246aSkpcmV0dXJuIHZvaWQoby5udW1Qb2ludHMrPXQubGVuZ3RoLzMpO2NvbnN0IGE9W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0zKSgwPT09aXx8dFtlKzJdPm4pJiYoby5udW1TaW1wbGlmaWVkKyssYS5wdXNoKHRbZV0sdFtlKzFdKSksby5udW1Qb2ludHMrKztzJiZmdW5jdGlvbihlLHQpe2xldCBvPTA7Zm9yKGxldCB0PTAsaT1lLmxlbmd0aCxzPWktMjt0PGk7cz10LHQrPTIpbys9KGVbdF0tZVtzXSkqKGVbdCsxXStlW3MrMV0pO2lmKG8+MD09PXQpZm9yKGxldCB0PTAsbz1lLmxlbmd0aDt0PG8vMjt0Kz0yKXtjb25zdCBpPWVbdF0scz1lW3QrMV07ZVt0XT1lW28tMi10XSxlW3QrMV09ZVtvLTEtdF0sZVtvLTItdF09aSxlW28tMS10XT1zO319KGEsciksZS5wdXNoKGEpO31jb25zdCBoZT17bWF4Wm9vbToxNCxpbmRleE1heFpvb206NSxpbmRleE1heFBvaW50czoxZTUsdG9sZXJhbmNlOjMsZXh0ZW50OjQwOTYsYnVmZmVyOjY0LGxpbmVNZXRyaWNzOiExLHByb21vdGVJZDpudWxsLGdlbmVyYXRlSWQ6ITEsZGVidWc6MH07Y2xhc3MgZGV7Y29uc3RydWN0b3IoZSx0KXtjb25zdCBvPSh0PXRoaXMub3B0aW9ucz1mdW5jdGlvbihlLHQpe2Zvcihjb25zdCBvIGluIHQpZVtvXT10W29dO3JldHVybiBlfShPYmplY3QuY3JlYXRlKGhlKSx0KSkuZGVidWc7aWYobyYmY29uc29sZS50aW1lKFwicHJlcHJvY2VzcyBkYXRhXCIpLHQubWF4Wm9vbTwwfHx0Lm1heFpvb20+MjQpdGhyb3cgbmV3IEVycm9yKFwibWF4Wm9vbSBzaG91bGQgYmUgaW4gdGhlIDAtMjQgcmFuZ2VcIik7aWYodC5wcm9tb3RlSWQmJnQuZ2VuZXJhdGVJZCl0aHJvdyBuZXcgRXJyb3IoXCJwcm9tb3RlSWQgYW5kIGdlbmVyYXRlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuXCIpO2xldCBpPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbz1bXTtpZihcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT1lLnR5cGUpZm9yKGxldCBpPTA7aTxlLmZlYXR1cmVzLmxlbmd0aDtpKyspWShvLGUuZmVhdHVyZXNbaV0sdCxpKTtlbHNlIFkobyxcIkZlYXR1cmVcIj09PWUudHlwZT9lOntnZW9tZXRyeTplfSx0KTtyZXR1cm4gb30oZSx0KTt0aGlzLnRpbGVzPXt9LHRoaXMudGlsZUNvb3Jkcz1bXSxvJiYoY29uc29sZS50aW1lRW5kKFwicHJlcHJvY2VzcyBkYXRhXCIpLGNvbnNvbGUubG9nKFwiaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkXCIsdC5pbmRleE1heFpvb20sdC5pbmRleE1heFBvaW50cyksY29uc29sZS50aW1lKFwiZ2VuZXJhdGUgdGlsZXNcIiksdGhpcy5zdGF0cz17fSx0aGlzLnRvdGFsPTApLGk9ZnVuY3Rpb24oZSx0KXtjb25zdCBvPXQuYnVmZmVyL3QuZXh0ZW50O2xldCBpPWU7Y29uc3Qgcz1VKGUsMSwtMS1vLG8sMCwtMSwyLHQpLHI9VShlLDEsMS1vLDIrbywwLC0xLDIsdCk7cmV0dXJuIChzfHxyKSYmKGk9VShlLDEsLW8sMStvLDAsLTEsMix0KXx8W10scyYmKGk9c2UocywxKS5jb25jYXQoaSkpLHImJihpPWkuY29uY2F0KHNlKHIsLTEpKSkpLGl9KGksdCksaS5sZW5ndGgmJnRoaXMuc3BsaXRUaWxlKGksMCwwLDApLG8mJihpLmxlbmd0aCYmY29uc29sZS5sb2coXCJmZWF0dXJlczogJWQsIHBvaW50czogJWRcIix0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKSxjb25zb2xlLnRpbWVFbmQoXCJnZW5lcmF0ZSB0aWxlc1wiKSxjb25zb2xlLmxvZyhcInRpbGVzIGdlbmVyYXRlZDpcIix0aGlzLnRvdGFsLEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKSk7fXNwbGl0VGlsZShlLHQsbyxpLHMscixuKXtjb25zdCBhPVtlLHQsbyxpXSxsPXRoaXMub3B0aW9ucyxjPWwuZGVidWc7Zm9yKDthLmxlbmd0aDspe2k9YS5wb3AoKSxvPWEucG9wKCksdD1hLnBvcCgpLGU9YS5wb3AoKTtjb25zdCB1PTE8PHQsaD1mZSh0LG8saSk7bGV0IGQ9dGhpcy50aWxlc1toXTtpZighZCYmKGM+MSYmY29uc29sZS50aW1lKFwiY3JlYXRpb25cIiksZD10aGlzLnRpbGVzW2hdPWxlKGUsdCxvLGksbCksdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6dCx4Om8seTppfSksYykpe2M+MSYmKGNvbnNvbGUubG9nKFwidGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpXCIsdCxvLGksZC5udW1GZWF0dXJlcyxkLm51bVBvaW50cyxkLm51bVNpbXBsaWZpZWQpLGNvbnNvbGUudGltZUVuZChcImNyZWF0aW9uXCIpKTtjb25zdCBlPWB6JHt0fWA7dGhpcy5zdGF0c1tlXT0odGhpcy5zdGF0c1tlXXx8MCkrMSx0aGlzLnRvdGFsKys7fWlmKGQuc291cmNlPWUsbnVsbD09cyl7aWYodD09PWwuaW5kZXhNYXhab29tfHxkLm51bVBvaW50czw9bC5pbmRleE1heFBvaW50cyljb250aW51ZX1lbHNlIHtpZih0PT09bC5tYXhab29tfHx0PT09cyljb250aW51ZTtpZihudWxsIT1zKXtjb25zdCBlPXMtdDtpZihvIT09cj4+ZXx8aSE9PW4+PmUpY29udGludWV9fWlmKGQuc291cmNlPW51bGwsMD09PWUubGVuZ3RoKWNvbnRpbnVlO2M+MSYmY29uc29sZS50aW1lKFwiY2xpcHBpbmdcIik7Y29uc3QgZj0uNSpsLmJ1ZmZlci9sLmV4dGVudCxnPS41LWYscD0uNStmLG09MStmO2xldCB5PW51bGwsdj1udWxsLHc9bnVsbCx4PW51bGwsYj1VKGUsdSxvLWYsbytwLDAsZC5taW5YLGQubWF4WCxsKSxTPVUoZSx1LG8rZyxvK20sMCxkLm1pblgsZC5tYXhYLGwpO2U9bnVsbCxiJiYoeT1VKGIsdSxpLWYsaStwLDEsZC5taW5ZLGQubWF4WSxsKSx2PVUoYix1LGkrZyxpK20sMSxkLm1pblksZC5tYXhZLGwpLGI9bnVsbCksUyYmKHc9VShTLHUsaS1mLGkrcCwxLGQubWluWSxkLm1heFksbCkseD1VKFMsdSxpK2csaSttLDEsZC5taW5ZLGQubWF4WSxsKSxTPW51bGwpLGM+MSYmY29uc29sZS50aW1lRW5kKFwiY2xpcHBpbmdcIiksYS5wdXNoKHl8fFtdLHQrMSwyKm8sMippKSxhLnB1c2godnx8W10sdCsxLDIqbywyKmkrMSksYS5wdXNoKHd8fFtdLHQrMSwyKm8rMSwyKmkpLGEucHVzaCh4fHxbXSx0KzEsMipvKzEsMippKzEpO319Z2V0VGlsZShlLHQsbyl7ZT0rZSx0PSt0LG89K287Y29uc3QgaT10aGlzLm9wdGlvbnMse2V4dGVudDpzLGRlYnVnOnJ9PWk7aWYoZTwwfHxlPjI0KXJldHVybiBudWxsO2NvbnN0IG49MTw8ZSxhPWZlKGUsdD10K24mbi0xLG8pO2lmKHRoaXMudGlsZXNbYV0pcmV0dXJuIG5lKHRoaXMudGlsZXNbYV0scyk7cj4xJiZjb25zb2xlLmxvZyhcImRyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkXCIsZSx0LG8pO2xldCBsLGM9ZSx1PXQsaD1vO2Zvcig7IWwmJmM+MDspYy0tLHU+Pj0xLGg+Pj0xLGw9dGhpcy50aWxlc1tmZShjLHUsaCldO3JldHVybiBsJiZsLnNvdXJjZT8ocj4xJiYoY29uc29sZS5sb2coXCJmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWRcIixjLHUsaCksY29uc29sZS50aW1lKFwiZHJpbGxpbmcgZG93blwiKSksdGhpcy5zcGxpdFRpbGUobC5zb3VyY2UsYyx1LGgsZSx0LG8pLHI+MSYmY29uc29sZS50aW1lRW5kKFwiZHJpbGxpbmcgZG93blwiKSx0aGlzLnRpbGVzW2FdP25lKHRoaXMudGlsZXNbYV0scyk6bnVsbCk6bnVsbH19ZnVuY3Rpb24gZmUoZSx0LG8pe3JldHVybiAzMiooKDE8PGUpKm8rdCkrZX1mdW5jdGlvbiBnZShlLHQpe3JldHVybiB0P2UucHJvcGVydGllc1t0XTplLmlkfWZ1bmN0aW9uIHBlKGUsdCl7aWYobnVsbD09ZSlyZXR1cm4gITA7aWYoXCJGZWF0dXJlXCI9PT1lLnR5cGUpcmV0dXJuIG51bGwhPWdlKGUsdCk7aWYoXCJGZWF0dXJlQ29sbGVjdGlvblwiPT09ZS50eXBlKXtjb25zdCBvPW5ldyBTZXQ7Zm9yKGNvbnN0IGkgb2YgZS5mZWF0dXJlcyl7Y29uc3QgZT1nZShpLHQpO2lmKG51bGw9PWUpcmV0dXJuICExO2lmKG8uaGFzKGUpKXJldHVybiAhMTtvLmFkZChlKTt9cmV0dXJuICEwfXJldHVybiAhMX1mdW5jdGlvbiBtZShlLHQpe2NvbnN0IG89bmV3IE1hcDtpZihudWxsPT1lKTtlbHNlIGlmKFwiRmVhdHVyZVwiPT09ZS50eXBlKW8uc2V0KGdlKGUsdCksZSk7ZWxzZSBmb3IoY29uc3QgaSBvZiBlLmZlYXR1cmVzKW8uc2V0KGdlKGksdCksaSk7cmV0dXJuIG99Y2xhc3MgeWUgZXh0ZW5kcyBye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9kYXRhVXBkYXRlYWJsZT1uZXcgTWFwO31sb2FkVmVjdG9yVGlsZSh0LG8pe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBvPXQudGlsZUlELmNhbm9uaWNhbDtpZighdGhpcy5fZ2VvSlNPTkluZGV4KXRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBwYXJzZSB0aGUgZGF0YSBpbnRvIGEgY2x1c3RlciBvciBnZW9qc29uXCIpO2NvbnN0IGk9dGhpcy5fZ2VvSlNPTkluZGV4LmdldFRpbGUoby56LG8ueCxvLnkpO2lmKCFpKXJldHVybiBudWxsO2NvbnN0IHM9bmV3IGNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMubGF5ZXJzPXtfZ2VvanNvblRpbGVMYXllcjp0aGlzfSx0aGlzLm5hbWU9XCJfZ2VvanNvblRpbGVMYXllclwiLHRoaXMuZXh0ZW50PWUuWCx0aGlzLmxlbmd0aD10Lmxlbmd0aCx0aGlzLl9mZWF0dXJlcz10O31mZWF0dXJlKHQpe3JldHVybiBuZXcgY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fZmVhdHVyZT10LHRoaXMuZXh0ZW50PWUuWCx0aGlzLnR5cGU9dC50eXBlLHRoaXMucHJvcGVydGllcz10LnRhZ3MsXCJpZFwiaW4gdCYmIWlzTmFOKHQuaWQpJiYodGhpcy5pZD1wYXJzZUludCh0LmlkLDEwKSk7fWxvYWRHZW9tZXRyeSgpe2lmKDE9PT10aGlzLl9mZWF0dXJlLnR5cGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IG8gb2YgdGhpcy5fZmVhdHVyZS5nZW9tZXRyeSl0LnB1c2goW25ldyBlLlAob1swXSxvWzFdKV0pO3JldHVybiB0fXtjb25zdCB0PVtdO2Zvcihjb25zdCBvIG9mIHRoaXMuX2ZlYXR1cmUuZ2VvbWV0cnkpe2NvbnN0IGk9W107Zm9yKGNvbnN0IHQgb2YgbylpLnB1c2gobmV3IGUuUCh0WzBdLHRbMV0pKTt0LnB1c2goaSk7fXJldHVybiB0fX10b0dlb0pTT04oZSx0LG8pe3JldHVybiB1LmNhbGwodGhpcyxlLHQsbyl9fSh0aGlzLl9mZWF0dXJlc1t0XSl9fShpLmZlYXR1cmVzKTtsZXQgcj1rKHMpO3JldHVybiAwPT09ci5ieXRlT2Zmc2V0JiZyLmJ5dGVMZW5ndGg9PT1yLmJ1ZmZlci5ieXRlTGVuZ3RofHwocj1uZXcgVWludDhBcnJheShyKSkse3ZlY3RvclRpbGU6cyxyYXdEYXRhOnIuYnVmZmVyfX0pKX1sb2FkRGF0YSh0KXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIG87bnVsbD09PShvPXRoaXMuX3BlbmRpbmdSZXF1ZXN0KXx8dm9pZCAwPT09b3x8by5hYm9ydCgpO2NvbnN0IGk9ISEodCYmdC5yZXF1ZXN0JiZ0LnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nKSYmbmV3IGUuYnYodC5yZXF1ZXN0KTt0aGlzLl9wZW5kaW5nUmVxdWVzdD1uZXcgQWJvcnRDb250cm9sbGVyO3RyeXt0aGlzLl9wZW5kaW5nRGF0YT10aGlzLmxvYWRBbmRQcm9jZXNzR2VvSlNPTih0LHRoaXMuX3BlbmRpbmdSZXF1ZXN0KSx0aGlzLl9nZW9KU09OSW5kZXg9dC5jbHVzdGVyP25ldyB6KGZ1bmN0aW9uKHtzdXBlcmNsdXN0ZXJPcHRpb25zOnQsY2x1c3RlclByb3BlcnRpZXM6b30pe2lmKCFvfHwhdClyZXR1cm4gdDtjb25zdCBpPXt9LHM9e30scj17YWNjdW11bGF0ZWQ6bnVsbCx6b29tOjB9LG49e3Byb3BlcnRpZXM6bnVsbH0sYT1PYmplY3Qua2V5cyhvKTtmb3IoY29uc3QgdCBvZiBhKXtjb25zdFtyLG5dPW9bdF0sYT1lLmJDKG4pLGw9ZS5iQyhcInN0cmluZ1wiPT10eXBlb2Ygcj9bcixbXCJhY2N1bXVsYXRlZFwiXSxbXCJnZXRcIix0XV06cik7aVt0XT1hLnZhbHVlLHNbdF09bC52YWx1ZTt9cmV0dXJuIHQubWFwPWU9PntuLnByb3BlcnRpZXM9ZTtjb25zdCB0PXt9O2Zvcihjb25zdCBlIG9mIGEpdFtlXT1pW2VdLmV2YWx1YXRlKHIsbik7cmV0dXJuIHR9LHQucmVkdWNlPShlLHQpPT57bi5wcm9wZXJ0aWVzPXQ7Zm9yKGNvbnN0IHQgb2YgYSlyLmFjY3VtdWxhdGVkPWVbdF0sZVt0XT1zW3RdLmV2YWx1YXRlKHIsbik7fSx0fSh0KSkubG9hZCgoeWllbGQgdGhpcy5fcGVuZGluZ0RhdGEpLmZlYXR1cmVzKToocz15aWVsZCB0aGlzLl9wZW5kaW5nRGF0YSxuZXcgZGUocyx0Lmdlb2pzb25WdE9wdGlvbnMpKSx0aGlzLmxvYWRlZD17fTtjb25zdCBvPXt9O2lmKGkpe2NvbnN0IGU9aS5maW5pc2goKTtlJiYoby5yZXNvdXJjZVRpbWluZz17fSxvLnJlc291cmNlVGltaW5nW3Quc291cmNlXT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKSk7fXJldHVybiBvfWNhdGNoKHQpe2lmKGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdCxlLmJCKHQpKXJldHVybiB7YWJhbmRvbmVkOiEwfTt0aHJvdyB0fXZhciBzO30pKX1nZXREYXRhKCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9wZW5kaW5nRGF0YX0pKX1yZWxvYWRUaWxlKGUpe2NvbnN0IHQ9dGhpcy5sb2FkZWQ7cmV0dXJuIHQmJnRbZS51aWRdP3N1cGVyLnJlbG9hZFRpbGUoZSk6dGhpcy5sb2FkVGlsZShlKX1sb2FkQW5kUHJvY2Vzc0dlb0pTT04odCxvKXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IGk9eWllbGQgdGhpcy5sb2FkR2VvSlNPTih0LG8pO2lmKGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdCxcIm9iamVjdFwiIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoYElucHV0IGRhdGEgZ2l2ZW4gdG8gJyR7dC5zb3VyY2V9JyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5gKTtpZihjKGksITApLHQuZmlsdGVyKXtjb25zdCBvPWUuYkModC5maWx0ZXIse3R5cGU6XCJib29sZWFuXCIsXCJwcm9wZXJ0eS10eXBlXCI6XCJkYXRhLWRyaXZlblwiLG92ZXJyaWRhYmxlOiExLHRyYW5zaXRpb246ITF9KTtpZihcImVycm9yXCI9PT1vLnJlc3VsdCl0aHJvdyBuZXcgRXJyb3Ioby52YWx1ZS5tYXAoKGU9PmAke2Uua2V5fTogJHtlLm1lc3NhZ2V9YCkpLmpvaW4oXCIsIFwiKSk7Y29uc3Qgcz1pLmZlYXR1cmVzLmZpbHRlcigoZT0+by52YWx1ZS5ldmFsdWF0ZSh7em9vbTowfSxlKSkpO2k9e3R5cGU6XCJGZWF0dXJlQ29sbGVjdGlvblwiLGZlYXR1cmVzOnN9O31yZXR1cm4gaX0pKX1sb2FkR2VvSlNPTih0LG8pe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdHtwcm9tb3RlSWQ6aX09dDtpZih0LnJlcXVlc3Qpe2NvbnN0IHM9eWllbGQgZS5oKHQucmVxdWVzdCxvKTtyZXR1cm4gdGhpcy5fZGF0YVVwZGF0ZWFibGU9cGUocy5kYXRhLGkpP21lKHMuZGF0YSxpKTp2b2lkIDAscy5kYXRhfWlmKFwic3RyaW5nXCI9PXR5cGVvZiB0LmRhdGEpdHJ5e2NvbnN0IGU9SlNPTi5wYXJzZSh0LmRhdGEpO3JldHVybiB0aGlzLl9kYXRhVXBkYXRlYWJsZT1wZShlLGkpP21lKGUsaSk6dm9pZCAwLGV9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKGBJbnB1dCBkYXRhIGdpdmVuIHRvICcke3Quc291cmNlfScgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuYCl9aWYoIXQuZGF0YURpZmYpdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBkYXRhIGdpdmVuIHRvICcke3Quc291cmNlfScgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuYCk7aWYoIXRoaXMuX2RhdGFVcGRhdGVhYmxlKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVwZGF0ZSBleGlzdGluZyBnZW9qc29uIGRhdGEgaW4gJHt0LnNvdXJjZX1gKTtyZXR1cm4gZnVuY3Rpb24oZSx0LG8pe3ZhciBpLHMscixuO2lmKHQucmVtb3ZlQWxsJiZlLmNsZWFyKCksdC5yZW1vdmUpZm9yKGNvbnN0IG8gb2YgdC5yZW1vdmUpZS5kZWxldGUobyk7aWYodC5hZGQpZm9yKGNvbnN0IGkgb2YgdC5hZGQpe2NvbnN0IHQ9Z2UoaSxvKTtudWxsIT10JiZlLnNldCh0LGkpO31pZih0LnVwZGF0ZSlmb3IoY29uc3QgbyBvZiB0LnVwZGF0ZSl7bGV0IHQ9ZS5nZXQoby5pZCk7aWYobnVsbD09dCljb250aW51ZTtjb25zdCBhPSFvLnJlbW92ZUFsbFByb3BlcnRpZXMmJigobnVsbD09PShpPW8ucmVtb3ZlUHJvcGVydGllcyl8fHZvaWQgMD09PWk/dm9pZCAwOmkubGVuZ3RoKT4wfHwobnVsbD09PShzPW8uYWRkT3JVcGRhdGVQcm9wZXJ0aWVzKXx8dm9pZCAwPT09cz92b2lkIDA6cy5sZW5ndGgpPjApO2lmKChvLm5ld0dlb21ldHJ5fHxvLnJlbW92ZUFsbFByb3BlcnRpZXN8fGEpJiYodD1PYmplY3QuYXNzaWduKHt9LHQpLGUuc2V0KG8uaWQsdCksYSYmKHQucHJvcGVydGllcz1PYmplY3QuYXNzaWduKHt9LHQucHJvcGVydGllcykpKSxvLm5ld0dlb21ldHJ5JiYodC5nZW9tZXRyeT1vLm5ld0dlb21ldHJ5KSxvLnJlbW92ZUFsbFByb3BlcnRpZXMpdC5wcm9wZXJ0aWVzPXt9O2Vsc2UgaWYoKG51bGw9PT0ocj1vLnJlbW92ZVByb3BlcnRpZXMpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmxlbmd0aCk+MClmb3IoY29uc3QgZSBvZiBvLnJlbW92ZVByb3BlcnRpZXMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQucHJvcGVydGllcyxlKSYmZGVsZXRlIHQucHJvcGVydGllc1tlXTtpZigobnVsbD09PShuPW8uYWRkT3JVcGRhdGVQcm9wZXJ0aWVzKXx8dm9pZCAwPT09bj92b2lkIDA6bi5sZW5ndGgpPjApZm9yKGNvbnN0e2tleTplLHZhbHVlOml9b2Ygby5hZGRPclVwZGF0ZVByb3BlcnRpZXMpdC5wcm9wZXJ0aWVzW2VdPWk7fX0odGhpcy5fZGF0YVVwZGF0ZWFibGUsdC5kYXRhRGlmZixpKSx7dHlwZTpcIkZlYXR1cmVDb2xsZWN0aW9uXCIsZmVhdHVyZXM6QXJyYXkuZnJvbSh0aGlzLl9kYXRhVXBkYXRlYWJsZS52YWx1ZXMoKSl9fSkpfXJlbW92ZVNvdXJjZSh0KXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5fcGVuZGluZ1JlcXVlc3QmJnRoaXMuX3BlbmRpbmdSZXF1ZXN0LmFib3J0KCk7fSkpfWdldENsdXN0ZXJFeHBhbnNpb25ab29tKGUpe3JldHVybiB0aGlzLl9nZW9KU09OSW5kZXguZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oZS5jbHVzdGVySWQpfWdldENsdXN0ZXJDaGlsZHJlbihlKXtyZXR1cm4gdGhpcy5fZ2VvSlNPTkluZGV4LmdldENoaWxkcmVuKGUuY2x1c3RlcklkKX1nZXRDbHVzdGVyTGVhdmVzKGUpe3JldHVybiB0aGlzLl9nZW9KU09OSW5kZXguZ2V0TGVhdmVzKGUuY2x1c3RlcklkLGUubGltaXQsZS5vZmZzZXQpfX1jbGFzcyB2ZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnNlbGY9dCx0aGlzLmFjdG9yPW5ldyBlLkYodCksdGhpcy5sYXllckluZGV4ZXM9e30sdGhpcy5hdmFpbGFibGVJbWFnZXM9e30sdGhpcy53b3JrZXJTb3VyY2VzPXt9LHRoaXMuZGVtV29ya2VyU291cmNlcz17fSx0aGlzLmV4dGVybmFsV29ya2VyU291cmNlVHlwZXM9e30sdGhpcy5zZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlPShlLHQpPT57aWYodGhpcy5leHRlcm5hbFdvcmtlclNvdXJjZVR5cGVzW2VdKXRocm93IG5ldyBFcnJvcihgV29ya2VyIHNvdXJjZSB3aXRoIG5hbWUgXCIke2V9XCIgYWxyZWFkeSByZWdpc3RlcmVkLmApO3RoaXMuZXh0ZXJuYWxXb3JrZXJTb3VyY2VUeXBlc1tlXT10O30sdGhpcy5zZWxmLmFkZFByb3RvY29sPWUuYmksdGhpcy5zZWxmLnJlbW92ZVByb3RvY29sPWUuYmosdGhpcy5zZWxmLnJlZ2lzdGVyUlRMVGV4dFBsdWdpbj10PT57aWYoZS5iRC5pc1BhcnNlZCgpKXRocm93IG5ldyBFcnJvcihcIlJUTCB0ZXh0IHBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQuXCIpO2UuYkQuc2V0TWV0aG9kcyh0KTt9LHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihcIkxEVFwiLCgoZSx0KT0+dGhpcy5fZ2V0REVNV29ya2VyU291cmNlKGUsdC5zb3VyY2UpLmxvYWRUaWxlKHQpKSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiUkRUXCIsKCh0LG8pPT5lLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9nZXRERU1Xb3JrZXJTb3VyY2UodCxvLnNvdXJjZSkucmVtb3ZlVGlsZShvKTt9KSkpKSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoXCJHQ0VaXCIsKCh0LG8pPT5lLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fZ2V0V29ya2VyU291cmNlKHQsby50eXBlLG8uc291cmNlKS5nZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShvKX0pKSkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihcIkdDQ1wiLCgodCxvKT0+ZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2dldFdvcmtlclNvdXJjZSh0LG8udHlwZSxvLnNvdXJjZSkuZ2V0Q2x1c3RlckNoaWxkcmVuKG8pfSkpKSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiR0NMXCIsKCh0LG8pPT5lLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fZ2V0V29ya2VyU291cmNlKHQsby50eXBlLG8uc291cmNlKS5nZXRDbHVzdGVyTGVhdmVzKG8pfSkpKSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiTERcIiwoKGUsdCk9PnRoaXMuX2dldFdvcmtlclNvdXJjZShlLHQudHlwZSx0LnNvdXJjZSkubG9hZERhdGEodCkpKSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoXCJHRFwiLCgoZSx0KT0+dGhpcy5fZ2V0V29ya2VyU291cmNlKGUsdC50eXBlLHQuc291cmNlKS5nZXREYXRhKCkpKSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoXCJMVFwiLCgoZSx0KT0+dGhpcy5fZ2V0V29ya2VyU291cmNlKGUsdC50eXBlLHQuc291cmNlKS5sb2FkVGlsZSh0KSkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihcIlJUXCIsKChlLHQpPT50aGlzLl9nZXRXb3JrZXJTb3VyY2UoZSx0LnR5cGUsdC5zb3VyY2UpLnJlbG9hZFRpbGUodCkpKSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoXCJBVFwiLCgoZSx0KT0+dGhpcy5fZ2V0V29ya2VyU291cmNlKGUsdC50eXBlLHQuc291cmNlKS5hYm9ydFRpbGUodCkpKSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoXCJSTVRcIiwoKGUsdCk9PnRoaXMuX2dldFdvcmtlclNvdXJjZShlLHQudHlwZSx0LnNvdXJjZSkucmVtb3ZlVGlsZSh0KSkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihcIlJTXCIsKCh0LG8pPT5lLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZighdGhpcy53b3JrZXJTb3VyY2VzW3RdfHwhdGhpcy53b3JrZXJTb3VyY2VzW3RdW28udHlwZV18fCF0aGlzLndvcmtlclNvdXJjZXNbdF1bby50eXBlXVtvLnNvdXJjZV0pcmV0dXJuO2NvbnN0IGU9dGhpcy53b3JrZXJTb3VyY2VzW3RdW28udHlwZV1bby5zb3VyY2VdO2RlbGV0ZSB0aGlzLndvcmtlclNvdXJjZXNbdF1bby50eXBlXVtvLnNvdXJjZV0sdm9pZCAwIT09ZS5yZW1vdmVTb3VyY2UmJmUucmVtb3ZlU291cmNlKG8pO30pKSkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihcIlJNXCIsKHQ9PmUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2RlbGV0ZSB0aGlzLmxheWVySW5kZXhlc1t0XSxkZWxldGUgdGhpcy5hdmFpbGFibGVJbWFnZXNbdF0sZGVsZXRlIHRoaXMud29ya2VyU291cmNlc1t0XSxkZWxldGUgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW3RdO30pKSkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihcIlNSXCIsKCh0LG8pPT5lLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnJlZmVycmVyPW87fSkpKSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiU1JQU1wiLCgoZSx0KT0+dGhpcy5fc3luY1JUTFBsdWdpblN0YXRlKGUsdCkpKSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoXCJJU1wiLCgodCxvKT0+ZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZWxmLmltcG9ydFNjcmlwdHMobyk7fSkpKSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiU0lcIiwoKGUsdCk9PnRoaXMuX3NldEltYWdlcyhlLHQpKSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiVUxcIiwoKHQsbyk9PmUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2dldExheWVySW5kZXgodCkudXBkYXRlKG8ubGF5ZXJzLG8ucmVtb3ZlZElkcyk7fSkpKSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiU0xcIiwoKHQsbyk9PmUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2dldExheWVySW5kZXgodCkucmVwbGFjZShvKTt9KSkpKTt9X3NldEltYWdlcyh0LG8pe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLmF2YWlsYWJsZUltYWdlc1t0XT1vO2Zvcihjb25zdCBlIGluIHRoaXMud29ya2VyU291cmNlc1t0XSl7Y29uc3QgaT10aGlzLndvcmtlclNvdXJjZXNbdF1bZV07Zm9yKGNvbnN0IGUgaW4gaSlpW2VdLmF2YWlsYWJsZUltYWdlcz1vO319KSl9X3N5bmNSVExQbHVnaW5TdGF0ZSh0LG8pe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZihlLmJELmlzUGFyc2VkKCkpcmV0dXJuIGUuYkQuZ2V0U3RhdGUoKTtpZihcImxvYWRpbmdcIiE9PW8ucGx1Z2luU3RhdHVzKXJldHVybiBlLmJELnNldFN0YXRlKG8pLG87Y29uc3QgdD1vLnBsdWdpblVSTDtpZih0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyh0KSxlLmJELmlzUGFyc2VkKCkpe2NvbnN0IG89e3BsdWdpblN0YXR1czpcImxvYWRlZFwiLHBsdWdpblVSTDp0fTtyZXR1cm4gZS5iRC5zZXRTdGF0ZShvKSxvfXRocm93IGUuYkQuc2V0U3RhdGUoe3BsdWdpblN0YXR1czpcImVycm9yXCIscGx1Z2luVVJMOlwiXCJ9KSxuZXcgRXJyb3IoYFJUTCBUZXh0IFBsdWdpbiBmYWlsZWQgdG8gaW1wb3J0IHNjcmlwdHMgZnJvbSAke3R9YCl9KSl9X2dldEF2YWlsYWJsZUltYWdlcyhlKXtsZXQgdD10aGlzLmF2YWlsYWJsZUltYWdlc1tlXTtyZXR1cm4gdHx8KHQ9W10pLHR9X2dldExheWVySW5kZXgoZSl7bGV0IG89dGhpcy5sYXllckluZGV4ZXNbZV07cmV0dXJuIG98fChvPXRoaXMubGF5ZXJJbmRleGVzW2VdPW5ldyB0KSxvfV9nZXRXb3JrZXJTb3VyY2UoZSx0LG8pe2lmKHRoaXMud29ya2VyU291cmNlc1tlXXx8KHRoaXMud29ya2VyU291cmNlc1tlXT17fSksdGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdfHwodGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdPXt9KSwhdGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdW29dKXtjb25zdCBpPXtzZW5kQXN5bmM6KHQsbyk9Pih0LnRhcmdldE1hcElkPWUsdGhpcy5hY3Rvci5zZW5kQXN5bmModCxvKSl9O3N3aXRjaCh0KXtjYXNlXCJ2ZWN0b3JcIjp0aGlzLndvcmtlclNvdXJjZXNbZV1bdF1bb109bmV3IHIoaSx0aGlzLl9nZXRMYXllckluZGV4KGUpLHRoaXMuX2dldEF2YWlsYWJsZUltYWdlcyhlKSk7YnJlYWs7Y2FzZVwiZ2VvanNvblwiOnRoaXMud29ya2VyU291cmNlc1tlXVt0XVtvXT1uZXcgeWUoaSx0aGlzLl9nZXRMYXllckluZGV4KGUpLHRoaXMuX2dldEF2YWlsYWJsZUltYWdlcyhlKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLndvcmtlclNvdXJjZXNbZV1bdF1bb109bmV3IHRoaXMuZXh0ZXJuYWxXb3JrZXJTb3VyY2VUeXBlc1t0XShpLHRoaXMuX2dldExheWVySW5kZXgoZSksdGhpcy5fZ2V0QXZhaWxhYmxlSW1hZ2VzKGUpKTt9fXJldHVybiB0aGlzLndvcmtlclNvdXJjZXNbZV1bdF1bb119X2dldERFTVdvcmtlclNvdXJjZShlLHQpe3JldHVybiB0aGlzLmRlbVdvcmtlclNvdXJjZXNbZV18fCh0aGlzLmRlbVdvcmtlclNvdXJjZXNbZV09e30pLHRoaXMuZGVtV29ya2VyU291cmNlc1tlXVt0XXx8KHRoaXMuZGVtV29ya2VyU291cmNlc1tlXVt0XT1uZXcgbiksdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW2VdW3RdfX1yZXR1cm4gZS5pKHNlbGYpJiYoc2VsZi53b3JrZXI9bmV3IHZlKHNlbGYpKSx2ZX0pKTtcblxuZGVmaW5lKFwiaW5kZXhcIixbXCJleHBvcnRzXCIsXCIuL3NoYXJlZFwiXSwoZnVuY3Rpb24odCxlKXtcInVzZSBzdHJpY3RcIjt2YXIgaT1cIjQuNy4xXCI7bGV0IGEscztjb25zdCBvPXtub3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdy5iaW5kKHBlcmZvcm1hbmNlKTpEYXRlLm5vdy5iaW5kKERhdGUpLGZyYW1lQXN5bmM6dD0+bmV3IFByb21pc2UoKChpLGEpPT57Y29uc3Qgcz1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSk7dC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsKCgpPT57Y2FuY2VsQW5pbWF0aW9uRnJhbWUocyksYShlLmMoKSk7fSkpO30pKSxnZXRJbWFnZURhdGEodCxlPTApe3JldHVybiB0aGlzLmdldEltYWdlQ2FudmFzQ29udGV4dCh0KS5nZXRJbWFnZURhdGEoLWUsLWUsdC53aWR0aCsyKmUsdC5oZWlnaHQrMiplKX0sZ2V0SW1hZ2VDYW52YXNDb250ZXh0KHQpe2NvbnN0IGU9d2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksaT1lLmdldENvbnRleHQoXCIyZFwiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KTtpZighaSl0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gY3JlYXRlIGNhbnZhcyAyZCBjb250ZXh0XCIpO3JldHVybiBlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQsaS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksaX0scmVzb2x2ZVVSTDp0PT4oYXx8KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIikpLGEuaHJlZj10LGEuaHJlZiksaGFyZHdhcmVDb25jdXJyZW5jeTpcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeXx8NCxnZXQgcHJlZmVyc1JlZHVjZWRNb3Rpb24oKXtyZXR1cm4gISFtYXRjaE1lZGlhJiYobnVsbD09cyYmKHM9bWF0Y2hNZWRpYShcIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpXCIpKSxzLm1hdGNoZXMpfX07Y2xhc3MgcntzdGF0aWMgdGVzdFByb3AodCl7aWYoIXIuZG9jU3R5bGUpcmV0dXJuIHRbMF07Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXWluIHIuZG9jU3R5bGUpcmV0dXJuIHRbZV07cmV0dXJuIHRbMF19c3RhdGljIGNyZWF0ZSh0LGUsaSl7Y29uc3QgYT13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KTtyZXR1cm4gdm9pZCAwIT09ZSYmKGEuY2xhc3NOYW1lPWUpLGkmJmkuYXBwZW5kQ2hpbGQoYSksYX1zdGF0aWMgY3JlYXRlTlModCxlKXtyZXR1cm4gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LGUpfXN0YXRpYyBkaXNhYmxlRHJhZygpe3IuZG9jU3R5bGUmJnIuc2VsZWN0UHJvcCYmKHIudXNlclNlbGVjdD1yLmRvY1N0eWxlW3Iuc2VsZWN0UHJvcF0sci5kb2NTdHlsZVtyLnNlbGVjdFByb3BdPVwibm9uZVwiKTt9c3RhdGljIGVuYWJsZURyYWcoKXtyLmRvY1N0eWxlJiZyLnNlbGVjdFByb3AmJihyLmRvY1N0eWxlW3Iuc2VsZWN0UHJvcF09ci51c2VyU2VsZWN0KTt9c3RhdGljIHNldFRyYW5zZm9ybSh0LGUpe3Quc3R5bGVbci50cmFuc2Zvcm1Qcm9wXT1lO31zdGF0aWMgYWRkRXZlbnRMaXN0ZW5lcih0LGUsaSxhPXt9KXt0LmFkZEV2ZW50TGlzdGVuZXIoZSxpLFwicGFzc2l2ZVwiaW4gYT9hOmEuY2FwdHVyZSk7fXN0YXRpYyByZW1vdmVFdmVudExpc3RlbmVyKHQsZSxpLGE9e30pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGksXCJwYXNzaXZlXCJpbiBhP2E6YS5jYXB0dXJlKTt9c3RhdGljIHN1cHByZXNzQ2xpY2tJbnRlcm5hbCh0KXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsci5zdXBwcmVzc0NsaWNrSW50ZXJuYWwsITApO31zdGF0aWMgc3VwcHJlc3NDbGljaygpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIixyLnN1cHByZXNzQ2xpY2tJbnRlcm5hbCwhMCksd2luZG93LnNldFRpbWVvdXQoKCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHIuc3VwcHJlc3NDbGlja0ludGVybmFsLCEwKTt9KSwwKTt9c3RhdGljIGdldFNjYWxlKHQpe2NvbnN0IGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4ge3g6ZS53aWR0aC90Lm9mZnNldFdpZHRofHwxLHk6ZS5oZWlnaHQvdC5vZmZzZXRIZWlnaHR8fDEsYm91bmRpbmdDbGllbnRSZWN0OmV9fXN0YXRpYyBnZXRQb2ludCh0LGksYSl7Y29uc3Qgcz1pLmJvdW5kaW5nQ2xpZW50UmVjdDtyZXR1cm4gbmV3IGUuUCgoYS5jbGllbnRYLXMubGVmdCkvaS54LXQuY2xpZW50TGVmdCwoYS5jbGllbnRZLXMudG9wKS9pLnktdC5jbGllbnRUb3ApfXN0YXRpYyBtb3VzZVBvcyh0LGUpe2NvbnN0IGk9ci5nZXRTY2FsZSh0KTtyZXR1cm4gci5nZXRQb2ludCh0LGksZSl9c3RhdGljIHRvdWNoUG9zKHQsZSl7Y29uc3QgaT1bXSxhPXIuZ2V0U2NhbGUodCk7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspaS5wdXNoKHIuZ2V0UG9pbnQodCxhLGVbc10pKTtyZXR1cm4gaX1zdGF0aWMgbW91c2VCdXR0b24odCl7cmV0dXJuIHQuYnV0dG9ufXN0YXRpYyByZW1vdmUodCl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCk7fX1yLmRvY1N0eWxlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5kb2N1bWVudCYmd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxyLnNlbGVjdFByb3A9ci50ZXN0UHJvcChbXCJ1c2VyU2VsZWN0XCIsXCJNb3pVc2VyU2VsZWN0XCIsXCJXZWJraXRVc2VyU2VsZWN0XCIsXCJtc1VzZXJTZWxlY3RcIl0pLHIudHJhbnNmb3JtUHJvcD1yLnRlc3RQcm9wKFtcInRyYW5zZm9ybVwiLFwiV2Via2l0VHJhbnNmb3JtXCJdKTtjb25zdCBuPXtzdXBwb3J0ZWQ6ITEsdGVzdFN1cHBvcnQ6ZnVuY3Rpb24odCl7IWMmJmgmJih1P2QodCk6bD10KTt9fTtsZXQgbCxoLGM9ITEsdT0hMTtmdW5jdGlvbiBkKHQpe2NvbnN0IGU9dC5jcmVhdGVUZXh0dXJlKCk7dC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsZSk7dHJ5e2lmKHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCx0LlJHQkEsdC5SR0JBLHQuVU5TSUdORURfQllURSxoKSx0LmlzQ29udGV4dExvc3QoKSlyZXR1cm47bi5zdXBwb3J0ZWQ9ITA7fWNhdGNoKHQpe310LmRlbGV0ZVRleHR1cmUoZSksYz0hMDt9dmFyIF87XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50JiYoaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLGgub25sb2FkPSgpPT57bCYmZChsKSxsPW51bGwsdT0hMDt9LGgub25lcnJvcj0oKT0+e2M9ITAsbD1udWxsO30saC5zcmM9XCJkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSaDRBQUFCWFJVSlFWbEE0VEJFQUFBQXZBUUFBQUFmUS8vNzN2LytCaU9oL0FBQT1cIiksZnVuY3Rpb24odCl7bGV0IGksYSxzLG87dC5yZXNldFJlcXVlc3RRdWV1ZT0oKT0+e2k9W10sYT0wLHM9MCxvPXt9O30sdC5hZGRUaHJvdHRsZUNvbnRyb2w9dD0+e2NvbnN0IGU9cysrO3JldHVybiBvW2VdPXQsZX0sdC5yZW1vdmVUaHJvdHRsZUNvbnRyb2w9dD0+e2RlbGV0ZSBvW3RdLGwoKTt9LHQuZ2V0SW1hZ2U9KHQsYSxzPSEwKT0+bmV3IFByb21pc2UoKChvLHIpPT57bi5zdXBwb3J0ZWQmJih0LmhlYWRlcnN8fCh0LmhlYWRlcnM9e30pLHQuaGVhZGVycy5hY2NlcHQ9XCJpbWFnZS93ZWJwLCovKlwiKSxlLmUodCx7dHlwZTpcImltYWdlXCJ9KSxpLnB1c2goe2Fib3J0Q29udHJvbGxlcjphLHJlcXVlc3RQYXJhbWV0ZXJzOnQsc3VwcG9ydEltYWdlUmVmcmVzaDpzLHN0YXRlOlwicXVldWVkXCIsb25FcnJvcjp0PT57cih0KTt9LG9uU3VjY2Vzczp0PT57byh0KTt9fSksbCgpO30pKTtjb25zdCByPXQ9PmUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3Quc3RhdGU9XCJydW5uaW5nXCI7Y29uc3R7cmVxdWVzdFBhcmFtZXRlcnM6aSxzdXBwb3J0SW1hZ2VSZWZyZXNoOnMsb25FcnJvcjpvLG9uU3VjY2VzczpyLGFib3J0Q29udHJvbGxlcjpufT10LGM9ITE9PT1zJiYhZS5pKHNlbGYpJiYhZS5nKGkudXJsKSYmKCFpLmhlYWRlcnN8fE9iamVjdC5rZXlzKGkuaGVhZGVycykucmVkdWNlKCgodCxlKT0+dCYmXCJhY2NlcHRcIj09PWUpLCEwKSk7YSsrO2NvbnN0IHU9Yz9oKGksbik6ZS5tKGksbik7dHJ5e2NvbnN0IGk9eWllbGQgdTtkZWxldGUgdC5hYm9ydENvbnRyb2xsZXIsdC5zdGF0ZT1cImNvbXBsZXRlZFwiLGkuZGF0YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fGUuYihpLmRhdGEpP3IoaSk6aS5kYXRhJiZyKHtkYXRhOnlpZWxkKGQ9aS5kYXRhLFwiZnVuY3Rpb25cIj09dHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwP2UuZChkKTplLmYoZCkpLGNhY2hlQ29udHJvbDppLmNhY2hlQ29udHJvbCxleHBpcmVzOmkuZXhwaXJlc30pO31jYXRjaChlKXtkZWxldGUgdC5hYm9ydENvbnRyb2xsZXIsbyhlKTt9ZmluYWxseXthLS0sbCgpO312YXIgZDt9KSksbD0oKT0+e2NvbnN0IHQ9KCgpPT57Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMobykpaWYob1t0XSgpKXJldHVybiAhMDtyZXR1cm4gITF9KSgpP2UuYS5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFNfUEVSX0ZSQU1FOmUuYS5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM7Zm9yKGxldCBlPWE7ZTx0JiZpLmxlbmd0aD4wO2UrKyl7Y29uc3QgdD1pLnNoaWZ0KCk7dC5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQ/ZS0tOnIodCk7fX0saD0odCxpKT0+bmV3IFByb21pc2UoKChhLHMpPT57Y29uc3Qgbz1uZXcgSW1hZ2Uscj10LnVybCxuPXQuY3JlZGVudGlhbHM7biYmXCJpbmNsdWRlXCI9PT1uP28uY3Jvc3NPcmlnaW49XCJ1c2UtY3JlZGVudGlhbHNcIjoobiYmXCJzYW1lLW9yaWdpblwiPT09bnx8IWUucyhyKSkmJihvLmNyb3NzT3JpZ2luPVwiYW5vbnltb3VzXCIpLGkuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCgoKT0+e28uc3JjPVwiXCIscyhlLmMoKSk7fSkpLG8uZmV0Y2hQcmlvcml0eT1cImhpZ2hcIixvLm9ubG9hZD0oKT0+e28ub25lcnJvcj1vLm9ubG9hZD1udWxsLGEoe2RhdGE6b30pO30sby5vbmVycm9yPSgpPT57by5vbmVycm9yPW8ub25sb2FkPW51bGwsaS5zaWduYWwuYWJvcnRlZHx8cyhuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBpbWFnZS4gUGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgYSBzdXBwb3J0ZWQgaW1hZ2UgdHlwZSBzdWNoIGFzIFBORyBvciBKUEVHLiBOb3RlIHRoYXQgU1ZHcyBhcmUgbm90IHN1cHBvcnRlZC5cIikpO30sby5zcmM9cjt9KSk7fShffHwoXz17fSkpLF8ucmVzZXRSZXF1ZXN0UXVldWUoKTtjbGFzcyBwe2NvbnN0cnVjdG9yKHQpe3RoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbj10O310cmFuc2Zvcm1SZXF1ZXN0KHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbiYmdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKHQsZSl8fHt1cmw6dH19c2V0VHJhbnNmb3JtUmVxdWVzdCh0KXt0aGlzLl90cmFuc2Zvcm1SZXF1ZXN0Rm49dDt9fWZ1bmN0aW9uIG0odCl7dmFyIGk9bmV3IGUuQSgzKTtyZXR1cm4gaVswXT10WzBdLGlbMV09dFsxXSxpWzJdPXRbMl0saX12YXIgZixnPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFswXT1lWzBdLWlbMF0sdFsxXT1lWzFdLWlbMV0sdFsyXT1lWzJdLWlbMl0sdH07Zj1uZXcgZS5BKDMpLGUuQSE9RmxvYXQzMkFycmF5JiYoZlswXT0wLGZbMV09MCxmWzJdPTApO3ZhciB2PWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0saT10WzFdO3JldHVybiBlKmUraSppfTtmdW5jdGlvbiB4KHQpe2NvbnN0IGU9W107aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpZS5wdXNoKHtpZDpcImRlZmF1bHRcIix1cmw6dH0pO2Vsc2UgaWYodCYmdC5sZW5ndGg+MCl7Y29uc3QgaT1bXTtmb3IoY29uc3R7aWQ6YSx1cmw6c31vZiB0KXtjb25zdCB0PWAke2F9JHtzfWA7LTE9PT1pLmluZGV4T2YodCkmJihpLnB1c2godCksZS5wdXNoKHtpZDphLHVybDpzfSkpO319cmV0dXJuIGV9ZnVuY3Rpb24geSh0LGUsaSl7Y29uc3QgYT10LnNwbGl0KFwiP1wiKTtyZXR1cm4gYVswXSs9YCR7ZX0ke2l9YCxhLmpvaW4oXCI/XCIpfSFmdW5jdGlvbigpe3ZhciB0PW5ldyBlLkEoMik7ZS5BIT1GbG9hdDMyQXJyYXkmJih0WzBdPTAsdFsxXT0wKTt9KCk7Y2xhc3MgYntjb25zdHJ1Y3Rvcih0LGUsaSxhKXt0aGlzLmNvbnRleHQ9dCx0aGlzLmZvcm1hdD1pLHRoaXMudGV4dHVyZT10LmdsLmNyZWF0ZVRleHR1cmUoKSx0aGlzLnVwZGF0ZShlLGEpO311cGRhdGUodCxpLGEpe2NvbnN0e3dpZHRoOnMsaGVpZ2h0Om99PXQscj0hKHRoaXMuc2l6ZSYmdGhpcy5zaXplWzBdPT09cyYmdGhpcy5zaXplWzFdPT09b3x8YSkse2NvbnRleHQ6bn09dGhpcyx7Z2w6bH09bjtpZih0aGlzLnVzZU1pcG1hcD1Cb29sZWFuKGkmJmkudXNlTWlwbWFwKSxsLmJpbmRUZXh0dXJlKGwuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUpLG4ucGl4ZWxTdG9yZVVucGFja0ZsaXBZLnNldCghMSksbi5waXhlbFN0b3JlVW5wYWNrLnNldCgxKSxuLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldCh0aGlzLmZvcm1hdD09PWwuUkdCQSYmKCFpfHwhMSE9PWkucHJlbXVsdGlwbHkpKSxyKXRoaXMuc2l6ZT1bcyxvXSx0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudHx8dCBpbnN0YW5jZW9mIEltYWdlRGF0YXx8ZS5iKHQpP2wudGV4SW1hZ2UyRChsLlRFWFRVUkVfMkQsMCx0aGlzLmZvcm1hdCx0aGlzLmZvcm1hdCxsLlVOU0lHTkVEX0JZVEUsdCk6bC50ZXhJbWFnZTJEKGwuVEVYVFVSRV8yRCwwLHRoaXMuZm9ybWF0LHMsbywwLHRoaXMuZm9ybWF0LGwuVU5TSUdORURfQllURSx0LmRhdGEpO2Vsc2Uge2NvbnN0e3g6aSx5OnJ9PWF8fHt4OjAseTowfTt0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudHx8dCBpbnN0YW5jZW9mIEltYWdlRGF0YXx8ZS5iKHQpP2wudGV4U3ViSW1hZ2UyRChsLlRFWFRVUkVfMkQsMCxpLHIsbC5SR0JBLGwuVU5TSUdORURfQllURSx0KTpsLnRleFN1YkltYWdlMkQobC5URVhUVVJFXzJELDAsaSxyLHMsbyxsLlJHQkEsbC5VTlNJR05FRF9CWVRFLHQuZGF0YSk7fXRoaXMudXNlTWlwbWFwJiZ0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSYmbC5nZW5lcmF0ZU1pcG1hcChsLlRFWFRVUkVfMkQpO31iaW5kKHQsZSxpKXtjb25zdHtjb250ZXh0OmF9PXRoaXMse2dsOnN9PWE7cy5iaW5kVGV4dHVyZShzLlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSxpIT09cy5MSU5FQVJfTUlQTUFQX05FQVJFU1R8fHRoaXMuaXNTaXplUG93ZXJPZlR3bygpfHwoaT1zLkxJTkVBUiksdCE9PXRoaXMuZmlsdGVyJiYocy50ZXhQYXJhbWV0ZXJpKHMuVEVYVFVSRV8yRCxzLlRFWFRVUkVfTUFHX0ZJTFRFUix0KSxzLnRleFBhcmFtZXRlcmkocy5URVhUVVJFXzJELHMuVEVYVFVSRV9NSU5fRklMVEVSLGl8fHQpLHRoaXMuZmlsdGVyPXQpLGUhPT10aGlzLndyYXAmJihzLnRleFBhcmFtZXRlcmkocy5URVhUVVJFXzJELHMuVEVYVFVSRV9XUkFQX1MsZSkscy50ZXhQYXJhbWV0ZXJpKHMuVEVYVFVSRV8yRCxzLlRFWFRVUkVfV1JBUF9ULGUpLHRoaXMud3JhcD1lKTt9aXNTaXplUG93ZXJPZlR3bygpe3JldHVybiB0aGlzLnNpemVbMF09PT10aGlzLnNpemVbMV0mJk1hdGgubG9nKHRoaXMuc2l6ZVswXSkvTWF0aC5MTjIlMT09MH1kZXN0cm95KCl7Y29uc3R7Z2w6dH09dGhpcy5jb250ZXh0O3QuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpLHRoaXMudGV4dHVyZT1udWxsO319ZnVuY3Rpb24gdyh0KXtjb25zdHt1c2VySW1hZ2U6ZX09dDtyZXR1cm4gISEoZSYmZS5yZW5kZXImJmUucmVuZGVyKCkpJiYodC5kYXRhLnJlcGxhY2UobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLmJ1ZmZlcikpLCEwKX1jbGFzcyBUIGV4dGVuZHMgZS5Fe2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmltYWdlcz17fSx0aGlzLnVwZGF0ZWRJbWFnZXM9e30sdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWU9e30sdGhpcy5sb2FkZWQ9ITEsdGhpcy5yZXF1ZXN0b3JzPVtdLHRoaXMucGF0dGVybnM9e30sdGhpcy5hdGxhc0ltYWdlPW5ldyBlLlIoe3dpZHRoOjEsaGVpZ2h0OjF9KSx0aGlzLmRpcnR5PSEwO31pc0xvYWRlZCgpe3JldHVybiB0aGlzLmxvYWRlZH1zZXRMb2FkZWQodCl7aWYodGhpcy5sb2FkZWQhPT10JiYodGhpcy5sb2FkZWQ9dCx0KSl7Zm9yKGNvbnN0e2lkczp0LHByb21pc2VSZXNvbHZlOmV9b2YgdGhpcy5yZXF1ZXN0b3JzKWUodGhpcy5fZ2V0SW1hZ2VzRm9ySWRzKHQpKTt0aGlzLnJlcXVlc3RvcnM9W107fX1nZXRJbWFnZSh0KXtjb25zdCBpPXRoaXMuaW1hZ2VzW3RdO2lmKGkmJiFpLmRhdGEmJmkuc3ByaXRlRGF0YSl7Y29uc3QgdD1pLnNwcml0ZURhdGE7aS5kYXRhPW5ldyBlLlIoe3dpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fSx0LmNvbnRleHQuZ2V0SW1hZ2VEYXRhKHQueCx0LnksdC53aWR0aCx0LmhlaWdodCkuZGF0YSksaS5zcHJpdGVEYXRhPW51bGw7fXJldHVybiBpfWFkZEltYWdlKHQsZSl7aWYodGhpcy5pbWFnZXNbdF0pdGhyb3cgbmV3IEVycm9yKGBJbWFnZSBpZCAke3R9IGFscmVhZHkgZXhpc3QsIHVzZSB1cGRhdGVJbWFnZSBpbnN0ZWFkYCk7dGhpcy5fdmFsaWRhdGUodCxlKSYmKHRoaXMuaW1hZ2VzW3RdPWUpO31fdmFsaWRhdGUodCxpKXtsZXQgYT0hMDtjb25zdCBzPWkuZGF0YXx8aS5zcHJpdGVEYXRhO3JldHVybiB0aGlzLl92YWxpZGF0ZVN0cmV0Y2goaS5zdHJldGNoWCxzJiZzLndpZHRoKXx8KHRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihgSW1hZ2UgXCIke3R9XCIgaGFzIGludmFsaWQgXCJzdHJldGNoWFwiIHZhbHVlYCkpKSxhPSExKSx0aGlzLl92YWxpZGF0ZVN0cmV0Y2goaS5zdHJldGNoWSxzJiZzLmhlaWdodCl8fCh0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoYEltYWdlIFwiJHt0fVwiIGhhcyBpbnZhbGlkIFwic3RyZXRjaFlcIiB2YWx1ZWApKSksYT0hMSksdGhpcy5fdmFsaWRhdGVDb250ZW50KGkuY29udGVudCxpKXx8KHRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihgSW1hZ2UgXCIke3R9XCIgaGFzIGludmFsaWQgXCJjb250ZW50XCIgdmFsdWVgKSkpLGE9ITEpLGF9X3ZhbGlkYXRlU3RyZXRjaCh0LGUpe2lmKCF0KXJldHVybiAhMDtsZXQgaT0wO2Zvcihjb25zdCBhIG9mIHQpe2lmKGFbMF08aXx8YVsxXTxhWzBdfHxlPGFbMV0pcmV0dXJuICExO2k9YVsxXTt9cmV0dXJuICEwfV92YWxpZGF0ZUNvbnRlbnQodCxlKXtpZighdClyZXR1cm4gITA7aWYoNCE9PXQubGVuZ3RoKXJldHVybiAhMTtjb25zdCBpPWUuc3ByaXRlRGF0YSxhPWkmJmkud2lkdGh8fGUuZGF0YS53aWR0aCxzPWkmJmkuaGVpZ2h0fHxlLmRhdGEuaGVpZ2h0O3JldHVybiAhKHRbMF08MHx8YTx0WzBdfHx0WzFdPDB8fHM8dFsxXXx8dFsyXTwwfHxhPHRbMl18fHRbM108MHx8czx0WzNdfHx0WzJdPHRbMF18fHRbM108dFsxXSl9dXBkYXRlSW1hZ2UodCxlLGk9ITApe2NvbnN0IGE9dGhpcy5nZXRJbWFnZSh0KTtpZihpJiYoYS5kYXRhLndpZHRoIT09ZS5kYXRhLndpZHRofHxhLmRhdGEuaGVpZ2h0IT09ZS5kYXRhLmhlaWdodCkpdGhyb3cgbmV3IEVycm9yKGBzaXplIG1pc21hdGNoIGJldHdlZW4gb2xkIGltYWdlICgke2EuZGF0YS53aWR0aH14JHthLmRhdGEuaGVpZ2h0fSkgYW5kIG5ldyBpbWFnZSAoJHtlLmRhdGEud2lkdGh9eCR7ZS5kYXRhLmhlaWdodH0pLmApO2UudmVyc2lvbj1hLnZlcnNpb24rMSx0aGlzLmltYWdlc1t0XT1lLHRoaXMudXBkYXRlZEltYWdlc1t0XT0hMDt9cmVtb3ZlSW1hZ2UodCl7Y29uc3QgZT10aGlzLmltYWdlc1t0XTtkZWxldGUgdGhpcy5pbWFnZXNbdF0sZGVsZXRlIHRoaXMucGF0dGVybnNbdF0sZS51c2VySW1hZ2UmJmUudXNlckltYWdlLm9uUmVtb3ZlJiZlLnVzZXJJbWFnZS5vblJlbW92ZSgpO31saXN0SW1hZ2VzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaW1hZ2VzKX1nZXRJbWFnZXModCl7cmV0dXJuIG5ldyBQcm9taXNlKCgoZSxpKT0+e2xldCBhPSEwO2lmKCF0aGlzLmlzTG9hZGVkKCkpZm9yKGNvbnN0IGUgb2YgdCl0aGlzLmltYWdlc1tlXXx8KGE9ITEpO3RoaXMuaXNMb2FkZWQoKXx8YT9lKHRoaXMuX2dldEltYWdlc0Zvcklkcyh0KSk6dGhpcy5yZXF1ZXN0b3JzLnB1c2goe2lkczp0LHByb21pc2VSZXNvbHZlOmV9KTt9KSl9X2dldEltYWdlc0Zvcklkcyh0KXtjb25zdCBpPXt9O2Zvcihjb25zdCBhIG9mIHQpe2xldCB0PXRoaXMuZ2V0SW1hZ2UoYSk7dHx8KHRoaXMuZmlyZShuZXcgZS5rKFwic3R5bGVpbWFnZW1pc3NpbmdcIix7aWQ6YX0pKSx0PXRoaXMuZ2V0SW1hZ2UoYSkpLHQ/aVthXT17ZGF0YTp0LmRhdGEuY2xvbmUoKSxwaXhlbFJhdGlvOnQucGl4ZWxSYXRpbyxzZGY6dC5zZGYsdmVyc2lvbjp0LnZlcnNpb24sc3RyZXRjaFg6dC5zdHJldGNoWCxzdHJldGNoWTp0LnN0cmV0Y2hZLGNvbnRlbnQ6dC5jb250ZW50LHRleHRGaXRXaWR0aDp0LnRleHRGaXRXaWR0aCx0ZXh0Rml0SGVpZ2h0OnQudGV4dEZpdEhlaWdodCxoYXNSZW5kZXJDYWxsYmFjazpCb29sZWFuKHQudXNlckltYWdlJiZ0LnVzZXJJbWFnZS5yZW5kZXIpfTplLncoYEltYWdlIFwiJHthfVwiIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFBsZWFzZSBtYWtlIHN1cmUgeW91IGhhdmUgYWRkZWQgdGhlIGltYWdlIHdpdGggbWFwLmFkZEltYWdlKCkgb3IgYSBcInNwcml0ZVwiIHByb3BlcnR5IGluIHlvdXIgc3R5bGUuIFlvdSBjYW4gcHJvdmlkZSBtaXNzaW5nIGltYWdlcyBieSBsaXN0ZW5pbmcgZm9yIHRoZSBcInN0eWxlaW1hZ2VtaXNzaW5nXCIgbWFwIGV2ZW50LmApO31yZXR1cm4gaX1nZXRQaXhlbFNpemUoKXtjb25zdHt3aWR0aDp0LGhlaWdodDplfT10aGlzLmF0bGFzSW1hZ2U7cmV0dXJuIHt3aWR0aDp0LGhlaWdodDplfX1nZXRQYXR0ZXJuKHQpe2NvbnN0IGk9dGhpcy5wYXR0ZXJuc1t0XSxhPXRoaXMuZ2V0SW1hZ2UodCk7aWYoIWEpcmV0dXJuIG51bGw7aWYoaSYmaS5wb3NpdGlvbi52ZXJzaW9uPT09YS52ZXJzaW9uKXJldHVybiBpLnBvc2l0aW9uO2lmKGkpaS5wb3NpdGlvbi52ZXJzaW9uPWEudmVyc2lvbjtlbHNlIHtjb25zdCBpPXt3OmEuZGF0YS53aWR0aCsyLGg6YS5kYXRhLmhlaWdodCsyLHg6MCx5OjB9LHM9bmV3IGUuSShpLGEpO3RoaXMucGF0dGVybnNbdF09e2JpbjppLHBvc2l0aW9uOnN9O31yZXR1cm4gdGhpcy5fdXBkYXRlUGF0dGVybkF0bGFzKCksdGhpcy5wYXR0ZXJuc1t0XS5wb3NpdGlvbn1iaW5kKHQpe2NvbnN0IGU9dC5nbDt0aGlzLmF0bGFzVGV4dHVyZT90aGlzLmRpcnR5JiYodGhpcy5hdGxhc1RleHR1cmUudXBkYXRlKHRoaXMuYXRsYXNJbWFnZSksdGhpcy5kaXJ0eT0hMSk6dGhpcy5hdGxhc1RleHR1cmU9bmV3IGIodCx0aGlzLmF0bGFzSW1hZ2UsZS5SR0JBKSx0aGlzLmF0bGFzVGV4dHVyZS5iaW5kKGUuTElORUFSLGUuQ0xBTVBfVE9fRURHRSk7fV91cGRhdGVQYXR0ZXJuQXRsYXMoKXtjb25zdCB0PVtdO2Zvcihjb25zdCBlIGluIHRoaXMucGF0dGVybnMpdC5wdXNoKHRoaXMucGF0dGVybnNbZV0uYmluKTtjb25zdHt3OmksaDphfT1lLnAodCkscz10aGlzLmF0bGFzSW1hZ2U7cy5yZXNpemUoe3dpZHRoOml8fDEsaGVpZ2h0OmF8fDF9KTtmb3IoY29uc3QgdCBpbiB0aGlzLnBhdHRlcm5zKXtjb25zdHtiaW46aX09dGhpcy5wYXR0ZXJuc1t0XSxhPWkueCsxLG89aS55KzEscj10aGlzLmdldEltYWdlKHQpLmRhdGEsbj1yLndpZHRoLGw9ci5oZWlnaHQ7ZS5SLmNvcHkocixzLHt4OjAseTowfSx7eDphLHk6b30se3dpZHRoOm4saGVpZ2h0Omx9KSxlLlIuY29weShyLHMse3g6MCx5OmwtMX0se3g6YSx5Om8tMX0se3dpZHRoOm4saGVpZ2h0OjF9KSxlLlIuY29weShyLHMse3g6MCx5OjB9LHt4OmEseTpvK2x9LHt3aWR0aDpuLGhlaWdodDoxfSksZS5SLmNvcHkocixzLHt4Om4tMSx5OjB9LHt4OmEtMSx5Om99LHt3aWR0aDoxLGhlaWdodDpsfSksZS5SLmNvcHkocixzLHt4OjAseTowfSx7eDphK24seTpvfSx7d2lkdGg6MSxoZWlnaHQ6bH0pO310aGlzLmRpcnR5PSEwO31iZWdpbkZyYW1lKCl7dGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWU9e307fWRpc3BhdGNoUmVuZGVyQ2FsbGJhY2tzKHQpe2Zvcihjb25zdCBpIG9mIHQpe2lmKHRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lW2ldKWNvbnRpbnVlO3RoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lW2ldPSEwO2NvbnN0IHQ9dGhpcy5nZXRJbWFnZShpKTt0fHxlLncoYEltYWdlIHdpdGggSUQ6IFwiJHtpfVwiIHdhcyBub3QgZm91bmRgKSx3KHQpJiZ0aGlzLnVwZGF0ZUltYWdlKGksdCk7fX19Y29uc3QgST0xZTIwO2Z1bmN0aW9uIEUodCxlLGksYSxzLG8scixuLGwpe2ZvcihsZXQgaD1lO2g8ZSthO2grKylQKHQsaSpvK2gsbyxzLHIsbixsKTtmb3IobGV0IGg9aTtoPGkrcztoKyspUCh0LGgqbytlLDEsYSxyLG4sbCk7fWZ1bmN0aW9uIFAodCxlLGksYSxzLG8scil7b1swXT0wLHJbMF09LUksclsxXT1JLHNbMF09dFtlXTtmb3IobGV0IG49MSxsPTAsaD0wO248YTtuKyspe3Nbbl09dFtlK24qaV07Y29uc3QgYT1uKm47ZG97Y29uc3QgdD1vW2xdO2g9KHNbbl0tc1t0XSthLXQqdCkvKG4tdCkvMjt9d2hpbGUoaDw9cltsXSYmLS1sPi0xKTtsKyssb1tsXT1uLHJbbF09aCxyW2wrMV09STt9Zm9yKGxldCBuPTAsbD0wO248YTtuKyspe2Zvcig7cltsKzFdPG47KWwrKztjb25zdCBhPW9bbF0saD1uLWE7dFtlK24qaV09c1thXStoKmg7fX1jbGFzcyBDe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5yZXF1ZXN0TWFuYWdlcj10LHRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5PWUsdGhpcy5lbnRyaWVzPXt9O31zZXRVUkwodCl7dGhpcy51cmw9dDt9Z2V0R2x5cGhzKHQpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPVtdO2Zvcihjb25zdCBpIGluIHQpZm9yKGNvbnN0IGEgb2YgdFtpXSllLnB1c2godGhpcy5fZ2V0QW5kQ2FjaGVHbHlwaHNQcm9taXNlKGksYSkpO2NvbnN0IGk9eWllbGQgUHJvbWlzZS5hbGwoZSksYT17fTtmb3IoY29uc3R7c3RhY2s6dCxpZDplLGdseXBoOnN9b2YgaSlhW3RdfHwoYVt0XT17fSksYVt0XVtlXT1zJiZ7aWQ6cy5pZCxiaXRtYXA6cy5iaXRtYXAuY2xvbmUoKSxtZXRyaWNzOnMubWV0cmljc307cmV0dXJuIGF9KSl9X2dldEFuZENhY2hlR2x5cGhzUHJvbWlzZSh0LGkpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgZT10aGlzLmVudHJpZXNbdF07ZXx8KGU9dGhpcy5lbnRyaWVzW3RdPXtnbHlwaHM6e30scmVxdWVzdHM6e30scmFuZ2VzOnt9fSk7bGV0IGE9ZS5nbHlwaHNbaV07aWYodm9pZCAwIT09YSlyZXR1cm4ge3N0YWNrOnQsaWQ6aSxnbHlwaDphfTtpZihhPXRoaXMuX3RpbnlTREYoZSx0LGkpLGEpcmV0dXJuIGUuZ2x5cGhzW2ldPWEse3N0YWNrOnQsaWQ6aSxnbHlwaDphfTtjb25zdCBzPU1hdGguZmxvb3IoaS8yNTYpO2lmKDI1NipzPjY1NTM1KXRocm93IG5ldyBFcnJvcihcImdseXBocyA+IDY1NTM1IG5vdCBzdXBwb3J0ZWRcIik7aWYoZS5yYW5nZXNbc10pcmV0dXJuIHtzdGFjazp0LGlkOmksZ2x5cGg6YX07aWYoIXRoaXMudXJsKXRocm93IG5ldyBFcnJvcihcImdseXBoc1VybCBpcyBub3Qgc2V0XCIpO2lmKCFlLnJlcXVlc3RzW3NdKXtjb25zdCBpPUMubG9hZEdseXBoUmFuZ2UodCxzLHRoaXMudXJsLHRoaXMucmVxdWVzdE1hbmFnZXIpO2UucmVxdWVzdHNbc109aTt9Y29uc3Qgbz15aWVsZCBlLnJlcXVlc3RzW3NdO2Zvcihjb25zdCB0IGluIG8pdGhpcy5fZG9lc0NoYXJTdXBwb3J0TG9jYWxHbHlwaCgrdCl8fChlLmdseXBoc1srdF09b1srdF0pO3JldHVybiBlLnJhbmdlc1tzXT0hMCx7c3RhY2s6dCxpZDppLGdseXBoOm9baV18fG51bGx9fSkpfV9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKHQpe3JldHVybiAhIXRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5JiYvXFxwe0lkZW99fFxccHtzYz1IYW5nfXxcXHB7c2M9SGlyYX18XFxwe3NjPUthbmF9L3UudGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludCh0KSl9X3RpbnlTREYodCxpLGEpe2NvbnN0IHM9dGhpcy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7aWYoIXMpcmV0dXJuO2lmKCF0aGlzLl9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKGEpKXJldHVybjtsZXQgbz10LnRpbnlTREY7aWYoIW8pe2xldCBlPVwiNDAwXCI7L2JvbGQvaS50ZXN0KGkpP2U9XCI5MDBcIjovbWVkaXVtL2kudGVzdChpKT9lPVwiNTAwXCI6L2xpZ2h0L2kudGVzdChpKSYmKGU9XCIyMDBcIiksbz10LnRpbnlTREY9bmV3IEMuVGlueVNERih7Zm9udFNpemU6NDgsYnVmZmVyOjYscmFkaXVzOjE2LGN1dG9mZjouMjUsZm9udEZhbWlseTpzLGZvbnRXZWlnaHQ6ZX0pO31jb25zdCByPW8uZHJhdyhTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKTtyZXR1cm4ge2lkOmEsYml0bWFwOm5ldyBlLm8oe3dpZHRoOnIud2lkdGh8fDYwLGhlaWdodDpyLmhlaWdodHx8NjB9LHIuZGF0YSksbWV0cmljczp7d2lkdGg6ci5nbHlwaFdpZHRoLzJ8fDI0LGhlaWdodDpyLmdseXBoSGVpZ2h0LzJ8fDI0LGxlZnQ6ci5nbHlwaExlZnQvMisuNXx8MCx0b3A6ci5nbHlwaFRvcC8yLTI3LjV8fC04LGFkdmFuY2U6ci5nbHlwaEFkdmFuY2UvMnx8MjQsaXNEb3VibGVSZXNvbHV0aW9uOiEwfX19fUMubG9hZEdseXBoUmFuZ2U9ZnVuY3Rpb24odCxpLGEscyl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG89MjU2Kmkscj1vKzI1NSxuPXMudHJhbnNmb3JtUmVxdWVzdChhLnJlcGxhY2UoXCJ7Zm9udHN0YWNrfVwiLHQpLnJlcGxhY2UoXCJ7cmFuZ2V9XCIsYCR7b30tJHtyfWApLFwiR2x5cGhzXCIpLGw9eWllbGQgZS5sKG4sbmV3IEFib3J0Q29udHJvbGxlcik7aWYoIWx8fCFsLmRhdGEpdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9hZCBnbHlwaCByYW5nZS4gcmFuZ2U6ICR7aX0sICR7b30tJHtyfWApO2NvbnN0IGg9e307Zm9yKGNvbnN0IHQgb2YgZS5uKGwuZGF0YSkpaFt0LmlkXT10O3JldHVybiBofSkpfSxDLlRpbnlTREY9Y2xhc3N7Y29uc3RydWN0b3Ioe2ZvbnRTaXplOnQ9MjQsYnVmZmVyOmU9MyxyYWRpdXM6aT04LGN1dG9mZjphPS4yNSxmb250RmFtaWx5OnM9XCJzYW5zLXNlcmlmXCIsZm9udFdlaWdodDpvPVwibm9ybWFsXCIsZm9udFN0eWxlOnI9XCJub3JtYWxcIn09e30pe3RoaXMuYnVmZmVyPWUsdGhpcy5jdXRvZmY9YSx0aGlzLnJhZGl1cz1pO2NvbnN0IG49dGhpcy5zaXplPXQrNCplLGw9dGhpcy5fY3JlYXRlQ2FudmFzKG4pLGg9dGhpcy5jdHg9bC5nZXRDb250ZXh0KFwiMmRcIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSk7aC5mb250PWAke3J9ICR7b30gJHt0fXB4ICR7c31gLGgudGV4dEJhc2VsaW5lPVwiYWxwaGFiZXRpY1wiLGgudGV4dEFsaWduPVwibGVmdFwiLGguZmlsbFN0eWxlPVwiYmxhY2tcIix0aGlzLmdyaWRPdXRlcj1uZXcgRmxvYXQ2NEFycmF5KG4qbiksdGhpcy5ncmlkSW5uZXI9bmV3IEZsb2F0NjRBcnJheShuKm4pLHRoaXMuZj1uZXcgRmxvYXQ2NEFycmF5KG4pLHRoaXMuej1uZXcgRmxvYXQ2NEFycmF5KG4rMSksdGhpcy52PW5ldyBVaW50MTZBcnJheShuKTt9X2NyZWF0ZUNhbnZhcyh0KXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7cmV0dXJuIGUud2lkdGg9ZS5oZWlnaHQ9dCxlfWRyYXcodCl7Y29uc3R7d2lkdGg6ZSxhY3R1YWxCb3VuZGluZ0JveEFzY2VudDppLGFjdHVhbEJvdW5kaW5nQm94RGVzY2VudDphLGFjdHVhbEJvdW5kaW5nQm94TGVmdDpzLGFjdHVhbEJvdW5kaW5nQm94UmlnaHQ6b309dGhpcy5jdHgubWVhc3VyZVRleHQodCkscj1NYXRoLmNlaWwoaSksbj1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuc2l6ZS10aGlzLmJ1ZmZlcixNYXRoLmNlaWwoby1zKSkpLGw9TWF0aC5taW4odGhpcy5zaXplLXRoaXMuYnVmZmVyLHIrTWF0aC5jZWlsKGEpKSxoPW4rMip0aGlzLmJ1ZmZlcixjPWwrMip0aGlzLmJ1ZmZlcix1PU1hdGgubWF4KGgqYywwKSxkPW5ldyBVaW50OENsYW1wZWRBcnJheSh1KSxfPXtkYXRhOmQsd2lkdGg6aCxoZWlnaHQ6YyxnbHlwaFdpZHRoOm4sZ2x5cGhIZWlnaHQ6bCxnbHlwaFRvcDpyLGdseXBoTGVmdDowLGdseXBoQWR2YW5jZTplfTtpZigwPT09bnx8MD09PWwpcmV0dXJuIF87Y29uc3R7Y3R4OnAsYnVmZmVyOm0sZ3JpZElubmVyOmYsZ3JpZE91dGVyOmd9PXRoaXM7cC5jbGVhclJlY3QobSxtLG4sbCkscC5maWxsVGV4dCh0LG0sbStyKTtjb25zdCB2PXAuZ2V0SW1hZ2VEYXRhKG0sbSxuLGwpO2cuZmlsbChJLDAsdSksZi5maWxsKDAsMCx1KTtmb3IobGV0IHQ9MDt0PGw7dCsrKWZvcihsZXQgZT0wO2U8bjtlKyspe2NvbnN0IGk9di5kYXRhWzQqKHQqbitlKSszXS8yNTU7aWYoMD09PWkpY29udGludWU7Y29uc3QgYT0odCttKSpoK2UrbTtpZigxPT09aSlnW2FdPTAsZlthXT1JO2Vsc2Uge2NvbnN0IHQ9LjUtaTtnW2FdPXQ+MD90KnQ6MCxmW2FdPXQ8MD90KnQ6MDt9fUUoZywwLDAsaCxjLGgsdGhpcy5mLHRoaXMudix0aGlzLnopLEUoZixtLG0sbixsLGgsdGhpcy5mLHRoaXMudix0aGlzLnopO2ZvcihsZXQgdD0wO3Q8dTt0Kyspe2NvbnN0IGU9TWF0aC5zcXJ0KGdbdF0pLU1hdGguc3FydChmW3RdKTtkW3RdPU1hdGgucm91bmQoMjU1LTI1NSooZS90aGlzLnJhZGl1cyt0aGlzLmN1dG9mZikpO31yZXR1cm4gX319O2NsYXNzIFN7Y29uc3RydWN0b3IoKXt0aGlzLnNwZWNpZmljYXRpb249ZS52LmxpZ2h0LnBvc2l0aW9uO31wb3NzaWJseUV2YWx1YXRlKHQsaSl7cmV0dXJuIGUueCh0LmV4cHJlc3Npb24uZXZhbHVhdGUoaSkpfWludGVycG9sYXRlKHQsaSxhKXtyZXR1cm4ge3g6ZS55Lm51bWJlcih0LngsaS54LGEpLHk6ZS55Lm51bWJlcih0LnksaS55LGEpLHo6ZS55Lm51bWJlcih0LnosaS56LGEpfX19bGV0IHo7Y2xhc3MgRCBleHRlbmRzIGUuRXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHo9enx8bmV3IGUucSh7YW5jaG9yOm5ldyBlLkQoZS52LmxpZ2h0LmFuY2hvcikscG9zaXRpb246bmV3IFMsY29sb3I6bmV3IGUuRChlLnYubGlnaHQuY29sb3IpLGludGVuc2l0eTpuZXcgZS5EKGUudi5saWdodC5pbnRlbnNpdHkpfSksdGhpcy5fdHJhbnNpdGlvbmFibGU9bmV3IGUuVCh6KSx0aGlzLnNldExpZ2h0KHQpLHRoaXMuX3RyYW5zaXRpb25pbmc9dGhpcy5fdHJhbnNpdGlvbmFibGUudW50cmFuc2l0aW9uZWQoKTt9Z2V0TGlnaHQoKXtyZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGUuc2VyaWFsaXplKCl9c2V0TGlnaHQodCxpPXt9KXtpZighdGhpcy5fdmFsaWRhdGUoZS5yLHQsaSkpZm9yKGNvbnN0IGUgaW4gdCl7Y29uc3QgaT10W2VdO2UuZW5kc1dpdGgoXCItdHJhbnNpdGlvblwiKT90aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRUcmFuc2l0aW9uKGUuc2xpY2UoMCwtMTEpLGkpOnRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFZhbHVlKGUsaSk7fX11cGRhdGVUcmFuc2l0aW9ucyh0KXt0aGlzLl90cmFuc2l0aW9uaW5nPXRoaXMuX3RyYW5zaXRpb25hYmxlLnRyYW5zaXRpb25lZCh0LHRoaXMuX3RyYW5zaXRpb25pbmcpO31oYXNUcmFuc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmcuaGFzVHJhbnNpdGlvbigpfXJlY2FsY3VsYXRlKHQpe3RoaXMucHJvcGVydGllcz10aGlzLl90cmFuc2l0aW9uaW5nLnBvc3NpYmx5RXZhbHVhdGUodCk7fV92YWxpZGF0ZSh0LGksYSl7cmV0dXJuICghYXx8ITEhPT1hLnZhbGlkYXRlKSYmZS50KHRoaXMsdC5jYWxsKGUudSx7dmFsdWU6aSxzdHlsZTp7Z2x5cGhzOiEwLHNwcml0ZTohMH0sc3R5bGVTcGVjOmUudn0pKX19Y29uc3QgTT1uZXcgZS5xKHtcInNreS1jb2xvclwiOm5ldyBlLkQoZS52LnNreVtcInNreS1jb2xvclwiXSksXCJob3Jpem9uLWNvbG9yXCI6bmV3IGUuRChlLnYuc2t5W1wiaG9yaXpvbi1jb2xvclwiXSksXCJmb2ctY29sb3JcIjpuZXcgZS5EKGUudi5za3lbXCJmb2ctY29sb3JcIl0pLFwiZm9nLWdyb3VuZC1ibGVuZFwiOm5ldyBlLkQoZS52LnNreVtcImZvZy1ncm91bmQtYmxlbmRcIl0pLFwiaG9yaXpvbi1mb2ctYmxlbmRcIjpuZXcgZS5EKGUudi5za3lbXCJob3Jpem9uLWZvZy1ibGVuZFwiXSksXCJza3ktaG9yaXpvbi1ibGVuZFwiOm5ldyBlLkQoZS52LnNreVtcInNreS1ob3Jpem9uLWJsZW5kXCJdKSxcImF0bW9zcGhlcmUtYmxlbmRcIjpuZXcgZS5EKGUudi5za3lbXCJhdG1vc3BoZXJlLWJsZW5kXCJdKX0pO2NsYXNzIEEgZXh0ZW5kcyBlLkV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl90cmFuc2l0aW9uYWJsZT1uZXcgZS5UKE0pLHRoaXMuc2V0U2t5KHQpLHRoaXMuX3RyYW5zaXRpb25pbmc9dGhpcy5fdHJhbnNpdGlvbmFibGUudW50cmFuc2l0aW9uZWQoKSx0aGlzLnJlY2FsY3VsYXRlKG5ldyBlLnooMCkpO31zZXRTa3kodCxpPXt9KXtpZighdGhpcy5fdmFsaWRhdGUoZS5CLHQsaSkpe3R8fCh0PXtcInNreS1jb2xvclwiOlwidHJhbnNwYXJlbnRcIixcImhvcml6b24tY29sb3JcIjpcInRyYW5zcGFyZW50XCIsXCJmb2ctY29sb3JcIjpcInRyYW5zcGFyZW50XCIsXCJmb2ctZ3JvdW5kLWJsZW5kXCI6MSxcImF0bW9zcGhlcmUtYmxlbmRcIjowfSk7Zm9yKGNvbnN0IGUgaW4gdCl7Y29uc3QgaT10W2VdO2UuZW5kc1dpdGgoXCItdHJhbnNpdGlvblwiKT90aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRUcmFuc2l0aW9uKGUuc2xpY2UoMCwtMTEpLGkpOnRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFZhbHVlKGUsaSk7fX19Z2V0U2t5KCl7cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNlcmlhbGl6ZSgpfXVwZGF0ZVRyYW5zaXRpb25zKHQpe3RoaXMuX3RyYW5zaXRpb25pbmc9dGhpcy5fdHJhbnNpdGlvbmFibGUudHJhbnNpdGlvbmVkKHQsdGhpcy5fdHJhbnNpdGlvbmluZyk7fWhhc1RyYW5zaXRpb24oKXtyZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmluZy5oYXNUcmFuc2l0aW9uKCl9cmVjYWxjdWxhdGUodCl7dGhpcy5wcm9wZXJ0aWVzPXRoaXMuX3RyYW5zaXRpb25pbmcucG9zc2libHlFdmFsdWF0ZSh0KTt9X3ZhbGlkYXRlKHQsaSxhPXt9KXtyZXR1cm4gITEhPT0obnVsbD09YT92b2lkIDA6YS52YWxpZGF0ZSkmJmUudCh0aGlzLHQuY2FsbChlLnUsZS5lKHt2YWx1ZTppLHN0eWxlOntnbHlwaHM6ITAsc3ByaXRlOiEwfSxzdHlsZVNwZWM6ZS52fSkpKX1jYWxjdWxhdGVGb2dCbGVuZE9wYWNpdHkodCl7cmV0dXJuIHQ8NjA/MDp0PDcwPyh0LTYwKS8xMDoxfX1jbGFzcyBSe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5uZXh0Um93PTAsdGhpcy5kYXRhPW5ldyBVaW50OEFycmF5KHRoaXMud2lkdGgqdGhpcy5oZWlnaHQpLHRoaXMuZGFzaEVudHJ5PXt9O31nZXREYXNoKHQsZSl7Y29uc3QgaT10LmpvaW4oXCIsXCIpK1N0cmluZyhlKTtyZXR1cm4gdGhpcy5kYXNoRW50cnlbaV18fCh0aGlzLmRhc2hFbnRyeVtpXT10aGlzLmFkZERhc2godCxlKSksdGhpcy5kYXNoRW50cnlbaV19Z2V0RGFzaFJhbmdlcyh0LGUsaSl7Y29uc3QgYT1bXTtsZXQgcz10Lmxlbmd0aCUyPT0xPy10W3QubGVuZ3RoLTFdKmk6MCxvPXRbMF0qaSxyPSEwO2EucHVzaCh7bGVmdDpzLHJpZ2h0Om8saXNEYXNoOnIsemVyb0xlbmd0aDowPT09dFswXX0pO2xldCBuPXRbMF07Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspe3I9IXI7Y29uc3QgbD10W2VdO3M9bippLG4rPWwsbz1uKmksYS5wdXNoKHtsZWZ0OnMscmlnaHQ6byxpc0Rhc2g6cix6ZXJvTGVuZ3RoOjA9PT1sfSk7fXJldHVybiBhfWFkZFJvdW5kRGFzaCh0LGUsaSl7Y29uc3QgYT1lLzI7Zm9yKGxldCBlPS1pO2U8PWk7ZSsrKXtjb25zdCBzPXRoaXMud2lkdGgqKHRoaXMubmV4dFJvdytpK2UpO2xldCBvPTAscj10W29dO2ZvcihsZXQgbj0wO248dGhpcy53aWR0aDtuKyspe24vci5yaWdodD4xJiYocj10Wysrb10pO2NvbnN0IGw9TWF0aC5hYnMobi1yLmxlZnQpLGg9TWF0aC5hYnMobi1yLnJpZ2h0KSxjPU1hdGgubWluKGwsaCk7bGV0IHU7Y29uc3QgZD1lL2kqKGErMSk7aWYoci5pc0Rhc2gpe2NvbnN0IHQ9YS1NYXRoLmFicyhkKTt1PU1hdGguc3FydChjKmMrdCp0KTt9ZWxzZSB1PWEtTWF0aC5zcXJ0KGMqYytkKmQpO3RoaXMuZGF0YVtzK25dPU1hdGgubWF4KDAsTWF0aC5taW4oMjU1LHUrMTI4KSk7fX19YWRkUmVndWxhckRhc2godCl7Zm9yKGxldCBlPXQubGVuZ3RoLTE7ZT49MDstLWUpe2NvbnN0IGk9dFtlXSxhPXRbZSsxXTtpLnplcm9MZW5ndGg/dC5zcGxpY2UoZSwxKTphJiZhLmlzRGFzaD09PWkuaXNEYXNoJiYoYS5sZWZ0PWkubGVmdCx0LnNwbGljZShlLDEpKTt9Y29uc3QgZT10WzBdLGk9dFt0Lmxlbmd0aC0xXTtlLmlzRGFzaD09PWkuaXNEYXNoJiYoZS5sZWZ0PWkubGVmdC10aGlzLndpZHRoLGkucmlnaHQ9ZS5yaWdodCt0aGlzLndpZHRoKTtjb25zdCBhPXRoaXMud2lkdGgqdGhpcy5uZXh0Um93O2xldCBzPTAsbz10W3NdO2ZvcihsZXQgZT0wO2U8dGhpcy53aWR0aDtlKyspe2Uvby5yaWdodD4xJiYobz10Wysrc10pO2NvbnN0IGk9TWF0aC5hYnMoZS1vLmxlZnQpLHI9TWF0aC5hYnMoZS1vLnJpZ2h0KSxuPU1hdGgubWluKGkscik7dGhpcy5kYXRhW2ErZV09TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsKG8uaXNEYXNoP246LW4pKzEyOCkpO319YWRkRGFzaCh0LGkpe2NvbnN0IGE9aT83OjAscz0yKmErMTtpZih0aGlzLm5leHRSb3crcz50aGlzLmhlaWdodClyZXR1cm4gZS53KFwiTGluZUF0bGFzIG91dCBvZiBzcGFjZVwiKSxudWxsO2xldCBvPTA7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspbys9dFtlXTtpZigwIT09byl7Y29uc3QgZT10aGlzLndpZHRoL28scz10aGlzLmdldERhc2hSYW5nZXModCx0aGlzLndpZHRoLGUpO2k/dGhpcy5hZGRSb3VuZERhc2gocyxlLGEpOnRoaXMuYWRkUmVndWxhckRhc2gocyk7fWNvbnN0IHI9e3k6KHRoaXMubmV4dFJvdythKy41KS90aGlzLmhlaWdodCxoZWlnaHQ6MiphL3RoaXMuaGVpZ2h0LHdpZHRoOm99O3JldHVybiB0aGlzLm5leHRSb3crPXMsdGhpcy5kaXJ0eT0hMCxyfWJpbmQodCl7Y29uc3QgZT10LmdsO3RoaXMudGV4dHVyZT8oZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSx0aGlzLmRpcnR5JiYodGhpcy5kaXJ0eT0hMSxlLnRleFN1YkltYWdlMkQoZS5URVhUVVJFXzJELDAsMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQsZS5BTFBIQSxlLlVOU0lHTkVEX0JZVEUsdGhpcy5kYXRhKSkpOih0aGlzLnRleHR1cmU9ZS5jcmVhdGVUZXh0dXJlKCksZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSxlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELGUuVEVYVFVSRV9XUkFQX1MsZS5SRVBFQVQpLGUudGV4UGFyYW1ldGVyaShlLlRFWFRVUkVfMkQsZS5URVhUVVJFX1dSQVBfVCxlLlJFUEVBVCksZS50ZXhQYXJhbWV0ZXJpKGUuVEVYVFVSRV8yRCxlLlRFWFRVUkVfTUlOX0ZJTFRFUixlLkxJTkVBUiksZS50ZXhQYXJhbWV0ZXJpKGUuVEVYVFVSRV8yRCxlLlRFWFRVUkVfTUFHX0ZJTFRFUixlLkxJTkVBUiksZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwwLGUuQUxQSEEsdGhpcy53aWR0aCx0aGlzLmhlaWdodCwwLGUuQUxQSEEsZS5VTlNJR05FRF9CWVRFLHRoaXMuZGF0YSkpO319Y29uc3Qgaz1cIm1hcGxpYnJlX3ByZWxvYWRlZF93b3JrZXJfcG9vbFwiO2NsYXNzIEx7Y29uc3RydWN0b3IoKXt0aGlzLmFjdGl2ZT17fTt9YWNxdWlyZSh0KXtpZighdGhpcy53b3JrZXJzKWZvcih0aGlzLndvcmtlcnM9W107dGhpcy53b3JrZXJzLmxlbmd0aDxMLndvcmtlckNvdW50Oyl0aGlzLndvcmtlcnMucHVzaChuZXcgV29ya2VyKGUuYS5XT1JLRVJfVVJMKSk7cmV0dXJuIHRoaXMuYWN0aXZlW3RdPSEwLHRoaXMud29ya2Vycy5zbGljZSgpfXJlbGVhc2UodCl7ZGVsZXRlIHRoaXMuYWN0aXZlW3RdLDA9PT10aGlzLm51bUFjdGl2ZSgpJiYodGhpcy53b3JrZXJzLmZvckVhY2goKHQ9Pnt0LnRlcm1pbmF0ZSgpO30pKSx0aGlzLndvcmtlcnM9bnVsbCk7fWlzUHJlbG9hZGVkKCl7cmV0dXJuICEhdGhpcy5hY3RpdmVba119bnVtQWN0aXZlKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlKS5sZW5ndGh9fWNvbnN0IEY9TWF0aC5mbG9vcihvLmhhcmR3YXJlQ29uY3VycmVuY3kvMik7bGV0IEIsTztmdW5jdGlvbiBOKCl7cmV0dXJuIEJ8fChCPW5ldyBMKSxCfUwud29ya2VyQ291bnQ9ZS5DKGdsb2JhbFRoaXMpP01hdGgubWF4KE1hdGgubWluKEYsMyksMSk6MTtjbGFzcyBVe2NvbnN0cnVjdG9yKHQsaSl7dGhpcy53b3JrZXJQb29sPXQsdGhpcy5hY3RvcnM9W10sdGhpcy5jdXJyZW50QWN0b3I9MCx0aGlzLmlkPWk7Y29uc3QgYT10aGlzLndvcmtlclBvb2wuYWNxdWlyZShpKTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKyl7Y29uc3Qgcz1uZXcgZS5GKGFbdF0saSk7cy5uYW1lPWBXb3JrZXIgJHt0fWAsdGhpcy5hY3RvcnMucHVzaChzKTt9aWYoIXRoaXMuYWN0b3JzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJObyBhY3RvcnMgZm91bmRcIil9YnJvYWRjYXN0KHQsZSl7Y29uc3QgaT1bXTtmb3IoY29uc3QgYSBvZiB0aGlzLmFjdG9ycylpLnB1c2goYS5zZW5kQXN5bmMoe3R5cGU6dCxkYXRhOmV9KSk7cmV0dXJuIFByb21pc2UuYWxsKGkpfWdldEFjdG9yKCl7cmV0dXJuIHRoaXMuY3VycmVudEFjdG9yPSh0aGlzLmN1cnJlbnRBY3RvcisxKSV0aGlzLmFjdG9ycy5sZW5ndGgsdGhpcy5hY3RvcnNbdGhpcy5jdXJyZW50QWN0b3JdfXJlbW92ZSh0PSEwKXt0aGlzLmFjdG9ycy5mb3JFYWNoKCh0PT57dC5yZW1vdmUoKTt9KSksdGhpcy5hY3RvcnM9W10sdCYmdGhpcy53b3JrZXJQb29sLnJlbGVhc2UodGhpcy5pZCk7fXJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIodCxlKXtmb3IoY29uc3QgaSBvZiB0aGlzLmFjdG9ycylpLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIodCxlKTt9fWZ1bmN0aW9uIGooKXtyZXR1cm4gT3x8KE89bmV3IFUoTigpLGUuRyksTy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiR1JcIiwoKHQsaSxhKT0+ZS5tKGksYSkpKSksT31mdW5jdGlvbiBaKHQsaSl7Y29uc3QgYT1lLkgoKTtyZXR1cm4gZS5KKGEsYSxbMSwxLDBdKSxlLksoYSxhLFsuNSp0LndpZHRoLC41KnQuaGVpZ2h0LDFdKSxlLkwoYSxhLHQuY2FsY3VsYXRlUG9zTWF0cml4KGkudG9VbndyYXBwZWQoKSkpfWZ1bmN0aW9uIHEodCxlLGksYSxzLG8pe2NvbnN0IHI9ZnVuY3Rpb24odCxlLGkpe2lmKHQpZm9yKGNvbnN0IGEgb2YgdCl7Y29uc3QgdD1lW2FdO2lmKHQmJnQuc291cmNlPT09aSYmXCJmaWxsLWV4dHJ1c2lvblwiPT09dC50eXBlKXJldHVybiAhMH1lbHNlIGZvcihjb25zdCB0IGluIGUpe2NvbnN0IGE9ZVt0XTtpZihhLnNvdXJjZT09PWkmJlwiZmlsbC1leHRydXNpb25cIj09PWEudHlwZSlyZXR1cm4gITB9cmV0dXJuICExfShzJiZzLmxheWVycyxlLHQuaWQpLG49by5tYXhQaXRjaFNjYWxlRmFjdG9yKCksbD10LnRpbGVzSW4oYSxuLHIpO2wuc29ydChWKTtjb25zdCBoPVtdO2Zvcihjb25zdCBhIG9mIGwpaC5wdXNoKHt3cmFwcGVkVGlsZUlEOmEudGlsZUlELndyYXBwZWQoKS5rZXkscXVlcnlSZXN1bHRzOmEudGlsZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZSxpLHQuX3N0YXRlLGEucXVlcnlHZW9tZXRyeSxhLmNhbWVyYVF1ZXJ5R2VvbWV0cnksYS5zY2FsZSxzLG8sbixaKHQudHJhbnNmb3JtLGEudGlsZUlEKSl9KTtjb25zdCBjPWZ1bmN0aW9uKHQpe2NvbnN0IGU9e30saT17fTtmb3IoY29uc3QgYSBvZiB0KXtjb25zdCB0PWEucXVlcnlSZXN1bHRzLHM9YS53cmFwcGVkVGlsZUlELG89aVtzXT1pW3NdfHx7fTtmb3IoY29uc3QgaSBpbiB0KXtjb25zdCBhPXRbaV0scz1vW2ldPW9baV18fHt9LHI9ZVtpXT1lW2ldfHxbXTtmb3IoY29uc3QgdCBvZiBhKXNbdC5mZWF0dXJlSW5kZXhdfHwoc1t0LmZlYXR1cmVJbmRleF09ITAsci5wdXNoKHQpKTt9fXJldHVybiBlfShoKTtmb3IoY29uc3QgZSBpbiBjKWNbZV0uZm9yRWFjaCgoZT0+e2NvbnN0IGk9ZS5mZWF0dXJlLGE9dC5nZXRGZWF0dXJlU3RhdGUoaS5sYXllcltcInNvdXJjZS1sYXllclwiXSxpLmlkKTtpLnNvdXJjZT1pLmxheWVyLnNvdXJjZSxpLmxheWVyW1wic291cmNlLWxheWVyXCJdJiYoaS5zb3VyY2VMYXllcj1pLmxheWVyW1wic291cmNlLWxheWVyXCJdKSxpLnN0YXRlPWE7fSkpO3JldHVybiBjfWZ1bmN0aW9uIFYodCxlKXtjb25zdCBpPXQudGlsZUlELGE9ZS50aWxlSUQ7cmV0dXJuIGkub3ZlcnNjYWxlZFotYS5vdmVyc2NhbGVkWnx8aS5jYW5vbmljYWwueS1hLmNhbm9uaWNhbC55fHxpLndyYXAtYS53cmFwfHxpLmNhbm9uaWNhbC54LWEuY2Fub25pY2FsLnh9ZnVuY3Rpb24gRyh0LGksYSl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCBzPXQ7aWYodC51cmw/cz0oeWllbGQgZS5oKGkudHJhbnNmb3JtUmVxdWVzdCh0LnVybCxcIlNvdXJjZVwiKSxhKSkuZGF0YTp5aWVsZCBvLmZyYW1lQXN5bmMoYSksIXMpcmV0dXJuIG51bGw7Y29uc3Qgcj1lLk0oZS5lKHMsdCksW1widGlsZXNcIixcIm1pbnpvb21cIixcIm1heHpvb21cIixcImF0dHJpYnV0aW9uXCIsXCJib3VuZHNcIixcInNjaGVtZVwiLFwidGlsZVNpemVcIixcImVuY29kaW5nXCJdKTtyZXR1cm4gXCJ2ZWN0b3JfbGF5ZXJzXCJpbiBzJiZzLnZlY3Rvcl9sYXllcnMmJihyLnZlY3RvckxheWVySWRzPXMudmVjdG9yX2xheWVycy5tYXAoKHQ9PnQuaWQpKSkscn0pKX1jbGFzcyBIe2NvbnN0cnVjdG9yKHQsZSl7dCYmKGU/dGhpcy5zZXRTb3V0aFdlc3QodCkuc2V0Tm9ydGhFYXN0KGUpOkFycmF5LmlzQXJyYXkodCkmJig0PT09dC5sZW5ndGg/dGhpcy5zZXRTb3V0aFdlc3QoW3RbMF0sdFsxXV0pLnNldE5vcnRoRWFzdChbdFsyXSx0WzNdXSk6dGhpcy5zZXRTb3V0aFdlc3QodFswXSkuc2V0Tm9ydGhFYXN0KHRbMV0pKSk7fXNldE5vcnRoRWFzdCh0KXtyZXR1cm4gdGhpcy5fbmU9dCBpbnN0YW5jZW9mIGUuTj9uZXcgZS5OKHQubG5nLHQubGF0KTplLk4uY29udmVydCh0KSx0aGlzfXNldFNvdXRoV2VzdCh0KXtyZXR1cm4gdGhpcy5fc3c9dCBpbnN0YW5jZW9mIGUuTj9uZXcgZS5OKHQubG5nLHQubGF0KTplLk4uY29udmVydCh0KSx0aGlzfWV4dGVuZCh0KXtjb25zdCBpPXRoaXMuX3N3LGE9dGhpcy5fbmU7bGV0IHMsbztpZih0IGluc3RhbmNlb2YgZS5OKXM9dCxvPXQ7ZWxzZSB7aWYoISh0IGluc3RhbmNlb2YgSCkpcmV0dXJuIEFycmF5LmlzQXJyYXkodCk/ND09PXQubGVuZ3RofHx0LmV2ZXJ5KEFycmF5LmlzQXJyYXkpP3RoaXMuZXh0ZW5kKEguY29udmVydCh0KSk6dGhpcy5leHRlbmQoZS5OLmNvbnZlcnQodCkpOnQmJihcImxuZ1wiaW4gdHx8XCJsb25cImluIHQpJiZcImxhdFwiaW4gdD90aGlzLmV4dGVuZChlLk4uY29udmVydCh0KSk6dGhpcztpZihzPXQuX3N3LG89dC5fbmUsIXN8fCFvKXJldHVybiB0aGlzfXJldHVybiBpfHxhPyhpLmxuZz1NYXRoLm1pbihzLmxuZyxpLmxuZyksaS5sYXQ9TWF0aC5taW4ocy5sYXQsaS5sYXQpLGEubG5nPU1hdGgubWF4KG8ubG5nLGEubG5nKSxhLmxhdD1NYXRoLm1heChvLmxhdCxhLmxhdCkpOih0aGlzLl9zdz1uZXcgZS5OKHMubG5nLHMubGF0KSx0aGlzLl9uZT1uZXcgZS5OKG8ubG5nLG8ubGF0KSksdGhpc31nZXRDZW50ZXIoKXtyZXR1cm4gbmV3IGUuTigodGhpcy5fc3cubG5nK3RoaXMuX25lLmxuZykvMiwodGhpcy5fc3cubGF0K3RoaXMuX25lLmxhdCkvMil9Z2V0U291dGhXZXN0KCl7cmV0dXJuIHRoaXMuX3N3fWdldE5vcnRoRWFzdCgpe3JldHVybiB0aGlzLl9uZX1nZXROb3J0aFdlc3QoKXtyZXR1cm4gbmV3IGUuTih0aGlzLmdldFdlc3QoKSx0aGlzLmdldE5vcnRoKCkpfWdldFNvdXRoRWFzdCgpe3JldHVybiBuZXcgZS5OKHRoaXMuZ2V0RWFzdCgpLHRoaXMuZ2V0U291dGgoKSl9Z2V0V2VzdCgpe3JldHVybiB0aGlzLl9zdy5sbmd9Z2V0U291dGgoKXtyZXR1cm4gdGhpcy5fc3cubGF0fWdldEVhc3QoKXtyZXR1cm4gdGhpcy5fbmUubG5nfWdldE5vcnRoKCl7cmV0dXJuIHRoaXMuX25lLmxhdH10b0FycmF5KCl7cmV0dXJuIFt0aGlzLl9zdy50b0FycmF5KCksdGhpcy5fbmUudG9BcnJheSgpXX10b1N0cmluZygpe3JldHVybiBgTG5nTGF0Qm91bmRzKCR7dGhpcy5fc3cudG9TdHJpbmcoKX0sICR7dGhpcy5fbmUudG9TdHJpbmcoKX0pYH1pc0VtcHR5KCl7cmV0dXJuICEodGhpcy5fc3cmJnRoaXMuX25lKX1jb250YWlucyh0KXtjb25zdHtsbmc6aSxsYXQ6YX09ZS5OLmNvbnZlcnQodCk7bGV0IHM9dGhpcy5fc3cubG5nPD1pJiZpPD10aGlzLl9uZS5sbmc7cmV0dXJuIHRoaXMuX3N3LmxuZz50aGlzLl9uZS5sbmcmJihzPXRoaXMuX3N3LmxuZz49aSYmaT49dGhpcy5fbmUubG5nKSx0aGlzLl9zdy5sYXQ8PWEmJmE8PXRoaXMuX25lLmxhdCYmc31zdGF0aWMgY29udmVydCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEg/dDp0P25ldyBIKHQpOnR9c3RhdGljIGZyb21MbmdMYXQodCxpPTApe2NvbnN0IGE9MzYwKmkvNDAwNzUwMTcscz1hL01hdGguY29zKE1hdGguUEkvMTgwKnQubGF0KTtyZXR1cm4gbmV3IEgobmV3IGUuTih0LmxuZy1zLHQubGF0LWEpLG5ldyBlLk4odC5sbmcrcyx0LmxhdCthKSl9YWRqdXN0QW50aU1lcmlkaWFuKCl7Y29uc3QgdD1uZXcgZS5OKHRoaXMuX3N3LmxuZyx0aGlzLl9zdy5sYXQpLGk9bmV3IGUuTih0aGlzLl9uZS5sbmcsdGhpcy5fbmUubGF0KTtyZXR1cm4gbmV3IEgodCx0LmxuZz5pLmxuZz9uZXcgZS5OKGkubG5nKzM2MCxpLmxhdCk6aSl9fWNsYXNzIFd7Y29uc3RydWN0b3IodCxlLGkpe3RoaXMuYm91bmRzPUguY29udmVydCh0aGlzLnZhbGlkYXRlQm91bmRzKHQpKSx0aGlzLm1pbnpvb209ZXx8MCx0aGlzLm1heHpvb209aXx8MjQ7fXZhbGlkYXRlQm91bmRzKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiY0PT09dC5sZW5ndGg/W01hdGgubWF4KC0xODAsdFswXSksTWF0aC5tYXgoLTkwLHRbMV0pLE1hdGgubWluKDE4MCx0WzJdKSxNYXRoLm1pbig5MCx0WzNdKV06Wy0xODAsLTkwLDE4MCw5MF19Y29udGFpbnModCl7Y29uc3QgaT1NYXRoLnBvdygyLHQueiksYT1NYXRoLmZsb29yKGUuTyh0aGlzLmJvdW5kcy5nZXRXZXN0KCkpKmkpLHM9TWF0aC5mbG9vcihlLlEodGhpcy5ib3VuZHMuZ2V0Tm9ydGgoKSkqaSksbz1NYXRoLmNlaWwoZS5PKHRoaXMuYm91bmRzLmdldEVhc3QoKSkqaSkscj1NYXRoLmNlaWwoZS5RKHRoaXMuYm91bmRzLmdldFNvdXRoKCkpKmkpO3JldHVybiB0Lng+PWEmJnQueDxvJiZ0Lnk+PXMmJnQueTxyfX1jbGFzcyAkIGV4dGVuZHMgZS5Fe2NvbnN0cnVjdG9yKHQsaSxhLHMpe2lmKHN1cGVyKCksdGhpcy5pZD10LHRoaXMuZGlzcGF0Y2hlcj1hLHRoaXMudHlwZT1cInZlY3RvclwiLHRoaXMubWluem9vbT0wLHRoaXMubWF4em9vbT0yMix0aGlzLnNjaGVtZT1cInh5elwiLHRoaXMudGlsZVNpemU9NTEyLHRoaXMucmVwYXJzZU92ZXJzY2FsZWQ9ITAsdGhpcy5pc1RpbGVDbGlwcGVkPSEwLHRoaXMuX2xvYWRlZD0hMSxlLmUodGhpcyxlLk0oaSxbXCJ1cmxcIixcInNjaGVtZVwiLFwidGlsZVNpemVcIixcInByb21vdGVJZFwiXSkpLHRoaXMuX29wdGlvbnM9ZS5lKHt0eXBlOlwidmVjdG9yXCJ9LGkpLHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZz1pLmNvbGxlY3RSZXNvdXJjZVRpbWluZyw1MTIhPT10aGlzLnRpbGVTaXplKXRocm93IG5ldyBFcnJvcihcInZlY3RvciB0aWxlIHNvdXJjZXMgbXVzdCBoYXZlIGEgdGlsZVNpemUgb2YgNTEyXCIpO3RoaXMuc2V0RXZlbnRlZFBhcmVudChzKTt9bG9hZCgpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9sb2FkZWQ9ITEsdGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhbG9hZGluZ1wiLHtkYXRhVHlwZTpcInNvdXJjZVwifSkpLHRoaXMuX3RpbGVKU09OUmVxdWVzdD1uZXcgQWJvcnRDb250cm9sbGVyO3RyeXtjb25zdCB0PXlpZWxkIEcodGhpcy5fb3B0aW9ucyx0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIsdGhpcy5fdGlsZUpTT05SZXF1ZXN0KTt0aGlzLl90aWxlSlNPTlJlcXVlc3Q9bnVsbCx0aGlzLl9sb2FkZWQ9ITAsdGhpcy5tYXAuc3R5bGUuc291cmNlQ2FjaGVzW3RoaXMuaWRdLmNsZWFyVGlsZXMoKSx0JiYoZS5lKHRoaXMsdCksdC5ib3VuZHMmJih0aGlzLnRpbGVCb3VuZHM9bmV3IFcodC5ib3VuZHMsdGhpcy5taW56b29tLHRoaXMubWF4em9vbSkpLHRoaXMuZmlyZShuZXcgZS5rKFwiZGF0YVwiLHtkYXRhVHlwZTpcInNvdXJjZVwiLHNvdXJjZURhdGFUeXBlOlwibWV0YWRhdGFcIn0pKSx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFcIix7ZGF0YVR5cGU6XCJzb3VyY2VcIixzb3VyY2VEYXRhVHlwZTpcImNvbnRlbnRcIn0pKSk7fWNhdGNoKHQpe3RoaXMuX3RpbGVKU09OUmVxdWVzdD1udWxsLHRoaXMuZmlyZShuZXcgZS5qKHQpKTt9fSkpfWxvYWRlZCgpe3JldHVybiB0aGlzLl9sb2FkZWR9aGFzVGlsZSh0KXtyZXR1cm4gIXRoaXMudGlsZUJvdW5kc3x8dGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHQuY2Fub25pY2FsKX1vbkFkZCh0KXt0aGlzLm1hcD10LHRoaXMubG9hZCgpO31zZXRTb3VyY2VQcm9wZXJ0eSh0KXt0aGlzLl90aWxlSlNPTlJlcXVlc3QmJnRoaXMuX3RpbGVKU09OUmVxdWVzdC5hYm9ydCgpLHQoKSx0aGlzLmxvYWQoKTt9c2V0VGlsZXModCl7cmV0dXJuIHRoaXMuc2V0U291cmNlUHJvcGVydHkoKCgpPT57dGhpcy5fb3B0aW9ucy50aWxlcz10O30pKSx0aGlzfXNldFVybCh0KXtyZXR1cm4gdGhpcy5zZXRTb3VyY2VQcm9wZXJ0eSgoKCk9Pnt0aGlzLnVybD10LHRoaXMuX29wdGlvbnMudXJsPXQ7fSkpLHRoaXN9b25SZW1vdmUoKXt0aGlzLl90aWxlSlNPTlJlcXVlc3QmJih0aGlzLl90aWxlSlNPTlJlcXVlc3QuYWJvcnQoKSx0aGlzLl90aWxlSlNPTlJlcXVlc3Q9bnVsbCk7fXNlcmlhbGl6ZSgpe3JldHVybiBlLmUoe30sdGhpcy5fb3B0aW9ucyl9bG9hZFRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9dC50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLHRoaXMubWFwLmdldFBpeGVsUmF0aW8oKSx0aGlzLnNjaGVtZSksaT17cmVxdWVzdDp0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChlLFwiVGlsZVwiKSx1aWQ6dC51aWQsdGlsZUlEOnQudGlsZUlELHpvb206dC50aWxlSUQub3ZlcnNjYWxlZFosdGlsZVNpemU6dGhpcy50aWxlU2l6ZSp0LnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKSx0eXBlOnRoaXMudHlwZSxzb3VyY2U6dGhpcy5pZCxwaXhlbFJhdGlvOnRoaXMubWFwLmdldFBpeGVsUmF0aW8oKSxzaG93Q29sbGlzaW9uQm94ZXM6dGhpcy5tYXAuc2hvd0NvbGxpc2lvbkJveGVzLHByb21vdGVJZDp0aGlzLnByb21vdGVJZH07aS5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZz10aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmc7bGV0IGE9XCJSVFwiO2lmKHQuYWN0b3ImJlwiZXhwaXJlZFwiIT09dC5zdGF0ZSl7aWYoXCJsb2FkaW5nXCI9PT10LnN0YXRlKXJldHVybiBuZXcgUHJvbWlzZSgoKGUsaSk9Pnt0LnJlbG9hZFByb21pc2U9e3Jlc29sdmU6ZSxyZWplY3Q6aX07fSkpfWVsc2UgdC5hY3Rvcj10aGlzLmRpc3BhdGNoZXIuZ2V0QWN0b3IoKSxhPVwiTFRcIjt0LmFib3J0Q29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyO3RyeXtjb25zdCBlPXlpZWxkIHQuYWN0b3Iuc2VuZEFzeW5jKHt0eXBlOmEsZGF0YTppfSx0LmFib3J0Q29udHJvbGxlcik7aWYoZGVsZXRlIHQuYWJvcnRDb250cm9sbGVyLHQuYWJvcnRlZClyZXR1cm47dGhpcy5fYWZ0ZXJUaWxlTG9hZFdvcmtlclJlc3BvbnNlKHQsZSk7fWNhdGNoKGUpe2lmKGRlbGV0ZSB0LmFib3J0Q29udHJvbGxlcix0LmFib3J0ZWQpcmV0dXJuO2lmKGUmJjQwNCE9PWUuc3RhdHVzKXRocm93IGU7dGhpcy5fYWZ0ZXJUaWxlTG9hZFdvcmtlclJlc3BvbnNlKHQsbnVsbCk7fX0pKX1fYWZ0ZXJUaWxlTG9hZFdvcmtlclJlc3BvbnNlKHQsZSl7aWYoZSYmZS5yZXNvdXJjZVRpbWluZyYmKHQucmVzb3VyY2VUaW1pbmc9ZS5yZXNvdXJjZVRpbWluZyksZSYmdGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMmJnQuc2V0RXhwaXJ5RGF0YShlKSx0LmxvYWRWZWN0b3JEYXRhKGUsdGhpcy5tYXAucGFpbnRlciksdC5yZWxvYWRQcm9taXNlKXtjb25zdCBlPXQucmVsb2FkUHJvbWlzZTt0LnJlbG9hZFByb21pc2U9bnVsbCx0aGlzLmxvYWRUaWxlKHQpLnRoZW4oZS5yZXNvbHZlKS5jYXRjaChlLnJlamVjdCk7fX1hYm9ydFRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3QuYWJvcnRDb250cm9sbGVyJiYodC5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKSxkZWxldGUgdC5hYm9ydENvbnRyb2xsZXIpLHQuYWN0b3ImJih5aWVsZCB0LmFjdG9yLnNlbmRBc3luYyh7dHlwZTpcIkFUXCIsZGF0YTp7dWlkOnQudWlkLHR5cGU6dGhpcy50eXBlLHNvdXJjZTp0aGlzLmlkfX0pKTt9KSl9dW5sb2FkVGlsZSh0KXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dC51bmxvYWRWZWN0b3JEYXRhKCksdC5hY3RvciYmKHlpZWxkIHQuYWN0b3Iuc2VuZEFzeW5jKHt0eXBlOlwiUk1UXCIsZGF0YTp7dWlkOnQudWlkLHR5cGU6dGhpcy50eXBlLHNvdXJjZTp0aGlzLmlkfX0pKTt9KSl9aGFzVHJhbnNpdGlvbigpe3JldHVybiAhMX19Y2xhc3MgWCBleHRlbmRzIGUuRXtjb25zdHJ1Y3Rvcih0LGksYSxzKXtzdXBlcigpLHRoaXMuaWQ9dCx0aGlzLmRpc3BhdGNoZXI9YSx0aGlzLnNldEV2ZW50ZWRQYXJlbnQocyksdGhpcy50eXBlPVwicmFzdGVyXCIsdGhpcy5taW56b29tPTAsdGhpcy5tYXh6b29tPTIyLHRoaXMucm91bmRab29tPSEwLHRoaXMuc2NoZW1lPVwieHl6XCIsdGhpcy50aWxlU2l6ZT01MTIsdGhpcy5fbG9hZGVkPSExLHRoaXMuX29wdGlvbnM9ZS5lKHt0eXBlOlwicmFzdGVyXCJ9LGkpLGUuZSh0aGlzLGUuTShpLFtcInVybFwiLFwic2NoZW1lXCIsXCJ0aWxlU2l6ZVwiXSkpO31sb2FkKCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2xvYWRlZD0hMSx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFsb2FkaW5nXCIse2RhdGFUeXBlOlwic291cmNlXCJ9KSksdGhpcy5fdGlsZUpTT05SZXF1ZXN0PW5ldyBBYm9ydENvbnRyb2xsZXI7dHJ5e2NvbnN0IHQ9eWllbGQgRyh0aGlzLl9vcHRpb25zLHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlcix0aGlzLl90aWxlSlNPTlJlcXVlc3QpO3RoaXMuX3RpbGVKU09OUmVxdWVzdD1udWxsLHRoaXMuX2xvYWRlZD0hMCx0JiYoZS5lKHRoaXMsdCksdC5ib3VuZHMmJih0aGlzLnRpbGVCb3VuZHM9bmV3IFcodC5ib3VuZHMsdGhpcy5taW56b29tLHRoaXMubWF4em9vbSkpLHRoaXMuZmlyZShuZXcgZS5rKFwiZGF0YVwiLHtkYXRhVHlwZTpcInNvdXJjZVwiLHNvdXJjZURhdGFUeXBlOlwibWV0YWRhdGFcIn0pKSx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFcIix7ZGF0YVR5cGU6XCJzb3VyY2VcIixzb3VyY2VEYXRhVHlwZTpcImNvbnRlbnRcIn0pKSk7fWNhdGNoKHQpe3RoaXMuX3RpbGVKU09OUmVxdWVzdD1udWxsLHRoaXMuZmlyZShuZXcgZS5qKHQpKTt9fSkpfWxvYWRlZCgpe3JldHVybiB0aGlzLl9sb2FkZWR9b25BZGQodCl7dGhpcy5tYXA9dCx0aGlzLmxvYWQoKTt9b25SZW1vdmUoKXt0aGlzLl90aWxlSlNPTlJlcXVlc3QmJih0aGlzLl90aWxlSlNPTlJlcXVlc3QuYWJvcnQoKSx0aGlzLl90aWxlSlNPTlJlcXVlc3Q9bnVsbCk7fXNldFNvdXJjZVByb3BlcnR5KHQpe3RoaXMuX3RpbGVKU09OUmVxdWVzdCYmKHRoaXMuX3RpbGVKU09OUmVxdWVzdC5hYm9ydCgpLHRoaXMuX3RpbGVKU09OUmVxdWVzdD1udWxsKSx0KCksdGhpcy5sb2FkKCk7fXNldFRpbGVzKHQpe3JldHVybiB0aGlzLnNldFNvdXJjZVByb3BlcnR5KCgoKT0+e3RoaXMuX29wdGlvbnMudGlsZXM9dDt9KSksdGhpc31zZXRVcmwodCl7cmV0dXJuIHRoaXMuc2V0U291cmNlUHJvcGVydHkoKCgpPT57dGhpcy51cmw9dCx0aGlzLl9vcHRpb25zLnVybD10O30pKSx0aGlzfXNlcmlhbGl6ZSgpe3JldHVybiBlLmUoe30sdGhpcy5fb3B0aW9ucyl9aGFzVGlsZSh0KXtyZXR1cm4gIXRoaXMudGlsZUJvdW5kc3x8dGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHQuY2Fub25pY2FsKX1sb2FkVGlsZSh0KXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT10LnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsdGhpcy5tYXAuZ2V0UGl4ZWxSYXRpbygpLHRoaXMuc2NoZW1lKTt0LmFib3J0Q29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyO3RyeXtjb25zdCBpPXlpZWxkIF8uZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QoZSxcIlRpbGVcIiksdC5hYm9ydENvbnRyb2xsZXIsdGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMpO2lmKGRlbGV0ZSB0LmFib3J0Q29udHJvbGxlcix0LmFib3J0ZWQpcmV0dXJuIHZvaWQodC5zdGF0ZT1cInVubG9hZGVkXCIpO2lmKGkmJmkuZGF0YSl7dGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMmJmkuY2FjaGVDb250cm9sJiZpLmV4cGlyZXMmJnQuc2V0RXhwaXJ5RGF0YSh7Y2FjaGVDb250cm9sOmkuY2FjaGVDb250cm9sLGV4cGlyZXM6aS5leHBpcmVzfSk7Y29uc3QgZT10aGlzLm1hcC5wYWludGVyLmNvbnRleHQsYT1lLmdsLHM9aS5kYXRhO3QudGV4dHVyZT10aGlzLm1hcC5wYWludGVyLmdldFRpbGVUZXh0dXJlKHMud2lkdGgpLHQudGV4dHVyZT90LnRleHR1cmUudXBkYXRlKHMse3VzZU1pcG1hcDohMH0pOih0LnRleHR1cmU9bmV3IGIoZSxzLGEuUkdCQSx7dXNlTWlwbWFwOiEwfSksdC50ZXh0dXJlLmJpbmQoYS5MSU5FQVIsYS5DTEFNUF9UT19FREdFLGEuTElORUFSX01JUE1BUF9ORUFSRVNUKSksdC5zdGF0ZT1cImxvYWRlZFwiO319Y2F0Y2goZSl7aWYoZGVsZXRlIHQuYWJvcnRDb250cm9sbGVyLHQuYWJvcnRlZCl0LnN0YXRlPVwidW5sb2FkZWRcIjtlbHNlIGlmKGUpdGhyb3cgdC5zdGF0ZT1cImVycm9yZWRcIixlfX0pKX1hYm9ydFRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3QuYWJvcnRDb250cm9sbGVyJiYodC5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKSxkZWxldGUgdC5hYm9ydENvbnRyb2xsZXIpO30pKX11bmxvYWRUaWxlKHQpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0LnRleHR1cmUmJnRoaXMubWFwLnBhaW50ZXIuc2F2ZVRpbGVUZXh0dXJlKHQudGV4dHVyZSk7fSkpfWhhc1RyYW5zaXRpb24oKXtyZXR1cm4gITF9fWNsYXNzIEsgZXh0ZW5kcyBYe2NvbnN0cnVjdG9yKHQsaSxhLHMpe3N1cGVyKHQsaSxhLHMpLHRoaXMudHlwZT1cInJhc3Rlci1kZW1cIix0aGlzLm1heHpvb209MjIsdGhpcy5fb3B0aW9ucz1lLmUoe3R5cGU6XCJyYXN0ZXItZGVtXCJ9LGkpLHRoaXMuZW5jb2Rpbmc9aS5lbmNvZGluZ3x8XCJtYXBib3hcIix0aGlzLnJlZEZhY3Rvcj1pLnJlZEZhY3Rvcix0aGlzLmdyZWVuRmFjdG9yPWkuZ3JlZW5GYWN0b3IsdGhpcy5ibHVlRmFjdG9yPWkuYmx1ZUZhY3Rvcix0aGlzLmJhc2VTaGlmdD1pLmJhc2VTaGlmdDt9bG9hZFRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGk9dC50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLHRoaXMubWFwLmdldFBpeGVsUmF0aW8oKSx0aGlzLnNjaGVtZSksYT10aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChpLFwiVGlsZVwiKTt0Lm5laWdoYm9yaW5nVGlsZXM9dGhpcy5fZ2V0TmVpZ2hib3JpbmdUaWxlcyh0LnRpbGVJRCksdC5hYm9ydENvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcjt0cnl7Y29uc3QgaT15aWVsZCBfLmdldEltYWdlKGEsdC5hYm9ydENvbnRyb2xsZXIsdGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMpO2lmKGRlbGV0ZSB0LmFib3J0Q29udHJvbGxlcix0LmFib3J0ZWQpcmV0dXJuIHZvaWQodC5zdGF0ZT1cInVubG9hZGVkXCIpO2lmKGkmJmkuZGF0YSl7Y29uc3QgYT1pLmRhdGE7dGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMmJmkuY2FjaGVDb250cm9sJiZpLmV4cGlyZXMmJnQuc2V0RXhwaXJ5RGF0YSh7Y2FjaGVDb250cm9sOmkuY2FjaGVDb250cm9sLGV4cGlyZXM6aS5leHBpcmVzfSk7Y29uc3Qgcz1lLmIoYSkmJmUuVSgpP2E6eWllbGQgdGhpcy5yZWFkSW1hZ2VOb3coYSksbz17dHlwZTp0aGlzLnR5cGUsdWlkOnQudWlkLHNvdXJjZTp0aGlzLmlkLHJhd0ltYWdlRGF0YTpzLGVuY29kaW5nOnRoaXMuZW5jb2RpbmcscmVkRmFjdG9yOnRoaXMucmVkRmFjdG9yLGdyZWVuRmFjdG9yOnRoaXMuZ3JlZW5GYWN0b3IsYmx1ZUZhY3Rvcjp0aGlzLmJsdWVGYWN0b3IsYmFzZVNoaWZ0OnRoaXMuYmFzZVNoaWZ0fTtpZighdC5hY3Rvcnx8XCJleHBpcmVkXCI9PT10LnN0YXRlKXt0LmFjdG9yPXRoaXMuZGlzcGF0Y2hlci5nZXRBY3RvcigpO2NvbnN0IGU9eWllbGQgdC5hY3Rvci5zZW5kQXN5bmMoe3R5cGU6XCJMRFRcIixkYXRhOm99KTt0LmRlbT1lLHQubmVlZHNIaWxsc2hhZGVQcmVwYXJlPSEwLHQubmVlZHNUZXJyYWluUHJlcGFyZT0hMCx0LnN0YXRlPVwibG9hZGVkXCI7fX19Y2F0Y2goZSl7aWYoZGVsZXRlIHQuYWJvcnRDb250cm9sbGVyLHQuYWJvcnRlZCl0LnN0YXRlPVwidW5sb2FkZWRcIjtlbHNlIGlmKGUpdGhyb3cgdC5zdGF0ZT1cImVycm9yZWRcIixlfX0pKX1yZWFkSW1hZ2VOb3codCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBWaWRlb0ZyYW1lJiZlLlYoKSl7Y29uc3QgaT10LndpZHRoKzIsYT10LmhlaWdodCsyO3RyeXtyZXR1cm4gbmV3IGUuUih7d2lkdGg6aSxoZWlnaHQ6YX0seWllbGQgZS5XKHQsLTEsLTEsaSxhKSl9Y2F0Y2godCl7fX1yZXR1cm4gby5nZXRJbWFnZURhdGEodCwxKX0pKX1fZ2V0TmVpZ2hib3JpbmdUaWxlcyh0KXtjb25zdCBpPXQuY2Fub25pY2FsLGE9TWF0aC5wb3coMixpLnopLHM9KGkueC0xK2EpJWEsbz0wPT09aS54P3Qud3JhcC0xOnQud3JhcCxyPShpLngrMSthKSVhLG49aS54KzE9PT1hP3Qud3JhcCsxOnQud3JhcCxsPXt9O3JldHVybiBsW25ldyBlLlModC5vdmVyc2NhbGVkWixvLGkueixzLGkueSkua2V5XT17YmFja2ZpbGxlZDohMX0sbFtuZXcgZS5TKHQub3ZlcnNjYWxlZFosbixpLnoscixpLnkpLmtleV09e2JhY2tmaWxsZWQ6ITF9LGkueT4wJiYobFtuZXcgZS5TKHQub3ZlcnNjYWxlZFosbyxpLnoscyxpLnktMSkua2V5XT17YmFja2ZpbGxlZDohMX0sbFtuZXcgZS5TKHQub3ZlcnNjYWxlZFosdC53cmFwLGkueixpLngsaS55LTEpLmtleV09e2JhY2tmaWxsZWQ6ITF9LGxbbmV3IGUuUyh0Lm92ZXJzY2FsZWRaLG4saS56LHIsaS55LTEpLmtleV09e2JhY2tmaWxsZWQ6ITF9KSxpLnkrMTxhJiYobFtuZXcgZS5TKHQub3ZlcnNjYWxlZFosbyxpLnoscyxpLnkrMSkua2V5XT17YmFja2ZpbGxlZDohMX0sbFtuZXcgZS5TKHQub3ZlcnNjYWxlZFosdC53cmFwLGkueixpLngsaS55KzEpLmtleV09e2JhY2tmaWxsZWQ6ITF9LGxbbmV3IGUuUyh0Lm92ZXJzY2FsZWRaLG4saS56LHIsaS55KzEpLmtleV09e2JhY2tmaWxsZWQ6ITF9KSxsfXVubG9hZFRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3QuZGVtVGV4dHVyZSYmdGhpcy5tYXAucGFpbnRlci5zYXZlVGlsZVRleHR1cmUodC5kZW1UZXh0dXJlKSx0LmZibyYmKHQuZmJvLmRlc3Ryb3koKSxkZWxldGUgdC5mYm8pLHQuZGVtJiZkZWxldGUgdC5kZW0sZGVsZXRlIHQubmVpZ2hib3JpbmdUaWxlcyx0LnN0YXRlPVwidW5sb2FkZWRcIix0LmFjdG9yJiYoeWllbGQgdC5hY3Rvci5zZW5kQXN5bmMoe3R5cGU6XCJSRFRcIixkYXRhOnt0eXBlOnRoaXMudHlwZSx1aWQ6dC51aWQsc291cmNlOnRoaXMuaWR9fSkpO30pKX19Y2xhc3MgSiBleHRlbmRzIGUuRXtjb25zdHJ1Y3Rvcih0LGksYSxzKXtzdXBlcigpLHRoaXMuaWQ9dCx0aGlzLnR5cGU9XCJnZW9qc29uXCIsdGhpcy5taW56b29tPTAsdGhpcy5tYXh6b29tPTE4LHRoaXMudGlsZVNpemU9NTEyLHRoaXMuaXNUaWxlQ2xpcHBlZD0hMCx0aGlzLnJlcGFyc2VPdmVyc2NhbGVkPSEwLHRoaXMuX3JlbW92ZWQ9ITEsdGhpcy5fcGVuZGluZ0xvYWRzPTAsdGhpcy5hY3Rvcj1hLmdldEFjdG9yKCksdGhpcy5zZXRFdmVudGVkUGFyZW50KHMpLHRoaXMuX2RhdGE9aS5kYXRhLHRoaXMuX29wdGlvbnM9ZS5lKHt9LGkpLHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZz1pLmNvbGxlY3RSZXNvdXJjZVRpbWluZyx2b2lkIDAhPT1pLm1heHpvb20mJih0aGlzLm1heHpvb209aS5tYXh6b29tKSxpLnR5cGUmJih0aGlzLnR5cGU9aS50eXBlKSxpLmF0dHJpYnV0aW9uJiYodGhpcy5hdHRyaWJ1dGlvbj1pLmF0dHJpYnV0aW9uKSx0aGlzLnByb21vdGVJZD1pLnByb21vdGVJZDtjb25zdCBvPWUuWC90aGlzLnRpbGVTaXplO3ZvaWQgMCE9PWkuY2x1c3Rlck1heFpvb20mJnRoaXMubWF4em9vbTw9aS5jbHVzdGVyTWF4Wm9vbSYmZS53KGBUaGUgbWF4em9vbSB2YWx1ZSBcIiR7dGhpcy5tYXh6b29tfVwiIGlzIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgY2x1c3Rlck1heFpvb20gdmFsdWUgXCIke2kuY2x1c3Rlck1heFpvb219XCIuYCksdGhpcy53b3JrZXJPcHRpb25zPWUuZSh7c291cmNlOnRoaXMuaWQsY2x1c3RlcjppLmNsdXN0ZXJ8fCExLGdlb2pzb25WdE9wdGlvbnM6e2J1ZmZlcjoodm9pZCAwIT09aS5idWZmZXI/aS5idWZmZXI6MTI4KSpvLHRvbGVyYW5jZToodm9pZCAwIT09aS50b2xlcmFuY2U/aS50b2xlcmFuY2U6LjM3NSkqbyxleHRlbnQ6ZS5YLG1heFpvb206dGhpcy5tYXh6b29tLGxpbmVNZXRyaWNzOmkubGluZU1ldHJpY3N8fCExLGdlbmVyYXRlSWQ6aS5nZW5lcmF0ZUlkfHwhMX0sc3VwZXJjbHVzdGVyT3B0aW9uczp7bWF4Wm9vbTp2b2lkIDAhPT1pLmNsdXN0ZXJNYXhab29tP2kuY2x1c3Rlck1heFpvb206dGhpcy5tYXh6b29tLTEsbWluUG9pbnRzOk1hdGgubWF4KDIsaS5jbHVzdGVyTWluUG9pbnRzfHwyKSxleHRlbnQ6ZS5YLHJhZGl1czooaS5jbHVzdGVyUmFkaXVzfHw1MCkqbyxsb2c6ITEsZ2VuZXJhdGVJZDppLmdlbmVyYXRlSWR8fCExfSxjbHVzdGVyUHJvcGVydGllczppLmNsdXN0ZXJQcm9wZXJ0aWVzLGZpbHRlcjppLmZpbHRlcn0saS53b3JrZXJPcHRpb25zKSxcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5wcm9tb3RlSWQmJih0aGlzLndvcmtlck9wdGlvbnMucHJvbW90ZUlkPXRoaXMucHJvbW90ZUlkKTt9bG9hZCgpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKCk7fSkpfW9uQWRkKHQpe3RoaXMubWFwPXQsdGhpcy5sb2FkKCk7fXNldERhdGEodCl7cmV0dXJuIHRoaXMuX2RhdGE9dCx0aGlzLl91cGRhdGVXb3JrZXJEYXRhKCksdGhpc311cGRhdGVEYXRhKHQpe3JldHVybiB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKHQpLHRoaXN9Z2V0RGF0YSgpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PWUuZSh7dHlwZTp0aGlzLnR5cGV9LHRoaXMud29ya2VyT3B0aW9ucyk7cmV0dXJuIHRoaXMuYWN0b3Iuc2VuZEFzeW5jKHt0eXBlOlwiR0RcIixkYXRhOnR9KX0pKX1zZXRDbHVzdGVyT3B0aW9ucyh0KXtyZXR1cm4gdGhpcy53b3JrZXJPcHRpb25zLmNsdXN0ZXI9dC5jbHVzdGVyLHQmJih2b2lkIDAhPT10LmNsdXN0ZXJSYWRpdXMmJih0aGlzLndvcmtlck9wdGlvbnMuc3VwZXJjbHVzdGVyT3B0aW9ucy5yYWRpdXM9dC5jbHVzdGVyUmFkaXVzKSx2b2lkIDAhPT10LmNsdXN0ZXJNYXhab29tJiYodGhpcy53b3JrZXJPcHRpb25zLnN1cGVyY2x1c3Rlck9wdGlvbnMubWF4Wm9vbT10LmNsdXN0ZXJNYXhab29tKSksdGhpcy5fdXBkYXRlV29ya2VyRGF0YSgpLHRoaXN9Z2V0Q2x1c3RlckV4cGFuc2lvblpvb20odCl7cmV0dXJuIHRoaXMuYWN0b3Iuc2VuZEFzeW5jKHt0eXBlOlwiR0NFWlwiLGRhdGE6e3R5cGU6dGhpcy50eXBlLGNsdXN0ZXJJZDp0LHNvdXJjZTp0aGlzLmlkfX0pfWdldENsdXN0ZXJDaGlsZHJlbih0KXtyZXR1cm4gdGhpcy5hY3Rvci5zZW5kQXN5bmMoe3R5cGU6XCJHQ0NcIixkYXRhOnt0eXBlOnRoaXMudHlwZSxjbHVzdGVySWQ6dCxzb3VyY2U6dGhpcy5pZH19KX1nZXRDbHVzdGVyTGVhdmVzKHQsZSxpKXtyZXR1cm4gdGhpcy5hY3Rvci5zZW5kQXN5bmMoe3R5cGU6XCJHQ0xcIixkYXRhOnt0eXBlOnRoaXMudHlwZSxzb3VyY2U6dGhpcy5pZCxjbHVzdGVySWQ6dCxsaW1pdDplLG9mZnNldDppfX0pfV91cGRhdGVXb3JrZXJEYXRhKHQpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBpPWUuZSh7dHlwZTp0aGlzLnR5cGV9LHRoaXMud29ya2VyT3B0aW9ucyk7dD9pLmRhdGFEaWZmPXQ6XCJzdHJpbmdcIj09dHlwZW9mIHRoaXMuX2RhdGE/KGkucmVxdWVzdD10aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChvLnJlc29sdmVVUkwodGhpcy5fZGF0YSksXCJTb3VyY2VcIiksaS5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZz10aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcpOmkuZGF0YT1KU09OLnN0cmluZ2lmeSh0aGlzLl9kYXRhKSx0aGlzLl9wZW5kaW5nTG9hZHMrKyx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFsb2FkaW5nXCIse2RhdGFUeXBlOlwic291cmNlXCJ9KSk7dHJ5e2NvbnN0IHQ9eWllbGQgdGhpcy5hY3Rvci5zZW5kQXN5bmMoe3R5cGU6XCJMRFwiLGRhdGE6aX0pO2lmKHRoaXMuX3BlbmRpbmdMb2Fkcy0tLHRoaXMuX3JlbW92ZWR8fHQuYWJhbmRvbmVkKXJldHVybiB2b2lkIHRoaXMuZmlyZShuZXcgZS5rKFwiZGF0YWFib3J0XCIse2RhdGFUeXBlOlwic291cmNlXCJ9KSk7bGV0IGE9bnVsbDt0LnJlc291cmNlVGltaW5nJiZ0LnJlc291cmNlVGltaW5nW3RoaXMuaWRdJiYoYT10LnJlc291cmNlVGltaW5nW3RoaXMuaWRdLnNsaWNlKDApKTtjb25zdCBzPXtkYXRhVHlwZTpcInNvdXJjZVwifTt0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcmJmEmJmEubGVuZ3RoPjAmJmUuZShzLHtyZXNvdXJjZVRpbWluZzphfSksdGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhXCIsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtzb3VyY2VEYXRhVHlwZTpcIm1ldGFkYXRhXCJ9KSkpLHRoaXMuZmlyZShuZXcgZS5rKFwiZGF0YVwiLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7c291cmNlRGF0YVR5cGU6XCJjb250ZW50XCJ9KSkpO31jYXRjaCh0KXtpZih0aGlzLl9wZW5kaW5nTG9hZHMtLSx0aGlzLl9yZW1vdmVkKXJldHVybiB2b2lkIHRoaXMuZmlyZShuZXcgZS5rKFwiZGF0YWFib3J0XCIse2RhdGFUeXBlOlwic291cmNlXCJ9KSk7dGhpcy5maXJlKG5ldyBlLmoodCkpO319KSl9bG9hZGVkKCl7cmV0dXJuIDA9PT10aGlzLl9wZW5kaW5nTG9hZHN9bG9hZFRpbGUodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9dC5hY3Rvcj9cIlJUXCI6XCJMVFwiO3QuYWN0b3I9dGhpcy5hY3Rvcjtjb25zdCBpPXt0eXBlOnRoaXMudHlwZSx1aWQ6dC51aWQsdGlsZUlEOnQudGlsZUlELHpvb206dC50aWxlSUQub3ZlcnNjYWxlZFosbWF4Wm9vbTp0aGlzLm1heHpvb20sdGlsZVNpemU6dGhpcy50aWxlU2l6ZSxzb3VyY2U6dGhpcy5pZCxwaXhlbFJhdGlvOnRoaXMubWFwLmdldFBpeGVsUmF0aW8oKSxzaG93Q29sbGlzaW9uQm94ZXM6dGhpcy5tYXAuc2hvd0NvbGxpc2lvbkJveGVzLHByb21vdGVJZDp0aGlzLnByb21vdGVJZH07dC5hYm9ydENvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcjtjb25zdCBhPXlpZWxkIHRoaXMuYWN0b3Iuc2VuZEFzeW5jKHt0eXBlOmUsZGF0YTppfSx0LmFib3J0Q29udHJvbGxlcik7ZGVsZXRlIHQuYWJvcnRDb250cm9sbGVyLHQudW5sb2FkVmVjdG9yRGF0YSgpLHQuYWJvcnRlZHx8dC5sb2FkVmVjdG9yRGF0YShhLHRoaXMubWFwLnBhaW50ZXIsXCJSVFwiPT09ZSk7fSkpfWFib3J0VGlsZSh0KXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dC5hYm9ydENvbnRyb2xsZXImJih0LmFib3J0Q29udHJvbGxlci5hYm9ydCgpLGRlbGV0ZSB0LmFib3J0Q29udHJvbGxlciksdC5hYm9ydGVkPSEwO30pKX11bmxvYWRUaWxlKHQpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0LnVubG9hZFZlY3RvckRhdGEoKSx5aWVsZCB0aGlzLmFjdG9yLnNlbmRBc3luYyh7dHlwZTpcIlJNVFwiLGRhdGE6e3VpZDp0LnVpZCx0eXBlOnRoaXMudHlwZSxzb3VyY2U6dGhpcy5pZH19KTt9KSl9b25SZW1vdmUoKXt0aGlzLl9yZW1vdmVkPSEwLHRoaXMuYWN0b3Iuc2VuZEFzeW5jKHt0eXBlOlwiUlNcIixkYXRhOnt0eXBlOnRoaXMudHlwZSxzb3VyY2U6dGhpcy5pZH19KTt9c2VyaWFsaXplKCl7cmV0dXJuIGUuZSh7fSx0aGlzLl9vcHRpb25zLHt0eXBlOnRoaXMudHlwZSxkYXRhOnRoaXMuX2RhdGF9KX1oYXNUcmFuc2l0aW9uKCl7cmV0dXJuICExfX12YXIgWT1lLlkoW3tuYW1lOlwiYV9wb3NcIix0eXBlOlwiSW50MTZcIixjb21wb25lbnRzOjJ9LHtuYW1lOlwiYV90ZXh0dXJlX3Bvc1wiLHR5cGU6XCJJbnQxNlwiLGNvbXBvbmVudHM6Mn1dKTtjbGFzcyBRIGV4dGVuZHMgZS5Fe2NvbnN0cnVjdG9yKHQsZSxpLGEpe3N1cGVyKCksdGhpcy5pZD10LHRoaXMuZGlzcGF0Y2hlcj1pLHRoaXMuY29vcmRpbmF0ZXM9ZS5jb29yZGluYXRlcyx0aGlzLnR5cGU9XCJpbWFnZVwiLHRoaXMubWluem9vbT0wLHRoaXMubWF4em9vbT0yMix0aGlzLnRpbGVTaXplPTUxMix0aGlzLnRpbGVzPXt9LHRoaXMuX2xvYWRlZD0hMSx0aGlzLnNldEV2ZW50ZWRQYXJlbnQoYSksdGhpcy5vcHRpb25zPWU7fWxvYWQodCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2xvYWRlZD0hMSx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFsb2FkaW5nXCIse2RhdGFUeXBlOlwic291cmNlXCJ9KSksdGhpcy51cmw9dGhpcy5vcHRpb25zLnVybCx0aGlzLl9yZXF1ZXN0PW5ldyBBYm9ydENvbnRyb2xsZXI7dHJ5e2NvbnN0IGU9eWllbGQgXy5nZXRJbWFnZSh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh0aGlzLnVybCxcIkltYWdlXCIpLHRoaXMuX3JlcXVlc3QpO3RoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9sb2FkZWQ9ITAsZSYmZS5kYXRhJiYodGhpcy5pbWFnZT1lLmRhdGEsdCYmKHRoaXMuY29vcmRpbmF0ZXM9dCksdGhpcy5fZmluaXNoTG9hZGluZygpKTt9Y2F0Y2godCl7dGhpcy5fcmVxdWVzdD1udWxsLHRoaXMuX2xvYWRlZD0hMCx0aGlzLmZpcmUobmV3IGUuaih0KSk7fX0pKX1sb2FkZWQoKXtyZXR1cm4gdGhpcy5fbG9hZGVkfXVwZGF0ZUltYWdlKHQpe3JldHVybiB0LnVybD8odGhpcy5fcmVxdWVzdCYmKHRoaXMuX3JlcXVlc3QuYWJvcnQoKSx0aGlzLl9yZXF1ZXN0PW51bGwpLHRoaXMub3B0aW9ucy51cmw9dC51cmwsdGhpcy5sb2FkKHQuY29vcmRpbmF0ZXMpLmZpbmFsbHkoKCgpPT57dGhpcy50ZXh0dXJlPW51bGw7fSkpLHRoaXMpOnRoaXN9X2ZpbmlzaExvYWRpbmcoKXt0aGlzLm1hcCYmKHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyksdGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhXCIse2RhdGFUeXBlOlwic291cmNlXCIsc291cmNlRGF0YVR5cGU6XCJtZXRhZGF0YVwifSkpKTt9b25BZGQodCl7dGhpcy5tYXA9dCx0aGlzLmxvYWQoKTt9b25SZW1vdmUoKXt0aGlzLl9yZXF1ZXN0JiYodGhpcy5fcmVxdWVzdC5hYm9ydCgpLHRoaXMuX3JlcXVlc3Q9bnVsbCk7fXNldENvb3JkaW5hdGVzKHQpe3RoaXMuY29vcmRpbmF0ZXM9dDtjb25zdCBpPXQubWFwKGUuWi5mcm9tTG5nTGF0KTt0aGlzLnRpbGVJRD1mdW5jdGlvbih0KXtsZXQgaT0xLzAsYT0xLzAscz0tMS8wLG89LTEvMDtmb3IoY29uc3QgZSBvZiB0KWk9TWF0aC5taW4oaSxlLngpLGE9TWF0aC5taW4oYSxlLnkpLHM9TWF0aC5tYXgocyxlLngpLG89TWF0aC5tYXgobyxlLnkpO2NvbnN0IHI9TWF0aC5tYXgocy1pLG8tYSksbj1NYXRoLm1heCgwLE1hdGguZmxvb3IoLU1hdGgubG9nKHIpL01hdGguTE4yKSksbD1NYXRoLnBvdygyLG4pO3JldHVybiBuZXcgZS5hMShuLE1hdGguZmxvb3IoKGkrcykvMipsKSxNYXRoLmZsb29yKChhK28pLzIqbCkpfShpKSx0aGlzLm1pbnpvb209dGhpcy5tYXh6b29tPXRoaXMudGlsZUlELno7Y29uc3QgYT1pLm1hcCgodD0+dGhpcy50aWxlSUQuZ2V0VGlsZVBvaW50KHQpLl9yb3VuZCgpKSk7cmV0dXJuIHRoaXMuX2JvdW5kc0FycmF5PW5ldyBlLiQsdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2soYVswXS54LGFbMF0ueSwwLDApLHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKGFbMV0ueCxhWzFdLnksZS5YLDApLHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKGFbM10ueCxhWzNdLnksMCxlLlgpLHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKGFbMl0ueCxhWzJdLnksZS5YLGUuWCksdGhpcy5ib3VuZHNCdWZmZXImJih0aGlzLmJvdW5kc0J1ZmZlci5kZXN0cm95KCksZGVsZXRlIHRoaXMuYm91bmRzQnVmZmVyKSx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFcIix7ZGF0YVR5cGU6XCJzb3VyY2VcIixzb3VyY2VEYXRhVHlwZTpcImNvbnRlbnRcIn0pKSx0aGlzfXByZXBhcmUoKXtpZigwPT09T2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RofHwhdGhpcy5pbWFnZSlyZXR1cm47Y29uc3QgdD10aGlzLm1hcC5wYWludGVyLmNvbnRleHQsaT10LmdsO3RoaXMuYm91bmRzQnVmZmVyfHwodGhpcy5ib3VuZHNCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksWS5tZW1iZXJzKSksdGhpcy5ib3VuZHNTZWdtZW50c3x8KHRoaXMuYm91bmRzU2VnbWVudHM9ZS5hMC5zaW1wbGVTZWdtZW50KDAsMCw0LDIpKSx0aGlzLnRleHR1cmV8fCh0aGlzLnRleHR1cmU9bmV3IGIodCx0aGlzLmltYWdlLGkuUkdCQSksdGhpcy50ZXh0dXJlLmJpbmQoaS5MSU5FQVIsaS5DTEFNUF9UT19FREdFKSk7bGV0IGE9ITE7Zm9yKGNvbnN0IHQgaW4gdGhpcy50aWxlcyl7Y29uc3QgZT10aGlzLnRpbGVzW3RdO1wibG9hZGVkXCIhPT1lLnN0YXRlJiYoZS5zdGF0ZT1cImxvYWRlZFwiLGUudGV4dHVyZT10aGlzLnRleHR1cmUsYT0hMCk7fWEmJnRoaXMuZmlyZShuZXcgZS5rKFwiZGF0YVwiLHtkYXRhVHlwZTpcInNvdXJjZVwiLHNvdXJjZURhdGFUeXBlOlwiaWRsZVwiLHNvdXJjZUlkOnRoaXMuaWR9KSk7fWxvYWRUaWxlKHQpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnRpbGVJRCYmdGhpcy50aWxlSUQuZXF1YWxzKHQudGlsZUlELmNhbm9uaWNhbCk/KHRoaXMudGlsZXNbU3RyaW5nKHQudGlsZUlELndyYXApXT10LHQuYnVja2V0cz17fSk6dC5zdGF0ZT1cImVycm9yZWRcIjt9KSl9c2VyaWFsaXplKCl7cmV0dXJuIHt0eXBlOlwiaW1hZ2VcIix1cmw6dGhpcy5vcHRpb25zLnVybCxjb29yZGluYXRlczp0aGlzLmNvb3JkaW5hdGVzfX1oYXNUcmFuc2l0aW9uKCl7cmV0dXJuICExfX1jbGFzcyB0dCBleHRlbmRzIFF7Y29uc3RydWN0b3IodCxlLGksYSl7c3VwZXIodCxlLGksYSksdGhpcy5yb3VuZFpvb209ITAsdGhpcy50eXBlPVwidmlkZW9cIix0aGlzLm9wdGlvbnM9ZTt9bG9hZCgpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9sb2FkZWQ9ITE7Y29uc3QgdD10aGlzLm9wdGlvbnM7dGhpcy51cmxzPVtdO2Zvcihjb25zdCBlIG9mIHQudXJscyl0aGlzLnVybHMucHVzaCh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChlLFwiU291cmNlXCIpLnVybCk7dHJ5e2NvbnN0IHQ9eWllbGQgZS5hMyh0aGlzLnVybHMpO2lmKHRoaXMuX2xvYWRlZD0hMCwhdClyZXR1cm47dGhpcy52aWRlbz10LHRoaXMudmlkZW8ubG9vcD0hMCx0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJwbGF5aW5nXCIsKCgpPT57dGhpcy5tYXAudHJpZ2dlclJlcGFpbnQoKTt9KSksdGhpcy5tYXAmJnRoaXMudmlkZW8ucGxheSgpLHRoaXMuX2ZpbmlzaExvYWRpbmcoKTt9Y2F0Y2godCl7dGhpcy5maXJlKG5ldyBlLmoodCkpO319KSl9cGF1c2UoKXt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLnBhdXNlKCk7fXBsYXkoKXt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLnBsYXkoKTt9c2Vlayh0KXtpZih0aGlzLnZpZGVvKXtjb25zdCBpPXRoaXMudmlkZW8uc2Vla2FibGU7dDxpLnN0YXJ0KDApfHx0PmkuZW5kKDApP3RoaXMuZmlyZShuZXcgZS5qKG5ldyBlLmEyKGBzb3VyY2VzLiR7dGhpcy5pZH1gLG51bGwsYFBsYXliYWNrIGZvciB0aGlzIHZpZGVvIGNhbiBiZSBzZXQgb25seSBiZXR3ZWVuIHRoZSAke2kuc3RhcnQoMCl9IGFuZCAke2kuZW5kKDApfS1zZWNvbmQgbWFyay5gKSkpOnRoaXMudmlkZW8uY3VycmVudFRpbWU9dDt9fWdldFZpZGVvKCl7cmV0dXJuIHRoaXMudmlkZW99b25BZGQodCl7dGhpcy5tYXB8fCh0aGlzLm1hcD10LHRoaXMubG9hZCgpLHRoaXMudmlkZW8mJih0aGlzLnZpZGVvLnBsYXkoKSx0aGlzLnNldENvb3JkaW5hdGVzKHRoaXMuY29vcmRpbmF0ZXMpKSk7fXByZXBhcmUoKXtpZigwPT09T2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RofHx0aGlzLnZpZGVvLnJlYWR5U3RhdGU8MilyZXR1cm47Y29uc3QgdD10aGlzLm1hcC5wYWludGVyLmNvbnRleHQsaT10LmdsO3RoaXMuYm91bmRzQnVmZmVyfHwodGhpcy5ib3VuZHNCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksWS5tZW1iZXJzKSksdGhpcy5ib3VuZHNTZWdtZW50c3x8KHRoaXMuYm91bmRzU2VnbWVudHM9ZS5hMC5zaW1wbGVTZWdtZW50KDAsMCw0LDIpKSx0aGlzLnRleHR1cmU/dGhpcy52aWRlby5wYXVzZWR8fCh0aGlzLnRleHR1cmUuYmluZChpLkxJTkVBUixpLkNMQU1QX1RPX0VER0UpLGkudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsMCwwLDAsaS5SR0JBLGkuVU5TSUdORURfQllURSx0aGlzLnZpZGVvKSk6KHRoaXMudGV4dHVyZT1uZXcgYih0LHRoaXMudmlkZW8saS5SR0JBKSx0aGlzLnRleHR1cmUuYmluZChpLkxJTkVBUixpLkNMQU1QX1RPX0VER0UpKTtsZXQgYT0hMTtmb3IoY29uc3QgdCBpbiB0aGlzLnRpbGVzKXtjb25zdCBlPXRoaXMudGlsZXNbdF07XCJsb2FkZWRcIiE9PWUuc3RhdGUmJihlLnN0YXRlPVwibG9hZGVkXCIsZS50ZXh0dXJlPXRoaXMudGV4dHVyZSxhPSEwKTt9YSYmdGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhXCIse2RhdGFUeXBlOlwic291cmNlXCIsc291cmNlRGF0YVR5cGU6XCJpZGxlXCIsc291cmNlSWQ6dGhpcy5pZH0pKTt9c2VyaWFsaXplKCl7cmV0dXJuIHt0eXBlOlwidmlkZW9cIix1cmxzOnRoaXMudXJscyxjb29yZGluYXRlczp0aGlzLmNvb3JkaW5hdGVzfX1oYXNUcmFuc2l0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW8mJiF0aGlzLnZpZGVvLnBhdXNlZH19Y2xhc3MgZXQgZXh0ZW5kcyBRe2NvbnN0cnVjdG9yKHQsaSxhLHMpe3N1cGVyKHQsaSxhLHMpLGkuY29vcmRpbmF0ZXM/QXJyYXkuaXNBcnJheShpLmNvb3JkaW5hdGVzKSYmND09PWkuY29vcmRpbmF0ZXMubGVuZ3RoJiYhaS5jb29yZGluYXRlcy5zb21lKCh0PT4hQXJyYXkuaXNBcnJheSh0KXx8MiE9PXQubGVuZ3RofHx0LnNvbWUoKHQ9PlwibnVtYmVyXCIhPXR5cGVvZiB0KSkpKXx8dGhpcy5maXJlKG5ldyBlLmoobmV3IGUuYTIoYHNvdXJjZXMuJHt0fWAsbnVsbCwnXCJjb29yZGluYXRlc1wiIHByb3BlcnR5IG11c3QgYmUgYW4gYXJyYXkgb2YgNCBsb25naXR1ZGUvbGF0aXR1ZGUgYXJyYXkgcGFpcnMnKSkpOnRoaXMuZmlyZShuZXcgZS5qKG5ldyBlLmEyKGBzb3VyY2VzLiR7dH1gLG51bGwsJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJjb29yZGluYXRlc1wiJykpKSxpLmFuaW1hdGUmJlwiYm9vbGVhblwiIT10eXBlb2YgaS5hbmltYXRlJiZ0aGlzLmZpcmUobmV3IGUuaihuZXcgZS5hMihgc291cmNlcy4ke3R9YCxudWxsLCdvcHRpb25hbCBcImFuaW1hdGVcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZScpKSksaS5jYW52YXM/XCJzdHJpbmdcIj09dHlwZW9mIGkuY2FudmFzfHxpLmNhbnZhcyBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0aGlzLmZpcmUobmV3IGUuaihuZXcgZS5hMihgc291cmNlcy4ke3R9YCxudWxsLCdcImNhbnZhc1wiIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhlIGNhbnZhcyBlbGVtZW50IGZyb20gd2hpY2ggdG8gcmVhZCwgb3IgYW4gSFRNTENhbnZhc0VsZW1lbnQgaW5zdGFuY2UnKSkpOnRoaXMuZmlyZShuZXcgZS5qKG5ldyBlLmEyKGBzb3VyY2VzLiR7dH1gLG51bGwsJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJjYW52YXNcIicpKSksdGhpcy5vcHRpb25zPWksdGhpcy5hbmltYXRlPXZvaWQgMD09PWkuYW5pbWF0ZXx8aS5hbmltYXRlO31sb2FkKCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2xvYWRlZD0hMCx0aGlzLmNhbnZhc3x8KHRoaXMuY2FudmFzPXRoaXMub3B0aW9ucy5jYW52YXMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudD90aGlzLm9wdGlvbnMuY2FudmFzOmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5jYW52YXMpKSx0aGlzLndpZHRoPXRoaXMuY2FudmFzLndpZHRoLHRoaXMuaGVpZ2h0PXRoaXMuY2FudmFzLmhlaWdodCx0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpP3RoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihcIkNhbnZhcyBkaW1lbnNpb25zIGNhbm5vdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVyby5cIikpKToodGhpcy5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5fcGxheWluZz0hMCx0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO30sdGhpcy5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX3BsYXlpbmcmJih0aGlzLnByZXBhcmUoKSx0aGlzLl9wbGF5aW5nPSExKTt9LHRoaXMuX2ZpbmlzaExvYWRpbmcoKSk7fSkpfWdldENhbnZhcygpe3JldHVybiB0aGlzLmNhbnZhc31vbkFkZCh0KXt0aGlzLm1hcD10LHRoaXMubG9hZCgpLHRoaXMuY2FudmFzJiZ0aGlzLmFuaW1hdGUmJnRoaXMucGxheSgpO31vblJlbW92ZSgpe3RoaXMucGF1c2UoKTt9cHJlcGFyZSgpe2xldCB0PSExO2lmKHRoaXMuY2FudmFzLndpZHRoIT09dGhpcy53aWR0aCYmKHRoaXMud2lkdGg9dGhpcy5jYW52YXMud2lkdGgsdD0hMCksdGhpcy5jYW52YXMuaGVpZ2h0IT09dGhpcy5oZWlnaHQmJih0aGlzLmhlaWdodD10aGlzLmNhbnZhcy5oZWlnaHQsdD0hMCksdGhpcy5faGFzSW52YWxpZERpbWVuc2lvbnMoKSlyZXR1cm47aWYoMD09PU9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aClyZXR1cm47Y29uc3QgaT10aGlzLm1hcC5wYWludGVyLmNvbnRleHQsYT1pLmdsO3RoaXMuYm91bmRzQnVmZmVyfHwodGhpcy5ib3VuZHNCdWZmZXI9aS5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksWS5tZW1iZXJzKSksdGhpcy5ib3VuZHNTZWdtZW50c3x8KHRoaXMuYm91bmRzU2VnbWVudHM9ZS5hMC5zaW1wbGVTZWdtZW50KDAsMCw0LDIpKSx0aGlzLnRleHR1cmU/KHR8fHRoaXMuX3BsYXlpbmcpJiZ0aGlzLnRleHR1cmUudXBkYXRlKHRoaXMuY2FudmFzLHtwcmVtdWx0aXBseTohMH0pOnRoaXMudGV4dHVyZT1uZXcgYihpLHRoaXMuY2FudmFzLGEuUkdCQSx7cHJlbXVsdGlwbHk6ITB9KTtsZXQgcz0hMTtmb3IoY29uc3QgdCBpbiB0aGlzLnRpbGVzKXtjb25zdCBlPXRoaXMudGlsZXNbdF07XCJsb2FkZWRcIiE9PWUuc3RhdGUmJihlLnN0YXRlPVwibG9hZGVkXCIsZS50ZXh0dXJlPXRoaXMudGV4dHVyZSxzPSEwKTt9cyYmdGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhXCIse2RhdGFUeXBlOlwic291cmNlXCIsc291cmNlRGF0YVR5cGU6XCJpZGxlXCIsc291cmNlSWQ6dGhpcy5pZH0pKTt9c2VyaWFsaXplKCl7cmV0dXJuIHt0eXBlOlwiY2FudmFzXCIsY29vcmRpbmF0ZXM6dGhpcy5jb29yZGluYXRlc319aGFzVHJhbnNpdGlvbigpe3JldHVybiB0aGlzLl9wbGF5aW5nfV9oYXNJbnZhbGlkRGltZW5zaW9ucygpe2Zvcihjb25zdCB0IG9mIFt0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHRdKWlmKGlzTmFOKHQpfHx0PD0wKXJldHVybiAhMDtyZXR1cm4gITF9fWNvbnN0IGl0PXt9LGF0PXQ9Pntzd2l0Y2godCl7Y2FzZVwiZ2VvanNvblwiOnJldHVybiBKO2Nhc2VcImltYWdlXCI6cmV0dXJuIFE7Y2FzZVwicmFzdGVyXCI6cmV0dXJuIFg7Y2FzZVwicmFzdGVyLWRlbVwiOnJldHVybiBLO2Nhc2VcInZlY3RvclwiOnJldHVybiAkO2Nhc2VcInZpZGVvXCI6cmV0dXJuIHR0O2Nhc2VcImNhbnZhc1wiOnJldHVybiBldH1yZXR1cm4gaXRbdF19LHN0PVwiUlRMUGx1Z2luTG9hZGVkXCI7Y2xhc3Mgb3QgZXh0ZW5kcyBlLkV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc3RhdHVzPVwidW5hdmFpbGFibGVcIix0aGlzLnVybD1udWxsLHRoaXMuZGlzcGF0Y2hlcj1qKCk7fV9zeW5jU3RhdGUodCl7cmV0dXJuIHRoaXMuc3RhdHVzPXQsdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcIlNSUFNcIix7cGx1Z2luU3RhdHVzOnQscGx1Z2luVVJMOnRoaXMudXJsfSkuY2F0Y2goKHQ9Pnt0aHJvdyB0aGlzLnN0YXR1cz1cImVycm9yXCIsdH0pKX1nZXRSVExUZXh0UGx1Z2luU3RhdHVzKCl7cmV0dXJuIHRoaXMuc3RhdHVzfWNsZWFyUlRMVGV4dFBsdWdpbigpe3RoaXMuc3RhdHVzPVwidW5hdmFpbGFibGVcIix0aGlzLnVybD1udWxsO31zZXRSVExUZXh0UGx1Z2luKHQpe3JldHVybiBlLl8odGhpcyxhcmd1bWVudHMsdm9pZCAwLChmdW5jdGlvbioodCxlPSExKXtpZih0aGlzLnVybCl0aHJvdyBuZXcgRXJyb3IoXCJzZXRSVExUZXh0UGx1Z2luIGNhbm5vdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuXCIpO2lmKHRoaXMudXJsPW8ucmVzb2x2ZVVSTCh0KSwhdGhpcy51cmwpdGhyb3cgbmV3IEVycm9yKGByZXF1ZXN0ZWQgdXJsICR7dH0gaXMgaW52YWxpZGApO2lmKFwidW5hdmFpbGFibGVcIj09PXRoaXMuc3RhdHVzKXtpZighZSlyZXR1cm4gdGhpcy5fcmVxdWVzdEltcG9ydCgpO3RoaXMuc3RhdHVzPVwiZGVmZXJyZWRcIix0aGlzLl9zeW5jU3RhdGUodGhpcy5zdGF0dXMpO31lbHNlIGlmKFwicmVxdWVzdGVkXCI9PT10aGlzLnN0YXR1cylyZXR1cm4gdGhpcy5fcmVxdWVzdEltcG9ydCgpfSkpfV9yZXF1ZXN0SW1wb3J0KCl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N5bmNTdGF0ZShcImxvYWRpbmdcIiksdGhpcy5zdGF0dXM9XCJsb2FkZWRcIix0aGlzLmZpcmUobmV3IGUuayhzdCkpO30pKX1sYXp5TG9hZCgpe1widW5hdmFpbGFibGVcIj09PXRoaXMuc3RhdHVzP3RoaXMuc3RhdHVzPVwicmVxdWVzdGVkXCI6XCJkZWZlcnJlZFwiPT09dGhpcy5zdGF0dXMmJnRoaXMuX3JlcXVlc3RJbXBvcnQoKTt9fWxldCBydD1udWxsO2Z1bmN0aW9uIG50KCl7cmV0dXJuIHJ0fHwocnQ9bmV3IG90KSxydH1jbGFzcyBsdHtjb25zdHJ1Y3Rvcih0LGkpe3RoaXMudGltZUFkZGVkPTAsdGhpcy5mYWRlRW5kVGltZT0wLHRoaXMudGlsZUlEPXQsdGhpcy51aWQ9ZS5hNCgpLHRoaXMudXNlcz0wLHRoaXMudGlsZVNpemU9aSx0aGlzLmJ1Y2tldHM9e30sdGhpcy5leHBpcmF0aW9uVGltZT1udWxsLHRoaXMucXVlcnlQYWRkaW5nPTAsdGhpcy5oYXNTeW1ib2xCdWNrZXRzPSExLHRoaXMuaGFzUlRMVGV4dD0hMSx0aGlzLmRlcGVuZGVuY2llcz17fSx0aGlzLnJ0dD1bXSx0aGlzLnJ0dENvb3Jkcz17fSx0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLnN0YXRlPVwibG9hZGluZ1wiO31yZWdpc3RlckZhZGVEdXJhdGlvbih0KXtjb25zdCBlPXQrdGhpcy50aW1lQWRkZWQ7ZTx0aGlzLmZhZGVFbmRUaW1lfHwodGhpcy5mYWRlRW5kVGltZT1lKTt9d2FzUmVxdWVzdGVkKCl7cmV0dXJuIFwiZXJyb3JlZFwiPT09dGhpcy5zdGF0ZXx8XCJsb2FkZWRcIj09PXRoaXMuc3RhdGV8fFwicmVsb2FkaW5nXCI9PT10aGlzLnN0YXRlfWNsZWFyVGV4dHVyZXModCl7dGhpcy5kZW1UZXh0dXJlJiZ0LnNhdmVUaWxlVGV4dHVyZSh0aGlzLmRlbVRleHR1cmUpLHRoaXMuZGVtVGV4dHVyZT1udWxsO31sb2FkVmVjdG9yRGF0YSh0LGksYSl7aWYodGhpcy5oYXNEYXRhKCkmJnRoaXMudW5sb2FkVmVjdG9yRGF0YSgpLHRoaXMuc3RhdGU9XCJsb2FkZWRcIix0KXt0LmZlYXR1cmVJbmRleCYmKHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4PXQuZmVhdHVyZUluZGV4LHQucmF3VGlsZURhdGE/KHRoaXMubGF0ZXN0UmF3VGlsZURhdGE9dC5yYXdUaWxlRGF0YSx0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YT10LnJhd1RpbGVEYXRhKTp0aGlzLmxhdGVzdFJhd1RpbGVEYXRhJiYodGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGE9dGhpcy5sYXRlc3RSYXdUaWxlRGF0YSkpLHRoaXMuY29sbGlzaW9uQm94QXJyYXk9dC5jb2xsaXNpb25Cb3hBcnJheSx0aGlzLmJ1Y2tldHM9ZnVuY3Rpb24odCxlKXtjb25zdCBpPXt9O2lmKCFlKXJldHVybiBpO2Zvcihjb25zdCBhIG9mIHQpe2NvbnN0IHQ9YS5sYXllcklkcy5tYXAoKHQ9PmUuZ2V0TGF5ZXIodCkpKS5maWx0ZXIoQm9vbGVhbik7aWYoMCE9PXQubGVuZ3RoKXthLmxheWVycz10LGEuc3RhdGVEZXBlbmRlbnRMYXllcklkcyYmKGEuc3RhdGVEZXBlbmRlbnRMYXllcnM9YS5zdGF0ZURlcGVuZGVudExheWVySWRzLm1hcCgoZT0+dC5maWx0ZXIoKHQ9PnQuaWQ9PT1lKSlbMF0pKSk7Zm9yKGNvbnN0IGUgb2YgdClpW2UuaWRdPWE7fX1yZXR1cm4gaX0odC5idWNrZXRzLGkuc3R5bGUpLHRoaXMuaGFzU3ltYm9sQnVja2V0cz0hMTtmb3IoY29uc3QgdCBpbiB0aGlzLmJ1Y2tldHMpe2NvbnN0IGk9dGhpcy5idWNrZXRzW3RdO2lmKGkgaW5zdGFuY2VvZiBlLmE2KXtpZih0aGlzLmhhc1N5bWJvbEJ1Y2tldHM9ITAsIWEpYnJlYWs7aS5qdXN0UmVsb2FkZWQ9ITA7fX1pZih0aGlzLmhhc1JUTFRleHQ9ITEsdGhpcy5oYXNTeW1ib2xCdWNrZXRzKWZvcihjb25zdCB0IGluIHRoaXMuYnVja2V0cyl7Y29uc3QgaT10aGlzLmJ1Y2tldHNbdF07aWYoaSBpbnN0YW5jZW9mIGUuYTYmJmkuaGFzUlRMVGV4dCl7dGhpcy5oYXNSVExUZXh0PSEwLG50KCkubGF6eUxvYWQoKTticmVha319dGhpcy5xdWVyeVBhZGRpbmc9MDtmb3IoY29uc3QgdCBpbiB0aGlzLmJ1Y2tldHMpe2NvbnN0IGU9dGhpcy5idWNrZXRzW3RdO3RoaXMucXVlcnlQYWRkaW5nPU1hdGgubWF4KHRoaXMucXVlcnlQYWRkaW5nLGkuc3R5bGUuZ2V0TGF5ZXIodCkucXVlcnlSYWRpdXMoZSkpO310LmltYWdlQXRsYXMmJih0aGlzLmltYWdlQXRsYXM9dC5pbWFnZUF0bGFzKSx0LmdseXBoQXRsYXNJbWFnZSYmKHRoaXMuZ2x5cGhBdGxhc0ltYWdlPXQuZ2x5cGhBdGxhc0ltYWdlKTt9ZWxzZSB0aGlzLmNvbGxpc2lvbkJveEFycmF5PW5ldyBlLmE1O311bmxvYWRWZWN0b3JEYXRhKCl7Zm9yKGNvbnN0IHQgaW4gdGhpcy5idWNrZXRzKXRoaXMuYnVja2V0c1t0XS5kZXN0cm95KCk7dGhpcy5idWNrZXRzPXt9LHRoaXMuaW1hZ2VBdGxhc1RleHR1cmUmJnRoaXMuaW1hZ2VBdGxhc1RleHR1cmUuZGVzdHJveSgpLHRoaXMuaW1hZ2VBdGxhcyYmKHRoaXMuaW1hZ2VBdGxhcz1udWxsKSx0aGlzLmdseXBoQXRsYXNUZXh0dXJlJiZ0aGlzLmdseXBoQXRsYXNUZXh0dXJlLmRlc3Ryb3koKSx0aGlzLmxhdGVzdEZlYXR1cmVJbmRleD1udWxsLHRoaXMuc3RhdGU9XCJ1bmxvYWRlZFwiO31nZXRCdWNrZXQodCl7cmV0dXJuIHRoaXMuYnVja2V0c1t0LmlkXX11cGxvYWQodCl7Zm9yKGNvbnN0IGUgaW4gdGhpcy5idWNrZXRzKXtjb25zdCBpPXRoaXMuYnVja2V0c1tlXTtpLnVwbG9hZFBlbmRpbmcoKSYmaS51cGxvYWQodCk7fWNvbnN0IGU9dC5nbDt0aGlzLmltYWdlQXRsYXMmJiF0aGlzLmltYWdlQXRsYXMudXBsb2FkZWQmJih0aGlzLmltYWdlQXRsYXNUZXh0dXJlPW5ldyBiKHQsdGhpcy5pbWFnZUF0bGFzLmltYWdlLGUuUkdCQSksdGhpcy5pbWFnZUF0bGFzLnVwbG9hZGVkPSEwKSx0aGlzLmdseXBoQXRsYXNJbWFnZSYmKHRoaXMuZ2x5cGhBdGxhc1RleHR1cmU9bmV3IGIodCx0aGlzLmdseXBoQXRsYXNJbWFnZSxlLkFMUEhBKSx0aGlzLmdseXBoQXRsYXNJbWFnZT1udWxsKTt9cHJlcGFyZSh0KXt0aGlzLmltYWdlQXRsYXMmJnRoaXMuaW1hZ2VBdGxhcy5wYXRjaFVwZGF0ZWRJbWFnZXModCx0aGlzLmltYWdlQXRsYXNUZXh0dXJlKTt9cXVlcnlSZW5kZXJlZEZlYXR1cmVzKHQsZSxpLGEscyxvLHIsbixsLGgpe3JldHVybiB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCYmdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGE/dGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucXVlcnkoe3F1ZXJ5R2VvbWV0cnk6YSxjYW1lcmFRdWVyeUdlb21ldHJ5OnMsc2NhbGU6byx0aWxlU2l6ZTp0aGlzLnRpbGVTaXplLHBpeGVsUG9zTWF0cml4OmgsdHJhbnNmb3JtOm4scGFyYW1zOnIscXVlcnlQYWRkaW5nOnRoaXMucXVlcnlQYWRkaW5nKmx9LHQsZSxpKTp7fX1xdWVyeVNvdXJjZUZlYXR1cmVzKHQsaSl7Y29uc3QgYT10aGlzLmxhdGVzdEZlYXR1cmVJbmRleDtpZighYXx8IWEucmF3VGlsZURhdGEpcmV0dXJuO2NvbnN0IHM9YS5sb2FkVlRMYXllcnMoKSxvPWkmJmkuc291cmNlTGF5ZXI/aS5zb3VyY2VMYXllcjpcIlwiLHI9cy5fZ2VvanNvblRpbGVMYXllcnx8c1tvXTtpZighcilyZXR1cm47Y29uc3Qgbj1lLmE3KGkmJmkuZmlsdGVyKSx7ejpsLHg6aCx5OmN9PXRoaXMudGlsZUlELmNhbm9uaWNhbCx1PXt6OmwseDpoLHk6Y307Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspe2NvbnN0IHM9ci5mZWF0dXJlKGkpO2lmKG4ubmVlZEdlb21ldHJ5KXtjb25zdCB0PWUuYTgocywhMCk7aWYoIW4uZmlsdGVyKG5ldyBlLnoodGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLHQsdGhpcy50aWxlSUQuY2Fub25pY2FsKSljb250aW51ZX1lbHNlIGlmKCFuLmZpbHRlcihuZXcgZS56KHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSxzKSljb250aW51ZTtjb25zdCBkPWEuZ2V0SWQocyxvKSxfPW5ldyBlLmE5KHMsbCxoLGMsZCk7Xy50aWxlPXUsdC5wdXNoKF8pO319aGFzRGF0YSgpe3JldHVybiBcImxvYWRlZFwiPT09dGhpcy5zdGF0ZXx8XCJyZWxvYWRpbmdcIj09PXRoaXMuc3RhdGV8fFwiZXhwaXJlZFwiPT09dGhpcy5zdGF0ZX1wYXR0ZXJuc0xvYWRlZCgpe3JldHVybiB0aGlzLmltYWdlQXRsYXMmJiEhT2JqZWN0LmtleXModGhpcy5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnMpLmxlbmd0aH1zZXRFeHBpcnlEYXRhKHQpe2NvbnN0IGk9dGhpcy5leHBpcmF0aW9uVGltZTtpZih0LmNhY2hlQ29udHJvbCl7Y29uc3QgaT1lLmFhKHQuY2FjaGVDb250cm9sKTtpW1wibWF4LWFnZVwiXSYmKHRoaXMuZXhwaXJhdGlvblRpbWU9RGF0ZS5ub3coKSsxZTMqaVtcIm1heC1hZ2VcIl0pO31lbHNlIHQuZXhwaXJlcyYmKHRoaXMuZXhwaXJhdGlvblRpbWU9bmV3IERhdGUodC5leHBpcmVzKS5nZXRUaW1lKCkpO2lmKHRoaXMuZXhwaXJhdGlvblRpbWUpe2NvbnN0IHQ9RGF0ZS5ub3coKTtsZXQgZT0hMTtpZih0aGlzLmV4cGlyYXRpb25UaW1lPnQpZT0hMTtlbHNlIGlmKGkpaWYodGhpcy5leHBpcmF0aW9uVGltZTxpKWU9ITA7ZWxzZSB7Y29uc3QgYT10aGlzLmV4cGlyYXRpb25UaW1lLWk7YT90aGlzLmV4cGlyYXRpb25UaW1lPXQrTWF0aC5tYXgoYSwzZTQpOmU9ITA7fWVsc2UgZT0hMDtlPyh0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQrKyx0aGlzLnN0YXRlPVwiZXhwaXJlZFwiKTp0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQ9MDt9fWdldEV4cGlyeVRpbWVvdXQoKXtpZih0aGlzLmV4cGlyYXRpb25UaW1lKXJldHVybiB0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQ/MWUzKigxPDxNYXRoLm1pbih0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQtMSwzMSkpOk1hdGgubWluKHRoaXMuZXhwaXJhdGlvblRpbWUtKG5ldyBEYXRlKS5nZXRUaW1lKCksTWF0aC5wb3coMiwzMSktMSl9c2V0RmVhdHVyZVN0YXRlKHQsZSl7aWYoIXRoaXMubGF0ZXN0RmVhdHVyZUluZGV4fHwhdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGF8fDA9PT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuO2NvbnN0IGk9dGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgubG9hZFZUTGF5ZXJzKCk7Zm9yKGNvbnN0IGEgaW4gdGhpcy5idWNrZXRzKXtpZighZS5zdHlsZS5oYXNMYXllcihhKSljb250aW51ZTtjb25zdCBzPXRoaXMuYnVja2V0c1thXSxvPXMubGF5ZXJzWzBdLnNvdXJjZUxheWVyfHxcIl9nZW9qc29uVGlsZUxheWVyXCIscj1pW29dLG49dFtvXTtpZighcnx8IW58fDA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpY29udGludWU7cy51cGRhdGUobixyLHRoaXMuaW1hZ2VBdGxhcyYmdGhpcy5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnN8fHt9KTtjb25zdCBsPWUmJmUuc3R5bGUmJmUuc3R5bGUuZ2V0TGF5ZXIoYSk7bCYmKHRoaXMucXVlcnlQYWRkaW5nPU1hdGgubWF4KHRoaXMucXVlcnlQYWRkaW5nLGwucXVlcnlSYWRpdXMocykpKTt9fWhvbGRpbmdGb3JGYWRlKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbH1zeW1ib2xGYWRlRmluaXNoZWQoKXtyZXR1cm4gIXRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbHx8dGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsPG8ubm93KCl9Y2xlYXJGYWRlSG9sZCgpe3RoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbD12b2lkIDA7fXNldEhvbGREdXJhdGlvbih0KXt0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWw9by5ub3coKSt0O31zZXREZXBlbmRlbmNpZXModCxlKXtjb25zdCBpPXt9O2Zvcihjb25zdCB0IG9mIGUpaVt0XT0hMDt0aGlzLmRlcGVuZGVuY2llc1t0XT1pO31oYXNEZXBlbmRlbmN5KHQsZSl7Zm9yKGNvbnN0IGkgb2YgdCl7Y29uc3QgdD10aGlzLmRlcGVuZGVuY2llc1tpXTtpZih0KWZvcihjb25zdCBpIG9mIGUpaWYodFtpXSlyZXR1cm4gITB9cmV0dXJuICExfX1jbGFzcyBodHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMubWF4PXQsdGhpcy5vblJlbW92ZT1lLHRoaXMucmVzZXQoKTt9cmVzZXQoKXtmb3IoY29uc3QgdCBpbiB0aGlzLmRhdGEpZm9yKGNvbnN0IGUgb2YgdGhpcy5kYXRhW3RdKWUudGltZW91dCYmY2xlYXJUaW1lb3V0KGUudGltZW91dCksdGhpcy5vblJlbW92ZShlLnZhbHVlKTtyZXR1cm4gdGhpcy5kYXRhPXt9LHRoaXMub3JkZXI9W10sdGhpc31hZGQodCxlLGkpe2NvbnN0IGE9dC53cmFwcGVkKCkua2V5O3ZvaWQgMD09PXRoaXMuZGF0YVthXSYmKHRoaXMuZGF0YVthXT1bXSk7Y29uc3Qgcz17dmFsdWU6ZSx0aW1lb3V0OnZvaWQgMH07aWYodm9pZCAwIT09aSYmKHMudGltZW91dD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMucmVtb3ZlKHQscyk7fSksaSkpLHRoaXMuZGF0YVthXS5wdXNoKHMpLHRoaXMub3JkZXIucHVzaChhKSx0aGlzLm9yZGVyLmxlbmd0aD50aGlzLm1heCl7Y29uc3QgdD10aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aGlzLm9yZGVyWzBdKTt0JiZ0aGlzLm9uUmVtb3ZlKHQpO31yZXR1cm4gdGhpc31oYXModCl7cmV0dXJuIHQud3JhcHBlZCgpLmtleSBpbiB0aGlzLmRhdGF9Z2V0QW5kUmVtb3ZlKHQpe3JldHVybiB0aGlzLmhhcyh0KT90aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0LndyYXBwZWQoKS5rZXkpOm51bGx9X2dldEFuZFJlbW92ZUJ5S2V5KHQpe2NvbnN0IGU9dGhpcy5kYXRhW3RdLnNoaWZ0KCk7cmV0dXJuIGUudGltZW91dCYmY2xlYXJUaW1lb3V0KGUudGltZW91dCksMD09PXRoaXMuZGF0YVt0XS5sZW5ndGgmJmRlbGV0ZSB0aGlzLmRhdGFbdF0sdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKHQpLDEpLGUudmFsdWV9Z2V0QnlLZXkodCl7Y29uc3QgZT10aGlzLmRhdGFbdF07cmV0dXJuIGU/ZVswXS52YWx1ZTpudWxsfWdldCh0KXtyZXR1cm4gdGhpcy5oYXModCk/dGhpcy5kYXRhW3Qud3JhcHBlZCgpLmtleV1bMF0udmFsdWU6bnVsbH1yZW1vdmUodCxlKXtpZighdGhpcy5oYXModCkpcmV0dXJuIHRoaXM7Y29uc3QgaT10LndyYXBwZWQoKS5rZXksYT12b2lkIDA9PT1lPzA6dGhpcy5kYXRhW2ldLmluZGV4T2YoZSkscz10aGlzLmRhdGFbaV1bYV07cmV0dXJuIHRoaXMuZGF0YVtpXS5zcGxpY2UoYSwxKSxzLnRpbWVvdXQmJmNsZWFyVGltZW91dChzLnRpbWVvdXQpLDA9PT10aGlzLmRhdGFbaV0ubGVuZ3RoJiZkZWxldGUgdGhpcy5kYXRhW2ldLHRoaXMub25SZW1vdmUocy52YWx1ZSksdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGkpLDEpLHRoaXN9c2V0TWF4U2l6ZSh0KXtmb3IodGhpcy5tYXg9dDt0aGlzLm9yZGVyLmxlbmd0aD50aGlzLm1heDspe2NvbnN0IHQ9dGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodGhpcy5vcmRlclswXSk7dCYmdGhpcy5vblJlbW92ZSh0KTt9cmV0dXJuIHRoaXN9ZmlsdGVyKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IGkgaW4gdGhpcy5kYXRhKWZvcihjb25zdCBhIG9mIHRoaXMuZGF0YVtpXSl0KGEudmFsdWUpfHxlLnB1c2goYSk7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLnJlbW92ZSh0LnZhbHVlLnRpbGVJRCx0KTt9fWNsYXNzIGN0e2NvbnN0cnVjdG9yKCl7dGhpcy5zdGF0ZT17fSx0aGlzLnN0YXRlQ2hhbmdlcz17fSx0aGlzLmRlbGV0ZWRTdGF0ZXM9e307fXVwZGF0ZVN0YXRlKHQsaSxhKXtjb25zdCBzPVN0cmluZyhpKTtpZih0aGlzLnN0YXRlQ2hhbmdlc1t0XT10aGlzLnN0YXRlQ2hhbmdlc1t0XXx8e30sdGhpcy5zdGF0ZUNoYW5nZXNbdF1bc109dGhpcy5zdGF0ZUNoYW5nZXNbdF1bc118fHt9LGUuZSh0aGlzLnN0YXRlQ2hhbmdlc1t0XVtzXSxhKSxudWxsPT09dGhpcy5kZWxldGVkU3RhdGVzW3RdKXt0aGlzLmRlbGV0ZWRTdGF0ZXNbdF09e307Zm9yKGNvbnN0IGUgaW4gdGhpcy5zdGF0ZVt0XSllIT09cyYmKHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtlXT1udWxsKTt9ZWxzZSBpZih0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0mJm51bGw9PT10aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bc10pe3RoaXMuZGVsZXRlZFN0YXRlc1t0XVtzXT17fTtmb3IoY29uc3QgZSBpbiB0aGlzLnN0YXRlW3RdW3NdKWFbZV18fCh0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bc11bZV09bnVsbCk7fWVsc2UgZm9yKGNvbnN0IGUgaW4gYSl0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0mJnRoaXMuZGVsZXRlZFN0YXRlc1t0XVtzXSYmbnVsbD09PXRoaXMuZGVsZXRlZFN0YXRlc1t0XVtzXVtlXSYmZGVsZXRlIHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtzXVtlXTt9cmVtb3ZlRmVhdHVyZVN0YXRlKHQsZSxpKXtpZihudWxsPT09dGhpcy5kZWxldGVkU3RhdGVzW3RdKXJldHVybjtjb25zdCBhPVN0cmluZyhlKTtpZih0aGlzLmRlbGV0ZWRTdGF0ZXNbdF09dGhpcy5kZWxldGVkU3RhdGVzW3RdfHx7fSxpJiZ2b2lkIDAhPT1lKW51bGwhPT10aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bYV0mJih0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bYV09dGhpcy5kZWxldGVkU3RhdGVzW3RdW2FdfHx7fSx0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bYV1baV09bnVsbCk7ZWxzZSBpZih2b2lkIDAhPT1lKWlmKHRoaXMuc3RhdGVDaGFuZ2VzW3RdJiZ0aGlzLnN0YXRlQ2hhbmdlc1t0XVthXSlmb3IoaSBpbiB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bYV09e30sdGhpcy5zdGF0ZUNoYW5nZXNbdF1bYV0pdGhpcy5kZWxldGVkU3RhdGVzW3RdW2FdW2ldPW51bGw7ZWxzZSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bYV09bnVsbDtlbHNlIHRoaXMuZGVsZXRlZFN0YXRlc1t0XT1udWxsO31nZXRTdGF0ZSh0LGkpe2NvbnN0IGE9U3RyaW5nKGkpLHM9ZS5lKHt9LCh0aGlzLnN0YXRlW3RdfHx7fSlbYV0sKHRoaXMuc3RhdGVDaGFuZ2VzW3RdfHx7fSlbYV0pO2lmKG51bGw9PT10aGlzLmRlbGV0ZWRTdGF0ZXNbdF0pcmV0dXJuIHt9O2lmKHRoaXMuZGVsZXRlZFN0YXRlc1t0XSl7Y29uc3QgZT10aGlzLmRlbGV0ZWRTdGF0ZXNbdF1baV07aWYobnVsbD09PWUpcmV0dXJuIHt9O2Zvcihjb25zdCB0IGluIGUpZGVsZXRlIHNbdF07fXJldHVybiBzfWluaXRpYWxpemVUaWxlU3RhdGUodCxlKXt0LnNldEZlYXR1cmVTdGF0ZSh0aGlzLnN0YXRlLGUpO31jb2FsZXNjZUNoYW5nZXModCxpKXtjb25zdCBhPXt9O2Zvcihjb25zdCB0IGluIHRoaXMuc3RhdGVDaGFuZ2VzKXt0aGlzLnN0YXRlW3RdPXRoaXMuc3RhdGVbdF18fHt9O2NvbnN0IGk9e307Zm9yKGNvbnN0IGEgaW4gdGhpcy5zdGF0ZUNoYW5nZXNbdF0pdGhpcy5zdGF0ZVt0XVthXXx8KHRoaXMuc3RhdGVbdF1bYV09e30pLGUuZSh0aGlzLnN0YXRlW3RdW2FdLHRoaXMuc3RhdGVDaGFuZ2VzW3RdW2FdKSxpW2FdPXRoaXMuc3RhdGVbdF1bYV07YVt0XT1pO31mb3IoY29uc3QgdCBpbiB0aGlzLmRlbGV0ZWRTdGF0ZXMpe3RoaXMuc3RhdGVbdF09dGhpcy5zdGF0ZVt0XXx8e307Y29uc3QgaT17fTtpZihudWxsPT09dGhpcy5kZWxldGVkU3RhdGVzW3RdKWZvcihjb25zdCBlIGluIHRoaXMuc3RhdGVbdF0paVtlXT17fSx0aGlzLnN0YXRlW3RdW2VdPXt9O2Vsc2UgZm9yKGNvbnN0IGUgaW4gdGhpcy5kZWxldGVkU3RhdGVzW3RdKXtpZihudWxsPT09dGhpcy5kZWxldGVkU3RhdGVzW3RdW2VdKXRoaXMuc3RhdGVbdF1bZV09e307ZWxzZSBmb3IoY29uc3QgaSBvZiBPYmplY3Qua2V5cyh0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bZV0pKWRlbGV0ZSB0aGlzLnN0YXRlW3RdW2VdW2ldO2lbZV09dGhpcy5zdGF0ZVt0XVtlXTt9YVt0XT1hW3RdfHx7fSxlLmUoYVt0XSxpKTt9aWYodGhpcy5zdGF0ZUNoYW5nZXM9e30sdGhpcy5kZWxldGVkU3RhdGVzPXt9LDAhPT1PYmplY3Qua2V5cyhhKS5sZW5ndGgpZm9yKGNvbnN0IGUgaW4gdCl0W2VdLnNldEZlYXR1cmVTdGF0ZShhLGkpO319Y2xhc3MgdXQgZXh0ZW5kcyBlLkV7Y29uc3RydWN0b3IodCxlLGkpe3N1cGVyKCksdGhpcy5pZD10LHRoaXMuZGlzcGF0Y2hlcj1pLHRoaXMub24oXCJkYXRhXCIsKHQ9PnRoaXMuX2RhdGFIYW5kbGVyKHQpKSksdGhpcy5vbihcImRhdGFsb2FkaW5nXCIsKCgpPT57dGhpcy5fc291cmNlRXJyb3JlZD0hMTt9KSksdGhpcy5vbihcImVycm9yXCIsKCgpPT57dGhpcy5fc291cmNlRXJyb3JlZD10aGlzLl9zb3VyY2UubG9hZGVkKCk7fSkpLHRoaXMuX3NvdXJjZT0oKHQsZSxpLGEpPT57Y29uc3Qgcz1uZXcoYXQoZS50eXBlKSkodCxlLGksYSk7aWYocy5pZCE9PXQpdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBTb3VyY2UgaWQgdG8gYmUgJHt0fSBpbnN0ZWFkIG9mICR7cy5pZH1gKTtyZXR1cm4gc30pKHQsZSxpLHRoaXMpLHRoaXMuX3RpbGVzPXt9LHRoaXMuX2NhY2hlPW5ldyBodCgwLCh0PT50aGlzLl91bmxvYWRUaWxlKHQpKSksdGhpcy5fdGltZXJzPXt9LHRoaXMuX2NhY2hlVGltZXJzPXt9LHRoaXMuX21heFRpbGVDYWNoZVNpemU9bnVsbCx0aGlzLl9tYXhUaWxlQ2FjaGVab29tTGV2ZWxzPW51bGwsdGhpcy5fbG9hZGVkUGFyZW50VGlsZXM9e30sdGhpcy5fY292ZXJlZFRpbGVzPXt9LHRoaXMuX3N0YXRlPW5ldyBjdCx0aGlzLl9kaWRFbWl0Q29udGVudD0hMSx0aGlzLl91cGRhdGVkPSExO31vbkFkZCh0KXt0aGlzLm1hcD10LHRoaXMuX21heFRpbGVDYWNoZVNpemU9dD90Ll9tYXhUaWxlQ2FjaGVTaXplOm51bGwsdGhpcy5fbWF4VGlsZUNhY2hlWm9vbUxldmVscz10P3QuX21heFRpbGVDYWNoZVpvb21MZXZlbHM6bnVsbCx0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5vbkFkZCYmdGhpcy5fc291cmNlLm9uQWRkKHQpO31vblJlbW92ZSh0KXt0aGlzLmNsZWFyVGlsZXMoKSx0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5vblJlbW92ZSYmdGhpcy5fc291cmNlLm9uUmVtb3ZlKHQpO31sb2FkZWQoKXtpZih0aGlzLl9zb3VyY2VFcnJvcmVkKXJldHVybiAhMDtpZighdGhpcy5fc291cmNlTG9hZGVkKXJldHVybiAhMTtpZighdGhpcy5fc291cmNlLmxvYWRlZCgpKXJldHVybiAhMTtpZighKHZvaWQgMD09PXRoaXMudXNlZCYmdm9pZCAwPT09dGhpcy51c2VkRm9yVGVycmFpbnx8dGhpcy51c2VkfHx0aGlzLnVzZWRGb3JUZXJyYWluKSlyZXR1cm4gITA7aWYoIXRoaXMuX3VwZGF0ZWQpcmV0dXJuICExO2Zvcihjb25zdCB0IGluIHRoaXMuX3RpbGVzKXtjb25zdCBlPXRoaXMuX3RpbGVzW3RdO2lmKFwibG9hZGVkXCIhPT1lLnN0YXRlJiZcImVycm9yZWRcIiE9PWUuc3RhdGUpcmV0dXJuICExfXJldHVybiAhMH1nZXRTb3VyY2UoKXtyZXR1cm4gdGhpcy5fc291cmNlfXBhdXNlKCl7dGhpcy5fcGF1c2VkPSEwO31yZXN1bWUoKXtpZighdGhpcy5fcGF1c2VkKXJldHVybjtjb25zdCB0PXRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lO3RoaXMuX3BhdXNlZD0hMSx0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZT0hMSx0JiZ0aGlzLnJlbG9hZCgpLHRoaXMudHJhbnNmb3JtJiZ0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSx0aGlzLnRlcnJhaW4pO31fbG9hZFRpbGUodCxpLGEpe3JldHVybiBlLl8odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7eWllbGQgdGhpcy5fc291cmNlLmxvYWRUaWxlKHQpLHRoaXMuX3RpbGVMb2FkZWQodCxpLGEpO31jYXRjaChpKXt0LnN0YXRlPVwiZXJyb3JlZFwiLDQwNCE9PWkuc3RhdHVzP3RoaXMuX3NvdXJjZS5maXJlKG5ldyBlLmooaSx7dGlsZTp0fSkpOnRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtLHRoaXMudGVycmFpbik7fX0pKX1fdW5sb2FkVGlsZSh0KXt0aGlzLl9zb3VyY2UudW5sb2FkVGlsZSYmdGhpcy5fc291cmNlLnVubG9hZFRpbGUodCk7fV9hYm9ydFRpbGUodCl7dGhpcy5fc291cmNlLmFib3J0VGlsZSYmdGhpcy5fc291cmNlLmFib3J0VGlsZSh0KSx0aGlzLl9zb3VyY2UuZmlyZShuZXcgZS5rKFwiZGF0YWFib3J0XCIse3RpbGU6dCxjb29yZDp0LnRpbGVJRCxkYXRhVHlwZTpcInNvdXJjZVwifSkpO31zZXJpYWxpemUoKXtyZXR1cm4gdGhpcy5fc291cmNlLnNlcmlhbGl6ZSgpfXByZXBhcmUodCl7dGhpcy5fc291cmNlLnByZXBhcmUmJnRoaXMuX3NvdXJjZS5wcmVwYXJlKCksdGhpcy5fc3RhdGUuY29hbGVzY2VDaGFuZ2VzKHRoaXMuX3RpbGVzLHRoaXMubWFwP3RoaXMubWFwLnBhaW50ZXI6bnVsbCk7Zm9yKGNvbnN0IGUgaW4gdGhpcy5fdGlsZXMpe2NvbnN0IGk9dGhpcy5fdGlsZXNbZV07aS51cGxvYWQodCksaS5wcmVwYXJlKHRoaXMubWFwLnN0eWxlLmltYWdlTWFuYWdlcik7fX1nZXRJZHMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl90aWxlcykubWFwKCh0PT50LnRpbGVJRCkpLnNvcnQoZHQpLm1hcCgodD0+dC5rZXkpKX1nZXRSZW5kZXJhYmxlSWRzKHQpe2NvbnN0IGk9W107Zm9yKGNvbnN0IGUgaW4gdGhpcy5fdGlsZXMpdGhpcy5faXNJZFJlbmRlcmFibGUoZSx0KSYmaS5wdXNoKHRoaXMuX3RpbGVzW2VdKTtyZXR1cm4gdD9pLnNvcnQoKCh0LGkpPT57Y29uc3QgYT10LnRpbGVJRCxzPWkudGlsZUlELG89bmV3IGUuUChhLmNhbm9uaWNhbC54LGEuY2Fub25pY2FsLnkpLl9yb3RhdGUodGhpcy50cmFuc2Zvcm0uYW5nbGUpLHI9bmV3IGUuUChzLmNhbm9uaWNhbC54LHMuY2Fub25pY2FsLnkpLl9yb3RhdGUodGhpcy50cmFuc2Zvcm0uYW5nbGUpO3JldHVybiBhLm92ZXJzY2FsZWRaLXMub3ZlcnNjYWxlZFp8fHIueS1vLnl8fHIueC1vLnh9KSkubWFwKCh0PT50LnRpbGVJRC5rZXkpKTppLm1hcCgodD0+dC50aWxlSUQpKS5zb3J0KGR0KS5tYXAoKHQ9PnQua2V5KSl9aGFzUmVuZGVyYWJsZVBhcmVudCh0KXtjb25zdCBlPXRoaXMuZmluZExvYWRlZFBhcmVudCh0LDApO3JldHVybiAhIWUmJnRoaXMuX2lzSWRSZW5kZXJhYmxlKGUudGlsZUlELmtleSl9X2lzSWRSZW5kZXJhYmxlKHQsZSl7cmV0dXJuIHRoaXMuX3RpbGVzW3RdJiZ0aGlzLl90aWxlc1t0XS5oYXNEYXRhKCkmJiF0aGlzLl9jb3ZlcmVkVGlsZXNbdF0mJihlfHwhdGhpcy5fdGlsZXNbdF0uaG9sZGluZ0ZvckZhZGUoKSl9cmVsb2FkKCl7aWYodGhpcy5fcGF1c2VkKXRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lPSEwO2Vsc2Uge3RoaXMuX2NhY2hlLnJlc2V0KCk7Zm9yKGNvbnN0IHQgaW4gdGhpcy5fdGlsZXMpXCJlcnJvcmVkXCIhPT10aGlzLl90aWxlc1t0XS5zdGF0ZSYmdGhpcy5fcmVsb2FkVGlsZSh0LFwicmVsb2FkaW5nXCIpO319X3JlbG9hZFRpbGUodCxpKXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT10aGlzLl90aWxlc1t0XTtlJiYoXCJsb2FkaW5nXCIhPT1lLnN0YXRlJiYoZS5zdGF0ZT1pKSx5aWVsZCB0aGlzLl9sb2FkVGlsZShlLHQsaSkpO30pKX1fdGlsZUxvYWRlZCh0LGksYSl7dC50aW1lQWRkZWQ9by5ub3coKSxcImV4cGlyZWRcIj09PWEmJih0LnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uPSEwKSx0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoaSx0KSxcInJhc3Rlci1kZW1cIj09PXRoaXMuZ2V0U291cmNlKCkudHlwZSYmdC5kZW0mJnRoaXMuX2JhY2tmaWxsREVNKHQpLHRoaXMuX3N0YXRlLmluaXRpYWxpemVUaWxlU3RhdGUodCx0aGlzLm1hcD90aGlzLm1hcC5wYWludGVyOm51bGwpLHQuYWJvcnRlZHx8dGhpcy5fc291cmNlLmZpcmUobmV3IGUuayhcImRhdGFcIix7ZGF0YVR5cGU6XCJzb3VyY2VcIix0aWxlOnQsY29vcmQ6dC50aWxlSUR9KSk7fV9iYWNrZmlsbERFTSh0KXtjb25zdCBlPXRoaXMuZ2V0UmVuZGVyYWJsZUlkcygpO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtjb25zdCBzPWVbYV07aWYodC5uZWlnaGJvcmluZ1RpbGVzJiZ0Lm5laWdoYm9yaW5nVGlsZXNbc10pe2NvbnN0IGU9dGhpcy5nZXRUaWxlQnlJRChzKTtpKHQsZSksaShlLHQpO319ZnVuY3Rpb24gaSh0LGUpe3QubmVlZHNIaWxsc2hhZGVQcmVwYXJlPSEwLHQubmVlZHNUZXJyYWluUHJlcGFyZT0hMDtsZXQgaT1lLnRpbGVJRC5jYW5vbmljYWwueC10LnRpbGVJRC5jYW5vbmljYWwueDtjb25zdCBhPWUudGlsZUlELmNhbm9uaWNhbC55LXQudGlsZUlELmNhbm9uaWNhbC55LHM9TWF0aC5wb3coMix0LnRpbGVJRC5jYW5vbmljYWwueiksbz1lLnRpbGVJRC5rZXk7MD09PWkmJjA9PT1hfHxNYXRoLmFicyhhKT4xfHwoTWF0aC5hYnMoaSk+MSYmKDE9PT1NYXRoLmFicyhpK3MpP2krPXM6MT09PU1hdGguYWJzKGktcykmJihpLT1zKSksZS5kZW0mJnQuZGVtJiYodC5kZW0uYmFja2ZpbGxCb3JkZXIoZS5kZW0saSxhKSx0Lm5laWdoYm9yaW5nVGlsZXMmJnQubmVpZ2hib3JpbmdUaWxlc1tvXSYmKHQubmVpZ2hib3JpbmdUaWxlc1tvXS5iYWNrZmlsbGVkPSEwKSkpO319Z2V0VGlsZSh0KXtyZXR1cm4gdGhpcy5nZXRUaWxlQnlJRCh0LmtleSl9Z2V0VGlsZUJ5SUQodCl7cmV0dXJuIHRoaXMuX3RpbGVzW3RdfV9yZXRhaW5Mb2FkZWRDaGlsZHJlbih0LGUsaSxhKXtmb3IoY29uc3QgcyBpbiB0aGlzLl90aWxlcyl7bGV0IG89dGhpcy5fdGlsZXNbc107aWYoYVtzXXx8IW8uaGFzRGF0YSgpfHxvLnRpbGVJRC5vdmVyc2NhbGVkWjw9ZXx8by50aWxlSUQub3ZlcnNjYWxlZFo+aSljb250aW51ZTtsZXQgcj1vLnRpbGVJRDtmb3IoO28mJm8udGlsZUlELm92ZXJzY2FsZWRaPmUrMTspe2NvbnN0IHQ9by50aWxlSUQuc2NhbGVkVG8oby50aWxlSUQub3ZlcnNjYWxlZFotMSk7bz10aGlzLl90aWxlc1t0LmtleV0sbyYmby5oYXNEYXRhKCkmJihyPXQpO31sZXQgbj1yO2Zvcig7bi5vdmVyc2NhbGVkWj5lOylpZihuPW4uc2NhbGVkVG8obi5vdmVyc2NhbGVkWi0xKSx0W24ua2V5XSl7YVtyLmtleV09cjticmVha319fWZpbmRMb2FkZWRQYXJlbnQodCxlKXtpZih0LmtleSBpbiB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlcyl7Y29uc3QgaT10aGlzLl9sb2FkZWRQYXJlbnRUaWxlc1t0LmtleV07cmV0dXJuIGkmJmkudGlsZUlELm92ZXJzY2FsZWRaPj1lP2k6bnVsbH1mb3IobGV0IGk9dC5vdmVyc2NhbGVkWi0xO2k+PWU7aS0tKXtjb25zdCBlPXQuc2NhbGVkVG8oaSksYT10aGlzLl9nZXRMb2FkZWRUaWxlKGUpO2lmKGEpcmV0dXJuIGF9fWZpbmRMb2FkZWRTaWJsaW5nKHQpe3JldHVybiB0aGlzLl9nZXRMb2FkZWRUaWxlKHQpfV9nZXRMb2FkZWRUaWxlKHQpe2NvbnN0IGU9dGhpcy5fdGlsZXNbdC5rZXldO3JldHVybiBlJiZlLmhhc0RhdGEoKT9lOnRoaXMuX2NhY2hlLmdldEJ5S2V5KHQud3JhcHBlZCgpLmtleSl9dXBkYXRlQ2FjaGVTaXplKHQpe2NvbnN0IGk9TWF0aC5jZWlsKHQud2lkdGgvdGhpcy5fc291cmNlLnRpbGVTaXplKSsxLGE9TWF0aC5jZWlsKHQuaGVpZ2h0L3RoaXMuX3NvdXJjZS50aWxlU2l6ZSkrMSxzPU1hdGguZmxvb3IoaSphKihudWxsPT09dGhpcy5fbWF4VGlsZUNhY2hlWm9vbUxldmVscz9lLmEuTUFYX1RJTEVfQ0FDSEVfWk9PTV9MRVZFTFM6dGhpcy5fbWF4VGlsZUNhY2hlWm9vbUxldmVscykpLG89XCJudW1iZXJcIj09dHlwZW9mIHRoaXMuX21heFRpbGVDYWNoZVNpemU/TWF0aC5taW4odGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSxzKTpzO3RoaXMuX2NhY2hlLnNldE1heFNpemUobyk7fWhhbmRsZVdyYXBKdW1wKHQpe2NvbnN0IGU9TWF0aC5yb3VuZCgodC0odm9pZCAwPT09dGhpcy5fcHJldkxuZz90OnRoaXMuX3ByZXZMbmcpKS8zNjApO2lmKHRoaXMuX3ByZXZMbmc9dCxlKXtjb25zdCB0PXt9O2Zvcihjb25zdCBpIGluIHRoaXMuX3RpbGVzKXtjb25zdCBhPXRoaXMuX3RpbGVzW2ldO2EudGlsZUlEPWEudGlsZUlELnVud3JhcFRvKGEudGlsZUlELndyYXArZSksdFthLnRpbGVJRC5rZXldPWE7fXRoaXMuX3RpbGVzPXQ7Zm9yKGNvbnN0IHQgaW4gdGhpcy5fdGltZXJzKWNsZWFyVGltZW91dCh0aGlzLl90aW1lcnNbdF0pLGRlbGV0ZSB0aGlzLl90aW1lcnNbdF07Zm9yKGNvbnN0IHQgaW4gdGhpcy5fdGlsZXMpdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKHQsdGhpcy5fdGlsZXNbdF0pO319X3VwZGF0ZUNvdmVyZWRBbmRSZXRhaW5lZFRpbGVzKHQsZSxpLGEscyxyKXtjb25zdCBuPXt9LGw9e30saD1PYmplY3Qua2V5cyh0KSxjPW8ubm93KCk7Zm9yKGNvbnN0IGkgb2YgaCl7Y29uc3QgYT10W2ldLHM9dGhpcy5fdGlsZXNbaV07aWYoIXN8fDAhPT1zLmZhZGVFbmRUaW1lJiZzLmZhZGVFbmRUaW1lPD1jKWNvbnRpbnVlO2NvbnN0IG89dGhpcy5maW5kTG9hZGVkUGFyZW50KGEsZSkscj10aGlzLmZpbmRMb2FkZWRTaWJsaW5nKGEpLGg9b3x8cnx8bnVsbDtoJiYodGhpcy5fYWRkVGlsZShoLnRpbGVJRCksbltoLnRpbGVJRC5rZXldPWgudGlsZUlEKSxsW2ldPWE7fXRoaXMuX3JldGFpbkxvYWRlZENoaWxkcmVuKGwsYSxpLHQpO2Zvcihjb25zdCBlIGluIG4pdFtlXXx8KHRoaXMuX2NvdmVyZWRUaWxlc1tlXT0hMCx0W2VdPW5bZV0pO2lmKHIpe2NvbnN0IGU9e30saT17fTtmb3IoY29uc3QgdCBvZiBzKXRoaXMuX3RpbGVzW3Qua2V5XS5oYXNEYXRhKCk/ZVt0LmtleV09dDppW3Qua2V5XT10O2Zvcihjb25zdCBhIGluIGkpe2NvbnN0IHM9aVthXS5jaGlsZHJlbih0aGlzLl9zb3VyY2UubWF4em9vbSk7dGhpcy5fdGlsZXNbc1swXS5rZXldJiZ0aGlzLl90aWxlc1tzWzFdLmtleV0mJnRoaXMuX3RpbGVzW3NbMl0ua2V5XSYmdGhpcy5fdGlsZXNbc1szXS5rZXldJiYoZVtzWzBdLmtleV09dFtzWzBdLmtleV09c1swXSxlW3NbMV0ua2V5XT10W3NbMV0ua2V5XT1zWzFdLGVbc1syXS5rZXldPXRbc1syXS5rZXldPXNbMl0sZVtzWzNdLmtleV09dFtzWzNdLmtleV09c1szXSxkZWxldGUgaVthXSk7fWZvcihjb25zdCBhIGluIGkpe2NvbnN0IHM9aVthXSxvPXRoaXMuZmluZExvYWRlZFBhcmVudChzLHRoaXMuX3NvdXJjZS5taW56b29tKSxyPXRoaXMuZmluZExvYWRlZFNpYmxpbmcocyksbj1vfHxyfHxudWxsO2lmKG4pe2Vbbi50aWxlSUQua2V5XT10W24udGlsZUlELmtleV09bi50aWxlSUQ7Zm9yKGNvbnN0IHQgaW4gZSllW3RdLmlzQ2hpbGRPZihuLnRpbGVJRCkmJmRlbGV0ZSBlW3RdO319Zm9yKGNvbnN0IHQgaW4gdGhpcy5fdGlsZXMpZVt0XXx8KHRoaXMuX2NvdmVyZWRUaWxlc1t0XT0hMCk7fX11cGRhdGUodCxpKXtpZighdGhpcy5fc291cmNlTG9hZGVkfHx0aGlzLl9wYXVzZWQpcmV0dXJuO2xldCBhO3RoaXMudHJhbnNmb3JtPXQsdGhpcy50ZXJyYWluPWksdGhpcy51cGRhdGVDYWNoZVNpemUodCksdGhpcy5oYW5kbGVXcmFwSnVtcCh0aGlzLnRyYW5zZm9ybS5jZW50ZXIubG5nKSx0aGlzLl9jb3ZlcmVkVGlsZXM9e30sdGhpcy51c2VkfHx0aGlzLnVzZWRGb3JUZXJyYWluP3RoaXMuX3NvdXJjZS50aWxlSUQ/YT10LmdldFZpc2libGVVbndyYXBwZWRDb29yZGluYXRlcyh0aGlzLl9zb3VyY2UudGlsZUlEKS5tYXAoKHQ9Pm5ldyBlLlModC5jYW5vbmljYWwueix0LndyYXAsdC5jYW5vbmljYWwueix0LmNhbm9uaWNhbC54LHQuY2Fub25pY2FsLnkpKSk6KGE9dC5jb3ZlcmluZ1RpbGVzKHt0aWxlU2l6ZTp0aGlzLnVzZWRGb3JUZXJyYWluP3RoaXMudGlsZVNpemU6dGhpcy5fc291cmNlLnRpbGVTaXplLG1pbnpvb206dGhpcy5fc291cmNlLm1pbnpvb20sbWF4em9vbTp0aGlzLl9zb3VyY2UubWF4em9vbSxyb3VuZFpvb206IXRoaXMudXNlZEZvclRlcnJhaW4mJnRoaXMuX3NvdXJjZS5yb3VuZFpvb20scmVwYXJzZU92ZXJzY2FsZWQ6dGhpcy5fc291cmNlLnJlcGFyc2VPdmVyc2NhbGVkLHRlcnJhaW46aX0pLHRoaXMuX3NvdXJjZS5oYXNUaWxlJiYoYT1hLmZpbHRlcigodD0+dGhpcy5fc291cmNlLmhhc1RpbGUodCkpKSkpOmE9W107Y29uc3Qgcz10LmNvdmVyaW5nWm9vbUxldmVsKHRoaXMuX3NvdXJjZSksbz1NYXRoLm1heChzLXV0Lm1heE92ZXJ6b29taW5nLHRoaXMuX3NvdXJjZS5taW56b29tKSxyPU1hdGgubWF4KHMrdXQubWF4VW5kZXJ6b29taW5nLHRoaXMuX3NvdXJjZS5taW56b29tKTtpZih0aGlzLnVzZWRGb3JUZXJyYWluKXtjb25zdCB0PXt9O2Zvcihjb25zdCBlIG9mIGEpaWYoZS5jYW5vbmljYWwuej50aGlzLl9zb3VyY2UubWluem9vbSl7Y29uc3QgaT1lLnNjYWxlZFRvKGUuY2Fub25pY2FsLnotMSk7dFtpLmtleV09aTtjb25zdCBhPWUuc2NhbGVkVG8oTWF0aC5tYXgodGhpcy5fc291cmNlLm1pbnpvb20sTWF0aC5taW4oZS5jYW5vbmljYWwueiw1KSkpO3RbYS5rZXldPWE7fWE9YS5jb25jYXQoT2JqZWN0LnZhbHVlcyh0KSk7fWNvbnN0IG49MD09PWEubGVuZ3RoJiYhdGhpcy5fdXBkYXRlZCYmdGhpcy5fZGlkRW1pdENvbnRlbnQ7dGhpcy5fdXBkYXRlZD0hMCxuJiZ0aGlzLmZpcmUobmV3IGUuayhcImRhdGFcIix7c291cmNlRGF0YVR5cGU6XCJpZGxlXCIsZGF0YVR5cGU6XCJzb3VyY2VcIixzb3VyY2VJZDp0aGlzLmlkfSkpO2NvbnN0IGw9dGhpcy5fdXBkYXRlUmV0YWluZWRUaWxlcyhhLHMpO190KHRoaXMuX3NvdXJjZS50eXBlKSYmdGhpcy5fdXBkYXRlQ292ZXJlZEFuZFJldGFpbmVkVGlsZXMobCxvLHIscyxhLGkpO2Zvcihjb25zdCB0IGluIGwpdGhpcy5fdGlsZXNbdF0uY2xlYXJGYWRlSG9sZCgpO2NvbnN0IGg9ZS5hYih0aGlzLl90aWxlcyxsKTtmb3IoY29uc3QgdCBvZiBoKXtjb25zdCBlPXRoaXMuX3RpbGVzW3RdO2UuaGFzU3ltYm9sQnVja2V0cyYmIWUuaG9sZGluZ0ZvckZhZGUoKT9lLnNldEhvbGREdXJhdGlvbih0aGlzLm1hcC5fZmFkZUR1cmF0aW9uKTplLmhhc1N5bWJvbEJ1Y2tldHMmJiFlLnN5bWJvbEZhZGVGaW5pc2hlZCgpfHx0aGlzLl9yZW1vdmVUaWxlKHQpO310aGlzLl91cGRhdGVMb2FkZWRQYXJlbnRUaWxlQ2FjaGUoKSx0aGlzLl91cGRhdGVMb2FkZWRTaWJsaW5nVGlsZUNhY2hlKCk7fXJlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKXtmb3IoY29uc3QgdCBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1t0XS5ob2xkaW5nRm9yRmFkZSgpJiZ0aGlzLl9yZW1vdmVUaWxlKHQpO31fdXBkYXRlUmV0YWluZWRUaWxlcyh0LGUpe3ZhciBpO2NvbnN0IGE9e30scz17fSxvPU1hdGgubWF4KGUtdXQubWF4T3Zlcnpvb21pbmcsdGhpcy5fc291cmNlLm1pbnpvb20pLHI9TWF0aC5tYXgoZSt1dC5tYXhVbmRlcnpvb21pbmcsdGhpcy5fc291cmNlLm1pbnpvb20pLG49e307Zm9yKGNvbnN0IGkgb2YgdCl7Y29uc3QgdD10aGlzLl9hZGRUaWxlKGkpO2FbaS5rZXldPWksdC5oYXNEYXRhKCl8fGU8dGhpcy5fc291cmNlLm1heHpvb20mJihuW2kua2V5XT1pKTt9dGhpcy5fcmV0YWluTG9hZGVkQ2hpbGRyZW4obixlLHIsYSk7Zm9yKGNvbnN0IHIgb2YgdCl7bGV0IHQ9dGhpcy5fdGlsZXNbci5rZXldO2lmKHQuaGFzRGF0YSgpKWNvbnRpbnVlO2lmKGUrMT50aGlzLl9zb3VyY2UubWF4em9vbSl7Y29uc3QgdD1yLmNoaWxkcmVuKHRoaXMuX3NvdXJjZS5tYXh6b29tKVswXSxlPXRoaXMuZ2V0VGlsZSh0KTtpZihlJiZlLmhhc0RhdGEoKSl7YVt0LmtleV09dDtjb250aW51ZX19ZWxzZSB7Y29uc3QgdD1yLmNoaWxkcmVuKHRoaXMuX3NvdXJjZS5tYXh6b29tKTtpZihhW3RbMF0ua2V5XSYmYVt0WzFdLmtleV0mJmFbdFsyXS5rZXldJiZhW3RbM10ua2V5XSljb250aW51ZX1sZXQgbj10Lndhc1JlcXVlc3RlZCgpO2ZvcihsZXQgZT1yLm92ZXJzY2FsZWRaLTE7ZT49bzstLWUpe2NvbnN0IG89ci5zY2FsZWRUbyhlKTtpZihzW28ua2V5XSlicmVhaztpZihzW28ua2V5XT0hMCx0PXRoaXMuZ2V0VGlsZShvKSwhdCYmbiYmKHQ9dGhpcy5fYWRkVGlsZShvKSksdCl7Y29uc3QgZT10Lmhhc0RhdGEoKTtpZigoZXx8IShudWxsPT09KGk9dGhpcy5tYXApfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmNhbmNlbFBlbmRpbmdUaWxlUmVxdWVzdHNXaGlsZVpvb21pbmcpfHxuKSYmKGFbby5rZXldPW8pLG49dC53YXNSZXF1ZXN0ZWQoKSxlKWJyZWFrfX19cmV0dXJuIGF9X3VwZGF0ZUxvYWRlZFBhcmVudFRpbGVDYWNoZSgpe3RoaXMuX2xvYWRlZFBhcmVudFRpbGVzPXt9O2Zvcihjb25zdCB0IGluIHRoaXMuX3RpbGVzKXtjb25zdCBlPVtdO2xldCBpLGE9dGhpcy5fdGlsZXNbdF0udGlsZUlEO2Zvcig7YS5vdmVyc2NhbGVkWj4wOyl7aWYoYS5rZXkgaW4gdGhpcy5fbG9hZGVkUGFyZW50VGlsZXMpe2k9dGhpcy5fbG9hZGVkUGFyZW50VGlsZXNbYS5rZXldO2JyZWFrfWUucHVzaChhLmtleSk7Y29uc3QgdD1hLnNjYWxlZFRvKGEub3ZlcnNjYWxlZFotMSk7aWYoaT10aGlzLl9nZXRMb2FkZWRUaWxlKHQpLGkpYnJlYWs7YT10O31mb3IoY29uc3QgdCBvZiBlKXRoaXMuX2xvYWRlZFBhcmVudFRpbGVzW3RdPWk7fX1fdXBkYXRlTG9hZGVkU2libGluZ1RpbGVDYWNoZSgpe3RoaXMuX2xvYWRlZFNpYmxpbmdUaWxlcz17fTtmb3IoY29uc3QgdCBpbiB0aGlzLl90aWxlcyl7Y29uc3QgZT10aGlzLl90aWxlc1t0XS50aWxlSUQsaT10aGlzLl9nZXRMb2FkZWRUaWxlKGUpO3RoaXMuX2xvYWRlZFNpYmxpbmdUaWxlc1tlLmtleV09aTt9fV9hZGRUaWxlKHQpe2xldCBpPXRoaXMuX3RpbGVzW3Qua2V5XTtpZihpKXJldHVybiBpO2k9dGhpcy5fY2FjaGUuZ2V0QW5kUmVtb3ZlKHQpLGkmJih0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIodC5rZXksaSksaS50aWxlSUQ9dCx0aGlzLl9zdGF0ZS5pbml0aWFsaXplVGlsZVN0YXRlKGksdGhpcy5tYXA/dGhpcy5tYXAucGFpbnRlcjpudWxsKSx0aGlzLl9jYWNoZVRpbWVyc1t0LmtleV0mJihjbGVhclRpbWVvdXQodGhpcy5fY2FjaGVUaW1lcnNbdC5rZXldKSxkZWxldGUgdGhpcy5fY2FjaGVUaW1lcnNbdC5rZXldLHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcih0LmtleSxpKSkpO2NvbnN0IGE9aTtyZXR1cm4gaXx8KGk9bmV3IGx0KHQsdGhpcy5fc291cmNlLnRpbGVTaXplKnQub3ZlcnNjYWxlRmFjdG9yKCkpLHRoaXMuX2xvYWRUaWxlKGksdC5rZXksaS5zdGF0ZSkpLGkudXNlcysrLHRoaXMuX3RpbGVzW3Qua2V5XT1pLGF8fHRoaXMuX3NvdXJjZS5maXJlKG5ldyBlLmsoXCJkYXRhbG9hZGluZ1wiLHt0aWxlOmksY29vcmQ6aS50aWxlSUQsZGF0YVR5cGU6XCJzb3VyY2VcIn0pKSxpfV9zZXRUaWxlUmVsb2FkVGltZXIodCxlKXt0IGluIHRoaXMuX3RpbWVycyYmKGNsZWFyVGltZW91dCh0aGlzLl90aW1lcnNbdF0pLGRlbGV0ZSB0aGlzLl90aW1lcnNbdF0pO2NvbnN0IGk9ZS5nZXRFeHBpcnlUaW1lb3V0KCk7aSYmKHRoaXMuX3RpbWVyc1t0XT1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX3JlbG9hZFRpbGUodCxcImV4cGlyZWRcIiksZGVsZXRlIHRoaXMuX3RpbWVyc1t0XTt9KSxpKSk7fV9yZW1vdmVUaWxlKHQpe2NvbnN0IGU9dGhpcy5fdGlsZXNbdF07ZSYmKGUudXNlcy0tLGRlbGV0ZSB0aGlzLl90aWxlc1t0XSx0aGlzLl90aW1lcnNbdF0mJihjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW3RdKSxkZWxldGUgdGhpcy5fdGltZXJzW3RdKSxlLnVzZXM+MHx8KGUuaGFzRGF0YSgpJiZcInJlbG9hZGluZ1wiIT09ZS5zdGF0ZT90aGlzLl9jYWNoZS5hZGQoZS50aWxlSUQsZSxlLmdldEV4cGlyeVRpbWVvdXQoKSk6KGUuYWJvcnRlZD0hMCx0aGlzLl9hYm9ydFRpbGUoZSksdGhpcy5fdW5sb2FkVGlsZShlKSkpKTt9X2RhdGFIYW5kbGVyKHQpe2NvbnN0IGU9dC5zb3VyY2VEYXRhVHlwZTtcInNvdXJjZVwiPT09dC5kYXRhVHlwZSYmXCJtZXRhZGF0YVwiPT09ZSYmKHRoaXMuX3NvdXJjZUxvYWRlZD0hMCksdGhpcy5fc291cmNlTG9hZGVkJiYhdGhpcy5fcGF1c2VkJiZcInNvdXJjZVwiPT09dC5kYXRhVHlwZSYmXCJjb250ZW50XCI9PT1lJiYodGhpcy5yZWxvYWQoKSx0aGlzLnRyYW5zZm9ybSYmdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0sdGhpcy50ZXJyYWluKSx0aGlzLl9kaWRFbWl0Q29udGVudD0hMCk7fWNsZWFyVGlsZXMoKXt0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZT0hMSx0aGlzLl9wYXVzZWQ9ITE7Zm9yKGNvbnN0IHQgaW4gdGhpcy5fdGlsZXMpdGhpcy5fcmVtb3ZlVGlsZSh0KTt0aGlzLl9jYWNoZS5yZXNldCgpO310aWxlc0luKHQsaSxhKXtjb25zdCBzPVtdLG89dGhpcy50cmFuc2Zvcm07aWYoIW8pcmV0dXJuIHM7Y29uc3Qgcj1hP28uZ2V0Q2FtZXJhUXVlcnlHZW9tZXRyeSh0KTp0LG49dC5tYXAoKHQ9Pm8ucG9pbnRDb29yZGluYXRlKHQsdGhpcy50ZXJyYWluKSkpLGw9ci5tYXAoKHQ9Pm8ucG9pbnRDb29yZGluYXRlKHQsdGhpcy50ZXJyYWluKSkpLGg9dGhpcy5nZXRJZHMoKTtsZXQgYz0xLzAsdT0xLzAsZD0tMS8wLF89LTEvMDtmb3IoY29uc3QgdCBvZiBsKWM9TWF0aC5taW4oYyx0LngpLHU9TWF0aC5taW4odSx0LnkpLGQ9TWF0aC5tYXgoZCx0LngpLF89TWF0aC5tYXgoXyx0LnkpO2ZvcihsZXQgdD0wO3Q8aC5sZW5ndGg7dCsrKXtjb25zdCBhPXRoaXMuX3RpbGVzW2hbdF1dO2lmKGEuaG9sZGluZ0ZvckZhZGUoKSljb250aW51ZTtjb25zdCByPWEudGlsZUlELHA9TWF0aC5wb3coMixvLnpvb20tYS50aWxlSUQub3ZlcnNjYWxlZFopLG09aSphLnF1ZXJ5UGFkZGluZyplLlgvYS50aWxlU2l6ZS9wLGY9W3IuZ2V0VGlsZVBvaW50KG5ldyBlLlooYyx1KSksci5nZXRUaWxlUG9pbnQobmV3IGUuWihkLF8pKV07aWYoZlswXS54LW08ZS5YJiZmWzBdLnktbTxlLlgmJmZbMV0ueCttPj0wJiZmWzFdLnkrbT49MCl7Y29uc3QgdD1uLm1hcCgodD0+ci5nZXRUaWxlUG9pbnQodCkpKSxlPWwubWFwKCh0PT5yLmdldFRpbGVQb2ludCh0KSkpO3MucHVzaCh7dGlsZTphLHRpbGVJRDpyLHF1ZXJ5R2VvbWV0cnk6dCxjYW1lcmFRdWVyeUdlb21ldHJ5OmUsc2NhbGU6cH0pO319cmV0dXJuIHN9Z2V0VmlzaWJsZUNvb3JkaW5hdGVzKHQpe2NvbnN0IGU9dGhpcy5nZXRSZW5kZXJhYmxlSWRzKHQpLm1hcCgodD0+dGhpcy5fdGlsZXNbdF0udGlsZUlEKSk7Zm9yKGNvbnN0IHQgb2YgZSl0LnBvc01hdHJpeD10aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodC50b1Vud3JhcHBlZCgpKTtyZXR1cm4gZX1oYXNUcmFuc2l0aW9uKCl7aWYodGhpcy5fc291cmNlLmhhc1RyYW5zaXRpb24oKSlyZXR1cm4gITA7aWYoX3QodGhpcy5fc291cmNlLnR5cGUpKXtjb25zdCB0PW8ubm93KCk7Zm9yKGNvbnN0IGUgaW4gdGhpcy5fdGlsZXMpaWYodGhpcy5fdGlsZXNbZV0uZmFkZUVuZFRpbWU+PXQpcmV0dXJuICEwfXJldHVybiAhMX1zZXRGZWF0dXJlU3RhdGUodCxlLGkpe3RoaXMuX3N0YXRlLnVwZGF0ZVN0YXRlKHQ9dHx8XCJfZ2VvanNvblRpbGVMYXllclwiLGUsaSk7fXJlbW92ZUZlYXR1cmVTdGF0ZSh0LGUsaSl7dGhpcy5fc3RhdGUucmVtb3ZlRmVhdHVyZVN0YXRlKHQ9dHx8XCJfZ2VvanNvblRpbGVMYXllclwiLGUsaSk7fWdldEZlYXR1cmVTdGF0ZSh0LGUpe3JldHVybiB0aGlzLl9zdGF0ZS5nZXRTdGF0ZSh0PXR8fFwiX2dlb2pzb25UaWxlTGF5ZXJcIixlKX1zZXREZXBlbmRlbmNpZXModCxlLGkpe2NvbnN0IGE9dGhpcy5fdGlsZXNbdF07YSYmYS5zZXREZXBlbmRlbmNpZXMoZSxpKTt9cmVsb2FkVGlsZXNGb3JEZXBlbmRlbmNpZXModCxlKXtmb3IoY29uc3QgaSBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1tpXS5oYXNEZXBlbmRlbmN5KHQsZSkmJnRoaXMuX3JlbG9hZFRpbGUoaSxcInJlbG9hZGluZ1wiKTt0aGlzLl9jYWNoZS5maWx0ZXIoKGk9PiFpLmhhc0RlcGVuZGVuY3kodCxlKSkpO319ZnVuY3Rpb24gZHQodCxlKXtjb25zdCBpPU1hdGguYWJzKDIqdC53cmFwKS0rKHQud3JhcDwwKSxhPU1hdGguYWJzKDIqZS53cmFwKS0rKGUud3JhcDwwKTtyZXR1cm4gdC5vdmVyc2NhbGVkWi1lLm92ZXJzY2FsZWRafHxhLWl8fGUuY2Fub25pY2FsLnktdC5jYW5vbmljYWwueXx8ZS5jYW5vbmljYWwueC10LmNhbm9uaWNhbC54fWZ1bmN0aW9uIF90KHQpe3JldHVybiBcInJhc3RlclwiPT09dHx8XCJpbWFnZVwiPT09dHx8XCJ2aWRlb1wiPT09dH11dC5tYXhPdmVyem9vbWluZz0xMCx1dC5tYXhVbmRlcnpvb21pbmc9MztjbGFzcyBwdHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucmVzZXQodCxlKTt9cmVzZXQodCxlKXt0aGlzLnBvaW50cz10fHxbXSx0aGlzLl9kaXN0YW5jZXM9WzBdO2ZvcihsZXQgdD0xO3Q8dGhpcy5wb2ludHMubGVuZ3RoO3QrKyl0aGlzLl9kaXN0YW5jZXNbdF09dGhpcy5fZGlzdGFuY2VzW3QtMV0rdGhpcy5wb2ludHNbdF0uZGlzdCh0aGlzLnBvaW50c1t0LTFdKTt0aGlzLmxlbmd0aD10aGlzLl9kaXN0YW5jZXNbdGhpcy5fZGlzdGFuY2VzLmxlbmd0aC0xXSx0aGlzLnBhZGRpbmc9TWF0aC5taW4oZXx8MCwuNSp0aGlzLmxlbmd0aCksdGhpcy5wYWRkZWRMZW5ndGg9dGhpcy5sZW5ndGgtMip0aGlzLnBhZGRpbmc7fWxlcnAodCl7aWYoMT09PXRoaXMucG9pbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5wb2ludHNbMF07dD1lLmFjKHQsMCwxKTtsZXQgaT0xLGE9dGhpcy5fZGlzdGFuY2VzW2ldO2NvbnN0IHM9dCp0aGlzLnBhZGRlZExlbmd0aCt0aGlzLnBhZGRpbmc7Zm9yKDthPHMmJmk8dGhpcy5fZGlzdGFuY2VzLmxlbmd0aDspYT10aGlzLl9kaXN0YW5jZXNbKytpXTtjb25zdCBvPWktMSxyPXRoaXMuX2Rpc3RhbmNlc1tvXSxuPWEtcixsPW4+MD8ocy1yKS9uOjA7cmV0dXJuIHRoaXMucG9pbnRzW29dLm11bHQoMS1sKS5hZGQodGhpcy5wb2ludHNbaV0ubXVsdChsKSl9fWZ1bmN0aW9uIG10KHQsZSl7bGV0IGk9ITA7cmV0dXJuIFwiYWx3YXlzXCI9PT10fHxcIm5ldmVyXCIhPT10JiZcIm5ldmVyXCIhPT1lfHwoaT0hMSksaX1jbGFzcyBmdHtjb25zdHJ1Y3Rvcih0LGUsaSl7Y29uc3QgYT10aGlzLmJveENlbGxzPVtdLHM9dGhpcy5jaXJjbGVDZWxscz1bXTt0aGlzLnhDZWxsQ291bnQ9TWF0aC5jZWlsKHQvaSksdGhpcy55Q2VsbENvdW50PU1hdGguY2VpbChlL2kpO2ZvcihsZXQgdD0wO3Q8dGhpcy54Q2VsbENvdW50KnRoaXMueUNlbGxDb3VudDt0KyspYS5wdXNoKFtdKSxzLnB1c2goW10pO3RoaXMuY2lyY2xlS2V5cz1bXSx0aGlzLmJveEtleXM9W10sdGhpcy5iYm94ZXM9W10sdGhpcy5jaXJjbGVzPVtdLHRoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMueFNjYWxlPXRoaXMueENlbGxDb3VudC90LHRoaXMueVNjYWxlPXRoaXMueUNlbGxDb3VudC9lLHRoaXMuYm94VWlkPTAsdGhpcy5jaXJjbGVVaWQ9MDt9a2V5c0xlbmd0aCgpe3JldHVybiB0aGlzLmJveEtleXMubGVuZ3RoK3RoaXMuY2lyY2xlS2V5cy5sZW5ndGh9aW5zZXJ0KHQsZSxpLGEscyl7dGhpcy5fZm9yRWFjaENlbGwoZSxpLGEscyx0aGlzLl9pbnNlcnRCb3hDZWxsLHRoaXMuYm94VWlkKyspLHRoaXMuYm94S2V5cy5wdXNoKHQpLHRoaXMuYmJveGVzLnB1c2goZSksdGhpcy5iYm94ZXMucHVzaChpKSx0aGlzLmJib3hlcy5wdXNoKGEpLHRoaXMuYmJveGVzLnB1c2gocyk7fWluc2VydENpcmNsZSh0LGUsaSxhKXt0aGlzLl9mb3JFYWNoQ2VsbChlLWEsaS1hLGUrYSxpK2EsdGhpcy5faW5zZXJ0Q2lyY2xlQ2VsbCx0aGlzLmNpcmNsZVVpZCsrKSx0aGlzLmNpcmNsZUtleXMucHVzaCh0KSx0aGlzLmNpcmNsZXMucHVzaChlKSx0aGlzLmNpcmNsZXMucHVzaChpKSx0aGlzLmNpcmNsZXMucHVzaChhKTt9X2luc2VydEJveENlbGwodCxlLGksYSxzLG8pe3RoaXMuYm94Q2VsbHNbc10ucHVzaChvKTt9X2luc2VydENpcmNsZUNlbGwodCxlLGksYSxzLG8pe3RoaXMuY2lyY2xlQ2VsbHNbc10ucHVzaChvKTt9X3F1ZXJ5KHQsZSxpLGEscyxvLHIpe2lmKGk8MHx8dD50aGlzLndpZHRofHxhPDB8fGU+dGhpcy5oZWlnaHQpcmV0dXJuIFtdO2NvbnN0IG49W107aWYodDw9MCYmZTw9MCYmdGhpcy53aWR0aDw9aSYmdGhpcy5oZWlnaHQ8PWEpe2lmKHMpcmV0dXJuIFt7a2V5Om51bGwseDE6dCx5MTplLHgyOmkseTI6YX1dO2ZvcihsZXQgdD0wO3Q8dGhpcy5ib3hLZXlzLmxlbmd0aDt0Kyspbi5wdXNoKHtrZXk6dGhpcy5ib3hLZXlzW3RdLHgxOnRoaXMuYmJveGVzWzQqdF0seTE6dGhpcy5iYm94ZXNbNCp0KzFdLHgyOnRoaXMuYmJveGVzWzQqdCsyXSx5Mjp0aGlzLmJib3hlc1s0KnQrM119KTtmb3IobGV0IHQ9MDt0PHRoaXMuY2lyY2xlS2V5cy5sZW5ndGg7dCsrKXtjb25zdCBlPXRoaXMuY2lyY2xlc1szKnRdLGk9dGhpcy5jaXJjbGVzWzMqdCsxXSxhPXRoaXMuY2lyY2xlc1szKnQrMl07bi5wdXNoKHtrZXk6dGhpcy5jaXJjbGVLZXlzW3RdLHgxOmUtYSx5MTppLWEseDI6ZSthLHkyOmkrYX0pO319ZWxzZSB0aGlzLl9mb3JFYWNoQ2VsbCh0LGUsaSxhLHRoaXMuX3F1ZXJ5Q2VsbCxuLHtoaXRUZXN0OnMsb3ZlcmxhcE1vZGU6byxzZWVuVWlkczp7Ym94Ont9LGNpcmNsZTp7fX19LHIpO3JldHVybiBufXF1ZXJ5KHQsZSxpLGEpe3JldHVybiB0aGlzLl9xdWVyeSh0LGUsaSxhLCExLG51bGwpfWhpdFRlc3QodCxlLGksYSxzLG8pe3JldHVybiB0aGlzLl9xdWVyeSh0LGUsaSxhLCEwLHMsbykubGVuZ3RoPjB9aGl0VGVzdENpcmNsZSh0LGUsaSxhLHMpe2NvbnN0IG89dC1pLHI9dCtpLG49ZS1pLGw9ZStpO2lmKHI8MHx8bz50aGlzLndpZHRofHxsPDB8fG4+dGhpcy5oZWlnaHQpcmV0dXJuICExO2NvbnN0IGg9W107cmV0dXJuIHRoaXMuX2ZvckVhY2hDZWxsKG8sbixyLGwsdGhpcy5fcXVlcnlDZWxsQ2lyY2xlLGgse2hpdFRlc3Q6ITAsb3ZlcmxhcE1vZGU6YSxjaXJjbGU6e3g6dCx5OmUscmFkaXVzOml9LHNlZW5VaWRzOntib3g6e30sY2lyY2xlOnt9fX0scyksaC5sZW5ndGg+MH1fcXVlcnlDZWxsKHQsZSxpLGEscyxvLHIsbil7Y29uc3R7c2VlblVpZHM6bCxoaXRUZXN0Omgsb3ZlcmxhcE1vZGU6Y309cix1PXRoaXMuYm94Q2VsbHNbc107aWYobnVsbCE9PXUpe2NvbnN0IHM9dGhpcy5iYm94ZXM7Zm9yKGNvbnN0IHIgb2YgdSlpZighbC5ib3hbcl0pe2wuYm94W3JdPSEwO2NvbnN0IHU9NCpyLGQ9dGhpcy5ib3hLZXlzW3JdO2lmKHQ8PXNbdSsyXSYmZTw9c1t1KzNdJiZpPj1zW3UrMF0mJmE+PXNbdSsxXSYmKCFufHxuKGQpKSYmKCFofHwhbXQoYyxkLm92ZXJsYXBNb2RlKSkmJihvLnB1c2goe2tleTpkLHgxOnNbdV0seTE6c1t1KzFdLHgyOnNbdSsyXSx5MjpzW3UrM119KSxoKSlyZXR1cm4gITB9fWNvbnN0IGQ9dGhpcy5jaXJjbGVDZWxsc1tzXTtpZihudWxsIT09ZCl7Y29uc3Qgcz10aGlzLmNpcmNsZXM7Zm9yKGNvbnN0IHIgb2YgZClpZighbC5jaXJjbGVbcl0pe2wuY2lyY2xlW3JdPSEwO2NvbnN0IHU9MypyLGQ9dGhpcy5jaXJjbGVLZXlzW3JdO2lmKHRoaXMuX2NpcmNsZUFuZFJlY3RDb2xsaWRlKHNbdV0sc1t1KzFdLHNbdSsyXSx0LGUsaSxhKSYmKCFufHxuKGQpKSYmKCFofHwhbXQoYyxkLm92ZXJsYXBNb2RlKSkpe2NvbnN0IHQ9c1t1XSxlPXNbdSsxXSxpPXNbdSsyXTtpZihvLnB1c2goe2tleTpkLHgxOnQtaSx5MTplLWkseDI6dCtpLHkyOmUraX0pLGgpcmV0dXJuICEwfX19cmV0dXJuICExfV9xdWVyeUNlbGxDaXJjbGUodCxlLGksYSxzLG8scixuKXtjb25zdHtjaXJjbGU6bCxzZWVuVWlkczpoLG92ZXJsYXBNb2RlOmN9PXIsdT10aGlzLmJveENlbGxzW3NdO2lmKG51bGwhPT11KXtjb25zdCB0PXRoaXMuYmJveGVzO2Zvcihjb25zdCBlIG9mIHUpaWYoIWguYm94W2VdKXtoLmJveFtlXT0hMDtjb25zdCBpPTQqZSxhPXRoaXMuYm94S2V5c1tlXTtpZih0aGlzLl9jaXJjbGVBbmRSZWN0Q29sbGlkZShsLngsbC55LGwucmFkaXVzLHRbaSswXSx0W2krMV0sdFtpKzJdLHRbaSszXSkmJighbnx8bihhKSkmJiFtdChjLGEub3ZlcmxhcE1vZGUpKXJldHVybiBvLnB1c2goITApLCEwfX1jb25zdCBkPXRoaXMuY2lyY2xlQ2VsbHNbc107aWYobnVsbCE9PWQpe2NvbnN0IHQ9dGhpcy5jaXJjbGVzO2Zvcihjb25zdCBlIG9mIGQpaWYoIWguY2lyY2xlW2VdKXtoLmNpcmNsZVtlXT0hMDtjb25zdCBpPTMqZSxhPXRoaXMuY2lyY2xlS2V5c1tlXTtpZih0aGlzLl9jaXJjbGVzQ29sbGlkZSh0W2ldLHRbaSsxXSx0W2krMl0sbC54LGwueSxsLnJhZGl1cykmJighbnx8bihhKSkmJiFtdChjLGEub3ZlcmxhcE1vZGUpKXJldHVybiBvLnB1c2goITApLCEwfX19X2ZvckVhY2hDZWxsKHQsZSxpLGEscyxvLHIsbil7Y29uc3QgbD10aGlzLl9jb252ZXJ0VG9YQ2VsbENvb3JkKHQpLGg9dGhpcy5fY29udmVydFRvWUNlbGxDb29yZChlKSxjPXRoaXMuX2NvbnZlcnRUb1hDZWxsQ29vcmQoaSksdT10aGlzLl9jb252ZXJ0VG9ZQ2VsbENvb3JkKGEpO2ZvcihsZXQgZD1sO2Q8PWM7ZCsrKWZvcihsZXQgbD1oO2w8PXU7bCsrKWlmKHMuY2FsbCh0aGlzLHQsZSxpLGEsdGhpcy54Q2VsbENvdW50KmwrZCxvLHIsbikpcmV0dXJufV9jb252ZXJ0VG9YQ2VsbENvb3JkKHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKHRoaXMueENlbGxDb3VudC0xLE1hdGguZmxvb3IodCp0aGlzLnhTY2FsZSkpKX1fY29udmVydFRvWUNlbGxDb29yZCh0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbih0aGlzLnlDZWxsQ291bnQtMSxNYXRoLmZsb29yKHQqdGhpcy55U2NhbGUpKSl9X2NpcmNsZXNDb2xsaWRlKHQsZSxpLGEscyxvKXtjb25zdCByPWEtdCxuPXMtZSxsPWkrbztyZXR1cm4gbCpsPnIqcituKm59X2NpcmNsZUFuZFJlY3RDb2xsaWRlKHQsZSxpLGEscyxvLHIpe2NvbnN0IG49KG8tYSkvMixsPU1hdGguYWJzKHQtKGErbikpO2lmKGw+bitpKXJldHVybiAhMTtjb25zdCBoPShyLXMpLzIsYz1NYXRoLmFicyhlLShzK2gpKTtpZihjPmgraSlyZXR1cm4gITE7aWYobDw9bnx8Yzw9aClyZXR1cm4gITA7Y29uc3QgdT1sLW4sZD1jLWg7cmV0dXJuIHUqdStkKmQ8PWkqaX19ZnVuY3Rpb24gZ3QodCxpLGEscyxvKXtjb25zdCByPWUuSCgpO3JldHVybiBpPyhlLksocixyLFsxL28sMS9vLDFdKSxhfHxlLmFkKHIscixzLmFuZ2xlKSk6ZS5MKHIscy5sYWJlbFBsYW5lTWF0cml4LHQpLHJ9ZnVuY3Rpb24gdnQodCxpLGEscyxvKXtpZihpKXtjb25zdCBpPWUuYWUodCk7cmV0dXJuIGUuSyhpLGksW28sbywxXSksYXx8ZS5hZChpLGksLXMuYW5nbGUpLGl9cmV0dXJuIHMuZ2xDb29yZE1hdHJpeH1mdW5jdGlvbiB4dCh0LGksYSxzKXtsZXQgbztzPyhvPVt0LGkscyh0LGkpLDFdLGUuYWYobyxvLGEpKToobz1bdCxpLDAsMV0sa3QobyxvLGEpKTtjb25zdCByPW9bM107cmV0dXJuIHtwb2ludDpuZXcgZS5QKG9bMF0vcixvWzFdL3IpLHNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYTpyLGlzT2NjbHVkZWQ6ITF9fWZ1bmN0aW9uIHl0KHQsZSl7cmV0dXJuIC41K3QvZSouNX1mdW5jdGlvbiBidCh0LGUpe3JldHVybiB0Lng+PS1lWzBdJiZ0Lng8PWVbMF0mJnQueT49LWVbMV0mJnQueTw9ZVsxXX1mdW5jdGlvbiB3dCh0LGksYSxzLG8scixuLGwsaCxjLHUsZCxfLHAsbSl7Y29uc3QgZj1zP3QudGV4dFNpemVEYXRhOnQuaWNvblNpemVEYXRhLGc9ZS5hZyhmLGEudHJhbnNmb3JtLnpvb20pLHY9WzI1Ni9hLndpZHRoKjIrMSwyNTYvYS5oZWlnaHQqMisxXSx4PXM/dC50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTp0Lmljb24uZHluYW1pY0xheW91dFZlcnRleEFycmF5O3guY2xlYXIoKTtjb25zdCB5PXQubGluZVZlcnRleEFycmF5LGI9cz90LnRleHQucGxhY2VkU3ltYm9sQXJyYXk6dC5pY29uLnBsYWNlZFN5bWJvbEFycmF5LHc9YS50cmFuc2Zvcm0ud2lkdGgvYS50cmFuc2Zvcm0uaGVpZ2h0O2xldCBUPSExO2ZvcihsZXQgcz0wO3M8Yi5sZW5ndGg7cysrKXtjb25zdCBJPWIuZ2V0KHMpO2lmKEkuaGlkZGVufHxJLndyaXRpbmdNb2RlPT09ZS5haC52ZXJ0aWNhbCYmIVQpe1J0KEkubnVtR2x5cGhzLHgpO2NvbnRpbnVlfVQ9ITE7Y29uc3QgRT14dChJLmFuY2hvclgsSS5hbmNob3JZLGksbSk7aWYoIWJ0KEUucG9pbnQsdikpe1J0KEkubnVtR2x5cGhzLHgpO2NvbnRpbnVlfWNvbnN0IFA9eXQoYS50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxFLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSksQz1lLmFpKGYsZyxJKSxTPW4/Qy9QOkMqUCx6PXtnZXRFbGV2YXRpb246bSxsYWJlbFBsYW5lTWF0cml4Om8sbGluZVZlcnRleEFycmF5OnkscGl0Y2hXaXRoTWFwOm4scHJvamVjdGlvbkNhY2hlOntwcm9qZWN0aW9uczp7fSxvZmZzZXRzOnt9LGNhY2hlZEFuY2hvclBvaW50OnZvaWQgMCxhbnlQcm9qZWN0aW9uT2NjbHVkZWQ6ITF9LHByb2plY3Rpb246Yyx0aWxlQW5jaG9yUG9pbnQ6bmV3IGUuUChJLmFuY2hvclgsSS5hbmNob3JZKSx1bndyYXBwZWRUaWxlSUQ6dSx3aWR0aDpkLGhlaWdodDpfLHRyYW5zbGF0aW9uOnB9LEQ9RXQoeixJLFMsITEsbCxpLHIsdC5nbHlwaE9mZnNldEFycmF5LHgsdyxoKTtUPUQudXNlVmVydGljYWwsKEQubm90RW5vdWdoUm9vbXx8VHx8RC5uZWVkc0ZsaXBwaW5nJiZFdCh6LEksUywhMCxsLGkscix0LmdseXBoT2Zmc2V0QXJyYXkseCx3LGgpLm5vdEVub3VnaFJvb20pJiZSdChJLm51bUdseXBocyx4KTt9cz90LnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHgpOnQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoeCk7fWZ1bmN0aW9uIFR0KHQsZSxpLGEscyxvLHIsbil7Y29uc3QgbD1vLmdseXBoU3RhcnRJbmRleCtvLm51bUdseXBocyxoPW8ubGluZVN0YXJ0SW5kZXgsYz1vLmxpbmVTdGFydEluZGV4K28ubGluZUxlbmd0aCx1PWUuZ2V0b2Zmc2V0WChvLmdseXBoU3RhcnRJbmRleCksZD1lLmdldG9mZnNldFgobC0xKSxfPU10KHQqdSxpLGEscyxvLnNlZ21lbnQsaCxjLG4scik7aWYoIV8pcmV0dXJuIG51bGw7Y29uc3QgcD1NdCh0KmQsaSxhLHMsby5zZWdtZW50LGgsYyxuLHIpO3JldHVybiBwP24ucHJvamVjdGlvbkNhY2hlLmFueVByb2plY3Rpb25PY2NsdWRlZD9udWxsOntmaXJzdDpfLGxhc3Q6cH06bnVsbH1mdW5jdGlvbiBJdCh0LGksYSxzKXtyZXR1cm4gdD09PWUuYWguaG9yaXpvbnRhbCYmTWF0aC5hYnMoYS55LWkueSk+TWF0aC5hYnMoYS54LWkueCkqcz97dXNlVmVydGljYWw6ITB9Oih0PT09ZS5haC52ZXJ0aWNhbD9pLnk8YS55OmkueD5hLngpP3tuZWVkc0ZsaXBwaW5nOiEwfTpudWxsfWZ1bmN0aW9uIEV0KHQsaSxhLHMsbyxyLG4sbCxoLGMsdSl7Y29uc3QgZD1hLzI0LF89aS5saW5lT2Zmc2V0WCpkLHA9aS5saW5lT2Zmc2V0WSpkO2xldCBtO2lmKGkubnVtR2x5cGhzPjEpe2NvbnN0IGU9aS5nbHlwaFN0YXJ0SW5kZXgraS5udW1HbHlwaHMsYT1pLmxpbmVTdGFydEluZGV4LHI9aS5saW5lU3RhcnRJbmRleCtpLmxpbmVMZW5ndGgsaD1UdChkLGwsXyxwLHMsaSx1LHQpO2lmKCFoKXJldHVybiB7bm90RW5vdWdoUm9vbTohMH07Y29uc3QgZj14dChoLmZpcnN0LnBvaW50LngsaC5maXJzdC5wb2ludC55LG4sdC5nZXRFbGV2YXRpb24pLnBvaW50LGc9eHQoaC5sYXN0LnBvaW50LngsaC5sYXN0LnBvaW50Lnksbix0LmdldEVsZXZhdGlvbikucG9pbnQ7aWYobyYmIXMpe2NvbnN0IHQ9SXQoaS53cml0aW5nTW9kZSxmLGcsYyk7aWYodClyZXR1cm4gdH1tPVtoLmZpcnN0XTtmb3IobGV0IG89aS5nbHlwaFN0YXJ0SW5kZXgrMTtvPGUtMTtvKyspbS5wdXNoKE10KGQqbC5nZXRvZmZzZXRYKG8pLF8scCxzLGkuc2VnbWVudCxhLHIsdCx1KSk7bS5wdXNoKGgubGFzdCk7fWVsc2Uge2lmKG8mJiFzKXtjb25zdCBhPXh0KHQudGlsZUFuY2hvclBvaW50LngsdC50aWxlQW5jaG9yUG9pbnQueSxyLHQuZ2V0RWxldmF0aW9uKS5wb2ludCxzPWkubGluZVN0YXJ0SW5kZXgraS5zZWdtZW50KzEsbz1uZXcgZS5QKHQubGluZVZlcnRleEFycmF5LmdldHgocyksdC5saW5lVmVydGV4QXJyYXkuZ2V0eShzKSksbj14dChvLngsby55LHIsdC5nZXRFbGV2YXRpb24pLGw9bi5zaWduZWREaXN0YW5jZUZyb21DYW1lcmE+MD9uLnBvaW50OmZ1bmN0aW9uKHQsZSxpLGEscyxvKXtyZXR1cm4gUHQodCxlLGksMSxzLG8pfSh0LnRpbGVBbmNob3JQb2ludCxvLGEsMCxyLHQpLGg9SXQoaS53cml0aW5nTW9kZSxhLGwsYyk7aWYoaClyZXR1cm4gaH1jb25zdCBhPU10KGQqbC5nZXRvZmZzZXRYKGkuZ2x5cGhTdGFydEluZGV4KSxfLHAscyxpLnNlZ21lbnQsaS5saW5lU3RhcnRJbmRleCxpLmxpbmVTdGFydEluZGV4K2kubGluZUxlbmd0aCx0LHUpO2lmKCFhfHx0LnByb2plY3Rpb25DYWNoZS5hbnlQcm9qZWN0aW9uT2NjbHVkZWQpcmV0dXJuIHtub3RFbm91Z2hSb29tOiEwfTttPVthXTt9Zm9yKGNvbnN0IHQgb2YgbSllLmFqKGgsdC5wb2ludCx0LmFuZ2xlKTtyZXR1cm4ge319ZnVuY3Rpb24gUHQodCxlLGksYSxzLG8pe2NvbnN0IHI9dC5hZGQodC5zdWIoZSkuX3VuaXQoKSksbj12b2lkIDAhPT1zP3h0KHIueCxyLnkscyxvLmdldEVsZXZhdGlvbikucG9pbnQ6U3Qoci54LHIueSxvKS5wb2ludCxsPWkuc3ViKG4pO3JldHVybiBpLmFkZChsLl9tdWx0KGEvbC5tYWcoKSkpfWZ1bmN0aW9uIEN0KHQsaSxhKXtjb25zdCBzPWkucHJvamVjdGlvbkNhY2hlO2lmKHMucHJvamVjdGlvbnNbdF0pcmV0dXJuIHMucHJvamVjdGlvbnNbdF07Y29uc3Qgbz1uZXcgZS5QKGkubGluZVZlcnRleEFycmF5LmdldHgodCksaS5saW5lVmVydGV4QXJyYXkuZ2V0eSh0KSkscj1TdChvLngsby55LGkpO2lmKHIuc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhPjApcmV0dXJuIHMucHJvamVjdGlvbnNbdF09ci5wb2ludCxzLmFueVByb2plY3Rpb25PY2NsdWRlZD1zLmFueVByb2plY3Rpb25PY2NsdWRlZHx8ci5pc09jY2x1ZGVkLHIucG9pbnQ7Y29uc3Qgbj10LWEuZGlyZWN0aW9uO3JldHVybiBmdW5jdGlvbih0LGUsaSxhLHMpe3JldHVybiBQdCh0LGUsaSxhLHZvaWQgMCxzKX0oMD09PWEuZGlzdGFuY2VGcm9tQW5jaG9yP2kudGlsZUFuY2hvclBvaW50Om5ldyBlLlAoaS5saW5lVmVydGV4QXJyYXkuZ2V0eChuKSxpLmxpbmVWZXJ0ZXhBcnJheS5nZXR5KG4pKSxvLGEucHJldmlvdXNWZXJ0ZXgsYS5hYnNPZmZzZXRYLWEuZGlzdGFuY2VGcm9tQW5jaG9yKzEsaSl9ZnVuY3Rpb24gU3QodCxlLGkpe2NvbnN0IGE9dCtpLnRyYW5zbGF0aW9uWzBdLHM9ZStpLnRyYW5zbGF0aW9uWzFdO2xldCBvO3JldHVybiAhaS5waXRjaFdpdGhNYXAmJmkucHJvamVjdGlvbi51c2VTcGVjaWFsUHJvamVjdGlvbkZvclN5bWJvbHM/KG89aS5wcm9qZWN0aW9uLnByb2plY3RUaWxlQ29vcmRpbmF0ZXMoYSxzLGkudW53cmFwcGVkVGlsZUlELGkuZ2V0RWxldmF0aW9uKSxvLnBvaW50Lng9KC41Km8ucG9pbnQueCsuNSkqaS53aWR0aCxvLnBvaW50Lnk9KC41Ki1vLnBvaW50LnkrLjUpKmkuaGVpZ2h0KToobz14dChhLHMsaS5sYWJlbFBsYW5lTWF0cml4LGkuZ2V0RWxldmF0aW9uKSxvLmlzT2NjbHVkZWQ9ITEpLG99ZnVuY3Rpb24genQodCxlLGkpe3JldHVybiB0Ll91bml0KCkuX3BlcnAoKS5fbXVsdChlKmkpfWZ1bmN0aW9uIER0KHQsaSxhLHMsbyxyLG4sbCxoKXtpZihsLnByb2plY3Rpb25DYWNoZS5vZmZzZXRzW3RdKXJldHVybiBsLnByb2plY3Rpb25DYWNoZS5vZmZzZXRzW3RdO2NvbnN0IGM9YS5hZGQoaSk7aWYodCtoLmRpcmVjdGlvbjxzfHx0K2guZGlyZWN0aW9uPj1vKXJldHVybiBsLnByb2plY3Rpb25DYWNoZS5vZmZzZXRzW3RdPWMsYztjb25zdCB1PUN0KHQraC5kaXJlY3Rpb24sbCxoKSxkPXp0KHUuc3ViKGEpLG4saC5kaXJlY3Rpb24pLF89YS5hZGQoZCkscD11LmFkZChkKTtyZXR1cm4gbC5wcm9qZWN0aW9uQ2FjaGUub2Zmc2V0c1t0XT1lLmFrKHIsYyxfLHApfHxjLGwucHJvamVjdGlvbkNhY2hlLm9mZnNldHNbdF19ZnVuY3Rpb24gTXQodCxlLGksYSxzLG8scixuLGwpe2NvbnN0IGg9YT90LWU6dCtlO2xldCBjPWg+MD8xOi0xLHU9MDthJiYoYyo9LTEsdT1NYXRoLlBJKSxjPDAmJih1Kz1NYXRoLlBJKTtsZXQgZCxfPWM+MD9vK3M6bytzKzE7bi5wcm9qZWN0aW9uQ2FjaGUuY2FjaGVkQW5jaG9yUG9pbnQ/ZD1uLnByb2plY3Rpb25DYWNoZS5jYWNoZWRBbmNob3JQb2ludDooZD1TdChuLnRpbGVBbmNob3JQb2ludC54LG4udGlsZUFuY2hvclBvaW50LnksbikucG9pbnQsbi5wcm9qZWN0aW9uQ2FjaGUuY2FjaGVkQW5jaG9yUG9pbnQ9ZCk7bGV0IHAsbSxmPWQsZz1kLHY9MCx4PTA7Y29uc3QgeT1NYXRoLmFicyhoKSxiPVtdO2xldCB3O2Zvcig7dit4PD15Oyl7aWYoXys9YyxfPG98fF8+PXIpcmV0dXJuIG51bGw7dis9eCxnPWYsbT1wO2NvbnN0IHQ9e2Fic09mZnNldFg6eSxkaXJlY3Rpb246YyxkaXN0YW5jZUZyb21BbmNob3I6dixwcmV2aW91c1ZlcnRleDpnfTtpZihmPUN0KF8sbix0KSwwPT09aSliLnB1c2goZyksdz1mLnN1YihnKTtlbHNlIHtsZXQgZTtjb25zdCBhPWYuc3ViKGcpO2U9MD09PWEubWFnKCk/enQoQ3QoXytjLG4sdCkuc3ViKGYpLGksYyk6enQoYSxpLGMpLG18fChtPWcuYWRkKGUpKSxwPUR0KF8sZSxmLG8scixtLGksbix0KSxiLnB1c2gobSksdz1wLnN1YihtKTt9eD13Lm1hZygpO31jb25zdCBUPXcuX211bHQoKHktdikveCkuX2FkZChtfHxnKSxJPXUrTWF0aC5hdGFuMihmLnktZy55LGYueC1nLngpO3JldHVybiBiLnB1c2goVCkse3BvaW50OlQsYW5nbGU6bD9JOjAscGF0aDpifX1jb25zdCBBdD1uZXcgRmxvYXQzMkFycmF5KFstMS8wLC0xLzAsMCwtMS8wLC0xLzAsMCwtMS8wLC0xLzAsMCwtMS8wLC0xLzAsMF0pO2Z1bmN0aW9uIFJ0KHQsZSl7Zm9yKGxldCBpPTA7aTx0O2krKyl7Y29uc3QgdD1lLmxlbmd0aDtlLnJlc2l6ZSh0KzQpLGUuZmxvYXQzMi5zZXQoQXQsMyp0KTt9fWZ1bmN0aW9uIGt0KHQsZSxpKXtjb25zdCBhPWVbMF0scz1lWzFdO3JldHVybiB0WzBdPWlbMF0qYStpWzRdKnMraVsxMl0sdFsxXT1pWzFdKmEraVs1XSpzK2lbMTNdLHRbM109aVszXSphK2lbN10qcytpWzE1XSx0fWNvbnN0IEx0PTEwMDtjbGFzcyBGdHtjb25zdHJ1Y3Rvcih0LGUsaT1uZXcgZnQodC53aWR0aCsyMDAsdC5oZWlnaHQrMjAwLDI1KSxhPW5ldyBmdCh0LndpZHRoKzIwMCx0LmhlaWdodCsyMDAsMjUpKXt0aGlzLnRyYW5zZm9ybT10LHRoaXMubWFwUHJvamVjdGlvbj1lLHRoaXMuZ3JpZD1pLHRoaXMuaWdub3JlZEdyaWQ9YSx0aGlzLnBpdGNoRmFjdG9yPU1hdGguY29zKHQuX3BpdGNoKSp0LmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsdGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5PXQud2lkdGgrTHQsdGhpcy5zY3JlZW5Cb3R0b21Cb3VuZGFyeT10LmhlaWdodCtMdCx0aGlzLmdyaWRSaWdodEJvdW5kYXJ5PXQud2lkdGgrMjAwLHRoaXMuZ3JpZEJvdHRvbUJvdW5kYXJ5PXQuaGVpZ2h0KzIwMCx0aGlzLnBlcnNwZWN0aXZlUmF0aW9DdXRvZmY9LjY7fXBsYWNlQ29sbGlzaW9uQm94KHQsZSxpLGEscyxvLHIsbixsLGgsYyl7Y29uc3QgdT10LmFuY2hvclBvaW50WCtuWzBdLGQ9dC5hbmNob3JQb2ludFkrblsxXSxfPXRoaXMucHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8oYSx1LGQscyxoKSxwPWkqXy5wZXJzcGVjdGl2ZVJhdGlvO2xldCBtO2lmKG98fHIpbT10aGlzLl9wcm9qZWN0Q29sbGlzaW9uQm94KHQscCxhLHMsbyxyLG4sXyxoLGMpO2Vsc2Uge2NvbnN0IGU9Xy5wb2ludC54KyhjP2MueCpwOjApLGk9Xy5wb2ludC55KyhjP2MueSpwOjApO209e2FsbFBvaW50c09jY2x1ZGVkOiExLGJveDpbZSt0LngxKnAsaSt0LnkxKnAsZSt0LngyKnAsaSt0LnkyKnBdfTt9Y29uc3RbZixnLHYseF09bS5ib3g7cmV0dXJuIHRoaXMubWFwUHJvamVjdGlvbi51c2VTcGVjaWFsUHJvamVjdGlvbkZvclN5bWJvbHMmJihvP20uYWxsUG9pbnRzT2NjbHVkZWQ6dGhpcy5tYXBQcm9qZWN0aW9uLmlzT2NjbHVkZWQodSxkLHMpKXx8Xy5wZXJzcGVjdGl2ZVJhdGlvPHRoaXMucGVyc3BlY3RpdmVSYXRpb0N1dG9mZnx8IXRoaXMuaXNJbnNpZGVHcmlkKGYsZyx2LHgpfHxcImFsd2F5c1wiIT09ZSYmdGhpcy5ncmlkLmhpdFRlc3QoZixnLHYseCxlLGwpP3tib3g6W2YsZyx2LHhdLHBsYWNlYWJsZTohMSxvZmZzY3JlZW46ITF9Ontib3g6W2YsZyx2LHhdLHBsYWNlYWJsZTohMCxvZmZzY3JlZW46dGhpcy5pc09mZnNjcmVlbihmLGcsdix4KX19cGxhY2VDb2xsaXNpb25DaXJjbGVzKHQsaSxhLHMsbyxyLG4sbCxoLGMsdSxkLF8scCxtLGYpe2NvbnN0IGc9W10sdj1uZXcgZS5QKGkuYW5jaG9yWCxpLmFuY2hvclkpLHg9dGhpcy5nZXRQZXJzcGVjdGl2ZVJhdGlvKHIsdi54LHYueSxuLGYpLHk9KHU/by94Om8qeCkvZS5hcCxiPXtnZXRFbGV2YXRpb246ZixsYWJlbFBsYW5lTWF0cml4OmwsbGluZVZlcnRleEFycmF5OmEscGl0Y2hXaXRoTWFwOnUscHJvamVjdGlvbkNhY2hlOntwcm9qZWN0aW9uczp7fSxvZmZzZXRzOnt9LGNhY2hlZEFuY2hvclBvaW50OnZvaWQgMCxhbnlQcm9qZWN0aW9uT2NjbHVkZWQ6ITF9LHByb2plY3Rpb246dGhpcy5tYXBQcm9qZWN0aW9uLHRpbGVBbmNob3JQb2ludDp2LHVud3JhcHBlZFRpbGVJRDpuLHdpZHRoOnRoaXMudHJhbnNmb3JtLndpZHRoLGhlaWdodDp0aGlzLnRyYW5zZm9ybS5oZWlnaHQsdHJhbnNsYXRpb246bX0sdz1UdCh5LHMsaS5saW5lT2Zmc2V0WCp5LGkubGluZU9mZnNldFkqeSwhMSxpLCExLGIpO2xldCBUPSExLEk9ITEsRT0hMDtpZih3KXtjb25zdCBpPS41Kl8qeCtwLGE9bmV3IGUuUCgtMTAwLC0xMDApLHM9bmV3IGUuUCh0aGlzLnNjcmVlblJpZ2h0Qm91bmRhcnksdGhpcy5zY3JlZW5Cb3R0b21Cb3VuZGFyeSksbz1uZXcgcHQscj13LmZpcnN0LG49dy5sYXN0O2xldCBsPVtdO2ZvcihsZXQgdD1yLnBhdGgubGVuZ3RoLTE7dD49MTt0LS0pbC5wdXNoKHIucGF0aFt0XSk7Zm9yKGxldCB0PTE7dDxuLnBhdGgubGVuZ3RoO3QrKylsLnB1c2gobi5wYXRoW3RdKTtjb25zdCB1PTIuNSppO2lmKGgpe2NvbnN0IHQ9dGhpcy5wcm9qZWN0UGF0aFRvU2NyZWVuU3BhY2UobCxiLGgpO2w9dC5zb21lKCh0PT50LnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYTw9MCkpP1tdOnQubWFwKCh0PT50LnBvaW50KSk7fWxldCBtPVtdO2lmKGwubGVuZ3RoPjApe2NvbnN0IHQ9bFswXS5jbG9uZSgpLGk9bFswXS5jbG9uZSgpO2ZvcihsZXQgZT0xO2U8bC5sZW5ndGg7ZSsrKXQueD1NYXRoLm1pbih0LngsbFtlXS54KSx0Lnk9TWF0aC5taW4odC55LGxbZV0ueSksaS54PU1hdGgubWF4KGkueCxsW2VdLngpLGkueT1NYXRoLm1heChpLnksbFtlXS55KTttPXQueD49YS54JiZpLng8PXMueCYmdC55Pj1hLnkmJmkueTw9cy55P1tsXTppLng8YS54fHx0Lng+cy54fHxpLnk8YS55fHx0Lnk+cy55P1tdOmUuYWwoW2xdLGEueCxhLnkscy54LHMueSk7fWZvcihjb25zdCBlIG9mIG0pe28ucmVzZXQoZSwuMjUqaSk7bGV0IGE9MDthPW8ubGVuZ3RoPD0uNSppPzE6TWF0aC5jZWlsKG8ucGFkZGVkTGVuZ3RoL3UpKzE7Zm9yKGxldCBlPTA7ZTxhO2UrKyl7Y29uc3Qgcz1lL01hdGgubWF4KGEtMSwxKSxyPW8ubGVycChzKSxuPXIueCtMdCxsPXIueStMdDtnLnB1c2gobixsLGksMCk7Y29uc3QgaD1uLWksdT1sLWksXz1uK2kscD1sK2k7aWYoRT1FJiZ0aGlzLmlzT2Zmc2NyZWVuKGgsdSxfLHApLEk9SXx8dGhpcy5pc0luc2lkZUdyaWQoaCx1LF8scCksXCJhbHdheXNcIiE9PXQmJnRoaXMuZ3JpZC5oaXRUZXN0Q2lyY2xlKG4sbCxpLHQsZCkmJihUPSEwLCFjKSlyZXR1cm4ge2NpcmNsZXM6W10sb2Zmc2NyZWVuOiExLGNvbGxpc2lvbkRldGVjdGVkOlR9fX19cmV0dXJuIHtjaXJjbGVzOiFjJiZUfHwhSXx8eDx0aGlzLnBlcnNwZWN0aXZlUmF0aW9DdXRvZmY/W106ZyxvZmZzY3JlZW46RSxjb2xsaXNpb25EZXRlY3RlZDpUfX1wcm9qZWN0UGF0aFRvU2NyZWVuU3BhY2UodCxlLGkpe3JldHVybiB0Lm1hcCgodD0+eHQodC54LHQueSxpLGUuZ2V0RWxldmF0aW9uKSkpfXF1ZXJ5UmVuZGVyZWRTeW1ib2xzKHQpe2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMuZ3JpZC5rZXlzTGVuZ3RoKCkmJjA9PT10aGlzLmlnbm9yZWRHcmlkLmtleXNMZW5ndGgoKSlyZXR1cm4ge307Y29uc3QgaT1bXTtsZXQgYT0xLzAscz0xLzAsbz0tMS8wLHI9LTEvMDtmb3IoY29uc3QgbiBvZiB0KXtjb25zdCB0PW5ldyBlLlAobi54K0x0LG4ueStMdCk7YT1NYXRoLm1pbihhLHQueCkscz1NYXRoLm1pbihzLHQueSksbz1NYXRoLm1heChvLHQueCkscj1NYXRoLm1heChyLHQueSksaS5wdXNoKHQpO31jb25zdCBuPXRoaXMuZ3JpZC5xdWVyeShhLHMsbyxyKS5jb25jYXQodGhpcy5pZ25vcmVkR3JpZC5xdWVyeShhLHMsbyxyKSksbD17fSxoPXt9O2Zvcihjb25zdCB0IG9mIG4pe2NvbnN0IGE9dC5rZXk7aWYodm9pZCAwPT09bFthLmJ1Y2tldEluc3RhbmNlSWRdJiYobFthLmJ1Y2tldEluc3RhbmNlSWRdPXt9KSxsW2EuYnVja2V0SW5zdGFuY2VJZF1bYS5mZWF0dXJlSW5kZXhdKWNvbnRpbnVlO2NvbnN0IHM9W25ldyBlLlAodC54MSx0LnkxKSxuZXcgZS5QKHQueDIsdC55MSksbmV3IGUuUCh0LngyLHQueTIpLG5ldyBlLlAodC54MSx0LnkyKV07ZS5hbShpLHMpJiYobFthLmJ1Y2tldEluc3RhbmNlSWRdW2EuZmVhdHVyZUluZGV4XT0hMCx2b2lkIDA9PT1oW2EuYnVja2V0SW5zdGFuY2VJZF0mJihoW2EuYnVja2V0SW5zdGFuY2VJZF09W10pLGhbYS5idWNrZXRJbnN0YW5jZUlkXS5wdXNoKGEuZmVhdHVyZUluZGV4KSk7fXJldHVybiBofWluc2VydENvbGxpc2lvbkJveCh0LGUsaSxhLHMsbyl7KGk/dGhpcy5pZ25vcmVkR3JpZDp0aGlzLmdyaWQpLmluc2VydCh7YnVja2V0SW5zdGFuY2VJZDphLGZlYXR1cmVJbmRleDpzLGNvbGxpc2lvbkdyb3VwSUQ6byxvdmVybGFwTW9kZTplfSx0WzBdLHRbMV0sdFsyXSx0WzNdKTt9aW5zZXJ0Q29sbGlzaW9uQ2lyY2xlcyh0LGUsaSxhLHMsbyl7Y29uc3Qgcj1pP3RoaXMuaWdub3JlZEdyaWQ6dGhpcy5ncmlkLG49e2J1Y2tldEluc3RhbmNlSWQ6YSxmZWF0dXJlSW5kZXg6cyxjb2xsaXNpb25Hcm91cElEOm8sb3ZlcmxhcE1vZGU6ZX07Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz00KXIuaW5zZXJ0Q2lyY2xlKG4sdFtlXSx0W2UrMV0sdFtlKzJdKTt9cHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8odCxpLGEscyxvKXtsZXQgcjtvPyhyPVtpLGEsbyhpLGEpLDFdLGUuYWYocixyLHQpKToocj1baSxhLDAsMV0sa3QocixyLHQpKTtjb25zdCBuPXJbM107cmV0dXJuIHtwb2ludDpuZXcgZS5QKChyWzBdL24rMSkvMip0aGlzLnRyYW5zZm9ybS53aWR0aCtMdCwoLXJbMV0vbisxKS8yKnRoaXMudHJhbnNmb3JtLmhlaWdodCtMdCkscGVyc3BlY3RpdmVSYXRpbzouNSt0aGlzLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlL24qLjUsaXNPY2NsdWRlZDohMSxzaWduZWREaXN0YW5jZUZyb21DYW1lcmE6bn19Z2V0UGVyc3BlY3RpdmVSYXRpbyh0LGUsaSxhLHMpe2NvbnN0IG89dGhpcy5tYXBQcm9qZWN0aW9uLnVzZVNwZWNpYWxQcm9qZWN0aW9uRm9yU3ltYm9scz90aGlzLm1hcFByb2plY3Rpb24ucHJvamVjdFRpbGVDb29yZGluYXRlcyhlLGksYSxzKTp4dChlLGksdCxzKTtyZXR1cm4gLjUrdGhpcy50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZS9vLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSouNX1pc09mZnNjcmVlbih0LGUsaSxhKXtyZXR1cm4gaTxMdHx8dD49dGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5fHxhPEx0fHxlPnRoaXMuc2NyZWVuQm90dG9tQm91bmRhcnl9aXNJbnNpZGVHcmlkKHQsZSxpLGEpe3JldHVybiBpPj0wJiZ0PHRoaXMuZ3JpZFJpZ2h0Qm91bmRhcnkmJmE+PTAmJmU8dGhpcy5ncmlkQm90dG9tQm91bmRhcnl9Z2V0Vmlld3BvcnRNYXRyaXgoKXtjb25zdCB0PWUuYW4oW10pO3JldHVybiBlLkoodCx0LFstMTAwLC0xMDAsMF0pLHR9X3Byb2plY3RDb2xsaXNpb25Cb3godCxpLGEscyxvLHIsbixsLGgsYyl7bGV0IHU9bmV3IGUuUCgxLDApLGQ9bmV3IGUuUCgwLDEpO2NvbnN0IF89bmV3IGUuUCh0LmFuY2hvclBvaW50WCtuWzBdLHQuYW5jaG9yUG9pbnRZK25bMV0pO2lmKHImJiFvKXtjb25zdCB0PXRoaXMucHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8oYSxfLngrMSxfLnkscyxoKS5wb2ludC5zdWIobC5wb2ludCkudW5pdCgpLGk9TWF0aC5hdGFuKHQueS90LngpKyh0Lng8MD9NYXRoLlBJOjApLG89TWF0aC5zaW4oaSkscj1NYXRoLmNvcyhpKTt1PW5ldyBlLlAocixvKSxkPW5ldyBlLlAoLW8scik7fWVsc2UgaWYoIXImJm8pe2NvbnN0IHQ9LXRoaXMudHJhbnNmb3JtLmFuZ2xlLGk9TWF0aC5zaW4odCksYT1NYXRoLmNvcyh0KTt1PW5ldyBlLlAoYSxpKSxkPW5ldyBlLlAoLWksYSk7fWxldCBwPWwucG9pbnQsbT1pO2lmKG8pe3A9Xztjb25zdCB0PXRoaXMudHJhbnNmb3JtLnpvb20tTWF0aC5mbG9vcih0aGlzLnRyYW5zZm9ybS56b29tKTttPU1hdGgucG93KDIsLXQpLG0qPXRoaXMubWFwUHJvamVjdGlvbi5nZXRQaXRjaGVkVGV4dENvcnJlY3Rpb24odGhpcy50cmFuc2Zvcm0sXyxzKSxjfHwobSo9ZS5hYyguNStsLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYS90aGlzLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlKi41LDAsNCkpO31jJiYocD1wLmFkZCh1Lm11bHQoYy54Km0pKS5hZGQoZC5tdWx0KGMueSptKSkpO2NvbnN0IGY9dC54MSptLGc9dC54MiptLHY9KGYrZykvMix4PXQueTEqbSx5PXQueTIqbSxiPSh4K3kpLzIsdz1be29mZnNldFg6ZixvZmZzZXRZOnh9LHtvZmZzZXRYOnYsb2Zmc2V0WTp4fSx7b2Zmc2V0WDpnLG9mZnNldFk6eH0se29mZnNldFg6ZyxvZmZzZXRZOmJ9LHtvZmZzZXRYOmcsb2Zmc2V0WTp5fSx7b2Zmc2V0WDp2LG9mZnNldFk6eX0se29mZnNldFg6ZixvZmZzZXRZOnl9LHtvZmZzZXRYOmYsb2Zmc2V0WTpifV07bGV0IFQ9W107Zm9yKGNvbnN0e29mZnNldFg6dCxvZmZzZXRZOml9b2YgdylULnB1c2gobmV3IGUuUChwLngrdS54KnQrZC54KmkscC55K3UueSp0K2QueSppKSk7bGV0IEk9ITE7aWYobyl7Y29uc3QgdD1ULm1hcCgodD0+dGhpcy5wcm9qZWN0QW5kR2V0UGVyc3BlY3RpdmVSYXRpbyhhLHQueCx0LnkscyxoKSkpO0k9dC5zb21lKCh0PT4hdC5pc09jY2x1ZGVkKSksVD10Lm1hcCgodD0+dC5wb2ludCkpO31lbHNlIEk9ITA7cmV0dXJuIHtib3g6ZS5hbyhUKSxhbGxQb2ludHNPY2NsdWRlZDohSX19fWZ1bmN0aW9uIEJ0KHQsaSxhKXtyZXR1cm4gaSooZS5YLyh0LnRpbGVTaXplKk1hdGgucG93KDIsYS10LnRpbGVJRC5vdmVyc2NhbGVkWikpKX1jbGFzcyBPdHtjb25zdHJ1Y3Rvcih0LGUsaSxhKXt0aGlzLm9wYWNpdHk9dD9NYXRoLm1heCgwLE1hdGgubWluKDEsdC5vcGFjaXR5Kyh0LnBsYWNlZD9lOi1lKSkpOmEmJmk/MTowLHRoaXMucGxhY2VkPWk7fWlzSGlkZGVuKCl7cmV0dXJuIDA9PT10aGlzLm9wYWNpdHkmJiF0aGlzLnBsYWNlZH19Y2xhc3MgTnR7Y29uc3RydWN0b3IodCxlLGksYSxzKXt0aGlzLnRleHQ9bmV3IE90KHQ/dC50ZXh0Om51bGwsZSxpLHMpLHRoaXMuaWNvbj1uZXcgT3QodD90Lmljb246bnVsbCxlLGEscyk7fWlzSGlkZGVuKCl7cmV0dXJuIHRoaXMudGV4dC5pc0hpZGRlbigpJiZ0aGlzLmljb24uaXNIaWRkZW4oKX19Y2xhc3MgVXR7Y29uc3RydWN0b3IodCxlLGkpe3RoaXMudGV4dD10LHRoaXMuaWNvbj1lLHRoaXMuc2tpcEZhZGU9aTt9fWNsYXNzIGp0e2NvbnN0cnVjdG9yKCl7dGhpcy5pbnZQcm9qTWF0cml4PWUuSCgpLHRoaXMudmlld3BvcnRNYXRyaXg9ZS5IKCksdGhpcy5jaXJjbGVzPVtdO319Y2xhc3MgWnR7Y29uc3RydWN0b3IodCxlLGksYSxzKXt0aGlzLmJ1Y2tldEluc3RhbmNlSWQ9dCx0aGlzLmZlYXR1cmVJbmRleD1lLHRoaXMuc291cmNlTGF5ZXJJbmRleD1pLHRoaXMuYnVja2V0SW5kZXg9YSx0aGlzLnRpbGVJRD1zO319Y2xhc3MgcXR7Y29uc3RydWN0b3IodCl7dGhpcy5jcm9zc1NvdXJjZUNvbGxpc2lvbnM9dCx0aGlzLm1heEdyb3VwSUQ9MCx0aGlzLmNvbGxpc2lvbkdyb3Vwcz17fTt9Z2V0KHQpe2lmKHRoaXMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zKXJldHVybiB7SUQ6MCxwcmVkaWNhdGU6bnVsbH07aWYoIXRoaXMuY29sbGlzaW9uR3JvdXBzW3RdKXtjb25zdCBlPSsrdGhpcy5tYXhHcm91cElEO3RoaXMuY29sbGlzaW9uR3JvdXBzW3RdPXtJRDplLHByZWRpY2F0ZTp0PT50LmNvbGxpc2lvbkdyb3VwSUQ9PT1lfTt9cmV0dXJuIHRoaXMuY29sbGlzaW9uR3JvdXBzW3RdfX1mdW5jdGlvbiBWdCh0LGksYSxzLG8pe2NvbnN0e2hvcml6b250YWxBbGlnbjpyLHZlcnRpY2FsQWxpZ246bn09ZS5hdSh0KTtyZXR1cm4gbmV3IGUuUCgtKHItLjUpKmkrc1swXSpvLC0obi0uNSkqYStzWzFdKm8pfWNsYXNzIEd0e2NvbnN0cnVjdG9yKHQsZSxpLGEscyxvKXt0aGlzLnRyYW5zZm9ybT10LmNsb25lKCksdGhpcy50ZXJyYWluPWksdGhpcy5jb2xsaXNpb25JbmRleD1uZXcgRnQodGhpcy50cmFuc2Zvcm0sZSksdGhpcy5wbGFjZW1lbnRzPXt9LHRoaXMub3BhY2l0aWVzPXt9LHRoaXMudmFyaWFibGVPZmZzZXRzPXt9LHRoaXMuc3RhbGU9ITEsdGhpcy5jb21taXRUaW1lPTAsdGhpcy5mYWRlRHVyYXRpb249YSx0aGlzLnJldGFpbmVkUXVlcnlEYXRhPXt9LHRoaXMuY29sbGlzaW9uR3JvdXBzPW5ldyBxdChzKSx0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5cz17fSx0aGlzLmNvbGxpc2lvbkJveEFycmF5cz1uZXcgTWFwLHRoaXMucHJldlBsYWNlbWVudD1vLG8mJihvLnByZXZQbGFjZW1lbnQ9dm9pZCAwKSx0aGlzLnBsYWNlZE9yaWVudGF0aW9ucz17fTt9X2dldFRlcnJhaW5FbGV2YXRpb25GdW5jKHQpe2NvbnN0IGU9dGhpcy50ZXJyYWluO3JldHVybiBlPyhpLGEpPT5lLmdldEVsZXZhdGlvbih0LGksYSk6bnVsbH1nZXRCdWNrZXRQYXJ0cyh0LGksYSxzKXtjb25zdCBvPWEuZ2V0QnVja2V0KGkpLHI9YS5sYXRlc3RGZWF0dXJlSW5kZXg7aWYoIW98fCFyfHxpLmlkIT09by5sYXllcklkc1swXSlyZXR1cm47Y29uc3Qgbj1hLmNvbGxpc2lvbkJveEFycmF5LGw9by5sYXllcnNbMF0ubGF5b3V0LGg9by5sYXllcnNbMF0ucGFpbnQsYz1NYXRoLnBvdygyLHRoaXMudHJhbnNmb3JtLnpvb20tYS50aWxlSUQub3ZlcnNjYWxlZFopLHU9YS50aWxlU2l6ZS9lLlgsZD1hLnRpbGVJRC50b1Vud3JhcHBlZCgpLF89dGhpcy50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KGQpLHA9XCJtYXBcIj09PWwuZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIiksbT1cIm1hcFwiPT09bC5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSxmPUJ0KGEsMSx0aGlzLnRyYW5zZm9ybS56b29tKSxnPXRoaXMuY29sbGlzaW9uSW5kZXgubWFwUHJvamVjdGlvbi50cmFuc2xhdGVQb3NpdGlvbih0aGlzLnRyYW5zZm9ybSxhLGguZ2V0KFwidGV4dC10cmFuc2xhdGVcIiksaC5nZXQoXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIikpLHY9dGhpcy5jb2xsaXNpb25JbmRleC5tYXBQcm9qZWN0aW9uLnRyYW5zbGF0ZVBvc2l0aW9uKHRoaXMudHJhbnNmb3JtLGEsaC5nZXQoXCJpY29uLXRyYW5zbGF0ZVwiKSxoLmdldChcImljb24tdHJhbnNsYXRlLWFuY2hvclwiKSkseD1ndChfLHAsbSx0aGlzLnRyYW5zZm9ybSxmKTtsZXQgeT1udWxsO2lmKHApe2NvbnN0IHQ9dnQoXyxwLG0sdGhpcy50cmFuc2Zvcm0sZik7eT1lLkwoW10sdGhpcy50cmFuc2Zvcm0ubGFiZWxQbGFuZU1hdHJpeCx0KTt9dGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtvLmJ1Y2tldEluc3RhbmNlSWRdPW5ldyBadChvLmJ1Y2tldEluc3RhbmNlSWQscixvLnNvdXJjZUxheWVySW5kZXgsby5pbmRleCxhLnRpbGVJRCk7Y29uc3QgYj17YnVja2V0Om8sbGF5b3V0OmwsdHJhbnNsYXRpb25UZXh0OmcsdHJhbnNsYXRpb25JY29uOnYscG9zTWF0cml4Ol8sdW53cmFwcGVkVGlsZUlEOmQsdGV4dExhYmVsUGxhbmVNYXRyaXg6eCxsYWJlbFRvU2NyZWVuTWF0cml4Onksc2NhbGU6Yyx0ZXh0UGl4ZWxSYXRpbzp1LGhvbGRpbmdGb3JGYWRlOmEuaG9sZGluZ0ZvckZhZGUoKSxjb2xsaXNpb25Cb3hBcnJheTpuLHBhcnRpYWxseUV2YWx1YXRlZFRleHRTaXplOmUuYWcoby50ZXh0U2l6ZURhdGEsdGhpcy50cmFuc2Zvcm0uem9vbSksY29sbGlzaW9uR3JvdXA6dGhpcy5jb2xsaXNpb25Hcm91cHMuZ2V0KG8uc291cmNlSUQpfTtpZihzKWZvcihjb25zdCBlIG9mIG8uc29ydEtleVJhbmdlcyl7Y29uc3R7c29ydEtleTppLHN5bWJvbEluc3RhbmNlU3RhcnQ6YSxzeW1ib2xJbnN0YW5jZUVuZDpzfT1lO3QucHVzaCh7c29ydEtleTppLHN5bWJvbEluc3RhbmNlU3RhcnQ6YSxzeW1ib2xJbnN0YW5jZUVuZDpzLHBhcmFtZXRlcnM6Yn0pO31lbHNlIHQucHVzaCh7c3ltYm9sSW5zdGFuY2VTdGFydDowLHN5bWJvbEluc3RhbmNlRW5kOm8uc3ltYm9sSW5zdGFuY2VzLmxlbmd0aCxwYXJhbWV0ZXJzOmJ9KTt9YXR0ZW1wdEFuY2hvclBsYWNlbWVudCh0LGksYSxzLG8scixuLGwsaCxjLHUsZCxfLHAsbSxmLGcsdix4KXtjb25zdCB5PWUuYXFbdC50ZXh0QW5jaG9yXSxiPVt0LnRleHRPZmZzZXQwLHQudGV4dE9mZnNldDFdLHc9VnQoeSxhLHMsYixvKSxUPXRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goaSxkLGwsaCxjLG4scixmLHUucHJlZGljYXRlLHgsdyk7aWYoKCF2fHx0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KHYsZCxsLGgsYyxuLHIsZyx1LnByZWRpY2F0ZSx4LHcpLnBsYWNlYWJsZSkmJlQucGxhY2VhYmxlKXtsZXQgdDtpZih0aGlzLnByZXZQbGFjZW1lbnQmJnRoaXMucHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHNbXy5jcm9zc1RpbGVJRF0mJnRoaXMucHJldlBsYWNlbWVudC5wbGFjZW1lbnRzW18uY3Jvc3NUaWxlSURdJiZ0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1tfLmNyb3NzVGlsZUlEXS50ZXh0JiYodD10aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW18uY3Jvc3NUaWxlSURdLmFuY2hvciksMD09PV8uY3Jvc3NUaWxlSUQpdGhyb3cgbmV3IEVycm9yKFwic3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgY2FuJ3QgYmUgMFwiKTtyZXR1cm4gdGhpcy52YXJpYWJsZU9mZnNldHNbXy5jcm9zc1RpbGVJRF09e3RleHRPZmZzZXQ6Yix3aWR0aDphLGhlaWdodDpzLGFuY2hvcjp5LHRleHRCb3hTY2FsZTpvLHByZXZBbmNob3I6dH0sdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24ocCx5LF8sbSkscC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50JiYodGhpcy5tYXJrVXNlZE9yaWVudGF0aW9uKHAsbSxfKSx0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tfLmNyb3NzVGlsZUlEXT1tKSx7c2hpZnQ6dyxwbGFjZWRHbHlwaEJveGVzOlR9fX1wbGFjZUxheWVyQnVja2V0UGFydCh0LGksYSl7Y29uc3R7YnVja2V0OnMsbGF5b3V0Om8sdHJhbnNsYXRpb25UZXh0OnIsdHJhbnNsYXRpb25JY29uOm4scG9zTWF0cml4OmwsdW53cmFwcGVkVGlsZUlEOmgsdGV4dExhYmVsUGxhbmVNYXRyaXg6YyxsYWJlbFRvU2NyZWVuTWF0cml4OnUsdGV4dFBpeGVsUmF0aW86ZCxob2xkaW5nRm9yRmFkZTpfLGNvbGxpc2lvbkJveEFycmF5OnAscGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemU6bSxjb2xsaXNpb25Hcm91cDpmfT10LnBhcmFtZXRlcnMsZz1vLmdldChcInRleHQtb3B0aW9uYWxcIiksdj1vLmdldChcImljb24tb3B0aW9uYWxcIikseD1lLmFyKG8sXCJ0ZXh0LW92ZXJsYXBcIixcInRleHQtYWxsb3ctb3ZlcmxhcFwiKSx5PVwiYWx3YXlzXCI9PT14LGI9ZS5hcihvLFwiaWNvbi1vdmVybGFwXCIsXCJpY29uLWFsbG93LW92ZXJsYXBcIiksdz1cImFsd2F5c1wiPT09YixUPVwibWFwXCI9PT1vLmdldChcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpLEk9XCJtYXBcIj09PW8uZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIiksRT1cIm5vbmVcIiE9PW8uZ2V0KFwiaWNvbi10ZXh0LWZpdFwiKSxQPVwidmlld3BvcnQteVwiPT09by5nZXQoXCJzeW1ib2wtei1vcmRlclwiKSxDPXkmJih3fHwhcy5oYXNJY29uRGF0YSgpfHx2KSxTPXcmJih5fHwhcy5oYXNUZXh0RGF0YSgpfHxnKTshcy5jb2xsaXNpb25BcnJheXMmJnAmJnMuZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyhwKTtjb25zdCB6PXRoaXMuX2dldFRlcnJhaW5FbGV2YXRpb25GdW5jKHRoaXMucmV0YWluZWRRdWVyeURhdGFbcy5idWNrZXRJbnN0YW5jZUlkXS50aWxlSUQpLEQ9KHQscCx3KT0+e3ZhciBQLEQ7aWYoaVt0LmNyb3NzVGlsZUlEXSlyZXR1cm47aWYoXylyZXR1cm4gdm9pZCh0aGlzLnBsYWNlbWVudHNbdC5jcm9zc1RpbGVJRF09bmV3IFV0KCExLCExLCExKSk7bGV0IE09ITEsQT0hMSxSPSEwLGs9bnVsbCxMPXtib3g6bnVsbCxwbGFjZWFibGU6ITEsb2Zmc2NyZWVuOm51bGx9LEY9e2JveDpudWxsLHBsYWNlYWJsZTohMSxvZmZzY3JlZW46bnVsbH0sQj1udWxsLE89bnVsbCxOPW51bGwsVT0wLGo9MCxaPTA7cC50ZXh0RmVhdHVyZUluZGV4P1U9cC50ZXh0RmVhdHVyZUluZGV4OnQudXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMmJihVPXQuZmVhdHVyZUluZGV4KSxwLnZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCYmKGo9cC52ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXgpO2NvbnN0IHE9cC50ZXh0Qm94O2lmKHEpe2NvbnN0IGk9aT0+e2xldCBhPWUuYWguaG9yaXpvbnRhbDtpZihzLmFsbG93VmVydGljYWxQbGFjZW1lbnQmJiFpJiZ0aGlzLnByZXZQbGFjZW1lbnQpe2NvbnN0IGU9dGhpcy5wcmV2UGxhY2VtZW50LnBsYWNlZE9yaWVudGF0aW9uc1t0LmNyb3NzVGlsZUlEXTtlJiYodGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbdC5jcm9zc1RpbGVJRF09ZSxhPWUsdGhpcy5tYXJrVXNlZE9yaWVudGF0aW9uKHMsYSx0KSk7fXJldHVybiBhfSxvPShpLGEpPT57aWYocy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50JiZ0Lm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcz4wJiZwLnZlcnRpY2FsVGV4dEJveCl7Zm9yKGNvbnN0IHQgb2Ygcy53cml0aW5nTW9kZXMpaWYodD09PWUuYWgudmVydGljYWw/KEw9YSgpLEY9TCk6TD1pKCksTCYmTC5wbGFjZWFibGUpYnJlYWt9ZWxzZSBMPWkoKTt9LGM9dC50ZXh0QW5jaG9yT2Zmc2V0U3RhcnRJbmRleCx1PXQudGV4dEFuY2hvck9mZnNldEVuZEluZGV4O2lmKHU9PT1jKXtjb25zdCBhPShlLGkpPT57Y29uc3QgYT10aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KGUseCxkLGwsaCxJLFQscixmLnByZWRpY2F0ZSx6KTtyZXR1cm4gYSYmYS5wbGFjZWFibGUmJih0aGlzLm1hcmtVc2VkT3JpZW50YXRpb24ocyxpLHQpLHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3QuY3Jvc3NUaWxlSURdPWkpLGF9O28oKCgpPT5hKHEsZS5haC5ob3Jpem9udGFsKSksKCgpPT57Y29uc3QgaT1wLnZlcnRpY2FsVGV4dEJveDtyZXR1cm4gcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50JiZ0Lm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcz4wJiZpP2EoaSxlLmFoLnZlcnRpY2FsKTp7Ym94Om51bGwsb2Zmc2NyZWVuOm51bGx9fSkpLGkoTCYmTC5wbGFjZWFibGUpO31lbHNlIHtsZXQgXz1lLmFxW251bGw9PT0oRD1udWxsPT09KFA9dGhpcy5wcmV2UGxhY2VtZW50KXx8dm9pZCAwPT09UD92b2lkIDA6UC52YXJpYWJsZU9mZnNldHNbdC5jcm9zc1RpbGVJRF0pfHx2b2lkIDA9PT1EP3ZvaWQgMDpELmFuY2hvcl07Y29uc3QgbT0oaSxvLHApPT57Y29uc3QgbT1pLngyLWkueDEsZz1pLnkyLWkueTEsdj10LnRleHRCb3hTY2FsZSx5PUUmJlwibmV2ZXJcIj09PWI/bzpudWxsO2xldCB3PW51bGwsUD1cIm5ldmVyXCI9PT14PzE6MixDPVwibmV2ZXJcIjtfJiZQKys7Zm9yKGxldCBlPTA7ZTxQO2UrKyl7Zm9yKGxldCBlPWM7ZTx1O2UrKyl7Y29uc3QgYT1zLnRleHRBbmNob3JPZmZzZXRzLmdldChlKTtpZihfJiZhLnRleHRBbmNob3IhPT1fKWNvbnRpbnVlO2NvbnN0IG89dGhpcy5hdHRlbXB0QW5jaG9yUGxhY2VtZW50KGEsaSxtLGcsdixULEksZCxsLGgsZixDLHQscyxwLHIsbix5LHopO2lmKG8mJih3PW8ucGxhY2VkR2x5cGhCb3hlcyx3JiZ3LnBsYWNlYWJsZSkpcmV0dXJuIE09ITAsaz1vLnNoaWZ0LHd9Xz9fPW51bGw6Qz14O31yZXR1cm4gYSYmIXcmJih3PXtib3g6dGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkJveChxLFwiYWx3YXlzXCIsZCxsLGgsSSxULHIsZi5wcmVkaWNhdGUseixuZXcgZS5QKDAsMCkpLmJveCxvZmZzY3JlZW46ITEscGxhY2VhYmxlOiExfSksd307bygoKCk9Pm0ocSxwLmljb25Cb3gsZS5haC5ob3Jpem9udGFsKSksKCgpPT57Y29uc3QgaT1wLnZlcnRpY2FsVGV4dEJveDtyZXR1cm4gcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50JiYoIUx8fCFMLnBsYWNlYWJsZSkmJnQubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzPjAmJmk/bShpLHAudmVydGljYWxJY29uQm94LGUuYWgudmVydGljYWwpOntib3g6bnVsbCxvY2NsdWRlZDohMCxvZmZzY3JlZW46bnVsbH19KSksTCYmKE09TC5wbGFjZWFibGUsUj1MLm9mZnNjcmVlbik7Y29uc3QgZz1pKEwmJkwucGxhY2VhYmxlKTtpZighTSYmdGhpcy5wcmV2UGxhY2VtZW50KXtjb25zdCBlPXRoaXMucHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHNbdC5jcm9zc1RpbGVJRF07ZSYmKHRoaXMudmFyaWFibGVPZmZzZXRzW3QuY3Jvc3NUaWxlSURdPWUsdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24ocyxlLmFuY2hvcix0LGcpKTt9fX1pZihCPUwsTT1CJiZCLnBsYWNlYWJsZSxSPUImJkIub2Zmc2NyZWVuLHQudXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMpe2NvbnN0IGk9cy50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldCh0LmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCksbj1lLmFpKHMudGV4dFNpemVEYXRhLG0saSksZD1vLmdldChcInRleHQtcGFkZGluZ1wiKTtPPXRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25DaXJjbGVzKHgsaSxzLmxpbmVWZXJ0ZXhBcnJheSxzLmdseXBoT2Zmc2V0QXJyYXksbixsLGgsYyx1LGEsSSxmLnByZWRpY2F0ZSx0LmNvbGxpc2lvbkNpcmNsZURpYW1ldGVyLGQscix6KSxPLmNpcmNsZXMubGVuZ3RoJiZPLmNvbGxpc2lvbkRldGVjdGVkJiYhYSYmZS53KFwiQ29sbGlzaW9ucyBkZXRlY3RlZCwgYnV0IGNvbGxpc2lvbiBib3hlcyBhcmUgbm90IHNob3duXCIpLE09eXx8Ty5jaXJjbGVzLmxlbmd0aD4wJiYhTy5jb2xsaXNpb25EZXRlY3RlZCxSPVImJk8ub2Zmc2NyZWVuO31pZihwLmljb25GZWF0dXJlSW5kZXgmJihaPXAuaWNvbkZlYXR1cmVJbmRleCkscC5pY29uQm94KXtjb25zdCB0PXQ9PnRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3godCxiLGQsbCxoLEksVCxuLGYucHJlZGljYXRlLHosRSYmaz9rOnZvaWQgMCk7RiYmRi5wbGFjZWFibGUmJnAudmVydGljYWxJY29uQm94PyhOPXQocC52ZXJ0aWNhbEljb25Cb3gpLEE9Ti5wbGFjZWFibGUpOihOPXQocC5pY29uQm94KSxBPU4ucGxhY2VhYmxlKSxSPVImJk4ub2Zmc2NyZWVuO31jb25zdCBWPWd8fDA9PT10Lm51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzJiYwPT09dC5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMsRz12fHwwPT09dC5udW1JY29uVmVydGljZXM7Vnx8Rz9HP1Z8fChBPUEmJk0pOk09QSYmTTpBPU09QSYmTTtjb25zdCBIPUEmJk4ucGxhY2VhYmxlO2lmKE0mJkIucGxhY2VhYmxlJiZ0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkJveChCLmJveCx4LG8uZ2V0KFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCIpLHMuYnVja2V0SW5zdGFuY2VJZCxGJiZGLnBsYWNlYWJsZSYmaj9qOlUsZi5JRCksSCYmdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3goTi5ib3gsYixvLmdldChcImljb24taWdub3JlLXBsYWNlbWVudFwiKSxzLmJ1Y2tldEluc3RhbmNlSWQsWixmLklEKSxPJiZNJiZ0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkNpcmNsZXMoTy5jaXJjbGVzLHgsby5nZXQoXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIikscy5idWNrZXRJbnN0YW5jZUlkLFUsZi5JRCksYSYmdGhpcy5zdG9yZUNvbGxpc2lvbkRhdGEocy5idWNrZXRJbnN0YW5jZUlkLHcscCxCLE4sTyksMD09PXQuY3Jvc3NUaWxlSUQpdGhyb3cgbmV3IEVycm9yKFwic3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgY2FuJ3QgYmUgMFwiKTtpZigwPT09cy5idWNrZXRJbnN0YW5jZUlkKXRocm93IG5ldyBFcnJvcihcImJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkIGNhbid0IGJlIDBcIik7dGhpcy5wbGFjZW1lbnRzW3QuY3Jvc3NUaWxlSURdPW5ldyBVdChNfHxDLEF8fFMsUnx8cy5qdXN0UmVsb2FkZWQpLGlbdC5jcm9zc1RpbGVJRF09ITA7fTtpZihQKXtpZigwIT09dC5zeW1ib2xJbnN0YW5jZVN0YXJ0KXRocm93IG5ldyBFcnJvcihcImJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkIHNob3VsZCBiZSAwXCIpO2NvbnN0IGU9cy5nZXRTb3J0ZWRTeW1ib2xJbmRleGVzKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wOy0tdCl7Y29uc3QgaT1lW3RdO0Qocy5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpLHMuY29sbGlzaW9uQXJyYXlzW2ldLGkpO319ZWxzZSBmb3IobGV0IGU9dC5zeW1ib2xJbnN0YW5jZVN0YXJ0O2U8dC5zeW1ib2xJbnN0YW5jZUVuZDtlKyspRChzLnN5bWJvbEluc3RhbmNlcy5nZXQoZSkscy5jb2xsaXNpb25BcnJheXNbZV0sZSk7aWYoYSYmcy5idWNrZXRJbnN0YW5jZUlkIGluIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzKXtjb25zdCB0PXRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW3MuYnVja2V0SW5zdGFuY2VJZF07ZS5hcyh0LmludlByb2pNYXRyaXgsbCksdC52aWV3cG9ydE1hdHJpeD10aGlzLmNvbGxpc2lvbkluZGV4LmdldFZpZXdwb3J0TWF0cml4KCk7fXMuanVzdFJlbG9hZGVkPSExO31zdG9yZUNvbGxpc2lvbkRhdGEodCxlLGksYSxzLG8pe2lmKGkudGV4dEJveHx8aS5pY29uQm94KXtsZXQgbyxyO3RoaXMuY29sbGlzaW9uQm94QXJyYXlzLmhhcyh0KT9vPXRoaXMuY29sbGlzaW9uQm94QXJyYXlzLmdldCh0KToobz1uZXcgTWFwLHRoaXMuY29sbGlzaW9uQm94QXJyYXlzLnNldCh0LG8pKSxvLmhhcyhlKT9yPW8uZ2V0KGUpOihyPXt0ZXh0Om51bGwsaWNvbjpudWxsfSxvLnNldChlLHIpKSxpLnRleHRCb3gmJihyLnRleHQ9YS5ib3gpLGkuaWNvbkJveCYmKHIuaWNvbj1zLmJveCk7fWlmKG8pe2xldCBlPXRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW3RdO3ZvaWQgMD09PWUmJihlPXRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW3RdPW5ldyBqdCk7Zm9yKGxldCB0PTA7dDxvLmNpcmNsZXMubGVuZ3RoO3QrPTQpZS5jaXJjbGVzLnB1c2goby5jaXJjbGVzW3QrMF0pLGUuY2lyY2xlcy5wdXNoKG8uY2lyY2xlc1t0KzFdKSxlLmNpcmNsZXMucHVzaChvLmNpcmNsZXNbdCsyXSksZS5jaXJjbGVzLnB1c2goby5jb2xsaXNpb25EZXRlY3RlZD8xOjApO319bWFya1VzZWRKdXN0aWZpY2F0aW9uKHQsaSxhLHMpe2xldCBvO289cz09PWUuYWgudmVydGljYWw/YS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleDp7bGVmdDphLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsY2VudGVyOmEuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LHJpZ2h0OmEucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXh9W2UuYXQoaSldO2NvbnN0IHI9W2EubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxhLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxhLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LGEudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXhdO2Zvcihjb25zdCBlIG9mIHIpZT49MCYmKHQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoZSkuY3Jvc3NUaWxlSUQ9bz49MCYmZSE9PW8/MDphLmNyb3NzVGlsZUlEKTt9bWFya1VzZWRPcmllbnRhdGlvbih0LGksYSl7Y29uc3Qgcz1pPT09ZS5haC5ob3Jpem9udGFsfHxpPT09ZS5haC5ob3Jpem9udGFsT25seT9pOjAsbz1pPT09ZS5haC52ZXJ0aWNhbD9pOjAscj1bYS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LGEuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LGEucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhdO2Zvcihjb25zdCBlIG9mIHIpdC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChlKS5wbGFjZWRPcmllbnRhdGlvbj1zO2EudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgmJih0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGEudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLnBsYWNlZE9yaWVudGF0aW9uPW8pO31jb21taXQodCl7dGhpcy5jb21taXRUaW1lPXQsdGhpcy56b29tQXRMYXN0UmVjZW5jeUNoZWNrPXRoaXMudHJhbnNmb3JtLnpvb207Y29uc3QgZT10aGlzLnByZXZQbGFjZW1lbnQ7bGV0IGk9ITE7dGhpcy5wcmV2Wm9vbUFkanVzdG1lbnQ9ZT9lLnpvb21BZGp1c3RtZW50KHRoaXMudHJhbnNmb3JtLnpvb20pOjA7Y29uc3QgYT1lP2Uuc3ltYm9sRmFkZUNoYW5nZSh0KToxLHM9ZT9lLm9wYWNpdGllczp7fSxvPWU/ZS52YXJpYWJsZU9mZnNldHM6e30scj1lP2UucGxhY2VkT3JpZW50YXRpb25zOnt9O2Zvcihjb25zdCB0IGluIHRoaXMucGxhY2VtZW50cyl7Y29uc3QgZT10aGlzLnBsYWNlbWVudHNbdF0sbz1zW3RdO28/KHRoaXMub3BhY2l0aWVzW3RdPW5ldyBOdChvLGEsZS50ZXh0LGUuaWNvbiksaT1pfHxlLnRleHQhPT1vLnRleHQucGxhY2VkfHxlLmljb24hPT1vLmljb24ucGxhY2VkKToodGhpcy5vcGFjaXRpZXNbdF09bmV3IE50KG51bGwsYSxlLnRleHQsZS5pY29uLGUuc2tpcEZhZGUpLGk9aXx8ZS50ZXh0fHxlLmljb24pO31mb3IoY29uc3QgdCBpbiBzKXtjb25zdCBlPXNbdF07aWYoIXRoaXMub3BhY2l0aWVzW3RdKXtjb25zdCBzPW5ldyBOdChlLGEsITEsITEpO3MuaXNIaWRkZW4oKXx8KHRoaXMub3BhY2l0aWVzW3RdPXMsaT1pfHxlLnRleHQucGxhY2VkfHxlLmljb24ucGxhY2VkKTt9fWZvcihjb25zdCB0IGluIG8pdGhpcy52YXJpYWJsZU9mZnNldHNbdF18fCF0aGlzLm9wYWNpdGllc1t0XXx8dGhpcy5vcGFjaXRpZXNbdF0uaXNIaWRkZW4oKXx8KHRoaXMudmFyaWFibGVPZmZzZXRzW3RdPW9bdF0pO2Zvcihjb25zdCB0IGluIHIpdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbdF18fCF0aGlzLm9wYWNpdGllc1t0XXx8dGhpcy5vcGFjaXRpZXNbdF0uaXNIaWRkZW4oKXx8KHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3RdPXJbdF0pO2lmKGUmJnZvaWQgMD09PWUubGFzdFBsYWNlbWVudENoYW5nZVRpbWUpdGhyb3cgbmV3IEVycm9yKFwiTGFzdCBwbGFjZW1lbnQgdGltZSBmb3IgcHJldmlvdXMgcGxhY2VtZW50IGlzIG5vdCBkZWZpbmVkXCIpO2k/dGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZT10OlwibnVtYmVyXCIhPXR5cGVvZiB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lJiYodGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZT1lP2UubGFzdFBsYWNlbWVudENoYW5nZVRpbWU6dCk7fXVwZGF0ZUxheWVyT3BhY2l0aWVzKHQsZSl7Y29uc3QgaT17fTtmb3IoY29uc3QgYSBvZiBlKXtjb25zdCBlPWEuZ2V0QnVja2V0KHQpO2UmJmEubGF0ZXN0RmVhdHVyZUluZGV4JiZ0LmlkPT09ZS5sYXllcklkc1swXSYmdGhpcy51cGRhdGVCdWNrZXRPcGFjaXRpZXMoZSxhLnRpbGVJRCxpLGEuY29sbGlzaW9uQm94QXJyYXkpO319dXBkYXRlQnVja2V0T3BhY2l0aWVzKHQsaSxhLHMpe3QuaGFzVGV4dERhdGEoKSYmKHQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKSx0LnRleHQuaGFzVmlzaWJsZVZlcnRpY2VzPSExKSx0Lmhhc0ljb25EYXRhKCkmJih0Lmljb24ub3BhY2l0eVZlcnRleEFycmF5LmNsZWFyKCksdC5pY29uLmhhc1Zpc2libGVWZXJ0aWNlcz0hMSksdC5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpJiZ0Lmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKSx0Lmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkmJnQudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheS5jbGVhcigpO2NvbnN0IG89dC5sYXllcnNbMF0scj1vLmxheW91dCxuPW5ldyBOdChudWxsLDAsITEsITEsITApLGw9ci5nZXQoXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIiksaD1yLmdldChcImljb24tYWxsb3ctb3ZlcmxhcFwiKSxjPW8uX3VuZXZhbHVhdGVkTGF5b3V0Lmhhc1ZhbHVlKFwidGV4dC12YXJpYWJsZS1hbmNob3JcIil8fG8uX3VuZXZhbHVhdGVkTGF5b3V0Lmhhc1ZhbHVlKFwidGV4dC12YXJpYWJsZS1hbmNob3Itb2Zmc2V0XCIpLHU9XCJtYXBcIj09PXIuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIiksZD1cIm1hcFwiPT09ci5nZXQoXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiKSxfPVwibm9uZVwiIT09ci5nZXQoXCJpY29uLXRleHQtZml0XCIpLHA9bmV3IE50KG51bGwsMCxsJiYoaHx8IXQuaGFzSWNvbkRhdGEoKXx8ci5nZXQoXCJpY29uLW9wdGlvbmFsXCIpKSxoJiYobHx8IXQuaGFzVGV4dERhdGEoKXx8ci5nZXQoXCJ0ZXh0LW9wdGlvbmFsXCIpKSwhMCk7IXQuY29sbGlzaW9uQXJyYXlzJiZzJiYodC5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpfHx0Lmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkpJiZ0LmRlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXMocyk7Y29uc3QgbT0odCxlLGkpPT57Zm9yKGxldCBhPTA7YTxlLzQ7YSsrKXQub3BhY2l0eVZlcnRleEFycmF5LmVtcGxhY2VCYWNrKGkpO3QuaGFzVmlzaWJsZVZlcnRpY2VzPXQuaGFzVmlzaWJsZVZlcnRpY2VzfHxpIT09ZWU7fSxmPXRoaXMuY29sbGlzaW9uQm94QXJyYXlzLmdldCh0LmJ1Y2tldEluc3RhbmNlSWQpO2ZvcihsZXQgaT0wO2k8dC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoO2krKyl7Y29uc3Qgcz10LnN5bWJvbEluc3RhbmNlcy5nZXQoaSkse251bUhvcml6b250YWxHbHlwaFZlcnRpY2VzOm8sbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzOnIsY3Jvc3NUaWxlSUQ6bH09cztsZXQgaD10aGlzLm9wYWNpdGllc1tsXTthW2xdP2g9bjpofHwoaD1wLHRoaXMub3BhY2l0aWVzW2xdPWgpLGFbbF09ITA7Y29uc3QgZz1zLm51bUljb25WZXJ0aWNlcz4wLHY9dGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbcy5jcm9zc1RpbGVJRF0seD12PT09ZS5haC52ZXJ0aWNhbCx5PXY9PT1lLmFoLmhvcml6b250YWx8fHY9PT1lLmFoLmhvcml6b250YWxPbmx5O2lmKG8+MHx8cj4wKXtjb25zdCBlPXRlKGgudGV4dCk7bSh0LnRleHQsbyx4P2VlOmUpLG0odC50ZXh0LHIseT9lZTplKTtjb25zdCBpPWgudGV4dC5pc0hpZGRlbigpO1tzLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LHMuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LHMubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleF0uZm9yRWFjaCgoZT0+e2U+PTAmJih0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGUpLmhpZGRlbj1pfHx4PzE6MCk7fSkpLHMudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXg+PTAmJih0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHMudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLmhpZGRlbj1pfHx5PzE6MCk7Y29uc3QgYT10aGlzLnZhcmlhYmxlT2Zmc2V0c1tzLmNyb3NzVGlsZUlEXTthJiZ0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbih0LGEuYW5jaG9yLHMsdik7Y29uc3Qgbj10aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tzLmNyb3NzVGlsZUlEXTtuJiYodGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24odCxcImxlZnRcIixzLG4pLHRoaXMubWFya1VzZWRPcmllbnRhdGlvbih0LG4scykpO31pZihnKXtjb25zdCBlPXRlKGguaWNvbiksaT0hKF8mJnMudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgmJngpO3MucGxhY2VkSWNvblN5bWJvbEluZGV4Pj0wJiYobSh0Lmljb24scy5udW1JY29uVmVydGljZXMsaT9lOmVlKSx0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHMucGxhY2VkSWNvblN5bWJvbEluZGV4KS5oaWRkZW49aC5pY29uLmlzSGlkZGVuKCkpLHMudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXg+PTAmJihtKHQuaWNvbixzLm51bVZlcnRpY2FsSWNvblZlcnRpY2VzLGk/ZWU6ZSksdC5pY29uLnBsYWNlZFN5bWJvbEFycmF5LmdldChzLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4KS5oaWRkZW49aC5pY29uLmlzSGlkZGVuKCkpO31jb25zdCBiPWYmJmYuaGFzKGkpP2YuZ2V0KGkpOnt0ZXh0Om51bGwsaWNvbjpudWxsfTtpZih0Lmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCl8fHQuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSl7Y29uc3QgYT10LmNvbGxpc2lvbkFycmF5c1tpXTtpZihhKXtsZXQgaT1uZXcgZS5QKDAsMCk7aWYoYS50ZXh0Qm94fHxhLnZlcnRpY2FsVGV4dEJveCl7bGV0IGU9ITA7aWYoYyl7Y29uc3QgdD10aGlzLnZhcmlhYmxlT2Zmc2V0c1tsXTt0PyhpPVZ0KHQuYW5jaG9yLHQud2lkdGgsdC5oZWlnaHQsdC50ZXh0T2Zmc2V0LHQudGV4dEJveFNjYWxlKSx1JiZpLl9yb3RhdGUoZD90aGlzLnRyYW5zZm9ybS5hbmdsZTotdGhpcy50cmFuc2Zvcm0uYW5nbGUpKTplPSExO31pZihhLnRleHRCb3h8fGEudmVydGljYWxUZXh0Qm94KXtsZXQgczthLnRleHRCb3gmJihzPXgpLGEudmVydGljYWxUZXh0Qm94JiYocz15KSxIdCh0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksaC50ZXh0LnBsYWNlZCwhZXx8cyxiLnRleHQsaS54LGkueSk7fX1pZihhLmljb25Cb3h8fGEudmVydGljYWxJY29uQm94KXtjb25zdCBlPUJvb2xlYW4oIXkmJmEudmVydGljYWxJY29uQm94KTtsZXQgczthLmljb25Cb3gmJihzPWUpLGEudmVydGljYWxJY29uQm94JiYocz0hZSksSHQodC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LGguaWNvbi5wbGFjZWQscyxiLmljb24sXz9pLng6MCxfP2kueTowKTt9fX19aWYodC5zb3J0RmVhdHVyZXModGhpcy50cmFuc2Zvcm0uYW5nbGUpLHRoaXMucmV0YWluZWRRdWVyeURhdGFbdC5idWNrZXRJbnN0YW5jZUlkXSYmKHRoaXMucmV0YWluZWRRdWVyeURhdGFbdC5idWNrZXRJbnN0YW5jZUlkXS5mZWF0dXJlU29ydE9yZGVyPXQuZmVhdHVyZVNvcnRPcmRlciksdC5oYXNUZXh0RGF0YSgpJiZ0LnRleHQub3BhY2l0eVZlcnRleEJ1ZmZlciYmdC50ZXh0Lm9wYWNpdHlWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YSh0LnRleHQub3BhY2l0eVZlcnRleEFycmF5KSx0Lmhhc0ljb25EYXRhKCkmJnQuaWNvbi5vcGFjaXR5VmVydGV4QnVmZmVyJiZ0Lmljb24ub3BhY2l0eVZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkpLHQuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSYmdC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlciYmdC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHQuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSksdC5oYXNUZXh0Q29sbGlzaW9uQm94RGF0YSgpJiZ0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyJiZ0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyLnVwZGF0ZURhdGEodC50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5KSx0LnRleHQub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aCE9PXQudGV4dC5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgvNCl0aHJvdyBuZXcgRXJyb3IoYGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGggKD0gJHt0LnRleHQub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aH0pICE9PSBidWNrZXQudGV4dC5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggKD0gJHt0LnRleHQubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RofSkgLyA0YCk7aWYodC5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGghPT10Lmljb24ubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLzQpdGhyb3cgbmV3IEVycm9yKGBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkubGVuZ3RoICg9ICR7dC5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGh9KSAhPT0gYnVja2V0Lmljb24ubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoICg9ICR7dC5pY29uLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aH0pIC8gNGApO2lmKHQuYnVja2V0SW5zdGFuY2VJZCBpbiB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5cyl7Y29uc3QgZT10aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5c1t0LmJ1Y2tldEluc3RhbmNlSWRdO3QucGxhY2VtZW50SW52UHJvak1hdHJpeD1lLmludlByb2pNYXRyaXgsdC5wbGFjZW1lbnRWaWV3cG9ydE1hdHJpeD1lLnZpZXdwb3J0TWF0cml4LHQuY29sbGlzaW9uQ2lyY2xlQXJyYXk9ZS5jaXJjbGVzLGRlbGV0ZSB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5c1t0LmJ1Y2tldEluc3RhbmNlSWRdO319c3ltYm9sRmFkZUNoYW5nZSh0KXtyZXR1cm4gMD09PXRoaXMuZmFkZUR1cmF0aW9uPzE6KHQtdGhpcy5jb21taXRUaW1lKS90aGlzLmZhZGVEdXJhdGlvbit0aGlzLnByZXZab29tQWRqdXN0bWVudH16b29tQWRqdXN0bWVudCh0KXtyZXR1cm4gTWF0aC5tYXgoMCwodGhpcy50cmFuc2Zvcm0uem9vbS10KS8xLjUpfWhhc1RyYW5zaXRpb25zKHQpe3JldHVybiB0aGlzLnN0YWxlfHx0LXRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWU8dGhpcy5mYWRlRHVyYXRpb259c3RpbGxSZWNlbnQodCxlKXtjb25zdCBpPXRoaXMuem9vbUF0TGFzdFJlY2VuY3lDaGVjaz09PWU/MS10aGlzLnpvb21BZGp1c3RtZW50KGUpOjE7cmV0dXJuIHRoaXMuem9vbUF0TGFzdFJlY2VuY3lDaGVjaz1lLHRoaXMuY29tbWl0VGltZSt0aGlzLmZhZGVEdXJhdGlvbippPnR9c2V0U3RhbGUoKXt0aGlzLnN0YWxlPSEwO319ZnVuY3Rpb24gSHQodCxlLGksYSxzLG8pe2EmJjAhPT1hLmxlbmd0aHx8KGE9WzAsMCwwLDBdKTtjb25zdCByPWFbMF0tTHQsbj1hWzFdLUx0LGw9YVsyXS1MdCxoPWFbM10tTHQ7dC5lbXBsYWNlQmFjayhlPzE6MCxpPzE6MCxzfHwwLG98fDAscixuKSx0LmVtcGxhY2VCYWNrKGU/MTowLGk/MTowLHN8fDAsb3x8MCxsLG4pLHQuZW1wbGFjZUJhY2soZT8xOjAsaT8xOjAsc3x8MCxvfHwwLGwsaCksdC5lbXBsYWNlQmFjayhlPzE6MCxpPzE6MCxzfHwwLG98fDAscixoKTt9Y29uc3QgV3Q9TWF0aC5wb3coMiwyNSksJHQ9TWF0aC5wb3coMiwyNCksWHQ9TWF0aC5wb3coMiwxNyksS3Q9TWF0aC5wb3coMiwxNiksSnQ9TWF0aC5wb3coMiw5KSxZdD1NYXRoLnBvdygyLDgpLFF0PU1hdGgucG93KDIsMSk7ZnVuY3Rpb24gdGUodCl7aWYoMD09PXQub3BhY2l0eSYmIXQucGxhY2VkKXJldHVybiAwO2lmKDE9PT10Lm9wYWNpdHkmJnQucGxhY2VkKXJldHVybiA0Mjk0OTY3Mjk1O2NvbnN0IGU9dC5wbGFjZWQ/MTowLGk9TWF0aC5mbG9vcigxMjcqdC5vcGFjaXR5KTtyZXR1cm4gaSpXdCtlKiR0K2kqWHQrZSpLdCtpKkp0K2UqWXQraSpRdCtlfWNvbnN0IGVlPTA7ZnVuY3Rpb24gaWUoKXtyZXR1cm4ge2lzT2NjbHVkZWQ6KHQsZSxpKT0+ITEsZ2V0UGl0Y2hlZFRleHRDb3JyZWN0aW9uOih0LGUsaSk9PjEsZ2V0IHVzZVNwZWNpYWxQcm9qZWN0aW9uRm9yU3ltYm9scygpe3JldHVybiAhMX0scHJvamVjdFRpbGVDb29yZGluYXRlcyh0LGUsaSxhKXt0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQuXCIpfSx0cmFuc2xhdGVQb3NpdGlvbjoodCxlLGksYSk9PmZ1bmN0aW9uKHQsZSxpLGEscz0hMSl7aWYoIWlbMF0mJiFpWzFdKXJldHVybiBbMCwwXTtjb25zdCBvPXM/XCJtYXBcIj09PWE/dC5hbmdsZTowOlwidmlld3BvcnRcIj09PWE/LXQuYW5nbGU6MDtpZihvKXtjb25zdCB0PU1hdGguc2luKG8pLGU9TWF0aC5jb3Mobyk7aT1baVswXSplLWlbMV0qdCxpWzBdKnQraVsxXSplXTt9cmV0dXJuIFtzP2lbMF06QnQoZSxpWzBdLHQuem9vbSkscz9pWzFdOkJ0KGUsaVsxXSx0Lnpvb20pXX0odCxlLGksYSksZ2V0Q2lyY2xlUmFkaXVzQ29ycmVjdGlvbjp0PT4xfX1jbGFzcyBhZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9zb3J0QWNyb3NzVGlsZXM9XCJ2aWV3cG9ydC15XCIhPT10LmxheW91dC5nZXQoXCJzeW1ib2wtei1vcmRlclwiKSYmIXQubGF5b3V0LmdldChcInN5bWJvbC1zb3J0LWtleVwiKS5pc0NvbnN0YW50KCksdGhpcy5fY3VycmVudFRpbGVJbmRleD0wLHRoaXMuX2N1cnJlbnRQYXJ0SW5kZXg9MCx0aGlzLl9zZWVuQ3Jvc3NUaWxlSURzPXt9LHRoaXMuX2J1Y2tldFBhcnRzPVtdO31jb250aW51ZVBsYWNlbWVudCh0LGUsaSxhLHMpe2NvbnN0IG89dGhpcy5fYnVja2V0UGFydHM7Zm9yKDt0aGlzLl9jdXJyZW50VGlsZUluZGV4PHQubGVuZ3RoOylpZihlLmdldEJ1Y2tldFBhcnRzKG8sYSx0W3RoaXMuX2N1cnJlbnRUaWxlSW5kZXhdLHRoaXMuX3NvcnRBY3Jvc3NUaWxlcyksdGhpcy5fY3VycmVudFRpbGVJbmRleCsrLHMoKSlyZXR1cm4gITA7Zm9yKHRoaXMuX3NvcnRBY3Jvc3NUaWxlcyYmKHRoaXMuX3NvcnRBY3Jvc3NUaWxlcz0hMSxvLnNvcnQoKCh0LGUpPT50LnNvcnRLZXktZS5zb3J0S2V5KSkpO3RoaXMuX2N1cnJlbnRQYXJ0SW5kZXg8by5sZW5ndGg7KWlmKGUucGxhY2VMYXllckJ1Y2tldFBhcnQob1t0aGlzLl9jdXJyZW50UGFydEluZGV4XSx0aGlzLl9zZWVuQ3Jvc3NUaWxlSURzLGkpLHRoaXMuX2N1cnJlbnRQYXJ0SW5kZXgrKyxzKCkpcmV0dXJuICEwO3JldHVybiAhMX19Y2xhc3Mgc2V7Y29uc3RydWN0b3IodCxlLGksYSxzLG8scixuKXt0aGlzLnBsYWNlbWVudD1uZXcgR3QodCxpZSgpLGUsbyxyLG4pLHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleD1pLmxlbmd0aC0xLHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudD1hLHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcz1zLHRoaXMuX2RvbmU9ITE7fWlzRG9uZSgpe3JldHVybiB0aGlzLl9kb25lfWNvbnRpbnVlUGxhY2VtZW50KHQsZSxpKXtjb25zdCBhPW8ubm93KCkscz0oKT0+IXRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCYmby5ub3coKS1hPjI7Zm9yKDt0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXg+PTA7KXtjb25zdCBhPWVbdFt0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXhdXSxvPXRoaXMucGxhY2VtZW50LmNvbGxpc2lvbkluZGV4LnRyYW5zZm9ybS56b29tO2lmKFwic3ltYm9sXCI9PT1hLnR5cGUmJighYS5taW56b29tfHxhLm1pbnpvb208PW8pJiYoIWEubWF4em9vbXx8YS5tYXh6b29tPm8pKXtpZih0aGlzLl9pblByb2dyZXNzTGF5ZXJ8fCh0aGlzLl9pblByb2dyZXNzTGF5ZXI9bmV3IGFlKGEpKSx0aGlzLl9pblByb2dyZXNzTGF5ZXIuY29udGludWVQbGFjZW1lbnQoaVthLnNvdXJjZV0sdGhpcy5wbGFjZW1lbnQsdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzLGEscykpcmV0dXJuO2RlbGV0ZSB0aGlzLl9pblByb2dyZXNzTGF5ZXI7fXRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleC0tO310aGlzLl9kb25lPSEwO31jb21taXQodCl7cmV0dXJuIHRoaXMucGxhY2VtZW50LmNvbW1pdCh0KSx0aGlzLnBsYWNlbWVudH19Y29uc3Qgb2U9NTEyL2UuWC8yO2NsYXNzIHJle2NvbnN0cnVjdG9yKHQsaSxhKXt0aGlzLnRpbGVJRD10LHRoaXMuYnVja2V0SW5zdGFuY2VJZD1hLHRoaXMuX3N5bWJvbHNCeUtleT17fTtjb25zdCBzPW5ldyBNYXA7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IGU9aS5nZXQodCksYT1lLmtleSxvPXMuZ2V0KGEpO28/by5wdXNoKGUpOnMuc2V0KGEsW2VdKTt9Zm9yKGNvbnN0W3QsaV1vZiBzKXtjb25zdCBhPXtwb3NpdGlvbnM6aS5tYXAoKHQ9Pih7eDpNYXRoLmZsb29yKHQuYW5jaG9yWCpvZSkseTpNYXRoLmZsb29yKHQuYW5jaG9yWSpvZSl9KSkpLGNyb3NzVGlsZUlEczppLm1hcCgodD0+dC5jcm9zc1RpbGVJRCkpfTtpZihhLnBvc2l0aW9ucy5sZW5ndGg+MTI4KXtjb25zdCB0PW5ldyBlLmF2KGEucG9zaXRpb25zLmxlbmd0aCwxNixVaW50MTZBcnJheSk7Zm9yKGNvbnN0e3g6ZSx5Oml9b2YgYS5wb3NpdGlvbnMpdC5hZGQoZSxpKTt0LmZpbmlzaCgpLGRlbGV0ZSBhLnBvc2l0aW9ucyxhLmluZGV4PXQ7fXRoaXMuX3N5bWJvbHNCeUtleVt0XT1hO319Z2V0U2NhbGVkQ29vcmRpbmF0ZXModCxpKXtjb25zdHt4OmEseTpzLHo6b309dGhpcy50aWxlSUQuY2Fub25pY2FsLHt4OnIseTpuLHo6bH09aS5jYW5vbmljYWwsaD1vZS9NYXRoLnBvdygyLGwtbyksYz0obiplLlgrdC5hbmNob3JZKSpoLHU9cyplLlgqb2U7cmV0dXJuIHt4Ok1hdGguZmxvb3IoKHIqZS5YK3QuYW5jaG9yWCkqaC1hKmUuWCpvZSkseTpNYXRoLmZsb29yKGMtdSl9fWZpbmRNYXRjaGVzKHQsZSxpKXtjb25zdCBhPXRoaXMudGlsZUlELmNhbm9uaWNhbC56PGUuY2Fub25pY2FsLno/MTpNYXRoLnBvdygyLHRoaXMudGlsZUlELmNhbm9uaWNhbC56LWUuY2Fub25pY2FsLnopO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBvPXQuZ2V0KHMpO2lmKG8uY3Jvc3NUaWxlSUQpY29udGludWU7Y29uc3Qgcj10aGlzLl9zeW1ib2xzQnlLZXlbby5rZXldO2lmKCFyKWNvbnRpbnVlO2NvbnN0IG49dGhpcy5nZXRTY2FsZWRDb29yZGluYXRlcyhvLGUpO2lmKHIuaW5kZXgpe2NvbnN0IHQ9ci5pbmRleC5yYW5nZShuLngtYSxuLnktYSxuLngrYSxuLnkrYSkuc29ydCgpO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9ci5jcm9zc1RpbGVJRHNbZV07aWYoIWlbdF0pe2lbdF09ITAsby5jcm9zc1RpbGVJRD10O2JyZWFrfX19ZWxzZSBpZihyLnBvc2l0aW9ucylmb3IobGV0IHQ9MDt0PHIucG9zaXRpb25zLmxlbmd0aDt0Kyspe2NvbnN0IGU9ci5wb3NpdGlvbnNbdF0scz1yLmNyb3NzVGlsZUlEc1t0XTtpZihNYXRoLmFicyhlLngtbi54KTw9YSYmTWF0aC5hYnMoZS55LW4ueSk8PWEmJiFpW3NdKXtpW3NdPSEwLG8uY3Jvc3NUaWxlSUQ9czticmVha319fX1nZXRDcm9zc1RpbGVJRHNMaXN0cygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3N5bWJvbHNCeUtleSkubWFwKCgoe2Nyb3NzVGlsZUlEczp0fSk9PnQpKX19Y2xhc3MgbmV7Y29uc3RydWN0b3IoKXt0aGlzLm1heENyb3NzVGlsZUlEPTA7fWdlbmVyYXRlKCl7cmV0dXJuICsrdGhpcy5tYXhDcm9zc1RpbGVJRH19Y2xhc3MgbGV7Y29uc3RydWN0b3IoKXt0aGlzLmluZGV4ZXM9e30sdGhpcy51c2VkQ3Jvc3NUaWxlSURzPXt9LHRoaXMubG5nPTA7fWhhbmRsZVdyYXBKdW1wKHQpe2NvbnN0IGU9TWF0aC5yb3VuZCgodC10aGlzLmxuZykvMzYwKTtpZigwIT09ZSlmb3IoY29uc3QgdCBpbiB0aGlzLmluZGV4ZXMpe2NvbnN0IGk9dGhpcy5pbmRleGVzW3RdLGE9e307Zm9yKGNvbnN0IHQgaW4gaSl7Y29uc3Qgcz1pW3RdO3MudGlsZUlEPXMudGlsZUlELnVud3JhcFRvKHMudGlsZUlELndyYXArZSksYVtzLnRpbGVJRC5rZXldPXM7fXRoaXMuaW5kZXhlc1t0XT1hO310aGlzLmxuZz10O31hZGRCdWNrZXQodCxlLGkpe2lmKHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXSYmdGhpcy5pbmRleGVzW3Qub3ZlcnNjYWxlZFpdW3Qua2V5XSl7aWYodGhpcy5pbmRleGVzW3Qub3ZlcnNjYWxlZFpdW3Qua2V5XS5idWNrZXRJbnN0YW5jZUlkPT09ZS5idWNrZXRJbnN0YW5jZUlkKXJldHVybiAhMTt0aGlzLnJlbW92ZUJ1Y2tldENyb3NzVGlsZUlEcyh0Lm92ZXJzY2FsZWRaLHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXVt0LmtleV0pO31mb3IobGV0IHQ9MDt0PGUuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDt0KyspZS5zeW1ib2xJbnN0YW5jZXMuZ2V0KHQpLmNyb3NzVGlsZUlEPTA7dGhpcy51c2VkQ3Jvc3NUaWxlSURzW3Qub3ZlcnNjYWxlZFpdfHwodGhpcy51c2VkQ3Jvc3NUaWxlSURzW3Qub3ZlcnNjYWxlZFpdPXt9KTtjb25zdCBhPXRoaXMudXNlZENyb3NzVGlsZUlEc1t0Lm92ZXJzY2FsZWRaXTtmb3IoY29uc3QgaSBpbiB0aGlzLmluZGV4ZXMpe2NvbnN0IHM9dGhpcy5pbmRleGVzW2ldO2lmKE51bWJlcihpKT50Lm92ZXJzY2FsZWRaKWZvcihjb25zdCBpIGluIHMpe2NvbnN0IG89c1tpXTtvLnRpbGVJRC5pc0NoaWxkT2YodCkmJm8uZmluZE1hdGNoZXMoZS5zeW1ib2xJbnN0YW5jZXMsdCxhKTt9ZWxzZSB7Y29uc3Qgbz1zW3Quc2NhbGVkVG8oTnVtYmVyKGkpKS5rZXldO28mJm8uZmluZE1hdGNoZXMoZS5zeW1ib2xJbnN0YW5jZXMsdCxhKTt9fWZvcihsZXQgdD0wO3Q8ZS5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoO3QrKyl7Y29uc3Qgcz1lLnN5bWJvbEluc3RhbmNlcy5nZXQodCk7cy5jcm9zc1RpbGVJRHx8KHMuY3Jvc3NUaWxlSUQ9aS5nZW5lcmF0ZSgpLGFbcy5jcm9zc1RpbGVJRF09ITApO31yZXR1cm4gdm9pZCAwPT09dGhpcy5pbmRleGVzW3Qub3ZlcnNjYWxlZFpdJiYodGhpcy5pbmRleGVzW3Qub3ZlcnNjYWxlZFpdPXt9KSx0aGlzLmluZGV4ZXNbdC5vdmVyc2NhbGVkWl1bdC5rZXldPW5ldyByZSh0LGUuc3ltYm9sSW5zdGFuY2VzLGUuYnVja2V0SW5zdGFuY2VJZCksITB9cmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHQsZSl7Zm9yKGNvbnN0IGkgb2YgZS5nZXRDcm9zc1RpbGVJRHNMaXN0cygpKWZvcihjb25zdCBlIG9mIGkpZGVsZXRlIHRoaXMudXNlZENyb3NzVGlsZUlEc1t0XVtlXTt9cmVtb3ZlU3RhbGVCdWNrZXRzKHQpe2xldCBlPSExO2Zvcihjb25zdCBpIGluIHRoaXMuaW5kZXhlcyl7Y29uc3QgYT10aGlzLmluZGV4ZXNbaV07Zm9yKGNvbnN0IHMgaW4gYSl0W2Fbc10uYnVja2V0SW5zdGFuY2VJZF18fCh0aGlzLnJlbW92ZUJ1Y2tldENyb3NzVGlsZUlEcyhpLGFbc10pLGRlbGV0ZSBhW3NdLGU9ITApO31yZXR1cm4gZX19Y2xhc3MgaGV7Y29uc3RydWN0b3IoKXt0aGlzLmxheWVySW5kZXhlcz17fSx0aGlzLmNyb3NzVGlsZUlEcz1uZXcgbmUsdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkPTAsdGhpcy5idWNrZXRzSW5DdXJyZW50UGxhY2VtZW50PXt9O31hZGRMYXllcih0LGUsaSl7bGV0IGE9dGhpcy5sYXllckluZGV4ZXNbdC5pZF07dm9pZCAwPT09YSYmKGE9dGhpcy5sYXllckluZGV4ZXNbdC5pZF09bmV3IGxlKTtsZXQgcz0hMTtjb25zdCBvPXt9O2EuaGFuZGxlV3JhcEp1bXAoaSk7Zm9yKGNvbnN0IGkgb2YgZSl7Y29uc3QgZT1pLmdldEJ1Y2tldCh0KTtlJiZ0LmlkPT09ZS5sYXllcklkc1swXSYmKGUuYnVja2V0SW5zdGFuY2VJZHx8KGUuYnVja2V0SW5zdGFuY2VJZD0rK3RoaXMubWF4QnVja2V0SW5zdGFuY2VJZCksYS5hZGRCdWNrZXQoaS50aWxlSUQsZSx0aGlzLmNyb3NzVGlsZUlEcykmJihzPSEwKSxvW2UuYnVja2V0SW5zdGFuY2VJZF09ITApO31yZXR1cm4gYS5yZW1vdmVTdGFsZUJ1Y2tldHMobykmJihzPSEwKSxzfXBydW5lVW51c2VkTGF5ZXJzKHQpe2NvbnN0IGU9e307dC5mb3JFYWNoKCh0PT57ZVt0XT0hMDt9KSk7Zm9yKGNvbnN0IHQgaW4gdGhpcy5sYXllckluZGV4ZXMpZVt0XXx8ZGVsZXRlIHRoaXMubGF5ZXJJbmRleGVzW3RdO319Y29uc3QgY2U9KHQsaSk9PmUudCh0LGkmJmkuZmlsdGVyKCh0PT5cInNvdXJjZS5jYW52YXNcIiE9PXQuaWRlbnRpZmllcikpKSx1ZT1lLmF3KCk7Y2xhc3MgZGUgZXh0ZW5kcyBlLkV7Y29uc3RydWN0b3IodCxpPXt9KXtzdXBlcigpLHRoaXMuX3J0bFBsdWdpbkxvYWRlZD0oKT0+e2Zvcihjb25zdCB0IGluIHRoaXMuc291cmNlQ2FjaGVzKXtjb25zdCBlPXRoaXMuc291cmNlQ2FjaGVzW3RdLmdldFNvdXJjZSgpLnR5cGU7XCJ2ZWN0b3JcIiE9PWUmJlwiZ2VvanNvblwiIT09ZXx8dGhpcy5zb3VyY2VDYWNoZXNbdF0ucmVsb2FkKCk7fX0sdGhpcy5tYXA9dCx0aGlzLmRpc3BhdGNoZXI9bmV3IFUoTigpLHQuX2dldE1hcElkKCkpLHRoaXMuZGlzcGF0Y2hlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFwiR0dcIiwoKHQsZSk9PnRoaXMuZ2V0R2x5cGhzKHQsZSkpKSx0aGlzLmRpc3BhdGNoZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihcIkdJXCIsKCh0LGUpPT50aGlzLmdldEltYWdlcyh0LGUpKSksdGhpcy5pbWFnZU1hbmFnZXI9bmV3IFQsdGhpcy5pbWFnZU1hbmFnZXIuc2V0RXZlbnRlZFBhcmVudCh0aGlzKSx0aGlzLmdseXBoTWFuYWdlcj1uZXcgQyh0Ll9yZXF1ZXN0TWFuYWdlcixpLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSksdGhpcy5saW5lQXRsYXM9bmV3IFIoMjU2LDUxMiksdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleD1uZXcgaGUsdGhpcy5fc3ByaXRlc0ltYWdlc0lkcz17fSx0aGlzLl9sYXllcnM9e30sdGhpcy5fb3JkZXI9W10sdGhpcy5zb3VyY2VDYWNoZXM9e30sdGhpcy56b29tSGlzdG9yeT1uZXcgZS5heCx0aGlzLl9sb2FkZWQ9ITEsdGhpcy5fYXZhaWxhYmxlSW1hZ2VzPVtdLHRoaXMuX3Jlc2V0VXBkYXRlcygpLHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoXCJTUlwiLGUuYXkoKSksbnQoKS5vbihzdCx0aGlzLl9ydGxQbHVnaW5Mb2FkZWQpLHRoaXMub24oXCJkYXRhXCIsKHQ9PntpZihcInNvdXJjZVwiIT09dC5kYXRhVHlwZXx8XCJtZXRhZGF0YVwiIT09dC5zb3VyY2VEYXRhVHlwZSlyZXR1cm47Y29uc3QgZT10aGlzLnNvdXJjZUNhY2hlc1t0LnNvdXJjZUlkXTtpZighZSlyZXR1cm47Y29uc3QgaT1lLmdldFNvdXJjZSgpO2lmKGkmJmkudmVjdG9yTGF5ZXJJZHMpZm9yKGNvbnN0IHQgaW4gdGhpcy5fbGF5ZXJzKXtjb25zdCBlPXRoaXMuX2xheWVyc1t0XTtlLnNvdXJjZT09PWkuaWQmJnRoaXMuX3ZhbGlkYXRlTGF5ZXIoZSk7fX0pKTt9bG9hZFVSTCh0LGk9e30sYSl7dGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhbG9hZGluZ1wiLHtkYXRhVHlwZTpcInN0eWxlXCJ9KSksaS52YWxpZGF0ZT1cImJvb2xlYW5cIiE9dHlwZW9mIGkudmFsaWRhdGV8fGkudmFsaWRhdGU7Y29uc3Qgcz10aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh0LFwiU3R5bGVcIik7dGhpcy5fbG9hZFN0eWxlUmVxdWVzdD1uZXcgQWJvcnRDb250cm9sbGVyO2NvbnN0IG89dGhpcy5fbG9hZFN0eWxlUmVxdWVzdDtlLmgocyx0aGlzLl9sb2FkU3R5bGVSZXF1ZXN0KS50aGVuKCh0PT57dGhpcy5fbG9hZFN0eWxlUmVxdWVzdD1udWxsLHRoaXMuX2xvYWQodC5kYXRhLGksYSk7fSkpLmNhdGNoKCh0PT57dGhpcy5fbG9hZFN0eWxlUmVxdWVzdD1udWxsLHQmJiFvLnNpZ25hbC5hYm9ydGVkJiZ0aGlzLmZpcmUobmV3IGUuaih0KSk7fSkpO31sb2FkSlNPTih0LGk9e30sYSl7dGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhbG9hZGluZ1wiLHtkYXRhVHlwZTpcInN0eWxlXCJ9KSksdGhpcy5fZnJhbWVSZXF1ZXN0PW5ldyBBYm9ydENvbnRyb2xsZXIsby5mcmFtZUFzeW5jKHRoaXMuX2ZyYW1lUmVxdWVzdCkudGhlbigoKCk9Pnt0aGlzLl9mcmFtZVJlcXVlc3Q9bnVsbCxpLnZhbGlkYXRlPSExIT09aS52YWxpZGF0ZSx0aGlzLl9sb2FkKHQsaSxhKTt9KSkuY2F0Y2goKCgpPT57fSkpO31sb2FkRW1wdHkoKXt0aGlzLmZpcmUobmV3IGUuayhcImRhdGFsb2FkaW5nXCIse2RhdGFUeXBlOlwic3R5bGVcIn0pKSx0aGlzLl9sb2FkKHVlLHt2YWxpZGF0ZTohMX0pO31fbG9hZCh0LGksYSl7dmFyIHM7Y29uc3Qgbz1pLnRyYW5zZm9ybVN0eWxlP2kudHJhbnNmb3JtU3R5bGUoYSx0KTp0O2lmKCFpLnZhbGlkYXRlfHwhY2UodGhpcyxlLnUobykpKXt0aGlzLl9sb2FkZWQ9ITAsdGhpcy5zdHlsZXNoZWV0PW87Zm9yKGNvbnN0IHQgaW4gby5zb3VyY2VzKXRoaXMuYWRkU291cmNlKHQsby5zb3VyY2VzW3RdLHt2YWxpZGF0ZTohMX0pO28uc3ByaXRlP3RoaXMuX2xvYWRTcHJpdGUoby5zcHJpdGUpOnRoaXMuaW1hZ2VNYW5hZ2VyLnNldExvYWRlZCghMCksdGhpcy5nbHlwaE1hbmFnZXIuc2V0VVJMKG8uZ2x5cGhzKSx0aGlzLl9jcmVhdGVMYXllcnMoKSx0aGlzLmxpZ2h0PW5ldyBEKHRoaXMuc3R5bGVzaGVldC5saWdodCksdGhpcy5za3k9bmV3IEEodGhpcy5zdHlsZXNoZWV0LnNreSksdGhpcy5tYXAuc2V0VGVycmFpbihudWxsIT09KHM9dGhpcy5zdHlsZXNoZWV0LnRlcnJhaW4pJiZ2b2lkIDAhPT1zP3M6bnVsbCksdGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhXCIse2RhdGFUeXBlOlwic3R5bGVcIn0pKSx0aGlzLmZpcmUobmV3IGUuayhcInN0eWxlLmxvYWRcIikpO319X2NyZWF0ZUxheWVycygpe2NvbnN0IHQ9ZS5heih0aGlzLnN0eWxlc2hlZXQubGF5ZXJzKTt0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwiU0xcIix0KSx0aGlzLl9vcmRlcj10Lm1hcCgodD0+dC5pZCkpLHRoaXMuX2xheWVycz17fSx0aGlzLl9zZXJpYWxpemVkTGF5ZXJzPW51bGw7Zm9yKGNvbnN0IGkgb2YgdCl7Y29uc3QgdD1lLmFBKGkpO3Quc2V0RXZlbnRlZFBhcmVudCh0aGlzLHtsYXllcjp7aWQ6aS5pZH19KSx0aGlzLl9sYXllcnNbaS5pZF09dDt9fV9sb2FkU3ByaXRlKHQsaT0hMSxhPXZvaWQgMCl7bGV0IHM7dGhpcy5pbWFnZU1hbmFnZXIuc2V0TG9hZGVkKCExKSx0aGlzLl9zcHJpdGVSZXF1ZXN0PW5ldyBBYm9ydENvbnRyb2xsZXIsZnVuY3Rpb24odCxpLGEscyl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHI9eCh0KSxuPWE+MT9cIkAyeFwiOlwiXCIsbD17fSxoPXt9O2Zvcihjb25zdHtpZDp0LHVybDphfW9mIHIpe2NvbnN0IG89aS50cmFuc2Zvcm1SZXF1ZXN0KHkoYSxuLFwiLmpzb25cIiksXCJTcHJpdGVKU09OXCIpO2xbdF09ZS5oKG8scyk7Y29uc3Qgcj1pLnRyYW5zZm9ybVJlcXVlc3QoeShhLG4sXCIucG5nXCIpLFwiU3ByaXRlSW1hZ2VcIik7aFt0XT1fLmdldEltYWdlKHIscyk7fXJldHVybiB5aWVsZCBQcm9taXNlLmFsbChbLi4uT2JqZWN0LnZhbHVlcyhsKSwuLi5PYmplY3QudmFsdWVzKGgpXSksZnVuY3Rpb24odCxpKXtyZXR1cm4gZS5fKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fTtmb3IoY29uc3QgYSBpbiB0KXtlW2FdPXt9O2NvbnN0IHM9by5nZXRJbWFnZUNhbnZhc0NvbnRleHQoKHlpZWxkIGlbYV0pLmRhdGEpLHI9KHlpZWxkIHRbYV0pLmRhdGE7Zm9yKGNvbnN0IHQgaW4gcil7Y29uc3R7d2lkdGg6aSxoZWlnaHQ6byx4Om4seTpsLHNkZjpoLHBpeGVsUmF0aW86YyxzdHJldGNoWDp1LHN0cmV0Y2hZOmQsY29udGVudDpfLHRleHRGaXRXaWR0aDpwLHRleHRGaXRIZWlnaHQ6bX09clt0XTtlW2FdW3RdPXtkYXRhOm51bGwscGl4ZWxSYXRpbzpjLHNkZjpoLHN0cmV0Y2hYOnUsc3RyZXRjaFk6ZCxjb250ZW50Ol8sdGV4dEZpdFdpZHRoOnAsdGV4dEZpdEhlaWdodDptLHNwcml0ZURhdGE6e3dpZHRoOmksaGVpZ2h0Om8seDpuLHk6bCxjb250ZXh0OnN9fTt9fXJldHVybiBlfSkpfShsLGgpfSkpfSh0LHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlcix0aGlzLm1hcC5nZXRQaXhlbFJhdGlvKCksdGhpcy5fc3ByaXRlUmVxdWVzdCkudGhlbigodD0+e2lmKHRoaXMuX3Nwcml0ZVJlcXVlc3Q9bnVsbCx0KWZvcihjb25zdCBlIGluIHQpe3RoaXMuX3Nwcml0ZXNJbWFnZXNJZHNbZV09W107Y29uc3QgYT10aGlzLl9zcHJpdGVzSW1hZ2VzSWRzW2VdP3RoaXMuX3Nwcml0ZXNJbWFnZXNJZHNbZV0uZmlsdGVyKChlPT4hKGUgaW4gdCkpKTpbXTtmb3IoY29uc3QgdCBvZiBhKXRoaXMuaW1hZ2VNYW5hZ2VyLnJlbW92ZUltYWdlKHQpLHRoaXMuX2NoYW5nZWRJbWFnZXNbdF09ITA7Zm9yKGNvbnN0IGEgaW4gdFtlXSl7Y29uc3Qgcz1cImRlZmF1bHRcIj09PWU/YTpgJHtlfToke2F9YDt0aGlzLl9zcHJpdGVzSW1hZ2VzSWRzW2VdLnB1c2gocykscyBpbiB0aGlzLmltYWdlTWFuYWdlci5pbWFnZXM/dGhpcy5pbWFnZU1hbmFnZXIudXBkYXRlSW1hZ2Uocyx0W2VdW2FdLCExKTp0aGlzLmltYWdlTWFuYWdlci5hZGRJbWFnZShzLHRbZV1bYV0pLGkmJih0aGlzLl9jaGFuZ2VkSW1hZ2VzW3NdPSEwKTt9fX0pKS5jYXRjaCgodD0+e3RoaXMuX3Nwcml0ZVJlcXVlc3Q9bnVsbCxzPXQsdGhpcy5maXJlKG5ldyBlLmoocykpO30pKS5maW5hbGx5KCgoKT0+e3RoaXMuaW1hZ2VNYW5hZ2VyLnNldExvYWRlZCghMCksdGhpcy5fYXZhaWxhYmxlSW1hZ2VzPXRoaXMuaW1hZ2VNYW5hZ2VyLmxpc3RJbWFnZXMoKSxpJiYodGhpcy5fY2hhbmdlZD0hMCksdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcIlNJXCIsdGhpcy5fYXZhaWxhYmxlSW1hZ2VzKSx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFcIix7ZGF0YVR5cGU6XCJzdHlsZVwifSkpLGEmJmEocyk7fSkpO31fdW5sb2FkU3ByaXRlKCl7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9zcHJpdGVzSW1hZ2VzSWRzKS5mbGF0KCkpdGhpcy5pbWFnZU1hbmFnZXIucmVtb3ZlSW1hZ2UodCksdGhpcy5fY2hhbmdlZEltYWdlc1t0XT0hMDt0aGlzLl9zcHJpdGVzSW1hZ2VzSWRzPXt9LHRoaXMuX2F2YWlsYWJsZUltYWdlcz10aGlzLmltYWdlTWFuYWdlci5saXN0SW1hZ2VzKCksdGhpcy5fY2hhbmdlZD0hMCx0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwiU0lcIix0aGlzLl9hdmFpbGFibGVJbWFnZXMpLHRoaXMuZmlyZShuZXcgZS5rKFwiZGF0YVwiLHtkYXRhVHlwZTpcInN0eWxlXCJ9KSk7fV92YWxpZGF0ZUxheWVyKHQpe2NvbnN0IGk9dGhpcy5zb3VyY2VDYWNoZXNbdC5zb3VyY2VdO2lmKCFpKXJldHVybjtjb25zdCBhPXQuc291cmNlTGF5ZXI7aWYoIWEpcmV0dXJuO2NvbnN0IHM9aS5nZXRTb3VyY2UoKTsoXCJnZW9qc29uXCI9PT1zLnR5cGV8fHMudmVjdG9yTGF5ZXJJZHMmJi0xPT09cy52ZWN0b3JMYXllcklkcy5pbmRleE9mKGEpKSYmdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBTb3VyY2UgbGF5ZXIgXCIke2F9XCIgZG9lcyBub3QgZXhpc3Qgb24gc291cmNlIFwiJHtzLmlkfVwiIGFzIHNwZWNpZmllZCBieSBzdHlsZSBsYXllciBcIiR7dC5pZH1cIi5gKSkpO31sb2FkZWQoKXtpZighdGhpcy5fbG9hZGVkKXJldHVybiAhMTtpZihPYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkU291cmNlcykubGVuZ3RoKXJldHVybiAhMTtmb3IoY29uc3QgdCBpbiB0aGlzLnNvdXJjZUNhY2hlcylpZighdGhpcy5zb3VyY2VDYWNoZXNbdF0ubG9hZGVkKCkpcmV0dXJuICExO3JldHVybiAhIXRoaXMuaW1hZ2VNYW5hZ2VyLmlzTG9hZGVkKCl9X3NlcmlhbGl6ZUJ5SWRzKHQsaT0hMSl7Y29uc3QgYT10aGlzLl9zZXJpYWxpemVkQWxsTGF5ZXJzKCk7aWYoIXR8fDA9PT10Lmxlbmd0aClyZXR1cm4gT2JqZWN0LnZhbHVlcyhpP2UuYUIoYSk6YSk7Y29uc3Qgcz1bXTtmb3IoY29uc3QgbyBvZiB0KWlmKGFbb10pe2NvbnN0IHQ9aT9lLmFCKGFbb10pOmFbb107cy5wdXNoKHQpO31yZXR1cm4gc31fc2VyaWFsaXplZEFsbExheWVycygpe2xldCB0PXRoaXMuX3NlcmlhbGl6ZWRMYXllcnM7aWYodClyZXR1cm4gdDt0PXRoaXMuX3NlcmlhbGl6ZWRMYXllcnM9e307Y29uc3QgZT1PYmplY3Qua2V5cyh0aGlzLl9sYXllcnMpO2Zvcihjb25zdCBpIG9mIGUpe2NvbnN0IGU9dGhpcy5fbGF5ZXJzW2ldO1wiY3VzdG9tXCIhPT1lLnR5cGUmJih0W2ldPWUuc2VyaWFsaXplKCkpO31yZXR1cm4gdH1oYXNUcmFuc2l0aW9ucygpe2lmKHRoaXMubGlnaHQmJnRoaXMubGlnaHQuaGFzVHJhbnNpdGlvbigpKXJldHVybiAhMDtpZih0aGlzLnNreSYmdGhpcy5za3kuaGFzVHJhbnNpdGlvbigpKXJldHVybiAhMDtmb3IoY29uc3QgdCBpbiB0aGlzLnNvdXJjZUNhY2hlcylpZih0aGlzLnNvdXJjZUNhY2hlc1t0XS5oYXNUcmFuc2l0aW9uKCkpcmV0dXJuICEwO2Zvcihjb25zdCB0IGluIHRoaXMuX2xheWVycylpZih0aGlzLl9sYXllcnNbdF0uaGFzVHJhbnNpdGlvbigpKXJldHVybiAhMDtyZXR1cm4gITF9X2NoZWNrTG9hZGVkKCl7aWYoIXRoaXMuX2xvYWRlZCl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nLlwiKX11cGRhdGUodCl7aWYoIXRoaXMuX2xvYWRlZClyZXR1cm47Y29uc3QgaT10aGlzLl9jaGFuZ2VkO2lmKGkpe2NvbnN0IGU9T2JqZWN0LmtleXModGhpcy5fdXBkYXRlZExheWVycyksaT1PYmplY3Qua2V5cyh0aGlzLl9yZW1vdmVkTGF5ZXJzKTsoZS5sZW5ndGh8fGkubGVuZ3RoKSYmdGhpcy5fdXBkYXRlV29ya2VyTGF5ZXJzKGUsaSk7Zm9yKGNvbnN0IHQgaW4gdGhpcy5fdXBkYXRlZFNvdXJjZXMpe2NvbnN0IGU9dGhpcy5fdXBkYXRlZFNvdXJjZXNbdF07aWYoXCJyZWxvYWRcIj09PWUpdGhpcy5fcmVsb2FkU291cmNlKHQpO2Vsc2Uge2lmKFwiY2xlYXJcIiE9PWUpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFjdGlvbiAke2V9YCk7dGhpcy5fY2xlYXJTb3VyY2UodCk7fX10aGlzLl91cGRhdGVUaWxlc0ZvckNoYW5nZWRJbWFnZXMoKSx0aGlzLl91cGRhdGVUaWxlc0ZvckNoYW5nZWRHbHlwaHMoKTtmb3IoY29uc3QgZSBpbiB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcyl0aGlzLl9sYXllcnNbZV0udXBkYXRlVHJhbnNpdGlvbnModCk7dGhpcy5saWdodC51cGRhdGVUcmFuc2l0aW9ucyh0KSx0aGlzLnNreS51cGRhdGVUcmFuc2l0aW9ucyh0KSx0aGlzLl9yZXNldFVwZGF0ZXMoKTt9Y29uc3QgYT17fTtmb3IoY29uc3QgdCBpbiB0aGlzLnNvdXJjZUNhY2hlcyl7Y29uc3QgZT10aGlzLnNvdXJjZUNhY2hlc1t0XTthW3RdPWUudXNlZCxlLnVzZWQ9ITE7fWZvcihjb25zdCBlIG9mIHRoaXMuX29yZGVyKXtjb25zdCBpPXRoaXMuX2xheWVyc1tlXTtpLnJlY2FsY3VsYXRlKHQsdGhpcy5fYXZhaWxhYmxlSW1hZ2VzKSwhaS5pc0hpZGRlbih0Lnpvb20pJiZpLnNvdXJjZSYmKHRoaXMuc291cmNlQ2FjaGVzW2kuc291cmNlXS51c2VkPSEwKTt9Zm9yKGNvbnN0IHQgaW4gYSl7Y29uc3QgaT10aGlzLnNvdXJjZUNhY2hlc1t0XTshIWFbdF0hPSEhaS51c2VkJiZpLmZpcmUobmV3IGUuayhcImRhdGFcIix7c291cmNlRGF0YVR5cGU6XCJ2aXNpYmlsaXR5XCIsZGF0YVR5cGU6XCJzb3VyY2VcIixzb3VyY2VJZDp0fSkpO310aGlzLmxpZ2h0LnJlY2FsY3VsYXRlKHQpLHRoaXMuc2t5LnJlY2FsY3VsYXRlKHQpLHRoaXMuej10Lnpvb20saSYmdGhpcy5maXJlKG5ldyBlLmsoXCJkYXRhXCIse2RhdGFUeXBlOlwic3R5bGVcIn0pKTt9X3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEltYWdlcygpe2NvbnN0IHQ9T2JqZWN0LmtleXModGhpcy5fY2hhbmdlZEltYWdlcyk7aWYodC5sZW5ndGgpe2Zvcihjb25zdCBlIGluIHRoaXMuc291cmNlQ2FjaGVzKXRoaXMuc291cmNlQ2FjaGVzW2VdLnJlbG9hZFRpbGVzRm9yRGVwZW5kZW5jaWVzKFtcImljb25zXCIsXCJwYXR0ZXJuc1wiXSx0KTt0aGlzLl9jaGFuZ2VkSW1hZ2VzPXt9O319X3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEdseXBocygpe2lmKHRoaXMuX2dseXBoc0RpZENoYW5nZSl7Zm9yKGNvbnN0IHQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpdGhpcy5zb3VyY2VDYWNoZXNbdF0ucmVsb2FkVGlsZXNGb3JEZXBlbmRlbmNpZXMoW1wiZ2x5cGhzXCJdLFtcIlwiXSk7dGhpcy5fZ2x5cGhzRGlkQ2hhbmdlPSExO319X3VwZGF0ZVdvcmtlckxheWVycyh0LGUpe3RoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoXCJVTFwiLHtsYXllcnM6dGhpcy5fc2VyaWFsaXplQnlJZHModCwhMSkscmVtb3ZlZElkczplfSk7fV9yZXNldFVwZGF0ZXMoKXt0aGlzLl9jaGFuZ2VkPSExLHRoaXMuX3VwZGF0ZWRMYXllcnM9e30sdGhpcy5fcmVtb3ZlZExheWVycz17fSx0aGlzLl91cGRhdGVkU291cmNlcz17fSx0aGlzLl91cGRhdGVkUGFpbnRQcm9wcz17fSx0aGlzLl9jaGFuZ2VkSW1hZ2VzPXt9LHRoaXMuX2dseXBoc0RpZENoYW5nZT0hMTt9c2V0U3RhdGUodCxpPXt9KXt2YXIgYTt0aGlzLl9jaGVja0xvYWRlZCgpO2NvbnN0IHM9dGhpcy5zZXJpYWxpemUoKTtpZih0PWkudHJhbnNmb3JtU3R5bGU/aS50cmFuc2Zvcm1TdHlsZShzLHQpOnQsKG51bGw9PT0oYT1pLnZhbGlkYXRlKXx8dm9pZCAwPT09YXx8YSkmJmNlKHRoaXMsZS51KHQpKSlyZXR1cm4gITE7KHQ9ZS5hQih0KSkubGF5ZXJzPWUuYXoodC5sYXllcnMpO2NvbnN0IG89ZS5hQyhzLHQpLHI9dGhpcy5fZ2V0T3BlcmF0aW9uc1RvUGVyZm9ybShvKTtpZihyLnVuaW1wbGVtZW50ZWQubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkOiAke3IudW5pbXBsZW1lbnRlZC5qb2luKFwiLCBcIil9LmApO2lmKDA9PT1yLm9wZXJhdGlvbnMubGVuZ3RoKXJldHVybiAhMTtmb3IoY29uc3QgdCBvZiByLm9wZXJhdGlvbnMpdCgpO3JldHVybiB0aGlzLnN0eWxlc2hlZXQ9dCx0aGlzLl9zZXJpYWxpemVkTGF5ZXJzPW51bGwsITB9X2dldE9wZXJhdGlvbnNUb1BlcmZvcm0odCl7Y29uc3QgZT1bXSxpPVtdO2Zvcihjb25zdCBhIG9mIHQpc3dpdGNoKGEuY29tbWFuZCl7Y2FzZVwic2V0Q2VudGVyXCI6Y2FzZVwic2V0Wm9vbVwiOmNhc2VcInNldEJlYXJpbmdcIjpjYXNlXCJzZXRQaXRjaFwiOmNvbnRpbnVlO2Nhc2VcImFkZExheWVyXCI6ZS5wdXNoKCgoKT0+dGhpcy5hZGRMYXllci5hcHBseSh0aGlzLGEuYXJncykpKTticmVhaztjYXNlXCJyZW1vdmVMYXllclwiOmUucHVzaCgoKCk9PnRoaXMucmVtb3ZlTGF5ZXIuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwic2V0UGFpbnRQcm9wZXJ0eVwiOmUucHVzaCgoKCk9PnRoaXMuc2V0UGFpbnRQcm9wZXJ0eS5hcHBseSh0aGlzLGEuYXJncykpKTticmVhaztjYXNlXCJzZXRMYXlvdXRQcm9wZXJ0eVwiOmUucHVzaCgoKCk9PnRoaXMuc2V0TGF5b3V0UHJvcGVydHkuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwic2V0RmlsdGVyXCI6ZS5wdXNoKCgoKT0+dGhpcy5zZXRGaWx0ZXIuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwiYWRkU291cmNlXCI6ZS5wdXNoKCgoKT0+dGhpcy5hZGRTb3VyY2UuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwicmVtb3ZlU291cmNlXCI6ZS5wdXNoKCgoKT0+dGhpcy5yZW1vdmVTb3VyY2UuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwic2V0TGF5ZXJab29tUmFuZ2VcIjplLnB1c2goKCgpPT50aGlzLnNldExheWVyWm9vbVJhbmdlLmFwcGx5KHRoaXMsYS5hcmdzKSkpO2JyZWFrO2Nhc2VcInNldExpZ2h0XCI6ZS5wdXNoKCgoKT0+dGhpcy5zZXRMaWdodC5hcHBseSh0aGlzLGEuYXJncykpKTticmVhaztjYXNlXCJzZXRHZW9KU09OU291cmNlRGF0YVwiOmUucHVzaCgoKCk9PnRoaXMuc2V0R2VvSlNPTlNvdXJjZURhdGEuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwic2V0R2x5cGhzXCI6ZS5wdXNoKCgoKT0+dGhpcy5zZXRHbHlwaHMuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwic2V0U3ByaXRlXCI6ZS5wdXNoKCgoKT0+dGhpcy5zZXRTcHJpdGUuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwic2V0U2t5XCI6ZS5wdXNoKCgoKT0+dGhpcy5zZXRTa3kuYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwic2V0VGVycmFpblwiOmUucHVzaCgoKCk9PnRoaXMubWFwLnNldFRlcnJhaW4uYXBwbHkodGhpcyxhLmFyZ3MpKSk7YnJlYWs7Y2FzZVwic2V0VHJhbnNpdGlvblwiOmUucHVzaCgoKCk9Pnt9KSk7YnJlYWs7ZGVmYXVsdDppLnB1c2goYS5jb21tYW5kKTt9cmV0dXJuIHtvcGVyYXRpb25zOmUsdW5pbXBsZW1lbnRlZDppfX1hZGRJbWFnZSh0LGkpe2lmKHRoaXMuZ2V0SW1hZ2UodCkpcmV0dXJuIHRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihgQW4gaW1hZ2UgbmFtZWQgXCIke3R9XCIgYWxyZWFkeSBleGlzdHMuYCkpKTt0aGlzLmltYWdlTWFuYWdlci5hZGRJbWFnZSh0LGkpLHRoaXMuX2FmdGVySW1hZ2VVcGRhdGVkKHQpO311cGRhdGVJbWFnZSh0LGUpe3RoaXMuaW1hZ2VNYW5hZ2VyLnVwZGF0ZUltYWdlKHQsZSk7fWdldEltYWdlKHQpe3JldHVybiB0aGlzLmltYWdlTWFuYWdlci5nZXRJbWFnZSh0KX1yZW1vdmVJbWFnZSh0KXtpZighdGhpcy5nZXRJbWFnZSh0KSlyZXR1cm4gdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBBbiBpbWFnZSBuYW1lZCBcIiR7dH1cIiBkb2VzIG5vdCBleGlzdC5gKSkpO3RoaXMuaW1hZ2VNYW5hZ2VyLnJlbW92ZUltYWdlKHQpLHRoaXMuX2FmdGVySW1hZ2VVcGRhdGVkKHQpO31fYWZ0ZXJJbWFnZVVwZGF0ZWQodCl7dGhpcy5fYXZhaWxhYmxlSW1hZ2VzPXRoaXMuaW1hZ2VNYW5hZ2VyLmxpc3RJbWFnZXMoKSx0aGlzLl9jaGFuZ2VkSW1hZ2VzW3RdPSEwLHRoaXMuX2NoYW5nZWQ9ITAsdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcIlNJXCIsdGhpcy5fYXZhaWxhYmxlSW1hZ2VzKSx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFcIix7ZGF0YVR5cGU6XCJzdHlsZVwifSkpO31saXN0SW1hZ2VzKCl7cmV0dXJuIHRoaXMuX2NoZWNrTG9hZGVkKCksdGhpcy5pbWFnZU1hbmFnZXIubGlzdEltYWdlcygpfWFkZFNvdXJjZSh0LGksYT17fSl7aWYodGhpcy5fY2hlY2tMb2FkZWQoKSx2b2lkIDAhPT10aGlzLnNvdXJjZUNhY2hlc1t0XSl0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBcIiR7dH1cIiBhbHJlYWR5IGV4aXN0cy5gKTtpZighaS50eXBlKXRocm93IG5ldyBFcnJvcihgVGhlIHR5cGUgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkLCBidXQgb25seSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgd2VyZSBnaXZlbjogJHtPYmplY3Qua2V5cyhpKS5qb2luKFwiLCBcIil9LmApO2lmKFtcInZlY3RvclwiLFwicmFzdGVyXCIsXCJnZW9qc29uXCIsXCJ2aWRlb1wiLFwiaW1hZ2VcIl0uaW5kZXhPZihpLnR5cGUpPj0wJiZ0aGlzLl92YWxpZGF0ZShlLnUuc291cmNlLGBzb3VyY2VzLiR7dH1gLGksbnVsbCxhKSlyZXR1cm47dGhpcy5tYXAmJnRoaXMubWFwLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcmJihpLmNvbGxlY3RSZXNvdXJjZVRpbWluZz0hMCk7Y29uc3Qgcz10aGlzLnNvdXJjZUNhY2hlc1t0XT1uZXcgdXQodCxpLHRoaXMuZGlzcGF0Y2hlcik7cy5zdHlsZT10aGlzLHMuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCgoKT0+KHtpc1NvdXJjZUxvYWRlZDpzLmxvYWRlZCgpLHNvdXJjZTpzLnNlcmlhbGl6ZSgpLHNvdXJjZUlkOnR9KSkpLHMub25BZGQodGhpcy5tYXApLHRoaXMuX2NoYW5nZWQ9ITA7fXJlbW92ZVNvdXJjZSh0KXtpZih0aGlzLl9jaGVja0xvYWRlZCgpLHZvaWQgMD09PXRoaXMuc291cmNlQ2FjaGVzW3RdKXRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSURcIik7Zm9yKGNvbnN0IGkgaW4gdGhpcy5fbGF5ZXJzKWlmKHRoaXMuX2xheWVyc1tpXS5zb3VyY2U9PT10KXJldHVybiB0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoYFNvdXJjZSBcIiR7dH1cIiBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSBsYXllciBcIiR7aX1cIiBpcyB1c2luZyBpdC5gKSkpO2NvbnN0IGk9dGhpcy5zb3VyY2VDYWNoZXNbdF07ZGVsZXRlIHRoaXMuc291cmNlQ2FjaGVzW3RdLGRlbGV0ZSB0aGlzLl91cGRhdGVkU291cmNlc1t0XSxpLmZpcmUobmV3IGUuayhcImRhdGFcIix7c291cmNlRGF0YVR5cGU6XCJtZXRhZGF0YVwiLGRhdGFUeXBlOlwic291cmNlXCIsc291cmNlSWQ6dH0pKSxpLnNldEV2ZW50ZWRQYXJlbnQobnVsbCksaS5vblJlbW92ZSh0aGlzLm1hcCksdGhpcy5fY2hhbmdlZD0hMDt9c2V0R2VvSlNPTlNvdXJjZURhdGEodCxlKXtpZih0aGlzLl9jaGVja0xvYWRlZCgpLHZvaWQgMD09PXRoaXMuc291cmNlQ2FjaGVzW3RdKXRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgbm8gc291cmNlIHdpdGggdGhpcyBJRD0ke3R9YCk7Y29uc3QgaT10aGlzLnNvdXJjZUNhY2hlc1t0XS5nZXRTb3VyY2UoKTtpZihcImdlb2pzb25cIiE9PWkudHlwZSl0aHJvdyBuZXcgRXJyb3IoYGdlb2pzb25Tb3VyY2UudHlwZSBpcyAke2kudHlwZX0sIHdoaWNoIGlzICE9PSAnZ2VvanNvbmApO2kuc2V0RGF0YShlKSx0aGlzLl9jaGFuZ2VkPSEwO31nZXRTb3VyY2UodCl7cmV0dXJuIHRoaXMuc291cmNlQ2FjaGVzW3RdJiZ0aGlzLnNvdXJjZUNhY2hlc1t0XS5nZXRTb3VyY2UoKX1hZGRMYXllcih0LGksYT17fSl7dGhpcy5fY2hlY2tMb2FkZWQoKTtjb25zdCBzPXQuaWQ7aWYodGhpcy5nZXRMYXllcihzKSlyZXR1cm4gdm9pZCB0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoYExheWVyIFwiJHtzfVwiIGFscmVhZHkgZXhpc3RzIG9uIHRoaXMgbWFwLmApKSk7bGV0IG87aWYoXCJjdXN0b21cIj09PXQudHlwZSl7aWYoY2UodGhpcyxlLmFEKHQpKSlyZXR1cm47bz1lLmFBKHQpO31lbHNlIHtpZihcInNvdXJjZVwiaW4gdCYmXCJvYmplY3RcIj09dHlwZW9mIHQuc291cmNlJiYodGhpcy5hZGRTb3VyY2Uocyx0LnNvdXJjZSksdD1lLmFCKHQpLHQ9ZS5lKHQse3NvdXJjZTpzfSkpLHRoaXMuX3ZhbGlkYXRlKGUudS5sYXllcixgbGF5ZXJzLiR7c31gLHQse2FycmF5SW5kZXg6LTF9LGEpKXJldHVybjtvPWUuYUEodCksdGhpcy5fdmFsaWRhdGVMYXllcihvKSxvLnNldEV2ZW50ZWRQYXJlbnQodGhpcyx7bGF5ZXI6e2lkOnN9fSk7fWNvbnN0IHI9aT90aGlzLl9vcmRlci5pbmRleE9mKGkpOnRoaXMuX29yZGVyLmxlbmd0aDtpZihpJiYtMT09PXIpdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBDYW5ub3QgYWRkIGxheWVyIFwiJHtzfVwiIGJlZm9yZSBub24tZXhpc3RpbmcgbGF5ZXIgXCIke2l9XCIuYCkpKTtlbHNlIHtpZih0aGlzLl9vcmRlci5zcGxpY2UociwwLHMpLHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkPSEwLHRoaXMuX2xheWVyc1tzXT1vLHRoaXMuX3JlbW92ZWRMYXllcnNbc10mJm8uc291cmNlJiZcImN1c3RvbVwiIT09by50eXBlKXtjb25zdCB0PXRoaXMuX3JlbW92ZWRMYXllcnNbc107ZGVsZXRlIHRoaXMuX3JlbW92ZWRMYXllcnNbc10sdC50eXBlIT09by50eXBlP3RoaXMuX3VwZGF0ZWRTb3VyY2VzW28uc291cmNlXT1cImNsZWFyXCI6KHRoaXMuX3VwZGF0ZWRTb3VyY2VzW28uc291cmNlXT1cInJlbG9hZFwiLHRoaXMuc291cmNlQ2FjaGVzW28uc291cmNlXS5wYXVzZSgpKTt9dGhpcy5fdXBkYXRlTGF5ZXIobyksby5vbkFkZCYmby5vbkFkZCh0aGlzLm1hcCk7fX1tb3ZlTGF5ZXIodCxpKXtpZih0aGlzLl9jaGVja0xvYWRlZCgpLHRoaXMuX2NoYW5nZWQ9ITAsIXRoaXMuX2xheWVyc1t0XSlyZXR1cm4gdm9pZCB0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoYFRoZSBsYXllciAnJHt0fScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgbW92ZWQuYCkpKTtpZih0PT09aSlyZXR1cm47Y29uc3QgYT10aGlzLl9vcmRlci5pbmRleE9mKHQpO3RoaXMuX29yZGVyLnNwbGljZShhLDEpO2NvbnN0IHM9aT90aGlzLl9vcmRlci5pbmRleE9mKGkpOnRoaXMuX29yZGVyLmxlbmd0aDtpJiYtMT09PXM/dGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBDYW5ub3QgbW92ZSBsYXllciBcIiR7dH1cIiBiZWZvcmUgbm9uLWV4aXN0aW5nIGxheWVyIFwiJHtpfVwiLmApKSk6KHRoaXMuX29yZGVyLnNwbGljZShzLDAsdCksdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQ9ITApO31yZW1vdmVMYXllcih0KXt0aGlzLl9jaGVja0xvYWRlZCgpO2NvbnN0IGk9dGhpcy5fbGF5ZXJzW3RdO2lmKCFpKXJldHVybiB2b2lkIHRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihgQ2Fubm90IHJlbW92ZSBub24tZXhpc3RpbmcgbGF5ZXIgXCIke3R9XCIuYCkpKTtpLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7Y29uc3QgYT10aGlzLl9vcmRlci5pbmRleE9mKHQpO3RoaXMuX29yZGVyLnNwbGljZShhLDEpLHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkPSEwLHRoaXMuX2NoYW5nZWQ9ITAsdGhpcy5fcmVtb3ZlZExheWVyc1t0XT1pLGRlbGV0ZSB0aGlzLl9sYXllcnNbdF0sdGhpcy5fc2VyaWFsaXplZExheWVycyYmZGVsZXRlIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnNbdF0sZGVsZXRlIHRoaXMuX3VwZGF0ZWRMYXllcnNbdF0sZGVsZXRlIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW3RdLGkub25SZW1vdmUmJmkub25SZW1vdmUodGhpcy5tYXApO31nZXRMYXllcih0KXtyZXR1cm4gdGhpcy5fbGF5ZXJzW3RdfWdldExheWVyc09yZGVyKCl7cmV0dXJuIFsuLi50aGlzLl9vcmRlcl19aGFzTGF5ZXIodCl7cmV0dXJuIHQgaW4gdGhpcy5fbGF5ZXJzfXNldExheWVyWm9vbVJhbmdlKHQsaSxhKXt0aGlzLl9jaGVja0xvYWRlZCgpO2NvbnN0IHM9dGhpcy5nZXRMYXllcih0KTtzP3MubWluem9vbT09PWkmJnMubWF4em9vbT09PWF8fChudWxsIT1pJiYocy5taW56b29tPWkpLG51bGwhPWEmJihzLm1heHpvb209YSksdGhpcy5fdXBkYXRlTGF5ZXIocykpOnRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihgQ2Fubm90IHNldCB0aGUgem9vbSByYW5nZSBvZiBub24tZXhpc3RpbmcgbGF5ZXIgXCIke3R9XCIuYCkpKTt9c2V0RmlsdGVyKHQsaSxhPXt9KXt0aGlzLl9jaGVja0xvYWRlZCgpO2NvbnN0IHM9dGhpcy5nZXRMYXllcih0KTtpZihzKXtpZighZS5hRShzLmZpbHRlcixpKSlyZXR1cm4gbnVsbD09aT8ocy5maWx0ZXI9dm9pZCAwLHZvaWQgdGhpcy5fdXBkYXRlTGF5ZXIocykpOnZvaWQodGhpcy5fdmFsaWRhdGUoZS51LmZpbHRlcixgbGF5ZXJzLiR7cy5pZH0uZmlsdGVyYCxpLG51bGwsYSl8fChzLmZpbHRlcj1lLmFCKGkpLHRoaXMuX3VwZGF0ZUxheWVyKHMpKSl9ZWxzZSB0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoYENhbm5vdCBmaWx0ZXIgbm9uLWV4aXN0aW5nIGxheWVyIFwiJHt0fVwiLmApKSk7fWdldEZpbHRlcih0KXtyZXR1cm4gZS5hQih0aGlzLmdldExheWVyKHQpLmZpbHRlcil9c2V0TGF5b3V0UHJvcGVydHkodCxpLGEscz17fSl7dGhpcy5fY2hlY2tMb2FkZWQoKTtjb25zdCBvPXRoaXMuZ2V0TGF5ZXIodCk7bz9lLmFFKG8uZ2V0TGF5b3V0UHJvcGVydHkoaSksYSl8fChvLnNldExheW91dFByb3BlcnR5KGksYSxzKSx0aGlzLl91cGRhdGVMYXllcihvKSk6dGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBDYW5ub3Qgc3R5bGUgbm9uLWV4aXN0aW5nIGxheWVyIFwiJHt0fVwiLmApKSk7fWdldExheW91dFByb3BlcnR5KHQsaSl7Y29uc3QgYT10aGlzLmdldExheWVyKHQpO2lmKGEpcmV0dXJuIGEuZ2V0TGF5b3V0UHJvcGVydHkoaSk7dGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBDYW5ub3QgZ2V0IHN0eWxlIG9mIG5vbi1leGlzdGluZyBsYXllciBcIiR7dH1cIi5gKSkpO31zZXRQYWludFByb3BlcnR5KHQsaSxhLHM9e30pe3RoaXMuX2NoZWNrTG9hZGVkKCk7Y29uc3Qgbz10aGlzLmdldExheWVyKHQpO28/ZS5hRShvLmdldFBhaW50UHJvcGVydHkoaSksYSl8fChvLnNldFBhaW50UHJvcGVydHkoaSxhLHMpJiZ0aGlzLl91cGRhdGVMYXllcihvKSx0aGlzLl9jaGFuZ2VkPSEwLHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW3RdPSEwLHRoaXMuX3NlcmlhbGl6ZWRMYXllcnM9bnVsbCk6dGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBDYW5ub3Qgc3R5bGUgbm9uLWV4aXN0aW5nIGxheWVyIFwiJHt0fVwiLmApKSk7fWdldFBhaW50UHJvcGVydHkodCxlKXtyZXR1cm4gdGhpcy5nZXRMYXllcih0KS5nZXRQYWludFByb3BlcnR5KGUpfXNldEZlYXR1cmVTdGF0ZSh0LGkpe3RoaXMuX2NoZWNrTG9hZGVkKCk7Y29uc3QgYT10LnNvdXJjZSxzPXQuc291cmNlTGF5ZXIsbz10aGlzLnNvdXJjZUNhY2hlc1thXTtpZih2b2lkIDA9PT1vKXJldHVybiB2b2lkIHRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihgVGhlIHNvdXJjZSAnJHthfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLmApKSk7Y29uc3Qgcj1vLmdldFNvdXJjZSgpLnR5cGU7XCJnZW9qc29uXCI9PT1yJiZzP3RoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihcIkdlb0pTT04gc291cmNlcyBjYW5ub3QgaGF2ZSBhIHNvdXJjZUxheWVyIHBhcmFtZXRlci5cIikpKTpcInZlY3RvclwiIT09cnx8cz8odm9pZCAwPT09dC5pZCYmdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKFwiVGhlIGZlYXR1cmUgaWQgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQuXCIpKSksby5zZXRGZWF0dXJlU3RhdGUocyx0LmlkLGkpKTp0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoXCJUaGUgc291cmNlTGF5ZXIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIHZlY3RvciBzb3VyY2UgdHlwZXMuXCIpKSk7fXJlbW92ZUZlYXR1cmVTdGF0ZSh0LGkpe3RoaXMuX2NoZWNrTG9hZGVkKCk7Y29uc3QgYT10LnNvdXJjZSxzPXRoaXMuc291cmNlQ2FjaGVzW2FdO2lmKHZvaWQgMD09PXMpcmV0dXJuIHZvaWQgdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBUaGUgc291cmNlICcke2F9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuYCkpKTtjb25zdCBvPXMuZ2V0U291cmNlKCkudHlwZSxyPVwidmVjdG9yXCI9PT1vP3Quc291cmNlTGF5ZXI6dm9pZCAwO1widmVjdG9yXCIhPT1vfHxyP2kmJlwic3RyaW5nXCIhPXR5cGVvZiB0LmlkJiZcIm51bWJlclwiIT10eXBlb2YgdC5pZD90aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoXCJBIGZlYXR1cmUgaWQgaXMgcmVxdWlyZWQgdG8gcmVtb3ZlIGl0cyBzcGVjaWZpYyBzdGF0ZSBwcm9wZXJ0eS5cIikpKTpzLnJlbW92ZUZlYXR1cmVTdGF0ZShyLHQuaWQsaSk6dGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKFwiVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLlwiKSkpO31nZXRGZWF0dXJlU3RhdGUodCl7dGhpcy5fY2hlY2tMb2FkZWQoKTtjb25zdCBpPXQuc291cmNlLGE9dC5zb3VyY2VMYXllcixzPXRoaXMuc291cmNlQ2FjaGVzW2ldO2lmKHZvaWQgMCE9PXMpcmV0dXJuIFwidmVjdG9yXCIhPT1zLmdldFNvdXJjZSgpLnR5cGV8fGE/KHZvaWQgMD09PXQuaWQmJnRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihcIlRoZSBmZWF0dXJlIGlkIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLlwiKSkpLHMuZ2V0RmVhdHVyZVN0YXRlKGEsdC5pZCkpOnZvaWQgdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKFwiVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLlwiKSkpO3RoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihgVGhlIHNvdXJjZSAnJHtpfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLmApKSk7fWdldFRyYW5zaXRpb24oKXtyZXR1cm4gZS5lKHtkdXJhdGlvbjozMDAsZGVsYXk6MH0sdGhpcy5zdHlsZXNoZWV0JiZ0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbil9c2VyaWFsaXplKCl7aWYoIXRoaXMuX2xvYWRlZClyZXR1cm47Y29uc3QgdD1lLmFGKHRoaXMuc291cmNlQ2FjaGVzLCh0PT50LnNlcmlhbGl6ZSgpKSksaT10aGlzLl9zZXJpYWxpemVCeUlkcyh0aGlzLl9vcmRlciwhMCksYT10aGlzLm1hcC5nZXRUZXJyYWluKCl8fHZvaWQgMCxzPXRoaXMuc3R5bGVzaGVldDtyZXR1cm4gZS5hRyh7dmVyc2lvbjpzLnZlcnNpb24sbmFtZTpzLm5hbWUsbWV0YWRhdGE6cy5tZXRhZGF0YSxsaWdodDpzLmxpZ2h0LHNreTpzLnNreSxjZW50ZXI6cy5jZW50ZXIsem9vbTpzLnpvb20sYmVhcmluZzpzLmJlYXJpbmcscGl0Y2g6cy5waXRjaCxzcHJpdGU6cy5zcHJpdGUsZ2x5cGhzOnMuZ2x5cGhzLHRyYW5zaXRpb246cy50cmFuc2l0aW9uLHNvdXJjZXM6dCxsYXllcnM6aSx0ZXJyYWluOmF9LCh0PT52b2lkIDAhPT10KSl9X3VwZGF0ZUxheWVyKHQpe3RoaXMuX3VwZGF0ZWRMYXllcnNbdC5pZF09ITAsdC5zb3VyY2UmJiF0aGlzLl91cGRhdGVkU291cmNlc1t0LnNvdXJjZV0mJlwicmFzdGVyXCIhPT10aGlzLnNvdXJjZUNhY2hlc1t0LnNvdXJjZV0uZ2V0U291cmNlKCkudHlwZSYmKHRoaXMuX3VwZGF0ZWRTb3VyY2VzW3Quc291cmNlXT1cInJlbG9hZFwiLHRoaXMuc291cmNlQ2FjaGVzW3Quc291cmNlXS5wYXVzZSgpKSx0aGlzLl9zZXJpYWxpemVkTGF5ZXJzPW51bGwsdGhpcy5fY2hhbmdlZD0hMDt9X2ZsYXR0ZW5BbmRTb3J0UmVuZGVyZWRGZWF0dXJlcyh0KXtjb25zdCBlPXQ9PlwiZmlsbC1leHRydXNpb25cIj09PXRoaXMuX2xheWVyc1t0XS50eXBlLGk9e30sYT1bXTtmb3IobGV0IHM9dGhpcy5fb3JkZXIubGVuZ3RoLTE7cz49MDtzLS0pe2NvbnN0IG89dGhpcy5fb3JkZXJbc107aWYoZShvKSl7aVtvXT1zO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9ZVtvXTtpZih0KWZvcihjb25zdCBlIG9mIHQpYS5wdXNoKGUpO319fWEuc29ydCgoKHQsZSk9PmUuaW50ZXJzZWN0aW9uWi10LmludGVyc2VjdGlvblopKTtjb25zdCBzPVtdO2ZvcihsZXQgbz10aGlzLl9vcmRlci5sZW5ndGgtMTtvPj0wO28tLSl7Y29uc3Qgcj10aGlzLl9vcmRlcltvXTtpZihlKHIpKWZvcihsZXQgdD1hLmxlbmd0aC0xO3Q+PTA7dC0tKXtjb25zdCBlPWFbdF0uZmVhdHVyZTtpZihpW2UubGF5ZXIuaWRdPG8pYnJlYWs7cy5wdXNoKGUpLGEucG9wKCk7fWVsc2UgZm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1lW3JdO2lmKHQpZm9yKGNvbnN0IGUgb2YgdClzLnB1c2goZS5mZWF0dXJlKTt9fXJldHVybiBzfXF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyh0LGksYSl7aSYmaS5maWx0ZXImJnRoaXMuX3ZhbGlkYXRlKGUudS5maWx0ZXIsXCJxdWVyeVJlbmRlcmVkRmVhdHVyZXMuZmlsdGVyXCIsaS5maWx0ZXIsbnVsbCxpKTtjb25zdCBzPXt9O2lmKGkmJmkubGF5ZXJzKXtpZighQXJyYXkuaXNBcnJheShpLmxheWVycykpcmV0dXJuIHRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihcInBhcmFtZXRlcnMubGF5ZXJzIG11c3QgYmUgYW4gQXJyYXkuXCIpKSksW107Zm9yKGNvbnN0IHQgb2YgaS5sYXllcnMpe2NvbnN0IGk9dGhpcy5fbGF5ZXJzW3RdO2lmKCFpKXJldHVybiB0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoYFRoZSBsYXllciAnJHt0fScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgcXVlcmllZCBmb3IgZmVhdHVyZXMuYCkpKSxbXTtzW2kuc291cmNlXT0hMDt9fWNvbnN0IG89W107aS5hdmFpbGFibGVJbWFnZXM9dGhpcy5fYXZhaWxhYmxlSW1hZ2VzO2NvbnN0IHI9dGhpcy5fc2VyaWFsaXplZEFsbExheWVycygpO2Zvcihjb25zdCBlIGluIHRoaXMuc291cmNlQ2FjaGVzKWkubGF5ZXJzJiYhc1tlXXx8by5wdXNoKHEodGhpcy5zb3VyY2VDYWNoZXNbZV0sdGhpcy5fbGF5ZXJzLHIsdCxpLGEpKTtyZXR1cm4gdGhpcy5wbGFjZW1lbnQmJm8ucHVzaChmdW5jdGlvbih0LGUsaSxhLHMsbyxyKXtjb25zdCBuPXt9LGw9by5xdWVyeVJlbmRlcmVkU3ltYm9scyhhKSxoPVtdO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKGwpLm1hcChOdW1iZXIpKWgucHVzaChyW3RdKTtoLnNvcnQoVik7Zm9yKGNvbnN0IGkgb2YgaCl7Y29uc3QgYT1pLmZlYXR1cmVJbmRleC5sb29rdXBTeW1ib2xGZWF0dXJlcyhsW2kuYnVja2V0SW5zdGFuY2VJZF0sZSxpLmJ1Y2tldEluZGV4LGkuc291cmNlTGF5ZXJJbmRleCxzLmZpbHRlcixzLmxheWVycyxzLmF2YWlsYWJsZUltYWdlcyx0KTtmb3IoY29uc3QgdCBpbiBhKXtjb25zdCBlPW5bdF09blt0XXx8W10scz1hW3RdO3Muc29ydCgoKHQsZSk9Pntjb25zdCBhPWkuZmVhdHVyZVNvcnRPcmRlcjtpZihhKXtjb25zdCBpPWEuaW5kZXhPZih0LmZlYXR1cmVJbmRleCk7cmV0dXJuIGEuaW5kZXhPZihlLmZlYXR1cmVJbmRleCktaX1yZXR1cm4gZS5mZWF0dXJlSW5kZXgtdC5mZWF0dXJlSW5kZXh9KSk7Zm9yKGNvbnN0IHQgb2YgcyllLnB1c2godCk7fX1mb3IoY29uc3QgZSBpbiBuKW5bZV0uZm9yRWFjaCgoYT0+e2NvbnN0IHM9YS5mZWF0dXJlLG89aVt0W2VdLnNvdXJjZV0uZ2V0RmVhdHVyZVN0YXRlKHMubGF5ZXJbXCJzb3VyY2UtbGF5ZXJcIl0scy5pZCk7cy5zb3VyY2U9cy5sYXllci5zb3VyY2Uscy5sYXllcltcInNvdXJjZS1sYXllclwiXSYmKHMuc291cmNlTGF5ZXI9cy5sYXllcltcInNvdXJjZS1sYXllclwiXSkscy5zdGF0ZT1vO30pKTtyZXR1cm4gbn0odGhpcy5fbGF5ZXJzLHIsdGhpcy5zb3VyY2VDYWNoZXMsdCxpLHRoaXMucGxhY2VtZW50LmNvbGxpc2lvbkluZGV4LHRoaXMucGxhY2VtZW50LnJldGFpbmVkUXVlcnlEYXRhKSksdGhpcy5fZmxhdHRlbkFuZFNvcnRSZW5kZXJlZEZlYXR1cmVzKG8pfXF1ZXJ5U291cmNlRmVhdHVyZXModCxpKXtpJiZpLmZpbHRlciYmdGhpcy5fdmFsaWRhdGUoZS51LmZpbHRlcixcInF1ZXJ5U291cmNlRmVhdHVyZXMuZmlsdGVyXCIsaS5maWx0ZXIsbnVsbCxpKTtjb25zdCBhPXRoaXMuc291cmNlQ2FjaGVzW3RdO3JldHVybiBhP2Z1bmN0aW9uKHQsZSl7Y29uc3QgaT10LmdldFJlbmRlcmFibGVJZHMoKS5tYXAoKGU9PnQuZ2V0VGlsZUJ5SUQoZSkpKSxhPVtdLHM9e307Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IG89aVt0XSxyPW8udGlsZUlELmNhbm9uaWNhbC5rZXk7c1tyXXx8KHNbcl09ITAsby5xdWVyeVNvdXJjZUZlYXR1cmVzKGEsZSkpO31yZXR1cm4gYX0oYSxpKTpbXX1nZXRMaWdodCgpe3JldHVybiB0aGlzLmxpZ2h0LmdldExpZ2h0KCl9c2V0TGlnaHQodCxpPXt9KXt0aGlzLl9jaGVja0xvYWRlZCgpO2NvbnN0IGE9dGhpcy5saWdodC5nZXRMaWdodCgpO2xldCBzPSExO2Zvcihjb25zdCBpIGluIHQpaWYoIWUuYUUodFtpXSxhW2ldKSl7cz0hMDticmVha31pZighcylyZXR1cm47Y29uc3Qgcj17bm93Om8ubm93KCksdHJhbnNpdGlvbjplLmUoe2R1cmF0aW9uOjMwMCxkZWxheTowfSx0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbil9O3RoaXMubGlnaHQuc2V0TGlnaHQodCxpKSx0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKHIpO31nZXRTa3koKXt2YXIgdDtyZXR1cm4gbnVsbD09PSh0PXRoaXMuc3R5bGVzaGVldCl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuc2t5fXNldFNreSh0LGk9e30pe2NvbnN0IGE9dGhpcy5nZXRTa3koKTtsZXQgcz0hMTtpZighdCYmIWEpcmV0dXJuO2lmKHQmJiFhKXM9ITA7ZWxzZSBpZighdCYmYSlzPSEwO2Vsc2UgZm9yKGNvbnN0IGkgaW4gdClpZighZS5hRSh0W2ldLGFbaV0pKXtzPSEwO2JyZWFrfWlmKCFzKXJldHVybjtjb25zdCByPXtub3c6by5ub3coKSx0cmFuc2l0aW9uOmUuZSh7ZHVyYXRpb246MzAwLGRlbGF5OjB9LHRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9uKX07dGhpcy5zdHlsZXNoZWV0LnNreT10LHRoaXMuc2t5LnNldFNreSh0LGkpLHRoaXMuc2t5LnVwZGF0ZVRyYW5zaXRpb25zKHIpO31fdmFsaWRhdGUodCxpLGEscyxvPXt9KXtyZXR1cm4gKCFvfHwhMSE9PW8udmFsaWRhdGUpJiZjZSh0aGlzLHQuY2FsbChlLnUsZS5lKHtrZXk6aSxzdHlsZTp0aGlzLnNlcmlhbGl6ZSgpLHZhbHVlOmEsc3R5bGVTcGVjOmUudn0scykpKX1fcmVtb3ZlKHQ9ITApe3RoaXMuX2ZyYW1lUmVxdWVzdCYmKHRoaXMuX2ZyYW1lUmVxdWVzdC5hYm9ydCgpLHRoaXMuX2ZyYW1lUmVxdWVzdD1udWxsKSx0aGlzLl9sb2FkU3R5bGVSZXF1ZXN0JiYodGhpcy5fbG9hZFN0eWxlUmVxdWVzdC5hYm9ydCgpLHRoaXMuX2xvYWRTdHlsZVJlcXVlc3Q9bnVsbCksdGhpcy5fc3ByaXRlUmVxdWVzdCYmKHRoaXMuX3Nwcml0ZVJlcXVlc3QuYWJvcnQoKSx0aGlzLl9zcHJpdGVSZXF1ZXN0PW51bGwpLG50KCkub2ZmKHN0LHRoaXMuX3J0bFBsdWdpbkxvYWRlZCk7Zm9yKGNvbnN0IHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5zZXRFdmVudGVkUGFyZW50KG51bGwpO2Zvcihjb25zdCB0IGluIHRoaXMuc291cmNlQ2FjaGVzKXtjb25zdCBlPXRoaXMuc291cmNlQ2FjaGVzW3RdO2Uuc2V0RXZlbnRlZFBhcmVudChudWxsKSxlLm9uUmVtb3ZlKHRoaXMubWFwKTt9dGhpcy5pbWFnZU1hbmFnZXIuc2V0RXZlbnRlZFBhcmVudChudWxsKSx0aGlzLnNldEV2ZW50ZWRQYXJlbnQobnVsbCksdCYmdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcIlJNXCIsdm9pZCAwKSx0aGlzLmRpc3BhdGNoZXIucmVtb3ZlKHQpO31fY2xlYXJTb3VyY2UodCl7dGhpcy5zb3VyY2VDYWNoZXNbdF0uY2xlYXJUaWxlcygpO31fcmVsb2FkU291cmNlKHQpe3RoaXMuc291cmNlQ2FjaGVzW3RdLnJlc3VtZSgpLHRoaXMuc291cmNlQ2FjaGVzW3RdLnJlbG9hZCgpO31fdXBkYXRlU291cmNlcyh0KXtmb3IoY29uc3QgZSBpbiB0aGlzLnNvdXJjZUNhY2hlcyl0aGlzLnNvdXJjZUNhY2hlc1tlXS51cGRhdGUodCx0aGlzLm1hcC50ZXJyYWluKTt9X2dlbmVyYXRlQ29sbGlzaW9uQm94ZXMoKXtmb3IoY29uc3QgdCBpbiB0aGlzLnNvdXJjZUNhY2hlcyl0aGlzLl9yZWxvYWRTb3VyY2UodCk7fV91cGRhdGVQbGFjZW1lbnQodCxlLGksYSxzPSExKXtsZXQgcj0hMSxuPSExO2NvbnN0IGw9e307Zm9yKGNvbnN0IGUgb2YgdGhpcy5fb3JkZXIpe2NvbnN0IGk9dGhpcy5fbGF5ZXJzW2VdO2lmKFwic3ltYm9sXCIhPT1pLnR5cGUpY29udGludWU7aWYoIWxbaS5zb3VyY2VdKXtjb25zdCB0PXRoaXMuc291cmNlQ2FjaGVzW2kuc291cmNlXTtsW2kuc291cmNlXT10LmdldFJlbmRlcmFibGVJZHMoITApLm1hcCgoZT0+dC5nZXRUaWxlQnlJRChlKSkpLnNvcnQoKCh0LGUpPT5lLnRpbGVJRC5vdmVyc2NhbGVkWi10LnRpbGVJRC5vdmVyc2NhbGVkWnx8KHQudGlsZUlELmlzTGVzc1RoYW4oZS50aWxlSUQpPy0xOjEpKSk7fWNvbnN0IGE9dGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleC5hZGRMYXllcihpLGxbaS5zb3VyY2VdLHQuY2VudGVyLmxuZyk7cj1yfHxhO31pZih0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4LnBydW5lVW51c2VkTGF5ZXJzKHRoaXMuX29yZGVyKSwoKHM9c3x8dGhpcy5fbGF5ZXJPcmRlckNoYW5nZWR8fDA9PT1pKXx8IXRoaXMucGF1c2VhYmxlUGxhY2VtZW50fHx0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSYmIXRoaXMucGxhY2VtZW50LnN0aWxsUmVjZW50KG8ubm93KCksdC56b29tKSkmJih0aGlzLnBhdXNlYWJsZVBsYWNlbWVudD1uZXcgc2UodCx0aGlzLm1hcC50ZXJyYWluLHRoaXMuX29yZGVyLHMsZSxpLGEsdGhpcy5wbGFjZW1lbnQpLHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkPSExKSx0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKT90aGlzLnBsYWNlbWVudC5zZXRTdGFsZSgpOih0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5jb250aW51ZVBsYWNlbWVudCh0aGlzLl9vcmRlcix0aGlzLl9sYXllcnMsbCksdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkmJih0aGlzLnBsYWNlbWVudD10aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5jb21taXQoby5ub3coKSksbj0hMCksciYmdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQucGxhY2VtZW50LnNldFN0YWxlKCkpLG58fHIpZm9yKGNvbnN0IHQgb2YgdGhpcy5fb3JkZXIpe2NvbnN0IGU9dGhpcy5fbGF5ZXJzW3RdO1wic3ltYm9sXCI9PT1lLnR5cGUmJnRoaXMucGxhY2VtZW50LnVwZGF0ZUxheWVyT3BhY2l0aWVzKGUsbFtlLnNvdXJjZV0pO31yZXR1cm4gIXRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpfHx0aGlzLnBsYWNlbWVudC5oYXNUcmFuc2l0aW9ucyhvLm5vdygpKX1fcmVsZWFzZVN5bWJvbEZhZGVUaWxlcygpe2Zvcihjb25zdCB0IGluIHRoaXMuc291cmNlQ2FjaGVzKXRoaXMuc291cmNlQ2FjaGVzW3RdLnJlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKTt9Z2V0SW1hZ2VzKHQsaSl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5pbWFnZU1hbmFnZXIuZ2V0SW1hZ2VzKGkuaWNvbnMpO3RoaXMuX3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEltYWdlcygpO2NvbnN0IGU9dGhpcy5zb3VyY2VDYWNoZXNbaS5zb3VyY2VdO3JldHVybiBlJiZlLnNldERlcGVuZGVuY2llcyhpLnRpbGVJRC5rZXksaS50eXBlLGkuaWNvbnMpLHR9KSl9Z2V0R2x5cGhzKHQsaSl7cmV0dXJuIGUuXyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5nbHlwaE1hbmFnZXIuZ2V0R2x5cGhzKGkuc3RhY2tzKSxlPXRoaXMuc291cmNlQ2FjaGVzW2kuc291cmNlXTtyZXR1cm4gZSYmZS5zZXREZXBlbmRlbmNpZXMoaS50aWxlSUQua2V5LGkudHlwZSxbXCJcIl0pLHR9KSl9Z2V0R2x5cGhzVXJsKCl7cmV0dXJuIHRoaXMuc3R5bGVzaGVldC5nbHlwaHN8fG51bGx9c2V0R2x5cGhzKHQsaT17fSl7dGhpcy5fY2hlY2tMb2FkZWQoKSx0JiZ0aGlzLl92YWxpZGF0ZShlLnUuZ2x5cGhzLFwiZ2x5cGhzXCIsdCxudWxsLGkpfHwodGhpcy5fZ2x5cGhzRGlkQ2hhbmdlPSEwLHRoaXMuc3R5bGVzaGVldC5nbHlwaHM9dCx0aGlzLmdseXBoTWFuYWdlci5lbnRyaWVzPXt9LHRoaXMuZ2x5cGhNYW5hZ2VyLnNldFVSTCh0KSk7fWFkZFNwcml0ZSh0LGksYT17fSxzKXt0aGlzLl9jaGVja0xvYWRlZCgpO2NvbnN0IG89W3tpZDp0LHVybDppfV0scj1bLi4ueCh0aGlzLnN0eWxlc2hlZXQuc3ByaXRlKSwuLi5vXTt0aGlzLl92YWxpZGF0ZShlLnUuc3ByaXRlLFwic3ByaXRlXCIscixudWxsLGEpfHwodGhpcy5zdHlsZXNoZWV0LnNwcml0ZT1yLHRoaXMuX2xvYWRTcHJpdGUobywhMCxzKSk7fXJlbW92ZVNwcml0ZSh0KXt0aGlzLl9jaGVja0xvYWRlZCgpO2NvbnN0IGk9eCh0aGlzLnN0eWxlc2hlZXQuc3ByaXRlKTtpZihpLmZpbmQoKGU9PmUuaWQ9PT10KSkpe2lmKHRoaXMuX3Nwcml0ZXNJbWFnZXNJZHNbdF0pZm9yKGNvbnN0IGUgb2YgdGhpcy5fc3ByaXRlc0ltYWdlc0lkc1t0XSl0aGlzLmltYWdlTWFuYWdlci5yZW1vdmVJbWFnZShlKSx0aGlzLl9jaGFuZ2VkSW1hZ2VzW2VdPSEwO2kuc3BsaWNlKGkuZmluZEluZGV4KChlPT5lLmlkPT09dCkpLDEpLHRoaXMuc3R5bGVzaGVldC5zcHJpdGU9aS5sZW5ndGg+MD9pOnZvaWQgMCxkZWxldGUgdGhpcy5fc3ByaXRlc0ltYWdlc0lkc1t0XSx0aGlzLl9hdmFpbGFibGVJbWFnZXM9dGhpcy5pbWFnZU1hbmFnZXIubGlzdEltYWdlcygpLHRoaXMuX2NoYW5nZWQ9ITAsdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcIlNJXCIsdGhpcy5fYXZhaWxhYmxlSW1hZ2VzKSx0aGlzLmZpcmUobmV3IGUuayhcImRhdGFcIix7ZGF0YVR5cGU6XCJzdHlsZVwifSkpO31lbHNlIHRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihgU3ByaXRlIFwiJHt0fVwiIGRvZXNuJ3QgZXhpc3RzIG9uIHRoaXMgbWFwLmApKSk7fWdldFNwcml0ZSgpe3JldHVybiB4KHRoaXMuc3R5bGVzaGVldC5zcHJpdGUpfXNldFNwcml0ZSh0LGk9e30sYSl7dGhpcy5fY2hlY2tMb2FkZWQoKSx0JiZ0aGlzLl92YWxpZGF0ZShlLnUuc3ByaXRlLFwic3ByaXRlXCIsdCxudWxsLGkpfHwodGhpcy5zdHlsZXNoZWV0LnNwcml0ZT10LHQ/dGhpcy5fbG9hZFNwcml0ZSh0LCEwLGEpOih0aGlzLl91bmxvYWRTcHJpdGUoKSxhJiZhKG51bGwpKSk7fX12YXIgX2U9ZS5ZKFt7bmFtZTpcImFfcG9zXCIsdHlwZTpcIkludDE2XCIsY29tcG9uZW50czoyfV0pO2NvbnN0IHBlPXtwcmVsdWRlOm1lKFwiI2lmZGVmIEdMX0VTXFxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuI2Vsc2VcXG4jaWYgIWRlZmluZWQobG93cClcXG4jZGVmaW5lIGxvd3BcXG4jZW5kaWZcXG4jaWYgIWRlZmluZWQobWVkaXVtcClcXG4jZGVmaW5lIG1lZGl1bXBcXG4jZW5kaWZcXG4jaWYgIWRlZmluZWQoaGlnaHApXFxuI2RlZmluZSBoaWdocFxcbiNlbmRpZlxcbiNlbmRpZlxcblwiLFwiI2lmZGVmIEdMX0VTXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbiNlbHNlXFxuI2lmICFkZWZpbmVkKGxvd3ApXFxuI2RlZmluZSBsb3dwXFxuI2VuZGlmXFxuI2lmICFkZWZpbmVkKG1lZGl1bXApXFxuI2RlZmluZSBtZWRpdW1wXFxuI2VuZGlmXFxuI2lmICFkZWZpbmVkKGhpZ2hwKVxcbiNkZWZpbmUgaGlnaHBcXG4jZW5kaWZcXG4jZW5kaWZcXG52ZWMyIHVucGFja19mbG9hdChjb25zdCBmbG9hdCBwYWNrZWRWYWx1ZSkge2ludCBwYWNrZWRJbnRWYWx1ZT1pbnQocGFja2VkVmFsdWUpO2ludCB2MD1wYWNrZWRJbnRWYWx1ZS8yNTY7cmV0dXJuIHZlYzIodjAscGFja2VkSW50VmFsdWUtdjAqMjU2KTt9dmVjMiB1bnBhY2tfb3BhY2l0eShjb25zdCBmbG9hdCBwYWNrZWRPcGFjaXR5KSB7aW50IGludE9wYWNpdHk9aW50KHBhY2tlZE9wYWNpdHkpLzI7cmV0dXJuIHZlYzIoZmxvYXQoaW50T3BhY2l0eSkvMTI3LjAsbW9kKHBhY2tlZE9wYWNpdHksMi4wKSk7fXZlYzQgZGVjb2RlX2NvbG9yKGNvbnN0IHZlYzIgZW5jb2RlZENvbG9yKSB7cmV0dXJuIHZlYzQodW5wYWNrX2Zsb2F0KGVuY29kZWRDb2xvclswXSkvMjU1LjAsdW5wYWNrX2Zsb2F0KGVuY29kZWRDb2xvclsxXSkvMjU1LjBcXG4pO31mbG9hdCB1bnBhY2tfbWl4X3ZlYzIoY29uc3QgdmVjMiBwYWNrZWRWYWx1ZSxjb25zdCBmbG9hdCB0KSB7cmV0dXJuIG1peChwYWNrZWRWYWx1ZVswXSxwYWNrZWRWYWx1ZVsxXSx0KTt9dmVjNCB1bnBhY2tfbWl4X2NvbG9yKGNvbnN0IHZlYzQgcGFja2VkQ29sb3JzLGNvbnN0IGZsb2F0IHQpIHt2ZWM0IG1pbkNvbG9yPWRlY29kZV9jb2xvcih2ZWMyKHBhY2tlZENvbG9yc1swXSxwYWNrZWRDb2xvcnNbMV0pKTt2ZWM0IG1heENvbG9yPWRlY29kZV9jb2xvcih2ZWMyKHBhY2tlZENvbG9yc1syXSxwYWNrZWRDb2xvcnNbM10pKTtyZXR1cm4gbWl4KG1pbkNvbG9yLG1heENvbG9yLHQpO312ZWMyIGdldF9wYXR0ZXJuX3Bvcyhjb25zdCB2ZWMyIHBpeGVsX2Nvb3JkX3VwcGVyLGNvbnN0IHZlYzIgcGl4ZWxfY29vcmRfbG93ZXIsY29uc3QgdmVjMiBwYXR0ZXJuX3NpemUsY29uc3QgZmxvYXQgdGlsZV91bml0c190b19waXhlbHMsY29uc3QgdmVjMiBwb3MpIHt2ZWMyIG9mZnNldD1tb2QobW9kKG1vZChwaXhlbF9jb29yZF91cHBlcixwYXR0ZXJuX3NpemUpKjI1Ni4wLHBhdHRlcm5fc2l6ZSkqMjU2LjArcGl4ZWxfY29vcmRfbG93ZXIscGF0dGVybl9zaXplKTtyZXR1cm4gKHRpbGVfdW5pdHNfdG9fcGl4ZWxzKnBvcytvZmZzZXQpL3BhdHRlcm5fc2l6ZTt9XFxuI2lmZGVmIFRFUlJBSU4zRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGVycmFpbjt1bmlmb3JtIGZsb2F0IHVfdGVycmFpbl9kaW07dW5pZm9ybSBtYXQ0IHVfdGVycmFpbl9tYXRyaXg7dW5pZm9ybSB2ZWM0IHVfdGVycmFpbl91bnBhY2s7dW5pZm9ybSBmbG9hdCB1X3RlcnJhaW5fZXhhZ2dlcmF0aW9uO3VuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGVwdGg7XFxuI2VuZGlmXFxuY29uc3QgaGlnaHAgdmVjNCBiaXRTaD12ZWM0KDI1Ni4qMjU2LioyNTYuLDI1Ni4qMjU2LiwyNTYuLDEuKTtjb25zdCBoaWdocCB2ZWM0IGJpdFNoaWZ0cz12ZWM0KDEuKS9iaXRTaDtoaWdocCBmbG9hdCB1bnBhY2soaGlnaHAgdmVjNCBjb2xvcikge3JldHVybiBkb3QoY29sb3IsYml0U2hpZnRzKTt9aGlnaHAgZmxvYXQgZGVwdGhPcGFjaXR5KHZlYzMgZnJhZykge1xcbiNpZmRlZiBURVJSQUlOM0RcXG5oaWdocCBmbG9hdCBkPXVucGFjayh0ZXh0dXJlMkQodV9kZXB0aCxmcmFnLnh5KjAuNSswLjUpKSswLjAwMDEtZnJhZy56O3JldHVybiAxLjAtbWF4KDAuMCxtaW4oMS4wLC1kKjUwMC4wKSk7XFxuI2Vsc2VcXG5yZXR1cm4gMS4wO1xcbiNlbmRpZlxcbn1mbG9hdCBjYWxjdWxhdGVfdmlzaWJpbGl0eSh2ZWM0IHBvcykge1xcbiNpZmRlZiBURVJSQUlOM0RcXG52ZWMzIGZyYWc9cG9zLnh5ei9wb3MudztoaWdocCBmbG9hdCBkPWRlcHRoT3BhY2l0eShmcmFnKTtpZiAoZCA+IDAuOTUpIHJldHVybiAxLjA7cmV0dXJuIChkK2RlcHRoT3BhY2l0eShmcmFnK3ZlYzMoMC4wLDAuMDEsMC4wKSkpLzIuMDtcXG4jZWxzZVxcbnJldHVybiAxLjA7XFxuI2VuZGlmXFxufWZsb2F0IGVsZSh2ZWMyIHBvcykge1xcbiNpZmRlZiBURVJSQUlOM0RcXG52ZWM0IHJnYj0odGV4dHVyZTJEKHVfdGVycmFpbixwb3MpKjI1NS4wKSp1X3RlcnJhaW5fdW5wYWNrO3JldHVybiByZ2IucityZ2IuZytyZ2IuYi11X3RlcnJhaW5fdW5wYWNrLmE7XFxuI2Vsc2VcXG5yZXR1cm4gMC4wO1xcbiNlbmRpZlxcbn1mbG9hdCBnZXRfZWxldmF0aW9uKHZlYzIgcG9zKSB7XFxuI2lmZGVmIFRFUlJBSU4zRFxcbnZlYzIgY29vcmQ9KHVfdGVycmFpbl9tYXRyaXgqdmVjNChwb3MsMC4wLDEuMCkpLnh5KnVfdGVycmFpbl9kaW0rMS4wO3ZlYzIgZj1mcmFjdChjb29yZCk7dmVjMiBjPShmbG9vcihjb29yZCkrMC41KS8odV90ZXJyYWluX2RpbSsyLjApO2Zsb2F0IGQ9MS4wLyh1X3RlcnJhaW5fZGltKzIuMCk7ZmxvYXQgdGw9ZWxlKGMpO2Zsb2F0IHRyPWVsZShjK3ZlYzIoZCwwLjApKTtmbG9hdCBibD1lbGUoYyt2ZWMyKDAuMCxkKSk7ZmxvYXQgYnI9ZWxlKGMrdmVjMihkLGQpKTtmbG9hdCBlbGV2YXRpb249bWl4KG1peCh0bCx0cixmLngpLG1peChibCxicixmLngpLGYueSk7cmV0dXJuIGVsZXZhdGlvbip1X3RlcnJhaW5fZXhhZ2dlcmF0aW9uO1xcbiNlbHNlXFxucmV0dXJuIDAuMDtcXG4jZW5kaWZcXG59XCIpLGJhY2tncm91bmQ6bWUoXCJ1bmlmb3JtIHZlYzQgdV9jb2xvcjt1bmlmb3JtIGZsb2F0IHVfb3BhY2l0eTt2b2lkIG1haW4oKSB7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqdV9vcGFjaXR5O1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIixcImF0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO31cIiksYmFja2dyb3VuZFBhdHRlcm46bWUoXCJ1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2E7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9icl9hO3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5fdGxfYjt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2I7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGZsb2F0IHVfbWl4O3VuaWZvcm0gZmxvYXQgdV9vcGFjaXR5O3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dm9pZCBtYWluKCkge3ZlYzIgaW1hZ2Vjb29yZD1tb2Qodl9wb3NfYSwxLjApO3ZlYzIgcG9zPW1peCh1X3BhdHRlcm5fdGxfYS91X3RleHNpemUsdV9wYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHVfcGF0dGVybl90bF9iL3VfdGV4c2l6ZSx1X3BhdHRlcm5fYnJfYi91X3RleHNpemUsaW1hZ2Vjb29yZF9iKTt2ZWM0IGNvbG9yMj10ZXh0dXJlMkQodV9pbWFnZSxwb3MyKTtnbF9GcmFnQ29sb3I9bWl4KGNvbG9yMSxjb2xvcjIsdV9taXgpKnVfb3BhY2l0eTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9zaXplX2E7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9zaXplX2I7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfdXBwZXI7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfbG93ZXI7dW5pZm9ybSBmbG9hdCB1X3NjYWxlX2E7dW5pZm9ybSBmbG9hdCB1X3NjYWxlX2I7dW5pZm9ybSBmbG9hdCB1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvc19hO3ZhcnlpbmcgdmVjMiB2X3Bvc19iO3ZvaWQgbWFpbigpIHtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7dl9wb3NfYT1nZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlcix1X3BpeGVsX2Nvb3JkX2xvd2VyLHVfc2NhbGVfYSp1X3BhdHRlcm5fc2l6ZV9hLHVfdGlsZV91bml0c190b19waXhlbHMsYV9wb3MpO3ZfcG9zX2I9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcix1X3NjYWxlX2IqdV9wYXR0ZXJuX3NpemVfYix1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzLGFfcG9zKTt9XCIpLGNpcmNsZTptZShcInZhcnlpbmcgdmVjMyB2X2RhdGE7dmFyeWluZyBmbG9hdCB2X3Zpc2liaWxpdHk7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgc3Ryb2tlX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHN0cm9rZV93aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBzdHJva2Vfb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IHN0cm9rZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgc3Ryb2tlX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBzdHJva2Vfb3BhY2l0eVxcbnZlYzIgZXh0cnVkZT12X2RhdGEueHk7ZmxvYXQgZXh0cnVkZV9sZW5ndGg9bGVuZ3RoKGV4dHJ1ZGUpO2Zsb2F0IGFudGlhbGlhc2VkX2JsdXI9dl9kYXRhLno7ZmxvYXQgb3BhY2l0eV90PXNtb290aHN0ZXAoMC4wLGFudGlhbGlhc2VkX2JsdXIsZXh0cnVkZV9sZW5ndGgtMS4wKTtmbG9hdCBjb2xvcl90PXN0cm9rZV93aWR0aCA8IDAuMDEgPyAwLjAgOiBzbW9vdGhzdGVwKGFudGlhbGlhc2VkX2JsdXIsMC4wLGV4dHJ1ZGVfbGVuZ3RoLXJhZGl1cy8ocmFkaXVzK3N0cm9rZV93aWR0aCkpO2dsX0ZyYWdDb2xvcj12X3Zpc2liaWxpdHkqb3BhY2l0eV90Km1peChjb2xvcipvcGFjaXR5LHN0cm9rZV9jb2xvcipzdHJva2Vfb3BhY2l0eSxjb2xvcl90KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBib29sIHVfc2NhbGVfd2l0aF9tYXA7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSB2ZWMyIHVfZXh0cnVkZV9zY2FsZTt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dW5pZm9ybSBoaWdocCBmbG9hdCB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U7YXR0cmlidXRlIHZlYzIgYV9wb3M7dmFyeWluZyB2ZWMzIHZfZGF0YTt2YXJ5aW5nIGZsb2F0IHZfdmlzaWJpbGl0eTtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgcmFkaXVzXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBzdHJva2VfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgc3Ryb2tlX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHN0cm9rZV9vcGFjaXR5XFxudm9pZCBtYWluKHZvaWQpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IHN0cm9rZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgc3Ryb2tlX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBzdHJva2Vfb3BhY2l0eVxcbnZlYzIgZXh0cnVkZT12ZWMyKG1vZChhX3BvcywyLjApKjIuMC0xLjApO3ZlYzIgY2lyY2xlX2NlbnRlcj1mbG9vcihhX3BvcyowLjUpO2Zsb2F0IGVsZT1nZXRfZWxldmF0aW9uKGNpcmNsZV9jZW50ZXIpO3ZfdmlzaWJpbGl0eT1jYWxjdWxhdGVfdmlzaWJpbGl0eSh1X21hdHJpeCp2ZWM0KGNpcmNsZV9jZW50ZXIsZWxlLDEuMCkpO2lmICh1X3BpdGNoX3dpdGhfbWFwKSB7dmVjMiBjb3JuZXJfcG9zaXRpb249Y2lyY2xlX2NlbnRlcjtpZiAodV9zY2FsZV93aXRoX21hcCkge2Nvcm5lcl9wb3NpdGlvbis9ZXh0cnVkZSoocmFkaXVzK3N0cm9rZV93aWR0aCkqdV9leHRydWRlX3NjYWxlO30gZWxzZSB7dmVjNCBwcm9qZWN0ZWRfY2VudGVyPXVfbWF0cml4KnZlYzQoY2lyY2xlX2NlbnRlciwwLDEpO2Nvcm5lcl9wb3NpdGlvbis9ZXh0cnVkZSoocmFkaXVzK3N0cm9rZV93aWR0aCkqdV9leHRydWRlX3NjYWxlKihwcm9qZWN0ZWRfY2VudGVyLncvdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKTt9Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChjb3JuZXJfcG9zaXRpb24sZWxlLDEpO30gZWxzZSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChjaXJjbGVfY2VudGVyLGVsZSwxKTtpZiAodV9zY2FsZV93aXRoX21hcCkge2dsX1Bvc2l0aW9uLnh5Kz1leHRydWRlKihyYWRpdXMrc3Ryb2tlX3dpZHRoKSp1X2V4dHJ1ZGVfc2NhbGUqdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlO30gZWxzZSB7Z2xfUG9zaXRpb24ueHkrPWV4dHJ1ZGUqKHJhZGl1cytzdHJva2Vfd2lkdGgpKnVfZXh0cnVkZV9zY2FsZSpnbF9Qb3NpdGlvbi53O319ZmxvYXQgYW50aWFsaWFzYmx1cj0tbWF4KDEuMC91X2RldmljZV9waXhlbF9yYXRpby8ocmFkaXVzK3N0cm9rZV93aWR0aCksYmx1cik7dl9kYXRhPXZlYzMoZXh0cnVkZS54LGV4dHJ1ZGUueSxhbnRpYWxpYXNibHVyKTt9XCIpLGNsaXBwaW5nTWFzazptZShcInZvaWQgbWFpbigpIHtnbF9GcmFnQ29sb3I9dmVjNCgxLjApO31cIixcImF0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO31cIiksaGVhdG1hcDptZShcInVuaWZvcm0gaGlnaHAgZmxvYXQgdV9pbnRlbnNpdHk7dmFyeWluZyB2ZWMyIHZfZXh0cnVkZTtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIGZsb2F0IHdlaWdodFxcbiNkZWZpbmUgR0FVU1NfQ09FRiAwLjM5ODk0MjI4MDQwMTQzMjdcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuZmxvYXQgZD0tMC41KjMuMCozLjAqZG90KHZfZXh0cnVkZSx2X2V4dHJ1ZGUpO2Zsb2F0IHZhbD13ZWlnaHQqdV9pbnRlbnNpdHkqR0FVU1NfQ09FRipleHAoZCk7Z2xfRnJhZ0NvbG9yPXZlYzQodmFsLDEuMCwxLjAsMS4wKTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X2V4dHJ1ZGVfc2NhbGU7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7dW5pZm9ybSBmbG9hdCB1X2ludGVuc2l0eTthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl9leHRydWRlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbmNvbnN0IGhpZ2hwIGZsb2F0IFpFUk89MS4wLzI1NS4wLzE2LjA7XFxuI2RlZmluZSBHQVVTU19DT0VGIDAuMzk4OTQyMjgwNDAxNDMyN1xcbnZvaWQgbWFpbih2b2lkKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG52ZWMyIHVuc2NhbGVkX2V4dHJ1ZGU9dmVjMihtb2QoYV9wb3MsMi4wKSoyLjAtMS4wKTtmbG9hdCBTPXNxcnQoLTIuMCpsb2coWkVSTy93ZWlnaHQvdV9pbnRlbnNpdHkvR0FVU1NfQ09FRikpLzMuMDt2X2V4dHJ1ZGU9Uyp1bnNjYWxlZF9leHRydWRlO3ZlYzIgZXh0cnVkZT12X2V4dHJ1ZGUqcmFkaXVzKnVfZXh0cnVkZV9zY2FsZTt2ZWM0IHBvcz12ZWM0KGZsb29yKGFfcG9zKjAuNSkrZXh0cnVkZSxnZXRfZWxldmF0aW9uKGZsb29yKGFfcG9zKjAuNSkpLDEpO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnBvczt9XCIpLGhlYXRtYXBUZXh0dXJlOm1lKFwidW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt1bmlmb3JtIHNhbXBsZXIyRCB1X2NvbG9yX3JhbXA7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7dmFyeWluZyB2ZWMyIHZfcG9zO3ZvaWQgbWFpbigpIHtmbG9hdCB0PXRleHR1cmUyRCh1X2ltYWdlLHZfcG9zKS5yO3ZlYzQgY29sb3I9dGV4dHVyZTJEKHVfY29sb3JfcmFtcCx2ZWMyKHQsMC41KSk7Z2xfRnJhZ0NvbG9yPWNvbG9yKnVfb3BhY2l0eTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMC4wKTtcXG4jZW5kaWZcXG59XCIsXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfd29ybGQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7dmFyeWluZyB2ZWMyIHZfcG9zO3ZvaWQgbWFpbigpIHtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zKnVfd29ybGQsMCwxKTt2X3Bvcy54PWFfcG9zLng7dl9wb3MueT0xLjAtYV9wb3MueTt9XCIpLGNvbGxpc2lvbkJveDptZShcInZhcnlpbmcgZmxvYXQgdl9wbGFjZWQ7dmFyeWluZyBmbG9hdCB2X25vdFVzZWQ7dm9pZCBtYWluKCkge2Zsb2F0IGFscGhhPTAuNTtnbF9GcmFnQ29sb3I9dmVjNCgxLjAsMC4wLDAuMCwxLjApKmFscGhhO2lmICh2X3BsYWNlZCA+IDAuNSkge2dsX0ZyYWdDb2xvcj12ZWM0KDAuMCwwLjAsMS4wLDAuNSkqYWxwaGE7fWlmICh2X25vdFVzZWQgPiAwLjUpIHtnbF9GcmFnQ29sb3IqPS4xO319XCIsXCJhdHRyaWJ1dGUgdmVjMiBhX2FuY2hvcl9wb3M7YXR0cmlidXRlIHZlYzIgYV9wbGFjZWQ7YXR0cmlidXRlIHZlYzIgYV9ib3hfcmVhbDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfZXh0cnVkZV9zY2FsZTt2YXJ5aW5nIGZsb2F0IHZfcGxhY2VkO3ZhcnlpbmcgZmxvYXQgdl9ub3RVc2VkO3ZlYzQgcHJvamVjdFRpbGVXaXRoRWxldmF0aW9uKHZlYzIgcG9zSW5UaWxlLGZsb2F0IGVsZXZhdGlvbikge3JldHVybiB1X21hdHJpeCp2ZWM0KHBvc0luVGlsZSxlbGV2YXRpb24sMS4wKTt9dm9pZCBtYWluKCkge2dsX1Bvc2l0aW9uPXByb2plY3RUaWxlV2l0aEVsZXZhdGlvbihhX2FuY2hvcl9wb3MsZ2V0X2VsZXZhdGlvbihhX2FuY2hvcl9wb3MpKTtnbF9Qb3NpdGlvbi54eT0oKGFfYm94X3JlYWwrMC41KSp1X3BpeGVsX2V4dHJ1ZGVfc2NhbGUqMi4wLTEuMCkqdmVjMigxLjAsLTEuMCkqZ2xfUG9zaXRpb24udztpZiAoZ2xfUG9zaXRpb24uei9nbF9Qb3NpdGlvbi53IDwgMS4xKSB7Z2xfUG9zaXRpb24uej0wLjU7fXZfcGxhY2VkPWFfcGxhY2VkLng7dl9ub3RVc2VkPWFfcGxhY2VkLnk7fVwiKSxjb2xsaXNpb25DaXJjbGU6bWUoXCJ2YXJ5aW5nIGZsb2F0IHZfcmFkaXVzO3ZhcnlpbmcgdmVjMiB2X2V4dHJ1ZGU7dmFyeWluZyBmbG9hdCB2X3BlcnNwZWN0aXZlX3JhdGlvO3ZhcnlpbmcgZmxvYXQgdl9jb2xsaXNpb247dm9pZCBtYWluKCkge2Zsb2F0IGFscGhhPTAuNSptaW4odl9wZXJzcGVjdGl2ZV9yYXRpbywxLjApO2Zsb2F0IHN0cm9rZV9yYWRpdXM9MC45Km1heCh2X3BlcnNwZWN0aXZlX3JhdGlvLDEuMCk7ZmxvYXQgZGlzdGFuY2VfdG9fY2VudGVyPWxlbmd0aCh2X2V4dHJ1ZGUpO2Zsb2F0IGRpc3RhbmNlX3RvX2VkZ2U9YWJzKGRpc3RhbmNlX3RvX2NlbnRlci12X3JhZGl1cyk7ZmxvYXQgb3BhY2l0eV90PXNtb290aHN0ZXAoLXN0cm9rZV9yYWRpdXMsMC4wLC1kaXN0YW5jZV90b19lZGdlKTt2ZWM0IGNvbG9yPW1peCh2ZWM0KDAuMCwwLjAsMS4wLDAuNSksdmVjNCgxLjAsMC4wLDAuMCwxLjApLHZfY29sbGlzaW9uKTtnbF9GcmFnQ29sb3I9Y29sb3IqYWxwaGEqb3BhY2l0eV90O31cIixcImF0dHJpYnV0ZSB2ZWMyIGFfcG9zO2F0dHJpYnV0ZSBmbG9hdCBhX3JhZGl1czthdHRyaWJ1dGUgdmVjMiBhX2ZsYWdzO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9pbnZfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3ZpZXdwb3J0X3NpemU7dW5pZm9ybSBmbG9hdCB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U7dmFyeWluZyBmbG9hdCB2X3JhZGl1czt2YXJ5aW5nIHZlYzIgdl9leHRydWRlO3ZhcnlpbmcgZmxvYXQgdl9wZXJzcGVjdGl2ZV9yYXRpbzt2YXJ5aW5nIGZsb2F0IHZfY29sbGlzaW9uO3ZlYzMgdG9UaWxlUG9zaXRpb24odmVjMiBzY3JlZW5Qb3MpIHt2ZWM0IHJheVN0YXJ0PXVfaW52X21hdHJpeCp2ZWM0KHNjcmVlblBvcywtMS4wLDEuMCk7dmVjNCByYXlFbmQgID11X2ludl9tYXRyaXgqdmVjNChzY3JlZW5Qb3MsIDEuMCwxLjApO3JheVN0YXJ0Lnh5ei89cmF5U3RhcnQudztyYXlFbmQueHl6ICAvPXJheUVuZC53O2hpZ2hwIGZsb2F0IHQ9KDAuMC1yYXlTdGFydC56KS8ocmF5RW5kLnotcmF5U3RhcnQueik7cmV0dXJuIG1peChyYXlTdGFydC54eXoscmF5RW5kLnh5eix0KTt9dm9pZCBtYWluKCkge3ZlYzIgcXVhZENlbnRlclBvcz1hX3BvcztmbG9hdCByYWRpdXM9YV9yYWRpdXM7ZmxvYXQgY29sbGlzaW9uPWFfZmxhZ3MueDtmbG9hdCB2ZXJ0ZXhJZHg9YV9mbGFncy55O3ZlYzIgcXVhZFZlcnRleE9mZnNldD12ZWMyKG1peCgtMS4wLDEuMCxmbG9hdCh2ZXJ0ZXhJZHggPj0yLjApKSxtaXgoLTEuMCwxLjAsZmxvYXQodmVydGV4SWR4ID49MS4wICYmIHZlcnRleElkeCA8PTIuMCkpKTt2ZWMyIHF1YWRWZXJ0ZXhFeHRlbnQ9cXVhZFZlcnRleE9mZnNldCpyYWRpdXM7dmVjMyB0aWxlUG9zPXRvVGlsZVBvc2l0aW9uKHF1YWRDZW50ZXJQb3MpO3ZlYzQgY2xpcFBvcz11X21hdHJpeCp2ZWM0KHRpbGVQb3MsMS4wKTtoaWdocCBmbG9hdCBjYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlPWNsaXBQb3MudztoaWdocCBmbG9hdCBjb2xsaXNpb25fcGVyc3BlY3RpdmVfcmF0aW89Y2xhbXAoMC41KzAuNSoodV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlL2NhbWVyYV90b19hbmNob3JfZGlzdGFuY2UpLDAuMCw0LjApO2Zsb2F0IHBhZGRpbmdfZmFjdG9yPTEuMjt2X3JhZGl1cz1yYWRpdXM7dl9leHRydWRlPXF1YWRWZXJ0ZXhFeHRlbnQqcGFkZGluZ19mYWN0b3I7dl9wZXJzcGVjdGl2ZV9yYXRpbz1jb2xsaXNpb25fcGVyc3BlY3RpdmVfcmF0aW87dl9jb2xsaXNpb249Y29sbGlzaW9uO2dsX1Bvc2l0aW9uPXZlYzQoY2xpcFBvcy54eXovY2xpcFBvcy53LDEuMCkrdmVjNChxdWFkVmVydGV4RXh0ZW50KnBhZGRpbmdfZmFjdG9yL3Vfdmlld3BvcnRfc2l6ZSoyLjAsMC4wLDAuMCk7fVwiKSxkZWJ1ZzptZShcInVuaWZvcm0gaGlnaHAgdmVjNCB1X2NvbG9yO3VuaWZvcm0gc2FtcGxlcjJEIHVfb3ZlcmxheTt2YXJ5aW5nIHZlYzIgdl91djt2b2lkIG1haW4oKSB7dmVjNCBvdmVybGF5X2NvbG9yPXRleHR1cmUyRCh1X292ZXJsYXksdl91dik7Z2xfRnJhZ0NvbG9yPW1peCh1X2NvbG9yLG92ZXJsYXlfY29sb3Isb3ZlcmxheV9jb2xvci5hKTt9XCIsXCJhdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl91djt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X292ZXJsYXlfc2NhbGU7dm9pZCBtYWluKCkge3ZfdXY9YV9wb3MvODE5Mi4wO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MqdV9vdmVybGF5X3NjYWxlLGdldF9lbGV2YXRpb24oYV9wb3MpLDEpO31cIiksZmlsbDptZShcIiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5nbF9GcmFnQ29sb3I9Y29sb3Iqb3BhY2l0eTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJhdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmdsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt9XCIpLGZpbGxPdXRsaW5lOm1lKFwidmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuZmxvYXQgZGlzdD1sZW5ndGgodl9wb3MtZ2xfRnJhZ0Nvb3JkLnh5KTtmbG9hdCBhbHBoYT0xLjAtc21vb3Roc3RlcCgwLjAsMS4wLGRpc3QpO2dsX0ZyYWdDb2xvcj1vdXRsaW5lX2NvbG9yKihhbHBoYSpvcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJhdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfd29ybGQ7dmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuZ2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZfcG9zPShnbF9Qb3NpdGlvbi54eS9nbF9Qb3NpdGlvbi53KzEuMCkvMi4wKnVfd29ybGQ7fVwiKSxmaWxsT3V0bGluZVBhdHRlcm46bWUoXCJ1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dW5pZm9ybSBmbG9hdCB1X2ZhZGU7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dzt2ZWMyIGltYWdlY29vcmQ9bW9kKHZfcG9zX2EsMS4wKTt2ZWMyIHBvcz1taXgocGF0dGVybl90bF9hL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHBhdHRlcm5fdGxfYi91X3RleHNpemUscGF0dGVybl9icl9iL3VfdGV4c2l6ZSxpbWFnZWNvb3JkX2IpO3ZlYzQgY29sb3IyPXRleHR1cmUyRCh1X2ltYWdlLHBvczIpO2Zsb2F0IGRpc3Q9bGVuZ3RoKHZfcG9zLWdsX0ZyYWdDb29yZC54eSk7ZmxvYXQgYWxwaGE9MS4wLXNtb290aHN0ZXAoMC4wLDEuMCxkaXN0KTtnbF9GcmFnQ29sb3I9bWl4KGNvbG9yMSxjb2xvcjIsdV9mYWRlKSphbHBoYSpvcGFjaXR5O1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIixcInVuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV93b3JsZDt1bmlmb3JtIHZlYzIgdV9waXhlbF9jb29yZF91cHBlcjt1bmlmb3JtIHZlYzIgdV9waXhlbF9jb29yZF9sb3dlcjt1bmlmb3JtIHZlYzMgdV9zY2FsZTthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl9wb3NfYTt2YXJ5aW5nIHZlYzIgdl9wb3NfYjt2YXJ5aW5nIHZlYzIgdl9wb3M7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZlYzIgcGF0dGVybl90bF9hPXBhdHRlcm5fZnJvbS54eTt2ZWMyIHBhdHRlcm5fYnJfYT1wYXR0ZXJuX2Zyb20uenc7dmVjMiBwYXR0ZXJuX3RsX2I9cGF0dGVybl90by54eTt2ZWMyIHBhdHRlcm5fYnJfYj1wYXR0ZXJuX3RvLnp3O2Zsb2F0IHRpbGVSYXRpbz11X3NjYWxlLng7ZmxvYXQgZnJvbVNjYWxlPXVfc2NhbGUueTtmbG9hdCB0b1NjYWxlPXVfc2NhbGUuejtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7dmVjMiBkaXNwbGF5X3NpemVfYT0ocGF0dGVybl9icl9hLXBhdHRlcm5fdGxfYSkvcGl4ZWxfcmF0aW9fZnJvbTt2ZWMyIGRpc3BsYXlfc2l6ZV9iPShwYXR0ZXJuX2JyX2ItcGF0dGVybl90bF9iKS9waXhlbF9yYXRpb190bzt2X3Bvc19hPWdldF9wYXR0ZXJuX3Bvcyh1X3BpeGVsX2Nvb3JkX3VwcGVyLHVfcGl4ZWxfY29vcmRfbG93ZXIsZnJvbVNjYWxlKmRpc3BsYXlfc2l6ZV9hLHRpbGVSYXRpbyxhX3Bvcyk7dl9wb3NfYj1nZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlcix1X3BpeGVsX2Nvb3JkX2xvd2VyLHRvU2NhbGUqZGlzcGxheV9zaXplX2IsdGlsZVJhdGlvLGFfcG9zKTt2X3Bvcz0oZ2xfUG9zaXRpb24ueHkvZ2xfUG9zaXRpb24udysxLjApLzIuMCp1X3dvcmxkO31cIiksZmlsbFBhdHRlcm46bWUoXCIjaWZkZWYgR0xfRVNcXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxuI2VuZGlmXFxudW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGZsb2F0IHVfZmFkZTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiB2X3Bvc19hO3ZhcnlpbmcgdmVjMiB2X3Bvc19iO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dzt2ZWMyIGltYWdlY29vcmQ9bW9kKHZfcG9zX2EsMS4wKTt2ZWMyIHBvcz1taXgocGF0dGVybl90bF9hL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHBhdHRlcm5fdGxfYi91X3RleHNpemUscGF0dGVybl9icl9iL3VfdGV4c2l6ZSxpbWFnZWNvb3JkX2IpO3ZlYzQgY29sb3IyPXRleHR1cmUyRCh1X2ltYWdlLHBvczIpO2dsX0ZyYWdDb2xvcj1taXgoY29sb3IxLGNvbG9yMix1X2ZhZGUpKm9wYWNpdHk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX3VwcGVyO3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX2xvd2VyO3VuaWZvcm0gdmVjMyB1X3NjYWxlO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvc19hO3ZhcnlpbmcgdmVjMiB2X3Bvc19iO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dztmbG9hdCB0aWxlWm9vbVJhdGlvPXVfc2NhbGUueDtmbG9hdCBmcm9tU2NhbGU9dV9zY2FsZS55O2Zsb2F0IHRvU2NhbGU9dV9zY2FsZS56O3ZlYzIgZGlzcGxheV9zaXplX2E9KHBhdHRlcm5fYnJfYS1wYXR0ZXJuX3RsX2EpL3BpeGVsX3JhdGlvX2Zyb207dmVjMiBkaXNwbGF5X3NpemVfYj0ocGF0dGVybl9icl9iLXBhdHRlcm5fdGxfYikvcGl4ZWxfcmF0aW9fdG87Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZfcG9zX2E9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcixmcm9tU2NhbGUqZGlzcGxheV9zaXplX2EsdGlsZVpvb21SYXRpbyxhX3Bvcyk7dl9wb3NfYj1nZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlcix1X3BpeGVsX2Nvb3JkX2xvd2VyLHRvU2NhbGUqZGlzcGxheV9zaXplX2IsdGlsZVpvb21SYXRpbyxhX3Bvcyk7fVwiKSxmaWxsRXh0cnVzaW9uOm1lKFwidmFyeWluZyB2ZWM0IHZfY29sb3I7dm9pZCBtYWluKCkge2dsX0ZyYWdDb2xvcj12X2NvbG9yO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIixcInVuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzMgdV9saWdodGNvbG9yO3VuaWZvcm0gbG93cCB2ZWMzIHVfbGlnaHRwb3M7dW5pZm9ybSBsb3dwIGZsb2F0IHVfbGlnaHRpbnRlbnNpdHk7dW5pZm9ybSBmbG9hdCB1X3ZlcnRpY2FsX2dyYWRpZW50O3VuaWZvcm0gbG93cCBmbG9hdCB1X29wYWNpdHk7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9ub3JtYWxfZWQ7XFxuI2lmZGVmIFRFUlJBSU4zRFxcbmF0dHJpYnV0ZSB2ZWMyIGFfY2VudHJvaWQ7XFxuI2VuZGlmXFxudmFyeWluZyB2ZWM0IHZfY29sb3I7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCBmbG9hdCBiYXNlXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCBmbG9hdCBoZWlnaHRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIGZsb2F0IGhlaWdodFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG52ZWMzIG5vcm1hbD1hX25vcm1hbF9lZC54eXo7XFxuI2lmZGVmIFRFUlJBSU4zRFxcbmZsb2F0IGhlaWdodF90ZXJyYWluM2Rfb2Zmc2V0PWdldF9lbGV2YXRpb24oYV9jZW50cm9pZCk7ZmxvYXQgYmFzZV90ZXJyYWluM2Rfb2Zmc2V0PWhlaWdodF90ZXJyYWluM2Rfb2Zmc2V0LShiYXNlID4gMC4wID8gMC4wIDogMTAuMCk7XFxuI2Vsc2VcXG5mbG9hdCBoZWlnaHRfdGVycmFpbjNkX29mZnNldD0wLjA7ZmxvYXQgYmFzZV90ZXJyYWluM2Rfb2Zmc2V0PTAuMDtcXG4jZW5kaWZcXG5iYXNlPW1heCgwLjAsYmFzZSkrYmFzZV90ZXJyYWluM2Rfb2Zmc2V0O2hlaWdodD1tYXgoMC4wLGhlaWdodCkraGVpZ2h0X3RlcnJhaW4zZF9vZmZzZXQ7ZmxvYXQgdD1tb2Qobm9ybWFsLngsMi4wKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLHQgPiAwLjAgPyBoZWlnaHQgOiBiYXNlLDEpO2Zsb2F0IGNvbG9ydmFsdWU9Y29sb3IuciowLjIxMjYrY29sb3IuZyowLjcxNTIrY29sb3IuYiowLjA3MjI7dl9jb2xvcj12ZWM0KDAuMCwwLjAsMC4wLDEuMCk7dmVjNCBhbWJpZW50bGlnaHQ9dmVjNCgwLjAzLDAuMDMsMC4wMywxLjApO2NvbG9yKz1hbWJpZW50bGlnaHQ7ZmxvYXQgZGlyZWN0aW9uYWw9Y2xhbXAoZG90KG5vcm1hbC8xNjM4NC4wLHVfbGlnaHRwb3MpLDAuMCwxLjApO2RpcmVjdGlvbmFsPW1peCgoMS4wLXVfbGlnaHRpbnRlbnNpdHkpLG1heCgoMS4wLWNvbG9ydmFsdWUrdV9saWdodGludGVuc2l0eSksMS4wKSxkaXJlY3Rpb25hbCk7aWYgKG5vcm1hbC55ICE9MC4wKSB7ZGlyZWN0aW9uYWwqPSgoMS4wLXVfdmVydGljYWxfZ3JhZGllbnQpKyh1X3ZlcnRpY2FsX2dyYWRpZW50KmNsYW1wKCh0K2Jhc2UpKnBvdyhoZWlnaHQvMTUwLjAsMC41KSxtaXgoMC43LDAuOTgsMS4wLXVfbGlnaHRpbnRlbnNpdHkpLDEuMCkpKTt9dl9jb2xvci5yKz1jbGFtcChjb2xvci5yKmRpcmVjdGlvbmFsKnVfbGlnaHRjb2xvci5yLG1peCgwLjAsMC4zLDEuMC11X2xpZ2h0Y29sb3IuciksMS4wKTt2X2NvbG9yLmcrPWNsYW1wKGNvbG9yLmcqZGlyZWN0aW9uYWwqdV9saWdodGNvbG9yLmcsbWl4KDAuMCwwLjMsMS4wLXVfbGlnaHRjb2xvci5nKSwxLjApO3ZfY29sb3IuYis9Y2xhbXAoY29sb3IuYipkaXJlY3Rpb25hbCp1X2xpZ2h0Y29sb3IuYixtaXgoMC4wLDAuMywxLjAtdV9saWdodGNvbG9yLmIpLDEuMCk7dl9jb2xvcio9dV9vcGFjaXR5O31cIiksZmlsbEV4dHJ1c2lvblBhdHRlcm46bWUoXCJ1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3VuaWZvcm0gZmxvYXQgdV9mYWRlO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dmFyeWluZyB2ZWM0IHZfbGlnaHRpbmc7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJhc2VcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGVpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGVpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZlYzIgcGF0dGVybl90bF9hPXBhdHRlcm5fZnJvbS54eTt2ZWMyIHBhdHRlcm5fYnJfYT1wYXR0ZXJuX2Zyb20uenc7dmVjMiBwYXR0ZXJuX3RsX2I9cGF0dGVybl90by54eTt2ZWMyIHBhdHRlcm5fYnJfYj1wYXR0ZXJuX3RvLnp3O3ZlYzIgaW1hZ2Vjb29yZD1tb2Qodl9wb3NfYSwxLjApO3ZlYzIgcG9zPW1peChwYXR0ZXJuX3RsX2EvdV90ZXhzaXplLHBhdHRlcm5fYnJfYS91X3RleHNpemUsaW1hZ2Vjb29yZCk7dmVjNCBjb2xvcjE9dGV4dHVyZTJEKHVfaW1hZ2UscG9zKTt2ZWMyIGltYWdlY29vcmRfYj1tb2Qodl9wb3NfYiwxLjApO3ZlYzIgcG9zMj1taXgocGF0dGVybl90bF9iL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2IvdV90ZXhzaXplLGltYWdlY29vcmRfYik7dmVjNCBjb2xvcjI9dGV4dHVyZTJEKHVfaW1hZ2UscG9zMik7dmVjNCBtaXhlZENvbG9yPW1peChjb2xvcjEsY29sb3IyLHVfZmFkZSk7Z2xfRnJhZ0NvbG9yPW1peGVkQ29sb3Iqdl9saWdodGluZztcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfdXBwZXI7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfbG93ZXI7dW5pZm9ybSBmbG9hdCB1X2hlaWdodF9mYWN0b3I7dW5pZm9ybSB2ZWMzIHVfc2NhbGU7dW5pZm9ybSBmbG9hdCB1X3ZlcnRpY2FsX2dyYWRpZW50O3VuaWZvcm0gbG93cCBmbG9hdCB1X29wYWNpdHk7dW5pZm9ybSB2ZWMzIHVfbGlnaHRjb2xvcjt1bmlmb3JtIGxvd3AgdmVjMyB1X2xpZ2h0cG9zO3VuaWZvcm0gbG93cCBmbG9hdCB1X2xpZ2h0aW50ZW5zaXR5O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO2F0dHJpYnV0ZSB2ZWM0IGFfbm9ybWFsX2VkO1xcbiNpZmRlZiBURVJSQUlOM0RcXG5hdHRyaWJ1dGUgdmVjMiBhX2NlbnRyb2lkO1xcbiNlbmRpZlxcbnZhcnlpbmcgdmVjMiB2X3Bvc19hO3ZhcnlpbmcgdmVjMiB2X3Bvc19iO3ZhcnlpbmcgdmVjNCB2X2xpZ2h0aW5nO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBiYXNlXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhlaWdodFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJhc2VcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGhlaWdodFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dztmbG9hdCB0aWxlUmF0aW89dV9zY2FsZS54O2Zsb2F0IGZyb21TY2FsZT11X3NjYWxlLnk7ZmxvYXQgdG9TY2FsZT11X3NjYWxlLno7dmVjMyBub3JtYWw9YV9ub3JtYWxfZWQueHl6O2Zsb2F0IGVkZ2VkaXN0YW5jZT1hX25vcm1hbF9lZC53O3ZlYzIgZGlzcGxheV9zaXplX2E9KHBhdHRlcm5fYnJfYS1wYXR0ZXJuX3RsX2EpL3BpeGVsX3JhdGlvX2Zyb207dmVjMiBkaXNwbGF5X3NpemVfYj0ocGF0dGVybl9icl9iLXBhdHRlcm5fdGxfYikvcGl4ZWxfcmF0aW9fdG87XFxuI2lmZGVmIFRFUlJBSU4zRFxcbmZsb2F0IGhlaWdodF90ZXJyYWluM2Rfb2Zmc2V0PWdldF9lbGV2YXRpb24oYV9jZW50cm9pZCk7ZmxvYXQgYmFzZV90ZXJyYWluM2Rfb2Zmc2V0PWhlaWdodF90ZXJyYWluM2Rfb2Zmc2V0LShiYXNlID4gMC4wID8gMC4wIDogMTAuMCk7XFxuI2Vsc2VcXG5mbG9hdCBoZWlnaHRfdGVycmFpbjNkX29mZnNldD0wLjA7ZmxvYXQgYmFzZV90ZXJyYWluM2Rfb2Zmc2V0PTAuMDtcXG4jZW5kaWZcXG5iYXNlPW1heCgwLjAsYmFzZSkrYmFzZV90ZXJyYWluM2Rfb2Zmc2V0O2hlaWdodD1tYXgoMC4wLGhlaWdodCkraGVpZ2h0X3RlcnJhaW4zZF9vZmZzZXQ7ZmxvYXQgdD1tb2Qobm9ybWFsLngsMi4wKTtmbG9hdCB6PXQgPiAwLjAgPyBoZWlnaHQgOiBiYXNlO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MseiwxKTt2ZWMyIHBvcz1ub3JtYWwueD09MS4wICYmIG5vcm1hbC55PT0wLjAgJiYgbm9ybWFsLno9PTE2Mzg0LjBcXG4/IGFfcG9zXFxuOiB2ZWMyKGVkZ2VkaXN0YW5jZSx6KnVfaGVpZ2h0X2ZhY3Rvcik7dl9wb3NfYT1nZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlcix1X3BpeGVsX2Nvb3JkX2xvd2VyLGZyb21TY2FsZSpkaXNwbGF5X3NpemVfYSx0aWxlUmF0aW8scG9zKTt2X3Bvc19iPWdldF9wYXR0ZXJuX3Bvcyh1X3BpeGVsX2Nvb3JkX3VwcGVyLHVfcGl4ZWxfY29vcmRfbG93ZXIsdG9TY2FsZSpkaXNwbGF5X3NpemVfYix0aWxlUmF0aW8scG9zKTt2X2xpZ2h0aW5nPXZlYzQoMC4wLDAuMCwwLjAsMS4wKTtmbG9hdCBkaXJlY3Rpb25hbD1jbGFtcChkb3Qobm9ybWFsLzE2MzgzLjAsdV9saWdodHBvcyksMC4wLDEuMCk7ZGlyZWN0aW9uYWw9bWl4KCgxLjAtdV9saWdodGludGVuc2l0eSksbWF4KCgwLjUrdV9saWdodGludGVuc2l0eSksMS4wKSxkaXJlY3Rpb25hbCk7aWYgKG5vcm1hbC55ICE9MC4wKSB7ZGlyZWN0aW9uYWwqPSgoMS4wLXVfdmVydGljYWxfZ3JhZGllbnQpKyh1X3ZlcnRpY2FsX2dyYWRpZW50KmNsYW1wKCh0K2Jhc2UpKnBvdyhoZWlnaHQvMTUwLjAsMC41KSxtaXgoMC43LDAuOTgsMS4wLXVfbGlnaHRpbnRlbnNpdHkpLDEuMCkpKTt9dl9saWdodGluZy5yZ2IrPWNsYW1wKGRpcmVjdGlvbmFsKnVfbGlnaHRjb2xvcixtaXgodmVjMygwLjApLHZlYzMoMC4zKSwxLjAtdV9saWdodGNvbG9yKSx2ZWMzKDEuMCkpO3ZfbGlnaHRpbmcqPXVfb3BhY2l0eTt9XCIpLGhpbGxzaGFkZVByZXBhcmU6bWUoXCIjaWZkZWYgR0xfRVNcXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxuI2VuZGlmXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgdl9wb3M7dW5pZm9ybSB2ZWMyIHVfZGltZW5zaW9uO3VuaWZvcm0gZmxvYXQgdV96b29tO3VuaWZvcm0gdmVjNCB1X3VucGFjaztmbG9hdCBnZXRFbGV2YXRpb24odmVjMiBjb29yZCxmbG9hdCBiaWFzKSB7dmVjNCBkYXRhPXRleHR1cmUyRCh1X2ltYWdlLGNvb3JkKSoyNTUuMDtkYXRhLmE9LTEuMDtyZXR1cm4gZG90KGRhdGEsdV91bnBhY2spLzQuMDt9dm9pZCBtYWluKCkge3ZlYzIgZXBzaWxvbj0xLjAvdV9kaW1lbnNpb247ZmxvYXQgYT1nZXRFbGV2YXRpb24odl9wb3MrdmVjMigtZXBzaWxvbi54LC1lcHNpbG9uLnkpLDAuMCk7ZmxvYXQgYj1nZXRFbGV2YXRpb24odl9wb3MrdmVjMigwLC1lcHNpbG9uLnkpLDAuMCk7ZmxvYXQgYz1nZXRFbGV2YXRpb24odl9wb3MrdmVjMihlcHNpbG9uLngsLWVwc2lsb24ueSksMC4wKTtmbG9hdCBkPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKC1lcHNpbG9uLngsMCksMC4wKTtmbG9hdCBlPWdldEVsZXZhdGlvbih2X3BvcywwLjApO2Zsb2F0IGY9Z2V0RWxldmF0aW9uKHZfcG9zK3ZlYzIoZXBzaWxvbi54LDApLDAuMCk7ZmxvYXQgZz1nZXRFbGV2YXRpb24odl9wb3MrdmVjMigtZXBzaWxvbi54LGVwc2lsb24ueSksMC4wKTtmbG9hdCBoPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKDAsZXBzaWxvbi55KSwwLjApO2Zsb2F0IGk9Z2V0RWxldmF0aW9uKHZfcG9zK3ZlYzIoZXBzaWxvbi54LGVwc2lsb24ueSksMC4wKTtmbG9hdCBleGFnZ2VyYXRpb25GYWN0b3I9dV96b29tIDwgMi4wID8gMC40IDogdV96b29tIDwgNC41ID8gMC4zNSA6IDAuMztmbG9hdCBleGFnZ2VyYXRpb249dV96b29tIDwgMTUuMCA/ICh1X3pvb20tMTUuMCkqZXhhZ2dlcmF0aW9uRmFjdG9yIDogMC4wO3ZlYzIgZGVyaXY9dmVjMigoYytmK2YraSktKGErZCtkK2cpLChnK2graCtpKS0oYStiK2IrYykpL3BvdygyLjAsZXhhZ2dlcmF0aW9uKygxOS4yNTYyLXVfem9vbSkpO2dsX0ZyYWdDb2xvcj1jbGFtcCh2ZWM0KGRlcml2LngvMi4wKzAuNSxkZXJpdi55LzIuMCswLjUsMS4wLDEuMCksMC4wLDEuMCk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X2RpbWVuc2lvbjthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjMiBhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvczt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2hpZ2hwIHZlYzIgZXBzaWxvbj0xLjAvdV9kaW1lbnNpb247ZmxvYXQgc2NhbGU9KHVfZGltZW5zaW9uLngtMi4wKS91X2RpbWVuc2lvbi54O3ZfcG9zPShhX3RleHR1cmVfcG9zLzgxOTIuMCkqc2NhbGUrZXBzaWxvbjt9XCIpLGhpbGxzaGFkZTptZShcInVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfcG9zO3VuaWZvcm0gdmVjMiB1X2xhdHJhbmdlO3VuaWZvcm0gdmVjMiB1X2xpZ2h0O3VuaWZvcm0gdmVjNCB1X3NoYWRvdzt1bmlmb3JtIHZlYzQgdV9oaWdobGlnaHQ7dW5pZm9ybSB2ZWM0IHVfYWNjZW50O1xcbiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTNcXG52b2lkIG1haW4oKSB7dmVjNCBwaXhlbD10ZXh0dXJlMkQodV9pbWFnZSx2X3Bvcyk7dmVjMiBkZXJpdj0oKHBpeGVsLnJnKjIuMCktMS4wKTtmbG9hdCBzY2FsZUZhY3Rvcj1jb3MocmFkaWFucygodV9sYXRyYW5nZVswXS11X2xhdHJhbmdlWzFdKSooMS4wLXZfcG9zLnkpK3VfbGF0cmFuZ2VbMV0pKTtmbG9hdCBzbG9wZT1hdGFuKDEuMjUqbGVuZ3RoKGRlcml2KS9zY2FsZUZhY3Rvcik7ZmxvYXQgYXNwZWN0PWRlcml2LnggIT0wLjAgPyBhdGFuKGRlcml2LnksLWRlcml2LngpIDogUEkvMi4wKihkZXJpdi55ID4gMC4wID8gMS4wIDotMS4wKTtmbG9hdCBpbnRlbnNpdHk9dV9saWdodC54O2Zsb2F0IGF6aW11dGg9dV9saWdodC55K1BJO2Zsb2F0IGJhc2U9MS44NzUtaW50ZW5zaXR5KjEuNzU7ZmxvYXQgbWF4VmFsdWU9MC41KlBJO2Zsb2F0IHNjYWxlZFNsb3BlPWludGVuc2l0eSAhPTAuNSA/ICgocG93KGJhc2Usc2xvcGUpLTEuMCkvKHBvdyhiYXNlLG1heFZhbHVlKS0xLjApKSptYXhWYWx1ZSA6IHNsb3BlO2Zsb2F0IGFjY2VudD1jb3Moc2NhbGVkU2xvcGUpO3ZlYzQgYWNjZW50X2NvbG9yPSgxLjAtYWNjZW50KSp1X2FjY2VudCpjbGFtcChpbnRlbnNpdHkqMi4wLDAuMCwxLjApO2Zsb2F0IHNoYWRlPWFicyhtb2QoKGFzcGVjdCthemltdXRoKS9QSSswLjUsMi4wKS0xLjApO3ZlYzQgc2hhZGVfY29sb3I9bWl4KHVfc2hhZG93LHVfaGlnaGxpZ2h0LHNoYWRlKSpzaW4oc2NhbGVkU2xvcGUpKmNsYW1wKGludGVuc2l0eSoyLjAsMC4wLDEuMCk7Z2xfRnJhZ0NvbG9yPWFjY2VudF9jb2xvciooMS4wLXNoYWRlX2NvbG9yLmEpK3NoYWRlX2NvbG9yO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIixcInVuaWZvcm0gbWF0NCB1X21hdHJpeDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjMiBhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvczt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZfcG9zPWFfdGV4dHVyZV9wb3MvODE5Mi4wO31cIiksbGluZTptZShcInVuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5mbG9hdCBkaXN0PWxlbmd0aCh2X25vcm1hbCkqdl93aWR0aDIucztmbG9hdCBibHVyMj0oYmx1cisxLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8pKnZfZ2FtbWFfc2NhbGU7ZmxvYXQgYWxwaGE9Y2xhbXAobWluKGRpc3QtKHZfd2lkdGgyLnQtYmx1cjIpLHZfd2lkdGgyLnMtZGlzdCkvYmx1cjIsMC4wLDEuMCk7Z2xfRnJhZ0NvbG9yPWNvbG9yKihhbHBoYSpvcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJcXG4jZGVmaW5lIHNjYWxlIDAuMDE1ODczMDE2XFxuYXR0cmlidXRlIHZlYzIgYV9wb3Nfbm9ybWFsO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfcmF0aW87dW5pZm9ybSB2ZWMyIHVfdW5pdHNfdG9fcGl4ZWxzO3VuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt2YXJ5aW5nIHZlYzIgdl9ub3JtYWw7dmFyeWluZyB2ZWMyIHZfd2lkdGgyO3ZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTt2YXJ5aW5nIGhpZ2hwIGZsb2F0IHZfbGluZXNvZmFyO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHdpZHRoXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IGdhcHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IHdpZHRoXFxuZmxvYXQgQU5USUFMSUFTSU5HPTEuMC91X2RldmljZV9waXhlbF9yYXRpby8yLjA7dmVjMiBhX2V4dHJ1ZGU9YV9kYXRhLnh5LTEyOC4wO2Zsb2F0IGFfZGlyZWN0aW9uPW1vZChhX2RhdGEueiw0LjApLTEuMDt2X2xpbmVzb2Zhcj0oZmxvb3IoYV9kYXRhLnovNC4wKSthX2RhdGEudyo2NC4wKSoyLjA7dmVjMiBwb3M9Zmxvb3IoYV9wb3Nfbm9ybWFsKjAuNSk7bWVkaXVtcCB2ZWMyIG5vcm1hbD1hX3Bvc19ub3JtYWwtMi4wKnBvcztub3JtYWwueT1ub3JtYWwueSoyLjAtMS4wO3Zfbm9ybWFsPW5vcm1hbDtnYXB3aWR0aD1nYXB3aWR0aC8yLjA7ZmxvYXQgaGFsZndpZHRoPXdpZHRoLzIuMDtvZmZzZXQ9LTEuMCpvZmZzZXQ7ZmxvYXQgaW5zZXQ9Z2Fwd2lkdGgrKGdhcHdpZHRoID4gMC4wID8gQU5USUFMSUFTSU5HIDogMC4wKTtmbG9hdCBvdXRzZXQ9Z2Fwd2lkdGgraGFsZndpZHRoKihnYXB3aWR0aCA+IDAuMCA/IDIuMCA6IDEuMCkrKGhhbGZ3aWR0aD09MC4wID8gMC4wIDogQU5USUFMSUFTSU5HKTttZWRpdW1wIHZlYzIgZGlzdD1vdXRzZXQqYV9leHRydWRlKnNjYWxlO21lZGl1bXAgZmxvYXQgdT0wLjUqYV9kaXJlY3Rpb247bWVkaXVtcCBmbG9hdCB0PTEuMC1hYnModSk7bWVkaXVtcCB2ZWMyIG9mZnNldDI9b2Zmc2V0KmFfZXh0cnVkZSpzY2FsZSpub3JtYWwueSptYXQyKHQsLXUsdSx0KTt2ZWM0IHByb2plY3RlZF9leHRydWRlPXVfbWF0cml4KnZlYzQoZGlzdC91X3JhdGlvLDAuMCwwLjApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQocG9zK29mZnNldDIvdV9yYXRpbywwLjAsMS4wKStwcm9qZWN0ZWRfZXh0cnVkZTtcXG4jaWZkZWYgVEVSUkFJTjNEXFxudl9nYW1tYV9zY2FsZT0xLjA7XFxuI2Vsc2VcXG5mbG9hdCBleHRydWRlX2xlbmd0aF93aXRob3V0X3BlcnNwZWN0aXZlPWxlbmd0aChkaXN0KTtmbG9hdCBleHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlPWxlbmd0aChwcm9qZWN0ZWRfZXh0cnVkZS54eS9nbF9Qb3NpdGlvbi53KnVfdW5pdHNfdG9fcGl4ZWxzKTt2X2dhbW1hX3NjYWxlPWV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmUvZXh0cnVkZV9sZW5ndGhfd2l0aF9wZXJzcGVjdGl2ZTtcXG4jZW5kaWZcXG52X3dpZHRoMj12ZWMyKG91dHNldCxpbnNldCk7fVwiKSxsaW5lR3JhZGllbnQ6bWUoXCJ1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTt2YXJ5aW5nIGhpZ2hwIHZlYzIgdl91djtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmZsb2F0IGRpc3Q9bGVuZ3RoKHZfbm9ybWFsKSp2X3dpZHRoMi5zO2Zsb2F0IGJsdXIyPShibHVyKzEuMC91X2RldmljZV9waXhlbF9yYXRpbykqdl9nYW1tYV9zY2FsZTtmbG9hdCBhbHBoYT1jbGFtcChtaW4oZGlzdC0odl93aWR0aDIudC1ibHVyMiksdl93aWR0aDIucy1kaXN0KS9ibHVyMiwwLjAsMS4wKTt2ZWM0IGNvbG9yPXRleHR1cmUyRCh1X2ltYWdlLHZfdXYpO2dsX0ZyYWdDb2xvcj1jb2xvciooYWxwaGEqb3BhY2l0eSk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLFwiXFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxcbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zX25vcm1hbDthdHRyaWJ1dGUgdmVjNCBhX2RhdGE7YXR0cmlidXRlIGZsb2F0IGFfdXZfeDthdHRyaWJ1dGUgZmxvYXQgYV9zcGxpdF9pbmRleDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfcmF0aW87dW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3VuaWZvcm0gdmVjMiB1X3VuaXRzX3RvX3BpeGVsczt1bmlmb3JtIGZsb2F0IHVfaW1hZ2VfaGVpZ2h0O3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO3ZhcnlpbmcgaGlnaHAgdmVjMiB2X3V2O1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHdpZHRoXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9mZnNldFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG5mbG9hdCBBTlRJQUxJQVNJTkc9MS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvLzIuMDt2ZWMyIGFfZXh0cnVkZT1hX2RhdGEueHktMTI4LjA7ZmxvYXQgYV9kaXJlY3Rpb249bW9kKGFfZGF0YS56LDQuMCktMS4wO2hpZ2hwIGZsb2F0IHRleGVsX2hlaWdodD0xLjAvdV9pbWFnZV9oZWlnaHQ7aGlnaHAgZmxvYXQgaGFsZl90ZXhlbF9oZWlnaHQ9MC41KnRleGVsX2hlaWdodDt2X3V2PXZlYzIoYV91dl94LGFfc3BsaXRfaW5kZXgqdGV4ZWxfaGVpZ2h0LWhhbGZfdGV4ZWxfaGVpZ2h0KTt2ZWMyIHBvcz1mbG9vcihhX3Bvc19ub3JtYWwqMC41KTttZWRpdW1wIHZlYzIgbm9ybWFsPWFfcG9zX25vcm1hbC0yLjAqcG9zO25vcm1hbC55PW5vcm1hbC55KjIuMC0xLjA7dl9ub3JtYWw9bm9ybWFsO2dhcHdpZHRoPWdhcHdpZHRoLzIuMDtmbG9hdCBoYWxmd2lkdGg9d2lkdGgvMi4wO29mZnNldD0tMS4wKm9mZnNldDtmbG9hdCBpbnNldD1nYXB3aWR0aCsoZ2Fwd2lkdGggPiAwLjAgPyBBTlRJQUxJQVNJTkcgOiAwLjApO2Zsb2F0IG91dHNldD1nYXB3aWR0aCtoYWxmd2lkdGgqKGdhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSsoaGFsZndpZHRoPT0wLjAgPyAwLjAgOiBBTlRJQUxJQVNJTkcpO21lZGl1bXAgdmVjMiBkaXN0PW91dHNldCphX2V4dHJ1ZGUqc2NhbGU7bWVkaXVtcCBmbG9hdCB1PTAuNSphX2RpcmVjdGlvbjttZWRpdW1wIGZsb2F0IHQ9MS4wLWFicyh1KTttZWRpdW1wIHZlYzIgb2Zmc2V0Mj1vZmZzZXQqYV9leHRydWRlKnNjYWxlKm5vcm1hbC55Km1hdDIodCwtdSx1LHQpO3ZlYzQgcHJvamVjdGVkX2V4dHJ1ZGU9dV9tYXRyaXgqdmVjNChkaXN0L3VfcmF0aW8sMC4wLDAuMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChwb3Mrb2Zmc2V0Mi91X3JhdGlvLDAuMCwxLjApK3Byb2plY3RlZF9leHRydWRlO1xcbiNpZmRlZiBURVJSQUlOM0RcXG52X2dhbW1hX3NjYWxlPTEuMDtcXG4jZWxzZVxcbmZsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmU9bGVuZ3RoKGRpc3QpO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU9bGVuZ3RoKHByb2plY3RlZF9leHRydWRlLnh5L2dsX1Bvc2l0aW9uLncqdV91bml0c190b19waXhlbHMpO3ZfZ2FtbWFfc2NhbGU9ZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZS9leHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlO1xcbiNlbmRpZlxcbnZfd2lkdGgyPXZlYzIob3V0c2V0LGluc2V0KTt9XCIpLGxpbmVQYXR0ZXJuOm1lKFwiI2lmZGVmIEdMX0VTXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbiNlbmRpZlxcbnVuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3VuaWZvcm0gZmxvYXQgdV9mYWRlO3VuaWZvcm0gbWVkaXVtcCB2ZWMzIHVfc2NhbGU7dW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgdl9ub3JtYWw7dmFyeWluZyB2ZWMyIHZfd2lkdGgyO3ZhcnlpbmcgZmxvYXQgdl9saW5lc29mYXI7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO3ZhcnlpbmcgZmxvYXQgdl93aWR0aDtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dztmbG9hdCB0aWxlWm9vbVJhdGlvPXVfc2NhbGUueDtmbG9hdCBmcm9tU2NhbGU9dV9zY2FsZS55O2Zsb2F0IHRvU2NhbGU9dV9zY2FsZS56O3ZlYzIgZGlzcGxheV9zaXplX2E9KHBhdHRlcm5fYnJfYS1wYXR0ZXJuX3RsX2EpL3BpeGVsX3JhdGlvX2Zyb207dmVjMiBkaXNwbGF5X3NpemVfYj0ocGF0dGVybl9icl9iLXBhdHRlcm5fdGxfYikvcGl4ZWxfcmF0aW9fdG87dmVjMiBwYXR0ZXJuX3NpemVfYT12ZWMyKGRpc3BsYXlfc2l6ZV9hLngqZnJvbVNjYWxlL3RpbGVab29tUmF0aW8sZGlzcGxheV9zaXplX2EueSk7dmVjMiBwYXR0ZXJuX3NpemVfYj12ZWMyKGRpc3BsYXlfc2l6ZV9iLngqdG9TY2FsZS90aWxlWm9vbVJhdGlvLGRpc3BsYXlfc2l6ZV9iLnkpO2Zsb2F0IGFzcGVjdF9hPWRpc3BsYXlfc2l6ZV9hLnkvdl93aWR0aDtmbG9hdCBhc3BlY3RfYj1kaXNwbGF5X3NpemVfYi55L3Zfd2lkdGg7ZmxvYXQgZGlzdD1sZW5ndGgodl9ub3JtYWwpKnZfd2lkdGgyLnM7ZmxvYXQgYmx1cjI9KGJsdXIrMS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvKSp2X2dhbW1hX3NjYWxlO2Zsb2F0IGFscGhhPWNsYW1wKG1pbihkaXN0LSh2X3dpZHRoMi50LWJsdXIyKSx2X3dpZHRoMi5zLWRpc3QpL2JsdXIyLDAuMCwxLjApO2Zsb2F0IHhfYT1tb2Qodl9saW5lc29mYXIvcGF0dGVybl9zaXplX2EueCphc3BlY3RfYSwxLjApO2Zsb2F0IHhfYj1tb2Qodl9saW5lc29mYXIvcGF0dGVybl9zaXplX2IueCphc3BlY3RfYiwxLjApO2Zsb2F0IHk9MC41KnZfbm9ybWFsLnkrMC41O3ZlYzIgdGV4ZWxfc2l6ZT0xLjAvdV90ZXhzaXplO3ZlYzIgcG9zX2E9bWl4KHBhdHRlcm5fdGxfYSp0ZXhlbF9zaXplLXRleGVsX3NpemUscGF0dGVybl9icl9hKnRleGVsX3NpemUrdGV4ZWxfc2l6ZSx2ZWMyKHhfYSx5KSk7dmVjMiBwb3NfYj1taXgocGF0dGVybl90bF9iKnRleGVsX3NpemUtdGV4ZWxfc2l6ZSxwYXR0ZXJuX2JyX2IqdGV4ZWxfc2l6ZSt0ZXhlbF9zaXplLHZlYzIoeF9iLHkpKTt2ZWM0IGNvbG9yPW1peCh0ZXh0dXJlMkQodV9pbWFnZSxwb3NfYSksdGV4dHVyZTJEKHVfaW1hZ2UscG9zX2IpLHVfZmFkZSk7Z2xfRnJhZ0NvbG9yPWNvbG9yKmFscGhhKm9wYWNpdHk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLFwiXFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxcbiNkZWZpbmUgTElORV9ESVNUQU5DRV9TQ0FMRSAyLjBcXG5hdHRyaWJ1dGUgdmVjMiBhX3Bvc19ub3JtYWw7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV91bml0c190b19waXhlbHM7dW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfcmF0aW87dW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyBmbG9hdCB2X2xpbmVzb2Zhcjt2YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7dmFyeWluZyBmbG9hdCB2X3dpZHRoO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IGdhcHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGZsb29yd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IGdhcHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG5mbG9hdCBBTlRJQUxJQVNJTkc9MS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvLzIuMDt2ZWMyIGFfZXh0cnVkZT1hX2RhdGEueHktMTI4LjA7ZmxvYXQgYV9kaXJlY3Rpb249bW9kKGFfZGF0YS56LDQuMCktMS4wO2Zsb2F0IGFfbGluZXNvZmFyPShmbG9vcihhX2RhdGEuei80LjApK2FfZGF0YS53KjY0LjApKkxJTkVfRElTVEFOQ0VfU0NBTEU7dmVjMiBwb3M9Zmxvb3IoYV9wb3Nfbm9ybWFsKjAuNSk7bWVkaXVtcCB2ZWMyIG5vcm1hbD1hX3Bvc19ub3JtYWwtMi4wKnBvcztub3JtYWwueT1ub3JtYWwueSoyLjAtMS4wO3Zfbm9ybWFsPW5vcm1hbDtnYXB3aWR0aD1nYXB3aWR0aC8yLjA7ZmxvYXQgaGFsZndpZHRoPXdpZHRoLzIuMDtvZmZzZXQ9LTEuMCpvZmZzZXQ7ZmxvYXQgaW5zZXQ9Z2Fwd2lkdGgrKGdhcHdpZHRoID4gMC4wID8gQU5USUFMSUFTSU5HIDogMC4wKTtmbG9hdCBvdXRzZXQ9Z2Fwd2lkdGgraGFsZndpZHRoKihnYXB3aWR0aCA+IDAuMCA/IDIuMCA6IDEuMCkrKGhhbGZ3aWR0aD09MC4wID8gMC4wIDogQU5USUFMSUFTSU5HKTttZWRpdW1wIHZlYzIgZGlzdD1vdXRzZXQqYV9leHRydWRlKnNjYWxlO21lZGl1bXAgZmxvYXQgdT0wLjUqYV9kaXJlY3Rpb247bWVkaXVtcCBmbG9hdCB0PTEuMC1hYnModSk7bWVkaXVtcCB2ZWMyIG9mZnNldDI9b2Zmc2V0KmFfZXh0cnVkZSpzY2FsZSpub3JtYWwueSptYXQyKHQsLXUsdSx0KTt2ZWM0IHByb2plY3RlZF9leHRydWRlPXVfbWF0cml4KnZlYzQoZGlzdC91X3JhdGlvLDAuMCwwLjApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQocG9zK29mZnNldDIvdV9yYXRpbywwLjAsMS4wKStwcm9qZWN0ZWRfZXh0cnVkZTtcXG4jaWZkZWYgVEVSUkFJTjNEXFxudl9nYW1tYV9zY2FsZT0xLjA7XFxuI2Vsc2VcXG5mbG9hdCBleHRydWRlX2xlbmd0aF93aXRob3V0X3BlcnNwZWN0aXZlPWxlbmd0aChkaXN0KTtmbG9hdCBleHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlPWxlbmd0aChwcm9qZWN0ZWRfZXh0cnVkZS54eS9nbF9Qb3NpdGlvbi53KnVfdW5pdHNfdG9fcGl4ZWxzKTt2X2dhbW1hX3NjYWxlPWV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmUvZXh0cnVkZV9sZW5ndGhfd2l0aF9wZXJzcGVjdGl2ZTtcXG4jZW5kaWZcXG52X2xpbmVzb2Zhcj1hX2xpbmVzb2Zhcjt2X3dpZHRoMj12ZWMyKG91dHNldCxpbnNldCk7dl93aWR0aD1mbG9vcndpZHRoO31cIiksbGluZVNERjptZShcInVuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3VuaWZvcm0gZmxvYXQgdV9zZGZnYW1tYTt1bmlmb3JtIGZsb2F0IHVfbWl4O3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyB2ZWMyIHZfdGV4X2E7dmFyeWluZyB2ZWMyIHZfdGV4X2I7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbmZsb2F0IGRpc3Q9bGVuZ3RoKHZfbm9ybWFsKSp2X3dpZHRoMi5zO2Zsb2F0IGJsdXIyPShibHVyKzEuMC91X2RldmljZV9waXhlbF9yYXRpbykqdl9nYW1tYV9zY2FsZTtmbG9hdCBhbHBoYT1jbGFtcChtaW4oZGlzdC0odl93aWR0aDIudC1ibHVyMiksdl93aWR0aDIucy1kaXN0KS9ibHVyMiwwLjAsMS4wKTtmbG9hdCBzZGZkaXN0X2E9dGV4dHVyZTJEKHVfaW1hZ2Usdl90ZXhfYSkuYTtmbG9hdCBzZGZkaXN0X2I9dGV4dHVyZTJEKHVfaW1hZ2Usdl90ZXhfYikuYTtmbG9hdCBzZGZkaXN0PW1peChzZGZkaXN0X2Esc2RmZGlzdF9iLHVfbWl4KTthbHBoYSo9c21vb3Roc3RlcCgwLjUtdV9zZGZnYW1tYS9mbG9vcndpZHRoLDAuNSt1X3NkZmdhbW1hL2Zsb29yd2lkdGgsc2RmZGlzdCk7Z2xfRnJhZ0NvbG9yPWNvbG9yKihhbHBoYSpvcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJcXG4jZGVmaW5lIHNjYWxlIDAuMDE1ODczMDE2XFxuI2RlZmluZSBMSU5FX0RJU1RBTkNFX1NDQUxFIDIuMFxcbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zX25vcm1hbDthdHRyaWJ1dGUgdmVjNCBhX2RhdGE7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X3JhdGlvO3VuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuc2NhbGVfYTt1bmlmb3JtIGZsb2F0IHVfdGV4X3lfYTt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuc2NhbGVfYjt1bmlmb3JtIGZsb2F0IHVfdGV4X3lfYjt1bmlmb3JtIHZlYzIgdV91bml0c190b19waXhlbHM7dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgdmVjMiB2X3dpZHRoMjt2YXJ5aW5nIHZlYzIgdl90ZXhfYTt2YXJ5aW5nIHZlYzIgdl90ZXhfYjt2YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbmZsb2F0IEFOVElBTElBU0lORz0xLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8vMi4wO3ZlYzIgYV9leHRydWRlPWFfZGF0YS54eS0xMjguMDtmbG9hdCBhX2RpcmVjdGlvbj1tb2QoYV9kYXRhLnosNC4wKS0xLjA7ZmxvYXQgYV9saW5lc29mYXI9KGZsb29yKGFfZGF0YS56LzQuMCkrYV9kYXRhLncqNjQuMCkqTElORV9ESVNUQU5DRV9TQ0FMRTt2ZWMyIHBvcz1mbG9vcihhX3Bvc19ub3JtYWwqMC41KTttZWRpdW1wIHZlYzIgbm9ybWFsPWFfcG9zX25vcm1hbC0yLjAqcG9zO25vcm1hbC55PW5vcm1hbC55KjIuMC0xLjA7dl9ub3JtYWw9bm9ybWFsO2dhcHdpZHRoPWdhcHdpZHRoLzIuMDtmbG9hdCBoYWxmd2lkdGg9d2lkdGgvMi4wO29mZnNldD0tMS4wKm9mZnNldDtmbG9hdCBpbnNldD1nYXB3aWR0aCsoZ2Fwd2lkdGggPiAwLjAgPyBBTlRJQUxJQVNJTkcgOiAwLjApO2Zsb2F0IG91dHNldD1nYXB3aWR0aCtoYWxmd2lkdGgqKGdhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSsoaGFsZndpZHRoPT0wLjAgPyAwLjAgOiBBTlRJQUxJQVNJTkcpO21lZGl1bXAgdmVjMiBkaXN0PW91dHNldCphX2V4dHJ1ZGUqc2NhbGU7bWVkaXVtcCBmbG9hdCB1PTAuNSphX2RpcmVjdGlvbjttZWRpdW1wIGZsb2F0IHQ9MS4wLWFicyh1KTttZWRpdW1wIHZlYzIgb2Zmc2V0Mj1vZmZzZXQqYV9leHRydWRlKnNjYWxlKm5vcm1hbC55Km1hdDIodCwtdSx1LHQpO3ZlYzQgcHJvamVjdGVkX2V4dHJ1ZGU9dV9tYXRyaXgqdmVjNChkaXN0L3VfcmF0aW8sMC4wLDAuMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChwb3Mrb2Zmc2V0Mi91X3JhdGlvLDAuMCwxLjApK3Byb2plY3RlZF9leHRydWRlO1xcbiNpZmRlZiBURVJSQUlOM0RcXG52X2dhbW1hX3NjYWxlPTEuMDtcXG4jZWxzZVxcbmZsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmU9bGVuZ3RoKGRpc3QpO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU9bGVuZ3RoKHByb2plY3RlZF9leHRydWRlLnh5L2dsX1Bvc2l0aW9uLncqdV91bml0c190b19waXhlbHMpO3ZfZ2FtbWFfc2NhbGU9ZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZS9leHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlO1xcbiNlbmRpZlxcbnZfdGV4X2E9dmVjMihhX2xpbmVzb2Zhcip1X3BhdHRlcm5zY2FsZV9hLngvZmxvb3J3aWR0aCxub3JtYWwueSp1X3BhdHRlcm5zY2FsZV9hLnkrdV90ZXhfeV9hKTt2X3RleF9iPXZlYzIoYV9saW5lc29mYXIqdV9wYXR0ZXJuc2NhbGVfYi54L2Zsb29yd2lkdGgsbm9ybWFsLnkqdV9wYXR0ZXJuc2NhbGVfYi55K3VfdGV4X3lfYik7dl93aWR0aDI9dmVjMihvdXRzZXQsaW5zZXQpO31cIikscmFzdGVyOm1lKFwidW5pZm9ybSBmbG9hdCB1X2ZhZGVfdDt1bmlmb3JtIGZsb2F0IHVfb3BhY2l0eTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlMDt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlMTt2YXJ5aW5nIHZlYzIgdl9wb3MwO3ZhcnlpbmcgdmVjMiB2X3BvczE7dW5pZm9ybSBmbG9hdCB1X2JyaWdodG5lc3NfbG93O3VuaWZvcm0gZmxvYXQgdV9icmlnaHRuZXNzX2hpZ2g7dW5pZm9ybSBmbG9hdCB1X3NhdHVyYXRpb25fZmFjdG9yO3VuaWZvcm0gZmxvYXQgdV9jb250cmFzdF9mYWN0b3I7dW5pZm9ybSB2ZWMzIHVfc3Bpbl93ZWlnaHRzO3ZvaWQgbWFpbigpIHt2ZWM0IGNvbG9yMD10ZXh0dXJlMkQodV9pbWFnZTAsdl9wb3MwKTt2ZWM0IGNvbG9yMT10ZXh0dXJlMkQodV9pbWFnZTEsdl9wb3MxKTtpZiAoY29sb3IwLmEgPiAwLjApIHtjb2xvcjAucmdiPWNvbG9yMC5yZ2IvY29sb3IwLmE7fWlmIChjb2xvcjEuYSA+IDAuMCkge2NvbG9yMS5yZ2I9Y29sb3IxLnJnYi9jb2xvcjEuYTt9dmVjNCBjb2xvcj1taXgoY29sb3IwLGNvbG9yMSx1X2ZhZGVfdCk7Y29sb3IuYSo9dV9vcGFjaXR5O3ZlYzMgcmdiPWNvbG9yLnJnYjtyZ2I9dmVjMyhkb3QocmdiLHVfc3Bpbl93ZWlnaHRzLnh5eiksZG90KHJnYix1X3NwaW5fd2VpZ2h0cy56eHkpLGRvdChyZ2IsdV9zcGluX3dlaWdodHMueXp4KSk7ZmxvYXQgYXZlcmFnZT0oY29sb3Iucitjb2xvci5nK2NvbG9yLmIpLzMuMDtyZ2IrPShhdmVyYWdlLXJnYikqdV9zYXR1cmF0aW9uX2ZhY3RvcjtyZ2I9KHJnYi0wLjUpKnVfY29udHJhc3RfZmFjdG9yKzAuNTt2ZWMzIHVfaGlnaF92ZWM9dmVjMyh1X2JyaWdodG5lc3NfbG93LHVfYnJpZ2h0bmVzc19sb3csdV9icmlnaHRuZXNzX2xvdyk7dmVjMyB1X2xvd192ZWM9dmVjMyh1X2JyaWdodG5lc3NfaGlnaCx1X2JyaWdodG5lc3NfaGlnaCx1X2JyaWdodG5lc3NfaGlnaCk7Z2xfRnJhZ0NvbG9yPXZlYzQobWl4KHVfaGlnaF92ZWMsdV9sb3dfdmVjLHJnYikqY29sb3IuYSxjb2xvci5hKTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfdGxfcGFyZW50O3VuaWZvcm0gZmxvYXQgdV9zY2FsZV9wYXJlbnQ7dW5pZm9ybSBmbG9hdCB1X2J1ZmZlcl9zY2FsZTthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjMiBhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiB2X3BvczA7dmFyeWluZyB2ZWMyIHZfcG9zMTt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZfcG9zMD0oKChhX3RleHR1cmVfcG9zLzgxOTIuMCktMC41KS91X2J1ZmZlcl9zY2FsZSApKzAuNTt2X3BvczE9KHZfcG9zMCp1X3NjYWxlX3BhcmVudCkrdV90bF9wYXJlbnQ7fVwiKSxzeW1ib2xJY29uOm1lKFwidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO3ZhcnlpbmcgdmVjMiB2X3RleDt2YXJ5aW5nIGZsb2F0IHZfZmFkZV9vcGFjaXR5O1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmxvd3AgZmxvYXQgYWxwaGE9b3BhY2l0eSp2X2ZhZGVfb3BhY2l0eTtnbF9GcmFnQ29sb3I9dGV4dHVyZTJEKHVfdGV4dHVyZSx2X3RleCkqYWxwaGE7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLFwiYXR0cmlidXRlIHZlYzQgYV9wb3Nfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgdmVjNCBhX3BpeGVsb2Zmc2V0O2F0dHJpYnV0ZSB2ZWMzIGFfcHJvamVjdGVkX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9mYWRlX29wYWNpdHk7dW5pZm9ybSBib29sIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZV90O3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9zaXplO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9waXRjaDt1bmlmb3JtIGJvb2wgdV9yb3RhdGVfc3ltYm9sO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9hc3BlY3RfcmF0aW87dW5pZm9ybSBmbG9hdCB1X2ZhZGVfY2hhbmdlO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9sYWJlbF9wbGFuZV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfY29vcmRfbWF0cml4O3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGJvb2wgdV9pc19hbG9uZ19saW5lO3VuaWZvcm0gYm9vbCB1X2lzX3ZhcmlhYmxlX2FuY2hvcjt1bmlmb3JtIHZlYzIgdV90cmFuc2xhdGlvbjt1bmlmb3JtIGZsb2F0IHVfcGl0Y2hlZF9zY2FsZTt2YXJ5aW5nIHZlYzIgdl90ZXg7dmFyeWluZyBmbG9hdCB2X2ZhZGVfb3BhY2l0eTt2ZWM0IHByb2plY3RUaWxlV2l0aEVsZXZhdGlvbih2ZWMyIHBvc0luVGlsZSxmbG9hdCBlbGV2YXRpb24pIHtyZXR1cm4gdV9tYXRyaXgqdmVjNChwb3NJblRpbGUsZWxldmF0aW9uLDEuMCk7fVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZlYzIgYV9wb3M9YV9wb3Nfb2Zmc2V0Lnh5O3ZlYzIgYV9vZmZzZXQ9YV9wb3Nfb2Zmc2V0Lnp3O3ZlYzIgYV90ZXg9YV9kYXRhLnh5O3ZlYzIgYV9zaXplPWFfZGF0YS56dztmbG9hdCBhX3NpemVfbWluPWZsb29yKGFfc2l6ZVswXSowLjUpO3ZlYzIgYV9weG9mZnNldD1hX3BpeGVsb2Zmc2V0Lnh5O3ZlYzIgYV9taW5Gb250U2NhbGU9YV9waXhlbG9mZnNldC56dy8yNTYuMDtmbG9hdCBlbGU9Z2V0X2VsZXZhdGlvbihhX3Bvcyk7aGlnaHAgZmxvYXQgc2VnbWVudF9hbmdsZT0tYV9wcm9qZWN0ZWRfcG9zWzJdO2Zsb2F0IHNpemU7aWYgKCF1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtzaXplPW1peChhX3NpemVfbWluLGFfc2l6ZVsxXSx1X3NpemVfdCkvMTI4LjA7fSBlbHNlIGlmICh1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtzaXplPWFfc2l6ZV9taW4vMTI4LjA7fSBlbHNlIHtzaXplPXVfc2l6ZTt9dmVjMiB0cmFuc2xhdGVkX2FfcG9zPWFfcG9zK3VfdHJhbnNsYXRpb247dmVjNCBwcm9qZWN0ZWRQb2ludD1wcm9qZWN0VGlsZVdpdGhFbGV2YXRpb24odHJhbnNsYXRlZF9hX3BvcyxlbGUpO2hpZ2hwIGZsb2F0IGNhbWVyYV90b19hbmNob3JfZGlzdGFuY2U9cHJvamVjdGVkUG9pbnQudztoaWdocCBmbG9hdCBkaXN0YW5jZV9yYXRpbz11X3BpdGNoX3dpdGhfbWFwID9cXG5jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlL3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSA6XFxudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlL2NhbWVyYV90b19hbmNob3JfZGlzdGFuY2U7aGlnaHAgZmxvYXQgcGVyc3BlY3RpdmVfcmF0aW89Y2xhbXAoMC41KzAuNSpkaXN0YW5jZV9yYXRpbywwLjAsNC4wKTtzaXplKj1wZXJzcGVjdGl2ZV9yYXRpbztmbG9hdCBmb250U2NhbGU9dV9pc190ZXh0ID8gc2l6ZS8yNC4wIDogc2l6ZTtoaWdocCBmbG9hdCBzeW1ib2xfcm90YXRpb249MC4wO2lmICh1X3JvdGF0ZV9zeW1ib2wpIHt2ZWM0IG9mZnNldFByb2plY3RlZFBvaW50PXByb2plY3RUaWxlV2l0aEVsZXZhdGlvbih0cmFuc2xhdGVkX2FfcG9zK3ZlYzIoMSwwKSxlbGUpO3ZlYzIgYT1wcm9qZWN0ZWRQb2ludC54eS9wcm9qZWN0ZWRQb2ludC53O3ZlYzIgYj1vZmZzZXRQcm9qZWN0ZWRQb2ludC54eS9vZmZzZXRQcm9qZWN0ZWRQb2ludC53O3N5bWJvbF9yb3RhdGlvbj1hdGFuKChiLnktYS55KS91X2FzcGVjdF9yYXRpbyxiLngtYS54KTt9aGlnaHAgZmxvYXQgYW5nbGVfc2luPXNpbihzZWdtZW50X2FuZ2xlK3N5bWJvbF9yb3RhdGlvbik7aGlnaHAgZmxvYXQgYW5nbGVfY29zPWNvcyhzZWdtZW50X2FuZ2xlK3N5bWJvbF9yb3RhdGlvbik7bWF0MiByb3RhdGlvbl9tYXRyaXg9bWF0MihhbmdsZV9jb3MsLTEuMCphbmdsZV9zaW4sYW5nbGVfc2luLGFuZ2xlX2Nvcyk7dmVjNCBwcm9qZWN0ZWRfcG9zO2lmICh1X2lzX2Fsb25nX2xpbmUgfHwgdV9pc192YXJpYWJsZV9hbmNob3IpIHtwcm9qZWN0ZWRfcG9zPXZlYzQoYV9wcm9qZWN0ZWRfcG9zLnh5LGVsZSwxLjApO30gZWxzZSBpZiAodV9waXRjaF93aXRoX21hcCkge3Byb2plY3RlZF9wb3M9dV9sYWJlbF9wbGFuZV9tYXRyaXgqdmVjNChhX3Byb2plY3RlZF9wb3MueHkrdV90cmFuc2xhdGlvbixlbGUsMS4wKTt9IGVsc2Uge3Byb2plY3RlZF9wb3M9dV9sYWJlbF9wbGFuZV9tYXRyaXgqcHJvamVjdFRpbGVXaXRoRWxldmF0aW9uKGFfcHJvamVjdGVkX3Bvcy54eSt1X3RyYW5zbGF0aW9uLGVsZSk7fWZsb2F0IHo9ZmxvYXQodV9waXRjaF93aXRoX21hcCkqcHJvamVjdGVkX3Bvcy56L3Byb2plY3RlZF9wb3MudztmbG9hdCBwcm9qZWN0aW9uU2NhbGluZz0xLjA7dmVjNCBmaW5hbFBvcz11X2Nvb3JkX21hdHJpeCp2ZWM0KHByb2plY3RlZF9wb3MueHkvcHJvamVjdGVkX3Bvcy53K3JvdGF0aW9uX21hdHJpeCooYV9vZmZzZXQvMzIuMCptYXgoYV9taW5Gb250U2NhbGUsZm9udFNjYWxlKSthX3B4b2Zmc2V0LzE2LjApKnByb2plY3Rpb25TY2FsaW5nLHosMS4wKTtpZih1X3BpdGNoX3dpdGhfbWFwKSB7ZmluYWxQb3M9cHJvamVjdFRpbGVXaXRoRWxldmF0aW9uKGZpbmFsUG9zLnh5LGZpbmFsUG9zLnopO31nbF9Qb3NpdGlvbj1maW5hbFBvczt2X3RleD1hX3RleC91X3RleHNpemU7dmVjMiBmYWRlX29wYWNpdHk9dW5wYWNrX29wYWNpdHkoYV9mYWRlX29wYWNpdHkpO2Zsb2F0IGZhZGVfY2hhbmdlPWZhZGVfb3BhY2l0eVsxXSA+IDAuNSA/IHVfZmFkZV9jaGFuZ2UgOi11X2ZhZGVfY2hhbmdlO2Zsb2F0IHZpc2liaWxpdHk9Y2FsY3VsYXRlX3Zpc2liaWxpdHkocHJvamVjdGVkUG9pbnQpO3ZfZmFkZV9vcGFjaXR5PW1heCgwLjAsbWluKHZpc2liaWxpdHksZmFkZV9vcGFjaXR5WzBdK2ZhZGVfY2hhbmdlKSk7fVwiKSxzeW1ib2xTREY6bWUoXCIjZGVmaW5lIFNERl9QWCA4LjBcXG51bmlmb3JtIGJvb2wgdV9pc19oYWxvO3VuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfZ2FtbWFfc2NhbGU7dW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dmFyeWluZyB2ZWMyIHZfZGF0YTA7dmFyeWluZyB2ZWMzIHZfZGF0YTE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxuZmxvYXQgRURHRV9HQU1NQT0wLjEwNS91X2RldmljZV9waXhlbF9yYXRpbzt2ZWMyIHRleD12X2RhdGEwLnh5O2Zsb2F0IGdhbW1hX3NjYWxlPXZfZGF0YTEueDtmbG9hdCBzaXplPXZfZGF0YTEueTtmbG9hdCBmYWRlX29wYWNpdHk9dl9kYXRhMVsyXTtmbG9hdCBmb250U2NhbGU9dV9pc190ZXh0ID8gc2l6ZS8yNC4wIDogc2l6ZTtsb3dwIHZlYzQgY29sb3I9ZmlsbF9jb2xvcjtoaWdocCBmbG9hdCBnYW1tYT1FREdFX0dBTU1BLyhmb250U2NhbGUqdV9nYW1tYV9zY2FsZSk7bG93cCBmbG9hdCBpbm5lcl9lZGdlPSgyNTYuMC02NC4wKS8yNTYuMDtpZiAodV9pc19oYWxvKSB7Y29sb3I9aGFsb19jb2xvcjtnYW1tYT0oaGFsb19ibHVyKjEuMTkvU0RGX1BYK0VER0VfR0FNTUEpLyhmb250U2NhbGUqdV9nYW1tYV9zY2FsZSk7aW5uZXJfZWRnZT1pbm5lcl9lZGdlK2dhbW1hKmdhbW1hX3NjYWxlO31sb3dwIGZsb2F0IGRpc3Q9dGV4dHVyZTJEKHVfdGV4dHVyZSx0ZXgpLmE7aGlnaHAgZmxvYXQgZ2FtbWFfc2NhbGVkPWdhbW1hKmdhbW1hX3NjYWxlO2hpZ2hwIGZsb2F0IGFscGhhPXNtb290aHN0ZXAoaW5uZXJfZWRnZS1nYW1tYV9zY2FsZWQsaW5uZXJfZWRnZStnYW1tYV9zY2FsZWQsZGlzdCk7aWYgKHVfaXNfaGFsbykge2xvd3AgZmxvYXQgaGFsb19lZGdlPSg2LjAtaGFsb193aWR0aC9mb250U2NhbGUpL1NERl9QWDthbHBoYT1taW4oc21vb3Roc3RlcChoYWxvX2VkZ2UtZ2FtbWFfc2NhbGVkLGhhbG9fZWRnZStnYW1tYV9zY2FsZWQsZGlzdCksMS4wLWFscGhhKTt9Z2xfRnJhZ0NvbG9yPWNvbG9yKihhbHBoYSpvcGFjaXR5KmZhZGVfb3BhY2l0eSk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLFwiYXR0cmlidXRlIHZlYzQgYV9wb3Nfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgdmVjNCBhX3BpeGVsb2Zmc2V0O2F0dHJpYnV0ZSB2ZWMzIGFfcHJvamVjdGVkX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9mYWRlX29wYWNpdHk7dW5pZm9ybSBib29sIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZV90O3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9zaXplO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9sYWJlbF9wbGFuZV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfY29vcmRfbWF0cml4O3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSBib29sIHVfaXNfYWxvbmdfbGluZTt1bmlmb3JtIGJvb2wgdV9pc192YXJpYWJsZV9hbmNob3I7dW5pZm9ybSBoaWdocCBmbG9hdCB1X3BpdGNoO3VuaWZvcm0gYm9vbCB1X3JvdGF0ZV9zeW1ib2w7dW5pZm9ybSBoaWdocCBmbG9hdCB1X2FzcGVjdF9yYXRpbzt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTt1bmlmb3JtIGZsb2F0IHVfZmFkZV9jaGFuZ2U7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIHZlYzIgdV90cmFuc2xhdGlvbjt1bmlmb3JtIGZsb2F0IHVfcGl0Y2hlZF9zY2FsZTt2YXJ5aW5nIHZlYzIgdl9kYXRhMDt2YXJ5aW5nIHZlYzMgdl9kYXRhMTt2ZWM0IHByb2plY3RUaWxlV2l0aEVsZXZhdGlvbih2ZWMyIHBvc0luVGlsZSxmbG9hdCBlbGV2YXRpb24pIHtyZXR1cm4gdV9tYXRyaXgqdmVjNChwb3NJblRpbGUsZWxldmF0aW9uLDEuMCk7fVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBmaWxsX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGhhbG9fY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoYWxvX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fYmx1clxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGhhbG9fY29sb3JcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGhhbG9fYmx1clxcbnZlYzIgYV9wb3M9YV9wb3Nfb2Zmc2V0Lnh5O3ZlYzIgYV9vZmZzZXQ9YV9wb3Nfb2Zmc2V0Lnp3O3ZlYzIgYV90ZXg9YV9kYXRhLnh5O3ZlYzIgYV9zaXplPWFfZGF0YS56dztmbG9hdCBhX3NpemVfbWluPWZsb29yKGFfc2l6ZVswXSowLjUpO3ZlYzIgYV9weG9mZnNldD1hX3BpeGVsb2Zmc2V0Lnh5O2Zsb2F0IGVsZT1nZXRfZWxldmF0aW9uKGFfcG9zKTtoaWdocCBmbG9hdCBzZWdtZW50X2FuZ2xlPS1hX3Byb2plY3RlZF9wb3NbMl07ZmxvYXQgc2l6ZTtpZiAoIXVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9bWl4KGFfc2l6ZV9taW4sYV9zaXplWzFdLHVfc2l6ZV90KS8xMjguMDt9IGVsc2UgaWYgKHVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9YV9zaXplX21pbi8xMjguMDt9IGVsc2Uge3NpemU9dV9zaXplO312ZWMyIHRyYW5zbGF0ZWRfYV9wb3M9YV9wb3MrdV90cmFuc2xhdGlvbjt2ZWM0IHByb2plY3RlZFBvaW50PXByb2plY3RUaWxlV2l0aEVsZXZhdGlvbih0cmFuc2xhdGVkX2FfcG9zLGVsZSk7aGlnaHAgZmxvYXQgY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZT1wcm9qZWN0ZWRQb2ludC53O2hpZ2hwIGZsb2F0IGRpc3RhbmNlX3JhdGlvPXVfcGl0Y2hfd2l0aF9tYXAgP1xcbmNhbWVyYV90b19hbmNob3JfZGlzdGFuY2UvdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlIDpcXG51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UvY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZTtoaWdocCBmbG9hdCBwZXJzcGVjdGl2ZV9yYXRpbz1jbGFtcCgwLjUrMC41KmRpc3RhbmNlX3JhdGlvLDAuMCw0LjApO3NpemUqPXBlcnNwZWN0aXZlX3JhdGlvO2Zsb2F0IGZvbnRTY2FsZT11X2lzX3RleHQgPyBzaXplLzI0LjAgOiBzaXplO2hpZ2hwIGZsb2F0IHN5bWJvbF9yb3RhdGlvbj0wLjA7aWYgKHVfcm90YXRlX3N5bWJvbCkge3ZlYzQgb2Zmc2V0UHJvamVjdGVkUG9pbnQ9cHJvamVjdFRpbGVXaXRoRWxldmF0aW9uKHRyYW5zbGF0ZWRfYV9wb3MrdmVjMigxLDApLGVsZSk7dmVjMiBhPXByb2plY3RlZFBvaW50Lnh5L3Byb2plY3RlZFBvaW50Lnc7dmVjMiBiPW9mZnNldFByb2plY3RlZFBvaW50Lnh5L29mZnNldFByb2plY3RlZFBvaW50Lnc7c3ltYm9sX3JvdGF0aW9uPWF0YW4oKGIueS1hLnkpL3VfYXNwZWN0X3JhdGlvLGIueC1hLngpO31oaWdocCBmbG9hdCBhbmdsZV9zaW49c2luKHNlZ21lbnRfYW5nbGUrc3ltYm9sX3JvdGF0aW9uKTtoaWdocCBmbG9hdCBhbmdsZV9jb3M9Y29zKHNlZ21lbnRfYW5nbGUrc3ltYm9sX3JvdGF0aW9uKTttYXQyIHJvdGF0aW9uX21hdHJpeD1tYXQyKGFuZ2xlX2NvcywtMS4wKmFuZ2xlX3NpbixhbmdsZV9zaW4sYW5nbGVfY29zKTt2ZWM0IHByb2plY3RlZF9wb3M7aWYgKHVfaXNfYWxvbmdfbGluZSB8fCB1X2lzX3ZhcmlhYmxlX2FuY2hvcikge3Byb2plY3RlZF9wb3M9dmVjNChhX3Byb2plY3RlZF9wb3MueHksZWxlLDEuMCk7fSBlbHNlIGlmICh1X3BpdGNoX3dpdGhfbWFwKSB7cHJvamVjdGVkX3Bvcz11X2xhYmVsX3BsYW5lX21hdHJpeCp2ZWM0KGFfcHJvamVjdGVkX3Bvcy54eSt1X3RyYW5zbGF0aW9uLGVsZSwxLjApO30gZWxzZSB7cHJvamVjdGVkX3Bvcz11X2xhYmVsX3BsYW5lX21hdHJpeCpwcm9qZWN0VGlsZVdpdGhFbGV2YXRpb24oYV9wcm9qZWN0ZWRfcG9zLnh5K3VfdHJhbnNsYXRpb24sZWxlKTt9ZmxvYXQgej1mbG9hdCh1X3BpdGNoX3dpdGhfbWFwKSpwcm9qZWN0ZWRfcG9zLnovcHJvamVjdGVkX3Bvcy53O2Zsb2F0IHByb2plY3Rpb25TY2FsaW5nPTEuMDt2ZWM0IGZpbmFsUG9zPXVfY29vcmRfbWF0cml4KnZlYzQocHJvamVjdGVkX3Bvcy54eS9wcm9qZWN0ZWRfcG9zLncrcm90YXRpb25fbWF0cml4KihhX29mZnNldC8zMi4wKmZvbnRTY2FsZSthX3B4b2Zmc2V0KSpwcm9qZWN0aW9uU2NhbGluZyx6LDEuMCk7aWYodV9waXRjaF93aXRoX21hcCkge2ZpbmFsUG9zPXByb2plY3RUaWxlV2l0aEVsZXZhdGlvbihmaW5hbFBvcy54eSxmaW5hbFBvcy56KTt9ZmxvYXQgZ2FtbWFfc2NhbGU9ZmluYWxQb3MudztnbF9Qb3NpdGlvbj1maW5hbFBvczt2ZWMyIGZhZGVfb3BhY2l0eT11bnBhY2tfb3BhY2l0eShhX2ZhZGVfb3BhY2l0eSk7ZmxvYXQgdmlzaWJpbGl0eT1jYWxjdWxhdGVfdmlzaWJpbGl0eShwcm9qZWN0ZWRQb2ludCk7ZmxvYXQgZmFkZV9jaGFuZ2U9ZmFkZV9vcGFjaXR5WzFdID4gMC41ID8gdV9mYWRlX2NoYW5nZSA6LXVfZmFkZV9jaGFuZ2U7ZmxvYXQgaW50ZXJwb2xhdGVkX2ZhZGVfb3BhY2l0eT1tYXgoMC4wLG1pbih2aXNpYmlsaXR5LGZhZGVfb3BhY2l0eVswXStmYWRlX2NoYW5nZSkpO3ZfZGF0YTA9YV90ZXgvdV90ZXhzaXplO3ZfZGF0YTE9dmVjMyhnYW1tYV9zY2FsZSxzaXplLGludGVycG9sYXRlZF9mYWRlX29wYWNpdHkpO31cIiksc3ltYm9sVGV4dEFuZEljb246bWUoXCIjZGVmaW5lIFNERl9QWCA4LjBcXG4jZGVmaW5lIFNERiAxLjBcXG4jZGVmaW5lIElDT04gMC4wXFxudW5pZm9ybSBib29sIHVfaXNfaGFsbzt1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlX2ljb247dW5pZm9ybSBoaWdocCBmbG9hdCB1X2dhbW1hX3NjYWxlO3VuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt2YXJ5aW5nIHZlYzQgdl9kYXRhMDt2YXJ5aW5nIHZlYzQgdl9kYXRhMTtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBoYWxvX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoYWxvX2JsdXJcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBmaWxsX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBoYWxvX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoYWxvX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoYWxvX2JsdXJcXG5mbG9hdCBmYWRlX29wYWNpdHk9dl9kYXRhMVsyXTtpZiAodl9kYXRhMS53PT1JQ09OKSB7dmVjMiB0ZXhfaWNvbj12X2RhdGEwLnp3O2xvd3AgZmxvYXQgYWxwaGE9b3BhY2l0eSpmYWRlX29wYWNpdHk7Z2xfRnJhZ0NvbG9yPXRleHR1cmUyRCh1X3RleHR1cmVfaWNvbix0ZXhfaWNvbikqYWxwaGE7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxucmV0dXJuO312ZWMyIHRleD12X2RhdGEwLnh5O2Zsb2F0IEVER0VfR0FNTUE9MC4xMDUvdV9kZXZpY2VfcGl4ZWxfcmF0aW87ZmxvYXQgZ2FtbWFfc2NhbGU9dl9kYXRhMS54O2Zsb2F0IHNpemU9dl9kYXRhMS55O2Zsb2F0IGZvbnRTY2FsZT1zaXplLzI0LjA7bG93cCB2ZWM0IGNvbG9yPWZpbGxfY29sb3I7aGlnaHAgZmxvYXQgZ2FtbWE9RURHRV9HQU1NQS8oZm9udFNjYWxlKnVfZ2FtbWFfc2NhbGUpO2xvd3AgZmxvYXQgYnVmZj0oMjU2LjAtNjQuMCkvMjU2LjA7aWYgKHVfaXNfaGFsbykge2NvbG9yPWhhbG9fY29sb3I7Z2FtbWE9KGhhbG9fYmx1cioxLjE5L1NERl9QWCtFREdFX0dBTU1BKS8oZm9udFNjYWxlKnVfZ2FtbWFfc2NhbGUpO2J1ZmY9KDYuMC1oYWxvX3dpZHRoL2ZvbnRTY2FsZSkvU0RGX1BYO31sb3dwIGZsb2F0IGRpc3Q9dGV4dHVyZTJEKHVfdGV4dHVyZSx0ZXgpLmE7aGlnaHAgZmxvYXQgZ2FtbWFfc2NhbGVkPWdhbW1hKmdhbW1hX3NjYWxlO2hpZ2hwIGZsb2F0IGFscGhhPXNtb290aHN0ZXAoYnVmZi1nYW1tYV9zY2FsZWQsYnVmZitnYW1tYV9zY2FsZWQsZGlzdCk7Z2xfRnJhZ0NvbG9yPWNvbG9yKihhbHBoYSpvcGFjaXR5KmZhZGVfb3BhY2l0eSk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLFwiYXR0cmlidXRlIHZlYzQgYV9wb3Nfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgdmVjMyBhX3Byb2plY3RlZF9wb3M7YXR0cmlidXRlIGZsb2F0IGFfZmFkZV9vcGFjaXR5O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfem9vbV9jb25zdGFudDt1bmlmb3JtIGJvb2wgdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQ7dW5pZm9ybSBoaWdocCBmbG9hdCB1X3NpemVfdDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZTt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfbGFiZWxfcGxhbmVfbWF0cml4O3VuaWZvcm0gbWF0NCB1X2Nvb3JkX21hdHJpeDt1bmlmb3JtIGJvb2wgdV9pc190ZXh0O3VuaWZvcm0gYm9vbCB1X3BpdGNoX3dpdGhfbWFwO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9waXRjaDt1bmlmb3JtIGJvb2wgdV9yb3RhdGVfc3ltYm9sO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9hc3BlY3RfcmF0aW87dW5pZm9ybSBoaWdocCBmbG9hdCB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U7dW5pZm9ybSBmbG9hdCB1X2ZhZGVfY2hhbmdlO3VuaWZvcm0gdmVjMiB1X3RleHNpemU7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZV9pY29uO3VuaWZvcm0gYm9vbCB1X2lzX2Fsb25nX2xpbmU7dW5pZm9ybSBib29sIHVfaXNfdmFyaWFibGVfYW5jaG9yO3VuaWZvcm0gdmVjMiB1X3RyYW5zbGF0aW9uO3VuaWZvcm0gZmxvYXQgdV9waXRjaGVkX3NjYWxlO3ZhcnlpbmcgdmVjNCB2X2RhdGEwO3ZhcnlpbmcgdmVjNCB2X2RhdGExO3ZlYzQgcHJvamVjdFRpbGVXaXRoRWxldmF0aW9uKHZlYzIgcG9zSW5UaWxlLGZsb2F0IGVsZXZhdGlvbikge3JldHVybiB1X21hdHJpeCp2ZWM0KHBvc0luVGlsZSxlbGV2YXRpb24sMS4wKTt9XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudmVjMiBhX3Bvcz1hX3Bvc19vZmZzZXQueHk7dmVjMiBhX29mZnNldD1hX3Bvc19vZmZzZXQuenc7dmVjMiBhX3RleD1hX2RhdGEueHk7dmVjMiBhX3NpemU9YV9kYXRhLnp3O2Zsb2F0IGFfc2l6ZV9taW49Zmxvb3IoYV9zaXplWzBdKjAuNSk7ZmxvYXQgaXNfc2RmPWFfc2l6ZVswXS0yLjAqYV9zaXplX21pbjtmbG9hdCBlbGU9Z2V0X2VsZXZhdGlvbihhX3Bvcyk7aGlnaHAgZmxvYXQgc2VnbWVudF9hbmdsZT0tYV9wcm9qZWN0ZWRfcG9zWzJdO2Zsb2F0IHNpemU7aWYgKCF1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtzaXplPW1peChhX3NpemVfbWluLGFfc2l6ZVsxXSx1X3NpemVfdCkvMTI4LjA7fSBlbHNlIGlmICh1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtzaXplPWFfc2l6ZV9taW4vMTI4LjA7fSBlbHNlIHtzaXplPXVfc2l6ZTt9dmVjMiB0cmFuc2xhdGVkX2FfcG9zPWFfcG9zK3VfdHJhbnNsYXRpb247dmVjNCBwcm9qZWN0ZWRQb2ludD1wcm9qZWN0VGlsZVdpdGhFbGV2YXRpb24odHJhbnNsYXRlZF9hX3BvcyxlbGUpO2hpZ2hwIGZsb2F0IGNhbWVyYV90b19hbmNob3JfZGlzdGFuY2U9cHJvamVjdGVkUG9pbnQudztoaWdocCBmbG9hdCBkaXN0YW5jZV9yYXRpbz11X3BpdGNoX3dpdGhfbWFwID9cXG5jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlL3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSA6XFxudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlL2NhbWVyYV90b19hbmNob3JfZGlzdGFuY2U7aGlnaHAgZmxvYXQgcGVyc3BlY3RpdmVfcmF0aW89Y2xhbXAoMC41KzAuNSpkaXN0YW5jZV9yYXRpbywwLjAsNC4wKTtzaXplKj1wZXJzcGVjdGl2ZV9yYXRpbztmbG9hdCBmb250U2NhbGU9c2l6ZS8yNC4wO2hpZ2hwIGZsb2F0IHN5bWJvbF9yb3RhdGlvbj0wLjA7aWYgKHVfcm90YXRlX3N5bWJvbCkge3ZlYzQgb2Zmc2V0UHJvamVjdGVkUG9pbnQ9cHJvamVjdFRpbGVXaXRoRWxldmF0aW9uKHRyYW5zbGF0ZWRfYV9wb3MrdmVjMigxLDApLGVsZSk7dmVjMiBhPXByb2plY3RlZFBvaW50Lnh5L3Byb2plY3RlZFBvaW50Lnc7dmVjMiBiPW9mZnNldFByb2plY3RlZFBvaW50Lnh5L29mZnNldFByb2plY3RlZFBvaW50Lnc7c3ltYm9sX3JvdGF0aW9uPWF0YW4oKGIueS1hLnkpL3VfYXNwZWN0X3JhdGlvLGIueC1hLngpO31oaWdocCBmbG9hdCBhbmdsZV9zaW49c2luKHNlZ21lbnRfYW5nbGUrc3ltYm9sX3JvdGF0aW9uKTtoaWdocCBmbG9hdCBhbmdsZV9jb3M9Y29zKHNlZ21lbnRfYW5nbGUrc3ltYm9sX3JvdGF0aW9uKTttYXQyIHJvdGF0aW9uX21hdHJpeD1tYXQyKGFuZ2xlX2NvcywtMS4wKmFuZ2xlX3NpbixhbmdsZV9zaW4sYW5nbGVfY29zKTt2ZWM0IHByb2plY3RlZF9wb3M7aWYgKHVfaXNfYWxvbmdfbGluZSB8fCB1X2lzX3ZhcmlhYmxlX2FuY2hvcikge3Byb2plY3RlZF9wb3M9dmVjNChhX3Byb2plY3RlZF9wb3MueHksZWxlLDEuMCk7fSBlbHNlIGlmICh1X3BpdGNoX3dpdGhfbWFwKSB7cHJvamVjdGVkX3Bvcz11X2xhYmVsX3BsYW5lX21hdHJpeCp2ZWM0KGFfcHJvamVjdGVkX3Bvcy54eSt1X3RyYW5zbGF0aW9uLGVsZSwxLjApO30gZWxzZSB7cHJvamVjdGVkX3Bvcz11X2xhYmVsX3BsYW5lX21hdHJpeCpwcm9qZWN0VGlsZVdpdGhFbGV2YXRpb24oYV9wcm9qZWN0ZWRfcG9zLnh5K3VfdHJhbnNsYXRpb24sZWxlKTt9ZmxvYXQgej1mbG9hdCh1X3BpdGNoX3dpdGhfbWFwKSpwcm9qZWN0ZWRfcG9zLnovcHJvamVjdGVkX3Bvcy53O2Zsb2F0IHByb2plY3Rpb25TY2FsaW5nPTEuMDt2ZWM0IGZpbmFsUG9zPXVfY29vcmRfbWF0cml4KnZlYzQocHJvamVjdGVkX3Bvcy54eS9wcm9qZWN0ZWRfcG9zLncrcm90YXRpb25fbWF0cml4KihhX29mZnNldC8zMi4wKmZvbnRTY2FsZSkqcHJvamVjdGlvblNjYWxpbmcseiwxLjApO2lmKHVfcGl0Y2hfd2l0aF9tYXApIHtmaW5hbFBvcz1wcm9qZWN0VGlsZVdpdGhFbGV2YXRpb24oZmluYWxQb3MueHksZmluYWxQb3Mueik7fWZsb2F0IGdhbW1hX3NjYWxlPWZpbmFsUG9zLnc7Z2xfUG9zaXRpb249ZmluYWxQb3M7dmVjMiBmYWRlX29wYWNpdHk9dW5wYWNrX29wYWNpdHkoYV9mYWRlX29wYWNpdHkpO2Zsb2F0IHZpc2liaWxpdHk9Y2FsY3VsYXRlX3Zpc2liaWxpdHkocHJvamVjdGVkUG9pbnQpO2Zsb2F0IGZhZGVfY2hhbmdlPWZhZGVfb3BhY2l0eVsxXSA+IDAuNSA/IHVfZmFkZV9jaGFuZ2UgOi11X2ZhZGVfY2hhbmdlO2Zsb2F0IGludGVycG9sYXRlZF9mYWRlX29wYWNpdHk9bWF4KDAuMCxtaW4odmlzaWJpbGl0eSxmYWRlX29wYWNpdHlbMF0rZmFkZV9jaGFuZ2UpKTt2X2RhdGEwLnh5PWFfdGV4L3VfdGV4c2l6ZTt2X2RhdGEwLnp3PWFfdGV4L3VfdGV4c2l6ZV9pY29uO3ZfZGF0YTE9dmVjNChnYW1tYV9zY2FsZSxzaXplLGludGVycG9sYXRlZF9mYWRlX29wYWNpdHksaXNfc2RmKTt9XCIpLHRlcnJhaW46bWUoXCJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dW5pZm9ybSB2ZWM0IHVfZm9nX2NvbG9yO3VuaWZvcm0gdmVjNCB1X2hvcml6b25fY29sb3I7dW5pZm9ybSBmbG9hdCB1X2ZvZ19ncm91bmRfYmxlbmQ7dW5pZm9ybSBmbG9hdCB1X2ZvZ19ncm91bmRfYmxlbmRfb3BhY2l0eTt1bmlmb3JtIGZsb2F0IHVfaG9yaXpvbl9mb2dfYmxlbmQ7dmFyeWluZyB2ZWMyIHZfdGV4dHVyZV9wb3M7dmFyeWluZyBmbG9hdCB2X2ZvZ19kZXB0aDtjb25zdCBmbG9hdCBnYW1tYT0yLjI7dmVjNCBnYW1tYVRvTGluZWFyKHZlYzQgY29sb3IpIHtyZXR1cm4gcG93KGNvbG9yLHZlYzQoZ2FtbWEpKTt9dmVjNCBsaW5lYXJUb0dhbW1hKHZlYzQgY29sb3IpIHtyZXR1cm4gcG93KGNvbG9yLHZlYzQoMS4wL2dhbW1hKSk7fXZvaWQgbWFpbigpIHt2ZWM0IHN1cmZhY2VfY29sb3I9dGV4dHVyZTJEKHVfdGV4dHVyZSx2X3RleHR1cmVfcG9zKTtpZiAodl9mb2dfZGVwdGggPiB1X2ZvZ19ncm91bmRfYmxlbmQpIHt2ZWM0IHN1cmZhY2VfY29sb3JfbGluZWFyPWdhbW1hVG9MaW5lYXIoc3VyZmFjZV9jb2xvcik7ZmxvYXQgYmxlbmRfY29sb3I9c21vb3Roc3RlcCgwLjAsMS4wLG1heCgodl9mb2dfZGVwdGgtdV9ob3Jpem9uX2ZvZ19ibGVuZCkvKDEuMC11X2hvcml6b25fZm9nX2JsZW5kKSwwLjApKTt2ZWM0IGZvZ19ob3Jpem9uX2NvbG9yX2xpbmVhcj1taXgoZ2FtbWFUb0xpbmVhcih1X2ZvZ19jb2xvciksZ2FtbWFUb0xpbmVhcih1X2hvcml6b25fY29sb3IpLGJsZW5kX2NvbG9yKTtmbG9hdCBmYWN0b3JfZm9nPW1heCh2X2ZvZ19kZXB0aC11X2ZvZ19ncm91bmRfYmxlbmQsMC4wKS8oMS4wLXVfZm9nX2dyb3VuZF9ibGVuZCk7Z2xfRnJhZ0NvbG9yPWxpbmVhclRvR2FtbWEobWl4KHN1cmZhY2VfY29sb3JfbGluZWFyLGZvZ19ob3Jpem9uX2NvbG9yX2xpbmVhcixwb3coZmFjdG9yX2ZvZywyLjApKnVfZm9nX2dyb3VuZF9ibGVuZF9vcGFjaXR5KSk7fSBlbHNlIHtnbF9GcmFnQ29sb3I9c3VyZmFjZV9jb2xvcjt9fVwiLFwiYXR0cmlidXRlIHZlYzMgYV9wb3MzZDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfZm9nX21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfZWxlX2RlbHRhO3ZhcnlpbmcgdmVjMiB2X3RleHR1cmVfcG9zO3ZhcnlpbmcgZmxvYXQgdl9mb2dfZGVwdGg7dm9pZCBtYWluKCkge2Zsb2F0IGVsZT1nZXRfZWxldmF0aW9uKGFfcG9zM2QueHkpO2Zsb2F0IGVsZV9kZWx0YT1hX3BvczNkLno9PTEuMCA/IHVfZWxlX2RlbHRhIDogMC4wO3ZfdGV4dHVyZV9wb3M9YV9wb3MzZC54eS84MTkyLjA7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvczNkLnh5LGVsZS1lbGVfZGVsdGEsMS4wKTt2ZWM0IHBvcz11X2ZvZ19tYXRyaXgqdmVjNChhX3BvczNkLnh5LGVsZSwxLjApO3ZfZm9nX2RlcHRoPXBvcy56L3Bvcy53KjAuNSswLjU7fVwiKSx0ZXJyYWluRGVwdGg6bWUoXCJ2YXJ5aW5nIGZsb2F0IHZfZGVwdGg7Y29uc3QgaGlnaHAgdmVjNCBiaXRTaD12ZWM0KDI1Ni4qMjU2LioyNTYuLDI1Ni4qMjU2LiwyNTYuLDEuKTtjb25zdCBoaWdocCB2ZWM0IGJpdE1zaz12ZWM0KDAuLHZlYzMoMS4vMjU2LjApKTtoaWdocCB2ZWM0IHBhY2soaGlnaHAgZmxvYXQgdmFsdWUpIHtoaWdocCB2ZWM0IGNvbXA9ZnJhY3QodmFsdWUqYml0U2gpO2NvbXAtPWNvbXAueHh5eipiaXRNc2s7cmV0dXJuIGNvbXA7fXZvaWQgbWFpbigpIHtnbF9GcmFnQ29sb3I9cGFjayh2X2RlcHRoKTt9XCIsXCJhdHRyaWJ1dGUgdmVjMyBhX3BvczNkO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfZWxlX2RlbHRhO3ZhcnlpbmcgZmxvYXQgdl9kZXB0aDt2b2lkIG1haW4oKSB7ZmxvYXQgZWxlPWdldF9lbGV2YXRpb24oYV9wb3MzZC54eSk7ZmxvYXQgZWxlX2RlbHRhPWFfcG9zM2Quej09MS4wID8gdV9lbGVfZGVsdGEgOiAwLjA7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvczNkLnh5LGVsZS1lbGVfZGVsdGEsMS4wKTt2X2RlcHRoPWdsX1Bvc2l0aW9uLnovZ2xfUG9zaXRpb24udzt9XCIpLHRlcnJhaW5Db29yZHM6bWUoXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dW5pZm9ybSBmbG9hdCB1X3RlcnJhaW5fY29vcmRzX2lkO3ZhcnlpbmcgdmVjMiB2X3RleHR1cmVfcG9zO3ZvaWQgbWFpbigpIHt2ZWM0IHJnYmE9dGV4dHVyZTJEKHVfdGV4dHVyZSx2X3RleHR1cmVfcG9zKTtnbF9GcmFnQ29sb3I9dmVjNChyZ2JhLnIscmdiYS5nLHJnYmEuYix1X3RlcnJhaW5fY29vcmRzX2lkKTt9XCIsXCJhdHRyaWJ1dGUgdmVjMyBhX3BvczNkO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfZWxlX2RlbHRhO3ZhcnlpbmcgdmVjMiB2X3RleHR1cmVfcG9zO3ZvaWQgbWFpbigpIHtmbG9hdCBlbGU9Z2V0X2VsZXZhdGlvbihhX3BvczNkLnh5KTtmbG9hdCBlbGVfZGVsdGE9YV9wb3MzZC56PT0xLjAgPyB1X2VsZV9kZWx0YSA6IDAuMDt2X3RleHR1cmVfcG9zPWFfcG9zM2QueHkvODE5Mi4wO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MzZC54eSxlbGUtZWxlX2RlbHRhLDEuMCk7fVwiKSxza3k6bWUoXCJ1bmlmb3JtIHZlYzQgdV9za3lfY29sb3I7dW5pZm9ybSB2ZWM0IHVfaG9yaXpvbl9jb2xvcjt1bmlmb3JtIGZsb2F0IHVfaG9yaXpvbjt1bmlmb3JtIGZsb2F0IHVfc2t5X2hvcml6b25fYmxlbmQ7dm9pZCBtYWluKCkge2Zsb2F0IHk9Z2xfRnJhZ0Nvb3JkLnk7aWYgKHkgPiB1X2hvcml6b24pIHtmbG9hdCBibGVuZD15LXVfaG9yaXpvbjtpZiAoYmxlbmQgPCB1X3NreV9ob3Jpem9uX2JsZW5kKSB7Z2xfRnJhZ0NvbG9yPW1peCh1X3NreV9jb2xvcix1X2hvcml6b25fY29sb3IscG93KDEuMC1ibGVuZC91X3NreV9ob3Jpem9uX2JsZW5kLDIuMCkpO30gZWxzZSB7Z2xfRnJhZ0NvbG9yPXVfc2t5X2NvbG9yO319fVwiLFwiYXR0cmlidXRlIHZlYzIgYV9wb3M7dm9pZCBtYWluKCkge2dsX1Bvc2l0aW9uPXZlYzQoYV9wb3MsMS4wLDEuMCk7fVwiKX07ZnVuY3Rpb24gbWUodCxlKXtjb25zdCBpPS8jcHJhZ21hIG1hcGJveDogKFtcXHddKykgKFtcXHddKykgKFtcXHddKykgKFtcXHddKykvZyxhPWUubWF0Y2goL2F0dHJpYnV0ZSAoW1xcd10rKSAoW1xcd10rKS9nKSxzPXQubWF0Y2goL3VuaWZvcm0gKFtcXHddKykgKFtcXHddKykoW1xcc10qKShbXFx3XSopL2cpLG89ZS5tYXRjaCgvdW5pZm9ybSAoW1xcd10rKSAoW1xcd10rKShbXFxzXSopKFtcXHddKikvZykscj1vP28uY29uY2F0KHMpOnMsbj17fTtyZXR1cm4ge2ZyYWdtZW50U291cmNlOnQ9dC5yZXBsYWNlKGksKCh0LGUsaSxhLHMpPT4obltzXT0hMCxcImRlZmluZVwiPT09ZT9gXFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7c31cXG52YXJ5aW5nICR7aX0gJHthfSAke3N9O1xcbiNlbHNlXFxudW5pZm9ybSAke2l9ICR7YX0gdV8ke3N9O1xcbiNlbmRpZlxcbmA6YFxcbiNpZmRlZiBIQVNfVU5JRk9STV91XyR7c31cXG4gICAgJHtpfSAke2F9ICR7c30gPSB1XyR7c307XFxuI2VuZGlmXFxuYCkpKSx2ZXJ0ZXhTb3VyY2U6ZT1lLnJlcGxhY2UoaSwoKHQsZSxpLGEscyk9Pntjb25zdCBvPVwiZmxvYXRcIj09PWE/XCJ2ZWMyXCI6XCJ2ZWM0XCIscj1zLm1hdGNoKC9jb2xvci8pP1wiY29sb3JcIjpvO3JldHVybiBuW3NdP1wiZGVmaW5lXCI9PT1lP2BcXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtzfVxcbnVuaWZvcm0gbG93cCBmbG9hdCB1XyR7c31fdDtcXG5hdHRyaWJ1dGUgJHtpfSAke299IGFfJHtzfTtcXG52YXJ5aW5nICR7aX0gJHthfSAke3N9O1xcbiNlbHNlXFxudW5pZm9ybSAke2l9ICR7YX0gdV8ke3N9O1xcbiNlbmRpZlxcbmA6XCJ2ZWM0XCI9PT1yP2BcXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtzfVxcbiAgICAke3N9ID0gYV8ke3N9O1xcbiNlbHNlXFxuICAgICR7aX0gJHthfSAke3N9ID0gdV8ke3N9O1xcbiNlbmRpZlxcbmA6YFxcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke3N9XFxuICAgICR7c30gPSB1bnBhY2tfbWl4XyR7cn0oYV8ke3N9LCB1XyR7c31fdCk7XFxuI2Vsc2VcXG4gICAgJHtpfSAke2F9ICR7c30gPSB1XyR7c307XFxuI2VuZGlmXFxuYDpcImRlZmluZVwiPT09ZT9gXFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7c31cXG51bmlmb3JtIGxvd3AgZmxvYXQgdV8ke3N9X3Q7XFxuYXR0cmlidXRlICR7aX0gJHtvfSBhXyR7c307XFxuI2Vsc2VcXG51bmlmb3JtICR7aX0gJHthfSB1XyR7c307XFxuI2VuZGlmXFxuYDpcInZlYzRcIj09PXI/YFxcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke3N9XFxuICAgICR7aX0gJHthfSAke3N9ID0gYV8ke3N9O1xcbiNlbHNlXFxuICAgICR7aX0gJHthfSAke3N9ID0gdV8ke3N9O1xcbiNlbmRpZlxcbmA6YFxcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke3N9XFxuICAgICR7aX0gJHthfSAke3N9ID0gdW5wYWNrX21peF8ke3J9KGFfJHtzfSwgdV8ke3N9X3QpO1xcbiNlbHNlXFxuICAgICR7aX0gJHthfSAke3N9ID0gdV8ke3N9O1xcbiNlbmRpZlxcbmB9KSksc3RhdGljQXR0cmlidXRlczphLHN0YXRpY1VuaWZvcm1zOnJ9fWNsYXNzIGZle2NvbnN0cnVjdG9yKCl7dGhpcy5ib3VuZFByb2dyYW09bnVsbCx0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyPW51bGwsdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycz1bXSx0aGlzLmJvdW5kSW5kZXhCdWZmZXI9bnVsbCx0aGlzLmJvdW5kVmVydGV4T2Zmc2V0PW51bGwsdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXI9bnVsbCx0aGlzLnZhbz1udWxsO31iaW5kKHQsZSxpLGEscyxvLHIsbixsKXt0aGlzLmNvbnRleHQ9dDtsZXQgaD10aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzLmxlbmd0aCE9PWEubGVuZ3RoO2ZvcihsZXQgdD0wOyFoJiZ0PGEubGVuZ3RoO3QrKyl0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzW3RdIT09YVt0XSYmKGg9ITApOyF0aGlzLnZhb3x8dGhpcy5ib3VuZFByb2dyYW0hPT1lfHx0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyIT09aXx8aHx8dGhpcy5ib3VuZEluZGV4QnVmZmVyIT09c3x8dGhpcy5ib3VuZFZlcnRleE9mZnNldCE9PW98fHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyIT09cnx8dGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyIT09bnx8dGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIzIT09bD90aGlzLmZyZXNoQmluZChlLGksYSxzLG8scixuLGwpOih0LmJpbmRWZXJ0ZXhBcnJheS5zZXQodGhpcy52YW8pLHImJnIuYmluZCgpLHMmJnMuZHluYW1pY0RyYXcmJnMuYmluZCgpLG4mJm4uYmluZCgpLGwmJmwuYmluZCgpKTt9ZnJlc2hCaW5kKHQsZSxpLGEscyxvLHIsbil7Y29uc3QgbD10Lm51bUF0dHJpYnV0ZXMsaD10aGlzLmNvbnRleHQsYz1oLmdsO3RoaXMudmFvJiZ0aGlzLmRlc3Ryb3koKSx0aGlzLnZhbz1oLmNyZWF0ZVZlcnRleEFycmF5KCksaC5iaW5kVmVydGV4QXJyYXkuc2V0KHRoaXMudmFvKSx0aGlzLmJvdW5kUHJvZ3JhbT10LHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXI9ZSx0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzPWksdGhpcy5ib3VuZEluZGV4QnVmZmVyPWEsdGhpcy5ib3VuZFZlcnRleE9mZnNldD1zLHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyPW8sdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyPXIsdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIzPW4sZS5lbmFibGVBdHRyaWJ1dGVzKGMsdCk7Zm9yKGNvbnN0IGUgb2YgaSllLmVuYWJsZUF0dHJpYnV0ZXMoYyx0KTtvJiZvLmVuYWJsZUF0dHJpYnV0ZXMoYyx0KSxyJiZyLmVuYWJsZUF0dHJpYnV0ZXMoYyx0KSxuJiZuLmVuYWJsZUF0dHJpYnV0ZXMoYyx0KSxlLmJpbmQoKSxlLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGMsdCxzKTtmb3IoY29uc3QgZSBvZiBpKWUuYmluZCgpLGUuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoYyx0LHMpO28mJihvLmJpbmQoKSxvLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGMsdCxzKSksYSYmYS5iaW5kKCksciYmKHIuYmluZCgpLHIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoYyx0LHMpKSxuJiYobi5iaW5kKCksbi5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhjLHQscykpLGguY3VycmVudE51bUF0dHJpYnV0ZXM9bDt9ZGVzdHJveSgpe3RoaXMudmFvJiYodGhpcy5jb250ZXh0LmRlbGV0ZVZlcnRleEFycmF5KHRoaXMudmFvKSx0aGlzLnZhbz1udWxsKTt9fWNvbnN0IGdlPSh0LGksYSxzLG8pPT4oe3VfbWF0cml4OnQsdV90ZXh0dXJlOjAsdV9lbGVfZGVsdGE6aSx1X2ZvZ19tYXRyaXg6YSx1X2ZvZ19jb2xvcjpzP3MucHJvcGVydGllcy5nZXQoXCJmb2ctY29sb3JcIik6ZS5hTS53aGl0ZSx1X2ZvZ19ncm91bmRfYmxlbmQ6cz9zLnByb3BlcnRpZXMuZ2V0KFwiZm9nLWdyb3VuZC1ibGVuZFwiKToxLHVfZm9nX2dyb3VuZF9ibGVuZF9vcGFjaXR5OnM/cy5jYWxjdWxhdGVGb2dCbGVuZE9wYWNpdHkobyk6MCx1X2hvcml6b25fY29sb3I6cz9zLnByb3BlcnRpZXMuZ2V0KFwiaG9yaXpvbi1jb2xvclwiKTplLmFNLndoaXRlLHVfaG9yaXpvbl9mb2dfYmxlbmQ6cz9zLnByb3BlcnRpZXMuZ2V0KFwiaG9yaXpvbi1mb2ctYmxlbmRcIik6MX0pO2Z1bmN0aW9uIHZlKHQpe2NvbnN0IGU9W107Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2lmKG51bGw9PT10W2ldKWNvbnRpbnVlO2NvbnN0IGE9dFtpXS5zcGxpdChcIiBcIik7ZS5wdXNoKGEucG9wKCkpO31yZXR1cm4gZX1jbGFzcyB4ZXtjb25zdHJ1Y3Rvcih0LGksYSxzLG8scil7Y29uc3Qgbj10LmdsO3RoaXMucHJvZ3JhbT1uLmNyZWF0ZVByb2dyYW0oKTtjb25zdCBsPXZlKGkuc3RhdGljQXR0cmlidXRlcyksaD1hP2EuZ2V0QmluZGVyQXR0cmlidXRlcygpOltdLGM9bC5jb25jYXQoaCksdT1wZS5wcmVsdWRlLnN0YXRpY1VuaWZvcm1zP3ZlKHBlLnByZWx1ZGUuc3RhdGljVW5pZm9ybXMpOltdLGQ9aS5zdGF0aWNVbmlmb3Jtcz92ZShpLnN0YXRpY1VuaWZvcm1zKTpbXSxfPWE/YS5nZXRCaW5kZXJVbmlmb3JtcygpOltdLHA9dS5jb25jYXQoZCkuY29uY2F0KF8pLG09W107Zm9yKGNvbnN0IHQgb2YgcCltLmluZGV4T2YodCk8MCYmbS5wdXNoKHQpO2NvbnN0IGY9YT9hLmRlZmluZXMoKTpbXTtvJiZmLnB1c2goXCIjZGVmaW5lIE9WRVJEUkFXX0lOU1BFQ1RPUjtcIiksciYmZi5wdXNoKFwiI2RlZmluZSBURVJSQUlOM0Q7XCIpO2NvbnN0IGc9Zi5jb25jYXQocGUucHJlbHVkZS5mcmFnbWVudFNvdXJjZSxpLmZyYWdtZW50U291cmNlKS5qb2luKFwiXFxuXCIpLHY9Zi5jb25jYXQocGUucHJlbHVkZS52ZXJ0ZXhTb3VyY2UsaS52ZXJ0ZXhTb3VyY2UpLmpvaW4oXCJcXG5cIikseD1uLmNyZWF0ZVNoYWRlcihuLkZSQUdNRU5UX1NIQURFUik7aWYobi5pc0NvbnRleHRMb3N0KCkpcmV0dXJuIHZvaWQodGhpcy5mYWlsZWRUb0NyZWF0ZT0hMCk7aWYobi5zaGFkZXJTb3VyY2UoeCxnKSxuLmNvbXBpbGVTaGFkZXIoeCksIW4uZ2V0U2hhZGVyUGFyYW1ldGVyKHgsbi5DT01QSUxFX1NUQVRVUykpdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY29tcGlsZSBmcmFnbWVudCBzaGFkZXI6ICR7bi5nZXRTaGFkZXJJbmZvTG9nKHgpfWApO24uYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSx4KTtjb25zdCB5PW4uY3JlYXRlU2hhZGVyKG4uVkVSVEVYX1NIQURFUik7aWYobi5pc0NvbnRleHRMb3N0KCkpcmV0dXJuIHZvaWQodGhpcy5mYWlsZWRUb0NyZWF0ZT0hMCk7aWYobi5zaGFkZXJTb3VyY2UoeSx2KSxuLmNvbXBpbGVTaGFkZXIoeSksIW4uZ2V0U2hhZGVyUGFyYW1ldGVyKHksbi5DT01QSUxFX1NUQVRVUykpdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY29tcGlsZSB2ZXJ0ZXggc2hhZGVyOiAke24uZ2V0U2hhZGVySW5mb0xvZyh5KX1gKTtuLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0seSksdGhpcy5hdHRyaWJ1dGVzPXt9O2NvbnN0IGI9e307dGhpcy5udW1BdHRyaWJ1dGVzPWMubGVuZ3RoO2ZvcihsZXQgdD0wO3Q8dGhpcy5udW1BdHRyaWJ1dGVzO3QrKyljW3RdJiYobi5iaW5kQXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLHQsY1t0XSksdGhpcy5hdHRyaWJ1dGVzW2NbdF1dPXQpO2lmKG4ubGlua1Byb2dyYW0odGhpcy5wcm9ncmFtKSwhbi5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSxuLkxJTktfU1RBVFVTKSl0aHJvdyBuZXcgRXJyb3IoYFByb2dyYW0gZmFpbGVkIHRvIGxpbms6ICR7bi5nZXRQcm9ncmFtSW5mb0xvZyh0aGlzLnByb2dyYW0pfWApO24uZGVsZXRlU2hhZGVyKHkpLG4uZGVsZXRlU2hhZGVyKHgpO2ZvcihsZXQgdD0wO3Q8bS5sZW5ndGg7dCsrKXtjb25zdCBlPW1bdF07aWYoZSYmIWJbZV0pe2NvbnN0IHQ9bi5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLGUpO3QmJihiW2VdPXQpO319dGhpcy5maXhlZFVuaWZvcm1zPXModCxiKSx0aGlzLnRlcnJhaW5Vbmlmb3Jtcz0oKHQsaSk9Pih7dV9kZXB0aDpuZXcgZS5hSCh0LGkudV9kZXB0aCksdV90ZXJyYWluOm5ldyBlLmFIKHQsaS51X3RlcnJhaW4pLHVfdGVycmFpbl9kaW06bmV3IGUuYUkodCxpLnVfdGVycmFpbl9kaW0pLHVfdGVycmFpbl9tYXRyaXg6bmV3IGUuYUoodCxpLnVfdGVycmFpbl9tYXRyaXgpLHVfdGVycmFpbl91bnBhY2s6bmV3IGUuYUsodCxpLnVfdGVycmFpbl91bnBhY2spLHVfdGVycmFpbl9leGFnZ2VyYXRpb246bmV3IGUuYUkodCxpLnVfdGVycmFpbl9leGFnZ2VyYXRpb24pfSkpKHQsYiksdGhpcy5iaW5kZXJVbmlmb3Jtcz1hP2EuZ2V0VW5pZm9ybXModCxiKTpbXTt9ZHJhdyh0LGUsaSxhLHMsbyxyLG4sbCxoLGMsdSxkLF8scCxtLGYsZyl7Y29uc3Qgdj10LmdsO2lmKHRoaXMuZmFpbGVkVG9DcmVhdGUpcmV0dXJuO2lmKHQucHJvZ3JhbS5zZXQodGhpcy5wcm9ncmFtKSx0LnNldERlcHRoTW9kZShpKSx0LnNldFN0ZW5jaWxNb2RlKGEpLHQuc2V0Q29sb3JNb2RlKHMpLHQuc2V0Q3VsbEZhY2Uobyksbil7dC5hY3RpdmVUZXh0dXJlLnNldCh2LlRFWFRVUkUyKSx2LmJpbmRUZXh0dXJlKHYuVEVYVFVSRV8yRCxuLmRlcHRoVGV4dHVyZSksdC5hY3RpdmVUZXh0dXJlLnNldCh2LlRFWFRVUkUzKSx2LmJpbmRUZXh0dXJlKHYuVEVYVFVSRV8yRCxuLnRleHR1cmUpO2Zvcihjb25zdCB0IGluIHRoaXMudGVycmFpblVuaWZvcm1zKXRoaXMudGVycmFpblVuaWZvcm1zW3RdLnNldChuW3RdKTt9Zm9yKGNvbnN0IHQgaW4gdGhpcy5maXhlZFVuaWZvcm1zKXRoaXMuZml4ZWRVbmlmb3Jtc1t0XS5zZXQoclt0XSk7cCYmcC5zZXRVbmlmb3Jtcyh0LHRoaXMuYmluZGVyVW5pZm9ybXMsZCx7em9vbTpffSk7bGV0IHg9MDtzd2l0Y2goZSl7Y2FzZSB2LkxJTkVTOng9MjticmVhaztjYXNlIHYuVFJJQU5HTEVTOng9MzticmVhaztjYXNlIHYuTElORV9TVFJJUDp4PTE7fWZvcihjb25zdCBpIG9mIHUuZ2V0KCkpe2NvbnN0IGE9aS52YW9zfHwoaS52YW9zPXt9KTsoYVtsXXx8KGFbbF09bmV3IGZlKSkuYmluZCh0LHRoaXMsaCxwP3AuZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzKCk6W10sYyxpLnZlcnRleE9mZnNldCxtLGYsZyksdi5kcmF3RWxlbWVudHMoZSxpLnByaW1pdGl2ZUxlbmd0aCp4LHYuVU5TSUdORURfU0hPUlQsaS5wcmltaXRpdmVPZmZzZXQqeCoyKTt9fX1mdW5jdGlvbiB5ZSh0LGUsaSl7Y29uc3QgYT0xL0J0KGksMSxlLnRyYW5zZm9ybS50aWxlWm9vbSkscz1NYXRoLnBvdygyLGkudGlsZUlELm92ZXJzY2FsZWRaKSxvPWkudGlsZVNpemUqTWF0aC5wb3coMixlLnRyYW5zZm9ybS50aWxlWm9vbSkvcyxyPW8qKGkudGlsZUlELmNhbm9uaWNhbC54K2kudGlsZUlELndyYXAqcyksbj1vKmkudGlsZUlELmNhbm9uaWNhbC55O3JldHVybiB7dV9pbWFnZTowLHVfdGV4c2l6ZTppLmltYWdlQXRsYXNUZXh0dXJlLnNpemUsdV9zY2FsZTpbYSx0LmZyb21TY2FsZSx0LnRvU2NhbGVdLHVfZmFkZTp0LnQsdV9waXhlbF9jb29yZF91cHBlcjpbcj4+MTYsbj4+MTZdLHVfcGl4ZWxfY29vcmRfbG93ZXI6WzY1NTM1JnIsNjU1MzUmbl19fWNvbnN0IGJlPSh0LGksYSxzKT0+e2NvbnN0IG89aS5zdHlsZS5saWdodCxyPW8ucHJvcGVydGllcy5nZXQoXCJwb3NpdGlvblwiKSxuPVtyLngsci55LHIuel0sbD1mdW5jdGlvbigpe3ZhciB0PW5ldyBlLkEoOSk7cmV0dXJuIGUuQSE9RmxvYXQzMkFycmF5JiYodFsxXT0wLHRbMl09MCx0WzNdPTAsdFs1XT0wLHRbNl09MCx0WzddPTApLHRbMF09MSx0WzRdPTEsdFs4XT0xLHR9KCk7XCJ2aWV3cG9ydFwiPT09by5wcm9wZXJ0aWVzLmdldChcImFuY2hvclwiKSYmZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLnNpbihlKSxhPU1hdGguY29zKGUpO3RbMF09YSx0WzFdPWksdFsyXT0wLHRbM109LWksdFs0XT1hLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MTt9KGwsLWkudHJhbnNmb3JtLmFuZ2xlKSxmdW5jdGlvbih0LGUsaSl7dmFyIGE9ZVswXSxzPWVbMV0sbz1lWzJdO3RbMF09YSppWzBdK3MqaVszXStvKmlbNl0sdFsxXT1hKmlbMV0rcyppWzRdK28qaVs3XSx0WzJdPWEqaVsyXStzKmlbNV0rbyppWzhdO30obixuLGwpO2NvbnN0IGg9by5wcm9wZXJ0aWVzLmdldChcImNvbG9yXCIpO3JldHVybiB7dV9tYXRyaXg6dCx1X2xpZ2h0cG9zOm4sdV9saWdodGludGVuc2l0eTpvLnByb3BlcnRpZXMuZ2V0KFwiaW50ZW5zaXR5XCIpLHVfbGlnaHRjb2xvcjpbaC5yLGguZyxoLmJdLHVfdmVydGljYWxfZ3JhZGllbnQ6K2EsdV9vcGFjaXR5OnN9fSx3ZT0odCxpLGEscyxvLHIsbik9PmUuZShiZSh0LGksYSxzKSx5ZShyLGksbikse3VfaGVpZ2h0X2ZhY3RvcjotTWF0aC5wb3coMixvLm92ZXJzY2FsZWRaKS9uLnRpbGVTaXplLzh9KSxUZT10PT4oe3VfbWF0cml4OnR9KSxJZT0odCxpLGEscyk9PmUuZShUZSh0KSx5ZShhLGkscykpLEVlPSh0LGUpPT4oe3VfbWF0cml4OnQsdV93b3JsZDplfSksUGU9KHQsaSxhLHMsbyk9PmUuZShJZSh0LGksYSxzKSx7dV93b3JsZDpvfSksQ2U9KHQsZSxpLGEpPT57Y29uc3Qgcz10LnRyYW5zZm9ybTtsZXQgbyxyO2lmKFwibWFwXCI9PT1hLnBhaW50LmdldChcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIikpe2NvbnN0IHQ9QnQoaSwxLHMuem9vbSk7bz0hMCxyPVt0LHRdO31lbHNlIG89ITEscj1zLnBpeGVsc1RvR0xVbml0cztyZXR1cm4ge3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTpzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsdV9zY2FsZV93aXRoX21hcDorKFwibWFwXCI9PT1hLnBhaW50LmdldChcImNpcmNsZS1waXRjaC1zY2FsZVwiKSksdV9tYXRyaXg6dC50cmFuc2xhdGVQb3NNYXRyaXgoZS5wb3NNYXRyaXgsaSxhLnBhaW50LmdldChcImNpcmNsZS10cmFuc2xhdGVcIiksYS5wYWludC5nZXQoXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiKSksdV9waXRjaF93aXRoX21hcDorbyx1X2RldmljZV9waXhlbF9yYXRpbzp0LnBpeGVsUmF0aW8sdV9leHRydWRlX3NjYWxlOnJ9fSxTZT0odCxlLGkpPT4oe3VfbWF0cml4OnQsdV9pbnZfbWF0cml4OmUsdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlOmkuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSx1X3ZpZXdwb3J0X3NpemU6W2kud2lkdGgsaS5oZWlnaHRdfSksemU9KHQsZSxpPTEpPT4oe3VfbWF0cml4OnQsdV9jb2xvcjplLHVfb3ZlcmxheTowLHVfb3ZlcmxheV9zY2FsZTppfSksRGU9dD0+KHt1X21hdHJpeDp0fSksTWU9KHQsZSxpLGEpPT4oe3VfbWF0cml4OnQsdV9leHRydWRlX3NjYWxlOkJ0KGUsMSxpKSx1X2ludGVuc2l0eTphfSksQWU9KHQsaSxhLHMpPT57Y29uc3Qgbz1lLkgoKTtlLmFQKG8sMCx0LndpZHRoLHQuaGVpZ2h0LDAsMCwxKTtjb25zdCByPXQuY29udGV4dC5nbDtyZXR1cm4ge3VfbWF0cml4Om8sdV93b3JsZDpbci5kcmF3aW5nQnVmZmVyV2lkdGgsci5kcmF3aW5nQnVmZmVySGVpZ2h0XSx1X2ltYWdlOmEsdV9jb2xvcl9yYW1wOnMsdV9vcGFjaXR5OmkucGFpbnQuZ2V0KFwiaGVhdG1hcC1vcGFjaXR5XCIpfX07ZnVuY3Rpb24gUmUodCxpKXtjb25zdCBhPU1hdGgucG93KDIsaS5jYW5vbmljYWwueikscz1pLmNhbm9uaWNhbC55O3JldHVybiBbbmV3IGUuWigwLHMvYSkudG9MbmdMYXQoKS5sYXQsbmV3IGUuWigwLChzKzEpL2EpLnRvTG5nTGF0KCkubGF0XX1jb25zdCBrZT0odCxlLGksYSk9Pntjb25zdCBzPXQudHJhbnNmb3JtO3JldHVybiB7dV9tYXRyaXg6TmUodCxlLGksYSksdV9yYXRpbzoxL0J0KGUsMSxzLnpvb20pLHVfZGV2aWNlX3BpeGVsX3JhdGlvOnQucGl4ZWxSYXRpbyx1X3VuaXRzX3RvX3BpeGVsczpbMS9zLnBpeGVsc1RvR0xVbml0c1swXSwxL3MucGl4ZWxzVG9HTFVuaXRzWzFdXX19LExlPSh0LGksYSxzLG8pPT5lLmUoa2UodCxpLGEsbykse3VfaW1hZ2U6MCx1X2ltYWdlX2hlaWdodDpzfSksRmU9KHQsZSxpLGEscyk9Pntjb25zdCBvPXQudHJhbnNmb3JtLHI9T2UoZSxvKTtyZXR1cm4ge3VfbWF0cml4Ok5lKHQsZSxpLHMpLHVfdGV4c2l6ZTplLmltYWdlQXRsYXNUZXh0dXJlLnNpemUsdV9yYXRpbzoxL0J0KGUsMSxvLnpvb20pLHVfZGV2aWNlX3BpeGVsX3JhdGlvOnQucGl4ZWxSYXRpbyx1X2ltYWdlOjAsdV9zY2FsZTpbcixhLmZyb21TY2FsZSxhLnRvU2NhbGVdLHVfZmFkZTphLnQsdV91bml0c190b19waXhlbHM6WzEvby5waXhlbHNUb0dMVW5pdHNbMF0sMS9vLnBpeGVsc1RvR0xVbml0c1sxXV19fSxCZT0odCxpLGEscyxvLHIpPT57Y29uc3Qgbj10LmxpbmVBdGxhcyxsPU9lKGksdC50cmFuc2Zvcm0pLGg9XCJyb3VuZFwiPT09YS5sYXlvdXQuZ2V0KFwibGluZS1jYXBcIiksYz1uLmdldERhc2gocy5mcm9tLGgpLHU9bi5nZXREYXNoKHMudG8saCksZD1jLndpZHRoKm8uZnJvbVNjYWxlLF89dS53aWR0aCpvLnRvU2NhbGU7cmV0dXJuIGUuZShrZSh0LGksYSxyKSx7dV9wYXR0ZXJuc2NhbGVfYTpbbC9kLC1jLmhlaWdodC8yXSx1X3BhdHRlcm5zY2FsZV9iOltsL18sLXUuaGVpZ2h0LzJdLHVfc2RmZ2FtbWE6bi53aWR0aC8oMjU2Kk1hdGgubWluKGQsXykqdC5waXhlbFJhdGlvKS8yLHVfaW1hZ2U6MCx1X3RleF95X2E6Yy55LHVfdGV4X3lfYjp1LnksdV9taXg6by50fSl9O2Z1bmN0aW9uIE9lKHQsZSl7cmV0dXJuIDEvQnQodCwxLGUudGlsZVpvb20pfWZ1bmN0aW9uIE5lKHQsZSxpLGEpe3JldHVybiB0LnRyYW5zbGF0ZVBvc01hdHJpeChhP2EucG9zTWF0cml4OmUudGlsZUlELnBvc01hdHJpeCxlLGkucGFpbnQuZ2V0KFwibGluZS10cmFuc2xhdGVcIiksaS5wYWludC5nZXQoXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIikpfWNvbnN0IFVlPSh0LGUsaSxhLHMpPT57cmV0dXJuIHt1X21hdHJpeDp0LHVfdGxfcGFyZW50OmUsdV9zY2FsZV9wYXJlbnQ6aSx1X2J1ZmZlcl9zY2FsZToxLHVfZmFkZV90OmEubWl4LHVfb3BhY2l0eTphLm9wYWNpdHkqcy5wYWludC5nZXQoXCJyYXN0ZXItb3BhY2l0eVwiKSx1X2ltYWdlMDowLHVfaW1hZ2UxOjEsdV9icmlnaHRuZXNzX2xvdzpzLnBhaW50LmdldChcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiKSx1X2JyaWdodG5lc3NfaGlnaDpzLnBhaW50LmdldChcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiKSx1X3NhdHVyYXRpb25fZmFjdG9yOihyPXMucGFpbnQuZ2V0KFwicmFzdGVyLXNhdHVyYXRpb25cIikscj4wPzEtMS8oMS4wMDEtcik6LXIpLHVfY29udHJhc3RfZmFjdG9yOihvPXMucGFpbnQuZ2V0KFwicmFzdGVyLWNvbnRyYXN0XCIpLG8+MD8xLygxLW8pOjErbyksdV9zcGluX3dlaWdodHM6amUocy5wYWludC5nZXQoXCJyYXN0ZXItaHVlLXJvdGF0ZVwiKSl9O3ZhciBvLHI7fTtmdW5jdGlvbiBqZSh0KXt0Kj1NYXRoLlBJLzE4MDtjb25zdCBlPU1hdGguc2luKHQpLGk9TWF0aC5jb3ModCk7cmV0dXJuIFsoMippKzEpLzMsKC1NYXRoLnNxcnQoMykqZS1pKzEpLzMsKE1hdGguc3FydCgzKSplLWkrMSkvM119Y29uc3QgWmU9KHQsZSxpLGEscyxvLHIsbixsLGgsYyx1LGQsXyk9Pntjb25zdCBwPXIudHJhbnNmb3JtO3JldHVybiB7dV9pc19zaXplX3pvb21fY29uc3RhbnQ6KyhcImNvbnN0YW50XCI9PT10fHxcInNvdXJjZVwiPT09dCksdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQ6KyhcImNvbnN0YW50XCI9PT10fHxcImNhbWVyYVwiPT09dCksdV9zaXplX3Q6ZT9lLnVTaXplVDowLHVfc2l6ZTplP2UudVNpemU6MCx1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6cC5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLHVfcGl0Y2g6cC5waXRjaC8zNjAqMipNYXRoLlBJLHVfcm90YXRlX3N5bWJvbDoraSx1X2FzcGVjdF9yYXRpbzpwLndpZHRoL3AuaGVpZ2h0LHVfZmFkZV9jaGFuZ2U6ci5vcHRpb25zLmZhZGVEdXJhdGlvbj9yLnN5bWJvbEZhZGVDaGFuZ2U6MSx1X21hdHJpeDpuLHVfbGFiZWxfcGxhbmVfbWF0cml4OmwsdV9jb29yZF9tYXRyaXg6aCx1X2lzX3RleHQ6K3UsdV9waXRjaF93aXRoX21hcDorYSx1X2lzX2Fsb25nX2xpbmU6cyx1X2lzX3ZhcmlhYmxlX2FuY2hvcjpvLHVfdGV4c2l6ZTpkLHVfdGV4dHVyZTowLHVfdHJhbnNsYXRpb246Yyx1X3BpdGNoZWRfc2NhbGU6X319LHFlPSh0LGksYSxzLG8scixuLGwsaCxjLHUsZCxfLHAsbSk9Pntjb25zdCBmPW4udHJhbnNmb3JtO3JldHVybiBlLmUoWmUodCxpLGEscyxvLHIsbixsLGgsYyx1LGQsXyxtKSx7dV9nYW1tYV9zY2FsZTpzP01hdGguY29zKGYuX3BpdGNoKSpmLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U6MSx1X2RldmljZV9waXhlbF9yYXRpbzpuLnBpeGVsUmF0aW8sdV9pc19oYWxvOitwfSl9LFZlPSh0LGksYSxzLG8scixuLGwsaCxjLHUsZCxfLHApPT5lLmUocWUodCxpLGEscyxvLHIsbixsLGgsYyx1LCEwLGQsITAscCkse3VfdGV4c2l6ZV9pY29uOl8sdV90ZXh0dXJlX2ljb246MX0pLEdlPSh0LGUsaSk9Pih7dV9tYXRyaXg6dCx1X29wYWNpdHk6ZSx1X2NvbG9yOml9KSxIZT0odCxpLGEscyxvLHIpPT5lLmUoZnVuY3Rpb24odCxlLGksYSl7Y29uc3Qgcz1pLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKHQuZnJvbS50b1N0cmluZygpKSxvPWkuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4odC50by50b1N0cmluZygpKSx7d2lkdGg6cixoZWlnaHQ6bn09aS5pbWFnZU1hbmFnZXIuZ2V0UGl4ZWxTaXplKCksbD1NYXRoLnBvdygyLGEudGlsZUlELm92ZXJzY2FsZWRaKSxoPWEudGlsZVNpemUqTWF0aC5wb3coMixpLnRyYW5zZm9ybS50aWxlWm9vbSkvbCxjPWgqKGEudGlsZUlELmNhbm9uaWNhbC54K2EudGlsZUlELndyYXAqbCksdT1oKmEudGlsZUlELmNhbm9uaWNhbC55O3JldHVybiB7dV9pbWFnZTowLHVfcGF0dGVybl90bF9hOnMudGwsdV9wYXR0ZXJuX2JyX2E6cy5icix1X3BhdHRlcm5fdGxfYjpvLnRsLHVfcGF0dGVybl9icl9iOm8uYnIsdV90ZXhzaXplOltyLG5dLHVfbWl4OmUudCx1X3BhdHRlcm5fc2l6ZV9hOnMuZGlzcGxheVNpemUsdV9wYXR0ZXJuX3NpemVfYjpvLmRpc3BsYXlTaXplLHVfc2NhbGVfYTplLmZyb21TY2FsZSx1X3NjYWxlX2I6ZS50b1NjYWxlLHVfdGlsZV91bml0c190b19waXhlbHM6MS9CdChhLDEsaS50cmFuc2Zvcm0udGlsZVpvb20pLHVfcGl4ZWxfY29vcmRfdXBwZXI6W2M+PjE2LHU+PjE2XSx1X3BpeGVsX2Nvb3JkX2xvd2VyOls2NTUzNSZjLDY1NTM1JnVdfX0ocyxyLGEsbykse3VfbWF0cml4OnQsdV9vcGFjaXR5Oml9KSxXZT17ZmlsbEV4dHJ1c2lvbjoodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfbGlnaHRwb3M6bmV3IGUuYU4odCxpLnVfbGlnaHRwb3MpLHVfbGlnaHRpbnRlbnNpdHk6bmV3IGUuYUkodCxpLnVfbGlnaHRpbnRlbnNpdHkpLHVfbGlnaHRjb2xvcjpuZXcgZS5hTih0LGkudV9saWdodGNvbG9yKSx1X3ZlcnRpY2FsX2dyYWRpZW50Om5ldyBlLmFJKHQsaS51X3ZlcnRpY2FsX2dyYWRpZW50KSx1X29wYWNpdHk6bmV3IGUuYUkodCxpLnVfb3BhY2l0eSl9KSxmaWxsRXh0cnVzaW9uUGF0dGVybjoodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfbGlnaHRwb3M6bmV3IGUuYU4odCxpLnVfbGlnaHRwb3MpLHVfbGlnaHRpbnRlbnNpdHk6bmV3IGUuYUkodCxpLnVfbGlnaHRpbnRlbnNpdHkpLHVfbGlnaHRjb2xvcjpuZXcgZS5hTih0LGkudV9saWdodGNvbG9yKSx1X3ZlcnRpY2FsX2dyYWRpZW50Om5ldyBlLmFJKHQsaS51X3ZlcnRpY2FsX2dyYWRpZW50KSx1X2hlaWdodF9mYWN0b3I6bmV3IGUuYUkodCxpLnVfaGVpZ2h0X2ZhY3RvciksdV9pbWFnZTpuZXcgZS5hSCh0LGkudV9pbWFnZSksdV90ZXhzaXplOm5ldyBlLmFPKHQsaS51X3RleHNpemUpLHVfcGl4ZWxfY29vcmRfdXBwZXI6bmV3IGUuYU8odCxpLnVfcGl4ZWxfY29vcmRfdXBwZXIpLHVfcGl4ZWxfY29vcmRfbG93ZXI6bmV3IGUuYU8odCxpLnVfcGl4ZWxfY29vcmRfbG93ZXIpLHVfc2NhbGU6bmV3IGUuYU4odCxpLnVfc2NhbGUpLHVfZmFkZTpuZXcgZS5hSSh0LGkudV9mYWRlKSx1X29wYWNpdHk6bmV3IGUuYUkodCxpLnVfb3BhY2l0eSl9KSxmaWxsOih0LGkpPT4oe3VfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCl9KSxmaWxsUGF0dGVybjoodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfaW1hZ2U6bmV3IGUuYUgodCxpLnVfaW1hZ2UpLHVfdGV4c2l6ZTpuZXcgZS5hTyh0LGkudV90ZXhzaXplKSx1X3BpeGVsX2Nvb3JkX3VwcGVyOm5ldyBlLmFPKHQsaS51X3BpeGVsX2Nvb3JkX3VwcGVyKSx1X3BpeGVsX2Nvb3JkX2xvd2VyOm5ldyBlLmFPKHQsaS51X3BpeGVsX2Nvb3JkX2xvd2VyKSx1X3NjYWxlOm5ldyBlLmFOKHQsaS51X3NjYWxlKSx1X2ZhZGU6bmV3IGUuYUkodCxpLnVfZmFkZSl9KSxmaWxsT3V0bGluZToodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfd29ybGQ6bmV3IGUuYU8odCxpLnVfd29ybGQpfSksZmlsbE91dGxpbmVQYXR0ZXJuOih0LGkpPT4oe3VfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCksdV93b3JsZDpuZXcgZS5hTyh0LGkudV93b3JsZCksdV9pbWFnZTpuZXcgZS5hSCh0LGkudV9pbWFnZSksdV90ZXhzaXplOm5ldyBlLmFPKHQsaS51X3RleHNpemUpLHVfcGl4ZWxfY29vcmRfdXBwZXI6bmV3IGUuYU8odCxpLnVfcGl4ZWxfY29vcmRfdXBwZXIpLHVfcGl4ZWxfY29vcmRfbG93ZXI6bmV3IGUuYU8odCxpLnVfcGl4ZWxfY29vcmRfbG93ZXIpLHVfc2NhbGU6bmV3IGUuYU4odCxpLnVfc2NhbGUpLHVfZmFkZTpuZXcgZS5hSSh0LGkudV9mYWRlKX0pLGNpcmNsZToodCxpKT0+KHt1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6bmV3IGUuYUkodCxpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksdV9zY2FsZV93aXRoX21hcDpuZXcgZS5hSCh0LGkudV9zY2FsZV93aXRoX21hcCksdV9waXRjaF93aXRoX21hcDpuZXcgZS5hSCh0LGkudV9waXRjaF93aXRoX21hcCksdV9leHRydWRlX3NjYWxlOm5ldyBlLmFPKHQsaS51X2V4dHJ1ZGVfc2NhbGUpLHVfZGV2aWNlX3BpeGVsX3JhdGlvOm5ldyBlLmFJKHQsaS51X2RldmljZV9waXhlbF9yYXRpbyksdV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KX0pLGNvbGxpc2lvbkJveDoodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfcGl4ZWxfZXh0cnVkZV9zY2FsZTpuZXcgZS5hTyh0LGkudV9waXhlbF9leHRydWRlX3NjYWxlKX0pLGNvbGxpc2lvbkNpcmNsZToodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfaW52X21hdHJpeDpuZXcgZS5hSih0LGkudV9pbnZfbWF0cml4KSx1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6bmV3IGUuYUkodCxpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksdV92aWV3cG9ydF9zaXplOm5ldyBlLmFPKHQsaS51X3ZpZXdwb3J0X3NpemUpfSksZGVidWc6KHQsaSk9Pih7dV9jb2xvcjpuZXcgZS5hTCh0LGkudV9jb2xvciksdV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KSx1X292ZXJsYXk6bmV3IGUuYUgodCxpLnVfb3ZlcmxheSksdV9vdmVybGF5X3NjYWxlOm5ldyBlLmFJKHQsaS51X292ZXJsYXlfc2NhbGUpfSksY2xpcHBpbmdNYXNrOih0LGkpPT4oe3VfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCl9KSxoZWF0bWFwOih0LGkpPT4oe3VfZXh0cnVkZV9zY2FsZTpuZXcgZS5hSSh0LGkudV9leHRydWRlX3NjYWxlKSx1X2ludGVuc2l0eTpuZXcgZS5hSSh0LGkudV9pbnRlbnNpdHkpLHVfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCl9KSxoZWF0bWFwVGV4dHVyZToodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfd29ybGQ6bmV3IGUuYU8odCxpLnVfd29ybGQpLHVfaW1hZ2U6bmV3IGUuYUgodCxpLnVfaW1hZ2UpLHVfY29sb3JfcmFtcDpuZXcgZS5hSCh0LGkudV9jb2xvcl9yYW1wKSx1X29wYWNpdHk6bmV3IGUuYUkodCxpLnVfb3BhY2l0eSl9KSxoaWxsc2hhZGU6KHQsaSk9Pih7dV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KSx1X2ltYWdlOm5ldyBlLmFIKHQsaS51X2ltYWdlKSx1X2xhdHJhbmdlOm5ldyBlLmFPKHQsaS51X2xhdHJhbmdlKSx1X2xpZ2h0Om5ldyBlLmFPKHQsaS51X2xpZ2h0KSx1X3NoYWRvdzpuZXcgZS5hTCh0LGkudV9zaGFkb3cpLHVfaGlnaGxpZ2h0Om5ldyBlLmFMKHQsaS51X2hpZ2hsaWdodCksdV9hY2NlbnQ6bmV3IGUuYUwodCxpLnVfYWNjZW50KX0pLGhpbGxzaGFkZVByZXBhcmU6KHQsaSk9Pih7dV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KSx1X2ltYWdlOm5ldyBlLmFIKHQsaS51X2ltYWdlKSx1X2RpbWVuc2lvbjpuZXcgZS5hTyh0LGkudV9kaW1lbnNpb24pLHVfem9vbTpuZXcgZS5hSSh0LGkudV96b29tKSx1X3VucGFjazpuZXcgZS5hSyh0LGkudV91bnBhY2spfSksbGluZToodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfcmF0aW86bmV3IGUuYUkodCxpLnVfcmF0aW8pLHVfZGV2aWNlX3BpeGVsX3JhdGlvOm5ldyBlLmFJKHQsaS51X2RldmljZV9waXhlbF9yYXRpbyksdV91bml0c190b19waXhlbHM6bmV3IGUuYU8odCxpLnVfdW5pdHNfdG9fcGl4ZWxzKX0pLGxpbmVHcmFkaWVudDoodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfcmF0aW86bmV3IGUuYUkodCxpLnVfcmF0aW8pLHVfZGV2aWNlX3BpeGVsX3JhdGlvOm5ldyBlLmFJKHQsaS51X2RldmljZV9waXhlbF9yYXRpbyksdV91bml0c190b19waXhlbHM6bmV3IGUuYU8odCxpLnVfdW5pdHNfdG9fcGl4ZWxzKSx1X2ltYWdlOm5ldyBlLmFIKHQsaS51X2ltYWdlKSx1X2ltYWdlX2hlaWdodDpuZXcgZS5hSSh0LGkudV9pbWFnZV9oZWlnaHQpfSksbGluZVBhdHRlcm46KHQsaSk9Pih7dV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KSx1X3RleHNpemU6bmV3IGUuYU8odCxpLnVfdGV4c2l6ZSksdV9yYXRpbzpuZXcgZS5hSSh0LGkudV9yYXRpbyksdV9kZXZpY2VfcGl4ZWxfcmF0aW86bmV3IGUuYUkodCxpLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSx1X2ltYWdlOm5ldyBlLmFIKHQsaS51X2ltYWdlKSx1X3VuaXRzX3RvX3BpeGVsczpuZXcgZS5hTyh0LGkudV91bml0c190b19waXhlbHMpLHVfc2NhbGU6bmV3IGUuYU4odCxpLnVfc2NhbGUpLHVfZmFkZTpuZXcgZS5hSSh0LGkudV9mYWRlKX0pLGxpbmVTREY6KHQsaSk9Pih7dV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KSx1X3JhdGlvOm5ldyBlLmFJKHQsaS51X3JhdGlvKSx1X2RldmljZV9waXhlbF9yYXRpbzpuZXcgZS5hSSh0LGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLHVfdW5pdHNfdG9fcGl4ZWxzOm5ldyBlLmFPKHQsaS51X3VuaXRzX3RvX3BpeGVscyksdV9wYXR0ZXJuc2NhbGVfYTpuZXcgZS5hTyh0LGkudV9wYXR0ZXJuc2NhbGVfYSksdV9wYXR0ZXJuc2NhbGVfYjpuZXcgZS5hTyh0LGkudV9wYXR0ZXJuc2NhbGVfYiksdV9zZGZnYW1tYTpuZXcgZS5hSSh0LGkudV9zZGZnYW1tYSksdV9pbWFnZTpuZXcgZS5hSCh0LGkudV9pbWFnZSksdV90ZXhfeV9hOm5ldyBlLmFJKHQsaS51X3RleF95X2EpLHVfdGV4X3lfYjpuZXcgZS5hSSh0LGkudV90ZXhfeV9iKSx1X21peDpuZXcgZS5hSSh0LGkudV9taXgpfSkscmFzdGVyOih0LGkpPT4oe3VfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCksdV90bF9wYXJlbnQ6bmV3IGUuYU8odCxpLnVfdGxfcGFyZW50KSx1X3NjYWxlX3BhcmVudDpuZXcgZS5hSSh0LGkudV9zY2FsZV9wYXJlbnQpLHVfYnVmZmVyX3NjYWxlOm5ldyBlLmFJKHQsaS51X2J1ZmZlcl9zY2FsZSksdV9mYWRlX3Q6bmV3IGUuYUkodCxpLnVfZmFkZV90KSx1X29wYWNpdHk6bmV3IGUuYUkodCxpLnVfb3BhY2l0eSksdV9pbWFnZTA6bmV3IGUuYUgodCxpLnVfaW1hZ2UwKSx1X2ltYWdlMTpuZXcgZS5hSCh0LGkudV9pbWFnZTEpLHVfYnJpZ2h0bmVzc19sb3c6bmV3IGUuYUkodCxpLnVfYnJpZ2h0bmVzc19sb3cpLHVfYnJpZ2h0bmVzc19oaWdoOm5ldyBlLmFJKHQsaS51X2JyaWdodG5lc3NfaGlnaCksdV9zYXR1cmF0aW9uX2ZhY3RvcjpuZXcgZS5hSSh0LGkudV9zYXR1cmF0aW9uX2ZhY3RvciksdV9jb250cmFzdF9mYWN0b3I6bmV3IGUuYUkodCxpLnVfY29udHJhc3RfZmFjdG9yKSx1X3NwaW5fd2VpZ2h0czpuZXcgZS5hTih0LGkudV9zcGluX3dlaWdodHMpfSksc3ltYm9sSWNvbjoodCxpKT0+KHt1X2lzX3NpemVfem9vbV9jb25zdGFudDpuZXcgZS5hSCh0LGkudV9pc19zaXplX3pvb21fY29uc3RhbnQpLHVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50Om5ldyBlLmFIKHQsaS51X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCksdV9zaXplX3Q6bmV3IGUuYUkodCxpLnVfc2l6ZV90KSx1X3NpemU6bmV3IGUuYUkodCxpLnVfc2l6ZSksdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlOm5ldyBlLmFJKHQsaS51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLHVfcGl0Y2g6bmV3IGUuYUkodCxpLnVfcGl0Y2gpLHVfcm90YXRlX3N5bWJvbDpuZXcgZS5hSCh0LGkudV9yb3RhdGVfc3ltYm9sKSx1X2FzcGVjdF9yYXRpbzpuZXcgZS5hSSh0LGkudV9hc3BlY3RfcmF0aW8pLHVfZmFkZV9jaGFuZ2U6bmV3IGUuYUkodCxpLnVfZmFkZV9jaGFuZ2UpLHVfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCksdV9sYWJlbF9wbGFuZV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbGFiZWxfcGxhbmVfbWF0cml4KSx1X2Nvb3JkX21hdHJpeDpuZXcgZS5hSih0LGkudV9jb29yZF9tYXRyaXgpLHVfaXNfdGV4dDpuZXcgZS5hSCh0LGkudV9pc190ZXh0KSx1X3BpdGNoX3dpdGhfbWFwOm5ldyBlLmFIKHQsaS51X3BpdGNoX3dpdGhfbWFwKSx1X2lzX2Fsb25nX2xpbmU6bmV3IGUuYUgodCxpLnVfaXNfYWxvbmdfbGluZSksdV9pc192YXJpYWJsZV9hbmNob3I6bmV3IGUuYUgodCxpLnVfaXNfdmFyaWFibGVfYW5jaG9yKSx1X3RleHNpemU6bmV3IGUuYU8odCxpLnVfdGV4c2l6ZSksdV90ZXh0dXJlOm5ldyBlLmFIKHQsaS51X3RleHR1cmUpLHVfdHJhbnNsYXRpb246bmV3IGUuYU8odCxpLnVfdHJhbnNsYXRpb24pLHVfcGl0Y2hlZF9zY2FsZTpuZXcgZS5hSSh0LGkudV9waXRjaGVkX3NjYWxlKX0pLHN5bWJvbFNERjoodCxpKT0+KHt1X2lzX3NpemVfem9vbV9jb25zdGFudDpuZXcgZS5hSCh0LGkudV9pc19zaXplX3pvb21fY29uc3RhbnQpLHVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50Om5ldyBlLmFIKHQsaS51X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCksdV9zaXplX3Q6bmV3IGUuYUkodCxpLnVfc2l6ZV90KSx1X3NpemU6bmV3IGUuYUkodCxpLnVfc2l6ZSksdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlOm5ldyBlLmFJKHQsaS51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLHVfcGl0Y2g6bmV3IGUuYUkodCxpLnVfcGl0Y2gpLHVfcm90YXRlX3N5bWJvbDpuZXcgZS5hSCh0LGkudV9yb3RhdGVfc3ltYm9sKSx1X2FzcGVjdF9yYXRpbzpuZXcgZS5hSSh0LGkudV9hc3BlY3RfcmF0aW8pLHVfZmFkZV9jaGFuZ2U6bmV3IGUuYUkodCxpLnVfZmFkZV9jaGFuZ2UpLHVfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCksdV9sYWJlbF9wbGFuZV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbGFiZWxfcGxhbmVfbWF0cml4KSx1X2Nvb3JkX21hdHJpeDpuZXcgZS5hSih0LGkudV9jb29yZF9tYXRyaXgpLHVfaXNfdGV4dDpuZXcgZS5hSCh0LGkudV9pc190ZXh0KSx1X3BpdGNoX3dpdGhfbWFwOm5ldyBlLmFIKHQsaS51X3BpdGNoX3dpdGhfbWFwKSx1X2lzX2Fsb25nX2xpbmU6bmV3IGUuYUgodCxpLnVfaXNfYWxvbmdfbGluZSksdV9pc192YXJpYWJsZV9hbmNob3I6bmV3IGUuYUgodCxpLnVfaXNfdmFyaWFibGVfYW5jaG9yKSx1X3RleHNpemU6bmV3IGUuYU8odCxpLnVfdGV4c2l6ZSksdV90ZXh0dXJlOm5ldyBlLmFIKHQsaS51X3RleHR1cmUpLHVfZ2FtbWFfc2NhbGU6bmV3IGUuYUkodCxpLnVfZ2FtbWFfc2NhbGUpLHVfZGV2aWNlX3BpeGVsX3JhdGlvOm5ldyBlLmFJKHQsaS51X2RldmljZV9waXhlbF9yYXRpbyksdV9pc19oYWxvOm5ldyBlLmFIKHQsaS51X2lzX2hhbG8pLHVfdHJhbnNsYXRpb246bmV3IGUuYU8odCxpLnVfdHJhbnNsYXRpb24pLHVfcGl0Y2hlZF9zY2FsZTpuZXcgZS5hSSh0LGkudV9waXRjaGVkX3NjYWxlKX0pLHN5bWJvbFRleHRBbmRJY29uOih0LGkpPT4oe3VfaXNfc2l6ZV96b29tX2NvbnN0YW50Om5ldyBlLmFIKHQsaS51X2lzX3NpemVfem9vbV9jb25zdGFudCksdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQ6bmV3IGUuYUgodCxpLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSx1X3NpemVfdDpuZXcgZS5hSSh0LGkudV9zaXplX3QpLHVfc2l6ZTpuZXcgZS5hSSh0LGkudV9zaXplKSx1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6bmV3IGUuYUkodCxpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksdV9waXRjaDpuZXcgZS5hSSh0LGkudV9waXRjaCksdV9yb3RhdGVfc3ltYm9sOm5ldyBlLmFIKHQsaS51X3JvdGF0ZV9zeW1ib2wpLHVfYXNwZWN0X3JhdGlvOm5ldyBlLmFJKHQsaS51X2FzcGVjdF9yYXRpbyksdV9mYWRlX2NoYW5nZTpuZXcgZS5hSSh0LGkudV9mYWRlX2NoYW5nZSksdV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KSx1X2xhYmVsX3BsYW5lX21hdHJpeDpuZXcgZS5hSih0LGkudV9sYWJlbF9wbGFuZV9tYXRyaXgpLHVfY29vcmRfbWF0cml4Om5ldyBlLmFKKHQsaS51X2Nvb3JkX21hdHJpeCksdV9pc190ZXh0Om5ldyBlLmFIKHQsaS51X2lzX3RleHQpLHVfcGl0Y2hfd2l0aF9tYXA6bmV3IGUuYUgodCxpLnVfcGl0Y2hfd2l0aF9tYXApLHVfaXNfYWxvbmdfbGluZTpuZXcgZS5hSCh0LGkudV9pc19hbG9uZ19saW5lKSx1X2lzX3ZhcmlhYmxlX2FuY2hvcjpuZXcgZS5hSCh0LGkudV9pc192YXJpYWJsZV9hbmNob3IpLHVfdGV4c2l6ZTpuZXcgZS5hTyh0LGkudV90ZXhzaXplKSx1X3RleHNpemVfaWNvbjpuZXcgZS5hTyh0LGkudV90ZXhzaXplX2ljb24pLHVfdGV4dHVyZTpuZXcgZS5hSCh0LGkudV90ZXh0dXJlKSx1X3RleHR1cmVfaWNvbjpuZXcgZS5hSCh0LGkudV90ZXh0dXJlX2ljb24pLHVfZ2FtbWFfc2NhbGU6bmV3IGUuYUkodCxpLnVfZ2FtbWFfc2NhbGUpLHVfZGV2aWNlX3BpeGVsX3JhdGlvOm5ldyBlLmFJKHQsaS51X2RldmljZV9waXhlbF9yYXRpbyksdV9pc19oYWxvOm5ldyBlLmFIKHQsaS51X2lzX2hhbG8pLHVfdHJhbnNsYXRpb246bmV3IGUuYU8odCxpLnVfdHJhbnNsYXRpb24pLHVfcGl0Y2hlZF9zY2FsZTpuZXcgZS5hSSh0LGkudV9waXRjaGVkX3NjYWxlKX0pLGJhY2tncm91bmQ6KHQsaSk9Pih7dV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KSx1X29wYWNpdHk6bmV3IGUuYUkodCxpLnVfb3BhY2l0eSksdV9jb2xvcjpuZXcgZS5hTCh0LGkudV9jb2xvcil9KSxiYWNrZ3JvdW5kUGF0dGVybjoodCxpKT0+KHt1X21hdHJpeDpuZXcgZS5hSih0LGkudV9tYXRyaXgpLHVfb3BhY2l0eTpuZXcgZS5hSSh0LGkudV9vcGFjaXR5KSx1X2ltYWdlOm5ldyBlLmFIKHQsaS51X2ltYWdlKSx1X3BhdHRlcm5fdGxfYTpuZXcgZS5hTyh0LGkudV9wYXR0ZXJuX3RsX2EpLHVfcGF0dGVybl9icl9hOm5ldyBlLmFPKHQsaS51X3BhdHRlcm5fYnJfYSksdV9wYXR0ZXJuX3RsX2I6bmV3IGUuYU8odCxpLnVfcGF0dGVybl90bF9iKSx1X3BhdHRlcm5fYnJfYjpuZXcgZS5hTyh0LGkudV9wYXR0ZXJuX2JyX2IpLHVfdGV4c2l6ZTpuZXcgZS5hTyh0LGkudV90ZXhzaXplKSx1X21peDpuZXcgZS5hSSh0LGkudV9taXgpLHVfcGF0dGVybl9zaXplX2E6bmV3IGUuYU8odCxpLnVfcGF0dGVybl9zaXplX2EpLHVfcGF0dGVybl9zaXplX2I6bmV3IGUuYU8odCxpLnVfcGF0dGVybl9zaXplX2IpLHVfc2NhbGVfYTpuZXcgZS5hSSh0LGkudV9zY2FsZV9hKSx1X3NjYWxlX2I6bmV3IGUuYUkodCxpLnVfc2NhbGVfYiksdV9waXhlbF9jb29yZF91cHBlcjpuZXcgZS5hTyh0LGkudV9waXhlbF9jb29yZF91cHBlciksdV9waXhlbF9jb29yZF9sb3dlcjpuZXcgZS5hTyh0LGkudV9waXhlbF9jb29yZF9sb3dlciksdV90aWxlX3VuaXRzX3RvX3BpeGVsczpuZXcgZS5hSSh0LGkudV90aWxlX3VuaXRzX3RvX3BpeGVscyl9KSx0ZXJyYWluOih0LGkpPT4oe3VfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCksdV90ZXh0dXJlOm5ldyBlLmFIKHQsaS51X3RleHR1cmUpLHVfZWxlX2RlbHRhOm5ldyBlLmFJKHQsaS51X2VsZV9kZWx0YSksdV9mb2dfbWF0cml4Om5ldyBlLmFKKHQsaS51X2ZvZ19tYXRyaXgpLHVfZm9nX2NvbG9yOm5ldyBlLmFMKHQsaS51X2ZvZ19jb2xvciksdV9mb2dfZ3JvdW5kX2JsZW5kOm5ldyBlLmFJKHQsaS51X2ZvZ19ncm91bmRfYmxlbmQpLHVfZm9nX2dyb3VuZF9ibGVuZF9vcGFjaXR5Om5ldyBlLmFJKHQsaS51X2ZvZ19ncm91bmRfYmxlbmRfb3BhY2l0eSksdV9ob3Jpem9uX2NvbG9yOm5ldyBlLmFMKHQsaS51X2hvcml6b25fY29sb3IpLHVfaG9yaXpvbl9mb2dfYmxlbmQ6bmV3IGUuYUkodCxpLnVfaG9yaXpvbl9mb2dfYmxlbmQpfSksdGVycmFpbkRlcHRoOih0LGkpPT4oe3VfbWF0cml4Om5ldyBlLmFKKHQsaS51X21hdHJpeCksdV9lbGVfZGVsdGE6bmV3IGUuYUkodCxpLnVfZWxlX2RlbHRhKX0pLHRlcnJhaW5Db29yZHM6KHQsaSk9Pih7dV9tYXRyaXg6bmV3IGUuYUoodCxpLnVfbWF0cml4KSx1X3RleHR1cmU6bmV3IGUuYUgodCxpLnVfdGV4dHVyZSksdV90ZXJyYWluX2Nvb3Jkc19pZDpuZXcgZS5hSSh0LGkudV90ZXJyYWluX2Nvb3Jkc19pZCksdV9lbGVfZGVsdGE6bmV3IGUuYUkodCxpLnVfZWxlX2RlbHRhKX0pLHNreToodCxpKT0+KHt1X3NreV9jb2xvcjpuZXcgZS5hTCh0LGkudV9za3lfY29sb3IpLHVfaG9yaXpvbl9jb2xvcjpuZXcgZS5hTCh0LGkudV9ob3Jpem9uX2NvbG9yKSx1X2hvcml6b246bmV3IGUuYUkodCxpLnVfaG9yaXpvbiksdV9za3lfaG9yaXpvbl9ibGVuZDpuZXcgZS5hSSh0LGkudV9za3lfaG9yaXpvbl9ibGVuZCl9KX07Y2xhc3MgJGV7Y29uc3RydWN0b3IodCxlLGkpe3RoaXMuY29udGV4dD10O2NvbnN0IGE9dC5nbDt0aGlzLmJ1ZmZlcj1hLmNyZWF0ZUJ1ZmZlcigpLHRoaXMuZHluYW1pY0RyYXc9Qm9vbGVhbihpKSx0aGlzLmNvbnRleHQudW5iaW5kVkFPKCksdC5iaW5kRWxlbWVudEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpLGEuYnVmZmVyRGF0YShhLkVMRU1FTlRfQVJSQVlfQlVGRkVSLGUuYXJyYXlCdWZmZXIsdGhpcy5keW5hbWljRHJhdz9hLkRZTkFNSUNfRFJBVzphLlNUQVRJQ19EUkFXKSx0aGlzLmR5bmFtaWNEcmF3fHxkZWxldGUgZS5hcnJheUJ1ZmZlcjt9YmluZCgpe3RoaXMuY29udGV4dC5iaW5kRWxlbWVudEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO311cGRhdGVEYXRhKHQpe2NvbnN0IGU9dGhpcy5jb250ZXh0LmdsO2lmKCF0aGlzLmR5bmFtaWNEcmF3KXRocm93IG5ldyBFcnJvcihcIkF0dGVtcHRlZCB0byB1cGRhdGUgZGF0YSB3aGlsZSBub3QgaW4gZHluYW1pYyBtb2RlLlwiKTt0aGlzLmNvbnRleHQudW5iaW5kVkFPKCksdGhpcy5iaW5kKCksZS5idWZmZXJTdWJEYXRhKGUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsMCx0LmFycmF5QnVmZmVyKTt9ZGVzdHJveSgpe3RoaXMuYnVmZmVyJiYodGhpcy5jb250ZXh0LmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmJ1ZmZlciksZGVsZXRlIHRoaXMuYnVmZmVyKTt9fWNvbnN0IFhlPXtJbnQ4OlwiQllURVwiLFVpbnQ4OlwiVU5TSUdORURfQllURVwiLEludDE2OlwiU0hPUlRcIixVaW50MTY6XCJVTlNJR05FRF9TSE9SVFwiLEludDMyOlwiSU5UXCIsVWludDMyOlwiVU5TSUdORURfSU5UXCIsRmxvYXQzMjpcIkZMT0FUXCJ9O2NsYXNzIEtle2NvbnN0cnVjdG9yKHQsZSxpLGEpe3RoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuYXR0cmlidXRlcz1pLHRoaXMuaXRlbVNpemU9ZS5ieXRlc1BlckVsZW1lbnQsdGhpcy5keW5hbWljRHJhdz1hLHRoaXMuY29udGV4dD10O2NvbnN0IHM9dC5nbDt0aGlzLmJ1ZmZlcj1zLmNyZWF0ZUJ1ZmZlcigpLHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpLHMuYnVmZmVyRGF0YShzLkFSUkFZX0JVRkZFUixlLmFycmF5QnVmZmVyLHRoaXMuZHluYW1pY0RyYXc/cy5EWU5BTUlDX0RSQVc6cy5TVEFUSUNfRFJBVyksdGhpcy5keW5hbWljRHJhd3x8ZGVsZXRlIGUuYXJyYXlCdWZmZXI7fWJpbmQoKXt0aGlzLmNvbnRleHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO311cGRhdGVEYXRhKHQpe2lmKHQubGVuZ3RoIT09dGhpcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBMZW5ndGggb2YgbmV3IGRhdGEgaXMgJHt0Lmxlbmd0aH0sIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggY3VycmVudCBsZW5ndGggb2YgJHt0aGlzLmxlbmd0aH1gKTtjb25zdCBlPXRoaXMuY29udGV4dC5nbDt0aGlzLmJpbmQoKSxlLmJ1ZmZlclN1YkRhdGEoZS5BUlJBWV9CVUZGRVIsMCx0LmFycmF5QnVmZmVyKTt9ZW5hYmxlQXR0cmlidXRlcyh0LGUpe2ZvcihsZXQgaT0wO2k8dGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDtpKyspe2NvbnN0IGE9ZS5hdHRyaWJ1dGVzW3RoaXMuYXR0cmlidXRlc1tpXS5uYW1lXTt2b2lkIDAhPT1hJiZ0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGEpO319c2V0VmVydGV4QXR0cmliUG9pbnRlcnModCxlLGkpe2ZvcihsZXQgYT0wO2E8dGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDthKyspe2NvbnN0IHM9dGhpcy5hdHRyaWJ1dGVzW2FdLG89ZS5hdHRyaWJ1dGVzW3MubmFtZV07dm9pZCAwIT09byYmdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8scy5jb21wb25lbnRzLHRbWGVbcy50eXBlXV0sITEsdGhpcy5pdGVtU2l6ZSxzLm9mZnNldCt0aGlzLml0ZW1TaXplKihpfHwwKSk7fX1kZXN0cm95KCl7dGhpcy5idWZmZXImJih0aGlzLmNvbnRleHQuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKSxkZWxldGUgdGhpcy5idWZmZXIpO319Y29uc3QgSmU9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gWWUodCl7dmFyIGU7aWYoSmUuaGFzKHQpKXJldHVybiBKZS5nZXQodCk7e2NvbnN0IGk9bnVsbD09PShlPXQuZ2V0UGFyYW1ldGVyKHQuVkVSU0lPTikpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN0YXJ0c1dpdGgoXCJXZWJHTCAyLjBcIik7cmV0dXJuIEplLnNldCh0LGkpLGl9fWNsYXNzIFFle2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2w9dC5nbCx0aGlzLmRlZmF1bHQ9dGhpcy5nZXREZWZhdWx0KCksdGhpcy5jdXJyZW50PXRoaXMuZGVmYXVsdCx0aGlzLmRpcnR5PSExO31nZXQoKXtyZXR1cm4gdGhpcy5jdXJyZW50fXNldCh0KXt9Z2V0RGVmYXVsdCgpe3JldHVybiB0aGlzLmRlZmF1bHR9c2V0RGVmYXVsdCgpe3RoaXMuc2V0KHRoaXMuZGVmYXVsdCk7fX1jbGFzcyB0aSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtyZXR1cm4gZS5hTS50cmFuc3BhcmVudH1zZXQodCl7Y29uc3QgZT10aGlzLmN1cnJlbnQ7KHQuciE9PWUucnx8dC5nIT09ZS5nfHx0LmIhPT1lLmJ8fHQuYSE9PWUuYXx8dGhpcy5kaXJ0eSkmJih0aGlzLmdsLmNsZWFyQ29sb3IodC5yLHQuZyx0LmIsdC5hKSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExKTt9fWNsYXNzIGVpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiAxfXNldCh0KXsodCE9PXRoaXMuY3VycmVudHx8dGhpcy5kaXJ0eSkmJih0aGlzLmdsLmNsZWFyRGVwdGgodCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMSk7fX1jbGFzcyBpaSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtyZXR1cm4gMH1zZXQodCl7KHQhPT10aGlzLmN1cnJlbnR8fHRoaXMuZGlydHkpJiYodGhpcy5nbC5jbGVhclN0ZW5jaWwodCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMSk7fX1jbGFzcyBhaSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtyZXR1cm4gWyEwLCEwLCEwLCEwXX1zZXQodCl7Y29uc3QgZT10aGlzLmN1cnJlbnQ7KHRbMF0hPT1lWzBdfHx0WzFdIT09ZVsxXXx8dFsyXSE9PWVbMl18fHRbM10hPT1lWzNdfHx0aGlzLmRpcnR5KSYmKHRoaXMuZ2wuY29sb3JNYXNrKHRbMF0sdFsxXSx0WzJdLHRbM10pLHRoaXMuY3VycmVudD10LHRoaXMuZGlydHk9ITEpO319Y2xhc3Mgc2kgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuICEwfXNldCh0KXsodCE9PXRoaXMuY3VycmVudHx8dGhpcy5kaXJ0eSkmJih0aGlzLmdsLmRlcHRoTWFzayh0KSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExKTt9fWNsYXNzIG9pIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiAyNTV9c2V0KHQpeyh0IT09dGhpcy5jdXJyZW50fHx0aGlzLmRpcnR5KSYmKHRoaXMuZ2wuc3RlbmNpbE1hc2sodCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMSk7fX1jbGFzcyByaSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtyZXR1cm4ge2Z1bmM6dGhpcy5nbC5BTFdBWVMscmVmOjAsbWFzazoyNTV9fXNldCh0KXtjb25zdCBlPXRoaXMuY3VycmVudDsodC5mdW5jIT09ZS5mdW5jfHx0LnJlZiE9PWUucmVmfHx0Lm1hc2shPT1lLm1hc2t8fHRoaXMuZGlydHkpJiYodGhpcy5nbC5zdGVuY2lsRnVuYyh0LmZ1bmMsdC5yZWYsdC5tYXNrKSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExKTt9fWNsYXNzIG5pIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe2NvbnN0IHQ9dGhpcy5nbDtyZXR1cm4gW3QuS0VFUCx0LktFRVAsdC5LRUVQXX1zZXQodCl7Y29uc3QgZT10aGlzLmN1cnJlbnQ7KHRbMF0hPT1lWzBdfHx0WzFdIT09ZVsxXXx8dFsyXSE9PWVbMl18fHRoaXMuZGlydHkpJiYodGhpcy5nbC5zdGVuY2lsT3AodFswXSx0WzFdLHRbMl0pLHRoaXMuY3VycmVudD10LHRoaXMuZGlydHk9ITEpO319Y2xhc3MgbGkgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuICExfXNldCh0KXtpZih0PT09dGhpcy5jdXJyZW50JiYhdGhpcy5kaXJ0eSlyZXR1cm47Y29uc3QgZT10aGlzLmdsO3Q/ZS5lbmFibGUoZS5TVEVOQ0lMX1RFU1QpOmUuZGlzYWJsZShlLlNURU5DSUxfVEVTVCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMTt9fWNsYXNzIGhpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiBbMCwxXX1zZXQodCl7Y29uc3QgZT10aGlzLmN1cnJlbnQ7KHRbMF0hPT1lWzBdfHx0WzFdIT09ZVsxXXx8dGhpcy5kaXJ0eSkmJih0aGlzLmdsLmRlcHRoUmFuZ2UodFswXSx0WzFdKSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExKTt9fWNsYXNzIGNpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiAhMX1zZXQodCl7aWYodD09PXRoaXMuY3VycmVudCYmIXRoaXMuZGlydHkpcmV0dXJuO2NvbnN0IGU9dGhpcy5nbDt0P2UuZW5hYmxlKGUuREVQVEhfVEVTVCk6ZS5kaXNhYmxlKGUuREVQVEhfVEVTVCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMTt9fWNsYXNzIHVpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiB0aGlzLmdsLkxFU1N9c2V0KHQpeyh0IT09dGhpcy5jdXJyZW50fHx0aGlzLmRpcnR5KSYmKHRoaXMuZ2wuZGVwdGhGdW5jKHQpLHRoaXMuY3VycmVudD10LHRoaXMuZGlydHk9ITEpO319Y2xhc3MgZGkgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuICExfXNldCh0KXtpZih0PT09dGhpcy5jdXJyZW50JiYhdGhpcy5kaXJ0eSlyZXR1cm47Y29uc3QgZT10aGlzLmdsO3Q/ZS5lbmFibGUoZS5CTEVORCk6ZS5kaXNhYmxlKGUuQkxFTkQpLHRoaXMuY3VycmVudD10LHRoaXMuZGlydHk9ITE7fX1jbGFzcyBfaSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtjb25zdCB0PXRoaXMuZ2w7cmV0dXJuIFt0Lk9ORSx0LlpFUk9dfXNldCh0KXtjb25zdCBlPXRoaXMuY3VycmVudDsodFswXSE9PWVbMF18fHRbMV0hPT1lWzFdfHx0aGlzLmRpcnR5KSYmKHRoaXMuZ2wuYmxlbmRGdW5jKHRbMF0sdFsxXSksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMSk7fX1jbGFzcyBwaSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtyZXR1cm4gZS5hTS50cmFuc3BhcmVudH1zZXQodCl7Y29uc3QgZT10aGlzLmN1cnJlbnQ7KHQuciE9PWUucnx8dC5nIT09ZS5nfHx0LmIhPT1lLmJ8fHQuYSE9PWUuYXx8dGhpcy5kaXJ0eSkmJih0aGlzLmdsLmJsZW5kQ29sb3IodC5yLHQuZyx0LmIsdC5hKSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExKTt9fWNsYXNzIG1pIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiB0aGlzLmdsLkZVTkNfQUREfXNldCh0KXsodCE9PXRoaXMuY3VycmVudHx8dGhpcy5kaXJ0eSkmJih0aGlzLmdsLmJsZW5kRXF1YXRpb24odCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMSk7fX1jbGFzcyBmaSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtyZXR1cm4gITF9c2V0KHQpe2lmKHQ9PT10aGlzLmN1cnJlbnQmJiF0aGlzLmRpcnR5KXJldHVybjtjb25zdCBlPXRoaXMuZ2w7dD9lLmVuYWJsZShlLkNVTExfRkFDRSk6ZS5kaXNhYmxlKGUuQ1VMTF9GQUNFKSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExO319Y2xhc3MgZ2kgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuIHRoaXMuZ2wuQkFDS31zZXQodCl7KHQhPT10aGlzLmN1cnJlbnR8fHRoaXMuZGlydHkpJiYodGhpcy5nbC5jdWxsRmFjZSh0KSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExKTt9fWNsYXNzIHZpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiB0aGlzLmdsLkNDV31zZXQodCl7KHQhPT10aGlzLmN1cnJlbnR8fHRoaXMuZGlydHkpJiYodGhpcy5nbC5mcm9udEZhY2UodCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMSk7fX1jbGFzcyB4aSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtyZXR1cm4gbnVsbH1zZXQodCl7KHQhPT10aGlzLmN1cnJlbnR8fHRoaXMuZGlydHkpJiYodGhpcy5nbC51c2VQcm9ncmFtKHQpLHRoaXMuY3VycmVudD10LHRoaXMuZGlydHk9ITEpO319Y2xhc3MgeWkgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuIHRoaXMuZ2wuVEVYVFVSRTB9c2V0KHQpeyh0IT09dGhpcy5jdXJyZW50fHx0aGlzLmRpcnR5KSYmKHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh0KSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExKTt9fWNsYXNzIGJpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe2NvbnN0IHQ9dGhpcy5nbDtyZXR1cm4gWzAsMCx0LmRyYXdpbmdCdWZmZXJXaWR0aCx0LmRyYXdpbmdCdWZmZXJIZWlnaHRdfXNldCh0KXtjb25zdCBlPXRoaXMuY3VycmVudDsodFswXSE9PWVbMF18fHRbMV0hPT1lWzFdfHx0WzJdIT09ZVsyXXx8dFszXSE9PWVbM118fHRoaXMuZGlydHkpJiYodGhpcy5nbC52aWV3cG9ydCh0WzBdLHRbMV0sdFsyXSx0WzNdKSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExKTt9fWNsYXNzIHdpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiBudWxsfXNldCh0KXtpZih0PT09dGhpcy5jdXJyZW50JiYhdGhpcy5kaXJ0eSlyZXR1cm47Y29uc3QgZT10aGlzLmdsO2UuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsdCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMTt9fWNsYXNzIFRpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiBudWxsfXNldCh0KXtpZih0PT09dGhpcy5jdXJyZW50JiYhdGhpcy5kaXJ0eSlyZXR1cm47Y29uc3QgZT10aGlzLmdsO2UuYmluZFJlbmRlcmJ1ZmZlcihlLlJFTkRFUkJVRkZFUix0KSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExO319Y2xhc3MgSWkgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuIG51bGx9c2V0KHQpe2lmKHQ9PT10aGlzLmN1cnJlbnQmJiF0aGlzLmRpcnR5KXJldHVybjtjb25zdCBlPXRoaXMuZ2w7ZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsdCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMTt9fWNsYXNzIEVpIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiBudWxsfXNldCh0KXtpZih0PT09dGhpcy5jdXJyZW50JiYhdGhpcy5kaXJ0eSlyZXR1cm47Y29uc3QgZT10aGlzLmdsO2UuYmluZEJ1ZmZlcihlLkFSUkFZX0JVRkZFUix0KSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExO319Y2xhc3MgUGkgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuIG51bGx9c2V0KHQpe2NvbnN0IGU9dGhpcy5nbDtlLmJpbmRCdWZmZXIoZS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0KSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExO319Y2xhc3MgQ2kgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuIG51bGx9c2V0KHQpe3ZhciBlO2lmKHQ9PT10aGlzLmN1cnJlbnQmJiF0aGlzLmRpcnR5KXJldHVybjtjb25zdCBpPXRoaXMuZ2w7WWUoaSk/aS5iaW5kVmVydGV4QXJyYXkodCk6bnVsbD09PShlPWkuZ2V0RXh0ZW5zaW9uKFwiT0VTX3ZlcnRleF9hcnJheV9vYmplY3RcIikpfHx2b2lkIDA9PT1lfHxlLmJpbmRWZXJ0ZXhBcnJheU9FUyh0KSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExO319Y2xhc3MgU2kgZXh0ZW5kcyBRZXtnZXREZWZhdWx0KCl7cmV0dXJuIDR9c2V0KHQpe2lmKHQ9PT10aGlzLmN1cnJlbnQmJiF0aGlzLmRpcnR5KXJldHVybjtjb25zdCBlPXRoaXMuZ2w7ZS5waXhlbFN0b3JlaShlLlVOUEFDS19BTElHTk1FTlQsdCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMTt9fWNsYXNzIHppIGV4dGVuZHMgUWV7Z2V0RGVmYXVsdCgpe3JldHVybiAhMX1zZXQodCl7aWYodD09PXRoaXMuY3VycmVudCYmIXRoaXMuZGlydHkpcmV0dXJuO2NvbnN0IGU9dGhpcy5nbDtlLnBpeGVsU3RvcmVpKGUuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLHQpLHRoaXMuY3VycmVudD10LHRoaXMuZGlydHk9ITE7fX1jbGFzcyBEaSBleHRlbmRzIFFle2dldERlZmF1bHQoKXtyZXR1cm4gITF9c2V0KHQpe2lmKHQ9PT10aGlzLmN1cnJlbnQmJiF0aGlzLmRpcnR5KXJldHVybjtjb25zdCBlPXRoaXMuZ2w7ZS5waXhlbFN0b3JlaShlLlVOUEFDS19GTElQX1lfV0VCR0wsdCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMTt9fWNsYXNzIE1pIGV4dGVuZHMgUWV7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KSx0aGlzLmNvbnRleHQ9dCx0aGlzLnBhcmVudD1lO31nZXREZWZhdWx0KCl7cmV0dXJuIG51bGx9fWNsYXNzIEFpIGV4dGVuZHMgTWl7c2V0RGlydHkoKXt0aGlzLmRpcnR5PSEwO31zZXQodCl7aWYodD09PXRoaXMuY3VycmVudCYmIXRoaXMuZGlydHkpcmV0dXJuO3RoaXMuY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KHRoaXMucGFyZW50KTtjb25zdCBlPXRoaXMuZ2w7ZS5mcmFtZWJ1ZmZlclRleHR1cmUyRChlLkZSQU1FQlVGRkVSLGUuQ09MT1JfQVRUQUNITUVOVDAsZS5URVhUVVJFXzJELHQsMCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMTt9fWNsYXNzIFJpIGV4dGVuZHMgTWl7c2V0KHQpe2lmKHQ9PT10aGlzLmN1cnJlbnQmJiF0aGlzLmRpcnR5KXJldHVybjt0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldCh0aGlzLnBhcmVudCk7Y29uc3QgZT10aGlzLmdsO2UuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZS5GUkFNRUJVRkZFUixlLkRFUFRIX0FUVEFDSE1FTlQsZS5SRU5ERVJCVUZGRVIsdCksdGhpcy5jdXJyZW50PXQsdGhpcy5kaXJ0eT0hMTt9fWNsYXNzIGtpIGV4dGVuZHMgTWl7c2V0KHQpe2lmKHQ9PT10aGlzLmN1cnJlbnQmJiF0aGlzLmRpcnR5KXJldHVybjt0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldCh0aGlzLnBhcmVudCk7Y29uc3QgZT10aGlzLmdsO2UuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZS5GUkFNRUJVRkZFUixlLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCxlLlJFTkRFUkJVRkZFUix0KSx0aGlzLmN1cnJlbnQ9dCx0aGlzLmRpcnR5PSExO319Y2xhc3MgTGl7Y29uc3RydWN0b3IodCxlLGksYSxzKXt0aGlzLmNvbnRleHQ9dCx0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9aTtjb25zdCBvPXQuZ2wscj10aGlzLmZyYW1lYnVmZmVyPW8uY3JlYXRlRnJhbWVidWZmZXIoKTtpZih0aGlzLmNvbG9yQXR0YWNobWVudD1uZXcgQWkodCxyKSxhKXRoaXMuZGVwdGhBdHRhY2htZW50PXM/bmV3IGtpKHQscik6bmV3IFJpKHQscik7ZWxzZSBpZihzKXRocm93IG5ldyBFcnJvcihcIlN0ZW5jaWwgY2Fubm90IGJlIHNldCB3aXRob3V0IGRlcHRoXCIpO2lmKG8uY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhvLkZSQU1FQlVGRkVSKSE9PW8uRlJBTUVCVUZGRVJfQ09NUExFVEUpdGhyb3cgbmV3IEVycm9yKFwiRnJhbWVidWZmZXIgaXMgbm90IGNvbXBsZXRlXCIpfWRlc3Ryb3koKXtjb25zdCB0PXRoaXMuY29udGV4dC5nbCxlPXRoaXMuY29sb3JBdHRhY2htZW50LmdldCgpO2lmKGUmJnQuZGVsZXRlVGV4dHVyZShlKSx0aGlzLmRlcHRoQXR0YWNobWVudCl7Y29uc3QgZT10aGlzLmRlcHRoQXR0YWNobWVudC5nZXQoKTtlJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihlKTt9dC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKTt9fWNsYXNzIEZpe2NvbnN0cnVjdG9yKHQsZSxpKXt0aGlzLmJsZW5kRnVuY3Rpb249dCx0aGlzLmJsZW5kQ29sb3I9ZSx0aGlzLm1hc2s9aTt9fUZpLlJlcGxhY2U9WzEsMF0sRmkuZGlzYWJsZWQ9bmV3IEZpKEZpLlJlcGxhY2UsZS5hTS50cmFuc3BhcmVudCxbITEsITEsITEsITFdKSxGaS51bmJsZW5kZWQ9bmV3IEZpKEZpLlJlcGxhY2UsZS5hTS50cmFuc3BhcmVudCxbITAsITAsITAsITBdKSxGaS5hbHBoYUJsZW5kZWQ9bmV3IEZpKFsxLDc3MV0sZS5hTS50cmFuc3BhcmVudCxbITAsITAsITAsITBdKTtjbGFzcyBCaXtjb25zdHJ1Y3Rvcih0KXt2YXIgZSxpO2lmKHRoaXMuZ2w9dCx0aGlzLmNsZWFyQ29sb3I9bmV3IHRpKHRoaXMpLHRoaXMuY2xlYXJEZXB0aD1uZXcgZWkodGhpcyksdGhpcy5jbGVhclN0ZW5jaWw9bmV3IGlpKHRoaXMpLHRoaXMuY29sb3JNYXNrPW5ldyBhaSh0aGlzKSx0aGlzLmRlcHRoTWFzaz1uZXcgc2kodGhpcyksdGhpcy5zdGVuY2lsTWFzaz1uZXcgb2kodGhpcyksdGhpcy5zdGVuY2lsRnVuYz1uZXcgcmkodGhpcyksdGhpcy5zdGVuY2lsT3A9bmV3IG5pKHRoaXMpLHRoaXMuc3RlbmNpbFRlc3Q9bmV3IGxpKHRoaXMpLHRoaXMuZGVwdGhSYW5nZT1uZXcgaGkodGhpcyksdGhpcy5kZXB0aFRlc3Q9bmV3IGNpKHRoaXMpLHRoaXMuZGVwdGhGdW5jPW5ldyB1aSh0aGlzKSx0aGlzLmJsZW5kPW5ldyBkaSh0aGlzKSx0aGlzLmJsZW5kRnVuYz1uZXcgX2kodGhpcyksdGhpcy5ibGVuZENvbG9yPW5ldyBwaSh0aGlzKSx0aGlzLmJsZW5kRXF1YXRpb249bmV3IG1pKHRoaXMpLHRoaXMuY3VsbEZhY2U9bmV3IGZpKHRoaXMpLHRoaXMuY3VsbEZhY2VTaWRlPW5ldyBnaSh0aGlzKSx0aGlzLmZyb250RmFjZT1uZXcgdmkodGhpcyksdGhpcy5wcm9ncmFtPW5ldyB4aSh0aGlzKSx0aGlzLmFjdGl2ZVRleHR1cmU9bmV3IHlpKHRoaXMpLHRoaXMudmlld3BvcnQ9bmV3IGJpKHRoaXMpLHRoaXMuYmluZEZyYW1lYnVmZmVyPW5ldyB3aSh0aGlzKSx0aGlzLmJpbmRSZW5kZXJidWZmZXI9bmV3IFRpKHRoaXMpLHRoaXMuYmluZFRleHR1cmU9bmV3IElpKHRoaXMpLHRoaXMuYmluZFZlcnRleEJ1ZmZlcj1uZXcgRWkodGhpcyksdGhpcy5iaW5kRWxlbWVudEJ1ZmZlcj1uZXcgUGkodGhpcyksdGhpcy5iaW5kVmVydGV4QXJyYXk9bmV3IENpKHRoaXMpLHRoaXMucGl4ZWxTdG9yZVVucGFjaz1uZXcgU2kodGhpcyksdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYT1uZXcgemkodGhpcyksdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFk9bmV3IERpKHRoaXMpLHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljPXQuZ2V0RXh0ZW5zaW9uKFwiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljXCIpfHx0LmdldEV4dGVuc2lvbihcIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWNcIil8fHQuZ2V0RXh0ZW5zaW9uKFwiV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpY1wiKSx0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYyYmKHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljTWF4PXQuZ2V0UGFyYW1ldGVyKHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCkpLHRoaXMubWF4VGV4dHVyZVNpemU9dC5nZXRQYXJhbWV0ZXIodC5NQVhfVEVYVFVSRV9TSVpFKSxZZSh0KSl7dGhpcy5IQUxGX0ZMT0FUPXQuSEFMRl9GTE9BVDtjb25zdCBhPXQuZ2V0RXh0ZW5zaW9uKFwiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0XCIpO3RoaXMuUkdCQTE2Rj1udWxsIT09KGU9dC5SR0JBMTZGKSYmdm9pZCAwIT09ZT9lOm51bGw9PWE/dm9pZCAwOmEuUkdCQTE2Rl9FWFQsdGhpcy5SR0IxNkY9bnVsbCE9PShpPXQuUkdCMTZGKSYmdm9pZCAwIT09aT9pOm51bGw9PWE/dm9pZCAwOmEuUkdCMTZGX0VYVCx0LmdldEV4dGVuc2lvbihcIkVYVF9jb2xvcl9idWZmZXJfZmxvYXRcIik7fWVsc2Uge3QuZ2V0RXh0ZW5zaW9uKFwiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0XCIpLHQuZ2V0RXh0ZW5zaW9uKFwiT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXJcIik7Y29uc3QgZT10LmdldEV4dGVuc2lvbihcIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRcIik7dGhpcy5IQUxGX0ZMT0FUPW51bGw9PWU/dm9pZCAwOmUuSEFMRl9GTE9BVF9PRVM7fX1zZXREZWZhdWx0KCl7dGhpcy51bmJpbmRWQU8oKSx0aGlzLmNsZWFyQ29sb3Iuc2V0RGVmYXVsdCgpLHRoaXMuY2xlYXJEZXB0aC5zZXREZWZhdWx0KCksdGhpcy5jbGVhclN0ZW5jaWwuc2V0RGVmYXVsdCgpLHRoaXMuY29sb3JNYXNrLnNldERlZmF1bHQoKSx0aGlzLmRlcHRoTWFzay5zZXREZWZhdWx0KCksdGhpcy5zdGVuY2lsTWFzay5zZXREZWZhdWx0KCksdGhpcy5zdGVuY2lsRnVuYy5zZXREZWZhdWx0KCksdGhpcy5zdGVuY2lsT3Auc2V0RGVmYXVsdCgpLHRoaXMuc3RlbmNpbFRlc3Quc2V0RGVmYXVsdCgpLHRoaXMuZGVwdGhSYW5nZS5zZXREZWZhdWx0KCksdGhpcy5kZXB0aFRlc3Quc2V0RGVmYXVsdCgpLHRoaXMuZGVwdGhGdW5jLnNldERlZmF1bHQoKSx0aGlzLmJsZW5kLnNldERlZmF1bHQoKSx0aGlzLmJsZW5kRnVuYy5zZXREZWZhdWx0KCksdGhpcy5ibGVuZENvbG9yLnNldERlZmF1bHQoKSx0aGlzLmJsZW5kRXF1YXRpb24uc2V0RGVmYXVsdCgpLHRoaXMuY3VsbEZhY2Uuc2V0RGVmYXVsdCgpLHRoaXMuY3VsbEZhY2VTaWRlLnNldERlZmF1bHQoKSx0aGlzLmZyb250RmFjZS5zZXREZWZhdWx0KCksdGhpcy5wcm9ncmFtLnNldERlZmF1bHQoKSx0aGlzLmFjdGl2ZVRleHR1cmUuc2V0RGVmYXVsdCgpLHRoaXMuYmluZEZyYW1lYnVmZmVyLnNldERlZmF1bHQoKSx0aGlzLnBpeGVsU3RvcmVVbnBhY2suc2V0RGVmYXVsdCgpLHRoaXMucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0RGVmYXVsdCgpLHRoaXMucGl4ZWxTdG9yZVVucGFja0ZsaXBZLnNldERlZmF1bHQoKTt9c2V0RGlydHkoKXt0aGlzLmNsZWFyQ29sb3IuZGlydHk9ITAsdGhpcy5jbGVhckRlcHRoLmRpcnR5PSEwLHRoaXMuY2xlYXJTdGVuY2lsLmRpcnR5PSEwLHRoaXMuY29sb3JNYXNrLmRpcnR5PSEwLHRoaXMuZGVwdGhNYXNrLmRpcnR5PSEwLHRoaXMuc3RlbmNpbE1hc2suZGlydHk9ITAsdGhpcy5zdGVuY2lsRnVuYy5kaXJ0eT0hMCx0aGlzLnN0ZW5jaWxPcC5kaXJ0eT0hMCx0aGlzLnN0ZW5jaWxUZXN0LmRpcnR5PSEwLHRoaXMuZGVwdGhSYW5nZS5kaXJ0eT0hMCx0aGlzLmRlcHRoVGVzdC5kaXJ0eT0hMCx0aGlzLmRlcHRoRnVuYy5kaXJ0eT0hMCx0aGlzLmJsZW5kLmRpcnR5PSEwLHRoaXMuYmxlbmRGdW5jLmRpcnR5PSEwLHRoaXMuYmxlbmRDb2xvci5kaXJ0eT0hMCx0aGlzLmJsZW5kRXF1YXRpb24uZGlydHk9ITAsdGhpcy5jdWxsRmFjZS5kaXJ0eT0hMCx0aGlzLmN1bGxGYWNlU2lkZS5kaXJ0eT0hMCx0aGlzLmZyb250RmFjZS5kaXJ0eT0hMCx0aGlzLnByb2dyYW0uZGlydHk9ITAsdGhpcy5hY3RpdmVUZXh0dXJlLmRpcnR5PSEwLHRoaXMudmlld3BvcnQuZGlydHk9ITAsdGhpcy5iaW5kRnJhbWVidWZmZXIuZGlydHk9ITAsdGhpcy5iaW5kUmVuZGVyYnVmZmVyLmRpcnR5PSEwLHRoaXMuYmluZFRleHR1cmUuZGlydHk9ITAsdGhpcy5iaW5kVmVydGV4QnVmZmVyLmRpcnR5PSEwLHRoaXMuYmluZEVsZW1lbnRCdWZmZXIuZGlydHk9ITAsdGhpcy5iaW5kVmVydGV4QXJyYXkuZGlydHk9ITAsdGhpcy5waXhlbFN0b3JlVW5wYWNrLmRpcnR5PSEwLHRoaXMucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuZGlydHk9ITAsdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkuZGlydHk9ITA7fWNyZWF0ZUluZGV4QnVmZmVyKHQsZSl7cmV0dXJuIG5ldyAkZSh0aGlzLHQsZSl9Y3JlYXRlVmVydGV4QnVmZmVyKHQsZSxpKXtyZXR1cm4gbmV3IEtlKHRoaXMsdCxlLGkpfWNyZWF0ZVJlbmRlcmJ1ZmZlcih0LGUsaSl7Y29uc3QgYT10aGlzLmdsLHM9YS5jcmVhdGVSZW5kZXJidWZmZXIoKTtyZXR1cm4gdGhpcy5iaW5kUmVuZGVyYnVmZmVyLnNldChzKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoYS5SRU5ERVJCVUZGRVIsdCxlLGkpLHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5zZXQobnVsbCksc31jcmVhdGVGcmFtZWJ1ZmZlcih0LGUsaSxhKXtyZXR1cm4gbmV3IExpKHRoaXMsdCxlLGksYSl9Y2xlYXIoe2NvbG9yOnQsZGVwdGg6ZSxzdGVuY2lsOml9KXtjb25zdCBhPXRoaXMuZ2w7bGV0IHM9MDt0JiYoc3w9YS5DT0xPUl9CVUZGRVJfQklULHRoaXMuY2xlYXJDb2xvci5zZXQodCksdGhpcy5jb2xvck1hc2suc2V0KFshMCwhMCwhMCwhMF0pKSx2b2lkIDAhPT1lJiYoc3w9YS5ERVBUSF9CVUZGRVJfQklULHRoaXMuZGVwdGhSYW5nZS5zZXQoWzAsMV0pLHRoaXMuY2xlYXJEZXB0aC5zZXQoZSksdGhpcy5kZXB0aE1hc2suc2V0KCEwKSksdm9pZCAwIT09aSYmKHN8PWEuU1RFTkNJTF9CVUZGRVJfQklULHRoaXMuY2xlYXJTdGVuY2lsLnNldChpKSx0aGlzLnN0ZW5jaWxNYXNrLnNldCgyNTUpKSxhLmNsZWFyKHMpO31zZXRDdWxsRmFjZSh0KXshMT09PXQuZW5hYmxlP3RoaXMuY3VsbEZhY2Uuc2V0KCExKToodGhpcy5jdWxsRmFjZS5zZXQoITApLHRoaXMuY3VsbEZhY2VTaWRlLnNldCh0Lm1vZGUpLHRoaXMuZnJvbnRGYWNlLnNldCh0LmZyb250RmFjZSkpO31zZXREZXB0aE1vZGUodCl7dC5mdW5jIT09dGhpcy5nbC5BTFdBWVN8fHQubWFzaz8odGhpcy5kZXB0aFRlc3Quc2V0KCEwKSx0aGlzLmRlcHRoRnVuYy5zZXQodC5mdW5jKSx0aGlzLmRlcHRoTWFzay5zZXQodC5tYXNrKSx0aGlzLmRlcHRoUmFuZ2Uuc2V0KHQucmFuZ2UpKTp0aGlzLmRlcHRoVGVzdC5zZXQoITEpO31zZXRTdGVuY2lsTW9kZSh0KXt0LnRlc3QuZnVuYyE9PXRoaXMuZ2wuQUxXQVlTfHx0Lm1hc2s/KHRoaXMuc3RlbmNpbFRlc3Quc2V0KCEwKSx0aGlzLnN0ZW5jaWxNYXNrLnNldCh0Lm1hc2spLHRoaXMuc3RlbmNpbE9wLnNldChbdC5mYWlsLHQuZGVwdGhGYWlsLHQucGFzc10pLHRoaXMuc3RlbmNpbEZ1bmMuc2V0KHtmdW5jOnQudGVzdC5mdW5jLHJlZjp0LnJlZixtYXNrOnQudGVzdC5tYXNrfSkpOnRoaXMuc3RlbmNpbFRlc3Quc2V0KCExKTt9c2V0Q29sb3JNb2RlKHQpe2UuYUUodC5ibGVuZEZ1bmN0aW9uLEZpLlJlcGxhY2UpP3RoaXMuYmxlbmQuc2V0KCExKToodGhpcy5ibGVuZC5zZXQoITApLHRoaXMuYmxlbmRGdW5jLnNldCh0LmJsZW5kRnVuY3Rpb24pLHRoaXMuYmxlbmRDb2xvci5zZXQodC5ibGVuZENvbG9yKSksdGhpcy5jb2xvck1hc2suc2V0KHQubWFzayk7fWNyZWF0ZVZlcnRleEFycmF5KCl7dmFyIHQ7cmV0dXJuIFllKHRoaXMuZ2wpP3RoaXMuZ2wuY3JlYXRlVmVydGV4QXJyYXkoKTpudWxsPT09KHQ9dGhpcy5nbC5nZXRFeHRlbnNpb24oXCJPRVNfdmVydGV4X2FycmF5X29iamVjdFwiKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuY3JlYXRlVmVydGV4QXJyYXlPRVMoKX1kZWxldGVWZXJ0ZXhBcnJheSh0KXt2YXIgZTtyZXR1cm4gWWUodGhpcy5nbCk/dGhpcy5nbC5kZWxldGVWZXJ0ZXhBcnJheSh0KTpudWxsPT09KGU9dGhpcy5nbC5nZXRFeHRlbnNpb24oXCJPRVNfdmVydGV4X2FycmF5X29iamVjdFwiKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuZGVsZXRlVmVydGV4QXJyYXlPRVModCl9dW5iaW5kVkFPKCl7dGhpcy5iaW5kVmVydGV4QXJyYXkuc2V0KG51bGwpO319Y2xhc3MgT2l7Y29uc3RydWN0b3IodCxlLGkpe3RoaXMuZnVuYz10LHRoaXMubWFzaz1lLHRoaXMucmFuZ2U9aTt9fU9pLlJlYWRPbmx5PSExLE9pLlJlYWRXcml0ZT0hMCxPaS5kaXNhYmxlZD1uZXcgT2koNTE5LE9pLlJlYWRPbmx5LFswLDFdKTtjb25zdCBOaT03NjgwO2NsYXNzIFVpe2NvbnN0cnVjdG9yKHQsZSxpLGEscyxvKXt0aGlzLnRlc3Q9dCx0aGlzLnJlZj1lLHRoaXMubWFzaz1pLHRoaXMuZmFpbD1hLHRoaXMuZGVwdGhGYWlsPXMsdGhpcy5wYXNzPW87fX1VaS5kaXNhYmxlZD1uZXcgVWkoe2Z1bmM6NTE5LG1hc2s6MH0sMCwwLE5pLE5pLE5pKTtjbGFzcyBqaXtjb25zdHJ1Y3Rvcih0LGUsaSl7dGhpcy5lbmFibGU9dCx0aGlzLm1vZGU9ZSx0aGlzLmZyb250RmFjZT1pO319bGV0IFppO2Z1bmN0aW9uIHFpKHQsaSxhLHMsbyl7Y29uc3Qgcj10LmNvbnRleHQsbj1yLmdsLGw9dC51c2VQcm9ncmFtKFwiY29sbGlzaW9uQm94XCIpLGg9W107bGV0IGM9MCx1PTA7Zm9yKGxldCBfPTA7XzxzLmxlbmd0aDtfKyspe2NvbnN0IHA9c1tfXSxtPWkuZ2V0VGlsZShwKS5nZXRCdWNrZXQoYSk7aWYoIW0pY29udGludWU7Y29uc3QgZj1vP20udGV4dENvbGxpc2lvbkJveDptLmljb25Db2xsaXNpb25Cb3gsZz1tLmNvbGxpc2lvbkNpcmNsZUFycmF5O2lmKGcubGVuZ3RoPjApe2NvbnN0IGk9ZS5IKCk7ZS5hUShpLG0ucGxhY2VtZW50SW52UHJvak1hdHJpeCx0LnRyYW5zZm9ybS5nbENvb3JkTWF0cml4KSxlLmFRKGksaSxtLnBsYWNlbWVudFZpZXdwb3J0TWF0cml4KSxoLnB1c2goe2NpcmNsZUFycmF5OmcsY2lyY2xlT2Zmc2V0OnUsdHJhbnNmb3JtOnAucG9zTWF0cml4LGludlRyYW5zZm9ybTppLGNvb3JkOnB9KSxjKz1nLmxlbmd0aC80LHU9Yzt9ZiYmbC5kcmF3KHIsbi5MSU5FUyxPaS5kaXNhYmxlZCxVaS5kaXNhYmxlZCx0LmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSxqaS5kaXNhYmxlZCx7dV9tYXRyaXg6cC5wb3NNYXRyaXgsdV9waXhlbF9leHRydWRlX3NjYWxlOlsxLyhkPXQudHJhbnNmb3JtKS53aWR0aCwxL2QuaGVpZ2h0XX0sdC5zdHlsZS5tYXAudGVycmFpbiYmdC5zdHlsZS5tYXAudGVycmFpbi5nZXRUZXJyYWluRGF0YShwKSxhLmlkLGYubGF5b3V0VmVydGV4QnVmZmVyLGYuaW5kZXhCdWZmZXIsZi5zZWdtZW50cyxudWxsLHQudHJhbnNmb3JtLnpvb20sbnVsbCxudWxsLGYuY29sbGlzaW9uVmVydGV4QnVmZmVyKTt9dmFyIGQ7aWYoIW98fCFoLmxlbmd0aClyZXR1cm47Y29uc3QgXz10LnVzZVByb2dyYW0oXCJjb2xsaXNpb25DaXJjbGVcIikscD1uZXcgZS5hUjtwLnJlc2l6ZSg0KmMpLHAuX3RyaW0oKTtsZXQgbT0wO2Zvcihjb25zdCB0IG9mIGgpZm9yKGxldCBlPTA7ZTx0LmNpcmNsZUFycmF5Lmxlbmd0aC80O2UrKyl7Y29uc3QgaT00KmUsYT10LmNpcmNsZUFycmF5W2krMF0scz10LmNpcmNsZUFycmF5W2krMV0sbz10LmNpcmNsZUFycmF5W2krMl0scj10LmNpcmNsZUFycmF5W2krM107cC5lbXBsYWNlKG0rKyxhLHMsbyxyLDApLHAuZW1wbGFjZShtKyssYSxzLG8sciwxKSxwLmVtcGxhY2UobSsrLGEscyxvLHIsMikscC5lbXBsYWNlKG0rKyxhLHMsbyxyLDMpO30oIVppfHxaaS5sZW5ndGg8MipjKSYmKFppPWZ1bmN0aW9uKHQpe2NvbnN0IGk9Mip0LGE9bmV3IGUuYVQ7YS5yZXNpemUoaSksYS5fdHJpbSgpO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IGU9Nip0O2EudWludDE2W2UrMF09NCp0KzAsYS51aW50MTZbZSsxXT00KnQrMSxhLnVpbnQxNltlKzJdPTQqdCsyLGEudWludDE2W2UrM109NCp0KzIsYS51aW50MTZbZSs0XT00KnQrMyxhLnVpbnQxNltlKzVdPTQqdCswO31yZXR1cm4gYX0oYykpO2NvbnN0IGY9ci5jcmVhdGVJbmRleEJ1ZmZlcihaaSwhMCksZz1yLmNyZWF0ZVZlcnRleEJ1ZmZlcihwLGUuYVMubWVtYmVycywhMCk7Zm9yKGNvbnN0IGkgb2YgaCl7Y29uc3Qgcz1TZShpLnRyYW5zZm9ybSxpLmludlRyYW5zZm9ybSx0LnRyYW5zZm9ybSk7Xy5kcmF3KHIsbi5UUklBTkdMRVMsT2kuZGlzYWJsZWQsVWkuZGlzYWJsZWQsdC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksamkuZGlzYWJsZWQscyx0LnN0eWxlLm1hcC50ZXJyYWluJiZ0LnN0eWxlLm1hcC50ZXJyYWluLmdldFRlcnJhaW5EYXRhKGkuY29vcmQpLGEuaWQsZyxmLGUuYTAuc2ltcGxlU2VnbWVudCgwLDIqaS5jaXJjbGVPZmZzZXQsaS5jaXJjbGVBcnJheS5sZW5ndGgsaS5jaXJjbGVBcnJheS5sZW5ndGgvMiksbnVsbCx0LnRyYW5zZm9ybS56b29tLG51bGwsbnVsbCxudWxsKTt9Zy5kZXN0cm95KCksZi5kZXN0cm95KCk7fWppLmRpc2FibGVkPW5ldyBqaSghMSwxMDI5LDIzMDUpLGppLmJhY2tDQ1c9bmV3IGppKCEwLDEwMjksMjMwNSk7Y29uc3QgVmk9ZS5hbihuZXcgRmxvYXQzMkFycmF5KDE2KSk7ZnVuY3Rpb24gR2kodCxpLGEscyxvLHIpe2NvbnN0e2hvcml6b250YWxBbGlnbjpuLHZlcnRpY2FsQWxpZ246bH09ZS5hdSh0KTtyZXR1cm4gbmV3IGUuUCgoLShuLS41KSppL28rc1swXSkqciwoLShsLS41KSphL28rc1sxXSkqcil9ZnVuY3Rpb24gSGkodCxpLGEscyxvLHIpe2NvbnN0IG49aS50aWxlQW5jaG9yUG9pbnQuYWRkKG5ldyBlLlAoaS50cmFuc2xhdGlvblswXSxpLnRyYW5zbGF0aW9uWzFdKSk7aWYoaS5waXRjaFdpdGhNYXApe2xldCB0PXMubXVsdChyKTthfHwodD10LnJvdGF0ZSgtbykpO2NvbnN0IGU9bi5hZGQodCk7cmV0dXJuIHh0KGUueCxlLnksaS5sYWJlbFBsYW5lTWF0cml4LGkuZ2V0RWxldmF0aW9uKS5wb2ludH1pZihhKXtjb25zdCBlPVN0KGkudGlsZUFuY2hvclBvaW50LngrMSxpLnRpbGVBbmNob3JQb2ludC55LGkpLnBvaW50LnN1Yih0KSxhPU1hdGguYXRhbihlLnkvZS54KSsoZS54PDA/TWF0aC5QSTowKTtyZXR1cm4gdC5hZGQocy5yb3RhdGUoYSkpfXJldHVybiB0LmFkZChzKX1mdW5jdGlvbiBXaSh0LGksYSxzLG8scixuLGwsaCxjLHUsZCxfLHApe2NvbnN0IG09dC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LGY9dC50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSxnPXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXksdj17fTtmLmNsZWFyKCk7Zm9yKGxldCBnPTA7ZzxtLmxlbmd0aDtnKyspe2NvbnN0IHg9bS5nZXQoZykseT14LmhpZGRlbnx8IXguY3Jvc3NUaWxlSUR8fHQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCYmIXgucGxhY2VkT3JpZW50YXRpb24/bnVsbDpzW3guY3Jvc3NUaWxlSURdO2lmKHkpe2NvbnN0IHM9bmV3IGUuUCh4LmFuY2hvclgseC5hbmNob3JZKSxtPXtnZXRFbGV2YXRpb246cCx3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodCxsYWJlbFBsYW5lTWF0cml4OnIsbGluZVZlcnRleEFycmF5Om51bGwscGl0Y2hXaXRoTWFwOmEscHJvamVjdGlvbjp1LHByb2plY3Rpb25DYWNoZTpudWxsLHRpbGVBbmNob3JQb2ludDpzLHRyYW5zbGF0aW9uOmQsdW53cmFwcGVkVGlsZUlEOl99LGc9YT94dChzLngscy55LG4scCk6U3Qocy54LHMueSxtKSxiPXl0KG8uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxnLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSk7bGV0IHc9ZS5haSh0LnRleHRTaXplRGF0YSxoLHgpKmIvZS5hcDthJiYodyo9dC50aWxlUGl4ZWxSYXRpby9sKTtjb25zdHt3aWR0aDpULGhlaWdodDpJLGFuY2hvcjpFLHRleHRPZmZzZXQ6UCx0ZXh0Qm94U2NhbGU6Q309eSxTPUdpKEUsVCxJLFAsQyx3KSx6PXUuZ2V0UGl0Y2hlZFRleHRDb3JyZWN0aW9uKG8scy5hZGQobmV3IGUuUChkWzBdLGRbMV0pKSxfKSxEPUhpKGcucG9pbnQsbSxpLFMsby5hbmdsZSx6KSxNPXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCYmeC5wbGFjZWRPcmllbnRhdGlvbj09PWUuYWgudmVydGljYWw/TWF0aC5QSS8yOjA7Zm9yKGxldCB0PTA7dDx4Lm51bUdseXBoczt0KyspZS5haihmLEQsTSk7YyYmeC5hc3NvY2lhdGVkSWNvbkluZGV4Pj0wJiYodlt4LmFzc29jaWF0ZWRJY29uSW5kZXhdPXtzaGlmdGVkQW5jaG9yOkQsYW5nbGU6TX0pO31lbHNlIFJ0KHgubnVtR2x5cGhzLGYpO31pZihjKXtnLmNsZWFyKCk7Y29uc3QgaT10Lmljb24ucGxhY2VkU3ltYm9sQXJyYXk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IGE9aS5nZXQodCk7aWYoYS5oaWRkZW4pUnQoYS5udW1HbHlwaHMsZyk7ZWxzZSB7Y29uc3QgaT12W3RdO2lmKGkpZm9yKGxldCB0PTA7dDxhLm51bUdseXBoczt0KyspZS5haihnLGkuc2hpZnRlZEFuY2hvcixpLmFuZ2xlKTtlbHNlIFJ0KGEubnVtR2x5cGhzLGcpO319dC5pY29uLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShnKTt9dC50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShmKTt9ZnVuY3Rpb24gJGkodCxlLGkpe3JldHVybiBpLmljb25zSW5UZXh0JiZlP1wic3ltYm9sVGV4dEFuZEljb25cIjp0P1wic3ltYm9sU0RGXCI6XCJzeW1ib2xJY29uXCJ9ZnVuY3Rpb24gWGkodCxpLGEscyxvLHIsbixsLGgsYyx1LGQpe2NvbnN0IF89dC5jb250ZXh0LHA9Xy5nbCxtPXQudHJhbnNmb3JtLGY9aWUoKSxnPVwibWFwXCI9PT1sLHY9XCJtYXBcIj09PWgseD1cInZpZXdwb3J0XCIhPT1sJiZcInBvaW50XCIhPT1hLmxheW91dC5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpLHk9ZyYmIXYmJiF4LGI9IXYmJngsdz0hYS5sYXlvdXQuZ2V0KFwic3ltYm9sLXNvcnQta2V5XCIpLmlzQ29uc3RhbnQoKTtsZXQgVD0hMTtjb25zdCBJPXQuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCxPaS5SZWFkT25seSksRT1hLl91bmV2YWx1YXRlZExheW91dC5oYXNWYWx1ZShcInRleHQtdmFyaWFibGUtYW5jaG9yXCIpfHxhLl91bmV2YWx1YXRlZExheW91dC5oYXNWYWx1ZShcInRleHQtdmFyaWFibGUtYW5jaG9yLW9mZnNldFwiKSxQPVtdLEM9Zi5nZXRDaXJjbGVSYWRpdXNDb3JyZWN0aW9uKG0pO2Zvcihjb25zdCBsIG9mIHMpe2NvbnN0IHM9aS5nZXRUaWxlKGwpLGg9cy5nZXRCdWNrZXQoYSk7aWYoIWgpY29udGludWU7Y29uc3QgdT1vP2gudGV4dDpoLmljb247aWYoIXV8fCF1LnNlZ21lbnRzLmdldCgpLmxlbmd0aHx8IXUuaGFzVmlzaWJsZVZlcnRpY2VzKWNvbnRpbnVlO2NvbnN0IGQ9dS5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGEuaWQpLF89b3x8aC5zZGZJY29ucyxJPW8/aC50ZXh0U2l6ZURhdGE6aC5pY29uU2l6ZURhdGEsUz12fHwwIT09bS5waXRjaCx6PXQudXNlUHJvZ3JhbSgkaShfLG8saCksZCksRD1lLmFnKEksbS56b29tKSxNPXQuc3R5bGUubWFwLnRlcnJhaW4mJnQuc3R5bGUubWFwLnRlcnJhaW4uZ2V0VGVycmFpbkRhdGEobCk7bGV0IEEsUixrLEwsRj1bMCwwXSxCPW51bGw7aWYobylSPXMuZ2x5cGhBdGxhc1RleHR1cmUsaz1wLkxJTkVBUixBPXMuZ2x5cGhBdGxhc1RleHR1cmUuc2l6ZSxoLmljb25zSW5UZXh0JiYoRj1zLmltYWdlQXRsYXNUZXh0dXJlLnNpemUsQj1zLmltYWdlQXRsYXNUZXh0dXJlLEw9U3x8dC5vcHRpb25zLnJvdGF0aW5nfHx0Lm9wdGlvbnMuem9vbWluZ3x8XCJjb21wb3NpdGVcIj09PUkua2luZHx8XCJjYW1lcmFcIj09PUkua2luZD9wLkxJTkVBUjpwLk5FQVJFU1QpO2Vsc2Uge2NvbnN0IGU9MSE9PWEubGF5b3V0LmdldChcImljb24tc2l6ZVwiKS5jb25zdGFudE9yKDApfHxoLmljb25zTmVlZExpbmVhcjtSPXMuaW1hZ2VBdGxhc1RleHR1cmUsaz1ffHx0Lm9wdGlvbnMucm90YXRpbmd8fHQub3B0aW9ucy56b29taW5nfHxlfHxTP3AuTElORUFSOnAuTkVBUkVTVCxBPXMuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZTt9Y29uc3QgTz1CdChzLDEsdC50cmFuc2Zvcm0uem9vbSksTj1iP2wucG9zTWF0cml4OlZpLFU9Z3QoTix2LGcsdC50cmFuc2Zvcm0sTyksaj12dChOLHYsZyx0LnRyYW5zZm9ybSxPKSxaPXZ0KGwucG9zTWF0cml4LHYsZyx0LnRyYW5zZm9ybSxPKSxxPWYudHJhbnNsYXRlUG9zaXRpb24odC50cmFuc2Zvcm0scyxyLG4pLFY9RSYmaC5oYXNUZXh0RGF0YSgpLEc9XCJub25lXCIhPT1hLmxheW91dC5nZXQoXCJpY29uLXRleHQtZml0XCIpJiZWJiZoLmhhc0ljb25EYXRhKCk7aWYoeCl7Y29uc3QgZT10LnN0eWxlLm1hcC50ZXJyYWluPyhlLGkpPT50LnN0eWxlLm1hcC50ZXJyYWluLmdldEVsZXZhdGlvbihsLGUsaSk6bnVsbCxpPVwibWFwXCI9PT1hLmxheW91dC5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKTt3dChoLGwucG9zTWF0cml4LHQsbyxVLFosdixjLGksZixsLnRvVW53cmFwcGVkKCksbS53aWR0aCxtLmhlaWdodCxxLGUpO31jb25zdCBIPWwucG9zTWF0cml4LFc9byYmRXx8RywkPXh8fFc/Vmk6VSxYPWosSz1fJiYwIT09YS5wYWludC5nZXQobz9cInRleHQtaGFsby13aWR0aFwiOlwiaWNvbi1oYWxvLXdpZHRoXCIpLmNvbnN0YW50T3IoMSk7bGV0IEo7Sj1fP2guaWNvbnNJblRleHQ/VmUoSS5raW5kLEQseSx2LHgsVyx0LEgsJCxYLHEsQSxGLEMpOnFlKEkua2luZCxELHksdix4LFcsdCxILCQsWCxxLG8sQSwhMCxDKTpaZShJLmtpbmQsRCx5LHYseCxXLHQsSCwkLFgscSxvLEEsQyk7Y29uc3QgWT17cHJvZ3JhbTp6LGJ1ZmZlcnM6dSx1bmlmb3JtVmFsdWVzOkosYXRsYXNUZXh0dXJlOlIsYXRsYXNUZXh0dXJlSWNvbjpCLGF0bGFzSW50ZXJwb2xhdGlvbjprLGF0bGFzSW50ZXJwb2xhdGlvbkljb246TCxpc1NERjpfLGhhc0hhbG86S307aWYodyYmaC5jYW5PdmVybGFwKXtUPSEwO2NvbnN0IHQ9dS5zZWdtZW50cy5nZXQoKTtmb3IoY29uc3QgaSBvZiB0KVAucHVzaCh7c2VnbWVudHM6bmV3IGUuYTAoW2ldKSxzb3J0S2V5Omkuc29ydEtleSxzdGF0ZTpZLHRlcnJhaW5EYXRhOk19KTt9ZWxzZSBQLnB1c2goe3NlZ21lbnRzOnUuc2VnbWVudHMsc29ydEtleTowLHN0YXRlOlksdGVycmFpbkRhdGE6TX0pO31UJiZQLnNvcnQoKCh0LGUpPT50LnNvcnRLZXktZS5zb3J0S2V5KSk7Zm9yKGNvbnN0IGUgb2YgUCl7Y29uc3QgaT1lLnN0YXRlO2lmKF8uYWN0aXZlVGV4dHVyZS5zZXQocC5URVhUVVJFMCksaS5hdGxhc1RleHR1cmUuYmluZChpLmF0bGFzSW50ZXJwb2xhdGlvbixwLkNMQU1QX1RPX0VER0UpLGkuYXRsYXNUZXh0dXJlSWNvbiYmKF8uYWN0aXZlVGV4dHVyZS5zZXQocC5URVhUVVJFMSksaS5hdGxhc1RleHR1cmVJY29uJiZpLmF0bGFzVGV4dHVyZUljb24uYmluZChpLmF0bGFzSW50ZXJwb2xhdGlvbkljb24scC5DTEFNUF9UT19FREdFKSksaS5pc1NERil7Y29uc3Qgcz1pLnVuaWZvcm1WYWx1ZXM7aS5oYXNIYWxvJiYocy51X2lzX2hhbG89MSxLaShpLmJ1ZmZlcnMsZS5zZWdtZW50cyxhLHQsaS5wcm9ncmFtLEksdSxkLHMsZS50ZXJyYWluRGF0YSkpLHMudV9pc19oYWxvPTA7fUtpKGkuYnVmZmVycyxlLnNlZ21lbnRzLGEsdCxpLnByb2dyYW0sSSx1LGQsaS51bmlmb3JtVmFsdWVzLGUudGVycmFpbkRhdGEpO319ZnVuY3Rpb24gS2kodCxlLGksYSxzLG8scixuLGwsaCl7Y29uc3QgYz1hLmNvbnRleHQ7cy5kcmF3KGMsYy5nbC5UUklBTkdMRVMsbyxyLG4samkuZGlzYWJsZWQsbCxoLGkuaWQsdC5sYXlvdXRWZXJ0ZXhCdWZmZXIsdC5pbmRleEJ1ZmZlcixlLGkucGFpbnQsYS50cmFuc2Zvcm0uem9vbSx0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQoaS5pZCksdC5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLHQub3BhY2l0eVZlcnRleEJ1ZmZlcik7fWZ1bmN0aW9uIEppKHQsaSxhLHMpe2NvbnN0IG89dC5jb250ZXh0LHI9by5nbCxuPVVpLmRpc2FibGVkLGw9bmV3IEZpKFtyLk9ORSxyLk9ORV0sZS5hTS50cmFuc3BhcmVudCxbITAsITAsITAsITBdKSxoPWkuZ2V0QnVja2V0KGEpO2lmKCFoKXJldHVybjtjb25zdCBjPXMua2V5O2xldCB1PWEuaGVhdG1hcEZib3MuZ2V0KGMpO3V8fCh1PVFpKG8saS50aWxlU2l6ZSxpLnRpbGVTaXplKSxhLmhlYXRtYXBGYm9zLnNldChjLHUpKSxvLmJpbmRGcmFtZWJ1ZmZlci5zZXQodS5mcmFtZWJ1ZmZlciksby52aWV3cG9ydC5zZXQoWzAsMCxpLnRpbGVTaXplLGkudGlsZVNpemVdKSxvLmNsZWFyKHtjb2xvcjplLmFNLnRyYW5zcGFyZW50fSk7Y29uc3QgZD1oLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQoYS5pZCksXz10LnVzZVByb2dyYW0oXCJoZWF0bWFwXCIsZCkscD10LnN0eWxlLm1hcC50ZXJyYWluLmdldFRlcnJhaW5EYXRhKHMpO18uZHJhdyhvLHIuVFJJQU5HTEVTLE9pLmRpc2FibGVkLG4sbCxqaS5kaXNhYmxlZCxNZShzLnBvc01hdHJpeCxpLHQudHJhbnNmb3JtLnpvb20sYS5wYWludC5nZXQoXCJoZWF0bWFwLWludGVuc2l0eVwiKSkscCxhLmlkLGgubGF5b3V0VmVydGV4QnVmZmVyLGguaW5kZXhCdWZmZXIsaC5zZWdtZW50cyxhLnBhaW50LHQudHJhbnNmb3JtLnpvb20sZCk7fWZ1bmN0aW9uIFlpKHQsZSxpKXtjb25zdCBhPXQuY29udGV4dCxzPWEuZ2w7YS5zZXRDb2xvck1vZGUodC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpO2NvbnN0IG89dGEoYSxlKSxyPWkua2V5LG49ZS5oZWF0bWFwRmJvcy5nZXQocik7biYmKGEuYWN0aXZlVGV4dHVyZS5zZXQocy5URVhUVVJFMCkscy5iaW5kVGV4dHVyZShzLlRFWFRVUkVfMkQsbi5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpLGEuYWN0aXZlVGV4dHVyZS5zZXQocy5URVhUVVJFMSksby5iaW5kKHMuTElORUFSLHMuQ0xBTVBfVE9fRURHRSksdC51c2VQcm9ncmFtKFwiaGVhdG1hcFRleHR1cmVcIikuZHJhdyhhLHMuVFJJQU5HTEVTLE9pLmRpc2FibGVkLFVpLmRpc2FibGVkLHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLGppLmRpc2FibGVkLEFlKHQsZSwwLDEpLG51bGwsZS5pZCx0LnJhc3RlckJvdW5kc0J1ZmZlcix0LnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLHQucmFzdGVyQm91bmRzU2VnbWVudHMsZS5wYWludCx0LnRyYW5zZm9ybS56b29tKSxuLmRlc3Ryb3koKSxlLmhlYXRtYXBGYm9zLmRlbGV0ZShyKSk7fWZ1bmN0aW9uIFFpKHQsZSxpKXt2YXIgYSxzO2NvbnN0IG89dC5nbCxyPW8uY3JlYXRlVGV4dHVyZSgpO28uYmluZFRleHR1cmUoby5URVhUVVJFXzJELHIpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX1dSQVBfUyxvLkNMQU1QX1RPX0VER0UpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX1dSQVBfVCxvLkNMQU1QX1RPX0VER0UpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX01JTl9GSUxURVIsby5MSU5FQVIpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX01BR19GSUxURVIsby5MSU5FQVIpO2NvbnN0IG49bnVsbCE9PShhPXQuSEFMRl9GTE9BVCkmJnZvaWQgMCE9PWE/YTpvLlVOU0lHTkVEX0JZVEUsbD1udWxsIT09KHM9dC5SR0JBMTZGKSYmdm9pZCAwIT09cz9zOm8uUkdCQTtvLnRleEltYWdlMkQoby5URVhUVVJFXzJELDAsbCxlLGksMCxvLlJHQkEsbixudWxsKTtjb25zdCBoPXQuY3JlYXRlRnJhbWVidWZmZXIoZSxpLCExLCExKTtyZXR1cm4gaC5jb2xvckF0dGFjaG1lbnQuc2V0KHIpLGh9ZnVuY3Rpb24gdGEodCxlKXtyZXR1cm4gZS5jb2xvclJhbXBUZXh0dXJlfHwoZS5jb2xvclJhbXBUZXh0dXJlPW5ldyBiKHQsZS5jb2xvclJhbXAsdC5nbC5SR0JBKSksZS5jb2xvclJhbXBUZXh0dXJlfWZ1bmN0aW9uIGVhKHQsZSxpLGEscyl7aWYoIWl8fCFhfHwhYS5pbWFnZUF0bGFzKXJldHVybjtjb25zdCBvPWEuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zO2xldCByPW9baS50by50b1N0cmluZygpXSxuPW9baS5mcm9tLnRvU3RyaW5nKCldO2lmKCFyJiZuJiYocj1uKSwhbiYmciYmKG49ciksIXJ8fCFuKXtjb25zdCB0PXMuZ2V0UGFpbnRQcm9wZXJ0eShlKTtyPW9bdF0sbj1vW3RdO31yJiZuJiZ0LnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhyLG4pO31mdW5jdGlvbiBpYSh0LGUsaSxhLHMsbyxyKXtjb25zdCBuPXQuY29udGV4dC5nbCxsPVwiZmlsbC1wYXR0ZXJuXCIsaD1pLnBhaW50LmdldChsKSxjPWgmJmguY29uc3RhbnRPcigxKSx1PWkuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpO2xldCBkLF8scCxtLGY7cj8oXz1jJiYhaS5nZXRQYWludFByb3BlcnR5KFwiZmlsbC1vdXRsaW5lLWNvbG9yXCIpP1wiZmlsbE91dGxpbmVQYXR0ZXJuXCI6XCJmaWxsT3V0bGluZVwiLGQ9bi5MSU5FUyk6KF89Yz9cImZpbGxQYXR0ZXJuXCI6XCJmaWxsXCIsZD1uLlRSSUFOR0xFUyk7Y29uc3QgZz1oLmNvbnN0YW50T3IobnVsbCk7Zm9yKGNvbnN0IGggb2YgYSl7Y29uc3QgYT1lLmdldFRpbGUoaCk7aWYoYyYmIWEucGF0dGVybnNMb2FkZWQoKSljb250aW51ZTtjb25zdCB2PWEuZ2V0QnVja2V0KGkpO2lmKCF2KWNvbnRpbnVlO2NvbnN0IHg9di5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGkuaWQpLHk9dC51c2VQcm9ncmFtKF8seCksYj10LnN0eWxlLm1hcC50ZXJyYWluJiZ0LnN0eWxlLm1hcC50ZXJyYWluLmdldFRlcnJhaW5EYXRhKGgpO2MmJih0LmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQobi5URVhUVVJFMCksYS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKG4uTElORUFSLG4uQ0xBTVBfVE9fRURHRSkseC51cGRhdGVQYWludEJ1ZmZlcnModSkpLGVhKHgsbCxnLGEsaSk7Y29uc3Qgdz1iP2g6bnVsbCxUPXQudHJhbnNsYXRlUG9zTWF0cml4KHc/dy5wb3NNYXRyaXg6aC5wb3NNYXRyaXgsYSxpLnBhaW50LmdldChcImZpbGwtdHJhbnNsYXRlXCIpLGkucGFpbnQuZ2V0KFwiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCIpKTtpZihyKXttPXYuaW5kZXhCdWZmZXIyLGY9di5zZWdtZW50czI7Y29uc3QgZT1bbi5kcmF3aW5nQnVmZmVyV2lkdGgsbi5kcmF3aW5nQnVmZmVySGVpZ2h0XTtwPVwiZmlsbE91dGxpbmVQYXR0ZXJuXCI9PT1fJiZjP1BlKFQsdCx1LGEsZSk6RWUoVCxlKTt9ZWxzZSBtPXYuaW5kZXhCdWZmZXIsZj12LnNlZ21lbnRzLHA9Yz9JZShULHQsdSxhKTpUZShUKTt5LmRyYXcodC5jb250ZXh0LGQscyx0LnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoaCksbyxqaS5kaXNhYmxlZCxwLGIsaS5pZCx2LmxheW91dFZlcnRleEJ1ZmZlcixtLGYsaS5wYWludCx0LnRyYW5zZm9ybS56b29tLHgpO319ZnVuY3Rpb24gYWEodCxlLGksYSxzLG8scil7Y29uc3Qgbj10LmNvbnRleHQsbD1uLmdsLGg9XCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCIsYz1pLnBhaW50LmdldChoKSx1PWMuY29uc3RhbnRPcigxKSxkPWkuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpLF89aS5wYWludC5nZXQoXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCIpLHA9Yy5jb25zdGFudE9yKG51bGwpO2Zvcihjb25zdCBjIG9mIGEpe2NvbnN0IGE9ZS5nZXRUaWxlKGMpLG09YS5nZXRCdWNrZXQoaSk7aWYoIW0pY29udGludWU7Y29uc3QgZj10LnN0eWxlLm1hcC50ZXJyYWluJiZ0LnN0eWxlLm1hcC50ZXJyYWluLmdldFRlcnJhaW5EYXRhKGMpLGc9bS5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGkuaWQpLHY9dC51c2VQcm9ncmFtKHU/XCJmaWxsRXh0cnVzaW9uUGF0dGVyblwiOlwiZmlsbEV4dHJ1c2lvblwiLGcpO3UmJih0LmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQobC5URVhUVVJFMCksYS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKGwuTElORUFSLGwuQ0xBTVBfVE9fRURHRSksZy51cGRhdGVQYWludEJ1ZmZlcnMoZCkpLGVhKGcsaCxwLGEsaSk7Y29uc3QgeD10LnRyYW5zbGF0ZVBvc01hdHJpeChjLnBvc01hdHJpeCxhLGkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCIpLGkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiKSkseT1pLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCIpLGI9dT93ZSh4LHQseSxfLGMsZCxhKTpiZSh4LHQseSxfKTt2LmRyYXcobixuLmdsLlRSSUFOR0xFUyxzLG8scixqaS5iYWNrQ0NXLGIsZixpLmlkLG0ubGF5b3V0VmVydGV4QnVmZmVyLG0uaW5kZXhCdWZmZXIsbS5zZWdtZW50cyxpLnBhaW50LHQudHJhbnNmb3JtLnpvb20sZyx0LnN0eWxlLm1hcC50ZXJyYWluJiZtLmNlbnRyb2lkVmVydGV4QnVmZmVyKTt9fWZ1bmN0aW9uIHNhKHQsZSxpLGEscyxvLHIpe2NvbnN0IG49dC5jb250ZXh0LGw9bi5nbCxoPWkuZmJvO2lmKCFoKXJldHVybjtjb25zdCBjPXQudXNlUHJvZ3JhbShcImhpbGxzaGFkZVwiKSx1PXQuc3R5bGUubWFwLnRlcnJhaW4mJnQuc3R5bGUubWFwLnRlcnJhaW4uZ2V0VGVycmFpbkRhdGEoZSk7bi5hY3RpdmVUZXh0dXJlLnNldChsLlRFWFRVUkUwKSxsLmJpbmRUZXh0dXJlKGwuVEVYVFVSRV8yRCxoLmNvbG9yQXR0YWNobWVudC5nZXQoKSksYy5kcmF3KG4sbC5UUklBTkdMRVMscyxvLHIsamkuZGlzYWJsZWQsKCh0LGUsaSxhKT0+e2NvbnN0IHM9aS5wYWludC5nZXQoXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCIpLG89aS5wYWludC5nZXQoXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCIpLHI9aS5wYWludC5nZXQoXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCIpO2xldCBuPWkucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIikqKE1hdGguUEkvMTgwKTtcInZpZXdwb3J0XCI9PT1pLnBhaW50LmdldChcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCIpJiYobi09dC50cmFuc2Zvcm0uYW5nbGUpO2NvbnN0IGw9IXQub3B0aW9ucy5tb3Zpbmc7cmV0dXJuIHt1X21hdHJpeDphP2EucG9zTWF0cml4OnQudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChlLnRpbGVJRC50b1Vud3JhcHBlZCgpLGwpLHVfaW1hZ2U6MCx1X2xhdHJhbmdlOlJlKDAsZS50aWxlSUQpLHVfbGlnaHQ6W2kucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiKSxuXSx1X3NoYWRvdzpzLHVfaGlnaGxpZ2h0Om8sdV9hY2NlbnQ6cn19KSh0LGksYSx1P2U6bnVsbCksdSxhLmlkLHQucmFzdGVyQm91bmRzQnVmZmVyLHQucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsdC5yYXN0ZXJCb3VuZHNTZWdtZW50cyk7fWZ1bmN0aW9uIG9hKHQsaSxhLHMsbyxyKXtjb25zdCBuPXQuY29udGV4dCxsPW4uZ2wsaD1pLmRlbTtpZihoJiZoLmRhdGEpe2NvbnN0IGM9aC5kaW0sdT1oLnN0cmlkZSxkPWguZ2V0UGl4ZWxzKCk7aWYobi5hY3RpdmVUZXh0dXJlLnNldChsLlRFWFRVUkUxKSxuLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldCghMSksaS5kZW1UZXh0dXJlPWkuZGVtVGV4dHVyZXx8dC5nZXRUaWxlVGV4dHVyZSh1KSxpLmRlbVRleHR1cmUpe2NvbnN0IHQ9aS5kZW1UZXh0dXJlO3QudXBkYXRlKGQse3ByZW11bHRpcGx5OiExfSksdC5iaW5kKGwuTkVBUkVTVCxsLkNMQU1QX1RPX0VER0UpO31lbHNlIGkuZGVtVGV4dHVyZT1uZXcgYihuLGQsbC5SR0JBLHtwcmVtdWx0aXBseTohMX0pLGkuZGVtVGV4dHVyZS5iaW5kKGwuTkVBUkVTVCxsLkNMQU1QX1RPX0VER0UpO24uYWN0aXZlVGV4dHVyZS5zZXQobC5URVhUVVJFMCk7bGV0IF89aS5mYm87aWYoIV8pe2NvbnN0IHQ9bmV3IGIobix7d2lkdGg6YyxoZWlnaHQ6YyxkYXRhOm51bGx9LGwuUkdCQSk7dC5iaW5kKGwuTElORUFSLGwuQ0xBTVBfVE9fRURHRSksXz1pLmZibz1uLmNyZWF0ZUZyYW1lYnVmZmVyKGMsYywhMCwhMSksXy5jb2xvckF0dGFjaG1lbnQuc2V0KHQudGV4dHVyZSk7fW4uYmluZEZyYW1lYnVmZmVyLnNldChfLmZyYW1lYnVmZmVyKSxuLnZpZXdwb3J0LnNldChbMCwwLGMsY10pLHQudXNlUHJvZ3JhbShcImhpbGxzaGFkZVByZXBhcmVcIikuZHJhdyhuLGwuVFJJQU5HTEVTLHMsbyxyLGppLmRpc2FibGVkLCgodCxpKT0+e2NvbnN0IGE9aS5zdHJpZGUscz1lLkgoKTtyZXR1cm4gZS5hUChzLDAsZS5YLC1lLlgsMCwwLDEpLGUuSihzLHMsWzAsLWUuWCwwXSkse3VfbWF0cml4OnMsdV9pbWFnZToxLHVfZGltZW5zaW9uOlthLGFdLHVfem9vbTp0Lm92ZXJzY2FsZWRaLHVfdW5wYWNrOmkuZ2V0VW5wYWNrVmVjdG9yKCl9fSkoaS50aWxlSUQsaCksbnVsbCxhLmlkLHQucmFzdGVyQm91bmRzQnVmZmVyLHQucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsdC5yYXN0ZXJCb3VuZHNTZWdtZW50cyksaS5uZWVkc0hpbGxzaGFkZVByZXBhcmU9ITE7fX1mdW5jdGlvbiByYSh0LGksYSxzLHIsbil7Y29uc3QgbD1zLnBhaW50LmdldChcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCIpO2lmKCFuJiZsPjApe2NvbnN0IHM9by5ub3coKSxuPShzLXQudGltZUFkZGVkKS9sLGg9aT8ocy1pLnRpbWVBZGRlZCkvbDotMSxjPWEuZ2V0U291cmNlKCksdT1yLmNvdmVyaW5nWm9vbUxldmVsKHt0aWxlU2l6ZTpjLnRpbGVTaXplLHJvdW5kWm9vbTpjLnJvdW5kWm9vbX0pLGQ9IWl8fE1hdGguYWJzKGkudGlsZUlELm92ZXJzY2FsZWRaLXUpPk1hdGguYWJzKHQudGlsZUlELm92ZXJzY2FsZWRaLXUpLF89ZCYmdC5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbj8xOmUuYWMoZD9uOjEtaCwwLDEpO3JldHVybiB0LnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uJiZuPj0xJiYodC5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbj0hMSksaT97b3BhY2l0eToxLG1peDoxLV99OntvcGFjaXR5Ol8sbWl4OjB9fXJldHVybiB7b3BhY2l0eToxLG1peDowfX1jb25zdCBuYT1uZXcgZS5hTSgxLDAsMCwxKSxsYT1uZXcgZS5hTSgwLDEsMCwxKSxoYT1uZXcgZS5hTSgwLDAsMSwxKSxjYT1uZXcgZS5hTSgxLDAsMSwxKSx1YT1uZXcgZS5hTSgwLDEsMSwxKTtmdW5jdGlvbiBkYSh0LGUsaSxhKXtwYSh0LDAsZStpLzIsdC50cmFuc2Zvcm0ud2lkdGgsaSxhKTt9ZnVuY3Rpb24gX2EodCxlLGksYSl7cGEodCxlLWkvMiwwLGksdC50cmFuc2Zvcm0uaGVpZ2h0LGEpO31mdW5jdGlvbiBwYSh0LGUsaSxhLHMsbyl7Y29uc3Qgcj10LmNvbnRleHQsbj1yLmdsO24uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZSp0LnBpeGVsUmF0aW8saSp0LnBpeGVsUmF0aW8sYSp0LnBpeGVsUmF0aW8scyp0LnBpeGVsUmF0aW8pLHIuY2xlYXIoe2NvbG9yOm99KSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpO31mdW5jdGlvbiBtYSh0LGksYSl7Y29uc3Qgcz10LmNvbnRleHQsbz1zLmdsLHI9YS5wb3NNYXRyaXgsbj10LnVzZVByb2dyYW0oXCJkZWJ1Z1wiKSxsPU9pLmRpc2FibGVkLGg9VWkuZGlzYWJsZWQsYz10LmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSx1PVwiJGRlYnVnXCIsZD10LnN0eWxlLm1hcC50ZXJyYWluJiZ0LnN0eWxlLm1hcC50ZXJyYWluLmdldFRlcnJhaW5EYXRhKGEpO3MuYWN0aXZlVGV4dHVyZS5zZXQoby5URVhUVVJFMCk7Y29uc3QgXz1pLmdldFRpbGVCeUlEKGEua2V5KS5sYXRlc3RSYXdUaWxlRGF0YSxwPU1hdGguZmxvb3IoKF8mJl8uYnl0ZUxlbmd0aHx8MCkvMTAyNCksbT1pLmdldFRpbGUoYSkudGlsZVNpemUsZj01MTIvTWF0aC5taW4obSw1MTIpKihhLm92ZXJzY2FsZWRaL3QudHJhbnNmb3JtLnpvb20pKi41O2xldCBnPWEuY2Fub25pY2FsLnRvU3RyaW5nKCk7YS5vdmVyc2NhbGVkWiE9PWEuY2Fub25pY2FsLnomJihnKz1gID0+ICR7YS5vdmVyc2NhbGVkWn1gKSxmdW5jdGlvbih0LGUpe3QuaW5pdERlYnVnT3ZlcmxheUNhbnZhcygpO2NvbnN0IGk9dC5kZWJ1Z092ZXJsYXlDYW52YXMsYT10LmNvbnRleHQuZ2wscz10LmRlYnVnT3ZlcmxheUNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7cy5jbGVhclJlY3QoMCwwLGkud2lkdGgsaS5oZWlnaHQpLHMuc2hhZG93Q29sb3I9XCJ3aGl0ZVwiLHMuc2hhZG93Qmx1cj0yLHMubGluZVdpZHRoPTEuNSxzLnN0cm9rZVN0eWxlPVwid2hpdGVcIixzLnRleHRCYXNlbGluZT1cInRvcFwiLHMuZm9udD1cImJvbGQgMzZweCBPcGVuIFNhbnMsIHNhbnMtc2VyaWZcIixzLmZpbGxUZXh0KGUsNSw1KSxzLnN0cm9rZVRleHQoZSw1LDUpLHQuZGVidWdPdmVybGF5VGV4dHVyZS51cGRhdGUoaSksdC5kZWJ1Z092ZXJsYXlUZXh0dXJlLmJpbmQoYS5MSU5FQVIsYS5DTEFNUF9UT19FREdFKTt9KHQsYCR7Z30gJHtwfWtCYCksbi5kcmF3KHMsby5UUklBTkdMRVMsbCxoLEZpLmFscGhhQmxlbmRlZCxqaS5kaXNhYmxlZCx6ZShyLGUuYU0udHJhbnNwYXJlbnQsZiksbnVsbCx1LHQuZGVidWdCdWZmZXIsdC5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlcix0LmRlYnVnU2VnbWVudHMpLG4uZHJhdyhzLG8uTElORV9TVFJJUCxsLGgsYyxqaS5kaXNhYmxlZCx6ZShyLGUuYU0ucmVkKSxkLHUsdC5kZWJ1Z0J1ZmZlcix0LnRpbGVCb3JkZXJJbmRleEJ1ZmZlcix0LmRlYnVnU2VnbWVudHMpO31mdW5jdGlvbiBmYSh0LGUsaSl7Y29uc3QgYT10LmNvbnRleHQscz1hLmdsLG89dC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkscj1uZXcgT2kocy5MRVFVQUwsT2kuUmVhZFdyaXRlLHQuZGVwdGhSYW5nZUZvcjNEKSxuPXQudXNlUHJvZ3JhbShcInRlcnJhaW5cIiksbD1lLmdldFRlcnJhaW5NZXNoKCk7YS5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpLGEudmlld3BvcnQuc2V0KFswLDAsdC53aWR0aCx0LmhlaWdodF0pO2Zvcihjb25zdCBoIG9mIGkpe2NvbnN0IGk9dC5yZW5kZXJUb1RleHR1cmUuZ2V0VGV4dHVyZShoKSxjPWUuZ2V0VGVycmFpbkRhdGEoaC50aWxlSUQpO2EuYWN0aXZlVGV4dHVyZS5zZXQocy5URVhUVVJFMCkscy5iaW5kVGV4dHVyZShzLlRFWFRVUkVfMkQsaS50ZXh0dXJlKTtjb25zdCB1PXQudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChoLnRpbGVJRC50b1Vud3JhcHBlZCgpKSxkPWUuZ2V0TWVzaEZyYW1lRGVsdGEodC50cmFuc2Zvcm0uem9vbSksXz10LnRyYW5zZm9ybS5jYWxjdWxhdGVGb2dNYXRyaXgoaC50aWxlSUQudG9VbndyYXBwZWQoKSkscD1nZSh1LGQsXyx0LnN0eWxlLnNreSx0LnRyYW5zZm9ybS5waXRjaCk7bi5kcmF3KGEscy5UUklBTkdMRVMscixVaS5kaXNhYmxlZCxvLGppLmJhY2tDQ1cscCxjLFwidGVycmFpblwiLGwudmVydGV4QnVmZmVyLGwuaW5kZXhCdWZmZXIsbC5zZWdtZW50cyk7fX1jbGFzcyBnYXtjb25zdHJ1Y3Rvcih0LGUsaSl7dGhpcy52ZXJ0ZXhCdWZmZXI9dCx0aGlzLmluZGV4QnVmZmVyPWUsdGhpcy5zZWdtZW50cz1pO31kZXN0cm95KCl7dGhpcy52ZXJ0ZXhCdWZmZXIuZGVzdHJveSgpLHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpLHRoaXMuc2VnbWVudHMuZGVzdHJveSgpLHRoaXMudmVydGV4QnVmZmVyPW51bGwsdGhpcy5pbmRleEJ1ZmZlcj1udWxsLHRoaXMuc2VnbWVudHM9bnVsbDt9fWNsYXNzIHZhe2NvbnN0cnVjdG9yKHQsaSl7dGhpcy5jb250ZXh0PW5ldyBCaSh0KSx0aGlzLnRyYW5zZm9ybT1pLHRoaXMuX3RpbGVUZXh0dXJlcz17fSx0aGlzLnRlcnJhaW5GYWNpbGl0YXRvcj17ZGlydHk6ITAsbWF0cml4OmUuYW4obmV3IEZsb2F0NjRBcnJheSgxNikpLHJlbmRlclRpbWU6MH0sdGhpcy5zZXR1cCgpLHRoaXMubnVtU3VibGF5ZXJzPXV0Lm1heFVuZGVyem9vbWluZyt1dC5tYXhPdmVyem9vbWluZysxLHRoaXMuZGVwdGhFcHNpbG9uPTEvTWF0aC5wb3coMiwxNiksdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleD1uZXcgaGU7fXJlc2l6ZSh0LGUsaSl7aWYodGhpcy53aWR0aD1NYXRoLmZsb29yKHQqaSksdGhpcy5oZWlnaHQ9TWF0aC5mbG9vcihlKmkpLHRoaXMucGl4ZWxSYXRpbz1pLHRoaXMuY29udGV4dC52aWV3cG9ydC5zZXQoWzAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0XSksdGhpcy5zdHlsZSlmb3IoY29uc3QgdCBvZiB0aGlzLnN0eWxlLl9vcmRlcil0aGlzLnN0eWxlLl9sYXllcnNbdF0ucmVzaXplKCk7fXNldHVwKCl7Y29uc3QgdD10aGlzLmNvbnRleHQsaT1uZXcgZS5hWDtpLmVtcGxhY2VCYWNrKDAsMCksaS5lbXBsYWNlQmFjayhlLlgsMCksaS5lbXBsYWNlQmFjaygwLGUuWCksaS5lbXBsYWNlQmFjayhlLlgsZS5YKSx0aGlzLnRpbGVFeHRlbnRCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIoaSxfZS5tZW1iZXJzKSx0aGlzLnRpbGVFeHRlbnRTZWdtZW50cz1lLmEwLnNpbXBsZVNlZ21lbnQoMCwwLDQsMik7Y29uc3QgYT1uZXcgZS5hWDthLmVtcGxhY2VCYWNrKDAsMCksYS5lbXBsYWNlQmFjayhlLlgsMCksYS5lbXBsYWNlQmFjaygwLGUuWCksYS5lbXBsYWNlQmFjayhlLlgsZS5YKSx0aGlzLmRlYnVnQnVmZmVyPXQuY3JlYXRlVmVydGV4QnVmZmVyKGEsX2UubWVtYmVycyksdGhpcy5kZWJ1Z1NlZ21lbnRzPWUuYTAuc2ltcGxlU2VnbWVudCgwLDAsNCw1KTtjb25zdCBzPW5ldyBlLiQ7cy5lbXBsYWNlQmFjaygwLDAsMCwwKSxzLmVtcGxhY2VCYWNrKGUuWCwwLGUuWCwwKSxzLmVtcGxhY2VCYWNrKDAsZS5YLDAsZS5YKSxzLmVtcGxhY2VCYWNrKGUuWCxlLlgsZS5YLGUuWCksdGhpcy5yYXN0ZXJCb3VuZHNCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIocyxZLm1lbWJlcnMpLHRoaXMucmFzdGVyQm91bmRzU2VnbWVudHM9ZS5hMC5zaW1wbGVTZWdtZW50KDAsMCw0LDIpO2NvbnN0IG89bmV3IGUuYVg7by5lbXBsYWNlQmFjaygwLDApLG8uZW1wbGFjZUJhY2soMSwwKSxvLmVtcGxhY2VCYWNrKDAsMSksby5lbXBsYWNlQmFjaygxLDEpLHRoaXMudmlld3BvcnRCdWZmZXI9dC5jcmVhdGVWZXJ0ZXhCdWZmZXIobyxfZS5tZW1iZXJzKSx0aGlzLnZpZXdwb3J0U2VnbWVudHM9ZS5hMC5zaW1wbGVTZWdtZW50KDAsMCw0LDIpO2NvbnN0IHI9bmV3IGUuYVo7ci5lbXBsYWNlQmFjaygwKSxyLmVtcGxhY2VCYWNrKDEpLHIuZW1wbGFjZUJhY2soMyksci5lbXBsYWNlQmFjaygyKSxyLmVtcGxhY2VCYWNrKDApLHRoaXMudGlsZUJvcmRlckluZGV4QnVmZmVyPXQuY3JlYXRlSW5kZXhCdWZmZXIocik7Y29uc3Qgbj1uZXcgZS5hWTtuLmVtcGxhY2VCYWNrKDAsMSwyKSxuLmVtcGxhY2VCYWNrKDIsMSwzKSx0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyPXQuY3JlYXRlSW5kZXhCdWZmZXIobik7Y29uc3QgbD10aGlzLmNvbnRleHQuZ2w7dGhpcy5zdGVuY2lsQ2xlYXJNb2RlPW5ldyBVaSh7ZnVuYzpsLkFMV0FZUyxtYXNrOjB9LDAsMjU1LGwuWkVSTyxsLlpFUk8sbC5aRVJPKTt9Y2xlYXJTdGVuY2lsKCl7Y29uc3QgdD10aGlzLmNvbnRleHQsaT10LmdsO3RoaXMubmV4dFN0ZW5jaWxJRD0xLHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2U9dm9pZCAwO2NvbnN0IGE9ZS5IKCk7ZS5hUChhLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCwwLDAsMSksZS5LKGEsYSxbaS5kcmF3aW5nQnVmZmVyV2lkdGgsaS5kcmF3aW5nQnVmZmVySGVpZ2h0LDBdKSx0aGlzLnVzZVByb2dyYW0oXCJjbGlwcGluZ01hc2tcIikuZHJhdyh0LGkuVFJJQU5HTEVTLE9pLmRpc2FibGVkLHRoaXMuc3RlbmNpbENsZWFyTW9kZSxGaS5kaXNhYmxlZCxqaS5kaXNhYmxlZCxEZShhKSxudWxsLFwiJGNsaXBwaW5nXCIsdGhpcy52aWV3cG9ydEJ1ZmZlcix0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLHRoaXMudmlld3BvcnRTZWdtZW50cyk7fV9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyh0LGUpe2lmKHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2U9PT10LnNvdXJjZXx8IXQuaXNUaWxlQ2xpcHBlZCgpfHwhZXx8IWUubGVuZ3RoKXJldHVybjt0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlPXQuc291cmNlO2NvbnN0IGk9dGhpcy5jb250ZXh0LGE9aS5nbDt0aGlzLm5leHRTdGVuY2lsSUQrZS5sZW5ndGg+MjU2JiZ0aGlzLmNsZWFyU3RlbmNpbCgpLGkuc2V0Q29sb3JNb2RlKEZpLmRpc2FibGVkKSxpLnNldERlcHRoTW9kZShPaS5kaXNhYmxlZCk7Y29uc3Qgcz10aGlzLnVzZVByb2dyYW0oXCJjbGlwcGluZ01hc2tcIik7dGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEcz17fTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbdC5rZXldPXRoaXMubmV4dFN0ZW5jaWxJRCsrLG89dGhpcy5zdHlsZS5tYXAudGVycmFpbiYmdGhpcy5zdHlsZS5tYXAudGVycmFpbi5nZXRUZXJyYWluRGF0YSh0KTtzLmRyYXcoaSxhLlRSSUFOR0xFUyxPaS5kaXNhYmxlZCxuZXcgVWkoe2Z1bmM6YS5BTFdBWVMsbWFzazowfSxlLDI1NSxhLktFRVAsYS5LRUVQLGEuUkVQTEFDRSksRmkuZGlzYWJsZWQsamkuZGlzYWJsZWQsRGUodC5wb3NNYXRyaXgpLG8sXCIkY2xpcHBpbmdcIix0aGlzLnRpbGVFeHRlbnRCdWZmZXIsdGhpcy5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlcix0aGlzLnRpbGVFeHRlbnRTZWdtZW50cyk7fX1zdGVuY2lsTW9kZUZvcjNEKCl7dGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZT12b2lkIDAsdGhpcy5uZXh0U3RlbmNpbElEKzE+MjU2JiZ0aGlzLmNsZWFyU3RlbmNpbCgpO2NvbnN0IHQ9dGhpcy5uZXh0U3RlbmNpbElEKyssZT10aGlzLmNvbnRleHQuZ2w7cmV0dXJuIG5ldyBVaSh7ZnVuYzplLk5PVEVRVUFMLG1hc2s6MjU1fSx0LDI1NSxlLktFRVAsZS5LRUVQLGUuUkVQTEFDRSl9c3RlbmNpbE1vZGVGb3JDbGlwcGluZyh0KXtjb25zdCBlPXRoaXMuY29udGV4dC5nbDtyZXR1cm4gbmV3IFVpKHtmdW5jOmUuRVFVQUwsbWFzazoyNTV9LHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbdC5rZXldLDAsZS5LRUVQLGUuS0VFUCxlLlJFUExBQ0UpfXN0ZW5jaWxDb25maWdGb3JPdmVybGFwKHQpe2NvbnN0IGU9dGhpcy5jb250ZXh0LmdsLGk9dC5zb3J0KCgodCxlKT0+ZS5vdmVyc2NhbGVkWi10Lm92ZXJzY2FsZWRaKSksYT1pW2kubGVuZ3RoLTFdLm92ZXJzY2FsZWRaLHM9aVswXS5vdmVyc2NhbGVkWi1hKzE7aWYocz4xKXt0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlPXZvaWQgMCx0aGlzLm5leHRTdGVuY2lsSUQrcz4yNTYmJnRoaXMuY2xlYXJTdGVuY2lsKCk7Y29uc3QgdD17fTtmb3IobGV0IGk9MDtpPHM7aSsrKXRbaSthXT1uZXcgVWkoe2Z1bmM6ZS5HRVFVQUwsbWFzazoyNTV9LGkrdGhpcy5uZXh0U3RlbmNpbElELDI1NSxlLktFRVAsZS5LRUVQLGUuUkVQTEFDRSk7cmV0dXJuIHRoaXMubmV4dFN0ZW5jaWxJRCs9cyxbdCxpXX1yZXR1cm4gW3tbYV06VWkuZGlzYWJsZWR9LGldfWNvbG9yTW9kZUZvclJlbmRlclBhc3MoKXtjb25zdCB0PXRoaXMuY29udGV4dC5nbDtpZih0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3Ipe2NvbnN0IGk9MS84O3JldHVybiBuZXcgRmkoW3QuQ09OU1RBTlRfQ09MT1IsdC5PTkVdLG5ldyBlLmFNKGksaSxpLDApLFshMCwhMCwhMCwhMF0pfXJldHVybiBcIm9wYXF1ZVwiPT09dGhpcy5yZW5kZXJQYXNzP0ZpLnVuYmxlbmRlZDpGaS5hbHBoYUJsZW5kZWR9ZGVwdGhNb2RlRm9yU3VibGF5ZXIodCxlLGkpe2lmKCF0aGlzLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSlyZXR1cm4gT2kuZGlzYWJsZWQ7Y29uc3QgYT0xLSgoMSt0aGlzLmN1cnJlbnRMYXllcikqdGhpcy5udW1TdWJsYXllcnMrdCkqdGhpcy5kZXB0aEVwc2lsb247cmV0dXJuIG5ldyBPaShpfHx0aGlzLmNvbnRleHQuZ2wuTEVRVUFMLGUsW2EsYV0pfW9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKXtyZXR1cm4gdGhpcy5jdXJyZW50TGF5ZXI8dGhpcy5vcGFxdWVQYXNzQ3V0b2ZmfXJlbmRlcih0LGkpe3RoaXMuc3R5bGU9dCx0aGlzLm9wdGlvbnM9aSx0aGlzLmxpbmVBdGxhcz10LmxpbmVBdGxhcyx0aGlzLmltYWdlTWFuYWdlcj10LmltYWdlTWFuYWdlcix0aGlzLmdseXBoTWFuYWdlcj10LmdseXBoTWFuYWdlcix0aGlzLnN5bWJvbEZhZGVDaGFuZ2U9dC5wbGFjZW1lbnQuc3ltYm9sRmFkZUNoYW5nZShvLm5vdygpKSx0aGlzLmltYWdlTWFuYWdlci5iZWdpbkZyYW1lKCk7Y29uc3QgYT10aGlzLnN0eWxlLl9vcmRlcixzPXRoaXMuc3R5bGUuc291cmNlQ2FjaGVzLHI9e30sbj17fSxsPXt9O2Zvcihjb25zdCB0IGluIHMpe2NvbnN0IGU9c1t0XTtlLnVzZWQmJmUucHJlcGFyZSh0aGlzLmNvbnRleHQpLHJbdF09ZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKSxuW3RdPXJbdF0uc2xpY2UoKS5yZXZlcnNlKCksbFt0XT1lLmdldFZpc2libGVDb29yZGluYXRlcyghMCkucmV2ZXJzZSgpO310aGlzLm9wYXF1ZVBhc3NDdXRvZmY9MS8wO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCsrKWlmKHRoaXMuc3R5bGUuX2xheWVyc1thW3RdXS5pczNEKCkpe3RoaXMub3BhcXVlUGFzc0N1dG9mZj10O2JyZWFrfXRoaXMubWF5YmVEcmF3RGVwdGhBbmRDb29yZHMoITEpLHRoaXMucmVuZGVyVG9UZXh0dXJlJiYodGhpcy5yZW5kZXJUb1RleHR1cmUucHJlcGFyZUZvclJlbmRlcih0aGlzLnN0eWxlLHRoaXMudHJhbnNmb3JtLnpvb20pLHRoaXMub3BhcXVlUGFzc0N1dG9mZj0wKSx0aGlzLnJlbmRlclBhc3M9XCJvZmZzY3JlZW5cIjtmb3IoY29uc3QgdCBvZiBhKXtjb25zdCBlPXRoaXMuc3R5bGUuX2xheWVyc1t0XTtpZighZS5oYXNPZmZzY3JlZW5QYXNzKCl8fGUuaXNIaWRkZW4odGhpcy50cmFuc2Zvcm0uem9vbSkpY29udGludWU7Y29uc3QgaT1uW2Uuc291cmNlXTsoXCJjdXN0b21cIj09PWUudHlwZXx8aS5sZW5ndGgpJiZ0aGlzLnJlbmRlckxheWVyKHRoaXMsc1tlLnNvdXJjZV0sZSxpKTt9aWYodGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCksdGhpcy5jb250ZXh0LmNsZWFyKHtjb2xvcjppLnNob3dPdmVyZHJhd0luc3BlY3Rvcj9lLmFNLmJsYWNrOmUuYU0udHJhbnNwYXJlbnQsZGVwdGg6MX0pLHRoaXMuY2xlYXJTdGVuY2lsKCksdGhpcy5zdHlsZS5za3kmJmZ1bmN0aW9uKHQsaSl7Y29uc3QgYT10LmNvbnRleHQscz1hLmdsLG89KCh0LGUsaSk9Pih7dV9za3lfY29sb3I6dC5wcm9wZXJ0aWVzLmdldChcInNreS1jb2xvclwiKSx1X2hvcml6b25fY29sb3I6dC5wcm9wZXJ0aWVzLmdldChcImhvcml6b24tY29sb3JcIiksdV9ob3Jpem9uOihlLmhlaWdodC8yK2UuZ2V0SG9yaXpvbigpKSppLHVfc2t5X2hvcml6b25fYmxlbmQ6dC5wcm9wZXJ0aWVzLmdldChcInNreS1ob3Jpem9uLWJsZW5kXCIpKmUuaGVpZ2h0LzIqaX0pKShpLHQuc3R5bGUubWFwLnRyYW5zZm9ybSx0LnBpeGVsUmF0aW8pLHI9bmV3IE9pKHMuTEVRVUFMLE9pLlJlYWRXcml0ZSxbMCwxXSksbj1VaS5kaXNhYmxlZCxsPXQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLGg9dC51c2VQcm9ncmFtKFwic2t5XCIpO2lmKCFpLm1lc2gpe2NvbnN0IHQ9bmV3IGUuYVg7dC5lbXBsYWNlQmFjaygtMSwtMSksdC5lbXBsYWNlQmFjaygxLC0xKSx0LmVtcGxhY2VCYWNrKDEsMSksdC5lbXBsYWNlQmFjaygtMSwxKTtjb25zdCBzPW5ldyBlLmFZO3MuZW1wbGFjZUJhY2soMCwxLDIpLHMuZW1wbGFjZUJhY2soMCwyLDMpLGkubWVzaD1uZXcgZ2EoYS5jcmVhdGVWZXJ0ZXhCdWZmZXIodCxfZS5tZW1iZXJzKSxhLmNyZWF0ZUluZGV4QnVmZmVyKHMpLGUuYTAuc2ltcGxlU2VnbWVudCgwLDAsdC5sZW5ndGgscy5sZW5ndGgpKTt9aC5kcmF3KGEscy5UUklBTkdMRVMscixuLGwsamkuZGlzYWJsZWQsbyx2b2lkIDAsXCJza3lcIixpLm1lc2gudmVydGV4QnVmZmVyLGkubWVzaC5pbmRleEJ1ZmZlcixpLm1lc2guc2VnbWVudHMpO30odGhpcyx0aGlzLnN0eWxlLnNreSksdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yPWkuc2hvd092ZXJkcmF3SW5zcGVjdG9yLHRoaXMuZGVwdGhSYW5nZUZvcjNEPVswLDEtKHQuX29yZGVyLmxlbmd0aCsyKSp0aGlzLm51bVN1YmxheWVycyp0aGlzLmRlcHRoRXBzaWxvbl0sIXRoaXMucmVuZGVyVG9UZXh0dXJlKWZvcih0aGlzLnJlbmRlclBhc3M9XCJvcGFxdWVcIix0aGlzLmN1cnJlbnRMYXllcj1hLmxlbmd0aC0xO3RoaXMuY3VycmVudExheWVyPj0wO3RoaXMuY3VycmVudExheWVyLS0pe2NvbnN0IHQ9dGhpcy5zdHlsZS5fbGF5ZXJzW2FbdGhpcy5jdXJyZW50TGF5ZXJdXSxlPXNbdC5zb3VyY2VdLGk9clt0LnNvdXJjZV07dGhpcy5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3ModCxpKSx0aGlzLnJlbmRlckxheWVyKHRoaXMsZSx0LGkpO31mb3IodGhpcy5yZW5kZXJQYXNzPVwidHJhbnNsdWNlbnRcIix0aGlzLmN1cnJlbnRMYXllcj0wO3RoaXMuY3VycmVudExheWVyPGEubGVuZ3RoO3RoaXMuY3VycmVudExheWVyKyspe2NvbnN0IHQ9dGhpcy5zdHlsZS5fbGF5ZXJzW2FbdGhpcy5jdXJyZW50TGF5ZXJdXSxlPXNbdC5zb3VyY2VdO2lmKHRoaXMucmVuZGVyVG9UZXh0dXJlJiZ0aGlzLnJlbmRlclRvVGV4dHVyZS5yZW5kZXJMYXllcih0KSljb250aW51ZTtjb25zdCBpPShcInN5bWJvbFwiPT09dC50eXBlP2w6bilbdC5zb3VyY2VdO3RoaXMuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKHQsclt0LnNvdXJjZV0pLHRoaXMucmVuZGVyTGF5ZXIodGhpcyxlLHQsaSk7fWlmKHRoaXMub3B0aW9ucy5zaG93VGlsZUJvdW5kYXJpZXMpe2NvbnN0IHQ9ZnVuY3Rpb24odCxlKXtsZXQgaT1udWxsO2NvbnN0IGE9T2JqZWN0LnZhbHVlcyh0Ll9sYXllcnMpLmZsYXRNYXAoKGk9Pmkuc291cmNlJiYhaS5pc0hpZGRlbihlKT9bdC5zb3VyY2VDYWNoZXNbaS5zb3VyY2VdXTpbXSkpLHM9YS5maWx0ZXIoKHQ9PlwidmVjdG9yXCI9PT10LmdldFNvdXJjZSgpLnR5cGUpKSxvPWEuZmlsdGVyKCh0PT5cInZlY3RvclwiIT09dC5nZXRTb3VyY2UoKS50eXBlKSkscj10PT57KCFpfHxpLmdldFNvdXJjZSgpLm1heHpvb208dC5nZXRTb3VyY2UoKS5tYXh6b29tKSYmKGk9dCk7fTtyZXR1cm4gcy5mb3JFYWNoKCh0PT5yKHQpKSksaXx8by5mb3JFYWNoKCh0PT5yKHQpKSksaX0odGhpcy5zdHlsZSx0aGlzLnRyYW5zZm9ybS56b29tKTt0JiZmdW5jdGlvbih0LGUsaSl7Zm9yKGxldCBhPTA7YTxpLmxlbmd0aDthKyspbWEodCxlLGlbYV0pO30odGhpcyx0LHQuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCkpO310aGlzLm9wdGlvbnMuc2hvd1BhZGRpbmcmJmZ1bmN0aW9uKHQpe2NvbnN0IGU9dC50cmFuc2Zvcm0ucGFkZGluZztkYSh0LHQudHJhbnNmb3JtLmhlaWdodC0oZS50b3B8fDApLDMsbmEpLGRhKHQsZS5ib3R0b218fDAsMyxsYSksX2EodCxlLmxlZnR8fDAsMyxoYSksX2EodCx0LnRyYW5zZm9ybS53aWR0aC0oZS5yaWdodHx8MCksMyxjYSk7Y29uc3QgaT10LnRyYW5zZm9ybS5jZW50ZXJQb2ludDshZnVuY3Rpb24odCxlLGksYSl7cGEodCxlLTEsaS0xMCwyLDIwLGEpLHBhKHQsZS0xMCxpLTEsMjAsMixhKTt9KHQsaS54LHQudHJhbnNmb3JtLmhlaWdodC1pLnksdWEpO30odGhpcyksdGhpcy5jb250ZXh0LnNldERlZmF1bHQoKTt9bWF5YmVEcmF3RGVwdGhBbmRDb29yZHModCl7aWYoIXRoaXMuc3R5bGV8fCF0aGlzLnN0eWxlLm1hcHx8IXRoaXMuc3R5bGUubWFwLnRlcnJhaW4pcmV0dXJuO2NvbnN0IGk9dGhpcy50ZXJyYWluRmFjaWxpdGF0b3IubWF0cml4LGE9dGhpcy50cmFuc2Zvcm0ubW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeDtsZXQgcz10aGlzLnRlcnJhaW5GYWNpbGl0YXRvci5kaXJ0eTtzfHwocz10PyFlLmFfKGksYSk6IWUuYSQoaSxhKSksc3x8KHM9dGhpcy5zdHlsZS5tYXAudGVycmFpbi5zb3VyY2VDYWNoZS50aWxlc0FmdGVyVGltZSh0aGlzLnRlcnJhaW5GYWNpbGl0YXRvci5yZW5kZXJUaW1lKS5sZW5ndGg+MCkscyYmKGUuYjAoaSxhKSx0aGlzLnRlcnJhaW5GYWNpbGl0YXRvci5yZW5kZXJUaW1lPURhdGUubm93KCksdGhpcy50ZXJyYWluRmFjaWxpdGF0b3IuZGlydHk9ITEsZnVuY3Rpb24odCxpKXtjb25zdCBhPXQuY29udGV4dCxzPWEuZ2wsbz1GaS51bmJsZW5kZWQscj1uZXcgT2kocy5MRVFVQUwsT2kuUmVhZFdyaXRlLFswLDFdKSxuPWkuZ2V0VGVycmFpbk1lc2goKSxsPWkuc291cmNlQ2FjaGUuZ2V0UmVuZGVyYWJsZVRpbGVzKCksaD10LnVzZVByb2dyYW0oXCJ0ZXJyYWluRGVwdGhcIik7YS5iaW5kRnJhbWVidWZmZXIuc2V0KGkuZ2V0RnJhbWVidWZmZXIoXCJkZXB0aFwiKS5mcmFtZWJ1ZmZlciksYS52aWV3cG9ydC5zZXQoWzAsMCx0LndpZHRoL2RldmljZVBpeGVsUmF0aW8sdC5oZWlnaHQvZGV2aWNlUGl4ZWxSYXRpb10pLGEuY2xlYXIoe2NvbG9yOmUuYU0udHJhbnNwYXJlbnQsZGVwdGg6MX0pO2Zvcihjb25zdCBlIG9mIGwpe2NvbnN0IGw9aS5nZXRUZXJyYWluRGF0YShlLnRpbGVJRCksYz17dV9tYXRyaXg6dC50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KGUudGlsZUlELnRvVW53cmFwcGVkKCkpLHVfZWxlX2RlbHRhOmkuZ2V0TWVzaEZyYW1lRGVsdGEodC50cmFuc2Zvcm0uem9vbSl9O2guZHJhdyhhLHMuVFJJQU5HTEVTLHIsVWkuZGlzYWJsZWQsbyxqaS5iYWNrQ0NXLGMsbCxcInRlcnJhaW5cIixuLnZlcnRleEJ1ZmZlcixuLmluZGV4QnVmZmVyLG4uc2VnbWVudHMpO31hLmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCksYS52aWV3cG9ydC5zZXQoWzAsMCx0LndpZHRoLHQuaGVpZ2h0XSk7fSh0aGlzLHRoaXMuc3R5bGUubWFwLnRlcnJhaW4pLGZ1bmN0aW9uKHQsaSl7Y29uc3QgYT10LmNvbnRleHQscz1hLmdsLG89RmkudW5ibGVuZGVkLHI9bmV3IE9pKHMuTEVRVUFMLE9pLlJlYWRXcml0ZSxbMCwxXSksbj1pLmdldFRlcnJhaW5NZXNoKCksbD1pLmdldENvb3Jkc1RleHR1cmUoKSxoPWkuc291cmNlQ2FjaGUuZ2V0UmVuZGVyYWJsZVRpbGVzKCksYz10LnVzZVByb2dyYW0oXCJ0ZXJyYWluQ29vcmRzXCIpO2EuYmluZEZyYW1lYnVmZmVyLnNldChpLmdldEZyYW1lYnVmZmVyKFwiY29vcmRzXCIpLmZyYW1lYnVmZmVyKSxhLnZpZXdwb3J0LnNldChbMCwwLHQud2lkdGgvZGV2aWNlUGl4ZWxSYXRpbyx0LmhlaWdodC9kZXZpY2VQaXhlbFJhdGlvXSksYS5jbGVhcih7Y29sb3I6ZS5hTS50cmFuc3BhcmVudCxkZXB0aDoxfSksaS5jb29yZHNJbmRleD1bXTtmb3IoY29uc3QgZSBvZiBoKXtjb25zdCBoPWkuZ2V0VGVycmFpbkRhdGEoZS50aWxlSUQpO2EuYWN0aXZlVGV4dHVyZS5zZXQocy5URVhUVVJFMCkscy5iaW5kVGV4dHVyZShzLlRFWFRVUkVfMkQsbC50ZXh0dXJlKTtjb25zdCB1PXt1X21hdHJpeDp0LnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgoZS50aWxlSUQudG9VbndyYXBwZWQoKSksdV90ZXJyYWluX2Nvb3Jkc19pZDooMjU1LWkuY29vcmRzSW5kZXgubGVuZ3RoKS8yNTUsdV90ZXh0dXJlOjAsdV9lbGVfZGVsdGE6aS5nZXRNZXNoRnJhbWVEZWx0YSh0LnRyYW5zZm9ybS56b29tKX07Yy5kcmF3KGEscy5UUklBTkdMRVMscixVaS5kaXNhYmxlZCxvLGppLmJhY2tDQ1csdSxoLFwidGVycmFpblwiLG4udmVydGV4QnVmZmVyLG4uaW5kZXhCdWZmZXIsbi5zZWdtZW50cyksaS5jb29yZHNJbmRleC5wdXNoKGUudGlsZUlELmtleSk7fWEuYmluZEZyYW1lYnVmZmVyLnNldChudWxsKSxhLnZpZXdwb3J0LnNldChbMCwwLHQud2lkdGgsdC5oZWlnaHRdKTt9KHRoaXMsdGhpcy5zdHlsZS5tYXAudGVycmFpbikpO31yZW5kZXJMYXllcih0LGksYSxzKXtpZighYS5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSYmKFwiYmFja2dyb3VuZFwiPT09YS50eXBlfHxcImN1c3RvbVwiPT09YS50eXBlfHwoc3x8W10pLmxlbmd0aCkpc3dpdGNoKHRoaXMuaWQ9YS5pZCxhLnR5cGUpe2Nhc2VcInN5bWJvbFwiOiFmdW5jdGlvbih0LGksYSxzLG8pe2lmKFwidHJhbnNsdWNlbnRcIiE9PXQucmVuZGVyUGFzcylyZXR1cm47Y29uc3Qgcj1VaS5kaXNhYmxlZCxuPXQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpOyhhLl91bmV2YWx1YXRlZExheW91dC5oYXNWYWx1ZShcInRleHQtdmFyaWFibGUtYW5jaG9yXCIpfHxhLl91bmV2YWx1YXRlZExheW91dC5oYXNWYWx1ZShcInRleHQtdmFyaWFibGUtYW5jaG9yLW9mZnNldFwiKSkmJmZ1bmN0aW9uKHQsaSxhLHMsbyxyLG4sbCxoKXtjb25zdCBjPWkudHJhbnNmb3JtLHU9aWUoKSxkPVwibWFwXCI9PT1vLF89XCJtYXBcIj09PXI7Zm9yKGNvbnN0IG8gb2YgdCl7Y29uc3QgdD1zLmdldFRpbGUobykscj10LmdldEJ1Y2tldChhKTtpZighcnx8IXIudGV4dHx8IXIudGV4dC5zZWdtZW50cy5nZXQoKS5sZW5ndGgpY29udGludWU7Y29uc3QgcD1lLmFnKHIudGV4dFNpemVEYXRhLGMuem9vbSksbT1CdCh0LDEsaS50cmFuc2Zvcm0uem9vbSksZj1ndChvLnBvc01hdHJpeCxfLGQsaS50cmFuc2Zvcm0sbSksZz1cIm5vbmVcIiE9PWEubGF5b3V0LmdldChcImljb24tdGV4dC1maXRcIikmJnIuaGFzSWNvbkRhdGEoKTtpZihwKXtjb25zdCBlPU1hdGgucG93KDIsYy56b29tLXQudGlsZUlELm92ZXJzY2FsZWRaKSxhPWkuc3R5bGUubWFwLnRlcnJhaW4/KHQsZSk9Pmkuc3R5bGUubWFwLnRlcnJhaW4uZ2V0RWxldmF0aW9uKG8sdCxlKTpudWxsLHM9dS50cmFuc2xhdGVQb3NpdGlvbihjLHQsbixsKTtXaShyLGQsXyxoLGMsZixvLnBvc01hdHJpeCxlLHAsZyx1LHMsby50b1Vud3JhcHBlZCgpLGEpO319fShzLHQsYSxpLGEubGF5b3V0LmdldChcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpLGEubGF5b3V0LmdldChcInRleHQtcGl0Y2gtYWxpZ25tZW50XCIpLGEucGFpbnQuZ2V0KFwidGV4dC10cmFuc2xhdGVcIiksYS5wYWludC5nZXQoXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIiksbyksMCE9PWEucGFpbnQuZ2V0KFwiaWNvbi1vcGFjaXR5XCIpLmNvbnN0YW50T3IoMSkmJlhpKHQsaSxhLHMsITEsYS5wYWludC5nZXQoXCJpY29uLXRyYW5zbGF0ZVwiKSxhLnBhaW50LmdldChcImljb24tdHJhbnNsYXRlLWFuY2hvclwiKSxhLmxheW91dC5nZXQoXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiKSxhLmxheW91dC5nZXQoXCJpY29uLXBpdGNoLWFsaWdubWVudFwiKSxhLmxheW91dC5nZXQoXCJpY29uLWtlZXAtdXByaWdodFwiKSxyLG4pLDAhPT1hLnBhaW50LmdldChcInRleHQtb3BhY2l0eVwiKS5jb25zdGFudE9yKDEpJiZYaSh0LGksYSxzLCEwLGEucGFpbnQuZ2V0KFwidGV4dC10cmFuc2xhdGVcIiksYS5wYWludC5nZXQoXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIiksYS5sYXlvdXQuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIiksYS5sYXlvdXQuZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIiksYS5sYXlvdXQuZ2V0KFwidGV4dC1rZWVwLXVwcmlnaHRcIikscixuKSxpLm1hcC5zaG93Q29sbGlzaW9uQm94ZXMmJihxaSh0LGksYSxzLCEwKSxxaSh0LGksYSxzLCExKSk7fSh0LGksYSxzLHRoaXMuc3R5bGUucGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0cyk7YnJlYWs7Y2FzZVwiY2lyY2xlXCI6IWZ1bmN0aW9uKHQsaSxhLHMpe2lmKFwidHJhbnNsdWNlbnRcIiE9PXQucmVuZGVyUGFzcylyZXR1cm47Y29uc3Qgbz1hLnBhaW50LmdldChcImNpcmNsZS1vcGFjaXR5XCIpLHI9YS5wYWludC5nZXQoXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCIpLG49YS5wYWludC5nZXQoXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIiksbD0hYS5sYXlvdXQuZ2V0KFwiY2lyY2xlLXNvcnQta2V5XCIpLmlzQ29uc3RhbnQoKTtpZigwPT09by5jb25zdGFudE9yKDEpJiYoMD09PXIuY29uc3RhbnRPcigxKXx8MD09PW4uY29uc3RhbnRPcigxKSkpcmV0dXJuO2NvbnN0IGg9dC5jb250ZXh0LGM9aC5nbCx1PXQuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCxPaS5SZWFkT25seSksZD1VaS5kaXNhYmxlZCxfPXQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLHA9W107Zm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKyspe2NvbnN0IHI9c1tvXSxuPWkuZ2V0VGlsZShyKSxoPW4uZ2V0QnVja2V0KGEpO2lmKCFoKWNvbnRpbnVlO2NvbnN0IGM9aC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGEuaWQpLHU9dC51c2VQcm9ncmFtKFwiY2lyY2xlXCIsYyksZD1oLmxheW91dFZlcnRleEJ1ZmZlcixfPWguaW5kZXhCdWZmZXIsbT10LnN0eWxlLm1hcC50ZXJyYWluJiZ0LnN0eWxlLm1hcC50ZXJyYWluLmdldFRlcnJhaW5EYXRhKHIpLGY9e3Byb2dyYW1Db25maWd1cmF0aW9uOmMscHJvZ3JhbTp1LGxheW91dFZlcnRleEJ1ZmZlcjpkLGluZGV4QnVmZmVyOl8sdW5pZm9ybVZhbHVlczpDZSh0LHIsbixhKSx0ZXJyYWluRGF0YTptfTtpZihsKXtjb25zdCB0PWguc2VnbWVudHMuZ2V0KCk7Zm9yKGNvbnN0IGkgb2YgdClwLnB1c2goe3NlZ21lbnRzOm5ldyBlLmEwKFtpXSksc29ydEtleTppLnNvcnRLZXksc3RhdGU6Zn0pO31lbHNlIHAucHVzaCh7c2VnbWVudHM6aC5zZWdtZW50cyxzb3J0S2V5OjAsc3RhdGU6Zn0pO31sJiZwLnNvcnQoKCh0LGUpPT50LnNvcnRLZXktZS5zb3J0S2V5KSk7Zm9yKGNvbnN0IGUgb2YgcCl7Y29uc3R7cHJvZ3JhbUNvbmZpZ3VyYXRpb246aSxwcm9ncmFtOnMsbGF5b3V0VmVydGV4QnVmZmVyOm8saW5kZXhCdWZmZXI6cix1bmlmb3JtVmFsdWVzOm4sdGVycmFpbkRhdGE6bH09ZS5zdGF0ZTtzLmRyYXcoaCxjLlRSSUFOR0xFUyx1LGQsXyxqaS5kaXNhYmxlZCxuLGwsYS5pZCxvLHIsZS5zZWdtZW50cyxhLnBhaW50LHQudHJhbnNmb3JtLnpvb20saSk7fX0odCxpLGEscyk7YnJlYWs7Y2FzZVwiaGVhdG1hcFwiOiFmdW5jdGlvbih0LGksYSxzKXtpZigwPT09YS5wYWludC5nZXQoXCJoZWF0bWFwLW9wYWNpdHlcIikpcmV0dXJuO2NvbnN0IG89dC5jb250ZXh0O2lmKHQuc3R5bGUubWFwLnRlcnJhaW4pe2Zvcihjb25zdCBlIG9mIHMpe2NvbnN0IHM9aS5nZXRUaWxlKGUpO2kuaGFzUmVuZGVyYWJsZVBhcmVudChlKXx8KFwib2Zmc2NyZWVuXCI9PT10LnJlbmRlclBhc3M/SmkodCxzLGEsZSk6XCJ0cmFuc2x1Y2VudFwiPT09dC5yZW5kZXJQYXNzJiZZaSh0LGEsZSkpO31vLnZpZXdwb3J0LnNldChbMCwwLHQud2lkdGgsdC5oZWlnaHRdKTt9ZWxzZSBcIm9mZnNjcmVlblwiPT09dC5yZW5kZXJQYXNzP2Z1bmN0aW9uKHQsaSxhLHMpe2NvbnN0IG89dC5jb250ZXh0LHI9by5nbCxuPVVpLmRpc2FibGVkLGw9bmV3IEZpKFtyLk9ORSxyLk9ORV0sZS5hTS50cmFuc3BhcmVudCxbITAsITAsITAsITBdKTsoKGZ1bmN0aW9uKHQsaSxhKXtjb25zdCBzPXQuZ2w7dC5hY3RpdmVUZXh0dXJlLnNldChzLlRFWFRVUkUxKSx0LnZpZXdwb3J0LnNldChbMCwwLGkud2lkdGgvNCxpLmhlaWdodC80XSk7bGV0IG89YS5oZWF0bWFwRmJvcy5nZXQoZS5hVSk7bz8ocy5iaW5kVGV4dHVyZShzLlRFWFRVUkVfMkQsby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpLHQuYmluZEZyYW1lYnVmZmVyLnNldChvLmZyYW1lYnVmZmVyKSk6KG89UWkodCxpLndpZHRoLzQsaS5oZWlnaHQvNCksYS5oZWF0bWFwRmJvcy5zZXQoZS5hVSxvKSk7fSkpKG8sdCxhKSxvLmNsZWFyKHtjb2xvcjplLmFNLnRyYW5zcGFyZW50fSk7Zm9yKGxldCBlPTA7ZTxzLmxlbmd0aDtlKyspe2NvbnN0IGg9c1tlXTtpZihpLmhhc1JlbmRlcmFibGVQYXJlbnQoaCkpY29udGludWU7Y29uc3QgYz1pLmdldFRpbGUoaCksdT1jLmdldEJ1Y2tldChhKTtpZighdSljb250aW51ZTtjb25zdCBkPXUucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChhLmlkKSxfPXQudXNlUHJvZ3JhbShcImhlYXRtYXBcIixkKSx7em9vbTpwfT10LnRyYW5zZm9ybTtfLmRyYXcobyxyLlRSSUFOR0xFUyxPaS5kaXNhYmxlZCxuLGwsamkuZGlzYWJsZWQsTWUoaC5wb3NNYXRyaXgsYyxwLGEucGFpbnQuZ2V0KFwiaGVhdG1hcC1pbnRlbnNpdHlcIikpLG51bGwsYS5pZCx1LmxheW91dFZlcnRleEJ1ZmZlcix1LmluZGV4QnVmZmVyLHUuc2VnbWVudHMsYS5wYWludCx0LnRyYW5zZm9ybS56b29tLGQpO31vLnZpZXdwb3J0LnNldChbMCwwLHQud2lkdGgsdC5oZWlnaHRdKTt9KHQsaSxhLHMpOlwidHJhbnNsdWNlbnRcIj09PXQucmVuZGVyUGFzcyYmZnVuY3Rpb24odCxpKXtjb25zdCBhPXQuY29udGV4dCxzPWEuZ2w7YS5zZXRDb2xvck1vZGUodC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpO2NvbnN0IG89aS5oZWF0bWFwRmJvcy5nZXQoZS5hVSk7byYmKGEuYWN0aXZlVGV4dHVyZS5zZXQocy5URVhUVVJFMCkscy5iaW5kVGV4dHVyZShzLlRFWFRVUkVfMkQsby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpLGEuYWN0aXZlVGV4dHVyZS5zZXQocy5URVhUVVJFMSksdGEoYSxpKS5iaW5kKHMuTElORUFSLHMuQ0xBTVBfVE9fRURHRSksdC51c2VQcm9ncmFtKFwiaGVhdG1hcFRleHR1cmVcIikuZHJhdyhhLHMuVFJJQU5HTEVTLE9pLmRpc2FibGVkLFVpLmRpc2FibGVkLHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLGppLmRpc2FibGVkLEFlKHQsaSwwLDEpLG51bGwsaS5pZCx0LnZpZXdwb3J0QnVmZmVyLHQucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsdC52aWV3cG9ydFNlZ21lbnRzLGkucGFpbnQsdC50cmFuc2Zvcm0uem9vbSkpO30odCxhKTt9KHQsaSxhLHMpO2JyZWFrO2Nhc2VcImxpbmVcIjohZnVuY3Rpb24odCxpLGEscyl7aWYoXCJ0cmFuc2x1Y2VudFwiIT09dC5yZW5kZXJQYXNzKXJldHVybjtjb25zdCBvPWEucGFpbnQuZ2V0KFwibGluZS1vcGFjaXR5XCIpLHI9YS5wYWludC5nZXQoXCJsaW5lLXdpZHRoXCIpO2lmKDA9PT1vLmNvbnN0YW50T3IoMSl8fDA9PT1yLmNvbnN0YW50T3IoMSkpcmV0dXJuO2NvbnN0IG49dC5kZXB0aE1vZGVGb3JTdWJsYXllcigwLE9pLlJlYWRPbmx5KSxsPXQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLGg9YS5wYWludC5nZXQoXCJsaW5lLWRhc2hhcnJheVwiKSxjPWEucGFpbnQuZ2V0KFwibGluZS1wYXR0ZXJuXCIpLHU9Yy5jb25zdGFudE9yKDEpLGQ9YS5wYWludC5nZXQoXCJsaW5lLWdyYWRpZW50XCIpLF89YS5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCkscD11P1wibGluZVBhdHRlcm5cIjpoP1wibGluZVNERlwiOmQ/XCJsaW5lR3JhZGllbnRcIjpcImxpbmVcIixtPXQuY29udGV4dCxmPW0uZ2w7bGV0IGc9ITA7Zm9yKGNvbnN0IG8gb2Ygcyl7Y29uc3Qgcz1pLmdldFRpbGUobyk7aWYodSYmIXMucGF0dGVybnNMb2FkZWQoKSljb250aW51ZTtjb25zdCByPXMuZ2V0QnVja2V0KGEpO2lmKCFyKWNvbnRpbnVlO2NvbnN0IHY9ci5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGEuaWQpLHg9dC5jb250ZXh0LnByb2dyYW0uZ2V0KCkseT10LnVzZVByb2dyYW0ocCx2KSx3PWd8fHkucHJvZ3JhbSE9PXgsVD10LnN0eWxlLm1hcC50ZXJyYWluJiZ0LnN0eWxlLm1hcC50ZXJyYWluLmdldFRlcnJhaW5EYXRhKG8pLEk9Yy5jb25zdGFudE9yKG51bGwpO2lmKEkmJnMuaW1hZ2VBdGxhcyl7Y29uc3QgdD1zLmltYWdlQXRsYXMsZT10LnBhdHRlcm5Qb3NpdGlvbnNbSS50by50b1N0cmluZygpXSxpPXQucGF0dGVyblBvc2l0aW9uc1tJLmZyb20udG9TdHJpbmcoKV07ZSYmaSYmdi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMoZSxpKTt9Y29uc3QgRT1UP286bnVsbCxQPXU/RmUodCxzLGEsXyxFKTpoP0JlKHQscyxhLGgsXyxFKTpkP0xlKHQscyxhLHIubGluZUNsaXBzQXJyYXkubGVuZ3RoLEUpOmtlKHQscyxhLEUpO2lmKHUpbS5hY3RpdmVUZXh0dXJlLnNldChmLlRFWFRVUkUwKSxzLmltYWdlQXRsYXNUZXh0dXJlLmJpbmQoZi5MSU5FQVIsZi5DTEFNUF9UT19FREdFKSx2LnVwZGF0ZVBhaW50QnVmZmVycyhfKTtlbHNlIGlmKGgmJih3fHx0LmxpbmVBdGxhcy5kaXJ0eSkpbS5hY3RpdmVUZXh0dXJlLnNldChmLlRFWFRVUkUwKSx0LmxpbmVBdGxhcy5iaW5kKG0pO2Vsc2UgaWYoZCl7Y29uc3Qgcz1yLmdyYWRpZW50c1thLmlkXTtsZXQgbj1zLnRleHR1cmU7aWYoYS5ncmFkaWVudFZlcnNpb24hPT1zLnZlcnNpb24pe2xldCBsPTI1NjtpZihhLnN0ZXBJbnRlcnBvbGFudCl7Y29uc3QgYT1pLmdldFNvdXJjZSgpLm1heHpvb20scz1vLmNhbm9uaWNhbC56PT09YT9NYXRoLmNlaWwoMTw8dC50cmFuc2Zvcm0ubWF4Wm9vbS1vLmNhbm9uaWNhbC56KToxO2w9ZS5hYyhlLmFWKHIubWF4TGluZUxlbmd0aC9lLlgqMTAyNCpzKSwyNTYsbS5tYXhUZXh0dXJlU2l6ZSk7fXMuZ3JhZGllbnQ9ZS5hVyh7ZXhwcmVzc2lvbjphLmdyYWRpZW50RXhwcmVzc2lvbigpLGV2YWx1YXRpb25LZXk6XCJsaW5lUHJvZ3Jlc3NcIixyZXNvbHV0aW9uOmwsaW1hZ2U6cy5ncmFkaWVudHx8dm9pZCAwLGNsaXBzOnIubGluZUNsaXBzQXJyYXl9KSxzLnRleHR1cmU/cy50ZXh0dXJlLnVwZGF0ZShzLmdyYWRpZW50KTpzLnRleHR1cmU9bmV3IGIobSxzLmdyYWRpZW50LGYuUkdCQSkscy52ZXJzaW9uPWEuZ3JhZGllbnRWZXJzaW9uLG49cy50ZXh0dXJlO31tLmFjdGl2ZVRleHR1cmUuc2V0KGYuVEVYVFVSRTApLG4uYmluZChhLnN0ZXBJbnRlcnBvbGFudD9mLk5FQVJFU1Q6Zi5MSU5FQVIsZi5DTEFNUF9UT19FREdFKTt9eS5kcmF3KG0sZi5UUklBTkdMRVMsbix0LnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcobyksbCxqaS5kaXNhYmxlZCxQLFQsYS5pZCxyLmxheW91dFZlcnRleEJ1ZmZlcixyLmluZGV4QnVmZmVyLHIuc2VnbWVudHMsYS5wYWludCx0LnRyYW5zZm9ybS56b29tLHYsci5sYXlvdXRWZXJ0ZXhCdWZmZXIyKSxnPSExO319KHQsaSxhLHMpO2JyZWFrO2Nhc2VcImZpbGxcIjohZnVuY3Rpb24odCxpLGEscyl7Y29uc3Qgbz1hLnBhaW50LmdldChcImZpbGwtY29sb3JcIikscj1hLnBhaW50LmdldChcImZpbGwtb3BhY2l0eVwiKTtpZigwPT09ci5jb25zdGFudE9yKDEpKXJldHVybjtjb25zdCBuPXQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLGw9YS5wYWludC5nZXQoXCJmaWxsLXBhdHRlcm5cIiksaD10Lm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSYmIWwuY29uc3RhbnRPcigxKSYmMT09PW8uY29uc3RhbnRPcihlLmFNLnRyYW5zcGFyZW50KS5hJiYxPT09ci5jb25zdGFudE9yKDApP1wib3BhcXVlXCI6XCJ0cmFuc2x1Y2VudFwiO2lmKHQucmVuZGVyUGFzcz09PWgpe2NvbnN0IGU9dC5kZXB0aE1vZGVGb3JTdWJsYXllcigxLFwib3BhcXVlXCI9PT10LnJlbmRlclBhc3M/T2kuUmVhZFdyaXRlOk9pLlJlYWRPbmx5KTtpYSh0LGksYSxzLGUsbiwhMSk7fWlmKFwidHJhbnNsdWNlbnRcIj09PXQucmVuZGVyUGFzcyYmYS5wYWludC5nZXQoXCJmaWxsLWFudGlhbGlhc1wiKSl7Y29uc3QgZT10LmRlcHRoTW9kZUZvclN1YmxheWVyKGEuZ2V0UGFpbnRQcm9wZXJ0eShcImZpbGwtb3V0bGluZS1jb2xvclwiKT8yOjAsT2kuUmVhZE9ubHkpO2lhKHQsaSxhLHMsZSxuLCEwKTt9fSh0LGksYSxzKTticmVhaztjYXNlXCJmaWxsLWV4dHJ1c2lvblwiOiFmdW5jdGlvbih0LGUsaSxhKXtjb25zdCBzPWkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiKTtpZigwIT09cyYmXCJ0cmFuc2x1Y2VudFwiPT09dC5yZW5kZXJQYXNzKXtjb25zdCBvPW5ldyBPaSh0LmNvbnRleHQuZ2wuTEVRVUFMLE9pLlJlYWRXcml0ZSx0LmRlcHRoUmFuZ2VGb3IzRCk7aWYoMSE9PXN8fGkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiKS5jb25zdGFudE9yKDEpKWFhKHQsZSxpLGEsbyxVaS5kaXNhYmxlZCxGaS5kaXNhYmxlZCksYWEodCxlLGksYSxvLHQuc3RlbmNpbE1vZGVGb3IzRCgpLHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtlbHNlIHtjb25zdCBzPXQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO2FhKHQsZSxpLGEsbyxVaS5kaXNhYmxlZCxzKTt9fX0odCxpLGEscyk7YnJlYWs7Y2FzZVwiaGlsbHNoYWRlXCI6IWZ1bmN0aW9uKHQsZSxpLGEpe2lmKFwib2Zmc2NyZWVuXCIhPT10LnJlbmRlclBhc3MmJlwidHJhbnNsdWNlbnRcIiE9PXQucmVuZGVyUGFzcylyZXR1cm47Y29uc3Qgcz10LmNvbnRleHQsbz10LmRlcHRoTW9kZUZvclN1YmxheWVyKDAsT2kuUmVhZE9ubHkpLHI9dC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksW24sbF09XCJ0cmFuc2x1Y2VudFwiPT09dC5yZW5kZXJQYXNzP3Quc3RlbmNpbENvbmZpZ0Zvck92ZXJsYXAoYSk6W3t9LGFdO2Zvcihjb25zdCBhIG9mIGwpe2NvbnN0IHM9ZS5nZXRUaWxlKGEpO3ZvaWQgMCE9PXMubmVlZHNIaWxsc2hhZGVQcmVwYXJlJiZzLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSYmXCJvZmZzY3JlZW5cIj09PXQucmVuZGVyUGFzcz9vYSh0LHMsaSxvLFVpLmRpc2FibGVkLHIpOlwidHJhbnNsdWNlbnRcIj09PXQucmVuZGVyUGFzcyYmc2EodCxhLHMsaSxvLG5bYS5vdmVyc2NhbGVkWl0scik7fXMudmlld3BvcnQuc2V0KFswLDAsdC53aWR0aCx0LmhlaWdodF0pO30odCxpLGEscyk7YnJlYWs7Y2FzZVwicmFzdGVyXCI6IWZ1bmN0aW9uKHQsZSxpLGEpe2lmKFwidHJhbnNsdWNlbnRcIiE9PXQucmVuZGVyUGFzcylyZXR1cm47aWYoMD09PWkucGFpbnQuZ2V0KFwicmFzdGVyLW9wYWNpdHlcIikpcmV0dXJuO2lmKCFhLmxlbmd0aClyZXR1cm47Y29uc3Qgcz10LmNvbnRleHQsbz1zLmdsLHI9ZS5nZXRTb3VyY2UoKSxuPXQudXNlUHJvZ3JhbShcInJhc3RlclwiKSxsPXQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLFtoLGNdPXIgaW5zdGFuY2VvZiBRP1t7fSxhXTp0LnN0ZW5jaWxDb25maWdGb3JPdmVybGFwKGEpLHU9Y1tjLmxlbmd0aC0xXS5vdmVyc2NhbGVkWixkPSF0Lm9wdGlvbnMubW92aW5nO2Zvcihjb25zdCBhIG9mIGMpe2NvbnN0IGM9dC5kZXB0aE1vZGVGb3JTdWJsYXllcihhLm92ZXJzY2FsZWRaLXUsMT09PWkucGFpbnQuZ2V0KFwicmFzdGVyLW9wYWNpdHlcIik/T2kuUmVhZFdyaXRlOk9pLlJlYWRPbmx5LG8uTEVTUyksXz1lLmdldFRpbGUoYSk7Xy5yZWdpc3RlckZhZGVEdXJhdGlvbihpLnBhaW50LmdldChcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCIpKTtjb25zdCBwPWUuZmluZExvYWRlZFBhcmVudChhLDApLG09ZS5maW5kTG9hZGVkU2libGluZyhhKSxmPXJhKF8scHx8bXx8bnVsbCxlLGksdC50cmFuc2Zvcm0sdC5zdHlsZS5tYXAudGVycmFpbik7bGV0IGcsdjtjb25zdCB4PVwibmVhcmVzdFwiPT09aS5wYWludC5nZXQoXCJyYXN0ZXItcmVzYW1wbGluZ1wiKT9vLk5FQVJFU1Q6by5MSU5FQVI7cy5hY3RpdmVUZXh0dXJlLnNldChvLlRFWFRVUkUwKSxfLnRleHR1cmUuYmluZCh4LG8uQ0xBTVBfVE9fRURHRSxvLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCkscy5hY3RpdmVUZXh0dXJlLnNldChvLlRFWFRVUkUxKSxwPyhwLnRleHR1cmUuYmluZCh4LG8uQ0xBTVBfVE9fRURHRSxvLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCksZz1NYXRoLnBvdygyLHAudGlsZUlELm92ZXJzY2FsZWRaLV8udGlsZUlELm92ZXJzY2FsZWRaKSx2PVtfLnRpbGVJRC5jYW5vbmljYWwueCpnJTEsXy50aWxlSUQuY2Fub25pY2FsLnkqZyUxXSk6Xy50ZXh0dXJlLmJpbmQoeCxvLkNMQU1QX1RPX0VER0Usby5MSU5FQVJfTUlQTUFQX05FQVJFU1QpLF8udGV4dHVyZS51c2VNaXBtYXAmJnMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljJiZ0LnRyYW5zZm9ybS5waXRjaD4yMCYmby50ZXhQYXJhbWV0ZXJmKG8uVEVYVFVSRV8yRCxzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY01heCk7Y29uc3QgeT10LnN0eWxlLm1hcC50ZXJyYWluJiZ0LnN0eWxlLm1hcC50ZXJyYWluLmdldFRlcnJhaW5EYXRhKGEpLGI9eT9hOm51bGwsdz1iP2IucG9zTWF0cml4OnQudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChhLnRvVW53cmFwcGVkKCksZCksVD1VZSh3LHZ8fFswLDBdLGd8fDEsZixpKTtyIGluc3RhbmNlb2YgUT9uLmRyYXcocyxvLlRSSUFOR0xFUyxjLFVpLmRpc2FibGVkLGwsamkuZGlzYWJsZWQsVCx5LGkuaWQsci5ib3VuZHNCdWZmZXIsdC5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlcixyLmJvdW5kc1NlZ21lbnRzKTpuLmRyYXcocyxvLlRSSUFOR0xFUyxjLGhbYS5vdmVyc2NhbGVkWl0sbCxqaS5kaXNhYmxlZCxULHksaS5pZCx0LnJhc3RlckJvdW5kc0J1ZmZlcix0LnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLHQucmFzdGVyQm91bmRzU2VnbWVudHMpO319KHQsaSxhLHMpO2JyZWFrO2Nhc2VcImJhY2tncm91bmRcIjohZnVuY3Rpb24odCxlLGksYSl7Y29uc3Qgcz1pLnBhaW50LmdldChcImJhY2tncm91bmQtY29sb3JcIiksbz1pLnBhaW50LmdldChcImJhY2tncm91bmQtb3BhY2l0eVwiKTtpZigwPT09bylyZXR1cm47Y29uc3Qgcj10LmNvbnRleHQsbj1yLmdsLGw9dC50cmFuc2Zvcm0saD1sLnRpbGVTaXplLGM9aS5wYWludC5nZXQoXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIik7aWYodC5pc1BhdHRlcm5NaXNzaW5nKGMpKXJldHVybjtjb25zdCB1PSFjJiYxPT09cy5hJiYxPT09byYmdC5vcGFxdWVQYXNzRW5hYmxlZEZvckxheWVyKCk/XCJvcGFxdWVcIjpcInRyYW5zbHVjZW50XCI7aWYodC5yZW5kZXJQYXNzIT09dSlyZXR1cm47Y29uc3QgZD1VaS5kaXNhYmxlZCxfPXQuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCxcIm9wYXF1ZVwiPT09dT9PaS5SZWFkV3JpdGU6T2kuUmVhZE9ubHkpLHA9dC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksbT10LnVzZVByb2dyYW0oYz9cImJhY2tncm91bmRQYXR0ZXJuXCI6XCJiYWNrZ3JvdW5kXCIpLGY9YXx8bC5jb3ZlcmluZ1RpbGVzKHt0aWxlU2l6ZTpoLHRlcnJhaW46dC5zdHlsZS5tYXAudGVycmFpbn0pO2MmJihyLmFjdGl2ZVRleHR1cmUuc2V0KG4uVEVYVFVSRTApLHQuaW1hZ2VNYW5hZ2VyLmJpbmQodC5jb250ZXh0KSk7Y29uc3QgZz1pLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtmb3IoY29uc3QgZSBvZiBmKXtjb25zdCBsPWE/ZS5wb3NNYXRyaXg6dC50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KGUudG9VbndyYXBwZWQoKSksdT1jP0hlKGwsbyx0LGMse3RpbGVJRDplLHRpbGVTaXplOmh9LGcpOkdlKGwsbyxzKSxmPXQuc3R5bGUubWFwLnRlcnJhaW4mJnQuc3R5bGUubWFwLnRlcnJhaW4uZ2V0VGVycmFpbkRhdGEoZSk7bS5kcmF3KHIsbi5UUklBTkdMRVMsXyxkLHAsamkuZGlzYWJsZWQsdSxmLGkuaWQsdC50aWxlRXh0ZW50QnVmZmVyLHQucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsdC50aWxlRXh0ZW50U2VnbWVudHMpO319KHQsMCxhLHMpO2JyZWFrO2Nhc2VcImN1c3RvbVwiOiFmdW5jdGlvbih0LGUsaSl7Y29uc3QgYT10LmNvbnRleHQscz1pLmltcGxlbWVudGF0aW9uO2lmKFwib2Zmc2NyZWVuXCI9PT10LnJlbmRlclBhc3Mpe2NvbnN0IGU9cy5wcmVyZW5kZXI7ZSYmKHQuc2V0Q3VzdG9tTGF5ZXJEZWZhdWx0cygpLGEuc2V0Q29sb3JNb2RlKHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKSxlLmNhbGwocyxhLmdsLHQudHJhbnNmb3JtLmN1c3RvbUxheWVyTWF0cml4KCkpLGEuc2V0RGlydHkoKSx0LnNldEJhc2VTdGF0ZSgpKTt9ZWxzZSBpZihcInRyYW5zbHVjZW50XCI9PT10LnJlbmRlclBhc3Mpe3Quc2V0Q3VzdG9tTGF5ZXJEZWZhdWx0cygpLGEuc2V0Q29sb3JNb2RlKHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKSxhLnNldFN0ZW5jaWxNb2RlKFVpLmRpc2FibGVkKTtjb25zdCBlPVwiM2RcIj09PXMucmVuZGVyaW5nTW9kZT9uZXcgT2kodC5jb250ZXh0LmdsLkxFUVVBTCxPaS5SZWFkV3JpdGUsdC5kZXB0aFJhbmdlRm9yM0QpOnQuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCxPaS5SZWFkT25seSk7YS5zZXREZXB0aE1vZGUoZSkscy5yZW5kZXIoYS5nbCx0LnRyYW5zZm9ybS5jdXN0b21MYXllck1hdHJpeCgpLHtmYXJaOnQudHJhbnNmb3JtLmZhclosbmVhclo6dC50cmFuc2Zvcm0ubmVhclosZm92OnQudHJhbnNmb3JtLl9mb3YsbW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeDp0LnRyYW5zZm9ybS5tb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4LHByb2plY3Rpb25NYXRyaXg6dC50cmFuc2Zvcm0ucHJvamVjdGlvbk1hdHJpeH0pLGEuc2V0RGlydHkoKSx0LnNldEJhc2VTdGF0ZSgpLGEuYmluZEZyYW1lYnVmZmVyLnNldChudWxsKTt9fSh0LDAsYSk7fX10cmFuc2xhdGVQb3NNYXRyaXgodCxpLGEscyxvKXtpZighYVswXSYmIWFbMV0pcmV0dXJuIHQ7Y29uc3Qgcj1vP1wibWFwXCI9PT1zP3RoaXMudHJhbnNmb3JtLmFuZ2xlOjA6XCJ2aWV3cG9ydFwiPT09cz8tdGhpcy50cmFuc2Zvcm0uYW5nbGU6MDtpZihyKXtjb25zdCB0PU1hdGguc2luKHIpLGU9TWF0aC5jb3Mocik7YT1bYVswXSplLWFbMV0qdCxhWzBdKnQrYVsxXSplXTt9Y29uc3Qgbj1bbz9hWzBdOkJ0KGksYVswXSx0aGlzLnRyYW5zZm9ybS56b29tKSxvP2FbMV06QnQoaSxhWzFdLHRoaXMudHJhbnNmb3JtLnpvb20pLDBdLGw9bmV3IEZsb2F0MzJBcnJheSgxNik7cmV0dXJuIGUuSihsLHQsbiksbH1zYXZlVGlsZVRleHR1cmUodCl7Y29uc3QgZT10aGlzLl90aWxlVGV4dHVyZXNbdC5zaXplWzBdXTtlP2UucHVzaCh0KTp0aGlzLl90aWxlVGV4dHVyZXNbdC5zaXplWzBdXT1bdF07fWdldFRpbGVUZXh0dXJlKHQpe2NvbnN0IGU9dGhpcy5fdGlsZVRleHR1cmVzW3RdO3JldHVybiBlJiZlLmxlbmd0aD4wP2UucG9wKCk6bnVsbH1pc1BhdHRlcm5NaXNzaW5nKHQpe2lmKCF0KXJldHVybiAhMTtpZighdC5mcm9tfHwhdC50bylyZXR1cm4gITA7Y29uc3QgZT10aGlzLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKHQuZnJvbS50b1N0cmluZygpKSxpPXRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4odC50by50b1N0cmluZygpKTtyZXR1cm4gIWV8fCFpfXVzZVByb2dyYW0odCxlKXt0aGlzLmNhY2hlPXRoaXMuY2FjaGV8fHt9O2NvbnN0IGk9dCsoZT9lLmNhY2hlS2V5OlwiXCIpKyh0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3I/XCIvb3ZlcmRyYXdcIjpcIlwiKSsodGhpcy5zdHlsZS5tYXAudGVycmFpbj9cIi90ZXJyYWluXCI6XCJcIik7cmV0dXJuIHRoaXMuY2FjaGVbaV18fCh0aGlzLmNhY2hlW2ldPW5ldyB4ZSh0aGlzLmNvbnRleHQscGVbdF0sZSxXZVt0XSx0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IsdGhpcy5zdHlsZS5tYXAudGVycmFpbikpLHRoaXMuY2FjaGVbaV19c2V0Q3VzdG9tTGF5ZXJEZWZhdWx0cygpe3RoaXMuY29udGV4dC51bmJpbmRWQU8oKSx0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0RGVmYXVsdCgpLHRoaXMuY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldERlZmF1bHQoKSx0aGlzLmNvbnRleHQucGl4ZWxTdG9yZVVucGFjay5zZXREZWZhdWx0KCksdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKSx0aGlzLmNvbnRleHQucGl4ZWxTdG9yZVVucGFja0ZsaXBZLnNldERlZmF1bHQoKTt9c2V0QmFzZVN0YXRlKCl7Y29uc3QgdD10aGlzLmNvbnRleHQuZ2w7dGhpcy5jb250ZXh0LmN1bGxGYWNlLnNldCghMSksdGhpcy5jb250ZXh0LnZpZXdwb3J0LnNldChbMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHRdKSx0aGlzLmNvbnRleHQuYmxlbmRFcXVhdGlvbi5zZXQodC5GVU5DX0FERCk7fWluaXREZWJ1Z092ZXJsYXlDYW52YXMoKXtudWxsPT10aGlzLmRlYnVnT3ZlcmxheUNhbnZhcyYmKHRoaXMuZGVidWdPdmVybGF5Q2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMud2lkdGg9NTEyLHRoaXMuZGVidWdPdmVybGF5Q2FudmFzLmhlaWdodD01MTIsdGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlPW5ldyBiKHRoaXMuY29udGV4dCx0aGlzLmRlYnVnT3ZlcmxheUNhbnZhcyx0aGlzLmNvbnRleHQuZ2wuUkdCQSkpO31kZXN0cm95KCl7dGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlJiZ0aGlzLmRlYnVnT3ZlcmxheVRleHR1cmUuZGVzdHJveSgpO31vdmVyTGltaXQoKXtjb25zdHtkcmF3aW5nQnVmZmVyV2lkdGg6dCxkcmF3aW5nQnVmZmVySGVpZ2h0OmV9PXRoaXMuY29udGV4dC5nbDtyZXR1cm4gdGhpcy53aWR0aCE9PXR8fHRoaXMuaGVpZ2h0IT09ZX19Y2xhc3MgeGF7Y29uc3RydWN0b3IodCxlKXt0aGlzLnBvaW50cz10LHRoaXMucGxhbmVzPWU7fXN0YXRpYyBmcm9tSW52UHJvamVjdGlvbk1hdHJpeCh0LGksYSl7Y29uc3Qgcz1NYXRoLnBvdygyLGEpLG89W1stMSwxLC0xLDFdLFsxLDEsLTEsMV0sWzEsLTEsLTEsMV0sWy0xLC0xLC0xLDFdLFstMSwxLDEsMV0sWzEsMSwxLDFdLFsxLC0xLDEsMV0sWy0xLC0xLDEsMV1dLm1hcCgoYT0+e2NvbnN0IG89MS8oYT1lLmFmKFtdLGEsdCkpWzNdL2kqcztyZXR1cm4gZS5iMShhLGEsW28sbywxL2FbM10sb10pfSkpLHI9W1swLDEsMl0sWzYsNSw0XSxbMCwzLDddLFsyLDEsNV0sWzMsMiw2XSxbMCw0LDVdXS5tYXAoKHQ9Pntjb25zdCBlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZVswXSxhPWVbMV0scz1lWzJdLG89aSppK2EqYStzKnM7cmV0dXJuIG8+MCYmKG89MS9NYXRoLnNxcnQobykpLHRbMF09ZVswXSpvLHRbMV09ZVsxXSpvLHRbMl09ZVsyXSpvLHR9KFtdLGZ1bmN0aW9uKHQsZSxpKXt2YXIgYT1lWzBdLHM9ZVsxXSxvPWVbMl0scj1pWzBdLG49aVsxXSxsPWlbMl07cmV0dXJuIHRbMF09cypsLW8qbix0WzFdPW8qci1hKmwsdFsyXT1hKm4tcypyLHR9KFtdLGcoW10sb1t0WzBdXSxvW3RbMV1dKSxnKFtdLG9bdFsyXV0sb1t0WzFdXSkpKSxpPS0oKGE9ZSlbMF0qKHM9b1t0WzFdXSlbMF0rYVsxXSpzWzFdK2FbMl0qc1syXSk7dmFyIGEscztyZXR1cm4gZS5jb25jYXQoaSl9KSk7cmV0dXJuIG5ldyB4YShvLHIpfX1jbGFzcyB5YXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMubWluPXQsdGhpcy5tYXg9ZSx0aGlzLmNlbnRlcj1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRbMF09LjUqZVswXSx0WzFdPS41KmVbMV0sdFsyXT0uNSplWzJdLHR9KFtdLGZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFswXT1lWzBdK2lbMF0sdFsxXT1lWzFdK2lbMV0sdFsyXT1lWzJdK2lbMl0sdH0oW10sdGhpcy5taW4sdGhpcy5tYXgpKTt9cXVhZHJhbnQodCl7Y29uc3QgZT1bdCUyPT0wLHQ8Ml0saT1tKHRoaXMubWluKSxhPW0odGhpcy5tYXgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlbdF09ZVt0XT90aGlzLm1pblt0XTp0aGlzLmNlbnRlclt0XSxhW3RdPWVbdF0/dGhpcy5jZW50ZXJbdF06dGhpcy5tYXhbdF07cmV0dXJuIGFbMl09dGhpcy5tYXhbMl0sbmV3IHlhKGksYSl9ZGlzdGFuY2VYKHQpe3JldHVybiBNYXRoLm1heChNYXRoLm1pbih0aGlzLm1heFswXSx0WzBdKSx0aGlzLm1pblswXSktdFswXX1kaXN0YW5jZVkodCl7cmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHRoaXMubWF4WzFdLHRbMV0pLHRoaXMubWluWzFdKS10WzFdfWludGVyc2VjdHModCl7Y29uc3QgaT1bW3RoaXMubWluWzBdLHRoaXMubWluWzFdLHRoaXMubWluWzJdLDFdLFt0aGlzLm1heFswXSx0aGlzLm1pblsxXSx0aGlzLm1pblsyXSwxXSxbdGhpcy5tYXhbMF0sdGhpcy5tYXhbMV0sdGhpcy5taW5bMl0sMV0sW3RoaXMubWluWzBdLHRoaXMubWF4WzFdLHRoaXMubWluWzJdLDFdLFt0aGlzLm1pblswXSx0aGlzLm1pblsxXSx0aGlzLm1heFsyXSwxXSxbdGhpcy5tYXhbMF0sdGhpcy5taW5bMV0sdGhpcy5tYXhbMl0sMV0sW3RoaXMubWF4WzBdLHRoaXMubWF4WzFdLHRoaXMubWF4WzJdLDFdLFt0aGlzLm1pblswXSx0aGlzLm1heFsxXSx0aGlzLm1heFsyXSwxXV07bGV0IGE9ITA7Zm9yKGxldCBzPTA7czx0LnBsYW5lcy5sZW5ndGg7cysrKXtjb25zdCBvPXQucGxhbmVzW3NdO2xldCByPTA7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0KyspZS5iMihvLGlbdF0pPj0wJiZyKys7aWYoMD09PXIpcmV0dXJuIDA7ciE9PWkubGVuZ3RoJiYoYT0hMSk7fWlmKGEpcmV0dXJuIDI7Zm9yKGxldCBlPTA7ZTwzO2UrKyl7bGV0IGk9TnVtYmVyLk1BWF9WQUxVRSxhPS1OdW1iZXIuTUFYX1ZBTFVFO2ZvcihsZXQgcz0wO3M8dC5wb2ludHMubGVuZ3RoO3MrKyl7Y29uc3Qgbz10LnBvaW50c1tzXVtlXS10aGlzLm1pbltlXTtpPU1hdGgubWluKGksbyksYT1NYXRoLm1heChhLG8pO31pZihhPDB8fGk+dGhpcy5tYXhbZV0tdGhpcy5taW5bZV0pcmV0dXJuIDB9cmV0dXJuIDF9fWNsYXNzIGJhe2NvbnN0cnVjdG9yKHQ9MCxlPTAsaT0wLGE9MCl7aWYoaXNOYU4odCl8fHQ8MHx8aXNOYU4oZSl8fGU8MHx8aXNOYU4oaSl8fGk8MHx8aXNOYU4oYSl8fGE8MCl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBlZGdlLWluc2V0cywgdG9wLCBib3R0b20sIGxlZnQgYW5kIHJpZ2h0IG11c3QgYWxsIGJlIG51bWJlcnNcIik7dGhpcy50b3A9dCx0aGlzLmJvdHRvbT1lLHRoaXMubGVmdD1pLHRoaXMucmlnaHQ9YTt9aW50ZXJwb2xhdGUodCxpLGEpe3JldHVybiBudWxsIT1pLnRvcCYmbnVsbCE9dC50b3AmJih0aGlzLnRvcD1lLnkubnVtYmVyKHQudG9wLGkudG9wLGEpKSxudWxsIT1pLmJvdHRvbSYmbnVsbCE9dC5ib3R0b20mJih0aGlzLmJvdHRvbT1lLnkubnVtYmVyKHQuYm90dG9tLGkuYm90dG9tLGEpKSxudWxsIT1pLmxlZnQmJm51bGwhPXQubGVmdCYmKHRoaXMubGVmdD1lLnkubnVtYmVyKHQubGVmdCxpLmxlZnQsYSkpLG51bGwhPWkucmlnaHQmJm51bGwhPXQucmlnaHQmJih0aGlzLnJpZ2h0PWUueS5udW1iZXIodC5yaWdodCxpLnJpZ2h0LGEpKSx0aGlzfWdldENlbnRlcih0LGkpe2NvbnN0IGE9ZS5hYygodGhpcy5sZWZ0K3QtdGhpcy5yaWdodCkvMiwwLHQpLHM9ZS5hYygodGhpcy50b3AraS10aGlzLmJvdHRvbSkvMiwwLGkpO3JldHVybiBuZXcgZS5QKGEscyl9ZXF1YWxzKHQpe3JldHVybiB0aGlzLnRvcD09PXQudG9wJiZ0aGlzLmJvdHRvbT09PXQuYm90dG9tJiZ0aGlzLmxlZnQ9PT10LmxlZnQmJnRoaXMucmlnaHQ9PT10LnJpZ2h0fWNsb25lKCl7cmV0dXJuIG5ldyBiYSh0aGlzLnRvcCx0aGlzLmJvdHRvbSx0aGlzLmxlZnQsdGhpcy5yaWdodCl9dG9KU09OKCl7cmV0dXJuIHt0b3A6dGhpcy50b3AsYm90dG9tOnRoaXMuYm90dG9tLGxlZnQ6dGhpcy5sZWZ0LHJpZ2h0OnRoaXMucmlnaHR9fX1jb25zdCB3YT04NS4wNTExMjk7Y2xhc3MgVGF7Y29uc3RydWN0b3IodCxpLGEscyxvKXt0aGlzLnRpbGVTaXplPTUxMix0aGlzLl9yZW5kZXJXb3JsZENvcGllcz12b2lkIDA9PT1vfHwhIW8sdGhpcy5fbWluWm9vbT10fHwwLHRoaXMuX21heFpvb209aXx8MjIsdGhpcy5fbWluUGl0Y2g9bnVsbD09YT8wOmEsdGhpcy5fbWF4UGl0Y2g9bnVsbD09cz82MDpzLHRoaXMuc2V0TWF4Qm91bmRzKCksdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5fY2VudGVyPW5ldyBlLk4oMCwwKSx0aGlzLl9lbGV2YXRpb249MCx0aGlzLnpvb209MCx0aGlzLmFuZ2xlPTAsdGhpcy5fZm92PS42NDM1MDExMDg3OTMyODQ0LHRoaXMuX3BpdGNoPTAsdGhpcy5fdW5tb2RpZmllZD0hMCx0aGlzLl9lZGdlSW5zZXRzPW5ldyBiYSx0aGlzLl9wb3NNYXRyaXhDYWNoZT17fSx0aGlzLl9hbGlnbmVkUG9zTWF0cml4Q2FjaGU9e30sdGhpcy5fZm9nTWF0cml4Q2FjaGU9e30sdGhpcy5taW5FbGV2YXRpb25Gb3JDdXJyZW50VGlsZT0wO31jbG9uZSgpe2NvbnN0IHQ9bmV3IFRhKHRoaXMuX21pblpvb20sdGhpcy5fbWF4Wm9vbSx0aGlzLl9taW5QaXRjaCx0aGlzLm1heFBpdGNoLHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKTtyZXR1cm4gdC5hcHBseSh0aGlzKSx0fWFwcGx5KHQpe3RoaXMudGlsZVNpemU9dC50aWxlU2l6ZSx0aGlzLmxhdFJhbmdlPXQubGF0UmFuZ2UsdGhpcy5sbmdSYW5nZT10LmxuZ1JhbmdlLHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLl9jZW50ZXI9dC5fY2VudGVyLHRoaXMuX2VsZXZhdGlvbj10Ll9lbGV2YXRpb24sdGhpcy5taW5FbGV2YXRpb25Gb3JDdXJyZW50VGlsZT10Lm1pbkVsZXZhdGlvbkZvckN1cnJlbnRUaWxlLHRoaXMuem9vbT10Lnpvb20sdGhpcy5hbmdsZT10LmFuZ2xlLHRoaXMuX2Zvdj10Ll9mb3YsdGhpcy5fcGl0Y2g9dC5fcGl0Y2gsdGhpcy5fdW5tb2RpZmllZD10Ll91bm1vZGlmaWVkLHRoaXMuX2VkZ2VJbnNldHM9dC5fZWRnZUluc2V0cy5jbG9uZSgpLHRoaXMuX2NhbGNNYXRyaWNlcygpO31nZXQgbWluWm9vbSgpe3JldHVybiB0aGlzLl9taW5ab29tfXNldCBtaW5ab29tKHQpe3RoaXMuX21pblpvb20hPT10JiYodGhpcy5fbWluWm9vbT10LHRoaXMuem9vbT1NYXRoLm1heCh0aGlzLnpvb20sdCkpO31nZXQgbWF4Wm9vbSgpe3JldHVybiB0aGlzLl9tYXhab29tfXNldCBtYXhab29tKHQpe3RoaXMuX21heFpvb20hPT10JiYodGhpcy5fbWF4Wm9vbT10LHRoaXMuem9vbT1NYXRoLm1pbih0aGlzLnpvb20sdCkpO31nZXQgbWluUGl0Y2goKXtyZXR1cm4gdGhpcy5fbWluUGl0Y2h9c2V0IG1pblBpdGNoKHQpe3RoaXMuX21pblBpdGNoIT09dCYmKHRoaXMuX21pblBpdGNoPXQsdGhpcy5waXRjaD1NYXRoLm1heCh0aGlzLnBpdGNoLHQpKTt9Z2V0IG1heFBpdGNoKCl7cmV0dXJuIHRoaXMuX21heFBpdGNofXNldCBtYXhQaXRjaCh0KXt0aGlzLl9tYXhQaXRjaCE9PXQmJih0aGlzLl9tYXhQaXRjaD10LHRoaXMucGl0Y2g9TWF0aC5taW4odGhpcy5waXRjaCx0KSk7fWdldCByZW5kZXJXb3JsZENvcGllcygpe3JldHVybiB0aGlzLl9yZW5kZXJXb3JsZENvcGllc31zZXQgcmVuZGVyV29ybGRDb3BpZXModCl7dm9pZCAwPT09dD90PSEwOm51bGw9PT10JiYodD0hMSksdGhpcy5fcmVuZGVyV29ybGRDb3BpZXM9dDt9Z2V0IHdvcmxkU2l6ZSgpe3JldHVybiB0aGlzLnRpbGVTaXplKnRoaXMuc2NhbGV9Z2V0IGNlbnRlck9mZnNldCgpe3JldHVybiB0aGlzLmNlbnRlclBvaW50Ll9zdWIodGhpcy5zaXplLl9kaXYoMikpfWdldCBzaXplKCl7cmV0dXJuIG5ldyBlLlAodGhpcy53aWR0aCx0aGlzLmhlaWdodCl9Z2V0IGJlYXJpbmcoKXtyZXR1cm4gLXRoaXMuYW5nbGUvTWF0aC5QSSoxODB9c2V0IGJlYXJpbmcodCl7Y29uc3QgaT0tZS5iMyh0LC0xODAsMTgwKSpNYXRoLlBJLzE4MDt0aGlzLmFuZ2xlIT09aSYmKHRoaXMuX3VubW9kaWZpZWQ9ITEsdGhpcy5hbmdsZT1pLHRoaXMuX2NhbGNNYXRyaWNlcygpLHRoaXMucm90YXRpb25NYXRyaXg9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgZS5BKDQpO3JldHVybiBlLkEhPUZsb2F0MzJBcnJheSYmKHRbMV09MCx0WzJdPTApLHRbMF09MSx0WzNdPTEsdH0oKSxmdW5jdGlvbih0LGUsaSl7dmFyIGE9ZVswXSxzPWVbMV0sbz1lWzJdLHI9ZVszXSxuPU1hdGguc2luKGkpLGw9TWF0aC5jb3MoaSk7dFswXT1hKmwrbypuLHRbMV09cypsK3Iqbix0WzJdPWEqLW4rbypsLHRbM109cyotbityKmw7fSh0aGlzLnJvdGF0aW9uTWF0cml4LHRoaXMucm90YXRpb25NYXRyaXgsdGhpcy5hbmdsZSkpO31nZXQgcGl0Y2goKXtyZXR1cm4gdGhpcy5fcGl0Y2gvTWF0aC5QSSoxODB9c2V0IHBpdGNoKHQpe2NvbnN0IGk9ZS5hYyh0LHRoaXMubWluUGl0Y2gsdGhpcy5tYXhQaXRjaCkvMTgwKk1hdGguUEk7dGhpcy5fcGl0Y2ghPT1pJiYodGhpcy5fdW5tb2RpZmllZD0hMSx0aGlzLl9waXRjaD1pLHRoaXMuX2NhbGNNYXRyaWNlcygpKTt9Z2V0IGZvdigpe3JldHVybiB0aGlzLl9mb3YvTWF0aC5QSSoxODB9c2V0IGZvdih0KXt0PU1hdGgubWF4KC4wMSxNYXRoLm1pbig2MCx0KSksdGhpcy5fZm92IT09dCYmKHRoaXMuX3VubW9kaWZpZWQ9ITEsdGhpcy5fZm92PXQvMTgwKk1hdGguUEksdGhpcy5fY2FsY01hdHJpY2VzKCkpO31nZXQgem9vbSgpe3JldHVybiB0aGlzLl96b29tfXNldCB6b29tKHQpe2NvbnN0IGU9TWF0aC5taW4oTWF0aC5tYXgodCx0aGlzLm1pblpvb20pLHRoaXMubWF4Wm9vbSk7dGhpcy5fem9vbSE9PWUmJih0aGlzLl91bm1vZGlmaWVkPSExLHRoaXMuX3pvb209ZSx0aGlzLnRpbGVab29tPU1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSksdGhpcy5zY2FsZT10aGlzLnpvb21TY2FsZShlKSx0aGlzLl9jb25zdHJhaW4oKSx0aGlzLl9jYWxjTWF0cmljZXMoKSk7fWdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5fY2VudGVyfXNldCBjZW50ZXIodCl7dC5sYXQ9PT10aGlzLl9jZW50ZXIubGF0JiZ0LmxuZz09PXRoaXMuX2NlbnRlci5sbmd8fCh0aGlzLl91bm1vZGlmaWVkPSExLHRoaXMuX2NlbnRlcj10LHRoaXMuX2NvbnN0cmFpbigpLHRoaXMuX2NhbGNNYXRyaWNlcygpKTt9Z2V0IGVsZXZhdGlvbigpe3JldHVybiB0aGlzLl9lbGV2YXRpb259c2V0IGVsZXZhdGlvbih0KXt0IT09dGhpcy5fZWxldmF0aW9uJiYodGhpcy5fZWxldmF0aW9uPXQsdGhpcy5fY29uc3RyYWluKCksdGhpcy5fY2FsY01hdHJpY2VzKCkpO31nZXQgcGFkZGluZygpe3JldHVybiB0aGlzLl9lZGdlSW5zZXRzLnRvSlNPTigpfXNldCBwYWRkaW5nKHQpe3RoaXMuX2VkZ2VJbnNldHMuZXF1YWxzKHQpfHwodGhpcy5fdW5tb2RpZmllZD0hMSx0aGlzLl9lZGdlSW5zZXRzLmludGVycG9sYXRlKHRoaXMuX2VkZ2VJbnNldHMsdCwxKSx0aGlzLl9jYWxjTWF0cmljZXMoKSk7fWdldCBjZW50ZXJQb2ludCgpe3JldHVybiB0aGlzLl9lZGdlSW5zZXRzLmdldENlbnRlcih0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1pc1BhZGRpbmdFcXVhbCh0KXtyZXR1cm4gdGhpcy5fZWRnZUluc2V0cy5lcXVhbHModCl9aW50ZXJwb2xhdGVQYWRkaW5nKHQsZSxpKXt0aGlzLl91bm1vZGlmaWVkPSExLHRoaXMuX2VkZ2VJbnNldHMuaW50ZXJwb2xhdGUodCxlLGkpLHRoaXMuX2NvbnN0cmFpbigpLHRoaXMuX2NhbGNNYXRyaWNlcygpO31jb3ZlcmluZ1pvb21MZXZlbCh0KXtjb25zdCBlPSh0LnJvdW5kWm9vbT9NYXRoLnJvdW5kOk1hdGguZmxvb3IpKHRoaXMuem9vbSt0aGlzLnNjYWxlWm9vbSh0aGlzLnRpbGVTaXplL3QudGlsZVNpemUpKTtyZXR1cm4gTWF0aC5tYXgoMCxlKX1nZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXModCl7Y29uc3QgaT1bbmV3IGUuYjQoMCx0KV07aWYodGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpe2NvbnN0IGE9dGhpcy5wb2ludENvb3JkaW5hdGUobmV3IGUuUCgwLDApKSxzPXRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBlLlAodGhpcy53aWR0aCwwKSksbz10aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgZS5QKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpKSxyPXRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBlLlAoMCx0aGlzLmhlaWdodCkpLG49TWF0aC5mbG9vcihNYXRoLm1pbihhLngscy54LG8ueCxyLngpKSxsPU1hdGguZmxvb3IoTWF0aC5tYXgoYS54LHMueCxvLngsci54KSksaD0xO2ZvcihsZXQgYT1uLWg7YTw9bCtoO2ErKykwIT09YSYmaS5wdXNoKG5ldyBlLmI0KGEsdCkpO31yZXR1cm4gaX1jb3ZlcmluZ1RpbGVzKHQpe3ZhciBpLGE7bGV0IHM9dGhpcy5jb3ZlcmluZ1pvb21MZXZlbCh0KTtjb25zdCBvPXM7aWYodm9pZCAwIT09dC5taW56b29tJiZzPHQubWluem9vbSlyZXR1cm4gW107dm9pZCAwIT09dC5tYXh6b29tJiZzPnQubWF4em9vbSYmKHM9dC5tYXh6b29tKTtjb25zdCByPXRoaXMucG9pbnRDb29yZGluYXRlKHRoaXMuZ2V0Q2FtZXJhUG9pbnQoKSksbj1lLlouZnJvbUxuZ0xhdCh0aGlzLmNlbnRlciksbD1NYXRoLnBvdygyLHMpLGg9W2wqci54LGwqci55LDBdLGM9W2wqbi54LGwqbi55LDBdLHU9eGEuZnJvbUludlByb2plY3Rpb25NYXRyaXgodGhpcy5pbnZNb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4LHRoaXMud29ybGRTaXplLHMpO2xldCBkPXQubWluem9vbXx8MDshdC50ZXJyYWluJiZ0aGlzLnBpdGNoPD02MCYmdGhpcy5fZWRnZUluc2V0cy50b3A8LjEmJihkPXMpO2NvbnN0IF89dC50ZXJyYWluPzIvTWF0aC5taW4odGhpcy50aWxlU2l6ZSx0LnRpbGVTaXplKSp0aGlzLnRpbGVTaXplOjMscD10PT4oe2FhYmI6bmV3IHlhKFt0KmwsMCwwXSxbKHQrMSkqbCxsLDBdKSx6b29tOjAseDowLHk6MCx3cmFwOnQsZnVsbHlWaXNpYmxlOiExfSksbT1bXSxmPVtdLGc9cyx4PXQucmVwYXJzZU92ZXJzY2FsZWQ/bzpzO2lmKHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKWZvcihsZXQgdD0xO3Q8PTM7dCsrKW0ucHVzaChwKC10KSksbS5wdXNoKHAodCkpO2ZvcihtLnB1c2gocCgwKSk7bS5sZW5ndGg+MDspe2NvbnN0IHM9bS5wb3AoKSxvPXMueCxyPXMueTtsZXQgbj1zLmZ1bGx5VmlzaWJsZTtpZighbil7Y29uc3QgdD1zLmFhYmIuaW50ZXJzZWN0cyh1KTtpZigwPT09dCljb250aW51ZTtuPTI9PT10O31jb25zdCBsPXQudGVycmFpbj9oOmMscD1zLmFhYmIuZGlzdGFuY2VYKGwpLHk9cy5hYWJiLmRpc3RhbmNlWShsKSxiPU1hdGgubWF4KE1hdGguYWJzKHApLE1hdGguYWJzKHkpKTtpZihzLnpvb209PT1nfHxiPl8rKDE8PGctcy56b29tKS0yJiZzLnpvb20+PWQpe2NvbnN0IHQ9Zy1zLnpvb20saT1oWzBdLS41LShvPDx0KSxhPWhbMV0tLjUtKHI8PHQpO2YucHVzaCh7dGlsZUlEOm5ldyBlLlMocy56b29tPT09Zz94OnMuem9vbSxzLndyYXAscy56b29tLG8sciksZGlzdGFuY2VTcTp2KFtjWzBdLS41LW8sY1sxXS0uNS1yXSksdGlsZURpc3RhbmNlVG9DYW1lcmE6TWF0aC5zcXJ0KGkqaSthKmEpfSk7fWVsc2UgZm9yKGxldCBsPTA7bDw0O2wrKyl7Y29uc3QgaD0obzw8MSkrbCUyLGM9KHI8PDEpKyhsPj4xKSx1PXMuem9vbSsxO2xldCBkPXMuYWFiYi5xdWFkcmFudChsKTtpZih0LnRlcnJhaW4pe2NvbnN0IG89bmV3IGUuUyh1LHMud3JhcCx1LGgsYykscj10LnRlcnJhaW4uZ2V0TWluTWF4RWxldmF0aW9uKG8pLG49bnVsbCE9PShpPXIubWluRWxldmF0aW9uKSYmdm9pZCAwIT09aT9pOnRoaXMuZWxldmF0aW9uLGw9bnVsbCE9PShhPXIubWF4RWxldmF0aW9uKSYmdm9pZCAwIT09YT9hOnRoaXMuZWxldmF0aW9uO2Q9bmV3IHlhKFtkLm1pblswXSxkLm1pblsxXSxuXSxbZC5tYXhbMF0sZC5tYXhbMV0sbF0pO31tLnB1c2goe2FhYmI6ZCx6b29tOnUseDpoLHk6Yyx3cmFwOnMud3JhcCxmdWxseVZpc2libGU6bn0pO319cmV0dXJuIGYuc29ydCgoKHQsZSk9PnQuZGlzdGFuY2VTcS1lLmRpc3RhbmNlU3EpKS5tYXAoKHQ9PnQudGlsZUlEKSl9cmVzaXplKHQsZSl7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5waXhlbHNUb0dMVW5pdHM9WzIvdCwtMi9lXSx0aGlzLl9jb25zdHJhaW4oKSx0aGlzLl9jYWxjTWF0cmljZXMoKTt9Z2V0IHVubW9kaWZpZWQoKXtyZXR1cm4gdGhpcy5fdW5tb2RpZmllZH16b29tU2NhbGUodCl7cmV0dXJuIE1hdGgucG93KDIsdCl9c2NhbGVab29tKHQpe3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLkxOMn1wcm9qZWN0KHQpe2NvbnN0IGk9ZS5hYyh0LmxhdCwtODUuMDUxMTI5LHdhKTtyZXR1cm4gbmV3IGUuUChlLk8odC5sbmcpKnRoaXMud29ybGRTaXplLGUuUShpKSp0aGlzLndvcmxkU2l6ZSl9dW5wcm9qZWN0KHQpe3JldHVybiBuZXcgZS5aKHQueC90aGlzLndvcmxkU2l6ZSx0LnkvdGhpcy53b3JsZFNpemUpLnRvTG5nTGF0KCl9Z2V0IHBvaW50KCl7cmV0dXJuIHRoaXMucHJvamVjdCh0aGlzLmNlbnRlcil9Z2V0Q2FtZXJhUG9zaXRpb24oKXtyZXR1cm4ge2xuZ0xhdDp0aGlzLnBvaW50TG9jYXRpb24odGhpcy5nZXRDYW1lcmFQb2ludCgpKSxhbHRpdHVkZTpNYXRoLmNvcyh0aGlzLl9waXRjaCkqdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlL3RoaXMuX3BpeGVsUGVyTWV0ZXIrdGhpcy5lbGV2YXRpb259fXJlY2FsY3VsYXRlWm9vbSh0KXtjb25zdCBpPXRoaXMuZWxldmF0aW9uLGE9TWF0aC5jb3ModGhpcy5fcGl0Y2gpKnRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZS90aGlzLl9waXhlbFBlck1ldGVyLHM9dGhpcy5wb2ludExvY2F0aW9uKHRoaXMuY2VudGVyUG9pbnQsdCksbz10LmdldEVsZXZhdGlvbkZvckxuZ0xhdFpvb20ocyx0aGlzLnRpbGVab29tKTtpZighKHRoaXMuZWxldmF0aW9uLW8pKXJldHVybjtjb25zdCByPWEraS1vLG49TWF0aC5jb3ModGhpcy5fcGl0Y2gpKnRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZS9yL2UuYjUoMSxzLmxhdCksbD10aGlzLnNjYWxlWm9vbShuL3RoaXMudGlsZVNpemUpO3RoaXMuX2VsZXZhdGlvbj1vLHRoaXMuX2NlbnRlcj1zLHRoaXMuem9vbT1sO31zZXRMb2NhdGlvbkF0UG9pbnQodCxpKXtjb25zdCBhPXRoaXMucG9pbnRDb29yZGluYXRlKGkpLHM9dGhpcy5wb2ludENvb3JkaW5hdGUodGhpcy5jZW50ZXJQb2ludCksbz10aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0KSxyPW5ldyBlLlooby54LShhLngtcy54KSxvLnktKGEueS1zLnkpKTt0aGlzLmNlbnRlcj10aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihyKSx0aGlzLl9yZW5kZXJXb3JsZENvcGllcyYmKHRoaXMuY2VudGVyPXRoaXMuY2VudGVyLndyYXAoKSk7fWxvY2F0aW9uUG9pbnQodCxlKXtyZXR1cm4gZT90aGlzLmNvb3JkaW5hdGVQb2ludCh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0KSxlLmdldEVsZXZhdGlvbkZvckxuZ0xhdFpvb20odCx0aGlzLnRpbGVab29tKSx0aGlzLnBpeGVsTWF0cml4M0QpOnRoaXMuY29vcmRpbmF0ZVBvaW50KHRoaXMubG9jYXRpb25Db29yZGluYXRlKHQpKX1wb2ludExvY2F0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHQsZSkpfWxvY2F0aW9uQ29vcmRpbmF0ZSh0KXtyZXR1cm4gZS5aLmZyb21MbmdMYXQodCl9Y29vcmRpbmF0ZUxvY2F0aW9uKHQpe3JldHVybiB0JiZ0LnRvTG5nTGF0KCl9cG9pbnRDb29yZGluYXRlKHQsaSl7aWYoaSl7Y29uc3QgZT1pLnBvaW50Q29vcmRpbmF0ZSh0KTtpZihudWxsIT1lKXJldHVybiBlfWNvbnN0IGE9W3QueCx0LnksMCwxXSxzPVt0LngsdC55LDEsMV07ZS5hZihhLGEsdGhpcy5waXhlbE1hdHJpeEludmVyc2UpLGUuYWYocyxzLHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtjb25zdCBvPWFbM10scj1zWzNdLG49YVsxXS9vLGw9c1sxXS9yLGg9YVsyXS9vLGM9c1syXS9yLHU9aD09PWM/MDooMC1oKS8oYy1oKTtyZXR1cm4gbmV3IGUuWihlLnkubnVtYmVyKGFbMF0vbyxzWzBdL3IsdSkvdGhpcy53b3JsZFNpemUsZS55Lm51bWJlcihuLGwsdSkvdGhpcy53b3JsZFNpemUpfWNvb3JkaW5hdGVQb2ludCh0LGk9MCxhPXRoaXMucGl4ZWxNYXRyaXgpe2NvbnN0IHM9W3QueCp0aGlzLndvcmxkU2l6ZSx0LnkqdGhpcy53b3JsZFNpemUsaSwxXTtyZXR1cm4gZS5hZihzLHMsYSksbmV3IGUuUChzWzBdL3NbM10sc1sxXS9zWzNdKX1nZXRCb3VuZHMoKXtjb25zdCB0PU1hdGgubWF4KDAsdGhpcy5oZWlnaHQvMi10aGlzLmdldEhvcml6b24oKSk7cmV0dXJuIChuZXcgSCkuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgZS5QKDAsdCkpKS5leHRlbmQodGhpcy5wb2ludExvY2F0aW9uKG5ldyBlLlAodGhpcy53aWR0aCx0KSkpLmV4dGVuZCh0aGlzLnBvaW50TG9jYXRpb24obmV3IGUuUCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSkpLmV4dGVuZCh0aGlzLnBvaW50TG9jYXRpb24obmV3IGUuUCgwLHRoaXMuaGVpZ2h0KSkpfWdldE1heEJvdW5kcygpe3JldHVybiB0aGlzLmxhdFJhbmdlJiYyPT09dGhpcy5sYXRSYW5nZS5sZW5ndGgmJnRoaXMubG5nUmFuZ2UmJjI9PT10aGlzLmxuZ1JhbmdlLmxlbmd0aD9uZXcgSChbdGhpcy5sbmdSYW5nZVswXSx0aGlzLmxhdFJhbmdlWzBdXSxbdGhpcy5sbmdSYW5nZVsxXSx0aGlzLmxhdFJhbmdlWzFdXSk6bnVsbH1nZXRIb3Jpem9uKCl7cmV0dXJuIE1hdGgudGFuKE1hdGguUEkvMi10aGlzLl9waXRjaCkqdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlKi44NX1zZXRNYXhCb3VuZHModCl7dD8odGhpcy5sbmdSYW5nZT1bdC5nZXRXZXN0KCksdC5nZXRFYXN0KCldLHRoaXMubGF0UmFuZ2U9W3QuZ2V0U291dGgoKSx0LmdldE5vcnRoKCldLHRoaXMuX2NvbnN0cmFpbigpKToodGhpcy5sbmdSYW5nZT1udWxsLHRoaXMubGF0UmFuZ2U9Wy04NS4wNTExMjksd2FdKTt9Y2FsY3VsYXRlVGlsZU1hdHJpeCh0KXtjb25zdCBpPXQuY2Fub25pY2FsLGE9dGhpcy53b3JsZFNpemUvdGhpcy56b29tU2NhbGUoaS56KSxzPWkueCtNYXRoLnBvdygyLGkueikqdC53cmFwLG89ZS5hbihuZXcgRmxvYXQ2NEFycmF5KDE2KSk7cmV0dXJuIGUuSihvLG8sW3MqYSxpLnkqYSwwXSksZS5LKG8sbyxbYS9lLlgsYS9lLlgsMV0pLG99Y2FsY3VsYXRlUG9zTWF0cml4KHQsaT0hMSl7Y29uc3QgYT10LmtleSxzPWk/dGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlOnRoaXMuX3Bvc01hdHJpeENhY2hlO2lmKHNbYV0pcmV0dXJuIHNbYV07Y29uc3Qgbz10aGlzLmNhbGN1bGF0ZVRpbGVNYXRyaXgodCk7cmV0dXJuIGUuTChvLGk/dGhpcy5hbGlnbmVkTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeDp0aGlzLm1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgsbyksc1thXT1uZXcgRmxvYXQzMkFycmF5KG8pLHNbYV19Y2FsY3VsYXRlRm9nTWF0cml4KHQpe2NvbnN0IGk9dC5rZXksYT10aGlzLl9mb2dNYXRyaXhDYWNoZTtpZihhW2ldKXJldHVybiBhW2ldO2NvbnN0IHM9dGhpcy5jYWxjdWxhdGVUaWxlTWF0cml4KHQpO3JldHVybiBlLkwocyx0aGlzLmZvZ01hdHJpeCxzKSxhW2ldPW5ldyBGbG9hdDMyQXJyYXkocyksYVtpXX1jdXN0b21MYXllck1hdHJpeCgpe3JldHVybiB0aGlzLm1lcmNhdG9yTWF0cml4LnNsaWNlKCl9Z2V0Q29uc3RyYWluZWQodCxpKXtpPWUuYWMoK2ksdGhpcy5taW5ab29tLHRoaXMubWF4Wm9vbSk7Y29uc3QgYT17Y2VudGVyOm5ldyBlLk4odC5sbmcsdC5sYXQpLHpvb206aX07bGV0IHM9dGhpcy5sbmdSYW5nZTtpZighdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMmJm51bGw9PT1zKXtjb25zdCB0PTE4MC0xZS0xMDtzPVstdCx0XTt9Y29uc3Qgbz10aGlzLnRpbGVTaXplKnRoaXMuem9vbVNjYWxlKGEuem9vbSk7bGV0IHI9MCxuPW8sbD0wLGg9byxjPTAsdT0wO2NvbnN0e3g6ZCx5Ol99PXRoaXMuc2l6ZTtpZih0aGlzLmxhdFJhbmdlKXtjb25zdCB0PXRoaXMubGF0UmFuZ2U7cj1lLlEodFsxXSkqbyxuPWUuUSh0WzBdKSpvLG4tcjxfJiYoYz1fLyhuLXIpKTt9cyYmKGw9ZS5iMyhlLk8oc1swXSkqbywwLG8pLGg9ZS5iMyhlLk8oc1sxXSkqbywwLG8pLGg8bCYmKGgrPW8pLGgtbDxkJiYodT1kLyhoLWwpKSk7Y29uc3R7eDpwLHk6bX09dGhpcy5wcm9qZWN0LmNhbGwoe3dvcmxkU2l6ZTpvfSx0KTtsZXQgZixnO2NvbnN0IHY9TWF0aC5tYXgodXx8MCxjfHwwKTtpZih2KXtjb25zdCB0PW5ldyBlLlAodT8oaCtsKS8yOnAsYz8obityKS8yOm0pO3JldHVybiBhLmNlbnRlcj10aGlzLnVucHJvamVjdC5jYWxsKHt3b3JsZFNpemU6b30sdCkud3JhcCgpLGEuem9vbSs9dGhpcy5zY2FsZVpvb20odiksYX1pZih0aGlzLmxhdFJhbmdlKXtjb25zdCB0PV8vMjttLXQ8ciYmKGc9cit0KSxtK3Q+biYmKGc9bi10KTt9aWYocyl7Y29uc3QgdD0obCtoKS8yO2xldCBpPXA7dGhpcy5fcmVuZGVyV29ybGRDb3BpZXMmJihpPWUuYjMocCx0LW8vMix0K28vMikpO2NvbnN0IGE9ZC8yO2ktYTxsJiYoZj1sK2EpLGkrYT5oJiYoZj1oLWEpO31pZih2b2lkIDAhPT1mfHx2b2lkIDAhPT1nKXtjb25zdCB0PW5ldyBlLlAobnVsbCE9Zj9mOnAsbnVsbCE9Zz9nOm0pO2EuY2VudGVyPXRoaXMudW5wcm9qZWN0LmNhbGwoe3dvcmxkU2l6ZTpvfSx0KS53cmFwKCk7fXJldHVybiBhfV9jb25zdHJhaW4oKXtpZighdGhpcy5jZW50ZXJ8fCF0aGlzLndpZHRofHwhdGhpcy5oZWlnaHR8fHRoaXMuX2NvbnN0cmFpbmluZylyZXR1cm47dGhpcy5fY29uc3RyYWluaW5nPSEwO2NvbnN0IHQ9dGhpcy5fdW5tb2RpZmllZCx7Y2VudGVyOmUsem9vbTppfT10aGlzLmdldENvbnN0cmFpbmVkKHRoaXMuY2VudGVyLHRoaXMuem9vbSk7dGhpcy5jZW50ZXI9ZSx0aGlzLnpvb209aSx0aGlzLl91bm1vZGlmaWVkPXQsdGhpcy5fY29uc3RyYWluaW5nPSExO31fY2FsY01hdHJpY2VzKCl7aWYoIXRoaXMuaGVpZ2h0KXJldHVybjtjb25zdCB0PXRoaXMuY2VudGVyT2Zmc2V0LGk9dGhpcy5wb2ludC54LGE9dGhpcy5wb2ludC55O3RoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZT0uNS9NYXRoLnRhbih0aGlzLl9mb3YvMikqdGhpcy5oZWlnaHQsdGhpcy5fcGl4ZWxQZXJNZXRlcj1lLmI1KDEsdGhpcy5jZW50ZXIubGF0KSp0aGlzLndvcmxkU2l6ZTtsZXQgcz1lLmFuKG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtlLksocyxzLFt0aGlzLndpZHRoLzIsLXRoaXMuaGVpZ2h0LzIsMV0pLGUuSihzLHMsWzEsLTEsMF0pLHRoaXMubGFiZWxQbGFuZU1hdHJpeD1zLHM9ZS5hbihuZXcgRmxvYXQ2NEFycmF5KDE2KSksZS5LKHMscyxbMSwtMSwxXSksZS5KKHMscyxbLTEsLTEsMF0pLGUuSyhzLHMsWzIvdGhpcy53aWR0aCwyL3RoaXMuaGVpZ2h0LDFdKSx0aGlzLmdsQ29vcmRNYXRyaXg9cztjb25zdCBvPXRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSt0aGlzLl9lbGV2YXRpb24qdGhpcy5fcGl4ZWxQZXJNZXRlci9NYXRoLmNvcyh0aGlzLl9waXRjaCkscj1NYXRoLm1pbih0aGlzLmVsZXZhdGlvbix0aGlzLm1pbkVsZXZhdGlvbkZvckN1cnJlbnRUaWxlKSxuPW8tcip0aGlzLl9waXhlbFBlck1ldGVyL01hdGguY29zKHRoaXMuX3BpdGNoKSxsPXI8MD9uOm8saD1NYXRoLlBJLzIrdGhpcy5fcGl0Y2gsYz10aGlzLl9mb3YqKC41K3QueS90aGlzLmhlaWdodCksdT1NYXRoLnNpbihjKSpsL01hdGguc2luKGUuYWMoTWF0aC5QSS1oLWMsLjAxLE1hdGguUEktLjAxKSksZD10aGlzLmdldEhvcml6b24oKSxfPTIqTWF0aC5hdGFuKGQvdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlKSooLjUrdC55LygyKmQpKSxwPU1hdGguc2luKF8pKmwvTWF0aC5zaW4oZS5hYyhNYXRoLlBJLWgtXywuMDEsTWF0aC5QSS0uMDEpKSxtPU1hdGgubWluKHUscCk7dGhpcy5mYXJaPTEuMDEqKE1hdGguY29zKE1hdGguUEkvMi10aGlzLl9waXRjaCkqbStsKSx0aGlzLm5lYXJaPXRoaXMuaGVpZ2h0LzUwLHM9bmV3IEZsb2F0NjRBcnJheSgxNiksZS5iNihzLHRoaXMuX2Zvdix0aGlzLndpZHRoL3RoaXMuaGVpZ2h0LHRoaXMubmVhclosdGhpcy5mYXJaKSxzWzhdPTIqLXQueC90aGlzLndpZHRoLHNbOV09Mip0LnkvdGhpcy5oZWlnaHQsdGhpcy5wcm9qZWN0aW9uTWF0cml4PWUuYWUocyksZS5LKHMscyxbMSwtMSwxXSksZS5KKHMscyxbMCwwLC10aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2VdKSxlLmI3KHMscyx0aGlzLl9waXRjaCksZS5hZChzLHMsdGhpcy5hbmdsZSksZS5KKHMscyxbLWksLWEsMF0pLHRoaXMubWVyY2F0b3JNYXRyaXg9ZS5LKFtdLHMsW3RoaXMud29ybGRTaXplLHRoaXMud29ybGRTaXplLHRoaXMud29ybGRTaXplXSksZS5LKHMscyxbMSwxLHRoaXMuX3BpeGVsUGVyTWV0ZXJdKSx0aGlzLnBpeGVsTWF0cml4PWUuTChuZXcgRmxvYXQ2NEFycmF5KDE2KSx0aGlzLmxhYmVsUGxhbmVNYXRyaXgscyksZS5KKHMscyxbMCwwLC10aGlzLmVsZXZhdGlvbl0pLHRoaXMubW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeD1zLHRoaXMuaW52TW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeD1lLmFzKFtdLHMpLHRoaXMuZm9nTWF0cml4PW5ldyBGbG9hdDY0QXJyYXkoMTYpLGUuYjYodGhpcy5mb2dNYXRyaXgsdGhpcy5fZm92LHRoaXMud2lkdGgvdGhpcy5oZWlnaHQsbyx0aGlzLmZhclopLHRoaXMuZm9nTWF0cml4WzhdPTIqLXQueC90aGlzLndpZHRoLHRoaXMuZm9nTWF0cml4WzldPTIqdC55L3RoaXMuaGVpZ2h0LGUuSyh0aGlzLmZvZ01hdHJpeCx0aGlzLmZvZ01hdHJpeCxbMSwtMSwxXSksZS5KKHRoaXMuZm9nTWF0cml4LHRoaXMuZm9nTWF0cml4LFswLDAsLXRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZV0pLGUuYjcodGhpcy5mb2dNYXRyaXgsdGhpcy5mb2dNYXRyaXgsdGhpcy5fcGl0Y2gpLGUuYWQodGhpcy5mb2dNYXRyaXgsdGhpcy5mb2dNYXRyaXgsdGhpcy5hbmdsZSksZS5KKHRoaXMuZm9nTWF0cml4LHRoaXMuZm9nTWF0cml4LFstaSwtYSwwXSksZS5LKHRoaXMuZm9nTWF0cml4LHRoaXMuZm9nTWF0cml4LFsxLDEsdGhpcy5fcGl4ZWxQZXJNZXRlcl0pLGUuSih0aGlzLmZvZ01hdHJpeCx0aGlzLmZvZ01hdHJpeCxbMCwwLC10aGlzLmVsZXZhdGlvbl0pLHRoaXMucGl4ZWxNYXRyaXgzRD1lLkwobmV3IEZsb2F0NjRBcnJheSgxNiksdGhpcy5sYWJlbFBsYW5lTWF0cml4LHMpO2NvbnN0IGY9dGhpcy53aWR0aCUyLzIsZz10aGlzLmhlaWdodCUyLzIsdj1NYXRoLmNvcyh0aGlzLmFuZ2xlKSx4PU1hdGguc2luKHRoaXMuYW5nbGUpLHk9aS1NYXRoLnJvdW5kKGkpK3YqZit4KmcsYj1hLU1hdGgucm91bmQoYSkrdipnK3gqZix3PW5ldyBGbG9hdDY0QXJyYXkocyk7aWYoZS5KKHcsdyxbeT4uNT95LTE6eSxiPi41P2ItMTpiLDBdKSx0aGlzLmFsaWduZWRNb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4PXcscz1lLmFzKG5ldyBGbG9hdDY0QXJyYXkoMTYpLHRoaXMucGl4ZWxNYXRyaXgpLCFzKXRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byBpbnZlcnQgbWF0cml4XCIpO3RoaXMucGl4ZWxNYXRyaXhJbnZlcnNlPXMsdGhpcy5fcG9zTWF0cml4Q2FjaGU9e30sdGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlPXt9LHRoaXMuX2ZvZ01hdHJpeENhY2hlPXt9O31tYXhQaXRjaFNjYWxlRmFjdG9yKCl7aWYoIXRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKXJldHVybiAxO2NvbnN0IHQ9dGhpcy5wb2ludENvb3JkaW5hdGUobmV3IGUuUCgwLDApKSxpPVt0LngqdGhpcy53b3JsZFNpemUsdC55KnRoaXMud29ybGRTaXplLDAsMV07cmV0dXJuIGUuYWYoaSxpLHRoaXMucGl4ZWxNYXRyaXgpWzNdL3RoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZX1nZXRDYW1lcmFQb2ludCgpe2NvbnN0IHQ9TWF0aC50YW4odGhpcy5fcGl0Y2gpKih0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2V8fDEpO3JldHVybiB0aGlzLmNlbnRlclBvaW50LmFkZChuZXcgZS5QKDAsdCkpfWdldENhbWVyYVF1ZXJ5R2VvbWV0cnkodCl7Y29uc3QgaT10aGlzLmdldENhbWVyYVBvaW50KCk7aWYoMT09PXQubGVuZ3RoKXJldHVybiBbdFswXSxpXTt7bGV0IGE9aS54LHM9aS55LG89aS54LHI9aS55O2Zvcihjb25zdCBlIG9mIHQpYT1NYXRoLm1pbihhLGUueCkscz1NYXRoLm1pbihzLGUueSksbz1NYXRoLm1heChvLGUueCkscj1NYXRoLm1heChyLGUueSk7cmV0dXJuIFtuZXcgZS5QKGEscyksbmV3IGUuUChvLHMpLG5ldyBlLlAobyxyKSxuZXcgZS5QKGEsciksbmV3IGUuUChhLHMpXX19bG5nTGF0VG9DYW1lcmFEZXB0aCh0LGkpe2NvbnN0IGE9dGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUodCkscz1bYS54KnRoaXMud29ybGRTaXplLGEueSp0aGlzLndvcmxkU2l6ZSxpLDFdO3JldHVybiBlLmFmKHMscyx0aGlzLm1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgpLHNbMl0vc1szXX19ZnVuY3Rpb24gSWEodCxlKXtsZXQgaSxhPSExLHM9bnVsbCxvPW51bGw7Y29uc3Qgcj0oKT0+e3M9bnVsbCxhJiYodC5hcHBseShvLGkpLHM9c2V0VGltZW91dChyLGUpLGE9ITEpO307cmV0dXJuICguLi50KT0+KGE9ITAsbz10aGlzLGk9dCxzfHxyKCkscyl9Y2xhc3MgRWF7Y29uc3RydWN0b3IodCl7dGhpcy5fZ2V0Q3VycmVudEhhc2g9KCk9Pntjb25zdCB0PXdpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoXCIjXCIsXCJcIik7aWYodGhpcy5faGFzaE5hbWUpe2xldCBlO3JldHVybiB0LnNwbGl0KFwiJlwiKS5tYXAoKHQ9PnQuc3BsaXQoXCI9XCIpKSkuZm9yRWFjaCgodD0+e3RbMF09PT10aGlzLl9oYXNoTmFtZSYmKGU9dCk7fSkpLChlJiZlWzFdfHxcIlwiKS5zcGxpdChcIi9cIil9cmV0dXJuIHQuc3BsaXQoXCIvXCIpfSx0aGlzLl9vbkhhc2hDaGFuZ2U9KCk9Pntjb25zdCB0PXRoaXMuX2dldEN1cnJlbnRIYXNoKCk7aWYodC5sZW5ndGg+PTMmJiF0LnNvbWUoKHQ9PmlzTmFOKHQpKSkpe2NvbnN0IGU9dGhpcy5fbWFwLmRyYWdSb3RhdGUuaXNFbmFibGVkKCkmJnRoaXMuX21hcC50b3VjaFpvb21Sb3RhdGUuaXNFbmFibGVkKCk/Kyh0WzNdfHwwKTp0aGlzLl9tYXAuZ2V0QmVhcmluZygpO3JldHVybiB0aGlzLl9tYXAuanVtcFRvKHtjZW50ZXI6Wyt0WzJdLCt0WzFdXSx6b29tOit0WzBdLGJlYXJpbmc6ZSxwaXRjaDorKHRbNF18fDApfSksITB9cmV0dXJuICExfSx0aGlzLl91cGRhdGVIYXNoVW50aHJvdHRsZWQ9KCk9Pntjb25zdCB0PXdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoLygjLiopPyQvLHRoaXMuZ2V0SGFzaFN0cmluZygpKTt3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUod2luZG93Lmhpc3Rvcnkuc3RhdGUsbnVsbCx0KTt9LHRoaXMuX3JlbW92ZUhhc2g9KCk9Pntjb25zdCB0PXRoaXMuX2dldEN1cnJlbnRIYXNoKCk7aWYoMD09PXQubGVuZ3RoKXJldHVybjtjb25zdCBlPXQuam9pbihcIi9cIik7bGV0IGk9ZTtpLnNwbGl0KFwiJlwiKS5sZW5ndGg+MCYmKGk9aS5zcGxpdChcIiZcIilbMF0pLHRoaXMuX2hhc2hOYW1lJiYoaT1gJHt0aGlzLl9oYXNoTmFtZX09JHtlfWApO2xldCBhPXdpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoaSxcIlwiKTthLnN0YXJ0c1dpdGgoXCIjJlwiKT9hPWEuc2xpY2UoMCwxKSthLnNsaWNlKDIpOlwiI1wiPT09YSYmKGE9XCJcIik7bGV0IHM9d2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvKCMuKyk/JC8sYSk7cz1zLnJlcGxhY2UoXCImJlwiLFwiJlwiKSx3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUod2luZG93Lmhpc3Rvcnkuc3RhdGUsbnVsbCxzKTt9LHRoaXMuX3VwZGF0ZUhhc2g9SWEodGhpcy5fdXBkYXRlSGFzaFVudGhyb3R0bGVkLDMwMCksdGhpcy5faGFzaE5hbWU9dCYmZW5jb2RlVVJJQ29tcG9uZW50KHQpO31hZGRUbyh0KXtyZXR1cm4gdGhpcy5fbWFwPXQsYWRkRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIix0aGlzLl9vbkhhc2hDaGFuZ2UsITEpLHRoaXMuX21hcC5vbihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGVIYXNoKSx0aGlzfXJlbW92ZSgpe3JldHVybiByZW1vdmVFdmVudExpc3RlbmVyKFwiaGFzaGNoYW5nZVwiLHRoaXMuX29uSGFzaENoYW5nZSwhMSksdGhpcy5fbWFwLm9mZihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGVIYXNoKSxjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlSGFzaCgpKSx0aGlzLl9yZW1vdmVIYXNoKCksZGVsZXRlIHRoaXMuX21hcCx0aGlzfWdldEhhc2hTdHJpbmcodCl7Y29uc3QgZT10aGlzLl9tYXAuZ2V0Q2VudGVyKCksaT1NYXRoLnJvdW5kKDEwMCp0aGlzLl9tYXAuZ2V0Wm9vbSgpKS8xMDAsYT1NYXRoLmNlaWwoKGkqTWF0aC5MTjIrTWF0aC5sb2coNTEyLzM2MC8uNSkpL01hdGguTE4xMCkscz1NYXRoLnBvdygxMCxhKSxvPU1hdGgucm91bmQoZS5sbmcqcykvcyxyPU1hdGgucm91bmQoZS5sYXQqcykvcyxuPXRoaXMuX21hcC5nZXRCZWFyaW5nKCksbD10aGlzLl9tYXAuZ2V0UGl0Y2goKTtsZXQgaD1cIlwiO2lmKGgrPXQ/YC8ke299LyR7cn0vJHtpfWA6YCR7aX0vJHtyfS8ke299YCwobnx8bCkmJihoKz1cIi9cIitNYXRoLnJvdW5kKDEwKm4pLzEwKSxsJiYoaCs9YC8ke01hdGgucm91bmQobCl9YCksdGhpcy5faGFzaE5hbWUpe2NvbnN0IHQ9dGhpcy5faGFzaE5hbWU7bGV0IGU9ITE7Y29uc3QgaT13aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKS5zcGxpdChcIiZcIikubWFwKChpPT57Y29uc3QgYT1pLnNwbGl0KFwiPVwiKVswXTtyZXR1cm4gYT09PXQ/KGU9ITAsYCR7YX09JHtofWApOml9KSkuZmlsdGVyKCh0PT50KSk7cmV0dXJuIGV8fGkucHVzaChgJHt0fT0ke2h9YCksYCMke2kuam9pbihcIiZcIil9YH1yZXR1cm4gYCMke2h9YH19Y29uc3QgUGE9e2xpbmVhcml0eTouMyxlYXNpbmc6ZS5iOCgwLDAsLjMsMSl9LENhPWUuZSh7ZGVjZWxlcmF0aW9uOjI1MDAsbWF4U3BlZWQ6MTQwMH0sUGEpLFNhPWUuZSh7ZGVjZWxlcmF0aW9uOjIwLG1heFNwZWVkOjE0MDB9LFBhKSx6YT1lLmUoe2RlY2VsZXJhdGlvbjoxZTMsbWF4U3BlZWQ6MzYwfSxQYSksRGE9ZS5lKHtkZWNlbGVyYXRpb246MWUzLG1heFNwZWVkOjkwfSxQYSk7Y2xhc3MgTWF7Y29uc3RydWN0b3IodCl7dGhpcy5fbWFwPXQsdGhpcy5jbGVhcigpO31jbGVhcigpe3RoaXMuX2luZXJ0aWFCdWZmZXI9W107fXJlY29yZCh0KXt0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKSx0aGlzLl9pbmVydGlhQnVmZmVyLnB1c2goe3RpbWU6by5ub3coKSxzZXR0aW5nczp0fSk7fV9kcmFpbkluZXJ0aWFCdWZmZXIoKXtjb25zdCB0PXRoaXMuX2luZXJ0aWFCdWZmZXIsZT1vLm5vdygpO2Zvcig7dC5sZW5ndGg+MCYmZS10WzBdLnRpbWU+MTYwOyl0LnNoaWZ0KCk7fV9vbk1vdmVFbmQodCl7aWYodGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCksdGhpcy5faW5lcnRpYUJ1ZmZlci5sZW5ndGg8MilyZXR1cm47Y29uc3QgaT17em9vbTowLGJlYXJpbmc6MCxwaXRjaDowLHBhbjpuZXcgZS5QKDAsMCkscGluY2hBcm91bmQ6dm9pZCAwLGFyb3VuZDp2b2lkIDB9O2Zvcihjb25zdHtzZXR0aW5nczp0fW9mIHRoaXMuX2luZXJ0aWFCdWZmZXIpaS56b29tKz10Lnpvb21EZWx0YXx8MCxpLmJlYXJpbmcrPXQuYmVhcmluZ0RlbHRhfHwwLGkucGl0Y2grPXQucGl0Y2hEZWx0YXx8MCx0LnBhbkRlbHRhJiZpLnBhbi5fYWRkKHQucGFuRGVsdGEpLHQuYXJvdW5kJiYoaS5hcm91bmQ9dC5hcm91bmQpLHQucGluY2hBcm91bmQmJihpLnBpbmNoQXJvdW5kPXQucGluY2hBcm91bmQpO2NvbnN0IGE9dGhpcy5faW5lcnRpYUJ1ZmZlclt0aGlzLl9pbmVydGlhQnVmZmVyLmxlbmd0aC0xXS50aW1lLXRoaXMuX2luZXJ0aWFCdWZmZXJbMF0udGltZSxzPXt9O2lmKGkucGFuLm1hZygpKXtjb25zdCBvPVJhKGkucGFuLm1hZygpLGEsZS5lKHt9LENhLHR8fHt9KSk7cy5vZmZzZXQ9aS5wYW4ubXVsdChvLmFtb3VudC9pLnBhbi5tYWcoKSkscy5jZW50ZXI9dGhpcy5fbWFwLnRyYW5zZm9ybS5jZW50ZXIsQWEocyxvKTt9aWYoaS56b29tKXtjb25zdCB0PVJhKGkuem9vbSxhLFNhKTtzLnpvb209dGhpcy5fbWFwLnRyYW5zZm9ybS56b29tK3QuYW1vdW50LEFhKHMsdCk7fWlmKGkuYmVhcmluZyl7Y29uc3QgdD1SYShpLmJlYXJpbmcsYSx6YSk7cy5iZWFyaW5nPXRoaXMuX21hcC50cmFuc2Zvcm0uYmVhcmluZytlLmFjKHQuYW1vdW50LC0xNzksMTc5KSxBYShzLHQpO31pZihpLnBpdGNoKXtjb25zdCB0PVJhKGkucGl0Y2gsYSxEYSk7cy5waXRjaD10aGlzLl9tYXAudHJhbnNmb3JtLnBpdGNoK3QuYW1vdW50LEFhKHMsdCk7fWlmKHMuem9vbXx8cy5iZWFyaW5nKXtjb25zdCB0PXZvaWQgMD09PWkucGluY2hBcm91bmQ/aS5hcm91bmQ6aS5waW5jaEFyb3VuZDtzLmFyb3VuZD10P3RoaXMuX21hcC51bnByb2plY3QodCk6dGhpcy5fbWFwLmdldENlbnRlcigpO31yZXR1cm4gdGhpcy5jbGVhcigpLGUuZShzLHtub01vdmVTdGFydDohMH0pfX1mdW5jdGlvbiBBYSh0LGUpeyghdC5kdXJhdGlvbnx8dC5kdXJhdGlvbjxlLmR1cmF0aW9uKSYmKHQuZHVyYXRpb249ZS5kdXJhdGlvbix0LmVhc2luZz1lLmVhc2luZyk7fWZ1bmN0aW9uIFJhKHQsaSxhKXtjb25zdHttYXhTcGVlZDpzLGxpbmVhcml0eTpvLGRlY2VsZXJhdGlvbjpyfT1hLG49ZS5hYyh0Km8vKGkvMWUzKSwtcyxzKSxsPU1hdGguYWJzKG4pLyhyKm8pO3JldHVybiB7ZWFzaW5nOmEuZWFzaW5nLGR1cmF0aW9uOjFlMypsLGFtb3VudDpuKihsLzIpfX1jbGFzcyBrYSBleHRlbmRzIGUua3twcmV2ZW50RGVmYXVsdCgpe3RoaXMuX2RlZmF1bHRQcmV2ZW50ZWQ9ITA7fWdldCBkZWZhdWx0UHJldmVudGVkKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWR9Y29uc3RydWN0b3IodCxpLGEscz17fSl7Y29uc3Qgbz1yLm1vdXNlUG9zKGkuZ2V0Q2FudmFzKCksYSksbj1pLnVucHJvamVjdChvKTtzdXBlcih0LGUuZSh7cG9pbnQ6byxsbmdMYXQ6bixvcmlnaW5hbEV2ZW50OmF9LHMpKSx0aGlzLl9kZWZhdWx0UHJldmVudGVkPSExLHRoaXMudGFyZ2V0PWk7fX1jbGFzcyBMYSBleHRlbmRzIGUua3twcmV2ZW50RGVmYXVsdCgpe3RoaXMuX2RlZmF1bHRQcmV2ZW50ZWQ9ITA7fWdldCBkZWZhdWx0UHJldmVudGVkKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWR9Y29uc3RydWN0b3IodCxpLGEpe2NvbnN0IHM9XCJ0b3VjaGVuZFwiPT09dD9hLmNoYW5nZWRUb3VjaGVzOmEudG91Y2hlcyxvPXIudG91Y2hQb3MoaS5nZXRDYW52YXNDb250YWluZXIoKSxzKSxuPW8ubWFwKCh0PT5pLnVucHJvamVjdCh0KSkpLGw9by5yZWR1Y2UoKCh0LGUsaSxhKT0+dC5hZGQoZS5kaXYoYS5sZW5ndGgpKSksbmV3IGUuUCgwLDApKTtzdXBlcih0LHtwb2ludHM6byxwb2ludDpsLGxuZ0xhdHM6bixsbmdMYXQ6aS51bnByb2plY3QobCksb3JpZ2luYWxFdmVudDphfSksdGhpcy5fZGVmYXVsdFByZXZlbnRlZD0hMTt9fWNsYXNzIEZhIGV4dGVuZHMgZS5re3ByZXZlbnREZWZhdWx0KCl7dGhpcy5fZGVmYXVsdFByZXZlbnRlZD0hMDt9Z2V0IGRlZmF1bHRQcmV2ZW50ZWQoKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZH1jb25zdHJ1Y3Rvcih0LGUsaSl7c3VwZXIodCx7b3JpZ2luYWxFdmVudDppfSksdGhpcy5fZGVmYXVsdFByZXZlbnRlZD0hMTt9fWNsYXNzIEJhe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fbWFwPXQsdGhpcy5fY2xpY2tUb2xlcmFuY2U9ZS5jbGlja1RvbGVyYW5jZTt9cmVzZXQoKXtkZWxldGUgdGhpcy5fbW91c2Vkb3duUG9zO313aGVlbCh0KXtyZXR1cm4gdGhpcy5fZmlyZVByZXZlbnRhYmxlKG5ldyBGYSh0LnR5cGUsdGhpcy5fbWFwLHQpKX1tb3VzZWRvd24odCxlKXtyZXR1cm4gdGhpcy5fbW91c2Vkb3duUG9zPWUsdGhpcy5fZmlyZVByZXZlbnRhYmxlKG5ldyBrYSh0LnR5cGUsdGhpcy5fbWFwLHQpKX1tb3VzZXVwKHQpe3RoaXMuX21hcC5maXJlKG5ldyBrYSh0LnR5cGUsdGhpcy5fbWFwLHQpKTt9Y2xpY2sodCxlKXt0aGlzLl9tb3VzZWRvd25Qb3MmJnRoaXMuX21vdXNlZG93blBvcy5kaXN0KGUpPj10aGlzLl9jbGlja1RvbGVyYW5jZXx8dGhpcy5fbWFwLmZpcmUobmV3IGthKHQudHlwZSx0aGlzLl9tYXAsdCkpO31kYmxjbGljayh0KXtyZXR1cm4gdGhpcy5fZmlyZVByZXZlbnRhYmxlKG5ldyBrYSh0LnR5cGUsdGhpcy5fbWFwLHQpKX1tb3VzZW92ZXIodCl7dGhpcy5fbWFwLmZpcmUobmV3IGthKHQudHlwZSx0aGlzLl9tYXAsdCkpO31tb3VzZW91dCh0KXt0aGlzLl9tYXAuZmlyZShuZXcga2EodC50eXBlLHRoaXMuX21hcCx0KSk7fXRvdWNoc3RhcnQodCl7cmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgTGEodC50eXBlLHRoaXMuX21hcCx0KSl9dG91Y2htb3ZlKHQpe3RoaXMuX21hcC5maXJlKG5ldyBMYSh0LnR5cGUsdGhpcy5fbWFwLHQpKTt9dG91Y2hlbmQodCl7dGhpcy5fbWFwLmZpcmUobmV3IExhKHQudHlwZSx0aGlzLl9tYXAsdCkpO310b3VjaGNhbmNlbCh0KXt0aGlzLl9tYXAuZmlyZShuZXcgTGEodC50eXBlLHRoaXMuX21hcCx0KSk7fV9maXJlUHJldmVudGFibGUodCl7aWYodGhpcy5fbWFwLmZpcmUodCksdC5kZWZhdWx0UHJldmVudGVkKXJldHVybiB7fX1pc0VuYWJsZWQoKXtyZXR1cm4gITB9aXNBY3RpdmUoKXtyZXR1cm4gITF9ZW5hYmxlKCl7fWRpc2FibGUoKXt9fWNsYXNzIE9he2NvbnN0cnVjdG9yKHQpe3RoaXMuX21hcD10O31yZXNldCgpe3RoaXMuX2RlbGF5Q29udGV4dE1lbnU9ITEsdGhpcy5faWdub3JlQ29udGV4dE1lbnU9ITAsZGVsZXRlIHRoaXMuX2NvbnRleHRNZW51RXZlbnQ7fW1vdXNlbW92ZSh0KXt0aGlzLl9tYXAuZmlyZShuZXcga2EodC50eXBlLHRoaXMuX21hcCx0KSk7fW1vdXNlZG93bigpe3RoaXMuX2RlbGF5Q29udGV4dE1lbnU9ITAsdGhpcy5faWdub3JlQ29udGV4dE1lbnU9ITE7fW1vdXNldXAoKXt0aGlzLl9kZWxheUNvbnRleHRNZW51PSExLHRoaXMuX2NvbnRleHRNZW51RXZlbnQmJih0aGlzLl9tYXAuZmlyZShuZXcga2EoXCJjb250ZXh0bWVudVwiLHRoaXMuX21hcCx0aGlzLl9jb250ZXh0TWVudUV2ZW50KSksZGVsZXRlIHRoaXMuX2NvbnRleHRNZW51RXZlbnQpO31jb250ZXh0bWVudSh0KXt0aGlzLl9kZWxheUNvbnRleHRNZW51P3RoaXMuX2NvbnRleHRNZW51RXZlbnQ9dDp0aGlzLl9pZ25vcmVDb250ZXh0TWVudXx8dGhpcy5fbWFwLmZpcmUobmV3IGthKHQudHlwZSx0aGlzLl9tYXAsdCkpLHRoaXMuX21hcC5saXN0ZW5zKFwiY29udGV4dG1lbnVcIikmJnQucHJldmVudERlZmF1bHQoKTt9aXNFbmFibGVkKCl7cmV0dXJuICEwfWlzQWN0aXZlKCl7cmV0dXJuICExfWVuYWJsZSgpe31kaXNhYmxlKCl7fX1jbGFzcyBOYXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9tYXA9dDt9Z2V0IHRyYW5zZm9ybSgpe3JldHVybiB0aGlzLl9tYXAuX3JlcXVlc3RlZENhbWVyYVN0YXRlfHx0aGlzLl9tYXAudHJhbnNmb3JtfWdldCBjZW50ZXIoKXtyZXR1cm4ge2xuZzp0aGlzLnRyYW5zZm9ybS5jZW50ZXIubG5nLGxhdDp0aGlzLnRyYW5zZm9ybS5jZW50ZXIubGF0fX1nZXQgem9vbSgpe3JldHVybiB0aGlzLnRyYW5zZm9ybS56b29tfWdldCBwaXRjaCgpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5waXRjaH1nZXQgYmVhcmluZygpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihlLlAuY29udmVydCh0KSx0aGlzLl9tYXAudGVycmFpbil9fWNsYXNzIFVhe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fbWFwPXQsdGhpcy5fdHI9bmV3IE5hKHQpLHRoaXMuX2VsPXQuZ2V0Q2FudmFzQ29udGFpbmVyKCksdGhpcy5fY29udGFpbmVyPXQuZ2V0Q29udGFpbmVyKCksdGhpcy5fY2xpY2tUb2xlcmFuY2U9ZS5jbGlja1RvbGVyYW5jZXx8MTt9aXNFbmFibGVkKCl7cmV0dXJuICEhdGhpcy5fZW5hYmxlZH1pc0FjdGl2ZSgpe3JldHVybiAhIXRoaXMuX2FjdGl2ZX1lbmFibGUoKXt0aGlzLmlzRW5hYmxlZCgpfHwodGhpcy5fZW5hYmxlZD0hMCk7fWRpc2FibGUoKXt0aGlzLmlzRW5hYmxlZCgpJiYodGhpcy5fZW5hYmxlZD0hMSk7fW1vdXNlZG93bih0LGUpe3RoaXMuaXNFbmFibGVkKCkmJnQuc2hpZnRLZXkmJjA9PT10LmJ1dHRvbiYmKHIuZGlzYWJsZURyYWcoKSx0aGlzLl9zdGFydFBvcz10aGlzLl9sYXN0UG9zPWUsdGhpcy5fYWN0aXZlPSEwKTt9bW91c2Vtb3ZlV2luZG93KHQsZSl7aWYoIXRoaXMuX2FjdGl2ZSlyZXR1cm47Y29uc3QgaT1lO2lmKHRoaXMuX2xhc3RQb3MuZXF1YWxzKGkpfHwhdGhpcy5fYm94JiZpLmRpc3QodGhpcy5fc3RhcnRQb3MpPHRoaXMuX2NsaWNrVG9sZXJhbmNlKXJldHVybjtjb25zdCBhPXRoaXMuX3N0YXJ0UG9zO3RoaXMuX2xhc3RQb3M9aSx0aGlzLl9ib3h8fCh0aGlzLl9ib3g9ci5jcmVhdGUoXCJkaXZcIixcIm1hcGxpYnJlZ2wtYm94em9vbVwiLHRoaXMuX2NvbnRhaW5lciksdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWNyb3NzaGFpclwiKSx0aGlzLl9maXJlRXZlbnQoXCJib3h6b29tc3RhcnRcIix0KSk7Y29uc3Qgcz1NYXRoLm1pbihhLngsaS54KSxvPU1hdGgubWF4KGEueCxpLngpLG49TWF0aC5taW4oYS55LGkueSksbD1NYXRoLm1heChhLnksaS55KTtyLnNldFRyYW5zZm9ybSh0aGlzLl9ib3gsYHRyYW5zbGF0ZSgke3N9cHgsJHtufXB4KWApLHRoaXMuX2JveC5zdHlsZS53aWR0aD1vLXMrXCJweFwiLHRoaXMuX2JveC5zdHlsZS5oZWlnaHQ9bC1uK1wicHhcIjt9bW91c2V1cFdpbmRvdyh0LGkpe2lmKCF0aGlzLl9hY3RpdmUpcmV0dXJuO2lmKDAhPT10LmJ1dHRvbilyZXR1cm47Y29uc3QgYT10aGlzLl9zdGFydFBvcyxzPWk7aWYodGhpcy5yZXNldCgpLHIuc3VwcHJlc3NDbGljaygpLGEueCE9PXMueHx8YS55IT09cy55KXJldHVybiB0aGlzLl9tYXAuZmlyZShuZXcgZS5rKFwiYm94em9vbWVuZFwiLHtvcmlnaW5hbEV2ZW50OnR9KSkse2NhbWVyYUFuaW1hdGlvbjp0PT50LmZpdFNjcmVlbkNvb3JkaW5hdGVzKGEscyx0aGlzLl90ci5iZWFyaW5nLHtsaW5lYXI6ITB9KX07dGhpcy5fZmlyZUV2ZW50KFwiYm94em9vbWNhbmNlbFwiLHQpO31rZXlkb3duKHQpe3RoaXMuX2FjdGl2ZSYmMjc9PT10LmtleUNvZGUmJih0aGlzLnJlc2V0KCksdGhpcy5fZmlyZUV2ZW50KFwiYm94em9vbWNhbmNlbFwiLHQpKTt9cmVzZXQoKXt0aGlzLl9hY3RpdmU9ITEsdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWNyb3NzaGFpclwiKSx0aGlzLl9ib3gmJihyLnJlbW92ZSh0aGlzLl9ib3gpLHRoaXMuX2JveD1udWxsKSxyLmVuYWJsZURyYWcoKSxkZWxldGUgdGhpcy5fc3RhcnRQb3MsZGVsZXRlIHRoaXMuX2xhc3RQb3M7fV9maXJlRXZlbnQodCxpKXtyZXR1cm4gdGhpcy5fbWFwLmZpcmUobmV3IGUuayh0LHtvcmlnaW5hbEV2ZW50Oml9KSl9fWZ1bmN0aW9uIGphKHQsZSl7aWYodC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBudW1iZXIgb2YgdG91Y2hlcyBhbmQgcG9pbnRzIGFyZSBub3QgZXF1YWwgLSB0b3VjaGVzICR7dC5sZW5ndGh9LCBwb2ludHMgJHtlLmxlbmd0aH1gKTtjb25zdCBpPXt9O2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSsrKWlbdFthXS5pZGVudGlmaWVyXT1lW2FdO3JldHVybiBpfWNsYXNzIFphe2NvbnN0cnVjdG9yKHQpe3RoaXMucmVzZXQoKSx0aGlzLm51bVRvdWNoZXM9dC5udW1Ub3VjaGVzO31yZXNldCgpe2RlbGV0ZSB0aGlzLmNlbnRyb2lkLGRlbGV0ZSB0aGlzLnN0YXJ0VGltZSxkZWxldGUgdGhpcy50b3VjaGVzLHRoaXMuYWJvcnRlZD0hMTt9dG91Y2hzdGFydCh0LGksYSl7KHRoaXMuY2VudHJvaWR8fGEubGVuZ3RoPnRoaXMubnVtVG91Y2hlcykmJih0aGlzLmFib3J0ZWQ9ITApLHRoaXMuYWJvcnRlZHx8KHZvaWQgMD09PXRoaXMuc3RhcnRUaW1lJiYodGhpcy5zdGFydFRpbWU9dC50aW1lU3RhbXApLGEubGVuZ3RoPT09dGhpcy5udW1Ub3VjaGVzJiYodGhpcy5jZW50cm9pZD1mdW5jdGlvbih0KXtjb25zdCBpPW5ldyBlLlAoMCwwKTtmb3IoY29uc3QgZSBvZiB0KWkuX2FkZChlKTtyZXR1cm4gaS5kaXYodC5sZW5ndGgpfShpKSx0aGlzLnRvdWNoZXM9amEoYSxpKSkpO310b3VjaG1vdmUodCxlLGkpe2lmKHRoaXMuYWJvcnRlZHx8IXRoaXMuY2VudHJvaWQpcmV0dXJuO2NvbnN0IGE9amEoaSxlKTtmb3IoY29uc3QgdCBpbiB0aGlzLnRvdWNoZXMpe2NvbnN0IGU9YVt0XTsoIWV8fGUuZGlzdCh0aGlzLnRvdWNoZXNbdF0pPjMwKSYmKHRoaXMuYWJvcnRlZD0hMCk7fX10b3VjaGVuZCh0LGUsaSl7aWYoKCF0aGlzLmNlbnRyb2lkfHx0LnRpbWVTdGFtcC10aGlzLnN0YXJ0VGltZT41MDApJiYodGhpcy5hYm9ydGVkPSEwKSwwPT09aS5sZW5ndGgpe2NvbnN0IHQ9IXRoaXMuYWJvcnRlZCYmdGhpcy5jZW50cm9pZDtpZih0aGlzLnJlc2V0KCksdClyZXR1cm4gdH19fWNsYXNzIHFhe2NvbnN0cnVjdG9yKHQpe3RoaXMuc2luZ2xlVGFwPW5ldyBaYSh0KSx0aGlzLm51bVRhcHM9dC5udW1UYXBzLHRoaXMucmVzZXQoKTt9cmVzZXQoKXt0aGlzLmxhc3RUaW1lPTEvMCxkZWxldGUgdGhpcy5sYXN0VGFwLHRoaXMuY291bnQ9MCx0aGlzLnNpbmdsZVRhcC5yZXNldCgpO310b3VjaHN0YXJ0KHQsZSxpKXt0aGlzLnNpbmdsZVRhcC50b3VjaHN0YXJ0KHQsZSxpKTt9dG91Y2htb3ZlKHQsZSxpKXt0aGlzLnNpbmdsZVRhcC50b3VjaG1vdmUodCxlLGkpO310b3VjaGVuZCh0LGUsaSl7Y29uc3QgYT10aGlzLnNpbmdsZVRhcC50b3VjaGVuZCh0LGUsaSk7aWYoYSl7Y29uc3QgZT10LnRpbWVTdGFtcC10aGlzLmxhc3RUaW1lPDUwMCxpPSF0aGlzLmxhc3RUYXB8fHRoaXMubGFzdFRhcC5kaXN0KGEpPDMwO2lmKGUmJml8fHRoaXMucmVzZXQoKSx0aGlzLmNvdW50KyssdGhpcy5sYXN0VGltZT10LnRpbWVTdGFtcCx0aGlzLmxhc3RUYXA9YSx0aGlzLmNvdW50PT09dGhpcy5udW1UYXBzKXJldHVybiB0aGlzLnJlc2V0KCksYX19fWNsYXNzIFZhe2NvbnN0cnVjdG9yKHQpe3RoaXMuX3RyPW5ldyBOYSh0KSx0aGlzLl96b29tSW49bmV3IHFhKHtudW1Ub3VjaGVzOjEsbnVtVGFwczoyfSksdGhpcy5fem9vbU91dD1uZXcgcWEoe251bVRvdWNoZXM6MixudW1UYXBzOjF9KSx0aGlzLnJlc2V0KCk7fXJlc2V0KCl7dGhpcy5fYWN0aXZlPSExLHRoaXMuX3pvb21Jbi5yZXNldCgpLHRoaXMuX3pvb21PdXQucmVzZXQoKTt9dG91Y2hzdGFydCh0LGUsaSl7dGhpcy5fem9vbUluLnRvdWNoc3RhcnQodCxlLGkpLHRoaXMuX3pvb21PdXQudG91Y2hzdGFydCh0LGUsaSk7fXRvdWNobW92ZSh0LGUsaSl7dGhpcy5fem9vbUluLnRvdWNobW92ZSh0LGUsaSksdGhpcy5fem9vbU91dC50b3VjaG1vdmUodCxlLGkpO310b3VjaGVuZCh0LGUsaSl7Y29uc3QgYT10aGlzLl96b29tSW4udG91Y2hlbmQodCxlLGkpLHM9dGhpcy5fem9vbU91dC50b3VjaGVuZCh0LGUsaSksbz10aGlzLl90cjtyZXR1cm4gYT8odGhpcy5fYWN0aXZlPSEwLHQucHJldmVudERlZmF1bHQoKSxzZXRUaW1lb3V0KCgoKT0+dGhpcy5yZXNldCgpKSwwKSx7Y2FtZXJhQW5pbWF0aW9uOmU9PmUuZWFzZVRvKHtkdXJhdGlvbjozMDAsem9vbTpvLnpvb20rMSxhcm91bmQ6by51bnByb2plY3QoYSl9LHtvcmlnaW5hbEV2ZW50OnR9KX0pOnM/KHRoaXMuX2FjdGl2ZT0hMCx0LnByZXZlbnREZWZhdWx0KCksc2V0VGltZW91dCgoKCk9PnRoaXMucmVzZXQoKSksMCkse2NhbWVyYUFuaW1hdGlvbjplPT5lLmVhc2VUbyh7ZHVyYXRpb246MzAwLHpvb206by56b29tLTEsYXJvdW5kOm8udW5wcm9qZWN0KHMpfSx7b3JpZ2luYWxFdmVudDp0fSl9KTp2b2lkIDB9dG91Y2hjYW5jZWwoKXt0aGlzLnJlc2V0KCk7fWVuYWJsZSgpe3RoaXMuX2VuYWJsZWQ9ITA7fWRpc2FibGUoKXt0aGlzLl9lbmFibGVkPSExLHRoaXMucmVzZXQoKTt9aXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR9aXNBY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfX1jbGFzcyBHYXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbmFibGVkPSEhdC5lbmFibGUsdGhpcy5fbW92ZVN0YXRlTWFuYWdlcj10Lm1vdmVTdGF0ZU1hbmFnZXIsdGhpcy5fY2xpY2tUb2xlcmFuY2U9dC5jbGlja1RvbGVyYW5jZXx8MSx0aGlzLl9tb3ZlRnVuY3Rpb249dC5tb3ZlLHRoaXMuX2FjdGl2YXRlT25TdGFydD0hIXQuYWN0aXZhdGVPblN0YXJ0LHQuYXNzaWduRXZlbnRzKHRoaXMpLHRoaXMucmVzZXQoKTt9cmVzZXQodCl7dGhpcy5fYWN0aXZlPSExLHRoaXMuX21vdmVkPSExLGRlbGV0ZSB0aGlzLl9sYXN0UG9pbnQsdGhpcy5fbW92ZVN0YXRlTWFuYWdlci5lbmRNb3ZlKHQpO31fbW92ZSguLi50KXtjb25zdCBlPXRoaXMuX21vdmVGdW5jdGlvbiguLi50KTtpZihlLmJlYXJpbmdEZWx0YXx8ZS5waXRjaERlbHRhfHxlLmFyb3VuZHx8ZS5wYW5EZWx0YSlyZXR1cm4gdGhpcy5fYWN0aXZlPSEwLGV9ZHJhZ1N0YXJ0KHQsZSl7dGhpcy5pc0VuYWJsZWQoKSYmIXRoaXMuX2xhc3RQb2ludCYmdGhpcy5fbW92ZVN0YXRlTWFuYWdlci5pc1ZhbGlkU3RhcnRFdmVudCh0KSYmKHRoaXMuX21vdmVTdGF0ZU1hbmFnZXIuc3RhcnRNb3ZlKHQpLHRoaXMuX2xhc3RQb2ludD1lLmxlbmd0aD9lWzBdOmUsdGhpcy5fYWN0aXZhdGVPblN0YXJ0JiZ0aGlzLl9sYXN0UG9pbnQmJih0aGlzLl9hY3RpdmU9ITApKTt9ZHJhZ01vdmUodCxlKXtpZighdGhpcy5pc0VuYWJsZWQoKSlyZXR1cm47Y29uc3QgaT10aGlzLl9sYXN0UG9pbnQ7aWYoIWkpcmV0dXJuO2lmKHQucHJldmVudERlZmF1bHQoKSwhdGhpcy5fbW92ZVN0YXRlTWFuYWdlci5pc1ZhbGlkTW92ZUV2ZW50KHQpKXJldHVybiB2b2lkIHRoaXMucmVzZXQodCk7Y29uc3QgYT1lLmxlbmd0aD9lWzBdOmU7cmV0dXJuICF0aGlzLl9tb3ZlZCYmYS5kaXN0KGkpPHRoaXMuX2NsaWNrVG9sZXJhbmNlP3ZvaWQgMDoodGhpcy5fbW92ZWQ9ITAsdGhpcy5fbGFzdFBvaW50PWEsdGhpcy5fbW92ZShpLGEpKX1kcmFnRW5kKHQpe3RoaXMuaXNFbmFibGVkKCkmJnRoaXMuX2xhc3RQb2ludCYmdGhpcy5fbW92ZVN0YXRlTWFuYWdlci5pc1ZhbGlkRW5kRXZlbnQodCkmJih0aGlzLl9tb3ZlZCYmci5zdXBwcmVzc0NsaWNrKCksdGhpcy5yZXNldCh0KSk7fWVuYWJsZSgpe3RoaXMuX2VuYWJsZWQ9ITA7fWRpc2FibGUoKXt0aGlzLl9lbmFibGVkPSExLHRoaXMucmVzZXQoKTt9aXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR9aXNBY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfWdldENsaWNrVG9sZXJhbmNlKCl7cmV0dXJuIHRoaXMuX2NsaWNrVG9sZXJhbmNlfX1jb25zdCBIYT17MDoxLDI6Mn07Y2xhc3MgV2F7Y29uc3RydWN0b3IodCl7dGhpcy5fY29ycmVjdEV2ZW50PXQuY2hlY2tDb3JyZWN0RXZlbnQ7fXN0YXJ0TW92ZSh0KXtjb25zdCBlPXIubW91c2VCdXR0b24odCk7dGhpcy5fZXZlbnRCdXR0b249ZTt9ZW5kTW92ZSh0KXtkZWxldGUgdGhpcy5fZXZlbnRCdXR0b247fWlzVmFsaWRTdGFydEV2ZW50KHQpe3JldHVybiB0aGlzLl9jb3JyZWN0RXZlbnQodCl9aXNWYWxpZE1vdmVFdmVudCh0KXtyZXR1cm4gIWZ1bmN0aW9uKHQsZSl7Y29uc3QgaT1IYVtlXTtyZXR1cm4gdm9pZCAwPT09dC5idXR0b25zfHwodC5idXR0b25zJmkpIT09aX0odCx0aGlzLl9ldmVudEJ1dHRvbil9aXNWYWxpZEVuZEV2ZW50KHQpe3JldHVybiByLm1vdXNlQnV0dG9uKHQpPT09dGhpcy5fZXZlbnRCdXR0b259fWNsYXNzICRhe2NvbnN0cnVjdG9yKCl7dGhpcy5fZmlyc3RUb3VjaD12b2lkIDA7fV9pc09uZUZpbmdlclRvdWNoKHQpe3JldHVybiAxPT09dC50YXJnZXRUb3VjaGVzLmxlbmd0aH1faXNTYW1lVG91Y2hFdmVudCh0KXtyZXR1cm4gdC50YXJnZXRUb3VjaGVzWzBdLmlkZW50aWZpZXI9PT10aGlzLl9maXJzdFRvdWNofXN0YXJ0TW92ZSh0KXt0aGlzLl9maXJzdFRvdWNoPXQudGFyZ2V0VG91Y2hlc1swXS5pZGVudGlmaWVyO31lbmRNb3ZlKHQpe2RlbGV0ZSB0aGlzLl9maXJzdFRvdWNoO31pc1ZhbGlkU3RhcnRFdmVudCh0KXtyZXR1cm4gdGhpcy5faXNPbmVGaW5nZXJUb3VjaCh0KX1pc1ZhbGlkTW92ZUV2ZW50KHQpe3JldHVybiB0aGlzLl9pc09uZUZpbmdlclRvdWNoKHQpJiZ0aGlzLl9pc1NhbWVUb3VjaEV2ZW50KHQpfWlzVmFsaWRFbmRFdmVudCh0KXtyZXR1cm4gdGhpcy5faXNPbmVGaW5nZXJUb3VjaCh0KSYmdGhpcy5faXNTYW1lVG91Y2hFdmVudCh0KX19Y29uc3QgWGE9dD0+e3QubW91c2Vkb3duPXQuZHJhZ1N0YXJ0LHQubW91c2Vtb3ZlV2luZG93PXQuZHJhZ01vdmUsdC5tb3VzZXVwPXQuZHJhZ0VuZCx0LmNvbnRleHRtZW51PXQ9Pnt0LnByZXZlbnREZWZhdWx0KCk7fTt9LEthPSh7ZW5hYmxlOnQsY2xpY2tUb2xlcmFuY2U6ZSxiZWFyaW5nRGVncmVlc1BlclBpeGVsTW92ZWQ6aT0uOH0pPT57Y29uc3QgYT1uZXcgV2Eoe2NoZWNrQ29ycmVjdEV2ZW50OnQ9PjA9PT1yLm1vdXNlQnV0dG9uKHQpJiZ0LmN0cmxLZXl8fDI9PT1yLm1vdXNlQnV0dG9uKHQpfSk7cmV0dXJuIG5ldyBHYSh7Y2xpY2tUb2xlcmFuY2U6ZSxtb3ZlOih0LGUpPT4oe2JlYXJpbmdEZWx0YTooZS54LXQueCkqaX0pLG1vdmVTdGF0ZU1hbmFnZXI6YSxlbmFibGU6dCxhc3NpZ25FdmVudHM6WGF9KX0sSmE9KHtlbmFibGU6dCxjbGlja1RvbGVyYW5jZTplLHBpdGNoRGVncmVlc1BlclBpeGVsTW92ZWQ6aT0tLjV9KT0+e2NvbnN0IGE9bmV3IFdhKHtjaGVja0NvcnJlY3RFdmVudDp0PT4wPT09ci5tb3VzZUJ1dHRvbih0KSYmdC5jdHJsS2V5fHwyPT09ci5tb3VzZUJ1dHRvbih0KX0pO3JldHVybiBuZXcgR2Eoe2NsaWNrVG9sZXJhbmNlOmUsbW92ZToodCxlKT0+KHtwaXRjaERlbHRhOihlLnktdC55KSppfSksbW92ZVN0YXRlTWFuYWdlcjphLGVuYWJsZTp0LGFzc2lnbkV2ZW50czpYYX0pfTtjbGFzcyBZYXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2NsaWNrVG9sZXJhbmNlPXQuY2xpY2tUb2xlcmFuY2V8fDEsdGhpcy5fbWFwPWUsdGhpcy5yZXNldCgpO31yZXNldCgpe3RoaXMuX2FjdGl2ZT0hMSx0aGlzLl90b3VjaGVzPXt9LHRoaXMuX3N1bT1uZXcgZS5QKDAsMCk7fV9zaG91bGRCZVByZXZlbnRlZCh0KXtyZXR1cm4gdDwodGhpcy5fbWFwLmNvb3BlcmF0aXZlR2VzdHVyZXMuaXNFbmFibGVkKCk/MjoxKX10b3VjaHN0YXJ0KHQsZSxpKXtyZXR1cm4gdGhpcy5fY2FsY3VsYXRlVHJhbnNmb3JtKHQsZSxpKX10b3VjaG1vdmUodCxlLGkpe2lmKHRoaXMuX2FjdGl2ZSl7aWYoIXRoaXMuX3Nob3VsZEJlUHJldmVudGVkKGkubGVuZ3RoKSlyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2NhbGN1bGF0ZVRyYW5zZm9ybSh0LGUsaSk7dGhpcy5fbWFwLmNvb3BlcmF0aXZlR2VzdHVyZXMubm90aWZ5R2VzdHVyZUJsb2NrZWQoXCJ0b3VjaF9wYW5cIix0KTt9fXRvdWNoZW5kKHQsZSxpKXt0aGlzLl9jYWxjdWxhdGVUcmFuc2Zvcm0odCxlLGkpLHRoaXMuX2FjdGl2ZSYmdGhpcy5fc2hvdWxkQmVQcmV2ZW50ZWQoaS5sZW5ndGgpJiZ0aGlzLnJlc2V0KCk7fXRvdWNoY2FuY2VsKCl7dGhpcy5yZXNldCgpO31fY2FsY3VsYXRlVHJhbnNmb3JtKHQsaSxhKXthLmxlbmd0aD4wJiYodGhpcy5fYWN0aXZlPSEwKTtjb25zdCBzPWphKGEsaSksbz1uZXcgZS5QKDAsMCkscj1uZXcgZS5QKDAsMCk7bGV0IG49MDtmb3IoY29uc3QgdCBpbiBzKXtjb25zdCBlPXNbdF0saT10aGlzLl90b3VjaGVzW3RdO2kmJihvLl9hZGQoZSksci5fYWRkKGUuc3ViKGkpKSxuKyssc1t0XT1lKTt9aWYodGhpcy5fdG91Y2hlcz1zLHRoaXMuX3Nob3VsZEJlUHJldmVudGVkKG4pfHwhci5tYWcoKSlyZXR1cm47Y29uc3QgbD1yLmRpdihuKTtyZXR1cm4gdGhpcy5fc3VtLl9hZGQobCksdGhpcy5fc3VtLm1hZygpPHRoaXMuX2NsaWNrVG9sZXJhbmNlP3ZvaWQgMDp7YXJvdW5kOm8uZGl2KG4pLHBhbkRlbHRhOmx9fWVuYWJsZSgpe3RoaXMuX2VuYWJsZWQ9ITA7fWRpc2FibGUoKXt0aGlzLl9lbmFibGVkPSExLHRoaXMucmVzZXQoKTt9aXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR9aXNBY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfX1jbGFzcyBRYXtjb25zdHJ1Y3Rvcigpe3RoaXMucmVzZXQoKTt9cmVzZXQoKXt0aGlzLl9hY3RpdmU9ITEsZGVsZXRlIHRoaXMuX2ZpcnN0VHdvVG91Y2hlczt9dG91Y2hzdGFydCh0LGUsaSl7dGhpcy5fZmlyc3RUd29Ub3VjaGVzfHxpLmxlbmd0aDwyfHwodGhpcy5fZmlyc3RUd29Ub3VjaGVzPVtpWzBdLmlkZW50aWZpZXIsaVsxXS5pZGVudGlmaWVyXSx0aGlzLl9zdGFydChbZVswXSxlWzFdXSkpO310b3VjaG1vdmUodCxlLGkpe2lmKCF0aGlzLl9maXJzdFR3b1RvdWNoZXMpcmV0dXJuO3QucHJldmVudERlZmF1bHQoKTtjb25zdFthLHNdPXRoaXMuX2ZpcnN0VHdvVG91Y2hlcyxvPXRzKGksZSxhKSxyPXRzKGksZSxzKTtpZighb3x8IXIpcmV0dXJuO2NvbnN0IG49dGhpcy5fYXJvdW5kQ2VudGVyP251bGw6by5hZGQocikuZGl2KDIpO3JldHVybiB0aGlzLl9tb3ZlKFtvLHJdLG4sdCl9dG91Y2hlbmQodCxlLGkpe2lmKCF0aGlzLl9maXJzdFR3b1RvdWNoZXMpcmV0dXJuO2NvbnN0W2Esc109dGhpcy5fZmlyc3RUd29Ub3VjaGVzLG89dHMoaSxlLGEpLG49dHMoaSxlLHMpO28mJm58fCh0aGlzLl9hY3RpdmUmJnIuc3VwcHJlc3NDbGljaygpLHRoaXMucmVzZXQoKSk7fXRvdWNoY2FuY2VsKCl7dGhpcy5yZXNldCgpO31lbmFibGUodCl7dGhpcy5fZW5hYmxlZD0hMCx0aGlzLl9hcm91bmRDZW50ZXI9ISF0JiZcImNlbnRlclwiPT09dC5hcm91bmQ7fWRpc2FibGUoKXt0aGlzLl9lbmFibGVkPSExLHRoaXMucmVzZXQoKTt9aXNFbmFibGVkKCl7cmV0dXJuICEhdGhpcy5fZW5hYmxlZH1pc0FjdGl2ZSgpe3JldHVybiAhIXRoaXMuX2FjdGl2ZX19ZnVuY3Rpb24gdHModCxlLGkpe2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSsrKWlmKHRbYV0uaWRlbnRpZmllcj09PWkpcmV0dXJuIGVbYV19ZnVuY3Rpb24gZXModCxlKXtyZXR1cm4gTWF0aC5sb2codC9lKS9NYXRoLkxOMn1jbGFzcyBpcyBleHRlbmRzIFFhe3Jlc2V0KCl7c3VwZXIucmVzZXQoKSxkZWxldGUgdGhpcy5fZGlzdGFuY2UsZGVsZXRlIHRoaXMuX3N0YXJ0RGlzdGFuY2U7fV9zdGFydCh0KXt0aGlzLl9zdGFydERpc3RhbmNlPXRoaXMuX2Rpc3RhbmNlPXRbMF0uZGlzdCh0WzFdKTt9X21vdmUodCxlKXtjb25zdCBpPXRoaXMuX2Rpc3RhbmNlO2lmKHRoaXMuX2Rpc3RhbmNlPXRbMF0uZGlzdCh0WzFdKSx0aGlzLl9hY3RpdmV8fCEoTWF0aC5hYnMoZXModGhpcy5fZGlzdGFuY2UsdGhpcy5fc3RhcnREaXN0YW5jZSkpPC4xKSlyZXR1cm4gdGhpcy5fYWN0aXZlPSEwLHt6b29tRGVsdGE6ZXModGhpcy5fZGlzdGFuY2UsaSkscGluY2hBcm91bmQ6ZX19fWZ1bmN0aW9uIGFzKHQsZSl7cmV0dXJuIDE4MCp0LmFuZ2xlV2l0aChlKS9NYXRoLlBJfWNsYXNzIHNzIGV4dGVuZHMgUWF7cmVzZXQoKXtzdXBlci5yZXNldCgpLGRlbGV0ZSB0aGlzLl9taW5EaWFtZXRlcixkZWxldGUgdGhpcy5fc3RhcnRWZWN0b3IsZGVsZXRlIHRoaXMuX3ZlY3Rvcjt9X3N0YXJ0KHQpe3RoaXMuX3N0YXJ0VmVjdG9yPXRoaXMuX3ZlY3Rvcj10WzBdLnN1Yih0WzFdKSx0aGlzLl9taW5EaWFtZXRlcj10WzBdLmRpc3QodFsxXSk7fV9tb3ZlKHQsZSxpKXtjb25zdCBhPXRoaXMuX3ZlY3RvcjtpZih0aGlzLl92ZWN0b3I9dFswXS5zdWIodFsxXSksdGhpcy5fYWN0aXZlfHwhdGhpcy5faXNCZWxvd1RocmVzaG9sZCh0aGlzLl92ZWN0b3IpKXJldHVybiB0aGlzLl9hY3RpdmU9ITAse2JlYXJpbmdEZWx0YTphcyh0aGlzLl92ZWN0b3IsYSkscGluY2hBcm91bmQ6ZX19X2lzQmVsb3dUaHJlc2hvbGQodCl7dGhpcy5fbWluRGlhbWV0ZXI9TWF0aC5taW4odGhpcy5fbWluRGlhbWV0ZXIsdC5tYWcoKSk7Y29uc3QgZT0yNS8oTWF0aC5QSSp0aGlzLl9taW5EaWFtZXRlcikqMzYwLGk9YXModCx0aGlzLl9zdGFydFZlY3Rvcik7cmV0dXJuIE1hdGguYWJzKGkpPGV9fWZ1bmN0aW9uIG9zKHQpe3JldHVybiBNYXRoLmFicyh0LnkpPk1hdGguYWJzKHQueCl9Y2xhc3MgcnMgZXh0ZW5kcyBRYXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX2N1cnJlbnRUb3VjaENvdW50PTAsdGhpcy5fbWFwPXQ7fXJlc2V0KCl7c3VwZXIucmVzZXQoKSx0aGlzLl92YWxpZD12b2lkIDAsZGVsZXRlIHRoaXMuX2ZpcnN0TW92ZSxkZWxldGUgdGhpcy5fbGFzdFBvaW50czt9dG91Y2hzdGFydCh0LGUsaSl7c3VwZXIudG91Y2hzdGFydCh0LGUsaSksdGhpcy5fY3VycmVudFRvdWNoQ291bnQ9aS5sZW5ndGg7fV9zdGFydCh0KXt0aGlzLl9sYXN0UG9pbnRzPXQsb3ModFswXS5zdWIodFsxXSkpJiYodGhpcy5fdmFsaWQ9ITEpO31fbW92ZSh0LGUsaSl7aWYodGhpcy5fbWFwLmNvb3BlcmF0aXZlR2VzdHVyZXMuaXNFbmFibGVkKCkmJnRoaXMuX2N1cnJlbnRUb3VjaENvdW50PDMpcmV0dXJuO2NvbnN0IGE9dFswXS5zdWIodGhpcy5fbGFzdFBvaW50c1swXSkscz10WzFdLnN1Yih0aGlzLl9sYXN0UG9pbnRzWzFdKTtyZXR1cm4gdGhpcy5fdmFsaWQ9dGhpcy5nZXN0dXJlQmVnaW5zVmVydGljYWxseShhLHMsaS50aW1lU3RhbXApLHRoaXMuX3ZhbGlkPyh0aGlzLl9sYXN0UG9pbnRzPXQsdGhpcy5fYWN0aXZlPSEwLHtwaXRjaERlbHRhOihhLnkrcy55KS8yKi0uNX0pOnZvaWQgMH1nZXN0dXJlQmVnaW5zVmVydGljYWxseSh0LGUsaSl7aWYodm9pZCAwIT09dGhpcy5fdmFsaWQpcmV0dXJuIHRoaXMuX3ZhbGlkO2NvbnN0IGE9dC5tYWcoKT49MixzPWUubWFnKCk+PTI7aWYoIWEmJiFzKXJldHVybjtpZighYXx8IXMpcmV0dXJuIHZvaWQgMD09PXRoaXMuX2ZpcnN0TW92ZSYmKHRoaXMuX2ZpcnN0TW92ZT1pKSxpLXRoaXMuX2ZpcnN0TW92ZTwxMDAmJnZvaWQgMDtjb25zdCBvPXQueT4wPT1lLnk+MDtyZXR1cm4gb3ModCkmJm9zKGUpJiZvfX1jb25zdCBucz17cGFuU3RlcDoxMDAsYmVhcmluZ1N0ZXA6MTUscGl0Y2hTdGVwOjEwfTtjbGFzcyBsc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl90cj1uZXcgTmEodCk7Y29uc3QgZT1uczt0aGlzLl9wYW5TdGVwPWUucGFuU3RlcCx0aGlzLl9iZWFyaW5nU3RlcD1lLmJlYXJpbmdTdGVwLHRoaXMuX3BpdGNoU3RlcD1lLnBpdGNoU3RlcCx0aGlzLl9yb3RhdGlvbkRpc2FibGVkPSExO31yZXNldCgpe3RoaXMuX2FjdGl2ZT0hMTt9a2V5ZG93bih0KXtpZih0LmFsdEtleXx8dC5jdHJsS2V5fHx0Lm1ldGFLZXkpcmV0dXJuO2xldCBlPTAsaT0wLGE9MCxzPTAsbz0wO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgNjE6Y2FzZSAxMDc6Y2FzZSAxNzE6Y2FzZSAxODc6ZT0xO2JyZWFrO2Nhc2UgMTg5OmNhc2UgMTA5OmNhc2UgMTczOmU9LTE7YnJlYWs7Y2FzZSAzNzp0LnNoaWZ0S2V5P2k9LTE6KHQucHJldmVudERlZmF1bHQoKSxzPS0xKTticmVhaztjYXNlIDM5OnQuc2hpZnRLZXk/aT0xOih0LnByZXZlbnREZWZhdWx0KCkscz0xKTticmVhaztjYXNlIDM4OnQuc2hpZnRLZXk/YT0xOih0LnByZXZlbnREZWZhdWx0KCksbz0tMSk7YnJlYWs7Y2FzZSA0MDp0LnNoaWZ0S2V5P2E9LTE6KHQucHJldmVudERlZmF1bHQoKSxvPTEpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXJldHVybiB0aGlzLl9yb3RhdGlvbkRpc2FibGVkJiYoaT0wLGE9MCkse2NhbWVyYUFuaW1hdGlvbjpyPT57Y29uc3Qgbj10aGlzLl90cjtyLmVhc2VUbyh7ZHVyYXRpb246MzAwLGVhc2VJZDpcImtleWJvYXJkSGFuZGxlclwiLGVhc2luZzpocyx6b29tOmU/TWF0aC5yb3VuZChuLnpvb20pK2UqKHQuc2hpZnRLZXk/MjoxKTpuLnpvb20sYmVhcmluZzpuLmJlYXJpbmcraSp0aGlzLl9iZWFyaW5nU3RlcCxwaXRjaDpuLnBpdGNoK2EqdGhpcy5fcGl0Y2hTdGVwLG9mZnNldDpbLXMqdGhpcy5fcGFuU3RlcCwtbyp0aGlzLl9wYW5TdGVwXSxjZW50ZXI6bi5jZW50ZXJ9LHtvcmlnaW5hbEV2ZW50OnR9KTt9fX1lbmFibGUoKXt0aGlzLl9lbmFibGVkPSEwO31kaXNhYmxlKCl7dGhpcy5fZW5hYmxlZD0hMSx0aGlzLnJlc2V0KCk7fWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLl9lbmFibGVkfWlzQWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZX1kaXNhYmxlUm90YXRpb24oKXt0aGlzLl9yb3RhdGlvbkRpc2FibGVkPSEwO31lbmFibGVSb3RhdGlvbigpe3RoaXMuX3JvdGF0aW9uRGlzYWJsZWQ9ITE7fX1mdW5jdGlvbiBocyh0KXtyZXR1cm4gdCooMi10KX1jb25zdCBjcz00LjAwMDI0NDE0MDYyNTtjbGFzcyB1c3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX29uVGltZW91dD10PT57dGhpcy5fdHlwZT1cIndoZWVsXCIsdGhpcy5fZGVsdGEtPXRoaXMuX2xhc3RWYWx1ZSx0aGlzLl9hY3RpdmV8fHRoaXMuX3N0YXJ0KHQpO30sdGhpcy5fbWFwPXQsdGhpcy5fdHI9bmV3IE5hKHQpLHRoaXMuX3RyaWdnZXJSZW5kZXJGcmFtZT1lLHRoaXMuX2RlbHRhPTAsdGhpcy5fZGVmYXVsdFpvb21SYXRlPS4wMSx0aGlzLl93aGVlbFpvb21SYXRlPS4wMDIyMjIyMjIyMjIyMjIyMjIyO31zZXRab29tUmF0ZSh0KXt0aGlzLl9kZWZhdWx0Wm9vbVJhdGU9dDt9c2V0V2hlZWxab29tUmF0ZSh0KXt0aGlzLl93aGVlbFpvb21SYXRlPXQ7fWlzRW5hYmxlZCgpe3JldHVybiAhIXRoaXMuX2VuYWJsZWR9aXNBY3RpdmUoKXtyZXR1cm4gISF0aGlzLl9hY3RpdmV8fHZvaWQgMCE9PXRoaXMuX2ZpbmlzaFRpbWVvdXR9aXNab29taW5nKCl7cmV0dXJuICEhdGhpcy5fem9vbWluZ31lbmFibGUodCl7dGhpcy5pc0VuYWJsZWQoKXx8KHRoaXMuX2VuYWJsZWQ9ITAsdGhpcy5fYXJvdW5kQ2VudGVyPSEhdCYmXCJjZW50ZXJcIj09PXQuYXJvdW5kKTt9ZGlzYWJsZSgpe3RoaXMuaXNFbmFibGVkKCkmJih0aGlzLl9lbmFibGVkPSExKTt9X3Nob3VsZEJlUHJldmVudGVkKHQpe3JldHVybiAhIXRoaXMuX21hcC5jb29wZXJhdGl2ZUdlc3R1cmVzLmlzRW5hYmxlZCgpJiYhKHQuY3RybEtleXx8dGhpcy5fbWFwLmNvb3BlcmF0aXZlR2VzdHVyZXMuaXNCeXBhc3NlZCh0KSl9d2hlZWwodCl7aWYoIXRoaXMuaXNFbmFibGVkKCkpcmV0dXJuO2lmKHRoaXMuX3Nob3VsZEJlUHJldmVudGVkKHQpKXJldHVybiB2b2lkIHRoaXMuX21hcC5jb29wZXJhdGl2ZUdlc3R1cmVzLm5vdGlmeUdlc3R1cmVCbG9ja2VkKFwid2hlZWxfem9vbVwiLHQpO2xldCBlPXQuZGVsdGFNb2RlPT09V2hlZWxFdmVudC5ET01fREVMVEFfTElORT80MCp0LmRlbHRhWTp0LmRlbHRhWTtjb25zdCBpPW8ubm93KCksYT1pLSh0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWV8fDApO3RoaXMuX2xhc3RXaGVlbEV2ZW50VGltZT1pLDAhPT1lJiZlJWNzPT0wP3RoaXMuX3R5cGU9XCJ3aGVlbFwiOjAhPT1lJiZNYXRoLmFicyhlKTw0P3RoaXMuX3R5cGU9XCJ0cmFja3BhZFwiOmE+NDAwPyh0aGlzLl90eXBlPW51bGwsdGhpcy5fbGFzdFZhbHVlPWUsdGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCw0MCx0KSk6dGhpcy5fdHlwZXx8KHRoaXMuX3R5cGU9TWF0aC5hYnMoYSplKTwyMDA/XCJ0cmFja3BhZFwiOlwid2hlZWxcIix0aGlzLl90aW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHRoaXMuX3RpbWVvdXQ9bnVsbCxlKz10aGlzLl9sYXN0VmFsdWUpKSx0LnNoaWZ0S2V5JiZlJiYoZS89NCksdGhpcy5fdHlwZSYmKHRoaXMuX2xhc3RXaGVlbEV2ZW50PXQsdGhpcy5fZGVsdGEtPWUsdGhpcy5fYWN0aXZlfHx0aGlzLl9zdGFydCh0KSksdC5wcmV2ZW50RGVmYXVsdCgpO31fc3RhcnQodCl7aWYoIXRoaXMuX2RlbHRhKXJldHVybjt0aGlzLl9mcmFtZUlkJiYodGhpcy5fZnJhbWVJZD1udWxsKSx0aGlzLl9hY3RpdmU9ITAsdGhpcy5pc1pvb21pbmcoKXx8KHRoaXMuX3pvb21pbmc9ITApLHRoaXMuX2ZpbmlzaFRpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fZmluaXNoVGltZW91dCksZGVsZXRlIHRoaXMuX2ZpbmlzaFRpbWVvdXQpO2NvbnN0IGk9ci5tb3VzZVBvcyh0aGlzLl9tYXAuZ2V0Q2FudmFzKCksdCksYT10aGlzLl90cjt0aGlzLl9hcm91bmQ9aS55PmEudHJhbnNmb3JtLmhlaWdodC8yLWEudHJhbnNmb3JtLmdldEhvcml6b24oKT9lLk4uY29udmVydCh0aGlzLl9hcm91bmRDZW50ZXI/YS5jZW50ZXI6YS51bnByb2plY3QoaSkpOmUuTi5jb252ZXJ0KGEuY2VudGVyKSx0aGlzLl9hcm91bmRQb2ludD1hLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHRoaXMuX2Fyb3VuZCksdGhpcy5fZnJhbWVJZHx8KHRoaXMuX2ZyYW1lSWQ9ITAsdGhpcy5fdHJpZ2dlclJlbmRlckZyYW1lKCkpO31yZW5kZXJGcmFtZSgpe2lmKCF0aGlzLl9mcmFtZUlkKXJldHVybjtpZih0aGlzLl9mcmFtZUlkPW51bGwsIXRoaXMuaXNBY3RpdmUoKSlyZXR1cm47Y29uc3QgdD10aGlzLl90ci50cmFuc2Zvcm07aWYoMCE9PXRoaXMuX2RlbHRhKXtjb25zdCBlPVwid2hlZWxcIj09PXRoaXMuX3R5cGUmJk1hdGguYWJzKHRoaXMuX2RlbHRhKT5jcz90aGlzLl93aGVlbFpvb21SYXRlOnRoaXMuX2RlZmF1bHRab29tUmF0ZTtsZXQgaT0yLygxK01hdGguZXhwKC1NYXRoLmFicyh0aGlzLl9kZWx0YSplKSkpO3RoaXMuX2RlbHRhPDAmJjAhPT1pJiYoaT0xL2kpO2NvbnN0IGE9XCJudW1iZXJcIj09dHlwZW9mIHRoaXMuX3RhcmdldFpvb20/dC56b29tU2NhbGUodGhpcy5fdGFyZ2V0Wm9vbSk6dC5zY2FsZTt0aGlzLl90YXJnZXRab29tPU1hdGgubWluKHQubWF4Wm9vbSxNYXRoLm1heCh0Lm1pblpvb20sdC5zY2FsZVpvb20oYSppKSkpLFwid2hlZWxcIj09PXRoaXMuX3R5cGUmJih0aGlzLl9zdGFydFpvb209dC56b29tLHRoaXMuX2Vhc2luZz10aGlzLl9zbW9vdGhPdXRFYXNpbmcoMjAwKSksdGhpcy5fZGVsdGE9MDt9Y29uc3QgaT1cIm51bWJlclwiPT10eXBlb2YgdGhpcy5fdGFyZ2V0Wm9vbT90aGlzLl90YXJnZXRab29tOnQuem9vbSxhPXRoaXMuX3N0YXJ0Wm9vbSxzPXRoaXMuX2Vhc2luZztsZXQgcixuPSExO2NvbnN0IGw9by5ub3coKS10aGlzLl9sYXN0V2hlZWxFdmVudFRpbWU7aWYoXCJ3aGVlbFwiPT09dGhpcy5fdHlwZSYmYSYmcyYmbCl7Y29uc3QgdD1NYXRoLm1pbihsLzIwMCwxKSxvPXModCk7cj1lLnkubnVtYmVyKGEsaSxvKSx0PDE/dGhpcy5fZnJhbWVJZHx8KHRoaXMuX2ZyYW1lSWQ9ITApOm49ITA7fWVsc2Ugcj1pLG49ITA7cmV0dXJuIHRoaXMuX2FjdGl2ZT0hMCxuJiYodGhpcy5fYWN0aXZlPSExLHRoaXMuX2ZpbmlzaFRpbWVvdXQ9c2V0VGltZW91dCgoKCk9Pnt0aGlzLl96b29taW5nPSExLHRoaXMuX3RyaWdnZXJSZW5kZXJGcmFtZSgpLGRlbGV0ZSB0aGlzLl90YXJnZXRab29tLGRlbGV0ZSB0aGlzLl9maW5pc2hUaW1lb3V0O30pLDIwMCkpLHtub0luZXJ0aWE6ITAsbmVlZHNSZW5kZXJGcmFtZTohbix6b29tRGVsdGE6ci10Lnpvb20sYXJvdW5kOnRoaXMuX2Fyb3VuZFBvaW50LG9yaWdpbmFsRXZlbnQ6dGhpcy5fbGFzdFdoZWVsRXZlbnR9fV9zbW9vdGhPdXRFYXNpbmcodCl7bGV0IGk9ZS5iOTtpZih0aGlzLl9wcmV2RWFzZSl7Y29uc3QgdD10aGlzLl9wcmV2RWFzZSxhPShvLm5vdygpLXQuc3RhcnQpL3QuZHVyYXRpb24scz10LmVhc2luZyhhKy4wMSktdC5lYXNpbmcoYSkscj0uMjcvTWF0aC5zcXJ0KHMqcysxZS00KSouMDEsbj1NYXRoLnNxcnQoLjA3MjktcipyKTtpPWUuYjgocixuLC4yNSwxKTt9cmV0dXJuIHRoaXMuX3ByZXZFYXNlPXtzdGFydDpvLm5vdygpLGR1cmF0aW9uOnQsZWFzaW5nOml9LGl9cmVzZXQoKXt0aGlzLl9hY3RpdmU9ITEsdGhpcy5fem9vbWluZz0hMSxkZWxldGUgdGhpcy5fdGFyZ2V0Wm9vbSx0aGlzLl9maW5pc2hUaW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX2ZpbmlzaFRpbWVvdXQpLGRlbGV0ZSB0aGlzLl9maW5pc2hUaW1lb3V0KTt9fWNsYXNzIGRze2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fY2xpY2tab29tPXQsdGhpcy5fdGFwWm9vbT1lO31lbmFibGUoKXt0aGlzLl9jbGlja1pvb20uZW5hYmxlKCksdGhpcy5fdGFwWm9vbS5lbmFibGUoKTt9ZGlzYWJsZSgpe3RoaXMuX2NsaWNrWm9vbS5kaXNhYmxlKCksdGhpcy5fdGFwWm9vbS5kaXNhYmxlKCk7fWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLl9jbGlja1pvb20uaXNFbmFibGVkKCkmJnRoaXMuX3RhcFpvb20uaXNFbmFibGVkKCl9aXNBY3RpdmUoKXtyZXR1cm4gdGhpcy5fY2xpY2tab29tLmlzQWN0aXZlKCl8fHRoaXMuX3RhcFpvb20uaXNBY3RpdmUoKX19Y2xhc3MgX3N7Y29uc3RydWN0b3IodCl7dGhpcy5fdHI9bmV3IE5hKHQpLHRoaXMucmVzZXQoKTt9cmVzZXQoKXt0aGlzLl9hY3RpdmU9ITE7fWRibGNsaWNrKHQsZSl7cmV0dXJuIHQucHJldmVudERlZmF1bHQoKSx7Y2FtZXJhQW5pbWF0aW9uOmk9PntpLmVhc2VUbyh7ZHVyYXRpb246MzAwLHpvb206dGhpcy5fdHIuem9vbSsodC5zaGlmdEtleT8tMToxKSxhcm91bmQ6dGhpcy5fdHIudW5wcm9qZWN0KGUpfSx7b3JpZ2luYWxFdmVudDp0fSk7fX19ZW5hYmxlKCl7dGhpcy5fZW5hYmxlZD0hMDt9ZGlzYWJsZSgpe3RoaXMuX2VuYWJsZWQ9ITEsdGhpcy5yZXNldCgpO31pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5fZW5hYmxlZH1pc0FjdGl2ZSgpe3JldHVybiB0aGlzLl9hY3RpdmV9fWNsYXNzIHBze2NvbnN0cnVjdG9yKCl7dGhpcy5fdGFwPW5ldyBxYSh7bnVtVG91Y2hlczoxLG51bVRhcHM6MX0pLHRoaXMucmVzZXQoKTt9cmVzZXQoKXt0aGlzLl9hY3RpdmU9ITEsZGVsZXRlIHRoaXMuX3N3aXBlUG9pbnQsZGVsZXRlIHRoaXMuX3N3aXBlVG91Y2gsZGVsZXRlIHRoaXMuX3RhcFRpbWUsZGVsZXRlIHRoaXMuX3RhcFBvaW50LHRoaXMuX3RhcC5yZXNldCgpO310b3VjaHN0YXJ0KHQsZSxpKXtpZighdGhpcy5fc3dpcGVQb2ludClpZih0aGlzLl90YXBUaW1lKXtjb25zdCBhPWVbMF0scz10LnRpbWVTdGFtcC10aGlzLl90YXBUaW1lPDUwMCxvPXRoaXMuX3RhcFBvaW50LmRpc3QoYSk8MzA7cyYmbz9pLmxlbmd0aD4wJiYodGhpcy5fc3dpcGVQb2ludD1hLHRoaXMuX3N3aXBlVG91Y2g9aVswXS5pZGVudGlmaWVyKTp0aGlzLnJlc2V0KCk7fWVsc2UgdGhpcy5fdGFwLnRvdWNoc3RhcnQodCxlLGkpO310b3VjaG1vdmUodCxlLGkpe2lmKHRoaXMuX3RhcFRpbWUpe2lmKHRoaXMuX3N3aXBlUG9pbnQpe2lmKGlbMF0uaWRlbnRpZmllciE9PXRoaXMuX3N3aXBlVG91Y2gpcmV0dXJuO2NvbnN0IGE9ZVswXSxzPWEueS10aGlzLl9zd2lwZVBvaW50Lnk7cmV0dXJuIHRoaXMuX3N3aXBlUG9pbnQ9YSx0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fYWN0aXZlPSEwLHt6b29tRGVsdGE6cy8xMjh9fX1lbHNlIHRoaXMuX3RhcC50b3VjaG1vdmUodCxlLGkpO310b3VjaGVuZCh0LGUsaSl7aWYodGhpcy5fdGFwVGltZSl0aGlzLl9zd2lwZVBvaW50JiYwPT09aS5sZW5ndGgmJnRoaXMucmVzZXQoKTtlbHNlIHtjb25zdCBhPXRoaXMuX3RhcC50b3VjaGVuZCh0LGUsaSk7YSYmKHRoaXMuX3RhcFRpbWU9dC50aW1lU3RhbXAsdGhpcy5fdGFwUG9pbnQ9YSk7fX10b3VjaGNhbmNlbCgpe3RoaXMucmVzZXQoKTt9ZW5hYmxlKCl7dGhpcy5fZW5hYmxlZD0hMDt9ZGlzYWJsZSgpe3RoaXMuX2VuYWJsZWQ9ITEsdGhpcy5yZXNldCgpO31pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5fZW5hYmxlZH1pc0FjdGl2ZSgpe3JldHVybiB0aGlzLl9hY3RpdmV9fWNsYXNzIG1ze2NvbnN0cnVjdG9yKHQsZSxpKXt0aGlzLl9lbD10LHRoaXMuX21vdXNlUGFuPWUsdGhpcy5fdG91Y2hQYW49aTt9ZW5hYmxlKHQpe3RoaXMuX2luZXJ0aWFPcHRpb25zPXR8fHt9LHRoaXMuX21vdXNlUGFuLmVuYWJsZSgpLHRoaXMuX3RvdWNoUGFuLmVuYWJsZSgpLHRoaXMuX2VsLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLXRvdWNoLWRyYWctcGFuXCIpO31kaXNhYmxlKCl7dGhpcy5fbW91c2VQYW4uZGlzYWJsZSgpLHRoaXMuX3RvdWNoUGFuLmRpc2FibGUoKSx0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC10b3VjaC1kcmFnLXBhblwiKTt9aXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuX21vdXNlUGFuLmlzRW5hYmxlZCgpJiZ0aGlzLl90b3VjaFBhbi5pc0VuYWJsZWQoKX1pc0FjdGl2ZSgpe3JldHVybiB0aGlzLl9tb3VzZVBhbi5pc0FjdGl2ZSgpfHx0aGlzLl90b3VjaFBhbi5pc0FjdGl2ZSgpfX1jbGFzcyBmc3tjb25zdHJ1Y3Rvcih0LGUsaSl7dGhpcy5fcGl0Y2hXaXRoUm90YXRlPXQucGl0Y2hXaXRoUm90YXRlLHRoaXMuX21vdXNlUm90YXRlPWUsdGhpcy5fbW91c2VQaXRjaD1pO31lbmFibGUoKXt0aGlzLl9tb3VzZVJvdGF0ZS5lbmFibGUoKSx0aGlzLl9waXRjaFdpdGhSb3RhdGUmJnRoaXMuX21vdXNlUGl0Y2guZW5hYmxlKCk7fWRpc2FibGUoKXt0aGlzLl9tb3VzZVJvdGF0ZS5kaXNhYmxlKCksdGhpcy5fbW91c2VQaXRjaC5kaXNhYmxlKCk7fWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLl9tb3VzZVJvdGF0ZS5pc0VuYWJsZWQoKSYmKCF0aGlzLl9waXRjaFdpdGhSb3RhdGV8fHRoaXMuX21vdXNlUGl0Y2guaXNFbmFibGVkKCkpfWlzQWN0aXZlKCl7cmV0dXJuIHRoaXMuX21vdXNlUm90YXRlLmlzQWN0aXZlKCl8fHRoaXMuX21vdXNlUGl0Y2guaXNBY3RpdmUoKX19Y2xhc3MgZ3N7Y29uc3RydWN0b3IodCxlLGksYSl7dGhpcy5fZWw9dCx0aGlzLl90b3VjaFpvb209ZSx0aGlzLl90b3VjaFJvdGF0ZT1pLHRoaXMuX3RhcERyYWdab29tPWEsdGhpcy5fcm90YXRpb25EaXNhYmxlZD0hMSx0aGlzLl9lbmFibGVkPSEwO31lbmFibGUodCl7dGhpcy5fdG91Y2hab29tLmVuYWJsZSh0KSx0aGlzLl9yb3RhdGlvbkRpc2FibGVkfHx0aGlzLl90b3VjaFJvdGF0ZS5lbmFibGUodCksdGhpcy5fdGFwRHJhZ1pvb20uZW5hYmxlKCksdGhpcy5fZWwuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtdG91Y2gtem9vbS1yb3RhdGVcIik7fWRpc2FibGUoKXt0aGlzLl90b3VjaFpvb20uZGlzYWJsZSgpLHRoaXMuX3RvdWNoUm90YXRlLmRpc2FibGUoKSx0aGlzLl90YXBEcmFnWm9vbS5kaXNhYmxlKCksdGhpcy5fZWwuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtdG91Y2gtem9vbS1yb3RhdGVcIik7fWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLl90b3VjaFpvb20uaXNFbmFibGVkKCkmJih0aGlzLl9yb3RhdGlvbkRpc2FibGVkfHx0aGlzLl90b3VjaFJvdGF0ZS5pc0VuYWJsZWQoKSkmJnRoaXMuX3RhcERyYWdab29tLmlzRW5hYmxlZCgpfWlzQWN0aXZlKCl7cmV0dXJuIHRoaXMuX3RvdWNoWm9vbS5pc0FjdGl2ZSgpfHx0aGlzLl90b3VjaFJvdGF0ZS5pc0FjdGl2ZSgpfHx0aGlzLl90YXBEcmFnWm9vbS5pc0FjdGl2ZSgpfWRpc2FibGVSb3RhdGlvbigpe3RoaXMuX3JvdGF0aW9uRGlzYWJsZWQ9ITAsdGhpcy5fdG91Y2hSb3RhdGUuZGlzYWJsZSgpO31lbmFibGVSb3RhdGlvbigpe3RoaXMuX3JvdGF0aW9uRGlzYWJsZWQ9ITEsdGhpcy5fdG91Y2hab29tLmlzRW5hYmxlZCgpJiZ0aGlzLl90b3VjaFJvdGF0ZS5lbmFibGUoKTt9fWNsYXNzIHZze2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fYnlwYXNzS2V5PS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiTWFjXCIpP1wibWV0YUtleVwiOlwiY3RybEtleVwiLHRoaXMuX21hcD10LHRoaXMuX29wdGlvbnM9ZSx0aGlzLl9lbmFibGVkPSExO31pc0FjdGl2ZSgpe3JldHVybiAhMX1yZXNldCgpe31fc2V0dXBVSSgpe2lmKHRoaXMuX2NvbnRhaW5lcilyZXR1cm47Y29uc3QgdD10aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7dC5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jb29wZXJhdGl2ZS1nZXN0dXJlc1wiKSx0aGlzLl9jb250YWluZXI9ci5jcmVhdGUoXCJkaXZcIixcIm1hcGxpYnJlZ2wtY29vcGVyYXRpdmUtZ2VzdHVyZS1zY3JlZW5cIix0KTtsZXQgZT10aGlzLl9tYXAuX2dldFVJU3RyaW5nKFwiQ29vcGVyYXRpdmVHZXN0dXJlc0hhbmRsZXIuV2luZG93c0hlbHBUZXh0XCIpO1wibWV0YUtleVwiPT09dGhpcy5fYnlwYXNzS2V5JiYoZT10aGlzLl9tYXAuX2dldFVJU3RyaW5nKFwiQ29vcGVyYXRpdmVHZXN0dXJlc0hhbmRsZXIuTWFjSGVscFRleHRcIikpO2NvbnN0IGk9dGhpcy5fbWFwLl9nZXRVSVN0cmluZyhcIkNvb3BlcmF0aXZlR2VzdHVyZXNIYW5kbGVyLk1vYmlsZUhlbHBUZXh0XCIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTthLmNsYXNzTmFtZT1cIm1hcGxpYnJlZ2wtZGVza3RvcC1tZXNzYWdlXCIsYS50ZXh0Q29udGVudD1lLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChhKTtjb25zdCBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7cy5jbGFzc05hbWU9XCJtYXBsaWJyZWdsLW1vYmlsZS1tZXNzYWdlXCIscy50ZXh0Q29udGVudD1pLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChzKSx0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIik7fV9kZXN0cm95VUkoKXt0aGlzLl9jb250YWluZXImJihyLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLHRoaXMuX21hcC5nZXRDYW52YXNDb250YWluZXIoKS5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jb29wZXJhdGl2ZS1nZXN0dXJlc1wiKSksZGVsZXRlIHRoaXMuX2NvbnRhaW5lcjt9ZW5hYmxlKCl7dGhpcy5fc2V0dXBVSSgpLHRoaXMuX2VuYWJsZWQ9ITA7fWRpc2FibGUoKXt0aGlzLl9lbmFibGVkPSExLHRoaXMuX2Rlc3Ryb3lVSSgpO31pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5fZW5hYmxlZH1pc0J5cGFzc2VkKHQpe3JldHVybiB0W3RoaXMuX2J5cGFzc0tleV19bm90aWZ5R2VzdHVyZUJsb2NrZWQodCxpKXt0aGlzLl9lbmFibGVkJiYodGhpcy5fbWFwLmZpcmUobmV3IGUuayhcImNvb3BlcmF0aXZlZ2VzdHVyZXByZXZlbnRlZFwiLHtnZXN0dXJlVHlwZTp0LG9yaWdpbmFsRXZlbnQ6aX0pKSx0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtc2hvd1wiKSxzZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1zaG93XCIpO30pLDEwMCkpO319Y29uc3QgeHM9dD0+dC56b29tfHx0LmRyYWd8fHQucGl0Y2h8fHQucm90YXRlO2NsYXNzIHlzIGV4dGVuZHMgZS5re31mdW5jdGlvbiBicyh0KXtyZXR1cm4gdC5wYW5EZWx0YSYmdC5wYW5EZWx0YS5tYWcoKXx8dC56b29tRGVsdGF8fHQuYmVhcmluZ0RlbHRhfHx0LnBpdGNoRGVsdGF9Y2xhc3Mgd3N7Y29uc3RydWN0b3IodCxlKXt0aGlzLmhhbmRsZVdpbmRvd0V2ZW50PXQ9Pnt0aGlzLmhhbmRsZUV2ZW50KHQsYCR7dC50eXBlfVdpbmRvd2ApO30sdGhpcy5oYW5kbGVFdmVudD0odCxlKT0+e2lmKFwiYmx1clwiPT09dC50eXBlKXJldHVybiB2b2lkIHRoaXMuc3RvcCghMCk7dGhpcy5fdXBkYXRpbmdDYW1lcmE9ITA7Y29uc3QgaT1cInJlbmRlckZyYW1lXCI9PT10LnR5cGU/dm9pZCAwOnQsYT17bmVlZHNSZW5kZXJGcmFtZTohMX0scz17fSxvPXt9LG49dC50b3VjaGVzLGw9bj90aGlzLl9nZXRNYXBUb3VjaGVzKG4pOnZvaWQgMCxoPWw/ci50b3VjaFBvcyh0aGlzLl9tYXAuZ2V0Q2FudmFzKCksbCk6ci5tb3VzZVBvcyh0aGlzLl9tYXAuZ2V0Q2FudmFzKCksdCk7Zm9yKGNvbnN0e2hhbmRsZXJOYW1lOnIsaGFuZGxlcjpuLGFsbG93ZWQ6Y31vZiB0aGlzLl9oYW5kbGVycyl7aWYoIW4uaXNFbmFibGVkKCkpY29udGludWU7bGV0IHU7dGhpcy5fYmxvY2tlZEJ5QWN0aXZlKG8sYyxyKT9uLnJlc2V0KCk6bltlfHx0LnR5cGVdJiYodT1uW2V8fHQudHlwZV0odCxoLGwpLHRoaXMubWVyZ2VIYW5kbGVyUmVzdWx0KGEscyx1LHIsaSksdSYmdS5uZWVkc1JlbmRlckZyYW1lJiZ0aGlzLl90cmlnZ2VyUmVuZGVyRnJhbWUoKSksKHV8fG4uaXNBY3RpdmUoKSkmJihvW3JdPW4pO31jb25zdCBjPXt9O2Zvcihjb25zdCB0IGluIHRoaXMuX3ByZXZpb3VzQWN0aXZlSGFuZGxlcnMpb1t0XXx8KGNbdF09aSk7dGhpcy5fcHJldmlvdXNBY3RpdmVIYW5kbGVycz1vLChPYmplY3Qua2V5cyhjKS5sZW5ndGh8fGJzKGEpKSYmKHRoaXMuX2NoYW5nZXMucHVzaChbYSxzLGNdKSx0aGlzLl90cmlnZ2VyUmVuZGVyRnJhbWUoKSksKE9iamVjdC5rZXlzKG8pLmxlbmd0aHx8YnMoYSkpJiZ0aGlzLl9tYXAuX3N0b3AoITApLHRoaXMuX3VwZGF0aW5nQ2FtZXJhPSExO2NvbnN0e2NhbWVyYUFuaW1hdGlvbjp1fT1hO3UmJih0aGlzLl9pbmVydGlhLmNsZWFyKCksdGhpcy5fZmlyZUV2ZW50cyh7fSx7fSwhMCksdGhpcy5fY2hhbmdlcz1bXSx1KHRoaXMuX21hcCkpO30sdGhpcy5fbWFwPXQsdGhpcy5fZWw9dGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLHRoaXMuX2hhbmRsZXJzPVtdLHRoaXMuX2hhbmRsZXJzQnlJZD17fSx0aGlzLl9jaGFuZ2VzPVtdLHRoaXMuX2luZXJ0aWE9bmV3IE1hKHQpLHRoaXMuX2JlYXJpbmdTbmFwPWUuYmVhcmluZ1NuYXAsdGhpcy5fcHJldmlvdXNBY3RpdmVIYW5kbGVycz17fSx0aGlzLl9ldmVudHNJblByb2dyZXNzPXt9LHRoaXMuX2FkZERlZmF1bHRIYW5kbGVycyhlKTtjb25zdCBpPXRoaXMuX2VsO3RoaXMuX2xpc3RlbmVycz1bW2ksXCJ0b3VjaHN0YXJ0XCIse3Bhc3NpdmU6ITB9XSxbaSxcInRvdWNobW92ZVwiLHtwYXNzaXZlOiExfV0sW2ksXCJ0b3VjaGVuZFwiLHZvaWQgMF0sW2ksXCJ0b3VjaGNhbmNlbFwiLHZvaWQgMF0sW2ksXCJtb3VzZWRvd25cIix2b2lkIDBdLFtpLFwibW91c2Vtb3ZlXCIsdm9pZCAwXSxbaSxcIm1vdXNldXBcIix2b2lkIDBdLFtkb2N1bWVudCxcIm1vdXNlbW92ZVwiLHtjYXB0dXJlOiEwfV0sW2RvY3VtZW50LFwibW91c2V1cFwiLHZvaWQgMF0sW2ksXCJtb3VzZW92ZXJcIix2b2lkIDBdLFtpLFwibW91c2VvdXRcIix2b2lkIDBdLFtpLFwiZGJsY2xpY2tcIix2b2lkIDBdLFtpLFwiY2xpY2tcIix2b2lkIDBdLFtpLFwia2V5ZG93blwiLHtjYXB0dXJlOiExfV0sW2ksXCJrZXl1cFwiLHZvaWQgMF0sW2ksXCJ3aGVlbFwiLHtwYXNzaXZlOiExfV0sW2ksXCJjb250ZXh0bWVudVwiLHZvaWQgMF0sW3dpbmRvdyxcImJsdXJcIix2b2lkIDBdXTtmb3IoY29uc3RbdCxlLGldb2YgdGhpcy5fbGlzdGVuZXJzKXIuYWRkRXZlbnRMaXN0ZW5lcih0LGUsdD09PWRvY3VtZW50P3RoaXMuaGFuZGxlV2luZG93RXZlbnQ6dGhpcy5oYW5kbGVFdmVudCxpKTt9ZGVzdHJveSgpe2Zvcihjb25zdFt0LGUsaV1vZiB0aGlzLl9saXN0ZW5lcnMpci5yZW1vdmVFdmVudExpc3RlbmVyKHQsZSx0PT09ZG9jdW1lbnQ/dGhpcy5oYW5kbGVXaW5kb3dFdmVudDp0aGlzLmhhbmRsZUV2ZW50LGkpO31fYWRkRGVmYXVsdEhhbmRsZXJzKHQpe2NvbnN0IGU9dGhpcy5fbWFwLGk9ZS5nZXRDYW52YXNDb250YWluZXIoKTt0aGlzLl9hZGQoXCJtYXBFdmVudFwiLG5ldyBCYShlLHQpKTtjb25zdCBhPWUuYm94Wm9vbT1uZXcgVWEoZSx0KTt0aGlzLl9hZGQoXCJib3hab29tXCIsYSksdC5pbnRlcmFjdGl2ZSYmdC5ib3hab29tJiZhLmVuYWJsZSgpO2NvbnN0IHM9ZS5jb29wZXJhdGl2ZUdlc3R1cmVzPW5ldyB2cyhlLHQuY29vcGVyYXRpdmVHZXN0dXJlcyk7dGhpcy5fYWRkKFwiY29vcGVyYXRpdmVHZXN0dXJlc1wiLHMpLHQuY29vcGVyYXRpdmVHZXN0dXJlcyYmcy5lbmFibGUoKTtjb25zdCBvPW5ldyBWYShlKSxuPW5ldyBfcyhlKTtlLmRvdWJsZUNsaWNrWm9vbT1uZXcgZHMobixvKSx0aGlzLl9hZGQoXCJ0YXBab29tXCIsbyksdGhpcy5fYWRkKFwiY2xpY2tab29tXCIsbiksdC5pbnRlcmFjdGl2ZSYmdC5kb3VibGVDbGlja1pvb20mJmUuZG91YmxlQ2xpY2tab29tLmVuYWJsZSgpO2NvbnN0IGw9bmV3IHBzO3RoaXMuX2FkZChcInRhcERyYWdab29tXCIsbCk7Y29uc3QgaD1lLnRvdWNoUGl0Y2g9bmV3IHJzKGUpO3RoaXMuX2FkZChcInRvdWNoUGl0Y2hcIixoKSx0LmludGVyYWN0aXZlJiZ0LnRvdWNoUGl0Y2gmJmUudG91Y2hQaXRjaC5lbmFibGUodC50b3VjaFBpdGNoKTtjb25zdCBjPUthKHQpLHU9SmEodCk7ZS5kcmFnUm90YXRlPW5ldyBmcyh0LGMsdSksdGhpcy5fYWRkKFwibW91c2VSb3RhdGVcIixjLFtcIm1vdXNlUGl0Y2hcIl0pLHRoaXMuX2FkZChcIm1vdXNlUGl0Y2hcIix1LFtcIm1vdXNlUm90YXRlXCJdKSx0LmludGVyYWN0aXZlJiZ0LmRyYWdSb3RhdGUmJmUuZHJhZ1JvdGF0ZS5lbmFibGUoKTtjb25zdCBkPSgoe2VuYWJsZTp0LGNsaWNrVG9sZXJhbmNlOmV9KT0+e2NvbnN0IGk9bmV3IFdhKHtjaGVja0NvcnJlY3RFdmVudDp0PT4wPT09ci5tb3VzZUJ1dHRvbih0KSYmIXQuY3RybEtleX0pO3JldHVybiBuZXcgR2Eoe2NsaWNrVG9sZXJhbmNlOmUsbW92ZToodCxlKT0+KHthcm91bmQ6ZSxwYW5EZWx0YTplLnN1Yih0KX0pLGFjdGl2YXRlT25TdGFydDohMCxtb3ZlU3RhdGVNYW5hZ2VyOmksZW5hYmxlOnQsYXNzaWduRXZlbnRzOlhhfSl9KSh0KSxfPW5ldyBZYSh0LGUpO2UuZHJhZ1Bhbj1uZXcgbXMoaSxkLF8pLHRoaXMuX2FkZChcIm1vdXNlUGFuXCIsZCksdGhpcy5fYWRkKFwidG91Y2hQYW5cIixfLFtcInRvdWNoWm9vbVwiLFwidG91Y2hSb3RhdGVcIl0pLHQuaW50ZXJhY3RpdmUmJnQuZHJhZ1BhbiYmZS5kcmFnUGFuLmVuYWJsZSh0LmRyYWdQYW4pO2NvbnN0IHA9bmV3IHNzLG09bmV3IGlzO2UudG91Y2hab29tUm90YXRlPW5ldyBncyhpLG0scCxsKSx0aGlzLl9hZGQoXCJ0b3VjaFJvdGF0ZVwiLHAsW1widG91Y2hQYW5cIixcInRvdWNoWm9vbVwiXSksdGhpcy5fYWRkKFwidG91Y2hab29tXCIsbSxbXCJ0b3VjaFBhblwiLFwidG91Y2hSb3RhdGVcIl0pLHQuaW50ZXJhY3RpdmUmJnQudG91Y2hab29tUm90YXRlJiZlLnRvdWNoWm9vbVJvdGF0ZS5lbmFibGUodC50b3VjaFpvb21Sb3RhdGUpO2NvbnN0IGY9ZS5zY3JvbGxab29tPW5ldyB1cyhlLCgoKT0+dGhpcy5fdHJpZ2dlclJlbmRlckZyYW1lKCkpKTt0aGlzLl9hZGQoXCJzY3JvbGxab29tXCIsZixbXCJtb3VzZVBhblwiXSksdC5pbnRlcmFjdGl2ZSYmdC5zY3JvbGxab29tJiZlLnNjcm9sbFpvb20uZW5hYmxlKHQuc2Nyb2xsWm9vbSk7Y29uc3QgZz1lLmtleWJvYXJkPW5ldyBscyhlKTt0aGlzLl9hZGQoXCJrZXlib2FyZFwiLGcpLHQuaW50ZXJhY3RpdmUmJnQua2V5Ym9hcmQmJmUua2V5Ym9hcmQuZW5hYmxlKCksdGhpcy5fYWRkKFwiYmxvY2thYmxlTWFwRXZlbnRcIixuZXcgT2EoZSkpO31fYWRkKHQsZSxpKXt0aGlzLl9oYW5kbGVycy5wdXNoKHtoYW5kbGVyTmFtZTp0LGhhbmRsZXI6ZSxhbGxvd2VkOml9KSx0aGlzLl9oYW5kbGVyc0J5SWRbdF09ZTt9c3RvcCh0KXtpZighdGhpcy5fdXBkYXRpbmdDYW1lcmEpe2Zvcihjb25zdHtoYW5kbGVyOnR9b2YgdGhpcy5faGFuZGxlcnMpdC5yZXNldCgpO3RoaXMuX2luZXJ0aWEuY2xlYXIoKSx0aGlzLl9maXJlRXZlbnRzKHt9LHt9LHQpLHRoaXMuX2NoYW5nZXM9W107fX1pc0FjdGl2ZSgpe2Zvcihjb25zdHtoYW5kbGVyOnR9b2YgdGhpcy5faGFuZGxlcnMpaWYodC5pc0FjdGl2ZSgpKXJldHVybiAhMDtyZXR1cm4gITF9aXNab29taW5nKCl7cmV0dXJuICEhdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcy56b29tfHx0aGlzLl9tYXAuc2Nyb2xsWm9vbS5pc1pvb21pbmcoKX1pc1JvdGF0aW5nKCl7cmV0dXJuICEhdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcy5yb3RhdGV9aXNNb3ZpbmcoKXtyZXR1cm4gQm9vbGVhbih4cyh0aGlzLl9ldmVudHNJblByb2dyZXNzKSl8fHRoaXMuaXNab29taW5nKCl9X2Jsb2NrZWRCeUFjdGl2ZSh0LGUsaSl7Zm9yKGNvbnN0IGEgaW4gdClpZihhIT09aSYmKCFlfHxlLmluZGV4T2YoYSk8MCkpcmV0dXJuICEwO3JldHVybiAhMX1fZ2V0TWFwVG91Y2hlcyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBpIG9mIHQpdGhpcy5fZWwuY29udGFpbnMoaS50YXJnZXQpJiZlLnB1c2goaSk7cmV0dXJuIGV9bWVyZ2VIYW5kbGVyUmVzdWx0KHQsaSxhLHMsbyl7aWYoIWEpcmV0dXJuO2UuZSh0LGEpO2NvbnN0IHI9e2hhbmRsZXJOYW1lOnMsb3JpZ2luYWxFdmVudDphLm9yaWdpbmFsRXZlbnR8fG99O3ZvaWQgMCE9PWEuem9vbURlbHRhJiYoaS56b29tPXIpLHZvaWQgMCE9PWEucGFuRGVsdGEmJihpLmRyYWc9ciksdm9pZCAwIT09YS5waXRjaERlbHRhJiYoaS5waXRjaD1yKSx2b2lkIDAhPT1hLmJlYXJpbmdEZWx0YSYmKGkucm90YXRlPXIpO31fYXBwbHlDaGFuZ2VzKCl7Y29uc3QgdD17fSxpPXt9LGE9e307Zm9yKGNvbnN0W3MsbyxyXW9mIHRoaXMuX2NoYW5nZXMpcy5wYW5EZWx0YSYmKHQucGFuRGVsdGE9KHQucGFuRGVsdGF8fG5ldyBlLlAoMCwwKSkuX2FkZChzLnBhbkRlbHRhKSkscy56b29tRGVsdGEmJih0Lnpvb21EZWx0YT0odC56b29tRGVsdGF8fDApK3Muem9vbURlbHRhKSxzLmJlYXJpbmdEZWx0YSYmKHQuYmVhcmluZ0RlbHRhPSh0LmJlYXJpbmdEZWx0YXx8MCkrcy5iZWFyaW5nRGVsdGEpLHMucGl0Y2hEZWx0YSYmKHQucGl0Y2hEZWx0YT0odC5waXRjaERlbHRhfHwwKStzLnBpdGNoRGVsdGEpLHZvaWQgMCE9PXMuYXJvdW5kJiYodC5hcm91bmQ9cy5hcm91bmQpLHZvaWQgMCE9PXMucGluY2hBcm91bmQmJih0LnBpbmNoQXJvdW5kPXMucGluY2hBcm91bmQpLHMubm9JbmVydGlhJiYodC5ub0luZXJ0aWE9cy5ub0luZXJ0aWEpLGUuZShpLG8pLGUuZShhLHIpO3RoaXMuX3VwZGF0ZU1hcFRyYW5zZm9ybSh0LGksYSksdGhpcy5fY2hhbmdlcz1bXTt9X3VwZGF0ZU1hcFRyYW5zZm9ybSh0LGUsaSl7Y29uc3QgYT10aGlzLl9tYXAscz1hLl9nZXRUcmFuc2Zvcm1Gb3JVcGRhdGUoKSxvPWEudGVycmFpbjtpZighKGJzKHQpfHxvJiZ0aGlzLl90ZXJyYWluTW92ZW1lbnQpKXJldHVybiB0aGlzLl9maXJlRXZlbnRzKGUsaSwhMCk7bGV0e3BhbkRlbHRhOnIsem9vbURlbHRhOm4sYmVhcmluZ0RlbHRhOmwscGl0Y2hEZWx0YTpoLGFyb3VuZDpjLHBpbmNoQXJvdW5kOnV9PXQ7dm9pZCAwIT09dSYmKGM9dSksYS5fc3RvcCghMCksYz1jfHxhLnRyYW5zZm9ybS5jZW50ZXJQb2ludDtjb25zdCBkPXMucG9pbnRMb2NhdGlvbihyP2Muc3ViKHIpOmMpO2wmJihzLmJlYXJpbmcrPWwpLGgmJihzLnBpdGNoKz1oKSxuJiYocy56b29tKz1uKSxvP3RoaXMuX3RlcnJhaW5Nb3ZlbWVudHx8IWUuZHJhZyYmIWUuem9vbT9lLmRyYWcmJnRoaXMuX3RlcnJhaW5Nb3ZlbWVudD9zLmNlbnRlcj1zLnBvaW50TG9jYXRpb24ocy5jZW50ZXJQb2ludC5zdWIocikpOnMuc2V0TG9jYXRpb25BdFBvaW50KGQsYyk6KHRoaXMuX3RlcnJhaW5Nb3ZlbWVudD0hMCx0aGlzLl9tYXAuX2VsZXZhdGlvbkZyZWV6ZT0hMCxzLnNldExvY2F0aW9uQXRQb2ludChkLGMpKTpzLnNldExvY2F0aW9uQXRQb2ludChkLGMpLGEuX2FwcGx5VXBkYXRlZFRyYW5zZm9ybShzKSx0aGlzLl9tYXAuX3VwZGF0ZSgpLHQubm9JbmVydGlhfHx0aGlzLl9pbmVydGlhLnJlY29yZCh0KSx0aGlzLl9maXJlRXZlbnRzKGUsaSwhMCk7fV9maXJlRXZlbnRzKHQsaSxhKXtjb25zdCBzPXhzKHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MpLHI9eHModCksbj17fTtmb3IoY29uc3QgZSBpbiB0KXtjb25zdHtvcmlnaW5hbEV2ZW50Oml9PXRbZV07dGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tlXXx8KG5bYCR7ZX1zdGFydGBdPWkpLHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbZV09dFtlXTt9IXMmJnImJnRoaXMuX2ZpcmVFdmVudChcIm1vdmVzdGFydFwiLHIub3JpZ2luYWxFdmVudCk7Zm9yKGNvbnN0IHQgaW4gbil0aGlzLl9maXJlRXZlbnQodCxuW3RdKTtyJiZ0aGlzLl9maXJlRXZlbnQoXCJtb3ZlXCIsci5vcmlnaW5hbEV2ZW50KTtmb3IoY29uc3QgZSBpbiB0KXtjb25zdHtvcmlnaW5hbEV2ZW50Oml9PXRbZV07dGhpcy5fZmlyZUV2ZW50KGUsaSk7fWNvbnN0IGw9e307bGV0IGg7Zm9yKGNvbnN0IHQgaW4gdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcyl7Y29uc3R7aGFuZGxlck5hbWU6ZSxvcmlnaW5hbEV2ZW50OmF9PXRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbdF07dGhpcy5faGFuZGxlcnNCeUlkW2VdLmlzQWN0aXZlKCl8fChkZWxldGUgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1t0XSxoPWlbZV18fGEsbFtgJHt0fWVuZGBdPWgpO31mb3IoY29uc3QgdCBpbiBsKXRoaXMuX2ZpcmVFdmVudCh0LGxbdF0pO2NvbnN0IGM9eHModGhpcy5fZXZlbnRzSW5Qcm9ncmVzcyksdT0oc3x8cikmJiFjO2lmKHUmJnRoaXMuX3RlcnJhaW5Nb3ZlbWVudCl7dGhpcy5fbWFwLl9lbGV2YXRpb25GcmVlemU9ITEsdGhpcy5fdGVycmFpbk1vdmVtZW50PSExO2NvbnN0IHQ9dGhpcy5fbWFwLl9nZXRUcmFuc2Zvcm1Gb3JVcGRhdGUoKTt0LnJlY2FsY3VsYXRlWm9vbSh0aGlzLl9tYXAudGVycmFpbiksdGhpcy5fbWFwLl9hcHBseVVwZGF0ZWRUcmFuc2Zvcm0odCk7fWlmKGEmJnUpe3RoaXMuX3VwZGF0aW5nQ2FtZXJhPSEwO2NvbnN0IHQ9dGhpcy5faW5lcnRpYS5fb25Nb3ZlRW5kKHRoaXMuX21hcC5kcmFnUGFuLl9pbmVydGlhT3B0aW9ucyksaT10PT4wIT09dCYmLXRoaXMuX2JlYXJpbmdTbmFwPHQmJnQ8dGhpcy5fYmVhcmluZ1NuYXA7IXR8fCF0LmVzc2VudGlhbCYmby5wcmVmZXJzUmVkdWNlZE1vdGlvbj8odGhpcy5fbWFwLmZpcmUobmV3IGUuayhcIm1vdmVlbmRcIix7b3JpZ2luYWxFdmVudDpofSkpLGkodGhpcy5fbWFwLmdldEJlYXJpbmcoKSkmJnRoaXMuX21hcC5yZXNldE5vcnRoKCkpOihpKHQuYmVhcmluZ3x8dGhpcy5fbWFwLmdldEJlYXJpbmcoKSkmJih0LmJlYXJpbmc9MCksdC5mcmVlemVFbGV2YXRpb249ITAsdGhpcy5fbWFwLmVhc2VUbyh0LHtvcmlnaW5hbEV2ZW50Omh9KSksdGhpcy5fdXBkYXRpbmdDYW1lcmE9ITE7fX1fZmlyZUV2ZW50KHQsaSl7dGhpcy5fbWFwLmZpcmUobmV3IGUuayh0LGk/e29yaWdpbmFsRXZlbnQ6aX06e30pKTt9X3JlcXVlc3RGcmFtZSgpe3JldHVybiB0aGlzLl9tYXAudHJpZ2dlclJlcGFpbnQoKSx0aGlzLl9tYXAuX3JlbmRlclRhc2tRdWV1ZS5hZGQoKHQ9PntkZWxldGUgdGhpcy5fZnJhbWVJZCx0aGlzLmhhbmRsZUV2ZW50KG5ldyB5cyhcInJlbmRlckZyYW1lXCIse3RpbWVTdGFtcDp0fSkpLHRoaXMuX2FwcGx5Q2hhbmdlcygpO30pKX1fdHJpZ2dlclJlbmRlckZyYW1lKCl7dm9pZCAwPT09dGhpcy5fZnJhbWVJZCYmKHRoaXMuX2ZyYW1lSWQ9dGhpcy5fcmVxdWVzdEZyYW1lKCkpO319Y2xhc3MgVHMgZXh0ZW5kcyBlLkV7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuX3JlbmRlckZyYW1lQ2FsbGJhY2s9KCk9Pntjb25zdCB0PU1hdGgubWluKChvLm5vdygpLXRoaXMuX2Vhc2VTdGFydCkvdGhpcy5fZWFzZU9wdGlvbnMuZHVyYXRpb24sMSk7dGhpcy5fb25FYXNlRnJhbWUodGhpcy5fZWFzZU9wdGlvbnMuZWFzaW5nKHQpKSx0PDEmJnRoaXMuX2Vhc2VGcmFtZUlkP3RoaXMuX2Vhc2VGcmFtZUlkPXRoaXMuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUNhbGxiYWNrKTp0aGlzLnN0b3AoKTt9LHRoaXMuX21vdmluZz0hMSx0aGlzLl96b29taW5nPSExLHRoaXMudHJhbnNmb3JtPXQsdGhpcy5fYmVhcmluZ1NuYXA9ZS5iZWFyaW5nU25hcCx0aGlzLm9uKFwibW92ZWVuZFwiLCgoKT0+e2RlbGV0ZSB0aGlzLl9yZXF1ZXN0ZWRDYW1lcmFTdGF0ZTt9KSk7fWdldENlbnRlcigpe3JldHVybiBuZXcgZS5OKHRoaXMudHJhbnNmb3JtLmNlbnRlci5sbmcsdGhpcy50cmFuc2Zvcm0uY2VudGVyLmxhdCl9c2V0Q2VudGVyKHQsZSl7cmV0dXJuIHRoaXMuanVtcFRvKHtjZW50ZXI6dH0sZSl9cGFuQnkodCxpLGEpe3JldHVybiB0PWUuUC5jb252ZXJ0KHQpLm11bHQoLTEpLHRoaXMucGFuVG8odGhpcy50cmFuc2Zvcm0uY2VudGVyLGUuZSh7b2Zmc2V0OnR9LGkpLGEpfXBhblRvKHQsaSxhKXtyZXR1cm4gdGhpcy5lYXNlVG8oZS5lKHtjZW50ZXI6dH0saSksYSl9Z2V0Wm9vbSgpe3JldHVybiB0aGlzLnRyYW5zZm9ybS56b29tfXNldFpvb20odCxlKXtyZXR1cm4gdGhpcy5qdW1wVG8oe3pvb206dH0sZSksdGhpc316b29tVG8odCxpLGEpe3JldHVybiB0aGlzLmVhc2VUbyhlLmUoe3pvb206dH0saSksYSl9em9vbUluKHQsZSl7cmV0dXJuIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpKzEsdCxlKSx0aGlzfXpvb21PdXQodCxlKXtyZXR1cm4gdGhpcy56b29tVG8odGhpcy5nZXRab29tKCktMSx0LGUpLHRoaXN9Z2V0QmVhcmluZygpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nfXNldEJlYXJpbmcodCxlKXtyZXR1cm4gdGhpcy5qdW1wVG8oe2JlYXJpbmc6dH0sZSksdGhpc31nZXRQYWRkaW5nKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLnBhZGRpbmd9c2V0UGFkZGluZyh0LGUpe3JldHVybiB0aGlzLmp1bXBUbyh7cGFkZGluZzp0fSxlKSx0aGlzfXJvdGF0ZVRvKHQsaSxhKXtyZXR1cm4gdGhpcy5lYXNlVG8oZS5lKHtiZWFyaW5nOnR9LGkpLGEpfXJlc2V0Tm9ydGgodCxpKXtyZXR1cm4gdGhpcy5yb3RhdGVUbygwLGUuZSh7ZHVyYXRpb246MWUzfSx0KSxpKSx0aGlzfXJlc2V0Tm9ydGhQaXRjaCh0LGkpe3JldHVybiB0aGlzLmVhc2VUbyhlLmUoe2JlYXJpbmc6MCxwaXRjaDowLGR1cmF0aW9uOjFlM30sdCksaSksdGhpc31zbmFwVG9Ob3J0aCh0LGUpe3JldHVybiBNYXRoLmFicyh0aGlzLmdldEJlYXJpbmcoKSk8dGhpcy5fYmVhcmluZ1NuYXA/dGhpcy5yZXNldE5vcnRoKHQsZSk6dGhpc31nZXRQaXRjaCgpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5waXRjaH1zZXRQaXRjaCh0LGUpe3JldHVybiB0aGlzLmp1bXBUbyh7cGl0Y2g6dH0sZSksdGhpc31jYW1lcmFGb3JCb3VuZHModCxlKXt0PUguY29udmVydCh0KS5hZGp1c3RBbnRpTWVyaWRpYW4oKTtjb25zdCBpPWUmJmUuYmVhcmluZ3x8MDtyZXR1cm4gdGhpcy5fY2FtZXJhRm9yQm94QW5kQmVhcmluZyh0LmdldE5vcnRoV2VzdCgpLHQuZ2V0U291dGhFYXN0KCksaSxlKX1fY2FtZXJhRm9yQm94QW5kQmVhcmluZyh0LGksYSxzKXtjb25zdCBvPXt0b3A6MCxib3R0b206MCxyaWdodDowLGxlZnQ6MH07aWYoXCJudW1iZXJcIj09dHlwZW9mKHM9ZS5lKHtwYWRkaW5nOm8sb2Zmc2V0OlswLDBdLG1heFpvb206dGhpcy50cmFuc2Zvcm0ubWF4Wm9vbX0scykpLnBhZGRpbmcpe2NvbnN0IHQ9cy5wYWRkaW5nO3MucGFkZGluZz17dG9wOnQsYm90dG9tOnQscmlnaHQ6dCxsZWZ0OnR9O31zLnBhZGRpbmc9ZS5lKG8scy5wYWRkaW5nKTtjb25zdCByPXRoaXMudHJhbnNmb3JtLG49ci5wYWRkaW5nLGw9bmV3IEgodCxpKSxoPXIucHJvamVjdChsLmdldE5vcnRoV2VzdCgpKSxjPXIucHJvamVjdChsLmdldE5vcnRoRWFzdCgpKSx1PXIucHJvamVjdChsLmdldFNvdXRoRWFzdCgpKSxkPXIucHJvamVjdChsLmdldFNvdXRoV2VzdCgpKSxfPWUuYmEoLWEpLHA9aC5yb3RhdGUoXyksbT1jLnJvdGF0ZShfKSxmPXUucm90YXRlKF8pLGc9ZC5yb3RhdGUoXyksdj1uZXcgZS5QKE1hdGgubWF4KHAueCxtLngsZy54LGYueCksTWF0aC5tYXgocC55LG0ueSxnLnksZi55KSkseD1uZXcgZS5QKE1hdGgubWluKHAueCxtLngsZy54LGYueCksTWF0aC5taW4ocC55LG0ueSxnLnksZi55KSkseT12LnN1Yih4KSxiPShyLndpZHRoLShuLmxlZnQrbi5yaWdodCtzLnBhZGRpbmcubGVmdCtzLnBhZGRpbmcucmlnaHQpKS95Lngsdz0oci5oZWlnaHQtKG4udG9wK24uYm90dG9tK3MucGFkZGluZy50b3Arcy5wYWRkaW5nLmJvdHRvbSkpL3kueTtpZih3PDB8fGI8MClyZXR1cm4gdm9pZCBlLncoXCJNYXAgY2Fubm90IGZpdCB3aXRoaW4gY2FudmFzIHdpdGggdGhlIGdpdmVuIGJvdW5kcywgcGFkZGluZywgYW5kL29yIG9mZnNldC5cIik7Y29uc3QgVD1NYXRoLm1pbihyLnNjYWxlWm9vbShyLnNjYWxlKk1hdGgubWluKGIsdykpLHMubWF4Wm9vbSksST1lLlAuY29udmVydChzLm9mZnNldCksRT1uZXcgZS5QKChzLnBhZGRpbmcubGVmdC1zLnBhZGRpbmcucmlnaHQpLzIsKHMucGFkZGluZy50b3Atcy5wYWRkaW5nLmJvdHRvbSkvMikucm90YXRlKGUuYmEoYSkpLFA9SS5hZGQoRSkubXVsdChyLnNjYWxlL3Iuem9vbVNjYWxlKFQpKTtyZXR1cm4ge2NlbnRlcjpyLnVucHJvamVjdChoLmFkZCh1KS5kaXYoMikuc3ViKFApKSx6b29tOlQsYmVhcmluZzphfX1maXRCb3VuZHModCxlLGkpe3JldHVybiB0aGlzLl9maXRJbnRlcm5hbCh0aGlzLmNhbWVyYUZvckJvdW5kcyh0LGUpLGUsaSl9Zml0U2NyZWVuQ29vcmRpbmF0ZXModCxpLGEscyxvKXtyZXR1cm4gdGhpcy5fZml0SW50ZXJuYWwodGhpcy5fY2FtZXJhRm9yQm94QW5kQmVhcmluZyh0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKGUuUC5jb252ZXJ0KHQpKSx0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKGUuUC5jb252ZXJ0KGkpKSxhLHMpLHMsbyl9X2ZpdEludGVybmFsKHQsaSxhKXtyZXR1cm4gdD8oZGVsZXRlKGk9ZS5lKHQsaSkpLnBhZGRpbmcsaS5saW5lYXI/dGhpcy5lYXNlVG8oaSxhKTp0aGlzLmZseVRvKGksYSkpOnRoaXN9anVtcFRvKHQsaSl7dGhpcy5zdG9wKCk7Y29uc3QgYT10aGlzLl9nZXRUcmFuc2Zvcm1Gb3JVcGRhdGUoKTtsZXQgcz0hMSxvPSExLHI9ITE7cmV0dXJuIFwiem9vbVwiaW4gdCYmYS56b29tIT09K3Quem9vbSYmKHM9ITAsYS56b29tPSt0Lnpvb20pLHZvaWQgMCE9PXQuY2VudGVyJiYoYS5jZW50ZXI9ZS5OLmNvbnZlcnQodC5jZW50ZXIpKSxcImJlYXJpbmdcImluIHQmJmEuYmVhcmluZyE9PSt0LmJlYXJpbmcmJihvPSEwLGEuYmVhcmluZz0rdC5iZWFyaW5nKSxcInBpdGNoXCJpbiB0JiZhLnBpdGNoIT09K3QucGl0Y2gmJihyPSEwLGEucGl0Y2g9K3QucGl0Y2gpLG51bGw9PXQucGFkZGluZ3x8YS5pc1BhZGRpbmdFcXVhbCh0LnBhZGRpbmcpfHwoYS5wYWRkaW5nPXQucGFkZGluZyksdGhpcy5fYXBwbHlVcGRhdGVkVHJhbnNmb3JtKGEpLHRoaXMuZmlyZShuZXcgZS5rKFwibW92ZXN0YXJ0XCIsaSkpLmZpcmUobmV3IGUuayhcIm1vdmVcIixpKSkscyYmdGhpcy5maXJlKG5ldyBlLmsoXCJ6b29tc3RhcnRcIixpKSkuZmlyZShuZXcgZS5rKFwiem9vbVwiLGkpKS5maXJlKG5ldyBlLmsoXCJ6b29tZW5kXCIsaSkpLG8mJnRoaXMuZmlyZShuZXcgZS5rKFwicm90YXRlc3RhcnRcIixpKSkuZmlyZShuZXcgZS5rKFwicm90YXRlXCIsaSkpLmZpcmUobmV3IGUuayhcInJvdGF0ZWVuZFwiLGkpKSxyJiZ0aGlzLmZpcmUobmV3IGUuayhcInBpdGNoc3RhcnRcIixpKSkuZmlyZShuZXcgZS5rKFwicGl0Y2hcIixpKSkuZmlyZShuZXcgZS5rKFwicGl0Y2hlbmRcIixpKSksdGhpcy5maXJlKG5ldyBlLmsoXCJtb3ZlZW5kXCIsaSkpfWNhbGN1bGF0ZUNhbWVyYU9wdGlvbnNGcm9tVG8odCxpLGEscz0wKXtjb25zdCBvPWUuWi5mcm9tTG5nTGF0KHQsaSkscj1lLlouZnJvbUxuZ0xhdChhLHMpLG49ci54LW8ueCxsPXIueS1vLnksaD1yLnotby56LGM9TWF0aC5oeXBvdChuLGwsaCk7aWYoMD09PWMpdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY2FsY3VsYXRlIGNhbWVyYSBvcHRpb25zIHdpdGggc2FtZSBGcm9tIGFuZCBUb1wiKTtjb25zdCB1PU1hdGguaHlwb3QobixsKSxkPXRoaXMudHJhbnNmb3JtLnNjYWxlWm9vbSh0aGlzLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlL2MvdGhpcy50cmFuc2Zvcm0udGlsZVNpemUpLF89MTgwKk1hdGguYXRhbjIobiwtbCkvTWF0aC5QSTtsZXQgcD0xODAqTWF0aC5hY29zKHUvYykvTWF0aC5QSTtyZXR1cm4gcD1oPDA/OTAtcDo5MCtwLHtjZW50ZXI6ci50b0xuZ0xhdCgpLHpvb206ZCxwaXRjaDpwLGJlYXJpbmc6X319ZWFzZVRvKHQsaSl7dmFyIGE7dGhpcy5fc3RvcCghMSx0LmVhc2VJZCksKCExPT09KHQ9ZS5lKHtvZmZzZXQ6WzAsMF0sZHVyYXRpb246NTAwLGVhc2luZzplLmI5fSx0KSkuYW5pbWF0ZXx8IXQuZXNzZW50aWFsJiZvLnByZWZlcnNSZWR1Y2VkTW90aW9uKSYmKHQuZHVyYXRpb249MCk7Y29uc3Qgcz10aGlzLl9nZXRUcmFuc2Zvcm1Gb3JVcGRhdGUoKSxyPXMuem9vbSxuPXMuYmVhcmluZyxsPXMucGl0Y2gsaD1zLnBhZGRpbmcsYz1cImJlYXJpbmdcImluIHQ/dGhpcy5fbm9ybWFsaXplQmVhcmluZyh0LmJlYXJpbmcsbik6bix1PVwicGl0Y2hcImluIHQ/K3QucGl0Y2g6bCxkPVwicGFkZGluZ1wiaW4gdD90LnBhZGRpbmc6cy5wYWRkaW5nLF89ZS5QLmNvbnZlcnQodC5vZmZzZXQpO2xldCBwPXMuY2VudGVyUG9pbnQuYWRkKF8pO2NvbnN0IG09cy5wb2ludExvY2F0aW9uKHApLHtjZW50ZXI6Zix6b29tOmd9PXMuZ2V0Q29uc3RyYWluZWQoZS5OLmNvbnZlcnQodC5jZW50ZXJ8fG0pLG51bGwhPT0oYT10Lnpvb20pJiZ2b2lkIDAhPT1hP2E6cik7dGhpcy5fbm9ybWFsaXplQ2VudGVyKGYscyk7Y29uc3Qgdj1zLnByb2plY3QobSkseD1zLnByb2plY3QoZikuc3ViKHYpLHk9cy56b29tU2NhbGUoZy1yKTtsZXQgYix3O3QuYXJvdW5kJiYoYj1lLk4uY29udmVydCh0LmFyb3VuZCksdz1zLmxvY2F0aW9uUG9pbnQoYikpO2NvbnN0IFQ9e21vdmluZzp0aGlzLl9tb3Zpbmcsem9vbWluZzp0aGlzLl96b29taW5nLHJvdGF0aW5nOnRoaXMuX3JvdGF0aW5nLHBpdGNoaW5nOnRoaXMuX3BpdGNoaW5nfTtyZXR1cm4gdGhpcy5fem9vbWluZz10aGlzLl96b29taW5nfHxnIT09cix0aGlzLl9yb3RhdGluZz10aGlzLl9yb3RhdGluZ3x8biE9PWMsdGhpcy5fcGl0Y2hpbmc9dGhpcy5fcGl0Y2hpbmd8fHUhPT1sLHRoaXMuX3BhZGRpbmc9IXMuaXNQYWRkaW5nRXF1YWwoZCksdGhpcy5fZWFzZUlkPXQuZWFzZUlkLHRoaXMuX3ByZXBhcmVFYXNlKGksdC5ub01vdmVTdGFydCxUKSx0aGlzLnRlcnJhaW4mJnRoaXMuX3ByZXBhcmVFbGV2YXRpb24oZiksdGhpcy5fZWFzZSgoYT0+e2lmKHRoaXMuX3pvb21pbmcmJihzLnpvb209ZS55Lm51bWJlcihyLGcsYSkpLHRoaXMuX3JvdGF0aW5nJiYocy5iZWFyaW5nPWUueS5udW1iZXIobixjLGEpKSx0aGlzLl9waXRjaGluZyYmKHMucGl0Y2g9ZS55Lm51bWJlcihsLHUsYSkpLHRoaXMuX3BhZGRpbmcmJihzLmludGVycG9sYXRlUGFkZGluZyhoLGQsYSkscD1zLmNlbnRlclBvaW50LmFkZChfKSksdGhpcy50ZXJyYWluJiYhdC5mcmVlemVFbGV2YXRpb24mJnRoaXMuX3VwZGF0ZUVsZXZhdGlvbihhKSxiKXMuc2V0TG9jYXRpb25BdFBvaW50KGIsdyk7ZWxzZSB7Y29uc3QgdD1zLnpvb21TY2FsZShzLnpvb20tciksZT1nPnI/TWF0aC5taW4oMix5KTpNYXRoLm1heCguNSx5KSxpPU1hdGgucG93KGUsMS1hKSxvPXMudW5wcm9qZWN0KHYuYWRkKHgubXVsdChhKmkpKS5tdWx0KHQpKTtzLnNldExvY2F0aW9uQXRQb2ludChzLnJlbmRlcldvcmxkQ29waWVzP28ud3JhcCgpOm8scCk7fXRoaXMuX2FwcGx5VXBkYXRlZFRyYW5zZm9ybShzKSx0aGlzLl9maXJlTW92ZUV2ZW50cyhpKTt9KSwoZT0+e3RoaXMudGVycmFpbiYmdC5mcmVlemVFbGV2YXRpb24mJnRoaXMuX2ZpbmFsaXplRWxldmF0aW9uKCksdGhpcy5fYWZ0ZXJFYXNlKGksZSk7fSksdCksdGhpc31fcHJlcGFyZUVhc2UodCxpLGE9e30pe3RoaXMuX21vdmluZz0hMCxpfHxhLm1vdmluZ3x8dGhpcy5maXJlKG5ldyBlLmsoXCJtb3Zlc3RhcnRcIix0KSksdGhpcy5fem9vbWluZyYmIWEuem9vbWluZyYmdGhpcy5maXJlKG5ldyBlLmsoXCJ6b29tc3RhcnRcIix0KSksdGhpcy5fcm90YXRpbmcmJiFhLnJvdGF0aW5nJiZ0aGlzLmZpcmUobmV3IGUuayhcInJvdGF0ZXN0YXJ0XCIsdCkpLHRoaXMuX3BpdGNoaW5nJiYhYS5waXRjaGluZyYmdGhpcy5maXJlKG5ldyBlLmsoXCJwaXRjaHN0YXJ0XCIsdCkpO31fcHJlcGFyZUVsZXZhdGlvbih0KXt0aGlzLl9lbGV2YXRpb25DZW50ZXI9dCx0aGlzLl9lbGV2YXRpb25TdGFydD10aGlzLnRyYW5zZm9ybS5lbGV2YXRpb24sdGhpcy5fZWxldmF0aW9uVGFyZ2V0PXRoaXMudGVycmFpbi5nZXRFbGV2YXRpb25Gb3JMbmdMYXRab29tKHQsdGhpcy50cmFuc2Zvcm0udGlsZVpvb20pLHRoaXMuX2VsZXZhdGlvbkZyZWV6ZT0hMDt9X3VwZGF0ZUVsZXZhdGlvbih0KXt0aGlzLnRyYW5zZm9ybS5taW5FbGV2YXRpb25Gb3JDdXJyZW50VGlsZT10aGlzLnRlcnJhaW4uZ2V0TWluVGlsZUVsZXZhdGlvbkZvckxuZ0xhdFpvb20odGhpcy5fZWxldmF0aW9uQ2VudGVyLHRoaXMudHJhbnNmb3JtLnRpbGVab29tKTtjb25zdCBpPXRoaXMudGVycmFpbi5nZXRFbGV2YXRpb25Gb3JMbmdMYXRab29tKHRoaXMuX2VsZXZhdGlvbkNlbnRlcix0aGlzLnRyYW5zZm9ybS50aWxlWm9vbSk7aWYodDwxJiZpIT09dGhpcy5fZWxldmF0aW9uVGFyZ2V0KXtjb25zdCBlPXRoaXMuX2VsZXZhdGlvblRhcmdldC10aGlzLl9lbGV2YXRpb25TdGFydDt0aGlzLl9lbGV2YXRpb25TdGFydCs9dCooZS0oaS0oZSp0K3RoaXMuX2VsZXZhdGlvblN0YXJ0KSkvKDEtdCkpLHRoaXMuX2VsZXZhdGlvblRhcmdldD1pO310aGlzLnRyYW5zZm9ybS5lbGV2YXRpb249ZS55Lm51bWJlcih0aGlzLl9lbGV2YXRpb25TdGFydCx0aGlzLl9lbGV2YXRpb25UYXJnZXQsdCk7fV9maW5hbGl6ZUVsZXZhdGlvbigpe3RoaXMuX2VsZXZhdGlvbkZyZWV6ZT0hMSx0aGlzLnRyYW5zZm9ybS5yZWNhbGN1bGF0ZVpvb20odGhpcy50ZXJyYWluKTt9X2dldFRyYW5zZm9ybUZvclVwZGF0ZSgpe3JldHVybiB0aGlzLnRyYW5zZm9ybUNhbWVyYVVwZGF0ZXx8dGhpcy50ZXJyYWluPyh0aGlzLl9yZXF1ZXN0ZWRDYW1lcmFTdGF0ZXx8KHRoaXMuX3JlcXVlc3RlZENhbWVyYVN0YXRlPXRoaXMudHJhbnNmb3JtLmNsb25lKCkpLHRoaXMuX3JlcXVlc3RlZENhbWVyYVN0YXRlKTp0aGlzLnRyYW5zZm9ybX1fZWxldmF0ZUNhbWVyYUlmSW5zaWRlVGVycmFpbih0KXtjb25zdCBlPXQuZ2V0Q2FtZXJhUG9zaXRpb24oKSxpPXRoaXMudGVycmFpbi5nZXRFbGV2YXRpb25Gb3JMbmdMYXRab29tKGUubG5nTGF0LHQuem9vbSk7aWYoZS5hbHRpdHVkZTxpKXtjb25zdCBhPXRoaXMuY2FsY3VsYXRlQ2FtZXJhT3B0aW9uc0Zyb21UbyhlLmxuZ0xhdCxpLHQuY2VudGVyLHQuZWxldmF0aW9uKTtyZXR1cm4ge3BpdGNoOmEucGl0Y2gsem9vbTphLnpvb219fXJldHVybiB7fX1fYXBwbHlVcGRhdGVkVHJhbnNmb3JtKHQpe2NvbnN0IGU9W107aWYodGhpcy50ZXJyYWluJiZlLnB1c2goKHQ9PnRoaXMuX2VsZXZhdGVDYW1lcmFJZkluc2lkZVRlcnJhaW4odCkpKSx0aGlzLnRyYW5zZm9ybUNhbWVyYVVwZGF0ZSYmZS5wdXNoKCh0PT50aGlzLnRyYW5zZm9ybUNhbWVyYVVwZGF0ZSh0KSkpLCFlLmxlbmd0aClyZXR1cm47Y29uc3QgaT10LmNsb25lKCk7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT1pLmNsb25lKCkse2NlbnRlcjphLHpvb206cyxwaXRjaDpvLGJlYXJpbmc6cixlbGV2YXRpb246bn09dChlKTthJiYoZS5jZW50ZXI9YSksdm9pZCAwIT09cyYmKGUuem9vbT1zKSx2b2lkIDAhPT1vJiYoZS5waXRjaD1vKSx2b2lkIDAhPT1yJiYoZS5iZWFyaW5nPXIpLHZvaWQgMCE9PW4mJihlLmVsZXZhdGlvbj1uKSxpLmFwcGx5KGUpO310aGlzLnRyYW5zZm9ybS5hcHBseShpKTt9X2ZpcmVNb3ZlRXZlbnRzKHQpe3RoaXMuZmlyZShuZXcgZS5rKFwibW92ZVwiLHQpKSx0aGlzLl96b29taW5nJiZ0aGlzLmZpcmUobmV3IGUuayhcInpvb21cIix0KSksdGhpcy5fcm90YXRpbmcmJnRoaXMuZmlyZShuZXcgZS5rKFwicm90YXRlXCIsdCkpLHRoaXMuX3BpdGNoaW5nJiZ0aGlzLmZpcmUobmV3IGUuayhcInBpdGNoXCIsdCkpO31fYWZ0ZXJFYXNlKHQsaSl7aWYodGhpcy5fZWFzZUlkJiZpJiZ0aGlzLl9lYXNlSWQ9PT1pKXJldHVybjtkZWxldGUgdGhpcy5fZWFzZUlkO2NvbnN0IGE9dGhpcy5fem9vbWluZyxzPXRoaXMuX3JvdGF0aW5nLG89dGhpcy5fcGl0Y2hpbmc7dGhpcy5fbW92aW5nPSExLHRoaXMuX3pvb21pbmc9ITEsdGhpcy5fcm90YXRpbmc9ITEsdGhpcy5fcGl0Y2hpbmc9ITEsdGhpcy5fcGFkZGluZz0hMSxhJiZ0aGlzLmZpcmUobmV3IGUuayhcInpvb21lbmRcIix0KSkscyYmdGhpcy5maXJlKG5ldyBlLmsoXCJyb3RhdGVlbmRcIix0KSksbyYmdGhpcy5maXJlKG5ldyBlLmsoXCJwaXRjaGVuZFwiLHQpKSx0aGlzLmZpcmUobmV3IGUuayhcIm1vdmVlbmRcIix0KSk7fWZseVRvKHQsaSl7dmFyIGE7aWYoIXQuZXNzZW50aWFsJiZvLnByZWZlcnNSZWR1Y2VkTW90aW9uKXtjb25zdCBhPWUuTSh0LFtcImNlbnRlclwiLFwiem9vbVwiLFwiYmVhcmluZ1wiLFwicGl0Y2hcIixcImFyb3VuZFwiXSk7cmV0dXJuIHRoaXMuanVtcFRvKGEsaSl9dGhpcy5zdG9wKCksdD1lLmUoe29mZnNldDpbMCwwXSxzcGVlZDoxLjIsY3VydmU6MS40MixlYXNpbmc6ZS5iOX0sdCk7Y29uc3Qgcz10aGlzLl9nZXRUcmFuc2Zvcm1Gb3JVcGRhdGUoKSxyPXMuem9vbSxuPXMuYmVhcmluZyxsPXMucGl0Y2gsaD1zLnBhZGRpbmcsYz1cImJlYXJpbmdcImluIHQ/dGhpcy5fbm9ybWFsaXplQmVhcmluZyh0LmJlYXJpbmcsbik6bix1PVwicGl0Y2hcImluIHQ/K3QucGl0Y2g6bCxkPVwicGFkZGluZ1wiaW4gdD90LnBhZGRpbmc6cy5wYWRkaW5nLF89ZS5QLmNvbnZlcnQodC5vZmZzZXQpO2xldCBwPXMuY2VudGVyUG9pbnQuYWRkKF8pO2NvbnN0IG09cy5wb2ludExvY2F0aW9uKHApLHtjZW50ZXI6Zix6b29tOmd9PXMuZ2V0Q29uc3RyYWluZWQoZS5OLmNvbnZlcnQodC5jZW50ZXJ8fG0pLG51bGwhPT0oYT10Lnpvb20pJiZ2b2lkIDAhPT1hP2E6cik7dGhpcy5fbm9ybWFsaXplQ2VudGVyKGYscyk7Y29uc3Qgdj1zLnpvb21TY2FsZShnLXIpLHg9cy5wcm9qZWN0KG0pLHk9cy5wcm9qZWN0KGYpLnN1Yih4KTtsZXQgYj10LmN1cnZlO2NvbnN0IHc9TWF0aC5tYXgocy53aWR0aCxzLmhlaWdodCksVD13L3YsST15Lm1hZygpO2lmKFwibWluWm9vbVwiaW4gdCl7Y29uc3QgaT1lLmFjKE1hdGgubWluKHQubWluWm9vbSxyLGcpLHMubWluWm9vbSxzLm1heFpvb20pLGE9dy9zLnpvb21TY2FsZShpLXIpO2I9TWF0aC5zcXJ0KGEvSSoyKTt9Y29uc3QgRT1iKmI7ZnVuY3Rpb24gUCh0KXtjb25zdCBlPShUKlQtdyp3Kyh0Py0xOjEpKkUqRSpJKkkpLygyKih0P1Q6dykqRSpJKTtyZXR1cm4gTWF0aC5sb2coTWF0aC5zcXJ0KGUqZSsxKS1lKX1mdW5jdGlvbiBDKHQpe3JldHVybiAoTWF0aC5leHAodCktTWF0aC5leHAoLXQpKS8yfWZ1bmN0aW9uIFModCl7cmV0dXJuIChNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpLzJ9Y29uc3Qgej1QKCExKTtsZXQgRD1mdW5jdGlvbih0KXtyZXR1cm4gUyh6KS9TKHorYip0KX0sTT1mdW5jdGlvbih0KXtyZXR1cm4gdyooKFMoeikqKEMoZT16K2IqdCkvUyhlKSktQyh6KSkvRSkvSTt2YXIgZTt9LEE9KFAoITApLXopL2I7aWYoTWF0aC5hYnMoSSk8MWUtNnx8IWlzRmluaXRlKEEpKXtpZihNYXRoLmFicyh3LVQpPDFlLTYpcmV0dXJuIHRoaXMuZWFzZVRvKHQsaSk7Y29uc3QgZT1UPHc/LTE6MTtBPU1hdGguYWJzKE1hdGgubG9nKFQvdykpL2IsTT0oKT0+MCxEPXQ9Pk1hdGguZXhwKGUqYip0KTt9cmV0dXJuIHQuZHVyYXRpb249XCJkdXJhdGlvblwiaW4gdD8rdC5kdXJhdGlvbjoxZTMqQS8oXCJzY3JlZW5TcGVlZFwiaW4gdD8rdC5zY3JlZW5TcGVlZC9iOit0LnNwZWVkKSx0Lm1heER1cmF0aW9uJiZ0LmR1cmF0aW9uPnQubWF4RHVyYXRpb24mJih0LmR1cmF0aW9uPTApLHRoaXMuX3pvb21pbmc9ITAsdGhpcy5fcm90YXRpbmc9biE9PWMsdGhpcy5fcGl0Y2hpbmc9dSE9PWwsdGhpcy5fcGFkZGluZz0hcy5pc1BhZGRpbmdFcXVhbChkKSx0aGlzLl9wcmVwYXJlRWFzZShpLCExKSx0aGlzLnRlcnJhaW4mJnRoaXMuX3ByZXBhcmVFbGV2YXRpb24oZiksdGhpcy5fZWFzZSgoYT0+e2NvbnN0IG89YSpBLG09MS9EKG8pO3Muem9vbT0xPT09YT9nOnIrcy5zY2FsZVpvb20obSksdGhpcy5fcm90YXRpbmcmJihzLmJlYXJpbmc9ZS55Lm51bWJlcihuLGMsYSkpLHRoaXMuX3BpdGNoaW5nJiYocy5waXRjaD1lLnkubnVtYmVyKGwsdSxhKSksdGhpcy5fcGFkZGluZyYmKHMuaW50ZXJwb2xhdGVQYWRkaW5nKGgsZCxhKSxwPXMuY2VudGVyUG9pbnQuYWRkKF8pKSx0aGlzLnRlcnJhaW4mJiF0LmZyZWV6ZUVsZXZhdGlvbiYmdGhpcy5fdXBkYXRlRWxldmF0aW9uKGEpO2NvbnN0IHY9MT09PWE/ZjpzLnVucHJvamVjdCh4LmFkZCh5Lm11bHQoTShvKSkpLm11bHQobSkpO3Muc2V0TG9jYXRpb25BdFBvaW50KHMucmVuZGVyV29ybGRDb3BpZXM/di53cmFwKCk6dixwKSx0aGlzLl9hcHBseVVwZGF0ZWRUcmFuc2Zvcm0ocyksdGhpcy5fZmlyZU1vdmVFdmVudHMoaSk7fSksKCgpPT57dGhpcy50ZXJyYWluJiZ0LmZyZWV6ZUVsZXZhdGlvbiYmdGhpcy5fZmluYWxpemVFbGV2YXRpb24oKSx0aGlzLl9hZnRlckVhc2UoaSk7fSksdCksdGhpc31pc0Vhc2luZygpe3JldHVybiAhIXRoaXMuX2Vhc2VGcmFtZUlkfXN0b3AoKXtyZXR1cm4gdGhpcy5fc3RvcCgpfV9zdG9wKHQsZSl7dmFyIGk7aWYodGhpcy5fZWFzZUZyYW1lSWQmJih0aGlzLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9lYXNlRnJhbWVJZCksZGVsZXRlIHRoaXMuX2Vhc2VGcmFtZUlkLGRlbGV0ZSB0aGlzLl9vbkVhc2VGcmFtZSksdGhpcy5fb25FYXNlRW5kKXtjb25zdCB0PXRoaXMuX29uRWFzZUVuZDtkZWxldGUgdGhpcy5fb25FYXNlRW5kLHQuY2FsbCh0aGlzLGUpO31yZXR1cm4gdHx8bnVsbD09PShpPXRoaXMuaGFuZGxlcnMpfHx2b2lkIDA9PT1pfHxpLnN0b3AoITEpLHRoaXN9X2Vhc2UodCxlLGkpeyExPT09aS5hbmltYXRlfHwwPT09aS5kdXJhdGlvbj8odCgxKSxlKCkpOih0aGlzLl9lYXNlU3RhcnQ9by5ub3coKSx0aGlzLl9lYXNlT3B0aW9ucz1pLHRoaXMuX29uRWFzZUZyYW1lPXQsdGhpcy5fb25FYXNlRW5kPWUsdGhpcy5fZWFzZUZyYW1lSWQ9dGhpcy5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX3JlbmRlckZyYW1lQ2FsbGJhY2spKTt9X25vcm1hbGl6ZUJlYXJpbmcodCxpKXt0PWUuYjModCwtMTgwLDE4MCk7Y29uc3QgYT1NYXRoLmFicyh0LWkpO3JldHVybiBNYXRoLmFicyh0LTM2MC1pKTxhJiYodC09MzYwKSxNYXRoLmFicyh0KzM2MC1pKTxhJiYodCs9MzYwKSx0fV9ub3JtYWxpemVDZW50ZXIodCxlKXtpZighZS5yZW5kZXJXb3JsZENvcGllc3x8ZS5sbmdSYW5nZSlyZXR1cm47Y29uc3QgaT10LmxuZy1lLmNlbnRlci5sbmc7dC5sbmcrPWk+MTgwPy0zNjA6aTwtMTgwPzM2MDowO31xdWVyeVRlcnJhaW5FbGV2YXRpb24odCl7cmV0dXJuIHRoaXMudGVycmFpbj90aGlzLnRlcnJhaW4uZ2V0RWxldmF0aW9uRm9yTG5nTGF0Wm9vbShlLk4uY29udmVydCh0KSx0aGlzLnRyYW5zZm9ybS50aWxlWm9vbSktdGhpcy50cmFuc2Zvcm0uZWxldmF0aW9uOm51bGx9fWNvbnN0IElzPXtjb21wYWN0OiEwLGN1c3RvbUF0dHJpYnV0aW9uOic8YSBocmVmPVwiaHR0cHM6Ly9tYXBsaWJyZS5vcmcvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+TWFwTGlicmU8L2E+J307Y2xhc3MgRXN7Y29uc3RydWN0b3IodD1Jcyl7dGhpcy5fdG9nZ2xlQXR0cmlidXRpb249KCk9Pnt0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKFwibWFwbGlicmVnbC1jb21wYWN0XCIpJiYodGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucyhcIm1hcGxpYnJlZ2wtY29tcGFjdC1zaG93XCIpPyh0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKFwib3BlblwiLFwiXCIpLHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jb21wYWN0LXNob3dcIikpOih0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY29tcGFjdC1zaG93XCIpLHRoaXMuX2NvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoXCJvcGVuXCIpKSk7fSx0aGlzLl91cGRhdGVEYXRhPXQ9PnshdHx8XCJtZXRhZGF0YVwiIT09dC5zb3VyY2VEYXRhVHlwZSYmXCJ2aXNpYmlsaXR5XCIhPT10LnNvdXJjZURhdGFUeXBlJiZcInN0eWxlXCIhPT10LmRhdGFUeXBlJiZcInRlcnJhaW5cIiE9PXQudHlwZXx8dGhpcy5fdXBkYXRlQXR0cmlidXRpb25zKCk7fSx0aGlzLl91cGRhdGVDb21wYWN0PSgpPT57dGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoPD02NDB8fHRoaXMuX2NvbXBhY3Q/ITE9PT10aGlzLl9jb21wYWN0P3RoaXMuX2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJvcGVuXCIsXCJcIik6dGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucyhcIm1hcGxpYnJlZ2wtY29tcGFjdFwiKXx8dGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucyhcIm1hcGxpYnJlZ2wtYXR0cmliLWVtcHR5XCIpfHwodGhpcy5fY29udGFpbmVyLnNldEF0dHJpYnV0ZShcIm9wZW5cIixcIlwiKSx0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY29tcGFjdFwiLFwibWFwbGlicmVnbC1jb21wYWN0LXNob3dcIikpOih0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKFwib3BlblwiLFwiXCIpLHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoXCJtYXBsaWJyZWdsLWNvbXBhY3RcIikmJnRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jb21wYWN0XCIsXCJtYXBsaWJyZWdsLWNvbXBhY3Qtc2hvd1wiKSk7fSx0aGlzLl91cGRhdGVDb21wYWN0TWluaW1pemU9KCk9Pnt0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKFwibWFwbGlicmVnbC1jb21wYWN0XCIpJiZ0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKFwibWFwbGlicmVnbC1jb21wYWN0LXNob3dcIikmJnRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jb21wYWN0LXNob3dcIik7fSx0aGlzLm9wdGlvbnM9dDt9Z2V0RGVmYXVsdFBvc2l0aW9uKCl7cmV0dXJuIFwiYm90dG9tLXJpZ2h0XCJ9b25BZGQodCl7cmV0dXJuIHRoaXMuX21hcD10LHRoaXMuX2NvbXBhY3Q9dGhpcy5vcHRpb25zLmNvbXBhY3QsdGhpcy5fY29udGFpbmVyPXIuY3JlYXRlKFwiZGV0YWlsc1wiLFwibWFwbGlicmVnbC1jdHJsIG1hcGxpYnJlZ2wtY3RybC1hdHRyaWJcIiksdGhpcy5fY29tcGFjdEJ1dHRvbj1yLmNyZWF0ZShcInN1bW1hcnlcIixcIm1hcGxpYnJlZ2wtY3RybC1hdHRyaWItYnV0dG9uXCIsdGhpcy5fY29udGFpbmVyKSx0aGlzLl9jb21wYWN0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHRoaXMuX3RvZ2dsZUF0dHJpYnV0aW9uKSx0aGlzLl9zZXRFbGVtZW50VGl0bGUodGhpcy5fY29tcGFjdEJ1dHRvbixcIlRvZ2dsZUF0dHJpYnV0aW9uXCIpLHRoaXMuX2lubmVyQ29udGFpbmVyPXIuY3JlYXRlKFwiZGl2XCIsXCJtYXBsaWJyZWdsLWN0cmwtYXR0cmliLWlubmVyXCIsdGhpcy5fY29udGFpbmVyKSx0aGlzLl91cGRhdGVBdHRyaWJ1dGlvbnMoKSx0aGlzLl91cGRhdGVDb21wYWN0KCksdGhpcy5fbWFwLm9uKFwic3R5bGVkYXRhXCIsdGhpcy5fdXBkYXRlRGF0YSksdGhpcy5fbWFwLm9uKFwic291cmNlZGF0YVwiLHRoaXMuX3VwZGF0ZURhdGEpLHRoaXMuX21hcC5vbihcInRlcnJhaW5cIix0aGlzLl91cGRhdGVEYXRhKSx0aGlzLl9tYXAub24oXCJyZXNpemVcIix0aGlzLl91cGRhdGVDb21wYWN0KSx0aGlzLl9tYXAub24oXCJkcmFnXCIsdGhpcy5fdXBkYXRlQ29tcGFjdE1pbmltaXplKSx0aGlzLl9jb250YWluZXJ9b25SZW1vdmUoKXtyLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLHRoaXMuX21hcC5vZmYoXCJzdHlsZWRhdGFcIix0aGlzLl91cGRhdGVEYXRhKSx0aGlzLl9tYXAub2ZmKFwic291cmNlZGF0YVwiLHRoaXMuX3VwZGF0ZURhdGEpLHRoaXMuX21hcC5vZmYoXCJ0ZXJyYWluXCIsdGhpcy5fdXBkYXRlRGF0YSksdGhpcy5fbWFwLm9mZihcInJlc2l6ZVwiLHRoaXMuX3VwZGF0ZUNvbXBhY3QpLHRoaXMuX21hcC5vZmYoXCJkcmFnXCIsdGhpcy5fdXBkYXRlQ29tcGFjdE1pbmltaXplKSx0aGlzLl9tYXA9dm9pZCAwLHRoaXMuX2NvbXBhY3Q9dm9pZCAwLHRoaXMuX2F0dHJpYkhUTUw9dm9pZCAwO31fc2V0RWxlbWVudFRpdGxlKHQsZSl7Y29uc3QgaT10aGlzLl9tYXAuX2dldFVJU3RyaW5nKGBBdHRyaWJ1dGlvbkNvbnRyb2wuJHtlfWApO3QudGl0bGU9aSx0LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixpKTt9X3VwZGF0ZUF0dHJpYnV0aW9ucygpe2lmKCF0aGlzLl9tYXAuc3R5bGUpcmV0dXJuO2xldCB0PVtdO2lmKHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbiYmKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKT90PXQuY29uY2F0KHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbi5tYXAoKHQ9Plwic3RyaW5nXCIhPXR5cGVvZiB0P1wiXCI6dCkpKTpcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uJiZ0LnB1c2godGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKSksdGhpcy5fbWFwLnN0eWxlLnN0eWxlc2hlZXQpe2NvbnN0IHQ9dGhpcy5fbWFwLnN0eWxlLnN0eWxlc2hlZXQ7dGhpcy5zdHlsZU93bmVyPXQub3duZXIsdGhpcy5zdHlsZUlkPXQuaWQ7fWNvbnN0IGU9dGhpcy5fbWFwLnN0eWxlLnNvdXJjZUNhY2hlcztmb3IoY29uc3QgaSBpbiBlKXtjb25zdCBhPWVbaV07aWYoYS51c2VkfHxhLnVzZWRGb3JUZXJyYWluKXtjb25zdCBlPWEuZ2V0U291cmNlKCk7ZS5hdHRyaWJ1dGlvbiYmdC5pbmRleE9mKGUuYXR0cmlidXRpb24pPDAmJnQucHVzaChlLmF0dHJpYnV0aW9uKTt9fXQ9dC5maWx0ZXIoKHQ9PlN0cmluZyh0KS50cmltKCkpKSx0LnNvcnQoKCh0LGUpPT50Lmxlbmd0aC1lLmxlbmd0aCkpLHQ9dC5maWx0ZXIoKChlLGkpPT57Zm9yKGxldCBhPWkrMTthPHQubGVuZ3RoO2ErKylpZih0W2FdLmluZGV4T2YoZSk+PTApcmV0dXJuICExO3JldHVybiAhMH0pKTtjb25zdCBpPXQuam9pbihcIiB8IFwiKTtpIT09dGhpcy5fYXR0cmliSFRNTCYmKHRoaXMuX2F0dHJpYkhUTUw9aSx0Lmxlbmd0aD8odGhpcy5faW5uZXJDb250YWluZXIuaW5uZXJIVE1MPWksdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWF0dHJpYi1lbXB0eVwiKSk6dGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWF0dHJpYi1lbXB0eVwiKSx0aGlzLl91cGRhdGVDb21wYWN0KCksdGhpcy5fZWRpdExpbms9bnVsbCk7fX1jbGFzcyBQc3tjb25zdHJ1Y3Rvcih0PXt9KXt0aGlzLl91cGRhdGVDb21wYWN0PSgpPT57Y29uc3QgdD10aGlzLl9jb250YWluZXIuY2hpbGRyZW47aWYodC5sZW5ndGgpe2NvbnN0IGU9dFswXTt0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkub2Zmc2V0V2lkdGg8PTY0MHx8dGhpcy5fY29tcGFjdD8hMSE9PXRoaXMuX2NvbXBhY3QmJmUuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY29tcGFjdFwiKTplLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWNvbXBhY3RcIik7fX0sdGhpcy5vcHRpb25zPXQ7fWdldERlZmF1bHRQb3NpdGlvbigpe3JldHVybiBcImJvdHRvbS1sZWZ0XCJ9b25BZGQodCl7dGhpcy5fbWFwPXQsdGhpcy5fY29tcGFjdD10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5jb21wYWN0LHRoaXMuX2NvbnRhaW5lcj1yLmNyZWF0ZShcImRpdlwiLFwibWFwbGlicmVnbC1jdHJsXCIpO2NvbnN0IGU9ci5jcmVhdGUoXCJhXCIsXCJtYXBsaWJyZWdsLWN0cmwtbG9nb1wiKTtyZXR1cm4gZS50YXJnZXQ9XCJfYmxhbmtcIixlLnJlbD1cIm5vb3BlbmVyIG5vZm9sbG93XCIsZS5ocmVmPVwiaHR0cHM6Ly9tYXBsaWJyZS5vcmcvXCIsZS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsdGhpcy5fbWFwLl9nZXRVSVN0cmluZyhcIkxvZ29Db250cm9sLlRpdGxlXCIpKSxlLnNldEF0dHJpYnV0ZShcInJlbFwiLFwibm9vcGVuZXIgbm9mb2xsb3dcIiksdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGUpLHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIix0aGlzLl9tYXAub24oXCJyZXNpemVcIix0aGlzLl91cGRhdGVDb21wYWN0KSx0aGlzLl91cGRhdGVDb21wYWN0KCksdGhpcy5fY29udGFpbmVyfW9uUmVtb3ZlKCl7ci5yZW1vdmUodGhpcy5fY29udGFpbmVyKSx0aGlzLl9tYXAub2ZmKFwicmVzaXplXCIsdGhpcy5fdXBkYXRlQ29tcGFjdCksdGhpcy5fbWFwPXZvaWQgMCx0aGlzLl9jb21wYWN0PXZvaWQgMDt9fWNsYXNzIENze2NvbnN0cnVjdG9yKCl7dGhpcy5fcXVldWU9W10sdGhpcy5faWQ9MCx0aGlzLl9jbGVhcmVkPSExLHRoaXMuX2N1cnJlbnRseVJ1bm5pbmc9ITE7fWFkZCh0KXtjb25zdCBlPSsrdGhpcy5faWQ7cmV0dXJuIHRoaXMuX3F1ZXVlLnB1c2goe2NhbGxiYWNrOnQsaWQ6ZSxjYW5jZWxsZWQ6ITF9KSxlfXJlbW92ZSh0KXtjb25zdCBlPXRoaXMuX2N1cnJlbnRseVJ1bm5pbmcsaT1lP3RoaXMuX3F1ZXVlLmNvbmNhdChlKTp0aGlzLl9xdWV1ZTtmb3IoY29uc3QgZSBvZiBpKWlmKGUuaWQ9PT10KXJldHVybiB2b2lkKGUuY2FuY2VsbGVkPSEwKX1ydW4odD0wKXtpZih0aGlzLl9jdXJyZW50bHlSdW5uaW5nKXRocm93IG5ldyBFcnJvcihcIkF0dGVtcHRpbmcgdG8gcnVuKCksIGJ1dCBpcyBhbHJlYWR5IHJ1bm5pbmcuXCIpO2NvbnN0IGU9dGhpcy5fY3VycmVudGx5UnVubmluZz10aGlzLl9xdWV1ZTt0aGlzLl9xdWV1ZT1bXTtmb3IoY29uc3QgaSBvZiBlKWlmKCFpLmNhbmNlbGxlZCYmKGkuY2FsbGJhY2sodCksdGhpcy5fY2xlYXJlZCkpYnJlYWs7dGhpcy5fY2xlYXJlZD0hMSx0aGlzLl9jdXJyZW50bHlSdW5uaW5nPSExO31jbGVhcigpe3RoaXMuX2N1cnJlbnRseVJ1bm5pbmcmJih0aGlzLl9jbGVhcmVkPSEwKSx0aGlzLl9xdWV1ZT1bXTt9fXZhciBTcz1lLlkoW3tuYW1lOlwiYV9wb3MzZFwiLHR5cGU6XCJJbnQxNlwiLGNvbXBvbmVudHM6M31dKTtjbGFzcyB6cyBleHRlbmRzIGUuRXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuc291cmNlQ2FjaGU9dCx0aGlzLl90aWxlcz17fSx0aGlzLl9yZW5kZXJhYmxlVGlsZXNLZXlzPVtdLHRoaXMuX3NvdXJjZVRpbGVDYWNoZT17fSx0aGlzLm1pbnpvb209MCx0aGlzLm1heHpvb209MjIsdGhpcy50aWxlU2l6ZT01MTIsdGhpcy5kZWx0YVpvb209MSx0LnVzZWRGb3JUZXJyYWluPSEwLHQudGlsZVNpemU9dGhpcy50aWxlU2l6ZSoyKip0aGlzLmRlbHRhWm9vbTt9ZGVzdHJ1Y3QoKXt0aGlzLnNvdXJjZUNhY2hlLnVzZWRGb3JUZXJyYWluPSExLHRoaXMuc291cmNlQ2FjaGUudGlsZVNpemU9bnVsbDt9dXBkYXRlKHQsaSl7dGhpcy5zb3VyY2VDYWNoZS51cGRhdGUodCxpKSx0aGlzLl9yZW5kZXJhYmxlVGlsZXNLZXlzPVtdO2NvbnN0IGE9e307Zm9yKGNvbnN0IHMgb2YgdC5jb3ZlcmluZ1RpbGVzKHt0aWxlU2l6ZTp0aGlzLnRpbGVTaXplLG1pbnpvb206dGhpcy5taW56b29tLG1heHpvb206dGhpcy5tYXh6b29tLHJlcGFyc2VPdmVyc2NhbGVkOiExLHRlcnJhaW46aX0pKWFbcy5rZXldPSEwLHRoaXMuX3JlbmRlcmFibGVUaWxlc0tleXMucHVzaChzLmtleSksdGhpcy5fdGlsZXNbcy5rZXldfHwocy5wb3NNYXRyaXg9bmV3IEZsb2F0NjRBcnJheSgxNiksZS5hUChzLnBvc01hdHJpeCwwLGUuWCwwLGUuWCwwLDEpLHRoaXMuX3RpbGVzW3Mua2V5XT1uZXcgbHQocyx0aGlzLnRpbGVTaXplKSk7Zm9yKGNvbnN0IHQgaW4gdGhpcy5fdGlsZXMpYVt0XXx8ZGVsZXRlIHRoaXMuX3RpbGVzW3RdO31mcmVlUnR0KHQpe2Zvcihjb25zdCBlIGluIHRoaXMuX3RpbGVzKXtjb25zdCBpPXRoaXMuX3RpbGVzW2VdOyghdHx8aS50aWxlSUQuZXF1YWxzKHQpfHxpLnRpbGVJRC5pc0NoaWxkT2YodCl8fHQuaXNDaGlsZE9mKGkudGlsZUlEKSkmJihpLnJ0dD1bXSk7fX1nZXRSZW5kZXJhYmxlVGlsZXMoKXtyZXR1cm4gdGhpcy5fcmVuZGVyYWJsZVRpbGVzS2V5cy5tYXAoKHQ9PnRoaXMuZ2V0VGlsZUJ5SUQodCkpKX1nZXRUaWxlQnlJRCh0KXtyZXR1cm4gdGhpcy5fdGlsZXNbdF19Z2V0VGVycmFpbkNvb3Jkcyh0KXtjb25zdCBpPXt9O2Zvcihjb25zdCBhIG9mIHRoaXMuX3JlbmRlcmFibGVUaWxlc0tleXMpe2NvbnN0IHM9dGhpcy5fdGlsZXNbYV0udGlsZUlEO2lmKHMuY2Fub25pY2FsLmVxdWFscyh0LmNhbm9uaWNhbCkpe2NvbnN0IHM9dC5jbG9uZSgpO3MucG9zTWF0cml4PW5ldyBGbG9hdDY0QXJyYXkoMTYpLGUuYVAocy5wb3NNYXRyaXgsMCxlLlgsMCxlLlgsMCwxKSxpW2FdPXM7fWVsc2UgaWYocy5jYW5vbmljYWwuaXNDaGlsZE9mKHQuY2Fub25pY2FsKSl7Y29uc3Qgbz10LmNsb25lKCk7by5wb3NNYXRyaXg9bmV3IEZsb2F0NjRBcnJheSgxNik7Y29uc3Qgcj1zLmNhbm9uaWNhbC56LXQuY2Fub25pY2FsLnosbj1zLmNhbm9uaWNhbC54LShzLmNhbm9uaWNhbC54Pj5yPDxyKSxsPXMuY2Fub25pY2FsLnktKHMuY2Fub25pY2FsLnk+PnI8PHIpLGg9ZS5YPj5yO2UuYVAoby5wb3NNYXRyaXgsMCxoLDAsaCwwLDEpLGUuSihvLnBvc01hdHJpeCxvLnBvc01hdHJpeCxbLW4qaCwtbCpoLDBdKSxpW2FdPW87fWVsc2UgaWYodC5jYW5vbmljYWwuaXNDaGlsZE9mKHMuY2Fub25pY2FsKSl7Y29uc3Qgbz10LmNsb25lKCk7by5wb3NNYXRyaXg9bmV3IEZsb2F0NjRBcnJheSgxNik7Y29uc3Qgcj10LmNhbm9uaWNhbC56LXMuY2Fub25pY2FsLnosbj10LmNhbm9uaWNhbC54LSh0LmNhbm9uaWNhbC54Pj5yPDxyKSxsPXQuY2Fub25pY2FsLnktKHQuY2Fub25pY2FsLnk+PnI8PHIpLGg9ZS5YPj5yO2UuYVAoby5wb3NNYXRyaXgsMCxlLlgsMCxlLlgsMCwxKSxlLkooby5wb3NNYXRyaXgsby5wb3NNYXRyaXgsW24qaCxsKmgsMF0pLGUuSyhvLnBvc01hdHJpeCxvLnBvc01hdHJpeCxbMS8yKipyLDEvMioqciwwXSksaVthXT1vO319cmV0dXJuIGl9Z2V0U291cmNlVGlsZSh0LGUpe2NvbnN0IGk9dGhpcy5zb3VyY2VDYWNoZS5fc291cmNlO2xldCBhPXQub3ZlcnNjYWxlZFotdGhpcy5kZWx0YVpvb207aWYoYT5pLm1heHpvb20mJihhPWkubWF4em9vbSksYTxpLm1pbnpvb20pcmV0dXJuIG51bGw7dGhpcy5fc291cmNlVGlsZUNhY2hlW3Qua2V5XXx8KHRoaXMuX3NvdXJjZVRpbGVDYWNoZVt0LmtleV09dC5zY2FsZWRUbyhhKS5rZXkpO2xldCBzPXRoaXMuc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQodGhpcy5fc291cmNlVGlsZUNhY2hlW3Qua2V5XSk7aWYoKCFzfHwhcy5kZW0pJiZlKWZvcig7YT49aS5taW56b29tJiYoIXN8fCFzLmRlbSk7KXM9dGhpcy5zb3VyY2VDYWNoZS5nZXRUaWxlQnlJRCh0LnNjYWxlZFRvKGEtLSkua2V5KTtyZXR1cm4gc310aWxlc0FmdGVyVGltZSh0PURhdGUubm93KCkpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3RpbGVzKS5maWx0ZXIoKGU9PmUudGltZUFkZGVkPj10KSl9fWNsYXNzIERze2NvbnN0cnVjdG9yKHQsZSxpKXt0aGlzLnBhaW50ZXI9dCx0aGlzLnNvdXJjZUNhY2hlPW5ldyB6cyhlKSx0aGlzLm9wdGlvbnM9aSx0aGlzLmV4YWdnZXJhdGlvbj1cIm51bWJlclwiPT10eXBlb2YgaS5leGFnZ2VyYXRpb24/aS5leGFnZ2VyYXRpb246MSx0aGlzLnF1YWxpdHlGYWN0b3I9Mix0aGlzLm1lc2hTaXplPTEyOCx0aGlzLl9kZW1NYXRyaXhDYWNoZT17fSx0aGlzLmNvb3Jkc0luZGV4PVtdLHRoaXMuX2Nvb3Jkc1RleHR1cmVTaXplPTEwMjQ7fWdldERFTUVsZXZhdGlvbih0LGksYSxzPWUuWCl7dmFyIG87aWYoIShpPj0wJiZpPHMmJmE+PTAmJmE8cykpcmV0dXJuIDA7Y29uc3Qgcj10aGlzLmdldFRlcnJhaW5EYXRhKHQpLG49bnVsbD09PShvPXIudGlsZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZGVtO2lmKCFuKXJldHVybiAwO2NvbnN0IGw9ZnVuY3Rpb24odCxlLGkpe3ZhciBhPWVbMF0scz1lWzFdO3JldHVybiB0WzBdPWlbMF0qYStpWzRdKnMraVsxMl0sdFsxXT1pWzFdKmEraVs1XSpzK2lbMTNdLHR9KFtdLFtpL3MqZS5YLGEvcyplLlhdLHIudV90ZXJyYWluX21hdHJpeCksaD1bbFswXSpuLmRpbSxsWzFdKm4uZGltXSxjPU1hdGguZmxvb3IoaFswXSksdT1NYXRoLmZsb29yKGhbMV0pLGQ9aFswXS1jLF89aFsxXS11O3JldHVybiBuLmdldChjLHUpKigxLWQpKigxLV8pK24uZ2V0KGMrMSx1KSpkKigxLV8pK24uZ2V0KGMsdSsxKSooMS1kKSpfK24uZ2V0KGMrMSx1KzEpKmQqX31nZXRFbGV2YXRpb25Gb3JMbmdMYXRab29tKHQsaSl7aWYoIWUuYmIoaSx0LndyYXAoKSkpcmV0dXJuIDA7Y29uc3R7dGlsZUlEOmEsbWVyY2F0b3JYOnMsbWVyY2F0b3JZOm99PXRoaXMuX2dldE92ZXJzY2FsZWRUaWxlSURGcm9tTG5nTGF0Wm9vbSh0LGkpO3JldHVybiB0aGlzLmdldEVsZXZhdGlvbihhLHMlZS5YLG8lZS5YLGUuWCl9Z2V0RWxldmF0aW9uKHQsaSxhLHM9ZS5YKXtyZXR1cm4gdGhpcy5nZXRERU1FbGV2YXRpb24odCxpLGEscykqdGhpcy5leGFnZ2VyYXRpb259Z2V0VGVycmFpbkRhdGEodCl7aWYoIXRoaXMuX2VtcHR5RGVtVGV4dHVyZSl7Y29uc3QgdD10aGlzLnBhaW50ZXIuY29udGV4dCxpPW5ldyBlLlIoe3dpZHRoOjEsaGVpZ2h0OjF9LG5ldyBVaW50OEFycmF5KDQpKTt0aGlzLl9lbXB0eURlcHRoVGV4dHVyZT1uZXcgYih0LGksdC5nbC5SR0JBLHtwcmVtdWx0aXBseTohMX0pLHRoaXMuX2VtcHR5RGVtVW5wYWNrPVswLDAsMCwwXSx0aGlzLl9lbXB0eURlbVRleHR1cmU9bmV3IGIodCxuZXcgZS5SKHt3aWR0aDoxLGhlaWdodDoxfSksdC5nbC5SR0JBLHtwcmVtdWx0aXBseTohMX0pLHRoaXMuX2VtcHR5RGVtVGV4dHVyZS5iaW5kKHQuZ2wuTkVBUkVTVCx0LmdsLkNMQU1QX1RPX0VER0UpLHRoaXMuX2VtcHR5RGVtTWF0cml4PWUuYW4oW10pO31jb25zdCBpPXRoaXMuc291cmNlQ2FjaGUuZ2V0U291cmNlVGlsZSh0LCEwKTtpZihpJiZpLmRlbSYmKCFpLmRlbVRleHR1cmV8fGkubmVlZHNUZXJyYWluUHJlcGFyZSkpe2NvbnN0IHQ9dGhpcy5wYWludGVyLmNvbnRleHQ7aS5kZW1UZXh0dXJlPXRoaXMucGFpbnRlci5nZXRUaWxlVGV4dHVyZShpLmRlbS5zdHJpZGUpLGkuZGVtVGV4dHVyZT9pLmRlbVRleHR1cmUudXBkYXRlKGkuZGVtLmdldFBpeGVscygpLHtwcmVtdWx0aXBseTohMX0pOmkuZGVtVGV4dHVyZT1uZXcgYih0LGkuZGVtLmdldFBpeGVscygpLHQuZ2wuUkdCQSx7cHJlbXVsdGlwbHk6ITF9KSxpLmRlbVRleHR1cmUuYmluZCh0LmdsLk5FQVJFU1QsdC5nbC5DTEFNUF9UT19FREdFKSxpLm5lZWRzVGVycmFpblByZXBhcmU9ITE7fWNvbnN0IGE9aSYmaStpLnRpbGVJRC5rZXkrdC5rZXk7aWYoYSYmIXRoaXMuX2RlbU1hdHJpeENhY2hlW2FdKXtjb25zdCBhPXRoaXMuc291cmNlQ2FjaGUuc291cmNlQ2FjaGUuX3NvdXJjZS5tYXh6b29tO2xldCBzPXQuY2Fub25pY2FsLnotaS50aWxlSUQuY2Fub25pY2FsLno7dC5vdmVyc2NhbGVkWj50LmNhbm9uaWNhbC56JiYodC5jYW5vbmljYWwuej49YT9zPXQuY2Fub25pY2FsLnotYTplLncoXCJjYW5ub3QgY2FsY3VsYXRlIGVsZXZhdGlvbiBpZiBlbGV2YXRpb24gbWF4em9vbSA+IHNvdXJjZS5tYXh6b29tXCIpKTtjb25zdCBvPXQuY2Fub25pY2FsLngtKHQuY2Fub25pY2FsLng+PnM8PHMpLHI9dC5jYW5vbmljYWwueS0odC5jYW5vbmljYWwueT4+czw8cyksbj1lLmJjKG5ldyBGbG9hdDY0QXJyYXkoMTYpLFsxLyhlLlg8PHMpLDEvKGUuWDw8cyksMF0pO2UuSihuLG4sW28qZS5YLHIqZS5YLDBdKSx0aGlzLl9kZW1NYXRyaXhDYWNoZVt0LmtleV09e21hdHJpeDpuLGNvb3JkOnR9O31yZXR1cm4ge3VfZGVwdGg6Mix1X3RlcnJhaW46Myx1X3RlcnJhaW5fZGltOmkmJmkuZGVtJiZpLmRlbS5kaW18fDEsdV90ZXJyYWluX21hdHJpeDphP3RoaXMuX2RlbU1hdHJpeENhY2hlW3Qua2V5XS5tYXRyaXg6dGhpcy5fZW1wdHlEZW1NYXRyaXgsdV90ZXJyYWluX3VucGFjazppJiZpLmRlbSYmaS5kZW0uZ2V0VW5wYWNrVmVjdG9yKCl8fHRoaXMuX2VtcHR5RGVtVW5wYWNrLHVfdGVycmFpbl9leGFnZ2VyYXRpb246dGhpcy5leGFnZ2VyYXRpb24sdGV4dHVyZTooaSYmaS5kZW1UZXh0dXJlfHx0aGlzLl9lbXB0eURlbVRleHR1cmUpLnRleHR1cmUsZGVwdGhUZXh0dXJlOih0aGlzLl9mYm9EZXB0aFRleHR1cmV8fHRoaXMuX2VtcHR5RGVwdGhUZXh0dXJlKS50ZXh0dXJlLHRpbGU6aX19Z2V0RnJhbWVidWZmZXIodCl7Y29uc3QgZT10aGlzLnBhaW50ZXIsaT1lLndpZHRoL2RldmljZVBpeGVsUmF0aW8sYT1lLmhlaWdodC9kZXZpY2VQaXhlbFJhdGlvO3JldHVybiAhdGhpcy5fZmJvfHx0aGlzLl9mYm8ud2lkdGg9PT1pJiZ0aGlzLl9mYm8uaGVpZ2h0PT09YXx8KHRoaXMuX2Ziby5kZXN0cm95KCksdGhpcy5fZmJvQ29vcmRzVGV4dHVyZS5kZXN0cm95KCksdGhpcy5fZmJvRGVwdGhUZXh0dXJlLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5fZmJvLGRlbGV0ZSB0aGlzLl9mYm9EZXB0aFRleHR1cmUsZGVsZXRlIHRoaXMuX2Zib0Nvb3Jkc1RleHR1cmUpLHRoaXMuX2Zib0Nvb3Jkc1RleHR1cmV8fCh0aGlzLl9mYm9Db29yZHNUZXh0dXJlPW5ldyBiKGUuY29udGV4dCx7d2lkdGg6aSxoZWlnaHQ6YSxkYXRhOm51bGx9LGUuY29udGV4dC5nbC5SR0JBLHtwcmVtdWx0aXBseTohMX0pLHRoaXMuX2Zib0Nvb3Jkc1RleHR1cmUuYmluZChlLmNvbnRleHQuZ2wuTkVBUkVTVCxlLmNvbnRleHQuZ2wuQ0xBTVBfVE9fRURHRSkpLHRoaXMuX2Zib0RlcHRoVGV4dHVyZXx8KHRoaXMuX2Zib0RlcHRoVGV4dHVyZT1uZXcgYihlLmNvbnRleHQse3dpZHRoOmksaGVpZ2h0OmEsZGF0YTpudWxsfSxlLmNvbnRleHQuZ2wuUkdCQSx7cHJlbXVsdGlwbHk6ITF9KSx0aGlzLl9mYm9EZXB0aFRleHR1cmUuYmluZChlLmNvbnRleHQuZ2wuTkVBUkVTVCxlLmNvbnRleHQuZ2wuQ0xBTVBfVE9fRURHRSkpLHRoaXMuX2Zib3x8KHRoaXMuX2Zibz1lLmNvbnRleHQuY3JlYXRlRnJhbWVidWZmZXIoaSxhLCEwLCExKSx0aGlzLl9mYm8uZGVwdGhBdHRhY2htZW50LnNldChlLmNvbnRleHQuY3JlYXRlUmVuZGVyYnVmZmVyKGUuY29udGV4dC5nbC5ERVBUSF9DT01QT05FTlQxNixpLGEpKSksdGhpcy5fZmJvLmNvbG9yQXR0YWNobWVudC5zZXQoXCJjb29yZHNcIj09PXQ/dGhpcy5fZmJvQ29vcmRzVGV4dHVyZS50ZXh0dXJlOnRoaXMuX2Zib0RlcHRoVGV4dHVyZS50ZXh0dXJlKSx0aGlzLl9mYm99Z2V0Q29vcmRzVGV4dHVyZSgpe2NvbnN0IHQ9dGhpcy5wYWludGVyLmNvbnRleHQ7aWYodGhpcy5fY29vcmRzVGV4dHVyZSlyZXR1cm4gdGhpcy5fY29vcmRzVGV4dHVyZTtjb25zdCBpPW5ldyBVaW50OEFycmF5KHRoaXMuX2Nvb3Jkc1RleHR1cmVTaXplKnRoaXMuX2Nvb3Jkc1RleHR1cmVTaXplKjQpO2ZvcihsZXQgdD0wLGU9MDt0PHRoaXMuX2Nvb3Jkc1RleHR1cmVTaXplO3QrKylmb3IobGV0IGE9MDthPHRoaXMuX2Nvb3Jkc1RleHR1cmVTaXplO2ErKyxlKz00KWlbZSswXT0yNTUmYSxpW2UrMV09MjU1JnQsaVtlKzJdPWE+Pjg8PDR8dD4+OCxpW2UrM109MDtjb25zdCBhPW5ldyBlLlIoe3dpZHRoOnRoaXMuX2Nvb3Jkc1RleHR1cmVTaXplLGhlaWdodDp0aGlzLl9jb29yZHNUZXh0dXJlU2l6ZX0sbmV3IFVpbnQ4QXJyYXkoaS5idWZmZXIpKSxzPW5ldyBiKHQsYSx0LmdsLlJHQkEse3ByZW11bHRpcGx5OiExfSk7cmV0dXJuIHMuYmluZCh0LmdsLk5FQVJFU1QsdC5nbC5DTEFNUF9UT19FREdFKSx0aGlzLl9jb29yZHNUZXh0dXJlPXMsc31wb2ludENvb3JkaW5hdGUodCl7dGhpcy5wYWludGVyLm1heWJlRHJhd0RlcHRoQW5kQ29vcmRzKCEwKTtjb25zdCBpPW5ldyBVaW50OEFycmF5KDQpLGE9dGhpcy5wYWludGVyLmNvbnRleHQscz1hLmdsLG89TWF0aC5yb3VuZCh0LngqdGhpcy5wYWludGVyLnBpeGVsUmF0aW8vZGV2aWNlUGl4ZWxSYXRpbykscj1NYXRoLnJvdW5kKHQueSp0aGlzLnBhaW50ZXIucGl4ZWxSYXRpby9kZXZpY2VQaXhlbFJhdGlvKSxuPU1hdGgucm91bmQodGhpcy5wYWludGVyLmhlaWdodC9kZXZpY2VQaXhlbFJhdGlvKTthLmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5nZXRGcmFtZWJ1ZmZlcihcImNvb3Jkc1wiKS5mcmFtZWJ1ZmZlcikscy5yZWFkUGl4ZWxzKG8sbi1yLTEsMSwxLHMuUkdCQSxzLlVOU0lHTkVEX0JZVEUsaSksYS5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpO2NvbnN0IGw9aVswXSsoaVsyXT4+NDw8OCksaD1pWzFdKygoMTUmaVsyXSk8PDgpLGM9dGhpcy5jb29yZHNJbmRleFsyNTUtaVszXV0sdT1jJiZ0aGlzLnNvdXJjZUNhY2hlLmdldFRpbGVCeUlEKGMpO2lmKCF1KXJldHVybiBudWxsO2NvbnN0IGQ9dGhpcy5fY29vcmRzVGV4dHVyZVNpemUsXz0oMTw8dS50aWxlSUQuY2Fub25pY2FsLnopKmQ7cmV0dXJuIG5ldyBlLlooKHUudGlsZUlELmNhbm9uaWNhbC54KmQrbCkvXyt1LnRpbGVJRC53cmFwLCh1LnRpbGVJRC5jYW5vbmljYWwueSpkK2gpL18sdGhpcy5nZXRFbGV2YXRpb24odS50aWxlSUQsbCxoLGQpKX1kZXB0aEF0UG9pbnQodCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSg0KSxpPXRoaXMucGFpbnRlci5jb250ZXh0LGE9aS5nbDtyZXR1cm4gaS5iaW5kRnJhbWVidWZmZXIuc2V0KHRoaXMuZ2V0RnJhbWVidWZmZXIoXCJkZXB0aFwiKS5mcmFtZWJ1ZmZlciksYS5yZWFkUGl4ZWxzKHQueCx0aGlzLnBhaW50ZXIuaGVpZ2h0L2RldmljZVBpeGVsUmF0aW8tdC55LTEsMSwxLGEuUkdCQSxhLlVOU0lHTkVEX0JZVEUsZSksaS5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpLChlWzBdLzE2Nzc3MjE2K2VbMV0vNjU1MzYrZVsyXS8yNTYrZVszXSkvMjU2fWdldFRlcnJhaW5NZXNoKCl7aWYodGhpcy5fbWVzaClyZXR1cm4gdGhpcy5fbWVzaDtjb25zdCB0PXRoaXMucGFpbnRlci5jb250ZXh0LGk9bmV3IGUuYmQsYT1uZXcgZS5hWSxzPXRoaXMubWVzaFNpemUsbz1lLlgvcyxyPXMqcztmb3IobGV0IHQ9MDt0PD1zO3QrKylmb3IobGV0IGU9MDtlPD1zO2UrKylpLmVtcGxhY2VCYWNrKGUqbyx0Km8sMCk7Zm9yKGxldCB0PTA7dDxyO3QrPXMrMSlmb3IobGV0IGU9MDtlPHM7ZSsrKWEuZW1wbGFjZUJhY2soZSt0LHMrZSt0KzEscytlK3QrMiksYS5lbXBsYWNlQmFjayhlK3QscytlK3QrMixlK3QrMSk7Y29uc3Qgbj1pLmxlbmd0aCxsPW4rMioocysxKTtmb3IoY29uc3QgdCBvZiBbMCwxXSlmb3IobGV0IGE9MDthPD1zO2ErKylmb3IoY29uc3QgcyBvZiBbMCwxXSlpLmVtcGxhY2VCYWNrKGEqbyx0KmUuWCxzKTtmb3IobGV0IHQ9MDt0PDIqczt0Kz0yKWEuZW1wbGFjZUJhY2sobCt0LGwrdCsxLGwrdCszKSxhLmVtcGxhY2VCYWNrKGwrdCxsK3QrMyxsK3QrMiksYS5lbXBsYWNlQmFjayhuK3Qsbit0KzMsbit0KzEpLGEuZW1wbGFjZUJhY2sobit0LG4rdCsyLG4rdCszKTtjb25zdCBoPWkubGVuZ3RoLGM9aCsyKihzKzEpO2Zvcihjb25zdCB0IG9mIFswLDFdKWZvcihsZXQgYT0wO2E8PXM7YSsrKWZvcihjb25zdCBzIG9mIFswLDFdKWkuZW1wbGFjZUJhY2sodCplLlgsYSpvLHMpO2ZvcihsZXQgdD0wO3Q8MipzO3QrPTIpYS5lbXBsYWNlQmFjayhoK3QsaCt0KzEsaCt0KzMpLGEuZW1wbGFjZUJhY2soaCt0LGgrdCszLGgrdCsyKSxhLmVtcGxhY2VCYWNrKGMrdCxjK3QrMyxjK3QrMSksYS5lbXBsYWNlQmFjayhjK3QsYyt0KzIsYyt0KzMpO3JldHVybiB0aGlzLl9tZXNoPW5ldyBnYSh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihpLFNzLm1lbWJlcnMpLHQuY3JlYXRlSW5kZXhCdWZmZXIoYSksZS5hMC5zaW1wbGVTZWdtZW50KDAsMCxpLmxlbmd0aCxhLmxlbmd0aCkpLHRoaXMuX21lc2h9Z2V0TWVzaEZyYW1lRGVsdGEodCl7cmV0dXJuIDIqTWF0aC5QSSplLmJlL01hdGgucG93KDIsdCkvNX1nZXRNaW5UaWxlRWxldmF0aW9uRm9yTG5nTGF0Wm9vbSh0LGUpe3ZhciBpO2NvbnN0e3RpbGVJRDphfT10aGlzLl9nZXRPdmVyc2NhbGVkVGlsZUlERnJvbUxuZ0xhdFpvb20odCxlKTtyZXR1cm4gbnVsbCE9PShpPXRoaXMuZ2V0TWluTWF4RWxldmF0aW9uKGEpLm1pbkVsZXZhdGlvbikmJnZvaWQgMCE9PWk/aTowfWdldE1pbk1heEVsZXZhdGlvbih0KXtjb25zdCBlPXRoaXMuZ2V0VGVycmFpbkRhdGEodCkudGlsZSxpPXttaW5FbGV2YXRpb246bnVsbCxtYXhFbGV2YXRpb246bnVsbH07cmV0dXJuIGUmJmUuZGVtJiYoaS5taW5FbGV2YXRpb249ZS5kZW0ubWluKnRoaXMuZXhhZ2dlcmF0aW9uLGkubWF4RWxldmF0aW9uPWUuZGVtLm1heCp0aGlzLmV4YWdnZXJhdGlvbiksaX1fZ2V0T3ZlcnNjYWxlZFRpbGVJREZyb21MbmdMYXRab29tKHQsaSl7Y29uc3QgYT1lLlouZnJvbUxuZ0xhdCh0LndyYXAoKSkscz0oMTw8aSkqZS5YLG89YS54KnMscj1hLnkqcyxuPU1hdGguZmxvb3Ioby9lLlgpLGw9TWF0aC5mbG9vcihyL2UuWCk7cmV0dXJuIHt0aWxlSUQ6bmV3IGUuUyhpLDAsaSxuLGwpLG1lcmNhdG9yWDpvLG1lcmNhdG9yWTpyfX19Y2xhc3MgTXN7Y29uc3RydWN0b3IodCxlLGkpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9zaXplPWUsdGhpcy5fdGlsZVNpemU9aSx0aGlzLl9vYmplY3RzPVtdLHRoaXMuX3JlY2VudGx5VXNlZD1bXSx0aGlzLl9zdGFtcD0wO31kZXN0cnVjdCgpe2Zvcihjb25zdCB0IG9mIHRoaXMuX29iamVjdHMpdC50ZXh0dXJlLmRlc3Ryb3koKSx0LmZiby5kZXN0cm95KCk7fV9jcmVhdGVPYmplY3QodCl7Y29uc3QgZT10aGlzLl9jb250ZXh0LmNyZWF0ZUZyYW1lYnVmZmVyKHRoaXMuX3RpbGVTaXplLHRoaXMuX3RpbGVTaXplLCEwLCEwKSxpPW5ldyBiKHRoaXMuX2NvbnRleHQse3dpZHRoOnRoaXMuX3RpbGVTaXplLGhlaWdodDp0aGlzLl90aWxlU2l6ZSxkYXRhOm51bGx9LHRoaXMuX2NvbnRleHQuZ2wuUkdCQSk7cmV0dXJuIGkuYmluZCh0aGlzLl9jb250ZXh0LmdsLkxJTkVBUix0aGlzLl9jb250ZXh0LmdsLkNMQU1QX1RPX0VER0UpLGUuZGVwdGhBdHRhY2htZW50LnNldCh0aGlzLl9jb250ZXh0LmNyZWF0ZVJlbmRlcmJ1ZmZlcih0aGlzLl9jb250ZXh0LmdsLkRFUFRIX1NURU5DSUwsdGhpcy5fdGlsZVNpemUsdGhpcy5fdGlsZVNpemUpKSxlLmNvbG9yQXR0YWNobWVudC5zZXQoaS50ZXh0dXJlKSx7aWQ6dCxmYm86ZSx0ZXh0dXJlOmksc3RhbXA6LTEsaW5Vc2U6ITF9fWdldE9iamVjdEZvcklkKHQpe3JldHVybiB0aGlzLl9vYmplY3RzW3RdfXVzZU9iamVjdCh0KXt0LmluVXNlPSEwLHRoaXMuX3JlY2VudGx5VXNlZD10aGlzLl9yZWNlbnRseVVzZWQuZmlsdGVyKChlPT50LmlkIT09ZSkpLHRoaXMuX3JlY2VudGx5VXNlZC5wdXNoKHQuaWQpO31zdGFtcE9iamVjdCh0KXt0LnN0YW1wPSsrdGhpcy5fc3RhbXA7fWdldE9yQ3JlYXRlRnJlZU9iamVjdCgpe2Zvcihjb25zdCB0IG9mIHRoaXMuX3JlY2VudGx5VXNlZClpZighdGhpcy5fb2JqZWN0c1t0XS5pblVzZSlyZXR1cm4gdGhpcy5fb2JqZWN0c1t0XTtpZih0aGlzLl9vYmplY3RzLmxlbmd0aD49dGhpcy5fc2l6ZSl0aHJvdyBuZXcgRXJyb3IoXCJObyBmcmVlIFJlbmRlclBvb2wgYXZhaWxhYmxlLCBjYWxsIGZyZWVBbGxPYmplY3RzKCkgcmVxdWlyZWQhXCIpO2NvbnN0IHQ9dGhpcy5fY3JlYXRlT2JqZWN0KHRoaXMuX29iamVjdHMubGVuZ3RoKTtyZXR1cm4gdGhpcy5fb2JqZWN0cy5wdXNoKHQpLHR9ZnJlZU9iamVjdCh0KXt0LmluVXNlPSExO31mcmVlQWxsT2JqZWN0cygpe2Zvcihjb25zdCB0IG9mIHRoaXMuX29iamVjdHMpdGhpcy5mcmVlT2JqZWN0KHQpO31pc0Z1bGwoKXtyZXR1cm4gISh0aGlzLl9vYmplY3RzLmxlbmd0aDx0aGlzLl9zaXplKSYmITE9PT10aGlzLl9vYmplY3RzLnNvbWUoKHQ9PiF0LmluVXNlKSl9fWNvbnN0IEFzPXtiYWNrZ3JvdW5kOiEwLGZpbGw6ITAsbGluZTohMCxyYXN0ZXI6ITAsaGlsbHNoYWRlOiEwfTtjbGFzcyBSc3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucGFpbnRlcj10LHRoaXMudGVycmFpbj1lLHRoaXMucG9vbD1uZXcgTXModC5jb250ZXh0LDMwLGUuc291cmNlQ2FjaGUudGlsZVNpemUqZS5xdWFsaXR5RmFjdG9yKTt9ZGVzdHJ1Y3QoKXt0aGlzLnBvb2wuZGVzdHJ1Y3QoKTt9Z2V0VGV4dHVyZSh0KXtyZXR1cm4gdGhpcy5wb29sLmdldE9iamVjdEZvcklkKHQucnR0W3RoaXMuX3N0YWNrcy5sZW5ndGgtMV0uaWQpLnRleHR1cmV9cHJlcGFyZUZvclJlbmRlcih0LGUpe3RoaXMuX3N0YWNrcz1bXSx0aGlzLl9wcmV2VHlwZT1udWxsLHRoaXMuX3J0dFRpbGVzPVtdLHRoaXMuX3JlbmRlcmFibGVUaWxlcz10aGlzLnRlcnJhaW4uc291cmNlQ2FjaGUuZ2V0UmVuZGVyYWJsZVRpbGVzKCksdGhpcy5fcmVuZGVyYWJsZUxheWVySWRzPXQuX29yZGVyLmZpbHRlcigoaT0+IXQuX2xheWVyc1tpXS5pc0hpZGRlbihlKSkpLHRoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnY9e307Zm9yKGNvbnN0IGUgaW4gdC5zb3VyY2VDYWNoZXMpe3RoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnZbZV09e307Y29uc3QgaT10LnNvdXJjZUNhY2hlc1tlXS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKTtmb3IoY29uc3QgdCBvZiBpKXtjb25zdCBpPXRoaXMudGVycmFpbi5zb3VyY2VDYWNoZS5nZXRUZXJyYWluQ29vcmRzKHQpO2Zvcihjb25zdCB0IGluIGkpdGhpcy5fY29vcmRzRGVzY2VuZGluZ0ludltlXVt0XXx8KHRoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnZbZV1bdF09W10pLHRoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnZbZV1bdF0ucHVzaChpW3RdKTt9fXRoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnZTdHI9e307Zm9yKGNvbnN0IGUgb2YgdC5fb3JkZXIpe2NvbnN0IGk9dC5fbGF5ZXJzW2VdLGE9aS5zb3VyY2U7aWYoQXNbaS50eXBlXSYmIXRoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnZTdHJbYV0pe3RoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnZTdHJbYV09e307Zm9yKGNvbnN0IHQgaW4gdGhpcy5fY29vcmRzRGVzY2VuZGluZ0ludlthXSl0aGlzLl9jb29yZHNEZXNjZW5kaW5nSW52U3RyW2FdW3RdPXRoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnZbYV1bdF0ubWFwKCh0PT50LmtleSkpLnNvcnQoKS5qb2luKCk7fX1mb3IoY29uc3QgdCBvZiB0aGlzLl9yZW5kZXJhYmxlVGlsZXMpZm9yKGNvbnN0IGUgaW4gdGhpcy5fY29vcmRzRGVzY2VuZGluZ0ludlN0cil7Y29uc3QgaT10aGlzLl9jb29yZHNEZXNjZW5kaW5nSW52U3RyW2VdW3QudGlsZUlELmtleV07aSYmaSE9PXQucnR0Q29vcmRzW2VdJiYodC5ydHQ9W10pO319cmVuZGVyTGF5ZXIodCl7aWYodC5pc0hpZGRlbih0aGlzLnBhaW50ZXIudHJhbnNmb3JtLnpvb20pKXJldHVybiAhMTtjb25zdCBpPXQudHlwZSxhPXRoaXMucGFpbnRlcixzPXRoaXMuX3JlbmRlcmFibGVMYXllcklkc1t0aGlzLl9yZW5kZXJhYmxlTGF5ZXJJZHMubGVuZ3RoLTFdPT09dC5pZDtpZihBc1tpXSYmKHRoaXMuX3ByZXZUeXBlJiZBc1t0aGlzLl9wcmV2VHlwZV18fHRoaXMuX3N0YWNrcy5wdXNoKFtdKSx0aGlzLl9wcmV2VHlwZT1pLHRoaXMuX3N0YWNrc1t0aGlzLl9zdGFja3MubGVuZ3RoLTFdLnB1c2godC5pZCksIXMpKXJldHVybiAhMDtpZihBc1t0aGlzLl9wcmV2VHlwZV18fEFzW2ldJiZzKXt0aGlzLl9wcmV2VHlwZT1pO2NvbnN0IHQ9dGhpcy5fc3RhY2tzLmxlbmd0aC0xLHM9dGhpcy5fc3RhY2tzW3RdfHxbXTtmb3IoY29uc3QgaSBvZiB0aGlzLl9yZW5kZXJhYmxlVGlsZXMpe2lmKHRoaXMucG9vbC5pc0Z1bGwoKSYmKGZhKHRoaXMucGFpbnRlcix0aGlzLnRlcnJhaW4sdGhpcy5fcnR0VGlsZXMpLHRoaXMuX3J0dFRpbGVzPVtdLHRoaXMucG9vbC5mcmVlQWxsT2JqZWN0cygpKSx0aGlzLl9ydHRUaWxlcy5wdXNoKGkpLGkucnR0W3RdKXtjb25zdCBlPXRoaXMucG9vbC5nZXRPYmplY3RGb3JJZChpLnJ0dFt0XS5pZCk7aWYoZS5zdGFtcD09PWkucnR0W3RdLnN0YW1wKXt0aGlzLnBvb2wudXNlT2JqZWN0KGUpO2NvbnRpbnVlfX1jb25zdCBvPXRoaXMucG9vbC5nZXRPckNyZWF0ZUZyZWVPYmplY3QoKTt0aGlzLnBvb2wudXNlT2JqZWN0KG8pLHRoaXMucG9vbC5zdGFtcE9iamVjdChvKSxpLnJ0dFt0XT17aWQ6by5pZCxzdGFtcDpvLnN0YW1wfSxhLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChvLmZiby5mcmFtZWJ1ZmZlciksYS5jb250ZXh0LmNsZWFyKHtjb2xvcjplLmFNLnRyYW5zcGFyZW50LHN0ZW5jaWw6MH0pLGEuY3VycmVudFN0ZW5jaWxTb3VyY2U9dm9pZCAwO2ZvcihsZXQgdD0wO3Q8cy5sZW5ndGg7dCsrKXtjb25zdCBlPWEuc3R5bGUuX2xheWVyc1tzW3RdXSxyPWUuc291cmNlP3RoaXMuX2Nvb3Jkc0Rlc2NlbmRpbmdJbnZbZS5zb3VyY2VdW2kudGlsZUlELmtleV06W2kudGlsZUlEXTthLmNvbnRleHQudmlld3BvcnQuc2V0KFswLDAsby5mYm8ud2lkdGgsby5mYm8uaGVpZ2h0XSksYS5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MoZSxyKSxhLnJlbmRlckxheWVyKGEsYS5zdHlsZS5zb3VyY2VDYWNoZXNbZS5zb3VyY2VdLGUsciksZS5zb3VyY2UmJihpLnJ0dENvb3Jkc1tlLnNvdXJjZV09dGhpcy5fY29vcmRzRGVzY2VuZGluZ0ludlN0cltlLnNvdXJjZV1baS50aWxlSUQua2V5XSk7fX1yZXR1cm4gZmEodGhpcy5wYWludGVyLHRoaXMudGVycmFpbix0aGlzLl9ydHRUaWxlcyksdGhpcy5fcnR0VGlsZXM9W10sdGhpcy5wb29sLmZyZWVBbGxPYmplY3RzKCksQXNbaV19cmV0dXJuICExfX1jb25zdCBrcz17XCJBdHRyaWJ1dGlvbkNvbnRyb2wuVG9nZ2xlQXR0cmlidXRpb25cIjpcIlRvZ2dsZSBhdHRyaWJ1dGlvblwiLFwiQXR0cmlidXRpb25Db250cm9sLk1hcEZlZWRiYWNrXCI6XCJNYXAgZmVlZGJhY2tcIixcIkZ1bGxzY3JlZW5Db250cm9sLkVudGVyXCI6XCJFbnRlciBmdWxsc2NyZWVuXCIsXCJGdWxsc2NyZWVuQ29udHJvbC5FeGl0XCI6XCJFeGl0IGZ1bGxzY3JlZW5cIixcIkdlb2xvY2F0ZUNvbnRyb2wuRmluZE15TG9jYXRpb25cIjpcIkZpbmQgbXkgbG9jYXRpb25cIixcIkdlb2xvY2F0ZUNvbnRyb2wuTG9jYXRpb25Ob3RBdmFpbGFibGVcIjpcIkxvY2F0aW9uIG5vdCBhdmFpbGFibGVcIixcIkxvZ29Db250cm9sLlRpdGxlXCI6XCJNYXBMaWJyZSBsb2dvXCIsXCJNYXAuVGl0bGVcIjpcIk1hcFwiLFwiTWFya2VyLlRpdGxlXCI6XCJNYXAgbWFya2VyXCIsXCJOYXZpZ2F0aW9uQ29udHJvbC5SZXNldEJlYXJpbmdcIjpcIlJlc2V0IGJlYXJpbmcgdG8gbm9ydGhcIixcIk5hdmlnYXRpb25Db250cm9sLlpvb21JblwiOlwiWm9vbSBpblwiLFwiTmF2aWdhdGlvbkNvbnRyb2wuWm9vbU91dFwiOlwiWm9vbSBvdXRcIixcIlBvcHVwLkNsb3NlXCI6XCJDbG9zZSBwb3B1cFwiLFwiU2NhbGVDb250cm9sLkZlZXRcIjpcImZ0XCIsXCJTY2FsZUNvbnRyb2wuTWV0ZXJzXCI6XCJtXCIsXCJTY2FsZUNvbnRyb2wuS2lsb21ldGVyc1wiOlwia21cIixcIlNjYWxlQ29udHJvbC5NaWxlc1wiOlwibWlcIixcIlNjYWxlQ29udHJvbC5OYXV0aWNhbE1pbGVzXCI6XCJubVwiLFwiVGVycmFpbkNvbnRyb2wuRW5hYmxlXCI6XCJFbmFibGUgdGVycmFpblwiLFwiVGVycmFpbkNvbnRyb2wuRGlzYWJsZVwiOlwiRGlzYWJsZSB0ZXJyYWluXCIsXCJDb29wZXJhdGl2ZUdlc3R1cmVzSGFuZGxlci5XaW5kb3dzSGVscFRleHRcIjpcIlVzZSBDdHJsICsgc2Nyb2xsIHRvIHpvb20gdGhlIG1hcFwiLFwiQ29vcGVyYXRpdmVHZXN0dXJlc0hhbmRsZXIuTWFjSGVscFRleHRcIjpcIlVzZSDijJggKyBzY3JvbGwgdG8gem9vbSB0aGUgbWFwXCIsXCJDb29wZXJhdGl2ZUdlc3R1cmVzSGFuZGxlci5Nb2JpbGVIZWxwVGV4dFwiOlwiVXNlIHR3byBmaW5nZXJzIHRvIG1vdmUgdGhlIG1hcFwifSxMcz1pLEZzPXtoYXNoOiExLGludGVyYWN0aXZlOiEwLGJlYXJpbmdTbmFwOjcsYXR0cmlidXRpb25Db250cm9sOklzLG1hcGxpYnJlTG9nbzohMSxmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMSxyZWZyZXNoRXhwaXJlZFRpbGVzOiEwLHNjcm9sbFpvb206ITAsbWluWm9vbTotMixtYXhab29tOjIyLG1pblBpdGNoOjAsbWF4UGl0Y2g6NjAsYm94Wm9vbTohMCxkcmFnUm90YXRlOiEwLGRyYWdQYW46ITAsa2V5Ym9hcmQ6ITAsZG91YmxlQ2xpY2tab29tOiEwLHRvdWNoWm9vbVJvdGF0ZTohMCx0b3VjaFBpdGNoOiEwLGNvb3BlcmF0aXZlR2VzdHVyZXM6ITEsdHJhY2tSZXNpemU6ITAsY2VudGVyOlswLDBdLHpvb206MCxiZWFyaW5nOjAscGl0Y2g6MCxyZW5kZXJXb3JsZENvcGllczohMCxtYXhUaWxlQ2FjaGVTaXplOm51bGwsbWF4VGlsZUNhY2hlWm9vbUxldmVsczplLmEuTUFYX1RJTEVfQ0FDSEVfWk9PTV9MRVZFTFMsdHJhbnNmb3JtUmVxdWVzdDpudWxsLHRyYW5zZm9ybUNhbWVyYVVwZGF0ZTpudWxsLGZhZGVEdXJhdGlvbjozMDAsY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiEwLGNsaWNrVG9sZXJhbmNlOjMsbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5Olwic2Fucy1zZXJpZlwiLHBpdGNoV2l0aFJvdGF0ZTohMCx2YWxpZGF0ZVN0eWxlOiEwLG1heENhbnZhc1NpemU6WzQwOTYsNDA5Nl0sY2FuY2VsUGVuZGluZ1RpbGVSZXF1ZXN0c1doaWxlWm9vbWluZzohMH0sQnM9dD0+e3QudG91Y2hzdGFydD10LmRyYWdTdGFydCx0LnRvdWNobW92ZVdpbmRvdz10LmRyYWdNb3ZlLHQudG91Y2hlbmQ9dC5kcmFnRW5kO30sT3M9e3Nob3dDb21wYXNzOiEwLHNob3dab29tOiEwLHZpc3VhbGl6ZVBpdGNoOiExfTtjbGFzcyBOc3tjb25zdHJ1Y3Rvcih0LGksYT0hMSl7dGhpcy5tb3VzZWRvd249dD0+e3RoaXMuc3RhcnRNb3VzZShlLmUoe30sdCx7Y3RybEtleTohMCxwcmV2ZW50RGVmYXVsdDooKT0+dC5wcmV2ZW50RGVmYXVsdCgpfSksci5tb3VzZVBvcyh0aGlzLmVsZW1lbnQsdCkpLHIuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJtb3VzZW1vdmVcIix0aGlzLm1vdXNlbW92ZSksci5hZGRFdmVudExpc3RlbmVyKHdpbmRvdyxcIm1vdXNldXBcIix0aGlzLm1vdXNldXApO30sdGhpcy5tb3VzZW1vdmU9dD0+e3RoaXMubW92ZU1vdXNlKHQsci5tb3VzZVBvcyh0aGlzLmVsZW1lbnQsdCkpO30sdGhpcy5tb3VzZXVwPXQ9Pnt0aGlzLm1vdXNlUm90YXRlLmRyYWdFbmQodCksdGhpcy5tb3VzZVBpdGNoJiZ0aGlzLm1vdXNlUGl0Y2guZHJhZ0VuZCh0KSx0aGlzLm9mZlRlbXAoKTt9LHRoaXMudG91Y2hzdGFydD10PT57MSE9PXQudGFyZ2V0VG91Y2hlcy5sZW5ndGg/dGhpcy5yZXNldCgpOih0aGlzLl9zdGFydFBvcz10aGlzLl9sYXN0UG9zPXIudG91Y2hQb3ModGhpcy5lbGVtZW50LHQudGFyZ2V0VG91Y2hlcylbMF0sdGhpcy5zdGFydFRvdWNoKHQsdGhpcy5fc3RhcnRQb3MpLHIuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJ0b3VjaG1vdmVcIix0aGlzLnRvdWNobW92ZSx7cGFzc2l2ZTohMX0pLHIuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJ0b3VjaGVuZFwiLHRoaXMudG91Y2hlbmQpKTt9LHRoaXMudG91Y2htb3ZlPXQ9PnsxIT09dC50YXJnZXRUb3VjaGVzLmxlbmd0aD90aGlzLnJlc2V0KCk6KHRoaXMuX2xhc3RQb3M9ci50b3VjaFBvcyh0aGlzLmVsZW1lbnQsdC50YXJnZXRUb3VjaGVzKVswXSx0aGlzLm1vdmVUb3VjaCh0LHRoaXMuX2xhc3RQb3MpKTt9LHRoaXMudG91Y2hlbmQ9dD0+ezA9PT10LnRhcmdldFRvdWNoZXMubGVuZ3RoJiZ0aGlzLl9zdGFydFBvcyYmdGhpcy5fbGFzdFBvcyYmdGhpcy5fc3RhcnRQb3MuZGlzdCh0aGlzLl9sYXN0UG9zKTx0aGlzLl9jbGlja1RvbGVyYW5jZSYmdGhpcy5lbGVtZW50LmNsaWNrKCksZGVsZXRlIHRoaXMuX3N0YXJ0UG9zLGRlbGV0ZSB0aGlzLl9sYXN0UG9zLHRoaXMub2ZmVGVtcCgpO30sdGhpcy5yZXNldD0oKT0+e3RoaXMubW91c2VSb3RhdGUucmVzZXQoKSx0aGlzLm1vdXNlUGl0Y2gmJnRoaXMubW91c2VQaXRjaC5yZXNldCgpLHRoaXMudG91Y2hSb3RhdGUucmVzZXQoKSx0aGlzLnRvdWNoUGl0Y2gmJnRoaXMudG91Y2hQaXRjaC5yZXNldCgpLGRlbGV0ZSB0aGlzLl9zdGFydFBvcyxkZWxldGUgdGhpcy5fbGFzdFBvcyx0aGlzLm9mZlRlbXAoKTt9LHRoaXMuX2NsaWNrVG9sZXJhbmNlPTEwO2NvbnN0IHM9dC5kcmFnUm90YXRlLl9tb3VzZVJvdGF0ZS5nZXRDbGlja1RvbGVyYW5jZSgpLG89dC5kcmFnUm90YXRlLl9tb3VzZVBpdGNoLmdldENsaWNrVG9sZXJhbmNlKCk7dGhpcy5lbGVtZW50PWksdGhpcy5tb3VzZVJvdGF0ZT1LYSh7Y2xpY2tUb2xlcmFuY2U6cyxlbmFibGU6ITB9KSx0aGlzLnRvdWNoUm90YXRlPSgoe2VuYWJsZTp0LGNsaWNrVG9sZXJhbmNlOmUsYmVhcmluZ0RlZ3JlZXNQZXJQaXhlbE1vdmVkOmk9Ljh9KT0+e2NvbnN0IGE9bmV3ICRhO3JldHVybiBuZXcgR2Eoe2NsaWNrVG9sZXJhbmNlOmUsbW92ZToodCxlKT0+KHtiZWFyaW5nRGVsdGE6KGUueC10LngpKml9KSxtb3ZlU3RhdGVNYW5hZ2VyOmEsZW5hYmxlOnQsYXNzaWduRXZlbnRzOkJzfSl9KSh7Y2xpY2tUb2xlcmFuY2U6cyxlbmFibGU6ITB9KSx0aGlzLm1hcD10LGEmJih0aGlzLm1vdXNlUGl0Y2g9SmEoe2NsaWNrVG9sZXJhbmNlOm8sZW5hYmxlOiEwfSksdGhpcy50b3VjaFBpdGNoPSgoe2VuYWJsZTp0LGNsaWNrVG9sZXJhbmNlOmUscGl0Y2hEZWdyZWVzUGVyUGl4ZWxNb3ZlZDppPS0uNX0pPT57Y29uc3QgYT1uZXcgJGE7cmV0dXJuIG5ldyBHYSh7Y2xpY2tUb2xlcmFuY2U6ZSxtb3ZlOih0LGUpPT4oe3BpdGNoRGVsdGE6KGUueS10LnkpKml9KSxtb3ZlU3RhdGVNYW5hZ2VyOmEsZW5hYmxlOnQsYXNzaWduRXZlbnRzOkJzfSl9KSh7Y2xpY2tUb2xlcmFuY2U6byxlbmFibGU6ITB9KSksci5hZGRFdmVudExpc3RlbmVyKGksXCJtb3VzZWRvd25cIix0aGlzLm1vdXNlZG93biksci5hZGRFdmVudExpc3RlbmVyKGksXCJ0b3VjaHN0YXJ0XCIsdGhpcy50b3VjaHN0YXJ0LHtwYXNzaXZlOiExfSksci5hZGRFdmVudExpc3RlbmVyKGksXCJ0b3VjaGNhbmNlbFwiLHRoaXMucmVzZXQpO31zdGFydE1vdXNlKHQsZSl7dGhpcy5tb3VzZVJvdGF0ZS5kcmFnU3RhcnQodCxlKSx0aGlzLm1vdXNlUGl0Y2gmJnRoaXMubW91c2VQaXRjaC5kcmFnU3RhcnQodCxlKSxyLmRpc2FibGVEcmFnKCk7fXN0YXJ0VG91Y2godCxlKXt0aGlzLnRvdWNoUm90YXRlLmRyYWdTdGFydCh0LGUpLHRoaXMudG91Y2hQaXRjaCYmdGhpcy50b3VjaFBpdGNoLmRyYWdTdGFydCh0LGUpLHIuZGlzYWJsZURyYWcoKTt9bW92ZU1vdXNlKHQsZSl7Y29uc3QgaT10aGlzLm1hcCx7YmVhcmluZ0RlbHRhOmF9PXRoaXMubW91c2VSb3RhdGUuZHJhZ01vdmUodCxlKXx8e307aWYoYSYmaS5zZXRCZWFyaW5nKGkuZ2V0QmVhcmluZygpK2EpLHRoaXMubW91c2VQaXRjaCl7Y29uc3R7cGl0Y2hEZWx0YTphfT10aGlzLm1vdXNlUGl0Y2guZHJhZ01vdmUodCxlKXx8e307YSYmaS5zZXRQaXRjaChpLmdldFBpdGNoKCkrYSk7fX1tb3ZlVG91Y2godCxlKXtjb25zdCBpPXRoaXMubWFwLHtiZWFyaW5nRGVsdGE6YX09dGhpcy50b3VjaFJvdGF0ZS5kcmFnTW92ZSh0LGUpfHx7fTtpZihhJiZpLnNldEJlYXJpbmcoaS5nZXRCZWFyaW5nKCkrYSksdGhpcy50b3VjaFBpdGNoKXtjb25zdHtwaXRjaERlbHRhOmF9PXRoaXMudG91Y2hQaXRjaC5kcmFnTW92ZSh0LGUpfHx7fTthJiZpLnNldFBpdGNoKGkuZ2V0UGl0Y2goKSthKTt9fW9mZigpe2NvbnN0IHQ9dGhpcy5lbGVtZW50O3IucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LFwibW91c2Vkb3duXCIsdGhpcy5tb3VzZWRvd24pLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LFwidG91Y2hzdGFydFwiLHRoaXMudG91Y2hzdGFydCx7cGFzc2l2ZTohMX0pLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJ0b3VjaG1vdmVcIix0aGlzLnRvdWNobW92ZSx7cGFzc2l2ZTohMX0pLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJ0b3VjaGVuZFwiLHRoaXMudG91Y2hlbmQpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LFwidG91Y2hjYW5jZWxcIix0aGlzLnJlc2V0KSx0aGlzLm9mZlRlbXAoKTt9b2ZmVGVtcCgpe3IuZW5hYmxlRHJhZygpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJtb3VzZW1vdmVcIix0aGlzLm1vdXNlbW92ZSksci5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdyxcIm1vdXNldXBcIix0aGlzLm1vdXNldXApLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJ0b3VjaG1vdmVcIix0aGlzLnRvdWNobW92ZSx7cGFzc2l2ZTohMX0pLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJ0b3VjaGVuZFwiLHRoaXMudG91Y2hlbmQpO319bGV0IFVzO2Z1bmN0aW9uIGpzKHQsaSxhKXtjb25zdCBzPW5ldyBlLk4odC5sbmcsdC5sYXQpO2lmKHQ9bmV3IGUuTih0LmxuZyx0LmxhdCksaSl7Y29uc3Qgcz1uZXcgZS5OKHQubG5nLTM2MCx0LmxhdCksbz1uZXcgZS5OKHQubG5nKzM2MCx0LmxhdCkscj1hLmxvY2F0aW9uUG9pbnQodCkuZGlzdFNxcihpKTthLmxvY2F0aW9uUG9pbnQocykuZGlzdFNxcihpKTxyP3Q9czphLmxvY2F0aW9uUG9pbnQobykuZGlzdFNxcihpKTxyJiYodD1vKTt9Zm9yKDtNYXRoLmFicyh0LmxuZy1hLmNlbnRlci5sbmcpPjE4MDspe2NvbnN0IGU9YS5sb2NhdGlvblBvaW50KHQpO2lmKGUueD49MCYmZS55Pj0wJiZlLng8PWEud2lkdGgmJmUueTw9YS5oZWlnaHQpYnJlYWs7dC5sbmc+YS5jZW50ZXIubG5nP3QubG5nLT0zNjA6dC5sbmcrPTM2MDt9cmV0dXJuIHQubG5nIT09cy5sbmcmJmEubG9jYXRpb25Qb2ludCh0KS55PmEuaGVpZ2h0LzItYS5nZXRIb3Jpem9uKCk/dDpzfWNvbnN0IFpzPXtjZW50ZXI6XCJ0cmFuc2xhdGUoLTUwJSwtNTAlKVwiLHRvcDpcInRyYW5zbGF0ZSgtNTAlLDApXCIsXCJ0b3AtbGVmdFwiOlwidHJhbnNsYXRlKDAsMClcIixcInRvcC1yaWdodFwiOlwidHJhbnNsYXRlKC0xMDAlLDApXCIsYm90dG9tOlwidHJhbnNsYXRlKC01MCUsLTEwMCUpXCIsXCJib3R0b20tbGVmdFwiOlwidHJhbnNsYXRlKDAsLTEwMCUpXCIsXCJib3R0b20tcmlnaHRcIjpcInRyYW5zbGF0ZSgtMTAwJSwtMTAwJSlcIixsZWZ0OlwidHJhbnNsYXRlKDAsLTUwJSlcIixyaWdodDpcInRyYW5zbGF0ZSgtMTAwJSwtNTAlKVwifTtmdW5jdGlvbiBxcyh0LGUsaSl7Y29uc3QgYT10LmNsYXNzTGlzdDtmb3IoY29uc3QgdCBpbiBacylhLnJlbW92ZShgbWFwbGlicmVnbC0ke2l9LWFuY2hvci0ke3R9YCk7YS5hZGQoYG1hcGxpYnJlZ2wtJHtpfS1hbmNob3ItJHtlfWApO31jbGFzcyBWcyBleHRlbmRzIGUuRXtjb25zdHJ1Y3Rvcih0KXtpZihzdXBlcigpLHRoaXMuX29uS2V5UHJlc3M9dD0+e2NvbnN0IGU9dC5jb2RlLGk9dC5jaGFyQ29kZXx8dC5rZXlDb2RlO1wiU3BhY2VcIiE9PWUmJlwiRW50ZXJcIiE9PWUmJjMyIT09aSYmMTMhPT1pfHx0aGlzLnRvZ2dsZVBvcHVwKCk7fSx0aGlzLl9vbk1hcENsaWNrPXQ9Pntjb25zdCBlPXQub3JpZ2luYWxFdmVudC50YXJnZXQsaT10aGlzLl9lbGVtZW50O3RoaXMuX3BvcHVwJiYoZT09PWl8fGkuY29udGFpbnMoZSkpJiZ0aGlzLnRvZ2dsZVBvcHVwKCk7fSx0aGlzLl91cGRhdGU9dD0+e3ZhciBlO2lmKCF0aGlzLl9tYXApcmV0dXJuO2NvbnN0IGk9dGhpcy5fbWFwLmxvYWRlZCgpJiYhdGhpcy5fbWFwLmlzTW92aW5nKCk7KFwidGVycmFpblwiPT09KG51bGw9PXQ/dm9pZCAwOnQudHlwZSl8fFwicmVuZGVyXCI9PT0obnVsbD09dD92b2lkIDA6dC50eXBlKSYmIWkpJiZ0aGlzLl9tYXAub25jZShcInJlbmRlclwiLHRoaXMuX3VwZGF0ZSksdGhpcy5fbG5nTGF0PXRoaXMuX21hcC50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXM/anModGhpcy5fbG5nTGF0LHRoaXMuX2ZsYXRQb3MsdGhpcy5fbWFwLnRyYW5zZm9ybSk6bnVsbD09PShlPXRoaXMuX2xuZ0xhdCl8fHZvaWQgMD09PWU/dm9pZCAwOmUud3JhcCgpLHRoaXMuX2ZsYXRQb3M9dGhpcy5fcG9zPXRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCkuX2FkZCh0aGlzLl9vZmZzZXQpLHRoaXMuX21hcC50ZXJyYWluJiYodGhpcy5fZmxhdFBvcz10aGlzLl9tYXAudHJhbnNmb3JtLmxvY2F0aW9uUG9pbnQodGhpcy5fbG5nTGF0KS5fYWRkKHRoaXMuX29mZnNldCkpO2xldCBhPVwiXCI7XCJ2aWV3cG9ydFwiPT09dGhpcy5fcm90YXRpb25BbGlnbm1lbnR8fFwiYXV0b1wiPT09dGhpcy5fcm90YXRpb25BbGlnbm1lbnQ/YT1gcm90YXRlWigke3RoaXMuX3JvdGF0aW9ufWRlZylgOlwibWFwXCI9PT10aGlzLl9yb3RhdGlvbkFsaWdubWVudCYmKGE9YHJvdGF0ZVooJHt0aGlzLl9yb3RhdGlvbi10aGlzLl9tYXAuZ2V0QmVhcmluZygpfWRlZylgKTtsZXQgcz1cIlwiO1widmlld3BvcnRcIj09PXRoaXMuX3BpdGNoQWxpZ25tZW50fHxcImF1dG9cIj09PXRoaXMuX3BpdGNoQWxpZ25tZW50P3M9XCJyb3RhdGVYKDBkZWcpXCI6XCJtYXBcIj09PXRoaXMuX3BpdGNoQWxpZ25tZW50JiYocz1gcm90YXRlWCgke3RoaXMuX21hcC5nZXRQaXRjaCgpfWRlZylgKSx0aGlzLl9zdWJwaXhlbFBvc2l0aW9uaW5nfHx0JiZcIm1vdmVlbmRcIiE9PXQudHlwZXx8KHRoaXMuX3Bvcz10aGlzLl9wb3Mucm91bmQoKSksci5zZXRUcmFuc2Zvcm0odGhpcy5fZWxlbWVudCxgJHtac1t0aGlzLl9hbmNob3JdfSB0cmFuc2xhdGUoJHt0aGlzLl9wb3MueH1weCwgJHt0aGlzLl9wb3MueX1weCkgJHtzfSAke2F9YCksby5mcmFtZUFzeW5jKG5ldyBBYm9ydENvbnRyb2xsZXIpLnRoZW4oKCgpPT57dGhpcy5fdXBkYXRlT3BhY2l0eSh0JiZcIm1vdmVlbmRcIj09PXQudHlwZSk7fSkpLmNhdGNoKCgoKT0+e30pKTt9LHRoaXMuX29uTW92ZT10PT57aWYoIXRoaXMuX2lzRHJhZ2dpbmcpe2NvbnN0IGU9dGhpcy5fY2xpY2tUb2xlcmFuY2V8fHRoaXMuX21hcC5fY2xpY2tUb2xlcmFuY2U7dGhpcy5faXNEcmFnZ2luZz10LnBvaW50LmRpc3QodGhpcy5fcG9pbnRlcmRvd25Qb3MpPj1lO310aGlzLl9pc0RyYWdnaW5nJiYodGhpcy5fcG9zPXQucG9pbnQuc3ViKHRoaXMuX3Bvc2l0aW9uRGVsdGEpLHRoaXMuX2xuZ0xhdD10aGlzLl9tYXAudW5wcm9qZWN0KHRoaXMuX3BvcyksdGhpcy5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KSx0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHM9XCJub25lXCIsXCJwZW5kaW5nXCI9PT10aGlzLl9zdGF0ZSYmKHRoaXMuX3N0YXRlPVwiYWN0aXZlXCIsdGhpcy5maXJlKG5ldyBlLmsoXCJkcmFnc3RhcnRcIikpKSx0aGlzLmZpcmUobmV3IGUuayhcImRyYWdcIikpKTt9LHRoaXMuX29uVXA9KCk9Pnt0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHM9XCJhdXRvXCIsdGhpcy5fcG9zaXRpb25EZWx0YT1udWxsLHRoaXMuX3BvaW50ZXJkb3duUG9zPW51bGwsdGhpcy5faXNEcmFnZ2luZz0hMSx0aGlzLl9tYXAub2ZmKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3ZlKSx0aGlzLl9tYXAub2ZmKFwidG91Y2htb3ZlXCIsdGhpcy5fb25Nb3ZlKSxcImFjdGl2ZVwiPT09dGhpcy5fc3RhdGUmJnRoaXMuZmlyZShuZXcgZS5rKFwiZHJhZ2VuZFwiKSksdGhpcy5fc3RhdGU9XCJpbmFjdGl2ZVwiO30sdGhpcy5fYWRkRHJhZ0hhbmRsZXI9dD0+e3RoaXMuX2VsZW1lbnQuY29udGFpbnModC5vcmlnaW5hbEV2ZW50LnRhcmdldCkmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fcG9zaXRpb25EZWx0YT10LnBvaW50LnN1Yih0aGlzLl9wb3MpLmFkZCh0aGlzLl9vZmZzZXQpLHRoaXMuX3BvaW50ZXJkb3duUG9zPXQucG9pbnQsdGhpcy5fc3RhdGU9XCJwZW5kaW5nXCIsdGhpcy5fbWFwLm9uKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3ZlKSx0aGlzLl9tYXAub24oXCJ0b3VjaG1vdmVcIix0aGlzLl9vbk1vdmUpLHRoaXMuX21hcC5vbmNlKFwibW91c2V1cFwiLHRoaXMuX29uVXApLHRoaXMuX21hcC5vbmNlKFwidG91Y2hlbmRcIix0aGlzLl9vblVwKSk7fSx0aGlzLl9hbmNob3I9dCYmdC5hbmNob3J8fFwiY2VudGVyXCIsdGhpcy5fY29sb3I9dCYmdC5jb2xvcnx8XCIjM0ZCMUNFXCIsdGhpcy5fc2NhbGU9dCYmdC5zY2FsZXx8MSx0aGlzLl9kcmFnZ2FibGU9dCYmdC5kcmFnZ2FibGV8fCExLHRoaXMuX2NsaWNrVG9sZXJhbmNlPXQmJnQuY2xpY2tUb2xlcmFuY2V8fDAsdGhpcy5fc3VicGl4ZWxQb3NpdGlvbmluZz10JiZ0LnN1YnBpeGVsUG9zaXRpb25pbmd8fCExLHRoaXMuX2lzRHJhZ2dpbmc9ITEsdGhpcy5fc3RhdGU9XCJpbmFjdGl2ZVwiLHRoaXMuX3JvdGF0aW9uPXQmJnQucm90YXRpb258fDAsdGhpcy5fcm90YXRpb25BbGlnbm1lbnQ9dCYmdC5yb3RhdGlvbkFsaWdubWVudHx8XCJhdXRvXCIsdGhpcy5fcGl0Y2hBbGlnbm1lbnQ9dCYmdC5waXRjaEFsaWdubWVudCYmXCJhdXRvXCIhPT10LnBpdGNoQWxpZ25tZW50P3QucGl0Y2hBbGlnbm1lbnQ6dGhpcy5fcm90YXRpb25BbGlnbm1lbnQsdGhpcy5zZXRPcGFjaXR5KCksdGhpcy5zZXRPcGFjaXR5KG51bGw9PXQ/dm9pZCAwOnQub3BhY2l0eSxudWxsPT10P3ZvaWQgMDp0Lm9wYWNpdHlXaGVuQ292ZXJlZCksdCYmdC5lbGVtZW50KXRoaXMuX2VsZW1lbnQ9dC5lbGVtZW50LHRoaXMuX29mZnNldD1lLlAuY29udmVydCh0JiZ0Lm9mZnNldHx8WzAsMF0pO2Vsc2Uge3RoaXMuX2RlZmF1bHRNYXJrZXI9ITAsdGhpcy5fZWxlbWVudD1yLmNyZWF0ZShcImRpdlwiKTtjb25zdCBpPXIuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFwic3ZnXCIpLGE9NDEscz0yNztpLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJkaXNwbGF5XCIsXCJibG9ja1wiKSxpLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJoZWlnaHRcIixgJHthfXB4YCksaS5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixgJHtzfXB4YCksaS5zZXRBdHRyaWJ1dGVOUyhudWxsLFwidmlld0JveFwiLGAwIDAgJHtzfSAke2F9YCk7Y29uc3Qgbz1yLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImdcIik7by5zZXRBdHRyaWJ1dGVOUyhudWxsLFwic3Ryb2tlXCIsXCJub25lXCIpLG8uc2V0QXR0cmlidXRlTlMobnVsbCxcInN0cm9rZS13aWR0aFwiLFwiMVwiKSxvLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJmaWxsXCIsXCJub25lXCIpLG8uc2V0QXR0cmlidXRlTlMobnVsbCxcImZpbGwtcnVsZVwiLFwiZXZlbm9kZFwiKTtjb25zdCBuPXIuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFwiZ1wiKTtuLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJmaWxsLXJ1bGVcIixcIm5vbnplcm9cIik7Y29uc3QgbD1yLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImdcIik7bC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwidHJhbnNmb3JtXCIsXCJ0cmFuc2xhdGUoMy4wLCAyOS4wKVwiKSxsLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJmaWxsXCIsXCIjMDAwMDAwXCIpO2NvbnN0IGg9W3tyeDpcIjEwLjVcIixyeTpcIjUuMjUwMDIyNzNcIn0se3J4OlwiMTAuNVwiLHJ5OlwiNS4yNTAwMjI3M1wifSx7cng6XCI5LjVcIixyeTpcIjQuNzcyNzUwMDdcIn0se3J4OlwiOC41XCIscnk6XCI0LjI5NTQ5OTM2XCJ9LHtyeDpcIjcuNVwiLHJ5OlwiMy44MTgyMjMwOFwifSx7cng6XCI2LjVcIixyeTpcIjMuMzQwOTQ2NzlcIn0se3J4OlwiNS41XCIscnk6XCIyLjg2MzY3MDUxXCJ9LHtyeDpcIjQuNVwiLHJ5OlwiMi4zODYzNjg2NFwifV07Zm9yKGNvbnN0IHQgb2YgaCl7Y29uc3QgZT1yLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImVsbGlwc2VcIik7ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLFwib3BhY2l0eVwiLFwiMC4wNFwiKSxlLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjeFwiLFwiMTAuNVwiKSxlLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjeVwiLFwiNS44MDAyOTAwOFwiKSxlLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJyeFwiLHQucngpLGUuc2V0QXR0cmlidXRlTlMobnVsbCxcInJ5XCIsdC5yeSksbC5hcHBlbmRDaGlsZChlKTt9Y29uc3QgYz1yLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImdcIik7Yy5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiZmlsbFwiLHRoaXMuX2NvbG9yKTtjb25zdCB1PXIuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFwicGF0aFwiKTt1LnNldEF0dHJpYnV0ZU5TKG51bGwsXCJkXCIsXCJNMjcsMTMuNSBDMjcsMTkuMDc0NjQ0IDIwLjI1MDAwMSwyNy4wMDAwMDIgMTQuNzUsMzQuNTAwMDAyIEMxNC4wMTY2NjUsMzUuNTAwMDA0IDEyLjk4MzMzNSwzNS41MDAwMDQgMTIuMjUsMzQuNTAwMDAyIEM2Ljc0OTk5OTMsMjcuMDAwMDAyIDAsMTkuMjIyNTYyIDAsMTMuNSBDMCw2LjA0NDE1NTkgNi4wNDQxNTU5LDAgMTMuNSwwIEMyMC45NTU4NDQsMCAyNyw2LjA0NDE1NTkgMjcsMTMuNSBaXCIpLGMuYXBwZW5kQ2hpbGQodSk7Y29uc3QgZD1yLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImdcIik7ZC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwib3BhY2l0eVwiLFwiMC4yNVwiKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJmaWxsXCIsXCIjMDAwMDAwXCIpO2NvbnN0IF89ci5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJwYXRoXCIpO18uc2V0QXR0cmlidXRlTlMobnVsbCxcImRcIixcIk0xMy41LDAgQzYuMDQ0MTU1OSwwIDAsNi4wNDQxNTU5IDAsMTMuNSBDMCwxOS4yMjI1NjIgNi43NDk5OTkzLDI3IDEyLjI1LDM0LjUgQzEzLDM1LjUyMjcyNyAxNC4wMTY2NjQsMzUuNTAwMDA0IDE0Ljc1LDM0LjUgQzIwLjI1MDAwMSwyNyAyNywxOS4wNzQ2NDQgMjcsMTMuNSBDMjcsNi4wNDQxNTU5IDIwLjk1NTg0NCwwIDEzLjUsMCBaIE0xMy41LDEgQzIwLjQxNTQwNCwxIDI2LDYuNTg0NTk2IDI2LDEzLjUgQzI2LDE1Ljg5ODY1NyAyNC40OTU1ODQsMTkuMTgxNDMxIDIyLjIyMDcwMywyMi43MzgyODEgQzE5Ljk0NTgyMywyNi4yOTUxMzIgMTYuNzA1MTE5LDMwLjE0MjE2NyAxMy45NDMzNTksMzMuOTA4MjAzIEMxMy43NDM0NDUsMzQuMTgwODE0IDEzLjYxMjcxNSwzNC4zMjI3MzggMTMuNSwzNC40NDE0MDYgQzEzLjM4NzI4NSwzNC4zMjI3MzggMTMuMjU2NTU1LDM0LjE4MDgxNCAxMy4wNTY2NDEsMzMuOTA4MjAzIEMxMC4yODQ0ODEsMzAuMTI3OTg1IDcuNDE0ODY4NCwyNi4zMTQxNTkgNS4wMTU2MjUsMjIuNzczNDM4IEMyLjYxNjM4MTYsMTkuMjMyNzE1IDEsMTUuOTUzNTM4IDEsMTMuNSBDMSw2LjU4NDU5NiA2LjU4NDU5NiwxIDEzLjUsMSBaXCIpLGQuYXBwZW5kQ2hpbGQoXyk7Y29uc3QgcD1yLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImdcIik7cC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwidHJhbnNmb3JtXCIsXCJ0cmFuc2xhdGUoNi4wLCA3LjApXCIpLHAuc2V0QXR0cmlidXRlTlMobnVsbCxcImZpbGxcIixcIiNGRkZGRkZcIik7Y29uc3QgbT1yLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImdcIik7bS5zZXRBdHRyaWJ1dGVOUyhudWxsLFwidHJhbnNmb3JtXCIsXCJ0cmFuc2xhdGUoOC4wLCA4LjApXCIpO2NvbnN0IGY9ci5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJjaXJjbGVcIik7Zi5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiZmlsbFwiLFwiIzAwMDAwMFwiKSxmLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJvcGFjaXR5XCIsXCIwLjI1XCIpLGYuc2V0QXR0cmlidXRlTlMobnVsbCxcImN4XCIsXCI1LjVcIiksZi5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiY3lcIixcIjUuNVwiKSxmLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJyXCIsXCI1LjQ5OTk5NjJcIik7Y29uc3QgZz1yLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcImNpcmNsZVwiKTtnLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJmaWxsXCIsXCIjRkZGRkZGXCIpLGcuc2V0QXR0cmlidXRlTlMobnVsbCxcImN4XCIsXCI1LjVcIiksZy5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiY3lcIixcIjUuNVwiKSxnLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJyXCIsXCI1LjQ5OTk5NjJcIiksbS5hcHBlbmRDaGlsZChmKSxtLmFwcGVuZENoaWxkKGcpLG4uYXBwZW5kQ2hpbGQobCksbi5hcHBlbmRDaGlsZChjKSxuLmFwcGVuZENoaWxkKGQpLG4uYXBwZW5kQ2hpbGQocCksbi5hcHBlbmRDaGlsZChtKSxpLmFwcGVuZENoaWxkKG4pLGkuc2V0QXR0cmlidXRlTlMobnVsbCxcImhlaWdodFwiLGEqdGhpcy5fc2NhbGUrXCJweFwiKSxpLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ3aWR0aFwiLHMqdGhpcy5fc2NhbGUrXCJweFwiKSx0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGkpLHRoaXMuX29mZnNldD1lLlAuY29udmVydCh0JiZ0Lm9mZnNldHx8WzAsLTE0XSk7fWlmKHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtbWFya2VyXCIpLHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdzdGFydFwiLCh0PT57dC5wcmV2ZW50RGVmYXVsdCgpO30pKSx0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwodD0+e3QucHJldmVudERlZmF1bHQoKTt9KSkscXModGhpcy5fZWxlbWVudCx0aGlzLl9hbmNob3IsXCJtYXJrZXJcIiksdCYmdC5jbGFzc05hbWUpZm9yKGNvbnN0IGUgb2YgdC5jbGFzc05hbWUuc3BsaXQoXCIgXCIpKXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChlKTt0aGlzLl9wb3B1cD1udWxsO31hZGRUbyh0KXtyZXR1cm4gdGhpcy5yZW1vdmUoKSx0aGlzLl9tYXA9dCx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIix0Ll9nZXRVSVN0cmluZyhcIk1hcmtlci5UaXRsZVwiKSksdC5nZXRDYW52YXNDb250YWluZXIoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KSx0Lm9uKFwibW92ZVwiLHRoaXMuX3VwZGF0ZSksdC5vbihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGUpLHQub24oXCJ0ZXJyYWluXCIsdGhpcy5fdXBkYXRlKSx0aGlzLnNldERyYWdnYWJsZSh0aGlzLl9kcmFnZ2FibGUpLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX21hcC5vbihcImNsaWNrXCIsdGhpcy5fb25NYXBDbGljayksdGhpc31yZW1vdmUoKXtyZXR1cm4gdGhpcy5fb3BhY2l0eVRpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fb3BhY2l0eVRpbWVvdXQpLGRlbGV0ZSB0aGlzLl9vcGFjaXR5VGltZW91dCksdGhpcy5fbWFwJiYodGhpcy5fbWFwLm9mZihcImNsaWNrXCIsdGhpcy5fb25NYXBDbGljayksdGhpcy5fbWFwLm9mZihcIm1vdmVcIix0aGlzLl91cGRhdGUpLHRoaXMuX21hcC5vZmYoXCJtb3ZlZW5kXCIsdGhpcy5fdXBkYXRlKSx0aGlzLl9tYXAub2ZmKFwidGVycmFpblwiLHRoaXMuX3VwZGF0ZSksdGhpcy5fbWFwLm9mZihcIm1vdXNlZG93blwiLHRoaXMuX2FkZERyYWdIYW5kbGVyKSx0aGlzLl9tYXAub2ZmKFwidG91Y2hzdGFydFwiLHRoaXMuX2FkZERyYWdIYW5kbGVyKSx0aGlzLl9tYXAub2ZmKFwibW91c2V1cFwiLHRoaXMuX29uVXApLHRoaXMuX21hcC5vZmYoXCJ0b3VjaGVuZFwiLHRoaXMuX29uVXApLHRoaXMuX21hcC5vZmYoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdmUpLHRoaXMuX21hcC5vZmYoXCJ0b3VjaG1vdmVcIix0aGlzLl9vbk1vdmUpLGRlbGV0ZSB0aGlzLl9tYXApLHIucmVtb3ZlKHRoaXMuX2VsZW1lbnQpLHRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5yZW1vdmUoKSx0aGlzfWdldExuZ0xhdCgpe3JldHVybiB0aGlzLl9sbmdMYXR9c2V0TG5nTGF0KHQpe3JldHVybiB0aGlzLl9sbmdMYXQ9ZS5OLmNvbnZlcnQodCksdGhpcy5fcG9zPW51bGwsdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLnNldExuZ0xhdCh0aGlzLl9sbmdMYXQpLHRoaXMuX3VwZGF0ZSgpLHRoaXN9Z2V0RWxlbWVudCgpe3JldHVybiB0aGlzLl9lbGVtZW50fXNldFBvcHVwKHQpe2lmKHRoaXMuX3BvcHVwJiYodGhpcy5fcG9wdXAucmVtb3ZlKCksdGhpcy5fcG9wdXA9bnVsbCx0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLHRoaXMuX29uS2V5UHJlc3MpLHRoaXMuX29yaWdpbmFsVGFiSW5kZXh8fHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidGFiaW5kZXhcIikpLHQpe2lmKCEoXCJvZmZzZXRcImluIHQub3B0aW9ucykpe2NvbnN0IGU9MzguMSxpPTEzLjUsYT1NYXRoLmFicyhpKS9NYXRoLlNRUlQyO3Qub3B0aW9ucy5vZmZzZXQ9dGhpcy5fZGVmYXVsdE1hcmtlcj97dG9wOlswLDBdLFwidG9wLWxlZnRcIjpbMCwwXSxcInRvcC1yaWdodFwiOlswLDBdLGJvdHRvbTpbMCwtZV0sXCJib3R0b20tbGVmdFwiOlthLC0xKihlLWkrYSldLFwiYm90dG9tLXJpZ2h0XCI6Wy1hLC0xKihlLWkrYSldLGxlZnQ6W2ksLTEqKGUtaSldLHJpZ2h0OlstaSwtMSooZS1pKV19OnRoaXMuX29mZnNldDt9dGhpcy5fcG9wdXA9dCx0aGlzLl9vcmlnaW5hbFRhYkluZGV4PXRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiksdGhpcy5fb3JpZ2luYWxUYWJJbmRleHx8dGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLFwiMFwiKSx0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLHRoaXMuX29uS2V5UHJlc3MpO31yZXR1cm4gdGhpc31zZXRTdWJwaXhlbFBvc2l0aW9uaW5nKHQpe3JldHVybiB0aGlzLl9zdWJwaXhlbFBvc2l0aW9uaW5nPXQsdGhpc31nZXRQb3B1cCgpe3JldHVybiB0aGlzLl9wb3B1cH10b2dnbGVQb3B1cCgpe2NvbnN0IHQ9dGhpcy5fcG9wdXA7cmV0dXJuIHRoaXMuX2VsZW1lbnQuc3R5bGUub3BhY2l0eT09PXRoaXMuX29wYWNpdHlXaGVuQ292ZXJlZD90aGlzOnQ/KHQuaXNPcGVuKCk/dC5yZW1vdmUoKToodC5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KSx0LmFkZFRvKHRoaXMuX21hcCkpLHRoaXMpOnRoaXN9X3VwZGF0ZU9wYWNpdHkodD0hMSl7dmFyIGksYTtpZighKG51bGw9PT0oaT10aGlzLl9tYXApfHx2b2lkIDA9PT1pP3ZvaWQgMDppLnRlcnJhaW4pKXJldHVybiB2b2lkKHRoaXMuX2VsZW1lbnQuc3R5bGUub3BhY2l0eSE9PXRoaXMuX29wYWNpdHkmJih0aGlzLl9lbGVtZW50LnN0eWxlLm9wYWNpdHk9dGhpcy5fb3BhY2l0eSkpO2lmKHQpdGhpcy5fb3BhY2l0eVRpbWVvdXQ9bnVsbDtlbHNlIHtpZih0aGlzLl9vcGFjaXR5VGltZW91dClyZXR1cm47dGhpcy5fb3BhY2l0eVRpbWVvdXQ9c2V0VGltZW91dCgoKCk9Pnt0aGlzLl9vcGFjaXR5VGltZW91dD1udWxsO30pLDEwMCk7fWNvbnN0IHM9dGhpcy5fbWFwLG89cy50ZXJyYWluLmRlcHRoQXRQb2ludCh0aGlzLl9wb3MpLHI9cy50ZXJyYWluLmdldEVsZXZhdGlvbkZvckxuZ0xhdFpvb20odGhpcy5fbG5nTGF0LHMudHJhbnNmb3JtLnRpbGVab29tKTtpZihzLnRyYW5zZm9ybS5sbmdMYXRUb0NhbWVyYURlcHRoKHRoaXMuX2xuZ0xhdCxyKS1vPC4wMDYpcmV0dXJuIHZvaWQodGhpcy5fZWxlbWVudC5zdHlsZS5vcGFjaXR5PXRoaXMuX29wYWNpdHkpO2NvbnN0IG49LXRoaXMuX29mZnNldC55L3MudHJhbnNmb3JtLl9waXhlbFBlck1ldGVyLGw9TWF0aC5zaW4ocy5nZXRQaXRjaCgpKk1hdGguUEkvMTgwKSpuLGg9cy50ZXJyYWluLmRlcHRoQXRQb2ludChuZXcgZS5QKHRoaXMuX3Bvcy54LHRoaXMuX3Bvcy55LXRoaXMuX29mZnNldC55KSksYz1zLnRyYW5zZm9ybS5sbmdMYXRUb0NhbWVyYURlcHRoKHRoaXMuX2xuZ0xhdCxyK2wpLWg+LjAwNjsobnVsbD09PShhPXRoaXMuX3BvcHVwKXx8dm9pZCAwPT09YT92b2lkIDA6YS5pc09wZW4oKSkmJmMmJnRoaXMuX3BvcHVwLnJlbW92ZSgpLHRoaXMuX2VsZW1lbnQuc3R5bGUub3BhY2l0eT1jP3RoaXMuX29wYWNpdHlXaGVuQ292ZXJlZDp0aGlzLl9vcGFjaXR5O31nZXRPZmZzZXQoKXtyZXR1cm4gdGhpcy5fb2Zmc2V0fXNldE9mZnNldCh0KXtyZXR1cm4gdGhpcy5fb2Zmc2V0PWUuUC5jb252ZXJ0KHQpLHRoaXMuX3VwZGF0ZSgpLHRoaXN9YWRkQ2xhc3NOYW1lKHQpe3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCh0KTt9cmVtb3ZlQ2xhc3NOYW1lKHQpe3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0KTt9dG9nZ2xlQ2xhc3NOYW1lKHQpe3JldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUodCl9c2V0RHJhZ2dhYmxlKHQpe3JldHVybiB0aGlzLl9kcmFnZ2FibGU9ISF0LHRoaXMuX21hcCYmKHQ/KHRoaXMuX21hcC5vbihcIm1vdXNlZG93blwiLHRoaXMuX2FkZERyYWdIYW5kbGVyKSx0aGlzLl9tYXAub24oXCJ0b3VjaHN0YXJ0XCIsdGhpcy5fYWRkRHJhZ0hhbmRsZXIpKToodGhpcy5fbWFwLm9mZihcIm1vdXNlZG93blwiLHRoaXMuX2FkZERyYWdIYW5kbGVyKSx0aGlzLl9tYXAub2ZmKFwidG91Y2hzdGFydFwiLHRoaXMuX2FkZERyYWdIYW5kbGVyKSkpLHRoaXN9aXNEcmFnZ2FibGUoKXtyZXR1cm4gdGhpcy5fZHJhZ2dhYmxlfXNldFJvdGF0aW9uKHQpe3JldHVybiB0aGlzLl9yb3RhdGlvbj10fHwwLHRoaXMuX3VwZGF0ZSgpLHRoaXN9Z2V0Um90YXRpb24oKXtyZXR1cm4gdGhpcy5fcm90YXRpb259c2V0Um90YXRpb25BbGlnbm1lbnQodCl7cmV0dXJuIHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50PXR8fFwiYXV0b1wiLHRoaXMuX3VwZGF0ZSgpLHRoaXN9Z2V0Um90YXRpb25BbGlnbm1lbnQoKXtyZXR1cm4gdGhpcy5fcm90YXRpb25BbGlnbm1lbnR9c2V0UGl0Y2hBbGlnbm1lbnQodCl7cmV0dXJuIHRoaXMuX3BpdGNoQWxpZ25tZW50PXQmJlwiYXV0b1wiIT09dD90OnRoaXMuX3JvdGF0aW9uQWxpZ25tZW50LHRoaXMuX3VwZGF0ZSgpLHRoaXN9Z2V0UGl0Y2hBbGlnbm1lbnQoKXtyZXR1cm4gdGhpcy5fcGl0Y2hBbGlnbm1lbnR9c2V0T3BhY2l0eSh0LGUpe3JldHVybiB2b2lkIDA9PT10JiZ2b2lkIDA9PT1lJiYodGhpcy5fb3BhY2l0eT1cIjFcIix0aGlzLl9vcGFjaXR5V2hlbkNvdmVyZWQ9XCIwLjJcIiksdm9pZCAwIT09dCYmKHRoaXMuX29wYWNpdHk9dCksdm9pZCAwIT09ZSYmKHRoaXMuX29wYWNpdHlXaGVuQ292ZXJlZD1lKSx0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoITApLHRoaXN9fWNvbnN0IEdzPXtwb3NpdGlvbk9wdGlvbnM6e2VuYWJsZUhpZ2hBY2N1cmFjeTohMSxtYXhpbXVtQWdlOjAsdGltZW91dDo2ZTN9LGZpdEJvdW5kc09wdGlvbnM6e21heFpvb206MTV9LHRyYWNrVXNlckxvY2F0aW9uOiExLHNob3dBY2N1cmFjeUNpcmNsZTohMCxzaG93VXNlckxvY2F0aW9uOiEwfTtsZXQgSHM9MCxXcz0hMTtjb25zdCAkcz17bWF4V2lkdGg6MTAwLHVuaXQ6XCJtZXRyaWNcIn07ZnVuY3Rpb24gWHModCxlLGkpe2NvbnN0IGE9aSYmaS5tYXhXaWR0aHx8MTAwLHM9dC5fY29udGFpbmVyLmNsaWVudEhlaWdodC8yLG89dC51bnByb2plY3QoWzAsc10pLHI9dC51bnByb2plY3QoW2Esc10pLG49by5kaXN0YW5jZVRvKHIpO2lmKGkmJlwiaW1wZXJpYWxcIj09PWkudW5pdCl7Y29uc3QgaT0zLjI4MDgqbjtpPjUyODA/S3MoZSxhLGkvNTI4MCx0Ll9nZXRVSVN0cmluZyhcIlNjYWxlQ29udHJvbC5NaWxlc1wiKSk6S3MoZSxhLGksdC5fZ2V0VUlTdHJpbmcoXCJTY2FsZUNvbnRyb2wuRmVldFwiKSk7fWVsc2UgaSYmXCJuYXV0aWNhbFwiPT09aS51bml0P0tzKGUsYSxuLzE4NTIsdC5fZ2V0VUlTdHJpbmcoXCJTY2FsZUNvbnRyb2wuTmF1dGljYWxNaWxlc1wiKSk6bj49MWUzP0tzKGUsYSxuLzFlMyx0Ll9nZXRVSVN0cmluZyhcIlNjYWxlQ29udHJvbC5LaWxvbWV0ZXJzXCIpKTpLcyhlLGEsbix0Ll9nZXRVSVN0cmluZyhcIlNjYWxlQ29udHJvbC5NZXRlcnNcIikpO31mdW5jdGlvbiBLcyh0LGUsaSxhKXtjb25zdCBzPWZ1bmN0aW9uKHQpe2NvbnN0IGU9TWF0aC5wb3coMTAsYCR7TWF0aC5mbG9vcih0KX1gLmxlbmd0aC0xKTtsZXQgaT10L2U7cmV0dXJuIGk9aT49MTA/MTA6aT49NT81Omk+PTM/MzppPj0yPzI6aT49MT8xOmZ1bmN0aW9uKHQpe2NvbnN0IGU9TWF0aC5wb3coMTAsTWF0aC5jZWlsKC1NYXRoLmxvZyh0KS9NYXRoLkxOMTApKTtyZXR1cm4gTWF0aC5yb3VuZCh0KmUpL2V9KGkpLGUqaX0oaSk7dC5zdHlsZS53aWR0aD1lKihzL2kpK1wicHhcIix0LmlubmVySFRNTD1gJHtzfSZuYnNwOyR7YX1gO31jb25zdCBKcz17Y2xvc2VCdXR0b246ITAsY2xvc2VPbkNsaWNrOiEwLGZvY3VzQWZ0ZXJPcGVuOiEwLGNsYXNzTmFtZTpcIlwiLG1heFdpZHRoOlwiMjQwcHhcIixzdWJwaXhlbFBvc2l0aW9uaW5nOiExfSxZcz1bXCJhW2hyZWZdXCIsXCJbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Jy0xJ10pXCIsXCJbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT0nZmFsc2UnXSlcIixcImJ1dHRvbjpub3QoW2Rpc2FibGVkXSlcIixcImlucHV0Om5vdChbZGlzYWJsZWRdKVwiLFwic2VsZWN0Om5vdChbZGlzYWJsZWRdKVwiLFwidGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pXCJdLmpvaW4oXCIsIFwiKTtmdW5jdGlvbiBRcyh0KXtpZih0KXtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7Y29uc3QgaT1NYXRoLnJvdW5kKE1hdGguYWJzKHQpL01hdGguU1FSVDIpO3JldHVybiB7Y2VudGVyOm5ldyBlLlAoMCwwKSx0b3A6bmV3IGUuUCgwLHQpLFwidG9wLWxlZnRcIjpuZXcgZS5QKGksaSksXCJ0b3AtcmlnaHRcIjpuZXcgZS5QKC1pLGkpLGJvdHRvbTpuZXcgZS5QKDAsLXQpLFwiYm90dG9tLWxlZnRcIjpuZXcgZS5QKGksLWkpLFwiYm90dG9tLXJpZ2h0XCI6bmV3IGUuUCgtaSwtaSksbGVmdDpuZXcgZS5QKHQsMCkscmlnaHQ6bmV3IGUuUCgtdCwwKX19aWYodCBpbnN0YW5jZW9mIGUuUHx8QXJyYXkuaXNBcnJheSh0KSl7Y29uc3QgaT1lLlAuY29udmVydCh0KTtyZXR1cm4ge2NlbnRlcjppLHRvcDppLFwidG9wLWxlZnRcIjppLFwidG9wLXJpZ2h0XCI6aSxib3R0b206aSxcImJvdHRvbS1sZWZ0XCI6aSxcImJvdHRvbS1yaWdodFwiOmksbGVmdDppLHJpZ2h0Oml9fXJldHVybiB7Y2VudGVyOmUuUC5jb252ZXJ0KHQuY2VudGVyfHxbMCwwXSksdG9wOmUuUC5jb252ZXJ0KHQudG9wfHxbMCwwXSksXCJ0b3AtbGVmdFwiOmUuUC5jb252ZXJ0KHRbXCJ0b3AtbGVmdFwiXXx8WzAsMF0pLFwidG9wLXJpZ2h0XCI6ZS5QLmNvbnZlcnQodFtcInRvcC1yaWdodFwiXXx8WzAsMF0pLGJvdHRvbTplLlAuY29udmVydCh0LmJvdHRvbXx8WzAsMF0pLFwiYm90dG9tLWxlZnRcIjplLlAuY29udmVydCh0W1wiYm90dG9tLWxlZnRcIl18fFswLDBdKSxcImJvdHRvbS1yaWdodFwiOmUuUC5jb252ZXJ0KHRbXCJib3R0b20tcmlnaHRcIl18fFswLDBdKSxsZWZ0OmUuUC5jb252ZXJ0KHQubGVmdHx8WzAsMF0pLHJpZ2h0OmUuUC5jb252ZXJ0KHQucmlnaHR8fFswLDBdKX19cmV0dXJuIFFzKG5ldyBlLlAoMCwwKSl9Y29uc3QgdG89aTt0LkFKQVhFcnJvcj1lLmJoLHQuRXZlbnRlZD1lLkUsdC5MbmdMYXQ9ZS5OLHQuTWVyY2F0b3JDb29yZGluYXRlPWUuWix0LlBvaW50PWUuUCx0LmFkZFByb3RvY29sPWUuYmksdC5jb25maWc9ZS5hLHQucmVtb3ZlUHJvdG9jb2w9ZS5iaix0LkF0dHJpYnV0aW9uQ29udHJvbD1Fcyx0LkJveFpvb21IYW5kbGVyPVVhLHQuQ2FudmFzU291cmNlPWV0LHQuQ29vcGVyYXRpdmVHZXN0dXJlc0hhbmRsZXI9dnMsdC5Eb3VibGVDbGlja1pvb21IYW5kbGVyPWRzLHQuRHJhZ1BhbkhhbmRsZXI9bXMsdC5EcmFnUm90YXRlSGFuZGxlcj1mcyx0LkVkZ2VJbnNldHM9YmEsdC5GdWxsc2NyZWVuQ29udHJvbD1jbGFzcyBleHRlbmRzIGUuRXtjb25zdHJ1Y3Rvcih0PXt9KXtzdXBlcigpLHRoaXMuX29uRnVsbHNjcmVlbkNoYW5nZT0oKT0+e3ZhciB0O2xldCBlPXdpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudHx8d2luZG93LmRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50fHx3aW5kb3cuZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnR8fHdpbmRvdy5kb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50O2Zvcig7bnVsbD09PSh0PW51bGw9PWU/dm9pZCAwOmUuc2hhZG93Um9vdCl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZnVsbHNjcmVlbkVsZW1lbnQ7KWU9ZS5zaGFkb3dSb290LmZ1bGxzY3JlZW5FbGVtZW50O2U9PT10aGlzLl9jb250YWluZXIhPT10aGlzLl9mdWxsc2NyZWVuJiZ0aGlzLl9oYW5kbGVGdWxsc2NyZWVuQ2hhbmdlKCk7fSx0aGlzLl9vbkNsaWNrRnVsbHNjcmVlbj0oKT0+e3RoaXMuX2lzRnVsbHNjcmVlbigpP3RoaXMuX2V4aXRGdWxsc2NyZWVuKCk6dGhpcy5fcmVxdWVzdEZ1bGxzY3JlZW4oKTt9LHRoaXMuX2Z1bGxzY3JlZW49ITEsdCYmdC5jb250YWluZXImJih0LmNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P3RoaXMuX2NvbnRhaW5lcj10LmNvbnRhaW5lcjplLncoXCJGdWxsIHNjcmVlbiBjb250cm9sICdjb250YWluZXInIG11c3QgYmUgYSBET00gZWxlbWVudC5cIikpLFwib25mdWxsc2NyZWVuY2hhbmdlXCJpbiBkb2N1bWVudD90aGlzLl9mdWxsc2NyZWVuY2hhbmdlPVwiZnVsbHNjcmVlbmNoYW5nZVwiOlwib25tb3pmdWxsc2NyZWVuY2hhbmdlXCJpbiBkb2N1bWVudD90aGlzLl9mdWxsc2NyZWVuY2hhbmdlPVwibW96ZnVsbHNjcmVlbmNoYW5nZVwiOlwib253ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCJpbiBkb2N1bWVudD90aGlzLl9mdWxsc2NyZWVuY2hhbmdlPVwid2Via2l0ZnVsbHNjcmVlbmNoYW5nZVwiOlwib25tc2Z1bGxzY3JlZW5jaGFuZ2VcImluIGRvY3VtZW50JiYodGhpcy5fZnVsbHNjcmVlbmNoYW5nZT1cIk1TRnVsbHNjcmVlbkNoYW5nZVwiKTt9b25BZGQodCl7cmV0dXJuIHRoaXMuX21hcD10LHRoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2NvbnRhaW5lcj10aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkpLHRoaXMuX2NvbnRyb2xDb250YWluZXI9ci5jcmVhdGUoXCJkaXZcIixcIm1hcGxpYnJlZ2wtY3RybCBtYXBsaWJyZWdsLWN0cmwtZ3JvdXBcIiksdGhpcy5fc2V0dXBVSSgpLHRoaXMuX2NvbnRyb2xDb250YWluZXJ9b25SZW1vdmUoKXtyLnJlbW92ZSh0aGlzLl9jb250cm9sQ29udGFpbmVyKSx0aGlzLl9tYXA9bnVsbCx3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl9mdWxsc2NyZWVuY2hhbmdlLHRoaXMuX29uRnVsbHNjcmVlbkNoYW5nZSk7fV9zZXR1cFVJKCl7Y29uc3QgdD10aGlzLl9mdWxsc2NyZWVuQnV0dG9uPXIuY3JlYXRlKFwiYnV0dG9uXCIsXCJtYXBsaWJyZWdsLWN0cmwtZnVsbHNjcmVlblwiLHRoaXMuX2NvbnRyb2xDb250YWluZXIpO3IuY3JlYXRlKFwic3BhblwiLFwibWFwbGlicmVnbC1jdHJsLWljb25cIix0KS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSx0LnR5cGU9XCJidXR0b25cIix0aGlzLl91cGRhdGVUaXRsZSgpLHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdGhpcy5fb25DbGlja0Z1bGxzY3JlZW4pLHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UsdGhpcy5fb25GdWxsc2NyZWVuQ2hhbmdlKTt9X3VwZGF0ZVRpdGxlKCl7Y29uc3QgdD10aGlzLl9nZXRUaXRsZSgpO3RoaXMuX2Z1bGxzY3JlZW5CdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLHQpLHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24udGl0bGU9dDt9X2dldFRpdGxlKCl7cmV0dXJuIHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcodGhpcy5faXNGdWxsc2NyZWVuKCk/XCJGdWxsc2NyZWVuQ29udHJvbC5FeGl0XCI6XCJGdWxsc2NyZWVuQ29udHJvbC5FbnRlclwiKX1faXNGdWxsc2NyZWVuKCl7cmV0dXJuIHRoaXMuX2Z1bGxzY3JlZW59X2hhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UoKXt0aGlzLl9mdWxsc2NyZWVuPSF0aGlzLl9mdWxsc2NyZWVuLHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uY2xhc3NMaXN0LnRvZ2dsZShcIm1hcGxpYnJlZ2wtY3RybC1zaHJpbmtcIiksdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKFwibWFwbGlicmVnbC1jdHJsLWZ1bGxzY3JlZW5cIiksdGhpcy5fdXBkYXRlVGl0bGUoKSx0aGlzLl9mdWxsc2NyZWVuPyh0aGlzLmZpcmUobmV3IGUuayhcImZ1bGxzY3JlZW5zdGFydFwiKSksdGhpcy5fcHJldkNvb3BlcmF0aXZlR2VzdHVyZXNFbmFibGVkPXRoaXMuX21hcC5jb29wZXJhdGl2ZUdlc3R1cmVzLmlzRW5hYmxlZCgpLHRoaXMuX21hcC5jb29wZXJhdGl2ZUdlc3R1cmVzLmRpc2FibGUoKSk6KHRoaXMuZmlyZShuZXcgZS5rKFwiZnVsbHNjcmVlbmVuZFwiKSksdGhpcy5fcHJldkNvb3BlcmF0aXZlR2VzdHVyZXNFbmFibGVkJiZ0aGlzLl9tYXAuY29vcGVyYXRpdmVHZXN0dXJlcy5lbmFibGUoKSk7fV9leGl0RnVsbHNjcmVlbigpe3dpbmRvdy5kb2N1bWVudC5leGl0RnVsbHNjcmVlbj93aW5kb3cuZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTp3aW5kb3cuZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbj93aW5kb3cuZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpOndpbmRvdy5kb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuP3dpbmRvdy5kb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk6d2luZG93LmRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4/d2luZG93LmRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTp0aGlzLl90b2dnbGVQc2V1ZG9GdWxsU2NyZWVuKCk7fV9yZXF1ZXN0RnVsbHNjcmVlbigpe3RoaXMuX2NvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbj90aGlzLl9jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4oKTp0aGlzLl9jb250YWluZXIubW96UmVxdWVzdEZ1bGxTY3JlZW4/dGhpcy5fY29udGFpbmVyLm1velJlcXVlc3RGdWxsU2NyZWVuKCk6dGhpcy5fY29udGFpbmVyLm1zUmVxdWVzdEZ1bGxzY3JlZW4/dGhpcy5fY29udGFpbmVyLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTp0aGlzLl9jb250YWluZXIud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4/dGhpcy5fY29udGFpbmVyLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk6dGhpcy5fdG9nZ2xlUHNldWRvRnVsbFNjcmVlbigpO31fdG9nZ2xlUHNldWRvRnVsbFNjcmVlbigpe3RoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFwibWFwbGlicmVnbC1wc2V1ZG8tZnVsbHNjcmVlblwiKSx0aGlzLl9oYW5kbGVGdWxsc2NyZWVuQ2hhbmdlKCksdGhpcy5fbWFwLnJlc2l6ZSgpO319LHQuR2VvSlNPTlNvdXJjZT1KLHQuR2VvbG9jYXRlQ29udHJvbD1jbGFzcyBleHRlbmRzIGUuRXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX29uU3VjY2Vzcz10PT57aWYodGhpcy5fbWFwKXtpZih0aGlzLl9pc091dE9mTWFwTWF4Qm91bmRzKHQpKXJldHVybiB0aGlzLl9zZXRFcnJvclN0YXRlKCksdGhpcy5maXJlKG5ldyBlLmsoXCJvdXRvZm1heGJvdW5kc1wiLHQpKSx0aGlzLl91cGRhdGVNYXJrZXIoKSx2b2lkIHRoaXMuX2ZpbmlzaCgpO2lmKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbilzd2l0Y2godGhpcy5fbGFzdEtub3duUG9zaXRpb249dCx0aGlzLl93YXRjaFN0YXRlKXtjYXNlXCJXQUlUSU5HX0FDVElWRVwiOmNhc2VcIkFDVElWRV9MT0NLXCI6Y2FzZVwiQUNUSVZFX0VSUk9SXCI6dGhpcy5fd2F0Y2hTdGF0ZT1cIkFDVElWRV9MT0NLXCIsdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvclwiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpO2JyZWFrO2Nhc2VcIkJBQ0tHUk9VTkRcIjpjYXNlXCJCQUNLR1JPVU5EX0VSUk9SXCI6dGhpcy5fd2F0Y2hTdGF0ZT1cIkJBQ0tHUk9VTkRcIix0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZ1wiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvclwiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZFwiKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB3YXRjaFN0YXRlICR7dGhpcy5fd2F0Y2hTdGF0ZX1gKX10aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiYmXCJPRkZcIiE9PXRoaXMuX3dhdGNoU3RhdGUmJnRoaXMuX3VwZGF0ZU1hcmtlcih0KSx0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24mJlwiQUNUSVZFX0xPQ0tcIiE9PXRoaXMuX3dhdGNoU3RhdGV8fHRoaXMuX3VwZGF0ZUNhbWVyYSh0KSx0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiYmdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC11c2VyLWxvY2F0aW9uLWRvdC1zdGFsZVwiKSx0aGlzLmZpcmUobmV3IGUuayhcImdlb2xvY2F0ZVwiLHQpKSx0aGlzLl9maW5pc2goKTt9fSx0aGlzLl91cGRhdGVDYW1lcmE9dD0+e2NvbnN0IGk9bmV3IGUuTih0LmNvb3Jkcy5sb25naXR1ZGUsdC5jb29yZHMubGF0aXR1ZGUpLGE9dC5jb29yZHMuYWNjdXJhY3kscz10aGlzLl9tYXAuZ2V0QmVhcmluZygpLG89ZS5lKHtiZWFyaW5nOnN9LHRoaXMub3B0aW9ucy5maXRCb3VuZHNPcHRpb25zKSxyPUguZnJvbUxuZ0xhdChpLGEpO3RoaXMuX21hcC5maXRCb3VuZHMocixvLHtnZW9sb2NhdGVTb3VyY2U6ITB9KTt9LHRoaXMuX3VwZGF0ZU1hcmtlcj10PT57aWYodCl7Y29uc3QgaT1uZXcgZS5OKHQuY29vcmRzLmxvbmdpdHVkZSx0LmNvb3Jkcy5sYXRpdHVkZSk7dGhpcy5fYWNjdXJhY3lDaXJjbGVNYXJrZXIuc2V0TG5nTGF0KGkpLmFkZFRvKHRoaXMuX21hcCksdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnNldExuZ0xhdChpKS5hZGRUbyh0aGlzLl9tYXApLHRoaXMuX2FjY3VyYWN5PXQuY29vcmRzLmFjY3VyYWN5LHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uJiZ0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlJiZ0aGlzLl91cGRhdGVDaXJjbGVSYWRpdXMoKTt9ZWxzZSB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIucmVtb3ZlKCksdGhpcy5fYWNjdXJhY3lDaXJjbGVNYXJrZXIucmVtb3ZlKCk7fSx0aGlzLl9vblpvb209KCk9Pnt0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiYmdGhpcy5vcHRpb25zLnNob3dBY2N1cmFjeUNpcmNsZSYmdGhpcy5fdXBkYXRlQ2lyY2xlUmFkaXVzKCk7fSx0aGlzLl9vbkVycm9yPXQ9PntpZih0aGlzLl9tYXApe2lmKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbilpZigxPT09dC5jb2RlKXt0aGlzLl93YXRjaFN0YXRlPVwiT0ZGXCIsdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZVwiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZD0hMDtjb25zdCB0PXRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlXCIpO3RoaXMuX2dlb2xvY2F0ZUJ1dHRvbi50aXRsZT10LHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsdCksdm9pZCAwIT09dGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEJiZ0aGlzLl9jbGVhcldhdGNoKCk7fWVsc2Uge2lmKDM9PT10LmNvZGUmJldzKXJldHVybjt0aGlzLl9zZXRFcnJvclN0YXRlKCk7fVwiT0ZGXCIhPT10aGlzLl93YXRjaFN0YXRlJiZ0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiYmdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC11c2VyLWxvY2F0aW9uLWRvdC1zdGFsZVwiKSx0aGlzLmZpcmUobmV3IGUuayhcImVycm9yXCIsdCkpLHRoaXMuX2ZpbmlzaCgpO319LHRoaXMuX2ZpbmlzaD0oKT0+e3RoaXMuX3RpbWVvdXRJZCYmY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCksdGhpcy5fdGltZW91dElkPXZvaWQgMDt9LHRoaXMuX3NldHVwVUk9KCk9Pnt0aGlzLl9tYXAmJih0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsKHQ9PnQucHJldmVudERlZmF1bHQoKSkpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbj1yLmNyZWF0ZShcImJ1dHRvblwiLFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZVwiLHRoaXMuX2NvbnRhaW5lciksci5jcmVhdGUoXCJzcGFuXCIsXCJtYXBsaWJyZWdsLWN0cmwtaWNvblwiLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbikuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnR5cGU9XCJidXR0b25cIix0aGlzLl9nZW9sb2NhdGVCdXR0b24uZGlzYWJsZWQ9ITApO30sdGhpcy5fZmluaXNoU2V0dXBVST10PT57aWYodGhpcy5fbWFwKXtpZighMT09PXQpe2UudyhcIkdlb2xvY2F0aW9uIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSBzbyB0aGUgR2VvbG9jYXRlQ29udHJvbCB3aWxsIGJlIGRpc2FibGVkLlwiKTtjb25zdCB0PXRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlXCIpO3RoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZD0hMCx0aGlzLl9nZW9sb2NhdGVCdXR0b24udGl0bGU9dCx0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLHQpO31lbHNlIHtjb25zdCB0PXRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJHZW9sb2NhdGVDb250cm9sLkZpbmRNeUxvY2F0aW9uXCIpO3RoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZD0hMSx0aGlzLl9nZW9sb2NhdGVCdXR0b24udGl0bGU9dCx0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLHQpO310aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24mJih0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIsXCJmYWxzZVwiKSx0aGlzLl93YXRjaFN0YXRlPVwiT0ZGXCIpLHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uJiYodGhpcy5fZG90RWxlbWVudD1yLmNyZWF0ZShcImRpdlwiLFwibWFwbGlicmVnbC11c2VyLWxvY2F0aW9uLWRvdFwiKSx0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXI9bmV3IFZzKHtlbGVtZW50OnRoaXMuX2RvdEVsZW1lbnR9KSx0aGlzLl9jaXJjbGVFbGVtZW50PXIuY3JlYXRlKFwiZGl2XCIsXCJtYXBsaWJyZWdsLXVzZXItbG9jYXRpb24tYWNjdXJhY3ktY2lyY2xlXCIpLHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyPW5ldyBWcyh7ZWxlbWVudDp0aGlzLl9jaXJjbGVFbGVtZW50LHBpdGNoQWxpZ25tZW50OlwibWFwXCJ9KSx0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24mJih0aGlzLl93YXRjaFN0YXRlPVwiT0ZGXCIpLHRoaXMuX21hcC5vbihcInpvb21cIix0aGlzLl9vblpvb20pKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsKCgpPT50aGlzLnRyaWdnZXIoKSkpLHRoaXMuX3NldHVwPSEwLHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiYmdGhpcy5fbWFwLm9uKFwibW92ZXN0YXJ0XCIsKHQ9Pnt0Lmdlb2xvY2F0ZVNvdXJjZXx8XCJBQ1RJVkVfTE9DS1wiIT09dGhpcy5fd2F0Y2hTdGF0ZXx8dC5vcmlnaW5hbEV2ZW50JiZcInJlc2l6ZVwiPT09dC5vcmlnaW5hbEV2ZW50LnR5cGV8fCh0aGlzLl93YXRjaFN0YXRlPVwiQkFDS0dST1VORFwiLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmVcIiksdGhpcy5maXJlKG5ldyBlLmsoXCJ0cmFja3VzZXJsb2NhdGlvbmVuZFwiKSksdGhpcy5maXJlKG5ldyBlLmsoXCJ1c2VybG9jYXRpb25sb3N0Zm9jdXNcIikpKTt9KSk7fX0sdGhpcy5vcHRpb25zPWUuZSh7fSxHcyx0KTt9b25BZGQodCl7cmV0dXJuIHRoaXMuX21hcD10LHRoaXMuX2NvbnRhaW5lcj1yLmNyZWF0ZShcImRpdlwiLFwibWFwbGlicmVnbC1jdHJsIG1hcGxpYnJlZ2wtY3RybC1ncm91cFwiKSx0aGlzLl9zZXR1cFVJKCksZnVuY3Rpb24oKXtyZXR1cm4gZS5fKHRoaXMsYXJndW1lbnRzLHZvaWQgMCwoZnVuY3Rpb24qKHQ9ITEpe2lmKHZvaWQgMCE9PVVzJiYhdClyZXR1cm4gVXM7aWYodm9pZCAwPT09d2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucylyZXR1cm4gVXM9ISF3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLFVzO3RyeXtjb25zdCB0PXlpZWxkIHdpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe25hbWU6XCJnZW9sb2NhdGlvblwifSk7VXM9XCJkZW5pZWRcIiE9PXQuc3RhdGU7fWNhdGNoKHQpe1VzPSEhd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbjt9cmV0dXJuIFVzfSkpfSgpLnRoZW4oKHQ9PnRoaXMuX2ZpbmlzaFNldHVwVUkodCkpKSx0aGlzLl9jb250YWluZXJ9b25SZW1vdmUoKXt2b2lkIDAhPT10aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQmJih3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKSx0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQ9dm9pZCAwKSx0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiYmdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyJiZ0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIucmVtb3ZlKCksdGhpcy5vcHRpb25zLnNob3dBY2N1cmFjeUNpcmNsZSYmdGhpcy5fYWNjdXJhY3lDaXJjbGVNYXJrZXImJnRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyLnJlbW92ZSgpLHIucmVtb3ZlKHRoaXMuX2NvbnRhaW5lciksdGhpcy5fbWFwLm9mZihcInpvb21cIix0aGlzLl9vblpvb20pLHRoaXMuX21hcD12b2lkIDAsSHM9MCxXcz0hMTt9X2lzT3V0T2ZNYXBNYXhCb3VuZHModCl7Y29uc3QgZT10aGlzLl9tYXAuZ2V0TWF4Qm91bmRzKCksaT10LmNvb3JkcztyZXR1cm4gZSYmKGkubG9uZ2l0dWRlPGUuZ2V0V2VzdCgpfHxpLmxvbmdpdHVkZT5lLmdldEVhc3QoKXx8aS5sYXRpdHVkZTxlLmdldFNvdXRoKCl8fGkubGF0aXR1ZGU+ZS5nZXROb3J0aCgpKX1fc2V0RXJyb3JTdGF0ZSgpe3N3aXRjaCh0aGlzLl93YXRjaFN0YXRlKXtjYXNlXCJXQUlUSU5HX0FDVElWRVwiOnRoaXMuX3dhdGNoU3RhdGU9XCJBQ1RJVkVfRVJST1JcIix0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3JcIik7YnJlYWs7Y2FzZVwiQUNUSVZFX0xPQ0tcIjp0aGlzLl93YXRjaFN0YXRlPVwiQUNUSVZFX0VSUk9SXCIsdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZVwiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpO2JyZWFrO2Nhc2VcIkJBQ0tHUk9VTkRcIjp0aGlzLl93YXRjaFN0YXRlPVwiQkFDS0dST1VORF9FUlJPUlwiLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpO2JyZWFrO2Nhc2VcIkFDVElWRV9FUlJPUlwiOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApfX1fdXBkYXRlQ2lyY2xlUmFkaXVzKCl7Y29uc3QgdD10aGlzLl9tYXAuZ2V0Qm91bmRzKCksZT10LmdldFNvdXRoRWFzdCgpLGk9dC5nZXROb3J0aEVhc3QoKSxhPWUuZGlzdGFuY2VUbyhpKSxzPU1hdGguY2VpbCh0aGlzLl9hY2N1cmFjeS8oYS90aGlzLl9tYXAuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQpKjIpO3RoaXMuX2NpcmNsZUVsZW1lbnQuc3R5bGUud2lkdGg9YCR7c31weGAsdGhpcy5fY2lyY2xlRWxlbWVudC5zdHlsZS5oZWlnaHQ9YCR7c31weGA7fXRyaWdnZXIoKXtpZighdGhpcy5fc2V0dXApcmV0dXJuIGUudyhcIkdlb2xvY2F0ZSBjb250cm9sIHRyaWdnZXJlZCBiZWZvcmUgYWRkZWQgdG8gYSBtYXBcIiksITE7aWYodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKXtzd2l0Y2godGhpcy5fd2F0Y2hTdGF0ZSl7Y2FzZVwiT0ZGXCI6dGhpcy5fd2F0Y2hTdGF0ZT1cIldBSVRJTkdfQUNUSVZFXCIsdGhpcy5maXJlKG5ldyBlLmsoXCJ0cmFja3VzZXJsb2NhdGlvbnN0YXJ0XCIpKTticmVhaztjYXNlXCJXQUlUSU5HX0FDVElWRVwiOmNhc2VcIkFDVElWRV9MT0NLXCI6Y2FzZVwiQUNUSVZFX0VSUk9SXCI6Y2FzZVwiQkFDS0dST1VORF9FUlJPUlwiOkhzLS0sV3M9ITEsdGhpcy5fd2F0Y2hTdGF0ZT1cIk9GRlwiLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmVcIiksdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvclwiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZFwiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvclwiKSx0aGlzLmZpcmUobmV3IGUuayhcInRyYWNrdXNlcmxvY2F0aW9uZW5kXCIpKTticmVhaztjYXNlXCJCQUNLR1JPVU5EXCI6dGhpcy5fd2F0Y2hTdGF0ZT1cIkFDVElWRV9MT0NLXCIsdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmRcIiksdGhpcy5fbGFzdEtub3duUG9zaXRpb24mJnRoaXMuX3VwZGF0ZUNhbWVyYSh0aGlzLl9sYXN0S25vd25Qb3NpdGlvbiksdGhpcy5maXJlKG5ldyBlLmsoXCJ0cmFja3VzZXJsb2NhdGlvbnN0YXJ0XCIpKSx0aGlzLmZpcmUobmV3IGUuayhcInVzZXJsb2NhdGlvbmZvY3VzXCIpKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB3YXRjaFN0YXRlICR7dGhpcy5fd2F0Y2hTdGF0ZX1gKX1zd2l0Y2godGhpcy5fd2F0Y2hTdGF0ZSl7Y2FzZVwiV0FJVElOR19BQ1RJVkVcIjp0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZ1wiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpO2JyZWFrO2Nhc2VcIkFDVElWRV9MT0NLXCI6dGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZVwiKTticmVhaztjYXNlXCJPRkZcIjpicmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB3YXRjaFN0YXRlICR7dGhpcy5fd2F0Y2hTdGF0ZX1gKX1pZihcIk9GRlwiPT09dGhpcy5fd2F0Y2hTdGF0ZSYmdm9pZCAwIT09dGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKXRoaXMuX2NsZWFyV2F0Y2goKTtlbHNlIGlmKHZvaWQgMD09PXRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCl7bGV0IHQ7dGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLFwidHJ1ZVwiKSxIcysrLEhzPjE/KHQ9e21heGltdW1BZ2U6NmU1LHRpbWVvdXQ6MH0sV3M9ITApOih0PXRoaXMub3B0aW9ucy5wb3NpdGlvbk9wdGlvbnMsV3M9ITEpLHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRD13aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24odGhpcy5fb25TdWNjZXNzLHRoaXMuX29uRXJyb3IsdCk7fX1lbHNlIHdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHRoaXMuX29uU3VjY2Vzcyx0aGlzLl9vbkVycm9yLHRoaXMub3B0aW9ucy5wb3NpdGlvbk9wdGlvbnMpLHRoaXMuX3RpbWVvdXRJZD1zZXRUaW1lb3V0KHRoaXMuX2ZpbmlzaCwxZTQpO3JldHVybiAhMH1fY2xlYXJXYXRjaCgpe3dpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQpLHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRD12b2lkIDAsdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLFwiZmFsc2VcIiksdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24mJnRoaXMuX3VwZGF0ZU1hcmtlcihudWxsKTt9fSx0Lkhhc2g9RWEsdC5JbWFnZVNvdXJjZT1RLHQuS2V5Ym9hcmRIYW5kbGVyPWxzLHQuTG5nTGF0Qm91bmRzPUgsdC5Mb2dvQ29udHJvbD1Qcyx0Lk1hcD1jbGFzcyBleHRlbmRzIFRze2NvbnN0cnVjdG9yKHQpe2UuYmYubWFyayhlLmJnLmNyZWF0ZSk7Y29uc3QgaT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sRnMpLHQpO2lmKG51bGwhPWkubWluWm9vbSYmbnVsbCE9aS5tYXhab29tJiZpLm1pblpvb20+aS5tYXhab29tKXRocm93IG5ldyBFcnJvcihcIm1heFpvb20gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluWm9vbVwiKTtpZihudWxsIT1pLm1pblBpdGNoJiZudWxsIT1pLm1heFBpdGNoJiZpLm1pblBpdGNoPmkubWF4UGl0Y2gpdGhyb3cgbmV3IEVycm9yKFwibWF4UGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluUGl0Y2hcIik7aWYobnVsbCE9aS5taW5QaXRjaCYmaS5taW5QaXRjaDwwKXRocm93IG5ldyBFcnJvcihcIm1pblBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBcIik7aWYobnVsbCE9aS5tYXhQaXRjaCYmaS5tYXhQaXRjaD44NSl0aHJvdyBuZXcgRXJyb3IoXCJtYXhQaXRjaCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA4NVwiKTtpZihzdXBlcihuZXcgVGEoaS5taW5ab29tLGkubWF4Wm9vbSxpLm1pblBpdGNoLGkubWF4UGl0Y2gsaS5yZW5kZXJXb3JsZENvcGllcykse2JlYXJpbmdTbmFwOmkuYmVhcmluZ1NuYXB9KSx0aGlzLl9pZGxlVHJpZ2dlcmVkPSExLHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yPTEsdGhpcy5fcmVuZGVyVGFza1F1ZXVlPW5ldyBDcyx0aGlzLl9jb250cm9scz1bXSx0aGlzLl9tYXBJZD1lLmE0KCksdGhpcy5fY29udGV4dExvc3Q9dD0+e3QucHJldmVudERlZmF1bHQoKSx0aGlzLl9mcmFtZVJlcXVlc3QmJih0aGlzLl9mcmFtZVJlcXVlc3QuYWJvcnQoKSx0aGlzLl9mcmFtZVJlcXVlc3Q9bnVsbCksdGhpcy5maXJlKG5ldyBlLmsoXCJ3ZWJnbGNvbnRleHRsb3N0XCIse29yaWdpbmFsRXZlbnQ6dH0pKTt9LHRoaXMuX2NvbnRleHRSZXN0b3JlZD10PT57dGhpcy5fc2V0dXBQYWludGVyKCksdGhpcy5yZXNpemUoKSx0aGlzLl91cGRhdGUoKSx0aGlzLmZpcmUobmV3IGUuayhcIndlYmdsY29udGV4dHJlc3RvcmVkXCIse29yaWdpbmFsRXZlbnQ6dH0pKTt9LHRoaXMuX29uTWFwU2Nyb2xsPXQ9PntpZih0LnRhcmdldD09PXRoaXMuX2NvbnRhaW5lcilyZXR1cm4gdGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcD0wLHRoaXMuX2NvbnRhaW5lci5zY3JvbGxMZWZ0PTAsITF9LHRoaXMuX29uV2luZG93T25saW5lPSgpPT57dGhpcy5fdXBkYXRlKCk7fSx0aGlzLl9pbnRlcmFjdGl2ZT1pLmludGVyYWN0aXZlLHRoaXMuX21heFRpbGVDYWNoZVNpemU9aS5tYXhUaWxlQ2FjaGVTaXplLHRoaXMuX21heFRpbGVDYWNoZVpvb21MZXZlbHM9aS5tYXhUaWxlQ2FjaGVab29tTGV2ZWxzLHRoaXMuX2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ITA9PT1pLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQsdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyPSEwPT09aS5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsdGhpcy5fYW50aWFsaWFzPSEwPT09aS5hbnRpYWxpYXMsdGhpcy5fdHJhY2tSZXNpemU9ITA9PT1pLnRyYWNrUmVzaXplLHRoaXMuX2JlYXJpbmdTbmFwPWkuYmVhcmluZ1NuYXAsdGhpcy5fcmVmcmVzaEV4cGlyZWRUaWxlcz0hMD09PWkucmVmcmVzaEV4cGlyZWRUaWxlcyx0aGlzLl9mYWRlRHVyYXRpb249aS5mYWRlRHVyYXRpb24sdGhpcy5fY3Jvc3NTb3VyY2VDb2xsaXNpb25zPSEwPT09aS5jcm9zc1NvdXJjZUNvbGxpc2lvbnMsdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nPSEwPT09aS5jb2xsZWN0UmVzb3VyY2VUaW1pbmcsdGhpcy5fbG9jYWxlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxrcyksaS5sb2NhbGUpLHRoaXMuX2NsaWNrVG9sZXJhbmNlPWkuY2xpY2tUb2xlcmFuY2UsdGhpcy5fb3ZlcnJpZGVQaXhlbFJhdGlvPWkucGl4ZWxSYXRpbyx0aGlzLl9tYXhDYW52YXNTaXplPWkubWF4Q2FudmFzU2l6ZSx0aGlzLnRyYW5zZm9ybUNhbWVyYVVwZGF0ZT1pLnRyYW5zZm9ybUNhbWVyYVVwZGF0ZSx0aGlzLmNhbmNlbFBlbmRpbmdUaWxlUmVxdWVzdHNXaGlsZVpvb21pbmc9ITA9PT1pLmNhbmNlbFBlbmRpbmdUaWxlUmVxdWVzdHNXaGlsZVpvb21pbmcsdGhpcy5faW1hZ2VRdWV1ZUhhbmRsZT1fLmFkZFRocm90dGxlQ29udHJvbCgoKCk9PnRoaXMuaXNNb3ZpbmcoKSkpLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBwKGkudHJhbnNmb3JtUmVxdWVzdCksXCJzdHJpbmdcIj09dHlwZW9mIGkuY29udGFpbmVyKXtpZih0aGlzLl9jb250YWluZXI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaS5jb250YWluZXIpLCF0aGlzLl9jb250YWluZXIpdGhyb3cgbmV3IEVycm9yKGBDb250YWluZXIgJyR7aS5jb250YWluZXJ9JyBub3QgZm91bmQuYCl9ZWxzZSB7aWYoIShpLmNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHR5cGU6ICdjb250YWluZXInIG11c3QgYmUgYSBTdHJpbmcgb3IgSFRNTEVsZW1lbnQuXCIpO3RoaXMuX2NvbnRhaW5lcj1pLmNvbnRhaW5lcjt9aWYoaS5tYXhCb3VuZHMmJnRoaXMuc2V0TWF4Qm91bmRzKGkubWF4Qm91bmRzKSx0aGlzLl9zZXR1cENvbnRhaW5lcigpLHRoaXMuX3NldHVwUGFpbnRlcigpLHRoaXMub24oXCJtb3ZlXCIsKCgpPT50aGlzLl91cGRhdGUoITEpKSkub24oXCJtb3ZlZW5kXCIsKCgpPT50aGlzLl91cGRhdGUoITEpKSkub24oXCJ6b29tXCIsKCgpPT50aGlzLl91cGRhdGUoITApKSkub24oXCJ0ZXJyYWluXCIsKCgpPT57dGhpcy5wYWludGVyLnRlcnJhaW5GYWNpbGl0YXRvci5kaXJ0eT0hMCx0aGlzLl91cGRhdGUoITApO30pKS5vbmNlKFwiaWRsZVwiLCgoKT0+e3RoaXMuX2lkbGVUcmlnZ2VyZWQ9ITA7fSkpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cpe2FkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIix0aGlzLl9vbldpbmRvd09ubGluZSwhMSk7bGV0IHQ9ITE7Y29uc3QgZT1JYSgodD0+e3RoaXMuX3RyYWNrUmVzaXplJiYhdGhpcy5fcmVtb3ZlZCYmKHRoaXMucmVzaXplKHQpLHRoaXMucmVkcmF3KCkpO30pLDUwKTt0aGlzLl9yZXNpemVPYnNlcnZlcj1uZXcgUmVzaXplT2JzZXJ2ZXIoKGk9Pnt0P2UoaSk6dD0hMDt9KSksdGhpcy5fcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9jb250YWluZXIpO310aGlzLmhhbmRsZXJzPW5ldyB3cyh0aGlzLGkpLHRoaXMuX2hhc2g9aS5oYXNoJiZuZXcgRWEoXCJzdHJpbmdcIj09dHlwZW9mIGkuaGFzaCYmaS5oYXNofHx2b2lkIDApLmFkZFRvKHRoaXMpLHRoaXMuX2hhc2gmJnRoaXMuX2hhc2guX29uSGFzaENoYW5nZSgpfHwodGhpcy5qdW1wVG8oe2NlbnRlcjppLmNlbnRlcix6b29tOmkuem9vbSxiZWFyaW5nOmkuYmVhcmluZyxwaXRjaDppLnBpdGNofSksaS5ib3VuZHMmJih0aGlzLnJlc2l6ZSgpLHRoaXMuZml0Qm91bmRzKGkuYm91bmRzLGUuZSh7fSxpLmZpdEJvdW5kc09wdGlvbnMse2R1cmF0aW9uOjB9KSkpKSx0aGlzLnJlc2l6ZSgpLHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseT1pLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSx0aGlzLl92YWxpZGF0ZVN0eWxlPWkudmFsaWRhdGVTdHlsZSxpLnN0eWxlJiZ0aGlzLnNldFN0eWxlKGkuc3R5bGUse2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseTppLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseX0pLGkuYXR0cmlidXRpb25Db250cm9sJiZ0aGlzLmFkZENvbnRyb2wobmV3IEVzKFwiYm9vbGVhblwiPT10eXBlb2YgaS5hdHRyaWJ1dGlvbkNvbnRyb2w/dm9pZCAwOmkuYXR0cmlidXRpb25Db250cm9sKSksaS5tYXBsaWJyZUxvZ28mJnRoaXMuYWRkQ29udHJvbChuZXcgUHMsaS5sb2dvUG9zaXRpb24pLHRoaXMub24oXCJzdHlsZS5sb2FkXCIsKCgpPT57dGhpcy50cmFuc2Zvcm0udW5tb2RpZmllZCYmdGhpcy5qdW1wVG8odGhpcy5zdHlsZS5zdHlsZXNoZWV0KTt9KSksdGhpcy5vbihcImRhdGFcIiwodD0+e3RoaXMuX3VwZGF0ZShcInN0eWxlXCI9PT10LmRhdGFUeXBlKSx0aGlzLmZpcmUobmV3IGUuayhgJHt0LmRhdGFUeXBlfWRhdGFgLHQpKTt9KSksdGhpcy5vbihcImRhdGFsb2FkaW5nXCIsKHQ9Pnt0aGlzLmZpcmUobmV3IGUuayhgJHt0LmRhdGFUeXBlfWRhdGFsb2FkaW5nYCx0KSk7fSkpLHRoaXMub24oXCJkYXRhYWJvcnRcIiwodD0+e3RoaXMuZmlyZShuZXcgZS5rKFwic291cmNlZGF0YWFib3J0XCIsdCkpO30pKTt9X2dldE1hcElkKCl7cmV0dXJuIHRoaXMuX21hcElkfWFkZENvbnRyb2wodCxpKXtpZih2b2lkIDA9PT1pJiYoaT10LmdldERlZmF1bHRQb3NpdGlvbj90LmdldERlZmF1bHRQb3NpdGlvbigpOlwidG9wLXJpZ2h0XCIpLCF0fHwhdC5vbkFkZClyZXR1cm4gdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCB0byBtYXAuYWRkQ29udHJvbCgpLiBBcmd1bWVudCBtdXN0IGJlIGEgY29udHJvbCB3aXRoIG9uQWRkIGFuZCBvblJlbW92ZSBtZXRob2RzLlwiKSkpO2NvbnN0IGE9dC5vbkFkZCh0aGlzKTt0aGlzLl9jb250cm9scy5wdXNoKHQpO2NvbnN0IHM9dGhpcy5fY29udHJvbFBvc2l0aW9uc1tpXTtyZXR1cm4gLTEhPT1pLmluZGV4T2YoXCJib3R0b21cIik/cy5pbnNlcnRCZWZvcmUoYSxzLmZpcnN0Q2hpbGQpOnMuYXBwZW5kQ2hpbGQoYSksdGhpc31yZW1vdmVDb250cm9sKHQpe2lmKCF0fHwhdC5vblJlbW92ZSlyZXR1cm4gdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCB0byBtYXAucmVtb3ZlQ29udHJvbCgpLiBBcmd1bWVudCBtdXN0IGJlIGEgY29udHJvbCB3aXRoIG9uQWRkIGFuZCBvblJlbW92ZSBtZXRob2RzLlwiKSkpO2NvbnN0IGk9dGhpcy5fY29udHJvbHMuaW5kZXhPZih0KTtyZXR1cm4gaT4tMSYmdGhpcy5fY29udHJvbHMuc3BsaWNlKGksMSksdC5vblJlbW92ZSh0aGlzKSx0aGlzfWhhc0NvbnRyb2wodCl7cmV0dXJuIHRoaXMuX2NvbnRyb2xzLmluZGV4T2YodCk+LTF9Y2FsY3VsYXRlQ2FtZXJhT3B0aW9uc0Zyb21Ubyh0LGUsaSxhKXtyZXR1cm4gbnVsbD09YSYmdGhpcy50ZXJyYWluJiYoYT10aGlzLnRlcnJhaW4uZ2V0RWxldmF0aW9uRm9yTG5nTGF0Wm9vbShpLHRoaXMudHJhbnNmb3JtLnRpbGVab29tKSksc3VwZXIuY2FsY3VsYXRlQ2FtZXJhT3B0aW9uc0Zyb21Ubyh0LGUsaSxhKX1yZXNpemUodCl7dmFyIGk7Y29uc3QgYT10aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCkscz1hWzBdLG89YVsxXSxyPXRoaXMuX2dldENsYW1wZWRQaXhlbFJhdGlvKHMsbyk7aWYodGhpcy5fcmVzaXplQ2FudmFzKHMsbyxyKSx0aGlzLnBhaW50ZXIucmVzaXplKHMsbyxyKSx0aGlzLnBhaW50ZXIub3ZlckxpbWl0KCkpe2NvbnN0IHQ9dGhpcy5wYWludGVyLmNvbnRleHQuZ2w7dGhpcy5fbWF4Q2FudmFzU2l6ZT1bdC5kcmF3aW5nQnVmZmVyV2lkdGgsdC5kcmF3aW5nQnVmZmVySGVpZ2h0XTtjb25zdCBlPXRoaXMuX2dldENsYW1wZWRQaXhlbFJhdGlvKHMsbyk7dGhpcy5fcmVzaXplQ2FudmFzKHMsbyxlKSx0aGlzLnBhaW50ZXIucmVzaXplKHMsbyxlKTt9dGhpcy50cmFuc2Zvcm0ucmVzaXplKHMsbyksbnVsbD09PShpPXRoaXMuX3JlcXVlc3RlZENhbWVyYVN0YXRlKXx8dm9pZCAwPT09aXx8aS5yZXNpemUocyxvKTtjb25zdCBuPSF0aGlzLl9tb3Zpbmc7cmV0dXJuIG4mJih0aGlzLnN0b3AoKSx0aGlzLmZpcmUobmV3IGUuayhcIm1vdmVzdGFydFwiLHQpKS5maXJlKG5ldyBlLmsoXCJtb3ZlXCIsdCkpKSx0aGlzLmZpcmUobmV3IGUuayhcInJlc2l6ZVwiLHQpKSxuJiZ0aGlzLmZpcmUobmV3IGUuayhcIm1vdmVlbmRcIix0KSksdGhpc31fZ2V0Q2xhbXBlZFBpeGVsUmF0aW8odCxlKXtjb25zdHswOmksMTphfT10aGlzLl9tYXhDYW52YXNTaXplLHM9dGhpcy5nZXRQaXhlbFJhdGlvKCksbz10KnMscj1lKnM7cmV0dXJuIE1hdGgubWluKG8+aT9pL286MSxyPmE/YS9yOjEpKnN9Z2V0UGl4ZWxSYXRpbygpe3ZhciB0O3JldHVybiBudWxsIT09KHQ9dGhpcy5fb3ZlcnJpZGVQaXhlbFJhdGlvKSYmdm9pZCAwIT09dD90OmRldmljZVBpeGVsUmF0aW99c2V0UGl4ZWxSYXRpbyh0KXt0aGlzLl9vdmVycmlkZVBpeGVsUmF0aW89dCx0aGlzLnJlc2l6ZSgpO31nZXRCb3VuZHMoKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0uZ2V0Qm91bmRzKCl9Z2V0TWF4Qm91bmRzKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLmdldE1heEJvdW5kcygpfXNldE1heEJvdW5kcyh0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0uc2V0TWF4Qm91bmRzKEguY29udmVydCh0KSksdGhpcy5fdXBkYXRlKCl9c2V0TWluWm9vbSh0KXtpZigodD1udWxsPT10Py0yOnQpPj0tMiYmdDw9dGhpcy50cmFuc2Zvcm0ubWF4Wm9vbSlyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluWm9vbT10LHRoaXMuX3VwZGF0ZSgpLHRoaXMuZ2V0Wm9vbSgpPHQmJnRoaXMuc2V0Wm9vbSh0KSx0aGlzO3Rocm93IG5ldyBFcnJvcihcIm1pblpvb20gbXVzdCBiZSBiZXR3ZWVuIC0yIGFuZCB0aGUgY3VycmVudCBtYXhab29tLCBpbmNsdXNpdmVcIil9Z2V0TWluWm9vbSgpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5taW5ab29tfXNldE1heFpvb20odCl7aWYoKHQ9bnVsbD09dD8yMjp0KT49dGhpcy50cmFuc2Zvcm0ubWluWm9vbSlyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbT10LHRoaXMuX3VwZGF0ZSgpLHRoaXMuZ2V0Wm9vbSgpPnQmJnRoaXMuc2V0Wm9vbSh0KSx0aGlzO3Rocm93IG5ldyBFcnJvcihcIm1heFpvb20gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbWluWm9vbVwiKX1nZXRNYXhab29tKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLm1heFpvb219c2V0TWluUGl0Y2godCl7aWYoKHQ9bnVsbD09dD8wOnQpPDApdGhyb3cgbmV3IEVycm9yKFwibWluUGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMFwiKTtpZih0Pj0wJiZ0PD10aGlzLnRyYW5zZm9ybS5tYXhQaXRjaClyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluUGl0Y2g9dCx0aGlzLl91cGRhdGUoKSx0aGlzLmdldFBpdGNoKCk8dCYmdGhpcy5zZXRQaXRjaCh0KSx0aGlzO3Rocm93IG5ldyBFcnJvcihcIm1pblBpdGNoIG11c3QgYmUgYmV0d2VlbiAwIGFuZCB0aGUgY3VycmVudCBtYXhQaXRjaCwgaW5jbHVzaXZlXCIpfWdldE1pblBpdGNoKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLm1pblBpdGNofXNldE1heFBpdGNoKHQpe2lmKCh0PW51bGw9PXQ/NjA6dCk+ODUpdGhyb3cgbmV3IEVycm9yKFwibWF4UGl0Y2ggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gODVcIik7aWYodD49dGhpcy50cmFuc2Zvcm0ubWluUGl0Y2gpcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1heFBpdGNoPXQsdGhpcy5fdXBkYXRlKCksdGhpcy5nZXRQaXRjaCgpPnQmJnRoaXMuc2V0UGl0Y2godCksdGhpczt0aHJvdyBuZXcgRXJyb3IoXCJtYXhQaXRjaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBtaW5QaXRjaFwiKX1nZXRNYXhQaXRjaCgpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5tYXhQaXRjaH1nZXRSZW5kZXJXb3JsZENvcGllcygpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllc31zZXRSZW5kZXJXb3JsZENvcGllcyh0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXM9dCx0aGlzLl91cGRhdGUoKX1wcm9qZWN0KHQpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KGUuTi5jb252ZXJ0KHQpLHRoaXMuc3R5bGUmJnRoaXMudGVycmFpbil9dW5wcm9qZWN0KHQpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKGUuUC5jb252ZXJ0KHQpLHRoaXMudGVycmFpbil9aXNNb3ZpbmcoKXt2YXIgdDtyZXR1cm4gdGhpcy5fbW92aW5nfHwobnVsbD09PSh0PXRoaXMuaGFuZGxlcnMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmlzTW92aW5nKCkpfWlzWm9vbWluZygpe3ZhciB0O3JldHVybiB0aGlzLl96b29taW5nfHwobnVsbD09PSh0PXRoaXMuaGFuZGxlcnMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmlzWm9vbWluZygpKX1pc1JvdGF0aW5nKCl7dmFyIHQ7cmV0dXJuIHRoaXMuX3JvdGF0aW5nfHwobnVsbD09PSh0PXRoaXMuaGFuZGxlcnMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmlzUm90YXRpbmcoKSl9X2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHQsZSxpKXtpZihcIm1vdXNlZW50ZXJcIj09PXR8fFwibW91c2VvdmVyXCI9PT10KXtsZXQgYT0hMTtjb25zdCBzPXM9Pntjb25zdCBvPWUuZmlsdGVyKCh0PT50aGlzLmdldExheWVyKHQpKSkscj0wIT09by5sZW5ndGg/dGhpcy5xdWVyeVJlbmRlcmVkRmVhdHVyZXMocy5wb2ludCx7bGF5ZXJzOm99KTpbXTtyLmxlbmd0aD9hfHwoYT0hMCxpLmNhbGwodGhpcyxuZXcga2EodCx0aGlzLHMub3JpZ2luYWxFdmVudCx7ZmVhdHVyZXM6cn0pKSk6YT0hMTt9O3JldHVybiB7bGF5ZXJzOmUsbGlzdGVuZXI6aSxkZWxlZ2F0ZXM6e21vdXNlbW92ZTpzLG1vdXNlb3V0OigpPT57YT0hMTt9fX19aWYoXCJtb3VzZWxlYXZlXCI9PT10fHxcIm1vdXNlb3V0XCI9PT10KXtsZXQgYT0hMTtjb25zdCBzPXM9Pntjb25zdCBvPWUuZmlsdGVyKCh0PT50aGlzLmdldExheWVyKHQpKSk7KDAhPT1vLmxlbmd0aD90aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhzLnBvaW50LHtsYXllcnM6b30pOltdKS5sZW5ndGg/YT0hMDphJiYoYT0hMSxpLmNhbGwodGhpcyxuZXcga2EodCx0aGlzLHMub3JpZ2luYWxFdmVudCkpKTt9LG89ZT0+e2EmJihhPSExLGkuY2FsbCh0aGlzLG5ldyBrYSh0LHRoaXMsZS5vcmlnaW5hbEV2ZW50KSkpO307cmV0dXJuIHtsYXllcnM6ZSxsaXN0ZW5lcjppLGRlbGVnYXRlczp7bW91c2Vtb3ZlOnMsbW91c2VvdXQ6b319fXtjb25zdCBhPXQ9Pntjb25zdCBhPWUuZmlsdGVyKCh0PT50aGlzLmdldExheWVyKHQpKSkscz0wIT09YS5sZW5ndGg/dGhpcy5xdWVyeVJlbmRlcmVkRmVhdHVyZXModC5wb2ludCx7bGF5ZXJzOmF9KTpbXTtzLmxlbmd0aCYmKHQuZmVhdHVyZXM9cyxpLmNhbGwodGhpcyx0KSxkZWxldGUgdC5mZWF0dXJlcyk7fTtyZXR1cm4ge2xheWVyczplLGxpc3RlbmVyOmksZGVsZWdhdGVzOntbdF06YX19fX1fc2F2ZURlbGVnYXRlZExpc3RlbmVyKHQsZSl7dGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzPXRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc3x8e30sdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW3RdPXRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0XXx8W10sdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW3RdLnB1c2goZSk7fV9yZW1vdmVEZWxlZ2F0ZWRMaXN0ZW5lcih0LGUsaSl7aWYoIXRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc3x8IXRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0XSlyZXR1cm47Y29uc3QgYT10aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdF07Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDt0Kyspe2NvbnN0IHM9YVt0XTtpZihzLmxpc3RlbmVyPT09aSYmcy5sYXllcnMubGVuZ3RoPT09ZS5sZW5ndGgmJnMubGF5ZXJzLmV2ZXJ5KCh0PT5lLmluY2x1ZGVzKHQpKSkpe2Zvcihjb25zdCB0IGluIHMuZGVsZWdhdGVzKXRoaXMub2ZmKHQscy5kZWxlZ2F0ZXNbdF0pO3JldHVybiB2b2lkIGEuc3BsaWNlKHQsMSl9fX1vbih0LGUsaSl7aWYodm9pZCAwPT09aSlyZXR1cm4gc3VwZXIub24odCxlKTtjb25zdCBhPXRoaXMuX2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHQsXCJzdHJpbmdcIj09dHlwZW9mIGU/W2VdOmUsaSk7dGhpcy5fc2F2ZURlbGVnYXRlZExpc3RlbmVyKHQsYSk7Zm9yKGNvbnN0IHQgaW4gYS5kZWxlZ2F0ZXMpdGhpcy5vbih0LGEuZGVsZWdhdGVzW3RdKTtyZXR1cm4gdGhpc31vbmNlKHQsZSxpKXtpZih2b2lkIDA9PT1pKXJldHVybiBzdXBlci5vbmNlKHQsZSk7Y29uc3QgYT1cInN0cmluZ1wiPT10eXBlb2YgZT9bZV06ZSxzPXRoaXMuX2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHQsYSxpKTtmb3IoY29uc3QgZSBpbiBzLmRlbGVnYXRlcyl7Y29uc3Qgbz1zLmRlbGVnYXRlc1tlXTtzLmRlbGVnYXRlc1tlXT0oLi4uZSk9Pnt0aGlzLl9yZW1vdmVEZWxlZ2F0ZWRMaXN0ZW5lcih0LGEsaSksbyguLi5lKTt9O310aGlzLl9zYXZlRGVsZWdhdGVkTGlzdGVuZXIodCxzKTtmb3IoY29uc3QgdCBpbiBzLmRlbGVnYXRlcyl0aGlzLm9uY2UodCxzLmRlbGVnYXRlc1t0XSk7cmV0dXJuIHRoaXN9b2ZmKHQsZSxpKXtyZXR1cm4gdm9pZCAwPT09aT9zdXBlci5vZmYodCxlKToodGhpcy5fcmVtb3ZlRGVsZWdhdGVkTGlzdGVuZXIodCxcInN0cmluZ1wiPT10eXBlb2YgZT9bZV06ZSxpKSx0aGlzKX1xdWVyeVJlbmRlcmVkRmVhdHVyZXModCxpKXtpZighdGhpcy5zdHlsZSlyZXR1cm4gW107bGV0IGE7Y29uc3Qgcz10IGluc3RhbmNlb2YgZS5QfHxBcnJheS5pc0FycmF5KHQpLG89cz90OltbMCwwXSxbdGhpcy50cmFuc2Zvcm0ud2lkdGgsdGhpcy50cmFuc2Zvcm0uaGVpZ2h0XV07aWYoaT1pfHwocz97fTp0KXx8e30sbyBpbnN0YW5jZW9mIGUuUHx8XCJudW1iZXJcIj09dHlwZW9mIG9bMF0pYT1bZS5QLmNvbnZlcnQobyldO2Vsc2Uge2NvbnN0IHQ9ZS5QLmNvbnZlcnQob1swXSksaT1lLlAuY29udmVydChvWzFdKTthPVt0LG5ldyBlLlAoaS54LHQueSksaSxuZXcgZS5QKHQueCxpLnkpLHRdO31yZXR1cm4gdGhpcy5zdHlsZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoYSxpLHRoaXMudHJhbnNmb3JtKX1xdWVyeVNvdXJjZUZlYXR1cmVzKHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUucXVlcnlTb3VyY2VGZWF0dXJlcyh0LGUpfXNldFN0eWxlKHQsaSl7cmV0dXJuICExIT09KGk9ZS5lKHt9LHtsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6dGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5LHZhbGlkYXRlOnRoaXMuX3ZhbGlkYXRlU3R5bGV9LGkpKS5kaWZmJiZpLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseT09PXRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSYmdGhpcy5zdHlsZSYmdD8odGhpcy5fZGlmZlN0eWxlKHQsaSksdGhpcyk6KHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseT1pLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSx0aGlzLl91cGRhdGVTdHlsZSh0LGkpKX1zZXRUcmFuc2Zvcm1SZXF1ZXN0KHQpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5zZXRUcmFuc2Zvcm1SZXF1ZXN0KHQpLHRoaXN9X2dldFVJU3RyaW5nKHQpe2NvbnN0IGU9dGhpcy5fbG9jYWxlW3RdO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFVJIHN0cmluZyAnJHt0fSdgKTtyZXR1cm4gZX1fdXBkYXRlU3R5bGUodCxlKXtpZihlLnRyYW5zZm9ybVN0eWxlJiZ0aGlzLnN0eWxlJiYhdGhpcy5zdHlsZS5fbG9hZGVkKXJldHVybiB2b2lkIHRoaXMuc3R5bGUub25jZShcInN0eWxlLmxvYWRcIiwoKCk9PnRoaXMuX3VwZGF0ZVN0eWxlKHQsZSkpKTtjb25zdCBpPXRoaXMuc3R5bGUmJmUudHJhbnNmb3JtU3R5bGU/dGhpcy5zdHlsZS5zZXJpYWxpemUoKTp2b2lkIDA7cmV0dXJuIHRoaXMuc3R5bGUmJih0aGlzLnN0eWxlLnNldEV2ZW50ZWRQYXJlbnQobnVsbCksdGhpcy5zdHlsZS5fcmVtb3ZlKCF0KSksdD8odGhpcy5zdHlsZT1uZXcgZGUodGhpcyxlfHx7fSksdGhpcy5zdHlsZS5zZXRFdmVudGVkUGFyZW50KHRoaXMse3N0eWxlOnRoaXMuc3R5bGV9KSxcInN0cmluZ1wiPT10eXBlb2YgdD90aGlzLnN0eWxlLmxvYWRVUkwodCxlLGkpOnRoaXMuc3R5bGUubG9hZEpTT04odCxlLGkpLHRoaXMpOihkZWxldGUgdGhpcy5zdHlsZSx0aGlzKX1fbGF6eUluaXRFbXB0eVN0eWxlKCl7dGhpcy5zdHlsZXx8KHRoaXMuc3R5bGU9bmV3IGRlKHRoaXMse30pLHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLHtzdHlsZTp0aGlzLnN0eWxlfSksdGhpcy5zdHlsZS5sb2FkRW1wdHkoKSk7fV9kaWZmU3R5bGUodCxpKXtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7Y29uc3QgYT10aGlzLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHQsXCJTdHlsZVwiKTtlLmgoYSxuZXcgQWJvcnRDb250cm9sbGVyKS50aGVuKCh0PT57dGhpcy5fdXBkYXRlRGlmZih0LmRhdGEsaSk7fSkpLmNhdGNoKCh0PT57dCYmdGhpcy5maXJlKG5ldyBlLmoodCkpO30pKTt9ZWxzZSBcIm9iamVjdFwiPT10eXBlb2YgdCYmdGhpcy5fdXBkYXRlRGlmZih0LGkpO31fdXBkYXRlRGlmZih0LGkpe3RyeXt0aGlzLnN0eWxlLnNldFN0YXRlKHQsaSkmJnRoaXMuX3VwZGF0ZSghMCk7fWNhdGNoKGEpe2UudyhgVW5hYmxlIHRvIHBlcmZvcm0gc3R5bGUgZGlmZjogJHthLm1lc3NhZ2V8fGEuZXJyb3J8fGF9LiAgUmVidWlsZGluZyB0aGUgc3R5bGUgZnJvbSBzY3JhdGNoLmApLHRoaXMuX3VwZGF0ZVN0eWxlKHQsaSk7fX1nZXRTdHlsZSgpe2lmKHRoaXMuc3R5bGUpcmV0dXJuIHRoaXMuc3R5bGUuc2VyaWFsaXplKCl9aXNTdHlsZUxvYWRlZCgpe3JldHVybiB0aGlzLnN0eWxlP3RoaXMuc3R5bGUubG9hZGVkKCk6ZS53KFwiVGhlcmUgaXMgbm8gc3R5bGUgYWRkZWQgdG8gdGhlIG1hcC5cIil9YWRkU291cmNlKHQsZSl7cmV0dXJuIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLHRoaXMuc3R5bGUuYWRkU291cmNlKHQsZSksdGhpcy5fdXBkYXRlKCEwKX1pc1NvdXJjZUxvYWRlZCh0KXtjb25zdCBpPXRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuc291cmNlQ2FjaGVzW3RdO2lmKHZvaWQgMCE9PWkpcmV0dXJuIGkubG9hZGVkKCk7dGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKGBUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCBJRCAnJHt0fSdgKSkpO31zZXRUZXJyYWluKHQpe2lmKHRoaXMuc3R5bGUuX2NoZWNrTG9hZGVkKCksdGhpcy5fdGVycmFpbkRhdGFDYWxsYmFjayYmdGhpcy5zdHlsZS5vZmYoXCJkYXRhXCIsdGhpcy5fdGVycmFpbkRhdGFDYWxsYmFjayksdCl7Y29uc3QgaT10aGlzLnN0eWxlLnNvdXJjZUNhY2hlc1t0LnNvdXJjZV07aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgbG9hZCB0ZXJyYWluLCBiZWNhdXNlIHRoZXJlIGV4aXN0cyBubyBzb3VyY2Ugd2l0aCBJRDogJHt0LnNvdXJjZX1gKTtudWxsPT09dGhpcy50ZXJyYWluJiZpLnJlbG9hZCgpO2Zvcihjb25zdCBpIGluIHRoaXMuc3R5bGUuX2xheWVycyl7Y29uc3QgYT10aGlzLnN0eWxlLl9sYXllcnNbaV07XCJoaWxsc2hhZGVcIj09PWEudHlwZSYmYS5zb3VyY2U9PT10LnNvdXJjZSYmZS53KFwiWW91IGFyZSB1c2luZyB0aGUgc2FtZSBzb3VyY2UgZm9yIGEgaGlsbHNoYWRlIGxheWVyIGFuZCBmb3IgM0QgdGVycmFpbi4gUGxlYXNlIGNvbnNpZGVyIHVzaW5nIHR3byBzZXBhcmF0ZSBzb3VyY2VzIHRvIGltcHJvdmUgcmVuZGVyaW5nIHF1YWxpdHkuXCIpO310aGlzLnRlcnJhaW49bmV3IERzKHRoaXMucGFpbnRlcixpLHQpLHRoaXMucGFpbnRlci5yZW5kZXJUb1RleHR1cmU9bmV3IFJzKHRoaXMucGFpbnRlcix0aGlzLnRlcnJhaW4pLHRoaXMudHJhbnNmb3JtLm1pbkVsZXZhdGlvbkZvckN1cnJlbnRUaWxlPXRoaXMudGVycmFpbi5nZXRNaW5UaWxlRWxldmF0aW9uRm9yTG5nTGF0Wm9vbSh0aGlzLnRyYW5zZm9ybS5jZW50ZXIsdGhpcy50cmFuc2Zvcm0udGlsZVpvb20pLHRoaXMudHJhbnNmb3JtLmVsZXZhdGlvbj10aGlzLnRlcnJhaW4uZ2V0RWxldmF0aW9uRm9yTG5nTGF0Wm9vbSh0aGlzLnRyYW5zZm9ybS5jZW50ZXIsdGhpcy50cmFuc2Zvcm0udGlsZVpvb20pLHRoaXMuX3RlcnJhaW5EYXRhQ2FsbGJhY2s9ZT0+e1wic3R5bGVcIj09PWUuZGF0YVR5cGU/dGhpcy50ZXJyYWluLnNvdXJjZUNhY2hlLmZyZWVSdHQoKTpcInNvdXJjZVwiPT09ZS5kYXRhVHlwZSYmZS50aWxlJiYoZS5zb3VyY2VJZCE9PXQuc291cmNlfHx0aGlzLl9lbGV2YXRpb25GcmVlemV8fCh0aGlzLnRyYW5zZm9ybS5taW5FbGV2YXRpb25Gb3JDdXJyZW50VGlsZT10aGlzLnRlcnJhaW4uZ2V0TWluVGlsZUVsZXZhdGlvbkZvckxuZ0xhdFpvb20odGhpcy50cmFuc2Zvcm0uY2VudGVyLHRoaXMudHJhbnNmb3JtLnRpbGVab29tKSx0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb249dGhpcy50ZXJyYWluLmdldEVsZXZhdGlvbkZvckxuZ0xhdFpvb20odGhpcy50cmFuc2Zvcm0uY2VudGVyLHRoaXMudHJhbnNmb3JtLnRpbGVab29tKSksdGhpcy50ZXJyYWluLnNvdXJjZUNhY2hlLmZyZWVSdHQoZS50aWxlLnRpbGVJRCkpO30sdGhpcy5zdHlsZS5vbihcImRhdGFcIix0aGlzLl90ZXJyYWluRGF0YUNhbGxiYWNrKTt9ZWxzZSB0aGlzLnRlcnJhaW4mJnRoaXMudGVycmFpbi5zb3VyY2VDYWNoZS5kZXN0cnVjdCgpLHRoaXMudGVycmFpbj1udWxsLHRoaXMucGFpbnRlci5yZW5kZXJUb1RleHR1cmUmJnRoaXMucGFpbnRlci5yZW5kZXJUb1RleHR1cmUuZGVzdHJ1Y3QoKSx0aGlzLnBhaW50ZXIucmVuZGVyVG9UZXh0dXJlPW51bGwsdGhpcy50cmFuc2Zvcm0ubWluRWxldmF0aW9uRm9yQ3VycmVudFRpbGU9MCx0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb249MDtyZXR1cm4gdGhpcy5maXJlKG5ldyBlLmsoXCJ0ZXJyYWluXCIse3RlcnJhaW46dH0pKSx0aGlzfWdldFRlcnJhaW4oKXt2YXIgdCxlO3JldHVybiBudWxsIT09KGU9bnVsbD09PSh0PXRoaXMudGVycmFpbil8fHZvaWQgMD09PXQ/dm9pZCAwOnQub3B0aW9ucykmJnZvaWQgMCE9PWU/ZTpudWxsfWFyZVRpbGVzTG9hZGVkKCl7Y29uc3QgdD10aGlzLnN0eWxlJiZ0aGlzLnN0eWxlLnNvdXJjZUNhY2hlcztmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBpPXRbZV0uX3RpbGVzO2Zvcihjb25zdCB0IGluIGkpe2NvbnN0IGU9aVt0XTtpZihcImxvYWRlZFwiIT09ZS5zdGF0ZSYmXCJlcnJvcmVkXCIhPT1lLnN0YXRlKXJldHVybiAhMX19cmV0dXJuICEwfXJlbW92ZVNvdXJjZSh0KXtyZXR1cm4gdGhpcy5zdHlsZS5yZW1vdmVTb3VyY2UodCksdGhpcy5fdXBkYXRlKCEwKX1nZXRTb3VyY2UodCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKHQpfWFkZEltYWdlKHQsaSxhPXt9KXtjb25zdHtwaXhlbFJhdGlvOnM9MSxzZGY6cj0hMSxzdHJldGNoWDpuLHN0cmV0Y2hZOmwsY29udGVudDpoLHRleHRGaXRXaWR0aDpjLHRleHRGaXRIZWlnaHQ6dX09YTtpZih0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKSwhKGkgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHxlLmIoaSkpKXtpZih2b2lkIDA9PT1pLndpZHRofHx2b2lkIDA9PT1pLmhlaWdodClyZXR1cm4gdGhpcy5maXJlKG5ldyBlLmoobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgdG8gbWFwLmFkZEltYWdlKCkuIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBgSW1hZ2VCaXRtYXBgLCBvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgXCIpKSk7e2NvbnN0e3dpZHRoOmEsaGVpZ2h0Om8sZGF0YTpkfT1pLF89aTtyZXR1cm4gdGhpcy5zdHlsZS5hZGRJbWFnZSh0LHtkYXRhOm5ldyBlLlIoe3dpZHRoOmEsaGVpZ2h0Om99LG5ldyBVaW50OEFycmF5KGQpKSxwaXhlbFJhdGlvOnMsc3RyZXRjaFg6bixzdHJldGNoWTpsLGNvbnRlbnQ6aCx0ZXh0Rml0V2lkdGg6Yyx0ZXh0Rml0SGVpZ2h0OnUsc2RmOnIsdmVyc2lvbjowLHVzZXJJbWFnZTpffSksXy5vbkFkZCYmXy5vbkFkZCh0aGlzLHQpLHRoaXN9fXtjb25zdHt3aWR0aDphLGhlaWdodDpkLGRhdGE6X309by5nZXRJbWFnZURhdGEoaSk7dGhpcy5zdHlsZS5hZGRJbWFnZSh0LHtkYXRhOm5ldyBlLlIoe3dpZHRoOmEsaGVpZ2h0OmR9LF8pLHBpeGVsUmF0aW86cyxzdHJldGNoWDpuLHN0cmV0Y2hZOmwsY29udGVudDpoLHRleHRGaXRXaWR0aDpjLHRleHRGaXRIZWlnaHQ6dSxzZGY6cix2ZXJzaW9uOjB9KTt9fXVwZGF0ZUltYWdlKHQsaSl7Y29uc3QgYT10aGlzLnN0eWxlLmdldEltYWdlKHQpO2lmKCFhKXJldHVybiB0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoXCJUaGUgbWFwIGhhcyBubyBpbWFnZSB3aXRoIHRoYXQgaWQuIElmIHlvdSBhcmUgYWRkaW5nIGEgbmV3IGltYWdlIHVzZSBgbWFwLmFkZEltYWdlKC4uLilgIGluc3RlYWQuXCIpKSk7Y29uc3Qgcz1pIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8ZS5iKGkpP28uZ2V0SW1hZ2VEYXRhKGkpOmkse3dpZHRoOnIsaGVpZ2h0Om4sZGF0YTpsfT1zO2lmKHZvaWQgMD09PXJ8fHZvaWQgMD09PW4pcmV0dXJuIHRoaXMuZmlyZShuZXcgZS5qKG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHRvIG1hcC51cGRhdGVJbWFnZSgpLiBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBgSW1hZ2VEYXRhYCwgYEltYWdlQml0bWFwYCwgb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWAgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyBgSW1hZ2VEYXRhYFwiKSkpO2lmKHIhPT1hLmRhdGEud2lkdGh8fG4hPT1hLmRhdGEuaGVpZ2h0KXJldHVybiB0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoXCJUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdXBkYXRlZCBpbWFnZSBtdXN0IGJlIHRoYXQgc2FtZSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgaW1hZ2VcIikpKTtjb25zdCBoPSEoaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fGUuYihpKSk7cmV0dXJuIGEuZGF0YS5yZXBsYWNlKGwsaCksdGhpcy5zdHlsZS51cGRhdGVJbWFnZSh0LGEpLHRoaXN9Z2V0SW1hZ2UodCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0SW1hZ2UodCl9aGFzSW1hZ2UodCl7cmV0dXJuIHQ/ISF0aGlzLnN0eWxlLmdldEltYWdlKHQpOih0aGlzLmZpcmUobmV3IGUuaihuZXcgRXJyb3IoXCJNaXNzaW5nIHJlcXVpcmVkIGltYWdlIGlkXCIpKSksITEpfXJlbW92ZUltYWdlKHQpe3RoaXMuc3R5bGUucmVtb3ZlSW1hZ2UodCk7fWxvYWRJbWFnZSh0KXtyZXR1cm4gXy5nZXRJbWFnZSh0aGlzLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHQsXCJJbWFnZVwiKSxuZXcgQWJvcnRDb250cm9sbGVyKX1saXN0SW1hZ2VzKCl7cmV0dXJuIHRoaXMuc3R5bGUubGlzdEltYWdlcygpfWFkZExheWVyKHQsZSl7cmV0dXJuIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLHRoaXMuc3R5bGUuYWRkTGF5ZXIodCxlKSx0aGlzLl91cGRhdGUoITApfW1vdmVMYXllcih0LGUpe3JldHVybiB0aGlzLnN0eWxlLm1vdmVMYXllcih0LGUpLHRoaXMuX3VwZGF0ZSghMCl9cmVtb3ZlTGF5ZXIodCl7cmV0dXJuIHRoaXMuc3R5bGUucmVtb3ZlTGF5ZXIodCksdGhpcy5fdXBkYXRlKCEwKX1nZXRMYXllcih0KXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXllcih0KX1nZXRMYXllcnNPcmRlcigpe3JldHVybiB0aGlzLnN0eWxlLmdldExheWVyc09yZGVyKCl9c2V0TGF5ZXJab29tUmFuZ2UodCxlLGkpe3JldHVybiB0aGlzLnN0eWxlLnNldExheWVyWm9vbVJhbmdlKHQsZSxpKSx0aGlzLl91cGRhdGUoITApfXNldEZpbHRlcih0LGUsaT17fSl7cmV0dXJuIHRoaXMuc3R5bGUuc2V0RmlsdGVyKHQsZSxpKSx0aGlzLl91cGRhdGUoITApfWdldEZpbHRlcih0KXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRGaWx0ZXIodCl9c2V0UGFpbnRQcm9wZXJ0eSh0LGUsaSxhPXt9KXtyZXR1cm4gdGhpcy5zdHlsZS5zZXRQYWludFByb3BlcnR5KHQsZSxpLGEpLHRoaXMuX3VwZGF0ZSghMCl9Z2V0UGFpbnRQcm9wZXJ0eSh0LGUpe3JldHVybiB0aGlzLnN0eWxlLmdldFBhaW50UHJvcGVydHkodCxlKX1zZXRMYXlvdXRQcm9wZXJ0eSh0LGUsaSxhPXt9KXtyZXR1cm4gdGhpcy5zdHlsZS5zZXRMYXlvdXRQcm9wZXJ0eSh0LGUsaSxhKSx0aGlzLl91cGRhdGUoITApfWdldExheW91dFByb3BlcnR5KHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGF5b3V0UHJvcGVydHkodCxlKX1zZXRHbHlwaHModCxlPXt9KXtyZXR1cm4gdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCksdGhpcy5zdHlsZS5zZXRHbHlwaHModCxlKSx0aGlzLl91cGRhdGUoITApfWdldEdseXBocygpe3JldHVybiB0aGlzLnN0eWxlLmdldEdseXBoc1VybCgpfWFkZFNwcml0ZSh0LGUsaT17fSl7cmV0dXJuIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLHRoaXMuc3R5bGUuYWRkU3ByaXRlKHQsZSxpLCh0PT57dHx8dGhpcy5fdXBkYXRlKCEwKTt9KSksdGhpc31yZW1vdmVTcHJpdGUodCl7cmV0dXJuIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLHRoaXMuc3R5bGUucmVtb3ZlU3ByaXRlKHQpLHRoaXMuX3VwZGF0ZSghMCl9Z2V0U3ByaXRlKCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0U3ByaXRlKCl9c2V0U3ByaXRlKHQsZT17fSl7cmV0dXJuIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLHRoaXMuc3R5bGUuc2V0U3ByaXRlKHQsZSwodD0+e3R8fHRoaXMuX3VwZGF0ZSghMCk7fSkpLHRoaXN9c2V0TGlnaHQodCxlPXt9KXtyZXR1cm4gdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCksdGhpcy5zdHlsZS5zZXRMaWdodCh0LGUpLHRoaXMuX3VwZGF0ZSghMCl9Z2V0TGlnaHQoKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRMaWdodCgpfXNldFNreSh0KXtyZXR1cm4gdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCksdGhpcy5zdHlsZS5zZXRTa3kodCksdGhpcy5fdXBkYXRlKCEwKX1nZXRTa3koKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRTa3koKX1zZXRGZWF0dXJlU3RhdGUodCxlKXtyZXR1cm4gdGhpcy5zdHlsZS5zZXRGZWF0dXJlU3RhdGUodCxlKSx0aGlzLl91cGRhdGUoKX1yZW1vdmVGZWF0dXJlU3RhdGUodCxlKXtyZXR1cm4gdGhpcy5zdHlsZS5yZW1vdmVGZWF0dXJlU3RhdGUodCxlKSx0aGlzLl91cGRhdGUoKX1nZXRGZWF0dXJlU3RhdGUodCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0RmVhdHVyZVN0YXRlKHQpfWdldENvbnRhaW5lcigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9Z2V0Q2FudmFzQ29udGFpbmVyKCl7cmV0dXJuIHRoaXMuX2NhbnZhc0NvbnRhaW5lcn1nZXRDYW52YXMoKXtyZXR1cm4gdGhpcy5fY2FudmFzfV9jb250YWluZXJEaW1lbnNpb25zKCl7bGV0IHQ9MCxlPTA7cmV0dXJuIHRoaXMuX2NvbnRhaW5lciYmKHQ9dGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRofHw0MDAsZT10aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0fHwzMDApLFt0LGVdfV9zZXR1cENvbnRhaW5lcigpe2NvbnN0IHQ9dGhpcy5fY29udGFpbmVyO3QuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtbWFwXCIpO2NvbnN0IGU9dGhpcy5fY2FudmFzQ29udGFpbmVyPXIuY3JlYXRlKFwiZGl2XCIsXCJtYXBsaWJyZWdsLWNhbnZhcy1jb250YWluZXJcIix0KTt0aGlzLl9pbnRlcmFjdGl2ZSYmZS5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1pbnRlcmFjdGl2ZVwiKSx0aGlzLl9jYW52YXM9ci5jcmVhdGUoXCJjYW52YXNcIixcIm1hcGxpYnJlZ2wtY2FudmFzXCIsZSksdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsdGhpcy5fY29udGV4dExvc3QsITEpLHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIix0aGlzLl9jb250ZXh0UmVzdG9yZWQsITEpLHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLHRoaXMuX2ludGVyYWN0aXZlP1wiMFwiOlwiLTFcIiksdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIix0aGlzLl9nZXRVSVN0cmluZyhcIk1hcC5UaXRsZVwiKSksdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZShcInJvbGVcIixcInJlZ2lvblwiKTtjb25zdCBpPXRoaXMuX2NvbnRhaW5lckRpbWVuc2lvbnMoKSxhPXRoaXMuX2dldENsYW1wZWRQaXhlbFJhdGlvKGlbMF0saVsxXSk7dGhpcy5fcmVzaXplQ2FudmFzKGlbMF0saVsxXSxhKTtjb25zdCBzPXRoaXMuX2NvbnRyb2xDb250YWluZXI9ci5jcmVhdGUoXCJkaXZcIixcIm1hcGxpYnJlZ2wtY29udHJvbC1jb250YWluZXJcIix0KSxvPXRoaXMuX2NvbnRyb2xQb3NpdGlvbnM9e307W1widG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiYm90dG9tLWxlZnRcIixcImJvdHRvbS1yaWdodFwiXS5mb3JFYWNoKCh0PT57b1t0XT1yLmNyZWF0ZShcImRpdlwiLGBtYXBsaWJyZWdsLWN0cmwtJHt0fSBgLHMpO30pKSx0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLHRoaXMuX29uTWFwU2Nyb2xsLCExKTt9X3Jlc2l6ZUNhbnZhcyh0LGUsaSl7dGhpcy5fY2FudmFzLndpZHRoPU1hdGguZmxvb3IoaSp0KSx0aGlzLl9jYW52YXMuaGVpZ2h0PU1hdGguZmxvb3IoaSplKSx0aGlzLl9jYW52YXMuc3R5bGUud2lkdGg9YCR7dH1weGAsdGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodD1gJHtlfXB4YDt9X3NldHVwUGFpbnRlcigpe2NvbnN0IHQ9e2FscGhhOiEwLHN0ZW5jaWw6ITAsZGVwdGg6ITAsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDp0aGlzLl9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0LHByZXNlcnZlRHJhd2luZ0J1ZmZlcjp0aGlzLl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsYW50aWFsaWFzOnRoaXMuX2FudGlhbGlhc3x8ITF9O2xldCBlPW51bGw7dGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yXCIsKGk9PntlPXtyZXF1ZXN0ZWRBdHRyaWJ1dGVzOnR9LGkmJihlLnN0YXR1c01lc3NhZ2U9aS5zdGF0dXNNZXNzYWdlLGUudHlwZT1pLnR5cGUpO30pLHtvbmNlOiEwfSk7Y29uc3QgaT10aGlzLl9jYW52YXMuZ2V0Q29udGV4dChcIndlYmdsMlwiLHQpfHx0aGlzLl9jYW52YXMuZ2V0Q29udGV4dChcIndlYmdsXCIsdCk7aWYoIWkpe2NvbnN0IHQ9XCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTFwiO3Rocm93IGU/KGUubWVzc2FnZT10LG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlKSkpOm5ldyBFcnJvcih0KX10aGlzLnBhaW50ZXI9bmV3IHZhKGksdGhpcy50cmFuc2Zvcm0pLG4udGVzdFN1cHBvcnQoaSk7fWxvYWRlZCgpe3JldHVybiAhdGhpcy5fc3R5bGVEaXJ0eSYmIXRoaXMuX3NvdXJjZXNEaXJ0eSYmISF0aGlzLnN0eWxlJiZ0aGlzLnN0eWxlLmxvYWRlZCgpfV91cGRhdGUodCl7cmV0dXJuIHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuX2xvYWRlZD8odGhpcy5fc3R5bGVEaXJ0eT10aGlzLl9zdHlsZURpcnR5fHx0LHRoaXMuX3NvdXJjZXNEaXJ0eT0hMCx0aGlzLnRyaWdnZXJSZXBhaW50KCksdGhpcyk6dGhpc31fcmVxdWVzdFJlbmRlckZyYW1lKHQpe3JldHVybiB0aGlzLl91cGRhdGUoKSx0aGlzLl9yZW5kZXJUYXNrUXVldWUuYWRkKHQpfV9jYW5jZWxSZW5kZXJGcmFtZSh0KXt0aGlzLl9yZW5kZXJUYXNrUXVldWUucmVtb3ZlKHQpO31fcmVuZGVyKHQpe2NvbnN0IGk9dGhpcy5faWRsZVRyaWdnZXJlZD90aGlzLl9mYWRlRHVyYXRpb246MDtpZih0aGlzLnBhaW50ZXIuY29udGV4dC5zZXREaXJ0eSgpLHRoaXMucGFpbnRlci5zZXRCYXNlU3RhdGUoKSx0aGlzLl9yZW5kZXJUYXNrUXVldWUucnVuKHQpLHRoaXMuX3JlbW92ZWQpcmV0dXJuO2xldCBhPSExO2lmKHRoaXMuc3R5bGUmJnRoaXMuX3N0eWxlRGlydHkpe3RoaXMuX3N0eWxlRGlydHk9ITE7Y29uc3QgdD10aGlzLnRyYW5zZm9ybS56b29tLHM9by5ub3coKTt0aGlzLnN0eWxlLnpvb21IaXN0b3J5LnVwZGF0ZSh0LHMpO2NvbnN0IHI9bmV3IGUueih0LHtub3c6cyxmYWRlRHVyYXRpb246aSx6b29tSGlzdG9yeTp0aGlzLnN0eWxlLnpvb21IaXN0b3J5LHRyYW5zaXRpb246dGhpcy5zdHlsZS5nZXRUcmFuc2l0aW9uKCl9KSxuPXIuY3Jvc3NGYWRpbmdGYWN0b3IoKTsxPT09biYmbj09PXRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yfHwoYT0hMCx0aGlzLl9jcm9zc0ZhZGluZ0ZhY3Rvcj1uKSx0aGlzLnN0eWxlLnVwZGF0ZShyKTt9dGhpcy5zdHlsZSYmdGhpcy5fc291cmNlc0RpcnR5JiYodGhpcy5fc291cmNlc0RpcnR5PSExLHRoaXMuc3R5bGUuX3VwZGF0ZVNvdXJjZXModGhpcy50cmFuc2Zvcm0pKSx0aGlzLnRlcnJhaW4/KHRoaXMudGVycmFpbi5zb3VyY2VDYWNoZS51cGRhdGUodGhpcy50cmFuc2Zvcm0sdGhpcy50ZXJyYWluKSx0aGlzLnRyYW5zZm9ybS5taW5FbGV2YXRpb25Gb3JDdXJyZW50VGlsZT10aGlzLnRlcnJhaW4uZ2V0TWluVGlsZUVsZXZhdGlvbkZvckxuZ0xhdFpvb20odGhpcy50cmFuc2Zvcm0uY2VudGVyLHRoaXMudHJhbnNmb3JtLnRpbGVab29tKSx0aGlzLl9lbGV2YXRpb25GcmVlemV8fCh0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb249dGhpcy50ZXJyYWluLmdldEVsZXZhdGlvbkZvckxuZ0xhdFpvb20odGhpcy50cmFuc2Zvcm0uY2VudGVyLHRoaXMudHJhbnNmb3JtLnRpbGVab29tKSkpOih0aGlzLnRyYW5zZm9ybS5taW5FbGV2YXRpb25Gb3JDdXJyZW50VGlsZT0wLHRoaXMudHJhbnNmb3JtLmVsZXZhdGlvbj0wKSx0aGlzLl9wbGFjZW1lbnREaXJ0eT10aGlzLnN0eWxlJiZ0aGlzLnN0eWxlLl91cGRhdGVQbGFjZW1lbnQodGhpcy5wYWludGVyLnRyYW5zZm9ybSx0aGlzLnNob3dDb2xsaXNpb25Cb3hlcyxpLHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyksdGhpcy5wYWludGVyLnJlbmRlcih0aGlzLnN0eWxlLHtzaG93VGlsZUJvdW5kYXJpZXM6dGhpcy5zaG93VGlsZUJvdW5kYXJpZXMsc2hvd092ZXJkcmF3SW5zcGVjdG9yOnRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcixyb3RhdGluZzp0aGlzLmlzUm90YXRpbmcoKSx6b29taW5nOnRoaXMuaXNab29taW5nKCksbW92aW5nOnRoaXMuaXNNb3ZpbmcoKSxmYWRlRHVyYXRpb246aSxzaG93UGFkZGluZzp0aGlzLnNob3dQYWRkaW5nfSksdGhpcy5maXJlKG5ldyBlLmsoXCJyZW5kZXJcIikpLHRoaXMubG9hZGVkKCkmJiF0aGlzLl9sb2FkZWQmJih0aGlzLl9sb2FkZWQ9ITAsZS5iZi5tYXJrKGUuYmcubG9hZCksdGhpcy5maXJlKG5ldyBlLmsoXCJsb2FkXCIpKSksdGhpcy5zdHlsZSYmKHRoaXMuc3R5bGUuaGFzVHJhbnNpdGlvbnMoKXx8YSkmJih0aGlzLl9zdHlsZURpcnR5PSEwKSx0aGlzLnN0eWxlJiYhdGhpcy5fcGxhY2VtZW50RGlydHkmJnRoaXMuc3R5bGUuX3JlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKTtjb25zdCBzPXRoaXMuX3NvdXJjZXNEaXJ0eXx8dGhpcy5fc3R5bGVEaXJ0eXx8dGhpcy5fcGxhY2VtZW50RGlydHk7cmV0dXJuIHN8fHRoaXMuX3JlcGFpbnQ/dGhpcy50cmlnZ2VyUmVwYWludCgpOiF0aGlzLmlzTW92aW5nKCkmJnRoaXMubG9hZGVkKCkmJnRoaXMuZmlyZShuZXcgZS5rKFwiaWRsZVwiKSksIXRoaXMuX2xvYWRlZHx8dGhpcy5fZnVsbHlMb2FkZWR8fHN8fCh0aGlzLl9mdWxseUxvYWRlZD0hMCxlLmJmLm1hcmsoZS5iZy5mdWxsTG9hZCkpLHRoaXN9cmVkcmF3KCl7cmV0dXJuIHRoaXMuc3R5bGUmJih0aGlzLl9mcmFtZVJlcXVlc3QmJih0aGlzLl9mcmFtZVJlcXVlc3QuYWJvcnQoKSx0aGlzLl9mcmFtZVJlcXVlc3Q9bnVsbCksdGhpcy5fcmVuZGVyKDApKSx0aGlzfXJlbW92ZSgpe3ZhciB0O3RoaXMuX2hhc2gmJnRoaXMuX2hhc2gucmVtb3ZlKCk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fY29udHJvbHMpdC5vblJlbW92ZSh0aGlzKTt0aGlzLl9jb250cm9scz1bXSx0aGlzLl9mcmFtZVJlcXVlc3QmJih0aGlzLl9mcmFtZVJlcXVlc3QuYWJvcnQoKSx0aGlzLl9mcmFtZVJlcXVlc3Q9bnVsbCksdGhpcy5fcmVuZGVyVGFza1F1ZXVlLmNsZWFyKCksdGhpcy5wYWludGVyLmRlc3Ryb3koKSx0aGlzLmhhbmRsZXJzLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5oYW5kbGVycyx0aGlzLnNldFN0eWxlKG51bGwpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIix0aGlzLl9vbldpbmRvd09ubGluZSwhMSksXy5yZW1vdmVUaHJvdHRsZUNvbnRyb2wodGhpcy5faW1hZ2VRdWV1ZUhhbmRsZSksbnVsbD09PSh0PXRoaXMuX3Jlc2l6ZU9ic2VydmVyKXx8dm9pZCAwPT09dHx8dC5kaXNjb25uZWN0KCk7Y29uc3QgaT10aGlzLnBhaW50ZXIuY29udGV4dC5nbC5nZXRFeHRlbnNpb24oXCJXRUJHTF9sb3NlX2NvbnRleHRcIik7KG51bGw9PWk/dm9pZCAwOmkubG9zZUNvbnRleHQpJiZpLmxvc2VDb250ZXh0KCksdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRyZXN0b3JlZFwiLHRoaXMuX2NvbnRleHRSZXN0b3JlZCwhMSksdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsdGhpcy5fY29udGV4dExvc3QsITEpLHIucmVtb3ZlKHRoaXMuX2NhbnZhc0NvbnRhaW5lciksci5yZW1vdmUodGhpcy5fY29udHJvbENvbnRhaW5lciksdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLW1hcFwiKSxlLmJmLmNsZWFyTWV0cmljcygpLHRoaXMuX3JlbW92ZWQ9ITAsdGhpcy5maXJlKG5ldyBlLmsoXCJyZW1vdmVcIikpO310cmlnZ2VyUmVwYWludCgpe3RoaXMuc3R5bGUmJiF0aGlzLl9mcmFtZVJlcXVlc3QmJih0aGlzLl9mcmFtZVJlcXVlc3Q9bmV3IEFib3J0Q29udHJvbGxlcixvLmZyYW1lQXN5bmModGhpcy5fZnJhbWVSZXF1ZXN0KS50aGVuKCh0PT57ZS5iZi5mcmFtZSh0KSx0aGlzLl9mcmFtZVJlcXVlc3Q9bnVsbCx0aGlzLl9yZW5kZXIodCk7fSkpLmNhdGNoKCgoKT0+e30pKSk7fWdldCBzaG93VGlsZUJvdW5kYXJpZXMoKXtyZXR1cm4gISF0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXN9c2V0IHNob3dUaWxlQm91bmRhcmllcyh0KXt0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXMhPT10JiYodGhpcy5fc2hvd1RpbGVCb3VuZGFyaWVzPXQsdGhpcy5fdXBkYXRlKCkpO31nZXQgc2hvd1BhZGRpbmcoKXtyZXR1cm4gISF0aGlzLl9zaG93UGFkZGluZ31zZXQgc2hvd1BhZGRpbmcodCl7dGhpcy5fc2hvd1BhZGRpbmchPT10JiYodGhpcy5fc2hvd1BhZGRpbmc9dCx0aGlzLl91cGRhdGUoKSk7fWdldCBzaG93Q29sbGlzaW9uQm94ZXMoKXtyZXR1cm4gISF0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXN9c2V0IHNob3dDb2xsaXNpb25Cb3hlcyh0KXt0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMhPT10JiYodGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzPXQsdD90aGlzLnN0eWxlLl9nZW5lcmF0ZUNvbGxpc2lvbkJveGVzKCk6dGhpcy5fdXBkYXRlKCkpO31nZXQgc2hvd092ZXJkcmF3SW5zcGVjdG9yKCl7cmV0dXJuICEhdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yfXNldCBzaG93T3ZlcmRyYXdJbnNwZWN0b3IodCl7dGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yIT09dCYmKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcj10LHRoaXMuX3VwZGF0ZSgpKTt9Z2V0IHJlcGFpbnQoKXtyZXR1cm4gISF0aGlzLl9yZXBhaW50fXNldCByZXBhaW50KHQpe3RoaXMuX3JlcGFpbnQhPT10JiYodGhpcy5fcmVwYWludD10LHRoaXMudHJpZ2dlclJlcGFpbnQoKSk7fWdldCB2ZXJ0aWNlcygpe3JldHVybiAhIXRoaXMuX3ZlcnRpY2VzfXNldCB2ZXJ0aWNlcyh0KXt0aGlzLl92ZXJ0aWNlcz10LHRoaXMuX3VwZGF0ZSgpO31nZXQgdmVyc2lvbigpe3JldHVybiBMc31nZXRDYW1lcmFUYXJnZXRFbGV2YXRpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0uZWxldmF0aW9ufX0sdC5NYXBNb3VzZUV2ZW50PWthLHQuTWFwVG91Y2hFdmVudD1MYSx0Lk1hcFdoZWVsRXZlbnQ9RmEsdC5NYXJrZXI9VnMsdC5OYXZpZ2F0aW9uQ29udHJvbD1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl91cGRhdGVab29tQnV0dG9ucz0oKT0+e2NvbnN0IHQ9dGhpcy5fbWFwLmdldFpvb20oKSxlPXQ9PT10aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpLGk9dD09PXRoaXMuX21hcC5nZXRNaW5ab29tKCk7dGhpcy5fem9vbUluQnV0dG9uLmRpc2FibGVkPWUsdGhpcy5fem9vbU91dEJ1dHRvbi5kaXNhYmxlZD1pLHRoaXMuX3pvb21JbkJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIsZS50b1N0cmluZygpKSx0aGlzLl96b29tT3V0QnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIixpLnRvU3RyaW5nKCkpO30sdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93PSgpPT57Y29uc3QgdD10aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2g/YHNjYWxlKCR7MS9NYXRoLnBvdyhNYXRoLmNvcyh0aGlzLl9tYXAudHJhbnNmb3JtLnBpdGNoKihNYXRoLlBJLzE4MCkpLC41KX0pIHJvdGF0ZVgoJHt0aGlzLl9tYXAudHJhbnNmb3JtLnBpdGNofWRlZykgcm90YXRlWigke3RoaXMuX21hcC50cmFuc2Zvcm0uYW5nbGUqKDE4MC9NYXRoLlBJKX1kZWcpYDpgcm90YXRlKCR7dGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZSooMTgwL01hdGguUEkpfWRlZylgO3RoaXMuX2NvbXBhc3NJY29uLnN0eWxlLnRyYW5zZm9ybT10O30sdGhpcy5fc2V0QnV0dG9uVGl0bGU9KHQsZSk9Pntjb25zdCBpPXRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoYE5hdmlnYXRpb25Db250cm9sLiR7ZX1gKTt0LnRpdGxlPWksdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsaSk7fSx0aGlzLm9wdGlvbnM9ZS5lKHt9LE9zLHQpLHRoaXMuX2NvbnRhaW5lcj1yLmNyZWF0ZShcImRpdlwiLFwibWFwbGlicmVnbC1jdHJsIG1hcGxpYnJlZ2wtY3RybC1ncm91cFwiKSx0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsKHQ9PnQucHJldmVudERlZmF1bHQoKSkpLHRoaXMub3B0aW9ucy5zaG93Wm9vbSYmKHRoaXMuX3pvb21JbkJ1dHRvbj10aGlzLl9jcmVhdGVCdXR0b24oXCJtYXBsaWJyZWdsLWN0cmwtem9vbS1pblwiLCh0PT50aGlzLl9tYXAuem9vbUluKHt9LHtvcmlnaW5hbEV2ZW50OnR9KSkpLHIuY3JlYXRlKFwic3BhblwiLFwibWFwbGlicmVnbC1jdHJsLWljb25cIix0aGlzLl96b29tSW5CdXR0b24pLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLHRoaXMuX3pvb21PdXRCdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKFwibWFwbGlicmVnbC1jdHJsLXpvb20tb3V0XCIsKHQ9PnRoaXMuX21hcC56b29tT3V0KHt9LHtvcmlnaW5hbEV2ZW50OnR9KSkpLHIuY3JlYXRlKFwic3BhblwiLFwibWFwbGlicmVnbC1jdHJsLWljb25cIix0aGlzLl96b29tT3V0QnV0dG9uKS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSksdGhpcy5vcHRpb25zLnNob3dDb21wYXNzJiYodGhpcy5fY29tcGFzcz10aGlzLl9jcmVhdGVCdXR0b24oXCJtYXBsaWJyZWdsLWN0cmwtY29tcGFzc1wiLCh0PT57dGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoP3RoaXMuX21hcC5yZXNldE5vcnRoUGl0Y2goe30se29yaWdpbmFsRXZlbnQ6dH0pOnRoaXMuX21hcC5yZXNldE5vcnRoKHt9LHtvcmlnaW5hbEV2ZW50OnR9KTt9KSksdGhpcy5fY29tcGFzc0ljb249ci5jcmVhdGUoXCJzcGFuXCIsXCJtYXBsaWJyZWdsLWN0cmwtaWNvblwiLHRoaXMuX2NvbXBhc3MpLHRoaXMuX2NvbXBhc3NJY29uLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpKTt9b25BZGQodCl7cmV0dXJuIHRoaXMuX21hcD10LHRoaXMub3B0aW9ucy5zaG93Wm9vbSYmKHRoaXMuX3NldEJ1dHRvblRpdGxlKHRoaXMuX3pvb21JbkJ1dHRvbixcIlpvb21JblwiKSx0aGlzLl9zZXRCdXR0b25UaXRsZSh0aGlzLl96b29tT3V0QnV0dG9uLFwiWm9vbU91dFwiKSx0aGlzLl9tYXAub24oXCJ6b29tXCIsdGhpcy5fdXBkYXRlWm9vbUJ1dHRvbnMpLHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKCkpLHRoaXMub3B0aW9ucy5zaG93Q29tcGFzcyYmKHRoaXMuX3NldEJ1dHRvblRpdGxlKHRoaXMuX2NvbXBhc3MsXCJSZXNldEJlYXJpbmdcIiksdGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoJiZ0aGlzLl9tYXAub24oXCJwaXRjaFwiLHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyksdGhpcy5fbWFwLm9uKFwicm90YXRlXCIsdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KSx0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3coKSx0aGlzLl9oYW5kbGVyPW5ldyBOcyh0aGlzLl9tYXAsdGhpcy5fY29tcGFzcyx0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpKSx0aGlzLl9jb250YWluZXJ9b25SZW1vdmUoKXtyLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLHRoaXMub3B0aW9ucy5zaG93Wm9vbSYmdGhpcy5fbWFwLm9mZihcInpvb21cIix0aGlzLl91cGRhdGVab29tQnV0dG9ucyksdGhpcy5vcHRpb25zLnNob3dDb21wYXNzJiYodGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoJiZ0aGlzLl9tYXAub2ZmKFwicGl0Y2hcIix0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpLHRoaXMuX21hcC5vZmYoXCJyb3RhdGVcIix0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpLHRoaXMuX2hhbmRsZXIub2ZmKCksZGVsZXRlIHRoaXMuX2hhbmRsZXIpLGRlbGV0ZSB0aGlzLl9tYXA7fV9jcmVhdGVCdXR0b24odCxlKXtjb25zdCBpPXIuY3JlYXRlKFwiYnV0dG9uXCIsdCx0aGlzLl9jb250YWluZXIpO3JldHVybiBpLnR5cGU9XCJidXR0b25cIixpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGUpLGl9fSx0LlBvcHVwPWNsYXNzIGV4dGVuZHMgZS5Fe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5yZW1vdmU9KCk9Pih0aGlzLl9jb250ZW50JiZyLnJlbW92ZSh0aGlzLl9jb250ZW50KSx0aGlzLl9jb250YWluZXImJihyLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLGRlbGV0ZSB0aGlzLl9jb250YWluZXIpLHRoaXMuX21hcCYmKHRoaXMuX21hcC5vZmYoXCJtb3ZlXCIsdGhpcy5fdXBkYXRlKSx0aGlzLl9tYXAub2ZmKFwibW92ZVwiLHRoaXMuX29uQ2xvc2UpLHRoaXMuX21hcC5vZmYoXCJjbGlja1wiLHRoaXMuX29uQ2xvc2UpLHRoaXMuX21hcC5vZmYoXCJyZW1vdmVcIix0aGlzLnJlbW92ZSksdGhpcy5fbWFwLm9mZihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW91c2VNb3ZlKSx0aGlzLl9tYXAub2ZmKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCksdGhpcy5fbWFwLm9mZihcImRyYWdcIix0aGlzLl9vbkRyYWcpLHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLXRyYWNrLXBvaW50ZXJcIiksZGVsZXRlIHRoaXMuX21hcCx0aGlzLmZpcmUobmV3IGUuayhcImNsb3NlXCIpKSksdGhpcyksdGhpcy5fb25Nb3VzZVVwPXQ9Pnt0aGlzLl91cGRhdGUodC5wb2ludCk7fSx0aGlzLl9vbk1vdXNlTW92ZT10PT57dGhpcy5fdXBkYXRlKHQucG9pbnQpO30sdGhpcy5fb25EcmFnPXQ9Pnt0aGlzLl91cGRhdGUodC5wb2ludCk7fSx0aGlzLl91cGRhdGU9dD0+e3ZhciBlO2lmKCF0aGlzLl9tYXB8fCF0aGlzLl9sbmdMYXQmJiF0aGlzLl90cmFja1BvaW50ZXJ8fCF0aGlzLl9jb250ZW50KXJldHVybjtpZighdGhpcy5fY29udGFpbmVyKXtpZih0aGlzLl9jb250YWluZXI9ci5jcmVhdGUoXCJkaXZcIixcIm1hcGxpYnJlZ2wtcG9wdXBcIix0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkpLHRoaXMuX3RpcD1yLmNyZWF0ZShcImRpdlwiLFwibWFwbGlicmVnbC1wb3B1cC10aXBcIix0aGlzLl9jb250YWluZXIpLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jb250ZW50KSx0aGlzLm9wdGlvbnMuY2xhc3NOYW1lKWZvcihjb25zdCB0IG9mIHRoaXMub3B0aW9ucy5jbGFzc05hbWUuc3BsaXQoXCIgXCIpKXRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHQpO3RoaXMuX2Nsb3NlQnV0dG9uJiZ0aGlzLl9jbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsdGhpcy5fbWFwLl9nZXRVSVN0cmluZyhcIlBvcHVwLkNsb3NlXCIpKSx0aGlzLl90cmFja1BvaW50ZXImJnRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1wb3B1cC10cmFjay1wb2ludGVyXCIpO31pZih0aGlzLm9wdGlvbnMubWF4V2lkdGgmJnRoaXMuX2NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aCE9PXRoaXMub3B0aW9ucy5tYXhXaWR0aCYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aD10aGlzLm9wdGlvbnMubWF4V2lkdGgpLHRoaXMuX2xuZ0xhdD10aGlzLl9tYXAudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzJiYhdGhpcy5fdHJhY2tQb2ludGVyP2pzKHRoaXMuX2xuZ0xhdCx0aGlzLl9mbGF0UG9zLHRoaXMuX21hcC50cmFuc2Zvcm0pOm51bGw9PT0oZT10aGlzLl9sbmdMYXQpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLndyYXAoKSx0aGlzLl90cmFja1BvaW50ZXImJiF0KXJldHVybjtjb25zdCBpPXRoaXMuX2ZsYXRQb3M9dGhpcy5fcG9zPXRoaXMuX3RyYWNrUG9pbnRlciYmdD90OnRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCk7dGhpcy5fbWFwLnRlcnJhaW4mJih0aGlzLl9mbGF0UG9zPXRoaXMuX3RyYWNrUG9pbnRlciYmdD90OnRoaXMuX21hcC50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludCh0aGlzLl9sbmdMYXQpKTtsZXQgYT10aGlzLm9wdGlvbnMuYW5jaG9yO2NvbnN0IHM9UXModGhpcy5vcHRpb25zLm9mZnNldCk7aWYoIWEpe2NvbnN0IHQ9dGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLGU9dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodDtsZXQgbztvPWkueStzLmJvdHRvbS55PGU/W1widG9wXCJdOmkueT50aGlzLl9tYXAudHJhbnNmb3JtLmhlaWdodC1lP1tcImJvdHRvbVwiXTpbXSxpLng8dC8yP28ucHVzaChcImxlZnRcIik6aS54PnRoaXMuX21hcC50cmFuc2Zvcm0ud2lkdGgtdC8yJiZvLnB1c2goXCJyaWdodFwiKSxhPTA9PT1vLmxlbmd0aD9cImJvdHRvbVwiOm8uam9pbihcIi1cIik7fWxldCBvPWkuYWRkKHNbYV0pO3RoaXMub3B0aW9ucy5zdWJwaXhlbFBvc2l0aW9uaW5nfHwobz1vLnJvdW5kKCkpLHIuc2V0VHJhbnNmb3JtKHRoaXMuX2NvbnRhaW5lcixgJHtac1thXX0gdHJhbnNsYXRlKCR7by54fXB4LCR7by55fXB4KWApLHFzKHRoaXMuX2NvbnRhaW5lcixhLFwicG9wdXBcIik7fSx0aGlzLl9vbkNsb3NlPSgpPT57dGhpcy5yZW1vdmUoKTt9LHRoaXMub3B0aW9ucz1lLmUoT2JqZWN0LmNyZWF0ZShKcyksdCk7fWFkZFRvKHQpe3JldHVybiB0aGlzLl9tYXAmJnRoaXMucmVtb3ZlKCksdGhpcy5fbWFwPXQsdGhpcy5vcHRpb25zLmNsb3NlT25DbGljayYmdGhpcy5fbWFwLm9uKFwiY2xpY2tcIix0aGlzLl9vbkNsb3NlKSx0aGlzLm9wdGlvbnMuY2xvc2VPbk1vdmUmJnRoaXMuX21hcC5vbihcIm1vdmVcIix0aGlzLl9vbkNsb3NlKSx0aGlzLl9tYXAub24oXCJyZW1vdmVcIix0aGlzLnJlbW92ZSksdGhpcy5fdXBkYXRlKCksdGhpcy5fZm9jdXNGaXJzdEVsZW1lbnQoKSx0aGlzLl90cmFja1BvaW50ZXI/KHRoaXMuX21hcC5vbihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW91c2VNb3ZlKSx0aGlzLl9tYXAub24oXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwKSx0aGlzLl9jb250YWluZXImJnRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1wb3B1cC10cmFjay1wb2ludGVyXCIpLHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLXRyYWNrLXBvaW50ZXJcIikpOnRoaXMuX21hcC5vbihcIm1vdmVcIix0aGlzLl91cGRhdGUpLHRoaXMuZmlyZShuZXcgZS5rKFwib3BlblwiKSksdGhpc31pc09wZW4oKXtyZXR1cm4gISF0aGlzLl9tYXB9Z2V0TG5nTGF0KCl7cmV0dXJuIHRoaXMuX2xuZ0xhdH1zZXRMbmdMYXQodCl7cmV0dXJuIHRoaXMuX2xuZ0xhdD1lLk4uY29udmVydCh0KSx0aGlzLl9wb3M9bnVsbCx0aGlzLl9mbGF0UG9zPW51bGwsdGhpcy5fdHJhY2tQb2ludGVyPSExLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX21hcCYmKHRoaXMuX21hcC5vbihcIm1vdmVcIix0aGlzLl91cGRhdGUpLHRoaXMuX21hcC5vZmYoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSksdGhpcy5fY29udGFpbmVyJiZ0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtcG9wdXAtdHJhY2stcG9pbnRlclwiKSx0aGlzLl9tYXAuX2NhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC10cmFjay1wb2ludGVyXCIpKSx0aGlzfXRyYWNrUG9pbnRlcigpe3JldHVybiB0aGlzLl90cmFja1BvaW50ZXI9ITAsdGhpcy5fcG9zPW51bGwsdGhpcy5fZmxhdFBvcz1udWxsLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX21hcCYmKHRoaXMuX21hcC5vZmYoXCJtb3ZlXCIsdGhpcy5fdXBkYXRlKSx0aGlzLl9tYXAub24oXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSksdGhpcy5fbWFwLm9uKFwiZHJhZ1wiLHRoaXMuX29uRHJhZyksdGhpcy5fY29udGFpbmVyJiZ0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtcG9wdXAtdHJhY2stcG9pbnRlclwiKSx0aGlzLl9tYXAuX2NhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC10cmFjay1wb2ludGVyXCIpKSx0aGlzfWdldEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfXNldFRleHQodCl7cmV0dXJuIHRoaXMuc2V0RE9NQ29udGVudChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KSl9c2V0SFRNTCh0KXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJib2R5XCIpO2xldCBhO2ZvcihpLmlubmVySFRNTD10O2E9aS5maXJzdENoaWxkLGE7KWUuYXBwZW5kQ2hpbGQoYSk7cmV0dXJuIHRoaXMuc2V0RE9NQ29udGVudChlKX1nZXRNYXhXaWR0aCgpe3ZhciB0O3JldHVybiBudWxsPT09KHQ9dGhpcy5fY29udGFpbmVyKXx8dm9pZCAwPT09dD92b2lkIDA6dC5zdHlsZS5tYXhXaWR0aH1zZXRNYXhXaWR0aCh0KXtyZXR1cm4gdGhpcy5vcHRpb25zLm1heFdpZHRoPXQsdGhpcy5fdXBkYXRlKCksdGhpc31zZXRET01Db250ZW50KHQpe2lmKHRoaXMuX2NvbnRlbnQpZm9yKDt0aGlzLl9jb250ZW50Lmhhc0NoaWxkTm9kZXMoKTspdGhpcy5fY29udGVudC5maXJzdENoaWxkJiZ0aGlzLl9jb250ZW50LnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRlbnQuZmlyc3RDaGlsZCk7ZWxzZSB0aGlzLl9jb250ZW50PXIuY3JlYXRlKFwiZGl2XCIsXCJtYXBsaWJyZWdsLXBvcHVwLWNvbnRlbnRcIix0aGlzLl9jb250YWluZXIpO3JldHVybiB0aGlzLl9jb250ZW50LmFwcGVuZENoaWxkKHQpLHRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uKCksdGhpcy5fdXBkYXRlKCksdGhpcy5fZm9jdXNGaXJzdEVsZW1lbnQoKSx0aGlzfWFkZENsYXNzTmFtZSh0KXtyZXR1cm4gdGhpcy5fY29udGFpbmVyJiZ0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCh0KSx0aGlzfXJlbW92ZUNsYXNzTmFtZSh0KXtyZXR1cm4gdGhpcy5fY29udGFpbmVyJiZ0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSh0KSx0aGlzfXNldE9mZnNldCh0KXtyZXR1cm4gdGhpcy5vcHRpb25zLm9mZnNldD10LHRoaXMuX3VwZGF0ZSgpLHRoaXN9dG9nZ2xlQ2xhc3NOYW1lKHQpe2lmKHRoaXMuX2NvbnRhaW5lcilyZXR1cm4gdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUodCl9c2V0U3VicGl4ZWxQb3NpdGlvbmluZyh0KXt0aGlzLm9wdGlvbnMuc3VicGl4ZWxQb3NpdGlvbmluZz10O31fY3JlYXRlQ2xvc2VCdXR0b24oKXt0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24mJih0aGlzLl9jbG9zZUJ1dHRvbj1yLmNyZWF0ZShcImJ1dHRvblwiLFwibWFwbGlicmVnbC1wb3B1cC1jbG9zZS1idXR0b25cIix0aGlzLl9jb250ZW50KSx0aGlzLl9jbG9zZUJ1dHRvbi50eXBlPVwiYnV0dG9uXCIsdGhpcy5fY2xvc2VCdXR0b24uaW5uZXJIVE1MPVwiJiMyMTU7XCIsdGhpcy5fY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdGhpcy5fb25DbG9zZSkpO31fZm9jdXNGaXJzdEVsZW1lbnQoKXtpZighdGhpcy5vcHRpb25zLmZvY3VzQWZ0ZXJPcGVufHwhdGhpcy5fY29udGFpbmVyKXJldHVybjtjb25zdCB0PXRoaXMuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFlzKTt0JiZ0LmZvY3VzKCk7fX0sdC5SYXN0ZXJERU1UaWxlU291cmNlPUssdC5SYXN0ZXJUaWxlU291cmNlPVgsdC5TY2FsZUNvbnRyb2w9Y2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fb25Nb3ZlPSgpPT57WHModGhpcy5fbWFwLHRoaXMuX2NvbnRhaW5lcix0aGlzLm9wdGlvbnMpO30sdGhpcy5zZXRVbml0PXQ9Pnt0aGlzLm9wdGlvbnMudW5pdD10LFhzKHRoaXMuX21hcCx0aGlzLl9jb250YWluZXIsdGhpcy5vcHRpb25zKTt9LHRoaXMub3B0aW9ucz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sJHMpLHQpO31nZXREZWZhdWx0UG9zaXRpb24oKXtyZXR1cm4gXCJib3R0b20tbGVmdFwifW9uQWRkKHQpe3JldHVybiB0aGlzLl9tYXA9dCx0aGlzLl9jb250YWluZXI9ci5jcmVhdGUoXCJkaXZcIixcIm1hcGxpYnJlZ2wtY3RybCBtYXBsaWJyZWdsLWN0cmwtc2NhbGVcIix0LmdldENvbnRhaW5lcigpKSx0aGlzLl9tYXAub24oXCJtb3ZlXCIsdGhpcy5fb25Nb3ZlKSx0aGlzLl9vbk1vdmUoKSx0aGlzLl9jb250YWluZXJ9b25SZW1vdmUoKXtyLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLHRoaXMuX21hcC5vZmYoXCJtb3ZlXCIsdGhpcy5fb25Nb3ZlKSx0aGlzLl9tYXA9dm9pZCAwO319LHQuU2Nyb2xsWm9vbUhhbmRsZXI9dXMsdC5TdHlsZT1kZSx0LlRlcnJhaW5Db250cm9sPWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuX3RvZ2dsZVRlcnJhaW49KCk9Pnt0aGlzLl9tYXAuZ2V0VGVycmFpbigpP3RoaXMuX21hcC5zZXRUZXJyYWluKG51bGwpOnRoaXMuX21hcC5zZXRUZXJyYWluKHRoaXMub3B0aW9ucyksdGhpcy5fdXBkYXRlVGVycmFpbkljb24oKTt9LHRoaXMuX3VwZGF0ZVRlcnJhaW5JY29uPSgpPT57dGhpcy5fdGVycmFpbkJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLXRlcnJhaW5cIiksdGhpcy5fdGVycmFpbkJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLXRlcnJhaW4tZW5hYmxlZFwiKSx0aGlzLl9tYXAudGVycmFpbj8odGhpcy5fdGVycmFpbkJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLXRlcnJhaW4tZW5hYmxlZFwiKSx0aGlzLl90ZXJyYWluQnV0dG9uLnRpdGxlPXRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJUZXJyYWluQ29udHJvbC5EaXNhYmxlXCIpKToodGhpcy5fdGVycmFpbkJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLXRlcnJhaW5cIiksdGhpcy5fdGVycmFpbkJ1dHRvbi50aXRsZT10aGlzLl9tYXAuX2dldFVJU3RyaW5nKFwiVGVycmFpbkNvbnRyb2wuRW5hYmxlXCIpKTt9LHRoaXMub3B0aW9ucz10O31vbkFkZCh0KXtyZXR1cm4gdGhpcy5fbWFwPXQsdGhpcy5fY29udGFpbmVyPXIuY3JlYXRlKFwiZGl2XCIsXCJtYXBsaWJyZWdsLWN0cmwgbWFwbGlicmVnbC1jdHJsLWdyb3VwXCIpLHRoaXMuX3RlcnJhaW5CdXR0b249ci5jcmVhdGUoXCJidXR0b25cIixcIm1hcGxpYnJlZ2wtY3RybC10ZXJyYWluXCIsdGhpcy5fY29udGFpbmVyKSxyLmNyZWF0ZShcInNwYW5cIixcIm1hcGxpYnJlZ2wtY3RybC1pY29uXCIsdGhpcy5fdGVycmFpbkJ1dHRvbikuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksdGhpcy5fdGVycmFpbkJ1dHRvbi50eXBlPVwiYnV0dG9uXCIsdGhpcy5fdGVycmFpbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl90b2dnbGVUZXJyYWluKSx0aGlzLl91cGRhdGVUZXJyYWluSWNvbigpLHRoaXMuX21hcC5vbihcInRlcnJhaW5cIix0aGlzLl91cGRhdGVUZXJyYWluSWNvbiksdGhpcy5fY29udGFpbmVyfW9uUmVtb3ZlKCl7ci5yZW1vdmUodGhpcy5fY29udGFpbmVyKSx0aGlzLl9tYXAub2ZmKFwidGVycmFpblwiLHRoaXMuX3VwZGF0ZVRlcnJhaW5JY29uKSx0aGlzLl9tYXA9dm9pZCAwO319LHQuVHdvRmluZ2Vyc1RvdWNoUGl0Y2hIYW5kbGVyPXJzLHQuVHdvRmluZ2Vyc1RvdWNoUm90YXRlSGFuZGxlcj1zcyx0LlR3b0ZpbmdlcnNUb3VjaFpvb21IYW5kbGVyPWlzLHQuVHdvRmluZ2Vyc1RvdWNoWm9vbVJvdGF0ZUhhbmRsZXI9Z3MsdC5WZWN0b3JUaWxlU291cmNlPSQsdC5WaWRlb1NvdXJjZT10dCx0LmFkZFNvdXJjZVR5cGU9KHQsaSk9PmUuXyh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoYXQodCkpdGhyb3cgbmV3IEVycm9yKGBBIHNvdXJjZSB0eXBlIGNhbGxlZCBcIiR7dH1cIiBhbHJlYWR5IGV4aXN0cy5gKTsoKHQsZSk9PntpdFt0XT1lO30pKHQsaSk7fSkpLHQuY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXM9ZnVuY3Rpb24oKXtjb25zdCB0PUI7dCYmKHQuaXNQcmVsb2FkZWQoKSYmMT09PXQubnVtQWN0aXZlKCk/KHQucmVsZWFzZShrKSxCPW51bGwpOmNvbnNvbGUud2FybihcIkNvdWxkIG5vdCBjbGVhciBXZWJXb3JrZXJzIHNpbmNlIHRoZXJlIGFyZSBhY3RpdmUgTWFwIGluc3RhbmNlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSBpdC4gVGhlIHByZS13YXJtZWQgV2ViV29ya2VyIHBvb2wgY2FuIG9ubHkgYmUgY2xlYXJlZCB3aGVuIGFsbCBtYXAgaW5zdGFuY2VzIGhhdmUgYmVlbiByZW1vdmVkIHdpdGggbWFwLnJlbW92ZSgpXCIpKTt9LHQuZ2V0TWF4UGFyYWxsZWxJbWFnZVJlcXVlc3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYS5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFN9LHQuZ2V0UlRMVGV4dFBsdWdpblN0YXR1cz1mdW5jdGlvbigpe3JldHVybiBudCgpLmdldFJUTFRleHRQbHVnaW5TdGF0dXMoKX0sdC5nZXRWZXJzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRvfSx0LmdldFdvcmtlckNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIEwud29ya2VyQ291bnR9LHQuZ2V0V29ya2VyVXJsPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYS5XT1JLRVJfVVJMfSx0LmltcG9ydFNjcmlwdEluV29ya2Vycz1mdW5jdGlvbih0KXtyZXR1cm4gaigpLmJyb2FkY2FzdChcIklTXCIsdCl9LHQucHJld2FybT1mdW5jdGlvbigpe04oKS5hY3F1aXJlKGspO30sdC5zZXRNYXhQYXJhbGxlbEltYWdlUmVxdWVzdHM9ZnVuY3Rpb24odCl7ZS5hLk1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUz10O30sdC5zZXRSVExUZXh0UGx1Z2luPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG50KCkuc2V0UlRMVGV4dFBsdWdpbih0LGUpfSx0LnNldFdvcmtlckNvdW50PWZ1bmN0aW9uKHQpe0wud29ya2VyQ291bnQ9dDt9LHQuc2V0V29ya2VyVXJsPWZ1bmN0aW9uKHQpe2UuYS5XT1JLRVJfVVJMPXQ7fTt9KSk7XG5cbi8vXG4vLyBPdXIgY3VzdG9tIGludHJvIHByb3ZpZGVzIGEgc3BlY2lhbGl6ZWQgXCJkZWZpbmUoKVwiIGZ1bmN0aW9uLCBjYWxsZWQgYnkgdGhlXG4vLyBBTUQgbW9kdWxlcyBiZWxvdywgdGhhdCBzZXRzIHVwIHRoZSB3b3JrZXIgYmxvYiBVUkwgYW5kIHRoZW4gZXhlY3V0ZXMgdGhlXG4vLyBtYWluIG1vZHVsZSwgc3RvcmluZyBpdHMgZXhwb3J0ZWQgdmFsdWUgYXMgJ21hcGxpYnJlZ2wnXG5cblxudmFyIG1hcGxpYnJlZ2wkMSA9IG1hcGxpYnJlZ2w7XG5cbnJldHVybiBtYXBsaWJyZWdsJDE7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcGxpYnJlLWdsLmpzLm1hcFxuIiwidmFyIF9fcG93ID0gTWF0aC5wb3c7XG52YXIgX19hc3luYyA9IChfX3RoaXMsIF9fYXJndW1lbnRzLCBnZW5lcmF0b3IpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB2YXIgZnVsZmlsbGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciByZWplY3RlZCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IudGhyb3codmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIHN0ZXAgPSAoeCkgPT4geC5kb25lID8gcmVzb2x2ZSh4LnZhbHVlKSA6IFByb21pc2UucmVzb2x2ZSh4LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseShfX3RoaXMsIF9fYXJndW1lbnRzKSkubmV4dCgpKTtcbiAgfSk7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvZmZsYXRlL2VzbS9icm93c2VyLmpzXG52YXIgdTggPSBVaW50OEFycmF5O1xudmFyIHUxNiA9IFVpbnQxNkFycmF5O1xudmFyIGkzMiA9IEludDMyQXJyYXk7XG52YXIgZmxlYiA9IG5ldyB1OChbXG4gIDAsXG4gIDAsXG4gIDAsXG4gIDAsXG4gIDAsXG4gIDAsXG4gIDAsXG4gIDAsXG4gIDEsXG4gIDEsXG4gIDEsXG4gIDEsXG4gIDIsXG4gIDIsXG4gIDIsXG4gIDIsXG4gIDMsXG4gIDMsXG4gIDMsXG4gIDMsXG4gIDQsXG4gIDQsXG4gIDQsXG4gIDQsXG4gIDUsXG4gIDUsXG4gIDUsXG4gIDUsXG4gIDAsXG4gIC8qIHVudXNlZCAqL1xuICAwLFxuICAwLFxuICAvKiBpbXBvc3NpYmxlICovXG4gIDBcbl0pO1xudmFyIGZkZWIgPSBuZXcgdTgoW1xuICAwLFxuICAwLFxuICAwLFxuICAwLFxuICAxLFxuICAxLFxuICAyLFxuICAyLFxuICAzLFxuICAzLFxuICA0LFxuICA0LFxuICA1LFxuICA1LFxuICA2LFxuICA2LFxuICA3LFxuICA3LFxuICA4LFxuICA4LFxuICA5LFxuICA5LFxuICAxMCxcbiAgMTAsXG4gIDExLFxuICAxMSxcbiAgMTIsXG4gIDEyLFxuICAxMyxcbiAgMTMsXG4gIC8qIHVudXNlZCAqL1xuICAwLFxuICAwXG5dKTtcbnZhciBjbGltID0gbmV3IHU4KFsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1XSk7XG52YXIgZnJlYiA9IGZ1bmN0aW9uKGViLCBzdGFydCkge1xuICB2YXIgYiA9IG5ldyB1MTYoMzEpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDMxOyArK2kpIHtcbiAgICBiW2ldID0gc3RhcnQgKz0gMSA8PCBlYltpIC0gMV07XG4gIH1cbiAgdmFyIHIgPSBuZXcgaTMyKGJbMzBdKTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCAzMDsgKytpKSB7XG4gICAgZm9yICh2YXIgaiA9IGJbaV07IGogPCBiW2kgKyAxXTsgKytqKSB7XG4gICAgICByW2pdID0gaiAtIGJbaV0gPDwgNSB8IGk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGIsIHIgfTtcbn07XG52YXIgX2EgPSBmcmViKGZsZWIsIDIpO1xudmFyIGZsID0gX2EuYjtcbnZhciByZXZmbCA9IF9hLnI7XG5mbFsyOF0gPSAyNTgsIHJldmZsWzI1OF0gPSAyODtcbnZhciBfYiA9IGZyZWIoZmRlYiwgMCk7XG52YXIgZmQgPSBfYi5iO1xudmFyIHJldmZkID0gX2IucjtcbnZhciByZXYgPSBuZXcgdTE2KDMyNzY4KTtcbmZvciAoaSA9IDA7IGkgPCAzMjc2ODsgKytpKSB7XG4gIHggPSAoaSAmIDQzNjkwKSA+PiAxIHwgKGkgJiAyMTg0NSkgPDwgMTtcbiAgeCA9ICh4ICYgNTI0MjgpID4+IDIgfCAoeCAmIDEzMTA3KSA8PCAyO1xuICB4ID0gKHggJiA2MTY4MCkgPj4gNCB8ICh4ICYgMzg1NSkgPDwgNDtcbiAgcmV2W2ldID0gKCh4ICYgNjUyODApID4+IDggfCAoeCAmIDI1NSkgPDwgOCkgPj4gMTtcbn1cbnZhciB4O1xudmFyIGk7XG52YXIgaE1hcCA9IGZ1bmN0aW9uKGNkLCBtYiwgcikge1xuICB2YXIgcyA9IGNkLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IG5ldyB1MTYobWIpO1xuICBmb3IgKDsgaSA8IHM7ICsraSkge1xuICAgIGlmIChjZFtpXSlcbiAgICAgICsrbFtjZFtpXSAtIDFdO1xuICB9XG4gIHZhciBsZSA9IG5ldyB1MTYobWIpO1xuICBmb3IgKGkgPSAxOyBpIDwgbWI7ICsraSkge1xuICAgIGxlW2ldID0gbGVbaSAtIDFdICsgbFtpIC0gMV0gPDwgMTtcbiAgfVxuICB2YXIgY287XG4gIGlmIChyKSB7XG4gICAgY28gPSBuZXcgdTE2KDEgPDwgbWIpO1xuICAgIHZhciBydmIgPSAxNSAtIG1iO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzOyArK2kpIHtcbiAgICAgIGlmIChjZFtpXSkge1xuICAgICAgICB2YXIgc3YgPSBpIDw8IDQgfCBjZFtpXTtcbiAgICAgICAgdmFyIHJfMSA9IG1iIC0gY2RbaV07XG4gICAgICAgIHZhciB2ID0gbGVbY2RbaV0gLSAxXSsrIDw8IHJfMTtcbiAgICAgICAgZm9yICh2YXIgbSA9IHYgfCAoMSA8PCByXzEpIC0gMTsgdiA8PSBtOyArK3YpIHtcbiAgICAgICAgICBjb1tyZXZbdl0gPj4gcnZiXSA9IHN2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvID0gbmV3IHUxNihzKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgczsgKytpKSB7XG4gICAgICBpZiAoY2RbaV0pIHtcbiAgICAgICAgY29baV0gPSByZXZbbGVbY2RbaV0gLSAxXSsrXSA+PiAxNSAtIGNkW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY287XG59O1xudmFyIGZsdCA9IG5ldyB1OCgyODgpO1xuZm9yIChpID0gMDsgaSA8IDE0NDsgKytpKVxuICBmbHRbaV0gPSA4O1xudmFyIGk7XG5mb3IgKGkgPSAxNDQ7IGkgPCAyNTY7ICsraSlcbiAgZmx0W2ldID0gOTtcbnZhciBpO1xuZm9yIChpID0gMjU2OyBpIDwgMjgwOyArK2kpXG4gIGZsdFtpXSA9IDc7XG52YXIgaTtcbmZvciAoaSA9IDI4MDsgaSA8IDI4ODsgKytpKVxuICBmbHRbaV0gPSA4O1xudmFyIGk7XG52YXIgZmR0ID0gbmV3IHU4KDMyKTtcbmZvciAoaSA9IDA7IGkgPCAzMjsgKytpKVxuICBmZHRbaV0gPSA1O1xudmFyIGk7XG52YXIgZmxybSA9IC8qIEBfX1BVUkVfXyAqLyBoTWFwKGZsdCwgOSwgMSk7XG52YXIgZmRybSA9IC8qIEBfX1BVUkVfXyAqLyBoTWFwKGZkdCwgNSwgMSk7XG52YXIgbWF4ID0gZnVuY3Rpb24oYSkge1xuICB2YXIgbSA9IGFbMF07XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgIGlmIChhW2ldID4gbSlcbiAgICAgIG0gPSBhW2ldO1xuICB9XG4gIHJldHVybiBtO1xufTtcbnZhciBiaXRzID0gZnVuY3Rpb24oZCwgcCwgbSkge1xuICB2YXIgbyA9IHAgLyA4IHwgMDtcbiAgcmV0dXJuIChkW29dIHwgZFtvICsgMV0gPDwgOCkgPj4gKHAgJiA3KSAmIG07XG59O1xudmFyIGJpdHMxNiA9IGZ1bmN0aW9uKGQsIHApIHtcbiAgdmFyIG8gPSBwIC8gOCB8IDA7XG4gIHJldHVybiAoZFtvXSB8IGRbbyArIDFdIDw8IDggfCBkW28gKyAyXSA8PCAxNikgPj4gKHAgJiA3KTtcbn07XG52YXIgc2hmdCA9IGZ1bmN0aW9uKHApIHtcbiAgcmV0dXJuIChwICsgNykgLyA4IHwgMDtcbn07XG52YXIgc2xjID0gZnVuY3Rpb24odiwgcywgZSkge1xuICBpZiAocyA9PSBudWxsIHx8IHMgPCAwKVxuICAgIHMgPSAwO1xuICBpZiAoZSA9PSBudWxsIHx8IGUgPiB2Lmxlbmd0aClcbiAgICBlID0gdi5sZW5ndGg7XG4gIHZhciBuID0gbmV3IHU4KGUgLSBzKTtcbiAgbi5zZXQodi5zdWJhcnJheShzLCBlKSk7XG4gIHJldHVybiBuO1xufTtcbnZhciBlYyA9IFtcbiAgXCJ1bmV4cGVjdGVkIEVPRlwiLFxuICBcImludmFsaWQgYmxvY2sgdHlwZVwiLFxuICBcImludmFsaWQgbGVuZ3RoL2xpdGVyYWxcIixcbiAgXCJpbnZhbGlkIGRpc3RhbmNlXCIsXG4gIFwic3RyZWFtIGZpbmlzaGVkXCIsXG4gIFwibm8gc3RyZWFtIGhhbmRsZXJcIixcbiAgLFxuICBcIm5vIGNhbGxiYWNrXCIsXG4gIFwiaW52YWxpZCBVVEYtOCBkYXRhXCIsXG4gIFwiZXh0cmEgZmllbGQgdG9vIGxvbmdcIixcbiAgXCJkYXRlIG5vdCBpbiByYW5nZSAxOTgwLTIwOTlcIixcbiAgXCJmaWxlbmFtZSB0b28gbG9uZ1wiLFxuICBcInN0cmVhbSBmaW5pc2hpbmdcIixcbiAgXCJpbnZhbGlkIHppcCBkYXRhXCJcbiAgLy8gZGV0ZXJtaW5lZCBieSB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZFxuXTtcbnZhciBlcnIgPSBmdW5jdGlvbihpbmQsIG1zZywgbnQpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobXNnIHx8IGVjW2luZF0pO1xuICBlLmNvZGUgPSBpbmQ7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlLCBlcnIpO1xuICBpZiAoIW50KVxuICAgIHRocm93IGU7XG4gIHJldHVybiBlO1xufTtcbnZhciBpbmZsdCA9IGZ1bmN0aW9uKGRhdCwgc3QsIGJ1ZiwgZGljdCkge1xuICB2YXIgc2wgPSBkYXQubGVuZ3RoLCBkbCA9IGRpY3QgPyBkaWN0Lmxlbmd0aCA6IDA7XG4gIGlmICghc2wgfHwgc3QuZiAmJiAhc3QubClcbiAgICByZXR1cm4gYnVmIHx8IG5ldyB1OCgwKTtcbiAgdmFyIG5vQnVmID0gIWJ1ZiB8fCBzdC5pICE9IDI7XG4gIHZhciBub1N0ID0gc3QuaTtcbiAgaWYgKCFidWYpXG4gICAgYnVmID0gbmV3IHU4KHNsICogMyk7XG4gIHZhciBjYnVmID0gZnVuY3Rpb24obDIpIHtcbiAgICB2YXIgYmwgPSBidWYubGVuZ3RoO1xuICAgIGlmIChsMiA+IGJsKSB7XG4gICAgICB2YXIgbmJ1ZiA9IG5ldyB1OChNYXRoLm1heChibCAqIDIsIGwyKSk7XG4gICAgICBuYnVmLnNldChidWYpO1xuICAgICAgYnVmID0gbmJ1ZjtcbiAgICB9XG4gIH07XG4gIHZhciBmaW5hbCA9IHN0LmYgfHwgMCwgcG9zID0gc3QucCB8fCAwLCBidCA9IHN0LmIgfHwgMCwgbG0gPSBzdC5sLCBkbSA9IHN0LmQsIGxidCA9IHN0Lm0sIGRidCA9IHN0Lm47XG4gIHZhciB0YnRzID0gc2wgKiA4O1xuICBkbyB7XG4gICAgaWYgKCFsbSkge1xuICAgICAgZmluYWwgPSBiaXRzKGRhdCwgcG9zLCAxKTtcbiAgICAgIHZhciB0eXBlID0gYml0cyhkYXQsIHBvcyArIDEsIDMpO1xuICAgICAgcG9zICs9IDM7XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgdmFyIHMgPSBzaGZ0KHBvcykgKyA0LCBsID0gZGF0W3MgLSA0XSB8IGRhdFtzIC0gM10gPDwgOCwgdCA9IHMgKyBsO1xuICAgICAgICBpZiAodCA+IHNsKSB7XG4gICAgICAgICAgaWYgKG5vU3QpXG4gICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vQnVmKVxuICAgICAgICAgIGNidWYoYnQgKyBsKTtcbiAgICAgICAgYnVmLnNldChkYXQuc3ViYXJyYXkocywgdCksIGJ0KTtcbiAgICAgICAgc3QuYiA9IGJ0ICs9IGwsIHN0LnAgPSBwb3MgPSB0ICogOCwgc3QuZiA9IGZpbmFsO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAxKVxuICAgICAgICBsbSA9IGZscm0sIGRtID0gZmRybSwgbGJ0ID0gOSwgZGJ0ID0gNTtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMikge1xuICAgICAgICB2YXIgaExpdCA9IGJpdHMoZGF0LCBwb3MsIDMxKSArIDI1NywgaGNMZW4gPSBiaXRzKGRhdCwgcG9zICsgMTAsIDE1KSArIDQ7XG4gICAgICAgIHZhciB0bCA9IGhMaXQgKyBiaXRzKGRhdCwgcG9zICsgNSwgMzEpICsgMTtcbiAgICAgICAgcG9zICs9IDE0O1xuICAgICAgICB2YXIgbGR0ID0gbmV3IHU4KHRsKTtcbiAgICAgICAgdmFyIGNsdCA9IG5ldyB1OCgxOSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGNMZW47ICsraSkge1xuICAgICAgICAgIGNsdFtjbGltW2ldXSA9IGJpdHMoZGF0LCBwb3MgKyBpICogMywgNyk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zICs9IGhjTGVuICogMztcbiAgICAgICAgdmFyIGNsYiA9IG1heChjbHQpLCBjbGJtc2sgPSAoMSA8PCBjbGIpIC0gMTtcbiAgICAgICAgdmFyIGNsbSA9IGhNYXAoY2x0LCBjbGIsIDEpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRsOyApIHtcbiAgICAgICAgICB2YXIgciA9IGNsbVtiaXRzKGRhdCwgcG9zLCBjbGJtc2spXTtcbiAgICAgICAgICBwb3MgKz0gciAmIDE1O1xuICAgICAgICAgIHZhciBzID0gciA+PiA0O1xuICAgICAgICAgIGlmIChzIDwgMTYpIHtcbiAgICAgICAgICAgIGxkdFtpKytdID0gcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGMgPSAwLCBuID0gMDtcbiAgICAgICAgICAgIGlmIChzID09IDE2KVxuICAgICAgICAgICAgICBuID0gMyArIGJpdHMoZGF0LCBwb3MsIDMpLCBwb3MgKz0gMiwgYyA9IGxkdFtpIC0gMV07XG4gICAgICAgICAgICBlbHNlIGlmIChzID09IDE3KVxuICAgICAgICAgICAgICBuID0gMyArIGJpdHMoZGF0LCBwb3MsIDcpLCBwb3MgKz0gMztcbiAgICAgICAgICAgIGVsc2UgaWYgKHMgPT0gMTgpXG4gICAgICAgICAgICAgIG4gPSAxMSArIGJpdHMoZGF0LCBwb3MsIDEyNyksIHBvcyArPSA3O1xuICAgICAgICAgICAgd2hpbGUgKG4tLSlcbiAgICAgICAgICAgICAgbGR0W2krK10gPSBjO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbHQgPSBsZHQuc3ViYXJyYXkoMCwgaExpdCksIGR0ID0gbGR0LnN1YmFycmF5KGhMaXQpO1xuICAgICAgICBsYnQgPSBtYXgobHQpO1xuICAgICAgICBkYnQgPSBtYXgoZHQpO1xuICAgICAgICBsbSA9IGhNYXAobHQsIGxidCwgMSk7XG4gICAgICAgIGRtID0gaE1hcChkdCwgZGJ0LCAxKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBlcnIoMSk7XG4gICAgICBpZiAocG9zID4gdGJ0cykge1xuICAgICAgICBpZiAobm9TdClcbiAgICAgICAgICBlcnIoMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9CdWYpXG4gICAgICBjYnVmKGJ0ICsgMTMxMDcyKTtcbiAgICB2YXIgbG1zID0gKDEgPDwgbGJ0KSAtIDEsIGRtcyA9ICgxIDw8IGRidCkgLSAxO1xuICAgIHZhciBscG9zID0gcG9zO1xuICAgIGZvciAoOyA7IGxwb3MgPSBwb3MpIHtcbiAgICAgIHZhciBjID0gbG1bYml0czE2KGRhdCwgcG9zKSAmIGxtc10sIHN5bSA9IGMgPj4gNDtcbiAgICAgIHBvcyArPSBjICYgMTU7XG4gICAgICBpZiAocG9zID4gdGJ0cykge1xuICAgICAgICBpZiAobm9TdClcbiAgICAgICAgICBlcnIoMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKCFjKVxuICAgICAgICBlcnIoMik7XG4gICAgICBpZiAoc3ltIDwgMjU2KVxuICAgICAgICBidWZbYnQrK10gPSBzeW07XG4gICAgICBlbHNlIGlmIChzeW0gPT0gMjU2KSB7XG4gICAgICAgIGxwb3MgPSBwb3MsIGxtID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYWRkID0gc3ltIC0gMjU0O1xuICAgICAgICBpZiAoc3ltID4gMjY0KSB7XG4gICAgICAgICAgdmFyIGkgPSBzeW0gLSAyNTcsIGIgPSBmbGViW2ldO1xuICAgICAgICAgIGFkZCA9IGJpdHMoZGF0LCBwb3MsICgxIDw8IGIpIC0gMSkgKyBmbFtpXTtcbiAgICAgICAgICBwb3MgKz0gYjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZCA9IGRtW2JpdHMxNihkYXQsIHBvcykgJiBkbXNdLCBkc3ltID0gZCA+PiA0O1xuICAgICAgICBpZiAoIWQpXG4gICAgICAgICAgZXJyKDMpO1xuICAgICAgICBwb3MgKz0gZCAmIDE1O1xuICAgICAgICB2YXIgZHQgPSBmZFtkc3ltXTtcbiAgICAgICAgaWYgKGRzeW0gPiAzKSB7XG4gICAgICAgICAgdmFyIGIgPSBmZGViW2RzeW1dO1xuICAgICAgICAgIGR0ICs9IGJpdHMxNihkYXQsIHBvcykgJiAoMSA8PCBiKSAtIDEsIHBvcyArPSBiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgPiB0YnRzKSB7XG4gICAgICAgICAgaWYgKG5vU3QpXG4gICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vQnVmKVxuICAgICAgICAgIGNidWYoYnQgKyAxMzEwNzIpO1xuICAgICAgICB2YXIgZW5kID0gYnQgKyBhZGQ7XG4gICAgICAgIGlmIChidCA8IGR0KSB7XG4gICAgICAgICAgdmFyIHNoaWZ0MiA9IGRsIC0gZHQsIGRlbmQgPSBNYXRoLm1pbihkdCwgZW5kKTtcbiAgICAgICAgICBpZiAoc2hpZnQyICsgYnQgPCAwKVxuICAgICAgICAgICAgZXJyKDMpO1xuICAgICAgICAgIGZvciAoOyBidCA8IGRlbmQ7ICsrYnQpXG4gICAgICAgICAgICBidWZbYnRdID0gZGljdFtzaGlmdDIgKyBidF07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGJ0IDwgZW5kOyBidCArPSA0KSB7XG4gICAgICAgICAgYnVmW2J0XSA9IGJ1ZltidCAtIGR0XTtcbiAgICAgICAgICBidWZbYnQgKyAxXSA9IGJ1ZltidCArIDEgLSBkdF07XG4gICAgICAgICAgYnVmW2J0ICsgMl0gPSBidWZbYnQgKyAyIC0gZHRdO1xuICAgICAgICAgIGJ1ZltidCArIDNdID0gYnVmW2J0ICsgMyAtIGR0XTtcbiAgICAgICAgfVxuICAgICAgICBidCA9IGVuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3QubCA9IGxtLCBzdC5wID0gbHBvcywgc3QuYiA9IGJ0LCBzdC5mID0gZmluYWw7XG4gICAgaWYgKGxtKVxuICAgICAgZmluYWwgPSAxLCBzdC5tID0gbGJ0LCBzdC5kID0gZG0sIHN0Lm4gPSBkYnQ7XG4gIH0gd2hpbGUgKCFmaW5hbCk7XG4gIHJldHVybiBidCA9PSBidWYubGVuZ3RoID8gYnVmIDogc2xjKGJ1ZiwgMCwgYnQpO1xufTtcbnZhciBldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgdTgoMCk7XG52YXIgZ3pzID0gZnVuY3Rpb24oZCkge1xuICBpZiAoZFswXSAhPSAzMSB8fCBkWzFdICE9IDEzOSB8fCBkWzJdICE9IDgpXG4gICAgZXJyKDYsIFwiaW52YWxpZCBnemlwIGRhdGFcIik7XG4gIHZhciBmbGcgPSBkWzNdO1xuICB2YXIgc3QgPSAxMDtcbiAgaWYgKGZsZyAmIDQpXG4gICAgc3QgKz0gKGRbMTBdIHwgZFsxMV0gPDwgOCkgKyAyO1xuICBmb3IgKHZhciB6cyA9IChmbGcgPj4gMyAmIDEpICsgKGZsZyA+PiA0ICYgMSk7IHpzID4gMDsgenMgLT0gIWRbc3QrK10pXG4gICAgO1xuICByZXR1cm4gc3QgKyAoZmxnICYgMik7XG59O1xudmFyIGd6bCA9IGZ1bmN0aW9uKGQpIHtcbiAgdmFyIGwgPSBkLmxlbmd0aDtcbiAgcmV0dXJuIChkW2wgLSA0XSB8IGRbbCAtIDNdIDw8IDggfCBkW2wgLSAyXSA8PCAxNiB8IGRbbCAtIDFdIDw8IDI0KSA+Pj4gMDtcbn07XG52YXIgemxzID0gZnVuY3Rpb24oZCwgZGljdCkge1xuICBpZiAoKGRbMF0gJiAxNSkgIT0gOCB8fCBkWzBdID4+IDQgPiA3IHx8IChkWzBdIDw8IDggfCBkWzFdKSAlIDMxKVxuICAgIGVycig2LCBcImludmFsaWQgemxpYiBkYXRhXCIpO1xuICBpZiAoKGRbMV0gPj4gNSAmIDEpID09ICshZGljdClcbiAgICBlcnIoNiwgXCJpbnZhbGlkIHpsaWIgZGF0YTogXCIgKyAoZFsxXSAmIDMyID8gXCJuZWVkXCIgOiBcInVuZXhwZWN0ZWRcIikgKyBcIiBkaWN0aW9uYXJ5XCIpO1xuICByZXR1cm4gKGRbMV0gPj4gMyAmIDQpICsgMjtcbn07XG5mdW5jdGlvbiBpbmZsYXRlU3luYyhkYXRhLCBvcHRzKSB7XG4gIHJldHVybiBpbmZsdChkYXRhLCB7IGk6IDIgfSwgb3B0cyAmJiBvcHRzLm91dCwgb3B0cyAmJiBvcHRzLmRpY3Rpb25hcnkpO1xufVxuZnVuY3Rpb24gZ3VuemlwU3luYyhkYXRhLCBvcHRzKSB7XG4gIHZhciBzdCA9IGd6cyhkYXRhKTtcbiAgaWYgKHN0ICsgOCA+IGRhdGEubGVuZ3RoKVxuICAgIGVycig2LCBcImludmFsaWQgZ3ppcCBkYXRhXCIpO1xuICByZXR1cm4gaW5mbHQoZGF0YS5zdWJhcnJheShzdCwgLTgpLCB7IGk6IDIgfSwgb3B0cyAmJiBvcHRzLm91dCB8fCBuZXcgdTgoZ3psKGRhdGEpKSwgb3B0cyAmJiBvcHRzLmRpY3Rpb25hcnkpO1xufVxuZnVuY3Rpb24gdW56bGliU3luYyhkYXRhLCBvcHRzKSB7XG4gIHJldHVybiBpbmZsdChkYXRhLnN1YmFycmF5KHpscyhkYXRhLCBvcHRzICYmIG9wdHMuZGljdGlvbmFyeSksIC00KSwgeyBpOiAyIH0sIG9wdHMgJiYgb3B0cy5vdXQsIG9wdHMgJiYgb3B0cy5kaWN0aW9uYXJ5KTtcbn1cbmZ1bmN0aW9uIGRlY29tcHJlc3NTeW5jKGRhdGEsIG9wdHMpIHtcbiAgcmV0dXJuIGRhdGFbMF0gPT0gMzEgJiYgZGF0YVsxXSA9PSAxMzkgJiYgZGF0YVsyXSA9PSA4ID8gZ3VuemlwU3luYyhkYXRhLCBvcHRzKSA6IChkYXRhWzBdICYgMTUpICE9IDggfHwgZGF0YVswXSA+PiA0ID4gNyB8fCAoZGF0YVswXSA8PCA4IHwgZGF0YVsxXSkgJSAzMSA/IGluZmxhdGVTeW5jKGRhdGEsIG9wdHMpIDogdW56bGliU3luYyhkYXRhLCBvcHRzKTtcbn1cbnZhciB0ZCA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPSBcInVuZGVmaW5lZFwiICYmIC8qIEBfX1BVUkVfXyAqLyBuZXcgVGV4dERlY29kZXIoKTtcbnZhciB0ZHMgPSAwO1xudHJ5IHtcbiAgdGQuZGVjb2RlKGV0LCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgdGRzID0gMTtcbn0gY2F0Y2ggKGUpIHtcbn1cblxuLy8gdjIudHNcbnZhciBzaGlmdCA9IChuLCBzaGlmdDIpID0+IHtcbiAgcmV0dXJuIG4gKiBfX3BvdygyLCBzaGlmdDIpO1xufTtcbnZhciB1bnNoaWZ0ID0gKG4sIHNoaWZ0MikgPT4ge1xuICByZXR1cm4gTWF0aC5mbG9vcihuIC8gX19wb3coMiwgc2hpZnQyKSk7XG59O1xudmFyIGdldFVpbnQyNCA9ICh2aWV3LCBwb3MpID0+IHtcbiAgcmV0dXJuIHNoaWZ0KHZpZXcuZ2V0VWludDE2KHBvcyArIDEsIHRydWUpLCA4KSArIHZpZXcuZ2V0VWludDgocG9zKTtcbn07XG52YXIgZ2V0VWludDQ4ID0gKHZpZXcsIHBvcykgPT4ge1xuICByZXR1cm4gc2hpZnQodmlldy5nZXRVaW50MzIocG9zICsgMiwgdHJ1ZSksIDE2KSArIHZpZXcuZ2V0VWludDE2KHBvcywgdHJ1ZSk7XG59O1xudmFyIGNvbXBhcmUgPSAodHosIHR4LCB0eSwgdmlldywgaSkgPT4ge1xuICBpZiAodHogIT09IHZpZXcuZ2V0VWludDgoaSkpXG4gICAgcmV0dXJuIHR6IC0gdmlldy5nZXRVaW50OChpKTtcbiAgY29uc3QgeCA9IGdldFVpbnQyNCh2aWV3LCBpICsgMSk7XG4gIGlmICh0eCAhPT0geClcbiAgICByZXR1cm4gdHggLSB4O1xuICBjb25zdCB5ID0gZ2V0VWludDI0KHZpZXcsIGkgKyA0KTtcbiAgaWYgKHR5ICE9PSB5KVxuICAgIHJldHVybiB0eSAtIHk7XG4gIHJldHVybiAwO1xufTtcbnZhciBxdWVyeUxlYWZkaXIgPSAodmlldywgeiwgeCwgeSkgPT4ge1xuICBjb25zdCBvZmZzZXRMZW4gPSBxdWVyeVZpZXcodmlldywgeiB8IDEyOCwgeCwgeSk7XG4gIGlmIChvZmZzZXRMZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgeixcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgb2Zmc2V0OiBvZmZzZXRMZW5bMF0sXG4gICAgICBsZW5ndGg6IG9mZnNldExlblsxXSxcbiAgICAgIGlzRGlyOiB0cnVlXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG52YXIgcXVlcnlUaWxlID0gKHZpZXcsIHosIHgsIHkpID0+IHtcbiAgY29uc3Qgb2Zmc2V0TGVuID0gcXVlcnlWaWV3KHZpZXcsIHosIHgsIHkpO1xuICBpZiAob2Zmc2V0TGVuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHosXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIG9mZnNldDogb2Zmc2V0TGVuWzBdLFxuICAgICAgbGVuZ3RoOiBvZmZzZXRMZW5bMV0sXG4gICAgICBpc0RpcjogZmFsc2VcbiAgICB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbnZhciBxdWVyeVZpZXcgPSAodmlldywgeiwgeCwgeSkgPT4ge1xuICBsZXQgbSA9IDA7XG4gIGxldCBuID0gdmlldy5ieXRlTGVuZ3RoIC8gMTcgLSAxO1xuICB3aGlsZSAobSA8PSBuKSB7XG4gICAgY29uc3QgayA9IG4gKyBtID4+IDE7XG4gICAgY29uc3QgY21wID0gY29tcGFyZSh6LCB4LCB5LCB2aWV3LCBrICogMTcpO1xuICAgIGlmIChjbXAgPiAwKSB7XG4gICAgICBtID0gayArIDE7XG4gICAgfSBlbHNlIGlmIChjbXAgPCAwKSB7XG4gICAgICBuID0gayAtIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbZ2V0VWludDQ4KHZpZXcsIGsgKiAxNyArIDcpLCB2aWV3LmdldFVpbnQzMihrICogMTcgKyAxMywgdHJ1ZSldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG52YXIgZW50cnlTb3J0ID0gKGEsIGIpID0+IHtcbiAgaWYgKGEuaXNEaXIgJiYgIWIuaXNEaXIpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoIWEuaXNEaXIgJiYgYi5pc0Rpcikge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoYS56ICE9PSBiLnopIHtcbiAgICByZXR1cm4gYS56IC0gYi56O1xuICB9XG4gIGlmIChhLnggIT09IGIueCkge1xuICAgIHJldHVybiBhLnggLSBiLng7XG4gIH1cbiAgcmV0dXJuIGEueSAtIGIueTtcbn07XG52YXIgcGFyc2VFbnRyeSA9IChkYXRhdmlldywgaSkgPT4ge1xuICBjb25zdCB6UmF3ID0gZGF0YXZpZXcuZ2V0VWludDgoaSAqIDE3KTtcbiAgY29uc3QgeiA9IHpSYXcgJiAxMjc7XG4gIHJldHVybiB7XG4gICAgeixcbiAgICB4OiBnZXRVaW50MjQoZGF0YXZpZXcsIGkgKiAxNyArIDEpLFxuICAgIHk6IGdldFVpbnQyNChkYXRhdmlldywgaSAqIDE3ICsgNCksXG4gICAgb2Zmc2V0OiBnZXRVaW50NDgoZGF0YXZpZXcsIGkgKiAxNyArIDcpLFxuICAgIGxlbmd0aDogZGF0YXZpZXcuZ2V0VWludDMyKGkgKiAxNyArIDEzLCB0cnVlKSxcbiAgICBpc0RpcjogelJhdyA+PiA3ID09PSAxXG4gIH07XG59O1xudmFyIHNvcnREaXIgPSAoYSkgPT4ge1xuICBjb25zdCBlbnRyaWVzID0gW107XG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmlldy5ieXRlTGVuZ3RoIC8gMTc7IGkrKykge1xuICAgIGVudHJpZXMucHVzaChwYXJzZUVudHJ5KHZpZXcsIGkpKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlRGlyZWN0b3J5KGVudHJpZXMpO1xufTtcbnZhciBjcmVhdGVEaXJlY3RvcnkgPSAoZW50cmllcykgPT4ge1xuICBlbnRyaWVzLnNvcnQoZW50cnlTb3J0KTtcbiAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDE3ICogZW50cmllcy5sZW5ndGgpO1xuICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV07XG4gICAgbGV0IHogPSBlbnRyeS56O1xuICAgIGlmIChlbnRyeS5pc0RpcilcbiAgICAgIHogPSB6IHwgMTI4O1xuICAgIGFycltpICogMTddID0gejtcbiAgICBhcnJbaSAqIDE3ICsgMV0gPSBlbnRyeS54ICYgMjU1O1xuICAgIGFycltpICogMTcgKyAyXSA9IGVudHJ5LnggPj4gOCAmIDI1NTtcbiAgICBhcnJbaSAqIDE3ICsgM10gPSBlbnRyeS54ID4+IDE2ICYgMjU1O1xuICAgIGFycltpICogMTcgKyA0XSA9IGVudHJ5LnkgJiAyNTU7XG4gICAgYXJyW2kgKiAxNyArIDVdID0gZW50cnkueSA+PiA4ICYgMjU1O1xuICAgIGFycltpICogMTcgKyA2XSA9IGVudHJ5LnkgPj4gMTYgJiAyNTU7XG4gICAgYXJyW2kgKiAxNyArIDddID0gZW50cnkub2Zmc2V0ICYgMjU1O1xuICAgIGFycltpICogMTcgKyA4XSA9IHVuc2hpZnQoZW50cnkub2Zmc2V0LCA4KSAmIDI1NTtcbiAgICBhcnJbaSAqIDE3ICsgOV0gPSB1bnNoaWZ0KGVudHJ5Lm9mZnNldCwgMTYpICYgMjU1O1xuICAgIGFycltpICogMTcgKyAxMF0gPSB1bnNoaWZ0KGVudHJ5Lm9mZnNldCwgMjQpICYgMjU1O1xuICAgIGFycltpICogMTcgKyAxMV0gPSB1bnNoaWZ0KGVudHJ5Lm9mZnNldCwgMzIpICYgMjU1O1xuICAgIGFycltpICogMTcgKyAxMl0gPSB1bnNoaWZ0KGVudHJ5Lm9mZnNldCwgNDgpICYgMjU1O1xuICAgIGFycltpICogMTcgKyAxM10gPSBlbnRyeS5sZW5ndGggJiAyNTU7XG4gICAgYXJyW2kgKiAxNyArIDE0XSA9IGVudHJ5Lmxlbmd0aCA+PiA4ICYgMjU1O1xuICAgIGFycltpICogMTcgKyAxNV0gPSBlbnRyeS5sZW5ndGggPj4gMTYgJiAyNTU7XG4gICAgYXJyW2kgKiAxNyArIDE2XSA9IGVudHJ5Lmxlbmd0aCA+PiAyNCAmIDI1NTtcbiAgfVxuICByZXR1cm4gYnVmZmVyO1xufTtcbnZhciBkZXJpdmVMZWFmID0gKHZpZXcsIHRpbGUpID0+IHtcbiAgaWYgKHZpZXcuYnl0ZUxlbmd0aCA8IDE3KVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCBudW1FbnRyaWVzID0gdmlldy5ieXRlTGVuZ3RoIC8gMTc7XG4gIGNvbnN0IGVudHJ5ID0gcGFyc2VFbnRyeSh2aWV3LCBudW1FbnRyaWVzIC0gMSk7XG4gIGlmIChlbnRyeS5pc0Rpcikge1xuICAgIGNvbnN0IGxlYWZMZXZlbCA9IGVudHJ5Lno7XG4gICAgY29uc3QgbGV2ZWxEaWZmID0gdGlsZS56IC0gbGVhZkxldmVsO1xuICAgIGNvbnN0IGxlYWZYID0gTWF0aC50cnVuYyh0aWxlLnggLyAoMSA8PCBsZXZlbERpZmYpKTtcbiAgICBjb25zdCBsZWFmWSA9IE1hdGgudHJ1bmModGlsZS55IC8gKDEgPDwgbGV2ZWxEaWZmKSk7XG4gICAgcmV0dXJuIHsgejogbGVhZkxldmVsLCB4OiBsZWFmWCwgeTogbGVhZlkgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5mdW5jdGlvbiBnZXRIZWFkZXIoc291cmNlKSB7XG4gIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgcmVzcCA9IHlpZWxkIHNvdXJjZS5nZXRCeXRlcygwLCA1MTJlMyk7XG4gICAgY29uc3QgZGF0YXZpZXcgPSBuZXcgRGF0YVZpZXcocmVzcC5kYXRhKTtcbiAgICBjb25zdCBqc29uU2l6ZSA9IGRhdGF2aWV3LmdldFVpbnQzMig0LCB0cnVlKTtcbiAgICBjb25zdCByb290RW50cmllcyA9IGRhdGF2aWV3LmdldFVpbnQxNig4LCB0cnVlKTtcbiAgICBjb25zdCBkZWMgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBqc29uTWV0YWRhdGEgPSBKU09OLnBhcnNlKFxuICAgICAgZGVjLmRlY29kZShuZXcgRGF0YVZpZXcocmVzcC5kYXRhLCAxMCwganNvblNpemUpKVxuICAgICk7XG4gICAgbGV0IHRpbGVDb21wcmVzc2lvbiA9IDAgLyogVW5rbm93biAqLztcbiAgICBpZiAoanNvbk1ldGFkYXRhLmNvbXByZXNzaW9uID09PSBcImd6aXBcIikge1xuICAgICAgdGlsZUNvbXByZXNzaW9uID0gMiAvKiBHemlwICovO1xuICAgIH1cbiAgICBsZXQgbWluem9vbSA9IDA7XG4gICAgaWYgKFwibWluem9vbVwiIGluIGpzb25NZXRhZGF0YSkge1xuICAgICAgbWluem9vbSA9ICtqc29uTWV0YWRhdGEubWluem9vbTtcbiAgICB9XG4gICAgbGV0IG1heHpvb20gPSAwO1xuICAgIGlmIChcIm1heHpvb21cIiBpbiBqc29uTWV0YWRhdGEpIHtcbiAgICAgIG1heHpvb20gPSAranNvbk1ldGFkYXRhLm1heHpvb207XG4gICAgfVxuICAgIGxldCBjZW50ZXJMb24gPSAwO1xuICAgIGxldCBjZW50ZXJMYXQgPSAwO1xuICAgIGxldCBjZW50ZXJab29tID0gMDtcbiAgICBsZXQgbWluTG9uID0gLTE4MDtcbiAgICBsZXQgbWluTGF0ID0gLTg1O1xuICAgIGxldCBtYXhMb24gPSAxODA7XG4gICAgbGV0IG1heExhdCA9IDg1O1xuICAgIGlmIChqc29uTWV0YWRhdGEuYm91bmRzKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IGpzb25NZXRhZGF0YS5ib3VuZHMuc3BsaXQoXCIsXCIpO1xuICAgICAgbWluTG9uID0gK3NwbGl0WzBdO1xuICAgICAgbWluTGF0ID0gK3NwbGl0WzFdO1xuICAgICAgbWF4TG9uID0gK3NwbGl0WzJdO1xuICAgICAgbWF4TGF0ID0gK3NwbGl0WzNdO1xuICAgIH1cbiAgICBpZiAoanNvbk1ldGFkYXRhLmNlbnRlcikge1xuICAgICAgY29uc3Qgc3BsaXQgPSBqc29uTWV0YWRhdGEuY2VudGVyLnNwbGl0KFwiLFwiKTtcbiAgICAgIGNlbnRlckxvbiA9ICtzcGxpdFswXTtcbiAgICAgIGNlbnRlckxhdCA9ICtzcGxpdFsxXTtcbiAgICAgIGNlbnRlclpvb20gPSArc3BsaXRbMl07XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlciA9IHtcbiAgICAgIHNwZWNWZXJzaW9uOiBkYXRhdmlldy5nZXRVaW50MTYoMiwgdHJ1ZSksXG4gICAgICByb290RGlyZWN0b3J5T2Zmc2V0OiAxMCArIGpzb25TaXplLFxuICAgICAgcm9vdERpcmVjdG9yeUxlbmd0aDogcm9vdEVudHJpZXMgKiAxNyxcbiAgICAgIGpzb25NZXRhZGF0YU9mZnNldDogMTAsXG4gICAgICBqc29uTWV0YWRhdGFMZW5ndGg6IGpzb25TaXplLFxuICAgICAgbGVhZkRpcmVjdG9yeU9mZnNldDogMCxcbiAgICAgIGxlYWZEaXJlY3RvcnlMZW5ndGg6IHZvaWQgMCxcbiAgICAgIHRpbGVEYXRhT2Zmc2V0OiAwLFxuICAgICAgdGlsZURhdGFMZW5ndGg6IHZvaWQgMCxcbiAgICAgIG51bUFkZHJlc3NlZFRpbGVzOiAwLFxuICAgICAgbnVtVGlsZUVudHJpZXM6IDAsXG4gICAgICBudW1UaWxlQ29udGVudHM6IDAsXG4gICAgICBjbHVzdGVyZWQ6IGZhbHNlLFxuICAgICAgaW50ZXJuYWxDb21wcmVzc2lvbjogMSAvKiBOb25lICovLFxuICAgICAgdGlsZUNvbXByZXNzaW9uLFxuICAgICAgdGlsZVR5cGU6IDEgLyogTXZ0ICovLFxuICAgICAgbWluWm9vbTogbWluem9vbSxcbiAgICAgIG1heFpvb206IG1heHpvb20sXG4gICAgICBtaW5Mb24sXG4gICAgICBtaW5MYXQsXG4gICAgICBtYXhMb24sXG4gICAgICBtYXhMYXQsXG4gICAgICBjZW50ZXJab29tLFxuICAgICAgY2VudGVyTG9uLFxuICAgICAgY2VudGVyTGF0LFxuICAgICAgZXRhZzogcmVzcC5ldGFnXG4gICAgfTtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGdldFp4eShoZWFkZXIsIHNvdXJjZSwgY2FjaGUsIHosIHgsIHksIHNpZ25hbCkge1xuICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgIGxldCByb290RGlyID0geWllbGQgY2FjaGUuZ2V0QXJyYXlCdWZmZXIoXG4gICAgICBzb3VyY2UsXG4gICAgICBoZWFkZXIucm9vdERpcmVjdG9yeU9mZnNldCxcbiAgICAgIGhlYWRlci5yb290RGlyZWN0b3J5TGVuZ3RoLFxuICAgICAgaGVhZGVyXG4gICAgKTtcbiAgICBpZiAoaGVhZGVyLnNwZWNWZXJzaW9uID09PSAxKSB7XG4gICAgICByb290RGlyID0gc29ydERpcihyb290RGlyKTtcbiAgICB9XG4gICAgY29uc3QgZW50cnkgPSBxdWVyeVRpbGUobmV3IERhdGFWaWV3KHJvb3REaXIpLCB6LCB4LCB5KTtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGNvbnN0IHJlc3AgPSB5aWVsZCBzb3VyY2UuZ2V0Qnl0ZXMoZW50cnkub2Zmc2V0LCBlbnRyeS5sZW5ndGgsIHNpZ25hbCk7XG4gICAgICBsZXQgdGlsZURhdGEgPSByZXNwLmRhdGE7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KHRpbGVEYXRhKTtcbiAgICAgIGlmICh2aWV3LmdldFVpbnQ4KDApID09PSAzMSAmJiB2aWV3LmdldFVpbnQ4KDEpID09PSAxMzkpIHtcbiAgICAgICAgdGlsZURhdGEgPSBkZWNvbXByZXNzU3luYyhuZXcgVWludDhBcnJheSh0aWxlRGF0YSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogdGlsZURhdGFcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGxlYWZjb29yZHMgPSBkZXJpdmVMZWFmKG5ldyBEYXRhVmlldyhyb290RGlyKSwgeyB6LCB4LCB5IH0pO1xuICAgIGlmIChsZWFmY29vcmRzKSB7XG4gICAgICBjb25zdCBsZWFmZGlyRW50cnkgPSBxdWVyeUxlYWZkaXIoXG4gICAgICAgIG5ldyBEYXRhVmlldyhyb290RGlyKSxcbiAgICAgICAgbGVhZmNvb3Jkcy56LFxuICAgICAgICBsZWFmY29vcmRzLngsXG4gICAgICAgIGxlYWZjb29yZHMueVxuICAgICAgKTtcbiAgICAgIGlmIChsZWFmZGlyRW50cnkpIHtcbiAgICAgICAgbGV0IGxlYWZEaXIgPSB5aWVsZCBjYWNoZS5nZXRBcnJheUJ1ZmZlcihcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgbGVhZmRpckVudHJ5Lm9mZnNldCxcbiAgICAgICAgICBsZWFmZGlyRW50cnkubGVuZ3RoLFxuICAgICAgICAgIGhlYWRlclxuICAgICAgICApO1xuICAgICAgICBpZiAoaGVhZGVyLnNwZWNWZXJzaW9uID09PSAxKSB7XG4gICAgICAgICAgbGVhZkRpciA9IHNvcnREaXIobGVhZkRpcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGlsZUVudHJ5ID0gcXVlcnlUaWxlKG5ldyBEYXRhVmlldyhsZWFmRGlyKSwgeiwgeCwgeSk7XG4gICAgICAgIGlmICh0aWxlRW50cnkpIHtcbiAgICAgICAgICBjb25zdCByZXNwID0geWllbGQgc291cmNlLmdldEJ5dGVzKFxuICAgICAgICAgICAgdGlsZUVudHJ5Lm9mZnNldCxcbiAgICAgICAgICAgIHRpbGVFbnRyeS5sZW5ndGgsXG4gICAgICAgICAgICBzaWduYWxcbiAgICAgICAgICApO1xuICAgICAgICAgIGxldCB0aWxlRGF0YSA9IHJlc3AuZGF0YTtcbiAgICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KHRpbGVEYXRhKTtcbiAgICAgICAgICBpZiAodmlldy5nZXRVaW50OCgwKSA9PT0gMzEgJiYgdmlldy5nZXRVaW50OCgxKSA9PT0gMTM5KSB7XG4gICAgICAgICAgICB0aWxlRGF0YSA9IGRlY29tcHJlc3NTeW5jKG5ldyBVaW50OEFycmF5KHRpbGVEYXRhKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB0aWxlRGF0YVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfSk7XG59XG52YXIgdjJfZGVmYXVsdCA9IHtcbiAgZ2V0SGVhZGVyLFxuICBnZXRaeHlcbn07XG5cbi8vIGFkYXB0ZXJzLnRzXG52YXIgbGVhZmxldFJhc3RlckxheWVyID0gKHNvdXJjZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbG9hZGVkID0gZmFsc2U7XG4gIGxldCBtaW1lVHlwZSA9IFwiXCI7XG4gIGNvbnN0IGNscyA9IEwuR3JpZExheWVyLmV4dGVuZCh7XG4gICAgY3JlYXRlVGlsZTogKGNvb3JkLCBkb25lKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICBlbC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH07XG4gICAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICBzb3VyY2UuZ2V0SGVhZGVyKCkudGhlbigoaGVhZGVyKSA9PiB7XG4gICAgICAgICAgaWYgKGhlYWRlci50aWxlVHlwZSA9PT0gMSAvKiBNdnQgKi8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiRXJyb3I6IGFyY2hpdmUgY29udGFpbnMgTVZUIHZlY3RvciB0aWxlcywgYnV0IGxlYWZsZXRSYXN0ZXJMYXllciBpcyBmb3IgZGlzcGxheWluZyByYXN0ZXIgdGlsZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9tYXBzL1BNVGlsZXMvdHJlZS9tYWluL2pzIGZvciBkZXRhaWxzLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyLnRpbGVUeXBlID09PSAyKSB7XG4gICAgICAgICAgICBtaW1lVHlwZSA9IFwiaW1hZ2UvcG5nXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIudGlsZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG1pbWVUeXBlID0gXCJpbWFnZS9qcGVnXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIudGlsZVR5cGUgPT09IDQpIHtcbiAgICAgICAgICAgIG1pbWVUeXBlID0gXCJpbWFnZS93ZWJwXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIudGlsZVR5cGUgPT09IDUpIHtcbiAgICAgICAgICAgIG1pbWVUeXBlID0gXCJpbWFnZS9hdmlmXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9hZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHNvdXJjZS5nZXRaeHkoY29vcmQueiwgY29vcmQueCwgY29vcmQueSwgc2lnbmFsKS50aGVuKChhcnIpID0+IHtcbiAgICAgICAgaWYgKGFycikge1xuICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYXJyLmRhdGFdLCB7IHR5cGU6IG1pbWVUeXBlIH0pO1xuICAgICAgICAgIGNvbnN0IGltYWdlVXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgZWwuc3JjID0gaW1hZ2VVcmw7XG4gICAgICAgICAgZWwuY2FuY2VsID0gdm9pZCAwO1xuICAgICAgICAgIGRvbmUodm9pZCAwLCBlbCk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGlmIChlLm5hbWUgIT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZWw7XG4gICAgfSxcbiAgICBfcmVtb3ZlVGlsZTogZnVuY3Rpb24oa2V5KSB7XG4gICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNba2V5XTtcbiAgICAgIGlmICghdGlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGlsZS5lbC5jYW5jZWwpXG4gICAgICAgIHRpbGUuZWwuY2FuY2VsKCk7XG4gICAgICB0aWxlLmVsLndpZHRoID0gMDtcbiAgICAgIHRpbGUuZWwuaGVpZ2h0ID0gMDtcbiAgICAgIHRpbGUuZWwuZGVsZXRlZCA9IHRydWU7XG4gICAgICBMLkRvbVV0aWwucmVtb3ZlKHRpbGUuZWwpO1xuICAgICAgZGVsZXRlIHRoaXMuX3RpbGVzW2tleV07XG4gICAgICB0aGlzLmZpcmUoXCJ0aWxldW5sb2FkXCIsIHtcbiAgICAgICAgdGlsZTogdGlsZS5lbCxcbiAgICAgICAgY29vcmRzOiB0aGlzLl9rZXlUb1RpbGVDb29yZHMoa2V5KVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG5ldyBjbHMob3B0aW9ucyk7XG59O1xudmFyIHYzY29tcGF0ID0gKHY0KSA9PiAocmVxdWVzdFBhcmFtZXRlcnMsIGFyZzIpID0+IHtcbiAgaWYgKGFyZzIgaW5zdGFuY2VvZiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gdjQocmVxdWVzdFBhcmFtZXRlcnMsIGFyZzIpO1xuICB9XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgdjQocmVxdWVzdFBhcmFtZXRlcnMsIGFib3J0Q29udHJvbGxlcikudGhlbihcbiAgICAocmVzdWx0KSA9PiB7XG4gICAgICByZXR1cm4gYXJnMihcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICByZXN1bHQuZGF0YSxcbiAgICAgICAgcmVzdWx0LmNhY2hlQ29udHJvbCB8fCBcIlwiLFxuICAgICAgICByZXN1bHQuZXhwaXJlcyB8fCBcIlwiXG4gICAgICApO1xuICAgIH0sXG4gICAgKGVycjIpID0+IHtcbiAgICAgIHJldHVybiBhcmcyKGVycjIpO1xuICAgIH1cbiAgKS5jYXRjaCgoZSkgPT4ge1xuICAgIHJldHVybiBhcmcyKGUpO1xuICB9KTtcbiAgcmV0dXJuIHsgY2FuY2VsOiAoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKSB9O1xufTtcbnZhciBQcm90b2NvbCA9IGNsYXNzIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIE1hcExpYnJlIFBNVGlsZXMgcHJvdG9jb2wuXG4gICAqXG4gICAqICogbWV0YWRhdGE6IGFsc28gbG9hZCB0aGUgbWV0YWRhdGEgc2VjdGlvbiBvZiB0aGUgUE1UaWxlcy4gcmVxdWlyZWQgZm9yIHNvbWUgXCJpbnNwZWN0XCIgZnVuY3Rpb25hbGl0eVxuICAgKiBhbmQgdG8gYXV0b21hdGljYWxseSBwb3B1bGF0ZSB0aGUgbWFwIGF0dHJpYnV0aW9uLiBSZXF1aXJlcyBhbiBleHRyYSBIVFRQIHJlcXVlc3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB0aGlzLnRpbGV2NCA9IChwYXJhbXMsIGFib3J0Q29udHJvbGxlcikgPT4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICBjb25zdCBwbXRpbGVzVXJsMiA9IHBhcmFtcy51cmwuc3Vic3RyKDEwKTtcbiAgICAgICAgbGV0IGluc3RhbmNlMiA9IHRoaXMudGlsZXMuZ2V0KHBtdGlsZXNVcmwyKTtcbiAgICAgICAgaWYgKCFpbnN0YW5jZTIpIHtcbiAgICAgICAgICBpbnN0YW5jZTIgPSBuZXcgUE1UaWxlcyhwbXRpbGVzVXJsMik7XG4gICAgICAgICAgdGhpcy50aWxlcy5zZXQocG10aWxlc1VybDIsIGluc3RhbmNlMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGEpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogeWllbGQgaW5zdGFuY2UyLmdldFRpbGVKc29uKHBhcmFtcy51cmwpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoID0geWllbGQgaW5zdGFuY2UyLmdldEhlYWRlcigpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRpbGVzOiBbYCR7cGFyYW1zLnVybH0ve3p9L3t4fS97eX1gXSxcbiAgICAgICAgICAgIG1pbnpvb206IGgubWluWm9vbSxcbiAgICAgICAgICAgIG1heHpvb206IGgubWF4Wm9vbSxcbiAgICAgICAgICAgIGJvdW5kczogW2gubWluTG9uLCBoLm1pbkxhdCwgaC5tYXhMb24sIGgubWF4TGF0XVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgvcG10aWxlczpcXC9cXC8oLispXFwvKFxcZCspXFwvKFxcZCspXFwvKFxcZCspLyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJhbXMudXJsLm1hdGNoKHJlKTtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUE1UaWxlcyBwcm90b2NvbCBVUkxcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBwbXRpbGVzVXJsID0gcmVzdWx0WzFdO1xuICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy50aWxlcy5nZXQocG10aWxlc1VybCk7XG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIGluc3RhbmNlID0gbmV3IFBNVGlsZXMocG10aWxlc1VybCk7XG4gICAgICAgIHRoaXMudGlsZXMuc2V0KHBtdGlsZXNVcmwsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHogPSByZXN1bHRbMl07XG4gICAgICBjb25zdCB4ID0gcmVzdWx0WzNdO1xuICAgICAgY29uc3QgeSA9IHJlc3VsdFs0XTtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHlpZWxkIGluc3RhbmNlLmdldEhlYWRlcigpO1xuICAgICAgY29uc3QgcmVzcCA9IHlpZWxkIGluc3RhbmNlID09IG51bGwgPyB2b2lkIDAgOiBpbnN0YW5jZS5nZXRaeHkoK3osICt4LCAreSwgYWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICBpZiAocmVzcCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KHJlc3AuZGF0YSksXG4gICAgICAgICAgY2FjaGVDb250cm9sOiByZXNwLmNhY2hlQ29udHJvbCxcbiAgICAgICAgICBleHBpcmVzOiByZXNwLmV4cGlyZXNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkZXIudGlsZVR5cGUgPT09IDEgLyogTXZ0ICovKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IG51bGwgfTtcbiAgICB9KTtcbiAgICB0aGlzLnRpbGUgPSB2M2NvbXBhdCh0aGlzLnRpbGV2NCk7XG4gICAgdGhpcy50aWxlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgdGhpcy5tZXRhZGF0YSA9IChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLm1ldGFkYXRhKSB8fCBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEge0BsaW5rIFBNVGlsZXN9IGluc3RhbmNlIHRvIHRoZSBnbG9iYWwgcHJvdG9jb2wgaW5zdGFuY2UuXG4gICAqXG4gICAqIEZvciByZW1vdGUgZmV0Y2ggc291cmNlcywgcmVmZXJlbmNlcyBpbiBNYXBMaWJyZSBzdHlsZXMgbGlrZSBwbXRpbGVzOi8vaHR0cDovLy4uLlxuICAgKiB3aWxsIHJlc29sdmUgdG8gdGhlIHNhbWUgaW5zdGFuY2UgaWYgdGhlIFVSTHMgbWF0Y2guXG4gICAqL1xuICBhZGQocCkge1xuICAgIHRoaXMudGlsZXMuc2V0KHAuc291cmNlLmdldEtleSgpLCBwKTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2ggYSB7QGxpbmsgUE1UaWxlc30gaW5zdGFuY2UgYnkgVVJMLCBmb3IgcmVtb3RlIFBNVGlsZXMgaW5zdGFuY2VzLlxuICAgKi9cbiAgZ2V0KHVybCkge1xuICAgIHJldHVybiB0aGlzLnRpbGVzLmdldCh1cmwpO1xuICB9XG59O1xuXG4vLyBpbmRleC50c1xuZnVuY3Rpb24gdG9OdW0obG93LCBoaWdoKSB7XG4gIHJldHVybiAoaGlnaCA+Pj4gMCkgKiA0Mjk0OTY3Mjk2ICsgKGxvdyA+Pj4gMCk7XG59XG5mdW5jdGlvbiByZWFkVmFyaW50UmVtYWluZGVyKGwsIHApIHtcbiAgY29uc3QgYnVmID0gcC5idWY7XG4gIGxldCBiID0gYnVmW3AucG9zKytdO1xuICBsZXQgaCA9IChiICYgMTEyKSA+PiA0O1xuICBpZiAoYiA8IDEyOClcbiAgICByZXR1cm4gdG9OdW0obCwgaCk7XG4gIGIgPSBidWZbcC5wb3MrK107XG4gIGggfD0gKGIgJiAxMjcpIDw8IDM7XG4gIGlmIChiIDwgMTI4KVxuICAgIHJldHVybiB0b051bShsLCBoKTtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCB8PSAoYiAmIDEyNykgPDwgMTA7XG4gIGlmIChiIDwgMTI4KVxuICAgIHJldHVybiB0b051bShsLCBoKTtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCB8PSAoYiAmIDEyNykgPDwgMTc7XG4gIGlmIChiIDwgMTI4KVxuICAgIHJldHVybiB0b051bShsLCBoKTtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCB8PSAoYiAmIDEyNykgPDwgMjQ7XG4gIGlmIChiIDwgMTI4KVxuICAgIHJldHVybiB0b051bShsLCBoKTtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCB8PSAoYiAmIDEpIDw8IDMxO1xuICBpZiAoYiA8IDEyOClcbiAgICByZXR1cm4gdG9OdW0obCwgaCk7XG4gIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzXCIpO1xufVxuZnVuY3Rpb24gcmVhZFZhcmludChwKSB7XG4gIGNvbnN0IGJ1ZiA9IHAuYnVmO1xuICBsZXQgYiA9IGJ1ZltwLnBvcysrXTtcbiAgbGV0IHZhbCA9IGIgJiAxMjc7XG4gIGlmIChiIDwgMTI4KVxuICAgIHJldHVybiB2YWw7XG4gIGIgPSBidWZbcC5wb3MrK107XG4gIHZhbCB8PSAoYiAmIDEyNykgPDwgNztcbiAgaWYgKGIgPCAxMjgpXG4gICAgcmV0dXJuIHZhbDtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgdmFsIHw9IChiICYgMTI3KSA8PCAxNDtcbiAgaWYgKGIgPCAxMjgpXG4gICAgcmV0dXJuIHZhbDtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgdmFsIHw9IChiICYgMTI3KSA8PCAyMTtcbiAgaWYgKGIgPCAxMjgpXG4gICAgcmV0dXJuIHZhbDtcbiAgYiA9IGJ1ZltwLnBvc107XG4gIHZhbCB8PSAoYiAmIDE1KSA8PCAyODtcbiAgcmV0dXJuIHJlYWRWYXJpbnRSZW1haW5kZXIodmFsLCBwKTtcbn1cbmZ1bmN0aW9uIHJvdGF0ZShuLCB4eSwgcngsIHJ5KSB7XG4gIGlmIChyeSA9PT0gMCkge1xuICAgIGlmIChyeCA9PT0gMSkge1xuICAgICAgeHlbMF0gPSBuIC0gMSAtIHh5WzBdO1xuICAgICAgeHlbMV0gPSBuIC0gMSAtIHh5WzFdO1xuICAgIH1cbiAgICBjb25zdCB0ID0geHlbMF07XG4gICAgeHlbMF0gPSB4eVsxXTtcbiAgICB4eVsxXSA9IHQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGlkT25MZXZlbCh6LCBwb3MpIHtcbiAgY29uc3QgbiA9IF9fcG93KDIsIHopO1xuICBsZXQgcnggPSBwb3M7XG4gIGxldCByeSA9IHBvcztcbiAgbGV0IHQgPSBwb3M7XG4gIGNvbnN0IHh5ID0gWzAsIDBdO1xuICBsZXQgcyA9IDE7XG4gIHdoaWxlIChzIDwgbikge1xuICAgIHJ4ID0gMSAmIHQgLyAyO1xuICAgIHJ5ID0gMSAmICh0IF4gcngpO1xuICAgIHJvdGF0ZShzLCB4eSwgcngsIHJ5KTtcbiAgICB4eVswXSArPSBzICogcng7XG4gICAgeHlbMV0gKz0gcyAqIHJ5O1xuICAgIHQgPSB0IC8gNDtcbiAgICBzICo9IDI7XG4gIH1cbiAgcmV0dXJuIFt6LCB4eVswXSwgeHlbMV1dO1xufVxudmFyIHR6VmFsdWVzID0gW1xuICAwLFxuICAxLFxuICA1LFxuICAyMSxcbiAgODUsXG4gIDM0MSxcbiAgMTM2NSxcbiAgNTQ2MSxcbiAgMjE4NDUsXG4gIDg3MzgxLFxuICAzNDk1MjUsXG4gIDEzOTgxMDEsXG4gIDU1OTI0MDUsXG4gIDIyMzY5NjIxLFxuICA4OTQ3ODQ4NSxcbiAgMzU3OTEzOTQxLFxuICAxNDMxNjU1NzY1LFxuICA1NzI2NjIzMDYxLFxuICAyMjkwNjQ5MjI0NSxcbiAgOTE2MjU5Njg5ODEsXG4gIDM2NjUwMzg3NTkyNSxcbiAgMTQ2NjAxNTUwMzcwMSxcbiAgNTg2NDA2MjAxNDgwNSxcbiAgMjM0NTYyNDgwNTkyMjEsXG4gIDkzODI0OTkyMjM2ODg1LFxuICAzNzUyOTk5Njg5NDc1NDEsXG4gIDE1MDExOTk4NzU3OTAxNjVcbl07XG5mdW5jdGlvbiB6eHlUb1RpbGVJZCh6LCB4LCB5KSB7XG4gIGlmICh6ID4gMjYpIHtcbiAgICB0aHJvdyBFcnJvcihcIlRpbGUgem9vbSBsZXZlbCBleGNlZWRzIG1heCBzYWZlIG51bWJlciBsaW1pdCAoMjYpXCIpO1xuICB9XG4gIGlmICh4ID4gX19wb3coMiwgeikgLSAxIHx8IHkgPiBfX3BvdygyLCB6KSAtIDEpIHtcbiAgICB0aHJvdyBFcnJvcihcInRpbGUgeC95IG91dHNpZGUgem9vbSBsZXZlbCBib3VuZHNcIik7XG4gIH1cbiAgY29uc3QgYWNjID0gdHpWYWx1ZXNbel07XG4gIGNvbnN0IG4gPSBfX3BvdygyLCB6KTtcbiAgbGV0IHJ4ID0gMDtcbiAgbGV0IHJ5ID0gMDtcbiAgbGV0IGQgPSAwO1xuICBjb25zdCB4eSA9IFt4LCB5XTtcbiAgbGV0IHMgPSBuIC8gMjtcbiAgd2hpbGUgKHMgPiAwKSB7XG4gICAgcnggPSAoeHlbMF0gJiBzKSA+IDAgPyAxIDogMDtcbiAgICByeSA9ICh4eVsxXSAmIHMpID4gMCA/IDEgOiAwO1xuICAgIGQgKz0gcyAqIHMgKiAoMyAqIHJ4IF4gcnkpO1xuICAgIHJvdGF0ZShzLCB4eSwgcngsIHJ5KTtcbiAgICBzID0gcyAvIDI7XG4gIH1cbiAgcmV0dXJuIGFjYyArIGQ7XG59XG5mdW5jdGlvbiB0aWxlSWRUb1p4eShpKSB7XG4gIGxldCBhY2MgPSAwO1xuICBjb25zdCB6ID0gMDtcbiAgZm9yIChsZXQgejIgPSAwOyB6MiA8IDI3OyB6MisrKSB7XG4gICAgY29uc3QgbnVtVGlsZXMgPSAoMSA8PCB6MikgKiAoMSA8PCB6Mik7XG4gICAgaWYgKGFjYyArIG51bVRpbGVzID4gaSkge1xuICAgICAgcmV0dXJuIGlkT25MZXZlbCh6MiwgaSAtIGFjYyk7XG4gICAgfVxuICAgIGFjYyArPSBudW1UaWxlcztcbiAgfVxuICB0aHJvdyBFcnJvcihcIlRpbGUgem9vbSBsZXZlbCBleGNlZWRzIG1heCBzYWZlIG51bWJlciBsaW1pdCAoMjYpXCIpO1xufVxudmFyIENvbXByZXNzaW9uID0gLyogQF9fUFVSRV9fICovICgoQ29tcHJlc3Npb24yKSA9PiB7XG4gIENvbXByZXNzaW9uMltDb21wcmVzc2lvbjJbXCJVbmtub3duXCJdID0gMF0gPSBcIlVua25vd25cIjtcbiAgQ29tcHJlc3Npb24yW0NvbXByZXNzaW9uMltcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xuICBDb21wcmVzc2lvbjJbQ29tcHJlc3Npb24yW1wiR3ppcFwiXSA9IDJdID0gXCJHemlwXCI7XG4gIENvbXByZXNzaW9uMltDb21wcmVzc2lvbjJbXCJCcm90bGlcIl0gPSAzXSA9IFwiQnJvdGxpXCI7XG4gIENvbXByZXNzaW9uMltDb21wcmVzc2lvbjJbXCJac3RkXCJdID0gNF0gPSBcIlpzdGRcIjtcbiAgcmV0dXJuIENvbXByZXNzaW9uMjtcbn0pKENvbXByZXNzaW9uIHx8IHt9KTtcbmZ1bmN0aW9uIGRlZmF1bHREZWNvbXByZXNzKGJ1ZiwgY29tcHJlc3Npb24pIHtcbiAgcmV0dXJuIF9fYXN5bmModGhpcywgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoY29tcHJlc3Npb24gPT09IDEgLyogTm9uZSAqLyB8fCBjb21wcmVzc2lvbiA9PT0gMCAvKiBVbmtub3duICovKSB7XG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICBpZiAoY29tcHJlc3Npb24gPT09IDIgLyogR3ppcCAqLykge1xuICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLkRlY29tcHJlc3Npb25TdHJlYW0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIGRlY29tcHJlc3NTeW5jKG5ldyBVaW50OEFycmF5KGJ1ZikpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IFJlc3BvbnNlKGJ1ZikuYm9keTtcbiAgICAgIGlmICghc3RyZWFtKSB7XG4gICAgICAgIHRocm93IEVycm9yKFwiRmFpbGVkIHRvIHJlYWQgcmVzcG9uc2Ugc3RyZWFtXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyZWFtLnBpcGVUaHJvdWdoKFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludDogbmVlZGVkIHRvIGRldGVjdCBEZWNvbXByZXNzaW9uU3RyZWFtIGluIGJyb3dzZXIrbm9kZStjbG91ZGZsYXJlIHdvcmtlcnNcbiAgICAgICAgbmV3IGdsb2JhbFRoaXMuRGVjb21wcmVzc2lvblN0cmVhbShcImd6aXBcIilcbiAgICAgICk7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3VsdCkuYXJyYXlCdWZmZXIoKTtcbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoXCJDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZFwiKTtcbiAgfSk7XG59XG52YXIgVGlsZVR5cGUgPSAvKiBAX19QVVJFX18gKi8gKChUaWxlVHlwZTIpID0+IHtcbiAgVGlsZVR5cGUyW1RpbGVUeXBlMltcIlVua25vd25cIl0gPSAwXSA9IFwiVW5rbm93blwiO1xuICBUaWxlVHlwZTJbVGlsZVR5cGUyW1wiTXZ0XCJdID0gMV0gPSBcIk12dFwiO1xuICBUaWxlVHlwZTJbVGlsZVR5cGUyW1wiUG5nXCJdID0gMl0gPSBcIlBuZ1wiO1xuICBUaWxlVHlwZTJbVGlsZVR5cGUyW1wiSnBlZ1wiXSA9IDNdID0gXCJKcGVnXCI7XG4gIFRpbGVUeXBlMltUaWxlVHlwZTJbXCJXZWJwXCJdID0gNF0gPSBcIldlYnBcIjtcbiAgVGlsZVR5cGUyW1RpbGVUeXBlMltcIkF2aWZcIl0gPSA1XSA9IFwiQXZpZlwiO1xuICByZXR1cm4gVGlsZVR5cGUyO1xufSkoVGlsZVR5cGUgfHwge30pO1xuZnVuY3Rpb24gdGlsZVR5cGVFeHQodCkge1xuICBpZiAodCA9PT0gMSAvKiBNdnQgKi8pXG4gICAgcmV0dXJuIFwiLm12dFwiO1xuICBpZiAodCA9PT0gMiAvKiBQbmcgKi8pXG4gICAgcmV0dXJuIFwiLnBuZ1wiO1xuICBpZiAodCA9PT0gMyAvKiBKcGVnICovKVxuICAgIHJldHVybiBcIi5qcGdcIjtcbiAgaWYgKHQgPT09IDQgLyogV2VicCAqLylcbiAgICByZXR1cm4gXCIud2VicFwiO1xuICBpZiAodCA9PT0gNSAvKiBBdmlmICovKVxuICAgIHJldHVybiBcIi5hdmlmXCI7XG4gIHJldHVybiBcIlwiO1xufVxudmFyIEhFQURFUl9TSVpFX0JZVEVTID0gMTI3O1xuZnVuY3Rpb24gZmluZFRpbGUoZW50cmllcywgdGlsZUlkKSB7XG4gIGxldCBtID0gMDtcbiAgbGV0IG4gPSBlbnRyaWVzLmxlbmd0aCAtIDE7XG4gIHdoaWxlIChtIDw9IG4pIHtcbiAgICBjb25zdCBrID0gbiArIG0gPj4gMTtcbiAgICBjb25zdCBjbXAgPSB0aWxlSWQgLSBlbnRyaWVzW2tdLnRpbGVJZDtcbiAgICBpZiAoY21wID4gMCkge1xuICAgICAgbSA9IGsgKyAxO1xuICAgIH0gZWxzZSBpZiAoY21wIDwgMCkge1xuICAgICAgbiA9IGsgLSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZW50cmllc1trXTtcbiAgICB9XG4gIH1cbiAgaWYgKG4gPj0gMCkge1xuICAgIGlmIChlbnRyaWVzW25dLnJ1bkxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGVudHJpZXNbbl07XG4gICAgfVxuICAgIGlmICh0aWxlSWQgLSBlbnRyaWVzW25dLnRpbGVJZCA8IGVudHJpZXNbbl0ucnVuTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZW50cmllc1tuXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG52YXIgRmlsZVNvdXJjZSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoZmlsZSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gIH1cbiAgZ2V0S2V5KCkge1xuICAgIHJldHVybiB0aGlzLmZpbGUubmFtZTtcbiAgfVxuICBnZXRCeXRlcyhvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBibG9iID0gdGhpcy5maWxlLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgIGNvbnN0IGEgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7XG4gICAgICByZXR1cm4geyBkYXRhOiBhIH07XG4gICAgfSk7XG4gIH1cbn07XG52YXIgRmV0Y2hTb3VyY2UgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHVybCwgY3VzdG9tSGVhZGVycyA9IG5ldyBIZWFkZXJzKCkpIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLmN1c3RvbUhlYWRlcnMgPSBjdXN0b21IZWFkZXJzO1xuICAgIHRoaXMubXVzdFJlbG9hZCA9IGZhbHNlO1xuICAgIGxldCB1c2VyQWdlbnQgPSBcIlwiO1xuICAgIGlmIChcIm5hdmlnYXRvclwiIGluIGdsb2JhbFRoaXMpIHtcbiAgICAgIHVzZXJBZ2VudCA9IGdsb2JhbFRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudCB8fCBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBpc1dpbmRvd3MgPSB1c2VyQWdlbnQuaW5kZXhPZihcIldpbmRvd3NcIikgPiAtMTtcbiAgICBjb25zdCBpc0Nocm9taXVtQmFzZWQgPSAvQ2hyb21lfENocm9taXVtfEVkZ3xPUFJ8QnJhdmUvLnRlc3QodXNlckFnZW50KTtcbiAgICB0aGlzLmNocm9tZVdpbmRvd3NOb0NhY2hlID0gZmFsc2U7XG4gICAgaWYgKGlzV2luZG93cyAmJiBpc0Nocm9taXVtQmFzZWQpIHtcbiAgICAgIHRoaXMuY2hyb21lV2luZG93c05vQ2FjaGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBnZXRLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudXJsO1xuICB9XG4gIC8qKlxuICAgKiBNdXRhdGUgdGhlIGN1c3RvbSBbSGVhZGVyc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hlYWRlcnMpIHNldCBmb3IgYWxsIHJlcXVlc3RzIHRvIHRoZSByZW1vdGUgYXJjaGl2ZS5cbiAgICovXG4gIHNldEhlYWRlcnMoY3VzdG9tSGVhZGVycykge1xuICAgIHRoaXMuY3VzdG9tSGVhZGVycyA9IGN1c3RvbUhlYWRlcnM7XG4gIH1cbiAgZ2V0Qnl0ZXMob2Zmc2V0LCBsZW5ndGgsIHBhc3NlZFNpZ25hbCwgZXRhZykge1xuICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICBsZXQgY29udHJvbGxlcjtcbiAgICAgIGxldCBzaWduYWw7XG4gICAgICBpZiAocGFzc2VkU2lnbmFsKSB7XG4gICAgICAgIHNpZ25hbCA9IHBhc3NlZFNpZ25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSBuZXcgSGVhZGVycyh0aGlzLmN1c3RvbUhlYWRlcnMpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuc2V0KFwicmFuZ2VcIiwgYGJ5dGVzPSR7b2Zmc2V0fS0ke29mZnNldCArIGxlbmd0aCAtIDF9YCk7XG4gICAgICBsZXQgY2FjaGU7XG4gICAgICBpZiAodGhpcy5tdXN0UmVsb2FkKSB7XG4gICAgICAgIGNhY2hlID0gXCJyZWxvYWRcIjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaHJvbWVXaW5kb3dzTm9DYWNoZSkge1xuICAgICAgICBjYWNoZSA9IFwibm8tc3RvcmVcIjtcbiAgICAgIH1cbiAgICAgIGxldCByZXNwID0geWllbGQgZmV0Y2godGhpcy51cmwsIHtcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnNcbiAgICAgICAgLy9iaW9tZS1pZ25vcmUgbGludDogXCJjYWNoZVwiIGlzIGluY29tcGF0aWJsZSBiZXR3ZWVuIGNsb3VkZmxhcmUgd29ya2VycyBhbmQgYnJvd3NlclxuICAgICAgfSk7XG4gICAgICBpZiAob2Zmc2V0ID09PSAwICYmIHJlc3Auc3RhdHVzID09PSA0MTYpIHtcbiAgICAgICAgY29uc3QgY29udGVudFJhbmdlID0gcmVzcC5oZWFkZXJzLmdldChcIkNvbnRlbnQtUmFuZ2VcIik7XG4gICAgICAgIGlmICghY29udGVudFJhbmdlIHx8ICFjb250ZW50UmFuZ2Uuc3RhcnRzV2l0aChcImJ5dGVzICovXCIpKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJNaXNzaW5nIGNvbnRlbnQtbGVuZ3RoIG9uIDQxNiByZXNwb25zZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3R1YWxMZW5ndGggPSArY29udGVudFJhbmdlLnN1YnN0cig4KTtcbiAgICAgICAgcmVzcCA9IHlpZWxkIGZldGNoKHRoaXMudXJsLCB7XG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIGNhY2hlOiBcInJlbG9hZFwiLFxuICAgICAgICAgIGhlYWRlcnM6IHsgcmFuZ2U6IGBieXRlcz0wLSR7YWN0dWFsTGVuZ3RoIC0gMX1gIH1cbiAgICAgICAgICAvL2Jpb21lLWlnbm9yZSBsaW50OiBcImNhY2hlXCIgaXMgaW5jb21wYXRpYmxlIGJldHdlZW4gY2xvdWRmbGFyZSB3b3JrZXJzIGFuZCBicm93c2VyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbGV0IG5ld0V0YWcgPSByZXNwLmhlYWRlcnMuZ2V0KFwiRXRhZ1wiKTtcbiAgICAgIGlmIChuZXdFdGFnID09IG51bGwgPyB2b2lkIDAgOiBuZXdFdGFnLnN0YXJ0c1dpdGgoXCJXL1wiKSkge1xuICAgICAgICBuZXdFdGFnID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gNDE2IHx8IGV0YWcgJiYgbmV3RXRhZyAmJiBuZXdFdGFnICE9PSBldGFnKSB7XG4gICAgICAgIHRoaXMubXVzdFJlbG9hZCA9IHRydWU7XG4gICAgICAgIHRocm93IG5ldyBFdGFnTWlzbWF0Y2goXG4gICAgICAgICAgYFNlcnZlciByZXR1cm5lZCBub24tbWF0Y2hpbmcgRVRhZyAke2V0YWd9IGFmdGVyIG9uZSByZXRyeS4gQ2hlY2sgYnJvd3NlciBleHRlbnNpb25zIGFuZCBzZXJ2ZXJzIGZvciBpc3N1ZXMgdGhhdCBtYXkgYWZmZWN0IGNvcnJlY3QgRVRhZyBoZWFkZXJzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwLnN0YXR1cyA+PSAzMDApIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYEJhZCByZXNwb25zZSBjb2RlOiAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IHJlc3AuaGVhZGVycy5nZXQoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAwICYmICghY29udGVudExlbmd0aCB8fCArY29udGVudExlbmd0aCA+IGxlbmd0aCkpIHtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIpXG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIlNlcnZlciByZXR1cm5lZCBubyBjb250ZW50LWxlbmd0aCBoZWFkZXIgb3IgY29udGVudC1sZW5ndGggZXhjZWVkaW5nIHJlcXVlc3QuIENoZWNrIHRoYXQgeW91ciBzdG9yYWdlIGJhY2tlbmQgc3VwcG9ydHMgSFRUUCBCeXRlIFNlcnZpbmcuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGEgPSB5aWVsZCByZXNwLmFycmF5QnVmZmVyKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBhLFxuICAgICAgICBldGFnOiBuZXdFdGFnIHx8IHZvaWQgMCxcbiAgICAgICAgY2FjaGVDb250cm9sOiByZXNwLmhlYWRlcnMuZ2V0KFwiQ2FjaGUtQ29udHJvbFwiKSB8fCB2b2lkIDAsXG4gICAgICAgIGV4cGlyZXM6IHJlc3AuaGVhZGVycy5nZXQoXCJFeHBpcmVzXCIpIHx8IHZvaWQgMFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufTtcbmZ1bmN0aW9uIGdldFVpbnQ2NCh2LCBvZmZzZXQpIHtcbiAgY29uc3Qgd2ggPSB2LmdldFVpbnQzMihvZmZzZXQgKyA0LCB0cnVlKTtcbiAgY29uc3Qgd2wgPSB2LmdldFVpbnQzMihvZmZzZXQgKyAwLCB0cnVlKTtcbiAgcmV0dXJuIHdoICogX19wb3coMiwgMzIpICsgd2w7XG59XG5mdW5jdGlvbiBieXRlc1RvSGVhZGVyKGJ5dGVzLCBldGFnKSB7XG4gIGNvbnN0IHYgPSBuZXcgRGF0YVZpZXcoYnl0ZXMpO1xuICBjb25zdCBzcGVjVmVyc2lvbiA9IHYuZ2V0VWludDgoNyk7XG4gIGlmIChzcGVjVmVyc2lvbiA+IDMpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBBcmNoaXZlIGlzIHNwZWMgdmVyc2lvbiAke3NwZWNWZXJzaW9ufSBidXQgdGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHVwIHRvIHNwZWMgdmVyc2lvbiAzYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzcGVjVmVyc2lvbixcbiAgICByb290RGlyZWN0b3J5T2Zmc2V0OiBnZXRVaW50NjQodiwgOCksXG4gICAgcm9vdERpcmVjdG9yeUxlbmd0aDogZ2V0VWludDY0KHYsIDE2KSxcbiAgICBqc29uTWV0YWRhdGFPZmZzZXQ6IGdldFVpbnQ2NCh2LCAyNCksXG4gICAganNvbk1ldGFkYXRhTGVuZ3RoOiBnZXRVaW50NjQodiwgMzIpLFxuICAgIGxlYWZEaXJlY3RvcnlPZmZzZXQ6IGdldFVpbnQ2NCh2LCA0MCksXG4gICAgbGVhZkRpcmVjdG9yeUxlbmd0aDogZ2V0VWludDY0KHYsIDQ4KSxcbiAgICB0aWxlRGF0YU9mZnNldDogZ2V0VWludDY0KHYsIDU2KSxcbiAgICB0aWxlRGF0YUxlbmd0aDogZ2V0VWludDY0KHYsIDY0KSxcbiAgICBudW1BZGRyZXNzZWRUaWxlczogZ2V0VWludDY0KHYsIDcyKSxcbiAgICBudW1UaWxlRW50cmllczogZ2V0VWludDY0KHYsIDgwKSxcbiAgICBudW1UaWxlQ29udGVudHM6IGdldFVpbnQ2NCh2LCA4OCksXG4gICAgY2x1c3RlcmVkOiB2LmdldFVpbnQ4KDk2KSA9PT0gMSxcbiAgICBpbnRlcm5hbENvbXByZXNzaW9uOiB2LmdldFVpbnQ4KDk3KSxcbiAgICB0aWxlQ29tcHJlc3Npb246IHYuZ2V0VWludDgoOTgpLFxuICAgIHRpbGVUeXBlOiB2LmdldFVpbnQ4KDk5KSxcbiAgICBtaW5ab29tOiB2LmdldFVpbnQ4KDEwMCksXG4gICAgbWF4Wm9vbTogdi5nZXRVaW50OCgxMDEpLFxuICAgIG1pbkxvbjogdi5nZXRJbnQzMigxMDIsIHRydWUpIC8gMWU3LFxuICAgIG1pbkxhdDogdi5nZXRJbnQzMigxMDYsIHRydWUpIC8gMWU3LFxuICAgIG1heExvbjogdi5nZXRJbnQzMigxMTAsIHRydWUpIC8gMWU3LFxuICAgIG1heExhdDogdi5nZXRJbnQzMigxMTQsIHRydWUpIC8gMWU3LFxuICAgIGNlbnRlclpvb206IHYuZ2V0VWludDgoMTE4KSxcbiAgICBjZW50ZXJMb246IHYuZ2V0SW50MzIoMTE5LCB0cnVlKSAvIDFlNyxcbiAgICBjZW50ZXJMYXQ6IHYuZ2V0SW50MzIoMTIzLCB0cnVlKSAvIDFlNyxcbiAgICBldGFnXG4gIH07XG59XG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUluZGV4KGJ1ZmZlcikge1xuICBjb25zdCBwID0geyBidWY6IG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIHBvczogMCB9O1xuICBjb25zdCBudW1FbnRyaWVzID0gcmVhZFZhcmludChwKTtcbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBsZXQgbGFzdElkID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHtcbiAgICBjb25zdCB2ID0gcmVhZFZhcmludChwKTtcbiAgICBlbnRyaWVzLnB1c2goeyB0aWxlSWQ6IGxhc3RJZCArIHYsIG9mZnNldDogMCwgbGVuZ3RoOiAwLCBydW5MZW5ndGg6IDEgfSk7XG4gICAgbGFzdElkICs9IHY7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHtcbiAgICBlbnRyaWVzW2ldLnJ1bkxlbmd0aCA9IHJlYWRWYXJpbnQocCk7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHtcbiAgICBlbnRyaWVzW2ldLmxlbmd0aCA9IHJlYWRWYXJpbnQocCk7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHtcbiAgICBjb25zdCB2ID0gcmVhZFZhcmludChwKTtcbiAgICBpZiAodiA9PT0gMCAmJiBpID4gMCkge1xuICAgICAgZW50cmllc1tpXS5vZmZzZXQgPSBlbnRyaWVzW2kgLSAxXS5vZmZzZXQgKyBlbnRyaWVzW2kgLSAxXS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudHJpZXNbaV0ub2Zmc2V0ID0gdiAtIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuZnVuY3Rpb24gZGV0ZWN0VmVyc2lvbihhKSB7XG4gIGNvbnN0IHYgPSBuZXcgRGF0YVZpZXcoYSk7XG4gIGlmICh2LmdldFVpbnQxNigyLCB0cnVlKSA9PT0gMikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiUE1UaWxlcyBzcGVjIHZlcnNpb24gMiBoYXMgYmVlbiBkZXByZWNhdGVkOyBwbGVhc2Ugc2VlIGdpdGh1Yi5jb20vcHJvdG9tYXBzL1BNVGlsZXMgZm9yIHRvb2xzIHRvIHVwZ3JhZGVcIlxuICAgICk7XG4gICAgcmV0dXJuIDI7XG4gIH1cbiAgaWYgKHYuZ2V0VWludDE2KDIsIHRydWUpID09PSAxKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJQTVRpbGVzIHNwZWMgdmVyc2lvbiAxIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IHBsZWFzZSBzZWUgZ2l0aHViLmNvbS9wcm90b21hcHMvUE1UaWxlcyBmb3IgdG9vbHMgdG8gdXBncmFkZVwiXG4gICAgKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMztcbn1cbnZhciBFdGFnTWlzbWF0Y2ggPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbn07XG5mdW5jdGlvbiBnZXRIZWFkZXJBbmRSb290KHNvdXJjZSwgZGVjb21wcmVzcykge1xuICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJlc3AgPSB5aWVsZCBzb3VyY2UuZ2V0Qnl0ZXMoMCwgMTYzODQpO1xuICAgIGNvbnN0IHYgPSBuZXcgRGF0YVZpZXcocmVzcC5kYXRhKTtcbiAgICBpZiAodi5nZXRVaW50MTYoMCwgdHJ1ZSkgIT09IDE5NzkyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBtYWdpYyBudW1iZXIgZm9yIFBNVGlsZXMgYXJjaGl2ZVwiKTtcbiAgICB9XG4gICAgaWYgKGRldGVjdFZlcnNpb24ocmVzcC5kYXRhKSA8IDMpIHtcbiAgICAgIHJldHVybiBbeWllbGQgdjJfZGVmYXVsdC5nZXRIZWFkZXIoc291cmNlKV07XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlckRhdGEgPSByZXNwLmRhdGEuc2xpY2UoMCwgSEVBREVSX1NJWkVfQllURVMpO1xuICAgIGNvbnN0IGhlYWRlciA9IGJ5dGVzVG9IZWFkZXIoaGVhZGVyRGF0YSwgcmVzcC5ldGFnKTtcbiAgICBjb25zdCByb290RGlyRGF0YSA9IHJlc3AuZGF0YS5zbGljZShcbiAgICAgIGhlYWRlci5yb290RGlyZWN0b3J5T2Zmc2V0LFxuICAgICAgaGVhZGVyLnJvb3REaXJlY3RvcnlPZmZzZXQgKyBoZWFkZXIucm9vdERpcmVjdG9yeUxlbmd0aFxuICAgICk7XG4gICAgY29uc3QgZGlyS2V5ID0gYCR7c291cmNlLmdldEtleSgpfXwke2hlYWRlci5ldGFnIHx8IFwiXCJ9fCR7aGVhZGVyLnJvb3REaXJlY3RvcnlPZmZzZXR9fCR7aGVhZGVyLnJvb3REaXJlY3RvcnlMZW5ndGh9YDtcbiAgICBjb25zdCByb290RGlyID0gZGVzZXJpYWxpemVJbmRleChcbiAgICAgIHlpZWxkIGRlY29tcHJlc3Mocm9vdERpckRhdGEsIGhlYWRlci5pbnRlcm5hbENvbXByZXNzaW9uKVxuICAgICk7XG4gICAgcmV0dXJuIFtoZWFkZXIsIFtkaXJLZXksIHJvb3REaXIubGVuZ3RoLCByb290RGlyXV07XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0RGlyZWN0b3J5KHNvdXJjZSwgZGVjb21wcmVzcywgb2Zmc2V0LCBsZW5ndGgsIGhlYWRlcikge1xuICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJlc3AgPSB5aWVsZCBzb3VyY2UuZ2V0Qnl0ZXMob2Zmc2V0LCBsZW5ndGgsIHZvaWQgMCwgaGVhZGVyLmV0YWcpO1xuICAgIGNvbnN0IGRhdGEgPSB5aWVsZCBkZWNvbXByZXNzKHJlc3AuZGF0YSwgaGVhZGVyLmludGVybmFsQ29tcHJlc3Npb24pO1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IGRlc2VyaWFsaXplSW5kZXgoZGF0YSk7XG4gICAgaWYgKGRpcmVjdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVtcHR5IGRpcmVjdG9yeSBpcyBpbnZhbGlkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0b3J5O1xuICB9KTtcbn1cbnZhciBSZXNvbHZlZFZhbHVlQ2FjaGUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1heENhY2hlRW50cmllcyA9IDEwMCwgcHJlZmV0Y2ggPSB0cnVlLCBkZWNvbXByZXNzID0gZGVmYXVsdERlY29tcHJlc3MpIHtcbiAgICB0aGlzLmNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB0aGlzLm1heENhY2hlRW50cmllcyA9IG1heENhY2hlRW50cmllcztcbiAgICB0aGlzLmNvdW50ZXIgPSAxO1xuICAgIHRoaXMuZGVjb21wcmVzcyA9IGRlY29tcHJlc3M7XG4gIH1cbiAgZ2V0SGVhZGVyKHNvdXJjZSkge1xuICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IHNvdXJjZS5nZXRLZXkoKTtcbiAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSB0aGlzLmNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoY2FjaGVWYWx1ZSkge1xuICAgICAgICBjYWNoZVZhbHVlLmxhc3RVc2VkID0gdGhpcy5jb3VudGVyKys7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjYWNoZVZhbHVlLmRhdGE7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID0geWllbGQgZ2V0SGVhZGVyQW5kUm9vdChzb3VyY2UsIHRoaXMuZGVjb21wcmVzcyk7XG4gICAgICBpZiAocmVzWzFdKSB7XG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KHJlc1sxXVswXSwge1xuICAgICAgICAgIGxhc3RVc2VkOiB0aGlzLmNvdW50ZXIrKyxcbiAgICAgICAgICBkYXRhOiByZXNbMV1bMl1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlLnNldChjYWNoZUtleSwge1xuICAgICAgICBsYXN0VXNlZDogdGhpcy5jb3VudGVyKyssXG4gICAgICAgIGRhdGE6IHJlc1swXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBydW5lKCk7XG4gICAgICByZXR1cm4gcmVzWzBdO1xuICAgIH0pO1xuICB9XG4gIGdldERpcmVjdG9yeShzb3VyY2UsIG9mZnNldCwgbGVuZ3RoLCBoZWFkZXIpIHtcbiAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtzb3VyY2UuZ2V0S2V5KCl9fCR7aGVhZGVyLmV0YWcgfHwgXCJcIn18JHtvZmZzZXR9fCR7bGVuZ3RofWA7XG4gICAgICBjb25zdCBjYWNoZVZhbHVlID0gdGhpcy5jYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgaWYgKGNhY2hlVmFsdWUpIHtcbiAgICAgICAgY2FjaGVWYWx1ZS5sYXN0VXNlZCA9IHRoaXMuY291bnRlcisrO1xuICAgICAgICBjb25zdCBkYXRhID0gY2FjaGVWYWx1ZS5kYXRhO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpcmVjdG9yeSA9IHlpZWxkIGdldERpcmVjdG9yeShcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0aGlzLmRlY29tcHJlc3MsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgbGVuZ3RoLFxuICAgICAgICBoZWFkZXJcbiAgICAgICk7XG4gICAgICB0aGlzLmNhY2hlLnNldChjYWNoZUtleSwge1xuICAgICAgICBsYXN0VXNlZDogdGhpcy5jb3VudGVyKyssXG4gICAgICAgIGRhdGE6IGRpcmVjdG9yeVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBydW5lKCk7XG4gICAgICByZXR1cm4gZGlyZWN0b3J5O1xuICAgIH0pO1xuICB9XG4gIC8vIGZvciB2MiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBnZXRBcnJheUJ1ZmZlcihzb3VyY2UsIG9mZnNldCwgbGVuZ3RoLCBoZWFkZXIpIHtcbiAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtzb3VyY2UuZ2V0S2V5KCl9fCR7aGVhZGVyLmV0YWcgfHwgXCJcIn18JHtvZmZzZXR9fCR7bGVuZ3RofWA7XG4gICAgICBjb25zdCBjYWNoZVZhbHVlID0gdGhpcy5jYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgaWYgKGNhY2hlVmFsdWUpIHtcbiAgICAgICAgY2FjaGVWYWx1ZS5sYXN0VXNlZCA9IHRoaXMuY291bnRlcisrO1xuICAgICAgICBjb25zdCBkYXRhID0geWllbGQgY2FjaGVWYWx1ZS5kYXRhO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3AgPSB5aWVsZCBzb3VyY2UuZ2V0Qnl0ZXMob2Zmc2V0LCBsZW5ndGgsIHZvaWQgMCwgaGVhZGVyLmV0YWcpO1xuICAgICAgdGhpcy5jYWNoZS5zZXQoY2FjaGVLZXksIHtcbiAgICAgICAgbGFzdFVzZWQ6IHRoaXMuY291bnRlcisrLFxuICAgICAgICBkYXRhOiByZXNwLmRhdGFcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcnVuZSgpO1xuICAgICAgcmV0dXJuIHJlc3AuZGF0YTtcbiAgICB9KTtcbiAgfVxuICBwcnVuZSgpIHtcbiAgICBpZiAodGhpcy5jYWNoZS5zaXplID4gdGhpcy5tYXhDYWNoZUVudHJpZXMpIHtcbiAgICAgIGxldCBtaW5Vc2VkID0gSW5maW5pdHk7XG4gICAgICBsZXQgbWluS2V5ID0gdm9pZCAwO1xuICAgICAgdGhpcy5jYWNoZS5mb3JFYWNoKChjYWNoZVZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGNhY2hlVmFsdWUubGFzdFVzZWQgPCBtaW5Vc2VkKSB7XG4gICAgICAgICAgbWluVXNlZCA9IGNhY2hlVmFsdWUubGFzdFVzZWQ7XG4gICAgICAgICAgbWluS2V5ID0ga2V5O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChtaW5LZXkpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUobWluS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaW52YWxpZGF0ZShzb3VyY2UpIHtcbiAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoc291cmNlLmdldEtleSgpKTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBTaGFyZWRQcm9taXNlQ2FjaGUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1heENhY2hlRW50cmllcyA9IDEwMCwgcHJlZmV0Y2ggPSB0cnVlLCBkZWNvbXByZXNzID0gZGVmYXVsdERlY29tcHJlc3MpIHtcbiAgICB0aGlzLmNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB0aGlzLmludmFsaWRhdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIHRoaXMubWF4Q2FjaGVFbnRyaWVzID0gbWF4Q2FjaGVFbnRyaWVzO1xuICAgIHRoaXMuY291bnRlciA9IDE7XG4gICAgdGhpcy5kZWNvbXByZXNzID0gZGVjb21wcmVzcztcbiAgfVxuICBnZXRIZWFkZXIoc291cmNlKSB7XG4gICAgcmV0dXJuIF9fYXN5bmModGhpcywgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gc291cmNlLmdldEtleSgpO1xuICAgICAgY29uc3QgY2FjaGVWYWx1ZSA9IHRoaXMuY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYWNoZVZhbHVlKSB7XG4gICAgICAgIGNhY2hlVmFsdWUubGFzdFVzZWQgPSB0aGlzLmNvdW50ZXIrKztcbiAgICAgICAgY29uc3QgZGF0YSA9IHlpZWxkIGNhY2hlVmFsdWUuZGF0YTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgICBjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBnZXRIZWFkZXJBbmRSb290KHNvdXJjZSwgdGhpcy5kZWNvbXByZXNzKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzWzFdKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChyZXNbMV1bMF0sIHtcbiAgICAgICAgICAgICAgbGFzdFVzZWQ6IHRoaXMuY291bnRlcisrLFxuICAgICAgICAgICAgICBkYXRhOiBQcm9taXNlLnJlc29sdmUocmVzWzFdWzJdKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUocmVzWzBdKTtcbiAgICAgICAgICB0aGlzLnBydW5lKCk7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYWNoZS5zZXQoY2FjaGVLZXksIHsgbGFzdFVzZWQ6IHRoaXMuY291bnRlcisrLCBkYXRhOiBwIH0pO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSk7XG4gIH1cbiAgZ2V0RGlyZWN0b3J5KHNvdXJjZSwgb2Zmc2V0LCBsZW5ndGgsIGhlYWRlcikge1xuICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGAke3NvdXJjZS5nZXRLZXkoKX18JHtoZWFkZXIuZXRhZyB8fCBcIlwifXwke29mZnNldH18JHtsZW5ndGh9YDtcbiAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSB0aGlzLmNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoY2FjaGVWYWx1ZSkge1xuICAgICAgICBjYWNoZVZhbHVlLmxhc3RVc2VkID0gdGhpcy5jb3VudGVyKys7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB5aWVsZCBjYWNoZVZhbHVlLmRhdGE7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZ2V0RGlyZWN0b3J5KHNvdXJjZSwgdGhpcy5kZWNvbXByZXNzLCBvZmZzZXQsIGxlbmd0aCwgaGVhZGVyKS50aGVuKChkaXJlY3RvcnkpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGRpcmVjdG9yeSk7XG4gICAgICAgICAgdGhpcy5wcnVuZSgpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGNhY2hlS2V5LCB7IGxhc3RVc2VkOiB0aGlzLmNvdW50ZXIrKywgZGF0YTogcCB9KTtcbiAgICAgIHJldHVybiBwO1xuICAgIH0pO1xuICB9XG4gIC8vIGZvciB2MiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBnZXRBcnJheUJ1ZmZlcihzb3VyY2UsIG9mZnNldCwgbGVuZ3RoLCBoZWFkZXIpIHtcbiAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtzb3VyY2UuZ2V0S2V5KCl9fCR7aGVhZGVyLmV0YWcgfHwgXCJcIn18JHtvZmZzZXR9fCR7bGVuZ3RofWA7XG4gICAgICBjb25zdCBjYWNoZVZhbHVlID0gdGhpcy5jYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgaWYgKGNhY2hlVmFsdWUpIHtcbiAgICAgICAgY2FjaGVWYWx1ZS5sYXN0VXNlZCA9IHRoaXMuY291bnRlcisrO1xuICAgICAgICBjb25zdCBkYXRhID0geWllbGQgY2FjaGVWYWx1ZS5kYXRhO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNvdXJjZS5nZXRCeXRlcyhvZmZzZXQsIGxlbmd0aCwgdm9pZCAwLCBoZWFkZXIuZXRhZykudGhlbigocmVzcCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUocmVzcC5kYXRhKTtcbiAgICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHJ1bmUoKTtcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNhY2hlLnNldChjYWNoZUtleSwgeyBsYXN0VXNlZDogdGhpcy5jb3VudGVyKyssIGRhdGE6IHAgfSk7XG4gICAgICByZXR1cm4gcDtcbiAgICB9KTtcbiAgfVxuICBwcnVuZSgpIHtcbiAgICBpZiAodGhpcy5jYWNoZS5zaXplID49IHRoaXMubWF4Q2FjaGVFbnRyaWVzKSB7XG4gICAgICBsZXQgbWluVXNlZCA9IEluZmluaXR5O1xuICAgICAgbGV0IG1pbktleSA9IHZvaWQgMDtcbiAgICAgIHRoaXMuY2FjaGUuZm9yRWFjaCgoY2FjaGVWYWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChjYWNoZVZhbHVlLmxhc3RVc2VkIDwgbWluVXNlZCkge1xuICAgICAgICAgIG1pblVzZWQgPSBjYWNoZVZhbHVlLmxhc3RVc2VkO1xuICAgICAgICAgIG1pbktleSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAobWluS2V5KSB7XG4gICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKG1pbktleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGludmFsaWRhdGUoc291cmNlKSB7XG4gICAgcmV0dXJuIF9fYXN5bmModGhpcywgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IGtleSA9IHNvdXJjZS5nZXRLZXkoKTtcbiAgICAgIGlmICh0aGlzLmludmFsaWRhdGlvbnMuZ2V0KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMuaW52YWxpZGF0aW9ucy5nZXQoa2V5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKHNvdXJjZS5nZXRLZXkoKSk7XG4gICAgICBjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmdldEhlYWRlcihzb3VyY2UpLnRoZW4oKGgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgdGhpcy5pbnZhbGlkYXRpb25zLmRlbGV0ZShrZXkpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaW52YWxpZGF0aW9ucy5zZXQoa2V5LCBwKTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBQTVRpbGVzID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UsIGNhY2hlLCBkZWNvbXByZXNzKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuc291cmNlID0gbmV3IEZldGNoU291cmNlKHNvdXJjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBpZiAoZGVjb21wcmVzcykge1xuICAgICAgdGhpcy5kZWNvbXByZXNzID0gZGVjb21wcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvbXByZXNzID0gZGVmYXVsdERlY29tcHJlc3M7XG4gICAgfVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhY2hlID0gbmV3IFNoYXJlZFByb21pc2VDYWNoZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBoZWFkZXIgb2YgdGhlIGFyY2hpdmUsXG4gICAqIGluY2x1ZGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRpbGUgdHlwZSwgbWluL21heCB6b29tLCBib3VuZHMsIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MuXG4gICAqL1xuICBnZXRIZWFkZXIoKSB7XG4gICAgcmV0dXJuIF9fYXN5bmModGhpcywgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICAgIHJldHVybiB5aWVsZCB0aGlzLmNhY2hlLmdldEhlYWRlcih0aGlzLnNvdXJjZSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqIEBoaWRkZW4gKi9cbiAgZ2V0Wnh5QXR0ZW1wdCh6LCB4LCB5LCBzaWduYWwpIHtcbiAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgdGlsZUlkID0genh5VG9UaWxlSWQoeiwgeCwgeSk7XG4gICAgICBjb25zdCBoZWFkZXIgPSB5aWVsZCB0aGlzLmNhY2hlLmdldEhlYWRlcih0aGlzLnNvdXJjZSk7XG4gICAgICBpZiAoaGVhZGVyLnNwZWNWZXJzaW9uIDwgMykge1xuICAgICAgICByZXR1cm4gdjJfZGVmYXVsdC5nZXRaeHkoaGVhZGVyLCB0aGlzLnNvdXJjZSwgdGhpcy5jYWNoZSwgeiwgeCwgeSwgc2lnbmFsKTtcbiAgICAgIH1cbiAgICAgIGlmICh6IDwgaGVhZGVyLm1pblpvb20gfHwgeiA+IGhlYWRlci5tYXhab29tKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9XG4gICAgICBsZXQgZE8gPSBoZWFkZXIucm9vdERpcmVjdG9yeU9mZnNldDtcbiAgICAgIGxldCBkTCA9IGhlYWRlci5yb290RGlyZWN0b3J5TGVuZ3RoO1xuICAgICAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8PSAzOyBkZXB0aCsrKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdG9yeSA9IHlpZWxkIHRoaXMuY2FjaGUuZ2V0RGlyZWN0b3J5KFxuICAgICAgICAgIHRoaXMuc291cmNlLFxuICAgICAgICAgIGRPLFxuICAgICAgICAgIGRMLFxuICAgICAgICAgIGhlYWRlclxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlbnRyeSA9IGZpbmRUaWxlKGRpcmVjdG9yeSwgdGlsZUlkKTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgaWYgKGVudHJ5LnJ1bkxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3AgPSB5aWVsZCB0aGlzLnNvdXJjZS5nZXRCeXRlcyhcbiAgICAgICAgICAgICAgaGVhZGVyLnRpbGVEYXRhT2Zmc2V0ICsgZW50cnkub2Zmc2V0LFxuICAgICAgICAgICAgICBlbnRyeS5sZW5ndGgsXG4gICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgICAgaGVhZGVyLmV0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhOiB5aWVsZCB0aGlzLmRlY29tcHJlc3MocmVzcC5kYXRhLCBoZWFkZXIudGlsZUNvbXByZXNzaW9uKSxcbiAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiByZXNwLmNhY2hlQ29udHJvbCxcbiAgICAgICAgICAgICAgZXhwaXJlczogcmVzcC5leHBpcmVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkTyA9IGhlYWRlci5sZWFmRGlyZWN0b3J5T2Zmc2V0ICsgZW50cnkub2Zmc2V0O1xuICAgICAgICAgIGRMID0gZW50cnkubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IEVycm9yKFwiTWF4aW11bSBkaXJlY3RvcnkgZGVwdGggZXhjZWVkZWRcIik7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFByaW1hcnkgbWV0aG9kIHRvIGdldCBhIHNpbmdsZSB0aWxlJ3MgYnl0ZXMgZnJvbSBhbiBhcmNoaXZlLlxuICAgKlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgdGlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYXJjaGl2ZS5cbiAgICovXG4gIGdldFp4eSh6LCB4LCB5LCBzaWduYWwpIHtcbiAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMuZ2V0Wnh5QXR0ZW1wdCh6LCB4LCB5LCBzaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEV0YWdNaXNtYXRjaCkge1xuICAgICAgICAgIHRoaXMuY2FjaGUuaW52YWxpZGF0ZSh0aGlzLnNvdXJjZSk7XG4gICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMuZ2V0Wnh5QXR0ZW1wdCh6LCB4LCB5LCBzaWduYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqIEBoaWRkZW4gKi9cbiAgZ2V0TWV0YWRhdGFBdHRlbXB0KCkge1xuICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSB5aWVsZCB0aGlzLmNhY2hlLmdldEhlYWRlcih0aGlzLnNvdXJjZSk7XG4gICAgICBjb25zdCByZXNwID0geWllbGQgdGhpcy5zb3VyY2UuZ2V0Qnl0ZXMoXG4gICAgICAgIGhlYWRlci5qc29uTWV0YWRhdGFPZmZzZXQsXG4gICAgICAgIGhlYWRlci5qc29uTWV0YWRhdGFMZW5ndGgsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgaGVhZGVyLmV0YWdcbiAgICAgICk7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWQgPSB5aWVsZCB0aGlzLmRlY29tcHJlc3MoXG4gICAgICAgIHJlc3AuZGF0YSxcbiAgICAgICAgaGVhZGVyLmludGVybmFsQ29tcHJlc3Npb25cbiAgICAgICk7XG4gICAgICBjb25zdCBkZWMgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlYy5kZWNvZGUoZGVjb21wcmVzc2VkKSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgYXJiaXRyYXJ5IEpTT04gbWV0YWRhdGEgb2YgdGhlIGFyY2hpdmUuXG4gICAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMuZ2V0TWV0YWRhdGFBdHRlbXB0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXRhZ01pc21hdGNoKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZS5pbnZhbGlkYXRlKHRoaXMuc291cmNlKTtcbiAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5nZXRNZXRhZGF0YUF0dGVtcHQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBbVGlsZUpTT05dKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvdGlsZWpzb24tc3BlYykgb2JqZWN0LlxuICAgKlxuICAgKiBiYXNlVGlsZXNVcmwgaXMgdGhlIGRlc2lyZWQgdGlsZXMgVVJMLCBleGNsdWRpbmcgdGhlIHN1ZmZpeCBgL3t6fS97eH0ve3l9LntleHR9YC5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBkZXNpcmVkIFVSTCBpcyBgaHR0cDovL2V4YW1wbGUuY29tL3RpbGVzZXQve3p9L3t4fS97eX0ubXZ0YCxcbiAgICogdGhlIGJhc2VUaWxlc1VybCBzaG91bGQgYmUgYGh0dHBzOi8vZXhhbXBsZS5jb20vdGlsZXNldGAuXG4gICAqL1xuICBnZXRUaWxlSnNvbihiYXNlVGlsZXNVcmwpIHtcbiAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgaGVhZGVyID0geWllbGQgdGhpcy5nZXRIZWFkZXIoKTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0geWllbGQgdGhpcy5nZXRNZXRhZGF0YSgpO1xuICAgICAgY29uc3QgZXh0ID0gdGlsZVR5cGVFeHQoaGVhZGVyLnRpbGVUeXBlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpbGVqc29uOiBcIjMuMC4wXCIsXG4gICAgICAgIHNjaGVtZTogXCJ4eXpcIixcbiAgICAgICAgdGlsZXM6IFtgJHtiYXNlVGlsZXNVcmx9L3t6fS97eH0ve3l9JHtleHR9YF0sXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50OiBUaWxlSlNPTiBzcGVjXG4gICAgICAgIHZlY3Rvcl9sYXllcnM6IG1ldGFkYXRhLnZlY3Rvcl9sYXllcnMsXG4gICAgICAgIGF0dHJpYnV0aW9uOiBtZXRhZGF0YS5hdHRyaWJ1dGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBtZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICBib3VuZHM6IFtoZWFkZXIubWluTG9uLCBoZWFkZXIubWluTGF0LCBoZWFkZXIubWF4TG9uLCBoZWFkZXIubWF4TGF0XSxcbiAgICAgICAgY2VudGVyOiBbaGVhZGVyLmNlbnRlckxvbiwgaGVhZGVyLmNlbnRlckxhdCwgaGVhZGVyLmNlbnRlclpvb21dLFxuICAgICAgICBtaW56b29tOiBoZWFkZXIubWluWm9vbSxcbiAgICAgICAgbWF4em9vbTogaGVhZGVyLm1heFpvb21cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn07XG5leHBvcnQge1xuICBDb21wcmVzc2lvbixcbiAgRXRhZ01pc21hdGNoLFxuICBGZXRjaFNvdXJjZSxcbiAgRmlsZVNvdXJjZSxcbiAgUE1UaWxlcyxcbiAgUHJvdG9jb2wsXG4gIFJlc29sdmVkVmFsdWVDYWNoZSxcbiAgU2hhcmVkUHJvbWlzZUNhY2hlLFxuICBUaWxlVHlwZSxcbiAgYnl0ZXNUb0hlYWRlcixcbiAgZmluZFRpbGUsXG4gIGdldFVpbnQ2NCxcbiAgbGVhZmxldFJhc3RlckxheWVyLFxuICByZWFkVmFyaW50LFxuICB0aWxlSWRUb1p4eSxcbiAgdGlsZVR5cGVFeHQsXG4gIHp4eVRvVGlsZUlkXG59O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCBcIi4vTWFwXCI7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=