vis-core 0.22.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/index.module.js +5 -4
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document!="undefined"){var t=document.createElement("style");t.appendChild(document.createTextNode(".-translate-x-1\\/2,.-translate-y-1\\/2{--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1 }.shadow{--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000 }.ring{--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000 }.invert,.filter{--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: }.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.left-1\\/2{left:50%}.top-1\\/2{top:50%}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.whitespace-nowrap{white-space:nowrap}.text-center{text-align:center}.text-xs{font-size:12px;line-height:16px}.leading-\\[1\\]{line-height:1}.text-\\[\\#809083\\]{--tw-text-opacity: 1;color:rgb(128 144 131 / var(--tw-text-opacity))}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}")),document.head.appendChild(t)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}})();
|
|
2
|
-
"use strict";var Tn=Object.defineProperty,Mn=Object.defineProperties;var Nn=Object.getOwnPropertyDescriptors;var Cn=Object.getOwnPropertySymbols,Fn=Object.getPrototypeOf,Hn=Object.prototype.hasOwnProperty,kn=Object.prototype.propertyIsEnumerable,Jn=Reflect.get;var Zn=(c,e)=>(e=Symbol[c])?e:Symbol.for("Symbol."+c),wn=c=>{throw TypeError(c)},ln=Math.pow,Rn=(c,e,s)=>e in c?Tn(c,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):c[e]=s,ci=(c,e)=>{for(var s in e||(e={}))Hn.call(e,s)&&Rn(c,s,e[s]);if(Cn)for(var s of Cn(e))kn.call(e,s)&&Rn(c,s,e[s]);return c},zi=(c,e)=>Mn(c,Nn(e));var F0=(c,e,s)=>Rn(c,typeof e!="symbol"?e+"":e,s);var on=(c,e,s)=>Jn(Fn(c),s,e);var q0=(c,e,s)=>new Promise((r,f)=>{var de=Ke=>{try{Je(s.next(Ke))}catch(Qe){f(Qe)}},Xe=Ke=>{try{Je(s.throw(Ke))}catch(Qe){f(Qe)}},Je=Ke=>Ke.done?r(Ke.value):Promise.resolve(Ke.value).then(de,Xe);Je((s=s.apply(c,e)).next())}),Kn=function(c,e){this[0]=c,this[1]=e};var Ln=c=>{var e=c[Zn("asyncIterator")],s=!1,r,f={};return e==null?(e=c[Zn("iterator")](),r=de=>f[de]=Xe=>e[de](Xe)):(e=e.call(c),r=de=>f[de]=Xe=>{if(s){if(s=!1,de==="throw")throw Xe;return Xe}return s=!0,{done:!1,value:new Kn(new Promise(Je=>{var Ke=e[de](Xe);Ke instanceof Object||wn("Object expected"),Je(Ke)}),1)}}),f[Zn("iterator")]=()=>f,r("next"),"throw"in e?r("throw"):f.throw=de=>{throw de},"return"in e&&r("return"),f},Yn=(c,e,s)=>(e=c[Zn("asyncIterator")])?e.call(c):(c=c[Zn("iterator")](),e={},s=(r,f)=>(f=c[r])&&(e[r]=de=>new Promise((Xe,Je,Ke)=>(de=f.call(c,de),Ke=de.done,Promise.resolve(de.value).then(Qe=>Xe({value:Qe,done:Ke}),Je)))),s("next"),s("return"),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const jsrsasign=require("jsrsasign"),CryptoJS=require("crypto-js"),esusLite=require("esus-lite"),events=require("events"),lodashEs=require("lodash-es"),turf=require("@turf/turf"),json100000=require("geojson-cn/extra/100000-lite-next.json"),countries=require("geojson-cn/extra/countries-next.json"),continents=require("geojson-cn/extra/continents.json"),geojsonCn=require("geojson-cn"),chinaJson=require("geojson-cn/extra/100000-next.json");Array.prototype.at||(Array.prototype.at=function(c){return c<0&&(c=this.length+c),this[c]});const publicKeyPEM="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyTG1aVVQzVG9LZEVRRUdrdUU1QQo3dnlYTzRMM1Z6NDA5RFF2a2xzRHZ2SytNM2M2OGl4ZEVhZDZFcnZGS2FKQ1QrNTZNdU1XSXhUTnlDZDVQSkFGCjVYdzI4cW1iVkVCR3FGdXVIZTltSm5GUmRXN1NpK1Z1cTZvRWxwQkRkeEFIQ0dsWVVpU1R3WmhBbjJaVXJLSUYKd1J2c1k1bi9uWWNhZnl5QW9tRjhmNVRsTkpwS1JtbDU3WlRSWjBMdzdQRDFSeHFIbmJ0YWFETkpiSDV5eFd6cQpaVTBwQWhxMFNkNHdlOW1DUTJWWXc5czhtUERLbW4rU083eGovSUsrR1ZEaEJNOUpaZ3VIcGFZUGt3bWd5UkdwCkx6V0tHMkZULzJRalZUT1dRT09mRFVtVitDSVlsN1hVVlh1Q0toYWFNQ0ZVa1JQOHg4aEZucmNFeklHQ1JpM3IKK3dJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t",accessToken={token:void 0,getInfo(){if(!this.token)return"";const[c,e,s]=this.token.split(":::"),r=jsrsasign.KEYUTIL.getKey(atob(publicKeyPEM)),f=CryptoJS.enc.Base64.parse(e),de=CryptoJS.enc.Base64.parse(s),Xe=CryptoJS.lib.WordArray.create(f.words.slice(0,4)),Je=CryptoJS.lib.WordArray.create(f.words.slice(4)),Ke=jsrsasign.KJUR.crypto.Util.hashHex(f.toString(),"sha256"),Qe=r.verifyWithMessageHashPSS(Ke,jsrsasign.b64tohex(c),"sha256",32);if(!Qe)return this.token=void 0,"";const $e=CryptoJS.AES.decrypt({ciphertext:Je},de,{iv:Xe,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8),qe=JSON.parse($e),st=Date.now();return!qe.s||qe.s>st?(this.token=void 0,""):qe.e&&qe.e<st?(this.token=void 0,""):(qe.isValid=Qe,qe)}},version="0.22.
|
|
1
|
+
(function(){"use strict";try{if(typeof document!="undefined"){var t=document.createElement("style");t.appendChild(document.createTextNode(".-translate-x-1\\/2,.-translate-y-1\\/2{--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1 }.shadow{--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000 }.ring{--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000 }.invert,.filter{--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: }.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.left-1\\/2{left:50%}.top-1\\/2{top:50%}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.whitespace-nowrap{white-space:nowrap}.text-center{text-align:center}.text-sm{font-size:14px;line-height:20px}.text-xs{font-size:12px;line-height:16px}.leading-\\[1\\]{line-height:1}.text-\\[\\#809083\\]{--tw-text-opacity: 1;color:rgb(128 144 131 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-opacity-80{--tw-text-opacity: .8 }.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}")),document.head.appendChild(t)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}})();
|
|
2
|
+
"use strict";var Tn=Object.defineProperty,Mn=Object.defineProperties;var Nn=Object.getOwnPropertyDescriptors;var Cn=Object.getOwnPropertySymbols,Fn=Object.getPrototypeOf,Hn=Object.prototype.hasOwnProperty,kn=Object.prototype.propertyIsEnumerable,Jn=Reflect.get;var Zn=(c,e)=>(e=Symbol[c])?e:Symbol.for("Symbol."+c),wn=c=>{throw TypeError(c)},ln=Math.pow,Rn=(c,e,s)=>e in c?Tn(c,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):c[e]=s,ci=(c,e)=>{for(var s in e||(e={}))Hn.call(e,s)&&Rn(c,s,e[s]);if(Cn)for(var s of Cn(e))kn.call(e,s)&&Rn(c,s,e[s]);return c},zi=(c,e)=>Mn(c,Nn(e));var F0=(c,e,s)=>Rn(c,typeof e!="symbol"?e+"":e,s);var on=(c,e,s)=>Jn(Fn(c),s,e);var q0=(c,e,s)=>new Promise((r,f)=>{var de=Ke=>{try{Je(s.next(Ke))}catch(Qe){f(Qe)}},Xe=Ke=>{try{Je(s.throw(Ke))}catch(Qe){f(Qe)}},Je=Ke=>Ke.done?r(Ke.value):Promise.resolve(Ke.value).then(de,Xe);Je((s=s.apply(c,e)).next())}),Kn=function(c,e){this[0]=c,this[1]=e};var Ln=c=>{var e=c[Zn("asyncIterator")],s=!1,r,f={};return e==null?(e=c[Zn("iterator")](),r=de=>f[de]=Xe=>e[de](Xe)):(e=e.call(c),r=de=>f[de]=Xe=>{if(s){if(s=!1,de==="throw")throw Xe;return Xe}return s=!0,{done:!1,value:new Kn(new Promise(Je=>{var Ke=e[de](Xe);Ke instanceof Object||wn("Object expected"),Je(Ke)}),1)}}),f[Zn("iterator")]=()=>f,r("next"),"throw"in e?r("throw"):f.throw=de=>{throw de},"return"in e&&r("return"),f},Yn=(c,e,s)=>(e=c[Zn("asyncIterator")])?e.call(c):(c=c[Zn("iterator")](),e={},s=(r,f)=>(f=c[r])&&(e[r]=de=>new Promise((Xe,Je,Ke)=>(de=f.call(c,de),Ke=de.done,Promise.resolve(de.value).then(Qe=>Xe({value:Qe,done:Ke}),Je)))),s("next"),s("return"),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const jsrsasign=require("jsrsasign"),CryptoJS=require("crypto-js"),esusLite=require("esus-lite"),events=require("events"),lodashEs=require("lodash-es"),turf=require("@turf/turf"),json100000=require("geojson-cn/extra/100000-lite-next.json"),countries=require("geojson-cn/extra/countries-next.json"),continents=require("geojson-cn/extra/continents.json"),geojsonCn=require("geojson-cn"),chinaJson=require("geojson-cn/extra/100000-next.json");Array.prototype.at||(Array.prototype.at=function(c){return c<0&&(c=this.length+c),this[c]});const publicKeyPEM="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyTG1aVVQzVG9LZEVRRUdrdUU1QQo3dnlYTzRMM1Z6NDA5RFF2a2xzRHZ2SytNM2M2OGl4ZEVhZDZFcnZGS2FKQ1QrNTZNdU1XSXhUTnlDZDVQSkFGCjVYdzI4cW1iVkVCR3FGdXVIZTltSm5GUmRXN1NpK1Z1cTZvRWxwQkRkeEFIQ0dsWVVpU1R3WmhBbjJaVXJLSUYKd1J2c1k1bi9uWWNhZnl5QW9tRjhmNVRsTkpwS1JtbDU3WlRSWjBMdzdQRDFSeHFIbmJ0YWFETkpiSDV5eFd6cQpaVTBwQWhxMFNkNHdlOW1DUTJWWXc5czhtUERLbW4rU083eGovSUsrR1ZEaEJNOUpaZ3VIcGFZUGt3bWd5UkdwCkx6V0tHMkZULzJRalZUT1dRT09mRFVtVitDSVlsN1hVVlh1Q0toYWFNQ0ZVa1JQOHg4aEZucmNFeklHQ1JpM3IKK3dJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t",accessToken={token:void 0,getInfo(){if(!this.token)return"";const[c,e,s]=this.token.split(":::"),r=jsrsasign.KEYUTIL.getKey(atob(publicKeyPEM)),f=CryptoJS.enc.Base64.parse(e),de=CryptoJS.enc.Base64.parse(s),Xe=CryptoJS.lib.WordArray.create(f.words.slice(0,4)),Je=CryptoJS.lib.WordArray.create(f.words.slice(4)),Ke=jsrsasign.KJUR.crypto.Util.hashHex(f.toString(),"sha256"),Qe=r.verifyWithMessageHashPSS(Ke,jsrsasign.b64tohex(c),"sha256",32);if(!Qe)return this.token=void 0,"";const $e=CryptoJS.AES.decrypt({ciphertext:Je},de,{iv:Xe,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8),qe=JSON.parse($e),st=Date.now();return!qe.s||qe.s>st?(this.token=void 0,""):qe.e&&qe.e<st?(this.token=void 0,""):(qe.isValid=Qe,qe)}},version="0.22.1";/**
|
|
3
3
|
* @license
|
|
4
4
|
* Copyright 2010-2024 Three.js Authors
|
|
5
5
|
* SPDX-License-Identifier: MIT
|
|
@@ -5263,7 +5263,7 @@ version 0.8.2
|
|
|
5263
5263
|
Contributions by leeoniya.
|
|
5264
5264
|
License: MIT, header required.
|
|
5265
5265
|
*/const Matrix=function(){var c=Math.cos,e=Math.sin,s=Math.tan,r=Math.round;function f(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function de(c0){if(c0===0)return this;var l0=c(c0),m0=e(c0);return this._t(l0,-m0,0,0,m0,l0,0,0,0,0,1,0,0,0,0,1)}function Xe(c0){if(c0===0)return this;var l0=c(c0),m0=e(c0);return this._t(1,0,0,0,0,l0,-m0,0,0,m0,l0,0,0,0,0,1)}function Je(c0){if(c0===0)return this;var l0=c(c0),m0=e(c0);return this._t(l0,0,m0,0,0,1,0,0,-m0,0,l0,0,0,0,0,1)}function Ke(c0){if(c0===0)return this;var l0=c(c0),m0=e(c0);return this._t(l0,-m0,0,0,m0,l0,0,0,0,0,1,0,0,0,0,1)}function Qe(c0,l0){return this._t(1,l0,c0,1,0,0)}function _e(c0,l0){return this.shear(s(c0),s(l0))}function $e(c0,l0){var m0=c(l0),v0=e(l0);return this._t(m0,v0,0,0,-v0,m0,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,s(c0),1,0,0,0,0,1,0,0,0,0,1)._t(m0,-v0,0,0,v0,m0,0,0,0,0,1,0,0,0,0,1)}function qe(c0,l0,m0){return!m0&&m0!==0&&(m0=1),c0===1&&l0===1&&m0===1?this:this._t(c0,0,0,0,0,l0,0,0,0,0,m0,0,0,0,0,1)}function st(c0,l0,m0,v0,I0,P0,ri,T0,E0,_0,ii,ui,Xi,bi,Ci,D0){return this.props[0]=c0,this.props[1]=l0,this.props[2]=m0,this.props[3]=v0,this.props[4]=I0,this.props[5]=P0,this.props[6]=ri,this.props[7]=T0,this.props[8]=E0,this.props[9]=_0,this.props[10]=ii,this.props[11]=ui,this.props[12]=Xi,this.props[13]=bi,this.props[14]=Ci,this.props[15]=D0,this}function dt(c0,l0,m0){return m0=m0||0,c0!==0||l0!==0||m0!==0?this._t(1,0,0,0,0,1,0,0,0,0,1,0,c0,l0,m0,1):this}function Wt(c0,l0,m0,v0,I0,P0,ri,T0,E0,_0,ii,ui,Xi,bi,Ci,D0){var K0=this.props;if(c0===1&&l0===0&&m0===0&&v0===0&&I0===0&&P0===1&&ri===0&&T0===0&&E0===0&&_0===0&&ii===1&&ui===0)return K0[12]=K0[12]*c0+K0[15]*Xi,K0[13]=K0[13]*P0+K0[15]*bi,K0[14]=K0[14]*ii+K0[15]*Ci,K0[15]*=D0,this._identityCalculated=!1,this;var S0=K0[0],yi=K0[1],ai=K0[2],Q0=K0[3],U0=K0[4],ti=K0[5],ei=K0[6],V0=K0[7],b0=K0[8],M0=K0[9],B0=K0[10],$0=K0[11],A0=K0[12],Wi=K0[13],Zi=K0[14],mi=K0[15];return K0[0]=S0*c0+yi*I0+ai*E0+Q0*Xi,K0[1]=S0*l0+yi*P0+ai*_0+Q0*bi,K0[2]=S0*m0+yi*ri+ai*ii+Q0*Ci,K0[3]=S0*v0+yi*T0+ai*ui+Q0*D0,K0[4]=U0*c0+ti*I0+ei*E0+V0*Xi,K0[5]=U0*l0+ti*P0+ei*_0+V0*bi,K0[6]=U0*m0+ti*ri+ei*ii+V0*Ci,K0[7]=U0*v0+ti*T0+ei*ui+V0*D0,K0[8]=b0*c0+M0*I0+B0*E0+$0*Xi,K0[9]=b0*l0+M0*P0+B0*_0+$0*bi,K0[10]=b0*m0+M0*ri+B0*ii+$0*Ci,K0[11]=b0*v0+M0*T0+B0*ui+$0*D0,K0[12]=A0*c0+Wi*I0+Zi*E0+mi*Xi,K0[13]=A0*l0+Wi*P0+Zi*_0+mi*bi,K0[14]=A0*m0+Wi*ri+Zi*ii+mi*Ci,K0[15]=A0*v0+Wi*T0+Zi*ui+mi*D0,this._identityCalculated=!1,this}function Yt(){return this._identityCalculated||(this._identity=!(this.props[0]!==1||this.props[1]!==0||this.props[2]!==0||this.props[3]!==0||this.props[4]!==0||this.props[5]!==1||this.props[6]!==0||this.props[7]!==0||this.props[8]!==0||this.props[9]!==0||this.props[10]!==1||this.props[11]!==0||this.props[12]!==0||this.props[13]!==0||this.props[14]!==0||this.props[15]!==1),this._identityCalculated=!0),this._identity}function rt(c0){for(var l0=0;l0<16;){if(c0.props[l0]!==this.props[l0])return!1;l0+=1}return!0}function Zt(c0){var l0;for(l0=0;l0<16;l0+=1)c0.props[l0]=this.props[l0];return c0}function vt(c0){var l0;for(l0=0;l0<16;l0+=1)this.props[l0]=c0[l0]}function Tt(c0,l0,m0){return{x:c0*this.props[0]+l0*this.props[4]+m0*this.props[8]+this.props[12],y:c0*this.props[1]+l0*this.props[5]+m0*this.props[9]+this.props[13],z:c0*this.props[2]+l0*this.props[6]+m0*this.props[10]+this.props[14]}}function Jt(c0,l0,m0){return c0*this.props[0]+l0*this.props[4]+m0*this.props[8]+this.props[12]}function $t(c0,l0,m0){return c0*this.props[1]+l0*this.props[5]+m0*this.props[9]+this.props[13]}function e0(c0,l0,m0){return c0*this.props[2]+l0*this.props[6]+m0*this.props[10]+this.props[14]}function t0(){var c0=this.props[0]*this.props[5]-this.props[1]*this.props[4],l0=this.props[5]/c0,m0=-this.props[1]/c0,v0=-this.props[4]/c0,I0=this.props[0]/c0,P0=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/c0,ri=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/c0,T0=new Matrix;return T0.props[0]=l0,T0.props[1]=m0,T0.props[4]=v0,T0.props[5]=I0,T0.props[12]=P0,T0.props[13]=ri,T0}function i0(c0){var l0=this.getInverseMatrix();return l0.applyToPointArray(c0[0],c0[1],c0[2]||0)}function n0(c0){var l0,m0=c0.length,v0=[];for(l0=0;l0<m0;l0+=1)v0[l0]=i0(c0[l0]);return v0}function s0(c0,l0,m0){var v0=createTypedArray("float32",6);if(this.isIdentity())v0[0]=c0[0],v0[1]=c0[1],v0[2]=l0[0],v0[3]=l0[1],v0[4]=m0[0],v0[5]=m0[1];else{var I0=this.props[0],P0=this.props[1],ri=this.props[4],T0=this.props[5],E0=this.props[12],_0=this.props[13];v0[0]=c0[0]*I0+c0[1]*ri+E0,v0[1]=c0[0]*P0+c0[1]*T0+_0,v0[2]=l0[0]*I0+l0[1]*ri+E0,v0[3]=l0[0]*P0+l0[1]*T0+_0,v0[4]=m0[0]*I0+m0[1]*ri+E0,v0[5]=m0[0]*P0+m0[1]*T0+_0}return v0}function d0(c0,l0,m0){var v0;return this.isIdentity()?v0=[c0,l0,m0]:v0=[c0*this.props[0]+l0*this.props[4]+m0*this.props[8]+this.props[12],c0*this.props[1]+l0*this.props[5]+m0*this.props[9]+this.props[13],c0*this.props[2]+l0*this.props[6]+m0*this.props[10]+this.props[14]],v0}function u0(c0,l0){if(this.isIdentity())return c0+","+l0;var m0=this.props;return Math.round((c0*m0[0]+l0*m0[4]+m0[12])*100)/100+","+Math.round((c0*m0[1]+l0*m0[5]+m0[13])*100)/100}function G0(){for(var c0=0,l0=this.props,m0="matrix3d(",v0=1e4;c0<16;)m0+=r(l0[c0]*v0)/v0,m0+=c0===15?")":",",c0+=1;return m0}function h0(c0){var l0=1e4;return c0<1e-6&&c0>0||c0>-1e-6&&c0<0?r(c0*l0)/l0:c0}function o0(){var c0=this.props,l0=h0(c0[0]),m0=h0(c0[1]),v0=h0(c0[4]),I0=h0(c0[5]),P0=h0(c0[12]),ri=h0(c0[13]);return"matrix("+l0+","+m0+","+v0+","+I0+","+P0+","+ri+")"}return function(){this.reset=f,this.rotate=de,this.rotateX=Xe,this.rotateY=Je,this.rotateZ=Ke,this.skew=_e,this.skewFromAxis=$e,this.shear=Qe,this.scale=qe,this.setTransform=st,this.translate=dt,this.transform=Wt,this.applyToPoint=Tt,this.applyToX=Jt,this.applyToY=$t,this.applyToZ=e0,this.applyToPointArray=d0,this.applyToTriplePoints=s0,this.applyToPointStringified=u0,this.toCSS=G0,this.to2dCSS=o0,this.clone=Zt,this.cloneFromProps=vt,this.equals=rt,this.inversePoints=n0,this.inversePoint=i0,this.getInverseMatrix=t0,this._t=this.transform,this.isIdentity=Yt,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}}();var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";lottie.play=animationManager.play,lottie.pause=animationManager.pause,lottie.setLocationHref=setLocation,lottie.togglePause=animationManager.togglePause,lottie.setSpeed=animationManager.setSpeed,lottie.setDirection=animationManager.setDirection,lottie.stop=animationManager.stop,lottie.searchAnimations=searchAnimations,lottie.registerAnimation=animationManager.registerAnimation,lottie.loadAnimation=loadAnimation,lottie.setSubframeRendering=setSubframeRendering,lottie.resize=animationManager.resize,lottie.goToAndStop=animationManager.goToAndStop,lottie.destroy=animationManager.destroy,lottie.setQuality=setQuality,lottie.inBrowser=inBrowser,lottie.installPlugin=installPlugin,lottie.freeze=animationManager.freeze,lottie.unfreeze=animationManager.unfreeze,lottie.setVolume=animationManager.setVolume,lottie.mute=animationManager.mute,lottie.unmute=animationManager.unmute,lottie.getRegisteredAnimations=animationManager.getRegisteredAnimations,lottie.useWebWorker=setWebWorker,lottie.setIDPrefix=setPrefix,lottie.__getFactory=getFactory,lottie.version="[[BM_VERSION]]";var queryString="";if(standalone){var scripts=document.getElementsByTagName("script"),index$3=scripts.length-1,myScript=scripts[index$3]||{src:""};queryString=myScript.src?myScript.src.replace(/^[^\?]+\??/,""):"",renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);try{!(typeof exports=="object"&&typeof module!="undefined")&&!(typeof define=="function"&&define.amd)&&(window.bodymovin=lottie)}catch(c){}const ShapeModifiers=function(){var c={},e={};c.registerModifier=s,c.getModifier=r;function s(f,de){e[f]||(e[f]=de)}function r(f,de,Xe){return new e[f](de,Xe)}return c}();ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(c){if(!this.closed){c.sh.container.addDynamicProperty(c.sh);var e={shape:c.sh,data:c,localShapeCollection:shapeCollectionPool.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&c.setAsAnimated()}},ShapeModifier.prototype.init=function(c,e){this.shapes=[],this.elem=c,this.initDynamicPropertyContainer(c),this.initModifierProperties(c,e),this.frameId=initialDefaultFrame,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},ShapeModifier.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},extendPrototype([DynamicPropertyContainer],ShapeModifier),extendPrototype([ShapeModifier],TrimModifier),TrimModifier.prototype.initModifierProperties=function(c,e){this.s=PropertyFactory.getProp(c,e.s,0,.01,this),this.e=PropertyFactory.getProp(c,e.e,0,.01,this),this.o=PropertyFactory.getProp(c,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},TrimModifier.prototype.addShapeToModifier=function(c){c.pathsData=[]},TrimModifier.prototype.calculateShapeEdges=function(c,e,s,r,f){var de=[];e<=1?de.push({s:c,e}):c>=1?de.push({s:c-1,e:e-1}):(de.push({s:c,e:1}),de.push({s:0,e:e-1}));var Xe=[],Je,Ke=de.length,Qe;for(Je=0;Je<Ke;Je+=1)if(Qe=de[Je],!(Qe.e*f<r||Qe.s*f>r+s)){var _e,$e;Qe.s*f<=r?_e=0:_e=(Qe.s*f-r)/s,Qe.e*f>=r+s?$e=1:$e=(Qe.e*f-r)/s,Xe.push([_e,$e])}return Xe.length||Xe.push([0,0]),Xe},TrimModifier.prototype.releasePathsData=function(c){var e,s=c.length;for(e=0;e<s;e+=1)segmentsLengthPool.release(c[e]);return c.length=0,c},TrimModifier.prototype.processShapes=function(c){var e,s;if(this._mdf||c){var r=this.o.v%360/360;if(r<0&&(r+=1),this.s.v>1?e=1+r:this.s.v<0?e=0+r:e=this.s.v+r,this.e.v>1?s=1+r:this.e.v<0?s=0+r:s=this.e.v+r,e>s){var f=e;e=s,s=f}e=Math.round(e*1e4)*1e-4,s=Math.round(s*1e4)*1e-4,this.sValue=e,this.eValue=s}else e=this.sValue,s=this.eValue;var de,Xe,Je=this.shapes.length,Ke,Qe,_e,$e,qe,st=0;if(s===e)for(Xe=0;Xe<Je;Xe+=1)this.shapes[Xe].localShapeCollection.releaseShapes(),this.shapes[Xe].shape._mdf=!0,this.shapes[Xe].shape.paths=this.shapes[Xe].localShapeCollection,this._mdf&&(this.shapes[Xe].pathsData.length=0);else if(s===1&&e===0||s===0&&e===1){if(this._mdf)for(Xe=0;Xe<Je;Xe+=1)this.shapes[Xe].pathsData.length=0,this.shapes[Xe].shape._mdf=!0}else{var dt=[],Wt,Yt;for(Xe=0;Xe<Je;Xe+=1)if(Wt=this.shapes[Xe],!Wt.shape._mdf&&!this._mdf&&!c&&this.m!==2)Wt.shape.paths=Wt.localShapeCollection;else{if(de=Wt.shape.paths,Qe=de._length,qe=0,!Wt.shape._mdf&&Wt.pathsData.length)qe=Wt.totalShapeLength;else{for(_e=this.releasePathsData(Wt.pathsData),Ke=0;Ke<Qe;Ke+=1)$e=bez.getSegmentsLength(de.shapes[Ke]),_e.push($e),qe+=$e.totalLength;Wt.totalShapeLength=qe,Wt.pathsData=_e}st+=qe,Wt.shape._mdf=!0}var rt=e,Zt=s,vt=0,Tt;for(Xe=Je-1;Xe>=0;Xe-=1)if(Wt=this.shapes[Xe],Wt.shape._mdf){for(Yt=Wt.localShapeCollection,Yt.releaseShapes(),this.m===2&&Je>1?(Tt=this.calculateShapeEdges(e,s,Wt.totalShapeLength,vt,st),vt+=Wt.totalShapeLength):Tt=[[rt,Zt]],Qe=Tt.length,Ke=0;Ke<Qe;Ke+=1){rt=Tt[Ke][0],Zt=Tt[Ke][1],dt.length=0,Zt<=1?dt.push({s:Wt.totalShapeLength*rt,e:Wt.totalShapeLength*Zt}):rt>=1?dt.push({s:Wt.totalShapeLength*(rt-1),e:Wt.totalShapeLength*(Zt-1)}):(dt.push({s:Wt.totalShapeLength*rt,e:Wt.totalShapeLength}),dt.push({s:0,e:Wt.totalShapeLength*(Zt-1)}));var Jt=this.addShapes(Wt,dt[0]);if(dt[0].s!==dt[0].e){if(dt.length>1){var $t=Wt.shape.paths.shapes[Wt.shape.paths._length-1];if($t.c){var e0=Jt.pop();this.addPaths(Jt,Yt),Jt=this.addShapes(Wt,dt[1],e0)}else this.addPaths(Jt,Yt),Jt=this.addShapes(Wt,dt[1])}this.addPaths(Jt,Yt)}}Wt.shape.paths=Yt}}},TrimModifier.prototype.addPaths=function(c,e){var s,r=c.length;for(s=0;s<r;s+=1)e.addShape(c[s])},TrimModifier.prototype.addSegment=function(c,e,s,r,f,de,Xe){f.setXYAt(e[0],e[1],"o",de),f.setXYAt(s[0],s[1],"i",de+1),Xe&&f.setXYAt(c[0],c[1],"v",de),f.setXYAt(r[0],r[1],"v",de+1)},TrimModifier.prototype.addSegmentFromArray=function(c,e,s,r){e.setXYAt(c[1],c[5],"o",s),e.setXYAt(c[2],c[6],"i",s+1),r&&e.setXYAt(c[0],c[4],"v",s),e.setXYAt(c[3],c[7],"v",s+1)},TrimModifier.prototype.addShapes=function(c,e,s){var r=c.pathsData,f=c.shape.paths.shapes,de,Xe=c.shape.paths._length,Je,Ke,Qe=0,_e,$e,qe,st,dt=[],Wt,Yt=!0;for(s?($e=s._length,Wt=s._length):(s=shapePool.newElement(),$e=0,Wt=0),dt.push(s),de=0;de<Xe;de+=1){for(qe=r[de].lengths,s.c=f[de].c,Ke=f[de].c?qe.length:qe.length+1,Je=1;Je<Ke;Je+=1)if(_e=qe[Je-1],Qe+_e.addedLength<e.s)Qe+=_e.addedLength,s.c=!1;else if(Qe>e.e){s.c=!1;break}else e.s<=Qe&&e.e>=Qe+_e.addedLength?(this.addSegment(f[de].v[Je-1],f[de].o[Je-1],f[de].i[Je],f[de].v[Je],s,$e,Yt),Yt=!1):(st=bez.getNewSegment(f[de].v[Je-1],f[de].v[Je],f[de].o[Je-1],f[de].i[Je],(e.s-Qe)/_e.addedLength,(e.e-Qe)/_e.addedLength,qe[Je-1]),this.addSegmentFromArray(st,s,$e,Yt),Yt=!1,s.c=!1),Qe+=_e.addedLength,$e+=1;if(f[de].c&&qe.length){if(_e=qe[Je-1],Qe<=e.e){var rt=qe[Je-1].addedLength;e.s<=Qe&&e.e>=Qe+rt?(this.addSegment(f[de].v[Je-1],f[de].o[Je-1],f[de].i[0],f[de].v[0],s,$e,Yt),Yt=!1):(st=bez.getNewSegment(f[de].v[Je-1],f[de].v[0],f[de].o[Je-1],f[de].i[0],(e.s-Qe)/rt,(e.e-Qe)/rt,qe[Je-1]),this.addSegmentFromArray(st,s,$e,Yt),Yt=!1,s.c=!1)}else s.c=!1;Qe+=_e.addedLength,$e+=1}if(s._length&&(s.setXYAt(s.v[Wt][0],s.v[Wt][1],"i",Wt),s.setXYAt(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),Qe>e.e)break;de<Xe-1&&(s=shapePool.newElement(),Yt=!0,dt.push(s),$e=0)}return dt},extendPrototype([ShapeModifier],PuckerAndBloatModifier),PuckerAndBloatModifier.prototype.initModifierProperties=function(c,e){this.getValue=this.processKeys,this.amount=PropertyFactory.getProp(c,e.a,0,null,this),this._isAnimated=!!this.amount.effectsSequence.length},PuckerAndBloatModifier.prototype.processPath=function(c,e){var s=e/100,r=[0,0],f=c._length,de=0;for(de=0;de<f;de+=1)r[0]+=c.v[de][0],r[1]+=c.v[de][1];r[0]/=f,r[1]/=f;var Xe=shapePool.newElement();Xe.c=c.c;var Je,Ke,Qe,_e,$e,qe;for(de=0;de<f;de+=1)Je=c.v[de][0]+(r[0]-c.v[de][0])*s,Ke=c.v[de][1]+(r[1]-c.v[de][1])*s,Qe=c.o[de][0]+(r[0]-c.o[de][0])*-s,_e=c.o[de][1]+(r[1]-c.o[de][1])*-s,$e=c.i[de][0]+(r[0]-c.i[de][0])*-s,qe=c.i[de][1]+(r[1]-c.i[de][1])*-s,Xe.setTripleAt(Je,Ke,Qe,_e,$e,qe,de);return Xe},PuckerAndBloatModifier.prototype.processShapes=function(c){var e,s,r=this.shapes.length,f,de,Xe=this.amount.v;if(Xe!==0){var Je,Ke;for(s=0;s<r;s+=1){if(Je=this.shapes[s],Ke=Je.localShapeCollection,!(!Je.shape._mdf&&!this._mdf&&!c))for(Ke.releaseShapes(),Je.shape._mdf=!0,e=Je.shape.paths.shapes,de=Je.shape.paths._length,f=0;f<de;f+=1)Ke.addShape(this.processPath(e[f],Xe));Je.shape.paths=Je.localShapeCollection}}this.dynamicProperties.length||(this._mdf=!1)};const TransformPropertyFactory=function(){var c=[0,0];function e(Ke){var Qe=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||Qe,this.a&&Ke.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&Ke.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&Ke.skewFromAxis(-this.sk.v,this.sa.v),this.r?Ke.rotate(-this.r.v):Ke.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?Ke.translate(this.px.v,this.py.v,-this.pz.v):Ke.translate(this.px.v,this.py.v,0):Ke.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function s(Ke){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||Ke){var Qe;if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var _e,$e;if(Qe=this.elem.globalData.frameRate,this.p&&this.p.keyframes&&this.p.getValueAtTime)this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(_e=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/Qe,0),$e=this.p.getValueAtTime(this.p.keyframes[0].t/Qe,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(_e=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/Qe,0),$e=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/Qe,0)):(_e=this.p.pv,$e=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/Qe,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){_e=[],$e=[];var qe=this.px,st=this.py;qe._caching.lastFrame+qe.offsetTime<=qe.keyframes[0].t?(_e[0]=qe.getValueAtTime((qe.keyframes[0].t+.01)/Qe,0),_e[1]=st.getValueAtTime((st.keyframes[0].t+.01)/Qe,0),$e[0]=qe.getValueAtTime(qe.keyframes[0].t/Qe,0),$e[1]=st.getValueAtTime(st.keyframes[0].t/Qe,0)):qe._caching.lastFrame+qe.offsetTime>=qe.keyframes[qe.keyframes.length-1].t?(_e[0]=qe.getValueAtTime(qe.keyframes[qe.keyframes.length-1].t/Qe,0),_e[1]=st.getValueAtTime(st.keyframes[st.keyframes.length-1].t/Qe,0),$e[0]=qe.getValueAtTime((qe.keyframes[qe.keyframes.length-1].t-.01)/Qe,0),$e[1]=st.getValueAtTime((st.keyframes[st.keyframes.length-1].t-.01)/Qe,0)):(_e=[qe.pv,st.pv],$e[0]=qe.getValueAtTime((qe._caching.lastFrame+qe.offsetTime-.01)/Qe,qe.offsetTime),$e[1]=st.getValueAtTime((st._caching.lastFrame+st.offsetTime-.01)/Qe,st.offsetTime))}else $e=c,_e=$e;this.v.rotate(-Math.atan2(_e[1]-$e[1],_e[0]-$e[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function r(){if(!this.a.k)this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1;else return;if(!this.s.effectsSequence.length)this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2;else return;if(this.sk)if(!this.sk.effectsSequence.length&&!this.sa.effectsSequence.length)this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3;else return;this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):!this.rz.effectsSequence.length&&!this.ry.effectsSequence.length&&!this.rx.effectsSequence.length&&!this.or.effectsSequence.length&&(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}function f(){}function de(Ke){this._addDynamicProperty(Ke),this.elem.addDynamicProperty(Ke),this._isDirty=!0}function Xe(Ke,Qe,_e){if(this.elem=Ke,this.frameId=-1,this.propType="transform",this.data=Qe,this.v=new Matrix,this.pre=new Matrix,this.appliedTransformations=0,this.initDynamicPropertyContainer(_e||Ke),Qe.p&&Qe.p.s?(this.px=PropertyFactory.getProp(Ke,Qe.p.x,0,0,this),this.py=PropertyFactory.getProp(Ke,Qe.p.y,0,0,this),Qe.p.z&&(this.pz=PropertyFactory.getProp(Ke,Qe.p.z,0,0,this))):this.p=PropertyFactory.getProp(Ke,Qe.p||{k:[0,0,0]},1,0,this),Qe.rx){if(this.rx=PropertyFactory.getProp(Ke,Qe.rx,0,degToRads,this),this.ry=PropertyFactory.getProp(Ke,Qe.ry,0,degToRads,this),this.rz=PropertyFactory.getProp(Ke,Qe.rz,0,degToRads,this),Qe.or.k[0].ti){var $e,qe=Qe.or.k.length;for($e=0;$e<qe;$e+=1)Qe.or.k[$e].to=null,Qe.or.k[$e].ti=null}this.or=PropertyFactory.getProp(Ke,Qe.or,1,degToRads,this),this.or.sh=!0}else this.r=PropertyFactory.getProp(Ke,Qe.r||{k:0},0,degToRads,this);Qe.sk&&(this.sk=PropertyFactory.getProp(Ke,Qe.sk,0,degToRads,this),this.sa=PropertyFactory.getProp(Ke,Qe.sa,0,degToRads,this)),this.a=PropertyFactory.getProp(Ke,Qe.a||{k:[0,0,0]},1,0,this),this.s=PropertyFactory.getProp(Ke,Qe.s||{k:[100,100,100]},1,.01,this),Qe.o?this.o=PropertyFactory.getProp(Ke,Qe.o,0,.01,Ke):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}Xe.prototype={applyToMatrix:e,getValue:s,precalculateMatrix:r,autoOrient:f},extendPrototype([DynamicPropertyContainer],Xe),Xe.prototype.addDynamicProperty=de,Xe.prototype._addDynamicProperty=DynamicPropertyContainer.prototype.addDynamicProperty;function Je(Ke,Qe,_e){return new Xe(Ke,Qe,_e)}return{getTransformProperty:Je}}();extendPrototype([ShapeModifier],RepeaterModifier),RepeaterModifier.prototype.initModifierProperties=function(c,e){this.getValue=this.processKeys,this.c=PropertyFactory.getProp(c,e.c,0,null,this),this.o=PropertyFactory.getProp(c,e.o,0,null,this),this.tr=TransformPropertyFactory.getTransformProperty(c,e.tr,this),this.so=PropertyFactory.getProp(c,e.tr.so,0,.01,this),this.eo=PropertyFactory.getProp(c,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},RepeaterModifier.prototype.applyTransforms=function(c,e,s,r,f,de){var Xe=de?-1:1,Je=r.s.v[0]+(1-r.s.v[0])*(1-f),Ke=r.s.v[1]+(1-r.s.v[1])*(1-f);c.translate(r.p.v[0]*Xe*f,r.p.v[1]*Xe*f,r.p.v[2]),e.translate(-r.a.v[0],-r.a.v[1],r.a.v[2]),e.rotate(-r.r.v*Xe*f),e.translate(r.a.v[0],r.a.v[1],r.a.v[2]),s.translate(-r.a.v[0],-r.a.v[1],r.a.v[2]),s.scale(de?1/Je:Je,de?1/Ke:Ke),s.translate(r.a.v[0],r.a.v[1],r.a.v[2])},RepeaterModifier.prototype.init=function(c,e,s,r){for(this.elem=c,this.arr=e,this.pos=s,this.elemsData=r,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(c),this.initModifierProperties(c,e[s]);s>0;)s-=1,this._elements.unshift(e[s]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},RepeaterModifier.prototype.resetElements=function(c){var e,s=c.length;for(e=0;e<s;e+=1)c[e]._processed=!1,c[e].ty==="gr"&&this.resetElements(c[e].it)},RepeaterModifier.prototype.cloneElements=function(c){var e=JSON.parse(JSON.stringify(c));return this.resetElements(e),e},RepeaterModifier.prototype.changeGroupRender=function(c,e){var s,r=c.length;for(s=0;s<r;s+=1)c[s]._render=e,c[s].ty==="gr"&&this.changeGroupRender(c[s].it,e)},RepeaterModifier.prototype.processShapes=function(c){var e,s,r,f,de,Xe=!1;if(this._mdf||c){var Je=Math.ceil(this.c.v);if(this._groups.length<Je){for(;this._groups.length<Je;){var Ke={it:this.cloneElements(this._elements),ty:"gr"};Ke.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,Ke),this._groups.splice(0,0,Ke),this._currentCopies+=1}this.elem.reloadShapes(),Xe=!0}de=0;var Qe;for(r=0;r<=this._groups.length-1;r+=1){if(Qe=de<Je,this._groups[r]._render=Qe,this.changeGroupRender(this._groups[r].it,Qe),!Qe){var _e=this.elemsData[r].it,$e=_e[_e.length-1];$e.transform.op.v!==0?($e.transform.op._mdf=!0,$e.transform.op.v=0):$e.transform.op._mdf=!1}de+=1}this._currentCopies=Je;var qe=this.o.v,st=qe%1,dt=qe>0?Math.floor(qe):Math.ceil(qe),Wt=this.pMatrix.props,Yt=this.rMatrix.props,rt=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var Zt=0;if(qe>0){for(;Zt<dt;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),Zt+=1;st&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,st,!1),Zt+=st)}else if(qe<0){for(;Zt>dt;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),Zt-=1;st&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-st,!0),Zt-=st)}r=this.data.m===1?0:this._currentCopies-1,f=this.data.m===1?1:-1,de=this._currentCopies;for(var vt,Tt;de;){if(e=this.elemsData[r].it,s=e[e.length-1].transform.mProps.v.props,Tt=s.length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=this._currentCopies===1?this.so.v:this.so.v+(this.eo.v-this.so.v)*(r/(this._currentCopies-1)),Zt!==0){for((r!==0&&f===1||r!==this._currentCopies-1&&f===-1)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(Yt[0],Yt[1],Yt[2],Yt[3],Yt[4],Yt[5],Yt[6],Yt[7],Yt[8],Yt[9],Yt[10],Yt[11],Yt[12],Yt[13],Yt[14],Yt[15]),this.matrix.transform(rt[0],rt[1],rt[2],rt[3],rt[4],rt[5],rt[6],rt[7],rt[8],rt[9],rt[10],rt[11],rt[12],rt[13],rt[14],rt[15]),this.matrix.transform(Wt[0],Wt[1],Wt[2],Wt[3],Wt[4],Wt[5],Wt[6],Wt[7],Wt[8],Wt[9],Wt[10],Wt[11],Wt[12],Wt[13],Wt[14],Wt[15]),vt=0;vt<Tt;vt+=1)s[vt]=this.matrix.props[vt];this.matrix.reset()}else for(this.matrix.reset(),vt=0;vt<Tt;vt+=1)s[vt]=this.matrix.props[vt];Zt+=1,de-=1,r+=f}}else for(de=this._currentCopies,r=0,f=1;de;)e=this.elemsData[r].it,s=e[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,de-=1,r+=f;return Xe},RepeaterModifier.prototype.addShape=function(){},extendPrototype([ShapeModifier],RoundCornersModifier),RoundCornersModifier.prototype.initModifierProperties=function(c,e){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(c,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},RoundCornersModifier.prototype.processPath=function(c,e){var s=shapePool.newElement();s.c=c.c;var r,f=c._length,de,Xe,Je,Ke,Qe,_e,$e=0,qe,st,dt,Wt,Yt,rt;for(r=0;r<f;r+=1)de=c.v[r],Je=c.o[r],Xe=c.i[r],de[0]===Je[0]&&de[1]===Je[1]&&de[0]===Xe[0]&&de[1]===Xe[1]?(r===0||r===f-1)&&!c.c?(s.setTripleAt(de[0],de[1],Je[0],Je[1],Xe[0],Xe[1],$e),$e+=1):(r===0?Ke=c.v[f-1]:Ke=c.v[r-1],Qe=Math.sqrt(Math.pow(de[0]-Ke[0],2)+Math.pow(de[1]-Ke[1],2)),_e=Qe?Math.min(Qe/2,e)/Qe:0,Yt=de[0]+(Ke[0]-de[0])*_e,qe=Yt,rt=de[1]-(de[1]-Ke[1])*_e,st=rt,dt=qe-(qe-de[0])*roundCorner,Wt=st-(st-de[1])*roundCorner,s.setTripleAt(qe,st,dt,Wt,Yt,rt,$e),$e+=1,r===f-1?Ke=c.v[0]:Ke=c.v[r+1],Qe=Math.sqrt(Math.pow(de[0]-Ke[0],2)+Math.pow(de[1]-Ke[1],2)),_e=Qe?Math.min(Qe/2,e)/Qe:0,dt=de[0]+(Ke[0]-de[0])*_e,qe=dt,Wt=de[1]+(Ke[1]-de[1])*_e,st=Wt,Yt=qe-(qe-de[0])*roundCorner,rt=st-(st-de[1])*roundCorner,s.setTripleAt(qe,st,dt,Wt,Yt,rt,$e),$e+=1):(s.setTripleAt(c.v[r][0],c.v[r][1],c.o[r][0],c.o[r][1],c.i[r][0],c.i[r][1],$e),$e+=1);return s},RoundCornersModifier.prototype.processShapes=function(c){var e,s,r=this.shapes.length,f,de,Xe=this.rd.v;if(Xe!==0){var Je,Ke;for(s=0;s<r;s+=1){if(Je=this.shapes[s],Ke=Je.localShapeCollection,!(!Je.shape._mdf&&!this._mdf&&!c))for(Ke.releaseShapes(),Je.shape._mdf=!0,e=Je.shape.paths.shapes,de=Je.shape.paths._length,f=0;f<de;f+=1)Ke.addShape(this.processPath(e[f],Xe));Je.shape.paths=Je.localShapeCollection}}this.dynamicProperties.length||(this._mdf=!1)};const FontManager=function(){var c=5e3,e={w:0,size:0,shapes:[],data:{shapes:[]}},s=[];s=s.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var r=["d83cdffb","d83cdffc","d83cdffd","d83cdffe","d83cdfff"],f=[65039,8205];function de(Tt){var Jt=Tt.split(","),$t,e0=Jt.length,t0=[];for($t=0;$t<e0;$t+=1)Jt[$t]!=="sans-serif"&&Jt[$t]!=="monospace"&&t0.push(Jt[$t]);return t0.join(",")}function Xe(Tt,Jt){var $t=createTag("span");$t.setAttribute("aria-hidden",!0),$t.style.fontFamily=Jt;var e0=createTag("span");e0.innerText="giItT1WQy@!-/#",$t.style.position="absolute",$t.style.left="-10000px",$t.style.top="-10000px",$t.style.fontSize="300px",$t.style.fontVariant="normal",$t.style.fontStyle="normal",$t.style.fontWeight="normal",$t.style.letterSpacing="0",$t.appendChild(e0),document.body.appendChild($t);var t0=e0.offsetWidth;return e0.style.fontFamily=de(Tt)+", "+Jt,{node:e0,w:t0,parent:$t}}function Je(){var Tt,Jt=this.fonts.length,$t,e0,t0=Jt;for(Tt=0;Tt<Jt;Tt+=1)this.fonts[Tt].loaded?t0-=1:this.fonts[Tt].fOrigin==="n"||this.fonts[Tt].origin===0?this.fonts[Tt].loaded=!0:($t=this.fonts[Tt].monoCase.node,e0=this.fonts[Tt].monoCase.w,$t.offsetWidth!==e0?(t0-=1,this.fonts[Tt].loaded=!0):($t=this.fonts[Tt].sansCase.node,e0=this.fonts[Tt].sansCase.w,$t.offsetWidth!==e0&&(t0-=1,this.fonts[Tt].loaded=!0)),this.fonts[Tt].loaded&&(this.fonts[Tt].sansCase.parent.parentNode.removeChild(this.fonts[Tt].sansCase.parent),this.fonts[Tt].monoCase.parent.parentNode.removeChild(this.fonts[Tt].monoCase.parent)));t0!==0&&Date.now()-this.initTime<c?setTimeout(this.checkLoadedFontsBinded,20):setTimeout(this.setIsLoadedBinded,10)}function Ke(Tt,Jt){var $t=document.body&&Jt?"svg":"canvas",e0,t0=getFontProperties(Tt);if($t==="svg"){var i0=createNS("text");i0.style.fontSize="100px",i0.setAttribute("font-family",Tt.fFamily),i0.setAttribute("font-style",t0.style),i0.setAttribute("font-weight",t0.weight),i0.textContent="1",Tt.fClass?(i0.style.fontFamily="inherit",i0.setAttribute("class",Tt.fClass)):i0.style.fontFamily=Tt.fFamily,Jt.appendChild(i0),e0=i0}else{var n0=new OffscreenCanvas(500,500).getContext("2d");n0.font=t0.style+" "+t0.weight+" 100px "+Tt.fFamily,e0=n0}function s0(d0){return $t==="svg"?(e0.textContent=d0,e0.getComputedTextLength()):e0.measureText(d0).width}return{measureText:s0}}function Qe(Tt,Jt){if(!Tt){this.isLoaded=!0;return}if(this.chars){this.isLoaded=!0,this.fonts=Tt.list;return}if(!document.body){this.isLoaded=!0,Tt.list.forEach(o0=>{o0.helper=Ke(o0),o0.cache={}}),this.fonts=Tt.list;return}var $t=Tt.list,e0,t0=$t.length,i0=t0;for(e0=0;e0<t0;e0+=1){var n0=!0,s0,d0;if($t[e0].loaded=!1,$t[e0].monoCase=Xe($t[e0].fFamily,"monospace"),$t[e0].sansCase=Xe($t[e0].fFamily,"sans-serif"),!$t[e0].fPath)$t[e0].loaded=!0,i0-=1;else if($t[e0].fOrigin==="p"||$t[e0].origin===3){if(s0=document.querySelectorAll('style[f-forigin="p"][f-family="'+$t[e0].fFamily+'"], style[f-origin="3"][f-family="'+$t[e0].fFamily+'"]'),s0.length>0&&(n0=!1),n0){var u0=createTag("style");u0.setAttribute("f-forigin",$t[e0].fOrigin),u0.setAttribute("f-origin",$t[e0].origin),u0.setAttribute("f-family",$t[e0].fFamily),u0.type="text/css",u0.innerText="@font-face {font-family: "+$t[e0].fFamily+"; font-style: normal; src: url('"+$t[e0].fPath+"');}",Jt.appendChild(u0)}}else if($t[e0].fOrigin==="g"||$t[e0].origin===1){for(s0=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),d0=0;d0<s0.length;d0+=1)s0[d0].href.indexOf($t[e0].fPath)!==-1&&(n0=!1);if(n0){var G0=createTag("link");G0.setAttribute("f-forigin",$t[e0].fOrigin),G0.setAttribute("f-origin",$t[e0].origin),G0.type="text/css",G0.rel="stylesheet",G0.href=$t[e0].fPath,document.body.appendChild(G0)}}else if($t[e0].fOrigin==="t"||$t[e0].origin===2){for(s0=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),d0=0;d0<s0.length;d0+=1)$t[e0].fPath===s0[d0].src&&(n0=!1);if(n0){var h0=createTag("link");h0.setAttribute("f-forigin",$t[e0].fOrigin),h0.setAttribute("f-origin",$t[e0].origin),h0.setAttribute("rel","stylesheet"),h0.setAttribute("href",$t[e0].fPath),Jt.appendChild(h0)}}$t[e0].helper=Ke($t[e0],Jt),$t[e0].cache={},this.fonts.push($t[e0])}i0===0?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}function _e(Tt){if(Tt){this.chars||(this.chars=[]);var Jt,$t=Tt.length,e0,t0=this.chars.length,i0;for(Jt=0;Jt<$t;Jt+=1){for(e0=0,i0=!1;e0<t0;)this.chars[e0].style===Tt[Jt].style&&this.chars[e0].fFamily===Tt[Jt].fFamily&&this.chars[e0].ch===Tt[Jt].ch&&(i0=!0),e0+=1;i0||(this.chars.push(Tt[Jt]),t0+=1)}}}function $e(Tt,Jt,$t){for(var e0=0,t0=this.chars.length;e0<t0;){if(this.chars[e0].ch===Tt&&this.chars[e0].style===Jt&&this.chars[e0].fFamily===$t)return this.chars[e0];e0+=1}return(typeof Tt=="string"&&Tt.charCodeAt(0)!==13||!Tt)&&console&&console.warn&&!this._warned&&(this._warned=!0,console.warn("Missing character from exported characters list: ",Tt,Jt,$t)),e}function qe(Tt,Jt,$t){var e0=this.getFontByName(Jt),t0=Tt.charCodeAt(0);if(!e0.cache[t0+1]){var i0=e0.helper;if(Tt===" "){var n0=i0.measureText("|"+Tt+"|"),s0=i0.measureText("||");e0.cache[t0+1]=(n0-s0)/100}else e0.cache[t0+1]=i0.measureText(Tt)/100}return e0.cache[t0+1]*$t}function st(Tt){for(var Jt=0,$t=this.fonts.length;Jt<$t;){if(this.fonts[Jt].fName===Tt)return this.fonts[Jt];Jt+=1}return this.fonts[0]}function dt(Tt,Jt){var $t=Tt.toString(16)+Jt.toString(16);return r.indexOf($t)!==-1}function Wt(Tt,Jt){return Jt?Tt===f[0]&&Jt===f[1]:Tt===f[1]}function Yt(Tt){return s.indexOf(Tt)!==-1}function rt(){this.isLoaded=!0}var Zt=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this._warned=!1,this.initTime=Date.now(),this.setIsLoadedBinded=this.setIsLoaded.bind(this),this.checkLoadedFontsBinded=this.checkLoadedFonts.bind(this)};Zt.isModifier=dt,Zt.isZeroWidthJoiner=Wt,Zt.isCombinedCharacter=Yt;var vt={addChars:_e,addFonts:Qe,getCharData:$e,getFontByName:st,measureText:qe,checkLoadedFonts:Je,setIsLoaded:rt};return Zt.prototype=vt,Zt}();RenderableElement.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(c){this.renderableComponents.indexOf(c)===-1&&this.renderableComponents.push(c)},removeRenderableComponent:function(c){this.renderableComponents.indexOf(c)!==-1&&this.renderableComponents.splice(this.renderableComponents.indexOf(c),1)},prepareRenderableFrame:function(c){this.checkLayerLimits(c)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(c){this.data.ip-this.data.st<=c&&this.data.op-this.data.st>c?this.isInRange!==!0&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):this.isInRange!==!1&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var c,e=this.renderableComponents.length;for(c=0;c<e;c+=1)this.renderableComponents[c].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return this.data.ty===5?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}};const MaskManagerInterface=function(){function c(s,r){this._mask=s,this._data=r}Object.defineProperty(c.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}}),Object.defineProperty(c.prototype,"maskOpacity",{get:function(){return this._mask.op.k&&this._mask.op.getValue(),this._mask.op.v*100}});var e=function(s){var r=createSizedArray(s.viewData.length),f,de=s.viewData.length;for(f=0;f<de;f+=1)r[f]=new c(s.viewData[f],s.masksProperties[f]);var Xe=function(Je){for(f=0;f<de;){if(s.masksProperties[f].nm===Je)return r[f];f+=1}return null};return Xe};return e}(),ExpressionPropertyInterface=function(){var c={pv:0,v:0,mult:1},e={pv:[0,0,0],v:[0,0,0],mult:1};function s(Xe,Je,Ke){Object.defineProperty(Xe,"velocity",{get:function(){return Je.getVelocityAtTime(Je.comp.currentFrame)}}),Xe.numKeys=Je.keyframes?Je.keyframes.length:0,Xe.key=function(Qe){if(!Xe.numKeys)return 0;var _e="";"s"in Je.keyframes[Qe-1]?_e=Je.keyframes[Qe-1].s:"e"in Je.keyframes[Qe-2]?_e=Je.keyframes[Qe-2].e:_e=Je.keyframes[Qe-2].s;var $e=Ke==="unidimensional"?new Number(_e):Object.assign({},_e);return $e.time=Je.keyframes[Qe-1].t/Je.elem.comp.globalData.frameRate,$e.value=Ke==="unidimensional"?_e[0]:_e,$e},Xe.valueAtTime=Je.getValueAtTime,Xe.speedAtTime=Je.getSpeedAtTime,Xe.velocityAtTime=Je.getVelocityAtTime,Xe.propertyGroup=Je.propertyGroup}function r(Xe){(!Xe||!("pv"in Xe))&&(Xe=c);var Je=1/Xe.mult,Ke=Xe.pv*Je,Qe=new Number(Ke);return Qe.value=Ke,s(Qe,Xe,"unidimensional"),function(){return Xe.k&&Xe.getValue(),Ke=Xe.v*Je,Qe.value!==Ke&&(Qe=new Number(Ke),Qe.value=Ke,s(Qe,Xe,"unidimensional")),Qe}}function f(Xe){(!Xe||!("pv"in Xe))&&(Xe=e);var Je=1/Xe.mult,Ke=Xe.data&&Xe.data.l||Xe.pv.length,Qe=createTypedArray("float32",Ke),_e=createTypedArray("float32",Ke);return Qe.value=_e,s(Qe,Xe,"multidimensional"),function(){Xe.k&&Xe.getValue();for(var $e=0;$e<Ke;$e+=1)_e[$e]=Xe.v[$e]*Je,Qe[$e]=_e[$e];return Qe}}function de(){return c}return function(Xe){return Xe?Xe.propType==="unidimensional"?r(Xe):f(Xe):de}}(),TransformExpressionInterface=function(){return function(c){function e(Xe){switch(Xe){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"ADBE Rotate X":return e.xRotation;case"ADBE Rotate Y":return e.yRotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"ADBE Position_0":return e.xPosition;case"ADBE Position_1":return e.yPosition;case"ADBE Position_2":return e.zPosition;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity;default:return null}}Object.defineProperty(e,"rotation",{get:ExpressionPropertyInterface(c.r||c.rz)}),Object.defineProperty(e,"zRotation",{get:ExpressionPropertyInterface(c.rz||c.r)}),Object.defineProperty(e,"xRotation",{get:ExpressionPropertyInterface(c.rx)}),Object.defineProperty(e,"yRotation",{get:ExpressionPropertyInterface(c.ry)}),Object.defineProperty(e,"scale",{get:ExpressionPropertyInterface(c.s)});var s,r,f,de;return c.p?de=ExpressionPropertyInterface(c.p):(s=ExpressionPropertyInterface(c.px),r=ExpressionPropertyInterface(c.py),c.pz&&(f=ExpressionPropertyInterface(c.pz))),Object.defineProperty(e,"position",{get:function(){return c.p?de():[s(),r(),f?f():0]}}),Object.defineProperty(e,"xPosition",{get:ExpressionPropertyInterface(c.px)}),Object.defineProperty(e,"yPosition",{get:ExpressionPropertyInterface(c.py)}),Object.defineProperty(e,"zPosition",{get:ExpressionPropertyInterface(c.pz)}),Object.defineProperty(e,"anchorPoint",{get:ExpressionPropertyInterface(c.a)}),Object.defineProperty(e,"opacity",{get:ExpressionPropertyInterface(c.o)}),Object.defineProperty(e,"skew",{get:ExpressionPropertyInterface(c.sk)}),Object.defineProperty(e,"skewAxis",{get:ExpressionPropertyInterface(c.sa)}),Object.defineProperty(e,"orientation",{get:ExpressionPropertyInterface(c.or)}),e}}(),LayerExpressionInterface=function(){function c(Qe){var _e=new Matrix;if(Qe!==void 0){var $e=this._elem.finalTransform.mProp.getValueAtTime(Qe);$e.clone(_e)}else{var qe=this._elem.finalTransform.mProp;qe.applyToMatrix(_e)}return _e}function e(Qe,_e){var $e=this.getMatrix(_e);return $e.props[12]=0,$e.props[13]=0,$e.props[14]=0,this.applyPoint($e,Qe)}function s(Qe,_e){var $e=this.getMatrix(_e);return this.applyPoint($e,Qe)}function r(Qe,_e){var $e=this.getMatrix(_e);return $e.props[12]=0,$e.props[13]=0,$e.props[14]=0,this.invertPoint($e,Qe)}function f(Qe,_e){var $e=this.getMatrix(_e);return this.invertPoint($e,Qe)}function de(Qe,_e){if(this._elem.hierarchy&&this._elem.hierarchy.length){var $e,qe=this._elem.hierarchy.length;for($e=0;$e<qe;$e+=1)this._elem.hierarchy[$e].finalTransform.mProp.applyToMatrix(Qe)}return Qe.applyToPointArray(_e[0],_e[1],_e[2]||0)}function Xe(Qe,_e){if(this._elem.hierarchy&&this._elem.hierarchy.length){var $e,qe=this._elem.hierarchy.length;for($e=0;$e<qe;$e+=1)this._elem.hierarchy[$e].finalTransform.mProp.applyToMatrix(Qe)}return Qe.inversePoint(_e)}function Je(Qe){var _e=new Matrix;if(_e.reset(),this._elem.finalTransform.mProp.applyToMatrix(_e),this._elem.hierarchy&&this._elem.hierarchy.length){var $e,qe=this._elem.hierarchy.length;for($e=0;$e<qe;$e+=1)this._elem.hierarchy[$e].finalTransform.mProp.applyToMatrix(_e);return _e.inversePoint(Qe)}return _e.inversePoint(Qe)}function Ke(){return[1,1,1,1]}return function(Qe){var _e;function $e(Wt){st.mask=new MaskManagerInterface(Wt,Qe)}function qe(Wt){st.effect=Wt}function st(Wt){switch(Wt){case"ADBE Root Vectors Group":case"Contents":case 2:return st.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return _e;case 4:case"ADBE Effect Parade":case"effects":case"Effects":return st.effect;case"ADBE Text Properties":return st.textInterface;default:return null}}st.getMatrix=c,st.invertPoint=Xe,st.applyPoint=de,st.toWorld=s,st.toWorldVec=e,st.fromWorld=f,st.fromWorldVec=r,st.toComp=s,st.fromComp=Je,st.sampleImage=Ke,st.sourceRectAtTime=Qe.sourceRectAtTime.bind(Qe),st._elem=Qe,_e=TransformExpressionInterface(Qe.finalTransform.mProp);var dt=getDescriptor(_e,"anchorPoint");return Object.defineProperties(st,{hasParent:{get:function(){return Qe.hierarchy.length}},parent:{get:function(){return Qe.hierarchy[0].layerInterface}},rotation:getDescriptor(_e,"rotation"),scale:getDescriptor(_e,"scale"),position:getDescriptor(_e,"position"),opacity:getDescriptor(_e,"opacity"),anchorPoint:dt,anchor_point:dt,transform:{get:function(){return _e}},active:{get:function(){return Qe.isInRange}}}),st.startTime=Qe.data.st,st.index=Qe.data.ind,st.source=Qe.data.refId,st.height=Qe.data.ty===0?Qe.data.h:100,st.width=Qe.data.ty===0?Qe.data.w:100,st.inPoint=Qe.data.ip/Qe.comp.globalData.frameRate,st.outPoint=Qe.data.op/Qe.comp.globalData.frameRate,st._name=Qe.data.nm,st.registerMaskInterface=$e,st.registerEffectsInterface=qe,st}}(),propertyGroupFactory=function(){return function(c,e){return function(s){return s=s===void 0?1:s,s<=0?c:e(s-1)}}}(),PropertyInterface=function(){return function(c,e){var s={_name:c};function r(f){return f=f===void 0?1:f,f<=0?s:e(f-1)}return r}}(),EffectsExpressionInterface=function(){var c={createEffectsInterface:e};function e(f,de){if(f.effectsManager){var Xe=[],Je=f.data.ef,Ke,Qe=f.effectsManager.effectElements.length;for(Ke=0;Ke<Qe;Ke+=1)Xe.push(s(Je[Ke],f.effectsManager.effectElements[Ke],de,f));var _e=f.data.ef||[],$e=function(qe){for(Ke=0,Qe=_e.length;Ke<Qe;){if(qe===_e[Ke].nm||qe===_e[Ke].mn||qe===_e[Ke].ix)return Xe[Ke];Ke+=1}return null};return Object.defineProperty($e,"numProperties",{get:function(){return _e.length}}),$e}return null}function s(f,de,Xe,Je){function Ke(st){for(var dt=f.ef,Wt=0,Yt=dt.length;Wt<Yt;){if(st===dt[Wt].nm||st===dt[Wt].mn||st===dt[Wt].ix)return dt[Wt].ty===5?_e[Wt]:_e[Wt]();Wt+=1}throw new Error}var Qe=propertyGroupFactory(Ke,Xe),_e=[],$e,qe=f.ef.length;for($e=0;$e<qe;$e+=1)f.ef[$e].ty===5?_e.push(s(f.ef[$e],de.effectElements[$e],de.effectElements[$e].propertyGroup,Je)):_e.push(r(de.effectElements[$e],f.ef[$e].ty,Je,Qe));return f.mn==="ADBE Color Control"&&Object.defineProperty(Ke,"color",{get:function(){return _e[0]()}}),Object.defineProperties(Ke,{numProperties:{get:function(){return f.np}},_name:{value:f.nm},propertyGroup:{value:Qe}}),Ke.enabled=f.en!==0,Ke.active=Ke.enabled,Ke}function r(f,de,Xe,Je){var Ke=ExpressionPropertyInterface(f.p);function Qe(){return de===10?Xe.comp.compInterface(f.p.v):Ke()}return f.p.setGroupProperty&&f.p.setGroupProperty(PropertyInterface("",Je)),Qe}return c}(),CompExpressionInterface=function(){return function(c){function e(s){for(var r=0,f=c.layers.length;r<f;){if(c.layers[r].nm===s||c.layers[r].ind===s)return c.elements[r].layerInterface;r+=1}return null}return Object.defineProperty(e,"_name",{value:c.data.nm}),e.layer=e,e.pixelAspect=1,e.height=c.data.h||c.globalData.compSize.h,e.width=c.data.w||c.globalData.compSize.w,e.pixelAspect=1,e.frameDuration=1/c.globalData.frameRate,e.displayStartTime=0,e.numLayers=c.layers.length,e}}(),ShapePathInterface=function(){return function(e,s,r){var f=s.sh;function de(Je){return Je==="Shape"||Je==="shape"||Je==="Path"||Je==="path"||Je==="ADBE Vector Shape"||Je===2?de.path:null}var Xe=propertyGroupFactory(de,r);return f.setGroupProperty(PropertyInterface("Path",Xe)),Object.defineProperties(de,{path:{get:function(){return f.k&&f.getValue(),f}},shape:{get:function(){return f.k&&f.getValue(),f}},_name:{value:e.nm},ix:{value:e.ix},propertyIndex:{value:e.ix},mn:{value:e.mn},propertyGroup:{value:r}}),de}}(),ShapeExpressionInterface=function(){function c(dt,Wt,Yt){var rt=[],Zt,vt=dt?dt.length:0;for(Zt=0;Zt<vt;Zt+=1)dt[Zt].ty==="gr"?rt.push(s(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="fl"?rt.push(r(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="st"?rt.push(Xe(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="tm"?rt.push(Je(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="tr"||(dt[Zt].ty==="el"?rt.push(Qe(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="sr"?rt.push(_e(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="sh"?rt.push(ShapePathInterface(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="rc"?rt.push($e(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="rd"?rt.push(qe(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="rp"?rt.push(st(dt[Zt],Wt[Zt],Yt)):dt[Zt].ty==="gf"?rt.push(f(dt[Zt],Wt[Zt],Yt)):rt.push(de(dt[Zt],Wt[Zt])));return rt}function e(dt,Wt,Yt){var rt,Zt=function(Jt){for(var $t=0,e0=rt.length;$t<e0;){if(rt[$t]._name===Jt||rt[$t].mn===Jt||rt[$t].propertyIndex===Jt||rt[$t].ix===Jt||rt[$t].ind===Jt)return rt[$t];$t+=1}return typeof Jt=="number"?rt[Jt-1]:null};Zt.propertyGroup=propertyGroupFactory(Zt,Yt),rt=c(dt.it,Wt.it,Zt.propertyGroup),Zt.numProperties=rt.length;var vt=Ke(dt.it[dt.it.length-1],Wt.it[Wt.it.length-1],Zt.propertyGroup);return Zt.transform=vt,Zt.propertyIndex=dt.cix,Zt._name=dt.nm,Zt}function s(dt,Wt,Yt){var rt=function(Jt){switch(Jt){case"ADBE Vectors Group":case"Contents":case 2:return rt.content;default:return rt.transform}};rt.propertyGroup=propertyGroupFactory(rt,Yt);var Zt=e(dt,Wt,rt.propertyGroup),vt=Ke(dt.it[dt.it.length-1],Wt.it[Wt.it.length-1],rt.propertyGroup);return rt.content=Zt,rt.transform=vt,Object.defineProperty(rt,"_name",{get:function(){return dt.nm}}),rt.numProperties=dt.np,rt.propertyIndex=dt.ix,rt.nm=dt.nm,rt.mn=dt.mn,rt}function r(dt,Wt,Yt){function rt(Zt){return Zt==="Color"||Zt==="color"?rt.color:Zt==="Opacity"||Zt==="opacity"?rt.opacity:null}return Object.defineProperties(rt,{color:{get:ExpressionPropertyInterface(Wt.c)},opacity:{get:ExpressionPropertyInterface(Wt.o)},_name:{value:dt.nm},mn:{value:dt.mn}}),Wt.c.setGroupProperty(PropertyInterface("Color",Yt)),Wt.o.setGroupProperty(PropertyInterface("Opacity",Yt)),rt}function f(dt,Wt,Yt){function rt(Zt){return Zt==="Start Point"||Zt==="start point"?rt.startPoint:Zt==="End Point"||Zt==="end point"?rt.endPoint:Zt==="Opacity"||Zt==="opacity"?rt.opacity:null}return Object.defineProperties(rt,{startPoint:{get:ExpressionPropertyInterface(Wt.s)},endPoint:{get:ExpressionPropertyInterface(Wt.e)},opacity:{get:ExpressionPropertyInterface(Wt.o)},type:{get:function(){return"a"}},_name:{value:dt.nm},mn:{value:dt.mn}}),Wt.s.setGroupProperty(PropertyInterface("Start Point",Yt)),Wt.e.setGroupProperty(PropertyInterface("End Point",Yt)),Wt.o.setGroupProperty(PropertyInterface("Opacity",Yt)),rt}function de(){function dt(){return null}return dt}function Xe(dt,Wt,Yt){var rt=propertyGroupFactory(e0,Yt),Zt=propertyGroupFactory($t,rt);function vt(t0){Object.defineProperty($t,dt.d[t0].nm,{get:ExpressionPropertyInterface(Wt.d.dataProps[t0].p)})}var Tt,Jt=dt.d?dt.d.length:0,$t={};for(Tt=0;Tt<Jt;Tt+=1)vt(Tt),Wt.d.dataProps[Tt].p.setGroupProperty(Zt);function e0(t0){return t0==="Color"||t0==="color"?e0.color:t0==="Opacity"||t0==="opacity"?e0.opacity:t0==="Stroke Width"||t0==="stroke width"?e0.strokeWidth:null}return Object.defineProperties(e0,{color:{get:ExpressionPropertyInterface(Wt.c)},opacity:{get:ExpressionPropertyInterface(Wt.o)},strokeWidth:{get:ExpressionPropertyInterface(Wt.w)},dash:{get:function(){return $t}},_name:{value:dt.nm},mn:{value:dt.mn}}),Wt.c.setGroupProperty(PropertyInterface("Color",rt)),Wt.o.setGroupProperty(PropertyInterface("Opacity",rt)),Wt.w.setGroupProperty(PropertyInterface("Stroke Width",rt)),e0}function Je(dt,Wt,Yt){function rt(vt){return vt===dt.e.ix||vt==="End"||vt==="end"?rt.end:vt===dt.s.ix?rt.start:vt===dt.o.ix?rt.offset:null}var Zt=propertyGroupFactory(rt,Yt);return rt.propertyIndex=dt.ix,Wt.s.setGroupProperty(PropertyInterface("Start",Zt)),Wt.e.setGroupProperty(PropertyInterface("End",Zt)),Wt.o.setGroupProperty(PropertyInterface("Offset",Zt)),rt.propertyIndex=dt.ix,rt.propertyGroup=Yt,Object.defineProperties(rt,{start:{get:ExpressionPropertyInterface(Wt.s)},end:{get:ExpressionPropertyInterface(Wt.e)},offset:{get:ExpressionPropertyInterface(Wt.o)},_name:{value:dt.nm}}),rt.mn=dt.mn,rt}function Ke(dt,Wt,Yt){function rt(vt){return dt.a.ix===vt||vt==="Anchor Point"?rt.anchorPoint:dt.o.ix===vt||vt==="Opacity"?rt.opacity:dt.p.ix===vt||vt==="Position"?rt.position:dt.r.ix===vt||vt==="Rotation"||vt==="ADBE Vector Rotation"?rt.rotation:dt.s.ix===vt||vt==="Scale"?rt.scale:dt.sk&&dt.sk.ix===vt||vt==="Skew"?rt.skew:dt.sa&&dt.sa.ix===vt||vt==="Skew Axis"?rt.skewAxis:null}var Zt=propertyGroupFactory(rt,Yt);return Wt.transform.mProps.o.setGroupProperty(PropertyInterface("Opacity",Zt)),Wt.transform.mProps.p.setGroupProperty(PropertyInterface("Position",Zt)),Wt.transform.mProps.a.setGroupProperty(PropertyInterface("Anchor Point",Zt)),Wt.transform.mProps.s.setGroupProperty(PropertyInterface("Scale",Zt)),Wt.transform.mProps.r.setGroupProperty(PropertyInterface("Rotation",Zt)),Wt.transform.mProps.sk&&(Wt.transform.mProps.sk.setGroupProperty(PropertyInterface("Skew",Zt)),Wt.transform.mProps.sa.setGroupProperty(PropertyInterface("Skew Angle",Zt))),Wt.transform.op.setGroupProperty(PropertyInterface("Opacity",Zt)),Object.defineProperties(rt,{opacity:{get:ExpressionPropertyInterface(Wt.transform.mProps.o)},position:{get:ExpressionPropertyInterface(Wt.transform.mProps.p)},anchorPoint:{get:ExpressionPropertyInterface(Wt.transform.mProps.a)},scale:{get:ExpressionPropertyInterface(Wt.transform.mProps.s)},rotation:{get:ExpressionPropertyInterface(Wt.transform.mProps.r)},skew:{get:ExpressionPropertyInterface(Wt.transform.mProps.sk)},skewAxis:{get:ExpressionPropertyInterface(Wt.transform.mProps.sa)},_name:{value:dt.nm}}),rt.ty="tr",rt.mn=dt.mn,rt.propertyGroup=Yt,rt}function Qe(dt,Wt,Yt){function rt(Tt){return dt.p.ix===Tt?rt.position:dt.s.ix===Tt?rt.size:null}var Zt=propertyGroupFactory(rt,Yt);rt.propertyIndex=dt.ix;var vt=Wt.sh.ty==="tm"?Wt.sh.prop:Wt.sh;return vt.s.setGroupProperty(PropertyInterface("Size",Zt)),vt.p.setGroupProperty(PropertyInterface("Position",Zt)),Object.defineProperties(rt,{size:{get:ExpressionPropertyInterface(vt.s)},position:{get:ExpressionPropertyInterface(vt.p)},_name:{value:dt.nm}}),rt.mn=dt.mn,rt}function _e(dt,Wt,Yt){function rt(Tt){return dt.p.ix===Tt?rt.position:dt.r.ix===Tt?rt.rotation:dt.pt.ix===Tt?rt.points:dt.or.ix===Tt||Tt==="ADBE Vector Star Outer Radius"?rt.outerRadius:dt.os.ix===Tt?rt.outerRoundness:dt.ir&&(dt.ir.ix===Tt||Tt==="ADBE Vector Star Inner Radius")?rt.innerRadius:dt.is&&dt.is.ix===Tt?rt.innerRoundness:null}var Zt=propertyGroupFactory(rt,Yt),vt=Wt.sh.ty==="tm"?Wt.sh.prop:Wt.sh;return rt.propertyIndex=dt.ix,vt.or.setGroupProperty(PropertyInterface("Outer Radius",Zt)),vt.os.setGroupProperty(PropertyInterface("Outer Roundness",Zt)),vt.pt.setGroupProperty(PropertyInterface("Points",Zt)),vt.p.setGroupProperty(PropertyInterface("Position",Zt)),vt.r.setGroupProperty(PropertyInterface("Rotation",Zt)),dt.ir&&(vt.ir.setGroupProperty(PropertyInterface("Inner Radius",Zt)),vt.is.setGroupProperty(PropertyInterface("Inner Roundness",Zt))),Object.defineProperties(rt,{position:{get:ExpressionPropertyInterface(vt.p)},rotation:{get:ExpressionPropertyInterface(vt.r)},points:{get:ExpressionPropertyInterface(vt.pt)},outerRadius:{get:ExpressionPropertyInterface(vt.or)},outerRoundness:{get:ExpressionPropertyInterface(vt.os)},innerRadius:{get:ExpressionPropertyInterface(vt.ir)},innerRoundness:{get:ExpressionPropertyInterface(vt.is)},_name:{value:dt.nm}}),rt.mn=dt.mn,rt}function $e(dt,Wt,Yt){function rt(Tt){return dt.p.ix===Tt?rt.position:dt.r.ix===Tt?rt.roundness:dt.s.ix===Tt||Tt==="Size"||Tt==="ADBE Vector Rect Size"?rt.size:null}var Zt=propertyGroupFactory(rt,Yt),vt=Wt.sh.ty==="tm"?Wt.sh.prop:Wt.sh;return rt.propertyIndex=dt.ix,vt.p.setGroupProperty(PropertyInterface("Position",Zt)),vt.s.setGroupProperty(PropertyInterface("Size",Zt)),vt.r.setGroupProperty(PropertyInterface("Rotation",Zt)),Object.defineProperties(rt,{position:{get:ExpressionPropertyInterface(vt.p)},roundness:{get:ExpressionPropertyInterface(vt.r)},size:{get:ExpressionPropertyInterface(vt.s)},_name:{value:dt.nm}}),rt.mn=dt.mn,rt}function qe(dt,Wt,Yt){function rt(Tt){return dt.r.ix===Tt||Tt==="Round Corners 1"?rt.radius:null}var Zt=propertyGroupFactory(rt,Yt),vt=Wt;return rt.propertyIndex=dt.ix,vt.rd.setGroupProperty(PropertyInterface("Radius",Zt)),Object.defineProperties(rt,{radius:{get:ExpressionPropertyInterface(vt.rd)},_name:{value:dt.nm}}),rt.mn=dt.mn,rt}function st(dt,Wt,Yt){function rt(Tt){return dt.c.ix===Tt||Tt==="Copies"?rt.copies:dt.o.ix===Tt||Tt==="Offset"?rt.offset:null}var Zt=propertyGroupFactory(rt,Yt),vt=Wt;return rt.propertyIndex=dt.ix,vt.c.setGroupProperty(PropertyInterface("Copies",Zt)),vt.o.setGroupProperty(PropertyInterface("Offset",Zt)),Object.defineProperties(rt,{copies:{get:ExpressionPropertyInterface(vt.c)},offset:{get:ExpressionPropertyInterface(vt.o)},_name:{value:dt.nm}}),rt.mn=dt.mn,rt}return function(dt,Wt,Yt){var rt;function Zt(Tt){if(typeof Tt=="number")return Tt=Tt===void 0?1:Tt,Tt===0?Yt:rt[Tt-1];for(var Jt=0,$t=rt.length;Jt<$t;){if(rt[Jt]._name===Tt)return rt[Jt];Jt+=1}return null}function vt(){return Yt}return Zt.propertyGroup=propertyGroupFactory(Zt,vt),rt=c(dt,Wt,Zt.propertyGroup),Zt.numProperties=rt.length,Zt._name="Contents",Zt}}(),TextExpressionInterface=function(){return function(c){var e,s;function r(f){switch(f){case"ADBE Text Document":return r.sourceText;default:return null}}return Object.defineProperty(r,"sourceText",{get:function(){c.textProperty.getValue();var f=c.textProperty.currentData.t;return f!==e&&(c.textProperty.currentData.t=e,s=new String(f),s.value=f||new String(f)),s}}),r}}(),getBlendMode=function(){var c={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"};return function(e){return c[e]||""}}();extendPrototype([DynamicPropertyContainer],GroupEffect),GroupEffect.prototype.getValue=GroupEffect.prototype.iterateDynamicProperties,GroupEffect.prototype.init=function(c,e){this.data=c,this.effectElements=[],this.initDynamicPropertyContainer(e);var s,r=this.data.ef.length,f,de=this.data.ef;for(s=0;s<r;s+=1){switch(f=null,de[s].ty){case 0:f=new SliderEffect(de[s],e,this);break;case 1:f=new AngleEffect(de[s],e,this);break;case 2:f=new ColorEffect(de[s],e,this);break;case 3:f=new PointEffect(de[s],e,this);break;case 4:case 7:f=new CheckboxEffect(de[s],e,this);break;case 10:f=new LayerIndexEffect(de[s],e,this);break;case 11:f=new MaskIndexEffect(de[s],e,this);break;case 5:f=new EffectsManager(de[s],e);break;default:f=new NoValueEffect(de[s]);break}f&&this.effectElements.push(f)}},BaseElement.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var c=0,e=this.data.masksProperties.length;c<e;){if(this.data.masksProperties[c].mode!=="n"&&this.data.masksProperties[c].cl!==!1)return!0;c+=1}return!1},initExpressions:function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var c=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(c),this.data.ty===0||this.data.xt?this.compInterface=CompExpressionInterface(this):this.data.ty===4?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):this.data.ty===5&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var c=getBlendMode(this.data.bm),e=this.baseElement||this.layerElement;e.style["mix-blend-mode"]=c},initBaseData:function(c,e,s){this.globalData=e,this.comp=s,this.data=c,this.layerId=createElementID(),this.data.sr||(this.data.sr=1),this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},FrameElement.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(c,e){var s,r=this.dynamicProperties.length;for(s=0;s<r;s+=1)(e||this._isParent&&this.dynamicProperties[s].propType==="transform")&&(this.dynamicProperties[s].getValue(),this.dynamicProperties[s]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(c){this.dynamicProperties.indexOf(c)===-1&&this.dynamicProperties.push(c)}};const FootageInterface=function(){var c=function(s){var r="",f=s.getFootageData();function de(){return r="",f=s.getFootageData(),Xe}function Xe(Je){if(f[Je])return r=Je,f=f[Je],typeof f=="object"?Xe:f;var Ke=Je.indexOf(r);if(Ke!==-1){var Qe=parseInt(Je.substr(Ke+r.length),10);return f=f[Qe],typeof f=="object"?Xe:f}return""}return de},e=function(s){function r(f){return f==="Outline"?r.outlineInterface():null}return r._name="Outline",r.outlineInterface=c(s),r};return function(s){function r(f){return f==="Data"?r.dataInterface:null}return r._name="Data",r.dataInterface=e(s),r}}();FootageElement.prototype.prepareFrame=function(){},extendPrototype([RenderableElement,BaseElement,FrameElement],FootageElement),FootageElement.prototype.getBaseElement=function(){return null},FootageElement.prototype.renderFrame=function(){},FootageElement.prototype.destroy=function(){},FootageElement.prototype.initExpressions=function(){this.layerInterface=FootageInterface(this)},FootageElement.prototype.getFootageData=function(){return this.footageData},AudioElement.prototype.prepareFrame=function(c){if(this.prepareRenderableFrame(c,!0),this.prepareProperties(c,!0),this.tm._placeholder)this._currentTime=c/this.data.sr;else{var e=this.tm.v;this._currentTime=e}this._volume=this.lv.v[0];var s=this._volume*this._volumeMultiplier;this._previousVolume!==s&&(this._previousVolume=s,this.audio.volume(s))},extendPrototype([RenderableElement,BaseElement,FrameElement],AudioElement),AudioElement.prototype.renderFrame=function(){this.isInRange&&this._canPlay&&(this._isPlaying?(!this.audio.playing()||Math.abs(this._currentTime/this.globalData.frameRate-this.audio.seek())>.1)&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},AudioElement.prototype.show=function(){},AudioElement.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},AudioElement.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},AudioElement.prototype.resume=function(){this._canPlay=!0},AudioElement.prototype.setRate=function(c){this.audio.rate(c)},AudioElement.prototype.volume=function(c){this._volumeMultiplier=c,this._previousVolume=c*this._volume,this.audio.volume(this._previousVolume)},AudioElement.prototype.getBaseElement=function(){return null},AudioElement.prototype.destroy=function(){},AudioElement.prototype.sourceRectAtTime=function(){},AudioElement.prototype.initExpressions=function(){},BaseRenderer.prototype.checkLayers=function(c){var e,s=this.layers.length,r;for(this.completeLayers=!0,e=s-1;e>=0;e-=1)this.elements[e]||(r=this.layers[e],r.ip-r.st<=c-this.layers[e].st&&r.op-r.st>c-this.layers[e].st&&this.buildItem(e)),this.completeLayers=this.elements[e]?this.completeLayers:!1;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(c){switch(c.ty){case 2:return this.createImage(c);case 0:return this.createComp(c);case 1:return this.createSolid(c);case 3:return this.createNull(c);case 4:return this.createShape(c);case 5:return this.createText(c);case 6:return this.createAudio(c);case 13:return this.createCamera(c);case 15:return this.createFootage(c);default:return this.createNull(c)}},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.createAudio=function(c){return new AudioElement(c,this.globalData,this)},BaseRenderer.prototype.createFootage=function(c){return new FootageElement(c,this.globalData,this)},BaseRenderer.prototype.buildAllItems=function(){var c,e=this.layers.length;for(c=0;c<e;c+=1)this.buildItem(c);this.checkPendingElements()},BaseRenderer.prototype.includeLayers=function(c){this.completeLayers=!1;var e,s=c.length,r,f=this.layers.length;for(e=0;e<s;e+=1)for(r=0;r<f;){if(this.layers[r].id===c[e].id){this.layers[r]=c[e];break}r+=1}},BaseRenderer.prototype.setProjectInterface=function(c){this.globalData.projectInterface=c},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(c,e,s){for(var r=this.elements,f=this.layers,de=0,Xe=f.length;de<Xe;)f[de].ind==e&&(!r[de]||r[de]===!0?(this.buildItem(de),this.addPendingElement(c)):(s.push(r[de]),r[de].setAsParent(),f[de].parent!==void 0?this.buildElementParenting(c,f[de].parent,s):c.setHierarchy(s))),de+=1},BaseRenderer.prototype.addPendingElement=function(c){this.pendingElements.push(c)},BaseRenderer.prototype.searchExtraCompositions=function(c){var e,s=c.length;for(e=0;e<s;e+=1)if(c[e].xt){var r=this.createComp(c[e]);r.initExpressions(),this.globalData.projectInterface.registerComposition(r)}},BaseRenderer.prototype.getElementByPath=function(c){var e=c.shift(),s;if(typeof e=="number")s=this.elements[e];else{var r,f=this.elements.length;for(r=0;r<f;r+=1)if(this.elements[r].data.nm===e){s=this.elements[r];break}}return c.length===0?s:s.getElementByPath(c)},BaseRenderer.prototype.setupGlobalData=function(c,e){this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(c.chars),this.globalData.fontManager.addFonts(c.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.audioController=this.animationItem.audioController,this.globalData.frameId=0,this.globalData.frameRate=c.fr,this.globalData.nm=c.nm,this.globalData.compSize={w:c.w,h:c.h}},TransformElement.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?TransformPropertyFactory.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var c,e=this.finalTransform.mat,s=0,r=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;s<r;){if(this.hierarchy[s].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}s+=1}if(this.finalTransform._matMdf)for(c=this.finalTransform.mProp.v.props,e.cloneFromProps(c),s=0;s<r;s+=1)c=this.hierarchy[s].finalTransform.mProp.v.props,e.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15])}},globalToLocal:function(c){var e=[];e.push(this.finalTransform);for(var s=!0,r=this.comp;s;)r.finalTransform?(r.data.hasMask&&e.splice(0,0,r.finalTransform),r=r.comp):s=!1;var f,de=e.length,Xe;for(f=0;f<de;f+=1)Xe=e[f].mat.applyToPointArray(0,0,0),c=[c[0]-Xe[0],c[1]-Xe[1],0];return c},mHelper:new Matrix},MaskElement.prototype.getMaskProperty=function(c){return this.viewData[c].prop},MaskElement.prototype.renderFrame=function(c){var e=this.element.finalTransform.mat,s,r=this.masksProperties.length;for(s=0;s<r;s+=1)if((this.viewData[s].prop._mdf||c)&&this.drawPath(this.masksProperties[s],this.viewData[s].prop.v,this.viewData[s]),(this.viewData[s].op._mdf||c)&&this.viewData[s].elem.setAttribute("fill-opacity",this.viewData[s].op.v),this.masksProperties[s].mode!=="n"&&(this.viewData[s].invRect&&(this.element.finalTransform.mProp._mdf||c)&&this.viewData[s].invRect.setAttribute("transform",e.getInverseMatrix().to2dCSS()),this.storedData[s].x&&(this.storedData[s].x._mdf||c))){var f=this.storedData[s].expan;this.storedData[s].x.v<0?(this.storedData[s].lastOperator!=="erode"&&(this.storedData[s].lastOperator="erode",this.storedData[s].elem.setAttribute("filter","url("+getLocationHref()+"#"+this.storedData[s].filterId+")")),f.setAttribute("radius",-this.storedData[s].x.v)):(this.storedData[s].lastOperator!=="dilate"&&(this.storedData[s].lastOperator="dilate",this.storedData[s].elem.setAttribute("filter",null)),this.storedData[s].elem.setAttribute("stroke-width",this.storedData[s].x.v*2))}},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var c="M0,0 ";return c+=" h"+this.globalData.compSize.w,c+=" v"+this.globalData.compSize.h,c+=" h-"+this.globalData.compSize.w,c+=" v-"+this.globalData.compSize.h+" ",c},MaskElement.prototype.drawPath=function(c,e,s){var r=" M"+e.v[0][0]+","+e.v[0][1],f,de;for(de=e._length,f=1;f<de;f+=1)r+=" C"+e.o[f-1][0]+","+e.o[f-1][1]+" "+e.i[f][0]+","+e.i[f][1]+" "+e.v[f][0]+","+e.v[f][1];if(e.c&&de>1&&(r+=" C"+e.o[f-1][0]+","+e.o[f-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),s.lastPath!==r){var Xe="";s.elem&&(e.c&&(Xe=c.inv?this.solidPath+r:r),s.elem.setAttribute("d",Xe)),s.lastPath=r}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null};const filtersFactory=function(){var c={};c.createFilter=e,c.createAlphaToLuminanceFilter=s;function e(r,f){var de=createNS("filter");return de.setAttribute("id",r),f!==!0&&(de.setAttribute("filterUnits","objectBoundingBox"),de.setAttribute("x","0%"),de.setAttribute("y","0%"),de.setAttribute("width","100%"),de.setAttribute("height","100%")),de}function s(){var r=createNS("feColorMatrix");return r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1"),r}return c}(),featureSupport=function(){var c={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(c.maskType=!1),c}();var registeredEffects={},idPrefix="filter_result_";SVGEffects.prototype.renderFrame=function(c){var e,s=this.filters.length;for(e=0;e<s;e+=1)this.filters[e].renderFrame(c)},SVGBaseElement.prototype={initRendererElement:function(){this.layerElement=createNS("g")},createContainerElements:function(){this.matteElement=createNS("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var c=null,e,s,r;if(this.data.td){if(this.data.td==3||this.data.td==1){var f=createNS("mask");f.setAttribute("id",this.layerId),f.setAttribute("mask-type",this.data.td==3?"luminance":"alpha"),f.appendChild(this.layerElement),c=f,this.globalData.defs.appendChild(f),!featureSupport.maskType&&this.data.td==1&&(f.setAttribute("mask-type","luminance"),e=createElementID(),s=filtersFactory.createFilter(e),this.globalData.defs.appendChild(s),s.appendChild(filtersFactory.createAlphaToLuminanceFilter()),r=createNS("g"),r.appendChild(this.layerElement),c=r,f.appendChild(r),r.setAttribute("filter","url("+getLocationHref()+"#"+e+")"))}else if(this.data.td==2){var de=createNS("mask");de.setAttribute("id",this.layerId),de.setAttribute("mask-type","alpha");var Xe=createNS("g");de.appendChild(Xe),e=createElementID(),s=filtersFactory.createFilter(e);var Je=createNS("feComponentTransfer");Je.setAttribute("in","SourceGraphic"),s.appendChild(Je);var Ke=createNS("feFuncA");Ke.setAttribute("type","table"),Ke.setAttribute("tableValues","1.0 0.0"),Je.appendChild(Ke),this.globalData.defs.appendChild(s);var Qe=createNS("rect");Qe.setAttribute("width",this.comp.data.w),Qe.setAttribute("height",this.comp.data.h),Qe.setAttribute("x","0"),Qe.setAttribute("y","0"),Qe.setAttribute("fill","#ffffff"),Qe.setAttribute("opacity","0"),Xe.setAttribute("filter","url("+getLocationHref()+"#"+e+")"),Xe.appendChild(Qe),Xe.appendChild(this.layerElement),c=Xe,featureSupport.maskType||(de.setAttribute("mask-type","luminance"),s.appendChild(filtersFactory.createAlphaToLuminanceFilter()),r=createNS("g"),Xe.appendChild(Qe),r.appendChild(this.layerElement),c=r,Xe.appendChild(r)),this.globalData.defs.appendChild(de)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),c=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),this.data.ty===0&&!this.data.hd){var _e=createNS("clipPath"),$e=createNS("path");$e.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var qe=createElementID();if(_e.setAttribute("id",qe),_e.appendChild($e),this.globalData.defs.appendChild(_e),this.checkMasks()){var st=createNS("g");st.setAttribute("clip-path","url("+getLocationHref()+"#"+qe+")"),st.appendChild(this.layerElement),this.transformedElement=st,c?c.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+getLocationHref()+"#"+qe+")")}this.data.bm!==0&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new MaskElement(this.data,this,this.globalData),this.renderableEffectsManager=new SVGEffects(this)},setMatte:function(c){this.matteElement&&this.matteElement.setAttribute("mask","url("+getLocationHref()+"#"+c+")")}},HierarchyElement.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(c){this.hierarchy=c},setAsParent:function(){this._isParent=!0},checkParenting:function(){this.data.parent!==void 0&&this.comp.buildElementParenting(this,this.data.parent,[])}},function(){var c={initElement:function(e,s,r){this.initFrame(),this.initBaseData(e,s,r),this.initTransform(e,s,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){if(!this.hidden&&(!this.isInRange||this.isTransparent)){var e=this.baseElement||this.layerElement;e.style.display="none",this.hidden=!0}},show:function(){if(this.isInRange&&!this.isTransparent){if(!this.data.hd){var e=this.baseElement||this.layerElement;e.style.display="block"}this.hidden=!1,this._isFirstFrame=!0}},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(e){this._mdf=!1,this.prepareRenderableFrame(e),this.prepareProperties(e,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}};extendPrototype([RenderableElement,createProxyFunction(c)],RenderableDOMElement)}(),extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement],IImageElement),IImageElement.prototype.createContent=function(){var c=this.globalData.getAssetsPath(this.assetData);this.innerElem=createNS("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",c),this.layerElement.appendChild(this.innerElem)},IImageElement.prototype.sourceRectAtTime=function(){return this.sourceRect},IShapeElement.prototype={addShapeToModifiers:function(c){var e,s=this.shapeModifiers.length;for(e=0;e<s;e+=1)this.shapeModifiers[e].addShape(c)},isShapeInAnimatedModifiers:function(c){for(var e=0,s=this.shapeModifiers.length;e<s;)if(this.shapeModifiers[e].isAnimatedWithShape(c))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var c,e=this.shapes.length;for(c=0;c<e;c+=1)this.shapes[c].sh.reset();e=this.shapeModifiers.length;var s;for(c=e-1;c>=0&&(s=this.shapeModifiers[c].processShapes(this._isFirstFrame),!s);c-=1);}},searchProcessedElement:function(c){for(var e=this.processedElements,s=0,r=e.length;s<r;){if(e[s].elem===c)return e[s].pos;s+=1}return 0},addProcessedElement:function(c,e){for(var s=this.processedElements,r=s.length;r;)if(r-=1,s[r].elem===c){s[r].pos=e;return}s.push(new ProcessedElement(c,e))},prepareFrame:function(c){this.prepareRenderableFrame(c),this.prepareProperties(c,this.isInRange)}};const lineCapEnum={1:"butt",2:"round",3:"square"},lineJoinEnum={1:"miter",2:"round",3:"bevel"};SVGShapeData.prototype.setAsAnimated=function(){this._isAnimated=!0},SVGStyleData.prototype.reset=function(){this.d="",this._mdf=!1},DashProperty.prototype.getValue=function(c){if(!(this.elem.globalData.frameId===this.frameId&&!c)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||c,this._mdf)){var e=0,s=this.dataProps.length;for(this.renderer==="svg"&&(this.dashStr=""),e=0;e<s;e+=1)this.dataProps[e].n!=="o"?this.renderer==="svg"?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},extendPrototype([DynamicPropertyContainer],DashProperty),extendPrototype([DynamicPropertyContainer],SVGStrokeStyleData),extendPrototype([DynamicPropertyContainer],SVGFillStyleData),extendPrototype([DynamicPropertyContainer],SVGNoStyleData),GradientProperty.prototype.comparePoints=function(c,e){for(var s=0,r=this.o.length/2,f;s<r;){if(f=Math.abs(c[s*4]-c[e*4+s*2]),f>.01)return!1;s+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!==this.c.length/4)return!1;if(this.data.k.k[0].s)for(var c=0,e=this.data.k.k.length;c<e;){if(!this.comparePoints(this.data.k.k[c].s,this.data.p))return!1;c+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(c){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||c){var e,s=this.data.p*4,r,f;for(e=0;e<s;e+=1)r=e%4===0?100:255,f=Math.round(this.prop.v[e]*r),this.c[e]!==f&&(this.c[e]=f,this._cmdf=!c);if(this.o.length)for(s=this.prop.v.length,e=this.data.p*4;e<s;e+=1)r=e%2===0?100:1,f=e%2===0?Math.round(this.prop.v[e]*100):this.prop.v[e],this.o[e-this.data.p*4]!==f&&(this.o[e-this.data.p*4]=f,this._omdf=!c);this._mdf=!c}},extendPrototype([DynamicPropertyContainer],GradientProperty),SVGGradientFillStyleData.prototype.initGradientData=function(c,e,s){this.o=PropertyFactory.getProp(c,e.o,0,.01,this),this.s=PropertyFactory.getProp(c,e.s,1,null,this),this.e=PropertyFactory.getProp(c,e.e,1,null,this),this.h=PropertyFactory.getProp(c,e.h||{k:0},0,.01,this),this.a=PropertyFactory.getProp(c,e.a||{k:0},0,degToRads,this),this.g=new GradientProperty(c,e.g,this),this.style=s,this.stops=[],this.setGradientData(s.pElem,e),this.setGradientOpacity(e,s),this._isAnimated=!!this._isAnimated},SVGGradientFillStyleData.prototype.setGradientData=function(c,e){var s=createElementID(),r=createNS(e.t===1?"linearGradient":"radialGradient");r.setAttribute("id",s),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse");var f=[],de,Xe,Je;for(Je=e.g.p*4,Xe=0;Xe<Je;Xe+=4)de=createNS("stop"),r.appendChild(de),f.push(de);c.setAttribute(e.ty==="gf"?"fill":"stroke","url("+getLocationHref()+"#"+s+")"),this.gf=r,this.cst=f},SVGGradientFillStyleData.prototype.setGradientOpacity=function(c,e){if(this.g._hasOpacity&&!this.g._collapsable){var s,r,f,de=createNS("mask"),Xe=createNS("path");de.appendChild(Xe);var Je=createElementID(),Ke=createElementID();de.setAttribute("id",Ke);var Qe=createNS(c.t===1?"linearGradient":"radialGradient");Qe.setAttribute("id",Je),Qe.setAttribute("spreadMethod","pad"),Qe.setAttribute("gradientUnits","userSpaceOnUse"),f=c.g.k.k[0].s?c.g.k.k[0].s.length:c.g.k.k.length;var _e=this.stops;for(r=c.g.p*4;r<f;r+=2)s=createNS("stop"),s.setAttribute("stop-color","rgb(255,255,255)"),Qe.appendChild(s),_e.push(s);Xe.setAttribute(c.ty==="gf"?"fill":"stroke","url("+getLocationHref()+"#"+Je+")"),c.ty==="gs"&&(Xe.setAttribute("stroke-linecap",lineCapEnum[c.lc||2]),Xe.setAttribute("stroke-linejoin",lineJoinEnum[c.lj||2]),c.lj===1&&Xe.setAttribute("stroke-miterlimit",c.ml)),this.of=Qe,this.ms=de,this.ost=_e,this.maskId=Ke,e.msElem=Xe}},extendPrototype([DynamicPropertyContainer],SVGGradientFillStyleData),extendPrototype([SVGGradientFillStyleData,DynamicPropertyContainer],SVGGradientStrokeStyleData);const buildShapeString=function(c,e,s,r){if(e===0)return"";var f=c.o,de=c.i,Xe=c.v,Je,Ke=" M"+r.applyToPointStringified(Xe[0][0],Xe[0][1]);for(Je=1;Je<e;Je+=1)Ke+=" C"+r.applyToPointStringified(f[Je-1][0],f[Je-1][1])+" "+r.applyToPointStringified(de[Je][0],de[Je][1])+" "+r.applyToPointStringified(Xe[Je][0],Xe[Je][1]);return s&&e&&(Ke+=" C"+r.applyToPointStringified(f[Je-1][0],f[Je-1][1])+" "+r.applyToPointStringified(de[0][0],de[0][1])+" "+r.applyToPointStringified(Xe[0][0],Xe[0][1]),Ke+="z"),Ke},SVGElementsRenderer=function(){var c=new Matrix,e=new Matrix,s={createRenderFunction:r};function r($e){switch($e.ty){case"fl":return Je;case"gf":return Qe;case"gs":return Ke;case"st":return _e;case"sh":case"el":case"rc":case"sr":return Xe;case"tr":return f;case"no":return de;default:return null}}function f($e,qe,st){(st||qe.transform.op._mdf)&&qe.transform.container.setAttribute("opacity",qe.transform.op.v),(st||qe.transform.mProps._mdf)&&qe.transform.container.setAttribute("transform",qe.transform.mProps.v.to2dCSS())}function de(){}function Xe($e,qe,st){var dt,Wt,Yt,rt,Zt,vt,Tt=qe.styles.length,Jt=qe.lvl,$t,e0,t0,i0,n0;for(vt=0;vt<Tt;vt+=1){if(rt=qe.sh._mdf||st,qe.styles[vt].lvl<Jt){for(e0=e.reset(),i0=Jt-qe.styles[vt].lvl,n0=qe.transformers.length-1;!rt&&i0>0;)rt=qe.transformers[n0].mProps._mdf||rt,i0-=1,n0-=1;if(rt)for(i0=Jt-qe.styles[vt].lvl,n0=qe.transformers.length-1;i0>0;)t0=qe.transformers[n0].mProps.v.props,e0.transform(t0[0],t0[1],t0[2],t0[3],t0[4],t0[5],t0[6],t0[7],t0[8],t0[9],t0[10],t0[11],t0[12],t0[13],t0[14],t0[15]),i0-=1,n0-=1}else e0=c;if($t=qe.sh.paths,Wt=$t._length,rt){for(Yt="",dt=0;dt<Wt;dt+=1)Zt=$t.shapes[dt],Zt&&Zt._length&&(Yt+=buildShapeString(Zt,Zt._length,Zt.c,e0));qe.caches[vt]=Yt}else Yt=qe.caches[vt];qe.styles[vt].d+=$e.hd===!0?"":Yt,qe.styles[vt]._mdf=rt||qe.styles[vt]._mdf}}function Je($e,qe,st){var dt=qe.style;(qe.c._mdf||st)&&dt.pElem.setAttribute("fill","rgb("+bmFloor(qe.c.v[0])+","+bmFloor(qe.c.v[1])+","+bmFloor(qe.c.v[2])+")"),(qe.o._mdf||st)&&dt.pElem.setAttribute("fill-opacity",qe.o.v)}function Ke($e,qe,st){Qe($e,qe,st),_e($e,qe,st)}function Qe($e,qe,st){var dt=qe.gf,Wt=qe.g._hasOpacity,Yt=qe.s.v,rt=qe.e.v;if(qe.o._mdf||st){var Zt=$e.ty==="gf"?"fill-opacity":"stroke-opacity";qe.style.pElem.setAttribute(Zt,qe.o.v)}if(qe.s._mdf||st){var vt=$e.t===1?"x1":"cx",Tt=vt==="x1"?"y1":"cy";dt.setAttribute(vt,Yt[0]),dt.setAttribute(Tt,Yt[1]),Wt&&!qe.g._collapsable&&(qe.of.setAttribute(vt,Yt[0]),qe.of.setAttribute(Tt,Yt[1]))}var Jt,$t,e0,t0;if(qe.g._cmdf||st){Jt=qe.cst;var i0=qe.g.c;for(e0=Jt.length,$t=0;$t<e0;$t+=1)t0=Jt[$t],t0.setAttribute("offset",i0[$t*4]+"%"),t0.setAttribute("stop-color","rgb("+i0[$t*4+1]+","+i0[$t*4+2]+","+i0[$t*4+3]+")")}if(Wt&&(qe.g._omdf||st)){var n0=qe.g.o;for(qe.g._collapsable?Jt=qe.cst:Jt=qe.ost,e0=Jt.length,$t=0;$t<e0;$t+=1)t0=Jt[$t],qe.g._collapsable||t0.setAttribute("offset",n0[$t*2]+"%"),t0.setAttribute("stop-opacity",n0[$t*2+1])}if($e.t===1)(qe.e._mdf||st)&&(dt.setAttribute("x2",rt[0]),dt.setAttribute("y2",rt[1]),Wt&&!qe.g._collapsable&&(qe.of.setAttribute("x2",rt[0]),qe.of.setAttribute("y2",rt[1])));else{var s0;if((qe.s._mdf||qe.e._mdf||st)&&(s0=Math.sqrt(Math.pow(Yt[0]-rt[0],2)+Math.pow(Yt[1]-rt[1],2)),dt.setAttribute("r",s0),Wt&&!qe.g._collapsable&&qe.of.setAttribute("r",s0)),qe.e._mdf||qe.h._mdf||qe.a._mdf||st){s0||(s0=Math.sqrt(Math.pow(Yt[0]-rt[0],2)+Math.pow(Yt[1]-rt[1],2)));var d0=Math.atan2(rt[1]-Yt[1],rt[0]-Yt[0]),u0=qe.h.v;u0>=1?u0=.99:u0<=-1&&(u0=-.99);var G0=s0*u0,h0=Math.cos(d0+qe.a.v)*G0+Yt[0],o0=Math.sin(d0+qe.a.v)*G0+Yt[1];dt.setAttribute("fx",h0),dt.setAttribute("fy",o0),Wt&&!qe.g._collapsable&&(qe.of.setAttribute("fx",h0),qe.of.setAttribute("fy",o0))}}}function _e($e,qe,st){var dt=qe.style,Wt=qe.d;Wt&&(Wt._mdf||st)&&Wt.dashStr&&(dt.pElem.setAttribute("stroke-dasharray",Wt.dashStr),dt.pElem.setAttribute("stroke-dashoffset",Wt.dashoffset[0])),qe.c&&(qe.c._mdf||st)&&dt.pElem.setAttribute("stroke","rgb("+bmFloor(qe.c.v[0])+","+bmFloor(qe.c.v[1])+","+bmFloor(qe.c.v[2])+")"),(qe.o._mdf||st)&&dt.pElem.setAttribute("stroke-opacity",qe.o.v),(qe.w._mdf||st)&&(dt.pElem.setAttribute("stroke-width",qe.w.v),dt.msElem&&dt.msElem.setAttribute("stroke-width",qe.w.v))}return s}();extendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},SVGShapeElement.prototype.filterUniqueShapes=function(){var c,e=this.shapes.length,s,r,f=this.stylesList.length,de,Xe=[],Je=!1;for(r=0;r<f;r+=1){for(de=this.stylesList[r],Je=!1,Xe.length=0,c=0;c<e;c+=1)s=this.shapes[c],s.styles.indexOf(de)!==-1&&(Xe.push(s),Je=s._isAnimated||Je);Xe.length>1&&Je&&this.setShapesAsAnimated(Xe)}},SVGShapeElement.prototype.setShapesAsAnimated=function(c){var e,s=c.length;for(e=0;e<s;e+=1)c[e].setAsAnimated()},SVGShapeElement.prototype.createStyleElement=function(c,e){var s,r=new SVGStyleData(c,e),f=r.pElem;if(c.ty==="st")s=new SVGStrokeStyleData(this,c,r);else if(c.ty==="fl")s=new SVGFillStyleData(this,c,r);else if(c.ty==="gf"||c.ty==="gs"){var de=c.ty==="gf"?SVGGradientFillStyleData:SVGGradientStrokeStyleData;s=new de(this,c,r),this.globalData.defs.appendChild(s.gf),s.maskId&&(this.globalData.defs.appendChild(s.ms),this.globalData.defs.appendChild(s.of),f.setAttribute("mask","url("+getLocationHref()+"#"+s.maskId+")"))}else c.ty==="no"&&(s=new SVGNoStyleData(this,c,r));return(c.ty==="st"||c.ty==="gs")&&(f.setAttribute("stroke-linecap",lineCapEnum[c.lc||2]),f.setAttribute("stroke-linejoin",lineJoinEnum[c.lj||2]),f.setAttribute("fill-opacity","0"),c.lj===1&&f.setAttribute("stroke-miterlimit",c.ml)),c.r===2&&f.setAttribute("fill-rule","evenodd"),c.ln&&f.setAttribute("id",c.ln),c.cl&&f.setAttribute("class",c.cl),c.bm&&(f.style["mix-blend-mode"]=getBlendMode(c.bm)),this.stylesList.push(r),this.addToAnimatedContents(c,s),s},SVGShapeElement.prototype.createGroupElement=function(c){var e=new ShapeGroupData;return c.ln&&e.gr.setAttribute("id",c.ln),c.cl&&e.gr.setAttribute("class",c.cl),c.bm&&(e.gr.style["mix-blend-mode"]=getBlendMode(c.bm)),e},SVGShapeElement.prototype.createTransformElement=function(c,e){var s=TransformPropertyFactory.getTransformProperty(this,c,this),r=new SVGTransformData(s,s.o,e);return this.addToAnimatedContents(c,r),r},SVGShapeElement.prototype.createShapeElement=function(c,e,s){var r=4;c.ty==="rc"?r=5:c.ty==="el"?r=6:c.ty==="sr"&&(r=7);var f=ShapePropertyFactory.getShapeProp(this,c,r,this),de=new SVGShapeData(e,s,f);return this.shapes.push(de),this.addShapeToModifiers(de),this.addToAnimatedContents(c,de),de},SVGShapeElement.prototype.addToAnimatedContents=function(c,e){for(var s=0,r=this.animatedContents.length;s<r;){if(this.animatedContents[s].element===e)return;s+=1}this.animatedContents.push({fn:SVGElementsRenderer.createRenderFunction(c),element:e,data:c})},SVGShapeElement.prototype.setElementStyles=function(c){var e=c.styles,s,r=this.stylesList.length;for(s=0;s<r;s+=1)this.stylesList[s].closed||e.push(this.stylesList[s])},SVGShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var c,e=this.itemsData.length;for(c=0;c<e;c+=1)this.prevViewData[c]=this.itemsData[c];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,c=0;c<e;c+=1)this.dynamicProperties[c].getValue();this.renderModifiers()},SVGShapeElement.prototype.searchShapes=function(c,e,s,r,f,de,Xe){var Je=[].concat(de),Ke,Qe=c.length-1,_e,$e,qe=[],st=[],dt,Wt,Yt;for(Ke=Qe;Ke>=0;Ke-=1){if(Yt=this.searchProcessedElement(c[Ke]),Yt?e[Ke]=s[Yt-1]:c[Ke]._render=Xe,c[Ke].ty==="fl"||c[Ke].ty==="st"||c[Ke].ty==="gf"||c[Ke].ty==="gs"||c[Ke].ty==="no")Yt?e[Ke].style.closed=!1:e[Ke]=this.createStyleElement(c[Ke],f),c[Ke]._render&&e[Ke].style.pElem.parentNode!==r&&r.appendChild(e[Ke].style.pElem),qe.push(e[Ke].style);else if(c[Ke].ty==="gr"){if(!Yt)e[Ke]=this.createGroupElement(c[Ke]);else for($e=e[Ke].it.length,_e=0;_e<$e;_e+=1)e[Ke].prevViewData[_e]=e[Ke].it[_e];this.searchShapes(c[Ke].it,e[Ke].it,e[Ke].prevViewData,e[Ke].gr,f+1,Je,Xe),c[Ke]._render&&e[Ke].gr.parentNode!==r&&r.appendChild(e[Ke].gr)}else c[Ke].ty==="tr"?(Yt||(e[Ke]=this.createTransformElement(c[Ke],r)),dt=e[Ke].transform,Je.push(dt)):c[Ke].ty==="sh"||c[Ke].ty==="rc"||c[Ke].ty==="el"||c[Ke].ty==="sr"?(Yt||(e[Ke]=this.createShapeElement(c[Ke],Je,f)),this.setElementStyles(e[Ke])):c[Ke].ty==="tm"||c[Ke].ty==="rd"||c[Ke].ty==="ms"||c[Ke].ty==="pb"?(Yt?(Wt=e[Ke],Wt.closed=!1):(Wt=ShapeModifiers.getModifier(c[Ke].ty),Wt.init(this,c[Ke]),e[Ke]=Wt,this.shapeModifiers.push(Wt)),st.push(Wt)):c[Ke].ty==="rp"&&(Yt?(Wt=e[Ke],Wt.closed=!0):(Wt=ShapeModifiers.getModifier(c[Ke].ty),e[Ke]=Wt,Wt.init(this,c,Ke,e),this.shapeModifiers.push(Wt),Xe=!1),st.push(Wt));this.addProcessedElement(c[Ke],Ke+1)}for(Qe=qe.length,Ke=0;Ke<Qe;Ke+=1)qe[Ke].closed=!0;for(Qe=st.length,Ke=0;Ke<Qe;Ke+=1)st[Ke].closed=!0},SVGShapeElement.prototype.renderInnerContent=function(){this.renderModifiers();var c,e=this.stylesList.length;for(c=0;c<e;c+=1)this.stylesList[c].reset();for(this.renderShape(),c=0;c<e;c+=1)(this.stylesList[c]._mdf||this._isFirstFrame)&&(this.stylesList[c].msElem&&(this.stylesList[c].msElem.setAttribute("d",this.stylesList[c].d),this.stylesList[c].d="M0 0"+this.stylesList[c].d),this.stylesList[c].pElem.setAttribute("d",this.stylesList[c].d||"M0 0"))},SVGShapeElement.prototype.renderShape=function(){var c,e=this.animatedContents.length,s;for(c=0;c<e;c+=1)s=this.animatedContents[c],(this._isFirstFrame||s.element._isAnimated)&&s.data!==!0&&s.fn(s.data,s.element,this._isFirstFrame)},SVGShapeElement.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},LetterProps.prototype.update=function(c,e,s,r,f,de){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1,this._mdf.p=!1;var Xe=!1;return this.o!==c&&(this.o=c,this._mdf.o=!0,Xe=!0),this.sw!==e&&(this.sw=e,this._mdf.sw=!0,Xe=!0),this.sc!==s&&(this.sc=s,this._mdf.sc=!0,Xe=!0),this.fc!==r&&(this.fc=r,this._mdf.fc=!0,Xe=!0),this.m!==f&&(this.m=f,this._mdf.m=!0,Xe=!0),de.length&&(this.p[0]!==de[0]||this.p[1]!==de[1]||this.p[4]!==de[4]||this.p[5]!==de[5]||this.p[12]!==de[12]||this.p[13]!==de[13])&&(this.p=de,this._mdf.p=!0,Xe=!0),Xe},TextProperty.prototype.defaultBoxWidth=[0,0],TextProperty.prototype.copyData=function(c,e){for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(c[s]=e[s]);return c},TextProperty.prototype.setCurrentData=function(c){c.__complete||this.completeTextData(c),this.currentData=c,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},TextProperty.prototype.searchProperty=function(){return this.searchKeyframes()},TextProperty.prototype.searchKeyframes=function(){return this.kf=this.data.d.k.length>1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},TextProperty.prototype.addEffect=function(c){this.effectsSequence.push(c),this.elem.addDynamicProperty(this)},TextProperty.prototype.getValue=function(c){if(!((this.elem.globalData.frameId===this.frameId||!this.effectsSequence.length)&&!c)){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,s=this.keysIndex;if(this.lock){this.setCurrentData(this.currentData);return}this.lock=!0,this._mdf=!1;var r,f=this.effectsSequence.length,de=c||this.data.d.k[this.keysIndex].s;for(r=0;r<f;r+=1)s!==this.keysIndex?de=this.effectsSequence[r](de,de.t):de=this.effectsSequence[r](this.currentData,de.t);e!==de&&this.setCurrentData(de),this.v=this.currentData,this.pv=this.v,this.lock=!1,this.frameId=this.elem.globalData.frameId}},TextProperty.prototype.getKeyframeValue=function(){for(var c=this.data.d.k,e=this.elem.comp.renderedFrame,s=0,r=c.length;s<=r-1&&!(s===r-1||c[s+1].t>e);)s+=1;return this.keysIndex!==s&&(this.keysIndex=s),this.data.d.k[this.keysIndex].s},TextProperty.prototype.buildFinalText=function(c){for(var e=[],s=0,r=c.length,f,de,Xe=!1;s<r;)f=c.charCodeAt(s),FontManager.isCombinedCharacter(f)?e[e.length-1]+=c.charAt(s):f>=55296&&f<=56319?(de=c.charCodeAt(s+1),de>=56320&&de<=57343?(Xe||FontManager.isModifier(f,de)?(e[e.length-1]+=c.substr(s,2),Xe=!1):e.push(c.substr(s,2)),s+=1):e.push(c.charAt(s))):f>56319?(de=c.charCodeAt(s+1),FontManager.isZeroWidthJoiner(f,de)?(Xe=!0,e[e.length-1]+=c.substr(s,2),s+=1):e.push(c.charAt(s))):FontManager.isZeroWidthJoiner(f)?(e[e.length-1]+=c.charAt(s),Xe=!0):e.push(c.charAt(s)),s+=1;return e},TextProperty.prototype.completeTextData=function(c){c.__complete=!0;var e=this.elem.globalData.fontManager,s=this.data,r=[],f,de,Xe,Je=0,Ke,Qe=s.m.g,_e=0,$e=0,qe=0,st=[],dt=0,Wt=0,Yt,rt,Zt=e.getFontByName(c.f),vt,Tt=0,Jt=getFontProperties(Zt);c.fWeight=Jt.weight,c.fStyle=Jt.style,c.finalSize=c.s,c.finalText=this.buildFinalText(c.t),de=c.finalText.length,c.finalLineHeight=c.lh;var $t=c.tr/1e3*c.finalSize,e0;if(c.sz)for(var t0=!0,i0=c.sz[0],n0=c.sz[1],s0,d0;t0;){d0=this.buildFinalText(c.t),s0=0,dt=0,de=d0.length,$t=c.tr/1e3*c.finalSize;var u0=-1;for(f=0;f<de;f+=1)e0=d0[f].charCodeAt(0),Xe=!1,d0[f]===" "?u0=f:(e0===13||e0===3)&&(dt=0,Xe=!0,s0+=c.finalLineHeight||c.finalSize*1.2),e.chars?(vt=e.getCharData(d0[f],Zt.fStyle,Zt.fFamily),Tt=Xe?0:vt.w*c.finalSize/100):Tt=e.measureText(d0[f],c.f,c.finalSize),dt+Tt>i0&&d0[f]!==" "?(u0===-1?de+=1:f=u0,s0+=c.finalLineHeight||c.finalSize*1.2,d0.splice(f,u0===f?1:0,"\r"),u0=-1,dt=0):(dt+=Tt,dt+=$t);s0+=Zt.ascent*c.finalSize/100,this.canResize&&c.finalSize>this.minimumFontSize&&n0<s0?(c.finalSize-=1,c.finalLineHeight=c.finalSize*c.lh/c.s):(c.finalText=d0,de=c.finalText.length,t0=!1)}dt=-$t,Tt=0;var G0=0,h0;for(f=0;f<de;f+=1)if(Xe=!1,h0=c.finalText[f],e0=h0.charCodeAt(0),e0===13||e0===3?(G0=0,st.push(dt),Wt=dt>Wt?dt:Wt,dt=-2*$t,Ke="",Xe=!0,qe+=1):Ke=h0,e.chars?(vt=e.getCharData(h0,Zt.fStyle,e.getFontByName(c.f).fFamily),Tt=Xe?0:vt.w*c.finalSize/100):Tt=e.measureText(Ke,c.f,c.finalSize),h0===" "?G0+=Tt+$t:(dt+=Tt+$t+G0,G0=0),r.push({l:Tt,an:Tt,add:_e,n:Xe,anIndexes:[],val:Ke,line:qe,animatorJustifyOffset:0}),Qe==2){if(_e+=Tt,Ke===""||Ke===" "||f===de-1){for((Ke===""||Ke===" ")&&(_e-=Tt);$e<=f;)r[$e].an=_e,r[$e].ind=Je,r[$e].extra=Tt,$e+=1;Je+=1,_e=0}}else if(Qe==3){if(_e+=Tt,Ke===""||f===de-1){for(Ke===""&&(_e-=Tt);$e<=f;)r[$e].an=_e,r[$e].ind=Je,r[$e].extra=Tt,$e+=1;_e=0,Je+=1}}else r[Je].ind=Je,r[Je].extra=0,Je+=1;if(c.l=r,Wt=dt>Wt?dt:Wt,st.push(dt),c.sz)c.boxWidth=c.sz[0],c.justifyOffset=0;else switch(c.boxWidth=Wt,c.j){case 1:c.justifyOffset=-c.boxWidth;break;case 2:c.justifyOffset=-c.boxWidth/2;break;default:c.justifyOffset=0}c.lineWidths=st;var o0=s.a,c0,l0;rt=o0.length;var m0,v0,I0=[];for(Yt=0;Yt<rt;Yt+=1){for(c0=o0[Yt],c0.a.sc&&(c.strokeColorAnim=!0),c0.a.sw&&(c.strokeWidthAnim=!0),(c0.a.fc||c0.a.fh||c0.a.fs||c0.a.fb)&&(c.fillColorAnim=!0),v0=0,m0=c0.s.b,f=0;f<de;f+=1)l0=r[f],l0.anIndexes[Yt]=v0,(m0==1&&l0.val!==""||m0==2&&l0.val!==""&&l0.val!==" "||m0==3&&(l0.n||l0.val==" "||f==de-1)||m0==4&&(l0.n||f==de-1))&&(c0.s.rn===1&&I0.push(v0),v0+=1);s.a[Yt].s.totalChars=v0;var P0=-1,ri;if(c0.s.rn===1)for(f=0;f<de;f+=1)l0=r[f],P0!=l0.anIndexes[Yt]&&(P0=l0.anIndexes[Yt],ri=I0.splice(Math.floor(Math.random()*I0.length),1)[0]),l0.anIndexes[Yt]=ri}c.yOffset=c.finalLineHeight||c.finalSize*1.2,c.ls=c.ls||0,c.ascent=Zt.ascent*c.finalSize/100},TextProperty.prototype.updateDocumentData=function(c,e){e=e===void 0?this.keysIndex:e;var s=this.copyData({},this.data.d.k[e].s);s=this.copyData(s,c),this.data.d.k[e].s=s,this.recalculate(e),this.elem.addDynamicProperty(this)},TextProperty.prototype.recalculate=function(c){var e=this.data.d.k[c].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},TextProperty.prototype.canResizeFont=function(c){this.canResize=c,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},TextProperty.prototype.setMinimumFontSize=function(c){this.minimumFontSize=Math.floor(c)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};const TextSelectorProp=function(){var c=Math.max,e=Math.min,s=Math.floor;function r(de,Xe){this._currentTextLength=-1,this.k=!1,this.data=Xe,this.elem=de,this.comp=de.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(de),this.s=PropertyFactory.getProp(de,Xe.s||{k:0},0,0,this),"e"in Xe?this.e=PropertyFactory.getProp(de,Xe.e,0,0,this):this.e={v:100},this.o=PropertyFactory.getProp(de,Xe.o||{k:0},0,0,this),this.xe=PropertyFactory.getProp(de,Xe.xe||{k:0},0,0,this),this.ne=PropertyFactory.getProp(de,Xe.ne||{k:0},0,0,this),this.sm=PropertyFactory.getProp(de,Xe.sm||{k:100},0,0,this),this.a=PropertyFactory.getProp(de,Xe.a,0,.01,this),this.dynamicProperties.length||this.getValue()}r.prototype={getMult:function(de){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var Xe=0,Je=0,Ke=1,Qe=1;this.ne.v>0?Xe=this.ne.v/100:Je=-this.ne.v/100,this.xe.v>0?Ke=1-this.xe.v/100:Qe=1+this.xe.v/100;var _e=BezierFactory.getBezierEasing(Xe,Je,Ke,Qe).get,$e=0,qe=this.finalS,st=this.finalE,dt=this.data.sh;if(dt===2)st===qe?$e=de>=st?1:0:$e=c(0,e(.5/(st-qe)+(de-qe)/(st-qe),1)),$e=_e($e);else if(dt===3)st===qe?$e=de>=st?0:1:$e=1-c(0,e(.5/(st-qe)+(de-qe)/(st-qe),1)),$e=_e($e);else if(dt===4)st===qe?$e=0:($e=c(0,e(.5/(st-qe)+(de-qe)/(st-qe),1)),$e<.5?$e*=2:$e=1-2*($e-.5)),$e=_e($e);else if(dt===5){if(st===qe)$e=0;else{var Wt=st-qe;de=e(c(0,de+.5-qe),st-qe);var Yt=-Wt/2+de,rt=Wt/2;$e=Math.sqrt(1-Yt*Yt/(rt*rt))}$e=_e($e)}else dt===6?(st===qe?$e=0:(de=e(c(0,de+.5-qe),st-qe),$e=(1+Math.cos(Math.PI+Math.PI*2*de/(st-qe)))/2),$e=_e($e)):(de>=s(qe)&&(de-qe<0?$e=c(0,e(e(st,1)-(qe-de),1)):$e=c(0,e(st-de,1))),$e=_e($e));if(this.sm.v!==100){var Zt=this.sm.v*.01;Zt===0&&(Zt=1e-8);var vt=.5-Zt*.5;$e<vt?$e=0:($e=($e-vt)/Zt,$e>1&&($e=1))}return $e*this.a.v},getValue:function(de){this.iterateDynamicProperties(),this._mdf=de||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,de&&this.data.r===2&&(this.e.v=this._currentTextLength);var Xe=this.data.r===2?1:100/this.data.totalChars,Je=this.o.v/Xe,Ke=this.s.v/Xe+Je,Qe=this.e.v/Xe+Je;if(Ke>Qe){var _e=Ke;Ke=Qe,Qe=_e}this.finalS=Ke,this.finalE=Qe}},extendPrototype([DynamicPropertyContainer],r);function f(de,Xe,Je){return new r(de,Xe)}return{getTextSelectorProp:f}}();TextAnimatorProperty.prototype.searchProperties=function(){var c,e=this._textData.a.length,s,r=PropertyFactory.getProp;for(c=0;c<e;c+=1)s=this._textData.a[c],this._animatorsData[c]=new TextAnimatorDataProperty(this._elem,s,this);this._textData.p&&"m"in this._textData.p?(this._pathData={a:r(this._elem,this._textData.p.a,0,0,this),f:r(this._elem,this._textData.p.f,0,0,this),l:r(this._elem,this._textData.p.l,0,0,this),r:r(this._elem,this._textData.p.r,0,0,this),p:r(this._elem,this._textData.p.p,0,0,this),m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=r(this._elem,this._textData.m.a,1,0,this)},TextAnimatorProperty.prototype.getMeasures=function(c,e){if(this.lettersChangedFlag=e,!(!this._mdf&&!this._isFirstFrame&&!e&&(!this._hasMaskedPath||!this._pathData.m._mdf))){this._isFirstFrame=!1;var s=this._moreOptions.alignment.v,r=this._animatorsData,f=this._textData,de=this.mHelper,Xe=this._renderType,Je=this.renderedLetters.length,Ke,Qe,_e,$e,qe=c.l,st,dt,Wt,Yt,rt,Zt,vt,Tt,Jt,$t,e0,t0,i0,n0,s0;if(this._hasMaskedPath){if(s0=this._pathData.m,!this._pathData.n||this._pathData._mdf){var d0=s0.v;this._pathData.r.v&&(d0=d0.reverse()),st={tLength:0,segments:[]},$e=d0._length-1;var u0;for(t0=0,_e=0;_e<$e;_e+=1)u0=bez.buildBezierData(d0.v[_e],d0.v[_e+1],[d0.o[_e][0]-d0.v[_e][0],d0.o[_e][1]-d0.v[_e][1]],[d0.i[_e+1][0]-d0.v[_e+1][0],d0.i[_e+1][1]-d0.v[_e+1][1]]),st.tLength+=u0.segmentLength,st.segments.push(u0),t0+=u0.segmentLength;_e=$e,s0.v.c&&(u0=bez.buildBezierData(d0.v[_e],d0.v[0],[d0.o[_e][0]-d0.v[_e][0],d0.o[_e][1]-d0.v[_e][1]],[d0.i[0][0]-d0.v[0][0],d0.i[0][1]-d0.v[0][1]]),st.tLength+=u0.segmentLength,st.segments.push(u0),t0+=u0.segmentLength),this._pathData.pi=st}if(st=this._pathData.pi,dt=this._pathData.f.v,vt=0,Zt=1,Yt=0,rt=!0,$t=st.segments,dt<0&&s0.v.c)for(st.tLength<Math.abs(dt)&&(dt=-Math.abs(dt)%st.tLength),vt=$t.length-1,Jt=$t[vt].points,Zt=Jt.length-1;dt<0;)dt+=Jt[Zt].partialLength,Zt-=1,Zt<0&&(vt-=1,Jt=$t[vt].points,Zt=Jt.length-1);Jt=$t[vt].points,Tt=Jt[Zt-1],Wt=Jt[Zt],e0=Wt.partialLength}$e=qe.length,Ke=0,Qe=0;var G0=c.finalSize*1.2*.714,h0=!0,o0,c0,l0,m0,v0;m0=r.length;var I0,P0=-1,ri,T0,E0,_0=dt,ii=vt,ui=Zt,Xi=-1,bi,Ci,D0,K0,S0,yi,ai,Q0,U0="",ti=this.defaultPropsArray,ei;if(c.j===2||c.j===1){var V0=0,b0=0,M0=c.j===2?-.5:-1,B0=0,$0=!0;for(_e=0;_e<$e;_e+=1)if(qe[_e].n){for(V0&&(V0+=b0);B0<_e;)qe[B0].animatorJustifyOffset=V0,B0+=1;V0=0,$0=!0}else{for(l0=0;l0<m0;l0+=1)o0=r[l0].a,o0.t.propType&&($0&&c.j===2&&(b0+=o0.t.v*M0),c0=r[l0].s,I0=c0.getMult(qe[_e].anIndexes[l0],f.a[l0].s.totalChars),I0.length?V0+=o0.t.v*I0[0]*M0:V0+=o0.t.v*I0*M0);$0=!1}for(V0&&(V0+=b0);B0<_e;)qe[B0].animatorJustifyOffset=V0,B0+=1}for(_e=0;_e<$e;_e+=1){if(de.reset(),bi=1,qe[_e].n)Ke=0,Qe+=c.yOffset,Qe+=h0?1:0,dt=_0,h0=!1,this._hasMaskedPath&&(vt=ii,Zt=ui,Jt=$t[vt].points,Tt=Jt[Zt-1],Wt=Jt[Zt],e0=Wt.partialLength,Yt=0),U0="",Q0="",yi="",ei="",ti=this.defaultPropsArray;else{if(this._hasMaskedPath){if(Xi!==qe[_e].line){switch(c.j){case 1:dt+=t0-c.lineWidths[qe[_e].line];break;case 2:dt+=(t0-c.lineWidths[qe[_e].line])/2;break}Xi=qe[_e].line}P0!==qe[_e].ind&&(qe[P0]&&(dt+=qe[P0].extra),dt+=qe[_e].an/2,P0=qe[_e].ind),dt+=s[0]*qe[_e].an*.005;var A0=0;for(l0=0;l0<m0;l0+=1)o0=r[l0].a,o0.p.propType&&(c0=r[l0].s,I0=c0.getMult(qe[_e].anIndexes[l0],f.a[l0].s.totalChars),I0.length?A0+=o0.p.v[0]*I0[0]:A0+=o0.p.v[0]*I0),o0.a.propType&&(c0=r[l0].s,I0=c0.getMult(qe[_e].anIndexes[l0],f.a[l0].s.totalChars),I0.length?A0+=o0.a.v[0]*I0[0]:A0+=o0.a.v[0]*I0);for(rt=!0,this._pathData.a.v&&(dt=qe[0].an*.5+(t0-this._pathData.f.v-qe[0].an*.5-qe[qe.length-1].an*.5)*P0/($e-1),dt+=this._pathData.f.v);rt;)Yt+e0>=dt+A0||!Jt?(i0=(dt+A0-Yt)/Wt.partialLength,T0=Tt.point[0]+(Wt.point[0]-Tt.point[0])*i0,E0=Tt.point[1]+(Wt.point[1]-Tt.point[1])*i0,de.translate(-s[0]*qe[_e].an*.005,-(s[1]*G0)*.01),rt=!1):Jt&&(Yt+=Wt.partialLength,Zt+=1,Zt>=Jt.length&&(Zt=0,vt+=1,$t[vt]?Jt=$t[vt].points:s0.v.c?(Zt=0,vt=0,Jt=$t[vt].points):(Yt-=Wt.partialLength,Jt=null)),Jt&&(Tt=Wt,Wt=Jt[Zt],e0=Wt.partialLength));ri=qe[_e].an/2-qe[_e].add,de.translate(-ri,0,0)}else ri=qe[_e].an/2-qe[_e].add,de.translate(-ri,0,0),de.translate(-s[0]*qe[_e].an*.005,-s[1]*G0*.01,0);for(l0=0;l0<m0;l0+=1)o0=r[l0].a,o0.t.propType&&(c0=r[l0].s,I0=c0.getMult(qe[_e].anIndexes[l0],f.a[l0].s.totalChars),(Ke!==0||c.j!==0)&&(this._hasMaskedPath?I0.length?dt+=o0.t.v*I0[0]:dt+=o0.t.v*I0:I0.length?Ke+=o0.t.v*I0[0]:Ke+=o0.t.v*I0));for(c.strokeWidthAnim&&(D0=c.sw||0),c.strokeColorAnim&&(c.sc?Ci=[c.sc[0],c.sc[1],c.sc[2]]:Ci=[0,0,0]),c.fillColorAnim&&c.fc&&(K0=[c.fc[0],c.fc[1],c.fc[2]]),l0=0;l0<m0;l0+=1)o0=r[l0].a,o0.a.propType&&(c0=r[l0].s,I0=c0.getMult(qe[_e].anIndexes[l0],f.a[l0].s.totalChars),I0.length?de.translate(-o0.a.v[0]*I0[0],-o0.a.v[1]*I0[1],o0.a.v[2]*I0[2]):de.translate(-o0.a.v[0]*I0,-o0.a.v[1]*I0,o0.a.v[2]*I0));for(l0=0;l0<m0;l0+=1)o0=r[l0].a,o0.s.propType&&(c0=r[l0].s,I0=c0.getMult(qe[_e].anIndexes[l0],f.a[l0].s.totalChars),I0.length?de.scale(1+(o0.s.v[0]-1)*I0[0],1+(o0.s.v[1]-1)*I0[1],1):de.scale(1+(o0.s.v[0]-1)*I0,1+(o0.s.v[1]-1)*I0,1));for(l0=0;l0<m0;l0+=1){if(o0=r[l0].a,c0=r[l0].s,I0=c0.getMult(qe[_e].anIndexes[l0],f.a[l0].s.totalChars),o0.sk.propType&&(I0.length?de.skewFromAxis(-o0.sk.v*I0[0],o0.sa.v*I0[1]):de.skewFromAxis(-o0.sk.v*I0,o0.sa.v*I0)),o0.r.propType&&(I0.length?de.rotateZ(-o0.r.v*I0[2]):de.rotateZ(-o0.r.v*I0)),o0.ry.propType&&(I0.length?de.rotateY(o0.ry.v*I0[1]):de.rotateY(o0.ry.v*I0)),o0.rx.propType&&(I0.length?de.rotateX(o0.rx.v*I0[0]):de.rotateX(o0.rx.v*I0)),o0.o.propType&&(I0.length?bi+=(o0.o.v*I0[0]-bi)*I0[0]:bi+=(o0.o.v*I0-bi)*I0),c.strokeWidthAnim&&o0.sw.propType&&(I0.length?D0+=o0.sw.v*I0[0]:D0+=o0.sw.v*I0),c.strokeColorAnim&&o0.sc.propType)for(S0=0;S0<3;S0+=1)I0.length?Ci[S0]+=(o0.sc.v[S0]-Ci[S0])*I0[0]:Ci[S0]+=(o0.sc.v[S0]-Ci[S0])*I0;if(c.fillColorAnim&&c.fc){if(o0.fc.propType)for(S0=0;S0<3;S0+=1)I0.length?K0[S0]+=(o0.fc.v[S0]-K0[S0])*I0[0]:K0[S0]+=(o0.fc.v[S0]-K0[S0])*I0;o0.fh.propType&&(I0.length?K0=addHueToRGB(K0,o0.fh.v*I0[0]):K0=addHueToRGB(K0,o0.fh.v*I0)),o0.fs.propType&&(I0.length?K0=addSaturationToRGB(K0,o0.fs.v*I0[0]):K0=addSaturationToRGB(K0,o0.fs.v*I0)),o0.fb.propType&&(I0.length?K0=addBrightnessToRGB(K0,o0.fb.v*I0[0]):K0=addBrightnessToRGB(K0,o0.fb.v*I0))}}for(l0=0;l0<m0;l0+=1)o0=r[l0].a,o0.p.propType&&(c0=r[l0].s,I0=c0.getMult(qe[_e].anIndexes[l0],f.a[l0].s.totalChars),this._hasMaskedPath?I0.length?de.translate(0,o0.p.v[1]*I0[0],-o0.p.v[2]*I0[1]):de.translate(0,o0.p.v[1]*I0,-o0.p.v[2]*I0):I0.length?de.translate(o0.p.v[0]*I0[0],o0.p.v[1]*I0[1],-o0.p.v[2]*I0[2]):de.translate(o0.p.v[0]*I0,o0.p.v[1]*I0,-o0.p.v[2]*I0));if(c.strokeWidthAnim&&(yi=D0<0?0:D0),c.strokeColorAnim&&(ai="rgb("+Math.round(Ci[0]*255)+","+Math.round(Ci[1]*255)+","+Math.round(Ci[2]*255)+")"),c.fillColorAnim&&c.fc&&(Q0="rgb("+Math.round(K0[0]*255)+","+Math.round(K0[1]*255)+","+Math.round(K0[2]*255)+")"),this._hasMaskedPath){if(de.translate(0,-c.ls),de.translate(0,s[1]*G0*.01+Qe,0),this._pathData.p.v){n0=(Wt.point[1]-Tt.point[1])/(Wt.point[0]-Tt.point[0]);var Wi=Math.atan(n0)*180/Math.PI;Wt.point[0]<Tt.point[0]&&(Wi+=180),de.rotate(-Wi*Math.PI/180)}de.translate(T0,E0,0),dt-=s[0]*qe[_e].an*.005,qe[_e+1]&&P0!==qe[_e+1].ind&&(dt+=qe[_e].an/2,dt+=c.tr*.001*c.finalSize)}else{switch(de.translate(Ke,Qe,0),c.ps&&de.translate(c.ps[0],c.ps[1]+c.ascent,0),c.j){case 1:de.translate(qe[_e].animatorJustifyOffset+c.justifyOffset+(c.boxWidth-c.lineWidths[qe[_e].line]),0,0);break;case 2:de.translate(qe[_e].animatorJustifyOffset+c.justifyOffset+(c.boxWidth-c.lineWidths[qe[_e].line])/2,0,0);break}de.translate(0,-c.ls),de.translate(ri,0,0),de.translate(s[0]*qe[_e].an*.005,s[1]*G0*.01,0),Ke+=qe[_e].l+c.tr*.001*c.finalSize}Xe==="html"?U0=de.toCSS():Xe==="svg"?U0=de.to2dCSS():ti=[de.props[0],de.props[1],de.props[2],de.props[3],de.props[4],de.props[5],de.props[6],de.props[7],de.props[8],de.props[9],de.props[10],de.props[11],de.props[12],de.props[13],de.props[14],de.props[15]],ei=bi}Je<=_e?(v0=new LetterProps(ei,yi,ai,Q0,U0,ti),this.renderedLetters.push(v0),Je+=1,this.lettersChangedFlag=!0):(v0=this.renderedLetters[_e],this.lettersChangedFlag=v0.update(ei,yi,ai,Q0,U0,ti)||this.lettersChangedFlag)}}},TextAnimatorProperty.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},TextAnimatorProperty.prototype.mHelper=new Matrix,TextAnimatorProperty.prototype.defaultPropsArray=[],extendPrototype([DynamicPropertyContainer],TextAnimatorProperty),ITextElement.prototype.initElement=function(c,e,s){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(c,e,s),this.textProperty=new TextProperty(this,c.t,this.dynamicProperties),this.textAnimator=new TextAnimatorProperty(c.t,this.renderType,this),this.initTransform(c,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},ITextElement.prototype.prepareFrame=function(c){this._mdf=!1,this.prepareRenderableFrame(c),this.prepareProperties(c,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},ITextElement.prototype.createPathShape=function(c,e){var s,r=e.length,f,de="";for(s=0;s<r;s+=1)e[s].ty==="sh"&&(f=e[s].ks.k,de+=buildShapeString(f,f.i.length,!0,c));return de},ITextElement.prototype.updateDocumentData=function(c,e){this.textProperty.updateDocumentData(c,e)},ITextElement.prototype.canResizeFont=function(c){this.textProperty.canResizeFont(c)},ITextElement.prototype.setMinimumFontSize=function(c){this.textProperty.setMinimumFontSize(c)},ITextElement.prototype.applyTextPropertiesToMatrix=function(c,e,s,r,f){switch(c.ps&&e.translate(c.ps[0],c.ps[1]+c.ascent,0),e.translate(0,-c.ls,0),c.j){case 1:e.translate(c.justifyOffset+(c.boxWidth-c.lineWidths[s]),0,0);break;case 2:e.translate(c.justifyOffset+(c.boxWidth-c.lineWidths[s])/2,0,0);break}e.translate(r,f,0)},ITextElement.prototype.buildColor=function(c){return"rgb("+Math.round(c[0]*255)+","+Math.round(c[1]*255)+","+Math.round(c[2]*255)+")"},ITextElement.prototype.emptyProp=new LetterProps,ITextElement.prototype.destroy=function(){};var emptyShapeData={shapes:[]};extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement],SVGTextLottieElement),SVGTextLottieElement.prototype.createContent=function(){this.data.singleShape&&!this.globalData.fontManager.chars&&(this.textContainer=createNS("text"))},SVGTextLottieElement.prototype.buildTextContents=function(c){for(var e=0,s=c.length,r=[],f="";e<s;)c[e]==="\r"||c[e]===""?(r.push(f),f=""):f+=c[e],e+=1;return r.push(f),r},SVGTextLottieElement.prototype.buildShapeData=function(c,e){if(c.shapes&&c.shapes.length){var s=c.shapes[0];if(s.it){var r=s.it[s.it.length-1];r.s&&(r.s.k[0]=e,r.s.k[1]=e)}}return c},SVGTextLottieElement.prototype.buildNewText=function(){this.addDynamicProperty(this);var c,e,s=this.textProperty.currentData;this.renderedLetters=createSizedArray(s?s.l.length:0),s.fc?this.layerElement.setAttribute("fill",this.buildColor(s.fc)):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this.layerElement.setAttribute("stroke",this.buildColor(s.sc)),this.layerElement.setAttribute("stroke-width",s.sw)),this.layerElement.setAttribute("font-size",s.finalSize);var r=this.globalData.fontManager.getFontByName(s.f);if(r.fClass)this.layerElement.setAttribute("class",r.fClass);else{this.layerElement.setAttribute("font-family",r.fFamily);var f=s.fWeight,de=s.fStyle;this.layerElement.setAttribute("font-style",de),this.layerElement.setAttribute("font-weight",f)}this.layerElement.setAttribute("aria-label",s.t);var Xe=s.l||[],Je=!!this.globalData.fontManager.chars;e=Xe.length;var Ke,Qe=this.mHelper,_e="",$e=this.data.singleShape,qe=0,st=0,dt=!0,Wt=s.tr*.001*s.finalSize;if($e&&!Je&&!s.sz){var Yt=this.textContainer,rt="start";switch(s.j){case 1:rt="end";break;case 2:rt="middle";break;default:rt="start";break}Yt.setAttribute("text-anchor",rt),Yt.setAttribute("letter-spacing",Wt);var Zt=this.buildTextContents(s.finalText);for(e=Zt.length,st=s.ps?s.ps[1]+s.ascent:0,c=0;c<e;c+=1)Ke=this.textSpans[c].span||createNS("tspan"),Ke.textContent=Zt[c],Ke.setAttribute("x",0),Ke.setAttribute("y",st),Ke.style.display="inherit",Yt.appendChild(Ke),this.textSpans[c]||(this.textSpans[c]={span:null,glyph:null}),this.textSpans[c].span=Ke,st+=s.finalLineHeight;this.layerElement.appendChild(Yt)}else{var vt=this.textSpans.length,Tt;for(c=0;c<e;c+=1){if(this.textSpans[c]||(this.textSpans[c]={span:null,childSpan:null,glyph:null}),!Je||!$e||c===0){if(Ke=vt>c?this.textSpans[c].span:createNS(Je?"g":"text"),vt<=c){if(Ke.setAttribute("stroke-linecap","butt"),Ke.setAttribute("stroke-linejoin","round"),Ke.setAttribute("stroke-miterlimit","4"),this.textSpans[c].span=Ke,Je){var Jt=createNS("g");Ke.appendChild(Jt),this.textSpans[c].childSpan=Jt}this.textSpans[c].span=Ke,this.layerElement.appendChild(Ke)}Ke.style.display="inherit"}if(Qe.reset(),$e&&(Xe[c].n&&(qe=-Wt,st+=s.yOffset,st+=dt?1:0,dt=!1),this.applyTextPropertiesToMatrix(s,Qe,Xe[c].line,qe,st),qe+=Xe[c].l||0,qe+=Wt),Je){Tt=this.globalData.fontManager.getCharData(s.finalText[c],r.fStyle,this.globalData.fontManager.getFontByName(s.f).fFamily);var $t;if(Tt.t===1)$t=new SVGCompElement(Tt.data,this.globalData,this);else{var e0=emptyShapeData;Tt.data&&Tt.data.shapes&&(e0=this.buildShapeData(Tt.data,s.finalSize)),$t=new SVGShapeElement(e0,this.globalData,this)}if(this.textSpans[c].glyph){var t0=this.textSpans[c].glyph;this.textSpans[c].childSpan.removeChild(t0.layerElement),t0.destroy()}this.textSpans[c].glyph=$t,$t._debug=!0,$t.prepareFrame(0),$t.renderFrame(),this.textSpans[c].childSpan.appendChild($t.layerElement),Tt.t===1&&this.textSpans[c].childSpan.setAttribute("transform","scale("+s.finalSize/100+","+s.finalSize/100+")")}else $e&&Ke.setAttribute("transform","translate("+Qe.props[12]+","+Qe.props[13]+")"),Ke.textContent=Xe[c].val,Ke.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve")}$e&&Ke&&Ke.setAttribute("d",_e)}for(;c<this.textSpans.length;)this.textSpans[c].span.style.display="none",c+=1;this._sizeChanged=!0},SVGTextLottieElement.prototype.sourceRectAtTime=function(){if(this.prepareFrame(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var c=this.layerElement.getBBox();this.bbox={top:c.y,left:c.x,width:c.width,height:c.height}}return this.bbox},SVGTextLottieElement.prototype.getValue=function(){var c,e=this.textSpans.length,s;for(this.renderedFrame=this.comp.renderedFrame,c=0;c<e;c+=1)s=this.textSpans[c].glyph,s&&(s.prepareFrame(this.comp.renderedFrame-this.data.st),s._mdf&&(this._mdf=!0))},SVGTextLottieElement.prototype.renderInnerContent=function(){if((!this.data.singleShape||this._mdf)&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){this._sizeChanged=!0;var c,e,s=this.textAnimator.renderedLetters,r=this.textProperty.currentData.l;e=r.length;var f,de,Xe;for(c=0;c<e;c+=1)r[c].n||(f=s[c],de=this.textSpans[c].span,Xe=this.textSpans[c].glyph,Xe&&Xe.renderFrame(),f._mdf.m&&de.setAttribute("transform",f.m),f._mdf.o&&de.setAttribute("opacity",f.o),f._mdf.sw&&de.setAttribute("stroke-width",f.sw),f._mdf.sc&&de.setAttribute("stroke",f.sc),f._mdf.fc&&de.setAttribute("fill",f.fc))}},extendPrototype([IImageElement],ISolidElement),ISolidElement.prototype.createContent=function(){var c=createNS("rect");c.setAttribute("width",this.data.sw),c.setAttribute("height",this.data.sh),c.setAttribute("fill",this.data.sc),this.layerElement.appendChild(c)},NullElement.prototype.prepareFrame=function(c){this.prepareProperties(c,!0)},NullElement.prototype.renderFrame=function(){},NullElement.prototype.getBaseElement=function(){return null},NullElement.prototype.destroy=function(){},NullElement.prototype.sourceRectAtTime=function(){},NullElement.prototype.hide=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement],NullElement),extendPrototype([BaseRenderer],SVGRendererBase),SVGRendererBase.prototype.createNull=function(c){return new NullElement(c,this.globalData,this)},SVGRendererBase.prototype.createShape=function(c){return new SVGShapeElement(c,this.globalData,this)},SVGRendererBase.prototype.createText=function(c){return new SVGTextLottieElement(c,this.globalData,this)},SVGRendererBase.prototype.createImage=function(c){return new IImageElement(c,this.globalData,this)},SVGRendererBase.prototype.createSolid=function(c){return new ISolidElement(c,this.globalData,this)},SVGRendererBase.prototype.configAnimation=function(c){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+c.w+" "+c.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",c.w),this.svgElement.setAttribute("height",c.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)",this.svgElement.style.contentVisibility=this.renderConfig.contentVisibility),this.renderConfig.width&&this.svgElement.setAttribute("width",this.renderConfig.width),this.renderConfig.height&&this.svgElement.setAttribute("height",this.renderConfig.height),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.svgElement.setAttribute("id",this.renderConfig.id),this.renderConfig.focusable!==void 0&&this.svgElement.setAttribute("focusable",this.renderConfig.focusable),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(c,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=c;var s=createNS("clipPath"),r=createNS("rect");r.setAttribute("width",c.w),r.setAttribute("height",c.h),r.setAttribute("x",0),r.setAttribute("y",0);var f=createElementID();s.setAttribute("id",f),s.appendChild(r),this.layerElement.setAttribute("clip-path","url("+getLocationHref()+"#"+f+")"),e.appendChild(s),this.layers=c.layers,this.elements=createSizedArray(c.layers.length)},SVGRendererBase.prototype.destroy=function(){this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),this.layerElement=null,this.globalData.defs=null;var c,e=this.layers?this.layers.length:0;for(c=0;c<e;c+=1)this.elements[c]&&this.elements[c].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRendererBase.prototype.updateContainerSize=function(){},SVGRendererBase.prototype.buildItem=function(c){var e=this.elements;if(!(e[c]||this.layers[c].ty===99)){e[c]=!0;var s=this.createItem(this.layers[c]);e[c]=s,getExpressionsPlugin()&&(this.layers[c].ty===0&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,c),this.layers[c].tt&&(!this.elements[c-1]||this.elements[c-1]===!0?(this.buildItem(c-1),this.addPendingElement(s)):s.setMatte(e[c-1].layerId))}},SVGRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var c=this.pendingElements.pop();if(c.checkParenting(),c.data.tt)for(var e=0,s=this.elements.length;e<s;){if(this.elements[e]===c){c.setMatte(this.elements[e-1].layerId);break}e+=1}}},SVGRendererBase.prototype.renderFrame=function(c){if(!(this.renderedFrame===c||this.destroyed)){c===null?c=this.renderedFrame:this.renderedFrame=c,this.globalData.frameNum=c,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=c,this.globalData._mdf=!1;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(c),e=s-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(c-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<s;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},SVGRendererBase.prototype.appendElementInPos=function(c,e){var s=c.getBaseElement();if(s){for(var r=0,f;r<e;)this.elements[r]&&this.elements[r]!==!0&&this.elements[r].getBaseElement()&&(f=this.elements[r].getBaseElement()),r+=1;f?this.layerElement.insertBefore(s,f):this.layerElement.appendChild(s)}},SVGRendererBase.prototype.hide=function(){this.layerElement.style.display="none"},SVGRendererBase.prototype.show=function(){this.layerElement.style.display="block"},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement,RenderableDOMElement],ICompElement),ICompElement.prototype.initElement=function(c,e,s){this.initFrame(),this.initBaseData(c,e,s),this.initTransform(c,e,s),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),(this.data.xt||!e.progressiveLoad)&&this.buildAllItems(),this.hide()},ICompElement.prototype.prepareFrame=function(c){if(this._mdf=!1,this.prepareRenderableFrame(c),this.prepareProperties(c,this.isInRange),!(!this.isInRange&&!this.data.xt)){if(this.tm._placeholder)this.renderedFrame=c/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var s,r=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=r-1;s>=0;s-=1)(this.completeLayers||this.elements[s])&&(this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st),this.elements[s]._mdf&&(this._mdf=!0))}},ICompElement.prototype.renderInnerContent=function(){var c,e=this.layers.length;for(c=0;c<e;c+=1)(this.completeLayers||this.elements[c])&&this.elements[c].renderFrame()},ICompElement.prototype.setElements=function(c){this.elements=c},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroyElements=function(){var c,e=this.layers.length;for(c=0;c<e;c+=1)this.elements[c]&&this.elements[c].destroy()},ICompElement.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},extendPrototype([SVGRendererBase,ICompElement,SVGBaseElement],SVGCompElement),SVGCompElement.prototype.createComp=function(c){return new SVGCompElement(c,this.globalData,this)},extendPrototype([SVGRendererBase],SVGRenderer),SVGRenderer.prototype.createComp=function(c){return new SVGCompElement(c,this.globalData,this)},CVContextData.prototype.duplicate=function(){var c=this._length*2,e=this.savedOp;this.savedOp=createTypedArray("float32",c),this.savedOp.set(e);var s=0;for(s=this._length;s<c;s+=1)this.saved[s]=createTypedArray("float32",16);this._length=c},CVContextData.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},ShapeTransformManager.prototype={addTransformSequence:function(c){var e,s=c.length,r="_";for(e=0;e<s;e+=1)r+=c[e].transform.key+"_";var f=this.sequences[r];return f||(f={transforms:[].concat(c),finalTransform:new Matrix,_mdf:!1},this.sequences[r]=f,this.sequenceList.push(f)),f},processSequence:function(c,e){for(var s=0,r=c.transforms.length,f=e;s<r&&!e;){if(c.transforms[s].transform.mProps._mdf){f=!0;break}s+=1}if(f){var de;for(c.finalTransform.reset(),s=r-1;s>=0;s-=1)de=c.transforms[s].transform.mProps.v.props,c.finalTransform.transform(de[0],de[1],de[2],de[3],de[4],de[5],de[6],de[7],de[8],de[9],de[10],de[11],de[12],de[13],de[14],de[15])}c._mdf=f},processSequences:function(c){var e,s=this.sequenceList.length;for(e=0;e<s;e+=1)this.processSequence(this.sequenceList[e],c)},getNewKey:function(){return this.transform_key_count+=1,"_"+this.transform_key_count}},CVEffects.prototype.renderFrame=function(){},CVMaskElement.prototype.renderFrame=function(){if(this.hasMasks){var c=this.element.finalTransform.mat,e=this.element.canvasContext,s,r=this.masksProperties.length,f,de,Xe;for(e.beginPath(),s=0;s<r;s+=1)if(this.masksProperties[s].mode!=="n"){this.masksProperties[s].inv&&(e.moveTo(0,0),e.lineTo(this.element.globalData.compSize.w,0),e.lineTo(this.element.globalData.compSize.w,this.element.globalData.compSize.h),e.lineTo(0,this.element.globalData.compSize.h),e.lineTo(0,0)),Xe=this.viewData[s].v,f=c.applyToPointArray(Xe.v[0][0],Xe.v[0][1],0),e.moveTo(f[0],f[1]);var Je,Ke=Xe._length;for(Je=1;Je<Ke;Je+=1)de=c.applyToTriplePoints(Xe.o[Je-1],Xe.i[Je],Xe.v[Je]),e.bezierCurveTo(de[0],de[1],de[2],de[3],de[4],de[5]);de=c.applyToTriplePoints(Xe.o[Je-1],Xe.i[0],Xe.v[0]),e.bezierCurveTo(de[0],de[1],de[2],de[3],de[4],de[5])}this.element.globalData.renderer.save(!0),e.clip()}},CVMaskElement.prototype.getMaskProperty=MaskElement.prototype.getMaskProperty,CVMaskElement.prototype.destroy=function(){this.element=null},CVBaseElement.prototype={createElements:function(){},initRendererElement:function(){},createContainerElements:function(){this.canvasContext=this.globalData.canvasContext,this.renderableEffectsManager=new CVEffects},createContent:function(){},setBlendMode:function(){var c=this.globalData;if(c.blendMode!==this.data.bm){c.blendMode=this.data.bm;var e=getBlendMode(this.data.bm);c.canvasContext.globalCompositeOperation=e}},createRenderableComponents:function(){this.maskManager=new CVMaskElement(this.data,this)},hideElement:function(){!this.hidden&&(!this.isInRange||this.isTransparent)&&(this.hidden=!0)},showElement:function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._isFirstFrame=!0,this.maskManager._isFirstFrame=!0)},renderFrame:function(){if(!(this.hidden||this.data.hd)){this.renderTransform(),this.renderRenderable(),this.setBlendMode();var c=this.data.ty===0;this.globalData.renderer.save(c),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this.globalData.renderer.restore(c),this.maskManager.hasMasks&&this.globalData.renderer.restore(!0),this._isFirstFrame&&(this._isFirstFrame=!1)}},destroy:function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager.destroy()},mHelper:new Matrix},CVBaseElement.prototype.hide=CVBaseElement.prototype.hideElement,CVBaseElement.prototype.show=CVBaseElement.prototype.showElement,CVShapeData.prototype.setAsAnimated=SVGShapeData.prototype.setAsAnimated,extendPrototype([BaseElement,TransformElement,CVBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableElement],CVShapeElement),CVShapeElement.prototype.initElement=RenderableDOMElement.prototype.initElement,CVShapeElement.prototype.transformHelper={opacity:1,_opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[])},CVShapeElement.prototype.createStyleElement=function(c,e){var s={data:c,type:c.ty,preTransforms:this.transformsManager.addTransformSequence(e),transforms:[],elements:[],closed:c.hd===!0},r={};if(c.ty==="fl"||c.ty==="st"?(r.c=PropertyFactory.getProp(this,c.c,1,255,this),r.c.k||(s.co="rgb("+bmFloor(r.c.v[0])+","+bmFloor(r.c.v[1])+","+bmFloor(r.c.v[2])+")")):(c.ty==="gf"||c.ty==="gs")&&(r.s=PropertyFactory.getProp(this,c.s,1,null,this),r.e=PropertyFactory.getProp(this,c.e,1,null,this),r.h=PropertyFactory.getProp(this,c.h||{k:0},0,.01,this),r.a=PropertyFactory.getProp(this,c.a||{k:0},0,degToRads,this),r.g=new GradientProperty(this,c.g,this)),r.o=PropertyFactory.getProp(this,c.o,0,.01,this),c.ty==="st"||c.ty==="gs"){if(s.lc=lineCapEnum[c.lc||2],s.lj=lineJoinEnum[c.lj||2],c.lj==1&&(s.ml=c.ml),r.w=PropertyFactory.getProp(this,c.w,0,null,this),r.w.k||(s.wi=r.w.v),c.d){var f=new DashProperty(this,c.d,"canvas",this);r.d=f,r.d.k||(s.da=r.d.dashArray,s.do=r.d.dashoffset[0])}}else s.r=c.r===2?"evenodd":"nonzero";return this.stylesList.push(s),r.style=s,r},CVShapeElement.prototype.createGroupElement=function(){var c={it:[],prevViewData:[]};return c},CVShapeElement.prototype.createTransformElement=function(c){var e={transform:{opacity:1,_opMdf:!1,key:this.transformsManager.getNewKey(),op:PropertyFactory.getProp(this,c.o,0,.01,this),mProps:TransformPropertyFactory.getTransformProperty(this,c,this)}};return e},CVShapeElement.prototype.createShapeElement=function(c){var e=new CVShapeData(this,c,this.stylesList,this.transformsManager);return this.shapes.push(e),this.addShapeToModifiers(e),e},CVShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var c,e=this.itemsData.length;for(c=0;c<e;c+=1)this.prevViewData[c]=this.itemsData[c];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[]),e=this.dynamicProperties.length,c=0;c<e;c+=1)this.dynamicProperties[c].getValue();this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame)},CVShapeElement.prototype.addTransformToStyleList=function(c){var e,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||this.stylesList[e].transforms.push(c)},CVShapeElement.prototype.removeTransformFromStyleList=function(){var c,e=this.stylesList.length;for(c=0;c<e;c+=1)this.stylesList[c].closed||this.stylesList[c].transforms.pop()},CVShapeElement.prototype.closeStyles=function(c){var e,s=c.length;for(e=0;e<s;e+=1)c[e].closed=!0},CVShapeElement.prototype.searchShapes=function(c,e,s,r,f){var de,Xe=c.length-1,Je,Ke,Qe=[],_e=[],$e,qe,st,dt=[].concat(f);for(de=Xe;de>=0;de-=1){if($e=this.searchProcessedElement(c[de]),$e?e[de]=s[$e-1]:c[de]._shouldRender=r,c[de].ty==="fl"||c[de].ty==="st"||c[de].ty==="gf"||c[de].ty==="gs")$e?e[de].style.closed=!1:e[de]=this.createStyleElement(c[de],dt),Qe.push(e[de].style);else if(c[de].ty==="gr"){if(!$e)e[de]=this.createGroupElement(c[de]);else for(Ke=e[de].it.length,Je=0;Je<Ke;Je+=1)e[de].prevViewData[Je]=e[de].it[Je];this.searchShapes(c[de].it,e[de].it,e[de].prevViewData,r,dt)}else c[de].ty==="tr"?($e||(st=this.createTransformElement(c[de]),e[de]=st),dt.push(e[de]),this.addTransformToStyleList(e[de])):c[de].ty==="sh"||c[de].ty==="rc"||c[de].ty==="el"||c[de].ty==="sr"?$e||(e[de]=this.createShapeElement(c[de])):c[de].ty==="tm"||c[de].ty==="rd"||c[de].ty==="pb"?($e?(qe=e[de],qe.closed=!1):(qe=ShapeModifiers.getModifier(c[de].ty),qe.init(this,c[de]),e[de]=qe,this.shapeModifiers.push(qe)),_e.push(qe)):c[de].ty==="rp"&&($e?(qe=e[de],qe.closed=!0):(qe=ShapeModifiers.getModifier(c[de].ty),e[de]=qe,qe.init(this,c,de,e),this.shapeModifiers.push(qe),r=!1),_e.push(qe));this.addProcessedElement(c[de],de+1)}for(this.removeTransformFromStyleList(),this.closeStyles(Qe),Xe=_e.length,de=0;de<Xe;de+=1)_e[de].closed=!0},CVShapeElement.prototype.renderInnerContent=function(){this.transformHelper.opacity=1,this.transformHelper._opMdf=!1,this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame),this.renderShape(this.transformHelper,this.shapesData,this.itemsData,!0)},CVShapeElement.prototype.renderShapeTransform=function(c,e){(c._opMdf||e.op._mdf||this._isFirstFrame)&&(e.opacity=c.opacity,e.opacity*=e.op.v,e._opMdf=!0)},CVShapeElement.prototype.drawLayer=function(){var c,e=this.stylesList.length,s,r,f,de,Xe,Je,Ke=this.globalData.renderer,Qe=this.globalData.canvasContext,_e,$e;for(c=0;c<e;c+=1)if($e=this.stylesList[c],_e=$e.type,!((_e==="st"||_e==="gs")&&$e.wi===0||!$e.data._shouldRender||$e.coOp===0||this.globalData.currentGlobalAlpha===0)){for(Ke.save(),Xe=$e.elements,_e==="st"||_e==="gs"?(Qe.strokeStyle=_e==="st"?$e.co:$e.grd,Qe.lineWidth=$e.wi,Qe.lineCap=$e.lc,Qe.lineJoin=$e.lj,Qe.miterLimit=$e.ml||0):Qe.fillStyle=_e==="fl"?$e.co:$e.grd,Ke.ctxOpacity($e.coOp),_e!=="st"&&_e!=="gs"&&Qe.beginPath(),Ke.ctxTransform($e.preTransforms.finalTransform.props),r=Xe.length,s=0;s<r;s+=1){for((_e==="st"||_e==="gs")&&(Qe.beginPath(),$e.da&&(Qe.setLineDash($e.da),Qe.lineDashOffset=$e.do)),Je=Xe[s].trNodes,de=Je.length,f=0;f<de;f+=1)Je[f].t==="m"?Qe.moveTo(Je[f].p[0],Je[f].p[1]):Je[f].t==="c"?Qe.bezierCurveTo(Je[f].pts[0],Je[f].pts[1],Je[f].pts[2],Je[f].pts[3],Je[f].pts[4],Je[f].pts[5]):Qe.closePath();(_e==="st"||_e==="gs")&&(Qe.stroke(),$e.da&&Qe.setLineDash(this.dashResetter))}_e!=="st"&&_e!=="gs"&&Qe.fill($e.r),Ke.restore()}},CVShapeElement.prototype.renderShape=function(c,e,s,r){var f,de=e.length-1,Xe;for(Xe=c,f=de;f>=0;f-=1)e[f].ty==="tr"?(Xe=s[f].transform,this.renderShapeTransform(c,Xe)):e[f].ty==="sh"||e[f].ty==="el"||e[f].ty==="rc"||e[f].ty==="sr"?this.renderPath(e[f],s[f]):e[f].ty==="fl"?this.renderFill(e[f],s[f],Xe):e[f].ty==="st"?this.renderStroke(e[f],s[f],Xe):e[f].ty==="gf"||e[f].ty==="gs"?this.renderGradientFill(e[f],s[f],Xe):e[f].ty==="gr"?this.renderShape(Xe,e[f].it,s[f].it):e[f].ty;r&&this.drawLayer()},CVShapeElement.prototype.renderStyledShape=function(c,e){if(this._isFirstFrame||e._mdf||c.transforms._mdf){var s=c.trNodes,r=e.paths,f,de,Xe,Je=r._length;s.length=0;var Ke=c.transforms.finalTransform;for(Xe=0;Xe<Je;Xe+=1){var Qe=r.shapes[Xe];if(Qe&&Qe.v){for(de=Qe._length,f=1;f<de;f+=1)f===1&&s.push({t:"m",p:Ke.applyToPointArray(Qe.v[0][0],Qe.v[0][1],0)}),s.push({t:"c",pts:Ke.applyToTriplePoints(Qe.o[f-1],Qe.i[f],Qe.v[f])});de===1&&s.push({t:"m",p:Ke.applyToPointArray(Qe.v[0][0],Qe.v[0][1],0)}),Qe.c&&de&&(s.push({t:"c",pts:Ke.applyToTriplePoints(Qe.o[f-1],Qe.i[0],Qe.v[0])}),s.push({t:"z"}))}}c.trNodes=s}},CVShapeElement.prototype.renderPath=function(c,e){if(c.hd!==!0&&c._shouldRender){var s,r=e.styledShapes.length;for(s=0;s<r;s+=1)this.renderStyledShape(e.styledShapes[s],e.sh)}},CVShapeElement.prototype.renderFill=function(c,e,s){var r=e.style;(e.c._mdf||this._isFirstFrame)&&(r.co="rgb("+bmFloor(e.c.v[0])+","+bmFloor(e.c.v[1])+","+bmFloor(e.c.v[2])+")"),(e.o._mdf||s._opMdf||this._isFirstFrame)&&(r.coOp=e.o.v*s.opacity)},CVShapeElement.prototype.renderGradientFill=function(c,e,s){var r=e.style,f;if(!r.grd||e.g._mdf||e.s._mdf||e.e._mdf||c.t!==1&&(e.h._mdf||e.a._mdf)){var de=this.globalData.canvasContext,Xe=e.s.v,Je=e.e.v;if(c.t===1)f=de.createLinearGradient(Xe[0],Xe[1],Je[0],Je[1]);else{var Ke=Math.sqrt(Math.pow(Xe[0]-Je[0],2)+Math.pow(Xe[1]-Je[1],2)),Qe=Math.atan2(Je[1]-Xe[1],Je[0]-Xe[0]),_e=e.h.v;_e>=1?_e=.99:_e<=-1&&(_e=-.99);var $e=Ke*_e,qe=Math.cos(Qe+e.a.v)*$e+Xe[0],st=Math.sin(Qe+e.a.v)*$e+Xe[1];f=de.createRadialGradient(qe,st,0,Xe[0],Xe[1],Ke)}var dt,Wt=c.g.p,Yt=e.g.c,rt=1;for(dt=0;dt<Wt;dt+=1)e.g._hasOpacity&&e.g._collapsable&&(rt=e.g.o[dt*2+1]),f.addColorStop(Yt[dt*4]/100,"rgba("+Yt[dt*4+1]+","+Yt[dt*4+2]+","+Yt[dt*4+3]+","+rt+")");r.grd=f}r.coOp=e.o.v*s.opacity},CVShapeElement.prototype.renderStroke=function(c,e,s){var r=e.style,f=e.d;f&&(f._mdf||this._isFirstFrame)&&(r.da=f.dashArray,r.do=f.dashoffset[0]),(e.c._mdf||this._isFirstFrame)&&(r.co="rgb("+bmFloor(e.c.v[0])+","+bmFloor(e.c.v[1])+","+bmFloor(e.c.v[2])+")"),(e.o._mdf||s._opMdf||this._isFirstFrame)&&(r.coOp=e.o.v*s.opacity),(e.w._mdf||this._isFirstFrame)&&(r.wi=e.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement,ITextElement],CVTextElement),CVTextElement.prototype.tHelper=createTag("canvas").getContext("2d"),CVTextElement.prototype.buildNewText=function(){var c=this.textProperty.currentData;this.renderedLetters=createSizedArray(c.l?c.l.length:0);var e=!1;c.fc?(e=!0,this.values.fill=this.buildColor(c.fc)):this.values.fill="rgba(0,0,0,0)",this.fill=e;var s=!1;c.sc&&(s=!0,this.values.stroke=this.buildColor(c.sc),this.values.sWidth=c.sw);var r=this.globalData.fontManager.getFontByName(c.f),f,de,Xe=c.l,Je=this.mHelper;this.stroke=s,this.values.fValue=c.finalSize+"px "+this.globalData.fontManager.getFontByName(c.f).fFamily,de=c.finalText.length;var Ke,Qe,_e,$e,qe,st,dt,Wt,Yt,rt,Zt=this.data.singleShape,vt=c.tr*.001*c.finalSize,Tt=0,Jt=0,$t=!0,e0=0;for(f=0;f<de;f+=1){Ke=this.globalData.fontManager.getCharData(c.finalText[f],r.fStyle,this.globalData.fontManager.getFontByName(c.f).fFamily),Qe=Ke&&Ke.data||{},Je.reset(),Zt&&Xe[f].n&&(Tt=-vt,Jt+=c.yOffset,Jt+=$t?1:0,$t=!1),qe=Qe.shapes?Qe.shapes[0].it:[],dt=qe.length,Je.scale(c.finalSize/100,c.finalSize/100),Zt&&this.applyTextPropertiesToMatrix(c,Je,Xe[f].line,Tt,Jt),Yt=createSizedArray(dt-1);var t0=0;for(st=0;st<dt;st+=1)if(qe[st].ty==="sh"){for($e=qe[st].ks.k.i.length,Wt=qe[st].ks.k,rt=[],_e=1;_e<$e;_e+=1)_e===1&&rt.push(Je.applyToX(Wt.v[0][0],Wt.v[0][1],0),Je.applyToY(Wt.v[0][0],Wt.v[0][1],0)),rt.push(Je.applyToX(Wt.o[_e-1][0],Wt.o[_e-1][1],0),Je.applyToY(Wt.o[_e-1][0],Wt.o[_e-1][1],0),Je.applyToX(Wt.i[_e][0],Wt.i[_e][1],0),Je.applyToY(Wt.i[_e][0],Wt.i[_e][1],0),Je.applyToX(Wt.v[_e][0],Wt.v[_e][1],0),Je.applyToY(Wt.v[_e][0],Wt.v[_e][1],0));rt.push(Je.applyToX(Wt.o[_e-1][0],Wt.o[_e-1][1],0),Je.applyToY(Wt.o[_e-1][0],Wt.o[_e-1][1],0),Je.applyToX(Wt.i[0][0],Wt.i[0][1],0),Je.applyToY(Wt.i[0][0],Wt.i[0][1],0),Je.applyToX(Wt.v[0][0],Wt.v[0][1],0),Je.applyToY(Wt.v[0][0],Wt.v[0][1],0)),Yt[t0]=rt,t0+=1}Zt&&(Tt+=Xe[f].l,Tt+=vt),this.textSpans[e0]?this.textSpans[e0].elem=Yt:this.textSpans[e0]={elem:Yt},e0+=1}},CVTextElement.prototype.renderInnerContent=function(){var c=this.canvasContext;c.font=this.values.fValue,c.lineCap="butt",c.lineJoin="miter",c.miterLimit=4,this.data.singleShape||this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag);var e,s,r,f,de,Xe,Je=this.textAnimator.renderedLetters,Ke=this.textProperty.currentData.l;s=Ke.length;var Qe,_e=null,$e=null,qe=null,st,dt;for(e=0;e<s;e+=1)if(!Ke[e].n){if(Qe=Je[e],Qe&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(Qe.p),this.globalData.renderer.ctxOpacity(Qe.o)),this.fill){for(Qe&&Qe.fc?_e!==Qe.fc&&(_e=Qe.fc,c.fillStyle=Qe.fc):_e!==this.values.fill&&(_e=this.values.fill,c.fillStyle=this.values.fill),st=this.textSpans[e].elem,f=st.length,this.globalData.canvasContext.beginPath(),r=0;r<f;r+=1)for(dt=st[r],Xe=dt.length,this.globalData.canvasContext.moveTo(dt[0],dt[1]),de=2;de<Xe;de+=6)this.globalData.canvasContext.bezierCurveTo(dt[de],dt[de+1],dt[de+2],dt[de+3],dt[de+4],dt[de+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(Qe&&Qe.sw?qe!==Qe.sw&&(qe=Qe.sw,c.lineWidth=Qe.sw):qe!==this.values.sWidth&&(qe=this.values.sWidth,c.lineWidth=this.values.sWidth),Qe&&Qe.sc?$e!==Qe.sc&&($e=Qe.sc,c.strokeStyle=Qe.sc):$e!==this.values.stroke&&($e=this.values.stroke,c.strokeStyle=this.values.stroke),st=this.textSpans[e].elem,f=st.length,this.globalData.canvasContext.beginPath(),r=0;r<f;r+=1)for(dt=st[r],Xe=dt.length,this.globalData.canvasContext.moveTo(dt[0],dt[1]),de=2;de<Xe;de+=6)this.globalData.canvasContext.bezierCurveTo(dt[de],dt[de+1],dt[de+2],dt[de+3],dt[de+4],dt[de+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}Qe&&this.globalData.renderer.restore()}},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement],CVImageElement),CVImageElement.prototype.initElement=SVGShapeElement.prototype.initElement,CVImageElement.prototype.prepareFrame=IImageElement.prototype.prepareFrame,CVImageElement.prototype.createContent=function(){if(this.img.width&&(this.assetData.w!==this.img.width||this.assetData.h!==this.img.height)){var c=createTag("canvas");c.width=this.assetData.w,c.height=this.assetData.h;var e=c.getContext("2d"),s=this.img.width,r=this.img.height,f=s/r,de=this.assetData.w/this.assetData.h,Xe,Je,Ke=this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio;f>de&&Ke==="xMidYMid slice"||f<de&&Ke!=="xMidYMid slice"?(Je=r,Xe=Je*de):(Xe=s,Je=Xe/de),e.drawImage(this.img,(s-Xe)/2,(r-Je)/2,Xe,Je,0,0,this.assetData.w,this.assetData.h),this.img=c}},CVImageElement.prototype.renderInnerContent=function(){this.canvasContext.drawImage(this.img,0,0)},CVImageElement.prototype.destroy=function(){this.img=null},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement],CVSolidElement),CVSolidElement.prototype.initElement=SVGShapeElement.prototype.initElement,CVSolidElement.prototype.prepareFrame=IImageElement.prototype.prepareFrame,CVSolidElement.prototype.renderInnerContent=function(){var c=this.canvasContext;c.fillStyle=this.data.sc,c.fillRect(0,0,this.data.sw,this.data.sh)},extendPrototype([BaseRenderer],CanvasRendererBase),CanvasRendererBase.prototype.createShape=function(c){return new CVShapeElement(c,this.globalData,this)},CanvasRendererBase.prototype.createText=function(c){return new CVTextElement(c,this.globalData,this)},CanvasRendererBase.prototype.createImage=function(c){return new CVImageElement(c,this.globalData,this)},CanvasRendererBase.prototype.createSolid=function(c){return new CVSolidElement(c,this.globalData,this)},CanvasRendererBase.prototype.createNull=SVGRenderer.prototype.createNull,CanvasRendererBase.prototype.ctxTransform=function(c){if(!(c[0]===1&&c[1]===0&&c[4]===0&&c[5]===1&&c[12]===0&&c[13]===0)){if(!this.renderConfig.clearCanvas){this.canvasContext.transform(c[0],c[1],c[4],c[5],c[12],c[13]);return}this.transformMat.cloneFromProps(c);var e=this.contextData.cTr.props;this.transformMat.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var s=this.contextData.cTr.props;this.canvasContext.setTransform(s[0],s[1],s[4],s[5],s[12],s[13])}},CanvasRendererBase.prototype.ctxOpacity=function(c){if(!this.renderConfig.clearCanvas){this.canvasContext.globalAlpha*=c<0?0:c,this.globalData.currentGlobalAlpha=this.contextData.cO;return}this.contextData.cO*=c<0?0:c,this.globalData.currentGlobalAlpha!==this.contextData.cO&&(this.canvasContext.globalAlpha=this.contextData.cO,this.globalData.currentGlobalAlpha=this.contextData.cO)},CanvasRendererBase.prototype.reset=function(){if(!this.renderConfig.clearCanvas){this.canvasContext.restore();return}this.contextData.reset()},CanvasRendererBase.prototype.save=function(c){if(!this.renderConfig.clearCanvas){this.canvasContext.save();return}c&&this.canvasContext.save();var e=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var s,r=this.contextData.saved[this.contextData.cArrPos];for(s=0;s<16;s+=1)r[s]=e[s];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRendererBase.prototype.restore=function(c){if(!this.renderConfig.clearCanvas){this.canvasContext.restore();return}c&&(this.canvasContext.restore(),this.globalData.blendMode="source-over"),this.contextData.cArrPos-=1;var e=this.contextData.saved[this.contextData.cArrPos],s,r=this.contextData.cTr.props;for(s=0;s<16;s+=1)r[s]=e[s];this.canvasContext.setTransform(e[0],e[1],e[4],e[5],e[12],e[13]),e=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=e,this.globalData.currentGlobalAlpha!==e&&(this.canvasContext.globalAlpha=e,this.globalData.currentGlobalAlpha=e)},CanvasRendererBase.prototype.configAnimation=function(c){if(this.animationItem.wrapper){this.animationItem.container=createTag("canvas");var e=this.animationItem.container.style;e.width="100%",e.height="100%";var s="0px 0px 0px";e.transformOrigin=s,e.mozTransformOrigin=s,e.webkitTransformOrigin=s,e["-webkit-transform"]=s,e.contentVisibility=this.renderConfig.contentVisibility,this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d"),this.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.animationItem.container.setAttribute("id",this.renderConfig.id)}else this.canvasContext=this.renderConfig.context;this.data=c,this.layers=c.layers,this.transformCanvas={w:c.w,h:c.h,sx:0,sy:0,tx:0,ty:0},this.setupGlobalData(c,document.body),this.globalData.canvasContext=this.canvasContext,this.globalData.renderer=this,this.globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=createSizedArray(c.layers.length),this.updateContainerSize()},CanvasRendererBase.prototype.updateContainerSize=function(){this.reset();var c,e;this.animationItem.wrapper&&this.animationItem.container?(c=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",c*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",e*this.renderConfig.dpr)):(c=this.canvasContext.canvas.width*this.renderConfig.dpr,e=this.canvasContext.canvas.height*this.renderConfig.dpr);var s,r;if(this.renderConfig.preserveAspectRatio.indexOf("meet")!==-1||this.renderConfig.preserveAspectRatio.indexOf("slice")!==-1){var f=this.renderConfig.preserveAspectRatio.split(" "),de=f[1]||"meet",Xe=f[0]||"xMidYMid",Je=Xe.substr(0,4),Ke=Xe.substr(4);s=c/e,r=this.transformCanvas.w/this.transformCanvas.h,r>s&&de==="meet"||r<s&&de==="slice"?(this.transformCanvas.sx=c/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=c/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)),Je==="xMid"&&(r<s&&de==="meet"||r>s&&de==="slice")?this.transformCanvas.tx=(c-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:Je==="xMax"&&(r<s&&de==="meet"||r>s&&de==="slice")?this.transformCanvas.tx=(c-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:this.transformCanvas.tx=0,Ke==="YMid"&&(r>s&&de==="meet"||r<s&&de==="slice")?this.transformCanvas.ty=(e-this.transformCanvas.h*(c/this.transformCanvas.w))/2*this.renderConfig.dpr:Ke==="YMax"&&(r>s&&de==="meet"||r<s&&de==="slice")?this.transformCanvas.ty=(e-this.transformCanvas.h*(c/this.transformCanvas.w))*this.renderConfig.dpr:this.transformCanvas.ty=0}else this.renderConfig.preserveAspectRatio==="none"?(this.transformCanvas.sx=c/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr,this.transformCanvas.tx=0,this.transformCanvas.ty=0);this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1],this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip(),this.renderFrame(this.renderedFrame,!0)},CanvasRendererBase.prototype.destroy=function(){this.renderConfig.clearCanvas&&this.animationItem.wrapper&&(this.animationItem.wrapper.innerText="");var c,e=this.layers?this.layers.length:0;for(c=e-1;c>=0;c-=1)this.elements[c]&&this.elements[c].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRendererBase.prototype.renderFrame=function(c,e){if(!(this.renderedFrame===c&&this.renderConfig.clearCanvas===!0&&!e||this.destroyed||c===-1)){this.renderedFrame=c,this.globalData.frameNum=c-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||e,this.globalData.projectInterface.currentFrame=c;var s,r=this.layers.length;for(this.completeLayers||this.checkLayers(c),s=0;s<r;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(c-this.layers[s].st);if(this.globalData._mdf){for(this.renderConfig.clearCanvas===!0?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),s=r-1;s>=0;s-=1)(this.completeLayers||this.elements[s])&&this.elements[s].renderFrame();this.renderConfig.clearCanvas!==!0&&this.restore()}}},CanvasRendererBase.prototype.buildItem=function(c){var e=this.elements;if(!(e[c]||this.layers[c].ty===99)){var s=this.createItem(this.layers[c],this,this.globalData);e[c]=s,s.initExpressions()}},CanvasRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var c=this.pendingElements.pop();c.checkParenting()}},CanvasRendererBase.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRendererBase.prototype.show=function(){this.animationItem.container.style.display="block"},extendPrototype([CanvasRendererBase,ICompElement,CVBaseElement],CVCompElement),CVCompElement.prototype.renderInnerContent=function(){var c=this.canvasContext;c.beginPath(),c.moveTo(0,0),c.lineTo(this.data.w,0),c.lineTo(this.data.w,this.data.h),c.lineTo(0,this.data.h),c.lineTo(0,0),c.clip();var e,s=this.layers.length;for(e=s-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()},CVCompElement.prototype.destroy=function(){var c,e=this.layers.length;for(c=e-1;c>=0;c-=1)this.elements[c]&&this.elements[c].destroy();this.layers=null,this.elements=null},CVCompElement.prototype.createComp=function(c){return new CVCompElement(c,this.globalData,this)},extendPrototype([CanvasRendererBase],CanvasRenderer),CanvasRenderer.prototype.createComp=function(c){return new CVCompElement(c,this.globalData,this)},registerRenderer("canvas",CanvasRenderer),ShapeModifiers.registerModifier("tm",TrimModifier),ShapeModifiers.registerModifier("pb",PuckerAndBloatModifier),ShapeModifiers.registerModifier("rp",RepeaterModifier),ShapeModifiers.registerModifier("rd",RoundCornersModifier);const Expressions=function(){var c={};c.initExpressions=e;function e(s){var r=0,f=[];function de(){r+=1}function Xe(){r-=1,r===0&&Ke()}function Je(Qe){f.indexOf(Qe)===-1&&f.push(Qe)}function Ke(){var Qe,_e=f.length;for(Qe=0;Qe<_e;Qe+=1)f[Qe].release();f.length=0}s.renderer.compInterface=CompExpressionInterface(s.renderer),s.renderer.globalData.projectInterface.registerComposition(s.renderer),s.renderer.globalData.pushExpression=de,s.renderer.globalData.popExpression=Xe,s.renderer.globalData.registerExpressionProperty=Je}return c}();var propTypes={SHAPE:"shape"};const ExpressionManager=function(){var ob={},Math=BMMath,window=null,document=null,XMLHttpRequest=null,fetch=null,frames=null;initialize$2(BMMath);function $bm_isInstanceOfArray(c){return c.constructor===Array||c.constructor===Float32Array}function isNumerable(c,e){return c==="number"||c==="boolean"||c==="string"||e instanceof Number}function $bm_neg(c){var e=typeof c;if(e==="number"||e==="boolean"||c instanceof Number)return-c;if($bm_isInstanceOfArray(c)){var s,r=c.length,f=[];for(s=0;s<r;s+=1)f[s]=-c[s];return f}return c.propType?c.v:-c}var easeInBez=BezierFactory.getBezierEasing(.333,0,.833,.833,"easeIn").get,easeOutBez=BezierFactory.getBezierEasing(.167,.167,.667,1,"easeOut").get,easeInOutBez=BezierFactory.getBezierEasing(.33,0,.667,1,"easeInOut").get;function sum(c,e){var s=typeof c,r=typeof e;if(s==="string"||r==="string"||isNumerable(s,c)&&isNumerable(r,e))return c+e;if($bm_isInstanceOfArray(c)&&isNumerable(r,e))return c=c.slice(0),c[0]+=e,c;if(isNumerable(s,c)&&$bm_isInstanceOfArray(e))return e=e.slice(0),e[0]=c+e[0],e;if($bm_isInstanceOfArray(c)&&$bm_isInstanceOfArray(e)){for(var f=0,de=c.length,Xe=e.length,Je=[];f<de||f<Xe;)(typeof c[f]=="number"||c[f]instanceof Number)&&(typeof e[f]=="number"||e[f]instanceof Number)?Je[f]=c[f]+e[f]:Je[f]=e[f]===void 0?c[f]:c[f]||e[f],f+=1;return Je}return 0}var add=sum;function sub(c,e){var s=typeof c,r=typeof e;if(isNumerable(s,c)&&isNumerable(r,e))return s==="string"&&(c=parseInt(c,10)),r==="string"&&(e=parseInt(e,10)),c-e;if($bm_isInstanceOfArray(c)&&isNumerable(r,e))return c=c.slice(0),c[0]-=e,c;if(isNumerable(s,c)&&$bm_isInstanceOfArray(e))return e=e.slice(0),e[0]=c-e[0],e;if($bm_isInstanceOfArray(c)&&$bm_isInstanceOfArray(e)){for(var f=0,de=c.length,Xe=e.length,Je=[];f<de||f<Xe;)(typeof c[f]=="number"||c[f]instanceof Number)&&(typeof e[f]=="number"||e[f]instanceof Number)?Je[f]=c[f]-e[f]:Je[f]=e[f]===void 0?c[f]:c[f]||e[f],f+=1;return Je}return 0}function mul(c,e){var s=typeof c,r=typeof e,f;if(isNumerable(s,c)&&isNumerable(r,e))return c*e;var de,Xe;if($bm_isInstanceOfArray(c)&&isNumerable(r,e)){for(Xe=c.length,f=createTypedArray("float32",Xe),de=0;de<Xe;de+=1)f[de]=c[de]*e;return f}if(isNumerable(s,c)&&$bm_isInstanceOfArray(e)){for(Xe=e.length,f=createTypedArray("float32",Xe),de=0;de<Xe;de+=1)f[de]=c*e[de];return f}return 0}function div(c,e){var s=typeof c,r=typeof e,f;if(isNumerable(s,c)&&isNumerable(r,e))return c/e;var de,Xe;if($bm_isInstanceOfArray(c)&&isNumerable(r,e)){for(Xe=c.length,f=createTypedArray("float32",Xe),de=0;de<Xe;de+=1)f[de]=c[de]/e;return f}if(isNumerable(s,c)&&$bm_isInstanceOfArray(e)){for(Xe=e.length,f=createTypedArray("float32",Xe),de=0;de<Xe;de+=1)f[de]=c/e[de];return f}return 0}function mod(c,e){return typeof c=="string"&&(c=parseInt(c,10)),typeof e=="string"&&(e=parseInt(e,10)),c%e}var $bm_sum=sum,$bm_sub=sub,$bm_mul=mul,$bm_div=div,$bm_mod=mod;function clamp(c,e,s){if(e>s){var r=s;s=e,e=r}return Math.min(Math.max(c,e),s)}function radiansToDegrees(c){return c/degToRads}var radians_to_degrees=radiansToDegrees;function degreesToRadians(c){return c*degToRads}var degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];function length(c,e){if(typeof c=="number"||c instanceof Number)return e=e||0,Math.abs(c-e);e||(e=helperLengthArray);var s,r=Math.min(c.length,e.length),f=0;for(s=0;s<r;s+=1)f+=Math.pow(e[s]-c[s],2);return Math.sqrt(f)}function normalize(c){return div(c,length(c))}function rgbToHsl(c){var e=c[0],s=c[1],r=c[2],f=Math.max(e,s,r),de=Math.min(e,s,r),Xe,Je,Ke=(f+de)/2;if(f===de)Xe=0,Je=0;else{var Qe=f-de;switch(Je=Ke>.5?Qe/(2-f-de):Qe/(f+de),f){case e:Xe=(s-r)/Qe+(s<r?6:0);break;case s:Xe=(r-e)/Qe+2;break;case r:Xe=(e-s)/Qe+4;break}Xe/=6}return[Xe,Je,Ke,c[3]]}function hue2rgb(c,e,s){return s<0&&(s+=1),s>1&&(s-=1),s<1/6?c+(e-c)*6*s:s<1/2?e:s<2/3?c+(e-c)*(2/3-s)*6:c}function hslToRgb(c){var e=c[0],s=c[1],r=c[2],f,de,Xe;if(s===0)f=r,Xe=r,de=r;else{var Je=r<.5?r*(1+s):r+s-r*s,Ke=2*r-Je;f=hue2rgb(Ke,Je,e+1/3),de=hue2rgb(Ke,Je,e),Xe=hue2rgb(Ke,Je,e-1/3)}return[f,de,Xe,c[3]]}function linear(c,e,s,r,f){if((r===void 0||f===void 0)&&(r=e,f=s,e=0,s=1),s<e){var de=s;s=e,e=de}if(c<=e)return r;if(c>=s)return f;var Xe=s===e?0:(c-e)/(s-e);if(!r.length)return r+(f-r)*Xe;var Je,Ke=r.length,Qe=createTypedArray("float32",Ke);for(Je=0;Je<Ke;Je+=1)Qe[Je]=r[Je]+(f[Je]-r[Je])*Xe;return Qe}function random(c,e){if(e===void 0&&(c===void 0?(c=0,e=1):(e=c,c=void 0)),e.length){var s,r=e.length;c||(c=createTypedArray("float32",r));var f=createTypedArray("float32",r),de=BMMath.random();for(s=0;s<r;s+=1)f[s]=c[s]+de*(e[s]-c[s]);return f}c===void 0&&(c=0);var Xe=BMMath.random();return c+Xe*(e-c)}function createPath(c,e,s,r){var f,de=c.length,Xe=shapePool.newElement();Xe.setPathData(!!r,de);var Je=[0,0],Ke,Qe;for(f=0;f<de;f+=1)Ke=e&&e[f]?e[f]:Je,Qe=s&&s[f]?s[f]:Je,Xe.setTripleAt(c[f][0],c[f][1],Qe[0]+c[f][0],Qe[1]+c[f][1],Ke[0]+c[f][0],Ke[1]+c[f][1],f,!0);return Xe}function initiateExpression(elem,data,property){var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=val.indexOf("random")!==-1,elemType=elem.data.ty,transform,$bm_transform,content,effect,thisProperty=property;thisProperty.valueAtTime=thisProperty.getValueAtTime,Object.defineProperty(thisProperty,"value",{get:function(){return thisProperty.v}}),elem.comp.frameDuration=1/elem.comp.globalData.frameRate,elem.comp.displayStartTime=0;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,name=elem.data.nm,loopIn,loop_in,loopOut,loop_out,smooth,toWorld,fromWorld,fromComp,toComp,fromCompToSurface,position,rotation,anchorPoint,scale,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,scoped_bm_rt,expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,active=!this.data||this.data.hd!==!0,wiggle=function c(e,s){var r,f,de=this.pv.length?this.pv.length:1,Xe=createTypedArray("float32",de);e=5;var Je=Math.floor(time*e);for(r=0,f=0;r<Je;){for(f=0;f<de;f+=1)Xe[f]+=-s+s*2*BMMath.random();r+=1}var Ke=time*e,Qe=Ke-Math.floor(Ke),_e=createTypedArray("float32",de);if(de>1){for(f=0;f<de;f+=1)_e[f]=this.pv[f]+Xe[f]+(-s+s*2*BMMath.random())*Qe;return _e}return this.pv+Xe[0]+(-s+s*2*BMMath.random())*Qe}.bind(this);thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut),thisProperty.smooth&&(smooth=thisProperty.smooth.bind(thisProperty));function loopInDuration(c,e){return loopIn(c,e,!0)}function loopOutDuration(c,e){return loopOut(c,e,!0)}this.getValueAtTime&&(valueAtTime=this.getValueAtTime.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface);function lookAt(c,e){var s=[e[0]-c[0],e[1]-c[1],e[2]-c[2]],r=Math.atan2(s[0],Math.sqrt(s[1]*s[1]+s[2]*s[2]))/degToRads,f=-Math.atan2(s[1],s[2])/degToRads;return[f,r,0]}function easeOut(c,e,s,r,f){return applyEase(easeOutBez,c,e,s,r,f)}function easeIn(c,e,s,r,f){return applyEase(easeInBez,c,e,s,r,f)}function ease(c,e,s,r,f){return applyEase(easeInOutBez,c,e,s,r,f)}function applyEase(c,e,s,r,f,de){f===void 0?(f=s,de=r):e=(e-s)/(r-s),e>1?e=1:e<0&&(e=0);var Xe=c(e);if($bm_isInstanceOfArray(f)){var Je,Ke=f.length,Qe=createTypedArray("float32",Ke);for(Je=0;Je<Ke;Je+=1)Qe[Je]=(de[Je]-f[Je])*Xe+f[Je];return Qe}return(de-f)*Xe+f}function nearestKey(c){var e,s=data.k.length,r,f;if(!data.k.length||typeof data.k[0]=="number")r=0,f=0;else if(r=-1,c*=elem.comp.globalData.frameRate,c<data.k[0].t)r=1,f=data.k[0].t;else{for(e=0;e<s-1;e+=1)if(c===data.k[e].t){r=e+1,f=data.k[e].t;break}else if(c>data.k[e].t&&c<data.k[e+1].t){c-data.k[e].t>data.k[e+1].t-c?(r=e+2,f=data.k[e+1].t):(r=e+1,f=data.k[e].t);break}r===-1&&(r=e+1,f=data.k[e].t)}var de={};return de.index=r,de.time=f/elem.comp.globalData.frameRate,de}function key(c){var e,s,r;if(!data.k.length||typeof data.k[0]=="number")throw new Error("The property has no keyframe at index "+c);c-=1,e={time:data.k[c].t/elem.comp.globalData.frameRate,value:[]};var f=Object.prototype.hasOwnProperty.call(data.k[c],"s")?data.k[c].s:data.k[c-1].e;for(r=f.length,s=0;s<r;s+=1)e[s]=f[s],e.value[s]=f[s];return e}function framesToTime(c,e){return e||(e=elem.comp.globalData.frameRate),c/e}function timeToFrames(c,e){return!c&&c!==0&&(c=time),e||(e=elem.comp.globalData.frameRate),c*e}function seedRandom(c){BMMath.seedrandom(randSeed+c)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function substring(c,e){return typeof value=="string"?e===void 0?value.substring(c):value.substring(c,e):""}function substr(c,e){return typeof value=="string"?e===void 0?value.substr(c):value.substr(c,e):""}function posterizeTime(c){time=c===0?0:Math.floor(time*c)/c,value=valueAtTime(time)}var time,velocity,value,text,textIndex,textTotal,selectorValue,index=elem.data.ind,hasParent=!!(elem.hierarchy&&elem.hierarchy.length),parent,randSeed=Math.floor(Math.random()*1e6),globalData=elem.globalData;function executeExpression(c){return value=c,this.frameExpressionId===elem.globalData.frameId&&this.propType!=="textSelector"?value:(this.propType==="textSelector"&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(text=elem.layerInterface.text,thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),toComp=thisLayer.toComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),$bm_transform=transform,transform&&(anchorPoint=transform.anchorPoint)),elemType===4&&!content&&(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!!(elem.hierarchy&&elem.hierarchy.length),hasParent&&!parent&&(parent=elem.hierarchy[0].layerInterface),time=this.comp.renderedFrame/this.comp.globalData.frameRate,_needsRandom&&seedRandom(randSeed+time),needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),this.frameExpressionId=elem.globalData.frameId,scoped_bm_rt=scoped_bm_rt.propType===propTypes.SHAPE?scoped_bm_rt.v:scoped_bm_rt,scoped_bm_rt)}return executeExpression.__preventDeadCodeRemoval=[$bm_transform,anchorPoint,time,velocity,inPoint,outPoint,width,height,name,loop_in,loop_out,smooth,toComp,fromCompToSurface,toWorld,fromWorld,mask,position,rotation,scale,thisComp,numKeys,active,wiggle,loopInDuration,loopOutDuration,comp,lookAt,easeOut,easeIn,ease,nearestKey,key,text,textIndex,textTotal,selectorValue,framesToTime,timeToFrames,sourceRectAtTime,substring,substr,posterizeTime,index,globalData],executeExpression}return ob.initiateExpression=initiateExpression,ob.__preventDeadCodeRemoval=[window,document,XMLHttpRequest,fetch,frames,$bm_neg,add,$bm_sum,$bm_sub,$bm_mul,$bm_div,$bm_mod,clamp,radians_to_degrees,degreesToRadians,degrees_to_radians,normalize,rgbToHsl,hslToRgb,linear,random,createPath],ob}(),expressionHelpers=function(){function c(Xe,Je,Ke){Je.x&&(Ke.k=!0,Ke.x=!0,Ke.initiateExpression=ExpressionManager.initiateExpression,Ke.effectsSequence.push(Ke.initiateExpression(Xe,Je,Ke).bind(Ke)))}function e(Xe){return Xe*=this.elem.globalData.frameRate,Xe-=this.offsetTime,Xe!==this._cachingAtTime.lastFrame&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<Xe?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(Xe,this._cachingAtTime),this._cachingAtTime.lastFrame=Xe),this._cachingAtTime.value}function s(Xe){var Je=-.01,Ke=this.getValueAtTime(Xe),Qe=this.getValueAtTime(Xe+Je),_e=0;if(Ke.length){var $e;for($e=0;$e<Ke.length;$e+=1)_e+=Math.pow(Qe[$e]-Ke[$e],2);_e=Math.sqrt(_e)*100}else _e=0;return _e}function r(Xe){if(this.vel!==void 0)return this.vel;var Je=-.001,Ke=this.getValueAtTime(Xe),Qe=this.getValueAtTime(Xe+Je),_e;if(Ke.length){_e=createTypedArray("float32",Ke.length);var $e;for($e=0;$e<Ke.length;$e+=1)_e[$e]=(Qe[$e]-Ke[$e])/Je}else _e=(Qe-Ke)/Je;return _e}function f(){return this.pv}function de(Xe){this.propertyGroup=Xe}return{searchExpressions:c,getSpeedAtTime:s,getVelocityAtTime:r,getValueAtTime:e,getStaticValueAtTime:f,setGroupProperty:de}}();setExpressionsPlugin(Expressions),initialize$1(),initialize()}class LottieLoader extends Loader{setQuality(e){this._quality=e}load(e,s,r,f){const de=this._quality||1,Xe=new CanvasTexture;Xe.minFilter=NearestFilter,Xe.generateMipmaps=!1,Xe.colorSpace=SRGBColorSpace;const Je=new FileLoader(this.manager);return Je.setPath(this.path),Je.setWithCredentials(this.withCredentials),Je.load(e,function(Ke){const Qe=JSON.parse(Ke),_e=document.createElement("div");_e.style.width=Qe.w+"px",_e.style.height=Qe.h+"px",document.body.appendChild(_e);const $e=lottie.loadAnimation({container:_e,animType:"canvas",loop:!0,autoplay:!0,animationData:Qe,rendererSettings:{dpr:de}});Xe.animation=$e,Xe.image=$e.container,$e.addEventListener("enterFrame",function(){Xe.needsUpdate=!0}),_e.style.display="none",s!==void 0&&s(Xe)},r,f),Xe}}var M=Object.defineProperty,Q=Object.defineProperties,B=Object.getOwnPropertyDescriptors,S=Object.getOwnPropertySymbols,N=Object.prototype.hasOwnProperty,K=Object.prototype.propertyIsEnumerable,I=(c,e,s)=>e in c?M(c,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):c[e]=s,L=(c,e)=>{for(var s in e||(e={}))N.call(e,s)&&I(c,s,e[s]);if(S)for(var s of S(e))K.call(e,s)&&I(c,s,e[s]);return c},x=(c,e)=>Q(c,B(e)),F=(c,e)=>{var s={};for(var r in c)N.call(c,r)&&e.indexOf(r)<0&&(s[r]=c[r]);if(c!=null&&S)for(var r of S(c))e.indexOf(r)<0&&K.call(c,r)&&(s[r]=c[r]);return s},a=(c,e,s)=>new Promise((r,f)=>{var de=Ke=>{try{Je(s.next(Ke))}catch(Qe){f(Qe)}},Xe=Ke=>{try{Je(s.throw(Ke))}catch(Qe){f(Qe)}},Je=Ke=>Ke.done?r(Ke.value):Promise.resolve(Ke.value).then(de,Xe);Je((s=s.apply(c,e)).next())});function i(c){let e=!1;return function(...s){e||(e=!0,requestAnimationFrame(()=>{e=!1,c(...s)}))}}class Rl{constructor(e){this.pluginName="draw",this.objMap=new Map,this.targetNullMap=new Map,this.objects=new Map,this.groupMap=new Map,this.prefabGroupMap=new Map,this.objectNamesToFactories=new Map,this.pickFunctionsMapIndex=-1,this.pickFunctionsMap={},this.pickListener={move:!1,down:!1},this.pickNodeFunctionsMapIndex=-1,this.pickNodeFunctionsMap={},this.objects_=e}get group(){return this.groupMap.get(this.scene)}get prefabGroup(){return this.prefabGroupMap.get(this.scene)}get objectsPromise(){const e=[];return this.objects.forEach(s=>{e.push(s.pm.promise)}),e}install(e){this.pencil=e,this.scene=e.scene,e.sceneController.event.on("sceneChange",s=>{this.scene=s}),this.initObjectFactories()}initObjectFactories(){const{objects_:e}=this;Object.keys(e).forEach(s=>{const r=class{create(f={}){return new e[s](f)}};this.objectNamesToFactories.set(s,r)}),this.objectNamesToFactories.set("@Group",class{create(){return new t}})}getObject(e,s){e.includes("#")&&console.warn("getObject:err:不支持 #",e);const{key:r}=s||{},f=`${e}${r?`#${r}`:""}`;return this.objects.get(f)}getAllObject(e,s){e.includes("#")&&console.warn("getAllObject:err:不支持 #",e);const{key:r}=s||{},f=`${e}${r?`#${r}`:""}`,de=[];return this.objects.forEach((Xe,Je)=>{(Je.startsWith(r?f:`${f}#`)||Je===f)&&de.push(Xe)}),de}instantiate(e){return a(this,arguments,function*(s,{create:r}={}){const{objectType:f,objectOptions:de}=s,[,Xe]=f.split("#"),Je=yield this.draw(Xe,x(L({},de||{}),{create:r,prefab:!1}));return Je.isInstantiate=!0,Je})}initGroup(){return a(this,null,function*(){if(!this.group){const e=yield this.draw("@Group",{target:this.scene});this.groupMap.set(this.scene,e)}if(!this.prefabGroup){const e=yield this.draw("@Group",{key:"Prefab",target:this.scene});this.prefabGroupMap.set(this.scene,e)}})}draw(e,s,r){return a(this,null,function*(){var f,de,Xe,Je;const Ke=this.objectNamesToFactories.get(e);if(Ke){s||(s={}),s.target===void 0&&(s.target=r);const{key:Qe}=s;let _e=`${e}${Qe?`#${Qe}`:""}`;this.objects.has(_e)&&(_e.includes("#")?_e+=`-${esusLite.generateUUID()}`:_e+=`#${esusLite.generateUUID()}`);const $e=s.target,qe=(f=s.onTop)!=null?f:0,st=(de=s.prefab)!=null?de:!1,dt=(Xe=s.create)!=null?Xe:!0,Wt=new Ke().create(s);let Yt;return $e===null?Yt=null:typeof $e=="string"?Yt=this.objects.get($e):(Je=$e==null?void 0:$e.objectType)!=null&&Je.startsWith("BaseObject")||$e?Yt=$e:st&&this.prefabGroup?Yt=this.prefabGroup:!st&&this.group?Yt=this.group:Yt=this.scene,dt===!1?Wt.create=()=>{}:dt!==!0&&(Wt.create=()=>{dt(Wt)}),Wt.pencil=this.pencil,Wt.drawController=this,Wt.key=_e,Wt.prefab=st,Wt.objectType=`BaseObject#${e}`,Wt.objectOptions=s,this.objects.set(_e,Wt),yield this.addBaseObject(Wt,Yt,qe),Wt}throw new Error(`Unrecognized:${e}`)})}addBaseObject(e,s,r){return a(this,null,function*(){yield e.create(),e.object3d&&(r&&e.setTop(r),s!==null?(s.add(e.object3d),this.objMap.set(e.object3d,e)):this.targetNullMap.set(e.object3d,e)),e.render(),e.pm.resolve()})}erase(...e){[...e].forEach(s=>{const r=[];if(typeof s=="string"){const[f,de]=s.split("#");r.push(...this.getAllObject(f,{key:de}))}else r.push(s);r.forEach(f=>{const de=f.object3d&&this.targetNullMap.get(f.object3d);this.removeBaseObject(f),de&&this.removeBaseObject(de)})})}eraseWithoutMaterial(...e){[...e].forEach(s=>{const r=[];if(typeof s=="string"){const[f,de]=s.split("#");r.push(...this.getAllObject(f,{key:de}))}else r.push(s);r.forEach(f=>{const de=f.object3d&&this.targetNullMap.get(f.object3d);this.removeBaseObject(f,!1),de&&this.removeBaseObject(de,!1)})})}removeBaseObject(e,s=!0){const{parent:r}=e;e.object3d&&(r&&r.remove(e.object3d),e.object3d.traverse(f=>{var de;const Xe=this.objMap.get(f);Xe?(Xe!==e&&Xe.objectType==="BaseObject#Node"&&((de=Xe.object3d.parent)==null||de.remove(Xe.object3d)),s?Xe.dispose():Xe.disposeWithOutMaterial(),this.objects.delete(Xe.key),Xe.object3d&&(this.objMap.delete(Xe.object3d),this.targetNullMap.delete(Xe.object3d))):v$1(f,s)}))}update(e,s){this.objects.forEach(r=>{r.update(e,s)})}setSize(e,s){this.objects.forEach(r=>{r.resize(e,s)})}show(){var e;(e=this.group)==null||e.show()}hide(){var e;(e=this.group)==null||e.hide()}showPrefab(e){var s;this.hide(),(s=this.prefabGroup)==null||s.show(),e&&this.objects.forEach(r=>{r.prefab&&(r.key===e?r.show():r.hide())})}hidePrefab(){var e;this.show(),(e=this.prefabGroup)==null||e.hide()}eraseAll(){this.group&&(this.objects.forEach(e=>{e.key.startsWith("Node")&&this.erase(e)}),this.erase(this.group))}addPickListener(e){var s;let r;const f=Xe=>{Xe.preventDefault();const Je=Object.values(this.pickFunctionsMap).map(st=>x(L({},st),{objArr:st.objArr instanceof Function?st.objArr():st.objArr})).filter(st=>{if(e==="move")return st.type==="move"||st.type==="enter"||st.type==="leave";if(e==="down")return st.type==="down"||st.type==="downOutside"||st.type==="click"}).reduce((st,dt)=>st.concat(dt.objArr.map(Wt=>({obj:Wt,type:dt.type,cb:dt.cb})).filter(({obj:Wt})=>Wt.object3d&&Wt.visible)),[]).reduce((st,dt)=>{const Wt=st.find(Yt=>Yt.obj===dt.obj&&Yt.type===dt.type);return Wt?Wt.cb.push(dt.cb):st.push({obj:dt.obj,type:dt.type,cb:[dt.cb]}),st},[]).sort((st,dt)=>st.obj.object3d.getObjectById(dt.obj.object3d.id)?1:dt.obj.object3d.getObjectById(st.obj.object3d.id)?-1:0);if(Je.length===0)return;const Ke=Je.map(({obj:st})=>st.object3d),Qe=this.pencil.pick(Xe,Ke,!1),_e=Qe==null?void 0:Qe.object,$e=Je.filter(st=>st.type==="leave"),qe=Je.filter(st=>st.type==="downOutside");_e?Je.filter(({obj:st})=>st.object3d===_e).forEach(st=>{if(e==="move")$e.forEach(dt=>{(st==null?void 0:st.obj)!==dt.obj&&r===dt.obj&&dt.cb.forEach(Wt=>{Wt(dt.obj,Xe)})}),(st==null?void 0:st.type)==="enter"?r!==st.obj&&st.cb.forEach(dt=>{dt(st.obj,Xe)}):(st==null?void 0:st.type)==="move"&&st.cb.forEach(dt=>{dt(st.obj,Xe)}),r=st==null?void 0:st.obj;else if(qe.forEach(dt=>{(st==null?void 0:st.obj)!==dt.obj&&dt.cb.forEach(Wt=>{Wt(dt.obj,Xe)})}),st)if(st.type==="click"){const dt=Wt=>{Wt.preventDefault();const Yt=5;Math.abs(Wt.clientX-Xe.clientX)<=Yt&&Math.abs(Wt.clientY-Xe.clientY)<=Yt&&st.cb.forEach(rt=>{rt(st.obj,Xe)}),de.removeEventListener("pointerup",dt,!1)};de.addEventListener("pointerup",dt,!1)}else st.cb.forEach(dt=>{dt(st.obj,Xe)})}):e==="move"?($e.forEach(st=>{r===st.obj&&st.cb.forEach(dt=>{dt(st.obj,Xe)})}),r=void 0):qe.forEach(st=>{st.cb.forEach(dt=>{dt(st.obj,Xe)})})},de=((s=this.pencil.options.controlsParams)==null?void 0:s.domElement)||this.pencil.options.container;de.addEventListener(`pointer${e}`,i(f),!1)}handlePick(e,s,r){let f=s;f==="mousemove"?f="move":f==="mouseenter"?f="enter":f==="mouseleave"&&(f="leave"),this.pickFunctionsMapIndex+=1;const de=this.pickFunctionsMapIndex;return this.pickFunctionsMap[de]={objArr:e,type:f,cb:r},this.pickListener.move||Object.values(this.pickFunctionsMap).some(Xe=>Xe.type==="move"||Xe.type==="enter"||Xe.type==="leave")&&(this.pickListener.move=!0,this.addPickListener("move")),this.pickListener.down||Object.values(this.pickFunctionsMap).some(Xe=>Xe.type==="down"||Xe.type==="downOutside"||Xe.type==="click")&&(this.pickListener.down=!0,this.addPickListener("down")),de}removePick(e){delete this.pickFunctionsMap[e]}handlePickNode(e,s,r){if(s==="downOutside")return console.warn("handlePickNode:err:不支持 downOutside"),-1;this.pickNodeFunctionsMapIndex+=1;const f=this.pickNodeFunctionsMapIndex;return(e instanceof Function?e():e).forEach(de=>{const Xe=de;Xe.element.style.pointerEvents="auto";const Je=Ke=>{Ke.preventDefault(),r(Xe,Ke)};Xe.element.addEventListener(`pointer${s}`,i(Je),!1),this.pickNodeFunctionsMap[f]||(this.pickNodeFunctionsMap[f]=[]),this.pickNodeFunctionsMap[f].push({arr:Xe,type:`pointer${s}`,listener:Je})}),f}removePickNode(e){const s=this.pickNodeFunctionsMap[e];s&&(s.forEach(r=>{r.arr.element.style.pointerEvents="none",r.arr.element.removeEventListener(r.type,r.listener,!1)}),delete this.pickNodeFunctionsMap[e])}dispose(){this.objects.forEach((e,s)=>{e.dispose(),e.pm.reject(`stop draw:${s}`)}),this.objects.clear(),this.objMap.clear(),this.targetNullMap.clear(),this.objectNamesToFactories.clear(),this.pickFunctionsMap={},this.pickNodeFunctionsMap={},this.groupMap.clear(),this.prefabGroupMap.clear()}}const T="dmFyIEprPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqaz1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgS2s9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIEtmPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIHh3PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksdnc9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgVDA9KG5lLG9lKT0+KG9lPVN5bWJvbFtuZV0pP29lOlN5bWJvbC5mb3IoIlN5bWJvbC4iK25lKSxRaz1uZT0+e3Rocm93IFR5cGVFcnJvcihuZSl9LFdzPU1hdGgucG93LF93PShuZSxvZSxTZSk9Pm9lIGluIG5lP0prKG5lLG9lLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpTZX0pOm5lW29lXT1TZSxvbj0obmUsb2UpPT57Zm9yKHZhciBTZSBpbiBvZXx8KG9lPXt9KSl4dy5jYWxsKG9lLFNlKSYmX3cobmUsU2Usb2VbU2VdKTtpZihLZilmb3IodmFyIFNlIG9mIEtmKG9lKSl2dy5jYWxsKG9lLFNlKSYmX3cobmUsU2Usb2VbU2VdKTtyZXR1cm4gbmV9LEZpPShuZSxvZSk9PmprKG5lLEtrKG9lKSk7dmFyIFN3PShuZSxvZSk9Pnt2YXIgU2U9e307Zm9yKHZhciBCZSBpbiBuZSl4dy5jYWxsKG5lLEJlKSYmb2UuaW5kZXhPZihCZSk8MCYmKFNlW0JlXT1uZVtCZV0pO2lmKG5lIT1udWxsJiZLZilmb3IodmFyIEJlIG9mIEtmKG5lKSlvZS5pbmRleE9mKEJlKTwwJiZ2dy5jYWxsKG5lLEJlKSYmKFNlW0JlXT1uZVtCZV0pO3JldHVybiBTZX07dmFyICRzPShuZSxvZSxTZSk9Pm5ldyBQcm9taXNlKChCZSxMbik9Pnt2YXIgRG49eG49Pnt0cnl7SHIoU2UubmV4dCh4bikpfWNhdGNoKFhzKXtMbihYcyl9fSxCaT14bj0+e3RyeXtIcihTZS50aHJvdyh4bikpfWNhdGNoKFhzKXtMbihYcyl9fSxIcj14bj0+eG4uZG9uZT9CZSh4bi52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKHhuLnZhbHVlKS50aGVuKERuLEJpKTtIcigoU2U9U2UuYXBwbHkobmUsb2UpKS5uZXh0KCkpfSksdDQ9ZnVuY3Rpb24obmUsb2Upe3RoaXNbMF09bmUsdGhpc1sxXT1vZX07dmFyIE13PW5lPT57dmFyIG9lPW5lW1QwKCJhc3luY0l0ZXJhdG9yIildLFNlPSExLEJlLExuPXt9O3JldHVybiBvZT09bnVsbD8ob2U9bmVbVDAoIml0ZXJhdG9yIildKCksQmU9RG49PkxuW0RuXT1CaT0+b2VbRG5dKEJpKSk6KG9lPW9lLmNhbGwobmUpLEJlPURuPT5MbltEbl09Qmk9PntpZihTZSl7aWYoU2U9ITEsRG49PT0idGhyb3ciKXRocm93IEJpO3JldHVybiBCaX1yZXR1cm4gU2U9ITAse2RvbmU6ITEsdmFsdWU6bmV3IHQ0KG5ldyBQcm9taXNlKEhyPT57dmFyIHhuPW9lW0RuXShCaSk7eG4gaW5zdGFuY2VvZiBPYmplY3R8fFFrKCJPYmplY3QgZXhwZWN0ZWQiKSxIcih4bil9KSwxKX19KSxMbltUMCgiaXRlcmF0b3IiKV09KCk9PkxuLEJlKCJuZXh0IiksInRocm93ImluIG9lP0JlKCJ0aHJvdyIpOkxuLnRocm93PURuPT57dGhyb3cgRG59LCJyZXR1cm4iaW4gb2UmJkJlKCJyZXR1cm4iKSxMbn07KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxMC0yMDI0IFRocmVlLmpzIEF1dGhvcnMKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogKi9jb25zdCBuZT0iMTcxIixvZT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn0sU2U9e1JPVEFURTowLFBBTjoxLERPTExZX1BBTjoyLERPTExZX1JPVEFURTozfSxCZT0wLExuPTEsRG49MixCaT0zLEhyPTAseG49MSxYcz0yLGJpPTMsc2k9MCxKZT0xLFVuPTIsT2k9MCxXcj0xLFFmPTIsdGQ9MyxlZD00LEMwPTUscHI9MTAwLFIwPTEwMSxQMD0xMDIsSTA9MTAzLEwwPTEwNCxEMD0yMDAsVTA9MjAxLE4wPTIwMixGMD0yMDMsSGw9MjA0LFdsPTIwNSxCMD0yMDYsTzA9MjA3LHowPTIwOCxrMD0yMDksVjA9MjEwLEcwPTIxMSxIMD0yMTIsVzA9MjEzLCQwPTIxNCwkbD0wLFhsPTEscWw9Miwkcj0zLFlsPTQsWmw9NSxKbD02LGpsPTcsYWE9MCxYMD0xLHEwPTIsemk9MCxZMD0xLFowPTIsSjA9MyxqMD00LEswPTUsUTA9Nix0eT03LG5kPSJhdHRhY2hlZCIsZXk9ImRldGFjaGVkIixLbD0zMDAsa2k9MzAxLG1yPTMwMixsYT0zMDMsY2E9MzA0LHFzPTMwNix1YT0xZTMscW49MTAwMSxoYT0xMDAyLFhlPTEwMDMsaWQ9MTAwNCx3dz0xMDA0LFlzPTEwMDUsQXc9MTAwNSxWZT0xMDA2LGZhPTEwMDcsRXc9MTAwNyx3aT0xMDA4LFR3PTEwMDgsQWk9MTAwOSxyZD0xMDEwLHNkPTEwMTEsWnM9MTAxMixRbD0xMDEzLFZpPTEwMTQsdm49MTAxNSxKcz0xMDE2LHRjPTEwMTcsZWM9MTAxOCxYcj0xMDIwLG9kPTM1OTAyLGFkPTEwMjEsbGQ9MTAyMixhbj0xMDIzLGNkPTEwMjQsdWQ9MTAyNSxxcj0xMDI2LFlyPTEwMjcsbmM9MTAyOCxkYT0xMDI5LGhkPTEwMzAsaWM9MTAzMSxDdz0xMDMyLHJjPTEwMzMscGE9MzM3NzYsbWE9MzM3NzcsZ2E9MzM3NzgseWE9MzM3Nzksc2M9MzU4NDAsb2M9MzU4NDEsYWM9MzU4NDIsbGM9MzU4NDMsY2M9MzYxOTYsdWM9Mzc0OTIsaGM9Mzc0OTYsZmM9Mzc4MDgsZGM9Mzc4MDkscGM9Mzc4MTAsbWM9Mzc4MTEsZ2M9Mzc4MTIseWM9Mzc4MTMsX2M9Mzc4MTQseGM9Mzc4MTUsdmM9Mzc4MTYsU2M9Mzc4MTcsTWM9Mzc4MTgsYmM9Mzc4MTksd2M9Mzc4MjAsQWM9Mzc4MjEsX2E9MzY0OTIsRWM9MzY0OTQsVGM9MzY0OTUsZmQ9MzYyODMsQ2M9MzYyODQsUmM9MzYyODUsUGM9MzYyODYsbnk9MjIwMCxpeT0yMjAxLHJ5PTIyMDIseGE9MjMwMCxJYz0yMzAxLExjPTIzMDIsWnI9MjQwMCxKcj0yNDAxLHZhPTI0MDIsRGM9MjUwMCxkZD0yNTAxLFJ3PTAsUHc9MSxJdz0yLHN5PTMyMDAsb3k9MzIwMSxMdz0zMjAyLER3PTMyMDMsZ3I9MCxheT0xLEdpPSIiLFNuPSJzcmdiIixqcj0ic3JnYi1saW5lYXIiLFNhPSJsaW5lYXIiLHBlPSJzcmdiIixVdz0wLEtyPTc2ODAsTnc9NzY4MSxGdz03NjgyLEJ3PTc2ODMsT3c9MzQwNTUsenc9MzQwNTYsa3c9NTM4NixWdz01MTIsR3c9NTEzLEh3PTUxNCxXdz01MTUsJHc9NTE2LFh3PTUxNyxxdz01MTgscGQ9NTE5LGx5PTUxMixjeT01MTMsdXk9NTE0LG1kPTUxNSxoeT01MTYsZnk9NTE3LGR5PTUxOCxweT01MTksTWE9MzUwNDQsWXc9MzUwNDgsWnc9MzUwNDAsSnc9MzUwNDUsanc9MzUwNDksS3c9MzUwNDEsUXc9MzUwNDYsdEE9MzUwNTAsZUE9MzUwNDIsbkE9IjEwMCIsZ2Q9IjMwMCBlcyIsRWk9MmUzLGJhPTIwMDE7Y2xhc3MgVGl7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3RoaXMuX2xpc3RlbmVycz09PXZvaWQgMCYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7blt0XT09PXZvaWQgMCYmKG5bdF09W10pLG5bdF0uaW5kZXhPZihlKT09PS0xJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2lmKHRoaXMuX2xpc3RlbmVycz09PXZvaWQgMClyZXR1cm4hMTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztyZXR1cm4gblt0XSE9PXZvaWQgMCYmblt0XS5pbmRleE9mKGUpIT09LTF9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpe2lmKHRoaXMuX2xpc3RlbmVycz09PXZvaWQgMClyZXR1cm47Y29uc3Qgcj10aGlzLl9saXN0ZW5lcnNbdF07aWYociE9PXZvaWQgMCl7Y29uc3Qgcz1yLmluZGV4T2YoZSk7cyE9PS0xJiZyLnNwbGljZShzLDEpfX1kaXNwYXRjaEV2ZW50KHQpe2lmKHRoaXMuX2xpc3RlbmVycz09PXZvaWQgMClyZXR1cm47Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnNbdC50eXBlXTtpZihuIT09dm9pZCAwKXt0LnRhcmdldD10aGlzO2NvbnN0IHI9bi5zbGljZSgwKTtmb3IobGV0IHM9MCxvPXIubGVuZ3RoO3M8bztzKyspcltzXS5jYWxsKHRoaXMsdCk7dC50YXJnZXQ9bnVsbH19fWNvbnN0IGplPVsiMDAiLCIwMSIsIjAyIiwiMDMiLCIwNCIsIjA1IiwiMDYiLCIwNyIsIjA4IiwiMDkiLCIwYSIsIjBiIiwiMGMiLCIwZCIsIjBlIiwiMGYiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjFhIiwiMWIiLCIxYyIsIjFkIiwiMWUiLCIxZiIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjQiLCIyNSIsIjI2IiwiMjciLCIyOCIsIjI5IiwiMmEiLCIyYiIsIjJjIiwiMmQiLCIyZSIsIjJmIiwiMzAiLCIzMSIsIjMyIiwiMzMiLCIzNCIsIjM1IiwiMzYiLCIzNyIsIjM4IiwiMzkiLCIzYSIsIjNiIiwiM2MiLCIzZCIsIjNlIiwiM2YiLCI0MCIsIjQxIiwiNDIiLCI0MyIsIjQ0IiwiNDUiLCI0NiIsIjQ3IiwiNDgiLCI0OSIsIjRhIiwiNGIiLCI0YyIsIjRkIiwiNGUiLCI0ZiIsIjUwIiwiNTEiLCI1MiIsIjUzIiwiNTQiLCI1NSIsIjU2IiwiNTciLCI1OCIsIjU5IiwiNWEiLCI1YiIsIjVjIiwiNWQiLCI1ZSIsIjVmIiwiNjAiLCI2MSIsIjYyIiwiNjMiLCI2NCIsIjY1IiwiNjYiLCI2NyIsIjY4IiwiNjkiLCI2YSIsIjZiIiwiNmMiLCI2ZCIsIjZlIiwiNmYiLCI3MCIsIjcxIiwiNzIiLCI3MyIsIjc0IiwiNzUiLCI3NiIsIjc3IiwiNzgiLCI3OSIsIjdhIiwiN2IiLCI3YyIsIjdkIiwiN2UiLCI3ZiIsIjgwIiwiODEiLCI4MiIsIjgzIiwiODQiLCI4NSIsIjg2IiwiODciLCI4OCIsIjg5IiwiOGEiLCI4YiIsIjhjIiwiOGQiLCI4ZSIsIjhmIiwiOTAiLCI5MSIsIjkyIiwiOTMiLCI5NCIsIjk1IiwiOTYiLCI5NyIsIjk4IiwiOTkiLCI5YSIsIjliIiwiOWMiLCI5ZCIsIjllIiwiOWYiLCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsImFhIiwiYWIiLCJhYyIsImFkIiwiYWUiLCJhZiIsImIwIiwiYjEiLCJiMiIsImIzIiwiYjQiLCJiNSIsImI2IiwiYjciLCJiOCIsImI5IiwiYmEiLCJiYiIsImJjIiwiYmQiLCJiZSIsImJmIiwiYzAiLCJjMSIsImMyIiwiYzMiLCJjNCIsImM1IiwiYzYiLCJjNyIsImM4IiwiYzkiLCJjYSIsImNiIiwiY2MiLCJjZCIsImNlIiwiY2YiLCJkMCIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZDUiLCJkNiIsImQ3IiwiZDgiLCJkOSIsImRhIiwiZGIiLCJkYyIsImRkIiwiZGUiLCJkZiIsImUwIiwiZTEiLCJlMiIsImUzIiwiZTQiLCJlNSIsImU2IiwiZTciLCJlOCIsImU5IiwiZWEiLCJlYiIsImVjIiwiZWQiLCJlZSIsImVmIiwiZjAiLCJmMSIsImYyIiwiZjMiLCJmNCIsImY1IiwiZjYiLCJmNyIsImY4IiwiZjkiLCJmYSIsImZiIiwiZmMiLCJmZCIsImZlIiwiZmYiXTtsZXQgbXk9MTIzNDU2Nztjb25zdCBRcj1NYXRoLlBJLzE4MCxqcz0xODAvTWF0aC5QSTtmdW5jdGlvbiBObigpe2NvbnN0IGk9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsdD1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCxlPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLG49TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDA7cmV0dXJuKGplW2kmMjU1XStqZVtpPj44JjI1NV0ramVbaT4+MTYmMjU1XStqZVtpPj4yNCYyNTVdKyItIitqZVt0JjI1NV0ramVbdD4+OCYyNTVdKyItIitqZVt0Pj4xNiYxNXw2NF0ramVbdD4+MjQmMjU1XSsiLSIramVbZSY2M3wxMjhdK2plW2U+PjgmMjU1XSsiLSIramVbZT4+MTYmMjU1XStqZVtlPj4yNCYyNTVdK2plW24mMjU1XStqZVtuPj44JjI1NV0ramVbbj4+MTYmMjU1XStqZVtuPj4yNCYyNTVdKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIEh0KGksdCxlKXtyZXR1cm4gTWF0aC5tYXgodCxNYXRoLm1pbihlLGkpKX1mdW5jdGlvbiB5ZChpLHQpe3JldHVybihpJXQrdCkldH1mdW5jdGlvbiBpQShpLHQsZSxuLHIpe3JldHVybiBuKyhpLXQpKihyLW4pLyhlLXQpfWZ1bmN0aW9uIHJBKGksdCxlKXtyZXR1cm4gaSE9PXQ/KGUtaSkvKHQtaSk6MH1mdW5jdGlvbiB3YShpLHQsZSl7cmV0dXJuKDEtZSkqaStlKnR9ZnVuY3Rpb24gc0EoaSx0LGUsbil7cmV0dXJuIHdhKGksdCwxLU1hdGguZXhwKC1lKm4pKX1mdW5jdGlvbiBvQShpLHQ9MSl7cmV0dXJuIHQtTWF0aC5hYnMoeWQoaSx0KjIpLXQpfWZ1bmN0aW9uIGFBKGksdCxlKXtyZXR1cm4gaTw9dD8wOmk+PWU/MTooaT0oaS10KS8oZS10KSxpKmkqKDMtMippKSl9ZnVuY3Rpb24gbEEoaSx0LGUpe3JldHVybiBpPD10PzA6aT49ZT8xOihpPShpLXQpLyhlLXQpLGkqaSppKihpKihpKjYtMTUpKzEwKSl9ZnVuY3Rpb24gY0EoaSx0KXtyZXR1cm4gaStNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHQtaSsxKSl9ZnVuY3Rpb24gdUEoaSx0KXtyZXR1cm4gaStNYXRoLnJhbmRvbSgpKih0LWkpfWZ1bmN0aW9uIGhBKGkpe3JldHVybiBpKiguNS1NYXRoLnJhbmRvbSgpKX1mdW5jdGlvbiBmQShpKXtpIT09dm9pZCAwJiYobXk9aSk7bGV0IHQ9bXkrPTE4MzE1NjU4MTM7cmV0dXJuIHQ9TWF0aC5pbXVsKHRedD4+PjE1LHR8MSksdF49dCtNYXRoLmltdWwodF50Pj4+Nyx0fDYxKSwoKHRedD4+PjE0KT4+PjApLzQyOTQ5NjcyOTZ9ZnVuY3Rpb24gZEEoaSl7cmV0dXJuIGkqUXJ9ZnVuY3Rpb24gcEEoaSl7cmV0dXJuIGkqanN9ZnVuY3Rpb24gbUEoaSl7cmV0dXJuKGkmaS0xKT09PTAmJmkhPT0wfWZ1bmN0aW9uIGdBKGkpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhpKS9NYXRoLkxOMikpfWZ1bmN0aW9uIHlBKGkpe3JldHVybiBNYXRoLnBvdygyLE1hdGguZmxvb3IoTWF0aC5sb2coaSkvTWF0aC5MTjIpKX1mdW5jdGlvbiBfQShpLHQsZSxuLHIpe2NvbnN0IHM9TWF0aC5jb3Msbz1NYXRoLnNpbixhPXMoZS8yKSxsPW8oZS8yKSxjPXMoKHQrbikvMiksdT1vKCh0K24pLzIpLGg9cygodC1uKS8yKSxmPW8oKHQtbikvMiksZD1zKChuLXQpLzIpLHA9bygobi10KS8yKTtzd2l0Y2gocil7Y2FzZSJYWVgiOmkuc2V0KGEqdSxsKmgsbCpmLGEqYyk7YnJlYWs7Y2FzZSJZWlkiOmkuc2V0KGwqZixhKnUsbCpoLGEqYyk7YnJlYWs7Y2FzZSJaWFoiOmkuc2V0KGwqaCxsKmYsYSp1LGEqYyk7YnJlYWs7Y2FzZSJYWlgiOmkuc2V0KGEqdSxsKnAsbCpkLGEqYyk7YnJlYWs7Y2FzZSJZWFkiOmkuc2V0KGwqZCxhKnUsbCpwLGEqYyk7YnJlYWs7Y2FzZSJaWVoiOmkuc2V0KGwqcCxsKmQsYSp1LGEqYyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLk1hdGhVdGlsczogLnNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK3IpfX1mdW5jdGlvbiBsbihpLHQpe3N3aXRjaCh0LmNvbnN0cnVjdG9yKXtjYXNlIEZsb2F0MzJBcnJheTpyZXR1cm4gaTtjYXNlIFVpbnQzMkFycmF5OnJldHVybiBpLzQyOTQ5NjcyOTU7Y2FzZSBVaW50MTZBcnJheTpyZXR1cm4gaS82NTUzNTtjYXNlIFVpbnQ4QXJyYXk6cmV0dXJuIGkvMjU1O2Nhc2UgSW50MzJBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8yMTQ3NDgzNjQ3LC0xKTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMzI3NjcsLTEpO2Nhc2UgSW50OEFycmF5OnJldHVybiBNYXRoLm1heChpLzEyNywtMSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIil9fWZ1bmN0aW9uIFp0KGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo0Mjk0OTY3Mjk1KTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqNjU1MzUpO2Nhc2UgVWludDhBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjI1NSk7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjE0NzQ4MzY0Nyk7Y2FzZSBJbnQxNkFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMzI3NjcpO2Nhc2UgSW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMTI3KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19Y29uc3QgeEE9e0RFRzJSQUQ6UXIsUkFEMkRFRzpqcyxnZW5lcmF0ZVVVSUQ6Tm4sY2xhbXA6SHQsZXVjbGlkZWFuTW9kdWxvOnlkLG1hcExpbmVhcjppQSxpbnZlcnNlTGVycDpyQSxsZXJwOndhLGRhbXA6c0EscGluZ3Bvbmc6b0Esc21vb3Roc3RlcDphQSxzbW9vdGhlcnN0ZXA6bEEscmFuZEludDpjQSxyYW5kRmxvYXQ6dUEscmFuZEZsb2F0U3ByZWFkOmhBLHNlZWRlZFJhbmRvbTpmQSxkZWdUb1JhZDpkQSxyYWRUb0RlZzpwQSxpc1Bvd2VyT2ZUd286bUEsY2VpbFBvd2VyT2ZUd286Z0EsZmxvb3JQb3dlck9mVHdvOnlBLHNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXI6X0Esbm9ybWFsaXplOlp0LGRlbm9ybWFsaXplOmxufTtjbGFzcyBYe2NvbnN0cnVjdG9yKHQ9MCxlPTApe1gucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXJbMF0qZStyWzNdKm4rcls2XSx0aGlzLnk9clsxXSplK3JbNF0qbityWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PUh0KHRoaXMueCx0LngsZS54KSx0aGlzLnk9SHQodGhpcy55LHQueSxlLnkpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PUh0KHRoaXMueCx0LGUpLHRoaXMueT1IdCh0aGlzLnksdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihIdChuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55fWNyb3NzKHQpe3JldHVybiB0aGlzLngqdC55LXRoaXMueSp0Lnh9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1hbmdsZSgpe3JldHVybiBNYXRoLmF0YW4yKC10aGlzLnksLXRoaXMueCkrTWF0aC5QSX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoSHQobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxyPU1hdGguc2luKGUpLHM9dGhpcy54LXQueCxvPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1zKm4tbypyK3QueCx0aGlzLnk9cypyK28qbit0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55fX1jbGFzcyBXdHtjb25zdHJ1Y3Rvcih0LGUsbixyLHMsbyxhLGwsYyl7V3QucHJvdG90eXBlLmlzTWF0cml4Mz0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scixzLG8sYSxsLGMpfXNldCh0LGUsbixyLHMsbyxhLGwsYyl7Y29uc3QgdT10aGlzLmVsZW1lbnRzO3JldHVybiB1WzBdPXQsdVsxXT1yLHVbMl09YSx1WzNdPWUsdVs0XT1zLHVbNV09bCx1WzZdPW4sdVs3XT1vLHVbOF09Yyx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywyKSx0aGlzfXNldEZyb21NYXRyaXg0KHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzRdLGVbOF0sZVsxXSxlWzVdLGVbOV0sZVsyXSxlWzZdLGVbMTBdKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxyPWUuZWxlbWVudHMscz10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bM10sbD1uWzZdLGM9blsxXSx1PW5bNF0saD1uWzddLGY9blsyXSxkPW5bNV0scD1uWzhdLHk9clswXSxnPXJbM10sbT1yWzZdLHY9clsxXSx4PXJbNF0sXz1yWzddLE09clsyXSxiPXJbNV0sQT1yWzhdO3JldHVybiBzWzBdPW8qeSthKnYrbCpNLHNbM109bypnK2EqeCtsKmIsc1s2XT1vKm0rYSpfK2wqQSxzWzFdPWMqeSt1KnYraCpNLHNbNF09YypnK3UqeCtoKmIsc1s3XT1jKm0rdSpfK2gqQSxzWzJdPWYqeStkKnYrcCpNLHNbNV09ZipnK2QqeCtwKmIsc1s4XT1mKm0rZCpfK3AqQSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzNdKj10LGVbNl0qPXQsZVsxXSo9dCxlWzRdKj10LGVbN10qPXQsZVsyXSo9dCxlWzVdKj10LGVbOF0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHI9dFsyXSxzPXRbM10sbz10WzRdLGE9dFs1XSxsPXRbNl0sYz10WzddLHU9dFs4XTtyZXR1cm4gZSpvKnUtZSphKmMtbipzKnUrbiphKmwrcipzKmMtcipvKmx9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scj10WzJdLHM9dFszXSxvPXRbNF0sYT10WzVdLGw9dFs2XSxjPXRbN10sdT10WzhdLGg9dSpvLWEqYyxmPWEqbC11KnMsZD1jKnMtbypsLHA9ZSpoK24qZityKmQ7aWYocD09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCB5PTEvcDtyZXR1cm4gdFswXT1oKnksdFsxXT0ocipjLXUqbikqeSx0WzJdPShhKm4tcipvKSp5LHRbM109Zip5LHRbNF09KHUqZS1yKmwpKnksdFs1XT0ocipzLWEqZSkqeSx0WzZdPWQqeSx0WzddPShuKmwtYyplKSp5LHRbOF09KG8qZS1uKnMpKnksdGhpc310cmFuc3Bvc2UoKXtsZXQgdDtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbM10sZVszXT10LHQ9ZVsyXSxlWzJdPWVbNl0sZVs2XT10LHQ9ZVs1XSxlWzVdPWVbN10sZVs3XT10LHRoaXN9Z2V0Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KHQpLmludmVydCgpLnRyYW5zcG9zZSgpfXRyYW5zcG9zZUludG9BcnJheSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbM10sdFsyXT1lWzZdLHRbM109ZVsxXSx0WzRdPWVbNF0sdFs1XT1lWzddLHRbNl09ZVsyXSx0WzddPWVbNV0sdFs4XT1lWzhdLHRoaXN9c2V0VXZUcmFuc2Zvcm0odCxlLG4scixzLG8sYSl7Y29uc3QgbD1NYXRoLmNvcyhzKSxjPU1hdGguc2luKHMpO3JldHVybiB0aGlzLnNldChuKmwsbipjLC1uKihsKm8rYyphKStvK3QsLXIqYyxyKmwsLXIqKC1jKm8rbCphKSthK2UsMCwwLDEpLHRoaXN9c2NhbGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShfZC5tYWtlU2NhbGUodCxlKSksdGhpc31yb3RhdGUodCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoX2QubWFrZVJvdGF0aW9uKC10KSksdGhpc310cmFuc2xhdGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShfZC5tYWtlVHJhbnNsYXRpb24odCxlKSksdGhpc31tYWtlVHJhbnNsYXRpb24odCxlKXtyZXR1cm4gdC5pc1ZlY3RvcjI/dGhpcy5zZXQoMSwwLHQueCwwLDEsdC55LDAsMCwxKTp0aGlzLnNldCgxLDAsdCwwLDEsZSwwLDAsMSksdGhpc31tYWtlUm90YXRpb24odCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsbixlLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSl7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsZSwwLDAsMCwxKSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgcj0wO3I8OTtyKyspaWYoZVtyXSE9PW5bcl0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWNvbnN0IF9kPW5ldyBXdDtmdW5jdGlvbiBneShpKXtmb3IobGV0IHQ9aS5sZW5ndGgtMTt0Pj0wOy0tdClpZihpW3RdPj02NTUzNSlyZXR1cm4hMDtyZXR1cm4hMX1jb25zdCB2QT17SW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXl9O2Z1bmN0aW9uIEtzKGksdCl7cmV0dXJuIG5ldyB2QVtpXSh0KX1mdW5jdGlvbiBBYShpKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixpKX1mdW5jdGlvbiB5eSgpe2NvbnN0IGk9QWEoImNhbnZhcyIpO3JldHVybiBpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixpfWNvbnN0IF95PXt9O2Z1bmN0aW9uIFFzKGkpe2kgaW4gX3l8fChfeVtpXT0hMCxjb25zb2xlLndhcm4oaSkpfWZ1bmN0aW9uIFNBKGksdCxlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixyKXtmdW5jdGlvbiBzKCl7c3dpdGNoKGkuY2xpZW50V2FpdFN5bmModCxpLlNZTkNfRkxVU0hfQ09NTUFORFNfQklULDApKXtjYXNlIGkuV0FJVF9GQUlMRUQ6cigpO2JyZWFrO2Nhc2UgaS5USU1FT1VUX0VYUElSRUQ6c2V0VGltZW91dChzLGUpO2JyZWFrO2RlZmF1bHQ6bigpfX1zZXRUaW1lb3V0KHMsZSl9KX1mdW5jdGlvbiBNQShpKXtjb25zdCB0PWkuZWxlbWVudHM7dFsyXT0uNSp0WzJdKy41KnRbM10sdFs2XT0uNSp0WzZdKy41KnRbN10sdFsxMF09LjUqdFsxMF0rLjUqdFsxMV0sdFsxNF09LjUqdFsxNF0rLjUqdFsxNV19ZnVuY3Rpb24gYkEoaSl7Y29uc3QgdD1pLmVsZW1lbnRzO3RbMTFdPT09LTE/KHRbMTBdPS10WzEwXS0xLHRbMTRdPS10WzE0XSk6KHRbMTBdPS10WzEwXSx0WzE0XT0tdFsxNF0rMSl9Y29uc3QgeHk9bmV3IFd0KCkuc2V0KC40MTIzOTA4LC4zNTc1ODQzLC4xODA0ODA4LC4yMTI2MzksLjcxNTE2ODcsLjA3MjE5MjMsLjAxOTMzMDgsLjExOTE5NDgsLjk1MDUzMjIpLHZ5PW5ldyBXdCgpLnNldCgzLjI0MDk2OTksLTEuNTM3MzgzMiwtLjQ5ODYxMDgsLS45NjkyNDM2LDEuODc1OTY3NSwuMDQxNTU1MSwuMDU1NjMwMSwtLjIwMzk3NywxLjA1Njk3MTUpO2Z1bmN0aW9uIHdBKCl7Y29uc3QgaT17ZW5hYmxlZDohMCx3b3JraW5nQ29sb3JTcGFjZTpqcixzcGFjZXM6e30sY29udmVydDpmdW5jdGlvbihyLHMsbyl7cmV0dXJuIHRoaXMuZW5hYmxlZD09PSExfHxzPT09b3x8IXN8fCFvfHwodGhpcy5zcGFjZXNbc10udHJhbnNmZXI9PT1wZSYmKHIucj1IaShyLnIpLHIuZz1IaShyLmcpLHIuYj1IaShyLmIpKSx0aGlzLnNwYWNlc1tzXS5wcmltYXJpZXMhPT10aGlzLnNwYWNlc1tvXS5wcmltYXJpZXMmJihyLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tzXS50b1hZWiksci5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbb10uZnJvbVhZWikpLHRoaXMuc3BhY2VzW29dLnRyYW5zZmVyPT09cGUmJihyLnI9dG8oci5yKSxyLmc9dG8oci5nKSxyLmI9dG8oci5iKSkpLHJ9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihyLHMpe3JldHVybiB0aGlzLmNvbnZlcnQocix0aGlzLndvcmtpbmdDb2xvclNwYWNlLHMpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHIscyl7cmV0dXJuIHRoaXMuY29udmVydChyLHMsdGhpcy53b3JraW5nQ29sb3JTcGFjZSl9LGdldFByaW1hcmllczpmdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5zcGFjZXNbcl0ucHJpbWFyaWVzfSxnZXRUcmFuc2ZlcjpmdW5jdGlvbihyKXtyZXR1cm4gcj09PUdpP1NhOnRoaXMuc3BhY2VzW3JdLnRyYW5zZmVyfSxnZXRMdW1pbmFuY2VDb2VmZmljaWVudHM6ZnVuY3Rpb24ocixzPXRoaXMud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiByLmZyb21BcnJheSh0aGlzLnNwYWNlc1tzXS5sdW1pbmFuY2VDb2VmZmljaWVudHMpfSxkZWZpbmU6ZnVuY3Rpb24ocil7T2JqZWN0LmFzc2lnbih0aGlzLnNwYWNlcyxyKX0sX2dldE1hdHJpeDpmdW5jdGlvbihyLHMsbyl7cmV0dXJuIHIuY29weSh0aGlzLnNwYWNlc1tzXS50b1hZWikubXVsdGlwbHkodGhpcy5zcGFjZXNbb10uZnJvbVhZWil9LF9nZXREcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpmdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5zcGFjZXNbcl0ub3V0cHV0Q29sb3JTcGFjZUNvbmZpZy5kcmF3aW5nQnVmZmVyQ29sb3JTcGFjZX0sX2dldFVucGFja0NvbG9yU3BhY2U6ZnVuY3Rpb24ocj10aGlzLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdGhpcy5zcGFjZXNbcl0ud29ya2luZ0NvbG9yU3BhY2VDb25maWcudW5wYWNrQ29sb3JTcGFjZX19LHQ9Wy42NCwuMzMsLjMsLjYsLjE1LC4wNl0sZT1bLjIxMjYsLjcxNTIsLjA3MjJdLG49Wy4zMTI3LC4zMjldO3JldHVybiBpLmRlZmluZSh7W2pyXTp7cHJpbWFyaWVzOnQsd2hpdGVQb2ludDpuLHRyYW5zZmVyOlNhLHRvWFlaOnh5LGZyb21YWVo6dnksbHVtaW5hbmNlQ29lZmZpY2llbnRzOmUsd29ya2luZ0NvbG9yU3BhY2VDb25maWc6e3VucGFja0NvbG9yU3BhY2U6U259LG91dHB1dENvbG9yU3BhY2VDb25maWc6e2RyYXdpbmdCdWZmZXJDb2xvclNwYWNlOlNufX0sW1NuXTp7cHJpbWFyaWVzOnQsd2hpdGVQb2ludDpuLHRyYW5zZmVyOnBlLHRvWFlaOnh5LGZyb21YWVo6dnksbHVtaW5hbmNlQ29lZmZpY2llbnRzOmUsb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6U259fX0pLGl9Y29uc3QgcmU9d0EoKTtmdW5jdGlvbiBIaShpKXtyZXR1cm4gaTwuMDQwNDU/aSouMDc3Mzk5MzgwODpNYXRoLnBvdyhpKi45NDc4NjcyOTg2Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gdG8oaSl7cmV0dXJuIGk8LjAwMzEzMDg/aSoxMi45MjoxLjA1NSpNYXRoLnBvdyhpLC40MTY2NiktLjA1NX1sZXQgZW87Y2xhc3MgU3l7c3RhdGljIGdldERhdGFVUkwodCl7aWYoL15kYXRhOi9pLnRlc3QodC5zcmMpfHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQ9PSJ1bmRlZmluZWQiKXJldHVybiB0LnNyYztsZXQgZTtpZih0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpZT10O2Vsc2V7ZW89PT12b2lkIDAmJihlbz1BYSgiY2FudmFzIikpLGVvLndpZHRoPXQud2lkdGgsZW8uaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZW8uZ2V0Q29udGV4dCgiMmQiKTt0IGluc3RhbmNlb2YgSW1hZ2VEYXRhP24ucHV0SW1hZ2VEYXRhKHQsMCwwKTpuLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxlPWVvfXJldHVybiBlLndpZHRoPjIwNDh8fGUuaGVpZ2h0PjIwNDg/KGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5nZXREYXRhVVJMOiBJbWFnZSBjb252ZXJ0ZWQgdG8ganBnIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIix0KSxlLnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpKTplLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1BYSgiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHI9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHM9ci5kYXRhO2ZvcihsZXQgbz0wO288cy5sZW5ndGg7bysrKXNbb109SGkoc1tvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEociwwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKEhpKGVbbl0vMjU1KSoyNTUpOmVbbl09SGkoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IEFBPTA7Y2xhc3MgdHN7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkFBKyt9KSx0aGlzLnV1aWQ9Tm4oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxyPXRoaXMuZGF0YTtpZihyIT09bnVsbCl7bGV0IHM7aWYoQXJyYXkuaXNBcnJheShyKSl7cz1bXTtmb3IobGV0IG89MCxhPXIubGVuZ3RoO288YTtvKyspcltvXS5pc0RhdGFUZXh0dXJlP3MucHVzaCh4ZChyW29dLmltYWdlKSk6cy5wdXNoKHhkKHJbb10pKX1lbHNlIHM9eGQocik7bi51cmw9c31yZXR1cm4gZXx8KHQuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24geGQoaSl7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEltYWdlQml0bWFwP1N5LmdldERhdGFVUkwoaSk6aS5kYXRhP3tkYXRhOkFycmF5LmZyb20oaS5kYXRhKSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodCx0eXBlOmkuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCBFQT0wO2NsYXNzIFRlIGV4dGVuZHMgVGl7Y29uc3RydWN0b3IodD1UZS5ERUZBVUxUX0lNQUdFLGU9VGUuREVGQVVMVF9NQVBQSU5HLG49cW4scj1xbixzPVZlLG89d2ksYT1hbixsPUFpLGM9VGUuREVGQVVMVF9BTklTT1RST1BZLHU9R2kpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6RUErK30pLHRoaXMudXVpZD1ObigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgdHModCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXIsdGhpcy5tYWdGaWx0ZXI9cyx0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT1jLHRoaXMuZm9ybWF0PWEsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1sLHRoaXMub2Zmc2V0PW5ldyBYKDAsMCksdGhpcy5yZXBlYXQ9bmV3IFgoMSwxKSx0aGlzLmNlbnRlcj1uZXcgWCgwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IFd0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPXUsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmU9ITEsdGhpcy5wbXJlbVZlcnNpb249MH1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodD1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPXR9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5zb3VyY2U9dC5zb3VyY2UsdGhpcy5taXBtYXBzPXQubWlwbWFwcy5zbGljZSgwKSx0aGlzLm1hcHBpbmc9dC5tYXBwaW5nLHRoaXMuY2hhbm5lbD10LmNoYW5uZWwsdGhpcy53cmFwUz10LndyYXBTLHRoaXMud3JhcFQ9dC53cmFwVCx0aGlzLm1hZ0ZpbHRlcj10Lm1hZ0ZpbHRlcix0aGlzLm1pbkZpbHRlcj10Lm1pbkZpbHRlcix0aGlzLmFuaXNvdHJvcHk9dC5hbmlzb3Ryb3B5LHRoaXMuZm9ybWF0PXQuZm9ybWF0LHRoaXMuaW50ZXJuYWxGb3JtYXQ9dC5pbnRlcm5hbEZvcm1hdCx0aGlzLnR5cGU9dC50eXBlLHRoaXMub2Zmc2V0LmNvcHkodC5vZmZzZXQpLHRoaXMucmVwZWF0LmNvcHkodC5yZXBlYXQpLHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPXQuZ2VuZXJhdGVNaXBtYXBzLHRoaXMucHJlbXVsdGlwbHlBbHBoYT10LnByZW11bHRpcGx5QWxwaGEsdGhpcy5mbGlwWT10LmZsaXBZLHRoaXMudW5wYWNrQWxpZ25tZW50PXQudW5wYWNrQWxpZ25tZW50LHRoaXMuY29sb3JTcGFjZT10LmNvbG9yU3BhY2UsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSx0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2lmKCFlJiZ0LnRleHR1cmVzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLGltYWdlOnRoaXMuc291cmNlLnRvSlNPTih0KS51dWlkLG1hcHBpbmc6dGhpcy5tYXBwaW5nLGNoYW5uZWw6dGhpcy5jaGFubmVsLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsaW50ZXJuYWxGb3JtYXQ6dGhpcy5pbnRlcm5hbEZvcm1hdCx0eXBlOnRoaXMudHlwZSxjb2xvclNwYWNlOnRoaXMuY29sb3JTcGFjZSxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFksZ2VuZXJhdGVNaXBtYXBzOnRoaXMuZ2VuZXJhdGVNaXBtYXBzLHByZW11bHRpcGx5QWxwaGE6dGhpcy5wcmVtdWx0aXBseUFscGhhLHVucGFja0FsaWdubWVudDp0aGlzLnVucGFja0FsaWdubWVudH07cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxlfHwodC50ZXh0dXJlc1t0aGlzLnV1aWRdPW4pLG59ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmFuc2Zvcm1Vdih0KXtpZih0aGlzLm1hcHBpbmchPT1LbClyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIHVhOnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrO2Nhc2UgcW46dC54PXQueDwwPzA6MTticmVhaztjYXNlIGhhOk1hdGguYWJzKE1hdGguZmxvb3IodC54KSUyKT09PTE/dC54PU1hdGguY2VpbCh0LngpLXQueDp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVha31pZih0Lnk8MHx8dC55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgdWE6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSBxbjp0Lnk9dC55PDA/MDoxO2JyZWFrO2Nhc2UgaGE6TWF0aC5hYnMoTWF0aC5mbG9vcih0LnkpJTIpPT09MT90Lnk9TWF0aC5jZWlsKHQueSktdC55OnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrfXJldHVybiB0aGlzLmZsaXBZJiYodC55PTEtdC55KSx0fXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJih0aGlzLnZlcnNpb24rKyx0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZT0hMCl9c2V0IG5lZWRzUE1SRU1VcGRhdGUodCl7dD09PSEwJiZ0aGlzLnBtcmVtVmVyc2lvbisrfX1UZS5ERUZBVUxUX0lNQUdFPW51bGwsVGUuREVGQVVMVF9NQVBQSU5HPUtsLFRlLkRFRkFVTFRfQU5JU09UUk9QWT0xO2NsYXNzIFF0e2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHI9MSl7UXQucHJvdG90eXBlLmlzVmVjdG9yND0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cn1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy56fXNldCB3aWR0aCh0KXt0aGlzLno9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMud31zZXQgaGVpZ2h0KHQpe3RoaXMudz10fXNldCh0LGUsbixyKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXIsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXMudz10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Vyh0KXtyZXR1cm4gdGhpcy53PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXMudz10LnchPT12b2lkIDA/dC53OjEsdGhpc31hZGQodCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXMudys9dC53LHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzLncrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXMudz10LncrZS53LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXMudys9dC53KmUsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXMudy09dC53LHRoaXN9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzLnctPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXMudz10LnctZS53LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXMudyo9dC53LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXMudyo9dCx0aGlzfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixzPXRoaXMudyxvPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1vWzBdKmUrb1s0XSpuK29bOF0qcitvWzEyXSpzLHRoaXMueT1vWzFdKmUrb1s1XSpuK29bOV0qcitvWzEzXSpzLHRoaXMuej1vWzJdKmUrb1s2XSpuK29bMTBdKnIrb1sxNF0qcyx0aGlzLnc9b1szXSplK29bN10qbitvWzExXSpyK29bMTVdKnMsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXMudy89dC53LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxuLHIscztjb25zdCBsPXQuZWxlbWVudHMsYz1sWzBdLHU9bFs0XSxoPWxbOF0sZj1sWzFdLGQ9bFs1XSxwPWxbOV0seT1sWzJdLGc9bFs2XSxtPWxbMTBdO2lmKE1hdGguYWJzKHUtZik8LjAxJiZNYXRoLmFicyhoLXkpPC4wMSYmTWF0aC5hYnMocC1nKTwuMDEpe2lmKE1hdGguYWJzKHUrZik8LjEmJk1hdGguYWJzKGgreSk8LjEmJk1hdGguYWJzKHArZyk8LjEmJk1hdGguYWJzKGMrZCttLTMpPC4xKXJldHVybiB0aGlzLnNldCgxLDAsMCwwKSx0aGlzO2U9TWF0aC5QSTtjb25zdCB4PShjKzEpLzIsXz0oZCsxKS8yLE09KG0rMSkvMixiPSh1K2YpLzQsQT0oaCt5KS80LEU9KHArZykvNDtyZXR1cm4geD5fJiZ4Pk0/eDwuMDE/KG49MCxyPS43MDcxMDY3ODEscz0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQoeCkscj1iL24scz1BL24pOl8+TT9fPC4wMT8obj0uNzA3MTA2NzgxLHI9MCxzPS43MDcxMDY3ODEpOihyPU1hdGguc3FydChfKSxuPWIvcixzPUUvcik6TTwuMDE/KG49LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEscz0wKToocz1NYXRoLnNxcnQoTSksbj1BL3Mscj1FL3MpLHRoaXMuc2V0KG4scixzLGUpLHRoaXN9bGV0IHY9TWF0aC5zcXJ0KChnLXApKihnLXApKyhoLXkpKihoLXkpKyhmLXUpKihmLXUpKTtyZXR1cm4gTWF0aC5hYnModik8LjAwMSYmKHY9MSksdGhpcy54PShnLXApL3YsdGhpcy55PShoLXkpL3YsdGhpcy56PShmLXUpL3YsdGhpcy53PU1hdGguYWNvcygoYytkK20tMSkvMiksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzLnc9ZVsxNV0sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1pbih0aGlzLncsdC53KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpcy53PU1hdGgubWF4KHRoaXMudyx0LncpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PUh0KHRoaXMueCx0LngsZS54KSx0aGlzLnk9SHQodGhpcy55LHQueSxlLnkpLHRoaXMuej1IdCh0aGlzLnosdC56LGUueiksdGhpcy53PUh0KHRoaXMudyx0LncsZS53KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1IdCh0aGlzLngsdCxlKSx0aGlzLnk9SHQodGhpcy55LHQsZSksdGhpcy56PUh0KHRoaXMueix0LGUpLHRoaXMudz1IdCh0aGlzLncsdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihIdChuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz1NYXRoLmZsb29yKHRoaXMudyksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXMudz1NYXRoLmNlaWwodGhpcy53KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXMudz1NYXRoLnJvdW5kKHRoaXMudyksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpcy56PU1hdGgudHJ1bmModGhpcy56KSx0aGlzLnc9TWF0aC50cnVuYyh0aGlzLncpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXMudz0tdGhpcy53LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQueit0aGlzLncqdC53fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueikrTWF0aC5hYnModGhpcy53KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpcy53Kz0odC53LXRoaXMudykqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpcy53PXQudysoZS53LXQudykqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMueiYmdC53PT09dGhpcy53fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzLnc9dFtlKzNdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0W2UrM109dGhpcy53LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzLnc9dC5nZXRXKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnoseWllbGQgdGhpcy53fX1jbGFzcyBNeSBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj17fSl7c3VwZXIoKSx0aGlzLmlzUmVuZGVyVGFyZ2V0PSEwLHRoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9MSx0aGlzLnNjaXNzb3I9bmV3IFF0KDAsMCx0LGUpLHRoaXMuc2Npc3NvclRlc3Q9ITEsdGhpcy52aWV3cG9ydD1uZXcgUXQoMCwwLHQsZSk7Y29uc3Qgcj17d2lkdGg6dCxoZWlnaHQ6ZSxkZXB0aDoxfTtuPU9iamVjdC5hc3NpZ24oe2dlbmVyYXRlTWlwbWFwczohMSxpbnRlcm5hbEZvcm1hdDpudWxsLG1pbkZpbHRlcjpWZSxkZXB0aEJ1ZmZlcjohMCxzdGVuY2lsQnVmZmVyOiExLHJlc29sdmVEZXB0aEJ1ZmZlcjohMCxyZXNvbHZlU3RlbmNpbEJ1ZmZlcjohMCxkZXB0aFRleHR1cmU6bnVsbCxzYW1wbGVzOjAsY291bnQ6MX0sbik7Y29uc3Qgcz1uZXcgVGUocixuLm1hcHBpbmcsbi53cmFwUyxuLndyYXBULG4ubWFnRmlsdGVyLG4ubWluRmlsdGVyLG4uZm9ybWF0LG4udHlwZSxuLmFuaXNvdHJvcHksbi5jb2xvclNwYWNlKTtzLmZsaXBZPSExLHMuZ2VuZXJhdGVNaXBtYXBzPW4uZ2VuZXJhdGVNaXBtYXBzLHMuaW50ZXJuYWxGb3JtYXQ9bi5pbnRlcm5hbEZvcm1hdCx0aGlzLnRleHR1cmVzPVtdO2NvbnN0IG89bi5jb3VudDtmb3IobGV0IGE9MDthPG87YSsrKXRoaXMudGV4dHVyZXNbYV09cy5jbG9uZSgpLHRoaXMudGV4dHVyZXNbYV0uaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwO3RoaXMuZGVwdGhCdWZmZXI9bi5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9bi5zdGVuY2lsQnVmZmVyLHRoaXMucmVzb2x2ZURlcHRoQnVmZmVyPW4ucmVzb2x2ZURlcHRoQnVmZmVyLHRoaXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXI9bi5yZXNvbHZlU3RlbmNpbEJ1ZmZlcix0aGlzLmRlcHRoVGV4dHVyZT1uLmRlcHRoVGV4dHVyZSx0aGlzLnNhbXBsZXM9bi5zYW1wbGVzfWdldCB0ZXh0dXJlKCl7cmV0dXJuIHRoaXMudGV4dHVyZXNbMF19c2V0IHRleHR1cmUodCl7dGhpcy50ZXh0dXJlc1swXT10fXNldFNpemUodCxlLG49MSl7aWYodGhpcy53aWR0aCE9PXR8fHRoaXMuaGVpZ2h0IT09ZXx8dGhpcy5kZXB0aCE9PW4pe3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9bjtmb3IobGV0IHI9MCxzPXRoaXMudGV4dHVyZXMubGVuZ3RoO3I8cztyKyspdGhpcy50ZXh0dXJlc1tyXS5pbWFnZS53aWR0aD10LHRoaXMudGV4dHVyZXNbcl0uaW1hZ2UuaGVpZ2h0PWUsdGhpcy50ZXh0dXJlc1tyXS5pbWFnZS5kZXB0aD1uO3RoaXMuZGlzcG9zZSgpfXRoaXMudmlld3BvcnQuc2V0KDAsMCx0LGUpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLHQsZSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXQuaGVpZ2h0LHRoaXMuZGVwdGg9dC5kZXB0aCx0aGlzLnNjaXNzb3IuY29weSh0LnNjaXNzb3IpLHRoaXMuc2Npc3NvclRlc3Q9dC5zY2lzc29yVGVzdCx0aGlzLnZpZXdwb3J0LmNvcHkodC52aWV3cG9ydCksdGhpcy50ZXh0dXJlcy5sZW5ndGg9MDtmb3IobGV0IG49MCxyPXQudGV4dHVyZXMubGVuZ3RoO248cjtuKyspdGhpcy50ZXh0dXJlc1tuXT10LnRleHR1cmVzW25dLmNsb25lKCksdGhpcy50ZXh0dXJlc1tuXS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITA7Y29uc3QgZT1PYmplY3QuYXNzaWduKHt9LHQudGV4dHVyZS5pbWFnZSk7cmV0dXJuIHRoaXMudGV4dHVyZS5zb3VyY2U9bmV3IHRzKGUpLHRoaXMuZGVwdGhCdWZmZXI9dC5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dC5zdGVuY2lsQnVmZmVyLHRoaXMucmVzb2x2ZURlcHRoQnVmZmVyPXQucmVzb2x2ZURlcHRoQnVmZmVyLHRoaXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXI9dC5yZXNvbHZlU3RlbmNpbEJ1ZmZlcix0LmRlcHRoVGV4dHVyZSE9PW51bGwmJih0aGlzLmRlcHRoVGV4dHVyZT10LmRlcHRoVGV4dHVyZS5jbG9uZSgpKSx0aGlzLnNhbXBsZXM9dC5zYW1wbGVzLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y2xhc3Mgb2kgZXh0ZW5kcyBNeXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49e30pe3N1cGVyKHQsZSxuKSx0aGlzLmlzV2ViR0xSZW5kZXJUYXJnZXQ9ITB9fWNsYXNzIFVjIGV4dGVuZHMgVGV7Y29uc3RydWN0b3IodD1udWxsLGU9MSxuPTEscj0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YUFycmF5VGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6bixkZXB0aDpyfSx0aGlzLm1hZ0ZpbHRlcj1YZSx0aGlzLm1pbkZpbHRlcj1YZSx0aGlzLndyYXBSPXFuLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MSx0aGlzLmxheWVyVXBkYXRlcz1uZXcgU2V0fWFkZExheWVyVXBkYXRlKHQpe3RoaXMubGF5ZXJVcGRhdGVzLmFkZCh0KX1jbGVhckxheWVyVXBkYXRlcygpe3RoaXMubGF5ZXJVcGRhdGVzLmNsZWFyKCl9fWNsYXNzIFRBIGV4dGVuZHMgb2l7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEscj17fSl7c3VwZXIodCxlLHIpLHRoaXMuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0PSEwLHRoaXMuZGVwdGg9bix0aGlzLnRleHR1cmU9bmV3IFVjKG51bGwsdCxlLG4pLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITB9fWNsYXNzIHZkIGV4dGVuZHMgVGV7Y29uc3RydWN0b3IodD1udWxsLGU9MSxuPTEscj0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YTNEVGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6bixkZXB0aDpyfSx0aGlzLm1hZ0ZpbHRlcj1YZSx0aGlzLm1pbkZpbHRlcj1YZSx0aGlzLndyYXBSPXFuLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y2xhc3MgQ0EgZXh0ZW5kcyBvaXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxyPXt9KXtzdXBlcih0LGUsciksdGhpcy5pc1dlYkdMM0RSZW5kZXJUYXJnZXQ9ITAsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZT1uZXcgdmQobnVsbCx0LGUsbiksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH19Y2xhc3MgTW57Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXJ9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixyLHMsbyxhKXtsZXQgbD1uW3IrMF0sYz1uW3IrMV0sdT1uW3IrMl0saD1uW3IrM107Y29uc3QgZj1zW28rMF0sZD1zW28rMV0scD1zW28rMl0seT1zW28rM107aWYoYT09PTApe3RbZSswXT1sLHRbZSsxXT1jLHRbZSsyXT11LHRbZSszXT1oO3JldHVybn1pZihhPT09MSl7dFtlKzBdPWYsdFtlKzFdPWQsdFtlKzJdPXAsdFtlKzNdPXk7cmV0dXJufWlmKGghPT15fHxsIT09Znx8YyE9PWR8fHUhPT1wKXtsZXQgZz0xLWE7Y29uc3QgbT1sKmYrYypkK3UqcCtoKnksdj1tPj0wPzE6LTEseD0xLW0qbTtpZih4Pk51bWJlci5FUFNJTE9OKXtjb25zdCBNPU1hdGguc3FydCh4KSxiPU1hdGguYXRhbjIoTSxtKnYpO2c9TWF0aC5zaW4oZypiKS9NLGE9TWF0aC5zaW4oYSpiKS9NfWNvbnN0IF89YSp2O2lmKGw9bCpnK2YqXyxjPWMqZytkKl8sdT11KmcrcCpfLGg9aCpnK3kqXyxnPT09MS1hKXtjb25zdCBNPTEvTWF0aC5zcXJ0KGwqbCtjKmMrdSp1K2gqaCk7bCo9TSxjKj1NLHUqPU0saCo9TX19dFtlXT1sLHRbZSsxXT1jLHRbZSsyXT11LHRbZSszXT1ofXN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LGUsbixyLHMsbyl7Y29uc3QgYT1uW3JdLGw9bltyKzFdLGM9bltyKzJdLHU9bltyKzNdLGg9c1tvXSxmPXNbbysxXSxkPXNbbysyXSxwPXNbbyszXTtyZXR1cm4gdFtlXT1hKnArdSpoK2wqZC1jKmYsdFtlKzFdPWwqcCt1KmYrYypoLWEqZCx0W2UrMl09YypwK3UqZCthKmYtbCpoLHRbZSszXT11KnAtYSpoLWwqZi1jKmQsdH1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgdygpe3JldHVybiB0aGlzLl93fXNldCB3KHQpe3RoaXMuX3c9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fdyl9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10LngsdGhpcy5feT10LnksdGhpcy5fej10LnosdGhpcy5fdz10LncsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUV1bGVyKHQsZT0hMCl7Y29uc3Qgbj10Ll94LHI9dC5feSxzPXQuX3osbz10Ll9vcmRlcixhPU1hdGguY29zLGw9TWF0aC5zaW4sYz1hKG4vMiksdT1hKHIvMiksaD1hKHMvMiksZj1sKG4vMiksZD1sKHIvMikscD1sKHMvMik7c3dpdGNoKG8pe2Nhc2UiWFlaIjp0aGlzLl94PWYqdSpoK2MqZCpwLHRoaXMuX3k9YypkKmgtZip1KnAsdGhpcy5fej1jKnUqcCtmKmQqaCx0aGlzLl93PWMqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PWYqdSpoK2MqZCpwLHRoaXMuX3k9YypkKmgtZip1KnAsdGhpcy5fej1jKnUqcC1mKmQqaCx0aGlzLl93PWMqdSpoK2YqZCpwO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PWYqdSpoLWMqZCpwLHRoaXMuX3k9YypkKmgrZip1KnAsdGhpcy5fej1jKnUqcCtmKmQqaCx0aGlzLl93PWMqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl94PWYqdSpoLWMqZCpwLHRoaXMuX3k9YypkKmgrZip1KnAsdGhpcy5fej1jKnUqcC1mKmQqaCx0aGlzLl93PWMqdSpoK2YqZCpwO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl94PWYqdSpoK2MqZCpwLHRoaXMuX3k9YypkKmgrZip1KnAsdGhpcy5fej1jKnUqcC1mKmQqaCx0aGlzLl93PWMqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl94PWYqdSpoLWMqZCpwLHRoaXMuX3k9YypkKmgtZip1KnAsdGhpcy5fej1jKnUqcCtmKmQqaCx0aGlzLl93PWMqdSpoK2YqZCpwO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitvKX1yZXR1cm4gZT09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3Qgbj1lLzIscj1NYXRoLnNpbihuKTtyZXR1cm4gdGhpcy5feD10Lngqcix0aGlzLl95PXQueSpyLHRoaXMuX3o9dC56KnIsdGhpcy5fdz1NYXRoLmNvcyhuKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLG49ZVswXSxyPWVbNF0scz1lWzhdLG89ZVsxXSxhPWVbNV0sbD1lWzldLGM9ZVsyXSx1PWVbNl0saD1lWzEwXSxmPW4rYStoO2lmKGY+MCl7Y29uc3QgZD0uNS9NYXRoLnNxcnQoZisxKTt0aGlzLl93PS4yNS9kLHRoaXMuX3g9KHUtbCkqZCx0aGlzLl95PShzLWMpKmQsdGhpcy5fej0oby1yKSpkfWVsc2UgaWYobj5hJiZuPmgpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMStuLWEtaCk7dGhpcy5fdz0odS1sKS9kLHRoaXMuX3g9LjI1KmQsdGhpcy5feT0ocitvKS9kLHRoaXMuX3o9KHMrYykvZH1lbHNlIGlmKGE+aCl7Y29uc3QgZD0yKk1hdGguc3FydCgxK2Etbi1oKTt0aGlzLl93PShzLWMpL2QsdGhpcy5feD0ocitvKS9kLHRoaXMuX3k9LjI1KmQsdGhpcy5fej0obCt1KS9kfWVsc2V7Y29uc3QgZD0yKk1hdGguc3FydCgxK2gtbi1hKTt0aGlzLl93PShvLXIpL2QsdGhpcy5feD0ocytjKS9kLHRoaXMuX3k9KGwrdSkvZCx0aGlzLl96PS4yNSpkfXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgbj10LmRvdChlKSsxO3JldHVybiBuPE51bWJlci5FUFNJTE9OPyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhIdCh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCByPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHIpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscj10Ll95LHM9dC5feixvPXQuX3csYT1lLl94LGw9ZS5feSxjPWUuX3osdT1lLl93O3JldHVybiB0aGlzLl94PW4qdStvKmErcipjLXMqbCx0aGlzLl95PXIqdStvKmwrcyphLW4qYyx0aGlzLl96PXMqdStvKmMrbipsLXIqYSx0aGlzLl93PW8qdS1uKmEtcipsLXMqYyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU9PT0wKXJldHVybiB0aGlzO2lmKGU9PT0xKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHI9dGhpcy5feSxzPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3grcip0Ll95K3MqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1yLHRoaXMuX3o9cyx0aGlzO2NvbnN0IGw9MS1hKmE7aWYobDw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IGQ9MS1lO3JldHVybiB0aGlzLl93PWQqbytlKnRoaXMuX3csdGhpcy5feD1kKm4rZSp0aGlzLl94LHRoaXMuX3k9ZCpyK2UqdGhpcy5feSx0aGlzLl96PWQqcytlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IGM9TWF0aC5zcXJ0KGwpLHU9TWF0aC5hdGFuMihjLGEpLGg9TWF0aC5zaW4oKDEtZSkqdSkvYyxmPU1hdGguc2luKGUqdSkvYztyZXR1cm4gdGhpcy5fdz1vKmgrdGhpcy5fdypmLHRoaXMuX3g9bipoK3RoaXMuX3gqZix0aGlzLl95PXIqaCt0aGlzLl95KmYsdGhpcy5fej1zKmgrdGhpcy5feipmLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHI9TWF0aC5zcXJ0KDEtbikscz1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHIqTWF0aC5zaW4odCkscipNYXRoLmNvcyh0KSxzKk1hdGguc2luKGUpLHMqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIFJ7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe1IucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYnkuc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihieS5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1zWzBdKmUrc1szXSpuK3NbNl0qcix0aGlzLnk9c1sxXSplK3NbNF0qbitzWzddKnIsdGhpcy56PXNbMl0qZStzWzVdKm4rc1s4XSpyLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixzPXQuZWxlbWVudHMsbz0xLyhzWzNdKmUrc1s3XSpuK3NbMTFdKnIrc1sxNV0pO3JldHVybiB0aGlzLng9KHNbMF0qZStzWzRdKm4rc1s4XSpyK3NbMTJdKSpvLHRoaXMueT0oc1sxXSplK3NbNV0qbitzWzldKnIrc1sxM10pKm8sdGhpcy56PShzWzJdKmUrc1s2XSpuK3NbMTBdKnIrc1sxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnoscz10Lngsbz10LnksYT10LnosbD10LncsYz0yKihvKnItYSpuKSx1PTIqKGEqZS1zKnIpLGg9MioocypuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2wqYytvKmgtYSp1LHRoaXMueT1uK2wqdSthKmMtcypoLHRoaXMuej1yK2wqaCtzKnUtbypjLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1zWzBdKmUrc1s0XSpuK3NbOF0qcix0aGlzLnk9c1sxXSplK3NbNV0qbitzWzldKnIsdGhpcy56PXNbMl0qZStzWzZdKm4rc1sxMF0qcix0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1IdCh0aGlzLngsdC54LGUueCksdGhpcy55PUh0KHRoaXMueSx0LnksZS55KSx0aGlzLno9SHQodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PUh0KHRoaXMueCx0LGUpLHRoaXMueT1IdCh0aGlzLnksdCxlKSx0aGlzLno9SHQodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoSHQobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQuen1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueil9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzfWNyb3NzKHQpe3JldHVybiB0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLHQpfWNyb3NzVmVjdG9ycyh0LGUpe2NvbnN0IG49dC54LHI9dC55LHM9dC56LG89ZS54LGE9ZS55LGw9ZS56O3JldHVybiB0aGlzLng9cipsLXMqYSx0aGlzLnk9cypvLW4qbCx0aGlzLno9biphLXIqbyx0aGlzfXByb2plY3RPblZlY3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoU3EoKTtpZihlPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDApO2NvbnN0IG49dC5kb3QodGhpcykvZTtyZXR1cm4gdGhpcy5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKG4pfXByb2plY3RPblBsYW5lKHQpe3JldHVybiBTZC5jb3B5KHRoaXMpLnByb2plY3RPblZlY3Rvcih0KSx0aGlzLnN1YihTZCl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIoU2QuY29weSh0KS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KHQpKSl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKEh0KG4sLTEsMSkpfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55LHI9dGhpcy56LXQuejtyZXR1cm4gZSplK24qbityKnJ9bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSkrTWF0aC5hYnModGhpcy56LXQueil9c2V0RnJvbVNwaGVyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQucmFkaXVzLHQucGhpLHQudGhldGEpfXNldEZyb21TcGhlcmljYWxDb29yZHModCxlLG4pe2NvbnN0IHI9TWF0aC5zaW4oZSkqdDtyZXR1cm4gdGhpcy54PXIqTWF0aC5zaW4obiksdGhpcy55PU1hdGguY29zKGUpKnQsdGhpcy56PXIqTWF0aC5jb3MobiksdGhpc31zZXRGcm9tQ3lsaW5kcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQucmFkaXVzLHQudGhldGEsdC55KX1zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModCxlLG4pe3JldHVybiB0aGlzLng9dCpNYXRoLnNpbihlKSx0aGlzLnk9bix0aGlzLno9dCpNYXRoLmNvcyhlKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXN9c2V0RnJvbU1hdHJpeFNjYWxlKHQpe2NvbnN0IGU9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCksbj10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxyPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiB0aGlzLng9ZSx0aGlzLnk9bix0aGlzLno9cix0aGlzfXNldEZyb21NYXRyaXhDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cyxlKjQpfXNldEZyb21NYXRyaXgzQ29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSozKX1zZXRGcm9tRXVsZXIodCl7cmV0dXJuIHRoaXMueD10Ll94LHRoaXMueT10Ll95LHRoaXMuej10Ll96LHRoaXN9c2V0RnJvbUNvbG9yKHQpe3JldHVybiB0aGlzLng9dC5yLHRoaXMueT10LmcsdGhpcy56PXQuYix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMuen1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzfXJhbmRvbURpcmVjdGlvbigpe2NvbnN0IHQ9TWF0aC5yYW5kb20oKSpNYXRoLlBJKjIsZT1NYXRoLnJhbmRvbSgpKjItMSxuPU1hdGguc3FydCgxLWUqZSk7cmV0dXJuIHRoaXMueD1uKk1hdGguY29zKHQpLHRoaXMueT1lLHRoaXMuej1uKk1hdGguc2luKHQpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnp9fWNvbnN0IFNkPW5ldyBSLGJ5PW5ldyBNbjtjbGFzcyBtZXtjb25zdHJ1Y3Rvcih0PW5ldyBSKDEvMCwxLzAsMS8wKSxlPW5ldyBSKC0xLzAsLTEvMCwtMS8wKSl7dGhpcy5pc0JveDM9ITAsdGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tQXJyYXkodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKz0zKXRoaXMuZXhwYW5kQnlQb2ludChhaS5mcm9tQXJyYXkodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludChhaS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21Qb2ludHModCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKHQsZSl7Y29uc3Qgbj1haS5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIobiksdGhpcy5tYXguY29weSh0KS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KHQsZT0hMSl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0LGUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen1nZXRDZW50ZXIodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31leHBhbmRCeU9iamVjdCh0LGU9ITEpe3QudXBkYXRlV29ybGRNYXRyaXgoITEsITEpO2NvbnN0IG49dC5nZW9tZXRyeTtpZihuIT09dm9pZCAwKXtjb25zdCBzPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT0hMCYmcyE9PXZvaWQgMCYmdC5pc0luc3RhbmNlZE1lc2ghPT0hMClmb3IobGV0IG89MCxhPXMuY291bnQ7bzxhO28rKyl0LmlzTWVzaD09PSEwP3QuZ2V0VmVydGV4UG9zaXRpb24obyxhaSk6YWkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG8pLGFpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoYWkpO2Vsc2UgdC5ib3VuZGluZ0JveCE9PXZvaWQgMD8odC5ib3VuZGluZ0JveD09PW51bGwmJnQuY29tcHV0ZUJvdW5kaW5nQm94KCksTmMuY29weSh0LmJvdW5kaW5nQm94KSk6KG4uYm91bmRpbmdCb3g9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ0JveCgpLE5jLmNvcHkobi5ib3VuZGluZ0JveCkpLE5jLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLnVuaW9uKE5jKX1jb25zdCByPXQuY2hpbGRyZW47Zm9yKGxldCBzPTAsbz1yLmxlbmd0aDtzPG87cysrKXRoaXMuZXhwYW5kQnlPYmplY3QocltzXSxlKTtyZXR1cm4gdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0Lng+PXRoaXMubWluLngmJnQueDw9dGhpcy5tYXgueCYmdC55Pj10aGlzLm1pbi55JiZ0Lnk8PXRoaXMubWF4LnkmJnQuej49dGhpcy5taW4ueiYmdC56PD10aGlzLm1heC56fWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD10Lm1pbi56JiZ0Lm1heC56PD10aGlzLm1heC56fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKHQuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5tYXgueD49dGhpcy5taW4ueCYmdC5taW4ueDw9dGhpcy5tYXgueCYmdC5tYXgueT49dGhpcy5taW4ueSYmdC5taW4ueTw9dGhpcy5tYXgueSYmdC5tYXguej49dGhpcy5taW4ueiYmdC5taW4uejw9dGhpcy5tYXguen1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodC5jZW50ZXIsYWkpLGFpLmRpc3RhbmNlVG9TcXVhcmVkKHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9aW50ZXJzZWN0c1BsYW5lKHQpe2xldCBlLG47cmV0dXJuIHQubm9ybWFsLng+MD8oZT10Lm5vcm1hbC54KnRoaXMubWluLngsbj10Lm5vcm1hbC54KnRoaXMubWF4LngpOihlPXQubm9ybWFsLngqdGhpcy5tYXgueCxuPXQubm9ybWFsLngqdGhpcy5taW4ueCksdC5ub3JtYWwueT4wPyhlKz10Lm5vcm1hbC55KnRoaXMubWluLnksbis9dC5ub3JtYWwueSp0aGlzLm1heC55KTooZSs9dC5ub3JtYWwueSp0aGlzLm1heC55LG4rPXQubm9ybWFsLnkqdGhpcy5taW4ueSksdC5ub3JtYWwuej4wPyhlKz10Lm5vcm1hbC56KnRoaXMubWluLnosbis9dC5ub3JtYWwueip0aGlzLm1heC56KTooZSs9dC5ub3JtYWwueip0aGlzLm1heC56LG4rPXQubm9ybWFsLnoqdGhpcy5taW4ueiksZTw9LXQuY29uc3RhbnQmJm4+PS10LmNvbnN0YW50fWludGVyc2VjdHNUcmlhbmdsZSh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTt0aGlzLmdldENlbnRlcihFYSksRmMuc3ViVmVjdG9ycyh0aGlzLm1heCxFYSksbm8uc3ViVmVjdG9ycyh0LmEsRWEpLGlvLnN1YlZlY3RvcnModC5iLEVhKSxyby5zdWJWZWN0b3JzKHQuYyxFYSkseXIuc3ViVmVjdG9ycyhpbyxubyksX3Iuc3ViVmVjdG9ycyhybyxpbyksZXMuc3ViVmVjdG9ycyhubyxybyk7bGV0IGU9WzAsLXlyLnoseXIueSwwLC1fci56LF9yLnksMCwtZXMueixlcy55LHlyLnosMCwteXIueCxfci56LDAsLV9yLngsZXMueiwwLC1lcy54LC15ci55LHlyLngsMCwtX3IueSxfci54LDAsLWVzLnksZXMueCwwXTtyZXR1cm4hTWQoZSxubyxpbyxybyxGYyl8fChlPVsxLDAsMCwwLDEsMCwwLDAsMV0sIU1kKGUsbm8saW8scm8sRmMpKT8hMTooQmMuY3Jvc3NWZWN0b3JzKHlyLF9yKSxlPVtCYy54LEJjLnksQmMuel0sTWQoZSxubyxpbyxybyxGYykpfWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LGFpKS5kaXN0YW5jZVRvKHQpfWdldEJvdW5kaW5nU3BoZXJlKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90Lm1ha2VFbXB0eSgpOih0aGlzLmdldENlbnRlcih0LmNlbnRlciksdC5yYWRpdXM9dGhpcy5nZXRTaXplKGFpKS5sZW5ndGgoKSouNSksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3RoaXM6KFdpWzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLFdpWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLFdpWzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLFdpWzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLFdpWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLFdpWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLFdpWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLFdpWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0RnJvbVBvaW50cyhXaSksdGhpcyl9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX1jb25zdCBXaT1bbmV3IFIsbmV3IFIsbmV3IFIsbmV3IFIsbmV3IFIsbmV3IFIsbmV3IFIsbmV3IFJdLGFpPW5ldyBSLE5jPW5ldyBtZSxubz1uZXcgUixpbz1uZXcgUixybz1uZXcgUix5cj1uZXcgUixfcj1uZXcgUixlcz1uZXcgUixFYT1uZXcgUixGYz1uZXcgUixCYz1uZXcgUixucz1uZXcgUjtmdW5jdGlvbiBNZChpLHQsZSxuLHIpe2ZvcihsZXQgcz0wLG89aS5sZW5ndGgtMztzPD1vO3MrPTMpe25zLmZyb21BcnJheShpLHMpO2NvbnN0IGE9ci54Kk1hdGguYWJzKG5zLngpK3IueSpNYXRoLmFicyhucy55KStyLnoqTWF0aC5hYnMobnMueiksbD10LmRvdChucyksYz1lLmRvdChucyksdT1uLmRvdChucyk7aWYoTWF0aC5tYXgoLU1hdGgubWF4KGwsYyx1KSxNYXRoLm1pbihsLGMsdSkpPmEpcmV0dXJuITF9cmV0dXJuITB9Y29uc3QgUkE9bmV3IG1lLFRhPW5ldyBSLGJkPW5ldyBSO2NsYXNzIHFle2NvbnN0cnVjdG9yKHQ9bmV3IFIsZT0tMSl7dGhpcy5pc1NwaGVyZT0hMCx0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO2UhPT12b2lkIDA/bi5jb3B5KGUpOlJBLnNldEZyb21Qb2ludHModCkuZ2V0Q2VudGVyKG4pO2xldCByPTA7Zm9yKGxldCBzPTAsbz10Lmxlbmd0aDtzPG87cysrKXI9TWF0aC5tYXgocixuLmRpc3RhbmNlVG9TcXVhcmVkKHRbc10pKTtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHIpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMucmFkaXVzPDB9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLDAsMCksdGhpcy5yYWRpdXM9LTEsdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnJhZGl1cyt0LnJhZGl1cztyZXR1cm4gdC5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpfWludGVyc2VjdHNQbGFuZSh0KXtyZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9Y2xhbXBQb2ludCh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7cmV0dXJuIGUuY29weSh0KSxuPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoZS5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGUubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpLGV9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPyh0Lm1ha2VFbXB0eSgpLHQpOih0LnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciksdC5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyksdCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQodCksdGhpcy5yYWRpdXM9dGhpcy5yYWRpdXMqdC5nZXRNYXhTY2FsZU9uQXhpcygpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNlbnRlci5hZGQodCksdGhpc31leHBhbmRCeVBvaW50KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPTAsdGhpcztUYS5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9VGEubGVuZ3RoU3EoKTtpZihlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzKXtjb25zdCBuPU1hdGguc3FydChlKSxyPShuLXRoaXMucmFkaXVzKSouNTt0aGlzLmNlbnRlci5hZGRTY2FsZWRWZWN0b3IoVGEsci9uKSx0aGlzLnJhZGl1cys9cn1yZXR1cm4gdGhpc311bmlvbih0KXtyZXR1cm4gdC5pc0VtcHR5KCk/dGhpczp0aGlzLmlzRW1wdHkoKT8odGhpcy5jb3B5KHQpLHRoaXMpOih0aGlzLmNlbnRlci5lcXVhbHModC5jZW50ZXIpPT09ITA/dGhpcy5yYWRpdXM9TWF0aC5tYXgodGhpcy5yYWRpdXMsdC5yYWRpdXMpOihiZC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5zZXRMZW5ndGgodC5yYWRpdXMpLHRoaXMuZXhwYW5kQnlQb2ludChUYS5jb3B5KHQuY2VudGVyKS5hZGQoYmQpKSx0aGlzLmV4cGFuZEJ5UG9pbnQoVGEuY29weSh0LmNlbnRlcikuc3ViKGJkKSkpLHRoaXMpfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0ICRpPW5ldyBSLHdkPW5ldyBSLE9jPW5ldyBSLHhyPW5ldyBSLEFkPW5ldyBSLHpjPW5ldyBSLEVkPW5ldyBSO2NsYXNzIHZye2NvbnN0cnVjdG9yKHQ9bmV3IFIsZT1uZXcgUigwLDAsLTEpKXt0aGlzLm9yaWdpbj10LHRoaXMuZGlyZWN0aW9uPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodCksdGhpcy5kaXJlY3Rpb24uY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodC5vcmlnaW4pLHRoaXMuZGlyZWN0aW9uLmNvcHkodC5kaXJlY3Rpb24pLHRoaXN9YXQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sdCl9bG9va0F0KHQpe3JldHVybiB0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLnN1Yih0aGlzLm9yaWdpbikubm9ybWFsaXplKCksdGhpc31yZWNhc3QodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodGhpcy5hdCh0LCRpKSksdGhpc31jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pO2NvbnN0IG49ZS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBuPDA/ZS5jb3B5KHRoaXMub3JpZ2luKTplLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixuKX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQpKX1kaXN0YW5jZVNxVG9Qb2ludCh0KXtjb25zdCBlPSRpLnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gZTwwP3RoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpOigkaS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sZSksJGkuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLG4scil7d2QuY29weSh0KS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoLjUpLE9jLmNvcHkoZSkuc3ViKHQpLm5vcm1hbGl6ZSgpLHhyLmNvcHkodGhpcy5vcmlnaW4pLnN1Yih3ZCk7Y29uc3Qgcz10LmRpc3RhbmNlVG8oZSkqLjUsbz0tdGhpcy5kaXJlY3Rpb24uZG90KE9jKSxhPXhyLmRvdCh0aGlzLmRpcmVjdGlvbiksbD0teHIuZG90KE9jKSxjPXhyLmxlbmd0aFNxKCksdT1NYXRoLmFicygxLW8qbyk7bGV0IGgsZixkLHA7aWYodT4wKWlmKGg9bypsLWEsZj1vKmEtbCxwPXMqdSxoPj0wKWlmKGY+PS1wKWlmKGY8PXApe2NvbnN0IHk9MS91O2gqPXksZio9eSxkPWgqKGgrbypmKzIqYSkrZioobypoK2YrMipsKStjfWVsc2UgZj1zLGg9TWF0aC5tYXgoMCwtKG8qZithKSksZD0taCpoK2YqKGYrMipsKStjO2Vsc2UgZj0tcyxoPU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LWgqaCtmKihmKzIqbCkrYztlbHNlIGY8PS1wPyhoPU1hdGgubWF4KDAsLSgtbypzK2EpKSxmPWg+MD8tczpNYXRoLm1pbihNYXRoLm1heCgtcywtbCkscyksZD0taCpoK2YqKGYrMipsKStjKTpmPD1wPyhoPTAsZj1NYXRoLm1pbihNYXRoLm1heCgtcywtbCkscyksZD1mKihmKzIqbCkrYyk6KGg9TWF0aC5tYXgoMCwtKG8qcythKSksZj1oPjA/czpNYXRoLm1pbihNYXRoLm1heCgtcywtbCkscyksZD0taCpoK2YqKGYrMipsKStjKTtlbHNlIGY9bz4wPy1zOnMsaD1NYXRoLm1heCgwLC0obypmK2EpKSxkPS1oKmgrZiooZisyKmwpK2M7cmV0dXJuIG4mJm4uY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGgpLHImJnIuY29weSh3ZCkuYWRkU2NhbGVkVmVjdG9yKE9jLGYpLGR9aW50ZXJzZWN0U3BoZXJlKHQsZSl7JGkuc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLm9yaWdpbik7Y29uc3Qgbj0kaS5kb3QodGhpcy5kaXJlY3Rpb24pLHI9JGkuZG90KCRpKS1uKm4scz10LnJhZGl1cyp0LnJhZGl1cztpZihyPnMpcmV0dXJuIG51bGw7Y29uc3Qgbz1NYXRoLnNxcnQocy1yKSxhPW4tbyxsPW4rbztyZXR1cm4gbDwwP251bGw6YTwwP3RoaXMuYXQobCxlKTp0aGlzLmF0KGEsZSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWRpc3RhbmNlVG9QbGFuZSh0KXtjb25zdCBlPXQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbik7aWYoZT09PTApcmV0dXJuIHQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT09PTA/MDpudWxsO2NvbnN0IG49LSh0aGlzLm9yaWdpbi5kb3QodC5ub3JtYWwpK3QuY29uc3RhbnQpL2U7cmV0dXJuIG4+PTA/bjpudWxsfWludGVyc2VjdFBsYW5lKHQsZSl7Y29uc3Qgbj10aGlzLmRpc3RhbmNlVG9QbGFuZSh0KTtyZXR1cm4gbj09PW51bGw/bnVsbDp0aGlzLmF0KG4sZSl9aW50ZXJzZWN0c1BsYW5lKHQpe2NvbnN0IGU9dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pO3JldHVybiBlPT09MHx8dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKSplPDB9aW50ZXJzZWN0Qm94KHQsZSl7bGV0IG4scixzLG8sYSxsO2NvbnN0IGM9MS90aGlzLmRpcmVjdGlvbi54LHU9MS90aGlzLmRpcmVjdGlvbi55LGg9MS90aGlzLmRpcmVjdGlvbi56LGY9dGhpcy5vcmlnaW47cmV0dXJuIGM+PTA/KG49KHQubWluLngtZi54KSpjLHI9KHQubWF4LngtZi54KSpjKToobj0odC5tYXgueC1mLngpKmMscj0odC5taW4ueC1mLngpKmMpLHU+PTA/KHM9KHQubWluLnktZi55KSp1LG89KHQubWF4LnktZi55KSp1KToocz0odC5tYXgueS1mLnkpKnUsbz0odC5taW4ueS1mLnkpKnUpLG4+b3x8cz5yfHwoKHM+bnx8aXNOYU4obikpJiYobj1zKSwobzxyfHxpc05hTihyKSkmJihyPW8pLGg+PTA/KGE9KHQubWluLnotZi56KSpoLGw9KHQubWF4LnotZi56KSpoKTooYT0odC5tYXguei1mLnopKmgsbD0odC5taW4uei1mLnopKmgpLG4+bHx8YT5yKXx8KChhPm58fG4hPT1uKSYmKG49YSksKGw8cnx8ciE9PXIpJiYocj1sKSxyPDApP251bGw6dGhpcy5hdChuPj0wP246cixlKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0aGlzLmludGVyc2VjdEJveCh0LCRpKSE9PW51bGx9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4scixzKXtBZC5zdWJWZWN0b3JzKGUsdCksemMuc3ViVmVjdG9ycyhuLHQpLEVkLmNyb3NzVmVjdG9ycyhBZCx6Yyk7bGV0IG89dGhpcy5kaXJlY3Rpb24uZG90KEVkKSxhO2lmKG8+MCl7aWYocilyZXR1cm4gbnVsbDthPTF9ZWxzZSBpZihvPDApYT0tMSxvPS1vO2Vsc2UgcmV0dXJuIG51bGw7eHIuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBsPWEqdGhpcy5kaXJlY3Rpb24uZG90KHpjLmNyb3NzVmVjdG9ycyh4cix6YykpO2lmKGw8MClyZXR1cm4gbnVsbDtjb25zdCBjPWEqdGhpcy5kaXJlY3Rpb24uZG90KEFkLmNyb3NzKHhyKSk7aWYoYzwwfHxsK2M+bylyZXR1cm4gbnVsbDtjb25zdCB1PS1hKnhyLmRvdChFZCk7cmV0dXJuIHU8MD9udWxsOnRoaXMuYXQodS9vLHMpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIFJ0e2NvbnN0cnVjdG9yKHQsZSxuLHIscyxvLGEsbCxjLHUsaCxmLGQscCx5LGcpe1J0LnByb3RvdHlwZS5pc01hdHJpeDQ9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scixzLG8sYSxsLGMsdSxoLGYsZCxwLHksZyl9c2V0KHQsZSxuLHIscyxvLGEsbCxjLHUsaCxmLGQscCx5LGcpe2NvbnN0IG09dGhpcy5lbGVtZW50cztyZXR1cm4gbVswXT10LG1bNF09ZSxtWzhdPW4sbVsxMl09cixtWzFdPXMsbVs1XT1vLG1bOV09YSxtWzEzXT1sLG1bMl09YyxtWzZdPXUsbVsxMF09aCxtWzE0XT1mLG1bM109ZCxtWzddPXAsbVsxMV09eSxtWzE1XT1nLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgUnQoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMiksdGhpc31tYWtlQmFzaXModCxlLG4pe3JldHVybiB0aGlzLnNldCh0LngsZS54LG4ueCwwLHQueSxlLnksbi55LDAsdC56LGUueixuLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLHI9MS9zby5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCkscz0xL3NvLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxvPTEvc28uc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qcixlWzFdPW5bMV0qcixlWzJdPW5bMl0qcixlWzNdPTAsZVs0XT1uWzRdKnMsZVs1XT1uWzVdKnMsZVs2XT1uWzZdKnMsZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxyPXQueSxzPXQueixvPU1hdGguY29zKG4pLGE9TWF0aC5zaW4obiksbD1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHIpLHU9TWF0aC5jb3MocyksaD1NYXRoLnNpbihzKTtpZih0Lm9yZGVyPT09IlhZWiIpe2NvbnN0IGY9byp1LGQ9bypoLHA9YSp1LHk9YSpoO2VbMF09bCp1LGVbNF09LWwqaCxlWzhdPWMsZVsxXT1kK3AqYyxlWzVdPWYteSpjLGVbOV09LWEqbCxlWzJdPXktZipjLGVbNl09cCtkKmMsZVsxMF09bypsfWVsc2UgaWYodC5vcmRlcj09PSJZWFoiKXtjb25zdCBmPWwqdSxkPWwqaCxwPWMqdSx5PWMqaDtlWzBdPWYreSphLGVbNF09cCphLWQsZVs4XT1vKmMsZVsxXT1vKmgsZVs1XT1vKnUsZVs5XT0tYSxlWzJdPWQqYS1wLGVbNl09eStmKmEsZVsxMF09bypsfWVsc2UgaWYodC5vcmRlcj09PSJaWFkiKXtjb25zdCBmPWwqdSxkPWwqaCxwPWMqdSx5PWMqaDtlWzBdPWYteSphLGVbNF09LW8qaCxlWzhdPXArZCphLGVbMV09ZCtwKmEsZVs1XT1vKnUsZVs5XT15LWYqYSxlWzJdPS1vKmMsZVs2XT1hLGVbMTBdPW8qbH1lbHNlIGlmKHQub3JkZXI9PT0iWllYIil7Y29uc3QgZj1vKnUsZD1vKmgscD1hKnUseT1hKmg7ZVswXT1sKnUsZVs0XT1wKmMtZCxlWzhdPWYqYyt5LGVbMV09bCpoLGVbNV09eSpjK2YsZVs5XT1kKmMtcCxlWzJdPS1jLGVbNl09YSpsLGVbMTBdPW8qbH1lbHNlIGlmKHQub3JkZXI9PT0iWVpYIil7Y29uc3QgZj1vKmwsZD1vKmMscD1hKmwseT1hKmM7ZVswXT1sKnUsZVs0XT15LWYqaCxlWzhdPXAqaCtkLGVbMV09aCxlWzVdPW8qdSxlWzldPS1hKnUsZVsyXT0tYyp1LGVbNl09ZCpoK3AsZVsxMF09Zi15Kmh9ZWxzZSBpZih0Lm9yZGVyPT09IlhaWSIpe2NvbnN0IGY9bypsLGQ9bypjLHA9YSpsLHk9YSpjO2VbMF09bCp1LGVbNF09LWgsZVs4XT1jKnUsZVsxXT1mKmgreSxlWzVdPW8qdSxlWzldPWQqaC1wLGVbMl09cCpoLWQsZVs2XT1hKnUsZVsxMF09eSpoK2Z9cmV0dXJuIGVbM109MCxlWzddPTAsZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMuY29tcG9zZShQQSx0LElBKX1sb29rQXQodCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cztyZXR1cm4gRm4uc3ViVmVjdG9ycyh0LGUpLEZuLmxlbmd0aFNxKCk9PT0wJiYoRm4uej0xKSxGbi5ub3JtYWxpemUoKSxTci5jcm9zc1ZlY3RvcnMobixGbiksU3IubGVuZ3RoU3EoKT09PTAmJihNYXRoLmFicyhuLnopPT09MT9Gbi54Kz0xZS00OkZuLnorPTFlLTQsRm4ubm9ybWFsaXplKCksU3IuY3Jvc3NWZWN0b3JzKG4sRm4pKSxTci5ub3JtYWxpemUoKSxrYy5jcm9zc1ZlY3RvcnMoRm4sU3IpLHJbMF09U3IueCxyWzRdPWtjLngscls4XT1Gbi54LHJbMV09U3IueSxyWzVdPWtjLnkscls5XT1Gbi55LHJbMl09U3IueixyWzZdPWtjLnosclsxMF09Rm4ueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxyPWUuZWxlbWVudHMscz10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bNF0sbD1uWzhdLGM9blsxMl0sdT1uWzFdLGg9bls1XSxmPW5bOV0sZD1uWzEzXSxwPW5bMl0seT1uWzZdLGc9blsxMF0sbT1uWzE0XSx2PW5bM10seD1uWzddLF89blsxMV0sTT1uWzE1XSxiPXJbMF0sQT1yWzRdLEU9cls4XSx3PXJbMTJdLFM9clsxXSxUPXJbNV0sRD1yWzldLEw9clsxM10sTj1yWzJdLEY9cls2XSxCPXJbMTBdLEc9clsxNF0saz1yWzNdLFE9cls3XSxjdD1yWzExXSxodD1yWzE1XTtyZXR1cm4gc1swXT1vKmIrYSpTK2wqTitjKmssc1s0XT1vKkErYSpUK2wqRitjKlEsc1s4XT1vKkUrYSpEK2wqQitjKmN0LHNbMTJdPW8qdythKkwrbCpHK2MqaHQsc1sxXT11KmIraCpTK2YqTitkKmssc1s1XT11KkEraCpUK2YqRitkKlEsc1s5XT11KkUraCpEK2YqQitkKmN0LHNbMTNdPXUqdytoKkwrZipHK2QqaHQsc1syXT1wKmIreSpTK2cqTittKmssc1s2XT1wKkEreSpUK2cqRittKlEsc1sxMF09cCpFK3kqRCtnKkIrbSpjdCxzWzE0XT1wKncreSpMK2cqRyttKmh0LHNbM109dipiK3gqUytfKk4rTSprLHNbN109dipBK3gqVCtfKkYrTSpRLHNbMTFdPXYqRSt4KkQrXypCK00qY3Qsc1sxNV09dip3K3gqTCtfKkcrTSpodCx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbNF0scj10WzhdLHM9dFsxMl0sbz10WzFdLGE9dFs1XSxsPXRbOV0sYz10WzEzXSx1PXRbMl0saD10WzZdLGY9dFsxMF0sZD10WzE0XSxwPXRbM10seT10WzddLGc9dFsxMV0sbT10WzE1XTtyZXR1cm4gcCooK3MqbCpoLXIqYypoLXMqYSpmK24qYypmK3IqYSpkLW4qbCpkKSt5KigrZSpsKmQtZSpjKmYrcypvKmYtcipvKmQrcipjKnUtcypsKnUpK2cqKCtlKmMqaC1lKmEqZC1zKm8qaCtuKm8qZCtzKmEqdS1uKmMqdSkrbSooLXIqYSp1LWUqbCpoK2UqYSpmK3IqbypoLW4qbypmK24qbCp1KX10cmFuc3Bvc2UoKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7bGV0IGU7cmV0dXJuIGU9dFsxXSx0WzFdPXRbNF0sdFs0XT1lLGU9dFsyXSx0WzJdPXRbOF0sdFs4XT1lLGU9dFs2XSx0WzZdPXRbOV0sdFs5XT1lLGU9dFszXSx0WzNdPXRbMTJdLHRbMTJdPWUsZT10WzddLHRbN109dFsxM10sdFsxM109ZSxlPXRbMTFdLHRbMTFdPXRbMTRdLHRbMTRdPWUsdGhpc31zZXRQb3NpdGlvbih0LGUsbil7Y29uc3Qgcj10aGlzLmVsZW1lbnRzO3JldHVybiB0LmlzVmVjdG9yMz8oclsxMl09dC54LHJbMTNdPXQueSxyWzE0XT10LnopOihyWzEyXT10LHJbMTNdPWUsclsxNF09biksdGhpc31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxyPXRbMl0scz10WzNdLG89dFs0XSxhPXRbNV0sbD10WzZdLGM9dFs3XSx1PXRbOF0saD10WzldLGY9dFsxMF0sZD10WzExXSxwPXRbMTJdLHk9dFsxM10sZz10WzE0XSxtPXRbMTVdLHY9aCpnKmMteSpmKmMreSpsKmQtYSpnKmQtaCpsKm0rYSpmKm0seD1wKmYqYy11KmcqYy1wKmwqZCtvKmcqZCt1KmwqbS1vKmYqbSxfPXUqeSpjLXAqaCpjK3AqYSpkLW8qeSpkLXUqYSptK28qaCptLE09cCpoKmwtdSp5KmwtcCphKmYrbyp5KmYrdSphKmctbypoKmcsYj1lKnYrbip4K3IqXytzKk07aWYoYj09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IEE9MS9iO3JldHVybiB0WzBdPXYqQSx0WzFdPSh5KmYqcy1oKmcqcy15KnIqZCtuKmcqZCtoKnIqbS1uKmYqbSkqQSx0WzJdPShhKmcqcy15Kmwqcyt5KnIqYy1uKmcqYy1hKnIqbStuKmwqbSkqQSx0WzNdPShoKmwqcy1hKmYqcy1oKnIqYytuKmYqYythKnIqZC1uKmwqZCkqQSx0WzRdPXgqQSx0WzVdPSh1Kmcqcy1wKmYqcytwKnIqZC1lKmcqZC11KnIqbStlKmYqbSkqQSx0WzZdPShwKmwqcy1vKmcqcy1wKnIqYytlKmcqYytvKnIqbS1lKmwqbSkqQSx0WzddPShvKmYqcy11Kmwqcyt1KnIqYy1lKmYqYy1vKnIqZCtlKmwqZCkqQSx0WzhdPV8qQSx0WzldPShwKmgqcy11Knkqcy1wKm4qZCtlKnkqZCt1Km4qbS1lKmgqbSkqQSx0WzEwXT0obyp5KnMtcCphKnMrcCpuKmMtZSp5KmMtbypuKm0rZSphKm0pKkEsdFsxMV09KHUqYSpzLW8qaCpzLXUqbipjK2UqaCpjK28qbipkLWUqYSpkKSpBLHRbMTJdPU0qQSx0WzEzXT0odSp5KnItcCpoKnIrcCpuKmYtZSp5KmYtdSpuKmcrZSpoKmcpKkEsdFsxNF09KHAqYSpyLW8qeSpyLXAqbipsK2UqeSpsK28qbipnLWUqYSpnKSpBLHRbMTVdPShvKmgqci11KmEqcit1Km4qbC1lKmgqbC1vKm4qZitlKmEqZikqQSx0aGlzfXNjYWxlKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxyPXQueSxzPXQuejtyZXR1cm4gZVswXSo9bixlWzRdKj1yLGVbOF0qPXMsZVsxXSo9bixlWzVdKj1yLGVbOV0qPXMsZVsyXSo9bixlWzZdKj1yLGVbMTBdKj1zLGVbM10qPW4sZVs3XSo9cixlWzExXSo9cyx0aGlzfWdldE1heFNjYWxlT25BeGlzKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0sbj10WzRdKnRbNF0rdFs1XSp0WzVdK3RbNl0qdFs2XSxyPXRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF07cmV0dXJuIE1hdGguc3FydChNYXRoLm1heChlLG4scikpfW1ha2VUcmFuc2xhdGlvbih0LGUsbil7cmV0dXJuIHQuaXNWZWN0b3IzP3RoaXMuc2V0KDEsMCwwLHQueCwwLDEsMCx0LnksMCwwLDEsdC56LDAsMCwwLDEpOnRoaXMuc2V0KDEsMCwwLHQsMCwxLDAsZSwwLDAsMSxuLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWCh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCxlLC1uLDAsMCxuLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblkodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLDAsbiwwLDAsMSwwLDAsLW4sMCxlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25aKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLDAsbixlLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uQXhpcyh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKSxzPTEtbixvPXQueCxhPXQueSxsPXQueixjPXMqbyx1PXMqYTtyZXR1cm4gdGhpcy5zZXQoYypvK24sYyphLXIqbCxjKmwrciphLDAsYyphK3IqbCx1KmErbix1KmwtcipvLDAsYypsLXIqYSx1KmwrcipvLHMqbCpsK24sMCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsMCxlLDAsMCwwLDAsbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNoZWFyKHQsZSxuLHIscyxvKXtyZXR1cm4gdGhpcy5zZXQoMSxuLHMsMCx0LDEsbywwLGUsciwxLDAsMCwwLDAsMSksdGhpc31jb21wb3NlKHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHMscz1lLl94LG89ZS5feSxhPWUuX3osbD1lLl93LGM9cytzLHU9bytvLGg9YSthLGY9cypjLGQ9cyp1LHA9cypoLHk9byp1LGc9bypoLG09YSpoLHY9bCpjLHg9bCp1LF89bCpoLE09bi54LGI9bi55LEE9bi56O3JldHVybiByWzBdPSgxLSh5K20pKSpNLHJbMV09KGQrXykqTSxyWzJdPShwLXgpKk0sclszXT0wLHJbNF09KGQtXykqYixyWzVdPSgxLShmK20pKSpiLHJbNl09KGcrdikqYixyWzddPTAscls4XT0ocCt4KSpBLHJbOV09KGctdikqQSxyWzEwXT0oMS0oZit5KSkqQSxyWzExXT0wLHJbMTJdPXQueCxyWzEzXT10LnksclsxNF09dC56LHJbMTVdPTEsdGhpc31kZWNvbXBvc2UodCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cztsZXQgcz1zby5zZXQoclswXSxyWzFdLHJbMl0pLmxlbmd0aCgpO2NvbnN0IG89c28uc2V0KHJbNF0scls1XSxyWzZdKS5sZW5ndGgoKSxhPXNvLnNldChyWzhdLHJbOV0sclsxMF0pLmxlbmd0aCgpO3RoaXMuZGV0ZXJtaW5hbnQoKTwwJiYocz0tcyksdC54PXJbMTJdLHQueT1yWzEzXSx0Lno9clsxNF0sbGkuY29weSh0aGlzKTtjb25zdCBjPTEvcyx1PTEvbyxoPTEvYTtyZXR1cm4gbGkuZWxlbWVudHNbMF0qPWMsbGkuZWxlbWVudHNbMV0qPWMsbGkuZWxlbWVudHNbMl0qPWMsbGkuZWxlbWVudHNbNF0qPXUsbGkuZWxlbWVudHNbNV0qPXUsbGkuZWxlbWVudHNbNl0qPXUsbGkuZWxlbWVudHNbOF0qPWgsbGkuZWxlbWVudHNbOV0qPWgsbGkuZWxlbWVudHNbMTBdKj1oLGUuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGxpKSxuLng9cyxuLnk9byxuLno9YSx0aGlzfW1ha2VQZXJzcGVjdGl2ZSh0LGUsbixyLHMsbyxhPUVpKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsYz0yKnMvKGUtdCksdT0yKnMvKG4tciksaD0oZSt0KS8oZS10KSxmPShuK3IpLyhuLXIpO2xldCBkLHA7aWYoYT09PUVpKWQ9LShvK3MpLyhvLXMpLHA9LTIqbypzLyhvLXMpO2Vsc2UgaWYoYT09PWJhKWQ9LW8vKG8tcykscD0tbypzLyhvLXMpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBsWzBdPWMsbFs0XT0wLGxbOF09aCxsWzEyXT0wLGxbMV09MCxsWzVdPXUsbFs5XT1mLGxbMTNdPTAsbFsyXT0wLGxbNl09MCxsWzEwXT1kLGxbMTRdPXAsbFszXT0wLGxbN109MCxsWzExXT0tMSxsWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixyLHMsbyxhPUVpKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsYz0xLyhlLXQpLHU9MS8obi1yKSxoPTEvKG8tcyksZj0oZSt0KSpjLGQ9KG4rcikqdTtsZXQgcCx5O2lmKGE9PT1FaSlwPShvK3MpKmgseT0tMipoO2Vsc2UgaWYoYT09PWJhKXA9cypoLHk9LTEqaDtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGxbMF09MipjLGxbNF09MCxsWzhdPTAsbFsxMl09LWYsbFsxXT0wLGxbNV09Mip1LGxbOV09MCxsWzEzXT0tZCxsWzJdPTAsbFs2XT0wLGxbMTBdPXksbFsxNF09LXAsbFszXT0wLGxbN109MCxsWzExXT0wLGxbMTVdPTEsdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHI9MDtyPDE2O3IrKylpZihlW3JdIT09bltyXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHRbZSs5XT1uWzldLHRbZSsxMF09blsxMF0sdFtlKzExXT1uWzExXSx0W2UrMTJdPW5bMTJdLHRbZSsxM109blsxM10sdFtlKzE0XT1uWzE0XSx0W2UrMTVdPW5bMTVdLHR9fWNvbnN0IHNvPW5ldyBSLGxpPW5ldyBSdCxQQT1uZXcgUigwLDAsMCksSUE9bmV3IFIoMSwxLDEpLFNyPW5ldyBSLGtjPW5ldyBSLEZuPW5ldyBSLHd5PW5ldyBSdCxBeT1uZXcgTW47Y2xhc3MgQm57Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj1Cbi5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cn1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKHQpe3RoaXMuX29yZGVyPXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixyPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10Ll94LHRoaXMuX3k9dC5feSx0aGlzLl96PXQuX3osdGhpcy5fb3JkZXI9dC5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsZT10aGlzLl9vcmRlcixuPSEwKXtjb25zdCByPXQuZWxlbWVudHMscz1yWzBdLG89cls0XSxhPXJbOF0sbD1yWzFdLGM9cls1XSx1PXJbOV0saD1yWzJdLGY9cls2XSxkPXJbMTBdO3N3aXRjaChlKXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oSHQoYSwtMSwxKSksTWF0aC5hYnMoYSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtdSxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8scykpOih0aGlzLl94PU1hdGguYXRhbjIoZixjKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtSHQodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihsLGMpKToodGhpcy5feT1NYXRoLmF0YW4yKC1oLHMpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKEh0KGYsLTEsMSkpLE1hdGguYWJzKGYpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLWgsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLGMpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihsLHMpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLUh0KGgsLTEsMSkpLE1hdGguYWJzKGgpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixkKSx0aGlzLl96PU1hdGguYXRhbjIobCxzKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLW8sYykpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihIdChsLC0xLDEpKSxNYXRoLmFicyhsKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC11LGMpLHRoaXMuX3k9TWF0aC5hdGFuMigtaCxzKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1IdChvLC0xLDEpKSxNYXRoLmFicyhvKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsYyksdGhpcy5feT1NYXRoLmF0YW4yKGEscykpOih0aGlzLl94PU1hdGguYXRhbjIoLXUsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK2UpfXJldHVybiB0aGlzLl9vcmRlcj1lLG49PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24odCxlLG4pe3JldHVybiB3eS5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh3eSxlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIEF5LnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKEF5LHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHRbM10hPT12b2lkIDAmJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fUJuLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgVmN7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPSgxPDx0fDApPj4+MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybih0aGlzLm1hc2smdC5tYXNrKSE9PTB9aXNFbmFibGVkKHQpe3JldHVybih0aGlzLm1hc2smKDE8PHR8MCkpIT09MH19bGV0IExBPTA7Y29uc3QgRXk9bmV3IFIsb289bmV3IE1uLFhpPW5ldyBSdCxHYz1uZXcgUixDYT1uZXcgUixEQT1uZXcgUixVQT1uZXcgTW4sVHk9bmV3IFIoMSwwLDApLEN5PW5ldyBSKDAsMSwwKSxSeT1uZXcgUigwLDAsMSksUHk9e3R5cGU6ImFkZGVkIn0sTkE9e3R5cGU6InJlbW92ZWQifSxhbz17dHlwZToiY2hpbGRhZGRlZCIsY2hpbGQ6bnVsbH0sVGQ9e3R5cGU6ImNoaWxkcmVtb3ZlZCIsY2hpbGQ6bnVsbH07Y2xhc3MgYWUgZXh0ZW5kcyBUaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc09iamVjdDNEPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkxBKyt9KSx0aGlzLnV1aWQ9Tm4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9YWUuREVGQVVMVF9VUC5jbG9uZSgpO2NvbnN0IHQ9bmV3IFIsZT1uZXcgQm4sbj1uZXcgTW4scj1uZXcgUigxLDEsMSk7ZnVuY3Rpb24gcygpe24uc2V0RnJvbUV1bGVyKGUsITEpfWZ1bmN0aW9uIG8oKXtlLnNldEZyb21RdWF0ZXJuaW9uKG4sdm9pZCAwLCExKX1lLl9vbkNoYW5nZShzKSxuLl9vbkNoYW5nZShvKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpyfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBSdH0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgV3R9fSksdGhpcy5tYXRyaXg9bmV3IFJ0LHRoaXMubWF0cml4V29ybGQ9bmV3IFJ0LHRoaXMubWF0cml4QXV0b1VwZGF0ZT1hZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT1hZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdGhpcy5sYXllcnM9bmV3IFZjLHRoaXMudmlzaWJsZT0hMCx0aGlzLmNhc3RTaGFkb3c9ITEsdGhpcy5yZWNlaXZlU2hhZG93PSExLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnJlbmRlck9yZGVyPTAsdGhpcy5hbmltYXRpb25zPVtdLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVTaGFkb3coKXt9b25BZnRlclNoYWRvdygpe31vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIG9vLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkob28pLHRoaXN9cm90YXRlT25Xb3JsZEF4aXModCxlKXtyZXR1cm4gb28uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShvbyksdGhpc31yb3RhdGVYKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhUeSx0KX1yb3RhdGVZKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhDeSx0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhSeSx0KX10cmFuc2xhdGVPbkF4aXModCxlKXtyZXR1cm4gRXkuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSx0aGlzLnBvc2l0aW9uLmFkZChFeS5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhUeSx0KX10cmFuc2xhdGVZKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhDeSx0KX10cmFuc2xhdGVaKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhSeSx0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQoWGkuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSl9bG9va0F0KHQsZSxuKXt0LmlzVmVjdG9yMz9HYy5jb3B5KHQpOkdjLnNldCh0LGUsbik7Y29uc3Qgcj10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxDYS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCksdGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P1hpLmxvb2tBdChDYSxHYyx0aGlzLnVwKTpYaS5sb29rQXQoR2MsQ2EsdGhpcy51cCksdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChYaSksciYmKFhpLmV4dHJhY3RSb3RhdGlvbihyLm1hdHJpeFdvcmxkKSxvby5zZXRGcm9tUm90YXRpb25NYXRyaXgoWGkpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShvby5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdGhpcy5hZGQoYXJndW1lbnRzW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXM/KGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsdCksdGhpcyk6KHQmJnQuaXNPYmplY3QzRD8odC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KFB5KSxhby5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChhbyksYW8uY2hpbGQ9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsdCksdGhpcyl9cmVtb3ZlKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0aGlzLnJlbW92ZShhcmd1bWVudHNbbl0pO3JldHVybiB0aGlzfWNvbnN0IGU9dGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpO3JldHVybiBlIT09LTEmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KE5BKSxUZC5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChUZCksVGQuY2hpbGQ9bnVsbCksdGhpc31yZW1vdmVGcm9tUGFyZW50KCl7Y29uc3QgdD10aGlzLnBhcmVudDtyZXR1cm4gdCE9PW51bGwmJnQucmVtb3ZlKHRoaXMpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5yZW1vdmUoLi4udGhpcy5jaGlsZHJlbil9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxYaS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLHQucGFyZW50IT09bnVsbCYmKHQucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxYaS5tdWx0aXBseSh0LnBhcmVudC5tYXRyaXhXb3JsZCkpLHQuYXBwbHlNYXRyaXg0KFhpKSx0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0LmRpc3BhdGNoRXZlbnQoUHkpLGFvLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KGFvKSxhby5jaGlsZD1udWxsLHRoaXN9Z2V0T2JqZWN0QnlJZCh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsdCl9Z2V0T2JqZWN0QnlOYW1lKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLHQpfWdldE9iamVjdEJ5UHJvcGVydHkodCxlKXtpZih0aGlzW3RdPT09ZSlyZXR1cm4gdGhpcztmb3IobGV0IG49MCxyPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO248cjtuKyspe2NvbnN0IG89dGhpcy5jaGlsZHJlbltuXS5nZXRPYmplY3RCeVByb3BlcnR5KHQsZSk7aWYobyE9PXZvaWQgMClyZXR1cm4gb319Z2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG49W10pe3RoaXNbdF09PT1lJiZuLnB1c2godGhpcyk7Y29uc3Qgcj10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLG89ci5sZW5ndGg7czxvO3MrKylyW3NdLmdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuKTtyZXR1cm4gbn1nZXRXb3JsZFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKENhLHQsREEpLHR9Z2V0V29ybGRTY2FsZSh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoQ2EsVUEsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYodGhpcy52aXNpYmxlPT09ITEpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O2UhPT1udWxsJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJih0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiYodGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHQ9ITApO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS51cGRhdGVNYXRyaXhXb3JsZCh0KX11cGRhdGVXb3JsZE1hdHJpeCh0LGUpe2NvbnN0IG49dGhpcy5wYXJlbnQ7aWYodD09PSEwJiZuIT09bnVsbCYmbi51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSxlPT09ITApe2NvbnN0IHI9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHM9MCxvPXIubGVuZ3RoO3M8bztzKyspcltzXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIixuPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNix0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IHI9e307ci51dWlkPXRoaXMudXVpZCxyLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYoci5uYW1lPXRoaXMubmFtZSksdGhpcy5jYXN0U2hhZG93PT09ITAmJihyLmNhc3RTaGFkb3c9ITApLHRoaXMucmVjZWl2ZVNoYWRvdz09PSEwJiYoci5yZWNlaXZlU2hhZG93PSEwKSx0aGlzLnZpc2libGU9PT0hMSYmKHIudmlzaWJsZT0hMSksdGhpcy5mcnVzdHVtQ3VsbGVkPT09ITEmJihyLmZydXN0dW1DdWxsZWQ9ITEpLHRoaXMucmVuZGVyT3JkZXIhPT0wJiYoci5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHIudXNlckRhdGE9dGhpcy51c2VyRGF0YSksci5sYXllcnM9dGhpcy5sYXllcnMubWFzayxyLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksci51cD10aGlzLnVwLnRvQXJyYXkoKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9PT0hMSYmKHIubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihyLnR5cGU9Ikluc3RhbmNlZE1lc2giLHIuY291bnQ9dGhpcy5jb3VudCxyLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksdGhpcy5pbnN0YW5jZUNvbG9yIT09bnVsbCYmKHIuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzQmF0Y2hlZE1lc2gmJihyLnR5cGU9IkJhdGNoZWRNZXNoIixyLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLHIuc29ydE9iamVjdHM9dGhpcy5zb3J0T2JqZWN0cyxyLmRyYXdSYW5nZXM9dGhpcy5fZHJhd1JhbmdlcyxyLnJlc2VydmVkUmFuZ2VzPXRoaXMuX3Jlc2VydmVkUmFuZ2VzLHIudmlzaWJpbGl0eT10aGlzLl92aXNpYmlsaXR5LHIuYWN0aXZlPXRoaXMuX2FjdGl2ZSxyLmJvdW5kcz10aGlzLl9ib3VuZHMubWFwKGE9Pih7Ym94SW5pdGlhbGl6ZWQ6YS5ib3hJbml0aWFsaXplZCxib3hNaW46YS5ib3gubWluLnRvQXJyYXkoKSxib3hNYXg6YS5ib3gubWF4LnRvQXJyYXkoKSxzcGhlcmVJbml0aWFsaXplZDphLnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZVJhZGl1czphLnNwaGVyZS5yYWRpdXMsc3BoZXJlQ2VudGVyOmEuc3BoZXJlLmNlbnRlci50b0FycmF5KCl9KSksci5tYXhJbnN0YW5jZUNvdW50PXRoaXMuX21heEluc3RhbmNlQ291bnQsci5tYXhWZXJ0ZXhDb3VudD10aGlzLl9tYXhWZXJ0ZXhDb3VudCxyLm1heEluZGV4Q291bnQ9dGhpcy5fbWF4SW5kZXhDb3VudCxyLmdlb21ldHJ5SW5pdGlhbGl6ZWQ9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCxyLmdlb21ldHJ5Q291bnQ9dGhpcy5fZ2VvbWV0cnlDb3VudCxyLm1hdHJpY2VzVGV4dHVyZT10aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKHQpLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYoci5jb2xvcnNUZXh0dXJlPXRoaXMuX2NvbG9yc1RleHR1cmUudG9KU09OKHQpKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHIuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjpyLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCkscmFkaXVzOnIuYm91bmRpbmdTcGhlcmUucmFkaXVzfSksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJihyLmJvdW5kaW5nQm94PXttaW46ci5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLG1heDpyLmJvdW5kaW5nQm94Lm1heC50b0FycmF5KCl9KSk7ZnVuY3Rpb24gcyhhLGwpe3JldHVybiBhW2wudXVpZF09PT12b2lkIDAmJihhW2wudXVpZF09bC50b0pTT04odCkpLGwudXVpZH1pZih0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/ci5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYoci5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiZ0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSE9PSEwJiYoci5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7ci5nZW9tZXRyeT1zKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZihhIT09dm9pZCAwJiZhLnNoYXBlcyE9PXZvaWQgMCl7Y29uc3QgbD1hLnNoYXBlcztpZihBcnJheS5pc0FycmF5KGwpKWZvcihsZXQgYz0wLHU9bC5sZW5ndGg7Yzx1O2MrKyl7Y29uc3QgaD1sW2NdO3ModC5zaGFwZXMsaCl9ZWxzZSBzKHQuc2hhcGVzLGwpfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihyLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUsci5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdGhpcy5za2VsZXRvbiE9PXZvaWQgMCYmKHModC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbiksci5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx0aGlzLm1hdGVyaWFsIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGE9W107Zm9yKGxldCBsPTAsYz10aGlzLm1hdGVyaWFsLmxlbmd0aDtsPGM7bCsrKWEucHVzaChzKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbbF0pKTtyLm1hdGVyaWFsPWF9ZWxzZSByLm1hdGVyaWFsPXModC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7ci5jaGlsZHJlbj1bXTtmb3IobGV0IGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2ErKylyLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlblthXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3IuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGE9MDthPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7YSsrKXtjb25zdCBsPXRoaXMuYW5pbWF0aW9uc1thXTtyLmFuaW1hdGlvbnMucHVzaChzKHQuYW5pbWF0aW9ucyxsKSl9fWlmKGUpe2NvbnN0IGE9byh0Lmdlb21ldHJpZXMpLGw9byh0Lm1hdGVyaWFscyksYz1vKHQudGV4dHVyZXMpLHU9byh0LmltYWdlcyksaD1vKHQuc2hhcGVzKSxmPW8odC5za2VsZXRvbnMpLGQ9byh0LmFuaW1hdGlvbnMpLHA9byh0Lm5vZGVzKTthLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWEpLGwubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1sKSxjLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1jKSx1Lmxlbmd0aD4wJiYobi5pbWFnZXM9dSksaC5sZW5ndGg+MCYmKG4uc2hhcGVzPWgpLGYubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1mKSxkLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWQpLHAubGVuZ3RoPjAmJihuLm5vZGVzPXApfXJldHVybiBuLm9iamVjdD1yLG47ZnVuY3Rpb24gbyhhKXtjb25zdCBsPVtdO2Zvcihjb25zdCBjIGluIGEpe2NvbnN0IHU9YVtjXTtkZWxldGUgdS5tZXRhZGF0YSxsLnB1c2godSl9cmV0dXJuIGx9fWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSxlPT09ITApZm9yKGxldCBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGlsZHJlbltuXTt0aGlzLmFkZChyLmNsb25lKCkpfXJldHVybiB0aGlzfX1hZS5ERUZBVUxUX1VQPW5ldyBSKDAsMSwwKSxhZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxhZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBjaT1uZXcgUixxaT1uZXcgUixDZD1uZXcgUixZaT1uZXcgUixsbz1uZXcgUixjbz1uZXcgUixJeT1uZXcgUixSZD1uZXcgUixQZD1uZXcgUixJZD1uZXcgUixMZD1uZXcgUXQsRGQ9bmV3IFF0LFVkPW5ldyBRdDtjbGFzcyBfZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIsbj1uZXcgUil7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbCh0LGUsbixyKXtyLnN1YlZlY3RvcnMobixlKSxjaS5zdWJWZWN0b3JzKHQsZSksci5jcm9zcyhjaSk7Y29uc3Qgcz1yLmxlbmd0aFNxKCk7cmV0dXJuIHM+MD9yLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHMpKTpyLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixyLHMpe2NpLnN1YlZlY3RvcnMocixlKSxxaS5zdWJWZWN0b3JzKG4sZSksQ2Quc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89Y2kuZG90KGNpKSxhPWNpLmRvdChxaSksbD1jaS5kb3QoQ2QpLGM9cWkuZG90KHFpKSx1PXFpLmRvdChDZCksaD1vKmMtYSphO2lmKGg9PT0wKXJldHVybiBzLnNldCgwLDAsMCksbnVsbDtjb25zdCBmPTEvaCxkPShjKmwtYSp1KSpmLHA9KG8qdS1hKmwpKmY7cmV0dXJuIHMuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4scil7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHIsWWkpPT09bnVsbD8hMTpZaS54Pj0wJiZZaS55Pj0wJiZZaS54K1lpLnk8PTF9c3RhdGljIGdldEludGVycG9sYXRpb24odCxlLG4scixzLG8sYSxsKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scixZaSk9PT1udWxsPyhsLng9MCxsLnk9MCwieiJpbiBsJiYobC56PTApLCJ3ImluIGwmJihsLnc9MCksbnVsbCk6KGwuc2V0U2NhbGFyKDApLGwuYWRkU2NhbGVkVmVjdG9yKHMsWWkueCksbC5hZGRTY2FsZWRWZWN0b3IobyxZaS55KSxsLmFkZFNjYWxlZFZlY3RvcihhLFlpLnopLGwpfXN0YXRpYyBnZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUodCxlLG4scixzLG8pe3JldHVybiBMZC5zZXRTY2FsYXIoMCksRGQuc2V0U2NhbGFyKDApLFVkLnNldFNjYWxhcigwKSxMZC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksRGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLFVkLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSxvLnNldFNjYWxhcigwKSxvLmFkZFNjYWxlZFZlY3RvcihMZCxzLngpLG8uYWRkU2NhbGVkVmVjdG9yKERkLHMueSksby5hZGRTY2FsZWRWZWN0b3IoVWQscy56KSxvfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLHIpe3JldHVybiBjaS5zdWJWZWN0b3JzKG4sZSkscWkuc3ViVmVjdG9ycyh0LGUpLGNpLmNyb3NzKHFpKS5kb3Qocik8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLHIpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W3JdKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxuLHIpe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gY2kuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxxaS5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLGNpLmNyb3NzKHFpKS5sZW5ndGgoKSouNX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBfZS5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gX2UuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0SW50ZXJwb2xhdGlvbih0LGUsbixyLHMpe3JldHVybiBfZS5nZXRJbnRlcnBvbGF0aW9uKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLHIscyl9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gX2UuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBfZS5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuYSxyPXRoaXMuYixzPXRoaXMuYztsZXQgbyxhO2xvLnN1YlZlY3RvcnMocixuKSxjby5zdWJWZWN0b3JzKHMsbiksUmQuc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGw9bG8uZG90KFJkKSxjPWNvLmRvdChSZCk7aWYobDw9MCYmYzw9MClyZXR1cm4gZS5jb3B5KG4pO1BkLnN1YlZlY3RvcnModCxyKTtjb25zdCB1PWxvLmRvdChQZCksaD1jby5kb3QoUGQpO2lmKHU+PTAmJmg8PXUpcmV0dXJuIGUuY29weShyKTtjb25zdCBmPWwqaC11KmM7aWYoZjw9MCYmbD49MCYmdTw9MClyZXR1cm4gbz1sLyhsLXUpLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IobG8sbyk7SWQuc3ViVmVjdG9ycyh0LHMpO2NvbnN0IGQ9bG8uZG90KElkKSxwPWNvLmRvdChJZCk7aWYocD49MCYmZDw9cClyZXR1cm4gZS5jb3B5KHMpO2NvbnN0IHk9ZCpjLWwqcDtpZih5PD0wJiZjPj0wJiZwPD0wKXJldHVybiBhPWMvKGMtcCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihjbyxhKTtjb25zdCBnPXUqcC1kKmg7aWYoZzw9MCYmaC11Pj0wJiZkLXA+PTApcmV0dXJuIEl5LnN1YlZlY3RvcnMocyxyKSxhPShoLXUpLyhoLXUrKGQtcCkpLGUuY29weShyKS5hZGRTY2FsZWRWZWN0b3IoSXksYSk7Y29uc3QgbT0xLyhnK3krZik7cmV0dXJuIG89eSptLGE9ZiptLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IobG8sbykuYWRkU2NhbGVkVmVjdG9yKGNvLGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgTHk9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sTXI9e2g6MCxzOjAsbDowfSxIYz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIE5kKGksdCxlKXtyZXR1cm4gZTwwJiYoZSs9MSksZT4xJiYoZS09MSksZTwxLzY/aSsodC1pKSo2KmU6ZTwxLzI/dDplPDIvMz9pKyh0LWkpKjYqKDIvMy1lKTppfWxldCB4dD1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZihlPT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCByPXQ7ciYmci5pc0NvbG9yP3RoaXMuY29weShyKTp0eXBlb2Ygcj09Im51bWJlciI/dGhpcy5zZXRIZXgocik6dHlwZW9mIHI9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKHIpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPVNuKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0odCYyNTUpLzI1NSxyZS50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scj1yZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLHJlLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxyKSx0aGlzfXNldEhTTCh0LGUsbixyPXJlLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PXlkKHQsMSksZT1IdChlLDAsMSksbj1IdChuLDAsMSksZT09PTApdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IHM9bjw9LjU/biooMStlKTpuK2UtbiplLG89MipuLXM7dGhpcy5yPU5kKG8scyx0KzEvMyksdGhpcy5nPU5kKG8scyx0KSx0aGlzLmI9TmQobyxzLHQtMS8zKX1yZXR1cm4gcmUudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLHIpLHRoaXN9c2V0U3R5bGUodCxlPVNuKXtmdW5jdGlvbiBuKHMpe3MhPT12b2lkIDAmJnBhcnNlRmxvYXQocyk8MSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrdCsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgcjtpZihyPS9eKFx3KylcKChbXlwpXSopXCkvLmV4ZWModCkpe2xldCBzO2NvbnN0IG89clsxXSxhPXJbMl07c3dpdGNoKG8pe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHM9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigyNTUscGFyc2VJbnQoc1sxXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoc1syXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoc1szXSwxMCkpLzI1NSxlKTtpZihzPS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4oc1s0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbMV0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbMl0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbM10sMTApKS8xMDAsZSk7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYocz0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldEhTTChwYXJzZUZsb2F0KHNbMV0pLzM2MCxwYXJzZUZsb2F0KHNbMl0pLzEwMCxwYXJzZUZsb2F0KHNbM10pLzEwMCxlKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgIit0KX19ZWxzZSBpZihyPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSl7Y29uc3Qgcz1yWzFdLG89cy5sZW5ndGg7aWYobz09PTMpcmV0dXJuIHRoaXMuc2V0UkdCKHBhcnNlSW50KHMuY2hhckF0KDApLDE2KS8xNSxwYXJzZUludChzLmNoYXJBdCgxKSwxNikvMTUscGFyc2VJbnQocy5jaGFyQXQoMiksMTYpLzE1LGUpO2lmKG89PT02KXJldHVybiB0aGlzLnNldEhleChwYXJzZUludChzLDE2KSxlKTtjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBJbnZhbGlkIGhleCBjb2xvciAiK3QpfWVsc2UgaWYodCYmdC5sZW5ndGg+MClyZXR1cm4gdGhpcy5zZXRDb2xvck5hbWUodCxlKTtyZXR1cm4gdGhpc31zZXRDb2xvck5hbWUodCxlPVNuKXtjb25zdCBuPUx5W3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIG4hPT12b2lkIDA/dGhpcy5zZXRIZXgobixlKTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9SGkodC5yKSx0aGlzLmc9SGkodC5nKSx0aGlzLmI9SGkodC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj10byh0LnIpLHRoaXMuZz10byh0LmcpLHRoaXMuYj10byh0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCh0PVNuKXtyZXR1cm4gcmUuZnJvbVdvcmtpbmdDb2xvclNwYWNlKEtlLmNvcHkodGhpcyksdCksTWF0aC5yb3VuZChIdChLZS5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoSHQoS2UuZyoyNTUsMCwyNTUpKSoyNTYrTWF0aC5yb3VuZChIdChLZS5iKjI1NSwwLDI1NSkpfWdldEhleFN0cmluZyh0PVNuKXtyZXR1cm4oIjAwMDAwMCIrdGhpcy5nZXRIZXgodCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Z2V0SFNMKHQsZT1yZS53b3JraW5nQ29sb3JTcGFjZSl7cmUuZnJvbVdvcmtpbmdDb2xvclNwYWNlKEtlLmNvcHkodGhpcyksZSk7Y29uc3Qgbj1LZS5yLHI9S2UuZyxzPUtlLmIsbz1NYXRoLm1heChuLHIscyksYT1NYXRoLm1pbihuLHIscyk7bGV0IGwsYztjb25zdCB1PShhK28pLzI7aWYoYT09PW8pbD0wLGM9MDtlbHNle2NvbnN0IGg9by1hO3N3aXRjaChjPXU8PS41P2gvKG8rYSk6aC8oMi1vLWEpLG8pe2Nhc2UgbjpsPShyLXMpL2grKHI8cz82OjApO2JyZWFrO2Nhc2UgcjpsPShzLW4pL2grMjticmVhaztjYXNlIHM6bD0obi1yKS9oKzQ7YnJlYWt9bC89Nn1yZXR1cm4gdC5oPWwsdC5zPWMsdC5sPXUsdH1nZXRSR0IodCxlPXJlLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gcmUuZnJvbVdvcmtpbmdDb2xvclNwYWNlKEtlLmNvcHkodGhpcyksZSksdC5yPUtlLnIsdC5nPUtlLmcsdC5iPUtlLmIsdH1nZXRTdHlsZSh0PVNuKXtyZS5mcm9tV29ya2luZ0NvbG9yU3BhY2UoS2UuY29weSh0aGlzKSx0KTtjb25zdCBlPUtlLnIsbj1LZS5nLHI9S2UuYjtyZXR1cm4gdCE9PVNuP2Bjb2xvcigke3R9ICR7ZS50b0ZpeGVkKDMpfSAke24udG9GaXhlZCgzKX0gJHtyLnRvRml4ZWQoMyl9KWA6YHJnYigke01hdGgucm91bmQoZSoyNTUpfSwke01hdGgucm91bmQobioyNTUpfSwke01hdGgucm91bmQocioyNTUpfSlgfW9mZnNldEhTTCh0LGUsbil7cmV0dXJuIHRoaXMuZ2V0SFNMKE1yKSx0aGlzLnNldEhTTChNci5oK3QsTXIucytlLE1yLmwrbil9YWRkKHQpe3JldHVybiB0aGlzLnIrPXQucix0aGlzLmcrPXQuZyx0aGlzLmIrPXQuYix0aGlzfWFkZENvbG9ycyh0LGUpe3JldHVybiB0aGlzLnI9dC5yK2Uucix0aGlzLmc9dC5nK2UuZyx0aGlzLmI9dC5iK2UuYix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKz10LHRoaXMuZys9dCx0aGlzLmIrPXQsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci10LnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy10LmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi10LmIpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMucio9dC5yLHRoaXMuZyo9dC5nLHRoaXMuYio9dC5iLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMucio9dCx0aGlzLmcqPXQsdGhpcy5iKj10LHRoaXN9bGVycCh0LGUpe3JldHVybiB0aGlzLnIrPSh0LnItdGhpcy5yKSplLHRoaXMuZys9KHQuZy10aGlzLmcpKmUsdGhpcy5iKz0odC5iLXRoaXMuYikqZSx0aGlzfWxlcnBDb2xvcnModCxlLG4pe3JldHVybiB0aGlzLnI9dC5yKyhlLnItdC5yKSpuLHRoaXMuZz10LmcrKGUuZy10LmcpKm4sdGhpcy5iPXQuYisoZS5iLXQuYikqbix0aGlzfWxlcnBIU0wodCxlKXt0aGlzLmdldEhTTChNciksdC5nZXRIU0woSGMpO2NvbnN0IG49d2EoTXIuaCxIYy5oLGUpLHI9d2EoTXIucyxIYy5zLGUpLHM9d2EoTXIubCxIYy5sLGUpO3JldHVybiB0aGlzLnNldEhTTChuLHIscyksdGhpc31zZXRGcm9tVmVjdG9yMyh0KXtyZXR1cm4gdGhpcy5yPXQueCx0aGlzLmc9dC55LHRoaXMuYj10LnosdGhpc31hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLnIsbj10aGlzLmcscj10aGlzLmIscz10LmVsZW1lbnRzO3JldHVybiB0aGlzLnI9c1swXSplK3NbM10qbitzWzZdKnIsdGhpcy5nPXNbMV0qZStzWzRdKm4rc1s3XSpyLHRoaXMuYj1zWzJdKmUrc1s1XSpuK3NbOF0qcix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5yPT09dGhpcy5yJiZ0Lmc9PT10aGlzLmcmJnQuYj09PXRoaXMuYn1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLnI9dFtlXSx0aGlzLmc9dFtlKzFdLHRoaXMuYj10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLnIsdFtlKzFdPXRoaXMuZyx0W2UrMl09dGhpcy5iLHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLnI9dC5nZXRYKGUpLHRoaXMuZz10LmdldFkoZSksdGhpcy5iPXQuZ2V0WihlKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLmdldEhleCgpfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMucix5aWVsZCB0aGlzLmcseWllbGQgdGhpcy5ifX07Y29uc3QgS2U9bmV3IHh0O3h0Lk5BTUVTPUx5O2xldCBGQT0wO2NsYXNzIFFlIGV4dGVuZHMgVGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNNYXRlcmlhbD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpGQSsrfSksdGhpcy51dWlkPU5uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iTWF0ZXJpYWwiLHRoaXMuYmxlbmRpbmc9V3IsdGhpcy5zaWRlPXNpLHRoaXMudmVydGV4Q29sb3JzPSExLHRoaXMub3BhY2l0eT0xLHRoaXMudHJhbnNwYXJlbnQ9ITEsdGhpcy5hbHBoYUhhc2g9ITEsdGhpcy5ibGVuZFNyYz1IbCx0aGlzLmJsZW5kRHN0PVdsLHRoaXMuYmxlbmRFcXVhdGlvbj1wcix0aGlzLmJsZW5kU3JjQWxwaGE9bnVsbCx0aGlzLmJsZW5kRHN0QWxwaGE9bnVsbCx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1udWxsLHRoaXMuYmxlbmRDb2xvcj1uZXcgeHQoMCwwLDApLHRoaXMuYmxlbmRBbHBoYT0wLHRoaXMuZGVwdGhGdW5jPSRyLHRoaXMuZGVwdGhUZXN0PSEwLHRoaXMuZGVwdGhXcml0ZT0hMCx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9MjU1LHRoaXMuc3RlbmNpbEZ1bmM9cGQsdGhpcy5zdGVuY2lsUmVmPTAsdGhpcy5zdGVuY2lsRnVuY01hc2s9MjU1LHRoaXMuc3RlbmNpbEZhaWw9S3IsdGhpcy5zdGVuY2lsWkZhaWw9S3IsdGhpcy5zdGVuY2lsWlBhc3M9S3IsdGhpcy5zdGVuY2lsV3JpdGU9ITEsdGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsLHRoaXMuY2xpcEludGVyc2VjdGlvbj0hMSx0aGlzLmNsaXBTaGFkb3dzPSExLHRoaXMuc2hhZG93U2lkZT1udWxsLHRoaXMuY29sb3JXcml0ZT0hMCx0aGlzLnByZWNpc2lvbj1udWxsLHRoaXMucG9seWdvbk9mZnNldD0hMSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MCx0aGlzLnBvbHlnb25PZmZzZXRVbml0cz0wLHRoaXMuZGl0aGVyaW5nPSExLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMuZm9yY2VTaW5nbGVQYXNzPSExLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHI9dGhpc1tlXTtpZihyPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiAnJHtlfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHt0aGlzLnR5cGV9LmApO2NvbnRpbnVlfXImJnIuaXNDb2xvcj9yLnNldChuKTpyJiZyLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/ci5jb3B5KG4pOnRoaXNbZV09bn19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O24udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdGhpcy5yb3VnaG5lc3MhPT12b2lkIDAmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdGhpcy5tZXRhbG5lc3MhPT12b2lkIDAmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiE9PXZvaWQgMCYmKG4uc2hlZW49dGhpcy5zaGVlbiksdGhpcy5zaGVlbkNvbG9yJiZ0aGlzLnNoZWVuQ29sb3IuaXNDb2xvciYmKG4uc2hlZW5Db2xvcj10aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihuLnNoZWVuUm91Z2huZXNzPXRoaXMuc2hlZW5Sb3VnaG5lc3MpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PXZvaWQgMCYmdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PTEmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdGhpcy5zcGVjdWxhckludGVuc2l0eSE9PXZvaWQgMCYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhckNvbG9yJiZ0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciYmKG4uc3BlY3VsYXJDb2xvcj10aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hpbmluZXNzIT09dm9pZCAwJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHRoaXMuY2xlYXJjb2F0IT09dm9pZCAwJiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzIT09dm9pZCAwJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT1XciYmKG4uYmxlbmRpbmc9dGhpcy5ibGVuZGluZyksdGhpcy5zaWRlIT09c2kmJihuLnNpZGU9dGhpcy5zaWRlKSx0aGlzLnZlcnRleENvbG9ycz09PSEwJiYobi52ZXJ0ZXhDb2xvcnM9ITApLHRoaXMub3BhY2l0eTwxJiYobi5vcGFjaXR5PXRoaXMub3BhY2l0eSksdGhpcy50cmFuc3BhcmVudD09PSEwJiYobi50cmFuc3BhcmVudD0hMCksdGhpcy5ibGVuZFNyYyE9PUhsJiYobi5ibGVuZFNyYz10aGlzLmJsZW5kU3JjKSx0aGlzLmJsZW5kRHN0IT09V2wmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PXByJiYobi5ibGVuZEVxdWF0aW9uPXRoaXMuYmxlbmRFcXVhdGlvbiksdGhpcy5ibGVuZFNyY0FscGhhIT09bnVsbCYmKG4uYmxlbmRTcmNBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGEpLHRoaXMuYmxlbmREc3RBbHBoYSE9PW51bGwmJihuLmJsZW5kRHN0QWxwaGE9dGhpcy5ibGVuZERzdEFscGhhKSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSE9PW51bGwmJihuLmJsZW5kRXF1YXRpb25BbHBoYT10aGlzLmJsZW5kRXF1YXRpb25BbHBoYSksdGhpcy5ibGVuZENvbG9yJiZ0aGlzLmJsZW5kQ29sb3IuaXNDb2xvciYmKG4uYmxlbmRDb2xvcj10aGlzLmJsZW5kQ29sb3IuZ2V0SGV4KCkpLHRoaXMuYmxlbmRBbHBoYSE9PTAmJihuLmJsZW5kQWxwaGE9dGhpcy5ibGVuZEFscGhhKSx0aGlzLmRlcHRoRnVuYyE9PSRyJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT1wZCYmKG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyksdGhpcy5zdGVuY2lsUmVmIT09MCYmKG4uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWYpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrIT09MjU1JiYobi5zdGVuY2lsRnVuY01hc2s9dGhpcy5zdGVuY2lsRnVuY01hc2spLHRoaXMuc3RlbmNpbEZhaWwhPT1LciYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT1LciYmKG4uc3RlbmNpbFpGYWlsPXRoaXMuc3RlbmNpbFpGYWlsKSx0aGlzLnN0ZW5jaWxaUGFzcyE9PUtyJiYobi5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3MpLHRoaXMuc3RlbmNpbFdyaXRlPT09ITAmJihuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSksdGhpcy5yb3RhdGlvbiE9PXZvaWQgMCYmdGhpcy5yb3RhdGlvbiE9PTAmJihuLnJvdGF0aW9uPXRoaXMucm90YXRpb24pLHRoaXMucG9seWdvbk9mZnNldD09PSEwJiYobi5wb2x5Z29uT2Zmc2V0PSEwKSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IhPT0wJiYobi5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3RvciksdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMhPT0wJiYobi5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpLHRoaXMubGluZXdpZHRoIT09dm9pZCAwJiZ0aGlzLmxpbmV3aWR0aCE9PTEmJihuLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCksdGhpcy5kYXNoU2l6ZSE9PXZvaWQgMCYmKG4uZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSksdGhpcy5nYXBTaXplIT09dm9pZCAwJiYobi5nYXBTaXplPXRoaXMuZ2FwU2l6ZSksdGhpcy5zY2FsZSE9PXZvaWQgMCYmKG4uc2NhbGU9dGhpcy5zY2FsZSksdGhpcy5kaXRoZXJpbmc9PT0hMCYmKG4uZGl0aGVyaW5nPSEwKSx0aGlzLmFscGhhVGVzdD4wJiYobi5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpLHRoaXMuYWxwaGFIYXNoPT09ITAmJihuLmFscGhhSGFzaD0hMCksdGhpcy5hbHBoYVRvQ292ZXJhZ2U9PT0hMCYmKG4uYWxwaGFUb0NvdmVyYWdlPSEwKSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT09PSEwJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9ITApLHRoaXMuZm9yY2VTaW5nbGVQYXNzPT09ITAmJihuLmZvcmNlU2luZ2xlUGFzcz0hMCksdGhpcy53aXJlZnJhbWU9PT0hMCYmKG4ud2lyZWZyYW1lPSEwKSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD4xJiYobi53aXJlZnJhbWVMaW5ld2lkdGg9dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgpLHRoaXMud2lyZWZyYW1lTGluZWNhcCE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVjYXA9dGhpcy53aXJlZnJhbWVMaW5lY2FwKSx0aGlzLndpcmVmcmFtZUxpbmVqb2luIT09InJvdW5kIiYmKG4ud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lam9pbiksdGhpcy5mbGF0U2hhZGluZz09PSEwJiYobi5mbGF0U2hhZGluZz0hMCksdGhpcy52aXNpYmxlPT09ITEmJihuLnZpc2libGU9ITEpLHRoaXMudG9uZU1hcHBlZD09PSExJiYobi50b25lTWFwcGVkPSExKSx0aGlzLmZvZz09PSExJiYobi5mb2c9ITEpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtmdW5jdGlvbiByKHMpe2NvbnN0IG89W107Zm9yKGNvbnN0IGEgaW4gcyl7Y29uc3QgbD1zW2FdO2RlbGV0ZSBsLm1ldGFkYXRhLG8ucHVzaChsKX1yZXR1cm4gb31pZihlKXtjb25zdCBzPXIodC50ZXh0dXJlcyksbz1yKHQuaW1hZ2VzKTtzLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1zKSxvLmxlbmd0aD4wJiYobi5pbWFnZXM9byl9cmV0dXJuIG59Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5uYW1lPXQubmFtZSx0aGlzLmJsZW5kaW5nPXQuYmxlbmRpbmcsdGhpcy5zaWRlPXQuc2lkZSx0aGlzLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycyx0aGlzLm9wYWNpdHk9dC5vcGFjaXR5LHRoaXMudHJhbnNwYXJlbnQ9dC50cmFuc3BhcmVudCx0aGlzLmJsZW5kU3JjPXQuYmxlbmRTcmMsdGhpcy5ibGVuZERzdD10LmJsZW5kRHN0LHRoaXMuYmxlbmRFcXVhdGlvbj10LmJsZW5kRXF1YXRpb24sdGhpcy5ibGVuZFNyY0FscGhhPXQuYmxlbmRTcmNBbHBoYSx0aGlzLmJsZW5kRHN0QWxwaGE9dC5ibGVuZERzdEFscGhhLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXQuYmxlbmRFcXVhdGlvbkFscGhhLHRoaXMuYmxlbmRDb2xvci5jb3B5KHQuYmxlbmRDb2xvciksdGhpcy5ibGVuZEFscGhhPXQuYmxlbmRBbHBoYSx0aGlzLmRlcHRoRnVuYz10LmRlcHRoRnVuYyx0aGlzLmRlcHRoVGVzdD10LmRlcHRoVGVzdCx0aGlzLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2ssdGhpcy5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jLHRoaXMuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYsdGhpcy5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2ssdGhpcy5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsLHRoaXMuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsLHRoaXMuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzLHRoaXMuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlO2NvbnN0IGU9dC5jbGlwcGluZ1BsYW5lcztsZXQgbj1udWxsO2lmKGUhPT1udWxsKXtjb25zdCByPWUubGVuZ3RoO249bmV3IEFycmF5KHIpO2ZvcihsZXQgcz0wO3MhPT1yOysrcyluW3NdPWVbc10uY2xvbmUoKX1yZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcz1uLHRoaXMuY2xpcEludGVyc2VjdGlvbj10LmNsaXBJbnRlcnNlY3Rpb24sdGhpcy5jbGlwU2hhZG93cz10LmNsaXBTaGFkb3dzLHRoaXMuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUsdGhpcy5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbix0aGlzLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0LHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMsdGhpcy5kaXRoZXJpbmc9dC5kaXRoZXJpbmcsdGhpcy5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QsdGhpcy5hbHBoYUhhc2g9dC5hbHBoYUhhc2gsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9dC5mb3JjZVNpbmdsZVBhc3MsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfW9uQnVpbGQoKXtjb25zb2xlLndhcm4oIk1hdGVyaWFsOiBvbkJ1aWxkKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19Y2xhc3MgYnIgZXh0ZW5kcyBRZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB4dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IEJuLHRoaXMuY29tYmluZT1hYSx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5zcGVjdWxhck1hcD10LnNwZWN1bGFyTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkodC5lbnZNYXBSb3RhdGlvbiksdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZvZz10LmZvZyx0aGlzfX1jb25zdCBaaT1CQSgpO2Z1bmN0aW9uIEJBKCl7Y29uc3QgaT1uZXcgQXJyYXlCdWZmZXIoNCksdD1uZXcgRmxvYXQzMkFycmF5KGkpLGU9bmV3IFVpbnQzMkFycmF5KGkpLG49bmV3IFVpbnQzMkFycmF5KDUxMikscj1uZXcgVWludDMyQXJyYXkoNTEyKTtmb3IobGV0IGw9MDtsPDI1NjsrK2wpe2NvbnN0IGM9bC0xMjc7YzwtMjc/KG5bbF09MCxuW2x8MjU2XT0zMjc2OCxyW2xdPTI0LHJbbHwyNTZdPTI0KTpjPC0xND8obltsXT0xMDI0Pj4tYy0xNCxuW2x8MjU2XT0xMDI0Pj4tYy0xNHwzMjc2OCxyW2xdPS1jLTEscltsfDI1Nl09LWMtMSk6Yzw9MTU/KG5bbF09YysxNTw8MTAsbltsfDI1Nl09YysxNTw8MTB8MzI3NjgscltsXT0xMyxyW2x8MjU2XT0xMyk6YzwxMjg/KG5bbF09MzE3NDQsbltsfDI1Nl09NjQ1MTIscltsXT0yNCxyW2x8MjU2XT0yNCk6KG5bbF09MzE3NDQsbltsfDI1Nl09NjQ1MTIscltsXT0xMyxyW2x8MjU2XT0xMyl9Y29uc3Qgcz1uZXcgVWludDMyQXJyYXkoMjA0OCksbz1uZXcgVWludDMyQXJyYXkoNjQpLGE9bmV3IFVpbnQzMkFycmF5KDY0KTtmb3IobGV0IGw9MTtsPDEwMjQ7KytsKXtsZXQgYz1sPDwxMyx1PTA7Zm9yKDshKGMmODM4ODYwOCk7KWM8PD0xLHUtPTgzODg2MDg7YyY9LTgzODg2MDksdSs9OTQ3OTEyNzA0LHNbbF09Y3x1fWZvcihsZXQgbD0xMDI0O2w8MjA0ODsrK2wpc1tsXT05Mzk1MjQwOTYrKGwtMTAyNDw8MTMpO2ZvcihsZXQgbD0xO2w8MzE7KytsKW9bbF09bDw8MjM7b1szMV09MTE5OTU3MDk0NCxvWzMyXT0yMTQ3NDgzNjQ4O2ZvcihsZXQgbD0zMztsPDYzOysrbClvW2xdPTIxNDc0ODM2NDgrKGwtMzI8PDIzKTtvWzYzXT0zMzQ3MDU0NTkyO2ZvcihsZXQgbD0xO2w8NjQ7KytsKWwhPT0zMiYmKGFbbF09MTAyNCk7cmV0dXJue2Zsb2F0Vmlldzp0LHVpbnQzMlZpZXc6ZSxiYXNlVGFibGU6bixzaGlmdFRhYmxlOnIsbWFudGlzc2FUYWJsZTpzLGV4cG9uZW50VGFibGU6byxvZmZzZXRUYWJsZTphfX1mdW5jdGlvbiBibihpKXtNYXRoLmFicyhpKT42NTUwNCYmY29uc29sZS53YXJuKCJUSFJFRS5EYXRhVXRpbHMudG9IYWxmRmxvYXQoKTogVmFsdWUgb3V0IG9mIHJhbmdlLiIpLGk9SHQoaSwtNjU1MDQsNjU1MDQpLFppLmZsb2F0Vmlld1swXT1pO2NvbnN0IHQ9WmkudWludDMyVmlld1swXSxlPXQ+PjIzJjUxMTtyZXR1cm4gWmkuYmFzZVRhYmxlW2VdKygodCY4Mzg4NjA3KT4+Wmkuc2hpZnRUYWJsZVtlXSl9ZnVuY3Rpb24gUmEoaSl7Y29uc3QgdD1pPj4xMDtyZXR1cm4gWmkudWludDMyVmlld1swXT1aaS5tYW50aXNzYVRhYmxlW1ppLm9mZnNldFRhYmxlW3RdKyhpJjEwMjMpXStaaS5leHBvbmVudFRhYmxlW3RdLFppLmZsb2F0Vmlld1swXX1jb25zdCBPQT17dG9IYWxmRmxvYXQ6Ym4sZnJvbUhhbGZGbG9hdDpSYX0sT2U9bmV3IFIsV2M9bmV3IFg7Y2xhc3MgSnR7Y29uc3RydWN0b3IodCxlLG49ITEpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmlzQnVmZmVyQXR0cmlidXRlPSEwLHRoaXMubmFtZT0iIix0aGlzLmFycmF5PXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMuY291bnQ9dCE9PXZvaWQgMD90Lmxlbmd0aC9lOjAsdGhpcy5ub3JtYWxpemVkPW4sdGhpcy51c2FnZT1NYSx0aGlzLnVwZGF0ZVJhbmdlcz1bXSx0aGlzLmdwdVR5cGU9dm4sdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuZ3B1VHlwZT10LmdwdVR5cGUsdGhpc31jb3B5QXQodCxlLG4pe3QqPXRoaXMuaXRlbVNpemUsbio9ZS5pdGVtU2l6ZTtmb3IobGV0IHI9MCxzPXRoaXMuaXRlbVNpemU7cjxzO3IrKyl0aGlzLmFycmF5W3Qrcl09ZS5hcnJheVtuK3JdO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31hcHBseU1hdHJpeDModCl7aWYodGhpcy5pdGVtU2l6ZT09PTIpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspV2MuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFdjLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsV2MueCxXYy55KTtlbHNlIGlmKHRoaXMuaXRlbVNpemU9PT0zKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKU9lLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxPZS5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWVooZSxPZS54LE9lLnksT2Uueik7cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKU9lLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxPZS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRYWVooZSxPZS54LE9lLnksT2Uueik7cmV0dXJuIHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspT2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLE9lLmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUsT2UueCxPZS55LE9lLnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylPZS5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksT2UudHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXMuc2V0WFlaKGUsT2UueCxPZS55LE9lLnopO3JldHVybiB0aGlzfXNldCh0LGU9MCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRDb21wb25lbnQodCxlKXtsZXQgbj10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZStlXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj1sbihuLHRoaXMuYXJyYXkpKSxufXNldENvbXBvbmVudCh0LGUsbil7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49WnQobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV09bix0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPWxuKGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVp0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXT1lLHRoaXN9Z2V0WSh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXT1lLHRoaXN9Z2V0Wih0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXT1lLHRoaXN9c2V0WFkodCxlLG4pe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9WnQoZSx0aGlzLmFycmF5KSxuPVp0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXN9c2V0WFlaKHQsZSxuLHIpe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9WnQoZSx0aGlzLmFycmF5KSxuPVp0KG4sdGhpcy5hcnJheSkscj1adChyLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cix0aGlzfXNldFhZWlcodCxlLG4scixzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPVp0KGUsdGhpcy5hcnJheSksbj1adChuLHRoaXMuYXJyYXkpLHI9WnQocix0aGlzLmFycmF5KSxzPVp0KHMsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXMuYXJyYXlbdCsyXT1yLHRoaXMuYXJyYXlbdCszXT1zLHRoaXN9b25VcGxvYWQodCl7cmV0dXJuIHRoaXMub25VcGxvYWRDYWxsYmFjaz10LHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hcnJheSx0aGlzLml0ZW1TaXplKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkuZnJvbSh0aGlzLmFycmF5KSxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH07cmV0dXJuIHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksdGhpcy51c2FnZSE9PU1hJiYodC51c2FnZT10aGlzLnVzYWdlKSx0fX1jbGFzcyB6QSBleHRlbmRzIEp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgSW50OEFycmF5KHQpLGUsbil9fWNsYXNzIGtBIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50OEFycmF5KHQpLGUsbil9fWNsYXNzIFZBIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50OENsYW1wZWRBcnJheSh0KSxlLG4pfX1jbGFzcyBHQSBleHRlbmRzIEp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgSW50MTZBcnJheSh0KSxlLG4pfX1jbGFzcyBGZCBleHRlbmRzIEp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxuKX19Y2xhc3MgSEEgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEludDMyQXJyYXkodCksZSxuKX19Y2xhc3MgQmQgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsbil9fWNsYXNzIFdBIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MTZBcnJheSh0KSxlLG4pLHRoaXMuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlPSEwfWdldFgodCl7bGV0IGU9UmEodGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdKTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09Ym4oZSksdGhpc31nZXRZKHQpe2xldCBlPVJhKHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdKTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXT1ibihlKSx0aGlzfWdldFoodCl7bGV0IGU9UmEodGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl0pO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPWxuKGUsdGhpcy5hcnJheSkpLGV9c2V0Wih0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVp0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdPWJuKGUpLHRoaXN9Z2V0Vyh0KXtsZXQgZT1SYSh0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXSk7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9bG4oZSx0aGlzLmFycmF5KSksZX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9WnQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109Ym4oZSksdGhpc31zZXRYWSh0LGUsbil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpLG49WnQobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWJuKGUpLHRoaXMuYXJyYXlbdCsxXT1ibihuKSx0aGlzfXNldFhZWih0LGUsbixyKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPVp0KGUsdGhpcy5hcnJheSksbj1adChuLHRoaXMuYXJyYXkpLHI9WnQocix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWJuKGUpLHRoaXMuYXJyYXlbdCsxXT1ibihuKSx0aGlzLmFycmF5W3QrMl09Ym4ociksdGhpc31zZXRYWVpXKHQsZSxuLHIscyl7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpLG49WnQobix0aGlzLmFycmF5KSxyPVp0KHIsdGhpcy5hcnJheSkscz1adChzLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09Ym4oZSksdGhpcy5hcnJheVt0KzFdPWJuKG4pLHRoaXMuYXJyYXlbdCsyXT1ibihyKSx0aGlzLmFycmF5W3QrM109Ym4ocyksdGhpc319Y2xhc3MgTXQgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEZsb2F0MzJBcnJheSh0KSxlLG4pfX1sZXQgJEE9MDtjb25zdCBZbj1uZXcgUnQsT2Q9bmV3IGFlLHVvPW5ldyBSLE9uPW5ldyBtZSxQYT1uZXcgbWUsV2U9bmV3IFI7Y2xhc3MgRnQgZXh0ZW5kcyBUaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0J1ZmZlckdlb21ldHJ5PSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOiRBKyt9KSx0aGlzLnV1aWQ9Tm4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuaW5kaXJlY3Q9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT0hMSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OjEvMH0sdGhpcy51c2VyRGF0YT17fX1nZXRJbmRleCgpe3JldHVybiB0aGlzLmluZGV4fXNldEluZGV4KHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3RoaXMuaW5kZXg9bmV3KGd5KHQpP0JkOkZkKSh0LDEpOnRoaXMuaW5kZXg9dCx0aGlzfXNldEluZGlyZWN0KHQpe3JldHVybiB0aGlzLmluZGlyZWN0PXQsdGhpc31nZXRJbmRpcmVjdCgpe3JldHVybiB0aGlzLmluZGlyZWN0fWdldEF0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdfXNldEF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF09ZSx0aGlzfWRlbGV0ZUF0dHJpYnV0ZSh0KXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1t0XSx0aGlzfWhhc0F0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdIT09dm9pZCAwfWFkZEdyb3VwKHQsZSxuPTApe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OnQsY291bnQ6ZSxtYXRlcmlhbEluZGV4Om59KX1jbGVhckdyb3Vwcygpe3RoaXMuZ3JvdXBzPVtdfXNldERyYXdSYW5nZSh0LGUpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PXQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9ZX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247ZSE9PXZvaWQgMCYmKGUuYXBwbHlNYXRyaXg0KHQpLGUubmVlZHNVcGRhdGU9ITApO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtpZihuIT09dm9pZCAwKXtjb25zdCBzPW5ldyBXdCgpLmdldE5vcm1hbE1hdHJpeCh0KTtuLmFwcGx5Tm9ybWFsTWF0cml4KHMpLG4ubmVlZHNVcGRhdGU9ITB9Y29uc3Qgcj10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtyZXR1cm4gciE9PXZvaWQgMCYmKHIudHJhbnNmb3JtRGlyZWN0aW9uKHQpLHIubmVlZHNVcGRhdGU9ITApLHRoaXMuYm91bmRpbmdCb3ghPT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiBZbi5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLmFwcGx5TWF0cml4NChZbiksdGhpc31yb3RhdGVYKHQpe3JldHVybiBZbi5tYWtlUm90YXRpb25YKHQpLHRoaXMuYXBwbHlNYXRyaXg0KFluKSx0aGlzfXJvdGF0ZVkodCl7cmV0dXJuIFluLm1ha2VSb3RhdGlvblkodCksdGhpcy5hcHBseU1hdHJpeDQoWW4pLHRoaXN9cm90YXRlWih0KXtyZXR1cm4gWW4ubWFrZVJvdGF0aW9uWih0KSx0aGlzLmFwcGx5TWF0cml4NChZbiksdGhpc310cmFuc2xhdGUodCxlLG4pe3JldHVybiBZbi5tYWtlVHJhbnNsYXRpb24odCxlLG4pLHRoaXMuYXBwbHlNYXRyaXg0KFluKSx0aGlzfXNjYWxlKHQsZSxuKXtyZXR1cm4gWW4ubWFrZVNjYWxlKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChZbiksdGhpc31sb29rQXQodCl7cmV0dXJuIE9kLmxvb2tBdCh0KSxPZC51cGRhdGVNYXRyaXgoKSx0aGlzLmFwcGx5TWF0cml4NChPZC5tYXRyaXgpLHRoaXN9Y2VudGVyKCl7cmV0dXJuIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIodW8pLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKHVvLngsdW8ueSx1by56KSx0aGlzfXNldEZyb21Qb2ludHModCl7Y29uc3QgZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlPT09dm9pZCAwKXtjb25zdCBuPVtdO2ZvcihsZXQgcj0wLHM9dC5sZW5ndGg7cjxzO3IrKyl7Y29uc3Qgbz10W3JdO24ucHVzaChvLngsby55LG8uenx8MCl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQobiwzKSl9ZWxzZXtjb25zdCBuPU1hdGgubWluKHQubGVuZ3RoLGUuY291bnQpO2ZvcihsZXQgcj0wO3I8bjtyKyspe2NvbnN0IHM9dFtyXTtlLnNldFhZWihyLHMueCxzLnkscy56fHwwKX10Lmxlbmd0aD5lLmNvdW50JiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiBCdWZmZXIgc2l6ZSB0b28gc21hbGwgZm9yIHBvaW50cyBkYXRhLiBVc2UgLmRpc3Bvc2UoKSBhbmQgY3JlYXRlIGEgbmV3IGdlb21ldHJ5LiIpLGUubmVlZHNVcGRhdGU9ITB9cmV0dXJuIHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBtZSk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIix0aGlzKSx0aGlzLmJvdW5kaW5nQm94LnNldChuZXcgUigtMS8wLC0xLzAsLTEvMCksbmV3IFIoMS8wLDEvMCwxLzApKTtyZXR1cm59aWYodCE9PXZvaWQgMCl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXtjb25zdCBzPWVbbl07T24uc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShzKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhXZS5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWluLE9uLm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFdlKSxXZS5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWF4LE9uLm1heCksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFdlKSk6KHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChPbi5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChPbi5tYXgpKX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOyhpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgcWUpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiIsdGhpcyksdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQobmV3IFIsMS8wKTtyZXR1cm59aWYodCl7Y29uc3Qgbj10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihPbi5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBzPTAsbz1lLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPWVbc107UGEuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhXZS5hZGRWZWN0b3JzKE9uLm1pbixQYS5taW4pLE9uLmV4cGFuZEJ5UG9pbnQoV2UpLFdlLmFkZFZlY3RvcnMoT24ubWF4LFBhLm1heCksT24uZXhwYW5kQnlQb2ludChXZSkpOihPbi5leHBhbmRCeVBvaW50KFBhLm1pbiksT24uZXhwYW5kQnlQb2ludChQYS5tYXgpKX1Pbi5nZXRDZW50ZXIobik7bGV0IHI9MDtmb3IobGV0IHM9MCxvPXQuY291bnQ7czxvO3MrKylXZS5mcm9tQnVmZmVyQXR0cmlidXRlKHQscykscj1NYXRoLm1heChyLG4uZGlzdGFuY2VUb1NxdWFyZWQoV2UpKTtpZihlKWZvcihsZXQgcz0wLG89ZS5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1lW3NdLGw9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtmb3IobGV0IGM9MCx1PWEuY291bnQ7Yzx1O2MrKylXZS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyksbCYmKHVvLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxjKSxXZS5hZGQodW8pKSxyPU1hdGgubWF4KHIsbi5kaXN0YW5jZVRvU3F1YXJlZChXZSkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChyKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfX1jb21wdXRlVGFuZ2VudHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmF0dHJpYnV0ZXM7aWYodD09PW51bGx8fGUucG9zaXRpb249PT12b2lkIDB8fGUubm9ybWFsPT09dm9pZCAwfHxlLnV2PT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtyZXR1cm59Y29uc3Qgbj1lLnBvc2l0aW9uLHI9ZS5ub3JtYWwscz1lLnV2O3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyBKdChuZXcgRmxvYXQzMkFycmF5KDQqbi5jb3VudCksNCkpO2NvbnN0IG89dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKSxhPVtdLGw9W107Zm9yKGxldCBFPTA7RTxuLmNvdW50O0UrKylhW0VdPW5ldyBSLGxbRV09bmV3IFI7Y29uc3QgYz1uZXcgUix1PW5ldyBSLGg9bmV3IFIsZj1uZXcgWCxkPW5ldyBYLHA9bmV3IFgseT1uZXcgUixnPW5ldyBSO2Z1bmN0aW9uIG0oRSx3LFMpe2MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLEUpLHUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHcpLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLFMpLGYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLEUpLGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHcpLHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLFMpLHUuc3ViKGMpLGguc3ViKGMpLGQuc3ViKGYpLHAuc3ViKGYpO2NvbnN0IFQ9MS8oZC54KnAueS1wLngqZC55KTtpc0Zpbml0ZShUKSYmKHkuY29weSh1KS5tdWx0aXBseVNjYWxhcihwLnkpLmFkZFNjYWxlZFZlY3RvcihoLC1kLnkpLm11bHRpcGx5U2NhbGFyKFQpLGcuY29weShoKS5tdWx0aXBseVNjYWxhcihkLngpLmFkZFNjYWxlZFZlY3Rvcih1LC1wLngpLm11bHRpcGx5U2NhbGFyKFQpLGFbRV0uYWRkKHkpLGFbd10uYWRkKHkpLGFbU10uYWRkKHkpLGxbRV0uYWRkKGcpLGxbd10uYWRkKGcpLGxbU10uYWRkKGcpKX1sZXQgdj10aGlzLmdyb3Vwczt2Lmxlbmd0aD09PTAmJih2PVt7c3RhcnQ6MCxjb3VudDp0LmNvdW50fV0pO2ZvcihsZXQgRT0wLHc9di5sZW5ndGg7RTx3OysrRSl7Y29uc3QgUz12W0VdLFQ9Uy5zdGFydCxEPVMuY291bnQ7Zm9yKGxldCBMPVQsTj1UK0Q7TDxOO0wrPTMpbSh0LmdldFgoTCswKSx0LmdldFgoTCsxKSx0LmdldFgoTCsyKSl9Y29uc3QgeD1uZXcgUixfPW5ldyBSLE09bmV3IFIsYj1uZXcgUjtmdW5jdGlvbiBBKEUpe00uZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLEUpLGIuY29weShNKTtjb25zdCB3PWFbRV07eC5jb3B5KHcpLHguc3ViKE0ubXVsdGlwbHlTY2FsYXIoTS5kb3QodykpKS5ub3JtYWxpemUoKSxfLmNyb3NzVmVjdG9ycyhiLHcpO2NvbnN0IFQ9Xy5kb3QobFtFXSk8MD8tMToxO28uc2V0WFlaVyhFLHgueCx4LnkseC56LFQpfWZvcihsZXQgRT0wLHc9di5sZW5ndGg7RTx3OysrRSl7Y29uc3QgUz12W0VdLFQ9Uy5zdGFydCxEPVMuY291bnQ7Zm9yKGxldCBMPVQsTj1UK0Q7TDxOO0wrPTMpQSh0LmdldFgoTCswKSksQSh0LmdldFgoTCsxKSksQSh0LmdldFgoTCsyKSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZSE9PXZvaWQgMCl7bGV0IG49dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKG49PT12b2lkIDApbj1uZXcgSnQobmV3IEZsb2F0MzJBcnJheShlLmNvdW50KjMpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG4pO2Vsc2UgZm9yKGxldCBmPTAsZD1uLmNvdW50O2Y8ZDtmKyspbi5zZXRYWVooZiwwLDAsMCk7Y29uc3Qgcj1uZXcgUixzPW5ldyBSLG89bmV3IFIsYT1uZXcgUixsPW5ldyBSLGM9bmV3IFIsdT1uZXcgUixoPW5ldyBSO2lmKHQpZm9yKGxldCBmPTAsZD10LmNvdW50O2Y8ZDtmKz0zKXtjb25zdCBwPXQuZ2V0WChmKzApLHk9dC5nZXRYKGYrMSksZz10LmdldFgoZisyKTtyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxwKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx5KSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxnKSx1LnN1YlZlY3RvcnMobyxzKSxoLnN1YlZlY3RvcnMocixzKSx1LmNyb3NzKGgpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHApLGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHkpLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGcpLGEuYWRkKHUpLGwuYWRkKHUpLGMuYWRkKHUpLG4uc2V0WFlaKHAsYS54LGEueSxhLnopLG4uc2V0WFlaKHksbC54LGwueSxsLnopLG4uc2V0WFlaKGcsYy54LGMueSxjLnopfWVsc2UgZm9yKGxldCBmPTAsZD1lLmNvdW50O2Y8ZDtmKz0zKXIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMCkscy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZisxKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzIpLHUuc3ViVmVjdG9ycyhvLHMpLGguc3ViVmVjdG9ycyhyLHMpLHUuY3Jvc3MoaCksbi5zZXRYWVooZiswLHUueCx1LnksdS56KSxuLnNldFhZWihmKzEsdS54LHUueSx1LnopLG4uc2V0WFlaKGYrMix1LngsdS55LHUueik7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCksbi5uZWVkc1VwZGF0ZT0hMH19bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKylXZS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksV2Uubm9ybWFsaXplKCksdC5zZXRYWVooZSxXZS54LFdlLnksV2Uueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdChhLGwpe2NvbnN0IGM9YS5hcnJheSx1PWEuaXRlbVNpemUsaD1hLm5vcm1hbGl6ZWQsZj1uZXcgYy5jb25zdHJ1Y3RvcihsLmxlbmd0aCp1KTtsZXQgZD0wLHA9MDtmb3IobGV0IHk9MCxnPWwubGVuZ3RoO3k8Zzt5Kyspe2EuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT9kPWxbeV0qYS5kYXRhLnN0cmlkZSthLm9mZnNldDpkPWxbeV0qdTtmb3IobGV0IG09MDttPHU7bSsrKWZbcCsrXT1jW2QrK119cmV0dXJuIG5ldyBKdChmLHUsaCl9aWYodGhpcy5pbmRleD09PW51bGwpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEJ1ZmZlckdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuIiksdGhpcztjb25zdCBlPW5ldyBGdCxuPXRoaXMuaW5kZXguYXJyYXkscj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGEgaW4gcil7Y29uc3QgbD1yW2FdLGM9dChsLG4pO2Uuc2V0QXR0cmlidXRlKGEsYyl9Y29uc3Qgcz10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBsPVtdLGM9c1thXTtmb3IobGV0IHU9MCxoPWMubGVuZ3RoO3U8aDt1Kyspe2NvbnN0IGY9Y1t1XSxkPXQoZixuKTtsLnB1c2goZCl9ZS5tb3JwaEF0dHJpYnV0ZXNbYV09bH1lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10aGlzLmdyb3Vwcztmb3IobGV0IGE9MCxsPW8ubGVuZ3RoO2E8bDthKyspe2NvbnN0IGM9b1thXTtlLmFkZEdyb3VwKGMuc3RhcnQsYy5jb3VudCxjLm1hdGVyaWFsSW5kZXgpfXJldHVybiBlfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07aWYodC51dWlkPXRoaXMudXVpZCx0LnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJih0LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHRoaXMucGFyYW1ldGVycyE9PXZvaWQgMCl7Y29uc3QgbD10aGlzLnBhcmFtZXRlcnM7Zm9yKGNvbnN0IGMgaW4gbClsW2NdIT09dm9pZCAwJiYodFtjXT1sW2NdKTtyZXR1cm4gdH10LmRhdGE9e2F0dHJpYnV0ZXM6e319O2NvbnN0IGU9dGhpcy5pbmRleDtlIT09bnVsbCYmKHQuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgbCBpbiBuKXtjb25zdCBjPW5bbF07dC5kYXRhLmF0dHJpYnV0ZXNbbF09Yy50b0pTT04odC5kYXRhKX1jb25zdCByPXt9O2xldCBzPSExO2Zvcihjb25zdCBsIGluIHRoaXMubW9ycGhBdHRyaWJ1dGVzKXtjb25zdCBjPXRoaXMubW9ycGhBdHRyaWJ1dGVzW2xdLHU9W107Zm9yKGxldCBoPTAsZj1jLmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPWNbaF07dS5wdXNoKGQudG9KU09OKHQuZGF0YSkpfXUubGVuZ3RoPjAmJihyW2xdPXUscz0hMCl9cyYmKHQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9cix0LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSk7Y29uc3Qgbz10aGlzLmdyb3VwcztvLmxlbmd0aD4wJiYodC5kYXRhLmdyb3Vwcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKSk7Y29uc3QgYT10aGlzLmJvdW5kaW5nU3BoZXJlO3JldHVybiBhIT09bnVsbCYmKHQuZGF0YS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOmEuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6YS5yYWRpdXN9KSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtjb25zdCBlPXt9O3RoaXMubmFtZT10Lm5hbWU7Y29uc3Qgbj10LmluZGV4O24hPT1udWxsJiZ0aGlzLnNldEluZGV4KG4uY2xvbmUoZSkpO2NvbnN0IHI9dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCBjIGluIHIpe2NvbnN0IHU9cltjXTt0aGlzLnNldEF0dHJpYnV0ZShjLHUuY2xvbmUoZSkpfWNvbnN0IHM9dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGMgaW4gcyl7Y29uc3QgdT1bXSxoPXNbY107Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXUucHVzaChoW2ZdLmNsb25lKGUpKTt0aGlzLm1vcnBoQXR0cmlidXRlc1tjXT11fXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9dC5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXQuZ3JvdXBzO2ZvcihsZXQgYz0wLHU9by5sZW5ndGg7Yzx1O2MrKyl7Y29uc3QgaD1vW2NdO3RoaXMuYWRkR3JvdXAoaC5zdGFydCxoLmNvdW50LGgubWF0ZXJpYWxJbmRleCl9Y29uc3QgYT10LmJvdW5kaW5nQm94O2EhPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1hLmNsb25lKCkpO2NvbnN0IGw9dC5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gbCE9PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWwuY2xvbmUoKSksdGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dC5kcmF3UmFuZ2Uuc3RhcnQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dC5kcmF3UmFuZ2UuY291bnQsdGhpcy51c2VyRGF0YT10LnVzZXJEYXRhLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y29uc3QgRHk9bmV3IFJ0LGlzPW5ldyB2ciwkYz1uZXcgcWUsVXk9bmV3IFIsWGM9bmV3IFIscWM9bmV3IFIsWWM9bmV3IFIsemQ9bmV3IFIsWmM9bmV3IFIsTnk9bmV3IFIsSmM9bmV3IFI7Y2xhc3MgVWUgZXh0ZW5kcyBhZXtjb25zdHJ1Y3Rvcih0PW5ldyBGdCxlPW5ldyBicil7c3VwZXIoKSx0aGlzLmlzTWVzaD0hMCx0aGlzLnR5cGU9Ik1lc2giLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5IT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheSh0Lm1hdGVyaWFsKT90Lm1hdGVyaWFsLnNsaWNlKCk6dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3Qgcj1lW25bMF1dO2lmKHIhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcz0wLG89ci5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1yW3NdLm5hbWV8fFN0cmluZyhzKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXN9fX19Z2V0VmVydGV4UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscj1uLmF0dHJpYnV0ZXMucG9zaXRpb24scz1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixvPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmU7ZS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsdCk7Y29uc3QgYT10aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihzJiZhKXtaYy5zZXQoMCwwLDApO2ZvcihsZXQgbD0wLGM9cy5sZW5ndGg7bDxjO2wrKyl7Y29uc3QgdT1hW2xdLGg9c1tsXTt1IT09MCYmKHpkLmZyb21CdWZmZXJBdHRyaWJ1dGUoaCx0KSxvP1pjLmFkZFNjYWxlZFZlY3Rvcih6ZCx1KTpaYy5hZGRTY2FsZWRWZWN0b3IoemQuc3ViKGUpLHUpKX1lLmFkZChaYyl9cmV0dXJuIGV9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxyPXRoaXMubWF0ZXJpYWwscz10aGlzLm1hdHJpeFdvcmxkO3IhPT12b2lkIDAmJihuLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSwkYy5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLCRjLmFwcGx5TWF0cml4NChzKSxpcy5jb3B5KHQucmF5KS5yZWNhc3QodC5uZWFyKSwhKCRjLmNvbnRhaW5zUG9pbnQoaXMub3JpZ2luKT09PSExJiYoaXMuaW50ZXJzZWN0U3BoZXJlKCRjLFV5KT09PW51bGx8fGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZChVeSk+V3ModC5mYXItdC5uZWFyLDIpKSkmJihEeS5jb3B5KHMpLmludmVydCgpLGlzLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChEeSksIShuLmJvdW5kaW5nQm94IT09bnVsbCYmaXMuaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLGlzKSkpfV9jb21wdXRlSW50ZXJzZWN0aW9ucyh0LGUsbil7bGV0IHI7Y29uc3Qgcz10aGlzLmdlb21ldHJ5LG89dGhpcy5tYXRlcmlhbCxhPXMuaW5kZXgsbD1zLmF0dHJpYnV0ZXMucG9zaXRpb24sYz1zLmF0dHJpYnV0ZXMudXYsdT1zLmF0dHJpYnV0ZXMudXYxLGg9cy5hdHRyaWJ1dGVzLm5vcm1hbCxmPXMuZ3JvdXBzLGQ9cy5kcmF3UmFuZ2U7aWYoYSE9PW51bGwpaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IGc9ZltwXSxtPW9bZy5tYXRlcmlhbEluZGV4XSx2PU1hdGgubWF4KGcuc3RhcnQsZC5zdGFydCkseD1NYXRoLm1pbihhLmNvdW50LE1hdGgubWluKGcuc3RhcnQrZy5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IF89dixNPXg7XzxNO18rPTMpe2NvbnN0IGI9YS5nZXRYKF8pLEE9YS5nZXRYKF8rMSksRT1hLmdldFgoXysyKTtyPWpjKHRoaXMsbSx0LG4sYyx1LGgsYixBLEUpLHImJihyLmZhY2VJbmRleD1NYXRoLmZsb29yKF8vMyksci5mYWNlLm1hdGVyaWFsSW5kZXg9Zy5tYXRlcmlhbEluZGV4LGUucHVzaChyKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgZz1wLG09eTtnPG07Zys9Myl7Y29uc3Qgdj1hLmdldFgoZykseD1hLmdldFgoZysxKSxfPWEuZ2V0WChnKzIpO3I9amModGhpcyxvLHQsbixjLHUsaCx2LHgsXyksciYmKHIuZmFjZUluZGV4PU1hdGguZmxvb3IoZy8zKSxlLnB1c2gocikpfX1lbHNlIGlmKGwhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IGc9ZltwXSxtPW9bZy5tYXRlcmlhbEluZGV4XSx2PU1hdGgubWF4KGcuc3RhcnQsZC5zdGFydCkseD1NYXRoLm1pbihsLmNvdW50LE1hdGgubWluKGcuc3RhcnQrZy5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IF89dixNPXg7XzxNO18rPTMpe2NvbnN0IGI9XyxBPV8rMSxFPV8rMjtyPWpjKHRoaXMsbSx0LG4sYyx1LGgsYixBLEUpLHImJihyLmZhY2VJbmRleD1NYXRoLmZsb29yKF8vMyksci5mYWNlLm1hdGVyaWFsSW5kZXg9Zy5tYXRlcmlhbEluZGV4LGUucHVzaChyKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4obC5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgZz1wLG09eTtnPG07Zys9Myl7Y29uc3Qgdj1nLHg9ZysxLF89ZysyO3I9amModGhpcyxvLHQsbixjLHUsaCx2LHgsXyksciYmKHIuZmFjZUluZGV4PU1hdGguZmxvb3IoZy8zKSxlLnB1c2gocikpfX19fWZ1bmN0aW9uIFhBKGksdCxlLG4scixzLG8sYSl7bGV0IGw7aWYodC5zaWRlPT09SmU/bD1uLmludGVyc2VjdFRyaWFuZ2xlKG8scyxyLCEwLGEpOmw9bi5pbnRlcnNlY3RUcmlhbmdsZShyLHMsbyx0LnNpZGU9PT1zaSxhKSxsPT09bnVsbClyZXR1cm4gbnVsbDtKYy5jb3B5KGEpLEpjLmFwcGx5TWF0cml4NChpLm1hdHJpeFdvcmxkKTtjb25zdCBjPWUucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEpjKTtyZXR1cm4gYzxlLm5lYXJ8fGM+ZS5mYXI/bnVsbDp7ZGlzdGFuY2U6Yyxwb2ludDpKYy5jbG9uZSgpLG9iamVjdDppfX1mdW5jdGlvbiBqYyhpLHQsZSxuLHIscyxvLGEsbCxjKXtpLmdldFZlcnRleFBvc2l0aW9uKGEsWGMpLGkuZ2V0VmVydGV4UG9zaXRpb24obCxxYyksaS5nZXRWZXJ0ZXhQb3NpdGlvbihjLFljKTtjb25zdCB1PVhBKGksdCxlLG4sWGMscWMsWWMsTnkpO2lmKHUpe2NvbnN0IGg9bmV3IFI7X2UuZ2V0QmFyeWNvb3JkKE55LFhjLHFjLFljLGgpLHImJih1LnV2PV9lLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShyLGEsbCxjLGgsbmV3IFgpKSxzJiYodS51djE9X2UuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKHMsYSxsLGMsaCxuZXcgWCkpLG8mJih1Lm5vcm1hbD1fZS5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUobyxhLGwsYyxoLG5ldyBSKSx1Lm5vcm1hbC5kb3Qobi5kaXJlY3Rpb24pPjAmJnUubm9ybWFsLm11bHRpcGx5U2NhbGFyKC0xKSk7Y29uc3QgZj17YSxiOmwsYyxub3JtYWw6bmV3IFIsbWF0ZXJpYWxJbmRleDowfTtfZS5nZXROb3JtYWwoWGMscWMsWWMsZi5ub3JtYWwpLHUuZmFjZT1mLHUuYmFyeWNvb3JkPWh9cmV0dXJuIHV9Y2xhc3MgcnMgZXh0ZW5kcyBGdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxyPTEscz0xLG89MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkJveEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6bix3aWR0aFNlZ21lbnRzOnIsaGVpZ2h0U2VnbWVudHM6cyxkZXB0aFNlZ21lbnRzOm99O2NvbnN0IGE9dGhpcztyPU1hdGguZmxvb3Iocikscz1NYXRoLmZsb29yKHMpLG89TWF0aC5mbG9vcihvKTtjb25zdCBsPVtdLGM9W10sdT1bXSxoPVtdO2xldCBmPTAsZD0wO3AoInoiLCJ5IiwieCIsLTEsLTEsbixlLHQsbyxzLDApLHAoInoiLCJ5IiwieCIsMSwtMSxuLGUsLXQsbyxzLDEpLHAoIngiLCJ6IiwieSIsMSwxLHQsbixlLHIsbywyKSxwKCJ4IiwieiIsInkiLDEsLTEsdCxuLC1lLHIsbywzKSxwKCJ4IiwieSIsInoiLDEsLTEsdCxlLG4scixzLDQpLHAoIngiLCJ5IiwieiIsLTEsLTEsdCxlLC1uLHIscyw1KSx0aGlzLnNldEluZGV4KGwpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdChoLDIpKTtmdW5jdGlvbiBwKHksZyxtLHYseCxfLE0sYixBLEUsdyl7Y29uc3QgUz1fL0EsVD1NL0UsRD1fLzIsTD1NLzIsTj1iLzIsRj1BKzEsQj1FKzE7bGV0IEc9MCxrPTA7Y29uc3QgUT1uZXcgUjtmb3IobGV0IGN0PTA7Y3Q8QjtjdCsrKXtjb25zdCBodD1jdCpULUw7Zm9yKGxldCBQdD0wO1B0PEY7UHQrKyl7Y29uc3QgWHQ9UHQqUy1EO1FbeV09WHQqdixRW2ddPWh0KngsUVttXT1OLGMucHVzaChRLngsUS55LFEueiksUVt5XT0wLFFbZ109MCxRW21dPWI+MD8xOi0xLHUucHVzaChRLngsUS55LFEueiksaC5wdXNoKFB0L0EpLGgucHVzaCgxLWN0L0UpLEcrPTF9fWZvcihsZXQgY3Q9MDtjdDxFO2N0KyspZm9yKGxldCBodD0wO2h0PEE7aHQrKyl7Y29uc3QgUHQ9ZitodCtGKmN0LFh0PWYraHQrRiooY3QrMSksaj1mKyhodCsxKStGKihjdCsxKSxydD1mKyhodCsxKStGKmN0O2wucHVzaChQdCxYdCxydCksbC5wdXNoKFh0LGoscnQpLGsrPTZ9YS5hZGRHcm91cChkLGssdyksZCs9ayxmKz1HfX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBycyh0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5kZXB0aFNlZ21lbnRzKX19ZnVuY3Rpb24gaG8oaSl7Y29uc3QgdD17fTtmb3IoY29uc3QgZSBpbiBpKXt0W2VdPXt9O2Zvcihjb25zdCBuIGluIGlbZV0pe2NvbnN0IHI9aVtlXVtuXTtyJiYoci5pc0NvbG9yfHxyLmlzTWF0cml4M3x8ci5pc01hdHJpeDR8fHIuaXNWZWN0b3IyfHxyLmlzVmVjdG9yM3x8ci5pc1ZlY3RvcjR8fHIuaXNUZXh0dXJlfHxyLmlzUXVhdGVybmlvbik/ci5pc1JlbmRlclRhcmdldFRleHR1cmU/KGNvbnNvbGUud2FybigiVW5pZm9ybXNVdGlsczogVGV4dHVyZXMgb2YgcmVuZGVyIHRhcmdldHMgY2Fubm90IGJlIGNsb25lZCB2aWEgY2xvbmVVbmlmb3JtcygpIG9yIG1lcmdlVW5pZm9ybXMoKS4iKSx0W2VdW25dPW51bGwpOnRbZV1bbl09ci5jbG9uZSgpOkFycmF5LmlzQXJyYXkocik/dFtlXVtuXT1yLnNsaWNlKCk6dFtlXVtuXT1yfX1yZXR1cm4gdH1mdW5jdGlvbiBjbihpKXtjb25zdCB0PXt9O2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXtjb25zdCBuPWhvKGlbZV0pO2Zvcihjb25zdCByIGluIG4pdFtyXT1uW3JdfXJldHVybiB0fWZ1bmN0aW9uIHFBKGkpe2NvbnN0IHQ9W107Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspdC5wdXNoKGlbZV0uY2xvbmUoKSk7cmV0dXJuIHR9ZnVuY3Rpb24gRnkoaSl7Y29uc3QgdD1pLmdldFJlbmRlclRhcmdldCgpO3JldHVybiB0PT09bnVsbD9pLm91dHB1dENvbG9yU3BhY2U6dC5pc1hSUmVuZGVyVGFyZ2V0PT09ITA/dC50ZXh0dXJlLmNvbG9yU3BhY2U6cmUud29ya2luZ0NvbG9yU3BhY2V9Y29uc3QgQnk9e2Nsb25lOmhvLG1lcmdlOmNufTt2YXIgWUE9YHZvaWQgbWFpbigpIHsKCWdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTsKfWAsWkE9YHZvaWQgbWFpbigpIHsKCWdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApOwp9YDtjbGFzcyB1aSBleHRlbmRzIFFle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc1NoYWRlck1hdGVyaWFsPSEwLHRoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiLHRoaXMuZGVmaW5lcz17fSx0aGlzLnVuaWZvcm1zPXt9LHRoaXMudW5pZm9ybXNHcm91cHM9W10sdGhpcy52ZXJ0ZXhTaGFkZXI9WUEsdGhpcy5mcmFnbWVudFNoYWRlcj1aQSx0aGlzLmxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mb2c9ITEsdGhpcy5saWdodHM9ITEsdGhpcy5jbGlwcGluZz0hMSx0aGlzLmZvcmNlU2luZ2xlUGFzcz0hMCx0aGlzLmV4dGVuc2lvbnM9e2NsaXBDdWxsRGlzdGFuY2U6ITEsbXVsdGlEcmF3OiExfSx0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM9e2NvbG9yOlsxLDEsMV0sdXY6WzAsMF0sdXYxOlswLDBdfSx0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWU9dm9pZCAwLHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlPSExLHRoaXMuZ2xzbFZlcnNpb249bnVsbCx0IT09dm9pZCAwJiZ0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZnJhZ21lbnRTaGFkZXI9dC5mcmFnbWVudFNoYWRlcix0aGlzLnZlcnRleFNoYWRlcj10LnZlcnRleFNoYWRlcix0aGlzLnVuaWZvcm1zPWhvKHQudW5pZm9ybXMpLHRoaXMudW5pZm9ybXNHcm91cHM9cUEodC51bmlmb3Jtc0dyb3VwcyksdGhpcy5kZWZpbmVzPU9iamVjdC5hc3NpZ24oe30sdC5kZWZpbmVzKSx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLmZvZz10LmZvZyx0aGlzLmxpZ2h0cz10LmxpZ2h0cyx0aGlzLmNsaXBwaW5nPXQuY2xpcHBpbmcsdGhpcy5leHRlbnNpb25zPU9iamVjdC5hc3NpZ24oe30sdC5leHRlbnNpb25zKSx0aGlzLmdsc2xWZXJzaW9uPXQuZ2xzbFZlcnNpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7ZS5nbHNsVmVyc2lvbj10aGlzLmdsc2xWZXJzaW9uLGUudW5pZm9ybXM9e307Zm9yKGNvbnN0IHIgaW4gdGhpcy51bmlmb3Jtcyl7Y29uc3Qgbz10aGlzLnVuaWZvcm1zW3JdLnZhbHVlO28mJm8uaXNUZXh0dXJlP2UudW5pZm9ybXNbcl09e3R5cGU6InQiLHZhbHVlOm8udG9KU09OKHQpLnV1aWR9Om8mJm8uaXNDb2xvcj9lLnVuaWZvcm1zW3JdPXt0eXBlOiJjIix2YWx1ZTpvLmdldEhleCgpfTpvJiZvLmlzVmVjdG9yMj9lLnVuaWZvcm1zW3JdPXt0eXBlOiJ2MiIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNWZWN0b3IzP2UudW5pZm9ybXNbcl09e3R5cGU6InYzIix2YWx1ZTpvLnRvQXJyYXkoKX06byYmby5pc1ZlY3RvcjQ/ZS51bmlmb3Jtc1tyXT17dHlwZToidjQiLHZhbHVlOm8udG9BcnJheSgpfTpvJiZvLmlzTWF0cml4Mz9lLnVuaWZvcm1zW3JdPXt0eXBlOiJtMyIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNNYXRyaXg0P2UudW5pZm9ybXNbcl09e3R5cGU6Im00Iix2YWx1ZTpvLnRvQXJyYXkoKX06ZS51bmlmb3Jtc1tyXT17dmFsdWU6b319T2JqZWN0LmtleXModGhpcy5kZWZpbmVzKS5sZW5ndGg+MCYmKGUuZGVmaW5lcz10aGlzLmRlZmluZXMpLGUudmVydGV4U2hhZGVyPXRoaXMudmVydGV4U2hhZGVyLGUuZnJhZ21lbnRTaGFkZXI9dGhpcy5mcmFnbWVudFNoYWRlcixlLmxpZ2h0cz10aGlzLmxpZ2h0cyxlLmNsaXBwaW5nPXRoaXMuY2xpcHBpbmc7Y29uc3Qgbj17fTtmb3IoY29uc3QgciBpbiB0aGlzLmV4dGVuc2lvbnMpdGhpcy5leHRlbnNpb25zW3JdPT09ITAmJihuW3JdPSEwKTtyZXR1cm4gT2JqZWN0LmtleXMobikubGVuZ3RoPjAmJihlLmV4dGVuc2lvbnM9biksZX19Y2xhc3MgS2MgZXh0ZW5kcyBhZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0NhbWVyYT0hMCx0aGlzLnR5cGU9IkNhbWVyYSIsdGhpcy5tYXRyaXhXb3JsZEludmVyc2U9bmV3IFJ0LHRoaXMucHJvamVjdGlvbk1hdHJpeD1uZXcgUnQsdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgUnQsdGhpcy5jb29yZGluYXRlU3lzdGVtPUVpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodC5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KHQucHJvamVjdGlvbk1hdHJpeCksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLHRoaXMuY29vcmRpbmF0ZVN5c3RlbT10LmNvb3JkaW5hdGVTeXN0ZW0sdGhpc31nZXRXb3JsZERpcmVjdGlvbih0KXtyZXR1cm4gc3VwZXIuZ2V0V29ybGREaXJlY3Rpb24odCkubmVnYXRlKCl9dXBkYXRlTWF0cml4V29ybGQodCl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQodCksdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKX11cGRhdGVXb3JsZE1hdHJpeCh0LGUpe3N1cGVyLnVwZGF0ZVdvcmxkTWF0cml4KHQsZSksdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IHdyPW5ldyBSLE95PW5ldyBYLHp5PW5ldyBYO2NsYXNzIFllIGV4dGVuZHMgS2N7Y29uc3RydWN0b3IodD01MCxlPTEsbj0uMSxyPTJlMyl7c3VwZXIoKSx0aGlzLmlzUGVyc3BlY3RpdmVDYW1lcmE9ITAsdGhpcy50eXBlPSJQZXJzcGVjdGl2ZUNhbWVyYSIsdGhpcy5mb3Y9dCx0aGlzLnpvb209MSx0aGlzLm5lYXI9bix0aGlzLmZhcj1yLHRoaXMuZm9jdXM9MTAsdGhpcy5hc3BlY3Q9ZSx0aGlzLnZpZXc9bnVsbCx0aGlzLmZpbG1HYXVnZT0zNSx0aGlzLmZpbG1PZmZzZXQ9MCx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmZvdj10LmZvdix0aGlzLnpvb209dC56b29tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy5mb2N1cz10LmZvY3VzLHRoaXMuYXNwZWN0PXQuYXNwZWN0LHRoaXMudmlldz10LnZpZXc9PT1udWxsP251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXMuZmlsbUdhdWdlPXQuZmlsbUdhdWdlLHRoaXMuZmlsbU9mZnNldD10LmZpbG1PZmZzZXQsdGhpc31zZXRGb2NhbExlbmd0aCh0KXtjb25zdCBlPS41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3Q7dGhpcy5mb3Y9anMqMipNYXRoLmF0YW4oZSksdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Z2V0Rm9jYWxMZW5ndGgoKXtjb25zdCB0PU1hdGgudGFuKFFyKi41KnRoaXMuZm92KTtyZXR1cm4gLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvdH1nZXRFZmZlY3RpdmVGT1YoKXtyZXR1cm4ganMqMipNYXRoLmF0YW4oTWF0aC50YW4oUXIqLjUqdGhpcy5mb3YpL3RoaXMuem9vbSl9Z2V0RmlsbVdpZHRoKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlKk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfWdldEZpbG1IZWlnaHQoKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9Z2V0Vmlld0JvdW5kcyh0LGUsbil7d3Iuc2V0KC0xLC0xLC41KS5hcHBseU1hdHJpeDQodGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksZS5zZXQod3IueCx3ci55KS5tdWx0aXBseVNjYWxhcigtdC93ci56KSx3ci5zZXQoMSwxLC41KS5hcHBseU1hdHJpeDQodGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksbi5zZXQod3IueCx3ci55KS5tdWx0aXBseVNjYWxhcigtdC93ci56KX1nZXRWaWV3U2l6ZSh0LGUpe3JldHVybiB0aGlzLmdldFZpZXdCb3VuZHModCxPeSx6eSksZS5zdWJWZWN0b3JzKHp5LE95KX1zZXRWaWV3T2Zmc2V0KHQsZSxuLHIscyxvKXt0aGlzLmFzcGVjdD10L2UsdGhpcy52aWV3PT09bnVsbCYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSksdGhpcy52aWV3LmVuYWJsZWQ9ITAsdGhpcy52aWV3LmZ1bGxXaWR0aD10LHRoaXMudmlldy5mdWxsSGVpZ2h0PWUsdGhpcy52aWV3Lm9mZnNldFg9bix0aGlzLnZpZXcub2Zmc2V0WT1yLHRoaXMudmlldy53aWR0aD1zLHRoaXMudmlldy5oZWlnaHQ9byx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jbGVhclZpZXdPZmZzZXQoKXt0aGlzLnZpZXchPT1udWxsJiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfXVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKXtjb25zdCB0PXRoaXMubmVhcjtsZXQgZT10Kk1hdGgudGFuKFFyKi41KnRoaXMuZm92KS90aGlzLnpvb20sbj0yKmUscj10aGlzLmFzcGVjdCpuLHM9LS41KnI7Y29uc3Qgbz10aGlzLnZpZXc7aWYodGhpcy52aWV3IT09bnVsbCYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IGw9by5mdWxsV2lkdGgsYz1vLmZ1bGxIZWlnaHQ7cys9by5vZmZzZXRYKnIvbCxlLT1vLm9mZnNldFkqbi9jLHIqPW8ud2lkdGgvbCxuKj1vLmhlaWdodC9jfWNvbnN0IGE9dGhpcy5maWxtT2Zmc2V0O2EhPT0wJiYocys9dCphL3RoaXMuZ2V0RmlsbVdpZHRoKCkpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUocyxzK3IsZSxlLW4sdCx0aGlzLmZhcix0aGlzLmNvb3JkaW5hdGVTeXN0ZW0pLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3QuZm92PXRoaXMuZm92LGUub2JqZWN0Lnpvb209dGhpcy56b29tLGUub2JqZWN0Lm5lYXI9dGhpcy5uZWFyLGUub2JqZWN0LmZhcj10aGlzLmZhcixlLm9iamVjdC5mb2N1cz10aGlzLmZvY3VzLGUub2JqZWN0LmFzcGVjdD10aGlzLmFzcGVjdCx0aGlzLnZpZXchPT1udWxsJiYoZS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpLGUub2JqZWN0LmZpbG1HYXVnZT10aGlzLmZpbG1HYXVnZSxlLm9iamVjdC5maWxtT2Zmc2V0PXRoaXMuZmlsbU9mZnNldCxlfX1jb25zdCBmbz0tOTAscG89MTtjbGFzcyBreSBleHRlbmRzIGFle2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMudHlwZT0iQ3ViZUNhbWVyYSIsdGhpcy5yZW5kZXJUYXJnZXQ9bix0aGlzLmNvb3JkaW5hdGVTeXN0ZW09bnVsbCx0aGlzLmFjdGl2ZU1pcG1hcExldmVsPTA7Y29uc3Qgcj1uZXcgWWUoZm8scG8sdCxlKTtyLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChyKTtjb25zdCBzPW5ldyBZZShmbyxwbyx0LGUpO3MubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKHMpO2NvbnN0IG89bmV3IFllKGZvLHBvLHQsZSk7by5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQobyk7Y29uc3QgYT1uZXcgWWUoZm8scG8sdCxlKTthLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChhKTtjb25zdCBsPW5ldyBZZShmbyxwbyx0LGUpO2wubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKGwpO2NvbnN0IGM9bmV3IFllKGZvLHBvLHQsZSk7Yy5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQoYyl9dXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpe2NvbnN0IHQ9dGhpcy5jb29yZGluYXRlU3lzdGVtLGU9dGhpcy5jaGlsZHJlbi5jb25jYXQoKSxbbixyLHMsbyxhLGxdPWU7Zm9yKGNvbnN0IGMgb2YgZSl0aGlzLnJlbW92ZShjKTtpZih0PT09RWkpbi51cC5zZXQoMCwxLDApLG4ubG9va0F0KDEsMCwwKSxyLnVwLnNldCgwLDEsMCksci5sb29rQXQoLTEsMCwwKSxzLnVwLnNldCgwLDAsLTEpLHMubG9va0F0KDAsMSwwKSxvLnVwLnNldCgwLDAsMSksby5sb29rQXQoMCwtMSwwKSxhLnVwLnNldCgwLDEsMCksYS5sb29rQXQoMCwwLDEpLGwudXAuc2V0KDAsMSwwKSxsLmxvb2tBdCgwLDAsLTEpO2Vsc2UgaWYodD09PWJhKW4udXAuc2V0KDAsLTEsMCksbi5sb29rQXQoLTEsMCwwKSxyLnVwLnNldCgwLC0xLDApLHIubG9va0F0KDEsMCwwKSxzLnVwLnNldCgwLDAsMSkscy5sb29rQXQoMCwxLDApLG8udXAuc2V0KDAsMCwtMSksby5sb29rQXQoMCwtMSwwKSxhLnVwLnNldCgwLC0xLDApLGEubG9va0F0KDAsMCwxKSxsLnVwLnNldCgwLC0xLDApLGwubG9va0F0KDAsMCwtMSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkN1YmVDYW1lcmEudXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK3QpO2Zvcihjb25zdCBjIG9mIGUpdGhpcy5hZGQoYyksYy51cGRhdGVNYXRyaXhXb3JsZCgpfXVwZGF0ZSh0LGUpe3RoaXMucGFyZW50PT09bnVsbCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0e3JlbmRlclRhcmdldDpuLGFjdGl2ZU1pcG1hcExldmVsOnJ9PXRoaXM7dGhpcy5jb29yZGluYXRlU3lzdGVtIT09dC5jb29yZGluYXRlU3lzdGVtJiYodGhpcy5jb29yZGluYXRlU3lzdGVtPXQuY29vcmRpbmF0ZVN5c3RlbSx0aGlzLnVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0oKSk7Y29uc3RbcyxvLGEsbCxjLHVdPXRoaXMuY2hpbGRyZW4saD10LmdldFJlbmRlclRhcmdldCgpLGY9dC5nZXRBY3RpdmVDdWJlRmFjZSgpLGQ9dC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLHA9dC54ci5lbmFibGVkO3QueHIuZW5hYmxlZD0hMTtjb25zdCB5PW4udGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7bi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz0hMSx0LnNldFJlbmRlclRhcmdldChuLDAsciksdC5yZW5kZXIoZSxzKSx0LnNldFJlbmRlclRhcmdldChuLDEsciksdC5yZW5kZXIoZSxvKSx0LnNldFJlbmRlclRhcmdldChuLDIsciksdC5yZW5kZXIoZSxhKSx0LnNldFJlbmRlclRhcmdldChuLDMsciksdC5yZW5kZXIoZSxsKSx0LnNldFJlbmRlclRhcmdldChuLDQsciksdC5yZW5kZXIoZSxjKSxuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPXksdC5zZXRSZW5kZXJUYXJnZXQobiw1LHIpLHQucmVuZGVyKGUsdSksdC5zZXRSZW5kZXJUYXJnZXQoaCxmLGQpLHQueHIuZW5hYmxlZD1wLG4udGV4dHVyZS5uZWVkc1BNUkVNVXBkYXRlPSEwfX1jbGFzcyBJYSBleHRlbmRzIFRle2NvbnN0cnVjdG9yKHQsZSxuLHIscyxvLGEsbCxjLHUpe3Q9dCE9PXZvaWQgMD90OltdLGU9ZSE9PXZvaWQgMD9lOmtpLHN1cGVyKHQsZSxuLHIscyxvLGEsbCxjLHUpLHRoaXMuaXNDdWJlVGV4dHVyZT0hMCx0aGlzLmZsaXBZPSExfWdldCBpbWFnZXMoKXtyZXR1cm4gdGhpcy5pbWFnZX1zZXQgaW1hZ2VzKHQpe3RoaXMuaW1hZ2U9dH19Y2xhc3MgVnkgZXh0ZW5kcyBvaXtjb25zdHJ1Y3Rvcih0PTEsZT17fSl7c3VwZXIodCx0LGUpLHRoaXMuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ9ITA7Y29uc3Qgbj17d2lkdGg6dCxoZWlnaHQ6dCxkZXB0aDoxfSxyPVtuLG4sbixuLG4sbl07dGhpcy50ZXh0dXJlPW5ldyBJYShyLGUubWFwcGluZyxlLndyYXBTLGUud3JhcFQsZS5tYWdGaWx0ZXIsZS5taW5GaWx0ZXIsZS5mb3JtYXQsZS50eXBlLGUuYW5pc290cm9weSxlLmNvbG9yU3BhY2UpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1lLmdlbmVyYXRlTWlwbWFwcyE9PXZvaWQgMD9lLmdlbmVyYXRlTWlwbWFwczohMSx0aGlzLnRleHR1cmUubWluRmlsdGVyPWUubWluRmlsdGVyIT09dm9pZCAwP2UubWluRmlsdGVyOlZlfWZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKHQsZSl7dGhpcy50ZXh0dXJlLnR5cGU9ZS50eXBlLHRoaXMudGV4dHVyZS5jb2xvclNwYWNlPWUuY29sb3JTcGFjZSx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPWUuZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9ZS5taW5GaWx0ZXIsdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcj1lLm1hZ0ZpbHRlcjtjb25zdCBuPXt1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOmAKCgkJCQl2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwoKCQkJCXZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7CgoJCQkJCXJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApOwoKCQkJCX0KCgkJCQl2b2lkIG1haW4oKSB7CgoJCQkJCXZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7CgoJCQkJCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkJCQkJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoKCQkJCX0KCQkJYCxmcmFnbWVudFNoYWRlcjpgCgoJCQkJdW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0OwoKCQkJCXZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CgoJCQkJI2luY2x1ZGUgPGNvbW1vbj4KCgkJCQl2b2lkIG1haW4oKSB7CgoJCQkJCXZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTsKCgkJCQkJdmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApOwoKCQkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTsKCgkJCQl9CgkJCWB9LHI9bmV3IHJzKDUsNSw1KSxzPW5ldyB1aSh7bmFtZToiQ3ViZW1hcEZyb21FcXVpcmVjdCIsdW5pZm9ybXM6aG8obi51bmlmb3JtcyksdmVydGV4U2hhZGVyOm4udmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOm4uZnJhZ21lbnRTaGFkZXIsc2lkZTpKZSxibGVuZGluZzpPaX0pO3MudW5pZm9ybXMudEVxdWlyZWN0LnZhbHVlPWU7Y29uc3Qgbz1uZXcgVWUocixzKSxhPWUubWluRmlsdGVyO3JldHVybiBlLm1pbkZpbHRlcj09PXdpJiYoZS5taW5GaWx0ZXI9VmUpLG5ldyBreSgxLDEwLHRoaXMpLnVwZGF0ZSh0LG8pLGUubWluRmlsdGVyPWEsby5nZW9tZXRyeS5kaXNwb3NlKCksby5tYXRlcmlhbC5kaXNwb3NlKCksdGhpc31jbGVhcih0LGUsbixyKXtjb25zdCBzPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7Zm9yKGxldCBvPTA7bzw2O28rKyl0LnNldFJlbmRlclRhcmdldCh0aGlzLG8pLHQuY2xlYXIoZSxuLHIpO3Quc2V0UmVuZGVyVGFyZ2V0KHMpfX1jbGFzcyBRY3tjb25zdHJ1Y3Rvcih0LGU9MjVlLTUpe3RoaXMuaXNGb2dFeHAyPSEwLHRoaXMubmFtZT0iIix0aGlzLmNvbG9yPW5ldyB4dCh0KSx0aGlzLmRlbnNpdHk9ZX1jbG9uZSgpe3JldHVybiBuZXcgUWModGhpcy5jb2xvcix0aGlzLmRlbnNpdHkpfXRvSlNPTigpe3JldHVybnt0eXBlOiJGb2dFeHAyIixuYW1lOnRoaXMubmFtZSxjb2xvcjp0aGlzLmNvbG9yLmdldEhleCgpLGRlbnNpdHk6dGhpcy5kZW5zaXR5fX19Y2xhc3MgdHV7Y29uc3RydWN0b3IodCxlPTEsbj0xZTMpe3RoaXMuaXNGb2c9ITAsdGhpcy5uYW1lPSIiLHRoaXMuY29sb3I9bmV3IHh0KHQpLHRoaXMubmVhcj1lLHRoaXMuZmFyPW59Y2xvbmUoKXtyZXR1cm4gbmV3IHR1KHRoaXMuY29sb3IsdGhpcy5uZWFyLHRoaXMuZmFyKX10b0pTT04oKXtyZXR1cm57dHlwZToiRm9nIixuYW1lOnRoaXMubmFtZSxjb2xvcjp0aGlzLmNvbG9yLmdldEhleCgpLG5lYXI6dGhpcy5uZWFyLGZhcjp0aGlzLmZhcn19fWNsYXNzIEd5IGV4dGVuZHMgYWV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNTY2VuZT0hMCx0aGlzLnR5cGU9IlNjZW5lIix0aGlzLmJhY2tncm91bmQ9bnVsbCx0aGlzLmVudmlyb25tZW50PW51bGwsdGhpcy5mb2c9bnVsbCx0aGlzLmJhY2tncm91bmRCbHVycmluZXNzPTAsdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5PTEsdGhpcy5iYWNrZ3JvdW5kUm90YXRpb249bmV3IEJuLHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHk9MSx0aGlzLmVudmlyb25tZW50Um90YXRpb249bmV3IEJuLHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1udWxsLHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18hPSJ1bmRlZmluZWQiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0LmJhY2tncm91bmQhPT1udWxsJiYodGhpcy5iYWNrZ3JvdW5kPXQuYmFja2dyb3VuZC5jbG9uZSgpKSx0LmVudmlyb25tZW50IT09bnVsbCYmKHRoaXMuZW52aXJvbm1lbnQ9dC5lbnZpcm9ubWVudC5jbG9uZSgpKSx0LmZvZyE9PW51bGwmJih0aGlzLmZvZz10LmZvZy5jbG9uZSgpKSx0aGlzLmJhY2tncm91bmRCbHVycmluZXNzPXQuYmFja2dyb3VuZEJsdXJyaW5lc3MsdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5PXQuYmFja2dyb3VuZEludGVuc2l0eSx0aGlzLmJhY2tncm91bmRSb3RhdGlvbi5jb3B5KHQuYmFja2dyb3VuZFJvdGF0aW9uKSx0aGlzLmVudmlyb25tZW50SW50ZW5zaXR5PXQuZW52aXJvbm1lbnRJbnRlbnNpdHksdGhpcy5lbnZpcm9ubWVudFJvdGF0aW9uLmNvcHkodC5lbnZpcm9ubWVudFJvdGF0aW9uKSx0Lm92ZXJyaWRlTWF0ZXJpYWwhPT1udWxsJiYodGhpcy5vdmVycmlkZU1hdGVyaWFsPXQub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiB0aGlzLmZvZyE9PW51bGwmJihlLm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpLHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M+MCYmKGUub2JqZWN0LmJhY2tncm91bmRCbHVycmluZXNzPXRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3MpLHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSE9PTEmJihlLm9iamVjdC5iYWNrZ3JvdW5kSW50ZW5zaXR5PXRoaXMuYmFja2dyb3VuZEludGVuc2l0eSksZS5vYmplY3QuYmFja2dyb3VuZFJvdGF0aW9uPXRoaXMuYmFja2dyb3VuZFJvdGF0aW9uLnRvQXJyYXkoKSx0aGlzLmVudmlyb25tZW50SW50ZW5zaXR5IT09MSYmKGUub2JqZWN0LmVudmlyb25tZW50SW50ZW5zaXR5PXRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkpLGUub2JqZWN0LmVudmlyb25tZW50Um90YXRpb249dGhpcy5lbnZpcm9ubWVudFJvdGF0aW9uLnRvQXJyYXkoKSxlfX1jbGFzcyBldXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlcj0hMCx0aGlzLmFycmF5PXQsdGhpcy5zdHJpZGU9ZSx0aGlzLmNvdW50PXQhPT12b2lkIDA/dC5sZW5ndGgvZTowLHRoaXMudXNhZ2U9TWEsdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy52ZXJzaW9uPTAsdGhpcy51dWlkPU5uKCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5jb3VudD10LmNvdW50LHRoaXMuc3RyaWRlPXQuc3RyaWRlLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzfWNvcHlBdCh0LGUsbil7dCo9dGhpcy5zdHJpZGUsbio9ZS5zdHJpZGU7Zm9yKGxldCByPTAscz10aGlzLnN0cmlkZTtyPHM7cisrKXRoaXMuYXJyYXlbdCtyXT1lLmFycmF5W24rcl07cmV0dXJuIHRoaXN9c2V0KHQsZT0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCxlKSx0aGlzfWNsb25lKHQpe3QuYXJyYXlCdWZmZXJzPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnM9e30pLHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPT09dm9pZCAwJiYodGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9Tm4oKSksdC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSksbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gbi5zZXRVc2FnZSh0aGlzLnVzYWdlKSxufW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdC5hcnJheUJ1ZmZlcnM9PT12b2lkIDAmJih0LmFycmF5QnVmZmVycz17fSksdGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9PT12b2lkIDAmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1ObigpKSx0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09PT12b2lkIDAmJih0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09QXJyYXkuZnJvbShuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheS5idWZmZXIpKSkse3V1aWQ6dGhpcy51dWlkLGJ1ZmZlcjp0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxzdHJpZGU6dGhpcy5zdHJpZGV9fX1jb25zdCB1bj1uZXcgUjtjbGFzcyBzc3tjb25zdHJ1Y3Rvcih0LGUsbixyPSExKXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1uLHRoaXMubm9ybWFsaXplZD1yfWdldCBjb3VudCgpe3JldHVybiB0aGlzLmRhdGEuY291bnR9Z2V0IGFycmF5KCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX1zZXQgbmVlZHNVcGRhdGUodCl7dGhpcy5kYXRhLm5lZWRzVXBkYXRlPXR9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5kYXRhLmNvdW50O2U8bjtlKyspdW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHVuLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLHVuLngsdW4ueSx1bi56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKyl1bi5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksdW4uYXBwbHlOb3JtYWxNYXRyaXgodCksdGhpcy5zZXRYWVooZSx1bi54LHVuLnksdW4ueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXVuLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSx1bi50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpcy5zZXRYWVooZSx1bi54LHVuLnksdW4ueik7cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IG49dGhpcy5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49bG4obix0aGlzLmFycmF5KSksbn1zZXRDb21wb25lbnQodCxlLG4pe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPVp0KG4sdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrZV09bix0aGlzfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XT1lLHRoaXN9c2V0WSh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVp0KGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdPWUsdGhpc31zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9WnQoZSx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXT1lLHRoaXN9Z2V0WCh0KXtsZXQgZT10aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfWdldFkodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfWdldFoodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfWdldFcodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1sbihlLHRoaXMuYXJyYXkpKSxlfXNldFhZKHQsZSxuKXtyZXR1cm4gdD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYoZT1adChlLHRoaXMuYXJyYXkpLG49WnQobix0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXN9c2V0WFlaKHQsZSxuLHIpe3JldHVybiB0PXQqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCx0aGlzLm5vcm1hbGl6ZWQmJihlPVp0KGUsdGhpcy5hcnJheSksbj1adChuLHRoaXMuYXJyYXkpLHI9WnQocix0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXMuZGF0YS5hcnJheVt0KzJdPXIsdGhpc31zZXRYWVpXKHQsZSxuLHIscyl7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9WnQoZSx0aGlzLmFycmF5KSxuPVp0KG4sdGhpcy5hcnJheSkscj1adChyLHRoaXMuYXJyYXkpLHM9WnQocyx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXMuZGF0YS5hcnJheVt0KzJdPXIsdGhpcy5kYXRhLmFycmF5W3QrM109cyx0aGlzfWNsb25lKHQpe2lmKHQ9PT12b2lkIDApe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5jbG9uZSgpOiBDbG9uaW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpO2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0aGlzLmNvdW50O24rKyl7Y29uc3Qgcj1uKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7Zm9yKGxldCBzPTA7czx0aGlzLml0ZW1TaXplO3MrKyllLnB1c2godGhpcy5kYXRhLmFycmF5W3Irc10pfXJldHVybiBuZXcgSnQobmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IoZSksdGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQpfWVsc2UgcmV0dXJuIHQuaW50ZXJsZWF2ZWRCdWZmZXJzPT09dm9pZCAwJiYodC5pbnRlcmxlYXZlZEJ1ZmZlcnM9e30pLHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT10aGlzLmRhdGEuY2xvbmUodCkpLG5ldyBzcyh0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0sdGhpcy5pdGVtU2l6ZSx0aGlzLm9mZnNldCx0aGlzLm5vcm1hbGl6ZWQpfXRvSlNPTih0KXtpZih0PT09dm9pZCAwKXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUudG9KU09OKCk6IFNlcmlhbGl6aW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpO2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0aGlzLmNvdW50O24rKyl7Y29uc3Qgcj1uKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7Zm9yKGxldCBzPTA7czx0aGlzLml0ZW1TaXplO3MrKyllLnB1c2godGhpcy5kYXRhLmFycmF5W3Irc10pfXJldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OmUsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fWVsc2UgcmV0dXJuIHQuaW50ZXJsZWF2ZWRCdWZmZXJzPT09dm9pZCAwJiYodC5pbnRlcmxlYXZlZEJ1ZmZlcnM9e30pLHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT10aGlzLmRhdGEudG9KU09OKHQpKSx7aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTohMCxpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLGRhdGE6dGhpcy5kYXRhLnV1aWQsb2Zmc2V0OnRoaXMub2Zmc2V0LG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfX19Y2xhc3Mga2QgZXh0ZW5kcyBRZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNTcHJpdGVNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlNwcml0ZU1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB4dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5yb3RhdGlvbj0wLHRoaXMuc2l6ZUF0dGVudWF0aW9uPSEwLHRoaXMudHJhbnNwYXJlbnQ9ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbix0aGlzLmZvZz10LmZvZyx0aGlzfX1sZXQgbW87Y29uc3QgTGE9bmV3IFIsZ289bmV3IFIseW89bmV3IFIsX289bmV3IFgsRGE9bmV3IFgsSHk9bmV3IFJ0LG51PW5ldyBSLFVhPW5ldyBSLGl1PW5ldyBSLFd5PW5ldyBYLFZkPW5ldyBYLCR5PW5ldyBYO2NsYXNzIFh5IGV4dGVuZHMgYWV7Y29uc3RydWN0b3IodD1uZXcga2Qpe2lmKHN1cGVyKCksdGhpcy5pc1Nwcml0ZT0hMCx0aGlzLnR5cGU9IlNwcml0ZSIsbW89PT12b2lkIDApe21vPW5ldyBGdDtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkoWy0uNSwtLjUsMCwwLDAsLjUsLS41LDAsMSwwLC41LC41LDAsMSwxLC0uNSwuNSwwLDAsMV0pLG49bmV3IGV1KGUsNSk7bW8uc2V0SW5kZXgoWzAsMSwyLDAsMiwzXSksbW8uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHNzKG4sMywwLCExKSksbW8uc2V0QXR0cmlidXRlKCJ1diIsbmV3IHNzKG4sMiwzLCExKSl9dGhpcy5nZW9tZXRyeT1tbyx0aGlzLm1hdGVyaWFsPXQsdGhpcy5jZW50ZXI9bmV3IFgoLjUsLjUpfXJheWNhc3QodCxlKXt0LmNhbWVyYT09PW51bGwmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLlNwcml0ZTogIlJheWNhc3Rlci5jYW1lcmEiIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byByYXljYXN0IGFnYWluc3Qgc3ByaXRlcy4nKSxnby5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCksSHkuY29weSh0LmNhbWVyYS5tYXRyaXhXb3JsZCksdGhpcy5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyh0LmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsdGhpcy5tYXRyaXhXb3JsZCkseW8uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubW9kZWxWaWV3TWF0cml4KSx0LmNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhJiZ0aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbj09PSExJiZnby5tdWx0aXBseVNjYWxhcigteW8ueik7Y29uc3Qgbj10aGlzLm1hdGVyaWFsLnJvdGF0aW9uO2xldCByLHM7biE9PTAmJihzPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obikpO2NvbnN0IG89dGhpcy5jZW50ZXI7cnUobnUuc2V0KC0uNSwtLjUsMCkseW8sbyxnbyxyLHMpLHJ1KFVhLnNldCguNSwtLjUsMCkseW8sbyxnbyxyLHMpLHJ1KGl1LnNldCguNSwuNSwwKSx5byxvLGdvLHIscyksV3kuc2V0KDAsMCksVmQuc2V0KDEsMCksJHkuc2V0KDEsMSk7bGV0IGE9dC5yYXkuaW50ZXJzZWN0VHJpYW5nbGUobnUsVWEsaXUsITEsTGEpO2lmKGE9PT1udWxsJiYocnUoVWEuc2V0KC0uNSwuNSwwKSx5byxvLGdvLHIscyksVmQuc2V0KDAsMSksYT10LnJheS5pbnRlcnNlY3RUcmlhbmdsZShudSxpdSxVYSwhMSxMYSksYT09PW51bGwpKXJldHVybjtjb25zdCBsPXQucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKExhKTtsPHQubmVhcnx8bD50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpsLHBvaW50OkxhLmNsb25lKCksdXY6X2UuZ2V0SW50ZXJwb2xhdGlvbihMYSxudSxVYSxpdSxXeSxWZCwkeSxuZXcgWCksZmFjZTpudWxsLG9iamVjdDp0aGlzfSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdC5jZW50ZXIhPT12b2lkIDAmJnRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzfX1mdW5jdGlvbiBydShpLHQsZSxuLHIscyl7X28uc3ViVmVjdG9ycyhpLGUpLmFkZFNjYWxhciguNSkubXVsdGlwbHkobiksciE9PXZvaWQgMD8oRGEueD1zKl9vLngtcipfby55LERhLnk9cipfby54K3MqX28ueSk6RGEuY29weShfbyksaS5jb3B5KHQpLGkueCs9RGEueCxpLnkrPURhLnksaS5hcHBseU1hdHJpeDQoSHkpfWNvbnN0IHN1PW5ldyBSLHF5PW5ldyBSO2NsYXNzIFl5IGV4dGVuZHMgYWV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2N1cnJlbnRMZXZlbD0wLHRoaXMudHlwZT0iTE9EIixPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtsZXZlbHM6e2VudW1lcmFibGU6ITAsdmFsdWU6W119LGlzTE9EOnt2YWx1ZTohMH19KSx0aGlzLmF1dG9VcGRhdGU9ITB9Y29weSh0KXtzdXBlci5jb3B5KHQsITEpO2NvbnN0IGU9dC5sZXZlbHM7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXtjb25zdCBzPWVbbl07dGhpcy5hZGRMZXZlbChzLm9iamVjdC5jbG9uZSgpLHMuZGlzdGFuY2Uscy5oeXN0ZXJlc2lzKX1yZXR1cm4gdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzfWFkZExldmVsKHQsZT0wLG49MCl7ZT1NYXRoLmFicyhlKTtjb25zdCByPXRoaXMubGV2ZWxzO2xldCBzO2ZvcihzPTA7czxyLmxlbmd0aCYmIShlPHJbc10uZGlzdGFuY2UpO3MrKyk7cmV0dXJuIHIuc3BsaWNlKHMsMCx7ZGlzdGFuY2U6ZSxoeXN0ZXJlc2lzOm4sb2JqZWN0OnR9KSx0aGlzLmFkZCh0KSx0aGlzfXJlbW92ZUxldmVsKHQpe2NvbnN0IGU9dGhpcy5sZXZlbHM7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoZVtuXS5kaXN0YW5jZT09PXQpe2NvbnN0IHI9ZS5zcGxpY2UobiwxKTtyZXR1cm4gdGhpcy5yZW1vdmUoclswXS5vYmplY3QpLCEwfXJldHVybiExfWdldEN1cnJlbnRMZXZlbCgpe3JldHVybiB0aGlzLl9jdXJyZW50TGV2ZWx9Z2V0T2JqZWN0Rm9yRGlzdGFuY2UodCl7Y29uc3QgZT10aGlzLmxldmVscztpZihlLmxlbmd0aD4wKXtsZXQgbixyO2ZvcihuPTEscj1lLmxlbmd0aDtuPHI7bisrKXtsZXQgcz1lW25dLmRpc3RhbmNlO2lmKGVbbl0ub2JqZWN0LnZpc2libGUmJihzLT1zKmVbbl0uaHlzdGVyZXNpcyksdDxzKWJyZWFrfXJldHVybiBlW24tMV0ub2JqZWN0fXJldHVybiBudWxsfXJheWNhc3QodCxlKXtpZih0aGlzLmxldmVscy5sZW5ndGg+MCl7c3Uuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2NvbnN0IHI9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oc3UpO3RoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UocikucmF5Y2FzdCh0LGUpfX11cGRhdGUodCl7Y29uc3QgZT10aGlzLmxldmVscztpZihlLmxlbmd0aD4xKXtzdS5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCkscXkuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2NvbnN0IG49c3UuZGlzdGFuY2VUbyhxeSkvdC56b29tO2VbMF0ub2JqZWN0LnZpc2libGU9ITA7bGV0IHIscztmb3Iocj0xLHM9ZS5sZW5ndGg7cjxzO3IrKyl7bGV0IG89ZVtyXS5kaXN0YW5jZTtpZihlW3JdLm9iamVjdC52aXNpYmxlJiYoby09byplW3JdLmh5c3RlcmVzaXMpLG4+PW8pZVtyLTFdLm9iamVjdC52aXNpYmxlPSExLGVbcl0ub2JqZWN0LnZpc2libGU9ITA7ZWxzZSBicmVha31mb3IodGhpcy5fY3VycmVudExldmVsPXItMTtyPHM7cisrKWVbcl0ub2JqZWN0LnZpc2libGU9ITF9fXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTt0aGlzLmF1dG9VcGRhdGU9PT0hMSYmKGUub2JqZWN0LmF1dG9VcGRhdGU9ITEpLGUub2JqZWN0LmxldmVscz1bXTtjb25zdCBuPXRoaXMubGV2ZWxzO2ZvcihsZXQgcj0wLHM9bi5sZW5ndGg7cjxzO3IrKyl7Y29uc3Qgbz1uW3JdO2Uub2JqZWN0LmxldmVscy5wdXNoKHtvYmplY3Q6by5vYmplY3QudXVpZCxkaXN0YW5jZTpvLmRpc3RhbmNlLGh5c3RlcmVzaXM6by5oeXN0ZXJlc2lzfSl9cmV0dXJuIGV9fWNvbnN0IFp5PW5ldyBSLEp5PW5ldyBRdCxqeT1uZXcgUXQsSkE9bmV3IFIsS3k9bmV3IFJ0LG91PW5ldyBSLEdkPW5ldyBxZSxReT1uZXcgUnQsSGQ9bmV3IHZyO2NsYXNzIHRfIGV4dGVuZHMgVWV7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuaXNTa2lubmVkTWVzaD0hMCx0aGlzLnR5cGU9IlNraW5uZWRNZXNoIix0aGlzLmJpbmRNb2RlPW5kLHRoaXMuYmluZE1hdHJpeD1uZXcgUnQsdGhpcy5iaW5kTWF0cml4SW52ZXJzZT1uZXcgUnQsdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbH1jb21wdXRlQm91bmRpbmdCb3goKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBtZSksdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtjb25zdCBlPXQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2ZvcihsZXQgbj0wO248ZS5jb3VudDtuKyspdGhpcy5nZXRWZXJ0ZXhQb3NpdGlvbihuLG91KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQob3UpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IHFlKSx0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO2NvbnN0IGU9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBuPTA7bjxlLmNvdW50O24rKyl0aGlzLmdldFZlcnRleFBvc2l0aW9uKG4sb3UpLHRoaXMuYm91bmRpbmdTcGhlcmUuZXhwYW5kQnlQb2ludChvdSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5iaW5kTW9kZT10LmJpbmRNb2RlLHRoaXMuYmluZE1hdHJpeC5jb3B5KHQuYmluZE1hdHJpeCksdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHQuYmluZE1hdHJpeEludmVyc2UpLHRoaXMuc2tlbGV0b249dC5za2VsZXRvbix0LmJvdW5kaW5nQm94IT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9dC5ib3VuZGluZ0JveC5jbG9uZSgpKSx0LmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9dC5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKSx0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO24hPT12b2lkIDAmJih0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxHZC5jb3B5KHRoaXMuYm91bmRpbmdTcGhlcmUpLEdkLmFwcGx5TWF0cml4NChyKSx0LnJheS5pbnRlcnNlY3RzU3BoZXJlKEdkKSE9PSExJiYoUXkuY29weShyKS5pbnZlcnQoKSxIZC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoUXkpLCEodGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJkhkLmludGVyc2VjdHNCb3godGhpcy5ib3VuZGluZ0JveCk9PT0hMSkmJnRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKHQsZSxIZCkpKX1nZXRWZXJ0ZXhQb3NpdGlvbih0LGUpe3JldHVybiBzdXBlci5nZXRWZXJ0ZXhQb3NpdGlvbih0LGUpLHRoaXMuYXBwbHlCb25lVHJhbnNmb3JtKHQsZSksZX1iaW5kKHQsZSl7dGhpcy5za2VsZXRvbj10LGU9PT12b2lkIDAmJih0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKSx0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCksZT10aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmJpbmRNYXRyaXguY29weShlKSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoZSkuaW52ZXJ0KCl9cG9zZSgpe3RoaXMuc2tlbGV0b24ucG9zZSgpfW5vcm1hbGl6ZVNraW5XZWlnaHRzKCl7Y29uc3QgdD1uZXcgUXQsZT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbldlaWdodDtmb3IobGV0IG49MCxyPWUuY291bnQ7bjxyO24rKyl7dC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsbik7Y29uc3Qgcz0xL3QubWFuaGF0dGFuTGVuZ3RoKCk7cyE9PTEvMD90Lm11bHRpcGx5U2NhbGFyKHMpOnQuc2V0KDEsMCwwLDApLGUuc2V0WFlaVyhuLHQueCx0LnksdC56LHQudyl9fXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMuYmluZE1vZGU9PT1uZD90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk6dGhpcy5iaW5kTW9kZT09PWV5P3RoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLmJpbmRNYXRyaXgpLmludmVydCgpOmNvbnNvbGUud2FybigiVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogIit0aGlzLmJpbmRNb2RlKX1hcHBseUJvbmVUcmFuc2Zvcm0odCxlKXtjb25zdCBuPXRoaXMuc2tlbGV0b24scj10aGlzLmdlb21ldHJ5O0p5LmZyb21CdWZmZXJBdHRyaWJ1dGUoci5hdHRyaWJ1dGVzLnNraW5JbmRleCx0KSxqeS5mcm9tQnVmZmVyQXR0cmlidXRlKHIuYXR0cmlidXRlcy5za2luV2VpZ2h0LHQpLFp5LmNvcHkoZSkuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeCksZS5zZXQoMCwwLDApO2ZvcihsZXQgcz0wO3M8NDtzKyspe2NvbnN0IG89ankuZ2V0Q29tcG9uZW50KHMpO2lmKG8hPT0wKXtjb25zdCBhPUp5LmdldENvbXBvbmVudChzKTtLeS5tdWx0aXBseU1hdHJpY2VzKG4uYm9uZXNbYV0ubWF0cml4V29ybGQsbi5ib25lSW52ZXJzZXNbYV0pLGUuYWRkU2NhbGVkVmVjdG9yKEpBLmNvcHkoWnkpLmFwcGx5TWF0cml4NChLeSksbyl9fXJldHVybiBlLmFwcGx5TWF0cml4NCh0aGlzLmJpbmRNYXRyaXhJbnZlcnNlKX19Y2xhc3MgV2QgZXh0ZW5kcyBhZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0JvbmU9ITAsdGhpcy50eXBlPSJCb25lIn19Y2xhc3MgQ2kgZXh0ZW5kcyBUZXtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxyLHMsbyxhLGwsYz1YZSx1PVhlLGgsZil7c3VwZXIobnVsbCxvLGEsbCxjLHUscixzLGgsZiksdGhpcy5pc0RhdGFUZXh0dXJlPSEwLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpufSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmZsaXBZPSExLHRoaXMudW5wYWNrQWxpZ25tZW50PTF9fWNvbnN0IGVfPW5ldyBSdCxqQT1uZXcgUnQ7Y2xhc3MgYXV7Y29uc3RydWN0b3IodD1bXSxlPVtdKXt0aGlzLnV1aWQ9Tm4oKSx0aGlzLmJvbmVzPXQuc2xpY2UoMCksdGhpcy5ib25lSW52ZXJzZXM9ZSx0aGlzLmJvbmVNYXRyaWNlcz1udWxsLHRoaXMuYm9uZVRleHR1cmU9bnVsbCx0aGlzLmluaXQoKX1pbml0KCl7Y29uc3QgdD10aGlzLmJvbmVzLGU9dGhpcy5ib25lSW52ZXJzZXM7aWYodGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCoxNiksZS5sZW5ndGg9PT0wKXRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTtlbHNlIGlmKHQubGVuZ3RoIT09ZS5sZW5ndGgpe2NvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IE51bWJlciBvZiBpbnZlcnNlIGJvbmUgbWF0cmljZXMgZG9lcyBub3QgbWF0Y2ggYW1vdW50IG9mIGJvbmVzLiIpLHRoaXMuYm9uZUludmVyc2VzPVtdO2ZvcihsZXQgbj0wLHI9dGhpcy5ib25lcy5sZW5ndGg7bjxyO24rKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBSdCl9fWNhbGN1bGF0ZUludmVyc2VzKCl7dGhpcy5ib25lSW52ZXJzZXMubGVuZ3RoPTA7Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBuPW5ldyBSdDt0aGlzLmJvbmVzW3RdJiZuLmNvcHkodGhpcy5ib25lc1t0XS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdGhpcy5ib25lSW52ZXJzZXMucHVzaChuKX19cG9zZSgpe2ZvcihsZXQgdD0wLGU9dGhpcy5ib25lcy5sZW5ndGg7dDxlO3QrKyl7Y29uc3Qgbj10aGlzLmJvbmVzW3RdO24mJm4ubWF0cml4V29ybGQuY29weSh0aGlzLmJvbmVJbnZlcnNlc1t0XSkuaW52ZXJ0KCl9Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBuPXRoaXMuYm9uZXNbdF07biYmKG4ucGFyZW50JiZuLnBhcmVudC5pc0JvbmU/KG4ubWF0cml4LmNvcHkobi5wYXJlbnQubWF0cml4V29ybGQpLmludmVydCgpLG4ubWF0cml4Lm11bHRpcGx5KG4ubWF0cml4V29ybGQpKTpuLm1hdHJpeC5jb3B5KG4ubWF0cml4V29ybGQpLG4ubWF0cml4LmRlY29tcG9zZShuLnBvc2l0aW9uLG4ucXVhdGVybmlvbixuLnNjYWxlKSl9fXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5ib25lcyxlPXRoaXMuYm9uZUludmVyc2VzLG49dGhpcy5ib25lTWF0cmljZXMscj10aGlzLmJvbmVUZXh0dXJlO2ZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT10W3NdP3Rbc10ubWF0cml4V29ybGQ6akE7ZV8ubXVsdGlwbHlNYXRyaWNlcyhhLGVbc10pLGVfLnRvQXJyYXkobixzKjE2KX1yIT09bnVsbCYmKHIubmVlZHNVcGRhdGU9ITApfWNsb25lKCl7cmV0dXJuIG5ldyBhdSh0aGlzLmJvbmVzLHRoaXMuYm9uZUludmVyc2VzKX1jb21wdXRlQm9uZVRleHR1cmUoKXtsZXQgdD1NYXRoLnNxcnQodGhpcy5ib25lcy5sZW5ndGgqNCk7dD1NYXRoLmNlaWwodC80KSo0LHQ9TWF0aC5tYXgodCw0KTtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkodCp0KjQpO2Uuc2V0KHRoaXMuYm9uZU1hdHJpY2VzKTtjb25zdCBuPW5ldyBDaShlLHQsdCxhbix2bik7cmV0dXJuIG4ubmVlZHNVcGRhdGU9ITAsdGhpcy5ib25lTWF0cmljZXM9ZSx0aGlzLmJvbmVUZXh0dXJlPW4sdGhpc31nZXRCb25lQnlOYW1lKHQpe2ZvcihsZXQgZT0wLG49dGhpcy5ib25lcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10aGlzLmJvbmVzW2VdO2lmKHIubmFtZT09PXQpcmV0dXJuIHJ9fWRpc3Bvc2UoKXt0aGlzLmJvbmVUZXh0dXJlIT09bnVsbCYmKHRoaXMuYm9uZVRleHR1cmUuZGlzcG9zZSgpLHRoaXMuYm9uZVRleHR1cmU9bnVsbCl9ZnJvbUpTT04odCxlKXt0aGlzLnV1aWQ9dC51dWlkO2ZvcihsZXQgbj0wLHI9dC5ib25lcy5sZW5ndGg7bjxyO24rKyl7Y29uc3Qgcz10LmJvbmVzW25dO2xldCBvPWVbc107bz09PXZvaWQgMCYmKGNvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IE5vIGJvbmUgZm91bmQgd2l0aCBVVUlEOiIscyksbz1uZXcgV2QpLHRoaXMuYm9uZXMucHVzaChvKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBSdCgpLmZyb21BcnJheSh0LmJvbmVJbnZlcnNlc1tuXSkpfXJldHVybiB0aGlzLmluaXQoKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJTa2VsZXRvbiIsZ2VuZXJhdG9yOiJTa2VsZXRvbi50b0pTT04ifSxib25lczpbXSxib25lSW52ZXJzZXM6W119O3QudXVpZD10aGlzLnV1aWQ7Y29uc3QgZT10aGlzLmJvbmVzLG49dGhpcy5ib25lSW52ZXJzZXM7Zm9yKGxldCByPTAscz1lLmxlbmd0aDtyPHM7cisrKXtjb25zdCBvPWVbcl07dC5ib25lcy5wdXNoKG8udXVpZCk7Y29uc3QgYT1uW3JdO3QuYm9uZUludmVyc2VzLnB1c2goYS50b0FycmF5KCkpfXJldHVybiB0fX1jbGFzcyB4byBleHRlbmRzIEp0e2NvbnN0cnVjdG9yKHQsZSxuLHI9MSl7c3VwZXIodCxlLG4pLHRoaXMuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5tZXNoUGVyQXR0cmlidXRlPXJ9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9dC5tZXNoUGVyQXR0cmlidXRlLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5tZXNoUGVyQXR0cmlidXRlPXRoaXMubWVzaFBlckF0dHJpYnV0ZSx0LmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwLHR9fWNvbnN0IHZvPW5ldyBSdCxuXz1uZXcgUnQsbHU9W10saV89bmV3IG1lLEtBPW5ldyBSdCxOYT1uZXcgVWUsRmE9bmV3IHFlO2NsYXNzIHJfIGV4dGVuZHMgVWV7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSksdGhpcy5pc0luc3RhbmNlZE1lc2g9ITAsdGhpcy5pbnN0YW5jZU1hdHJpeD1uZXcgeG8obmV3IEZsb2F0MzJBcnJheShuKjE2KSwxNiksdGhpcy5pbnN0YW5jZUNvbG9yPW51bGwsdGhpcy5tb3JwaFRleHR1cmU9bnVsbCx0aGlzLmNvdW50PW4sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtmb3IobGV0IHI9MDtyPG47cisrKXRoaXMuc2V0TWF0cml4QXQocixLQSl9Y29tcHV0ZUJvdW5kaW5nQm94KCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5LGU9dGhpcy5jb3VudDt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IG1lKSx0LmJvdW5kaW5nQm94PT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wO248ZTtuKyspdGhpcy5nZXRNYXRyaXhBdChuLHZvKSxpXy5jb3B5KHQuYm91bmRpbmdCb3gpLmFwcGx5TWF0cml4NCh2byksdGhpcy5ib3VuZGluZ0JveC51bmlvbihpXyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5LGU9dGhpcy5jb3VudDt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IHFlKSx0LmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wO248ZTtuKyspdGhpcy5nZXRNYXRyaXhBdChuLHZvKSxGYS5jb3B5KHQuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NCh2byksdGhpcy5ib3VuZGluZ1NwaGVyZS51bmlvbihGYSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3B5KHQuaW5zdGFuY2VNYXRyaXgpLHQubW9ycGhUZXh0dXJlIT09bnVsbCYmKHRoaXMubW9ycGhUZXh0dXJlPXQubW9ycGhUZXh0dXJlLmNsb25lKCkpLHQuaW5zdGFuY2VDb2xvciE9PW51bGwmJih0aGlzLmluc3RhbmNlQ29sb3I9dC5pbnN0YW5jZUNvbG9yLmNsb25lKCkpLHRoaXMuY291bnQ9dC5jb3VudCx0LmJvdW5kaW5nQm94IT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9dC5ib3VuZGluZ0JveC5jbG9uZSgpKSx0LmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9dC5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKSx0aGlzfWdldENvbG9yQXQodCxlKXtlLmZyb21BcnJheSh0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksdCozKX1nZXRNYXRyaXhBdCh0LGUpe2UuZnJvbUFycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksdCoxNil9Z2V0TW9ycGhBdCh0LGUpe2NvbnN0IG49ZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMscj10aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhLHM9bi5sZW5ndGgrMSxvPXQqcysxO2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSsrKW5bYV09cltvK2FdfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMubWF0cml4V29ybGQscj10aGlzLmNvdW50O2lmKE5hLmdlb21ldHJ5PXRoaXMuZ2VvbWV0cnksTmEubWF0ZXJpYWw9dGhpcy5tYXRlcmlhbCxOYS5tYXRlcmlhbCE9PXZvaWQgMCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEZhLmNvcHkodGhpcy5ib3VuZGluZ1NwaGVyZSksRmEuYXBwbHlNYXRyaXg0KG4pLHQucmF5LmludGVyc2VjdHNTcGhlcmUoRmEpIT09ITEpKWZvcihsZXQgcz0wO3M8cjtzKyspe3RoaXMuZ2V0TWF0cml4QXQocyx2byksbl8ubXVsdGlwbHlNYXRyaWNlcyhuLHZvKSxOYS5tYXRyaXhXb3JsZD1uXyxOYS5yYXljYXN0KHQsbHUpO2ZvcihsZXQgbz0wLGE9bHUubGVuZ3RoO288YTtvKyspe2NvbnN0IGw9bHVbb107bC5pbnN0YW5jZUlkPXMsbC5vYmplY3Q9dGhpcyxlLnB1c2gobCl9bHUubGVuZ3RoPTB9fXNldENvbG9yQXQodCxlKXt0aGlzLmluc3RhbmNlQ29sb3I9PT1udWxsJiYodGhpcy5pbnN0YW5jZUNvbG9yPW5ldyB4byhuZXcgRmxvYXQzMkFycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguY291bnQqMykuZmlsbCgxKSwzKSksZS50b0FycmF5KHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSx0KjMpfXNldE1hdHJpeEF0KHQsZSl7ZS50b0FycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksdCoxNil9c2V0TW9ycGhBdCh0LGUpe2NvbnN0IG49ZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMscj1uLmxlbmd0aCsxO3RoaXMubW9ycGhUZXh0dXJlPT09bnVsbCYmKHRoaXMubW9ycGhUZXh0dXJlPW5ldyBDaShuZXcgRmxvYXQzMkFycmF5KHIqdGhpcy5jb3VudCkscix0aGlzLmNvdW50LG5jLHZuKSk7Y29uc3Qgcz10aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhO2xldCBvPTA7Zm9yKGxldCBjPTA7YzxuLmxlbmd0aDtjKyspbys9bltjXTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmU/MToxLW8sbD1yKnQ7c1tsXT1hLHMuc2V0KG4sbCsxKX11cGRhdGVNb3JwaFRhcmdldHMoKXt9ZGlzcG9zZSgpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSksdGhpcy5tb3JwaFRleHR1cmUhPT1udWxsJiYodGhpcy5tb3JwaFRleHR1cmUuZGlzcG9zZSgpLHRoaXMubW9ycGhUZXh0dXJlPW51bGwpLHRoaXN9fWNvbnN0ICRkPW5ldyBSLFFBPW5ldyBSLHRFPW5ldyBXdDtjbGFzcyBoaXtjb25zdHJ1Y3Rvcih0PW5ldyBSKDEsMCwwKSxlPTApe3RoaXMuaXNQbGFuZT0hMCx0aGlzLm5vcm1hbD10LHRoaXMuY29uc3RhbnQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PWUsdGhpc31zZXRDb21wb25lbnRzKHQsZSxuLHIpe3JldHVybiB0aGlzLm5vcm1hbC5zZXQodCxlLG4pLHRoaXMuY29uc3RhbnQ9cix0aGlzfXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9c2V0RnJvbUNvcGxhbmFyUG9pbnRzKHQsZSxuKXtjb25zdCByPSRkLnN1YlZlY3RvcnMobixlKS5jcm9zcyhRQS5zdWJWZWN0b3JzKHQsZSkpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHIsdCksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQubm9ybWFsKSx0aGlzLmNvbnN0YW50PXQuY29uc3RhbnQsdGhpc31ub3JtYWxpemUoKXtjb25zdCB0PTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7cmV0dXJuIHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKHQpLHRoaXMuY29uc3RhbnQqPXQsdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy5jb25zdGFudCo9LTEsdGhpcy5ub3JtYWwubmVnYXRlKCksdGhpc31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdCh0KSt0aGlzLmNvbnN0YW50fWRpc3RhbmNlVG9TcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKS10LnJhZGl1c31wcm9qZWN0UG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmFkZFNjYWxlZFZlY3Rvcih0aGlzLm5vcm1hbCwtdGhpcy5kaXN0YW5jZVRvUG9pbnQodCkpfWludGVyc2VjdExpbmUodCxlKXtjb25zdCBuPXQuZGVsdGEoJGQpLHI9dGhpcy5ub3JtYWwuZG90KG4pO2lmKHI9PT0wKXJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCh0LnN0YXJ0KT09PTA/ZS5jb3B5KHQuc3RhcnQpOm51bGw7Y29uc3Qgcz0tKHQuc3RhcnQuZG90KHRoaXMubm9ybWFsKSt0aGlzLmNvbnN0YW50KS9yO3JldHVybiBzPDB8fHM+MT9udWxsOmUuY29weSh0LnN0YXJ0KS5hZGRTY2FsZWRWZWN0b3IobixzKX1pbnRlcnNlY3RzTGluZSh0KXtjb25zdCBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpLG49dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5lbmQpO3JldHVybiBlPDAmJm4+MHx8bjwwJiZlPjB9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9Y29wbGFuYXJQb2ludCh0KXtyZXR1cm4gdC5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5jb25zdGFudCl9YXBwbHlNYXRyaXg0KHQsZSl7Y29uc3Qgbj1lfHx0RS5nZXROb3JtYWxNYXRyaXgodCkscj10aGlzLmNvcGxhbmFyUG9pbnQoJGQpLmFwcGx5TWF0cml4NCh0KSxzPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhuKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpcy5jb25zdGFudD0tci5kb3QocyksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY29uc3RhbnQtPXQuZG90KHRoaXMubm9ybWFsKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5ub3JtYWwuZXF1YWxzKHRoaXMubm9ybWFsKSYmdC5jb25zdGFudD09PXRoaXMuY29uc3RhbnR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jb25zdCBvcz1uZXcgcWUsY3U9bmV3IFI7Y2xhc3MgQmF7Y29uc3RydWN0b3IodD1uZXcgaGksZT1uZXcgaGksbj1uZXcgaGkscj1uZXcgaGkscz1uZXcgaGksbz1uZXcgaGkpe3RoaXMucGxhbmVzPVt0LGUsbixyLHMsb119c2V0KHQsZSxuLHIscyxvKXtjb25zdCBhPXRoaXMucGxhbmVzO3JldHVybiBhWzBdLmNvcHkodCksYVsxXS5jb3B5KGUpLGFbMl0uY29weShuKSxhWzNdLmNvcHkociksYVs0XS5jb3B5KHMpLGFbNV0uY29weShvKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLnBsYW5lcztmb3IobGV0IG49MDtuPDY7bisrKWVbbl0uY29weSh0LnBsYW5lc1tuXSk7cmV0dXJuIHRoaXN9c2V0RnJvbVByb2plY3Rpb25NYXRyaXgodCxlPUVpKXtjb25zdCBuPXRoaXMucGxhbmVzLHI9dC5lbGVtZW50cyxzPXJbMF0sbz1yWzFdLGE9clsyXSxsPXJbM10sYz1yWzRdLHU9cls1XSxoPXJbNl0sZj1yWzddLGQ9cls4XSxwPXJbOV0seT1yWzEwXSxnPXJbMTFdLG09clsxMl0sdj1yWzEzXSx4PXJbMTRdLF89clsxNV07aWYoblswXS5zZXRDb21wb25lbnRzKGwtcyxmLWMsZy1kLF8tbSkubm9ybWFsaXplKCksblsxXS5zZXRDb21wb25lbnRzKGwrcyxmK2MsZytkLF8rbSkubm9ybWFsaXplKCksblsyXS5zZXRDb21wb25lbnRzKGwrbyxmK3UsZytwLF8rdikubm9ybWFsaXplKCksblszXS5zZXRDb21wb25lbnRzKGwtbyxmLXUsZy1wLF8tdikubm9ybWFsaXplKCksbls0XS5zZXRDb21wb25lbnRzKGwtYSxmLWgsZy15LF8teCkubm9ybWFsaXplKCksZT09PUVpKW5bNV0uc2V0Q29tcG9uZW50cyhsK2EsZitoLGcreSxfK3gpLm5vcm1hbGl6ZSgpO2Vsc2UgaWYoZT09PWJhKW5bNV0uc2V0Q29tcG9uZW50cyhhLGgseSx4KS5ub3JtYWxpemUoKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuRnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2UpO3JldHVybiB0aGlzfWludGVyc2VjdHNPYmplY3QodCl7aWYodC5ib3VuZGluZ1NwaGVyZSE9PXZvaWQgMCl0LmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxvcy5jb3B5KHQuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKTtlbHNle2NvbnN0IGU9dC5nZW9tZXRyeTtlLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxvcy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX1yZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKG9zKX1pbnRlcnNlY3RzU3ByaXRlKHQpe3JldHVybiBvcy5jZW50ZXIuc2V0KDAsMCwwKSxvcy5yYWRpdXM9LjcwNzEwNjc4MTE4NjU0NzYsb3MuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZShvcyl9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucGxhbmVzLG49dC5jZW50ZXIscj0tdC5yYWRpdXM7Zm9yKGxldCBzPTA7czw2O3MrKylpZihlW3NdLmRpc3RhbmNlVG9Qb2ludChuKTxyKXJldHVybiExO3JldHVybiEwfWludGVyc2VjdHNCb3godCl7Y29uc3QgZT10aGlzLnBsYW5lcztmb3IobGV0IG49MDtuPDY7bisrKXtjb25zdCByPWVbbl07aWYoY3UueD1yLm5vcm1hbC54PjA/dC5tYXgueDp0Lm1pbi54LGN1Lnk9ci5ub3JtYWwueT4wP3QubWF4Lnk6dC5taW4ueSxjdS56PXIubm9ybWFsLno+MD90Lm1heC56OnQubWluLnosci5kaXN0YW5jZVRvUG9pbnQoY3UpPDApcmV0dXJuITF9cmV0dXJuITB9Y29udGFpbnNQb2ludCh0KXtjb25zdCBlPXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspaWYoZVtuXS5kaXN0YW5jZVRvUG9pbnQodCk8MClyZXR1cm4hMTtyZXR1cm4hMH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWZ1bmN0aW9uIFhkKGksdCl7cmV0dXJuIGktdH1mdW5jdGlvbiBlRShpLHQpe3JldHVybiBpLnotdC56fWZ1bmN0aW9uIG5FKGksdCl7cmV0dXJuIHQuei1pLnp9Y2xhc3MgaUV7Y29uc3RydWN0b3IoKXt0aGlzLmluZGV4PTAsdGhpcy5wb29sPVtdLHRoaXMubGlzdD1bXX1wdXNoKHQsZSxuLHIpe2NvbnN0IHM9dGhpcy5wb29sLG89dGhpcy5saXN0O3RoaXMuaW5kZXg+PXMubGVuZ3RoJiZzLnB1c2goe3N0YXJ0Oi0xLGNvdW50Oi0xLHo6LTEsaW5kZXg6LTF9KTtjb25zdCBhPXNbdGhpcy5pbmRleF07by5wdXNoKGEpLHRoaXMuaW5kZXgrKyxhLnN0YXJ0PXQsYS5jb3VudD1lLGEuej1uLGEuaW5kZXg9cn1yZXNldCgpe3RoaXMubGlzdC5sZW5ndGg9MCx0aGlzLmluZGV4PTB9fWNvbnN0IHduPW5ldyBSdCxyRT1uZXcgeHQoMSwxLDEpLHFkPW5ldyBCYSx1dT1uZXcgbWUsYXM9bmV3IHFlLE9hPW5ldyBSLHNfPW5ldyBSLHNFPW5ldyBSLFlkPW5ldyBpRSx0bj1uZXcgVWUsaHU9W107ZnVuY3Rpb24gb0UoaSx0LGU9MCl7Y29uc3Qgbj10Lml0ZW1TaXplO2lmKGkuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXx8aS5hcnJheS5jb25zdHJ1Y3RvciE9PXQuYXJyYXkuY29uc3RydWN0b3Ipe2NvbnN0IHI9aS5jb3VudDtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgbz0wO288bjtvKyspdC5zZXRDb21wb25lbnQocytlLG8saS5nZXRDb21wb25lbnQocyxvKSl9ZWxzZSB0LmFycmF5LnNldChpLmFycmF5LGUqbik7dC5uZWVkc1VwZGF0ZT0hMH1mdW5jdGlvbiBscyhpLHQpe2lmKGkuY29uc3RydWN0b3IhPT10LmNvbnN0cnVjdG9yKXtjb25zdCBlPU1hdGgubWluKGkubGVuZ3RoLHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPGU7bisrKXRbbl09aVtuXX1lbHNle2NvbnN0IGU9TWF0aC5taW4oaS5sZW5ndGgsdC5sZW5ndGgpO3Quc2V0KG5ldyBpLmNvbnN0cnVjdG9yKGkuYnVmZmVyLDAsZSkpfX1jbGFzcyBvXyBleHRlbmRzIFVle2dldCBtYXhJbnN0YW5jZUNvdW50KCl7cmV0dXJuIHRoaXMuX21heEluc3RhbmNlQ291bnR9Z2V0IGluc3RhbmNlQ291bnQoKXtyZXR1cm4gdGhpcy5faW5zdGFuY2VJbmZvLmxlbmd0aC10aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGh9Z2V0IHVudXNlZFZlcnRleENvdW50KCl7cmV0dXJuIHRoaXMuX21heFZlcnRleENvdW50LXRoaXMuX25leHRWZXJ0ZXhTdGFydH1nZXQgdW51c2VkSW5kZXhDb3VudCgpe3JldHVybiB0aGlzLl9tYXhJbmRleENvdW50LXRoaXMuX25leHRJbmRleFN0YXJ0fWNvbnN0cnVjdG9yKHQsZSxuPWUqMixyKXtzdXBlcihuZXcgRnQsciksdGhpcy5pc0JhdGNoZWRNZXNoPSEwLHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnNvcnRPYmplY3RzPSEwLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5jdXN0b21Tb3J0PW51bGwsdGhpcy5faW5zdGFuY2VJbmZvPVtdLHRoaXMuX2dlb21ldHJ5SW5mbz1bXSx0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcz1bXSx0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcz1bXSx0aGlzLl9uZXh0SW5kZXhTdGFydD0wLHRoaXMuX25leHRWZXJ0ZXhTdGFydD0wLHRoaXMuX2dlb21ldHJ5Q291bnQ9MCx0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZD0hMCx0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkPSExLHRoaXMuX21heEluc3RhbmNlQ291bnQ9dCx0aGlzLl9tYXhWZXJ0ZXhDb3VudD1lLHRoaXMuX21heEluZGV4Q291bnQ9bix0aGlzLl9tdWx0aURyYXdDb3VudHM9bmV3IEludDMyQXJyYXkodCksdGhpcy5fbXVsdGlEcmF3U3RhcnRzPW5ldyBJbnQzMkFycmF5KHQpLHRoaXMuX211bHRpRHJhd0NvdW50PTAsdGhpcy5fbXVsdGlEcmF3SW5zdGFuY2VzPW51bGwsdGhpcy5fbWF0cmljZXNUZXh0dXJlPW51bGwsdGhpcy5faW5kaXJlY3RUZXh0dXJlPW51bGwsdGhpcy5fY29sb3JzVGV4dHVyZT1udWxsLHRoaXMuX2luaXRNYXRyaWNlc1RleHR1cmUoKSx0aGlzLl9pbml0SW5kaXJlY3RUZXh0dXJlKCl9X2luaXRNYXRyaWNlc1RleHR1cmUoKXtsZXQgdD1NYXRoLnNxcnQodGhpcy5fbWF4SW5zdGFuY2VDb3VudCo0KTt0PU1hdGguY2VpbCh0LzQpKjQsdD1NYXRoLm1heCh0LDQpO2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheSh0KnQqNCksbj1uZXcgQ2koZSx0LHQsYW4sdm4pO3RoaXMuX21hdHJpY2VzVGV4dHVyZT1ufV9pbml0SW5kaXJlY3RUZXh0dXJlKCl7bGV0IHQ9TWF0aC5zcXJ0KHRoaXMuX21heEluc3RhbmNlQ291bnQpO3Q9TWF0aC5jZWlsKHQpO2NvbnN0IGU9bmV3IFVpbnQzMkFycmF5KHQqdCksbj1uZXcgQ2koZSx0LHQsZGEsVmkpO3RoaXMuX2luZGlyZWN0VGV4dHVyZT1ufV9pbml0Q29sb3JzVGV4dHVyZSgpe2xldCB0PU1hdGguc3FydCh0aGlzLl9tYXhJbnN0YW5jZUNvdW50KTt0PU1hdGguY2VpbCh0KTtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkodCp0KjQpLmZpbGwoMSksbj1uZXcgQ2koZSx0LHQsYW4sdm4pO24uY29sb3JTcGFjZT1yZS53b3JraW5nQ29sb3JTcGFjZSx0aGlzLl9jb2xvcnNUZXh0dXJlPW59X2luaXRpYWxpemVHZW9tZXRyeSh0KXtjb25zdCBlPXRoaXMuZ2VvbWV0cnksbj10aGlzLl9tYXhWZXJ0ZXhDb3VudCxyPXRoaXMuX21heEluZGV4Q291bnQ7aWYodGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD09PSExKXtmb3IoY29uc3QgcyBpbiB0LmF0dHJpYnV0ZXMpe2NvbnN0IG89dC5nZXRBdHRyaWJ1dGUocykse2FycmF5OmEsaXRlbVNpemU6bCxub3JtYWxpemVkOmN9PW8sdT1uZXcgYS5jb25zdHJ1Y3RvcihuKmwpLGg9bmV3IEp0KHUsbCxjKTtlLnNldEF0dHJpYnV0ZShzLGgpfWlmKHQuZ2V0SW5kZXgoKSE9PW51bGwpe2NvbnN0IHM9bj42NTUzNT9uZXcgVWludDMyQXJyYXkocik6bmV3IFVpbnQxNkFycmF5KHIpO2Uuc2V0SW5kZXgobmV3IEp0KHMsMSkpfXRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQ9ITB9fV92YWxpZGF0ZUdlb21ldHJ5KHQpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeTtpZighIXQuZ2V0SW5kZXgoKSE9ISFlLmdldEluZGV4KCkpdGhyb3cgbmV3IEVycm9yKCdUSFJFRS5CYXRjaGVkTWVzaDogQWxsIGdlb21ldHJpZXMgbXVzdCBjb25zaXN0ZW50bHkgaGF2ZSAiaW5kZXgiLicpO2Zvcihjb25zdCBuIGluIGUuYXR0cmlidXRlcyl7aWYoIXQuaGFzQXR0cmlidXRlKG4pKXRocm93IG5ldyBFcnJvcihgVEhSRUUuQmF0Y2hlZE1lc2g6IEFkZGVkIGdlb21ldHJ5IG1pc3NpbmcgIiR7bn0iLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29uc2lzdGVudCBhdHRyaWJ1dGVzLmApO2NvbnN0IHI9dC5nZXRBdHRyaWJ1dGUobikscz1lLmdldEF0dHJpYnV0ZShuKTtpZihyLml0ZW1TaXplIT09cy5pdGVtU2l6ZXx8ci5ub3JtYWxpemVkIT09cy5ub3JtYWxpemVkKXRocm93IG5ldyBFcnJvcigiVEhSRUUuQmF0Y2hlZE1lc2g6IEFsbCBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIGNvbnNpc3RlbnQgaXRlbVNpemUgYW5kIG5vcm1hbGl6ZWQgdmFsdWUuIil9fXZhbGlkYXRlSW5zdGFuY2VJZCh0KXtjb25zdCBlPXRoaXMuX2luc3RhbmNlSW5mbztpZih0PDB8fHQ+PWUubGVuZ3RofHxlW3RdLmFjdGl2ZT09PSExKXRocm93IG5ldyBFcnJvcihgVEhSRUUuQmF0Y2hlZE1lc2g6IEludmFsaWQgaW5zdGFuY2VJZCAke3R9LiBJbnN0YW5jZSBpcyBlaXRoZXIgb3V0IG9mIHJhbmdlIG9yIGhhcyBiZWVuIGRlbGV0ZWQuYCl9dmFsaWRhdGVHZW9tZXRyeUlkKHQpe2NvbnN0IGU9dGhpcy5fZ2VvbWV0cnlJbmZvO2lmKHQ8MHx8dD49ZS5sZW5ndGh8fGVbdF0uYWN0aXZlPT09ITEpdGhyb3cgbmV3IEVycm9yKGBUSFJFRS5CYXRjaGVkTWVzaDogSW52YWxpZCBnZW9tZXRyeUlkICR7dH0uIEdlb21ldHJ5IGlzIGVpdGhlciBvdXQgb2YgcmFuZ2Ugb3IgaGFzIGJlZW4gZGVsZXRlZC5gKX1zZXRDdXN0b21Tb3J0KHQpe3JldHVybiB0aGlzLmN1c3RvbVNvcnQ9dCx0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe3RoaXMuYm91bmRpbmdCb3g9PT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1uZXcgbWUpO2NvbnN0IHQ9dGhpcy5ib3VuZGluZ0JveCxlPXRoaXMuX2luc3RhbmNlSW5mbzt0Lm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl7aWYoZVtuXS5hY3RpdmU9PT0hMSljb250aW51ZTtjb25zdCBzPWVbbl0uZ2VvbWV0cnlJbmRleDt0aGlzLmdldE1hdHJpeEF0KG4sd24pLHRoaXMuZ2V0Qm91bmRpbmdCb3hBdChzLHV1KS5hcHBseU1hdHJpeDQod24pLHQudW5pb24odXUpfX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IHFlKTtjb25zdCB0PXRoaXMuYm91bmRpbmdTcGhlcmUsZT10aGlzLl9pbnN0YW5jZUluZm87dC5tYWtlRW1wdHkoKTtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspe2lmKGVbbl0uYWN0aXZlPT09ITEpY29udGludWU7Y29uc3Qgcz1lW25dLmdlb21ldHJ5SW5kZXg7dGhpcy5nZXRNYXRyaXhBdChuLHduKSx0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQocyxhcykuYXBwbHlNYXRyaXg0KHduKSx0LnVuaW9uKGFzKX19YWRkSW5zdGFuY2UodCl7aWYodGhpcy5faW5zdGFuY2VJbmZvLmxlbmd0aD49dGhpcy5tYXhJbnN0YW5jZUNvdW50JiZ0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiVEhSRUUuQmF0Y2hlZE1lc2g6IE1heGltdW0gaXRlbSBjb3VudCByZWFjaGVkLiIpO2NvbnN0IG49e3Zpc2libGU6ITAsYWN0aXZlOiEwLGdlb21ldHJ5SW5kZXg6dH07bGV0IHI9bnVsbDt0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGg+MD8odGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMuc29ydChYZCkscj10aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5zaGlmdCgpLHRoaXMuX2luc3RhbmNlSW5mb1tyXT1uKToocj10aGlzLl9pbnN0YW5jZUluZm8ubGVuZ3RoLHRoaXMuX2luc3RhbmNlSW5mby5wdXNoKG4pKTtjb25zdCBzPXRoaXMuX21hdHJpY2VzVGV4dHVyZTt3bi5pZGVudGl0eSgpLnRvQXJyYXkocy5pbWFnZS5kYXRhLHIqMTYpLHMubmVlZHNVcGRhdGU9ITA7Y29uc3Qgbz10aGlzLl9jb2xvcnNUZXh0dXJlO3JldHVybiBvJiYockUudG9BcnJheShvLmltYWdlLmRhdGEscio0KSxvLm5lZWRzVXBkYXRlPSEwKSx0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZD0hMCxyfWFkZEdlb21ldHJ5KHQsZT0tMSxuPS0xKXt0aGlzLl9pbml0aWFsaXplR2VvbWV0cnkodCksdGhpcy5fdmFsaWRhdGVHZW9tZXRyeSh0KTtjb25zdCByPXt2ZXJ0ZXhTdGFydDotMSx2ZXJ0ZXhDb3VudDotMSxyZXNlcnZlZFZlcnRleENvdW50Oi0xLGluZGV4U3RhcnQ6LTEsaW5kZXhDb3VudDotMSxyZXNlcnZlZEluZGV4Q291bnQ6LTEsc3RhcnQ6LTEsY291bnQ6LTEsYm91bmRpbmdCb3g6bnVsbCxib3VuZGluZ1NwaGVyZTpudWxsLGFjdGl2ZTohMH0scz10aGlzLl9nZW9tZXRyeUluZm87ci52ZXJ0ZXhTdGFydD10aGlzLl9uZXh0VmVydGV4U3RhcnQsci5yZXNlcnZlZFZlcnRleENvdW50PWU9PT0tMT90LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5jb3VudDplO2NvbnN0IG89dC5nZXRJbmRleCgpO2lmKG8hPT1udWxsJiYoci5pbmRleFN0YXJ0PXRoaXMuX25leHRJbmRleFN0YXJ0LHIucmVzZXJ2ZWRJbmRleENvdW50PW49PT0tMT9vLmNvdW50Om4pLHIuaW5kZXhTdGFydCE9PS0xJiZyLmluZGV4U3RhcnQrci5yZXNlcnZlZEluZGV4Q291bnQ+dGhpcy5fbWF4SW5kZXhDb3VudHx8ci52ZXJ0ZXhTdGFydCtyLnJlc2VydmVkVmVydGV4Q291bnQ+dGhpcy5fbWF4VmVydGV4Q291bnQpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5CYXRjaGVkTWVzaDogUmVzZXJ2ZWQgc3BhY2UgcmVxdWVzdCBleGNlZWRzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplLiIpO2xldCBsO3JldHVybiB0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5sZW5ndGg+MD8odGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMuc29ydChYZCksbD10aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zaGlmdCgpLHNbbF09cik6KGw9dGhpcy5fZ2VvbWV0cnlDb3VudCx0aGlzLl9nZW9tZXRyeUNvdW50Kysscy5wdXNoKHIpKSx0aGlzLnNldEdlb21ldHJ5QXQobCx0KSx0aGlzLl9uZXh0SW5kZXhTdGFydD1yLmluZGV4U3RhcnQrci5yZXNlcnZlZEluZGV4Q291bnQsdGhpcy5fbmV4dFZlcnRleFN0YXJ0PXIudmVydGV4U3RhcnQrci5yZXNlcnZlZFZlcnRleENvdW50LGx9c2V0R2VvbWV0cnlBdCh0LGUpe2lmKHQ+PXRoaXMuX2dlb21ldHJ5Q291bnQpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5CYXRjaGVkTWVzaDogTWF4aW11bSBnZW9tZXRyeSBjb3VudCByZWFjaGVkLiIpO3RoaXMuX3ZhbGlkYXRlR2VvbWV0cnkoZSk7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LHI9bi5nZXRJbmRleCgpIT09bnVsbCxzPW4uZ2V0SW5kZXgoKSxvPWUuZ2V0SW5kZXgoKSxhPXRoaXMuX2dlb21ldHJ5SW5mb1t0XTtpZihyJiZvLmNvdW50PmEucmVzZXJ2ZWRJbmRleENvdW50fHxlLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ+YS5yZXNlcnZlZFZlcnRleENvdW50KXRocm93IG5ldyBFcnJvcigiVEhSRUUuQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHByb3ZpZGVkIGdlb21ldHJ5LiIpO2NvbnN0IGw9YS52ZXJ0ZXhTdGFydCxjPWEucmVzZXJ2ZWRWZXJ0ZXhDb3VudDthLnZlcnRleENvdW50PWUuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLmNvdW50O2Zvcihjb25zdCB1IGluIG4uYXR0cmlidXRlcyl7Y29uc3QgaD1lLmdldEF0dHJpYnV0ZSh1KSxmPW4uZ2V0QXR0cmlidXRlKHUpO29FKGgsZixsKTtjb25zdCBkPWguaXRlbVNpemU7Zm9yKGxldCBwPWguY291bnQseT1jO3A8eTtwKyspe2NvbnN0IGc9bCtwO2ZvcihsZXQgbT0wO208ZDttKyspZi5zZXRDb21wb25lbnQoZyxtLDApfWYubmVlZHNVcGRhdGU9ITAsZi5hZGRVcGRhdGVSYW5nZShsKmQsYypkKX1pZihyKXtjb25zdCB1PWEuaW5kZXhTdGFydCxoPWEucmVzZXJ2ZWRJbmRleENvdW50O2EuaW5kZXhDb3VudD1lLmdldEluZGV4KCkuY291bnQ7Zm9yKGxldCBmPTA7ZjxvLmNvdW50O2YrKylzLnNldFgodStmLGwrby5nZXRYKGYpKTtmb3IobGV0IGY9by5jb3VudCxkPWg7ZjxkO2YrKylzLnNldFgodStmLGwpO3MubmVlZHNVcGRhdGU9ITAscy5hZGRVcGRhdGVSYW5nZSh1LGEucmVzZXJ2ZWRJbmRleENvdW50KX1yZXR1cm4gYS5zdGFydD1yP2EuaW5kZXhTdGFydDphLnZlcnRleFN0YXJ0LGEuY291bnQ9cj9hLmluZGV4Q291bnQ6YS52ZXJ0ZXhDb3VudCxhLmJvdW5kaW5nQm94PW51bGwsZS5ib3VuZGluZ0JveCE9PW51bGwmJihhLmJvdW5kaW5nQm94PWUuYm91bmRpbmdCb3guY2xvbmUoKSksYS5ib3VuZGluZ1NwaGVyZT1udWxsLGUuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYoYS5ib3VuZGluZ1NwaGVyZT1lLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLHR9ZGVsZXRlR2VvbWV0cnkodCl7Y29uc3QgZT10aGlzLl9nZW9tZXRyeUluZm87aWYodD49ZS5sZW5ndGh8fGVbdF0uYWN0aXZlPT09ITEpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLl9pbnN0YW5jZUluZm87Zm9yKGxldCByPTAscz1uLmxlbmd0aDtyPHM7cisrKW5bcl0uZ2VvbWV0cnlJbmRleD09PXQmJnRoaXMuZGVsZXRlSW5zdGFuY2Uocik7cmV0dXJuIGVbdF0uYWN0aXZlPSExLHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnB1c2godCksdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsdGhpc31kZWxldGVJbnN0YW5jZSh0KXtyZXR1cm4gdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQodCksdGhpcy5faW5zdGFuY2VJbmZvW3RdLmFjdGl2ZT0hMSx0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5wdXNoKHQpLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLHRoaXN9b3B0aW1pemUoKXtsZXQgdD0wLGU9MDtjb25zdCBuPXRoaXMuX2dlb21ldHJ5SW5mbyxyPW4ubWFwKChvLGEpPT5hKS5zb3J0KChvLGEpPT5uW29dLnZlcnRleFN0YXJ0LW5bYV0udmVydGV4U3RhcnQpLHM9dGhpcy5nZW9tZXRyeTtmb3IobGV0IG89MCxhPW4ubGVuZ3RoO288YTtvKyspe2NvbnN0IGw9cltvXSxjPW5bbF07aWYoYy5hY3RpdmUhPT0hMSl7aWYocy5pbmRleCE9PW51bGwpe2lmKGMuaW5kZXhTdGFydCE9PWUpe2NvbnN0e2luZGV4U3RhcnQ6dSx2ZXJ0ZXhTdGFydDpoLHJlc2VydmVkSW5kZXhDb3VudDpmfT1jLGQ9cy5pbmRleCxwPWQuYXJyYXkseT10LWg7Zm9yKGxldCBnPXU7Zzx1K2Y7ZysrKXBbZ109cFtnXSt5O2QuYXJyYXkuY29weVdpdGhpbihlLHUsdStmKSxkLmFkZFVwZGF0ZVJhbmdlKGUsZiksYy5pbmRleFN0YXJ0PWV9ZSs9Yy5yZXNlcnZlZEluZGV4Q291bnR9aWYoYy52ZXJ0ZXhTdGFydCE9PXQpe2NvbnN0e3ZlcnRleFN0YXJ0OnUscmVzZXJ2ZWRWZXJ0ZXhDb3VudDpofT1jLGY9cy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBkIGluIGYpe2NvbnN0IHA9ZltkXSx7YXJyYXk6eSxpdGVtU2l6ZTpnfT1wO3kuY29weVdpdGhpbih0KmcsdSpnLCh1K2gpKmcpLHAuYWRkVXBkYXRlUmFuZ2UodCpnLGgqZyl9Yy52ZXJ0ZXhTdGFydD10fXQrPWMucmVzZXJ2ZWRWZXJ0ZXhDb3VudCxjLnN0YXJ0PXMuaW5kZXg/Yy5pbmRleFN0YXJ0OmMudmVydGV4U3RhcnQsdGhpcy5fbmV4dEluZGV4U3RhcnQ9cy5pbmRleD9jLmluZGV4U3RhcnQrYy5yZXNlcnZlZEluZGV4Q291bnQ6MCx0aGlzLl9uZXh0VmVydGV4U3RhcnQ9Yy52ZXJ0ZXhTdGFydCtjLnJlc2VydmVkVmVydGV4Q291bnR9fXJldHVybiB0aGlzfWdldEJvdW5kaW5nQm94QXQodCxlKXtpZih0Pj10aGlzLl9nZW9tZXRyeUNvdW50KXJldHVybiBudWxsO2NvbnN0IG49dGhpcy5nZW9tZXRyeSxyPXRoaXMuX2dlb21ldHJ5SW5mb1t0XTtpZihyLmJvdW5kaW5nQm94PT09bnVsbCl7Y29uc3Qgcz1uZXcgbWUsbz1uLmluZGV4LGE9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgbD1yLnN0YXJ0LGM9ci5zdGFydCtyLmNvdW50O2w8YztsKyspe2xldCB1PWw7byYmKHU9by5nZXRYKHUpKSxzLmV4cGFuZEJ5UG9pbnQoT2EuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLHUpKX1yLmJvdW5kaW5nQm94PXN9cmV0dXJuIGUuY29weShyLmJvdW5kaW5nQm94KSxlfWdldEJvdW5kaW5nU3BoZXJlQXQodCxlKXtpZih0Pj10aGlzLl9nZW9tZXRyeUNvdW50KXJldHVybiBudWxsO2NvbnN0IG49dGhpcy5nZW9tZXRyeSxyPXRoaXMuX2dlb21ldHJ5SW5mb1t0XTtpZihyLmJvdW5kaW5nU3BoZXJlPT09bnVsbCl7Y29uc3Qgcz1uZXcgcWU7dGhpcy5nZXRCb3VuZGluZ0JveEF0KHQsdXUpLHV1LmdldENlbnRlcihzLmNlbnRlcik7Y29uc3Qgbz1uLmluZGV4LGE9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBsPTA7Zm9yKGxldCBjPXIuc3RhcnQsdT1yLnN0YXJ0K3IuY291bnQ7Yzx1O2MrKyl7bGV0IGg9YztvJiYoaD1vLmdldFgoaCkpLE9hLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxoKSxsPU1hdGgubWF4KGwscy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoT2EpKX1zLnJhZGl1cz1NYXRoLnNxcnQobCksci5ib3VuZGluZ1NwaGVyZT1zfXJldHVybiBlLmNvcHkoci5ib3VuZGluZ1NwaGVyZSksZX1zZXRNYXRyaXhBdCh0LGUpe3RoaXMudmFsaWRhdGVJbnN0YW5jZUlkKHQpO2NvbnN0IG49dGhpcy5fbWF0cmljZXNUZXh0dXJlLHI9dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE7cmV0dXJuIGUudG9BcnJheShyLHQqMTYpLG4ubmVlZHNVcGRhdGU9ITAsdGhpc31nZXRNYXRyaXhBdCh0LGUpe3JldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSxlLmZyb21BcnJheSh0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSx0KjE2KX1zZXRDb2xvckF0KHQsZSl7cmV0dXJuIHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKHQpLHRoaXMuX2NvbG9yc1RleHR1cmU9PT1udWxsJiZ0aGlzLl9pbml0Q29sb3JzVGV4dHVyZSgpLGUudG9BcnJheSh0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEsdCo0KSx0aGlzLl9jb2xvcnNUZXh0dXJlLm5lZWRzVXBkYXRlPSEwLHRoaXN9Z2V0Q29sb3JBdCh0LGUpe3JldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSxlLmZyb21BcnJheSh0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEsdCo0KX1zZXRWaXNpYmxlQXQodCxlKXtyZXR1cm4gdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQodCksdGhpcy5faW5zdGFuY2VJbmZvW3RdLnZpc2libGU9PT1lP3RoaXM6KHRoaXMuX2luc3RhbmNlSW5mb1t0XS52aXNpYmxlPWUsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsdGhpcyl9Z2V0VmlzaWJsZUF0KHQpe3JldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSx0aGlzLl9pbnN0YW5jZUluZm9bdF0udmlzaWJsZX1zZXRHZW9tZXRyeUlkQXQodCxlKXtyZXR1cm4gdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQodCksdGhpcy52YWxpZGF0ZUdlb21ldHJ5SWQoZSksdGhpcy5faW5zdGFuY2VJbmZvW3RdLmdlb21ldHJ5SW5kZXg9ZSx0aGlzfWdldEdlb21ldHJ5SWRBdCh0KXtyZXR1cm4gdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQodCksdGhpcy5faW5zdGFuY2VJbmZvW3RdLmdlb21ldHJ5SW5kZXh9Z2V0R2VvbWV0cnlSYW5nZUF0KHQsZT17fSl7dGhpcy52YWxpZGF0ZUdlb21ldHJ5SWQodCk7Y29uc3Qgbj10aGlzLl9nZW9tZXRyeUluZm9bdF07cmV0dXJuIGUudmVydGV4U3RhcnQ9bi52ZXJ0ZXhTdGFydCxlLnZlcnRleENvdW50PW4udmVydGV4Q291bnQsZS5yZXNlcnZlZFZlcnRleENvdW50PW4ucmVzZXJ2ZWRWZXJ0ZXhDb3VudCxlLmluZGV4U3RhcnQ9bi5pbmRleFN0YXJ0LGUuaW5kZXhDb3VudD1uLmluZGV4Q291bnQsZS5yZXNlcnZlZEluZGV4Q291bnQ9bi5yZXNlcnZlZEluZGV4Q291bnQsZS5zdGFydD1uLnN0YXJ0LGUuY291bnQ9bi5jb3VudCxlfXNldEluc3RhbmNlQ291bnQodCl7Y29uc3QgZT10aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcyxuPXRoaXMuX2luc3RhbmNlSW5mbztmb3IoZS5zb3J0KFhkKTtlW2UubGVuZ3RoLTFdPT09bi5sZW5ndGg7KW4ucG9wKCksZS5wb3AoKTtpZih0PG4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgQmF0Y2hlZE1lc2g6IEluc3RhbmNlIGlkcyBvdXRzaWRlIHRoZSByYW5nZSAke3R9IGFyZSBiZWluZyB1c2VkLiBDYW5ub3Qgc2hyaW5rIGluc3RhbmNlIGNvdW50LmApO2NvbnN0IHI9bmV3IEludDMyQXJyYXkodCkscz1uZXcgSW50MzJBcnJheSh0KTtscyh0aGlzLl9tdWx0aURyYXdDb3VudHMsciksbHModGhpcy5fbXVsdGlEcmF3U3RhcnRzLHMpLHRoaXMuX211bHRpRHJhd0NvdW50cz1yLHRoaXMuX211bHRpRHJhd1N0YXJ0cz1zLHRoaXMuX21heEluc3RhbmNlQ291bnQ9dDtjb25zdCBvPXRoaXMuX2luZGlyZWN0VGV4dHVyZSxhPXRoaXMuX21hdHJpY2VzVGV4dHVyZSxsPXRoaXMuX2NvbG9yc1RleHR1cmU7by5kaXNwb3NlKCksdGhpcy5faW5pdEluZGlyZWN0VGV4dHVyZSgpLGxzKG8uaW1hZ2UuZGF0YSx0aGlzLl9pbmRpcmVjdFRleHR1cmUuaW1hZ2UuZGF0YSksYS5kaXNwb3NlKCksdGhpcy5faW5pdE1hdHJpY2VzVGV4dHVyZSgpLGxzKGEuaW1hZ2UuZGF0YSx0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSksbCYmKGwuZGlzcG9zZSgpLHRoaXMuX2luaXRDb2xvcnNUZXh0dXJlKCksbHMobC5pbWFnZS5kYXRhLHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSkpfXNldEdlb21ldHJ5U2l6ZSh0LGUpe2NvbnN0IG49Wy4uLnRoaXMuX2dlb21ldHJ5SW5mb10uZmlsdGVyKGE9PmEuYWN0aXZlKTtpZihNYXRoLm1heCguLi5uLm1hcChhPT5hLnZlcnRleFN0YXJ0K2EucmVzZXJ2ZWRWZXJ0ZXhDb3VudCkpPnQpdGhyb3cgbmV3IEVycm9yKGBCYXRjaGVkTWVzaDogR2VvbWV0cnkgdmVydGV4IHZhbHVlcyBhcmUgYmVpbmcgdXNlZCBvdXRzaWRlIHRoZSByYW5nZSAke2V9LiBDYW5ub3Qgc2hyaW5rIGZ1cnRoZXIuYCk7aWYodGhpcy5nZW9tZXRyeS5pbmRleCYmTWF0aC5tYXgoLi4ubi5tYXAobD0+bC5pbmRleFN0YXJ0K2wucmVzZXJ2ZWRJbmRleENvdW50KSk+ZSl0aHJvdyBuZXcgRXJyb3IoYEJhdGNoZWRNZXNoOiBHZW9tZXRyeSBpbmRleCB2YWx1ZXMgYXJlIGJlaW5nIHVzZWQgb3V0c2lkZSB0aGUgcmFuZ2UgJHtlfS4gQ2Fubm90IHNocmluayBmdXJ0aGVyLmApO2NvbnN0IHM9dGhpcy5nZW9tZXRyeTtzLmRpc3Bvc2UoKSx0aGlzLl9tYXhWZXJ0ZXhDb3VudD10LHRoaXMuX21heEluZGV4Q291bnQ9ZSx0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkJiYodGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD0hMSx0aGlzLmdlb21ldHJ5PW5ldyBGdCx0aGlzLl9pbml0aWFsaXplR2VvbWV0cnkocykpO2NvbnN0IG89dGhpcy5nZW9tZXRyeTtzLmluZGV4JiZscyhzLmluZGV4LmFycmF5LG8uaW5kZXguYXJyYXkpO2Zvcihjb25zdCBhIGluIHMuYXR0cmlidXRlcylscyhzLmF0dHJpYnV0ZXNbYV0uYXJyYXksby5hdHRyaWJ1dGVzW2FdLmFycmF5KX1yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLl9pbnN0YW5jZUluZm8scj10aGlzLl9nZW9tZXRyeUluZm8scz10aGlzLm1hdHJpeFdvcmxkLG89dGhpcy5nZW9tZXRyeTt0bi5tYXRlcmlhbD10aGlzLm1hdGVyaWFsLHRuLmdlb21ldHJ5LmluZGV4PW8uaW5kZXgsdG4uZ2VvbWV0cnkuYXR0cmlidXRlcz1vLmF0dHJpYnV0ZXMsdG4uZ2VvbWV0cnkuYm91bmRpbmdCb3g9PT1udWxsJiYodG4uZ2VvbWV0cnkuYm91bmRpbmdCb3g9bmV3IG1lKSx0bi5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZT09PW51bGwmJih0bi5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZT1uZXcgcWUpO2ZvcihsZXQgYT0wLGw9bi5sZW5ndGg7YTxsO2ErKyl7aWYoIW5bYV0udmlzaWJsZXx8IW5bYV0uYWN0aXZlKWNvbnRpbnVlO2NvbnN0IGM9blthXS5nZW9tZXRyeUluZGV4LHU9cltjXTt0bi5nZW9tZXRyeS5zZXREcmF3UmFuZ2UodS5zdGFydCx1LmNvdW50KSx0aGlzLmdldE1hdHJpeEF0KGEsdG4ubWF0cml4V29ybGQpLnByZW11bHRpcGx5KHMpLHRoaXMuZ2V0Qm91bmRpbmdCb3hBdChjLHRuLmdlb21ldHJ5LmJvdW5kaW5nQm94KSx0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoYyx0bi5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSksdG4ucmF5Y2FzdCh0LGh1KTtmb3IobGV0IGg9MCxmPWh1Lmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPWh1W2hdO2Qub2JqZWN0PXRoaXMsZC5iYXRjaElkPWEsZS5wdXNoKGQpfWh1Lmxlbmd0aD0wfXRuLm1hdGVyaWFsPW51bGwsdG4uZ2VvbWV0cnkuaW5kZXg9bnVsbCx0bi5nZW9tZXRyeS5hdHRyaWJ1dGVzPXt9LHRuLmdlb21ldHJ5LnNldERyYXdSYW5nZSgwLDEvMCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnkuY2xvbmUoKSx0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dC5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLHRoaXMuc29ydE9iamVjdHM9dC5zb3J0T2JqZWN0cyx0aGlzLmJvdW5kaW5nQm94PXQuYm91bmRpbmdCb3ghPT1udWxsP3QuYm91bmRpbmdCb3guY2xvbmUoKTpudWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9dC5ib3VuZGluZ1NwaGVyZSE9PW51bGw/dC5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOm51bGwsdGhpcy5fZ2VvbWV0cnlJbmZvPXQuX2dlb21ldHJ5SW5mby5tYXAoZT0+Rmkob24oe30sZSkse2JvdW5kaW5nQm94OmUuYm91bmRpbmdCb3ghPT1udWxsP2UuYm91bmRpbmdCb3guY2xvbmUoKTpudWxsLGJvdW5kaW5nU3BoZXJlOmUuYm91bmRpbmdTcGhlcmUhPT1udWxsP2UuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTpudWxsfSkpLHRoaXMuX2luc3RhbmNlSW5mbz10Ll9pbnN0YW5jZUluZm8ubWFwKGU9Pm9uKHt9LGUpKSx0aGlzLl9tYXhJbnN0YW5jZUNvdW50PXQuX21heEluc3RhbmNlQ291bnQsdGhpcy5fbWF4VmVydGV4Q291bnQ9dC5fbWF4VmVydGV4Q291bnQsdGhpcy5fbWF4SW5kZXhDb3VudD10Ll9tYXhJbmRleENvdW50LHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQ9dC5fZ2VvbWV0cnlJbml0aWFsaXplZCx0aGlzLl9nZW9tZXRyeUNvdW50PXQuX2dlb21ldHJ5Q291bnQsdGhpcy5fbXVsdGlEcmF3Q291bnRzPXQuX211bHRpRHJhd0NvdW50cy5zbGljZSgpLHRoaXMuX211bHRpRHJhd1N0YXJ0cz10Ll9tdWx0aURyYXdTdGFydHMuc2xpY2UoKSx0aGlzLl9tYXRyaWNlc1RleHR1cmU9dC5fbWF0cmljZXNUZXh0dXJlLmNsb25lKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE9dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKSx0aGlzLl9jb2xvcnNUZXh0dXJlIT09bnVsbCYmKHRoaXMuX2NvbG9yc1RleHR1cmU9dC5fY29sb3JzVGV4dHVyZS5jbG9uZSgpLHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YT10aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKSksdGhpc31kaXNwb3NlKCl7cmV0dXJuIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuX21hdHJpY2VzVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlPW51bGwsdGhpcy5faW5kaXJlY3RUZXh0dXJlLmRpc3Bvc2UoKSx0aGlzLl9pbmRpcmVjdFRleHR1cmU9bnVsbCx0aGlzLl9jb2xvcnNUZXh0dXJlIT09bnVsbCYmKHRoaXMuX2NvbG9yc1RleHR1cmUuZGlzcG9zZSgpLHRoaXMuX2NvbG9yc1RleHR1cmU9bnVsbCksdGhpc31vbkJlZm9yZVJlbmRlcih0LGUsbixyLHMpe2lmKCF0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCYmIXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCYmIXRoaXMuc29ydE9iamVjdHMpcmV0dXJuO2NvbnN0IG89ci5nZXRJbmRleCgpLGE9bz09PW51bGw/MTpvLmFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULGw9dGhpcy5faW5zdGFuY2VJbmZvLGM9dGhpcy5fbXVsdGlEcmF3U3RhcnRzLHU9dGhpcy5fbXVsdGlEcmF3Q291bnRzLGg9dGhpcy5fZ2VvbWV0cnlJbmZvLGY9dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLGQ9dGhpcy5faW5kaXJlY3RUZXh0dXJlLHA9ZC5pbWFnZS5kYXRhO2YmJih3bi5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSkubXVsdGlwbHkodGhpcy5tYXRyaXhXb3JsZCkscWQuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgod24sdC5jb29yZGluYXRlU3lzdGVtKSk7bGV0IHk9MDtpZih0aGlzLnNvcnRPYmplY3RzKXt3bi5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLE9hLnNldEZyb21NYXRyaXhQb3NpdGlvbihuLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQod24pLHNfLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihuLm1hdHJpeFdvcmxkKS50cmFuc2Zvcm1EaXJlY3Rpb24od24pO2ZvcihsZXQgdj0wLHg9bC5sZW5ndGg7djx4O3YrKylpZihsW3ZdLnZpc2libGUmJmxbdl0uYWN0aXZlKXtjb25zdCBfPWxbdl0uZ2VvbWV0cnlJbmRleDt0aGlzLmdldE1hdHJpeEF0KHYsd24pLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChfLGFzKS5hcHBseU1hdHJpeDQod24pO2xldCBNPSExO2lmKGYmJihNPSFxZC5pbnRlcnNlY3RzU3BoZXJlKGFzKSksIU0pe2NvbnN0IGI9aFtfXSxBPXNFLnN1YlZlY3RvcnMoYXMuY2VudGVyLE9hKS5kb3Qoc18pO1lkLnB1c2goYi5zdGFydCxiLmNvdW50LEEsdil9fWNvbnN0IGc9WWQubGlzdCxtPXRoaXMuY3VzdG9tU29ydDttPT09bnVsbD9nLnNvcnQocy50cmFuc3BhcmVudD9uRTplRSk6bS5jYWxsKHRoaXMsZyxuKTtmb3IobGV0IHY9MCx4PWcubGVuZ3RoO3Y8eDt2Kyspe2NvbnN0IF89Z1t2XTtjW3ldPV8uc3RhcnQqYSx1W3ldPV8uY291bnQscFt5XT1fLmluZGV4LHkrK31ZZC5yZXNldCgpfWVsc2UgZm9yKGxldCBnPTAsbT1sLmxlbmd0aDtnPG07ZysrKWlmKGxbZ10udmlzaWJsZSYmbFtnXS5hY3RpdmUpe2NvbnN0IHY9bFtnXS5nZW9tZXRyeUluZGV4O2xldCB4PSExO2lmKGYmJih0aGlzLmdldE1hdHJpeEF0KGcsd24pLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdCh2LGFzKS5hcHBseU1hdHJpeDQod24pLHg9IXFkLmludGVyc2VjdHNTcGhlcmUoYXMpKSwheCl7Y29uc3QgXz1oW3ZdO2NbeV09Xy5zdGFydCphLHVbeV09Xy5jb3VudCxwW3ldPWcseSsrfX1kLm5lZWRzVXBkYXRlPSEwLHRoaXMuX211bHRpRHJhd0NvdW50PXksdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITF9b25CZWZvcmVTaGFkb3codCxlLG4scixzLG8pe3RoaXMub25CZWZvcmVSZW5kZXIodCxudWxsLHIscyxvKX19Y2xhc3MgaG4gZXh0ZW5kcyBRZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB4dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpbmV3aWR0aD0xLHRoaXMubGluZWNhcD0icm91bmQiLHRoaXMubGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpbmV3aWR0aD10LmxpbmV3aWR0aCx0aGlzLmxpbmVjYXA9dC5saW5lY2FwLHRoaXMubGluZWpvaW49dC5saW5lam9pbix0aGlzLmZvZz10LmZvZyx0aGlzfX1jb25zdCBmdT1uZXcgUixkdT1uZXcgUixhXz1uZXcgUnQsemE9bmV3IHZyLHB1PW5ldyBxZSxaZD1uZXcgUixsXz1uZXcgUjtjbGFzcyBBciBleHRlbmRzIGFle2NvbnN0cnVjdG9yKHQ9bmV3IEZ0LGU9bmV3IGhuKXtzdXBlcigpLHRoaXMuaXNMaW5lPSEwLHRoaXMudHlwZT0iTGluZSIsdGhpcy5nZW9tZXRyeT10LHRoaXMubWF0ZXJpYWw9ZSx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheSh0Lm1hdGVyaWFsKT90Lm1hdGVyaWFsLnNsaWNlKCk6dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc31jb21wdXRlTGluZURpc3RhbmNlcygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmluZGV4PT09bnVsbCl7Y29uc3QgZT10LmF0dHJpYnV0ZXMucG9zaXRpb24sbj1bMF07Zm9yKGxldCByPTEscz1lLmNvdW50O3I8cztyKyspZnUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHItMSksZHUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLG5bcl09bltyLTFdLG5bcl0rPWZ1LmRpc3RhbmNlVG8oZHUpO3Quc2V0QXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBNdChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7cmV0dXJuIHRoaXN9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxyPXRoaXMubWF0cml4V29ybGQscz10LnBhcmFtcy5MaW5lLnRocmVzaG9sZCxvPW4uZHJhd1JhbmdlO2lmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHB1LmNvcHkobi5ib3VuZGluZ1NwaGVyZSkscHUuYXBwbHlNYXRyaXg0KHIpLHB1LnJhZGl1cys9cyx0LnJheS5pbnRlcnNlY3RzU3BoZXJlKHB1KT09PSExKXJldHVybjthXy5jb3B5KHIpLmludmVydCgpLHphLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChhXyk7Y29uc3QgYT1zLygodGhpcy5zY2FsZS54K3RoaXMuc2NhbGUueSt0aGlzLnNjYWxlLnopLzMpLGw9YSphLGM9dGhpcy5pc0xpbmVTZWdtZW50cz8yOjEsdT1uLmluZGV4LGY9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHUhPT1udWxsKXtjb25zdCBkPU1hdGgubWF4KDAsby5zdGFydCkscD1NYXRoLm1pbih1LmNvdW50LG8uc3RhcnQrby5jb3VudCk7Zm9yKGxldCB5PWQsZz1wLTE7eTxnO3krPWMpe2NvbnN0IG09dS5nZXRYKHkpLHY9dS5nZXRYKHkrMSkseD1tdSh0aGlzLHQsemEsbCxtLHYpO3gmJmUucHVzaCh4KX1pZih0aGlzLmlzTGluZUxvb3Ape2NvbnN0IHk9dS5nZXRYKHAtMSksZz11LmdldFgoZCksbT1tdSh0aGlzLHQsemEsbCx5LGcpO20mJmUucHVzaChtKX19ZWxzZXtjb25zdCBkPU1hdGgubWF4KDAsby5zdGFydCkscD1NYXRoLm1pbihmLmNvdW50LG8uc3RhcnQrby5jb3VudCk7Zm9yKGxldCB5PWQsZz1wLTE7eTxnO3krPWMpe2NvbnN0IG09bXUodGhpcyx0LHphLGwseSx5KzEpO20mJmUucHVzaChtKX1pZih0aGlzLmlzTGluZUxvb3Ape2NvbnN0IHk9bXUodGhpcyx0LHphLGwscC0xLGQpO3kmJmUucHVzaCh5KX19fXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aD4wKXtjb25zdCByPWVbblswXV07aWYociE9PXZvaWQgMCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBzPTAsbz1yLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPXJbc10ubmFtZXx8U3RyaW5nKHMpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbYV09c319fX19ZnVuY3Rpb24gbXUoaSx0LGUsbixyLHMpe2NvbnN0IG89aS5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKGZ1LmZyb21CdWZmZXJBdHRyaWJ1dGUobyxyKSxkdS5mcm9tQnVmZmVyQXR0cmlidXRlKG8scyksZS5kaXN0YW5jZVNxVG9TZWdtZW50KGZ1LGR1LFpkLGxfKT5uKXJldHVybjtaZC5hcHBseU1hdHJpeDQoaS5tYXRyaXhXb3JsZCk7Y29uc3QgbD10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhaZCk7aWYoIShsPHQubmVhcnx8bD50LmZhcikpcmV0dXJue2Rpc3RhbmNlOmwscG9pbnQ6bF8uY2xvbmUoKS5hcHBseU1hdHJpeDQoaS5tYXRyaXhXb3JsZCksaW5kZXg6cixmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsYmFyeWNvb3JkOm51bGwsb2JqZWN0Oml9fWNvbnN0IGNfPW5ldyBSLHVfPW5ldyBSO2NsYXNzIFJpIGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuaXNMaW5lU2VnbWVudHM9ITAsdGhpcy50eXBlPSJMaW5lU2VnbWVudHMifWNvbXB1dGVMaW5lRGlzdGFuY2VzKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5O2lmKHQuaW5kZXg9PT1udWxsKXtjb25zdCBlPXQuYXR0cmlidXRlcy5wb3NpdGlvbixuPVtdO2ZvcihsZXQgcj0wLHM9ZS5jb3VudDtyPHM7cis9MiljXy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsciksdV8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIrMSksbltyXT1yPT09MD8wOm5bci0xXSxuW3IrMV09bltyXStjXy5kaXN0YW5jZVRvKHVfKTt0LnNldEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixuZXcgTXQobiwxKSl9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7cmV0dXJuIHRoaXN9fWNsYXNzIGhfIGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuaXNMaW5lTG9vcD0hMCx0aGlzLnR5cGU9IkxpbmVMb29wIn19Y2xhc3MgSmQgZXh0ZW5kcyBRZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNQb2ludHNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB4dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5zaXplPTEsdGhpcy5zaXplQXR0ZW51YXRpb249ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuc2l6ZT10LnNpemUsdGhpcy5zaXplQXR0ZW51YXRpb249dC5zaXplQXR0ZW51YXRpb24sdGhpcy5mb2c9dC5mb2csdGhpc319Y29uc3QgZl89bmV3IFJ0LGpkPW5ldyB2cixndT1uZXcgcWUseXU9bmV3IFI7Y2xhc3MgZF8gZXh0ZW5kcyBhZXtjb25zdHJ1Y3Rvcih0PW5ldyBGdCxlPW5ldyBKZCl7c3VwZXIoKSx0aGlzLmlzUG9pbnRzPSEwLHRoaXMudHlwZT0iUG9pbnRzIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5tYXRlcmlhbD1BcnJheS5pc0FycmF5KHQubWF0ZXJpYWwpP3QubWF0ZXJpYWwuc2xpY2UoKTp0Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscj10aGlzLm1hdHJpeFdvcmxkLHM9dC5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZCxvPW4uZHJhd1JhbmdlO2lmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLGd1LmNvcHkobi5ib3VuZGluZ1NwaGVyZSksZ3UuYXBwbHlNYXRyaXg0KHIpLGd1LnJhZGl1cys9cyx0LnJheS5pbnRlcnNlY3RzU3BoZXJlKGd1KT09PSExKXJldHVybjtmXy5jb3B5KHIpLmludmVydCgpLGpkLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChmXyk7Y29uc3QgYT1zLygodGhpcy5zY2FsZS54K3RoaXMuc2NhbGUueSt0aGlzLnNjYWxlLnopLzMpLGw9YSphLGM9bi5pbmRleCxoPW4uYXR0cmlidXRlcy5wb3NpdGlvbjtpZihjIT09bnVsbCl7Y29uc3QgZj1NYXRoLm1heCgwLG8uc3RhcnQpLGQ9TWF0aC5taW4oYy5jb3VudCxvLnN0YXJ0K28uY291bnQpO2ZvcihsZXQgcD1mLHk9ZDtwPHk7cCsrKXtjb25zdCBnPWMuZ2V0WChwKTt5dS5mcm9tQnVmZmVyQXR0cmlidXRlKGgsZykscF8oeXUsZyxsLHIsdCxlLHRoaXMpfX1lbHNle2NvbnN0IGY9TWF0aC5tYXgoMCxvLnN0YXJ0KSxkPU1hdGgubWluKGguY291bnQsby5zdGFydCtvLmNvdW50KTtmb3IobGV0IHA9Zix5PWQ7cDx5O3ArKyl5dS5mcm9tQnVmZmVyQXR0cmlidXRlKGgscCkscF8oeXUscCxsLHIsdCxlLHRoaXMpfX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3Qgcj1lW25bMF1dO2lmKHIhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcz0wLG89ci5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1yW3NdLm5hbWV8fFN0cmluZyhzKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXN9fX19fWZ1bmN0aW9uIHBfKGksdCxlLG4scixzLG8pe2NvbnN0IGE9amQuZGlzdGFuY2VTcVRvUG9pbnQoaSk7aWYoYTxlKXtjb25zdCBsPW5ldyBSO2pkLmNsb3Nlc3RQb2ludFRvUG9pbnQoaSxsKSxsLmFwcGx5TWF0cml4NChuKTtjb25zdCBjPXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKGwpO2lmKGM8ci5uZWFyfHxjPnIuZmFyKXJldHVybjtzLnB1c2goe2Rpc3RhbmNlOmMsZGlzdGFuY2VUb1JheTpNYXRoLnNxcnQoYSkscG9pbnQ6bCxpbmRleDp0LGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxiYXJ5Y29vcmQ6bnVsbCxvYmplY3Q6b30pfX1jbGFzcyBTbyBleHRlbmRzIGFle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzR3JvdXA9ITAsdGhpcy50eXBlPSJHcm91cCJ9fWNsYXNzIGFFIGV4dGVuZHMgVGV7Y29uc3RydWN0b3IodCxlLG4scixzLG8sYSxsLGMpe3N1cGVyKHQsZSxuLHIscyxvLGEsbCxjKSx0aGlzLmlzVmlkZW9UZXh0dXJlPSEwLHRoaXMubWluRmlsdGVyPW8hPT12b2lkIDA/bzpWZSx0aGlzLm1hZ0ZpbHRlcj1zIT09dm9pZCAwP3M6VmUsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7Y29uc3QgdT10aGlzO2Z1bmN0aW9uIGgoKXt1Lm5lZWRzVXBkYXRlPSEwLHQucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayhoKX0icmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayJpbiB0JiZ0LnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soaCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5pbWFnZSkuY29weSh0aGlzKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuaW1hZ2U7InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gdD09PSExJiZ0LnJlYWR5U3RhdGU+PXQuSEFWRV9DVVJSRU5UX0RBVEEmJih0aGlzLm5lZWRzVXBkYXRlPSEwKX19Y2xhc3MgbEUgZXh0ZW5kcyBUZXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHt3aWR0aDp0LGhlaWdodDplfSksdGhpcy5pc0ZyYW1lYnVmZmVyVGV4dHVyZT0hMCx0aGlzLm1hZ0ZpbHRlcj1YZSx0aGlzLm1pbkZpbHRlcj1YZSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLm5lZWRzVXBkYXRlPSEwfX1jbGFzcyBfdSBleHRlbmRzIFRle2NvbnN0cnVjdG9yKHQsZSxuLHIscyxvLGEsbCxjLHUsaCxmKXtzdXBlcihudWxsLG8sYSxsLGMsdSxyLHMsaCxmKSx0aGlzLmlzQ29tcHJlc3NlZFRleHR1cmU9ITAsdGhpcy5pbWFnZT17d2lkdGg6ZSxoZWlnaHQ6bn0sdGhpcy5taXBtYXBzPXQsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX19Y2xhc3MgY0UgZXh0ZW5kcyBfdXtjb25zdHJ1Y3Rvcih0LGUsbixyLHMsbyl7c3VwZXIodCxlLG4scyxvKSx0aGlzLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZT0hMCx0aGlzLmltYWdlLmRlcHRoPXIsdGhpcy53cmFwUj1xbix0aGlzLmxheWVyVXBkYXRlcz1uZXcgU2V0fWFkZExheWVyVXBkYXRlKHQpe3RoaXMubGF5ZXJVcGRhdGVzLmFkZCh0KX1jbGVhckxheWVyVXBkYXRlcygpe3RoaXMubGF5ZXJVcGRhdGVzLmNsZWFyKCl9fWNsYXNzIHVFIGV4dGVuZHMgX3V7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHZvaWQgMCx0WzBdLndpZHRoLHRbMF0uaGVpZ2h0LGUsbixraSksdGhpcy5pc0NvbXByZXNzZWRDdWJlVGV4dHVyZT0hMCx0aGlzLmlzQ3ViZVRleHR1cmU9ITAsdGhpcy5pbWFnZT10fX1jbGFzcyBoRSBleHRlbmRzIFRle2NvbnN0cnVjdG9yKHQsZSxuLHIscyxvLGEsbCxjKXtzdXBlcih0LGUsbixyLHMsbyxhLGwsYyksdGhpcy5pc0NhbnZhc1RleHR1cmU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y2xhc3MgS2QgZXh0ZW5kcyBUZXtjb25zdHJ1Y3Rvcih0LGUsbixyLHMsbyxhLGwsYyx1PXFyKXtpZih1IT09cXImJnUhPT1Zcil0aHJvdyBuZXcgRXJyb3IoIkRlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0Iik7bj09PXZvaWQgMCYmdT09PXFyJiYobj1WaSksbj09PXZvaWQgMCYmdT09PVlyJiYobj1Yciksc3VwZXIobnVsbCxyLHMsbyxhLGwsdSxuLGMpLHRoaXMuaXNEZXB0aFRleHR1cmU9ITAsdGhpcy5pbWFnZT17d2lkdGg6dCxoZWlnaHQ6ZX0sdGhpcy5tYWdGaWx0ZXI9YSE9PXZvaWQgMD9hOlhlLHRoaXMubWluRmlsdGVyPWwhPT12b2lkIDA/bDpYZSx0aGlzLmZsaXBZPSExLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuY29tcGFyZUZ1bmN0aW9uPW51bGx9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbXBhcmVGdW5jdGlvbj10LmNvbXBhcmVGdW5jdGlvbix0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gdGhpcy5jb21wYXJlRnVuY3Rpb24hPT1udWxsJiYoZS5jb21wYXJlRnVuY3Rpb249dGhpcy5jb21wYXJlRnVuY3Rpb24pLGV9fWNsYXNzIGZpe2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJDdXJ2ZSIsdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwfWdldFBvaW50KCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKSxudWxsfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixyPXRoaXMuZ2V0UG9pbnQoMCkscz0wO2UucHVzaCgwKTtmb3IobGV0IG89MTtvPD10O28rKyluPXRoaXMuZ2V0UG9pbnQoby90KSxzKz1uLmRpc3RhbmNlVG8ociksZS5wdXNoKHMpLHI9bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZSl7Y29uc3Qgbj10aGlzLmdldExlbmd0aHMoKTtsZXQgcj0wO2NvbnN0IHM9bi5sZW5ndGg7bGV0IG87ZT9vPWU6bz10Km5bcy0xXTtsZXQgYT0wLGw9cy0xLGM7Zm9yKDthPD1sOylpZihyPU1hdGguZmxvb3IoYSsobC1hKS8yKSxjPW5bcl0tbyxjPDApYT1yKzE7ZWxzZSBpZihjPjApbD1yLTE7ZWxzZXtsPXI7YnJlYWt9aWYocj1sLG5bcl09PT1vKXJldHVybiByLyhzLTEpO2NvbnN0IHU9bltyXSxmPW5bcisxXS11LGQ9KG8tdSkvZjtyZXR1cm4ocitkKS8ocy0xKX1nZXRUYW5nZW50KHQsZSl7bGV0IHI9dC0xZS00LHM9dCsxZS00O3I8MCYmKHI9MCkscz4xJiYocz0xKTtjb25zdCBvPXRoaXMuZ2V0UG9pbnQociksYT10aGlzLmdldFBvaW50KHMpLGw9ZXx8KG8uaXNWZWN0b3IyP25ldyBYOm5ldyBSKTtyZXR1cm4gbC5jb3B5KGEpLnN1YihvKS5ub3JtYWxpemUoKSxsfWdldFRhbmdlbnRBdCh0LGUpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KG4sZSl9Y29tcHV0ZUZyZW5ldEZyYW1lcyh0LGUpe2NvbnN0IG49bmV3IFIscj1bXSxzPVtdLG89W10sYT1uZXcgUixsPW5ldyBSdDtmb3IobGV0IGQ9MDtkPD10O2QrKyl7Y29uc3QgcD1kL3Q7cltkXT10aGlzLmdldFRhbmdlbnRBdChwLG5ldyBSKX1zWzBdPW5ldyBSLG9bMF09bmV3IFI7bGV0IGM9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCB1PU1hdGguYWJzKHJbMF0ueCksaD1NYXRoLmFicyhyWzBdLnkpLGY9TWF0aC5hYnMoclswXS56KTt1PD1jJiYoYz11LG4uc2V0KDEsMCwwKSksaDw9YyYmKGM9aCxuLnNldCgwLDEsMCkpLGY8PWMmJm4uc2V0KDAsMCwxKSxhLmNyb3NzVmVjdG9ycyhyWzBdLG4pLm5vcm1hbGl6ZSgpLHNbMF0uY3Jvc3NWZWN0b3JzKHJbMF0sYSksb1swXS5jcm9zc1ZlY3RvcnMoclswXSxzWzBdKTtmb3IobGV0IGQ9MTtkPD10O2QrKyl7aWYoc1tkXT1zW2QtMV0uY2xvbmUoKSxvW2RdPW9bZC0xXS5jbG9uZSgpLGEuY3Jvc3NWZWN0b3JzKHJbZC0xXSxyW2RdKSxhLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OKXthLm5vcm1hbGl6ZSgpO2NvbnN0IHA9TWF0aC5hY29zKEh0KHJbZC0xXS5kb3QocltkXSksLTEsMSkpO3NbZF0uYXBwbHlNYXRyaXg0KGwubWFrZVJvdGF0aW9uQXhpcyhhLHApKX1vW2RdLmNyb3NzVmVjdG9ycyhyW2RdLHNbZF0pfWlmKGU9PT0hMCl7bGV0IGQ9TWF0aC5hY29zKEh0KHNbMF0uZG90KHNbdF0pLC0xLDEpKTtkLz10LHJbMF0uZG90KGEuY3Jvc3NWZWN0b3JzKHNbMF0sc1t0XSkpPjAmJihkPS1kKTtmb3IobGV0IHA9MTtwPD10O3ArKylzW3BdLmFwcGx5TWF0cml4NChsLm1ha2VSb3RhdGlvbkF4aXMocltwXSxkKnApKSxvW3BdLmNyb3NzVmVjdG9ycyhyW3BdLHNbcF0pfXJldHVybnt0YW5nZW50czpyLG5vcm1hbHM6cyxiaW5vcm1hbHM6b319Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTtyZXR1cm4gdC5hcmNMZW5ndGhEaXZpc2lvbnM9dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMsdC50eXBlPXRoaXMudHlwZSx0fWZyb21KU09OKHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfX1jbGFzcyB4dSBleHRlbmRzIGZpe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLHI9MSxzPTAsbz1NYXRoLlBJKjIsYT0hMSxsPTApe3N1cGVyKCksdGhpcy5pc0VsbGlwc2VDdXJ2ZT0hMCx0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSIsdGhpcy5hWD10LHRoaXMuYVk9ZSx0aGlzLnhSYWRpdXM9bix0aGlzLnlSYWRpdXM9cix0aGlzLmFTdGFydEFuZ2xlPXMsdGhpcy5hRW5kQW5nbGU9byx0aGlzLmFDbG9ja3dpc2U9YSx0aGlzLmFSb3RhdGlvbj1sfWdldFBvaW50KHQsZT1uZXcgWCl7Y29uc3Qgbj1lLHI9TWF0aC5QSSoyO2xldCBzPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3Qgbz1NYXRoLmFicyhzKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3M8MDspcys9cjtmb3IoO3M+cjspcy09cjtzPE51bWJlci5FUFNJTE9OJiYobz9zPTA6cz1yKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIW8mJihzPT09cj9zPS1yOnM9cy1yKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpzO2xldCBsPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGM9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCB1PU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxoPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWwtdGhpcy5hWCxkPWMtdGhpcy5hWTtsPWYqdS1kKmgrdGhpcy5hWCxjPWYqaCtkKnUrdGhpcy5hWX1yZXR1cm4gbi5zZXQobCxjKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319Y2xhc3MgbV8gZXh0ZW5kcyB4dXtjb25zdHJ1Y3Rvcih0LGUsbixyLHMsbyl7c3VwZXIodCxlLG4sbixyLHMsbyksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBRZCgpe2xldCBpPTAsdD0wLGU9MCxuPTA7ZnVuY3Rpb24gcihzLG8sYSxsKXtpPXMsdD1hLGU9LTMqcyszKm8tMiphLWwsbj0yKnMtMipvK2ErbH1yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocyxvLGEsbCxjKXtyKG8sYSxjKihhLXMpLGMqKGwtbykpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocyxvLGEsbCxjLHUsaCl7bGV0IGY9KG8tcykvYy0oYS1zKS8oYyt1KSsoYS1vKS91LGQ9KGEtbykvdS0obC1vKS8odStoKSsobC1hKS9oO2YqPXUsZCo9dSxyKG8sYSxmLGQpfSxjYWxjOmZ1bmN0aW9uKHMpe2NvbnN0IG89cypzLGE9bypzO3JldHVybiBpK3QqcytlKm8rbiphfX19Y29uc3QgdnU9bmV3IFIsdHA9bmV3IFFkLGVwPW5ldyBRZCxucD1uZXcgUWQ7Y2xhc3MgZ18gZXh0ZW5kcyBmaXtjb25zdHJ1Y3Rvcih0PVtdLGU9ITEsbj0iY2VudHJpcGV0YWwiLHI9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz10LHRoaXMuY2xvc2VkPWUsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249cn1nZXRQb2ludCh0LGU9bmV3IFIpe2NvbnN0IG49ZSxyPXRoaXMucG9pbnRzLHM9ci5sZW5ndGgsbz0ocy0odGhpcy5jbG9zZWQ/MDoxKSkqdDtsZXQgYT1NYXRoLmZsb29yKG8pLGw9by1hO3RoaXMuY2xvc2VkP2ErPWE+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKGEpL3MpKzEpKnM6bD09PTAmJmE9PT1zLTEmJihhPXMtMixsPTEpO2xldCBjLHU7dGhpcy5jbG9zZWR8fGE+MD9jPXJbKGEtMSklc106KHZ1LnN1YlZlY3RvcnMoclswXSxyWzFdKS5hZGQoclswXSksYz12dSk7Y29uc3QgaD1yW2Elc10sZj1yWyhhKzEpJXNdO2lmKHRoaXMuY2xvc2VkfHxhKzI8cz91PXJbKGErMiklc106KHZ1LnN1YlZlY3RvcnMocltzLTFdLHJbcy0yXSkuYWRkKHJbcy0xXSksdT12dSksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3coYy5kaXN0YW5jZVRvU3F1YXJlZChoKSxkKSx5PU1hdGgucG93KGguZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksZz1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKHUpLGQpO3k8MWUtNCYmKHk9MSkscDwxZS00JiYocD15KSxnPDFlLTQmJihnPXkpLHRwLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLngsaC54LGYueCx1LngscCx5LGcpLGVwLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLnksaC55LGYueSx1LnkscCx5LGcpLG5wLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLnosaC56LGYueix1LnoscCx5LGcpfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJih0cC5pbml0Q2F0bXVsbFJvbShjLngsaC54LGYueCx1LngsdGhpcy50ZW5zaW9uKSxlcC5pbml0Q2F0bXVsbFJvbShjLnksaC55LGYueSx1LnksdGhpcy50ZW5zaW9uKSxucC5pbml0Q2F0bXVsbFJvbShjLnosaC56LGYueix1LnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KHRwLmNhbGMobCksZXAuY2FsYyhsKSxucC5jYWxjKGwpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCByPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2goci5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHIudG9BcnJheSgpKX1yZXR1cm4gdC5jbG9zZWQ9dGhpcy5jbG9zZWQsdC5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsdC50ZW5zaW9uPXRoaXMudGVuc2lvbix0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgUigpLmZyb21BcnJheShyKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc319ZnVuY3Rpb24geV8oaSx0LGUsbixyKXtjb25zdCBzPShuLXQpKi41LG89KHItZSkqLjUsYT1pKmksbD1pKmE7cmV0dXJuKDIqZS0yKm4rcytvKSpsKygtMyplKzMqbi0yKnMtbykqYStzKmkrZX1mdW5jdGlvbiBmRShpLHQpe2NvbnN0IGU9MS1pO3JldHVybiBlKmUqdH1mdW5jdGlvbiBkRShpLHQpe3JldHVybiAyKigxLWkpKmkqdH1mdW5jdGlvbiBwRShpLHQpe3JldHVybiBpKmkqdH1mdW5jdGlvbiBrYShpLHQsZSxuKXtyZXR1cm4gZkUoaSx0KStkRShpLGUpK3BFKGksbil9ZnVuY3Rpb24gbUUoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKmUqdH1mdW5jdGlvbiBnRShpLHQpe2NvbnN0IGU9MS1pO3JldHVybiAzKmUqZSppKnR9ZnVuY3Rpb24geUUoaSx0KXtyZXR1cm4gMyooMS1pKSppKmkqdH1mdW5jdGlvbiBfRShpLHQpe3JldHVybiBpKmkqaSp0fWZ1bmN0aW9uIFZhKGksdCxlLG4scil7cmV0dXJuIG1FKGksdCkrZ0UoaSxlKSt5RShpLG4pK19FKGkscil9Y2xhc3MgaXAgZXh0ZW5kcyBmaXtjb25zdHJ1Y3Rvcih0PW5ldyBYLGU9bmV3IFgsbj1uZXcgWCxyPW5ldyBYKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1yfWdldFBvaW50KHQsZT1uZXcgWCl7Y29uc3Qgbj1lLHI9dGhpcy52MCxzPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQoVmEodCxyLngscy54LG8ueCxhLngpLFZhKHQsci55LHMueSxvLnksYS55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgX18gZXh0ZW5kcyBmaXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIsbj1uZXcgUixyPW5ldyBSKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPXJ9Z2V0UG9pbnQodCxlPW5ldyBSKXtjb25zdCBuPWUscj10aGlzLnYwLHM9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldChWYSh0LHIueCxzLngsby54LGEueCksVmEodCxyLnkscy55LG8ueSxhLnkpLFZhKHQsci56LHMueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgcnAgZXh0ZW5kcyBmaXtjb25zdHJ1Y3Rvcih0PW5ldyBYLGU9bmV3IFgpe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IFgpe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBYKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyB4XyBleHRlbmRzIGZpe2NvbnN0cnVjdG9yKHQ9bmV3IFIsZT1uZXcgUil7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBSKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgUil7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3Mgc3AgZXh0ZW5kcyBmaXtjb25zdHJ1Y3Rvcih0PW5ldyBYLGU9bmV3IFgsbj1uZXcgWCl7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBYKXtjb25zdCBuPWUscj10aGlzLnYwLHM9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KGthKHQsci54LHMueCxvLngpLGthKHQsci55LHMueSxvLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBvcCBleHRlbmRzIGZpe2NvbnN0cnVjdG9yKHQ9bmV3IFIsZT1uZXcgUixuPW5ldyBSKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHI9dGhpcy52MCxzPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldChrYSh0LHIueCxzLngsby54KSxrYSh0LHIueSxzLnksby55KSxrYSh0LHIueixzLnosby56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgYXAgZXh0ZW5kcyBmaXtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz10fWdldFBvaW50KHQsZT1uZXcgWCl7Y29uc3Qgbj1lLHI9dGhpcy5wb2ludHMscz0oci5sZW5ndGgtMSkqdCxvPU1hdGguZmxvb3IocyksYT1zLW8sbD1yW289PT0wP286by0xXSxjPXJbb10sdT1yW28+ci5sZW5ndGgtMj9yLmxlbmd0aC0xOm8rMV0saD1yW28+ci5sZW5ndGgtMz9yLmxlbmd0aC0xOm8rMl07cmV0dXJuIG4uc2V0KHlfKGEsbC54LGMueCx1LngsaC54KSx5XyhhLGwueSxjLnksdS55LGgueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChyLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHIudG9BcnJheSgpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCByPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IFgoKS5mcm9tQXJyYXkocikpfXJldHVybiB0aGlzfX12YXIgU3U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6bV8sQ2F0bXVsbFJvbUN1cnZlMzpnXyxDdWJpY0JlemllckN1cnZlOmlwLEN1YmljQmV6aWVyQ3VydmUzOl9fLEVsbGlwc2VDdXJ2ZTp4dSxMaW5lQ3VydmU6cnAsTGluZUN1cnZlMzp4XyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpzcCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6b3AsU3BsaW5lQ3VydmU6YXB9KTtjbGFzcyB2XyBleHRlbmRzIGZpe2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKHQpe3RoaXMuY3VydmVzLnB1c2godCl9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighdC5lcXVhbHMoZSkpe2NvbnN0IG49dC5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgU3Vbbl0oZSx0KSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQodCxlKXtjb25zdCBuPXQqdGhpcy5nZXRMZW5ndGgoKSxyPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHM9MDtmb3IoO3M8ci5sZW5ndGg7KXtpZihyW3NdPj1uKXtjb25zdCBvPXJbc10tbixhPXRoaXMuY3VydmVzW3NdLGw9YS5nZXRMZW5ndGgoKSxjPWw9PT0wPzA6MS1vL2w7cmV0dXJuIGEuZ2V0UG9pbnRBdChjLGUpfXMrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxyPXRoaXMuY3VydmVzLmxlbmd0aDtuPHI7bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCByPTAscz10aGlzLmN1cnZlcztyPHMubGVuZ3RoO3IrKyl7Y29uc3Qgbz1zW3JdLGE9by5pc0VsbGlwc2VDdXJ2ZT90KjI6by5pc0xpbmVDdXJ2ZXx8by5pc0xpbmVDdXJ2ZTM/MTpvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCxsPW8uZ2V0UG9pbnRzKGEpO2ZvcihsZXQgYz0wO2M8bC5sZW5ndGg7YysrKXtjb25zdCB1PWxbY107biYmbi5lcXVhbHModSl8fChlLnB1c2godSksbj11KX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLmxlbmd0aD4xJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKSxlfWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCByPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2goci5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dGhpcy5jdXJ2ZXNbZV07dC5jdXJ2ZXMucHVzaChyLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCByPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gobmV3IFN1W3IudHlwZV0oKS5mcm9tSlNPTihyKSl9cmV0dXJuIHRoaXN9fWxldCBHYT1jbGFzcyBleHRlbmRzIHZfe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgWCx0JiZ0aGlzLnNldEZyb21Qb2ludHModCl9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1vdmVUbyh0WzBdLngsdFswXS55KTtmb3IobGV0IGU9MSxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5saW5lVG8odFtlXS54LHRbZV0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9bGluZVRvKHQsZSl7Y29uc3Qgbj1uZXcgcnAodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgWCh0LGUpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8odCxlLG4scil7Y29uc3Qgcz1uZXcgc3AodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgWCh0LGUpLG5ldyBYKG4scikpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHMpLHRoaXMuY3VycmVudFBvaW50LnNldChuLHIpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixyLHMsbyl7Y29uc3QgYT1uZXcgaXAodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgWCh0LGUpLG5ldyBYKG4sciksbmV3IFgocyxvKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goYSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHMsbyksdGhpc31zcGxpbmVUaHJ1KHQpe2NvbnN0IGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdCh0KSxuPW5ldyBhcChlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLHIscyxvKXtjb25zdCBhPXRoaXMuY3VycmVudFBvaW50LngsbD10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyh0K2EsZStsLG4scixzLG8pLHRoaXN9YWJzYXJjKHQsZSxuLHIscyxvKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4scixzLG8pLHRoaXN9ZWxsaXBzZSh0LGUsbixyLHMsbyxhLGwpe2NvbnN0IGM9dGhpcy5jdXJyZW50UG9pbnQueCx1PXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0K2MsZSt1LG4scixzLG8sYSxsKSx0aGlzfWFic2VsbGlwc2UodCxlLG4scixzLG8sYSxsKXtjb25zdCBjPW5ldyB4dSh0LGUsbixyLHMsbyxhLGwpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCBoPWMuZ2V0UG9pbnQoMCk7aC5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyhoLngsaC55KX10aGlzLmN1cnZlcy5wdXNoKGMpO2NvbnN0IHU9Yy5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weSh1KSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgSGEgZXh0ZW5kcyBGdHtjb25zdHJ1Y3Rvcih0PVtuZXcgWCgwLC0uNSksbmV3IFgoLjUsMCksbmV3IFgoMCwuNSldLGU9MTIsbj0wLHI9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6dCxzZWdtZW50czplLHBoaVN0YXJ0Om4scGhpTGVuZ3RoOnJ9LGU9TWF0aC5mbG9vcihlKSxyPUh0KHIsMCxNYXRoLlBJKjIpO2NvbnN0IHM9W10sbz1bXSxhPVtdLGw9W10sYz1bXSx1PTEvZSxoPW5ldyBSLGY9bmV3IFgsZD1uZXcgUixwPW5ldyBSLHk9bmV3IFI7bGV0IGc9MCxtPTA7Zm9yKGxldCB2PTA7djw9dC5sZW5ndGgtMTt2Kyspc3dpdGNoKHYpe2Nhc2UgMDpnPXRbdisxXS54LXRbdl0ueCxtPXRbdisxXS55LXRbdl0ueSxkLng9bSoxLGQueT0tZyxkLno9bSowLHkuY29weShkKSxkLm5vcm1hbGl6ZSgpLGwucHVzaChkLngsZC55LGQueik7YnJlYWs7Y2FzZSB0Lmxlbmd0aC0xOmwucHVzaCh5LngseS55LHkueik7YnJlYWs7ZGVmYXVsdDpnPXRbdisxXS54LXRbdl0ueCxtPXRbdisxXS55LXRbdl0ueSxkLng9bSoxLGQueT0tZyxkLno9bSowLHAuY29weShkKSxkLngrPXkueCxkLnkrPXkueSxkLnorPXkueixkLm5vcm1hbGl6ZSgpLGwucHVzaChkLngsZC55LGQueikseS5jb3B5KHApfWZvcihsZXQgdj0wO3Y8PWU7disrKXtjb25zdCB4PW4rdip1KnIsXz1NYXRoLnNpbih4KSxNPU1hdGguY29zKHgpO2ZvcihsZXQgYj0wO2I8PXQubGVuZ3RoLTE7YisrKXtoLng9dFtiXS54Kl8saC55PXRbYl0ueSxoLno9dFtiXS54Kk0sby5wdXNoKGgueCxoLnksaC56KSxmLng9di9lLGYueT1iLyh0Lmxlbmd0aC0xKSxhLnB1c2goZi54LGYueSk7Y29uc3QgQT1sWzMqYiswXSpfLEU9bFszKmIrMV0sdz1sWzMqYiswXSpNO2MucHVzaChBLEUsdyl9fWZvcihsZXQgdj0wO3Y8ZTt2KyspZm9yKGxldCB4PTA7eDx0Lmxlbmd0aC0xO3grKyl7Y29uc3QgXz14K3YqdC5sZW5ndGgsTT1fLGI9Xyt0Lmxlbmd0aCxBPV8rdC5sZW5ndGgrMSxFPV8rMTtzLnB1c2goTSxiLEUpLHMucHVzaChBLEUsYil9dGhpcy5zZXRJbmRleChzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBNdChvLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdChhLDIpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgTXQoYywzKSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgSGEodC5wb2ludHMsdC5zZWdtZW50cyx0LnBoaVN0YXJ0LHQucGhpTGVuZ3RoKX19Y2xhc3MgTXUgZXh0ZW5kcyBIYXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49NCxyPTgpe2NvbnN0IHM9bmV3IEdhO3MuYWJzYXJjKDAsLWUvMix0LE1hdGguUEkqMS41LDApLHMuYWJzYXJjKDAsZS8yLHQsMCxNYXRoLlBJKi41KSxzdXBlcihzLmdldFBvaW50cyhuKSxyKSx0aGlzLnR5cGU9IkNhcHN1bGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxsZW5ndGg6ZSxjYXBTZWdtZW50czpuLHJhZGlhbFNlZ21lbnRzOnJ9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IE11KHQucmFkaXVzLHQubGVuZ3RoLHQuY2FwU2VnbWVudHMsdC5yYWRpYWxTZWdtZW50cyl9fWNsYXNzIGJ1IGV4dGVuZHMgRnR7Y29uc3RydWN0b3IodD0xLGU9MzIsbj0wLHI9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsc2VnbWVudHM6ZSx0aGV0YVN0YXJ0Om4sdGhldGFMZW5ndGg6cn0sZT1NYXRoLm1heCgzLGUpO2NvbnN0IHM9W10sbz1bXSxhPVtdLGw9W10sYz1uZXcgUix1PW5ldyBYO28ucHVzaCgwLDAsMCksYS5wdXNoKDAsMCwxKSxsLnB1c2goLjUsLjUpO2ZvcihsZXQgaD0wLGY9MztoPD1lO2grKyxmKz0zKXtjb25zdCBkPW4raC9lKnI7Yy54PXQqTWF0aC5jb3MoZCksYy55PXQqTWF0aC5zaW4oZCksby5wdXNoKGMueCxjLnksYy56KSxhLnB1c2goMCwwLDEpLHUueD0ob1tmXS90KzEpLzIsdS55PShvW2YrMV0vdCsxKS8yLGwucHVzaCh1LngsdS55KX1mb3IobGV0IGg9MTtoPD1lO2grKylzLnB1c2goaCxoKzEsMCk7dGhpcy5zZXRJbmRleChzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBNdChvLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgTXQoYSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgTXQobCwyKSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgYnUodC5yYWRpdXMsdC5zZWdtZW50cyx0LnRoZXRhU3RhcnQsdC50aGV0YUxlbmd0aCl9fWNsYXNzIE1vIGV4dGVuZHMgRnR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEscj0zMixzPTEsbz0hMSxhPTAsbD1NYXRoLlBJKjIpe3N1cGVyKCksdGhpcy50eXBlPSJDeWxpbmRlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1c1RvcDp0LHJhZGl1c0JvdHRvbTplLGhlaWdodDpuLHJhZGlhbFNlZ21lbnRzOnIsaGVpZ2h0U2VnbWVudHM6cyxvcGVuRW5kZWQ6byx0aGV0YVN0YXJ0OmEsdGhldGFMZW5ndGg6bH07Y29uc3QgYz10aGlzO3I9TWF0aC5mbG9vcihyKSxzPU1hdGguZmxvb3Iocyk7Y29uc3QgdT1bXSxoPVtdLGY9W10sZD1bXTtsZXQgcD0wO2NvbnN0IHk9W10sZz1uLzI7bGV0IG09MDt2KCksbz09PSExJiYodD4wJiZ4KCEwKSxlPjAmJngoITEpKSx0aGlzLnNldEluZGV4KHUpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdChmLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdChkLDIpKTtmdW5jdGlvbiB2KCl7Y29uc3QgXz1uZXcgUixNPW5ldyBSO2xldCBiPTA7Y29uc3QgQT0oZS10KS9uO2ZvcihsZXQgRT0wO0U8PXM7RSsrKXtjb25zdCB3PVtdLFM9RS9zLFQ9UyooZS10KSt0O2ZvcihsZXQgRD0wO0Q8PXI7RCsrKXtjb25zdCBMPUQvcixOPUwqbCthLEY9TWF0aC5zaW4oTiksQj1NYXRoLmNvcyhOKTtNLng9VCpGLE0ueT0tUypuK2csTS56PVQqQixoLnB1c2goTS54LE0ueSxNLnopLF8uc2V0KEYsQSxCKS5ub3JtYWxpemUoKSxmLnB1c2goXy54LF8ueSxfLnopLGQucHVzaChMLDEtUyksdy5wdXNoKHArKyl9eS5wdXNoKHcpfWZvcihsZXQgRT0wO0U8cjtFKyspZm9yKGxldCB3PTA7dzxzO3crKyl7Y29uc3QgUz15W3ddW0VdLFQ9eVt3KzFdW0VdLEQ9eVt3KzFdW0UrMV0sTD15W3ddW0UrMV07KHQ+MHx8dyE9PTApJiYodS5wdXNoKFMsVCxMKSxiKz0zKSwoZT4wfHx3IT09cy0xKSYmKHUucHVzaChULEQsTCksYis9Myl9Yy5hZGRHcm91cChtLGIsMCksbSs9Yn1mdW5jdGlvbiB4KF8pe2NvbnN0IE09cCxiPW5ldyBYLEE9bmV3IFI7bGV0IEU9MDtjb25zdCB3PV89PT0hMD90OmUsUz1fPT09ITA/MTotMTtmb3IobGV0IEQ9MTtEPD1yO0QrKyloLnB1c2goMCxnKlMsMCksZi5wdXNoKDAsUywwKSxkLnB1c2goLjUsLjUpLHArKztjb25zdCBUPXA7Zm9yKGxldCBEPTA7RDw9cjtEKyspe2NvbnN0IE49RC9yKmwrYSxGPU1hdGguY29zKE4pLEI9TWF0aC5zaW4oTik7QS54PXcqQixBLnk9ZypTLEEuej13KkYsaC5wdXNoKEEueCxBLnksQS56KSxmLnB1c2goMCxTLDApLGIueD1GKi41Ky41LGIueT1CKi41KlMrLjUsZC5wdXNoKGIueCxiLnkpLHArK31mb3IobGV0IEQ9MDtEPHI7RCsrKXtjb25zdCBMPU0rRCxOPVQrRDtfPT09ITA/dS5wdXNoKE4sTisxLEwpOnUucHVzaChOKzEsTixMKSxFKz0zfWMuYWRkR3JvdXAobSxFLF89PT0hMD8xOjIpLG0rPUV9fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IE1vKHQucmFkaXVzVG9wLHQucmFkaXVzQm90dG9tLHQuaGVpZ2h0LHQucmFkaWFsU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyx0Lm9wZW5FbmRlZCx0LnRoZXRhU3RhcnQsdC50aGV0YUxlbmd0aCl9fWNsYXNzIHd1IGV4dGVuZHMgTW97Y29uc3RydWN0b3IodD0xLGU9MSxuPTMyLHI9MSxzPSExLG89MCxhPU1hdGguUEkqMil7c3VwZXIoMCx0LGUsbixyLHMsbyxhKSx0aGlzLnR5cGU9IkNvbmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnIsb3BlbkVuZGVkOnMsdGhldGFTdGFydDpvLHRoZXRhTGVuZ3RoOmF9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHd1KHQucmFkaXVzLHQuaGVpZ2h0LHQucmFkaWFsU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyx0Lm9wZW5FbmRlZCx0LnRoZXRhU3RhcnQsdC50aGV0YUxlbmd0aCl9fWNsYXNzIEVyIGV4dGVuZHMgRnR7Y29uc3RydWN0b3IodD1bXSxlPVtdLG49MSxyPTApe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5aGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17dmVydGljZXM6dCxpbmRpY2VzOmUscmFkaXVzOm4sZGV0YWlsOnJ9O2NvbnN0IHM9W10sbz1bXTthKHIpLGMobiksdSgpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdChzLnNsaWNlKCksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IE10KG8sMikpLHI9PT0wP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtmdW5jdGlvbiBhKHYpe2NvbnN0IHg9bmV3IFIsXz1uZXcgUixNPW5ldyBSO2ZvcihsZXQgYj0wO2I8ZS5sZW5ndGg7Yis9MylkKGVbYiswXSx4KSxkKGVbYisxXSxfKSxkKGVbYisyXSxNKSxsKHgsXyxNLHYpfWZ1bmN0aW9uIGwodix4LF8sTSl7Y29uc3QgYj1NKzEsQT1bXTtmb3IobGV0IEU9MDtFPD1iO0UrKyl7QVtFXT1bXTtjb25zdCB3PXYuY2xvbmUoKS5sZXJwKF8sRS9iKSxTPXguY2xvbmUoKS5sZXJwKF8sRS9iKSxUPWItRTtmb3IobGV0IEQ9MDtEPD1UO0QrKylEPT09MCYmRT09PWI/QVtFXVtEXT13OkFbRV1bRF09dy5jbG9uZSgpLmxlcnAoUyxEL1QpfWZvcihsZXQgRT0wO0U8YjtFKyspZm9yKGxldCB3PTA7dzwyKihiLUUpLTE7dysrKXtjb25zdCBTPU1hdGguZmxvb3Iody8yKTt3JTI9PT0wPyhmKEFbRV1bUysxXSksZihBW0UrMV1bU10pLGYoQVtFXVtTXSkpOihmKEFbRV1bUysxXSksZihBW0UrMV1bUysxXSksZihBW0UrMV1bU10pKX19ZnVuY3Rpb24gYyh2KXtjb25zdCB4PW5ldyBSO2ZvcihsZXQgXz0wO188cy5sZW5ndGg7Xys9Myl4Lng9c1tfKzBdLHgueT1zW18rMV0seC56PXNbXysyXSx4Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHYpLHNbXyswXT14Lngsc1tfKzFdPXgueSxzW18rMl09eC56fWZ1bmN0aW9uIHUoKXtjb25zdCB2PW5ldyBSO2ZvcihsZXQgeD0wO3g8cy5sZW5ndGg7eCs9Myl7di54PXNbeCswXSx2Lnk9c1t4KzFdLHYuej1zW3grMl07Y29uc3QgXz1nKHYpLzIvTWF0aC5QSSsuNSxNPW0odikvTWF0aC5QSSsuNTtvLnB1c2goXywxLU0pfXAoKSxoKCl9ZnVuY3Rpb24gaCgpe2ZvcihsZXQgdj0wO3Y8by5sZW5ndGg7dis9Nil7Y29uc3QgeD1vW3YrMF0sXz1vW3YrMl0sTT1vW3YrNF0sYj1NYXRoLm1heCh4LF8sTSksQT1NYXRoLm1pbih4LF8sTSk7Yj4uOSYmQTwuMSYmKHg8LjImJihvW3YrMF0rPTEpLF88LjImJihvW3YrMl0rPTEpLE08LjImJihvW3YrNF0rPTEpKX19ZnVuY3Rpb24gZih2KXtzLnB1c2godi54LHYueSx2LnopfWZ1bmN0aW9uIGQodix4KXtjb25zdCBfPXYqMzt4Lng9dFtfKzBdLHgueT10W18rMV0seC56PXRbXysyXX1mdW5jdGlvbiBwKCl7Y29uc3Qgdj1uZXcgUix4PW5ldyBSLF89bmV3IFIsTT1uZXcgUixiPW5ldyBYLEE9bmV3IFgsRT1uZXcgWDtmb3IobGV0IHc9MCxTPTA7dzxzLmxlbmd0aDt3Kz05LFMrPTYpe3Yuc2V0KHNbdyswXSxzW3crMV0sc1t3KzJdKSx4LnNldChzW3crM10sc1t3KzRdLHNbdys1XSksXy5zZXQoc1t3KzZdLHNbdys3XSxzW3crOF0pLGIuc2V0KG9bUyswXSxvW1MrMV0pLEEuc2V0KG9bUysyXSxvW1MrM10pLEUuc2V0KG9bUys0XSxvW1MrNV0pLE0uY29weSh2KS5hZGQoeCkuYWRkKF8pLmRpdmlkZVNjYWxhcigzKTtjb25zdCBUPWcoTSk7eShiLFMrMCx2LFQpLHkoQSxTKzIseCxUKSx5KEUsUys0LF8sVCl9fWZ1bmN0aW9uIHkodix4LF8sTSl7TTwwJiZ2Lng9PT0xJiYob1t4XT12LngtMSksXy54PT09MCYmXy56PT09MCYmKG9beF09TS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIGcodil7cmV0dXJuIE1hdGguYXRhbjIodi56LC12LngpfWZ1bmN0aW9uIG0odil7cmV0dXJuIE1hdGguYXRhbjIoLXYueSxNYXRoLnNxcnQodi54KnYueCt2Lnoqdi56KSl9fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEVyKHQudmVydGljZXMsdC5pbmRpY2VzLHQucmFkaXVzLHQuZGV0YWlscyl9fWNsYXNzIEF1IGV4dGVuZHMgRXJ7Y29uc3RydWN0b3IodD0xLGU9MCl7Y29uc3Qgbj0oMStNYXRoLnNxcnQoNSkpLzIscj0xL24scz1bLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtciwtbiwwLC1yLG4sMCxyLC1uLDAscixuLC1yLC1uLDAsLXIsbiwwLHIsLW4sMCxyLG4sMCwtbiwwLC1yLG4sMCwtciwtbiwwLHIsbiwwLHJdLG89WzMsMTEsNywzLDcsMTUsMywxNSwxMyw3LDE5LDE3LDcsMTcsNiw3LDYsMTUsMTcsNCw4LDE3LDgsMTAsMTcsMTAsNiw4LDAsMTYsOCwxNiwyLDgsMiwxMCwwLDEyLDEsMCwxLDE4LDAsMTgsMTYsNiwxMCwyLDYsMiwxMyw2LDEzLDE1LDIsMTYsMTgsMiwxOCwzLDIsMywxMywxOCwxLDksMTgsOSwxMSwxOCwxMSwzLDQsMTQsMTIsNCwxMiwwLDQsMCw4LDExLDksNSwxMSw1LDE5LDExLDE5LDcsMTksNSwxNCwxOSwxNCw0LDE5LDQsMTcsMSwxMiwxNCwxLDE0LDUsMSw1LDldO3N1cGVyKHMsbyx0LGUpLHRoaXMudHlwZT0iRG9kZWNhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEF1KHQucmFkaXVzLHQuZGV0YWlsKX19Y29uc3QgRXU9bmV3IFIsVHU9bmV3IFIsbHA9bmV3IFIsQ3U9bmV3IF9lO2NsYXNzIFNfIGV4dGVuZHMgRnR7Y29uc3RydWN0b3IodD1udWxsLGU9MSl7aWYoc3VwZXIoKSx0aGlzLnR5cGU9IkVkZ2VzR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17Z2VvbWV0cnk6dCx0aHJlc2hvbGRBbmdsZTplfSx0IT09bnVsbCl7Y29uc3Qgcj1NYXRoLnBvdygxMCw0KSxzPU1hdGguY29zKFFyKmUpLG89dC5nZXRJbmRleCgpLGE9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksbD1vP28uY291bnQ6YS5jb3VudCxjPVswLDAsMF0sdT1bImEiLCJiIiwiYyJdLGg9bmV3IEFycmF5KDMpLGY9e30sZD1bXTtmb3IobGV0IHA9MDtwPGw7cCs9Myl7bz8oY1swXT1vLmdldFgocCksY1sxXT1vLmdldFgocCsxKSxjWzJdPW8uZ2V0WChwKzIpKTooY1swXT1wLGNbMV09cCsxLGNbMl09cCsyKTtjb25zdHthOnksYjpnLGM6bX09Q3U7aWYoeS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsY1swXSksZy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsY1sxXSksbS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsY1syXSksQ3UuZ2V0Tm9ybWFsKGxwKSxoWzBdPWAke01hdGgucm91bmQoeS54KnIpfSwke01hdGgucm91bmQoeS55KnIpfSwke01hdGgucm91bmQoeS56KnIpfWAsaFsxXT1gJHtNYXRoLnJvdW5kKGcueCpyKX0sJHtNYXRoLnJvdW5kKGcueSpyKX0sJHtNYXRoLnJvdW5kKGcueipyKX1gLGhbMl09YCR7TWF0aC5yb3VuZChtLngqcil9LCR7TWF0aC5yb3VuZChtLnkqcil9LCR7TWF0aC5yb3VuZChtLnoqcil9YCwhKGhbMF09PT1oWzFdfHxoWzFdPT09aFsyXXx8aFsyXT09PWhbMF0pKWZvcihsZXQgdj0wO3Y8Mzt2Kyspe2NvbnN0IHg9KHYrMSklMyxfPWhbdl0sTT1oW3hdLGI9Q3VbdVt2XV0sQT1DdVt1W3hdXSxFPWAke199XyR7TX1gLHc9YCR7TX1fJHtffWA7dyBpbiBmJiZmW3ddPyhscC5kb3QoZlt3XS5ub3JtYWwpPD1zJiYoZC5wdXNoKGIueCxiLnksYi56KSxkLnB1c2goQS54LEEueSxBLnopKSxmW3ddPW51bGwpOkUgaW4gZnx8KGZbRV09e2luZGV4MDpjW3ZdLGluZGV4MTpjW3hdLG5vcm1hbDpscC5jbG9uZSgpfSl9fWZvcihjb25zdCBwIGluIGYpaWYoZltwXSl7Y29uc3R7aW5kZXgwOnksaW5kZXgxOmd9PWZbcF07RXUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLHkpLFR1LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxnKSxkLnB1c2goRXUueCxFdS55LEV1LnopLGQucHVzaChUdS54LFR1LnksVHUueil9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQoZCwzKSl9fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfX1jbGFzcyBKaSBleHRlbmRzIEdhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMudXVpZD1ObigpLHRoaXMudHlwZT0iU2hhcGUiLHRoaXMuaG9sZXM9W119Z2V0UG9pbnRzSG9sZXModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxyPXRoaXMuaG9sZXMubGVuZ3RoO248cjtuKyspZVtuXT10aGlzLmhvbGVzW25dLmdldFBvaW50cyh0KTtyZXR1cm4gZX1leHRyYWN0UG9pbnRzKHQpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyh0KSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKHQpfX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2goci5jbG9uZSgpKX1yZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QudXVpZD10aGlzLnV1aWQsdC5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXRoaXMuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dGhpcy5ob2xlc1tlXTt0LmhvbGVzLnB1c2goci50b0pTT04oKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy51dWlkPXQudXVpZCx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dC5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10LmhvbGVzW2VdO3RoaXMuaG9sZXMucHVzaChuZXcgR2EoKS5mcm9tSlNPTihyKSl9cmV0dXJuIHRoaXN9fWNvbnN0IHhFPXt0cmlhbmd1bGF0ZTpmdW5jdGlvbihpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHI9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHM9TV8oaSwwLHIsZSwhMCk7Y29uc3Qgbz1bXTtpZighc3x8cy5uZXh0PT09cy5wcmV2KXJldHVybiBvO2xldCBhLGwsYyx1LGgsZixkO2lmKG4mJihzPXdFKGksdCxzLGUpKSxpLmxlbmd0aD44MCplKXthPWM9aVswXSxsPXU9aVsxXTtmb3IobGV0IHA9ZTtwPHI7cCs9ZSloPWlbcF0sZj1pW3ArMV0saDxhJiYoYT1oKSxmPGwmJihsPWYpLGg+YyYmKGM9aCksZj51JiYodT1mKTtkPU1hdGgubWF4KGMtYSx1LWwpLGQ9ZCE9PTA/MzI3NjcvZDowfXJldHVybiBXYShzLG8sZSxhLGwsZCwwKSxvfX07ZnVuY3Rpb24gTV8oaSx0LGUsbixyKXtsZXQgcyxvO2lmKHI9PT1ORShpLHQsZSxuKT4wKWZvcihzPXQ7czxlO3MrPW4pbz1BXyhzLGlbc10saVtzKzFdLG8pO2Vsc2UgZm9yKHM9ZS1uO3M+PXQ7cy09bilvPUFfKHMsaVtzXSxpW3MrMV0sbyk7cmV0dXJuIG8mJlJ1KG8sby5uZXh0KSYmKFhhKG8pLG89by5uZXh0KSxvfWZ1bmN0aW9uIGNzKGksdCl7aWYoIWkpcmV0dXJuIGk7dHx8KHQ9aSk7bGV0IGU9aSxuO2RvIGlmKG49ITEsIWUuc3RlaW5lciYmKFJ1KGUsZS5uZXh0KXx8d2UoZS5wcmV2LGUsZS5uZXh0KT09PTApKXtpZihYYShlKSxlPXQ9ZS5wcmV2LGU9PT1lLm5leHQpYnJlYWs7bj0hMH1lbHNlIGU9ZS5uZXh0O3doaWxlKG58fGUhPT10KTtyZXR1cm4gdH1mdW5jdGlvbiBXYShpLHQsZSxuLHIscyxvKXtpZighaSlyZXR1cm47IW8mJnMmJlJFKGksbixyLHMpO2xldCBhPWksbCxjO2Zvcig7aS5wcmV2IT09aS5uZXh0Oyl7aWYobD1pLnByZXYsYz1pLm5leHQscz9TRShpLG4scixzKTp2RShpKSl7dC5wdXNoKGwuaS9lfDApLHQucHVzaChpLmkvZXwwKSx0LnB1c2goYy5pL2V8MCksWGEoaSksaT1jLm5leHQsYT1jLm5leHQ7Y29udGludWV9aWYoaT1jLGk9PT1hKXtvP289PT0xPyhpPU1FKGNzKGkpLHQsZSksV2EoaSx0LGUsbixyLHMsMikpOm89PT0yJiZiRShpLHQsZSxuLHIscyk6V2EoY3MoaSksdCxlLG4scixzLDEpO2JyZWFrfX19ZnVuY3Rpb24gdkUoaSl7Y29uc3QgdD1pLnByZXYsZT1pLG49aS5uZXh0O2lmKHdlKHQsZSxuKT49MClyZXR1cm4hMTtjb25zdCByPXQueCxzPWUueCxvPW4ueCxhPXQueSxsPWUueSxjPW4ueSx1PXI8cz9yPG8/cjpvOnM8bz9zOm8saD1hPGw/YTxjP2E6YzpsPGM/bDpjLGY9cj5zP3I+bz9yOm86cz5vP3M6byxkPWE+bD9hPmM/YTpjOmw+Yz9sOmM7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PXUmJnAueDw9ZiYmcC55Pj1oJiZwLnk8PWQmJmJvKHIsYSxzLGwsbyxjLHAueCxwLnkpJiZ3ZShwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIFNFKGksdCxlLG4pe2NvbnN0IHI9aS5wcmV2LHM9aSxvPWkubmV4dDtpZih3ZShyLHMsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1yLngsbD1zLngsYz1vLngsdT1yLnksaD1zLnksZj1vLnksZD1hPGw/YTxjP2E6YzpsPGM/bDpjLHA9dTxoP3U8Zj91OmY6aDxmP2g6Zix5PWE+bD9hPmM/YTpjOmw+Yz9sOmMsZz11Pmg/dT5mP3U6ZjpoPmY/aDpmLG09Y3AoZCxwLHQsZSxuKSx2PWNwKHksZyx0LGUsbik7bGV0IHg9aS5wcmV2WixfPWkubmV4dFo7Zm9yKDt4JiZ4Lno+PW0mJl8mJl8uejw9djspe2lmKHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9ZyYmeCE9PXImJnghPT1vJiZibyhhLHUsbCxoLGMsZix4LngseC55KSYmd2UoeC5wcmV2LHgseC5uZXh0KT49MHx8KHg9eC5wcmV2WixfLng+PWQmJl8ueDw9eSYmXy55Pj1wJiZfLnk8PWcmJl8hPT1yJiZfIT09byYmYm8oYSx1LGwsaCxjLGYsXy54LF8ueSkmJndlKF8ucHJldixfLF8ubmV4dCk+PTApKXJldHVybiExO189Xy5uZXh0Wn1mb3IoO3gmJnguej49bTspe2lmKHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9ZyYmeCE9PXImJnghPT1vJiZibyhhLHUsbCxoLGMsZix4LngseC55KSYmd2UoeC5wcmV2LHgseC5uZXh0KT49MClyZXR1cm4hMTt4PXgucHJldlp9Zm9yKDtfJiZfLno8PXY7KXtpZihfLng+PWQmJl8ueDw9eSYmXy55Pj1wJiZfLnk8PWcmJl8hPT1yJiZfIT09byYmYm8oYSx1LGwsaCxjLGYsXy54LF8ueSkmJndlKF8ucHJldixfLF8ubmV4dCk+PTApcmV0dXJuITE7Xz1fLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIE1FKGksdCxlKXtsZXQgbj1pO2Rve2NvbnN0IHI9bi5wcmV2LHM9bi5uZXh0Lm5leHQ7IVJ1KHIscykmJmJfKHIsbixuLm5leHQscykmJiRhKHIscykmJiRhKHMscikmJih0LnB1c2goci5pL2V8MCksdC5wdXNoKG4uaS9lfDApLHQucHVzaChzLmkvZXwwKSxYYShuKSxYYShuLm5leHQpLG49aT1zKSxuPW4ubmV4dH13aGlsZShuIT09aSk7cmV0dXJuIGNzKG4pfWZ1bmN0aW9uIGJFKGksdCxlLG4scixzKXtsZXQgbz1pO2Rve2xldCBhPW8ubmV4dC5uZXh0O2Zvcig7YSE9PW8ucHJldjspe2lmKG8uaSE9PWEuaSYmTEUobyxhKSl7bGV0IGw9d18obyxhKTtvPWNzKG8sby5uZXh0KSxsPWNzKGwsbC5uZXh0KSxXYShvLHQsZSxuLHIscywwKSxXYShsLHQsZSxuLHIscywwKTtyZXR1cm59YT1hLm5leHR9bz1vLm5leHR9d2hpbGUobyE9PWkpfWZ1bmN0aW9uIHdFKGksdCxlLG4pe2NvbnN0IHI9W107bGV0IHMsbyxhLGwsYztmb3Iocz0wLG89dC5sZW5ndGg7czxvO3MrKylhPXRbc10qbixsPXM8by0xP3RbcysxXSpuOmkubGVuZ3RoLGM9TV8oaSxhLGwsbiwhMSksYz09PWMubmV4dCYmKGMuc3RlaW5lcj0hMCksci5wdXNoKElFKGMpKTtmb3Ioci5zb3J0KEFFKSxzPTA7czxyLmxlbmd0aDtzKyspZT1FRShyW3NdLGUpO3JldHVybiBlfWZ1bmN0aW9uIEFFKGksdCl7cmV0dXJuIGkueC10Lnh9ZnVuY3Rpb24gRUUoaSx0KXtjb25zdCBlPVRFKGksdCk7aWYoIWUpcmV0dXJuIHQ7Y29uc3Qgbj13XyhlLGkpO3JldHVybiBjcyhuLG4ubmV4dCksY3MoZSxlLm5leHQpfWZ1bmN0aW9uIFRFKGksdCl7bGV0IGU9dCxuPS0xLzAscjtjb25zdCBzPWkueCxvPWkueTtkb3tpZihvPD1lLnkmJm8+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7Y29uc3QgZj1lLngrKG8tZS55KSooZS5uZXh0LngtZS54KS8oZS5uZXh0LnktZS55KTtpZihmPD1zJiZmPm4mJihuPWYscj1lLng8ZS5uZXh0Lng/ZTplLm5leHQsZj09PXMpKXJldHVybiByfWU9ZS5uZXh0fXdoaWxlKGUhPT10KTtpZighcilyZXR1cm4gbnVsbDtjb25zdCBhPXIsbD1yLngsYz1yLnk7bGV0IHU9MS8wLGg7ZT1yO2RvIHM+PWUueCYmZS54Pj1sJiZzIT09ZS54JiZibyhvPGM/czpuLG8sbCxjLG88Yz9uOnMsbyxlLngsZS55KSYmKGg9TWF0aC5hYnMoby1lLnkpLyhzLWUueCksJGEoZSxpKSYmKGg8dXx8aD09PXUmJihlLng+ci54fHxlLng9PT1yLngmJkNFKHIsZSkpKSYmKHI9ZSx1PWgpKSxlPWUubmV4dDt3aGlsZShlIT09YSk7cmV0dXJuIHJ9ZnVuY3Rpb24gQ0UoaSx0KXtyZXR1cm4gd2UoaS5wcmV2LGksdC5wcmV2KTwwJiZ3ZSh0Lm5leHQsaSxpLm5leHQpPDB9ZnVuY3Rpb24gUkUoaSx0LGUsbil7bGV0IHI9aTtkbyByLno9PT0wJiYoci56PWNwKHIueCxyLnksdCxlLG4pKSxyLnByZXZaPXIucHJldixyLm5leHRaPXIubmV4dCxyPXIubmV4dDt3aGlsZShyIT09aSk7ci5wcmV2Wi5uZXh0Wj1udWxsLHIucHJldlo9bnVsbCxQRShyKX1mdW5jdGlvbiBQRShpKXtsZXQgdCxlLG4scixzLG8sYSxsLGM9MTtkb3tmb3IoZT1pLGk9bnVsbCxzPW51bGwsbz0wO2U7KXtmb3IobysrLG49ZSxhPTAsdD0wO3Q8YyYmKGErKyxuPW4ubmV4dFosISFuKTt0KyspO2ZvcihsPWM7YT4wfHxsPjAmJm47KWEhPT0wJiYobD09PTB8fCFufHxlLno8PW4ueik/KHI9ZSxlPWUubmV4dFosYS0tKToocj1uLG49bi5uZXh0WixsLS0pLHM/cy5uZXh0Wj1yOmk9cixyLnByZXZaPXMscz1yO2U9bn1zLm5leHRaPW51bGwsYyo9Mn13aGlsZShvPjEpO3JldHVybiBpfWZ1bmN0aW9uIGNwKGksdCxlLG4scil7cmV0dXJuIGk9KGktZSkqcnwwLHQ9KHQtbikqcnwwLGk9KGl8aTw8OCkmMTY3MTE5MzUsaT0oaXxpPDw0KSYyNTI2NDUxMzUsaT0oaXxpPDwyKSY4NTg5OTM0NTksaT0oaXxpPDwxKSYxNDMxNjU1NzY1LHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LGl8dDw8MX1mdW5jdGlvbiBJRShpKXtsZXQgdD1pLGU9aTtkbyh0Lng8ZS54fHx0Lng9PT1lLngmJnQueTxlLnkpJiYoZT10KSx0PXQubmV4dDt3aGlsZSh0IT09aSk7cmV0dXJuIGV9ZnVuY3Rpb24gYm8oaSx0LGUsbixyLHMsbyxhKXtyZXR1cm4oci1vKSoodC1hKT49KGktbykqKHMtYSkmJihpLW8pKihuLWEpPj0oZS1vKSoodC1hKSYmKGUtbykqKHMtYSk+PShyLW8pKihuLWEpfWZ1bmN0aW9uIExFKGksdCl7cmV0dXJuIGkubmV4dC5pIT09dC5pJiZpLnByZXYuaSE9PXQuaSYmIURFKGksdCkmJigkYShpLHQpJiYkYSh0LGkpJiZVRShpLHQpJiYod2UoaS5wcmV2LGksdC5wcmV2KXx8d2UoaSx0LnByZXYsdCkpfHxSdShpLHQpJiZ3ZShpLnByZXYsaSxpLm5leHQpPjAmJndlKHQucHJldix0LHQubmV4dCk+MCl9ZnVuY3Rpb24gd2UoaSx0LGUpe3JldHVybih0LnktaS55KSooZS54LXQueCktKHQueC1pLngpKihlLnktdC55KX1mdW5jdGlvbiBSdShpLHQpe3JldHVybiBpLng9PT10LngmJmkueT09PXQueX1mdW5jdGlvbiBiXyhpLHQsZSxuKXtjb25zdCByPUl1KHdlKGksdCxlKSkscz1JdSh3ZShpLHQsbikpLG89SXUod2UoZSxuLGkpKSxhPUl1KHdlKGUsbix0KSk7cmV0dXJuISEociE9PXMmJm8hPT1hfHxyPT09MCYmUHUoaSxlLHQpfHxzPT09MCYmUHUoaSxuLHQpfHxvPT09MCYmUHUoZSxpLG4pfHxhPT09MCYmUHUoZSx0LG4pKX1mdW5jdGlvbiBQdShpLHQsZSl7cmV0dXJuIHQueDw9TWF0aC5tYXgoaS54LGUueCkmJnQueD49TWF0aC5taW4oaS54LGUueCkmJnQueTw9TWF0aC5tYXgoaS55LGUueSkmJnQueT49TWF0aC5taW4oaS55LGUueSl9ZnVuY3Rpb24gSXUoaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfWZ1bmN0aW9uIERFKGksdCl7bGV0IGU9aTtkb3tpZihlLmkhPT1pLmkmJmUubmV4dC5pIT09aS5pJiZlLmkhPT10LmkmJmUubmV4dC5pIT09dC5pJiZiXyhlLGUubmV4dCxpLHQpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4hMX1mdW5jdGlvbiAkYShpLHQpe3JldHVybiB3ZShpLnByZXYsaSxpLm5leHQpPDA/d2UoaSx0LGkubmV4dCk+PTAmJndlKGksaS5wcmV2LHQpPj0wOndlKGksdCxpLnByZXYpPDB8fHdlKGksaS5uZXh0LHQpPDB9ZnVuY3Rpb24gVUUoaSx0KXtsZXQgZT1pLG49ITE7Y29uc3Qgcj0oaS54K3QueCkvMixzPShpLnkrdC55KS8yO2RvIGUueT5zIT1lLm5leHQueT5zJiZlLm5leHQueSE9PWUueSYmcjwoZS5uZXh0LngtZS54KSoocy1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKG49IW4pLGU9ZS5uZXh0O3doaWxlKGUhPT1pKTtyZXR1cm4gbn1mdW5jdGlvbiB3XyhpLHQpe2NvbnN0IGU9bmV3IHVwKGkuaSxpLngsaS55KSxuPW5ldyB1cCh0LmksdC54LHQueSkscj1pLm5leHQscz10LnByZXY7cmV0dXJuIGkubmV4dD10LHQucHJldj1pLGUubmV4dD1yLHIucHJldj1lLG4ubmV4dD1lLGUucHJldj1uLHMubmV4dD1uLG4ucHJldj1zLG59ZnVuY3Rpb24gQV8oaSx0LGUsbil7Y29uc3Qgcj1uZXcgdXAoaSx0LGUpO3JldHVybiBuPyhyLm5leHQ9bi5uZXh0LHIucHJldj1uLG4ubmV4dC5wcmV2PXIsbi5uZXh0PXIpOihyLnByZXY9cixyLm5leHQ9cikscn1mdW5jdGlvbiBYYShpKXtpLm5leHQucHJldj1pLnByZXYsaS5wcmV2Lm5leHQ9aS5uZXh0LGkucHJldlomJihpLnByZXZaLm5leHRaPWkubmV4dFopLGkubmV4dFomJihpLm5leHRaLnByZXZaPWkucHJldlopfWZ1bmN0aW9uIHVwKGksdCxlKXt0aGlzLmk9aSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLno9MCx0aGlzLnByZXZaPW51bGwsdGhpcy5uZXh0Wj1udWxsLHRoaXMuc3RlaW5lcj0hMX1mdW5jdGlvbiBORShpLHQsZSxuKXtsZXQgcj0wO2ZvcihsZXQgcz10LG89ZS1uO3M8ZTtzKz1uKXIrPShpW29dLWlbc10pKihpW3MrMV0raVtvKzFdKSxvPXM7cmV0dXJuIHJ9Y2xhc3Mgem57c3RhdGljIGFyZWEodCl7Y29uc3QgZT10Lmxlbmd0aDtsZXQgbj0wO2ZvcihsZXQgcj1lLTEscz0wO3M8ZTtyPXMrKyluKz10W3JdLngqdFtzXS55LXRbc10ueCp0W3JdLnk7cmV0dXJuIG4qLjV9c3RhdGljIGlzQ2xvY2tXaXNlKHQpe3JldHVybiB6bi5hcmVhKHQpPDB9c3RhdGljIHRyaWFuZ3VsYXRlU2hhcGUodCxlKXtjb25zdCBuPVtdLHI9W10scz1bXTtFXyh0KSxUXyhuLHQpO2xldCBvPXQubGVuZ3RoO2UuZm9yRWFjaChFXyk7Zm9yKGxldCBsPTA7bDxlLmxlbmd0aDtsKyspci5wdXNoKG8pLG8rPWVbbF0ubGVuZ3RoLFRfKG4sZVtsXSk7Y29uc3QgYT14RS50cmlhbmd1bGF0ZShuLHIpO2ZvcihsZXQgbD0wO2w8YS5sZW5ndGg7bCs9MylzLnB1c2goYS5zbGljZShsLGwrMykpO3JldHVybiBzfX1mdW5jdGlvbiBFXyhpKXtjb25zdCB0PWkubGVuZ3RoO3Q+MiYmaVt0LTFdLmVxdWFscyhpWzBdKSYmaS5wb3AoKX1mdW5jdGlvbiBUXyhpLHQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWkucHVzaCh0W2VdLngpLGkucHVzaCh0W2VdLnkpfWxldCBDXz1jbGFzcyBidyBleHRlbmRzIEZ0e2NvbnN0cnVjdG9yKHQ9bmV3IEppKFtuZXcgWCguNSwuNSksbmV3IFgoLS41LC41KSxuZXcgWCgtLjUsLS41KSxuZXcgWCguNSwtLjUpXSksZT17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxvcHRpb25zOmV9LHQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtjb25zdCBuPXRoaXMscj1bXSxzPVtdO2ZvcihsZXQgYT0wLGw9dC5sZW5ndGg7YTxsO2ErKyl7Y29uc3QgYz10W2FdO28oYyl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQociwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgTXQocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIG8oYSl7Y29uc3QgbD1bXSxjPWUuY3VydmVTZWdtZW50cyE9PXZvaWQgMD9lLmN1cnZlU2VnbWVudHM6MTIsdT1lLnN0ZXBzIT09dm9pZCAwP2Uuc3RlcHM6MSxoPWUuZGVwdGghPT12b2lkIDA/ZS5kZXB0aDoxO2xldCBmPWUuYmV2ZWxFbmFibGVkIT09dm9pZCAwP2UuYmV2ZWxFbmFibGVkOiEwLGQ9ZS5iZXZlbFRoaWNrbmVzcyE9PXZvaWQgMD9lLmJldmVsVGhpY2tuZXNzOi4yLHA9ZS5iZXZlbFNpemUhPT12b2lkIDA/ZS5iZXZlbFNpemU6ZC0uMSx5PWUuYmV2ZWxPZmZzZXQhPT12b2lkIDA/ZS5iZXZlbE9mZnNldDowLGc9ZS5iZXZlbFNlZ21lbnRzIT09dm9pZCAwP2UuYmV2ZWxTZWdtZW50czozO2NvbnN0IG09ZS5leHRydWRlUGF0aCx2PWUuVVZHZW5lcmF0b3IhPT12b2lkIDA/ZS5VVkdlbmVyYXRvcjpGRTtsZXQgeCxfPSExLE0sYixBLEU7bSYmKHg9bS5nZXRTcGFjZWRQb2ludHModSksXz0hMCxmPSExLE09bS5jb21wdXRlRnJlbmV0RnJhbWVzKHUsITEpLGI9bmV3IFIsQT1uZXcgUixFPW5ldyBSKSxmfHwoZz0wLGQ9MCxwPTAseT0wKTtjb25zdCB3PWEuZXh0cmFjdFBvaW50cyhjKTtsZXQgUz13LnNoYXBlO2NvbnN0IFQ9dy5ob2xlcztpZighem4uaXNDbG9ja1dpc2UoUykpe1M9Uy5yZXZlcnNlKCk7Zm9yKGxldCBudD0wLHN0PVQubGVuZ3RoO250PHN0O250Kyspe2NvbnN0IFU9VFtudF07em4uaXNDbG9ja1dpc2UoVSkmJihUW250XT1VLnJldmVyc2UoKSl9fWNvbnN0IEw9em4udHJpYW5ndWxhdGVTaGFwZShTLFQpLE49Uztmb3IobGV0IG50PTAsc3Q9VC5sZW5ndGg7bnQ8c3Q7bnQrKyl7Y29uc3QgVT1UW250XTtTPVMuY29uY2F0KFUpfWZ1bmN0aW9uIEYobnQsc3QsVSl7cmV0dXJuIHN0fHxjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdCIpLG50LmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKHN0LFUpfWNvbnN0IEI9Uy5sZW5ndGgsRz1MLmxlbmd0aDtmdW5jdGlvbiBrKG50LHN0LFUpe2xldCBDdCxvdCxTdDtjb25zdCBXPW50Lngtc3QueCxldD1udC55LXN0LnksWj1VLngtbnQueCxQPVUueS1udC55LEM9VypXK2V0KmV0LE89VypQLWV0Klo7aWYoTWF0aC5hYnMoTyk+TnVtYmVyLkVQU0lMT04pe2NvbnN0ICQ9TWF0aC5zcXJ0KEMpLHR0PU1hdGguc3FydChaKlorUCpQKSxKPXN0LngtZXQvJCxkdD1zdC55K1cvJCxmdD1VLngtUC90dCx5dD1VLnkrWi90dCxWdD0oKGZ0LUopKlAtKHl0LWR0KSpaKS8oVypQLWV0KlopO0N0PUorVypWdC1udC54LG90PWR0K2V0KlZ0LW50Lnk7Y29uc3QgYXQ9Q3QqQ3Qrb3Qqb3Q7aWYoYXQ8PTIpcmV0dXJuIG5ldyBYKEN0LG90KTtTdD1NYXRoLnNxcnQoYXQvMil9ZWxzZXtsZXQgJD0hMTtXPk51bWJlci5FUFNJTE9OP1o+TnVtYmVyLkVQU0lMT04mJigkPSEwKTpXPC1OdW1iZXIuRVBTSUxPTj9aPC1OdW1iZXIuRVBTSUxPTiYmKCQ9ITApOk1hdGguc2lnbihldCk9PT1NYXRoLnNpZ24oUCkmJigkPSEwKSwkPyhDdD0tZXQsb3Q9VyxTdD1NYXRoLnNxcnQoQykpOihDdD1XLG90PWV0LFN0PU1hdGguc3FydChDLzIpKX1yZXR1cm4gbmV3IFgoQ3QvU3Qsb3QvU3QpfWNvbnN0IFE9W107Zm9yKGxldCBudD0wLHN0PU4ubGVuZ3RoLFU9c3QtMSxDdD1udCsxO250PHN0O250KyssVSsrLEN0KyspVT09PXN0JiYoVT0wKSxDdD09PXN0JiYoQ3Q9MCksUVtudF09ayhOW250XSxOW1VdLE5bQ3RdKTtjb25zdCBjdD1bXTtsZXQgaHQsUHQ9US5jb25jYXQoKTtmb3IobGV0IG50PTAsc3Q9VC5sZW5ndGg7bnQ8c3Q7bnQrKyl7Y29uc3QgVT1UW250XTtodD1bXTtmb3IobGV0IEN0PTAsb3Q9VS5sZW5ndGgsU3Q9b3QtMSxXPUN0KzE7Q3Q8b3Q7Q3QrKyxTdCsrLFcrKylTdD09PW90JiYoU3Q9MCksVz09PW90JiYoVz0wKSxodFtDdF09ayhVW0N0XSxVW1N0XSxVW1ddKTtjdC5wdXNoKGh0KSxQdD1QdC5jb25jYXQoaHQpfWZvcihsZXQgbnQ9MDtudDxnO250Kyspe2NvbnN0IHN0PW50L2csVT1kKk1hdGguY29zKHN0Kk1hdGguUEkvMiksQ3Q9cCpNYXRoLnNpbihzdCpNYXRoLlBJLzIpK3k7Zm9yKGxldCBvdD0wLFN0PU4ubGVuZ3RoO290PFN0O290Kyspe2NvbnN0IFc9RihOW290XSxRW290XSxDdCk7dXQoVy54LFcueSwtVSl9Zm9yKGxldCBvdD0wLFN0PVQubGVuZ3RoO290PFN0O290Kyspe2NvbnN0IFc9VFtvdF07aHQ9Y3Rbb3RdO2ZvcihsZXQgZXQ9MCxaPVcubGVuZ3RoO2V0PFo7ZXQrKyl7Y29uc3QgUD1GKFdbZXRdLGh0W2V0XSxDdCk7dXQoUC54LFAueSwtVSl9fX1jb25zdCBYdD1wK3k7Zm9yKGxldCBudD0wO250PEI7bnQrKyl7Y29uc3Qgc3Q9Zj9GKFNbbnRdLFB0W250XSxYdCk6U1tudF07Xz8oQS5jb3B5KE0ubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoc3QueCksYi5jb3B5KE0uYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihzdC55KSxFLmNvcHkoeFswXSkuYWRkKEEpLmFkZChiKSx1dChFLngsRS55LEUueikpOnV0KHN0Lngsc3QueSwwKX1mb3IobGV0IG50PTE7bnQ8PXU7bnQrKylmb3IobGV0IHN0PTA7c3Q8QjtzdCsrKXtjb25zdCBVPWY/RihTW3N0XSxQdFtzdF0sWHQpOlNbc3RdO18/KEEuY29weShNLm5vcm1hbHNbbnRdKS5tdWx0aXBseVNjYWxhcihVLngpLGIuY29weShNLmJpbm9ybWFsc1tudF0pLm11bHRpcGx5U2NhbGFyKFUueSksRS5jb3B5KHhbbnRdKS5hZGQoQSkuYWRkKGIpLHV0KEUueCxFLnksRS56KSk6dXQoVS54LFUueSxoL3UqbnQpfWZvcihsZXQgbnQ9Zy0xO250Pj0wO250LS0pe2NvbnN0IHN0PW50L2csVT1kKk1hdGguY29zKHN0Kk1hdGguUEkvMiksQ3Q9cCpNYXRoLnNpbihzdCpNYXRoLlBJLzIpK3k7Zm9yKGxldCBvdD0wLFN0PU4ubGVuZ3RoO290PFN0O290Kyspe2NvbnN0IFc9RihOW290XSxRW290XSxDdCk7dXQoVy54LFcueSxoK1UpfWZvcihsZXQgb3Q9MCxTdD1ULmxlbmd0aDtvdDxTdDtvdCsrKXtjb25zdCBXPVRbb3RdO2h0PWN0W290XTtmb3IobGV0IGV0PTAsWj1XLmxlbmd0aDtldDxaO2V0Kyspe2NvbnN0IFA9RihXW2V0XSxodFtldF0sQ3QpO18/dXQoUC54LFAueSt4W3UtMV0ueSx4W3UtMV0ueCtVKTp1dChQLngsUC55LGgrVSl9fX1qKCkscnQoKTtmdW5jdGlvbiBqKCl7Y29uc3QgbnQ9ci5sZW5ndGgvMztpZihmKXtsZXQgc3Q9MCxVPUIqc3Q7Zm9yKGxldCBDdD0wO0N0PEc7Q3QrKyl7Y29uc3Qgb3Q9TFtDdF07THQob3RbMl0rVSxvdFsxXStVLG90WzBdK1UpfXN0PXUrZyoyLFU9QipzdDtmb3IobGV0IEN0PTA7Q3Q8RztDdCsrKXtjb25zdCBvdD1MW0N0XTtMdChvdFswXStVLG90WzFdK1Usb3RbMl0rVSl9fWVsc2V7Zm9yKGxldCBzdD0wO3N0PEc7c3QrKyl7Y29uc3QgVT1MW3N0XTtMdChVWzJdLFVbMV0sVVswXSl9Zm9yKGxldCBzdD0wO3N0PEc7c3QrKyl7Y29uc3QgVT1MW3N0XTtMdChVWzBdK0IqdSxVWzFdK0IqdSxVWzJdK0IqdSl9fW4uYWRkR3JvdXAobnQsci5sZW5ndGgvMy1udCwwKX1mdW5jdGlvbiBydCgpe2NvbnN0IG50PXIubGVuZ3RoLzM7bGV0IHN0PTA7RXQoTixzdCksc3QrPU4ubGVuZ3RoO2ZvcihsZXQgVT0wLEN0PVQubGVuZ3RoO1U8Q3Q7VSsrKXtjb25zdCBvdD1UW1VdO0V0KG90LHN0KSxzdCs9b3QubGVuZ3RofW4uYWRkR3JvdXAobnQsci5sZW5ndGgvMy1udCwxKX1mdW5jdGlvbiBFdChudCxzdCl7bGV0IFU9bnQubGVuZ3RoO2Zvcig7LS1VPj0wOyl7Y29uc3QgQ3Q9VTtsZXQgb3Q9VS0xO290PDAmJihvdD1udC5sZW5ndGgtMSk7Zm9yKGxldCBTdD0wLFc9dStnKjI7U3Q8VztTdCsrKXtjb25zdCBldD1CKlN0LFo9QiooU3QrMSksUD1zdCtDdCtldCxDPXN0K290K2V0LE89c3Qrb3QrWiwkPXN0K0N0K1o7T3QoUCxDLE8sJCl9fX1mdW5jdGlvbiB1dChudCxzdCxVKXtsLnB1c2gobnQpLGwucHVzaChzdCksbC5wdXNoKFUpfWZ1bmN0aW9uIEx0KG50LHN0LFUpe0l0KG50KSxJdChzdCksSXQoVSk7Y29uc3QgQ3Q9ci5sZW5ndGgvMyxvdD12LmdlbmVyYXRlVG9wVVYobixyLEN0LTMsQ3QtMixDdC0xKTt0ZShvdFswXSksdGUob3RbMV0pLHRlKG90WzJdKX1mdW5jdGlvbiBPdChudCxzdCxVLEN0KXtJdChudCksSXQoc3QpLEl0KEN0KSxJdChzdCksSXQoVSksSXQoQ3QpO2NvbnN0IG90PXIubGVuZ3RoLzMsU3Q9di5nZW5lcmF0ZVNpZGVXYWxsVVYobixyLG90LTYsb3QtMyxvdC0yLG90LTEpO3RlKFN0WzBdKSx0ZShTdFsxXSksdGUoU3RbM10pLHRlKFN0WzFdKSx0ZShTdFsyXSksdGUoU3RbM10pfWZ1bmN0aW9uIEl0KG50KXtyLnB1c2gobFtudCozKzBdKSxyLnB1c2gobFtudCozKzFdKSxyLnB1c2gobFtudCozKzJdKX1mdW5jdGlvbiB0ZShudCl7cy5wdXNoKG50LngpLHMucHVzaChudC55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIEJFKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcz0wLG89dC5zaGFwZXMubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tzXV07bi5wdXNoKGEpfWNvbnN0IHI9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiByIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBTdVtyLnR5cGVdKCkuZnJvbUpTT04ocikpLG5ldyBidyhuLHQub3B0aW9ucyl9fTtjb25zdCBGRT17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihpLHQsZSxuLHIpe2NvbnN0IHM9dFtlKjNdLG89dFtlKjMrMV0sYT10W24qM10sbD10W24qMysxXSxjPXRbciozXSx1PXRbciozKzFdO3JldHVybltuZXcgWChzLG8pLG5ldyBYKGEsbCksbmV3IFgoYyx1KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihpLHQsZSxuLHIscyl7Y29uc3Qgbz10W2UqM10sYT10W2UqMysxXSxsPXRbZSozKzJdLGM9dFtuKjNdLHU9dFtuKjMrMV0saD10W24qMysyXSxmPXRbciozXSxkPXRbciozKzFdLHA9dFtyKjMrMl0seT10W3MqM10sZz10W3MqMysxXSxtPXRbcyozKzJdO3JldHVybiBNYXRoLmFicyhhLXUpPE1hdGguYWJzKG8tYyk/W25ldyBYKG8sMS1sKSxuZXcgWChjLDEtaCksbmV3IFgoZiwxLXApLG5ldyBYKHksMS1tKV06W25ldyBYKGEsMS1sKSxuZXcgWCh1LDEtaCksbmV3IFgoZCwxLXApLG5ldyBYKGcsMS1tKV19fTtmdW5jdGlvbiBCRShpLHQsZSl7aWYoZS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IG49MCxyPWkubGVuZ3RoO248cjtuKyspe2NvbnN0IHM9aVtuXTtlLnNoYXBlcy5wdXNoKHMudXVpZCl9ZWxzZSBlLnNoYXBlcy5wdXNoKGkudXVpZCk7cmV0dXJuIGUub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHQpLHQuZXh0cnVkZVBhdGghPT12b2lkIDAmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9dC5leHRydWRlUGF0aC50b0pTT04oKSksZX1jbGFzcyBMdSBleHRlbmRzIEVye2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49KDErTWF0aC5zcXJ0KDUpKS8yLHI9Wy0xLG4sMCwxLG4sMCwtMSwtbiwwLDEsLW4sMCwwLC0xLG4sMCwxLG4sMCwtMSwtbiwwLDEsLW4sbiwwLC0xLG4sMCwxLC1uLDAsLTEsLW4sMCwxXSxzPVswLDExLDUsMCw1LDEsMCwxLDcsMCw3LDEwLDAsMTAsMTEsMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdO3N1cGVyKHIscyx0LGUpLHRoaXMudHlwZT0iSWNvc2FoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgTHUodC5yYWRpdXMsdC5kZXRhaWwpfX1jbGFzcyBxYSBleHRlbmRzIEVye2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49WzEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xXSxyPVswLDIsNCwwLDQsMywwLDMsNSwwLDUsMiwxLDIsNSwxLDUsMywxLDMsNCwxLDQsMl07c3VwZXIobixyLHQsZSksdGhpcy50eXBlPSJPY3RhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHFhKHQucmFkaXVzLHQuZGV0YWlsKX19Y2xhc3MgdXMgZXh0ZW5kcyBGdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxyPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnJ9O2NvbnN0IHM9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxsPU1hdGguZmxvb3IociksYz1hKzEsdT1sKzEsaD10L2EsZj1lL2wsZD1bXSxwPVtdLHk9W10sZz1bXTtmb3IobGV0IG09MDttPHU7bSsrKXtjb25zdCB2PW0qZi1vO2ZvcihsZXQgeD0wO3g8Yzt4Kyspe2NvbnN0IF89eCpoLXM7cC5wdXNoKF8sLXYsMCkseS5wdXNoKDAsMCwxKSxnLnB1c2goeC9hKSxnLnB1c2goMS1tL2wpfX1mb3IobGV0IG09MDttPGw7bSsrKWZvcihsZXQgdj0wO3Y8YTt2Kyspe2NvbnN0IHg9ditjKm0sXz12K2MqKG0rMSksTT12KzErYyoobSsxKSxiPXYrMStjKm07ZC5wdXNoKHgsXyxiKSxkLnB1c2goXyxNLGIpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IE10KHksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IE10KGcsMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHVzKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jbGFzcyBEdSBleHRlbmRzIEZ0e2NvbnN0cnVjdG9yKHQ9LjUsZT0xLG49MzIscj0xLHM9MCxvPU1hdGguUEkqMil7c3VwZXIoKSx0aGlzLnR5cGU9IlJpbmdHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtpbm5lclJhZGl1czp0LG91dGVyUmFkaXVzOmUsdGhldGFTZWdtZW50czpuLHBoaVNlZ21lbnRzOnIsdGhldGFTdGFydDpzLHRoZXRhTGVuZ3RoOm99LG49TWF0aC5tYXgoMyxuKSxyPU1hdGgubWF4KDEscik7Y29uc3QgYT1bXSxsPVtdLGM9W10sdT1bXTtsZXQgaD10O2NvbnN0IGY9KGUtdCkvcixkPW5ldyBSLHA9bmV3IFg7Zm9yKGxldCB5PTA7eTw9cjt5Kyspe2ZvcihsZXQgZz0wO2c8PW47ZysrKXtjb25zdCBtPXMrZy9uKm87ZC54PWgqTWF0aC5jb3MobSksZC55PWgqTWF0aC5zaW4obSksbC5wdXNoKGQueCxkLnksZC56KSxjLnB1c2goMCwwLDEpLHAueD0oZC54L2UrMSkvMixwLnk9KGQueS9lKzEpLzIsdS5wdXNoKHAueCxwLnkpfWgrPWZ9Zm9yKGxldCB5PTA7eTxyO3krKyl7Y29uc3QgZz15KihuKzEpO2ZvcihsZXQgbT0wO208bjttKyspe2NvbnN0IHY9bStnLHg9dixfPXYrbisxLE09dituKzIsYj12KzE7YS5wdXNoKHgsXyxiKSxhLnB1c2goXyxNLGIpfX10aGlzLnNldEluZGV4KGEpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdChjLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdCh1LDIpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBEdSh0LmlubmVyUmFkaXVzLHQub3V0ZXJSYWRpdXMsdC50aGV0YVNlZ21lbnRzLHQucGhpU2VnbWVudHMsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBVdSBleHRlbmRzIEZ0e2NvbnN0cnVjdG9yKHQ9bmV3IEppKFtuZXcgWCgwLC41KSxuZXcgWCgtLjUsLS41KSxuZXcgWCguNSwtLjUpXSksZT0xMil7c3VwZXIoKSx0aGlzLnR5cGU9IlNoYXBlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsY3VydmVTZWdtZW50czplfTtjb25zdCBuPVtdLHI9W10scz1bXSxvPVtdO2xldCBhPTAsbD0wO2lmKEFycmF5LmlzQXJyYXkodCk9PT0hMSljKHQpO2Vsc2UgZm9yKGxldCB1PTA7dTx0Lmxlbmd0aDt1KyspYyh0W3VdKSx0aGlzLmFkZEdyb3VwKGEsbCx1KSxhKz1sLGw9MDt0aGlzLnNldEluZGV4KG4pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KHIsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdChzLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdChvLDIpKTtmdW5jdGlvbiBjKHUpe2NvbnN0IGg9ci5sZW5ndGgvMyxmPXUuZXh0cmFjdFBvaW50cyhlKTtsZXQgZD1mLnNoYXBlO2NvbnN0IHA9Zi5ob2xlczt6bi5pc0Nsb2NrV2lzZShkKT09PSExJiYoZD1kLnJldmVyc2UoKSk7Zm9yKGxldCBnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXtjb25zdCB2PXBbZ107em4uaXNDbG9ja1dpc2Uodik9PT0hMCYmKHBbZ109di5yZXZlcnNlKCkpfWNvbnN0IHk9em4udHJpYW5ndWxhdGVTaGFwZShkLHApO2ZvcihsZXQgZz0wLG09cC5sZW5ndGg7ZzxtO2crKyl7Y29uc3Qgdj1wW2ddO2Q9ZC5jb25jYXQodil9Zm9yKGxldCBnPTAsbT1kLmxlbmd0aDtnPG07ZysrKXtjb25zdCB2PWRbZ107ci5wdXNoKHYueCx2LnksMCkscy5wdXNoKDAsMCwxKSxvLnB1c2godi54LHYueSl9Zm9yKGxldCBnPTAsbT15Lmxlbmd0aDtnPG07ZysrKXtjb25zdCB2PXlbZ10seD12WzBdK2gsXz12WzFdK2gsTT12WzJdK2g7bi5wdXNoKHgsXyxNKSxsKz0zfX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKSxlPXRoaXMucGFyYW1ldGVycy5zaGFwZXM7cmV0dXJuIE9FKGUsdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MCxzPXQuc2hhcGVzLmxlbmd0aDtyPHM7cisrKXtjb25zdCBvPWVbdC5zaGFwZXNbcl1dO24ucHVzaChvKX1yZXR1cm4gbmV3IFV1KG4sdC5jdXJ2ZVNlZ21lbnRzKX19ZnVuY3Rpb24gT0UoaSx0KXtpZih0LnNoYXBlcz1bXSxBcnJheS5pc0FycmF5KGkpKWZvcihsZXQgZT0wLG49aS5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj1pW2VdO3Quc2hhcGVzLnB1c2goci51dWlkKX1lbHNlIHQuc2hhcGVzLnB1c2goaS51dWlkKTtyZXR1cm4gdH1jbGFzcyBZYSBleHRlbmRzIEZ0e2NvbnN0cnVjdG9yKHQ9MSxlPTMyLG49MTYscj0wLHM9TWF0aC5QSSoyLG89MCxhPU1hdGguUEkpe3N1cGVyKCksdGhpcy50eXBlPSJTcGhlcmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6bixwaGlTdGFydDpyLHBoaUxlbmd0aDpzLHRoZXRhU3RhcnQ6byx0aGV0YUxlbmd0aDphfSxlPU1hdGgubWF4KDMsTWF0aC5mbG9vcihlKSksbj1NYXRoLm1heCgyLE1hdGguZmxvb3IobikpO2NvbnN0IGw9TWF0aC5taW4obythLE1hdGguUEkpO2xldCBjPTA7Y29uc3QgdT1bXSxoPW5ldyBSLGY9bmV3IFIsZD1bXSxwPVtdLHk9W10sZz1bXTtmb3IobGV0IG09MDttPD1uO20rKyl7Y29uc3Qgdj1bXSx4PW0vbjtsZXQgXz0wO209PT0wJiZvPT09MD9fPS41L2U6bT09PW4mJmw9PT1NYXRoLlBJJiYoXz0tLjUvZSk7Zm9yKGxldCBNPTA7TTw9ZTtNKyspe2NvbnN0IGI9TS9lO2gueD0tdCpNYXRoLmNvcyhyK2IqcykqTWF0aC5zaW4obyt4KmEpLGgueT10Kk1hdGguY29zKG8reCphKSxoLno9dCpNYXRoLnNpbihyK2IqcykqTWF0aC5zaW4obyt4KmEpLHAucHVzaChoLngsaC55LGgueiksZi5jb3B5KGgpLm5vcm1hbGl6ZSgpLHkucHVzaChmLngsZi55LGYueiksZy5wdXNoKGIrXywxLXgpLHYucHVzaChjKyspfXUucHVzaCh2KX1mb3IobGV0IG09MDttPG47bSsrKWZvcihsZXQgdj0wO3Y8ZTt2Kyspe2NvbnN0IHg9dVttXVt2KzFdLF89dVttXVt2XSxNPXVbbSsxXVt2XSxiPXVbbSsxXVt2KzFdOyhtIT09MHx8bz4wKSYmZC5wdXNoKHgsXyxiKSwobSE9PW4tMXx8bDxNYXRoLlBJKSYmZC5wdXNoKF8sTSxiKX10aGlzLnNldEluZGV4KGQpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KHAsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdCh5LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdChnLDIpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBZYSh0LnJhZGl1cyx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyx0LnBoaVN0YXJ0LHQucGhpTGVuZ3RoLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgTnUgZXh0ZW5kcyBFcntjb25zdHJ1Y3Rvcih0PTEsZT0wKXtjb25zdCBuPVsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0scj1bMiwxLDAsMCwzLDIsMSwzLDAsMiwzLDFdO3N1cGVyKG4scix0LGUpLHRoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgTnUodC5yYWRpdXMsdC5kZXRhaWwpfX1jbGFzcyBGdSBleHRlbmRzIEZ0e2NvbnN0cnVjdG9yKHQ9MSxlPS40LG49MTIscj00OCxzPU1hdGguUEkqMil7c3VwZXIoKSx0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsdHViZTplLHJhZGlhbFNlZ21lbnRzOm4sdHVidWxhclNlZ21lbnRzOnIsYXJjOnN9LG49TWF0aC5mbG9vcihuKSxyPU1hdGguZmxvb3Iocik7Y29uc3Qgbz1bXSxhPVtdLGw9W10sYz1bXSx1PW5ldyBSLGg9bmV3IFIsZj1uZXcgUjtmb3IobGV0IGQ9MDtkPD1uO2QrKylmb3IobGV0IHA9MDtwPD1yO3ArKyl7Y29uc3QgeT1wL3IqcyxnPWQvbipNYXRoLlBJKjI7aC54PSh0K2UqTWF0aC5jb3MoZykpKk1hdGguY29zKHkpLGgueT0odCtlKk1hdGguY29zKGcpKSpNYXRoLnNpbih5KSxoLno9ZSpNYXRoLnNpbihnKSxhLnB1c2goaC54LGgueSxoLnopLHUueD10Kk1hdGguY29zKHkpLHUueT10Kk1hdGguc2luKHkpLGYuc3ViVmVjdG9ycyhoLHUpLm5vcm1hbGl6ZSgpLGwucHVzaChmLngsZi55LGYueiksYy5wdXNoKHAvciksYy5wdXNoKGQvbil9Zm9yKGxldCBkPTE7ZDw9bjtkKyspZm9yKGxldCBwPTE7cDw9cjtwKyspe2NvbnN0IHk9KHIrMSkqZCtwLTEsZz0ocisxKSooZC0xKStwLTEsbT0ocisxKSooZC0xKStwLHY9KHIrMSkqZCtwO28ucHVzaCh5LGcsdiksby5wdXNoKGcsbSx2KX10aGlzLnNldEluZGV4KG8pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KGEsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdChsLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdChjLDIpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBGdSh0LnJhZGl1cyx0LnR1YmUsdC5yYWRpYWxTZWdtZW50cyx0LnR1YnVsYXJTZWdtZW50cyx0LmFyYyl9fWNsYXNzIEJ1IGV4dGVuZHMgRnR7Y29uc3RydWN0b3IodD0xLGU9LjQsbj02NCxyPTgscz0yLG89Myl7c3VwZXIoKSx0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHR1YmU6ZSx0dWJ1bGFyU2VnbWVudHM6bixyYWRpYWxTZWdtZW50czpyLHA6cyxxOm99LG49TWF0aC5mbG9vcihuKSxyPU1hdGguZmxvb3Iocik7Y29uc3QgYT1bXSxsPVtdLGM9W10sdT1bXSxoPW5ldyBSLGY9bmV3IFIsZD1uZXcgUixwPW5ldyBSLHk9bmV3IFIsZz1uZXcgUixtPW5ldyBSO2ZvcihsZXQgeD0wO3g8PW47Kyt4KXtjb25zdCBfPXgvbipzKk1hdGguUEkqMjt2KF8scyxvLHQsZCksdihfKy4wMSxzLG8sdCxwKSxnLnN1YlZlY3RvcnMocCxkKSxtLmFkZFZlY3RvcnMocCxkKSx5LmNyb3NzVmVjdG9ycyhnLG0pLG0uY3Jvc3NWZWN0b3JzKHksZykseS5ub3JtYWxpemUoKSxtLm5vcm1hbGl6ZSgpO2ZvcihsZXQgTT0wO008PXI7KytNKXtjb25zdCBiPU0vcipNYXRoLlBJKjIsQT0tZSpNYXRoLmNvcyhiKSxFPWUqTWF0aC5zaW4oYik7aC54PWQueCsoQSptLngrRSp5LngpLGgueT1kLnkrKEEqbS55K0UqeS55KSxoLno9ZC56KyhBKm0ueitFKnkueiksbC5wdXNoKGgueCxoLnksaC56KSxmLnN1YlZlY3RvcnMoaCxkKS5ub3JtYWxpemUoKSxjLnB1c2goZi54LGYueSxmLnopLHUucHVzaCh4L24pLHUucHVzaChNL3IpfX1mb3IobGV0IHg9MTt4PD1uO3grKylmb3IobGV0IF89MTtfPD1yO18rKyl7Y29uc3QgTT0ocisxKSooeC0xKSsoXy0xKSxiPShyKzEpKngrKF8tMSksQT0ocisxKSp4K18sRT0ocisxKSooeC0xKStfO2EucHVzaChNLGIsRSksYS5wdXNoKGIsQSxFKX10aGlzLnNldEluZGV4KGEpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdChjLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdCh1LDIpKTtmdW5jdGlvbiB2KHgsXyxNLGIsQSl7Y29uc3QgRT1NYXRoLmNvcyh4KSx3PU1hdGguc2luKHgpLFM9TS9fKngsVD1NYXRoLmNvcyhTKTtBLng9YiooMitUKSouNSpFLEEueT1iKigyK1QpKncqLjUsQS56PWIqTWF0aC5zaW4oUykqLjV9fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEJ1KHQucmFkaXVzLHQudHViZSx0LnR1YnVsYXJTZWdtZW50cyx0LnJhZGlhbFNlZ21lbnRzLHQucCx0LnEpfX1jbGFzcyBPdSBleHRlbmRzIEZ0e2NvbnN0cnVjdG9yKHQ9bmV3IG9wKG5ldyBSKC0xLC0xLDApLG5ldyBSKC0xLDEsMCksbmV3IFIoMSwxLDApKSxlPTY0LG49MSxyPTgscz0hMSl7c3VwZXIoKSx0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtwYXRoOnQsdHVidWxhclNlZ21lbnRzOmUscmFkaXVzOm4scmFkaWFsU2VnbWVudHM6cixjbG9zZWQ6c307Y29uc3Qgbz10LmNvbXB1dGVGcmVuZXRGcmFtZXMoZSxzKTt0aGlzLnRhbmdlbnRzPW8udGFuZ2VudHMsdGhpcy5ub3JtYWxzPW8ubm9ybWFscyx0aGlzLmJpbm9ybWFscz1vLmJpbm9ybWFscztjb25zdCBhPW5ldyBSLGw9bmV3IFIsYz1uZXcgWDtsZXQgdT1uZXcgUjtjb25zdCBoPVtdLGY9W10sZD1bXSxwPVtdO3koKSx0aGlzLnNldEluZGV4KHApLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBNdChmLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBNdChkLDIpKTtmdW5jdGlvbiB5KCl7Zm9yKGxldCB4PTA7eDxlO3grKylnKHgpO2cocz09PSExP2U6MCksdigpLG0oKX1mdW5jdGlvbiBnKHgpe3U9dC5nZXRQb2ludEF0KHgvZSx1KTtjb25zdCBfPW8ubm9ybWFsc1t4XSxNPW8uYmlub3JtYWxzW3hdO2ZvcihsZXQgYj0wO2I8PXI7YisrKXtjb25zdCBBPWIvcipNYXRoLlBJKjIsRT1NYXRoLnNpbihBKSx3PS1NYXRoLmNvcyhBKTtsLng9dypfLngrRSpNLngsbC55PXcqXy55K0UqTS55LGwuej13Kl8ueitFKk0ueixsLm5vcm1hbGl6ZSgpLGYucHVzaChsLngsbC55LGwueiksYS54PXUueCtuKmwueCxhLnk9dS55K24qbC55LGEuej11LnorbipsLnosaC5wdXNoKGEueCxhLnksYS56KX19ZnVuY3Rpb24gbSgpe2ZvcihsZXQgeD0xO3g8PWU7eCsrKWZvcihsZXQgXz0xO188PXI7XysrKXtjb25zdCBNPShyKzEpKih4LTEpKyhfLTEpLGI9KHIrMSkqeCsoXy0xKSxBPShyKzEpKngrXyxFPShyKzEpKih4LTEpK187cC5wdXNoKE0sYixFKSxwLnB1c2goYixBLEUpfX1mdW5jdGlvbiB2KCl7Zm9yKGxldCB4PTA7eDw9ZTt4KyspZm9yKGxldCBfPTA7Xzw9cjtfKyspYy54PXgvZSxjLnk9Xy9yLGQucHVzaChjLngsYy55KX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5wYXRoPXRoaXMucGFyYW1ldGVycy5wYXRoLnRvSlNPTigpLHR9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgT3UobmV3IFN1W3QucGF0aC50eXBlXSgpLmZyb21KU09OKHQucGF0aCksdC50dWJ1bGFyU2VnbWVudHMsdC5yYWRpdXMsdC5yYWRpYWxTZWdtZW50cyx0LmNsb3NlZCl9fWNsYXNzIFJfIGV4dGVuZHMgRnR7Y29uc3RydWN0b3IodD1udWxsKXtpZihzdXBlcigpLHRoaXMudHlwZT0iV2lyZWZyYW1lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17Z2VvbWV0cnk6dH0sdCE9PW51bGwpe2NvbnN0IGU9W10sbj1uZXcgU2V0LHI9bmV3IFIscz1uZXcgUjtpZih0LmluZGV4IT09bnVsbCl7Y29uc3Qgbz10LmF0dHJpYnV0ZXMucG9zaXRpb24sYT10LmluZGV4O2xldCBsPXQuZ3JvdXBzO2wubGVuZ3RoPT09MCYmKGw9W3tzdGFydDowLGNvdW50OmEuY291bnQsbWF0ZXJpYWxJbmRleDowfV0pO2ZvcihsZXQgYz0wLHU9bC5sZW5ndGg7Yzx1OysrYyl7Y29uc3QgaD1sW2NdLGY9aC5zdGFydCxkPWguY291bnQ7Zm9yKGxldCBwPWYseT1mK2Q7cDx5O3ArPTMpZm9yKGxldCBnPTA7ZzwzO2crKyl7Y29uc3QgbT1hLmdldFgocCtnKSx2PWEuZ2V0WChwKyhnKzEpJTMpO3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLG0pLHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLHYpLFBfKHIscyxuKT09PSEwJiYoZS5wdXNoKHIueCxyLnksci56KSxlLnB1c2gocy54LHMueSxzLnopKX19fWVsc2V7Y29uc3Qgbz10LmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBhPTAsbD1vLmNvdW50LzM7YTxsO2ErKylmb3IobGV0IGM9MDtjPDM7YysrKXtjb25zdCB1PTMqYStjLGg9MyphKyhjKzEpJTM7ci5mcm9tQnVmZmVyQXR0cmlidXRlKG8sdSkscy5mcm9tQnVmZmVyQXR0cmlidXRlKG8saCksUF8ocixzLG4pPT09ITAmJihlLnB1c2goci54LHIueSxyLnopLGUucHVzaChzLngscy55LHMueikpfX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBNdChlLDMpKX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9fWZ1bmN0aW9uIFBfKGksdCxlKXtjb25zdCBuPWAke2kueH0sJHtpLnl9LCR7aS56fS0ke3QueH0sJHt0Lnl9LCR7dC56fWAscj1gJHt0Lnh9LCR7dC55fSwke3Quen0tJHtpLnh9LCR7aS55fSwke2kuen1gO3JldHVybiBlLmhhcyhuKT09PSEwfHxlLmhhcyhyKT09PSEwPyExOihlLmFkZChuKSxlLmFkZChyKSwhMCl9dmFyIElfPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJveEdlb21ldHJ5OnJzLENhcHN1bGVHZW9tZXRyeTpNdSxDaXJjbGVHZW9tZXRyeTpidSxDb25lR2VvbWV0cnk6d3UsQ3lsaW5kZXJHZW9tZXRyeTpNbyxEb2RlY2FoZWRyb25HZW9tZXRyeTpBdSxFZGdlc0dlb21ldHJ5OlNfLEV4dHJ1ZGVHZW9tZXRyeTpDXyxJY29zYWhlZHJvbkdlb21ldHJ5Okx1LExhdGhlR2VvbWV0cnk6SGEsT2N0YWhlZHJvbkdlb21ldHJ5OnFhLFBsYW5lR2VvbWV0cnk6dXMsUG9seWhlZHJvbkdlb21ldHJ5OkVyLFJpbmdHZW9tZXRyeTpEdSxTaGFwZUdlb21ldHJ5OlV1LFNwaGVyZUdlb21ldHJ5OllhLFRldHJhaGVkcm9uR2VvbWV0cnk6TnUsVG9ydXNHZW9tZXRyeTpGdSxUb3J1c0tub3RHZW9tZXRyeTpCdSxUdWJlR2VvbWV0cnk6T3UsV2lyZWZyYW1lR2VvbWV0cnk6Ul99KTtjbGFzcyBMXyBleHRlbmRzIFFle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc1NoYWRvd01hdGVyaWFsPSEwLHRoaXMudHlwZT0iU2hhZG93TWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHh0KDApLHRoaXMudHJhbnNwYXJlbnQ9ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5mb2c9dC5mb2csdGhpc319Y2xhc3MgRF8gZXh0ZW5kcyB1aXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJSYXdTaGFkZXJNYXRlcmlhbCJ9fWNsYXNzIGhwIGV4dGVuZHMgUWV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoU3RhbmRhcmRNYXRlcmlhbCIsdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn0sdGhpcy5jb2xvcj1uZXcgeHQoMTY3NzcyMTUpLHRoaXMucm91Z2huZXNzPTEsdGhpcy5tZXRhbG5lc3M9MCx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyB4dCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9Z3IsdGhpcy5ub3JtYWxTY2FsZT1uZXcgWCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMucm91Z2huZXNzTWFwPW51bGwsdGhpcy5tZXRhbG5lc3NNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmVudk1hcFJvdGF0aW9uPW5ldyBCbix0aGlzLmVudk1hcEludGVuc2l0eT0xLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5yb3VnaG5lc3M9dC5yb3VnaG5lc3MsdGhpcy5tZXRhbG5lc3M9dC5tZXRhbG5lc3MsdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuYnVtcE1hcD10LmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9dC5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9dC5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy5yb3VnaG5lc3NNYXA9dC5yb3VnaG5lc3NNYXAsdGhpcy5tZXRhbG5lc3NNYXA9dC5tZXRhbG5lc3NNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmVudk1hcEludGVuc2l0eT10LmVudk1hcEludGVuc2l0eSx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpcy5mb2c9dC5mb2csdGhpc319Y2xhc3MgVV8gZXh0ZW5kcyBocHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMCx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIiLFBIWVNJQ0FMOiIifSx0aGlzLnR5cGU9Ik1lc2hQaHlzaWNhbE1hdGVyaWFsIix0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbj0wLHRoaXMuYW5pc290cm9weU1hcD1udWxsLHRoaXMuY2xlYXJjb2F0TWFwPW51bGwsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9MCx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcD1udWxsLHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9bmV3IFgoMSwxKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1udWxsLHRoaXMuaW9yPTEuNSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmVmbGVjdGl2aXR5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEh0KDIuNSoodGhpcy5pb3ItMSkvKHRoaXMuaW9yKzEpLDAsMSl9LHNldDpmdW5jdGlvbihlKXt0aGlzLmlvcj0oMSsuNCplKS8oMS0uNCplKX19KSx0aGlzLmlyaWRlc2NlbmNlTWFwPW51bGwsdGhpcy5pcmlkZXNjZW5jZUlPUj0xLjMsdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPVsxMDAsNDAwXSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPW51bGwsdGhpcy5zaGVlbkNvbG9yPW5ldyB4dCgwKSx0aGlzLnNoZWVuQ29sb3JNYXA9bnVsbCx0aGlzLnNoZWVuUm91Z2huZXNzPTEsdGhpcy5zaGVlblJvdWdobmVzc01hcD1udWxsLHRoaXMudHJhbnNtaXNzaW9uTWFwPW51bGwsdGhpcy50aGlja25lc3M9MCx0aGlzLnRoaWNrbmVzc01hcD1udWxsLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZT0xLzAsdGhpcy5hdHRlbnVhdGlvbkNvbG9yPW5ldyB4dCgxLDEsMSksdGhpcy5zcGVjdWxhckludGVuc2l0eT0xLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9bnVsbCx0aGlzLnNwZWN1bGFyQ29sb3I9bmV3IHh0KDEsMSwxKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXA9bnVsbCx0aGlzLl9hbmlzb3Ryb3B5PTAsdGhpcy5fY2xlYXJjb2F0PTAsdGhpcy5fZGlzcGVyc2lvbj0wLHRoaXMuX2lyaWRlc2NlbmNlPTAsdGhpcy5fc2hlZW49MCx0aGlzLl90cmFuc21pc3Npb249MCx0aGlzLnNldFZhbHVlcyh0KX1nZXQgYW5pc290cm9weSgpe3JldHVybiB0aGlzLl9hbmlzb3Ryb3B5fXNldCBhbmlzb3Ryb3B5KHQpe3RoaXMuX2FuaXNvdHJvcHk+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9hbmlzb3Ryb3B5PXR9Z2V0IGNsZWFyY29hdCgpe3JldHVybiB0aGlzLl9jbGVhcmNvYXR9c2V0IGNsZWFyY29hdCh0KXt0aGlzLl9jbGVhcmNvYXQ+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9jbGVhcmNvYXQ9dH1nZXQgaXJpZGVzY2VuY2UoKXtyZXR1cm4gdGhpcy5faXJpZGVzY2VuY2V9c2V0IGlyaWRlc2NlbmNlKHQpe3RoaXMuX2lyaWRlc2NlbmNlPjAhPXQ+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5faXJpZGVzY2VuY2U9dH1nZXQgZGlzcGVyc2lvbigpe3JldHVybiB0aGlzLl9kaXNwZXJzaW9ufXNldCBkaXNwZXJzaW9uKHQpe3RoaXMuX2Rpc3BlcnNpb24+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9kaXNwZXJzaW9uPXR9Z2V0IHNoZWVuKCl7cmV0dXJuIHRoaXMuX3NoZWVufXNldCBzaGVlbih0KXt0aGlzLl9zaGVlbj4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX3NoZWVuPXR9Z2V0IHRyYW5zbWlzc2lvbigpe3JldHVybiB0aGlzLl90cmFuc21pc3Npb259c2V0IHRyYW5zbWlzc2lvbih0KXt0aGlzLl90cmFuc21pc3Npb24+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl90cmFuc21pc3Npb249dH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9LHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5hbmlzb3Ryb3B5Um90YXRpb249dC5hbmlzb3Ryb3B5Um90YXRpb24sdGhpcy5hbmlzb3Ryb3B5TWFwPXQuYW5pc290cm9weU1hcCx0aGlzLmNsZWFyY29hdD10LmNsZWFyY29hdCx0aGlzLmNsZWFyY29hdE1hcD10LmNsZWFyY29hdE1hcCx0aGlzLmNsZWFyY29hdFJvdWdobmVzcz10LmNsZWFyY29hdFJvdWdobmVzcyx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcD10LmNsZWFyY29hdFJvdWdobmVzc01hcCx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD10LmNsZWFyY29hdE5vcm1hbE1hcCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkodC5jbGVhcmNvYXROb3JtYWxTY2FsZSksdGhpcy5kaXNwZXJzaW9uPXQuZGlzcGVyc2lvbix0aGlzLmlvcj10Lmlvcix0aGlzLmlyaWRlc2NlbmNlPXQuaXJpZGVzY2VuY2UsdGhpcy5pcmlkZXNjZW5jZU1hcD10LmlyaWRlc2NlbmNlTWFwLHRoaXMuaXJpZGVzY2VuY2VJT1I9dC5pcmlkZXNjZW5jZUlPUix0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9Wy4uLnQuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZV0sdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLHRoaXMuc2hlZW49dC5zaGVlbix0aGlzLnNoZWVuQ29sb3IuY29weSh0LnNoZWVuQ29sb3IpLHRoaXMuc2hlZW5Db2xvck1hcD10LnNoZWVuQ29sb3JNYXAsdGhpcy5zaGVlblJvdWdobmVzcz10LnNoZWVuUm91Z2huZXNzLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXA9dC5zaGVlblJvdWdobmVzc01hcCx0aGlzLnRyYW5zbWlzc2lvbj10LnRyYW5zbWlzc2lvbix0aGlzLnRyYW5zbWlzc2lvbk1hcD10LnRyYW5zbWlzc2lvbk1hcCx0aGlzLnRoaWNrbmVzcz10LnRoaWNrbmVzcyx0aGlzLnRoaWNrbmVzc01hcD10LnRoaWNrbmVzc01hcCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9dC5hdHRlbnVhdGlvbkRpc3RhbmNlLHRoaXMuYXR0ZW51YXRpb25Db2xvci5jb3B5KHQuYXR0ZW51YXRpb25Db2xvciksdGhpcy5zcGVjdWxhckludGVuc2l0eT10LnNwZWN1bGFySW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9dC5zcGVjdWxhckludGVuc2l0eU1hcCx0aGlzLnNwZWN1bGFyQ29sb3IuY29weSh0LnNwZWN1bGFyQ29sb3IpLHRoaXMuc3BlY3VsYXJDb2xvck1hcD10LnNwZWN1bGFyQ29sb3JNYXAsdGhpc319Y2xhc3MgTl8gZXh0ZW5kcyBRZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoUGhvbmdNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hQaG9uZ01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB4dCgxNjc3NzIxNSksdGhpcy5zcGVjdWxhcj1uZXcgeHQoMTExODQ4MSksdGhpcy5zaGluaW5lc3M9MzAsdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgeHQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPWdyLHRoaXMubm9ybWFsU2NhbGU9bmV3IFgoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgQm4sdGhpcy5jb21iaW5lPWFhLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5zcGVjdWxhci5jb3B5KHQuc3BlY3VsYXIpLHRoaXMuc2hpbmluZXNzPXQuc2hpbmluZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHQuZW52TWFwUm90YXRpb24pLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIEZfIGV4dGVuZHMgUWV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaFRvb25NYXRlcmlhbD0hMCx0aGlzLmRlZmluZXM9e1RPT046IiJ9LHRoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgeHQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5ncmFkaWVudE1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyB4dCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9Z3IsdGhpcy5ub3JtYWxTY2FsZT1uZXcgWCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmdyYWRpZW50TWFwPXQuZ3JhZGllbnRNYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuYnVtcE1hcD10LmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9dC5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9dC5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIEJfIGV4dGVuZHMgUWV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaE5vcm1hbE1hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaE5vcm1hbE1hdGVyaWFsIix0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPWdyLHRoaXMubm9ybWFsU2NhbGU9bmV3IFgoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMuZmxhdFNoYWRpbmc9dC5mbGF0U2hhZGluZyx0aGlzfX1jbGFzcyBPXyBleHRlbmRzIFFle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoTGFtYmVydE1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB4dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgeHQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPWdyLHRoaXMubm9ybWFsU2NhbGU9bmV3IFgoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgQm4sdGhpcy5jb21iaW5lPWFhLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuYnVtcE1hcD10LmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9dC5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9dC5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy5zcGVjdWxhck1hcD10LnNwZWN1bGFyTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkodC5lbnZNYXBSb3RhdGlvbiksdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpcy5mb2c9dC5mb2csdGhpc319Y2xhc3MgZnAgZXh0ZW5kcyBRZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoRGVwdGhNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIix0aGlzLmRlcHRoUGFja2luZz1zeSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZXB0aFBhY2tpbmc9dC5kZXB0aFBhY2tpbmcsdGhpcy5tYXA9dC5tYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXN9fWNsYXNzIGRwIGV4dGVuZHMgUWV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpc319Y2xhc3Mgel8gZXh0ZW5kcyBRZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw9ITAsdGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9LHRoaXMudHlwZT0iTWVzaE1hdGNhcE1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB4dCgxNjc3NzIxNSksdGhpcy5tYXRjYXA9bnVsbCx0aGlzLm1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9Z3IsdGhpcy5ub3JtYWxTY2FsZT1uZXcgWCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9LHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hdGNhcD10Lm1hdGNhcCx0aGlzLm1hcD10Lm1hcCx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpcy5mb2c9dC5mb2csdGhpc319Y2xhc3Mga18gZXh0ZW5kcyBobntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJMaW5lRGFzaGVkTWF0ZXJpYWwiLHRoaXMuc2NhbGU9MSx0aGlzLmRhc2hTaXplPTMsdGhpcy5nYXBTaXplPTEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNjYWxlPXQuc2NhbGUsdGhpcy5kYXNoU2l6ZT10LmRhc2hTaXplLHRoaXMuZ2FwU2l6ZT10LmdhcFNpemUsdGhpc319ZnVuY3Rpb24gaHMoaSx0LGUpe3JldHVybiFpfHwhZSYmaS5jb25zdHJ1Y3Rvcj09PXQ/aTp0eXBlb2YgdC5CWVRFU19QRVJfRUxFTUVOVD09Im51bWJlciI/bmV3IHQoaSk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaSl9ZnVuY3Rpb24gVl8oaSl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhpKSYmIShpIGluc3RhbmNlb2YgRGF0YVZpZXcpfWZ1bmN0aW9uIEdfKGkpe2Z1bmN0aW9uIHQocixzKXtyZXR1cm4gaVtyXS1pW3NdfWNvbnN0IGU9aS5sZW5ndGgsbj1uZXcgQXJyYXkoZSk7Zm9yKGxldCByPTA7ciE9PWU7KytyKW5bcl09cjtyZXR1cm4gbi5zb3J0KHQpLG59ZnVuY3Rpb24gcHAoaSx0LGUpe2NvbnN0IG49aS5sZW5ndGgscj1uZXcgaS5jb25zdHJ1Y3RvcihuKTtmb3IobGV0IHM9MCxvPTA7byE9PW47KytzKXtjb25zdCBhPWVbc10qdDtmb3IobGV0IGw9MDtsIT09dDsrK2wpcltvKytdPWlbYStsXX1yZXR1cm4gcn1mdW5jdGlvbiBtcChpLHQsZSxuKXtsZXQgcj0xLHM9aVswXTtmb3IoO3MhPT12b2lkIDAmJnNbbl09PT12b2lkIDA7KXM9aVtyKytdO2lmKHM9PT12b2lkIDApcmV0dXJuO2xldCBvPXNbbl07aWYobyE9PXZvaWQgMClpZihBcnJheS5pc0FycmF5KG8pKWRvIG89c1tuXSxvIT09dm9pZCAwJiYodC5wdXNoKHMudGltZSksZS5wdXNoLmFwcGx5KGUsbykpLHM9aVtyKytdO3doaWxlKHMhPT12b2lkIDApO2Vsc2UgaWYoby50b0FycmF5IT09dm9pZCAwKWRvIG89c1tuXSxvIT09dm9pZCAwJiYodC5wdXNoKHMudGltZSksby50b0FycmF5KGUsZS5sZW5ndGgpKSxzPWlbcisrXTt3aGlsZShzIT09dm9pZCAwKTtlbHNlIGRvIG89c1tuXSxvIT09dm9pZCAwJiYodC5wdXNoKHMudGltZSksZS5wdXNoKG8pKSxzPWlbcisrXTt3aGlsZShzIT09dm9pZCAwKX1mdW5jdGlvbiB6RShpLHQsZSxuLHI9MzApe2NvbnN0IHM9aS5jbG9uZSgpO3MubmFtZT10O2NvbnN0IG89W107Zm9yKGxldCBsPTA7bDxzLnRyYWNrcy5sZW5ndGg7KytsKXtjb25zdCBjPXMudHJhY2tzW2xdLHU9Yy5nZXRWYWx1ZVNpemUoKSxoPVtdLGY9W107Zm9yKGxldCBkPTA7ZDxjLnRpbWVzLmxlbmd0aDsrK2Qpe2NvbnN0IHA9Yy50aW1lc1tkXSpyO2lmKCEocDxlfHxwPj1uKSl7aC5wdXNoKGMudGltZXNbZF0pO2ZvcihsZXQgeT0wO3k8dTsrK3kpZi5wdXNoKGMudmFsdWVzW2QqdSt5XSl9fWgubGVuZ3RoIT09MCYmKGMudGltZXM9aHMoaCxjLnRpbWVzLmNvbnN0cnVjdG9yKSxjLnZhbHVlcz1ocyhmLGMudmFsdWVzLmNvbnN0cnVjdG9yKSxvLnB1c2goYykpfXMudHJhY2tzPW87bGV0IGE9MS8wO2ZvcihsZXQgbD0wO2w8cy50cmFja3MubGVuZ3RoOysrbClhPnMudHJhY2tzW2xdLnRpbWVzWzBdJiYoYT1zLnRyYWNrc1tsXS50aW1lc1swXSk7Zm9yKGxldCBsPTA7bDxzLnRyYWNrcy5sZW5ndGg7KytsKXMudHJhY2tzW2xdLnNoaWZ0KC0xKmEpO3JldHVybiBzLnJlc2V0RHVyYXRpb24oKSxzfWZ1bmN0aW9uIGtFKGksdD0wLGU9aSxuPTMwKXtuPD0wJiYobj0zMCk7Y29uc3Qgcj1lLnRyYWNrcy5sZW5ndGgscz10L247Zm9yKGxldCBvPTA7bzxyOysrbyl7Y29uc3QgYT1lLnRyYWNrc1tvXSxsPWEuVmFsdWVUeXBlTmFtZTtpZihsPT09ImJvb2wifHxsPT09InN0cmluZyIpY29udGludWU7Y29uc3QgYz1pLnRyYWNrcy5maW5kKGZ1bmN0aW9uKG0pe3JldHVybiBtLm5hbWU9PT1hLm5hbWUmJm0uVmFsdWVUeXBlTmFtZT09PWx9KTtpZihjPT09dm9pZCAwKWNvbnRpbnVlO2xldCB1PTA7Y29uc3QgaD1hLmdldFZhbHVlU2l6ZSgpO2EuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUmJih1PWgvMyk7bGV0IGY9MDtjb25zdCBkPWMuZ2V0VmFsdWVTaXplKCk7Yy5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSYmKGY9ZC8zKTtjb25zdCBwPWEudGltZXMubGVuZ3RoLTE7bGV0IHk7aWYoczw9YS50aW1lc1swXSl7Y29uc3QgbT11LHY9aC11O3k9YS52YWx1ZXMuc2xpY2UobSx2KX1lbHNlIGlmKHM+PWEudGltZXNbcF0pe2NvbnN0IG09cCpoK3Usdj1tK2gtdTt5PWEudmFsdWVzLnNsaWNlKG0sdil9ZWxzZXtjb25zdCBtPWEuY3JlYXRlSW50ZXJwb2xhbnQoKSx2PXUseD1oLXU7bS5ldmFsdWF0ZShzKSx5PW0ucmVzdWx0QnVmZmVyLnNsaWNlKHYseCl9bD09PSJxdWF0ZXJuaW9uIiYmbmV3IE1uKCkuZnJvbUFycmF5KHkpLm5vcm1hbGl6ZSgpLmNvbmp1Z2F0ZSgpLnRvQXJyYXkoeSk7Y29uc3QgZz1jLnRpbWVzLmxlbmd0aDtmb3IobGV0IG09MDttPGc7KyttKXtjb25zdCB2PW0qZCtmO2lmKGw9PT0icXVhdGVybmlvbiIpTW4ubXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoYy52YWx1ZXMsdix5LDAsYy52YWx1ZXMsdik7ZWxzZXtjb25zdCB4PWQtZioyO2ZvcihsZXQgXz0wO188eDsrK18pYy52YWx1ZXNbditfXS09eVtfXX19fXJldHVybiBpLmJsZW5kTW9kZT1kZCxpfWNvbnN0IFZFPXtjb252ZXJ0QXJyYXk6aHMsaXNUeXBlZEFycmF5OlZfLGdldEtleWZyYW1lT3JkZXI6R18sc29ydGVkQXJyYXk6cHAsZmxhdHRlbkpTT046bXAsc3ViY2xpcDp6RSxtYWtlQ2xpcEFkZGl0aXZlOmtFfTtjbGFzcyBaYXtjb25zdHJ1Y3Rvcih0LGUsbixyKXt0aGlzLnBhcmFtZXRlclBvc2l0aW9ucz10LHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5yZXN1bHRCdWZmZXI9ciE9PXZvaWQgMD9yOm5ldyBlLmNvbnN0cnVjdG9yKG4pLHRoaXMuc2FtcGxlVmFsdWVzPWUsdGhpcy52YWx1ZVNpemU9bix0aGlzLnNldHRpbmdzPW51bGwsdGhpcy5EZWZhdWx0U2V0dGluZ3NfPXt9fWV2YWx1YXRlKHQpe2NvbnN0IGU9dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM7bGV0IG49dGhpcy5fY2FjaGVkSW5kZXgscj1lW25dLHM9ZVtuLTFdO3Q6e2U6e2xldCBvO246e2k6aWYoISh0PHIpKXtmb3IobGV0IGE9bisyOzspe2lmKHI9PT12b2lkIDApe2lmKHQ8cylicmVhayBpO3JldHVybiBuPWUubGVuZ3RoLHRoaXMuX2NhY2hlZEluZGV4PW4sdGhpcy5jb3B5U2FtcGxlVmFsdWVfKG4tMSl9aWYobj09PWEpYnJlYWs7aWYocz1yLHI9ZVsrK25dLHQ8cilicmVhayBlfW89ZS5sZW5ndGg7YnJlYWsgbn1pZighKHQ+PXMpKXtjb25zdCBhPWVbMV07dDxhJiYobj0yLHM9YSk7Zm9yKGxldCBsPW4tMjs7KXtpZihzPT09dm9pZCAwKXJldHVybiB0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMuY29weVNhbXBsZVZhbHVlXygwKTtpZihuPT09bClicmVhaztpZihyPXMscz1lWy0tbi0xXSx0Pj1zKWJyZWFrIGV9bz1uLG49MDticmVhayBufWJyZWFrIHR9Zm9yKDtuPG87KXtjb25zdCBhPW4rbz4+PjE7dDxlW2FdP289YTpuPWErMX1pZihyPWVbbl0scz1lW24tMV0scz09PXZvaWQgMClyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7aWYocj09PXZvaWQgMClyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuY29weVNhbXBsZVZhbHVlXyhuLTEpfXRoaXMuX2NhY2hlZEluZGV4PW4sdGhpcy5pbnRlcnZhbENoYW5nZWRfKG4scyxyKX1yZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8obixzLHQscil9Z2V0U2V0dGluZ3NfKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fHRoaXMuRGVmYXVsdFNldHRpbmdzX31jb3B5U2FtcGxlVmFsdWVfKHQpe2NvbnN0IGU9dGhpcy5yZXN1bHRCdWZmZXIsbj10aGlzLnNhbXBsZVZhbHVlcyxyPXRoaXMudmFsdWVTaXplLHM9dCpyO2ZvcihsZXQgbz0wO28hPT1yOysrbyllW29dPW5bcytvXTtyZXR1cm4gZX1pbnRlcnBvbGF0ZV8oKXt0aHJvdyBuZXcgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIil9aW50ZXJ2YWxDaGFuZ2VkXygpe319Y2xhc3MgSF8gZXh0ZW5kcyBaYXtjb25zdHJ1Y3Rvcih0LGUsbixyKXtzdXBlcih0LGUsbixyKSx0aGlzLl93ZWlnaHRQcmV2PS0wLHRoaXMuX29mZnNldFByZXY9LTAsdGhpcy5fd2VpZ2h0TmV4dD0tMCx0aGlzLl9vZmZzZXROZXh0PS0wLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17ZW5kaW5nU3RhcnQ6WnIsZW5kaW5nRW5kOlpyfX1pbnRlcnZhbENoYW5nZWRfKHQsZSxuKXtjb25zdCByPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBzPXQtMixvPXQrMSxhPXJbc10sbD1yW29dO2lmKGE9PT12b2lkIDApc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgSnI6cz10LGE9MiplLW47YnJlYWs7Y2FzZSB2YTpzPXIubGVuZ3RoLTIsYT1lK3Jbc10tcltzKzFdO2JyZWFrO2RlZmF1bHQ6cz10LGE9bn1pZihsPT09dm9pZCAwKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ0VuZCl7Y2FzZSBKcjpvPXQsbD0yKm4tZTticmVhaztjYXNlIHZhOm89MSxsPW4rclsxXS1yWzBdO2JyZWFrO2RlZmF1bHQ6bz10LTEsbD1lfWNvbnN0IGM9KG4tZSkqLjUsdT10aGlzLnZhbHVlU2l6ZTt0aGlzLl93ZWlnaHRQcmV2PWMvKGUtYSksdGhpcy5fd2VpZ2h0TmV4dD1jLyhsLW4pLHRoaXMuX29mZnNldFByZXY9cyp1LHRoaXMuX29mZnNldE5leHQ9byp1fWludGVycG9sYXRlXyh0LGUsbixyKXtjb25zdCBzPXRoaXMucmVzdWx0QnVmZmVyLG89dGhpcy5zYW1wbGVWYWx1ZXMsYT10aGlzLnZhbHVlU2l6ZSxsPXQqYSxjPWwtYSx1PXRoaXMuX29mZnNldFByZXYsaD10aGlzLl9vZmZzZXROZXh0LGY9dGhpcy5fd2VpZ2h0UHJldixkPXRoaXMuX3dlaWdodE5leHQscD0obi1lKS8oci1lKSx5PXAqcCxnPXkqcCxtPS1mKmcrMipmKnktZipwLHY9KDErZikqZysoLTEuNS0yKmYpKnkrKC0uNStmKSpwKzEseD0oLTEtZCkqZysoMS41K2QpKnkrLjUqcCxfPWQqZy1kKnk7Zm9yKGxldCBNPTA7TSE9PWE7KytNKXNbTV09bSpvW3UrTV0rdipvW2MrTV0reCpvW2wrTV0rXypvW2grTV07cmV0dXJuIHN9fWNsYXNzIGdwIGV4dGVuZHMgWmF7Y29uc3RydWN0b3IodCxlLG4scil7c3VwZXIodCxlLG4scil9aW50ZXJwb2xhdGVfKHQsZSxuLHIpe2NvbnN0IHM9dGhpcy5yZXN1bHRCdWZmZXIsbz10aGlzLnNhbXBsZVZhbHVlcyxhPXRoaXMudmFsdWVTaXplLGw9dCphLGM9bC1hLHU9KG4tZSkvKHItZSksaD0xLXU7Zm9yKGxldCBmPTA7ZiE9PWE7KytmKXNbZl09b1tjK2ZdKmgrb1tsK2ZdKnU7cmV0dXJuIHN9fWNsYXNzIFdfIGV4dGVuZHMgWmF7Y29uc3RydWN0b3IodCxlLG4scil7c3VwZXIodCxlLG4scil9aW50ZXJwb2xhdGVfKHQpe3JldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8odC0xKX19Y2xhc3MgZGl7Y29uc3RydWN0b3IodCxlLG4scil7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7aWYoZT09PXZvaWQgMHx8ZS5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICIrdCk7dGhpcy5uYW1lPXQsdGhpcy50aW1lcz1ocyhlLHRoaXMuVGltZUJ1ZmZlclR5cGUpLHRoaXMudmFsdWVzPWhzKG4sdGhpcy5WYWx1ZUJ1ZmZlclR5cGUpLHRoaXMuc2V0SW50ZXJwb2xhdGlvbihyfHx0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKX1zdGF0aWMgdG9KU09OKHQpe2NvbnN0IGU9dC5jb25zdHJ1Y3RvcjtsZXQgbjtpZihlLnRvSlNPTiE9PXRoaXMudG9KU09OKW49ZS50b0pTT04odCk7ZWxzZXtuPXtuYW1lOnQubmFtZSx0aW1lczpocyh0LnRpbWVzLEFycmF5KSx2YWx1ZXM6aHModC52YWx1ZXMsQXJyYXkpfTtjb25zdCByPXQuZ2V0SW50ZXJwb2xhdGlvbigpO3IhPT10LkRlZmF1bHRJbnRlcnBvbGF0aW9uJiYobi5pbnRlcnBvbGF0aW9uPXIpfXJldHVybiBuLnR5cGU9dC5WYWx1ZVR5cGVOYW1lLG59SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGUodCl7cmV0dXJuIG5ldyBXXyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHQpe3JldHVybiBuZXcgZ3AodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfUludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCh0KXtyZXR1cm4gbmV3IEhfKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX1zZXRJbnRlcnBvbGF0aW9uKHQpe2xldCBlO3N3aXRjaCh0KXtjYXNlIHhhOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTticmVhaztjYXNlIEljOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7YnJlYWs7Y2FzZSBMYzplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoO2JyZWFrfWlmKGU9PT12b2lkIDApe2NvbnN0IG49InVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yICIrdGhpcy5WYWx1ZVR5cGVOYW1lKyIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgIit0aGlzLm5hbWU7aWYodGhpcy5jcmVhdGVJbnRlcnBvbGFudD09PXZvaWQgMClpZih0IT09dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil0aGlzLnNldEludGVycG9sYXRpb24odGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbik7ZWxzZSB0aHJvdyBuZXcgRXJyb3Iobik7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuS2V5ZnJhbWVUcmFjazoiLG4pLHRoaXN9cmV0dXJuIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9ZSx0aGlzfWdldEludGVycG9sYXRpb24oKXtzd2l0Y2godGhpcy5jcmVhdGVJbnRlcnBvbGFudCl7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOnJldHVybiB4YTtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOnJldHVybiBJYztjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiBMY319Z2V0VmFsdWVTaXplKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aC90aGlzLnRpbWVzLmxlbmd0aH1zaGlmdCh0KXtpZih0IT09MCl7Y29uc3QgZT10aGlzLnRpbWVzO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7biE9PXI7KytuKWVbbl0rPXR9cmV0dXJuIHRoaXN9c2NhbGUodCl7aWYodCE9PTEpe2NvbnN0IGU9dGhpcy50aW1lcztmb3IobGV0IG49MCxyPWUubGVuZ3RoO24hPT1yOysrbillW25dKj10fXJldHVybiB0aGlzfXRyaW0odCxlKXtjb25zdCBuPXRoaXMudGltZXMscj1uLmxlbmd0aDtsZXQgcz0wLG89ci0xO2Zvcig7cyE9PXImJm5bc108dDspKytzO2Zvcig7byE9PS0xJiZuW29dPmU7KS0tbztpZigrK28scyE9PTB8fG8hPT1yKXtzPj1vJiYobz1NYXRoLm1heChvLDEpLHM9by0xKTtjb25zdCBhPXRoaXMuZ2V0VmFsdWVTaXplKCk7dGhpcy50aW1lcz1uLnNsaWNlKHMsbyksdGhpcy52YWx1ZXM9dGhpcy52YWx1ZXMuc2xpY2UocyphLG8qYSl9cmV0dXJuIHRoaXN9dmFsaWRhdGUoKXtsZXQgdD0hMDtjb25zdCBlPXRoaXMuZ2V0VmFsdWVTaXplKCk7ZS1NYXRoLmZsb29yKGUpIT09MCYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLHQ9ITEpO2NvbnN0IG49dGhpcy50aW1lcyxyPXRoaXMudmFsdWVzLHM9bi5sZW5ndGg7cz09PTAmJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4iLHRoaXMpLHQ9ITEpO2xldCBvPW51bGw7Zm9yKGxldCBhPTA7YSE9PXM7YSsrKXtjb25zdCBsPW5bYV07aWYodHlwZW9mIGw9PSJudW1iZXIiJiZpc05hTihsKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLGEsbCksdD0hMTticmVha31pZihvIT09bnVsbCYmbz5sKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsYSxsLG8pLHQ9ITE7YnJlYWt9bz1sfWlmKHIhPT12b2lkIDAmJlZfKHIpKWZvcihsZXQgYT0wLGw9ci5sZW5ndGg7YSE9PWw7KythKXtjb25zdCBjPXJbYV07aWYoaXNOYU4oYykpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLHRoaXMsYSxjKSx0PSExO2JyZWFrfX1yZXR1cm4gdH1vcHRpbWl6ZSgpe2NvbnN0IHQ9dGhpcy50aW1lcy5zbGljZSgpLGU9dGhpcy52YWx1ZXMuc2xpY2UoKSxuPXRoaXMuZ2V0VmFsdWVTaXplKCkscj10aGlzLmdldEludGVycG9sYXRpb24oKT09PUxjLHM9dC5sZW5ndGgtMTtsZXQgbz0xO2ZvcihsZXQgYT0xO2E8czsrK2Epe2xldCBsPSExO2NvbnN0IGM9dFthXSx1PXRbYSsxXTtpZihjIT09dSYmKGEhPT0xfHxjIT09dFswXSkpaWYocilsPSEwO2Vsc2V7Y29uc3QgaD1hKm4sZj1oLW4sZD1oK247Zm9yKGxldCBwPTA7cCE9PW47KytwKXtjb25zdCB5PWVbaCtwXTtpZih5IT09ZVtmK3BdfHx5IT09ZVtkK3BdKXtsPSEwO2JyZWFrfX19aWYobCl7aWYoYSE9PW8pe3Rbb109dFthXTtjb25zdCBoPWEqbixmPW8qbjtmb3IobGV0IGQ9MDtkIT09bjsrK2QpZVtmK2RdPWVbaCtkXX0rK299fWlmKHM+MCl7dFtvXT10W3NdO2ZvcihsZXQgYT1zKm4sbD1vKm4sYz0wO2MhPT1uOysrYyllW2wrY109ZVthK2NdOysrb31yZXR1cm4gbyE9PXQubGVuZ3RoPyh0aGlzLnRpbWVzPXQuc2xpY2UoMCxvKSx0aGlzLnZhbHVlcz1lLnNsaWNlKDAsbypuKSk6KHRoaXMudGltZXM9dCx0aGlzLnZhbHVlcz1lKSx0aGlzfWNsb25lKCl7Y29uc3QgdD10aGlzLnRpbWVzLnNsaWNlKCksZT10aGlzLnZhbHVlcy5zbGljZSgpLG49dGhpcy5jb25zdHJ1Y3RvcixyPW5ldyBuKHRoaXMubmFtZSx0LGUpO3JldHVybiByLmNyZWF0ZUludGVycG9sYW50PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQscn19ZGkucHJvdG90eXBlLlRpbWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSxkaS5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSxkaS5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249SWM7Y2xhc3MgZnMgZXh0ZW5kcyBkaXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlLG4pfX1mcy5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iYm9vbCIsZnMucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZT1BcnJheSxmcy5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249eGEsZnMucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcj12b2lkIDAsZnMucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgeXAgZXh0ZW5kcyBkaXt9eXAucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9ImNvbG9yIjtjbGFzcyBKYSBleHRlbmRzIGRpe31KYS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0ibnVtYmVyIjtjbGFzcyAkXyBleHRlbmRzIFphe2NvbnN0cnVjdG9yKHQsZSxuLHIpe3N1cGVyKHQsZSxuLHIpfWludGVycG9sYXRlXyh0LGUsbixyKXtjb25zdCBzPXRoaXMucmVzdWx0QnVmZmVyLG89dGhpcy5zYW1wbGVWYWx1ZXMsYT10aGlzLnZhbHVlU2l6ZSxsPShuLWUpLyhyLWUpO2xldCBjPXQqYTtmb3IobGV0IHU9YythO2MhPT11O2MrPTQpTW4uc2xlcnBGbGF0KHMsMCxvLGMtYSxvLGMsbCk7cmV0dXJuIHN9fWNsYXNzIGphIGV4dGVuZHMgZGl7SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHQpe3JldHVybiBuZXcgJF8odGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfX1qYS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0icXVhdGVybmlvbiIsamEucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgZHMgZXh0ZW5kcyBkaXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlLG4pfX1kcy5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0ic3RyaW5nIixkcy5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LGRzLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj14YSxkcy5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxkcy5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyBLYSBleHRlbmRzIGRpe31LYS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0idmVjdG9yIjtjbGFzcyBRYXtjb25zdHJ1Y3Rvcih0PSIiLGU9LTEsbj1bXSxyPURjKXt0aGlzLm5hbWU9dCx0aGlzLnRyYWNrcz1uLHRoaXMuZHVyYXRpb249ZSx0aGlzLmJsZW5kTW9kZT1yLHRoaXMudXVpZD1ObigpLHRoaXMuZHVyYXRpb248MCYmdGhpcy5yZXNldER1cmF0aW9uKCl9c3RhdGljIHBhcnNlKHQpe2NvbnN0IGU9W10sbj10LnRyYWNrcyxyPTEvKHQuZnBzfHwxKTtmb3IobGV0IG89MCxhPW4ubGVuZ3RoO28hPT1hOysrbyllLnB1c2goSEUobltvXSkuc2NhbGUocikpO2NvbnN0IHM9bmV3IHRoaXModC5uYW1lLHQuZHVyYXRpb24sZSx0LmJsZW5kTW9kZSk7cmV0dXJuIHMudXVpZD10LnV1aWQsc31zdGF0aWMgdG9KU09OKHQpe2NvbnN0IGU9W10sbj10LnRyYWNrcyxyPXtuYW1lOnQubmFtZSxkdXJhdGlvbjp0LmR1cmF0aW9uLHRyYWNrczplLHV1aWQ6dC51dWlkLGJsZW5kTW9kZTp0LmJsZW5kTW9kZX07Zm9yKGxldCBzPTAsbz1uLmxlbmd0aDtzIT09bzsrK3MpZS5wdXNoKGRpLnRvSlNPTihuW3NdKSk7cmV0dXJuIHJ9c3RhdGljIENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKHQsZSxuLHIpe2NvbnN0IHM9ZS5sZW5ndGgsbz1bXTtmb3IobGV0IGE9MDthPHM7YSsrKXtsZXQgbD1bXSxjPVtdO2wucHVzaCgoYStzLTEpJXMsYSwoYSsxKSVzKSxjLnB1c2goMCwxLDApO2NvbnN0IHU9R18obCk7bD1wcChsLDEsdSksYz1wcChjLDEsdSksIXImJmxbMF09PT0wJiYobC5wdXNoKHMpLGMucHVzaChjWzBdKSksby5wdXNoKG5ldyBKYSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2VbYV0ubmFtZSsiXSIsbCxjKS5zY2FsZSgxL24pKX1yZXR1cm4gbmV3IHRoaXModCwtMSxvKX1zdGF0aWMgZmluZEJ5TmFtZSh0LGUpe2xldCBuPXQ7aWYoIUFycmF5LmlzQXJyYXkodCkpe2NvbnN0IHI9dDtuPXIuZ2VvbWV0cnkmJnIuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8ci5hbmltYXRpb25zfWZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKWlmKG5bcl0ubmFtZT09PWUpcmV0dXJuIG5bcl07cmV0dXJuIG51bGx9c3RhdGljIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKHQsZSxuKXtjb25zdCByPXt9LHM9L14oW1x3LV0qPykoW1xkXSspJC87Zm9yKGxldCBhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXtjb25zdCBjPXRbYV0sdT1jLm5hbWUubWF0Y2gocyk7aWYodSYmdS5sZW5ndGg+MSl7Y29uc3QgaD11WzFdO2xldCBmPXJbaF07Znx8KHJbaF09Zj1bXSksZi5wdXNoKGMpfX1jb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIHIpby5wdXNoKHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoYSxyW2FdLGUsbikpO3JldHVybiBvfXN0YXRpYyBwYXJzZUFuaW1hdGlvbih0LGUpe2lmKCF0KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7Y29uc3Qgbj1mdW5jdGlvbihoLGYsZCxwLHkpe2lmKGQubGVuZ3RoIT09MCl7Y29uc3QgZz1bXSxtPVtdO21wKGQsZyxtLHApLGcubGVuZ3RoIT09MCYmeS5wdXNoKG5ldyBoKGYsZyxtKSl9fSxyPVtdLHM9dC5uYW1lfHwiZGVmYXVsdCIsbz10LmZwc3x8MzAsYT10LmJsZW5kTW9kZTtsZXQgbD10Lmxlbmd0aHx8LTE7Y29uc3QgYz10LmhpZXJhcmNoeXx8W107Zm9yKGxldCBoPTA7aDxjLmxlbmd0aDtoKyspe2NvbnN0IGY9Y1toXS5rZXlzO2lmKCEoIWZ8fGYubGVuZ3RoPT09MCkpaWYoZlswXS5tb3JwaFRhcmdldHMpe2NvbnN0IGQ9e307bGV0IHA7Zm9yKHA9MDtwPGYubGVuZ3RoO3ArKylpZihmW3BdLm1vcnBoVGFyZ2V0cylmb3IobGV0IHk9MDt5PGZbcF0ubW9ycGhUYXJnZXRzLmxlbmd0aDt5KyspZFtmW3BdLm1vcnBoVGFyZ2V0c1t5XV09LTE7Zm9yKGNvbnN0IHkgaW4gZCl7Y29uc3QgZz1bXSxtPVtdO2ZvcihsZXQgdj0wO3YhPT1mW3BdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7Kyt2KXtjb25zdCB4PWZbcF07Zy5wdXNoKHgudGltZSksbS5wdXNoKHgubW9ycGhUYXJnZXQ9PT15PzE6MCl9ci5wdXNoKG5ldyBKYSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWyIreSsiXSIsZyxtKSl9bD1kLmxlbmd0aCpvfWVsc2V7Y29uc3QgZD0iLmJvbmVzWyIrZVtoXS5uYW1lKyJdIjtuKEthLGQrIi5wb3NpdGlvbiIsZiwicG9zIixyKSxuKGphLGQrIi5xdWF0ZXJuaW9uIixmLCJyb3QiLHIpLG4oS2EsZCsiLnNjYWxlIixmLCJzY2wiLHIpfX1yZXR1cm4gci5sZW5ndGg9PT0wP251bGw6bmV3IHRoaXMocyxsLHIsYSl9cmVzZXREdXJhdGlvbigpe2NvbnN0IHQ9dGhpcy50cmFja3M7bGV0IGU9MDtmb3IobGV0IG49MCxyPXQubGVuZ3RoO24hPT1yOysrbil7Y29uc3Qgcz10aGlzLnRyYWNrc1tuXTtlPU1hdGgubWF4KGUscy50aW1lc1tzLnRpbWVzLmxlbmd0aC0xXSl9cmV0dXJuIHRoaXMuZHVyYXRpb249ZSx0aGlzfXRyaW0oKXtmb3IobGV0IHQ9MDt0PHRoaXMudHJhY2tzLmxlbmd0aDt0KyspdGhpcy50cmFja3NbdF0udHJpbSgwLHRoaXMuZHVyYXRpb24pO3JldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IHQ9ITA7Zm9yKGxldCBlPTA7ZTx0aGlzLnRyYWNrcy5sZW5ndGg7ZSsrKXQ9dCYmdGhpcy50cmFja3NbZV0udmFsaWRhdGUoKTtyZXR1cm4gdH1vcHRpbWl6ZSgpe2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyl0aGlzLnRyYWNrc1t0XS5vcHRpbWl6ZSgpO3JldHVybiB0aGlzfWNsb25lKCl7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdC5wdXNoKHRoaXMudHJhY2tzW2VdLmNsb25lKCkpO3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm5hbWUsdGhpcy5kdXJhdGlvbix0LHRoaXMuYmxlbmRNb2RlKX10b0pTT04oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b0pTT04odGhpcyl9fWZ1bmN0aW9uIEdFKGkpe3N3aXRjaChpLnRvTG93ZXJDYXNlKCkpe2Nhc2Uic2NhbGFyIjpjYXNlImRvdWJsZSI6Y2FzZSJmbG9hdCI6Y2FzZSJudW1iZXIiOmNhc2UiaW50ZWdlciI6cmV0dXJuIEphO2Nhc2UidmVjdG9yIjpjYXNlInZlY3RvcjIiOmNhc2UidmVjdG9yMyI6Y2FzZSJ2ZWN0b3I0IjpyZXR1cm4gS2E7Y2FzZSJjb2xvciI6cmV0dXJuIHlwO2Nhc2UicXVhdGVybmlvbiI6cmV0dXJuIGphO2Nhc2UiYm9vbCI6Y2FzZSJib29sZWFuIjpyZXR1cm4gZnM7Y2FzZSJzdHJpbmciOnJldHVybiBkc310aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFVuc3VwcG9ydGVkIHR5cGVOYW1lOiAiK2kpfWZ1bmN0aW9uIEhFKGkpe2lmKGkudHlwZT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlIik7Y29uc3QgdD1HRShpLnR5cGUpO2lmKGkudGltZXM9PT12b2lkIDApe2NvbnN0IGU9W10sbj1bXTttcChpLmtleXMsZSxuLCJ2YWx1ZSIpLGkudGltZXM9ZSxpLnZhbHVlcz1ufXJldHVybiB0LnBhcnNlIT09dm9pZCAwP3QucGFyc2UoaSk6bmV3IHQoaS5uYW1lLGkudGltZXMsaS52YWx1ZXMsaS5pbnRlcnBvbGF0aW9uKX1jb25zdCBqaT17ZW5hYmxlZDohMSxmaWxlczp7fSxhZGQ6ZnVuY3Rpb24oaSx0KXt0aGlzLmVuYWJsZWQhPT0hMSYmKHRoaXMuZmlsZXNbaV09dCl9LGdldDpmdW5jdGlvbihpKXtpZih0aGlzLmVuYWJsZWQhPT0hMSlyZXR1cm4gdGhpcy5maWxlc1tpXX0scmVtb3ZlOmZ1bmN0aW9uKGkpe2RlbGV0ZSB0aGlzLmZpbGVzW2ldfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuZmlsZXM9e319fTtjbGFzcyBfcHtjb25zdHJ1Y3Rvcih0LGUsbil7Y29uc3Qgcj10aGlzO2xldCBzPSExLG89MCxhPTAsbDtjb25zdCBjPVtdO3RoaXMub25TdGFydD12b2lkIDAsdGhpcy5vbkxvYWQ9dCx0aGlzLm9uUHJvZ3Jlc3M9ZSx0aGlzLm9uRXJyb3I9bix0aGlzLml0ZW1TdGFydD1mdW5jdGlvbih1KXthKysscz09PSExJiZyLm9uU3RhcnQhPT12b2lkIDAmJnIub25TdGFydCh1LG8sYSkscz0hMH0sdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKHUpe28rKyxyLm9uUHJvZ3Jlc3MhPT12b2lkIDAmJnIub25Qcm9ncmVzcyh1LG8sYSksbz09PWEmJihzPSExLHIub25Mb2FkIT09dm9pZCAwJiZyLm9uTG9hZCgpKX0sdGhpcy5pdGVtRXJyb3I9ZnVuY3Rpb24odSl7ci5vbkVycm9yIT09dm9pZCAwJiZyLm9uRXJyb3IodSl9LHRoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbih1KXtyZXR1cm4gbD9sKHUpOnV9LHRoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24odSl7cmV0dXJuIGw9dSx0aGlzfSx0aGlzLmFkZEhhbmRsZXI9ZnVuY3Rpb24odSxoKXtyZXR1cm4gYy5wdXNoKHUsaCksdGhpc30sdGhpcy5yZW1vdmVIYW5kbGVyPWZ1bmN0aW9uKHUpe2NvbnN0IGg9Yy5pbmRleE9mKHUpO3JldHVybiBoIT09LTEmJmMuc3BsaWNlKGgsMiksdGhpc30sdGhpcy5nZXRIYW5kbGVyPWZ1bmN0aW9uKHUpe2ZvcihsZXQgaD0wLGY9Yy5sZW5ndGg7aDxmO2grPTIpe2NvbnN0IGQ9Y1toXSxwPWNbaCsxXTtpZihkLmdsb2JhbCYmKGQubGFzdEluZGV4PTApLGQudGVzdCh1KSlyZXR1cm4gcH1yZXR1cm4gbnVsbH19fWNvbnN0IFhfPW5ldyBfcDtjbGFzcyBBbntjb25zdHJ1Y3Rvcih0KXt0aGlzLm1hbmFnZXI9dCE9PXZvaWQgMD90OlhfLHRoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyIsdGhpcy53aXRoQ3JlZGVudGlhbHM9ITEsdGhpcy5wYXRoPSIiLHRoaXMucmVzb3VyY2VQYXRoPSIiLHRoaXMucmVxdWVzdEhlYWRlcj17fX1sb2FkKCl7fWxvYWRBc3luYyh0LGUpe2NvbnN0IG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocixzKXtuLmxvYWQodCxyLGUscyl9KX1wYXJzZSgpe31zZXRDcm9zc09yaWdpbih0KXtyZXR1cm4gdGhpcy5jcm9zc09yaWdpbj10LHRoaXN9c2V0V2l0aENyZWRlbnRpYWxzKHQpe3JldHVybiB0aGlzLndpdGhDcmVkZW50aWFscz10LHRoaXN9c2V0UGF0aCh0KXtyZXR1cm4gdGhpcy5wYXRoPXQsdGhpc31zZXRSZXNvdXJjZVBhdGgodCl7cmV0dXJuIHRoaXMucmVzb3VyY2VQYXRoPXQsdGhpc31zZXRSZXF1ZXN0SGVhZGVyKHQpe3JldHVybiB0aGlzLnJlcXVlc3RIZWFkZXI9dCx0aGlzfX1Bbi5ERUZBVUxUX01BVEVSSUFMX05BTUU9Il9fREVGQVVMVCI7Y29uc3QgS2k9e307Y2xhc3MgV0UgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQpLHRoaXMucmVzcG9uc2U9ZX19Y2xhc3MgUWkgZXh0ZW5kcyBBbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLHIpe3Q9PT12b2lkIDAmJih0PSIiKSx0aGlzLnBhdGghPT12b2lkIDAmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHM9amkuZ2V0KHQpO2lmKHMhPT12b2lkIDApcmV0dXJuIHRoaXMubWFuYWdlci5pdGVtU3RhcnQodCksc2V0VGltZW91dCgoKT0+e2UmJmUocyksdGhpcy5tYW5hZ2VyLml0ZW1FbmQodCl9LDApLHM7aWYoS2lbdF0hPT12b2lkIDApe0tpW3RdLnB1c2goe29uTG9hZDplLG9uUHJvZ3Jlc3M6bixvbkVycm9yOnJ9KTtyZXR1cm59S2lbdF09W10sS2lbdF0ucHVzaCh7b25Mb2FkOmUsb25Qcm9ncmVzczpuLG9uRXJyb3I6cn0pO2NvbnN0IG89bmV3IFJlcXVlc3QodCx7aGVhZGVyczpuZXcgSGVhZGVycyh0aGlzLnJlcXVlc3RIZWFkZXIpLGNyZWRlbnRpYWxzOnRoaXMud2l0aENyZWRlbnRpYWxzPyJpbmNsdWRlIjoic2FtZS1vcmlnaW4ifSksYT10aGlzLm1pbWVUeXBlLGw9dGhpcy5yZXNwb25zZVR5cGU7ZmV0Y2gobykudGhlbihjPT57aWYoYy5zdGF0dXM9PT0yMDB8fGMuc3RhdHVzPT09MCl7aWYoYy5zdGF0dXM9PT0wJiZjb25zb2xlLndhcm4oIlRIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuIiksdHlwZW9mIFJlYWRhYmxlU3RyZWFtPT0idW5kZWZpbmVkInx8Yy5ib2R5PT09dm9pZCAwfHxjLmJvZHkuZ2V0UmVhZGVyPT09dm9pZCAwKXJldHVybiBjO2NvbnN0IHU9S2lbdF0saD1jLmJvZHkuZ2V0UmVhZGVyKCksZj1jLmhlYWRlcnMuZ2V0KCJYLUZpbGUtU2l6ZSIpfHxjLmhlYWRlcnMuZ2V0KCJDb250ZW50LUxlbmd0aCIpLGQ9Zj9wYXJzZUludChmKTowLHA9ZCE9PTA7bGV0IHk9MDtjb25zdCBnPW5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQobSl7digpO2Z1bmN0aW9uIHYoKXtoLnJlYWQoKS50aGVuKCh7ZG9uZTp4LHZhbHVlOl99KT0+e2lmKHgpbS5jbG9zZSgpO2Vsc2V7eSs9Xy5ieXRlTGVuZ3RoO2NvbnN0IE09bmV3IFByb2dyZXNzRXZlbnQoInByb2dyZXNzIix7bGVuZ3RoQ29tcHV0YWJsZTpwLGxvYWRlZDp5LHRvdGFsOmR9KTtmb3IobGV0IGI9MCxBPXUubGVuZ3RoO2I8QTtiKyspe2NvbnN0IEU9dVtiXTtFLm9uUHJvZ3Jlc3MmJkUub25Qcm9ncmVzcyhNKX1tLmVucXVldWUoXyksdigpfX0seD0+e20uZXJyb3IoeCl9KX19fSk7cmV0dXJuIG5ldyBSZXNwb25zZShnKX1lbHNlIHRocm93IG5ldyBXRShgZmV0Y2ggZm9yICIke2MudXJsfSIgcmVzcG9uZGVkIHdpdGggJHtjLnN0YXR1c306ICR7Yy5zdGF0dXNUZXh0fWAsYyl9KS50aGVuKGM9Pntzd2l0Y2gobCl7Y2FzZSJhcnJheWJ1ZmZlciI6cmV0dXJuIGMuYXJyYXlCdWZmZXIoKTtjYXNlImJsb2IiOnJldHVybiBjLmJsb2IoKTtjYXNlImRvY3VtZW50IjpyZXR1cm4gYy50ZXh0KCkudGhlbih1PT5uZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHUsYSkpO2Nhc2UianNvbiI6cmV0dXJuIGMuanNvbigpO2RlZmF1bHQ6aWYoYT09PXZvaWQgMClyZXR1cm4gYy50ZXh0KCk7e2NvbnN0IGg9L2NoYXJzZXQ9Ij8oW147IlxzXSopIj8vaS5leGVjKGEpLGY9aCYmaFsxXT9oWzFdLnRvTG93ZXJDYXNlKCk6dm9pZCAwLGQ9bmV3IFRleHREZWNvZGVyKGYpO3JldHVybiBjLmFycmF5QnVmZmVyKCkudGhlbihwPT5kLmRlY29kZShwKSl9fX0pLnRoZW4oYz0+e2ppLmFkZCh0LGMpO2NvbnN0IHU9S2lbdF07ZGVsZXRlIEtpW3RdO2ZvcihsZXQgaD0wLGY9dS5sZW5ndGg7aDxmO2grKyl7Y29uc3QgZD11W2hdO2Qub25Mb2FkJiZkLm9uTG9hZChjKX19KS5jYXRjaChjPT57Y29uc3QgdT1LaVt0XTtpZih1PT09dm9pZCAwKXRocm93IHRoaXMubWFuYWdlci5pdGVtRXJyb3IodCksYztkZWxldGUgS2lbdF07Zm9yKGxldCBoPTAsZj11Lmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPXVbaF07ZC5vbkVycm9yJiZkLm9uRXJyb3IoYyl9dGhpcy5tYW5hZ2VyLml0ZW1FcnJvcih0KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLm1hbmFnZXIuaXRlbUVuZCh0KX0pLHRoaXMubWFuYWdlci5pdGVtU3RhcnQodCl9c2V0UmVzcG9uc2VUeXBlKHQpe3JldHVybiB0aGlzLnJlc3BvbnNlVHlwZT10LHRoaXN9c2V0TWltZVR5cGUodCl7cmV0dXJuIHRoaXMubWltZVR5cGU9dCx0aGlzfX1jbGFzcyAkRSBleHRlbmRzIEFue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz10aGlzLG89bmV3IFFpKHRoaXMubWFuYWdlcik7by5zZXRQYXRoKHRoaXMucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZCh0LGZ1bmN0aW9uKGEpe3RyeXtlKHMucGFyc2UoSlNPTi5wYXJzZShhKSkpfWNhdGNoKGwpe3I/cihsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IodCl9fSxuLHIpfXBhcnNlKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9UWEucGFyc2UodFtuXSk7ZS5wdXNoKHIpfXJldHVybiBlfX1jbGFzcyBYRSBleHRlbmRzIEFue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz10aGlzLG89W10sYT1uZXcgX3UsbD1uZXcgUWkodGhpcy5tYW5hZ2VyKTtsLnNldFBhdGgodGhpcy5wYXRoKSxsLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSxsLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxsLnNldFdpdGhDcmVkZW50aWFscyhzLndpdGhDcmVkZW50aWFscyk7bGV0IGM9MDtmdW5jdGlvbiB1KGgpe2wubG9hZCh0W2hdLGZ1bmN0aW9uKGYpe2NvbnN0IGQ9cy5wYXJzZShmLCEwKTtvW2hdPXt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodCxmb3JtYXQ6ZC5mb3JtYXQsbWlwbWFwczpkLm1pcG1hcHN9LGMrPTEsYz09PTYmJihkLm1pcG1hcENvdW50PT09MSYmKGEubWluRmlsdGVyPVZlKSxhLmltYWdlPW8sYS5mb3JtYXQ9ZC5mb3JtYXQsYS5uZWVkc1VwZGF0ZT0hMCxlJiZlKGEpKX0sbixyKX1pZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgaD0wLGY9dC5sZW5ndGg7aDxmOysraCl1KGgpO2Vsc2UgbC5sb2FkKHQsZnVuY3Rpb24oaCl7Y29uc3QgZj1zLnBhcnNlKGgsITApO2lmKGYuaXNDdWJlbWFwKXtjb25zdCBkPWYubWlwbWFwcy5sZW5ndGgvZi5taXBtYXBDb3VudDtmb3IobGV0IHA9MDtwPGQ7cCsrKXtvW3BdPXttaXBtYXBzOltdfTtmb3IobGV0IHk9MDt5PGYubWlwbWFwQ291bnQ7eSsrKW9bcF0ubWlwbWFwcy5wdXNoKGYubWlwbWFwc1twKmYubWlwbWFwQ291bnQreV0pLG9bcF0uZm9ybWF0PWYuZm9ybWF0LG9bcF0ud2lkdGg9Zi53aWR0aCxvW3BdLmhlaWdodD1mLmhlaWdodH1hLmltYWdlPW99ZWxzZSBhLmltYWdlLndpZHRoPWYud2lkdGgsYS5pbWFnZS5oZWlnaHQ9Zi5oZWlnaHQsYS5taXBtYXBzPWYubWlwbWFwcztmLm1pcG1hcENvdW50PT09MSYmKGEubWluRmlsdGVyPVZlKSxhLmZvcm1hdD1mLmZvcm1hdCxhLm5lZWRzVXBkYXRlPSEwLGUmJmUoYSl9LG4scik7cmV0dXJuIGF9fWNsYXNzIHRsIGV4dGVuZHMgQW57Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixyKXt0aGlzLnBhdGghPT12b2lkIDAmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHM9dGhpcyxvPWppLmdldCh0KTtpZihvIT09dm9pZCAwKXJldHVybiBzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZlKG8pLHMubWFuYWdlci5pdGVtRW5kKHQpfSwwKSxvO2NvbnN0IGE9QWEoImltZyIpO2Z1bmN0aW9uIGwoKXt1KCksamkuYWRkKHQsdGhpcyksZSYmZSh0aGlzKSxzLm1hbmFnZXIuaXRlbUVuZCh0KX1mdW5jdGlvbiBjKGgpe3UoKSxyJiZyKGgpLHMubWFuYWdlci5pdGVtRXJyb3IodCkscy5tYW5hZ2VyLml0ZW1FbmQodCl9ZnVuY3Rpb24gdSgpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsbCwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsYywhMSl9cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbCwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYywhMSksdC5zbGljZSgwLDUpIT09ImRhdGE6IiYmdGhpcy5jcm9zc09yaWdpbiE9PXZvaWQgMCYmKGEuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbikscy5tYW5hZ2VyLml0ZW1TdGFydCh0KSxhLnNyYz10LGF9fWNsYXNzIHFFIGV4dGVuZHMgQW57Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixyKXtjb25zdCBzPW5ldyBJYTtzLmNvbG9yU3BhY2U9U247Y29uc3Qgbz1uZXcgdGwodGhpcy5tYW5hZ2VyKTtvLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLG8uc2V0UGF0aCh0aGlzLnBhdGgpO2xldCBhPTA7ZnVuY3Rpb24gbChjKXtvLmxvYWQodFtjXSxmdW5jdGlvbih1KXtzLmltYWdlc1tjXT11LGErKyxhPT09NiYmKHMubmVlZHNVcGRhdGU9ITAsZSYmZShzKSl9LHZvaWQgMCxyKX1mb3IobGV0IGM9MDtjPHQubGVuZ3RoOysrYylsKGMpO3JldHVybiBzfX1jbGFzcyBZRSBleHRlbmRzIEFue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz10aGlzLG89bmV3IENpLGE9bmV3IFFpKHRoaXMubWFuYWdlcik7cmV0dXJuIGEuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHMud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCxmdW5jdGlvbihsKXtsZXQgYzt0cnl7Yz1zLnBhcnNlKGwpfWNhdGNoKHUpe2lmKHIhPT12b2lkIDApcih1KTtlbHNle2NvbnNvbGUuZXJyb3IodSk7cmV0dXJufX1jLmltYWdlIT09dm9pZCAwP28uaW1hZ2U9Yy5pbWFnZTpjLmRhdGEhPT12b2lkIDAmJihvLmltYWdlLndpZHRoPWMud2lkdGgsby5pbWFnZS5oZWlnaHQ9Yy5oZWlnaHQsby5pbWFnZS5kYXRhPWMuZGF0YSksby53cmFwUz1jLndyYXBTIT09dm9pZCAwP2Mud3JhcFM6cW4sby53cmFwVD1jLndyYXBUIT09dm9pZCAwP2Mud3JhcFQ6cW4sby5tYWdGaWx0ZXI9Yy5tYWdGaWx0ZXIhPT12b2lkIDA/Yy5tYWdGaWx0ZXI6VmUsby5taW5GaWx0ZXI9Yy5taW5GaWx0ZXIhPT12b2lkIDA/Yy5taW5GaWx0ZXI6VmUsby5hbmlzb3Ryb3B5PWMuYW5pc290cm9weSE9PXZvaWQgMD9jLmFuaXNvdHJvcHk6MSxjLmNvbG9yU3BhY2UhPT12b2lkIDAmJihvLmNvbG9yU3BhY2U9Yy5jb2xvclNwYWNlKSxjLmZsaXBZIT09dm9pZCAwJiYoby5mbGlwWT1jLmZsaXBZKSxjLmZvcm1hdCE9PXZvaWQgMCYmKG8uZm9ybWF0PWMuZm9ybWF0KSxjLnR5cGUhPT12b2lkIDAmJihvLnR5cGU9Yy50eXBlKSxjLm1pcG1hcHMhPT12b2lkIDAmJihvLm1pcG1hcHM9Yy5taXBtYXBzLG8ubWluRmlsdGVyPXdpKSxjLm1pcG1hcENvdW50PT09MSYmKG8ubWluRmlsdGVyPVZlKSxjLmdlbmVyYXRlTWlwbWFwcyE9PXZvaWQgMCYmKG8uZ2VuZXJhdGVNaXBtYXBzPWMuZ2VuZXJhdGVNaXBtYXBzKSxvLm5lZWRzVXBkYXRlPSEwLGUmJmUobyxjKX0sbixyKSxvfX1jbGFzcyBaRSBleHRlbmRzIEFue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz1uZXcgVGUsbz1uZXcgdGwodGhpcy5tYW5hZ2VyKTtyZXR1cm4gby5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKSxvLnNldFBhdGgodGhpcy5wYXRoKSxvLmxvYWQodCxmdW5jdGlvbihhKXtzLmltYWdlPWEscy5uZWVkc1VwZGF0ZT0hMCxlIT09dm9pZCAwJiZlKHMpfSxuLHIpLHN9fWNsYXNzIFRyIGV4dGVuZHMgYWV7Y29uc3RydWN0b3IodCxlPTEpe3N1cGVyKCksdGhpcy5pc0xpZ2h0PSEwLHRoaXMudHlwZT0iTGlnaHQiLHRoaXMuY29sb3I9bmV3IHh0KHQpLHRoaXMuaW50ZW5zaXR5PWV9ZGlzcG9zZSgpe31jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCksZS5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5LHRoaXMuZ3JvdW5kQ29sb3IhPT12b2lkIDAmJihlLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKSx0aGlzLmRpc3RhbmNlIT09dm9pZCAwJiYoZS5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSksdGhpcy5hbmdsZSE9PXZvaWQgMCYmKGUub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpLHRoaXMuZGVjYXkhPT12b2lkIDAmJihlLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KSx0aGlzLnBlbnVtYnJhIT09dm9pZCAwJiYoZS5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSksdGhpcy5zaGFkb3chPT12b2lkIDAmJihlLm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpLHRoaXMudGFyZ2V0IT09dm9pZCAwJiYoZS5vYmplY3QudGFyZ2V0PXRoaXMudGFyZ2V0LnV1aWQpLGV9fWNsYXNzIHFfIGV4dGVuZHMgVHJ7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsbiksdGhpcy5pc0hlbWlzcGhlcmVMaWdodD0hMCx0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KGFlLkRFRkFVTFRfVVApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5ncm91bmRDb2xvcj1uZXcgeHQoZSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5ncm91bmRDb2xvci5jb3B5KHQuZ3JvdW5kQ29sb3IpLHRoaXN9fWNvbnN0IHhwPW5ldyBSdCxZXz1uZXcgUixaXz1uZXcgUjtjbGFzcyB2cHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmNhbWVyYT10LHRoaXMuaW50ZW5zaXR5PTEsdGhpcy5iaWFzPTAsdGhpcy5ub3JtYWxCaWFzPTAsdGhpcy5yYWRpdXM9MSx0aGlzLmJsdXJTYW1wbGVzPTgsdGhpcy5tYXBTaXplPW5ldyBYKDUxMiw1MTIpLHRoaXMubWFwPW51bGwsdGhpcy5tYXBQYXNzPW51bGwsdGhpcy5tYXRyaXg9bmV3IFJ0LHRoaXMuYXV0b1VwZGF0ZT0hMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMuX2ZydXN0dW09bmV3IEJhLHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgWCgxLDEpLHRoaXMuX3ZpZXdwb3J0Q291bnQ9MSx0aGlzLl92aWV3cG9ydHM9W25ldyBRdCgwLDAsMSwxKV19Z2V0Vmlld3BvcnRDb3VudCgpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fWdldEZydXN0dW0oKXtyZXR1cm4gdGhpcy5fZnJ1c3R1bX11cGRhdGVNYXRyaWNlcyh0KXtjb25zdCBlPXRoaXMuY2FtZXJhLG49dGhpcy5tYXRyaXg7WV8uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLGUucG9zaXRpb24uY29weShZXyksWl8uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSxlLmxvb2tBdChaXyksZS51cGRhdGVNYXRyaXhXb3JsZCgpLHhwLm11bHRpcGx5TWF0cmljZXMoZS5wcm9qZWN0aW9uTWF0cml4LGUubWF0cml4V29ybGRJbnZlcnNlKSx0aGlzLl9mcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KHhwKSxuLnNldCguNSwwLDAsLjUsMCwuNSwwLC41LDAsMCwuNSwuNSwwLDAsMCwxKSxuLm11bHRpcGx5KHhwKX1nZXRWaWV3cG9ydCh0KXtyZXR1cm4gdGhpcy5fdmlld3BvcnRzW3RdfWdldEZyYW1lRXh0ZW50cygpe3JldHVybiB0aGlzLl9mcmFtZUV4dGVudHN9ZGlzcG9zZSgpe3RoaXMubWFwJiZ0aGlzLm1hcC5kaXNwb3NlKCksdGhpcy5tYXBQYXNzJiZ0aGlzLm1hcFBhc3MuZGlzcG9zZSgpfWNvcHkodCl7cmV0dXJuIHRoaXMuY2FtZXJhPXQuY2FtZXJhLmNsb25lKCksdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpcy5iaWFzPXQuYmlhcyx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLm1hcFNpemUuY29weSh0Lm1hcFNpemUpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e307cmV0dXJuIHRoaXMuaW50ZW5zaXR5IT09MSYmKHQuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5KSx0aGlzLmJpYXMhPT0wJiYodC5iaWFzPXRoaXMuYmlhcyksdGhpcy5ub3JtYWxCaWFzIT09MCYmKHQubm9ybWFsQmlhcz10aGlzLm5vcm1hbEJpYXMpLHRoaXMucmFkaXVzIT09MSYmKHQucmFkaXVzPXRoaXMucmFkaXVzKSwodGhpcy5tYXBTaXplLnghPT01MTJ8fHRoaXMubWFwU2l6ZS55IT09NTEyKSYmKHQubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpKSx0LmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdCxkZWxldGUgdC5jYW1lcmEubWF0cml4LHR9fWNsYXNzIEpFIGV4dGVuZHMgdnB7Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgWWUoNTAsMSwuNSw1MDApKSx0aGlzLmlzU3BvdExpZ2h0U2hhZG93PSEwLHRoaXMuZm9jdXM9MX11cGRhdGVNYXRyaWNlcyh0KXtjb25zdCBlPXRoaXMuY2FtZXJhLG49anMqMip0LmFuZ2xlKnRoaXMuZm9jdXMscj10aGlzLm1hcFNpemUud2lkdGgvdGhpcy5tYXBTaXplLmhlaWdodCxzPXQuZGlzdGFuY2V8fGUuZmFyOyhuIT09ZS5mb3Z8fHIhPT1lLmFzcGVjdHx8cyE9PWUuZmFyKSYmKGUuZm92PW4sZS5hc3BlY3Q9cixlLmZhcj1zLGUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKSxzdXBlci51cGRhdGVNYXRyaWNlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZm9jdXM9dC5mb2N1cyx0aGlzfX1jbGFzcyBKXyBleHRlbmRzIFRye2NvbnN0cnVjdG9yKHQsZSxuPTAscj1NYXRoLlBJLzMscz0wLG89Mil7c3VwZXIodCxlKSx0aGlzLmlzU3BvdExpZ2h0PSEwLHRoaXMudHlwZT0iU3BvdExpZ2h0Iix0aGlzLnBvc2l0aW9uLmNvcHkoYWUuREVGQVVMVF9VUCksdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLnRhcmdldD1uZXcgYWUsdGhpcy5kaXN0YW5jZT1uLHRoaXMuYW5nbGU9cix0aGlzLnBlbnVtYnJhPXMsdGhpcy5kZWNheT1vLHRoaXMubWFwPW51bGwsdGhpcy5zaGFkb3c9bmV3IEpFfWdldCBwb3dlcigpe3JldHVybiB0aGlzLmludGVuc2l0eSpNYXRoLlBJfXNldCBwb3dlcih0KXt0aGlzLmludGVuc2l0eT10L01hdGguUEl9ZGlzcG9zZSgpe3RoaXMuc2hhZG93LmRpc3Bvc2UoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmRpc3RhbmNlPXQuZGlzdGFuY2UsdGhpcy5hbmdsZT10LmFuZ2xlLHRoaXMucGVudW1icmE9dC5wZW51bWJyYSx0aGlzLmRlY2F5PXQuZGVjYXksdGhpcy50YXJnZXQ9dC50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fWNvbnN0IGpfPW5ldyBSdCxlbD1uZXcgUixTcD1uZXcgUjtjbGFzcyBqRSBleHRlbmRzIHZwe2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IFllKDkwLDEsLjUsNTAwKSksdGhpcy5pc1BvaW50TGlnaHRTaGFkb3c9ITAsdGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBYKDQsMiksdGhpcy5fdmlld3BvcnRDb3VudD02LHRoaXMuX3ZpZXdwb3J0cz1bbmV3IFF0KDIsMSwxLDEpLG5ldyBRdCgwLDEsMSwxKSxuZXcgUXQoMywxLDEsMSksbmV3IFF0KDEsMSwxLDEpLG5ldyBRdCgzLDAsMSwxKSxuZXcgUXQoMSwwLDEsMSldLHRoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgUigxLDAsMCksbmV3IFIoLTEsMCwwKSxuZXcgUigwLDAsMSksbmV3IFIoMCwwLC0xKSxuZXcgUigwLDEsMCksbmV3IFIoMCwtMSwwKV0sdGhpcy5fY3ViZVVwcz1bbmV3IFIoMCwxLDApLG5ldyBSKDAsMSwwKSxuZXcgUigwLDEsMCksbmV3IFIoMCwxLDApLG5ldyBSKDAsMCwxKSxuZXcgUigwLDAsLTEpXX11cGRhdGVNYXRyaWNlcyh0LGU9MCl7Y29uc3Qgbj10aGlzLmNhbWVyYSxyPXRoaXMubWF0cml4LHM9dC5kaXN0YW5jZXx8bi5mYXI7cyE9PW4uZmFyJiYobi5mYXI9cyxuLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksZWwuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLG4ucG9zaXRpb24uY29weShlbCksU3AuY29weShuLnBvc2l0aW9uKSxTcC5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbZV0pLG4udXAuY29weSh0aGlzLl9jdWJlVXBzW2VdKSxuLmxvb2tBdChTcCksbi51cGRhdGVNYXRyaXhXb3JsZCgpLHIubWFrZVRyYW5zbGF0aW9uKC1lbC54LC1lbC55LC1lbC56KSxqXy5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChqXyl9fWNsYXNzIEtfIGV4dGVuZHMgVHJ7Y29uc3RydWN0b3IodCxlLG49MCxyPTIpe3N1cGVyKHQsZSksdGhpcy5pc1BvaW50TGlnaHQ9ITAsdGhpcy50eXBlPSJQb2ludExpZ2h0Iix0aGlzLmRpc3RhbmNlPW4sdGhpcy5kZWNheT1yLHRoaXMuc2hhZG93PW5ldyBqRX1nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqNCpNYXRoLlBJfXNldCBwb3dlcih0KXt0aGlzLmludGVuc2l0eT10Lyg0Kk1hdGguUEkpfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5kaXN0YW5jZT10LmRpc3RhbmNlLHRoaXMuZGVjYXk9dC5kZWNheSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fWNsYXNzIHp1IGV4dGVuZHMgS2N7Y29uc3RydWN0b3IodD0tMSxlPTEsbj0xLHI9LTEscz0uMSxvPTJlMyl7c3VwZXIoKSx0aGlzLmlzT3J0aG9ncmFwaGljQ2FtZXJhPSEwLHRoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIix0aGlzLnpvb209MSx0aGlzLnZpZXc9bnVsbCx0aGlzLmxlZnQ9dCx0aGlzLnJpZ2h0PWUsdGhpcy50b3A9bix0aGlzLmJvdHRvbT1yLHRoaXMubmVhcj1zLHRoaXMuZmFyPW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5sZWZ0PXQubGVmdCx0aGlzLnJpZ2h0PXQucmlnaHQsdGhpcy50b3A9dC50b3AsdGhpcy5ib3R0b209dC5ib3R0b20sdGhpcy5uZWFyPXQubmVhcix0aGlzLmZhcj10LmZhcix0aGlzLnpvb209dC56b29tLHRoaXMudmlldz10LnZpZXc9PT1udWxsP251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXN9c2V0Vmlld09mZnNldCh0LGUsbixyLHMsbyl7dGhpcy52aWV3PT09bnVsbCYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSksdGhpcy52aWV3LmVuYWJsZWQ9ITAsdGhpcy52aWV3LmZ1bGxXaWR0aD10LHRoaXMudmlldy5mdWxsSGVpZ2h0PWUsdGhpcy52aWV3Lm9mZnNldFg9bix0aGlzLnZpZXcub2Zmc2V0WT1yLHRoaXMudmlldy53aWR0aD1zLHRoaXMudmlldy5oZWlnaHQ9byx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jbGVhclZpZXdPZmZzZXQoKXt0aGlzLnZpZXchPT1udWxsJiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfXVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKXtjb25zdCB0PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvKDIqdGhpcy56b29tKSxlPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxuPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixyPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMjtsZXQgcz1uLXQsbz1uK3QsYT1yK2UsbD1yLWU7aWYodGhpcy52aWV3IT09bnVsbCYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IGM9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS90aGlzLnZpZXcuZnVsbFdpZHRoL3RoaXMuem9vbSx1PSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmZ1bGxIZWlnaHQvdGhpcy56b29tO3MrPWMqdGhpcy52aWV3Lm9mZnNldFgsbz1zK2MqdGhpcy52aWV3LndpZHRoLGEtPXUqdGhpcy52aWV3Lm9mZnNldFksbD1hLXUqdGhpcy52aWV3LmhlaWdodH10aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyhzLG8sYSxsLHRoaXMubmVhcix0aGlzLmZhcix0aGlzLmNvb3JkaW5hdGVTeXN0ZW0pLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Quem9vbT10aGlzLnpvb20sZS5vYmplY3QubGVmdD10aGlzLmxlZnQsZS5vYmplY3QucmlnaHQ9dGhpcy5yaWdodCxlLm9iamVjdC50b3A9dGhpcy50b3AsZS5vYmplY3QuYm90dG9tPXRoaXMuYm90dG9tLGUub2JqZWN0Lm5lYXI9dGhpcy5uZWFyLGUub2JqZWN0LmZhcj10aGlzLmZhcix0aGlzLnZpZXchPT1udWxsJiYoZS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpLGV9fWNsYXNzIEtFIGV4dGVuZHMgdnB7Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgenUoLTUsNSw1LC01LC41LDUwMCkpLHRoaXMuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93PSEwfX1jbGFzcyBRXyBleHRlbmRzIFRye2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmlzRGlyZWN0aW9uYWxMaWdodD0hMCx0aGlzLnR5cGU9IkRpcmVjdGlvbmFsTGlnaHQiLHRoaXMucG9zaXRpb24uY29weShhZS5ERUZBVUxUX1VQKSx0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMudGFyZ2V0PW5ldyBhZSx0aGlzLnNoYWRvdz1uZXcgS0V9ZGlzcG9zZSgpe3RoaXMuc2hhZG93LmRpc3Bvc2UoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudGFyZ2V0PXQudGFyZ2V0LmNsb25lKCksdGhpcy5zaGFkb3c9dC5zaGFkb3cuY2xvbmUoKSx0aGlzfX1jbGFzcyB0eCBleHRlbmRzIFRye2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmlzQW1iaWVudExpZ2h0PSEwLHRoaXMudHlwZT0iQW1iaWVudExpZ2h0In19Y2xhc3MgZXggZXh0ZW5kcyBUcntjb25zdHJ1Y3Rvcih0LGUsbj0xMCxyPTEwKXtzdXBlcih0LGUpLHRoaXMuaXNSZWN0QXJlYUxpZ2h0PSEwLHRoaXMudHlwZT0iUmVjdEFyZWFMaWdodCIsdGhpcy53aWR0aD1uLHRoaXMuaGVpZ2h0PXJ9Z2V0IHBvd2VyKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5KnRoaXMud2lkdGgqdGhpcy5oZWlnaHQqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC8odGhpcy53aWR0aCp0aGlzLmhlaWdodCpNYXRoLlBJKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Qud2lkdGg9dGhpcy53aWR0aCxlLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQsZX19Y2xhc3Mgbnh7Y29uc3RydWN0b3IoKXt0aGlzLmlzU3BoZXJpY2FsSGFybW9uaWNzMz0hMCx0aGlzLmNvZWZmaWNpZW50cz1bXTtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzLnB1c2gobmV3IFIpfXNldCh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmNvcHkodFtlXSk7cmV0dXJuIHRoaXN9emVybygpe2ZvcihsZXQgdD0wO3Q8OTt0KyspdGhpcy5jb2VmZmljaWVudHNbdF0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc31nZXRBdCh0LGUpe2NvbnN0IG49dC54LHI9dC55LHM9dC56LG89dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIGUuY29weShvWzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KSxlLmFkZFNjYWxlZFZlY3RvcihvWzFdLC40ODg2MDMqciksZS5hZGRTY2FsZWRWZWN0b3Iob1syXSwuNDg4NjAzKnMpLGUuYWRkU2NhbGVkVmVjdG9yKG9bM10sLjQ4ODYwMypuKSxlLmFkZFNjYWxlZFZlY3RvcihvWzRdLDEuMDkyNTQ4KihuKnIpKSxlLmFkZFNjYWxlZFZlY3RvcihvWzVdLDEuMDkyNTQ4KihyKnMpKSxlLmFkZFNjYWxlZFZlY3RvcihvWzZdLC4zMTUzOTIqKDMqcypzLTEpKSxlLmFkZFNjYWxlZFZlY3RvcihvWzddLDEuMDkyNTQ4KihuKnMpKSxlLmFkZFNjYWxlZFZlY3RvcihvWzhdLC41NDYyNzQqKG4qbi1yKnIpKSxlfWdldElycmFkaWFuY2VBdCh0LGUpe2NvbnN0IG49dC54LHI9dC55LHM9dC56LG89dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIGUuY29weShvWzBdKS5tdWx0aXBseVNjYWxhciguODg2MjI3KSxlLmFkZFNjYWxlZFZlY3RvcihvWzFdLDIqLjUxMTY2NCpyKSxlLmFkZFNjYWxlZFZlY3RvcihvWzJdLDIqLjUxMTY2NCpzKSxlLmFkZFNjYWxlZFZlY3RvcihvWzNdLDIqLjUxMTY2NCpuKSxlLmFkZFNjYWxlZFZlY3RvcihvWzRdLDIqLjQyOTA0MypuKnIpLGUuYWRkU2NhbGVkVmVjdG9yKG9bNV0sMiouNDI5MDQzKnIqcyksZS5hZGRTY2FsZWRWZWN0b3Iob1s2XSwuNzQzMTI1KnMqcy0uMjQ3NzA4KSxlLmFkZFNjYWxlZFZlY3RvcihvWzddLDIqLjQyOTA0MypuKnMpLGUuYWRkU2NhbGVkVmVjdG9yKG9bOF0sLjQyOTA0MyoobipuLXIqcikpLGV9YWRkKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uYWRkKHQuY29lZmZpY2llbnRzW2VdKTtyZXR1cm4gdGhpc31hZGRTY2FsZWRTSCh0LGUpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0uYWRkU2NhbGVkVmVjdG9yKHQuY29lZmZpY2llbnRzW25dLGUpO3JldHVybiB0aGlzfXNjYWxlKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0ubXVsdGlwbHlTY2FsYXIodCk7cmV0dXJuIHRoaXN9bGVycCh0LGUpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0ubGVycCh0LmNvZWZmaWNpZW50c1tuXSxlKTtyZXR1cm4gdGhpc31lcXVhbHModCl7Zm9yKGxldCBlPTA7ZTw5O2UrKylpZighdGhpcy5jb2VmZmljaWVudHNbZV0uZXF1YWxzKHQuY29lZmZpY2llbnRzW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH1jb3B5KHQpe3JldHVybiB0aGlzLnNldCh0LmNvZWZmaWNpZW50cyl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWZyb21BcnJheSh0LGU9MCl7Y29uc3Qgbj10aGlzLmNvZWZmaWNpZW50cztmb3IobGV0IHI9MDtyPDk7cisrKW5bcl0uZnJvbUFycmF5KHQsZStyKjMpO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5jb2VmZmljaWVudHM7Zm9yKGxldCByPTA7cjw5O3IrKyluW3JdLnRvQXJyYXkodCxlK3IqMyk7cmV0dXJuIHR9c3RhdGljIGdldEJhc2lzQXQodCxlKXtjb25zdCBuPXQueCxyPXQueSxzPXQuejtlWzBdPS4yODIwOTUsZVsxXT0uNDg4NjAzKnIsZVsyXT0uNDg4NjAzKnMsZVszXT0uNDg4NjAzKm4sZVs0XT0xLjA5MjU0OCpuKnIsZVs1XT0xLjA5MjU0OCpyKnMsZVs2XT0uMzE1MzkyKigzKnMqcy0xKSxlWzddPTEuMDkyNTQ4Km4qcyxlWzhdPS41NDYyNzQqKG4qbi1yKnIpfX1jbGFzcyBpeCBleHRlbmRzIFRye2NvbnN0cnVjdG9yKHQ9bmV3IG54LGU9MSl7c3VwZXIodm9pZCAwLGUpLHRoaXMuaXNMaWdodFByb2JlPSEwLHRoaXMuc2g9dH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuc2guY29weSh0LnNoKSx0aGlzfWZyb21KU09OKHQpe3JldHVybiB0aGlzLmludGVuc2l0eT10LmludGVuc2l0eSx0aGlzLnNoLmZyb21BcnJheSh0LnNoKSx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Quc2g9dGhpcy5zaC50b0FycmF5KCksZX19Y2xhc3Mga3UgZXh0ZW5kcyBBbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnRleHR1cmVzPXt9fWxvYWQodCxlLG4scil7Y29uc3Qgcz10aGlzLG89bmV3IFFpKHMubWFuYWdlcik7by5zZXRQYXRoKHMucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHMucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHMocy53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZCh0LGZ1bmN0aW9uKGEpe3RyeXtlKHMucGFyc2UoSlNPTi5wYXJzZShhKSkpfWNhdGNoKGwpe3I/cihsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IodCl9fSxuLHIpfXBhcnNlKHQpe2NvbnN0IGU9dGhpcy50ZXh0dXJlcztmdW5jdGlvbiBuKHMpe3JldHVybiBlW3NdPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZSIscyksZVtzXX1jb25zdCByPXRoaXMuY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0LnR5cGUpO2lmKHQudXVpZCE9PXZvaWQgMCYmKHIudXVpZD10LnV1aWQpLHQubmFtZSE9PXZvaWQgMCYmKHIubmFtZT10Lm5hbWUpLHQuY29sb3IhPT12b2lkIDAmJnIuY29sb3IhPT12b2lkIDAmJnIuY29sb3Iuc2V0SGV4KHQuY29sb3IpLHQucm91Z2huZXNzIT09dm9pZCAwJiYoci5yb3VnaG5lc3M9dC5yb3VnaG5lc3MpLHQubWV0YWxuZXNzIT09dm9pZCAwJiYoci5tZXRhbG5lc3M9dC5tZXRhbG5lc3MpLHQuc2hlZW4hPT12b2lkIDAmJihyLnNoZWVuPXQuc2hlZW4pLHQuc2hlZW5Db2xvciE9PXZvaWQgMCYmKHIuc2hlZW5Db2xvcj1uZXcgeHQoKS5zZXRIZXgodC5zaGVlbkNvbG9yKSksdC5zaGVlblJvdWdobmVzcyE9PXZvaWQgMCYmKHIuc2hlZW5Sb3VnaG5lc3M9dC5zaGVlblJvdWdobmVzcyksdC5lbWlzc2l2ZSE9PXZvaWQgMCYmci5lbWlzc2l2ZSE9PXZvaWQgMCYmci5lbWlzc2l2ZS5zZXRIZXgodC5lbWlzc2l2ZSksdC5zcGVjdWxhciE9PXZvaWQgMCYmci5zcGVjdWxhciE9PXZvaWQgMCYmci5zcGVjdWxhci5zZXRIZXgodC5zcGVjdWxhciksdC5zcGVjdWxhckludGVuc2l0eSE9PXZvaWQgMCYmKHIuc3BlY3VsYXJJbnRlbnNpdHk9dC5zcGVjdWxhckludGVuc2l0eSksdC5zcGVjdWxhckNvbG9yIT09dm9pZCAwJiZyLnNwZWN1bGFyQ29sb3IhPT12b2lkIDAmJnIuc3BlY3VsYXJDb2xvci5zZXRIZXgodC5zcGVjdWxhckNvbG9yKSx0LnNoaW5pbmVzcyE9PXZvaWQgMCYmKHIuc2hpbmluZXNzPXQuc2hpbmluZXNzKSx0LmNsZWFyY29hdCE9PXZvaWQgMCYmKHIuY2xlYXJjb2F0PXQuY2xlYXJjb2F0KSx0LmNsZWFyY29hdFJvdWdobmVzcyE9PXZvaWQgMCYmKHIuY2xlYXJjb2F0Um91Z2huZXNzPXQuY2xlYXJjb2F0Um91Z2huZXNzKSx0LmRpc3BlcnNpb24hPT12b2lkIDAmJihyLmRpc3BlcnNpb249dC5kaXNwZXJzaW9uKSx0LmlyaWRlc2NlbmNlIT09dm9pZCAwJiYoci5pcmlkZXNjZW5jZT10LmlyaWRlc2NlbmNlKSx0LmlyaWRlc2NlbmNlSU9SIT09dm9pZCAwJiYoci5pcmlkZXNjZW5jZUlPUj10LmlyaWRlc2NlbmNlSU9SKSx0LmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UhPT12b2lkIDAmJihyLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9dC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlKSx0LnRyYW5zbWlzc2lvbiE9PXZvaWQgMCYmKHIudHJhbnNtaXNzaW9uPXQudHJhbnNtaXNzaW9uKSx0LnRoaWNrbmVzcyE9PXZvaWQgMCYmKHIudGhpY2tuZXNzPXQudGhpY2tuZXNzKSx0LmF0dGVudWF0aW9uRGlzdGFuY2UhPT12b2lkIDAmJihyLmF0dGVudWF0aW9uRGlzdGFuY2U9dC5hdHRlbnVhdGlvbkRpc3RhbmNlKSx0LmF0dGVudWF0aW9uQ29sb3IhPT12b2lkIDAmJnIuYXR0ZW51YXRpb25Db2xvciE9PXZvaWQgMCYmci5hdHRlbnVhdGlvbkNvbG9yLnNldEhleCh0LmF0dGVudWF0aW9uQ29sb3IpLHQuYW5pc290cm9weSE9PXZvaWQgMCYmKHIuYW5pc290cm9weT10LmFuaXNvdHJvcHkpLHQuYW5pc290cm9weVJvdGF0aW9uIT09dm9pZCAwJiYoci5hbmlzb3Ryb3B5Um90YXRpb249dC5hbmlzb3Ryb3B5Um90YXRpb24pLHQuZm9nIT09dm9pZCAwJiYoci5mb2c9dC5mb2cpLHQuZmxhdFNoYWRpbmchPT12b2lkIDAmJihyLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcpLHQuYmxlbmRpbmchPT12b2lkIDAmJihyLmJsZW5kaW5nPXQuYmxlbmRpbmcpLHQuY29tYmluZSE9PXZvaWQgMCYmKHIuY29tYmluZT10LmNvbWJpbmUpLHQuc2lkZSE9PXZvaWQgMCYmKHIuc2lkZT10LnNpZGUpLHQuc2hhZG93U2lkZSE9PXZvaWQgMCYmKHIuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUpLHQub3BhY2l0eSE9PXZvaWQgMCYmKHIub3BhY2l0eT10Lm9wYWNpdHkpLHQudHJhbnNwYXJlbnQhPT12b2lkIDAmJihyLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQpLHQuYWxwaGFUZXN0IT09dm9pZCAwJiYoci5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QpLHQuYWxwaGFIYXNoIT09dm9pZCAwJiYoci5hbHBoYUhhc2g9dC5hbHBoYUhhc2gpLHQuZGVwdGhGdW5jIT09dm9pZCAwJiYoci5kZXB0aEZ1bmM9dC5kZXB0aEZ1bmMpLHQuZGVwdGhUZXN0IT09dm9pZCAwJiYoci5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QpLHQuZGVwdGhXcml0ZSE9PXZvaWQgMCYmKHIuZGVwdGhXcml0ZT10LmRlcHRoV3JpdGUpLHQuY29sb3JXcml0ZSE9PXZvaWQgMCYmKHIuY29sb3JXcml0ZT10LmNvbG9yV3JpdGUpLHQuYmxlbmRTcmMhPT12b2lkIDAmJihyLmJsZW5kU3JjPXQuYmxlbmRTcmMpLHQuYmxlbmREc3QhPT12b2lkIDAmJihyLmJsZW5kRHN0PXQuYmxlbmREc3QpLHQuYmxlbmRFcXVhdGlvbiE9PXZvaWQgMCYmKHIuYmxlbmRFcXVhdGlvbj10LmJsZW5kRXF1YXRpb24pLHQuYmxlbmRTcmNBbHBoYSE9PXZvaWQgMCYmKHIuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEpLHQuYmxlbmREc3RBbHBoYSE9PXZvaWQgMCYmKHIuYmxlbmREc3RBbHBoYT10LmJsZW5kRHN0QWxwaGEpLHQuYmxlbmRFcXVhdGlvbkFscGhhIT09dm9pZCAwJiYoci5ibGVuZEVxdWF0aW9uQWxwaGE9dC5ibGVuZEVxdWF0aW9uQWxwaGEpLHQuYmxlbmRDb2xvciE9PXZvaWQgMCYmci5ibGVuZENvbG9yIT09dm9pZCAwJiZyLmJsZW5kQ29sb3Iuc2V0SGV4KHQuYmxlbmRDb2xvciksdC5ibGVuZEFscGhhIT09dm9pZCAwJiYoci5ibGVuZEFscGhhPXQuYmxlbmRBbHBoYSksdC5zdGVuY2lsV3JpdGVNYXNrIT09dm9pZCAwJiYoci5zdGVuY2lsV3JpdGVNYXNrPXQuc3RlbmNpbFdyaXRlTWFzayksdC5zdGVuY2lsRnVuYyE9PXZvaWQgMCYmKHIuc3RlbmNpbEZ1bmM9dC5zdGVuY2lsRnVuYyksdC5zdGVuY2lsUmVmIT09dm9pZCAwJiYoci5zdGVuY2lsUmVmPXQuc3RlbmNpbFJlZiksdC5zdGVuY2lsRnVuY01hc2shPT12b2lkIDAmJihyLnN0ZW5jaWxGdW5jTWFzaz10LnN0ZW5jaWxGdW5jTWFzayksdC5zdGVuY2lsRmFpbCE9PXZvaWQgMCYmKHIuc3RlbmNpbEZhaWw9dC5zdGVuY2lsRmFpbCksdC5zdGVuY2lsWkZhaWwhPT12b2lkIDAmJihyLnN0ZW5jaWxaRmFpbD10LnN0ZW5jaWxaRmFpbCksdC5zdGVuY2lsWlBhc3MhPT12b2lkIDAmJihyLnN0ZW5jaWxaUGFzcz10LnN0ZW5jaWxaUGFzcyksdC5zdGVuY2lsV3JpdGUhPT12b2lkIDAmJihyLnN0ZW5jaWxXcml0ZT10LnN0ZW5jaWxXcml0ZSksdC53aXJlZnJhbWUhPT12b2lkIDAmJihyLndpcmVmcmFtZT10LndpcmVmcmFtZSksdC53aXJlZnJhbWVMaW5ld2lkdGghPT12b2lkIDAmJihyLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCksdC53aXJlZnJhbWVMaW5lY2FwIT09dm9pZCAwJiYoci53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCksdC53aXJlZnJhbWVMaW5lam9pbiE9PXZvaWQgMCYmKHIud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbiksdC5yb3RhdGlvbiE9PXZvaWQgMCYmKHIucm90YXRpb249dC5yb3RhdGlvbiksdC5saW5ld2lkdGghPT12b2lkIDAmJihyLmxpbmV3aWR0aD10LmxpbmV3aWR0aCksdC5kYXNoU2l6ZSE9PXZvaWQgMCYmKHIuZGFzaFNpemU9dC5kYXNoU2l6ZSksdC5nYXBTaXplIT09dm9pZCAwJiYoci5nYXBTaXplPXQuZ2FwU2l6ZSksdC5zY2FsZSE9PXZvaWQgMCYmKHIuc2NhbGU9dC5zY2FsZSksdC5wb2x5Z29uT2Zmc2V0IT09dm9pZCAwJiYoci5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCksdC5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09dm9pZCAwJiYoci5wb2x5Z29uT2Zmc2V0RmFjdG9yPXQucG9seWdvbk9mZnNldEZhY3RvciksdC5wb2x5Z29uT2Zmc2V0VW5pdHMhPT12b2lkIDAmJihyLnBvbHlnb25PZmZzZXRVbml0cz10LnBvbHlnb25PZmZzZXRVbml0cyksdC5kaXRoZXJpbmchPT12b2lkIDAmJihyLmRpdGhlcmluZz10LmRpdGhlcmluZyksdC5hbHBoYVRvQ292ZXJhZ2UhPT12b2lkIDAmJihyLmFscGhhVG9Db3ZlcmFnZT10LmFscGhhVG9Db3ZlcmFnZSksdC5wcmVtdWx0aXBsaWVkQWxwaGEhPT12b2lkIDAmJihyLnByZW11bHRpcGxpZWRBbHBoYT10LnByZW11bHRpcGxpZWRBbHBoYSksdC5mb3JjZVNpbmdsZVBhc3MhPT12b2lkIDAmJihyLmZvcmNlU2luZ2xlUGFzcz10LmZvcmNlU2luZ2xlUGFzcyksdC52aXNpYmxlIT09dm9pZCAwJiYoci52aXNpYmxlPXQudmlzaWJsZSksdC50b25lTWFwcGVkIT09dm9pZCAwJiYoci50b25lTWFwcGVkPXQudG9uZU1hcHBlZCksdC51c2VyRGF0YSE9PXZvaWQgMCYmKHIudXNlckRhdGE9dC51c2VyRGF0YSksdC52ZXJ0ZXhDb2xvcnMhPT12b2lkIDAmJih0eXBlb2YgdC52ZXJ0ZXhDb2xvcnM9PSJudW1iZXIiP3IudmVydGV4Q29sb3JzPXQudmVydGV4Q29sb3JzPjA6ci52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMpLHQudW5pZm9ybXMhPT12b2lkIDApZm9yKGNvbnN0IHMgaW4gdC51bmlmb3Jtcyl7Y29uc3Qgbz10LnVuaWZvcm1zW3NdO3N3aXRjaChyLnVuaWZvcm1zW3NdPXt9LG8udHlwZSl7Y2FzZSJ0IjpyLnVuaWZvcm1zW3NdLnZhbHVlPW4oby52YWx1ZSk7YnJlYWs7Y2FzZSJjIjpyLnVuaWZvcm1zW3NdLnZhbHVlPW5ldyB4dCgpLnNldEhleChvLnZhbHVlKTticmVhaztjYXNlInYyIjpyLnVuaWZvcm1zW3NdLnZhbHVlPW5ldyBYKCkuZnJvbUFycmF5KG8udmFsdWUpO2JyZWFrO2Nhc2UidjMiOnIudW5pZm9ybXNbc10udmFsdWU9bmV3IFIoKS5mcm9tQXJyYXkoby52YWx1ZSk7YnJlYWs7Y2FzZSJ2NCI6ci51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgUXQoKS5mcm9tQXJyYXkoby52YWx1ZSk7YnJlYWs7Y2FzZSJtMyI6ci51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgV3QoKS5mcm9tQXJyYXkoby52YWx1ZSk7YnJlYWs7Y2FzZSJtNCI6ci51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgUnQoKS5mcm9tQXJyYXkoby52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpyLnVuaWZvcm1zW3NdLnZhbHVlPW8udmFsdWV9fWlmKHQuZGVmaW5lcyE9PXZvaWQgMCYmKHIuZGVmaW5lcz10LmRlZmluZXMpLHQudmVydGV4U2hhZGVyIT09dm9pZCAwJiYoci52ZXJ0ZXhTaGFkZXI9dC52ZXJ0ZXhTaGFkZXIpLHQuZnJhZ21lbnRTaGFkZXIhPT12b2lkIDAmJihyLmZyYWdtZW50U2hhZGVyPXQuZnJhZ21lbnRTaGFkZXIpLHQuZ2xzbFZlcnNpb24hPT12b2lkIDAmJihyLmdsc2xWZXJzaW9uPXQuZ2xzbFZlcnNpb24pLHQuZXh0ZW5zaW9ucyE9PXZvaWQgMClmb3IoY29uc3QgcyBpbiB0LmV4dGVuc2lvbnMpci5leHRlbnNpb25zW3NdPXQuZXh0ZW5zaW9uc1tzXTtpZih0LmxpZ2h0cyE9PXZvaWQgMCYmKHIubGlnaHRzPXQubGlnaHRzKSx0LmNsaXBwaW5nIT09dm9pZCAwJiYoci5jbGlwcGluZz10LmNsaXBwaW5nKSx0LnNpemUhPT12b2lkIDAmJihyLnNpemU9dC5zaXplKSx0LnNpemVBdHRlbnVhdGlvbiE9PXZvaWQgMCYmKHIuc2l6ZUF0dGVudWF0aW9uPXQuc2l6ZUF0dGVudWF0aW9uKSx0Lm1hcCE9PXZvaWQgMCYmKHIubWFwPW4odC5tYXApKSx0Lm1hdGNhcCE9PXZvaWQgMCYmKHIubWF0Y2FwPW4odC5tYXRjYXApKSx0LmFscGhhTWFwIT09dm9pZCAwJiYoci5hbHBoYU1hcD1uKHQuYWxwaGFNYXApKSx0LmJ1bXBNYXAhPT12b2lkIDAmJihyLmJ1bXBNYXA9bih0LmJ1bXBNYXApKSx0LmJ1bXBTY2FsZSE9PXZvaWQgMCYmKHIuYnVtcFNjYWxlPXQuYnVtcFNjYWxlKSx0Lm5vcm1hbE1hcCE9PXZvaWQgMCYmKHIubm9ybWFsTWFwPW4odC5ub3JtYWxNYXApKSx0Lm5vcm1hbE1hcFR5cGUhPT12b2lkIDAmJihyLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlKSx0Lm5vcm1hbFNjYWxlIT09dm9pZCAwKXtsZXQgcz10Lm5vcm1hbFNjYWxlO0FycmF5LmlzQXJyYXkocyk9PT0hMSYmKHM9W3Msc10pLHIubm9ybWFsU2NhbGU9bmV3IFgoKS5mcm9tQXJyYXkocyl9cmV0dXJuIHQuZGlzcGxhY2VtZW50TWFwIT09dm9pZCAwJiYoci5kaXNwbGFjZW1lbnRNYXA9bih0LmRpc3BsYWNlbWVudE1hcCkpLHQuZGlzcGxhY2VtZW50U2NhbGUhPT12b2lkIDAmJihyLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUpLHQuZGlzcGxhY2VtZW50QmlhcyE9PXZvaWQgMCYmKHIuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMpLHQucm91Z2huZXNzTWFwIT09dm9pZCAwJiYoci5yb3VnaG5lc3NNYXA9bih0LnJvdWdobmVzc01hcCkpLHQubWV0YWxuZXNzTWFwIT09dm9pZCAwJiYoci5tZXRhbG5lc3NNYXA9bih0Lm1ldGFsbmVzc01hcCkpLHQuZW1pc3NpdmVNYXAhPT12b2lkIDAmJihyLmVtaXNzaXZlTWFwPW4odC5lbWlzc2l2ZU1hcCkpLHQuZW1pc3NpdmVJbnRlbnNpdHkhPT12b2lkIDAmJihyLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHkpLHQuc3BlY3VsYXJNYXAhPT12b2lkIDAmJihyLnNwZWN1bGFyTWFwPW4odC5zcGVjdWxhck1hcCkpLHQuc3BlY3VsYXJJbnRlbnNpdHlNYXAhPT12b2lkIDAmJihyLnNwZWN1bGFySW50ZW5zaXR5TWFwPW4odC5zcGVjdWxhckludGVuc2l0eU1hcCkpLHQuc3BlY3VsYXJDb2xvck1hcCE9PXZvaWQgMCYmKHIuc3BlY3VsYXJDb2xvck1hcD1uKHQuc3BlY3VsYXJDb2xvck1hcCkpLHQuZW52TWFwIT09dm9pZCAwJiYoci5lbnZNYXA9bih0LmVudk1hcCkpLHQuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJnIuZW52TWFwUm90YXRpb24uZnJvbUFycmF5KHQuZW52TWFwUm90YXRpb24pLHQuZW52TWFwSW50ZW5zaXR5IT09dm9pZCAwJiYoci5lbnZNYXBJbnRlbnNpdHk9dC5lbnZNYXBJbnRlbnNpdHkpLHQucmVmbGVjdGl2aXR5IT09dm9pZCAwJiYoci5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHkpLHQucmVmcmFjdGlvblJhdGlvIT09dm9pZCAwJiYoci5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8pLHQubGlnaHRNYXAhPT12b2lkIDAmJihyLmxpZ2h0TWFwPW4odC5saWdodE1hcCkpLHQubGlnaHRNYXBJbnRlbnNpdHkhPT12b2lkIDAmJihyLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHkpLHQuYW9NYXAhPT12b2lkIDAmJihyLmFvTWFwPW4odC5hb01hcCkpLHQuYW9NYXBJbnRlbnNpdHkhPT12b2lkIDAmJihyLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHkpLHQuZ3JhZGllbnRNYXAhPT12b2lkIDAmJihyLmdyYWRpZW50TWFwPW4odC5ncmFkaWVudE1hcCkpLHQuY2xlYXJjb2F0TWFwIT09dm9pZCAwJiYoci5jbGVhcmNvYXRNYXA9bih0LmNsZWFyY29hdE1hcCkpLHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwIT09dm9pZCAwJiYoci5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9bih0LmNsZWFyY29hdFJvdWdobmVzc01hcCkpLHQuY2xlYXJjb2F0Tm9ybWFsTWFwIT09dm9pZCAwJiYoci5jbGVhcmNvYXROb3JtYWxNYXA9bih0LmNsZWFyY29hdE5vcm1hbE1hcCkpLHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUhPT12b2lkIDAmJihyLmNsZWFyY29hdE5vcm1hbFNjYWxlPW5ldyBYKCkuZnJvbUFycmF5KHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpKSx0LmlyaWRlc2NlbmNlTWFwIT09dm9pZCAwJiYoci5pcmlkZXNjZW5jZU1hcD1uKHQuaXJpZGVzY2VuY2VNYXApKSx0LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwIT09dm9pZCAwJiYoci5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD1uKHQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXApKSx0LnRyYW5zbWlzc2lvbk1hcCE9PXZvaWQgMCYmKHIudHJhbnNtaXNzaW9uTWFwPW4odC50cmFuc21pc3Npb25NYXApKSx0LnRoaWNrbmVzc01hcCE9PXZvaWQgMCYmKHIudGhpY2tuZXNzTWFwPW4odC50aGlja25lc3NNYXApKSx0LmFuaXNvdHJvcHlNYXAhPT12b2lkIDAmJihyLmFuaXNvdHJvcHlNYXA9bih0LmFuaXNvdHJvcHlNYXApKSx0LnNoZWVuQ29sb3JNYXAhPT12b2lkIDAmJihyLnNoZWVuQ29sb3JNYXA9bih0LnNoZWVuQ29sb3JNYXApKSx0LnNoZWVuUm91Z2huZXNzTWFwIT09dm9pZCAwJiYoci5zaGVlblJvdWdobmVzc01hcD1uKHQuc2hlZW5Sb3VnaG5lc3NNYXApKSxyfXNldFRleHR1cmVzKHQpe3JldHVybiB0aGlzLnRleHR1cmVzPXQsdGhpc31jcmVhdGVNYXRlcmlhbEZyb21UeXBlKHQpe3JldHVybiBrdS5jcmVhdGVNYXRlcmlhbEZyb21UeXBlKHQpfXN0YXRpYyBjcmVhdGVNYXRlcmlhbEZyb21UeXBlKHQpe2NvbnN0IGU9e1NoYWRvd01hdGVyaWFsOkxfLFNwcml0ZU1hdGVyaWFsOmtkLFJhd1NoYWRlck1hdGVyaWFsOkRfLFNoYWRlck1hdGVyaWFsOnVpLFBvaW50c01hdGVyaWFsOkpkLE1lc2hQaHlzaWNhbE1hdGVyaWFsOlVfLE1lc2hTdGFuZGFyZE1hdGVyaWFsOmhwLE1lc2hQaG9uZ01hdGVyaWFsOk5fLE1lc2hUb29uTWF0ZXJpYWw6Rl8sTWVzaE5vcm1hbE1hdGVyaWFsOkJfLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6T18sTWVzaERlcHRoTWF0ZXJpYWw6ZnAsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ZHAsTWVzaEJhc2ljTWF0ZXJpYWw6YnIsTWVzaE1hdGNhcE1hdGVyaWFsOnpfLExpbmVEYXNoZWRNYXRlcmlhbDprXyxMaW5lQmFzaWNNYXRlcmlhbDpobixNYXRlcmlhbDpRZX07cmV0dXJuIG5ldyBlW3RdfX1jbGFzcyBNcHtzdGF0aWMgZGVjb2RlVGV4dCh0KXtpZihjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlclV0aWxzOiBkZWNvZGVUZXh0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZCB3aXRoIHIxNjUgYW5kIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHIxNzUuIFVzZSBUZXh0RGVjb2RlciBpbnN0ZWFkLiIpLHR5cGVvZiBUZXh0RGVjb2RlciE9InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh0KTtsZXQgZT0iIjtmb3IobGV0IG49MCxyPXQubGVuZ3RoO248cjtuKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSh0W25dKTt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZSkpfWNhdGNoKG4pe3JldHVybiBlfX1zdGF0aWMgZXh0cmFjdFVybEJhc2UodCl7Y29uc3QgZT10Lmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIGU9PT0tMT8iLi8iOnQuc2xpY2UoMCxlKzEpfXN0YXRpYyByZXNvbHZlVVJMKHQsZSl7cmV0dXJuIHR5cGVvZiB0IT0ic3RyaW5nInx8dD09PSIiPyIiOigvXmh0dHBzPzpcL1wvL2kudGVzdChlKSYmL15cLy8udGVzdCh0KSYmKGU9ZS5yZXBsYWNlKC8oXmh0dHBzPzpcL1wvW15cL10rKS4qL2ksIiQxIikpLC9eKGh0dHBzPzopP1wvXC8vaS50ZXN0KHQpfHwvXmRhdGE6LiosLiokL2kudGVzdCh0KXx8L15ibG9iOi4qJC9pLnRlc3QodCk/dDplK3QpfX1jbGFzcyByeCBleHRlbmRzIEZ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9ITAsdGhpcy50eXBlPSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbnN0YW5jZUNvdW50PTEvMH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuaW5zdGFuY2VDb3VudD10Lmluc3RhbmNlQ291bnQsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0Lmluc3RhbmNlQ291bnQ9dGhpcy5pbnN0YW5jZUNvdW50LHQuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCx0fX1jbGFzcyBzeCBleHRlbmRzIEFue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz10aGlzLG89bmV3IFFpKHMubWFuYWdlcik7by5zZXRQYXRoKHMucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHMucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHMocy53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZCh0LGZ1bmN0aW9uKGEpe3RyeXtlKHMucGFyc2UoSlNPTi5wYXJzZShhKSkpfWNhdGNoKGwpe3I/cihsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IodCl9fSxuLHIpfXBhcnNlKHQpe2NvbnN0IGU9e30sbj17fTtmdW5jdGlvbiByKGQscCl7aWYoZVtwXSE9PXZvaWQgMClyZXR1cm4gZVtwXTtjb25zdCBnPWQuaW50ZXJsZWF2ZWRCdWZmZXJzW3BdLG09cyhkLGcuYnVmZmVyKSx2PUtzKGcudHlwZSxtKSx4PW5ldyBldSh2LGcuc3RyaWRlKTtyZXR1cm4geC51dWlkPWcudXVpZCxlW3BdPXgseH1mdW5jdGlvbiBzKGQscCl7aWYobltwXSE9PXZvaWQgMClyZXR1cm4gbltwXTtjb25zdCBnPWQuYXJyYXlCdWZmZXJzW3BdLG09bmV3IFVpbnQzMkFycmF5KGcpLmJ1ZmZlcjtyZXR1cm4gbltwXT1tLG19Y29uc3Qgbz10LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk/bmV3IHJ4Om5ldyBGdCxhPXQuZGF0YS5pbmRleDtpZihhIT09dm9pZCAwKXtjb25zdCBkPUtzKGEudHlwZSxhLmFycmF5KTtvLnNldEluZGV4KG5ldyBKdChkLDEpKX1jb25zdCBsPXQuZGF0YS5hdHRyaWJ1dGVzO2Zvcihjb25zdCBkIGluIGwpe2NvbnN0IHA9bFtkXTtsZXQgeTtpZihwLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IGc9cih0LmRhdGEscC5kYXRhKTt5PW5ldyBzcyhnLHAuaXRlbVNpemUscC5vZmZzZXQscC5ub3JtYWxpemVkKX1lbHNle2NvbnN0IGc9S3MocC50eXBlLHAuYXJyYXkpLG09cC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT94bzpKdDt5PW5ldyBtKGcscC5pdGVtU2l6ZSxwLm5vcm1hbGl6ZWQpfXAubmFtZSE9PXZvaWQgMCYmKHkubmFtZT1wLm5hbWUpLHAudXNhZ2UhPT12b2lkIDAmJnkuc2V0VXNhZ2UocC51c2FnZSksby5zZXRBdHRyaWJ1dGUoZCx5KX1jb25zdCBjPXQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM7aWYoYylmb3IoY29uc3QgZCBpbiBjKXtjb25zdCBwPWNbZF0seT1bXTtmb3IobGV0IGc9MCxtPXAubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHY9cFtnXTtsZXQgeDtpZih2LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IF89cih0LmRhdGEsdi5kYXRhKTt4PW5ldyBzcyhfLHYuaXRlbVNpemUsdi5vZmZzZXQsdi5ub3JtYWxpemVkKX1lbHNle2NvbnN0IF89S3Modi50eXBlLHYuYXJyYXkpO3g9bmV3IEp0KF8sdi5pdGVtU2l6ZSx2Lm5vcm1hbGl6ZWQpfXYubmFtZSE9PXZvaWQgMCYmKHgubmFtZT12Lm5hbWUpLHkucHVzaCh4KX1vLm1vcnBoQXR0cmlidXRlc1tkXT15fXQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSYmKG8ubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITApO2NvbnN0IGg9dC5kYXRhLmdyb3Vwc3x8dC5kYXRhLmRyYXdjYWxsc3x8dC5kYXRhLm9mZnNldHM7aWYoaCE9PXZvaWQgMClmb3IobGV0IGQ9MCxwPWgubGVuZ3RoO2QhPT1wOysrZCl7Y29uc3QgeT1oW2RdO28uYWRkR3JvdXAoeS5zdGFydCx5LmNvdW50LHkubWF0ZXJpYWxJbmRleCl9Y29uc3QgZj10LmRhdGEuYm91bmRpbmdTcGhlcmU7aWYoZiE9PXZvaWQgMCl7Y29uc3QgZD1uZXcgUjtmLmNlbnRlciE9PXZvaWQgMCYmZC5mcm9tQXJyYXkoZi5jZW50ZXIpLG8uYm91bmRpbmdTcGhlcmU9bmV3IHFlKGQsZi5yYWRpdXMpfXJldHVybiB0Lm5hbWUmJihvLm5hbWU9dC5uYW1lKSx0LnVzZXJEYXRhJiYoby51c2VyRGF0YT10LnVzZXJEYXRhKSxvfX1jbGFzcyBRRSBleHRlbmRzIEFue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz10aGlzLG89dGhpcy5wYXRoPT09IiI/TXAuZXh0cmFjdFVybEJhc2UodCk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucmVzb3VyY2VQYXRofHxvO2NvbnN0IGE9bmV3IFFpKHRoaXMubWFuYWdlcik7YS5zZXRQYXRoKHRoaXMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZCh0LGZ1bmN0aW9uKGwpe2xldCBjPW51bGw7dHJ5e2M9SlNPTi5wYXJzZShsKX1jYXRjaChoKXtyIT09dm9pZCAwJiZyKGgpLGNvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIit0KyIuIixoLm1lc3NhZ2UpO3JldHVybn1jb25zdCB1PWMubWV0YWRhdGE7aWYodT09PXZvaWQgMHx8dS50eXBlPT09dm9pZCAwfHx1LnR5cGUudG9Mb3dlckNhc2UoKT09PSJnZW9tZXRyeSIpe3IhPT12b2lkIDAmJnIobmV3IEVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIit0KSksY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrdCk7cmV0dXJufXMucGFyc2UoYyxlKX0sbixyKX1sb2FkQXN5bmModCxlKXtyZXR1cm4gJHModGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49dGhpcyxyPXRoaXMucGF0aD09PSIiP01wLmV4dHJhY3RVcmxCYXNlKHQpOnRoaXMucGF0aDt0aGlzLnJlc291cmNlUGF0aD10aGlzLnJlc291cmNlUGF0aHx8cjtjb25zdCBzPW5ldyBRaSh0aGlzLm1hbmFnZXIpO3Muc2V0UGF0aCh0aGlzLnBhdGgpLHMuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLHMuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTtjb25zdCBvPXlpZWxkIHMubG9hZEFzeW5jKHQsZSksYT1KU09OLnBhcnNlKG8pLGw9YS5tZXRhZGF0YTtpZihsPT09dm9pZCAwfHxsLnR5cGU9PT12b2lkIDB8fGwudHlwZS50b0xvd2VyQ2FzZSgpPT09Imdlb21ldHJ5Iil0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK3QpO3JldHVybiB5aWVsZCBuLnBhcnNlQXN5bmMoYSl9KX1wYXJzZSh0LGUpe2NvbnN0IG49dGhpcy5wYXJzZUFuaW1hdGlvbnModC5hbmltYXRpb25zKSxyPXRoaXMucGFyc2VTaGFwZXModC5zaGFwZXMpLHM9dGhpcy5wYXJzZUdlb21ldHJpZXModC5nZW9tZXRyaWVzLHIpLG89dGhpcy5wYXJzZUltYWdlcyh0LmltYWdlcyxmdW5jdGlvbigpe2UhPT12b2lkIDAmJmUoYyl9KSxhPXRoaXMucGFyc2VUZXh0dXJlcyh0LnRleHR1cmVzLG8pLGw9dGhpcy5wYXJzZU1hdGVyaWFscyh0Lm1hdGVyaWFscyxhKSxjPXRoaXMucGFyc2VPYmplY3QodC5vYmplY3QscyxsLGEsbiksdT10aGlzLnBhcnNlU2tlbGV0b25zKHQuc2tlbGV0b25zLGMpO2lmKHRoaXMuYmluZFNrZWxldG9ucyhjLHUpLHRoaXMuYmluZExpZ2h0VGFyZ2V0cyhjKSxlIT09dm9pZCAwKXtsZXQgaD0hMTtmb3IoY29uc3QgZiBpbiBvKWlmKG9bZl0uZGF0YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpe2g9ITA7YnJlYWt9aD09PSExJiZlKGMpfXJldHVybiBjfXBhcnNlQXN5bmModCl7cmV0dXJuICRzKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPXRoaXMucGFyc2VBbmltYXRpb25zKHQuYW5pbWF0aW9ucyksbj10aGlzLnBhcnNlU2hhcGVzKHQuc2hhcGVzKSxyPXRoaXMucGFyc2VHZW9tZXRyaWVzKHQuZ2VvbWV0cmllcyxuKSxzPXlpZWxkIHRoaXMucGFyc2VJbWFnZXNBc3luYyh0LmltYWdlcyksbz10aGlzLnBhcnNlVGV4dHVyZXModC50ZXh0dXJlcyxzKSxhPXRoaXMucGFyc2VNYXRlcmlhbHModC5tYXRlcmlhbHMsbyksbD10aGlzLnBhcnNlT2JqZWN0KHQub2JqZWN0LHIsYSxvLGUpLGM9dGhpcy5wYXJzZVNrZWxldG9ucyh0LnNrZWxldG9ucyxsKTtyZXR1cm4gdGhpcy5iaW5kU2tlbGV0b25zKGwsYyksdGhpcy5iaW5kTGlnaHRUYXJnZXRzKGwpLGx9KX1wYXJzZVNoYXBlcyh0KXtjb25zdCBlPXt9O2lmKHQhPT12b2lkIDApZm9yKGxldCBuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtjb25zdCBzPW5ldyBKaSgpLmZyb21KU09OKHRbbl0pO2Vbcy51dWlkXT1zfXJldHVybiBlfXBhcnNlU2tlbGV0b25zKHQsZSl7Y29uc3Qgbj17fSxyPXt9O2lmKGUudHJhdmVyc2UoZnVuY3Rpb24ocyl7cy5pc0JvbmUmJihyW3MudXVpZF09cyl9KSx0IT09dm9pZCAwKWZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1uZXcgYXUoKS5mcm9tSlNPTih0W3NdLHIpO25bYS51dWlkXT1hfXJldHVybiBufXBhcnNlR2VvbWV0cmllcyh0LGUpe2NvbnN0IG49e307aWYodCE9PXZvaWQgMCl7Y29uc3Qgcj1uZXcgc3g7Zm9yKGxldCBzPTAsbz10Lmxlbmd0aDtzPG87cysrKXtsZXQgYTtjb25zdCBsPXRbc107c3dpdGNoKGwudHlwZSl7Y2FzZSJCdWZmZXJHZW9tZXRyeSI6Y2FzZSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI6YT1yLnBhcnNlKGwpO2JyZWFrO2RlZmF1bHQ6bC50eXBlIGluIElfP2E9SV9bbC50eXBlXS5mcm9tSlNPTihsLGUpOmNvbnNvbGUud2FybihgVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICIke2wudHlwZX0iYCl9YS51dWlkPWwudXVpZCxsLm5hbWUhPT12b2lkIDAmJihhLm5hbWU9bC5uYW1lKSxsLnVzZXJEYXRhIT09dm9pZCAwJiYoYS51c2VyRGF0YT1sLnVzZXJEYXRhKSxuW2wudXVpZF09YX19cmV0dXJuIG59cGFyc2VNYXRlcmlhbHModCxlKXtjb25zdCBuPXt9LHI9e307aWYodCE9PXZvaWQgMCl7Y29uc3Qgcz1uZXcga3U7cy5zZXRUZXh0dXJlcyhlKTtmb3IobGV0IG89MCxhPXQubGVuZ3RoO288YTtvKyspe2NvbnN0IGw9dFtvXTtuW2wudXVpZF09PT12b2lkIDAmJihuW2wudXVpZF09cy5wYXJzZShsKSkscltsLnV1aWRdPW5bbC51dWlkXX19cmV0dXJuIHJ9cGFyc2VBbmltYXRpb25zKHQpe2NvbnN0IGU9e307aWYodCE9PXZvaWQgMClmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10W25dLHM9UWEucGFyc2Uocik7ZVtzLnV1aWRdPXN9cmV0dXJuIGV9cGFyc2VJbWFnZXModCxlKXtjb25zdCBuPXRoaXMscj17fTtsZXQgcztmdW5jdGlvbiBvKGwpe3JldHVybiBuLm1hbmFnZXIuaXRlbVN0YXJ0KGwpLHMubG9hZChsLGZ1bmN0aW9uKCl7bi5tYW5hZ2VyLml0ZW1FbmQobCl9LHZvaWQgMCxmdW5jdGlvbigpe24ubWFuYWdlci5pdGVtRXJyb3IobCksbi5tYW5hZ2VyLml0ZW1FbmQobCl9KX1mdW5jdGlvbiBhKGwpe2lmKHR5cGVvZiBsPT0ic3RyaW5nIil7Y29uc3QgYz1sLHU9L14oXC9cLyl8KFthLXpdKzooXC9cLyk/KS9pLnRlc3QoYyk/YzpuLnJlc291cmNlUGF0aCtjO3JldHVybiBvKHUpfWVsc2UgcmV0dXJuIGwuZGF0YT97ZGF0YTpLcyhsLnR5cGUsbC5kYXRhKSx3aWR0aDpsLndpZHRoLGhlaWdodDpsLmhlaWdodH06bnVsbH1pZih0IT09dm9pZCAwJiZ0Lmxlbmd0aD4wKXtjb25zdCBsPW5ldyBfcChlKTtzPW5ldyB0bChsKSxzLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2ZvcihsZXQgYz0wLHU9dC5sZW5ndGg7Yzx1O2MrKyl7Y29uc3QgaD10W2NdLGY9aC51cmw7aWYoQXJyYXkuaXNBcnJheShmKSl7Y29uc3QgZD1bXTtmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IGc9ZltwXSxtPWEoZyk7bSE9PW51bGwmJihtIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudD9kLnB1c2gobSk6ZC5wdXNoKG5ldyBDaShtLmRhdGEsbS53aWR0aCxtLmhlaWdodCkpKX1yW2gudXVpZF09bmV3IHRzKGQpfWVsc2V7Y29uc3QgZD1hKGgudXJsKTtyW2gudXVpZF09bmV3IHRzKGQpfX19cmV0dXJuIHJ9cGFyc2VJbWFnZXNBc3luYyh0KXtyZXR1cm4gJHModGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGU9dGhpcyxuPXt9O2xldCByO2Z1bmN0aW9uIHMobyl7cmV0dXJuICRzKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZih0eXBlb2Ygbz09InN0cmluZyIpe2NvbnN0IGE9byxsPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KGEpP2E6ZS5yZXNvdXJjZVBhdGgrYTtyZXR1cm4geWllbGQgci5sb2FkQXN5bmMobCl9ZWxzZSByZXR1cm4gby5kYXRhP3tkYXRhOktzKG8udHlwZSxvLmRhdGEpLHdpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fTpudWxsfSl9aWYodCE9PXZvaWQgMCYmdC5sZW5ndGg+MCl7cj1uZXcgdGwodGhpcy5tYW5hZ2VyKSxyLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2ZvcihsZXQgbz0wLGE9dC5sZW5ndGg7bzxhO28rKyl7Y29uc3QgbD10W29dLGM9bC51cmw7aWYoQXJyYXkuaXNBcnJheShjKSl7Y29uc3QgdT1bXTtmb3IobGV0IGg9MCxmPWMubGVuZ3RoO2g8ZjtoKyspe2NvbnN0IGQ9Y1toXSxwPXlpZWxkIHMoZCk7cCE9PW51bGwmJihwIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudD91LnB1c2gocCk6dS5wdXNoKG5ldyBDaShwLmRhdGEscC53aWR0aCxwLmhlaWdodCkpKX1uW2wudXVpZF09bmV3IHRzKHUpfWVsc2V7Y29uc3QgdT15aWVsZCBzKGwudXJsKTtuW2wudXVpZF09bmV3IHRzKHUpfX19cmV0dXJuIG59KX1wYXJzZVRleHR1cmVzKHQsZSl7ZnVuY3Rpb24gbihzLG8pe3JldHVybiB0eXBlb2Ygcz09Im51bWJlciI/czooY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIscyksb1tzXSl9Y29uc3Qgcj17fTtpZih0IT09dm9pZCAwKWZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT10W3NdO2EuaW1hZ2U9PT12b2lkIDAmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLGEudXVpZCksZVthLmltYWdlXT09PXZvaWQgMCYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsYS5pbWFnZSk7Y29uc3QgbD1lW2EuaW1hZ2VdLGM9bC5kYXRhO2xldCB1O0FycmF5LmlzQXJyYXkoYyk/KHU9bmV3IElhLGMubGVuZ3RoPT09NiYmKHUubmVlZHNVcGRhdGU9ITApKTooYyYmYy5kYXRhP3U9bmV3IENpOnU9bmV3IFRlLGMmJih1Lm5lZWRzVXBkYXRlPSEwKSksdS5zb3VyY2U9bCx1LnV1aWQ9YS51dWlkLGEubmFtZSE9PXZvaWQgMCYmKHUubmFtZT1hLm5hbWUpLGEubWFwcGluZyE9PXZvaWQgMCYmKHUubWFwcGluZz1uKGEubWFwcGluZyx0VCkpLGEuY2hhbm5lbCE9PXZvaWQgMCYmKHUuY2hhbm5lbD1hLmNoYW5uZWwpLGEub2Zmc2V0IT09dm9pZCAwJiZ1Lm9mZnNldC5mcm9tQXJyYXkoYS5vZmZzZXQpLGEucmVwZWF0IT09dm9pZCAwJiZ1LnJlcGVhdC5mcm9tQXJyYXkoYS5yZXBlYXQpLGEuY2VudGVyIT09dm9pZCAwJiZ1LmNlbnRlci5mcm9tQXJyYXkoYS5jZW50ZXIpLGEucm90YXRpb24hPT12b2lkIDAmJih1LnJvdGF0aW9uPWEucm90YXRpb24pLGEud3JhcCE9PXZvaWQgMCYmKHUud3JhcFM9bihhLndyYXBbMF0sb3gpLHUud3JhcFQ9bihhLndyYXBbMV0sb3gpKSxhLmZvcm1hdCE9PXZvaWQgMCYmKHUuZm9ybWF0PWEuZm9ybWF0KSxhLmludGVybmFsRm9ybWF0IT09dm9pZCAwJiYodS5pbnRlcm5hbEZvcm1hdD1hLmludGVybmFsRm9ybWF0KSxhLnR5cGUhPT12b2lkIDAmJih1LnR5cGU9YS50eXBlKSxhLmNvbG9yU3BhY2UhPT12b2lkIDAmJih1LmNvbG9yU3BhY2U9YS5jb2xvclNwYWNlKSxhLm1pbkZpbHRlciE9PXZvaWQgMCYmKHUubWluRmlsdGVyPW4oYS5taW5GaWx0ZXIsYXgpKSxhLm1hZ0ZpbHRlciE9PXZvaWQgMCYmKHUubWFnRmlsdGVyPW4oYS5tYWdGaWx0ZXIsYXgpKSxhLmFuaXNvdHJvcHkhPT12b2lkIDAmJih1LmFuaXNvdHJvcHk9YS5hbmlzb3Ryb3B5KSxhLmZsaXBZIT09dm9pZCAwJiYodS5mbGlwWT1hLmZsaXBZKSxhLmdlbmVyYXRlTWlwbWFwcyE9PXZvaWQgMCYmKHUuZ2VuZXJhdGVNaXBtYXBzPWEuZ2VuZXJhdGVNaXBtYXBzKSxhLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJih1LnByZW11bHRpcGx5QWxwaGE9YS5wcmVtdWx0aXBseUFscGhhKSxhLnVucGFja0FsaWdubWVudCE9PXZvaWQgMCYmKHUudW5wYWNrQWxpZ25tZW50PWEudW5wYWNrQWxpZ25tZW50KSxhLmNvbXBhcmVGdW5jdGlvbiE9PXZvaWQgMCYmKHUuY29tcGFyZUZ1bmN0aW9uPWEuY29tcGFyZUZ1bmN0aW9uKSxhLnVzZXJEYXRhIT09dm9pZCAwJiYodS51c2VyRGF0YT1hLnVzZXJEYXRhKSxyW2EudXVpZF09dX1yZXR1cm4gcn1wYXJzZU9iamVjdCh0LGUsbixyLHMpe2xldCBvO2Z1bmN0aW9uIGEoZil7cmV0dXJuIGVbZl09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLGYpLGVbZl19ZnVuY3Rpb24gbChmKXtpZihmIT09dm9pZCAwKXtpZihBcnJheS5pc0FycmF5KGYpKXtjb25zdCBkPVtdO2ZvcihsZXQgcD0wLHk9Zi5sZW5ndGg7cDx5O3ArKyl7Y29uc3QgZz1mW3BdO25bZ109PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLGcpLGQucHVzaChuW2ddKX1yZXR1cm4gZH1yZXR1cm4gbltmXT09PXZvaWQgMCYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsZiksbltmXX19ZnVuY3Rpb24gYyhmKXtyZXR1cm4gcltmXT09PXZvaWQgMCYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIixmKSxyW2ZdfWxldCB1LGg7c3dpdGNoKHQudHlwZSl7Y2FzZSJTY2VuZSI6bz1uZXcgR3ksdC5iYWNrZ3JvdW5kIT09dm9pZCAwJiYoTnVtYmVyLmlzSW50ZWdlcih0LmJhY2tncm91bmQpP28uYmFja2dyb3VuZD1uZXcgeHQodC5iYWNrZ3JvdW5kKTpvLmJhY2tncm91bmQ9Yyh0LmJhY2tncm91bmQpKSx0LmVudmlyb25tZW50IT09dm9pZCAwJiYoby5lbnZpcm9ubWVudD1jKHQuZW52aXJvbm1lbnQpKSx0LmZvZyE9PXZvaWQgMCYmKHQuZm9nLnR5cGU9PT0iRm9nIj9vLmZvZz1uZXcgdHUodC5mb2cuY29sb3IsdC5mb2cubmVhcix0LmZvZy5mYXIpOnQuZm9nLnR5cGU9PT0iRm9nRXhwMiImJihvLmZvZz1uZXcgUWModC5mb2cuY29sb3IsdC5mb2cuZGVuc2l0eSkpLHQuZm9nLm5hbWUhPT0iIiYmKG8uZm9nLm5hbWU9dC5mb2cubmFtZSkpLHQuYmFja2dyb3VuZEJsdXJyaW5lc3MhPT12b2lkIDAmJihvLmJhY2tncm91bmRCbHVycmluZXNzPXQuYmFja2dyb3VuZEJsdXJyaW5lc3MpLHQuYmFja2dyb3VuZEludGVuc2l0eSE9PXZvaWQgMCYmKG8uYmFja2dyb3VuZEludGVuc2l0eT10LmJhY2tncm91bmRJbnRlbnNpdHkpLHQuYmFja2dyb3VuZFJvdGF0aW9uIT09dm9pZCAwJiZvLmJhY2tncm91bmRSb3RhdGlvbi5mcm9tQXJyYXkodC5iYWNrZ3JvdW5kUm90YXRpb24pLHQuZW52aXJvbm1lbnRJbnRlbnNpdHkhPT12b2lkIDAmJihvLmVudmlyb25tZW50SW50ZW5zaXR5PXQuZW52aXJvbm1lbnRJbnRlbnNpdHkpLHQuZW52aXJvbm1lbnRSb3RhdGlvbiE9PXZvaWQgMCYmby5lbnZpcm9ubWVudFJvdGF0aW9uLmZyb21BcnJheSh0LmVudmlyb25tZW50Um90YXRpb24pO2JyZWFrO2Nhc2UiUGVyc3BlY3RpdmVDYW1lcmEiOm89bmV3IFllKHQuZm92LHQuYXNwZWN0LHQubmVhcix0LmZhciksdC5mb2N1cyE9PXZvaWQgMCYmKG8uZm9jdXM9dC5mb2N1cyksdC56b29tIT09dm9pZCAwJiYoby56b29tPXQuem9vbSksdC5maWxtR2F1Z2UhPT12b2lkIDAmJihvLmZpbG1HYXVnZT10LmZpbG1HYXVnZSksdC5maWxtT2Zmc2V0IT09dm9pZCAwJiYoby5maWxtT2Zmc2V0PXQuZmlsbU9mZnNldCksdC52aWV3IT09dm9pZCAwJiYoby52aWV3PU9iamVjdC5hc3NpZ24oe30sdC52aWV3KSk7YnJlYWs7Y2FzZSJPcnRob2dyYXBoaWNDYW1lcmEiOm89bmV3IHp1KHQubGVmdCx0LnJpZ2h0LHQudG9wLHQuYm90dG9tLHQubmVhcix0LmZhciksdC56b29tIT09dm9pZCAwJiYoby56b29tPXQuem9vbSksdC52aWV3IT09dm9pZCAwJiYoby52aWV3PU9iamVjdC5hc3NpZ24oe30sdC52aWV3KSk7YnJlYWs7Y2FzZSJBbWJpZW50TGlnaHQiOm89bmV3IHR4KHQuY29sb3IsdC5pbnRlbnNpdHkpO2JyZWFrO2Nhc2UiRGlyZWN0aW9uYWxMaWdodCI6bz1uZXcgUV8odC5jb2xvcix0LmludGVuc2l0eSksby50YXJnZXQ9dC50YXJnZXR8fCIiO2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6bz1uZXcgS18odC5jb2xvcix0LmludGVuc2l0eSx0LmRpc3RhbmNlLHQuZGVjYXkpO2JyZWFrO2Nhc2UiUmVjdEFyZWFMaWdodCI6bz1uZXcgZXgodC5jb2xvcix0LmludGVuc2l0eSx0LndpZHRoLHQuaGVpZ2h0KTticmVhaztjYXNlIlNwb3RMaWdodCI6bz1uZXcgSl8odC5jb2xvcix0LmludGVuc2l0eSx0LmRpc3RhbmNlLHQuYW5nbGUsdC5wZW51bWJyYSx0LmRlY2F5KSxvLnRhcmdldD10LnRhcmdldHx8IiI7YnJlYWs7Y2FzZSJIZW1pc3BoZXJlTGlnaHQiOm89bmV3IHFfKHQuY29sb3IsdC5ncm91bmRDb2xvcix0LmludGVuc2l0eSk7YnJlYWs7Y2FzZSJMaWdodFByb2JlIjpvPW5ldyBpeCgpLmZyb21KU09OKHQpO2JyZWFrO2Nhc2UiU2tpbm5lZE1lc2giOnU9YSh0Lmdlb21ldHJ5KSxoPWwodC5tYXRlcmlhbCksbz1uZXcgdF8odSxoKSx0LmJpbmRNb2RlIT09dm9pZCAwJiYoby5iaW5kTW9kZT10LmJpbmRNb2RlKSx0LmJpbmRNYXRyaXghPT12b2lkIDAmJm8uYmluZE1hdHJpeC5mcm9tQXJyYXkodC5iaW5kTWF0cml4KSx0LnNrZWxldG9uIT09dm9pZCAwJiYoby5za2VsZXRvbj10LnNrZWxldG9uKTticmVhaztjYXNlIk1lc2giOnU9YSh0Lmdlb21ldHJ5KSxoPWwodC5tYXRlcmlhbCksbz1uZXcgVWUodSxoKTticmVhaztjYXNlIkluc3RhbmNlZE1lc2giOnU9YSh0Lmdlb21ldHJ5KSxoPWwodC5tYXRlcmlhbCk7Y29uc3QgZj10LmNvdW50LGQ9dC5pbnN0YW5jZU1hdHJpeCxwPXQuaW5zdGFuY2VDb2xvcjtvPW5ldyByXyh1LGgsZiksby5pbnN0YW5jZU1hdHJpeD1uZXcgeG8obmV3IEZsb2F0MzJBcnJheShkLmFycmF5KSwxNikscCE9PXZvaWQgMCYmKG8uaW5zdGFuY2VDb2xvcj1uZXcgeG8obmV3IEZsb2F0MzJBcnJheShwLmFycmF5KSxwLml0ZW1TaXplKSk7YnJlYWs7Y2FzZSJCYXRjaGVkTWVzaCI6dT1hKHQuZ2VvbWV0cnkpLGg9bCh0Lm1hdGVyaWFsKSxvPW5ldyBvXyh0Lm1heEluc3RhbmNlQ291bnQsdC5tYXhWZXJ0ZXhDb3VudCx0Lm1heEluZGV4Q291bnQsaCksby5nZW9tZXRyeT11LG8ucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10LnBlck9iamVjdEZydXN0dW1DdWxsZWQsby5zb3J0T2JqZWN0cz10LnNvcnRPYmplY3RzLG8uX2RyYXdSYW5nZXM9dC5kcmF3UmFuZ2VzLG8uX3Jlc2VydmVkUmFuZ2VzPXQucmVzZXJ2ZWRSYW5nZXMsby5fdmlzaWJpbGl0eT10LnZpc2liaWxpdHksby5fYWN0aXZlPXQuYWN0aXZlLG8uX2JvdW5kcz10LmJvdW5kcy5tYXAoeT0+e2NvbnN0IGc9bmV3IG1lO2cubWluLmZyb21BcnJheSh5LmJveE1pbiksZy5tYXguZnJvbUFycmF5KHkuYm94TWF4KTtjb25zdCBtPW5ldyBxZTtyZXR1cm4gbS5yYWRpdXM9eS5zcGhlcmVSYWRpdXMsbS5jZW50ZXIuZnJvbUFycmF5KHkuc3BoZXJlQ2VudGVyKSx7Ym94SW5pdGlhbGl6ZWQ6eS5ib3hJbml0aWFsaXplZCxib3g6ZyxzcGhlcmVJbml0aWFsaXplZDp5LnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZTptfX0pLG8uX21heEluc3RhbmNlQ291bnQ9dC5tYXhJbnN0YW5jZUNvdW50LG8uX21heFZlcnRleENvdW50PXQubWF4VmVydGV4Q291bnQsby5fbWF4SW5kZXhDb3VudD10Lm1heEluZGV4Q291bnQsby5fZ2VvbWV0cnlJbml0aWFsaXplZD10Lmdlb21ldHJ5SW5pdGlhbGl6ZWQsby5fZ2VvbWV0cnlDb3VudD10Lmdlb21ldHJ5Q291bnQsby5fbWF0cmljZXNUZXh0dXJlPWModC5tYXRyaWNlc1RleHR1cmUudXVpZCksdC5jb2xvcnNUZXh0dXJlIT09dm9pZCAwJiYoby5fY29sb3JzVGV4dHVyZT1jKHQuY29sb3JzVGV4dHVyZS51dWlkKSk7YnJlYWs7Y2FzZSJMT0QiOm89bmV3IFl5O2JyZWFrO2Nhc2UiTGluZSI6bz1uZXcgQXIoYSh0Lmdlb21ldHJ5KSxsKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkxpbmVMb29wIjpvPW5ldyBoXyhhKHQuZ2VvbWV0cnkpLGwodC5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiTGluZVNlZ21lbnRzIjpvPW5ldyBSaShhKHQuZ2VvbWV0cnkpLGwodC5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiUG9pbnRDbG91ZCI6Y2FzZSJQb2ludHMiOm89bmV3IGRfKGEodC5nZW9tZXRyeSksbCh0Lm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJTcHJpdGUiOm89bmV3IFh5KGwodC5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiR3JvdXAiOm89bmV3IFNvO2JyZWFrO2Nhc2UiQm9uZSI6bz1uZXcgV2Q7YnJlYWs7ZGVmYXVsdDpvPW5ldyBhZX1pZihvLnV1aWQ9dC51dWlkLHQubmFtZSE9PXZvaWQgMCYmKG8ubmFtZT10Lm5hbWUpLHQubWF0cml4IT09dm9pZCAwPyhvLm1hdHJpeC5mcm9tQXJyYXkodC5tYXRyaXgpLHQubWF0cml4QXV0b1VwZGF0ZSE9PXZvaWQgMCYmKG8ubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUpLG8ubWF0cml4QXV0b1VwZGF0ZSYmby5tYXRyaXguZGVjb21wb3NlKG8ucG9zaXRpb24sby5xdWF0ZXJuaW9uLG8uc2NhbGUpKToodC5wb3NpdGlvbiE9PXZvaWQgMCYmby5wb3NpdGlvbi5mcm9tQXJyYXkodC5wb3NpdGlvbiksdC5yb3RhdGlvbiE9PXZvaWQgMCYmby5yb3RhdGlvbi5mcm9tQXJyYXkodC5yb3RhdGlvbiksdC5xdWF0ZXJuaW9uIT09dm9pZCAwJiZvLnF1YXRlcm5pb24uZnJvbUFycmF5KHQucXVhdGVybmlvbiksdC5zY2FsZSE9PXZvaWQgMCYmby5zY2FsZS5mcm9tQXJyYXkodC5zY2FsZSkpLHQudXAhPT12b2lkIDAmJm8udXAuZnJvbUFycmF5KHQudXApLHQuY2FzdFNoYWRvdyE9PXZvaWQgMCYmKG8uY2FzdFNoYWRvdz10LmNhc3RTaGFkb3cpLHQucmVjZWl2ZVNoYWRvdyE9PXZvaWQgMCYmKG8ucmVjZWl2ZVNoYWRvdz10LnJlY2VpdmVTaGFkb3cpLHQuc2hhZG93JiYodC5zaGFkb3cuaW50ZW5zaXR5IT09dm9pZCAwJiYoby5zaGFkb3cuaW50ZW5zaXR5PXQuc2hhZG93LmludGVuc2l0eSksdC5zaGFkb3cuYmlhcyE9PXZvaWQgMCYmKG8uc2hhZG93LmJpYXM9dC5zaGFkb3cuYmlhcyksdC5zaGFkb3cubm9ybWFsQmlhcyE9PXZvaWQgMCYmKG8uc2hhZG93Lm5vcm1hbEJpYXM9dC5zaGFkb3cubm9ybWFsQmlhcyksdC5zaGFkb3cucmFkaXVzIT09dm9pZCAwJiYoby5zaGFkb3cucmFkaXVzPXQuc2hhZG93LnJhZGl1cyksdC5zaGFkb3cubWFwU2l6ZSE9PXZvaWQgMCYmby5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkodC5zaGFkb3cubWFwU2l6ZSksdC5zaGFkb3cuY2FtZXJhIT09dm9pZCAwJiYoby5zaGFkb3cuY2FtZXJhPXRoaXMucGFyc2VPYmplY3QodC5zaGFkb3cuY2FtZXJhKSkpLHQudmlzaWJsZSE9PXZvaWQgMCYmKG8udmlzaWJsZT10LnZpc2libGUpLHQuZnJ1c3R1bUN1bGxlZCE9PXZvaWQgMCYmKG8uZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQpLHQucmVuZGVyT3JkZXIhPT12b2lkIDAmJihvLnJlbmRlck9yZGVyPXQucmVuZGVyT3JkZXIpLHQudXNlckRhdGEhPT12b2lkIDAmJihvLnVzZXJEYXRhPXQudXNlckRhdGEpLHQubGF5ZXJzIT09dm9pZCAwJiYoby5sYXllcnMubWFzaz10LmxheWVycyksdC5jaGlsZHJlbiE9PXZvaWQgMCl7Y29uc3QgZj10LmNoaWxkcmVuO2ZvcihsZXQgZD0wO2Q8Zi5sZW5ndGg7ZCsrKW8uYWRkKHRoaXMucGFyc2VPYmplY3QoZltkXSxlLG4scixzKSl9aWYodC5hbmltYXRpb25zIT09dm9pZCAwKXtjb25zdCBmPXQuYW5pbWF0aW9ucztmb3IobGV0IGQ9MDtkPGYubGVuZ3RoO2QrKyl7Y29uc3QgcD1mW2RdO28uYW5pbWF0aW9ucy5wdXNoKHNbcF0pfX1pZih0LnR5cGU9PT0iTE9EIil7dC5hdXRvVXBkYXRlIT09dm9pZCAwJiYoby5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSk7Y29uc3QgZj10LmxldmVscztmb3IobGV0IGQ9MDtkPGYubGVuZ3RoO2QrKyl7Y29uc3QgcD1mW2RdLHk9by5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIixwLm9iamVjdCk7eSE9PXZvaWQgMCYmby5hZGRMZXZlbCh5LHAuZGlzdGFuY2UscC5oeXN0ZXJlc2lzKX19cmV0dXJuIG99YmluZFNrZWxldG9ucyh0LGUpe09iamVjdC5rZXlzKGUpLmxlbmd0aCE9PTAmJnQudHJhdmVyc2UoZnVuY3Rpb24obil7aWYobi5pc1NraW5uZWRNZXNoPT09ITAmJm4uc2tlbGV0b24hPT12b2lkIDApe2NvbnN0IHI9ZVtuLnNrZWxldG9uXTtyPT09dm9pZCAwP2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBza2VsZXRvbiBmb3VuZCB3aXRoIFVVSUQ6IixuLnNrZWxldG9uKTpuLmJpbmQocixuLmJpbmRNYXRyaXgpfX0pfWJpbmRMaWdodFRhcmdldHModCl7dC50cmF2ZXJzZShmdW5jdGlvbihlKXtpZihlLmlzRGlyZWN0aW9uYWxMaWdodHx8ZS5pc1Nwb3RMaWdodCl7Y29uc3Qgbj1lLnRhcmdldCxyPXQuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidXVpZCIsbik7ciE9PXZvaWQgMD9lLnRhcmdldD1yOmUudGFyZ2V0PW5ldyBhZX19KX19Y29uc3QgdFQ9e1VWTWFwcGluZzpLbCxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6a2ksQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOm1yLEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOmxhLEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOmNhLEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOnFzfSxveD17UmVwZWF0V3JhcHBpbmc6dWEsQ2xhbXBUb0VkZ2VXcmFwcGluZzpxbixNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOmhhfSxheD17TmVhcmVzdEZpbHRlcjpYZSxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcjppZCxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOllzLExpbmVhckZpbHRlcjpWZSxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOmZhLExpbmVhck1pcG1hcExpbmVhckZpbHRlcjp3aX07Y2xhc3MgZVQgZXh0ZW5kcyBBbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmlzSW1hZ2VCaXRtYXBMb2FkZXI9ITAsdHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwPT0idW5kZWZpbmVkIiYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpLHR5cGVvZiBmZXRjaD09InVuZGVmaW5lZCImJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4iKSx0aGlzLm9wdGlvbnM9e3ByZW11bHRpcGx5QWxwaGE6Im5vbmUifX1zZXRPcHRpb25zKHQpe3JldHVybiB0aGlzLm9wdGlvbnM9dCx0aGlzfWxvYWQodCxlLG4scil7dD09PXZvaWQgMCYmKHQ9IiIpLHRoaXMucGF0aCE9PXZvaWQgMCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3Qgcz10aGlzLG89amkuZ2V0KHQpO2lmKG8hPT12b2lkIDApe2lmKHMubWFuYWdlci5pdGVtU3RhcnQodCksby50aGVuKXtvLnRoZW4oYz0+e2UmJmUoYykscy5tYW5hZ2VyLml0ZW1FbmQodCl9KS5jYXRjaChjPT57ciYmcihjKX0pO3JldHVybn1yZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUobykscy5tYW5hZ2VyLml0ZW1FbmQodCl9LDApLG99Y29uc3QgYT17fTthLmNyZWRlbnRpYWxzPXRoaXMuY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj8ic2FtZS1vcmlnaW4iOiJpbmNsdWRlIixhLmhlYWRlcnM9dGhpcy5yZXF1ZXN0SGVhZGVyO2NvbnN0IGw9ZmV0Y2godCxhKS50aGVuKGZ1bmN0aW9uKGMpe3JldHVybiBjLmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGMsT2JqZWN0LmFzc2lnbihzLm9wdGlvbnMse2NvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn0pKX0pLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGppLmFkZCh0LGMpLGUmJmUoYykscy5tYW5hZ2VyLml0ZW1FbmQodCksY30pLmNhdGNoKGZ1bmN0aW9uKGMpe3ImJnIoYyksamkucmVtb3ZlKHQpLHMubWFuYWdlci5pdGVtRXJyb3IodCkscy5tYW5hZ2VyLml0ZW1FbmQodCl9KTtqaS5hZGQodCxsKSxzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpfX1sZXQgVnU7Y2xhc3MgYnB7c3RhdGljIGdldENvbnRleHQoKXtyZXR1cm4gVnU9PT12b2lkIDAmJihWdT1uZXcod2luZG93LkF1ZGlvQ29udGV4dHx8d2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkpLFZ1fXN0YXRpYyBzZXRDb250ZXh0KHQpe1Z1PXR9fWNsYXNzIG5UIGV4dGVuZHMgQW57Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixyKXtjb25zdCBzPXRoaXMsbz1uZXcgUWkodGhpcy5tYW5hZ2VyKTtvLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSxvLnNldFBhdGgodGhpcy5wYXRoKSxvLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyksby5sb2FkKHQsZnVuY3Rpb24obCl7dHJ5e2NvbnN0IGM9bC5zbGljZSgwKTticC5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKGMsZnVuY3Rpb24oaCl7ZShoKX0pLmNhdGNoKGEpfWNhdGNoKGMpe2EoYyl9fSxuLHIpO2Z1bmN0aW9uIGEobCl7cj9yKGwpOmNvbnNvbGUuZXJyb3IobCkscy5tYW5hZ2VyLml0ZW1FcnJvcih0KX19fWNvbnN0IGx4PW5ldyBSdCxjeD1uZXcgUnQscHM9bmV3IFJ0O2NsYXNzIGlUe2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJTdGVyZW9DYW1lcmEiLHRoaXMuYXNwZWN0PTEsdGhpcy5leWVTZXA9LjA2NCx0aGlzLmNhbWVyYUw9bmV3IFllLHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKDEpLHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuY2FtZXJhUj1uZXcgWWUsdGhpcy5jYW1lcmFSLmxheWVycy5lbmFibGUoMiksdGhpcy5jYW1lcmFSLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fY2FjaGU9e2ZvY3VzOm51bGwsZm92Om51bGwsYXNwZWN0Om51bGwsbmVhcjpudWxsLGZhcjpudWxsLHpvb206bnVsbCxleWVTZXA6bnVsbH19dXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5fY2FjaGU7aWYoZS5mb2N1cyE9PXQuZm9jdXN8fGUuZm92IT09dC5mb3Z8fGUuYXNwZWN0IT09dC5hc3BlY3QqdGhpcy5hc3BlY3R8fGUubmVhciE9PXQubmVhcnx8ZS5mYXIhPT10LmZhcnx8ZS56b29tIT09dC56b29tfHxlLmV5ZVNlcCE9PXRoaXMuZXllU2VwKXtlLmZvY3VzPXQuZm9jdXMsZS5mb3Y9dC5mb3YsZS5hc3BlY3Q9dC5hc3BlY3QqdGhpcy5hc3BlY3QsZS5uZWFyPXQubmVhcixlLmZhcj10LmZhcixlLnpvb209dC56b29tLGUuZXllU2VwPXRoaXMuZXllU2VwLHBzLmNvcHkodC5wcm9qZWN0aW9uTWF0cml4KTtjb25zdCByPWUuZXllU2VwLzIscz1yKmUubmVhci9lLmZvY3VzLG89ZS5uZWFyKk1hdGgudGFuKFFyKmUuZm92Ki41KS9lLnpvb207bGV0IGEsbDtjeC5lbGVtZW50c1sxMl09LXIsbHguZWxlbWVudHNbMTJdPXIsYT0tbyplLmFzcGVjdCtzLGw9byplLmFzcGVjdCtzLHBzLmVsZW1lbnRzWzBdPTIqZS5uZWFyLyhsLWEpLHBzLmVsZW1lbnRzWzhdPShsK2EpLyhsLWEpLHRoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkocHMpLGE9LW8qZS5hc3BlY3QtcyxsPW8qZS5hc3BlY3Qtcyxwcy5lbGVtZW50c1swXT0yKmUubmVhci8obC1hKSxwcy5lbGVtZW50c1s4XT0obCthKS8obC1hKSx0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KHBzKX10aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKS5tdWx0aXBseShjeCksdGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCkubXVsdGlwbHkobHgpfX1jbGFzcyB1eCBleHRlbmRzIFlle2NvbnN0cnVjdG9yKHQ9W10pe3N1cGVyKCksdGhpcy5pc0FycmF5Q2FtZXJhPSEwLHRoaXMuY2FtZXJhcz10fX1jbGFzcyBoeHtjb25zdHJ1Y3Rvcih0PSEwKXt0aGlzLmF1dG9TdGFydD10LHRoaXMuc3RhcnRUaW1lPTAsdGhpcy5vbGRUaW1lPTAsdGhpcy5lbGFwc2VkVGltZT0wLHRoaXMucnVubmluZz0hMX1zdGFydCgpe3RoaXMuc3RhcnRUaW1lPWZ4KCksdGhpcy5vbGRUaW1lPXRoaXMuc3RhcnRUaW1lLHRoaXMuZWxhcHNlZFRpbWU9MCx0aGlzLnJ1bm5pbmc9ITB9c3RvcCgpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKSx0aGlzLnJ1bm5pbmc9ITEsdGhpcy5hdXRvU3RhcnQ9ITF9Z2V0RWxhcHNlZFRpbWUoKXtyZXR1cm4gdGhpcy5nZXREZWx0YSgpLHRoaXMuZWxhcHNlZFRpbWV9Z2V0RGVsdGEoKXtsZXQgdD0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe2NvbnN0IGU9ZngoKTt0PShlLXRoaXMub2xkVGltZSkvMWUzLHRoaXMub2xkVGltZT1lLHRoaXMuZWxhcHNlZFRpbWUrPXR9cmV0dXJuIHR9fWZ1bmN0aW9uIGZ4KCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfWNvbnN0IG1zPW5ldyBSLGR4PW5ldyBNbixyVD1uZXcgUixncz1uZXcgUjtjbGFzcyBzVCBleHRlbmRzIGFle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiLHRoaXMuY29udGV4dD1icC5nZXRDb250ZXh0KCksdGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCksdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmZpbHRlcj1udWxsLHRoaXMudGltZURlbHRhPTAsdGhpcy5fY2xvY2s9bmV3IGh4fWdldElucHV0KCl7cmV0dXJuIHRoaXMuZ2Fpbn1yZW1vdmVGaWx0ZXIoKXtyZXR1cm4gdGhpcy5maWx0ZXIhPT1udWxsJiYodGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwpLHRoaXN9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZmlsdGVyfXNldEZpbHRlcih0KXtyZXR1cm4gdGhpcy5maWx0ZXIhPT1udWxsPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPXQsdGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzfWdldE1hc3RlclZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRNYXN0ZXJWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9dXBkYXRlTWF0cml4V29ybGQodCl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQodCk7Y29uc3QgZT10aGlzLmNvbnRleHQubGlzdGVuZXIsbj10aGlzLnVwO2lmKHRoaXMudGltZURlbHRhPXRoaXMuX2Nsb2NrLmdldERlbHRhKCksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UobXMsZHgsclQpLGdzLnNldCgwLDAsLTEpLmFwcGx5UXVhdGVybmlvbihkeCksZS5wb3NpdGlvblgpe2NvbnN0IHI9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhO2UucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG1zLngsciksZS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobXMueSxyKSxlLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShtcy56LHIpLGUuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoZ3MueCxyKSxlLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGdzLnksciksZS5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShncy56LHIpLGUudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG4ueCxyKSxlLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnksciksZS51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobi56LHIpfWVsc2UgZS5zZXRQb3NpdGlvbihtcy54LG1zLnksbXMueiksZS5zZXRPcmllbnRhdGlvbihncy54LGdzLnksZ3MueixuLngsbi55LG4ueil9fWNsYXNzIHB4IGV4dGVuZHMgYWV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvIix0aGlzLmxpc3RlbmVyPXQsdGhpcy5jb250ZXh0PXQuY29udGV4dCx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdCh0LmdldElucHV0KCkpLHRoaXMuYXV0b3BsYXk9ITEsdGhpcy5idWZmZXI9bnVsbCx0aGlzLmRldHVuZT0wLHRoaXMubG9vcD0hMSx0aGlzLmxvb3BTdGFydD0wLHRoaXMubG9vcEVuZD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5kdXJhdGlvbj12b2lkIDAsdGhpcy5wbGF5YmFja1JhdGU9MSx0aGlzLmlzUGxheWluZz0hMSx0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMCx0aGlzLnNvdXJjZT1udWxsLHRoaXMuc291cmNlVHlwZT0iZW1wdHkiLHRoaXMuX3N0YXJ0ZWRBdD0wLHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5fY29ubmVjdGVkPSExLHRoaXMuZmlsdGVycz1bXX1nZXRPdXRwdXQoKXtyZXR1cm4gdGhpcy5nYWlufXNldE5vZGVTb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIix0aGlzLnNvdXJjZT10LHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFFbGVtZW50U291cmNlKHQpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSh0KSx0aGlzLmNvbm5lY3QoKSx0aGlzfXNldE1lZGlhU3RyZWFtU291cmNlKHQpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhU3RyZWFtTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHQpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0QnVmZmVyKHQpe3JldHVybiB0aGlzLmJ1ZmZlcj10LHRoaXMuc291cmNlVHlwZT0iYnVmZmVyIix0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKSx0aGlzfXBsYXkodD0wKXtpZih0aGlzLmlzUGxheWluZz09PSEwKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuIik7cmV0dXJufWlmKHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7cmV0dXJufXRoaXMuX3N0YXJ0ZWRBdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdDtjb25zdCBlPXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtyZXR1cm4gZS5idWZmZXI9dGhpcy5idWZmZXIsZS5sb29wPXRoaXMubG9vcCxlLmxvb3BTdGFydD10aGlzLmxvb3BTdGFydCxlLmxvb3BFbmQ9dGhpcy5sb29wRW5kLGUub25lbmRlZD10aGlzLm9uRW5kZWQuYmluZCh0aGlzKSxlLnN0YXJ0KHRoaXMuX3N0YXJ0ZWRBdCx0aGlzLl9wcm9ncmVzcyt0aGlzLm9mZnNldCx0aGlzLmR1cmF0aW9uKSx0aGlzLmlzUGxheWluZz0hMCx0aGlzLnNvdXJjZT1lLHRoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKSx0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSksdGhpcy5jb25uZWN0KCl9cGF1c2UoKXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5pc1BsYXlpbmc9PT0hMCYmKHRoaXMuX3Byb2dyZXNzKz1NYXRoLm1heCh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRlZEF0LDApKnRoaXMucGxheWJhY2tSYXRlLHRoaXMubG9vcD09PSEwJiYodGhpcy5fcHJvZ3Jlc3M9dGhpcy5fcHJvZ3Jlc3MlKHRoaXMuZHVyYXRpb258fHRoaXMuYnVmZmVyLmR1cmF0aW9uKSksdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSksdGhpc31zdG9wKHQ9MCl7aWYodGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtyZXR1cm59cmV0dXJuIHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5zb3VyY2UhPT1udWxsJiYodGhpcy5zb3VyY2Uuc3RvcCh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsKSx0aGlzLmlzUGxheWluZz0hMSx0aGlzfWNvbm5lY3QoKXtpZih0aGlzLmZpbHRlcnMubGVuZ3RoPjApe3RoaXMuc291cmNlLmNvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IobGV0IHQ9MSxlPXRoaXMuZmlsdGVycy5sZW5ndGg7dDxlO3QrKyl0aGlzLmZpbHRlcnNbdC0xXS5jb25uZWN0KHRoaXMuZmlsdGVyc1t0XSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXMuX2Nvbm5lY3RlZD0hMCx0aGlzfWRpc2Nvbm5lY3QoKXtpZih0aGlzLl9jb25uZWN0ZWQhPT0hMSl7aWYodGhpcy5maWx0ZXJzLmxlbmd0aD4wKXt0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKGxldCB0PTEsZT10aGlzLmZpbHRlcnMubGVuZ3RoO3Q8ZTt0KyspdGhpcy5maWx0ZXJzW3QtMV0uZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbdF0pO3RoaXMuZmlsdGVyc1t0aGlzLmZpbHRlcnMubGVuZ3RoLTFdLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSl9ZWxzZSB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpO3JldHVybiB0aGlzLl9jb25uZWN0ZWQ9ITEsdGhpc319Z2V0RmlsdGVycygpe3JldHVybiB0aGlzLmZpbHRlcnN9c2V0RmlsdGVycyh0KXtyZXR1cm4gdHx8KHQ9W10pLHRoaXMuX2Nvbm5lY3RlZD09PSEwPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXMuY29ubmVjdCgpKTp0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXN9c2V0RGV0dW5lKHQpe3JldHVybiB0aGlzLmRldHVuZT10LHRoaXMuaXNQbGF5aW5nPT09ITAmJnRoaXMuc291cmNlLmRldHVuZSE9PXZvaWQgMCYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfWdldERldHVuZSgpe3JldHVybiB0aGlzLmRldHVuZX1nZXRGaWx0ZXIoKXtyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbMF19c2V0RmlsdGVyKHQpe3JldHVybiB0aGlzLnNldEZpbHRlcnModD9bdF06W10pfXNldFBsYXliYWNrUmF0ZSh0KXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9dCx0aGlzLmlzUGxheWluZz09PSEwJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9Z2V0UGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfW9uRW5kZWQoKXt0aGlzLmlzUGxheWluZz0hMSx0aGlzLl9wcm9ncmVzcz0wfWdldExvb3AoKXtyZXR1cm4gdGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMT8oY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKSwhMSk6dGhpcy5sb29wfXNldExvb3AodCl7aWYodGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtyZXR1cm59cmV0dXJuIHRoaXMubG9vcD10LHRoaXMuaXNQbGF5aW5nPT09ITAmJih0aGlzLnNvdXJjZS5sb29wPXRoaXMubG9vcCksdGhpc31zZXRMb29wU3RhcnQodCl7cmV0dXJuIHRoaXMubG9vcFN0YXJ0PXQsdGhpc31zZXRMb29wRW5kKHQpe3JldHVybiB0aGlzLmxvb3BFbmQ9dCx0aGlzfWdldFZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdC5zb3VyY2VUeXBlIT09ImJ1ZmZlciI/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIHNvdXJjZSB0eXBlIGNhbm5vdCBiZSBjb3BpZWQuIiksdGhpcyk6KHRoaXMuYXV0b3BsYXk9dC5hdXRvcGxheSx0aGlzLmJ1ZmZlcj10LmJ1ZmZlcix0aGlzLmRldHVuZT10LmRldHVuZSx0aGlzLmxvb3A9dC5sb29wLHRoaXMubG9vcFN0YXJ0PXQubG9vcFN0YXJ0LHRoaXMubG9vcEVuZD10Lmxvb3BFbmQsdGhpcy5vZmZzZXQ9dC5vZmZzZXQsdGhpcy5kdXJhdGlvbj10LmR1cmF0aW9uLHRoaXMucGxheWJhY2tSYXRlPXQucGxheWJhY2tSYXRlLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPXQuaGFzUGxheWJhY2tDb250cm9sLHRoaXMuc291cmNlVHlwZT10LnNvdXJjZVR5cGUsdGhpcy5maWx0ZXJzPXQuZmlsdGVycy5zbGljZSgpLHRoaXMpfWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmxpc3RlbmVyKS5jb3B5KHRoaXMsdCl9fWNvbnN0IHlzPW5ldyBSLG14PW5ldyBNbixvVD1uZXcgUixfcz1uZXcgUjtjbGFzcyBhVCBleHRlbmRzIHB4e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKSx0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9IkhSVEYiLHRoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1jb25uZWN0KCl7c3VwZXIuY29ubmVjdCgpLHRoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1kaXNjb25uZWN0KCl7c3VwZXIuZGlzY29ubmVjdCgpLHRoaXMucGFubmVyLmRpc2Nvbm5lY3QodGhpcy5nYWluKX1nZXRPdXRwdXQoKXtyZXR1cm4gdGhpcy5wYW5uZXJ9Z2V0UmVmRGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2V9c2V0UmVmRGlzdGFuY2UodCl7cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlPXQsdGhpc31nZXRSb2xsb2ZmRmFjdG9yKCl7cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3J9c2V0Um9sbG9mZkZhY3Rvcih0KXtyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcj10LHRoaXN9Z2V0RGlzdGFuY2VNb2RlbCgpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsfXNldERpc3RhbmNlTW9kZWwodCl7cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw9dCx0aGlzfWdldE1heERpc3RhbmNlKCl7cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlfXNldE1heERpc3RhbmNlKHQpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZT10LHRoaXN9c2V0RGlyZWN0aW9uYWxDb25lKHQsZSxuKXtyZXR1cm4gdGhpcy5wYW5uZXIuY29uZUlubmVyQW5nbGU9dCx0aGlzLnBhbm5lci5jb25lT3V0ZXJBbmdsZT1lLHRoaXMucGFubmVyLmNvbmVPdXRlckdhaW49bix0aGlzfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe2lmKHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITAmJnRoaXMuaXNQbGF5aW5nPT09ITEpcmV0dXJuO3RoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHlzLG14LG9UKSxfcy5zZXQoMCwwLDEpLmFwcGx5UXVhdGVybmlvbihteCk7Y29uc3QgZT10aGlzLnBhbm5lcjtpZihlLnBvc2l0aW9uWCl7Y29uc3Qgbj10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7ZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoeXMueCxuKSxlLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh5cy55LG4pLGUucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHlzLnosbiksZS5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoX3MueCxuKSxlLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShfcy55LG4pLGUub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9zLnosbil9ZWxzZSBlLnNldFBvc2l0aW9uKHlzLngseXMueSx5cy56KSxlLnNldE9yaWVudGF0aW9uKF9zLngsX3MueSxfcy56KX19Y2xhc3MgbFR7Y29uc3RydWN0b3IodCxlPTIwNDgpe3RoaXMuYW5hbHlzZXI9dC5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCksdGhpcy5hbmFseXNlci5mZnRTaXplPWUsdGhpcy5kYXRhPW5ldyBVaW50OEFycmF5KHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQpLHQuZ2V0T3V0cHV0KCkuY29ubmVjdCh0aGlzLmFuYWx5c2VyKX1nZXRGcmVxdWVuY3lEYXRhKCl7cmV0dXJuIHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKSx0aGlzLmRhdGF9Z2V0QXZlcmFnZUZyZXF1ZW5jeSgpe2xldCB0PTA7Y29uc3QgZT10aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0Kz1lW25dO3JldHVybiB0L2UubGVuZ3RofX1jbGFzcyBneHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5iaW5kaW5nPXQsdGhpcy52YWx1ZVNpemU9bjtsZXQgcixzLG87c3dpdGNoKGUpe2Nhc2UicXVhdGVybmlvbiI6cj10aGlzLl9zbGVycCxzPXRoaXMuX3NsZXJwQWRkaXRpdmUsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbix0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KG4qNiksdGhpcy5fd29ya0luZGV4PTU7YnJlYWs7Y2FzZSJzdHJpbmciOmNhc2UiYm9vbCI6cj10aGlzLl9zZWxlY3Qscz10aGlzLl9zZWxlY3Qsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIsdGhpcy5idWZmZXI9bmV3IEFycmF5KG4qNSk7YnJlYWs7ZGVmYXVsdDpyPXRoaXMuX2xlcnAscz10aGlzLl9sZXJwQWRkaXRpdmUsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYyx0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KG4qNSl9dGhpcy5fbWl4QnVmZmVyUmVnaW9uPXIsdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmU9cyx0aGlzLl9zZXRJZGVudGl0eT1vLHRoaXMuX29yaWdJbmRleD0zLHRoaXMuX2FkZEluZGV4PTQsdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MCx0aGlzLnVzZUNvdW50PTAsdGhpcy5yZWZlcmVuY2VDb3VudD0wfWFjY3VtdWxhdGUodCxlKXtjb25zdCBuPXRoaXMuYnVmZmVyLHI9dGhpcy52YWx1ZVNpemUscz10KnIrcjtsZXQgbz10aGlzLmN1bXVsYXRpdmVXZWlnaHQ7aWYobz09PTApe2ZvcihsZXQgYT0wO2EhPT1yOysrYSluW3MrYV09blthXTtvPWV9ZWxzZXtvKz1lO2NvbnN0IGE9ZS9vO3RoaXMuX21peEJ1ZmZlclJlZ2lvbihuLHMsMCxhLHIpfXRoaXMuY3VtdWxhdGl2ZVdlaWdodD1vfWFjY3VtdWxhdGVBZGRpdGl2ZSh0KXtjb25zdCBlPXRoaXMuYnVmZmVyLG49dGhpcy52YWx1ZVNpemUscj1uKnRoaXMuX2FkZEluZGV4O3RoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPT09MCYmdGhpcy5fc2V0SWRlbnRpdHkoKSx0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShlLHIsMCx0LG4pLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlKz10fWFwcGx5KHQpe2NvbnN0IGU9dGhpcy52YWx1ZVNpemUsbj10aGlzLmJ1ZmZlcixyPXQqZStlLHM9dGhpcy5jdW11bGF0aXZlV2VpZ2h0LG89dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUsYT10aGlzLmJpbmRpbmc7aWYodGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MCxzPDEpe2NvbnN0IGw9ZSp0aGlzLl9vcmlnSW5kZXg7dGhpcy5fbWl4QnVmZmVyUmVnaW9uKG4scixsLDEtcyxlKX1vPjAmJnRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKG4scix0aGlzLl9hZGRJbmRleCplLDEsZSk7Zm9yKGxldCBsPWUsYz1lK2U7bCE9PWM7KytsKWlmKG5bbF0hPT1uW2wrZV0pe2Euc2V0VmFsdWUobixyKTticmVha319c2F2ZU9yaWdpbmFsU3RhdGUoKXtjb25zdCB0PXRoaXMuYmluZGluZyxlPXRoaXMuYnVmZmVyLG49dGhpcy52YWx1ZVNpemUscj1uKnRoaXMuX29yaWdJbmRleDt0LmdldFZhbHVlKGUscik7Zm9yKGxldCBzPW4sbz1yO3MhPT1vOysrcyllW3NdPWVbcitzJW5dO3RoaXMuX3NldElkZW50aXR5KCksdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MH1yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpe2NvbnN0IHQ9dGhpcy52YWx1ZVNpemUqMzt0aGlzLmJpbmRpbmcuc2V0VmFsdWUodGhpcy5idWZmZXIsdCl9X3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljKCl7Y29uc3QgdD10aGlzLl9hZGRJbmRleCp0aGlzLnZhbHVlU2l6ZSxlPXQrdGhpcy52YWx1ZVNpemU7Zm9yKGxldCBuPXQ7bjxlO24rKyl0aGlzLmJ1ZmZlcltuXT0wfV9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbigpe3RoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljKCksdGhpcy5idWZmZXJbdGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemUrM109MX1fc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyKCl7Y29uc3QgdD10aGlzLl9vcmlnSW5kZXgqdGhpcy52YWx1ZVNpemUsZT10aGlzLl9hZGRJbmRleCp0aGlzLnZhbHVlU2l6ZTtmb3IobGV0IG49MDtuPHRoaXMudmFsdWVTaXplO24rKyl0aGlzLmJ1ZmZlcltlK25dPXRoaXMuYnVmZmVyW3Qrbl19X3NlbGVjdCh0LGUsbixyLHMpe2lmKHI+PS41KWZvcihsZXQgbz0wO28hPT1zOysrbyl0W2Urb109dFtuK29dfV9zbGVycCh0LGUsbixyKXtNbi5zbGVycEZsYXQodCxlLHQsZSx0LG4scil9X3NsZXJwQWRkaXRpdmUodCxlLG4scixzKXtjb25zdCBvPXRoaXMuX3dvcmtJbmRleCpzO01uLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsbyx0LGUsdCxuKSxNbi5zbGVycEZsYXQodCxlLHQsZSx0LG8scil9X2xlcnAodCxlLG4scixzKXtjb25zdCBvPTEtcjtmb3IobGV0IGE9MDthIT09czsrK2Epe2NvbnN0IGw9ZSthO3RbbF09dFtsXSpvK3RbbithXSpyfX1fbGVycEFkZGl0aXZlKHQsZSxuLHIscyl7Zm9yKGxldCBvPTA7byE9PXM7KytvKXtjb25zdCBhPWUrbzt0W2FdPXRbYV0rdFtuK29dKnJ9fX1jb25zdCB3cD0iXFxbXFxdXFwuOlxcLyIsY1Q9bmV3IFJlZ0V4cCgiWyIrd3ArIl0iLCJnIiksQXA9IlteIit3cCsiXSIsdVQ9IlteIit3cC5yZXBsYWNlKCJcXC4iLCIiKSsiXSIsaFQ9LygoPzpXQytbXC86XSkqKS8uc291cmNlLnJlcGxhY2UoIldDIixBcCksZlQ9LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsdVQpLGRUPS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLEFwKSxwVD0vXC4oV0MrKSg/OlxbKC4rKVxdKT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsQXApLG1UPW5ldyBSZWdFeHAoIl4iK2hUK2ZUK2RUK3BUKyIkIiksZ1Q9WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIiwibWFwIl07Y2xhc3MgeVR7Y29uc3RydWN0b3IodCxlLG4pe2NvbnN0IHI9bnx8bGUucGFyc2VUcmFja05hbWUoZSk7dGhpcy5fdGFyZ2V0R3JvdXA9dCx0aGlzLl9iaW5kaW5ncz10LnN1YnNjcmliZV8oZSxyKX1nZXRWYWx1ZSh0LGUpe3RoaXMuYmluZCgpO2NvbnN0IG49dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHI9dGhpcy5fYmluZGluZ3Nbbl07ciE9PXZvaWQgMCYmci5nZXRWYWx1ZSh0LGUpfXNldFZhbHVlKHQsZSl7Y29uc3Qgbj10aGlzLl9iaW5kaW5ncztmb3IobGV0IHI9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHM9bi5sZW5ndGg7ciE9PXM7KytyKW5bcl0uc2V0VmFsdWUodCxlKX1iaW5kKCl7Y29uc3QgdD10aGlzLl9iaW5kaW5ncztmb3IobGV0IGU9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLG49dC5sZW5ndGg7ZSE9PW47KytlKXRbZV0uYmluZCgpfXVuYmluZCgpe2NvbnN0IHQ9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxuPXQubGVuZ3RoO2UhPT1uOysrZSl0W2VdLnVuYmluZCgpfX1jbGFzcyBsZXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5wYXRoPWUsdGhpcy5wYXJzZWRQYXRoPW58fGxlLnBhcnNlVHJhY2tOYW1lKGUpLHRoaXMubm9kZT1sZS5maW5kTm9kZSh0LHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSksdGhpcy5yb290Tm9kZT10LHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5ib3VuZCx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYm91bmR9c3RhdGljIGNyZWF0ZSh0LGUsbil7cmV0dXJuIHQmJnQuaXNBbmltYXRpb25PYmplY3RHcm91cD9uZXcgbGUuQ29tcG9zaXRlKHQsZSxuKTpuZXcgbGUodCxlLG4pfXN0YXRpYyBzYW5pdGl6ZU5vZGVOYW1lKHQpe3JldHVybiB0LnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKGNULCIiKX1zdGF0aWMgcGFyc2VUcmFja05hbWUodCl7Y29uc3QgZT1tVC5leGVjKHQpO2lmKGU9PT1udWxsKXRocm93IG5ldyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAiK3QpO2NvbnN0IG49e25vZGVOYW1lOmVbMl0sb2JqZWN0TmFtZTplWzNdLG9iamVjdEluZGV4OmVbNF0scHJvcGVydHlOYW1lOmVbNV0scHJvcGVydHlJbmRleDplWzZdfSxyPW4ubm9kZU5hbWUmJm4ubm9kZU5hbWUubGFzdEluZGV4T2YoIi4iKTtpZihyIT09dm9pZCAwJiZyIT09LTEpe2NvbnN0IHM9bi5ub2RlTmFtZS5zdWJzdHJpbmcocisxKTtnVC5pbmRleE9mKHMpIT09LTEmJihuLm5vZGVOYW1lPW4ubm9kZU5hbWUuc3Vic3RyaW5nKDAsciksbi5vYmplY3ROYW1lPXMpfWlmKG4ucHJvcGVydHlOYW1lPT09bnVsbHx8bi5wcm9wZXJ0eU5hbWUubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrdCk7cmV0dXJuIG59c3RhdGljIGZpbmROb2RlKHQsZSl7aWYoZT09PXZvaWQgMHx8ZT09PSIifHxlPT09Ii4ifHxlPT09LTF8fGU9PT10Lm5hbWV8fGU9PT10LnV1aWQpcmV0dXJuIHQ7aWYodC5za2VsZXRvbil7Y29uc3Qgbj10LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoZSk7aWYobiE9PXZvaWQgMClyZXR1cm4gbn1pZih0LmNoaWxkcmVuKXtjb25zdCBuPWZ1bmN0aW9uKHMpe2ZvcihsZXQgbz0wO288cy5sZW5ndGg7bysrKXtjb25zdCBhPXNbb107aWYoYS5uYW1lPT09ZXx8YS51dWlkPT09ZSlyZXR1cm4gYTtjb25zdCBsPW4oYS5jaGlsZHJlbik7aWYobClyZXR1cm4gbH1yZXR1cm4gbnVsbH0scj1uKHQuY2hpbGRyZW4pO2lmKHIpcmV0dXJuIHJ9cmV0dXJuIG51bGx9X2dldFZhbHVlX3VuYXZhaWxhYmxlKCl7fV9zZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fZ2V0VmFsdWVfZGlyZWN0KHQsZSl7dFtlXT10aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV19X2dldFZhbHVlX2FycmF5KHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCByPTAscz1uLmxlbmd0aDtyIT09czsrK3IpdFtlKytdPW5bcl19X2dldFZhbHVlX2FycmF5RWxlbWVudCh0LGUpe3RbZV09dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF19X2dldFZhbHVlX3RvQXJyYXkodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheSh0LGUpfV9zZXRWYWx1ZV9kaXJlY3QodCxlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09dFtlXX1fc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKHQsZSl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXkodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IHI9MCxzPW4ubGVuZ3RoO3IhPT1zOysrciluW3JdPXRbZSsrXX1fc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IHI9MCxzPW4ubGVuZ3RoO3IhPT1zOysrciluW3JdPXRbZSsrXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgcj0wLHM9bi5sZW5ndGg7ciE9PXM7KytyKW5bcl09dFtlKytdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5RWxlbWVudCh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPXRbZV19X3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9mcm9tQXJyYXkodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KHQsZSl9X3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkodCxlKSx0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KHQsZSksdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fZ2V0VmFsdWVfdW5ib3VuZCh0LGUpe3RoaXMuYmluZCgpLHRoaXMuZ2V0VmFsdWUodCxlKX1fc2V0VmFsdWVfdW5ib3VuZCh0LGUpe3RoaXMuYmluZCgpLHRoaXMuc2V0VmFsdWUodCxlKX1iaW5kKCl7bGV0IHQ9dGhpcy5ub2RlO2NvbnN0IGU9dGhpcy5wYXJzZWRQYXRoLG49ZS5vYmplY3ROYW1lLHI9ZS5wcm9wZXJ0eU5hbWU7bGV0IHM9ZS5wcm9wZXJ0eUluZGV4O2lmKHR8fCh0PWxlLmZpbmROb2RlKHRoaXMucm9vdE5vZGUsZS5ub2RlTmFtZSksdGhpcy5ub2RlPXQpLHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGUsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZSwhdCl7Y29uc29sZS53YXJuKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IE5vIHRhcmdldCBub2RlIGZvdW5kIGZvciB0cmFjazogIit0aGlzLnBhdGgrIi4iKTtyZXR1cm59aWYobil7bGV0IGM9ZS5vYmplY3RJbmRleDtzd2l0Y2gobil7Y2FzZSJtYXRlcmlhbHMiOmlmKCF0Lm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighdC5tYXRlcmlhbC5tYXRlcmlhbHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuIix0aGlzKTtyZXR1cm59dD10Lm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlImJvbmVzIjppZighdC5za2VsZXRvbil7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uIix0aGlzKTtyZXR1cm59dD10LnNrZWxldG9uLmJvbmVzO2ZvcihsZXQgdT0wO3U8dC5sZW5ndGg7dSsrKWlmKHRbdV0ubmFtZT09PWMpe2M9dTticmVha31icmVhaztjYXNlIm1hcCI6aWYoIm1hcCJpbiB0KXt0PXQubWFwO2JyZWFrfWlmKCF0Lm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighdC5tYXRlcmlhbC5tYXApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hcCBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXAuIix0aGlzKTtyZXR1cm59dD10Lm1hdGVyaWFsLm1hcDticmVhaztkZWZhdWx0OmlmKHRbbl09PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuIix0aGlzKTtyZXR1cm59dD10W25dfWlmKGMhPT12b2lkIDApe2lmKHRbY109PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4iLHRoaXMsdCk7cmV0dXJufXQ9dFtjXX19Y29uc3Qgbz10W3JdO2lmKG89PT12b2lkIDApe2NvbnN0IGM9ZS5ub2RlTmFtZTtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAiK2MrIi4iK3IrIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIsdCk7cmV0dXJufWxldCBhPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PXQsdC5uZWVkc1VwZGF0ZSE9PXZvaWQgMD9hPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUhPT12b2lkIDAmJihhPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtsZXQgbD10aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtpZihzIT09dm9pZCAwKXtpZihyPT09Im1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIpe2lmKCF0Lmdlb21ldHJ5KXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4iLHRoaXMpO3JldHVybn1pZighdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLHRoaXMpO3JldHVybn10Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtzXSE9PXZvaWQgMCYmKHM9dC5tb3JwaFRhcmdldERpY3Rpb25hcnlbc10pfWw9dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQsdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8sdGhpcy5wcm9wZXJ0eUluZGV4PXN9ZWxzZSBvLmZyb21BcnJheSE9PXZvaWQgMCYmby50b0FycmF5IT09dm9pZCAwPyhsPXRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8pOkFycmF5LmlzQXJyYXkobyk/KGw9dGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9byk6dGhpcy5wcm9wZXJ0eU5hbWU9cjt0aGlzLmdldFZhbHVlPXRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVtsXSx0aGlzLnNldFZhbHVlPXRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbbF1bYV19dW5iaW5kKCl7dGhpcy5ub2RlPW51bGwsdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19bGUuQ29tcG9zaXRlPXlULGxlLnByb3RvdHlwZS5CaW5kaW5nVHlwZT17RGlyZWN0OjAsRW50aXJlQXJyYXk6MSxBcnJheUVsZW1lbnQ6MixIYXNGcm9tVG9BcnJheTozfSxsZS5wcm90b3R5cGUuVmVyc2lvbmluZz17Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxsZS5wcm90b3R5cGUuR2V0dGVyQnlCaW5kaW5nVHlwZT1bbGUucHJvdG90eXBlLl9nZXRWYWx1ZV9kaXJlY3QsbGUucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheSxsZS5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5RWxlbWVudCxsZS5wcm90b3R5cGUuX2dldFZhbHVlX3RvQXJyYXldLGxlLnByb3RvdHlwZS5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZz1bW2xlLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0LGxlLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlLGxlLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtsZS5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5LGxlLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUsbGUucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbbGUucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnQsbGUucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUsbGUucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW2xlLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5LGxlLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlLGxlLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdXTtjbGFzcyBfVHtjb25zdHJ1Y3Rvcigpe3RoaXMuaXNBbmltYXRpb25PYmplY3RHcm91cD0hMCx0aGlzLnV1aWQ9Tm4oKSx0aGlzLl9vYmplY3RzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksdGhpcy5uQ2FjaGVkT2JqZWN0c189MDtjb25zdCB0PXt9O3RoaXMuX2luZGljZXNCeVVVSUQ9dDtmb3IobGV0IG49MCxyPWFyZ3VtZW50cy5sZW5ndGg7biE9PXI7KytuKXRbYXJndW1lbnRzW25dLnV1aWRdPW47dGhpcy5fcGF0aHM9W10sdGhpcy5fcGFyc2VkUGF0aHM9W10sdGhpcy5fYmluZGluZ3M9W10sdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O2NvbnN0IGU9dGhpczt0aGlzLnN0YXRzPXtvYmplY3RzOntnZXQgdG90YWwoKXtyZXR1cm4gZS5fb2JqZWN0cy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiB0aGlzLnRvdGFsLWUubkNhY2hlZE9iamVjdHNffX0sZ2V0IGJpbmRpbmdzUGVyT2JqZWN0KCl7cmV0dXJuIGUuX2JpbmRpbmdzLmxlbmd0aH19fWFkZCgpe2NvbnN0IHQ9dGhpcy5fb2JqZWN0cyxlPXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9wYXRocyxyPXRoaXMuX3BhcnNlZFBhdGhzLHM9dGhpcy5fYmluZGluZ3Msbz1zLmxlbmd0aDtsZXQgYSxsPXQubGVuZ3RoLGM9dGhpcy5uQ2FjaGVkT2JqZWN0c187Zm9yKGxldCB1PTAsaD1hcmd1bWVudHMubGVuZ3RoO3UhPT1oOysrdSl7Y29uc3QgZj1hcmd1bWVudHNbdV0sZD1mLnV1aWQ7bGV0IHA9ZVtkXTtpZihwPT09dm9pZCAwKXtwPWwrKyxlW2RdPXAsdC5wdXNoKGYpO2ZvcihsZXQgeT0wLGc9bzt5IT09ZzsrK3kpc1t5XS5wdXNoKG5ldyBsZShmLG5beV0sclt5XSkpfWVsc2UgaWYocDxjKXthPXRbcF07Y29uc3QgeT0tLWMsZz10W3ldO2VbZy51dWlkXT1wLHRbcF09ZyxlW2RdPXksdFt5XT1mO2ZvcihsZXQgbT0wLHY9bzttIT09djsrK20pe2NvbnN0IHg9c1ttXSxfPXhbeV07bGV0IE09eFtwXTt4W3BdPV8sTT09PXZvaWQgMCYmKE09bmV3IGxlKGYsblttXSxyW21dKSkseFt5XT1NfX1lbHNlIHRbcF0hPT1hJiZjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEIGRldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLiIpfXRoaXMubkNhY2hlZE9iamVjdHNfPWN9cmVtb3ZlKCl7Y29uc3QgdD10aGlzLl9vYmplY3RzLGU9dGhpcy5faW5kaWNlc0J5VVVJRCxuPXRoaXMuX2JpbmRpbmdzLHI9bi5sZW5ndGg7bGV0IHM9dGhpcy5uQ2FjaGVkT2JqZWN0c187Zm9yKGxldCBvPTAsYT1hcmd1bWVudHMubGVuZ3RoO28hPT1hOysrbyl7Y29uc3QgbD1hcmd1bWVudHNbb10sYz1sLnV1aWQsdT1lW2NdO2lmKHUhPT12b2lkIDAmJnU+PXMpe2NvbnN0IGg9cysrLGY9dFtoXTtlW2YudXVpZF09dSx0W3VdPWYsZVtjXT1oLHRbaF09bDtmb3IobGV0IGQ9MCxwPXI7ZCE9PXA7KytkKXtjb25zdCB5PW5bZF0sZz15W2hdLG09eVt1XTt5W3VdPWcseVtoXT1tfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189c311bmNhY2hlKCl7Y29uc3QgdD10aGlzLl9vYmplY3RzLGU9dGhpcy5faW5kaWNlc0J5VVVJRCxuPXRoaXMuX2JpbmRpbmdzLHI9bi5sZW5ndGg7bGV0IHM9dGhpcy5uQ2FjaGVkT2JqZWN0c18sbz10Lmxlbmd0aDtmb3IobGV0IGE9MCxsPWFyZ3VtZW50cy5sZW5ndGg7YSE9PWw7KythKXtjb25zdCBjPWFyZ3VtZW50c1thXSx1PWMudXVpZCxoPWVbdV07aWYoaCE9PXZvaWQgMClpZihkZWxldGUgZVt1XSxoPHMpe2NvbnN0IGY9LS1zLGQ9dFtmXSxwPS0tbyx5PXRbcF07ZVtkLnV1aWRdPWgsdFtoXT1kLGVbeS51dWlkXT1mLHRbZl09eSx0LnBvcCgpO2ZvcihsZXQgZz0wLG09cjtnIT09bTsrK2cpe2NvbnN0IHY9bltnXSx4PXZbZl0sXz12W3BdO3ZbaF09eCx2W2ZdPV8sdi5wb3AoKX19ZWxzZXtjb25zdCBmPS0tbyxkPXRbZl07Zj4wJiYoZVtkLnV1aWRdPWgpLHRbaF09ZCx0LnBvcCgpO2ZvcihsZXQgcD0wLHk9cjtwIT09eTsrK3Ape2NvbnN0IGc9bltwXTtnW2hdPWdbZl0sZy5wb3AoKX19fXRoaXMubkNhY2hlZE9iamVjdHNfPXN9c3Vic2NyaWJlXyh0LGUpe2NvbnN0IG49dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoO2xldCByPW5bdF07Y29uc3Qgcz10aGlzLl9iaW5kaW5ncztpZihyIT09dm9pZCAwKXJldHVybiBzW3JdO2NvbnN0IG89dGhpcy5fcGF0aHMsYT10aGlzLl9wYXJzZWRQYXRocyxsPXRoaXMuX29iamVjdHMsYz1sLmxlbmd0aCx1PXRoaXMubkNhY2hlZE9iamVjdHNfLGg9bmV3IEFycmF5KGMpO3I9cy5sZW5ndGgsblt0XT1yLG8ucHVzaCh0KSxhLnB1c2goZSkscy5wdXNoKGgpO2ZvcihsZXQgZj11LGQ9bC5sZW5ndGg7ZiE9PWQ7KytmKXtjb25zdCBwPWxbZl07aFtmXT1uZXcgbGUocCx0LGUpfXJldHVybiBofXVuc3Vic2NyaWJlXyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxuPWVbdF07aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj10aGlzLl9wYXRocyxzPXRoaXMuX3BhcnNlZFBhdGhzLG89dGhpcy5fYmluZGluZ3MsYT1vLmxlbmd0aC0xLGw9b1thXSxjPXRbYV07ZVtjXT1uLG9bbl09bCxvLnBvcCgpLHNbbl09c1thXSxzLnBvcCgpLHJbbl09clthXSxyLnBvcCgpfX19Y2xhc3MgeXh7Y29uc3RydWN0b3IodCxlLG49bnVsbCxyPWUuYmxlbmRNb2RlKXt0aGlzLl9taXhlcj10LHRoaXMuX2NsaXA9ZSx0aGlzLl9sb2NhbFJvb3Q9bix0aGlzLmJsZW5kTW9kZT1yO2NvbnN0IHM9ZS50cmFja3Msbz1zLmxlbmd0aCxhPW5ldyBBcnJheShvKSxsPXtlbmRpbmdTdGFydDpacixlbmRpbmdFbmQ6WnJ9O2ZvcihsZXQgYz0wO2MhPT1vOysrYyl7Y29uc3QgdT1zW2NdLmNyZWF0ZUludGVycG9sYW50KG51bGwpO2FbY109dSx1LnNldHRpbmdzPWx9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncz1sLHRoaXMuX2ludGVycG9sYW50cz1hLHRoaXMuX3Byb3BlcnR5QmluZGluZ3M9bmV3IEFycmF5KG8pLHRoaXMuX2NhY2hlSW5kZXg9bnVsbCx0aGlzLl9ieUNsaXBDYWNoZUluZGV4PW51bGwsdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMubG9vcD1peSx0aGlzLl9sb29wQ291bnQ9LTEsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MSx0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9MSx0aGlzLndlaWdodD0xLHRoaXMuX2VmZmVjdGl2ZVdlaWdodD0xLHRoaXMucmVwZXRpdGlvbnM9MS8wLHRoaXMucGF1c2VkPSExLHRoaXMuZW5hYmxlZD0hMCx0aGlzLmNsYW1wV2hlbkZpbmlzaGVkPSExLHRoaXMuemVyb1Nsb3BlQXRTdGFydD0hMCx0aGlzLnplcm9TbG9wZUF0RW5kPSEwfXBsYXkoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpLHRoaXN9c3RvcCgpe3JldHVybiB0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbih0aGlzKSx0aGlzLnJlc2V0KCl9cmVzZXQoKXtyZXR1cm4gdGhpcy5wYXVzZWQ9ITEsdGhpcy5lbmFibGVkPSEwLHRoaXMudGltZT0wLHRoaXMuX2xvb3BDb3VudD0tMSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfWlzUnVubmluZygpe3JldHVybiB0aGlzLmVuYWJsZWQmJiF0aGlzLnBhdXNlZCYmdGhpcy50aW1lU2NhbGUhPT0wJiZ0aGlzLl9zdGFydFRpbWU9PT1udWxsJiZ0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9aXNTY2hlZHVsZWQoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfXN0YXJ0QXQodCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZT10LHRoaXN9c2V0TG9vcCh0LGUpe3JldHVybiB0aGlzLmxvb3A9dCx0aGlzLnJlcGV0aXRpb25zPWUsdGhpc31zZXRFZmZlY3RpdmVXZWlnaHQodCl7cmV0dXJuIHRoaXMud2VpZ2h0PXQsdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PXRoaXMuZW5hYmxlZD90OjAsdGhpcy5zdG9wRmFkaW5nKCl9Z2V0RWZmZWN0aXZlV2VpZ2h0KCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodH1mYWRlSW4odCl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKHQsMCwxKX1mYWRlT3V0KHQpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyh0LDEsMCl9Y3Jvc3NGYWRlRnJvbSh0LGUsbil7aWYodC5mYWRlT3V0KGUpLHRoaXMuZmFkZUluKGUpLG4pe2NvbnN0IHI9dGhpcy5fY2xpcC5kdXJhdGlvbixzPXQuX2NsaXAuZHVyYXRpb24sbz1zL3IsYT1yL3M7dC53YXJwKDEsbyxlKSx0aGlzLndhcnAoYSwxLGUpfXJldHVybiB0aGlzfWNyb3NzRmFkZVRvKHQsZSxuKXtyZXR1cm4gdC5jcm9zc0ZhZGVGcm9tKHRoaXMsZSxuKX1zdG9wRmFkaW5nKCl7Y29uc3QgdD10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtyZXR1cm4gdCE9PW51bGwmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KSksdGhpc31zZXRFZmZlY3RpdmVUaW1lU2NhbGUodCl7cmV0dXJuIHRoaXMudGltZVNjYWxlPXQsdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPXRoaXMucGF1c2VkPzA6dCx0aGlzLnN0b3BXYXJwaW5nKCl9Z2V0RWZmZWN0aXZlVGltZVNjYWxlKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZX1zZXREdXJhdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lU2NhbGU9dGhpcy5fY2xpcC5kdXJhdGlvbi90LHRoaXMuc3RvcFdhcnBpbmcoKX1zeW5jV2l0aCh0KXtyZXR1cm4gdGhpcy50aW1lPXQudGltZSx0aGlzLnRpbWVTY2FsZT10LnRpbWVTY2FsZSx0aGlzLnN0b3BXYXJwaW5nKCl9aGFsdCh0KXtyZXR1cm4gdGhpcy53YXJwKHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwwLHQpfXdhcnAodCxlLG4pe2NvbnN0IHI9dGhpcy5fbWl4ZXIscz1yLnRpbWUsbz10aGlzLnRpbWVTY2FsZTtsZXQgYT10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDthPT09bnVsbCYmKGE9ci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpLHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PWEpO2NvbnN0IGw9YS5wYXJhbWV0ZXJQb3NpdGlvbnMsYz1hLnNhbXBsZVZhbHVlcztyZXR1cm4gbFswXT1zLGxbMV09cytuLGNbMF09dC9vLGNbMV09ZS9vLHRoaXN9c3RvcFdhcnBpbmcoKXtjb25zdCB0PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O3JldHVybiB0IT09bnVsbCYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpKSx0aGlzfWdldE1peGVyKCl7cmV0dXJuIHRoaXMuX21peGVyfWdldENsaXAoKXtyZXR1cm4gdGhpcy5fY2xpcH1nZXRSb290KCl7cmV0dXJuIHRoaXMuX2xvY2FsUm9vdHx8dGhpcy5fbWl4ZXIuX3Jvb3R9X3VwZGF0ZSh0LGUsbixyKXtpZighdGhpcy5lbmFibGVkKXt0aGlzLl91cGRhdGVXZWlnaHQodCk7cmV0dXJufWNvbnN0IHM9dGhpcy5fc3RhcnRUaW1lO2lmKHMhPT1udWxsKXtjb25zdCBsPSh0LXMpKm47bDwwfHxuPT09MD9lPTA6KHRoaXMuX3N0YXJ0VGltZT1udWxsLGU9bipsKX1lKj10aGlzLl91cGRhdGVUaW1lU2NhbGUodCk7Y29uc3Qgbz10aGlzLl91cGRhdGVUaW1lKGUpLGE9dGhpcy5fdXBkYXRlV2VpZ2h0KHQpO2lmKGE+MCl7Y29uc3QgbD10aGlzLl9pbnRlcnBvbGFudHMsYz10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO3N3aXRjaCh0aGlzLmJsZW5kTW9kZSl7Y2FzZSBkZDpmb3IobGV0IHU9MCxoPWwubGVuZ3RoO3UhPT1oOysrdSlsW3VdLmV2YWx1YXRlKG8pLGNbdV0uYWNjdW11bGF0ZUFkZGl0aXZlKGEpO2JyZWFrO2Nhc2UgRGM6ZGVmYXVsdDpmb3IobGV0IHU9MCxoPWwubGVuZ3RoO3UhPT1oOysrdSlsW3VdLmV2YWx1YXRlKG8pLGNbdV0uYWNjdW11bGF0ZShyLGEpfX19X3VwZGF0ZVdlaWdodCh0KXtsZXQgZT0wO2lmKHRoaXMuZW5hYmxlZCl7ZT10aGlzLndlaWdodDtjb25zdCBuPXRoaXMuX3dlaWdodEludGVycG9sYW50O2lmKG4hPT1udWxsKXtjb25zdCByPW4uZXZhbHVhdGUodClbMF07ZSo9cix0Pm4ucGFyYW1ldGVyUG9zaXRpb25zWzFdJiYodGhpcy5zdG9wRmFkaW5nKCkscj09PTAmJih0aGlzLmVuYWJsZWQ9ITEpKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodD1lLGV9X3VwZGF0ZVRpbWVTY2FsZSh0KXtsZXQgZT0wO2lmKCF0aGlzLnBhdXNlZCl7ZT10aGlzLnRpbWVTY2FsZTtjb25zdCBuPXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O2lmKG4hPT1udWxsKXtjb25zdCByPW4uZXZhbHVhdGUodClbMF07ZSo9cix0Pm4ucGFyYW1ldGVyUG9zaXRpb25zWzFdJiYodGhpcy5zdG9wV2FycGluZygpLGU9PT0wP3RoaXMucGF1c2VkPSEwOnRoaXMudGltZVNjYWxlPWUpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPWUsZX1fdXBkYXRlVGltZSh0KXtjb25zdCBlPXRoaXMuX2NsaXAuZHVyYXRpb24sbj10aGlzLmxvb3A7bGV0IHI9dGhpcy50aW1lK3Qscz10aGlzLl9sb29wQ291bnQ7Y29uc3Qgbz1uPT09cnk7aWYodD09PTApcmV0dXJuIHM9PT0tMT9yOm8mJihzJjEpPT09MT9lLXI6cjtpZihuPT09bnkpe3M9PT0tMSYmKHRoaXMuX2xvb3BDb3VudD0wLHRoaXMuX3NldEVuZGluZ3MoITAsITAsITEpKTt0OntpZihyPj1lKXI9ZTtlbHNlIGlmKHI8MClyPTA7ZWxzZXt0aGlzLnRpbWU9cjticmVhayB0fXRoaXMuY2xhbXBXaGVuRmluaXNoZWQ/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExLHRoaXMudGltZT1yLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246dDwwPy0xOjF9KX19ZWxzZXtpZihzPT09LTEmJih0Pj0wPyhzPTAsdGhpcy5fc2V0RW5kaW5ncyghMCx0aGlzLnJlcGV0aXRpb25zPT09MCxvKSk6dGhpcy5fc2V0RW5kaW5ncyh0aGlzLnJlcGV0aXRpb25zPT09MCwhMCxvKSkscj49ZXx8cjwwKXtjb25zdCBhPU1hdGguZmxvb3Ioci9lKTtyLT1lKmEscys9TWF0aC5hYnMoYSk7Y29uc3QgbD10aGlzLnJlcGV0aXRpb25zLXM7aWYobDw9MCl0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSxyPXQ+MD9lOjAsdGhpcy50aW1lPXIsdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLGFjdGlvbjp0aGlzLGRpcmVjdGlvbjp0PjA/MTotMX0pO2Vsc2V7aWYobD09PTEpe2NvbnN0IGM9dDwwO3RoaXMuX3NldEVuZGluZ3MoYywhYyxvKX1lbHNlIHRoaXMuX3NldEVuZGluZ3MoITEsITEsbyk7dGhpcy5fbG9vcENvdW50PXMsdGhpcy50aW1lPXIsdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsYWN0aW9uOnRoaXMsbG9vcERlbHRhOmF9KX19ZWxzZSB0aGlzLnRpbWU9cjtpZihvJiYocyYxKT09PTEpcmV0dXJuIGUtcn1yZXR1cm4gcn1fc2V0RW5kaW5ncyh0LGUsbil7Y29uc3Qgcj10aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO24/KHIuZW5kaW5nU3RhcnQ9SnIsci5lbmRpbmdFbmQ9SnIpOih0P3IuZW5kaW5nU3RhcnQ9dGhpcy56ZXJvU2xvcGVBdFN0YXJ0P0pyOlpyOnIuZW5kaW5nU3RhcnQ9dmEsZT9yLmVuZGluZ0VuZD10aGlzLnplcm9TbG9wZUF0RW5kP0pyOlpyOnIuZW5kaW5nRW5kPXZhKX1fc2NoZWR1bGVGYWRpbmcodCxlLG4pe2NvbnN0IHI9dGhpcy5fbWl4ZXIscz1yLnRpbWU7bGV0IG89dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bz09PW51bGwmJihvPXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSx0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1vKTtjb25zdCBhPW8ucGFyYW1ldGVyUG9zaXRpb25zLGw9by5zYW1wbGVWYWx1ZXM7cmV0dXJuIGFbMF09cyxsWzBdPWUsYVsxXT1zK3QsbFsxXT1uLHRoaXN9fWNvbnN0IHhUPW5ldyBGbG9hdDMyQXJyYXkoMSk7Y2xhc3MgdlQgZXh0ZW5kcyBUaXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX3Jvb3Q9dCx0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpLHRoaXMuX2FjY3VJbmRleD0wLHRoaXMudGltZT0wLHRoaXMudGltZVNjYWxlPTF9X2JpbmRBY3Rpb24odCxlKXtjb25zdCBuPXQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCxyPXQuX2NsaXAudHJhY2tzLHM9ci5sZW5ndGgsbz10Ll9wcm9wZXJ0eUJpbmRpbmdzLGE9dC5faW50ZXJwb2xhbnRzLGw9bi51dWlkLGM9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lO2xldCB1PWNbbF07dT09PXZvaWQgMCYmKHU9e30sY1tsXT11KTtmb3IobGV0IGg9MDtoIT09czsrK2gpe2NvbnN0IGY9cltoXSxkPWYubmFtZTtsZXQgcD11W2RdO2lmKHAhPT12b2lkIDApKytwLnJlZmVyZW5jZUNvdW50LG9baF09cDtlbHNle2lmKHA9b1toXSxwIT09dm9pZCAwKXtwLl9jYWNoZUluZGV4PT09bnVsbCYmKCsrcC5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcocCxsLGQpKTtjb250aW51ZX1jb25zdCB5PWUmJmUuX3Byb3BlcnR5QmluZGluZ3NbaF0uYmluZGluZy5wYXJzZWRQYXRoO3A9bmV3IGd4KGxlLmNyZWF0ZShuLGQseSksZi5WYWx1ZVR5cGVOYW1lLGYuZ2V0VmFsdWVTaXplKCkpLCsrcC5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcocCxsLGQpLG9baF09cH1hW2hdLnJlc3VsdEJ1ZmZlcj1wLmJ1ZmZlcn19X2FjdGl2YXRlQWN0aW9uKHQpe2lmKCF0aGlzLl9pc0FjdGl2ZUFjdGlvbih0KSl7aWYodC5fY2FjaGVJbmRleD09PW51bGwpe2NvbnN0IG49KHQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZCxyPXQuX2NsaXAudXVpZCxzPXRoaXMuX2FjdGlvbnNCeUNsaXBbcl07dGhpcy5fYmluZEFjdGlvbih0LHMmJnMua25vd25BY3Rpb25zWzBdKSx0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbih0LHIsbil9Y29uc3QgZT10Ll9wcm9wZXJ0eUJpbmRpbmdzO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7biE9PXI7KytuKXtjb25zdCBzPWVbbl07cy51c2VDb3VudCsrPT09MCYmKHRoaXMuX2xlbmRCaW5kaW5nKHMpLHMuc2F2ZU9yaWdpbmFsU3RhdGUoKSl9dGhpcy5fbGVuZEFjdGlvbih0KX19X2RlYWN0aXZhdGVBY3Rpb24odCl7aWYodGhpcy5faXNBY3RpdmVBY3Rpb24odCkpe2NvbnN0IGU9dC5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IG49MCxyPWUubGVuZ3RoO24hPT1yOysrbil7Y29uc3Qgcz1lW25dOy0tcy51c2VDb3VudD09PTAmJihzLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKHMpKX10aGlzLl90YWtlQmFja0FjdGlvbih0KX19X2luaXRNZW1vcnlNYW5hZ2VyKCl7dGhpcy5fYWN0aW9ucz1bXSx0aGlzLl9uQWN0aXZlQWN0aW9ucz0wLHRoaXMuX2FjdGlvbnNCeUNsaXA9e30sdGhpcy5fYmluZGluZ3M9W10sdGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTAsdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9LHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W10sdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDtjb25zdCB0PXRoaXM7dGhpcy5zdGF0cz17YWN0aW9uczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2FjdGlvbnMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdC5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fV9pc0FjdGl2ZUFjdGlvbih0KXtjb25zdCBlPXQuX2NhY2hlSW5kZXg7cmV0dXJuIGUhPT1udWxsJiZlPHRoaXMuX25BY3RpdmVBY3Rpb25zfV9hZGRJbmFjdGl2ZUFjdGlvbih0LGUsbil7Y29uc3Qgcj10aGlzLl9hY3Rpb25zLHM9dGhpcy5fYWN0aW9uc0J5Q2xpcDtsZXQgbz1zW2VdO2lmKG89PT12b2lkIDApbz17a25vd25BY3Rpb25zOlt0XSxhY3Rpb25CeVJvb3Q6e319LHQuX2J5Q2xpcENhY2hlSW5kZXg9MCxzW2VdPW87ZWxzZXtjb25zdCBhPW8ua25vd25BY3Rpb25zO3QuX2J5Q2xpcENhY2hlSW5kZXg9YS5sZW5ndGgsYS5wdXNoKHQpfXQuX2NhY2hlSW5kZXg9ci5sZW5ndGgsci5wdXNoKHQpLG8uYWN0aW9uQnlSb290W25dPXR9X3JlbW92ZUluYWN0aXZlQWN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPWVbZS5sZW5ndGgtMV0scj10Ll9jYWNoZUluZGV4O24uX2NhY2hlSW5kZXg9cixlW3JdPW4sZS5wb3AoKSx0Ll9jYWNoZUluZGV4PW51bGw7Y29uc3Qgcz10Ll9jbGlwLnV1aWQsbz10aGlzLl9hY3Rpb25zQnlDbGlwLGE9b1tzXSxsPWEua25vd25BY3Rpb25zLGM9bFtsLmxlbmd0aC0xXSx1PXQuX2J5Q2xpcENhY2hlSW5kZXg7Yy5fYnlDbGlwQ2FjaGVJbmRleD11LGxbdV09YyxsLnBvcCgpLHQuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbDtjb25zdCBoPWEuYWN0aW9uQnlSb290LGY9KHQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZDtkZWxldGUgaFtmXSxsLmxlbmd0aD09PTAmJmRlbGV0ZSBvW3NdLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24odCl9X3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24odCl7Y29uc3QgZT10Ll9wcm9wZXJ0eUJpbmRpbmdzO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7biE9PXI7KytuKXtjb25zdCBzPWVbbl07LS1zLnJlZmVyZW5jZUNvdW50PT09MCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKHMpfX1fbGVuZEFjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LHI9dGhpcy5fbkFjdGl2ZUFjdGlvbnMrKyxzPWVbcl07dC5fY2FjaGVJbmRleD1yLGVbcl09dCxzLl9jYWNoZUluZGV4PW4sZVtuXT1zfV90YWtlQmFja0FjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LHI9LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxzPWVbcl07dC5fY2FjaGVJbmRleD1yLGVbcl09dCxzLl9jYWNoZUluZGV4PW4sZVtuXT1zfV9hZGRJbmFjdGl2ZUJpbmRpbmcodCxlLG4pe2NvbnN0IHI9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLHM9dGhpcy5fYmluZGluZ3M7bGV0IG89cltlXTtvPT09dm9pZCAwJiYobz17fSxyW2VdPW8pLG9bbl09dCx0Ll9jYWNoZUluZGV4PXMubGVuZ3RoLHMucHVzaCh0KX1fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKHQpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3Msbj10LmJpbmRpbmcscj1uLnJvb3ROb2RlLnV1aWQscz1uLnBhdGgsbz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsYT1vW3JdLGw9ZVtlLmxlbmd0aC0xXSxjPXQuX2NhY2hlSW5kZXg7bC5fY2FjaGVJbmRleD1jLGVbY109bCxlLnBvcCgpLGRlbGV0ZSBhW3NdLE9iamVjdC5rZXlzKGEpLmxlbmd0aD09PTAmJmRlbGV0ZSBvW3JdfV9sZW5kQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxyPXRoaXMuX25BY3RpdmVCaW5kaW5ncysrLHM9ZVtyXTt0Ll9jYWNoZUluZGV4PXIsZVtyXT10LHMuX2NhY2hlSW5kZXg9bixlW25dPXN9X3Rha2VCYWNrQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxyPS0tdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLHM9ZVtyXTt0Ll9jYWNoZUluZGV4PXIsZVtyXT10LHMuX2NhY2hlSW5kZXg9bixlW25dPXN9X2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKXtjb25zdCB0PXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrO2xldCBuPXRbZV07cmV0dXJuIG49PT12b2lkIDAmJihuPW5ldyBncChuZXcgRmxvYXQzMkFycmF5KDIpLG5ldyBGbG9hdDMyQXJyYXkoMiksMSx4VCksbi5fX2NhY2hlSW5kZXg9ZSx0W2VdPW4pLG59X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpe2NvbnN0IGU9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxuPXQuX19jYWNoZUluZGV4LHI9LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxzPWVbcl07dC5fX2NhY2hlSW5kZXg9cixlW3JdPXQscy5fX2NhY2hlSW5kZXg9bixlW25dPXN9Y2xpcEFjdGlvbih0LGUsbil7Y29uc3Qgcj1lfHx0aGlzLl9yb290LHM9ci51dWlkO2xldCBvPXR5cGVvZiB0PT0ic3RyaW5nIj9RYS5maW5kQnlOYW1lKHIsdCk6dDtjb25zdCBhPW8hPT1udWxsP28udXVpZDp0LGw9dGhpcy5fYWN0aW9uc0J5Q2xpcFthXTtsZXQgYz1udWxsO2lmKG49PT12b2lkIDAmJihvIT09bnVsbD9uPW8uYmxlbmRNb2RlOm49RGMpLGwhPT12b2lkIDApe2NvbnN0IGg9bC5hY3Rpb25CeVJvb3Rbc107aWYoaCE9PXZvaWQgMCYmaC5ibGVuZE1vZGU9PT1uKXJldHVybiBoO2M9bC5rbm93bkFjdGlvbnNbMF0sbz09PW51bGwmJihvPWMuX2NsaXApfWlmKG89PT1udWxsKXJldHVybiBudWxsO2NvbnN0IHU9bmV3IHl4KHRoaXMsbyxlLG4pO3JldHVybiB0aGlzLl9iaW5kQWN0aW9uKHUsYyksdGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24odSxhLHMpLHV9ZXhpc3RpbmdBY3Rpb24odCxlKXtjb25zdCBuPWV8fHRoaXMuX3Jvb3Qscj1uLnV1aWQscz10eXBlb2YgdD09InN0cmluZyI/UWEuZmluZEJ5TmFtZShuLHQpOnQsbz1zP3MudXVpZDp0LGE9dGhpcy5fYWN0aW9uc0J5Q2xpcFtvXTtyZXR1cm4gYSE9PXZvaWQgMCYmYS5hY3Rpb25CeVJvb3Rbcl18fG51bGx9c3RvcEFsbEFjdGlvbigpe2NvbnN0IHQ9dGhpcy5fYWN0aW9ucyxlPXRoaXMuX25BY3RpdmVBY3Rpb25zO2ZvcihsZXQgbj1lLTE7bj49MDstLW4pdFtuXS5zdG9wKCk7cmV0dXJuIHRoaXN9dXBkYXRlKHQpe3QqPXRoaXMudGltZVNjYWxlO2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPXRoaXMuX25BY3RpdmVBY3Rpb25zLHI9dGhpcy50aW1lKz10LHM9TWF0aC5zaWduKHQpLG89dGhpcy5fYWNjdUluZGV4Xj0xO2ZvcihsZXQgYz0wO2MhPT1uOysrYyllW2NdLl91cGRhdGUocix0LHMsbyk7Y29uc3QgYT10aGlzLl9iaW5kaW5ncyxsPXRoaXMuX25BY3RpdmVCaW5kaW5ncztmb3IobGV0IGM9MDtjIT09bDsrK2MpYVtjXS5hcHBseShvKTtyZXR1cm4gdGhpc31zZXRUaW1lKHQpe3RoaXMudGltZT0wO2ZvcihsZXQgZT0wO2U8dGhpcy5fYWN0aW9ucy5sZW5ndGg7ZSsrKXRoaXMuX2FjdGlvbnNbZV0udGltZT0wO3JldHVybiB0aGlzLnVwZGF0ZSh0KX1nZXRSb290KCl7cmV0dXJuIHRoaXMuX3Jvb3R9dW5jYWNoZUNsaXAodCl7Y29uc3QgZT10aGlzLl9hY3Rpb25zLG49dC51dWlkLHI9dGhpcy5fYWN0aW9uc0J5Q2xpcCxzPXJbbl07aWYocyE9PXZvaWQgMCl7Y29uc3Qgbz1zLmtub3duQWN0aW9ucztmb3IobGV0IGE9MCxsPW8ubGVuZ3RoO2EhPT1sOysrYSl7Y29uc3QgYz1vW2FdO3RoaXMuX2RlYWN0aXZhdGVBY3Rpb24oYyk7Y29uc3QgdT1jLl9jYWNoZUluZGV4LGg9ZVtlLmxlbmd0aC0xXTtjLl9jYWNoZUluZGV4PW51bGwsYy5fYnlDbGlwQ2FjaGVJbmRleD1udWxsLGguX2NhY2hlSW5kZXg9dSxlW3VdPWgsZS5wb3AoKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKGMpfWRlbGV0ZSByW25dfX11bmNhY2hlUm9vdCh0KXtjb25zdCBlPXQudXVpZCxuPXRoaXMuX2FjdGlvbnNCeUNsaXA7Zm9yKGNvbnN0IG8gaW4gbil7Y29uc3QgYT1uW29dLmFjdGlvbkJ5Um9vdCxsPWFbZV07bCE9PXZvaWQgMCYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24obCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24obCkpfWNvbnN0IHI9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLHM9cltlXTtpZihzIT09dm9pZCAwKWZvcihjb25zdCBvIGluIHMpe2NvbnN0IGE9c1tvXTthLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGEpfX11bmNhY2hlQWN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLmV4aXN0aW5nQWN0aW9uKHQsZSk7biE9PW51bGwmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKG4pLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKG4pKX19Y2xhc3MgRXB7Y29uc3RydWN0b3IodCl7dGhpcy52YWx1ZT10fWNsb25lKCl7cmV0dXJuIG5ldyBFcCh0aGlzLnZhbHVlLmNsb25lPT09dm9pZCAwP3RoaXMudmFsdWU6dGhpcy52YWx1ZS5jbG9uZSgpKX19bGV0IFNUPTA7Y2xhc3MgTVQgZXh0ZW5kcyBUaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc1VuaWZvcm1zR3JvdXA9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6U1QrK30pLHRoaXMubmFtZT0iIix0aGlzLnVzYWdlPU1hLHRoaXMudW5pZm9ybXM9W119YWRkKHQpe3JldHVybiB0aGlzLnVuaWZvcm1zLnB1c2godCksdGhpc31yZW1vdmUodCl7Y29uc3QgZT10aGlzLnVuaWZvcm1zLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmdGhpcy51bmlmb3Jtcy5zcGxpY2UoZSwxKSx0aGlzfXNldE5hbWUodCl7cmV0dXJuIHRoaXMubmFtZT10LHRoaXN9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWRpc3Bvc2UoKXtyZXR1cm4gdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pLHRoaXN9Y29weSh0KXt0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXNhZ2U9dC51c2FnZTtjb25zdCBlPXQudW5pZm9ybXM7dGhpcy51bmlmb3Jtcy5sZW5ndGg9MDtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspe2NvbnN0IHM9QXJyYXkuaXNBcnJheShlW25dKT9lW25dOltlW25dXTtmb3IobGV0IG89MDtvPHMubGVuZ3RoO28rKyl0aGlzLnVuaWZvcm1zLnB1c2goc1tvXS5jbG9uZSgpKX1yZXR1cm4gdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIGJUIGV4dGVuZHMgZXV7Y29uc3RydWN0b3IodCxlLG49MSl7c3VwZXIodCxlKSx0aGlzLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI9ITAsdGhpcy5tZXNoUGVyQXR0cmlidXRlPW59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9dC5tZXNoUGVyQXR0cmlidXRlLHRoaXN9Y2xvbmUodCl7Y29uc3QgZT1zdXBlci5jbG9uZSh0KTtyZXR1cm4gZS5tZXNoUGVyQXR0cmlidXRlPXRoaXMubWVzaFBlckF0dHJpYnV0ZSxlfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPSEwLGUubWVzaFBlckF0dHJpYnV0ZT10aGlzLm1lc2hQZXJBdHRyaWJ1dGUsZX19Y2xhc3Mgd1R7Y29uc3RydWN0b3IodCxlLG4scixzKXt0aGlzLmlzR0xCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuYnVmZmVyPXQsdGhpcy50eXBlPWUsdGhpcy5pdGVtU2l6ZT1uLHRoaXMuZWxlbWVudFNpemU9cix0aGlzLmNvdW50PXMsdGhpcy52ZXJzaW9uPTB9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9c2V0QnVmZmVyKHQpe3JldHVybiB0aGlzLmJ1ZmZlcj10LHRoaXN9c2V0VHlwZSh0LGUpe3JldHVybiB0aGlzLnR5cGU9dCx0aGlzLmVsZW1lbnRTaXplPWUsdGhpc31zZXRJdGVtU2l6ZSh0KXtyZXR1cm4gdGhpcy5pdGVtU2l6ZT10LHRoaXN9c2V0Q291bnQodCl7cmV0dXJuIHRoaXMuY291bnQ9dCx0aGlzfX1jb25zdCBfeD1uZXcgUnQ7Y2xhc3MgQVR7Y29uc3RydWN0b3IodCxlLG49MCxyPTEvMCl7dGhpcy5yYXk9bmV3IHZyKHQsZSksdGhpcy5uZWFyPW4sdGhpcy5mYXI9cix0aGlzLmNhbWVyYT1udWxsLHRoaXMubGF5ZXJzPW5ldyBWYyx0aGlzLnBhcmFtcz17TWVzaDp7fSxMaW5lOnt0aHJlc2hvbGQ6MX0sTE9EOnt9LFBvaW50czp7dGhyZXNob2xkOjF9LFNwcml0ZTp7fX19c2V0KHQsZSl7dGhpcy5yYXkuc2V0KHQsZSl9c2V0RnJvbUNhbWVyYSh0LGUpe2UuaXNQZXJzcGVjdGl2ZUNhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KHQueCx0LnksLjUpLnVucHJvamVjdChlKS5zdWIodGhpcy5yYXkub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzLmNhbWVyYT1lKTplLmlzT3J0aG9ncmFwaGljQ2FtZXJhPyh0aGlzLnJheS5vcmlnaW4uc2V0KHQueCx0LnksKGUubmVhcitlLmZhcikvKGUubmVhci1lLmZhcikpLnVucHJvamVjdChlKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KDAsMCwtMSkudHJhbnNmb3JtRGlyZWN0aW9uKGUubWF0cml4V29ybGQpLHRoaXMuY2FtZXJhPWUpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLlJheWNhc3RlcjogVW5zdXBwb3J0ZWQgY2FtZXJhIHR5cGU6ICIrZS50eXBlKX1zZXRGcm9tWFJDb250cm9sbGVyKHQpe3JldHVybiBfeC5pZGVudGl0eSgpLmV4dHJhY3RSb3RhdGlvbih0Lm1hdHJpeFdvcmxkKSx0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoMCwwLC0xKS5hcHBseU1hdHJpeDQoX3gpLHRoaXN9aW50ZXJzZWN0T2JqZWN0KHQsZT0hMCxuPVtdKXtyZXR1cm4gVHAodCx0aGlzLG4sZSksbi5zb3J0KHh4KSxufWludGVyc2VjdE9iamVjdHModCxlPSEwLG49W10pe2ZvcihsZXQgcj0wLHM9dC5sZW5ndGg7cjxzO3IrKylUcCh0W3JdLHRoaXMsbixlKTtyZXR1cm4gbi5zb3J0KHh4KSxufX1mdW5jdGlvbiB4eChpLHQpe3JldHVybiBpLmRpc3RhbmNlLXQuZGlzdGFuY2V9ZnVuY3Rpb24gVHAoaSx0LGUsbil7bGV0IHI9ITA7aWYoaS5sYXllcnMudGVzdCh0LmxheWVycykmJmkucmF5Y2FzdCh0LGUpPT09ITEmJihyPSExKSxyPT09ITAmJm49PT0hMCl7Y29uc3Qgcz1pLmNoaWxkcmVuO2ZvcihsZXQgbz0wLGE9cy5sZW5ndGg7bzxhO28rKylUcChzW29dLHQsZSwhMCl9fWNsYXNzIEVUe2NvbnN0cnVjdG9yKHQ9MSxlPTAsbj0wKXtyZXR1cm4gdGhpcy5yYWRpdXM9dCx0aGlzLnBoaT1lLHRoaXMudGhldGE9bix0aGlzfXNldCh0LGUsbil7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy5waGk9ZSx0aGlzLnRoZXRhPW4sdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLnBoaT10LnBoaSx0aGlzLnRoZXRhPXQudGhldGEsdGhpc31tYWtlU2FmZSgpe3JldHVybiB0aGlzLnBoaT1IdCh0aGlzLnBoaSwxZS02LE1hdGguUEktMWUtNiksdGhpc31zZXRGcm9tVmVjdG9yMyh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQueCx0LnksdC56KX1zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHQqdCtlKmUrbipuKSx0aGlzLnJhZGl1cz09PTA/KHRoaXMudGhldGE9MCx0aGlzLnBoaT0wKToodGhpcy50aGV0YT1NYXRoLmF0YW4yKHQsbiksdGhpcy5waGk9TWF0aC5hY29zKEh0KGUvdGhpcy5yYWRpdXMsLTEsMSkpKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgVFR7Y29uc3RydWN0b3IodD0xLGU9MCxuPTApe3JldHVybiB0aGlzLnJhZGl1cz10LHRoaXMudGhldGE9ZSx0aGlzLnk9bix0aGlzfXNldCh0LGUsbil7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy50aGV0YT1lLHRoaXMueT1uLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy50aGV0YT10LnRoZXRhLHRoaXMueT10LnksdGhpc31zZXRGcm9tVmVjdG9yMyh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQueCx0LnksdC56KX1zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHQqdCtuKm4pLHRoaXMudGhldGE9TWF0aC5hdGFuMih0LG4pLHRoaXMueT1lLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBDcHtjb25zdHJ1Y3Rvcih0LGUsbixyKXtDcC5wcm90b3R5cGUuaXNNYXRyaXgyPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHIpfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDEpLHRoaXN9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDQ7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXNldCh0LGUsbixyKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHNbMF09dCxzWzJdPWUsc1sxXT1uLHNbM109cix0aGlzfX1jb25zdCB2eD1uZXcgWDtjbGFzcyBDVHtjb25zdHJ1Y3Rvcih0PW5ldyBYKDEvMCwxLzApLGU9bmV3IFgoLTEvMCwtMS8wKSl7dGhpcy5pc0JveDI9ITAsdGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49dnguY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwKTp0LmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55fWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSkpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4Lnl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsdngpLmRpc3RhbmNlVG8odCl9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX1jb25zdCBTeD1uZXcgUixHdT1uZXcgUjtjbGFzcyBrbntjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIpe3RoaXMuc3RhcnQ9dCx0aGlzLmVuZD1lfXNldCh0LGUpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodCksdGhpcy5lbmQuY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0LnN0YXJ0KSx0aGlzLmVuZC5jb3B5KHQuZW5kKSx0aGlzfWdldENlbnRlcih0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YSh0KXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdCh0LGUpe3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSl7U3guc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLEd1LnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj1HdS5kb3QoR3UpO2xldCBzPUd1LmRvdChTeCkvbjtyZXR1cm4gZSYmKHM9SHQocywwLDEpKSxzfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlLG4pe2NvbnN0IHI9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSk7cmV0dXJuIHRoaXMuZGVsdGEobikubXVsdGlwbHlTY2FsYXIocikuYWRkKHRoaXMuc3RhcnQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5zdGFydC5hcHBseU1hdHJpeDQodCksdGhpcy5lbmQuYXBwbHlNYXRyaXg0KHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnN0YXJ0LmVxdWFscyh0aGlzLnN0YXJ0KSYmdC5lbmQuZXF1YWxzKHRoaXMuZW5kKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IE14PW5ldyBSO2NsYXNzIFJUIGV4dGVuZHMgYWV7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1lLHRoaXMudHlwZT0iU3BvdExpZ2h0SGVscGVyIjtjb25zdCBuPW5ldyBGdCxyPVswLDAsMCwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwtMSwwLDEsMCwwLDAsMCwxLDEsMCwwLDAsMCwtMSwxXTtmb3IobGV0IG89MCxhPTEsbD0zMjtvPGw7bysrLGErKyl7Y29uc3QgYz1vL2wqTWF0aC5QSSoyLHU9YS9sKk1hdGguUEkqMjtyLnB1c2goTWF0aC5jb3MoYyksTWF0aC5zaW4oYyksMSxNYXRoLmNvcyh1KSxNYXRoLnNpbih1KSwxKX1uLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBNdChyLDMpKTtjb25zdCBzPW5ldyBobih7Zm9nOiExLHRvbmVNYXBwZWQ6ITF9KTt0aGlzLmNvbmU9bmV3IFJpKG4scyksdGhpcy5hZGQodGhpcy5jb25lKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5saWdodC50YXJnZXQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMucGFyZW50Pyh0aGlzLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCksdGhpcy5tYXRyaXguY29weSh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkodGhpcy5saWdodC5tYXRyaXhXb3JsZCkpOnRoaXMubWF0cml4LmNvcHkodGhpcy5saWdodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubGlnaHQubWF0cml4V29ybGQpO2NvbnN0IHQ9dGhpcy5saWdodC5kaXN0YW5jZT90aGlzLmxpZ2h0LmRpc3RhbmNlOjFlMyxlPXQqTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7dGhpcy5jb25lLnNjYWxlLnNldChlLGUsdCksTXguc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSx0aGlzLmNvbmUubG9va0F0KE14KSx0aGlzLmNvbG9yIT09dm9pZCAwP3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9fWNvbnN0IENyPW5ldyBSLEh1PW5ldyBSdCxScD1uZXcgUnQ7Y2xhc3MgUFQgZXh0ZW5kcyBSaXtjb25zdHJ1Y3Rvcih0KXtjb25zdCBlPWJ4KHQpLG49bmV3IEZ0LHI9W10scz1bXSxvPW5ldyB4dCgwLDAsMSksYT1uZXcgeHQoMCwxLDApO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKXtjb25zdCB1PWVbY107dS5wYXJlbnQmJnUucGFyZW50LmlzQm9uZSYmKHIucHVzaCgwLDAsMCksci5wdXNoKDAsMCwwKSxzLnB1c2goby5yLG8uZyxvLmIpLHMucHVzaChhLnIsYS5nLGEuYikpfW4uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KHIsMykpLG4uc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IE10KHMsMykpO2NvbnN0IGw9bmV3IGhuKHt2ZXJ0ZXhDb2xvcnM6ITAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsdG9uZU1hcHBlZDohMSx0cmFuc3BhcmVudDohMH0pO3N1cGVyKG4sbCksdGhpcy5pc1NrZWxldG9uSGVscGVyPSEwLHRoaXMudHlwZT0iU2tlbGV0b25IZWxwZXIiLHRoaXMucm9vdD10LHRoaXMuYm9uZXM9ZSx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMX11cGRhdGVNYXRyaXhXb3JsZCh0KXtjb25zdCBlPXRoaXMuYm9uZXMsbj10aGlzLmdlb21ldHJ5LHI9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7UnAuY29weSh0aGlzLnJvb3QubWF0cml4V29ybGQpLmludmVydCgpO2ZvcihsZXQgcz0wLG89MDtzPGUubGVuZ3RoO3MrKyl7Y29uc3QgYT1lW3NdO2EucGFyZW50JiZhLnBhcmVudC5pc0JvbmUmJihIdS5tdWx0aXBseU1hdHJpY2VzKFJwLGEubWF0cml4V29ybGQpLENyLnNldEZyb21NYXRyaXhQb3NpdGlvbihIdSksci5zZXRYWVoobyxDci54LENyLnksQ3IueiksSHUubXVsdGlwbHlNYXRyaWNlcyhScCxhLnBhcmVudC5tYXRyaXhXb3JsZCksQ3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKEh1KSxyLnNldFhZWihvKzEsQ3IueCxDci55LENyLnopLG8rPTIpfW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwLHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19ZnVuY3Rpb24gYngoaSl7Y29uc3QgdD1bXTtpLmlzQm9uZT09PSEwJiZ0LnB1c2goaSk7Zm9yKGxldCBlPTA7ZTxpLmNoaWxkcmVuLmxlbmd0aDtlKyspdC5wdXNoLmFwcGx5KHQsYngoaS5jaGlsZHJlbltlXSkpO3JldHVybiB0fWNsYXNzIElUIGV4dGVuZHMgVWV7Y29uc3RydWN0b3IodCxlLG4pe2NvbnN0IHI9bmV3IFlhKGUsNCwyKSxzPW5ldyBicih7d2lyZWZyYW1lOiEwLGZvZzohMSx0b25lTWFwcGVkOiExfSk7c3VwZXIocixzKSx0aGlzLmxpZ2h0PXQsdGhpcy5jb2xvcj1uLHRoaXMudHlwZT0iUG9pbnRMaWdodEhlbHBlciIsdGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5jb2xvciE9PXZvaWQgMD90aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9fWNvbnN0IExUPW5ldyBSLHd4PW5ldyB4dCxBeD1uZXcgeHQ7Y2xhc3MgRFQgZXh0ZW5kcyBhZXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLmxpZ2h0PXQsdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1uLHRoaXMudHlwZT0iSGVtaXNwaGVyZUxpZ2h0SGVscGVyIjtjb25zdCByPW5ldyBxYShlKTtyLnJvdGF0ZVkoTWF0aC5QSSouNSksdGhpcy5tYXRlcmlhbD1uZXcgYnIoe3dpcmVmcmFtZTohMCxmb2c6ITEsdG9uZU1hcHBlZDohMX0pLHRoaXMuY29sb3I9PT12b2lkIDAmJih0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycz0hMCk7Y29uc3Qgcz1yLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxvPW5ldyBGbG9hdDMyQXJyYXkocy5jb3VudCozKTtyLnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBKdChvLDMpKSx0aGlzLmFkZChuZXcgVWUocix0aGlzLm1hdGVyaWFsKSksdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmNoaWxkcmVuWzBdO2lmKHRoaXMuY29sb3IhPT12b2lkIDApdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7ZWxzZXtjb25zdCBlPXQuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO3d4LmNvcHkodGhpcy5saWdodC5jb2xvciksQXguY29weSh0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yKTtmb3IobGV0IG49MCxyPWUuY291bnQ7bjxyO24rKyl7Y29uc3Qgcz1uPHIvMj93eDpBeDtlLnNldFhZWihuLHMucixzLmcscy5iKX1lLm5lZWRzVXBkYXRlPSEwfXRoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQubG9va0F0KExULnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKS5uZWdhdGUoKSl9fWNsYXNzIFVUIGV4dGVuZHMgUml7Y29uc3RydWN0b3IodD0xMCxlPTEwLG49NDQ3MzkyNCxyPTg5NDc4NDgpe249bmV3IHh0KG4pLHI9bmV3IHh0KHIpO2NvbnN0IHM9ZS8yLG89dC9lLGE9dC8yLGw9W10sYz1bXTtmb3IobGV0IGY9MCxkPTAscD0tYTtmPD1lO2YrKyxwKz1vKXtsLnB1c2goLWEsMCxwLGEsMCxwKSxsLnB1c2gocCwwLC1hLHAsMCxhKTtjb25zdCB5PWY9PT1zP246cjt5LnRvQXJyYXkoYyxkKSxkKz0zLHkudG9BcnJheShjLGQpLGQrPTMseS50b0FycmF5KGMsZCksZCs9Myx5LnRvQXJyYXkoYyxkKSxkKz0zfWNvbnN0IHU9bmV3IEZ0O3Uuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KGwsMykpLHUuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IE10KGMsMykpO2NvbnN0IGg9bmV3IGhuKHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pO3N1cGVyKHUsaCksdGhpcy50eXBlPSJHcmlkSGVscGVyIn1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fWNsYXNzIE5UIGV4dGVuZHMgUml7Y29uc3RydWN0b3IodD0xMCxlPTE2LG49OCxyPTY0LHM9NDQ3MzkyNCxvPTg5NDc4NDgpe3M9bmV3IHh0KHMpLG89bmV3IHh0KG8pO2NvbnN0IGE9W10sbD1bXTtpZihlPjEpZm9yKGxldCBoPTA7aDxlO2grKyl7Y29uc3QgZj1oL2UqKE1hdGguUEkqMiksZD1NYXRoLnNpbihmKSp0LHA9TWF0aC5jb3MoZikqdDthLnB1c2goMCwwLDApLGEucHVzaChkLDAscCk7Y29uc3QgeT1oJjE/czpvO2wucHVzaCh5LnIseS5nLHkuYiksbC5wdXNoKHkucix5LmcseS5iKX1mb3IobGV0IGg9MDtoPG47aCsrKXtjb25zdCBmPWgmMT9zOm8sZD10LXQvbipoO2ZvcihsZXQgcD0wO3A8cjtwKyspe2xldCB5PXAvciooTWF0aC5QSSoyKSxnPU1hdGguc2luKHkpKmQsbT1NYXRoLmNvcyh5KSpkO2EucHVzaChnLDAsbSksbC5wdXNoKGYucixmLmcsZi5iKSx5PShwKzEpL3IqKE1hdGguUEkqMiksZz1NYXRoLnNpbih5KSpkLG09TWF0aC5jb3MoeSkqZCxhLnB1c2goZywwLG0pLGwucHVzaChmLnIsZi5nLGYuYil9fWNvbnN0IGM9bmV3IEZ0O2Muc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KGEsMykpLGMuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IE10KGwsMykpO2NvbnN0IHU9bmV3IGhuKHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pO3N1cGVyKGMsdSksdGhpcy50eXBlPSJQb2xhckdyaWRIZWxwZXIifWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y29uc3QgRXg9bmV3IFIsV3U9bmV3IFIsVHg9bmV3IFI7Y2xhc3MgRlQgZXh0ZW5kcyBhZXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLmxpZ2h0PXQsdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1uLHRoaXMudHlwZT0iRGlyZWN0aW9uYWxMaWdodEhlbHBlciIsZT09PXZvaWQgMCYmKGU9MSk7bGV0IHI9bmV3IEZ0O3Iuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IE10KFstZSxlLDAsZSxlLDAsZSwtZSwwLC1lLC1lLDAsLWUsZSwwXSwzKSk7Y29uc3Qgcz1uZXcgaG4oe2ZvZzohMSx0b25lTWFwcGVkOiExfSk7dGhpcy5saWdodFBsYW5lPW5ldyBBcihyLHMpLHRoaXMuYWRkKHRoaXMubGlnaHRQbGFuZSkscj1uZXcgRnQsci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQoWzAsMCwwLDAsMCwxXSwzKSksdGhpcy50YXJnZXRMaW5lPW5ldyBBcihyLHMpLHRoaXMuYWRkKHRoaXMudGFyZ2V0TGluZSksdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksRXguc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLFd1LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCksVHguc3ViVmVjdG9ycyhXdSxFeCksdGhpcy5saWdodFBsYW5lLmxvb2tBdChXdSksdGhpcy5jb2xvciE9PXZvaWQgMD8odGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpKToodGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvciksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcikpLHRoaXMudGFyZ2V0TGluZS5sb29rQXQoV3UpLHRoaXMudGFyZ2V0TGluZS5zY2FsZS56PVR4Lmxlbmd0aCgpfX1jb25zdCAkdT1uZXcgUixDZT1uZXcgS2M7Y2xhc3MgQlQgZXh0ZW5kcyBSaXtjb25zdHJ1Y3Rvcih0KXtjb25zdCBlPW5ldyBGdCxuPW5ldyBobih7Y29sb3I6MTY3NzcyMTUsdmVydGV4Q29sb3JzOiEwLHRvbmVNYXBwZWQ6ITF9KSxyPVtdLHM9W10sbz17fTthKCJuMSIsIm4yIiksYSgibjIiLCJuNCIpLGEoIm40IiwibjMiKSxhKCJuMyIsIm4xIiksYSgiZjEiLCJmMiIpLGEoImYyIiwiZjQiKSxhKCJmNCIsImYzIiksYSgiZjMiLCJmMSIpLGEoIm4xIiwiZjEiKSxhKCJuMiIsImYyIiksYSgibjMiLCJmMyIpLGEoIm40IiwiZjQiKSxhKCJwIiwibjEiKSxhKCJwIiwibjIiKSxhKCJwIiwibjMiKSxhKCJwIiwibjQiKSxhKCJ1MSIsInUyIiksYSgidTIiLCJ1MyIpLGEoInUzIiwidTEiKSxhKCJjIiwidCIpLGEoInAiLCJjIiksYSgiY24xIiwiY24yIiksYSgiY24zIiwiY240IiksYSgiY2YxIiwiY2YyIiksYSgiY2YzIiwiY2Y0Iik7ZnVuY3Rpb24gYShwLHkpe2wocCksbCh5KX1mdW5jdGlvbiBsKHApe3IucHVzaCgwLDAsMCkscy5wdXNoKDAsMCwwKSxvW3BdPT09dm9pZCAwJiYob1twXT1bXSksb1twXS5wdXNoKHIubGVuZ3RoLzMtMSl9ZS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQociwzKSksZS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgTXQocywzKSksc3VwZXIoZSxuKSx0aGlzLnR5cGU9IkNhbWVyYUhlbHBlciIsdGhpcy5jYW1lcmE9dCx0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4JiZ0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5wb2ludE1hcD1vLHRoaXMudXBkYXRlKCk7Y29uc3QgYz1uZXcgeHQoMTY3NTUyMDApLHU9bmV3IHh0KDE2NzExNjgwKSxoPW5ldyB4dCg0Mzc3NSksZj1uZXcgeHQoMTY3NzcyMTUpLGQ9bmV3IHh0KDMzNTU0NDMpO3RoaXMuc2V0Q29sb3JzKGMsdSxoLGYsZCl9c2V0Q29sb3JzKHQsZSxuLHIscyl7Y29uc3QgYT10aGlzLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSgiY29sb3IiKTthLnNldFhZWigwLHQucix0LmcsdC5iKSxhLnNldFhZWigxLHQucix0LmcsdC5iKSxhLnNldFhZWigyLHQucix0LmcsdC5iKSxhLnNldFhZWigzLHQucix0LmcsdC5iKSxhLnNldFhZWig0LHQucix0LmcsdC5iKSxhLnNldFhZWig1LHQucix0LmcsdC5iKSxhLnNldFhZWig2LHQucix0LmcsdC5iKSxhLnNldFhZWig3LHQucix0LmcsdC5iKSxhLnNldFhZWig4LHQucix0LmcsdC5iKSxhLnNldFhZWig5LHQucix0LmcsdC5iKSxhLnNldFhZWigxMCx0LnIsdC5nLHQuYiksYS5zZXRYWVooMTEsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDEyLHQucix0LmcsdC5iKSxhLnNldFhZWigxMyx0LnIsdC5nLHQuYiksYS5zZXRYWVooMTQsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDE1LHQucix0LmcsdC5iKSxhLnNldFhZWigxNix0LnIsdC5nLHQuYiksYS5zZXRYWVooMTcsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDE4LHQucix0LmcsdC5iKSxhLnNldFhZWigxOSx0LnIsdC5nLHQuYiksYS5zZXRYWVooMjAsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDIxLHQucix0LmcsdC5iKSxhLnNldFhZWigyMix0LnIsdC5nLHQuYiksYS5zZXRYWVooMjMsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDI0LGUucixlLmcsZS5iKSxhLnNldFhZWigyNSxlLnIsZS5nLGUuYiksYS5zZXRYWVooMjYsZS5yLGUuZyxlLmIpLGEuc2V0WFlaKDI3LGUucixlLmcsZS5iKSxhLnNldFhZWigyOCxlLnIsZS5nLGUuYiksYS5zZXRYWVooMjksZS5yLGUuZyxlLmIpLGEuc2V0WFlaKDMwLGUucixlLmcsZS5iKSxhLnNldFhZWigzMSxlLnIsZS5nLGUuYiksYS5zZXRYWVooMzIsbi5yLG4uZyxuLmIpLGEuc2V0WFlaKDMzLG4ucixuLmcsbi5iKSxhLnNldFhZWigzNCxuLnIsbi5nLG4uYiksYS5zZXRYWVooMzUsbi5yLG4uZyxuLmIpLGEuc2V0WFlaKDM2LG4ucixuLmcsbi5iKSxhLnNldFhZWigzNyxuLnIsbi5nLG4uYiksYS5zZXRYWVooMzgsci5yLHIuZyxyLmIpLGEuc2V0WFlaKDM5LHIucixyLmcsci5iKSxhLnNldFhZWig0MCxzLnIscy5nLHMuYiksYS5zZXRYWVooNDEscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQyLHMucixzLmcscy5iKSxhLnNldFhZWig0MyxzLnIscy5nLHMuYiksYS5zZXRYWVooNDQscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQ1LHMucixzLmcscy5iKSxhLnNldFhZWig0NixzLnIscy5nLHMuYiksYS5zZXRYWVooNDcscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQ4LHMucixzLmcscy5iKSxhLnNldFhZWig0OSxzLnIscy5nLHMuYiksYS5uZWVkc1VwZGF0ZT0hMH11cGRhdGUoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10aGlzLnBvaW50TWFwLG49MSxyPTE7Q2UucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLmNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksTmUoImMiLGUsdCxDZSwwLDAsLTEpLE5lKCJ0IixlLHQsQ2UsMCwwLDEpLE5lKCJuMSIsZSx0LENlLC1uLC1yLC0xKSxOZSgibjIiLGUsdCxDZSxuLC1yLC0xKSxOZSgibjMiLGUsdCxDZSwtbixyLC0xKSxOZSgibjQiLGUsdCxDZSxuLHIsLTEpLE5lKCJmMSIsZSx0LENlLC1uLC1yLDEpLE5lKCJmMiIsZSx0LENlLG4sLXIsMSksTmUoImYzIixlLHQsQ2UsLW4sciwxKSxOZSgiZjQiLGUsdCxDZSxuLHIsMSksTmUoInUxIixlLHQsQ2UsbiouNyxyKjEuMSwtMSksTmUoInUyIixlLHQsQ2UsLW4qLjcscioxLjEsLTEpLE5lKCJ1MyIsZSx0LENlLDAscioyLC0xKSxOZSgiY2YxIixlLHQsQ2UsLW4sMCwxKSxOZSgiY2YyIixlLHQsQ2UsbiwwLDEpLE5lKCJjZjMiLGUsdCxDZSwwLC1yLDEpLE5lKCJjZjQiLGUsdCxDZSwwLHIsMSksTmUoImNuMSIsZSx0LENlLC1uLDAsLTEpLE5lKCJjbjIiLGUsdCxDZSxuLDAsLTEpLE5lKCJjbjMiLGUsdCxDZSwwLC1yLC0xKSxOZSgiY240IixlLHQsQ2UsMCxyLC0xKSx0LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMH1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fWZ1bmN0aW9uIE5lKGksdCxlLG4scixzLG8peyR1LnNldChyLHMsbykudW5wcm9qZWN0KG4pO2NvbnN0IGE9dFtpXTtpZihhIT09dm9pZCAwKXtjb25zdCBsPWUuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2ZvcihsZXQgYz0wLHU9YS5sZW5ndGg7Yzx1O2MrKylsLnNldFhZWihhW2NdLCR1LngsJHUueSwkdS56KX19Y29uc3QgWHU9bmV3IG1lO2NsYXNzIE9UIGV4dGVuZHMgUml7Y29uc3RydWN0b3IodCxlPTE2Nzc2OTYwKXtjb25zdCBuPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKSxyPW5ldyBGbG9hdDMyQXJyYXkoOCozKSxzPW5ldyBGdDtzLnNldEluZGV4KG5ldyBKdChuLDEpKSxzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBKdChyLDMpKSxzdXBlcihzLG5ldyBobih7Y29sb3I6ZSx0b25lTWFwcGVkOiExfSkpLHRoaXMub2JqZWN0PXQsdGhpcy50eXBlPSJCb3hIZWxwZXIiLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSh0KXtpZih0IT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpLHRoaXMub2JqZWN0IT09dm9pZCAwJiZYdS5zZXRGcm9tT2JqZWN0KHRoaXMub2JqZWN0KSxYdS5pc0VtcHR5KCkpcmV0dXJuO2NvbnN0IGU9WHUubWluLG49WHUubWF4LHI9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHM9ci5hcnJheTtzWzBdPW4ueCxzWzFdPW4ueSxzWzJdPW4ueixzWzNdPWUueCxzWzRdPW4ueSxzWzVdPW4ueixzWzZdPWUueCxzWzddPWUueSxzWzhdPW4ueixzWzldPW4ueCxzWzEwXT1lLnksc1sxMV09bi56LHNbMTJdPW4ueCxzWzEzXT1uLnksc1sxNF09ZS56LHNbMTVdPWUueCxzWzE2XT1uLnksc1sxN109ZS56LHNbMThdPWUueCxzWzE5XT1lLnksc1syMF09ZS56LHNbMjFdPW4ueCxzWzIyXT1lLnksc1syM109ZS56LHIubmVlZHNVcGRhdGU9ITAsdGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX1zZXRGcm9tT2JqZWN0KHQpe3JldHVybiB0aGlzLm9iamVjdD10LHRoaXMudXBkYXRlKCksdGhpc31jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLm9iamVjdD10Lm9iamVjdCx0aGlzfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgelQgZXh0ZW5kcyBSaXtjb25zdHJ1Y3Rvcih0LGU9MTY3NzY5NjApe2NvbnN0IG49bmV3IFVpbnQxNkFycmF5KFswLDEsMSwyLDIsMywzLDAsNCw1LDUsNiw2LDcsNyw0LDAsNCwxLDUsMiw2LDMsN10pLHI9WzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsLTEsMSwxLDEsLTEsLTEsMSwtMSwtMSwtMSwtMSwxLC0xLC0xXSxzPW5ldyBGdDtzLnNldEluZGV4KG5ldyBKdChuLDEpKSxzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBNdChyLDMpKSxzdXBlcihzLG5ldyBobih7Y29sb3I6ZSx0b25lTWFwcGVkOiExfSkpLHRoaXMuYm94PXQsdGhpcy50eXBlPSJCb3gzSGVscGVyIix0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe2NvbnN0IGU9dGhpcy5ib3g7ZS5pc0VtcHR5KCl8fChlLmdldENlbnRlcih0aGlzLnBvc2l0aW9uKSxlLmdldFNpemUodGhpcy5zY2FsZSksdGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciguNSksc3VwZXIudXBkYXRlTWF0cml4V29ybGQodCkpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3Mga1QgZXh0ZW5kcyBBcntjb25zdHJ1Y3Rvcih0LGU9MSxuPTE2Nzc2OTYwKXtjb25zdCByPW4scz1bMSwtMSwwLC0xLDEsMCwtMSwtMSwwLDEsMSwwLC0xLDEsMCwtMSwtMSwwLDEsLTEsMCwxLDEsMF0sbz1uZXcgRnQ7by5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQocywzKSksby5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxzdXBlcihvLG5ldyBobih7Y29sb3I6cix0b25lTWFwcGVkOiExfSkpLHRoaXMudHlwZT0iUGxhbmVIZWxwZXIiLHRoaXMucGxhbmU9dCx0aGlzLnNpemU9ZTtjb25zdCBhPVsxLDEsMCwtMSwxLDAsLTEsLTEsMCwxLDEsMCwtMSwtMSwwLDEsLTEsMF0sbD1uZXcgRnQ7bC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQoYSwzKSksbC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzLmFkZChuZXcgVWUobCxuZXcgYnIoe2NvbG9yOnIsb3BhY2l0eTouMix0cmFuc3BhcmVudDohMCxkZXB0aFdyaXRlOiExLHRvbmVNYXBwZWQ6ITF9KSkpfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMucG9zaXRpb24uc2V0KDAsMCwwKSx0aGlzLnNjYWxlLnNldCguNSp0aGlzLnNpemUsLjUqdGhpcy5zaXplLDEpLHRoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKSx0aGlzLnRyYW5zbGF0ZVooLXRoaXMucGxhbmUuY29uc3RhbnQpLHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y29uc3QgQ3g9bmV3IFI7bGV0IHF1LFBwO2NsYXNzIFZUIGV4dGVuZHMgYWV7Y29uc3RydWN0b3IodD1uZXcgUigwLDAsMSksZT1uZXcgUigwLDAsMCksbj0xLHI9MTY3NzY5NjAscz1uKi4yLG89cyouMil7c3VwZXIoKSx0aGlzLnR5cGU9IkFycm93SGVscGVyIixxdT09PXZvaWQgMCYmKHF1PW5ldyBGdCxxdS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQoWzAsMCwwLDAsMSwwXSwzKSksUHA9bmV3IE1vKDAsLjUsMSw1LDEpLFBwLnRyYW5zbGF0ZSgwLC0uNSwwKSksdGhpcy5wb3NpdGlvbi5jb3B5KGUpLHRoaXMubGluZT1uZXcgQXIocXUsbmV3IGhuKHtjb2xvcjpyLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5hZGQodGhpcy5saW5lKSx0aGlzLmNvbmU9bmV3IFVlKFBwLG5ldyBicih7Y29sb3I6cix0b25lTWFwcGVkOiExfSkpLHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuYWRkKHRoaXMuY29uZSksdGhpcy5zZXREaXJlY3Rpb24odCksdGhpcy5zZXRMZW5ndGgobixzLG8pfXNldERpcmVjdGlvbih0KXtpZih0Lnk+Ljk5OTk5KXRoaXMucXVhdGVybmlvbi5zZXQoMCwwLDAsMSk7ZWxzZSBpZih0Lnk8LS45OTk5OSl0aGlzLnF1YXRlcm5pb24uc2V0KDEsMCwwLDApO2Vsc2V7Q3guc2V0KHQueiwwLC10LngpLm5vcm1hbGl6ZSgpO2NvbnN0IGU9TWF0aC5hY29zKHQueSk7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoQ3gsZSl9fXNldExlbmd0aCh0LGU9dCouMixuPWUqLjIpe3RoaXMubGluZS5zY2FsZS5zZXQoMSxNYXRoLm1heCgxZS00LHQtZSksMSksdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpLHRoaXMuY29uZS5zY2FsZS5zZXQobixlLG4pLHRoaXMuY29uZS5wb3NpdGlvbi55PXQsdGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpfXNldENvbG9yKHQpe3RoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQodCksdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQsITEpLHRoaXMubGluZS5jb3B5KHQubGluZSksdGhpcy5jb25lLmNvcHkodC5jb25lKSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmxpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubGluZS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpfX1jbGFzcyBHVCBleHRlbmRzIFJpe2NvbnN0cnVjdG9yKHQ9MSl7Y29uc3QgZT1bMCwwLDAsdCwwLDAsMCwwLDAsMCx0LDAsMCwwLDAsMCwwLHRdLG49WzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSxyPW5ldyBGdDtyLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBNdChlLDMpKSxyLnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBNdChuLDMpKTtjb25zdCBzPW5ldyBobih7dmVydGV4Q29sb3JzOiEwLHRvbmVNYXBwZWQ6ITF9KTtzdXBlcihyLHMpLHRoaXMudHlwZT0iQXhlc0hlbHBlciJ9c2V0Q29sb3JzKHQsZSxuKXtjb25zdCByPW5ldyB4dCxzPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5hcnJheTtyZXR1cm4gci5zZXQodCksci50b0FycmF5KHMsMCksci50b0FycmF5KHMsMyksci5zZXQoZSksci50b0FycmF5KHMsNiksci50b0FycmF5KHMsOSksci5zZXQobiksci50b0FycmF5KHMsMTIpLHIudG9BcnJheShzLDE1KSx0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IubmVlZHNVcGRhdGU9ITAsdGhpc31kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fWNsYXNzIEhUe2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJTaGFwZVBhdGgiLHRoaXMuY29sb3I9bmV3IHh0LHRoaXMuc3ViUGF0aHM9W10sdGhpcy5jdXJyZW50UGF0aD1udWxsfW1vdmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoPW5ldyBHYSx0aGlzLnN1YlBhdGhzLnB1c2godGhpcy5jdXJyZW50UGF0aCksdGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8odCxlKSx0aGlzfWxpbmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyh0LGUpLHRoaXN9cXVhZHJhdGljQ3VydmVUbyh0LGUsbixyKXtyZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLHIpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixyLHMsbyl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyh0LGUsbixyLHMsbyksdGhpc31zcGxpbmVUaHJ1KHQpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUodCksdGhpc310b1NoYXBlcyh0KXtmdW5jdGlvbiBlKG0pe2NvbnN0IHY9W107Zm9yKGxldCB4PTAsXz1tLmxlbmd0aDt4PF87eCsrKXtjb25zdCBNPW1beF0sYj1uZXcgSmk7Yi5jdXJ2ZXM9TS5jdXJ2ZXMsdi5wdXNoKGIpfXJldHVybiB2fWZ1bmN0aW9uIG4obSx2KXtjb25zdCB4PXYubGVuZ3RoO2xldCBfPSExO2ZvcihsZXQgTT14LTEsYj0wO2I8eDtNPWIrKyl7bGV0IEE9dltNXSxFPXZbYl0sdz1FLngtQS54LFM9RS55LUEueTtpZihNYXRoLmFicyhTKT5OdW1iZXIuRVBTSUxPTil7aWYoUzwwJiYoQT12W2JdLHc9LXcsRT12W01dLFM9LVMpLG0ueTxBLnl8fG0ueT5FLnkpY29udGludWU7aWYobS55PT09QS55KXtpZihtLng9PT1BLngpcmV0dXJuITB9ZWxzZXtjb25zdCBUPVMqKG0ueC1BLngpLXcqKG0ueS1BLnkpO2lmKFQ9PT0wKXJldHVybiEwO2lmKFQ8MCljb250aW51ZTtfPSFffX1lbHNle2lmKG0ueSE9PUEueSljb250aW51ZTtpZihFLng8PW0ueCYmbS54PD1BLnh8fEEueDw9bS54JiZtLng8PUUueClyZXR1cm4hMH19cmV0dXJuIF99Y29uc3Qgcj16bi5pc0Nsb2NrV2lzZSxzPXRoaXMuc3ViUGF0aHM7aWYocy5sZW5ndGg9PT0wKXJldHVybltdO2xldCBvLGEsbDtjb25zdCBjPVtdO2lmKHMubGVuZ3RoPT09MSlyZXR1cm4gYT1zWzBdLGw9bmV3IEppLGwuY3VydmVzPWEuY3VydmVzLGMucHVzaChsKSxjO2xldCB1PSFyKHNbMF0uZ2V0UG9pbnRzKCkpO3U9dD8hdTp1O2NvbnN0IGg9W10sZj1bXTtsZXQgZD1bXSxwPTAseTtmW3BdPXZvaWQgMCxkW3BdPVtdO2ZvcihsZXQgbT0wLHY9cy5sZW5ndGg7bTx2O20rKylhPXNbbV0seT1hLmdldFBvaW50cygpLG89cih5KSxvPXQ/IW86byxvPyghdSYmZltwXSYmcCsrLGZbcF09e3M6bmV3IEppLHA6eX0sZltwXS5zLmN1cnZlcz1hLmN1cnZlcyx1JiZwKyssZFtwXT1bXSk6ZFtwXS5wdXNoKHtoOmEscDp5WzBdfSk7aWYoIWZbMF0pcmV0dXJuIGUocyk7aWYoZi5sZW5ndGg+MSl7bGV0IG09ITEsdj0wO2ZvcihsZXQgeD0wLF89Zi5sZW5ndGg7eDxfO3grKyloW3hdPVtdO2ZvcihsZXQgeD0wLF89Zi5sZW5ndGg7eDxfO3grKyl7Y29uc3QgTT1kW3hdO2ZvcihsZXQgYj0wO2I8TS5sZW5ndGg7YisrKXtjb25zdCBBPU1bYl07bGV0IEU9ITA7Zm9yKGxldCB3PTA7dzxmLmxlbmd0aDt3KyspbihBLnAsZlt3XS5wKSYmKHghPT13JiZ2KyssRT8oRT0hMSxoW3ddLnB1c2goQSkpOm09ITApO0UmJmhbeF0ucHVzaChBKX19dj4wJiZtPT09ITEmJihkPWgpfWxldCBnO2ZvcihsZXQgbT0wLHY9Zi5sZW5ndGg7bTx2O20rKyl7bD1mW21dLnMsYy5wdXNoKGwpLGc9ZFttXTtmb3IobGV0IHg9MCxfPWcubGVuZ3RoO3g8Xzt4KyspbC5ob2xlcy5wdXNoKGdbeF0uaCl9cmV0dXJuIGN9fWNsYXNzIFdUIGV4dGVuZHMgVGl7Y29uc3RydWN0b3IodCxlPW51bGwpe3N1cGVyKCksdGhpcy5vYmplY3Q9dCx0aGlzLmRvbUVsZW1lbnQ9ZSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy5zdGF0ZT0tMSx0aGlzLmtleXM9e30sdGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6bnVsbCxNSURETEU6bnVsbCxSSUdIVDpudWxsfSx0aGlzLnRvdWNoZXM9e09ORTpudWxsLFRXTzpudWxsfX1jb25uZWN0KCl7fWRpc2Nvbm5lY3QoKXt9ZGlzcG9zZSgpe311cGRhdGUoKXt9fWZ1bmN0aW9uICRUKGksdCl7Y29uc3QgZT1pLmltYWdlJiZpLmltYWdlLndpZHRoP2kuaW1hZ2Uud2lkdGgvaS5pbWFnZS5oZWlnaHQ6MTtyZXR1cm4gZT50PyhpLnJlcGVhdC54PTEsaS5yZXBlYXQueT1lL3QsaS5vZmZzZXQueD0wLGkub2Zmc2V0Lnk9KDEtaS5yZXBlYXQueSkvMik6KGkucmVwZWF0Lng9dC9lLGkucmVwZWF0Lnk9MSxpLm9mZnNldC54PSgxLWkucmVwZWF0LngpLzIsaS5vZmZzZXQueT0wKSxpfWZ1bmN0aW9uIFhUKGksdCl7Y29uc3QgZT1pLmltYWdlJiZpLmltYWdlLndpZHRoP2kuaW1hZ2Uud2lkdGgvaS5pbWFnZS5oZWlnaHQ6MTtyZXR1cm4gZT50PyhpLnJlcGVhdC54PXQvZSxpLnJlcGVhdC55PTEsaS5vZmZzZXQueD0oMS1pLnJlcGVhdC54KS8yLGkub2Zmc2V0Lnk9MCk6KGkucmVwZWF0Lng9MSxpLnJlcGVhdC55PWUvdCxpLm9mZnNldC54PTAsaS5vZmZzZXQueT0oMS1pLnJlcGVhdC55KS8yKSxpfWZ1bmN0aW9uIHFUKGkpe3JldHVybiBpLnJlcGVhdC54PTEsaS5yZXBlYXQueT0xLGkub2Zmc2V0Lng9MCxpLm9mZnNldC55PTAsaX1mdW5jdGlvbiBJcChpLHQsZSxuKXtjb25zdCByPVlUKG4pO3N3aXRjaChlKXtjYXNlIGFkOnJldHVybiBpKnQ7Y2FzZSBjZDpyZXR1cm4gaSp0O2Nhc2UgdWQ6cmV0dXJuIGkqdCoyO2Nhc2UgbmM6cmV0dXJuIGkqdC9yLmNvbXBvbmVudHMqci5ieXRlTGVuZ3RoO2Nhc2UgZGE6cmV0dXJuIGkqdC9yLmNvbXBvbmVudHMqci5ieXRlTGVuZ3RoO2Nhc2UgaGQ6cmV0dXJuIGkqdCoyL3IuY29tcG9uZW50cypyLmJ5dGVMZW5ndGg7Y2FzZSBpYzpyZXR1cm4gaSp0KjIvci5jb21wb25lbnRzKnIuYnl0ZUxlbmd0aDtjYXNlIGxkOnJldHVybiBpKnQqMy9yLmNvbXBvbmVudHMqci5ieXRlTGVuZ3RoO2Nhc2UgYW46cmV0dXJuIGkqdCo0L3IuY29tcG9uZW50cypyLmJ5dGVMZW5ndGg7Y2FzZSByYzpyZXR1cm4gaSp0KjQvci5jb21wb25lbnRzKnIuYnl0ZUxlbmd0aDtjYXNlIHBhOmNhc2UgbWE6cmV0dXJuIE1hdGguZmxvb3IoKGkrMykvNCkqTWF0aC5mbG9vcigodCszKS80KSo4O2Nhc2UgZ2E6Y2FzZSB5YTpyZXR1cm4gTWF0aC5mbG9vcigoaSszKS80KSpNYXRoLmZsb29yKCh0KzMpLzQpKjE2O2Nhc2Ugb2M6Y2FzZSBsYzpyZXR1cm4gTWF0aC5tYXgoaSwxNikqTWF0aC5tYXgodCw4KS80O2Nhc2Ugc2M6Y2FzZSBhYzpyZXR1cm4gTWF0aC5tYXgoaSw4KSpNYXRoLm1heCh0LDgpLzI7Y2FzZSBjYzpjYXNlIHVjOnJldHVybiBNYXRoLmZsb29yKChpKzMpLzQpKk1hdGguZmxvb3IoKHQrMykvNCkqODtjYXNlIGhjOnJldHVybiBNYXRoLmZsb29yKChpKzMpLzQpKk1hdGguZmxvb3IoKHQrMykvNCkqMTY7Y2FzZSBmYzpyZXR1cm4gTWF0aC5mbG9vcigoaSszKS80KSpNYXRoLmZsb29yKCh0KzMpLzQpKjE2O2Nhc2UgZGM6cmV0dXJuIE1hdGguZmxvb3IoKGkrNCkvNSkqTWF0aC5mbG9vcigodCszKS80KSoxNjtjYXNlIHBjOnJldHVybiBNYXRoLmZsb29yKChpKzQpLzUpKk1hdGguZmxvb3IoKHQrNCkvNSkqMTY7Y2FzZSBtYzpyZXR1cm4gTWF0aC5mbG9vcigoaSs1KS82KSpNYXRoLmZsb29yKCh0KzQpLzUpKjE2O2Nhc2UgZ2M6cmV0dXJuIE1hdGguZmxvb3IoKGkrNSkvNikqTWF0aC5mbG9vcigodCs1KS82KSoxNjtjYXNlIHljOnJldHVybiBNYXRoLmZsb29yKChpKzcpLzgpKk1hdGguZmxvb3IoKHQrNCkvNSkqMTY7Y2FzZSBfYzpyZXR1cm4gTWF0aC5mbG9vcigoaSs3KS84KSpNYXRoLmZsb29yKCh0KzUpLzYpKjE2O2Nhc2UgeGM6cmV0dXJuIE1hdGguZmxvb3IoKGkrNykvOCkqTWF0aC5mbG9vcigodCs3KS84KSoxNjtjYXNlIHZjOnJldHVybiBNYXRoLmZsb29yKChpKzkpLzEwKSpNYXRoLmZsb29yKCh0KzQpLzUpKjE2O2Nhc2UgU2M6cmV0dXJuIE1hdGguZmxvb3IoKGkrOSkvMTApKk1hdGguZmxvb3IoKHQrNSkvNikqMTY7Y2FzZSBNYzpyZXR1cm4gTWF0aC5mbG9vcigoaSs5KS8xMCkqTWF0aC5mbG9vcigodCs3KS84KSoxNjtjYXNlIGJjOnJldHVybiBNYXRoLmZsb29yKChpKzkpLzEwKSpNYXRoLmZsb29yKCh0KzkpLzEwKSoxNjtjYXNlIHdjOnJldHVybiBNYXRoLmZsb29yKChpKzExKS8xMikqTWF0aC5mbG9vcigodCs5KS8xMCkqMTY7Y2FzZSBBYzpyZXR1cm4gTWF0aC5mbG9vcigoaSsxMSkvMTIpKk1hdGguZmxvb3IoKHQrMTEpLzEyKSoxNjtjYXNlIF9hOmNhc2UgRWM6Y2FzZSBUYzpyZXR1cm4gTWF0aC5jZWlsKGkvNCkqTWF0aC5jZWlsKHQvNCkqMTY7Y2FzZSBmZDpjYXNlIENjOnJldHVybiBNYXRoLmNlaWwoaS80KSpNYXRoLmNlaWwodC80KSo4O2Nhc2UgUmM6Y2FzZSBQYzpyZXR1cm4gTWF0aC5jZWlsKGkvNCkqTWF0aC5jZWlsKHQvNCkqMTZ9dGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0ZXJtaW5lIHRleHR1cmUgYnl0ZSBsZW5ndGggZm9yICR7ZX0gZm9ybWF0LmApfWZ1bmN0aW9uIFlUKGkpe3N3aXRjaChpKXtjYXNlIEFpOmNhc2UgcmQ6cmV0dXJue2J5dGVMZW5ndGg6MSxjb21wb25lbnRzOjF9O2Nhc2UgWnM6Y2FzZSBzZDpjYXNlIEpzOnJldHVybntieXRlTGVuZ3RoOjIsY29tcG9uZW50czoxfTtjYXNlIHRjOmNhc2UgZWM6cmV0dXJue2J5dGVMZW5ndGg6Mixjb21wb25lbnRzOjR9O2Nhc2UgVmk6Y2FzZSBRbDpjYXNlIHZuOnJldHVybntieXRlTGVuZ3RoOjQsY29tcG9uZW50czoxfTtjYXNlIG9kOnJldHVybntieXRlTGVuZ3RoOjQsY29tcG9uZW50czozfX10aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGV4dHVyZSB0eXBlICR7aX0uYCl9Y29uc3QgWlQ9e2NvbnRhaW46JFQsY292ZXI6WFQsZmlsbDpxVCxnZXRCeXRlTGVuZ3RoOklwfTtjbGFzcyBKVCBleHRlbmRzIG9pe2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0xLHI9e30pe2NvbnNvbGUud2FybignVEhSRUUuV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHIxNzIuIFVzZSBUSFJFRS5XZWJHTFJlbmRlclRhcmdldCBhbmQgc2V0IHRoZSAiY291bnQiIHBhcmFtZXRlciB0byBlbmFibGUgTVJULicpLHN1cGVyKHQsZSxGaShvbih7fSxyKSx7Y291bnQ6bn0pKSx0aGlzLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM9ITB9Z2V0IHRleHR1cmUoKXtyZXR1cm4gdGhpcy50ZXh0dXJlc319dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOm5lfX0pKSx0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKHdpbmRvdy5fX1RIUkVFX18/Y29uc29sZS53YXJuKCJXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuIik6d2luZG93Ll9fVEhSRUVfXz1uZSk7LyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCAyMDEwLTIwMjQgVGhyZWUuanMgQXV0aG9ycwogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAqL2Z1bmN0aW9uIFJ4KCl7bGV0IGk9bnVsbCx0PSExLGU9bnVsbCxuPW51bGw7ZnVuY3Rpb24gcihzLG8pe2UocyxvKSxuPWkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpfXJldHVybntzdGFydDpmdW5jdGlvbigpe3QhPT0hMCYmZSE9PW51bGwmJihuPWkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpLHQ9ITApfSxzdG9wOmZ1bmN0aW9uKCl7aS5jYW5jZWxBbmltYXRpb25GcmFtZShuKSx0PSExfSxzZXRBbmltYXRpb25Mb29wOmZ1bmN0aW9uKHMpe2U9c30sc2V0Q29udGV4dDpmdW5jdGlvbihzKXtpPXN9fX1mdW5jdGlvbiBqVChpKXtjb25zdCB0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGUoYSxsKXtjb25zdCBjPWEuYXJyYXksdT1hLnVzYWdlLGg9Yy5ieXRlTGVuZ3RoLGY9aS5jcmVhdGVCdWZmZXIoKTtpLmJpbmRCdWZmZXIobCxmKSxpLmJ1ZmZlckRhdGEobCxjLHUpLGEub25VcGxvYWRDYWxsYmFjaygpO2xldCBkO2lmKGMgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpZD1pLkZMT0FUO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KWEuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlP2Q9aS5IQUxGX0ZMT0FUOmQ9aS5VTlNJR05FRF9TSE9SVDtlbHNlIGlmKGMgaW5zdGFuY2VvZiBJbnQxNkFycmF5KWQ9aS5TSE9SVDtlbHNlIGlmKGMgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlkPWkuVU5TSUdORURfSU5UO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIEludDMyQXJyYXkpZD1pLklOVDtlbHNlIGlmKGMgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpZD1pLkJZVEU7ZWxzZSBpZihjIGluc3RhbmNlb2YgVWludDhBcnJheSlkPWkuVU5TSUdORURfQllURTtlbHNlIGlmKGMgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlkPWkuVU5TSUdORURfQllURTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBidWZmZXIgZGF0YSBmb3JtYXQ6ICIrYyk7cmV0dXJue2J1ZmZlcjpmLHR5cGU6ZCxieXRlc1BlckVsZW1lbnQ6Yy5CWVRFU19QRVJfRUxFTUVOVCx2ZXJzaW9uOmEudmVyc2lvbixzaXplOmh9fWZ1bmN0aW9uIG4oYSxsLGMpe2NvbnN0IHU9bC5hcnJheSxoPWwudXBkYXRlUmFuZ2VzO2lmKGkuYmluZEJ1ZmZlcihjLGEpLGgubGVuZ3RoPT09MClpLmJ1ZmZlclN1YkRhdGEoYywwLHUpO2Vsc2V7aC5zb3J0KChkLHApPT5kLnN0YXJ0LXAuc3RhcnQpO2xldCBmPTA7Zm9yKGxldCBkPTE7ZDxoLmxlbmd0aDtkKyspe2NvbnN0IHA9aFtmXSx5PWhbZF07eS5zdGFydDw9cC5zdGFydCtwLmNvdW50KzE/cC5jb3VudD1NYXRoLm1heChwLmNvdW50LHkuc3RhcnQreS5jb3VudC1wLnN0YXJ0KTooKytmLGhbZl09eSl9aC5sZW5ndGg9ZisxO2ZvcihsZXQgZD0wLHA9aC5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1oW2RdO2kuYnVmZmVyU3ViRGF0YShjLHkuc3RhcnQqdS5CWVRFU19QRVJfRUxFTUVOVCx1LHkuc3RhcnQseS5jb3VudCl9bC5jbGVhclVwZGF0ZVJhbmdlcygpfWwub25VcGxvYWRDYWxsYmFjaygpfWZ1bmN0aW9uIHIoYSl7cmV0dXJuIGEuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGE9YS5kYXRhKSx0LmdldChhKX1mdW5jdGlvbiBzKGEpe2EuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGE9YS5kYXRhKTtjb25zdCBsPXQuZ2V0KGEpO2wmJihpLmRlbGV0ZUJ1ZmZlcihsLmJ1ZmZlciksdC5kZWxldGUoYSkpfWZ1bmN0aW9uIG8oYSxsKXtpZihhLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihhPWEuZGF0YSksYS5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zdCB1PXQuZ2V0KGEpOyghdXx8dS52ZXJzaW9uPGEudmVyc2lvbikmJnQuc2V0KGEse2J1ZmZlcjphLmJ1ZmZlcix0eXBlOmEudHlwZSxieXRlc1BlckVsZW1lbnQ6YS5lbGVtZW50U2l6ZSx2ZXJzaW9uOmEudmVyc2lvbn0pO3JldHVybn1jb25zdCBjPXQuZ2V0KGEpO2lmKGM9PT12b2lkIDApdC5zZXQoYSxlKGEsbCkpO2Vsc2UgaWYoYy52ZXJzaW9uPGEudmVyc2lvbil7aWYoYy5zaXplIT09YS5hcnJheS5ieXRlTGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZSdzIGFycmF5IGJ1ZmZlciBkb2VzIG5vdCBtYXRjaCB0aGUgb3JpZ2luYWwgc2l6ZS4gUmVzaXppbmcgYnVmZmVyIGF0dHJpYnV0ZXMgaXMgbm90IHN1cHBvcnRlZC4iKTtuKGMuYnVmZmVyLGEsbCksYy52ZXJzaW9uPWEudmVyc2lvbn19cmV0dXJue2dldDpyLHJlbW92ZTpzLHVwZGF0ZTpvfX12YXIgS1Q9YCNpZmRlZiBVU0VfQUxQSEFIQVNICglpZiAoIGRpZmZ1c2VDb2xvci5hIDwgZ2V0QWxwaGFIYXNoVGhyZXNob2xkKCB2UG9zaXRpb24gKSApIGRpc2NhcmQ7CiNlbmRpZmAsUVQ9YCNpZmRlZiBVU0VfQUxQSEFIQVNICgljb25zdCBmbG9hdCBBTFBIQV9IQVNIX1NDQUxFID0gMC4wNTsKCWZsb2F0IGhhc2gyRCggdmVjMiB2YWx1ZSApIHsKCQlyZXR1cm4gZnJhY3QoIDEuMGU0ICogc2luKCAxNy4wICogdmFsdWUueCArIDAuMSAqIHZhbHVlLnkgKSAqICggMC4xICsgYWJzKCBzaW4oIDEzLjAgKiB2YWx1ZS55ICsgdmFsdWUueCApICkgKSApOwoJfQoJZmxvYXQgaGFzaDNEKCB2ZWMzIHZhbHVlICkgewoJCXJldHVybiBoYXNoMkQoIHZlYzIoIGhhc2gyRCggdmFsdWUueHkgKSwgdmFsdWUueiApICk7Cgl9CglmbG9hdCBnZXRBbHBoYUhhc2hUaHJlc2hvbGQoIHZlYzMgcG9zaXRpb24gKSB7CgkJZmxvYXQgbWF4RGVyaXYgPSBtYXgoCgkJCWxlbmd0aCggZEZkeCggcG9zaXRpb24ueHl6ICkgKSwKCQkJbGVuZ3RoKCBkRmR5KCBwb3NpdGlvbi54eXogKSApCgkJKTsKCQlmbG9hdCBwaXhTY2FsZSA9IDEuMCAvICggQUxQSEFfSEFTSF9TQ0FMRSAqIG1heERlcml2ICk7CgkJdmVjMiBwaXhTY2FsZXMgPSB2ZWMyKAoJCQlleHAyKCBmbG9vciggbG9nMiggcGl4U2NhbGUgKSApICksCgkJCWV4cDIoIGNlaWwoIGxvZzIoIHBpeFNjYWxlICkgKSApCgkJKTsKCQl2ZWMyIGFscGhhID0gdmVjMigKCQkJaGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLnggKiBwb3NpdGlvbi54eXogKSApLAoJCQloYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueSAqIHBvc2l0aW9uLnh5eiApICkKCQkpOwoJCWZsb2F0IGxlcnBGYWN0b3IgPSBmcmFjdCggbG9nMiggcGl4U2NhbGUgKSApOwoJCWZsb2F0IHggPSAoIDEuMCAtIGxlcnBGYWN0b3IgKSAqIGFscGhhLnggKyBsZXJwRmFjdG9yICogYWxwaGEueTsKCQlmbG9hdCBhID0gbWluKCBsZXJwRmFjdG9yLCAxLjAgLSBsZXJwRmFjdG9yICk7CgkJdmVjMyBjYXNlcyA9IHZlYzMoCgkJCXggKiB4IC8gKCAyLjAgKiBhICogKCAxLjAgLSBhICkgKSwKCQkJKCB4IC0gMC41ICogYSApIC8gKCAxLjAgLSBhICksCgkJCTEuMCAtICggKCAxLjAgLSB4ICkgKiAoIDEuMCAtIHggKSAvICggMi4wICogYSAqICggMS4wIC0gYSApICkgKQoJCSk7CgkJZmxvYXQgdGhyZXNob2xkID0gKCB4IDwgKCAxLjAgLSBhICkgKQoJCQk/ICggKCB4IDwgYSApID8gY2FzZXMueCA6IGNhc2VzLnkgKQoJCQk6IGNhc2VzLno7CgkJcmV0dXJuIGNsYW1wKCB0aHJlc2hvbGQgLCAxLjBlLTYsIDEuMCApOwoJfQojZW5kaWZgLHRDPWAjaWZkZWYgVVNFX0FMUEhBTUFQCglkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2QWxwaGFNYXBVdiApLmc7CiNlbmRpZmAsZUM9YCNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwOwojZW5kaWZgLG5DPWAjaWZkZWYgVVNFX0FMUEhBVEVTVAoJI2lmZGVmIEFMUEhBX1RPX0NPVkVSQUdFCglkaWZmdXNlQ29sb3IuYSA9IHNtb290aHN0ZXAoIGFscGhhVGVzdCwgYWxwaGFUZXN0ICsgZndpZHRoKCBkaWZmdXNlQ29sb3IuYSApLCBkaWZmdXNlQ29sb3IuYSApOwoJaWYgKCBkaWZmdXNlQ29sb3IuYSA9PSAwLjAgKSBkaXNjYXJkOwoJI2Vsc2UKCWlmICggZGlmZnVzZUNvbG9yLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkOwoJI2VuZGlmCiNlbmRpZmAsaUM9YCNpZmRlZiBVU0VfQUxQSEFURVNUCgl1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsKI2VuZGlmYCxyQz1gI2lmZGVmIFVTRV9BT01BUAoJZmxvYXQgYW1iaWVudE9jY2x1c2lvbiA9ICggdGV4dHVyZTJEKCBhb01hcCwgdkFvTWFwVXYgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uOwoJI2lmIGRlZmluZWQoIFVTRV9DTEVBUkNPQVQgKSAKCQljbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ICo9IGFtYmllbnRPY2NsdXNpb247CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKSAKCQlzaGVlblNwZWN1bGFySW5kaXJlY3QgKj0gYW1iaWVudE9jY2x1c2lvbjsKCSNlbmRpZgoJI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApCgkJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTsKCQlyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCiNlbmRpZmAsc0M9YCNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwOwoJdW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTsKI2VuZGlmYCxvQz1gI2lmZGVmIFVTRV9CQVRDSElORwoJI2lmICEgZGVmaW5lZCggR0xfQU5HTEVfbXVsdGlfZHJhdyApCgkjZGVmaW5lIGdsX0RyYXdJRCBfZ2xfRHJhd0lECgl1bmlmb3JtIGludCBfZ2xfRHJhd0lEOwoJI2VuZGlmCgl1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBiYXRjaGluZ1RleHR1cmU7Cgl1bmlmb3JtIGhpZ2hwIHVzYW1wbGVyMkQgYmF0Y2hpbmdJZFRleHR1cmU7CgltYXQ0IGdldEJhdGNoaW5nTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nVGV4dHVyZSwgMCApLng7CgkJaW50IGogPSBpbnQoIGkgKSAqIDQ7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXZlYzQgdjEgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTsKCQl2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7CgkJdmVjNCB2NCA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTsKCQlyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTsKCX0KCWZsb2F0IGdldEluZGlyZWN0SW5kZXgoIGNvbnN0IGluIGludCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nSWRUZXh0dXJlLCAwICkueDsKCQlpbnQgeCA9IGkgJSBzaXplOwoJCWludCB5ID0gaSAvIHNpemU7CgkJcmV0dXJuIGZsb2F0KCB0ZXhlbEZldGNoKCBiYXRjaGluZ0lkVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApLnIgKTsKCX0KI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1IKCXVuaWZvcm0gc2FtcGxlcjJEIGJhdGNoaW5nQ29sb3JUZXh0dXJlOwoJdmVjMyBnZXRCYXRjaGluZ0NvbG9yKCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nQ29sb3JUZXh0dXJlLCAwICkueDsKCQlpbnQgaiA9IGludCggaSApOwoJCWludCB4ID0gaiAlIHNpemU7CgkJaW50IHkgPSBqIC8gc2l6ZTsKCQlyZXR1cm4gdGV4ZWxGZXRjaCggYmF0Y2hpbmdDb2xvclRleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKS5yZ2I7Cgl9CiNlbmRpZmAsYUM9YCNpZmRlZiBVU0VfQkFUQ0hJTkcKCW1hdDQgYmF0Y2hpbmdNYXRyaXggPSBnZXRCYXRjaGluZ01hdHJpeCggZ2V0SW5kaXJlY3RJbmRleCggZ2xfRHJhd0lEICkgKTsKI2VuZGlmYCxsQz1gdmVjMyB0cmFuc2Zvcm1lZCA9IHZlYzMoIHBvc2l0aW9uICk7CiNpZmRlZiBVU0VfQUxQSEFIQVNICgl2UG9zaXRpb24gPSB2ZWMzKCBwb3NpdGlvbiApOwojZW5kaWZgLGNDPWB2ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApOwojaWZkZWYgVVNFX1RBTkdFTlQKCXZlYzMgb2JqZWN0VGFuZ2VudCA9IHZlYzMoIHRhbmdlbnQueHl6ICk7CiNlbmRpZmAsdUM9YGZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7CglyZXR1cm4gMC4yNTsKfQpmbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTsKfQp2ZWMzIEJSREZfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7Cgl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJZmxvYXQgZG90VkggPSBzYXR1cmF0ZSggZG90KCB2aWV3RGlyLCBoYWxmRGlyICkgKTsKCXZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgMS4wLCBkb3RWSCApOwoJZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTsKCWZsb2F0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTsKCXJldHVybiBGICogKCBHICogRCApOwp9IC8vIHZhbGlkYXRlZGAsaEM9YCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCWNvbnN0IG1hdDMgWFlaX1RPX1JFQzcwOSA9IG1hdDMoCgkJIDMuMjQwNDU0MiwgLTAuOTY5MjY2MCwgIDAuMDU1NjQzNCwKCQktMS41MzcxMzg1LCAgMS44NzYwMTA4LCAtMC4yMDQwMjU5LAoJCS0wLjQ5ODUzMTQsICAwLjA0MTU1NjAsICAxLjA1NzIyNTIKCSk7Cgl2ZWMzIEZyZXNuZWwwVG9Jb3IoIHZlYzMgZnJlc25lbDAgKSB7CgkJdmVjMyBzcXJ0RjAgPSBzcXJ0KCBmcmVzbmVsMCApOwoJCXJldHVybiAoIHZlYzMoIDEuMCApICsgc3FydEYwICkgLyAoIHZlYzMoIDEuMCApIC0gc3FydEYwICk7Cgl9Cgl2ZWMzIElvclRvRnJlc25lbDAoIHZlYzMgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yICkgewoJCXJldHVybiBwb3cyKCAoIHRyYW5zbWl0dGVkSW9yIC0gdmVjMyggaW5jaWRlbnRJb3IgKSApIC8gKCB0cmFuc21pdHRlZElvciArIHZlYzMoIGluY2lkZW50SW9yICkgKSApOwoJfQoJZmxvYXQgSW9yVG9GcmVzbmVsMCggZmxvYXQgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yICkgewoJCXJldHVybiBwb3cyKCAoIHRyYW5zbWl0dGVkSW9yIC0gaW5jaWRlbnRJb3IgKSAvICggdHJhbnNtaXR0ZWRJb3IgKyBpbmNpZGVudElvciApKTsKCX0KCXZlYzMgZXZhbFNlbnNpdGl2aXR5KCBmbG9hdCBPUEQsIHZlYzMgc2hpZnQgKSB7CgkJZmxvYXQgcGhhc2UgPSAyLjAgKiBQSSAqIE9QRCAqIDEuMGUtOTsKCQl2ZWMzIHZhbCA9IHZlYzMoIDUuNDg1NmUtMTMsIDQuNDIwMWUtMTMsIDUuMjQ4MWUtMTMgKTsKCQl2ZWMzIHBvcyA9IHZlYzMoIDEuNjgxMGUrMDYsIDEuNzk1M2UrMDYsIDIuMjA4NGUrMDYgKTsKCQl2ZWMzIHZhciA9IHZlYzMoIDQuMzI3OGUrMDksIDkuMzA0NmUrMDksIDYuNjEyMWUrMDkgKTsKCQl2ZWMzIHh5eiA9IHZhbCAqIHNxcnQoIDIuMCAqIFBJICogdmFyICkgKiBjb3MoIHBvcyAqIHBoYXNlICsgc2hpZnQgKSAqIGV4cCggLSBwb3cyKCBwaGFzZSApICogdmFyICk7CgkJeHl6LnggKz0gOS43NDcwZS0xNCAqIHNxcnQoIDIuMCAqIFBJICogNC41MjgyZSswOSApICogY29zKCAyLjIzOTllKzA2ICogcGhhc2UgKyBzaGlmdFsgMCBdICkgKiBleHAoIC0gNC41MjgyZSswOSAqIHBvdzIoIHBoYXNlICkgKTsKCQl4eXogLz0gMS4wNjg1ZS03OwoJCXZlYzMgcmdiID0gWFlaX1RPX1JFQzcwOSAqIHh5ejsKCQlyZXR1cm4gcmdiOwoJfQoJdmVjMyBldmFsSXJpZGVzY2VuY2UoIGZsb2F0IG91dHNpZGVJT1IsIGZsb2F0IGV0YTIsIGZsb2F0IGNvc1RoZXRhMSwgZmxvYXQgdGhpbkZpbG1UaGlja25lc3MsIHZlYzMgYmFzZUYwICkgewoJCXZlYzMgSTsKCQlmbG9hdCBpcmlkZXNjZW5jZUlPUiA9IG1peCggb3V0c2lkZUlPUiwgZXRhMiwgc21vb3Roc3RlcCggMC4wLCAwLjAzLCB0aGluRmlsbVRoaWNrbmVzcyApICk7CgkJZmxvYXQgc2luVGhldGEyU3EgPSBwb3cyKCBvdXRzaWRlSU9SIC8gaXJpZGVzY2VuY2VJT1IgKSAqICggMS4wIC0gcG93MiggY29zVGhldGExICkgKTsKCQlmbG9hdCBjb3NUaGV0YTJTcSA9IDEuMCAtIHNpblRoZXRhMlNxOwoJCWlmICggY29zVGhldGEyU3EgPCAwLjAgKSB7CgkJCXJldHVybiB2ZWMzKCAxLjAgKTsKCQl9CgkJZmxvYXQgY29zVGhldGEyID0gc3FydCggY29zVGhldGEyU3EgKTsKCQlmbG9hdCBSMCA9IElvclRvRnJlc25lbDAoIGlyaWRlc2NlbmNlSU9SLCBvdXRzaWRlSU9SICk7CgkJZmxvYXQgUjEyID0gRl9TY2hsaWNrKCBSMCwgMS4wLCBjb3NUaGV0YTEgKTsKCQlmbG9hdCBUMTIxID0gMS4wIC0gUjEyOwoJCWZsb2F0IHBoaTEyID0gMC4wOwoJCWlmICggaXJpZGVzY2VuY2VJT1IgPCBvdXRzaWRlSU9SICkgcGhpMTIgPSBQSTsKCQlmbG9hdCBwaGkyMSA9IFBJIC0gcGhpMTI7CgkJdmVjMyBiYXNlSU9SID0gRnJlc25lbDBUb0lvciggY2xhbXAoIGJhc2VGMCwgMC4wLCAwLjk5OTkgKSApOwkJdmVjMyBSMSA9IElvclRvRnJlc25lbDAoIGJhc2VJT1IsIGlyaWRlc2NlbmNlSU9SICk7CgkJdmVjMyBSMjMgPSBGX1NjaGxpY2soIFIxLCAxLjAsIGNvc1RoZXRhMiApOwoJCXZlYzMgcGhpMjMgPSB2ZWMzKCAwLjAgKTsKCQlpZiAoIGJhc2VJT1JbIDAgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDAgXSA9IFBJOwoJCWlmICggYmFzZUlPUlsgMSBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMSBdID0gUEk7CgkJaWYgKCBiYXNlSU9SWyAyIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAyIF0gPSBQSTsKCQlmbG9hdCBPUEQgPSAyLjAgKiBpcmlkZXNjZW5jZUlPUiAqIHRoaW5GaWxtVGhpY2tuZXNzICogY29zVGhldGEyOwoJCXZlYzMgcGhpID0gdmVjMyggcGhpMjEgKSArIHBoaTIzOwoJCXZlYzMgUjEyMyA9IGNsYW1wKCBSMTIgKiBSMjMsIDFlLTUsIDAuOTk5OSApOwoJCXZlYzMgcjEyMyA9IHNxcnQoIFIxMjMgKTsKCQl2ZWMzIFJzID0gcG93MiggVDEyMSApICogUjIzIC8gKCB2ZWMzKCAxLjAgKSAtIFIxMjMgKTsKCQl2ZWMzIEMwID0gUjEyICsgUnM7CgkJSSA9IEMwOwoJCXZlYzMgQ20gPSBScyAtIFQxMjE7CgkJZm9yICggaW50IG0gPSAxOyBtIDw9IDI7ICsrIG0gKSB7CgkJCUNtICo9IHIxMjM7CgkJCXZlYzMgU20gPSAyLjAgKiBldmFsU2Vuc2l0aXZpdHkoIGZsb2F0KCBtICkgKiBPUEQsIGZsb2F0KCBtICkgKiBwaGkgKTsKCQkJSSArPSBDbSAqIFNtOwoJCX0KCQlyZXR1cm4gbWF4KCBJLCB2ZWMzKCAwLjAgKSApOwoJfQojZW5kaWZgLGZDPWAjaWZkZWYgVVNFX0JVTVBNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7Cgl1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTsKCXZlYzIgZEhkeHlfZndkKCkgewoJCXZlYzIgZFNUZHggPSBkRmR4KCB2QnVtcE1hcFV2ICk7CgkJdmVjMiBkU1RkeSA9IGRGZHkoIHZCdW1wTWFwVXYgKTsKCQlmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKS54OwoJCWZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdkJ1bXBNYXBVdiArIGRTVGR4ICkueCAtIEhsbDsKCQlmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKyBkU1RkeSApLnggLSBIbGw7CgkJcmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7Cgl9Cgl2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5LCBmbG9hdCBmYWNlRGlyZWN0aW9uICkgewoJCXZlYzMgdlNpZ21hWCA9IG5vcm1hbGl6ZSggZEZkeCggc3VyZl9wb3MueHl6ICkgKTsKCQl2ZWMzIHZTaWdtYVkgPSBub3JtYWxpemUoIGRGZHkoIHN1cmZfcG9zLnh5eiApICk7CgkJdmVjMyB2TiA9IHN1cmZfbm9ybTsKCQl2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7CgkJdmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApOwoJCWZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICkgKiBmYWNlRGlyZWN0aW9uOwoJCXZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApOwoJCXJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTsKCX0KI2VuZGlmYCxkQz1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2ZWM0IHBsYW5lOwoJI2lmZGVmIEFMUEhBX1RPX0NPVkVSQUdFCgkJZmxvYXQgZGlzdGFuY2VUb1BsYW5lLCBkaXN0YW5jZUdyYWRpZW50OwoJCWZsb2F0IGNsaXBPcGFjaXR5ID0gMS4wOwoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7CgkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJZGlzdGFuY2VUb1BsYW5lID0gLSBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApICsgcGxhbmUudzsKCQkJZGlzdGFuY2VHcmFkaWVudCA9IGZ3aWR0aCggZGlzdGFuY2VUb1BsYW5lICkgLyAyLjA7CgkJCWNsaXBPcGFjaXR5ICo9IHNtb290aHN0ZXAoIC0gZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VUb1BsYW5lICk7CgkJCWlmICggY2xpcE9wYWNpdHkgPT0gMC4wICkgZGlzY2FyZDsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCQkjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FUwoJCQlmbG9hdCB1bmlvbkNsaXBPcGFjaXR5ID0gMS4wOwoJCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJCWZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJCWRpc3RhbmNlVG9QbGFuZSA9IC0gZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSArIHBsYW5lLnc7CgkJCQlkaXN0YW5jZUdyYWRpZW50ID0gZndpZHRoKCBkaXN0YW5jZVRvUGxhbmUgKSAvIDIuMDsKCQkJCXVuaW9uQ2xpcE9wYWNpdHkgKj0gMS4wIC0gc21vb3Roc3RlcCggLSBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZVRvUGxhbmUgKTsKCQkJfQoJCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCQljbGlwT3BhY2l0eSAqPSAxLjAgLSB1bmlvbkNsaXBPcGFjaXR5OwoJCSNlbmRpZgoJCWRpZmZ1c2VDb2xvci5hICo9IGNsaXBPcGFjaXR5OwoJCWlmICggZGlmZnVzZUNvbG9yLmEgPT0gMC4wICkgZGlzY2FyZDsKCSNlbHNlCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQkJcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdOwoJCQlpZiAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCQkjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FUwoJCQlib29sIGNsaXBwZWQgPSB0cnVlOwoJCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJCWZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJCWNsaXBwZWQgPSAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDsKCQkJfQoJCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCQlpZiAoIGNsaXBwZWQgKSBkaXNjYXJkOwoJCSNlbmRpZgoJI2VuZGlmCiNlbmRpZmAscEM9YCNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMAoJdmFyeWluZyB2ZWMzIHZDbGlwUG9zaXRpb247Cgl1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTsKI2VuZGlmYCxtQz1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKI2VuZGlmYCxnQz1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2Q2xpcFBvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKI2VuZGlmYCx5Qz1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCglkaWZmdXNlQ29sb3IgKj0gdkNvbG9yOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKQoJZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7CiNlbmRpZmAsX0M9YCNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKQoJdmFyeWluZyB2ZWM0IHZDb2xvcjsKI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkKCXZhcnlpbmcgdmVjMyB2Q29sb3I7CiNlbmRpZmAseEM9YCNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKQoJdmFyeWluZyB2ZWM0IHZDb2xvcjsKI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0lOU1RBTkNJTkdfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfQkFUQ0hJTkdfQ09MT1IgKQoJdmFyeWluZyB2ZWMzIHZDb2xvcjsKI2VuZGlmYCx2Qz1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgl2Q29sb3IgPSB2ZWM0KCAxLjAgKTsKI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0lOU1RBTkNJTkdfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfQkFUQ0hJTkdfQ09MT1IgKQoJdkNvbG9yID0gdmVjMyggMS4wICk7CiNlbmRpZgojaWZkZWYgVVNFX0NPTE9SCgl2Q29sb3IgKj0gY29sb3I7CiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1IKCXZDb2xvci54eXogKj0gaW5zdGFuY2VDb2xvci54eXo7CiNlbmRpZgojaWZkZWYgVVNFX0JBVENISU5HX0NPTE9SCgl2ZWMzIGJhdGNoaW5nQ29sb3IgPSBnZXRCYXRjaGluZ0NvbG9yKCBnZXRJbmRpcmVjdEluZGV4KCBnbF9EcmF3SUQgKSApOwoJdkNvbG9yLnh5eiAqPSBiYXRjaGluZ0NvbG9yLnh5ejsKI2VuZGlmYCxTQz1gI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MwojZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NgojZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2CiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDcKI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1CiNkZWZpbmUgRVBTSUxPTiAxZS02CiNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgojZGVmaW5lIHdoaXRlQ29tcGxlbWVudCggYSApICggMS4wIC0gc2F0dXJhdGUoIGEgKSApCmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH0KdmVjMyBwb3cyKCBjb25zdCBpbiB2ZWMzIHggKSB7IHJldHVybiB4Kng7IH0KZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9CmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH0KZmxvYXQgbWF4MyggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9CmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgdiApIHsgcmV0dXJuIGRvdCggdiwgdmVjMyggMC4zMzMzMzMzICkgKTsgfQpoaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkgewoJY29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzOwoJaGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7CglyZXR1cm4gZnJhY3QoIHNpbiggc24gKSAqIGMgKTsKfQojaWZkZWYgSElHSF9QUkVDSVNJT04KCWZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9CiNlbHNlCglmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7CgkJZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTsKCQlyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7Cgl9CiNlbmRpZgpzdHJ1Y3QgSW5jaWRlbnRMaWdodCB7Cgl2ZWMzIGNvbG9yOwoJdmVjMyBkaXJlY3Rpb247Cglib29sIHZpc2libGU7Cn07CnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7Cgl2ZWMzIGRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGRpcmVjdFNwZWN1bGFyOwoJdmVjMyBpbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGluZGlyZWN0U3BlY3VsYXI7Cn07CiNpZmRlZiBVU0VfQUxQSEFIQVNICgl2YXJ5aW5nIHZlYzMgdlBvc2l0aW9uOwojZW5kaWYKdmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHsKCXJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApOwp9CnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7Cn0KbWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7CgltYXQzIHRtcDsKCXRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApOwoJdG1wWyAxIF0gPSB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7Cgl0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTsKCXJldHVybiB0bXA7Cn0KYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7CglyZXR1cm4gbVsgMiBdWyAzIF0gPT0gLSAxLjA7Cn0KdmVjMiBlcXVpcmVjdFV2KCBpbiB2ZWMzIGRpciApIHsKCWZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41OwoJZmxvYXQgdiA9IGFzaW4oIGNsYW1wKCBkaXIueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41OwoJcmV0dXJuIHZlYzIoIHUsIHYgKTsKfQp2ZWMzIEJSREZfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjsKfQp2ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKCWZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTsKCXJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7Cn0KZmxvYXQgRl9TY2hsaWNrKCBjb25zdCBpbiBmbG9hdCBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKCWZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTsKCXJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7Cn0gLy8gdmFsaWRhdGVkYCxNQz1gI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCSNkZWZpbmUgY3ViZVVWX21pbk1pcExldmVsIDQuMAoJI2RlZmluZSBjdWJlVVZfbWluVGlsZVNpemUgMTYuMAoJZmxvYXQgZ2V0RmFjZSggdmVjMyBkaXJlY3Rpb24gKSB7CgkJdmVjMyBhYnNEaXJlY3Rpb24gPSBhYnMoIGRpcmVjdGlvbiApOwoJCWZsb2F0IGZhY2UgPSAtIDEuMDsKCQlpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnogKSB7CgkJCWlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueSApCgkJCQlmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwLjAgOiAzLjA7CgkJCWVsc2UKCQkJCWZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDsKCQl9IGVsc2UgewoJCQlpZiAoIGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKQoJCQkJZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMi4wIDogNS4wOwoJCQllbHNlCgkJCQlmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7CgkJfQoJCXJldHVybiBmYWNlOwoJfQoJdmVjMiBnZXRVViggdmVjMyBkaXJlY3Rpb24sIGZsb2F0IGZhY2UgKSB7CgkJdmVjMiB1djsKCQlpZiAoIGZhY2UgPT0gMC4wICkgewoJCQl1diA9IHZlYzIoIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIC0gZGlyZWN0aW9uLnogKSAvIGFicyggZGlyZWN0aW9uLnkgKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7CgkJfSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7CgkJCXV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnogKSAvIGFicyggZGlyZWN0aW9uLnkgKTsKCQl9IGVsc2UgewoJCQl1diA9IHZlYzIoIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApOwoJCX0KCQlyZXR1cm4gMC41ICogKCB1diArIDEuMCApOwoJfQoJdmVjMyBiaWxpbmVhckN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBkaXJlY3Rpb24sIGZsb2F0IG1pcEludCApIHsKCQlmbG9hdCBmYWNlID0gZ2V0RmFjZSggZGlyZWN0aW9uICk7CgkJZmxvYXQgZmlsdGVySW50ID0gbWF4KCBjdWJlVVZfbWluTWlwTGV2ZWwgLSBtaXBJbnQsIDAuMCApOwoJCW1pcEludCA9IG1heCggbWlwSW50LCBjdWJlVVZfbWluTWlwTGV2ZWwgKTsKCQlmbG9hdCBmYWNlU2l6ZSA9IGV4cDIoIG1pcEludCApOwoJCWhpZ2hwIHZlYzIgdXYgPSBnZXRVViggZGlyZWN0aW9uLCBmYWNlICkgKiAoIGZhY2VTaXplIC0gMi4wICkgKyAxLjA7CgkJaWYgKCBmYWNlID4gMi4wICkgewoJCQl1di55ICs9IGZhY2VTaXplOwoJCQlmYWNlIC09IDMuMDsKCQl9CgkJdXYueCArPSBmYWNlICogZmFjZVNpemU7CgkJdXYueCArPSBmaWx0ZXJJbnQgKiAzLjAgKiBjdWJlVVZfbWluVGlsZVNpemU7CgkJdXYueSArPSA0LjAgKiAoIGV4cDIoIENVQkVVVl9NQVhfTUlQICkgLSBmYWNlU2l6ZSApOwoJCXV2LnggKj0gQ1VCRVVWX1RFWEVMX1dJRFRIOwoJCXV2LnkgKj0gQ1VCRVVWX1RFWEVMX0hFSUdIVDsKCQkjaWZkZWYgdGV4dHVyZTJER3JhZEVYVAoJCQlyZXR1cm4gdGV4dHVyZTJER3JhZEVYVCggZW52TWFwLCB1diwgdmVjMiggMC4wICksIHZlYzIoIDAuMCApICkucmdiOwoJCSNlbHNlCgkJCXJldHVybiB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKS5yZ2I7CgkJI2VuZGlmCgl9CgkjZGVmaW5lIGN1YmVVVl9yMCAxLjAKCSNkZWZpbmUgY3ViZVVWX20wIC0gMi4wCgkjZGVmaW5lIGN1YmVVVl9yMSAwLjgKCSNkZWZpbmUgY3ViZVVWX20xIC0gMS4wCgkjZGVmaW5lIGN1YmVVVl9yNCAwLjQKCSNkZWZpbmUgY3ViZVVWX200IDIuMAoJI2RlZmluZSBjdWJlVVZfcjUgMC4zMDUKCSNkZWZpbmUgY3ViZVVWX201IDMuMAoJI2RlZmluZSBjdWJlVVZfcjYgMC4yMQoJI2RlZmluZSBjdWJlVVZfbTYgNC4wCglmbG9hdCByb3VnaG5lc3NUb01pcCggZmxvYXQgcm91Z2huZXNzICkgewoJCWZsb2F0IG1pcCA9IDAuMDsKCQlpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjEgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3IwIC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tMSAtIGN1YmVVVl9tMCApIC8gKCBjdWJlVVZfcjAgLSBjdWJlVVZfcjEgKSArIGN1YmVVVl9tMDsKCQl9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I0ICkgewoJCQltaXAgPSAoIGN1YmVVVl9yMSAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTQgLSBjdWJlVVZfbTEgKSAvICggY3ViZVVWX3IxIC0gY3ViZVVWX3I0ICkgKyBjdWJlVVZfbTE7CgkJfSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNSApIHsKCQkJbWlwID0gKCBjdWJlVVZfcjQgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX201IC0gY3ViZVVWX200ICkgLyAoIGN1YmVVVl9yNCAtIGN1YmVVVl9yNSApICsgY3ViZVVWX200OwoJCX0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjYgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3I1IC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNiAtIGN1YmVVVl9tNSApIC8gKCBjdWJlVVZfcjUgLSBjdWJlVVZfcjYgKSArIGN1YmVVVl9tNTsKCQl9IGVsc2UgewoJCQltaXAgPSAtIDIuMCAqIGxvZzIoIDEuMTYgKiByb3VnaG5lc3MgKTsJCX0KCQlyZXR1cm4gbWlwOwoJfQoJdmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHNhbXBsZURpciwgZmxvYXQgcm91Z2huZXNzICkgewoJCWZsb2F0IG1pcCA9IGNsYW1wKCByb3VnaG5lc3NUb01pcCggcm91Z2huZXNzICksIGN1YmVVVl9tMCwgQ1VCRVVWX01BWF9NSVAgKTsKCQlmbG9hdCBtaXBGID0gZnJhY3QoIG1pcCApOwoJCWZsb2F0IG1pcEludCA9IGZsb29yKCBtaXAgKTsKCQl2ZWMzIGNvbG9yMCA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICk7CgkJaWYgKCBtaXBGID09IDAuMCApIHsKCQkJcmV0dXJuIHZlYzQoIGNvbG9yMCwgMS4wICk7CgkJfSBlbHNlIHsKCQkJdmVjMyBjb2xvcjEgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCArIDEuMCApOwoJCQlyZXR1cm4gdmVjNCggbWl4KCBjb2xvcjAsIGNvbG9yMSwgbWlwRiApLCAxLjAgKTsKCQl9Cgl9CiNlbmRpZmAsYkM9YHZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBvYmplY3ROb3JtYWw7CiNpZmRlZiBVU0VfVEFOR0VOVAoJdmVjMyB0cmFuc2Zvcm1lZFRhbmdlbnQgPSBvYmplY3RUYW5nZW50OwojZW5kaWYKI2lmZGVmIFVTRV9CQVRDSElORwoJbWF0MyBibSA9IG1hdDMoIGJhdGNoaW5nTWF0cml4ICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCAvPSB2ZWMzKCBkb3QoIGJtWyAwIF0sIGJtWyAwIF0gKSwgZG90KCBibVsgMSBdLCBibVsgMSBdICksIGRvdCggYm1bIDIgXSwgYm1bIDIgXSApICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCA9IGJtICogdHJhbnNmb3JtZWROb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl0cmFuc2Zvcm1lZFRhbmdlbnQgPSBibSAqIHRyYW5zZm9ybWVkVGFuZ2VudDsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9JTlNUQU5DSU5HCgltYXQzIGltID0gbWF0MyggaW5zdGFuY2VNYXRyaXggKTsKCXRyYW5zZm9ybWVkTm9ybWFsIC89IHZlYzMoIGRvdCggaW1bIDAgXSwgaW1bIDAgXSApLCBkb3QoIGltWyAxIF0sIGltWyAxIF0gKSwgZG90KCBpbVsgMiBdLCBpbVsgMiBdICkgKTsKCXRyYW5zZm9ybWVkTm9ybWFsID0gaW0gKiB0cmFuc2Zvcm1lZE5vcm1hbDsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCXRyYW5zZm9ybWVkVGFuZ2VudCA9IGltICogdHJhbnNmb3JtZWRUYW5nZW50OwoJI2VuZGlmCiNlbmRpZgp0cmFuc2Zvcm1lZE5vcm1hbCA9IG5vcm1hbE1hdHJpeCAqIHRyYW5zZm9ybWVkTm9ybWFsOwojaWZkZWYgRkxJUF9TSURFRAoJdHJhbnNmb3JtZWROb3JtYWwgPSAtIHRyYW5zZm9ybWVkTm9ybWFsOwojZW5kaWYKI2lmZGVmIFVTRV9UQU5HRU5UCgl0cmFuc2Zvcm1lZFRhbmdlbnQgPSAoIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkVGFuZ2VudCwgMC4wICkgKS54eXo7CgkjaWZkZWYgRkxJUF9TSURFRAoJCXRyYW5zZm9ybWVkVGFuZ2VudCA9IC0gdHJhbnNmb3JtZWRUYW5nZW50OwoJI2VuZGlmCiNlbmRpZmAsd0M9YCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7Cgl1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlOwoJdW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzOwojZW5kaWZgLEFDPWAjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJdHJhbnNmb3JtZWQgKz0gbm9ybWFsaXplKCBvYmplY3ROb3JtYWwgKSAqICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHZEaXNwbGFjZW1lbnRNYXBVdiApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTsKI2VuZGlmYCxFQz1gI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdmVjNCBlbWlzc2l2ZUNvbG9yID0gdGV4dHVyZTJEKCBlbWlzc2l2ZU1hcCwgdkVtaXNzaXZlTWFwVXYgKTsKCSNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRV9FTUlTU0lWRQoJCWVtaXNzaXZlQ29sb3IgPSBzUkdCVHJhbnNmZXJFT1RGKCBlbWlzc2l2ZUNvbG9yICk7CgkjZW5kaWYKCXRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjsKI2VuZGlmYCxUQz1gI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7CiNlbmRpZmAsQ0M9ImdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsUkM9YHZlYzQgTGluZWFyVHJhbnNmZXJPRVRGKCBpbiB2ZWM0IHZhbHVlICkgewoJcmV0dXJuIHZhbHVlOwp9CnZlYzQgc1JHQlRyYW5zZmVyRU9URiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTsKfQp2ZWM0IHNSR0JUcmFuc2Zlck9FVEYoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7Cn1gLFBDPWAjaWZkZWYgVVNFX0VOVk1BUAoJI2lmZGVmIEVOVl9XT1JMRFBPUwoJCXZlYzMgY2FtZXJhVG9GcmFnOwoJCWlmICggaXNPcnRob2dyYXBoaWMgKSB7CgkJCWNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7CgkJfSBlbHNlIHsKCQkJY2FtZXJhVG9GcmFnID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7CgkJfQoJCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCQkjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTgoJCQl2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsICk7CgkJI2Vsc2UKCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7CgkJI2VuZGlmCgkjZWxzZQoJCXZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0OwoJI2VuZGlmCgkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJCXZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBlbnZNYXBSb3RhdGlvbiAqIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApOwoJI2Vsc2UKCQl2ZWM0IGVudkNvbG9yID0gdmVjNCggMC4wICk7CgkjZW5kaWYKCSNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkKCQlvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7CgkjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfTUlYICkKCQlvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKQoJCW91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTsKCSNlbmRpZgojZW5kaWZgLElDPWAjaWZkZWYgVVNFX0VOVk1BUAoJdW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7Cgl1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7Cgl1bmlmb3JtIG1hdDMgZW52TWFwUm90YXRpb247CgkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJCXVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwOwoJI2Vsc2UKCQl1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7CgkjZW5kaWYKCQojZW5kaWZgLExDPWAjaWZkZWYgVVNFX0VOVk1BUAoJdW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7CgkjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBMQU1CRVJUICkKCQkjZGVmaW5lIEVOVl9XT1JMRFBPUwoJI2VuZGlmCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwoJCXVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvOwoJI2Vsc2UKCQl2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7CgkjZW5kaWYKI2VuZGlmYCxEQz1gI2lmZGVmIFVTRV9FTlZNQVAKCSNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKQoJCSNkZWZpbmUgRU5WX1dPUkxEUE9TCgkjZW5kaWYKCSNpZmRlZiBFTlZfV09STERQT1MKCQkKCQl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CgkjZWxzZQoJCXZhcnlpbmcgdmVjMyB2UmVmbGVjdDsKCQl1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbzsKCSNlbmRpZgojZW5kaWZgLFVDPWAjaWZkZWYgVVNFX0VOVk1BUAoJI2lmZGVmIEVOVl9XT1JMRFBPUwoJCXZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7CgkjZWxzZQoJCXZlYzMgY2FtZXJhVG9WZXJ0ZXg7CgkJaWYgKCBpc09ydGhvZ3JhcGhpYyApIHsKCQkJY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApOwoJCX0gZWxzZSB7CgkJCWNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7CgkJfQoJCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApOwoJCSNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OCgkJCXZSZWZsZWN0ID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7CgkJI2Vsc2UKCQkJdlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApOwoJCSNlbmRpZgoJI2VuZGlmCiNlbmRpZmAsTkM9YCNpZmRlZiBVU0VfRk9HCgl2Rm9nRGVwdGggPSAtIG12UG9zaXRpb24uejsKI2VuZGlmYCxGQz1gI2lmZGVmIFVTRV9GT0cKCXZhcnlpbmcgZmxvYXQgdkZvZ0RlcHRoOwojZW5kaWZgLEJDPWAjaWZkZWYgVVNFX0ZPRwoJI2lmZGVmIEZPR19FWFAyCgkJZmxvYXQgZm9nRmFjdG9yID0gMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogdkZvZ0RlcHRoICogdkZvZ0RlcHRoICk7CgkjZWxzZQoJCWZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgdkZvZ0RlcHRoICk7CgkjZW5kaWYKCWdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTsKI2VuZGlmYCxPQz1gI2lmZGVmIFVTRV9GT0cKCXVuaWZvcm0gdmVjMyBmb2dDb2xvcjsKCXZhcnlpbmcgZmxvYXQgdkZvZ0RlcHRoOwoJI2lmZGVmIEZPR19FWFAyCgkJdW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OwoJI2Vsc2UKCQl1bmlmb3JtIGZsb2F0IGZvZ05lYXI7CgkJdW5pZm9ybSBmbG9hdCBmb2dGYXI7CgkjZW5kaWYKI2VuZGlmYCx6Qz1gI2lmZGVmIFVTRV9HUkFESUVOVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7CiNlbmRpZgp2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7CglmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApOwoJdmVjMiBjb29yZCA9IHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTsKCSNpZmRlZiBVU0VfR1JBRElFTlRNQVAKCQlyZXR1cm4gdmVjMyggdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yICk7CgkjZWxzZQoJCXZlYzIgZncgPSBmd2lkdGgoIGNvb3JkICkgKiAwLjU7CgkJcmV0dXJuIG1peCggdmVjMyggMC43ICksIHZlYzMoIDEuMCApLCBzbW9vdGhzdGVwKCAwLjcgLSBmdy54LCAwLjcgKyBmdy54LCBjb29yZC54ICkgKTsKCSNlbmRpZgp9YCxrQz1gI2lmZGVmIFVTRV9MSUdIVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7Cgl1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5OwojZW5kaWZgLFZDPWBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWw7Cm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7Cm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO2AsR0M9YHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgTGFtYmVydE1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDsKfTsKdm9pZCBSRV9EaXJlY3RfTGFtYmVydCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X0xhbWJlcnQKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0YCxIQz1gdW5pZm9ybSBib29sIHJlY2VpdmVTaGFkb3c7CnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjsKI2lmIGRlZmluZWQoIFVTRV9MSUdIVF9QUk9CRVMgKQoJdW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTsKI2VuZGlmCnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7CglmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56OwoJdmVjMyByZXN1bHQgPSBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6OwoJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7CglyZXR1cm4gcmVzdWx0Owp9CnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApOwoJcmV0dXJuIGlycmFkaWFuY2U7Cn0KdmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkgewoJdmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7CglyZXR1cm4gaXJyYWRpYW5jZTsKfQpmbG9hdCBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHsKCWZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTsKCWlmICggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgKSB7CgkJZGlzdGFuY2VGYWxsb2ZmICo9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7Cgl9CglyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmOwp9CmZsb2F0IGdldFNwb3RBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgY29uZUNvc2luZSwgY29uc3QgaW4gZmxvYXQgcGVudW1icmFDb3NpbmUsIGNvbnN0IGluIGZsb2F0IGFuZ2xlQ29zaW5lICkgewoJcmV0dXJuIHNtb290aHN0ZXAoIGNvbmVDb3NpbmUsIHBlbnVtYnJhQ29zaW5lLCBhbmdsZUNvc2luZSApOwp9CiNpZiBOVU1fRElSX0xJR0hUUyA+IDAKCXN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHsKCQl2ZWMzIGRpcmVjdGlvbjsKCQl2ZWMzIGNvbG9yOwoJfTsKCXVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTsKCXZvaWQgZ2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7CgkJbGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yOwoJCWxpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uOwoJCWxpZ2h0LnZpc2libGUgPSB0cnVlOwoJfQojZW5kaWYKI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwCglzdHJ1Y3QgUG9pbnRMaWdodCB7CgkJdmVjMyBwb3NpdGlvbjsKCQl2ZWMzIGNvbG9yOwoJCWZsb2F0IGRpc3RhbmNlOwoJCWZsb2F0IGRlY2F5OwoJfTsKCXVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdOwoJdm9pZCBnZXRQb2ludExpZ2h0SW5mbyggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkgewoJCXZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeVBvc2l0aW9uOwoJCWxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApOwoJCWZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTsKCQlsaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7CgkJbGlnaHQuY29sb3IgKj0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApOwoJCWxpZ2h0LnZpc2libGUgPSAoIGxpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7Cgl9CiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRTID4gMAoJc3RydWN0IFNwb3RMaWdodCB7CgkJdmVjMyBwb3NpdGlvbjsKCQl2ZWMzIGRpcmVjdGlvbjsKCQl2ZWMzIGNvbG9yOwoJCWZsb2F0IGRpc3RhbmNlOwoJCWZsb2F0IGRlY2F5OwoJCWZsb2F0IGNvbmVDb3M7CgkJZmxvYXQgcGVudW1icmFDb3M7Cgl9OwoJdW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07Cgl2b2lkIGdldFNwb3RMaWdodEluZm8oIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7CgkJdmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnlQb3NpdGlvbjsKCQlsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTsKCQlmbG9hdCBhbmdsZUNvcyA9IGRvdCggbGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7CgkJZmxvYXQgc3BvdEF0dGVudWF0aW9uID0gZ2V0U3BvdEF0dGVudWF0aW9uKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApOwoJCWlmICggc3BvdEF0dGVudWF0aW9uID4gMC4wICkgewoJCQlmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7CgkJCWxpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yICogc3BvdEF0dGVudWF0aW9uOwoJCQlsaWdodC5jb2xvciAqPSBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApOwoJCQlsaWdodC52aXNpYmxlID0gKCBsaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApOwoJCX0gZWxzZSB7CgkJCWxpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7CgkJCWxpZ2h0LnZpc2libGUgPSBmYWxzZTsKCQl9Cgl9CiNlbmRpZgojaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwCglzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7CgkJdmVjMyBjb2xvcjsKCQl2ZWMzIHBvc2l0aW9uOwoJCXZlYzMgaGFsZldpZHRoOwoJCXZlYzMgaGFsZkhlaWdodDsKCX07Cgl1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTsJdW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7Cgl1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07CiNlbmRpZgojaWYgTlVNX0hFTUlfTElHSFRTID4gMAoJc3RydWN0IEhlbWlzcGhlcmVMaWdodCB7CgkJdmVjMyBkaXJlY3Rpb247CgkJdmVjMyBza3lDb2xvcjsKCQl2ZWMzIGdyb3VuZENvbG9yOwoJfTsKCXVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdOwoJdmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCQlmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7CgkJZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTsKCQl2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApOwoJCXJldHVybiBpcnJhZGlhbmNlOwoJfQojZW5kaWZgLFdDPWAjaWZkZWYgVVNFX0VOVk1BUAoJdmVjMyBnZXRJQkxJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCQkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVgoJCQl2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJCXZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIGVudk1hcFJvdGF0aW9uICogd29ybGROb3JtYWwsIDEuMCApOwoJCQlyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7CgkJI2Vsc2UKCQkJcmV0dXJuIHZlYzMoIDAuMCApOwoJCSNlbmRpZgoJfQoJdmVjMyBnZXRJQkxSYWRpYW5jZSggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCXZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC0gdmlld0Rpciwgbm9ybWFsICk7CgkJCXJlZmxlY3RWZWMgPSBub3JtYWxpemUoIG1peCggcmVmbGVjdFZlYywgbm9ybWFsLCByb3VnaG5lc3MgKiByb3VnaG5lc3MpICk7CgkJCXJlZmxlY3RWZWMgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7CgkJCXZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIGVudk1hcFJvdGF0aW9uICogcmVmbGVjdFZlYywgcm91Z2huZXNzICk7CgkJCXJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7CgkJI2Vsc2UKCQkJcmV0dXJuIHZlYzMoIDAuMCApOwoJCSNlbmRpZgoJfQoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJdmVjMyBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBiaXRhbmdlbnQsIGNvbnN0IGluIGZsb2F0IGFuaXNvdHJvcHkgKSB7CgkJCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCQl2ZWMzIGJlbnROb3JtYWwgPSBjcm9zcyggYml0YW5nZW50LCB2aWV3RGlyICk7CgkJCQliZW50Tm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggYmVudE5vcm1hbCwgYml0YW5nZW50ICkgKTsKCQkJCWJlbnROb3JtYWwgPSBub3JtYWxpemUoIG1peCggYmVudE5vcm1hbCwgbm9ybWFsLCBwb3cyKCBwb3cyKCAxLjAgLSBhbmlzb3Ryb3B5ICogKCAxLjAgLSByb3VnaG5lc3MgKSApICkgKSApOwoJCQkJcmV0dXJuIGdldElCTFJhZGlhbmNlKCB2aWV3RGlyLCBiZW50Tm9ybWFsLCByb3VnaG5lc3MgKTsKCQkJI2Vsc2UKCQkJCXJldHVybiB2ZWMzKCAwLjAgKTsKCQkJI2VuZGlmCgkJfQoJI2VuZGlmCiNlbmRpZmAsJEM9YFRvb25NYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtgLFhDPWB2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKc3RydWN0IFRvb25NYXRlcmlhbCB7Cgl2ZWMzIGRpZmZ1c2VDb2xvcjsKfTsKdm9pZCBSRV9EaXJlY3RfVG9vbiggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfVG9vbgojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX1Rvb25gLHFDPWBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7Cm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7Cm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjsKbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7Cm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO2AsWUM9YHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJdmVjMyBzcGVjdWxhckNvbG9yOwoJZmxvYXQgc3BlY3VsYXJTaGluaW5lc3M7CglmbG9hdCBzcGVjdWxhclN0cmVuZ3RoOwp9Owp2b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X0JsaW5uUGhvbmcKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nYCxaQz1gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7CnZlYzMgZHh5ID0gbWF4KCBhYnMoIGRGZHgoIG5vblBlcnR1cmJlZE5vcm1hbCApICksIGFicyggZEZkeSggbm9uUGVydHVyYmVkTm9ybWFsICkgKSApOwpmbG9hdCBnZW9tZXRyeVJvdWdobmVzcyA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTsKbWF0ZXJpYWwucm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzczsKbWF0ZXJpYWwucm91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5yb3VnaG5lc3MsIDEuMCApOwojaWZkZWYgSU9SCgltYXRlcmlhbC5pb3IgPSBpb3I7CgkjaWZkZWYgVVNFX1NQRUNVTEFSCgkJZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSBzcGVjdWxhckludGVuc2l0eTsKCQl2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSBzcGVjdWxhckNvbG9yOwoJCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQkJc3BlY3VsYXJDb2xvckZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFyQ29sb3JNYXAsIHZTcGVjdWxhckNvbG9yTWFwVXYgKS5yZ2I7CgkJI2VuZGlmCgkJI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCQkJc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckludGVuc2l0eU1hcCwgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgKS5hOwoJCSNlbmRpZgoJCW1hdGVyaWFsLnNwZWN1bGFyRjkwID0gbWl4KCBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgMS4wLCBtZXRhbG5lc3NGYWN0b3IgKTsKCSNlbHNlCgkJZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSAxLjA7CgkJdmVjMyBzcGVjdWxhckNvbG9yRmFjdG9yID0gdmVjMyggMS4wICk7CgkJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7CgkjZW5kaWYKCW1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIG1pbiggcG93MiggKCBtYXRlcmlhbC5pb3IgLSAxLjAgKSAvICggbWF0ZXJpYWwuaW9yICsgMS4wICkgKSAqIHNwZWN1bGFyQ29sb3JGYWN0b3IsIHZlYzMoIDEuMCApICkgKiBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7CiNlbHNlCgltYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCAwLjA0ICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApOwoJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJbWF0ZXJpYWwuY2xlYXJjb2F0ID0gY2xlYXJjb2F0OwoJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gY2xlYXJjb2F0Um91Z2huZXNzOwoJbWF0ZXJpYWwuY2xlYXJjb2F0RjAgPSB2ZWMzKCAwLjA0ICk7CgltYXRlcmlhbC5jbGVhcmNvYXRGOTAgPSAxLjA7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJCW1hdGVyaWFsLmNsZWFyY29hdCAqPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE1hcCwgdkNsZWFyY29hdE1hcFV2ICkueDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgkJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgKS55OwoJI2VuZGlmCgltYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuY2xlYXJjb2F0ICk7CW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1heCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA1MjUgKTsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzczsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUEVSU0lPTgoJbWF0ZXJpYWwuZGlzcGVyc2lvbiA9IGRpc3BlcnNpb247CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFCgltYXRlcmlhbC5pcmlkZXNjZW5jZSA9IGlyaWRlc2NlbmNlOwoJbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IgPSBpcmlkZXNjZW5jZUlPUjsKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCQltYXRlcmlhbC5pcmlkZXNjZW5jZSAqPSB0ZXh0dXJlMkQoIGlyaWRlc2NlbmNlTWFwLCB2SXJpZGVzY2VuY2VNYXBVdiApLnI7CgkjZW5kaWYKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPSAoaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtIC0gaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtKSAqIHRleHR1cmUyRCggaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2ICkuZyArIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTsKCSNlbHNlCgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPSBpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW07CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU4KCW1hdGVyaWFsLnNoZWVuQ29sb3IgPSBzaGVlbkNvbG9yOwoJI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJCW1hdGVyaWFsLnNoZWVuQ29sb3IgKj0gdGV4dHVyZTJEKCBzaGVlbkNvbG9yTWFwLCB2U2hlZW5Db2xvck1hcFV2ICkucmdiOwoJI2VuZGlmCgltYXRlcmlhbC5zaGVlblJvdWdobmVzcyA9IGNsYW1wKCBzaGVlblJvdWdobmVzcywgMC4wNywgMS4wICk7CgkjaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJCW1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICo9IHRleHR1cmUyRCggc2hlZW5Sb3VnaG5lc3NNYXAsIHZTaGVlblJvdWdobmVzc01hcFV2ICkuYTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9BTklTT1RST1BZCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCQltYXQyIGFuaXNvdHJvcHlNYXQgPSBtYXQyKCBhbmlzb3Ryb3B5VmVjdG9yLngsIGFuaXNvdHJvcHlWZWN0b3IueSwgLSBhbmlzb3Ryb3B5VmVjdG9yLnksIGFuaXNvdHJvcHlWZWN0b3IueCApOwoJCXZlYzMgYW5pc290cm9weVBvbGFyID0gdGV4dHVyZTJEKCBhbmlzb3Ryb3B5TWFwLCB2QW5pc290cm9weU1hcFV2ICkucmdiOwoJCXZlYzIgYW5pc290cm9weVYgPSBhbmlzb3Ryb3B5TWF0ICogbm9ybWFsaXplKCAyLjAgKiBhbmlzb3Ryb3B5UG9sYXIucmcgLSB2ZWMyKCAxLjAgKSApICogYW5pc290cm9weVBvbGFyLmI7CgkjZWxzZQoJCXZlYzIgYW5pc290cm9weVYgPSBhbmlzb3Ryb3B5VmVjdG9yOwoJI2VuZGlmCgltYXRlcmlhbC5hbmlzb3Ryb3B5ID0gbGVuZ3RoKCBhbmlzb3Ryb3B5ViApOwoJaWYoIG1hdGVyaWFsLmFuaXNvdHJvcHkgPT0gMC4wICkgewoJCWFuaXNvdHJvcHlWID0gdmVjMiggMS4wLCAwLjAgKTsKCX0gZWxzZSB7CgkJYW5pc290cm9weVYgLz0gbWF0ZXJpYWwuYW5pc290cm9weTsKCQltYXRlcmlhbC5hbmlzb3Ryb3B5ID0gc2F0dXJhdGUoIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTsKCX0KCW1hdGVyaWFsLmFscGhhVCA9IG1peCggcG93MiggbWF0ZXJpYWwucm91Z2huZXNzICksIDEuMCwgcG93MiggbWF0ZXJpYWwuYW5pc290cm9weSApICk7CgltYXRlcmlhbC5hbmlzb3Ryb3B5VCA9IHRiblsgMCBdICogYW5pc290cm9weVYueCArIHRiblsgMSBdICogYW5pc290cm9weVYueTsKCW1hdGVyaWFsLmFuaXNvdHJvcHlCID0gdGJuWyAxIF0gKiBhbmlzb3Ryb3B5Vi54IC0gdGJuWyAwIF0gKiBhbmlzb3Ryb3B5Vi55OwojZW5kaWZgLEpDPWBzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7Cgl2ZWMzIGRpZmZ1c2VDb2xvcjsKCWZsb2F0IHJvdWdobmVzczsKCXZlYzMgc3BlY3VsYXJDb2xvcjsKCWZsb2F0IHNwZWN1bGFyRjkwOwoJZmxvYXQgZGlzcGVyc2lvbjsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJZmxvYXQgY2xlYXJjb2F0OwoJCWZsb2F0IGNsZWFyY29hdFJvdWdobmVzczsKCQl2ZWMzIGNsZWFyY29hdEYwOwoJCWZsb2F0IGNsZWFyY29hdEY5MDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCWZsb2F0IGlyaWRlc2NlbmNlOwoJCWZsb2F0IGlyaWRlc2NlbmNlSU9SOwoJCWZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzOwoJCXZlYzMgaXJpZGVzY2VuY2VGcmVzbmVsOwoJCXZlYzMgaXJpZGVzY2VuY2VGMDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9TSEVFTgoJCXZlYzMgc2hlZW5Db2xvcjsKCQlmbG9hdCBzaGVlblJvdWdobmVzczsKCSNlbmRpZgoJI2lmZGVmIElPUgoJCWZsb2F0IGlvcjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT04KCQlmbG9hdCB0cmFuc21pc3Npb247CgkJZmxvYXQgdHJhbnNtaXNzaW9uQWxwaGE7CgkJZmxvYXQgdGhpY2tuZXNzOwoJCWZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2U7CgkJdmVjMyBhdHRlbnVhdGlvbkNvbG9yOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQlmbG9hdCBhbmlzb3Ryb3B5OwoJCWZsb2F0IGFscGhhVDsKCQl2ZWMzIGFuaXNvdHJvcHlUOwoJCXZlYzMgYW5pc290cm9weUI7CgkjZW5kaWYKfTsKdmVjMyBjbGVhcmNvYXRTcGVjdWxhckRpcmVjdCA9IHZlYzMoIDAuMCApOwp2ZWMzIGNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgPSB2ZWMzKCAwLjAgKTsKdmVjMyBzaGVlblNwZWN1bGFyRGlyZWN0ID0gdmVjMyggMC4wICk7CnZlYzMgc2hlZW5TcGVjdWxhckluZGlyZWN0ID0gdmVjMygwLjAgKTsKdmVjMyBTY2hsaWNrX3RvX0YwKCBjb25zdCBpbiB2ZWMzIGYsIGNvbnN0IGluIGZsb2F0IGY5MCwgY29uc3QgaW4gZmxvYXQgZG90VkggKSB7CiAgICBmbG9hdCB4ID0gY2xhbXAoIDEuMCAtIGRvdFZILCAwLjAsIDEuMCApOwogICAgZmxvYXQgeDIgPSB4ICogeDsKICAgIGZsb2F0IHg1ID0gY2xhbXAoIHggKiB4MiAqIHgyLCAwLjAsIDAuOTk5OSApOwogICAgcmV0dXJuICggZiAtIHZlYzMoIGY5MCApICogeDUgKSAvICggMS4wIC0geDUgKTsKfQpmbG9hdCBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7CglmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7CglmbG9hdCBndiA9IGRvdE5MICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7CglmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7CglyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7Cn0KZmxvYXQgRF9HR1goIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHsKCWZsb2F0IGEyID0gcG93MiggYWxwaGEgKTsKCWZsb2F0IGRlbm9tID0gcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDsKCXJldHVybiBSRUNJUFJPQ0FMX1BJICogYTIgLyBwb3cyKCBkZW5vbSApOwp9CiNpZmRlZiBVU0VfQU5JU09UUk9QWQoJZmxvYXQgVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljKCBjb25zdCBpbiBmbG9hdCBhbHBoYVQsIGNvbnN0IGluIGZsb2F0IGFscGhhQiwgY29uc3QgaW4gZmxvYXQgZG90VFYsIGNvbnN0IGluIGZsb2F0IGRvdEJWLCBjb25zdCBpbiBmbG9hdCBkb3RUTCwgY29uc3QgaW4gZmxvYXQgZG90QkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHsKCQlmbG9hdCBndiA9IGRvdE5MICogbGVuZ3RoKCB2ZWMzKCBhbHBoYVQgKiBkb3RUViwgYWxwaGFCICogZG90QlYsIGRvdE5WICkgKTsKCQlmbG9hdCBnbCA9IGRvdE5WICogbGVuZ3RoKCB2ZWMzKCBhbHBoYVQgKiBkb3RUTCwgYWxwaGFCICogZG90QkwsIGRvdE5MICkgKTsKCQlmbG9hdCB2ID0gMC41IC8gKCBndiArIGdsICk7CgkJcmV0dXJuIHNhdHVyYXRlKHYpOwoJfQoJZmxvYXQgRF9HR1hfQW5pc290cm9waWMoIGNvbnN0IGluIGZsb2F0IGFscGhhVCwgY29uc3QgaW4gZmxvYXQgYWxwaGFCLCBjb25zdCBpbiBmbG9hdCBkb3ROSCwgY29uc3QgaW4gZmxvYXQgZG90VEgsIGNvbnN0IGluIGZsb2F0IGRvdEJIICkgewoJCWZsb2F0IGEyID0gYWxwaGFUICogYWxwaGFCOwoJCWhpZ2hwIHZlYzMgdiA9IHZlYzMoIGFscGhhQiAqIGRvdFRILCBhbHBoYVQgKiBkb3RCSCwgYTIgKiBkb3ROSCApOwoJCWhpZ2hwIGZsb2F0IHYyID0gZG90KCB2LCB2ICk7CgkJZmxvYXQgdzIgPSBhMiAvIHYyOwoJCXJldHVybiBSRUNJUFJPQ0FMX1BJICogYTIgKiBwb3cyICggdzIgKTsKCX0KI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUCgl2ZWMzIEJSREZfR0dYX0NsZWFyY29hdCggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCkgewoJCXZlYzMgZjAgPSBtYXRlcmlhbC5jbGVhcmNvYXRGMDsKCQlmbG9hdCBmOTAgPSBtYXRlcmlhbC5jbGVhcmNvYXRGOTA7CgkJZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzOwoJCWZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7CgkJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCQlmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgbGlnaHREaXIgKSApOwoJCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCQlmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7CgkJZmxvYXQgZG90VkggPSBzYXR1cmF0ZSggZG90KCB2aWV3RGlyLCBoYWxmRGlyICkgKTsKCQl2ZWMzIEYgPSBGX1NjaGxpY2soIGYwLCBmOTAsIGRvdFZIICk7CgkJZmxvYXQgViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApOwoJCWZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7CgkJcmV0dXJuIEYgKiAoIFYgKiBEICk7Cgl9CiNlbmRpZgp2ZWMzIEJSREZfR0dYKCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsICkgewoJdmVjMyBmMCA9IG1hdGVyaWFsLnNwZWN1bGFyQ29sb3I7CglmbG9hdCBmOTAgPSBtYXRlcmlhbC5zcGVjdWxhckY5MDsKCWZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnJvdWdobmVzczsKCWZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7Cgl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCWZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7Cgl2ZWMzIEYgPSBGX1NjaGxpY2soIGYwLCBmOTAsIGRvdFZIICk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJRiA9IG1peCggRiwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCBtYXRlcmlhbC5pcmlkZXNjZW5jZSApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQlmbG9hdCBkb3RUTCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weVQsIGxpZ2h0RGlyICk7CgkJZmxvYXQgZG90VFYgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlULCB2aWV3RGlyICk7CgkJZmxvYXQgZG90VEggPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlULCBoYWxmRGlyICk7CgkJZmxvYXQgZG90QkwgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCBsaWdodERpciApOwoJCWZsb2F0IGRvdEJWID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5Qiwgdmlld0RpciApOwoJCWZsb2F0IGRvdEJIID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5QiwgaGFsZkRpciApOwoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWRfQW5pc290cm9waWMoIG1hdGVyaWFsLmFscGhhVCwgYWxwaGEsIGRvdFRWLCBkb3RCViwgZG90VEwsIGRvdEJMLCBkb3ROViwgZG90TkwgKTsKCQlmbG9hdCBEID0gRF9HR1hfQW5pc290cm9waWMoIG1hdGVyaWFsLmFscGhhVCwgYWxwaGEsIGRvdE5ILCBkb3RUSCwgZG90QkggKTsKCSNlbHNlCgkJZmxvYXQgViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApOwoJCWZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7CgkjZW5kaWYKCXJldHVybiBGICogKCBWICogRCApOwp9CnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJY29uc3QgZmxvYXQgTFVUX1NJWkUgPSA2NC4wOwoJY29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7Cgljb25zdCBmbG9hdCBMVVRfQklBUyA9IDAuNSAvIExVVF9TSVpFOwoJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTsKCXZlYzIgdXYgPSB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTsKCXV2ID0gdXYgKiBMVVRfU0NBTEUgKyBMVVRfQklBUzsKCXJldHVybiB1djsKfQpmbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHsKCWZsb2F0IGwgPSBsZW5ndGgoIGYgKTsKCXJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTsKfQp2ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHsKCWZsb2F0IHggPSBkb3QoIHYxLCB2MiApOwoJZmxvYXQgeSA9IGFicyggeCApOwoJZmxvYXQgYSA9IDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTsKCWZsb2F0IGIgPSAzLjQxNzU5NDAgKyAoIDQuMTYxNjcyNCArIHkgKSAqIHk7CglmbG9hdCB2ID0gYSAvIGI7CglmbG9hdCB0aGV0YV9zaW50aGV0YSA9ICggeCA+IDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7CglyZXR1cm4gY3Jvc3MoIHYxLCB2MiApICogdGhldGFfc2ludGhldGE7Cn0KdmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7Cgl2ZWMzIHYxID0gcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdOwoJdmVjMyB2MiA9IHJlY3RDb29yZHNbIDMgXSAtIHJlY3RDb29yZHNbIDAgXTsKCXZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7CglpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIDwgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApOwoJdmVjMyBUMSwgVDI7CglUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApOwoJVDIgPSAtIGNyb3NzKCBOLCBUMSApOwoJbWF0MyBtYXQgPSBtSW52ICogdHJhbnNwb3NlTWF0MyggbWF0MyggVDEsIFQyLCBOICkgKTsKCXZlYzMgY29vcmRzWyA0IF07Cgljb29yZHNbIDAgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApOwoJY29vcmRzWyAxIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDEgXSAtIFAgKTsKCWNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7Cgljb29yZHNbIDMgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApOwoJY29vcmRzWyAwIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMCBdICk7Cgljb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTsKCWNvb3Jkc1sgMiBdID0gbm9ybWFsaXplKCBjb29yZHNbIDIgXSApOwoJY29vcmRzWyAzIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMyBdICk7Cgl2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTsKCXZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTsKCXZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDEgXSwgY29vcmRzWyAyIF0gKTsKCXZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTsKCXZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTsKCWZsb2F0IHJlc3VsdCA9IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggdmVjdG9yRm9ybUZhY3RvciApOwoJcmV0dXJuIHZlYzMoIHJlc3VsdCApOwp9CiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKQpmbG9hdCBEX0NoYXJsaWUoIGZsb2F0IHJvdWdobmVzcywgZmxvYXQgZG90TkggKSB7CglmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJZmxvYXQgaW52QWxwaGEgPSAxLjAgLyBhbHBoYTsKCWZsb2F0IGNvczJoID0gZG90TkggKiBkb3ROSDsKCWZsb2F0IHNpbjJoID0gbWF4KCAxLjAgLSBjb3MyaCwgMC4wMDc4MTI1ICk7CglyZXR1cm4gKCAyLjAgKyBpbnZBbHBoYSApICogcG93KCBzaW4yaCwgaW52QWxwaGEgKiAwLjUgKSAvICggMi4wICogUEkgKTsKfQpmbG9hdCBWX05ldWJlbHQoIGZsb2F0IGRvdE5WLCBmbG9hdCBkb3ROTCApIHsKCXJldHVybiBzYXR1cmF0ZSggMS4wIC8gKCA0LjAgKiAoIGRvdE5MICsgZG90TlYgLSBkb3ROTCAqIGRvdE5WICkgKSApOwp9CnZlYzMgQlJERl9TaGVlbiggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgdmVjMyBzaGVlbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGVlblJvdWdobmVzcyApIHsKCXZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7CglmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgbGlnaHREaXIgKSApOwoJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApOwoJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJZmxvYXQgRCA9IERfQ2hhcmxpZSggc2hlZW5Sb3VnaG5lc3MsIGRvdE5IICk7CglmbG9hdCBWID0gVl9OZXViZWx0KCBkb3ROViwgZG90TkwgKTsKCXJldHVybiBzaGVlbkNvbG9yICogKCBEICogViApOwp9CiNlbmRpZgpmbG9hdCBJQkxTaGVlbkJSREYoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWZsb2F0IHIyID0gcm91Z2huZXNzICogcm91Z2huZXNzOwoJZmxvYXQgYSA9IHJvdWdobmVzcyA8IDAuMjUgPyAtMzM5LjIgKiByMiArIDE2MS40ICogcm91Z2huZXNzIC0gMjUuOSA6IC04LjQ4ICogcjIgKyAxNC4zICogcm91Z2huZXNzIC0gOS45NTsKCWZsb2F0IGIgPSByb3VnaG5lc3MgPCAwLjI1ID8gNDQuMCAqIHIyIC0gMjMuNyAqIHJvdWdobmVzcyArIDMuMjYgOiAxLjk3ICogcjIgLSAzLjI3ICogcm91Z2huZXNzICsgMC43MjsKCWZsb2F0IERHID0gZXhwKCBhICogZG90TlYgKyBiICkgKyAoIHJvdWdobmVzcyA8IDAuMjUgPyAwLjAgOiAwLjEgKiAoIHJvdWdobmVzcyAtIDAuMjUgKSApOwoJcmV0dXJuIHNhdHVyYXRlKCBERyAqIFJFQ0lQUk9DQUxfUEkgKTsKfQp2ZWMyIERGR0FwcHJveCggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApOwoJY29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7Cgljb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTsKCXZlYzQgciA9IHJvdWdobmVzcyAqIGMwICsgYzE7CglmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTsKCXZlYzIgZmFiID0gdmVjMiggLSAxLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dzsKCXJldHVybiBmYWI7Cn0KdmVjMyBFbnZpcm9ubWVudEJSREYoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCXZlYzIgZmFiID0gREZHQXBwcm94KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApOwoJcmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBmYWIueCArIHNwZWN1bGFyRjkwICogZmFiLnk7Cn0KI2lmZGVmIFVTRV9JUklERVNDRU5DRQp2b2lkIGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmdJcmlkZXNjZW5jZSggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gZmxvYXQgaXJpZGVzY2VuY2UsIGNvbnN0IGluIHZlYzMgaXJpZGVzY2VuY2VGMCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkgewojZWxzZQp2b2lkIGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmcoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHsKI2VuZGlmCgl2ZWMyIGZhYiA9IERGR0FwcHJveCggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCQl2ZWMzIEZyID0gbWl4KCBzcGVjdWxhckNvbG9yLCBpcmlkZXNjZW5jZUYwLCBpcmlkZXNjZW5jZSApOwoJI2Vsc2UKCQl2ZWMzIEZyID0gc3BlY3VsYXJDb2xvcjsKCSNlbmRpZgoJdmVjMyBGc3NFc3MgPSBGciAqIGZhYi54ICsgc3BlY3VsYXJGOTAgKiBmYWIueTsKCWZsb2F0IEVzcyA9IGZhYi54ICsgZmFiLnk7CglmbG9hdCBFbXMgPSAxLjAgLSBFc3M7Cgl2ZWMzIEZhdmcgPSBGciArICggMS4wIC0gRnIgKSAqIDAuMDQ3NjE5Owl2ZWMzIEZtcyA9IEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTsKCXNpbmdsZVNjYXR0ZXIgKz0gRnNzRXNzOwoJbXVsdGlTY2F0dGVyICs9IEZtcyAqIEVtczsKfQojaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwCgl2b2lkIFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbCggY29uc3QgaW4gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCQl2ZWMzIG5vcm1hbCA9IGdlb21ldHJ5Tm9ybWFsOwoJCXZlYzMgdmlld0RpciA9IGdlb21ldHJ5Vmlld0RpcjsKCQl2ZWMzIHBvc2l0aW9uID0gZ2VvbWV0cnlQb3NpdGlvbjsKCQl2ZWMzIGxpZ2h0UG9zID0gcmVjdEFyZWFMaWdodC5wb3NpdGlvbjsKCQl2ZWMzIGhhbGZXaWR0aCA9IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoOwoJCXZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVhTGlnaHQuaGFsZkhlaWdodDsKCQl2ZWMzIGxpZ2h0Q29sb3IgPSByZWN0QXJlYUxpZ2h0LmNvbG9yOwoJCWZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnJvdWdobmVzczsKCQl2ZWMzIHJlY3RDb29yZHNbIDQgXTsKCQlyZWN0Q29vcmRzWyAwIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7CQlyZWN0Q29vcmRzWyAxIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7CgkJcmVjdENvb3Jkc1sgMiBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0OwoJCXJlY3RDb29yZHNbIDMgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDsKCQl2ZWMyIHV2ID0gTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApOwoJCXZlYzQgdDEgPSB0ZXh0dXJlMkQoIGx0Y18xLCB1diApOwoJCXZlYzQgdDIgPSB0ZXh0dXJlMkQoIGx0Y18yLCB1diApOwoJCW1hdDMgbUludiA9IG1hdDMoCgkJCXZlYzMoIHQxLngsIDAsIHQxLnkgKSwKCQkJdmVjMyggICAgMCwgMSwgICAgMCApLAoJCQl2ZWMzKCB0MS56LCAwLCB0MS53ICkKCQkpOwoJCXZlYzMgZnJlc25lbCA9ICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApOwoJCXJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7CgkJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApOwoJfQojZW5kaWYKdm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWZsb2F0IGRvdE5MY2MgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCQl2ZWMzIGNjSXJyYWRpYW5jZSA9IGRvdE5MY2MgKiBkaXJlY3RMaWdodC5jb2xvcjsKCQljbGVhcmNvYXRTcGVjdWxhckRpcmVjdCArPSBjY0lycmFkaWFuY2UgKiBCUkRGX0dHWF9DbGVhcmNvYXQoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwgKTsKCSNlbmRpZgoJI2lmZGVmIFVTRV9TSEVFTgoJCXNoZWVuU3BlY3VsYXJEaXJlY3QgKz0gaXJyYWRpYW5jZSAqIEJSREZfU2hlZW4oIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeU5vcm1hbCwgbWF0ZXJpYWwuc2hlZW5Db2xvciwgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKTsKCSNlbmRpZgoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfR0dYKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsICk7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkgewoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQljbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ICs9IGNsZWFyY29hdFJhZGlhbmNlICogRW52aXJvbm1lbnRCUkRGKCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTsKCSNlbmRpZgoJI2lmZGVmIFVTRV9TSEVFTgoJCXNoZWVuU3BlY3VsYXJJbmRpcmVjdCArPSBpcnJhZGlhbmNlICogbWF0ZXJpYWwuc2hlZW5Db2xvciAqIElCTFNoZWVuQlJERiggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKTsKCSNlbmRpZgoJdmVjMyBzaW5nbGVTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7Cgl2ZWMzIG11bHRpU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApOwoJdmVjMyBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgPSBpcnJhZGlhbmNlICogUkVDSVBST0NBTF9QSTsKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCQljb21wdXRlTXVsdGlzY2F0dGVyaW5nSXJpZGVzY2VuY2UoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLCBtYXRlcmlhbC5pcmlkZXNjZW5jZSwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCBtYXRlcmlhbC5yb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApOwoJI2Vsc2UKCQljb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwucm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTsKCSNlbmRpZgoJdmVjMyB0b3RhbFNjYXR0ZXJpbmcgPSBzaW5nbGVTY2F0dGVyaW5nICsgbXVsdGlTY2F0dGVyaW5nOwoJdmVjMyBkaWZmdXNlID0gbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSBtYXgoIG1heCggdG90YWxTY2F0dGVyaW5nLnIsIHRvdGFsU2NhdHRlcmluZy5nICksIHRvdGFsU2NhdHRlcmluZy5iICkgKTsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nOwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBtdWx0aVNjYXR0ZXJpbmcgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gZGlmZnVzZSAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfUGh5c2ljYWwKI2RlZmluZSBSRV9EaXJlY3RfUmVjdEFyZWEJCVJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbAojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsCiNkZWZpbmUgUkVfSW5kaXJlY3RTcGVjdWxhcgkJUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbApmbG9hdCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVzaW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CglyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApOwp9YCxqQz1gCnZlYzMgZ2VvbWV0cnlQb3NpdGlvbiA9IC0gdlZpZXdQb3NpdGlvbjsKdmVjMyBnZW9tZXRyeU5vcm1hbCA9IG5vcm1hbDsKdmVjMyBnZW9tZXRyeVZpZXdEaXIgPSAoIGlzT3J0aG9ncmFwaGljICkgPyB2ZWMzKCAwLCAwLCAxICkgOiBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTsKdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCA9IHZlYzMoIDAuMCApOwojaWZkZWYgVVNFX0NMRUFSQ09BVAoJZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwgPSBjbGVhcmNvYXROb3JtYWw7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFCglmbG9hdCBkb3ROVmkgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7CglpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzID09IDAuMCApIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZSA9IDAuMDsKCX0gZWxzZSB7CgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKTsKCX0KCWlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPiAwLjAgKSB7CgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsID0gZXZhbElyaWRlc2NlbmNlKCAxLjAsIG1hdGVyaWFsLmlyaWRlc2NlbmNlSU9SLCBkb3ROVmksIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICk7CgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2VGMCA9IFNjaGxpY2tfdG9fRjAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgMS4wLCBkb3ROVmkgKTsKCX0KI2VuZGlmCkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7CiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0ICkKCVBvaW50TGlnaHQgcG9pbnRMaWdodDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCglQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3c7CgkjZW5kaWYKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7CgkJcG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07CgkJZ2V0UG9pbnRMaWdodEluZm8oIHBvaW50TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGRpcmVjdExpZ2h0ICk7CgkJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyApCgkJcG9pbnRMaWdodFNoYWRvdyA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07CgkJZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93SW50ZW5zaXR5LCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7CgkJI2VuZGlmCgkJUkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmCiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKQoJU3BvdExpZ2h0IHNwb3RMaWdodDsKCXZlYzQgc3BvdENvbG9yOwoJdmVjMyBzcG90TGlnaHRDb29yZDsKCWJvb2wgaW5TcG90TGlnaHRNYXA7CgkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCglTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7CgkJc3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdOwoJCWdldFNwb3RMaWdodEluZm8oIHNwb3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMgKQoJCSNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggVU5ST0xMRURfTE9PUF9JTkRFWAoJCSNlbGlmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCSNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggTlVNX1NQT1RfTElHSFRfTUFQUwoJCSNlbHNlCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCAoIFVOUk9MTEVEX0xPT1BfSU5ERVggLSBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICsgTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMgKQoJCSNlbmRpZgoJCSNpZiAoIFNQT1RfTElHSFRfTUFQX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfTUFQUyApCgkJCXNwb3RMaWdodENvb3JkID0gdlNwb3RMaWdodENvb3JkWyBpIF0ueHl6IC8gdlNwb3RMaWdodENvb3JkWyBpIF0udzsKCQkJaW5TcG90TGlnaHRNYXAgPSBhbGwoIGxlc3NUaGFuKCBhYnMoIHNwb3RMaWdodENvb3JkICogMi4gLSAxLiApLCB2ZWMzKCAxLjAgKSApICk7CgkJCXNwb3RDb2xvciA9IHRleHR1cmUyRCggc3BvdExpZ2h0TWFwWyBTUE9UX0xJR0hUX01BUF9JTkRFWCBdLCBzcG90TGlnaHRDb29yZC54eSApOwoJCQlkaXJlY3RMaWdodC5jb2xvciA9IGluU3BvdExpZ2h0TWFwID8gZGlyZWN0TGlnaHQuY29sb3IgKiBzcG90Q29sb3IucmdiIDogZGlyZWN0TGlnaHQuY29sb3I7CgkJI2VuZGlmCgkJI3VuZGVmIFNQT1RfTElHSFRfTUFQX0lOREVYCgkJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICkKCQlzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07CgkJZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0ludGVuc2l0eSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7CgkJI2VuZGlmCgkJUkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmCiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7CgkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCURpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvdzsKCSNlbmRpZgoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7CgkJZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07CgkJZ2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGRpcmVjdGlvbmFsTGlnaHQsIGRpcmVjdExpZ2h0ICk7CgkJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKQoJCWRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdOwoJCWRpcmVjdExpZ2h0LmNvbG9yICo9ICggZGlyZWN0TGlnaHQudmlzaWJsZSAmJiByZWNlaXZlU2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dJbnRlbnNpdHksIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhICkKCVJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDsKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkgewoJCXJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdOwoJCVJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmCiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKQoJdmVjMyBpYmxJcnJhZGlhbmNlID0gdmVjMyggMC4wICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApOwoJI2lmIGRlZmluZWQoIFVTRV9MSUdIVF9QUk9CRVMgKQoJCWlycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5Tm9ybWFsICk7CgkjZW5kaWYKCSNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKQoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7CgkJCWlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeU5vcm1hbCApOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCiNlbmRpZgojaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApCgl2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7Cgl2ZWMzIGNsZWFyY29hdFJhZGlhbmNlID0gdmVjMyggMC4wICk7CiNlbmRpZmAsS0M9YCNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKQoJI2lmZGVmIFVTRV9MSUdIVE1BUAoJCXZlYzQgbGlnaHRNYXBUZXhlbCA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZMaWdodE1hcFV2ICk7CgkJdmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5OwoJCWlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApCgkJaWJsSXJyYWRpYW5jZSArPSBnZXRJQkxJcnJhZGlhbmNlKCBnZW9tZXRyeU5vcm1hbCApOwoJI2VuZGlmCiNlbmRpZgojaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKQoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJcmFkaWFuY2UgKz0gZ2V0SUJMQW5pc290cm9weVJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5yb3VnaG5lc3MsIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICk7CgkjZWxzZQoJCXJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5yb3VnaG5lc3MgKTsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQljbGVhcmNvYXRSYWRpYW5jZSArPSBnZXRJQkxSYWRpYW5jZSggZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7CgkjZW5kaWYKI2VuZGlmYCxRQz1gI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCglSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKI2VuZGlmCiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyICkKCVJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCBjbGVhcmNvYXRSYWRpYW5jZSwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwojZW5kaWZgLHRSPWAjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkKCWdsX0ZyYWdEZXB0aCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTsKI2VuZGlmYCxlUj1gI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApCgl1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7Cgl2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7Cgl2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlOwojZW5kaWZgLG5SPWAjaWZkZWYgVVNFX0xPR0RFUFRIQlVGCgl2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7Cgl2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlOwojZW5kaWZgLGlSPWAjaWZkZWYgVVNFX0xPR0RFUFRIQlVGCgl2RnJhZ0RlcHRoID0gMS4wICsgZ2xfUG9zaXRpb24udzsKCXZJc1BlcnNwZWN0aXZlID0gZmxvYXQoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApOwojZW5kaWZgLHJSPWAjaWZkZWYgVVNFX01BUAoJdmVjNCBzYW1wbGVkRGlmZnVzZUNvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZNYXBVdiApOwoJI2lmZGVmIERFQ09ERV9WSURFT19URVhUVVJFCgkJc2FtcGxlZERpZmZ1c2VDb2xvciA9IHNSR0JUcmFuc2ZlckVPVEYoIHNhbXBsZWREaWZmdXNlQ29sb3IgKTsKCSNlbmRpZgoJZGlmZnVzZUNvbG9yICo9IHNhbXBsZWREaWZmdXNlQ29sb3I7CiNlbmRpZmAsc1I9YCNpZmRlZiBVU0VfTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBtYXA7CiNlbmRpZmAsb1I9YCNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkKCSNpZiBkZWZpbmVkKCBVU0VfUE9JTlRTX1VWICkKCQl2ZWMyIHV2ID0gdlV2OwoJI2Vsc2UKCQl2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCWRpZmZ1c2VDb2xvciAqPSB0ZXh0dXJlMkQoIG1hcCwgdXYgKTsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCWRpZmZ1c2VDb2xvci5hICo9IHRleHR1cmUyRCggYWxwaGFNYXAsIHV2ICkuZzsKI2VuZGlmYCxhUj1gI2lmIGRlZmluZWQoIFVTRV9QT0lOVFNfVVYgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2Vsc2UKCSNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkKCQl1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBtYXA7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDsKI2VuZGlmYCxsUj1gZmxvYXQgbWV0YWxuZXNzRmFjdG9yID0gbWV0YWxuZXNzOwojaWZkZWYgVVNFX01FVEFMTkVTU01BUAoJdmVjNCB0ZXhlbE1ldGFsbmVzcyA9IHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2TWV0YWxuZXNzTWFwVXYgKTsKCW1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iOwojZW5kaWZgLGNSPWAjaWZkZWYgVVNFX01FVEFMTkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwOwojZW5kaWZgLHVSPWAjaWZkZWYgVVNFX0lOU1RBTkNJTkdfTU9SUEgKCWZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgTU9SUEhUQVJHRVRTX0NPVU5UIF07CglmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UgPSB0ZXhlbEZldGNoKCBtb3JwaFRleHR1cmUsIGl2ZWMyKCAwLCBnbF9JbnN0YW5jZUlEICksIDAgKS5yOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCW1vcnBoVGFyZ2V0SW5mbHVlbmNlc1tpXSA9ICB0ZXhlbEZldGNoKCBtb3JwaFRleHR1cmUsIGl2ZWMyKCBpICsgMSwgZ2xfSW5zdGFuY2VJRCApLCAwICkucjsKCX0KI2VuZGlmYCxoUj1gI2lmIGRlZmluZWQoIFVTRV9NT1JQSENPTE9SUyApCgl2Q29sb3IgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCSNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKQoJCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIHZDb2xvciArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDIgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJCSNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApCgkJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdkNvbG9yICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMiApLnJnYiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJCSNlbmRpZgoJfQojZW5kaWZgLGZSPWAjaWZkZWYgVVNFX01PUlBITk9STUFMUwoJb2JqZWN0Tm9ybWFsICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTsKCWZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHsKCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIG9iamVjdE5vcm1hbCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDEgKS54eXogKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCX0KI2VuZGlmYCxkUj1gI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMKCSNpZm5kZWYgVVNFX0lOU1RBTkNJTkdfTU9SUEgKCQl1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTsKCQl1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgTU9SUEhUQVJHRVRTX0NPVU5UIF07CgkjZW5kaWYKCXVuaWZvcm0gc2FtcGxlcjJEQXJyYXkgbW9ycGhUYXJnZXRzVGV4dHVyZTsKCXVuaWZvcm0gaXZlYzIgbW9ycGhUYXJnZXRzVGV4dHVyZVNpemU7Cgl2ZWM0IGdldE1vcnBoKCBjb25zdCBpbiBpbnQgdmVydGV4SW5kZXgsIGNvbnN0IGluIGludCBtb3JwaFRhcmdldEluZGV4LCBjb25zdCBpbiBpbnQgb2Zmc2V0ICkgewoJCWludCB0ZXhlbEluZGV4ID0gdmVydGV4SW5kZXggKiBNT1JQSFRBUkdFVFNfVEVYVFVSRV9TVFJJREUgKyBvZmZzZXQ7CgkJaW50IHkgPSB0ZXhlbEluZGV4IC8gbW9ycGhUYXJnZXRzVGV4dHVyZVNpemUueDsKCQlpbnQgeCA9IHRleGVsSW5kZXggLSB5ICogbW9ycGhUYXJnZXRzVGV4dHVyZVNpemUueDsKCQlpdmVjMyBtb3JwaFVWID0gaXZlYzMoIHgsIHksIG1vcnBoVGFyZ2V0SW5kZXggKTsKCQlyZXR1cm4gdGV4ZWxGZXRjaCggbW9ycGhUYXJnZXRzVGV4dHVyZSwgbW9ycGhVViwgMCApOwoJfQojZW5kaWZgLHBSPWAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJdHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdHJhbnNmb3JtZWQgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAwICkueHl6ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07Cgl9CiNlbmRpZmAsbVI9YGZsb2F0IGZhY2VEaXJlY3Rpb24gPSBnbF9Gcm9udEZhY2luZyA/IDEuMCA6IC0gMS4wOwojaWZkZWYgRkxBVF9TSEFERUQKCXZlYzMgZmR4ID0gZEZkeCggdlZpZXdQb3NpdGlvbiApOwoJdmVjMyBmZHkgPSBkRmR5KCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTsKI2Vsc2UKCXZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICk7CgkjaWZkZWYgRE9VQkxFX1NJREVECgkJbm9ybWFsICo9IGZhY2VEaXJlY3Rpb247CgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApIHx8IGRlZmluZWQoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJbWF0MyB0Ym4gPSBtYXQzKCBub3JtYWxpemUoIHZUYW5nZW50ICksIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApLCBub3JtYWwgKTsKCSNlbHNlCgkJbWF0MyB0Ym4gPSBnZXRUYW5nZW50RnJhbWUoIC0gdlZpZXdQb3NpdGlvbiwgbm9ybWFsLAoJCSNpZiBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkKCQkJdk5vcm1hbE1hcFV2CgkJI2VsaWYgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKQoJCQl2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYKCQkjZWxzZQoJCQl2VXYKCQkjZW5kaWYKCQkpOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggRE9VQkxFX1NJREVEICkgJiYgISBkZWZpbmVkKCBGTEFUX1NIQURFRCApCgkJdGJuWzBdICo9IGZhY2VEaXJlY3Rpb247CgkJdGJuWzFdICo9IGZhY2VEaXJlY3Rpb247CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJbWF0MyB0Ym4yID0gbWF0Myggbm9ybWFsaXplKCB2VGFuZ2VudCApLCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKSwgbm9ybWFsICk7CgkjZWxzZQoJCW1hdDMgdGJuMiA9IGdldFRhbmdlbnRGcmFtZSggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIHZDbGVhcmNvYXROb3JtYWxNYXBVdiApOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggRE9VQkxFX1NJREVEICkgJiYgISBkZWZpbmVkKCBGTEFUX1NIQURFRCApCgkJdGJuMlswXSAqPSBmYWNlRGlyZWN0aW9uOwoJCXRibjJbMV0gKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKdmVjMyBub25QZXJ0dXJiZWROb3JtYWwgPSBub3JtYWw7YCxnUj1gI2lmZGVmIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UKCW5vcm1hbCA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7CgkjaWZkZWYgRkxJUF9TSURFRAoJCW5vcm1hbCA9IC0gbm9ybWFsOwoJI2VuZGlmCgkjaWZkZWYgRE9VQkxFX1NJREVECgkJbm9ybWFsID0gbm9ybWFsICogZmFjZURpcmVjdGlvbjsKCSNlbmRpZgoJbm9ybWFsID0gbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTsKI2VsaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZOb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDsKCW1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7Cglub3JtYWwgPSBub3JtYWxpemUoIHRibiAqIG1hcE4gKTsKI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKQoJbm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpLCBmYWNlRGlyZWN0aW9uICk7CiNlbmRpZmAseVI9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdmFyeWluZyB2ZWMzIHZUYW5nZW50OwoJCXZhcnlpbmcgdmVjMyB2Qml0YW5nZW50OwoJI2VuZGlmCiNlbmRpZmAsX1I9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdmFyeWluZyB2ZWMzIHZUYW5nZW50OwoJCXZhcnlpbmcgdmVjMyB2Qml0YW5nZW50OwoJI2VuZGlmCiNlbmRpZmAseFI9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7CgkJdkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTsKCSNlbmRpZgojZW5kaWZgLHZSPWAjaWZkZWYgVVNFX05PUk1BTE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwOwoJdW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlOwojZW5kaWYKI2lmZGVmIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UKCXVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7CiNlbmRpZgojaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSAmJiAoIGRlZmluZWQgKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkgKQoJbWF0MyBnZXRUYW5nZW50RnJhbWUoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgdXYgKSB7CgkJdmVjMyBxMCA9IGRGZHgoIGV5ZV9wb3MueHl6ICk7CgkJdmVjMyBxMSA9IGRGZHkoIGV5ZV9wb3MueHl6ICk7CgkJdmVjMiBzdDAgPSBkRmR4KCB1di5zdCApOwoJCXZlYzIgc3QxID0gZEZkeSggdXYuc3QgKTsKCQl2ZWMzIE4gPSBzdXJmX25vcm07CgkJdmVjMyBxMXBlcnAgPSBjcm9zcyggcTEsIE4gKTsKCQl2ZWMzIHEwcGVycCA9IGNyb3NzKCBOLCBxMCApOwoJCXZlYzMgVCA9IHExcGVycCAqIHN0MC54ICsgcTBwZXJwICogc3QxLng7CgkJdmVjMyBCID0gcTFwZXJwICogc3QwLnkgKyBxMHBlcnAgKiBzdDEueTsKCQlmbG9hdCBkZXQgPSBtYXgoIGRvdCggVCwgVCApLCBkb3QoIEIsIEIgKSApOwoJCWZsb2F0IHNjYWxlID0gKCBkZXQgPT0gMC4wICkgPyAwLjAgOiBpbnZlcnNlc3FydCggZGV0ICk7CgkJcmV0dXJuIG1hdDMoIFQgKiBzY2FsZSwgQiAqIHNjYWxlLCBOICk7Cgl9CiNlbmRpZmAsU1I9YCNpZmRlZiBVU0VfQ0xFQVJDT0FUCgl2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IG5vblBlcnR1cmJlZE5vcm1hbDsKI2VuZGlmYCxNUj1gI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl2ZWMzIGNsZWFyY29hdE1hcE4gPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE5vcm1hbE1hcCwgdkNsZWFyY29hdE5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wOwoJY2xlYXJjb2F0TWFwTi54eSAqPSBjbGVhcmNvYXROb3JtYWxTY2FsZTsKCWNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdGJuMiAqIGNsZWFyY29hdE1hcE4gKTsKI2VuZGlmYCxiUj1gI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE1hcDsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Tm9ybWFsTWFwOwoJdW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlOwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRSb3VnaG5lc3NNYXA7CiNlbmRpZmAsd1I9YCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlTWFwOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwOwojZW5kaWZgLEFSPWAjaWZkZWYgT1BBUVVFCmRpZmZ1c2VDb2xvci5hID0gMS4wOwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT04KZGlmZnVzZUNvbG9yLmEgKj0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGE7CiNlbmRpZgpnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO2AsRVI9YHZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41Owp9CnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkgewoJcmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7Cn0KY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2Ljtjb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjsKY29uc3QgZmxvYXQgSW52MjU1ID0gMS4gLyAyNTUuOwpjb25zdCB2ZWM0IFBhY2tGYWN0b3JzID0gdmVjNCggMS4wLCAyNTYuMCwgMjU2LjAgKiAyNTYuMCwgMjU2LjAgKiAyNTYuMCAqIDI1Ni4wICk7CmNvbnN0IHZlYzIgVW5wYWNrRmFjdG9yczIgPSB2ZWMyKCBVbnBhY2tEb3duc2NhbGUsIDEuMCAvIFBhY2tGYWN0b3JzLmcgKTsKY29uc3QgdmVjMyBVbnBhY2tGYWN0b3JzMyA9IHZlYzMoIFVucGFja0Rvd25zY2FsZSAvIFBhY2tGYWN0b3JzLnJnLCAxLjAgLyBQYWNrRmFjdG9ycy5iICk7CmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9yczQgPSB2ZWM0KCBVbnBhY2tEb3duc2NhbGUgLyBQYWNrRmFjdG9ycy5yZ2IsIDEuMCAvIFBhY2tGYWN0b3JzLmEgKTsKdmVjNCBwYWNrRGVwdGhUb1JHQkEoIGNvbnN0IGluIGZsb2F0IHYgKSB7CglpZiggdiA8PSAwLjAgKQoJCXJldHVybiB2ZWM0KCAwLiwgMC4sIDAuLCAwLiApOwoJaWYoIHYgPj0gMS4wICkKCQlyZXR1cm4gdmVjNCggMS4sIDEuLCAxLiwgMS4gKTsKCWZsb2F0IHZ1ZjsKCWZsb2F0IGFmID0gbW9kZiggdiAqIFBhY2tGYWN0b3JzLmEsIHZ1ZiApOwoJZmxvYXQgYmYgPSBtb2RmKCB2dWYgKiBTaGlmdFJpZ2h0OCwgdnVmICk7CglmbG9hdCBnZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTsKCXJldHVybiB2ZWM0KCB2dWYgKiBJbnYyNTUsIGdmICogUGFja1Vwc2NhbGUsIGJmICogUGFja1Vwc2NhbGUsIGFmICk7Cn0KdmVjMyBwYWNrRGVwdGhUb1JHQiggY29uc3QgaW4gZmxvYXQgdiApIHsKCWlmKCB2IDw9IDAuMCApCgkJcmV0dXJuIHZlYzMoIDAuLCAwLiwgMC4gKTsKCWlmKCB2ID49IDEuMCApCgkJcmV0dXJuIHZlYzMoIDEuLCAxLiwgMS4gKTsKCWZsb2F0IHZ1ZjsKCWZsb2F0IGJmID0gbW9kZiggdiAqIFBhY2tGYWN0b3JzLmIsIHZ1ZiApOwoJZmxvYXQgZ2YgPSBtb2RmKCB2dWYgKiBTaGlmdFJpZ2h0OCwgdnVmICk7CglyZXR1cm4gdmVjMyggdnVmICogSW52MjU1LCBnZiAqIFBhY2tVcHNjYWxlLCBiZiApOwp9CnZlYzIgcGFja0RlcHRoVG9SRyggY29uc3QgaW4gZmxvYXQgdiApIHsKCWlmKCB2IDw9IDAuMCApCgkJcmV0dXJuIHZlYzIoIDAuLCAwLiApOwoJaWYoIHYgPj0gMS4wICkKCQlyZXR1cm4gdmVjMiggMS4sIDEuICk7CglmbG9hdCB2dWY7CglmbG9hdCBnZiA9IG1vZGYoIHYgKiAyNTYuLCB2dWYgKTsKCXJldHVybiB2ZWMyKCB2dWYgKiBJbnYyNTUsIGdmICk7Cn0KZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHsKCXJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnM0ICk7Cn0KZmxvYXQgdW5wYWNrUkdCVG9EZXB0aCggY29uc3QgaW4gdmVjMyB2ICkgewoJcmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9yczMgKTsKfQpmbG9hdCB1bnBhY2tSR1RvRGVwdGgoIGNvbnN0IGluIHZlYzIgdiApIHsKCXJldHVybiB2LnIgKiBVbnBhY2tGYWN0b3JzMi5yICsgdi5nICogVW5wYWNrRmFjdG9yczIuZzsKfQp2ZWM0IHBhY2sySGFsZlRvUkdCQSggY29uc3QgaW4gdmVjMiB2ICkgewoJdmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApOwoJcmV0dXJuIHZlYzQoIHIueCAtIHIueSAvIDI1NS4wLCByLnksIHIueiAtIHIudyAvIDI1NS4wLCByLncgKTsKfQp2ZWMyIHVucGFja1JHQkFUbzJIYWxmKCBjb25zdCBpbiB2ZWM0IHYgKSB7CglyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTsKfQpmbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7CglyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICggbmVhciAtIGZhciApOwp9CmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgZGVwdGgsIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiBkZXB0aCAqICggbmVhciAtIGZhciApIC0gbmVhcjsKfQpmbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiAoICggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApOwp9CmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBkZXB0aCwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGRlcHRoIC0gZmFyICk7Cn1gLFRSPWAjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQQoJZ2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTsKI2VuZGlmYCxDUj1gdmVjNCBtdlBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApOwojaWZkZWYgVVNFX0JBVENISU5HCgltdlBvc2l0aW9uID0gYmF0Y2hpbmdNYXRyaXggKiBtdlBvc2l0aW9uOwojZW5kaWYKI2lmZGVmIFVTRV9JTlNUQU5DSU5HCgltdlBvc2l0aW9uID0gaW5zdGFuY2VNYXRyaXggKiBtdlBvc2l0aW9uOwojZW5kaWYKbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIG12UG9zaXRpb247CmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247YCxSUj1gI2lmZGVmIERJVEhFUklORwoJZ2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApOwojZW5kaWZgLFBSPWAjaWZkZWYgRElUSEVSSU5HCgl2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHsKCQlmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7CgkJdmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTsKCQlkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApOwoJCXJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7Cgl9CiNlbmRpZmAsSVI9YGZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzczsKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlJvdWdobmVzc01hcFV2ICk7Cglyb3VnaG5lc3NGYWN0b3IgKj0gdGV4ZWxSb3VnaG5lc3MuZzsKI2VuZGlmYCxMUj1gI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDsKI2VuZGlmYCxEUj1gI2lmIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAKCXZhcnlpbmcgdmVjNCB2U3BvdExpZ2h0Q29vcmRbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdOwojZW5kaWYKI2lmIE5VTV9TUE9UX0xJR0hUX01BUFMgPiAwCgl1bmlmb3JtIHNhbXBsZXIyRCBzcG90TGlnaHRNYXBbIE5VTV9TUE9UX0xJR0hUX01BUFMgXTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hBRE9XTUFQCgkjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJCXVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCQl2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQl9OwoJCXVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTsKCQlzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQl9OwoJCXVuaWZvcm0gU3BvdExpZ2h0U2hhZG93IHNwb3RMaWdodFNoYWRvd3NbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgoJI2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMAoJCXVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCQlzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7CgkJCWZsb2F0IHNoYWRvd0ludGVuc2l0eTsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYUZhcjsKCQl9OwoJCXVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgoJZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHsKCQlyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTsKCX0KCXZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkgewoJCXJldHVybiB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTsKCX0KCWZsb2F0IFZTTVNoYWRvdyAoc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApewoJCWZsb2F0IG9jY2x1c2lvbiA9IDEuMDsKCQl2ZWMyIGRpc3RyaWJ1dGlvbiA9IHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2hhZG93LCB1diApOwoJCWZsb2F0IGhhcmRfc2hhZG93ID0gc3RlcCggY29tcGFyZSAsIGRpc3RyaWJ1dGlvbi54ICk7CgkJaWYgKGhhcmRfc2hhZG93ICE9IDEuMCApIHsKCQkJZmxvYXQgZGlzdGFuY2UgPSBjb21wYXJlIC0gZGlzdHJpYnV0aW9uLnggOwoJCQlmbG9hdCB2YXJpYW5jZSA9IG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApOwoJCQlmbG9hdCBzb2Z0bmVzc19wcm9iYWJpbGl0eSA9IHZhcmlhbmNlIC8gKHZhcmlhbmNlICsgZGlzdGFuY2UgKiBkaXN0YW5jZSApOwkJCXNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gY2xhbXAoICggc29mdG5lc3NfcHJvYmFiaWxpdHkgLSAwLjMgKSAvICggMC45NSAtIDAuMyApLCAwLjAsIDEuMCApOwkJCW9jY2x1c2lvbiA9IGNsYW1wKCBtYXgoIGhhcmRfc2hhZG93LCBzb2Z0bmVzc19wcm9iYWJpbGl0eSApLCAwLjAsIDEuMCApOwoJCX0KCQlyZXR1cm4gb2NjbHVzaW9uOwoJfQoJZmxvYXQgZ2V0U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0ludGVuc2l0eSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkgewoJCWZsb2F0IHNoYWRvdyA9IDEuMDsKCQlzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudzsKCQlzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7CgkJYm9vbCBpbkZydXN0dW0gPSBzaGFkb3dDb29yZC54ID49IDAuMCAmJiBzaGFkb3dDb29yZC54IDw9IDEuMCAmJiBzaGFkb3dDb29yZC55ID49IDAuMCAmJiBzaGFkb3dDb29yZC55IDw9IDEuMDsKCQlib29sIGZydXN0dW1UZXN0ID0gaW5GcnVzdHVtICYmIHNoYWRvd0Nvb3JkLnogPD0gMS4wOwoJCWlmICggZnJ1c3R1bVRlc3QgKSB7CgkJI2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApCgkJCXZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplOwoJCQlmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeDIgPSBkeDAgLyAyLjA7CgkJCWZsb2F0IGR5MiA9IGR5MCAvIDIuMDsKCQkJZmxvYXQgZHgzID0gZHgxIC8gMi4wOwoJCQlmbG9hdCBkeTMgPSBkeTEgLyAyLjA7CgkJCXNoYWRvdyA9ICgKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApCgkJCSkgKiAoIDEuMCAvIDE3LjAgKTsKCQkjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApCgkJCXZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplOwoJCQlmbG9hdCBkeCA9IHRleGVsU2l6ZS54OwoJCQlmbG9hdCBkeSA9IHRleGVsU2l6ZS55OwoJCQl2ZWMyIHV2ID0gc2hhZG93Q29vcmQueHk7CgkJCXZlYzIgZiA9IGZyYWN0KCB1diAqIHNoYWRvd01hcFNpemUgKyAwLjUgKTsKCQkJdXYgLT0gZiAqIHRleGVsU2l6ZTsKCQkJc2hhZG93ID0gKAoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCBkeSApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSBmLnggKSArCgkJCQltaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueCApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSBmLnkgKSArCgkJCQltaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueSApICsKCQkJCW1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCQkgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICBmLnggKSwKCQkJCQkgbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgZi54ICksCgkJCQkJIGYueSApCgkJCSkgKiAoIDEuMCAvIDkuMCApOwoJCSNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApCgkJCXNoYWRvdyA9IFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApOwoJCSNlbHNlCgkJCXNoYWRvdyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTsKCQkjZW5kaWYKCQl9CgkJcmV0dXJuIG1peCggMS4wLCBzaGFkb3csIHNoYWRvd0ludGVuc2l0eSApOwoJfQoJdmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkgewoJCXZlYzMgYWJzViA9IGFicyggdiApOwoJCWZsb2F0IHNjYWxlVG9DdWJlID0gMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApOwoJCWFic1YgKj0gc2NhbGVUb0N1YmU7CgkJdiAqPSBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApOwoJCXZlYzIgcGxhbmFyID0gdi54eTsKCQlmbG9hdCBhbG1vc3RBVGV4ZWwgPSAxLjUgKiB0ZXhlbFNpemVZOwoJCWZsb2F0IGFsbW9zdE9uZSA9IDEuMCAtIGFsbW9zdEFUZXhlbDsKCQlpZiAoIGFic1YueiA+PSBhbG1vc3RPbmUgKSB7CgkJCWlmICggdi56ID4gMC4wICkKCQkJCXBsYW5hci54ID0gNC4wIC0gdi54OwoJCX0gZWxzZSBpZiAoIGFic1YueCA+PSBhbG1vc3RPbmUgKSB7CgkJCWZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7CgkJCXBsYW5hci54ID0gdi56ICogc2lnblggKyAyLjAgKiBzaWduWDsKCQl9IGVsc2UgaWYgKCBhYnNWLnkgPj0gYWxtb3N0T25lICkgewoJCQlmbG9hdCBzaWduWSA9IHNpZ24oIHYueSApOwoJCQlwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wOwoJCQlwbGFuYXIueSA9IHYueiAqIHNpZ25ZIC0gMi4wOwoJCX0KCQlyZXR1cm4gdmVjMiggMC4xMjUsIDAuMjUgKSAqIHBsYW5hciArIHZlYzIoIDAuMzc1LCAwLjc1ICk7Cgl9CglmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dJbnRlbnNpdHksIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCwgZmxvYXQgc2hhZG93Q2FtZXJhTmVhciwgZmxvYXQgc2hhZG93Q2FtZXJhRmFyICkgewoJCWZsb2F0IHNoYWRvdyA9IDEuMDsKCQl2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejsKCQkKCQlmbG9hdCBsaWdodFRvUG9zaXRpb25MZW5ndGggPSBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApOwoJCWlmICggbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoIC0gc2hhZG93Q2FtZXJhRmFyIDw9IDAuMCAmJiBsaWdodFRvUG9zaXRpb25MZW5ndGggLSBzaGFkb3dDYW1lcmFOZWFyID49IDAuMCApIHsKCQkJZmxvYXQgZHAgPSAoIGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApOwkJCWRwICs9IHNoYWRvd0JpYXM7CgkJCXZlYzMgYmQzRCA9IG5vcm1hbGl6ZSggbGlnaHRUb1Bvc2l0aW9uICk7CgkJCXZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7CgkJCSNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApCgkJCQl2ZWMyIG9mZnNldCA9IHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7CgkJCQlzaGFkb3cgPSAoCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh4LCB0ZXhlbFNpemUueSApLCBkcCApCgkJCQkpICogKCAxLjAgLyA5LjAgKTsKCQkJI2Vsc2UKCQkJCXNoYWRvdyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7CgkJCSNlbmRpZgoJCX0KCQlyZXR1cm4gbWl4KCAxLjAsIHNoYWRvdywgc2hhZG93SW50ZW5zaXR5ICk7Cgl9CiNlbmRpZmAsVVI9YCNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl1bmlmb3JtIG1hdDQgc3BvdExpZ2h0TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTsKCXZhcnlpbmcgdmVjNCB2U3BvdExpZ2h0Q29vcmRbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCQl2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQl9OwoJCXVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMAoJCXN0cnVjdCBTcG90TGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBtYXQ0IHBvaW50U2hhZG93TWF0cml4WyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCQlzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7CgkJCWZsb2F0IHNoYWRvd0ludGVuc2l0eTsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYUZhcjsKCQl9OwoJCXVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgojZW5kaWZgLE5SPWAjaWYgKCBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwIHx8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMCApICkgfHwgKCBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwICkKCXZlYzMgc2hhZG93V29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApOwoJdmVjNCBzaGFkb3dXb3JsZFBvc2l0aW9uOwojZW5kaWYKI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKQoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCQlzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7CgkJCXZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCSNlbmRpZgoJI2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMAoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQkJc2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIHBvaW50TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApOwoJCQl2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9DT09SRFM7IGkgKysgKSB7CgkJc2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb247CgkJI2lmICggZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICkKCQkJc2hhZG93V29ybGRQb3NpdGlvbi54eXogKz0gc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhczsKCQkjZW5kaWYKCQl2U3BvdExpZ2h0Q29vcmRbIGkgXSA9IHNwb3RMaWdodE1hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZmAsRlI9YGZsb2F0IGdldFNoYWRvd01hc2soKSB7CglmbG9hdCBzaGFkb3cgPSAxLjA7CgkjaWZkZWYgVVNFX1NIQURPV01BUAoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCURpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodDsKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCSNlbmRpZgoJI2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCglTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlzcG90TGlnaHQgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07CgkJc2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dJbnRlbnNpdHksIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdExpZ2h0Q29vcmRbIGkgXSApIDogMS4wOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCSNlbmRpZgoJI2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMAoJUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7CgkJcG9pbnRMaWdodCA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07CgkJc2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCSNlbmRpZgoJI2VuZGlmCglyZXR1cm4gc2hhZG93Owp9YCxCUj1gI2lmZGVmIFVTRV9TS0lOTklORwoJbWF0NCBib25lTWF0WCA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7CgltYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTsKCW1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApOwoJbWF0NCBib25lTWF0VyA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7CiNlbmRpZmAsT1I9YCNpZmRlZiBVU0VfU0tJTk5JTkcKCXVuaWZvcm0gbWF0NCBiaW5kTWF0cml4OwoJdW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlOwoJdW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgYm9uZVRleHR1cmU7CgltYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7CgkJaW50IHNpemUgPSB0ZXh0dXJlU2l6ZSggYm9uZVRleHR1cmUsIDAgKS54OwoJCWludCBqID0gaW50KCBpICkgKiA0OwoJCWludCB4ID0gaiAlIHNpemU7CgkJaW50IHkgPSBqIC8gc2l6ZTsKCQl2ZWM0IHYxID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTsKCQl2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMSwgeSApLCAwICk7CgkJdmVjNCB2MyA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCArIDIsIHkgKSwgMCApOwoJCXZlYzQgdjQgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTsKCQlyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTsKCX0KI2VuZGlmYCx6Uj1gI2lmZGVmIFVTRV9TS0lOTklORwoJdmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTsKCXZlYzQgc2tpbm5lZCA9IHZlYzQoIDAuMCApOwoJc2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7Cglza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTsKCXNraW5uZWQgKz0gYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56OwoJc2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7Cgl0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6OwojZW5kaWZgLGtSPWAjaWZkZWYgVVNFX1NLSU5OSU5HCgltYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC54ICogYm9uZU1hdFg7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0WjsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC53ICogYm9uZU1hdFc7Cglza2luTWF0cml4ID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDsKCW9iamVjdE5vcm1hbCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6OwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJb2JqZWN0VGFuZ2VudCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejsKCSNlbmRpZgojZW5kaWZgLFZSPWBmbG9hdCBzcGVjdWxhclN0cmVuZ3RoOwojaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2U3BlY3VsYXJNYXBVdiApOwoJc3BlY3VsYXJTdHJlbmd0aCA9IHRleGVsU3BlY3VsYXIucjsKI2Vsc2UKCXNwZWN1bGFyU3RyZW5ndGggPSAxLjA7CiNlbmRpZmAsR1I9YCNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwOwojZW5kaWZgLEhSPWAjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HICkKCWdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApOwojZW5kaWZgLFdSPWAjaWZuZGVmIHNhdHVyYXRlCiNkZWZpbmUgc2F0dXJhdGUoIGEgKSBjbGFtcCggYSwgMC4wLCAxLjAgKQojZW5kaWYKdW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ0V4cG9zdXJlOwp2ZWMzIExpbmVhclRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJcmV0dXJuIHNhdHVyYXRlKCB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3IgKTsKfQp2ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJcmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkgKyBjb2xvciApICk7Cn0KdmVjMyBDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7Cgljb2xvciA9IG1heCggdmVjMyggMC4wICksIGNvbG9yIC0gMC4wMDQgKTsKCXJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7Cn0KdmVjMyBSUlRBbmRPRFRGaXQoIHZlYzMgdiApIHsKCXZlYzMgYSA9IHYgKiAoIHYgKyAwLjAyNDU3ODYgKSAtIDAuMDAwMDkwNTM3OwoJdmVjMyBiID0gdiAqICggMC45ODM3MjkgKiB2ICsgMC40MzI5NTEwICkgKyAwLjIzODA4MTsKCXJldHVybiBhIC8gYjsKfQp2ZWMzIEFDRVNGaWxtaWNUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbnN0IG1hdDMgQUNFU0lucHV0TWF0ID0gbWF0MygKCQl2ZWMzKCAwLjU5NzE5LCAwLjA3NjAwLCAwLjAyODQwICksCQl2ZWMzKCAwLjM1NDU4LCAwLjkwODM0LCAwLjEzMzgzICksCgkJdmVjMyggMC4wNDgyMywgMC4wMTU2NiwgMC44Mzc3NyApCgkpOwoJY29uc3QgbWF0MyBBQ0VTT3V0cHV0TWF0ID0gbWF0MygKCQl2ZWMzKCAgMS42MDQ3NSwgLTAuMTAyMDgsIC0wLjAwMzI3ICksCQl2ZWMzKCAtMC41MzEwOCwgIDEuMTA4MTMsIC0wLjA3Mjc2ICksCgkJdmVjMyggLTAuMDczNjcsIC0wLjAwNjA1LCAgMS4wNzYwMiApCgkpOwoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZSAvIDAuNjsKCWNvbG9yID0gQUNFU0lucHV0TWF0ICogY29sb3I7Cgljb2xvciA9IFJSVEFuZE9EVEZpdCggY29sb3IgKTsKCWNvbG9yID0gQUNFU091dHB1dE1hdCAqIGNvbG9yOwoJcmV0dXJuIHNhdHVyYXRlKCBjb2xvciApOwp9CmNvbnN0IG1hdDMgTElORUFSX1JFQzIwMjBfVE9fTElORUFSX1NSR0IgPSBtYXQzKAoJdmVjMyggMS42NjA1LCAtIDAuMTI0NiwgLSAwLjAxODIgKSwKCXZlYzMoIC0gMC41ODc2LCAxLjEzMjksIC0gMC4xMDA2ICksCgl2ZWMzKCAtIDAuMDcyOCwgLSAwLjAwODMsIDEuMTE4NyApCik7CmNvbnN0IG1hdDMgTElORUFSX1NSR0JfVE9fTElORUFSX1JFQzIwMjAgPSBtYXQzKAoJdmVjMyggMC42Mjc0LCAwLjA2OTEsIDAuMDE2NCApLAoJdmVjMyggMC4zMjkzLCAwLjkxOTUsIDAuMDg4MCApLAoJdmVjMyggMC4wNDMzLCAwLjAxMTMsIDAuODk1NiApCik7CnZlYzMgYWd4RGVmYXVsdENvbnRyYXN0QXBwcm94KCB2ZWMzIHggKSB7Cgl2ZWMzIHgyID0geCAqIHg7Cgl2ZWMzIHg0ID0geDIgKiB4MjsKCXJldHVybiArIDE1LjUgKiB4NCAqIHgyCgkJLSA0MC4xNCAqIHg0ICogeAoJCSsgMzEuOTYgKiB4NAoJCS0gNi44NjggKiB4MiAqIHgKCQkrIDAuNDI5OCAqIHgyCgkJKyAwLjExOTEgKiB4CgkJLSAwLjAwMjMyOwp9CnZlYzMgQWdYVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb25zdCBtYXQzIEFnWEluc2V0TWF0cml4ID0gbWF0MygKCQl2ZWMzKCAwLjg1NjYyNzE1MzMxNTk4MywgMC4xMzczMTg5NzI5Mjk4NDcsIDAuMTExODk4MjEyOTk5OTUgKSwKCQl2ZWMzKCAwLjA5NTEyMTI0MDUzODE1ODgsIDAuNzYxMjQxOTkwNjAyNTkxLCAwLjA3Njc5OTQxODYwMzE5MDMgKSwKCQl2ZWMzKCAwLjA0ODI1MTYwNjE0NTg1ODMsIDAuMTAxNDM5MDM2NDY3NTYyLCAwLjgxMTMwMjM2ODM5Njg1OSApCgkpOwoJY29uc3QgbWF0MyBBZ1hPdXRzZXRNYXRyaXggPSBtYXQzKAoJCXZlYzMoIDEuMTI3MTAwNTgxODE0NDM2OCwgLSAwLjE0MTMyOTc2MzQ5ODQzODMsIC0gMC4xNDEzMjk3NjM0OTg0MzgyNiApLAoJCXZlYzMoIC0gMC4xMTA2MDY2NDMwOTY2MDMyMywgMS4xNTc4MjM3MDIyMTYyNzIsIC0gMC4xMTA2MDY2NDMwOTY2MDI5NCApLAoJCXZlYzMoIC0gMC4wMTY0OTM5Mzg3MTc4MzQ1NzMsIC0gMC4wMTY0OTM5Mzg3MTc4MzQyNTcsIDEuMjUxOTM2NDA2NTk1MDQwNSApCgkpOwoJY29uc3QgZmxvYXQgQWd4TWluRXYgPSAtIDEyLjQ3MzkzOwljb25zdCBmbG9hdCBBZ3hNYXhFdiA9IDQuMDI2MDY5OwoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTsKCWNvbG9yID0gTElORUFSX1NSR0JfVE9fTElORUFSX1JFQzIwMjAgKiBjb2xvcjsKCWNvbG9yID0gQWdYSW5zZXRNYXRyaXggKiBjb2xvcjsKCWNvbG9yID0gbWF4KCBjb2xvciwgMWUtMTAgKTsJY29sb3IgPSBsb2cyKCBjb2xvciApOwoJY29sb3IgPSAoIGNvbG9yIC0gQWd4TWluRXYgKSAvICggQWd4TWF4RXYgLSBBZ3hNaW5FdiApOwoJY29sb3IgPSBjbGFtcCggY29sb3IsIDAuMCwgMS4wICk7Cgljb2xvciA9IGFneERlZmF1bHRDb250cmFzdEFwcHJveCggY29sb3IgKTsKCWNvbG9yID0gQWdYT3V0c2V0TWF0cml4ICogY29sb3I7Cgljb2xvciA9IHBvdyggbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgKSwgdmVjMyggMi4yICkgKTsKCWNvbG9yID0gTElORUFSX1JFQzIwMjBfVE9fTElORUFSX1NSR0IgKiBjb2xvcjsKCWNvbG9yID0gY2xhbXAoIGNvbG9yLCAwLjAsIDEuMCApOwoJcmV0dXJuIGNvbG9yOwp9CnZlYzMgTmV1dHJhbFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29uc3QgZmxvYXQgU3RhcnRDb21wcmVzc2lvbiA9IDAuOCAtIDAuMDQ7Cgljb25zdCBmbG9hdCBEZXNhdHVyYXRpb24gPSAwLjE1OwoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTsKCWZsb2F0IHggPSBtaW4oIGNvbG9yLnIsIG1pbiggY29sb3IuZywgY29sb3IuYiApICk7CglmbG9hdCBvZmZzZXQgPSB4IDwgMC4wOCA/IHggLSA2LjI1ICogeCAqIHggOiAwLjA0OwoJY29sb3IgLT0gb2Zmc2V0OwoJZmxvYXQgcGVhayA9IG1heCggY29sb3IuciwgbWF4KCBjb2xvci5nLCBjb2xvci5iICkgKTsKCWlmICggcGVhayA8IFN0YXJ0Q29tcHJlc3Npb24gKSByZXR1cm4gY29sb3I7CglmbG9hdCBkID0gMS4gLSBTdGFydENvbXByZXNzaW9uOwoJZmxvYXQgbmV3UGVhayA9IDEuIC0gZCAqIGQgLyAoIHBlYWsgKyBkIC0gU3RhcnRDb21wcmVzc2lvbiApOwoJY29sb3IgKj0gbmV3UGVhayAvIHBlYWs7CglmbG9hdCBnID0gMS4gLSAxLiAvICggRGVzYXR1cmF0aW9uICogKCBwZWFrIC0gbmV3UGVhayApICsgMS4gKTsKCXJldHVybiBtaXgoIGNvbG9yLCB2ZWMzKCBuZXdQZWFrICksIGcgKTsKfQp2ZWMzIEN1c3RvbVRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gY29sb3I7IH1gLCRSPWAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uOwoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSAxLjA7CgltYXRlcmlhbC50aGlja25lc3MgPSB0aGlja25lc3M7CgltYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlID0gYXR0ZW51YXRpb25EaXN0YW5jZTsKCW1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgPSBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQltYXRlcmlhbC50cmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZUcmFuc21pc3Npb25NYXBVdiApLnI7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJbWF0ZXJpYWwudGhpY2tuZXNzICo9IHRleHR1cmUyRCggdGhpY2tuZXNzTWFwLCB2VGhpY2tuZXNzTWFwVXYgKS5nOwoJI2VuZGlmCgl2ZWMzIHBvcyA9IHZXb3JsZFBvc2l0aW9uOwoJdmVjMyB2ID0gbm9ybWFsaXplKCBjYW1lcmFQb3NpdGlvbiAtIHBvcyApOwoJdmVjMyBuID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7Cgl2ZWM0IHRyYW5zbWl0dGVkID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbigKCQluLCB2LCBtYXRlcmlhbC5yb3VnaG5lc3MsIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsCgkJcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuZGlzcGVyc2lvbiwgbWF0ZXJpYWwuaW9yLCBtYXRlcmlhbC50aGlja25lc3MsCgkJbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSApOwoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSBtaXgoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhLCB0cmFuc21pdHRlZC5hLCBtYXRlcmlhbC50cmFuc21pc3Npb24gKTsKCXRvdGFsRGlmZnVzZSA9IG1peCggdG90YWxEaWZmdXNlLCB0cmFuc21pdHRlZC5yZ2IsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApOwojZW5kaWZgLFhSPWAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdW5pZm9ybSBmbG9hdCB0cmFuc21pc3Npb247Cgl1bmlmb3JtIGZsb2F0IHRoaWNrbmVzczsKCXVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTsKCXVuaWZvcm0gdmVjMyBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgdGhpY2tuZXNzTWFwOwoJI2VuZGlmCgl1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7Cgl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25TYW1wbGVyTWFwOwoJdW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OwoJdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Cgl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CglmbG9hdCB3MCggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICggYSAqICggLSBhICsgMy4wICkgLSAzLjAgKSArIDEuMCApOwoJfQoJZmxvYXQgdzEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAgYSAqICggMy4wICogYSAtIDYuMCApICsgNC4wICk7Cgl9CglmbG9hdCB3MiggZmxvYXQgYSApewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIDMuMCAqIGEgKyAzLjAgKSArIDMuMCApICsgMS4wICk7Cgl9CglmbG9hdCB3MyggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqIGEgKiBhICk7Cgl9CglmbG9hdCBnMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzAoIGEgKSArIHcxKCBhICk7Cgl9CglmbG9hdCBnMSggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzIoIGEgKSArIHczKCBhICk7Cgl9CglmbG9hdCBoMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gLSAxLjAgKyB3MSggYSApIC8gKCB3MCggYSApICsgdzEoIGEgKSApOwoJfQoJZmxvYXQgaDEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuIDEuMCArIHczKCBhICkgLyAoIHcyKCBhICkgKyB3MyggYSApICk7Cgl9Cgl2ZWM0IGJpY3ViaWMoIHNhbXBsZXIyRCB0ZXgsIHZlYzIgdXYsIHZlYzQgdGV4ZWxTaXplLCBmbG9hdCBsb2QgKSB7CgkJdXYgPSB1diAqIHRleGVsU2l6ZS56dyArIDAuNTsKCQl2ZWMyIGl1diA9IGZsb29yKCB1diApOwoJCXZlYzIgZnV2ID0gZnJhY3QoIHV2ICk7CgkJZmxvYXQgZzB4ID0gZzAoIGZ1di54ICk7CgkJZmxvYXQgZzF4ID0gZzEoIGZ1di54ICk7CgkJZmxvYXQgaDB4ID0gaDAoIGZ1di54ICk7CgkJZmxvYXQgaDF4ID0gaDEoIGZ1di54ICk7CgkJZmxvYXQgaDB5ID0gaDAoIGZ1di55ICk7CgkJZmxvYXQgaDF5ID0gaDEoIGZ1di55ICk7CgkJdmVjMiBwMCA9ICggdmVjMiggaXV2LnggKyBoMHgsIGl1di55ICsgaDB5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQl2ZWMyIHAxID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXZlYzIgcDIgPSAoIHZlYzIoIGl1di54ICsgaDB4LCBpdXYueSArIGgxeSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7CgkJdmVjMiBwMyA9ICggdmVjMiggaXV2LnggKyBoMXgsIGl1di55ICsgaDF5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQlyZXR1cm4gZzAoIGZ1di55ICkgKiAoIGcweCAqIHRleHR1cmVMb2QoIHRleCwgcDAsIGxvZCApICsgZzF4ICogdGV4dHVyZUxvZCggdGV4LCBwMSwgbG9kICkgKSArCgkJCWcxKCBmdXYueSApICogKCBnMHggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAyLCBsb2QgKSArIGcxeCAqIHRleHR1cmVMb2QoIHRleCwgcDMsIGxvZCApICk7Cgl9Cgl2ZWM0IHRleHR1cmVCaWN1YmljKCBzYW1wbGVyMkQgc2FtcGxlciwgdmVjMiB1diwgZmxvYXQgbG9kICkgewoJCXZlYzIgZkxvZFNpemUgPSB2ZWMyKCB0ZXh0dXJlU2l6ZSggc2FtcGxlciwgaW50KCBsb2QgKSApICk7CgkJdmVjMiBjTG9kU2l6ZSA9IHZlYzIoIHRleHR1cmVTaXplKCBzYW1wbGVyLCBpbnQoIGxvZCArIDEuMCApICkgKTsKCQl2ZWMyIGZMb2RTaXplSW52ID0gMS4wIC8gZkxvZFNpemU7CgkJdmVjMiBjTG9kU2l6ZUludiA9IDEuMCAvIGNMb2RTaXplOwoJCXZlYzQgZlNhbXBsZSA9IGJpY3ViaWMoIHNhbXBsZXIsIHV2LCB2ZWM0KCBmTG9kU2l6ZUludiwgZkxvZFNpemUgKSwgZmxvb3IoIGxvZCApICk7CgkJdmVjNCBjU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGNMb2RTaXplSW52LCBjTG9kU2l6ZSApLCBjZWlsKCBsb2QgKSApOwoJCXJldHVybiBtaXgoIGZTYW1wbGUsIGNTYW1wbGUsIGZyYWN0KCBsb2QgKSApOwoJfQoJdmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCApIHsKCQl2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KCAtIHYsIG5vcm1hbGl6ZSggbiApLCAxLjAgLyBpb3IgKTsKCQl2ZWMzIG1vZGVsU2NhbGU7CgkJbW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS56ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApICk7CgkJcmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTsKCX0KCWZsb2F0IGFwcGx5SW9yVG9Sb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkgewoJCXJldHVybiByb3VnaG5lc3MgKiBjbGFtcCggaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCApOwoJfQoJdmVjNCBnZXRUcmFuc21pc3Npb25TYW1wbGUoIGNvbnN0IGluIHZlYzIgZnJhZ0Nvb3JkLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHsKCQlmbG9hdCBsb2QgPSBsb2cyKCB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZS54ICkgKiBhcHBseUlvclRvUm91Z2huZXNzKCByb3VnaG5lc3MsIGlvciApOwoJCXJldHVybiB0ZXh0dXJlQmljdWJpYyggdHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBsb2QgKTsKCX0KCXZlYzMgdm9sdW1lQXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IHRyYW5zbWlzc2lvbkRpc3RhbmNlLCBjb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7CgkJaWYgKCBpc2luZiggYXR0ZW51YXRpb25EaXN0YW5jZSApICkgewoJCQlyZXR1cm4gdmVjMyggMS4wICk7CgkJfSBlbHNlIHsKCQkJdmVjMyBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ID0gLWxvZyggYXR0ZW51YXRpb25Db2xvciApIC8gYXR0ZW51YXRpb25EaXN0YW5jZTsKCQkJdmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKCAtIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSApOwkJCXJldHVybiB0cmFuc21pdHRhbmNlOwoJCX0KCX0KCXZlYzQgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbiggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IsCgkJY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gdmVjMyBwb3NpdGlvbiwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCwKCQljb25zdCBpbiBtYXQ0IHZpZXdNYXRyaXgsIGNvbnN0IGluIG1hdDQgcHJvak1hdHJpeCwgY29uc3QgaW4gZmxvYXQgZGlzcGVyc2lvbiwgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsCgkJY29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkgewoJCXZlYzQgdHJhbnNtaXR0ZWRMaWdodDsKCQl2ZWMzIHRyYW5zbWl0dGFuY2U7CgkJI2lmZGVmIFVTRV9ESVNQRVJTSU9OCgkJCWZsb2F0IGhhbGZTcHJlYWQgPSAoIGlvciAtIDEuMCApICogMC4wMjUgKiBkaXNwZXJzaW9uOwoJCQl2ZWMzIGlvcnMgPSB2ZWMzKCBpb3IgLSBoYWxmU3ByZWFkLCBpb3IsIGlvciArIGhhbGZTcHJlYWQgKTsKCQkJZm9yICggaW50IGkgPSAwOyBpIDwgMzsgaSArKyApIHsKCQkJCXZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvcnNbIGkgXSwgbW9kZWxNYXRyaXggKTsKCQkJCXZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5OwoJCQoJCQkJdmVjNCBuZGNQb3MgPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApOwoJCQkJdmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7CgkJCQlyZWZyYWN0aW9uQ29vcmRzICs9IDEuMDsKCQkJCXJlZnJhY3Rpb25Db29yZHMgLz0gMi4wOwoJCQoJCQkJdmVjNCB0cmFuc21pc3Npb25TYW1wbGUgPSBnZXRUcmFuc21pc3Npb25TYW1wbGUoIHJlZnJhY3Rpb25Db29yZHMsIHJvdWdobmVzcywgaW9yc1sgaSBdICk7CgkJCQl0cmFuc21pdHRlZExpZ2h0WyBpIF0gPSB0cmFuc21pc3Npb25TYW1wbGVbIGkgXTsKCQkJCXRyYW5zbWl0dGVkTGlnaHQuYSArPSB0cmFuc21pc3Npb25TYW1wbGUuYTsKCQkJCXRyYW5zbWl0dGFuY2VbIGkgXSA9IGRpZmZ1c2VDb2xvclsgaSBdICogdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKVsgaSBdOwoJCQl9CgkJCXRyYW5zbWl0dGVkTGlnaHQuYSAvPSAzLjA7CgkJCgkJI2Vsc2UKCQkKCQkJdmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yLCBtb2RlbE1hdHJpeCApOwoJCQl2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTsKCQkJdmVjNCBuZGNQb3MgPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApOwoJCQl2ZWMyIHJlZnJhY3Rpb25Db29yZHMgPSBuZGNQb3MueHkgLyBuZGNQb3MudzsKCQkJcmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7CgkJCXJlZnJhY3Rpb25Db29yZHMgLz0gMi4wOwoJCQl0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApOwoJCQl0cmFuc21pdHRhbmNlID0gZGlmZnVzZUNvbG9yICogdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKTsKCQkKCQkjZW5kaWYKCQl2ZWMzIGF0dGVudWF0ZWRDb2xvciA9IHRyYW5zbWl0dGFuY2UgKiB0cmFuc21pdHRlZExpZ2h0LnJnYjsKCQl2ZWMzIEYgPSBFbnZpcm9ubWVudEJSREYoIG4sIHYsIHNwZWN1bGFyQ29sb3IsIHNwZWN1bGFyRjkwLCByb3VnaG5lc3MgKTsKCQlmbG9hdCB0cmFuc21pdHRhbmNlRmFjdG9yID0gKCB0cmFuc21pdHRhbmNlLnIgKyB0cmFuc21pdHRhbmNlLmcgKyB0cmFuc21pdHRhbmNlLmIgKSAvIDMuMDsKCQlyZXR1cm4gdmVjNCggKCAxLjAgLSBGICkgKiBhdHRlbnVhdGVkQ29sb3IsIDEuMCAtICggMS4wIC0gdHJhbnNtaXR0ZWRMaWdodC5hICkgKiB0cmFuc21pdHRhbmNlRmFjdG9yICk7Cgl9CiNlbmRpZmAscVI9YCNpZiBkZWZpbmVkKCBVU0VfVVYgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApCgl2YXJ5aW5nIHZlYzIgdlV2OwojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCXZhcnlpbmcgdmVjMiB2TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCgl2YXJ5aW5nIHZlYzIgdkFscGhhTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0xJR0hUTUFQCgl2YXJ5aW5nIHZlYzIgdkxpZ2h0TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0FPTUFQCgl2YXJ5aW5nIHZlYzIgdkFvTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0JVTVBNQVAKCXZhcnlpbmcgdmVjMiB2QnVtcE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9OT1JNQUxNQVAKCXZhcnlpbmcgdmVjMiB2Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0VNSVNTSVZFTUFQCgl2YXJ5aW5nIHZlYzIgdkVtaXNzaXZlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX01FVEFMTkVTU01BUAoJdmFyeWluZyB2ZWMyIHZNZXRhbG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdlJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgl2YXJ5aW5nIHZlYzIgdkFuaXNvdHJvcHlNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdE5vcm1hbE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdFJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCXZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCXZhcnlpbmcgdmVjMiB2U2hlZW5Db2xvck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2U2hlZW5Sb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXZhcnlpbmcgdmVjMiB2U3BlY3VsYXJNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCXZhcnlpbmcgdmVjMiB2U3BlY3VsYXJDb2xvck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCXZhcnlpbmcgdmVjMiB2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQCgl1bmlmb3JtIG1hdDMgdHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZUcmFuc21pc3Npb25NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgl1bmlmb3JtIG1hdDMgdGhpY2tuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZUaGlja25lc3NNYXBVdjsKI2VuZGlmYCxZUj1gI2lmIGRlZmluZWQoIFVTRV9VViApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkKCXZhcnlpbmcgdmVjMiB2VXY7CiNlbmRpZgojaWZkZWYgVVNFX01BUAoJdW5pZm9ybSBtYXQzIG1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCgl1bmlmb3JtIG1hdDMgYWxwaGFNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkFscGhhTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0xJR0hUTUFQCgl1bmlmb3JtIG1hdDMgbGlnaHRNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkxpZ2h0TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0FPTUFQCgl1bmlmb3JtIG1hdDMgYW9NYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkFvTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0JVTVBNQVAKCXVuaWZvcm0gbWF0MyBidW1wTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZCdW1wTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX05PUk1BTE1BUAoJdW5pZm9ybSBtYXQzIG5vcm1hbE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJdW5pZm9ybSBtYXQzIGRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2RGlzcGxhY2VtZW50TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0VNSVNTSVZFTUFQCgl1bmlmb3JtIG1hdDMgZW1pc3NpdmVNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkVtaXNzaXZlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX01FVEFMTkVTU01BUAoJdW5pZm9ybSBtYXQzIG1ldGFsbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2TWV0YWxuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdW5pZm9ybSBtYXQzIHJvdWdobmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCXVuaWZvcm0gbWF0MyBhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZBbmlzb3Ryb3B5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJdW5pZm9ybSBtYXQzIGNsZWFyY29hdE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXVuaWZvcm0gbWF0MyBjbGVhcmNvYXROb3JtYWxNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdE5vcm1hbE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCXVuaWZvcm0gbWF0MyBzaGVlbkNvbG9yTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZTaGVlbkNvbG9yTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJdW5pZm9ybSBtYXQzIHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZTaGVlblJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJdW5pZm9ybSBtYXQzIGlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCXVuaWZvcm0gbWF0MyBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXVuaWZvcm0gbWF0MyBzcGVjdWxhck1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U3BlY3VsYXJNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCXVuaWZvcm0gbWF0MyBzcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhckNvbG9yTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhckludGVuc2l0eU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCXVuaWZvcm0gbWF0MyB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlRyYW5zbWlzc2lvbk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCXVuaWZvcm0gbWF0MyB0aGlja25lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlRoaWNrbmVzc01hcFV2OwojZW5kaWZgLFpSPWAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdlV2ID0gdmVjMyggdXYsIDEgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl2TWFwVXYgPSAoIG1hcFRyYW5zZm9ybSAqIHZlYzMoIE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCgl2QWxwaGFNYXBVdiA9ICggYWxwaGFNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBTFBIQU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0xJR0hUTUFQCgl2TGlnaHRNYXBVdiA9ICggbGlnaHRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBMSUdIVE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FPTUFQCgl2QW9NYXBVdiA9ICggYW9NYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBT01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0JVTVBNQVAKCXZCdW1wTWFwVXYgPSAoIGJ1bXBNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBCVU1QTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl2Tm9ybWFsTWFwVXYgPSAoIG5vcm1hbE1hcFRyYW5zZm9ybSAqIHZlYzMoIE5PUk1BTE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJdkRpc3BsYWNlbWVudE1hcFV2ID0gKCBkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBESVNQTEFDRU1FTlRNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdkVtaXNzaXZlTWFwVXYgPSAoIGVtaXNzaXZlTWFwVHJhbnNmb3JtICogdmVjMyggRU1JU1NJVkVNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZNZXRhbG5lc3NNYXBVdiA9ICggbWV0YWxuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggTUVUQUxORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl2Um91Z2huZXNzTWFwVXYgPSAoIHJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFJPVUdITkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCXZBbmlzb3Ryb3B5TWFwVXYgPSAoIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBTklTT1RST1BZTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl2Q2xlYXJjb2F0TWFwVXYgPSAoIGNsZWFyY29hdE1hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXZDbGVhcmNvYXROb3JtYWxNYXBVdiA9ICggY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUX05PUk1BTE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiA9ICggY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUX1JPVUdITkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl2SXJpZGVzY2VuY2VNYXBVdiA9ICggaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBJUklERVNDRU5DRU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgPSAoIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCXZTaGVlbkNvbG9yTWFwVXYgPSAoIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTSEVFTl9DT0xPUk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJdlNoZWVuUm91Z2huZXNzTWFwVXYgPSAoIHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggU0hFRU5fUk9VR0hORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXZTcGVjdWxhck1hcFV2ID0gKCBzcGVjdWxhck1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCXZTcGVjdWxhckNvbG9yTWFwVXYgPSAoIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUl9DT0xPUk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJdlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgPSAoIHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJfSU5URU5TSVRZTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQCgl2VHJhbnNtaXNzaW9uTWFwVXYgPSAoIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybSAqIHZlYzMoIFRSQU5TTUlTU0lPTk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdlRoaWNrbmVzc01hcFV2ID0gKCB0aGlja25lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBUSElDS05FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWZgLEpSPWAjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKSB8fCBkZWZpbmVkICggVVNFX1RSQU5TTUlTU0lPTiApIHx8IE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAKCXZlYzQgd29ybGRQb3NpdGlvbiA9IHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTsKCSNpZmRlZiBVU0VfQkFUQ0hJTkcKCQl3b3JsZFBvc2l0aW9uID0gYmF0Y2hpbmdNYXRyaXggKiB3b3JsZFBvc2l0aW9uOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0lOU1RBTkNJTkcKCQl3b3JsZFBvc2l0aW9uID0gaW5zdGFuY2VNYXRyaXggKiB3b3JsZFBvc2l0aW9uOwoJI2VuZGlmCgl3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB3b3JsZFBvc2l0aW9uOwojZW5kaWZgO2NvbnN0IGp0PXthbHBoYWhhc2hfZnJhZ21lbnQ6S1QsYWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ6UVQsYWxwaGFtYXBfZnJhZ21lbnQ6dEMsYWxwaGFtYXBfcGFyc19mcmFnbWVudDplQyxhbHBoYXRlc3RfZnJhZ21lbnQ6bkMsYWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ6aUMsYW9tYXBfZnJhZ21lbnQ6ckMsYW9tYXBfcGFyc19mcmFnbWVudDpzQyxiYXRjaGluZ19wYXJzX3ZlcnRleDpvQyxiYXRjaGluZ192ZXJ0ZXg6YUMsYmVnaW5fdmVydGV4OmxDLGJlZ2lubm9ybWFsX3ZlcnRleDpjQyxic2Rmczp1QyxpcmlkZXNjZW5jZV9mcmFnbWVudDpoQyxidW1wbWFwX3BhcnNfZnJhZ21lbnQ6ZkMsY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OmRDLGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OnBDLGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleDptQyxjbGlwcGluZ19wbGFuZXNfdmVydGV4OmdDLGNvbG9yX2ZyYWdtZW50OnlDLGNvbG9yX3BhcnNfZnJhZ21lbnQ6X0MsY29sb3JfcGFyc192ZXJ0ZXg6eEMsY29sb3JfdmVydGV4OnZDLGNvbW1vbjpTQyxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6TUMsZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6YkMsZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4OndDLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6QUMsZW1pc3NpdmVtYXBfZnJhZ21lbnQ6RUMsZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDpUQyxjb2xvcnNwYWNlX2ZyYWdtZW50OkNDLGNvbG9yc3BhY2VfcGFyc19mcmFnbWVudDpSQyxlbnZtYXBfZnJhZ21lbnQ6UEMsZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50OklDLGVudm1hcF9wYXJzX2ZyYWdtZW50OkxDLGVudm1hcF9wYXJzX3ZlcnRleDpEQyxlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDpXQyxlbnZtYXBfdmVydGV4OlVDLGZvZ192ZXJ0ZXg6TkMsZm9nX3BhcnNfdmVydGV4OkZDLGZvZ19mcmFnbWVudDpCQyxmb2dfcGFyc19mcmFnbWVudDpPQyxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OnpDLGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ6a0MsbGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQ6VkMsbGlnaHRzX2xhbWJlcnRfcGFyc19mcmFnbWVudDpHQyxsaWdodHNfcGFyc19iZWdpbjpIQyxsaWdodHNfdG9vbl9mcmFnbWVudDokQyxsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50OlhDLGxpZ2h0c19waG9uZ19mcmFnbWVudDpxQyxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDpZQyxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6WkMsbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6SkMsbGlnaHRzX2ZyYWdtZW50X2JlZ2luOmpDLGxpZ2h0c19mcmFnbWVudF9tYXBzOktDLGxpZ2h0c19mcmFnbWVudF9lbmQ6UUMsbG9nZGVwdGhidWZfZnJhZ21lbnQ6dFIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDplUixsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDpuUixsb2dkZXB0aGJ1Zl92ZXJ0ZXg6aVIsbWFwX2ZyYWdtZW50OnJSLG1hcF9wYXJzX2ZyYWdtZW50OnNSLG1hcF9wYXJ0aWNsZV9mcmFnbWVudDpvUixtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDphUixtZXRhbG5lc3NtYXBfZnJhZ21lbnQ6bFIsbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ6Y1IsbW9ycGhpbnN0YW5jZV92ZXJ0ZXg6dVIsbW9ycGhjb2xvcl92ZXJ0ZXg6aFIsbW9ycGhub3JtYWxfdmVydGV4OmZSLG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OmRSLG1vcnBodGFyZ2V0X3ZlcnRleDpwUixub3JtYWxfZnJhZ21lbnRfYmVnaW46bVIsbm9ybWFsX2ZyYWdtZW50X21hcHM6Z1Isbm9ybWFsX3BhcnNfZnJhZ21lbnQ6eVIsbm9ybWFsX3BhcnNfdmVydGV4Ol9SLG5vcm1hbF92ZXJ0ZXg6eFIsbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6dlIsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbjpTUixjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHM6TVIsY2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQ6YlIsaXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudDp3UixvcGFxdWVfZnJhZ21lbnQ6QVIscGFja2luZzpFUixwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OlRSLHByb2plY3RfdmVydGV4OkNSLGRpdGhlcmluZ19mcmFnbWVudDpSUixkaXRoZXJpbmdfcGFyc19mcmFnbWVudDpQUixyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6SVIscm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6TFIsc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6RFIsc2hhZG93bWFwX3BhcnNfdmVydGV4OlVSLHNoYWRvd21hcF92ZXJ0ZXg6TlIsc2hhZG93bWFza19wYXJzX2ZyYWdtZW50OkZSLHNraW5iYXNlX3ZlcnRleDpCUixza2lubmluZ19wYXJzX3ZlcnRleDpPUixza2lubmluZ192ZXJ0ZXg6elIsc2tpbm5vcm1hbF92ZXJ0ZXg6a1Isc3BlY3VsYXJtYXBfZnJhZ21lbnQ6VlIsc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDpHUix0b25lbWFwcGluZ19mcmFnbWVudDpIUix0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OldSLHRyYW5zbWlzc2lvbl9mcmFnbWVudDokUix0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudDpYUix1dl9wYXJzX2ZyYWdtZW50OnFSLHV2X3BhcnNfdmVydGV4OllSLHV2X3ZlcnRleDpaUix3b3JsZHBvc192ZXJ0ZXg6SlIsYmFja2dyb3VuZF92ZXJ0OmB2YXJ5aW5nIHZlYzIgdlV2Owp1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07CnZvaWQgbWFpbigpIHsKCXZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7CglnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLnh5LCAxLjAsIDEuMCApOwp9YCxiYWNrZ3JvdW5kX2ZyYWc6YHVuaWZvcm0gc2FtcGxlcjJEIHQyRDsKdW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kSW50ZW5zaXR5Owp2YXJ5aW5nIHZlYzIgdlV2Owp2b2lkIG1haW4oKSB7Cgl2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKCB0MkQsIHZVdiApOwoJI2lmZGVmIERFQ09ERV9WSURFT19URVhUVVJFCgkJdGV4Q29sb3IgPSB2ZWM0KCBtaXgoIHBvdyggdGV4Q29sb3IucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHRleENvbG9yLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdGV4Q29sb3IucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHRleENvbG9yLncgKTsKCSNlbmRpZgoJdGV4Q29sb3IucmdiICo9IGJhY2tncm91bmRJbnRlbnNpdHk7CglnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50Pgp9YCxiYWNrZ3JvdW5kQ3ViZV92ZXJ0OmB2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgp2b2lkIG1haW4oKSB7Cgl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53Owp9YCxiYWNrZ3JvdW5kQ3ViZV9mcmFnOmAjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CiNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKQoJdW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwOwojZW5kaWYKdW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRCbHVycmluZXNzOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRJbnRlbnNpdHk7CnVuaWZvcm0gbWF0MyBiYWNrZ3JvdW5kUm90YXRpb247CnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGJhY2tncm91bmRSb3RhdGlvbiAqIHZlYzMoIGZsaXBFbnZNYXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKQoJCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIGJhY2tncm91bmRSb3RhdGlvbiAqIHZXb3JsZERpcmVjdGlvbiwgYmFja2dyb3VuZEJsdXJyaW5lc3MgKTsKCSNlbHNlCgkJdmVjNCB0ZXhDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOwoJI2VuZGlmCgl0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLGN1YmVfdmVydDpgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CglnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udzsKfWAsY3ViZV9mcmFnOmB1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlOwp1bmlmb3JtIGZsb2F0IHRGbGlwOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CnZvaWQgbWFpbigpIHsKCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7CglnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjsKCWdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsZGVwdGhfdmVydDpgI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXOwp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjZW5kaWYKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdkhpZ2hQcmVjaXNpb25aVyA9IGdsX1Bvc2l0aW9uLnp3Owp9YCxkZXB0aF9mcmFnOmAjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwCgl1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVzsKdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CgkjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwCgkJZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5OwoJI2VuZGlmCgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CglmbG9hdCBmcmFnQ29vcmRaID0gMC41ICogdkhpZ2hQcmVjaXNpb25aV1swXSAvIHZIaWdoUHJlY2lzaW9uWldbMV0gKyAwLjU7CgkjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwCgkJZ2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggMS4wIC0gZnJhZ0Nvb3JkWiApLCBvcGFjaXR5ICk7CgkjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDEKCQlnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGZyYWdDb29yZFogKTsKCSNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMgoJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tEZXB0aFRvUkdCKCBmcmFnQ29vcmRaICksIDEuMCApOwoJI2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAzCgkJZ2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja0RlcHRoVG9SRyggZnJhZ0Nvb3JkWiApLCAwLjAsIDEuMCApOwoJI2VuZGlmCn1gLGRpc3RhbmNlUkdCQV92ZXJ0OmAjZGVmaW5lIERJU1RBTkNFCnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjZW5kaWYKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejsKfWAsZGlzdGFuY2VSR0JBX2ZyYWc6YCNkZWZpbmUgRElTVEFOQ0UKdW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uOwp1bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTsKdW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTsKdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbiAoKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCWZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTsKCWRpc3QgPSAoIGRpc3QgLSBuZWFyRGlzdGFuY2UgKSAvICggZmFyRGlzdGFuY2UgLSBuZWFyRGlzdGFuY2UgKTsKCWRpc3QgPSBzYXR1cmF0ZSggZGlzdCApOwoJZ2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7Cn1gLGVxdWlyZWN0X3ZlcnQ6YHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjb21tb24+CnZvaWQgbWFpbigpIHsKCXZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4Pgp9YCxlcXVpcmVjdF9mcmFnOmB1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7CnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjb21tb24+CnZvaWQgbWFpbigpIHsKCXZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTsKCXZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTsKCWdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLGxpbmVkYXNoZWRfdmVydDpgdW5pZm9ybSBmbG9hdCBzY2FsZTsKYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTsKdmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCXZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbGluZWRhc2hlZF9mcmFnOmB1bmlmb3JtIHZlYzMgZGlmZnVzZTsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5Owp1bmlmb3JtIGZsb2F0IGRhc2hTaXplOwp1bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTsKdmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHsKCQlkaXNjYXJkOwoJfQoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+Cn1gLG1lc2hiYXNpY192ZXJ0OmAjaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaWYgZGVmaW5lZCAoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkICggVVNFX1NLSU5OSU5HICkKCQkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCQkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2VuZGlmCgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaGJhc2ljX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTsKCSNpZmRlZiBVU0VfTElHSFRNQVAKCQl2ZWM0IGxpZ2h0TWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2TGlnaHRNYXBVdiApOwoJCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5ICogUkVDSVBST0NBTF9QSTsKCSNlbHNlCgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApOwoJI2VuZGlmCgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjsKCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTsKCSNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxtZXNobGFtYmVydF92ZXJ0OmAjZGVmaW5lIExBTUJFUlQKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLG1lc2hsYW1iZXJ0X2ZyYWc6YCNkZWZpbmUgTEFNQkVSVAp1bmlmb3JtIHZlYzMgZGlmZnVzZTsKdW5pZm9ybSB2ZWMzIGVtaXNzaXZlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnNkZnM+CiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRzX2xhbWJlcnRfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2htYXRjYXBfdmVydDpgI2RlZmluZSBNQVRDQVAKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6Owp9YCxtZXNobWF0Y2FwX2ZyYWc6YCNkZWZpbmUgTUFUQ0FQCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDsKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCXZlYzMgdmlld0RpciA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApOwoJdmVjMyB4ID0gbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApOwoJdmVjMyB5ID0gY3Jvc3MoIHZpZXdEaXIsIHggKTsKCXZlYzIgdXYgPSB2ZWMyKCBkb3QoIHgsIG5vcm1hbCApLCBkb3QoIHksIG5vcm1hbCApICkgKiAwLjQ5NSArIDAuNTsKCSNpZmRlZiBVU0VfTUFUQ0FQCgkJdmVjNCBtYXRjYXBDb2xvciA9IHRleHR1cmUyRCggbWF0Y2FwLCB1diApOwoJI2Vsc2UKCQl2ZWM0IG1hdGNhcENvbG9yID0gdmVjNCggdmVjMyggbWl4KCAwLjIsIDAuOCwgdXYueSApICksIDEuMCApOwoJI2VuZGlmCgl2ZWMzIG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsbWVzaG5vcm1hbF92ZXJ0OmAjZGVmaW5lIE5PUk1BTAojaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkKCXZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApCgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKI2VuZGlmCn1gLG1lc2hub3JtYWxfZnJhZzpgI2RlZmluZSBOT1JNQUwKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkKCXZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojZW5kaWYKI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tOb3JtYWxUb1JHQiggbm9ybWFsICksIGRpZmZ1c2VDb2xvci5hICk7CgkjaWZkZWYgT1BBUVVFCgkJZ2xfRnJhZ0NvbG9yLmEgPSAxLjA7CgkjZW5kaWYKfWAsbWVzaHBob25nX3ZlcnQ6YCNkZWZpbmUgUEhPTkcKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLG1lc2hwaG9uZ19mcmFnOmAjZGVmaW5lIFBIT05HCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gdmVjMyBzcGVjdWxhcjsKdW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPgoJI2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTsKCSNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxtZXNocGh5c2ljYWxfdmVydDpgI2RlZmluZSBTVEFOREFSRAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2lmZGVmIFVTRV9UUkFOU01JU1NJT04KCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKI2VuZGlmCiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4PgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejsKI2VuZGlmCn1gLG1lc2hwaHlzaWNhbF9mcmFnOmAjZGVmaW5lIFNUQU5EQVJECiNpZmRlZiBQSFlTSUNBTAoJI2RlZmluZSBJT1IKCSNkZWZpbmUgVVNFX1NQRUNVTEFSCiNlbmRpZgp1bmlmb3JtIHZlYzMgZGlmZnVzZTsKdW5pZm9ybSB2ZWMzIGVtaXNzaXZlOwp1bmlmb3JtIGZsb2F0IHJvdWdobmVzczsKdW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2lmZGVmIElPUgoJdW5pZm9ybSBmbG9hdCBpb3I7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSCgl1bmlmb3JtIGZsb2F0IHNwZWN1bGFySW50ZW5zaXR5OwoJdW5pZm9ybSB2ZWMzIHNwZWN1bGFyQ29sb3I7CgkjaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJDb2xvck1hcDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckludGVuc2l0eU1hcDsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVQKCXVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0OwoJdW5pZm9ybSBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7CiNlbmRpZgojaWZkZWYgVVNFX0RJU1BFUlNJT04KCXVuaWZvcm0gZmxvYXQgZGlzcGVyc2lvbjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2U7Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlSU9SOwoJdW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW07Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU4KCXVuaWZvcm0gdmVjMyBzaGVlbkNvbG9yOwoJdW5pZm9ybSBmbG9hdCBzaGVlblJvdWdobmVzczsKCSNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzaGVlbkNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNoZWVuUm91Z2huZXNzTWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCXVuaWZvcm0gdmVjMiBhbmlzb3Ryb3B5VmVjdG9yOwoJI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgYW5pc290cm9weU1hcDsKCSNlbmRpZgojZW5kaWYKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxpcmlkZXNjZW5jZV9mcmFnbWVudD4KI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGVhcmNvYXRfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIHRvdGFsRGlmZnVzZSA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIHRvdGFsU3BlY3VsYXIgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXI7CgkjaW5jbHVkZSA8dHJhbnNtaXNzaW9uX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdG90YWxEaWZmdXNlICsgdG90YWxTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTsKCSNpZmRlZiBVU0VfU0hFRU4KCQlmbG9hdCBzaGVlbkVuZXJneUNvbXAgPSAxLjAgLSAwLjE1NyAqIG1heDMoIG1hdGVyaWFsLnNoZWVuQ29sb3IgKTsKCQlvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqIHNoZWVuRW5lcmd5Q29tcCArIHNoZWVuU3BlY3VsYXJEaXJlY3QgKyBzaGVlblNwZWN1bGFySW5kaXJlY3Q7CgkjZW5kaWYKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJZmxvYXQgZG90TlZjYyA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIgKSApOwoJCXZlYzMgRmNjID0gRl9TY2hsaWNrKCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBkb3ROVmNjICk7CgkJb3V0Z29pbmdMaWdodCA9IG91dGdvaW5nTGlnaHQgKiAoIDEuMCAtIG1hdGVyaWFsLmNsZWFyY29hdCAqIEZjYyApICsgKCBjbGVhcmNvYXRTcGVjdWxhckRpcmVjdCArIGNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKSAqIG1hdGVyaWFsLmNsZWFyY29hdDsKCSNlbmRpZgoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsbWVzaHRvb25fdmVydDpgI2RlZmluZSBUT09OCnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaHRvb25fZnJhZzpgI2RlZmluZSBUT09OCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX3Rvb25fZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAscG9pbnRzX3ZlcnQ6YHVuaWZvcm0gZmxvYXQgc2l6ZTsKdW5pZm9ybSBmbG9hdCBzY2FsZTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4KI2lmZGVmIFVTRV9QT0lOVFNfVVYKCXZhcnlpbmcgdmVjMiB2VXY7Cgl1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07CiNlbmRpZgp2b2lkIG1haW4oKSB7CgkjaWZkZWYgVVNFX1BPSU5UU19VVgoJCXZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7CgkjZW5kaWYKCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1BvaW50U2l6ZSA9IHNpemU7CgkjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTgoJCWJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTsKCQlpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7CgkjZW5kaWYKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAscG9pbnRzX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+Cn1gLHNoYWRvd192ZXJ0OmAjaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLHNoYWRvd19mcmFnOmB1bmlmb3JtIHZlYzMgY29sb3I7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCWdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Pgp9YCxzcHJpdGVfdmVydDpgdW5pZm9ybSBmbG9hdCByb3RhdGlvbjsKdW5pZm9ybSB2ZWMyIGNlbnRlcjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+Cgl2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXhbIDMgXTsKCXZlYzIgc2NhbGUgPSB2ZWMyKCBsZW5ndGgoIG1vZGVsTWF0cml4WyAwIF0ueHl6ICksIGxlbmd0aCggbW9kZWxNYXRyaXhbIDEgXS54eXogKSApOwoJI2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OCgkJYm9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApOwoJCWlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICo9IC0gbXZQb3NpdGlvbi56OwoJI2VuZGlmCgl2ZWMyIGFsaWduZWRQb3NpdGlvbiA9ICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlOwoJdmVjMiByb3RhdGVkUG9zaXRpb247Cglyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7Cglyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7CgltdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjsKCWdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsc3ByaXRlX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCW91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KfWB9LHB0PXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyB4dCgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sbWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxhbHBoYVRlc3Q6e3ZhbHVlOjB9fSxzcGVjdWxhcm1hcDp7c3BlY3VsYXJNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFyTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9fSxlbnZtYXA6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZW52TWFwUm90YXRpb246e3ZhbHVlOm5ldyBXdH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9LHJlZmxlY3Rpdml0eTp7dmFsdWU6MX0saW9yOnt2YWx1ZToxLjV9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fX0sYW9tYXA6e2FvTWFwOnt2YWx1ZTpudWxsfSxhb01hcEludGVuc2l0eTp7dmFsdWU6MX0sYW9NYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH19LGxpZ2h0bWFwOntsaWdodE1hcDp7dmFsdWU6bnVsbH0sbGlnaHRNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9LGxpZ2h0TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9fSxidW1wbWFwOntidW1wTWFwOnt2YWx1ZTpudWxsfSxidW1wTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSxub3JtYWxNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sbm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBYKDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGRpc3BsYWNlbWVudFNjYWxlOnt2YWx1ZToxfSxkaXNwbGFjZW1lbnRCaWFzOnt2YWx1ZTowfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfSxlbWlzc2l2ZU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fX0sbWV0YWxuZXNzbWFwOnttZXRhbG5lc3NNYXA6e3ZhbHVlOm51bGx9LG1ldGFsbmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fX0scm91Z2huZXNzbWFwOntyb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LHJvdWdobmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyNWUtNX0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyZTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgeHQoMTY3NzcyMTUpfX0sbGlnaHRzOnthbWJpZW50TGlnaHRDb2xvcjp7dmFsdWU6W119LGxpZ2h0UHJvYmU6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LGNvbG9yOnt9fX0sZGlyZWN0aW9uYWxMaWdodFNoYWRvd3M6e3ZhbHVlOltdLHByb3BlcnRpZXM6e3NoYWRvd0ludGVuc2l0eToxLHNoYWRvd0JpYXM6e30sc2hhZG93Tm9ybWFsQmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LGRpcmVjdGlvbmFsU2hhZG93TWFwOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxzcG90TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkaXJlY3Rpb246e30sZGlzdGFuY2U6e30sY29uZUNvczp7fSxwZW51bWJyYUNvczp7fSxkZWNheTp7fX19LHNwb3RMaWdodFNoYWRvd3M6e3ZhbHVlOltdLHByb3BlcnRpZXM6e3NoYWRvd0ludGVuc2l0eToxLHNoYWRvd0JpYXM6e30sc2hhZG93Tm9ybWFsQmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LHNwb3RMaWdodE1hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXA6e3ZhbHVlOltdfSxzcG90TGlnaHRNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e319fSxwb2ludExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93SW50ZW5zaXR5OjEsc2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0scG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fSxsdGNfMTp7dmFsdWU6bnVsbH0sbHRjXzI6e3ZhbHVlOm51bGx9fSxwb2ludHM6e2RpZmZ1c2U6e3ZhbHVlOm5ldyB4dCgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxhbHBoYVRlc3Q6e3ZhbHVlOjB9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyB4dCgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LGNlbnRlcjp7dmFsdWU6bmV3IFgoLjUsLjUpfSxyb3RhdGlvbjp7dmFsdWU6MH0sbWFwOnt2YWx1ZTpudWxsfSxtYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGFscGhhVGVzdDp7dmFsdWU6MH19fSxwaT17YmFzaWM6e3VuaWZvcm1zOmNuKFtwdC5jb21tb24scHQuc3BlY3VsYXJtYXAscHQuZW52bWFwLHB0LmFvbWFwLHB0LmxpZ2h0bWFwLHB0LmZvZ10pLHZlcnRleFNoYWRlcjpqdC5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjpqdC5tZXNoYmFzaWNfZnJhZ30sbGFtYmVydDp7dW5pZm9ybXM6Y24oW3B0LmNvbW1vbixwdC5zcGVjdWxhcm1hcCxwdC5lbnZtYXAscHQuYW9tYXAscHQubGlnaHRtYXAscHQuZW1pc3NpdmVtYXAscHQuYnVtcG1hcCxwdC5ub3JtYWxtYXAscHQuZGlzcGxhY2VtZW50bWFwLHB0LmZvZyxwdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgeHQoMCl9fV0pLHZlcnRleFNoYWRlcjpqdC5tZXNobGFtYmVydF92ZXJ0LGZyYWdtZW50U2hhZGVyOmp0Lm1lc2hsYW1iZXJ0X2ZyYWd9LHBob25nOnt1bmlmb3JtczpjbihbcHQuY29tbW9uLHB0LnNwZWN1bGFybWFwLHB0LmVudm1hcCxwdC5hb21hcCxwdC5saWdodG1hcCxwdC5lbWlzc2l2ZW1hcCxwdC5idW1wbWFwLHB0Lm5vcm1hbG1hcCxwdC5kaXNwbGFjZW1lbnRtYXAscHQuZm9nLHB0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyB4dCgwKX0sc3BlY3VsYXI6e3ZhbHVlOm5ldyB4dCgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOmp0Lm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOmp0Lm1lc2hwaG9uZ19mcmFnfSxzdGFuZGFyZDp7dW5pZm9ybXM6Y24oW3B0LmNvbW1vbixwdC5lbnZtYXAscHQuYW9tYXAscHQubGlnaHRtYXAscHQuZW1pc3NpdmVtYXAscHQuYnVtcG1hcCxwdC5ub3JtYWxtYXAscHQuZGlzcGxhY2VtZW50bWFwLHB0LnJvdWdobmVzc21hcCxwdC5tZXRhbG5lc3NtYXAscHQuZm9nLHB0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyB4dCgwKX0scm91Z2huZXNzOnt2YWx1ZToxfSxtZXRhbG5lc3M6e3ZhbHVlOjB9LGVudk1hcEludGVuc2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOmp0Lm1lc2hwaHlzaWNhbF92ZXJ0LGZyYWdtZW50U2hhZGVyOmp0Lm1lc2hwaHlzaWNhbF9mcmFnfSx0b29uOnt1bmlmb3JtczpjbihbcHQuY29tbW9uLHB0LmFvbWFwLHB0LmxpZ2h0bWFwLHB0LmVtaXNzaXZlbWFwLHB0LmJ1bXBtYXAscHQubm9ybWFsbWFwLHB0LmRpc3BsYWNlbWVudG1hcCxwdC5ncmFkaWVudG1hcCxwdC5mb2cscHQubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IHh0KDApfX1dKSx2ZXJ0ZXhTaGFkZXI6anQubWVzaHRvb25fdmVydCxmcmFnbWVudFNoYWRlcjpqdC5tZXNodG9vbl9mcmFnfSxtYXRjYXA6e3VuaWZvcm1zOmNuKFtwdC5jb21tb24scHQuYnVtcG1hcCxwdC5ub3JtYWxtYXAscHQuZGlzcGxhY2VtZW50bWFwLHB0LmZvZyx7bWF0Y2FwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6anQubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOmp0Lm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpjbihbcHQucG9pbnRzLHB0LmZvZ10pLHZlcnRleFNoYWRlcjpqdC5wb2ludHNfdmVydCxmcmFnbWVudFNoYWRlcjpqdC5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3JtczpjbihbcHQuY29tbW9uLHB0LmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjpqdC5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6anQubGluZWRhc2hlZF9mcmFnfSxkZXB0aDp7dW5pZm9ybXM6Y24oW3B0LmNvbW1vbixwdC5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6anQuZGVwdGhfdmVydCxmcmFnbWVudFNoYWRlcjpqdC5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOmNuKFtwdC5jb21tb24scHQuYnVtcG1hcCxwdC5ub3JtYWxtYXAscHQuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6anQubWVzaG5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOmp0Lm1lc2hub3JtYWxfZnJhZ30sc3ByaXRlOnt1bmlmb3JtczpjbihbcHQuc3ByaXRlLHB0LmZvZ10pLHZlcnRleFNoYWRlcjpqdC5zcHJpdGVfdmVydCxmcmFnbWVudFNoYWRlcjpqdC5zcHJpdGVfZnJhZ30sYmFja2dyb3VuZDp7dW5pZm9ybXM6e3V2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LHQyRDp7dmFsdWU6bnVsbH0sYmFja2dyb3VuZEludGVuc2l0eTp7dmFsdWU6MX19LHZlcnRleFNoYWRlcjpqdC5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6anQuYmFja2dyb3VuZF9mcmFnfSxiYWNrZ3JvdW5kQ3ViZTp7dW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9LGJhY2tncm91bmRCbHVycmluZXNzOnt2YWx1ZTowfSxiYWNrZ3JvdW5kSW50ZW5zaXR5Ont2YWx1ZToxfSxiYWNrZ3JvdW5kUm90YXRpb246e3ZhbHVlOm5ldyBXdH19LHZlcnRleFNoYWRlcjpqdC5iYWNrZ3JvdW5kQ3ViZV92ZXJ0LGZyYWdtZW50U2hhZGVyOmp0LmJhY2tncm91bmRDdWJlX2ZyYWd9LGN1YmU6e3VuaWZvcm1zOnt0Q3ViZTp7dmFsdWU6bnVsbH0sdEZsaXA6e3ZhbHVlOi0xfSxvcGFjaXR5Ont2YWx1ZToxfX0sdmVydGV4U2hhZGVyOmp0LmN1YmVfdmVydCxmcmFnbWVudFNoYWRlcjpqdC5jdWJlX2ZyYWd9LGVxdWlyZWN0Ont1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOmp0LmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6anQuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpjbihbcHQuY29tbW9uLHB0LmRpc3BsYWNlbWVudG1hcCx7cmVmZXJlbmNlUG9zaXRpb246e3ZhbHVlOm5ldyBSfSxuZWFyRGlzdGFuY2U6e3ZhbHVlOjF9LGZhckRpc3RhbmNlOnt2YWx1ZToxZTN9fV0pLHZlcnRleFNoYWRlcjpqdC5kaXN0YW5jZVJHQkFfdmVydCxmcmFnbWVudFNoYWRlcjpqdC5kaXN0YW5jZVJHQkFfZnJhZ30sc2hhZG93Ont1bmlmb3JtczpjbihbcHQubGlnaHRzLHB0LmZvZyx7Y29sb3I6e3ZhbHVlOm5ldyB4dCgwKX0sb3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOmp0LnNoYWRvd192ZXJ0LGZyYWdtZW50U2hhZGVyOmp0LnNoYWRvd19mcmFnfX07cGkucGh5c2ljYWw9e3VuaWZvcm1zOmNuKFtwaS5zdGFuZGFyZC51bmlmb3Jtcyx7Y2xlYXJjb2F0Ont2YWx1ZTowfSxjbGVhcmNvYXRNYXA6e3ZhbHVlOm51bGx9LGNsZWFyY29hdE1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxjbGVhcmNvYXROb3JtYWxNYXA6e3ZhbHVlOm51bGx9LGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxjbGVhcmNvYXROb3JtYWxTY2FsZTp7dmFsdWU6bmV3IFgoMSwxKX0sY2xlYXJjb2F0Um91Z2huZXNzOnt2YWx1ZTowfSxjbGVhcmNvYXRSb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxkaXNwZXJzaW9uOnt2YWx1ZTowfSxpcmlkZXNjZW5jZTp7dmFsdWU6MH0saXJpZGVzY2VuY2VNYXA6e3ZhbHVlOm51bGx9LGlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGlyaWRlc2NlbmNlSU9SOnt2YWx1ZToxLjN9LGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTp7dmFsdWU6MTAwfSxpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW06e3ZhbHVlOjQwMH0saXJpZGVzY2VuY2VUaGlja25lc3NNYXA6e3ZhbHVlOm51bGx9LGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LHNoZWVuOnt2YWx1ZTowfSxzaGVlbkNvbG9yOnt2YWx1ZTpuZXcgeHQoMCl9LHNoZWVuQ29sb3JNYXA6e3ZhbHVlOm51bGx9LHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sc2hlZW5Sb3VnaG5lc3M6e3ZhbHVlOjF9LHNoZWVuUm91Z2huZXNzTWFwOnt2YWx1ZTpudWxsfSxzaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSx0cmFuc21pc3Npb246e3ZhbHVlOjB9LHRyYW5zbWlzc2lvbk1hcDp7dmFsdWU6bnVsbH0sdHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LHRyYW5zbWlzc2lvblNhbXBsZXJTaXplOnt2YWx1ZTpuZXcgWH0sdHJhbnNtaXNzaW9uU2FtcGxlck1hcDp7dmFsdWU6bnVsbH0sdGhpY2tuZXNzOnt2YWx1ZTowfSx0aGlja25lc3NNYXA6e3ZhbHVlOm51bGx9LHRoaWNrbmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxhdHRlbnVhdGlvbkRpc3RhbmNlOnt2YWx1ZTowfSxhdHRlbnVhdGlvbkNvbG9yOnt2YWx1ZTpuZXcgeHQoMCl9LHNwZWN1bGFyQ29sb3I6e3ZhbHVlOm5ldyB4dCgxLDEsMSl9LHNwZWN1bGFyQ29sb3JNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sc3BlY3VsYXJJbnRlbnNpdHk6e3ZhbHVlOjF9LHNwZWN1bGFySW50ZW5zaXR5TWFwOnt2YWx1ZTpudWxsfSxzcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxhbmlzb3Ryb3B5VmVjdG9yOnt2YWx1ZTpuZXcgWH0sYW5pc290cm9weU1hcDp7dmFsdWU6bnVsbH0sYW5pc290cm9weU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fX1dKSx2ZXJ0ZXhTaGFkZXI6anQubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6anQubWVzaHBoeXNpY2FsX2ZyYWd9O2NvbnN0IFl1PXtyOjAsYjowLGc6MH0seHM9bmV3IEJuLGpSPW5ldyBSdDtmdW5jdGlvbiBLUihpLHQsZSxuLHIscyxvKXtjb25zdCBhPW5ldyB4dCgwKTtsZXQgbD1zPT09ITA/MDoxLGMsdSxoPW51bGwsZj0wLGQ9bnVsbDtmdW5jdGlvbiBwKHgpe2xldCBfPXguaXNTY2VuZT09PSEwP3guYmFja2dyb3VuZDpudWxsO3JldHVybiBfJiZfLmlzVGV4dHVyZSYmKF89KHguYmFja2dyb3VuZEJsdXJyaW5lc3M+MD9lOnQpLmdldChfKSksX31mdW5jdGlvbiB5KHgpe2xldCBfPSExO2NvbnN0IE09cCh4KTtNPT09bnVsbD9tKGEsbCk6TSYmTS5pc0NvbG9yJiYobShNLDEpLF89ITApO2NvbnN0IGI9aS54ci5nZXRFbnZpcm9ubWVudEJsZW5kTW9kZSgpO2I9PT0iYWRkaXRpdmUiP24uYnVmZmVycy5jb2xvci5zZXRDbGVhcigwLDAsMCwxLG8pOmI9PT0iYWxwaGEtYmxlbmQiJiZuLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoMCwwLDAsMCxvKSwoaS5hdXRvQ2xlYXJ8fF8pJiYobi5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLG4uYnVmZmVycy5kZXB0aC5zZXRNYXNrKCEwKSxuLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCksaS5jbGVhcihpLmF1dG9DbGVhckNvbG9yLGkuYXV0b0NsZWFyRGVwdGgsaS5hdXRvQ2xlYXJTdGVuY2lsKSl9ZnVuY3Rpb24gZyh4LF8pe2NvbnN0IE09cChfKTtNJiYoTS5pc0N1YmVUZXh0dXJlfHxNLm1hcHBpbmc9PT1xcyk/KHU9PT12b2lkIDAmJih1PW5ldyBVZShuZXcgcnMoMSwxLDEpLG5ldyB1aSh7bmFtZToiQmFja2dyb3VuZEN1YmVNYXRlcmlhbCIsdW5pZm9ybXM6aG8ocGkuYmFja2dyb3VuZEN1YmUudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpwaS5iYWNrZ3JvdW5kQ3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6cGkuYmFja2dyb3VuZEN1YmUuZnJhZ21lbnRTaGFkZXIsc2lkZTpKZSxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksdS5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLHUuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJ1diIpLHUub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oYixBLEUpe3RoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKEUubWF0cml4V29ybGQpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodS5tYXRlcmlhbCwiZW52TWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuZW52TWFwLnZhbHVlfX0pLHIudXBkYXRlKHUpKSx4cy5jb3B5KF8uYmFja2dyb3VuZFJvdGF0aW9uKSx4cy54Kj0tMSx4cy55Kj0tMSx4cy56Kj0tMSxNLmlzQ3ViZVRleHR1cmUmJk0uaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITEmJih4cy55Kj0tMSx4cy56Kj0tMSksdS5tYXRlcmlhbC51bmlmb3Jtcy5lbnZNYXAudmFsdWU9TSx1Lm1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWU9TS5pc0N1YmVUZXh0dXJlJiZNLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExPy0xOjEsdS5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcy52YWx1ZT1fLmJhY2tncm91bmRCbHVycmluZXNzLHUubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEludGVuc2l0eS52YWx1ZT1fLmJhY2tncm91bmRJbnRlbnNpdHksdS5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kUm90YXRpb24udmFsdWUuc2V0RnJvbU1hdHJpeDQoalIubWFrZVJvdGF0aW9uRnJvbUV1bGVyKHhzKSksdS5tYXRlcmlhbC50b25lTWFwcGVkPXJlLmdldFRyYW5zZmVyKE0uY29sb3JTcGFjZSkhPT1wZSwoaCE9PU18fGYhPT1NLnZlcnNpb258fGQhPT1pLnRvbmVNYXBwaW5nKSYmKHUubWF0ZXJpYWwubmVlZHNVcGRhdGU9ITAsaD1NLGY9TS52ZXJzaW9uLGQ9aS50b25lTWFwcGluZyksdS5sYXllcnMuZW5hYmxlQWxsKCkseC51bnNoaWZ0KHUsdS5nZW9tZXRyeSx1Lm1hdGVyaWFsLDAsMCxudWxsKSk6TSYmTS5pc1RleHR1cmUmJihjPT09dm9pZCAwJiYoYz1uZXcgVWUobmV3IHVzKDIsMiksbmV3IHVpKHtuYW1lOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOmhvKHBpLmJhY2tncm91bmQudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpwaS5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpwaS5iYWNrZ3JvdW5kLmZyYWdtZW50U2hhZGVyLHNpZGU6c2ksZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLGMuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYy5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLHIudXBkYXRlKGMpKSxjLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1NLGMubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEludGVuc2l0eS52YWx1ZT1fLmJhY2tncm91bmRJbnRlbnNpdHksYy5tYXRlcmlhbC50b25lTWFwcGVkPXJlLmdldFRyYW5zZmVyKE0uY29sb3JTcGFjZSkhPT1wZSxNLm1hdHJpeEF1dG9VcGRhdGU9PT0hMCYmTS51cGRhdGVNYXRyaXgoKSxjLm1hdGVyaWFsLnVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoTS5tYXRyaXgpLChoIT09TXx8ZiE9PU0udmVyc2lvbnx8ZCE9PWkudG9uZU1hcHBpbmcpJiYoYy5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxoPU0sZj1NLnZlcnNpb24sZD1pLnRvbmVNYXBwaW5nKSxjLmxheWVycy5lbmFibGVBbGwoKSx4LnVuc2hpZnQoYyxjLmdlb21ldHJ5LGMubWF0ZXJpYWwsMCwwLG51bGwpKX1mdW5jdGlvbiBtKHgsXyl7eC5nZXRSR0IoWXUsRnkoaSkpLG4uYnVmZmVycy5jb2xvci5zZXRDbGVhcihZdS5yLFl1LmcsWXUuYixfLG8pfWZ1bmN0aW9uIHYoKXt1IT09dm9pZCAwJiYodS5nZW9tZXRyeS5kaXNwb3NlKCksdS5tYXRlcmlhbC5kaXNwb3NlKCkpLGMhPT12b2lkIDAmJihjLmdlb21ldHJ5LmRpc3Bvc2UoKSxjLm1hdGVyaWFsLmRpc3Bvc2UoKSl9cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbih4LF89MSl7YS5zZXQoeCksbD1fLG0oYSxsKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKHgpe2w9eCxtKGEsbCl9LHJlbmRlcjp5LGFkZFRvUmVuZGVyTGlzdDpnLGRpc3Bvc2U6dn19ZnVuY3Rpb24gUVIoaSx0KXtjb25zdCBlPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1ZFUlRFWF9BVFRSSUJTKSxuPXt9LHI9ZihudWxsKTtsZXQgcz1yLG89ITE7ZnVuY3Rpb24gYShTLFQsRCxMLE4pe2xldCBGPSExO2NvbnN0IEI9aChMLEQsVCk7cyE9PUImJihzPUIsYyhzLm9iamVjdCkpLEY9ZChTLEwsRCxOKSxGJiZwKFMsTCxELE4pLE4hPT1udWxsJiZ0LnVwZGF0ZShOLGkuRUxFTUVOVF9BUlJBWV9CVUZGRVIpLChGfHxvKSYmKG89ITEsXyhTLFQsRCxMKSxOIT09bnVsbCYmaS5iaW5kQnVmZmVyKGkuRUxFTUVOVF9BUlJBWV9CVUZGRVIsdC5nZXQoTikuYnVmZmVyKSl9ZnVuY3Rpb24gbCgpe3JldHVybiBpLmNyZWF0ZVZlcnRleEFycmF5KCl9ZnVuY3Rpb24gYyhTKXtyZXR1cm4gaS5iaW5kVmVydGV4QXJyYXkoUyl9ZnVuY3Rpb24gdShTKXtyZXR1cm4gaS5kZWxldGVWZXJ0ZXhBcnJheShTKX1mdW5jdGlvbiBoKFMsVCxEKXtjb25zdCBMPUQud2lyZWZyYW1lPT09ITA7bGV0IE49bltTLmlkXTtOPT09dm9pZCAwJiYoTj17fSxuW1MuaWRdPU4pO2xldCBGPU5bVC5pZF07Rj09PXZvaWQgMCYmKEY9e30sTltULmlkXT1GKTtsZXQgQj1GW0xdO3JldHVybiBCPT09dm9pZCAwJiYoQj1mKGwoKSksRltMXT1CKSxCfWZ1bmN0aW9uIGYoUyl7Y29uc3QgVD1bXSxEPVtdLEw9W107Zm9yKGxldCBOPTA7TjxlO04rKylUW05dPTAsRFtOXT0wLExbTl09MDtyZXR1cm57Z2VvbWV0cnk6bnVsbCxwcm9ncmFtOm51bGwsd2lyZWZyYW1lOiExLG5ld0F0dHJpYnV0ZXM6VCxlbmFibGVkQXR0cmlidXRlczpELGF0dHJpYnV0ZURpdmlzb3JzOkwsb2JqZWN0OlMsYXR0cmlidXRlczp7fSxpbmRleDpudWxsfX1mdW5jdGlvbiBkKFMsVCxELEwpe2NvbnN0IE49cy5hdHRyaWJ1dGVzLEY9VC5hdHRyaWJ1dGVzO2xldCBCPTA7Y29uc3QgRz1ELmdldEF0dHJpYnV0ZXMoKTtmb3IoY29uc3QgayBpbiBHKWlmKEdba10ubG9jYXRpb24+PTApe2NvbnN0IGN0PU5ba107bGV0IGh0PUZba107aWYoaHQ9PT12b2lkIDAmJihrPT09Imluc3RhbmNlTWF0cml4IiYmUy5pbnN0YW5jZU1hdHJpeCYmKGh0PVMuaW5zdGFuY2VNYXRyaXgpLGs9PT0iaW5zdGFuY2VDb2xvciImJlMuaW5zdGFuY2VDb2xvciYmKGh0PVMuaW5zdGFuY2VDb2xvcikpLGN0PT09dm9pZCAwfHxjdC5hdHRyaWJ1dGUhPT1odHx8aHQmJmN0LmRhdGEhPT1odC5kYXRhKXJldHVybiEwO0IrK31yZXR1cm4gcy5hdHRyaWJ1dGVzTnVtIT09Qnx8cy5pbmRleCE9PUx9ZnVuY3Rpb24gcChTLFQsRCxMKXtjb25zdCBOPXt9LEY9VC5hdHRyaWJ1dGVzO2xldCBCPTA7Y29uc3QgRz1ELmdldEF0dHJpYnV0ZXMoKTtmb3IoY29uc3QgayBpbiBHKWlmKEdba10ubG9jYXRpb24+PTApe2xldCBjdD1GW2tdO2N0PT09dm9pZCAwJiYoaz09PSJpbnN0YW5jZU1hdHJpeCImJlMuaW5zdGFuY2VNYXRyaXgmJihjdD1TLmluc3RhbmNlTWF0cml4KSxrPT09Imluc3RhbmNlQ29sb3IiJiZTLmluc3RhbmNlQ29sb3ImJihjdD1TLmluc3RhbmNlQ29sb3IpKTtjb25zdCBodD17fTtodC5hdHRyaWJ1dGU9Y3QsY3QmJmN0LmRhdGEmJihodC5kYXRhPWN0LmRhdGEpLE5ba109aHQsQisrfXMuYXR0cmlidXRlcz1OLHMuYXR0cmlidXRlc051bT1CLHMuaW5kZXg9TH1mdW5jdGlvbiB5KCl7Y29uc3QgUz1zLm5ld0F0dHJpYnV0ZXM7Zm9yKGxldCBUPTAsRD1TLmxlbmd0aDtUPEQ7VCsrKVNbVF09MH1mdW5jdGlvbiBnKFMpe20oUywwKX1mdW5jdGlvbiBtKFMsVCl7Y29uc3QgRD1zLm5ld0F0dHJpYnV0ZXMsTD1zLmVuYWJsZWRBdHRyaWJ1dGVzLE49cy5hdHRyaWJ1dGVEaXZpc29ycztEW1NdPTEsTFtTXT09PTAmJihpLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFMpLExbU109MSksTltTXSE9PVQmJihpLnZlcnRleEF0dHJpYkRpdmlzb3IoUyxUKSxOW1NdPVQpfWZ1bmN0aW9uIHYoKXtjb25zdCBTPXMubmV3QXR0cmlidXRlcyxUPXMuZW5hYmxlZEF0dHJpYnV0ZXM7Zm9yKGxldCBEPTAsTD1ULmxlbmd0aDtEPEw7RCsrKVRbRF0hPT1TW0RdJiYoaS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoRCksVFtEXT0wKX1mdW5jdGlvbiB4KFMsVCxELEwsTixGLEIpe0I9PT0hMD9pLnZlcnRleEF0dHJpYklQb2ludGVyKFMsVCxELE4sRik6aS52ZXJ0ZXhBdHRyaWJQb2ludGVyKFMsVCxELEwsTixGKX1mdW5jdGlvbiBfKFMsVCxELEwpe3koKTtjb25zdCBOPUwuYXR0cmlidXRlcyxGPUQuZ2V0QXR0cmlidXRlcygpLEI9VC5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO2Zvcihjb25zdCBHIGluIEYpe2NvbnN0IGs9RltHXTtpZihrLmxvY2F0aW9uPj0wKXtsZXQgUT1OW0ddO2lmKFE9PT12b2lkIDAmJihHPT09Imluc3RhbmNlTWF0cml4IiYmUy5pbnN0YW5jZU1hdHJpeCYmKFE9Uy5pbnN0YW5jZU1hdHJpeCksRz09PSJpbnN0YW5jZUNvbG9yIiYmUy5pbnN0YW5jZUNvbG9yJiYoUT1TLmluc3RhbmNlQ29sb3IpKSxRIT09dm9pZCAwKXtjb25zdCBjdD1RLm5vcm1hbGl6ZWQsaHQ9US5pdGVtU2l6ZSxQdD10LmdldChRKTtpZihQdD09PXZvaWQgMCljb250aW51ZTtjb25zdCBYdD1QdC5idWZmZXIsaj1QdC50eXBlLHJ0PVB0LmJ5dGVzUGVyRWxlbWVudCxFdD1qPT09aS5JTlR8fGo9PT1pLlVOU0lHTkVEX0lOVHx8US5ncHVUeXBlPT09UWw7aWYoUS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCB1dD1RLmRhdGEsTHQ9dXQuc3RyaWRlLE90PVEub2Zmc2V0O2lmKHV0LmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIpe2ZvcihsZXQgSXQ9MDtJdDxrLmxvY2F0aW9uU2l6ZTtJdCsrKW0oay5sb2NhdGlvbitJdCx1dC5tZXNoUGVyQXR0cmlidXRlKTtTLmlzSW5zdGFuY2VkTWVzaCE9PSEwJiZMLl9tYXhJbnN0YW5jZUNvdW50PT09dm9pZCAwJiYoTC5fbWF4SW5zdGFuY2VDb3VudD11dC5tZXNoUGVyQXR0cmlidXRlKnV0LmNvdW50KX1lbHNlIGZvcihsZXQgSXQ9MDtJdDxrLmxvY2F0aW9uU2l6ZTtJdCsrKWcoay5sb2NhdGlvbitJdCk7aS5iaW5kQnVmZmVyKGkuQVJSQVlfQlVGRkVSLFh0KTtmb3IobGV0IEl0PTA7SXQ8ay5sb2NhdGlvblNpemU7SXQrKyl4KGsubG9jYXRpb24rSXQsaHQvay5sb2NhdGlvblNpemUsaixjdCxMdCpydCwoT3QraHQvay5sb2NhdGlvblNpemUqSXQpKnJ0LEV0KX1lbHNle2lmKFEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUpe2ZvcihsZXQgdXQ9MDt1dDxrLmxvY2F0aW9uU2l6ZTt1dCsrKW0oay5sb2NhdGlvbit1dCxRLm1lc2hQZXJBdHRyaWJ1dGUpO1MuaXNJbnN0YW5jZWRNZXNoIT09ITAmJkwuX21heEluc3RhbmNlQ291bnQ9PT12b2lkIDAmJihMLl9tYXhJbnN0YW5jZUNvdW50PVEubWVzaFBlckF0dHJpYnV0ZSpRLmNvdW50KX1lbHNlIGZvcihsZXQgdXQ9MDt1dDxrLmxvY2F0aW9uU2l6ZTt1dCsrKWcoay5sb2NhdGlvbit1dCk7aS5iaW5kQnVmZmVyKGkuQVJSQVlfQlVGRkVSLFh0KTtmb3IobGV0IHV0PTA7dXQ8ay5sb2NhdGlvblNpemU7dXQrKyl4KGsubG9jYXRpb24rdXQsaHQvay5sb2NhdGlvblNpemUsaixjdCxodCpydCxodC9rLmxvY2F0aW9uU2l6ZSp1dCpydCxFdCl9fWVsc2UgaWYoQiE9PXZvaWQgMCl7Y29uc3QgY3Q9QltHXTtpZihjdCE9PXZvaWQgMClzd2l0Y2goY3QubGVuZ3RoKXtjYXNlIDI6aS52ZXJ0ZXhBdHRyaWIyZnYoay5sb2NhdGlvbixjdCk7YnJlYWs7Y2FzZSAzOmkudmVydGV4QXR0cmliM2Z2KGsubG9jYXRpb24sY3QpO2JyZWFrO2Nhc2UgNDppLnZlcnRleEF0dHJpYjRmdihrLmxvY2F0aW9uLGN0KTticmVhaztkZWZhdWx0OmkudmVydGV4QXR0cmliMWZ2KGsubG9jYXRpb24sY3QpfX19fXYoKX1mdW5jdGlvbiBNKCl7RSgpO2Zvcihjb25zdCBTIGluIG4pe2NvbnN0IFQ9bltTXTtmb3IoY29uc3QgRCBpbiBUKXtjb25zdCBMPVRbRF07Zm9yKGNvbnN0IE4gaW4gTCl1KExbTl0ub2JqZWN0KSxkZWxldGUgTFtOXTtkZWxldGUgVFtEXX1kZWxldGUgbltTXX19ZnVuY3Rpb24gYihTKXtpZihuW1MuaWRdPT09dm9pZCAwKXJldHVybjtjb25zdCBUPW5bUy5pZF07Zm9yKGNvbnN0IEQgaW4gVCl7Y29uc3QgTD1UW0RdO2Zvcihjb25zdCBOIGluIEwpdShMW05dLm9iamVjdCksZGVsZXRlIExbTl07ZGVsZXRlIFRbRF19ZGVsZXRlIG5bUy5pZF19ZnVuY3Rpb24gQShTKXtmb3IoY29uc3QgVCBpbiBuKXtjb25zdCBEPW5bVF07aWYoRFtTLmlkXT09PXZvaWQgMCljb250aW51ZTtjb25zdCBMPURbUy5pZF07Zm9yKGNvbnN0IE4gaW4gTCl1KExbTl0ub2JqZWN0KSxkZWxldGUgTFtOXTtkZWxldGUgRFtTLmlkXX19ZnVuY3Rpb24gRSgpe3coKSxvPSEwLHMhPT1yJiYocz1yLGMocy5vYmplY3QpKX1mdW5jdGlvbiB3KCl7ci5nZW9tZXRyeT1udWxsLHIucHJvZ3JhbT1udWxsLHIud2lyZWZyYW1lPSExfXJldHVybntzZXR1cDphLHJlc2V0OkUscmVzZXREZWZhdWx0U3RhdGU6dyxkaXNwb3NlOk0scmVsZWFzZVN0YXRlc09mR2VvbWV0cnk6YixyZWxlYXNlU3RhdGVzT2ZQcm9ncmFtOkEsaW5pdEF0dHJpYnV0ZXM6eSxlbmFibGVBdHRyaWJ1dGU6ZyxkaXNhYmxlVW51c2VkQXR0cmlidXRlczp2fX1mdW5jdGlvbiB0UChpLHQsZSl7bGV0IG47ZnVuY3Rpb24gcihjKXtuPWN9ZnVuY3Rpb24gcyhjLHUpe2kuZHJhd0FycmF5cyhuLGMsdSksZS51cGRhdGUodSxuLDEpfWZ1bmN0aW9uIG8oYyx1LGgpe2ghPT0wJiYoaS5kcmF3QXJyYXlzSW5zdGFuY2VkKG4sYyx1LGgpLGUudXBkYXRlKHUsbixoKSl9ZnVuY3Rpb24gYShjLHUsaCl7aWYoaD09PTApcmV0dXJuO3QuZ2V0KCJXRUJHTF9tdWx0aV9kcmF3IikubXVsdGlEcmF3QXJyYXlzV0VCR0wobixjLDAsdSwwLGgpO2xldCBkPTA7Zm9yKGxldCBwPTA7cDxoO3ArKylkKz11W3BdO2UudXBkYXRlKGQsbiwxKX1mdW5jdGlvbiBsKGMsdSxoLGYpe2lmKGg9PT0wKXJldHVybjtjb25zdCBkPXQuZ2V0KCJXRUJHTF9tdWx0aV9kcmF3Iik7aWYoZD09PW51bGwpZm9yKGxldCBwPTA7cDxjLmxlbmd0aDtwKyspbyhjW3BdLHVbcF0sZltwXSk7ZWxzZXtkLm11bHRpRHJhd0FycmF5c0luc3RhbmNlZFdFQkdMKG4sYywwLHUsMCxmLDAsaCk7bGV0IHA9MDtmb3IobGV0IHk9MDt5PGg7eSsrKXArPXVbeV0qZlt5XTtlLnVwZGF0ZShwLG4sMSl9fXRoaXMuc2V0TW9kZT1yLHRoaXMucmVuZGVyPXMsdGhpcy5yZW5kZXJJbnN0YW5jZXM9byx0aGlzLnJlbmRlck11bHRpRHJhdz1hLHRoaXMucmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzPWx9ZnVuY3Rpb24gZVAoaSx0LGUsbil7bGV0IHI7ZnVuY3Rpb24gcygpe2lmKHIhPT12b2lkIDApcmV0dXJuIHI7aWYodC5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpPT09ITApe2NvbnN0IEE9dC5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO3I9aS5nZXRQYXJhbWV0ZXIoQS5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpfWVsc2Ugcj0wO3JldHVybiByfWZ1bmN0aW9uIG8oQSl7cmV0dXJuIShBIT09YW4mJm4uY29udmVydChBKSE9PWkuZ2V0UGFyYW1ldGVyKGkuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQpKX1mdW5jdGlvbiBhKEEpe2NvbnN0IEU9QT09PUpzJiYodC5oYXMoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpfHx0LmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKTtyZXR1cm4hKEEhPT1BaSYmbi5jb252ZXJ0KEEpIT09aS5nZXRQYXJhbWV0ZXIoaS5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUpJiZBIT09dm4mJiFFKX1mdW5jdGlvbiBsKEEpe2lmKEE9PT0iaGlnaHAiKXtpZihpLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChpLlZFUlRFWF9TSEFERVIsaS5ISUdIX0ZMT0FUKS5wcmVjaXNpb24+MCYmaS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoaS5GUkFHTUVOVF9TSEFERVIsaS5ISUdIX0ZMT0FUKS5wcmVjaXNpb24+MClyZXR1cm4iaGlnaHAiO0E9Im1lZGl1bXAifXJldHVybiBBPT09Im1lZGl1bXAiJiZpLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChpLlZFUlRFWF9TSEFERVIsaS5NRURJVU1fRkxPQVQpLnByZWNpc2lvbj4wJiZpLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChpLkZSQUdNRU5UX1NIQURFUixpLk1FRElVTV9GTE9BVCkucHJlY2lzaW9uPjA/Im1lZGl1bXAiOiJsb3dwIn1sZXQgYz1lLnByZWNpc2lvbiE9PXZvaWQgMD9lLnByZWNpc2lvbjoiaGlnaHAiO2NvbnN0IHU9bChjKTt1IT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLGMsIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIix1LCJpbnN0ZWFkLiIpLGM9dSk7Y29uc3QgaD1lLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI9PT0hMCxmPWUucmV2ZXJzZURlcHRoQnVmZmVyPT09ITAmJnQuaGFzKCJFWFRfY2xpcF9jb250cm9sIiksZD1pLmdldFBhcmFtZXRlcihpLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSxwPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTKSx5PWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1RFWFRVUkVfU0laRSksZz1pLmdldFBhcmFtZXRlcihpLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUpLG09aS5nZXRQYXJhbWV0ZXIoaS5NQVhfVkVSVEVYX0FUVFJJQlMpLHY9aS5nZXRQYXJhbWV0ZXIoaS5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUykseD1pLmdldFBhcmFtZXRlcihpLk1BWF9WQVJZSU5HX1ZFQ1RPUlMpLF89aS5nZXRQYXJhbWV0ZXIoaS5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKSxNPXA+MCxiPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1NBTVBMRVMpO3JldHVybntpc1dlYkdMMjohMCxnZXRNYXhBbmlzb3Ryb3B5OnMsZ2V0TWF4UHJlY2lzaW9uOmwsdGV4dHVyZUZvcm1hdFJlYWRhYmxlOm8sdGV4dHVyZVR5cGVSZWFkYWJsZTphLHByZWNpc2lvbjpjLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6aCxyZXZlcnNlRGVwdGhCdWZmZXI6ZixtYXhUZXh0dXJlczpkLG1heFZlcnRleFRleHR1cmVzOnAsbWF4VGV4dHVyZVNpemU6eSxtYXhDdWJlbWFwU2l6ZTpnLG1heEF0dHJpYnV0ZXM6bSxtYXhWZXJ0ZXhVbmlmb3Jtczp2LG1heFZhcnlpbmdzOngsbWF4RnJhZ21lbnRVbmlmb3JtczpfLHZlcnRleFRleHR1cmVzOk0sbWF4U2FtcGxlczpifX1mdW5jdGlvbiBuUChpKXtjb25zdCB0PXRoaXM7bGV0IGU9bnVsbCxuPTAscj0hMSxzPSExO2NvbnN0IG89bmV3IGhpLGE9bmV3IFd0LGw9e3ZhbHVlOm51bGwsbmVlZHNVcGRhdGU6ITF9O3RoaXMudW5pZm9ybT1sLHRoaXMubnVtUGxhbmVzPTAsdGhpcy5udW1JbnRlcnNlY3Rpb249MCx0aGlzLmluaXQ9ZnVuY3Rpb24oaCxmKXtjb25zdCBkPWgubGVuZ3RoIT09MHx8Znx8biE9PTB8fHI7cmV0dXJuIHI9ZixuPWgubGVuZ3RoLGR9LHRoaXMuYmVnaW5TaGFkb3dzPWZ1bmN0aW9uKCl7cz0hMCx1KG51bGwpfSx0aGlzLmVuZFNoYWRvd3M9ZnVuY3Rpb24oKXtzPSExfSx0aGlzLnNldEdsb2JhbFN0YXRlPWZ1bmN0aW9uKGgsZil7ZT11KGgsZiwwKX0sdGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihoLGYsZCl7Y29uc3QgcD1oLmNsaXBwaW5nUGxhbmVzLHk9aC5jbGlwSW50ZXJzZWN0aW9uLGc9aC5jbGlwU2hhZG93cyxtPWkuZ2V0KGgpO2lmKCFyfHxwPT09bnVsbHx8cC5sZW5ndGg9PT0wfHxzJiYhZylzP3UobnVsbCk6YygpO2Vsc2V7Y29uc3Qgdj1zPzA6bix4PXYqNDtsZXQgXz1tLmNsaXBwaW5nU3RhdGV8fG51bGw7bC52YWx1ZT1fLF89dShwLGYseCxkKTtmb3IobGV0IE09MDtNIT09eDsrK00pX1tNXT1lW01dO20uY2xpcHBpbmdTdGF0ZT1fLHRoaXMubnVtSW50ZXJzZWN0aW9uPXk/dGhpcy5udW1QbGFuZXM6MCx0aGlzLm51bVBsYW5lcys9dn19O2Z1bmN0aW9uIGMoKXtsLnZhbHVlIT09ZSYmKGwudmFsdWU9ZSxsLm5lZWRzVXBkYXRlPW4+MCksdC5udW1QbGFuZXM9bix0Lm51bUludGVyc2VjdGlvbj0wfWZ1bmN0aW9uIHUoaCxmLGQscCl7Y29uc3QgeT1oIT09bnVsbD9oLmxlbmd0aDowO2xldCBnPW51bGw7aWYoeSE9PTApe2lmKGc9bC52YWx1ZSxwIT09ITB8fGc9PT1udWxsKXtjb25zdCBtPWQreSo0LHY9Zi5tYXRyaXhXb3JsZEludmVyc2U7YS5nZXROb3JtYWxNYXRyaXgodiksKGc9PT1udWxsfHxnLmxlbmd0aDxtKSYmKGc9bmV3IEZsb2F0MzJBcnJheShtKSk7Zm9yKGxldCB4PTAsXz1kO3ghPT15OysreCxfKz00KW8uY29weShoW3hdKS5hcHBseU1hdHJpeDQodixhKSxvLm5vcm1hbC50b0FycmF5KGcsXyksZ1tfKzNdPW8uY29uc3RhbnR9bC52YWx1ZT1nLGwubmVlZHNVcGRhdGU9ITB9cmV0dXJuIHQubnVtUGxhbmVzPXksdC5udW1JbnRlcnNlY3Rpb249MCxnfX1mdW5jdGlvbiBpUChpKXtsZXQgdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKG8sYSl7cmV0dXJuIGE9PT1sYT9vLm1hcHBpbmc9a2k6YT09PWNhJiYoby5tYXBwaW5nPW1yKSxvfWZ1bmN0aW9uIG4obyl7aWYobyYmby5pc1RleHR1cmUpe2NvbnN0IGE9by5tYXBwaW5nO2lmKGE9PT1sYXx8YT09PWNhKWlmKHQuaGFzKG8pKXtjb25zdCBsPXQuZ2V0KG8pLnRleHR1cmU7cmV0dXJuIGUobCxvLm1hcHBpbmcpfWVsc2V7Y29uc3QgbD1vLmltYWdlO2lmKGwmJmwuaGVpZ2h0PjApe2NvbnN0IGM9bmV3IFZ5KGwuaGVpZ2h0KTtyZXR1cm4gYy5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZShpLG8pLHQuc2V0KG8sYyksby5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixyKSxlKGMudGV4dHVyZSxvLm1hcHBpbmcpfWVsc2UgcmV0dXJuIG51bGx9fXJldHVybiBvfWZ1bmN0aW9uIHIobyl7Y29uc3QgYT1vLnRhcmdldDthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHIpO2NvbnN0IGw9dC5nZXQoYSk7bCE9PXZvaWQgMCYmKHQuZGVsZXRlKGEpLGwuZGlzcG9zZSgpKX1mdW5jdGlvbiBzKCl7dD1uZXcgV2Vha01hcH1yZXR1cm57Z2V0Om4sZGlzcG9zZTpzfX1jb25zdCB3bz00LFB4PVsuMTI1LC4yMTUsLjM1LC40NDYsLjUyNiwuNTgyXSx2cz0yMCxMcD1uZXcgenUsSXg9bmV3IHh0O2xldCBEcD1udWxsLFVwPTAsTnA9MCxGcD0hMTtjb25zdCBTcz0oMStNYXRoLnNxcnQoNSkpLzIsQW89MS9TcyxMeD1bbmV3IFIoLVNzLEFvLDApLG5ldyBSKFNzLEFvLDApLG5ldyBSKC1BbywwLFNzKSxuZXcgUihBbywwLFNzKSxuZXcgUigwLFNzLC1BbyksbmV3IFIoMCxTcyxBbyksbmV3IFIoLTEsMSwtMSksbmV3IFIoMSwxLC0xKSxuZXcgUigtMSwxLDEpLG5ldyBSKDEsMSwxKV07Y2xhc3MgQnB7Y29uc3RydWN0b3IodCl7dGhpcy5fcmVuZGVyZXI9dCx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD1udWxsLHRoaXMuX2xvZE1heD0wLHRoaXMuX2N1YmVTaXplPTAsdGhpcy5fbG9kUGxhbmVzPVtdLHRoaXMuX3NpemVMb2RzPVtdLHRoaXMuX3NpZ21hcz1bXSx0aGlzLl9ibHVyTWF0ZXJpYWw9bnVsbCx0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9bnVsbCx0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPW51bGwsdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2JsdXJNYXRlcmlhbCl9ZnJvbVNjZW5lKHQsZT0wLG49LjEscj0xMDApe0RwPXRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpLFVwPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCksTnA9dGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSxGcD10aGlzLl9yZW5kZXJlci54ci5lbmFibGVkLHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQ9ITEsdGhpcy5fc2V0U2l6ZSgyNTYpO2NvbnN0IHM9dGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7cmV0dXJuIHMuZGVwdGhCdWZmZXI9ITAsdGhpcy5fc2NlbmVUb0N1YmVVVih0LG4scixzKSxlPjAmJnRoaXMuX2JsdXIocywwLDAsZSksdGhpcy5fYXBwbHlQTVJFTShzKSx0aGlzLl9jbGVhbnVwKHMpLHN9ZnJvbUVxdWlyZWN0YW5ndWxhcih0LGU9bnVsbCl7cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKHQsZSl9ZnJvbUN1YmVtYXAodCxlPW51bGwpe3JldHVybiB0aGlzLl9mcm9tVGV4dHVyZSh0LGUpfWNvbXBpbGVDdWJlbWFwU2hhZGVyKCl7dGhpcy5fY3ViZW1hcE1hdGVyaWFsPT09bnVsbCYmKHRoaXMuX2N1YmVtYXBNYXRlcmlhbD1OeCgpLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9jdWJlbWFwTWF0ZXJpYWwpKX1jb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCl7dGhpcy5fZXF1aXJlY3RNYXRlcmlhbD09PW51bGwmJih0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPVV4KCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwpKX1kaXNwb3NlKCl7dGhpcy5fZGlzcG9zZSgpLHRoaXMuX2N1YmVtYXBNYXRlcmlhbCE9PW51bGwmJnRoaXMuX2N1YmVtYXBNYXRlcmlhbC5kaXNwb3NlKCksdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCE9PW51bGwmJnRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwuZGlzcG9zZSgpfV9zZXRTaXplKHQpe3RoaXMuX2xvZE1heD1NYXRoLmZsb29yKE1hdGgubG9nMih0KSksdGhpcy5fY3ViZVNpemU9TWF0aC5wb3coMix0aGlzLl9sb2RNYXgpfV9kaXNwb3NlKCl7dGhpcy5fYmx1ck1hdGVyaWFsIT09bnVsbCYmdGhpcy5fYmx1ck1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCE9PW51bGwmJnRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtmb3IobGV0IHQ9MDt0PHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7dCsrKXRoaXMuX2xvZFBsYW5lc1t0XS5kaXNwb3NlKCl9X2NsZWFudXAodCl7dGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KERwLFVwLE5wKSx0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkPUZwLHQuc2Npc3NvclRlc3Q9ITEsWnUodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9X2Zyb21UZXh0dXJlKHQsZSl7dC5tYXBwaW5nPT09a2l8fHQubWFwcGluZz09PW1yP3RoaXMuX3NldFNpemUodC5pbWFnZS5sZW5ndGg9PT0wPzE2OnQuaW1hZ2VbMF0ud2lkdGh8fHQuaW1hZ2VbMF0uaW1hZ2Uud2lkdGgpOnRoaXMuX3NldFNpemUodC5pbWFnZS53aWR0aC80KSxEcD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKSxVcD10aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpLE5wPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRnA9dGhpcy5fcmVuZGVyZXIueHIuZW5hYmxlZCx0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkPSExO2NvbnN0IG49ZXx8dGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7cmV0dXJuIHRoaXMuX3RleHR1cmVUb0N1YmVVVih0LG4pLHRoaXMuX2FwcGx5UE1SRU0obiksdGhpcy5fY2xlYW51cChuKSxufV9hbGxvY2F0ZVRhcmdldHMoKXtjb25zdCB0PTMqTWF0aC5tYXgodGhpcy5fY3ViZVNpemUsMTEyKSxlPTQqdGhpcy5fY3ViZVNpemUsbj17bWFnRmlsdGVyOlZlLG1pbkZpbHRlcjpWZSxnZW5lcmF0ZU1pcG1hcHM6ITEsdHlwZTpKcyxmb3JtYXQ6YW4sY29sb3JTcGFjZTpqcixkZXB0aEJ1ZmZlcjohMX0scj1EeCh0LGUsbik7aWYodGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ9PT1udWxsfHx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC53aWR0aCE9PXR8fHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmhlaWdodCE9PWUpe3RoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0IT09bnVsbCYmdGhpcy5fZGlzcG9zZSgpLHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PUR4KHQsZSxuKTtjb25zdHtfbG9kTWF4OnN9PXRoaXM7KHtzaXplTG9kczp0aGlzLl9zaXplTG9kcyxsb2RQbGFuZXM6dGhpcy5fbG9kUGxhbmVzLHNpZ21hczp0aGlzLl9zaWdtYXN9PXJQKHMpKSx0aGlzLl9ibHVyTWF0ZXJpYWw9c1Aocyx0LGUpfXJldHVybiByfV9jb21waWxlTWF0ZXJpYWwodCl7Y29uc3QgZT1uZXcgVWUodGhpcy5fbG9kUGxhbmVzWzBdLHQpO3RoaXMuX3JlbmRlcmVyLmNvbXBpbGUoZSxMcCl9X3NjZW5lVG9DdWJlVVYodCxlLG4scil7Y29uc3QgYT1uZXcgWWUoOTAsMSxlLG4pLGw9WzEsLTEsMSwxLDEsMV0sYz1bMSwxLDEsLTEsLTEsLTFdLHU9dGhpcy5fcmVuZGVyZXIsaD11LmF1dG9DbGVhcixmPXUudG9uZU1hcHBpbmc7dS5nZXRDbGVhckNvbG9yKEl4KSx1LnRvbmVNYXBwaW5nPXppLHUuYXV0b0NsZWFyPSExO2NvbnN0IGQ9bmV3IGJyKHtuYW1lOiJQTVJFTS5CYWNrZ3JvdW5kIixzaWRlOkplLGRlcHRoV3JpdGU6ITEsZGVwdGhUZXN0OiExfSkscD1uZXcgVWUobmV3IHJzLGQpO2xldCB5PSExO2NvbnN0IGc9dC5iYWNrZ3JvdW5kO2c/Zy5pc0NvbG9yJiYoZC5jb2xvci5jb3B5KGcpLHQuYmFja2dyb3VuZD1udWxsLHk9ITApOihkLmNvbG9yLmNvcHkoSXgpLHk9ITApO2ZvcihsZXQgbT0wO208NjttKyspe2NvbnN0IHY9bSUzO3Y9PT0wPyhhLnVwLnNldCgwLGxbbV0sMCksYS5sb29rQXQoY1ttXSwwLDApKTp2PT09MT8oYS51cC5zZXQoMCwwLGxbbV0pLGEubG9va0F0KDAsY1ttXSwwKSk6KGEudXAuc2V0KDAsbFttXSwwKSxhLmxvb2tBdCgwLDAsY1ttXSkpO2NvbnN0IHg9dGhpcy5fY3ViZVNpemU7WnUocix2KngsbT4yP3g6MCx4LHgpLHUuc2V0UmVuZGVyVGFyZ2V0KHIpLHkmJnUucmVuZGVyKHAsYSksdS5yZW5kZXIodCxhKX1wLmdlb21ldHJ5LmRpc3Bvc2UoKSxwLm1hdGVyaWFsLmRpc3Bvc2UoKSx1LnRvbmVNYXBwaW5nPWYsdS5hdXRvQ2xlYXI9aCx0LmJhY2tncm91bmQ9Z31fdGV4dHVyZVRvQ3ViZVVWKHQsZSl7Y29uc3Qgbj10aGlzLl9yZW5kZXJlcixyPXQubWFwcGluZz09PWtpfHx0Lm1hcHBpbmc9PT1tcjtyPyh0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9PT1udWxsJiYodGhpcy5fY3ViZW1hcE1hdGVyaWFsPU54KCkpLHRoaXMuX2N1YmVtYXBNYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITE/LTE6MSk6dGhpcy5fZXF1aXJlY3RNYXRlcmlhbD09PW51bGwmJih0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPVV4KCkpO2NvbnN0IHM9cj90aGlzLl9jdWJlbWFwTWF0ZXJpYWw6dGhpcy5fZXF1aXJlY3RNYXRlcmlhbCxvPW5ldyBVZSh0aGlzLl9sb2RQbGFuZXNbMF0scyksYT1zLnVuaWZvcm1zO2EuZW52TWFwLnZhbHVlPXQ7Y29uc3QgbD10aGlzLl9jdWJlU2l6ZTtadShlLDAsMCwzKmwsMipsKSxuLnNldFJlbmRlclRhcmdldChlKSxuLnJlbmRlcihvLExwKX1fYXBwbHlQTVJFTSh0KXtjb25zdCBlPXRoaXMuX3JlbmRlcmVyLG49ZS5hdXRvQ2xlYXI7ZS5hdXRvQ2xlYXI9ITE7Y29uc3Qgcj10aGlzLl9sb2RQbGFuZXMubGVuZ3RoO2ZvcihsZXQgcz0xO3M8cjtzKyspe2NvbnN0IG89TWF0aC5zcXJ0KHRoaXMuX3NpZ21hc1tzXSp0aGlzLl9zaWdtYXNbc10tdGhpcy5fc2lnbWFzW3MtMV0qdGhpcy5fc2lnbWFzW3MtMV0pLGE9THhbKHItcy0xKSVMeC5sZW5ndGhdO3RoaXMuX2JsdXIodCxzLTEscyxvLGEpfWUuYXV0b0NsZWFyPW59X2JsdXIodCxlLG4scixzKXtjb25zdCBvPXRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0O3RoaXMuX2hhbGZCbHVyKHQsbyxlLG4sciwibGF0aXR1ZGluYWwiLHMpLHRoaXMuX2hhbGZCbHVyKG8sdCxuLG4sciwibG9uZ2l0dWRpbmFsIixzKX1faGFsZkJsdXIodCxlLG4scixzLG8sYSl7Y29uc3QgbD10aGlzLl9yZW5kZXJlcixjPXRoaXMuX2JsdXJNYXRlcmlhbDtvIT09ImxhdGl0dWRpbmFsIiYmbyE9PSJsb25naXR1ZGluYWwiJiZjb25zb2xlLmVycm9yKCJibHVyIGRpcmVjdGlvbiBtdXN0IGJlIGVpdGhlciBsYXRpdHVkaW5hbCBvciBsb25naXR1ZGluYWwhIik7Y29uc3QgdT0zLGg9bmV3IFVlKHRoaXMuX2xvZFBsYW5lc1tyXSxjKSxmPWMudW5pZm9ybXMsZD10aGlzLl9zaXplTG9kc1tuXS0xLHA9aXNGaW5pdGUocyk/TWF0aC5QSS8oMipkKToyKk1hdGguUEkvKDIqdnMtMSkseT1zL3AsZz1pc0Zpbml0ZShzKT8xK01hdGguZmxvb3IodSp5KTp2cztnPnZzJiZjb25zb2xlLndhcm4oYHNpZ21hUmFkaWFucywgJHtzfSwgaXMgdG9vIGxhcmdlIGFuZCB3aWxsIGNsaXAsIGFzIGl0IHJlcXVlc3RlZCAke2d9IHNhbXBsZXMgd2hlbiB0aGUgbWF4aW11bSBpcyBzZXQgdG8gJHt2c31gKTtjb25zdCBtPVtdO2xldCB2PTA7Zm9yKGxldCBBPTA7QTx2czsrK0Epe2NvbnN0IEU9QS95LHc9TWF0aC5leHAoLUUqRS8yKTttLnB1c2godyksQT09PTA/dis9dzpBPGcmJih2Kz0yKncpfWZvcihsZXQgQT0wO0E8bS5sZW5ndGg7QSsrKW1bQV09bVtBXS92O2YuZW52TWFwLnZhbHVlPXQudGV4dHVyZSxmLnNhbXBsZXMudmFsdWU9ZyxmLndlaWdodHMudmFsdWU9bSxmLmxhdGl0dWRpbmFsLnZhbHVlPW89PT0ibGF0aXR1ZGluYWwiLGEmJihmLnBvbGVBeGlzLnZhbHVlPWEpO2NvbnN0e19sb2RNYXg6eH09dGhpcztmLmRUaGV0YS52YWx1ZT1wLGYubWlwSW50LnZhbHVlPXgtbjtjb25zdCBfPXRoaXMuX3NpemVMb2RzW3JdLE09MypfKihyPngtd28/ci14K3dvOjApLGI9NCoodGhpcy5fY3ViZVNpemUtXyk7WnUoZSxNLGIsMypfLDIqXyksbC5zZXRSZW5kZXJUYXJnZXQoZSksbC5yZW5kZXIoaCxMcCl9fWZ1bmN0aW9uIHJQKGkpe2NvbnN0IHQ9W10sZT1bXSxuPVtdO2xldCByPWk7Y29uc3Qgcz1pLXdvKzErUHgubGVuZ3RoO2ZvcihsZXQgbz0wO288cztvKyspe2NvbnN0IGE9TWF0aC5wb3coMixyKTtlLnB1c2goYSk7bGV0IGw9MS9hO28+aS13bz9sPVB4W28taSt3by0xXTpvPT09MCYmKGw9MCksbi5wdXNoKGwpO2NvbnN0IGM9MS8oYS0yKSx1PS1jLGg9MStjLGY9W3UsdSxoLHUsaCxoLHUsdSxoLGgsdSxoXSxkPTYscD02LHk9MyxnPTIsbT0xLHY9bmV3IEZsb2F0MzJBcnJheSh5KnAqZCkseD1uZXcgRmxvYXQzMkFycmF5KGcqcCpkKSxfPW5ldyBGbG9hdDMyQXJyYXkobSpwKmQpO2ZvcihsZXQgYj0wO2I8ZDtiKyspe2NvbnN0IEE9YiUzKjIvMy0xLEU9Yj4yPzA6LTEsdz1bQSxFLDAsQSsyLzMsRSwwLEErMi8zLEUrMSwwLEEsRSwwLEErMi8zLEUrMSwwLEEsRSsxLDBdO3Yuc2V0KHcseSpwKmIpLHguc2V0KGYsZypwKmIpO2NvbnN0IFM9W2IsYixiLGIsYixiXTtfLnNldChTLG0qcCpiKX1jb25zdCBNPW5ldyBGdDtNLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBKdCh2LHkpKSxNLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBKdCh4LGcpKSxNLnNldEF0dHJpYnV0ZSgiZmFjZUluZGV4IixuZXcgSnQoXyxtKSksdC5wdXNoKE0pLHI+d28mJnItLX1yZXR1cm57bG9kUGxhbmVzOnQsc2l6ZUxvZHM6ZSxzaWdtYXM6bn19ZnVuY3Rpb24gRHgoaSx0LGUpe2NvbnN0IG49bmV3IG9pKGksdCxlKTtyZXR1cm4gbi50ZXh0dXJlLm1hcHBpbmc9cXMsbi50ZXh0dXJlLm5hbWU9IlBNUkVNLmN1YmVVdiIsbi5zY2lzc29yVGVzdD0hMCxufWZ1bmN0aW9uIFp1KGksdCxlLG4scil7aS52aWV3cG9ydC5zZXQodCxlLG4sciksaS5zY2lzc29yLnNldCh0LGUsbixyKX1mdW5jdGlvbiBzUChpLHQsZSl7Y29uc3Qgbj1uZXcgRmxvYXQzMkFycmF5KHZzKSxyPW5ldyBSKDAsMSwwKTtyZXR1cm4gbmV3IHVpKHtuYW1lOiJTcGhlcmljYWxHYXVzc2lhbkJsdXIiLGRlZmluZXM6e246dnMsQ1VCRVVWX1RFWEVMX1dJRFRIOjEvdCxDVUJFVVZfVEVYRUxfSEVJR0hUOjEvZSxDVUJFVVZfTUFYX01JUDpgJHtpfS4wYH0sdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sc2FtcGxlczp7dmFsdWU6MX0sd2VpZ2h0czp7dmFsdWU6bn0sbGF0aXR1ZGluYWw6e3ZhbHVlOiExfSxkVGhldGE6e3ZhbHVlOjB9LG1pcEludDp7dmFsdWU6MH0scG9sZUF4aXM6e3ZhbHVlOnJ9fSx2ZXJ0ZXhTaGFkZXI6T3AoKSxmcmFnbWVudFNoYWRlcjpgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7CgkJCXVuaWZvcm0gaW50IHNhbXBsZXM7CgkJCXVuaWZvcm0gZmxvYXQgd2VpZ2h0c1sgbiBdOwoJCQl1bmlmb3JtIGJvb2wgbGF0aXR1ZGluYWw7CgkJCXVuaWZvcm0gZmxvYXQgZFRoZXRhOwoJCQl1bmlmb3JtIGZsb2F0IG1pcEludDsKCQkJdW5pZm9ybSB2ZWMzIHBvbGVBeGlzOwoKCQkJI2RlZmluZSBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCSNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+CgoJCQl2ZWMzIGdldFNhbXBsZSggZmxvYXQgdGhldGEsIHZlYzMgYXhpcyApIHsKCgkJCQlmbG9hdCBjb3NUaGV0YSA9IGNvcyggdGhldGEgKTsKCQkJCS8vIFJvZHJpZ3VlcycgYXhpcy1hbmdsZSByb3RhdGlvbgoJCQkJdmVjMyBzYW1wbGVEaXJlY3Rpb24gPSB2T3V0cHV0RGlyZWN0aW9uICogY29zVGhldGEKCQkJCQkrIGNyb3NzKCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiBzaW4oIHRoZXRhICkKCQkJCQkrIGF4aXMgKiBkb3QoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqICggMS4wIC0gY29zVGhldGEgKTsKCgkJCQlyZXR1cm4gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyZWN0aW9uLCBtaXBJbnQgKTsKCgkJCX0KCgkJCXZvaWQgbWFpbigpIHsKCgkJCQl2ZWMzIGF4aXMgPSBsYXRpdHVkaW5hbCA/IHBvbGVBeGlzIDogY3Jvc3MoIHBvbGVBeGlzLCB2T3V0cHV0RGlyZWN0aW9uICk7CgoJCQkJaWYgKCBhbGwoIGVxdWFsKCBheGlzLCB2ZWMzKCAwLjAgKSApICkgKSB7CgoJCQkJCWF4aXMgPSB2ZWMzKCB2T3V0cHV0RGlyZWN0aW9uLnosIDAuMCwgLSB2T3V0cHV0RGlyZWN0aW9uLnggKTsKCgkJCQl9CgoJCQkJYXhpcyA9IG5vcm1hbGl6ZSggYXhpcyApOwoKCQkJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOwoJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyAwIF0gKiBnZXRTYW1wbGUoIDAuMCwgYXhpcyApOwoKCQkJCWZvciAoIGludCBpID0gMTsgaSA8IG47IGkrKyApIHsKCgkJCQkJaWYgKCBpID49IHNhbXBsZXMgKSB7CgoJCQkJCQlicmVhazsKCgkJCQkJfQoKCQkJCQlmbG9hdCB0aGV0YSA9IGRUaGV0YSAqIGZsb2F0KCBpICk7CgkJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIC0xLjAgKiB0aGV0YSwgYXhpcyApOwoJCQkJCWdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCB0aGV0YSwgYXhpcyApOwoKCQkJCX0KCgkJCX0KCQlgLGJsZW5kaW5nOk9pLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gVXgoKXtyZXR1cm4gbmV3IHVpKHtuYW1lOiJFcXVpcmVjdGFuZ3VsYXJUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpPcCgpLGZyYWdtZW50U2hhZGVyOmAKCgkJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCQl2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjsKCgkJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCgkJCSNpbmNsdWRlIDxjb21tb24+CgoJCQl2b2lkIG1haW4oKSB7CgoJCQkJdmVjMyBvdXRwdXREaXJlY3Rpb24gPSBub3JtYWxpemUoIHZPdXRwdXREaXJlY3Rpb24gKTsKCQkJCXZlYzIgdXYgPSBlcXVpcmVjdFV2KCBvdXRwdXREaXJlY3Rpb24gKTsKCgkJCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCB0ZXh0dXJlMkQgKCBlbnZNYXAsIHV2ICkucmdiLCAxLjAgKTsKCgkJCX0KCQlgLGJsZW5kaW5nOk9pLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gTngoKXtyZXR1cm4gbmV3IHVpKHtuYW1lOiJDdWJlbWFwVG9DdWJlVVYiLHVuaWZvcm1zOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfX0sdmVydGV4U2hhZGVyOk9wKCksZnJhZ21lbnRTaGFkZXI6YAoKCQkJcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CgkJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJCXVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKCgkJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CgoJCQl2b2lkIG1haW4oKSB7CgoJCQkJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHZPdXRwdXREaXJlY3Rpb24ueCwgdk91dHB1dERpcmVjdGlvbi55eiApICk7CgoJCQl9CgkJYCxibGVuZGluZzpPaSxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMX0pfWZ1bmN0aW9uIE9wKCl7cmV0dXJuYAoKCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCWF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7CgoJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uCgkJdmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7CgoJCQl1diA9IDIuMCAqIHV2IC0gMS4wOwoKCQkJdmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7CgoJCQlpZiAoIGZhY2UgPT0gMC4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7IC8vICggMSwgdiwgdSApIHBvcyB4CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5OwoJCQkJZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHkKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkgewoKCQkJCWRpcmVjdGlvbi54ICo9IC0xLjA7IC8vICggLXUsIHYsIDEgKSBwb3MgegoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7CgoJCQkJZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsKCQkJCWRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5OwoJCQkJZGlyZWN0aW9uLnh5ICo9IC0xLjA7IC8vICggLXUsIC0xLCB2ICkgbmVnIHkKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkgewoKCQkJCWRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgegoKCQkJfQoKCQkJcmV0dXJuIGRpcmVjdGlvbjsKCgkJfQoKCQl2b2lkIG1haW4oKSB7CgoJCQl2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCB1diwgZmFjZUluZGV4ICk7CgkJCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwoKCQl9CglgfWZ1bmN0aW9uIG9QKGkpe2xldCB0PW5ldyBXZWFrTWFwLGU9bnVsbDtmdW5jdGlvbiBuKGEpe2lmKGEmJmEuaXNUZXh0dXJlKXtjb25zdCBsPWEubWFwcGluZyxjPWw9PT1sYXx8bD09PWNhLHU9bD09PWtpfHxsPT09bXI7aWYoY3x8dSl7bGV0IGg9dC5nZXQoYSk7Y29uc3QgZj1oIT09dm9pZCAwP2gudGV4dHVyZS5wbXJlbVZlcnNpb246MDtpZihhLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSYmYS5wbXJlbVZlcnNpb24hPT1mKXJldHVybiBlPT09bnVsbCYmKGU9bmV3IEJwKGkpKSxoPWM/ZS5mcm9tRXF1aXJlY3Rhbmd1bGFyKGEsaCk6ZS5mcm9tQ3ViZW1hcChhLGgpLGgudGV4dHVyZS5wbXJlbVZlcnNpb249YS5wbXJlbVZlcnNpb24sdC5zZXQoYSxoKSxoLnRleHR1cmU7aWYoaCE9PXZvaWQgMClyZXR1cm4gaC50ZXh0dXJlO3tjb25zdCBkPWEuaW1hZ2U7cmV0dXJuIGMmJmQmJmQuaGVpZ2h0PjB8fHUmJmQmJnIoZCk/KGU9PT1udWxsJiYoZT1uZXcgQnAoaSkpLGg9Yz9lLmZyb21FcXVpcmVjdGFuZ3VsYXIoYSk6ZS5mcm9tQ3ViZW1hcChhKSxoLnRleHR1cmUucG1yZW1WZXJzaW9uPWEucG1yZW1WZXJzaW9uLHQuc2V0KGEsaCksYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixzKSxoLnRleHR1cmUpOm51bGx9fX1yZXR1cm4gYX1mdW5jdGlvbiByKGEpe2xldCBsPTA7Y29uc3QgYz02O2ZvcihsZXQgdT0wO3U8Yzt1KyspYVt1XSE9PXZvaWQgMCYmbCsrO3JldHVybiBsPT09Y31mdW5jdGlvbiBzKGEpe2NvbnN0IGw9YS50YXJnZXQ7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixzKTtjb25zdCBjPXQuZ2V0KGwpO2MhPT12b2lkIDAmJih0LmRlbGV0ZShsKSxjLmRpc3Bvc2UoKSl9ZnVuY3Rpb24gbygpe3Q9bmV3IFdlYWtNYXAsZSE9PW51bGwmJihlLmRpc3Bvc2UoKSxlPW51bGwpfXJldHVybntnZXQ6bixkaXNwb3NlOm99fWZ1bmN0aW9uIGFQKGkpe2NvbnN0IHQ9e307ZnVuY3Rpb24gZShuKXtpZih0W25dIT09dm9pZCAwKXJldHVybiB0W25dO2xldCByO3N3aXRjaChuKXtjYXNlIldFQkdMX2RlcHRoX3RleHR1cmUiOnI9aS5nZXRFeHRlbnNpb24oIldFQkdMX2RlcHRoX3RleHR1cmUiKXx8aS5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9kZXB0aF90ZXh0dXJlIil8fGkuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZSIpO2JyZWFrO2Nhc2UiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIjpyPWkuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8aS5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8aS5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIjpyPWkuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHxpLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGkuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6cj1pLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fGkuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7YnJlYWs7ZGVmYXVsdDpyPWkuZ2V0RXh0ZW5zaW9uKG4pfXJldHVybiB0W25dPXIscn1yZXR1cm57aGFzOmZ1bmN0aW9uKG4pe3JldHVybiBlKG4pIT09bnVsbH0saW5pdDpmdW5jdGlvbigpe2UoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSxlKCJXRUJHTF9jbGlwX2N1bGxfZGlzdGFuY2UiKSxlKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKSxlKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKSxlKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKSxlKCJXRUJHTF9yZW5kZXJfc2hhcmVkX2V4cG9uZW50Iil9LGdldDpmdW5jdGlvbihuKXtjb25zdCByPWUobik7cmV0dXJuIHI9PT1udWxsJiZRcygiVEhSRUUuV2ViR0xSZW5kZXJlcjogIituKyIgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuIikscn19fWZ1bmN0aW9uIGxQKGksdCxlLG4pe2NvbnN0IHI9e30scz1uZXcgV2Vha01hcDtmdW5jdGlvbiBvKGgpe2NvbnN0IGY9aC50YXJnZXQ7Zi5pbmRleCE9PW51bGwmJnQucmVtb3ZlKGYuaW5kZXgpO2Zvcihjb25zdCBwIGluIGYuYXR0cmlidXRlcyl0LnJlbW92ZShmLmF0dHJpYnV0ZXNbcF0pO2YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbyksZGVsZXRlIHJbZi5pZF07Y29uc3QgZD1zLmdldChmKTtkJiYodC5yZW1vdmUoZCkscy5kZWxldGUoZikpLG4ucmVsZWFzZVN0YXRlc09mR2VvbWV0cnkoZiksZi5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PT09ITAmJmRlbGV0ZSBmLl9tYXhJbnN0YW5jZUNvdW50LGUubWVtb3J5Lmdlb21ldHJpZXMtLX1mdW5jdGlvbiBhKGgsZil7cmV0dXJuIHJbZi5pZF09PT0hMHx8KGYuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbykscltmLmlkXT0hMCxlLm1lbW9yeS5nZW9tZXRyaWVzKyspLGZ9ZnVuY3Rpb24gbChoKXtjb25zdCBmPWguYXR0cmlidXRlcztmb3IoY29uc3QgZCBpbiBmKXQudXBkYXRlKGZbZF0saS5BUlJBWV9CVUZGRVIpfWZ1bmN0aW9uIGMoaCl7Y29uc3QgZj1bXSxkPWguaW5kZXgscD1oLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHk9MDtpZihkIT09bnVsbCl7Y29uc3Qgdj1kLmFycmF5O3k9ZC52ZXJzaW9uO2ZvcihsZXQgeD0wLF89di5sZW5ndGg7eDxfO3grPTMpe2NvbnN0IE09dlt4KzBdLGI9dlt4KzFdLEE9dlt4KzJdO2YucHVzaChNLGIsYixBLEEsTSl9fWVsc2UgaWYocCE9PXZvaWQgMCl7Y29uc3Qgdj1wLmFycmF5O3k9cC52ZXJzaW9uO2ZvcihsZXQgeD0wLF89di5sZW5ndGgvMy0xO3g8Xzt4Kz0zKXtjb25zdCBNPXgrMCxiPXgrMSxBPXgrMjtmLnB1c2goTSxiLGIsQSxBLE0pfX1lbHNlIHJldHVybjtjb25zdCBnPW5ldyhneShmKT9CZDpGZCkoZiwxKTtnLnZlcnNpb249eTtjb25zdCBtPXMuZ2V0KGgpO20mJnQucmVtb3ZlKG0pLHMuc2V0KGgsZyl9ZnVuY3Rpb24gdShoKXtjb25zdCBmPXMuZ2V0KGgpO2lmKGYpe2NvbnN0IGQ9aC5pbmRleDtkIT09bnVsbCYmZi52ZXJzaW9uPGQudmVyc2lvbiYmYyhoKX1lbHNlIGMoaCk7cmV0dXJuIHMuZ2V0KGgpfXJldHVybntnZXQ6YSx1cGRhdGU6bCxnZXRXaXJlZnJhbWVBdHRyaWJ1dGU6dX19ZnVuY3Rpb24gY1AoaSx0LGUpe2xldCBuO2Z1bmN0aW9uIHIoZil7bj1mfWxldCBzLG87ZnVuY3Rpb24gYShmKXtzPWYudHlwZSxvPWYuYnl0ZXNQZXJFbGVtZW50fWZ1bmN0aW9uIGwoZixkKXtpLmRyYXdFbGVtZW50cyhuLGQscyxmKm8pLGUudXBkYXRlKGQsbiwxKX1mdW5jdGlvbiBjKGYsZCxwKXtwIT09MCYmKGkuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKG4sZCxzLGYqbyxwKSxlLnVwZGF0ZShkLG4scCkpfWZ1bmN0aW9uIHUoZixkLHApe2lmKHA9PT0wKXJldHVybjt0LmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpLm11bHRpRHJhd0VsZW1lbnRzV0VCR0wobixkLDAscyxmLDAscCk7bGV0IGc9MDtmb3IobGV0IG09MDttPHA7bSsrKWcrPWRbbV07ZS51cGRhdGUoZyxuLDEpfWZ1bmN0aW9uIGgoZixkLHAseSl7aWYocD09PTApcmV0dXJuO2NvbnN0IGc9dC5nZXQoIldFQkdMX211bHRpX2RyYXciKTtpZihnPT09bnVsbClmb3IobGV0IG09MDttPGYubGVuZ3RoO20rKyljKGZbbV0vbyxkW21dLHlbbV0pO2Vsc2V7Zy5tdWx0aURyYXdFbGVtZW50c0luc3RhbmNlZFdFQkdMKG4sZCwwLHMsZiwwLHksMCxwKTtsZXQgbT0wO2ZvcihsZXQgdj0wO3Y8cDt2KyspbSs9ZFt2XSp5W3ZdO2UudXBkYXRlKG0sbiwxKX19dGhpcy5zZXRNb2RlPXIsdGhpcy5zZXRJbmRleD1hLHRoaXMucmVuZGVyPWwsdGhpcy5yZW5kZXJJbnN0YW5jZXM9Yyx0aGlzLnJlbmRlck11bHRpRHJhdz11LHRoaXMucmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzPWh9ZnVuY3Rpb24gdVAoaSl7Y29uc3QgdD17Z2VvbWV0cmllczowLHRleHR1cmVzOjB9LGU9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtmdW5jdGlvbiBuKHMsbyxhKXtzd2l0Y2goZS5jYWxscysrLG8pe2Nhc2UgaS5UUklBTkdMRVM6ZS50cmlhbmdsZXMrPWEqKHMvMyk7YnJlYWs7Y2FzZSBpLkxJTkVTOmUubGluZXMrPWEqKHMvMik7YnJlYWs7Y2FzZSBpLkxJTkVfU1RSSVA6ZS5saW5lcys9YSoocy0xKTticmVhaztjYXNlIGkuTElORV9MT09QOmUubGluZXMrPWEqczticmVhaztjYXNlIGkuUE9JTlRTOmUucG9pbnRzKz1hKnM7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZm86IFVua25vd24gZHJhdyBtb2RlOiIsbyk7YnJlYWt9fWZ1bmN0aW9uIHIoKXtlLmNhbGxzPTAsZS50cmlhbmdsZXM9MCxlLnBvaW50cz0wLGUubGluZXM9MH1yZXR1cm57bWVtb3J5OnQscmVuZGVyOmUscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6cix1cGRhdGU6bn19ZnVuY3Rpb24gaFAoaSx0LGUpe2NvbnN0IG49bmV3IFdlYWtNYXAscj1uZXcgUXQ7ZnVuY3Rpb24gcyhvLGEsbCl7Y29uc3QgYz1vLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyx1PWEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxhLm1vcnBoQXR0cmlidXRlcy5ub3JtYWx8fGEubW9ycGhBdHRyaWJ1dGVzLmNvbG9yLGg9dSE9PXZvaWQgMD91Lmxlbmd0aDowO2xldCBmPW4uZ2V0KGEpO2lmKGY9PT12b2lkIDB8fGYuY291bnQhPT1oKXtsZXQgdz1mdW5jdGlvbigpe0EuZGlzcG9zZSgpLG4uZGVsZXRlKGEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsdyl9O2YhPT12b2lkIDAmJmYudGV4dHVyZS5kaXNwb3NlKCk7Y29uc3QgZD1hLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiE9PXZvaWQgMCxwPWEubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCE9PXZvaWQgMCx5PWEubW9ycGhBdHRyaWJ1dGVzLmNvbG9yIT09dm9pZCAwLGc9YS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb258fFtdLG09YS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxbXSx2PWEubW9ycGhBdHRyaWJ1dGVzLmNvbG9yfHxbXTtsZXQgeD0wO2Q9PT0hMCYmKHg9MSkscD09PSEwJiYoeD0yKSx5PT09ITAmJih4PTMpO2xldCBfPWEuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCp4LE09MTtfPnQubWF4VGV4dHVyZVNpemUmJihNPU1hdGguY2VpbChfL3QubWF4VGV4dHVyZVNpemUpLF89dC5tYXhUZXh0dXJlU2l6ZSk7Y29uc3QgYj1uZXcgRmxvYXQzMkFycmF5KF8qTSo0KmgpLEE9bmV3IFVjKGIsXyxNLGgpO0EudHlwZT12bixBLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEU9eCo0O2ZvcihsZXQgUz0wO1M8aDtTKyspe2NvbnN0IFQ9Z1tTXSxEPW1bU10sTD12W1NdLE49XypNKjQqUztmb3IobGV0IEY9MDtGPFQuY291bnQ7RisrKXtjb25zdCBCPUYqRTtkPT09ITAmJihyLmZyb21CdWZmZXJBdHRyaWJ1dGUoVCxGKSxiW04rQiswXT1yLngsYltOK0IrMV09ci55LGJbTitCKzJdPXIueixiW04rQiszXT0wKSxwPT09ITAmJihyLmZyb21CdWZmZXJBdHRyaWJ1dGUoRCxGKSxiW04rQis0XT1yLngsYltOK0IrNV09ci55LGJbTitCKzZdPXIueixiW04rQis3XT0wKSx5PT09ITAmJihyLmZyb21CdWZmZXJBdHRyaWJ1dGUoTCxGKSxiW04rQis4XT1yLngsYltOK0IrOV09ci55LGJbTitCKzEwXT1yLnosYltOK0IrMTFdPUwuaXRlbVNpemU9PT00P3IudzoxKX19Zj17Y291bnQ6aCx0ZXh0dXJlOkEsc2l6ZTpuZXcgWChfLE0pfSxuLnNldChhLGYpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsdyl9aWYoby5pc0luc3RhbmNlZE1lc2g9PT0hMCYmby5tb3JwaFRleHR1cmUhPT1udWxsKWwuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShpLCJtb3JwaFRleHR1cmUiLG8ubW9ycGhUZXh0dXJlLGUpO2Vsc2V7bGV0IGQ9MDtmb3IobGV0IHk9MDt5PGMubGVuZ3RoO3krKylkKz1jW3ldO2NvbnN0IHA9YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT8xOjEtZDtsLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoaSwibW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIixwKSxsLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoaSwibW9ycGhUYXJnZXRJbmZsdWVuY2VzIixjKX1sLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoaSwibW9ycGhUYXJnZXRzVGV4dHVyZSIsZi50ZXh0dXJlLGUpLGwuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShpLCJtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZSIsZi5zaXplKX1yZXR1cm57dXBkYXRlOnN9fWZ1bmN0aW9uIGZQKGksdCxlLG4pe2xldCByPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHMobCl7Y29uc3QgYz1uLnJlbmRlci5mcmFtZSx1PWwuZ2VvbWV0cnksaD10LmdldChsLHUpO2lmKHIuZ2V0KGgpIT09YyYmKHQudXBkYXRlKGgpLHIuc2V0KGgsYykpLGwuaXNJbnN0YW5jZWRNZXNoJiYobC5oYXNFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKT09PSExJiZsLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpLHIuZ2V0KGwpIT09YyYmKGUudXBkYXRlKGwuaW5zdGFuY2VNYXRyaXgsaS5BUlJBWV9CVUZGRVIpLGwuaW5zdGFuY2VDb2xvciE9PW51bGwmJmUudXBkYXRlKGwuaW5zdGFuY2VDb2xvcixpLkFSUkFZX0JVRkZFUiksci5zZXQobCxjKSkpLGwuaXNTa2lubmVkTWVzaCl7Y29uc3QgZj1sLnNrZWxldG9uO3IuZ2V0KGYpIT09YyYmKGYudXBkYXRlKCksci5zZXQoZixjKSl9cmV0dXJuIGh9ZnVuY3Rpb24gbygpe3I9bmV3IFdlYWtNYXB9ZnVuY3Rpb24gYShsKXtjb25zdCBjPWwudGFyZ2V0O2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksZS5yZW1vdmUoYy5pbnN0YW5jZU1hdHJpeCksYy5pbnN0YW5jZUNvbG9yIT09bnVsbCYmZS5yZW1vdmUoYy5pbnN0YW5jZUNvbG9yKX1yZXR1cm57dXBkYXRlOnMsZGlzcG9zZTpvfX1jb25zdCBGeD1uZXcgVGUsQng9bmV3IEtkKDEsMSksT3g9bmV3IFVjLHp4PW5ldyB2ZCxreD1uZXcgSWEsVng9W10sR3g9W10sSHg9bmV3IEZsb2F0MzJBcnJheSgxNiksV3g9bmV3IEZsb2F0MzJBcnJheSg5KSwkeD1uZXcgRmxvYXQzMkFycmF5KDQpO2Z1bmN0aW9uIEVvKGksdCxlKXtjb25zdCBuPWlbMF07aWYobjw9MHx8bj4wKXJldHVybiBpO2NvbnN0IHI9dCplO2xldCBzPVZ4W3JdO2lmKHM9PT12b2lkIDAmJihzPW5ldyBGbG9hdDMyQXJyYXkociksVnhbcl09cyksdCE9PTApe24udG9BcnJheShzLDApO2ZvcihsZXQgbz0xLGE9MDtvIT09dDsrK28pYSs9ZSxpW29dLnRvQXJyYXkocyxhKX1yZXR1cm4gc31mdW5jdGlvbiBHZShpLHQpe2lmKGkubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBlPTAsbj1pLmxlbmd0aDtlPG47ZSsrKWlmKGlbZV0hPT10W2VdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIEhlKGksdCl7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKWlbZV09dFtlXX1mdW5jdGlvbiBKdShpLHQpe2xldCBlPUd4W3RdO2U9PT12b2lkIDAmJihlPW5ldyBJbnQzMkFycmF5KHQpLEd4W3RdPWUpO2ZvcihsZXQgbj0wO24hPT10OysrbillW25dPWkuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO3JldHVybiBlfWZ1bmN0aW9uIGRQKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlO2VbMF0hPT10JiYoaS51bmlmb3JtMWYodGhpcy5hZGRyLHQpLGVbMF09dCl9ZnVuY3Rpb24gcFAoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGU7aWYodC54IT09dm9pZCAwKShlWzBdIT09dC54fHxlWzFdIT09dC55KSYmKGkudW5pZm9ybTJmKHRoaXMuYWRkcix0LngsdC55KSxlWzBdPXQueCxlWzFdPXQueSk7ZWxzZXtpZihHZShlLHQpKXJldHVybjtpLnVuaWZvcm0yZnYodGhpcy5hZGRyLHQpLEhlKGUsdCl9fWZ1bmN0aW9uIG1QKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueXx8ZVsyXSE9PXQueikmJihpLnVuaWZvcm0zZih0aGlzLmFkZHIsdC54LHQueSx0LnopLGVbMF09dC54LGVbMV09dC55LGVbMl09dC56KTtlbHNlIGlmKHQuciE9PXZvaWQgMCkoZVswXSE9PXQucnx8ZVsxXSE9PXQuZ3x8ZVsyXSE9PXQuYikmJihpLnVuaWZvcm0zZih0aGlzLmFkZHIsdC5yLHQuZyx0LmIpLGVbMF09dC5yLGVbMV09dC5nLGVbMl09dC5iKTtlbHNle2lmKEdlKGUsdCkpcmV0dXJuO2kudW5pZm9ybTNmdih0aGlzLmFkZHIsdCksSGUoZSx0KX19ZnVuY3Rpb24gZ1AoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGU7aWYodC54IT09dm9pZCAwKShlWzBdIT09dC54fHxlWzFdIT09dC55fHxlWzJdIT09dC56fHxlWzNdIT09dC53KSYmKGkudW5pZm9ybTRmKHRoaXMuYWRkcix0LngsdC55LHQueix0LncpLGVbMF09dC54LGVbMV09dC55LGVbMl09dC56LGVbM109dC53KTtlbHNle2lmKEdlKGUsdCkpcmV0dXJuO2kudW5pZm9ybTRmdih0aGlzLmFkZHIsdCksSGUoZSx0KX19ZnVuY3Rpb24geVAoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGUsbj10LmVsZW1lbnRzO2lmKG49PT12b2lkIDApe2lmKEdlKGUsdCkpcmV0dXJuO2kudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsdCksSGUoZSx0KX1lbHNle2lmKEdlKGUsbikpcmV0dXJuOyR4LnNldChuKSxpLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLCR4KSxIZShlLG4pfX1mdW5jdGlvbiBfUChpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZSxuPXQuZWxlbWVudHM7aWYobj09PXZvaWQgMCl7aWYoR2UoZSx0KSlyZXR1cm47aS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSx0KSxIZShlLHQpfWVsc2V7aWYoR2UoZSxuKSlyZXR1cm47V3guc2V0KG4pLGkudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsV3gpLEhlKGUsbil9fWZ1bmN0aW9uIHhQKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlLG49dC5lbGVtZW50cztpZihuPT09dm9pZCAwKXtpZihHZShlLHQpKXJldHVybjtpLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLHQpLEhlKGUsdCl9ZWxzZXtpZihHZShlLG4pKXJldHVybjtIeC5zZXQobiksaS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxIeCksSGUoZSxuKX19ZnVuY3Rpb24gdlAoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGU7ZVswXSE9PXQmJihpLnVuaWZvcm0xaSh0aGlzLmFkZHIsdCksZVswXT10KX1mdW5jdGlvbiBTUChpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10LnkpJiYoaS51bmlmb3JtMmkodGhpcy5hZGRyLHQueCx0LnkpLGVbMF09dC54LGVbMV09dC55KTtlbHNle2lmKEdlKGUsdCkpcmV0dXJuO2kudW5pZm9ybTJpdih0aGlzLmFkZHIsdCksSGUoZSx0KX19ZnVuY3Rpb24gTVAoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGU7aWYodC54IT09dm9pZCAwKShlWzBdIT09dC54fHxlWzFdIT09dC55fHxlWzJdIT09dC56KSYmKGkudW5pZm9ybTNpKHRoaXMuYWRkcix0LngsdC55LHQueiksZVswXT10LngsZVsxXT10LnksZVsyXT10LnopO2Vsc2V7aWYoR2UoZSx0KSlyZXR1cm47aS51bmlmb3JtM2l2KHRoaXMuYWRkcix0KSxIZShlLHQpfX1mdW5jdGlvbiBiUChpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10Lnl8fGVbMl0hPT10Lnp8fGVbM10hPT10LncpJiYoaS51bmlmb3JtNGkodGhpcy5hZGRyLHQueCx0LnksdC56LHQudyksZVswXT10LngsZVsxXT10LnksZVsyXT10LnosZVszXT10LncpO2Vsc2V7aWYoR2UoZSx0KSlyZXR1cm47aS51bmlmb3JtNGl2KHRoaXMuYWRkcix0KSxIZShlLHQpfX1mdW5jdGlvbiB3UChpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtlWzBdIT09dCYmKGkudW5pZm9ybTF1aSh0aGlzLmFkZHIsdCksZVswXT10KX1mdW5jdGlvbiBBUChpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10LnkpJiYoaS51bmlmb3JtMnVpKHRoaXMuYWRkcix0LngsdC55KSxlWzBdPXQueCxlWzFdPXQueSk7ZWxzZXtpZihHZShlLHQpKXJldHVybjtpLnVuaWZvcm0ydWl2KHRoaXMuYWRkcix0KSxIZShlLHQpfX1mdW5jdGlvbiBFUChpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10Lnl8fGVbMl0hPT10LnopJiYoaS51bmlmb3JtM3VpKHRoaXMuYWRkcix0LngsdC55LHQueiksZVswXT10LngsZVsxXT10LnksZVsyXT10LnopO2Vsc2V7aWYoR2UoZSx0KSlyZXR1cm47aS51bmlmb3JtM3Vpdih0aGlzLmFkZHIsdCksSGUoZSx0KX19ZnVuY3Rpb24gVFAoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGU7aWYodC54IT09dm9pZCAwKShlWzBdIT09dC54fHxlWzFdIT09dC55fHxlWzJdIT09dC56fHxlWzNdIT09dC53KSYmKGkudW5pZm9ybTR1aSh0aGlzLmFkZHIsdC54LHQueSx0LnosdC53KSxlWzBdPXQueCxlWzFdPXQueSxlWzJdPXQueixlWzNdPXQudyk7ZWxzZXtpZihHZShlLHQpKXJldHVybjtpLnVuaWZvcm00dWl2KHRoaXMuYWRkcix0KSxIZShlLHQpfX1mdW5jdGlvbiBDUChpLHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLHI9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PXImJihpLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksblswXT1yKTtsZXQgczt0aGlzLnR5cGU9PT1pLlNBTVBMRVJfMkRfU0hBRE9XPyhCeC5jb21wYXJlRnVuY3Rpb249bWQscz1CeCk6cz1GeCxlLnNldFRleHR1cmUyRCh0fHxzLHIpfWZ1bmN0aW9uIFJQKGksdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09ciYmKGkudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxuWzBdPXIpLGUuc2V0VGV4dHVyZTNEKHR8fHp4LHIpfWZ1bmN0aW9uIFBQKGksdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09ciYmKGkudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxuWzBdPXIpLGUuc2V0VGV4dHVyZUN1YmUodHx8a3gscil9ZnVuY3Rpb24gSVAoaSx0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxyPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO25bMF0hPT1yJiYoaS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLG5bMF09ciksZS5zZXRUZXh0dXJlMkRBcnJheSh0fHxPeCxyKX1mdW5jdGlvbiBMUChpKXtzd2l0Y2goaSl7Y2FzZSA1MTI2OnJldHVybiBkUDtjYXNlIDM1NjY0OnJldHVybiBwUDtjYXNlIDM1NjY1OnJldHVybiBtUDtjYXNlIDM1NjY2OnJldHVybiBnUDtjYXNlIDM1Njc0OnJldHVybiB5UDtjYXNlIDM1Njc1OnJldHVybiBfUDtjYXNlIDM1Njc2OnJldHVybiB4UDtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gdlA7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiBTUDtjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIE1QO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gYlA7Y2FzZSA1MTI1OnJldHVybiB3UDtjYXNlIDM2Mjk0OnJldHVybiBBUDtjYXNlIDM2Mjk1OnJldHVybiBFUDtjYXNlIDM2Mjk2OnJldHVybiBUUDtjYXNlIDM1Njc4OmNhc2UgMzYxOTg6Y2FzZSAzNjI5ODpjYXNlIDM2MzA2OmNhc2UgMzU2ODI6cmV0dXJuIENQO2Nhc2UgMzU2Nzk6Y2FzZSAzNjI5OTpjYXNlIDM2MzA3OnJldHVybiBSUDtjYXNlIDM1NjgwOmNhc2UgMzYzMDA6Y2FzZSAzNjMwODpjYXNlIDM2MjkzOnJldHVybiBQUDtjYXNlIDM2Mjg5OmNhc2UgMzYzMDM6Y2FzZSAzNjMxMTpjYXNlIDM2MjkyOnJldHVybiBJUH19ZnVuY3Rpb24gRFAoaSx0KXtpLnVuaWZvcm0xZnYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIFVQKGksdCl7Y29uc3QgZT1Fbyh0LHRoaXMuc2l6ZSwyKTtpLnVuaWZvcm0yZnYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIE5QKGksdCl7Y29uc3QgZT1Fbyh0LHRoaXMuc2l6ZSwzKTtpLnVuaWZvcm0zZnYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIEZQKGksdCl7Y29uc3QgZT1Fbyh0LHRoaXMuc2l6ZSw0KTtpLnVuaWZvcm00ZnYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIEJQKGksdCl7Y29uc3QgZT1Fbyh0LHRoaXMuc2l6ZSw0KTtpLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGUpfWZ1bmN0aW9uIE9QKGksdCl7Y29uc3QgZT1Fbyh0LHRoaXMuc2l6ZSw5KTtpLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGUpfWZ1bmN0aW9uIHpQKGksdCl7Y29uc3QgZT1Fbyh0LHRoaXMuc2l6ZSwxNik7aS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxlKX1mdW5jdGlvbiBrUChpLHQpe2kudW5pZm9ybTFpdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gVlAoaSx0KXtpLnVuaWZvcm0yaXYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIEdQKGksdCl7aS51bmlmb3JtM2l2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiBIUChpLHQpe2kudW5pZm9ybTRpdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gV1AoaSx0KXtpLnVuaWZvcm0xdWl2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiAkUChpLHQpe2kudW5pZm9ybTJ1aXYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIFhQKGksdCl7aS51bmlmb3JtM3Vpdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gcVAoaSx0KXtpLnVuaWZvcm00dWl2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiBZUChpLHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLHI9dC5sZW5ndGgscz1KdShlLHIpO0dlKG4scyl8fChpLnVuaWZvcm0xaXYodGhpcy5hZGRyLHMpLEhlKG4scykpO2ZvcihsZXQgbz0wO28hPT1yOysrbyllLnNldFRleHR1cmUyRCh0W29dfHxGeCxzW29dKX1mdW5jdGlvbiBaUChpLHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLHI9dC5sZW5ndGgscz1KdShlLHIpO0dlKG4scyl8fChpLnVuaWZvcm0xaXYodGhpcy5hZGRyLHMpLEhlKG4scykpO2ZvcihsZXQgbz0wO28hPT1yOysrbyllLnNldFRleHR1cmUzRCh0W29dfHx6eCxzW29dKX1mdW5jdGlvbiBKUChpLHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLHI9dC5sZW5ndGgscz1KdShlLHIpO0dlKG4scyl8fChpLnVuaWZvcm0xaXYodGhpcy5hZGRyLHMpLEhlKG4scykpO2ZvcihsZXQgbz0wO28hPT1yOysrbyllLnNldFRleHR1cmVDdWJlKHRbb118fGt4LHNbb10pfWZ1bmN0aW9uIGpQKGksdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUscj10Lmxlbmd0aCxzPUp1KGUscik7R2UobixzKXx8KGkudW5pZm9ybTFpdih0aGlzLmFkZHIscyksSGUobixzKSk7Zm9yKGxldCBvPTA7byE9PXI7KytvKWUuc2V0VGV4dHVyZTJEQXJyYXkodFtvXXx8T3gsc1tvXSl9ZnVuY3Rpb24gS1AoaSl7c3dpdGNoKGkpe2Nhc2UgNTEyNjpyZXR1cm4gRFA7Y2FzZSAzNTY2NDpyZXR1cm4gVVA7Y2FzZSAzNTY2NTpyZXR1cm4gTlA7Y2FzZSAzNTY2NjpyZXR1cm4gRlA7Y2FzZSAzNTY3NDpyZXR1cm4gQlA7Y2FzZSAzNTY3NTpyZXR1cm4gT1A7Y2FzZSAzNTY3NjpyZXR1cm4gelA7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIGtQO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gVlA7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBHUDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIEhQO2Nhc2UgNTEyNTpyZXR1cm4gV1A7Y2FzZSAzNjI5NDpyZXR1cm4gJFA7Y2FzZSAzNjI5NTpyZXR1cm4gWFA7Y2FzZSAzNjI5NjpyZXR1cm4gcVA7Y2FzZSAzNTY3ODpjYXNlIDM2MTk4OmNhc2UgMzYyOTg6Y2FzZSAzNjMwNjpjYXNlIDM1NjgyOnJldHVybiBZUDtjYXNlIDM1Njc5OmNhc2UgMzYyOTk6Y2FzZSAzNjMwNzpyZXR1cm4gWlA7Y2FzZSAzNTY4MDpjYXNlIDM2MzAwOmNhc2UgMzYzMDg6Y2FzZSAzNjI5MzpyZXR1cm4gSlA7Y2FzZSAzNjI4OTpjYXNlIDM2MzAzOmNhc2UgMzYzMTE6Y2FzZSAzNjI5MjpyZXR1cm4galB9fWNsYXNzIFFQe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmlkPXQsdGhpcy5hZGRyPW4sdGhpcy5jYWNoZT1bXSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuc2V0VmFsdWU9TFAoZS50eXBlKX19Y2xhc3MgdEl7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaWQ9dCx0aGlzLmFkZHI9bix0aGlzLmNhY2hlPVtdLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5zaXplPWUuc2l6ZSx0aGlzLnNldFZhbHVlPUtQKGUudHlwZSl9fWNsYXNzIGVJe2NvbnN0cnVjdG9yKHQpe3RoaXMuaWQ9dCx0aGlzLnNlcT1bXSx0aGlzLm1hcD17fX1zZXRWYWx1ZSh0LGUsbil7Y29uc3Qgcj10aGlzLnNlcTtmb3IobGV0IHM9MCxvPXIubGVuZ3RoO3MhPT1vOysrcyl7Y29uc3QgYT1yW3NdO2Euc2V0VmFsdWUodCxlW2EuaWRdLG4pfX19Y29uc3QgenA9LyhcdyspKFxdKT8oXFt8XC4pPy9nO2Z1bmN0aW9uIFh4KGksdCl7aS5zZXEucHVzaCh0KSxpLm1hcFt0LmlkXT10fWZ1bmN0aW9uIG5JKGksdCxlKXtjb25zdCBuPWkubmFtZSxyPW4ubGVuZ3RoO2Zvcih6cC5sYXN0SW5kZXg9MDs7KXtjb25zdCBzPXpwLmV4ZWMobiksbz16cC5sYXN0SW5kZXg7bGV0IGE9c1sxXTtjb25zdCBsPXNbMl09PT0iXSIsYz1zWzNdO2lmKGwmJihhPWF8MCksYz09PXZvaWQgMHx8Yz09PSJbIiYmbysyPT09cil7WHgoZSxjPT09dm9pZCAwP25ldyBRUChhLGksdCk6bmV3IHRJKGEsaSx0KSk7YnJlYWt9ZWxzZXtsZXQgaD1lLm1hcFthXTtoPT09dm9pZCAwJiYoaD1uZXcgZUkoYSksWHgoZSxoKSksZT1ofX19Y2xhc3MganV7Y29uc3RydWN0b3IodCxlKXt0aGlzLnNlcT1bXSx0aGlzLm1hcD17fTtjb25zdCBuPXQuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLHQuQUNUSVZFX1VOSUZPUk1TKTtmb3IobGV0IHI9MDtyPG47KytyKXtjb25zdCBzPXQuZ2V0QWN0aXZlVW5pZm9ybShlLHIpLG89dC5nZXRVbmlmb3JtTG9jYXRpb24oZSxzLm5hbWUpO25JKHMsbyx0aGlzKX19c2V0VmFsdWUodCxlLG4scil7Y29uc3Qgcz10aGlzLm1hcFtlXTtzIT09dm9pZCAwJiZzLnNldFZhbHVlKHQsbixyKX1zZXRPcHRpb25hbCh0LGUsbil7Y29uc3Qgcj1lW25dO3IhPT12b2lkIDAmJnRoaXMuc2V0VmFsdWUodCxuLHIpfXN0YXRpYyB1cGxvYWQodCxlLG4scil7Zm9yKGxldCBzPTAsbz1lLmxlbmd0aDtzIT09bzsrK3Mpe2NvbnN0IGE9ZVtzXSxsPW5bYS5pZF07bC5uZWVkc1VwZGF0ZSE9PSExJiZhLnNldFZhbHVlKHQsbC52YWx1ZSxyKX19c3RhdGljIHNlcVdpdGhWYWx1ZSh0LGUpe2NvbnN0IG49W107Zm9yKGxldCByPTAscz10Lmxlbmd0aDtyIT09czsrK3Ipe2NvbnN0IG89dFtyXTtvLmlkIGluIGUmJm4ucHVzaChvKX1yZXR1cm4gbn19ZnVuY3Rpb24gcXgoaSx0LGUpe2NvbnN0IG49aS5jcmVhdGVTaGFkZXIodCk7cmV0dXJuIGkuc2hhZGVyU291cmNlKG4sZSksaS5jb21waWxlU2hhZGVyKG4pLG59Y29uc3QgaUk9MzcyOTc7bGV0IHJJPTA7ZnVuY3Rpb24gc0koaSx0KXtjb25zdCBlPWkuc3BsaXQoYApgKSxuPVtdLHI9TWF0aC5tYXgodC02LDApLHM9TWF0aC5taW4odCs2LGUubGVuZ3RoKTtmb3IobGV0IG89cjtvPHM7bysrKXtjb25zdCBhPW8rMTtuLnB1c2goYCR7YT09PXQ/Ij4iOiIgIn0gJHthfTogJHtlW29dfWApfXJldHVybiBuLmpvaW4oYApgKX1jb25zdCBZeD1uZXcgV3Q7ZnVuY3Rpb24gb0koaSl7cmUuX2dldE1hdHJpeChZeCxyZS53b3JraW5nQ29sb3JTcGFjZSxpKTtjb25zdCB0PWBtYXQzKCAke1l4LmVsZW1lbnRzLm1hcChlPT5lLnRvRml4ZWQoNCkpfSApYDtzd2l0Y2gocmUuZ2V0VHJhbnNmZXIoaSkpe2Nhc2UgU2E6cmV0dXJuW3QsIkxpbmVhclRyYW5zZmVyT0VURiJdO2Nhc2UgcGU6cmV0dXJuW3QsInNSR0JUcmFuc2Zlck9FVEYiXTtkZWZhdWx0OnJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgY29sb3Igc3BhY2U6ICIsaSksW3QsIkxpbmVhclRyYW5zZmVyT0VURiJdfX1mdW5jdGlvbiBaeChpLHQsZSl7Y29uc3Qgbj1pLmdldFNoYWRlclBhcmFtZXRlcih0LGkuQ09NUElMRV9TVEFUVVMpLHI9aS5nZXRTaGFkZXJJbmZvTG9nKHQpLnRyaW0oKTtpZihuJiZyPT09IiIpcmV0dXJuIiI7Y29uc3Qgcz0vRVJST1I6IDA6KFxkKykvLmV4ZWMocik7aWYocyl7Y29uc3Qgbz1wYXJzZUludChzWzFdKTtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpK2AKCmArcitgCgpgK3NJKGkuZ2V0U2hhZGVyU291cmNlKHQpLG8pfWVsc2UgcmV0dXJuIHJ9ZnVuY3Rpb24gYUkoaSx0KXtjb25zdCBlPW9JKHQpO3JldHVybltgdmVjNCAke2l9KCB2ZWM0IHZhbHVlICkge2AsYAlyZXR1cm4gJHtlWzFdfSggdmVjNCggdmFsdWUucmdiICogJHtlWzBdfSwgdmFsdWUuYSApICk7YCwifSJdLmpvaW4oYApgKX1mdW5jdGlvbiBsSShpLHQpe2xldCBlO3N3aXRjaCh0KXtjYXNlIFkwOmU9IkxpbmVhciI7YnJlYWs7Y2FzZSBaMDplPSJSZWluaGFyZCI7YnJlYWs7Y2FzZSBKMDplPSJDaW5lb24iO2JyZWFrO2Nhc2UgajA6ZT0iQUNFU0ZpbG1pYyI7YnJlYWs7Y2FzZSBRMDplPSJBZ1giO2JyZWFrO2Nhc2UgdHk6ZT0iTmV1dHJhbCI7YnJlYWs7Y2FzZSBLMDplPSJDdXN0b20iO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiIsdCksZT0iTGluZWFyIn1yZXR1cm4idmVjMyAiK2krIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrZSsiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifWNvbnN0IEt1PW5ldyBSO2Z1bmN0aW9uIGNJKCl7cmUuZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzKEt1KTtjb25zdCBpPUt1LngudG9GaXhlZCg0KSx0PUt1LnkudG9GaXhlZCg0KSxlPUt1LnoudG9GaXhlZCg0KTtyZXR1cm5bImZsb2F0IGx1bWluYW5jZSggY29uc3QgaW4gdmVjMyByZ2IgKSB7IixgCWNvbnN0IHZlYzMgd2VpZ2h0cyA9IHZlYzMoICR7aX0sICR7dH0sICR7ZX0gKTtgLCIJcmV0dXJuIGRvdCggd2VpZ2h0cywgcmdiICk7IiwifSJdLmpvaW4oYApgKX1mdW5jdGlvbiB1SShpKXtyZXR1cm5baS5leHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlPyIjZXh0ZW5zaW9uIEdMX0FOR0xFX2NsaXBfY3VsbF9kaXN0YW5jZSA6IHJlcXVpcmUiOiIiLGkuZXh0ZW5zaW9uTXVsdGlEcmF3PyIjZXh0ZW5zaW9uIEdMX0FOR0xFX211bHRpX2RyYXcgOiByZXF1aXJlIjoiIl0uZmlsdGVyKG5sKS5qb2luKGAKYCl9ZnVuY3Rpb24gaEkoaSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgZSBpbiBpKXtjb25zdCBuPWlbZV07biE9PSExJiZ0LnB1c2goIiNkZWZpbmUgIitlKyIgIituKX1yZXR1cm4gdC5qb2luKGAKYCl9ZnVuY3Rpb24gZkkoaSx0KXtjb25zdCBlPXt9LG49aS5nZXRQcm9ncmFtUGFyYW1ldGVyKHQsaS5BQ1RJVkVfQVRUUklCVVRFUyk7Zm9yKGxldCByPTA7cjxuO3IrKyl7Y29uc3Qgcz1pLmdldEFjdGl2ZUF0dHJpYih0LHIpLG89cy5uYW1lO2xldCBhPTE7cy50eXBlPT09aS5GTE9BVF9NQVQyJiYoYT0yKSxzLnR5cGU9PT1pLkZMT0FUX01BVDMmJihhPTMpLHMudHlwZT09PWkuRkxPQVRfTUFUNCYmKGE9NCksZVtvXT17dHlwZTpzLnR5cGUsbG9jYXRpb246aS5nZXRBdHRyaWJMb2NhdGlvbih0LG8pLGxvY2F0aW9uU2l6ZTphfX1yZXR1cm4gZX1mdW5jdGlvbiBubChpKXtyZXR1cm4gaSE9PSIifWZ1bmN0aW9uIEp4KGksdCl7Y29uc3QgZT10Lm51bVNwb3RMaWdodFNoYWRvd3MrdC5udW1TcG90TGlnaHRNYXBzLXQubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzO3JldHVybiBpLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csdC5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLHQubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRfTUFQUy9nLHQubnVtU3BvdExpZ2h0TWFwcykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRfQ09PUkRTL2csZSkucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyx0Lm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csdC5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csdC5udW1IZW1pTGlnaHRzKS5yZXBsYWNlKC9OVU1fRElSX0xJR0hUX1NIQURPV1MvZyx0Lm51bURpckxpZ2h0U2hhZG93cykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMvZyx0Lm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRfU0hBRE9XUy9nLHQubnVtU3BvdExpZ2h0U2hhZG93cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MvZyx0Lm51bVBvaW50TGlnaHRTaGFkb3dzKX1mdW5jdGlvbiBqeChpLHQpe3JldHVybiBpLnJlcGxhY2UoL05VTV9DTElQUElOR19QTEFORVMvZyx0Lm51bUNsaXBwaW5nUGxhbmVzKS5yZXBsYWNlKC9VTklPTl9DTElQUElOR19QTEFORVMvZyx0Lm51bUNsaXBwaW5nUGxhbmVzLXQubnVtQ2xpcEludGVyc2VjdGlvbil9Y29uc3QgZEk9L15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbTtmdW5jdGlvbiBrcChpKXtyZXR1cm4gaS5yZXBsYWNlKGRJLG1JKX1jb25zdCBwST1uZXcgTWFwO2Z1bmN0aW9uIG1JKGksdCl7bGV0IGU9anRbdF07aWYoZT09PXZvaWQgMCl7Y29uc3Qgbj1wSS5nZXQodCk7aWYobiE9PXZvaWQgMCllPWp0W25dLGNvbnNvbGUud2FybignVEhSRUUuV2ViR0xSZW5kZXJlcjogU2hhZGVyIGNodW5rICIlcyIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlICIlcyIgaW5zdGVhZC4nLHQsbik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgcmVzb2x2ZSAjaW5jbHVkZSA8Iit0KyI+Iil9cmV0dXJuIGtwKGUpfWNvbnN0IGdJPS8jcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHMrZm9yXHMqXChccyppbnRccytpXHMqPVxzKihcZCspXHMqO1xzKmlccyo8XHMqKFxkKylccyo7XHMqaVxzKlwrXCtccypcKVxzKnsoW1xzXFNdKz8pfVxzKyNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kL2c7ZnVuY3Rpb24gS3goaSl7cmV0dXJuIGkucmVwbGFjZShnSSx5SSl9ZnVuY3Rpb24geUkoaSx0LGUsbil7bGV0IHI9IiI7Zm9yKGxldCBzPXBhcnNlSW50KHQpO3M8cGFyc2VJbnQoZSk7cysrKXIrPW4ucmVwbGFjZSgvXFtccyppXHMqXF0vZywiWyAiK3MrIiBdIikucmVwbGFjZSgvVU5ST0xMRURfTE9PUF9JTkRFWC9nLHMpO3JldHVybiByfWZ1bmN0aW9uIFF4KGkpe2xldCB0PWBwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gZmxvYXQ7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gaW50OwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IHNhbXBsZXIyRDsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSBzYW1wbGVyQ3ViZTsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSBzYW1wbGVyM0Q7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gc2FtcGxlcjJEQXJyYXk7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gc2FtcGxlcjJEU2hhZG93OwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IHNhbXBsZXJDdWJlU2hhZG93OwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IHNhbXBsZXIyREFycmF5U2hhZG93OwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IGlzYW1wbGVyMkQ7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gaXNhbXBsZXIzRDsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSBpc2FtcGxlckN1YmU7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gaXNhbXBsZXIyREFycmF5OwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IHVzYW1wbGVyMkQ7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gdXNhbXBsZXIzRDsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSB1c2FtcGxlckN1YmU7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gdXNhbXBsZXIyREFycmF5OwoJYDtyZXR1cm4gaS5wcmVjaXNpb249PT0iaGlnaHAiP3QrPWAKI2RlZmluZSBISUdIX1BSRUNJU0lPTmA6aS5wcmVjaXNpb249PT0ibWVkaXVtcCI/dCs9YAojZGVmaW5lIE1FRElVTV9QUkVDSVNJT05gOmkucHJlY2lzaW9uPT09Imxvd3AiJiYodCs9YAojZGVmaW5lIExPV19QUkVDSVNJT05gKSx0fWZ1bmN0aW9uIF9JKGkpe2xldCB0PSJTSEFET1dNQVBfVFlQRV9CQVNJQyI7cmV0dXJuIGkuc2hhZG93TWFwVHlwZT09PXhuP3Q9IlNIQURPV01BUF9UWVBFX1BDRiI6aS5zaGFkb3dNYXBUeXBlPT09WHM/dD0iU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQiOmkuc2hhZG93TWFwVHlwZT09PWJpJiYodD0iU0hBRE9XTUFQX1RZUEVfVlNNIiksdH1mdW5jdGlvbiB4SShpKXtsZXQgdD0iRU5WTUFQX1RZUEVfQ1VCRSI7aWYoaS5lbnZNYXApc3dpdGNoKGkuZW52TWFwTW9kZSl7Y2FzZSBraTpjYXNlIG1yOnQ9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgcXM6dD0iRU5WTUFQX1RZUEVfQ1VCRV9VViI7YnJlYWt9cmV0dXJuIHR9ZnVuY3Rpb24gdkkoaSl7bGV0IHQ9IkVOVk1BUF9NT0RFX1JFRkxFQ1RJT04iO2lmKGkuZW52TWFwKXN3aXRjaChpLmVudk1hcE1vZGUpe2Nhc2UgbXI6dD0iRU5WTUFQX01PREVfUkVGUkFDVElPTiI7YnJlYWt9cmV0dXJuIHR9ZnVuY3Rpb24gU0koaSl7bGV0IHQ9IkVOVk1BUF9CTEVORElOR19OT05FIjtpZihpLmVudk1hcClzd2l0Y2goaS5jb21iaW5lKXtjYXNlIGFhOnQ9IkVOVk1BUF9CTEVORElOR19NVUxUSVBMWSI7YnJlYWs7Y2FzZSBYMDp0PSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIHEwOnQ9IkVOVk1BUF9CTEVORElOR19BREQiO2JyZWFrfXJldHVybiB0fWZ1bmN0aW9uIE1JKGkpe2NvbnN0IHQ9aS5lbnZNYXBDdWJlVVZIZWlnaHQ7aWYodD09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgZT1NYXRoLmxvZzIodCktMixuPTEvdDtyZXR1cm57dGV4ZWxXaWR0aDoxLygzKk1hdGgubWF4KE1hdGgucG93KDIsZSksNyoxNikpLHRleGVsSGVpZ2h0Om4sbWF4TWlwOmV9fWZ1bmN0aW9uIGJJKGksdCxlLG4pe2NvbnN0IHI9aS5nZXRDb250ZXh0KCkscz1lLmRlZmluZXM7bGV0IG89ZS52ZXJ0ZXhTaGFkZXIsYT1lLmZyYWdtZW50U2hhZGVyO2NvbnN0IGw9X0koZSksYz14SShlKSx1PXZJKGUpLGg9U0koZSksZj1NSShlKSxkPXVJKGUpLHA9aEkocykseT1yLmNyZWF0ZVByb2dyYW0oKTtsZXQgZyxtLHY9ZS5nbHNsVmVyc2lvbj8iI3ZlcnNpb24gIitlLmdsc2xWZXJzaW9uK2AKYDoiIjtlLmlzUmF3U2hhZGVyTWF0ZXJpYWw/KGc9WyIjZGVmaW5lIFNIQURFUl9UWVBFICIrZS5zaGFkZXJUeXBlLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrZS5zaGFkZXJOYW1lLHBdLmZpbHRlcihubCkuam9pbihgCmApLGcubGVuZ3RoPjAmJihnKz1gCmApLG09WyIjZGVmaW5lIFNIQURFUl9UWVBFICIrZS5zaGFkZXJUeXBlLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrZS5zaGFkZXJOYW1lLHBdLmZpbHRlcihubCkuam9pbihgCmApLG0ubGVuZ3RoPjAmJihtKz1gCmApKTooZz1bUXgoZSksIiNkZWZpbmUgU0hBREVSX1RZUEUgIitlLnNoYWRlclR5cGUsIiNkZWZpbmUgU0hBREVSX05BTUUgIitlLnNoYWRlck5hbWUscCxlLmV4dGVuc2lvbkNsaXBDdWxsRGlzdGFuY2U/IiNkZWZpbmUgVVNFX0NMSVBfRElTVEFOQ0UiOiIiLGUuYmF0Y2hpbmc/IiNkZWZpbmUgVVNFX0JBVENISU5HIjoiIixlLmJhdGNoaW5nQ29sb3I/IiNkZWZpbmUgVVNFX0JBVENISU5HX0NPTE9SIjoiIixlLmluc3RhbmNpbmc/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkciOiIiLGUuaW5zdGFuY2luZ0NvbG9yPyIjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX0NPTE9SIjoiIixlLmluc3RhbmNpbmdNb3JwaD8iI2RlZmluZSBVU0VfSU5TVEFOQ0lOR19NT1JQSCI6IiIsZS51c2VGb2cmJmUuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLGUudXNlRm9nJiZlLmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLGUubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLGUuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLGUuZW52TWFwPyIjZGVmaW5lICIrdToiIixlLmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsZS5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLGUuYnVtcE1hcD8iI2RlZmluZSBVU0VfQlVNUE1BUCI6IiIsZS5ub3JtYWxNYXA/IiNkZWZpbmUgVVNFX05PUk1BTE1BUCI6IiIsZS5ub3JtYWxNYXBPYmplY3RTcGFjZT8iI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFIjoiIixlLm5vcm1hbE1hcFRhbmdlbnRTcGFjZT8iI2RlZmluZSBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSI6IiIsZS5kaXNwbGFjZW1lbnRNYXA/IiNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCI6IiIsZS5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLGUuYW5pc290cm9weT8iI2RlZmluZSBVU0VfQU5JU09UUk9QWSI6IiIsZS5hbmlzb3Ryb3B5TWFwPyIjZGVmaW5lIFVTRV9BTklTT1RST1BZTUFQIjoiIixlLmNsZWFyY29hdE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQIjoiIixlLmNsZWFyY29hdFJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUCI6IiIsZS5jbGVhcmNvYXROb3JtYWxNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAiOiIiLGUuaXJpZGVzY2VuY2VNYXA/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFTUFQIjoiIixlLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAiOiIiLGUuc3BlY3VsYXJNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQIjoiIixlLnNwZWN1bGFyQ29sb3JNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSX0NPTE9STUFQIjoiIixlLnNwZWN1bGFySW50ZW5zaXR5TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAiOiIiLGUucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLGUubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLGUuYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIixlLmFscGhhSGFzaD8iI2RlZmluZSBVU0VfQUxQSEFIQVNIIjoiIixlLnRyYW5zbWlzc2lvbj8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OIjoiIixlLnRyYW5zbWlzc2lvbk1hcD8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQIjoiIixlLnRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfVEhJQ0tORVNTTUFQIjoiIixlLnNoZWVuQ29sb3JNYXA/IiNkZWZpbmUgVVNFX1NIRUVOX0NPTE9STUFQIjoiIixlLnNoZWVuUm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAiOiIiLGUubWFwVXY/IiNkZWZpbmUgTUFQX1VWICIrZS5tYXBVdjoiIixlLmFscGhhTWFwVXY/IiNkZWZpbmUgQUxQSEFNQVBfVVYgIitlLmFscGhhTWFwVXY6IiIsZS5saWdodE1hcFV2PyIjZGVmaW5lIExJR0hUTUFQX1VWICIrZS5saWdodE1hcFV2OiIiLGUuYW9NYXBVdj8iI2RlZmluZSBBT01BUF9VViAiK2UuYW9NYXBVdjoiIixlLmVtaXNzaXZlTWFwVXY/IiNkZWZpbmUgRU1JU1NJVkVNQVBfVVYgIitlLmVtaXNzaXZlTWFwVXY6IiIsZS5idW1wTWFwVXY/IiNkZWZpbmUgQlVNUE1BUF9VViAiK2UuYnVtcE1hcFV2OiIiLGUubm9ybWFsTWFwVXY/IiNkZWZpbmUgTk9STUFMTUFQX1VWICIrZS5ub3JtYWxNYXBVdjoiIixlLmRpc3BsYWNlbWVudE1hcFV2PyIjZGVmaW5lIERJU1BMQUNFTUVOVE1BUF9VViAiK2UuZGlzcGxhY2VtZW50TWFwVXY6IiIsZS5tZXRhbG5lc3NNYXBVdj8iI2RlZmluZSBNRVRBTE5FU1NNQVBfVVYgIitlLm1ldGFsbmVzc01hcFV2OiIiLGUucm91Z2huZXNzTWFwVXY/IiNkZWZpbmUgUk9VR0hORVNTTUFQX1VWICIrZS5yb3VnaG5lc3NNYXBVdjoiIixlLmFuaXNvdHJvcHlNYXBVdj8iI2RlZmluZSBBTklTT1RST1BZTUFQX1VWICIrZS5hbmlzb3Ryb3B5TWFwVXY6IiIsZS5jbGVhcmNvYXRNYXBVdj8iI2RlZmluZSBDTEVBUkNPQVRNQVBfVVYgIitlLmNsZWFyY29hdE1hcFV2OiIiLGUuY2xlYXJjb2F0Tm9ybWFsTWFwVXY/IiNkZWZpbmUgQ0xFQVJDT0FUX05PUk1BTE1BUF9VViAiK2UuY2xlYXJjb2F0Tm9ybWFsTWFwVXY6IiIsZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdj8iI2RlZmluZSBDTEVBUkNPQVRfUk9VR0hORVNTTUFQX1VWICIrZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjoiIixlLmlyaWRlc2NlbmNlTWFwVXY/IiNkZWZpbmUgSVJJREVTQ0VOQ0VNQVBfVVYgIitlLmlyaWRlc2NlbmNlTWFwVXY6IiIsZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2PyIjZGVmaW5lIElSSURFU0NFTkNFX1RISUNLTkVTU01BUF9VViAiK2UuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdjoiIixlLnNoZWVuQ29sb3JNYXBVdj8iI2RlZmluZSBTSEVFTl9DT0xPUk1BUF9VViAiK2Uuc2hlZW5Db2xvck1hcFV2OiIiLGUuc2hlZW5Sb3VnaG5lc3NNYXBVdj8iI2RlZmluZSBTSEVFTl9ST1VHSE5FU1NNQVBfVVYgIitlLnNoZWVuUm91Z2huZXNzTWFwVXY6IiIsZS5zcGVjdWxhck1hcFV2PyIjZGVmaW5lIFNQRUNVTEFSTUFQX1VWICIrZS5zcGVjdWxhck1hcFV2OiIiLGUuc3BlY3VsYXJDb2xvck1hcFV2PyIjZGVmaW5lIFNQRUNVTEFSX0NPTE9STUFQX1VWICIrZS5zcGVjdWxhckNvbG9yTWFwVXY6IiIsZS5zcGVjdWxhckludGVuc2l0eU1hcFV2PyIjZGVmaW5lIFNQRUNVTEFSX0lOVEVOU0lUWU1BUF9VViAiK2Uuc3BlY3VsYXJJbnRlbnNpdHlNYXBVdjoiIixlLnRyYW5zbWlzc2lvbk1hcFV2PyIjZGVmaW5lIFRSQU5TTUlTU0lPTk1BUF9VViAiK2UudHJhbnNtaXNzaW9uTWFwVXY6IiIsZS50aGlja25lc3NNYXBVdj8iI2RlZmluZSBUSElDS05FU1NNQVBfVVYgIitlLnRoaWNrbmVzc01hcFV2OiIiLGUudmVydGV4VGFuZ2VudHMmJmUuZmxhdFNoYWRpbmc9PT0hMT8iI2RlZmluZSBVU0VfVEFOR0VOVCI6IiIsZS52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIixlLnZlcnRleEFscGhhcz8iI2RlZmluZSBVU0VfQ09MT1JfQUxQSEEiOiIiLGUudmVydGV4VXYxcz8iI2RlZmluZSBVU0VfVVYxIjoiIixlLnZlcnRleFV2MnM/IiNkZWZpbmUgVVNFX1VWMiI6IiIsZS52ZXJ0ZXhVdjNzPyIjZGVmaW5lIFVTRV9VVjMiOiIiLGUucG9pbnRzVXZzPyIjZGVmaW5lIFVTRV9QT0lOVFNfVVYiOiIiLGUuZmxhdFNoYWRpbmc/IiNkZWZpbmUgRkxBVF9TSEFERUQiOiIiLGUuc2tpbm5pbmc/IiNkZWZpbmUgVVNFX1NLSU5OSU5HIjoiIixlLm1vcnBoVGFyZ2V0cz8iI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTIjoiIixlLm1vcnBoTm9ybWFscyYmZS5mbGF0U2hhZGluZz09PSExPyIjZGVmaW5lIFVTRV9NT1JQSE5PUk1BTFMiOiIiLGUubW9ycGhDb2xvcnM/IiNkZWZpbmUgVVNFX01PUlBIQ09MT1JTIjoiIixlLm1vcnBoVGFyZ2V0c0NvdW50PjA/IiNkZWZpbmUgTU9SUEhUQVJHRVRTX1RFWFRVUkVfU1RSSURFICIrZS5tb3JwaFRleHR1cmVTdHJpZGU6IiIsZS5tb3JwaFRhcmdldHNDb3VudD4wPyIjZGVmaW5lIE1PUlBIVEFSR0VUU19DT1VOVCAiK2UubW9ycGhUYXJnZXRzQ291bnQ6IiIsZS5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLGUuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLGUuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIixlLnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitsOiIiLGUuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLGUubnVtTGlnaHRQcm9iZXM+MD8iI2RlZmluZSBVU0VfTElHSFRfUFJPQkVTIjoiIixlLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIixlLnJldmVyc2VEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfUkVWRVJTRURFUFRIQlVGIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwidW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7IiwidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwidW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwidW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOyIsIiNpZmRlZiBVU0VfSU5TVEFOQ0lORyIsIglhdHRyaWJ1dGUgbWF0NCBpbnN0YW5jZU1hdHJpeDsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1IiLCIJYXR0cmlidXRlIHZlYzMgaW5zdGFuY2VDb2xvcjsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX0lOU1RBTkNJTkdfTU9SUEgiLCIJdW5pZm9ybSBzYW1wbGVyMkQgbW9ycGhUZXh0dXJlOyIsIiNlbmRpZiIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1VWMSIsIglhdHRyaWJ1dGUgdmVjMiB1djE7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9VVjIiLCIJYXR0cmlidXRlIHZlYzIgdXYyOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfVVYzIiwiCWF0dHJpYnV0ZSB2ZWMyIHV2MzsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCIJYXR0cmlidXRlIHZlYzQgdGFuZ2VudDsiLCIjZW5kaWYiLCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkiLCIJYXR0cmlidXRlIHZlYzQgY29sb3I7IiwiI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkiLCIJYXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9TS0lOTklORyIsIglhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiCWF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7IiwiI2VuZGlmIixgCmBdLmZpbHRlcihubCkuam9pbihgCmApLG09W1F4KGUpLCIjZGVmaW5lIFNIQURFUl9UWVBFICIrZS5zaGFkZXJUeXBlLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrZS5zaGFkZXJOYW1lLHAsZS51c2VGb2cmJmUuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLGUudXNlRm9nJiZlLmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLGUuYWxwaGFUb0NvdmVyYWdlPyIjZGVmaW5lIEFMUEhBX1RPX0NPVkVSQUdFIjoiIixlLm1hcD8iI2RlZmluZSBVU0VfTUFQIjoiIixlLm1hdGNhcD8iI2RlZmluZSBVU0VfTUFUQ0FQIjoiIixlLmVudk1hcD8iI2RlZmluZSBVU0VfRU5WTUFQIjoiIixlLmVudk1hcD8iI2RlZmluZSAiK2M6IiIsZS5lbnZNYXA/IiNkZWZpbmUgIit1OiIiLGUuZW52TWFwPyIjZGVmaW5lICIraDoiIixmPyIjZGVmaW5lIENVQkVVVl9URVhFTF9XSURUSCAiK2YudGV4ZWxXaWR0aDoiIixmPyIjZGVmaW5lIENVQkVVVl9URVhFTF9IRUlHSFQgIitmLnRleGVsSGVpZ2h0OiIiLGY/IiNkZWZpbmUgQ1VCRVVWX01BWF9NSVAgIitmLm1heE1pcCsiLjAiOiIiLGUubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIixlLmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsZS5idW1wTWFwPyIjZGVmaW5lIFVTRV9CVU1QTUFQIjoiIixlLm5vcm1hbE1hcD8iI2RlZmluZSBVU0VfTk9STUFMTUFQIjoiIixlLm5vcm1hbE1hcE9iamVjdFNwYWNlPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UiOiIiLGUubm9ybWFsTWFwVGFuZ2VudFNwYWNlPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIjoiIixlLmVtaXNzaXZlTWFwPyIjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCI6IiIsZS5hbmlzb3Ryb3B5PyIjZGVmaW5lIFVTRV9BTklTT1RST1BZIjoiIixlLmFuaXNvdHJvcHlNYXA/IiNkZWZpbmUgVVNFX0FOSVNPVFJPUFlNQVAiOiIiLGUuY2xlYXJjb2F0PyIjZGVmaW5lIFVTRV9DTEVBUkNPQVQiOiIiLGUuY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLGUuY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIixlLmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsZS5kaXNwZXJzaW9uPyIjZGVmaW5lIFVTRV9ESVNQRVJTSU9OIjoiIixlLmlyaWRlc2NlbmNlPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRSI6IiIsZS5pcmlkZXNjZW5jZU1hcD8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VNQVAiOiIiLGUuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCI6IiIsZS5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLGUuc3BlY3VsYXJDb2xvck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAiOiIiLGUuc3BlY3VsYXJJbnRlbnNpdHlNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUCI6IiIsZS5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsZS5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsZS5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLGUuYWxwaGFUZXN0PyIjZGVmaW5lIFVTRV9BTFBIQVRFU1QiOiIiLGUuYWxwaGFIYXNoPyIjZGVmaW5lIFVTRV9BTFBIQUhBU0giOiIiLGUuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIixlLnNoZWVuQ29sb3JNYXA/IiNkZWZpbmUgVVNFX1NIRUVOX0NPTE9STUFQIjoiIixlLnNoZWVuUm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAiOiIiLGUudHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLGUudHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLGUudGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLGUudmVydGV4VGFuZ2VudHMmJmUuZmxhdFNoYWRpbmc9PT0hMT8iI2RlZmluZSBVU0VfVEFOR0VOVCI6IiIsZS52ZXJ0ZXhDb2xvcnN8fGUuaW5zdGFuY2luZ0NvbG9yfHxlLmJhdGNoaW5nQ29sb3I/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIixlLnZlcnRleEFscGhhcz8iI2RlZmluZSBVU0VfQ09MT1JfQUxQSEEiOiIiLGUudmVydGV4VXYxcz8iI2RlZmluZSBVU0VfVVYxIjoiIixlLnZlcnRleFV2MnM/IiNkZWZpbmUgVVNFX1VWMiI6IiIsZS52ZXJ0ZXhVdjNzPyIjZGVmaW5lIFVTRV9VVjMiOiIiLGUucG9pbnRzVXZzPyIjZGVmaW5lIFVTRV9QT0lOVFNfVVYiOiIiLGUuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIixlLmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIixlLmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsZS5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsZS5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLGUuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK2w6IiIsZS5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsZS5udW1MaWdodFByb2Jlcz4wPyIjZGVmaW5lIFVTRV9MSUdIVF9QUk9CRVMiOiIiLGUuZGVjb2RlVmlkZW9UZXh0dXJlPyIjZGVmaW5lIERFQ09ERV9WSURFT19URVhUVVJFIjoiIixlLmRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlPyIjZGVmaW5lIERFQ09ERV9WSURFT19URVhUVVJFX0VNSVNTSVZFIjoiIixlLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIixlLnJldmVyc2VEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfUkVWRVJTRURFUFRIQlVGIjoiIiwidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsInVuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsiLGUudG9uZU1hcHBpbmchPT16aT8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLGUudG9uZU1hcHBpbmchPT16aT9qdC50b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiIiLGUudG9uZU1hcHBpbmchPT16aT9sSSgidG9uZU1hcHBpbmciLGUudG9uZU1hcHBpbmcpOiIiLGUuZGl0aGVyaW5nPyIjZGVmaW5lIERJVEhFUklORyI6IiIsZS5vcGFxdWU/IiNkZWZpbmUgT1BBUVVFIjoiIixqdC5jb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQsYUkoImxpbmVhclRvT3V0cHV0VGV4ZWwiLGUub3V0cHV0Q29sb3JTcGFjZSksY0koKSxlLnVzZURlcHRoUGFja2luZz8iI2RlZmluZSBERVBUSF9QQUNLSU5HICIrZS5kZXB0aFBhY2tpbmc6IiIsYApgXS5maWx0ZXIobmwpLmpvaW4oYApgKSksbz1rcChvKSxvPUp4KG8sZSksbz1qeChvLGUpLGE9a3AoYSksYT1KeChhLGUpLGE9angoYSxlKSxvPUt4KG8pLGE9S3goYSksZS5pc1Jhd1NoYWRlck1hdGVyaWFsIT09ITAmJih2PWAjdmVyc2lvbiAzMDAgZXMKYCxnPVtkLCIjZGVmaW5lIGF0dHJpYnV0ZSBpbiIsIiNkZWZpbmUgdmFyeWluZyBvdXQiLCIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIl0uam9pbihgCmApK2AKYCtnLG09WyIjZGVmaW5lIHZhcnlpbmcgaW4iLGUuZ2xzbFZlcnNpb249PT1nZD8iIjoibGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOyIsZS5nbHNsVmVyc2lvbj09PWdkPyIiOiIjZGVmaW5lIGdsX0ZyYWdDb2xvciBwY19mcmFnQ29sb3IiLCIjZGVmaW5lIGdsX0ZyYWdEZXB0aEVYVCBnbF9GcmFnRGVwdGgiLCIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qIHRleHR1cmVQcm9qIiwiI2RlZmluZSB0ZXh0dXJlMkRMb2RFWFQgdGV4dHVyZUxvZCIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZCIsIiNkZWZpbmUgdGV4dHVyZUN1YmVMb2RFWFQgdGV4dHVyZUxvZCIsIiNkZWZpbmUgdGV4dHVyZTJER3JhZEVYVCB0ZXh0dXJlR3JhZCIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZUdyYWRFWFQgdGV4dHVyZUdyYWQiXS5qb2luKGAKYCkrYApgK20pO2NvbnN0IHg9ditnK28sXz12K20rYSxNPXF4KHIsci5WRVJURVhfU0hBREVSLHgpLGI9cXgocixyLkZSQUdNRU5UX1NIQURFUixfKTtyLmF0dGFjaFNoYWRlcih5LE0pLHIuYXR0YWNoU2hhZGVyKHksYiksZS5pbmRleDBBdHRyaWJ1dGVOYW1lIT09dm9pZCAwP3IuYmluZEF0dHJpYkxvY2F0aW9uKHksMCxlLmluZGV4MEF0dHJpYnV0ZU5hbWUpOmUubW9ycGhUYXJnZXRzPT09ITAmJnIuYmluZEF0dHJpYkxvY2F0aW9uKHksMCwicG9zaXRpb24iKSxyLmxpbmtQcm9ncmFtKHkpO2Z1bmN0aW9uIEEoVCl7aWYoaS5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyl7Y29uc3QgRD1yLmdldFByb2dyYW1JbmZvTG9nKHkpLnRyaW0oKSxMPXIuZ2V0U2hhZGVySW5mb0xvZyhNKS50cmltKCksTj1yLmdldFNoYWRlckluZm9Mb2coYikudHJpbSgpO2xldCBGPSEwLEI9ITA7aWYoci5nZXRQcm9ncmFtUGFyYW1ldGVyKHksci5MSU5LX1NUQVRVUyk9PT0hMSlpZihGPSExLHR5cGVvZiBpLmRlYnVnLm9uU2hhZGVyRXJyb3I9PSJmdW5jdGlvbiIpaS5kZWJ1Zy5vblNoYWRlckVycm9yKHIseSxNLGIpO2Vsc2V7Y29uc3QgRz1aeChyLE0sInZlcnRleCIpLGs9WngocixiLCJmcmFnbWVudCIpO2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUHJvZ3JhbTogU2hhZGVyIEVycm9yICIrci5nZXRFcnJvcigpKyIgLSBWQUxJREFURV9TVEFUVVMgIityLmdldFByb2dyYW1QYXJhbWV0ZXIoeSxyLlZBTElEQVRFX1NUQVRVUykrYAoKTWF0ZXJpYWwgTmFtZTogYCtULm5hbWUrYApNYXRlcmlhbCBUeXBlOiBgK1QudHlwZStgCgpQcm9ncmFtIEluZm8gTG9nOiBgK0QrYApgK0crYApgK2spfWVsc2UgRCE9PSIiP2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBQcm9ncmFtIEluZm8gTG9nOiIsRCk6KEw9PT0iInx8Tj09PSIiKSYmKEI9ITEpO0ImJihULmRpYWdub3N0aWNzPXtydW5uYWJsZTpGLHByb2dyYW1Mb2c6RCx2ZXJ0ZXhTaGFkZXI6e2xvZzpMLHByZWZpeDpnfSxmcmFnbWVudFNoYWRlcjp7bG9nOk4scHJlZml4Om19fSl9ci5kZWxldGVTaGFkZXIoTSksci5kZWxldGVTaGFkZXIoYiksRT1uZXcganUocix5KSx3PWZJKHIseSl9bGV0IEU7dGhpcy5nZXRVbmlmb3Jtcz1mdW5jdGlvbigpe3JldHVybiBFPT09dm9pZCAwJiZBKHRoaXMpLEV9O2xldCB3O3RoaXMuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiB3PT09dm9pZCAwJiZBKHRoaXMpLHd9O2xldCBTPWUucmVuZGVyZXJFeHRlbnNpb25QYXJhbGxlbFNoYWRlckNvbXBpbGU9PT0hMTtyZXR1cm4gdGhpcy5pc1JlYWR5PWZ1bmN0aW9uKCl7cmV0dXJuIFM9PT0hMSYmKFM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKHksaUkpKSxTfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtuLnJlbGVhc2VTdGF0ZXNPZlByb2dyYW0odGhpcyksci5kZWxldGVQcm9ncmFtKHkpLHRoaXMucHJvZ3JhbT12b2lkIDB9LHRoaXMudHlwZT1lLnNoYWRlclR5cGUsdGhpcy5uYW1lPWUuc2hhZGVyTmFtZSx0aGlzLmlkPXJJKyssdGhpcy5jYWNoZUtleT10LHRoaXMudXNlZFRpbWVzPTEsdGhpcy5wcm9ncmFtPXksdGhpcy52ZXJ0ZXhTaGFkZXI9TSx0aGlzLmZyYWdtZW50U2hhZGVyPWIsdGhpc31sZXQgd0k9MDtjbGFzcyBBSXtjb25zdHJ1Y3Rvcigpe3RoaXMuc2hhZGVyQ2FjaGU9bmV3IE1hcCx0aGlzLm1hdGVyaWFsQ2FjaGU9bmV3IE1hcH11cGRhdGUodCl7Y29uc3QgZT10LnZlcnRleFNoYWRlcixuPXQuZnJhZ21lbnRTaGFkZXIscj10aGlzLl9nZXRTaGFkZXJTdGFnZShlKSxzPXRoaXMuX2dldFNoYWRlclN0YWdlKG4pLG89dGhpcy5fZ2V0U2hhZGVyQ2FjaGVGb3JNYXRlcmlhbCh0KTtyZXR1cm4gby5oYXMocik9PT0hMSYmKG8uYWRkKHIpLHIudXNlZFRpbWVzKyspLG8uaGFzKHMpPT09ITEmJihvLmFkZChzKSxzLnVzZWRUaW1lcysrKSx0aGlzfXJlbW92ZSh0KXtjb25zdCBlPXRoaXMubWF0ZXJpYWxDYWNoZS5nZXQodCk7Zm9yKGNvbnN0IG4gb2YgZSluLnVzZWRUaW1lcy0tLG4udXNlZFRpbWVzPT09MCYmdGhpcy5zaGFkZXJDYWNoZS5kZWxldGUobi5jb2RlKTtyZXR1cm4gdGhpcy5tYXRlcmlhbENhY2hlLmRlbGV0ZSh0KSx0aGlzfWdldFZlcnRleFNoYWRlcklEKHQpe3JldHVybiB0aGlzLl9nZXRTaGFkZXJTdGFnZSh0LnZlcnRleFNoYWRlcikuaWR9Z2V0RnJhZ21lbnRTaGFkZXJJRCh0KXtyZXR1cm4gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UodC5mcmFnbWVudFNoYWRlcikuaWR9ZGlzcG9zZSgpe3RoaXMuc2hhZGVyQ2FjaGUuY2xlYXIoKSx0aGlzLm1hdGVyaWFsQ2FjaGUuY2xlYXIoKX1fZ2V0U2hhZGVyQ2FjaGVGb3JNYXRlcmlhbCh0KXtjb25zdCBlPXRoaXMubWF0ZXJpYWxDYWNoZTtsZXQgbj1lLmdldCh0KTtyZXR1cm4gbj09PXZvaWQgMCYmKG49bmV3IFNldCxlLnNldCh0LG4pKSxufV9nZXRTaGFkZXJTdGFnZSh0KXtjb25zdCBlPXRoaXMuc2hhZGVyQ2FjaGU7bGV0IG49ZS5nZXQodCk7cmV0dXJuIG49PT12b2lkIDAmJihuPW5ldyBFSSh0KSxlLnNldCh0LG4pKSxufX1jbGFzcyBFSXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmlkPXdJKyssdGhpcy5jb2RlPXQsdGhpcy51c2VkVGltZXM9MH19ZnVuY3Rpb24gVEkoaSx0LGUsbixyLHMsbyl7Y29uc3QgYT1uZXcgVmMsbD1uZXcgQUksYz1uZXcgU2V0LHU9W10saD1yLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsZj1yLnZlcnRleFRleHR1cmVzO2xldCBkPXIucHJlY2lzaW9uO2NvbnN0IHA9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJ0b29uIixNZXNoU3RhbmRhcmRNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hQaHlzaWNhbE1hdGVyaWFsOiJwaHlzaWNhbCIsTWVzaE1hdGNhcE1hdGVyaWFsOiJtYXRjYXAiLExpbmVCYXNpY01hdGVyaWFsOiJiYXNpYyIsTGluZURhc2hlZE1hdGVyaWFsOiJkYXNoZWQiLFBvaW50c01hdGVyaWFsOiJwb2ludHMiLFNoYWRvd01hdGVyaWFsOiJzaGFkb3ciLFNwcml0ZU1hdGVyaWFsOiJzcHJpdGUifTtmdW5jdGlvbiB5KHcpe3JldHVybiBjLmFkZCh3KSx3PT09MD8idXYiOmB1diR7d31gfWZ1bmN0aW9uIGcodyxTLFQsRCxMKXtjb25zdCBOPUQuZm9nLEY9TC5nZW9tZXRyeSxCPXcuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9ELmVudmlyb25tZW50Om51bGwsRz0ody5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP2U6dCkuZ2V0KHcuZW52TWFwfHxCKSxrPUcmJkcubWFwcGluZz09PXFzP0cuaW1hZ2UuaGVpZ2h0Om51bGwsUT1wW3cudHlwZV07dy5wcmVjaXNpb24hPT1udWxsJiYoZD1yLmdldE1heFByZWNpc2lvbih3LnByZWNpc2lvbiksZCE9PXcucHJlY2lzaW9uJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOiIsdy5wcmVjaXNpb24sIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixkLCJpbnN0ZWFkLiIpKTtjb25zdCBjdD1GLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbnx8Ri5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxGLm1vcnBoQXR0cmlidXRlcy5jb2xvcixodD1jdCE9PXZvaWQgMD9jdC5sZW5ndGg6MDtsZXQgUHQ9MDtGLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiE9PXZvaWQgMCYmKFB0PTEpLEYubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCE9PXZvaWQgMCYmKFB0PTIpLEYubW9ycGhBdHRyaWJ1dGVzLmNvbG9yIT09dm9pZCAwJiYoUHQ9Myk7bGV0IFh0LGoscnQsRXQ7aWYoUSl7Y29uc3QgeWU9cGlbUV07WHQ9eWUudmVydGV4U2hhZGVyLGo9eWUuZnJhZ21lbnRTaGFkZXJ9ZWxzZSBYdD13LnZlcnRleFNoYWRlcixqPXcuZnJhZ21lbnRTaGFkZXIsbC51cGRhdGUodykscnQ9bC5nZXRWZXJ0ZXhTaGFkZXJJRCh3KSxFdD1sLmdldEZyYWdtZW50U2hhZGVySUQodyk7Y29uc3QgdXQ9aS5nZXRSZW5kZXJUYXJnZXQoKSxMdD1pLnN0YXRlLmJ1ZmZlcnMuZGVwdGguZ2V0UmV2ZXJzZWQoKSxPdD1MLmlzSW5zdGFuY2VkTWVzaD09PSEwLEl0PUwuaXNCYXRjaGVkTWVzaD09PSEwLHRlPSEhdy5tYXAsbnQ9ISF3Lm1hdGNhcCxzdD0hIUcsVT0hIXcuYW9NYXAsQ3Q9ISF3LmxpZ2h0TWFwLG90PSEhdy5idW1wTWFwLFN0PSEhdy5ub3JtYWxNYXAsVz0hIXcuZGlzcGxhY2VtZW50TWFwLGV0PSEhdy5lbWlzc2l2ZU1hcCxaPSEhdy5tZXRhbG5lc3NNYXAsUD0hIXcucm91Z2huZXNzTWFwLEM9dy5hbmlzb3Ryb3B5PjAsTz13LmNsZWFyY29hdD4wLCQ9dy5kaXNwZXJzaW9uPjAsdHQ9dy5pcmlkZXNjZW5jZT4wLEo9dy5zaGVlbj4wLGR0PXcudHJhbnNtaXNzaW9uPjAsZnQ9QyYmISF3LmFuaXNvdHJvcHlNYXAseXQ9TyYmISF3LmNsZWFyY29hdE1hcCxWdD1PJiYhIXcuY2xlYXJjb2F0Tm9ybWFsTWFwLGF0PU8mJiEhdy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsYnQ9dHQmJiEhdy5pcmlkZXNjZW5jZU1hcCxEdD10dCYmISF3LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLHp0PUomJiEhdy5zaGVlbkNvbG9yTWFwLHd0PUomJiEhdy5zaGVlblJvdWdobmVzc01hcCxlZT0hIXcuc3BlY3VsYXJNYXAsWXQ9ISF3LnNwZWN1bGFyQ29sb3JNYXAsdmU9ISF3LnNwZWN1bGFySW50ZW5zaXR5TWFwLHo9ZHQmJiEhdy50cmFuc21pc3Npb25NYXAsbXQ9ZHQmJiEhdy50aGlja25lc3NNYXAsSz0hIXcuZ3JhZGllbnRNYXAsaXQ9ISF3LmFscGhhTWFwLHZ0PXcuYWxwaGFUZXN0PjAsX3Q9ISF3LmFscGhhSGFzaCxLdD0hIXcuZXh0ZW5zaW9ucztsZXQgTGU9emk7dy50b25lTWFwcGVkJiYodXQ9PT1udWxsfHx1dC5pc1hSUmVuZGVyVGFyZ2V0PT09ITApJiYoTGU9aS50b25lTWFwcGluZyk7Y29uc3Qgc249e3NoYWRlcklEOlEsc2hhZGVyVHlwZTp3LnR5cGUsc2hhZGVyTmFtZTp3Lm5hbWUsdmVydGV4U2hhZGVyOlh0LGZyYWdtZW50U2hhZGVyOmosZGVmaW5lczp3LmRlZmluZXMsY3VzdG9tVmVydGV4U2hhZGVySUQ6cnQsY3VzdG9tRnJhZ21lbnRTaGFkZXJJRDpFdCxpc1Jhd1NoYWRlck1hdGVyaWFsOncuaXNSYXdTaGFkZXJNYXRlcmlhbD09PSEwLGdsc2xWZXJzaW9uOncuZ2xzbFZlcnNpb24scHJlY2lzaW9uOmQsYmF0Y2hpbmc6SXQsYmF0Y2hpbmdDb2xvcjpJdCYmTC5fY29sb3JzVGV4dHVyZSE9PW51bGwsaW5zdGFuY2luZzpPdCxpbnN0YW5jaW5nQ29sb3I6T3QmJkwuaW5zdGFuY2VDb2xvciE9PW51bGwsaW5zdGFuY2luZ01vcnBoOk90JiZMLm1vcnBoVGV4dHVyZSE9PW51bGwsc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczpmLG91dHB1dENvbG9yU3BhY2U6dXQ9PT1udWxsP2kub3V0cHV0Q29sb3JTcGFjZTp1dC5pc1hSUmVuZGVyVGFyZ2V0PT09ITA/dXQudGV4dHVyZS5jb2xvclNwYWNlOmpyLGFscGhhVG9Db3ZlcmFnZTohIXcuYWxwaGFUb0NvdmVyYWdlLG1hcDp0ZSxtYXRjYXA6bnQsZW52TWFwOnN0LGVudk1hcE1vZGU6c3QmJkcubWFwcGluZyxlbnZNYXBDdWJlVVZIZWlnaHQ6ayxhb01hcDpVLGxpZ2h0TWFwOkN0LGJ1bXBNYXA6b3Qsbm9ybWFsTWFwOlN0LGRpc3BsYWNlbWVudE1hcDpmJiZXLGVtaXNzaXZlTWFwOmV0LG5vcm1hbE1hcE9iamVjdFNwYWNlOlN0JiZ3Lm5vcm1hbE1hcFR5cGU9PT1heSxub3JtYWxNYXBUYW5nZW50U3BhY2U6U3QmJncubm9ybWFsTWFwVHlwZT09PWdyLG1ldGFsbmVzc01hcDpaLHJvdWdobmVzc01hcDpQLGFuaXNvdHJvcHk6Qyxhbmlzb3Ryb3B5TWFwOmZ0LGNsZWFyY29hdDpPLGNsZWFyY29hdE1hcDp5dCxjbGVhcmNvYXROb3JtYWxNYXA6VnQsY2xlYXJjb2F0Um91Z2huZXNzTWFwOmF0LGRpc3BlcnNpb246JCxpcmlkZXNjZW5jZTp0dCxpcmlkZXNjZW5jZU1hcDpidCxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDpEdCxzaGVlbjpKLHNoZWVuQ29sb3JNYXA6enQsc2hlZW5Sb3VnaG5lc3NNYXA6d3Qsc3BlY3VsYXJNYXA6ZWUsc3BlY3VsYXJDb2xvck1hcDpZdCxzcGVjdWxhckludGVuc2l0eU1hcDp2ZSx0cmFuc21pc3Npb246ZHQsdHJhbnNtaXNzaW9uTWFwOnosdGhpY2tuZXNzTWFwOm10LGdyYWRpZW50TWFwOkssb3BhcXVlOncudHJhbnNwYXJlbnQ9PT0hMSYmdy5ibGVuZGluZz09PVdyJiZ3LmFscGhhVG9Db3ZlcmFnZT09PSExLGFscGhhTWFwOml0LGFscGhhVGVzdDp2dCxhbHBoYUhhc2g6X3QsY29tYmluZTp3LmNvbWJpbmUsbWFwVXY6dGUmJnkody5tYXAuY2hhbm5lbCksYW9NYXBVdjpVJiZ5KHcuYW9NYXAuY2hhbm5lbCksbGlnaHRNYXBVdjpDdCYmeSh3LmxpZ2h0TWFwLmNoYW5uZWwpLGJ1bXBNYXBVdjpvdCYmeSh3LmJ1bXBNYXAuY2hhbm5lbCksbm9ybWFsTWFwVXY6U3QmJnkody5ub3JtYWxNYXAuY2hhbm5lbCksZGlzcGxhY2VtZW50TWFwVXY6VyYmeSh3LmRpc3BsYWNlbWVudE1hcC5jaGFubmVsKSxlbWlzc2l2ZU1hcFV2OmV0JiZ5KHcuZW1pc3NpdmVNYXAuY2hhbm5lbCksbWV0YWxuZXNzTWFwVXY6WiYmeSh3Lm1ldGFsbmVzc01hcC5jaGFubmVsKSxyb3VnaG5lc3NNYXBVdjpQJiZ5KHcucm91Z2huZXNzTWFwLmNoYW5uZWwpLGFuaXNvdHJvcHlNYXBVdjpmdCYmeSh3LmFuaXNvdHJvcHlNYXAuY2hhbm5lbCksY2xlYXJjb2F0TWFwVXY6eXQmJnkody5jbGVhcmNvYXRNYXAuY2hhbm5lbCksY2xlYXJjb2F0Tm9ybWFsTWFwVXY6VnQmJnkody5jbGVhcmNvYXROb3JtYWxNYXAuY2hhbm5lbCksY2xlYXJjb2F0Um91Z2huZXNzTWFwVXY6YXQmJnkody5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuY2hhbm5lbCksaXJpZGVzY2VuY2VNYXBVdjpidCYmeSh3LmlyaWRlc2NlbmNlTWFwLmNoYW5uZWwpLGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY6RHQmJnkody5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC5jaGFubmVsKSxzaGVlbkNvbG9yTWFwVXY6enQmJnkody5zaGVlbkNvbG9yTWFwLmNoYW5uZWwpLHNoZWVuUm91Z2huZXNzTWFwVXY6d3QmJnkody5zaGVlblJvdWdobmVzc01hcC5jaGFubmVsKSxzcGVjdWxhck1hcFV2OmVlJiZ5KHcuc3BlY3VsYXJNYXAuY2hhbm5lbCksc3BlY3VsYXJDb2xvck1hcFV2Oll0JiZ5KHcuc3BlY3VsYXJDb2xvck1hcC5jaGFubmVsKSxzcGVjdWxhckludGVuc2l0eU1hcFV2OnZlJiZ5KHcuc3BlY3VsYXJJbnRlbnNpdHlNYXAuY2hhbm5lbCksdHJhbnNtaXNzaW9uTWFwVXY6eiYmeSh3LnRyYW5zbWlzc2lvbk1hcC5jaGFubmVsKSx0aGlja25lc3NNYXBVdjptdCYmeSh3LnRoaWNrbmVzc01hcC5jaGFubmVsKSxhbHBoYU1hcFV2Oml0JiZ5KHcuYWxwaGFNYXAuY2hhbm5lbCksdmVydGV4VGFuZ2VudHM6ISFGLmF0dHJpYnV0ZXMudGFuZ2VudCYmKFN0fHxDKSx2ZXJ0ZXhDb2xvcnM6dy52ZXJ0ZXhDb2xvcnMsdmVydGV4QWxwaGFzOncudmVydGV4Q29sb3JzPT09ITAmJiEhRi5hdHRyaWJ1dGVzLmNvbG9yJiZGLmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemU9PT00LHBvaW50c1V2czpMLmlzUG9pbnRzPT09ITAmJiEhRi5hdHRyaWJ1dGVzLnV2JiYodGV8fGl0KSxmb2c6ISFOLHVzZUZvZzp3LmZvZz09PSEwLGZvZ0V4cDI6ISFOJiZOLmlzRm9nRXhwMixmbGF0U2hhZGluZzp3LmZsYXRTaGFkaW5nPT09ITAsc2l6ZUF0dGVudWF0aW9uOncuc2l6ZUF0dGVudWF0aW9uPT09ITAsbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpoLHJldmVyc2VEZXB0aEJ1ZmZlcjpMdCxza2lubmluZzpMLmlzU2tpbm5lZE1lc2g9PT0hMCxtb3JwaFRhcmdldHM6Ri5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDAsbW9ycGhOb3JtYWxzOkYubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCE9PXZvaWQgMCxtb3JwaENvbG9yczpGLm1vcnBoQXR0cmlidXRlcy5jb2xvciE9PXZvaWQgMCxtb3JwaFRhcmdldHNDb3VudDpodCxtb3JwaFRleHR1cmVTdHJpZGU6UHQsbnVtRGlyTGlnaHRzOlMuZGlyZWN0aW9uYWwubGVuZ3RoLG51bVBvaW50TGlnaHRzOlMucG9pbnQubGVuZ3RoLG51bVNwb3RMaWdodHM6Uy5zcG90Lmxlbmd0aCxudW1TcG90TGlnaHRNYXBzOlMuc3BvdExpZ2h0TWFwLmxlbmd0aCxudW1SZWN0QXJlYUxpZ2h0czpTLnJlY3RBcmVhLmxlbmd0aCxudW1IZW1pTGlnaHRzOlMuaGVtaS5sZW5ndGgsbnVtRGlyTGlnaHRTaGFkb3dzOlMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoLG51bVBvaW50TGlnaHRTaGFkb3dzOlMucG9pbnRTaGFkb3dNYXAubGVuZ3RoLG51bVNwb3RMaWdodFNoYWRvd3M6Uy5zcG90U2hhZG93TWFwLmxlbmd0aCxudW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM6Uy5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMsbnVtTGlnaHRQcm9iZXM6Uy5udW1MaWdodFByb2JlcyxudW1DbGlwcGluZ1BsYW5lczpvLm51bVBsYW5lcyxudW1DbGlwSW50ZXJzZWN0aW9uOm8ubnVtSW50ZXJzZWN0aW9uLGRpdGhlcmluZzp3LmRpdGhlcmluZyxzaGFkb3dNYXBFbmFibGVkOmkuc2hhZG93TWFwLmVuYWJsZWQmJlQubGVuZ3RoPjAsc2hhZG93TWFwVHlwZTppLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkxlLGRlY29kZVZpZGVvVGV4dHVyZTp0ZSYmdy5tYXAuaXNWaWRlb1RleHR1cmU9PT0hMCYmcmUuZ2V0VHJhbnNmZXIody5tYXAuY29sb3JTcGFjZSk9PT1wZSxkZWNvZGVWaWRlb1RleHR1cmVFbWlzc2l2ZTpldCYmdy5lbWlzc2l2ZU1hcC5pc1ZpZGVvVGV4dHVyZT09PSEwJiZyZS5nZXRUcmFuc2Zlcih3LmVtaXNzaXZlTWFwLmNvbG9yU3BhY2UpPT09cGUscHJlbXVsdGlwbGllZEFscGhhOncucHJlbXVsdGlwbGllZEFscGhhLGRvdWJsZVNpZGVkOncuc2lkZT09PVVuLGZsaXBTaWRlZDp3LnNpZGU9PT1KZSx1c2VEZXB0aFBhY2tpbmc6dy5kZXB0aFBhY2tpbmc+PTAsZGVwdGhQYWNraW5nOncuZGVwdGhQYWNraW5nfHwwLGluZGV4MEF0dHJpYnV0ZU5hbWU6dy5pbmRleDBBdHRyaWJ1dGVOYW1lLGV4dGVuc2lvbkNsaXBDdWxsRGlzdGFuY2U6S3QmJncuZXh0ZW5zaW9ucy5jbGlwQ3VsbERpc3RhbmNlPT09ITAmJm4uaGFzKCJXRUJHTF9jbGlwX2N1bGxfZGlzdGFuY2UiKSxleHRlbnNpb25NdWx0aURyYXc6KEt0JiZ3LmV4dGVuc2lvbnMubXVsdGlEcmF3PT09ITB8fEl0KSYmbi5oYXMoIldFQkdMX211bHRpX2RyYXciKSxyZW5kZXJlckV4dGVuc2lvblBhcmFsbGVsU2hhZGVyQ29tcGlsZTpuLmhhcygiS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlIiksY3VzdG9tUHJvZ3JhbUNhY2hlS2V5OncuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCl9O3JldHVybiBzbi52ZXJ0ZXhVdjFzPWMuaGFzKDEpLHNuLnZlcnRleFV2MnM9Yy5oYXMoMiksc24udmVydGV4VXYzcz1jLmhhcygzKSxjLmNsZWFyKCksc259ZnVuY3Rpb24gbSh3KXtjb25zdCBTPVtdO2lmKHcuc2hhZGVySUQ/Uy5wdXNoKHcuc2hhZGVySUQpOihTLnB1c2gody5jdXN0b21WZXJ0ZXhTaGFkZXJJRCksUy5wdXNoKHcuY3VzdG9tRnJhZ21lbnRTaGFkZXJJRCkpLHcuZGVmaW5lcyE9PXZvaWQgMClmb3IoY29uc3QgVCBpbiB3LmRlZmluZXMpUy5wdXNoKFQpLFMucHVzaCh3LmRlZmluZXNbVF0pO3JldHVybiB3LmlzUmF3U2hhZGVyTWF0ZXJpYWw9PT0hMSYmKHYoUyx3KSx4KFMsdyksUy5wdXNoKGkub3V0cHV0Q29sb3JTcGFjZSkpLFMucHVzaCh3LmN1c3RvbVByb2dyYW1DYWNoZUtleSksUy5qb2luKCl9ZnVuY3Rpb24gdih3LFMpe3cucHVzaChTLnByZWNpc2lvbiksdy5wdXNoKFMub3V0cHV0Q29sb3JTcGFjZSksdy5wdXNoKFMuZW52TWFwTW9kZSksdy5wdXNoKFMuZW52TWFwQ3ViZVVWSGVpZ2h0KSx3LnB1c2goUy5tYXBVdiksdy5wdXNoKFMuYWxwaGFNYXBVdiksdy5wdXNoKFMubGlnaHRNYXBVdiksdy5wdXNoKFMuYW9NYXBVdiksdy5wdXNoKFMuYnVtcE1hcFV2KSx3LnB1c2goUy5ub3JtYWxNYXBVdiksdy5wdXNoKFMuZGlzcGxhY2VtZW50TWFwVXYpLHcucHVzaChTLmVtaXNzaXZlTWFwVXYpLHcucHVzaChTLm1ldGFsbmVzc01hcFV2KSx3LnB1c2goUy5yb3VnaG5lc3NNYXBVdiksdy5wdXNoKFMuYW5pc290cm9weU1hcFV2KSx3LnB1c2goUy5jbGVhcmNvYXRNYXBVdiksdy5wdXNoKFMuY2xlYXJjb2F0Tm9ybWFsTWFwVXYpLHcucHVzaChTLmNsZWFyY29hdFJvdWdobmVzc01hcFV2KSx3LnB1c2goUy5pcmlkZXNjZW5jZU1hcFV2KSx3LnB1c2goUy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2KSx3LnB1c2goUy5zaGVlbkNvbG9yTWFwVXYpLHcucHVzaChTLnNoZWVuUm91Z2huZXNzTWFwVXYpLHcucHVzaChTLnNwZWN1bGFyTWFwVXYpLHcucHVzaChTLnNwZWN1bGFyQ29sb3JNYXBVdiksdy5wdXNoKFMuc3BlY3VsYXJJbnRlbnNpdHlNYXBVdiksdy5wdXNoKFMudHJhbnNtaXNzaW9uTWFwVXYpLHcucHVzaChTLnRoaWNrbmVzc01hcFV2KSx3LnB1c2goUy5jb21iaW5lKSx3LnB1c2goUy5mb2dFeHAyKSx3LnB1c2goUy5zaXplQXR0ZW51YXRpb24pLHcucHVzaChTLm1vcnBoVGFyZ2V0c0NvdW50KSx3LnB1c2goUy5tb3JwaEF0dHJpYnV0ZUNvdW50KSx3LnB1c2goUy5udW1EaXJMaWdodHMpLHcucHVzaChTLm51bVBvaW50TGlnaHRzKSx3LnB1c2goUy5udW1TcG90TGlnaHRzKSx3LnB1c2goUy5udW1TcG90TGlnaHRNYXBzKSx3LnB1c2goUy5udW1IZW1pTGlnaHRzKSx3LnB1c2goUy5udW1SZWN0QXJlYUxpZ2h0cyksdy5wdXNoKFMubnVtRGlyTGlnaHRTaGFkb3dzKSx3LnB1c2goUy5udW1Qb2ludExpZ2h0U2hhZG93cyksdy5wdXNoKFMubnVtU3BvdExpZ2h0U2hhZG93cyksdy5wdXNoKFMubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzKSx3LnB1c2goUy5udW1MaWdodFByb2Jlcyksdy5wdXNoKFMuc2hhZG93TWFwVHlwZSksdy5wdXNoKFMudG9uZU1hcHBpbmcpLHcucHVzaChTLm51bUNsaXBwaW5nUGxhbmVzKSx3LnB1c2goUy5udW1DbGlwSW50ZXJzZWN0aW9uKSx3LnB1c2goUy5kZXB0aFBhY2tpbmcpfWZ1bmN0aW9uIHgodyxTKXthLmRpc2FibGVBbGwoKSxTLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMmJmEuZW5hYmxlKDApLFMuaW5zdGFuY2luZyYmYS5lbmFibGUoMSksUy5pbnN0YW5jaW5nQ29sb3ImJmEuZW5hYmxlKDIpLFMuaW5zdGFuY2luZ01vcnBoJiZhLmVuYWJsZSgzKSxTLm1hdGNhcCYmYS5lbmFibGUoNCksUy5lbnZNYXAmJmEuZW5hYmxlKDUpLFMubm9ybWFsTWFwT2JqZWN0U3BhY2UmJmEuZW5hYmxlKDYpLFMubm9ybWFsTWFwVGFuZ2VudFNwYWNlJiZhLmVuYWJsZSg3KSxTLmNsZWFyY29hdCYmYS5lbmFibGUoOCksUy5pcmlkZXNjZW5jZSYmYS5lbmFibGUoOSksUy5hbHBoYVRlc3QmJmEuZW5hYmxlKDEwKSxTLnZlcnRleENvbG9ycyYmYS5lbmFibGUoMTEpLFMudmVydGV4QWxwaGFzJiZhLmVuYWJsZSgxMiksUy52ZXJ0ZXhVdjFzJiZhLmVuYWJsZSgxMyksUy52ZXJ0ZXhVdjJzJiZhLmVuYWJsZSgxNCksUy52ZXJ0ZXhVdjNzJiZhLmVuYWJsZSgxNSksUy52ZXJ0ZXhUYW5nZW50cyYmYS5lbmFibGUoMTYpLFMuYW5pc290cm9weSYmYS5lbmFibGUoMTcpLFMuYWxwaGFIYXNoJiZhLmVuYWJsZSgxOCksUy5iYXRjaGluZyYmYS5lbmFibGUoMTkpLFMuZGlzcGVyc2lvbiYmYS5lbmFibGUoMjApLFMuYmF0Y2hpbmdDb2xvciYmYS5lbmFibGUoMjEpLHcucHVzaChhLm1hc2spLGEuZGlzYWJsZUFsbCgpLFMuZm9nJiZhLmVuYWJsZSgwKSxTLnVzZUZvZyYmYS5lbmFibGUoMSksUy5mbGF0U2hhZGluZyYmYS5lbmFibGUoMiksUy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZhLmVuYWJsZSgzKSxTLnJldmVyc2VEZXB0aEJ1ZmZlciYmYS5lbmFibGUoNCksUy5za2lubmluZyYmYS5lbmFibGUoNSksUy5tb3JwaFRhcmdldHMmJmEuZW5hYmxlKDYpLFMubW9ycGhOb3JtYWxzJiZhLmVuYWJsZSg3KSxTLm1vcnBoQ29sb3JzJiZhLmVuYWJsZSg4KSxTLnByZW11bHRpcGxpZWRBbHBoYSYmYS5lbmFibGUoOSksUy5zaGFkb3dNYXBFbmFibGVkJiZhLmVuYWJsZSgxMCksUy5kb3VibGVTaWRlZCYmYS5lbmFibGUoMTEpLFMuZmxpcFNpZGVkJiZhLmVuYWJsZSgxMiksUy51c2VEZXB0aFBhY2tpbmcmJmEuZW5hYmxlKDEzKSxTLmRpdGhlcmluZyYmYS5lbmFibGUoMTQpLFMudHJhbnNtaXNzaW9uJiZhLmVuYWJsZSgxNSksUy5zaGVlbiYmYS5lbmFibGUoMTYpLFMub3BhcXVlJiZhLmVuYWJsZSgxNyksUy5wb2ludHNVdnMmJmEuZW5hYmxlKDE4KSxTLmRlY29kZVZpZGVvVGV4dHVyZSYmYS5lbmFibGUoMTkpLFMuZGVjb2RlVmlkZW9UZXh0dXJlRW1pc3NpdmUmJmEuZW5hYmxlKDIwKSxTLmFscGhhVG9Db3ZlcmFnZSYmYS5lbmFibGUoMjEpLHcucHVzaChhLm1hc2spfWZ1bmN0aW9uIF8odyl7Y29uc3QgUz1wW3cudHlwZV07bGV0IFQ7aWYoUyl7Y29uc3QgRD1waVtTXTtUPUJ5LmNsb25lKEQudW5pZm9ybXMpfWVsc2UgVD13LnVuaWZvcm1zO3JldHVybiBUfWZ1bmN0aW9uIE0odyxTKXtsZXQgVDtmb3IobGV0IEQ9MCxMPXUubGVuZ3RoO0Q8TDtEKyspe2NvbnN0IE49dVtEXTtpZihOLmNhY2hlS2V5PT09Uyl7VD1OLCsrVC51c2VkVGltZXM7YnJlYWt9fXJldHVybiBUPT09dm9pZCAwJiYoVD1uZXcgYkkoaSxTLHcscyksdS5wdXNoKFQpKSxUfWZ1bmN0aW9uIGIodyl7aWYoLS13LnVzZWRUaW1lcz09PTApe2NvbnN0IFM9dS5pbmRleE9mKHcpO3VbU109dVt1Lmxlbmd0aC0xXSx1LnBvcCgpLHcuZGVzdHJveSgpfX1mdW5jdGlvbiBBKHcpe2wucmVtb3ZlKHcpfWZ1bmN0aW9uIEUoKXtsLmRpc3Bvc2UoKX1yZXR1cm57Z2V0UGFyYW1ldGVyczpnLGdldFByb2dyYW1DYWNoZUtleTptLGdldFVuaWZvcm1zOl8sYWNxdWlyZVByb2dyYW06TSxyZWxlYXNlUHJvZ3JhbTpiLHJlbGVhc2VTaGFkZXJDYWNoZTpBLHByb2dyYW1zOnUsZGlzcG9zZTpFfX1mdW5jdGlvbiBDSSgpe2xldCBpPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHQobyl7cmV0dXJuIGkuaGFzKG8pfWZ1bmN0aW9uIGUobyl7bGV0IGE9aS5nZXQobyk7cmV0dXJuIGE9PT12b2lkIDAmJihhPXt9LGkuc2V0KG8sYSkpLGF9ZnVuY3Rpb24gbihvKXtpLmRlbGV0ZShvKX1mdW5jdGlvbiByKG8sYSxsKXtpLmdldChvKVthXT1sfWZ1bmN0aW9uIHMoKXtpPW5ldyBXZWFrTWFwfXJldHVybntoYXM6dCxnZXQ6ZSxyZW1vdmU6bix1cGRhdGU6cixkaXNwb3NlOnN9fWZ1bmN0aW9uIFJJKGksdCl7cmV0dXJuIGkuZ3JvdXBPcmRlciE9PXQuZ3JvdXBPcmRlcj9pLmdyb3VwT3JkZXItdC5ncm91cE9yZGVyOmkucmVuZGVyT3JkZXIhPT10LnJlbmRlck9yZGVyP2kucmVuZGVyT3JkZXItdC5yZW5kZXJPcmRlcjppLm1hdGVyaWFsLmlkIT09dC5tYXRlcmlhbC5pZD9pLm1hdGVyaWFsLmlkLXQubWF0ZXJpYWwuaWQ6aS56IT09dC56P2kuei10Lno6aS5pZC10LmlkfWZ1bmN0aW9uIHR2KGksdCl7cmV0dXJuIGkuZ3JvdXBPcmRlciE9PXQuZ3JvdXBPcmRlcj9pLmdyb3VwT3JkZXItdC5ncm91cE9yZGVyOmkucmVuZGVyT3JkZXIhPT10LnJlbmRlck9yZGVyP2kucmVuZGVyT3JkZXItdC5yZW5kZXJPcmRlcjppLnohPT10Lno/dC56LWkuejppLmlkLXQuaWR9ZnVuY3Rpb24gZXYoKXtjb25zdCBpPVtdO2xldCB0PTA7Y29uc3QgZT1bXSxuPVtdLHI9W107ZnVuY3Rpb24gcygpe3Q9MCxlLmxlbmd0aD0wLG4ubGVuZ3RoPTAsci5sZW5ndGg9MH1mdW5jdGlvbiBvKGgsZixkLHAseSxnKXtsZXQgbT1pW3RdO3JldHVybiBtPT09dm9pZCAwPyhtPXtpZDpoLmlkLG9iamVjdDpoLGdlb21ldHJ5OmYsbWF0ZXJpYWw6ZCxncm91cE9yZGVyOnAscmVuZGVyT3JkZXI6aC5yZW5kZXJPcmRlcix6OnksZ3JvdXA6Z30saVt0XT1tKToobS5pZD1oLmlkLG0ub2JqZWN0PWgsbS5nZW9tZXRyeT1mLG0ubWF0ZXJpYWw9ZCxtLmdyb3VwT3JkZXI9cCxtLnJlbmRlck9yZGVyPWgucmVuZGVyT3JkZXIsbS56PXksbS5ncm91cD1nKSx0KyssbX1mdW5jdGlvbiBhKGgsZixkLHAseSxnKXtjb25zdCBtPW8oaCxmLGQscCx5LGcpO2QudHJhbnNtaXNzaW9uPjA/bi5wdXNoKG0pOmQudHJhbnNwYXJlbnQ9PT0hMD9yLnB1c2gobSk6ZS5wdXNoKG0pfWZ1bmN0aW9uIGwoaCxmLGQscCx5LGcpe2NvbnN0IG09byhoLGYsZCxwLHksZyk7ZC50cmFuc21pc3Npb24+MD9uLnVuc2hpZnQobSk6ZC50cmFuc3BhcmVudD09PSEwP3IudW5zaGlmdChtKTplLnVuc2hpZnQobSl9ZnVuY3Rpb24gYyhoLGYpe2UubGVuZ3RoPjEmJmUuc29ydChofHxSSSksbi5sZW5ndGg+MSYmbi5zb3J0KGZ8fHR2KSxyLmxlbmd0aD4xJiZyLnNvcnQoZnx8dHYpfWZ1bmN0aW9uIHUoKXtmb3IobGV0IGg9dCxmPWkubGVuZ3RoO2g8ZjtoKyspe2NvbnN0IGQ9aVtoXTtpZihkLmlkPT09bnVsbClicmVhaztkLmlkPW51bGwsZC5vYmplY3Q9bnVsbCxkLmdlb21ldHJ5PW51bGwsZC5tYXRlcmlhbD1udWxsLGQuZ3JvdXA9bnVsbH19cmV0dXJue29wYXF1ZTplLHRyYW5zbWlzc2l2ZTpuLHRyYW5zcGFyZW50OnIsaW5pdDpzLHB1c2g6YSx1bnNoaWZ0OmwsZmluaXNoOnUsc29ydDpjfX1mdW5jdGlvbiBQSSgpe2xldCBpPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHQobixyKXtjb25zdCBzPWkuZ2V0KG4pO2xldCBvO3JldHVybiBzPT09dm9pZCAwPyhvPW5ldyBldixpLnNldChuLFtvXSkpOnI+PXMubGVuZ3RoPyhvPW5ldyBldixzLnB1c2gobykpOm89c1tyXSxvfWZ1bmN0aW9uIGUoKXtpPW5ldyBXZWFrTWFwfXJldHVybntnZXQ6dCxkaXNwb3NlOmV9fWZ1bmN0aW9uIElJKCl7Y29uc3QgaT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKHQpe2lmKGlbdC5pZF0hPT12b2lkIDApcmV0dXJuIGlbdC5pZF07bGV0IGU7c3dpdGNoKHQudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjplPXtkaXJlY3Rpb246bmV3IFIsY29sb3I6bmV3IHh0fTticmVhaztjYXNlIlNwb3RMaWdodCI6ZT17cG9zaXRpb246bmV3IFIsZGlyZWN0aW9uOm5ldyBSLGNvbG9yOm5ldyB4dCxkaXN0YW5jZTowLGNvbmVDb3M6MCxwZW51bWJyYUNvczowLGRlY2F5OjB9O2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6ZT17cG9zaXRpb246bmV3IFIsY29sb3I6bmV3IHh0LGRpc3RhbmNlOjAsZGVjYXk6MH07YnJlYWs7Y2FzZSJIZW1pc3BoZXJlTGlnaHQiOmU9e2RpcmVjdGlvbjpuZXcgUixza3lDb2xvcjpuZXcgeHQsZ3JvdW5kQ29sb3I6bmV3IHh0fTticmVhaztjYXNlIlJlY3RBcmVhTGlnaHQiOmU9e2NvbG9yOm5ldyB4dCxwb3NpdGlvbjpuZXcgUixoYWxmV2lkdGg6bmV3IFIsaGFsZkhlaWdodDpuZXcgUn07YnJlYWt9cmV0dXJuIGlbdC5pZF09ZSxlfX19ZnVuY3Rpb24gTEkoKXtjb25zdCBpPXt9O3JldHVybntnZXQ6ZnVuY3Rpb24odCl7aWYoaVt0LmlkXSE9PXZvaWQgMClyZXR1cm4gaVt0LmlkXTtsZXQgZTtzd2l0Y2godC50eXBlKXtjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOmU9e3NoYWRvd0ludGVuc2l0eToxLHNoYWRvd0JpYXM6MCxzaGFkb3dOb3JtYWxCaWFzOjAsc2hhZG93UmFkaXVzOjEsc2hhZG93TWFwU2l6ZTpuZXcgWH07YnJlYWs7Y2FzZSJTcG90TGlnaHQiOmU9e3NoYWRvd0ludGVuc2l0eToxLHNoYWRvd0JpYXM6MCxzaGFkb3dOb3JtYWxCaWFzOjAsc2hhZG93UmFkaXVzOjEsc2hhZG93TWFwU2l6ZTpuZXcgWH07YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjplPXtzaGFkb3dJbnRlbnNpdHk6MSxzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IFgsc2hhZG93Q2FtZXJhTmVhcjoxLHNoYWRvd0NhbWVyYUZhcjoxZTN9O2JyZWFrfXJldHVybiBpW3QuaWRdPWUsZX19fWxldCBEST0wO2Z1bmN0aW9uIFVJKGksdCl7cmV0dXJuKHQuY2FzdFNoYWRvdz8yOjApLShpLmNhc3RTaGFkb3c/MjowKSsodC5tYXA/MTowKS0oaS5tYXA/MTowKX1mdW5jdGlvbiBOSShpKXtjb25zdCB0PW5ldyBJSSxlPUxJKCksbj17dmVyc2lvbjowLGhhc2g6e2RpcmVjdGlvbmFsTGVuZ3RoOi0xLHBvaW50TGVuZ3RoOi0xLHNwb3RMZW5ndGg6LTEscmVjdEFyZWFMZW5ndGg6LTEsaGVtaUxlbmd0aDotMSxudW1EaXJlY3Rpb25hbFNoYWRvd3M6LTEsbnVtUG9pbnRTaGFkb3dzOi0xLG51bVNwb3RTaGFkb3dzOi0xLG51bVNwb3RNYXBzOi0xLG51bUxpZ2h0UHJvYmVzOi0xfSxhbWJpZW50OlswLDAsMF0scHJvYmU6W10sZGlyZWN0aW9uYWw6W10sZGlyZWN0aW9uYWxTaGFkb3c6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXA6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6W10sc3BvdDpbXSxzcG90TGlnaHRNYXA6W10sc3BvdFNoYWRvdzpbXSxzcG90U2hhZG93TWFwOltdLHNwb3RMaWdodE1hdHJpeDpbXSxyZWN0QXJlYTpbXSxyZWN0QXJlYUxUQzE6bnVsbCxyZWN0QXJlYUxUQzI6bnVsbCxwb2ludDpbXSxwb2ludFNoYWRvdzpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwczowLG51bUxpZ2h0UHJvYmVzOjB9O2ZvcihsZXQgYz0wO2M8OTtjKyspbi5wcm9iZS5wdXNoKG5ldyBSKTtjb25zdCByPW5ldyBSLHM9bmV3IFJ0LG89bmV3IFJ0O2Z1bmN0aW9uIGEoYyl7bGV0IHU9MCxoPTAsZj0wO2ZvcihsZXQgdz0wO3c8OTt3Kyspbi5wcm9iZVt3XS5zZXQoMCwwLDApO2xldCBkPTAscD0wLHk9MCxnPTAsbT0wLHY9MCx4PTAsXz0wLE09MCxiPTAsQT0wO2Muc29ydChVSSk7Zm9yKGxldCB3PTAsUz1jLmxlbmd0aDt3PFM7dysrKXtjb25zdCBUPWNbd10sRD1ULmNvbG9yLEw9VC5pbnRlbnNpdHksTj1ULmRpc3RhbmNlLEY9VC5zaGFkb3cmJlQuc2hhZG93Lm1hcD9ULnNoYWRvdy5tYXAudGV4dHVyZTpudWxsO2lmKFQuaXNBbWJpZW50TGlnaHQpdSs9RC5yKkwsaCs9RC5nKkwsZis9RC5iKkw7ZWxzZSBpZihULmlzTGlnaHRQcm9iZSl7Zm9yKGxldCBCPTA7Qjw5O0IrKyluLnByb2JlW0JdLmFkZFNjYWxlZFZlY3RvcihULnNoLmNvZWZmaWNpZW50c1tCXSxMKTtBKyt9ZWxzZSBpZihULmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgQj10LmdldChUKTtpZihCLmNvbG9yLmNvcHkoVC5jb2xvcikubXVsdGlwbHlTY2FsYXIoVC5pbnRlbnNpdHkpLFQuY2FzdFNoYWRvdyl7Y29uc3QgRz1ULnNoYWRvdyxrPWUuZ2V0KFQpO2suc2hhZG93SW50ZW5zaXR5PUcuaW50ZW5zaXR5LGsuc2hhZG93Qmlhcz1HLmJpYXMsay5zaGFkb3dOb3JtYWxCaWFzPUcubm9ybWFsQmlhcyxrLnNoYWRvd1JhZGl1cz1HLnJhZGl1cyxrLnNoYWRvd01hcFNpemU9Ry5tYXBTaXplLG4uZGlyZWN0aW9uYWxTaGFkb3dbZF09ayxuLmRpcmVjdGlvbmFsU2hhZG93TWFwW2RdPUYsbi5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFtkXT1ULnNoYWRvdy5tYXRyaXgsdisrfW4uZGlyZWN0aW9uYWxbZF09QixkKyt9ZWxzZSBpZihULmlzU3BvdExpZ2h0KXtjb25zdCBCPXQuZ2V0KFQpO0IucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFQubWF0cml4V29ybGQpLEIuY29sb3IuY29weShEKS5tdWx0aXBseVNjYWxhcihMKSxCLmRpc3RhbmNlPU4sQi5jb25lQ29zPU1hdGguY29zKFQuYW5nbGUpLEIucGVudW1icmFDb3M9TWF0aC5jb3MoVC5hbmdsZSooMS1ULnBlbnVtYnJhKSksQi5kZWNheT1ULmRlY2F5LG4uc3BvdFt5XT1CO2NvbnN0IEc9VC5zaGFkb3c7aWYoVC5tYXAmJihuLnNwb3RMaWdodE1hcFtNXT1ULm1hcCxNKyssRy51cGRhdGVNYXRyaWNlcyhUKSxULmNhc3RTaGFkb3cmJmIrKyksbi5zcG90TGlnaHRNYXRyaXhbeV09Ry5tYXRyaXgsVC5jYXN0U2hhZG93KXtjb25zdCBrPWUuZ2V0KFQpO2suc2hhZG93SW50ZW5zaXR5PUcuaW50ZW5zaXR5LGsuc2hhZG93Qmlhcz1HLmJpYXMsay5zaGFkb3dOb3JtYWxCaWFzPUcubm9ybWFsQmlhcyxrLnNoYWRvd1JhZGl1cz1HLnJhZGl1cyxrLnNoYWRvd01hcFNpemU9Ry5tYXBTaXplLG4uc3BvdFNoYWRvd1t5XT1rLG4uc3BvdFNoYWRvd01hcFt5XT1GLF8rK315Kyt9ZWxzZSBpZihULmlzUmVjdEFyZWFMaWdodCl7Y29uc3QgQj10LmdldChUKTtCLmNvbG9yLmNvcHkoRCkubXVsdGlwbHlTY2FsYXIoTCksQi5oYWxmV2lkdGguc2V0KFQud2lkdGgqLjUsMCwwKSxCLmhhbGZIZWlnaHQuc2V0KDAsVC5oZWlnaHQqLjUsMCksbi5yZWN0QXJlYVtnXT1CLGcrK31lbHNlIGlmKFQuaXNQb2ludExpZ2h0KXtjb25zdCBCPXQuZ2V0KFQpO2lmKEIuY29sb3IuY29weShULmNvbG9yKS5tdWx0aXBseVNjYWxhcihULmludGVuc2l0eSksQi5kaXN0YW5jZT1ULmRpc3RhbmNlLEIuZGVjYXk9VC5kZWNheSxULmNhc3RTaGFkb3cpe2NvbnN0IEc9VC5zaGFkb3csaz1lLmdldChUKTtrLnNoYWRvd0ludGVuc2l0eT1HLmludGVuc2l0eSxrLnNoYWRvd0JpYXM9Ry5iaWFzLGsuc2hhZG93Tm9ybWFsQmlhcz1HLm5vcm1hbEJpYXMsay5zaGFkb3dSYWRpdXM9Ry5yYWRpdXMsay5zaGFkb3dNYXBTaXplPUcubWFwU2l6ZSxrLnNoYWRvd0NhbWVyYU5lYXI9Ry5jYW1lcmEubmVhcixrLnNoYWRvd0NhbWVyYUZhcj1HLmNhbWVyYS5mYXIsbi5wb2ludFNoYWRvd1twXT1rLG4ucG9pbnRTaGFkb3dNYXBbcF09RixuLnBvaW50U2hhZG93TWF0cml4W3BdPVQuc2hhZG93Lm1hdHJpeCx4Kyt9bi5wb2ludFtwXT1CLHArK31lbHNlIGlmKFQuaXNIZW1pc3BoZXJlTGlnaHQpe2NvbnN0IEI9dC5nZXQoVCk7Qi5za3lDb2xvci5jb3B5KFQuY29sb3IpLm11bHRpcGx5U2NhbGFyKEwpLEIuZ3JvdW5kQ29sb3IuY29weShULmdyb3VuZENvbG9yKS5tdWx0aXBseVNjYWxhcihMKSxuLmhlbWlbbV09QixtKyt9fWc+MCYmKGkuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT09PSEwPyhuLnJlY3RBcmVhTFRDMT1wdC5MVENfRkxPQVRfMSxuLnJlY3RBcmVhTFRDMj1wdC5MVENfRkxPQVRfMik6KG4ucmVjdEFyZWFMVEMxPXB0LkxUQ19IQUxGXzEsbi5yZWN0QXJlYUxUQzI9cHQuTFRDX0hBTEZfMikpLG4uYW1iaWVudFswXT11LG4uYW1iaWVudFsxXT1oLG4uYW1iaWVudFsyXT1mO2NvbnN0IEU9bi5oYXNoOyhFLmRpcmVjdGlvbmFsTGVuZ3RoIT09ZHx8RS5wb2ludExlbmd0aCE9PXB8fEUuc3BvdExlbmd0aCE9PXl8fEUucmVjdEFyZWFMZW5ndGghPT1nfHxFLmhlbWlMZW5ndGghPT1tfHxFLm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXZ8fEUubnVtUG9pbnRTaGFkb3dzIT09eHx8RS5udW1TcG90U2hhZG93cyE9PV98fEUubnVtU3BvdE1hcHMhPT1NfHxFLm51bUxpZ2h0UHJvYmVzIT09QSkmJihuLmRpcmVjdGlvbmFsLmxlbmd0aD1kLG4uc3BvdC5sZW5ndGg9eSxuLnJlY3RBcmVhLmxlbmd0aD1nLG4ucG9pbnQubGVuZ3RoPXAsbi5oZW1pLmxlbmd0aD1tLG4uZGlyZWN0aW9uYWxTaGFkb3cubGVuZ3RoPXYsbi5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGg9dixuLnBvaW50U2hhZG93Lmxlbmd0aD14LG4ucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXgsbi5zcG90U2hhZG93Lmxlbmd0aD1fLG4uc3BvdFNoYWRvd01hcC5sZW5ndGg9XyxuLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4Lmxlbmd0aD12LG4ucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXgsbi5zcG90TGlnaHRNYXRyaXgubGVuZ3RoPV8rTS1iLG4uc3BvdExpZ2h0TWFwLmxlbmd0aD1NLG4ubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzPWIsbi5udW1MaWdodFByb2Jlcz1BLEUuZGlyZWN0aW9uYWxMZW5ndGg9ZCxFLnBvaW50TGVuZ3RoPXAsRS5zcG90TGVuZ3RoPXksRS5yZWN0QXJlYUxlbmd0aD1nLEUuaGVtaUxlbmd0aD1tLEUubnVtRGlyZWN0aW9uYWxTaGFkb3dzPXYsRS5udW1Qb2ludFNoYWRvd3M9eCxFLm51bVNwb3RTaGFkb3dzPV8sRS5udW1TcG90TWFwcz1NLEUubnVtTGlnaHRQcm9iZXM9QSxuLnZlcnNpb249REkrKyl9ZnVuY3Rpb24gbChjLHUpe2xldCBoPTAsZj0wLGQ9MCxwPTAseT0wO2NvbnN0IGc9dS5tYXRyaXhXb3JsZEludmVyc2U7Zm9yKGxldCBtPTAsdj1jLmxlbmd0aDttPHY7bSsrKXtjb25zdCB4PWNbbV07aWYoeC5pc0RpcmVjdGlvbmFsTGlnaHQpe2NvbnN0IF89bi5kaXJlY3Rpb25hbFtoXTtfLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oeC5tYXRyaXhXb3JsZCksci5zZXRGcm9tTWF0cml4UG9zaXRpb24oeC50YXJnZXQubWF0cml4V29ybGQpLF8uZGlyZWN0aW9uLnN1YihyKSxfLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oZyksaCsrfWVsc2UgaWYoeC5pc1Nwb3RMaWdodCl7Y29uc3QgXz1uLnNwb3RbZF07Xy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oeC5tYXRyaXhXb3JsZCksXy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoZyksXy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHgubWF0cml4V29ybGQpLHIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHgudGFyZ2V0Lm1hdHJpeFdvcmxkKSxfLmRpcmVjdGlvbi5zdWIociksXy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGcpLGQrK31lbHNlIGlmKHguaXNSZWN0QXJlYUxpZ2h0KXtjb25zdCBfPW4ucmVjdEFyZWFbcF07Xy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oeC5tYXRyaXhXb3JsZCksXy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoZyksby5pZGVudGl0eSgpLHMuY29weSh4Lm1hdHJpeFdvcmxkKSxzLnByZW11bHRpcGx5KGcpLG8uZXh0cmFjdFJvdGF0aW9uKHMpLF8uaGFsZldpZHRoLnNldCh4LndpZHRoKi41LDAsMCksXy5oYWxmSGVpZ2h0LnNldCgwLHguaGVpZ2h0Ki41LDApLF8uaGFsZldpZHRoLmFwcGx5TWF0cml4NChvKSxfLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KG8pLHArK31lbHNlIGlmKHguaXNQb2ludExpZ2h0KXtjb25zdCBfPW4ucG9pbnRbZl07Xy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oeC5tYXRyaXhXb3JsZCksXy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoZyksZisrfWVsc2UgaWYoeC5pc0hlbWlzcGhlcmVMaWdodCl7Y29uc3QgXz1uLmhlbWlbeV07Xy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHgubWF0cml4V29ybGQpLF8uZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihnKSx5Kyt9fX1yZXR1cm57c2V0dXA6YSxzZXR1cFZpZXc6bCxzdGF0ZTpufX1mdW5jdGlvbiBudihpKXtjb25zdCB0PW5ldyBOSShpKSxlPVtdLG49W107ZnVuY3Rpb24gcih1KXtjLmNhbWVyYT11LGUubGVuZ3RoPTAsbi5sZW5ndGg9MH1mdW5jdGlvbiBzKHUpe2UucHVzaCh1KX1mdW5jdGlvbiBvKHUpe24ucHVzaCh1KX1mdW5jdGlvbiBhKCl7dC5zZXR1cChlKX1mdW5jdGlvbiBsKHUpe3Quc2V0dXBWaWV3KGUsdSl9Y29uc3QgYz17bGlnaHRzQXJyYXk6ZSxzaGFkb3dzQXJyYXk6bixjYW1lcmE6bnVsbCxsaWdodHM6dCx0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQ6e319O3JldHVybntpbml0OnIsc3RhdGU6YyxzZXR1cExpZ2h0czphLHNldHVwTGlnaHRzVmlldzpsLHB1c2hMaWdodDpzLHB1c2hTaGFkb3c6b319ZnVuY3Rpb24gRkkoaSl7bGV0IHQ9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gZShyLHM9MCl7Y29uc3Qgbz10LmdldChyKTtsZXQgYTtyZXR1cm4gbz09PXZvaWQgMD8oYT1uZXcgbnYoaSksdC5zZXQocixbYV0pKTpzPj1vLmxlbmd0aD8oYT1uZXcgbnYoaSksby5wdXNoKGEpKTphPW9bc10sYX1mdW5jdGlvbiBuKCl7dD1uZXcgV2Vha01hcH1yZXR1cm57Z2V0OmUsZGlzcG9zZTpufX1jb25zdCBCST1gdm9pZCBtYWluKCkgewoJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7Cn1gLE9JPWB1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzczsKdW5pZm9ybSB2ZWMyIHJlc29sdXRpb247CnVuaWZvcm0gZmxvYXQgcmFkaXVzOwojaW5jbHVkZSA8cGFja2luZz4Kdm9pZCBtYWluKCkgewoJY29uc3QgZmxvYXQgc2FtcGxlcyA9IGZsb2F0KCBWU01fU0FNUExFUyApOwoJZmxvYXQgbWVhbiA9IDAuMDsKCWZsb2F0IHNxdWFyZWRfbWVhbiA9IDAuMDsKCWZsb2F0IHV2U3RyaWRlID0gc2FtcGxlcyA8PSAxLjAgPyAwLjAgOiAyLjAgLyAoIHNhbXBsZXMgLSAxLjAgKTsKCWZsb2F0IHV2U3RhcnQgPSBzYW1wbGVzIDw9IDEuMCA/IDAuMCA6IC0gMS4wOwoJZm9yICggZmxvYXQgaSA9IDAuMDsgaSA8IHNhbXBsZXM7IGkgKysgKSB7CgkJZmxvYXQgdXZPZmZzZXQgPSB1dlN0YXJ0ICsgaSAqIHV2U3RyaWRlOwoJCSNpZmRlZiBIT1JJWk9OVEFMX1BBU1MKCQkJdmVjMiBkaXN0cmlidXRpb24gPSB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCB1dk9mZnNldCwgMC4wICkgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApOwoJCQltZWFuICs9IGRpc3RyaWJ1dGlvbi54OwoJCQlzcXVhcmVkX21lYW4gKz0gZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSArIGRpc3RyaWJ1dGlvbi54ICogZGlzdHJpYnV0aW9uLng7CgkJI2Vsc2UKCQkJZmxvYXQgZGVwdGggPSB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCAwLjAsIHV2T2Zmc2V0ICkgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApOwoJCQltZWFuICs9IGRlcHRoOwoJCQlzcXVhcmVkX21lYW4gKz0gZGVwdGggKiBkZXB0aDsKCQkjZW5kaWYKCX0KCW1lYW4gPSBtZWFuIC8gc2FtcGxlczsKCXNxdWFyZWRfbWVhbiA9IHNxdWFyZWRfbWVhbiAvIHNhbXBsZXM7CglmbG9hdCBzdGRfZGV2ID0gc3FydCggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4gKTsKCWdsX0ZyYWdDb2xvciA9IHBhY2sySGFsZlRvUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7Cn1gO2Z1bmN0aW9uIHpJKGksdCxlKXtsZXQgbj1uZXcgQmE7Y29uc3Qgcj1uZXcgWCxzPW5ldyBYLG89bmV3IFF0LGE9bmV3IGZwKHtkZXB0aFBhY2tpbmc6b3l9KSxsPW5ldyBkcCxjPXt9LHU9ZS5tYXhUZXh0dXJlU2l6ZSxoPXtbc2ldOkplLFtKZV06c2ksW1VuXTpVbn0sZj1uZXcgdWkoe2RlZmluZXM6e1ZTTV9TQU1QTEVTOjh9LHVuaWZvcm1zOntzaGFkb3dfcGFzczp7dmFsdWU6bnVsbH0scmVzb2x1dGlvbjp7dmFsdWU6bmV3IFh9LHJhZGl1czp7dmFsdWU6NH19LHZlcnRleFNoYWRlcjpCSSxmcmFnbWVudFNoYWRlcjpPSX0pLGQ9Zi5jbG9uZSgpO2QuZGVmaW5lcy5IT1JJWk9OVEFMX1BBU1M9MTtjb25zdCBwPW5ldyBGdDtwLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBKdChuZXcgRmxvYXQzMkFycmF5KFstMSwtMSwuNSwzLC0xLC41LC0xLDMsLjVdKSwzKSk7Y29uc3QgeT1uZXcgVWUocCxmKSxnPXRoaXM7dGhpcy5lbmFibGVkPSExLHRoaXMuYXV0b1VwZGF0ZT0hMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMudHlwZT14bjtsZXQgbT10aGlzLnR5cGU7dGhpcy5yZW5kZXI9ZnVuY3Rpb24oYixBLEUpe2lmKGcuZW5hYmxlZD09PSExfHxnLmF1dG9VcGRhdGU9PT0hMSYmZy5uZWVkc1VwZGF0ZT09PSExfHxiLmxlbmd0aD09PTApcmV0dXJuO2NvbnN0IHc9aS5nZXRSZW5kZXJUYXJnZXQoKSxTPWkuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxUPWkuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSxEPWkuc3RhdGU7RC5zZXRCbGVuZGluZyhPaSksRC5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpLEQuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSxELnNldFNjaXNzb3JUZXN0KCExKTtjb25zdCBMPW0hPT1iaSYmdGhpcy50eXBlPT09YmksTj1tPT09YmkmJnRoaXMudHlwZSE9PWJpO2ZvcihsZXQgRj0wLEI9Yi5sZW5ndGg7RjxCO0YrKyl7Y29uc3QgRz1iW0ZdLGs9Ry5zaGFkb3c7aWYoaz09PXZvaWQgMCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLEcsImhhcyBubyBzaGFkb3cuIik7Y29udGludWV9aWYoay5hdXRvVXBkYXRlPT09ITEmJmsubmVlZHNVcGRhdGU9PT0hMSljb250aW51ZTtyLmNvcHkoay5tYXBTaXplKTtjb25zdCBRPWsuZ2V0RnJhbWVFeHRlbnRzKCk7aWYoci5tdWx0aXBseShRKSxzLmNvcHkoay5tYXBTaXplKSwoci54PnV8fHIueT51KSYmKHIueD51JiYocy54PU1hdGguZmxvb3IodS9RLngpLHIueD1zLngqUS54LGsubWFwU2l6ZS54PXMueCksci55PnUmJihzLnk9TWF0aC5mbG9vcih1L1EueSksci55PXMueSpRLnksay5tYXBTaXplLnk9cy55KSksay5tYXA9PT1udWxsfHxMPT09ITB8fE49PT0hMCl7Y29uc3QgaHQ9dGhpcy50eXBlIT09Ymk/e21pbkZpbHRlcjpYZSxtYWdGaWx0ZXI6WGV9Ont9O2subWFwIT09bnVsbCYmay5tYXAuZGlzcG9zZSgpLGsubWFwPW5ldyBvaShyLngsci55LGh0KSxrLm1hcC50ZXh0dXJlLm5hbWU9Ry5uYW1lKyIuc2hhZG93TWFwIixrLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9aS5zZXRSZW5kZXJUYXJnZXQoay5tYXApLGkuY2xlYXIoKTtjb25zdCBjdD1rLmdldFZpZXdwb3J0Q291bnQoKTtmb3IobGV0IGh0PTA7aHQ8Y3Q7aHQrKyl7Y29uc3QgUHQ9ay5nZXRWaWV3cG9ydChodCk7by5zZXQocy54KlB0Lngscy55KlB0Lnkscy54KlB0Lnoscy55KlB0LncpLEQudmlld3BvcnQobyksay51cGRhdGVNYXRyaWNlcyhHLGh0KSxuPWsuZ2V0RnJ1c3R1bSgpLF8oQSxFLGsuY2FtZXJhLEcsdGhpcy50eXBlKX1rLmlzUG9pbnRMaWdodFNoYWRvdyE9PSEwJiZ0aGlzLnR5cGU9PT1iaSYmdihrLEUpLGsubmVlZHNVcGRhdGU9ITF9bT10aGlzLnR5cGUsZy5uZWVkc1VwZGF0ZT0hMSxpLnNldFJlbmRlclRhcmdldCh3LFMsVCl9O2Z1bmN0aW9uIHYoYixBKXtjb25zdCBFPXQudXBkYXRlKHkpO2YuZGVmaW5lcy5WU01fU0FNUExFUyE9PWIuYmx1clNhbXBsZXMmJihmLmRlZmluZXMuVlNNX1NBTVBMRVM9Yi5ibHVyU2FtcGxlcyxkLmRlZmluZXMuVlNNX1NBTVBMRVM9Yi5ibHVyU2FtcGxlcyxmLm5lZWRzVXBkYXRlPSEwLGQubmVlZHNVcGRhdGU9ITApLGIubWFwUGFzcz09PW51bGwmJihiLm1hcFBhc3M9bmV3IG9pKHIueCxyLnkpKSxmLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPWIubWFwLnRleHR1cmUsZi51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPWIubWFwU2l6ZSxmLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT1iLnJhZGl1cyxpLnNldFJlbmRlclRhcmdldChiLm1hcFBhc3MpLGkuY2xlYXIoKSxpLnJlbmRlckJ1ZmZlckRpcmVjdChBLG51bGwsRSxmLHksbnVsbCksZC51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZT1iLm1hcFBhc3MudGV4dHVyZSxkLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWU9Yi5tYXBTaXplLGQudW5pZm9ybXMucmFkaXVzLnZhbHVlPWIucmFkaXVzLGkuc2V0UmVuZGVyVGFyZ2V0KGIubWFwKSxpLmNsZWFyKCksaS5yZW5kZXJCdWZmZXJEaXJlY3QoQSxudWxsLEUsZCx5LG51bGwpfWZ1bmN0aW9uIHgoYixBLEUsdyl7bGV0IFM9bnVsbDtjb25zdCBUPUUuaXNQb2ludExpZ2h0PT09ITA/Yi5jdXN0b21EaXN0YW5jZU1hdGVyaWFsOmIuY3VzdG9tRGVwdGhNYXRlcmlhbDtpZihUIT09dm9pZCAwKVM9VDtlbHNlIGlmKFM9RS5pc1BvaW50TGlnaHQ9PT0hMD9sOmEsaS5sb2NhbENsaXBwaW5nRW5hYmxlZCYmQS5jbGlwU2hhZG93cz09PSEwJiZBcnJheS5pc0FycmF5KEEuY2xpcHBpbmdQbGFuZXMpJiZBLmNsaXBwaW5nUGxhbmVzLmxlbmd0aCE9PTB8fEEuZGlzcGxhY2VtZW50TWFwJiZBLmRpc3BsYWNlbWVudFNjYWxlIT09MHx8QS5hbHBoYU1hcCYmQS5hbHBoYVRlc3Q+MHx8QS5tYXAmJkEuYWxwaGFUZXN0PjApe2NvbnN0IEQ9Uy51dWlkLEw9QS51dWlkO2xldCBOPWNbRF07Tj09PXZvaWQgMCYmKE49e30sY1tEXT1OKTtsZXQgRj1OW0xdO0Y9PT12b2lkIDAmJihGPVMuY2xvbmUoKSxOW0xdPUYsQS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixNKSksUz1GfWlmKFMudmlzaWJsZT1BLnZpc2libGUsUy53aXJlZnJhbWU9QS53aXJlZnJhbWUsdz09PWJpP1Muc2lkZT1BLnNoYWRvd1NpZGUhPT1udWxsP0Euc2hhZG93U2lkZTpBLnNpZGU6Uy5zaWRlPUEuc2hhZG93U2lkZSE9PW51bGw/QS5zaGFkb3dTaWRlOmhbQS5zaWRlXSxTLmFscGhhTWFwPUEuYWxwaGFNYXAsUy5hbHBoYVRlc3Q9QS5hbHBoYVRlc3QsUy5tYXA9QS5tYXAsUy5jbGlwU2hhZG93cz1BLmNsaXBTaGFkb3dzLFMuY2xpcHBpbmdQbGFuZXM9QS5jbGlwcGluZ1BsYW5lcyxTLmNsaXBJbnRlcnNlY3Rpb249QS5jbGlwSW50ZXJzZWN0aW9uLFMuZGlzcGxhY2VtZW50TWFwPUEuZGlzcGxhY2VtZW50TWFwLFMuZGlzcGxhY2VtZW50U2NhbGU9QS5kaXNwbGFjZW1lbnRTY2FsZSxTLmRpc3BsYWNlbWVudEJpYXM9QS5kaXNwbGFjZW1lbnRCaWFzLFMud2lyZWZyYW1lTGluZXdpZHRoPUEud2lyZWZyYW1lTGluZXdpZHRoLFMubGluZXdpZHRoPUEubGluZXdpZHRoLEUuaXNQb2ludExpZ2h0PT09ITAmJlMuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD09PSEwKXtjb25zdCBEPWkucHJvcGVydGllcy5nZXQoUyk7RC5saWdodD1FfXJldHVybiBTfWZ1bmN0aW9uIF8oYixBLEUsdyxTKXtpZihiLnZpc2libGU9PT0hMSlyZXR1cm47aWYoYi5sYXllcnMudGVzdChBLmxheWVycykmJihiLmlzTWVzaHx8Yi5pc0xpbmV8fGIuaXNQb2ludHMpJiYoYi5jYXN0U2hhZG93fHxiLnJlY2VpdmVTaGFkb3cmJlM9PT1iaSkmJighYi5mcnVzdHVtQ3VsbGVkfHxuLmludGVyc2VjdHNPYmplY3QoYikpKXtiLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKEUubWF0cml4V29ybGRJbnZlcnNlLGIubWF0cml4V29ybGQpO2NvbnN0IEw9dC51cGRhdGUoYiksTj1iLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoTikpe2NvbnN0IEY9TC5ncm91cHM7Zm9yKGxldCBCPTAsRz1GLmxlbmd0aDtCPEc7QisrKXtjb25zdCBrPUZbQl0sUT1OW2subWF0ZXJpYWxJbmRleF07aWYoUSYmUS52aXNpYmxlKXtjb25zdCBjdD14KGIsUSx3LFMpO2Iub25CZWZvcmVTaGFkb3coaSxiLEEsRSxMLGN0LGspLGkucmVuZGVyQnVmZmVyRGlyZWN0KEUsbnVsbCxMLGN0LGIsayksYi5vbkFmdGVyU2hhZG93KGksYixBLEUsTCxjdCxrKX19fWVsc2UgaWYoTi52aXNpYmxlKXtjb25zdCBGPXgoYixOLHcsUyk7Yi5vbkJlZm9yZVNoYWRvdyhpLGIsQSxFLEwsRixudWxsKSxpLnJlbmRlckJ1ZmZlckRpcmVjdChFLG51bGwsTCxGLGIsbnVsbCksYi5vbkFmdGVyU2hhZG93KGksYixBLEUsTCxGLG51bGwpfX1jb25zdCBEPWIuY2hpbGRyZW47Zm9yKGxldCBMPTAsTj1ELmxlbmd0aDtMPE47TCsrKV8oRFtMXSxBLEUsdyxTKX1mdW5jdGlvbiBNKGIpe2IudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLE0pO2Zvcihjb25zdCBFIGluIGMpe2NvbnN0IHc9Y1tFXSxTPWIudGFyZ2V0LnV1aWQ7UyBpbiB3JiYod1tTXS5kaXNwb3NlKCksZGVsZXRlIHdbU10pfX19Y29uc3Qga0k9e1skbF06WGwsW3FsXTpKbCxbWWxdOmpsLFskcl06WmwsW1hsXTokbCxbSmxdOnFsLFtqbF06WWwsW1psXTokcn07ZnVuY3Rpb24gVkkoaSx0KXtmdW5jdGlvbiBlKCl7bGV0IHo9ITE7Y29uc3QgbXQ9bmV3IFF0O2xldCBLPW51bGw7Y29uc3QgaXQ9bmV3IFF0KDAsMCwwLDApO3JldHVybntzZXRNYXNrOmZ1bmN0aW9uKHZ0KXtLIT09dnQmJiF6JiYoaS5jb2xvck1hc2sodnQsdnQsdnQsdnQpLEs9dnQpfSxzZXRMb2NrZWQ6ZnVuY3Rpb24odnQpe3o9dnR9LHNldENsZWFyOmZ1bmN0aW9uKHZ0LF90LEt0LExlLHNuKXtzbj09PSEwJiYodnQqPUxlLF90Kj1MZSxLdCo9TGUpLG10LnNldCh2dCxfdCxLdCxMZSksaXQuZXF1YWxzKG10KT09PSExJiYoaS5jbGVhckNvbG9yKHZ0LF90LEt0LExlKSxpdC5jb3B5KG10KSl9LHJlc2V0OmZ1bmN0aW9uKCl7ej0hMSxLPW51bGwsaXQuc2V0KC0xLDAsMCwwKX19fWZ1bmN0aW9uIG4oKXtsZXQgej0hMSxtdD0hMSxLPW51bGwsaXQ9bnVsbCx2dD1udWxsO3JldHVybntzZXRSZXZlcnNlZDpmdW5jdGlvbihfdCl7aWYobXQhPT1fdCl7Y29uc3QgS3Q9dC5nZXQoIkVYVF9jbGlwX2NvbnRyb2wiKTttdD9LdC5jbGlwQ29udHJvbEVYVChLdC5MT1dFUl9MRUZUX0VYVCxLdC5aRVJPX1RPX09ORV9FWFQpOkt0LmNsaXBDb250cm9sRVhUKEt0LkxPV0VSX0xFRlRfRVhULEt0Lk5FR0FUSVZFX09ORV9UT19PTkVfRVhUKTtjb25zdCBMZT12dDt2dD1udWxsLHRoaXMuc2V0Q2xlYXIoTGUpfW10PV90fSxnZXRSZXZlcnNlZDpmdW5jdGlvbigpe3JldHVybiBtdH0sc2V0VGVzdDpmdW5jdGlvbihfdCl7X3Q/dXQoaS5ERVBUSF9URVNUKTpMdChpLkRFUFRIX1RFU1QpfSxzZXRNYXNrOmZ1bmN0aW9uKF90KXtLIT09X3QmJiF6JiYoaS5kZXB0aE1hc2soX3QpLEs9X3QpfSxzZXRGdW5jOmZ1bmN0aW9uKF90KXtpZihtdCYmKF90PWtJW190XSksaXQhPT1fdCl7c3dpdGNoKF90KXtjYXNlICRsOmkuZGVwdGhGdW5jKGkuTkVWRVIpO2JyZWFrO2Nhc2UgWGw6aS5kZXB0aEZ1bmMoaS5BTFdBWVMpO2JyZWFrO2Nhc2UgcWw6aS5kZXB0aEZ1bmMoaS5MRVNTKTticmVhaztjYXNlICRyOmkuZGVwdGhGdW5jKGkuTEVRVUFMKTticmVhaztjYXNlIFlsOmkuZGVwdGhGdW5jKGkuRVFVQUwpO2JyZWFrO2Nhc2UgWmw6aS5kZXB0aEZ1bmMoaS5HRVFVQUwpO2JyZWFrO2Nhc2UgSmw6aS5kZXB0aEZ1bmMoaS5HUkVBVEVSKTticmVhaztjYXNlIGpsOmkuZGVwdGhGdW5jKGkuTk9URVFVQUwpO2JyZWFrO2RlZmF1bHQ6aS5kZXB0aEZ1bmMoaS5MRVFVQUwpfWl0PV90fX0sc2V0TG9ja2VkOmZ1bmN0aW9uKF90KXt6PV90fSxzZXRDbGVhcjpmdW5jdGlvbihfdCl7dnQhPT1fdCYmKG10JiYoX3Q9MS1fdCksaS5jbGVhckRlcHRoKF90KSx2dD1fdCl9LHJlc2V0OmZ1bmN0aW9uKCl7ej0hMSxLPW51bGwsaXQ9bnVsbCx2dD1udWxsLG10PSExfX19ZnVuY3Rpb24gcigpe2xldCB6PSExLG10PW51bGwsSz1udWxsLGl0PW51bGwsdnQ9bnVsbCxfdD1udWxsLEt0PW51bGwsTGU9bnVsbCxzbj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHllKXt6fHwoeWU/dXQoaS5TVEVOQ0lMX1RFU1QpOkx0KGkuU1RFTkNJTF9URVNUKSl9LHNldE1hc2s6ZnVuY3Rpb24oeWUpe210IT09eWUmJiF6JiYoaS5zdGVuY2lsTWFzayh5ZSksbXQ9eWUpfSxzZXRGdW5jOmZ1bmN0aW9uKHllLFNpLGRyKXsoSyE9PXllfHxpdCE9PVNpfHx2dCE9PWRyKSYmKGkuc3RlbmNpbEZ1bmMoeWUsU2ksZHIpLEs9eWUsaXQ9U2ksdnQ9ZHIpfSxzZXRPcDpmdW5jdGlvbih5ZSxTaSxkcil7KF90IT09eWV8fEt0IT09U2l8fExlIT09ZHIpJiYoaS5zdGVuY2lsT3AoeWUsU2ksZHIpLF90PXllLEt0PVNpLExlPWRyKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKHllKXt6PXllfSxzZXRDbGVhcjpmdW5jdGlvbih5ZSl7c24hPT15ZSYmKGkuY2xlYXJTdGVuY2lsKHllKSxzbj15ZSl9LHJlc2V0OmZ1bmN0aW9uKCl7ej0hMSxtdD1udWxsLEs9bnVsbCxpdD1udWxsLHZ0PW51bGwsX3Q9bnVsbCxLdD1udWxsLExlPW51bGwsc249bnVsbH19fWNvbnN0IHM9bmV3IGUsbz1uZXcgbixhPW5ldyByLGw9bmV3IFdlYWtNYXAsYz1uZXcgV2Vha01hcDtsZXQgdT17fSxoPXt9LGY9bmV3IFdlYWtNYXAsZD1bXSxwPW51bGwseT0hMSxnPW51bGwsbT1udWxsLHY9bnVsbCx4PW51bGwsXz1udWxsLE09bnVsbCxiPW51bGwsQT1uZXcgeHQoMCwwLDApLEU9MCx3PSExLFM9bnVsbCxUPW51bGwsRD1udWxsLEw9bnVsbCxOPW51bGw7Y29uc3QgRj1pLmdldFBhcmFtZXRlcihpLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKTtsZXQgQj0hMSxHPTA7Y29uc3Qgaz1pLmdldFBhcmFtZXRlcihpLlZFUlNJT04pO2suaW5kZXhPZigiV2ViR0wiKSE9PS0xPyhHPXBhcnNlRmxvYXQoL15XZWJHTCAoXGQpLy5leGVjKGspWzFdKSxCPUc+PTEpOmsuaW5kZXhPZigiT3BlbkdMIEVTIikhPT0tMSYmKEc9cGFyc2VGbG9hdCgvXk9wZW5HTCBFUyAoXGQpLy5leGVjKGspWzFdKSxCPUc+PTIpO2xldCBRPW51bGwsY3Q9e307Y29uc3QgaHQ9aS5nZXRQYXJhbWV0ZXIoaS5TQ0lTU09SX0JPWCksUHQ9aS5nZXRQYXJhbWV0ZXIoaS5WSUVXUE9SVCksWHQ9bmV3IFF0KCkuZnJvbUFycmF5KGh0KSxqPW5ldyBRdCgpLmZyb21BcnJheShQdCk7ZnVuY3Rpb24gcnQoeixtdCxLLGl0KXtjb25zdCB2dD1uZXcgVWludDhBcnJheSg0KSxfdD1pLmNyZWF0ZVRleHR1cmUoKTtpLmJpbmRUZXh0dXJlKHosX3QpLGkudGV4UGFyYW1ldGVyaSh6LGkuVEVYVFVSRV9NSU5fRklMVEVSLGkuTkVBUkVTVCksaS50ZXhQYXJhbWV0ZXJpKHosaS5URVhUVVJFX01BR19GSUxURVIsaS5ORUFSRVNUKTtmb3IobGV0IEt0PTA7S3Q8SztLdCsrKXo9PT1pLlRFWFRVUkVfM0R8fHo9PT1pLlRFWFRVUkVfMkRfQVJSQVk/aS50ZXhJbWFnZTNEKG10LDAsaS5SR0JBLDEsMSxpdCwwLGkuUkdCQSxpLlVOU0lHTkVEX0JZVEUsdnQpOmkudGV4SW1hZ2UyRChtdCtLdCwwLGkuUkdCQSwxLDEsMCxpLlJHQkEsaS5VTlNJR05FRF9CWVRFLHZ0KTtyZXR1cm4gX3R9Y29uc3QgRXQ9e307RXRbaS5URVhUVVJFXzJEXT1ydChpLlRFWFRVUkVfMkQsaS5URVhUVVJFXzJELDEpLEV0W2kuVEVYVFVSRV9DVUJFX01BUF09cnQoaS5URVhUVVJFX0NVQkVfTUFQLGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YLDYpLEV0W2kuVEVYVFVSRV8yRF9BUlJBWV09cnQoaS5URVhUVVJFXzJEX0FSUkFZLGkuVEVYVFVSRV8yRF9BUlJBWSwxLDEpLEV0W2kuVEVYVFVSRV8zRF09cnQoaS5URVhUVVJFXzNELGkuVEVYVFVSRV8zRCwxLDEpLHMuc2V0Q2xlYXIoMCwwLDAsMSksby5zZXRDbGVhcigxKSxhLnNldENsZWFyKDApLHV0KGkuREVQVEhfVEVTVCksby5zZXRGdW5jKCRyKSxvdCghMSksU3QoTG4pLHV0KGkuQ1VMTF9GQUNFKSxVKE9pKTtmdW5jdGlvbiB1dCh6KXt1W3pdIT09ITAmJihpLmVuYWJsZSh6KSx1W3pdPSEwKX1mdW5jdGlvbiBMdCh6KXt1W3pdIT09ITEmJihpLmRpc2FibGUoeiksdVt6XT0hMSl9ZnVuY3Rpb24gT3QoeixtdCl7cmV0dXJuIGhbel0hPT1tdD8oaS5iaW5kRnJhbWVidWZmZXIoeixtdCksaFt6XT1tdCx6PT09aS5EUkFXX0ZSQU1FQlVGRkVSJiYoaFtpLkZSQU1FQlVGRkVSXT1tdCksej09PWkuRlJBTUVCVUZGRVImJihoW2kuRFJBV19GUkFNRUJVRkZFUl09bXQpLCEwKTohMX1mdW5jdGlvbiBJdCh6LG10KXtsZXQgSz1kLGl0PSExO2lmKHope0s9Zi5nZXQobXQpLEs9PT12b2lkIDAmJihLPVtdLGYuc2V0KG10LEspKTtjb25zdCB2dD16LnRleHR1cmVzO2lmKEsubGVuZ3RoIT09dnQubGVuZ3RofHxLWzBdIT09aS5DT0xPUl9BVFRBQ0hNRU5UMCl7Zm9yKGxldCBfdD0wLEt0PXZ0Lmxlbmd0aDtfdDxLdDtfdCsrKUtbX3RdPWkuQ09MT1JfQVRUQUNITUVOVDArX3Q7Sy5sZW5ndGg9dnQubGVuZ3RoLGl0PSEwfX1lbHNlIEtbMF0hPT1pLkJBQ0smJihLWzBdPWkuQkFDSyxpdD0hMCk7aXQmJmkuZHJhd0J1ZmZlcnMoSyl9ZnVuY3Rpb24gdGUoeil7cmV0dXJuIHAhPT16PyhpLnVzZVByb2dyYW0oeikscD16LCEwKTohMX1jb25zdCBudD17W3ByXTppLkZVTkNfQURELFtSMF06aS5GVU5DX1NVQlRSQUNULFtQMF06aS5GVU5DX1JFVkVSU0VfU1VCVFJBQ1R9O250W0kwXT1pLk1JTixudFtMMF09aS5NQVg7Y29uc3Qgc3Q9e1tEMF06aS5aRVJPLFtVMF06aS5PTkUsW04wXTppLlNSQ19DT0xPUixbSGxdOmkuU1JDX0FMUEhBLFtWMF06aS5TUkNfQUxQSEFfU0FUVVJBVEUsW3owXTppLkRTVF9DT0xPUixbQjBdOmkuRFNUX0FMUEhBLFtGMF06aS5PTkVfTUlOVVNfU1JDX0NPTE9SLFtXbF06aS5PTkVfTUlOVVNfU1JDX0FMUEhBLFtrMF06aS5PTkVfTUlOVVNfRFNUX0NPTE9SLFtPMF06aS5PTkVfTUlOVVNfRFNUX0FMUEhBLFtHMF06aS5DT05TVEFOVF9DT0xPUixbSDBdOmkuT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SLFtXMF06aS5DT05TVEFOVF9BTFBIQSxbJDBdOmkuT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBfTtmdW5jdGlvbiBVKHosbXQsSyxpdCx2dCxfdCxLdCxMZSxzbix5ZSl7aWYoej09PU9pKXt5PT09ITAmJihMdChpLkJMRU5EKSx5PSExKTtyZXR1cm59aWYoeT09PSExJiYodXQoaS5CTEVORCkseT0hMCkseiE9PUMwKXtpZih6IT09Z3x8eWUhPT13KXtpZigobSE9PXByfHxfIT09cHIpJiYoaS5ibGVuZEVxdWF0aW9uKGkuRlVOQ19BREQpLG09cHIsXz1wcikseWUpc3dpdGNoKHope2Nhc2UgV3I6aS5ibGVuZEZ1bmNTZXBhcmF0ZShpLk9ORSxpLk9ORV9NSU5VU19TUkNfQUxQSEEsaS5PTkUsaS5PTkVfTUlOVVNfU1JDX0FMUEhBKTticmVhaztjYXNlIFFmOmkuYmxlbmRGdW5jKGkuT05FLGkuT05FKTticmVhaztjYXNlIHRkOmkuYmxlbmRGdW5jU2VwYXJhdGUoaS5aRVJPLGkuT05FX01JTlVTX1NSQ19DT0xPUixpLlpFUk8saS5PTkUpO2JyZWFrO2Nhc2UgZWQ6aS5ibGVuZEZ1bmNTZXBhcmF0ZShpLlpFUk8saS5TUkNfQ09MT1IsaS5aRVJPLGkuU1JDX0FMUEhBKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIseik7YnJlYWt9ZWxzZSBzd2l0Y2goeil7Y2FzZSBXcjppLmJsZW5kRnVuY1NlcGFyYXRlKGkuU1JDX0FMUEhBLGkuT05FX01JTlVTX1NSQ19BTFBIQSxpLk9ORSxpLk9ORV9NSU5VU19TUkNfQUxQSEEpO2JyZWFrO2Nhc2UgUWY6aS5ibGVuZEZ1bmMoaS5TUkNfQUxQSEEsaS5PTkUpO2JyZWFrO2Nhc2UgdGQ6aS5ibGVuZEZ1bmNTZXBhcmF0ZShpLlpFUk8saS5PTkVfTUlOVVNfU1JDX0NPTE9SLGkuWkVSTyxpLk9ORSk7YnJlYWs7Y2FzZSBlZDppLmJsZW5kRnVuYyhpLlpFUk8saS5TUkNfQ09MT1IpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIix6KTticmVha312PW51bGwseD1udWxsLE09bnVsbCxiPW51bGwsQS5zZXQoMCwwLDApLEU9MCxnPXosdz15ZX1yZXR1cm59dnQ9dnR8fG10LF90PV90fHxLLEt0PUt0fHxpdCwobXQhPT1tfHx2dCE9PV8pJiYoaS5ibGVuZEVxdWF0aW9uU2VwYXJhdGUobnRbbXRdLG50W3Z0XSksbT1tdCxfPXZ0KSwoSyE9PXZ8fGl0IT09eHx8X3QhPT1NfHxLdCE9PWIpJiYoaS5ibGVuZEZ1bmNTZXBhcmF0ZShzdFtLXSxzdFtpdF0sc3RbX3RdLHN0W0t0XSksdj1LLHg9aXQsTT1fdCxiPUt0KSwoTGUuZXF1YWxzKEEpPT09ITF8fHNuIT09RSkmJihpLmJsZW5kQ29sb3IoTGUucixMZS5nLExlLmIsc24pLEEuY29weShMZSksRT1zbiksZz16LHc9ITF9ZnVuY3Rpb24gQ3QoeixtdCl7ei5zaWRlPT09VW4/THQoaS5DVUxMX0ZBQ0UpOnV0KGkuQ1VMTF9GQUNFKTtsZXQgSz16LnNpZGU9PT1KZTttdCYmKEs9IUspLG90KEspLHouYmxlbmRpbmc9PT1XciYmei50cmFuc3BhcmVudD09PSExP1UoT2kpOlUoei5ibGVuZGluZyx6LmJsZW5kRXF1YXRpb24sei5ibGVuZFNyYyx6LmJsZW5kRHN0LHouYmxlbmRFcXVhdGlvbkFscGhhLHouYmxlbmRTcmNBbHBoYSx6LmJsZW5kRHN0QWxwaGEsei5ibGVuZENvbG9yLHouYmxlbmRBbHBoYSx6LnByZW11bHRpcGxpZWRBbHBoYSksby5zZXRGdW5jKHouZGVwdGhGdW5jKSxvLnNldFRlc3Qoei5kZXB0aFRlc3QpLG8uc2V0TWFzayh6LmRlcHRoV3JpdGUpLHMuc2V0TWFzayh6LmNvbG9yV3JpdGUpO2NvbnN0IGl0PXouc3RlbmNpbFdyaXRlO2Euc2V0VGVzdChpdCksaXQmJihhLnNldE1hc2soei5zdGVuY2lsV3JpdGVNYXNrKSxhLnNldEZ1bmMoei5zdGVuY2lsRnVuYyx6LnN0ZW5jaWxSZWYsei5zdGVuY2lsRnVuY01hc2spLGEuc2V0T3Aoei5zdGVuY2lsRmFpbCx6LnN0ZW5jaWxaRmFpbCx6LnN0ZW5jaWxaUGFzcykpLGV0KHoucG9seWdvbk9mZnNldCx6LnBvbHlnb25PZmZzZXRGYWN0b3Isei5wb2x5Z29uT2Zmc2V0VW5pdHMpLHouYWxwaGFUb0NvdmVyYWdlPT09ITA/dXQoaS5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpOkx0KGkuU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKX1mdW5jdGlvbiBvdCh6KXtTIT09eiYmKHo/aS5mcm9udEZhY2UoaS5DVyk6aS5mcm9udEZhY2UoaS5DQ1cpLFM9eil9ZnVuY3Rpb24gU3Qoeil7eiE9PUJlPyh1dChpLkNVTExfRkFDRSkseiE9PVQmJih6PT09TG4/aS5jdWxsRmFjZShpLkJBQ0spOno9PT1Ebj9pLmN1bGxGYWNlKGkuRlJPTlQpOmkuY3VsbEZhY2UoaS5GUk9OVF9BTkRfQkFDSykpKTpMdChpLkNVTExfRkFDRSksVD16fWZ1bmN0aW9uIFcoeil7eiE9PUQmJihCJiZpLmxpbmVXaWR0aCh6KSxEPXopfWZ1bmN0aW9uIGV0KHosbXQsSyl7ej8odXQoaS5QT0xZR09OX09GRlNFVF9GSUxMKSwoTCE9PW10fHxOIT09SykmJihpLnBvbHlnb25PZmZzZXQobXQsSyksTD1tdCxOPUspKTpMdChpLlBPTFlHT05fT0ZGU0VUX0ZJTEwpfWZ1bmN0aW9uIFooeil7ej91dChpLlNDSVNTT1JfVEVTVCk6THQoaS5TQ0lTU09SX1RFU1QpfWZ1bmN0aW9uIFAoeil7ej09PXZvaWQgMCYmKHo9aS5URVhUVVJFMCtGLTEpLFEhPT16JiYoaS5hY3RpdmVUZXh0dXJlKHopLFE9eil9ZnVuY3Rpb24gQyh6LG10LEspe0s9PT12b2lkIDAmJihRPT09bnVsbD9LPWkuVEVYVFVSRTArRi0xOks9USk7bGV0IGl0PWN0W0tdO2l0PT09dm9pZCAwJiYoaXQ9e3R5cGU6dm9pZCAwLHRleHR1cmU6dm9pZCAwfSxjdFtLXT1pdCksKGl0LnR5cGUhPT16fHxpdC50ZXh0dXJlIT09bXQpJiYoUSE9PUsmJihpLmFjdGl2ZVRleHR1cmUoSyksUT1LKSxpLmJpbmRUZXh0dXJlKHosbXR8fEV0W3pdKSxpdC50eXBlPXosaXQudGV4dHVyZT1tdCl9ZnVuY3Rpb24gTygpe2NvbnN0IHo9Y3RbUV07eiE9PXZvaWQgMCYmei50eXBlIT09dm9pZCAwJiYoaS5iaW5kVGV4dHVyZSh6LnR5cGUsbnVsbCksei50eXBlPXZvaWQgMCx6LnRleHR1cmU9dm9pZCAwKX1mdW5jdGlvbiAkKCl7dHJ5e2kuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkoaSxhcmd1bWVudHMpfWNhdGNoKHope2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix6KX19ZnVuY3Rpb24gdHQoKXt0cnl7aS5jb21wcmVzc2VkVGV4SW1hZ2UzRC5hcHBseShpLGFyZ3VtZW50cyl9Y2F0Y2goeil7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHopfX1mdW5jdGlvbiBKKCl7dHJ5e2kudGV4U3ViSW1hZ2UyRC5hcHBseShpLGFyZ3VtZW50cyl9Y2F0Y2goeil7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHopfX1mdW5jdGlvbiBkdCgpe3RyeXtpLnRleFN1YkltYWdlM0QuYXBwbHkoaSxhcmd1bWVudHMpfWNhdGNoKHope2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix6KX19ZnVuY3Rpb24gZnQoKXt0cnl7aS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRC5hcHBseShpLGFyZ3VtZW50cyl9Y2F0Y2goeil7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHopfX1mdW5jdGlvbiB5dCgpe3RyeXtpLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNELmFwcGx5KGksYXJndW1lbnRzKX1jYXRjaCh6KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIseil9fWZ1bmN0aW9uIFZ0KCl7dHJ5e2kudGV4U3RvcmFnZTJELmFwcGx5KGksYXJndW1lbnRzKX1jYXRjaCh6KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIseil9fWZ1bmN0aW9uIGF0KCl7dHJ5e2kudGV4U3RvcmFnZTNELmFwcGx5KGksYXJndW1lbnRzKX1jYXRjaCh6KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIseil9fWZ1bmN0aW9uIGJ0KCl7dHJ5e2kudGV4SW1hZ2UyRC5hcHBseShpLGFyZ3VtZW50cyl9Y2F0Y2goeil7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHopfX1mdW5jdGlvbiBEdCgpe3RyeXtpLnRleEltYWdlM0QuYXBwbHkoaSxhcmd1bWVudHMpfWNhdGNoKHope2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix6KX19ZnVuY3Rpb24genQoeil7WHQuZXF1YWxzKHopPT09ITEmJihpLnNjaXNzb3Ioei54LHoueSx6Lnosei53KSxYdC5jb3B5KHopKX1mdW5jdGlvbiB3dCh6KXtqLmVxdWFscyh6KT09PSExJiYoaS52aWV3cG9ydCh6Lngsei55LHoueix6LncpLGouY29weSh6KSl9ZnVuY3Rpb24gZWUoeixtdCl7bGV0IEs9Yy5nZXQobXQpO0s9PT12b2lkIDAmJihLPW5ldyBXZWFrTWFwLGMuc2V0KG10LEspKTtsZXQgaXQ9Sy5nZXQoeik7aXQ9PT12b2lkIDAmJihpdD1pLmdldFVuaWZvcm1CbG9ja0luZGV4KG10LHoubmFtZSksSy5zZXQoeixpdCkpfWZ1bmN0aW9uIFl0KHosbXQpe2NvbnN0IGl0PWMuZ2V0KG10KS5nZXQoeik7bC5nZXQobXQpIT09aXQmJihpLnVuaWZvcm1CbG9ja0JpbmRpbmcobXQsaXQsei5fX2JpbmRpbmdQb2ludEluZGV4KSxsLnNldChtdCxpdCkpfWZ1bmN0aW9uIHZlKCl7aS5kaXNhYmxlKGkuQkxFTkQpLGkuZGlzYWJsZShpLkNVTExfRkFDRSksaS5kaXNhYmxlKGkuREVQVEhfVEVTVCksaS5kaXNhYmxlKGkuUE9MWUdPTl9PRkZTRVRfRklMTCksaS5kaXNhYmxlKGkuU0NJU1NPUl9URVNUKSxpLmRpc2FibGUoaS5TVEVOQ0lMX1RFU1QpLGkuZGlzYWJsZShpLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksaS5ibGVuZEVxdWF0aW9uKGkuRlVOQ19BREQpLGkuYmxlbmRGdW5jKGkuT05FLGkuWkVSTyksaS5ibGVuZEZ1bmNTZXBhcmF0ZShpLk9ORSxpLlpFUk8saS5PTkUsaS5aRVJPKSxpLmJsZW5kQ29sb3IoMCwwLDAsMCksaS5jb2xvck1hc2soITAsITAsITAsITApLGkuY2xlYXJDb2xvcigwLDAsMCwwKSxpLmRlcHRoTWFzayghMCksaS5kZXB0aEZ1bmMoaS5MRVNTKSxvLnNldFJldmVyc2VkKCExKSxpLmNsZWFyRGVwdGgoMSksaS5zdGVuY2lsTWFzayg0Mjk0OTY3Mjk1KSxpLnN0ZW5jaWxGdW5jKGkuQUxXQVlTLDAsNDI5NDk2NzI5NSksaS5zdGVuY2lsT3AoaS5LRUVQLGkuS0VFUCxpLktFRVApLGkuY2xlYXJTdGVuY2lsKDApLGkuY3VsbEZhY2UoaS5CQUNLKSxpLmZyb250RmFjZShpLkNDVyksaS5wb2x5Z29uT2Zmc2V0KDAsMCksaS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTApLGkuYmluZEZyYW1lYnVmZmVyKGkuRlJBTUVCVUZGRVIsbnVsbCksaS5iaW5kRnJhbWVidWZmZXIoaS5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpLGkuYmluZEZyYW1lYnVmZmVyKGkuUkVBRF9GUkFNRUJVRkZFUixudWxsKSxpLnVzZVByb2dyYW0obnVsbCksaS5saW5lV2lkdGgoMSksaS5zY2lzc29yKDAsMCxpLmNhbnZhcy53aWR0aCxpLmNhbnZhcy5oZWlnaHQpLGkudmlld3BvcnQoMCwwLGkuY2FudmFzLndpZHRoLGkuY2FudmFzLmhlaWdodCksdT17fSxRPW51bGwsY3Q9e30saD17fSxmPW5ldyBXZWFrTWFwLGQ9W10scD1udWxsLHk9ITEsZz1udWxsLG09bnVsbCx2PW51bGwseD1udWxsLF89bnVsbCxNPW51bGwsYj1udWxsLEE9bmV3IHh0KDAsMCwwKSxFPTAsdz0hMSxTPW51bGwsVD1udWxsLEQ9bnVsbCxMPW51bGwsTj1udWxsLFh0LnNldCgwLDAsaS5jYW52YXMud2lkdGgsaS5jYW52YXMuaGVpZ2h0KSxqLnNldCgwLDAsaS5jYW52YXMud2lkdGgsaS5jYW52YXMuaGVpZ2h0KSxzLnJlc2V0KCksby5yZXNldCgpLGEucmVzZXQoKX1yZXR1cm57YnVmZmVyczp7Y29sb3I6cyxkZXB0aDpvLHN0ZW5jaWw6YX0sZW5hYmxlOnV0LGRpc2FibGU6THQsYmluZEZyYW1lYnVmZmVyOk90LGRyYXdCdWZmZXJzOkl0LHVzZVByb2dyYW06dGUsc2V0QmxlbmRpbmc6VSxzZXRNYXRlcmlhbDpDdCxzZXRGbGlwU2lkZWQ6b3Qsc2V0Q3VsbEZhY2U6U3Qsc2V0TGluZVdpZHRoOlcsc2V0UG9seWdvbk9mZnNldDpldCxzZXRTY2lzc29yVGVzdDpaLGFjdGl2ZVRleHR1cmU6UCxiaW5kVGV4dHVyZTpDLHVuYmluZFRleHR1cmU6Tyxjb21wcmVzc2VkVGV4SW1hZ2UyRDokLGNvbXByZXNzZWRUZXhJbWFnZTNEOnR0LHRleEltYWdlMkQ6YnQsdGV4SW1hZ2UzRDpEdCx1cGRhdGVVQk9NYXBwaW5nOmVlLHVuaWZvcm1CbG9ja0JpbmRpbmc6WXQsdGV4U3RvcmFnZTJEOlZ0LHRleFN0b3JhZ2UzRDphdCx0ZXhTdWJJbWFnZTJEOkosdGV4U3ViSW1hZ2UzRDpkdCxjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRDpmdCxjb21wcmVzc2VkVGV4U3ViSW1hZ2UzRDp5dCxzY2lzc29yOnp0LHZpZXdwb3J0Ond0LHJlc2V0OnZlfX1mdW5jdGlvbiBHSShpLHQsZSxuLHIscyxvKXtjb25zdCBhPXQuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKT90LmdldCgiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIik6bnVsbCxsPXR5cGVvZiBuYXZpZ2F0b3I9PSJ1bmRlZmluZWQiPyExOi9PY3VsdXNCcm93c2VyL2cudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxjPW5ldyBYLHU9bmV3IFdlYWtNYXA7bGV0IGg7Y29uc3QgZj1uZXcgV2Vha01hcDtsZXQgZD0hMTt0cnl7ZD10eXBlb2YgT2Zmc2NyZWVuQ2FudmFzIT0idW5kZWZpbmVkIiYmbmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIikhPT1udWxsfWNhdGNoKFApe31mdW5jdGlvbiBwKFAsQyl7cmV0dXJuIGQ/bmV3IE9mZnNjcmVlbkNhbnZhcyhQLEMpOkFhKCJjYW52YXMiKX1mdW5jdGlvbiB5KFAsQyxPKXtsZXQgJD0xO2NvbnN0IHR0PVooUCk7aWYoKHR0LndpZHRoPk98fHR0LmhlaWdodD5PKSYmKCQ9Ty9NYXRoLm1heCh0dC53aWR0aCx0dC5oZWlnaHQpKSwkPDEpaWYodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQhPSJ1bmRlZmluZWQiJiZQIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IT0idW5kZWZpbmVkIiYmUCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXAhPSJ1bmRlZmluZWQiJiZQIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXB8fHR5cGVvZiBWaWRlb0ZyYW1lIT0idW5kZWZpbmVkIiYmUCBpbnN0YW5jZW9mIFZpZGVvRnJhbWUpe2NvbnN0IEo9TWF0aC5mbG9vcigkKnR0LndpZHRoKSxkdD1NYXRoLmZsb29yKCQqdHQuaGVpZ2h0KTtoPT09dm9pZCAwJiYoaD1wKEosZHQpKTtjb25zdCBmdD1DP3AoSixkdCk6aDtyZXR1cm4gZnQud2lkdGg9SixmdC5oZWlnaHQ9ZHQsZnQuZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UoUCwwLDAsSixkdCksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIit0dC53aWR0aCsieCIrdHQuaGVpZ2h0KyIpIHRvICgiK0orIngiK2R0KyIpLiIpLGZ0fWVsc2UgcmV0dXJuImRhdGEiaW4gUCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBJbWFnZSBpbiBEYXRhVGV4dHVyZSBpcyB0b28gYmlnICgiK3R0LndpZHRoKyJ4Iit0dC5oZWlnaHQrIikuIiksUDtyZXR1cm4gUH1mdW5jdGlvbiBnKFApe3JldHVybiBQLmdlbmVyYXRlTWlwbWFwc31mdW5jdGlvbiBtKFApe2kuZ2VuZXJhdGVNaXBtYXAoUCl9ZnVuY3Rpb24gdihQKXtyZXR1cm4gUC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD9pLlRFWFRVUkVfQ1VCRV9NQVA6UC5pc1dlYkdMM0RSZW5kZXJUYXJnZXQ/aS5URVhUVVJFXzNEOlAuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0fHxQLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZT9pLlRFWFRVUkVfMkRfQVJSQVk6aS5URVhUVVJFXzJEfWZ1bmN0aW9uIHgoUCxDLE8sJCx0dD0hMSl7aWYoUCE9PW51bGwpe2lmKGlbUF0hPT12b2lkIDApcmV0dXJuIGlbUF07Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIHVzZSBub24tZXhpc3RpbmcgV2ViR0wgaW50ZXJuYWwgZm9ybWF0ICciK1ArIiciKX1sZXQgSj1DO2lmKEM9PT1pLlJFRCYmKE89PT1pLkZMT0FUJiYoSj1pLlIzMkYpLE89PT1pLkhBTEZfRkxPQVQmJihKPWkuUjE2RiksTz09PWkuVU5TSUdORURfQllURSYmKEo9aS5SOCkpLEM9PT1pLlJFRF9JTlRFR0VSJiYoTz09PWkuVU5TSUdORURfQllURSYmKEo9aS5SOFVJKSxPPT09aS5VTlNJR05FRF9TSE9SVCYmKEo9aS5SMTZVSSksTz09PWkuVU5TSUdORURfSU5UJiYoSj1pLlIzMlVJKSxPPT09aS5CWVRFJiYoSj1pLlI4SSksTz09PWkuU0hPUlQmJihKPWkuUjE2SSksTz09PWkuSU5UJiYoSj1pLlIzMkkpKSxDPT09aS5SRyYmKE89PT1pLkZMT0FUJiYoSj1pLlJHMzJGKSxPPT09aS5IQUxGX0ZMT0FUJiYoSj1pLlJHMTZGKSxPPT09aS5VTlNJR05FRF9CWVRFJiYoSj1pLlJHOCkpLEM9PT1pLlJHX0lOVEVHRVImJihPPT09aS5VTlNJR05FRF9CWVRFJiYoSj1pLlJHOFVJKSxPPT09aS5VTlNJR05FRF9TSE9SVCYmKEo9aS5SRzE2VUkpLE89PT1pLlVOU0lHTkVEX0lOVCYmKEo9aS5SRzMyVUkpLE89PT1pLkJZVEUmJihKPWkuUkc4SSksTz09PWkuU0hPUlQmJihKPWkuUkcxNkkpLE89PT1pLklOVCYmKEo9aS5SRzMySSkpLEM9PT1pLlJHQl9JTlRFR0VSJiYoTz09PWkuVU5TSUdORURfQllURSYmKEo9aS5SR0I4VUkpLE89PT1pLlVOU0lHTkVEX1NIT1JUJiYoSj1pLlJHQjE2VUkpLE89PT1pLlVOU0lHTkVEX0lOVCYmKEo9aS5SR0IzMlVJKSxPPT09aS5CWVRFJiYoSj1pLlJHQjhJKSxPPT09aS5TSE9SVCYmKEo9aS5SR0IxNkkpLE89PT1pLklOVCYmKEo9aS5SR0IzMkkpKSxDPT09aS5SR0JBX0lOVEVHRVImJihPPT09aS5VTlNJR05FRF9CWVRFJiYoSj1pLlJHQkE4VUkpLE89PT1pLlVOU0lHTkVEX1NIT1JUJiYoSj1pLlJHQkExNlVJKSxPPT09aS5VTlNJR05FRF9JTlQmJihKPWkuUkdCQTMyVUkpLE89PT1pLkJZVEUmJihKPWkuUkdCQThJKSxPPT09aS5TSE9SVCYmKEo9aS5SR0JBMTZJKSxPPT09aS5JTlQmJihKPWkuUkdCQTMySSkpLEM9PT1pLlJHQiYmTz09PWkuVU5TSUdORURfSU5UXzVfOV85XzlfUkVWJiYoSj1pLlJHQjlfRTUpLEM9PT1pLlJHQkEpe2NvbnN0IGR0PXR0P1NhOnJlLmdldFRyYW5zZmVyKCQpO089PT1pLkZMT0FUJiYoSj1pLlJHQkEzMkYpLE89PT1pLkhBTEZfRkxPQVQmJihKPWkuUkdCQTE2RiksTz09PWkuVU5TSUdORURfQllURSYmKEo9ZHQ9PT1wZT9pLlNSR0I4X0FMUEhBODppLlJHQkE4KSxPPT09aS5VTlNJR05FRF9TSE9SVF80XzRfNF80JiYoSj1pLlJHQkE0KSxPPT09aS5VTlNJR05FRF9TSE9SVF81XzVfNV8xJiYoSj1pLlJHQjVfQTEpfXJldHVybihKPT09aS5SMTZGfHxKPT09aS5SMzJGfHxKPT09aS5SRzE2Rnx8Sj09PWkuUkczMkZ8fEo9PT1pLlJHQkExNkZ8fEo9PT1pLlJHQkEzMkYpJiZ0LmdldCgiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpLEp9ZnVuY3Rpb24gXyhQLEMpe2xldCBPO3JldHVybiBQP0M9PT1udWxsfHxDPT09Vml8fEM9PT1Ycj9PPWkuREVQVEgyNF9TVEVOQ0lMODpDPT09dm4/Tz1pLkRFUFRIMzJGX1NURU5DSUw4OkM9PT1acyYmKE89aS5ERVBUSDI0X1NURU5DSUw4LGNvbnNvbGUud2FybigiRGVwdGhUZXh0dXJlOiAxNiBiaXQgZGVwdGggYXR0YWNobWVudCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RlbmNpbC4gVXNpbmcgMjQtYml0IGF0dGFjaG1lbnQuIikpOkM9PT1udWxsfHxDPT09Vml8fEM9PT1Ycj9PPWkuREVQVEhfQ09NUE9ORU5UMjQ6Qz09PXZuP089aS5ERVBUSF9DT01QT05FTlQzMkY6Qz09PVpzJiYoTz1pLkRFUFRIX0NPTVBPTkVOVDE2KSxPfWZ1bmN0aW9uIE0oUCxDKXtyZXR1cm4gZyhQKT09PSEwfHxQLmlzRnJhbWVidWZmZXJUZXh0dXJlJiZQLm1pbkZpbHRlciE9PVhlJiZQLm1pbkZpbHRlciE9PVZlP01hdGgubG9nMihNYXRoLm1heChDLndpZHRoLEMuaGVpZ2h0KSkrMTpQLm1pcG1hcHMhPT12b2lkIDAmJlAubWlwbWFwcy5sZW5ndGg+MD9QLm1pcG1hcHMubGVuZ3RoOlAuaXNDb21wcmVzc2VkVGV4dHVyZSYmQXJyYXkuaXNBcnJheShQLmltYWdlKT9DLm1pcG1hcHMubGVuZ3RoOjF9ZnVuY3Rpb24gYihQKXtjb25zdCBDPVAudGFyZ2V0O0MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYiksRShDKSxDLmlzVmlkZW9UZXh0dXJlJiZ1LmRlbGV0ZShDKX1mdW5jdGlvbiBBKFApe2NvbnN0IEM9UC50YXJnZXQ7Qy5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixBKSxTKEMpfWZ1bmN0aW9uIEUoUCl7Y29uc3QgQz1uLmdldChQKTtpZihDLl9fd2ViZ2xJbml0PT09dm9pZCAwKXJldHVybjtjb25zdCBPPVAuc291cmNlLCQ9Zi5nZXQoTyk7aWYoJCl7Y29uc3QgdHQ9JFtDLl9fY2FjaGVLZXldO3R0LnVzZWRUaW1lcy0tLHR0LnVzZWRUaW1lcz09PTAmJncoUCksT2JqZWN0LmtleXMoJCkubGVuZ3RoPT09MCYmZi5kZWxldGUoTyl9bi5yZW1vdmUoUCl9ZnVuY3Rpb24gdyhQKXtjb25zdCBDPW4uZ2V0KFApO2kuZGVsZXRlVGV4dHVyZShDLl9fd2ViZ2xUZXh0dXJlKTtjb25zdCBPPVAuc291cmNlLCQ9Zi5nZXQoTyk7ZGVsZXRlICRbQy5fX2NhY2hlS2V5XSxvLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIFMoUCl7Y29uc3QgQz1uLmdldChQKTtpZihQLmRlcHRoVGV4dHVyZSYmKFAuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKSxuLnJlbW92ZShQLmRlcHRoVGV4dHVyZSkpLFAuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQpZm9yKGxldCAkPTA7JDw2OyQrKyl7aWYoQXJyYXkuaXNBcnJheShDLl9fd2ViZ2xGcmFtZWJ1ZmZlclskXSkpZm9yKGxldCB0dD0wO3R0PEMuX193ZWJnbEZyYW1lYnVmZmVyWyRdLmxlbmd0aDt0dCsrKWkuZGVsZXRlRnJhbWVidWZmZXIoQy5fX3dlYmdsRnJhbWVidWZmZXJbJF1bdHRdKTtlbHNlIGkuZGVsZXRlRnJhbWVidWZmZXIoQy5fX3dlYmdsRnJhbWVidWZmZXJbJF0pO0MuX193ZWJnbERlcHRoYnVmZmVyJiZpLmRlbGV0ZVJlbmRlcmJ1ZmZlcihDLl9fd2ViZ2xEZXB0aGJ1ZmZlclskXSl9ZWxzZXtpZihBcnJheS5pc0FycmF5KEMuX193ZWJnbEZyYW1lYnVmZmVyKSlmb3IobGV0ICQ9MDskPEMuX193ZWJnbEZyYW1lYnVmZmVyLmxlbmd0aDskKyspaS5kZWxldGVGcmFtZWJ1ZmZlcihDLl9fd2ViZ2xGcmFtZWJ1ZmZlclskXSk7ZWxzZSBpLmRlbGV0ZUZyYW1lYnVmZmVyKEMuX193ZWJnbEZyYW1lYnVmZmVyKTtpZihDLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmaS5kZWxldGVSZW5kZXJidWZmZXIoQy5fX3dlYmdsRGVwdGhidWZmZXIpLEMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyJiZpLmRlbGV0ZUZyYW1lYnVmZmVyKEMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSxDLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcilmb3IobGV0ICQ9MDskPEMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyLmxlbmd0aDskKyspQy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbJF0mJmkuZGVsZXRlUmVuZGVyYnVmZmVyKEMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyWyRdKTtDLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciYmaS5kZWxldGVSZW5kZXJidWZmZXIoQy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIpfWNvbnN0IE89UC50ZXh0dXJlcztmb3IobGV0ICQ9MCx0dD1PLmxlbmd0aDskPHR0OyQrKyl7Y29uc3QgSj1uLmdldChPWyRdKTtKLl9fd2ViZ2xUZXh0dXJlJiYoaS5kZWxldGVUZXh0dXJlKEouX193ZWJnbFRleHR1cmUpLG8ubWVtb3J5LnRleHR1cmVzLS0pLG4ucmVtb3ZlKE9bJF0pfW4ucmVtb3ZlKFApfWxldCBUPTA7ZnVuY3Rpb24gRCgpe1Q9MH1mdW5jdGlvbiBMKCl7Y29uc3QgUD1UO3JldHVybiBQPj1yLm1heFRleHR1cmVzJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IFRyeWluZyB0byB1c2UgIitQKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrci5tYXhUZXh0dXJlcyksVCs9MSxQfWZ1bmN0aW9uIE4oUCl7Y29uc3QgQz1bXTtyZXR1cm4gQy5wdXNoKFAud3JhcFMpLEMucHVzaChQLndyYXBUKSxDLnB1c2goUC53cmFwUnx8MCksQy5wdXNoKFAubWFnRmlsdGVyKSxDLnB1c2goUC5taW5GaWx0ZXIpLEMucHVzaChQLmFuaXNvdHJvcHkpLEMucHVzaChQLmludGVybmFsRm9ybWF0KSxDLnB1c2goUC5mb3JtYXQpLEMucHVzaChQLnR5cGUpLEMucHVzaChQLmdlbmVyYXRlTWlwbWFwcyksQy5wdXNoKFAucHJlbXVsdGlwbHlBbHBoYSksQy5wdXNoKFAuZmxpcFkpLEMucHVzaChQLnVucGFja0FsaWdubWVudCksQy5wdXNoKFAuY29sb3JTcGFjZSksQy5qb2luKCl9ZnVuY3Rpb24gRihQLEMpe2NvbnN0IE89bi5nZXQoUCk7aWYoUC5pc1ZpZGVvVGV4dHVyZSYmVyhQKSxQLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExJiZQLnZlcnNpb24+MCYmTy5fX3ZlcnNpb24hPT1QLnZlcnNpb24pe2NvbnN0ICQ9UC5pbWFnZTtpZigkPT09bnVsbCljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IG5vIGltYWdlIGRhdGEgZm91bmQuIik7ZWxzZSBpZigkLmNvbXBsZXRlPT09ITEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtqKE8sUCxDKTtyZXR1cm59fWUuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELE8uX193ZWJnbFRleHR1cmUsaS5URVhUVVJFMCtDKX1mdW5jdGlvbiBCKFAsQyl7Y29uc3QgTz1uLmdldChQKTtpZihQLnZlcnNpb24+MCYmTy5fX3ZlcnNpb24hPT1QLnZlcnNpb24pe2ooTyxQLEMpO3JldHVybn1lLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV8yRF9BUlJBWSxPLl9fd2ViZ2xUZXh0dXJlLGkuVEVYVFVSRTArQyl9ZnVuY3Rpb24gRyhQLEMpe2NvbnN0IE89bi5nZXQoUCk7aWYoUC52ZXJzaW9uPjAmJk8uX192ZXJzaW9uIT09UC52ZXJzaW9uKXtqKE8sUCxDKTtyZXR1cm59ZS5iaW5kVGV4dHVyZShpLlRFWFRVUkVfM0QsTy5fX3dlYmdsVGV4dHVyZSxpLlRFWFRVUkUwK0MpfWZ1bmN0aW9uIGsoUCxDKXtjb25zdCBPPW4uZ2V0KFApO2lmKFAudmVyc2lvbj4wJiZPLl9fdmVyc2lvbiE9PVAudmVyc2lvbil7cnQoTyxQLEMpO3JldHVybn1lLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV9DVUJFX01BUCxPLl9fd2ViZ2xUZXh0dXJlLGkuVEVYVFVSRTArQyl9Y29uc3QgUT17W3VhXTppLlJFUEVBVCxbcW5dOmkuQ0xBTVBfVE9fRURHRSxbaGFdOmkuTUlSUk9SRURfUkVQRUFUfSxjdD17W1hlXTppLk5FQVJFU1QsW2lkXTppLk5FQVJFU1RfTUlQTUFQX05FQVJFU1QsW1lzXTppLk5FQVJFU1RfTUlQTUFQX0xJTkVBUixbVmVdOmkuTElORUFSLFtmYV06aS5MSU5FQVJfTUlQTUFQX05FQVJFU1QsW3dpXTppLkxJTkVBUl9NSVBNQVBfTElORUFSfSxodD17W2x5XTppLk5FVkVSLFtweV06aS5BTFdBWVMsW2N5XTppLkxFU1MsW21kXTppLkxFUVVBTCxbdXldOmkuRVFVQUwsW2R5XTppLkdFUVVBTCxbaHldOmkuR1JFQVRFUixbZnldOmkuTk9URVFVQUx9O2Z1bmN0aW9uIFB0KFAsQyl7aWYoQy50eXBlPT09dm4mJnQuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT09PSExJiYoQy5tYWdGaWx0ZXI9PT1WZXx8Qy5tYWdGaWx0ZXI9PT1mYXx8Qy5tYWdGaWx0ZXI9PT1Zc3x8Qy5tYWdGaWx0ZXI9PT13aXx8Qy5taW5GaWx0ZXI9PT1WZXx8Qy5taW5GaWx0ZXI9PT1mYXx8Qy5taW5GaWx0ZXI9PT1Zc3x8Qy5taW5GaWx0ZXI9PT13aSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5hYmxlIHRvIHVzZSBsaW5lYXIgZmlsdGVyaW5nIHdpdGggZmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMuIE9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLiIpLGkudGV4UGFyYW1ldGVyaShQLGkuVEVYVFVSRV9XUkFQX1MsUVtDLndyYXBTXSksaS50ZXhQYXJhbWV0ZXJpKFAsaS5URVhUVVJFX1dSQVBfVCxRW0Mud3JhcFRdKSwoUD09PWkuVEVYVFVSRV8zRHx8UD09PWkuVEVYVFVSRV8yRF9BUlJBWSkmJmkudGV4UGFyYW1ldGVyaShQLGkuVEVYVFVSRV9XUkFQX1IsUVtDLndyYXBSXSksaS50ZXhQYXJhbWV0ZXJpKFAsaS5URVhUVVJFX01BR19GSUxURVIsY3RbQy5tYWdGaWx0ZXJdKSxpLnRleFBhcmFtZXRlcmkoUCxpLlRFWFRVUkVfTUlOX0ZJTFRFUixjdFtDLm1pbkZpbHRlcl0pLEMuY29tcGFyZUZ1bmN0aW9uJiYoaS50ZXhQYXJhbWV0ZXJpKFAsaS5URVhUVVJFX0NPTVBBUkVfTU9ERSxpLkNPTVBBUkVfUkVGX1RPX1RFWFRVUkUpLGkudGV4UGFyYW1ldGVyaShQLGkuVEVYVFVSRV9DT01QQVJFX0ZVTkMsaHRbQy5jb21wYXJlRnVuY3Rpb25dKSksdC5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpPT09ITApe2lmKEMubWFnRmlsdGVyPT09WGV8fEMubWluRmlsdGVyIT09WXMmJkMubWluRmlsdGVyIT09d2l8fEMudHlwZT09PXZuJiZ0LmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik9PT0hMSlyZXR1cm47aWYoQy5hbmlzb3Ryb3B5PjF8fG4uZ2V0KEMpLl9fY3VycmVudEFuaXNvdHJvcHkpe2NvbnN0IE89dC5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2kudGV4UGFyYW1ldGVyZihQLE8uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsTWF0aC5taW4oQy5hbmlzb3Ryb3B5LHIuZ2V0TWF4QW5pc290cm9weSgpKSksbi5nZXQoQykuX19jdXJyZW50QW5pc290cm9weT1DLmFuaXNvdHJvcHl9fX1mdW5jdGlvbiBYdChQLEMpe2xldCBPPSExO1AuX193ZWJnbEluaXQ9PT12b2lkIDAmJihQLl9fd2ViZ2xJbml0PSEwLEMuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYikpO2NvbnN0ICQ9Qy5zb3VyY2U7bGV0IHR0PWYuZ2V0KCQpO3R0PT09dm9pZCAwJiYodHQ9e30sZi5zZXQoJCx0dCkpO2NvbnN0IEo9TihDKTtpZihKIT09UC5fX2NhY2hlS2V5KXt0dFtKXT09PXZvaWQgMCYmKHR0W0pdPXt0ZXh0dXJlOmkuY3JlYXRlVGV4dHVyZSgpLHVzZWRUaW1lczowfSxvLm1lbW9yeS50ZXh0dXJlcysrLE89ITApLHR0W0pdLnVzZWRUaW1lcysrO2NvbnN0IGR0PXR0W1AuX19jYWNoZUtleV07ZHQhPT12b2lkIDAmJih0dFtQLl9fY2FjaGVLZXldLnVzZWRUaW1lcy0tLGR0LnVzZWRUaW1lcz09PTAmJncoQykpLFAuX19jYWNoZUtleT1KLFAuX193ZWJnbFRleHR1cmU9dHRbSl0udGV4dHVyZX1yZXR1cm4gT31mdW5jdGlvbiBqKFAsQyxPKXtsZXQgJD1pLlRFWFRVUkVfMkQ7KEMuaXNEYXRhQXJyYXlUZXh0dXJlfHxDLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkmJigkPWkuVEVYVFVSRV8yRF9BUlJBWSksQy5pc0RhdGEzRFRleHR1cmUmJigkPWkuVEVYVFVSRV8zRCk7Y29uc3QgdHQ9WHQoUCxDKSxKPUMuc291cmNlO2UuYmluZFRleHR1cmUoJCxQLl9fd2ViZ2xUZXh0dXJlLGkuVEVYVFVSRTArTyk7Y29uc3QgZHQ9bi5nZXQoSik7aWYoSi52ZXJzaW9uIT09ZHQuX192ZXJzaW9ufHx0dD09PSEwKXtlLmFjdGl2ZVRleHR1cmUoaS5URVhUVVJFMCtPKTtjb25zdCBmdD1yZS5nZXRQcmltYXJpZXMocmUud29ya2luZ0NvbG9yU3BhY2UpLHl0PUMuY29sb3JTcGFjZT09PUdpP251bGw6cmUuZ2V0UHJpbWFyaWVzKEMuY29sb3JTcGFjZSksVnQ9Qy5jb2xvclNwYWNlPT09R2l8fGZ0PT09eXQ/aS5OT05FOmkuQlJPV1NFUl9ERUZBVUxUX1dFQkdMO2kucGl4ZWxTdG9yZWkoaS5VTlBBQ0tfRkxJUF9ZX1dFQkdMLEMuZmxpcFkpLGkucGl4ZWxTdG9yZWkoaS5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsQy5wcmVtdWx0aXBseUFscGhhKSxpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0FMSUdOTUVOVCxDLnVucGFja0FsaWdubWVudCksaS5waXhlbFN0b3JlaShpLlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wsVnQpO2xldCBhdD15KEMuaW1hZ2UsITEsci5tYXhUZXh0dXJlU2l6ZSk7YXQ9ZXQoQyxhdCk7Y29uc3QgYnQ9cy5jb252ZXJ0KEMuZm9ybWF0LEMuY29sb3JTcGFjZSksRHQ9cy5jb252ZXJ0KEMudHlwZSk7bGV0IHp0PXgoQy5pbnRlcm5hbEZvcm1hdCxidCxEdCxDLmNvbG9yU3BhY2UsQy5pc1ZpZGVvVGV4dHVyZSk7UHQoJCxDKTtsZXQgd3Q7Y29uc3QgZWU9Qy5taXBtYXBzLFl0PUMuaXNWaWRlb1RleHR1cmUhPT0hMCx2ZT1kdC5fX3ZlcnNpb249PT12b2lkIDB8fHR0PT09ITAsej1KLmRhdGFSZWFkeSxtdD1NKEMsYXQpO2lmKEMuaXNEZXB0aFRleHR1cmUpenQ9XyhDLmZvcm1hdD09PVlyLEMudHlwZSksdmUmJihZdD9lLnRleFN0b3JhZ2UyRChpLlRFWFRVUkVfMkQsMSx6dCxhdC53aWR0aCxhdC5oZWlnaHQpOmUudGV4SW1hZ2UyRChpLlRFWFRVUkVfMkQsMCx6dCxhdC53aWR0aCxhdC5oZWlnaHQsMCxidCxEdCxudWxsKSk7ZWxzZSBpZihDLmlzRGF0YVRleHR1cmUpaWYoZWUubGVuZ3RoPjApe1l0JiZ2ZSYmZS50ZXhTdG9yYWdlMkQoaS5URVhUVVJFXzJELG10LHp0LGVlWzBdLndpZHRoLGVlWzBdLmhlaWdodCk7Zm9yKGxldCBLPTAsaXQ9ZWUubGVuZ3RoO0s8aXQ7SysrKXd0PWVlW0tdLFl0P3omJmUudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsSywwLDAsd3Qud2lkdGgsd3QuaGVpZ2h0LGJ0LER0LHd0LmRhdGEpOmUudGV4SW1hZ2UyRChpLlRFWFRVUkVfMkQsSyx6dCx3dC53aWR0aCx3dC5oZWlnaHQsMCxidCxEdCx3dC5kYXRhKTtDLmdlbmVyYXRlTWlwbWFwcz0hMX1lbHNlIFl0Pyh2ZSYmZS50ZXhTdG9yYWdlMkQoaS5URVhUVVJFXzJELG10LHp0LGF0LndpZHRoLGF0LmhlaWdodCkseiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV8yRCwwLDAsMCxhdC53aWR0aCxhdC5oZWlnaHQsYnQsRHQsYXQuZGF0YSkpOmUudGV4SW1hZ2UyRChpLlRFWFRVUkVfMkQsMCx6dCxhdC53aWR0aCxhdC5oZWlnaHQsMCxidCxEdCxhdC5kYXRhKTtlbHNlIGlmKEMuaXNDb21wcmVzc2VkVGV4dHVyZSlpZihDLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSl7WXQmJnZlJiZlLnRleFN0b3JhZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksbXQsenQsZWVbMF0ud2lkdGgsZWVbMF0uaGVpZ2h0LGF0LmRlcHRoKTtmb3IobGV0IEs9MCxpdD1lZS5sZW5ndGg7SzxpdDtLKyspaWYod3Q9ZWVbS10sQy5mb3JtYXQhPT1hbilpZihidCE9PW51bGwpaWYoWXQpe2lmKHopaWYoQy5sYXllclVwZGF0ZXMuc2l6ZT4wKXtjb25zdCB2dD1JcCh3dC53aWR0aCx3dC5oZWlnaHQsQy5mb3JtYXQsQy50eXBlKTtmb3IoY29uc3QgX3Qgb2YgQy5sYXllclVwZGF0ZXMpe2NvbnN0IEt0PXd0LmRhdGEuc3ViYXJyYXkoX3QqdnQvd3QuZGF0YS5CWVRFU19QRVJfRUxFTUVOVCwoX3QrMSkqdnQvd3QuZGF0YS5CWVRFU19QRVJfRUxFTUVOVCk7ZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksSywwLDAsX3Qsd3Qud2lkdGgsd3QuaGVpZ2h0LDEsYnQsS3QpfUMuY2xlYXJMYXllclVwZGF0ZXMoKX1lbHNlIGUuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoaS5URVhUVVJFXzJEX0FSUkFZLEssMCwwLDAsd3Qud2lkdGgsd3QuaGVpZ2h0LGF0LmRlcHRoLGJ0LHd0LmRhdGEpfWVsc2UgZS5jb21wcmVzc2VkVGV4SW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksSyx6dCx3dC53aWR0aCx3dC5oZWlnaHQsYXQuZGVwdGgsMCx3dC5kYXRhLDAsMCk7ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTtlbHNlIFl0P3omJmUudGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksSywwLDAsMCx3dC53aWR0aCx3dC5oZWlnaHQsYXQuZGVwdGgsYnQsRHQsd3QuZGF0YSk6ZS50ZXhJbWFnZTNEKGkuVEVYVFVSRV8yRF9BUlJBWSxLLHp0LHd0LndpZHRoLHd0LmhlaWdodCxhdC5kZXB0aCwwLGJ0LER0LHd0LmRhdGEpfWVsc2V7WXQmJnZlJiZlLnRleFN0b3JhZ2UyRChpLlRFWFRVUkVfMkQsbXQsenQsZWVbMF0ud2lkdGgsZWVbMF0uaGVpZ2h0KTtmb3IobGV0IEs9MCxpdD1lZS5sZW5ndGg7SzxpdDtLKyspd3Q9ZWVbS10sQy5mb3JtYXQhPT1hbj9idCE9PW51bGw/WXQ/eiYmZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsSywwLDAsd3Qud2lkdGgsd3QuaGVpZ2h0LGJ0LHd0LmRhdGEpOmUuY29tcHJlc3NlZFRleEltYWdlMkQoaS5URVhUVVJFXzJELEssenQsd3Qud2lkdGgsd3QuaGVpZ2h0LDAsd3QuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik6WXQ/eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV8yRCxLLDAsMCx3dC53aWR0aCx3dC5oZWlnaHQsYnQsRHQsd3QuZGF0YSk6ZS50ZXhJbWFnZTJEKGkuVEVYVFVSRV8yRCxLLHp0LHd0LndpZHRoLHd0LmhlaWdodCwwLGJ0LER0LHd0LmRhdGEpfWVsc2UgaWYoQy5pc0RhdGFBcnJheVRleHR1cmUpaWYoWXQpe2lmKHZlJiZlLnRleFN0b3JhZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksbXQsenQsYXQud2lkdGgsYXQuaGVpZ2h0LGF0LmRlcHRoKSx6KWlmKEMubGF5ZXJVcGRhdGVzLnNpemU+MCl7Y29uc3QgSz1JcChhdC53aWR0aCxhdC5oZWlnaHQsQy5mb3JtYXQsQy50eXBlKTtmb3IoY29uc3QgaXQgb2YgQy5sYXllclVwZGF0ZXMpe2NvbnN0IHZ0PWF0LmRhdGEuc3ViYXJyYXkoaXQqSy9hdC5kYXRhLkJZVEVTX1BFUl9FTEVNRU5ULChpdCsxKSpLL2F0LmRhdGEuQllURVNfUEVSX0VMRU1FTlQpO2UudGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksMCwwLDAsaXQsYXQud2lkdGgsYXQuaGVpZ2h0LDEsYnQsRHQsdnQpfUMuY2xlYXJMYXllclVwZGF0ZXMoKX1lbHNlIGUudGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksMCwwLDAsMCxhdC53aWR0aCxhdC5oZWlnaHQsYXQuZGVwdGgsYnQsRHQsYXQuZGF0YSl9ZWxzZSBlLnRleEltYWdlM0QoaS5URVhUVVJFXzJEX0FSUkFZLDAsenQsYXQud2lkdGgsYXQuaGVpZ2h0LGF0LmRlcHRoLDAsYnQsRHQsYXQuZGF0YSk7ZWxzZSBpZihDLmlzRGF0YTNEVGV4dHVyZSlZdD8odmUmJmUudGV4U3RvcmFnZTNEKGkuVEVYVFVSRV8zRCxtdCx6dCxhdC53aWR0aCxhdC5oZWlnaHQsYXQuZGVwdGgpLHomJmUudGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfM0QsMCwwLDAsMCxhdC53aWR0aCxhdC5oZWlnaHQsYXQuZGVwdGgsYnQsRHQsYXQuZGF0YSkpOmUudGV4SW1hZ2UzRChpLlRFWFRVUkVfM0QsMCx6dCxhdC53aWR0aCxhdC5oZWlnaHQsYXQuZGVwdGgsMCxidCxEdCxhdC5kYXRhKTtlbHNlIGlmKEMuaXNGcmFtZWJ1ZmZlclRleHR1cmUpe2lmKHZlKWlmKFl0KWUudGV4U3RvcmFnZTJEKGkuVEVYVFVSRV8yRCxtdCx6dCxhdC53aWR0aCxhdC5oZWlnaHQpO2Vsc2V7bGV0IEs9YXQud2lkdGgsaXQ9YXQuaGVpZ2h0O2ZvcihsZXQgdnQ9MDt2dDxtdDt2dCsrKWUudGV4SW1hZ2UyRChpLlRFWFRVUkVfMkQsdnQsenQsSyxpdCwwLGJ0LER0LG51bGwpLEs+Pj0xLGl0Pj49MX19ZWxzZSBpZihlZS5sZW5ndGg+MCl7aWYoWXQmJnZlKXtjb25zdCBLPVooZWVbMF0pO2UudGV4U3RvcmFnZTJEKGkuVEVYVFVSRV8yRCxtdCx6dCxLLndpZHRoLEsuaGVpZ2h0KX1mb3IobGV0IEs9MCxpdD1lZS5sZW5ndGg7SzxpdDtLKyspd3Q9ZWVbS10sWXQ/eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV8yRCxLLDAsMCxidCxEdCx3dCk6ZS50ZXhJbWFnZTJEKGkuVEVYVFVSRV8yRCxLLHp0LGJ0LER0LHd0KTtDLmdlbmVyYXRlTWlwbWFwcz0hMX1lbHNlIGlmKFl0KXtpZih2ZSl7Y29uc3QgSz1aKGF0KTtlLnRleFN0b3JhZ2UyRChpLlRFWFRVUkVfMkQsbXQsenQsSy53aWR0aCxLLmhlaWdodCl9eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV8yRCwwLDAsMCxidCxEdCxhdCl9ZWxzZSBlLnRleEltYWdlMkQoaS5URVhUVVJFXzJELDAsenQsYnQsRHQsYXQpO2coQykmJm0oJCksZHQuX192ZXJzaW9uPUoudmVyc2lvbixDLm9uVXBkYXRlJiZDLm9uVXBkYXRlKEMpfVAuX192ZXJzaW9uPUMudmVyc2lvbn1mdW5jdGlvbiBydChQLEMsTyl7aWYoQy5pbWFnZS5sZW5ndGghPT02KXJldHVybjtjb25zdCAkPVh0KFAsQyksdHQ9Qy5zb3VyY2U7ZS5iaW5kVGV4dHVyZShpLlRFWFRVUkVfQ1VCRV9NQVAsUC5fX3dlYmdsVGV4dHVyZSxpLlRFWFRVUkUwK08pO2NvbnN0IEo9bi5nZXQodHQpO2lmKHR0LnZlcnNpb24hPT1KLl9fdmVyc2lvbnx8JD09PSEwKXtlLmFjdGl2ZVRleHR1cmUoaS5URVhUVVJFMCtPKTtjb25zdCBkdD1yZS5nZXRQcmltYXJpZXMocmUud29ya2luZ0NvbG9yU3BhY2UpLGZ0PUMuY29sb3JTcGFjZT09PUdpP251bGw6cmUuZ2V0UHJpbWFyaWVzKEMuY29sb3JTcGFjZSkseXQ9Qy5jb2xvclNwYWNlPT09R2l8fGR0PT09ZnQ/aS5OT05FOmkuQlJPV1NFUl9ERUZBVUxUX1dFQkdMO2kucGl4ZWxTdG9yZWkoaS5VTlBBQ0tfRkxJUF9ZX1dFQkdMLEMuZmxpcFkpLGkucGl4ZWxTdG9yZWkoaS5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsQy5wcmVtdWx0aXBseUFscGhhKSxpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0FMSUdOTUVOVCxDLnVucGFja0FsaWdubWVudCksaS5waXhlbFN0b3JlaShpLlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wseXQpO2NvbnN0IFZ0PUMuaXNDb21wcmVzc2VkVGV4dHVyZXx8Qy5pbWFnZVswXS5pc0NvbXByZXNzZWRUZXh0dXJlLGF0PUMuaW1hZ2VbMF0mJkMuaW1hZ2VbMF0uaXNEYXRhVGV4dHVyZSxidD1bXTtmb3IobGV0IGl0PTA7aXQ8NjtpdCsrKSFWdCYmIWF0P2J0W2l0XT15KEMuaW1hZ2VbaXRdLCEwLHIubWF4Q3ViZW1hcFNpemUpOmJ0W2l0XT1hdD9DLmltYWdlW2l0XS5pbWFnZTpDLmltYWdlW2l0XSxidFtpdF09ZXQoQyxidFtpdF0pO2NvbnN0IER0PWJ0WzBdLHp0PXMuY29udmVydChDLmZvcm1hdCxDLmNvbG9yU3BhY2UpLHd0PXMuY29udmVydChDLnR5cGUpLGVlPXgoQy5pbnRlcm5hbEZvcm1hdCx6dCx3dCxDLmNvbG9yU3BhY2UpLFl0PUMuaXNWaWRlb1RleHR1cmUhPT0hMCx2ZT1KLl9fdmVyc2lvbj09PXZvaWQgMHx8JD09PSEwLHo9dHQuZGF0YVJlYWR5O2xldCBtdD1NKEMsRHQpO1B0KGkuVEVYVFVSRV9DVUJFX01BUCxDKTtsZXQgSztpZihWdCl7WXQmJnZlJiZlLnRleFN0b3JhZ2UyRChpLlRFWFRVUkVfQ1VCRV9NQVAsbXQsZWUsRHQud2lkdGgsRHQuaGVpZ2h0KTtmb3IobGV0IGl0PTA7aXQ8NjtpdCsrKXtLPWJ0W2l0XS5taXBtYXBzO2ZvcihsZXQgdnQ9MDt2dDxLLmxlbmd0aDt2dCsrKXtjb25zdCBfdD1LW3Z0XTtDLmZvcm1hdCE9PWFuP3p0IT09bnVsbD9ZdD96JiZlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LHZ0LDAsMCxfdC53aWR0aCxfdC5oZWlnaHQsenQsX3QuZGF0YSk6ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRChpLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtpdCx2dCxlZSxfdC53aWR0aCxfdC5oZWlnaHQsMCxfdC5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6WXQ/eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LHZ0LDAsMCxfdC53aWR0aCxfdC5oZWlnaHQsenQsd3QsX3QuZGF0YSk6ZS50ZXhJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LHZ0LGVlLF90LndpZHRoLF90LmhlaWdodCwwLHp0LHd0LF90LmRhdGEpfX19ZWxzZXtpZihLPUMubWlwbWFwcyxZdCYmdmUpe0subGVuZ3RoPjAmJm10Kys7Y29uc3QgaXQ9WihidFswXSk7ZS50ZXhTdG9yYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQLG10LGVlLGl0LndpZHRoLGl0LmhlaWdodCl9Zm9yKGxldCBpdD0wO2l0PDY7aXQrKylpZihhdCl7WXQ/eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LDAsMCwwLGJ0W2l0XS53aWR0aCxidFtpdF0uaGVpZ2h0LHp0LHd0LGJ0W2l0XS5kYXRhKTplLnRleEltYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1graXQsMCxlZSxidFtpdF0ud2lkdGgsYnRbaXRdLmhlaWdodCwwLHp0LHd0LGJ0W2l0XS5kYXRhKTtmb3IobGV0IHZ0PTA7dnQ8Sy5sZW5ndGg7dnQrKyl7Y29uc3QgS3Q9S1t2dF0uaW1hZ2VbaXRdLmltYWdlO1l0P3omJmUudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtpdCx2dCsxLDAsMCxLdC53aWR0aCxLdC5oZWlnaHQsenQsd3QsS3QuZGF0YSk6ZS50ZXhJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LHZ0KzEsZWUsS3Qud2lkdGgsS3QuaGVpZ2h0LDAsenQsd3QsS3QuZGF0YSl9fWVsc2V7WXQ/eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LDAsMCwwLHp0LHd0LGJ0W2l0XSk6ZS50ZXhJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LDAsZWUsenQsd3QsYnRbaXRdKTtmb3IobGV0IHZ0PTA7dnQ8Sy5sZW5ndGg7dnQrKyl7Y29uc3QgX3Q9S1t2dF07WXQ/eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LHZ0KzEsMCwwLHp0LHd0LF90LmltYWdlW2l0XSk6ZS50ZXhJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2l0LHZ0KzEsZWUsenQsd3QsX3QuaW1hZ2VbaXRdKX19fWcoQykmJm0oaS5URVhUVVJFX0NVQkVfTUFQKSxKLl9fdmVyc2lvbj10dC52ZXJzaW9uLEMub25VcGRhdGUmJkMub25VcGRhdGUoQyl9UC5fX3ZlcnNpb249Qy52ZXJzaW9ufWZ1bmN0aW9uIEV0KFAsQyxPLCQsdHQsSil7Y29uc3QgZHQ9cy5jb252ZXJ0KE8uZm9ybWF0LE8uY29sb3JTcGFjZSksZnQ9cy5jb252ZXJ0KE8udHlwZSkseXQ9eChPLmludGVybmFsRm9ybWF0LGR0LGZ0LE8uY29sb3JTcGFjZSksVnQ9bi5nZXQoQyksYXQ9bi5nZXQoTyk7aWYoYXQuX19yZW5kZXJUYXJnZXQ9QywhVnQuX19oYXNFeHRlcm5hbFRleHR1cmVzKXtjb25zdCBidD1NYXRoLm1heCgxLEMud2lkdGg+PkopLER0PU1hdGgubWF4KDEsQy5oZWlnaHQ+PkopO3R0PT09aS5URVhUVVJFXzNEfHx0dD09PWkuVEVYVFVSRV8yRF9BUlJBWT9lLnRleEltYWdlM0QodHQsSix5dCxidCxEdCxDLmRlcHRoLDAsZHQsZnQsbnVsbCk6ZS50ZXhJbWFnZTJEKHR0LEoseXQsYnQsRHQsMCxkdCxmdCxudWxsKX1lLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLFApLFN0KEMpP2EuZnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVChpLkZSQU1FQlVGRkVSLCQsdHQsYXQuX193ZWJnbFRleHR1cmUsMCxvdChDKSk6KHR0PT09aS5URVhUVVJFXzJEfHx0dD49aS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gmJnR0PD1pLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWikmJmkuZnJhbWVidWZmZXJUZXh0dXJlMkQoaS5GUkFNRUJVRkZFUiwkLHR0LGF0Ll9fd2ViZ2xUZXh0dXJlLEopLGUuYmluZEZyYW1lYnVmZmVyKGkuRlJBTUVCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gdXQoUCxDLE8pe2lmKGkuYmluZFJlbmRlcmJ1ZmZlcihpLlJFTkRFUkJVRkZFUixQKSxDLmRlcHRoQnVmZmVyKXtjb25zdCAkPUMuZGVwdGhUZXh0dXJlLHR0PSQmJiQuaXNEZXB0aFRleHR1cmU/JC50eXBlOm51bGwsSj1fKEMuc3RlbmNpbEJ1ZmZlcix0dCksZHQ9Qy5zdGVuY2lsQnVmZmVyP2kuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOmkuREVQVEhfQVRUQUNITUVOVCxmdD1vdChDKTtTdChDKT9hLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChpLlJFTkRFUkJVRkZFUixmdCxKLEMud2lkdGgsQy5oZWlnaHQpOk8/aS5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoaS5SRU5ERVJCVUZGRVIsZnQsSixDLndpZHRoLEMuaGVpZ2h0KTppLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoaS5SRU5ERVJCVUZGRVIsSixDLndpZHRoLEMuaGVpZ2h0KSxpLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGkuRlJBTUVCVUZGRVIsZHQsaS5SRU5ERVJCVUZGRVIsUCl9ZWxzZXtjb25zdCAkPUMudGV4dHVyZXM7Zm9yKGxldCB0dD0wO3R0PCQubGVuZ3RoO3R0Kyspe2NvbnN0IEo9JFt0dF0sZHQ9cy5jb252ZXJ0KEouZm9ybWF0LEouY29sb3JTcGFjZSksZnQ9cy5jb252ZXJ0KEoudHlwZSkseXQ9eChKLmludGVybmFsRm9ybWF0LGR0LGZ0LEouY29sb3JTcGFjZSksVnQ9b3QoQyk7TyYmU3QoQyk9PT0hMT9pLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShpLlJFTkRFUkJVRkZFUixWdCx5dCxDLndpZHRoLEMuaGVpZ2h0KTpTdChDKT9hLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChpLlJFTkRFUkJVRkZFUixWdCx5dCxDLndpZHRoLEMuaGVpZ2h0KTppLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoaS5SRU5ERVJCVUZGRVIseXQsQy53aWR0aCxDLmhlaWdodCl9fWkuYmluZFJlbmRlcmJ1ZmZlcihpLlJFTkRFUkJVRkZFUixudWxsKX1mdW5jdGlvbiBMdChQLEMpe2lmKEMmJkMuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQpdGhyb3cgbmV3IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7aWYoZS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUixQKSwhKEMuZGVwdGhUZXh0dXJlJiZDLmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSkpdGhyb3cgbmV3IEVycm9yKCJyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRGVwdGhUZXh0dXJlIik7Y29uc3QgJD1uLmdldChDLmRlcHRoVGV4dHVyZSk7JC5fX3JlbmRlclRhcmdldD1DLCghJC5fX3dlYmdsVGV4dHVyZXx8Qy5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGghPT1DLndpZHRofHxDLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQhPT1DLmhlaWdodCkmJihDLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aD1DLndpZHRoLEMuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1DLmhlaWdodCxDLmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCksRihDLmRlcHRoVGV4dHVyZSwwKTtjb25zdCB0dD0kLl9fd2ViZ2xUZXh0dXJlLEo9b3QoQyk7aWYoQy5kZXB0aFRleHR1cmUuZm9ybWF0PT09cXIpU3QoQyk/YS5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKGkuRlJBTUVCVUZGRVIsaS5ERVBUSF9BVFRBQ0hNRU5ULGkuVEVYVFVSRV8yRCx0dCwwLEopOmkuZnJhbWVidWZmZXJUZXh0dXJlMkQoaS5GUkFNRUJVRkZFUixpLkRFUFRIX0FUVEFDSE1FTlQsaS5URVhUVVJFXzJELHR0LDApO2Vsc2UgaWYoQy5kZXB0aFRleHR1cmUuZm9ybWF0PT09WXIpU3QoQyk/YS5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKGkuRlJBTUVCVUZGRVIsaS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsaS5URVhUVVJFXzJELHR0LDAsSik6aS5mcmFtZWJ1ZmZlclRleHR1cmUyRChpLkZSQU1FQlVGRkVSLGkuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULGkuVEVYVFVSRV8yRCx0dCwwKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iil9ZnVuY3Rpb24gT3QoUCl7Y29uc3QgQz1uLmdldChQKSxPPVAuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ9PT0hMDtpZihDLl9fYm91bmREZXB0aFRleHR1cmUhPT1QLmRlcHRoVGV4dHVyZSl7Y29uc3QgJD1QLmRlcHRoVGV4dHVyZTtpZihDLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2smJkMuX19kZXB0aERpc3Bvc2VDYWxsYmFjaygpLCQpe2NvbnN0IHR0PSgpPT57ZGVsZXRlIEMuX19ib3VuZERlcHRoVGV4dHVyZSxkZWxldGUgQy5fX2RlcHRoRGlzcG9zZUNhbGxiYWNrLCQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsdHQpfTskLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHR0KSxDLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2s9dHR9Qy5fX2JvdW5kRGVwdGhUZXh0dXJlPSR9aWYoUC5kZXB0aFRleHR1cmUmJiFDLl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIpe2lmKE8pdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cyIpO0x0KEMuX193ZWJnbEZyYW1lYnVmZmVyLFApfWVsc2UgaWYoTyl7Qy5fX3dlYmdsRGVwdGhidWZmZXI9W107Zm9yKGxldCAkPTA7JDw2OyQrKylpZihlLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLEMuX193ZWJnbEZyYW1lYnVmZmVyWyRdKSxDLl9fd2ViZ2xEZXB0aGJ1ZmZlclskXT09PXZvaWQgMClDLl9fd2ViZ2xEZXB0aGJ1ZmZlclskXT1pLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHV0KEMuX193ZWJnbERlcHRoYnVmZmVyWyRdLFAsITEpO2Vsc2V7Y29uc3QgdHQ9UC5zdGVuY2lsQnVmZmVyP2kuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOmkuREVQVEhfQVRUQUNITUVOVCxKPUMuX193ZWJnbERlcHRoYnVmZmVyWyRdO2kuYmluZFJlbmRlcmJ1ZmZlcihpLlJFTkRFUkJVRkZFUixKKSxpLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGkuRlJBTUVCVUZGRVIsdHQsaS5SRU5ERVJCVUZGRVIsSil9fWVsc2UgaWYoZS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUixDLl9fd2ViZ2xGcmFtZWJ1ZmZlciksQy5fX3dlYmdsRGVwdGhidWZmZXI9PT12b2lkIDApQy5fX3dlYmdsRGVwdGhidWZmZXI9aS5jcmVhdGVSZW5kZXJidWZmZXIoKSx1dChDLl9fd2ViZ2xEZXB0aGJ1ZmZlcixQLCExKTtlbHNle2NvbnN0ICQ9UC5zdGVuY2lsQnVmZmVyP2kuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOmkuREVQVEhfQVRUQUNITUVOVCx0dD1DLl9fd2ViZ2xEZXB0aGJ1ZmZlcjtpLmJpbmRSZW5kZXJidWZmZXIoaS5SRU5ERVJCVUZGRVIsdHQpLGkuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5GUkFNRUJVRkZFUiwkLGkuUkVOREVSQlVGRkVSLHR0KX1lLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLG51bGwpfWZ1bmN0aW9uIEl0KFAsQyxPKXtjb25zdCAkPW4uZ2V0KFApO0MhPT12b2lkIDAmJkV0KCQuX193ZWJnbEZyYW1lYnVmZmVyLFAsUC50ZXh0dXJlLGkuQ09MT1JfQVRUQUNITUVOVDAsaS5URVhUVVJFXzJELDApLE8hPT12b2lkIDAmJk90KFApfWZ1bmN0aW9uIHRlKFApe2NvbnN0IEM9UC50ZXh0dXJlLE89bi5nZXQoUCksJD1uLmdldChDKTtQLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLEEpO2NvbnN0IHR0PVAudGV4dHVyZXMsSj1QLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PT09ITAsZHQ9dHQubGVuZ3RoPjE7aWYoZHR8fCgkLl9fd2ViZ2xUZXh0dXJlPT09dm9pZCAwJiYoJC5fX3dlYmdsVGV4dHVyZT1pLmNyZWF0ZVRleHR1cmUoKSksJC5fX3ZlcnNpb249Qy52ZXJzaW9uLG8ubWVtb3J5LnRleHR1cmVzKyspLEope08uX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgZnQ9MDtmdDw2O2Z0KyspaWYoQy5taXBtYXBzJiZDLm1pcG1hcHMubGVuZ3RoPjApe08uX193ZWJnbEZyYW1lYnVmZmVyW2Z0XT1bXTtmb3IobGV0IHl0PTA7eXQ8Qy5taXBtYXBzLmxlbmd0aDt5dCsrKU8uX193ZWJnbEZyYW1lYnVmZmVyW2Z0XVt5dF09aS5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2UgTy5fX3dlYmdsRnJhbWVidWZmZXJbZnRdPWkuY3JlYXRlRnJhbWVidWZmZXIoKX1lbHNle2lmKEMubWlwbWFwcyYmQy5taXBtYXBzLmxlbmd0aD4wKXtPLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1bXTtmb3IobGV0IGZ0PTA7ZnQ8Qy5taXBtYXBzLmxlbmd0aDtmdCsrKU8uX193ZWJnbEZyYW1lYnVmZmVyW2Z0XT1pLmNyZWF0ZUZyYW1lYnVmZmVyKCl9ZWxzZSBPLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1pLmNyZWF0ZUZyYW1lYnVmZmVyKCk7aWYoZHQpZm9yKGxldCBmdD0wLHl0PXR0Lmxlbmd0aDtmdDx5dDtmdCsrKXtjb25zdCBWdD1uLmdldCh0dFtmdF0pO1Z0Ll9fd2ViZ2xUZXh0dXJlPT09dm9pZCAwJiYoVnQuX193ZWJnbFRleHR1cmU9aS5jcmVhdGVUZXh0dXJlKCksby5tZW1vcnkudGV4dHVyZXMrKyl9aWYoUC5zYW1wbGVzPjAmJlN0KFApPT09ITEpe08uX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyPWkuY3JlYXRlRnJhbWVidWZmZXIoKSxPLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcj1bXSxlLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLE8uX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTtmb3IobGV0IGZ0PTA7ZnQ8dHQubGVuZ3RoO2Z0Kyspe2NvbnN0IHl0PXR0W2Z0XTtPLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltmdF09aS5jcmVhdGVSZW5kZXJidWZmZXIoKSxpLmJpbmRSZW5kZXJidWZmZXIoaS5SRU5ERVJCVUZGRVIsTy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbZnRdKTtjb25zdCBWdD1zLmNvbnZlcnQoeXQuZm9ybWF0LHl0LmNvbG9yU3BhY2UpLGF0PXMuY29udmVydCh5dC50eXBlKSxidD14KHl0LmludGVybmFsRm9ybWF0LFZ0LGF0LHl0LmNvbG9yU3BhY2UsUC5pc1hSUmVuZGVyVGFyZ2V0PT09ITApLER0PW90KFApO2kucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKGkuUkVOREVSQlVGRkVSLER0LGJ0LFAud2lkdGgsUC5oZWlnaHQpLGkuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwK2Z0LGkuUkVOREVSQlVGRkVSLE8uX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW2Z0XSl9aS5iaW5kUmVuZGVyYnVmZmVyKGkuUkVOREVSQlVGRkVSLG51bGwpLFAuZGVwdGhCdWZmZXImJihPLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1pLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHV0KE8uX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyLFAsITApKSxlLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLG51bGwpfX1pZihKKXtlLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV9DVUJFX01BUCwkLl9fd2ViZ2xUZXh0dXJlKSxQdChpLlRFWFRVUkVfQ1VCRV9NQVAsQyk7Zm9yKGxldCBmdD0wO2Z0PDY7ZnQrKylpZihDLm1pcG1hcHMmJkMubWlwbWFwcy5sZW5ndGg+MClmb3IobGV0IHl0PTA7eXQ8Qy5taXBtYXBzLmxlbmd0aDt5dCsrKUV0KE8uX193ZWJnbEZyYW1lYnVmZmVyW2Z0XVt5dF0sUCxDLGkuQ09MT1JfQVRUQUNITUVOVDAsaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grZnQseXQpO2Vsc2UgRXQoTy5fX3dlYmdsRnJhbWVidWZmZXJbZnRdLFAsQyxpLkNPTE9SX0FUVEFDSE1FTlQwLGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2Z0LDApO2coQykmJm0oaS5URVhUVVJFX0NVQkVfTUFQKSxlLnVuYmluZFRleHR1cmUoKX1lbHNlIGlmKGR0KXtmb3IobGV0IGZ0PTAseXQ9dHQubGVuZ3RoO2Z0PHl0O2Z0Kyspe2NvbnN0IFZ0PXR0W2Z0XSxhdD1uLmdldChWdCk7ZS5iaW5kVGV4dHVyZShpLlRFWFRVUkVfMkQsYXQuX193ZWJnbFRleHR1cmUpLFB0KGkuVEVYVFVSRV8yRCxWdCksRXQoTy5fX3dlYmdsRnJhbWVidWZmZXIsUCxWdCxpLkNPTE9SX0FUVEFDSE1FTlQwK2Z0LGkuVEVYVFVSRV8yRCwwKSxnKFZ0KSYmbShpLlRFWFRVUkVfMkQpfWUudW5iaW5kVGV4dHVyZSgpfWVsc2V7bGV0IGZ0PWkuVEVYVFVSRV8yRDtpZigoUC5pc1dlYkdMM0RSZW5kZXJUYXJnZXR8fFAuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0KSYmKGZ0PVAuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0P2kuVEVYVFVSRV8zRDppLlRFWFRVUkVfMkRfQVJSQVkpLGUuYmluZFRleHR1cmUoZnQsJC5fX3dlYmdsVGV4dHVyZSksUHQoZnQsQyksQy5taXBtYXBzJiZDLm1pcG1hcHMubGVuZ3RoPjApZm9yKGxldCB5dD0wO3l0PEMubWlwbWFwcy5sZW5ndGg7eXQrKylFdChPLl9fd2ViZ2xGcmFtZWJ1ZmZlclt5dF0sUCxDLGkuQ09MT1JfQVRUQUNITUVOVDAsZnQseXQpO2Vsc2UgRXQoTy5fX3dlYmdsRnJhbWVidWZmZXIsUCxDLGkuQ09MT1JfQVRUQUNITUVOVDAsZnQsMCk7ZyhDKSYmbShmdCksZS51bmJpbmRUZXh0dXJlKCl9UC5kZXB0aEJ1ZmZlciYmT3QoUCl9ZnVuY3Rpb24gbnQoUCl7Y29uc3QgQz1QLnRleHR1cmVzO2ZvcihsZXQgTz0wLCQ9Qy5sZW5ndGg7TzwkO08rKyl7Y29uc3QgdHQ9Q1tPXTtpZihnKHR0KSl7Y29uc3QgSj12KFApLGR0PW4uZ2V0KHR0KS5fX3dlYmdsVGV4dHVyZTtlLmJpbmRUZXh0dXJlKEosZHQpLG0oSiksZS51bmJpbmRUZXh0dXJlKCl9fX1jb25zdCBzdD1bXSxVPVtdO2Z1bmN0aW9uIEN0KFApe2lmKFAuc2FtcGxlcz4wKXtpZihTdChQKT09PSExKXtjb25zdCBDPVAudGV4dHVyZXMsTz1QLndpZHRoLCQ9UC5oZWlnaHQ7bGV0IHR0PWkuQ09MT1JfQlVGRkVSX0JJVDtjb25zdCBKPVAuc3RlbmNpbEJ1ZmZlcj9pLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDppLkRFUFRIX0FUVEFDSE1FTlQsZHQ9bi5nZXQoUCksZnQ9Qy5sZW5ndGg+MTtpZihmdClmb3IobGV0IHl0PTA7eXQ8Qy5sZW5ndGg7eXQrKyllLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLGR0Ll9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksaS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihpLkZSQU1FQlVGRkVSLGkuQ09MT1JfQVRUQUNITUVOVDAreXQsaS5SRU5ERVJCVUZGRVIsbnVsbCksZS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUixkdC5fX3dlYmdsRnJhbWVidWZmZXIpLGkuZnJhbWVidWZmZXJUZXh0dXJlMkQoaS5EUkFXX0ZSQU1FQlVGRkVSLGkuQ09MT1JfQVRUQUNITUVOVDAreXQsaS5URVhUVVJFXzJELG51bGwsMCk7ZS5iaW5kRnJhbWVidWZmZXIoaS5SRUFEX0ZSQU1FQlVGRkVSLGR0Ll9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksZS5iaW5kRnJhbWVidWZmZXIoaS5EUkFXX0ZSQU1FQlVGRkVSLGR0Ll9fd2ViZ2xGcmFtZWJ1ZmZlcik7Zm9yKGxldCB5dD0wO3l0PEMubGVuZ3RoO3l0Kyspe2lmKFAucmVzb2x2ZURlcHRoQnVmZmVyJiYoUC5kZXB0aEJ1ZmZlciYmKHR0fD1pLkRFUFRIX0JVRkZFUl9CSVQpLFAuc3RlbmNpbEJ1ZmZlciYmUC5yZXNvbHZlU3RlbmNpbEJ1ZmZlciYmKHR0fD1pLlNURU5DSUxfQlVGRkVSX0JJVCkpLGZ0KXtpLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGkuUkVBRF9GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwLGkuUkVOREVSQlVGRkVSLGR0Ll9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlclt5dF0pO2NvbnN0IFZ0PW4uZ2V0KENbeXRdKS5fX3dlYmdsVGV4dHVyZTtpLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGkuRFJBV19GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwLGkuVEVYVFVSRV8yRCxWdCwwKX1pLmJsaXRGcmFtZWJ1ZmZlcigwLDAsTywkLDAsMCxPLCQsdHQsaS5ORUFSRVNUKSxsPT09ITAmJihzdC5sZW5ndGg9MCxVLmxlbmd0aD0wLHN0LnB1c2goaS5DT0xPUl9BVFRBQ0hNRU5UMCt5dCksUC5kZXB0aEJ1ZmZlciYmUC5yZXNvbHZlRGVwdGhCdWZmZXI9PT0hMSYmKHN0LnB1c2goSiksVS5wdXNoKEopLGkuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKGkuRFJBV19GUkFNRUJVRkZFUixVKSksaS5pbnZhbGlkYXRlRnJhbWVidWZmZXIoaS5SRUFEX0ZSQU1FQlVGRkVSLHN0KSl9aWYoZS5iaW5kRnJhbWVidWZmZXIoaS5SRUFEX0ZSQU1FQlVGRkVSLG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGkuRFJBV19GUkFNRUJVRkZFUixudWxsKSxmdClmb3IobGV0IHl0PTA7eXQ8Qy5sZW5ndGg7eXQrKyl7ZS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUixkdC5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLGkuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwK3l0LGkuUkVOREVSQlVGRkVSLGR0Ll9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlclt5dF0pO2NvbnN0IFZ0PW4uZ2V0KENbeXRdKS5fX3dlYmdsVGV4dHVyZTtlLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLGR0Ll9fd2ViZ2xGcmFtZWJ1ZmZlciksaS5mcmFtZWJ1ZmZlclRleHR1cmUyRChpLkRSQVdfRlJBTUVCVUZGRVIsaS5DT0xPUl9BVFRBQ0hNRU5UMCt5dCxpLlRFWFRVUkVfMkQsVnQsMCl9ZS5iaW5kRnJhbWVidWZmZXIoaS5EUkFXX0ZSQU1FQlVGRkVSLGR0Ll9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcil9ZWxzZSBpZihQLmRlcHRoQnVmZmVyJiZQLnJlc29sdmVEZXB0aEJ1ZmZlcj09PSExJiZsKXtjb25zdCBDPVAuc3RlbmNpbEJ1ZmZlcj9pLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDppLkRFUFRIX0FUVEFDSE1FTlQ7aS5pbnZhbGlkYXRlRnJhbWVidWZmZXIoaS5EUkFXX0ZSQU1FQlVGRkVSLFtDXSl9fX1mdW5jdGlvbiBvdChQKXtyZXR1cm4gTWF0aC5taW4oci5tYXhTYW1wbGVzLFAuc2FtcGxlcyl9ZnVuY3Rpb24gU3QoUCl7Y29uc3QgQz1uLmdldChQKTtyZXR1cm4gUC5zYW1wbGVzPjAmJnQuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKT09PSEwJiZDLl9fdXNlUmVuZGVyVG9UZXh0dXJlIT09ITF9ZnVuY3Rpb24gVyhQKXtjb25zdCBDPW8ucmVuZGVyLmZyYW1lO3UuZ2V0KFApIT09QyYmKHUuc2V0KFAsQyksUC51cGRhdGUoKSl9ZnVuY3Rpb24gZXQoUCxDKXtjb25zdCBPPVAuY29sb3JTcGFjZSwkPVAuZm9ybWF0LHR0PVAudHlwZTtyZXR1cm4gUC5pc0NvbXByZXNzZWRUZXh0dXJlPT09ITB8fFAuaXNWaWRlb1RleHR1cmU9PT0hMHx8TyE9PWpyJiZPIT09R2kmJihyZS5nZXRUcmFuc2ZlcihPKT09PXBlPygkIT09YW58fHR0IT09QWkpJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IHNSR0IgZW5jb2RlZCB0ZXh0dXJlcyBoYXZlIHRvIHVzZSBSR0JBRm9ybWF0IGFuZCBVbnNpZ25lZEJ5dGVUeXBlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMVGV4dHVyZXM6IFVuc3VwcG9ydGVkIHRleHR1cmUgY29sb3Igc3BhY2U6IixPKSksQ31mdW5jdGlvbiBaKFApe3JldHVybiB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJlAgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50PyhjLndpZHRoPVAubmF0dXJhbFdpZHRofHxQLndpZHRoLGMuaGVpZ2h0PVAubmF0dXJhbEhlaWdodHx8UC5oZWlnaHQpOnR5cGVvZiBWaWRlb0ZyYW1lIT0idW5kZWZpbmVkIiYmUCBpbnN0YW5jZW9mIFZpZGVvRnJhbWU/KGMud2lkdGg9UC5kaXNwbGF5V2lkdGgsYy5oZWlnaHQ9UC5kaXNwbGF5SGVpZ2h0KTooYy53aWR0aD1QLndpZHRoLGMuaGVpZ2h0PVAuaGVpZ2h0KSxjfXRoaXMuYWxsb2NhdGVUZXh0dXJlVW5pdD1MLHRoaXMucmVzZXRUZXh0dXJlVW5pdHM9RCx0aGlzLnNldFRleHR1cmUyRD1GLHRoaXMuc2V0VGV4dHVyZTJEQXJyYXk9Qix0aGlzLnNldFRleHR1cmUzRD1HLHRoaXMuc2V0VGV4dHVyZUN1YmU9ayx0aGlzLnJlYmluZFRleHR1cmVzPUl0LHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9dGUsdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9bnQsdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1DdCx0aGlzLnNldHVwRGVwdGhSZW5kZXJidWZmZXI9T3QsdGhpcy5zZXR1cEZyYW1lQnVmZmVyVGV4dHVyZT1FdCx0aGlzLnVzZU11bHRpc2FtcGxlZFJUVD1TdH1mdW5jdGlvbiBpdihpLHQpe2Z1bmN0aW9uIGUobixyPUdpKXtsZXQgcztjb25zdCBvPXJlLmdldFRyYW5zZmVyKHIpO2lmKG49PT1BaSlyZXR1cm4gaS5VTlNJR05FRF9CWVRFO2lmKG49PT10YylyZXR1cm4gaS5VTlNJR05FRF9TSE9SVF80XzRfNF80O2lmKG49PT1lYylyZXR1cm4gaS5VTlNJR05FRF9TSE9SVF81XzVfNV8xO2lmKG49PT1vZClyZXR1cm4gaS5VTlNJR05FRF9JTlRfNV85XzlfOV9SRVY7aWYobj09PXJkKXJldHVybiBpLkJZVEU7aWYobj09PXNkKXJldHVybiBpLlNIT1JUO2lmKG49PT1acylyZXR1cm4gaS5VTlNJR05FRF9TSE9SVDtpZihuPT09UWwpcmV0dXJuIGkuSU5UO2lmKG49PT1WaSlyZXR1cm4gaS5VTlNJR05FRF9JTlQ7aWYobj09PXZuKXJldHVybiBpLkZMT0FUO2lmKG49PT1KcylyZXR1cm4gaS5IQUxGX0ZMT0FUO2lmKG49PT1hZClyZXR1cm4gaS5BTFBIQTtpZihuPT09bGQpcmV0dXJuIGkuUkdCO2lmKG49PT1hbilyZXR1cm4gaS5SR0JBO2lmKG49PT1jZClyZXR1cm4gaS5MVU1JTkFOQ0U7aWYobj09PXVkKXJldHVybiBpLkxVTUlOQU5DRV9BTFBIQTtpZihuPT09cXIpcmV0dXJuIGkuREVQVEhfQ09NUE9ORU5UO2lmKG49PT1ZcilyZXR1cm4gaS5ERVBUSF9TVEVOQ0lMO2lmKG49PT1uYylyZXR1cm4gaS5SRUQ7aWYobj09PWRhKXJldHVybiBpLlJFRF9JTlRFR0VSO2lmKG49PT1oZClyZXR1cm4gaS5SRztpZihuPT09aWMpcmV0dXJuIGkuUkdfSU5URUdFUjtpZihuPT09cmMpcmV0dXJuIGkuUkdCQV9JTlRFR0VSO2lmKG49PT1wYXx8bj09PW1hfHxuPT09Z2F8fG49PT15YSlpZihvPT09cGUpaWYocz10LmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNfc3JnYiIpLHMhPT1udWxsKXtpZihuPT09cGEpcmV0dXJuIHMuQ09NUFJFU1NFRF9TUkdCX1MzVENfRFhUMV9FWFQ7aWYobj09PW1hKXJldHVybiBzLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDFfRVhUO2lmKG49PT1nYSlyZXR1cm4gcy5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQzX0VYVDtpZihuPT09eWEpcmV0dXJuIHMuQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUNV9FWFR9ZWxzZSByZXR1cm4gbnVsbDtlbHNlIGlmKHM9dC5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIikscyE9PW51bGwpe2lmKG49PT1wYSlyZXR1cm4gcy5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKG49PT1tYSlyZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZihuPT09Z2EpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYobj09PXlhKXJldHVybiBzLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWVsc2UgcmV0dXJuIG51bGw7aWYobj09PXNjfHxuPT09b2N8fG49PT1hY3x8bj09PWxjKWlmKHM9dC5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpLHMhPT1udWxsKXtpZihuPT09c2MpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztpZihuPT09b2MpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztpZihuPT09YWMpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7aWYobj09PWxjKXJldHVybiBzLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HfWVsc2UgcmV0dXJuIG51bGw7aWYobj09PWNjfHxuPT09dWN8fG49PT1oYylpZihzPXQuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjIikscyE9PW51bGwpe2lmKG49PT1jY3x8bj09PXVjKXJldHVybiBvPT09cGU/cy5DT01QUkVTU0VEX1NSR0I4X0VUQzI6cy5DT01QUkVTU0VEX1JHQjhfRVRDMjtpZihuPT09aGMpcmV0dXJuIG89PT1wZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDOnMuQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQ31lbHNlIHJldHVybiBudWxsO2lmKG49PT1mY3x8bj09PWRjfHxuPT09cGN8fG49PT1tY3x8bj09PWdjfHxuPT09eWN8fG49PT1fY3x8bj09PXhjfHxuPT09dmN8fG49PT1TY3x8bj09PU1jfHxuPT09YmN8fG49PT13Y3x8bj09PUFjKWlmKHM9dC5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjIikscyE9PW51bGwpe2lmKG49PT1mYylyZXR1cm4gbz09PXBlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ180eDRfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfNHg0X0tIUjtpZihuPT09ZGMpcmV0dXJuIG89PT1wZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg0X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NF9LSFI7aWYobj09PXBjKXJldHVybiBvPT09cGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NV9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDVfS0hSO2lmKG49PT1tYylyZXR1cm4gbz09PXBlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDVfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfNng1X0tIUjtpZihuPT09Z2MpcmV0dXJuIG89PT1wZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNng2X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzZ4Nl9LSFI7aWYobj09PXljKXJldHVybiBvPT09cGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4NV9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDVfS0hSO2lmKG49PT1fYylyZXR1cm4gbz09PXBlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDZfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg2X0tIUjtpZihuPT09eGMpcmV0dXJuIG89PT1wZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg4X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4OF9LSFI7aWYobj09PXZjKXJldHVybiBvPT09cGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDVfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4NV9LSFI7aWYobj09PVNjKXJldHVybiBvPT09cGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDZfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4Nl9LSFI7aWYobj09PU1jKXJldHVybiBvPT09cGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDhfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4OF9LSFI7aWYobj09PWJjKXJldHVybiBvPT09cGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDEwX0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDEwX0tIUjtpZihuPT09d2MpcmV0dXJuIG89PT1wZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTBfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJ4MTBfS0hSO2lmKG49PT1BYylyZXR1cm4gbz09PXBlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMl9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMl9LSFJ9ZWxzZSByZXR1cm4gbnVsbDtpZihuPT09X2F8fG49PT1FY3x8bj09PVRjKWlmKHM9dC5nZXQoIkVYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2JwdGMiKSxzIT09bnVsbCl7aWYobj09PV9hKXJldHVybiBvPT09cGU/cy5DT01QUkVTU0VEX1NSR0JfQUxQSEFfQlBUQ19VTk9STV9FWFQ6cy5DT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STV9FWFQ7aWYobj09PUVjKXJldHVybiBzLkNPTVBSRVNTRURfUkdCX0JQVENfU0lHTkVEX0ZMT0FUX0VYVDtpZihuPT09VGMpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfQlBUQ19VTlNJR05FRF9GTE9BVF9FWFR9ZWxzZSByZXR1cm4gbnVsbDtpZihuPT09ZmR8fG49PT1DY3x8bj09PVJjfHxuPT09UGMpaWYocz10LmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YyIpLHMhPT1udWxsKXtpZihuPT09X2EpcmV0dXJuIHMuQ09NUFJFU1NFRF9SRURfUkdUQzFfRVhUO2lmKG49PT1DYylyZXR1cm4gcy5DT01QUkVTU0VEX1NJR05FRF9SRURfUkdUQzFfRVhUO2lmKG49PT1SYylyZXR1cm4gcy5DT01QUkVTU0VEX1JFRF9HUkVFTl9SR1RDMl9FWFQ7aWYobj09PVBjKXJldHVybiBzLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9FWFR9ZWxzZSByZXR1cm4gbnVsbDtyZXR1cm4gbj09PVhyP2kuVU5TSUdORURfSU5UXzI0Xzg6aVtuXSE9PXZvaWQgMD9pW25dOm51bGx9cmV0dXJue2NvbnZlcnQ6ZX19Y29uc3QgSEk9e3R5cGU6Im1vdmUifTtjbGFzcyBWcHtjb25zdHJ1Y3Rvcigpe3RoaXMuX3RhcmdldFJheT1udWxsLHRoaXMuX2dyaXA9bnVsbCx0aGlzLl9oYW5kPW51bGx9Z2V0SGFuZFNwYWNlKCl7cmV0dXJuIHRoaXMuX2hhbmQ9PT1udWxsJiYodGhpcy5faGFuZD1uZXcgU28sdGhpcy5faGFuZC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2hhbmQudmlzaWJsZT0hMSx0aGlzLl9oYW5kLmpvaW50cz17fSx0aGlzLl9oYW5kLmlucHV0U3RhdGU9e3BpbmNoaW5nOiExfSksdGhpcy5faGFuZH1nZXRUYXJnZXRSYXlTcGFjZSgpe3JldHVybiB0aGlzLl90YXJnZXRSYXk9PT1udWxsJiYodGhpcy5fdGFyZ2V0UmF5PW5ldyBTbyx0aGlzLl90YXJnZXRSYXkubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl90YXJnZXRSYXkudmlzaWJsZT0hMSx0aGlzLl90YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHk9ITEsdGhpcy5fdGFyZ2V0UmF5LmxpbmVhclZlbG9jaXR5PW5ldyBSLHRoaXMuX3RhcmdldFJheS5oYXNBbmd1bGFyVmVsb2NpdHk9ITEsdGhpcy5fdGFyZ2V0UmF5LmFuZ3VsYXJWZWxvY2l0eT1uZXcgUiksdGhpcy5fdGFyZ2V0UmF5fWdldEdyaXBTcGFjZSgpe3JldHVybiB0aGlzLl9ncmlwPT09bnVsbCYmKHRoaXMuX2dyaXA9bmV3IFNvLHRoaXMuX2dyaXAubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl9ncmlwLnZpc2libGU9ITEsdGhpcy5fZ3JpcC5oYXNMaW5lYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmxpbmVhclZlbG9jaXR5PW5ldyBSLHRoaXMuX2dyaXAuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuX2dyaXAuYW5ndWxhclZlbG9jaXR5PW5ldyBSKSx0aGlzLl9ncmlwfWRpc3BhdGNoRXZlbnQodCl7cmV0dXJuIHRoaXMuX3RhcmdldFJheSE9PW51bGwmJnRoaXMuX3RhcmdldFJheS5kaXNwYXRjaEV2ZW50KHQpLHRoaXMuX2dyaXAhPT1udWxsJiZ0aGlzLl9ncmlwLmRpc3BhdGNoRXZlbnQodCksdGhpcy5faGFuZCE9PW51bGwmJnRoaXMuX2hhbmQuZGlzcGF0Y2hFdmVudCh0KSx0aGlzfWNvbm5lY3QodCl7aWYodCYmdC5oYW5kKXtjb25zdCBlPXRoaXMuX2hhbmQ7aWYoZSlmb3IoY29uc3QgbiBvZiB0LmhhbmQudmFsdWVzKCkpdGhpcy5fZ2V0SGFuZEpvaW50KGUsbil9cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiY29ubmVjdGVkIixkYXRhOnR9KSx0aGlzfWRpc2Nvbm5lY3QodCl7cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzY29ubmVjdGVkIixkYXRhOnR9KSx0aGlzLl90YXJnZXRSYXkhPT1udWxsJiYodGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEpLHRoaXMuX2dyaXAhPT1udWxsJiYodGhpcy5fZ3JpcC52aXNpYmxlPSExKSx0aGlzLl9oYW5kIT09bnVsbCYmKHRoaXMuX2hhbmQudmlzaWJsZT0hMSksdGhpc311cGRhdGUodCxlLG4pe2xldCByPW51bGwscz1udWxsLG89bnVsbDtjb25zdCBhPXRoaXMuX3RhcmdldFJheSxsPXRoaXMuX2dyaXAsYz10aGlzLl9oYW5kO2lmKHQmJmUuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUhPT0idmlzaWJsZS1ibHVycmVkIil7aWYoYyYmdC5oYW5kKXtvPSEwO2Zvcihjb25zdCB5IG9mIHQuaGFuZC52YWx1ZXMoKSl7Y29uc3QgZz1lLmdldEpvaW50UG9zZSh5LG4pLG09dGhpcy5fZ2V0SGFuZEpvaW50KGMseSk7ZyE9PW51bGwmJihtLm1hdHJpeC5mcm9tQXJyYXkoZy50cmFuc2Zvcm0ubWF0cml4KSxtLm1hdHJpeC5kZWNvbXBvc2UobS5wb3NpdGlvbixtLnJvdGF0aW9uLG0uc2NhbGUpLG0ubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxtLmpvaW50UmFkaXVzPWcucmFkaXVzKSxtLnZpc2libGU9ZyE9PW51bGx9Y29uc3QgdT1jLmpvaW50c1siaW5kZXgtZmluZ2VyLXRpcCJdLGg9Yy5qb2ludHNbInRodW1iLXRpcCJdLGY9dS5wb3NpdGlvbi5kaXN0YW5jZVRvKGgucG9zaXRpb24pLGQ9LjAyLHA9LjAwNTtjLmlucHV0U3RhdGUucGluY2hpbmcmJmY+ZCtwPyhjLmlucHV0U3RhdGUucGluY2hpbmc9ITEsdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwaW5jaGVuZCIsaGFuZGVkbmVzczp0LmhhbmRlZG5lc3MsdGFyZ2V0OnRoaXN9KSk6IWMuaW5wdXRTdGF0ZS5waW5jaGluZyYmZjw9ZC1wJiYoYy5pbnB1dFN0YXRlLnBpbmNoaW5nPSEwLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicGluY2hzdGFydCIsaGFuZGVkbmVzczp0LmhhbmRlZG5lc3MsdGFyZ2V0OnRoaXN9KSl9ZWxzZSBsIT09bnVsbCYmdC5ncmlwU3BhY2UmJihzPWUuZ2V0UG9zZSh0LmdyaXBTcGFjZSxuKSxzIT09bnVsbCYmKGwubWF0cml4LmZyb21BcnJheShzLnRyYW5zZm9ybS5tYXRyaXgpLGwubWF0cml4LmRlY29tcG9zZShsLnBvc2l0aW9uLGwucm90YXRpb24sbC5zY2FsZSksbC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwLHMubGluZWFyVmVsb2NpdHk/KGwuaGFzTGluZWFyVmVsb2NpdHk9ITAsbC5saW5lYXJWZWxvY2l0eS5jb3B5KHMubGluZWFyVmVsb2NpdHkpKTpsLmhhc0xpbmVhclZlbG9jaXR5PSExLHMuYW5ndWxhclZlbG9jaXR5PyhsLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMCxsLmFuZ3VsYXJWZWxvY2l0eS5jb3B5KHMuYW5ndWxhclZlbG9jaXR5KSk6bC5oYXNBbmd1bGFyVmVsb2NpdHk9ITEpKTthIT09bnVsbCYmKHI9ZS5nZXRQb3NlKHQudGFyZ2V0UmF5U3BhY2Usbikscj09PW51bGwmJnMhPT1udWxsJiYocj1zKSxyIT09bnVsbCYmKGEubWF0cml4LmZyb21BcnJheShyLnRyYW5zZm9ybS5tYXRyaXgpLGEubWF0cml4LmRlY29tcG9zZShhLnBvc2l0aW9uLGEucm90YXRpb24sYS5zY2FsZSksYS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwLHIubGluZWFyVmVsb2NpdHk/KGEuaGFzTGluZWFyVmVsb2NpdHk9ITAsYS5saW5lYXJWZWxvY2l0eS5jb3B5KHIubGluZWFyVmVsb2NpdHkpKTphLmhhc0xpbmVhclZlbG9jaXR5PSExLHIuYW5ndWxhclZlbG9jaXR5PyhhLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMCxhLmFuZ3VsYXJWZWxvY2l0eS5jb3B5KHIuYW5ndWxhclZlbG9jaXR5KSk6YS5oYXNBbmd1bGFyVmVsb2NpdHk9ITEsdGhpcy5kaXNwYXRjaEV2ZW50KEhJKSkpfXJldHVybiBhIT09bnVsbCYmKGEudmlzaWJsZT1yIT09bnVsbCksbCE9PW51bGwmJihsLnZpc2libGU9cyE9PW51bGwpLGMhPT1udWxsJiYoYy52aXNpYmxlPW8hPT1udWxsKSx0aGlzfV9nZXRIYW5kSm9pbnQodCxlKXtpZih0LmpvaW50c1tlLmpvaW50TmFtZV09PT12b2lkIDApe2NvbnN0IG49bmV3IFNvO24ubWF0cml4QXV0b1VwZGF0ZT0hMSxuLnZpc2libGU9ITEsdC5qb2ludHNbZS5qb2ludE5hbWVdPW4sdC5hZGQobil9cmV0dXJuIHQuam9pbnRzW2Uuam9pbnROYW1lXX19Y29uc3QgV0k9YAp2b2lkIG1haW4oKSB7CgoJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7Cgp9YCwkST1gCnVuaWZvcm0gc2FtcGxlcjJEQXJyYXkgZGVwdGhDb2xvcjsKdW5pZm9ybSBmbG9hdCBkZXB0aFdpZHRoOwp1bmlmb3JtIGZsb2F0IGRlcHRoSGVpZ2h0OwoKdm9pZCBtYWluKCkgewoKCXZlYzIgY29vcmQgPSB2ZWMyKCBnbF9GcmFnQ29vcmQueCAvIGRlcHRoV2lkdGgsIGdsX0ZyYWdDb29yZC55IC8gZGVwdGhIZWlnaHQgKTsKCglpZiAoIGNvb3JkLnggPj0gMS4wICkgewoKCQlnbF9GcmFnRGVwdGggPSB0ZXh0dXJlKCBkZXB0aENvbG9yLCB2ZWMzKCBjb29yZC54IC0gMS4wLCBjb29yZC55LCAxICkgKS5yOwoKCX0gZWxzZSB7CgoJCWdsX0ZyYWdEZXB0aCA9IHRleHR1cmUoIGRlcHRoQ29sb3IsIHZlYzMoIGNvb3JkLngsIGNvb3JkLnksIDAgKSApLnI7CgoJfQoKfWA7Y2xhc3MgWEl7Y29uc3RydWN0b3IoKXt0aGlzLnRleHR1cmU9bnVsbCx0aGlzLm1lc2g9bnVsbCx0aGlzLmRlcHRoTmVhcj0wLHRoaXMuZGVwdGhGYXI9MH1pbml0KHQsZSxuKXtpZih0aGlzLnRleHR1cmU9PT1udWxsKXtjb25zdCByPW5ldyBUZSxzPXQucHJvcGVydGllcy5nZXQocik7cy5fX3dlYmdsVGV4dHVyZT1lLnRleHR1cmUsKGUuZGVwdGhOZWFyIT1uLmRlcHRoTmVhcnx8ZS5kZXB0aEZhciE9bi5kZXB0aEZhcikmJih0aGlzLmRlcHRoTmVhcj1lLmRlcHRoTmVhcix0aGlzLmRlcHRoRmFyPWUuZGVwdGhGYXIpLHRoaXMudGV4dHVyZT1yfX1nZXRNZXNoKHQpe2lmKHRoaXMudGV4dHVyZSE9PW51bGwmJnRoaXMubWVzaD09PW51bGwpe2NvbnN0IGU9dC5jYW1lcmFzWzBdLnZpZXdwb3J0LG49bmV3IHVpKHt2ZXJ0ZXhTaGFkZXI6V0ksZnJhZ21lbnRTaGFkZXI6JEksdW5pZm9ybXM6e2RlcHRoQ29sb3I6e3ZhbHVlOnRoaXMudGV4dHVyZX0sZGVwdGhXaWR0aDp7dmFsdWU6ZS56fSxkZXB0aEhlaWdodDp7dmFsdWU6ZS53fX19KTt0aGlzLm1lc2g9bmV3IFVlKG5ldyB1cygyMCwyMCksbil9cmV0dXJuIHRoaXMubWVzaH1yZXNldCgpe3RoaXMudGV4dHVyZT1udWxsLHRoaXMubWVzaD1udWxsfWdldERlcHRoVGV4dHVyZSgpe3JldHVybiB0aGlzLnRleHR1cmV9fWNsYXNzIHFJIGV4dGVuZHMgVGl7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpO2NvbnN0IG49dGhpcztsZXQgcj1udWxsLHM9MSxvPW51bGwsYT0ibG9jYWwtZmxvb3IiLGw9MSxjPW51bGwsdT1udWxsLGg9bnVsbCxmPW51bGwsZD1udWxsLHA9bnVsbDtjb25zdCB5PW5ldyBYSSxnPWUuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTtsZXQgbT1udWxsLHY9bnVsbDtjb25zdCB4PVtdLF89W10sTT1uZXcgWDtsZXQgYj1udWxsO2NvbnN0IEE9bmV3IFllO0Eudmlld3BvcnQ9bmV3IFF0O2NvbnN0IEU9bmV3IFllO0Uudmlld3BvcnQ9bmV3IFF0O2NvbnN0IHc9W0EsRV0sUz1uZXcgdXg7bGV0IFQ9bnVsbCxEPW51bGw7dGhpcy5jYW1lcmFBdXRvVXBkYXRlPSEwLHRoaXMuZW5hYmxlZD0hMSx0aGlzLmlzUHJlc2VudGluZz0hMSx0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oail7bGV0IHJ0PXhbal07cmV0dXJuIHJ0PT09dm9pZCAwJiYocnQ9bmV3IFZwLHhbal09cnQpLHJ0LmdldFRhcmdldFJheVNwYWNlKCl9LHRoaXMuZ2V0Q29udHJvbGxlckdyaXA9ZnVuY3Rpb24oail7bGV0IHJ0PXhbal07cmV0dXJuIHJ0PT09dm9pZCAwJiYocnQ9bmV3IFZwLHhbal09cnQpLHJ0LmdldEdyaXBTcGFjZSgpfSx0aGlzLmdldEhhbmQ9ZnVuY3Rpb24oail7bGV0IHJ0PXhbal07cmV0dXJuIHJ0PT09dm9pZCAwJiYocnQ9bmV3IFZwLHhbal09cnQpLHJ0LmdldEhhbmRTcGFjZSgpfTtmdW5jdGlvbiBMKGope2NvbnN0IHJ0PV8uaW5kZXhPZihqLmlucHV0U291cmNlKTtpZihydD09PS0xKXJldHVybjtjb25zdCBFdD14W3J0XTtFdCE9PXZvaWQgMCYmKEV0LnVwZGF0ZShqLmlucHV0U291cmNlLGouZnJhbWUsY3x8byksRXQuZGlzcGF0Y2hFdmVudCh7dHlwZTpqLnR5cGUsZGF0YTpqLmlucHV0U291cmNlfSkpfWZ1bmN0aW9uIE4oKXtyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdCIsTCksci5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsTCksci5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3RlbmQiLEwpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZSIsTCksci5yZW1vdmVFdmVudExpc3RlbmVyKCJzcXVlZXplc3RhcnQiLEwpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZWVuZCIsTCksci5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmQiLE4pLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXRzb3VyY2VzY2hhbmdlIixGKTtmb3IobGV0IGo9MDtqPHgubGVuZ3RoO2orKyl7Y29uc3QgcnQ9X1tqXTtydCE9PW51bGwmJihfW2pdPW51bGwseFtqXS5kaXNjb25uZWN0KHJ0KSl9VD1udWxsLEQ9bnVsbCx5LnJlc2V0KCksdC5zZXRSZW5kZXJUYXJnZXQobSksZD1udWxsLGY9bnVsbCxoPW51bGwscj1udWxsLHY9bnVsbCxYdC5zdG9wKCksbi5pc1ByZXNlbnRpbmc9ITEsdC5zZXRQaXhlbFJhdGlvKGIpLHQuc2V0U2l6ZShNLndpZHRoLE0uaGVpZ2h0LCExKSxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9dGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPWZ1bmN0aW9uKGope3M9aixuLmlzUHJlc2VudGluZz09PSEwJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSBmcmFtZWJ1ZmZlciBzY2FsZSB3aGlsZSBwcmVzZW50aW5nLiIpfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZT1mdW5jdGlvbihqKXthPWosbi5pc1ByZXNlbnRpbmc9PT0hMCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgcmVmZXJlbmNlIHNwYWNlIHR5cGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5nZXRSZWZlcmVuY2VTcGFjZT1mdW5jdGlvbigpe3JldHVybiBjfHxvfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlPWZ1bmN0aW9uKGope2M9an0sdGhpcy5nZXRCYXNlTGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZiE9PW51bGw/ZjpkfSx0aGlzLmdldEJpbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gaH0sdGhpcy5nZXRGcmFtZT1mdW5jdGlvbigpe3JldHVybiBwfSx0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gcn0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGope3JldHVybiAkcyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYocj1qLHIhPT1udWxsKXtpZihtPXQuZ2V0UmVuZGVyVGFyZ2V0KCksci5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLEwpLHIuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLEwpLHIuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixMKSxyLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemUiLEwpLHIuYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0IixMKSxyLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLEwpLHIuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIixOKSxyLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsRiksZy54ckNvbXBhdGlibGUhPT0hMCYmKHlpZWxkIGUubWFrZVhSQ29tcGF0aWJsZSgpKSxiPXQuZ2V0UGl4ZWxSYXRpbygpLHQuZ2V0U2l6ZShNKSxyLnJlbmRlclN0YXRlLmxheWVycz09PXZvaWQgMCl7Y29uc3QgcnQ9e2FudGlhbGlhczpnLmFudGlhbGlhcyxhbHBoYTohMCxkZXB0aDpnLmRlcHRoLHN0ZW5jaWw6Zy5zdGVuY2lsLGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6c307ZD1uZXcgWFJXZWJHTExheWVyKHIsZSxydCksci51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOmR9KSx0LnNldFBpeGVsUmF0aW8oMSksdC5zZXRTaXplKGQuZnJhbWVidWZmZXJXaWR0aCxkLmZyYW1lYnVmZmVySGVpZ2h0LCExKSx2PW5ldyBvaShkLmZyYW1lYnVmZmVyV2lkdGgsZC5mcmFtZWJ1ZmZlckhlaWdodCx7Zm9ybWF0OmFuLHR5cGU6QWksY29sb3JTcGFjZTp0Lm91dHB1dENvbG9yU3BhY2Usc3RlbmNpbEJ1ZmZlcjpnLnN0ZW5jaWx9KX1lbHNle2xldCBydD1udWxsLEV0PW51bGwsdXQ9bnVsbDtnLmRlcHRoJiYodXQ9Zy5zdGVuY2lsP2UuREVQVEgyNF9TVEVOQ0lMODplLkRFUFRIX0NPTVBPTkVOVDI0LHJ0PWcuc3RlbmNpbD9ZcjpxcixFdD1nLnN0ZW5jaWw/WHI6VmkpO2NvbnN0IEx0PXtjb2xvckZvcm1hdDplLlJHQkE4LGRlcHRoRm9ybWF0OnV0LHNjYWxlRmFjdG9yOnN9O2g9bmV3IFhSV2ViR0xCaW5kaW5nKHIsZSksZj1oLmNyZWF0ZVByb2plY3Rpb25MYXllcihMdCksci51cGRhdGVSZW5kZXJTdGF0ZSh7bGF5ZXJzOltmXX0pLHQuc2V0UGl4ZWxSYXRpbygxKSx0LnNldFNpemUoZi50ZXh0dXJlV2lkdGgsZi50ZXh0dXJlSGVpZ2h0LCExKSx2PW5ldyBvaShmLnRleHR1cmVXaWR0aCxmLnRleHR1cmVIZWlnaHQse2Zvcm1hdDphbix0eXBlOkFpLGRlcHRoVGV4dHVyZTpuZXcgS2QoZi50ZXh0dXJlV2lkdGgsZi50ZXh0dXJlSGVpZ2h0LEV0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHJ0KSxzdGVuY2lsQnVmZmVyOmcuc3RlbmNpbCxjb2xvclNwYWNlOnQub3V0cHV0Q29sb3JTcGFjZSxzYW1wbGVzOmcuYW50aWFsaWFzPzQ6MCxyZXNvbHZlRGVwdGhCdWZmZXI6Zi5pZ25vcmVEZXB0aFZhbHVlcz09PSExfSl9di5pc1hSUmVuZGVyVGFyZ2V0PSEwLHRoaXMuc2V0Rm92ZWF0aW9uKGwpLGM9bnVsbCxvPXlpZWxkIHIucmVxdWVzdFJlZmVyZW5jZVNwYWNlKGEpLFh0LnNldENvbnRleHQociksWHQuc3RhcnQoKSxuLmlzUHJlc2VudGluZz0hMCxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX19KX0sdGhpcy5nZXRFbnZpcm9ubWVudEJsZW5kTW9kZT1mdW5jdGlvbigpe2lmKHIhPT1udWxsKXJldHVybiByLmVudmlyb25tZW50QmxlbmRNb2RlfSx0aGlzLmdldERlcHRoVGV4dHVyZT1mdW5jdGlvbigpe3JldHVybiB5LmdldERlcHRoVGV4dHVyZSgpfTtmdW5jdGlvbiBGKGope2ZvcihsZXQgcnQ9MDtydDxqLnJlbW92ZWQubGVuZ3RoO3J0Kyspe2NvbnN0IEV0PWoucmVtb3ZlZFtydF0sdXQ9Xy5pbmRleE9mKEV0KTt1dD49MCYmKF9bdXRdPW51bGwseFt1dF0uZGlzY29ubmVjdChFdCkpfWZvcihsZXQgcnQ9MDtydDxqLmFkZGVkLmxlbmd0aDtydCsrKXtjb25zdCBFdD1qLmFkZGVkW3J0XTtsZXQgdXQ9Xy5pbmRleE9mKEV0KTtpZih1dD09PS0xKXtmb3IobGV0IE90PTA7T3Q8eC5sZW5ndGg7T3QrKylpZihPdD49Xy5sZW5ndGgpe18ucHVzaChFdCksdXQ9T3Q7YnJlYWt9ZWxzZSBpZihfW090XT09PW51bGwpe19bT3RdPUV0LHV0PU90O2JyZWFrfWlmKHV0PT09LTEpYnJlYWt9Y29uc3QgTHQ9eFt1dF07THQmJkx0LmNvbm5lY3QoRXQpfX1jb25zdCBCPW5ldyBSLEc9bmV3IFI7ZnVuY3Rpb24gayhqLHJ0LEV0KXtCLnNldEZyb21NYXRyaXhQb3NpdGlvbihydC5tYXRyaXhXb3JsZCksRy5zZXRGcm9tTWF0cml4UG9zaXRpb24oRXQubWF0cml4V29ybGQpO2NvbnN0IHV0PUIuZGlzdGFuY2VUbyhHKSxMdD1ydC5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLE90PUV0LnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsSXQ9THRbMTRdLyhMdFsxMF0tMSksdGU9THRbMTRdLyhMdFsxMF0rMSksbnQ9KEx0WzldKzEpL0x0WzVdLHN0PShMdFs5XS0xKS9MdFs1XSxVPShMdFs4XS0xKS9MdFswXSxDdD0oT3RbOF0rMSkvT3RbMF0sb3Q9SXQqVSxTdD1JdCpDdCxXPXV0LygtVStDdCksZXQ9VyotVTtpZihydC5tYXRyaXhXb3JsZC5kZWNvbXBvc2Uoai5wb3NpdGlvbixqLnF1YXRlcm5pb24sai5zY2FsZSksai50cmFuc2xhdGVYKGV0KSxqLnRyYW5zbGF0ZVooVyksai5tYXRyaXhXb3JsZC5jb21wb3NlKGoucG9zaXRpb24sai5xdWF0ZXJuaW9uLGouc2NhbGUpLGoubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoai5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksTHRbMTBdPT09LTEpai5wcm9qZWN0aW9uTWF0cml4LmNvcHkocnQucHJvamVjdGlvbk1hdHJpeCksai5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHJ0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtlbHNle2NvbnN0IFo9SXQrVyxQPXRlK1csQz1vdC1ldCxPPVN0Kyh1dC1ldCksJD1udCp0ZS9QKlosdHQ9c3QqdGUvUCpaO2oucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoQyxPLCQsdHQsWixQKSxqLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoai5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX19ZnVuY3Rpb24gUShqLHJ0KXtydD09PW51bGw/ai5tYXRyaXhXb3JsZC5jb3B5KGoubWF0cml4KTpqLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMocnQubWF0cml4V29ybGQsai5tYXRyaXgpLGoubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoai5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dGhpcy51cGRhdGVDYW1lcmE9ZnVuY3Rpb24oail7aWYocj09PW51bGwpcmV0dXJuO2xldCBydD1qLm5lYXIsRXQ9ai5mYXI7eS50ZXh0dXJlIT09bnVsbCYmKHkuZGVwdGhOZWFyPjAmJihydD15LmRlcHRoTmVhcikseS5kZXB0aEZhcj4wJiYoRXQ9eS5kZXB0aEZhcikpLFMubmVhcj1FLm5lYXI9QS5uZWFyPXJ0LFMuZmFyPUUuZmFyPUEuZmFyPUV0LChUIT09Uy5uZWFyfHxEIT09Uy5mYXIpJiYoci51cGRhdGVSZW5kZXJTdGF0ZSh7ZGVwdGhOZWFyOlMubmVhcixkZXB0aEZhcjpTLmZhcn0pLFQ9Uy5uZWFyLEQ9Uy5mYXIpLEEubGF5ZXJzLm1hc2s9ai5sYXllcnMubWFza3wyLEUubGF5ZXJzLm1hc2s9ai5sYXllcnMubWFza3w0LFMubGF5ZXJzLm1hc2s9QS5sYXllcnMubWFza3xFLmxheWVycy5tYXNrO2NvbnN0IHV0PWoucGFyZW50LEx0PVMuY2FtZXJhcztRKFMsdXQpO2ZvcihsZXQgT3Q9MDtPdDxMdC5sZW5ndGg7T3QrKylRKEx0W090XSx1dCk7THQubGVuZ3RoPT09Mj9rKFMsQSxFKTpTLnByb2plY3Rpb25NYXRyaXguY29weShBLnByb2plY3Rpb25NYXRyaXgpLGN0KGosUyx1dCl9O2Z1bmN0aW9uIGN0KGoscnQsRXQpe0V0PT09bnVsbD9qLm1hdHJpeC5jb3B5KHJ0Lm1hdHJpeFdvcmxkKTooai5tYXRyaXguY29weShFdC5tYXRyaXhXb3JsZCksai5tYXRyaXguaW52ZXJ0KCksai5tYXRyaXgubXVsdGlwbHkocnQubWF0cml4V29ybGQpKSxqLm1hdHJpeC5kZWNvbXBvc2Uoai5wb3NpdGlvbixqLnF1YXRlcm5pb24sai5zY2FsZSksai51cGRhdGVNYXRyaXhXb3JsZCghMCksai5wcm9qZWN0aW9uTWF0cml4LmNvcHkocnQucHJvamVjdGlvbk1hdHJpeCksai5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHJ0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSxqLmlzUGVyc3BlY3RpdmVDYW1lcmEmJihqLmZvdj1qcyoyKk1hdGguYXRhbigxL2oucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1s1XSksai56b29tPTEpfXRoaXMuZ2V0Q2FtZXJhPWZ1bmN0aW9uKCl7cmV0dXJuIFN9LHRoaXMuZ2V0Rm92ZWF0aW9uPWZ1bmN0aW9uKCl7aWYoIShmPT09bnVsbCYmZD09PW51bGwpKXJldHVybiBsfSx0aGlzLnNldEZvdmVhdGlvbj1mdW5jdGlvbihqKXtsPWosZiE9PW51bGwmJihmLmZpeGVkRm92ZWF0aW9uPWopLGQhPT1udWxsJiZkLmZpeGVkRm92ZWF0aW9uIT09dm9pZCAwJiYoZC5maXhlZEZvdmVhdGlvbj1qKX0sdGhpcy5oYXNEZXB0aFNlbnNpbmc9ZnVuY3Rpb24oKXtyZXR1cm4geS50ZXh0dXJlIT09bnVsbH0sdGhpcy5nZXREZXB0aFNlbnNpbmdNZXNoPWZ1bmN0aW9uKCl7cmV0dXJuIHkuZ2V0TWVzaChTKX07bGV0IGh0PW51bGw7ZnVuY3Rpb24gUHQoaixydCl7aWYodT1ydC5nZXRWaWV3ZXJQb3NlKGN8fG8pLHA9cnQsdSE9PW51bGwpe2NvbnN0IEV0PXUudmlld3M7ZCE9PW51bGwmJih0LnNldFJlbmRlclRhcmdldEZyYW1lYnVmZmVyKHYsZC5mcmFtZWJ1ZmZlciksdC5zZXRSZW5kZXJUYXJnZXQodikpO2xldCB1dD0hMTtFdC5sZW5ndGghPT1TLmNhbWVyYXMubGVuZ3RoJiYoUy5jYW1lcmFzLmxlbmd0aD0wLHV0PSEwKTtmb3IobGV0IE90PTA7T3Q8RXQubGVuZ3RoO090Kyspe2NvbnN0IEl0PUV0W090XTtsZXQgdGU9bnVsbDtpZihkIT09bnVsbCl0ZT1kLmdldFZpZXdwb3J0KEl0KTtlbHNle2NvbnN0IHN0PWguZ2V0Vmlld1N1YkltYWdlKGYsSXQpO3RlPXN0LnZpZXdwb3J0LE90PT09MCYmKHQuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXModixzdC5jb2xvclRleHR1cmUsZi5pZ25vcmVEZXB0aFZhbHVlcz92b2lkIDA6c3QuZGVwdGhTdGVuY2lsVGV4dHVyZSksdC5zZXRSZW5kZXJUYXJnZXQodikpfWxldCBudD13W090XTtudD09PXZvaWQgMCYmKG50PW5ldyBZZSxudC5sYXllcnMuZW5hYmxlKE90KSxudC52aWV3cG9ydD1uZXcgUXQsd1tPdF09bnQpLG50Lm1hdHJpeC5mcm9tQXJyYXkoSXQudHJhbnNmb3JtLm1hdHJpeCksbnQubWF0cml4LmRlY29tcG9zZShudC5wb3NpdGlvbixudC5xdWF0ZXJuaW9uLG50LnNjYWxlKSxudC5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheShJdC5wcm9qZWN0aW9uTWF0cml4KSxudC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KG50LnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpLG50LnZpZXdwb3J0LnNldCh0ZS54LHRlLnksdGUud2lkdGgsdGUuaGVpZ2h0KSxPdD09PTAmJihTLm1hdHJpeC5jb3B5KG50Lm1hdHJpeCksUy5tYXRyaXguZGVjb21wb3NlKFMucG9zaXRpb24sUy5xdWF0ZXJuaW9uLFMuc2NhbGUpKSx1dD09PSEwJiZTLmNhbWVyYXMucHVzaChudCl9Y29uc3QgTHQ9ci5lbmFibGVkRmVhdHVyZXM7aWYoTHQmJkx0LmluY2x1ZGVzKCJkZXB0aC1zZW5zaW5nIikpe2NvbnN0IE90PWguZ2V0RGVwdGhJbmZvcm1hdGlvbihFdFswXSk7T3QmJk90LmlzVmFsaWQmJk90LnRleHR1cmUmJnkuaW5pdCh0LE90LHIucmVuZGVyU3RhdGUpfX1mb3IobGV0IEV0PTA7RXQ8eC5sZW5ndGg7RXQrKyl7Y29uc3QgdXQ9X1tFdF0sTHQ9eFtFdF07dXQhPT1udWxsJiZMdCE9PXZvaWQgMCYmTHQudXBkYXRlKHV0LHJ0LGN8fG8pfWh0JiZodChqLHJ0KSxydC5kZXRlY3RlZFBsYW5lcyYmbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwbGFuZXNkZXRlY3RlZCIsZGF0YTpydH0pLHA9bnVsbH1jb25zdCBYdD1uZXcgUng7WHQuc2V0QW5pbWF0aW9uTG9vcChQdCksdGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKGope2h0PWp9LHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe319fWNvbnN0IE1zPW5ldyBCbixZST1uZXcgUnQ7ZnVuY3Rpb24gWkkoaSx0KXtmdW5jdGlvbiBlKGcsbSl7Zy5tYXRyaXhBdXRvVXBkYXRlPT09ITAmJmcudXBkYXRlTWF0cml4KCksbS52YWx1ZS5jb3B5KGcubWF0cml4KX1mdW5jdGlvbiBuKGcsbSl7bS5jb2xvci5nZXRSR0IoZy5mb2dDb2xvci52YWx1ZSxGeShpKSksbS5pc0ZvZz8oZy5mb2dOZWFyLnZhbHVlPW0ubmVhcixnLmZvZ0Zhci52YWx1ZT1tLmZhcik6bS5pc0ZvZ0V4cDImJihnLmZvZ0RlbnNpdHkudmFsdWU9bS5kZW5zaXR5KX1mdW5jdGlvbiByKGcsbSx2LHgsXyl7bS5pc01lc2hCYXNpY01hdGVyaWFsfHxtLmlzTWVzaExhbWJlcnRNYXRlcmlhbD9zKGcsbSk6bS5pc01lc2hUb29uTWF0ZXJpYWw/KHMoZyxtKSxoKGcsbSkpOm0uaXNNZXNoUGhvbmdNYXRlcmlhbD8ocyhnLG0pLHUoZyxtKSk6bS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPyhzKGcsbSksZihnLG0pLG0uaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCYmZChnLG0sXykpOm0uaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KHMoZyxtKSxwKGcsbSkpOm0uaXNNZXNoRGVwdGhNYXRlcmlhbD9zKGcsbSk6bS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhzKGcsbSkseShnLG0pKTptLmlzTWVzaE5vcm1hbE1hdGVyaWFsP3MoZyxtKTptLmlzTGluZUJhc2ljTWF0ZXJpYWw/KG8oZyxtKSxtLmlzTGluZURhc2hlZE1hdGVyaWFsJiZhKGcsbSkpOm0uaXNQb2ludHNNYXRlcmlhbD9sKGcsbSx2LHgpOm0uaXNTcHJpdGVNYXRlcmlhbD9jKGcsbSk6bS5pc1NoYWRvd01hdGVyaWFsPyhnLmNvbG9yLnZhbHVlLmNvcHkobS5jb2xvciksZy5vcGFjaXR5LnZhbHVlPW0ub3BhY2l0eSk6bS5pc1NoYWRlck1hdGVyaWFsJiYobS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpfWZ1bmN0aW9uIHMoZyxtKXtnLm9wYWNpdHkudmFsdWU9bS5vcGFjaXR5LG0uY29sb3ImJmcuZGlmZnVzZS52YWx1ZS5jb3B5KG0uY29sb3IpLG0uZW1pc3NpdmUmJmcuZW1pc3NpdmUudmFsdWUuY29weShtLmVtaXNzaXZlKS5tdWx0aXBseVNjYWxhcihtLmVtaXNzaXZlSW50ZW5zaXR5KSxtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLGUobS5tYXAsZy5tYXBUcmFuc2Zvcm0pKSxtLmFscGhhTWFwJiYoZy5hbHBoYU1hcC52YWx1ZT1tLmFscGhhTWFwLGUobS5hbHBoYU1hcCxnLmFscGhhTWFwVHJhbnNmb3JtKSksbS5idW1wTWFwJiYoZy5idW1wTWFwLnZhbHVlPW0uYnVtcE1hcCxlKG0uYnVtcE1hcCxnLmJ1bXBNYXBUcmFuc2Zvcm0pLGcuYnVtcFNjYWxlLnZhbHVlPW0uYnVtcFNjYWxlLG0uc2lkZT09PUplJiYoZy5idW1wU2NhbGUudmFsdWUqPS0xKSksbS5ub3JtYWxNYXAmJihnLm5vcm1hbE1hcC52YWx1ZT1tLm5vcm1hbE1hcCxlKG0ubm9ybWFsTWFwLGcubm9ybWFsTWFwVHJhbnNmb3JtKSxnLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobS5ub3JtYWxTY2FsZSksbS5zaWRlPT09SmUmJmcubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLG0uZGlzcGxhY2VtZW50TWFwJiYoZy5kaXNwbGFjZW1lbnRNYXAudmFsdWU9bS5kaXNwbGFjZW1lbnRNYXAsZShtLmRpc3BsYWNlbWVudE1hcCxnLmRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybSksZy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1tLmRpc3BsYWNlbWVudFNjYWxlLGcuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1tLmRpc3BsYWNlbWVudEJpYXMpLG0uZW1pc3NpdmVNYXAmJihnLmVtaXNzaXZlTWFwLnZhbHVlPW0uZW1pc3NpdmVNYXAsZShtLmVtaXNzaXZlTWFwLGcuZW1pc3NpdmVNYXBUcmFuc2Zvcm0pKSxtLnNwZWN1bGFyTWFwJiYoZy5zcGVjdWxhck1hcC52YWx1ZT1tLnNwZWN1bGFyTWFwLGUobS5zcGVjdWxhck1hcCxnLnNwZWN1bGFyTWFwVHJhbnNmb3JtKSksbS5hbHBoYVRlc3Q+MCYmKGcuYWxwaGFUZXN0LnZhbHVlPW0uYWxwaGFUZXN0KTtjb25zdCB2PXQuZ2V0KG0pLHg9di5lbnZNYXAsXz12LmVudk1hcFJvdGF0aW9uO3gmJihnLmVudk1hcC52YWx1ZT14LE1zLmNvcHkoXyksTXMueCo9LTEsTXMueSo9LTEsTXMueio9LTEseC5pc0N1YmVUZXh0dXJlJiZ4LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExJiYoTXMueSo9LTEsTXMueio9LTEpLGcuZW52TWFwUm90YXRpb24udmFsdWUuc2V0RnJvbU1hdHJpeDQoWUkubWFrZVJvdGF0aW9uRnJvbUV1bGVyKE1zKSksZy5mbGlwRW52TWFwLnZhbHVlPXguaXNDdWJlVGV4dHVyZSYmeC5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMT8tMToxLGcucmVmbGVjdGl2aXR5LnZhbHVlPW0ucmVmbGVjdGl2aXR5LGcuaW9yLnZhbHVlPW0uaW9yLGcucmVmcmFjdGlvblJhdGlvLnZhbHVlPW0ucmVmcmFjdGlvblJhdGlvKSxtLmxpZ2h0TWFwJiYoZy5saWdodE1hcC52YWx1ZT1tLmxpZ2h0TWFwLGcubGlnaHRNYXBJbnRlbnNpdHkudmFsdWU9bS5saWdodE1hcEludGVuc2l0eSxlKG0ubGlnaHRNYXAsZy5saWdodE1hcFRyYW5zZm9ybSkpLG0uYW9NYXAmJihnLmFvTWFwLnZhbHVlPW0uYW9NYXAsZy5hb01hcEludGVuc2l0eS52YWx1ZT1tLmFvTWFwSW50ZW5zaXR5LGUobS5hb01hcCxnLmFvTWFwVHJhbnNmb3JtKSl9ZnVuY3Rpb24gbyhnLG0pe2cuZGlmZnVzZS52YWx1ZS5jb3B5KG0uY29sb3IpLGcub3BhY2l0eS52YWx1ZT1tLm9wYWNpdHksbS5tYXAmJihnLm1hcC52YWx1ZT1tLm1hcCxlKG0ubWFwLGcubWFwVHJhbnNmb3JtKSl9ZnVuY3Rpb24gYShnLG0pe2cuZGFzaFNpemUudmFsdWU9bS5kYXNoU2l6ZSxnLnRvdGFsU2l6ZS52YWx1ZT1tLmRhc2hTaXplK20uZ2FwU2l6ZSxnLnNjYWxlLnZhbHVlPW0uc2NhbGV9ZnVuY3Rpb24gbChnLG0sdix4KXtnLmRpZmZ1c2UudmFsdWUuY29weShtLmNvbG9yKSxnLm9wYWNpdHkudmFsdWU9bS5vcGFjaXR5LGcuc2l6ZS52YWx1ZT1tLnNpemUqdixnLnNjYWxlLnZhbHVlPXgqLjUsbS5tYXAmJihnLm1hcC52YWx1ZT1tLm1hcCxlKG0ubWFwLGcudXZUcmFuc2Zvcm0pKSxtLmFscGhhTWFwJiYoZy5hbHBoYU1hcC52YWx1ZT1tLmFscGhhTWFwLGUobS5hbHBoYU1hcCxnLmFscGhhTWFwVHJhbnNmb3JtKSksbS5hbHBoYVRlc3Q+MCYmKGcuYWxwaGFUZXN0LnZhbHVlPW0uYWxwaGFUZXN0KX1mdW5jdGlvbiBjKGcsbSl7Zy5kaWZmdXNlLnZhbHVlLmNvcHkobS5jb2xvciksZy5vcGFjaXR5LnZhbHVlPW0ub3BhY2l0eSxnLnJvdGF0aW9uLnZhbHVlPW0ucm90YXRpb24sbS5tYXAmJihnLm1hcC52YWx1ZT1tLm1hcCxlKG0ubWFwLGcubWFwVHJhbnNmb3JtKSksbS5hbHBoYU1hcCYmKGcuYWxwaGFNYXAudmFsdWU9bS5hbHBoYU1hcCxlKG0uYWxwaGFNYXAsZy5hbHBoYU1hcFRyYW5zZm9ybSkpLG0uYWxwaGFUZXN0PjAmJihnLmFscGhhVGVzdC52YWx1ZT1tLmFscGhhVGVzdCl9ZnVuY3Rpb24gdShnLG0pe2cuc3BlY3VsYXIudmFsdWUuY29weShtLnNwZWN1bGFyKSxnLnNoaW5pbmVzcy52YWx1ZT1NYXRoLm1heChtLnNoaW5pbmVzcywxZS00KX1mdW5jdGlvbiBoKGcsbSl7bS5ncmFkaWVudE1hcCYmKGcuZ3JhZGllbnRNYXAudmFsdWU9bS5ncmFkaWVudE1hcCl9ZnVuY3Rpb24gZihnLG0pe2cubWV0YWxuZXNzLnZhbHVlPW0ubWV0YWxuZXNzLG0ubWV0YWxuZXNzTWFwJiYoZy5tZXRhbG5lc3NNYXAudmFsdWU9bS5tZXRhbG5lc3NNYXAsZShtLm1ldGFsbmVzc01hcCxnLm1ldGFsbmVzc01hcFRyYW5zZm9ybSkpLGcucm91Z2huZXNzLnZhbHVlPW0ucm91Z2huZXNzLG0ucm91Z2huZXNzTWFwJiYoZy5yb3VnaG5lc3NNYXAudmFsdWU9bS5yb3VnaG5lc3NNYXAsZShtLnJvdWdobmVzc01hcCxnLnJvdWdobmVzc01hcFRyYW5zZm9ybSkpLG0uZW52TWFwJiYoZy5lbnZNYXBJbnRlbnNpdHkudmFsdWU9bS5lbnZNYXBJbnRlbnNpdHkpfWZ1bmN0aW9uIGQoZyxtLHYpe2cuaW9yLnZhbHVlPW0uaW9yLG0uc2hlZW4+MCYmKGcuc2hlZW5Db2xvci52YWx1ZS5jb3B5KG0uc2hlZW5Db2xvcikubXVsdGlwbHlTY2FsYXIobS5zaGVlbiksZy5zaGVlblJvdWdobmVzcy52YWx1ZT1tLnNoZWVuUm91Z2huZXNzLG0uc2hlZW5Db2xvck1hcCYmKGcuc2hlZW5Db2xvck1hcC52YWx1ZT1tLnNoZWVuQ29sb3JNYXAsZShtLnNoZWVuQ29sb3JNYXAsZy5zaGVlbkNvbG9yTWFwVHJhbnNmb3JtKSksbS5zaGVlblJvdWdobmVzc01hcCYmKGcuc2hlZW5Sb3VnaG5lc3NNYXAudmFsdWU9bS5zaGVlblJvdWdobmVzc01hcCxlKG0uc2hlZW5Sb3VnaG5lc3NNYXAsZy5zaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybSkpKSxtLmNsZWFyY29hdD4wJiYoZy5jbGVhcmNvYXQudmFsdWU9bS5jbGVhcmNvYXQsZy5jbGVhcmNvYXRSb3VnaG5lc3MudmFsdWU9bS5jbGVhcmNvYXRSb3VnaG5lc3MsbS5jbGVhcmNvYXRNYXAmJihnLmNsZWFyY29hdE1hcC52YWx1ZT1tLmNsZWFyY29hdE1hcCxlKG0uY2xlYXJjb2F0TWFwLGcuY2xlYXJjb2F0TWFwVHJhbnNmb3JtKSksbS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJihnLmNsZWFyY29hdFJvdWdobmVzc01hcC52YWx1ZT1tLmNsZWFyY29hdFJvdWdobmVzc01hcCxlKG0uY2xlYXJjb2F0Um91Z2huZXNzTWFwLGcuY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtKSksbS5jbGVhcmNvYXROb3JtYWxNYXAmJihnLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1tLmNsZWFyY29hdE5vcm1hbE1hcCxlKG0uY2xlYXJjb2F0Tm9ybWFsTWFwLGcuY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtKSxnLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobS5jbGVhcmNvYXROb3JtYWxTY2FsZSksbS5zaWRlPT09SmUmJmcuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpKSxtLmRpc3BlcnNpb24+MCYmKGcuZGlzcGVyc2lvbi52YWx1ZT1tLmRpc3BlcnNpb24pLG0uaXJpZGVzY2VuY2U+MCYmKGcuaXJpZGVzY2VuY2UudmFsdWU9bS5pcmlkZXNjZW5jZSxnLmlyaWRlc2NlbmNlSU9SLnZhbHVlPW0uaXJpZGVzY2VuY2VJT1IsZy5pcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0udmFsdWU9bS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlWzBdLGcuaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtLnZhbHVlPW0uaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZVsxXSxtLmlyaWRlc2NlbmNlTWFwJiYoZy5pcmlkZXNjZW5jZU1hcC52YWx1ZT1tLmlyaWRlc2NlbmNlTWFwLGUobS5pcmlkZXNjZW5jZU1hcCxnLmlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtKSksbS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCYmKGcuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudmFsdWU9bS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCxlKG0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsZy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybSkpKSxtLnRyYW5zbWlzc2lvbj4wJiYoZy50cmFuc21pc3Npb24udmFsdWU9bS50cmFuc21pc3Npb24sZy50cmFuc21pc3Npb25TYW1wbGVyTWFwLnZhbHVlPXYudGV4dHVyZSxnLnRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnZhbHVlLnNldCh2LndpZHRoLHYuaGVpZ2h0KSxtLnRyYW5zbWlzc2lvbk1hcCYmKGcudHJhbnNtaXNzaW9uTWFwLnZhbHVlPW0udHJhbnNtaXNzaW9uTWFwLGUobS50cmFuc21pc3Npb25NYXAsZy50cmFuc21pc3Npb25NYXBUcmFuc2Zvcm0pKSxnLnRoaWNrbmVzcy52YWx1ZT1tLnRoaWNrbmVzcyxtLnRoaWNrbmVzc01hcCYmKGcudGhpY2tuZXNzTWFwLnZhbHVlPW0udGhpY2tuZXNzTWFwLGUobS50aGlja25lc3NNYXAsZy50aGlja25lc3NNYXBUcmFuc2Zvcm0pKSxnLmF0dGVudWF0aW9uRGlzdGFuY2UudmFsdWU9bS5hdHRlbnVhdGlvbkRpc3RhbmNlLGcuYXR0ZW51YXRpb25Db2xvci52YWx1ZS5jb3B5KG0uYXR0ZW51YXRpb25Db2xvcikpLG0uYW5pc290cm9weT4wJiYoZy5hbmlzb3Ryb3B5VmVjdG9yLnZhbHVlLnNldChtLmFuaXNvdHJvcHkqTWF0aC5jb3MobS5hbmlzb3Ryb3B5Um90YXRpb24pLG0uYW5pc290cm9weSpNYXRoLnNpbihtLmFuaXNvdHJvcHlSb3RhdGlvbikpLG0uYW5pc290cm9weU1hcCYmKGcuYW5pc290cm9weU1hcC52YWx1ZT1tLmFuaXNvdHJvcHlNYXAsZShtLmFuaXNvdHJvcHlNYXAsZy5hbmlzb3Ryb3B5TWFwVHJhbnNmb3JtKSkpLGcuc3BlY3VsYXJJbnRlbnNpdHkudmFsdWU9bS5zcGVjdWxhckludGVuc2l0eSxnLnNwZWN1bGFyQ29sb3IudmFsdWUuY29weShtLnNwZWN1bGFyQ29sb3IpLG0uc3BlY3VsYXJDb2xvck1hcCYmKGcuc3BlY3VsYXJDb2xvck1hcC52YWx1ZT1tLnNwZWN1bGFyQ29sb3JNYXAsZShtLnNwZWN1bGFyQ29sb3JNYXAsZy5zcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtKSksbS5zcGVjdWxhckludGVuc2l0eU1hcCYmKGcuc3BlY3VsYXJJbnRlbnNpdHlNYXAudmFsdWU9bS5zcGVjdWxhckludGVuc2l0eU1hcCxlKG0uc3BlY3VsYXJJbnRlbnNpdHlNYXAsZy5zcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybSkpfWZ1bmN0aW9uIHAoZyxtKXttLm1hdGNhcCYmKGcubWF0Y2FwLnZhbHVlPW0ubWF0Y2FwKX1mdW5jdGlvbiB5KGcsbSl7Y29uc3Qgdj10LmdldChtKS5saWdodDtnLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxnLm5lYXJEaXN0YW5jZS52YWx1ZT12LnNoYWRvdy5jYW1lcmEubmVhcixnLmZhckRpc3RhbmNlLnZhbHVlPXYuc2hhZG93LmNhbWVyYS5mYXJ9cmV0dXJue3JlZnJlc2hGb2dVbmlmb3JtczpuLHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zOnJ9fWZ1bmN0aW9uIEpJKGksdCxlLG4pe2xldCByPXt9LHM9e30sbz1bXTtjb25zdCBhPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTKTtmdW5jdGlvbiBsKHYseCl7Y29uc3QgXz14LnByb2dyYW07bi51bmlmb3JtQmxvY2tCaW5kaW5nKHYsXyl9ZnVuY3Rpb24gYyh2LHgpe2xldCBfPXJbdi5pZF07Xz09PXZvaWQgMCYmKHAodiksXz11KHYpLHJbdi5pZF09Xyx2LmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGcpKTtjb25zdCBNPXgucHJvZ3JhbTtuLnVwZGF0ZVVCT01hcHBpbmcodixNKTtjb25zdCBiPXQucmVuZGVyLmZyYW1lO3Nbdi5pZF0hPT1iJiYoZih2KSxzW3YuaWRdPWIpfWZ1bmN0aW9uIHUodil7Y29uc3QgeD1oKCk7di5fX2JpbmRpbmdQb2ludEluZGV4PXg7Y29uc3QgXz1pLmNyZWF0ZUJ1ZmZlcigpLE09di5fX3NpemUsYj12LnVzYWdlO3JldHVybiBpLmJpbmRCdWZmZXIoaS5VTklGT1JNX0JVRkZFUixfKSxpLmJ1ZmZlckRhdGEoaS5VTklGT1JNX0JVRkZFUixNLGIpLGkuYmluZEJ1ZmZlcihpLlVOSUZPUk1fQlVGRkVSLG51bGwpLGkuYmluZEJ1ZmZlckJhc2UoaS5VTklGT1JNX0JVRkZFUix4LF8pLF99ZnVuY3Rpb24gaCgpe2ZvcihsZXQgdj0wO3Y8YTt2KyspaWYoby5pbmRleE9mKHYpPT09LTEpcmV0dXJuIG8ucHVzaCh2KSx2O3JldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXNseSB1c2FibGUgdW5pZm9ybXMgZ3JvdXBzIHJlYWNoZWQuIiksMH1mdW5jdGlvbiBmKHYpe2NvbnN0IHg9clt2LmlkXSxfPXYudW5pZm9ybXMsTT12Ll9fY2FjaGU7aS5iaW5kQnVmZmVyKGkuVU5JRk9STV9CVUZGRVIseCk7Zm9yKGxldCBiPTAsQT1fLmxlbmd0aDtiPEE7YisrKXtjb25zdCBFPUFycmF5LmlzQXJyYXkoX1tiXSk/X1tiXTpbX1tiXV07Zm9yKGxldCB3PTAsUz1FLmxlbmd0aDt3PFM7dysrKXtjb25zdCBUPUVbd107aWYoZChULGIsdyxNKT09PSEwKXtjb25zdCBEPVQuX19vZmZzZXQsTD1BcnJheS5pc0FycmF5KFQudmFsdWUpP1QudmFsdWU6W1QudmFsdWVdO2xldCBOPTA7Zm9yKGxldCBGPTA7RjxMLmxlbmd0aDtGKyspe2NvbnN0IEI9TFtGXSxHPXkoQik7dHlwZW9mIEI9PSJudW1iZXIifHx0eXBlb2YgQj09ImJvb2xlYW4iPyhULl9fZGF0YVswXT1CLGkuYnVmZmVyU3ViRGF0YShpLlVOSUZPUk1fQlVGRkVSLEQrTixULl9fZGF0YSkpOkIuaXNNYXRyaXgzPyhULl9fZGF0YVswXT1CLmVsZW1lbnRzWzBdLFQuX19kYXRhWzFdPUIuZWxlbWVudHNbMV0sVC5fX2RhdGFbMl09Qi5lbGVtZW50c1syXSxULl9fZGF0YVszXT0wLFQuX19kYXRhWzRdPUIuZWxlbWVudHNbM10sVC5fX2RhdGFbNV09Qi5lbGVtZW50c1s0XSxULl9fZGF0YVs2XT1CLmVsZW1lbnRzWzVdLFQuX19kYXRhWzddPTAsVC5fX2RhdGFbOF09Qi5lbGVtZW50c1s2XSxULl9fZGF0YVs5XT1CLmVsZW1lbnRzWzddLFQuX19kYXRhWzEwXT1CLmVsZW1lbnRzWzhdLFQuX19kYXRhWzExXT0wKTooQi50b0FycmF5KFQuX19kYXRhLE4pLE4rPUcuc3RvcmFnZS9GbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpfWkuYnVmZmVyU3ViRGF0YShpLlVOSUZPUk1fQlVGRkVSLEQsVC5fX2RhdGEpfX19aS5iaW5kQnVmZmVyKGkuVU5JRk9STV9CVUZGRVIsbnVsbCl9ZnVuY3Rpb24gZCh2LHgsXyxNKXtjb25zdCBiPXYudmFsdWUsQT14KyJfIitfO2lmKE1bQV09PT12b2lkIDApcmV0dXJuIHR5cGVvZiBiPT0ibnVtYmVyInx8dHlwZW9mIGI9PSJib29sZWFuIj9NW0FdPWI6TVtBXT1iLmNsb25lKCksITA7e2NvbnN0IEU9TVtBXTtpZih0eXBlb2YgYj09Im51bWJlciJ8fHR5cGVvZiBiPT0iYm9vbGVhbiIpe2lmKEUhPT1iKXJldHVybiBNW0FdPWIsITB9ZWxzZSBpZihFLmVxdWFscyhiKT09PSExKXJldHVybiBFLmNvcHkoYiksITB9cmV0dXJuITF9ZnVuY3Rpb24gcCh2KXtjb25zdCB4PXYudW5pZm9ybXM7bGV0IF89MDtjb25zdCBNPTE2O2ZvcihsZXQgQT0wLEU9eC5sZW5ndGg7QTxFO0ErKyl7Y29uc3Qgdz1BcnJheS5pc0FycmF5KHhbQV0pP3hbQV06W3hbQV1dO2ZvcihsZXQgUz0wLFQ9dy5sZW5ndGg7UzxUO1MrKyl7Y29uc3QgRD13W1NdLEw9QXJyYXkuaXNBcnJheShELnZhbHVlKT9ELnZhbHVlOltELnZhbHVlXTtmb3IobGV0IE49MCxGPUwubGVuZ3RoO048RjtOKyspe2NvbnN0IEI9TFtOXSxHPXkoQiksaz1fJU0sUT1rJUcuYm91bmRhcnksY3Q9aytRO18rPVEsY3QhPT0wJiZNLWN0PEcuc3RvcmFnZSYmKF8rPU0tY3QpLEQuX19kYXRhPW5ldyBGbG9hdDMyQXJyYXkoRy5zdG9yYWdlL0Zsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCksRC5fX29mZnNldD1fLF8rPUcuc3RvcmFnZX19fWNvbnN0IGI9XyVNO3JldHVybiBiPjAmJihfKz1NLWIpLHYuX19zaXplPV8sdi5fX2NhY2hlPXt9LHRoaXN9ZnVuY3Rpb24geSh2KXtjb25zdCB4PXtib3VuZGFyeTowLHN0b3JhZ2U6MH07cmV0dXJuIHR5cGVvZiB2PT0ibnVtYmVyInx8dHlwZW9mIHY9PSJib29sZWFuIj8oeC5ib3VuZGFyeT00LHguc3RvcmFnZT00KTp2LmlzVmVjdG9yMj8oeC5ib3VuZGFyeT04LHguc3RvcmFnZT04KTp2LmlzVmVjdG9yM3x8di5pc0NvbG9yPyh4LmJvdW5kYXJ5PTE2LHguc3RvcmFnZT0xMik6di5pc1ZlY3RvcjQ/KHguYm91bmRhcnk9MTYseC5zdG9yYWdlPTE2KTp2LmlzTWF0cml4Mz8oeC5ib3VuZGFyeT00OCx4LnN0b3JhZ2U9NDgpOnYuaXNNYXRyaXg0Pyh4LmJvdW5kYXJ5PTY0LHguc3RvcmFnZT02NCk6di5pc1RleHR1cmU/Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIHNhbXBsZXJzIGNhbiBub3QgYmUgcGFydCBvZiBhbiB1bmlmb3JtcyBncm91cC4iKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHVuaWZvcm0gdmFsdWUgdHlwZS4iLHYpLHh9ZnVuY3Rpb24gZyh2KXtjb25zdCB4PXYudGFyZ2V0O3gucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZyk7Y29uc3QgXz1vLmluZGV4T2YoeC5fX2JpbmRpbmdQb2ludEluZGV4KTtvLnNwbGljZShfLDEpLGkuZGVsZXRlQnVmZmVyKHJbeC5pZF0pLGRlbGV0ZSByW3guaWRdLGRlbGV0ZSBzW3guaWRdfWZ1bmN0aW9uIG0oKXtmb3IoY29uc3QgdiBpbiByKWkuZGVsZXRlQnVmZmVyKHJbdl0pO289W10scj17fSxzPXt9fXJldHVybntiaW5kOmwsdXBkYXRlOmMsZGlzcG9zZTptfX1jbGFzcyBqSXtjb25zdHJ1Y3Rvcih0PXt9KXtjb25zdHtjYW52YXM6ZT15eSgpLGNvbnRleHQ6bj1udWxsLGRlcHRoOnI9ITAsc3RlbmNpbDpzPSExLGFscGhhOm89ITEsYW50aWFsaWFzOmE9ITEscHJlbXVsdGlwbGllZEFscGhhOmw9ITAscHJlc2VydmVEcmF3aW5nQnVmZmVyOmM9ITEscG93ZXJQcmVmZXJlbmNlOnU9ImRlZmF1bHQiLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6aD0hMSxyZXZlcnNlRGVwdGhCdWZmZXI6Zj0hMX09dDt0aGlzLmlzV2ViR0xSZW5kZXJlcj0hMDtsZXQgZDtpZihuIT09bnVsbCl7aWYodHlwZW9mIFdlYkdMUmVuZGVyaW5nQ29udGV4dCE9InVuZGVmaW5lZCImJm4gaW5zdGFuY2VvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTCAxIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgcjE2My4iKTtkPW4uZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYX1lbHNlIGQ9bztjb25zdCBwPW5ldyBVaW50MzJBcnJheSg0KSx5PW5ldyBJbnQzMkFycmF5KDQpO2xldCBnPW51bGwsbT1udWxsO2NvbnN0IHY9W10seD1bXTt0aGlzLmRvbUVsZW1lbnQ9ZSx0aGlzLmRlYnVnPXtjaGVja1NoYWRlckVycm9yczohMCxvblNoYWRlckVycm9yOm51bGx9LHRoaXMuYXV0b0NsZWFyPSEwLHRoaXMuYXV0b0NsZWFyQ29sb3I9ITAsdGhpcy5hdXRvQ2xlYXJEZXB0aD0hMCx0aGlzLmF1dG9DbGVhclN0ZW5jaWw9ITAsdGhpcy5zb3J0T2JqZWN0cz0hMCx0aGlzLmNsaXBwaW5nUGxhbmVzPVtdLHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ9ITEsdGhpcy5fb3V0cHV0Q29sb3JTcGFjZT1Tbix0aGlzLnRvbmVNYXBwaW5nPXppLHRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZT0xO2NvbnN0IF89dGhpcztsZXQgTT0hMSxiPTAsQT0wLEU9bnVsbCx3PS0xLFM9bnVsbDtjb25zdCBUPW5ldyBRdCxEPW5ldyBRdDtsZXQgTD1udWxsO2NvbnN0IE49bmV3IHh0KDApO2xldCBGPTAsQj1lLndpZHRoLEc9ZS5oZWlnaHQsaz0xLFE9bnVsbCxjdD1udWxsO2NvbnN0IGh0PW5ldyBRdCgwLDAsQixHKSxQdD1uZXcgUXQoMCwwLEIsRyk7bGV0IFh0PSExO2NvbnN0IGo9bmV3IEJhO2xldCBydD0hMSxFdD0hMTtjb25zdCB1dD1uZXcgUnQsTHQ9bmV3IFJ0LE90PW5ldyBSLEl0PW5ldyBRdCx0ZT17YmFja2dyb3VuZDpudWxsLGZvZzpudWxsLGVudmlyb25tZW50Om51bGwsb3ZlcnJpZGVNYXRlcmlhbDpudWxsLGlzU2NlbmU6ITB9O2xldCBudD0hMTtmdW5jdGlvbiBzdCgpe3JldHVybiBFPT09bnVsbD9rOjF9bGV0IFU9bjtmdW5jdGlvbiBDdChJLFYpe3JldHVybiBlLmdldENvbnRleHQoSSxWKX10cnl7Y29uc3QgST17YWxwaGE6ITAsZGVwdGg6cixzdGVuY2lsOnMsYW50aWFsaWFzOmEscHJlbXVsdGlwbGllZEFscGhhOmwscHJlc2VydmVEcmF3aW5nQnVmZmVyOmMscG93ZXJQcmVmZXJlbmNlOnUsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDpofTtpZigic2V0QXR0cmlidXRlImluIGUmJmUuc2V0QXR0cmlidXRlKCJkYXRhLWVuZ2luZSIsYHRocmVlLmpzIHIke25lfWApLGUuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsaXQsITEpLGUuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0cmVzdG9yZWQiLHZ0LCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLF90LCExKSxVPT09bnVsbCl7Y29uc3QgVj0id2ViZ2wyIjtpZihVPUN0KFYsSSksVT09PW51bGwpdGhyb3cgQ3QoVik/bmV3IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLiIpOm5ldyBFcnJvcigiRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4iKX19Y2F0Y2goSSl7dGhyb3cgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIitJLm1lc3NhZ2UpLEl9bGV0IG90LFN0LFcsZXQsWixQLEMsTywkLHR0LEosZHQsZnQseXQsVnQsYXQsYnQsRHQsenQsd3QsZWUsWXQsdmUsejtmdW5jdGlvbiBtdCgpe290PW5ldyBhUChVKSxvdC5pbml0KCksWXQ9bmV3IGl2KFUsb3QpLFN0PW5ldyBlUChVLG90LHQsWXQpLFc9bmV3IFZJKFUsb3QpLFN0LnJldmVyc2VEZXB0aEJ1ZmZlciYmZiYmVy5idWZmZXJzLmRlcHRoLnNldFJldmVyc2VkKCEwKSxldD1uZXcgdVAoVSksWj1uZXcgQ0ksUD1uZXcgR0koVSxvdCxXLFosU3QsWXQsZXQpLEM9bmV3IGlQKF8pLE89bmV3IG9QKF8pLCQ9bmV3IGpUKFUpLHZlPW5ldyBRUihVLCQpLHR0PW5ldyBsUChVLCQsZXQsdmUpLEo9bmV3IGZQKFUsdHQsJCxldCksenQ9bmV3IGhQKFUsU3QsUCksYXQ9bmV3IG5QKFopLGR0PW5ldyBUSShfLEMsTyxvdCxTdCx2ZSxhdCksZnQ9bmV3IFpJKF8sWikseXQ9bmV3IFBJLFZ0PW5ldyBGSShvdCksRHQ9bmV3IEtSKF8sQyxPLFcsSixkLGwpLGJ0PW5ldyB6SShfLEosU3QpLHo9bmV3IEpJKFUsZXQsU3QsVyksd3Q9bmV3IHRQKFUsb3QsZXQpLGVlPW5ldyBjUChVLG90LGV0KSxldC5wcm9ncmFtcz1kdC5wcm9ncmFtcyxfLmNhcGFiaWxpdGllcz1TdCxfLmV4dGVuc2lvbnM9b3QsXy5wcm9wZXJ0aWVzPVosXy5yZW5kZXJMaXN0cz15dCxfLnNoYWRvd01hcD1idCxfLnN0YXRlPVcsXy5pbmZvPWV0fW10KCk7Y29uc3QgSz1uZXcgcUkoXyxVKTt0aGlzLnhyPUssdGhpcy5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIFV9LHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gVS5nZXRDb250ZXh0QXR0cmlidXRlcygpfSx0aGlzLmZvcmNlQ29udGV4dExvc3M9ZnVuY3Rpb24oKXtjb25zdCBJPW90LmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7SSYmSS5sb3NlQ29udGV4dCgpfSx0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmU9ZnVuY3Rpb24oKXtjb25zdCBJPW90LmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7SSYmSS5yZXN0b3JlQ29udGV4dCgpfSx0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4ga30sdGhpcy5zZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKEkpe0khPT12b2lkIDAmJihrPUksdGhpcy5zZXRTaXplKEIsRywhMSkpfSx0aGlzLmdldFNpemU9ZnVuY3Rpb24oSSl7cmV0dXJuIEkuc2V0KEIsRyl9LHRoaXMuc2V0U2l6ZT1mdW5jdGlvbihJLFYscT0hMCl7aWYoSy5pc1ByZXNlbnRpbmcpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuIik7cmV0dXJufUI9SSxHPVYsZS53aWR0aD1NYXRoLmZsb29yKEkqayksZS5oZWlnaHQ9TWF0aC5mbG9vcihWKmspLHE9PT0hMCYmKGUuc3R5bGUud2lkdGg9SSsicHgiLGUuc3R5bGUuaGVpZ2h0PVYrInB4IiksdGhpcy5zZXRWaWV3cG9ydCgwLDAsSSxWKX0sdGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbihJKXtyZXR1cm4gSS5zZXQoQiprLEcqaykuZmxvb3IoKX0sdGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbihJLFYscSl7Qj1JLEc9VixrPXEsZS53aWR0aD1NYXRoLmZsb29yKEkqcSksZS5oZWlnaHQ9TWF0aC5mbG9vcihWKnEpLHRoaXMuc2V0Vmlld3BvcnQoMCwwLEksVil9LHRoaXMuZ2V0Q3VycmVudFZpZXdwb3J0PWZ1bmN0aW9uKEkpe3JldHVybiBJLmNvcHkoVCl9LHRoaXMuZ2V0Vmlld3BvcnQ9ZnVuY3Rpb24oSSl7cmV0dXJuIEkuY29weShodCl9LHRoaXMuc2V0Vmlld3BvcnQ9ZnVuY3Rpb24oSSxWLHEsWSl7SS5pc1ZlY3RvcjQ/aHQuc2V0KEkueCxJLnksSS56LEkudyk6aHQuc2V0KEksVixxLFkpLFcudmlld3BvcnQoVC5jb3B5KGh0KS5tdWx0aXBseVNjYWxhcihrKS5yb3VuZCgpKX0sdGhpcy5nZXRTY2lzc29yPWZ1bmN0aW9uKEkpe3JldHVybiBJLmNvcHkoUHQpfSx0aGlzLnNldFNjaXNzb3I9ZnVuY3Rpb24oSSxWLHEsWSl7SS5pc1ZlY3RvcjQ/UHQuc2V0KEkueCxJLnksSS56LEkudyk6UHQuc2V0KEksVixxLFkpLFcuc2Npc3NvcihELmNvcHkoUHQpLm11bHRpcGx5U2NhbGFyKGspLnJvdW5kKCkpfSx0aGlzLmdldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKCl7cmV0dXJuIFh0fSx0aGlzLnNldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKEkpe1cuc2V0U2Npc3NvclRlc3QoWHQ9SSl9LHRoaXMuc2V0T3BhcXVlU29ydD1mdW5jdGlvbihJKXtRPUl9LHRoaXMuc2V0VHJhbnNwYXJlbnRTb3J0PWZ1bmN0aW9uKEkpe2N0PUl9LHRoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbihJKXtyZXR1cm4gSS5jb3B5KER0LmdldENsZWFyQ29sb3IoKSl9LHRoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe0R0LnNldENsZWFyQ29sb3IuYXBwbHkoRHQsYXJndW1lbnRzKX0sdGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIER0LmdldENsZWFyQWxwaGEoKX0sdGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7RHQuc2V0Q2xlYXJBbHBoYS5hcHBseShEdCxhcmd1bWVudHMpfSx0aGlzLmNsZWFyPWZ1bmN0aW9uKEk9ITAsVj0hMCxxPSEwKXtsZXQgWT0wO2lmKEkpe2xldCBIPSExO2lmKEUhPT1udWxsKXtjb25zdCBsdD1FLnRleHR1cmUuZm9ybWF0O0g9bHQ9PT1yY3x8bHQ9PT1pY3x8bHQ9PT1kYX1pZihIKXtjb25zdCBsdD1FLnRleHR1cmUudHlwZSxndD1sdD09PUFpfHxsdD09PVZpfHxsdD09PVpzfHxsdD09PVhyfHxsdD09PXRjfHxsdD09PWVjLEF0PUR0LmdldENsZWFyQ29sb3IoKSxUdD1EdC5nZXRDbGVhckFscGhhKCksR3Q9QXQucixxdD1BdC5nLFV0PUF0LmI7Z3Q/KHBbMF09R3QscFsxXT1xdCxwWzJdPVV0LHBbM109VHQsVS5jbGVhckJ1ZmZlcnVpdihVLkNPTE9SLDAscCkpOih5WzBdPUd0LHlbMV09cXQseVsyXT1VdCx5WzNdPVR0LFUuY2xlYXJCdWZmZXJpdihVLkNPTE9SLDAseSkpfWVsc2UgWXw9VS5DT0xPUl9CVUZGRVJfQklUfVYmJihZfD1VLkRFUFRIX0JVRkZFUl9CSVQpLHEmJihZfD1VLlNURU5DSUxfQlVGRkVSX0JJVCx0aGlzLnN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRNYXNrKDQyOTQ5NjcyOTUpKSxVLmNsZWFyKFkpfSx0aGlzLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCEwLCExLCExKX0sdGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9LHRoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9LHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsaXQsITEpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0cmVzdG9yZWQiLHZ0LCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLF90LCExKSxEdC5kaXNwb3NlKCkseXQuZGlzcG9zZSgpLFZ0LmRpc3Bvc2UoKSxaLmRpc3Bvc2UoKSxDLmRpc3Bvc2UoKSxPLmRpc3Bvc2UoKSxKLmRpc3Bvc2UoKSx2ZS5kaXNwb3NlKCksei5kaXNwb3NlKCksZHQuZGlzcG9zZSgpLEsuZGlzcG9zZSgpLEsucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Vzc2lvbnN0YXJ0IixodyksSy5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIixmdyksR3Muc3RvcCgpfTtmdW5jdGlvbiBpdChJKXtJLnByZXZlbnREZWZhdWx0KCksY29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4iKSxNPSEwfWZ1bmN0aW9uIHZ0KCl7Y29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuIiksTT0hMTtjb25zdCBJPWV0LmF1dG9SZXNldCxWPWJ0LmVuYWJsZWQscT1idC5hdXRvVXBkYXRlLFk9YnQubmVlZHNVcGRhdGUsSD1idC50eXBlO210KCksZXQuYXV0b1Jlc2V0PUksYnQuZW5hYmxlZD1WLGJ0LmF1dG9VcGRhdGU9cSxidC5uZWVkc1VwZGF0ZT1ZLGJ0LnR5cGU9SH1mdW5jdGlvbiBfdChJKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBIFdlYkdMIGNvbnRleHQgY291bGQgbm90IGJlIGNyZWF0ZWQuIFJlYXNvbjogIixJLnN0YXR1c01lc3NhZ2UpfWZ1bmN0aW9uIEt0KEkpe2NvbnN0IFY9SS50YXJnZXQ7Vi5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixLdCksTGUoVil9ZnVuY3Rpb24gTGUoSSl7c24oSSksWi5yZW1vdmUoSSl9ZnVuY3Rpb24gc24oSSl7Y29uc3QgVj1aLmdldChJKS5wcm9ncmFtcztWIT09dm9pZCAwJiYoVi5mb3JFYWNoKGZ1bmN0aW9uKHEpe2R0LnJlbGVhc2VQcm9ncmFtKHEpfSksSS5pc1NoYWRlck1hdGVyaWFsJiZkdC5yZWxlYXNlU2hhZGVyQ2FjaGUoSSkpfXRoaXMucmVuZGVyQnVmZmVyRGlyZWN0PWZ1bmN0aW9uKEksVixxLFksSCxsdCl7Vj09PW51bGwmJihWPXRlKTtjb25zdCBndD1ILmlzTWVzaCYmSC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDAsQXQ9JGsoSSxWLHEsWSxIKTtXLnNldE1hdGVyaWFsKFksZ3QpO2xldCBUdD1xLmluZGV4LEd0PTE7aWYoWS53aXJlZnJhbWU9PT0hMCl7aWYoVHQ9dHQuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKHEpLFR0PT09dm9pZCAwKXJldHVybjtHdD0yfWNvbnN0IHF0PXEuZHJhd1JhbmdlLFV0PXEuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgY2U9cXQuc3RhcnQqR3QsZmU9KHF0LnN0YXJ0K3F0LmNvdW50KSpHdDtsdCE9PW51bGwmJihjZT1NYXRoLm1heChjZSxsdC5zdGFydCpHdCksZmU9TWF0aC5taW4oZmUsKGx0LnN0YXJ0K2x0LmNvdW50KSpHdCkpLFR0IT09bnVsbD8oY2U9TWF0aC5tYXgoY2UsMCksZmU9TWF0aC5taW4oZmUsVHQuY291bnQpKTpVdCE9bnVsbCYmKGNlPU1hdGgubWF4KGNlLDApLGZlPU1hdGgubWluKGZlLFV0LmNvdW50KSk7Y29uc3Qga2U9ZmUtY2U7aWYoa2U8MHx8a2U9PT0xLzApcmV0dXJuO3ZlLnNldHVwKEgsWSxBdCxxLFR0KTtsZXQgRGUsdWU9d3Q7aWYoVHQhPT1udWxsJiYoRGU9JC5nZXQoVHQpLHVlPWVlLHVlLnNldEluZGV4KERlKSksSC5pc01lc2gpWS53aXJlZnJhbWU9PT0hMD8oVy5zZXRMaW5lV2lkdGgoWS53aXJlZnJhbWVMaW5ld2lkdGgqc3QoKSksdWUuc2V0TW9kZShVLkxJTkVTKSk6dWUuc2V0TW9kZShVLlRSSUFOR0xFUyk7ZWxzZSBpZihILmlzTGluZSl7bGV0IE50PVkubGluZXdpZHRoO050PT09dm9pZCAwJiYoTnQ9MSksVy5zZXRMaW5lV2lkdGgoTnQqc3QoKSksSC5pc0xpbmVTZWdtZW50cz91ZS5zZXRNb2RlKFUuTElORVMpOkguaXNMaW5lTG9vcD91ZS5zZXRNb2RlKFUuTElORV9MT09QKTp1ZS5zZXRNb2RlKFUuTElORV9TVFJJUCl9ZWxzZSBILmlzUG9pbnRzP3VlLnNldE1vZGUoVS5QT0lOVFMpOkguaXNTcHJpdGUmJnVlLnNldE1vZGUoVS5UUklBTkdMRVMpO2lmKEguaXNCYXRjaGVkTWVzaClpZihILl9tdWx0aURyYXdJbnN0YW5jZXMhPT1udWxsKXVlLnJlbmRlck11bHRpRHJhd0luc3RhbmNlcyhILl9tdWx0aURyYXdTdGFydHMsSC5fbXVsdGlEcmF3Q291bnRzLEguX211bHRpRHJhd0NvdW50LEguX211bHRpRHJhd0luc3RhbmNlcyk7ZWxzZSBpZihvdC5nZXQoIldFQkdMX211bHRpX2RyYXciKSl1ZS5yZW5kZXJNdWx0aURyYXcoSC5fbXVsdGlEcmF3U3RhcnRzLEguX211bHRpRHJhd0NvdW50cyxILl9tdWx0aURyYXdDb3VudCk7ZWxzZXtjb25zdCBOdD1ILl9tdWx0aURyYXdTdGFydHMsWmU9SC5fbXVsdGlEcmF3Q291bnRzLGRlPUguX211bHRpRHJhd0NvdW50LE1pPVR0PyQuZ2V0KFR0KS5ieXRlc1BlckVsZW1lbnQ6MSxvYT1aLmdldChZKS5jdXJyZW50UHJvZ3JhbS5nZXRVbmlmb3JtcygpO2ZvcihsZXQgWG49MDtYbjxkZTtYbisrKW9hLnNldFZhbHVlKFUsIl9nbF9EcmF3SUQiLFhuKSx1ZS5yZW5kZXIoTnRbWG5dL01pLFplW1huXSl9ZWxzZSBpZihILmlzSW5zdGFuY2VkTWVzaCl1ZS5yZW5kZXJJbnN0YW5jZXMoY2Usa2UsSC5jb3VudCk7ZWxzZSBpZihxLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpe2NvbnN0IE50PXEuX21heEluc3RhbmNlQ291bnQhPT12b2lkIDA/cS5fbWF4SW5zdGFuY2VDb3VudDoxLzAsWmU9TWF0aC5taW4ocS5pbnN0YW5jZUNvdW50LE50KTt1ZS5yZW5kZXJJbnN0YW5jZXMoY2Usa2UsWmUpfWVsc2UgdWUucmVuZGVyKGNlLGtlKX07ZnVuY3Rpb24geWUoSSxWLHEpe0kudHJhbnNwYXJlbnQ9PT0hMCYmSS5zaWRlPT09VW4mJkkuZm9yY2VTaW5nbGVQYXNzPT09ITE/KEkuc2lkZT1KZSxJLm5lZWRzVXBkYXRlPSEwLGpmKEksVixxKSxJLnNpZGU9c2ksSS5uZWVkc1VwZGF0ZT0hMCxqZihJLFYscSksSS5zaWRlPVVuKTpqZihJLFYscSl9dGhpcy5jb21waWxlPWZ1bmN0aW9uKEksVixxPW51bGwpe3E9PT1udWxsJiYocT1JKSxtPVZ0LmdldChxKSxtLmluaXQoVikseC5wdXNoKG0pLHEudHJhdmVyc2VWaXNpYmxlKGZ1bmN0aW9uKEgpe0guaXNMaWdodCYmSC5sYXllcnMudGVzdChWLmxheWVycykmJihtLnB1c2hMaWdodChIKSxILmNhc3RTaGFkb3cmJm0ucHVzaFNoYWRvdyhIKSl9KSxJIT09cSYmSS50cmF2ZXJzZVZpc2libGUoZnVuY3Rpb24oSCl7SC5pc0xpZ2h0JiZILmxheWVycy50ZXN0KFYubGF5ZXJzKSYmKG0ucHVzaExpZ2h0KEgpLEguY2FzdFNoYWRvdyYmbS5wdXNoU2hhZG93KEgpKX0pLG0uc2V0dXBMaWdodHMoKTtjb25zdCBZPW5ldyBTZXQ7cmV0dXJuIEkudHJhdmVyc2UoZnVuY3Rpb24oSCl7aWYoIShILmlzTWVzaHx8SC5pc1BvaW50c3x8SC5pc0xpbmV8fEguaXNTcHJpdGUpKXJldHVybjtjb25zdCBsdD1ILm1hdGVyaWFsO2lmKGx0KWlmKEFycmF5LmlzQXJyYXkobHQpKWZvcihsZXQgZ3Q9MDtndDxsdC5sZW5ndGg7Z3QrKyl7Y29uc3QgQXQ9bHRbZ3RdO3llKEF0LHEsSCksWS5hZGQoQXQpfWVsc2UgeWUobHQscSxIKSxZLmFkZChsdCl9KSx4LnBvcCgpLG09bnVsbCxZfSx0aGlzLmNvbXBpbGVBc3luYz1mdW5jdGlvbihJLFYscT1udWxsKXtjb25zdCBZPXRoaXMuY29tcGlsZShJLFYscSk7cmV0dXJuIG5ldyBQcm9taXNlKEg9PntmdW5jdGlvbiBsdCgpe2lmKFkuZm9yRWFjaChmdW5jdGlvbihndCl7Wi5nZXQoZ3QpLmN1cnJlbnRQcm9ncmFtLmlzUmVhZHkoKSYmWS5kZWxldGUoZ3QpfSksWS5zaXplPT09MCl7SChJKTtyZXR1cm59c2V0VGltZW91dChsdCwxMCl9b3QuZ2V0KCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSE9PW51bGw/bHQoKTpzZXRUaW1lb3V0KGx0LDEwKX0pfTtsZXQgU2k9bnVsbDtmdW5jdGlvbiBkcihJKXtTaSYmU2koSSl9ZnVuY3Rpb24gaHcoKXtHcy5zdG9wKCl9ZnVuY3Rpb24gZncoKXtHcy5zdGFydCgpfWNvbnN0IEdzPW5ldyBSeDtHcy5zZXRBbmltYXRpb25Mb29wKGRyKSx0eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCImJkdzLnNldENvbnRleHQoc2VsZiksdGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKEkpe1NpPUksSy5zZXRBbmltYXRpb25Mb29wKEkpLEk9PT1udWxsP0dzLnN0b3AoKTpHcy5zdGFydCgpfSxLLmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsaHcpLEsuYWRkRXZlbnRMaXN0ZW5lcigic2Vzc2lvbmVuZCIsZncpLHRoaXMucmVuZGVyPWZ1bmN0aW9uKEksVil7aWYoViE9PXZvaWQgMCYmVi5pc0NhbWVyYSE9PSEwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuIik7cmV0dXJufWlmKE09PT0hMClyZXR1cm47aWYoSS5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmSS51cGRhdGVNYXRyaXhXb3JsZCgpLFYucGFyZW50PT09bnVsbCYmVi5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmVi51cGRhdGVNYXRyaXhXb3JsZCgpLEsuZW5hYmxlZD09PSEwJiZLLmlzUHJlc2VudGluZz09PSEwJiYoSy5jYW1lcmFBdXRvVXBkYXRlPT09ITAmJksudXBkYXRlQ2FtZXJhKFYpLFY9Sy5nZXRDYW1lcmEoKSksSS5pc1NjZW5lPT09ITAmJkkub25CZWZvcmVSZW5kZXIoXyxJLFYsRSksbT1WdC5nZXQoSSx4Lmxlbmd0aCksbS5pbml0KFYpLHgucHVzaChtKSxMdC5tdWx0aXBseU1hdHJpY2VzKFYucHJvamVjdGlvbk1hdHJpeCxWLm1hdHJpeFdvcmxkSW52ZXJzZSksai5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChMdCksRXQ9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCxydD1hdC5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsRXQpLGc9eXQuZ2V0KEksdi5sZW5ndGgpLGcuaW5pdCgpLHYucHVzaChnKSxLLmVuYWJsZWQ9PT0hMCYmSy5pc1ByZXNlbnRpbmc9PT0hMCl7Y29uc3QgbHQ9Xy54ci5nZXREZXB0aFNlbnNpbmdNZXNoKCk7bHQhPT1udWxsJiZBMChsdCxWLC0xLzAsXy5zb3J0T2JqZWN0cyl9QTAoSSxWLDAsXy5zb3J0T2JqZWN0cyksZy5maW5pc2goKSxfLnNvcnRPYmplY3RzPT09ITAmJmcuc29ydChRLGN0KSxudD1LLmVuYWJsZWQ9PT0hMXx8Sy5pc1ByZXNlbnRpbmc9PT0hMXx8Sy5oYXNEZXB0aFNlbnNpbmcoKT09PSExLG50JiZEdC5hZGRUb1JlbmRlckxpc3QoZyxJKSx0aGlzLmluZm8ucmVuZGVyLmZyYW1lKysscnQ9PT0hMCYmYXQuYmVnaW5TaGFkb3dzKCk7Y29uc3QgcT1tLnN0YXRlLnNoYWRvd3NBcnJheTtidC5yZW5kZXIocSxJLFYpLHJ0PT09ITAmJmF0LmVuZFNoYWRvd3MoKSx0aGlzLmluZm8uYXV0b1Jlc2V0PT09ITAmJnRoaXMuaW5mby5yZXNldCgpO2NvbnN0IFk9Zy5vcGFxdWUsSD1nLnRyYW5zbWlzc2l2ZTtpZihtLnNldHVwTGlnaHRzKCksVi5pc0FycmF5Q2FtZXJhKXtjb25zdCBsdD1WLmNhbWVyYXM7aWYoSC5sZW5ndGg+MClmb3IobGV0IGd0PTAsQXQ9bHQubGVuZ3RoO2d0PEF0O2d0Kyspe2NvbnN0IFR0PWx0W2d0XTtwdyhZLEgsSSxUdCl9bnQmJkR0LnJlbmRlcihJKTtmb3IobGV0IGd0PTAsQXQ9bHQubGVuZ3RoO2d0PEF0O2d0Kyspe2NvbnN0IFR0PWx0W2d0XTtkdyhnLEksVHQsVHQudmlld3BvcnQpfX1lbHNlIEgubGVuZ3RoPjAmJnB3KFksSCxJLFYpLG50JiZEdC5yZW5kZXIoSSksZHcoZyxJLFYpO0UhPT1udWxsJiYoUC51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChFKSxQLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcChFKSksSS5pc1NjZW5lPT09ITAmJkkub25BZnRlclJlbmRlcihfLEksViksdmUucmVzZXREZWZhdWx0U3RhdGUoKSx3PS0xLFM9bnVsbCx4LnBvcCgpLHgubGVuZ3RoPjA/KG09eFt4Lmxlbmd0aC0xXSxydD09PSEwJiZhdC5zZXRHbG9iYWxTdGF0ZShfLmNsaXBwaW5nUGxhbmVzLG0uc3RhdGUuY2FtZXJhKSk6bT1udWxsLHYucG9wKCksdi5sZW5ndGg+MD9nPXZbdi5sZW5ndGgtMV06Zz1udWxsfTtmdW5jdGlvbiBBMChJLFYscSxZKXtpZihJLnZpc2libGU9PT0hMSlyZXR1cm47aWYoSS5sYXllcnMudGVzdChWLmxheWVycykpe2lmKEkuaXNHcm91cClxPUkucmVuZGVyT3JkZXI7ZWxzZSBpZihJLmlzTE9EKUkuYXV0b1VwZGF0ZT09PSEwJiZJLnVwZGF0ZShWKTtlbHNlIGlmKEkuaXNMaWdodCltLnB1c2hMaWdodChJKSxJLmNhc3RTaGFkb3cmJm0ucHVzaFNoYWRvdyhJKTtlbHNlIGlmKEkuaXNTcHJpdGUpe2lmKCFJLmZydXN0dW1DdWxsZWR8fGouaW50ZXJzZWN0c1Nwcml0ZShJKSl7WSYmSXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKEkubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChMdCk7Y29uc3QgZ3Q9Si51cGRhdGUoSSksQXQ9SS5tYXRlcmlhbDtBdC52aXNpYmxlJiZnLnB1c2goSSxndCxBdCxxLEl0LnosbnVsbCl9fWVsc2UgaWYoKEkuaXNNZXNofHxJLmlzTGluZXx8SS5pc1BvaW50cykmJighSS5mcnVzdHVtQ3VsbGVkfHxqLmludGVyc2VjdHNPYmplY3QoSSkpKXtjb25zdCBndD1KLnVwZGF0ZShJKSxBdD1JLm1hdGVyaWFsO2lmKFkmJihJLmJvdW5kaW5nU3BoZXJlIT09dm9pZCAwPyhJLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmSS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxJdC5jb3B5KEkuYm91bmRpbmdTcGhlcmUuY2VudGVyKSk6KGd0LmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmZ3QuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksSXQuY29weShndC5ib3VuZGluZ1NwaGVyZS5jZW50ZXIpKSxJdC5hcHBseU1hdHJpeDQoSS5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KEx0KSksQXJyYXkuaXNBcnJheShBdCkpe2NvbnN0IFR0PWd0Lmdyb3Vwcztmb3IobGV0IEd0PTAscXQ9VHQubGVuZ3RoO0d0PHF0O0d0Kyspe2NvbnN0IFV0PVR0W0d0XSxjZT1BdFtVdC5tYXRlcmlhbEluZGV4XTtjZSYmY2UudmlzaWJsZSYmZy5wdXNoKEksZ3QsY2UscSxJdC56LFV0KX19ZWxzZSBBdC52aXNpYmxlJiZnLnB1c2goSSxndCxBdCxxLEl0LnosbnVsbCl9fWNvbnN0IGx0PUkuY2hpbGRyZW47Zm9yKGxldCBndD0wLEF0PWx0Lmxlbmd0aDtndDxBdDtndCsrKUEwKGx0W2d0XSxWLHEsWSl9ZnVuY3Rpb24gZHcoSSxWLHEsWSl7Y29uc3QgSD1JLm9wYXF1ZSxsdD1JLnRyYW5zbWlzc2l2ZSxndD1JLnRyYW5zcGFyZW50O20uc2V0dXBMaWdodHNWaWV3KHEpLHJ0PT09ITAmJmF0LnNldEdsb2JhbFN0YXRlKF8uY2xpcHBpbmdQbGFuZXMscSksWSYmVy52aWV3cG9ydChULmNvcHkoWSkpLEgubGVuZ3RoPjAmJkpmKEgsVixxKSxsdC5sZW5ndGg+MCYmSmYobHQsVixxKSxndC5sZW5ndGg+MCYmSmYoZ3QsVixxKSxXLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksVy5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLFcuYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSxXLnNldFBvbHlnb25PZmZzZXQoITEpfWZ1bmN0aW9uIHB3KEksVixxLFkpe2lmKChxLmlzU2NlbmU9PT0hMD9xLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbCkhPT1udWxsKXJldHVybjttLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtZLmlkXT09PXZvaWQgMCYmKG0uc3RhdGUudHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0W1kuaWRdPW5ldyBvaSgxLDEse2dlbmVyYXRlTWlwbWFwczohMCx0eXBlOm90LmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iil8fG90LmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpP0pzOkFpLG1pbkZpbHRlcjp3aSxzYW1wbGVzOjQsc3RlbmNpbEJ1ZmZlcjpzLHJlc29sdmVEZXB0aEJ1ZmZlcjohMSxyZXNvbHZlU3RlbmNpbEJ1ZmZlcjohMSxjb2xvclNwYWNlOnJlLndvcmtpbmdDb2xvclNwYWNlfSkpO2NvbnN0IGx0PW0uc3RhdGUudHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0W1kuaWRdLGd0PVkudmlld3BvcnR8fFQ7bHQuc2V0U2l6ZShndC56LGd0LncpO2NvbnN0IEF0PV8uZ2V0UmVuZGVyVGFyZ2V0KCk7Xy5zZXRSZW5kZXJUYXJnZXQobHQpLF8uZ2V0Q2xlYXJDb2xvcihOKSxGPV8uZ2V0Q2xlYXJBbHBoYSgpLEY8MSYmXy5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LC41KSxfLmNsZWFyKCksbnQmJkR0LnJlbmRlcihxKTtjb25zdCBUdD1fLnRvbmVNYXBwaW5nO18udG9uZU1hcHBpbmc9emk7Y29uc3QgR3Q9WS52aWV3cG9ydDtpZihZLnZpZXdwb3J0IT09dm9pZCAwJiYoWS52aWV3cG9ydD12b2lkIDApLG0uc2V0dXBMaWdodHNWaWV3KFkpLHJ0PT09ITAmJmF0LnNldEdsb2JhbFN0YXRlKF8uY2xpcHBpbmdQbGFuZXMsWSksSmYoSSxxLFkpLFAudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQobHQpLFAudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKGx0KSxvdC5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpPT09ITEpe2xldCBxdD0hMTtmb3IobGV0IFV0PTAsY2U9Vi5sZW5ndGg7VXQ8Y2U7VXQrKyl7Y29uc3QgZmU9VltVdF0sa2U9ZmUub2JqZWN0LERlPWZlLmdlb21ldHJ5LHVlPWZlLm1hdGVyaWFsLE50PWZlLmdyb3VwO2lmKHVlLnNpZGU9PT1VbiYma2UubGF5ZXJzLnRlc3QoWS5sYXllcnMpKXtjb25zdCBaZT11ZS5zaWRlO3VlLnNpZGU9SmUsdWUubmVlZHNVcGRhdGU9ITAsbXcoa2UscSxZLERlLHVlLE50KSx1ZS5zaWRlPVplLHVlLm5lZWRzVXBkYXRlPSEwLHF0PSEwfX1xdD09PSEwJiYoUC51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChsdCksUC51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAobHQpKX1fLnNldFJlbmRlclRhcmdldChBdCksXy5zZXRDbGVhckNvbG9yKE4sRiksR3QhPT12b2lkIDAmJihZLnZpZXdwb3J0PUd0KSxfLnRvbmVNYXBwaW5nPVR0fWZ1bmN0aW9uIEpmKEksVixxKXtjb25zdCBZPVYuaXNTY2VuZT09PSEwP1Yub3ZlcnJpZGVNYXRlcmlhbDpudWxsO2ZvcihsZXQgSD0wLGx0PUkubGVuZ3RoO0g8bHQ7SCsrKXtjb25zdCBndD1JW0hdLEF0PWd0Lm9iamVjdCxUdD1ndC5nZW9tZXRyeSxHdD1ZPT09bnVsbD9ndC5tYXRlcmlhbDpZLHF0PWd0Lmdyb3VwO0F0LmxheWVycy50ZXN0KHEubGF5ZXJzKSYmbXcoQXQsVixxLFR0LEd0LHF0KX19ZnVuY3Rpb24gbXcoSSxWLHEsWSxILGx0KXtJLm9uQmVmb3JlUmVuZGVyKF8sVixxLFksSCxsdCksSS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhxLm1hdHJpeFdvcmxkSW52ZXJzZSxJLm1hdHJpeFdvcmxkKSxJLm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoSS5tb2RlbFZpZXdNYXRyaXgpLEgub25CZWZvcmVSZW5kZXIoXyxWLHEsWSxJLGx0KSxILnRyYW5zcGFyZW50PT09ITAmJkguc2lkZT09PVVuJiZILmZvcmNlU2luZ2xlUGFzcz09PSExPyhILnNpZGU9SmUsSC5uZWVkc1VwZGF0ZT0hMCxfLnJlbmRlckJ1ZmZlckRpcmVjdChxLFYsWSxILEksbHQpLEguc2lkZT1zaSxILm5lZWRzVXBkYXRlPSEwLF8ucmVuZGVyQnVmZmVyRGlyZWN0KHEsVixZLEgsSSxsdCksSC5zaWRlPVVuKTpfLnJlbmRlckJ1ZmZlckRpcmVjdChxLFYsWSxILEksbHQpLEkub25BZnRlclJlbmRlcihfLFYscSxZLEgsbHQpfWZ1bmN0aW9uIGpmKEksVixxKXtWLmlzU2NlbmUhPT0hMCYmKFY9dGUpO2NvbnN0IFk9Wi5nZXQoSSksSD1tLnN0YXRlLmxpZ2h0cyxsdD1tLnN0YXRlLnNoYWRvd3NBcnJheSxndD1ILnN0YXRlLnZlcnNpb24sQXQ9ZHQuZ2V0UGFyYW1ldGVycyhJLEguc3RhdGUsbHQsVixxKSxUdD1kdC5nZXRQcm9ncmFtQ2FjaGVLZXkoQXQpO2xldCBHdD1ZLnByb2dyYW1zO1kuZW52aXJvbm1lbnQ9SS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP1YuZW52aXJvbm1lbnQ6bnVsbCxZLmZvZz1WLmZvZyxZLmVudk1hcD0oSS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP086QykuZ2V0KEkuZW52TWFwfHxZLmVudmlyb25tZW50KSxZLmVudk1hcFJvdGF0aW9uPVkuZW52aXJvbm1lbnQhPT1udWxsJiZJLmVudk1hcD09PW51bGw/Vi5lbnZpcm9ubWVudFJvdGF0aW9uOkkuZW52TWFwUm90YXRpb24sR3Q9PT12b2lkIDAmJihJLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLEt0KSxHdD1uZXcgTWFwLFkucHJvZ3JhbXM9R3QpO2xldCBxdD1HdC5nZXQoVHQpO2lmKHF0IT09dm9pZCAwKXtpZihZLmN1cnJlbnRQcm9ncmFtPT09cXQmJlkubGlnaHRzU3RhdGVWZXJzaW9uPT09Z3QpcmV0dXJuIHl3KEksQXQpLHF0fWVsc2UgQXQudW5pZm9ybXM9ZHQuZ2V0VW5pZm9ybXMoSSksSS5vbkJlZm9yZUNvbXBpbGUoQXQsXykscXQ9ZHQuYWNxdWlyZVByb2dyYW0oQXQsVHQpLEd0LnNldChUdCxxdCksWS51bmlmb3Jtcz1BdC51bmlmb3Jtcztjb25zdCBVdD1ZLnVuaWZvcm1zO3JldHVybighSS5pc1NoYWRlck1hdGVyaWFsJiYhSS5pc1Jhd1NoYWRlck1hdGVyaWFsfHxJLmNsaXBwaW5nPT09ITApJiYoVXQuY2xpcHBpbmdQbGFuZXM9YXQudW5pZm9ybSkseXcoSSxBdCksWS5uZWVkc0xpZ2h0cz1xayhJKSxZLmxpZ2h0c1N0YXRlVmVyc2lvbj1ndCxZLm5lZWRzTGlnaHRzJiYoVXQuYW1iaWVudExpZ2h0Q29sb3IudmFsdWU9SC5zdGF0ZS5hbWJpZW50LFV0LmxpZ2h0UHJvYmUudmFsdWU9SC5zdGF0ZS5wcm9iZSxVdC5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZT1ILnN0YXRlLmRpcmVjdGlvbmFsLFV0LmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLnZhbHVlPUguc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3csVXQuc3BvdExpZ2h0cy52YWx1ZT1ILnN0YXRlLnNwb3QsVXQuc3BvdExpZ2h0U2hhZG93cy52YWx1ZT1ILnN0YXRlLnNwb3RTaGFkb3csVXQucmVjdEFyZWFMaWdodHMudmFsdWU9SC5zdGF0ZS5yZWN0QXJlYSxVdC5sdGNfMS52YWx1ZT1ILnN0YXRlLnJlY3RBcmVhTFRDMSxVdC5sdGNfMi52YWx1ZT1ILnN0YXRlLnJlY3RBcmVhTFRDMixVdC5wb2ludExpZ2h0cy52YWx1ZT1ILnN0YXRlLnBvaW50LFV0LnBvaW50TGlnaHRTaGFkb3dzLnZhbHVlPUguc3RhdGUucG9pbnRTaGFkb3csVXQuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZT1ILnN0YXRlLmhlbWksVXQuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWU9SC5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxVdC5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1ILnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LFV0LnNwb3RTaGFkb3dNYXAudmFsdWU9SC5zdGF0ZS5zcG90U2hhZG93TWFwLFV0LnNwb3RMaWdodE1hdHJpeC52YWx1ZT1ILnN0YXRlLnNwb3RMaWdodE1hdHJpeCxVdC5zcG90TGlnaHRNYXAudmFsdWU9SC5zdGF0ZS5zcG90TGlnaHRNYXAsVXQucG9pbnRTaGFkb3dNYXAudmFsdWU9SC5zdGF0ZS5wb2ludFNoYWRvd01hcCxVdC5wb2ludFNoYWRvd01hdHJpeC52YWx1ZT1ILnN0YXRlLnBvaW50U2hhZG93TWF0cml4KSxZLmN1cnJlbnRQcm9ncmFtPXF0LFkudW5pZm9ybXNMaXN0PW51bGwscXR9ZnVuY3Rpb24gZ3coSSl7aWYoSS51bmlmb3Jtc0xpc3Q9PT1udWxsKXtjb25zdCBWPUkuY3VycmVudFByb2dyYW0uZ2V0VW5pZm9ybXMoKTtJLnVuaWZvcm1zTGlzdD1qdS5zZXFXaXRoVmFsdWUoVi5zZXEsSS51bmlmb3Jtcyl9cmV0dXJuIEkudW5pZm9ybXNMaXN0fWZ1bmN0aW9uIHl3KEksVil7Y29uc3QgcT1aLmdldChJKTtxLm91dHB1dENvbG9yU3BhY2U9Vi5vdXRwdXRDb2xvclNwYWNlLHEuYmF0Y2hpbmc9Vi5iYXRjaGluZyxxLmJhdGNoaW5nQ29sb3I9Vi5iYXRjaGluZ0NvbG9yLHEuaW5zdGFuY2luZz1WLmluc3RhbmNpbmcscS5pbnN0YW5jaW5nQ29sb3I9Vi5pbnN0YW5jaW5nQ29sb3IscS5pbnN0YW5jaW5nTW9ycGg9Vi5pbnN0YW5jaW5nTW9ycGgscS5za2lubmluZz1WLnNraW5uaW5nLHEubW9ycGhUYXJnZXRzPVYubW9ycGhUYXJnZXRzLHEubW9ycGhOb3JtYWxzPVYubW9ycGhOb3JtYWxzLHEubW9ycGhDb2xvcnM9Vi5tb3JwaENvbG9ycyxxLm1vcnBoVGFyZ2V0c0NvdW50PVYubW9ycGhUYXJnZXRzQ291bnQscS5udW1DbGlwcGluZ1BsYW5lcz1WLm51bUNsaXBwaW5nUGxhbmVzLHEubnVtSW50ZXJzZWN0aW9uPVYubnVtQ2xpcEludGVyc2VjdGlvbixxLnZlcnRleEFscGhhcz1WLnZlcnRleEFscGhhcyxxLnZlcnRleFRhbmdlbnRzPVYudmVydGV4VGFuZ2VudHMscS50b25lTWFwcGluZz1WLnRvbmVNYXBwaW5nfWZ1bmN0aW9uICRrKEksVixxLFksSCl7Vi5pc1NjZW5lIT09ITAmJihWPXRlKSxQLnJlc2V0VGV4dHVyZVVuaXRzKCk7Y29uc3QgbHQ9Vi5mb2csZ3Q9WS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP1YuZW52aXJvbm1lbnQ6bnVsbCxBdD1FPT09bnVsbD9fLm91dHB1dENvbG9yU3BhY2U6RS5pc1hSUmVuZGVyVGFyZ2V0PT09ITA/RS50ZXh0dXJlLmNvbG9yU3BhY2U6anIsVHQ9KFkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9POkMpLmdldChZLmVudk1hcHx8Z3QpLEd0PVkudmVydGV4Q29sb3JzPT09ITAmJiEhcS5hdHRyaWJ1dGVzLmNvbG9yJiZxLmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemU9PT00LHF0PSEhcS5hdHRyaWJ1dGVzLnRhbmdlbnQmJighIVkubm9ybWFsTWFwfHxZLmFuaXNvdHJvcHk+MCksVXQ9ISFxLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixjZT0hIXEubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCxmZT0hIXEubW9ycGhBdHRyaWJ1dGVzLmNvbG9yO2xldCBrZT16aTtZLnRvbmVNYXBwZWQmJihFPT09bnVsbHx8RS5pc1hSUmVuZGVyVGFyZ2V0PT09ITApJiYoa2U9Xy50b25lTWFwcGluZyk7Y29uc3QgRGU9cS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb258fHEubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8cS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IsdWU9RGUhPT12b2lkIDA/RGUubGVuZ3RoOjAsTnQ9Wi5nZXQoWSksWmU9bS5zdGF0ZS5saWdodHM7aWYocnQ9PT0hMCYmKEV0PT09ITB8fEkhPT1TKSl7Y29uc3QgX249ST09PVMmJlkuaWQ9PT13O2F0LnNldFN0YXRlKFksSSxfbil9bGV0IGRlPSExO1kudmVyc2lvbj09PU50Ll9fdmVyc2lvbj8oTnQubmVlZHNMaWdodHMmJk50LmxpZ2h0c1N0YXRlVmVyc2lvbiE9PVplLnN0YXRlLnZlcnNpb258fE50Lm91dHB1dENvbG9yU3BhY2UhPT1BdHx8SC5pc0JhdGNoZWRNZXNoJiZOdC5iYXRjaGluZz09PSExfHwhSC5pc0JhdGNoZWRNZXNoJiZOdC5iYXRjaGluZz09PSEwfHxILmlzQmF0Y2hlZE1lc2gmJk50LmJhdGNoaW5nQ29sb3I9PT0hMCYmSC5jb2xvclRleHR1cmU9PT1udWxsfHxILmlzQmF0Y2hlZE1lc2gmJk50LmJhdGNoaW5nQ29sb3I9PT0hMSYmSC5jb2xvclRleHR1cmUhPT1udWxsfHxILmlzSW5zdGFuY2VkTWVzaCYmTnQuaW5zdGFuY2luZz09PSExfHwhSC5pc0luc3RhbmNlZE1lc2gmJk50Lmluc3RhbmNpbmc9PT0hMHx8SC5pc1NraW5uZWRNZXNoJiZOdC5za2lubmluZz09PSExfHwhSC5pc1NraW5uZWRNZXNoJiZOdC5za2lubmluZz09PSEwfHxILmlzSW5zdGFuY2VkTWVzaCYmTnQuaW5zdGFuY2luZ0NvbG9yPT09ITAmJkguaW5zdGFuY2VDb2xvcj09PW51bGx8fEguaXNJbnN0YW5jZWRNZXNoJiZOdC5pbnN0YW5jaW5nQ29sb3I9PT0hMSYmSC5pbnN0YW5jZUNvbG9yIT09bnVsbHx8SC5pc0luc3RhbmNlZE1lc2gmJk50Lmluc3RhbmNpbmdNb3JwaD09PSEwJiZILm1vcnBoVGV4dHVyZT09PW51bGx8fEguaXNJbnN0YW5jZWRNZXNoJiZOdC5pbnN0YW5jaW5nTW9ycGg9PT0hMSYmSC5tb3JwaFRleHR1cmUhPT1udWxsfHxOdC5lbnZNYXAhPT1UdHx8WS5mb2c9PT0hMCYmTnQuZm9nIT09bHR8fE50Lm51bUNsaXBwaW5nUGxhbmVzIT09dm9pZCAwJiYoTnQubnVtQ2xpcHBpbmdQbGFuZXMhPT1hdC5udW1QbGFuZXN8fE50Lm51bUludGVyc2VjdGlvbiE9PWF0Lm51bUludGVyc2VjdGlvbil8fE50LnZlcnRleEFscGhhcyE9PUd0fHxOdC52ZXJ0ZXhUYW5nZW50cyE9PXF0fHxOdC5tb3JwaFRhcmdldHMhPT1VdHx8TnQubW9ycGhOb3JtYWxzIT09Y2V8fE50Lm1vcnBoQ29sb3JzIT09ZmV8fE50LnRvbmVNYXBwaW5nIT09a2V8fE50Lm1vcnBoVGFyZ2V0c0NvdW50IT09dWUpJiYoZGU9ITApOihkZT0hMCxOdC5fX3ZlcnNpb249WS52ZXJzaW9uKTtsZXQgTWk9TnQuY3VycmVudFByb2dyYW07ZGU9PT0hMCYmKE1pPWpmKFksVixIKSk7bGV0IG9hPSExLFhuPSExLEdsPSExO2NvbnN0IGJlPU1pLmdldFVuaWZvcm1zKCksaWk9TnQudW5pZm9ybXM7aWYoVy51c2VQcm9ncmFtKE1pLnByb2dyYW0pJiYob2E9ITAsWG49ITAsR2w9ITApLFkuaWQhPT13JiYodz1ZLmlkLFhuPSEwKSxvYXx8UyE9PUkpe1cuYnVmZmVycy5kZXB0aC5nZXRSZXZlcnNlZCgpPyh1dC5jb3B5KEkucHJvamVjdGlvbk1hdHJpeCksTUEodXQpLGJBKHV0KSxiZS5zZXRWYWx1ZShVLCJwcm9qZWN0aW9uTWF0cml4Iix1dCkpOmJlLnNldFZhbHVlKFUsInByb2plY3Rpb25NYXRyaXgiLEkucHJvamVjdGlvbk1hdHJpeCksYmUuc2V0VmFsdWUoVSwidmlld01hdHJpeCIsSS5tYXRyaXhXb3JsZEludmVyc2UpO2NvbnN0IEluPWJlLm1hcC5jYW1lcmFQb3NpdGlvbjtJbiE9PXZvaWQgMCYmSW4uc2V0VmFsdWUoVSxPdC5zZXRGcm9tTWF0cml4UG9zaXRpb24oSS5tYXRyaXhXb3JsZCkpLFN0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJmJlLnNldFZhbHVlKFUsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKEkuZmFyKzEpL01hdGguTE4yKSksKFkuaXNNZXNoUGhvbmdNYXRlcmlhbHx8WS5pc01lc2hUb29uTWF0ZXJpYWx8fFkuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxZLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fFkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8WS5pc1NoYWRlck1hdGVyaWFsKSYmYmUuc2V0VmFsdWUoVSwiaXNPcnRob2dyYXBoaWMiLEkuaXNPcnRob2dyYXBoaWNDYW1lcmE9PT0hMCksUyE9PUkmJihTPUksWG49ITAsR2w9ITApfWlmKEguaXNTa2lubmVkTWVzaCl7YmUuc2V0T3B0aW9uYWwoVSxILCJiaW5kTWF0cml4IiksYmUuc2V0T3B0aW9uYWwoVSxILCJiaW5kTWF0cml4SW52ZXJzZSIpO2NvbnN0IF9uPUguc2tlbGV0b247X24mJihfbi5ib25lVGV4dHVyZT09PW51bGwmJl9uLmNvbXB1dGVCb25lVGV4dHVyZSgpLGJlLnNldFZhbHVlKFUsImJvbmVUZXh0dXJlIixfbi5ib25lVGV4dHVyZSxQKSl9SC5pc0JhdGNoZWRNZXNoJiYoYmUuc2V0T3B0aW9uYWwoVSxILCJiYXRjaGluZ1RleHR1cmUiKSxiZS5zZXRWYWx1ZShVLCJiYXRjaGluZ1RleHR1cmUiLEguX21hdHJpY2VzVGV4dHVyZSxQKSxiZS5zZXRPcHRpb25hbChVLEgsImJhdGNoaW5nSWRUZXh0dXJlIiksYmUuc2V0VmFsdWUoVSwiYmF0Y2hpbmdJZFRleHR1cmUiLEguX2luZGlyZWN0VGV4dHVyZSxQKSxiZS5zZXRPcHRpb25hbChVLEgsImJhdGNoaW5nQ29sb3JUZXh0dXJlIiksSC5fY29sb3JzVGV4dHVyZSE9PW51bGwmJmJlLnNldFZhbHVlKFUsImJhdGNoaW5nQ29sb3JUZXh0dXJlIixILl9jb2xvcnNUZXh0dXJlLFApKTtjb25zdCByaT1xLm1vcnBoQXR0cmlidXRlcztpZigocmkucG9zaXRpb24hPT12b2lkIDB8fHJpLm5vcm1hbCE9PXZvaWQgMHx8cmkuY29sb3IhPT12b2lkIDApJiZ6dC51cGRhdGUoSCxxLE1pKSwoWG58fE50LnJlY2VpdmVTaGFkb3chPT1ILnJlY2VpdmVTaGFkb3cpJiYoTnQucmVjZWl2ZVNoYWRvdz1ILnJlY2VpdmVTaGFkb3csYmUuc2V0VmFsdWUoVSwicmVjZWl2ZVNoYWRvdyIsSC5yZWNlaXZlU2hhZG93KSksWS5pc01lc2hHb3VyYXVkTWF0ZXJpYWwmJlkuZW52TWFwIT09bnVsbCYmKGlpLmVudk1hcC52YWx1ZT1UdCxpaS5mbGlwRW52TWFwLnZhbHVlPVR0LmlzQ3ViZVRleHR1cmUmJlR0LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExPy0xOjEpLFkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCYmWS5lbnZNYXA9PT1udWxsJiZWLmVudmlyb25tZW50IT09bnVsbCYmKGlpLmVudk1hcEludGVuc2l0eS52YWx1ZT1WLmVudmlyb25tZW50SW50ZW5zaXR5KSxYbiYmKGJlLnNldFZhbHVlKFUsInRvbmVNYXBwaW5nRXhwb3N1cmUiLF8udG9uZU1hcHBpbmdFeHBvc3VyZSksTnQubmVlZHNMaWdodHMmJlhrKGlpLEdsKSxsdCYmWS5mb2c9PT0hMCYmZnQucmVmcmVzaEZvZ1VuaWZvcm1zKGlpLGx0KSxmdC5yZWZyZXNoTWF0ZXJpYWxVbmlmb3JtcyhpaSxZLGssRyxtLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtJLmlkXSksanUudXBsb2FkKFUsZ3coTnQpLGlpLFApKSxZLmlzU2hhZGVyTWF0ZXJpYWwmJlkudW5pZm9ybXNOZWVkVXBkYXRlPT09ITAmJihqdS51cGxvYWQoVSxndyhOdCksaWksUCksWS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpLFkuaXNTcHJpdGVNYXRlcmlhbCYmYmUuc2V0VmFsdWUoVSwiY2VudGVyIixILmNlbnRlciksYmUuc2V0VmFsdWUoVSwibW9kZWxWaWV3TWF0cml4IixILm1vZGVsVmlld01hdHJpeCksYmUuc2V0VmFsdWUoVSwibm9ybWFsTWF0cml4IixILm5vcm1hbE1hdHJpeCksYmUuc2V0VmFsdWUoVSwibW9kZWxNYXRyaXgiLEgubWF0cml4V29ybGQpLFkuaXNTaGFkZXJNYXRlcmlhbHx8WS5pc1Jhd1NoYWRlck1hdGVyaWFsKXtjb25zdCBfbj1ZLnVuaWZvcm1zR3JvdXBzO2ZvcihsZXQgSW49MCxFMD1fbi5sZW5ndGg7SW48RTA7SW4rKyl7Y29uc3QgSHM9X25bSW5dO3oudXBkYXRlKEhzLE1pKSx6LmJpbmQoSHMsTWkpfX1yZXR1cm4gTWl9ZnVuY3Rpb24gWGsoSSxWKXtJLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPVYsSS5saWdodFByb2JlLm5lZWRzVXBkYXRlPVYsSS5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZT1WLEkuZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9VixJLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlPVYsSS5wb2ludExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZT1WLEkuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZT1WLEkuc3BvdExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZT1WLEkucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9VixJLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGU9Vn1mdW5jdGlvbiBxayhJKXtyZXR1cm4gSS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fEkuaXNNZXNoVG9vbk1hdGVyaWFsfHxJLmlzTWVzaFBob25nTWF0ZXJpYWx8fEkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8SS5pc1NoYWRvd01hdGVyaWFsfHxJLmlzU2hhZGVyTWF0ZXJpYWwmJkkubGlnaHRzPT09ITB9dGhpcy5nZXRBY3RpdmVDdWJlRmFjZT1mdW5jdGlvbigpe3JldHVybiBifSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEV9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXM9ZnVuY3Rpb24oSSxWLHEpe1ouZ2V0KEkudGV4dHVyZSkuX193ZWJnbFRleHR1cmU9VixaLmdldChJLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmU9cTtjb25zdCBZPVouZ2V0KEkpO1kuX19oYXNFeHRlcm5hbFRleHR1cmVzPSEwLFkuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlcj1xPT09dm9pZCAwLFkuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlcnx8b3QuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKT09PSEwJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBSZW5kZXItdG8tdGV4dHVyZSBleHRlbnNpb24gd2FzIGRpc2FibGVkIGJlY2F1c2UgYW4gZXh0ZXJuYWwgdGV4dHVyZSB3YXMgcHJvdmlkZWQiKSxZLl9fdXNlUmVuZGVyVG9UZXh0dXJlPSExKX0sdGhpcy5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlcj1mdW5jdGlvbihJLFYpe2NvbnN0IHE9Wi5nZXQoSSk7cS5fX3dlYmdsRnJhbWVidWZmZXI9VixxLl9fdXNlRGVmYXVsdEZyYW1lYnVmZmVyPVY9PT12b2lkIDB9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKEksVj0wLHE9MCl7RT1JLGI9VixBPXE7bGV0IFk9ITAsSD1udWxsLGx0PSExLGd0PSExO2lmKEkpe2NvbnN0IFR0PVouZ2V0KEkpO2lmKFR0Ll9fdXNlRGVmYXVsdEZyYW1lYnVmZmVyIT09dm9pZCAwKVcuYmluZEZyYW1lYnVmZmVyKFUuRlJBTUVCVUZGRVIsbnVsbCksWT0hMTtlbHNlIGlmKFR0Ll9fd2ViZ2xGcmFtZWJ1ZmZlcj09PXZvaWQgMClQLnNldHVwUmVuZGVyVGFyZ2V0KEkpO2Vsc2UgaWYoVHQuX19oYXNFeHRlcm5hbFRleHR1cmVzKVAucmViaW5kVGV4dHVyZXMoSSxaLmdldChJLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLFouZ2V0KEkuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSk7ZWxzZSBpZihJLmRlcHRoQnVmZmVyKXtjb25zdCBVdD1JLmRlcHRoVGV4dHVyZTtpZihUdC5fX2JvdW5kRGVwdGhUZXh0dXJlIT09VXQpe2lmKFV0IT09bnVsbCYmWi5oYXMoVXQpJiYoSS53aWR0aCE9PVV0LmltYWdlLndpZHRofHxJLmhlaWdodCE9PVV0LmltYWdlLmhlaWdodCkpdGhyb3cgbmV3IEVycm9yKCJXZWJHTFJlbmRlclRhcmdldDogQXR0YWNoZWQgRGVwdGhUZXh0dXJlIGlzIGluaXRpYWxpemVkIHRvIHRoZSBpbmNvcnJlY3Qgc2l6ZS4iKTtQLnNldHVwRGVwdGhSZW5kZXJidWZmZXIoSSl9fWNvbnN0IEd0PUkudGV4dHVyZTsoR3QuaXNEYXRhM0RUZXh0dXJlfHxHdC5pc0RhdGFBcnJheVRleHR1cmV8fEd0LmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkmJihndD0hMCk7Y29uc3QgcXQ9Wi5nZXQoSSkuX193ZWJnbEZyYW1lYnVmZmVyO0kuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ/KEFycmF5LmlzQXJyYXkocXRbVl0pP0g9cXRbVl1bcV06SD1xdFtWXSxsdD0hMCk6SS5zYW1wbGVzPjAmJlAudXNlTXVsdGlzYW1wbGVkUlRUKEkpPT09ITE/SD1aLmdldChJKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6QXJyYXkuaXNBcnJheShxdCk/SD1xdFtxXTpIPXF0LFQuY29weShJLnZpZXdwb3J0KSxELmNvcHkoSS5zY2lzc29yKSxMPUkuc2Npc3NvclRlc3R9ZWxzZSBULmNvcHkoaHQpLm11bHRpcGx5U2NhbGFyKGspLmZsb29yKCksRC5jb3B5KFB0KS5tdWx0aXBseVNjYWxhcihrKS5mbG9vcigpLEw9WHQ7aWYoVy5iaW5kRnJhbWVidWZmZXIoVS5GUkFNRUJVRkZFUixIKSYmWSYmVy5kcmF3QnVmZmVycyhJLEgpLFcudmlld3BvcnQoVCksVy5zY2lzc29yKEQpLFcuc2V0U2Npc3NvclRlc3QoTCksbHQpe2NvbnN0IFR0PVouZ2V0KEkudGV4dHVyZSk7VS5mcmFtZWJ1ZmZlclRleHR1cmUyRChVLkZSQU1FQlVGRkVSLFUuQ09MT1JfQVRUQUNITUVOVDAsVS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grVixUdC5fX3dlYmdsVGV4dHVyZSxxKX1lbHNlIGlmKGd0KXtjb25zdCBUdD1aLmdldChJLnRleHR1cmUpLEd0PVZ8fDA7VS5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihVLkZSQU1FQlVGRkVSLFUuQ09MT1JfQVRUQUNITUVOVDAsVHQuX193ZWJnbFRleHR1cmUscXx8MCxHdCl9dz0tMX0sdGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzPWZ1bmN0aW9uKEksVixxLFksSCxsdCxndCl7aWYoIShJJiZJLmlzV2ViR0xSZW5kZXJUYXJnZXQpKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIik7cmV0dXJufWxldCBBdD1aLmdldChJKS5fX3dlYmdsRnJhbWVidWZmZXI7aWYoSS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCYmZ3QhPT12b2lkIDAmJihBdD1BdFtndF0pLEF0KXtXLmJpbmRGcmFtZWJ1ZmZlcihVLkZSQU1FQlVGRkVSLEF0KTt0cnl7Y29uc3QgVHQ9SS50ZXh0dXJlLEd0PVR0LmZvcm1hdCxxdD1UdC50eXBlO2lmKCFTdC50ZXh0dXJlRm9ybWF0UmVhZGFibGUoR3QpKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKTtyZXR1cm59aWYoIVN0LnRleHR1cmVUeXBlUmVhZGFibGUocXQpKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuIik7cmV0dXJufVY+PTAmJlY8PUkud2lkdGgtWSYmcT49MCYmcTw9SS5oZWlnaHQtSCYmVS5yZWFkUGl4ZWxzKFYscSxZLEgsWXQuY29udmVydChHdCksWXQuY29udmVydChxdCksbHQpfWZpbmFsbHl7Y29uc3QgVHQ9RSE9PW51bGw/Wi5nZXQoRSkuX193ZWJnbEZyYW1lYnVmZmVyOm51bGw7Vy5iaW5kRnJhbWVidWZmZXIoVS5GUkFNRUJVRkZFUixUdCl9fX0sdGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmM9ZnVuY3Rpb24oSSxWLHEsWSxILGx0LGd0KXtyZXR1cm4gJHModGhpcyxudWxsLGZ1bmN0aW9uKigpe2lmKCEoSSYmSS5pc1dlYkdMUmVuZGVyVGFyZ2V0KSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4iKTtsZXQgQXQ9Wi5nZXQoSSkuX193ZWJnbEZyYW1lYnVmZmVyO2lmKEkuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQmJmd0IT09dm9pZCAwJiYoQXQ9QXRbZ3RdKSxBdCl7Y29uc3QgVHQ9SS50ZXh0dXJlLEd0PVR0LmZvcm1hdCxxdD1UdC50eXBlO2lmKCFTdC50ZXh0dXJlRm9ybWF0UmVhZGFibGUoR3QpKXRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKTtpZighU3QudGV4dHVyZVR5cGVSZWFkYWJsZShxdCkpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKTtpZihWPj0wJiZWPD1JLndpZHRoLVkmJnE+PTAmJnE8PUkuaGVpZ2h0LUgpe1cuYmluZEZyYW1lYnVmZmVyKFUuRlJBTUVCVUZGRVIsQXQpO2NvbnN0IFV0PVUuY3JlYXRlQnVmZmVyKCk7VS5iaW5kQnVmZmVyKFUuUElYRUxfUEFDS19CVUZGRVIsVXQpLFUuYnVmZmVyRGF0YShVLlBJWEVMX1BBQ0tfQlVGRkVSLGx0LmJ5dGVMZW5ndGgsVS5TVFJFQU1fUkVBRCksVS5yZWFkUGl4ZWxzKFYscSxZLEgsWXQuY29udmVydChHdCksWXQuY29udmVydChxdCksMCk7Y29uc3QgY2U9RSE9PW51bGw/Wi5nZXQoRSkuX193ZWJnbEZyYW1lYnVmZmVyOm51bGw7Vy5iaW5kRnJhbWVidWZmZXIoVS5GUkFNRUJVRkZFUixjZSk7Y29uc3QgZmU9VS5mZW5jZVN5bmMoVS5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwwKTtyZXR1cm4gVS5mbHVzaCgpLHlpZWxkIFNBKFUsZmUsNCksVS5iaW5kQnVmZmVyKFUuUElYRUxfUEFDS19CVUZGRVIsVXQpLFUuZ2V0QnVmZmVyU3ViRGF0YShVLlBJWEVMX1BBQ0tfQlVGRkVSLDAsbHQpLFUuZGVsZXRlQnVmZmVyKFV0KSxVLmRlbGV0ZVN5bmMoZmUpLGx0fWVsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVxdWVzdGVkIHJlYWQgYm91bmRzIGFyZSBvdXQgb2YgcmFuZ2UuIil9fSl9LHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlPWZ1bmN0aW9uKEksVj1udWxsLHE9MCl7SS5pc1RleHR1cmUhPT0hMCYmKFFzKCJXZWJHTFJlbmRlcmVyOiBjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkLiIpLFY9YXJndW1lbnRzWzBdfHxudWxsLEk9YXJndW1lbnRzWzFdKTtjb25zdCBZPU1hdGgucG93KDIsLXEpLEg9TWF0aC5mbG9vcihJLmltYWdlLndpZHRoKlkpLGx0PU1hdGguZmxvb3IoSS5pbWFnZS5oZWlnaHQqWSksZ3Q9ViE9PW51bGw/Vi54OjAsQXQ9ViE9PW51bGw/Vi55OjA7UC5zZXRUZXh0dXJlMkQoSSwwKSxVLmNvcHlUZXhTdWJJbWFnZTJEKFUuVEVYVFVSRV8yRCxxLDAsMCxndCxBdCxILGx0KSxXLnVuYmluZFRleHR1cmUoKX07Y29uc3QgWWs9VS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFprPVUuY3JlYXRlRnJhbWVidWZmZXIoKTt0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKEksVixxPW51bGwsWT1udWxsLEg9MCxsdD1udWxsKXtJLmlzVGV4dHVyZSE9PSEwJiYoUXMoIldlYkdMUmVuZGVyZXI6IGNvcHlUZXh0dXJlVG9UZXh0dXJlIGZ1bmN0aW9uIHNpZ25hdHVyZSBoYXMgY2hhbmdlZC4iKSxZPWFyZ3VtZW50c1swXXx8bnVsbCxJPWFyZ3VtZW50c1sxXSxWPWFyZ3VtZW50c1syXSxsdD1hcmd1bWVudHNbM118fDAscT1udWxsKSxsdD09PW51bGwmJihIIT09MD8oUXMoIldlYkdMUmVuZGVyZXI6IGNvcHlUZXh0dXJlVG9UZXh0dXJlIGZ1bmN0aW9uIHNpZ25hdHVyZSBoYXMgY2hhbmdlZCB0byBzdXBwb3J0IHNyYyBhbmQgZHN0IG1pcG1hcCBsZXZlbHMuIiksbHQ9SCxIPTApOmx0PTApO2xldCBndCxBdCxUdCxHdCxxdCxVdCxjZSxmZSxrZTtjb25zdCBEZT1JLmlzQ29tcHJlc3NlZFRleHR1cmU/SS5taXBtYXBzW2x0XTpJLmltYWdlO2lmKHEhPT1udWxsKWd0PXEubWF4LngtcS5taW4ueCxBdD1xLm1heC55LXEubWluLnksVHQ9cS5pc0JveDM/cS5tYXguei1xLm1pbi56OjEsR3Q9cS5taW4ueCxxdD1xLm1pbi55LFV0PXEuaXNCb3gzP3EubWluLno6MDtlbHNle2NvbnN0IHJpPU1hdGgucG93KDIsLUgpO2d0PU1hdGguZmxvb3IoRGUud2lkdGgqcmkpLEF0PU1hdGguZmxvb3IoRGUuaGVpZ2h0KnJpKSxJLmlzRGF0YUFycmF5VGV4dHVyZT9UdD1EZS5kZXB0aDpJLmlzRGF0YTNEVGV4dHVyZT9UdD1NYXRoLmZsb29yKERlLmRlcHRoKnJpKTpUdD0xLEd0PTAscXQ9MCxVdD0wfVkhPT1udWxsPyhjZT1ZLngsZmU9WS55LGtlPVkueik6KGNlPTAsZmU9MCxrZT0wKTtjb25zdCB1ZT1ZdC5jb252ZXJ0KFYuZm9ybWF0KSxOdD1ZdC5jb252ZXJ0KFYudHlwZSk7bGV0IFplO1YuaXNEYXRhM0RUZXh0dXJlPyhQLnNldFRleHR1cmUzRChWLDApLFplPVUuVEVYVFVSRV8zRCk6Vi5pc0RhdGFBcnJheVRleHR1cmV8fFYuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlPyhQLnNldFRleHR1cmUyREFycmF5KFYsMCksWmU9VS5URVhUVVJFXzJEX0FSUkFZKTooUC5zZXRUZXh0dXJlMkQoViwwKSxaZT1VLlRFWFRVUkVfMkQpLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfRkxJUF9ZX1dFQkdMLFYuZmxpcFkpLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsVi5wcmVtdWx0aXBseUFscGhhKSxVLnBpeGVsU3RvcmVpKFUuVU5QQUNLX0FMSUdOTUVOVCxWLnVucGFja0FsaWdubWVudCk7Y29uc3QgZGU9VS5nZXRQYXJhbWV0ZXIoVS5VTlBBQ0tfUk9XX0xFTkdUSCksTWk9VS5nZXRQYXJhbWV0ZXIoVS5VTlBBQ0tfSU1BR0VfSEVJR0hUKSxvYT1VLmdldFBhcmFtZXRlcihVLlVOUEFDS19TS0lQX1BJWEVMUyksWG49VS5nZXRQYXJhbWV0ZXIoVS5VTlBBQ0tfU0tJUF9ST1dTKSxHbD1VLmdldFBhcmFtZXRlcihVLlVOUEFDS19TS0lQX0lNQUdFUyk7VS5waXhlbFN0b3JlaShVLlVOUEFDS19ST1dfTEVOR1RILERlLndpZHRoKSxVLnBpeGVsU3RvcmVpKFUuVU5QQUNLX0lNQUdFX0hFSUdIVCxEZS5oZWlnaHQpLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfU0tJUF9QSVhFTFMsR3QpLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfU0tJUF9ST1dTLHF0KSxVLnBpeGVsU3RvcmVpKFUuVU5QQUNLX1NLSVBfSU1BR0VTLFV0KTtjb25zdCBiZT1JLmlzRGF0YUFycmF5VGV4dHVyZXx8SS5pc0RhdGEzRFRleHR1cmUsaWk9Vi5pc0RhdGFBcnJheVRleHR1cmV8fFYuaXNEYXRhM0RUZXh0dXJlO2lmKEkuaXNEZXB0aFRleHR1cmUpe2NvbnN0IHJpPVouZ2V0KEkpLF9uPVouZ2V0KFYpLEluPVouZ2V0KHJpLl9fcmVuZGVyVGFyZ2V0KSxFMD1aLmdldChfbi5fX3JlbmRlclRhcmdldCk7Vy5iaW5kRnJhbWVidWZmZXIoVS5SRUFEX0ZSQU1FQlVGRkVSLEluLl9fd2ViZ2xGcmFtZWJ1ZmZlciksVy5iaW5kRnJhbWVidWZmZXIoVS5EUkFXX0ZSQU1FQlVGRkVSLEUwLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7Zm9yKGxldCBIcz0wO0hzPFR0O0hzKyspYmUmJihVLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKFUuUkVBRF9GUkFNRUJVRkZFUixVLkNPTE9SX0FUVEFDSE1FTlQwLFouZ2V0KEkpLl9fd2ViZ2xUZXh0dXJlLEgsVXQrSHMpLFUuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoVS5EUkFXX0ZSQU1FQlVGRkVSLFUuQ09MT1JfQVRUQUNITUVOVDAsWi5nZXQoVikuX193ZWJnbFRleHR1cmUsbHQsa2UrSHMpKSxVLmJsaXRGcmFtZWJ1ZmZlcihHdCxxdCxndCxBdCxjZSxmZSxndCxBdCxVLkRFUFRIX0JVRkZFUl9CSVQsVS5ORUFSRVNUKTtXLmJpbmRGcmFtZWJ1ZmZlcihVLlJFQURfRlJBTUVCVUZGRVIsbnVsbCksVy5iaW5kRnJhbWVidWZmZXIoVS5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpfWVsc2UgaWYoSCE9PTB8fEkuaXNSZW5kZXJUYXJnZXRUZXh0dXJlfHxaLmhhcyhJKSl7Y29uc3Qgcmk9Wi5nZXQoSSksX249Wi5nZXQoVik7Vy5iaW5kRnJhbWVidWZmZXIoVS5SRUFEX0ZSQU1FQlVGRkVSLFlrKSxXLmJpbmRGcmFtZWJ1ZmZlcihVLkRSQVdfRlJBTUVCVUZGRVIsWmspO2ZvcihsZXQgSW49MDtJbjxUdDtJbisrKWJlP1UuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoVS5SRUFEX0ZSQU1FQlVGRkVSLFUuQ09MT1JfQVRUQUNITUVOVDAscmkuX193ZWJnbFRleHR1cmUsSCxVdCtJbik6VS5mcmFtZWJ1ZmZlclRleHR1cmUyRChVLlJFQURfRlJBTUVCVUZGRVIsVS5DT0xPUl9BVFRBQ0hNRU5UMCxVLlRFWFRVUkVfMkQscmkuX193ZWJnbFRleHR1cmUsSCksaWk/VS5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihVLkRSQVdfRlJBTUVCVUZGRVIsVS5DT0xPUl9BVFRBQ0hNRU5UMCxfbi5fX3dlYmdsVGV4dHVyZSxsdCxrZStJbik6VS5mcmFtZWJ1ZmZlclRleHR1cmUyRChVLkRSQVdfRlJBTUVCVUZGRVIsVS5DT0xPUl9BVFRBQ0hNRU5UMCxVLlRFWFRVUkVfMkQsX24uX193ZWJnbFRleHR1cmUsbHQpLEghPT0wP1UuYmxpdEZyYW1lYnVmZmVyKEd0LHF0LGd0LEF0LGNlLGZlLGd0LEF0LFUuQ09MT1JfQlVGRkVSX0JJVCxVLk5FQVJFU1QpOmlpP1UuY29weVRleFN1YkltYWdlM0QoWmUsbHQsY2UsZmUsa2UrSW4sR3QscXQsZ3QsQXQpOlUuY29weVRleFN1YkltYWdlMkQoWmUsbHQsY2UsZmUsR3QscXQsZ3QsQXQpO1cuYmluZEZyYW1lYnVmZmVyKFUuUkVBRF9GUkFNRUJVRkZFUixudWxsKSxXLmJpbmRGcmFtZWJ1ZmZlcihVLkRSQVdfRlJBTUVCVUZGRVIsbnVsbCl9ZWxzZSBpaT9JLmlzRGF0YVRleHR1cmV8fEkuaXNEYXRhM0RUZXh0dXJlP1UudGV4U3ViSW1hZ2UzRChaZSxsdCxjZSxmZSxrZSxndCxBdCxUdCx1ZSxOdCxEZS5kYXRhKTpWLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZT9VLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKFplLGx0LGNlLGZlLGtlLGd0LEF0LFR0LHVlLERlLmRhdGEpOlUudGV4U3ViSW1hZ2UzRChaZSxsdCxjZSxmZSxrZSxndCxBdCxUdCx1ZSxOdCxEZSk6SS5pc0RhdGFUZXh0dXJlP1UudGV4U3ViSW1hZ2UyRChVLlRFWFRVUkVfMkQsbHQsY2UsZmUsZ3QsQXQsdWUsTnQsRGUuZGF0YSk6SS5pc0NvbXByZXNzZWRUZXh0dXJlP1UuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoVS5URVhUVVJFXzJELGx0LGNlLGZlLERlLndpZHRoLERlLmhlaWdodCx1ZSxEZS5kYXRhKTpVLnRleFN1YkltYWdlMkQoVS5URVhUVVJFXzJELGx0LGNlLGZlLGd0LEF0LHVlLE50LERlKTtVLnBpeGVsU3RvcmVpKFUuVU5QQUNLX1JPV19MRU5HVEgsZGUpLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfSU1BR0VfSEVJR0hULE1pKSxVLnBpeGVsU3RvcmVpKFUuVU5QQUNLX1NLSVBfUElYRUxTLG9hKSxVLnBpeGVsU3RvcmVpKFUuVU5QQUNLX1NLSVBfUk9XUyxYbiksVS5waXhlbFN0b3JlaShVLlVOUEFDS19TS0lQX0lNQUdFUyxHbCksbHQ9PT0wJiZWLmdlbmVyYXRlTWlwbWFwcyYmVS5nZW5lcmF0ZU1pcG1hcChaZSksVy51bmJpbmRUZXh0dXJlKCl9LHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUzRD1mdW5jdGlvbihJLFYscT1udWxsLFk9bnVsbCxIPTApe3JldHVybiBJLmlzVGV4dHVyZSE9PSEwJiYoUXMoIldlYkdMUmVuZGVyZXI6IGNvcHlUZXh0dXJlVG9UZXh0dXJlM0QgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkLiIpLHE9YXJndW1lbnRzWzBdfHxudWxsLFk9YXJndW1lbnRzWzFdfHxudWxsLEk9YXJndW1lbnRzWzJdLFY9YXJndW1lbnRzWzNdLEg9YXJndW1lbnRzWzRdfHwwKSxRcygnV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUzRCBmdW5jdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgImNvcHlUZXh0dXJlVG9UZXh0dXJlIiBpbnN0ZWFkLicpLHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUoSSxWLHEsWSxIKX0sdGhpcy5pbml0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKEkpe1ouZ2V0KEkpLl9fd2ViZ2xGcmFtZWJ1ZmZlcj09PXZvaWQgMCYmUC5zZXR1cFJlbmRlclRhcmdldChJKX0sdGhpcy5pbml0VGV4dHVyZT1mdW5jdGlvbihJKXtJLmlzQ3ViZVRleHR1cmU/UC5zZXRUZXh0dXJlQ3ViZShJLDApOkkuaXNEYXRhM0RUZXh0dXJlP1Auc2V0VGV4dHVyZTNEKEksMCk6SS5pc0RhdGFBcnJheVRleHR1cmV8fEkuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlP1Auc2V0VGV4dHVyZTJEQXJyYXkoSSwwKTpQLnNldFRleHR1cmUyRChJLDApLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLnJlc2V0U3RhdGU9ZnVuY3Rpb24oKXtiPTAsQT0wLEU9bnVsbCxXLnJlc2V0KCksdmUucmVzZXQoKX0sdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JzZXJ2ZSIse2RldGFpbDp0aGlzfSkpfWdldCBjb29yZGluYXRlU3lzdGVtKCl7cmV0dXJuIEVpfWdldCBvdXRwdXRDb2xvclNwYWNlKCl7cmV0dXJuIHRoaXMuX291dHB1dENvbG9yU3BhY2V9c2V0IG91dHB1dENvbG9yU3BhY2UodCl7dGhpcy5fb3V0cHV0Q29sb3JTcGFjZT10O2NvbnN0IGU9dGhpcy5nZXRDb250ZXh0KCk7ZS5kcmF3aW5nQnVmZmVyQ29sb3JzcGFjZT1yZS5fZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2UodCksZS51bnBhY2tDb2xvclNwYWNlPXJlLl9nZXRVbnBhY2tDb2xvclNwYWNlKCl9fXZhciBLST1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxBQ0VTRmlsbWljVG9uZU1hcHBpbmc6ajAsQWRkRXF1YXRpb246cHIsQWRkT3BlcmF0aW9uOnEwLEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlOmRkLEFkZGl0aXZlQmxlbmRpbmc6UWYsQWdYVG9uZU1hcHBpbmc6UTAsQWxwaGFGb3JtYXQ6YWQsQWx3YXlzQ29tcGFyZTpweSxBbHdheXNEZXB0aDpYbCxBbHdheXNTdGVuY2lsRnVuYzpwZCxBbWJpZW50TGlnaHQ6dHgsQW5pbWF0aW9uQWN0aW9uOnl4LEFuaW1hdGlvbkNsaXA6UWEsQW5pbWF0aW9uTG9hZGVyOiRFLEFuaW1hdGlvbk1peGVyOnZULEFuaW1hdGlvbk9iamVjdEdyb3VwOl9ULEFuaW1hdGlvblV0aWxzOlZFLEFyY0N1cnZlOm1fLEFycmF5Q2FtZXJhOnV4LEFycm93SGVscGVyOlZULEF0dGFjaGVkQmluZE1vZGU6bmQsQXVkaW86cHgsQXVkaW9BbmFseXNlcjpsVCxBdWRpb0NvbnRleHQ6YnAsQXVkaW9MaXN0ZW5lcjpzVCxBdWRpb0xvYWRlcjpuVCxBeGVzSGVscGVyOkdULEJhY2tTaWRlOkplLEJhc2ljRGVwdGhQYWNraW5nOnN5LEJhc2ljU2hhZG93TWFwOkhyLEJhdGNoZWRNZXNoOm9fLEJvbmU6V2QsQm9vbGVhbktleWZyYW1lVHJhY2s6ZnMsQm94MjpDVCxCb3gzOm1lLEJveDNIZWxwZXI6elQsQm94R2VvbWV0cnk6cnMsQm94SGVscGVyOk9ULEJ1ZmZlckF0dHJpYnV0ZTpKdCxCdWZmZXJHZW9tZXRyeTpGdCxCdWZmZXJHZW9tZXRyeUxvYWRlcjpzeCxCeXRlVHlwZTpyZCxDYWNoZTpqaSxDYW1lcmE6S2MsQ2FtZXJhSGVscGVyOkJULENhbnZhc1RleHR1cmU6aEUsQ2Fwc3VsZUdlb21ldHJ5Ok11LENhdG11bGxSb21DdXJ2ZTM6Z18sQ2luZW9uVG9uZU1hcHBpbmc6SjAsQ2lyY2xlR2VvbWV0cnk6YnUsQ2xhbXBUb0VkZ2VXcmFwcGluZzpxbixDbG9jazpoeCxDb2xvcjp4dCxDb2xvcktleWZyYW1lVHJhY2s6eXAsQ29sb3JNYW5hZ2VtZW50OnJlLENvbXByZXNzZWRBcnJheVRleHR1cmU6Y0UsQ29tcHJlc3NlZEN1YmVUZXh0dXJlOnVFLENvbXByZXNzZWRUZXh0dXJlOl91LENvbXByZXNzZWRUZXh0dXJlTG9hZGVyOlhFLENvbmVHZW9tZXRyeTp3dSxDb25zdGFudEFscGhhRmFjdG9yOlcwLENvbnN0YW50Q29sb3JGYWN0b3I6RzAsQ29udHJvbHM6V1QsQ3ViZUNhbWVyYTpreSxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6a2ksQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOm1yLEN1YmVUZXh0dXJlOklhLEN1YmVUZXh0dXJlTG9hZGVyOnFFLEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOnFzLEN1YmljQmV6aWVyQ3VydmU6aXAsQ3ViaWNCZXppZXJDdXJ2ZTM6X18sQ3ViaWNJbnRlcnBvbGFudDpIXyxDdWxsRmFjZUJhY2s6TG4sQ3VsbEZhY2VGcm9udDpEbixDdWxsRmFjZUZyb250QmFjazpCaSxDdWxsRmFjZU5vbmU6QmUsQ3VydmU6ZmksQ3VydmVQYXRoOnZfLEN1c3RvbUJsZW5kaW5nOkMwLEN1c3RvbVRvbmVNYXBwaW5nOkswLEN5bGluZGVyR2VvbWV0cnk6TW8sQ3lsaW5kcmljYWw6VFQsRGF0YTNEVGV4dHVyZTp2ZCxEYXRhQXJyYXlUZXh0dXJlOlVjLERhdGFUZXh0dXJlOkNpLERhdGFUZXh0dXJlTG9hZGVyOllFLERhdGFVdGlsczpPQSxEZWNyZW1lbnRTdGVuY2lsT3A6QncsRGVjcmVtZW50V3JhcFN0ZW5jaWxPcDp6dyxEZWZhdWx0TG9hZGluZ01hbmFnZXI6WF8sRGVwdGhGb3JtYXQ6cXIsRGVwdGhTdGVuY2lsRm9ybWF0OllyLERlcHRoVGV4dHVyZTpLZCxEZXRhY2hlZEJpbmRNb2RlOmV5LERpcmVjdGlvbmFsTGlnaHQ6UV8sRGlyZWN0aW9uYWxMaWdodEhlbHBlcjpGVCxEaXNjcmV0ZUludGVycG9sYW50OldfLERvZGVjYWhlZHJvbkdlb21ldHJ5OkF1LERvdWJsZVNpZGU6VW4sRHN0QWxwaGFGYWN0b3I6QjAsRHN0Q29sb3JGYWN0b3I6ejAsRHluYW1pY0NvcHlVc2FnZTp0QSxEeW5hbWljRHJhd1VzYWdlOll3LER5bmFtaWNSZWFkVXNhZ2U6ancsRWRnZXNHZW9tZXRyeTpTXyxFbGxpcHNlQ3VydmU6eHUsRXF1YWxDb21wYXJlOnV5LEVxdWFsRGVwdGg6WWwsRXF1YWxTdGVuY2lsRnVuYzpIdyxFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzpsYSxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpjYSxFdWxlcjpCbixFdmVudERpc3BhdGNoZXI6VGksRXh0cnVkZUdlb21ldHJ5OkNfLEZpbGVMb2FkZXI6UWksRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZTpXQSxGbG9hdDMyQnVmZmVyQXR0cmlidXRlOk10LEZsb2F0VHlwZTp2bixGb2c6dHUsRm9nRXhwMjpRYyxGcmFtZWJ1ZmZlclRleHR1cmU6bEUsRnJvbnRTaWRlOnNpLEZydXN0dW06QmEsR0xCdWZmZXJBdHRyaWJ1dGU6d1QsR0xTTDE6bkEsR0xTTDM6Z2QsR3JlYXRlckNvbXBhcmU6aHksR3JlYXRlckRlcHRoOkpsLEdyZWF0ZXJFcXVhbENvbXBhcmU6ZHksR3JlYXRlckVxdWFsRGVwdGg6WmwsR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6cXcsR3JlYXRlclN0ZW5jaWxGdW5jOiR3LEdyaWRIZWxwZXI6VVQsR3JvdXA6U28sSGFsZkZsb2F0VHlwZTpKcyxIZW1pc3BoZXJlTGlnaHQ6cV8sSGVtaXNwaGVyZUxpZ2h0SGVscGVyOkRULEljb3NhaGVkcm9uR2VvbWV0cnk6THUsSW1hZ2VCaXRtYXBMb2FkZXI6ZVQsSW1hZ2VMb2FkZXI6dGwsSW1hZ2VVdGlsczpTeSxJbmNyZW1lbnRTdGVuY2lsT3A6RncsSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDpPdyxJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6eG8sSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6cngsSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6YlQsSW5zdGFuY2VkTWVzaDpyXyxJbnQxNkJ1ZmZlckF0dHJpYnV0ZTpHQSxJbnQzMkJ1ZmZlckF0dHJpYnV0ZTpIQSxJbnQ4QnVmZmVyQXR0cmlidXRlOnpBLEludFR5cGU6UWwsSW50ZXJsZWF2ZWRCdWZmZXI6ZXUsSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6c3MsSW50ZXJwb2xhbnQ6WmEsSW50ZXJwb2xhdGVEaXNjcmV0ZTp4YSxJbnRlcnBvbGF0ZUxpbmVhcjpJYyxJbnRlcnBvbGF0ZVNtb290aDpMYyxJbnZlcnRTdGVuY2lsT3A6a3csS2VlcFN0ZW5jaWxPcDpLcixLZXlmcmFtZVRyYWNrOmRpLExPRDpZeSxMYXRoZUdlb21ldHJ5OkhhLExheWVyczpWYyxMZXNzQ29tcGFyZTpjeSxMZXNzRGVwdGg6cWwsTGVzc0VxdWFsQ29tcGFyZTptZCxMZXNzRXF1YWxEZXB0aDokcixMZXNzRXF1YWxTdGVuY2lsRnVuYzpXdyxMZXNzU3RlbmNpbEZ1bmM6R3csTGlnaHQ6VHIsTGlnaHRQcm9iZTppeCxMaW5lOkFyLExpbmUzOmtuLExpbmVCYXNpY01hdGVyaWFsOmhuLExpbmVDdXJ2ZTpycCxMaW5lQ3VydmUzOnhfLExpbmVEYXNoZWRNYXRlcmlhbDprXyxMaW5lTG9vcDpoXyxMaW5lU2VnbWVudHM6UmksTGluZWFyRmlsdGVyOlZlLExpbmVhckludGVycG9sYW50OmdwLExpbmVhck1pcE1hcExpbmVhckZpbHRlcjpUdyxMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOkV3LExpbmVhck1pcG1hcExpbmVhckZpbHRlcjp3aSxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOmZhLExpbmVhclNSR0JDb2xvclNwYWNlOmpyLExpbmVhclRvbmVNYXBwaW5nOlkwLExpbmVhclRyYW5zZmVyOlNhLExvYWRlcjpBbixMb2FkZXJVdGlsczpNcCxMb2FkaW5nTWFuYWdlcjpfcCxMb29wT25jZTpueSxMb29wUGluZ1Bvbmc6cnksTG9vcFJlcGVhdDppeSxMdW1pbmFuY2VBbHBoYUZvcm1hdDp1ZCxMdW1pbmFuY2VGb3JtYXQ6Y2QsTU9VU0U6b2UsTWF0ZXJpYWw6UWUsTWF0ZXJpYWxMb2FkZXI6a3UsTWF0aFV0aWxzOnhBLE1hdHJpeDI6Q3AsTWF0cml4MzpXdCxNYXRyaXg0OlJ0LE1heEVxdWF0aW9uOkwwLE1lc2g6VWUsTWVzaEJhc2ljTWF0ZXJpYWw6YnIsTWVzaERlcHRoTWF0ZXJpYWw6ZnAsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ZHAsTWVzaExhbWJlcnRNYXRlcmlhbDpPXyxNZXNoTWF0Y2FwTWF0ZXJpYWw6el8sTWVzaE5vcm1hbE1hdGVyaWFsOkJfLE1lc2hQaG9uZ01hdGVyaWFsOk5fLE1lc2hQaHlzaWNhbE1hdGVyaWFsOlVfLE1lc2hTdGFuZGFyZE1hdGVyaWFsOmhwLE1lc2hUb29uTWF0ZXJpYWw6Rl8sTWluRXF1YXRpb246STAsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpoYSxNaXhPcGVyYXRpb246WDAsTXVsdGlwbHlCbGVuZGluZzplZCxNdWx0aXBseU9wZXJhdGlvbjphYSxOZWFyZXN0RmlsdGVyOlhlLE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6QXcsTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6d3csTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjpZcyxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcjppZCxOZXV0cmFsVG9uZU1hcHBpbmc6dHksTmV2ZXJDb21wYXJlOmx5LE5ldmVyRGVwdGg6JGwsTmV2ZXJTdGVuY2lsRnVuYzpWdyxOb0JsZW5kaW5nOk9pLE5vQ29sb3JTcGFjZTpHaSxOb1RvbmVNYXBwaW5nOnppLE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZTpEYyxOb3JtYWxCbGVuZGluZzpXcixOb3RFcXVhbENvbXBhcmU6ZnksTm90RXF1YWxEZXB0aDpqbCxOb3RFcXVhbFN0ZW5jaWxGdW5jOlh3LE51bWJlcktleWZyYW1lVHJhY2s6SmEsT2JqZWN0M0Q6YWUsT2JqZWN0TG9hZGVyOlFFLE9iamVjdFNwYWNlTm9ybWFsTWFwOmF5LE9jdGFoZWRyb25HZW9tZXRyeTpxYSxPbmVGYWN0b3I6VTAsT25lTWludXNDb25zdGFudEFscGhhRmFjdG9yOiQwLE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvcjpIMCxPbmVNaW51c0RzdEFscGhhRmFjdG9yOk8wLE9uZU1pbnVzRHN0Q29sb3JGYWN0b3I6azAsT25lTWludXNTcmNBbHBoYUZhY3RvcjpXbCxPbmVNaW51c1NyY0NvbG9yRmFjdG9yOkYwLE9ydGhvZ3JhcGhpY0NhbWVyYTp6dSxQQ0ZTaGFkb3dNYXA6eG4sUENGU29mdFNoYWRvd01hcDpYcyxQTVJFTUdlbmVyYXRvcjpCcCxQYXRoOkdhLFBlcnNwZWN0aXZlQ2FtZXJhOlllLFBsYW5lOmhpLFBsYW5lR2VvbWV0cnk6dXMsUGxhbmVIZWxwZXI6a1QsUG9pbnRMaWdodDpLXyxQb2ludExpZ2h0SGVscGVyOklULFBvaW50czpkXyxQb2ludHNNYXRlcmlhbDpKZCxQb2xhckdyaWRIZWxwZXI6TlQsUG9seWhlZHJvbkdlb21ldHJ5OkVyLFBvc2l0aW9uYWxBdWRpbzphVCxQcm9wZXJ0eUJpbmRpbmc6bGUsUHJvcGVydHlNaXhlcjpneCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpzcCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6b3AsUXVhdGVybmlvbjpNbixRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjazpqYSxRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQ6JF8sUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdDpSYyxSRURfUkdUQzFfRm9ybWF0OmZkLFJFVklTSU9OOm5lLFJHQkFEZXB0aFBhY2tpbmc6b3ksUkdCQUZvcm1hdDphbixSR0JBSW50ZWdlckZvcm1hdDpyYyxSR0JBX0FTVENfMTB4MTBfRm9ybWF0OmJjLFJHQkFfQVNUQ18xMHg1X0Zvcm1hdDp2YyxSR0JBX0FTVENfMTB4Nl9Gb3JtYXQ6U2MsUkdCQV9BU1RDXzEweDhfRm9ybWF0Ok1jLFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQ6d2MsUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdDpBYyxSR0JBX0FTVENfNHg0X0Zvcm1hdDpmYyxSR0JBX0FTVENfNXg0X0Zvcm1hdDpkYyxSR0JBX0FTVENfNXg1X0Zvcm1hdDpwYyxSR0JBX0FTVENfNng1X0Zvcm1hdDptYyxSR0JBX0FTVENfNng2X0Zvcm1hdDpnYyxSR0JBX0FTVENfOHg1X0Zvcm1hdDp5YyxSR0JBX0FTVENfOHg2X0Zvcm1hdDpfYyxSR0JBX0FTVENfOHg4X0Zvcm1hdDp4YyxSR0JBX0JQVENfRm9ybWF0Ol9hLFJHQkFfRVRDMl9FQUNfRm9ybWF0OmhjLFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdDpsYyxSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6YWMsUkdCQV9TM1RDX0RYVDFfRm9ybWF0Om1hLFJHQkFfUzNUQ19EWFQzX0Zvcm1hdDpnYSxSR0JBX1MzVENfRFhUNV9Gb3JtYXQ6eWEsUkdCRGVwdGhQYWNraW5nOkx3LFJHQkZvcm1hdDpsZCxSR0JJbnRlZ2VyRm9ybWF0OkN3LFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQ6RWMsUkdCX0JQVENfVU5TSUdORURfRm9ybWF0OlRjLFJHQl9FVEMxX0Zvcm1hdDpjYyxSR0JfRVRDMl9Gb3JtYXQ6dWMsUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQ6b2MsUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6c2MsUkdCX1MzVENfRFhUMV9Gb3JtYXQ6cGEsUkdEZXB0aFBhY2tpbmc6RHcsUkdGb3JtYXQ6aGQsUkdJbnRlZ2VyRm9ybWF0OmljLFJhd1NoYWRlck1hdGVyaWFsOkRfLFJheTp2cixSYXljYXN0ZXI6QVQsUmVjdEFyZWFMaWdodDpleCxSZWRGb3JtYXQ6bmMsUmVkSW50ZWdlckZvcm1hdDpkYSxSZWluaGFyZFRvbmVNYXBwaW5nOlowLFJlbmRlclRhcmdldDpNeSxSZXBlYXRXcmFwcGluZzp1YSxSZXBsYWNlU3RlbmNpbE9wOk53LFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uOlAwLFJpbmdHZW9tZXRyeTpEdSxTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdDpQYyxTSUdORURfUkVEX1JHVEMxX0Zvcm1hdDpDYyxTUkdCQ29sb3JTcGFjZTpTbixTUkdCVHJhbnNmZXI6cGUsU2NlbmU6R3ksU2hhZGVyQ2h1bms6anQsU2hhZGVyTGliOnBpLFNoYWRlck1hdGVyaWFsOnVpLFNoYWRvd01hdGVyaWFsOkxfLFNoYXBlOkppLFNoYXBlR2VvbWV0cnk6VXUsU2hhcGVQYXRoOkhULFNoYXBlVXRpbHM6em4sU2hvcnRUeXBlOnNkLFNrZWxldG9uOmF1LFNrZWxldG9uSGVscGVyOlBULFNraW5uZWRNZXNoOnRfLFNvdXJjZTp0cyxTcGhlcmU6cWUsU3BoZXJlR2VvbWV0cnk6WWEsU3BoZXJpY2FsOkVULFNwaGVyaWNhbEhhcm1vbmljczM6bngsU3BsaW5lQ3VydmU6YXAsU3BvdExpZ2h0OkpfLFNwb3RMaWdodEhlbHBlcjpSVCxTcHJpdGU6WHksU3ByaXRlTWF0ZXJpYWw6a2QsU3JjQWxwaGFGYWN0b3I6SGwsU3JjQWxwaGFTYXR1cmF0ZUZhY3RvcjpWMCxTcmNDb2xvckZhY3RvcjpOMCxTdGF0aWNDb3B5VXNhZ2U6UXcsU3RhdGljRHJhd1VzYWdlOk1hLFN0YXRpY1JlYWRVc2FnZTpKdyxTdGVyZW9DYW1lcmE6aVQsU3RyZWFtQ29weVVzYWdlOmVBLFN0cmVhbURyYXdVc2FnZTpadyxTdHJlYW1SZWFkVXNhZ2U6S3csU3RyaW5nS2V5ZnJhbWVUcmFjazpkcyxTdWJ0cmFjdEVxdWF0aW9uOlIwLFN1YnRyYWN0aXZlQmxlbmRpbmc6dGQsVE9VQ0g6U2UsVGFuZ2VudFNwYWNlTm9ybWFsTWFwOmdyLFRldHJhaGVkcm9uR2VvbWV0cnk6TnUsVGV4dHVyZTpUZSxUZXh0dXJlTG9hZGVyOlpFLFRleHR1cmVVdGlsczpaVCxUb3J1c0dlb21ldHJ5OkZ1LFRvcnVzS25vdEdlb21ldHJ5OkJ1LFRyaWFuZ2xlOl9lLFRyaWFuZ2xlRmFuRHJhd01vZGU6SXcsVHJpYW5nbGVTdHJpcERyYXdNb2RlOlB3LFRyaWFuZ2xlc0RyYXdNb2RlOlJ3LFR1YmVHZW9tZXRyeTpPdSxVVk1hcHBpbmc6S2wsVWludDE2QnVmZmVyQXR0cmlidXRlOkZkLFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTpCZCxVaW50OEJ1ZmZlckF0dHJpYnV0ZTprQSxVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU6VkEsVW5pZm9ybTpFcCxVbmlmb3Jtc0dyb3VwOk1ULFVuaWZvcm1zTGliOnB0LFVuaWZvcm1zVXRpbHM6QnksVW5zaWduZWRCeXRlVHlwZTpBaSxVbnNpZ25lZEludDI0OFR5cGU6WHIsVW5zaWduZWRJbnQ1OTk5VHlwZTpvZCxVbnNpZ25lZEludFR5cGU6VmksVW5zaWduZWRTaG9ydDQ0NDRUeXBlOnRjLFVuc2lnbmVkU2hvcnQ1NTUxVHlwZTplYyxVbnNpZ25lZFNob3J0VHlwZTpacyxWU01TaGFkb3dNYXA6YmksVmVjdG9yMjpYLFZlY3RvcjM6UixWZWN0b3I0OlF0LFZlY3RvcktleWZyYW1lVHJhY2s6S2EsVmlkZW9UZXh0dXJlOmFFLFdlYkdMM0RSZW5kZXJUYXJnZXQ6Q0EsV2ViR0xBcnJheVJlbmRlclRhcmdldDpUQSxXZWJHTENvb3JkaW5hdGVTeXN0ZW06RWksV2ViR0xDdWJlUmVuZGVyVGFyZ2V0OlZ5LFdlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzOkpULFdlYkdMUmVuZGVyVGFyZ2V0Om9pLFdlYkdMUmVuZGVyZXI6akksV2ViR0xVdGlsczppdixXZWJHUFVDb29yZGluYXRlU3lzdGVtOmJhLFdpcmVmcmFtZUdlb21ldHJ5OlJfLFdyYXBBcm91bmRFbmRpbmc6dmEsWmVyb0N1cnZhdHVyZUVuZGluZzpacixaZXJvRmFjdG9yOkQwLFplcm9TbG9wZUVuZGluZzpKcixaZXJvU3RlbmNpbE9wOlV3LGNyZWF0ZUNhbnZhc0VsZW1lbnQ6eXl9KTtjb25zdCBicz1uZXcgTWFwLFFJPShpPXt9KT0+KHtnZW5lcmF0ZVRvcFVWKHQsZSxuLHIscyl7Y29uc3Qgbz1lW24qM10sYT1lW24qMysxXSxsPWVbciozXSxjPWVbciozKzFdLHU9ZVtzKjNdLGg9ZVtzKjMrMV07bGV0IGY7aWYoYnMuaGFzKHQpKWY9YnMuZ2V0KHQpO2Vsc2V7bGV0IGc9aS5ib3gzO2lmKCFnKXtnPW5ldyBtZTtjb25zdCB4PXQucGFyYW1ldGVycy5zaGFwZXMuZ2V0UG9pbnRzKCkubWFwKF89PltfLngsXy55LDBdKS5mbGF0KCk7Zy5zZXRGcm9tQXJyYXkoeCl9Y29uc3QgbT1nLmdldFNpemUobmV3IFIpO2kuc3BsaXQmJihtLnkvPWkuc3BsaXQpLGY9e2JveDpnLHNpemU6bX0sYnMuc2V0KHQsZil9Y29uc3R7Ym94OmQsc2l6ZTpwfT1mLHk9aS5zcGxpdD8xLWkuc3BsaXQ6MDtyZXR1cm5bbmV3IFgoKG8tZC5taW4ueCkvcC54LChhLWQubWluLnkpL3AueSt5KSxuZXcgWCgobC1kLm1pbi54KS9wLngsKGMtZC5taW4ueSkvcC55K3kpLG5ldyBYKCh1LWQubWluLngpL3AueCwoaC1kLm1pbi55KS9wLnkreSldfSxnZW5lcmF0ZVNpZGVXYWxsVVYodCxlLG4scixzLG8pe2NvbnN0IGE9ZVtuKjNdLGw9ZVtuKjMrMV0sYz1lW24qMysyXSx1PWVbciozXSxoPWVbciozKzFdLGY9ZVtyKjMrMl0sZD1lW3MqM10scD1lW3MqMysxXSx5PWVbcyozKzJdLGc9ZVtvKjNdLG09ZVtvKjMrMV0sdj1lW28qMysyXTtsZXQgeDtpZihicy5oYXMoZSkpeD1icy5nZXQoZSk7ZWxzZXtjb25zdCBiPW5ldyBtZTtiLnNldEZyb21BcnJheShlKTtjb25zdCBBPWIuZ2V0U2l6ZShuZXcgUik7aS5zcGxpdCYmKEEuei89MS1pLnNwbGl0KSxpLnNpZGVSZXBlYXQmJihBLnovPWkuc2lkZVJlcGVhdCkseD17Ym94OmIsc2l6ZTpBfSxicy5zZXQoZSx4KX1jb25zdHtib3g6XyxzaXplOk19PXg7cmV0dXJuIE1hdGguYWJzKGwtaCk8TWF0aC5hYnMoYS11KT9bbmV3IFgoKGEtXy5taW4ueCkvTS54LChjLV8ubWluLnopL00ueiksbmV3IFgoKHUtXy5taW4ueCkvTS54LChmLV8ubWluLnopL00ueiksbmV3IFgoKGQtXy5taW4ueCkvTS54LCh5LV8ubWluLnopL00ueiksbmV3IFgoKGctXy5taW4ueCkvTS54LCh2LV8ubWluLnopL00ueildOltuZXcgWCgobC1fLm1pbi55KS9NLnksKGMtXy5taW4ueikvTS56KSxuZXcgWCgoaC1fLm1pbi55KS9NLnksKGYtXy5taW4ueikvTS56KSxuZXcgWCgocC1fLm1pbi55KS9NLnksKHktXy5taW4ueikvTS56KSxuZXcgWCgobS1fLm1pbi55KS9NLnksKHYtXy5taW4ueikvTS56KV19fSksdDI9KCk9Pnticy5jbGVhcigpfTtjbGFzcyBUbyBleHRlbmRzIEZ0e2NvbnN0cnVjdG9yKHQ9bmV3IEppKFtuZXcgWCguNSwuNSksbmV3IFgoLS41LC41KSxuZXcgWCgtLjUsLS41KSxuZXcgWCguNSwtLjUpXSksZT17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxvcHRpb25zOmV9LHQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtjb25zdCBuPXRoaXMscj1bXSxzPVtdO2ZvcihsZXQgYT0wLGw9dC5sZW5ndGg7YTxsO2ErKyl7Y29uc3QgYz10W2FdO28oYyl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgTXQociwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgTXQocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIG8oYSl7dmFyIEN0LG90LFN0O2NvbnN0IGw9W10sYz1lLmN1cnZlU2VnbWVudHMhPT12b2lkIDA/ZS5jdXJ2ZVNlZ21lbnRzOjEyLHU9ZS5zdGVwcyE9PXZvaWQgMD9lLnN0ZXBzOjEsaD1lLmRlcHRoIT09dm9pZCAwP2UuZGVwdGg6MTtsZXQgZj1lLmJldmVsRW5hYmxlZCE9PXZvaWQgMD9lLmJldmVsRW5hYmxlZDohMCxkPWUuYmV2ZWxUaGlja25lc3MhPT12b2lkIDA/ZS5iZXZlbFRoaWNrbmVzczouMixwPWUuYmV2ZWxTaXplIT09dm9pZCAwP2UuYmV2ZWxTaXplOmQtLjEseT1lLmJldmVsT2Zmc2V0IT09dm9pZCAwP2UuYmV2ZWxPZmZzZXQ6MCxnPWUuYmV2ZWxTZWdtZW50cyE9PXZvaWQgMD9lLmJldmVsU2VnbWVudHM6Mztjb25zdCBtPWUuZXh0cnVkZVBhdGgsdj1lLlVWR2VuZXJhdG9yIT09dm9pZCAwP2UuVVZHZW5lcmF0b3I6ZTIseD0oQ3Q9ZS5oYXNUb3ApIT1udWxsP0N0OiEwLF89KG90PWUuaGFzQm90dG9tKSE9bnVsbD9vdDohMCxNPShTdD1lLmhhc1NpZGUpIT1udWxsP1N0OiEwO2xldCBiLEE9ITEsRSx3LFMsVDttJiYoYj1tLmdldFNwYWNlZFBvaW50cyh1KSxBPSEwLGY9ITEsRT1tLmNvbXB1dGVGcmVuZXRGcmFtZXModSwhMSksdz1uZXcgUixTPW5ldyBSLFQ9bmV3IFIpLGZ8fChnPTAsZD0wLHA9MCx5PTApO2NvbnN0IEQ9YS5leHRyYWN0UG9pbnRzKGMpO2xldCBMPUQuc2hhcGU7Y29uc3QgTj1ELmhvbGVzO2lmKCF6bi5pc0Nsb2NrV2lzZShMKSl7TD1MLnJldmVyc2UoKTtmb3IobGV0IFc9MCxldD1OLmxlbmd0aDtXPGV0O1crKyl7Y29uc3QgWj1OW1ddO3puLmlzQ2xvY2tXaXNlKFopJiYoTltXXT1aLnJldmVyc2UoKSl9fWNvbnN0IEI9em4udHJpYW5ndWxhdGVTaGFwZShMLE4pLEc9TDtmb3IobGV0IFc9MCxldD1OLmxlbmd0aDtXPGV0O1crKyl7Y29uc3QgWj1OW1ddO0w9TC5jb25jYXQoWil9ZnVuY3Rpb24gayhXLGV0LFope3JldHVybiBldHx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxXLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKGV0LFopfWNvbnN0IFE9TC5sZW5ndGgsY3Q9Qi5sZW5ndGg7ZnVuY3Rpb24gaHQoVyxldCxaKXtsZXQgUCxDLE87Y29uc3QgJD1XLngtZXQueCx0dD1XLnktZXQueSxKPVoueC1XLngsZHQ9Wi55LVcueSxmdD0kKiQrdHQqdHQseXQ9JCpkdC10dCpKO2lmKE1hdGguYWJzKHl0KT5OdW1iZXIuRVBTSUxPTil7Y29uc3QgVnQ9TWF0aC5zcXJ0KGZ0KSxhdD1NYXRoLnNxcnQoSipKK2R0KmR0KSxidD1ldC54LXR0L1Z0LER0PWV0LnkrJC9WdCx6dD1aLngtZHQvYXQsd3Q9Wi55K0ovYXQsZWU9KCh6dC1idCkqZHQtKHd0LUR0KSpKKS8oJCpkdC10dCpKKTtQPWJ0KyQqZWUtVy54LEM9RHQrdHQqZWUtVy55O2NvbnN0IFl0PVAqUCtDKkM7aWYoWXQ8PTIpcmV0dXJuIG5ldyBYKFAsQyk7Tz1NYXRoLnNxcnQoWXQvMil9ZWxzZXtsZXQgVnQ9ITE7JD5OdW1iZXIuRVBTSUxPTj9KPk51bWJlci5FUFNJTE9OJiYoVnQ9ITApOiQ8LU51bWJlci5FUFNJTE9OP0o8LU51bWJlci5FUFNJTE9OJiYoVnQ9ITApOk1hdGguc2lnbih0dCk9PT1NYXRoLnNpZ24oZHQpJiYoVnQ9ITApLFZ0PyhQPS10dCxDPSQsTz1NYXRoLnNxcnQoZnQpKTooUD0kLEM9dHQsTz1NYXRoLnNxcnQoZnQvMikpfXJldHVybiBuZXcgWChQL08sQy9PKX1jb25zdCBQdD1bXTtmb3IobGV0IFc9MCxldD1HLmxlbmd0aCxaPWV0LTEsUD1XKzE7VzxldDtXKyssWisrLFArKylaPT09ZXQmJihaPTApLFA9PT1ldCYmKFA9MCksUHRbV109aHQoR1tXXSxHW1pdLEdbUF0pO2NvbnN0IFh0PVtdO2xldCBqLHJ0PVB0LmNvbmNhdCgpO2ZvcihsZXQgVz0wLGV0PU4ubGVuZ3RoO1c8ZXQ7VysrKXtjb25zdCBaPU5bV107aj1bXTtmb3IobGV0IFA9MCxDPVoubGVuZ3RoLE89Qy0xLCQ9UCsxO1A8QztQKyssTysrLCQrKylPPT09QyYmKE89MCksJD09PUMmJigkPTApLGpbUF09aHQoWltQXSxaW09dLFpbJF0pO1h0LnB1c2goaikscnQ9cnQuY29uY2F0KGopfWZvcihsZXQgVz0wO1c8ZztXKyspe2NvbnN0IGV0PVcvZyxaPWQqTWF0aC5jb3MoZXQqTWF0aC5QSS8yKSxQPXAqTWF0aC5zaW4oZXQqTWF0aC5QSS8yKSt5O2ZvcihsZXQgQz0wLE89Ry5sZW5ndGg7QzxPO0MrKyl7Y29uc3QgJD1rKEdbQ10sUHRbQ10sUCk7SXQoJC54LCQueSwtWil9Zm9yKGxldCBDPTAsTz1OLmxlbmd0aDtDPE87QysrKXtjb25zdCAkPU5bQ107aj1YdFtDXTtmb3IobGV0IHR0PTAsSj0kLmxlbmd0aDt0dDxKO3R0Kyspe2NvbnN0IGR0PWsoJFt0dF0salt0dF0sUCk7SXQoZHQueCxkdC55LC1aKX19fWNvbnN0IEV0PXAreTtmb3IobGV0IFc9MDtXPFE7VysrKXtjb25zdCBldD1mP2soTFtXXSxydFtXXSxFdCk6TFtXXTtBPyhTLmNvcHkoRS5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihldC54KSx3LmNvcHkoRS5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGV0LnkpLFQuY29weShiWzBdKS5hZGQoUykuYWRkKHcpLEl0KFQueCxULnksVC56KSk6SXQoZXQueCxldC55LDApfWZvcihsZXQgVz0xO1c8PXU7VysrKWZvcihsZXQgZXQ9MDtldDxRO2V0Kyspe2NvbnN0IFo9Zj9rKExbZXRdLHJ0W2V0XSxFdCk6TFtldF07QT8oUy5jb3B5KEUubm9ybWFsc1tXXSkubXVsdGlwbHlTY2FsYXIoWi54KSx3LmNvcHkoRS5iaW5vcm1hbHNbV10pLm11bHRpcGx5U2NhbGFyKFoueSksVC5jb3B5KGJbV10pLmFkZChTKS5hZGQodyksSXQoVC54LFQueSxULnopKTpJdChaLngsWi55LGgvdSpXKX1mb3IobGV0IFc9Zy0xO1c+PTA7Vy0tKXtjb25zdCBldD1XL2csWj1kKk1hdGguY29zKGV0Kk1hdGguUEkvMiksUD1wKk1hdGguc2luKGV0Kk1hdGguUEkvMikreTtmb3IobGV0IEM9MCxPPUcubGVuZ3RoO0M8TztDKyspe2NvbnN0ICQ9ayhHW0NdLFB0W0NdLFApO0l0KCQueCwkLnksaCtaKX1mb3IobGV0IEM9MCxPPU4ubGVuZ3RoO0M8TztDKyspe2NvbnN0ICQ9TltDXTtqPVh0W0NdO2ZvcihsZXQgdHQ9MCxKPSQubGVuZ3RoO3R0PEo7dHQrKyl7Y29uc3QgZHQ9aygkW3R0XSxqW3R0XSxQKTtBP0l0KGR0LngsZHQueStiW3UtMV0ueSxiW3UtMV0ueCtaKTpJdChkdC54LGR0LnksaCtaKX19fXV0KCksTSYmTHQoKTtmdW5jdGlvbiB1dCgpe2NvbnN0IFc9ci5sZW5ndGgvMztpZihmKXtsZXQgZXQ9MCxaPVEqZXQ7aWYoXylmb3IobGV0IFA9MDtQPGN0O1ArKyl7Y29uc3QgQz1CW1BdO3RlKENbMl0rWixDWzFdK1osQ1swXStaKX1pZihldD11K2cqMixaPVEqZXQseClmb3IobGV0IFA9MDtQPGN0O1ArKyl7Y29uc3QgQz1CW1BdO3RlKENbMF0rWixDWzFdK1osQ1syXStaKX19ZWxzZXtpZihfKWZvcihsZXQgZXQ9MDtldDxjdDtldCsrKXtjb25zdCBaPUJbZXRdO3RlKFpbMl0sWlsxXSxaWzBdKX1pZih4KWZvcihsZXQgZXQ9MDtldDxjdDtldCsrKXtjb25zdCBaPUJbZXRdO3RlKFpbMF0rUSp1LFpbMV0rUSp1LFpbMl0rUSp1KX19bi5hZGRHcm91cChXLHIubGVuZ3RoLzMtVywwKX1mdW5jdGlvbiBMdCgpe2NvbnN0IFc9ci5sZW5ndGgvMztsZXQgZXQ9MDtPdChHLGV0KSxldCs9Ry5sZW5ndGg7Zm9yKGxldCBaPTAsUD1OLmxlbmd0aDtaPFA7WisrKXtjb25zdCBDPU5bWl07T3QoQyxldCksZXQrPUMubGVuZ3RofW4uYWRkR3JvdXAoVyxyLmxlbmd0aC8zLVcsMSl9ZnVuY3Rpb24gT3QoVyxldCl7bGV0IFo9Vy5sZW5ndGg7Zm9yKDstLVo+PTA7KXtjb25zdCBQPVo7bGV0IEM9Wi0xO0M8MCYmKEM9Vy5sZW5ndGgtMSk7Zm9yKGxldCBPPTAsJD11K2cqMjtPPCQ7TysrKXtjb25zdCB0dD1RKk8sSj1RKihPKzEpLGR0PWV0K1ArdHQsZnQ9ZXQrQyt0dCx5dD1ldCtDK0osVnQ9ZXQrUCtKO250KGR0LGZ0LHl0LFZ0KX19fWZ1bmN0aW9uIEl0KFcsZXQsWil7bC5wdXNoKFcpLGwucHVzaChldCksbC5wdXNoKFopfWZ1bmN0aW9uIHRlKFcsZXQsWil7c3QoVyksc3QoZXQpLHN0KFopO2NvbnN0IFA9ci5sZW5ndGgvMyxDPXYuZ2VuZXJhdGVUb3BVVihuLHIsUC0zLFAtMixQLTEpO1UoQ1swXSksVShDWzFdKSxVKENbMl0pfWZ1bmN0aW9uIG50KFcsZXQsWixQKXtzdChXKSxzdChldCksc3QoUCksc3QoZXQpLHN0KFopLHN0KFApO2NvbnN0IEM9ci5sZW5ndGgvMyxPPXYuZ2VuZXJhdGVTaWRlV2FsbFVWKG4scixDLTYsQy0zLEMtMixDLTEpO1UoT1swXSksVShPWzFdKSxVKE9bM10pLFUoT1sxXSksVShPWzJdKSxVKE9bM10pfWZ1bmN0aW9uIHN0KFcpe3IucHVzaChsW1cqMyswXSksci5wdXNoKGxbVyozKzFdKSxyLnB1c2gobFtXKjMrMl0pfWZ1bmN0aW9uIFUoVyl7cy5wdXNoKFcueCkscy5wdXNoKFcueSl9fX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpLGU9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiBuMihlLG4sdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxvPXQuc2hhcGVzLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPWVbdC5zaGFwZXNbc11dO24ucHVzaChhKX1jb25zdCByPXQub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gY29uc29sZS5sb2coci50eXBlKSxyIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBLSVtgJHtyLnR5cGV9Q3VydmVgXSgpLmZyb21KU09OKHIpKSxuZXcgVG8obix0Lm9wdGlvbnMpfX1jb25zdCBlMj17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihpLHQsZSxuLHIpe2NvbnN0IHM9dFtlKjNdLG89dFtlKjMrMV0sYT10W24qM10sbD10W24qMysxXSxjPXRbciozXSx1PXRbciozKzFdO3JldHVybltuZXcgWChzLG8pLG5ldyBYKGEsbCksbmV3IFgoYyx1KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihpLHQsZSxuLHIscyl7Y29uc3Qgbz10W2UqM10sYT10W2UqMysxXSxsPXRbZSozKzJdLGM9dFtuKjNdLHU9dFtuKjMrMV0saD10W24qMysyXSxmPXRbciozXSxkPXRbciozKzFdLHA9dFtyKjMrMl0seT10W3MqM10sZz10W3MqMysxXSxtPXRbcyozKzJdO3JldHVybiBNYXRoLmFicyhhLXUpPE1hdGguYWJzKG8tYyk/W25ldyBYKG8sMS1sKSxuZXcgWChjLDEtaCksbmV3IFgoZiwxLXApLG5ldyBYKHksMS1tKV06W25ldyBYKGEsMS1sKSxuZXcgWCh1LDEtaCksbmV3IFgoZCwxLXApLG5ldyBYKGcsMS1tKV19fTtmdW5jdGlvbiBuMihpLHQsZSl7aWYoZS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IG49MCxyPWkubGVuZ3RoO248cjtuKyspe2NvbnN0IHM9aVtuXTtlLnNoYXBlcy5wdXNoKHMudXVpZCl9ZWxzZSBlLnNoYXBlcy5wdXNoKGkudXVpZCk7cmV0dXJuIGUub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHQpLHQuZXh0cnVkZVBhdGghPT12b2lkIDAmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9dC5leHRydWRlUGF0aC50b0pTT04oKSksZX1jb25zdCBydj0wLGkyPTEscjI9Mixzdj0yLEdwPTEuMjUsb3Y9MSxpbD02KjQrNCs0LFF1PTY1NTM1LHMyPU1hdGgucG93KDIsLTI0KSxIcD1TeW1ib2woIlNLSVBfR0VORVJBVElPTiIpO2Z1bmN0aW9uIG8yKGkpe3JldHVybiBpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIENvKGkpe3JldHVybiBvMihpKS8zfWZ1bmN0aW9uIGEyKGksdD1BcnJheUJ1ZmZlcil7cmV0dXJuIGk+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqaSkpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKmkpKX1mdW5jdGlvbiBsMihpLHQpe2lmKCFpLmluZGV4KXtjb25zdCBlPWkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscj1hMihlLG4pO2kuc2V0SW5kZXgobmV3IEp0KHIsMSkpO2ZvcihsZXQgcz0wO3M8ZTtzKyspcltzXT1zfX1mdW5jdGlvbiBhdihpLHQpe2NvbnN0IGU9Q28oaSksbj10fHxpLmRyYXdSYW5nZSxyPW4uc3RhcnQvMyxzPShuLnN0YXJ0K24uY291bnQpLzMsbz1NYXRoLm1heCgwLHIpLGE9TWF0aC5taW4oZSxzKS1vO3JldHVyblt7b2Zmc2V0Ok1hdGguZmxvb3IobyksY291bnQ6TWF0aC5mbG9vcihhKX1dfWZ1bmN0aW9uIGx2KGksdCl7aWYoIWkuZ3JvdXBzfHwhaS5ncm91cHMubGVuZ3RoKXJldHVybiBhdihpLHQpO2NvbnN0IGU9W10sbj1uZXcgU2V0LHI9dHx8aS5kcmF3UmFuZ2Uscz1yLnN0YXJ0LzMsbz0oci5zdGFydCtyLmNvdW50KS8zO2Zvcihjb25zdCBsIG9mIGkuZ3JvdXBzKXtjb25zdCBjPWwuc3RhcnQvMyx1PShsLnN0YXJ0K2wuY291bnQpLzM7bi5hZGQoTWF0aC5tYXgocyxjKSksbi5hZGQoTWF0aC5taW4obyx1KSl9Y29uc3QgYT1BcnJheS5mcm9tKG4udmFsdWVzKCkpLnNvcnQoKGwsYyk9PmwtYyk7Zm9yKGxldCBsPTA7bDxhLmxlbmd0aC0xO2wrKyl7Y29uc3QgYz1hW2xdLHU9YVtsKzFdO2UucHVzaCh7b2Zmc2V0Ok1hdGguZmxvb3IoYyksY291bnQ6TWF0aC5mbG9vcih1LWMpfSl9cmV0dXJuIGV9ZnVuY3Rpb24gYzIoaSx0KXtjb25zdCBlPUNvKGkpLG49bHYoaSx0KS5zb3J0KChvLGEpPT5vLm9mZnNldC1hLm9mZnNldCkscj1uW24ubGVuZ3RoLTFdO3IuY291bnQ9TWF0aC5taW4oZS1yLm9mZnNldCxyLmNvdW50KTtsZXQgcz0wO3JldHVybiBuLmZvckVhY2goKHtjb3VudDpvfSk9PnMrPW8pLGUhPT1zfWZ1bmN0aW9uIFdwKGksdCxlLG4scil7bGV0IHM9MS8wLG89MS8wLGE9MS8wLGw9LTEvMCxjPS0xLzAsdT0tMS8wLGg9MS8wLGY9MS8wLGQ9MS8wLHA9LTEvMCx5PS0xLzAsZz0tMS8wO2ZvcihsZXQgbT10KjYsdj0odCtlKSo2O208djttKz02KXtjb25zdCB4PWlbbSswXSxfPWlbbSsxXSxNPXgtXyxiPXgrXztNPHMmJihzPU0pLGI+bCYmKGw9YikseDxoJiYoaD14KSx4PnAmJihwPXgpO2NvbnN0IEE9aVttKzJdLEU9aVttKzNdLHc9QS1FLFM9QStFO3c8byYmKG89dyksUz5jJiYoYz1TKSxBPGYmJihmPUEpLEE+eSYmKHk9QSk7Y29uc3QgVD1pW20rNF0sRD1pW20rNV0sTD1ULUQsTj1UK0Q7TDxhJiYoYT1MKSxOPnUmJih1PU4pLFQ8ZCYmKGQ9VCksVD5nJiYoZz1UKX1uWzBdPXMsblsxXT1vLG5bMl09YSxuWzNdPWwsbls0XT1jLG5bNV09dSxyWzBdPWgsclsxXT1mLHJbMl09ZCxyWzNdPXAscls0XT15LHJbNV09Z31mdW5jdGlvbiB1MihpLHQ9bnVsbCxlPW51bGwsbj1udWxsKXtjb25zdCByPWkuYXR0cmlidXRlcy5wb3NpdGlvbixzPWkuaW5kZXg/aS5pbmRleC5hcnJheTpudWxsLG89Q28oaSksYT1yLm5vcm1hbGl6ZWQ7bGV0IGw7dD09PW51bGw/KGw9bmV3IEZsb2F0MzJBcnJheShvKjYpLGU9MCxuPW8pOihsPXQsZT1lfHwwLG49bnx8byk7Y29uc3QgYz1yLmFycmF5LHU9ci5vZmZzZXR8fDA7bGV0IGg9MztyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihoPXIuZGF0YS5zdHJpZGUpO2NvbnN0IGY9WyJnZXRYIiwiZ2V0WSIsImdldFoiXTtmb3IobGV0IGQ9ZTtkPGUrbjtkKyspe2NvbnN0IHA9ZCozLHk9ZCo2O2xldCBnPXArMCxtPXArMSx2PXArMjtzJiYoZz1zW2ddLG09c1ttXSx2PXNbdl0pLGF8fChnPWcqaCt1LG09bSpoK3Usdj12KmgrdSk7Zm9yKGxldCB4PTA7eDwzO3grKyl7bGV0IF8sTSxiO2E/KF89cltmW3hdXShnKSxNPXJbZlt4XV0obSksYj1yW2ZbeF1dKHYpKTooXz1jW2creF0sTT1jW20reF0sYj1jW3YreF0pO2xldCBBPV87TTxBJiYoQT1NKSxiPEEmJihBPWIpO2xldCBFPV87TT5FJiYoRT1NKSxiPkUmJihFPWIpO2NvbnN0IHc9KEUtQSkvMixTPXgqMjtsW3krUyswXT1BK3csbFt5K1MrMV09dysoTWF0aC5hYnMoQSkrdykqczJ9fXJldHVybiBsfWZ1bmN0aW9uIFJlKGksdCxlKXtyZXR1cm4gZS5taW4ueD10W2ldLGUubWluLnk9dFtpKzFdLGUubWluLno9dFtpKzJdLGUubWF4Lng9dFtpKzNdLGUubWF4Lnk9dFtpKzRdLGUubWF4Lno9dFtpKzVdLGV9ZnVuY3Rpb24gY3YoaSl7bGV0IHQ9LTEsZT0tMS8wO2ZvcihsZXQgbj0wO248MztuKyspe2NvbnN0IHI9aVtuKzNdLWlbbl07cj5lJiYoZT1yLHQ9bil9cmV0dXJuIHR9ZnVuY3Rpb24gdXYoaSx0KXt0LnNldChpKX1mdW5jdGlvbiBodihpLHQsZSl7bGV0IG4scjtmb3IobGV0IHM9MDtzPDM7cysrKXtjb25zdCBvPXMrMztuPWlbc10scj10W3NdLGVbc109bjxyP246cixuPWlbb10scj10W29dLGVbb109bj5yP246cn19ZnVuY3Rpb24gdGgoaSx0LGUpe2ZvcihsZXQgbj0wO248MztuKyspe2NvbnN0IHI9dFtpKzIqbl0scz10W2krMipuKzFdLG89ci1zLGE9citzO288ZVtuXSYmKGVbbl09byksYT5lW24rM10mJihlW24rM109YSl9fWZ1bmN0aW9uIHJsKGkpe2NvbnN0IHQ9aVszXS1pWzBdLGU9aVs0XS1pWzFdLG49aVs1XS1pWzJdO3JldHVybiAyKih0KmUrZSpuK24qdCl9Y29uc3QgdHI9MzIsaDI9KGksdCk9PmkuY2FuZGlkYXRlLXQuY2FuZGlkYXRlLFJyPW5ldyBBcnJheSh0cikuZmlsbCgpLm1hcCgoKT0+KHtjb3VudDowLGJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLHJpZ2h0Q2FjaGVCb3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxsZWZ0Q2FjaGVCb3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxjYW5kaWRhdGU6MH0pKSxlaD1uZXcgRmxvYXQzMkFycmF5KDYpO2Z1bmN0aW9uIGYyKGksdCxlLG4scixzKXtsZXQgbz0tMSxhPTA7aWYocz09PXJ2KW89Y3YodCksbyE9PS0xJiYoYT0odFtvXSt0W28rM10pLzIpO2Vsc2UgaWYocz09PWkyKW89Y3YoaSksbyE9PS0xJiYoYT1kMihlLG4scixvKSk7ZWxzZSBpZihzPT09cjIpe2NvbnN0IGw9cmwoaSk7bGV0IGM9R3Aqcjtjb25zdCB1PW4qNixoPShuK3IpKjY7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD10W2ZdLGc9KHRbZiszXS1kKS90cjtpZihyPHRyLzQpe2NvbnN0IG09Wy4uLlJyXTttLmxlbmd0aD1yO2xldCB2PTA7Zm9yKGxldCBfPXU7XzxoO18rPTYsdisrKXtjb25zdCBNPW1bdl07TS5jYW5kaWRhdGU9ZVtfKzIqZl0sTS5jb3VudD0wO2NvbnN0e2JvdW5kczpiLGxlZnRDYWNoZUJvdW5kczpBLHJpZ2h0Q2FjaGVCb3VuZHM6RX09TTtmb3IobGV0IHc9MDt3PDM7dysrKUVbd109MS8wLEVbdyszXT0tMS8wLEFbd109MS8wLEFbdyszXT0tMS8wLGJbd109MS8wLGJbdyszXT0tMS8wO3RoKF8sZSxiKX1tLnNvcnQoaDIpO2xldCB4PXI7Zm9yKGxldCBfPTA7Xzx4O18rKyl7Y29uc3QgTT1tW19dO2Zvcig7XysxPHgmJm1bXysxXS5jYW5kaWRhdGU9PT1NLmNhbmRpZGF0ZTspbS5zcGxpY2UoXysxLDEpLHgtLX1mb3IobGV0IF89dTtfPGg7Xys9Nil7Y29uc3QgTT1lW18rMipmXTtmb3IobGV0IGI9MDtiPHg7YisrKXtjb25zdCBBPW1bYl07TT49QS5jYW5kaWRhdGU/dGgoXyxlLEEucmlnaHRDYWNoZUJvdW5kcyk6KHRoKF8sZSxBLmxlZnRDYWNoZUJvdW5kcyksQS5jb3VudCsrKX19Zm9yKGxldCBfPTA7Xzx4O18rKyl7Y29uc3QgTT1tW19dLGI9TS5jb3VudCxBPXItTS5jb3VudCxFPU0ubGVmdENhY2hlQm91bmRzLHc9TS5yaWdodENhY2hlQm91bmRzO2xldCBTPTA7YiE9PTAmJihTPXJsKEUpL2wpO2xldCBUPTA7QSE9PTAmJihUPXJsKHcpL2wpO2NvbnN0IEQ9b3YrR3AqKFMqYitUKkEpO0Q8YyYmKG89ZixjPUQsYT1NLmNhbmRpZGF0ZSl9fWVsc2V7Zm9yKGxldCB4PTA7eDx0cjt4Kyspe2NvbnN0IF89UnJbeF07Xy5jb3VudD0wLF8uY2FuZGlkYXRlPWQrZyt4Kmc7Y29uc3QgTT1fLmJvdW5kcztmb3IobGV0IGI9MDtiPDM7YisrKU1bYl09MS8wLE1bYiszXT0tMS8wfWZvcihsZXQgeD11O3g8aDt4Kz02KXtsZXQgYj1+figoZVt4KzIqZl0tZCkvZyk7Yj49dHImJihiPXRyLTEpO2NvbnN0IEE9UnJbYl07QS5jb3VudCsrLHRoKHgsZSxBLmJvdW5kcyl9Y29uc3QgbT1Sclt0ci0xXTt1dihtLmJvdW5kcyxtLnJpZ2h0Q2FjaGVCb3VuZHMpO2ZvcihsZXQgeD10ci0yO3g+PTA7eC0tKXtjb25zdCBfPVJyW3hdLE09UnJbeCsxXTtodihfLmJvdW5kcyxNLnJpZ2h0Q2FjaGVCb3VuZHMsXy5yaWdodENhY2hlQm91bmRzKX1sZXQgdj0wO2ZvcihsZXQgeD0wO3g8dHItMTt4Kyspe2NvbnN0IF89UnJbeF0sTT1fLmNvdW50LGI9Xy5ib3VuZHMsRT1Sclt4KzFdLnJpZ2h0Q2FjaGVCb3VuZHM7TSE9PTAmJih2PT09MD91dihiLGVoKTpodihiLGVoLGVoKSksdis9TTtsZXQgdz0wLFM9MDt2IT09MCYmKHc9cmwoZWgpL2wpO2NvbnN0IFQ9ci12O1QhPT0wJiYoUz1ybChFKS9sKTtjb25zdCBEPW92K0dwKih3KnYrUypUKTtEPGMmJihvPWYsYz1ELGE9Xy5jYW5kaWRhdGUpfX19fWVsc2UgY29uc29sZS53YXJuKGBNZXNoQlZIOiBJbnZhbGlkIGJ1aWxkIHN0cmF0ZWd5IHZhbHVlICR7c30gdXNlZC5gKTtyZXR1cm57YXhpczpvLHBvczphfX1mdW5jdGlvbiBkMihpLHQsZSxuKXtsZXQgcj0wO2ZvcihsZXQgcz10LG89dCtlO3M8bztzKyspcis9aVtzKjYrbioyXTtyZXR1cm4gci9lfWNsYXNzICRwe2NvbnN0cnVjdG9yKCl7dGhpcy5ib3VuZGluZ0RhdGE9bmV3IEZsb2F0MzJBcnJheSg2KX19ZnVuY3Rpb24gcDIoaSx0LGUsbixyLHMpe2xldCBvPW4sYT1uK3ItMTtjb25zdCBsPXMucG9zLGM9cy5heGlzKjI7Zm9yKDs7KXtmb3IoO288PWEmJmVbbyo2K2NdPGw7KW8rKztmb3IoO288PWEmJmVbYSo2K2NdPj1sOylhLS07aWYobzxhKXtmb3IobGV0IHU9MDt1PDM7dSsrKXtsZXQgaD10W28qMyt1XTt0W28qMyt1XT10W2EqMyt1XSx0W2EqMyt1XT1ofWZvcihsZXQgdT0wO3U8Njt1Kyspe2xldCBoPWVbbyo2K3VdO2Vbbyo2K3VdPWVbYSo2K3VdLGVbYSo2K3VdPWh9bysrLGEtLX1lbHNlIHJldHVybiBvfX1mdW5jdGlvbiBtMihpLHQsZSxuLHIscyl7bGV0IG89bixhPW4rci0xO2NvbnN0IGw9cy5wb3MsYz1zLmF4aXMqMjtmb3IoOzspe2Zvcig7bzw9YSYmZVtvKjYrY108bDspbysrO2Zvcig7bzw9YSYmZVthKjYrY10+PWw7KWEtLTtpZihvPGEpe2xldCB1PWlbb107aVtvXT1pW2FdLGlbYV09dTtmb3IobGV0IGg9MDtoPDY7aCsrKXtsZXQgZj1lW28qNitoXTtlW28qNitoXT1lW2EqNitoXSxlW2EqNitoXT1mfW8rKyxhLS19ZWxzZSByZXR1cm4gb319ZnVuY3Rpb24gRW4oaSx0KXtyZXR1cm4gdFtpKzE1XT09PTY1NTM1fWZ1bmN0aW9uIFZuKGksdCl7cmV0dXJuIHRbaSs2XX1mdW5jdGlvbiBabihpLHQpe3JldHVybiB0W2krMTRdfWZ1bmN0aW9uIEpuKGkpe3JldHVybiBpKzh9ZnVuY3Rpb24gam4oaSx0KXtyZXR1cm4gdFtpKzZdfWZ1bmN0aW9uIGZ2KGksdCl7cmV0dXJuIHRbaSs3XX1mdW5jdGlvbiBONChpKXtyZXR1cm4gaX1sZXQgZHYsc2wsbmgscHY7Y29uc3QgZzI9TWF0aC5wb3coMiwzMik7ZnVuY3Rpb24gWHAoaSl7cmV0dXJuImNvdW50ImluIGk/MToxK1hwKGkubGVmdCkrWHAoaS5yaWdodCl9ZnVuY3Rpb24geTIoaSx0LGUpe3JldHVybiBkdj1uZXcgRmxvYXQzMkFycmF5KGUpLHNsPW5ldyBVaW50MzJBcnJheShlKSxuaD1uZXcgVWludDE2QXJyYXkoZSkscHY9bmV3IFVpbnQ4QXJyYXkoZSkscXAoaSx0KX1mdW5jdGlvbiBxcChpLHQpe2NvbnN0IGU9aS80LG49aS8yLHI9ImNvdW50ImluIHQscz10LmJvdW5kaW5nRGF0YTtmb3IobGV0IG89MDtvPDY7bysrKWR2W2Urb109c1tvXTtpZihyKWlmKHQuYnVmZmVyKXtjb25zdCBvPXQuYnVmZmVyO3B2LnNldChuZXcgVWludDhBcnJheShvKSxpKTtmb3IobGV0IGE9aSxsPWkrby5ieXRlTGVuZ3RoO2E8bDthKz1pbCl7Y29uc3QgYz1hLzI7RW4oYyxuaCl8fChzbFthLzQrNl0rPWUpfXJldHVybiBpK28uYnl0ZUxlbmd0aH1lbHNle2NvbnN0IG89dC5vZmZzZXQsYT10LmNvdW50O3JldHVybiBzbFtlKzZdPW8sbmhbbisxNF09YSxuaFtuKzE1XT1RdSxpK2lsfWVsc2V7Y29uc3Qgbz10LmxlZnQsYT10LnJpZ2h0LGw9dC5zcGxpdEF4aXM7bGV0IGM7aWYoYz1xcChpK2lsLG8pLGMvND5nMil0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IENhbm5vdCBzdG9yZSBjaGlsZCBwb2ludGVyIGdyZWF0ZXIgdGhhbiAzMiBiaXRzLiIpO3JldHVybiBzbFtlKzZdPWMvNCxjPXFwKGMsYSksc2xbZSs3XT1sLGN9fWZ1bmN0aW9uIF8yKGksdCl7Y29uc3QgZT0oaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCkvMyxuPWU+V3MoMiwxNikscj1uPzQ6MixzPXQ/bmV3IFNoYXJlZEFycmF5QnVmZmVyKGUqcik6bmV3IEFycmF5QnVmZmVyKGUqciksbz1uP25ldyBVaW50MzJBcnJheShzKTpuZXcgVWludDE2QXJyYXkocyk7Zm9yKGxldCBhPTAsbD1vLmxlbmd0aDthPGw7YSsrKW9bYV09YTtyZXR1cm4gb31mdW5jdGlvbiB4MihpLHQsZSxuLHIpe2NvbnN0e21heERlcHRoOnMsdmVyYm9zZTpvLG1heExlYWZUcmlzOmEsc3RyYXRlZ3k6bCxvblByb2dyZXNzOmMsaW5kaXJlY3Q6dX09cixoPWkuX2luZGlyZWN0QnVmZmVyLGY9aS5nZW9tZXRyeSxkPWYuaW5kZXg/Zi5pbmRleC5hcnJheTpudWxsLHA9dT9tMjpwMix5PUNvKGYpLGc9bmV3IEZsb2F0MzJBcnJheSg2KTtsZXQgbT0hMTtjb25zdCB2PW5ldyAkcDtyZXR1cm4gV3AodCxlLG4sdi5ib3VuZGluZ0RhdGEsZyksXyh2LGUsbixnKSx2O2Z1bmN0aW9uIHgoTSl7YyYmYyhNL3kpfWZ1bmN0aW9uIF8oTSxiLEEsRT1udWxsLHc9MCl7aWYoIW0mJnc+PXMmJihtPSEwLG8mJihjb25zb2xlLndhcm4oYE1lc2hCVkg6IE1heCBkZXB0aCBvZiAke3N9IHJlYWNoZWQgd2hlbiBnZW5lcmF0aW5nIEJWSC4gQ29uc2lkZXIgaW5jcmVhc2luZyBtYXhEZXB0aC5gKSxjb25zb2xlLndhcm4oZikpKSxBPD1hfHx3Pj1zKXJldHVybiB4KGIrQSksTS5vZmZzZXQ9YixNLmNvdW50PUEsTTtjb25zdCBTPWYyKE0uYm91bmRpbmdEYXRhLEUsdCxiLEEsbCk7aWYoUy5heGlzPT09LTEpcmV0dXJuIHgoYitBKSxNLm9mZnNldD1iLE0uY291bnQ9QSxNO2NvbnN0IFQ9cChoLGQsdCxiLEEsUyk7aWYoVD09PWJ8fFQ9PT1iK0EpeChiK0EpLE0ub2Zmc2V0PWIsTS5jb3VudD1BO2Vsc2V7TS5zcGxpdEF4aXM9Uy5heGlzO2NvbnN0IEQ9bmV3ICRwLEw9YixOPVQtYjtNLmxlZnQ9RCxXcCh0LEwsTixELmJvdW5kaW5nRGF0YSxnKSxfKEQsTCxOLGcsdysxKTtjb25zdCBGPW5ldyAkcCxCPVQsRz1BLU47TS5yaWdodD1GLFdwKHQsQixHLEYuYm91bmRpbmdEYXRhLGcpLF8oRixCLEcsZyx3KzEpfXJldHVybiBNfX1mdW5jdGlvbiB2MihpLHQpe2NvbnN0IGU9aS5nZW9tZXRyeTt0LmluZGlyZWN0JiYoaS5faW5kaXJlY3RCdWZmZXI9XzIoZSx0LnVzZVNoYXJlZEFycmF5QnVmZmVyKSxjMihlLHQucmFuZ2UpJiYhdC52ZXJib3NlJiZjb25zb2xlLndhcm4oJ01lc2hCVkg6IFByb3ZpZGVkIGdlb21ldHJ5IGNvbnRhaW5zIGdyb3VwcyBvciBhIHJhbmdlIHRoYXQgZG8gbm90IGZ1bGx5IHNwYW4gdGhlIHZlcnRleCBjb250ZW50cyB3aGlsZSB1c2luZyB0aGUgImluZGlyZWN0IiBvcHRpb24uIEJWSCBtYXkgaW5jb3JyZWN0bHkgcmVwb3J0IGludGVyc2VjdGlvbnMgb24gdW5yZW5kZXJlZCBwb3J0aW9ucyBvZiB0aGUgZ2VvbWV0cnkuJykpLGkuX2luZGlyZWN0QnVmZmVyfHxsMihlLHQpO2NvbnN0IG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixyPXUyKGUpLHM9dC5pbmRpcmVjdD9hdihlLHQucmFuZ2UpOmx2KGUsdC5yYW5nZSk7aS5fcm9vdHM9cy5tYXAobz0+e2NvbnN0IGE9eDIoaSxyLG8ub2Zmc2V0LG8uY291bnQsdCksbD1YcChhKSxjPW5ldyBuKGlsKmwpO3JldHVybiB5MigwLGEsYyksY30pfWNsYXNzIGVye2NvbnN0cnVjdG9yKCl7dGhpcy5taW49MS8wLHRoaXMubWF4PS0xLzB9c2V0RnJvbVBvaW50c0ZpZWxkKHQsZSl7bGV0IG49MS8wLHI9LTEvMDtmb3IobGV0IHM9MCxvPXQubGVuZ3RoO3M8bztzKyspe2NvbnN0IGw9dFtzXVtlXTtuPWw8bj9sOm4scj1sPnI/bDpyfXRoaXMubWluPW4sdGhpcy5tYXg9cn1zZXRGcm9tUG9pbnRzKHQsZSl7bGV0IG49MS8wLHI9LTEvMDtmb3IobGV0IHM9MCxvPWUubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9ZVtzXSxsPXQuZG90KGEpO249bDxuP2w6bixyPWw+cj9sOnJ9dGhpcy5taW49bix0aGlzLm1heD1yfWlzU2VwYXJhdGVkKHQpe3JldHVybiB0aGlzLm1pbj50Lm1heHx8dC5taW4+dGhpcy5tYXh9fWVyLnByb3RvdHlwZS5zZXRGcm9tQm94PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgUjtyZXR1cm4gZnVuY3Rpb24oZSxuKXtjb25zdCByPW4ubWluLHM9bi5tYXg7bGV0IG89MS8wLGE9LTEvMDtmb3IobGV0IGw9MDtsPD0xO2wrKylmb3IobGV0IGM9MDtjPD0xO2MrKylmb3IobGV0IHU9MDt1PD0xO3UrKyl7aS54PXIueCpsK3MueCooMS1sKSxpLnk9ci55KmMrcy55KigxLWMpLGkuej1yLnoqdStzLnoqKDEtdSk7Y29uc3QgaD1lLmRvdChpKTtvPU1hdGgubWluKGgsbyksYT1NYXRoLm1heChoLGEpfXRoaXMubWluPW8sdGhpcy5tYXg9YX19KCk7Y29uc3QgUzI9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBSLHQ9bmV3IFIsZT1uZXcgUjtyZXR1cm4gZnVuY3Rpb24ocixzLG8pe2NvbnN0IGE9ci5zdGFydCxsPWksYz1zLnN0YXJ0LHU9dDtlLnN1YlZlY3RvcnMoYSxjKSxpLnN1YlZlY3RvcnMoci5lbmQsci5zdGFydCksdC5zdWJWZWN0b3JzKHMuZW5kLHMuc3RhcnQpO2NvbnN0IGg9ZS5kb3QodSksZj11LmRvdChsKSxkPXUuZG90KHUpLHA9ZS5kb3QobCksZz1sLmRvdChsKSpkLWYqZjtsZXQgbSx2O2chPT0wP209KGgqZi1wKmQpL2c6bT0wLHY9KGgrbSpmKS9kLG8ueD1tLG8ueT12fX0oKSxZcD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFgsdD1uZXcgUixlPW5ldyBSO3JldHVybiBmdW5jdGlvbihyLHMsbyxhKXtTMihyLHMsaSk7bGV0IGw9aS54LGM9aS55O2lmKGw+PTAmJmw8PTEmJmM+PTAmJmM8PTEpe3IuYXQobCxvKSxzLmF0KGMsYSk7cmV0dXJufWVsc2UgaWYobD49MCYmbDw9MSl7YzwwP3MuYXQoMCxhKTpzLmF0KDEsYSksci5jbG9zZXN0UG9pbnRUb1BvaW50KGEsITAsbyk7cmV0dXJufWVsc2UgaWYoYz49MCYmYzw9MSl7bDwwP3IuYXQoMCxvKTpyLmF0KDEsbykscy5jbG9zZXN0UG9pbnRUb1BvaW50KG8sITAsYSk7cmV0dXJufWVsc2V7bGV0IHU7bDwwP3U9ci5zdGFydDp1PXIuZW5kO2xldCBoO2M8MD9oPXMuc3RhcnQ6aD1zLmVuZDtjb25zdCBmPXQsZD1lO2lmKHIuY2xvc2VzdFBvaW50VG9Qb2ludChoLCEwLHQpLHMuY2xvc2VzdFBvaW50VG9Qb2ludCh1LCEwLGUpLGYuZGlzdGFuY2VUb1NxdWFyZWQoaCk8PWQuZGlzdGFuY2VUb1NxdWFyZWQodSkpe28uY29weShmKSxhLmNvcHkoaCk7cmV0dXJufWVsc2V7by5jb3B5KHUpLGEuY29weShkKTtyZXR1cm59fX19KCksTTI9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBSLHQ9bmV3IFIsZT1uZXcgaGksbj1uZXcga247cmV0dXJuIGZ1bmN0aW9uKHMsbyl7Y29uc3R7cmFkaXVzOmEsY2VudGVyOmx9PXMse2E6YyxiOnUsYzpofT1vO2lmKG4uc3RhcnQ9YyxuLmVuZD11LG4uY2xvc2VzdFBvaW50VG9Qb2ludChsLCEwLGkpLmRpc3RhbmNlVG8obCk8PWF8fChuLnN0YXJ0PWMsbi5lbmQ9aCxuLmNsb3Nlc3RQb2ludFRvUG9pbnQobCwhMCxpKS5kaXN0YW5jZVRvKGwpPD1hKXx8KG4uc3RhcnQ9dSxuLmVuZD1oLG4uY2xvc2VzdFBvaW50VG9Qb2ludChsLCEwLGkpLmRpc3RhbmNlVG8obCk8PWEpKXJldHVybiEwO2NvbnN0IHk9by5nZXRQbGFuZShlKTtpZihNYXRoLmFicyh5LmRpc3RhbmNlVG9Qb2ludChsKSk8PWEpe2NvbnN0IG09eS5wcm9qZWN0UG9pbnQobCx0KTtpZihvLmNvbnRhaW5zUG9pbnQobSkpcmV0dXJuITB9cmV0dXJuITF9fSgpLGIyPTFlLTE1O2Z1bmN0aW9uIFpwKGkpe3JldHVybiBNYXRoLmFicyhpKTxiMn1jbGFzcyBLbiBleHRlbmRzIF9le2NvbnN0cnVjdG9yKC4uLnQpe3N1cGVyKC4uLnQpLHRoaXMuaXNFeHRlbmRlZFRyaWFuZ2xlPSEwLHRoaXMuc2F0QXhlcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3IFIpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSg0KS5maWxsKCkubWFwKCgpPT5uZXcgZXIpLHRoaXMucG9pbnRzPVt0aGlzLmEsdGhpcy5iLHRoaXMuY10sdGhpcy5zcGhlcmU9bmV3IHFlLHRoaXMucGxhbmU9bmV3IGhpLHRoaXMubmVlZHNVcGRhdGU9ITB9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gTTIodCx0aGlzKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuYSxlPXRoaXMuYixuPXRoaXMuYyxyPXRoaXMucG9pbnRzLHM9dGhpcy5zYXRBeGVzLG89dGhpcy5zYXRCb3VuZHMsYT1zWzBdLGw9b1swXTt0aGlzLmdldE5vcm1hbChhKSxsLnNldEZyb21Qb2ludHMoYSxyKTtjb25zdCBjPXNbMV0sdT1vWzFdO2Muc3ViVmVjdG9ycyh0LGUpLHUuc2V0RnJvbVBvaW50cyhjLHIpO2NvbnN0IGg9c1syXSxmPW9bMl07aC5zdWJWZWN0b3JzKGUsbiksZi5zZXRGcm9tUG9pbnRzKGgscik7Y29uc3QgZD1zWzNdLHA9b1szXTtkLnN1YlZlY3RvcnMobix0KSxwLnNldEZyb21Qb2ludHMoZCxyKSx0aGlzLnNwaGVyZS5zZXRGcm9tUG9pbnRzKHRoaXMucG9pbnRzKSx0aGlzLnBsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGEsdCksdGhpcy5uZWVkc1VwZGF0ZT0hMX19S24ucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvU2VnbWVudD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFIsdD1uZXcgUixlPW5ldyBrbjtyZXR1cm4gZnVuY3Rpb24ocixzPW51bGwsbz1udWxsKXtjb25zdHtzdGFydDphLGVuZDpsfT1yLGM9dGhpcy5wb2ludHM7bGV0IHUsaD0xLzA7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD0oZisxKSUzO2Uuc3RhcnQuY29weShjW2ZdKSxlLmVuZC5jb3B5KGNbZF0pLFlwKGUscixpLHQpLHU9aS5kaXN0YW5jZVRvU3F1YXJlZCh0KSx1PGgmJihoPXUscyYmcy5jb3B5KGkpLG8mJm8uY29weSh0KSl9cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChhLGkpLHU9YS5kaXN0YW5jZVRvU3F1YXJlZChpKSx1PGgmJihoPXUscyYmcy5jb3B5KGkpLG8mJm8uY29weShhKSksdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGwsaSksdT1sLmRpc3RhbmNlVG9TcXVhcmVkKGkpLHU8aCYmKGg9dSxzJiZzLmNvcHkoaSksbyYmby5jb3B5KGwpKSxNYXRoLnNxcnQoaCl9fSgpLEtuLnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBLbix0PW5ldyBBcnJheSgzKSxlPW5ldyBBcnJheSgzKSxuPW5ldyBlcixyPW5ldyBlcixzPW5ldyBSLG89bmV3IFIsYT1uZXcgUixsPW5ldyBSLGM9bmV3IFIsdT1uZXcga24saD1uZXcga24sZj1uZXcga24sZD1uZXcgUjtmdW5jdGlvbiBwKHksZyxtKXtjb25zdCB2PXkucG9pbnRzO2xldCB4PTAsXz0tMTtmb3IobGV0IE09MDtNPDM7TSsrKXtjb25zdHtzdGFydDpiLGVuZDpBfT11O2IuY29weSh2W01dKSxBLmNvcHkodlsoTSsxKSUzXSksdS5kZWx0YShvKTtjb25zdCBFPVpwKGcuZGlzdGFuY2VUb1BvaW50KGIpKTtpZihacChnLm5vcm1hbC5kb3QobykpJiZFKXttLmNvcHkodSkseD0yO2JyZWFrfWNvbnN0IHc9Zy5pbnRlcnNlY3RMaW5lKHUsZCk7aWYoIXcmJkUmJmQuY29weShiKSwod3x8RSkmJiFacChkLmRpc3RhbmNlVG8oQSkpKXtpZih4PD0xKSh4PT09MT9tLnN0YXJ0Om0uZW5kKS5jb3B5KGQpLEUmJihfPXgpO2Vsc2UgaWYoeD49Mil7KF89PT0xP20uc3RhcnQ6bS5lbmQpLmNvcHkoZCkseD0yO2JyZWFrfWlmKHgrKyx4PT09MiYmXz09PS0xKWJyZWFrfX1yZXR1cm4geH1yZXR1cm4gZnVuY3Rpb24oZyxtPW51bGwsdj0hMSl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxnLmlzRXh0ZW5kZWRUcmlhbmdsZT9nLm5lZWRzVXBkYXRlJiZnLnVwZGF0ZSgpOihpLmNvcHkoZyksaS51cGRhdGUoKSxnPWkpO2NvbnN0IHg9dGhpcy5wbGFuZSxfPWcucGxhbmU7aWYoTWF0aC5hYnMoeC5ub3JtYWwuZG90KF8ubm9ybWFsKSk+MS0xZS0xMCl7Y29uc3QgTT10aGlzLnNhdEJvdW5kcyxiPXRoaXMuc2F0QXhlcztlWzBdPWcuYSxlWzFdPWcuYixlWzJdPWcuYztmb3IobGV0IHc9MDt3PDQ7dysrKXtjb25zdCBTPU1bd10sVD1iW3ddO2lmKG4uc2V0RnJvbVBvaW50cyhULGUpLFMuaXNTZXBhcmF0ZWQobikpcmV0dXJuITF9Y29uc3QgQT1nLnNhdEJvdW5kcyxFPWcuc2F0QXhlczt0WzBdPXRoaXMuYSx0WzFdPXRoaXMuYix0WzJdPXRoaXMuYztmb3IobGV0IHc9MDt3PDQ7dysrKXtjb25zdCBTPUFbd10sVD1FW3ddO2lmKG4uc2V0RnJvbVBvaW50cyhULHQpLFMuaXNTZXBhcmF0ZWQobikpcmV0dXJuITF9Zm9yKGxldCB3PTA7dzw0O3crKyl7Y29uc3QgUz1iW3ddO2ZvcihsZXQgVD0wO1Q8NDtUKyspe2NvbnN0IEQ9RVtUXTtpZihzLmNyb3NzVmVjdG9ycyhTLEQpLG4uc2V0RnJvbVBvaW50cyhzLHQpLHIuc2V0RnJvbVBvaW50cyhzLGUpLG4uaXNTZXBhcmF0ZWQocikpcmV0dXJuITF9fXJldHVybiBtJiYodnx8Y29uc29sZS53YXJuKCJFeHRlbmRlZFRyaWFuZ2xlLmludGVyc2VjdHNUcmlhbmdsZTogVHJpYW5nbGVzIGFyZSBjb3BsYW5hciB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGFuIG91dHB1dCBlZGdlLiBTZXR0aW5nIGVkZ2UgdG8gMCwgMCwgMC4iKSxtLnN0YXJ0LnNldCgwLDAsMCksbS5lbmQuc2V0KDAsMCwwKSksITB9ZWxzZXtjb25zdCBNPXAodGhpcyxfLGgpO2lmKE09PT0xJiZnLmNvbnRhaW5zUG9pbnQoaC5lbmQpKXJldHVybiBtJiYobS5zdGFydC5jb3B5KGguZW5kKSxtLmVuZC5jb3B5KGguZW5kKSksITA7aWYoTSE9PTIpcmV0dXJuITE7Y29uc3QgYj1wKGcseCxmKTtpZihiPT09MSYmdGhpcy5jb250YWluc1BvaW50KGYuZW5kKSlyZXR1cm4gbSYmKG0uc3RhcnQuY29weShmLmVuZCksbS5lbmQuY29weShmLmVuZCkpLCEwO2lmKGIhPT0yKXJldHVybiExO2lmKGguZGVsdGEoYSksZi5kZWx0YShsKSxhLmRvdChsKTwwKXtsZXQgTD1mLnN0YXJ0O2Yuc3RhcnQ9Zi5lbmQsZi5lbmQ9TH1jb25zdCBBPWguc3RhcnQuZG90KGEpLEU9aC5lbmQuZG90KGEpLHc9Zi5zdGFydC5kb3QoYSksUz1mLmVuZC5kb3QoYSksVD1FPHcsRD1BPFM7cmV0dXJuIEEhPT1TJiZ3IT09RSYmVD09PUQ/ITE6KG0mJihjLnN1YlZlY3RvcnMoaC5zdGFydCxmLnN0YXJ0KSxjLmRvdChhKT4wP20uc3RhcnQuY29weShoLnN0YXJ0KTptLnN0YXJ0LmNvcHkoZi5zdGFydCksYy5zdWJWZWN0b3JzKGguZW5kLGYuZW5kKSxjLmRvdChhKTwwP20uZW5kLmNvcHkoaC5lbmQpOm0uZW5kLmNvcHkoZi5lbmQpKSwhMCl9fX0oKSxLbi5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgUjtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksS24ucHJvdG90eXBlLmRpc3RhbmNlVG9UcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFIsdD1uZXcgUixlPVsiYSIsImIiLCJjIl0sbj1uZXcga24scj1uZXcga247cmV0dXJuIGZ1bmN0aW9uKG8sYT1udWxsLGw9bnVsbCl7Y29uc3QgYz1hfHxsP246bnVsbDtpZih0aGlzLmludGVyc2VjdHNUcmlhbmdsZShvLGMpKXJldHVybihhfHxsKSYmKGEmJmMuZ2V0Q2VudGVyKGEpLGwmJmMuZ2V0Q2VudGVyKGwpKSwwO2xldCB1PTEvMDtmb3IobGV0IGg9MDtoPDM7aCsrKXtsZXQgZjtjb25zdCBkPWVbaF0scD1vW2RdO3RoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChwLGkpLGY9cC5kaXN0YW5jZVRvU3F1YXJlZChpKSxmPHUmJih1PWYsYSYmYS5jb3B5KGkpLGwmJmwuY29weShwKSk7Y29uc3QgeT10aGlzW2RdO28uY2xvc2VzdFBvaW50VG9Qb2ludCh5LGkpLGY9eS5kaXN0YW5jZVRvU3F1YXJlZChpKSxmPHUmJih1PWYsYSYmYS5jb3B5KHkpLGwmJmwuY29weShpKSl9Zm9yKGxldCBoPTA7aDwzO2grKyl7Y29uc3QgZj1lW2hdLGQ9ZVsoaCsxKSUzXTtuLnNldCh0aGlzW2ZdLHRoaXNbZF0pO2ZvcihsZXQgcD0wO3A8MztwKyspe2NvbnN0IHk9ZVtwXSxnPWVbKHArMSklM107ci5zZXQob1t5XSxvW2ddKSxZcChuLHIsaSx0KTtjb25zdCBtPWkuZGlzdGFuY2VUb1NxdWFyZWQodCk7bTx1JiYodT1tLGEmJmEuY29weShpKSxsJiZsLmNvcHkodCkpfX1yZXR1cm4gTWF0aC5zcXJ0KHUpfX0oKTtjbGFzcyBmbntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5pc09yaWVudGVkQm94PSEwLHRoaXMubWluPW5ldyBSLHRoaXMubWF4PW5ldyBSLHRoaXMubWF0cml4PW5ldyBSdCx0aGlzLmludk1hdHJpeD1uZXcgUnQsdGhpcy5wb2ludHM9bmV3IEFycmF5KDgpLmZpbGwoKS5tYXAoKCk9Pm5ldyBSKSx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBSKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IGVyKSx0aGlzLmFsaWduZWRTYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBlciksdGhpcy5uZWVkc1VwZGF0ZT0hMSx0JiZ0aGlzLm1pbi5jb3B5KHQpLGUmJnRoaXMubWF4LmNvcHkoZSksbiYmdGhpcy5tYXRyaXguY29weShuKX1zZXQodCxlLG4pe3RoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzLm1hdHJpeC5jb3B5KG4pLHRoaXMubmVlZHNVcGRhdGU9ITB9Y29weSh0KXt0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm5lZWRzVXBkYXRlPSEwfX1mbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLm1hdHJpeCxlPXRoaXMubWluLG49dGhpcy5tYXgscj10aGlzLnBvaW50cztmb3IobGV0IGM9MDtjPD0xO2MrKylmb3IobGV0IHU9MDt1PD0xO3UrKylmb3IobGV0IGg9MDtoPD0xO2grKyl7Y29uc3QgZj0xKmN8Mip1fDQqaCxkPXJbZl07ZC54PWM/bi54OmUueCxkLnk9dT9uLnk6ZS55LGQuej1oP24uejplLnosZC5hcHBseU1hdHJpeDQodCl9Y29uc3Qgcz10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcyxhPXJbMF07Zm9yKGxldCBjPTA7YzwzO2MrKyl7Y29uc3QgdT1vW2NdLGg9c1tjXSxmPTE8PGMsZD1yW2ZdO3Uuc3ViVmVjdG9ycyhhLGQpLGguc2V0RnJvbVBvaW50cyh1LHIpfWNvbnN0IGw9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2xbMF0uc2V0RnJvbVBvaW50c0ZpZWxkKHIsIngiKSxsWzFdLnNldEZyb21Qb2ludHNGaWVsZChyLCJ5IiksbFsyXS5zZXRGcm9tUG9pbnRzRmllbGQociwieiIpLHRoaXMuaW52TWF0cml4LmNvcHkodGhpcy5tYXRyaXgpLmludmVydCgpLHRoaXMubmVlZHNVcGRhdGU9ITF9fSgpLGZuLnByb3RvdHlwZS5pbnRlcnNlY3RzQm94PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgZXI7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCk7Y29uc3Qgbj1lLm1pbixyPWUubWF4LHM9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT10aGlzLmFsaWduZWRTYXRCb3VuZHM7aWYoaS5taW49bi54LGkubWF4PXIueCxhWzBdLmlzU2VwYXJhdGVkKGkpfHwoaS5taW49bi55LGkubWF4PXIueSxhWzFdLmlzU2VwYXJhdGVkKGkpKXx8KGkubWluPW4ueixpLm1heD1yLnosYVsyXS5pc1NlcGFyYXRlZChpKSkpcmV0dXJuITE7Zm9yKGxldCBsPTA7bDwzO2wrKyl7Y29uc3QgYz1vW2xdLHU9c1tsXTtpZihpLnNldEZyb21Cb3goYyxlKSx1LmlzU2VwYXJhdGVkKGkpKXJldHVybiExfXJldHVybiEwfX0oKSxmbi5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgS24sdD1uZXcgQXJyYXkoMyksZT1uZXcgZXIsbj1uZXcgZXIscj1uZXcgUjtyZXR1cm4gZnVuY3Rpb24obyl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxvLmlzRXh0ZW5kZWRUcmlhbmdsZT9vLm5lZWRzVXBkYXRlJiZvLnVwZGF0ZSgpOihpLmNvcHkobyksaS51cGRhdGUoKSxvPWkpO2NvbnN0IGE9dGhpcy5zYXRCb3VuZHMsbD10aGlzLnNhdEF4ZXM7dFswXT1vLmEsdFsxXT1vLmIsdFsyXT1vLmM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1hW2ZdLHA9bFtmXTtpZihlLnNldEZyb21Qb2ludHMocCx0KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWNvbnN0IGM9by5zYXRCb3VuZHMsdT1vLnNhdEF4ZXMsaD10aGlzLnBvaW50cztmb3IobGV0IGY9MDtmPDM7ZisrKXtjb25zdCBkPWNbZl0scD11W2ZdO2lmKGUuc2V0RnJvbVBvaW50cyhwLGgpLGQuaXNTZXBhcmF0ZWQoZSkpcmV0dXJuITF9Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1sW2ZdO2ZvcihsZXQgcD0wO3A8NDtwKyspe2NvbnN0IHk9dVtwXTtpZihyLmNyb3NzVmVjdG9ycyhkLHkpLGUuc2V0RnJvbVBvaW50cyhyLHQpLG4uc2V0RnJvbVBvaW50cyhyLGgpLGUuaXNTZXBhcmF0ZWQobikpcmV0dXJuITF9fXJldHVybiEwfX0oKSxmbi5wcm90b3R5cGUuY2xvc2VzdFBvaW50VG9Qb2ludD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLGUuY29weSh0KS5hcHBseU1hdHJpeDQodGhpcy5pbnZNYXRyaXgpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXgpLGV9fSgpLGZuLnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBSO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsaSksZS5kaXN0YW5jZVRvKGkpfX0oKSxmbi5wcm90b3R5cGUuZGlzdGFuY2VUb0JveD1mdW5jdGlvbigpe2NvbnN0IGk9WyJ4IiwieSIsInoiXSx0PW5ldyBBcnJheSgxMikuZmlsbCgpLm1hcCgoKT0+bmV3IGtuKSxlPW5ldyBBcnJheSgxMikuZmlsbCgpLm1hcCgoKT0+bmV3IGtuKSxuPW5ldyBSLHI9bmV3IFI7cmV0dXJuIGZ1bmN0aW9uKG8sYT0wLGw9bnVsbCxjPW51bGwpe2lmKHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksdGhpcy5pbnRlcnNlY3RzQm94KG8pKXJldHVybihsfHxjKSYmKG8uZ2V0Q2VudGVyKHIpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChyLG4pLG8uY2xvc2VzdFBvaW50VG9Qb2ludChuLHIpLGwmJmwuY29weShuKSxjJiZjLmNvcHkocikpLDA7Y29uc3QgdT1hKmEsaD1vLm1pbixmPW8ubWF4LGQ9dGhpcy5wb2ludHM7bGV0IHA9MS8wO2ZvcihsZXQgZz0wO2c8ODtnKyspe2NvbnN0IG09ZFtnXTtyLmNvcHkobSkuY2xhbXAoaCxmKTtjb25zdCB2PW0uZGlzdGFuY2VUb1NxdWFyZWQocik7aWYodjxwJiYocD12LGwmJmwuY29weShtKSxjJiZjLmNvcHkociksdjx1KSlyZXR1cm4gTWF0aC5zcXJ0KHYpfWxldCB5PTA7Zm9yKGxldCBnPTA7ZzwzO2crKylmb3IobGV0IG09MDttPD0xO20rKylmb3IobGV0IHY9MDt2PD0xO3YrKyl7Y29uc3QgeD0oZysxKSUzLF89KGcrMiklMyxNPW08PHh8djw8XyxiPTE8PGd8bTw8eHx2PDxfLEE9ZFtNXSxFPWRbYl07dFt5XS5zZXQoQSxFKTtjb25zdCBTPWlbZ10sVD1pW3hdLEQ9aVtfXSxMPWVbeV0sTj1MLnN0YXJ0LEY9TC5lbmQ7TltTXT1oW1NdLE5bVF09bT9oW1RdOmZbVF0sTltEXT12P2hbRF06ZltUXSxGW1NdPWZbU10sRltUXT1tP2hbVF06ZltUXSxGW0RdPXY/aFtEXTpmW1RdLHkrK31mb3IobGV0IGc9MDtnPD0xO2crKylmb3IobGV0IG09MDttPD0xO20rKylmb3IobGV0IHY9MDt2PD0xO3YrKyl7ci54PWc/Zi54OmgueCxyLnk9bT9mLnk6aC55LHIuej12P2YuejpoLnosdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHIsbik7Y29uc3QgeD1yLmRpc3RhbmNlVG9TcXVhcmVkKG4pO2lmKHg8cCYmKHA9eCxsJiZsLmNvcHkobiksYyYmYy5jb3B5KHIpLHg8dSkpcmV0dXJuIE1hdGguc3FydCh4KX1mb3IobGV0IGc9MDtnPDEyO2crKyl7Y29uc3QgbT10W2ddO2ZvcihsZXQgdj0wO3Y8MTI7disrKXtjb25zdCB4PWVbdl07WXAobSx4LG4scik7Y29uc3QgXz1uLmRpc3RhbmNlVG9TcXVhcmVkKHIpO2lmKF88cCYmKHA9XyxsJiZsLmNvcHkobiksYyYmYy5jb3B5KHIpLF88dSkpcmV0dXJuIE1hdGguc3FydChfKX19cmV0dXJuIE1hdGguc3FydChwKX19KCk7Y2xhc3MgSnB7Y29uc3RydWN0b3IodCl7dGhpcy5fZ2V0TmV3UHJpbWl0aXZlPXQsdGhpcy5fcHJpbWl0aXZlcz1bXX1nZXRQcmltaXRpdmUoKXtjb25zdCB0PXRoaXMuX3ByaW1pdGl2ZXM7cmV0dXJuIHQubGVuZ3RoPT09MD90aGlzLl9nZXROZXdQcmltaXRpdmUoKTp0LnBvcCgpfXJlbGVhc2VQcmltaXRpdmUodCl7dGhpcy5fcHJpbWl0aXZlcy5wdXNoKHQpfX1jbGFzcyB3MiBleHRlbmRzIEpwe2NvbnN0cnVjdG9yKCl7c3VwZXIoKCk9Pm5ldyBLbil9fWNvbnN0IFFuPW5ldyB3MjtjbGFzcyBBMntjb25zdHJ1Y3Rvcigpe3RoaXMuZmxvYXQzMkFycmF5PW51bGwsdGhpcy51aW50MTZBcnJheT1udWxsLHRoaXMudWludDMyQXJyYXk9bnVsbDtjb25zdCB0PVtdO2xldCBlPW51bGw7dGhpcy5zZXRCdWZmZXI9bj0+e2UmJnQucHVzaChlKSxlPW4sdGhpcy5mbG9hdDMyQXJyYXk9bmV3IEZsb2F0MzJBcnJheShuKSx0aGlzLnVpbnQxNkFycmF5PW5ldyBVaW50MTZBcnJheShuKSx0aGlzLnVpbnQzMkFycmF5PW5ldyBVaW50MzJBcnJheShuKX0sdGhpcy5jbGVhckJ1ZmZlcj0oKT0+e2U9bnVsbCx0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGwsdC5sZW5ndGghPT0wJiZ0aGlzLnNldEJ1ZmZlcih0LnBvcCgpKX19fWNvbnN0IE1lPW5ldyBBMjtsZXQgUHIsUm87Y29uc3QgUG89W10saWg9bmV3IEpwKCgpPT5uZXcgbWUpO2Z1bmN0aW9uIEUyKGksdCxlLG4scixzKXtQcj1paC5nZXRQcmltaXRpdmUoKSxSbz1paC5nZXRQcmltaXRpdmUoKSxQby5wdXNoKFByLFJvKSxNZS5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IG89anAoMCxpLmdlb21ldHJ5LGUsbixyLHMpO01lLmNsZWFyQnVmZmVyKCksaWgucmVsZWFzZVByaW1pdGl2ZShQciksaWgucmVsZWFzZVByaW1pdGl2ZShSbyksUG8ucG9wKCksUG8ucG9wKCk7Y29uc3QgYT1Qby5sZW5ndGg7cmV0dXJuIGE+MCYmKFJvPVBvW2EtMV0sUHI9UG9bYS0yXSksb31mdW5jdGlvbiBqcChpLHQsZSxuLHI9bnVsbCxzPTAsbz0wKXtjb25zdHtmbG9hdDMyQXJyYXk6YSx1aW50MTZBcnJheTpsLHVpbnQzMkFycmF5OmN9PU1lO2xldCB1PWkqMjtpZihFbih1LGwpKXtjb25zdCBmPVZuKGksYyksZD1abih1LGwpO3JldHVybiBSZShpLGEsUHIpLG4oZixkLCExLG8scytpLFByKX1lbHNle2xldCBTPWZ1bmN0aW9uKEQpe2NvbnN0e3VpbnQxNkFycmF5OkwsdWludDMyQXJyYXk6Tn09TWU7bGV0IEY9RCoyO2Zvcig7IUVuKEYsTCk7KUQ9Sm4oRCksRj1EKjI7cmV0dXJuIFZuKEQsTil9LFQ9ZnVuY3Rpb24oRCl7Y29uc3R7dWludDE2QXJyYXk6TCx1aW50MzJBcnJheTpOfT1NZTtsZXQgRj1EKjI7Zm9yKDshRW4oRixMKTspRD1qbihELE4pLEY9RCoyO3JldHVybiBWbihELE4pK1puKEYsTCl9O2NvbnN0IGY9Sm4oaSksZD1qbihpLGMpO2xldCBwPWYseT1kLGcsbSx2LHg7aWYociYmKHY9UHIseD1SbyxSZShwLGEsdiksUmUoeSxhLHgpLGc9cih2KSxtPXIoeCksbTxnKSl7cD1kLHk9Zjtjb25zdCBEPWc7Zz1tLG09RCx2PXh9dnx8KHY9UHIsUmUocCxhLHYpKTtjb25zdCBfPUVuKHAqMixsKSxNPWUodixfLGcsbysxLHMrcCk7bGV0IGI7aWYoTT09PXN2KXtjb25zdCBEPVMocCksTj1UKHApLUQ7Yj1uKEQsTiwhMCxvKzEscytwLHYpfWVsc2UgYj1NJiZqcChwLHQsZSxuLHIscyxvKzEpO2lmKGIpcmV0dXJuITA7eD1SbyxSZSh5LGEseCk7Y29uc3QgQT1Fbih5KjIsbCksRT1lKHgsQSxtLG8rMSxzK3kpO2xldCB3O2lmKEU9PT1zdil7Y29uc3QgRD1TKHkpLE49VCh5KS1EO3c9bihELE4sITAsbysxLHMreSx4KX1lbHNlIHc9RSYmanAoeSx0LGUsbixyLHMsbysxKTtyZXR1cm4hIXd9fWNvbnN0IG9sPW5ldyBSLEtwPW5ldyBSO2Z1bmN0aW9uIFQyKGksdCxlPXt9LG49MCxyPTEvMCl7Y29uc3Qgcz1uKm4sbz1yKnI7bGV0IGE9MS8wLGw9bnVsbDtpZihpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjp1PT4ob2wuY29weSh0KS5jbGFtcCh1Lm1pbix1Lm1heCksb2wuZGlzdGFuY2VUb1NxdWFyZWQodCkpLGludGVyc2VjdHNCb3VuZHM6KHUsaCxmKT0+ZjxhJiZmPG8saW50ZXJzZWN0c1RyaWFuZ2xlOih1LGgpPT57dS5jbG9zZXN0UG9pbnRUb1BvaW50KHQsb2wpO2NvbnN0IGY9dC5kaXN0YW5jZVRvU3F1YXJlZChvbCk7cmV0dXJuIGY8YSYmKEtwLmNvcHkob2wpLGE9ZixsPWgpLGY8c319KSxhPT09MS8wKXJldHVybiBudWxsO2NvbnN0IGM9TWF0aC5zcXJ0KGEpO3JldHVybiBlLnBvaW50P2UucG9pbnQuY29weShLcCk6ZS5wb2ludD1LcC5jbG9uZSgpLGUuZGlzdGFuY2U9YyxlLmZhY2VJbmRleD1sLGV9Y29uc3QgQzI9cGFyc2VJbnQobmUpPj0xNjksd3M9bmV3IFIsQXM9bmV3IFIsRXM9bmV3IFIscmg9bmV3IFgsc2g9bmV3IFgsb2g9bmV3IFgsbXY9bmV3IFIsZ3Y9bmV3IFIseXY9bmV3IFIsYWw9bmV3IFI7ZnVuY3Rpb24gUjIoaSx0LGUsbixyLHMsbyxhKXtsZXQgbDtpZihzPT09SmU/bD1pLmludGVyc2VjdFRyaWFuZ2xlKG4sZSx0LCEwLHIpOmw9aS5pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixzIT09VW4sciksbD09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgYz1pLm9yaWdpbi5kaXN0YW5jZVRvKHIpO3JldHVybiBjPG98fGM+YT9udWxsOntkaXN0YW5jZTpjLHBvaW50OnIuY2xvbmUoKX19ZnVuY3Rpb24gUDIoaSx0LGUsbixyLHMsbyxhLGwsYyx1KXt3cy5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksQXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG8pLEVzLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxhKTtjb25zdCBoPVIyKGksd3MsQXMsRXMsYWwsbCxjLHUpO2lmKGgpe2NvbnN0IGY9bmV3IFI7X2UuZ2V0QmFyeWNvb3JkKGFsLHdzLEFzLEVzLGYpLG4mJihyaC5mcm9tQnVmZmVyQXR0cmlidXRlKG4scyksc2guZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLG8pLG9oLmZyb21CdWZmZXJBdHRyaWJ1dGUobixhKSxoLnV2PV9lLmdldEludGVycG9sYXRpb24oYWwsd3MsQXMsRXMscmgsc2gsb2gsbmV3IFgpKSxyJiYocmguZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHMpLHNoLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxvaC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsYSksaC51djE9X2UuZ2V0SW50ZXJwb2xhdGlvbihhbCx3cyxBcyxFcyxyaCxzaCxvaCxuZXcgWCkpLGUmJihtdi5mcm9tQnVmZmVyQXR0cmlidXRlKGUscyksZ3YuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG8pLHl2LmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxhKSxoLm5vcm1hbD1fZS5nZXRJbnRlcnBvbGF0aW9uKGFsLHdzLEFzLEVzLG12LGd2LHl2LG5ldyBSKSxoLm5vcm1hbC5kb3QoaS5kaXJlY3Rpb24pPjAmJmgubm9ybWFsLm11bHRpcGx5U2NhbGFyKC0xKSk7Y29uc3QgZD17YTpzLGI6byxjOmEsbm9ybWFsOm5ldyBSLG1hdGVyaWFsSW5kZXg6MH07X2UuZ2V0Tm9ybWFsKHdzLEFzLEVzLGQubm9ybWFsKSxoLmZhY2U9ZCxoLmZhY2VJbmRleD1zLEMyJiYoaC5iYXJ5Y29vcmQ9Zil9cmV0dXJuIGh9ZnVuY3Rpb24gYWgoaSx0LGUsbixyLHMsbyl7Y29uc3QgYT1uKjM7bGV0IGw9YSswLGM9YSsxLHU9YSsyO2NvbnN0IGg9aS5pbmRleDtpLmluZGV4JiYobD1oLmdldFgobCksYz1oLmdldFgoYyksdT1oLmdldFgodSkpO2NvbnN0e3Bvc2l0aW9uOmYsbm9ybWFsOmQsdXY6cCx1djE6eX09aS5hdHRyaWJ1dGVzLGc9UDIoZSxmLGQscCx5LGwsYyx1LHQscyxvKTtyZXR1cm4gZz8oZy5mYWNlSW5kZXg9bixyJiZyLnB1c2goZyksZyk6bnVsbH1mdW5jdGlvbiB6ZShpLHQsZSxuKXtjb25zdCByPWkuYSxzPWkuYixvPWkuYztsZXQgYT10LGw9dCsxLGM9dCsyO2UmJihhPWUuZ2V0WChhKSxsPWUuZ2V0WChsKSxjPWUuZ2V0WChjKSksci54PW4uZ2V0WChhKSxyLnk9bi5nZXRZKGEpLHIuej1uLmdldFooYSkscy54PW4uZ2V0WChsKSxzLnk9bi5nZXRZKGwpLHMuej1uLmdldFoobCksby54PW4uZ2V0WChjKSxvLnk9bi5nZXRZKGMpLG8uej1uLmdldFooYyl9ZnVuY3Rpb24gSTIoaSx0LGUsbixyLHMsbyxhKXtjb25zdHtnZW9tZXRyeTpsLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2ZvcihsZXQgdT1uLGg9bityO3U8aDt1KyspYWgobCx0LGUsdSxzLG8sYSl9ZnVuY3Rpb24gTDIoaSx0LGUsbixyLHMsbyl7Y29uc3R7Z2VvbWV0cnk6YSxfaW5kaXJlY3RCdWZmZXI6bH09aTtsZXQgYz0xLzAsdT1udWxsO2ZvcihsZXQgaD1uLGY9bityO2g8ZjtoKyspe2xldCBkO2Q9YWgoYSx0LGUsaCxudWxsLHMsbyksZCYmZC5kaXN0YW5jZTxjJiYodT1kLGM9ZC5kaXN0YW5jZSl9cmV0dXJuIHV9ZnVuY3Rpb24gRDIoaSx0LGUsbixyLHMsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6bH09YSxjPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IHU9aSxoPXQraTt1PGg7dSsrKXtsZXQgZjtpZihmPXUsemUobyxmKjMsbCxjKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHIscykpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gVTIoaSx0PW51bGwpe3QmJkFycmF5LmlzQXJyYXkodCkmJih0PW5ldyBTZXQodCkpO2NvbnN0IGU9aS5nZW9tZXRyeSxuPWUuaW5kZXg/ZS5pbmRleC5hcnJheTpudWxsLHI9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBzLG8sYSxsLGM9MDtjb25zdCB1PWkuX3Jvb3RzO2ZvcihsZXQgZj0wLGQ9dS5sZW5ndGg7ZjxkO2YrKylzPXVbZl0sbz1uZXcgVWludDMyQXJyYXkocyksYT1uZXcgVWludDE2QXJyYXkocyksbD1uZXcgRmxvYXQzMkFycmF5KHMpLGgoMCxjKSxjKz1zLmJ5dGVMZW5ndGg7ZnVuY3Rpb24gaChmLGQscD0hMSl7Y29uc3QgeT1mKjI7aWYoYVt5KzE1XT09PVF1KXtjb25zdCBtPW9bZis2XSx2PWFbeSsxNF07bGV0IHg9MS8wLF89MS8wLE09MS8wLGI9LTEvMCxBPS0xLzAsRT0tMS8wO2ZvcihsZXQgdz0zKm0sUz0zKihtK3YpO3c8Uzt3Kyspe2xldCBUPW5bd107Y29uc3QgRD1yLmdldFgoVCksTD1yLmdldFkoVCksTj1yLmdldFooVCk7RDx4JiYoeD1EKSxEPmImJihiPUQpLEw8XyYmKF89TCksTD5BJiYoQT1MKSxOPE0mJihNPU4pLE4+RSYmKEU9Til9cmV0dXJuIGxbZiswXSE9PXh8fGxbZisxXSE9PV98fGxbZisyXSE9PU18fGxbZiszXSE9PWJ8fGxbZis0XSE9PUF8fGxbZis1XSE9PUU/KGxbZiswXT14LGxbZisxXT1fLGxbZisyXT1NLGxbZiszXT1iLGxbZis0XT1BLGxbZis1XT1FLCEwKTohMX1lbHNle2NvbnN0IG09Zis4LHY9b1tmKzZdLHg9bStkLF89ditkO2xldCBNPXAsYj0hMSxBPSExO3Q/TXx8KGI9dC5oYXMoeCksQT10LmhhcyhfKSxNPSFiJiYhQSk6KGI9ITAsQT0hMCk7Y29uc3QgRT1NfHxiLHc9TXx8QTtsZXQgUz0hMTtFJiYoUz1oKG0sZCxNKSk7bGV0IFQ9ITE7dyYmKFQ9aCh2LGQsTSkpO2NvbnN0IEQ9U3x8VDtpZihEKWZvcihsZXQgTD0wO0w8MztMKyspe2NvbnN0IE49bStMLEY9ditMLEI9bFtOXSxHPWxbTiszXSxrPWxbRl0sUT1sW0YrM107bFtmK0xdPUI8az9COmssbFtmK0wrM109Rz5RP0c6UX1yZXR1cm4gRH19fWZ1bmN0aW9uIElyKGksdCxlLG4scil7bGV0IHMsbyxhLGwsYyx1O2NvbnN0IGg9MS9lLmRpcmVjdGlvbi54LGY9MS9lLmRpcmVjdGlvbi55LGQ9MS9lLmRpcmVjdGlvbi56LHA9ZS5vcmlnaW4ueCx5PWUub3JpZ2luLnksZz1lLm9yaWdpbi56O2xldCBtPXRbaV0sdj10W2krM10seD10W2krMV0sXz10W2krMysxXSxNPXRbaSsyXSxiPXRbaSszKzJdO3JldHVybiBoPj0wPyhzPShtLXApKmgsbz0odi1wKSpoKToocz0odi1wKSpoLG89KG0tcCkqaCksZj49MD8oYT0oeC15KSpmLGw9KF8teSkqZik6KGE9KF8teSkqZixsPSh4LXkpKmYpLHM+bHx8YT5vfHwoKGE+c3x8aXNOYU4ocykpJiYocz1hKSwobDxvfHxpc05hTihvKSkmJihvPWwpLGQ+PTA/KGM9KE0tZykqZCx1PShiLWcpKmQpOihjPShiLWcpKmQsdT0oTS1nKSpkKSxzPnV8fGM+byk/ITE6KChjPnN8fHMhPT1zKSYmKHM9YyksKHU8b3x8byE9PW8pJiYobz11KSxzPD1yJiZvPj1uKX1mdW5jdGlvbiBOMihpLHQsZSxuLHIscyxvLGEpe2NvbnN0e2dlb21ldHJ5OmwsX2luZGlyZWN0QnVmZmVyOmN9PWk7Zm9yKGxldCB1PW4saD1uK3I7dTxoO3UrKyl7bGV0IGY9Yz9jW3VdOnU7YWgobCx0LGUsZixzLG8sYSl9fWZ1bmN0aW9uIEYyKGksdCxlLG4scixzLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmx9PWk7bGV0IGM9MS8wLHU9bnVsbDtmb3IobGV0IGg9bixmPW4rcjtoPGY7aCsrKXtsZXQgZDtkPWFoKGEsdCxlLGw/bFtoXTpoLG51bGwscyxvKSxkJiZkLmRpc3RhbmNlPGMmJih1PWQsYz1kLmRpc3RhbmNlKX1yZXR1cm4gdX1mdW5jdGlvbiBCMihpLHQsZSxuLHIscyxvKXtjb25zdHtnZW9tZXRyeTphfT1lLHtpbmRleDpsfT1hLGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgdT1pLGg9dCtpO3U8aDt1Kyspe2xldCBmO2lmKGY9ZS5yZXNvbHZlVHJpYW5nbGVJbmRleCh1KSx6ZShvLGYqMyxsLGMpLG8ubmVlZHNVcGRhdGU9ITAsbihvLGYscixzKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBPMihpLHQsZSxuLHIscyxvKXtNZS5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pLFFwKDAsaSxlLG4scixzLG8pLE1lLmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gUXAoaSx0LGUsbixyLHMsbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6bCx1aW50MzJBcnJheTpjfT1NZSx1PWkqMjtpZihFbih1LGwpKXtjb25zdCBmPVZuKGksYyksZD1abih1LGwpO0kyKHQsZSxuLGYsZCxyLHMsbyl9ZWxzZXtjb25zdCBmPUpuKGkpO0lyKGYsYSxuLHMsbykmJlFwKGYsdCxlLG4scixzLG8pO2NvbnN0IGQ9am4oaSxjKTtJcihkLGEsbixzLG8pJiZRcChkLHQsZSxuLHIscyxvKX19Y29uc3QgejI9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBrMihpLHQsZSxuLHIscyl7TWUuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPXRtKDAsaSxlLG4scixzKTtyZXR1cm4gTWUuY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIHRtKGksdCxlLG4scixzKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5Omx9PU1lO2xldCBjPWkqMjtpZihFbihjLGEpKXtjb25zdCBoPVZuKGksbCksZj1abihjLGEpO3JldHVybiBMMih0LGUsbixoLGYscixzKX1lbHNle2NvbnN0IGg9ZnYoaSxsKSxmPXoyW2hdLHA9bi5kaXJlY3Rpb25bZl0+PTA7bGV0IHksZztwPyh5PUpuKGkpLGc9am4oaSxsKSk6KHk9am4oaSxsKSxnPUpuKGkpKTtjb25zdCB2PUlyKHksbyxuLHIscyk/dG0oeSx0LGUsbixyLHMpOm51bGw7aWYodil7Y29uc3QgTT12LnBvaW50W2ZdO2lmKHA/TTw9b1tnK2hdOk0+PW9bZytoKzNdKXJldHVybiB2fWNvbnN0IF89SXIoZyxvLG4scixzKT90bShnLHQsZSxuLHIscyk6bnVsbDtyZXR1cm4gdiYmXz92LmRpc3RhbmNlPD1fLmRpc3RhbmNlP3Y6Xzp2fHxffHxudWxsfX1jb25zdCBsaD1uZXcgbWUsSW89bmV3IEtuLExvPW5ldyBLbixsbD1uZXcgUnQsX3Y9bmV3IGZuLGNoPW5ldyBmbjtmdW5jdGlvbiBWMihpLHQsZSxuKXtNZS5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IHI9ZW0oMCxpLGUsbik7cmV0dXJuIE1lLmNsZWFyQnVmZmVyKCkscn1mdW5jdGlvbiBlbShpLHQsZSxuLHI9bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OnMsdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1NZTtsZXQgbD1pKjI7aWYocj09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLF92LnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxuKSxyPV92KSxFbihsLG8pKXtjb25zdCB1PXQuZ2VvbWV0cnksaD11LmluZGV4LGY9dS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbix5PVZuKGksYSksZz1abihsLG8pO2lmKGxsLmNvcHkobikuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBSZShpLHMsY2gpLGNoLm1hdHJpeC5jb3B5KGxsKSxjaC5uZWVkc1VwZGF0ZT0hMCxlLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOnY9PmNoLmludGVyc2VjdHNCb3godiksaW50ZXJzZWN0c1RyaWFuZ2xlOnY9Pnt2LmEuYXBwbHlNYXRyaXg0KG4pLHYuYi5hcHBseU1hdHJpeDQobiksdi5jLmFwcGx5TWF0cml4NChuKSx2Lm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgeD15KjMsXz0oZyt5KSozO3g8Xzt4Kz0zKWlmKHplKExvLHgsaCxmKSxMby5uZWVkc1VwZGF0ZT0hMCx2LmludGVyc2VjdHNUcmlhbmdsZShMbykpcmV0dXJuITA7cmV0dXJuITF9fSk7Zm9yKGxldCBtPXkqMyx2PShnK3kpKjM7bTx2O20rPTMpe3plKElvLG0saCxmKSxJby5hLmFwcGx5TWF0cml4NChsbCksSW8uYi5hcHBseU1hdHJpeDQobGwpLElvLmMuYXBwbHlNYXRyaXg0KGxsKSxJby5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9MCxfPWQuY291bnQ7eDxfO3grPTMpaWYoemUoTG8seCxkLHApLExvLm5lZWRzVXBkYXRlPSEwLElvLmludGVyc2VjdHNUcmlhbmdsZShMbykpcmV0dXJuITB9fWVsc2V7Y29uc3QgdT1pKzgsaD1hW2krNl07cmV0dXJuIFJlKHUscyxsaCksISEoci5pbnRlcnNlY3RzQm94KGxoKSYmZW0odSx0LGUsbixyKXx8KFJlKGgscyxsaCksci5pbnRlcnNlY3RzQm94KGxoKSYmZW0oaCx0LGUsbixyKSkpfX1jb25zdCB1aD1uZXcgUnQsbm09bmV3IGZuLGNsPW5ldyBmbixHMj1uZXcgUixIMj1uZXcgUixXMj1uZXcgUiwkMj1uZXcgUjtmdW5jdGlvbiBYMihpLHQsZSxuPXt9LHI9e30scz0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLG5tLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxubS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPWkuZ2VvbWV0cnksbD1hLmF0dHJpYnV0ZXMucG9zaXRpb24sYz1hLmluZGV4LHU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGg9dC5pbmRleCxmPVFuLmdldFByaW1pdGl2ZSgpLGQ9UW4uZ2V0UHJpbWl0aXZlKCk7bGV0IHA9RzIseT1IMixnPW51bGwsbT1udWxsO3ImJihnPVcyLG09JDIpO2xldCB2PTEvMCx4PW51bGwsXz1udWxsO3JldHVybiB1aC5jb3B5KGUpLmludmVydCgpLGNsLm1hdHJpeC5jb3B5KHVoKSxpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpNPT5ubS5kaXN0YW5jZVRvQm94KE0pLGludGVyc2VjdHNCb3VuZHM6KE0sYixBKT0+QTx2JiZBPG8/KGImJihjbC5taW4uY29weShNLm1pbiksY2wubWF4LmNvcHkoTS5tYXgpLGNsLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihNLGIpPT57aWYodC5ib3VuZHNUcmVlKXJldHVybiB0LmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOkU9PmNsLmRpc3RhbmNlVG9Cb3goRSksaW50ZXJzZWN0c0JvdW5kczooRSx3LFMpPT5TPHYmJlM8byxpbnRlcnNlY3RzUmFuZ2U6KEUsdyk9Pntmb3IobGV0IFM9RSxUPUUrdztTPFQ7UysrKXt6ZShkLDMqUyxoLHUpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBEPU0sTD1NK2I7RDxMO0QrKyl7emUoZiwzKkQsYyxsKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IE49Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLGcpO2lmKE48diYmKHkuY29weShwKSxtJiZtLmNvcHkoZyksdj1OLHg9RCxfPVMpLE48cylyZXR1cm4hMH19fX0pO3tjb25zdCBBPUNvKHQpO2ZvcihsZXQgRT0wLHc9QTtFPHc7RSsrKXt6ZShkLDMqRSxoLHUpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBTPU0sVD1NK2I7UzxUO1MrKyl7emUoZiwzKlMsYyxsKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEQ9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLGcpO2lmKEQ8diYmKHkuY29weShwKSxtJiZtLmNvcHkoZyksdj1ELHg9UyxfPUUpLEQ8cylyZXR1cm4hMH19fX19KSxRbi5yZWxlYXNlUHJpbWl0aXZlKGYpLFFuLnJlbGVhc2VQcmltaXRpdmUoZCksdj09PTEvMD9udWxsOihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLmRpc3RhbmNlPXYsbi5mYWNlSW5kZXg9eCxyJiYoci5wb2ludD9yLnBvaW50LmNvcHkobSk6ci5wb2ludD1tLmNsb25lKCksci5wb2ludC5hcHBseU1hdHJpeDQodWgpLHkuYXBwbHlNYXRyaXg0KHVoKSxyLmRpc3RhbmNlPXkuc3ViKHIucG9pbnQpLmxlbmd0aCgpLHIuZmFjZUluZGV4PV8pLG4pfWZ1bmN0aW9uIHEyKGksdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPWkuZ2VvbWV0cnksbj1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxyPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgcyxvLGEsbCxjPTA7Y29uc3QgdT1pLl9yb290cztmb3IobGV0IGY9MCxkPXUubGVuZ3RoO2Y8ZDtmKyspcz11W2ZdLG89bmV3IFVpbnQzMkFycmF5KHMpLGE9bmV3IFVpbnQxNkFycmF5KHMpLGw9bmV3IEZsb2F0MzJBcnJheShzKSxoKDAsYyksYys9cy5ieXRlTGVuZ3RoO2Z1bmN0aW9uIGgoZixkLHA9ITEpe2NvbnN0IHk9ZioyO2lmKGFbeSsxNV09PT1RdSl7Y29uc3QgbT1vW2YrNl0sdj1hW3krMTRdO2xldCB4PTEvMCxfPTEvMCxNPTEvMCxiPS0xLzAsQT0tMS8wLEU9LTEvMDtmb3IobGV0IHc9bSxTPW0rdjt3PFM7dysrKXtjb25zdCBUPTMqaS5yZXNvbHZlVHJpYW5nbGVJbmRleCh3KTtmb3IobGV0IEQ9MDtEPDM7RCsrKXtsZXQgTD1UK0Q7TD1uP25bTF06TDtjb25zdCBOPXIuZ2V0WChMKSxGPXIuZ2V0WShMKSxCPXIuZ2V0WihMKTtOPHgmJih4PU4pLE4+YiYmKGI9TiksRjxfJiYoXz1GKSxGPkEmJihBPUYpLEI8TSYmKE09QiksQj5FJiYoRT1CKX19cmV0dXJuIGxbZiswXSE9PXh8fGxbZisxXSE9PV98fGxbZisyXSE9PU18fGxbZiszXSE9PWJ8fGxbZis0XSE9PUF8fGxbZis1XSE9PUU/KGxbZiswXT14LGxbZisxXT1fLGxbZisyXT1NLGxbZiszXT1iLGxbZis0XT1BLGxbZis1XT1FLCEwKTohMX1lbHNle2NvbnN0IG09Zis4LHY9b1tmKzZdLHg9bStkLF89ditkO2xldCBNPXAsYj0hMSxBPSExO3Q/TXx8KGI9dC5oYXMoeCksQT10LmhhcyhfKSxNPSFiJiYhQSk6KGI9ITAsQT0hMCk7Y29uc3QgRT1NfHxiLHc9TXx8QTtsZXQgUz0hMTtFJiYoUz1oKG0sZCxNKSk7bGV0IFQ9ITE7dyYmKFQ9aCh2LGQsTSkpO2NvbnN0IEQ9U3x8VDtpZihEKWZvcihsZXQgTD0wO0w8MztMKyspe2NvbnN0IE49bStMLEY9ditMLEI9bFtOXSxHPWxbTiszXSxrPWxbRl0sUT1sW0YrM107bFtmK0xdPUI8az9COmssbFtmK0wrM109Rz5RP0c6UX1yZXR1cm4gRH19fWZ1bmN0aW9uIFkyKGksdCxlLG4scixzLG8pe01lLnNldEJ1ZmZlcihpLl9yb290c1t0XSksaW0oMCxpLGUsbixyLHMsbyksTWUuY2xlYXJCdWZmZXIoKX1mdW5jdGlvbiBpbShpLHQsZSxuLHIscyxvKXtjb25zdHtmbG9hdDMyQXJyYXk6YSx1aW50MTZBcnJheTpsLHVpbnQzMkFycmF5OmN9PU1lLHU9aSoyO2lmKEVuKHUsbCkpe2NvbnN0IGY9Vm4oaSxjKSxkPVpuKHUsbCk7TjIodCxlLG4sZixkLHIscyxvKX1lbHNle2NvbnN0IGY9Sm4oaSk7SXIoZixhLG4scyxvKSYmaW0oZix0LGUsbixyLHMsbyk7Y29uc3QgZD1qbihpLGMpO0lyKGQsYSxuLHMsbykmJmltKGQsdCxlLG4scixzLG8pfX1jb25zdCBaMj1bIngiLCJ5IiwieiJdO2Z1bmN0aW9uIEoyKGksdCxlLG4scixzKXtNZS5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IG89cm0oMCxpLGUsbixyLHMpO3JldHVybiBNZS5jbGVhckJ1ZmZlcigpLG99ZnVuY3Rpb24gcm0oaSx0LGUsbixyLHMpe2NvbnN0e2Zsb2F0MzJBcnJheTpvLHVpbnQxNkFycmF5OmEsdWludDMyQXJyYXk6bH09TWU7bGV0IGM9aSoyO2lmKEVuKGMsYSkpe2NvbnN0IGg9Vm4oaSxsKSxmPVpuKGMsYSk7cmV0dXJuIEYyKHQsZSxuLGgsZixyLHMpfWVsc2V7Y29uc3QgaD1mdihpLGwpLGY9WjJbaF0scD1uLmRpcmVjdGlvbltmXT49MDtsZXQgeSxnO3A/KHk9Sm4oaSksZz1qbihpLGwpKTooeT1qbihpLGwpLGc9Sm4oaSkpO2NvbnN0IHY9SXIoeSxvLG4scixzKT9ybSh5LHQsZSxuLHIscyk6bnVsbDtpZih2KXtjb25zdCBNPXYucG9pbnRbZl07aWYocD9NPD1vW2craF06TT49b1tnK2grM10pcmV0dXJuIHZ9Y29uc3QgXz1JcihnLG8sbixyLHMpP3JtKGcsdCxlLG4scixzKTpudWxsO3JldHVybiB2JiZfP3YuZGlzdGFuY2U8PV8uZGlzdGFuY2U/djpfOnZ8fF98fG51bGx9fWNvbnN0IGhoPW5ldyBtZSxEbz1uZXcgS24sVW89bmV3IEtuLHVsPW5ldyBSdCx4dj1uZXcgZm4sZmg9bmV3IGZuO2Z1bmN0aW9uIGoyKGksdCxlLG4pe01lLnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgcj1zbSgwLGksZSxuKTtyZXR1cm4gTWUuY2xlYXJCdWZmZXIoKSxyfWZ1bmN0aW9uIHNtKGksdCxlLG4scj1udWxsKXtjb25zdHtmbG9hdDMyQXJyYXk6cyx1aW50MTZBcnJheTpvLHVpbnQzMkFycmF5OmF9PU1lO2xldCBsPWkqMjtpZihyPT09bnVsbCYmKGUuYm91bmRpbmdCb3h8fGUuY29tcHV0ZUJvdW5kaW5nQm94KCkseHYuc2V0KGUuYm91bmRpbmdCb3gubWluLGUuYm91bmRpbmdCb3gubWF4LG4pLHI9eHYpLEVuKGwsbykpe2NvbnN0IHU9dC5nZW9tZXRyeSxoPXUuaW5kZXgsZj11LmF0dHJpYnV0ZXMucG9zaXRpb24sZD1lLmluZGV4LHA9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHk9Vm4oaSxhKSxnPVpuKGwsbyk7aWYodWwuY29weShuKS5pbnZlcnQoKSxlLmJvdW5kc1RyZWUpcmV0dXJuIFJlKGkscyxmaCksZmgubWF0cml4LmNvcHkodWwpLGZoLm5lZWRzVXBkYXRlPSEwLGUuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6dj0+ZmguaW50ZXJzZWN0c0JveCh2KSxpbnRlcnNlY3RzVHJpYW5nbGU6dj0+e3YuYS5hcHBseU1hdHJpeDQobiksdi5iLmFwcGx5TWF0cml4NChuKSx2LmMuYXBwbHlNYXRyaXg0KG4pLHYubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB4PXksXz1nK3k7eDxfO3grKylpZih6ZShVbywzKnQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeCksaCxmKSxVby5uZWVkc1VwZGF0ZT0hMCx2LmludGVyc2VjdHNUcmlhbmdsZShVbykpcmV0dXJuITA7cmV0dXJuITF9fSk7Zm9yKGxldCBtPXksdj1nK3k7bTx2O20rKyl7Y29uc3QgeD10LnJlc29sdmVUcmlhbmdsZUluZGV4KG0pO3plKERvLDMqeCxoLGYpLERvLmEuYXBwbHlNYXRyaXg0KHVsKSxEby5iLmFwcGx5TWF0cml4NCh1bCksRG8uYy5hcHBseU1hdHJpeDQodWwpLERvLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgXz0wLE09ZC5jb3VudDtfPE07Xys9MylpZih6ZShVbyxfLGQscCksVW8ubmVlZHNVcGRhdGU9ITAsRG8uaW50ZXJzZWN0c1RyaWFuZ2xlKFVvKSlyZXR1cm4hMH19ZWxzZXtjb25zdCB1PWkrOCxoPWFbaSs2XTtyZXR1cm4gUmUodSxzLGhoKSwhIShyLmludGVyc2VjdHNCb3goaGgpJiZzbSh1LHQsZSxuLHIpfHwoUmUoaCxzLGhoKSxyLmludGVyc2VjdHNCb3goaGgpJiZzbShoLHQsZSxuLHIpKSl9fWNvbnN0IGRoPW5ldyBSdCxvbT1uZXcgZm4saGw9bmV3IGZuLEsyPW5ldyBSLFEyPW5ldyBSLHQzPW5ldyBSLGUzPW5ldyBSO2Z1bmN0aW9uIG4zKGksdCxlLG49e30scj17fSxzPTAsbz0xLzApe3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCksb20uc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLG9tLm5lZWRzVXBkYXRlPSEwO2NvbnN0IGE9aS5nZW9tZXRyeSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbixjPWEuaW5kZXgsdT10LmF0dHJpYnV0ZXMucG9zaXRpb24saD10LmluZGV4LGY9UW4uZ2V0UHJpbWl0aXZlKCksZD1Rbi5nZXRQcmltaXRpdmUoKTtsZXQgcD1LMix5PVEyLGc9bnVsbCxtPW51bGw7ciYmKGc9dDMsbT1lMyk7bGV0IHY9MS8wLHg9bnVsbCxfPW51bGw7cmV0dXJuIGRoLmNvcHkoZSkuaW52ZXJ0KCksaGwubWF0cml4LmNvcHkoZGgpLGkuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOk09Pm9tLmRpc3RhbmNlVG9Cb3goTSksaW50ZXJzZWN0c0JvdW5kczooTSxiLEEpPT5BPHYmJkE8bz8oYiYmKGhsLm1pbi5jb3B5KE0ubWluKSxobC5tYXguY29weShNLm1heCksaGwubmVlZHNVcGRhdGU9ITApLCEwKTohMSxpbnRlcnNlY3RzUmFuZ2U6KE0sYik9PntpZih0LmJvdW5kc1RyZWUpe2NvbnN0IEE9dC5ib3VuZHNUcmVlO3JldHVybiBBLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpFPT5obC5kaXN0YW5jZVRvQm94KEUpLGludGVyc2VjdHNCb3VuZHM6KEUsdyxTKT0+Uzx2JiZTPG8saW50ZXJzZWN0c1JhbmdlOihFLHcpPT57Zm9yKGxldCBTPUUsVD1FK3c7UzxUO1MrKyl7Y29uc3QgRD1BLnJlc29sdmVUcmlhbmdsZUluZGV4KFMpO3plKGQsMypELGgsdSksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IEw9TSxOPU0rYjtMPE47TCsrKXtjb25zdCBGPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoTCk7emUoZiwzKkYsYyxsKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEI9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLGcpO2lmKEI8diYmKHkuY29weShwKSxtJiZtLmNvcHkoZyksdj1CLHg9TCxfPVMpLEI8cylyZXR1cm4hMH19fX0pfWVsc2V7Y29uc3QgQT1Dbyh0KTtmb3IobGV0IEU9MCx3PUE7RTx3O0UrKyl7emUoZCwzKkUsaCx1KSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgUz1NLFQ9TStiO1M8VDtTKyspe2NvbnN0IEQ9aS5yZXNvbHZlVHJpYW5nbGVJbmRleChTKTt6ZShmLDMqRCxjLGwpLGYubmVlZHNVcGRhdGU9ITA7Y29uc3QgTD1mLmRpc3RhbmNlVG9UcmlhbmdsZShkLHAsZyk7aWYoTDx2JiYoeS5jb3B5KHApLG0mJm0uY29weShnKSx2PUwseD1TLF89RSksTDxzKXJldHVybiEwfX19fX0pLFFuLnJlbGVhc2VQcmltaXRpdmUoZiksUW4ucmVsZWFzZVByaW1pdGl2ZShkKSx2PT09MS8wP251bGw6KG4ucG9pbnQ/bi5wb2ludC5jb3B5KHkpOm4ucG9pbnQ9eS5jbG9uZSgpLG4uZGlzdGFuY2U9dixuLmZhY2VJbmRleD14LHImJihyLnBvaW50P3IucG9pbnQuY29weShtKTpyLnBvaW50PW0uY2xvbmUoKSxyLnBvaW50LmFwcGx5TWF0cml4NChkaCkseS5hcHBseU1hdHJpeDQoZGgpLHIuZGlzdGFuY2U9eS5zdWIoci5wb2ludCkubGVuZ3RoKCksci5mYWNlSW5kZXg9Xyksbil9ZnVuY3Rpb24gaTMoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIn1jb25zdCBmbD1uZXcgTWUuY29uc3RydWN0b3IscGg9bmV3IE1lLmNvbnN0cnVjdG9yLExyPW5ldyBKcCgoKT0+bmV3IG1lKSxObz1uZXcgbWUsRm89bmV3IG1lLGFtPW5ldyBtZSxsbT1uZXcgbWU7bGV0IGNtPSExO2Z1bmN0aW9uIHIzKGksdCxlLG4pe2lmKGNtKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogUmVjdXJzaXZlIGNhbGxzIHRvIGJ2aGNhc3Qgbm90IHN1cHBvcnRlZC4iKTtjbT0hMDtjb25zdCByPWkuX3Jvb3RzLHM9dC5fcm9vdHM7bGV0IG8sYT0wLGw9MDtjb25zdCBjPW5ldyBSdCgpLmNvcHkoZSkuaW52ZXJ0KCk7Zm9yKGxldCB1PTAsaD1yLmxlbmd0aDt1PGg7dSsrKXtmbC5zZXRCdWZmZXIoclt1XSksbD0wO2NvbnN0IGY9THIuZ2V0UHJpbWl0aXZlKCk7UmUoMCxmbC5mbG9hdDMyQXJyYXksZiksZi5hcHBseU1hdHJpeDQoYyk7Zm9yKGxldCBkPTAscD1zLmxlbmd0aDtkPHAmJihwaC5zZXRCdWZmZXIoc1tkXSksbz1taSgwLDAsZSxjLG4sYSxsLDAsMCxmKSxwaC5jbGVhckJ1ZmZlcigpLGwrPXNbZF0ubGVuZ3RoLCFvKTtkKyspO2lmKExyLnJlbGVhc2VQcmltaXRpdmUoZiksZmwuY2xlYXJCdWZmZXIoKSxhKz1yW3VdLmxlbmd0aCxvKWJyZWFrfXJldHVybiBjbT0hMSxvfWZ1bmN0aW9uIG1pKGksdCxlLG4scixzPTAsbz0wLGE9MCxsPTAsYz1udWxsLHU9ITEpe2xldCBoLGY7dT8oaD1waCxmPWZsKTooaD1mbCxmPXBoKTtjb25zdCBkPWguZmxvYXQzMkFycmF5LHA9aC51aW50MzJBcnJheSx5PWgudWludDE2QXJyYXksZz1mLmZsb2F0MzJBcnJheSxtPWYudWludDMyQXJyYXksdj1mLnVpbnQxNkFycmF5LHg9aSoyLF89dCoyLE09RW4oeCx5KSxiPUVuKF8sdik7bGV0IEE9ITE7aWYoYiYmTSl1P0E9cihWbih0LG0pLFpuKHQqMix2KSxWbihpLHApLFpuKGkqMix5KSxsLG8rdCxhLHMraSk6QT1yKFZuKGkscCksWm4oaSoyLHkpLFZuKHQsbSksWm4odCoyLHYpLGEscytpLGwsbyt0KTtlbHNlIGlmKGIpe2NvbnN0IEU9THIuZ2V0UHJpbWl0aXZlKCk7UmUodCxnLEUpLEUuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IHc9Sm4oaSksUz1qbihpLHApO1JlKHcsZCxObyksUmUoUyxkLEZvKTtjb25zdCBUPUUuaW50ZXJzZWN0c0JveChObyksRD1FLmludGVyc2VjdHNCb3goRm8pO0E9VCYmbWkodCx3LG4sZSxyLG8scyxsLGErMSxFLCF1KXx8RCYmbWkodCxTLG4sZSxyLG8scyxsLGErMSxFLCF1KSxMci5yZWxlYXNlUHJpbWl0aXZlKEUpfWVsc2V7Y29uc3QgRT1Kbih0KSx3PWpuKHQsbSk7UmUoRSxnLGFtKSxSZSh3LGcsbG0pO2NvbnN0IFM9Yy5pbnRlcnNlY3RzQm94KGFtKSxUPWMuaW50ZXJzZWN0c0JveChsbSk7aWYoUyYmVClBPW1pKGksRSxlLG4scixzLG8sYSxsKzEsYyx1KXx8bWkoaSx3LGUsbixyLHMsbyxhLGwrMSxjLHUpO2Vsc2UgaWYoUylpZihNKUE9bWkoaSxFLGUsbixyLHMsbyxhLGwrMSxjLHUpO2Vsc2V7Y29uc3QgRD1Mci5nZXRQcmltaXRpdmUoKTtELmNvcHkoYW0pLmFwcGx5TWF0cml4NChlKTtjb25zdCBMPUpuKGkpLE49am4oaSxwKTtSZShMLGQsTm8pLFJlKE4sZCxGbyk7Y29uc3QgRj1ELmludGVyc2VjdHNCb3goTm8pLEI9RC5pbnRlcnNlY3RzQm94KEZvKTtBPUYmJm1pKEUsTCxuLGUscixvLHMsbCxhKzEsRCwhdSl8fEImJm1pKEUsTixuLGUscixvLHMsbCxhKzEsRCwhdSksTHIucmVsZWFzZVByaW1pdGl2ZShEKX1lbHNlIGlmKFQpaWYoTSlBPW1pKGksdyxlLG4scixzLG8sYSxsKzEsYyx1KTtlbHNle2NvbnN0IEQ9THIuZ2V0UHJpbWl0aXZlKCk7RC5jb3B5KGxtKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgTD1KbihpKSxOPWpuKGkscCk7UmUoTCxkLE5vKSxSZShOLGQsRm8pO2NvbnN0IEY9RC5pbnRlcnNlY3RzQm94KE5vKSxCPUQuaW50ZXJzZWN0c0JveChGbyk7QT1GJiZtaSh3LEwsbixlLHIsbyxzLGwsYSsxLEQsIXUpfHxCJiZtaSh3LE4sbixlLHIsbyxzLGwsYSsxLEQsIXUpLExyLnJlbGVhc2VQcmltaXRpdmUoRCl9fXJldHVybiBBfWNvbnN0IG1oPW5ldyBmbix2dj1uZXcgbWUsczM9e3N0cmF0ZWd5OnJ2LG1heERlcHRoOjQwLG1heExlYWZUcmlzOjEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOiExLHNldEJvdW5kaW5nQm94OiEwLG9uUHJvZ3Jlc3M6bnVsbCxpbmRpcmVjdDohMSx2ZXJib3NlOiEwLHJhbmdlOm51bGx9O2NsYXNzIHVte3N0YXRpYyBzZXJpYWxpemUodCxlPXt9KXtlPW9uKHtjbG9uZUJ1ZmZlcnM6ITB9LGUpO2NvbnN0IG49dC5nZW9tZXRyeSxyPXQuX3Jvb3RzLHM9dC5faW5kaXJlY3RCdWZmZXIsbz1uLmdldEluZGV4KCk7bGV0IGE7cmV0dXJuIGUuY2xvbmVCdWZmZXJzP2E9e3Jvb3RzOnIubWFwKGw9Pmwuc2xpY2UoKSksaW5kZXg6bz9vLmFycmF5LnNsaWNlKCk6bnVsbCxpbmRpcmVjdEJ1ZmZlcjpzP3Muc2xpY2UoKTpudWxsfTphPXtyb290czpyLGluZGV4Om8/by5hcnJheTpudWxsLGluZGlyZWN0QnVmZmVyOnN9LGF9c3RhdGljIGRlc2VyaWFsaXplKHQsZSxuPXt9KXtuPW9uKHtzZXRJbmRleDohMCxpbmRpcmVjdDohIXQuaW5kaXJlY3RCdWZmZXJ9LG4pO2NvbnN0e2luZGV4OnIscm9vdHM6cyxpbmRpcmVjdEJ1ZmZlcjpvfT10LGE9bmV3IHVtKGUsRmkob24oe30sbikse1tIcF06ITB9KSk7aWYoYS5fcm9vdHM9cyxhLl9pbmRpcmVjdEJ1ZmZlcj1vfHxudWxsLG4uc2V0SW5kZXgpe2NvbnN0IGw9ZS5nZXRJbmRleCgpO2lmKGw9PT1udWxsKXtjb25zdCBjPW5ldyBKdCh0LmluZGV4LDEsITEpO2Uuc2V0SW5kZXgoYyl9ZWxzZSBsLmFycmF5IT09ciYmKGwuYXJyYXkuc2V0KHIpLGwubmVlZHNVcGRhdGU9ITApfXJldHVybiBhfWdldCBpbmRpcmVjdCgpe3JldHVybiEhdGhpcy5faW5kaXJlY3RCdWZmZXJ9Y29uc3RydWN0b3IodCxlPXt9KXtpZih0LmlzQnVmZmVyR2VvbWV0cnkpe2lmKHQuaW5kZXgmJnQuaW5kZXguaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBpbmRleCBhdHRyaWJ1dGUuIil9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IE9ubHkgQnVmZmVyR2VvbWV0cmllcyBhcmUgc3VwcG9ydGVkLiIpO2lmKGU9T2JqZWN0LmFzc2lnbihGaShvbih7fSxzMykse1tIcF06ITF9KSxlKSxlLnVzZVNoYXJlZEFycmF5QnVmZmVyJiYhaTMoKSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFNoYXJlZEFycmF5QnVmZmVyIGlzIG5vdCBhdmFpbGFibGUuIik7dGhpcy5nZW9tZXRyeT10LHRoaXMuX3Jvb3RzPW51bGwsdGhpcy5faW5kaXJlY3RCdWZmZXI9bnVsbCxlW0hwXXx8KHYyKHRoaXMsZSksIXQuYm91bmRpbmdCb3gmJmUuc2V0Qm91bmRpbmdCb3gmJih0LmJvdW5kaW5nQm94PXRoaXMuZ2V0Qm91bmRpbmdCb3gobmV3IG1lKSkpLHRoaXMucmVzb2x2ZVRyaWFuZ2xlSW5kZXg9ZS5pbmRpcmVjdD9uPT50aGlzLl9pbmRpcmVjdEJ1ZmZlcltuXTpuPT5ufXJlZml0KHQ9bnVsbCl7cmV0dXJuKHRoaXMuaW5kaXJlY3Q/cTI6VTIpKHRoaXMsdCl9dHJhdmVyc2UodCxlPTApe2NvbnN0IG49dGhpcy5fcm9vdHNbZV0scj1uZXcgVWludDMyQXJyYXkobikscz1uZXcgVWludDE2QXJyYXkobik7bygwKTtmdW5jdGlvbiBvKGEsbD0wKXtjb25zdCBjPWEqMix1PXNbYysxNV09PT1RdTtpZih1KXtjb25zdCBoPXJbYSs2XSxmPXNbYysxNF07dChsLHUsbmV3IEZsb2F0MzJBcnJheShuLGEqNCw2KSxoLGYpfWVsc2V7Y29uc3QgaD1hK2lsLzQsZj1yW2ErNl0sZD1yW2ErN107dChsLHUsbmV3IEZsb2F0MzJBcnJheShuLGEqNCw2KSxkKXx8KG8oaCxsKzEpLG8oZixsKzEpKX19fXJheWNhc3QodCxlPXNpLG49MCxyPTEvMCl7Y29uc3Qgcz10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxsPWUuaXNNYXRlcmlhbCxjPUFycmF5LmlzQXJyYXkoZSksdT1vLmdyb3VwcyxoPWw/ZS5zaWRlOmUsZj10aGlzLmluZGlyZWN0P1kyOk8yO2ZvcihsZXQgZD0wLHA9cy5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1jP2VbdVtkXS5tYXRlcmlhbEluZGV4XS5zaWRlOmgsZz1hLmxlbmd0aDtpZihmKHRoaXMsZCx5LHQsYSxuLHIpLGMpe2NvbnN0IG09dVtkXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgdj1nLHg9YS5sZW5ndGg7djx4O3YrKylhW3ZdLmZhY2UubWF0ZXJpYWxJbmRleD1tfX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPXNpLG49MCxyPTEvMCl7Y29uc3Qgcz10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1lLmlzTWF0ZXJpYWwsbD1BcnJheS5pc0FycmF5KGUpO2xldCBjPW51bGw7Y29uc3QgdT1vLmdyb3VwcyxoPWE/ZS5zaWRlOmUsZj10aGlzLmluZGlyZWN0P0oyOmsyO2ZvcihsZXQgZD0wLHA9cy5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1sP2VbdVtkXS5tYXRlcmlhbEluZGV4XS5zaWRlOmgsZz1mKHRoaXMsZCx5LHQsbixyKTtnIT1udWxsJiYoYz09bnVsbHx8Zy5kaXN0YW5jZTxjLmRpc3RhbmNlKSYmKGM9ZyxsJiYoZy5mYWNlLm1hdGVyaWFsSW5kZXg9dVtkXS5tYXRlcmlhbEluZGV4KSl9cmV0dXJuIGN9aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7bGV0IG49ITE7Y29uc3Qgcj10aGlzLl9yb290cyxzPXRoaXMuaW5kaXJlY3Q/ajI6VjI7Zm9yKGxldCBvPTAsYT1yLmxlbmd0aDtvPGEmJihuPXModGhpcyxvLHQsZSksIW4pO28rKyk7cmV0dXJuIG59c2hhcGVjYXN0KHQpe2NvbnN0IGU9UW4uZ2V0UHJpbWl0aXZlKCksbj10aGlzLmluZGlyZWN0P0IyOkQyO2xldHtib3VuZHNUcmF2ZXJzZU9yZGVyOnIsaW50ZXJzZWN0c0JvdW5kczpzLGludGVyc2VjdHNSYW5nZTpvLGludGVyc2VjdHNUcmlhbmdsZTphfT10O2lmKG8mJmEpe2NvbnN0IGg9bztvPShmLGQscCx5LGcpPT5oKGYsZCxwLHksZyk/ITA6bihmLGQsdGhpcyxhLHAseSxlKX1lbHNlIG98fChhP289KGgsZixkLHApPT5uKGgsZix0aGlzLGEsZCxwLGUpOm89KGgsZixkKT0+ZCk7bGV0IGw9ITEsYz0wO2NvbnN0IHU9dGhpcy5fcm9vdHM7Zm9yKGxldCBoPTAsZj11Lmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPXVbaF07aWYobD1FMih0aGlzLGgscyxvLHIsYyksbClicmVhaztjKz1kLmJ5dGVMZW5ndGh9cmV0dXJuIFFuLnJlbGVhc2VQcmltaXRpdmUoZSksbH1idmhjYXN0KHQsZSxuKXtsZXR7aW50ZXJzZWN0c1JhbmdlczpyLGludGVyc2VjdHNUcmlhbmdsZXM6c309bjtjb25zdCBvPVFuLmdldFByaW1pdGl2ZSgpLGE9dGhpcy5nZW9tZXRyeS5pbmRleCxsPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixjPXRoaXMuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dGhpcy5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTt6ZShvLHkqMyxhLGwpfTpwPT57emUobyxwKjMsYSxsKX0sdT1Rbi5nZXRQcmltaXRpdmUoKSxoPXQuZ2VvbWV0cnkuaW5kZXgsZj10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZD10LmluZGlyZWN0P3A9Pntjb25zdCB5PXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7emUodSx5KjMsaCxmKX06cD0+e3plKHUscCozLGgsZil9O2lmKHMpe2NvbnN0IHA9KHksZyxtLHYseCxfLE0sYik9Pntmb3IobGV0IEE9bSxFPW0rdjtBPEU7QSsrKXtkKEEpLHUuYS5hcHBseU1hdHJpeDQoZSksdS5iLmFwcGx5TWF0cml4NChlKSx1LmMuYXBwbHlNYXRyaXg0KGUpLHUubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PXksUz15K2c7dzxTO3crKylpZihjKHcpLG8ubmVlZHNVcGRhdGU9ITAscyhvLHUsdyxBLHgsXyxNLGIpKXJldHVybiEwfXJldHVybiExfTtpZihyKXtjb25zdCB5PXI7cj1mdW5jdGlvbihnLG0sdix4LF8sTSxiLEEpe3JldHVybiB5KGcsbSx2LHgsXyxNLGIsQSk/ITA6cChnLG0sdix4LF8sTSxiLEEpfX1lbHNlIHI9cH1yZXR1cm4gcjModGhpcyx0LGUscil9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBtaC5zZXQodC5taW4sdC5tYXgsZSksbWgubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6bj0+bWguaW50ZXJzZWN0c0JveChuKSxpbnRlcnNlY3RzVHJpYW5nbGU6bj0+bWguaW50ZXJzZWN0c1RyaWFuZ2xlKG4pfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSxuPXt9LHI9e30scz0wLG89MS8wKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9uMzpYMikodGhpcyx0LGUsbixyLHMsbyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGU9e30sbj0wLHI9MS8wKXtyZXR1cm4gVDIodGhpcyx0LGUsbixyKX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdC5tYWtlRW1wdHkoKSx0aGlzLl9yb290cy5mb3JFYWNoKG49PntSZSgwLG5ldyBGbG9hdDMyQXJyYXkobiksdnYpLHQudW5pb24odnYpfSksdH19Y29uc3QgU3Y9MWUtNixvMz1TdiouNSxNdj1NYXRoLnBvdygxMCwtTWF0aC5sb2cxMChTdikpLGEzPW8zKk12O2Z1bmN0aW9uIFBpKGkpe3JldHVybn5+KGkqTXYrYTMpfWZ1bmN0aW9uIGwzKGkpe3JldHVybmAke1BpKGkueCl9LCR7UGkoaS55KX1gfWZ1bmN0aW9uIGJ2KGkpe3JldHVybmAke1BpKGkueCl9LCR7UGkoaS55KX0sJHtQaShpLnopfWB9ZnVuY3Rpb24gYzMoaSl7cmV0dXJuYCR7UGkoaS54KX0sJHtQaShpLnkpfSwke1BpKGkueil9LCR7UGkoaS53KX1gfWZ1bmN0aW9uIHUzKGksdCxlKXtlLmRpcmVjdGlvbi5zdWJWZWN0b3JzKHQsaSkubm9ybWFsaXplKCk7Y29uc3Qgbj1pLmRvdChlLmRpcmVjdGlvbik7cmV0dXJuIGUub3JpZ2luLmNvcHkoaSkuYWRkU2NhbGVkVmVjdG9yKGUuZGlyZWN0aW9uLC1uKSxlfWZ1bmN0aW9uIHd2KCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gaDMoaSl7aWYoaS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcilyZXR1cm4gaTtjb25zdCB0PWkuY29uc3RydWN0b3IsZT1pLmJ1ZmZlcixuPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihlLmJ5dGVMZW5ndGgpLHI9bmV3IFVpbnQ4QXJyYXkoZSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pLnNldChyLDApLG5ldyB0KG4pfWZ1bmN0aW9uIGYzKGksdD1BcnJheUJ1ZmZlcil7cmV0dXJuIGk+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqaSkpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKmkpKX1mdW5jdGlvbiBkMyhpLHQpe2lmKCFpLmluZGV4KXtjb25zdCBlPWkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscj1mMyhlLG4pO2kuc2V0SW5kZXgobmV3IEp0KHIsMSkpO2ZvcihsZXQgcz0wO3M8ZTtzKyspcltzXT1zfX1mdW5jdGlvbiBwMyhpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiBobShpKXtyZXR1cm4gcDMoaSkvM31jb25zdCBtMz0xZS04LGczPW5ldyBSO2Z1bmN0aW9uIHkzKGkpe3JldHVybn5+KGkvMyl9ZnVuY3Rpb24gXzMoaSl7cmV0dXJuIGklM31mdW5jdGlvbiBBdihpLHQpe3JldHVybiBpLnN0YXJ0LXQuc3RhcnR9ZnVuY3Rpb24gRXYoaSx0KXtyZXR1cm4gZzMuc3ViVmVjdG9ycyh0LGkub3JpZ2luKS5kb3QoaS5kaXJlY3Rpb24pfWZ1bmN0aW9uIHgzKGksdCxlLG49bTMpe2kuc29ydChBdiksdC5zb3J0KEF2KTtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKyl7Y29uc3QgbD1pW2FdO2ZvcihsZXQgYz0wO2M8dC5sZW5ndGg7YysrKXtjb25zdCB1PXRbY107aWYoISh1LnN0YXJ0PmwuZW5kKSl7aWYobC5lbmQ8dS5zdGFydHx8dS5lbmQ8bC5zdGFydCljb250aW51ZTtpZihsLnN0YXJ0PD11LnN0YXJ0JiZsLmVuZD49dS5lbmQpcyh1LmVuZCxsLmVuZCl8fGkuc3BsaWNlKGErMSwwLHtzdGFydDp1LmVuZCxlbmQ6bC5lbmQsaW5kZXg6bC5pbmRleH0pLGwuZW5kPXUuc3RhcnQsdS5zdGFydD0wLHUuZW5kPTA7ZWxzZSBpZihsLnN0YXJ0Pj11LnN0YXJ0JiZsLmVuZDw9dS5lbmQpcyhsLmVuZCx1LmVuZCl8fHQuc3BsaWNlKGMrMSwwLHtzdGFydDpsLmVuZCxlbmQ6dS5lbmQsaW5kZXg6dS5pbmRleH0pLHUuZW5kPWwuc3RhcnQsbC5zdGFydD0wLGwuZW5kPTA7ZWxzZSBpZihsLnN0YXJ0PD11LnN0YXJ0JiZsLmVuZDw9dS5lbmQpe2NvbnN0IGg9bC5lbmQ7bC5lbmQ9dS5zdGFydCx1LnN0YXJ0PWh9ZWxzZSBpZihsLnN0YXJ0Pj11LnN0YXJ0JiZsLmVuZD49dS5lbmQpe2NvbnN0IGg9dS5lbmQ7dS5lbmQ9bC5zdGFydCxsLnN0YXJ0PWh9ZWxzZSB0aHJvdyBuZXcgRXJyb3J9aWYoZS5oYXMobC5pbmRleCl8fGUuc2V0KGwuaW5kZXgsW10pLGUuaGFzKHUuaW5kZXgpfHxlLnNldCh1LmluZGV4LFtdKSxlLmdldChsLmluZGV4KS5wdXNoKHUuaW5kZXgpLGUuZ2V0KHUuaW5kZXgpLnB1c2gobC5pbmRleCksbyh1KSYmKHQuc3BsaWNlKGMsMSksYy0tKSxvKGwpKXtpLnNwbGljZShhLDEpLGEtLTticmVha319fXIoaSkscih0KTtmdW5jdGlvbiByKGEpe2ZvcihsZXQgbD0wO2w8YS5sZW5ndGg7bCsrKW8oYVtsXSkmJihhLnNwbGljZShsLDEpLGwtLSl9ZnVuY3Rpb24gcyhhLGwpe3JldHVybiBNYXRoLmFicyhsLWEpPG59ZnVuY3Rpb24gbyhhKXtyZXR1cm4gTWF0aC5hYnMoYS5lbmQtYS5zdGFydCk8bn19Y29uc3QgVHY9MWUtNSxDdj0xZS00O2NsYXNzIHYze2NvbnN0cnVjdG9yKCl7dGhpcy5fcmF5cz1bXX1hZGRSYXkodCl7dGhpcy5fcmF5cy5wdXNoKHQpfWZpbmRDbG9zZXN0UmF5KHQpe2NvbnN0IGU9dGhpcy5fcmF5cyxuPXQuY2xvbmUoKTtuLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7bGV0IHI9MS8wLHM9bnVsbDtmb3IobGV0IGw9MCxjPWUubGVuZ3RoO2w8YztsKyspe2NvbnN0IHU9ZVtsXTtpZihvKHUsdCkmJm8odSxuKSljb250aW51ZTtjb25zdCBoPWEodSx0KSxmPWEodSxuKSxkPU1hdGgubWluKGgsZik7ZDxyJiYocj1kLHM9dSl9cmV0dXJuIHM7ZnVuY3Rpb24gbyhsLGMpe2NvbnN0IHU9bC5vcmlnaW4uZGlzdGFuY2VUbyhjLm9yaWdpbik+VHY7cmV0dXJuIGwuZGlyZWN0aW9uLmFuZ2xlVG8oYy5kaXJlY3Rpb24pPkN2fHx1fWZ1bmN0aW9uIGEobCxjKXtjb25zdCB1PWwub3JpZ2luLmRpc3RhbmNlVG8oYy5vcmlnaW4pLGg9bC5kaXJlY3Rpb24uYW5nbGVUbyhjLmRpcmVjdGlvbik7cmV0dXJuIHUvVHYraC9Ddn19fWNvbnN0IGZtPW5ldyBSLGRtPW5ldyBSLGdoPW5ldyB2cjtmdW5jdGlvbiBTMyhpLHQsZSl7Y29uc3Qgbj1pLmF0dHJpYnV0ZXMscj1pLmluZGV4LHM9bi5wb3NpdGlvbixvPW5ldyBNYXAsYT1uZXcgTWFwLGw9QXJyYXkuZnJvbSh0KSxjPW5ldyB2Mztmb3IobGV0IHU9MCxoPWwubGVuZ3RoO3U8aDt1Kyspe2NvbnN0IGY9bFt1XSxkPXkzKGYpLHA9XzMoZik7bGV0IHk9MypkK3AsZz0zKmQrKHArMSklMztyJiYoeT1yLmdldFgoeSksZz1yLmdldFgoZykpLGZtLmZyb21CdWZmZXJBdHRyaWJ1dGUocyx5KSxkbS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsZyksdTMoZm0sZG0sZ2gpO2xldCBtLHY9Yy5maW5kQ2xvc2VzdFJheShnaCk7dj09PW51bGwmJih2PWdoLmNsb25lKCksYy5hZGRSYXkodikpLGEuaGFzKHYpfHxhLnNldCh2LHtmb3J3YXJkOltdLHJldmVyc2U6W10scmF5OnZ9KSxtPWEuZ2V0KHYpO2xldCB4PUV2KHYsZm0pLF89RXYodixkbSk7eD5fJiYoW3gsX109W18seF0pLGdoLmRpcmVjdGlvbi5kb3Qodi5kaXJlY3Rpb24pPDA/bS5yZXZlcnNlLnB1c2goe3N0YXJ0OngsZW5kOl8saW5kZXg6Zn0pOm0uZm9yd2FyZC5wdXNoKHtzdGFydDp4LGVuZDpfLGluZGV4OmZ9KX1yZXR1cm4gYS5mb3JFYWNoKCh7Zm9yd2FyZDp1LHJldmVyc2U6aH0sZik9Pnt4Myh1LGgsbyxlKSx1Lmxlbmd0aD09PTAmJmgubGVuZ3RoPT09MCYmYS5kZWxldGUoZil9KSx7ZGlzam9pbnRDb25uZWN0aXZpdHlNYXA6byxmcmFnbWVudE1hcDphfX1jb25zdCBNMz1uZXcgWCxwbT1uZXcgUixiMz1uZXcgUXQsbW09WyIiLCIiLCIiXTtjbGFzcyB3M3tjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuZGF0YT1udWxsLHRoaXMuZGlzam9pbnRDb25uZWN0aW9ucz1udWxsLHRoaXMudW5tYXRjaGVkRGlzam9pbnRFZGdlcz1udWxsLHRoaXMudW5tYXRjaGVkRWRnZXM9LTEsdGhpcy5tYXRjaGVkRWRnZXM9LTEsdGhpcy51c2VEcmF3UmFuZ2U9ITAsdGhpcy51c2VBbGxBdHRyaWJ1dGVzPSExLHRoaXMubWF0Y2hEaXNqb2ludEVkZ2VzPSExLHRoaXMuZGVnZW5lcmF0ZUVwc2lsb249MWUtOCx0JiZ0aGlzLnVwZGF0ZUZyb20odCl9Z2V0U2libGluZ1RyaWFuZ2xlSW5kZXgodCxlKXtjb25zdCBuPXRoaXMuZGF0YVt0KjMrZV07cmV0dXJuIG49PT0tMT8tMTp+fihuLzMpfWdldFNpYmxpbmdFZGdlSW5kZXgodCxlKXtjb25zdCBuPXRoaXMuZGF0YVt0KjMrZV07cmV0dXJuIG49PT0tMT8tMTpuJTN9Z2V0RGlzam9pbnRTaWJsaW5nVHJpYW5nbGVJbmRpY2VzKHQsZSl7Y29uc3Qgbj10KjMrZSxyPXRoaXMuZGlzam9pbnRDb25uZWN0aW9ucy5nZXQobik7cmV0dXJuIHI/ci5tYXAocz0+fn4ocy8zKSk6W119Z2V0RGlzam9pbnRTaWJsaW5nRWRnZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHI9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcj9yLm1hcChzPT5zJTMpOltdfWlzRnVsbHlDb25uZWN0ZWQoKXtyZXR1cm4gdGhpcy51bm1hdGNoZWRFZGdlcz09PTB9dXBkYXRlRnJvbSh0KXtjb25zdHt1c2VBbGxBdHRyaWJ1dGVzOmUsdXNlRHJhd1JhbmdlOm4sbWF0Y2hEaXNqb2ludEVkZ2VzOnIsZGVnZW5lcmF0ZUVwc2lsb246c309dGhpcyxvPWU/eDp2LGE9bmV3IE1hcCx7YXR0cmlidXRlczpsfT10LGM9ZT9PYmplY3Qua2V5cyhsKTpudWxsLHU9dC5pbmRleCxoPWwucG9zaXRpb247bGV0IGY9aG0odCk7Y29uc3QgZD1mO2xldCBwPTA7biYmKHA9dC5kcmF3UmFuZ2Uuc3RhcnQsdC5kcmF3UmFuZ2UuY291bnQhPT0xLzAmJihmPX5+KHQuZHJhd1JhbmdlLmNvdW50LzMpKSk7bGV0IHk9dGhpcy5kYXRhOygheXx8eS5sZW5ndGg8MypkKSYmKHk9bmV3IEludDMyQXJyYXkoMypkKSkseS5maWxsKC0xKTtsZXQgZz0wLG09bmV3IFNldDtmb3IobGV0IF89cCxNPWYqMytwO188TTtfKz0zKXtjb25zdCBiPV87Zm9yKGxldCBBPTA7QTwzO0ErKyl7bGV0IEU9YitBO3UmJihFPXUuZ2V0WChFKSksbW1bQV09byhFKX1mb3IobGV0IEE9MDtBPDM7QSsrKXtjb25zdCBFPShBKzEpJTMsdz1tbVtBXSxTPW1tW0VdLFQ9YCR7U31fJHt3fWA7aWYoYS5oYXMoVCkpe2NvbnN0IEQ9YitBLEw9YS5nZXQoVCk7eVtEXT1MLHlbTF09RCxhLmRlbGV0ZShUKSxnKz0yLG0uZGVsZXRlKEwpfWVsc2V7Y29uc3QgRD1gJHt3fV8ke1N9YCxMPWIrQTthLnNldChELEwpLG0uYWRkKEwpfX19aWYocil7Y29uc3R7ZnJhZ21lbnRNYXA6XyxkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpNfT1TMyh0LG0scyk7bS5jbGVhcigpLF8uZm9yRWFjaCgoe2ZvcndhcmQ6YixyZXZlcnNlOkF9KT0+e2IuZm9yRWFjaCgoe2luZGV4OkV9KT0+bS5hZGQoRSkpLEEuZm9yRWFjaCgoe2luZGV4OkV9KT0+bS5hZGQoRSkpfSksdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPV8sdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPU0sZz1mKjMtbS5zaXplfXRoaXMubWF0Y2hlZEVkZ2VzPWcsdGhpcy51bm1hdGNoZWRFZGdlcz1tLnNpemUsdGhpcy5kYXRhPXk7ZnVuY3Rpb24gdihfKXtyZXR1cm4gcG0uZnJvbUJ1ZmZlckF0dHJpYnV0ZShoLF8pLGJ2KHBtKX1mdW5jdGlvbiB4KF8pe2xldCBNPSIiO2ZvcihsZXQgYj0wLEE9Yy5sZW5ndGg7YjxBO2IrKyl7Y29uc3QgRT1sW2NbYl1dO2xldCB3O3N3aXRjaChFLml0ZW1TaXplKXtjYXNlIDE6dz1QaShFLmdldFgoXykpO2JyZWFrO2Nhc2UgMjp3PWwzKE0zLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSxfKSk7YnJlYWs7Y2FzZSAzOnc9YnYocG0uZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLF8pKTticmVhaztjYXNlIDQ6dz1jMyhiMy5mcm9tQnVmZmVyQXR0cmlidXRlKEUsXykpO2JyZWFrfU0hPT0iIiYmKE0rPSJ8IiksTSs9d31yZXR1cm4gTX19fWNsYXNzIHloIGV4dGVuZHMgVWV7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0JydXNoPSEwLHRoaXMuX3ByZXZpb3VzTWF0cml4PW5ldyBSdCx0aGlzLl9wcmV2aW91c01hdHJpeC5lbGVtZW50cy5maWxsKDApfW1hcmtVcGRhdGVkKCl7dGhpcy5fcHJldmlvdXNNYXRyaXguY29weSh0aGlzLm1hdHJpeCl9aXNEaXJ0eSgpe2NvbnN0e21hdHJpeDp0LF9wcmV2aW91c01hdHJpeDplfT10aGlzLG49dC5lbGVtZW50cyxyPWUuZWxlbWVudHM7Zm9yKGxldCBzPTA7czwxNjtzKyspaWYobltzXSE9PXJbc10pcmV0dXJuITA7cmV0dXJuITF9cHJlcGFyZUdlb21ldHJ5KCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5LGU9dC5hdHRyaWJ1dGVzLG49d3YoKTtpZihuKWZvcihjb25zdCByIGluIGUpe2NvbnN0IHM9ZVtyXTtpZihzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJCcnVzaDogSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpO3MuYXJyYXk9aDMocy5hcnJheSl9aWYodC5ib3VuZHNUcmVlfHwoZDModCx7dXNlU2hhcmVkQXJyYXlCdWZmZXI6bn0pLHQuYm91bmRzVHJlZT1uZXcgdW0odCx7bWF4TGVhZlRyaXM6MyxpbmRpcmVjdDohMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSkpLHQuaGFsZkVkZ2VzfHwodC5oYWxmRWRnZXM9bmV3IHczKHQpKSwhdC5ncm91cEluZGljZXMpe2NvbnN0IHI9aG0odCkscz1uZXcgVWludDE2QXJyYXkociksbz10Lmdyb3Vwcztmb3IobGV0IGE9MCxsPW8ubGVuZ3RoO2E8bDthKyspe2NvbnN0e3N0YXJ0OmMsY291bnQ6dX09b1thXTtmb3IobGV0IGg9Yy8zLGY9KGMrdSkvMztoPGY7aCsrKXNbaF09YX10Lmdyb3VwSW5kaWNlcz1zfX1kaXNwb3NlQ2FjaGVEYXRhKCl7Y29uc3R7Z2VvbWV0cnk6dH09dGhpczt0LmhhbGZFZGdlcz1udWxsLHQuYm91bmRzVHJlZT1udWxsLHQuZ3JvdXBJbmRpY2VzPW51bGx9fWNvbnN0IEEzPTFlLTE0LGdtPW5ldyBSLFJ2PW5ldyBSLFB2PW5ldyBSO2Z1bmN0aW9uIERyKGksdD1BMyl7Z20uc3ViVmVjdG9ycyhpLmIsaS5hKSxSdi5zdWJWZWN0b3JzKGkuYyxpLmEpLFB2LnN1YlZlY3RvcnMoaS5iLGkuYyk7Y29uc3QgZT1nbS5hbmdsZVRvKFJ2KSxuPWdtLmFuZ2xlVG8oUHYpLHI9TWF0aC5QSS1lLW47cmV0dXJuIE1hdGguYWJzKGUpPHR8fE1hdGguYWJzKG4pPHR8fE1hdGguYWJzKHIpPHR8fGkuYS5kaXN0YW5jZVRvU3F1YXJlZChpLmIpPHR8fGkuYS5kaXN0YW5jZVRvU3F1YXJlZChpLmMpPHR8fGkuYi5kaXN0YW5jZVRvU3F1YXJlZChpLmMpPHR9Y29uc3QgeW09MWUtMTAsZGw9MWUtMTAsRTM9MWUtMTAsbnI9bmV3IGtuLEZlPW5ldyBrbixpcj1uZXcgUixfbT1uZXcgUixJdj1uZXcgUixfaD1uZXcgaGkseG09bmV3IEtuO2NsYXNzIFQze2NvbnN0cnVjdG9yKCl7dGhpcy5fcG9vbD1bXSx0aGlzLl9pbmRleD0wfWdldFRyaWFuZ2xlKCl7cmV0dXJuIHRoaXMuX2luZGV4Pj10aGlzLl9wb29sLmxlbmd0aCYmdGhpcy5fcG9vbC5wdXNoKG5ldyBfZSksdGhpcy5fcG9vbFt0aGlzLl9pbmRleCsrXX1jbGVhcigpe3RoaXMuX2luZGV4PTB9cmVzZXQoKXt0aGlzLl9wb29sLmxlbmd0aD0wLHRoaXMuX2luZGV4PTB9fWNsYXNzIEMze2NvbnN0cnVjdG9yKCl7dGhpcy50cmlhbmdsZVBvb2w9bmV3IFQzLHRoaXMudHJpYW5nbGVzPVtdLHRoaXMubm9ybWFsPW5ldyBSLHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9aW5pdGlhbGl6ZSh0KXt0aGlzLnJlc2V0KCk7Y29uc3R7dHJpYW5nbGVzOmUsdHJpYW5nbGVQb29sOm4sbm9ybWFsOnJ9PXRoaXM7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IHM9MCxvPXQubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9dFtzXTtpZihzPT09MClhLmdldE5vcm1hbChyKTtlbHNlIGlmKE1hdGguYWJzKDEtYS5nZXROb3JtYWwoaXIpLmRvdChyKSk+eW0pdGhyb3cgbmV3IEVycm9yKCJUcmlhbmdsZSBTcGxpdHRlcjogQ2Fubm90IGluaXRpYWxpemUgd2l0aCB0cmlhbmdsZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBub3JtYWxzLiIpO2NvbnN0IGw9bi5nZXRUcmlhbmdsZSgpO2wuY29weShhKSxlLnB1c2gobCl9ZWxzZXt0LmdldE5vcm1hbChyKTtjb25zdCBzPW4uZ2V0VHJpYW5nbGUoKTtzLmNvcHkodCksZS5wdXNoKHMpfX1zcGxpdEJ5VHJpYW5nbGUodCl7Y29uc3R7bm9ybWFsOmUsdHJpYW5nbGVzOm59PXRoaXM7aWYodC5nZXROb3JtYWwoX20pLm5vcm1hbGl6ZSgpLE1hdGguYWJzKDEtTWF0aC5hYnMoX20uZG90KGUpKSk8RTMpe3RoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITA7Zm9yKGxldCBzPTAsbz1uLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPW5bc107YS5jb3BsYW5hckNvdW50PTB9Y29uc3Qgcj1bdC5hLHQuYix0LmNdO2ZvcihsZXQgcz0wO3M8MztzKyspe2NvbnN0IG89KHMrMSklMyxhPXJbc10sbD1yW29dO2lyLnN1YlZlY3RvcnMobCxhKS5ub3JtYWxpemUoKSxJdi5jcm9zc1ZlY3RvcnMoX20saXIpLF9oLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KEl2LGEpLHRoaXMuc3BsaXRCeVBsYW5lKF9oLHQpfX1lbHNlIHQuZ2V0UGxhbmUoX2gpLHRoaXMuc3BsaXRCeVBsYW5lKF9oLHQpfXNwbGl0QnlQbGFuZSh0LGUpe2NvbnN0e3RyaWFuZ2xlczpuLHRyaWFuZ2xlUG9vbDpyfT10aGlzO3htLmNvcHkoZSkseG0ubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBzPTAsbz1uLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPW5bc107aWYoIXhtLmludGVyc2VjdHNUcmlhbmdsZShhLG5yLCEwKSljb250aW51ZTtjb25zdHthOmwsYjpjLGM6dX09YTtsZXQgaD0wLGY9LTEsZD0hMSxwPVtdLHk9W107Y29uc3QgZz1bbCxjLHVdO2ZvcihsZXQgbT0wO208MzttKyspe2NvbnN0IHY9KG0rMSklMztuci5zdGFydC5jb3B5KGdbbV0pLG5yLmVuZC5jb3B5KGdbdl0pO2NvbnN0IHg9dC5kaXN0YW5jZVRvUG9pbnQobnIuc3RhcnQpLF89dC5kaXN0YW5jZVRvUG9pbnQobnIuZW5kKTtpZihNYXRoLmFicyh4KTxkbCYmTWF0aC5hYnMoXyk8ZGwpe2Q9ITA7YnJlYWt9aWYoeD4wP3AucHVzaChtKTp5LnB1c2gobSksTWF0aC5hYnMoeCk8ZGwpY29udGludWU7bGV0IE09ISF0LmludGVyc2VjdExpbmUobnIsaXIpOyFNJiZNYXRoLmFicyhfKTxkbCYmKGlyLmNvcHkobnIuZW5kKSxNPSEwKSxNJiYhKGlyLmRpc3RhbmNlVG8obnIuc3RhcnQpPHltKSYmKGlyLmRpc3RhbmNlVG8obnIuZW5kKTx5bSYmKGY9bSksaD09PTA/RmUuc3RhcnQuY29weShpcik6RmUuZW5kLmNvcHkoaXIpLGgrKyl9aWYoIWQmJmg9PT0yJiZGZS5kaXN0YW5jZSgpPmRsKWlmKGYhPT0tMSl7Zj0oZisxKSUzO2xldCBtPTA7bT09PWYmJihtPShtKzEpJTMpO2xldCB2PW0rMTt2PT09ZiYmKHY9KHYrMSklMyk7Y29uc3QgeD1yLmdldFRyaWFuZ2xlKCk7eC5hLmNvcHkoZ1t2XSkseC5iLmNvcHkoRmUuZW5kKSx4LmMuY29weShGZS5zdGFydCksRHIoeCl8fG4ucHVzaCh4KSxhLmEuY29weShnW21dKSxhLmIuY29weShGZS5zdGFydCksYS5jLmNvcHkoRmUuZW5kKSxEcihhKSYmKG4uc3BsaWNlKHMsMSkscy0tLG8tLSl9ZWxzZXtjb25zdCBtPXAubGVuZ3RoPj0yP3lbMF06cFswXTtpZihtPT09MCl7bGV0IGI9RmUuc3RhcnQ7RmUuc3RhcnQ9RmUuZW5kLEZlLmVuZD1ifWNvbnN0IHY9KG0rMSklMyx4PShtKzIpJTMsXz1yLmdldFRyaWFuZ2xlKCksTT1yLmdldFRyaWFuZ2xlKCk7Z1t2XS5kaXN0YW5jZVRvU3F1YXJlZChGZS5zdGFydCk8Z1t4XS5kaXN0YW5jZVRvU3F1YXJlZChGZS5lbmQpPyhfLmEuY29weShnW3ZdKSxfLmIuY29weShGZS5zdGFydCksXy5jLmNvcHkoRmUuZW5kKSxNLmEuY29weShnW3ZdKSxNLmIuY29weShnW3hdKSxNLmMuY29weShGZS5zdGFydCkpOihfLmEuY29weShnW3hdKSxfLmIuY29weShGZS5zdGFydCksXy5jLmNvcHkoRmUuZW5kKSxNLmEuY29weShnW3ZdKSxNLmIuY29weShnW3hdKSxNLmMuY29weShGZS5lbmQpKSxhLmEuY29weShnW21dKSxhLmIuY29weShGZS5lbmQpLGEuYy5jb3B5KEZlLnN0YXJ0KSxEcihfKXx8bi5wdXNoKF8pLERyKE0pfHxuLnB1c2goTSksRHIoYSkmJihuLnNwbGljZShzLDEpLHMtLSxvLS0pfWVsc2UgaD09PTMmJmNvbnNvbGUud2FybigiVHJpYW5nbGVDbGlwcGVyOiBDb3BsYW5hciBjbGlwIG5vdCBoYW5kbGVkIil9fXJlc2V0KCl7dGhpcy50cmlhbmdsZXMubGVuZ3RoPTAsdGhpcy50cmlhbmdsZVBvb2wuY2xlYXIoKSx0aGlzLmNvcGxhbmFyVHJpYW5nbGVVc2VkPSExfX1mdW5jdGlvbiBSMyhpKXtyZXR1cm4gaT1+fmksaSs0LWklNH1jbGFzcyBMdntjb25zdHJ1Y3Rvcih0LGU9NTAwKXt0aGlzLmV4cGFuc2lvbkZhY3Rvcj0xLjUsdGhpcy50eXBlPXQsdGhpcy5sZW5ndGg9MCx0aGlzLmFycmF5PW51bGwsdGhpcy5zZXRTaXplKGUpfXNldFR5cGUodCl7aWYodGhpcy5sZW5ndGghPT0wKXRocm93IG5ldyBFcnJvcigiVHlwZUJhY2tlZEFycmF5OiBDYW5ub3QgY2hhbmdlIHRoZSB0eXBlIHdoaWxlIHRoZXJlIGlzIHVzZWQgZGF0YSBpbiB0aGUgYnVmZmVyLiIpO2NvbnN0IGU9dGhpcy5hcnJheS5idWZmZXI7dGhpcy5hcnJheT1uZXcgdChlKSx0aGlzLnR5cGU9dH1zZXRTaXplKHQpe2lmKHRoaXMuYXJyYXkmJnQ9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm47Y29uc3QgZT10aGlzLnR5cGUsbj13digpP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHI9bmV3IGUobmV3IG4oUjModCplLkJZVEVTX1BFUl9FTEVNRU5UKSkpO3RoaXMuYXJyYXkmJnIuc2V0KHRoaXMuYXJyYXksMCksdGhpcy5hcnJheT1yfWV4cGFuZCgpe2NvbnN0e2FycmF5OnQsZXhwYW5zaW9uRmFjdG9yOmV9PXRoaXM7dGhpcy5zZXRTaXplKHQubGVuZ3RoKmUpfXB1c2goLi4udCl7bGV0e2FycmF5OmUsbGVuZ3RoOm59PXRoaXM7bit0Lmxlbmd0aD5lLmxlbmd0aCYmKHRoaXMuZXhwYW5kKCksZT10aGlzLmFycmF5KTtmb3IobGV0IHI9MCxzPXQubGVuZ3RoO3I8cztyKyspZVtuK3JdPXRbcl07dGhpcy5sZW5ndGgrPXQubGVuZ3RofWNsZWFyKCl7dGhpcy5sZW5ndGg9MH19Y2xhc3MgUDN7Y29uc3RydWN0b3IoKXt0aGlzLmdyb3VwQXR0cmlidXRlcz1be31dLHRoaXMuZ3JvdXBDb3VudD0wfWdldFR5cGUodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLnR5cGV9Z2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLml0ZW1TaXplfWdldE5vcm1hbGl6ZWQodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLm5vcm1hbGl6ZWR9Z2V0Q291bnQodCl7aWYodGhpcy5ncm91cENvdW50PD10KXJldHVybiAwO2NvbnN0IGU9dGhpcy5nZXRHcm91cEF0dHJBcnJheSgicG9zaXRpb24iLHQpO3JldHVybiBlLmxlbmd0aC9lLml0ZW1TaXplfWdldFRvdGFsTGVuZ3RoKHQpe2NvbnN0e2dyb3VwQ291bnQ6ZSxncm91cEF0dHJpYnV0ZXM6bn09dGhpcztsZXQgcj0wO2ZvcihsZXQgcz0wO3M8ZTtzKyspe2NvbnN0IG89bltzXTtyKz1vW3RdLmxlbmd0aH1yZXR1cm4gcn1nZXRHcm91cEF0dHJTZXQodD0wKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6ZX09dGhpcztpZihlW3RdKXJldHVybiB0aGlzLmdyb3VwQ291bnQ9TWF0aC5tYXgodGhpcy5ncm91cENvdW50LHQrMSksZVt0XTtjb25zdCBuPWVbMF07Zm9yKHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKTt0Pj1lLmxlbmd0aDspe2NvbnN0IHI9e307ZS5wdXNoKHIpO2Zvcihjb25zdCBzIGluIG4pe2NvbnN0IG89bltzXSxhPW5ldyBMdihvLnR5cGUpO2EuaXRlbVNpemU9by5pdGVtU2l6ZSxhLm5vcm1hbGl6ZWQ9by5ub3JtYWxpemVkLHJbc109YX19cmV0dXJuIGVbdF19Z2V0R3JvdXBBdHRyQXJyYXkodCxlPTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczpufT10aGlzO2lmKCFuWzBdW3RdKXRocm93IG5ldyBFcnJvcihgVHlwZWRBdHRyaWJ1dGVEYXRhOiBBdHRyaWJ1dGUgd2l0aCAiJHt0fSIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkYCk7cmV0dXJuIHRoaXMuZ2V0R3JvdXBBdHRyU2V0KGUpW3RdfWluaXRpYWxpemVBcnJheSh0LGUsbixyKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6c309dGhpcyxhPXNbMF1bdF07aWYoYSl7aWYoYS50eXBlIT09ZSlmb3IobGV0IGw9MCxjPXMubGVuZ3RoO2w8YztsKyspe2NvbnN0IHU9c1tsXVt0XTt1LnNldFR5cGUoZSksdS5pdGVtU2l6ZT1uLHUubm9ybWFsaXplZD1yfX1lbHNlIGZvcihsZXQgbD0wLGM9cy5sZW5ndGg7bDxjO2wrKyl7Y29uc3QgdT1uZXcgTHYoZSk7dS5pdGVtU2l6ZT1uLHUubm9ybWFsaXplZD1yLHNbbF1bdF09dX19Y2xlYXIoKXt0aGlzLmdyb3VwQ291bnQ9MDtjb25zdHtncm91cEF0dHJpYnV0ZXM6dH09dGhpczt0LmZvckVhY2goZT0+e2Zvcihjb25zdCBuIGluIGUpZVtuXS5jbGVhcigpfSl9ZGVsZXRlKHQpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzLmZvckVhY2goZT0+e2RlbGV0ZSBlW3RdfSl9cmVzZXQoKXt0aGlzLmdyb3VwQXR0cmlidXRlcz1bXSx0aGlzLmdyb3VwQ291bnQ9MH19Y2xhc3MgRHZ7Y29uc3RydWN0b3IoKXt0aGlzLmludGVyc2VjdGlvblNldD17fSx0aGlzLmlkcz1bXX1hZGQodCxlKXtjb25zdHtpbnRlcnNlY3Rpb25TZXQ6bixpZHM6cn09dGhpcztuW3RdfHwoblt0XT1bXSxyLnB1c2godCkpLG5bdF0ucHVzaChlKX19Y29uc3QgSTM9MCxMMz0xLEQzPTIsVXY9MyxVMz00LE52PTUsRnY9Nix0aT1uZXcgdnIsQnY9bmV3IFJ0LGRuPW5ldyBfZSxycj1uZXcgUixPdj1uZXcgUXQsenY9bmV3IFF0LGt2PW5ldyBRdCx2bT1uZXcgUXQseGg9bmV3IFF0LHZoPW5ldyBRdCxWdj1uZXcga24sU209bmV3IFIsTW09MWUtOCxOMz0xZS0xNSxUcz0tMSxDcz0xLFNoPS0yLE1oPTIscGw9MCxScz0xLGJtPTIsRjM9MWUtMTQ7bGV0IGJoPW51bGw7ZnVuY3Rpb24gR3YoaSl7Ymg9aX1mdW5jdGlvbiBIdihpLHQpe2kuZ2V0TWlkcG9pbnQodGkub3JpZ2luKSxpLmdldE5vcm1hbCh0aS5kaXJlY3Rpb24pO2NvbnN0IGU9dC5yYXljYXN0Rmlyc3QodGksVW4pO3JldHVybiEhKGUmJnRpLmRpcmVjdGlvbi5kb3QoZS5mYWNlLm5vcm1hbCk+MCk/VHM6Q3N9ZnVuY3Rpb24gQjMoaSx0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIE1hdGgucmFuZG9tKCktLjV9aS5nZXROb3JtYWwoU20pLHRpLmRpcmVjdGlvbi5jb3B5KFNtKSxpLmdldE1pZHBvaW50KHRpLm9yaWdpbik7Y29uc3Qgbj0zO2xldCByPTAscz0xLzA7Zm9yKGxldCBvPTA7bzxuO28rKyl7dGkuZGlyZWN0aW9uLngrPWUoKSpNbSx0aS5kaXJlY3Rpb24ueSs9ZSgpKk1tLHRpLmRpcmVjdGlvbi56Kz1lKCkqTW0sdGkuZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKC0xKTtjb25zdCBhPXQucmF5Y2FzdEZpcnN0KHRpLFVuKTtpZighIShhJiZ0aS5kaXJlY3Rpb24uZG90KGEuZmFjZS5ub3JtYWwpPjApJiZyKyssYSE9PW51bGwmJihzPU1hdGgubWluKHMsYS5kaXN0YW5jZSkpLHM8PU4zKXJldHVybiBhLmZhY2Uubm9ybWFsLmRvdChTbSk+MD9NaDpTaDtpZihyL24+LjV8fChvLXIrMSkvbj4uNSlicmVha31yZXR1cm4gci9uPi41P1RzOkNzfWZ1bmN0aW9uIE8zKGksdCl7Y29uc3QgZT1uZXcgRHYsbj1uZXcgRHY7cmV0dXJuIEJ2LmNvcHkoaS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkodC5tYXRyaXhXb3JsZCksaS5nZW9tZXRyeS5ib3VuZHNUcmVlLmJ2aGNhc3QodC5nZW9tZXRyeS5ib3VuZHNUcmVlLEJ2LHtpbnRlcnNlY3RzVHJpYW5nbGVzKHIscyxvLGEpe2lmKCFEcihyKSYmIURyKHMpKXtsZXQgbD1yLmludGVyc2VjdHNUcmlhbmdsZShzLFZ2LCEwKTtpZighbCl7Y29uc3QgYz1yLnBsYW5lLHU9cy5wbGFuZSxoPWMubm9ybWFsLGY9dS5ub3JtYWw7aC5kb3QoZik9PT0xJiZNYXRoLmFicyhjLmNvbnN0YW50LXUuY29uc3RhbnQpPEYzJiYobD0hMCl9aWYobCl7bGV0IGM9aS5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KG8pLHU9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KGEpO2UuYWRkKGMsdSksbi5hZGQodSxjKSxiaCYmKGJoLmFkZEVkZ2UoVnYpLGJoLmFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyhvLHIsYSxzKSl9fXJldHVybiExfX0pLHthSW50ZXJzZWN0aW9uczplLGJJbnRlcnNlY3Rpb25zOm59fWZ1bmN0aW9uIHozKGksdCxlLG4scixzLG89ITEpe2NvbnN0IGE9ZS5hdHRyaWJ1dGVzLGw9ZS5pbmRleCxjPWkqMyx1PWwuZ2V0WChjKzApLGg9bC5nZXRYKGMrMSksZj1sLmdldFgoYysyKTtmb3IoY29uc3QgZCBpbiBzKXtjb25zdCBwPWFbZF0seT1zW2RdO2lmKCEoZCBpbiBhKSl0aHJvdyBuZXcgRXJyb3IoYENTRyBPcGVyYXRpb25zOiBBdHRyaWJ1dGUgJHtkfSBub3QgYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IGc9cC5pdGVtU2l6ZTtkPT09InBvc2l0aW9uIj8oZG4uYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSkuYXBwbHlNYXRyaXg0KG4pLGRuLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLmFwcGx5TWF0cml4NChuKSxkbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKS5hcHBseU1hdHJpeDQobiksd20oZG4uYSxkbi5iLGRuLmMsdCwzLHksbykpOmQ9PT0ibm9ybWFsIj8oZG4uYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSkuYXBwbHlOb3JtYWxNYXRyaXgociksZG4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlOb3JtYWxNYXRyaXgociksZG4uYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlOb3JtYWxNYXRyaXgociksbyYmKGRuLmEubXVsdGlwbHlTY2FsYXIoLTEpLGRuLmIubXVsdGlwbHlTY2FsYXIoLTEpLGRuLmMubXVsdGlwbHlTY2FsYXIoLTEpKSx3bShkbi5hLGRuLmIsZG4uYyx0LDMseSxvLCEwKSk6KE92LmZyb21CdWZmZXJBdHRyaWJ1dGUocCx1KSx6di5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCksa3YuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLHdtKE92LHp2LGt2LHQsZyx5LG8pKX19ZnVuY3Rpb24gazMoaSx0LGUsbixyLHMsbyxhPSExKXtBbShpLG4scixzLG8sYSksQW0oYT9lOnQsbixyLHMsbyxhKSxBbShhP3Q6ZSxuLHIscyxvLGEpfWZ1bmN0aW9uIFd2KGksdCxlPSExKXtzd2l0Y2goaSl7Y2FzZSBJMzppZih0PT09Q3N8fHQ9PT1NaCYmIWUpcmV0dXJuIFJzO2JyZWFrO2Nhc2UgTDM6aWYoZSl7aWYodD09PVRzKXJldHVybiBwbH1lbHNlIGlmKHQ9PT1Dc3x8dD09PVNoKXJldHVybiBSczticmVhaztjYXNlIEQzOmlmKGUpe2lmKHQ9PT1Dc3x8dD09PVNoKXJldHVybiBSc31lbHNlIGlmKHQ9PT1UcylyZXR1cm4gcGw7YnJlYWs7Y2FzZSBVMzppZih0PT09VHMpcmV0dXJuIHBsO2lmKHQ9PT1DcylyZXR1cm4gUnM7YnJlYWs7Y2FzZSBVdjppZih0PT09VHN8fHQ9PT1NaCYmIWUpcmV0dXJuIFJzO2JyZWFrO2Nhc2UgTnY6aWYoIWUmJih0PT09Q3N8fHQ9PT1TaCkpcmV0dXJuIFJzO2JyZWFrO2Nhc2UgRnY6aWYoIWUmJih0PT09VHN8fHQ9PT1NaCkpcmV0dXJuIFJzO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgQ1NHIG9wZXJhdGlvbiBlbnVtICIke2l9Ii5gKX1yZXR1cm4gYm19ZnVuY3Rpb24gd20oaSx0LGUsbixyLHMsbz0hMSxhPSExKXtjb25zdCBsPWM9PntzLnB1c2goYy54KSxyPjEmJnMucHVzaChjLnkpLHI+MiYmcy5wdXNoKGMueikscj4zJiZzLnB1c2goYy53KX07dm0uc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYS54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmEueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5hLnopLHhoLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmIueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5iLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYi56KSx2aC5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5jLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYy55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmMueiksYSYmKHZtLm5vcm1hbGl6ZSgpLHhoLm5vcm1hbGl6ZSgpLHZoLm5vcm1hbGl6ZSgpKSxsKHZtKSxvPyhsKHZoKSxsKHhoKSk6KGwoeGgpLGwodmgpKX1mdW5jdGlvbiBBbShpLHQsZSxuLHIscz0hMSl7Zm9yKGNvbnN0IG8gaW4gcil7Y29uc3QgYT10W29dLGw9cltvXTtpZighKG8gaW4gdCkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7b30gbm8gYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IGM9YS5pdGVtU2l6ZTtvPT09InBvc2l0aW9uIj8ocnIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGkpLmFwcGx5TWF0cml4NChlKSxsLnB1c2gocnIueCxyci55LHJyLnopKTpvPT09Im5vcm1hbCI/KHJyLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU5vcm1hbE1hdHJpeChuKSxzJiZyci5tdWx0aXBseVNjYWxhcigtMSksbC5wdXNoKHJyLngscnIueSxyci56KSk6KGwucHVzaChhLmdldFgoaSkpLGM+MSYmbC5wdXNoKGEuZ2V0WShpKSksYz4yJiZsLnB1c2goYS5nZXRaKGkpKSxjPjMmJmwucHVzaChhLmdldFcoaSkpKX19Y2xhc3MgVjN7Y29uc3RydWN0b3IodCl7dGhpcy50cmlhbmdsZT1uZXcgX2UoKS5jb3B5KHQpLHRoaXMuaW50ZXJzZWN0cz17fX1hZGRUcmlhbmdsZSh0LGUpe3RoaXMuaW50ZXJzZWN0c1t0XT1uZXcgX2UoKS5jb3B5KGUpfWdldEludGVyc2VjdEFycmF5KCl7Y29uc3QgdD1bXSx7aW50ZXJzZWN0czplfT10aGlzO2Zvcihjb25zdCBuIGluIGUpdC5wdXNoKGVbbl0pO3JldHVybiB0fX1jbGFzcyAkdntjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YT17fX1hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixyKXtjb25zdHtkYXRhOnN9PXRoaXM7c1t0XXx8KHNbdF09bmV3IFYzKGUpKSxzW3RdLmFkZFRyaWFuZ2xlKG4scil9Z2V0VHJpYW5nbGVzQXNBcnJheSh0PW51bGwpe2NvbnN0e2RhdGE6ZX09dGhpcyxuPVtdO2lmKHQhPT1udWxsKXQgaW4gZSYmbi5wdXNoKGVbdF0udHJpYW5nbGUpO2Vsc2UgZm9yKGNvbnN0IHIgaW4gZSluLnB1c2goZVtyXS50cmlhbmdsZSk7cmV0dXJuIG59Z2V0VHJpYW5nbGVJbmRpY2VzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubWFwKHQ9PnBhcnNlSW50KHQpKX1nZXRJbnRlcnNlY3Rpb25JbmRpY2VzKHQpe2NvbnN0e2RhdGE6ZX09dGhpcztyZXR1cm4gZVt0XT9PYmplY3Qua2V5cyhlW3RdLmludGVyc2VjdHMpLm1hcChuPT5wYXJzZUludChuKSk6W119Z2V0SW50ZXJzZWN0aW9uc0FzQXJyYXkodD1udWxsLGU9bnVsbCl7Y29uc3R7ZGF0YTpufT10aGlzLHI9bmV3IFNldCxzPVtdLG89YT0+e2lmKG5bYV0paWYoZSE9PW51bGwpblthXS5pbnRlcnNlY3RzW2VdJiZzLnB1c2goblthXS5pbnRlcnNlY3RzW2VdKTtlbHNle2NvbnN0IGw9blthXS5pbnRlcnNlY3RzO2Zvcihjb25zdCBjIGluIGwpci5oYXMoYyl8fChyLmFkZChjKSxzLnB1c2gobFtjXSkpfX07aWYodCE9PW51bGwpbyh0KTtlbHNlIGZvcihjb25zdCBhIGluIG4pbyhhKTtyZXR1cm4gc31yZXNldCgpe3RoaXMuZGF0YT17fX19Y2xhc3MgRzN7Y29uc3RydWN0b3IoKXt0aGlzLmVuYWJsZWQ9ITEsdGhpcy50cmlhbmdsZUludGVyc2VjdHNBPW5ldyAkdix0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0I9bmV3ICR2LHRoaXMuaW50ZXJzZWN0aW9uRWRnZXM9W119YWRkSW50ZXJzZWN0aW5nVHJpYW5nbGVzKHQsZSxuLHIpe2NvbnN0e3RyaWFuZ2xlSW50ZXJzZWN0c0E6cyx0cmlhbmdsZUludGVyc2VjdHNCOm99PXRoaXM7cy5hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixyKSxvLmFkZFRyaWFuZ2xlSW50ZXJzZWN0aW9uKG4scix0LGUpfWFkZEVkZ2UodCl7dGhpcy5pbnRlcnNlY3Rpb25FZGdlcy5wdXNoKHQuY2xvbmUoKSl9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0EucmVzZXQoKSx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0IucmVzZXQoKSx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWluaXQoKXt0aGlzLmVuYWJsZWQmJih0aGlzLnJlc2V0KCksR3YodGhpcykpfWNvbXBsZXRlKCl7dGhpcy5lbmFibGVkJiZHdihudWxsKX19Y29uc3QgVXI9bmV3IFJ0LHdoPW5ldyBXdCxQcz1uZXcgX2UsQWg9bmV3IF9lLE5yPW5ldyBfZSxFaD1uZXcgX2UsZ2k9W10sSXM9W107ZnVuY3Rpb24gSDMoaSl7Zm9yKGNvbnN0IHQgb2YgaSlyZXR1cm4gdH1mdW5jdGlvbiBXMyhpLHQsZSxuLHIscz17fSl7Y29uc3R7dXNlR3JvdXBzOm89ITB9PXMse2FJbnRlcnNlY3Rpb25zOmEsYkludGVyc2VjdGlvbnM6bH09TzMoaSx0KSxjPVtdO2xldCB1PW51bGwsaDtyZXR1cm4gaD1vPzA6LTEsWHYoaSx0LGEsZSwhMSxuLHIsaCkscXYoaSx0LGEsZSwhMSxyLGgpLGUuZmluZEluZGV4KGQ9PmQhPT1GdiYmZCE9PU52KSE9PS0xJiYoaD1vP2kuZ2VvbWV0cnkuZ3JvdXBzLmxlbmd0aHx8MTotMSxYdih0LGksbCxlLCEwLG4scixoKSxxdih0LGksbCxlLCEwLHIsaCkpLGdpLmxlbmd0aD0wLElzLmxlbmd0aD0wLHtncm91cHM6YyxtYXRlcmlhbHM6dX19ZnVuY3Rpb24gWHYoaSx0LGUsbixyLHMsbyxhPTApe2NvbnN0IGw9aS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDA7VXIuY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseShpLm1hdHJpeFdvcmxkKSx3aC5nZXROb3JtYWxNYXRyaXgoaS5tYXRyaXhXb3JsZCkubXVsdGlwbHlTY2FsYXIobD8tMToxKTtjb25zdCBjPWkuZ2VvbWV0cnkuZ3JvdXBJbmRpY2VzLHU9aS5nZW9tZXRyeS5pbmRleCxoPWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixmPXQuZ2VvbWV0cnkuYm91bmRzVHJlZSxkPXQuZ2VvbWV0cnkuaW5kZXgscD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24seT1lLmlkcyxnPWUuaW50ZXJzZWN0aW9uU2V0O2ZvcihsZXQgbT0wLHY9eS5sZW5ndGg7bTx2O20rKyl7Y29uc3QgeD15W21dLF89YT09PS0xPzA6Y1t4XSthLE09Myp4LGI9dS5nZXRYKE0rMCksQT11LmdldFgoTSsxKSxFPXUuZ2V0WChNKzIpO1BzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShoLGIpLmFwcGx5TWF0cml4NChVciksUHMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKGgsQSkuYXBwbHlNYXRyaXg0KFVyKSxQcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoaCxFKS5hcHBseU1hdHJpeDQoVXIpLHMucmVzZXQoKSxzLmluaXRpYWxpemUoUHMpO2NvbnN0IHc9Z1t4XTtmb3IobGV0IFQ9MCxEPXcubGVuZ3RoO1Q8RDtUKyspe2NvbnN0IEw9Myp3W1RdLE49ZC5nZXRYKEwrMCksRj1kLmdldFgoTCsxKSxCPWQuZ2V0WChMKzIpO0FoLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLE4pLEFoLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEYpLEFoLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEIpLHMuc3BsaXRCeVRyaWFuZ2xlKEFoKX1jb25zdCBTPXMudHJpYW5nbGVzO2ZvcihsZXQgVD0wLEQ9Uy5sZW5ndGg7VDxEO1QrKyl7Y29uc3QgTD1TW1RdLE49cy5jb3BsYW5hclRyaWFuZ2xlVXNlZD9CMyhMLGYpOkh2KEwsZik7Z2kubGVuZ3RoPTAsSXMubGVuZ3RoPTA7Zm9yKGxldCBGPTAsQj1uLmxlbmd0aDtGPEI7RisrKXtjb25zdCBHPVd2KG5bRl0sTixyKTtHIT09Ym0mJihJcy5wdXNoKEcpLGdpLnB1c2gob1tGXS5nZXRHcm91cEF0dHJTZXQoXykpKX1pZihnaS5sZW5ndGghPT0wKXtQcy5nZXRCYXJ5Y29vcmQoTC5hLEVoLmEpLFBzLmdldEJhcnljb29yZChMLmIsRWguYiksUHMuZ2V0QmFyeWNvb3JkKEwuYyxFaC5jKTtmb3IobGV0IEY9MCxCPWdpLmxlbmd0aDtGPEI7RisrKXtjb25zdCBHPWdpW0ZdLFE9SXNbRl09PT1wbDt6Myh4LEVoLGkuZ2VvbWV0cnksaS5tYXRyaXhXb3JsZCx3aCxHLGwhPT1RKX19fX1yZXR1cm4geS5sZW5ndGh9ZnVuY3Rpb24gcXYoaSx0LGUsbixyLHMsbz0wKXtjb25zdCBhPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO1VyLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksd2guZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGE/LTE6MSk7Y29uc3QgbD10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsYz1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyx1PWkuZ2VvbWV0cnkuaW5kZXgsaD1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMsZj1oLnBvc2l0aW9uLGQ9W10scD1pLmdlb21ldHJ5LmhhbGZFZGdlcyx5PW5ldyBTZXQsZz1obShpLmdlb21ldHJ5KTtmb3IobGV0IG09MCx2PWc7bTx2O20rKyltIGluIGUuaW50ZXJzZWN0aW9uU2V0fHx5LmFkZChtKTtmb3IoO3kuc2l6ZT4wOyl7Y29uc3QgbT1IMyh5KTt5LmRlbGV0ZShtKSxkLnB1c2gobSk7Y29uc3Qgdj0zKm0seD11LmdldFgodiswKSxfPXUuZ2V0WCh2KzEpLE09dS5nZXRYKHYrMik7TnIuYS5mcm9tQnVmZmVyQXR0cmlidXRlKGYseCkuYXBwbHlNYXRyaXg0KFVyKSxOci5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixfKS5hcHBseU1hdHJpeDQoVXIpLE5yLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLE0pLmFwcGx5TWF0cml4NChVcik7Y29uc3QgYj1IdihOcixsKTtJcy5sZW5ndGg9MCxnaS5sZW5ndGg9MDtmb3IobGV0IEE9MCxFPW4ubGVuZ3RoO0E8RTtBKyspe2NvbnN0IHc9V3YobltBXSxiLHIpO3chPT1ibSYmKElzLnB1c2godyksZ2kucHVzaChzW0FdKSl9Zm9yKDtkLmxlbmd0aD4wOyl7Y29uc3QgQT1kLnBvcCgpO2ZvcihsZXQgRT0wO0U8MztFKyspe2NvbnN0IHc9cC5nZXRTaWJsaW5nVHJpYW5nbGVJbmRleChBLEUpO3chPT0tMSYmeS5oYXModykmJihkLnB1c2godykseS5kZWxldGUodykpfWlmKGdpLmxlbmd0aCE9PTApe2NvbnN0IEU9MypBLHc9dS5nZXRYKEUrMCksUz11LmdldFgoRSsxKSxUPXUuZ2V0WChFKzIpLEQ9bz09PS0xPzA6Y1tBXStvO2lmKE5yLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHcpLE5yLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLFMpLE5yLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLFQpLCFEcihOcikpZm9yKGxldCBMPTAsTj1naS5sZW5ndGg7TDxOO0wrKyl7Y29uc3QgRj1Jc1tMXSxCPWdpW0xdLmdldEdyb3VwQXR0clNldChEKSxHPUY9PT1wbDtrMyh3LFMsVCxoLGkubWF0cml4V29ybGQsd2gsQixHIT09YSl9fX19fWZ1bmN0aW9uICQzKGkpe2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGgtMTt0Kyspe2NvbnN0IGU9aVt0XSxuPWlbdCsxXTtpZihlLm1hdGVyaWFsSW5kZXg9PT1uLm1hdGVyaWFsSW5kZXgpe2NvbnN0IHI9ZS5zdGFydCxzPW4uc3RhcnQrbi5jb3VudDtuLnN0YXJ0PXIsbi5jb3VudD1zLXIsaS5zcGxpY2UodCwxKSx0LS19fX1mdW5jdGlvbiBYMyhpLHQsZSxuKXtlLmNsZWFyKCk7Y29uc3Qgcj1pLmF0dHJpYnV0ZXM7Zm9yKGxldCBzPTAsbz1uLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPW5bc10sbD1yW2FdO2UuaW5pdGlhbGl6ZUFycmF5KGEsbC5hcnJheS5jb25zdHJ1Y3RvcixsLml0ZW1TaXplLGwubm9ybWFsaXplZCl9Zm9yKGNvbnN0IHMgaW4gZS5hdHRyaWJ1dGVzKW4uaW5jbHVkZXMocyl8fGUuZGVsZXRlKHMpO2Zvcihjb25zdCBzIGluIHQuYXR0cmlidXRlcyluLmluY2x1ZGVzKHMpfHwodC5kZWxldGVBdHRyaWJ1dGUocyksdC5kaXNwb3NlKCkpfWZ1bmN0aW9uIHEzKGksdCxlKXtsZXQgbj0hMSxyPS0xO2NvbnN0IHM9aS5hdHRyaWJ1dGVzLG89dC5ncm91cEF0dHJpYnV0ZXNbMF07Zm9yKGNvbnN0IGwgaW4gbyl7Y29uc3QgYz10LmdldFRvdGFsTGVuZ3RoKGwpLHU9dC5nZXRUeXBlKGwpLGg9dC5nZXRJdGVtU2l6ZShsKSxmPXQuZ2V0Tm9ybWFsaXplZChsKTtsZXQgZD1zW2xdOyghZHx8ZC5hcnJheS5sZW5ndGg8YykmJihkPW5ldyBKdChuZXcgdShjKSxoLGYpLGkuc2V0QXR0cmlidXRlKGwsZCksbj0hMCk7bGV0IHA9MDtmb3IobGV0IHk9MCxnPU1hdGgubWluKGUubGVuZ3RoLHQuZ3JvdXBDb3VudCk7eTxnO3krKyl7Y29uc3QgbT1lW3ldLmluZGV4LHthcnJheTp2LHR5cGU6eCxsZW5ndGg6X309dC5ncm91cEF0dHJpYnV0ZXNbbV1bbF0sTT1uZXcgeCh2LmJ1ZmZlciwwLF8pO2QuYXJyYXkuc2V0KE0scCkscCs9TS5sZW5ndGh9ZC5uZWVkc1VwZGF0ZT0hMCxyPWMvZC5pdGVtU2l6ZX1pZihpLmluZGV4KXtjb25zdCBsPWkuaW5kZXguYXJyYXk7aWYobC5sZW5ndGg8cilpLmluZGV4PW51bGwsbj0hMDtlbHNlIGZvcihsZXQgYz0wLHU9bC5sZW5ndGg7Yzx1O2MrKylsW2NdPWN9bGV0IGE9MDtpLmNsZWFyR3JvdXBzKCk7Zm9yKGxldCBsPTAsYz1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO2w8YztsKyspe2NvbnN0e2luZGV4OnUsbWF0ZXJpYWxJbmRleDpofT1lW2xdLGY9dC5nZXRDb3VudCh1KTtmIT09MCYmKGkuYWRkR3JvdXAoYSxmLGgpLGErPWYpfWkuc2V0RHJhd1JhbmdlKDAsciksaS5ib3VuZHNUcmVlPW51bGwsbiYmaS5kaXNwb3NlKCl9ZnVuY3Rpb24gWXYoaSx0KXtsZXQgZT10O3JldHVybiBBcnJheS5pc0FycmF5KHQpfHwoZT1bXSxpLmZvckVhY2gobj0+e2Vbbi5tYXRlcmlhbEluZGV4XT10fSkpLGV9Y2xhc3MgWTN7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXI9bmV3IEMzLHRoaXMuYXR0cmlidXRlRGF0YT1bXSx0aGlzLmF0dHJpYnV0ZXM9WyJwb3NpdGlvbiIsInV2Iiwibm9ybWFsIl0sdGhpcy51c2VHcm91cHM9ITAsdGhpcy5jb25zb2xpZGF0ZUdyb3Vwcz0hMCx0aGlzLmRlYnVnPW5ldyBHM31nZXRHcm91cFJhbmdlcyh0KXtyZXR1cm4hdGhpcy51c2VHcm91cHN8fHQuZ3JvdXBzLmxlbmd0aD09PTA/W3tzdGFydDowLGNvdW50OjEvMCxtYXRlcmlhbEluZGV4OjB9XTp0Lmdyb3Vwcy5tYXAoZT0+b24oe30sZSkpfWV2YWx1YXRlKHQsZSxuLHI9bmV3IHloKXtsZXQgcz0hMDtpZihBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pLEFycmF5LmlzQXJyYXkocil8fChyPVtyXSxzPSExKSxyLmxlbmd0aCE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRXZhbHVhdG9yOiBvcGVyYXRpb25zIGFuZCB0YXJnZXQgYXJyYXkgcGFzc2VkIGFzIGRpZmZlcmVudCBzaXplcy4iKTt0LnByZXBhcmVHZW9tZXRyeSgpLGUucHJlcGFyZUdlb21ldHJ5KCk7Y29uc3R7dHJpYW5nbGVTcGxpdHRlcjpvLGF0dHJpYnV0ZURhdGE6YSxhdHRyaWJ1dGVzOmwsdXNlR3JvdXBzOmMsY29uc29saWRhdGVHcm91cHM6dSxkZWJ1ZzpofT10aGlzO2Zvcig7YS5sZW5ndGg8ci5sZW5ndGg7KWEucHVzaChuZXcgUDMpO3IuZm9yRWFjaCgobSx2KT0+e1gzKHQuZ2VvbWV0cnksbS5nZW9tZXRyeSxhW3ZdLGwpfSksaC5pbml0KCksVzModCxlLG4sbyxhLHt1c2VHcm91cHM6Y30pLGguY29tcGxldGUoKTtjb25zdCBmPXRoaXMuZ2V0R3JvdXBSYW5nZXModC5nZW9tZXRyeSksZD1ZdihmLHQubWF0ZXJpYWwpLHA9dGhpcy5nZXRHcm91cFJhbmdlcyhlLmdlb21ldHJ5KSx5PVl2KHAsZS5tYXRlcmlhbCk7cC5mb3JFYWNoKG09Pm0ubWF0ZXJpYWxJbmRleCs9ZC5sZW5ndGgpO2xldCBnPVsuLi5mLC4uLnBdLm1hcCgobSx2KT0+Rmkob24oe30sbSkse2luZGV4OnZ9KSk7aWYoYyl7Y29uc3QgbT1bLi4uZCwuLi55XTt1JiYoZz1nLm1hcCh4PT57Y29uc3QgXz1tW3gubWF0ZXJpYWxJbmRleF07cmV0dXJuIHgubWF0ZXJpYWxJbmRleD1tLmluZGV4T2YoXykseH0pLnNvcnQoKHgsXyk9PngubWF0ZXJpYWxJbmRleC1fLm1hdGVyaWFsSW5kZXgpKTtjb25zdCB2PVtdO2ZvcihsZXQgeD0wLF89bS5sZW5ndGg7eDxfO3grKyl7bGV0IE09ITE7Zm9yKGxldCBiPTAsQT1nLmxlbmd0aDtiPEE7YisrKXtjb25zdCBFPWdbYl07RS5tYXRlcmlhbEluZGV4PT09eCYmKE09ITAsRS5tYXRlcmlhbEluZGV4PXYubGVuZ3RoKX1NJiZ2LnB1c2gobVt4XSl9ci5mb3JFYWNoKHg9Pnt4Lm1hdGVyaWFsPXZ9KX1lbHNlIGc9W3tzdGFydDowLGNvdW50OjEvMCxpbmRleDowLG1hdGVyaWFsSW5kZXg6MH1dLHIuZm9yRWFjaChtPT57bS5tYXRlcmlhbD1kWzBdfSk7cmV0dXJuIHIuZm9yRWFjaCgobSx2KT0+e2NvbnN0IHg9bS5nZW9tZXRyeTtxMyh4LGFbdl0sZyksdSYmJDMoeC5ncm91cHMpfSkscz9yOnJbMF19ZXZhbHVhdGVIaWVyYXJjaHkodCxlPW5ldyB5aCl7dC51cGRhdGVNYXRyaXhXb3JsZCghMCk7Y29uc3Qgbj0ocyxvKT0+e2NvbnN0IGE9cy5jaGlsZHJlbjtmb3IobGV0IGw9MCxjPWEubGVuZ3RoO2w8YztsKyspe2NvbnN0IHU9YVtsXTt1LmlzT3BlcmF0aW9uR3JvdXA/bih1LG8pOm8odSl9fSxyPXM9Pntjb25zdCBvPXMuY2hpbGRyZW47bGV0IGE9ITE7Zm9yKGxldCBjPTAsdT1vLmxlbmd0aDtjPHU7YysrKXtjb25zdCBoPW9bY107YT1yKGgpfHxhfWNvbnN0IGw9cy5pc0RpcnR5KCk7aWYobCYmcy5tYXJrVXBkYXRlZCgpLGEmJiFzLmlzT3BlcmF0aW9uR3JvdXApe2xldCBjO3JldHVybiBuKHMsdT0+e2M/Yz10aGlzLmV2YWx1YXRlKGMsdSx1Lm9wZXJhdGlvbik6Yz10aGlzLmV2YWx1YXRlKHMsdSx1Lm9wZXJhdGlvbil9KSxzLl9jYWNoZWRHZW9tZXRyeT1jLmdlb21ldHJ5LHMuX2NhY2hlZE1hdGVyaWFscz1jLm1hdGVyaWFsLCEwfWVsc2UgcmV0dXJuIGF8fGx9O3JldHVybiByKHQpLGUuZ2VvbWV0cnk9dC5fY2FjaGVkR2VvbWV0cnksZS5tYXRlcmlhbD10Ll9jYWNoZWRNYXRlcmlhbHMsZX1yZXNldCgpe3RoaXMudHJpYW5nbGVTcGxpdHRlci5yZXNldCgpfX1mdW5jdGlvbiBadihpLHQ9MCl7Y29uc3QgZT1pWzBdLmluZGV4IT09bnVsbCxuPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5hdHRyaWJ1dGVzKSkscj1uZXcgU2V0KE9iamVjdC5rZXlzKGlbMF0ubW9ycGhBdHRyaWJ1dGVzKSkscz17fSxvPXt9LGE9aVswXS5tb3JwaFRhcmdldHNSZWxhdGl2ZSxsPW5ldyBGdDtsZXQgYz0wO2ZvcihsZXQgdT0wO3U8aS5sZW5ndGg7Kyt1KXtjb25zdCBoPWlbdV07bGV0IGY9MDtpZihlIT09KGguaW5kZXghPT1udWxsKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIrdSsiLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgaW5kZXggYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gaC5hdHRyaWJ1dGVzKXtpZighbi5oYXMoZCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrJy4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbXBhdGlibGUgYXR0cmlidXRlczsgbWFrZSBzdXJlICInK2QrJyIgYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLicpLG51bGw7c1tkXT09PXZvaWQgMCYmKHNbZF09W10pLHNbZF0ucHVzaChoLmF0dHJpYnV0ZXNbZF0pLGYrK31pZihmIT09bi5zaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIit1KyIuIE1ha2Ugc3VyZSBhbGwgZ2VvbWV0cmllcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoYSE9PWgubW9ycGhUYXJnZXRzUmVsYXRpdmUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrIi4gLm1vcnBoVGFyZ2V0c1JlbGF0aXZlIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gaC5tb3JwaEF0dHJpYnV0ZXMpe2lmKCFyLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIrdSsiLiAgLm1vcnBoQXR0cmlidXRlcyBtdXN0IGJlIGNvbnNpc3RlbnQgdGhyb3VnaG91dCBhbGwgZ2VvbWV0cmllcy4iKSxudWxsO29bZF09PT12b2lkIDAmJihvW2RdPVtdKSxvW2RdLnB1c2goaC5tb3JwaEF0dHJpYnV0ZXNbZF0pfWlmKHQpe2xldCBkO2lmKGUpZD1oLmluZGV4LmNvdW50O2Vsc2UgaWYoaC5hdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwKWQ9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50O2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrIi4gVGhlIGdlb21ldHJ5IG11c3QgaGF2ZSBlaXRoZXIgYW4gaW5kZXggb3IgYSBwb3NpdGlvbiBhdHRyaWJ1dGUiKSxudWxsO2lmKHQ9PT0xKWwuYWRkR3JvdXAoYyxkLHUpO2Vsc2UgaWYodD09PTImJmguZ3JvdXBzLmxlbmd0aD4wKWZvcihsZXQgcCBvZiBoLmdyb3Vwcyl7bGV0IHk9cC5tYXRlcmlhbEluZGV4O2wuYWRkR3JvdXAoYytwLnN0YXJ0LE1hdGgubWluKHAuY291bnQsZCkseSl9Yys9ZH19aWYoZSl7bGV0IHU9MDtjb25zdCBoPVtdO2ZvcihsZXQgZj0wO2Y8aS5sZW5ndGg7KytmKXtjb25zdCBkPWlbZl0uaW5kZXg7Zm9yKGxldCBwPTA7cDxkLmNvdW50OysrcCloLnB1c2goZC5nZXRYKHApK3UpO3UrPWlbZl0uYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1sLnNldEluZGV4KGgpfWZvcihjb25zdCB1IGluIHMpe2NvbnN0IGg9SnYoc1t1XSk7aWYoIWgpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK3UrIiBhdHRyaWJ1dGUuIiksbnVsbDtsLnNldEF0dHJpYnV0ZSh1LGgpfWZvcihjb25zdCB1IGluIG8pe2NvbnN0IGg9b1t1XVswXS5sZW5ndGg7aWYoaD09PTApYnJlYWs7bC5tb3JwaEF0dHJpYnV0ZXM9bC5tb3JwaEF0dHJpYnV0ZXN8fHt9LGwubW9ycGhBdHRyaWJ1dGVzW3VdPVtdO2ZvcihsZXQgZj0wO2Y8aDsrK2Ype2NvbnN0IGQ9W107Zm9yKGxldCB5PTA7eTxvW3VdLmxlbmd0aDsrK3kpZC5wdXNoKG9bdV1beV1bZl0pO2NvbnN0IHA9SnYoZCk7aWYoIXApcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK3UrIiBtb3JwaEF0dHJpYnV0ZS4iKSxudWxsO2wubW9ycGhBdHRyaWJ1dGVzW3VdLnB1c2gocCl9fXJldHVybiB0PT09Mj9aMyhsKTpsfWZ1bmN0aW9uIEp2KGkpe2xldCB0LGUsbixyPS0xLHM9MDtmb3IobGV0IGM9MDtjPGkubGVuZ3RoOysrYyl7Y29uc3QgdT1pW2NdO2lmKHQ9PT12b2lkIDAmJih0PXUuYXJyYXkuY29uc3RydWN0b3IpLHQhPT11LmFycmF5LmNvbnN0cnVjdG9yKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuYXJyYXkgbXVzdCBiZSBvZiBjb25zaXN0ZW50IGFycmF5IHR5cGVzIGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoZT09PXZvaWQgMCYmKGU9dS5pdGVtU2l6ZSksZSE9PXUuaXRlbVNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5pdGVtU2l6ZSBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihuPT09dm9pZCAwJiYobj11Lm5vcm1hbGl6ZWQpLG4hPT11Lm5vcm1hbGl6ZWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5ub3JtYWxpemVkIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKHI9PT0tMSYmKHI9dS5ncHVUeXBlKSxyIT09dS5ncHVUeXBlKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuZ3B1VHlwZSBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtzKz11LmNvdW50KmV9Y29uc3Qgbz1uZXcgdChzKSxhPW5ldyBKdChvLGUsbik7bGV0IGw9MDtmb3IobGV0IGM9MDtjPGkubGVuZ3RoOysrYyl7Y29uc3QgdT1pW2NdO2lmKHUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3QgaD1sL2U7Zm9yKGxldCBmPTAsZD11LmNvdW50O2Y8ZDtmKyspZm9yKGxldCBwPTA7cDxlO3ArKyl7Y29uc3QgeT11LmdldENvbXBvbmVudChmLHApO2Euc2V0Q29tcG9uZW50KGYraCxwLHkpfX1lbHNlIG8uc2V0KHUuYXJyYXksbCk7bCs9dS5jb3VudCplfXJldHVybiByIT09dm9pZCAwJiYoYS5ncHVUeXBlPXIpLGF9ZnVuY3Rpb24gWjMoaSl7aWYoaS5ncm91cHMubGVuZ3RoPT09MClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlR3JvdXBzKCk6IE5vIGdyb3VwcyBhcmUgZGVmaW5lZC4gTm90aGluZyB0byBtZXJnZS4iKSxpO2xldCB0PWkuZ3JvdXBzO2lmKHQ9dC5zb3J0KChvLGEpPT5vLm1hdGVyaWFsSW5kZXghPT1hLm1hdGVyaWFsSW5kZXg/by5tYXRlcmlhbEluZGV4LWEubWF0ZXJpYWxJbmRleDpvLnN0YXJ0LWEuc3RhcnQpLGkuZ2V0SW5kZXgoKT09PW51bGwpe2NvbnN0IG89aS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksYT1bXTtmb3IobGV0IGw9MDtsPG8uY291bnQ7bCs9MylhLnB1c2gobCxsKzEsbCsyKTtpLnNldEluZGV4KGEpfWNvbnN0IGU9aS5nZXRJbmRleCgpLG49W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXSxsPWEuc3RhcnQsYz1sK2EuY291bnQ7Zm9yKGxldCB1PWw7dTxjO3UrKyluLnB1c2goZS5nZXRYKHUpKX1pLmRpc3Bvc2UoKSxpLnNldEluZGV4KG4pO2xldCByPTA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXTthLnN0YXJ0PXIscis9YS5jb3VudH1sZXQgcz10WzBdO2kuZ3JvdXBzPVtzXTtmb3IobGV0IG89MTtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dO3MubWF0ZXJpYWxJbmRleD09PWEubWF0ZXJpYWxJbmRleD9zLmNvdW50Kz1hLmNvdW50OihzPWEsaS5ncm91cHMucHVzaChzKSl9cmV0dXJuIGl9Y2xhc3MgSjMgZXh0ZW5kcyBUb3tjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSk7Y29uc3Qgbj1uZXcgeWgobmV3IFRvKHQsRmkob24oe30sZSkse2hhc1RvcDohMCxoYXNTaWRlOiEwLGhhc0JvdHRvbTohMX0pKSk7bi51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IHI9bmV3IG1lKCkuc2V0RnJvbU9iamVjdChuKSxzPW5ldyBSO3IuZ2V0U2l6ZShzKTtjb25zdCBvPW5ldyBSKHIubWluLngrcy54LzIsci5taW4ueStzLnkvMiwwKTtsZXQgYT1lLnRvcFNlZ21lbnRzLGw9ZS5ib3gzO2lmKGwpe2w9bC51bmlvbihyKTtjb25zdCBtPW5ldyBSO2wuZ2V0U2l6ZShtKTtjb25zdCB2PU1hdGgubWF4KHMueC9tLngscy55L20ueSk7YT1NYXRoLmNlaWwoZS50b3BTZWdtZW50cyp2KX1pZihhPDQpcmV0dXJuIHRoaXM7Y29uc3QgYz1uZXcgdXMocy54LHMueSxhLGEpLHU9bmV3IHloKGMpO3UucG9zaXRpb24uc2V0KG8ueCxvLnksby56KSx1LnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3QgZj1uZXcgWTMoKS5ldmFsdWF0ZSh1LG4sVXYpLGQ9Zi5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikscD1uZXcgTXQoZC5jb3VudCoyLDIpO2ZvcihsZXQgbT0wO208ZC5jb3VudDttKyspe2NvbnN0IHY9ZC5nZXRaKG0pO2Quc2V0WihtLGUuZGVwdGgrdil9aWYobCl7Y29uc3QgbT1sLm1pbix2PWwubWF4LHg9bmV3IFIoKS5zdWJWZWN0b3JzKHYsbSk7Zm9yKGxldCBfPTA7XzxkLmNvdW50O18rKyl7Y29uc3QgTT1kLmdldFgoXyksYj1kLmdldFkoXyksQT0oTS1tLngpL3gueCxFPShiLW0ueSkveC55O3Auc2V0WFkoXyxBLEUpfWYuZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJ1diIscCl9ZC5uZWVkc1VwZGF0ZT0hMDtjb25zdCB5PW5ldyBUbyh0LEZpKG9uKHt9LGUpLHtoYXNUb3A6ITF9KSksZz1adihbZi5nZW9tZXRyeSx5XSwyKTt0aGlzLmNvcHkoZy50b05vbkluZGV4ZWQoKSl9fXZhciBqMz1pPT57Y29uc3R7c3BsaXQ6dCxkZXB0aDplLHBvaW50czpuLGJveDM6cixoYXNUb3A6cyxoYXNCb3R0b206byxoYXNTaWRlOmEsc2lkZVJlcGVhdDpsLHRvcFNlZ21lbnRzOmN9PWksdT1jP0ozOlRvLGg9bmV3IHUobmV3IEppKG4pLHtkZXB0aDplLGJldmVsRW5hYmxlZDohMSxib3gzOnIsVVZHZW5lcmF0b3I6UUkoe3NwbGl0OnQsYm94MzpyLHNpZGVSZXBlYXQ6bH0pLGhhc1RvcDpzLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSx0b3BTZWdtZW50czpjfSk7cmV0dXJuIHQyKCksaH07ZnVuY3Rpb24gSzMoaSx0LGU9MCl7Y29uc3Qgbj0oOTAtdCkqTWF0aC5QSS8xODAscj0oOTAtaSkqTWF0aC5QSS8xODA7cmV0dXJuW2UqTWF0aC5zaW4obikqTWF0aC5jb3MociksZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pKk1hdGguc2luKHIpXX12YXIgUTM9KGksdCxlKT0+bmV3IFByb21pc2UoKG4scik9Pnt2YXIgcz1sPT57dHJ5e2EoZS5uZXh0KGwpKX1jYXRjaChjKXtyKGMpfX0sbz1sPT57dHJ5e2EoZS50aHJvdyhsKSl9Y2F0Y2goYyl7cihjKX19LGE9bD0+bC5kb25lP24obC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4ocyxvKTthKChlPWUuYXBwbHkoaSx0KSkubmV4dCgpKX0pO2Z1bmN0aW9uIHRMKGkpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpKS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6aVtlXSxlbnVtZXJhYmxlOiEwfSl9LHt9KX1jb25zdCBlTD1pPT57Y29uc3QgdD17cnVuKGUsbil7Y29uc3Qgcj1uZXcgRnVuY3Rpb24oInJldHVybiAoIitlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Iik7cmV0dXJuIHIuYXBwbHkocixuKX0sbWV0aG9kcygpe3JldHVybiBPYmplY3Qua2V5cyh0KX19O2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9PlEzKHZvaWQgMCxbZV0sZnVuY3Rpb24qKHtkYXRhOm59KXt0cnl7Y29uc3Qgcj10W24ubWV0aG9kXTtpZihyKXtjb25zdCBzPXlpZWxkIHIuYXBwbHkocixuLnBhcmFtcyk7cy50cmFuc2ZlciYmcy5tZXNzYWdlP3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpzLm1lc3NhZ2UsZXJyb3I6bnVsbH0scy50cmFuc2Zlcik6cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnMsZXJyb3I6bnVsbH0pfWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKHIpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOnRMKHIpfSl9fSkpLE9iamVjdC5rZXlzKGkpLmZvckVhY2goZT0+e3RbZV09aVtlXX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfTtmdW5jdGlvbiBUaChpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjppPHQ/LTE6aT50PzE6aT49dD8wOk5hTn1mdW5jdGlvbiBuTChpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjp0PGk/LTE6dD5pPzE6dD49aT8wOk5hTn1mdW5jdGlvbiBqdihpKXtsZXQgdCxlLG47aS5sZW5ndGghPT0yPyh0PVRoLGU9KGEsbCk9PlRoKGkoYSksbCksbj0oYSxsKT0+aShhKS1sKToodD1pPT09VGh8fGk9PT1uTD9pOmlMLGU9aSxuPWkpO2Z1bmN0aW9uIHIoYSxsLGM9MCx1PWEubGVuZ3RoKXtpZihjPHUpe2lmKHQobCxsKSE9PTApcmV0dXJuIHU7ZG97Y29uc3QgaD1jK3U+Pj4xO2UoYVtoXSxsKTwwP2M9aCsxOnU9aH13aGlsZShjPHUpfXJldHVybiBjfWZ1bmN0aW9uIHMoYSxsLGM9MCx1PWEubGVuZ3RoKXtpZihjPHUpe2lmKHQobCxsKSE9PTApcmV0dXJuIHU7ZG97Y29uc3QgaD1jK3U+Pj4xO2UoYVtoXSxsKTw9MD9jPWgrMTp1PWh9d2hpbGUoYzx1KX1yZXR1cm4gY31mdW5jdGlvbiBvKGEsbCxjPTAsdT1hLmxlbmd0aCl7Y29uc3QgaD1yKGEsbCxjLHUtMSk7cmV0dXJuIGg+YyYmbihhW2gtMV0sbCk+LW4oYVtoXSxsKT9oLTE6aH1yZXR1cm57bGVmdDpyLGNlbnRlcjpvLHJpZ2h0OnN9fWZ1bmN0aW9uIGlMKCl7cmV0dXJuIDB9ZnVuY3Rpb24gckwoaSl7cmV0dXJuIGk9PT1udWxsP05hTjoraX1jb25zdCBzTD1qdihUaCkucmlnaHQ7anYockwpLmNlbnRlcjtmdW5jdGlvbiBDaChpLHQpe2xldCBlLG47aWYodD09PXZvaWQgMClmb3IoY29uc3QgciBvZiBpKXIhPW51bGwmJihlPT09dm9pZCAwP3I+PXImJihlPW49cik6KGU+ciYmKGU9ciksbjxyJiYobj1yKSkpO2Vsc2V7bGV0IHI9LTE7Zm9yKGxldCBzIG9mIGkpKHM9dChzLCsrcixpKSkhPW51bGwmJihlPT09dm9pZCAwP3M+PXMmJihlPW49cyk6KGU+cyYmKGU9cyksbjxzJiYobj1zKSkpfXJldHVybltlLG5dfWNsYXNzIHNye2NvbnN0cnVjdG9yKCl7dGhpcy5fcGFydGlhbHM9bmV3IEZsb2F0NjRBcnJheSgzMiksdGhpcy5fbj0wfWFkZCh0KXtjb25zdCBlPXRoaXMuX3BhcnRpYWxzO2xldCBuPTA7Zm9yKGxldCByPTA7cjx0aGlzLl9uJiZyPDMyO3IrKyl7Y29uc3Qgcz1lW3JdLG89dCtzLGE9TWF0aC5hYnModCk8TWF0aC5hYnMocyk/dC0oby1zKTpzLShvLXQpO2EmJihlW24rK109YSksdD1vfXJldHVybiBlW25dPXQsdGhpcy5fbj1uKzEsdGhpc312YWx1ZU9mKCl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgZT10aGlzLl9uLG4scixzLG89MDtpZihlPjApe2ZvcihvPXRbLS1lXTtlPjAmJihuPW8scj10Wy0tZV0sbz1uK3Iscz1yLShvLW4pLCFzKTspO2U+MCYmKHM8MCYmdFtlLTFdPDB8fHM+MCYmdFtlLTFdPjApJiYocj1zKjIsbj1vK3Iscj09bi1vJiYobz1uKSl9cmV0dXJuIG99fWNvbnN0IG9MPU1hdGguc3FydCg1MCksYUw9TWF0aC5zcXJ0KDEwKSxsTD1NYXRoLnNxcnQoMik7ZnVuY3Rpb24gUmgoaSx0LGUpe2NvbnN0IG49KHQtaSkvTWF0aC5tYXgoMCxlKSxyPU1hdGguZmxvb3IoTWF0aC5sb2cxMChuKSkscz1uL01hdGgucG93KDEwLHIpLG89cz49b0w/MTA6cz49YUw/NTpzPj1sTD8yOjE7bGV0IGEsbCxjO3JldHVybiByPDA/KGM9TWF0aC5wb3coMTAsLXIpL28sYT1NYXRoLnJvdW5kKGkqYyksbD1NYXRoLnJvdW5kKHQqYyksYS9jPGkmJisrYSxsL2M+dCYmLS1sLGM9LWMpOihjPU1hdGgucG93KDEwLHIpKm8sYT1NYXRoLnJvdW5kKGkvYyksbD1NYXRoLnJvdW5kKHQvYyksYSpjPGkmJisrYSxsKmM+dCYmLS1sKSxsPGEmJi41PD1lJiZlPDI/UmgoaSx0LGUqMik6W2EsbCxjXX1mdW5jdGlvbiBjTChpLHQsZSl7aWYodD0rdCxpPStpLGU9K2UsIShlPjApKXJldHVybltdO2lmKGk9PT10KXJldHVybltpXTtjb25zdCBuPXQ8aSxbcixzLG9dPW4/UmgodCxpLGUpOlJoKGksdCxlKTtpZighKHM+PXIpKXJldHVybltdO2NvbnN0IGE9cy1yKzEsbD1uZXcgQXJyYXkoYSk7aWYobilpZihvPDApZm9yKGxldCBjPTA7YzxhOysrYylsW2NdPShzLWMpLy1vO2Vsc2UgZm9yKGxldCBjPTA7YzxhOysrYylsW2NdPShzLWMpKm87ZWxzZSBpZihvPDApZm9yKGxldCBjPTA7YzxhOysrYylsW2NdPShyK2MpLy1vO2Vsc2UgZm9yKGxldCBjPTA7YzxhOysrYylsW2NdPShyK2MpKm87cmV0dXJuIGx9ZnVuY3Rpb24gRW0oaSx0LGUpe3JldHVybiB0PSt0LGk9K2ksZT0rZSxSaChpLHQsZSlbMl19ZnVuY3Rpb24gdUwoaSx0LGUpe3Q9K3QsaT0raSxlPStlO2NvbnN0IG49dDxpLHI9bj9FbSh0LGksZSk6RW0oaSx0LGUpO3JldHVybihuPy0xOjEpKihyPDA/MS8tcjpyKX1mdW5jdGlvbiBoTChpLHQpe2xldCBlPTAsbj0wO2lmKHQ9PT12b2lkIDApZm9yKGxldCByIG9mIGkpciE9bnVsbCYmKHI9K3IpPj1yJiYoKytlLG4rPXIpO2Vsc2V7bGV0IHI9LTE7Zm9yKGxldCBzIG9mIGkpKHM9dChzLCsrcixpKSkhPW51bGwmJihzPStzKT49cyYmKCsrZSxuKz1zKX1pZihlKXJldHVybiBuL2V9ZnVuY3Rpb24qZkwoaSl7Zm9yKGNvbnN0IHQgb2YgaSl5aWVsZCpNdyh0KX1mdW5jdGlvbiBtbChpKXtyZXR1cm4gQXJyYXkuZnJvbShmTChpKSl9dmFyIGhlPTFlLTYsUGg9MWUtMTIsc2U9TWF0aC5QSSxUbj1zZS8yLEloPXNlLzQsQ249c2UqMixQZT0xODAvc2Usa3Q9c2UvMTgwLHhlPU1hdGguYWJzLFRtPU1hdGguYXRhbixlaT1NYXRoLmF0YW4yLCR0PU1hdGguY29zLGRMPU1hdGguZXhwLENtPU1hdGguaHlwb3QscEw9TWF0aC5sb2csQnQ9TWF0aC5zaW4sbUw9TWF0aC5zaWdufHxmdW5jdGlvbihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9LG9yPU1hdGguc3FydCxnTD1NYXRoLnRhbjtmdW5jdGlvbiB5TChpKXtyZXR1cm4gaT4xPzA6aTwtMT9zZTpNYXRoLmFjb3MoaSl9ZnVuY3Rpb24gYXIoaSl7cmV0dXJuIGk+MT9UbjppPC0xPy1UbjpNYXRoLmFzaW4oaSl9ZnVuY3Rpb24gS3YoaSl7cmV0dXJuKGk9QnQoaS8yKSkqaX1mdW5jdGlvbiBlbigpe31mdW5jdGlvbiBMaChpLHQpe2kmJnRTLmhhc093blByb3BlcnR5KGkudHlwZSkmJnRTW2kudHlwZV0oaSx0KX12YXIgUXY9e0ZlYXR1cmU6ZnVuY3Rpb24oaSx0KXtMaChpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscj1lLmxlbmd0aDsrK248cjspTGgoZVtuXS5nZW9tZXRyeSx0KX19LHRTPXtTcGhlcmU6ZnVuY3Rpb24oaSx0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihpLHQpe2k9aS5jb29yZGluYXRlcyx0LnBvaW50KGlbMF0saVsxXSxpWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscj1lLmxlbmd0aDsrK248cjspaT1lW25dLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7Um0oaS5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHI9ZS5sZW5ndGg7KytuPHI7KVJtKGVbbl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe2VTKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscj1lLmxlbmd0aDsrK248cjspZVMoZVtuXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZ2VvbWV0cmllcyxuPS0xLHI9ZS5sZW5ndGg7KytuPHI7KUxoKGVbbl0sdCl9fTtmdW5jdGlvbiBSbShpLHQsZSl7dmFyIG49LTEscj1pLmxlbmd0aC1lLHM7Zm9yKHQubGluZVN0YXJ0KCk7KytuPHI7KXM9aVtuXSx0LnBvaW50KHNbMF0sc1sxXSxzWzJdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBlUyhpLHQpe3ZhciBlPS0xLG49aS5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPG47KVJtKGlbZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiBEaChpLHQpe2kmJlF2Lmhhc093blByb3BlcnR5KGkudHlwZSk/UXZbaS50eXBlXShpLHQpOkxoKGksdCl9dmFyIFVoPW5ldyBzcixuUz1uZXcgc3IsaVMsclMsUG0sSW0sTG0sbHI9e3BvaW50OmVuLGxpbmVTdGFydDplbixsaW5lRW5kOmVuLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1VoPW5ldyBzcixsci5saW5lU3RhcnQ9X0wsbHIubGluZUVuZD14TH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBpPStVaDtuUy5hZGQoaTwwP0NuK2k6aSksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9ZW59LHNwaGVyZTpmdW5jdGlvbigpe25TLmFkZChDbil9fTtmdW5jdGlvbiBfTCgpe2xyLnBvaW50PXZMfWZ1bmN0aW9uIHhMKCl7c1MoaVMsclMpfWZ1bmN0aW9uIHZMKGksdCl7bHIucG9pbnQ9c1MsaVM9aSxyUz10LGkqPWt0LHQqPWt0LFBtPWksSW09JHQodD10LzIrSWgpLExtPUJ0KHQpfWZ1bmN0aW9uIHNTKGksdCl7aSo9a3QsdCo9a3QsdD10LzIrSWg7dmFyIGU9aS1QbSxuPWU+PTA/MTotMSxyPW4qZSxzPSR0KHQpLG89QnQodCksYT1MbSpvLGw9SW0qcythKiR0KHIpLGM9YSpuKkJ0KHIpO1VoLmFkZChlaShjLGwpKSxQbT1pLEltPXMsTG09b31mdW5jdGlvbiBOaChpKXtyZXR1cm5bZWkoaVsxXSxpWzBdKSxhcihpWzJdKV19ZnVuY3Rpb24gTHMoaSl7dmFyIHQ9aVswXSxlPWlbMV0sbj0kdChlKTtyZXR1cm5bbiokdCh0KSxuKkJ0KHQpLEJ0KGUpXX1mdW5jdGlvbiBGaChpLHQpe3JldHVybiBpWzBdKnRbMF0raVsxXSp0WzFdK2lbMl0qdFsyXX1mdW5jdGlvbiBCbyhpLHQpe3JldHVybltpWzFdKnRbMl0taVsyXSp0WzFdLGlbMl0qdFswXS1pWzBdKnRbMl0saVswXSp0WzFdLWlbMV0qdFswXV19ZnVuY3Rpb24gRG0oaSx0KXtpWzBdKz10WzBdLGlbMV0rPXRbMV0saVsyXSs9dFsyXX1mdW5jdGlvbiBCaChpLHQpe3JldHVybltpWzBdKnQsaVsxXSp0LGlbMl0qdF19ZnVuY3Rpb24gT2goaSl7dmFyIHQ9b3IoaVswXSppWzBdK2lbMV0qaVsxXStpWzJdKmlbMl0pO2lbMF0vPXQsaVsxXS89dCxpWzJdLz10fXZhciBBZSxSbixJZSxHbixEcyxvUyxhUyxPbyxnbCxGcixjcix1cj17cG9pbnQ6VW0sbGluZVN0YXJ0OmNTLGxpbmVFbmQ6dVMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dXIucG9pbnQ9aFMsdXIubGluZVN0YXJ0PVNMLHVyLmxpbmVFbmQ9TUwsZ2w9bmV3IHNyLGxyLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bHIucG9seWdvbkVuZCgpLHVyLnBvaW50PVVtLHVyLmxpbmVTdGFydD1jUyx1ci5saW5lRW5kPXVTLFVoPDA/KEFlPS0oSWU9MTgwKSxSbj0tKEduPTkwKSk6Z2w+aGU/R249OTA6Z2w8LWhlJiYoUm49LTkwKSxjclswXT1BZSxjclsxXT1JZX0sc3BoZXJlOmZ1bmN0aW9uKCl7QWU9LShJZT0xODApLFJuPS0oR249OTApfX07ZnVuY3Rpb24gVW0oaSx0KXtGci5wdXNoKGNyPVtBZT1pLEllPWldKSx0PFJuJiYoUm49dCksdD5HbiYmKEduPXQpfWZ1bmN0aW9uIGxTKGksdCl7dmFyIGU9THMoW2kqa3QsdCprdF0pO2lmKE9vKXt2YXIgbj1CbyhPbyxlKSxyPVtuWzFdLC1uWzBdLDBdLHM9Qm8ocixuKTtPaChzKSxzPU5oKHMpO3ZhciBvPWktRHMsYT1vPjA/MTotMSxsPXNbMF0qUGUqYSxjLHU9eGUobyk+MTgwO3VeKGEqRHM8bCYmbDxhKmkpPyhjPXNbMV0qUGUsYz5HbiYmKEduPWMpKToobD0obCszNjApJTM2MC0xODAsdV4oYSpEczxsJiZsPGEqaSk/KGM9LXNbMV0qUGUsYzxSbiYmKFJuPWMpKToodDxSbiYmKFJuPXQpLHQ+R24mJihHbj10KSkpLHU/aTxEcz9IbihBZSxpKT5IbihBZSxJZSkmJihJZT1pKTpIbihpLEllKT5IbihBZSxJZSkmJihBZT1pKTpJZT49QWU/KGk8QWUmJihBZT1pKSxpPkllJiYoSWU9aSkpOmk+RHM/SG4oQWUsaSk+SG4oQWUsSWUpJiYoSWU9aSk6SG4oaSxJZSk+SG4oQWUsSWUpJiYoQWU9aSl9ZWxzZSBGci5wdXNoKGNyPVtBZT1pLEllPWldKTt0PFJuJiYoUm49dCksdD5HbiYmKEduPXQpLE9vPWUsRHM9aX1mdW5jdGlvbiBjUygpe3VyLnBvaW50PWxTfWZ1bmN0aW9uIHVTKCl7Y3JbMF09QWUsY3JbMV09SWUsdXIucG9pbnQ9VW0sT289bnVsbH1mdW5jdGlvbiBoUyhpLHQpe2lmKE9vKXt2YXIgZT1pLURzO2dsLmFkZCh4ZShlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIG9TPWksYVM9dDtsci5wb2ludChpLHQpLGxTKGksdCl9ZnVuY3Rpb24gU0woKXtsci5saW5lU3RhcnQoKX1mdW5jdGlvbiBNTCgpe2hTKG9TLGFTKSxsci5saW5lRW5kKCkseGUoZ2wpPmhlJiYoQWU9LShJZT0xODApKSxjclswXT1BZSxjclsxXT1JZSxPbz1udWxsfWZ1bmN0aW9uIEhuKGksdCl7cmV0dXJuKHQtPWkpPDA/dCszNjA6dH1mdW5jdGlvbiBiTChpLHQpe3JldHVybiBpWzBdLXRbMF19ZnVuY3Rpb24gZlMoaSx0KXtyZXR1cm4gaVswXTw9aVsxXT9pWzBdPD10JiZ0PD1pWzFdOnQ8aVswXXx8aVsxXTx0fWZ1bmN0aW9uIGRTKGkpe3ZhciB0LGUsbixyLHMsbyxhO2lmKEduPUllPS0oQWU9Um49MS8wKSxGcj1bXSxEaChpLHVyKSxlPUZyLmxlbmd0aCl7Zm9yKEZyLnNvcnQoYkwpLHQ9MSxuPUZyWzBdLHM9W25dO3Q8ZTsrK3Qpcj1Gclt0XSxmUyhuLHJbMF0pfHxmUyhuLHJbMV0pPyhIbihuWzBdLHJbMV0pPkhuKG5bMF0sblsxXSkmJihuWzFdPXJbMV0pLEhuKHJbMF0sblsxXSk+SG4oblswXSxuWzFdKSYmKG5bMF09clswXSkpOnMucHVzaChuPXIpO2ZvcihvPS0xLzAsZT1zLmxlbmd0aC0xLHQ9MCxuPXNbZV07dDw9ZTtuPXIsKyt0KXI9c1t0XSwoYT1IbihuWzFdLHJbMF0pKT5vJiYobz1hLEFlPXJbMF0sSWU9blsxXSl9cmV0dXJuIEZyPWNyPW51bGwsQWU9PT0xLzB8fFJuPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0FlLFJuXSxbSWUsR25dXX12YXIgeWwsemgsa2gsVmgsR2gsSGgsV2gsJGgsTm0sRm0sQm0scFMsbVMscG4sbW4sZ24seWk9e3NwaGVyZTplbixwb2ludDpPbSxsaW5lU3RhcnQ6Z1MsbGluZUVuZDp5Uyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5aS5saW5lU3RhcnQ9RUwseWkubGluZUVuZD1UTH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3lpLmxpbmVTdGFydD1nUyx5aS5saW5lRW5kPXlTfX07ZnVuY3Rpb24gT20oaSx0KXtpKj1rdCx0Kj1rdDt2YXIgZT0kdCh0KTtfbChlKiR0KGkpLGUqQnQoaSksQnQodCkpfWZ1bmN0aW9uIF9sKGksdCxlKXsrK3lsLGtoKz0oaS1raCkveWwsVmgrPSh0LVZoKS95bCxHaCs9KGUtR2gpL3lsfWZ1bmN0aW9uIGdTKCl7eWkucG9pbnQ9d0x9ZnVuY3Rpb24gd0woaSx0KXtpKj1rdCx0Kj1rdDt2YXIgZT0kdCh0KTtwbj1lKiR0KGkpLG1uPWUqQnQoaSksZ249QnQodCkseWkucG9pbnQ9QUwsX2wocG4sbW4sZ24pfWZ1bmN0aW9uIEFMKGksdCl7aSo9a3QsdCo9a3Q7dmFyIGU9JHQodCksbj1lKiR0KGkpLHI9ZSpCdChpKSxzPUJ0KHQpLG89ZWkob3IoKG89bW4qcy1nbipyKSpvKyhvPWduKm4tcG4qcykqbysobz1wbipyLW1uKm4pKm8pLHBuKm4rbW4qcitnbipzKTt6aCs9byxIaCs9byoocG4rKHBuPW4pKSxXaCs9byoobW4rKG1uPXIpKSwkaCs9byooZ24rKGduPXMpKSxfbChwbixtbixnbil9ZnVuY3Rpb24geVMoKXt5aS5wb2ludD1PbX1mdW5jdGlvbiBFTCgpe3lpLnBvaW50PUNMfWZ1bmN0aW9uIFRMKCl7X1MocFMsbVMpLHlpLnBvaW50PU9tfWZ1bmN0aW9uIENMKGksdCl7cFM9aSxtUz10LGkqPWt0LHQqPWt0LHlpLnBvaW50PV9TO3ZhciBlPSR0KHQpO3BuPWUqJHQoaSksbW49ZSpCdChpKSxnbj1CdCh0KSxfbChwbixtbixnbil9ZnVuY3Rpb24gX1MoaSx0KXtpKj1rdCx0Kj1rdDt2YXIgZT0kdCh0KSxuPWUqJHQoaSkscj1lKkJ0KGkpLHM9QnQodCksbz1tbipzLWduKnIsYT1nbipuLXBuKnMsbD1wbipyLW1uKm4sYz1DbShvLGEsbCksdT1hcihjKSxoPWMmJi11L2M7Tm0uYWRkKGgqbyksRm0uYWRkKGgqYSksQm0uYWRkKGgqbCksemgrPXUsSGgrPXUqKHBuKyhwbj1uKSksV2grPXUqKG1uKyhtbj1yKSksJGgrPXUqKGduKyhnbj1zKSksX2wocG4sbW4sZ24pfWZ1bmN0aW9uIHhTKGkpe3lsPXpoPWtoPVZoPUdoPUhoPVdoPSRoPTAsTm09bmV3IHNyLEZtPW5ldyBzcixCbT1uZXcgc3IsRGgoaSx5aSk7dmFyIHQ9K05tLGU9K0ZtLG49K0JtLHI9Q20odCxlLG4pO3JldHVybiByPFBoJiYodD1IaCxlPVdoLG49JGgsemg8aGUmJih0PWtoLGU9Vmgsbj1HaCkscj1DbSh0LGUsbikscjxQaCk/W05hTixOYU5dOltlaShlLHQpKlBlLGFyKG4vcikqUGVdfWZ1bmN0aW9uIHptKGksdCl7ZnVuY3Rpb24gZShuLHIpe3JldHVybiBuPWkobixyKSx0KG5bMF0sblsxXSl9cmV0dXJuIGkuaW52ZXJ0JiZ0LmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKG4scil7cmV0dXJuIG49dC5pbnZlcnQobixyKSxuJiZpLmludmVydChuWzBdLG5bMV0pfSksZX1mdW5jdGlvbiBrbShpLHQpe3JldHVybiB4ZShpKT5zZSYmKGktPU1hdGgucm91bmQoaS9DbikqQ24pLFtpLHRdfWttLmludmVydD1rbTtmdW5jdGlvbiB2UyhpLHQsZSl7cmV0dXJuKGklPUNuKT90fHxlP3ptKE1TKGkpLGJTKHQsZSkpOk1TKGkpOnR8fGU/YlModCxlKTprbX1mdW5jdGlvbiBTUyhpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9aSx4ZSh0KT5zZSYmKHQtPU1hdGgucm91bmQodC9DbikqQ24pLFt0LGVdfX1mdW5jdGlvbiBNUyhpKXt2YXIgdD1TUyhpKTtyZXR1cm4gdC5pbnZlcnQ9U1MoLWkpLHR9ZnVuY3Rpb24gYlMoaSx0KXt2YXIgZT0kdChpKSxuPUJ0KGkpLHI9JHQodCkscz1CdCh0KTtmdW5jdGlvbiBvKGEsbCl7dmFyIGM9JHQobCksdT0kdChhKSpjLGg9QnQoYSkqYyxmPUJ0KGwpLGQ9ZiplK3UqbjtyZXR1cm5bZWkoaCpyLWQqcyx1KmUtZipuKSxhcihkKnIraCpzKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKGEsbCl7dmFyIGM9JHQobCksdT0kdChhKSpjLGg9QnQoYSkqYyxmPUJ0KGwpLGQ9ZipyLWgqcztyZXR1cm5bZWkoaCpyK2Yqcyx1KmUrZCpuKSxhcihkKmUtdSpuKV19LG99ZnVuY3Rpb24gd1MoaSl7aT12UyhpWzBdKmt0LGlbMV0qa3QsaS5sZW5ndGg+Mj9pWzJdKmt0OjApO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIGU9aShlWzBdKmt0LGVbMV0qa3QpLGVbMF0qPVBlLGVbMV0qPVBlLGV9cmV0dXJuIHQuaW52ZXJ0PWZ1bmN0aW9uKGUpe3JldHVybiBlPWkuaW52ZXJ0KGVbMF0qa3QsZVsxXSprdCksZVswXSo9UGUsZVsxXSo9UGUsZX0sdH1mdW5jdGlvbiBSTChpLHQsZSxuLHIscyl7aWYoZSl7dmFyIG89JHQodCksYT1CdCh0KSxsPW4qZTtyPT1udWxsPyhyPXQrbipDbixzPXQtbC8yKToocj1BUyhvLHIpLHM9QVMobyxzKSwobj4wP3I8czpyPnMpJiYocis9bipDbikpO2Zvcih2YXIgYyx1PXI7bj4wP3U+czp1PHM7dS09bCljPU5oKFtvLC1hKiR0KHUpLC1hKkJ0KHUpXSksaS5wb2ludChjWzBdLGNbMV0pfX1mdW5jdGlvbiBBUyhpLHQpe3Q9THModCksdFswXS09aSxPaCh0KTt2YXIgZT15TCgtdFsxXSk7cmV0dXJuKCgtdFsyXTwwPy1lOmUpK0NuLWhlKSVDbn1mdW5jdGlvbiBFUygpe3ZhciBpPVtdLHQ7cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUsbixyKXt0LnB1c2goW2UsbixyXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2kucHVzaCh0PVtdKX0sbGluZUVuZDplbixyZWpvaW46ZnVuY3Rpb24oKXtpLmxlbmd0aD4xJiZpLnB1c2goaS5wb3AoKS5jb25jYXQoaS5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPWk7cmV0dXJuIGk9W10sdD1udWxsLGV9fX1mdW5jdGlvbiBYaChpLHQpe3JldHVybiB4ZShpWzBdLXRbMF0pPGhlJiZ4ZShpWzFdLXRbMV0pPGhlfWZ1bmN0aW9uIHFoKGksdCxlLG4pe3RoaXMueD1pLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gVFMoaSx0LGUsbixyKXt2YXIgcz1bXSxvPVtdLGEsbDtpZihpLmZvckVhY2goZnVuY3Rpb24ocCl7aWYoISgoeT1wLmxlbmd0aC0xKTw9MCkpe3ZhciB5LGc9cFswXSxtPXBbeV0sdjtpZihYaChnLG0pKXtpZighZ1syXSYmIW1bMl0pe2ZvcihyLmxpbmVTdGFydCgpLGE9MDthPHk7KythKXIucG9pbnQoKGc9cFthXSlbMF0sZ1sxXSk7ci5saW5lRW5kKCk7cmV0dXJufW1bMF0rPTIqaGV9cy5wdXNoKHY9bmV3IHFoKGcscCxudWxsLCEwKSksby5wdXNoKHYubz1uZXcgcWgoZyxudWxsLHYsITEpKSxzLnB1c2godj1uZXcgcWgobSxwLG51bGwsITEpKSxvLnB1c2godi5vPW5ldyBxaChtLG51bGwsdiwhMCkpfX0pLCEhcy5sZW5ndGgpe2ZvcihvLnNvcnQodCksQ1MocyksQ1MobyksYT0wLGw9by5sZW5ndGg7YTxsOysrYSlvW2FdLmU9ZT0hZTtmb3IodmFyIGM9c1swXSx1LGg7Oyl7Zm9yKHZhciBmPWMsZD0hMDtmLnY7KWlmKChmPWYubik9PT1jKXJldHVybjt1PWYueixyLmxpbmVTdGFydCgpO2Rve2lmKGYudj1mLm8udj0hMCxmLmUpe2lmKGQpZm9yKGE9MCxsPXUubGVuZ3RoO2E8bDsrK2Epci5wb2ludCgoaD11W2FdKVswXSxoWzFdKTtlbHNlIG4oZi54LGYubi54LDEscik7Zj1mLm59ZWxzZXtpZihkKWZvcih1PWYucC56LGE9dS5sZW5ndGgtMTthPj0wOy0tYSlyLnBvaW50KChoPXVbYV0pWzBdLGhbMV0pO2Vsc2UgbihmLngsZi5wLngsLTEscik7Zj1mLnB9Zj1mLm8sdT1mLnosZD0hZH13aGlsZSghZi52KTtyLmxpbmVFbmQoKX19fWZ1bmN0aW9uIENTKGkpe2lmKHQ9aS5sZW5ndGgpe2Zvcih2YXIgdCxlPTAsbj1pWzBdLHI7KytlPHQ7KW4ubj1yPWlbZV0sci5wPW4sbj1yO24ubj1yPWlbMF0sci5wPW59fWZ1bmN0aW9uIFZtKGkpe3JldHVybiB4ZShpWzBdKTw9c2U/aVswXTptTChpWzBdKSooKHhlKGlbMF0pK3NlKSVDbi1zZSl9ZnVuY3Rpb24gUlMoaSx0KXt2YXIgZT1WbSh0KSxuPXRbMV0scj1CdChuKSxzPVtCdChlKSwtJHQoZSksMF0sbz0wLGE9MCxsPW5ldyBzcjtyPT09MT9uPVRuK2hlOnI9PT0tMSYmKG49LVRuLWhlKTtmb3IodmFyIGM9MCx1PWkubGVuZ3RoO2M8dTsrK2MpaWYoZj0oaD1pW2NdKS5sZW5ndGgpZm9yKHZhciBoLGYsZD1oW2YtMV0scD1WbShkKSx5PWRbMV0vMitJaCxnPUJ0KHkpLG09JHQoeSksdj0wO3Y8ZjsrK3YscD1fLGc9YixtPUEsZD14KXt2YXIgeD1oW3ZdLF89Vm0oeCksTT14WzFdLzIrSWgsYj1CdChNKSxBPSR0KE0pLEU9Xy1wLHc9RT49MD8xOi0xLFM9dypFLFQ9Uz5zZSxEPWcqYjtpZihsLmFkZChlaShEKncqQnQoUyksbSpBK0QqJHQoUykpKSxvKz1UP0UrdypDbjpFLFRecD49ZV5fPj1lKXt2YXIgTD1CbyhMcyhkKSxMcyh4KSk7T2goTCk7dmFyIE49Qm8ocyxMKTtPaChOKTt2YXIgRj0oVF5FPj0wPy0xOjEpKmFyKE5bMl0pOyhuPkZ8fG49PT1GJiYoTFswXXx8TFsxXSkpJiYoYSs9VF5FPj0wPzE6LTEpfX1yZXR1cm4obzwtaGV8fG88aGUmJmw8LVBoKV5hJjF9ZnVuY3Rpb24gUFMoaSx0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBzPXQociksbz1FUygpLGE9dChvKSxsPSExLGMsdSxoLGY9e3BvaW50OmQsbGluZVN0YXJ0OnksbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2YucG9pbnQ9bSxmLmxpbmVTdGFydD12LGYubGluZUVuZD14LHU9W10sYz1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2YucG9pbnQ9ZCxmLmxpbmVTdGFydD15LGYubGluZUVuZD1nLHU9bWwodSk7dmFyIF89UlMoYyxuKTt1Lmxlbmd0aD8obHx8KHIucG9seWdvblN0YXJ0KCksbD0hMCksVFModSxJTCxfLGUscikpOl8mJihsfHwoci5wb2x5Z29uU3RhcnQoKSxsPSEwKSxyLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsciksci5saW5lRW5kKCkpLGwmJihyLnBvbHlnb25FbmQoKSxsPSExKSx1PWM9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7ci5wb2x5Z29uU3RhcnQoKSxyLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsciksci5saW5lRW5kKCksci5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKF8sTSl7aShfLE0pJiZyLnBvaW50KF8sTSl9ZnVuY3Rpb24gcChfLE0pe3MucG9pbnQoXyxNKX1mdW5jdGlvbiB5KCl7Zi5wb2ludD1wLHMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2YucG9pbnQ9ZCxzLmxpbmVFbmQoKX1mdW5jdGlvbiBtKF8sTSl7aC5wdXNoKFtfLE1dKSxhLnBvaW50KF8sTSl9ZnVuY3Rpb24gdigpe2EubGluZVN0YXJ0KCksaD1bXX1mdW5jdGlvbiB4KCl7bShoWzBdWzBdLGhbMF1bMV0pLGEubGluZUVuZCgpO3ZhciBfPWEuY2xlYW4oKSxNPW8ucmVzdWx0KCksYixBPU0ubGVuZ3RoLEUsdyxTO2lmKGgucG9wKCksYy5wdXNoKGgpLGg9bnVsbCwhIUEpe2lmKF8mMSl7aWYodz1NWzBdLChFPXcubGVuZ3RoLTEpPjApe2ZvcihsfHwoci5wb2x5Z29uU3RhcnQoKSxsPSEwKSxyLmxpbmVTdGFydCgpLGI9MDtiPEU7KytiKXIucG9pbnQoKFM9d1tiXSlbMF0sU1sxXSk7ci5saW5lRW5kKCl9cmV0dXJufUE+MSYmXyYyJiZNLnB1c2goTS5wb3AoKS5jb25jYXQoTS5zaGlmdCgpKSksdS5wdXNoKE0uZmlsdGVyKFBMKSl9fXJldHVybiBmfX1mdW5jdGlvbiBQTChpKXtyZXR1cm4gaS5sZW5ndGg+MX1mdW5jdGlvbiBJTChpLHQpe3JldHVybigoaT1pLngpWzBdPDA/aVsxXS1Ubi1oZTpUbi1pWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tVG4taGU6VG4tdFsxXSl9dmFyIElTPVBTKGZ1bmN0aW9uKCl7cmV0dXJuITB9LExMLFVMLFstc2UsLVRuXSk7ZnVuY3Rpb24gTEwoaSl7dmFyIHQ9TmFOLGU9TmFOLG49TmFOLHI7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2kubGluZVN0YXJ0KCkscj0xfSxwb2ludDpmdW5jdGlvbihzLG8pe3ZhciBhPXM+MD9zZTotc2UsbD14ZShzLXQpO3hlKGwtc2UpPGhlPyhpLnBvaW50KHQsZT0oZStvKS8yPjA/VG46LVRuKSxpLnBvaW50KG4sZSksaS5saW5lRW5kKCksaS5saW5lU3RhcnQoKSxpLnBvaW50KGEsZSksaS5wb2ludChzLGUpLHI9MCk6biE9PWEmJmw+PXNlJiYoeGUodC1uKTxoZSYmKHQtPW4qaGUpLHhlKHMtYSk8aGUmJihzLT1hKmhlKSxlPURMKHQsZSxzLG8pLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxyPTApLGkucG9pbnQodD1zLGU9byksbj1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7aS5saW5lRW5kKCksdD1lPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1yfX19ZnVuY3Rpb24gREwoaSx0LGUsbil7dmFyIHIscyxvPUJ0KGktZSk7cmV0dXJuIHhlKG8pPmhlP1RtKChCdCh0KSoocz0kdChuKSkqQnQoZSktQnQobikqKHI9JHQodCkpKkJ0KGkpKS8ocipzKm8pKToodCtuKS8yfWZ1bmN0aW9uIFVMKGksdCxlLG4pe3ZhciByO2lmKGk9PW51bGwpcj1lKlRuLG4ucG9pbnQoLXNlLHIpLG4ucG9pbnQoMCxyKSxuLnBvaW50KHNlLHIpLG4ucG9pbnQoc2UsMCksbi5wb2ludChzZSwtciksbi5wb2ludCgwLC1yKSxuLnBvaW50KC1zZSwtciksbi5wb2ludCgtc2UsMCksbi5wb2ludCgtc2Uscik7ZWxzZSBpZih4ZShpWzBdLXRbMF0pPmhlKXt2YXIgcz1pWzBdPHRbMF0/c2U6LXNlO3I9ZSpzLzIsbi5wb2ludCgtcyxyKSxuLnBvaW50KDAsciksbi5wb2ludChzLHIpfWVsc2Ugbi5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIE5MKGkpe3ZhciB0PSR0KGkpLGU9NiprdCxuPXQ+MCxyPXhlKHQpPmhlO2Z1bmN0aW9uIHModSxoLGYsZCl7UkwoZCxpLGUsZix1LGgpfWZ1bmN0aW9uIG8odSxoKXtyZXR1cm4gJHQodSkqJHQoaCk+dH1mdW5jdGlvbiBhKHUpe3ZhciBoLGYsZCxwLHk7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3A9ZD0hMSx5PTF9LHBvaW50OmZ1bmN0aW9uKGcsbSl7dmFyIHY9W2csbV0seCxfPW8oZyxtKSxNPW4/Xz8wOmMoZyxtKTpfP2MoZysoZzwwP3NlOi1zZSksbSk6MDtpZighaCYmKHA9ZD1fKSYmdS5saW5lU3RhcnQoKSxfIT09ZCYmKHg9bChoLHYpLCgheHx8WGgoaCx4KXx8WGgodix4KSkmJih2WzJdPTEpKSxfIT09ZCl5PTAsXz8odS5saW5lU3RhcnQoKSx4PWwodixoKSx1LnBvaW50KHhbMF0seFsxXSkpOih4PWwoaCx2KSx1LnBvaW50KHhbMF0seFsxXSwyKSx1LmxpbmVFbmQoKSksaD14O2Vsc2UgaWYociYmaCYmbl5fKXt2YXIgYjshKE0mZikmJihiPWwodixoLCEwKSkmJih5PTAsbj8odS5saW5lU3RhcnQoKSx1LnBvaW50KGJbMF1bMF0sYlswXVsxXSksdS5wb2ludChiWzFdWzBdLGJbMV1bMV0pLHUubGluZUVuZCgpKToodS5wb2ludChiWzFdWzBdLGJbMV1bMV0pLHUubGluZUVuZCgpLHUubGluZVN0YXJ0KCksdS5wb2ludChiWzBdWzBdLGJbMF1bMV0sMykpKX1fJiYoIWh8fCFYaChoLHYpKSYmdS5wb2ludCh2WzBdLHZbMV0pLGg9dixkPV8sZj1NfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZCYmdS5saW5lRW5kKCksaD1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiB5fChwJiZkKTw8MX19fWZ1bmN0aW9uIGwodSxoLGYpe3ZhciBkPUxzKHUpLHA9THMoaCkseT1bMSwwLDBdLGc9Qm8oZCxwKSxtPUZoKGcsZyksdj1nWzBdLHg9bS12KnY7aWYoIXgpcmV0dXJuIWYmJnU7dmFyIF89dCptL3gsTT0tdCp2L3gsYj1Cbyh5LGcpLEE9QmgoeSxfKSxFPUJoKGcsTSk7RG0oQSxFKTt2YXIgdz1iLFM9RmgoQSx3KSxUPUZoKHcsdyksRD1TKlMtVCooRmgoQSxBKS0xKTtpZighKEQ8MCkpe3ZhciBMPW9yKEQpLE49QmgodywoLVMtTCkvVCk7aWYoRG0oTixBKSxOPU5oKE4pLCFmKXJldHVybiBOO3ZhciBGPXVbMF0sQj1oWzBdLEc9dVsxXSxrPWhbMV0sUTtCPEYmJihRPUYsRj1CLEI9USk7dmFyIGN0PUItRixodD14ZShjdC1zZSk8aGUsUHQ9aHR8fGN0PGhlO2lmKCFodCYmazxHJiYoUT1HLEc9ayxrPVEpLFB0P2h0P0craz4wXk5bMV08KHhlKE5bMF0tRik8aGU/RzprKTpHPD1OWzFdJiZOWzFdPD1rOmN0PnNlXihGPD1OWzBdJiZOWzBdPD1CKSl7dmFyIFh0PUJoKHcsKC1TK0wpL1QpO3JldHVybiBEbShYdCxBKSxbTixOaChYdCldfX19ZnVuY3Rpb24gYyh1LGgpe3ZhciBmPW4/aTpzZS1pLGQ9MDtyZXR1cm4gdTwtZj9kfD0xOnU+ZiYmKGR8PTIpLGg8LWY/ZHw9NDpoPmYmJihkfD04KSxkfXJldHVybiBQUyhvLGEscyxuP1swLC1pXTpbLXNlLGktc2VdKX1mdW5jdGlvbiBGTChpLHQsZSxuLHIscyl7dmFyIG89aVswXSxhPWlbMV0sbD10WzBdLGM9dFsxXSx1PTAsaD0xLGY9bC1vLGQ9Yy1hLHA7aWYocD1lLW8sISghZiYmcD4wKSl7aWYocC89ZixmPDApe2lmKHA8dSlyZXR1cm47cDxoJiYoaD1wKX1lbHNlIGlmKGY+MCl7aWYocD5oKXJldHVybjtwPnUmJih1PXApfWlmKHA9ci1vLCEoIWYmJnA8MCkpe2lmKHAvPWYsZjwwKXtpZihwPmgpcmV0dXJuO3A+dSYmKHU9cCl9ZWxzZSBpZihmPjApe2lmKHA8dSlyZXR1cm47cDxoJiYoaD1wKX1pZihwPW4tYSwhKCFkJiZwPjApKXtpZihwLz1kLGQ8MCl7aWYocDx1KXJldHVybjtwPGgmJihoPXApfWVsc2UgaWYoZD4wKXtpZihwPmgpcmV0dXJuO3A+dSYmKHU9cCl9aWYocD1zLWEsISghZCYmcDwwKSl7aWYocC89ZCxkPDApe2lmKHA+aClyZXR1cm47cD51JiYodT1wKX1lbHNlIGlmKGQ+MCl7aWYocDx1KXJldHVybjtwPGgmJihoPXApfXJldHVybiB1PjAmJihpWzBdPW8rdSpmLGlbMV09YSt1KmQpLGg8MSYmKHRbMF09bytoKmYsdFsxXT1hK2gqZCksITB9fX19fXZhciB4bD0xZTksWWg9LXhsO2Z1bmN0aW9uIEJMKGksdCxlLG4pe2Z1bmN0aW9uIHIoYyx1KXtyZXR1cm4gaTw9YyYmYzw9ZSYmdDw9dSYmdTw9bn1mdW5jdGlvbiBzKGMsdSxoLGYpe3ZhciBkPTAscD0wO2lmKGM9PW51bGx8fChkPW8oYyxoKSkhPT0ocD1vKHUsaCkpfHxsKGMsdSk8MF5oPjApZG8gZi5wb2ludChkPT09MHx8ZD09PTM/aTplLGQ+MT9uOnQpO3doaWxlKChkPShkK2grNCklNCkhPT1wKTtlbHNlIGYucG9pbnQodVswXSx1WzFdKX1mdW5jdGlvbiBvKGMsdSl7cmV0dXJuIHhlKGNbMF0taSk8aGU/dT4wPzA6Mzp4ZShjWzBdLWUpPGhlP3U+MD8yOjE6eGUoY1sxXS10KTxoZT91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gYShjLHUpe3JldHVybiBsKGMueCx1LngpfWZ1bmN0aW9uIGwoYyx1KXt2YXIgaD1vKGMsMSksZj1vKHUsMSk7cmV0dXJuIGghPT1mP2gtZjpoPT09MD91WzFdLWNbMV06aD09PTE/Y1swXS11WzBdOmg9PT0yP2NbMV0tdVsxXTp1WzBdLWNbMF19cmV0dXJuIGZ1bmN0aW9uKGMpe3ZhciB1PWMsaD1FUygpLGYsZCxwLHksZyxtLHYseCxfLE0sYixBPXtwb2ludDpFLGxpbmVTdGFydDpELGxpbmVFbmQ6TCxwb2x5Z29uU3RhcnQ6Uyxwb2x5Z29uRW5kOlR9O2Z1bmN0aW9uIEUoRixCKXtyKEYsQikmJnUucG9pbnQoRixCKX1mdW5jdGlvbiB3KCl7Zm9yKHZhciBGPTAsQj0wLEc9ZC5sZW5ndGg7QjxHOysrQilmb3IodmFyIGs9ZFtCXSxRPTEsY3Q9ay5sZW5ndGgsaHQ9a1swXSxQdCxYdCxqPWh0WzBdLHJ0PWh0WzFdO1E8Y3Q7KytRKVB0PWosWHQ9cnQsaHQ9a1tRXSxqPWh0WzBdLHJ0PWh0WzFdLFh0PD1uP3J0Pm4mJihqLVB0KSoobi1YdCk+KHJ0LVh0KSooaS1QdCkmJisrRjpydDw9biYmKGotUHQpKihuLVh0KTwocnQtWHQpKihpLVB0KSYmLS1GO3JldHVybiBGfWZ1bmN0aW9uIFMoKXt1PWgsZj1bXSxkPVtdLGI9ITB9ZnVuY3Rpb24gVCgpe3ZhciBGPXcoKSxCPWImJkYsRz0oZj1tbChmKSkubGVuZ3RoOyhCfHxHKSYmKGMucG9seWdvblN0YXJ0KCksQiYmKGMubGluZVN0YXJ0KCkscyhudWxsLG51bGwsMSxjKSxjLmxpbmVFbmQoKSksRyYmVFMoZixhLEYscyxjKSxjLnBvbHlnb25FbmQoKSksdT1jLGY9ZD1wPW51bGx9ZnVuY3Rpb24gRCgpe0EucG9pbnQ9TixkJiZkLnB1c2gocD1bXSksTT0hMCxfPSExLHY9eD1OYU59ZnVuY3Rpb24gTCgpe2YmJihOKHksZyksbSYmXyYmaC5yZWpvaW4oKSxmLnB1c2goaC5yZXN1bHQoKSkpLEEucG9pbnQ9RSxfJiZ1LmxpbmVFbmQoKX1mdW5jdGlvbiBOKEYsQil7dmFyIEc9cihGLEIpO2lmKGQmJnAucHVzaChbRixCXSksTSl5PUYsZz1CLG09RyxNPSExLEcmJih1LmxpbmVTdGFydCgpLHUucG9pbnQoRixCKSk7ZWxzZSBpZihHJiZfKXUucG9pbnQoRixCKTtlbHNle3ZhciBrPVt2PU1hdGgubWF4KFloLE1hdGgubWluKHhsLHYpKSx4PU1hdGgubWF4KFloLE1hdGgubWluKHhsLHgpKV0sUT1bRj1NYXRoLm1heChZaCxNYXRoLm1pbih4bCxGKSksQj1NYXRoLm1heChZaCxNYXRoLm1pbih4bCxCKSldO0ZMKGssUSxpLHQsZSxuKT8oX3x8KHUubGluZVN0YXJ0KCksdS5wb2ludChrWzBdLGtbMV0pKSx1LnBvaW50KFFbMF0sUVsxXSksR3x8dS5saW5lRW5kKCksYj0hMSk6RyYmKHUubGluZVN0YXJ0KCksdS5wb2ludChGLEIpLGI9ITEpfXY9Rix4PUIsXz1HfXJldHVybiBBfX12YXIgR20sSG0sWmgsSmgsem89e3NwaGVyZTplbixwb2ludDplbixsaW5lU3RhcnQ6T0wsbGluZUVuZDplbixwb2x5Z29uU3RhcnQ6ZW4scG9seWdvbkVuZDplbn07ZnVuY3Rpb24gT0woKXt6by5wb2ludD1rTCx6by5saW5lRW5kPXpMfWZ1bmN0aW9uIHpMKCl7em8ucG9pbnQ9em8ubGluZUVuZD1lbn1mdW5jdGlvbiBrTChpLHQpe2kqPWt0LHQqPWt0LEhtPWksWmg9QnQodCksSmg9JHQodCksem8ucG9pbnQ9Vkx9ZnVuY3Rpb24gVkwoaSx0KXtpKj1rdCx0Kj1rdDt2YXIgZT1CdCh0KSxuPSR0KHQpLHI9eGUoaS1IbSkscz0kdChyKSxvPUJ0KHIpLGE9bipvLGw9SmgqZS1aaCpuKnMsYz1aaCplK0poKm4qcztHbS5hZGQoZWkob3IoYSphK2wqbCksYykpLEhtPWksWmg9ZSxKaD1ufWZ1bmN0aW9uIEdMKGkpe3JldHVybiBHbT1uZXcgc3IsRGgoaSx6byksK0dtfXZhciBXbT1bbnVsbCxudWxsXSxITD17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6V219O2Z1bmN0aW9uIGtvKGksdCl7cmV0dXJuIFdtWzBdPWksV21bMV09dCxHTChITCl9dmFyIExTPXtGZWF0dXJlOmZ1bmN0aW9uKGksdCl7cmV0dXJuIGpoKGkuZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZmVhdHVyZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOylpZihqaChlW25dLmdlb21ldHJ5LHQpKXJldHVybiEwO3JldHVybiExfX0sRFM9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbihpLHQpe3JldHVybiBVUyhpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOylpZihVUyhlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7cmV0dXJuIE5TKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscj1lLmxlbmd0aDsrK248cjspaWYoTlMoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe3JldHVybiBGUyhpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHI9ZS5sZW5ndGg7KytuPHI7KWlmKEZTKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmdlb21ldHJpZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOylpZihqaChlW25dLHQpKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gamgoaSx0KXtyZXR1cm4gaSYmRFMuaGFzT3duUHJvcGVydHkoaS50eXBlKT9EU1tpLnR5cGVdKGksdCk6ITF9ZnVuY3Rpb24gVVMoaSx0KXtyZXR1cm4ga28oaSx0KT09PTB9ZnVuY3Rpb24gTlMoaSx0KXtmb3IodmFyIGUsbixyLHM9MCxvPWkubGVuZ3RoO3M8bztzKyspe2lmKG49a28oaVtzXSx0KSxuPT09MHx8cz4wJiYocj1rbyhpW3NdLGlbcy0xXSkscj4wJiZlPD1yJiZuPD1yJiYoZStuLXIpKigxLU1hdGgucG93KChlLW4pL3IsMikpPFBoKnIpKXJldHVybiEwO2U9bn1yZXR1cm4hMX1mdW5jdGlvbiBGUyhpLHQpe3JldHVybiEhUlMoaS5tYXAoV0wpLEJTKHQpKX1mdW5jdGlvbiBXTChpKXtyZXR1cm4gaT1pLm1hcChCUyksaS5wb3AoKSxpfWZ1bmN0aW9uIEJTKGkpe3JldHVybltpWzBdKmt0LGlbMV0qa3RdfWZ1bmN0aW9uICRMKGksdCl7cmV0dXJuKGkmJkxTLmhhc093blByb3BlcnR5KGkudHlwZSk/TFNbaS50eXBlXTpqaCkoaSx0KX1mdW5jdGlvbiBYTChpLHQpe3ZhciBlPWlbMF0qa3Qsbj1pWzFdKmt0LHI9dFswXSprdCxzPXRbMV0qa3Qsbz0kdChuKSxhPUJ0KG4pLGw9JHQocyksYz1CdChzKSx1PW8qJHQoZSksaD1vKkJ0KGUpLGY9bCokdChyKSxkPWwqQnQocikscD0yKmFyKG9yKEt2KHMtbikrbypsKkt2KHItZSkpKSx5PUJ0KHApLGc9cD9mdW5jdGlvbihtKXt2YXIgdj1CdChtKj1wKS95LHg9QnQocC1tKS95LF89eCp1K3YqZixNPXgqaCt2KmQsYj14KmErdipjO3JldHVybltlaShNLF8pKlBlLGVpKGIsb3IoXypfK00qTSkpKlBlXX06ZnVuY3Rpb24oKXtyZXR1cm5bZSpQZSxuKlBlXX07cmV0dXJuIGcuZGlzdGFuY2U9cCxnfXZhciBPUz1pPT5pLFZvPTEvMCxLaD1Wbyx2bD0tVm8sUWg9dmwselM9e3BvaW50OnFMLGxpbmVTdGFydDplbixsaW5lRW5kOmVuLHBvbHlnb25TdGFydDplbixwb2x5Z29uRW5kOmVuLHJlc3VsdDpmdW5jdGlvbigpe3ZhciBpPVtbVm8sS2hdLFt2bCxRaF1dO3JldHVybiB2bD1RaD0tKEtoPVZvPTEvMCksaX19O2Z1bmN0aW9uIHFMKGksdCl7aTxWbyYmKFZvPWkpLGk+dmwmJih2bD1pKSx0PEtoJiYoS2g9dCksdD5RaCYmKFFoPXQpfWZ1bmN0aW9uICRtKGkpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1uZXcgWG07Zm9yKHZhciBuIGluIGkpZVtuXT1pW25dO3JldHVybiBlLnN0cmVhbT10LGV9fWZ1bmN0aW9uIFhtKCl7fVhtLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WG0scG9pbnQ6ZnVuY3Rpb24oaSx0KXt0aGlzLnN0cmVhbS5wb2ludChpLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gcW0oaSx0LGUpe3ZhciBuPWkuY2xpcEV4dGVudCYmaS5jbGlwRXh0ZW50KCk7cmV0dXJuIGkuc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG4hPW51bGwmJmkuY2xpcEV4dGVudChudWxsKSxEaChlLGkuc3RyZWFtKHpTKSksdCh6Uy5yZXN1bHQoKSksbiE9bnVsbCYmaS5jbGlwRXh0ZW50KG4pLGl9ZnVuY3Rpb24ga1MoaSx0LGUpe3JldHVybiBxbShpLGZ1bmN0aW9uKG4pe3ZhciByPXRbMV1bMF0tdFswXVswXSxzPXRbMV1bMV0tdFswXVsxXSxvPU1hdGgubWluKHIvKG5bMV1bMF0tblswXVswXSkscy8oblsxXVsxXS1uWzBdWzFdKSksYT0rdFswXVswXSsoci1vKihuWzFdWzBdK25bMF1bMF0pKS8yLGw9K3RbMF1bMV0rKHMtbyooblsxXVsxXStuWzBdWzFdKSkvMjtpLnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2EsbF0pfSxlKX1mdW5jdGlvbiBZTChpLHQsZSl7cmV0dXJuIGtTKGksW1swLDBdLHRdLGUpfWZ1bmN0aW9uIFpMKGksdCxlKXtyZXR1cm4gcW0oaSxmdW5jdGlvbihuKXt2YXIgcj0rdCxzPXIvKG5bMV1bMF0tblswXVswXSksbz0oci1zKihuWzFdWzBdK25bMF1bMF0pKS8yLGE9LXMqblswXVsxXTtpLnNjYWxlKDE1MCpzKS50cmFuc2xhdGUoW28sYV0pfSxlKX1mdW5jdGlvbiBKTChpLHQsZSl7cmV0dXJuIHFtKGksZnVuY3Rpb24obil7dmFyIHI9K3Qscz1yLyhuWzFdWzFdLW5bMF1bMV0pLG89LXMqblswXVswXSxhPShyLXMqKG5bMV1bMV0rblswXVsxXSkpLzI7aS5zY2FsZSgxNTAqcykudHJhbnNsYXRlKFtvLGFdKX0sZSl9dmFyIFZTPTE2LGpMPSR0KDMwKmt0KTtmdW5jdGlvbiBHUyhpLHQpe3JldHVybit0P1FMKGksdCk6S0woaSl9ZnVuY3Rpb24gS0woaSl7cmV0dXJuICRtKHtwb2ludDpmdW5jdGlvbih0LGUpe3Q9aSh0LGUpLHRoaXMuc3RyZWFtLnBvaW50KHRbMF0sdFsxXSl9fSl9ZnVuY3Rpb24gUUwoaSx0KXtmdW5jdGlvbiBlKG4scixzLG8sYSxsLGMsdSxoLGYsZCxwLHksZyl7dmFyIG09Yy1uLHY9dS1yLHg9bSptK3YqdjtpZih4PjQqdCYmeS0tKXt2YXIgXz1vK2YsTT1hK2QsYj1sK3AsQT1vcihfKl8rTSpNK2IqYiksRT1hcihiLz1BKSx3PXhlKHhlKGIpLTEpPGhlfHx4ZShzLWgpPGhlPyhzK2gpLzI6ZWkoTSxfKSxTPWkodyxFKSxUPVNbMF0sRD1TWzFdLEw9VC1uLE49RC1yLEY9dipMLW0qTjsoRipGL3g+dHx8eGUoKG0qTCt2Kk4pL3gtLjUpPi4zfHxvKmYrYSpkK2wqcDxqTCkmJihlKG4scixzLG8sYSxsLFQsRCx3LF8vPUEsTS89QSxiLHksZyksZy5wb2ludChULEQpLGUoVCxELHcsXyxNLGIsYyx1LGgsZixkLHAseSxnKSl9fXJldHVybiBmdW5jdGlvbihuKXt2YXIgcixzLG8sYSxsLGMsdSxoLGYsZCxwLHksZz17cG9pbnQ6bSxsaW5lU3RhcnQ6dixsaW5lRW5kOl8scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSxnLmxpbmVTdGFydD1NfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksZy5saW5lU3RhcnQ9dn19O2Z1bmN0aW9uIG0oRSx3KXtFPWkoRSx3KSxuLnBvaW50KEVbMF0sRVsxXSl9ZnVuY3Rpb24gdigpe2g9TmFOLGcucG9pbnQ9eCxuLmxpbmVTdGFydCgpfWZ1bmN0aW9uIHgoRSx3KXt2YXIgUz1McyhbRSx3XSksVD1pKEUsdyk7ZShoLGYsdSxkLHAseSxoPVRbMF0sZj1UWzFdLHU9RSxkPVNbMF0scD1TWzFdLHk9U1syXSxWUyxuKSxuLnBvaW50KGgsZil9ZnVuY3Rpb24gXygpe2cucG9pbnQ9bSxuLmxpbmVFbmQoKX1mdW5jdGlvbiBNKCl7digpLGcucG9pbnQ9YixnLmxpbmVFbmQ9QX1mdW5jdGlvbiBiKEUsdyl7eChyPUUsdykscz1oLG89ZixhPWQsbD1wLGM9eSxnLnBvaW50PXh9ZnVuY3Rpb24gQSgpe2UoaCxmLHUsZCxwLHkscyxvLHIsYSxsLGMsVlMsbiksZy5saW5lRW5kPV8sXygpfXJldHVybiBnfX12YXIgdEQ9JG0oe3BvaW50OmZ1bmN0aW9uKGksdCl7dGhpcy5zdHJlYW0ucG9pbnQoaSprdCx0Kmt0KX19KTtmdW5jdGlvbiBlRChpKXtyZXR1cm4gJG0oe3BvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0LGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfWZ1bmN0aW9uIG5EKGksdCxlLG4scil7ZnVuY3Rpb24gcyhvLGEpe3JldHVybiBvKj1uLGEqPXIsW3QraSpvLGUtaSphXX1yZXR1cm4gcy5pbnZlcnQ9ZnVuY3Rpb24obyxhKXtyZXR1cm5bKG8tdCkvaSpuLChlLWEpL2kqcl19LHN9ZnVuY3Rpb24gSFMoaSx0LGUsbixyLHMpe2lmKCFzKXJldHVybiBuRChpLHQsZSxuLHIpO3ZhciBvPSR0KHMpLGE9QnQocyksbD1vKmksYz1hKmksdT1vL2ksaD1hL2ksZj0oYSplLW8qdCkvaSxkPShhKnQrbyplKS9pO2Z1bmN0aW9uIHAoeSxnKXtyZXR1cm4geSo9bixnKj1yLFtsKnktYypnK3QsZS1jKnktbCpnXX1yZXR1cm4gcC5pbnZlcnQ9ZnVuY3Rpb24oeSxnKXtyZXR1cm5bbioodSp5LWgqZytmKSxyKihkLWgqeS11KmcpXX0scH1mdW5jdGlvbiB0ZihpKXtyZXR1cm4gaUQoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKCl9ZnVuY3Rpb24gaUQoaSl7dmFyIHQsZT0xNTAsbj00ODAscj0yNTAscz0wLG89MCxhPTAsbD0wLGM9MCx1LGg9MCxmPTEsZD0xLHA9bnVsbCx5PUlTLGc9bnVsbCxtLHYseCxfPU9TLE09LjUsYixBLEUsdyxTO2Z1bmN0aW9uIFQoRil7cmV0dXJuIEUoRlswXSprdCxGWzFdKmt0KX1mdW5jdGlvbiBEKEYpe3JldHVybiBGPUUuaW52ZXJ0KEZbMF0sRlsxXSksRiYmW0ZbMF0qUGUsRlsxXSpQZV19VC5zdHJlYW09ZnVuY3Rpb24oRil7cmV0dXJuIHcmJlM9PT1GP3c6dz10RChlRCh1KSh5KGIoXyhTPUYpKSkpKX0sVC5wcmVjbGlwPWZ1bmN0aW9uKEYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PUYscD12b2lkIDAsTigpKTp5fSxULnBvc3RjbGlwPWZ1bmN0aW9uKEYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPUYsZz1tPXY9eD1udWxsLE4oKSk6X30sVC5jbGlwQW5nbGU9ZnVuY3Rpb24oRil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K0Y/TkwocD1GKmt0KToocD1udWxsLElTKSxOKCkpOnAqUGV9LFQuY2xpcEV4dGVudD1mdW5jdGlvbihGKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz1GPT1udWxsPyhnPW09dj14PW51bGwsT1MpOkJMKGc9K0ZbMF1bMF0sbT0rRlswXVsxXSx2PStGWzFdWzBdLHg9K0ZbMV1bMV0pLE4oKSk6Zz09bnVsbD9udWxsOltbZyxtXSxbdix4XV19LFQuc2NhbGU9ZnVuY3Rpb24oRil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K0YsTCgpKTplfSxULnRyYW5zbGF0ZT1mdW5jdGlvbihGKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rRlswXSxyPStGWzFdLEwoKSk6W24scl19LFQuY2VudGVyPWZ1bmN0aW9uKEYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPUZbMF0lMzYwKmt0LG89RlsxXSUzNjAqa3QsTCgpKTpbcypQZSxvKlBlXX0sVC5yb3RhdGU9ZnVuY3Rpb24oRil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RlswXSUzNjAqa3QsbD1GWzFdJTM2MCprdCxjPUYubGVuZ3RoPjI/RlsyXSUzNjAqa3Q6MCxMKCkpOlthKlBlLGwqUGUsYypQZV19LFQuYW5nbGU9ZnVuY3Rpb24oRil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9RiUzNjAqa3QsTCgpKTpoKlBlfSxULnJlZmxlY3RYPWZ1bmN0aW9uKEYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPUY/LTE6MSxMKCkpOmY8MH0sVC5yZWZsZWN0WT1mdW5jdGlvbihGKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1GPy0xOjEsTCgpKTpkPDB9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKEYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPUdTKEEsTT1GKkYpLE4oKSk6b3IoTSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKEYsQil7cmV0dXJuIGtTKFQsRixCKX0sVC5maXRTaXplPWZ1bmN0aW9uKEYsQil7cmV0dXJuIFlMKFQsRixCKX0sVC5maXRXaWR0aD1mdW5jdGlvbihGLEIpe3JldHVybiBaTChULEYsQil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKEYsQil7cmV0dXJuIEpMKFQsRixCKX07ZnVuY3Rpb24gTCgpe3ZhciBGPUhTKGUsMCwwLGYsZCxoKS5hcHBseShudWxsLHQocyxvKSksQj1IUyhlLG4tRlswXSxyLUZbMV0sZixkLGgpO3JldHVybiB1PXZTKGEsbCxjKSxBPXptKHQsQiksRT16bSh1LEEpLGI9R1MoQSxNKSxOKCl9ZnVuY3Rpb24gTigpe3JldHVybiB3PVM9bnVsbCxUfXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLFQuaW52ZXJ0PXQuaW52ZXJ0JiZELEwoKX19ZnVuY3Rpb24gckQoaSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49b3IodCp0K2UqZSkscj1pKG4pLHM9QnQociksbz0kdChyKTtyZXR1cm5bZWkodCpzLG4qbyksYXIobiYmZSpzL24pXX19ZnVuY3Rpb24gWW0oaSx0KXtyZXR1cm5baSxwTChnTCgoVG4rdCkvMikpXX1ZbS5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXtyZXR1cm5baSwyKlRtKGRMKHQpKS1Ubl19O2Z1bmN0aW9uIHNEKCl7cmV0dXJuIG9EKFltKS5zY2FsZSg5NjEvQ24pfWZ1bmN0aW9uIG9EKGkpe3ZhciB0PXRmKGkpLGU9dC5jZW50ZXIsbj10LnNjYWxlLHI9dC50cmFuc2xhdGUscz10LmNsaXBFeHRlbnQsbz1udWxsLGEsbCxjO3Quc2NhbGU9ZnVuY3Rpb24oaCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4oaCksdSgpKTpuKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKGgpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKGgpLHUoKSk6cigpfSx0LmNlbnRlcj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZShoKSx1KCkpOmUoKX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKGgpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPT1udWxsP289YT1sPWM9bnVsbDoobz0raFswXVswXSxhPStoWzBdWzFdLGw9K2hbMV1bMF0sYz0raFsxXVsxXSksdSgpKTpvPT1udWxsP251bGw6W1tvLGFdLFtsLGNdXX07ZnVuY3Rpb24gdSgpe3ZhciBoPXNlKm4oKSxmPXQod1ModC5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHMobz09bnVsbD9bW2ZbMF0taCxmWzFdLWhdLFtmWzBdK2gsZlsxXStoXV06aT09PVltP1tbTWF0aC5tYXgoZlswXS1oLG8pLGFdLFtNYXRoLm1pbihmWzBdK2gsbCksY11dOltbbyxNYXRoLm1heChmWzFdLWgsYSldLFtsLE1hdGgubWluKGZbMV0raCxjKV1dKX1yZXR1cm4gdSgpfWZ1bmN0aW9uIFptKGksdCl7cmV0dXJuW2ksdF19Wm0uaW52ZXJ0PVptO2Z1bmN0aW9uIGFEKCl7cmV0dXJuIHRmKFptKS5zY2FsZSgxNTIuNjMpfWZ1bmN0aW9uIFdTKGksdCl7dmFyIGU9JHQodCksbj0xKyR0KGkpKmU7cmV0dXJuW2UqQnQoaSkvbixCdCh0KS9uXX1XUy5pbnZlcnQ9ckQoZnVuY3Rpb24oaSl7cmV0dXJuIDIqVG0oaSl9KTtmdW5jdGlvbiBsRCgpe3JldHVybiB0ZihXUykuc2NhbGUoMjUwKS5jbGlwQW5nbGUoMTQyKX12YXIgY0Q9TWF0aC5hdGFuLHVEPU1hdGguY29zLGhEPU1hdGgudGFuLGZEPU1hdGguUEksZEQ9ZkQvMTgwO2Z1bmN0aW9uICRTKGkpe3JldHVybiBpPjA/TWF0aC5zcXJ0KGkpOjB9dmFyIGVmPXVEKDM1KmREKTtmdW5jdGlvbiBYUyhpLHQpe3ZhciBlPWhEKHQvMik7cmV0dXJuW2kqZWYqJFMoMS1lKmUpLCgxK2VmKSplXX1YUy5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXt2YXIgZT10LygxK2VmKTtyZXR1cm5baSYmaS8oZWYqJFMoMS1lKmUpKSwyKmNEKGUpXX07ZnVuY3Rpb24gcEQoKXtyZXR1cm4gdGYoWFMpLnNjYWxlKDEzNy4xNTIpfWNvbnN0IG1EPXttZXJjYXRvcjpzRCxlcXVpcmVjdGFuZ3VsYXI6YUQsZmFoZXk6cER9LEptPXt9LFNsPWk9Pnt2YXIgbixyLHM7Y29uc3QgdD1KU09OLnN0cmluZ2lmeShpKTtpZihKbVt0XSlyZXR1cm4gSm1bdF07Y29uc3QgZT1tRFsobj1pLnByb2plY3Rpb25UeXBlKSE9bnVsbD9uOiJtZXJjYXRvciJdKCkuY2VudGVyKGkuY2VudGVyKS5zY2FsZShpLnNjYWxlKS50cmFuc2xhdGUoKHI9aS50cmFuc2xhdGUpIT1udWxsP3I6WzAsMF0pLnByZWNpc2lvbigocz1pLnByZWNpc2lvbikhPW51bGw/czouMSk7cmV0dXJuIGkucm90YXRlJiZlLnJvdGF0ZShpLnJvdGF0ZSksSm1bdF09ZSxlfSxuZj0oaSx0KT0+aS5tYXAoKFtlLG5dKT0+e2xldCByO2lmKHQpe2NvbnN0W3Msb109dChbZSxuXSk7cj1uZXcgWChzLC1vKX1lbHNlIHI9bmV3IFgoZSxuKTtyZXR1cm4gcn0pO3ZhciBNbD0oaSx0KT0+e2NvbnN0IGU9WnYoaSx0IT1udWxsP3Q6MCksbj17fSxyPVtdLHM9T2JqZWN0LmtleXMoZS5hdHRyaWJ1dGVzKTtyZXR1cm4gZS5pbmRleCYmcy5wdXNoKCJpbmRleCIpLHMuZm9yRWFjaChvPT57Y29uc3QgYT1vPT09ImluZGV4Ij9lLmluZGV4OmUuYXR0cmlidXRlc1tvXTtuW29dPXthcnJheTphLmFycmF5LGl0ZW1TaXplOmEuaXRlbVNpemV9LHIucHVzaChhLmFycmF5LmJ1ZmZlcil9KSx0JiYobi5ncm91cHM9ZS5ncm91cHMpLGUuZGlzcG9zZSgpLGkuZm9yRWFjaChvPT57by5kaXNwb3NlKCl9KSx7bWVzc2FnZTpuLHRyYW5zZmVyOnJ9fSxqbT0oaSx0PTMwMCk9Pntjb25zdCBlPVtdO3JldHVybiBpLmZvckVhY2gobj0+e2xldCByPSExO2ZvcihsZXQgcz0xO3M8bi5sZW5ndGg7cysrKWlmKE1hdGguYWJzKG5bc10ueC1uW3MtMV0ueCk+dCl7cj0hMDticmVha31pZihyKXtjb25zdCBzPVtdLG89W107bi5mb3JFYWNoKGE9PnthLng8MD9zLnB1c2goYSk6by5wdXNoKGEpfSksZS5wdXNoKHMsbyl9ZWxzZSBlLnB1c2gobil9KSxlfTtjb25zdCBnRD0oe2Nvb3JkaW5hdGVzQXJyOmksc3BsaXQ6dCxzaWRlUmVwZWF0OmUsYmJveDpuLGJib3hPZmZzZXQ6cixkZXB0aDpzLHByb2plY3Rpb246byx1c2VHcm91cHM6YSxoYXNUb3A6bCxoYXNCb3R0b206YyxoYXNTaWRlOnUsc3BsaXRQb2x5Z29uczpoLHRvcFNlZ21lbnRzOmZ9KT0+e2NvbnN0IGQ9byYmU2wobyk7bGV0IHA9aS5tYXAobT0+bmYobSxkKSk7aCYmKHA9am0ocCxoKSk7bGV0IHk7aWYobil7Y29uc3RbbSx2XT1uZihbW25bMF0sblsxXV0sW25bMl0sblszXV1dLG8hPW51bGwmJm8ucm90YXRlP1NsKEZpKG9uKHt9LG8pLHtyb3RhdGU6dm9pZCAwfSkpOmQpO3ImJihtLngrPXJbMF0sbS55Kz1yWzFdLHYueCs9clsyXSx2LnkrPXJbM10pLHk9bmV3IG1lKG5ldyBSKG0ueCxtLnksMCksbmV3IFIodi54LHYueSwwKSl9Y29uc3QgZz1wLm1hcCgobSx2KT0+e3ZhciB4O3JldHVybiBqMyh7cG9pbnRzOm0sc3BsaXQ6dCxzaWRlUmVwZWF0OmUsZGVwdGg6KHg9c1t2XSkhPW51bGw/eDpzWzBdLGhhc1RvcDpsLGhhc0JvdHRvbTpjLGhhc1NpZGU6dSxib3gzOnksdG9wU2VnbWVudHM6Zn0pfSk7cmV0dXJuIE1sKGcsYSl9O2Z1bmN0aW9uIEttKGksdCxlLG4scil7bGV0IHM7aWYoaT1pLnN1YmFycmF5fHxpLnNsaWNlP2k6aS5idWZmZXIsZT1lLnN1YmFycmF5fHxlLnNsaWNlP2U6ZS5idWZmZXIsaT10P2kuc3ViYXJyYXk/aS5zdWJhcnJheSh0LHImJnQrcik6aS5zbGljZSh0LHImJnQrcik6aSxlLnNldCllLnNldChpLG4pO2Vsc2UgZm9yKHM9MDtzPGkubGVuZ3RoO3MrKyllW3Mrbl09aVtzXTtyZXR1cm4gZX1mdW5jdGlvbiB5RChpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT9pOmkgaW5zdGFuY2VvZiBGdD9pLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5hcnJheTppLm1hcCh0PT57Y29uc3QgZT1BcnJheS5pc0FycmF5KHQpO3JldHVybiB0IGluc3RhbmNlb2YgUj9bdC54LHQueSx0LnpdOnQgaW5zdGFuY2VvZiBYP1t0LngsdC55LDBdOmUmJnQubGVuZ3RoPT09Mz9bdFswXSx0WzFdLHRbMl1dOmUmJnQubGVuZ3RoPT09Mj9bdFswXSx0WzFdLDBdOnR9KS5mbGF0KCl9Y2xhc3MgX0QgZXh0ZW5kcyBGdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoTGluZSIsdGhpcy5pc01lc2hMaW5lPSEwLHRoaXMucG9zaXRpb25zPVtdLHRoaXMucHJldmlvdXM9W10sdGhpcy5uZXh0PVtdLHRoaXMuc2lkZT1bXSx0aGlzLndpZHRoPVtdLHRoaXMuaW5kaWNlc19hcnJheT1bXSx0aGlzLnV2cz1bXSx0aGlzLmNvdW50ZXJzPVtdLHRoaXMud2lkdGhDYWxsYmFjaz1udWxsLHRoaXMuX3BvaW50cz1bXSx0aGlzLm1hdHJpeFdvcmxkPW5ldyBSdCxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb2ludHM6e2VudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIHRoaXMuX3BvaW50c30sc2V0KHQpe3RoaXMuc2V0UG9pbnRzKHQsdGhpcy53aWR0aENhbGxiYWNrKX19fSl9c2V0TWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhXb3JsZD10fXNldFBvaW50cyh0LGUpe2lmKHQ9eUQodCksdGhpcy5fcG9pbnRzPXQsdGhpcy53aWR0aENhbGxiYWNrPWUhPW51bGw/ZTpudWxsLHRoaXMucG9zaXRpb25zPVtdLHRoaXMuY291bnRlcnM9W10sdC5sZW5ndGgmJnRbMF1pbnN0YW5jZW9mIFIpZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXSxzPW4vKHQubGVuZ3RoLTEpO3RoaXMucG9zaXRpb25zLnB1c2goci54LHIueSxyLnopLHRoaXMucG9zaXRpb25zLnB1c2goci54LHIueSxyLnopLHRoaXMuY291bnRlcnMucHVzaChzKSx0aGlzLmNvdW50ZXJzLnB1c2gocyl9ZWxzZSBmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTMpe2NvbnN0IHI9bi8odC5sZW5ndGgtMSk7dGhpcy5wb3NpdGlvbnMucHVzaCh0W25dLHRbbisxXSx0W24rMl0pLHRoaXMucG9zaXRpb25zLnB1c2godFtuXSx0W24rMV0sdFtuKzJdKSx0aGlzLmNvdW50ZXJzLnB1c2gociksdGhpcy5jb3VudGVycy5wdXNoKHIpfXRoaXMucHJvY2VzcygpfWNvbXBhcmVWMyh0LGUpe2NvbnN0IG49dCo2LHI9ZSo2O3JldHVybiB0aGlzLnBvc2l0aW9uc1tuXT09PXRoaXMucG9zaXRpb25zW3JdJiZ0aGlzLnBvc2l0aW9uc1tuKzFdPT09dGhpcy5wb3NpdGlvbnNbcisxXSYmdGhpcy5wb3NpdGlvbnNbbisyXT09PXRoaXMucG9zaXRpb25zW3IrMl19Y29weVYzKHQpe2NvbnN0IGU9dCo2O3JldHVyblt0aGlzLnBvc2l0aW9uc1tlXSx0aGlzLnBvc2l0aW9uc1tlKzFdLHRoaXMucG9zaXRpb25zW2UrMl1dfXByb2Nlc3MoKXtjb25zdCB0PXRoaXMucG9zaXRpb25zLmxlbmd0aC82O3RoaXMucHJldmlvdXM9W10sdGhpcy5uZXh0PVtdLHRoaXMuc2lkZT1bXSx0aGlzLndpZHRoPVtdLHRoaXMuaW5kaWNlc19hcnJheT1bXSx0aGlzLnV2cz1bXTtsZXQgZSxuO3RoaXMuY29tcGFyZVYzKDAsdC0xKT9uPXRoaXMuY29weVYzKHQtMik6bj10aGlzLmNvcHlWMygwKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSk7Zm9yKGxldCByPTA7cjx0O3IrKyl7aWYodGhpcy5zaWRlLnB1c2goMSksdGhpcy5zaWRlLnB1c2goLTEpLHRoaXMud2lkdGhDYWxsYmFjaz9lPXRoaXMud2lkdGhDYWxsYmFjayhyLyh0LTEpKTplPTEsdGhpcy53aWR0aC5wdXNoKGUpLHRoaXMud2lkdGgucHVzaChlKSx0aGlzLnV2cy5wdXNoKHIvKHQtMSksMCksdGhpcy51dnMucHVzaChyLyh0LTEpLDEpLHI8dC0xKXtuPXRoaXMuY29weVYzKHIpLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKTtjb25zdCBzPXIqMjt0aGlzLmluZGljZXNfYXJyYXkucHVzaChzLHMrMSxzKzIpLHRoaXMuaW5kaWNlc19hcnJheS5wdXNoKHMrMixzKzEscyszKX1yPjAmJihuPXRoaXMuY29weVYzKHIpLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSkpfXRoaXMuY29tcGFyZVYzKHQtMSwwKT9uPXRoaXMuY29weVYzKDEpOm49dGhpcy5jb3B5VjModC0xKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pLCF0aGlzLl9hdHRyaWJ1dGVzfHx0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50IT09dGhpcy5jb3VudGVycy5sZW5ndGg/dGhpcy5fYXR0cmlidXRlcz17cG9zaXRpb246bmV3IEp0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NpdGlvbnMpLDMpLHByZXZpb3VzOm5ldyBKdChuZXcgRmxvYXQzMkFycmF5KHRoaXMucHJldmlvdXMpLDMpLG5leHQ6bmV3IEp0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5uZXh0KSwzKSxzaWRlOm5ldyBKdChuZXcgRmxvYXQzMkFycmF5KHRoaXMuc2lkZSksMSksd2lkdGg6bmV3IEp0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy53aWR0aCksMSksdXY6bmV3IEp0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy51dnMpLDIpLGluZGV4Om5ldyBKdChuZXcgVWludDE2QXJyYXkodGhpcy5pbmRpY2VzX2FycmF5KSwxKSxjb3VudGVyczpuZXcgSnQobmV3IEZsb2F0MzJBcnJheSh0aGlzLmNvdW50ZXJzKSwxKX06KHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24uY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NpdGlvbnMpKSx0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wcmV2aW91cykpLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5uZXh0LmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMubmV4dCkpLHRoaXMuX2F0dHJpYnV0ZXMubmV4dC5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnNpZGUuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5zaWRlKSksdGhpcy5fYXR0cmlidXRlcy5zaWRlLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGguY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy53aWR0aCkpLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy51di5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnV2cykpLHRoaXMuX2F0dHJpYnV0ZXMudXYubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5pbmRleC5jb3B5QXJyYXkobmV3IFVpbnQxNkFycmF5KHRoaXMuaW5kaWNlc19hcnJheSkpLHRoaXMuX2F0dHJpYnV0ZXMuaW5kZXgubmVlZHNVcGRhdGU9ITApLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbiksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIix0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsdGhpcy5fYXR0cmlidXRlcy5uZXh0KSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsdGhpcy5fYXR0cmlidXRlcy5zaWRlKSx0aGlzLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsdGhpcy5fYXR0cmlidXRlcy51diksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIix0aGlzLl9hdHRyaWJ1dGVzLmNvdW50ZXJzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24pLHRoaXMuc2V0QXR0cmlidXRlKCJwcmV2aW91cyIsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5leHQiLHRoaXMuX2F0dHJpYnV0ZXMubmV4dCksdGhpcy5zZXRBdHRyaWJ1dGUoInNpZGUiLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZSksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9hdHRyaWJ1dGVzLndpZHRoKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLHRoaXMuX2F0dHJpYnV0ZXMudXYpLHRoaXMuc2V0QXR0cmlidXRlKCJjb3VudGVycyIsdGhpcy5fYXR0cmlidXRlcy5jb3VudGVycyksdGhpcy5zZXRJbmRleCh0aGlzLl9hdHRyaWJ1dGVzLmluZGV4KSx0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCl9YWR2YW5jZSh7eDp0LHk6ZSx6Om59KXtjb25zdCByPXRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXkscz10aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLmFycmF5LG89dGhpcy5fYXR0cmlidXRlcy5uZXh0LmFycmF5LGE9ci5sZW5ndGg7S20ociwwLHMsMCxhKSxLbShyLDYsciwwLGEtNiksclthLTZdPXQsclthLTVdPWUsclthLTRdPW4sclthLTNdPXQsclthLTJdPWUsclthLTFdPW4sS20ociw2LG8sMCxhLTYpLG9bYS02XT10LG9bYS01XT1lLG9bYS00XT1uLG9bYS0zXT10LG9bYS0yXT1lLG9bYS0xXT1uLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLm5leHQubmVlZHNVcGRhdGU9ITB9fXZhciBxUz1pPT57Y29uc3R7c2V0UG9pbnRXaWR0aDp0LG5vZGVzOmV9PWksbj1uZXcgX0Q7cmV0dXJuIG4uc2V0UG9pbnRzKGUsdCksbn07Y29uc3QgeEQ9KHtjb29yZGluYXRlc0FycjppLHByb2plY3Rpb246dCxsaW5lV2lkdGg6ZSx1c2VHcm91cHM6bixzcGxpdFBvbHlnb25zOnJ9KT0+e2NvbnN0IHM9dCYmU2wodCk7bGV0IG89aS5tYXAobD0+bmYobCxzKSk7ciYmKG89am0obyxyKSk7Y29uc3QgYT1vLm1hcCgobCxjKT0+e3ZhciBoO2NvbnN0IHU9KGg9ZVtjXSkhPW51bGw/aDplWzBdO3JldHVybiBxUyh7bm9kZXM6bCxzZXRQb2ludFdpZHRoOigpPT51fSl9KTtyZXR1cm4gTWwoYSxuKX07dmFyIHZEPWk9Pntjb25zdHtwb2ludHM6dH09aSxlPXQucmVkdWNlKChyLHMsbyk9PihvPHQubGVuZ3RoLTEmJnIucHVzaChzLHRbbysxXSksciksW10pO3JldHVybiBuZXcgRnQoKS5zZXRGcm9tUG9pbnRzKGUpfTtjb25zdCBTRD0oe2Nvb3JkaW5hdGVzQXJyOmkscHJvamVjdGlvbjp0LGxpbmVXaWR0aDplLHVzZUdyb3VwczpuLHNwbGl0UG9seWdvbnM6cn0pPT57Y29uc3Qgcz10JiZTbCh0KTtsZXQgbz1pLm1hcChsPT5uZihsLHMpKTtyJiYobz1qbShvLHIpKTtjb25zdCBhPW8ubWFwKChsLGMpPT52RCh7cG9pbnRzOmwubWFwKHU9Pm5ldyBSKHUueCx1LnksMCkpfSkpO3JldHVybiBNbChhLG4pfTtmdW5jdGlvbiBNRChpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHI9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHM9WVMoaSwwLHIsZSwhMCk7Y29uc3Qgbz1bXTtpZighc3x8cy5uZXh0PT09cy5wcmV2KXJldHVybiBvO2xldCBhLGwsYztpZihuJiYocz1URChpLHQscyxlKSksaS5sZW5ndGg+ODAqZSl7YT0xLzAsbD0xLzA7bGV0IHU9LTEvMCxoPS0xLzA7Zm9yKGxldCBmPWU7ZjxyO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8bCYmKGw9cCksZD51JiYodT1kKSxwPmgmJihoPXApfWM9TWF0aC5tYXgodS1hLGgtbCksYz1jIT09MD8zMjc2Ny9jOjB9cmV0dXJuIGJsKHMsbyxlLGEsbCxjLDApLG99ZnVuY3Rpb24gWVMoaSx0LGUsbixyKXtsZXQgcztpZihyPT09T0QoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilzPWpTKG8vbnwwLGlbb10saVtvKzFdLHMpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcz1qUyhvL258MCxpW29dLGlbbysxXSxzKTtyZXR1cm4gcyYmcmYocyxzLm5leHQpJiYoQWwocykscz1zLm5leHQpLHN9ZnVuY3Rpb24gVXMoaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYocmYoZSxlLm5leHQpfHxFZShlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKEFsKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIGJsKGksdCxlLG4scixzLG8pe2lmKCFpKXJldHVybjshbyYmcyYmTEQoaSxuLHIscyk7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGw9aS5wcmV2LGM9aS5uZXh0O2lmKHM/d0QoaSxuLHIscyk6YkQoaSkpe3QucHVzaChsLmksaS5pLGMuaSksQWwoaSksaT1jLm5leHQsYT1jLm5leHQ7Y29udGludWV9aWYoaT1jLGk9PT1hKXtvP289PT0xPyhpPUFEKFVzKGkpLHQpLGJsKGksdCxlLG4scixzLDIpKTpvPT09MiYmRUQoaSx0LGUsbixyLHMpOmJsKFVzKGkpLHQsZSxuLHIscywxKTticmVha319fWZ1bmN0aW9uIGJEKGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihFZSh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcj10Lngscz1lLngsbz1uLngsYT10LnksbD1lLnksYz1uLnksdT1yPHM/cjxvP3I6bzpzPG8/czpvLGg9YTxsP2E8Yz9hOmM6bDxjP2w6YyxmPXI+cz9yPm8/cjpvOnM+bz9zOm8sZD1hPmw/YT5jP2E6YzpsPmM/bDpjO2xldCBwPW4ubmV4dDtmb3IoO3AhPT10Oyl7aWYocC54Pj11JiZwLng8PWYmJnAueT49aCYmcC55PD1kJiZHbyhyLGEscyxsLG8sYyxwLngscC55KSYmRWUocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiB3RChpLHQsZSxuKXtjb25zdCByPWkucHJldixzPWksbz1pLm5leHQ7aWYoRWUocixzLG8pPj0wKXJldHVybiExO2NvbnN0IGE9ci54LGw9cy54LGM9by54LHU9ci55LGg9cy55LGY9by55LGQ9YTxsP2E8Yz9hOmM6bDxjP2w6YyxwPXU8aD91PGY/dTpmOmg8Zj9oOmYseT1hPmw/YT5jP2E6YzpsPmM/bDpjLGc9dT5oP3U+Zj91OmY6aD5mP2g6ZixtPVFtKGQscCx0LGUsbiksdj1RbSh5LGcsdCxlLG4pO2xldCB4PWkucHJldlosXz1pLm5leHRaO2Zvcig7eCYmeC56Pj1tJiZfJiZfLno8PXY7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1yJiZ4IT09byYmR28oYSx1LGwsaCxjLGYseC54LHgueSkmJkVlKHgucHJldix4LHgubmV4dCk+PTB8fCh4PXgucHJldlosXy54Pj1kJiZfLng8PXkmJl8ueT49cCYmXy55PD1nJiZfIT09ciYmXyE9PW8mJkdvKGEsdSxsLGgsYyxmLF8ueCxfLnkpJiZFZShfLnByZXYsXyxfLm5leHQpPj0wKSlyZXR1cm4hMTtfPV8ubmV4dFp9Zm9yKDt4JiZ4Lno+PW07KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1yJiZ4IT09byYmR28oYSx1LGwsaCxjLGYseC54LHgueSkmJkVlKHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14LnByZXZafWZvcig7XyYmXy56PD12Oyl7aWYoXy54Pj1kJiZfLng8PXkmJl8ueT49cCYmXy55PD1nJiZfIT09ciYmXyE9PW8mJkdvKGEsdSxsLGgsYyxmLF8ueCxfLnkpJiZFZShfLnByZXYsXyxfLm5leHQpPj0wKXJldHVybiExO189Xy5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBBRChpLHQpe2xldCBlPWk7ZG97Y29uc3Qgbj1lLnByZXYscj1lLm5leHQubmV4dDshcmYobixyKSYmWlMobixlLGUubmV4dCxyKSYmd2wobixyKSYmd2wocixuKSYmKHQucHVzaChuLmksZS5pLHIuaSksQWwoZSksQWwoZS5uZXh0KSxlPWk9ciksZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiBVcyhlKX1mdW5jdGlvbiBFRChpLHQsZSxuLHIscyl7bGV0IG89aTtkb3tsZXQgYT1vLm5leHQubmV4dDtmb3IoO2EhPT1vLnByZXY7KXtpZihvLmkhPT1hLmkmJk5EKG8sYSkpe2xldCBsPUpTKG8sYSk7bz1VcyhvLG8ubmV4dCksbD1VcyhsLGwubmV4dCksYmwobyx0LGUsbixyLHMsMCksYmwobCx0LGUsbixyLHMsMCk7cmV0dXJufWE9YS5uZXh0fW89by5uZXh0fXdoaWxlKG8hPT1pKX1mdW5jdGlvbiBURChpLHQsZSxuKXtjb25zdCByPVtdO2ZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT10W3NdKm4sbD1zPG8tMT90W3MrMV0qbjppLmxlbmd0aCxjPVlTKGksYSxsLG4sITEpO2M9PT1jLm5leHQmJihjLnN0ZWluZXI9ITApLHIucHVzaChVRChjKSl9ci5zb3J0KENEKTtmb3IobGV0IHM9MDtzPHIubGVuZ3RoO3MrKyllPVJEKHJbc10sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gQ0QoaSx0KXtyZXR1cm4gaS54LXQueH1mdW5jdGlvbiBSRChpLHQpe2NvbnN0IGU9UEQoaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPUpTKGUsaSk7cmV0dXJuIFVzKG4sbi5uZXh0KSxVcyhlLGUubmV4dCl9ZnVuY3Rpb24gUEQoaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHI9aS55O2xldCBzPS0xLzAsbztkb3tpZihyPD1lLnkmJnI+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7Y29uc3QgaD1lLngrKHItZS55KSooZS5uZXh0LngtZS54KS8oZS5uZXh0LnktZS55KTtpZihoPD1uJiZoPnMmJihzPWgsbz1lLng8ZS5uZXh0Lng/ZTplLm5leHQsaD09PW4pKXJldHVybiBvfWU9ZS5uZXh0fXdoaWxlKGUhPT10KTtpZighbylyZXR1cm4gbnVsbDtjb25zdCBhPW8sbD1vLngsYz1vLnk7bGV0IHU9MS8wO2U9bztkb3tpZihuPj1lLngmJmUueD49bCYmbiE9PWUueCYmR28ocjxjP246cyxyLGwsYyxyPGM/czpuLHIsZS54LGUueSkpe2NvbnN0IGg9TWF0aC5hYnMoci1lLnkpLyhuLWUueCk7d2woZSxpKSYmKGg8dXx8aD09PXUmJihlLng+by54fHxlLng9PT1vLngmJklEKG8sZSkpKSYmKG89ZSx1PWgpfWU9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4gb31mdW5jdGlvbiBJRChpLHQpe3JldHVybiBFZShpLnByZXYsaSx0LnByZXYpPDAmJkVlKHQubmV4dCxpLGkubmV4dCk8MH1mdW5jdGlvbiBMRChpLHQsZSxuKXtsZXQgcj1pO2RvIHIuej09PTAmJihyLno9UW0oci54LHIueSx0LGUsbikpLHIucHJldlo9ci5wcmV2LHIubmV4dFo9ci5uZXh0LHI9ci5uZXh0O3doaWxlKHIhPT1pKTtyLnByZXZaLm5leHRaPW51bGwsci5wcmV2Wj1udWxsLEREKHIpfWZ1bmN0aW9uIEREKGkpe2xldCB0LGU9MTtkb3tsZXQgbj1pLHI7aT1udWxsO2xldCBzPW51bGw7Zm9yKHQ9MDtuOyl7dCsrO2xldCBvPW4sYT0wO2ZvcihsZXQgYz0wO2M8ZSYmKGErKyxvPW8ubmV4dFosISFvKTtjKyspO2xldCBsPWU7Zm9yKDthPjB8fGw+MCYmbzspYSE9PTAmJihsPT09MHx8IW98fG4uejw9by56KT8ocj1uLG49bi5uZXh0WixhLS0pOihyPW8sbz1vLm5leHRaLGwtLSkscz9zLm5leHRaPXI6aT1yLHIucHJldlo9cyxzPXI7bj1vfXMubmV4dFo9bnVsbCxlKj0yfXdoaWxlKHQ+MSk7cmV0dXJuIGl9ZnVuY3Rpb24gUW0oaSx0LGUsbixyKXtyZXR1cm4gaT0oaS1lKSpyfDAsdD0odC1uKSpyfDAsaT0oaXxpPDw4KSYxNjcxMTkzNSxpPShpfGk8PDQpJjI1MjY0NTEzNSxpPShpfGk8PDIpJjg1ODk5MzQ1OSxpPShpfGk8PDEpJjE0MzE2NTU3NjUsdD0odHx0PDw4KSYxNjcxMTkzNSx0PSh0fHQ8PDQpJjI1MjY0NTEzNSx0PSh0fHQ8PDIpJjg1ODk5MzQ1OSx0PSh0fHQ8PDEpJjE0MzE2NTU3NjUsaXx0PDwxfWZ1bmN0aW9uIFVEKGkpe2xldCB0PWksZT1pO2RvKHQueDxlLnh8fHQueD09PWUueCYmdC55PGUueSkmJihlPXQpLHQ9dC5uZXh0O3doaWxlKHQhPT1pKTtyZXR1cm4gZX1mdW5jdGlvbiBHbyhpLHQsZSxuLHIscyxvLGEpe3JldHVybihyLW8pKih0LWEpPj0oaS1vKSoocy1hKSYmKGktbykqKG4tYSk+PShlLW8pKih0LWEpJiYoZS1vKSoocy1hKT49KHItbykqKG4tYSl9ZnVuY3Rpb24gTkQoaSx0KXtyZXR1cm4gaS5uZXh0LmkhPT10LmkmJmkucHJldi5pIT09dC5pJiYhRkQoaSx0KSYmKHdsKGksdCkmJndsKHQsaSkmJkJEKGksdCkmJihFZShpLnByZXYsaSx0LnByZXYpfHxFZShpLHQucHJldix0KSl8fHJmKGksdCkmJkVlKGkucHJldixpLGkubmV4dCk+MCYmRWUodC5wcmV2LHQsdC5uZXh0KT4wKX1mdW5jdGlvbiBFZShpLHQsZSl7cmV0dXJuKHQueS1pLnkpKihlLngtdC54KS0odC54LWkueCkqKGUueS10LnkpfWZ1bmN0aW9uIHJmKGksdCl7cmV0dXJuIGkueD09PXQueCYmaS55PT09dC55fWZ1bmN0aW9uIFpTKGksdCxlLG4pe2NvbnN0IHI9b2YoRWUoaSx0LGUpKSxzPW9mKEVlKGksdCxuKSksbz1vZihFZShlLG4saSkpLGE9b2YoRWUoZSxuLHQpKTtyZXR1cm4hIShyIT09cyYmbyE9PWF8fHI9PT0wJiZzZihpLGUsdCl8fHM9PT0wJiZzZihpLG4sdCl8fG89PT0wJiZzZihlLGksbil8fGE9PT0wJiZzZihlLHQsbikpfWZ1bmN0aW9uIHNmKGksdCxlKXtyZXR1cm4gdC54PD1NYXRoLm1heChpLngsZS54KSYmdC54Pj1NYXRoLm1pbihpLngsZS54KSYmdC55PD1NYXRoLm1heChpLnksZS55KSYmdC55Pj1NYXRoLm1pbihpLnksZS55KX1mdW5jdGlvbiBvZihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9ZnVuY3Rpb24gRkQoaSx0KXtsZXQgZT1pO2Rve2lmKGUuaSE9PWkuaSYmZS5uZXh0LmkhPT1pLmkmJmUuaSE9PXQuaSYmZS5uZXh0LmkhPT10LmkmJlpTKGUsZS5uZXh0LGksdCkpcmV0dXJuITA7ZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiExfWZ1bmN0aW9uIHdsKGksdCl7cmV0dXJuIEVlKGkucHJldixpLGkubmV4dCk8MD9FZShpLHQsaS5uZXh0KT49MCYmRWUoaSxpLnByZXYsdCk+PTA6RWUoaSx0LGkucHJldik8MHx8RWUoaSxpLm5leHQsdCk8MH1mdW5jdGlvbiBCRChpLHQpe2xldCBlPWksbj0hMTtjb25zdCByPShpLngrdC54KS8yLHM9KGkueSt0LnkpLzI7ZG8gZS55PnMhPWUubmV4dC55PnMmJmUubmV4dC55IT09ZS55JiZyPChlLm5leHQueC1lLngpKihzLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYobj0hbiksZT1lLm5leHQ7d2hpbGUoZSE9PWkpO3JldHVybiBufWZ1bmN0aW9uIEpTKGksdCl7Y29uc3QgZT10ZyhpLmksaS54LGkueSksbj10Zyh0LmksdC54LHQueSkscj1pLm5leHQscz10LnByZXY7cmV0dXJuIGkubmV4dD10LHQucHJldj1pLGUubmV4dD1yLHIucHJldj1lLG4ubmV4dD1lLGUucHJldj1uLHMubmV4dD1uLG4ucHJldj1zLG59ZnVuY3Rpb24galMoaSx0LGUsbil7Y29uc3Qgcj10ZyhpLHQsZSk7cmV0dXJuIG4/KHIubmV4dD1uLm5leHQsci5wcmV2PW4sbi5uZXh0LnByZXY9cixuLm5leHQ9cik6KHIucHJldj1yLHIubmV4dD1yKSxyfWZ1bmN0aW9uIEFsKGkpe2kubmV4dC5wcmV2PWkucHJldixpLnByZXYubmV4dD1pLm5leHQsaS5wcmV2WiYmKGkucHJldloubmV4dFo9aS5uZXh0WiksaS5uZXh0WiYmKGkubmV4dFoucHJldlo9aS5wcmV2Wil9ZnVuY3Rpb24gdGcoaSx0LGUpe3JldHVybntpLHg6dCx5OmUscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIE9EKGksdCxlLG4pe2xldCByPTA7Zm9yKGxldCBzPXQsbz1lLW47czxlO3MrPW4pcis9KGlbb10taVtzXSkqKGlbcysxXStpW28rMV0pLG89cztyZXR1cm4gcn1mdW5jdGlvbiBLUyhpKXtjb25zdCB0PVtdLGU9W10sbj1pWzBdWzBdLmxlbmd0aDtsZXQgcj0wLHM9MDtmb3IoY29uc3QgbyBvZiBpKXtmb3IoY29uc3QgYSBvZiBvKWZvcihsZXQgbD0wO2w8bjtsKyspdC5wdXNoKGFbbF0pO3MmJihyKz1zLGUucHVzaChyKSkscz1vLmxlbmd0aH1yZXR1cm57dmVydGljZXM6dCxob2xlczplLGRpbWVuc2lvbnM6bn19dmFyIGFmPXR5cGVvZiBnbG9iYWxUaGlzIT0idW5kZWZpbmVkIj9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT0idW5kZWZpbmVkIj9nbG9iYWw6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6e307ZnVuY3Rpb24gekQoaSl7cmV0dXJuIGkmJmkuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksImRlZmF1bHQiKT9pLmRlZmF1bHQ6aX1mdW5jdGlvbiBrRChpKXtpZihpLl9fZXNNb2R1bGUpcmV0dXJuIGk7dmFyIHQ9aS5kZWZhdWx0O2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXt2YXIgZT1mdW5jdGlvbiBuKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuP1JlZmxlY3QuY29uc3RydWN0KHQsYXJndW1lbnRzLHRoaXMuY29uc3RydWN0b3IpOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtlLnByb3RvdHlwZT10LnByb3RvdHlwZX1lbHNlIGU9e307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHIuZ2V0P3I6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGlbbl19fSl9KSxlfXZhciBRUz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHRNPWZ1bmN0aW9uKHQpe3ZhciBlPVFTLmNhbGwodCksbj1lPT09IltvYmplY3QgQXJndW1lbnRzXSI7cmV0dXJuIG58fChuPWUhPT0iW29iamVjdCBBcnJheV0iJiZ0IT09bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QiJiZ0eXBlb2YgdC5sZW5ndGg9PSJudW1iZXIiJiZ0Lmxlbmd0aD49MCYmUVMuY2FsbCh0LmNhbGxlZSk9PT0iW29iamVjdCBGdW5jdGlvbl0iKSxufSxlZyxlTTtmdW5jdGlvbiBWRCgpe2lmKGVNKXJldHVybiBlZztlTT0xO3ZhciBpO2lmKCFPYmplY3Qua2V5cyl7dmFyIHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbj10TSxyPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUscz0hci5jYWxsKHt0b1N0cmluZzpudWxsfSwidG9TdHJpbmciKSxvPXIuY2FsbChmdW5jdGlvbigpe30sInByb3RvdHlwZSIpLGE9WyJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiY29uc3RydWN0b3IiXSxsPWZ1bmN0aW9uKGYpe3ZhciBkPWYuY29uc3RydWN0b3I7cmV0dXJuIGQmJmQucHJvdG90eXBlPT09Zn0sYz17JGFwcGxpY2F0aW9uQ2FjaGU6ITAsJGNvbnNvbGU6ITAsJGV4dGVybmFsOiEwLCRmcmFtZTohMCwkZnJhbWVFbGVtZW50OiEwLCRmcmFtZXM6ITAsJGlubmVySGVpZ2h0OiEwLCRpbm5lcldpZHRoOiEwLCRvbm1vemZ1bGxzY3JlZW5jaGFuZ2U6ITAsJG9ubW96ZnVsbHNjcmVlbmVycm9yOiEwLCRvdXRlckhlaWdodDohMCwkb3V0ZXJXaWR0aDohMCwkcGFnZVhPZmZzZXQ6ITAsJHBhZ2VZT2Zmc2V0OiEwLCRwYXJlbnQ6ITAsJHNjcm9sbExlZnQ6ITAsJHNjcm9sbFRvcDohMCwkc2Nyb2xsWDohMCwkc2Nyb2xsWTohMCwkc2VsZjohMCwkd2Via2l0SW5kZXhlZERCOiEwLCR3ZWJraXRTdG9yYWdlSW5mbzohMCwkd2luZG93OiEwfSx1PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHdpbmRvdz09InVuZGVmaW5lZCIpcmV0dXJuITE7Zm9yKHZhciBmIGluIHdpbmRvdyl0cnl7aWYoIWNbIiQiK2ZdJiZ0LmNhbGwod2luZG93LGYpJiZ3aW5kb3dbZl0hPT1udWxsJiZ0eXBlb2Ygd2luZG93W2ZdPT0ib2JqZWN0Iil0cnl7bCh3aW5kb3dbZl0pfWNhdGNoKGQpe3JldHVybiEwfX1jYXRjaChkKXtyZXR1cm4hMH1yZXR1cm4hMX0oKSxoPWZ1bmN0aW9uKGYpe2lmKHR5cGVvZiB3aW5kb3c9PSJ1bmRlZmluZWQifHwhdSlyZXR1cm4gbChmKTt0cnl7cmV0dXJuIGwoZil9Y2F0Y2goZCl7cmV0dXJuITF9fTtpPWZ1bmN0aW9uKGQpe3ZhciBwPWQhPT1udWxsJiZ0eXBlb2YgZD09Im9iamVjdCIseT1lLmNhbGwoZCk9PT0iW29iamVjdCBGdW5jdGlvbl0iLGc9bihkKSxtPXAmJmUuY2FsbChkKT09PSJbb2JqZWN0IFN0cmluZ10iLHY9W107aWYoIXAmJiF5JiYhZyl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Iik7dmFyIHg9byYmeTtpZihtJiZkLmxlbmd0aD4wJiYhdC5jYWxsKGQsMCkpZm9yKHZhciBfPTA7XzxkLmxlbmd0aDsrK18pdi5wdXNoKFN0cmluZyhfKSk7aWYoZyYmZC5sZW5ndGg+MClmb3IodmFyIE09MDtNPGQubGVuZ3RoOysrTSl2LnB1c2goU3RyaW5nKE0pKTtlbHNlIGZvcih2YXIgYiBpbiBkKSEoeCYmYj09PSJwcm90b3R5cGUiKSYmdC5jYWxsKGQsYikmJnYucHVzaChTdHJpbmcoYikpO2lmKHMpZm9yKHZhciBBPWgoZCksRT0wO0U8YS5sZW5ndGg7KytFKSEoQSYmYVtFXT09PSJjb25zdHJ1Y3RvciIpJiZ0LmNhbGwoZCxhW0VdKSYmdi5wdXNoKGFbRV0pO3JldHVybiB2fX1yZXR1cm4gZWc9aSxlZ312YXIgR0Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLEhEPXRNLG5NPU9iamVjdC5rZXlzLGxmPW5NP2Z1bmN0aW9uKHQpe3JldHVybiBuTSh0KX06VkQoKSxpTT1PYmplY3Qua2V5cztsZi5zaGltPWZ1bmN0aW9uKCl7aWYoT2JqZWN0LmtleXMpe3ZhciB0PWZ1bmN0aW9uKCl7dmFyIGU9T2JqZWN0LmtleXMoYXJndW1lbnRzKTtyZXR1cm4gZSYmZS5sZW5ndGg9PT1hcmd1bWVudHMubGVuZ3RofSgxLDIpO3R8fChPYmplY3Qua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gSEQobik/aU0oR0QuY2FsbChuKSk6aU0obil9KX1lbHNlIE9iamVjdC5rZXlzPWxmO3JldHVybiBPYmplY3Qua2V5c3x8bGZ9O3ZhciBuZz1sZixXRD1FcnJvciwkRD1FdmFsRXJyb3IsWEQ9UmFuZ2VFcnJvcixxRD1SZWZlcmVuY2VFcnJvcixyTT1TeW50YXhFcnJvcixCcj1UeXBlRXJyb3IsWUQ9VVJJRXJyb3IsY2Y9ZnVuY3Rpb24oKXtpZih0eXBlb2YgU3ltYm9sIT0iZnVuY3Rpb24ifHx0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyE9ImZ1bmN0aW9uIilyZXR1cm4hMTtpZih0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT0ic3ltYm9sIilyZXR1cm4hMDt2YXIgdD17fSxlPVN5bWJvbCgidGVzdCIpLG49T2JqZWN0KGUpO2lmKHR5cGVvZiBlPT0ic3RyaW5nInx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpIT09IltvYmplY3QgU3ltYm9sXSJ8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKSE9PSJbb2JqZWN0IFN5bWJvbF0iKXJldHVybiExO3ZhciByPTQyO3RbZV09cjtmb3IoZSBpbiB0KXJldHVybiExO2lmKHR5cGVvZiBPYmplY3Qua2V5cz09ImZ1bmN0aW9uIiYmT2JqZWN0LmtleXModCkubGVuZ3RoIT09MHx8dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzPT0iZnVuY3Rpb24iJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5sZW5ndGghPT0wKXJldHVybiExO3ZhciBzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7aWYocy5sZW5ndGghPT0xfHxzWzBdIT09ZXx8IU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGUpKXJldHVybiExO2lmKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPT0iZnVuY3Rpb24iKXt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSk7aWYoby52YWx1ZSE9PXJ8fG8uZW51bWVyYWJsZSE9PSEwKXJldHVybiExfXJldHVybiEwfSxzTT10eXBlb2YgU3ltYm9sIT0idW5kZWZpbmVkIiYmU3ltYm9sLFpEPWNmLGlnPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBzTSE9ImZ1bmN0aW9uInx8dHlwZW9mIFN5bWJvbCE9ImZ1bmN0aW9uInx8dHlwZW9mIHNNKCJmb28iKSE9InN5bWJvbCJ8fHR5cGVvZiBTeW1ib2woImJhciIpIT0ic3ltYm9sIj8hMTpaRCgpfSxyZz17X19wcm90b19fOm51bGwsZm9vOnt9fSxKRD1PYmplY3QsakQ9ZnVuY3Rpb24oKXtyZXR1cm57X19wcm90b19fOnJnfS5mb289PT1yZy5mb28mJiEocmcgaW5zdGFuY2VvZiBKRCl9LEtEPSJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICIsUUQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx0VT1NYXRoLm1heCxlVT0iW29iamVjdCBGdW5jdGlvbl0iLG9NPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9MDtyPHQubGVuZ3RoO3IrPTEpbltyXT10W3JdO2Zvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cys9MSluW3MrdC5sZW5ndGhdPWVbc107cmV0dXJuIG59LG5VPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9ZSxzPTA7cjx0Lmxlbmd0aDtyKz0xLHMrPTEpbltzXT10W3JdO3JldHVybiBufSxpVT1mdW5jdGlvbihpLHQpe2Zvcih2YXIgZT0iIixuPTA7bjxpLmxlbmd0aDtuKz0xKWUrPWlbbl0sbisxPGkubGVuZ3RoJiYoZSs9dCk7cmV0dXJuIGV9LHJVPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiJ8fFFELmFwcGx5KGUpIT09ZVUpdGhyb3cgbmV3IFR5cGVFcnJvcihLRCtlKTtmb3IodmFyIG49blUoYXJndW1lbnRzLDEpLHIscz1mdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiByKXt2YXIgdT1lLmFwcGx5KHRoaXMsb00obixhcmd1bWVudHMpKTtyZXR1cm4gT2JqZWN0KHUpPT09dT91OnRoaXN9cmV0dXJuIGUuYXBwbHkodCxvTShuLGFyZ3VtZW50cykpfSxvPXRVKDAsZS5sZW5ndGgtbi5sZW5ndGgpLGE9W10sbD0wO2w8bztsKyspYVtsXT0iJCIrbDtpZihyPUZ1bmN0aW9uKCJiaW5kZXIiLCJyZXR1cm4gZnVuY3Rpb24gKCIraVUoYSwiLCIpKyIpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfSIpKHMpLGUucHJvdG90eXBlKXt2YXIgYz1mdW5jdGlvbigpe307Yy5wcm90b3R5cGU9ZS5wcm90b3R5cGUsci5wcm90b3R5cGU9bmV3IGMsYy5wcm90b3R5cGU9bnVsbH1yZXR1cm4gcn0sc1U9clUsc2c9RnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fHNVLG9VPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLGFVPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksbFU9c2csYU09bFUuY2FsbChvVSxhVSksaWUsY1U9V0QsdVU9JEQsaFU9WEQsZlU9cUQsSG89ck0sV289QnIsZFU9WUQsbE09RnVuY3Rpb24sb2c9ZnVuY3Rpb24oaSl7dHJ5e3JldHVybiBsTSgnInVzZSBzdHJpY3QiOyByZXR1cm4gKCcraSsiKS5jb25zdHJ1Y3RvcjsiKSgpfWNhdGNoKHQpe319LE5zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7aWYoTnMpdHJ5e05zKHt9LCIiKX1jYXRjaChpKXtOcz1udWxsfXZhciBhZz1mdW5jdGlvbigpe3Rocm93IG5ldyBXb30scFU9TnM/ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGFyZ3VtZW50cy5jYWxsZWUsYWd9Y2F0Y2goaSl7dHJ5e3JldHVybiBOcyhhcmd1bWVudHMsImNhbGxlZSIpLmdldH1jYXRjaCh0KXtyZXR1cm4gYWd9fX0oKTphZywkbz1pZygpLG1VPWpEKCksJGU9T2JqZWN0LmdldFByb3RvdHlwZU9mfHwobVU/ZnVuY3Rpb24oaSl7cmV0dXJuIGkuX19wcm90b19ffTpudWxsKSxYbz17fSxnVT10eXBlb2YgVWludDhBcnJheT09InVuZGVmaW5lZCJ8fCEkZT9pZTokZShVaW50OEFycmF5KSxGcz17X19wcm90b19fOm51bGwsIiVBZ2dyZWdhdGVFcnJvciUiOnR5cGVvZiBBZ2dyZWdhdGVFcnJvcj09InVuZGVmaW5lZCI/aWU6QWdncmVnYXRlRXJyb3IsIiVBcnJheSUiOkFycmF5LCIlQXJyYXlCdWZmZXIlIjp0eXBlb2YgQXJyYXlCdWZmZXI9PSJ1bmRlZmluZWQiP2llOkFycmF5QnVmZmVyLCIlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUiOiRvJiYkZT8kZShbXVtTeW1ib2wuaXRlcmF0b3JdKCkpOmllLCIlQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSI6aWUsIiVBc3luY0Z1bmN0aW9uJSI6WG8sIiVBc3luY0dlbmVyYXRvciUiOlhvLCIlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUiOlhvLCIlQXN5bmNJdGVyYXRvclByb3RvdHlwZSUiOlhvLCIlQXRvbWljcyUiOnR5cGVvZiBBdG9taWNzPT0idW5kZWZpbmVkIj9pZTpBdG9taWNzLCIlQmlnSW50JSI6dHlwZW9mIEJpZ0ludD09InVuZGVmaW5lZCI/aWU6QmlnSW50LCIlQmlnSW50NjRBcnJheSUiOnR5cGVvZiBCaWdJbnQ2NEFycmF5PT0idW5kZWZpbmVkIj9pZTpCaWdJbnQ2NEFycmF5LCIlQmlnVWludDY0QXJyYXklIjp0eXBlb2YgQmlnVWludDY0QXJyYXk9PSJ1bmRlZmluZWQiP2llOkJpZ1VpbnQ2NEFycmF5LCIlQm9vbGVhbiUiOkJvb2xlYW4sIiVEYXRhVmlldyUiOnR5cGVvZiBEYXRhVmlldz09InVuZGVmaW5lZCI/aWU6RGF0YVZpZXcsIiVEYXRlJSI6RGF0ZSwiJWRlY29kZVVSSSUiOmRlY29kZVVSSSwiJWRlY29kZVVSSUNvbXBvbmVudCUiOmRlY29kZVVSSUNvbXBvbmVudCwiJWVuY29kZVVSSSUiOmVuY29kZVVSSSwiJWVuY29kZVVSSUNvbXBvbmVudCUiOmVuY29kZVVSSUNvbXBvbmVudCwiJUVycm9yJSI6Y1UsIiVldmFsJSI6ZXZhbCwiJUV2YWxFcnJvciUiOnVVLCIlRmxvYXQzMkFycmF5JSI6dHlwZW9mIEZsb2F0MzJBcnJheT09InVuZGVmaW5lZCI/aWU6RmxvYXQzMkFycmF5LCIlRmxvYXQ2NEFycmF5JSI6dHlwZW9mIEZsb2F0NjRBcnJheT09InVuZGVmaW5lZCI/aWU6RmxvYXQ2NEFycmF5LCIlRmluYWxpemF0aW9uUmVnaXN0cnklIjp0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk9PSJ1bmRlZmluZWQiP2llOkZpbmFsaXphdGlvblJlZ2lzdHJ5LCIlRnVuY3Rpb24lIjpsTSwiJUdlbmVyYXRvckZ1bmN0aW9uJSI6WG8sIiVJbnQ4QXJyYXklIjp0eXBlb2YgSW50OEFycmF5PT0idW5kZWZpbmVkIj9pZTpJbnQ4QXJyYXksIiVJbnQxNkFycmF5JSI6dHlwZW9mIEludDE2QXJyYXk9PSJ1bmRlZmluZWQiP2llOkludDE2QXJyYXksIiVJbnQzMkFycmF5JSI6dHlwZW9mIEludDMyQXJyYXk9PSJ1bmRlZmluZWQiP2llOkludDMyQXJyYXksIiVpc0Zpbml0ZSUiOmlzRmluaXRlLCIlaXNOYU4lIjppc05hTiwiJUl0ZXJhdG9yUHJvdG90eXBlJSI6JG8mJiRlPyRlKCRlKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpOmllLCIlSlNPTiUiOnR5cGVvZiBKU09OPT0ib2JqZWN0Ij9KU09OOmllLCIlTWFwJSI6dHlwZW9mIE1hcD09InVuZGVmaW5lZCI/aWU6TWFwLCIlTWFwSXRlcmF0b3JQcm90b3R5cGUlIjp0eXBlb2YgTWFwPT0idW5kZWZpbmVkInx8ISRvfHwhJGU/aWU6JGUobmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksIiVNYXRoJSI6TWF0aCwiJU51bWJlciUiOk51bWJlciwiJU9iamVjdCUiOk9iamVjdCwiJXBhcnNlRmxvYXQlIjpwYXJzZUZsb2F0LCIlcGFyc2VJbnQlIjpwYXJzZUludCwiJVByb21pc2UlIjp0eXBlb2YgUHJvbWlzZT09InVuZGVmaW5lZCI/aWU6UHJvbWlzZSwiJVByb3h5JSI6dHlwZW9mIFByb3h5PT0idW5kZWZpbmVkIj9pZTpQcm94eSwiJVJhbmdlRXJyb3IlIjpoVSwiJVJlZmVyZW5jZUVycm9yJSI6ZlUsIiVSZWZsZWN0JSI6dHlwZW9mIFJlZmxlY3Q9PSJ1bmRlZmluZWQiP2llOlJlZmxlY3QsIiVSZWdFeHAlIjpSZWdFeHAsIiVTZXQlIjp0eXBlb2YgU2V0PT0idW5kZWZpbmVkIj9pZTpTZXQsIiVTZXRJdGVyYXRvclByb3RvdHlwZSUiOnR5cGVvZiBTZXQ9PSJ1bmRlZmluZWQifHwhJG98fCEkZT9pZTokZShuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSwiJVNoYXJlZEFycmF5QnVmZmVyJSI6dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPT0idW5kZWZpbmVkIj9pZTpTaGFyZWRBcnJheUJ1ZmZlciwiJVN0cmluZyUiOlN0cmluZywiJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSI6JG8mJiRlPyRlKCIiW1N5bWJvbC5pdGVyYXRvcl0oKSk6aWUsIiVTeW1ib2wlIjokbz9TeW1ib2w6aWUsIiVTeW50YXhFcnJvciUiOkhvLCIlVGhyb3dUeXBlRXJyb3IlIjpwVSwiJVR5cGVkQXJyYXklIjpnVSwiJVR5cGVFcnJvciUiOldvLCIlVWludDhBcnJheSUiOnR5cGVvZiBVaW50OEFycmF5PT0idW5kZWZpbmVkIj9pZTpVaW50OEFycmF5LCIlVWludDhDbGFtcGVkQXJyYXklIjp0eXBlb2YgVWludDhDbGFtcGVkQXJyYXk9PSJ1bmRlZmluZWQiP2llOlVpbnQ4Q2xhbXBlZEFycmF5LCIlVWludDE2QXJyYXklIjp0eXBlb2YgVWludDE2QXJyYXk9PSJ1bmRlZmluZWQiP2llOlVpbnQxNkFycmF5LCIlVWludDMyQXJyYXklIjp0eXBlb2YgVWludDMyQXJyYXk9PSJ1bmRlZmluZWQiP2llOlVpbnQzMkFycmF5LCIlVVJJRXJyb3IlIjpkVSwiJVdlYWtNYXAlIjp0eXBlb2YgV2Vha01hcD09InVuZGVmaW5lZCI/aWU6V2Vha01hcCwiJVdlYWtSZWYlIjp0eXBlb2YgV2Vha1JlZj09InVuZGVmaW5lZCI/aWU6V2Vha1JlZiwiJVdlYWtTZXQlIjp0eXBlb2YgV2Vha1NldD09InVuZGVmaW5lZCI/aWU6V2Vha1NldH07aWYoJGUpdHJ5e251bGwuZXJyb3J9Y2F0Y2goaSl7dmFyIHlVPSRlKCRlKGkpKTtGc1siJUVycm9yLnByb3RvdHlwZSUiXT15VX12YXIgX1U9ZnVuY3Rpb24gaSh0KXt2YXIgZTtpZih0PT09IiVBc3luY0Z1bmN0aW9uJSIpZT1vZygiYXN5bmMgZnVuY3Rpb24gKCkge30iKTtlbHNlIGlmKHQ9PT0iJUdlbmVyYXRvckZ1bmN0aW9uJSIpZT1vZygiZnVuY3Rpb24qICgpIHt9Iik7ZWxzZSBpZih0PT09IiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSIpZT1vZygiYXN5bmMgZnVuY3Rpb24qICgpIHt9Iik7ZWxzZSBpZih0PT09IiVBc3luY0dlbmVyYXRvciUiKXt2YXIgbj1pKCIlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUiKTtuJiYoZT1uLnByb3RvdHlwZSl9ZWxzZSBpZih0PT09IiVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSIpe3ZhciByPWkoIiVBc3luY0dlbmVyYXRvciUiKTtyJiYkZSYmKGU9JGUoci5wcm90b3R5cGUpKX1yZXR1cm4gRnNbdF09ZSxlfSxjTT17X19wcm90b19fOm51bGwsIiVBcnJheUJ1ZmZlclByb3RvdHlwZSUiOlsiQXJyYXlCdWZmZXIiLCJwcm90b3R5cGUiXSwiJUFycmF5UHJvdG90eXBlJSI6WyJBcnJheSIsInByb3RvdHlwZSJdLCIlQXJyYXlQcm90b19lbnRyaWVzJSI6WyJBcnJheSIsInByb3RvdHlwZSIsImVudHJpZXMiXSwiJUFycmF5UHJvdG9fZm9yRWFjaCUiOlsiQXJyYXkiLCJwcm90b3R5cGUiLCJmb3JFYWNoIl0sIiVBcnJheVByb3RvX2tleXMlIjpbIkFycmF5IiwicHJvdG90eXBlIiwia2V5cyJdLCIlQXJyYXlQcm90b192YWx1ZXMlIjpbIkFycmF5IiwicHJvdG90eXBlIiwidmFsdWVzIl0sIiVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSI6WyJBc3luY0Z1bmN0aW9uIiwicHJvdG90eXBlIl0sIiVBc3luY0dlbmVyYXRvciUiOlsiQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiIsInByb3RvdHlwZSJdLCIlQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlIjpbIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJwcm90b3R5cGUiXSwiJUJvb2xlYW5Qcm90b3R5cGUlIjpbIkJvb2xlYW4iLCJwcm90b3R5cGUiXSwiJURhdGFWaWV3UHJvdG90eXBlJSI6WyJEYXRhVmlldyIsInByb3RvdHlwZSJdLCIlRGF0ZVByb3RvdHlwZSUiOlsiRGF0ZSIsInByb3RvdHlwZSJdLCIlRXJyb3JQcm90b3R5cGUlIjpbIkVycm9yIiwicHJvdG90eXBlIl0sIiVFdmFsRXJyb3JQcm90b3R5cGUlIjpbIkV2YWxFcnJvciIsInByb3RvdHlwZSJdLCIlRmxvYXQzMkFycmF5UHJvdG90eXBlJSI6WyJGbG9hdDMyQXJyYXkiLCJwcm90b3R5cGUiXSwiJUZsb2F0NjRBcnJheVByb3RvdHlwZSUiOlsiRmxvYXQ2NEFycmF5IiwicHJvdG90eXBlIl0sIiVGdW5jdGlvblByb3RvdHlwZSUiOlsiRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUdlbmVyYXRvciUiOlsiR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUdlbmVyYXRvclByb3RvdHlwZSUiOlsiR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJwcm90b3R5cGUiXSwiJUludDhBcnJheVByb3RvdHlwZSUiOlsiSW50OEFycmF5IiwicHJvdG90eXBlIl0sIiVJbnQxNkFycmF5UHJvdG90eXBlJSI6WyJJbnQxNkFycmF5IiwicHJvdG90eXBlIl0sIiVJbnQzMkFycmF5UHJvdG90eXBlJSI6WyJJbnQzMkFycmF5IiwicHJvdG90eXBlIl0sIiVKU09OUGFyc2UlIjpbIkpTT04iLCJwYXJzZSJdLCIlSlNPTlN0cmluZ2lmeSUiOlsiSlNPTiIsInN0cmluZ2lmeSJdLCIlTWFwUHJvdG90eXBlJSI6WyJNYXAiLCJwcm90b3R5cGUiXSwiJU51bWJlclByb3RvdHlwZSUiOlsiTnVtYmVyIiwicHJvdG90eXBlIl0sIiVPYmplY3RQcm90b3R5cGUlIjpbIk9iamVjdCIsInByb3RvdHlwZSJdLCIlT2JqUHJvdG9fdG9TdHJpbmclIjpbIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIl0sIiVPYmpQcm90b192YWx1ZU9mJSI6WyJPYmplY3QiLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIl0sIiVQcm9taXNlUHJvdG90eXBlJSI6WyJQcm9taXNlIiwicHJvdG90eXBlIl0sIiVQcm9taXNlUHJvdG9fdGhlbiUiOlsiUHJvbWlzZSIsInByb3RvdHlwZSIsInRoZW4iXSwiJVByb21pc2VfYWxsJSI6WyJQcm9taXNlIiwiYWxsIl0sIiVQcm9taXNlX3JlamVjdCUiOlsiUHJvbWlzZSIsInJlamVjdCJdLCIlUHJvbWlzZV9yZXNvbHZlJSI6WyJQcm9taXNlIiwicmVzb2x2ZSJdLCIlUmFuZ2VFcnJvclByb3RvdHlwZSUiOlsiUmFuZ2VFcnJvciIsInByb3RvdHlwZSJdLCIlUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlIjpbIlJlZmVyZW5jZUVycm9yIiwicHJvdG90eXBlIl0sIiVSZWdFeHBQcm90b3R5cGUlIjpbIlJlZ0V4cCIsInByb3RvdHlwZSJdLCIlU2V0UHJvdG90eXBlJSI6WyJTZXQiLCJwcm90b3R5cGUiXSwiJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSI6WyJTaGFyZWRBcnJheUJ1ZmZlciIsInByb3RvdHlwZSJdLCIlU3RyaW5nUHJvdG90eXBlJSI6WyJTdHJpbmciLCJwcm90b3R5cGUiXSwiJVN5bWJvbFByb3RvdHlwZSUiOlsiU3ltYm9sIiwicHJvdG90eXBlIl0sIiVTeW50YXhFcnJvclByb3RvdHlwZSUiOlsiU3ludGF4RXJyb3IiLCJwcm90b3R5cGUiXSwiJVR5cGVkQXJyYXlQcm90b3R5cGUlIjpbIlR5cGVkQXJyYXkiLCJwcm90b3R5cGUiXSwiJVR5cGVFcnJvclByb3RvdHlwZSUiOlsiVHlwZUVycm9yIiwicHJvdG90eXBlIl0sIiVVaW50OEFycmF5UHJvdG90eXBlJSI6WyJVaW50OEFycmF5IiwicHJvdG90eXBlIl0sIiVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUiOlsiVWludDhDbGFtcGVkQXJyYXkiLCJwcm90b3R5cGUiXSwiJVVpbnQxNkFycmF5UHJvdG90eXBlJSI6WyJVaW50MTZBcnJheSIsInByb3RvdHlwZSJdLCIlVWludDMyQXJyYXlQcm90b3R5cGUlIjpbIlVpbnQzMkFycmF5IiwicHJvdG90eXBlIl0sIiVVUklFcnJvclByb3RvdHlwZSUiOlsiVVJJRXJyb3IiLCJwcm90b3R5cGUiXSwiJVdlYWtNYXBQcm90b3R5cGUlIjpbIldlYWtNYXAiLCJwcm90b3R5cGUiXSwiJVdlYWtTZXRQcm90b3R5cGUlIjpbIldlYWtTZXQiLCJwcm90b3R5cGUiXX0sRWw9c2csdWY9YU0seFU9RWwuY2FsbChGdW5jdGlvbi5jYWxsLEFycmF5LnByb3RvdHlwZS5jb25jYXQpLHZVPUVsLmNhbGwoRnVuY3Rpb24uYXBwbHksQXJyYXkucHJvdG90eXBlLnNwbGljZSksdU09RWwuY2FsbChGdW5jdGlvbi5jYWxsLFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSksaGY9RWwuY2FsbChGdW5jdGlvbi5jYWxsLFN0cmluZy5wcm90b3R5cGUuc2xpY2UpLFNVPUVsLmNhbGwoRnVuY3Rpb24uY2FsbCxSZWdFeHAucHJvdG90eXBlLmV4ZWMpLE1VPS9bXiUuW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwlJCkpL2csYlU9L1xcKFxcKT8vZyx3VT1mdW5jdGlvbih0KXt2YXIgZT1oZih0LDAsMSksbj1oZih0LC0xKTtpZihlPT09IiUiJiZuIT09IiUiKXRocm93IG5ldyBIbygiaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCIpO2lmKG49PT0iJSImJmUhPT0iJSIpdGhyb3cgbmV3IEhvKCJpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIG9wZW5pbmcgYCVgIik7dmFyIHI9W107cmV0dXJuIHVNKHQsTVUsZnVuY3Rpb24ocyxvLGEsbCl7cltyLmxlbmd0aF09YT91TShsLGJVLCIkMSIpOm98fHN9KSxyfSxBVT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscjtpZih1ZihjTSxuKSYmKHI9Y01bbl0sbj0iJSIrclswXSsiJSIpLHVmKEZzLG4pKXt2YXIgcz1Gc1tuXTtpZihzPT09WG8mJihzPV9VKG4pKSx0eXBlb2Ygcz09InVuZGVmaW5lZCImJiFlKXRocm93IG5ldyBXbygiaW50cmluc2ljICIrdCsiIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlISIpO3JldHVybnthbGlhczpyLG5hbWU6bix2YWx1ZTpzfX10aHJvdyBuZXcgSG8oImludHJpbnNpYyAiK3QrIiBkb2VzIG5vdCBleGlzdCEiKX0sSWk9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgdCE9InN0cmluZyJ8fHQubGVuZ3RoPT09MCl0aHJvdyBuZXcgV28oImludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7aWYoYXJndW1lbnRzLmxlbmd0aD4xJiZ0eXBlb2YgZSE9ImJvb2xlYW4iKXRocm93IG5ldyBXbygnImFsbG93TWlzc2luZyIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtpZihTVSgvXiU/W14lXSolPyQvLHQpPT09bnVsbCl0aHJvdyBuZXcgSG8oImAlYCBtYXkgbm90IGJlIHByZXNlbnQgYW55d2hlcmUgYnV0IGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgaW50cmluc2ljIG5hbWUiKTt2YXIgbj13VSh0KSxyPW4ubGVuZ3RoPjA/blswXToiIixzPUFVKCIlIityKyIlIixlKSxvPXMubmFtZSxhPXMudmFsdWUsbD0hMSxjPXMuYWxpYXM7YyYmKHI9Y1swXSx2VShuLHhVKFswLDFdLGMpKSk7Zm9yKHZhciB1PTEsaD0hMDt1PG4ubGVuZ3RoO3UrPTEpe3ZhciBmPW5bdV0sZD1oZihmLDAsMSkscD1oZihmLC0xKTtpZigoZD09PSciJ3x8ZD09PSInInx8ZD09PSJgInx8cD09PSciJ3x8cD09PSInInx8cD09PSJgIikmJmQhPT1wKXRocm93IG5ldyBIbygicHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcyIpO2lmKChmPT09ImNvbnN0cnVjdG9yInx8IWgpJiYobD0hMCkscis9Ii4iK2Ysbz0iJSIrcisiJSIsdWYoRnMsbykpYT1Gc1tvXTtlbHNlIGlmKGEhPW51bGwpe2lmKCEoZiBpbiBhKSl7aWYoIWUpdGhyb3cgbmV3IFdvKCJiYXNlIGludHJpbnNpYyBmb3IgIit0KyIgZXhpc3RzLCBidXQgdGhlIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuIik7cmV0dXJufWlmKE5zJiZ1KzE+PW4ubGVuZ3RoKXt2YXIgeT1OcyhhLGYpO2g9ISF5LGgmJiJnZXQiaW4geSYmISgib3JpZ2luYWxWYWx1ZSJpbiB5LmdldCk/YT15LmdldDphPWFbZl19ZWxzZSBoPXVmKGEsZiksYT1hW2ZdO2gmJiFsJiYoRnNbb109YSl9fXJldHVybiBhfSxFVT1JaSxmZj1FVSgiJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUiLCEwKXx8ITE7aWYoZmYpdHJ5e2ZmKHt9LCJhIix7dmFsdWU6MX0pfWNhdGNoKGkpe2ZmPSExfXZhciBsZz1mZixUVT1JaSxkZj1UVSgiJU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IlIiwhMCk7aWYoZGYpdHJ5e2RmKFtdLCJsZW5ndGgiKX1jYXRjaChpKXtkZj1udWxsfXZhciBjZz1kZixoTT1sZyxDVT1yTSxxbz1CcixmTT1jZyx1Zz1mdW5jdGlvbih0LGUsbil7aWYoIXR8fHR5cGVvZiB0IT0ib2JqZWN0IiYmdHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHFvKCJgb2JqYCBtdXN0IGJlIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uYCIpO2lmKHR5cGVvZiBlIT0ic3RyaW5nIiYmdHlwZW9mIGUhPSJzeW1ib2wiKXRocm93IG5ldyBxbygiYHByb3BlcnR5YCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sYCIpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MyYmdHlwZW9mIGFyZ3VtZW50c1szXSE9ImJvb2xlYW4iJiZhcmd1bWVudHNbM10hPT1udWxsKXRocm93IG5ldyBxbygiYG5vbkVudW1lcmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCIpO2lmKGFyZ3VtZW50cy5sZW5ndGg+NCYmdHlwZW9mIGFyZ3VtZW50c1s0XSE9ImJvb2xlYW4iJiZhcmd1bWVudHNbNF0hPT1udWxsKXRocm93IG5ldyBxbygiYG5vbldyaXRhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwiKTtpZihhcmd1bWVudHMubGVuZ3RoPjUmJnR5cGVvZiBhcmd1bWVudHNbNV0hPSJib29sZWFuIiYmYXJndW1lbnRzWzVdIT09bnVsbCl0aHJvdyBuZXcgcW8oImBub25Db25maWd1cmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCIpO2lmKGFyZ3VtZW50cy5sZW5ndGg+NiYmdHlwZW9mIGFyZ3VtZW50c1s2XSE9ImJvb2xlYW4iKXRocm93IG5ldyBxbygiYGxvb3NlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIik7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTpudWxsLHM9YXJndW1lbnRzLmxlbmd0aD40P2FyZ3VtZW50c1s0XTpudWxsLG89YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTpudWxsLGE9YXJndW1lbnRzLmxlbmd0aD42P2FyZ3VtZW50c1s2XTohMSxsPSEhZk0mJmZNKHQsZSk7aWYoaE0paE0odCxlLHtjb25maWd1cmFibGU6bz09PW51bGwmJmw/bC5jb25maWd1cmFibGU6IW8sZW51bWVyYWJsZTpyPT09bnVsbCYmbD9sLmVudW1lcmFibGU6IXIsdmFsdWU6bix3cml0YWJsZTpzPT09bnVsbCYmbD9sLndyaXRhYmxlOiFzfSk7ZWxzZSBpZihhfHwhciYmIXMmJiFvKXRbZV09bjtlbHNlIHRocm93IG5ldyBDVSgiVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGRlZmluaW5nIGEgcHJvcGVydHkgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tZW51bWVyYWJsZS4iKX0saGc9bGcsZE09ZnVuY3Rpb24oKXtyZXR1cm4hIWhnfTtkTS5oYXNBcnJheUxlbmd0aERlZmluZUJ1Zz1mdW5jdGlvbigpe2lmKCFoZylyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGhnKFtdLCJsZW5ndGgiLHt2YWx1ZToxfSkubGVuZ3RoIT09MX1jYXRjaCh0KXtyZXR1cm4hMH19O3ZhciBmZz1kTSxSVT1uZyxQVT10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sKCJmb28iKT09InN5bWJvbCIsSVU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxMVT1BcnJheS5wcm90b3R5cGUuY29uY2F0LHBNPXVnLERVPWZ1bmN0aW9uKGkpe3JldHVybiB0eXBlb2YgaT09ImZ1bmN0aW9uIiYmSVUuY2FsbChpKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSJ9LG1NPWZnKCksVVU9ZnVuY3Rpb24oaSx0LGUsbil7aWYodCBpbiBpKXtpZihuPT09ITApe2lmKGlbdF09PT1lKXJldHVybn1lbHNlIGlmKCFEVShuKXx8IW4oKSlyZXR1cm59bU0/cE0oaSx0LGUsITApOnBNKGksdCxlKX0sZ009ZnVuY3Rpb24oaSx0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnt9LG49UlUodCk7UFUmJihuPUxVLmNhbGwobixPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpKSk7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKz0xKVVVKGksbltyXSx0W25bcl1dLGVbbltyXV0pfTtnTS5zdXBwb3J0c0Rlc2NyaXB0b3JzPSEhbU07dmFyIEJzPWdNLHlNPXtleHBvcnRzOnt9fSxOVT1JaSxfTT11ZyxGVT1mZygpLHhNPWNnLHZNPUJyLEJVPU5VKCIlTWF0aC5mbG9vciUiKSxPVT1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iKXRocm93IG5ldyB2TSgiYGZuYCBpcyBub3QgYSBmdW5jdGlvbiIpO2lmKHR5cGVvZiBlIT0ibnVtYmVyInx8ZTwwfHxlPjQyOTQ5NjcyOTV8fEJVKGUpIT09ZSl0aHJvdyBuZXcgdk0oImBsZW5ndGhgIG11c3QgYmUgYSBwb3NpdGl2ZSAzMi1iaXQgaW50ZWdlciIpO3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmISFhcmd1bWVudHNbMl0scj0hMCxzPSEwO2lmKCJsZW5ndGgiaW4gdCYmeE0pe3ZhciBvPXhNKHQsImxlbmd0aCIpO28mJiFvLmNvbmZpZ3VyYWJsZSYmKHI9ITEpLG8mJiFvLndyaXRhYmxlJiYocz0hMSl9cmV0dXJuKHJ8fHN8fCFuKSYmKEZVP19NKHQsImxlbmd0aCIsZSwhMCwhMCk6X00odCwibGVuZ3RoIixlKSksdH07KGZ1bmN0aW9uKGkpe3ZhciB0PXNnLGU9SWksbj1PVSxyPUJyLHM9ZSgiJUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSUiKSxvPWUoIiVGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCUiKSxhPWUoIiVSZWZsZWN0LmFwcGx5JSIsITApfHx0LmNhbGwobyxzKSxsPWxnLGM9ZSgiJU1hdGgubWF4JSIpO2kuZXhwb3J0cz1mdW5jdGlvbihmKXtpZih0eXBlb2YgZiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgcigiYSBmdW5jdGlvbiBpcyByZXF1aXJlZCIpO3ZhciBkPWEodCxvLGFyZ3VtZW50cyk7cmV0dXJuIG4oZCwxK2MoMCxmLmxlbmd0aC0oYXJndW1lbnRzLmxlbmd0aC0xKSksITApfTt2YXIgdT1mdW5jdGlvbigpe3JldHVybiBhKHQscyxhcmd1bWVudHMpfTtsP2woaS5leHBvcnRzLCJhcHBseSIse3ZhbHVlOnV9KTppLmV4cG9ydHMuYXBwbHk9dX0pKHlNKTt2YXIgWW89eU0uZXhwb3J0cyxTTT1JaSxNTT1Zbyx6VT1NTShTTSgiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIikpLG5pPWZ1bmN0aW9uKHQsZSl7dmFyIG49U00odCwhIWUpO3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmelUodCwiLnByb3RvdHlwZS4iKT4tMT9NTShuKTpufSxrVT1uZyxiTT1jZigpLHdNPW5pLEFNPU9iamVjdCxWVT13TSgiQXJyYXkucHJvdG90eXBlLnB1c2giKSxFTT13TSgiT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSIpLEdVPWJNP09iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM6bnVsbCxUTT1mdW5jdGlvbih0LGUpe2lmKHQ9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigidGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Iik7dmFyIG49QU0odCk7aWYoYXJndW1lbnRzLmxlbmd0aD09PTEpcmV0dXJuIG47Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoOysrcil7dmFyIHM9QU0oYXJndW1lbnRzW3JdKSxvPWtVKHMpLGE9Yk0mJihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfHxHVSk7aWYoYSlmb3IodmFyIGw9YShzKSxjPTA7YzxsLmxlbmd0aDsrK2Mpe3ZhciB1PWxbY107RU0ocyx1KSYmVlUobyx1KX1mb3IodmFyIGg9MDtoPG8ubGVuZ3RoOysraCl7dmFyIGY9b1toXTtpZihFTShzLGYpKXt2YXIgZD1zW2ZdO25bZl09ZH19fXJldHVybiBufSxkZz1UTSxIVT1mdW5jdGlvbigpe2lmKCFPYmplY3QuYXNzaWduKXJldHVybiExO2Zvcih2YXIgaT0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiLHQ9aS5zcGxpdCgiIiksZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT10W25dO3ZhciByPU9iamVjdC5hc3NpZ24oe30sZSkscz0iIjtmb3IodmFyIG8gaW4gcilzKz1vO3JldHVybiBpIT09c30sV1U9ZnVuY3Rpb24oKXtpZighT2JqZWN0LmFzc2lnbnx8IU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucylyZXR1cm4hMTt2YXIgaT1PYmplY3QucHJldmVudEV4dGVuc2lvbnMoezE6Mn0pO3RyeXtPYmplY3QuYXNzaWduKGksInh5Iil9Y2F0Y2godCl7cmV0dXJuIGlbMV09PT0ieSJ9cmV0dXJuITF9LENNPWZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdC5hc3NpZ258fEhVKCl8fFdVKCk/ZGc6T2JqZWN0LmFzc2lnbn0sJFU9QnMsWFU9Q00scVU9ZnVuY3Rpb24oKXt2YXIgdD1YVSgpO3JldHVybiAkVShPYmplY3Qse2Fzc2lnbjp0fSx7YXNzaWduOmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24hPT10fX0pLHR9LFlVPUJzLFpVPVlvLEpVPVRNLFJNPUNNLGpVPXFVLEtVPVpVLmFwcGx5KFJNKCkpLFBNPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEtVKE9iamVjdCxhcmd1bWVudHMpfTtZVShQTSx7Z2V0UG9seWZpbGw6Uk0saW1wbGVtZW50YXRpb246SlUsc2hpbTpqVX0pO3ZhciBRVT1QTSxUbD1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgZnVuY3Rpb24oKXt9Lm5hbWU9PSJzdHJpbmcifSxDbD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2lmKENsKXRyeXtDbChbXSwibGVuZ3RoIil9Y2F0Y2goaSl7Q2w9bnVsbH1UbC5mdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXM9ZnVuY3Rpb24oKXtpZighVGwoKXx8IUNsKXJldHVybiExO3ZhciB0PUNsKGZ1bmN0aW9uKCl7fSwibmFtZSIpO3JldHVybiEhdCYmISF0LmNvbmZpZ3VyYWJsZX07dmFyIHROPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO1RsLmJvdW5kRnVuY3Rpb25zSGF2ZU5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIFRsKCkmJnR5cGVvZiB0Tj09ImZ1bmN0aW9uIiYmZnVuY3Rpb24oKXt9LmJpbmQoKS5uYW1lIT09IiJ9O3ZhciBlTj1UbCxJTT11ZyxuTj1mZygpLGlOPWVOLmZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcygpLHJOPUJyLHNOPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHJOKCJgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uIik7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiYhIWFyZ3VtZW50c1syXTtyZXR1cm4oIW58fGlOKSYmKG5OP0lNKHQsIm5hbWUiLGUsITAsITApOklNKHQsIm5hbWUiLGUpKSx0fSxvTj1zTixhTj1CcixsTj1PYmplY3QsTE09b04oZnVuY3Rpb24oKXtpZih0aGlzPT1udWxsfHx0aGlzIT09bE4odGhpcykpdGhyb3cgbmV3IGFOKCJSZWdFeHAucHJvdG90eXBlLmZsYWdzIGdldHRlciBjYWxsZWQgb24gbm9uLW9iamVjdCIpO3ZhciB0PSIiO3JldHVybiB0aGlzLmhhc0luZGljZXMmJih0Kz0iZCIpLHRoaXMuZ2xvYmFsJiYodCs9ImciKSx0aGlzLmlnbm9yZUNhc2UmJih0Kz0iaSIpLHRoaXMubXVsdGlsaW5lJiYodCs9Im0iKSx0aGlzLmRvdEFsbCYmKHQrPSJzIiksdGhpcy51bmljb2RlJiYodCs9InUiKSx0aGlzLnVuaWNvZGVTZXRzJiYodCs9InYiKSx0aGlzLnN0aWNreSYmKHQrPSJ5IiksdH0sImdldCBmbGFncyIsITApLGNOPUxNLHVOPUJzLnN1cHBvcnRzRGVzY3JpcHRvcnMsaE49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixETT1mdW5jdGlvbigpe2lmKHVOJiYvYS9taWcuZmxhZ3M9PT0iZ2ltIil7dmFyIHQ9aE4oUmVnRXhwLnByb3RvdHlwZSwiZmxhZ3MiKTtpZih0JiZ0eXBlb2YgdC5nZXQ9PSJmdW5jdGlvbiImJnR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmRvdEFsbD09ImJvb2xlYW4iJiZ0eXBlb2YgUmVnRXhwLnByb3RvdHlwZS5oYXNJbmRpY2VzPT0iYm9vbGVhbiIpe3ZhciBlPSIiLG49e307aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sImhhc0luZGljZXMiLHtnZXQ6ZnVuY3Rpb24oKXtlKz0iZCJ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInN0aWNreSIse2dldDpmdW5jdGlvbigpe2UrPSJ5In19KSxlPT09ImR5IilyZXR1cm4gdC5nZXR9fXJldHVybiBjTn0sZk49QnMuc3VwcG9ydHNEZXNjcmlwdG9ycyxkTj1ETSxwTj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLG1OPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxnTj1UeXBlRXJyb3IsVU09T2JqZWN0LmdldFByb3RvdHlwZU9mLHlOPS9hLyxfTj1mdW5jdGlvbigpe2lmKCFmTnx8IVVNKXRocm93IG5ldyBnTigiUmVnRXhwLnByb3RvdHlwZS5mbGFncyByZXF1aXJlcyBhIHRydWUgRVM1IGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgcHJvcGVydHkgZGVzY3JpcHRvcnMiKTt2YXIgdD1kTigpLGU9VU0oeU4pLG49cE4oZSwiZmxhZ3MiKTtyZXR1cm4oIW58fG4uZ2V0IT09dCkmJm1OKGUsImZsYWdzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0OnR9KSx0fSx4Tj1Ccyx2Tj1ZbyxTTj1MTSxOTT1ETSxNTj1fTixGTT12TihOTSgpKTt4TihGTSx7Z2V0UG9seWZpbGw6Tk0saW1wbGVtZW50YXRpb246U04sc2hpbTpNTn0pO3ZhciBiTj1GTSxwZj17ZXhwb3J0czp7fX0sd049Y2YsT3M9ZnVuY3Rpb24oKXtyZXR1cm4gd04oKSYmISFTeW1ib2wudG9TdHJpbmdUYWd9LEFOPU9zKCksRU49bmkscGc9RU4oIk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmciKSxtZj1mdW5jdGlvbih0KXtyZXR1cm4gQU4mJnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmU3ltYm9sLnRvU3RyaW5nVGFnIGluIHQ/ITE6cGcodCk9PT0iW29iamVjdCBBcmd1bWVudHNdIn0sQk09ZnVuY3Rpb24odCl7cmV0dXJuIG1mKHQpPyEwOnQhPT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCImJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciImJnQubGVuZ3RoPj0wJiZwZyh0KSE9PSJbb2JqZWN0IEFycmF5XSImJnBnKHQuY2FsbGVlKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSJ9LFROPWZ1bmN0aW9uKCl7cmV0dXJuIG1mKGFyZ3VtZW50cyl9KCk7bWYuaXNMZWdhY3lBcmd1bWVudHM9Qk07dmFyIE9NPVROP21mOkJNLENOPXt9LFJOPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRlZmF1bHQ6Q059KSxQTj1rRChSTiksbWc9dHlwZW9mIE1hcD09ImZ1bmN0aW9uIiYmTWFwLnByb3RvdHlwZSxnZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJiZtZz9PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsInNpemUiKTpudWxsLGdmPW1nJiZnZyYmdHlwZW9mIGdnLmdldD09ImZ1bmN0aW9uIj9nZy5nZXQ6bnVsbCx6TT1tZyYmTWFwLnByb3RvdHlwZS5mb3JFYWNoLHlnPXR5cGVvZiBTZXQ9PSJmdW5jdGlvbiImJlNldC5wcm90b3R5cGUsX2c9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciYmeWc/T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTZXQucHJvdG90eXBlLCJzaXplIik6bnVsbCx5Zj15ZyYmX2cmJnR5cGVvZiBfZy5nZXQ9PSJmdW5jdGlvbiI/X2cuZ2V0Om51bGwsa009eWcmJlNldC5wcm90b3R5cGUuZm9yRWFjaCxJTj10eXBlb2YgV2Vha01hcD09ImZ1bmN0aW9uIiYmV2Vha01hcC5wcm90b3R5cGUsUmw9SU4/V2Vha01hcC5wcm90b3R5cGUuaGFzOm51bGwsTE49dHlwZW9mIFdlYWtTZXQ9PSJmdW5jdGlvbiImJldlYWtTZXQucHJvdG90eXBlLFBsPUxOP1dlYWtTZXQucHJvdG90eXBlLmhhczpudWxsLEROPXR5cGVvZiBXZWFrUmVmPT0iZnVuY3Rpb24iJiZXZWFrUmVmLnByb3RvdHlwZSxWTT1ETj9XZWFrUmVmLnByb3RvdHlwZS5kZXJlZjpudWxsLFVOPUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YsTk49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxGTj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsQk49U3RyaW5nLnByb3RvdHlwZS5tYXRjaCx4Zz1TdHJpbmcucHJvdG90eXBlLnNsaWNlLE9yPVN0cmluZy5wcm90b3R5cGUucmVwbGFjZSxPTj1TdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlLEdNPVN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UsSE09UmVnRXhwLnByb3RvdHlwZS50ZXN0LFdNPUFycmF5LnByb3RvdHlwZS5jb25jYXQsTGk9QXJyYXkucHJvdG90eXBlLmpvaW4sek49QXJyYXkucHJvdG90eXBlLnNsaWNlLCRNPU1hdGguZmxvb3Isdmc9dHlwZW9mIEJpZ0ludD09ImZ1bmN0aW9uIj9CaWdJbnQucHJvdG90eXBlLnZhbHVlT2Y6bnVsbCxTZz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLE1nPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP1N5bWJvbC5wcm90b3R5cGUudG9TdHJpbmc6bnVsbCxabz10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT0ib2JqZWN0Iixubj10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZTeW1ib2wudG9TdHJpbmdUYWcmJih0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnPT09Wm98fCEwKT9TeW1ib2wudG9TdHJpbmdUYWc6bnVsbCxYTT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLHFNPSh0eXBlb2YgUmVmbGVjdD09ImZ1bmN0aW9uIj9SZWZsZWN0LmdldFByb3RvdHlwZU9mOk9iamVjdC5nZXRQcm90b3R5cGVPZil8fChbXS5fX3Byb3RvX189PT1BcnJheS5wcm90b3R5cGU/ZnVuY3Rpb24oaSl7cmV0dXJuIGkuX19wcm90b19ffTpudWxsKTtmdW5jdGlvbiBZTShpLHQpe2lmKGk9PT0xLzB8fGk9PT0tMS8wfHxpIT09aXx8aSYmaT4tMWUzJiZpPDFlM3x8SE0uY2FsbCgvZS8sdCkpcmV0dXJuIHQ7dmFyIGU9L1swLTldKD89KD86WzAtOV17M30pKyg/IVswLTldKSkvZztpZih0eXBlb2YgaT09Im51bWJlciIpe3ZhciBuPWk8MD8tJE0oLWkpOiRNKGkpO2lmKG4hPT1pKXt2YXIgcj1TdHJpbmcobikscz14Zy5jYWxsKHQsci5sZW5ndGgrMSk7cmV0dXJuIE9yLmNhbGwocixlLCIkJl8iKSsiLiIrT3IuY2FsbChPci5jYWxsKHMsLyhbMC05XXszfSkvZywiJCZfIiksL18kLywiIil9fXJldHVybiBPci5jYWxsKHQsZSwiJCZfIil9dmFyIGJnPVBOLFpNPWJnLmN1c3RvbSxKTT1RTShaTSk/Wk06bnVsbCxrTj1mdW5jdGlvbiBpKHQsZSxuLHIpe3ZhciBzPWV8fHt9O2lmKHpyKHMsInF1b3RlU3R5bGUiKSYmcy5xdW90ZVN0eWxlIT09InNpbmdsZSImJnMucXVvdGVTdHlsZSE9PSJkb3VibGUiKXRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiAicXVvdGVTdHlsZSIgbXVzdCBiZSAic2luZ2xlIiBvciAiZG91YmxlIicpO2lmKHpyKHMsIm1heFN0cmluZ0xlbmd0aCIpJiYodHlwZW9mIHMubWF4U3RyaW5nTGVuZ3RoPT0ibnVtYmVyIj9zLm1heFN0cmluZ0xlbmd0aDwwJiZzLm1heFN0cmluZ0xlbmd0aCE9PTEvMDpzLm1heFN0cmluZ0xlbmd0aCE9PW51bGwpKXRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiAibWF4U3RyaW5nTGVuZ3RoIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBJbmZpbml0eSwgb3IgYG51bGxgJyk7dmFyIG89enIocywiY3VzdG9tSW5zcGVjdCIpP3MuY3VzdG9tSW5zcGVjdDohMDtpZih0eXBlb2YgbyE9ImJvb2xlYW4iJiZvIT09InN5bWJvbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uIFwiY3VzdG9tSW5zcGVjdFwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBgdHJ1ZWAsIGBmYWxzZWAsIG9yIGAnc3ltYm9sJ2AiKTtpZih6cihzLCJpbmRlbnQiKSYmcy5pbmRlbnQhPT1udWxsJiZzLmluZGVudCE9PSIJIiYmIShwYXJzZUludChzLmluZGVudCwxMCk9PT1zLmluZGVudCYmcy5pbmRlbnQ+MCkpdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uICJpbmRlbnQiIG11c3QgYmUgIlxcdCIsIGFuIGludGVnZXIgPiAwLCBvciBgbnVsbGAnKTtpZih6cihzLCJudW1lcmljU2VwYXJhdG9yIikmJnR5cGVvZiBzLm51bWVyaWNTZXBhcmF0b3IhPSJib29sZWFuIil0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gIm51bWVyaWNTZXBhcmF0b3IiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCcpO3ZhciBhPXMubnVtZXJpY1NlcGFyYXRvcjtpZih0eXBlb2YgdD09InVuZGVmaW5lZCIpcmV0dXJuInVuZGVmaW5lZCI7aWYodD09PW51bGwpcmV0dXJuIm51bGwiO2lmKHR5cGVvZiB0PT0iYm9vbGVhbiIpcmV0dXJuIHQ/InRydWUiOiJmYWxzZSI7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiBlYih0LHMpO2lmKHR5cGVvZiB0PT0ibnVtYmVyIil7aWYodD09PTApcmV0dXJuIDEvMC90PjA/IjAiOiItMCI7dmFyIGw9U3RyaW5nKHQpO3JldHVybiBhP1lNKHQsbCk6bH1pZih0eXBlb2YgdD09ImJpZ2ludCIpe3ZhciBjPVN0cmluZyh0KSsibiI7cmV0dXJuIGE/WU0odCxjKTpjfXZhciB1PXR5cGVvZiBzLmRlcHRoPT0idW5kZWZpbmVkIj81OnMuZGVwdGg7aWYodHlwZW9mIG49PSJ1bmRlZmluZWQiJiYobj0wKSxuPj11JiZ1PjAmJnR5cGVvZiB0PT0ib2JqZWN0IilyZXR1cm4gd2codCk/IltBcnJheV0iOiJbT2JqZWN0XSI7dmFyIGg9ckYocyxuKTtpZih0eXBlb2Ygcj09InVuZGVmaW5lZCIpcj1bXTtlbHNlIGlmKHRiKHIsdCk+PTApcmV0dXJuIltDaXJjdWxhcl0iO2Z1bmN0aW9uIGYoTCxOLEYpe2lmKE4mJihyPXpOLmNhbGwociksci5wdXNoKE4pKSxGKXt2YXIgQj17ZGVwdGg6cy5kZXB0aH07cmV0dXJuIHpyKHMsInF1b3RlU3R5bGUiKSYmKEIucXVvdGVTdHlsZT1zLnF1b3RlU3R5bGUpLGkoTCxCLG4rMSxyKX1yZXR1cm4gaShMLHMsbisxLHIpfWlmKHR5cGVvZiB0PT0iZnVuY3Rpb24iJiYhS00odCkpe3ZhciBkPVpOKHQpLHA9X2YodCxmKTtyZXR1cm4iW0Z1bmN0aW9uIisoZD8iOiAiK2Q6IiAoYW5vbnltb3VzKSIpKyJdIisocC5sZW5ndGg+MD8iIHsgIitMaS5jYWxsKHAsIiwgIikrIiB9IjoiIil9aWYoUU0odCkpe3ZhciB5PVpvP09yLmNhbGwoU3RyaW5nKHQpLC9eKFN5bWJvbFwoLipcKSlfW14pXSokLywiJDEiKTpNZy5jYWxsKHQpO3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJiFabz9JbCh5KTp5fWlmKGVGKHQpKXtmb3IodmFyIGc9IjwiK0dNLmNhbGwoU3RyaW5nKHQubm9kZU5hbWUpKSxtPXQuYXR0cmlidXRlc3x8W10sdj0wO3Y8bS5sZW5ndGg7disrKWcrPSIgIittW3ZdLm5hbWUrIj0iK2pNKFZOKG1bdl0udmFsdWUpLCJkb3VibGUiLHMpO3JldHVybiBnKz0iPiIsdC5jaGlsZE5vZGVzJiZ0LmNoaWxkTm9kZXMubGVuZ3RoJiYoZys9Ii4uLiIpLGcrPSI8LyIrR00uY2FsbChTdHJpbmcodC5ub2RlTmFtZSkpKyI+IixnfWlmKHdnKHQpKXtpZih0Lmxlbmd0aD09PTApcmV0dXJuIltdIjt2YXIgeD1fZih0LGYpO3JldHVybiBoJiYhaUYoeCk/IlsiK0VnKHgsaCkrIl0iOiJbICIrTGkuY2FsbCh4LCIsICIpKyIgXSJ9aWYoSE4odCkpe3ZhciBfPV9mKHQsZik7cmV0dXJuISgiY2F1c2UiaW4gRXJyb3IucHJvdG90eXBlKSYmImNhdXNlImluIHQmJiFYTS5jYWxsKHQsImNhdXNlIik/InsgWyIrU3RyaW5nKHQpKyJdICIrTGkuY2FsbChXTS5jYWxsKCJbY2F1c2VdOiAiK2YodC5jYXVzZSksXyksIiwgIikrIiB9IjpfLmxlbmd0aD09PTA/IlsiK1N0cmluZyh0KSsiXSI6InsgWyIrU3RyaW5nKHQpKyJdICIrTGkuY2FsbChfLCIsICIpKyIgfSJ9aWYodHlwZW9mIHQ9PSJvYmplY3QiJiZvKXtpZihKTSYmdHlwZW9mIHRbSk1dPT0iZnVuY3Rpb24iJiZiZylyZXR1cm4gYmcodCx7ZGVwdGg6dS1ufSk7aWYobyE9PSJzeW1ib2wiJiZ0eXBlb2YgdC5pbnNwZWN0PT0iZnVuY3Rpb24iKXJldHVybiB0Lmluc3BlY3QoKX1pZihKTih0KSl7dmFyIE09W107cmV0dXJuIHpNJiZ6TS5jYWxsKHQsZnVuY3Rpb24oTCxOKXtNLnB1c2goZihOLHQsITApKyIgPT4gIitmKEwsdCkpfSksbmIoIk1hcCIsZ2YuY2FsbCh0KSxNLGgpfWlmKFFOKHQpKXt2YXIgYj1bXTtyZXR1cm4ga00mJmtNLmNhbGwodCxmdW5jdGlvbihMKXtiLnB1c2goZihMLHQpKX0pLG5iKCJTZXQiLHlmLmNhbGwodCksYixoKX1pZihqTih0KSlyZXR1cm4gQWcoIldlYWtNYXAiKTtpZih0Rih0KSlyZXR1cm4gQWcoIldlYWtTZXQiKTtpZihLTih0KSlyZXR1cm4gQWcoIldlYWtSZWYiKTtpZigkTih0KSlyZXR1cm4gSWwoZihOdW1iZXIodCkpKTtpZihxTih0KSlyZXR1cm4gSWwoZih2Zy5jYWxsKHQpKSk7aWYoWE4odCkpcmV0dXJuIElsKFVOLmNhbGwodCkpO2lmKFdOKHQpKXJldHVybiBJbChmKFN0cmluZyh0KSkpO2lmKHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ0PT09d2luZG93KXJldHVybiJ7IFtvYmplY3QgV2luZG93XSB9IjtpZih0eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCImJnQ9PT1nbG9iYWxUaGlzfHx0eXBlb2YgYWYhPSJ1bmRlZmluZWQiJiZ0PT09YWYpcmV0dXJuInsgW29iamVjdCBnbG9iYWxUaGlzXSB9IjtpZighR04odCkmJiFLTSh0KSl7dmFyIEE9X2YodCxmKSxFPXFNP3FNKHQpPT09T2JqZWN0LnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0fHx0LmNvbnN0cnVjdG9yPT09T2JqZWN0LHc9dCBpbnN0YW5jZW9mIE9iamVjdD8iIjoibnVsbCBwcm90b3R5cGUiLFM9IUUmJm5uJiZPYmplY3QodCk9PT10JiZubiBpbiB0P3hnLmNhbGwoa3IodCksOCwtMSk6dz8iT2JqZWN0IjoiIixUPUV8fHR5cGVvZiB0LmNvbnN0cnVjdG9yIT0iZnVuY3Rpb24iPyIiOnQuY29uc3RydWN0b3IubmFtZT90LmNvbnN0cnVjdG9yLm5hbWUrIiAiOiIiLEQ9VCsoU3x8dz8iWyIrTGkuY2FsbChXTS5jYWxsKFtdLFN8fFtdLHd8fFtdKSwiOiAiKSsiXSAiOiIiKTtyZXR1cm4gQS5sZW5ndGg9PT0wP0QrInt9IjpoP0QrInsiK0VnKEEsaCkrIn0iOkQrInsgIitMaS5jYWxsKEEsIiwgIikrIiB9In1yZXR1cm4gU3RyaW5nKHQpfTtmdW5jdGlvbiBqTShpLHQsZSl7dmFyIG49KGUucXVvdGVTdHlsZXx8dCk9PT0iZG91YmxlIj8nIic6IiciO3JldHVybiBuK2krbn1mdW5jdGlvbiBWTihpKXtyZXR1cm4gT3IuY2FsbChTdHJpbmcoaSksLyIvZywiJnF1b3Q7Iil9ZnVuY3Rpb24gd2coaSl7cmV0dXJuIGtyKGkpPT09IltvYmplY3QgQXJyYXldIiYmKCFubnx8ISh0eXBlb2YgaT09Im9iamVjdCImJm5uIGluIGkpKX1mdW5jdGlvbiBHTihpKXtyZXR1cm4ga3IoaSk9PT0iW29iamVjdCBEYXRlXSImJighbm58fCEodHlwZW9mIGk9PSJvYmplY3QiJiZubiBpbiBpKSl9ZnVuY3Rpb24gS00oaSl7cmV0dXJuIGtyKGkpPT09IltvYmplY3QgUmVnRXhwXSImJighbm58fCEodHlwZW9mIGk9PSJvYmplY3QiJiZubiBpbiBpKSl9ZnVuY3Rpb24gSE4oaSl7cmV0dXJuIGtyKGkpPT09IltvYmplY3QgRXJyb3JdIiYmKCFubnx8ISh0eXBlb2YgaT09Im9iamVjdCImJm5uIGluIGkpKX1mdW5jdGlvbiBXTihpKXtyZXR1cm4ga3IoaSk9PT0iW29iamVjdCBTdHJpbmddIiYmKCFubnx8ISh0eXBlb2YgaT09Im9iamVjdCImJm5uIGluIGkpKX1mdW5jdGlvbiAkTihpKXtyZXR1cm4ga3IoaSk9PT0iW29iamVjdCBOdW1iZXJdIiYmKCFubnx8ISh0eXBlb2YgaT09Im9iamVjdCImJm5uIGluIGkpKX1mdW5jdGlvbiBYTihpKXtyZXR1cm4ga3IoaSk9PT0iW29iamVjdCBCb29sZWFuXSImJighbm58fCEodHlwZW9mIGk9PSJvYmplY3QiJiZubiBpbiBpKSl9ZnVuY3Rpb24gUU0oaSl7aWYoWm8pcmV0dXJuIGkmJnR5cGVvZiBpPT0ib2JqZWN0IiYmaSBpbnN0YW5jZW9mIFN5bWJvbDtpZih0eXBlb2YgaT09InN5bWJvbCIpcmV0dXJuITA7aWYoIWl8fHR5cGVvZiBpIT0ib2JqZWN0Inx8IU1nKXJldHVybiExO3RyeXtyZXR1cm4gTWcuY2FsbChpKSwhMH1jYXRjaCh0KXt9cmV0dXJuITF9ZnVuY3Rpb24gcU4oaSl7aWYoIWl8fHR5cGVvZiBpIT0ib2JqZWN0Inx8IXZnKXJldHVybiExO3RyeXtyZXR1cm4gdmcuY2FsbChpKSwhMH1jYXRjaCh0KXt9cmV0dXJuITF9dmFyIFlOPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHl8fGZ1bmN0aW9uKGkpe3JldHVybiBpIGluIHRoaXN9O2Z1bmN0aW9uIHpyKGksdCl7cmV0dXJuIFlOLmNhbGwoaSx0KX1mdW5jdGlvbiBrcihpKXtyZXR1cm4gTk4uY2FsbChpKX1mdW5jdGlvbiBaTihpKXtpZihpLm5hbWUpcmV0dXJuIGkubmFtZTt2YXIgdD1CTi5jYWxsKEZOLmNhbGwoaSksL15mdW5jdGlvblxzKihbXHckXSspLyk7cmV0dXJuIHQ/dFsxXTpudWxsfWZ1bmN0aW9uIHRiKGksdCl7aWYoaS5pbmRleE9mKXJldHVybiBpLmluZGV4T2YodCk7Zm9yKHZhciBlPTAsbj1pLmxlbmd0aDtlPG47ZSsrKWlmKGlbZV09PT10KXJldHVybiBlO3JldHVybi0xfWZ1bmN0aW9uIEpOKGkpe2lmKCFnZnx8IWl8fHR5cGVvZiBpIT0ib2JqZWN0IilyZXR1cm4hMTt0cnl7Z2YuY2FsbChpKTt0cnl7eWYuY2FsbChpKX1jYXRjaCh0KXtyZXR1cm4hMH1yZXR1cm4gaSBpbnN0YW5jZW9mIE1hcH1jYXRjaCh0KXt9cmV0dXJuITF9ZnVuY3Rpb24gak4oaSl7aWYoIVJsfHwhaXx8dHlwZW9mIGkhPSJvYmplY3QiKXJldHVybiExO3RyeXtSbC5jYWxsKGksUmwpO3RyeXtQbC5jYWxsKGksUGwpfWNhdGNoKHQpe3JldHVybiEwfXJldHVybiBpIGluc3RhbmNlb2YgV2Vha01hcH1jYXRjaCh0KXt9cmV0dXJuITF9ZnVuY3Rpb24gS04oaSl7aWYoIVZNfHwhaXx8dHlwZW9mIGkhPSJvYmplY3QiKXJldHVybiExO3RyeXtyZXR1cm4gVk0uY2FsbChpKSwhMH1jYXRjaCh0KXt9cmV0dXJuITF9ZnVuY3Rpb24gUU4oaSl7aWYoIXlmfHwhaXx8dHlwZW9mIGkhPSJvYmplY3QiKXJldHVybiExO3RyeXt5Zi5jYWxsKGkpO3RyeXtnZi5jYWxsKGkpfWNhdGNoKHQpe3JldHVybiEwfXJldHVybiBpIGluc3RhbmNlb2YgU2V0fWNhdGNoKHQpe31yZXR1cm4hMX1mdW5jdGlvbiB0RihpKXtpZighUGx8fCFpfHx0eXBlb2YgaSE9Im9iamVjdCIpcmV0dXJuITE7dHJ5e1BsLmNhbGwoaSxQbCk7dHJ5e1JsLmNhbGwoaSxSbCl9Y2F0Y2godCl7cmV0dXJuITB9cmV0dXJuIGkgaW5zdGFuY2VvZiBXZWFrU2V0fWNhdGNoKHQpe31yZXR1cm4hMX1mdW5jdGlvbiBlRihpKXtyZXR1cm4haXx8dHlwZW9mIGkhPSJvYmplY3QiPyExOnR5cGVvZiBIVE1MRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD8hMDp0eXBlb2YgaS5ub2RlTmFtZT09InN0cmluZyImJnR5cGVvZiBpLmdldEF0dHJpYnV0ZT09ImZ1bmN0aW9uIn1mdW5jdGlvbiBlYihpLHQpe2lmKGkubGVuZ3RoPnQubWF4U3RyaW5nTGVuZ3RoKXt2YXIgZT1pLmxlbmd0aC10Lm1heFN0cmluZ0xlbmd0aCxuPSIuLi4gIitlKyIgbW9yZSBjaGFyYWN0ZXIiKyhlPjE/InMiOiIiKTtyZXR1cm4gZWIoeGcuY2FsbChpLDAsdC5tYXhTdHJpbmdMZW5ndGgpLHQpK259dmFyIHI9T3IuY2FsbChPci5jYWxsKGksLyhbJ1xcXSkvZywiXFwkMSIpLC9bXHgwMC1ceDFmXS9nLG5GKTtyZXR1cm4gak0ociwic2luZ2xlIix0KX1mdW5jdGlvbiBuRihpKXt2YXIgdD1pLmNoYXJDb2RlQXQoMCksZT17ODoiYiIsOToidCIsMTA6Im4iLDEyOiJmIiwxMzoiciJ9W3RdO3JldHVybiBlPyJcXCIrZToiXFx4IisodDwxNj8iMCI6IiIpK09OLmNhbGwodC50b1N0cmluZygxNikpfWZ1bmN0aW9uIElsKGkpe3JldHVybiJPYmplY3QoIitpKyIpIn1mdW5jdGlvbiBBZyhpKXtyZXR1cm4gaSsiIHsgPyB9In1mdW5jdGlvbiBuYihpLHQsZSxuKXt2YXIgcj1uP0VnKGUsbik6TGkuY2FsbChlLCIsICIpO3JldHVybiBpKyIgKCIrdCsiKSB7IityKyJ9In1mdW5jdGlvbiBpRihpKXtmb3IodmFyIHQ9MDt0PGkubGVuZ3RoO3QrKylpZih0YihpW3RdLGAKYCk+PTApcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gckYoaSx0KXt2YXIgZTtpZihpLmluZGVudD09PSIJIillPSIJIjtlbHNlIGlmKHR5cGVvZiBpLmluZGVudD09Im51bWJlciImJmkuaW5kZW50PjApZT1MaS5jYWxsKEFycmF5KGkuaW5kZW50KzEpLCIgIik7ZWxzZSByZXR1cm4gbnVsbDtyZXR1cm57YmFzZTplLHByZXY6TGkuY2FsbChBcnJheSh0KzEpLGUpfX1mdW5jdGlvbiBFZyhpLHQpe2lmKGkubGVuZ3RoPT09MClyZXR1cm4iIjt2YXIgZT1gCmArdC5wcmV2K3QuYmFzZTtyZXR1cm4gZStMaS5jYWxsKGksIiwiK2UpK2AKYCt0LnByZXZ9ZnVuY3Rpb24gX2YoaSx0KXt2YXIgZT13ZyhpKSxuPVtdO2lmKGUpe24ubGVuZ3RoPWkubGVuZ3RoO2Zvcih2YXIgcj0wO3I8aS5sZW5ndGg7cisrKW5bcl09enIoaSxyKT90KGlbcl0saSk6IiJ9dmFyIHM9dHlwZW9mIFNnPT0iZnVuY3Rpb24iP1NnKGkpOltdLG87aWYoWm8pe289e307Zm9yKHZhciBhPTA7YTxzLmxlbmd0aDthKyspb1siJCIrc1thXV09c1thXX1mb3IodmFyIGwgaW4gaSl6cihpLGwpJiYoZSYmU3RyaW5nKE51bWJlcihsKSk9PT1sJiZsPGkubGVuZ3RofHxabyYmb1siJCIrbF1pbnN0YW5jZW9mIFN5bWJvbHx8KEhNLmNhbGwoL1teXHckXS8sbCk/bi5wdXNoKHQobCxpKSsiOiAiK3QoaVtsXSxpKSk6bi5wdXNoKGwrIjogIit0KGlbbF0saSkpKSk7aWYodHlwZW9mIFNnPT0iZnVuY3Rpb24iKWZvcih2YXIgYz0wO2M8cy5sZW5ndGg7YysrKVhNLmNhbGwoaSxzW2NdKSYmbi5wdXNoKCJbIit0KHNbY10pKyJdOiAiK3QoaVtzW2NdXSxpKSk7cmV0dXJuIG59dmFyIGliPUlpLEpvPW5pLHNGPWtOLG9GPUJyLHhmPWliKCIlV2Vha01hcCUiLCEwKSx2Zj1pYigiJU1hcCUiLCEwKSxhRj1KbygiV2Vha01hcC5wcm90b3R5cGUuZ2V0IiwhMCksbEY9Sm8oIldlYWtNYXAucHJvdG90eXBlLnNldCIsITApLGNGPUpvKCJXZWFrTWFwLnByb3RvdHlwZS5oYXMiLCEwKSx1Rj1KbygiTWFwLnByb3RvdHlwZS5nZXQiLCEwKSxoRj1KbygiTWFwLnByb3RvdHlwZS5zZXQiLCEwKSxmRj1KbygiTWFwLnByb3RvdHlwZS5oYXMiLCEwKSxUZz1mdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLG47KG49ZS5uZXh0KSE9PW51bGw7ZT1uKWlmKG4ua2V5PT09dClyZXR1cm4gZS5uZXh0PW4ubmV4dCxuLm5leHQ9aS5uZXh0LGkubmV4dD1uLG59LGRGPWZ1bmN0aW9uKGksdCl7dmFyIGU9VGcoaSx0KTtyZXR1cm4gZSYmZS52YWx1ZX0scEY9ZnVuY3Rpb24oaSx0LGUpe3ZhciBuPVRnKGksdCk7bj9uLnZhbHVlPWU6aS5uZXh0PXtrZXk6dCxuZXh0OmkubmV4dCx2YWx1ZTplfX0sbUY9ZnVuY3Rpb24oaSx0KXtyZXR1cm4hIVRnKGksdCl9LHJiPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9e2Fzc2VydDpmdW5jdGlvbihzKXtpZighci5oYXMocykpdGhyb3cgbmV3IG9GKCJTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAiK3NGKHMpKX0sZ2V0OmZ1bmN0aW9uKHMpe2lmKHhmJiZzJiYodHlwZW9mIHM9PSJvYmplY3QifHx0eXBlb2Ygcz09ImZ1bmN0aW9uIikpe2lmKHQpcmV0dXJuIGFGKHQscyl9ZWxzZSBpZih2Zil7aWYoZSlyZXR1cm4gdUYoZSxzKX1lbHNlIGlmKG4pcmV0dXJuIGRGKG4scyl9LGhhczpmdW5jdGlvbihzKXtpZih4ZiYmcyYmKHR5cGVvZiBzPT0ib2JqZWN0Inx8dHlwZW9mIHM9PSJmdW5jdGlvbiIpKXtpZih0KXJldHVybiBjRih0LHMpfWVsc2UgaWYodmYpe2lmKGUpcmV0dXJuIGZGKGUscyl9ZWxzZSBpZihuKXJldHVybiBtRihuLHMpO3JldHVybiExfSxzZXQ6ZnVuY3Rpb24ocyxvKXt4ZiYmcyYmKHR5cGVvZiBzPT0ib2JqZWN0Inx8dHlwZW9mIHM9PSJmdW5jdGlvbiIpPyh0fHwodD1uZXcgeGYpLGxGKHQscyxvKSk6dmY/KGV8fChlPW5ldyB2ZiksaEYoZSxzLG8pKToobnx8KG49e2tleTp7fSxuZXh0Om51bGx9KSxwRihuLHMsbykpfX07cmV0dXJuIHJ9LGdGPWFNLExsPXJiKCksaHI9QnIsQ2c9e2Fzc2VydDpmdW5jdGlvbihpLHQpe2lmKCFpfHx0eXBlb2YgaSE9Im9iamVjdCImJnR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IG5ldyBocigiYE9gIGlzIG5vdCBhbiBvYmplY3QiKTtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IGhyKCJgc2xvdGAgbXVzdCBiZSBhIHN0cmluZyIpO2lmKExsLmFzc2VydChpKSwhQ2cuaGFzKGksdCkpdGhyb3cgbmV3IGhyKCJgIit0KyJgIGlzIG5vdCBwcmVzZW50IG9uIGBPYCIpfSxnZXQ6ZnVuY3Rpb24oaSx0KXtpZighaXx8dHlwZW9mIGkhPSJvYmplY3QiJiZ0eXBlb2YgaSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgaHIoImBPYCBpcyBub3QgYW4gb2JqZWN0Iik7aWYodHlwZW9mIHQhPSJzdHJpbmciKXRocm93IG5ldyBocigiYHNsb3RgIG11c3QgYmUgYSBzdHJpbmciKTt2YXIgZT1MbC5nZXQoaSk7cmV0dXJuIGUmJmVbIiQiK3RdfSxoYXM6ZnVuY3Rpb24oaSx0KXtpZighaXx8dHlwZW9mIGkhPSJvYmplY3QiJiZ0eXBlb2YgaSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgaHIoImBPYCBpcyBub3QgYW4gb2JqZWN0Iik7aWYodHlwZW9mIHQhPSJzdHJpbmciKXRocm93IG5ldyBocigiYHNsb3RgIG11c3QgYmUgYSBzdHJpbmciKTt2YXIgZT1MbC5nZXQoaSk7cmV0dXJuISFlJiZnRihlLCIkIit0KX0sc2V0OmZ1bmN0aW9uKGksdCxlKXtpZighaXx8dHlwZW9mIGkhPSJvYmplY3QiJiZ0eXBlb2YgaSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgaHIoImBPYCBpcyBub3QgYW4gb2JqZWN0Iik7aWYodHlwZW9mIHQhPSJzdHJpbmciKXRocm93IG5ldyBocigiYHNsb3RgIG11c3QgYmUgYSBzdHJpbmciKTt2YXIgbj1MbC5nZXQoaSk7bnx8KG49e30sTGwuc2V0KGksbikpLG5bIiQiK3RdPWV9fTtPYmplY3QuZnJlZXplJiZPYmplY3QuZnJlZXplKENnKTt2YXIgeUY9Q2csRGw9eUYsX0Y9U3ludGF4RXJyb3Isc2I9dHlwZW9mIFN0b3BJdGVyYXRpb249PSJvYmplY3QiP1N0b3BJdGVyYXRpb246bnVsbCx4Rj1mdW5jdGlvbih0KXtpZighc2IpdGhyb3cgbmV3IF9GKCJ0aGlzIGVudmlyb25tZW50IGxhY2tzIFN0b3BJdGVyYXRpb24iKTtEbC5zZXQodCwiW1tEb25lXV0iLCExKTt2YXIgZT17bmV4dDpmdW5jdGlvbigpe3ZhciByPURsLmdldCh0aGlzLCJbW0l0ZXJhdG9yXV0iKSxzPURsLmdldChyLCJbW0RvbmVdXSIpO3RyeXtyZXR1cm57ZG9uZTpzLHZhbHVlOnM/dm9pZCAwOnIubmV4dCgpfX1jYXRjaChvKXtpZihEbC5zZXQociwiW1tEb25lXV0iLCEwKSxvIT09c2IpdGhyb3cgbztyZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fX19O3JldHVybiBEbC5zZXQoZSwiW1tJdGVyYXRvcl1dIix0KSxlfSx2Rj17fS50b1N0cmluZyxvYj1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihpKXtyZXR1cm4gdkYuY2FsbChpKT09IltvYmplY3QgQXJyYXldIn0sU0Y9U3RyaW5nLnByb3RvdHlwZS52YWx1ZU9mLE1GPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gU0YuY2FsbCh0KSwhMH1jYXRjaChlKXtyZXR1cm4hMX19LGJGPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsd0Y9IltvYmplY3QgU3RyaW5nXSIsQUY9T3MoKSxhYj1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciPyEwOnR5cGVvZiB0IT0ib2JqZWN0Ij8hMTpBRj9NRih0KTpiRi5jYWxsKHQpPT09d0Z9LFJnPXR5cGVvZiBNYXA9PSJmdW5jdGlvbiImJk1hcC5wcm90b3R5cGU/TWFwOm51bGwsRUY9dHlwZW9mIFNldD09ImZ1bmN0aW9uIiYmU2V0LnByb3RvdHlwZT9TZXQ6bnVsbCxTZjtSZ3x8KFNmPWZ1bmN0aW9uKHQpe3JldHVybiExfSk7dmFyIGxiPVJnP01hcC5wcm90b3R5cGUuaGFzOm51bGwsY2I9RUY/U2V0LnByb3RvdHlwZS5oYXM6bnVsbDshU2YmJiFsYiYmKFNmPWZ1bmN0aW9uKHQpe3JldHVybiExfSk7dmFyIHViPVNmfHxmdW5jdGlvbih0KXtpZighdHx8dHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiExO3RyeXtpZihsYi5jYWxsKHQpLGNiKXRyeXtjYi5jYWxsKHQpfWNhdGNoKGUpe3JldHVybiEwfXJldHVybiB0IGluc3RhbmNlb2YgUmd9Y2F0Y2goZSl7fXJldHVybiExfSxURj10eXBlb2YgTWFwPT0iZnVuY3Rpb24iJiZNYXAucHJvdG90eXBlP01hcDpudWxsLFBnPXR5cGVvZiBTZXQ9PSJmdW5jdGlvbiImJlNldC5wcm90b3R5cGU/U2V0Om51bGwsTWY7UGd8fChNZj1mdW5jdGlvbih0KXtyZXR1cm4hMX0pO3ZhciBoYj1URj9NYXAucHJvdG90eXBlLmhhczpudWxsLGZiPVBnP1NldC5wcm90b3R5cGUuaGFzOm51bGw7IU1mJiYhZmImJihNZj1mdW5jdGlvbih0KXtyZXR1cm4hMX0pO3ZhciBkYj1NZnx8ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4hMTt0cnl7aWYoZmIuY2FsbCh0KSxoYil0cnl7aGIuY2FsbCh0KX1jYXRjaChlKXtyZXR1cm4hMH1yZXR1cm4gdCBpbnN0YW5jZW9mIFBnfWNhdGNoKGUpe31yZXR1cm4hMX0scGI9T00sbWI9eEY7aWYoaWcoKXx8Y2YoKSl7dmFyIElnPVN5bWJvbC5pdGVyYXRvcjtwZi5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHQhPW51bGwmJnR5cGVvZiB0W0lnXSE9InVuZGVmaW5lZCIpcmV0dXJuIHRbSWddKCk7aWYocGIodCkpcmV0dXJuIEFycmF5LnByb3RvdHlwZVtJZ10uY2FsbCh0KX19ZWxzZXt2YXIgQ0Y9b2IsUkY9YWIsZ2I9SWksUEY9Z2IoIiVNYXAlIiwhMCksSUY9Z2IoIiVTZXQlIiwhMCksX2k9bmkseWI9X2koIkFycmF5LnByb3RvdHlwZS5wdXNoIiksX2I9X2koIlN0cmluZy5wcm90b3R5cGUuY2hhckNvZGVBdCIpLExGPV9pKCJTdHJpbmcucHJvdG90eXBlLnNsaWNlIiksREY9ZnVuY3Rpb24odCxlKXt2YXIgbj10Lmxlbmd0aDtpZihlKzE+PW4pcmV0dXJuIGUrMTt2YXIgcj1fYih0LGUpO2lmKHI8NTUyOTZ8fHI+NTYzMTkpcmV0dXJuIGUrMTt2YXIgcz1fYih0LGUrMSk7cmV0dXJuIHM8NTYzMjB8fHM+NTczNDM/ZSsxOmUrMn0sTGc9ZnVuY3Rpb24odCl7dmFyIGU9MDtyZXR1cm57bmV4dDpmdW5jdGlvbigpe3ZhciByPWU+PXQubGVuZ3RoLHM7cmV0dXJuIHJ8fChzPXRbZV0sZSs9MSkse2RvbmU6cix2YWx1ZTpzfX19fSx4Yj1mdW5jdGlvbih0LGUpe2lmKENGKHQpfHxwYih0KSlyZXR1cm4gTGcodCk7aWYoUkYodCkpe3ZhciBuPTA7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXt2YXIgcz1ERih0LG4pLG89TEYodCxuLHMpO3JldHVybiBuPXMse2RvbmU6cz50Lmxlbmd0aCx2YWx1ZTpvfX19fWlmKGUmJnR5cGVvZiB0WyJfZXM2LXNoaW0gaXRlcmF0b3JfIl0hPSJ1bmRlZmluZWQiKXJldHVybiB0WyJfZXM2LXNoaW0gaXRlcmF0b3JfIl0oKX07aWYoIVBGJiYhSUYpcGYuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih0IT1udWxsKXJldHVybiB4Yih0LCEwKX07ZWxzZXt2YXIgVUY9dWIsTkY9ZGIsdmI9X2koIk1hcC5wcm90b3R5cGUuZm9yRWFjaCIsITApLFNiPV9pKCJTZXQucHJvdG90eXBlLmZvckVhY2giLCEwKTtpZih0eXBlb2YgcHJvY2Vzcz09InVuZGVmaW5lZCJ8fCFwcm9jZXNzLnZlcnNpb25zfHwhcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKXZhciBNYj1faSgiTWFwLnByb3RvdHlwZS5pdGVyYXRvciIsITApLGJiPV9pKCJTZXQucHJvdG90eXBlLml0ZXJhdG9yIiwhMCk7dmFyIHdiPV9pKCJNYXAucHJvdG90eXBlLkBAaXRlcmF0b3IiLCEwKXx8X2koIk1hcC5wcm90b3R5cGUuX2VzNi1zaGltIGl0ZXJhdG9yXyIsITApLEFiPV9pKCJTZXQucHJvdG90eXBlLkBAaXRlcmF0b3IiLCEwKXx8X2koIlNldC5wcm90b3R5cGUuX2VzNi1zaGltIGl0ZXJhdG9yXyIsITApLEZGPWZ1bmN0aW9uKHQpe2lmKFVGKHQpKXtpZihNYilyZXR1cm4gbWIoTWIodCkpO2lmKHdiKXJldHVybiB3Yih0KTtpZih2Yil7dmFyIGU9W107cmV0dXJuIHZiKHQsZnVuY3Rpb24ocixzKXt5YihlLFtzLHJdKX0pLExnKGUpfX1pZihORih0KSl7aWYoYmIpcmV0dXJuIG1iKGJiKHQpKTtpZihBYilyZXR1cm4gQWIodCk7aWYoU2Ipe3ZhciBuPVtdO3JldHVybiBTYih0LGZ1bmN0aW9uKHIpe3liKG4scil9KSxMZyhuKX19fTtwZi5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBGRih0KXx8eGIodCl9fX12YXIgQkY9cGYuZXhwb3J0cyxFYj1mdW5jdGlvbihpKXtyZXR1cm4gaSE9PWl9LFRiPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT0wJiZlPT09MD8xL3Q9PT0xL2U6ISEodD09PWV8fEViKHQpJiZFYihlKSl9LE9GPVRiLENiPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBPYmplY3QuaXM9PSJmdW5jdGlvbiI/T2JqZWN0LmlzOk9GfSx6Rj1DYixrRj1CcyxWRj1mdW5jdGlvbigpe3ZhciB0PXpGKCk7cmV0dXJuIGtGKE9iamVjdCx7aXM6dH0se2lzOmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5pcyE9PXR9fSksdH0sR0Y9QnMsSEY9WW8sV0Y9VGIsUmI9Q2IsJEY9VkYsUGI9SEYoUmIoKSxPYmplY3QpO0dGKFBiLHtnZXRQb2x5ZmlsbDpSYixpbXBsZW1lbnRhdGlvbjpXRixzaGltOiRGfSk7dmFyIFhGPVBiLHFGPVlvLEliPW5pLFlGPUlpLERnPVlGKCIlQXJyYXlCdWZmZXIlIiwhMCksYmY9SWIoIkFycmF5QnVmZmVyLnByb3RvdHlwZS5ieXRlTGVuZ3RoIiwhMCksWkY9SWIoIk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmciKSxMYj0hIURnJiYhYmYmJm5ldyBEZygwKS5zbGljZSxEYj0hIUxiJiZxRihMYiksVWI9YmZ8fERiP2Z1bmN0aW9uKHQpe2lmKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuITE7dHJ5e3JldHVybiBiZj9iZih0KTpEYih0LDApLCEwfWNhdGNoKGUpe3JldHVybiExfX06RGc/ZnVuY3Rpb24odCl7cmV0dXJuIFpGKHQpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn06ZnVuY3Rpb24odCl7cmV0dXJuITF9LEpGPURhdGUucHJvdG90eXBlLmdldERheSxqRj1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIEpGLmNhbGwodCksITB9Y2F0Y2goZSl7cmV0dXJuITF9fSxLRj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFFGPSJbb2JqZWN0IERhdGVdIix0Qj1PcygpLGVCPWZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsPyExOnRCP2pGKHQpOktGLmNhbGwodCk9PT1RRn0sVWc9bmksTmI9T3MoKSxGYixCYixOZyxGZztpZihOYil7RmI9VWcoIk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkiKSxCYj1VZygiUmVnRXhwLnByb3RvdHlwZS5leGVjIiksTmc9e307dmFyIEJnPWZ1bmN0aW9uKCl7dGhyb3cgTmd9O0ZnPXt0b1N0cmluZzpCZyx2YWx1ZU9mOkJnfSx0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlPT0ic3ltYm9sIiYmKEZnW1N5bWJvbC50b1ByaW1pdGl2ZV09QmcpfXZhciBuQj1VZygiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLGlCPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsckI9IltvYmplY3QgUmVnRXhwXSIsc0I9TmI/ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4hMTt2YXIgZT1pQih0LCJsYXN0SW5kZXgiKSxuPWUmJkZiKGUsInZhbHVlIik7aWYoIW4pcmV0dXJuITE7dHJ5e0JiKHQsRmcpfWNhdGNoKHIpe3JldHVybiByPT09Tmd9fTpmdW5jdGlvbih0KXtyZXR1cm4hdHx8dHlwZW9mIHQhPSJvYmplY3QiJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uIj8hMTpuQih0KT09PXJCfSxvQj1uaSxPYj1vQigiU2hhcmVkQXJyYXlCdWZmZXIucHJvdG90eXBlLmJ5dGVMZW5ndGgiLCEwKSxhQj1PYj9mdW5jdGlvbih0KXtpZighdHx8dHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiExO3RyeXtyZXR1cm4gT2IodCksITB9Y2F0Y2goZSl7cmV0dXJuITF9fTpmdW5jdGlvbih0KXtyZXR1cm4hMX0sbEI9TnVtYmVyLnByb3RvdHlwZS50b1N0cmluZyxjQj1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGxCLmNhbGwodCksITB9Y2F0Y2goZSl7cmV0dXJuITF9fSx1Qj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGhCPSJbb2JqZWN0IE51bWJlcl0iLGZCPU9zKCksZEI9ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj8hMDp0eXBlb2YgdCE9Im9iamVjdCI/ITE6ZkI/Y0IodCk6dUIuY2FsbCh0KT09PWhCfSx6Yj1uaSxwQj16YigiQm9vbGVhbi5wcm90b3R5cGUudG9TdHJpbmciKSxtQj16YigiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLGdCPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gcEIodCksITB9Y2F0Y2goZSl7cmV0dXJuITF9fSx5Qj0iW29iamVjdCBCb29sZWFuXSIsX0I9T3MoKSx4Qj1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJib29sZWFuIj8hMDp0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiPyExOl9CJiZTeW1ib2wudG9TdHJpbmdUYWcgaW4gdD9nQih0KTptQih0KT09PXlCfSxPZz17ZXhwb3J0czp7fX0sdkI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxTQj1pZygpO2lmKFNCKXt2YXIgTUI9U3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyxiQj0vXlN5bWJvbFwoLipcKSQvLHdCPWZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdC52YWx1ZU9mKCkhPSJzeW1ib2wiPyExOmJCLnRlc3QoTUIuY2FsbCh0KSl9O09nLmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodHlwZW9mIHQ9PSJzeW1ib2wiKXJldHVybiEwO2lmKHZCLmNhbGwodCkhPT0iW29iamVjdCBTeW1ib2xdIilyZXR1cm4hMTt0cnl7cmV0dXJuIHdCKHQpfWNhdGNoKGUpe3JldHVybiExfX19ZWxzZSBPZy5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiExfTt2YXIgQUI9T2cuZXhwb3J0cyx6Zz17ZXhwb3J0czp7fX0sa2I9dHlwZW9mIEJpZ0ludCE9InVuZGVmaW5lZCImJkJpZ0ludCxFQj1mdW5jdGlvbigpe3JldHVybiB0eXBlb2Yga2I9PSJmdW5jdGlvbiImJnR5cGVvZiBCaWdJbnQ9PSJmdW5jdGlvbiImJnR5cGVvZiBrYig0Mik9PSJiaWdpbnQiJiZ0eXBlb2YgQmlnSW50KDQyKT09ImJpZ2ludCJ9LFRCPUVCKCk7aWYoVEIpe3ZhciBDQj1CaWdJbnQucHJvdG90eXBlLnZhbHVlT2YsUkI9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBDQi5jYWxsKHQpLCEwfWNhdGNoKGUpe31yZXR1cm4hMX07emcuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD09PW51bGx8fHR5cGVvZiB0PT0idW5kZWZpbmVkInx8dHlwZW9mIHQ9PSJib29sZWFuInx8dHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09Im51bWJlciJ8fHR5cGVvZiB0PT0ic3ltYm9sInx8dHlwZW9mIHQ9PSJmdW5jdGlvbiI/ITE6dHlwZW9mIHQ9PSJiaWdpbnQiPyEwOlJCKHQpfX1lbHNlIHpnLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuITF9O3ZhciBQQj16Zy5leHBvcnRzLElCPWFiLExCPWRCLERCPXhCLFVCPUFCLE5CPVBCLEZCPWZ1bmN0aW9uKHQpe2lmKHQ9PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0IiYmdHlwZW9mIHQhPSJmdW5jdGlvbiIpcmV0dXJuIG51bGw7aWYoSUIodCkpcmV0dXJuIlN0cmluZyI7aWYoTEIodCkpcmV0dXJuIk51bWJlciI7aWYoREIodCkpcmV0dXJuIkJvb2xlYW4iO2lmKFVCKHQpKXJldHVybiJTeW1ib2wiO2lmKE5CKHQpKXJldHVybiJCaWdJbnQifSx3Zj10eXBlb2YgV2Vha01hcD09ImZ1bmN0aW9uIiYmV2Vha01hcC5wcm90b3R5cGU/V2Vha01hcDpudWxsLFZiPXR5cGVvZiBXZWFrU2V0PT0iZnVuY3Rpb24iJiZXZWFrU2V0LnByb3RvdHlwZT9XZWFrU2V0Om51bGwsQWY7d2Z8fChBZj1mdW5jdGlvbih0KXtyZXR1cm4hMX0pO3ZhciBrZz13Zj93Zi5wcm90b3R5cGUuaGFzOm51bGwsVmc9VmI/VmIucHJvdG90eXBlLmhhczpudWxsOyFBZiYmIWtnJiYoQWY9ZnVuY3Rpb24odCl7cmV0dXJuITF9KTt2YXIgQkI9QWZ8fGZ1bmN0aW9uKHQpe2lmKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuITE7dHJ5e2lmKGtnLmNhbGwodCxrZyksVmcpdHJ5e1ZnLmNhbGwodCxWZyl9Y2F0Y2goZSl7cmV0dXJuITB9cmV0dXJuIHQgaW5zdGFuY2VvZiB3Zn1jYXRjaChlKXt9cmV0dXJuITF9LEdnPXtleHBvcnRzOnt9fSxPQj1JaSxHYj1uaSx6Qj1PQigiJVdlYWtTZXQlIiwhMCksSGc9R2IoIldlYWtTZXQucHJvdG90eXBlLmhhcyIsITApO2lmKEhnKXt2YXIgV2c9R2IoIldlYWtNYXAucHJvdG90eXBlLmhhcyIsITApO0dnLmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4hMTt0cnl7aWYoSGcodCxIZyksV2cpdHJ5e1dnKHQsV2cpfWNhdGNoKGUpe3JldHVybiEwfXJldHVybiB0IGluc3RhbmNlb2YgekJ9Y2F0Y2goZSl7fXJldHVybiExfX1lbHNlIEdnLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuITF9O3ZhciBrQj1HZy5leHBvcnRzLFZCPXViLEdCPWRiLEhCPUJCLFdCPWtCLCRCPWZ1bmN0aW9uKHQpe2lmKHQmJnR5cGVvZiB0PT0ib2JqZWN0Iil7aWYoVkIodCkpcmV0dXJuIk1hcCI7aWYoR0IodCkpcmV0dXJuIlNldCI7aWYoSEIodCkpcmV0dXJuIldlYWtNYXAiO2lmKFdCKHQpKXJldHVybiJXZWFrU2V0In1yZXR1cm4hMX0sSGI9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLGpvPXR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0IiYmUmVmbGVjdCE9PW51bGwmJlJlZmxlY3QuYXBwbHksJGcsRWY7aWYodHlwZW9mIGpvPT0iZnVuY3Rpb24iJiZ0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5PT0iZnVuY3Rpb24iKXRyeXskZz1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImxlbmd0aCIse2dldDpmdW5jdGlvbigpe3Rocm93IEVmfX0pLEVmPXt9LGpvKGZ1bmN0aW9uKCl7dGhyb3cgNDJ9LG51bGwsJGcpfWNhdGNoKGkpe2khPT1FZiYmKGpvPW51bGwpfWVsc2Ugam89bnVsbDt2YXIgWEI9L15ccypjbGFzc1xiLyxYZz1mdW5jdGlvbih0KXt0cnl7dmFyIGU9SGIuY2FsbCh0KTtyZXR1cm4gWEIudGVzdChlKX1jYXRjaChuKXtyZXR1cm4hMX19LHFnPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gWGcodCk/ITE6KEhiLmNhbGwodCksITApfWNhdGNoKGUpe3JldHVybiExfX0sVGY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxxQj0iW29iamVjdCBPYmplY3RdIixZQj0iW29iamVjdCBGdW5jdGlvbl0iLFpCPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsSkI9IltvYmplY3QgSFRNTEFsbENvbGxlY3Rpb25dIixqQj0iW29iamVjdCBIVE1MIGRvY3VtZW50LmFsbCBjbGFzc10iLEtCPSJbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSIsUUI9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmISFTeW1ib2wudG9TdHJpbmdUYWcsdE89ISgwIGluWyxdKSxZZz1mdW5jdGlvbigpe3JldHVybiExfTtpZih0eXBlb2YgZG9jdW1lbnQ9PSJvYmplY3QiKXt2YXIgZU89ZG9jdW1lbnQuYWxsO1RmLmNhbGwoZU8pPT09VGYuY2FsbChkb2N1bWVudC5hbGwpJiYoWWc9ZnVuY3Rpb24odCl7aWYoKHRPfHwhdCkmJih0eXBlb2YgdD09InVuZGVmaW5lZCJ8fHR5cGVvZiB0PT0ib2JqZWN0IikpdHJ5e3ZhciBlPVRmLmNhbGwodCk7cmV0dXJuKGU9PT1KQnx8ZT09PWpCfHxlPT09S0J8fGU9PT1xQikmJnQoIiIpPT1udWxsfWNhdGNoKG4pe31yZXR1cm4hMX0pfXZhciBuTz1qbz9mdW5jdGlvbih0KXtpZihZZyh0KSlyZXR1cm4hMDtpZighdHx8dHlwZW9mIHQhPSJmdW5jdGlvbiImJnR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4hMTt0cnl7am8odCxudWxsLCRnKX1jYXRjaChlKXtpZihlIT09RWYpcmV0dXJuITF9cmV0dXJuIVhnKHQpJiZxZyh0KX06ZnVuY3Rpb24odCl7aWYoWWcodCkpcmV0dXJuITA7aWYoIXR8fHR5cGVvZiB0IT0iZnVuY3Rpb24iJiZ0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuITE7aWYoUUIpcmV0dXJuIHFnKHQpO2lmKFhnKHQpKXJldHVybiExO3ZhciBlPVRmLmNhbGwodCk7cmV0dXJuIGUhPT1ZQiYmZSE9PVpCJiYhL15cW29iamVjdCBIVE1MLy50ZXN0KGUpPyExOnFnKHQpfSxpTz1uTyxyTz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFdiPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksc089ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wLHM9dC5sZW5ndGg7cjxzO3IrKylXYi5jYWxsKHQscikmJihuPT1udWxsP2UodFtyXSxyLHQpOmUuY2FsbChuLHRbcl0scix0KSl9LG9PPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MCxzPXQubGVuZ3RoO3I8cztyKyspbj09bnVsbD9lKHQuY2hhckF0KHIpLHIsdCk6ZS5jYWxsKG4sdC5jaGFyQXQocikscix0KX0sYU89ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgciBpbiB0KVdiLmNhbGwodCxyKSYmKG49PW51bGw/ZSh0W3JdLHIsdCk6ZS5jYWxsKG4sdFtyXSxyLHQpKX0sbE89ZnVuY3Rpb24odCxlLG4pe2lmKCFpTyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt2YXIgcjthcmd1bWVudHMubGVuZ3RoPj0zJiYocj1uKSxyTy5jYWxsKHQpPT09IltvYmplY3QgQXJyYXldIj9zTyh0LGUscik6dHlwZW9mIHQ9PSJzdHJpbmciP29PKHQsZSxyKTphTyh0LGUscil9LGNPPWxPLHVPPVsiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiQmlnSW50NjRBcnJheSIsIkJpZ1VpbnQ2NEFycmF5Il0sWmc9dU8saE89dHlwZW9mIGdsb2JhbFRoaXM9PSJ1bmRlZmluZWQiP2FmOmdsb2JhbFRoaXMsZk89ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8WmcubGVuZ3RoO2UrKyl0eXBlb2YgaE9bWmdbZV1dPT0iZnVuY3Rpb24iJiYodFt0Lmxlbmd0aF09WmdbZV0pO3JldHVybiB0fSxDZj1jTyxkTz1mTywkYj1ZbyxKZz1uaSxSZj1jZyxwTz1KZygiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLFhiPU9zKCkscWI9dHlwZW9mIGdsb2JhbFRoaXM9PSJ1bmRlZmluZWQiP2FmOmdsb2JhbFRoaXMsamc9ZE8oKSxLZz1KZygiU3RyaW5nLnByb3RvdHlwZS5zbGljZSIpLFFnPU9iamVjdC5nZXRQcm90b3R5cGVPZixtTz1KZygiQXJyYXkucHJvdG90eXBlLmluZGV4T2YiLCEwKXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTEpaWYodFtuXT09PWUpcmV0dXJuIG47cmV0dXJuLTF9LFBmPXtfX3Byb3RvX186bnVsbH07WGImJlJmJiZRZz9DZihqZyxmdW5jdGlvbihpKXt2YXIgdD1uZXcgcWJbaV07aWYoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHQpe3ZhciBlPVFnKHQpLG49UmYoZSxTeW1ib2wudG9TdHJpbmdUYWcpO2lmKCFuKXt2YXIgcj1RZyhlKTtuPVJmKHIsU3ltYm9sLnRvU3RyaW5nVGFnKX1QZlsiJCIraV09JGIobi5nZXQpfX0pOkNmKGpnLGZ1bmN0aW9uKGkpe3ZhciB0PW5ldyBxYltpXSxlPXQuc2xpY2V8fHQuc2V0O2UmJihQZlsiJCIraV09JGIoZSkpfSk7dmFyIGdPPWZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiBDZihQZixmdW5jdGlvbihuLHIpe2lmKCFlKXRyeXsiJCIrbih0KT09PXImJihlPUtnKHIsMSkpfWNhdGNoKHMpe319KSxlfSx5Tz1mdW5jdGlvbih0KXt2YXIgZT0hMTtyZXR1cm4gQ2YoUGYsZnVuY3Rpb24obixyKXtpZighZSl0cnl7bih0KSxlPUtnKHIsMSl9Y2F0Y2gocyl7fX0pLGV9LF9PPWZ1bmN0aW9uKHQpe2lmKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuITE7aWYoIVhiKXt2YXIgZT1LZyhwTyh0KSw4LC0xKTtyZXR1cm4gbU8oamcsZSk+LTE/ZTplIT09Ik9iamVjdCI/ITE6eU8odCl9cmV0dXJuIFJmP2dPKHQpOm51bGx9LHhPPW5pLFliPXhPKCJBcnJheUJ1ZmZlci5wcm90b3R5cGUuYnl0ZUxlbmd0aCIsITApLHZPPVViLFNPPWZ1bmN0aW9uKHQpe3JldHVybiB2Tyh0KT9ZYj9ZYih0KTp0LmJ5dGVMZW5ndGg6TmFOfSxaYj1RVSxEaT1uaSxKYj1iTixNTz1JaSxLbz1CRixiTz1yYixqYj1YRixLYj1PTSxRYj1vYix0MT1VYixlMT1lQixuMT1zQixpMT1hQixyMT1uZyxzMT1GQixvMT0kQixhMT1fTyxsMT1TTyxjMT1EaSgiU2hhcmVkQXJyYXlCdWZmZXIucHJvdG90eXBlLmJ5dGVMZW5ndGgiLCEwKSx1MT1EaSgiRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSIpLHQwPU9iamVjdC5nZXRQcm90b3R5cGVPZixoMT1EaSgiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLElmPU1PKCIlU2V0JSIsITApLGUwPURpKCJNYXAucHJvdG90eXBlLmhhcyIsITApLExmPURpKCJNYXAucHJvdG90eXBlLmdldCIsITApLGYxPURpKCJNYXAucHJvdG90eXBlLnNpemUiLCEwKSxEZj1EaSgiU2V0LnByb3RvdHlwZS5hZGQiLCEwKSxkMT1EaSgiU2V0LnByb3RvdHlwZS5kZWxldGUiLCEwKSxVZj1EaSgiU2V0LnByb3RvdHlwZS5oYXMiLCEwKSxOZj1EaSgiU2V0LnByb3RvdHlwZS5zaXplIiwhMCk7ZnVuY3Rpb24gcDEoaSx0LGUsbil7Zm9yKHZhciByPUtvKGkpLHM7KHM9ci5uZXh0KCkpJiYhcy5kb25lOylpZih4aSh0LHMudmFsdWUsZSxuKSlyZXR1cm4gZDEoaSxzLnZhbHVlKSwhMDtyZXR1cm4hMX1mdW5jdGlvbiBtMShpKXtpZih0eXBlb2YgaT09InVuZGVmaW5lZCIpcmV0dXJuIG51bGw7aWYodHlwZW9mIGkhPSJvYmplY3QiKXJldHVybiB0eXBlb2YgaT09InN5bWJvbCI/ITE6dHlwZW9mIGk9PSJzdHJpbmcifHx0eXBlb2YgaT09Im51bWJlciI/K2k9PStpOiEwfWZ1bmN0aW9uIHdPKGksdCxlLG4scixzKXt2YXIgbz1tMShlKTtpZihvIT1udWxsKXJldHVybiBvO3ZhciBhPUxmKHQsbyksbD1aYih7fSxyLHtzdHJpY3Q6ITF9KTtyZXR1cm4gdHlwZW9mIGE9PSJ1bmRlZmluZWQiJiYhZTAodCxvKXx8IXhpKG4sYSxsLHMpPyExOiFlMChpLG8pJiZ4aShuLGEsbCxzKX1mdW5jdGlvbiBBTyhpLHQsZSl7dmFyIG49bTEoZSk7cmV0dXJuIG4hPW51bGw/bjpVZih0LG4pJiYhVWYoaSxuKX1mdW5jdGlvbiBnMShpLHQsZSxuLHIscyl7Zm9yKHZhciBvPUtvKGkpLGEsbDsoYT1vLm5leHQoKSkmJiFhLmRvbmU7KWlmKGw9YS52YWx1ZSx4aShlLGwscixzKSYmeGkobixMZih0LGwpLHIscykpcmV0dXJuIGQxKGksbCksITA7cmV0dXJuITF9ZnVuY3Rpb24geGkoaSx0LGUsbil7dmFyIHI9ZXx8e307aWYoci5zdHJpY3Q/amIoaSx0KTppPT09dClyZXR1cm4hMDt2YXIgcz1zMShpKSxvPXMxKHQpO2lmKHMhPT1vKXJldHVybiExO2lmKCFpfHwhdHx8dHlwZW9mIGkhPSJvYmplY3QiJiZ0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuIHIuc3RyaWN0P2piKGksdCk6aT09dDt2YXIgYT1uLmhhcyhpKSxsPW4uaGFzKHQpLGM7aWYoYSYmbCl7aWYobi5nZXQoaSk9PT1uLmdldCh0KSlyZXR1cm4hMH1lbHNlIGM9e307cmV0dXJuIGF8fG4uc2V0KGksYyksbHx8bi5zZXQodCxjKSxDTyhpLHQscixuKX1mdW5jdGlvbiB5MShpKXtyZXR1cm4haXx8dHlwZW9mIGkhPSJvYmplY3QifHx0eXBlb2YgaS5sZW5ndGghPSJudW1iZXIifHx0eXBlb2YgaS5jb3B5IT0iZnVuY3Rpb24ifHx0eXBlb2YgaS5zbGljZSE9ImZ1bmN0aW9uInx8aS5sZW5ndGg+MCYmdHlwZW9mIGlbMF0hPSJudW1iZXIiPyExOiEhKGkuY29uc3RydWN0b3ImJmkuY29uc3RydWN0b3IuaXNCdWZmZXImJmkuY29uc3RydWN0b3IuaXNCdWZmZXIoaSkpfWZ1bmN0aW9uIEVPKGksdCxlLG4pe2lmKE5mKGkpIT09TmYodCkpcmV0dXJuITE7Zm9yKHZhciByPUtvKGkpLHM9S28odCksbyxhLGw7KG89ci5uZXh0KCkpJiYhby5kb25lOylpZihvLnZhbHVlJiZ0eXBlb2Ygby52YWx1ZT09Im9iamVjdCIpbHx8KGw9bmV3IElmKSxEZihsLG8udmFsdWUpO2Vsc2UgaWYoIVVmKHQsby52YWx1ZSkpe2lmKGUuc3RyaWN0fHwhQU8oaSx0LG8udmFsdWUpKXJldHVybiExO2x8fChsPW5ldyBJZiksRGYobCxvLnZhbHVlKX1pZihsKXtmb3IoOyhhPXMubmV4dCgpKSYmIWEuZG9uZTspaWYoYS52YWx1ZSYmdHlwZW9mIGEudmFsdWU9PSJvYmplY3QiKXtpZighcDEobCxhLnZhbHVlLGUuc3RyaWN0LG4pKXJldHVybiExfWVsc2UgaWYoIWUuc3RyaWN0JiYhVWYoaSxhLnZhbHVlKSYmIXAxKGwsYS52YWx1ZSxlLnN0cmljdCxuKSlyZXR1cm4hMTtyZXR1cm4gTmYobCk9PT0wfXJldHVybiEwfWZ1bmN0aW9uIFRPKGksdCxlLG4pe2lmKGYxKGkpIT09ZjEodCkpcmV0dXJuITE7Zm9yKHZhciByPUtvKGkpLHM9S28odCksbyxhLGwsYyx1LGg7KG89ci5uZXh0KCkpJiYhby5kb25lOylpZihjPW8udmFsdWVbMF0sdT1vLnZhbHVlWzFdLGMmJnR5cGVvZiBjPT0ib2JqZWN0IilsfHwobD1uZXcgSWYpLERmKGwsYyk7ZWxzZSBpZihoPUxmKHQsYyksdHlwZW9mIGg9PSJ1bmRlZmluZWQiJiYhZTAodCxjKXx8IXhpKHUsaCxlLG4pKXtpZihlLnN0cmljdHx8IXdPKGksdCxjLHUsZSxuKSlyZXR1cm4hMTtsfHwobD1uZXcgSWYpLERmKGwsYyl9aWYobCl7Zm9yKDsoYT1zLm5leHQoKSkmJiFhLmRvbmU7KWlmKGM9YS52YWx1ZVswXSxoPWEudmFsdWVbMV0sYyYmdHlwZW9mIGM9PSJvYmplY3QiKXtpZighZzEobCxpLGMsaCxlLG4pKXJldHVybiExfWVsc2UgaWYoIWUuc3RyaWN0JiYoIWkuaGFzKGMpfHwheGkoTGYoaSxjKSxoLGUsbikpJiYhZzEobCxpLGMsaCxaYih7fSxlLHtzdHJpY3Q6ITF9KSxuKSlyZXR1cm4hMTtyZXR1cm4gTmYobCk9PT0wfXJldHVybiEwfWZ1bmN0aW9uIENPKGksdCxlLG4pe3ZhciByLHM7aWYodHlwZW9mIGkhPXR5cGVvZiB0fHxpPT1udWxsfHx0PT1udWxsfHxoMShpKSE9PWgxKHQpfHxLYihpKSE9PUtiKHQpKXJldHVybiExO3ZhciBvPVFiKGkpLGE9UWIodCk7aWYobyE9PWEpcmV0dXJuITE7dmFyIGw9aSBpbnN0YW5jZW9mIEVycm9yLGM9dCBpbnN0YW5jZW9mIEVycm9yO2lmKGwhPT1jfHwobHx8YykmJihpLm5hbWUhPT10Lm5hbWV8fGkubWVzc2FnZSE9PXQubWVzc2FnZSkpcmV0dXJuITE7dmFyIHU9bjEoaSksaD1uMSh0KTtpZih1IT09aHx8KHV8fGgpJiYoaS5zb3VyY2UhPT10LnNvdXJjZXx8SmIoaSkhPT1KYih0KSkpcmV0dXJuITE7dmFyIGY9ZTEoaSksZD1lMSh0KTtpZihmIT09ZHx8KGZ8fGQpJiZ1MShpKSE9PXUxKHQpfHxlLnN0cmljdCYmdDAmJnQwKGkpIT09dDAodCkpcmV0dXJuITE7dmFyIHA9YTEoaSkseT1hMSh0KTtpZihwIT09eSlyZXR1cm4hMTtpZihwfHx5KXtpZihpLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihyPTA7cjxpLmxlbmd0aDtyKyspaWYoaVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9dmFyIGc9eTEoaSksbT15MSh0KTtpZihnIT09bSlyZXR1cm4hMTtpZihnfHxtKXtpZihpLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihyPTA7cjxpLmxlbmd0aDtyKyspaWYoaVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9dmFyIHY9dDEoaSkseD10MSh0KTtpZih2IT09eClyZXR1cm4hMTtpZih2fHx4KXJldHVybiBsMShpKSE9PWwxKHQpPyExOnR5cGVvZiBVaW50OEFycmF5PT0iZnVuY3Rpb24iJiZ4aShuZXcgVWludDhBcnJheShpKSxuZXcgVWludDhBcnJheSh0KSxlLG4pO3ZhciBfPWkxKGkpLE09aTEodCk7aWYoXyE9PU0pcmV0dXJuITE7aWYoX3x8TSlyZXR1cm4gYzEoaSkhPT1jMSh0KT8hMTp0eXBlb2YgVWludDhBcnJheT09ImZ1bmN0aW9uIiYmeGkobmV3IFVpbnQ4QXJyYXkoaSksbmV3IFVpbnQ4QXJyYXkodCksZSxuKTtpZih0eXBlb2YgaSE9dHlwZW9mIHQpcmV0dXJuITE7dmFyIGI9cjEoaSksQT1yMSh0KTtpZihiLmxlbmd0aCE9PUEubGVuZ3RoKXJldHVybiExO2ZvcihiLnNvcnQoKSxBLnNvcnQoKSxyPWIubGVuZ3RoLTE7cj49MDtyLS0paWYoYltyXSE9QVtyXSlyZXR1cm4hMTtmb3Iocj1iLmxlbmd0aC0xO3I+PTA7ci0tKWlmKHM9YltyXSwheGkoaVtzXSx0W3NdLGUsbikpcmV0dXJuITE7dmFyIEU9bzEoaSksdz1vMSh0KTtyZXR1cm4gRSE9PXc/ITE6RT09PSJTZXQifHx3PT09IlNldCI/RU8oaSx0LGUsbik6RT09PSJNYXAiP1RPKGksdCxlLG4pOiEwfXZhciBSTz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHhpKHQsZSxuLGJPKCkpfSxQTz16RChSTyksSU89T2JqZWN0LmRlZmluZVByb3BlcnR5LGdlPShpLHQpPT5JTyhpLCJuYW1lIix7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSxMTz1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmRpcmVjdGlvbj0hMSx0aGlzLmNvbXBhcmVQcm9wZXJ0aWVzPSEwO3ZhciBlLG4scjt0aGlzLnByZWNpc2lvbj1XcygxMCwtKChlPXQ9PW51bGw/dm9pZCAwOnQucHJlY2lzaW9uKSE9bnVsbD9lOjE3KSksdGhpcy5kaXJlY3Rpb249KG49dD09bnVsbD92b2lkIDA6dC5kaXJlY3Rpb24pIT1udWxsP246ITEsdGhpcy5jb21wYXJlUHJvcGVydGllcz0ocj10PT1udWxsP3ZvaWQgMDp0LmNvbXBhcmVQcm9wZXJ0aWVzKSE9bnVsbD9yOiEwfWNvbXBhcmUodCxlKXtpZih0LnR5cGUhPT1lLnR5cGV8fCFVbCh0LGUpKXJldHVybiExO3N3aXRjaCh0LnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiB0aGlzLmNvbXBhcmVDb29yZCh0LmNvb3JkaW5hdGVzLGUuY29vcmRpbmF0ZXMpO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIHRoaXMuY29tcGFyZUxpbmUodC5jb29yZGluYXRlcyxlLmNvb3JkaW5hdGVzKTtjYXNlIlBvbHlnb24iOnJldHVybiB0aGlzLmNvbXBhcmVQb2x5Z29uKHQsZSk7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybiB0aGlzLmNvbXBhcmVHZW9tZXRyeUNvbGxlY3Rpb24odCxlKTtjYXNlIkZlYXR1cmUiOnJldHVybiB0aGlzLmNvbXBhcmVGZWF0dXJlKHQsZSk7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cmV0dXJuIHRoaXMuY29tcGFyZUZlYXR1cmVDb2xsZWN0aW9uKHQsZSk7ZGVmYXVsdDppZih0LnR5cGUuc3RhcnRzV2l0aCgiTXVsdGkiKSl7Y29uc3Qgbj1uMCh0KSxyPW4wKGUpO3JldHVybiBuLmV2ZXJ5KHM9PnIuc29tZShvPT50aGlzLmNvbXBhcmUocyxvKSkpfX1yZXR1cm4hMX1jb21wYXJlQ29vcmQodCxlKXtyZXR1cm4gdC5sZW5ndGg9PT1lLmxlbmd0aCYmdC5ldmVyeSgobixyKT0+TWF0aC5hYnMobi1lW3JdKTx0aGlzLnByZWNpc2lvbil9Y29tcGFyZUxpbmUodCxlLG49MCxyPSExKXtpZighVWwodCxlKSlyZXR1cm4hMTtjb25zdCBzPXQ7bGV0IG89ZTtpZihyJiYhdGhpcy5jb21wYXJlQ29vcmQoc1swXSxvWzBdKSl7Y29uc3QgbD10aGlzLmZpeFN0YXJ0SW5kZXgobyxzKTtpZihsKW89bDtlbHNlIHJldHVybiExfWNvbnN0IGE9dGhpcy5jb21wYXJlQ29vcmQoc1tuXSxvW25dKTtyZXR1cm4gdGhpcy5kaXJlY3Rpb258fGE/dGhpcy5jb21wYXJlUGF0aChzLG8pOnRoaXMuY29tcGFyZUNvb3JkKHNbbl0sb1tvLmxlbmd0aC0oMStuKV0pP3RoaXMuY29tcGFyZVBhdGgocy5zbGljZSgpLnJldmVyc2UoKSxvKTohMX1maXhTdGFydEluZGV4KHQsZSl7bGV0IG4scj0tMTtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKylpZih0aGlzLmNvbXBhcmVDb29yZCh0W3NdLGVbMF0pKXtyPXM7YnJlYWt9cmV0dXJuIHI+PTAmJihuPVtdLmNvbmNhdCh0LnNsaWNlKHIsdC5sZW5ndGgpLHQuc2xpY2UoMSxyKzEpKSksbn1jb21wYXJlUGF0aCh0LGUpe3JldHVybiB0LmV2ZXJ5KChuLHIpPT50aGlzLmNvbXBhcmVDb29yZChuLGVbcl0pKX1jb21wYXJlUG9seWdvbih0LGUpe2lmKHRoaXMuY29tcGFyZUxpbmUodC5jb29yZGluYXRlc1swXSxlLmNvb3JkaW5hdGVzWzBdLDEsITApKXtjb25zdCBuPXQuY29vcmRpbmF0ZXMuc2xpY2UoMSx0LmNvb3JkaW5hdGVzLmxlbmd0aCkscj1lLmNvb3JkaW5hdGVzLnNsaWNlKDEsZS5jb29yZGluYXRlcy5sZW5ndGgpO3JldHVybiBuLmV2ZXJ5KHM9PnIuc29tZShvPT50aGlzLmNvbXBhcmVMaW5lKHMsbywxLCEwKSkpfXJldHVybiExfWNvbXBhcmVHZW9tZXRyeUNvbGxlY3Rpb24odCxlKXtyZXR1cm4gVWwodC5nZW9tZXRyaWVzLGUuZ2VvbWV0cmllcykmJnRoaXMuY29tcGFyZUJCb3godCxlKSYmdC5nZW9tZXRyaWVzLmV2ZXJ5KChuLHIpPT50aGlzLmNvbXBhcmUobixlLmdlb21ldHJpZXNbcl0pKX1jb21wYXJlRmVhdHVyZSh0LGUpe3JldHVybiB0LmlkPT09ZS5pZCYmKHRoaXMuY29tcGFyZVByb3BlcnRpZXM/UE8odC5wcm9wZXJ0aWVzLGUucHJvcGVydGllcyk6ITApJiZ0aGlzLmNvbXBhcmVCQm94KHQsZSkmJnRoaXMuY29tcGFyZSh0Lmdlb21ldHJ5LGUuZ2VvbWV0cnkpfWNvbXBhcmVGZWF0dXJlQ29sbGVjdGlvbih0LGUpe3JldHVybiBVbCh0LmZlYXR1cmVzLGUuZmVhdHVyZXMpJiZ0aGlzLmNvbXBhcmVCQm94KHQsZSkmJnQuZmVhdHVyZXMuZXZlcnkoKG4scik9PnRoaXMuY29tcGFyZShuLGUuZmVhdHVyZXNbcl0pKX1jb21wYXJlQkJveCh0LGUpe3JldHVybiF0LmJib3gmJiFlLmJib3h8fCh0LmJib3gmJmUuYmJveD90aGlzLmNvbXBhcmVDb29yZCh0LmJib3gsZS5iYm94KTohMSl9fTtnZShMTywiR2VvanNvbkVxdWFsaXR5Iik7ZnVuY3Rpb24gVWwoaSx0KXtyZXR1cm4gaS5jb29yZGluYXRlcz9pLmNvb3JkaW5hdGVzLmxlbmd0aD09PXQuY29vcmRpbmF0ZXMubGVuZ3RoOmkubGVuZ3RoPT09dC5sZW5ndGh9Z2UoVWwsInNhbWVMZW5ndGgiKTtmdW5jdGlvbiBuMChpKXtyZXR1cm4gaS5jb29yZGluYXRlcy5tYXAodD0+KHt0eXBlOmkudHlwZS5yZXBsYWNlKCJNdWx0aSIsIiIpLGNvb3JkaW5hdGVzOnR9KSl9Z2UobjAsImV4cGxvZGUiKTt2YXIgV249NjM3MTAwODhlLTEsXzE9e2NlbnRpbWV0ZXJzOlduKjEwMCxjZW50aW1ldHJlczpXbioxMDAsZGVncmVlczozNjAvKDIqTWF0aC5QSSksZmVldDpXbiozLjI4MDg0LGluY2hlczpXbiozOS4zNyxraWxvbWV0ZXJzOlduLzFlMyxraWxvbWV0cmVzOlduLzFlMyxtZXRlcnM6V24sbWV0cmVzOlduLG1pbGVzOlduLzE2MDkuMzQ0LG1pbGxpbWV0ZXJzOlduKjFlMyxtaWxsaW1ldHJlczpXbioxZTMsbmF1dGljYWxtaWxlczpXbi8xODUyLHJhZGlhbnM6MSx5YXJkczpXbioxLjA5MzZ9LHgxPXthY3JlczoyNDcxMDVlLTksY2VudGltZXRlcnM6MWU0LGNlbnRpbWV0cmVzOjFlNCxmZWV0OjEwLjc2MzkxMDQxNyxoZWN0YXJlczoxZS00LGluY2hlczoxNTUwLjAwMzEwMDAwNixraWxvbWV0ZXJzOjFlLTYsa2lsb21ldHJlczoxZS02LG1ldGVyczoxLG1ldHJlczoxLG1pbGVzOjM4NmUtOSxuYXV0aWNhbG1pbGVzOjI5MTU1MzM0OTU5ODEyMjg1ZS0yMyxtaWxsaW1ldGVyczoxZTYsbWlsbGltZXRyZXM6MWU2LHlhcmRzOjEuMTk1OTkwMDQ2fTtmdW5jdGlvbiBWcihpLHQsZT17fSl7Y29uc3Qgbj17dHlwZToiRmVhdHVyZSJ9O3JldHVybihlLmlkPT09MHx8ZS5pZCkmJihuLmlkPWUuaWQpLGUuYmJveCYmKG4uYmJveD1lLmJib3gpLG4ucHJvcGVydGllcz10fHx7fSxuLmdlb21ldHJ5PWksbn1nZShWciwiZmVhdHVyZSIpO2Z1bmN0aW9uIERPKGksdCxlPXt9KXtzd2l0Y2goaSl7Y2FzZSJQb2ludCI6cmV0dXJuIGkwKHQpLmdlb21ldHJ5O2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIHMwKHQpLmdlb21ldHJ5O2Nhc2UiUG9seWdvbiI6cmV0dXJuIHIwKHQpLmdlb21ldHJ5O2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIFMxKHQpLmdlb21ldHJ5O2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjpyZXR1cm4gdjEodCkuZ2VvbWV0cnk7Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiBNMSh0KS5nZW9tZXRyeTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihpKyIgaXMgaW52YWxpZCIpfX1nZShETywiZ2VvbWV0cnkiKTtmdW5jdGlvbiBpMChpLHQsZT17fSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO2lmKGkubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGF0IGxlYXN0IDIgbnVtYmVycyBsb25nIik7aWYoIVFvKGlbMF0pfHwhUW8oaVsxXSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycyIpO3JldHVybiBWcih7dHlwZToiUG9pbnQiLGNvb3JkaW5hdGVzOml9LHQsZSl9Z2UoaTAsInBvaW50Iik7ZnVuY3Rpb24gVU8oaSx0LGU9e30pe3JldHVybiBGZihpLm1hcChuPT5pMChuLHQpKSxlKX1nZShVTywicG9pbnRzIik7ZnVuY3Rpb24gcjAoaSx0LGU9e30pe2Zvcihjb25zdCByIG9mIGkpe2lmKHIubGVuZ3RoPDQpdGhyb3cgbmV3IEVycm9yKCJFYWNoIExpbmVhclJpbmcgb2YgYSBQb2x5Z29uIG11c3QgaGF2ZSA0IG9yIG1vcmUgUG9zaXRpb25zLiIpO2lmKHJbci5sZW5ndGgtMV0ubGVuZ3RoIT09clswXS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBhbmQgbGFzdCBQb3NpdGlvbiBhcmUgbm90IGVxdWl2YWxlbnQuIik7Zm9yKGxldCBzPTA7czxyW3IubGVuZ3RoLTFdLmxlbmd0aDtzKyspaWYocltyLmxlbmd0aC0xXVtzXSE9PXJbMF1bc10pdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBhbmQgbGFzdCBQb3NpdGlvbiBhcmUgbm90IGVxdWl2YWxlbnQuIil9cmV0dXJuIFZyKHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczppfSx0LGUpfWdlKHIwLCJwb2x5Z29uIik7ZnVuY3Rpb24gTk8oaSx0LGU9e30pe3JldHVybiBGZihpLm1hcChuPT5yMChuLHQpKSxlKX1nZShOTywicG9seWdvbnMiKTtmdW5jdGlvbiBzMChpLHQsZT17fSl7aWYoaS5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gYXJyYXkgb2YgdHdvIG9yIG1vcmUgcG9zaXRpb25zIik7cmV0dXJuIFZyKHt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczppfSx0LGUpfWdlKHMwLCJsaW5lU3RyaW5nIik7ZnVuY3Rpb24gRk8oaSx0LGU9e30pe3JldHVybiBGZihpLm1hcChuPT5zMChuLHQpKSxlKX1nZShGTywibGluZVN0cmluZ3MiKTtmdW5jdGlvbiBGZihpLHQ9e30pe2NvbnN0IGU9e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIn07cmV0dXJuIHQuaWQmJihlLmlkPXQuaWQpLHQuYmJveCYmKGUuYmJveD10LmJib3gpLGUuZmVhdHVyZXM9aSxlfWdlKEZmLCJmZWF0dXJlQ29sbGVjdGlvbiIpO2Z1bmN0aW9uIHYxKGksdCxlPXt9KXtyZXR1cm4gVnIoe3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6aX0sdCxlKX1nZSh2MSwibXVsdGlMaW5lU3RyaW5nIik7ZnVuY3Rpb24gUzEoaSx0LGU9e30pe3JldHVybiBWcih7dHlwZToiTXVsdGlQb2ludCIsY29vcmRpbmF0ZXM6aX0sdCxlKX1nZShTMSwibXVsdGlQb2ludCIpO2Z1bmN0aW9uIE0xKGksdCxlPXt9KXtyZXR1cm4gVnIoe3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6aX0sdCxlKX1nZShNMSwibXVsdGlQb2x5Z29uIik7ZnVuY3Rpb24gQk8oaSx0LGU9e30pe3JldHVybiBWcih7dHlwZToiR2VvbWV0cnlDb2xsZWN0aW9uIixnZW9tZXRyaWVzOml9LHQsZSl9Z2UoQk8sImdlb21ldHJ5Q29sbGVjdGlvbiIpO2Z1bmN0aW9uIE9PKGksdD0wKXtpZih0JiYhKHQ+PTApKXRocm93IG5ldyBFcnJvcigicHJlY2lzaW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtjb25zdCBlPU1hdGgucG93KDEwLHR8fDApO3JldHVybiBNYXRoLnJvdW5kKGkqZSkvZX1nZShPTywicm91bmQiKTtmdW5jdGlvbiBiMShpLHQ9ImtpbG9tZXRlcnMiKXtjb25zdCBlPV8xW3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcih0KyIgdW5pdHMgaXMgaW52YWxpZCIpO3JldHVybiBpKmV9Z2UoYjEsInJhZGlhbnNUb0xlbmd0aCIpO2Z1bmN0aW9uIG8wKGksdD0ia2lsb21ldGVycyIpe2NvbnN0IGU9XzFbdF07aWYoIWUpdGhyb3cgbmV3IEVycm9yKHQrIiB1bml0cyBpcyBpbnZhbGlkIik7cmV0dXJuIGkvZX1nZShvMCwibGVuZ3RoVG9SYWRpYW5zIik7ZnVuY3Rpb24gek8oaSx0KXtyZXR1cm4gdzEobzAoaSx0KSl9Z2Uoek8sImxlbmd0aFRvRGVncmVlcyIpO2Z1bmN0aW9uIGtPKGkpe2xldCB0PWklMzYwO3JldHVybiB0PDAmJih0Kz0zNjApLHR9Z2Uoa08sImJlYXJpbmdUb0F6aW11dGgiKTtmdW5jdGlvbiB3MShpKXtyZXR1cm4gaSUoMipNYXRoLlBJKSoxODAvTWF0aC5QSX1nZSh3MSwicmFkaWFuc1RvRGVncmVlcyIpO2Z1bmN0aW9uIFZPKGkpe3JldHVybiBpJTM2MCpNYXRoLlBJLzE4MH1nZShWTywiZGVncmVlc1RvUmFkaWFucyIpO2Z1bmN0aW9uIEdPKGksdD0ia2lsb21ldGVycyIsZT0ia2lsb21ldGVycyIpe2lmKCEoaT49MCkpdGhyb3cgbmV3IEVycm9yKCJsZW5ndGggbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3JldHVybiBiMShvMChpLHQpLGUpfWdlKEdPLCJjb252ZXJ0TGVuZ3RoIik7ZnVuY3Rpb24gSE8oaSx0PSJtZXRlcnMiLGU9ImtpbG9tZXRlcnMiKXtpZighKGk+PTApKXRocm93IG5ldyBFcnJvcigiYXJlYSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7Y29uc3Qgbj14MVt0XTtpZighbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgb3JpZ2luYWwgdW5pdHMiKTtjb25zdCByPXgxW2VdO2lmKCFyKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmaW5hbCB1bml0cyIpO3JldHVybiBpL24qcn1nZShITywiY29udmVydEFyZWEiKTtmdW5jdGlvbiBRbyhpKXtyZXR1cm4haXNOYU4oaSkmJmkhPT1udWxsJiYhQXJyYXkuaXNBcnJheShpKX1nZShRbywiaXNOdW1iZXIiKTtmdW5jdGlvbiBXTyhpKXtyZXR1cm4gaSE9PW51bGwmJnR5cGVvZiBpPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaSl9Z2UoV08sImlzT2JqZWN0Iik7ZnVuY3Rpb24gJE8oaSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJiYm94IGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoaSkpdGhyb3cgbmV3IEVycm9yKCJiYm94IG11c3QgYmUgYW4gQXJyYXkiKTtpZihpLmxlbmd0aCE9PTQmJmkubGVuZ3RoIT09Nil0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSBvZiA0IG9yIDYgbnVtYmVycyIpO2kuZm9yRWFjaCh0PT57aWYoIVFvKHQpKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzIil9KX1nZSgkTywidmFsaWRhdGVCQm94Iik7ZnVuY3Rpb24gWE8oaSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJpZCBpcyByZXF1aXJlZCIpO2lmKFsic3RyaW5nIiwibnVtYmVyIl0uaW5kZXhPZih0eXBlb2YgaSk9PT0tMSl0aHJvdyBuZXcgRXJyb3IoImlkIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmciKX1nZShYTywidmFsaWRhdGVJZCIpO3ZhciBxTz1PYmplY3QuZGVmaW5lUHJvcGVydHksR3I9KGksdCk9PnFPKGksIm5hbWUiLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pO2Z1bmN0aW9uIFlPKGkpe2lmKCFpKXRocm93IG5ldyBFcnJvcigiY29vcmQgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShpKSl7aWYoaS50eXBlPT09IkZlYXR1cmUiJiZpLmdlb21ldHJ5IT09bnVsbCYmaS5nZW9tZXRyeS50eXBlPT09IlBvaW50IilyZXR1cm5bLi4uaS5nZW9tZXRyeS5jb29yZGluYXRlc107aWYoaS50eXBlPT09IlBvaW50IilyZXR1cm5bLi4uaS5jb29yZGluYXRlc119aWYoQXJyYXkuaXNBcnJheShpKSYmaS5sZW5ndGg+PTImJiFBcnJheS5pc0FycmF5KGlbMF0pJiYhQXJyYXkuaXNBcnJheShpWzFdKSlyZXR1cm5bLi4uaV07dGhyb3cgbmV3IEVycm9yKCJjb29yZCBtdXN0IGJlIEdlb0pTT04gUG9pbnQgb3IgYW4gQXJyYXkgb2YgbnVtYmVycyIpfUdyKFlPLCJnZXRDb29yZCIpO2Z1bmN0aW9uIEExKGkpe2lmKEFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIGk7aWYoaS50eXBlPT09IkZlYXR1cmUiKXtpZihpLmdlb21ldHJ5IT09bnVsbClyZXR1cm4gaS5nZW9tZXRyeS5jb29yZGluYXRlc31lbHNlIGlmKGkuY29vcmRpbmF0ZXMpcmV0dXJuIGkuY29vcmRpbmF0ZXM7dGhyb3cgbmV3IEVycm9yKCJjb29yZHMgbXVzdCBiZSBHZW9KU09OIEZlYXR1cmUsIEdlb21ldHJ5IE9iamVjdCBvciBhbiBBcnJheSIpfUdyKEExLCJnZXRDb29yZHMiKTtmdW5jdGlvbiBFMShpKXtpZihpLmxlbmd0aD4xJiZRbyhpWzBdKSYmUW8oaVsxXSkpcmV0dXJuITA7aWYoQXJyYXkuaXNBcnJheShpWzBdKSYmaVswXS5sZW5ndGgpcmV0dXJuIEUxKGlbMF0pO3Rocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVycyIpfUdyKEUxLCJjb250YWluc051bWJlciIpO2Z1bmN0aW9uIFpPKGksdCxlKXtpZighdHx8IWUpdGhyb3cgbmV3IEVycm9yKCJ0eXBlIGFuZCBuYW1lIHJlcXVpcmVkIik7aWYoIWl8fGkudHlwZSE9PXQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrZSsiOiBtdXN0IGJlIGEgIit0KyIsIGdpdmVuICIraS50eXBlKX1HcihaTywiZ2VvanNvblR5cGUiKTtmdW5jdGlvbiBKTyhpLHQsZSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJObyBmZWF0dXJlIHBhc3NlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiLmZlYXR1cmVPZigpIHJlcXVpcmVzIGEgbmFtZSIpO2lmKCFpfHxpLnR5cGUhPT0iRmVhdHVyZSJ8fCFpLmdlb21ldHJ5KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK2UrIiwgRmVhdHVyZSB3aXRoIGdlb21ldHJ5IHJlcXVpcmVkIik7aWYoIWkuZ2VvbWV0cnl8fGkuZ2VvbWV0cnkudHlwZSE9PXQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrZSsiOiBtdXN0IGJlIGEgIit0KyIsIGdpdmVuICIraS5nZW9tZXRyeS50eXBlKX1HcihKTywiZmVhdHVyZU9mIik7ZnVuY3Rpb24gak8oaSx0LGUpe2lmKCFpKXRocm93IG5ldyBFcnJvcigiTm8gZmVhdHVyZUNvbGxlY3Rpb24gcGFzc2VkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCIuY29sbGVjdGlvbk9mKCkgcmVxdWlyZXMgYSBuYW1lIik7aWYoIWl8fGkudHlwZSE9PSJGZWF0dXJlQ29sbGVjdGlvbiIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrZSsiLCBGZWF0dXJlQ29sbGVjdGlvbiByZXF1aXJlZCIpO2Zvcihjb25zdCBuIG9mIGkuZmVhdHVyZXMpe2lmKCFufHxuLnR5cGUhPT0iRmVhdHVyZSJ8fCFuLmdlb21ldHJ5KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK2UrIiwgRmVhdHVyZSB3aXRoIGdlb21ldHJ5IHJlcXVpcmVkIik7aWYoIW4uZ2VvbWV0cnl8fG4uZ2VvbWV0cnkudHlwZSE9PXQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrZSsiOiBtdXN0IGJlIGEgIit0KyIsIGdpdmVuICIrbi5nZW9tZXRyeS50eXBlKX19R3Ioak8sImNvbGxlY3Rpb25PZiIpO2Z1bmN0aW9uIEtPKGkpe3JldHVybiBpLnR5cGU9PT0iRmVhdHVyZSI/aS5nZW9tZXRyeTppfUdyKEtPLCJnZXRHZW9tIik7ZnVuY3Rpb24gUU8oaSx0KXtyZXR1cm4gaS50eXBlPT09IkZlYXR1cmVDb2xsZWN0aW9uIj8iRmVhdHVyZUNvbGxlY3Rpb24iOmkudHlwZT09PSJHZW9tZXRyeUNvbGxlY3Rpb24iPyJHZW9tZXRyeUNvbGxlY3Rpb24iOmkudHlwZT09PSJGZWF0dXJlIiYmaS5nZW9tZXRyeSE9PW51bGw/aS5nZW9tZXRyeS50eXBlOmkudHlwZX1HcihRTywiZ2V0VHlwZSIpO3ZhciB0ej1PYmplY3QuZGVmaW5lUHJvcGVydHksZXo9KGksdCk9PnR6KGksIm5hbWUiLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pO2Z1bmN0aW9uIFQxKGkpe2NvbnN0IHQ9QTEoaSk7bGV0IGU9MCxuPTEscixzO2Zvcig7bjx0Lmxlbmd0aDspcj1zfHx0WzBdLHM9dFtuXSxlKz0oc1swXS1yWzBdKSooc1sxXStyWzFdKSxuKys7cmV0dXJuIGU+MH1leihUMSwiYm9vbGVhbkNsb2Nrd2lzZSIpO3ZhciBuej1UMTtjb25zdCBmcj0xMTEwMjIzMDI0NjI1MTU2NWUtMzIscm49MTM0MjE3NzI5LGl6PSgzKzgqZnIpKmZyO2Z1bmN0aW9uIGEwKGksdCxlLG4scil7bGV0IHMsbyxhLGwsYz10WzBdLHU9blswXSxoPTAsZj0wO3U+Yz09dT4tYz8ocz1jLGM9dFsrK2hdKToocz11LHU9blsrK2ZdKTtsZXQgZD0wO2lmKGg8aSYmZjxlKWZvcih1PmM9PXU+LWM/KG89YytzLGE9cy0oby1jKSxjPXRbKytoXSk6KG89dStzLGE9cy0oby11KSx1PW5bKytmXSkscz1vLGEhPT0wJiYocltkKytdPWEpO2g8aSYmZjxlOyl1PmM9PXU+LWM/KG89cytjLGw9by1zLGE9cy0oby1sKSsoYy1sKSxjPXRbKytoXSk6KG89cyt1LGw9by1zLGE9cy0oby1sKSsodS1sKSx1PW5bKytmXSkscz1vLGEhPT0wJiYocltkKytdPWEpO2Zvcig7aDxpOylvPXMrYyxsPW8tcyxhPXMtKG8tbCkrKGMtbCksYz10WysraF0scz1vLGEhPT0wJiYocltkKytdPWEpO2Zvcig7ZjxlOylvPXMrdSxsPW8tcyxhPXMtKG8tbCkrKHUtbCksdT1uWysrZl0scz1vLGEhPT0wJiYocltkKytdPWEpO3JldHVybihzIT09MHx8ZD09PTApJiYocltkKytdPXMpLGR9ZnVuY3Rpb24gcnooaSx0KXtsZXQgZT10WzBdO2ZvcihsZXQgbj0xO248aTtuKyspZSs9dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBObChpKXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheShpKX1jb25zdCBzej0oMysxNipmcikqZnIsb3o9KDIrMTIqZnIpKmZyLGF6PSg5KzY0KmZyKSpmcipmcix0YT1ObCg0KSxDMT1ObCg4KSxSMT1ObCgxMiksUDE9TmwoMTYpLHluPU5sKDQpO2Z1bmN0aW9uIGx6KGksdCxlLG4scixzLG8pe2xldCBhLGwsYyx1LGgsZixkLHAseSxnLG0sdix4LF8sTSxiLEEsRTtjb25zdCB3PWktcixTPWUtcixUPXQtcyxEPW4tcztfPXcqRCxmPXJuKncsZD1mLShmLXcpLHA9dy1kLGY9cm4qRCx5PWYtKGYtRCksZz1ELXksTT1wKmctKF8tZCp5LXAqeS1kKmcpLGI9VCpTLGY9cm4qVCxkPWYtKGYtVCkscD1ULWQsZj1ybipTLHk9Zi0oZi1TKSxnPVMteSxBPXAqZy0oYi1kKnktcCp5LWQqZyksbT1NLUEsaD1NLW0sdGFbMF09TS0obStoKSsoaC1BKSx2PV8rbSxoPXYtXyx4PV8tKHYtaCkrKG0taCksbT14LWIsaD14LW0sdGFbMV09eC0obStoKSsoaC1iKSxFPXYrbSxoPUUtdix0YVsyXT12LShFLWgpKyhtLWgpLHRhWzNdPUU7bGV0IEw9cnooNCx0YSksTj1veipvO2lmKEw+PU58fC1MPj1OfHwoaD1pLXcsYT1pLSh3K2gpKyhoLXIpLGg9ZS1TLGM9ZS0oUytoKSsoaC1yKSxoPXQtVCxsPXQtKFQraCkrKGgtcyksaD1uLUQsdT1uLShEK2gpKyhoLXMpLGE9PT0wJiZsPT09MCYmYz09PTAmJnU9PT0wKXx8KE49YXoqbytpeipNYXRoLmFicyhMKSxMKz13KnUrRCphLShUKmMrUypsKSxMPj1OfHwtTD49TikpcmV0dXJuIEw7Xz1hKkQsZj1ybiphLGQ9Zi0oZi1hKSxwPWEtZCxmPXJuKkQseT1mLShmLUQpLGc9RC15LE09cCpnLShfLWQqeS1wKnktZCpnKSxiPWwqUyxmPXJuKmwsZD1mLShmLWwpLHA9bC1kLGY9cm4qUyx5PWYtKGYtUyksZz1TLXksQT1wKmctKGItZCp5LXAqeS1kKmcpLG09TS1BLGg9TS1tLHluWzBdPU0tKG0raCkrKGgtQSksdj1fK20saD12LV8seD1fLSh2LWgpKyhtLWgpLG09eC1iLGg9eC1tLHluWzFdPXgtKG0raCkrKGgtYiksRT12K20saD1FLXYseW5bMl09di0oRS1oKSsobS1oKSx5blszXT1FO2NvbnN0IEY9YTAoNCx0YSw0LHluLEMxKTtfPXcqdSxmPXJuKncsZD1mLShmLXcpLHA9dy1kLGY9cm4qdSx5PWYtKGYtdSksZz11LXksTT1wKmctKF8tZCp5LXAqeS1kKmcpLGI9VCpjLGY9cm4qVCxkPWYtKGYtVCkscD1ULWQsZj1ybipjLHk9Zi0oZi1jKSxnPWMteSxBPXAqZy0oYi1kKnktcCp5LWQqZyksbT1NLUEsaD1NLW0seW5bMF09TS0obStoKSsoaC1BKSx2PV8rbSxoPXYtXyx4PV8tKHYtaCkrKG0taCksbT14LWIsaD14LW0seW5bMV09eC0obStoKSsoaC1iKSxFPXYrbSxoPUUtdix5blsyXT12LShFLWgpKyhtLWgpLHluWzNdPUU7Y29uc3QgQj1hMChGLEMxLDQseW4sUjEpO189YSp1LGY9cm4qYSxkPWYtKGYtYSkscD1hLWQsZj1ybip1LHk9Zi0oZi11KSxnPXUteSxNPXAqZy0oXy1kKnktcCp5LWQqZyksYj1sKmMsZj1ybipsLGQ9Zi0oZi1sKSxwPWwtZCxmPXJuKmMseT1mLShmLWMpLGc9Yy15LEE9cCpnLShiLWQqeS1wKnktZCpnKSxtPU0tQSxoPU0tbSx5blswXT1NLShtK2gpKyhoLUEpLHY9XyttLGg9di1fLHg9Xy0odi1oKSsobS1oKSxtPXgtYixoPXgtbSx5blsxXT14LShtK2gpKyhoLWIpLEU9dittLGg9RS12LHluWzJdPXYtKEUtaCkrKG0taCkseW5bM109RTtjb25zdCBHPWEwKEIsUjEsNCx5bixQMSk7cmV0dXJuIFAxW0ctMV19ZnVuY3Rpb24gQmYoaSx0LGUsbixyLHMpe2NvbnN0IG89KHQtcykqKGUtciksYT0oaS1yKSoobi1zKSxsPW8tYTtpZihvPT09MHx8YT09PTB8fG8+MCE9YT4wKXJldHVybiBsO2NvbnN0IGM9TWF0aC5hYnMobythKTtyZXR1cm4gTWF0aC5hYnMobCk+PXN6KmM/bDotbHooaSx0LGUsbixyLHMsYyl9Y29uc3QgSTE9TWF0aC5wb3coMiwtNTIpLE9mPW5ldyBVaW50MzJBcnJheSg1MTIpO2NsYXNzIEZse3N0YXRpYyBmcm9tKHQsZT1keixuPXB6KXtjb25zdCByPXQubGVuZ3RoLHM9bmV3IEZsb2F0NjRBcnJheShyKjIpO2ZvcihsZXQgbz0wO288cjtvKyspe2NvbnN0IGE9dFtvXTtzWzIqb109ZShhKSxzWzIqbysxXT1uKGEpfXJldHVybiBuZXcgRmwocyl9Y29uc3RydWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aD4+MTtpZihlPjAmJnR5cGVvZiB0WzBdIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGNvb3JkcyB0byBjb250YWluIG51bWJlcnMuIik7dGhpcy5jb29yZHM9dDtjb25zdCBuPU1hdGgubWF4KDIqZS01LDApO3RoaXMuX3RyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkobiozKSx0aGlzLl9oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkobiozKSx0aGlzLl9oYXNoU2l6ZT1NYXRoLmNlaWwoTWF0aC5zcXJ0KGUpKSx0aGlzLl9odWxsUHJldj1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbE5leHQ9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxUcmk9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxIYXNoPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hhc2hTaXplKS5maWxsKC0xKSx0aGlzLl9pZHM9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2Rpc3RzPW5ldyBGbG9hdDY0QXJyYXkoZSksdGhpcy51cGRhdGUoKX11cGRhdGUoKXtjb25zdHtjb29yZHM6dCxfaHVsbFByZXY6ZSxfaHVsbE5leHQ6bixfaHVsbFRyaTpyLF9odWxsSGFzaDpzfT10aGlzLG89dC5sZW5ndGg+PjE7bGV0IGE9MS8wLGw9MS8wLGM9LTEvMCx1PS0xLzA7Zm9yKGxldCBTPTA7UzxvO1MrKyl7Y29uc3QgVD10WzIqU10sRD10WzIqUysxXTtUPGEmJihhPVQpLEQ8bCYmKGw9RCksVD5jJiYoYz1UKSxEPnUmJih1PUQpLHRoaXMuX2lkc1tTXT1TfWNvbnN0IGg9KGErYykvMixmPShsK3UpLzI7bGV0IGQ9MS8wLHAseSxnO2ZvcihsZXQgUz0wO1M8bztTKyspe2NvbnN0IFQ9bDAoaCxmLHRbMipTXSx0WzIqUysxXSk7VDxkJiYocD1TLGQ9VCl9Y29uc3QgbT10WzIqcF0sdj10WzIqcCsxXTtkPTEvMDtmb3IobGV0IFM9MDtTPG87UysrKXtpZihTPT09cCljb250aW51ZTtjb25zdCBUPWwwKG0sdix0WzIqU10sdFsyKlMrMV0pO1Q8ZCYmVD4wJiYoeT1TLGQ9VCl9bGV0IHg9dFsyKnldLF89dFsyKnkrMV0sTT0xLzA7Zm9yKGxldCBTPTA7UzxvO1MrKyl7aWYoUz09PXB8fFM9PT15KWNvbnRpbnVlO2NvbnN0IFQ9aHoobSx2LHgsXyx0WzIqU10sdFsyKlMrMV0pO1Q8TSYmKGc9UyxNPVQpfWxldCBiPXRbMipnXSxBPXRbMipnKzFdO2lmKE09PT0xLzApe2ZvcihsZXQgRD0wO0Q8bztEKyspdGhpcy5fZGlzdHNbRF09dFsyKkRdLXRbMF18fHRbMipEKzFdLXRbMV07ZWEodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKTtjb25zdCBTPW5ldyBVaW50MzJBcnJheShvKTtsZXQgVD0wO2ZvcihsZXQgRD0wLEw9LTEvMDtEPG87RCsrKXtjb25zdCBOPXRoaXMuX2lkc1tEXTt0aGlzLl9kaXN0c1tOXT5MJiYoU1tUKytdPU4sTD10aGlzLl9kaXN0c1tOXSl9dGhpcy5odWxsPVMuc3ViYXJyYXkoMCxUKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdGhpcy5oYWxmZWRnZXM9bmV3IFVpbnQzMkFycmF5KDApO3JldHVybn1pZihCZihtLHYseCxfLGIsQSk8MCl7Y29uc3QgUz15LFQ9eCxEPV87eT1nLHg9YixfPUEsZz1TLGI9VCxBPUR9Y29uc3QgRT1meihtLHYseCxfLGIsQSk7dGhpcy5fY3g9RS54LHRoaXMuX2N5PUUueTtmb3IobGV0IFM9MDtTPG87UysrKXRoaXMuX2Rpc3RzW1NdPWwwKHRbMipTXSx0WzIqUysxXSxFLngsRS55KTtlYSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpLHRoaXMuX2h1bGxTdGFydD1wO2xldCB3PTM7bltwXT1lW2ddPXksblt5XT1lW3BdPWcsbltnXT1lW3ldPXAscltwXT0wLHJbeV09MSxyW2ddPTIscy5maWxsKC0xKSxzW3RoaXMuX2hhc2hLZXkobSx2KV09cCxzW3RoaXMuX2hhc2hLZXkoeCxfKV09eSxzW3RoaXMuX2hhc2hLZXkoYixBKV09Zyx0aGlzLnRyaWFuZ2xlc0xlbj0wLHRoaXMuX2FkZFRyaWFuZ2xlKHAseSxnLC0xLC0xLC0xKTtmb3IobGV0IFM9MCxULEQ7Uzx0aGlzLl9pZHMubGVuZ3RoO1MrKyl7Y29uc3QgTD10aGlzLl9pZHNbU10sTj10WzIqTF0sRj10WzIqTCsxXTtpZihTPjAmJk1hdGguYWJzKE4tVCk8PUkxJiZNYXRoLmFicyhGLUQpPD1JMXx8KFQ9TixEPUYsTD09PXB8fEw9PT15fHxMPT09ZykpY29udGludWU7bGV0IEI9MDtmb3IobGV0IGh0PTAsUHQ9dGhpcy5faGFzaEtleShOLEYpO2h0PHRoaXMuX2hhc2hTaXplJiYoQj1zWyhQdCtodCkldGhpcy5faGFzaFNpemVdLCEoQiE9PS0xJiZCIT09bltCXSkpO2h0KyspO0I9ZVtCXTtsZXQgRz1CLGs7Zm9yKDtrPW5bR10sQmYoTixGLHRbMipHXSx0WzIqRysxXSx0WzIqa10sdFsyKmsrMV0pPj0wOylpZihHPWssRz09PUIpe0c9LTE7YnJlYWt9aWYoRz09PS0xKWNvbnRpbnVlO2xldCBRPXRoaXMuX2FkZFRyaWFuZ2xlKEcsTCxuW0ddLC0xLC0xLHJbR10pO3JbTF09dGhpcy5fbGVnYWxpemUoUSsyKSxyW0ddPVEsdysrO2xldCBjdD1uW0ddO2Zvcig7az1uW2N0XSxCZihOLEYsdFsyKmN0XSx0WzIqY3QrMV0sdFsyKmtdLHRbMiprKzFdKTwwOylRPXRoaXMuX2FkZFRyaWFuZ2xlKGN0LEwsayxyW0xdLC0xLHJbY3RdKSxyW0xdPXRoaXMuX2xlZ2FsaXplKFErMiksbltjdF09Y3Qsdy0tLGN0PWs7aWYoRz09PUIpZm9yKDtrPWVbR10sQmYoTixGLHRbMiprXSx0WzIqaysxXSx0WzIqR10sdFsyKkcrMV0pPDA7KVE9dGhpcy5fYWRkVHJpYW5nbGUoayxMLEcsLTEscltHXSxyW2tdKSx0aGlzLl9sZWdhbGl6ZShRKzIpLHJba109USxuW0ddPUcsdy0tLEc9azt0aGlzLl9odWxsU3RhcnQ9ZVtMXT1HLG5bR109ZVtjdF09TCxuW0xdPWN0LHNbdGhpcy5faGFzaEtleShOLEYpXT1MLHNbdGhpcy5faGFzaEtleSh0WzIqR10sdFsyKkcrMV0pXT1HfXRoaXMuaHVsbD1uZXcgVWludDMyQXJyYXkodyk7Zm9yKGxldCBTPTAsVD10aGlzLl9odWxsU3RhcnQ7Uzx3O1MrKyl0aGlzLmh1bGxbU109VCxUPW5bVF07dGhpcy50cmlhbmdsZXM9dGhpcy5fdHJpYW5nbGVzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pLHRoaXMuaGFsZmVkZ2VzPXRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKX1faGFzaEtleSh0LGUpe3JldHVybiBNYXRoLmZsb29yKGN6KHQtdGhpcy5fY3gsZS10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZSh0KXtjb25zdHtfdHJpYW5nbGVzOmUsX2hhbGZlZGdlczpuLGNvb3JkczpyfT10aGlzO2xldCBzPTAsbz0wO2Zvcig7Oyl7Y29uc3QgYT1uW3RdLGw9dC10JTM7aWYobz1sKyh0KzIpJTMsYT09PS0xKXtpZihzPT09MClicmVhazt0PU9mWy0tc107Y29udGludWV9Y29uc3QgYz1hLWElMyx1PWwrKHQrMSklMyxoPWMrKGErMiklMyxmPWVbb10sZD1lW3RdLHA9ZVt1XSx5PWVbaF07aWYodXooclsyKmZdLHJbMipmKzFdLHJbMipkXSxyWzIqZCsxXSxyWzIqcF0sclsyKnArMV0sclsyKnldLHJbMip5KzFdKSl7ZVt0XT15LGVbYV09Zjtjb25zdCBtPW5baF07aWYobT09PS0xKXtsZXQgeD10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVt4XT09PWgpe3RoaXMuX2h1bGxUcmlbeF09dDticmVha314PXRoaXMuX2h1bGxQcmV2W3hdfXdoaWxlKHghPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsodCxtKSx0aGlzLl9saW5rKGEsbltvXSksdGhpcy5fbGluayhvLGgpO2NvbnN0IHY9YysoYSsxKSUzO3M8T2YubGVuZ3RoJiYoT2ZbcysrXT12KX1lbHNle2lmKHM9PT0wKWJyZWFrO3Q9T2ZbLS1zXX19cmV0dXJuIG99X2xpbmsodCxlKXt0aGlzLl9oYWxmZWRnZXNbdF09ZSxlIT09LTEmJih0aGlzLl9oYWxmZWRnZXNbZV09dCl9X2FkZFRyaWFuZ2xlKHQsZSxuLHIscyxvKXtjb25zdCBhPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbYV09dCx0aGlzLl90cmlhbmdsZXNbYSsxXT1lLHRoaXMuX3RyaWFuZ2xlc1thKzJdPW4sdGhpcy5fbGluayhhLHIpLHRoaXMuX2xpbmsoYSsxLHMpLHRoaXMuX2xpbmsoYSsyLG8pLHRoaXMudHJpYW5nbGVzTGVuKz0zLGF9fWZ1bmN0aW9uIGN6KGksdCl7Y29uc3QgZT1pLyhNYXRoLmFicyhpKStNYXRoLmFicyh0KSk7cmV0dXJuKHQ+MD8zLWU6MStlKS80fWZ1bmN0aW9uIGwwKGksdCxlLG4pe2NvbnN0IHI9aS1lLHM9dC1uO3JldHVybiByKnIrcypzfWZ1bmN0aW9uIHV6KGksdCxlLG4scixzLG8sYSl7Y29uc3QgbD1pLW8sYz10LWEsdT1lLW8saD1uLWEsZj1yLW8sZD1zLWEscD1sKmwrYypjLHk9dSp1K2gqaCxnPWYqZitkKmQ7cmV0dXJuIGwqKGgqZy15KmQpLWMqKHUqZy15KmYpK3AqKHUqZC1oKmYpPDB9ZnVuY3Rpb24gaHooaSx0LGUsbixyLHMpe2NvbnN0IG89ZS1pLGE9bi10LGw9ci1pLGM9cy10LHU9bypvK2EqYSxoPWwqbCtjKmMsZj0uNS8obypjLWEqbCksZD0oYyp1LWEqaCkqZixwPShvKmgtbCp1KSpmO3JldHVybiBkKmQrcCpwfWZ1bmN0aW9uIGZ6KGksdCxlLG4scixzKXtjb25zdCBvPWUtaSxhPW4tdCxsPXItaSxjPXMtdCx1PW8qbythKmEsaD1sKmwrYypjLGY9LjUvKG8qYy1hKmwpLGQ9aSsoYyp1LWEqaCkqZixwPXQrKG8qaC1sKnUpKmY7cmV0dXJue3g6ZCx5OnB9fWZ1bmN0aW9uIGVhKGksdCxlLG4pe2lmKG4tZTw9MjApZm9yKGxldCByPWUrMTtyPD1uO3IrKyl7Y29uc3Qgcz1pW3JdLG89dFtzXTtsZXQgYT1yLTE7Zm9yKDthPj1lJiZ0W2lbYV1dPm87KWlbYSsxXT1pW2EtLV07aVthKzFdPXN9ZWxzZXtjb25zdCByPWUrbj4+MTtsZXQgcz1lKzEsbz1uO0JsKGkscixzKSx0W2lbZV1dPnRbaVtuXV0mJkJsKGksZSxuKSx0W2lbc11dPnRbaVtuXV0mJkJsKGkscyxuKSx0W2lbZV1dPnRbaVtzXV0mJkJsKGksZSxzKTtjb25zdCBhPWlbc10sbD10W2FdO2Zvcig7Oyl7ZG8gcysrO3doaWxlKHRbaVtzXV08bCk7ZG8gby0tO3doaWxlKHRbaVtvXV0+bCk7aWYobzxzKWJyZWFrO0JsKGkscyxvKX1pW2UrMV09aVtvXSxpW29dPWEsbi1zKzE+PW8tZT8oZWEoaSx0LHMsbiksZWEoaSx0LGUsby0xKSk6KGVhKGksdCxlLG8tMSksZWEoaSx0LHMsbikpfX1mdW5jdGlvbiBCbChpLHQsZSl7Y29uc3Qgbj1pW3RdO2lbdF09aVtlXSxpW2VdPW59ZnVuY3Rpb24gZHooaSl7cmV0dXJuIGlbMF19ZnVuY3Rpb24gcHooaSl7cmV0dXJuIGlbMV19ZnVuY3Rpb24gbXooaSx0KXt2YXIgZT0wLG49MCxyPTAscz0wLG89MCxhPTAsbD0wLGM9MCx1PW51bGwsaD1udWxsLGY9aVswXSxkPWlbMV0scD10Lmxlbmd0aDtmb3IoZTtlPHA7ZSsrKXtuPTA7dmFyIHk9dFtlXS5sZW5ndGgtMSxnPXRbZV07aWYodT1nWzBdLHVbMF0hPT1nW3ldWzBdJiZ1WzFdIT09Z1t5XVsxXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IGNvb3JkaW5hdGVzIGluIGEgcmluZyBtdXN0IGJlIHRoZSBzYW1lIik7Zm9yKG89dVswXS1mLGE9dVsxXS1kLG47bjx5O24rKyl7aWYoaD1nW24rMV0sYz1oWzFdLWQsYTwwJiZjPDB8fGE+MCYmYz4wKXt1PWgsYT1jLG89dVswXS1mO2NvbnRpbnVlfWlmKGw9aFswXS1pWzBdLGM+MCYmYTw9MCl7aWYocz1vKmMtbCphLHM+MClyPXIrMTtlbHNlIGlmKHM9PT0wKXJldHVybiAwfWVsc2UgaWYoYT4wJiZjPD0wKXtpZihzPW8qYy1sKmEsczwwKXI9cisxO2Vsc2UgaWYocz09PTApcmV0dXJuIDB9ZWxzZSBpZihjPT09MCYmYTwwKXtpZihzPW8qYy1sKmEscz09PTApcmV0dXJuIDB9ZWxzZSBpZihhPT09MCYmYzwwKXtpZihzPW8qYy1sKmEscz09PTApcmV0dXJuIDB9ZWxzZSBpZihhPT09MCYmYz09PTApe2lmKGw8PTAmJm8+PTApcmV0dXJuIDA7aWYobzw9MCYmbD49MClyZXR1cm4gMH11PWgsYT1jLG89bH19cmV0dXJuIHIlMiE9PTB9ZnVuY3Rpb24gZ3ooaSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXtpZihpLnR5cGU9PT0iRmVhdHVyZSImJmkuZ2VvbWV0cnkhPT1udWxsJiZpLmdlb21ldHJ5LnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmdlb21ldHJ5LmNvb3JkaW5hdGVzXTtpZihpLnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmNvb3JkaW5hdGVzXX1pZihBcnJheS5pc0FycmF5KGkpJiZpLmxlbmd0aD49MiYmIUFycmF5LmlzQXJyYXkoaVswXSkmJiFBcnJheS5pc0FycmF5KGlbMV0pKXJldHVyblsuLi5pXTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9ZnVuY3Rpb24geXooaSl7cmV0dXJuIGkudHlwZT09PSJGZWF0dXJlIj9pLmdlb21ldHJ5Oml9ZnVuY3Rpb24gX3ooaSx0LGU9e30pe2lmKCFpKXRocm93IG5ldyBFcnJvcigicG9pbnQgaXMgcmVxdWlyZWQiKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInBvbHlnb24gaXMgcmVxdWlyZWQiKTtjb25zdCBuPWd6KGkpLHI9eXoodCkscz1yLnR5cGUsbz10LmJib3g7bGV0IGE9ci5jb29yZGluYXRlcztpZihvJiZ4eihuLG8pPT09ITEpcmV0dXJuITE7cz09PSJQb2x5Z29uIiYmKGE9W2FdKTtsZXQgbD0hMTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoOysrYyl7Y29uc3QgdT1teihuLGFbY10pO2lmKHU9PT0wKXJldHVybiFlLmlnbm9yZUJvdW5kYXJ5O3UmJihsPSEwKX1yZXR1cm4gbH1mdW5jdGlvbiB4eihpLHQpe3JldHVybiB0WzBdPD1pWzBdJiZ0WzFdPD1pWzFdJiZ0WzJdPj1pWzBdJiZ0WzNdPj1pWzFdfXZhciB2ej1fejtjb25zdCBMMT0xZS02O2NsYXNzIHpze2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsZSl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9YH1jbG9zZVBhdGgoKXt0aGlzLl94MSE9PW51bGwmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsZSl7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K2V9YH1hcmModCxlLG4pe3Q9K3QsZT0rZSxuPStuO2NvbnN0IHI9dCtuLHM9ZTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXMiKTt0aGlzLl94MT09PW51bGw/dGhpcy5fKz1gTSR7cn0sJHtzfWA6KE1hdGguYWJzKHRoaXMuX3gxLXIpPkwxfHxNYXRoLmFicyh0aGlzLl95MS1zKT5MMSkmJih0aGlzLl8rPSJMIityKyIsIitzKSxuJiYodGhpcy5fKz1gQSR7bn0sJHtufSwwLDEsMSwke3Qtbn0sJHtlfUEke259LCR7bn0sMCwxLDEsJHt0aGlzLl94MT1yfSwke3RoaXMuX3kxPXN9YCl9cmVjdCh0LGUsbixyKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1oJHsrbn12JHsrcn1oJHstbn1aYH12YWx1ZSgpe3JldHVybiB0aGlzLl98fG51bGx9fWNsYXNzIGMwe2NvbnN0cnVjdG9yKCl7dGhpcy5fPVtdfW1vdmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX1jbG9zZVBhdGgoKXt0aGlzLl8ucHVzaCh0aGlzLl9bMF0uc2xpY2UoKSl9bGluZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfXZhbHVlKCl7cmV0dXJuIHRoaXMuXy5sZW5ndGg/dGhpcy5fOm51bGx9fWNsYXNzIFN6e2NvbnN0cnVjdG9yKHQsW2UsbixyLHNdPVswLDAsOTYwLDUwMF0pe2lmKCEoKHI9K3IpPj0oZT0rZSkpfHwhKChzPStzKT49KG49K24pKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYm91bmRzIik7dGhpcy5kZWxhdW5heT10LHRoaXMuX2NpcmN1bWNlbnRlcnM9bmV3IEZsb2F0NjRBcnJheSh0LnBvaW50cy5sZW5ndGgqMiksdGhpcy52ZWN0b3JzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMueG1heD1yLHRoaXMueG1pbj1lLHRoaXMueW1heD1zLHRoaXMueW1pbj1uLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5kZWxhdW5heS51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dCxodWxsOmUsdHJpYW5nbGVzOm59LHZlY3RvcnM6cn09dGhpcyxzPXRoaXMuY2lyY3VtY2VudGVycz10aGlzLl9jaXJjdW1jZW50ZXJzLnN1YmFycmF5KDAsbi5sZW5ndGgvMyoyKTtmb3IobGV0IGQ9MCxwPTAseT1uLmxlbmd0aCxnLG07ZDx5O2QrPTMscCs9Mil7Y29uc3Qgdj1uW2RdKjIseD1uW2QrMV0qMixfPW5bZCsyXSoyLE09dFt2XSxiPXRbdisxXSxBPXRbeF0sRT10W3grMV0sdz10W19dLFM9dFtfKzFdLFQ9QS1NLEQ9RS1iLEw9dy1NLE49Uy1iLEY9KFQqTi1EKkwpKjI7aWYoTWF0aC5hYnMoRik8MWUtOSl7bGV0IEI9MWU5O2NvbnN0IEc9blswXSoyO0IqPU1hdGguc2lnbigodFtHXS1NKSpOLSh0W0crMV0tYikqTCksZz0oTSt3KS8yLUIqTixtPShiK1MpLzIrQipMfWVsc2V7Y29uc3QgQj0xL0YsRz1UKlQrRCpELGs9TCpMK04qTjtnPU0rKE4qRy1EKmspKkIsbT1iKyhUKmstTCpHKSpCfXNbcF09ZyxzW3ArMV09bX1sZXQgbz1lW2UubGVuZ3RoLTFdLGEsbD1vKjQsYyx1PXRbMipvXSxoLGY9dFsyKm8rMV07ci5maWxsKDApO2ZvcihsZXQgZD0wO2Q8ZS5sZW5ndGg7KytkKW89ZVtkXSxhPWwsYz11LGg9ZixsPW8qNCx1PXRbMipvXSxmPXRbMipvKzFdLHJbYSsyXT1yW2xdPWgtZixyW2ErM109cltsKzFdPXUtY31yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHpzOnZvaWQgMCx7ZGVsYXVuYXk6e2hhbGZlZGdlczpuLGluZWRnZXM6cixodWxsOnN9LGNpcmN1bWNlbnRlcnM6byx2ZWN0b3JzOmF9PXRoaXM7aWYocy5sZW5ndGg8PTEpcmV0dXJuIG51bGw7Zm9yKGxldCB1PTAsaD1uLmxlbmd0aDt1PGg7Kyt1KXtjb25zdCBmPW5bdV07aWYoZjx1KWNvbnRpbnVlO2NvbnN0IGQ9TWF0aC5mbG9vcih1LzMpKjIscD1NYXRoLmZsb29yKGYvMykqMix5PW9bZF0sZz1vW2QrMV0sbT1vW3BdLHY9b1twKzFdO3RoaXMuX3JlbmRlclNlZ21lbnQoeSxnLG0sdix0KX1sZXQgbCxjPXNbcy5sZW5ndGgtMV07Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDsrK3Upe2w9YyxjPXNbdV07Y29uc3QgaD1NYXRoLmZsb29yKHJbY10vMykqMixmPW9baF0sZD1vW2grMV0scD1sKjQseT10aGlzLl9wcm9qZWN0KGYsZCxhW3ArMl0sYVtwKzNdKTt5JiZ0aGlzLl9yZW5kZXJTZWdtZW50KGYsZCx5WzBdLHlbMV0sdCl9cmV0dXJuIGUmJmUudmFsdWUoKX1yZW5kZXJCb3VuZHModCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHpzOnZvaWQgMDtyZXR1cm4gdC5yZWN0KHRoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LXRoaXMueG1pbix0aGlzLnltYXgtdGhpcy55bWluKSxlJiZlLnZhbHVlKCl9cmVuZGVyQ2VsbCh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyB6czp2b2lkIDAscj10aGlzLl9jbGlwKHQpO2lmKHI9PT1udWxsfHwhci5sZW5ndGgpcmV0dXJuO2UubW92ZVRvKHJbMF0sclsxXSk7bGV0IHM9ci5sZW5ndGg7Zm9yKDtyWzBdPT09cltzLTJdJiZyWzFdPT09cltzLTFdJiZzPjE7KXMtPTI7Zm9yKGxldCBvPTI7bzxzO28rPTIpKHJbb10hPT1yW28tMl18fHJbbysxXSE9PXJbby0xXSkmJmUubGluZVRvKHJbb10scltvKzFdKTtyZXR1cm4gZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KmNlbGxQb2x5Z29ucygpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dH19PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8yO2U8bjsrK2Upe2NvbnN0IHI9dGhpcy5jZWxsUG9seWdvbihlKTtyJiYoci5pbmRleD1lLHlpZWxkIHIpfX1jZWxsUG9seWdvbih0KXtjb25zdCBlPW5ldyBjMDtyZXR1cm4gdGhpcy5yZW5kZXJDZWxsKHQsZSksZS52YWx1ZSgpfV9yZW5kZXJTZWdtZW50KHQsZSxuLHIscyl7bGV0IG87Y29uc3QgYT10aGlzLl9yZWdpb25jb2RlKHQsZSksbD10aGlzLl9yZWdpb25jb2RlKG4scik7YT09PTAmJmw9PT0wPyhzLm1vdmVUbyh0LGUpLHMubGluZVRvKG4scikpOihvPXRoaXMuX2NsaXBTZWdtZW50KHQsZSxuLHIsYSxsKSkmJihzLm1vdmVUbyhvWzBdLG9bMV0pLHMubGluZVRvKG9bMl0sb1szXSkpfWNvbnRhaW5zKHQsZSxuKXtyZXR1cm4gZT0rZSxlIT09ZXx8KG49K24sbiE9PW4pPyExOnRoaXMuZGVsYXVuYXkuX3N0ZXAodCxlLG4pPT09dH0qbmVpZ2hib3JzKHQpe2NvbnN0IGU9dGhpcy5fY2xpcCh0KTtpZihlKWZvcihjb25zdCBuIG9mIHRoaXMuZGVsYXVuYXkubmVpZ2hib3JzKHQpKXtjb25zdCByPXRoaXMuX2NsaXAobik7aWYocil7dDpmb3IobGV0IHM9MCxvPWUubGVuZ3RoO3M8bztzKz0yKWZvcihsZXQgYT0wLGw9ci5sZW5ndGg7YTxsO2ErPTIpaWYoZVtzXT09clthXSYmZVtzKzFdPT1yW2ErMV0mJmVbKHMrMiklb109PXJbKGErbC0yKSVsXSYmZVsocyszKSVvXT09clsoYStsLTEpJWxdKXt5aWVsZCBuO2JyZWFrIHR9fX19X2NlbGwodCl7Y29uc3R7Y2lyY3VtY2VudGVyczplLGRlbGF1bmF5OntpbmVkZ2VzOm4saGFsZmVkZ2VzOnIsdHJpYW5nbGVzOnN9fT10aGlzLG89blt0XTtpZihvPT09LTEpcmV0dXJuIG51bGw7Y29uc3QgYT1bXTtsZXQgbD1vO2Rve2NvbnN0IGM9TWF0aC5mbG9vcihsLzMpO2lmKGEucHVzaChlW2MqMl0sZVtjKjIrMV0pLGw9bCUzPT09Mj9sLTI6bCsxLHNbbF0hPT10KWJyZWFrO2w9cltsXX13aGlsZShsIT09byYmbCE9PS0xKTtyZXR1cm4gYX1fY2xpcCh0KXtpZih0PT09MCYmdGhpcy5kZWxhdW5heS5odWxsLmxlbmd0aD09PTEpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO2NvbnN0IGU9dGhpcy5fY2VsbCh0KTtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdHt2ZWN0b3JzOm59PXRoaXMscj10KjQ7cmV0dXJuIG5bcl18fG5bcisxXT90aGlzLl9jbGlwSW5maW5pdGUodCxlLG5bcl0sbltyKzFdLG5bcisyXSxuW3IrM10pOnRoaXMuX2NsaXBGaW5pdGUodCxlKX1fY2xpcEZpbml0ZSh0LGUpe2NvbnN0IG49ZS5sZW5ndGg7bGV0IHI9bnVsbCxzLG8sYT1lW24tMl0sbD1lW24tMV0sYyx1PXRoaXMuX3JlZ2lvbmNvZGUoYSxsKSxoLGY9MDtmb3IobGV0IGQ9MDtkPG47ZCs9MilpZihzPWEsbz1sLGE9ZVtkXSxsPWVbZCsxXSxjPXUsdT10aGlzLl9yZWdpb25jb2RlKGEsbCksYz09PTAmJnU9PT0wKWg9ZixmPTAscj9yLnB1c2goYSxsKTpyPVthLGxdO2Vsc2V7bGV0IHAseSxnLG0sdjtpZihjPT09MCl7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQocyxvLGEsbCxjLHUpKT09PW51bGwpY29udGludWU7W3ksZyxtLHZdPXB9ZWxzZXtpZigocD10aGlzLl9jbGlwU2VnbWVudChhLGwscyxvLHUsYykpPT09bnVsbCljb250aW51ZTtbbSx2LHksZ109cCxoPWYsZj10aGlzLl9lZGdlY29kZSh5LGcpLGgmJmYmJnRoaXMuX2VkZ2UodCxoLGYscixyLmxlbmd0aCkscj9yLnB1c2goeSxnKTpyPVt5LGddfWg9ZixmPXRoaXMuX2VkZ2Vjb2RlKG0sdiksaCYmZiYmdGhpcy5fZWRnZSh0LGgsZixyLHIubGVuZ3RoKSxyP3IucHVzaChtLHYpOnI9W20sdl19aWYociloPWYsZj10aGlzLl9lZGdlY29kZShyWzBdLHJbMV0pLGgmJmYmJnRoaXMuX2VkZ2UodCxoLGYscixyLmxlbmd0aCk7ZWxzZSBpZih0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtyZXR1cm4gcn1fY2xpcFNlZ21lbnQodCxlLG4scixzLG8pe2Zvcig7Oyl7aWYocz09PTAmJm89PT0wKXJldHVyblt0LGUsbixyXTtpZihzJm8pcmV0dXJuIG51bGw7bGV0IGEsbCxjPXN8fG87YyY4PyhhPXQrKG4tdCkqKHRoaXMueW1heC1lKS8oci1lKSxsPXRoaXMueW1heCk6YyY0PyhhPXQrKG4tdCkqKHRoaXMueW1pbi1lKS8oci1lKSxsPXRoaXMueW1pbik6YyYyPyhsPWUrKHItZSkqKHRoaXMueG1heC10KS8obi10KSxhPXRoaXMueG1heCk6KGw9ZSsoci1lKSoodGhpcy54bWluLXQpLyhuLXQpLGE9dGhpcy54bWluKSxzPyh0PWEsZT1sLHM9dGhpcy5fcmVnaW9uY29kZSh0LGUpKToobj1hLHI9bCxvPXRoaXMuX3JlZ2lvbmNvZGUobixyKSl9fV9jbGlwSW5maW5pdGUodCxlLG4scixzLG8pe2xldCBhPUFycmF5LmZyb20oZSksbDtpZigobD10aGlzLl9wcm9qZWN0KGFbMF0sYVsxXSxuLHIpKSYmYS51bnNoaWZ0KGxbMF0sbFsxXSksKGw9dGhpcy5fcHJvamVjdChhW2EubGVuZ3RoLTJdLGFbYS5sZW5ndGgtMV0scyxvKSkmJmEucHVzaChsWzBdLGxbMV0pLGE9dGhpcy5fY2xpcEZpbml0ZSh0LGEpKWZvcihsZXQgYz0wLHU9YS5sZW5ndGgsaCxmPXRoaXMuX2VkZ2Vjb2RlKGFbdS0yXSxhW3UtMV0pO2M8dTtjKz0yKWg9ZixmPXRoaXMuX2VkZ2Vjb2RlKGFbY10sYVtjKzFdKSxoJiZmJiYoYz10aGlzLl9lZGdlKHQsaCxmLGEsYyksdT1hLmxlbmd0aCk7ZWxzZSB0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpJiYoYT1bdGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heF0pO3JldHVybiBhfV9lZGdlKHQsZSxuLHIscyl7Zm9yKDtlIT09bjspe2xldCBvLGE7c3dpdGNoKGUpe2Nhc2UgNTplPTQ7Y29udGludWU7Y2FzZSA0OmU9NixvPXRoaXMueG1heCxhPXRoaXMueW1pbjticmVhaztjYXNlIDY6ZT0yO2NvbnRpbnVlO2Nhc2UgMjplPTEwLG89dGhpcy54bWF4LGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgMTA6ZT04O2NvbnRpbnVlO2Nhc2UgODplPTksbz10aGlzLnhtaW4sYT10aGlzLnltYXg7YnJlYWs7Y2FzZSA5OmU9MTtjb250aW51ZTtjYXNlIDE6ZT01LG89dGhpcy54bWluLGE9dGhpcy55bWluO2JyZWFrfShyW3NdIT09b3x8cltzKzFdIT09YSkmJnRoaXMuY29udGFpbnModCxvLGEpJiYoci5zcGxpY2UocywwLG8sYSkscys9Mil9aWYoci5sZW5ndGg+NClmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rPTIpe2NvbnN0IGE9KG8rMiklci5sZW5ndGgsbD0obys0KSVyLmxlbmd0aDsocltvXT09PXJbYV0mJnJbYV09PT1yW2xdfHxyW28rMV09PT1yW2ErMV0mJnJbYSsxXT09PXJbbCsxXSkmJihyLnNwbGljZShhLDIpLG8tPTIpfXJldHVybiBzfV9wcm9qZWN0KHQsZSxuLHIpe2xldCBzPTEvMCxvLGEsbDtpZihyPDApe2lmKGU8PXRoaXMueW1pbilyZXR1cm4gbnVsbDsobz0odGhpcy55bWluLWUpL3IpPHMmJihsPXRoaXMueW1pbixhPXQrKHM9bykqbil9ZWxzZSBpZihyPjApe2lmKGU+PXRoaXMueW1heClyZXR1cm4gbnVsbDsobz0odGhpcy55bWF4LWUpL3IpPHMmJihsPXRoaXMueW1heCxhPXQrKHM9bykqbil9aWYobj4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueG1heC10KS9uKTxzJiYoYT10aGlzLnhtYXgsbD1lKyhzPW8pKnIpfWVsc2UgaWYobjwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueG1pbi10KS9uKTxzJiYoYT10aGlzLnhtaW4sbD1lKyhzPW8pKnIpfXJldHVyblthLGxdfV9lZGdlY29kZSh0LGUpe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChlPT09dGhpcy55bWluPzQ6ZT09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsZSl7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwoZTx0aGlzLnltaW4/NDplPnRoaXMueW1heD84OjApfX1jb25zdCBNej0yKk1hdGguUEksbmE9TWF0aC5wb3c7ZnVuY3Rpb24gYnooaSl7cmV0dXJuIGlbMF19ZnVuY3Rpb24gd3ooaSl7cmV0dXJuIGlbMV19ZnVuY3Rpb24gQXooaSl7Y29uc3R7dHJpYW5nbGVzOnQsY29vcmRzOmV9PWk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0zKXtjb25zdCByPTIqdFtuXSxzPTIqdFtuKzFdLG89Mip0W24rMl07aWYoKGVbb10tZVtyXSkqKGVbcysxXS1lW3IrMV0pLShlW3NdLWVbcl0pKihlW28rMV0tZVtyKzFdKT4xZS0xMClyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBFeihpLHQsZSl7cmV0dXJuW2krTWF0aC5zaW4oaSt0KSplLHQrTWF0aC5jb3MoaS10KSplXX1jbGFzcyB1MHtzdGF0aWMgZnJvbSh0LGU9Ynosbj13eixyKXtyZXR1cm4gbmV3IHUwKCJsZW5ndGgiaW4gdD9Ueih0LGUsbixyKTpGbG9hdDY0QXJyYXkuZnJvbShDeih0LGUsbixyKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IEZsKHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLGU9dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJkF6KHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDplLmxlbmd0aC8yfSwoZixkKT0+ZCkuc29ydCgoZixkKT0+ZVsyKmZdLWVbMipkXXx8ZVsyKmYrMV0tZVsyKmQrMV0pO2NvbnN0IGw9dGhpcy5jb2xsaW5lYXJbMF0sYz10aGlzLmNvbGxpbmVhclt0aGlzLmNvbGxpbmVhci5sZW5ndGgtMV0sdT1bZVsyKmxdLGVbMipsKzFdLGVbMipjXSxlWzIqYysxXV0saD0xZS04Kk1hdGguaHlwb3QodVszXS11WzFdLHVbMl0tdVswXSk7Zm9yKGxldCBmPTAsZD1lLmxlbmd0aC8yO2Y8ZDsrK2Ype2NvbnN0IHA9RXooZVsyKmZdLGVbMipmKzFdLGgpO2VbMipmXT1wWzBdLGVbMipmKzFdPXBbMV19dGhpcy5fZGVsYXVuYXRvcj1uZXcgRmwoZSl9ZWxzZSBkZWxldGUgdGhpcy5jb2xsaW5lYXI7Y29uc3Qgbj10aGlzLmhhbGZlZGdlcz10aGlzLl9kZWxhdW5hdG9yLmhhbGZlZGdlcyxyPXRoaXMuaHVsbD10aGlzLl9kZWxhdW5hdG9yLmh1bGwscz10aGlzLnRyaWFuZ2xlcz10aGlzLl9kZWxhdW5hdG9yLnRyaWFuZ2xlcyxvPXRoaXMuaW5lZGdlcy5maWxsKC0xKSxhPXRoaXMuX2h1bGxJbmRleC5maWxsKC0xKTtmb3IobGV0IGw9MCxjPW4ubGVuZ3RoO2w8YzsrK2wpe2NvbnN0IHU9c1tsJTM9PT0yP2wtMjpsKzFdOyhuW2xdPT09LTF8fG9bdV09PT0tMSkmJihvW3VdPWwpfWZvcihsZXQgbD0wLGM9ci5sZW5ndGg7bDxjOysrbClhW3JbbF1dPWw7ci5sZW5ndGg8PTImJnIubGVuZ3RoPjAmJih0aGlzLnRyaWFuZ2xlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLmhhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLnRyaWFuZ2xlc1swXT1yWzBdLG9bclswXV09MSxyLmxlbmd0aD09PTImJihvW3JbMV1dPTAsdGhpcy50cmlhbmdsZXNbMV09clsxXSx0aGlzLnRyaWFuZ2xlc1syXT1yWzFdKSl9dm9yb25vaSh0KXtyZXR1cm4gbmV3IFN6KHRoaXMsdCl9Km5laWdoYm9ycyh0KXtjb25zdHtpbmVkZ2VzOmUsaHVsbDpuLF9odWxsSW5kZXg6cixoYWxmZWRnZXM6cyx0cmlhbmdsZXM6byxjb2xsaW5lYXI6YX09dGhpcztpZihhKXtjb25zdCBoPWEuaW5kZXhPZih0KTtoPjAmJih5aWVsZCBhW2gtMV0pLGg8YS5sZW5ndGgtMSYmKHlpZWxkIGFbaCsxXSk7cmV0dXJufWNvbnN0IGw9ZVt0XTtpZihsPT09LTEpcmV0dXJuO2xldCBjPWwsdT0tMTtkb3tpZih5aWVsZCB1PW9bY10sYz1jJTM9PT0yP2MtMjpjKzEsb1tjXSE9PXQpcmV0dXJuO2lmKGM9c1tjXSxjPT09LTEpe2NvbnN0IGg9blsoclt0XSsxKSVuLmxlbmd0aF07aCE9PXUmJih5aWVsZCBoKTtyZXR1cm59fXdoaWxlKGMhPT1sKX1maW5kKHQsZSxuPTApe2lmKHQ9K3QsdCE9PXR8fChlPStlLGUhPT1lKSlyZXR1cm4tMTtjb25zdCByPW47bGV0IHM7Zm9yKDsocz10aGlzLl9zdGVwKG4sdCxlKSk+PTAmJnMhPT1uJiZzIT09cjspbj1zO3JldHVybiBzfV9zdGVwKHQsZSxuKXtjb25zdHtpbmVkZ2VzOnIsaHVsbDpzLF9odWxsSW5kZXg6byxoYWxmZWRnZXM6YSx0cmlhbmdsZXM6bCxwb2ludHM6Y309dGhpcztpZihyW3RdPT09LTF8fCFjLmxlbmd0aClyZXR1cm4odCsxKSUoYy5sZW5ndGg+PjEpO2xldCB1PXQsaD1uYShlLWNbdCoyXSwyKStuYShuLWNbdCoyKzFdLDIpO2NvbnN0IGY9clt0XTtsZXQgZD1mO2Rve2xldCBwPWxbZF07Y29uc3QgeT1uYShlLWNbcCoyXSwyKStuYShuLWNbcCoyKzFdLDIpO2lmKHk8aCYmKGg9eSx1PXApLGQ9ZCUzPT09Mj9kLTI6ZCsxLGxbZF0hPT10KWJyZWFrO2lmKGQ9YVtkXSxkPT09LTEpe2lmKGQ9c1sob1t0XSsxKSVzLmxlbmd0aF0sZCE9PXAmJm5hKGUtY1tkKjJdLDIpK25hKG4tY1tkKjIrMV0sMik8aClyZXR1cm4gZDticmVha319d2hpbGUoZCE9PWYpO3JldHVybiB1fXJlbmRlcih0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgenM6dm9pZCAwLHtwb2ludHM6bixoYWxmZWRnZXM6cix0cmlhbmdsZXM6c309dGhpcztmb3IobGV0IG89MCxhPXIubGVuZ3RoO288YTsrK28pe2NvbnN0IGw9cltvXTtpZihsPG8pY29udGludWU7Y29uc3QgYz1zW29dKjIsdT1zW2xdKjI7dC5tb3ZlVG8obltjXSxuW2MrMV0pLHQubGluZVRvKG5bdV0sblt1KzFdKX1yZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLGUmJmUudmFsdWUoKX1yZW5kZXJQb2ludHModCxlKXtlPT09dm9pZCAwJiYoIXR8fHR5cGVvZiB0Lm1vdmVUbyE9ImZ1bmN0aW9uIikmJihlPXQsdD1udWxsKSxlPWU9PW51bGw/MjorZTtjb25zdCBuPXQ9PW51bGw/dD1uZXcgenM6dm9pZCAwLHtwb2ludHM6cn09dGhpcztmb3IobGV0IHM9MCxvPXIubGVuZ3RoO3M8bztzKz0yKXtjb25zdCBhPXJbc10sbD1yW3MrMV07dC5tb3ZlVG8oYStlLGwpLHQuYXJjKGEsbCxlLDAsTXopfXJldHVybiBuJiZuLnZhbHVlKCl9cmVuZGVySHVsbCh0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgenM6dm9pZCAwLHtodWxsOm4scG9pbnRzOnJ9PXRoaXMscz1uWzBdKjIsbz1uLmxlbmd0aDt0Lm1vdmVUbyhyW3NdLHJbcysxXSk7Zm9yKGxldCBhPTE7YTxvOysrYSl7Y29uc3QgbD0yKm5bYV07dC5saW5lVG8ocltsXSxyW2wrMV0pfXJldHVybiB0LmNsb3NlUGF0aCgpLGUmJmUudmFsdWUoKX1odWxsUG9seWdvbigpe2NvbnN0IHQ9bmV3IGMwO3JldHVybiB0aGlzLnJlbmRlckh1bGwodCksdC52YWx1ZSgpfXJlbmRlclRyaWFuZ2xlKHQsZSl7Y29uc3Qgbj1lPT1udWxsP2U9bmV3IHpzOnZvaWQgMCx7cG9pbnRzOnIsdHJpYW5nbGVzOnN9PXRoaXMsbz1zW3QqPTNdKjIsYT1zW3QrMV0qMixsPXNbdCsyXSoyO3JldHVybiBlLm1vdmVUbyhyW29dLHJbbysxXSksZS5saW5lVG8oclthXSxyW2ErMV0pLGUubGluZVRvKHJbbF0scltsKzFdKSxlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qdHJpYW5nbGVQb2x5Z29ucygpe2NvbnN0e3RyaWFuZ2xlczp0fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMztlPG47KytlKXlpZWxkIHRoaXMudHJpYW5nbGVQb2x5Z29uKGUpfXRyaWFuZ2xlUG9seWdvbih0KXtjb25zdCBlPW5ldyBjMDtyZXR1cm4gdGhpcy5yZW5kZXJUcmlhbmdsZSh0LGUpLGUudmFsdWUoKX19ZnVuY3Rpb24gVHooaSx0LGUsbil7Y29uc3Qgcj1pLmxlbmd0aCxzPW5ldyBGbG9hdDY0QXJyYXkocioyKTtmb3IobGV0IG89MDtvPHI7KytvKXtjb25zdCBhPWlbb107c1tvKjJdPXQuY2FsbChuLGEsbyxpKSxzW28qMisxXT1lLmNhbGwobixhLG8saSl9cmV0dXJuIHN9ZnVuY3Rpb24qQ3ooaSx0LGUsbil7bGV0IHI9MDtmb3IoY29uc3QgcyBvZiBpKXlpZWxkIHQuY2FsbChuLHMscixpKSx5aWVsZCBlLmNhbGwobixzLHIsaSksKytyfWNvbnN0IGgwPU1hdGguUEksRDE9aDAvMixVMT0xODAvaDAsTjE9aDAvMTgwLFJ6PU1hdGguYXRhbjIsRjE9TWF0aC5jb3MsUHo9TWF0aC5tYXgsSXo9TWF0aC5taW4sQjE9TWF0aC5zaW4sTHo9TWF0aC5zaWdufHxmdW5jdGlvbihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9LE8xPU1hdGguc3FydDtmdW5jdGlvbiBEeihpKXtyZXR1cm4gaT4xP0QxOmk8LTE/LUQxOk1hdGguYXNpbihpKX1mdW5jdGlvbiB6MShpLHQpe3JldHVybiBpWzBdKnRbMF0raVsxXSp0WzFdK2lbMl0qdFsyXX1mdW5jdGlvbiAkbihpLHQpe3JldHVybltpWzFdKnRbMl0taVsyXSp0WzFdLGlbMl0qdFswXS1pWzBdKnRbMl0saVswXSp0WzFdLWlbMV0qdFswXV19ZnVuY3Rpb24gemYoaSx0KXtyZXR1cm5baVswXSt0WzBdLGlbMV0rdFsxXSxpWzJdK3RbMl1dfWZ1bmN0aW9uIGtmKGkpe3ZhciB0PU8xKGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtyZXR1cm5baVswXS90LGlbMV0vdCxpWzJdL3RdfWZ1bmN0aW9uIGYwKGkpe3JldHVybltSeihpWzFdLGlbMF0pKlUxLER6KFB6KC0xLEl6KDEsaVsyXSkpKSpVMV19ZnVuY3Rpb24gVWkoaSl7Y29uc3QgdD1pWzBdKk4xLGU9aVsxXSpOMSxuPUYxKGUpO3JldHVybltuKkYxKHQpLG4qQjEodCksQjEoZSldfWZ1bmN0aW9uIGQwKGkpe3JldHVybiBpPWkubWFwKHQ9PlVpKHQpKSx6MShpWzBdLCRuKGlbMl0saVsxXSkpfWZ1bmN0aW9uIFV6KGkpe2NvbnN0IHQ9RnooaSksZT1Peih0KSxuPUJ6KGUsaSkscj1reihlLGkubGVuZ3RoKSxzPU56KHIsaSksbz16eihlLGkpLHtwb2x5Z29uczphLGNlbnRlcnM6bH09VnoobyxlLGkpLGM9R3ooYSksdT1XeihlLGkpLGg9SHoobixlKTtyZXR1cm57ZGVsYXVuYXk6dCxlZGdlczpuLHRyaWFuZ2xlczplLGNlbnRlcnM6bCxuZWlnaGJvcnM6cixwb2x5Z29uczphLG1lc2g6YyxodWxsOnUsdXJxdWhhcnQ6aCxmaW5kOnN9fWZ1bmN0aW9uIE56KGksdCl7ZnVuY3Rpb24gZShuLHIpe2xldCBzPW5bMF0tclswXSxvPW5bMV0tclsxXSxhPW5bMl0tclsyXTtyZXR1cm4gcypzK28qbythKmF9cmV0dXJuIGZ1bmN0aW9uKHIscyxvKXtvPT09dm9pZCAwJiYobz0wKTtsZXQgYSxsLGM9bztjb25zdCB1PVVpKFtyLHNdKTtkbyBhPW8sbz1udWxsLGw9ZSh1LFVpKHRbYV0pKSxpW2FdLmZvckVhY2goaD0+e2xldCBmPWUodSxVaSh0W2hdKSk7aWYoZjxsKXtsPWYsbz1oLGM9aDtyZXR1cm59fSk7d2hpbGUobyE9PW51bGwpO3JldHVybiBjfX1mdW5jdGlvbiBGeihpKXtpZihpLmxlbmd0aDwyKXJldHVybnt9O2xldCB0PTA7Zm9yKDtpc05hTihpW3RdWzBdK2lbdF1bMV0pJiZ0Kys8aS5sZW5ndGg7KTtjb25zdCBlPXdTKGlbdF0pLG49bEQoKS50cmFuc2xhdGUoWzAsMF0pLnNjYWxlKDEpLnJvdGF0ZShlLmludmVydChbMTgwLDBdKSk7aT1pLm1hcChuKTtjb25zdCByPVtdO2xldCBzPTE7Zm9yKGxldCBoPTAsZj1pLmxlbmd0aDtoPGY7aCsrKXtsZXQgZD1XcyhpW2hdWzBdLDIpK1dzKGlbaF1bMV0sMik7IWlzRmluaXRlKGQpfHxkPjFlMzI/ci5wdXNoKGgpOmQ+cyYmKHM9ZCl9Y29uc3Qgbz0xZTYqTzEocyk7ci5mb3JFYWNoKGg9PmlbaF09W28sMF0pLGkucHVzaChbMCxvXSksaS5wdXNoKFstbywwXSksaS5wdXNoKFswLC1vXSk7Y29uc3QgYT11MC5mcm9tKGkpO2EucHJvamVjdGlvbj1uO2NvbnN0e3RyaWFuZ2xlczpsLGhhbGZlZGdlczpjLGluZWRnZXM6dX09YTtmb3IobGV0IGg9MCxmPWMubGVuZ3RoO2g8ZjtoKyspaWYoY1toXTwwKXtjb25zdCBkPWglMz09Mj9oLTI6aCsxLHA9aCUzPT0wP2grMjpoLTEseT1jW2RdLGc9Y1twXTtjW3ldPWcsY1tnXT15LGNbZF09Y1twXT0tMSxsW2hdPWxbZF09bFtwXT10LHVbbFt5XV09eSUzPT0wP3krMjp5LTEsdVtsW2ddXT1nJTM9PTA/ZysyOmctMSxoKz0yLWglM31lbHNlIGxbaF0+aS5sZW5ndGgtMy0xJiYobFtoXT10KTtyZXR1cm4gYX1mdW5jdGlvbiBCeihpLHQpe2NvbnN0IGU9bmV3IFNldDtyZXR1cm4gdC5sZW5ndGg9PT0yP1tbMCwxXV06KGkuZm9yRWFjaChuPT57aWYoblswXSE9PW5bMV0mJiEoZDAobi5tYXAocj0+dFtyXSkpPDApKWZvcihsZXQgcj0wLHM7cjwzO3IrKylzPShyKzEpJTMsZS5hZGQoQ2goW25bcl0sbltzXV0pLmpvaW4oIi0iKSl9KSxBcnJheS5mcm9tKGUsbj0+bi5zcGxpdCgiLSIpLm1hcChOdW1iZXIpKSl9ZnVuY3Rpb24gT3ooaSl7Y29uc3R7dHJpYW5nbGVzOnR9PWk7aWYoIXQpcmV0dXJuW107Y29uc3QgZT1bXTtmb3IobGV0IG49MCxyPXQubGVuZ3RoLzM7bjxyO24rKyl7Y29uc3Qgcz10WzMqbl0sbz10WzMqbisxXSxhPXRbMypuKzJdO3MhPT1vJiZvIT09YSYmZS5wdXNoKFtzLGEsb10pfXJldHVybiBlfWZ1bmN0aW9uIHp6KGksdCl7cmV0dXJuIGkubWFwKGU9Pntjb25zdCBuPWUubWFwKHM9PnRbc10pLm1hcChVaSkscj16Zih6ZigkbihuWzFdLG5bMF0pLCRuKG5bMl0sblsxXSkpLCRuKG5bMF0sblsyXSkpO3JldHVybiBmMChrZihyKSl9KX1mdW5jdGlvbiBreihpLHQpe2NvbnN0IGU9W107cmV0dXJuIGkuZm9yRWFjaChuPT57Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgcz1uW3JdLG89blsocisxKSUzXTtlW3NdPWVbc118fFtdLGVbc10ucHVzaChvKX19KSxpLmxlbmd0aD09PTAmJih0PT09Mj8oZVswXT1bMV0sZVsxXT1bMF0pOnQ9PT0xJiYoZVswXT1bXSkpLGV9ZnVuY3Rpb24gVnooaSx0LGUpe2NvbnN0IG49W10scj1pLnNsaWNlKCk7aWYodC5sZW5ndGg9PT0wKXtpZihlLmxlbmd0aDwyKXJldHVybntwb2x5Z29uczpuLGNlbnRlcnM6cn07aWYoZS5sZW5ndGg9PT0yKXtjb25zdCBhPVVpKGVbMF0pLGw9VWkoZVsxXSksYz1rZih6ZihhLGwpKSx1PWtmKCRuKGEsbCkpLGg9JG4oYyx1KSxmPVtjLCRuKGMsaCksJG4oJG4oYyxoKSxoKSwkbigkbigkbihjLGgpLGgpLGgpXS5tYXAoZjApLm1hcChvKTtyZXR1cm4gbi5wdXNoKGYpLG4ucHVzaChmLnNsaWNlKCkucmV2ZXJzZSgpKSx7cG9seWdvbnM6bixjZW50ZXJzOnJ9fX10LmZvckVhY2goKGEsbCk9Pntmb3IobGV0IGM9MDtjPDM7YysrKXtjb25zdCB1PWFbY10saD1hWyhjKzEpJTNdLGY9YVsoYysyKSUzXTtuW3VdPW5bdV18fFtdLG5bdV0ucHVzaChbaCxmLGwsW3UsaCxmXV0pfX0pO2NvbnN0IHM9bi5tYXAoYT0+e2NvbnN0IGw9W2FbMF1bMl1dO2xldCBjPWFbMF1bMV07Zm9yKGxldCB1PTE7dTxhLmxlbmd0aDt1KyspZm9yKGxldCBoPTA7aDxhLmxlbmd0aDtoKyspaWYoYVtoXVswXT09Yyl7Yz1hW2hdWzFdLGwucHVzaChhW2hdWzJdKTticmVha31pZihsLmxlbmd0aD4yKXJldHVybiBsO2lmKGwubGVuZ3RoPT0yKXtjb25zdCB1PWsxKGVbYVswXVszXVswXV0sZVthWzBdWzNdWzFdXSxyW2xbMF1dKSxoPWsxKGVbYVswXVszXVsyXV0sZVthWzBdWzNdWzBdXSxyW2xbMF1dKSxmPW8odSksZD1vKGgpO3JldHVybltsWzBdLGQsbFsxXSxmXX19KTtmdW5jdGlvbiBvKGEpe2xldCBsPS0xO3JldHVybiByLnNsaWNlKHQubGVuZ3RoLDEvMCkuZm9yRWFjaCgoYyx1KT0+e2NbMF09PT1hWzBdJiZjWzFdPT09YVsxXSYmKGw9dSt0Lmxlbmd0aCl9KSxsPDAmJihsPXIubGVuZ3RoLHIucHVzaChhKSksbH1yZXR1cm57cG9seWdvbnM6cyxjZW50ZXJzOnJ9fWZ1bmN0aW9uIGsxKGksdCxlKXtpPVVpKGkpLHQ9VWkodCksZT1VaShlKTtjb25zdCBuPUx6KHoxKCRuKHQsaSksZSkpO3JldHVybiBmMChrZih6ZihpLHQpKS5tYXAocj0+bipyKSl9ZnVuY3Rpb24gR3ooaSl7Y29uc3QgdD1bXTtyZXR1cm4gaS5mb3JFYWNoKGU9PntpZighZSlyZXR1cm47bGV0IG49ZVtlLmxlbmd0aC0xXTtmb3IobGV0IHIgb2YgZSlyPm4mJnQucHVzaChbbixyXSksbj1yfSksdH1mdW5jdGlvbiBIeihpLHQpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCBuPW5ldyBNYXAscj1uZXcgTWFwO3JldHVybiBpLmZvckVhY2goKHMsbyk9Pntjb25zdCBhPXMuam9pbigiLSIpO24uc2V0KGEsZVtvXSksci5zZXQoYSwhMCl9KSx0LmZvckVhY2gocz0+e2xldCBvPTAsYT0tMTtmb3IobGV0IGw9MDtsPDM7bCsrKXtsZXQgYz1DaChbc1tsXSxzWyhsKzEpJTNdXSkuam9pbigiLSIpO24uZ2V0KGMpPm8mJihvPW4uZ2V0KGMpLGE9Yyl9ci5zZXQoYSwhMSl9KSxpLm1hcChzPT5yLmdldChzLmpvaW4oIi0iKSkpfX1mdW5jdGlvbiBXeihpLHQpe2NvbnN0IGU9bmV3IFNldCxuPVtdO2kubWFwKGE9PntpZighKGQwKGEubWFwKGw9PnRbbD50Lmxlbmd0aD8wOmxdKSk+MWUtMTIpKWZvcihsZXQgbD0wO2w8MztsKyspe2xldCBjPVthW2xdLGFbKGwrMSklM11dLHU9YCR7Y1swXX0tJHtjWzFdfWA7ZS5oYXModSk/ZS5kZWxldGUodSk6ZS5hZGQoYCR7Y1sxXX0tJHtjWzBdfWApfX0pO2NvbnN0IHI9bmV3IE1hcDtsZXQgcztpZihlLmZvckVhY2goYT0+e2E9YS5zcGxpdCgiLSIpLm1hcChOdW1iZXIpLHIuc2V0KGFbMF0sYVsxXSkscz1hWzBdfSkscz09PXZvaWQgMClyZXR1cm4gbjtsZXQgbz1zO2Rve24ucHVzaChvKTtsZXQgYT1yLmdldChvKTtyLnNldChvLC0xKSxvPWF9d2hpbGUobz4tMSYmbyE9PXMpO3JldHVybiBufWZ1bmN0aW9uICR6KGkpe2NvbnN0IHQ9ZnVuY3Rpb24oZSl7aWYodC5kZWxhdW5heT1udWxsLHQuX2RhdGE9ZSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCImJnQuX2RhdGEudHlwZT09PSJGZWF0dXJlQ29sbGVjdGlvbiImJih0Ll9kYXRhPXQuX2RhdGEuZmVhdHVyZXMpLHR5cGVvZiB0Ll9kYXRhPT0ib2JqZWN0Iil7Y29uc3Qgbj10Ll9kYXRhLm1hcChyPT5bdC5fdngociksdC5fdnkocikscl0pLmZpbHRlcihyPT5pc0Zpbml0ZShyWzBdK3JbMV0pKTt0LnBvaW50cz1uLm1hcChyPT5bclswXSxyWzFdXSksdC52YWxpZD1uLm1hcChyPT5yWzJdKSx0LmRlbGF1bmF5PVV6KHQucG9pbnRzKX1yZXR1cm4gdH07cmV0dXJuIHQuX3Z4PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInR5cGUiaW4gZSlyZXR1cm4geFMoZSlbMF07aWYoMCBpbiBlKXJldHVybiBlWzBdfSx0Ll92eT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIHhTKGUpWzFdO2lmKDEgaW4gZSlyZXR1cm4gZVsxXX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eD1lLHQpOnQuX3Z4fSx0Lnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KHQuX3Z5PWUsdCk6dC5fdnl9LHQucG9seWdvbnM9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6W119O3JldHVybiB0LnZhbGlkLmxlbmd0aD09PTB8fCh0LmRlbGF1bmF5LnBvbHlnb25zLmZvckVhY2goKHIscyk9Pm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6cj97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5yLHJbMF1dLm1hcChvPT50LmRlbGF1bmF5LmNlbnRlcnNbb10pXX06bnVsbCxwcm9wZXJ0aWVzOntzaXRlOnQudmFsaWRbc10sc2l0ZWNvb3JkaW5hdGVzOnQucG9pbnRzW3NdLG5laWdoYm91cnM6dC5kZWxhdW5heS5uZWlnaGJvcnNbc119fSkpLHQudmFsaWQubGVuZ3RoPT09MSYmbi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTp7dHlwZToiU3BoZXJlIn0scHJvcGVydGllczp7c2l0ZTp0LnZhbGlkWzBdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1swXSxuZWlnaGJvdXJzOltdfX0pKSxufSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6dC5kZWxhdW5heS50cmlhbmdsZXMubWFwKChuLHIpPT4obj1uLm1hcChzPT50LnBvaW50c1tzXSksbi5jZW50ZXI9dC5kZWxhdW5heS5jZW50ZXJzW3JdLG4pKS5maWx0ZXIobj0+ZDAobik+MCkubWFwKG49Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7Y2lyY3VtY2VudGVyOm4uY2VudGVyfSxnZW9tZXRyeTp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLG5bMF1dXX19KSl9OiExfSx0LmxpbmtzPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj10LmRlbGF1bmF5LmVkZ2VzLm1hcChzPT5rbyh0LnBvaW50c1tzWzBdXSx0LnBvaW50c1tzWzFdXSkpLHI9dC5kZWxhdW5heS51cnF1aGFydChuKTtyZXR1cm57dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKChzLG8pPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e3NvdXJjZTp0LnZhbGlkW3NbMF1dLHRhcmdldDp0LnZhbGlkW3NbMV1dLGxlbmd0aDpuW29dLHVycXVoYXJ0OiEhcltvXX0sZ2VvbWV0cnk6e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOlt0LnBvaW50c1tzWzBdXSx0LnBvaW50c1tzWzFdXV19fSkpfX0sdC5tZXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZ0KGUpLHQuZGVsYXVuYXk/e3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dC5kZWxhdW5heS5lZGdlcy5tYXAobj0+W3QucG9pbnRzW25bMF1dLHQucG9pbnRzW25bMV1dXSl9OiExfSx0LmNlbGxNZXNoPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3R7Y2VudGVyczpuLHBvbHlnb25zOnJ9PXQuZGVsYXVuYXkscz1bXTtmb3IoY29uc3QgbyBvZiByKWlmKG8pZm9yKGxldCBhPW8ubGVuZ3RoLGw9b1thLTFdLGM9b1swXSx1PTA7dTxhO2w9YyxjPW9bKyt1XSljPmwmJnMucHVzaChbbltsXSxuW2NdXSk7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6c319LHQuX2ZvdW5kPXZvaWQgMCx0LmZpbmQ9ZnVuY3Rpb24oZSxuLHIpe2lmKHQuX2ZvdW5kPXQuZGVsYXVuYXkuZmluZChlLG4sdC5fZm91bmQpLCFyfHxrbyhbZSxuXSx0LnBvaW50c1t0Ll9mb3VuZF0pPHIpcmV0dXJuIHQuX2ZvdW5kfSx0Lmh1bGw9ZnVuY3Rpb24oZSl7ZSE9PXZvaWQgMCYmdChlKTtjb25zdCBuPXQuZGVsYXVuYXkuaHVsbCxyPXQucG9pbnRzO3JldHVybiBuLmxlbmd0aD09PTA/bnVsbDp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLm1hcChzPT5yW3NdKSxyW25bMF1dXV19fSxpP3QoaSk6dH1mdW5jdGlvbiBYeihpLHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UoaSk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKHQpLmRvbWFpbihpKTticmVha31yZXR1cm4gdGhpc31mdW5jdGlvbiBwMChpLHQsZSl7aS5wcm90b3R5cGU9dC5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPWl9ZnVuY3Rpb24gVjEoaSx0KXt2YXIgZT1PYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKTtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gT2woKXt9dmFyIHpsPS43LFZmPTEvemwsaWE9IlxccyooWystXT9cXGQrKVxccyoiLGtsPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixOaT0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLHF6PS9eIyhbMC05YS1mXXszLDh9KSQvLFl6PW5ldyBSZWdFeHAoYF5yZ2JcXCgke2lhfSwke2lhfSwke2lhfVxcKSRgKSxaej1uZXcgUmVnRXhwKGBecmdiXFwoJHtOaX0sJHtOaX0sJHtOaX1cXCkkYCksSno9bmV3IFJlZ0V4cChgXnJnYmFcXCgke2lhfSwke2lhfSwke2lhfSwke2tsfVxcKSRgKSxqej1uZXcgUmVnRXhwKGBecmdiYVxcKCR7Tml9LCR7Tml9LCR7Tml9LCR7a2x9XFwpJGApLEt6PW5ldyBSZWdFeHAoYF5oc2xcXCgke2tsfSwke05pfSwke05pfVxcKSRgKSxRej1uZXcgUmVnRXhwKGBeaHNsYVxcKCR7a2x9LCR7Tml9LCR7Tml9LCR7a2x9XFwpJGApLEcxPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O3AwKE9sLFZsLHtjb3B5KGkpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsaSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OkgxLGZvcm1hdEhleDpIMSxmb3JtYXRIZXg4OnRrLGZvcm1hdEhzbDplayxmb3JtYXRSZ2I6VzEsdG9TdHJpbmc6VzF9KTtmdW5jdGlvbiBIMSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIHRrKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpfWZ1bmN0aW9uIGVrKCl7cmV0dXJuIFoxKHRoaXMpLmZvcm1hdEhzbCgpfWZ1bmN0aW9uIFcxKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gVmwoaSl7dmFyIHQsZTtyZXR1cm4gaT0oaSsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKHQ9cXouZXhlYyhpKSk/KGU9dFsxXS5sZW5ndGgsdD1wYXJzZUludCh0WzFdLDE2KSxlPT09Nj8kMSh0KTplPT09Mz9uZXcgUG4odD4+OCYxNXx0Pj40JjI0MCx0Pj40JjE1fHQmMjQwLCh0JjE1KTw8NHx0JjE1LDEpOmU9PT04P0dmKHQ+PjI0JjI1NSx0Pj4xNiYyNTUsdD4+OCYyNTUsKHQmMjU1KS8yNTUpOmU9PT00P0dmKHQ+PjEyJjE1fHQ+PjgmMjQwLHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwoKHQmMTUpPDw0fHQmMTUpLzI1NSk6bnVsbCk6KHQ9WXouZXhlYyhpKSk/bmV3IFBuKHRbMV0sdFsyXSx0WzNdLDEpOih0PVp6LmV4ZWMoaSkpP25ldyBQbih0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCwxKToodD1Kei5leGVjKGkpKT9HZih0WzFdLHRbMl0sdFszXSx0WzRdKToodD1qei5leGVjKGkpKT9HZih0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCx0WzRdKToodD1Lei5leGVjKGkpKT9ZMSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLDEpOih0PVF6LmV4ZWMoaSkpP1kxKHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsdFs0XSk6RzEuaGFzT3duUHJvcGVydHkoaSk/JDEoRzFbaV0pOmk9PT0idHJhbnNwYXJlbnQiP25ldyBQbihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uICQxKGkpe3JldHVybiBuZXcgUG4oaT4+MTYmMjU1LGk+PjgmMjU1LGkmMjU1LDEpfWZ1bmN0aW9uIEdmKGksdCxlLG4pe3JldHVybiBuPD0wJiYoaT10PWU9TmFOKSxuZXcgUG4oaSx0LGUsbil9ZnVuY3Rpb24gbmsoaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBPbHx8KGk9VmwoaSkpLGk/KGk9aS5yZ2IoKSxuZXcgUG4oaS5yLGkuZyxpLmIsaS5vcGFjaXR5KSk6bmV3IFBufWZ1bmN0aW9uIG0wKGksdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9uayhpKTpuZXcgUG4oaSx0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIFBuKGksdCxlLG4pe3RoaXMucj0raSx0aGlzLmc9K3QsdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rbn1wMChQbixtMCxWMShPbCx7YnJpZ2h0ZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9WZjpNYXRoLnBvdyhWZixpKSxuZXcgUG4odGhpcy5yKmksdGhpcy5nKmksdGhpcy5iKmksdGhpcy5vcGFjaXR5KX0sZGFya2VyKGkpe3JldHVybiBpPWk9PW51bGw/emw6TWF0aC5wb3coemwsaSksbmV3IFBuKHRoaXMucippLHRoaXMuZyppLHRoaXMuYippLHRoaXMub3BhY2l0eSl9LHJnYigpe3JldHVybiB0aGlzfSxjbGFtcCgpe3JldHVybiBuZXcgUG4oa3ModGhpcy5yKSxrcyh0aGlzLmcpLGtzKHRoaXMuYiksSGYodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpYMSxmb3JtYXRIZXg6WDEsZm9ybWF0SGV4ODppayxmb3JtYXRSZ2I6cTEsdG9TdHJpbmc6cTF9KSk7ZnVuY3Rpb24gWDEoKXtyZXR1cm5gIyR7VnModGhpcy5yKX0ke1ZzKHRoaXMuZyl9JHtWcyh0aGlzLmIpfWB9ZnVuY3Rpb24gaWsoKXtyZXR1cm5gIyR7VnModGhpcy5yKX0ke1ZzKHRoaXMuZyl9JHtWcyh0aGlzLmIpfSR7VnMoKGlzTmFOKHRoaXMub3BhY2l0eSk/MTp0aGlzLm9wYWNpdHkpKjI1NSl9YH1mdW5jdGlvbiBxMSgpe2NvbnN0IGk9SGYodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtpPT09MT8icmdiKCI6InJnYmEoIn0ke2tzKHRoaXMucil9LCAke2tzKHRoaXMuZyl9LCAke2tzKHRoaXMuYil9JHtpPT09MT8iKSI6YCwgJHtpfSlgfWB9ZnVuY3Rpb24gSGYoaSl7cmV0dXJuIGlzTmFOKGkpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGkpKX1mdW5jdGlvbiBrcyhpKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZChpKXx8MCkpfWZ1bmN0aW9uIFZzKGkpe3JldHVybiBpPWtzKGkpLChpPDE2PyIwIjoiIikraS50b1N0cmluZygxNil9ZnVuY3Rpb24gWTEoaSx0LGUsbil7cmV0dXJuIG48PTA/aT10PWU9TmFOOmU8PTB8fGU+PTE/aT10PU5hTjp0PD0wJiYoaT1OYU4pLG5ldyB2aShpLHQsZSxuKX1mdW5jdGlvbiBaMShpKXtpZihpIGluc3RhbmNlb2YgdmkpcmV0dXJuIG5ldyB2aShpLmgsaS5zLGkubCxpLm9wYWNpdHkpO2lmKGkgaW5zdGFuY2VvZiBPbHx8KGk9VmwoaSkpLCFpKXJldHVybiBuZXcgdmk7aWYoaSBpbnN0YW5jZW9mIHZpKXJldHVybiBpO2k9aS5yZ2IoKTt2YXIgdD1pLnIvMjU1LGU9aS5nLzI1NSxuPWkuYi8yNTUscj1NYXRoLm1pbih0LGUsbikscz1NYXRoLm1heCh0LGUsbiksbz1OYU4sYT1zLXIsbD0ocytyKS8yO3JldHVybiBhPyh0PT09cz9vPShlLW4pL2ErKGU8bikqNjplPT09cz9vPShuLXQpL2ErMjpvPSh0LWUpL2ErNCxhLz1sPC41P3MrcjoyLXMtcixvKj02MCk6YT1sPjAmJmw8MT8wOm8sbmV3IHZpKG8sYSxsLGkub3BhY2l0eSl9ZnVuY3Rpb24gcmsoaSx0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP1oxKGkpOm5ldyB2aShpLHQsZSxuPT1udWxsPzE6bil9ZnVuY3Rpb24gdmkoaSx0LGUsbil7dGhpcy5oPStpLHRoaXMucz0rdCx0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStufXAwKHZpLHJrLFYxKE9sLHticmlnaHRlcihpKXtyZXR1cm4gaT1pPT1udWxsP1ZmOk1hdGgucG93KFZmLGkpLG5ldyB2aSh0aGlzLmgsdGhpcy5zLHRoaXMubCppLHRoaXMub3BhY2l0eSl9LGRhcmtlcihpKXtyZXR1cm4gaT1pPT1udWxsP3psOk1hdGgucG93KHpsLGkpLG5ldyB2aSh0aGlzLmgsdGhpcy5zLHRoaXMubCppLHRoaXMub3BhY2l0eSl9LHJnYigpe3ZhciBpPXRoaXMuaCUzNjArKHRoaXMuaDwwKSozNjAsdD1pc05hTihpKXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxuPWUrKGU8LjU/ZToxLWUpKnQscj0yKmUtbjtyZXR1cm4gbmV3IFBuKGcwKGk+PTI0MD9pLTI0MDppKzEyMCxyLG4pLGcwKGkscixuKSxnMChpPDEyMD9pKzI0MDppLTEyMCxyLG4pLHRoaXMub3BhY2l0eSl9LGNsYW1wKCl7cmV0dXJuIG5ldyB2aShKMSh0aGlzLmgpLFdmKHRoaXMucyksV2YodGhpcy5sKSxIZih0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbCgpe2NvbnN0IGk9SGYodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtpPT09MT8iaHNsKCI6ImhzbGEoIn0ke0oxKHRoaXMuaCl9LCAke1dmKHRoaXMucykqMTAwfSUsICR7V2YodGhpcy5sKSoxMDB9JSR7aT09PTE/IikiOmAsICR7aX0pYH1gfX0pKTtmdW5jdGlvbiBKMShpKXtyZXR1cm4gaT0oaXx8MCklMzYwLGk8MD9pKzM2MDppfWZ1bmN0aW9uIFdmKGkpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsaXx8MCkpfWZ1bmN0aW9uIGcwKGksdCxlKXtyZXR1cm4oaTw2MD90KyhlLXQpKmkvNjA6aTwxODA/ZTppPDI0MD90KyhlLXQpKigyNDAtaSkvNjA6dCkqMjU1fXZhciB5MD1pPT4oKT0+aTtmdW5jdGlvbiBzayhpLHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gaStlKnR9fWZ1bmN0aW9uIG9rKGksdCxlKXtyZXR1cm4gaT1NYXRoLnBvdyhpLGUpLHQ9TWF0aC5wb3codCxlKS1pLGU9MS9lLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnBvdyhpK24qdCxlKX19ZnVuY3Rpb24gYWsoaSl7cmV0dXJuKGk9K2kpPT0xP2oxOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdD9vayh0LGUsaSk6eTAoaXNOYU4odCk/ZTp0KX19ZnVuY3Rpb24gajEoaSx0KXt2YXIgZT10LWk7cmV0dXJuIGU/c2soaSxlKTp5MChpc05hTihpKT90OmkpfXZhciBLMT1mdW5jdGlvbiBpKHQpe3ZhciBlPWFrKHQpO2Z1bmN0aW9uIG4ocixzKXt2YXIgbz1lKChyPW0wKHIpKS5yLChzPW0wKHMpKS5yKSxhPWUoci5nLHMuZyksbD1lKHIuYixzLmIpLGM9ajEoci5vcGFjaXR5LHMub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiByLnI9byh1KSxyLmc9YSh1KSxyLmI9bCh1KSxyLm9wYWNpdHk9Yyh1KSxyKyIifX1yZXR1cm4gbi5nYW1tYT1pLG59KDEpO2Z1bmN0aW9uIGxrKGksdCl7dHx8KHQ9W10pO3ZhciBlPWk/TWF0aC5taW4odC5sZW5ndGgsaS5sZW5ndGgpOjAsbj10LnNsaWNlKCkscjtyZXR1cm4gZnVuY3Rpb24ocyl7Zm9yKHI9MDtyPGU7KytyKW5bcl09aVtyXSooMS1zKSt0W3JdKnM7cmV0dXJuIG59fWZ1bmN0aW9uIGNrKGkpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoaSkmJiEoaSBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiB1ayhpLHQpe3ZhciBlPXQ/dC5sZW5ndGg6MCxuPWk/TWF0aC5taW4oZSxpLmxlbmd0aCk6MCxyPW5ldyBBcnJheShuKSxzPW5ldyBBcnJheShlKSxvO2ZvcihvPTA7bzxuOysrbylyW29dPXYwKGlbb10sdFtvXSk7Zm9yKDtvPGU7KytvKXNbb109dFtvXTtyZXR1cm4gZnVuY3Rpb24oYSl7Zm9yKG89MDtvPG47KytvKXNbb109cltvXShhKTtyZXR1cm4gc319ZnVuY3Rpb24gaGsoaSx0KXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBlLnNldFRpbWUoaSooMS1uKSt0Km4pLGV9fWZ1bmN0aW9uICRmKGksdCl7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gaSooMS1lKSt0KmV9fWZ1bmN0aW9uIGZrKGksdCl7dmFyIGU9e30sbj17fSxyOyhpPT09bnVsbHx8dHlwZW9mIGkhPSJvYmplY3QiKSYmKGk9e30pLCh0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiKSYmKHQ9e30pO2ZvcihyIGluIHQpciBpbiBpP2Vbcl09djAoaVtyXSx0W3JdKTpuW3JdPXRbcl07cmV0dXJuIGZ1bmN0aW9uKHMpe2ZvcihyIGluIGUpbltyXT1lW3JdKHMpO3JldHVybiBufX12YXIgXzA9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLHgwPW5ldyBSZWdFeHAoXzAuc291cmNlLCJnIik7ZnVuY3Rpb24gZGsoaSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGl9fWZ1bmN0aW9uIHBrKGkpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaSh0KSsiIn19ZnVuY3Rpb24gbWsoaSx0KXt2YXIgZT1fMC5sYXN0SW5kZXg9eDAubGFzdEluZGV4PTAsbixyLHMsbz0tMSxhPVtdLGw9W107Zm9yKGk9aSsiIix0PXQrIiI7KG49XzAuZXhlYyhpKSkmJihyPXgwLmV4ZWModCkpOykocz1yLmluZGV4KT5lJiYocz10LnNsaWNlKGUscyksYVtvXT9hW29dKz1zOmFbKytvXT1zKSwobj1uWzBdKT09PShyPXJbMF0pP2Fbb10/YVtvXSs9cjphWysrb109cjooYVsrK29dPW51bGwsbC5wdXNoKHtpOm8seDokZihuLHIpfSkpLGU9eDAubGFzdEluZGV4O3JldHVybiBlPHQubGVuZ3RoJiYocz10LnNsaWNlKGUpLGFbb10/YVtvXSs9czphWysrb109cyksYS5sZW5ndGg8Mj9sWzBdP3BrKGxbMF0ueCk6ZGsodCk6KHQ9bC5sZW5ndGgsZnVuY3Rpb24oYyl7Zm9yKHZhciB1PTAsaDt1PHQ7Kyt1KWFbKGg9bFt1XSkuaV09aC54KGMpO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gdjAoaSx0KXt2YXIgZT10eXBlb2YgdCxuO3JldHVybiB0PT1udWxsfHxlPT09ImJvb2xlYW4iP3kwKHQpOihlPT09Im51bWJlciI/JGY6ZT09PSJzdHJpbmciPyhuPVZsKHQpKT8odD1uLEsxKTptazp0IGluc3RhbmNlb2YgVmw/SzE6dCBpbnN0YW5jZW9mIERhdGU/aGs6Y2sodCk/bGs6QXJyYXkuaXNBcnJheSh0KT91azp0eXBlb2YgdC52YWx1ZU9mIT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC50b1N0cmluZyE9ImZ1bmN0aW9uInx8aXNOYU4odCk/Zms6JGYpKGksdCl9ZnVuY3Rpb24gZ2soaSx0KXtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKGkqKDEtZSkrdCplKX19ZnVuY3Rpb24geWsoaSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGl9fWZ1bmN0aW9uIF9rKGkpe3JldHVybitpfXZhciBRMT1bMCwxXTtmdW5jdGlvbiByYShpKXtyZXR1cm4gaX1mdW5jdGlvbiBTMChpLHQpe3JldHVybih0LT1pPStpKT9mdW5jdGlvbihlKXtyZXR1cm4oZS1pKS90fTp5ayhpc05hTih0KT9OYU46LjUpfWZ1bmN0aW9uIHhrKGksdCl7dmFyIGU7cmV0dXJuIGk+dCYmKGU9aSxpPXQsdD1lKSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5tYXgoaSxNYXRoLm1pbih0LG4pKX19ZnVuY3Rpb24gdmsoaSx0LGUpe3ZhciBuPWlbMF0scj1pWzFdLHM9dFswXSxvPXRbMV07cmV0dXJuIHI8bj8obj1TMChyLG4pLHM9ZShvLHMpKToobj1TMChuLHIpLHM9ZShzLG8pKSxmdW5jdGlvbihhKXtyZXR1cm4gcyhuKGEpKX19ZnVuY3Rpb24gU2soaSx0LGUpe3ZhciBuPU1hdGgubWluKGkubGVuZ3RoLHQubGVuZ3RoKS0xLHI9bmV3IEFycmF5KG4pLHM9bmV3IEFycmF5KG4pLG89LTE7Zm9yKGlbbl08aVswXSYmKGk9aS5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzxuOylyW29dPVMwKGlbb10saVtvKzFdKSxzW29dPWUodFtvXSx0W28rMV0pO3JldHVybiBmdW5jdGlvbihhKXt2YXIgbD1zTChpLGEsMSxuKS0xO3JldHVybiBzW2xdKHJbbF0oYSkpfX1mdW5jdGlvbiBNayhpLHQpe3JldHVybiB0LmRvbWFpbihpLmRvbWFpbigpKS5yYW5nZShpLnJhbmdlKCkpLmludGVycG9sYXRlKGkuaW50ZXJwb2xhdGUoKSkuY2xhbXAoaS5jbGFtcCgpKS51bmtub3duKGkudW5rbm93bigpKX1mdW5jdGlvbiBiaygpe3ZhciBpPVExLHQ9UTEsZT12MCxuLHIscyxvPXJhLGEsbCxjO2Z1bmN0aW9uIHUoKXt2YXIgZj1NYXRoLm1pbihpLmxlbmd0aCx0Lmxlbmd0aCk7cmV0dXJuIG8hPT1yYSYmKG89eGsoaVswXSxpW2YtMV0pKSxhPWY+Mj9Tazp2ayxsPWM9bnVsbCxofWZ1bmN0aW9uIGgoZil7cmV0dXJuIGY9PW51bGx8fGlzTmFOKGY9K2YpP3M6KGx8fChsPWEoaS5tYXAobiksdCxlKSkpKG4obyhmKSkpfXJldHVybiBoLmludmVydD1mdW5jdGlvbihmKXtyZXR1cm4gbyhyKChjfHwoYz1hKHQsaS5tYXAobiksJGYpKSkoZikpKX0saC5kb21haW49ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9QXJyYXkuZnJvbShmLF9rKSx1KCkpOmkuc2xpY2UoKX0saC5yYW5nZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BcnJheS5mcm9tKGYpLHUoKSk6dC5zbGljZSgpfSxoLnJhbmdlUm91bmQ9ZnVuY3Rpb24oZil7cmV0dXJuIHQ9QXJyYXkuZnJvbShmKSxlPWdrLHUoKX0saC5jbGFtcD1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1mPyEwOnJhLHUoKSk6byE9PXJhfSxoLmludGVycG9sYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWYsdSgpKTplfSxoLnVua25vd249ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZixoKTpzfSxmdW5jdGlvbihmLGQpe3JldHVybiBuPWYscj1kLHUoKX19ZnVuY3Rpb24gd2soKXtyZXR1cm4gYmsoKShyYSxyYSl9ZnVuY3Rpb24gQWsoaSl7cmV0dXJuIE1hdGguYWJzKGk9TWF0aC5yb3VuZChpKSk+PTFlMjE/aS50b0xvY2FsZVN0cmluZygiZW4iKS5yZXBsYWNlKC8sL2csIiIpOmkudG9TdHJpbmcoMTApfWZ1bmN0aW9uIFhmKGksdCl7aWYoKGU9KGk9dD9pLnRvRXhwb25lbnRpYWwodC0xKTppLnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLG49aS5zbGljZSgwLGUpO3JldHVybltuLmxlbmd0aD4xP25bMF0rbi5zbGljZSgyKTpuLCtpLnNsaWNlKGUrMSldfWZ1bmN0aW9uIHNhKGkpe3JldHVybiBpPVhmKE1hdGguYWJzKGkpKSxpP2lbMV06TmFOfWZ1bmN0aW9uIEVrKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Zm9yKHZhciByPWUubGVuZ3RoLHM9W10sbz0wLGE9aVswXSxsPTA7cj4wJiZhPjAmJihsK2ErMT5uJiYoYT1NYXRoLm1heCgxLG4tbCkpLHMucHVzaChlLnN1YnN0cmluZyhyLT1hLHIrYSkpLCEoKGwrPWErMSk+bikpOylhPWlbbz0obysxKSVpLmxlbmd0aF07cmV0dXJuIHMucmV2ZXJzZSgpLmpvaW4odCl9fWZ1bmN0aW9uIFRrKGkpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKGUpe3JldHVybiBpWytlXX0pfX12YXIgQ2s9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyh+KT8oW2EteiVdKT8kL2k7ZnVuY3Rpb24gcWYoaSl7aWYoISh0PUNrLmV4ZWMoaSkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIraSk7dmFyIHQ7cmV0dXJuIG5ldyBNMCh7ZmlsbDp0WzFdLGFsaWduOnRbMl0sc2lnbjp0WzNdLHN5bWJvbDp0WzRdLHplcm86dFs1XSx3aWR0aDp0WzZdLGNvbW1hOnRbN10scHJlY2lzaW9uOnRbOF0mJnRbOF0uc2xpY2UoMSksdHJpbTp0WzldLHR5cGU6dFsxMF19KX1xZi5wcm90b3R5cGU9TTAucHJvdG90eXBlO2Z1bmN0aW9uIE0wKGkpe3RoaXMuZmlsbD1pLmZpbGw9PT12b2lkIDA/IiAiOmkuZmlsbCsiIix0aGlzLmFsaWduPWkuYWxpZ249PT12b2lkIDA/Ij4iOmkuYWxpZ24rIiIsdGhpcy5zaWduPWkuc2lnbj09PXZvaWQgMD8iLSI6aS5zaWduKyIiLHRoaXMuc3ltYm9sPWkuc3ltYm9sPT09dm9pZCAwPyIiOmkuc3ltYm9sKyIiLHRoaXMuemVybz0hIWkuemVybyx0aGlzLndpZHRoPWkud2lkdGg9PT12b2lkIDA/dm9pZCAwOitpLndpZHRoLHRoaXMuY29tbWE9ISFpLmNvbW1hLHRoaXMucHJlY2lzaW9uPWkucHJlY2lzaW9uPT09dm9pZCAwP3ZvaWQgMDoraS5wcmVjaXNpb24sdGhpcy50cmltPSEhaS50cmltLHRoaXMudHlwZT1pLnR5cGU9PT12b2lkIDA/IiI6aS50eXBlKyIifU0wLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh0aGlzLndpZHRoPT09dm9pZCAwPyIiOk1hdGgubWF4KDEsdGhpcy53aWR0aHwwKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodGhpcy5wcmVjaXNpb249PT12b2lkIDA/IiI6Ii4iK01hdGgubWF4KDAsdGhpcy5wcmVjaXNpb258MCkpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O2Z1bmN0aW9uIFJrKGkpe3Q6Zm9yKHZhciB0PWkubGVuZ3RoLGU9MSxuPS0xLHI7ZTx0OysrZSlzd2l0Y2goaVtlXSl7Y2FzZSIuIjpuPXI9ZTticmVhaztjYXNlIjAiOm49PT0wJiYobj1lKSxyPWU7YnJlYWs7ZGVmYXVsdDppZighK2lbZV0pYnJlYWsgdDtuPjAmJihuPTApO2JyZWFrfXJldHVybiBuPjA/aS5zbGljZSgwLG4pK2kuc2xpY2UocisxKTppfXZhciB0dztmdW5jdGlvbiBQayhpLHQpe3ZhciBlPVhmKGksdCk7aWYoIWUpcmV0dXJuIGkrIiI7dmFyIG49ZVswXSxyPWVbMV0scz1yLSh0dz1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3Ioci8zKSkpKjMpKzEsbz1uLmxlbmd0aDtyZXR1cm4gcz09PW8/bjpzPm8/bituZXcgQXJyYXkocy1vKzEpLmpvaW4oIjAiKTpzPjA/bi5zbGljZSgwLHMpKyIuIituLnNsaWNlKHMpOiIwLiIrbmV3IEFycmF5KDEtcykuam9pbigiMCIpK1hmKGksTWF0aC5tYXgoMCx0K3MtMSkpWzBdfWZ1bmN0aW9uIGV3KGksdCl7dmFyIGU9WGYoaSx0KTtpZighZSlyZXR1cm4gaSsiIjt2YXIgbj1lWzBdLHI9ZVsxXTtyZXR1cm4gcjwwPyIwLiIrbmV3IEFycmF5KC1yKS5qb2luKCIwIikrbjpuLmxlbmd0aD5yKzE/bi5zbGljZSgwLHIrMSkrIi4iK24uc2xpY2UocisxKTpuK25ldyBBcnJheShyLW4ubGVuZ3RoKzIpLmpvaW4oIjAiKX12YXIgbnc9eyIlIjooaSx0KT0+KGkqMTAwKS50b0ZpeGVkKHQpLGI6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygyKSxjOmk9PmkrIiIsZDpBayxlOihpLHQpPT5pLnRvRXhwb25lbnRpYWwodCksZjooaSx0KT0+aS50b0ZpeGVkKHQpLGc6KGksdCk9PmkudG9QcmVjaXNpb24odCksbzppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDgpLHA6KGksdCk9PmV3KGkqMTAwLHQpLHI6ZXcsczpQayxYOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkseDppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDE2KX07ZnVuY3Rpb24gaXcoaSl7cmV0dXJuIGl9dmFyIHJ3PUFycmF5LnByb3RvdHlwZS5tYXAsc3c9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO2Z1bmN0aW9uIElrKGkpe3ZhciB0PWkuZ3JvdXBpbmc9PT12b2lkIDB8fGkudGhvdXNhbmRzPT09dm9pZCAwP2l3OkVrKHJ3LmNhbGwoaS5ncm91cGluZyxOdW1iZXIpLGkudGhvdXNhbmRzKyIiKSxlPWkuY3VycmVuY3k9PT12b2lkIDA/IiI6aS5jdXJyZW5jeVswXSsiIixuPWkuY3VycmVuY3k9PT12b2lkIDA/IiI6aS5jdXJyZW5jeVsxXSsiIixyPWkuZGVjaW1hbD09PXZvaWQgMD8iLiI6aS5kZWNpbWFsKyIiLHM9aS5udW1lcmFscz09PXZvaWQgMD9pdzpUayhydy5jYWxsKGkubnVtZXJhbHMsU3RyaW5nKSksbz1pLnBlcmNlbnQ9PT12b2lkIDA/IiUiOmkucGVyY2VudCsiIixhPWkubWludXM9PT12b2lkIDA/IuKIkiI6aS5taW51cysiIixsPWkubmFuPT09dm9pZCAwPyJOYU4iOmkubmFuKyIiO2Z1bmN0aW9uIGMoaCl7aD1xZihoKTt2YXIgZj1oLmZpbGwsZD1oLmFsaWduLHA9aC5zaWduLHk9aC5zeW1ib2wsZz1oLnplcm8sbT1oLndpZHRoLHY9aC5jb21tYSx4PWgucHJlY2lzaW9uLF89aC50cmltLE09aC50eXBlO009PT0ibiI/KHY9ITAsTT0iZyIpOm53W01dfHwoeD09PXZvaWQgMCYmKHg9MTIpLF89ITAsTT0iZyIpLChnfHxmPT09IjAiJiZkPT09Ij0iKSYmKGc9ITAsZj0iMCIsZD0iPSIpO3ZhciBiPXk9PT0iJCI/ZTp5PT09IiMiJiYvW2JveFhdLy50ZXN0KE0pPyIwIitNLnRvTG93ZXJDYXNlKCk6IiIsQT15PT09IiQiP246L1slcF0vLnRlc3QoTSk/bzoiIixFPW53W01dLHc9L1tkZWZncHJzJV0vLnRlc3QoTSk7eD14PT09dm9pZCAwPzY6L1tncHJzXS8udGVzdChNKT9NYXRoLm1heCgxLE1hdGgubWluKDIxLHgpKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLHgpKTtmdW5jdGlvbiBTKFQpe3ZhciBEPWIsTD1BLE4sRixCO2lmKE09PT0iYyIpTD1FKFQpK0wsVD0iIjtlbHNle1Q9K1Q7dmFyIEc9VDwwfHwxL1Q8MDtpZihUPWlzTmFOKFQpP2w6RShNYXRoLmFicyhUKSx4KSxfJiYoVD1SayhUKSksRyYmK1Q9PTAmJnAhPT0iKyImJihHPSExKSxEPShHP3A9PT0iKCI/cDphOnA9PT0iLSJ8fHA9PT0iKCI/IiI6cCkrRCxMPShNPT09InMiP3N3WzgrdHcvM106IiIpK0wrKEcmJnA9PT0iKCI/IikiOiIiKSx3KXtmb3IoTj0tMSxGPVQubGVuZ3RoOysrTjxGOylpZihCPVQuY2hhckNvZGVBdChOKSw0OD5CfHxCPjU3KXtMPShCPT09NDY/citULnNsaWNlKE4rMSk6VC5zbGljZShOKSkrTCxUPVQuc2xpY2UoMCxOKTticmVha319fXYmJiFnJiYoVD10KFQsMS8wKSk7dmFyIGs9RC5sZW5ndGgrVC5sZW5ndGgrTC5sZW5ndGgsUT1rPG0/bmV3IEFycmF5KG0taysxKS5qb2luKGYpOiIiO3N3aXRjaCh2JiZnJiYoVD10KFErVCxRLmxlbmd0aD9tLUwubGVuZ3RoOjEvMCksUT0iIiksZCl7Y2FzZSI8IjpUPUQrVCtMK1E7YnJlYWs7Y2FzZSI9IjpUPUQrUStUK0w7YnJlYWs7Y2FzZSJeIjpUPVEuc2xpY2UoMCxrPVEubGVuZ3RoPj4xKStEK1QrTCtRLnNsaWNlKGspO2JyZWFrO2RlZmF1bHQ6VD1RK0QrVCtMO2JyZWFrfXJldHVybiBzKFQpfXJldHVybiBTLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGgrIiJ9LFN9ZnVuY3Rpb24gdShoLGYpe3ZhciBkPWMoKGg9cWYoaCksaC50eXBlPSJmIixoKSkscD1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3Ioc2EoZikvMykpKSozLHk9TWF0aC5wb3coMTAsLXApLGc9c3dbOCtwLzNdO3JldHVybiBmdW5jdGlvbihtKXtyZXR1cm4gZCh5Km0pK2d9fXJldHVybntmb3JtYXQ6Yyxmb3JtYXRQcmVmaXg6dX19dmFyIFlmLG93LGF3O0xrKHt0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pO2Z1bmN0aW9uIExrKGkpe3JldHVybiBZZj1JayhpKSxvdz1ZZi5mb3JtYXQsYXc9WWYuZm9ybWF0UHJlZml4LFlmfWZ1bmN0aW9uIERrKGkpe3JldHVybiBNYXRoLm1heCgwLC1zYShNYXRoLmFicyhpKSkpfWZ1bmN0aW9uIFVrKGksdCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHNhKHQpLzMpKSkqMy1zYShNYXRoLmFicyhpKSkpfWZ1bmN0aW9uIE5rKGksdCl7cmV0dXJuIGk9TWF0aC5hYnMoaSksdD1NYXRoLmFicyh0KS1pLE1hdGgubWF4KDAsc2EodCktc2EoaSkpKzF9ZnVuY3Rpb24gRmsoaSx0LGUsbil7dmFyIHI9dUwoaSx0LGUpLHM7c3dpdGNoKG49cWYobj09bnVsbD8iLGYiOm4pLG4udHlwZSl7Y2FzZSJzIjp7dmFyIG89TWF0aC5tYXgoTWF0aC5hYnMoaSksTWF0aC5hYnModCkpO3JldHVybiBuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHM9VWsocixvKSkmJihuLnByZWNpc2lvbj1zKSxhdyhuLG8pfWNhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHM9TmsocixNYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyh0KSkpKSYmKG4ucHJlY2lzaW9uPXMtKG4udHlwZT09PSJlIikpO2JyZWFrfWNhc2UiZiI6Y2FzZSIlIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihzPURrKHIpKSYmKG4ucHJlY2lzaW9uPXMtKG4udHlwZT09PSIlIikqMik7YnJlYWt9fXJldHVybiBvdyhuKX1mdW5jdGlvbiBCayhpKXt2YXIgdD1pLmRvbWFpbjtyZXR1cm4gaS50aWNrcz1mdW5jdGlvbihlKXt2YXIgbj10KCk7cmV0dXJuIGNMKG5bMF0sbltuLmxlbmd0aC0xXSxlPT1udWxsPzEwOmUpfSxpLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSxuKXt2YXIgcj10KCk7cmV0dXJuIEZrKHJbMF0scltyLmxlbmd0aC0xXSxlPT1udWxsPzEwOmUsbil9LGkubmljZT1mdW5jdGlvbihlKXtlPT1udWxsJiYoZT0xMCk7dmFyIG49dCgpLHI9MCxzPW4ubGVuZ3RoLTEsbz1uW3JdLGE9bltzXSxsLGMsdT0xMDtmb3IoYTxvJiYoYz1vLG89YSxhPWMsYz1yLHI9cyxzPWMpO3UtLSA+MDspe2lmKGM9RW0obyxhLGUpLGM9PT1sKXJldHVybiBuW3JdPW8sbltzXT1hLHQobik7aWYoYz4wKW89TWF0aC5mbG9vcihvL2MpKmMsYT1NYXRoLmNlaWwoYS9jKSpjO2Vsc2UgaWYoYzwwKW89TWF0aC5jZWlsKG8qYykvYyxhPU1hdGguZmxvb3IoYSpjKS9jO2Vsc2UgYnJlYWs7bD1jfXJldHVybiBpfSxpfWZ1bmN0aW9uIGIwKCl7dmFyIGk9d2soKTtyZXR1cm4gaS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE1rKGksYjAoKSl9LFh6LmFwcGx5KGksYXJndW1lbnRzKSxCayhpKX1mdW5jdGlvbiBPayhpLHQpe3JldHVybiBpLm1hcChlPT57Y29uc3Qgbj1bXTtsZXQgcjtyZXR1cm4gZS5mb3JFYWNoKHM9PntpZihyKXtjb25zdCBvPWtvKHMscikqMTgwL01hdGguUEk7aWYobz50KXtjb25zdCBhPVhMKHIscyksbD0xL01hdGguY2VpbChvL3QpO2xldCBjPWw7Zm9yKDtjPDE7KW4ucHVzaChhKGMpKSxjKz1sfX1uLnB1c2gocj1zKX0pLG59KX1mdW5jdGlvbiB6ayhpLHttaW5Mbmc6dCxtYXhMbmc6ZSxtaW5MYXQ6bixtYXhMYXQ6cn09e30pe2NvbnN0IHM9TWF0aC5yb3VuZChXcygzNjAvaSwyKS9NYXRoLlBJKSxvPSgxK01hdGguc3FydCg1KSkvMixhPWQ9PmQvbyozNjAlMzYwLTE4MCxsPWQ9Pk1hdGguYWNvcygyKmQvcy0xKS9NYXRoLlBJKjE4MC05MCxjPWQ9PnMqKE1hdGguY29zKChkKzkwKSpNYXRoLlBJLzE4MCkrMSkvMix1PVtyIT09dm9pZCAwP01hdGguY2VpbChjKHIpKTowLG4hPT12b2lkIDA/TWF0aC5mbG9vcihjKG4pKTpzLTFdLGg9dD09PXZvaWQgMCYmZT09PXZvaWQgMD8oKT0+ITA6dD09PXZvaWQgMD9kPT5kPD1lOmU9PT12b2lkIDA/ZD0+ZD49dDplPj10P2Q9PmQ+PXQmJmQ8PWU6ZD0+ZD49dHx8ZDw9ZSxmPVtdO2ZvcihsZXQgZD11WzBdO2Q8PXVbMV07ZCsrKXtjb25zdCBwPWEoZCk7aChwKSYmZi5wdXNoKFtwLGwoZCldKX1yZXR1cm4gZn1mdW5jdGlvbiB3MChpLHQsZT0hMSl7cmV0dXJuIGU/JEwodCxpKTp2eihpLHQpfWZ1bmN0aW9uIGtrKGksdCl7Y29uc3QgZT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6aX0sW1tuLHJdLFtzLG9dXT1kUyhlKTtpZihNYXRoLm1pbihNYXRoLmFicyhzLW4pLE1hdGguYWJzKG8tcikpPHQpcmV0dXJuW107Y29uc3QgYT1uPnN8fG8+PTg5fHxyPD0tODk7cmV0dXJuIHprKHQse21pbkxuZzpuLG1heExuZzpzLG1pbkxhdDpyLG1heExhdDpvfSkuZmlsdGVyKGw9PncwKGwsZSxhKSl9ZnVuY3Rpb24gVmsoaSx7cmVzb2x1dGlvbjp0PTEvMCxiYm94OmUscHJvamVjdGlvbjpufT17fSl7Y29uc3Qgcj1PayhpLHQpLHM9bWwociksbz1rayhpLHQpLGE9Wy4uLnMsLi4ub10sbD17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6aX0sW1tjLHVdLFtoLGZdXT1kUyhsKSxkPWM+aHx8Zj49ODl8fHU8PS04OTtsZXQgcD1bXTtpZihkKXtjb25zdCBNPSR6KGEpLnRyaWFuZ2xlcygpLGI9bmV3IE1hcChhLm1hcCgoW0EsRV0sdyk9PltgJHtBfS0ke0V9YCx3XSkpO00uZmVhdHVyZXMuZm9yRWFjaChBPT57Y29uc3QgRT1BLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLnNsaWNlKDAsMykucmV2ZXJzZSgpLHc9W107aWYoRS5mb3JFYWNoKChbUyxUXSk9Pntjb25zdCBEPWAke1N9LSR7VH1gO2IuaGFzKEQpJiZ3LnB1c2goYi5nZXQoRCkpfSksdy5sZW5ndGg9PT0zKXtpZih3LnNvbWUoUz0+UzxzLmxlbmd0aCkpe2NvbnN0IFM9QS5wcm9wZXJ0aWVzLmNpcmN1bWNlbnRlcjtpZighdzAoUyxsLGQpKXJldHVybn1wLnB1c2goLi4udyl9fSl9ZWxzZSBpZihvLmxlbmd0aCl7Y29uc3QgTT1GbC5mcm9tKGEpO2ZvcihsZXQgYj0wLEE9TS50cmlhbmdsZXMubGVuZ3RoO2I8QTtiKz0zKXtjb25zdCBFPVsyLDEsMF0ubWFwKFM9Pk0udHJpYW5nbGVzW2IrU10pLHc9RS5tYXAoUz0+YVtTXSk7aWYoRS5zb21lKFM9PlM8cy5sZW5ndGgpKXtjb25zdCBTPVswLDFdLm1hcChUPT5oTCh3LEQ9PkRbVF0pKTtpZighdzAoUyxsLGQpKWNvbnRpbnVlfXAucHVzaCguLi5FKX19ZWxzZXtjb25zdHt2ZXJ0aWNlczpNLGhvbGVzOmI9W119PUtTKHIpO3A9TUQoTSxiLDIpfWxldCB5PWU/W2VbMF0sZVsyXV06Q2goYSxNPT5NWzBdKSxnPWU/W2VbMV0sZVszXV06Q2goYSxNPT5NWzFdKTtpZihuKXtjb25zdFtNLGJdPW4oW3lbMF0sZ1swXV0pLFtBLEVdPW4oW3lbMV0sZ1sxXV0pO3k9W00sQV0sZz1bLWIsLUVdfWNvbnN0IG09YjAoeSxbMCwxXSksdj1iMChnLFswLDFdKSx4PWEubWFwKChbTSxiXSk9PntpZihuKXtjb25zdFtBLEVdPW4oW00sYl0pO3JldHVyblttKEEpLHYoLUUpXX1lbHNlIHJldHVyblttKE0pLHYoYildfSk7cmV0dXJue2NvbnRvdXI6cix0cmlhbmdsZXM6e3BvaW50czphLGluZGljZXM6cCx1dnM6eH19fWNvbnN0IGx3PW5ldyBGdCgpLnNldEF0dHJpYnV0ZT8ic2V0QXR0cmlidXRlIjoiYWRkQXR0cmlidXRlIjtmdW5jdGlvbiBaZihpLHQsZSxuKXtjb25zdCByPWkubWFwKHM9PnMubWFwKChbbyxhXSk9PntpZihuKXtjb25zdFtsLGNdPW4oW28sYV0pO3JldHVybltsLC1jLHRdfXJldHVybiBlP0szKG8sYSx0KTpbbyxhLHRdfSkpO3JldHVybiBLUyhyKX1mdW5jdGlvbiBHayhpLHQsZSxuLHIpe2NvbnN0e3ZlcnRpY2VzOnMsaG9sZXM6b309WmYoaSx0LG4scikse3ZlcnRpY2VzOmF9PVpmKGksZSxuLHIpLGw9bWwoW2Esc10pLGM9TWF0aC5yb3VuZChhLmxlbmd0aC8zKSx1PW5ldyBTZXQobyk7bGV0IGg9MDtjb25zdCBmPVtdO2ZvcihsZXQgcD0wO3A8YztwKyspe2xldCB5PXArMTtpZih5PT09Yyl5PWg7ZWxzZSBpZih1Lmhhcyh5KSl7Y29uc3QgZz15O3k9aCxoPWd9Zi5wdXNoKHAscCtjLHkrYyksZi5wdXNoKHkrYyx5LHApfWNvbnN0IGQ9W107Zm9yKGxldCBwPTE7cD49MDtwLS0pZm9yKGxldCB5PTA7eTxjO3krPTEpZC5wdXNoKHkvKGMtMSkscCk7cmV0dXJue2luZGljZXM6Zix2ZXJ0aWNlczpsLHV2czpkLHRvcFZlcnRzOmF9fWZ1bmN0aW9uIGN3KGksdCxlLG4scixzKXtyZXR1cm57aW5kaWNlczpuP2kuaW5kaWNlczppLmluZGljZXMuc2xpY2UoKS5yZXZlcnNlKCksdmVydGljZXM6WmYoW2kucG9pbnRzXSx0LHIscykudmVydGljZXMsdXZzOmV9fWNvbnN0IHV3PSh7cG9seWdvbkdlb0pzb246aSxzdGFydEhlaWdodDp0LGVuZEhlaWdodDplLGN1cnZhdHVyZVJlc29sdXRpb246bj0xLGNhcnRlc2lhbjpyPSEwLGhhc1NpZGU6cz0hMCxoYXNCb3R0b206bz0hMSxoYXNUb3A6YT0hMSxwcm9qZWN0aW9uOmwsYmJveDpjfSk9PntpLmZvckVhY2gobT0+e256KG0pfHxtLnJldmVyc2UoKX0pO2NvbnN0e2NvbnRvdXI6dSx0cmlhbmdsZXM6aH09VmsoaSx7cmVzb2x1dGlvbjpuLGJib3g6Yyxwcm9qZWN0aW9uOmx9KTtsZXQgZj17fSxkO3MmJihmPUdrKHUsdCE9bnVsbD90OmUsZSE9bnVsbD9lOnQscixsKSxkPWYudG9wVmVydHMpO2xldCBwPVtdOyhvfHxhKSYmKHA9bWwoaC51dnMpKTtsZXQgeT17fTtvJiYoeT1jdyhoLHQscCwhMSxyLGwpKTtsZXQgZz17fTtyZXR1cm4gYSYmKGc9Y3coaCxlLHAsITAscixsKSkse2NvbnRvdXI6dSx0cmlhbmdsZXM6aCxzaWRlVG9yc286Zixib3R0b21DYXA6eSx0b3BDYXA6Zyx0b3BWZXJ0czpkfX07Y2xhc3MgSGsgZXh0ZW5kcyBGdHtjb25zdHJ1Y3Rvcih0LGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5Z29uQnVmZmVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz1vbih7cG9seWdvbkdlb0pzb246dCxzdGFydEhlaWdodDowLGVuZEhlaWdodDoxLGhhc1RvcDohMCx0b3BGaXJzdDohMSxoYXNCb3R0b206ITAsaGFzU2lkZTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOjEsY2FydGVzaWFuOiEwLHVzZXJEYXRhUnNvT2Zmc2V0OjB9LGUpO2NvbnN0e2VuZEhlaWdodDpuLGhhc1RvcDpyLHRvcEZpcnN0OnMsaGFzQm90dG9tOm8saGFzU2lkZTphLGNhcnRlc2lhbjpsLHVzZXJEYXRhUnNvT2Zmc2V0OmMscHJvamVjdGlvbjp1fT10aGlzLnBhcmFtZXRlcnMse2NvbnRvdXI6aCxzaWRlVG9yc286Zix0b3BWZXJ0czpkLGJvdHRvbUNhcDpwLHRvcENhcDp5fT11dyhvbih7fSx0aGlzLnBhcmFtZXRlcnMpKTtsZXQgZz1bXSxtPVtdLHY9W10seD0wO2NvbnN0IF89TT0+e2NvbnN0IGI9TWF0aC5yb3VuZChnLmxlbmd0aC8zKSxBPXYubGVuZ3RoO2c9Zy5jb25jYXQoTS52ZXJ0aWNlcyksbT1tLmNvbmNhdChNLnV2cyksdj12LmNvbmNhdChiP00uaW5kaWNlcy5tYXAoRT0+RStiKTpNLmluZGljZXMpLHRoaXMuYWRkR3JvdXAoQSx2Lmxlbmd0aC1BLHgrKyl9O3ImJnMmJl8oeSksYSYmKF8oZiksdGhpcy51c2VyRGF0YS50b3BWZXJ0cz1jP1pmKGgsbitjLGwsdSkudmVydGljZXM6ZCksbyYmXyhwKSxyJiYhcyYmXyh5KSx0aGlzLnNldEluZGV4KHYpLHRoaXNbbHddKCJwb3NpdGlvbiIsbmV3IE10KGcsMykpLHRoaXNbbHddKCJ1diIsbmV3IE10KG0sMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX19dmFyIFdrPWk9Pntjb25zdCBhPWkse2Nvb3JkaW5hdGU6dCxzdGFydEhlaWdodDplLGhlaWdodDpufT1hLHI9U3coYSxbImNvb3JkaW5hdGUiLCJzdGFydEhlaWdodCIsImhlaWdodCJdKTtsZXQgcz1lfHwwO3JldHVybiB0eXBlb2YgZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuIT0idW5kZWZpbmVkIiYmKHM9ZStuKSxuZXcgSGsoW3RdLEZpKG9uKHt9LHIpLHtzdGFydEhlaWdodDplLGVuZEhlaWdodDpzfSkpfTtlTCh7ZXh0cnVkZVBvbHlnb246Z0QsbGluZTp4RCxsaW5lMjpTRCxjb25pY1BvbHlnb246KHtjb29yZGluYXRlc0FycjppLHN0YXJ0OnQsZGVwdGg6ZSx1c2VHcm91cHM6bixoYXNUb3A6cix0b3BGaXJzdDpzLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxjYXJ0ZXNpYW46bCxwcm9qZWN0aW9uOmMsY3VydmF0dXJlUmVzb2x1dGlvbjp1LGJib3g6aCxiYm94T2Zmc2V0OmZ9KT0+e2NvbnN0IGQ9YyYmU2woYyk7aWYoZCYmKGw9ITEsaCYmZikpe2xldCB5PWQoW2hbMF0saFsxXV0pLGc9ZChbaFsyXSxoWzNdXSk7eVsxXT0teVsxXSxnWzFdPS1nWzFdLHlbMF0rPWZbMF0seVsxXSs9ZlsxXSxnWzBdKz1mWzJdLGdbMV0rPWZbM10seT1kLmludmVydChbeVswXSwteVsxXV0pfHx5LGc9ZC5pbnZlcnQoW2dbMF0sLWdbMV1dKXx8ZyxoPVt5WzBdLHlbMV0sZ1swXSxnWzFdXX10fHwodD1bMF0pO2NvbnN0IHA9aS5tYXAoKHksZyk9Pnt2YXIgbSx2O3JldHVybiBXayh7Y29vcmRpbmF0ZTp5LHByb2plY3Rpb246ZCxzdGFydEhlaWdodDoobT10W2ddKSE9bnVsbD9tOnRbMF0saGVpZ2h0Oih2PWVbZ10pIT1udWxsP3Y6ZVswXSxoYXNUb3A6ciE9bnVsbD9yOiEwLHRvcEZpcnN0OnMhPW51bGw/czohMSxoYXNCb3R0b206byE9bnVsbD9vOiEwLGhhc1NpZGU6YSE9bnVsbD9hOiEwLGNhcnRlc2lhbjpsIT1udWxsP2w6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjp1IT1udWxsP3U6MSxiYm94Omh9KX0pO3JldHVybiBNbChwLG4pfSxjb25pY0xpbmU6KHtjb29yZGluYXRlc0FycjppLGxpbmVXaWR0aDp0LHN0YXJ0OmUsdXNlR3JvdXBzOm59KT0+e2NvbnN0IHM9aS5tYXAoKG8sYSk9Pnt2YXIgbDtyZXR1cm4gdXcoe3BvbHlnb25HZW9Kc29uOltvXSxzdGFydEhlaWdodDoobD1lW2FdKSE9bnVsbD9sOmVbMF19KS50b3BWZXJ0c30pLm1hcCgobyxhKT0+e3ZhciBjO2NvbnN0IGw9KGM9dFthXSkhPW51bGw/Yzp0WzBdO3JldHVybiBxUyh7bm9kZXM6byxzZXRQb2ludFdpZHRoOigpPT5sfSl9KTtyZXR1cm4gTWwocyxuKX19KX0pKCk7Cg==",q=c=>Uint8Array.from(atob(c),e=>e.charCodeAt(0)),k=typeof window!="undefined"&&window.Blob&&new Blob([q(T)],{type:"text/javascript;charset=utf-8"});function $(c){let e;try{if(e=k&&(window.URL||window.webkitURL).createObjectURL(k),!e)throw"";const s=new Worker(e,{name:c==null?void 0:c.name});return s.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(e)}),s}catch(s){return new Worker("data:text/javascript;base64,"+T,{name:c==null?void 0:c.name})}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const n=c=>{const e=new BufferGeometry;return Object.keys(c).forEach(s=>{s==="groups"?c[s].forEach(r=>{e.addGroup(r.start,r.count,r.materialIndex)}):s==="index"?e.setIndex(new BufferAttribute(c[s].array,c[s].itemSize)):e.setAttribute(s,new BufferAttribute(c[s].array,c[s].itemSize))}),e};class Cl{constructor(e){this.pluginName="worker",this.bufferGeometryLoader=new BufferGeometryLoader,this.cacheObj={},this._dispose=!1,this.options=L({dbName:"base",cacheVersion:"1"},e),this.store=createStore(this.options.dbName,"attributes")}install(e){this.pencil=e;const s=new esusLite.WorkerPool($,{maxWorkers:this.options.maxWorkers});this.pool=s}geoGeometry(e,s){return a(this,null,function*(){const{mesaage:r,cacheKey:f,userData:de,cacheVersion:Xe,cb:Je}=L(L({},this.options),s),Ke=this.pool,{err:Qe,res:_e}=yield Ke.exec(e,[L({},r)],void 0,!0);if(Qe)throw Qe;const $e=n(_e);if(Object.assign($e.userData,L({},de)),Je&&(yield Je($e)),f){const{cacheObj:qe}=this;qe[f]||(qe[f]={[Xe]:[]}),qe[f][Xe].push(L({attributes:_e},de))}return $e})}getCachedGeometry(e){return a(this,null,function*(){const{cacheKey:s,cacheVersion:r}=e;if(s){const f=yield get(s,this.store),de=r||this.options.cacheVersion;return f!=null&&f[de]?f[de].map(Xe=>{const Je=Xe,{attributes:Ke}=Je,Qe=F(Je,["attributes"]),_e=n(Ke);return Object.assign(_e.userData,L({},Qe)),_e}):[]}else return[]})}saveCache(){setMany(Object.entries(this.cacheObj),this.store)}dispose(){this.cacheObj={},this.pool.dispose(),this._dispose=!0}}class z extends Loader{constructor(e){super(e),this.options={type:"image"}}setOptions(e){return this.options=e,this}load(e,s,r,f){let de,Xe;this.options.type==="image"?(Xe=document.createElement("img"),de=new Texture(Xe)):this.options.type==="video"?(Xe=document.createElement("video"),Xe.preload="auto",Xe.autoplay=!1,Xe.loop=!1,Xe.muted=!0,Xe.setAttribute("webkit-playsinline","webkit-playsinline"),Xe.setAttribute("playsinline",""),de=new VideoTexture(Xe)):de=new Texture;const Je=new FileLoader(this.manager);return Je.setResponseType("blob"),Je.setRequestHeader(this.requestHeader),Je.setPath(this.path),Je.setWithCredentials(this.withCredentials),Je.load(e,Ke=>{let Qe=Ke;const _e=e.split(".").pop(),$e=this.options.type==="image"?`image/${_e||"png"}`:`video/${_e||"mp4"}`;Qe=Qe.slice(0,Ke.size,$e);const qe=()=>{Xe.removeEventListener("load",st,!1),Xe.removeEventListener("error",dt,!1)},st=()=>{qe(),de.needsUpdate=!0,s&&s(de)},dt=Yt=>{qe(),f&&f(Yt),this.manager.itemError(e),this.manager.itemEnd(e)};Xe.addEventListener("load",st,!1),Xe.addEventListener("error",dt,!1);const Wt=window.URL.createObjectURL(Qe);Xe.src=Wt},r,f),de}}class _ extends Loader{constructor(e){super(e)}load(e,s,r,f){const de=new FileLoader(this.manager);de.setResponseType("blob"),de.setRequestHeader(this.requestHeader),de.setPath(this.path),de.setWithCredentials(this.withCredentials),de.load(e,Xe=>{const Je=Xe,Ke=new DecompressionStream("gzip"),Qe=Je.stream().pipeThrough(Ke);new Response(Qe).json().then(_e=>{s==null||s(_e)}).catch(_e=>{f==null||f(_e)})},r,f)}}const ll={images:["png","jpg","jpeg","ico","webp","avif"],media:["mp4","webm","ogg"],gltf:["gltf","glb"],json:["json","geojson"],gzipJson:["json.gzip"],exr:["exr"],lottie:["lottie.json"]};class Jl{constructor(e={}){this.pluginName="loader",this.loadObj=[],this.delLoadArr=[],this.assets=new Map,this.event=new P$2.EventEmitter,this.options={},this.options=L({simpleTexture4deleted:!1,prefix:""},e),this.loadingManager=new LoadingManager(()=>{},(s,r,f)=>{this.emit("progress",r,f)},s=>{console.warn(`Failed to load ${s}`)})}emit(e,...s){this.event.emit(e,...s)}on(e,s){this.event.on(e,s)}getAsset(e){const s=this.getAssetType(e);if(!s)return;const r=this.assets.get(e);if(!r){if((s==="images"||s==="media"||s==="exr")&&this.options.simpleTexture4deleted&&this.delLoadArr.includes(e))return new Texture;console.warn(`Asset ${e} not found`)}return r}getAssetType(e){var s;const r=(s=e.split(".").pop())==null?void 0:s.toLowerCase();if(r){if(e.endsWith("lottie.json"))return"lottie";if(e.endsWith("json.gzip"))return"gzipJson"}else return;for(const[f,de]of Object.entries(ll))if(de.includes(r))return f}install(e){this.pencil=e}getLoader(e,s){if(e==="images")return this.textureLoader||(this.textureLoader=new z(this.loadingManager),this.options.prefix&&this.textureLoader.setPath(this.options.prefix)),this.textureLoader;if(e==="media")return this.videoTextureLoader||(this.videoTextureLoader=new z(this.loadingManager),this.videoTextureLoader.setOptions({type:"video"}),this.options.prefix&&this.videoTextureLoader.setPath(this.options.prefix)),this.videoTextureLoader;if(e==="gltf"&&s!=null&&s.dracoPath)return this.dracoGltfLoader||(this.dracoGltfLoader=new GLTFLoader(this.loadingManager),this.dracoLoader=new DRACOLoader,this.dracoLoader.setDecoderPath(s==null?void 0:s.dracoPath),this.dracoGltfLoader.setDRACOLoader(this.dracoLoader),this.options.prefix&&this.dracoGltfLoader.setPath(this.options.prefix)),this.dracoGltfLoader;if(e==="gltf")return this.gltfLoader||(this.gltfLoader=new GLTFLoader(this.loadingManager),this.options.prefix&&this.gltfLoader.setPath(this.options.prefix)),this.gltfLoader;if(e==="lottie")return this.lottieLoader||(this.lottieLoader=new LottieLoader(this.loadingManager),this.options.prefix&&this.lottieLoader.setPath(this.options.prefix)),this.lottieLoader;if(e==="gzipJson")return this.gzipJsonLoader||(this.gzipJsonLoader=new _(this.loadingManager),this.options.prefix&&this.gzipJsonLoader.setPath(this.options.prefix)),this.gzipJsonLoader;if(e==="json")return this.jsonLoader||(this.jsonLoader=new FileLoader(this.loadingManager),this.jsonLoader.setResponseType("json"),this.options.prefix&&this.jsonLoader.setPath(this.options.prefix)),this.jsonLoader;if(e==="exr")return this.exrLoader||(this.exrLoader=new EXRLoader(this.loadingManager),this.options.prefix&&this.exrLoader.setPath(this.options.prefix)),this.exrLoader}add(e,s){typeof e=="string"&&(e=[e]),e.forEach(r=>{const f=L({src:r},s);this.loadObj.push(f)})}getSrcByAsset(e,s=this.assets){let r;return s.forEach((f,de)=>{f===e&&(r=de)}),r}get textureAssets(){const e=new Map;return this.assets.forEach((s,r)=>{(s instanceof Texture||s instanceof DataTexture||s instanceof VideoTexture)&&e.set(r,s)}),e}loadAll(){return a(this,null,function*(){const e=this.loadObj.filter(s=>!this.delLoadArr.includes(s.src));return yield Promise.all(e.map(s=>this.load(s.src,s)))})}load(e,s){return a(this,null,function*(){var r,f;const de=this.getAssetType(e);if(!de)return;const Xe=(s==null?void 0:s.cache)!==!1,Je=esusLite.makePromiseCreator();if(Xe){if(this.assets.has(e))return this.assets.get(e);this.assets.set(e,Je.promise)}const Ke=this.getLoader(de,s);try{const Qe=yield Ke.loadAsync(e);if(this.assets.set(e,Qe),Je.resolve(Qe),de==="images"||de==="media"||de==="exr"||de==="lottie")if(this.pencil){(s==null?void 0:s.colorCorrection)!==!1&&this.pencil.renderer.outputColorSpace===o$2.sRGB&&l({texture:Qe});const _e=(f=(r=s==null?void 0:s.anisotropy)!=null?r:this.options.anisotropy)!=null?f:this.pencil.maxAnisotropy;Qe.anisotropy=_e}else console.warn("load after install");return Qe}catch(Qe){Je.reject(`Failed to load ${e}`);return}})}getUnusedAssets(){const e=new Set,s=this.textureAssets;this.pencil.scene.traverse(f=>{const de=f;de.material&&(Array.isArray(de.material)?de.material:[de.material]).forEach(Xe=>{[Xe.map,Xe.emissiveMap,Xe.normalMap,Xe.roughnessMap,Xe.metalnessMap,Xe.aoMap].forEach(Je=>{if(Je){const Ke=this.getSrcByAsset(Je,s);Ke&&e.add(Ke)}})})});const r=new Set(this.textureAssets.keys());return e.forEach(f=>{r.delete(f)}),[...r,...this.delLoadArr]}dispose(){var e;this.assets.clear(),(e=this.dracoLoader)==null||e.dispose(),this.event.removeAllListeners(),this.delLoadArr.length=0,this.loadObj.length=0}}class RoomEnvironment extends Scene{constructor(){super();const e=new BoxGeometry;e.deleteAttribute("uv");const s=new MeshStandardMaterial({side:BackSide}),r=new MeshStandardMaterial,f=new PointLight(16777215,900,28,2);f.position.set(.418,16.199,.3),this.add(f);const de=new Mesh(e,s);de.position.set(-.757,13.219,.717),de.scale.set(31.713,28.305,28.591),this.add(de);const Xe=new Mesh(e,r);Xe.position.set(-10.906,2.009,1.846),Xe.rotation.set(0,-.195,0),Xe.scale.set(2.328,7.905,4.651),this.add(Xe);const Je=new Mesh(e,r);Je.position.set(-5.607,-.754,-.758),Je.rotation.set(0,.994,0),Je.scale.set(1.97,1.534,3.955),this.add(Je);const Ke=new Mesh(e,r);Ke.position.set(6.167,.857,7.803),Ke.rotation.set(0,.561,0),Ke.scale.set(3.927,6.285,3.687),this.add(Ke);const Qe=new Mesh(e,r);Qe.position.set(-2.017,.018,6.124),Qe.rotation.set(0,.333,0),Qe.scale.set(2.002,4.566,2.064),this.add(Qe);const _e=new Mesh(e,r);_e.position.set(2.291,-.756,-2.621),_e.rotation.set(0,-.286,0),_e.scale.set(1.546,1.552,1.496),this.add(_e);const $e=new Mesh(e,r);$e.position.set(-2.193,-.369,-5.547),$e.rotation.set(0,.516,0),$e.scale.set(3.875,3.487,2.986),this.add($e);const qe=new Mesh(e,createAreaLightMaterial(50));qe.position.set(-16.116,14.37,8.208),qe.scale.set(.1,2.428,2.739),this.add(qe);const st=new Mesh(e,createAreaLightMaterial(50));st.position.set(-16.109,18.021,-8.207),st.scale.set(.1,2.425,2.751),this.add(st);const dt=new Mesh(e,createAreaLightMaterial(17));dt.position.set(14.904,12.198,-1.832),dt.scale.set(.15,4.265,6.331),this.add(dt);const Wt=new Mesh(e,createAreaLightMaterial(43));Wt.position.set(-.462,8.89,14.52),Wt.scale.set(4.38,5.441,.088),this.add(Wt);const Yt=new Mesh(e,createAreaLightMaterial(20));Yt.position.set(3.235,11.486,-12.541),Yt.scale.set(2.5,2,.1),this.add(Yt);const rt=new Mesh(e,createAreaLightMaterial(100));rt.position.set(0,20,0),rt.scale.set(1,.1,1),this.add(rt)}dispose(){const e=new Set;this.traverse(s=>{s.isMesh&&(e.add(s.geometry),e.add(s.material))});for(const s of e)s.dispose()}}function createAreaLightMaterial(c){const e=new MeshBasicMaterial;return e.color.setScalar(c),e}class Event{constructor(){F0(this,"event",new events.EventEmitter);F0(this,"eventHandlers",{});F0(this,"on",this.event.on.bind(this.event));F0(this,"emit",this.event.emit.bind(this.event))}addListener(e,s,r,f=!1){s in this.eventHandlers||(this.eventHandlers[s]=[]),this.eventHandlers[s].push({node:e,handler:r,capture:f}),e.addEventListener(s,r,f)}removeListener(e,s){this.eventHandlers[s].filter(({node:r})=>e?r===e:!0).forEach(({node:r,handler:f,capture:de})=>r.removeEventListener(s,f,de)),this.eventHandlers[s]=this.eventHandlers[s].filter(({node:r})=>e?r!==e:!1)}removeAllListeners(){Object.keys(this.eventHandlers).forEach(e=>{this.removeListener("",e)}),this.eventHandlers={}}dispose(){this.removeAllListeners(),this.event.removeAllListeners()}}class Command{constructor(e){F0(this,"id");F0(this,"updatable");F0(this,"type");F0(this,"name");F0(this,"editor");F0(this,"json",{});this.id=-1,this.updatable=!1,this.type="",this.name="",this.editor=e}toJSON(){const e={};return e.type=this.type,e.id=this.id,e.name=this.name,e.updatable=this.updatable,e}fromJSON(e){if(this.type=e.type,this.id=e.id,this.name=e.name,this.updatable=e.updatable,!this.editor.jsonVersion&&e.objectUuid){const s=this.editor.objectByUuid(e.objectUuid);s&&(e.objectUuid=this.editor.uuidByObject(s));const r=this.editor.baseObjectByUuid(e.objectUuid);r&&(e.objectUuid=this.editor.uuidByBaseObject(r))}}fixJSON(){}}class SetColor extends Command{constructor(e,s,r,f){super(e),this.type="SetColor",this.name=`Set ${r}`,this.updatable=!0,this.object=s,this.attributeName=r,this.oldValue=s!==void 0?this.object[this.attributeName].getHex():void 0,this.newValue=f}execute(){this.object&&(this.object[this.attributeName].setHex(this.newValue),this.editor.emit("objectChanged",this.object))}undo(){this.object[this.attributeName].setHex(this.oldValue),this.editor.emit("objectChanged",this.object)}update(e){this.newValue=e.newValue}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.attributeName=this.attributeName,e.oldValue=this.oldValue,e.newValue=this.newValue,e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),this.attributeName=e.attributeName,this.oldValue=e.oldValue,this.newValue=e.newValue}}class SetMaterialColor extends Command{constructor(e,s,r,f,de){super(e),this.type="SetMaterialColor",this.name=`Set Material.${r}`,this.updatable=!0,this.object=s,this.materialSlot=de,this.material=this.editor.getObjectMaterial(s,de),this.oldValue=this.material!==void 0?this.material[r].getHex():void 0,this.newValue=f,this.attributeName=r}execute(){this.material[this.attributeName].setHex(this.newValue),this.editor.emit("materialChanged",this.material)}undo(){this.material[this.attributeName].setHex(this.oldValue),this.editor.emit("materialChanged",this.material)}update(e){this.newValue=e.newValue}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.materialSlot=this.materialSlot,e.attributeName=this.attributeName,e.oldValue=this.oldValue,e.newValue=this.newValue,e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),this.materialSlot=e.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=e.attributeName,this.oldValue=e.oldValue,this.newValue=e.newValue}}class SetMaterial extends Command{constructor(e,s,r,f){var de;super(e),this.type="SetMaterial",this.name="New Material",this.object=s,this.materialSlot=f,this.oldMaterial=this.editor.getObjectMaterial(s,f),this.newMaterial=r,(de=this.oldMaterial)!=null&&de.name&&(this.newMaterial.name=this.oldMaterial.name)}execute(){var e;this.oldMaterial=this.editor.getObjectMaterial(this.object,this.materialSlot),(e=this.oldMaterial)!=null&&e.onBeforeCompile&&(this.newMaterial.onBeforeCompile=this.oldMaterial.onBeforeCompile),this.editor.setObjectMaterial(this.object,this.materialSlot,this.newMaterial),this.editor.emit("materialChanged",this.newMaterial)}undo(){this.editor.setObjectMaterial(this.object,this.materialSlot,this.oldMaterial),this.editor.emit("materialChanged",this.oldMaterial)}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.materialSlot=this.materialSlot,e.oldMaterial=this.oldMaterial.toJSON(),e.newMaterial=this.newMaterial.toJSON(),e}fromJSON(e){var r;super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),this.materialSlot=e.materialSlot,this.oldMaterial=s(e.oldMaterial),this.newMaterial=s(e.newMaterial),((r=this.newMaterial.envMap)==null?void 0:r.name)==="PMREM.cubeUv"&&(this.newMaterial.envMap=this.editor.viewport.vis.getRoomEnvMap());function s(f){if(!f)return null;const de=new ObjectLoader,Xe=de.parseImages(f.images),Je=de.parseTextures(f.textures,Xe);return de.parseMaterials([f],Je)[f.uuid]}}}const TEXTURE_MAPPING={UVMapping,CubeReflectionMapping,CubeRefractionMapping,EquirectangularReflectionMapping,EquirectangularRefractionMapping,CubeUVReflectionMapping},TEXTURE_WRAPPING={RepeatWrapping,ClampToEdgeWrapping,MirroredRepeatWrapping},TEXTURE_FILTER={NearestFilter,NearestMipmapNearestFilter,NearestMipmapLinearFilter,LinearFilter,LinearMipmapNearestFilter,LinearMipmapLinearFilter};class SetMaterialMap extends Command{constructor(e,s,r,f,de){super(e),this.type="SetMaterialMap",this.name=`Set Material.${r}`,this.object=s,this.materialSlot=de,this.material=this.editor.getObjectMaterial(s,de),this.oldMap=s!==void 0?this.material[r]:void 0,this.newMap=f,this.oldMap&&this.newMap&&(this.newMap.wrapS=this.oldMap.wrapS,this.newMap.wrapT=this.oldMap.wrapT),this.mapName=r}execute(){var e;(e=this.oldMap)==null||e.dispose(),this.newMap&&(this.newMap.anisotropy=this.editor.viewport.vis.tier0?1:this.editor.pencil.maxAnisotropy),this.material[this.mapName]=this.newMap,this.material instanceof it$1&&(this.material.useMap=!!this.newMap,this.newMap&&this.newMap.wrapS!==RepeatWrapping&&(this.newMap.wrapS=RepeatWrapping,this.newMap.wrapT=RepeatWrapping,this.newMap.needsUpdate=!0)),(!this.oldMap&&this.newMap||this.oldMap&&!this.newMap)&&(this.material.needsUpdate=!0),this.editor.emit("materialChanged",this.material)}undo(){this.material[this.mapName]=this.oldMap,this.material instanceof it$1&&(this.material.useMap=!!this.newMap),(!this.oldMap&&this.newMap||this.oldMap&&!this.newMap)&&(this.material.needsUpdate=!0),this.editor.emit("materialChanged",this.material)}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.materialSlot=this.materialSlot,e.mapName=this.mapName,e.newMap=serializeMap(this.newMap),e.oldMap=serializeMap(this.oldMap),e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),this.materialSlot=e.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.mapName=e.mapName,this.oldMap=parseTexture(e.oldMap),this.newMap=parseTexture(e.newMap)}}function parseTexture(c){let e=null;if(c){const s=new ObjectLoader;if(c.isVideoTexture){const r=document.createElement("video");r.src=c.images[0].url,r.muted=!0,r.autoplay=!0,r.loop=!0,r.preload="auto",r.play();const f={[c.images[0].uuid]:new VideoTexture(r)};e=parseVideoTextures([c],f)[c.uuid]}else{const r=s.parseImages(c.images);e=s.parseTextures([c],r)[c.uuid]}e.sourceFile=c.sourceFile}return e}const parseVideoTextures=(c,e)=>{function s(f,de){return typeof f=="number"?f:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",f),de[f])}const r={};if(c!==void 0)for(let f=0,de=c.length;f<de;f++){const Xe=c[f];let Je=e[Xe.image];Je.needsUpdate=!0,Je.uuid=Xe.uuid,Xe.name!==void 0&&(Je.name=Xe.name),Xe.mapping!==void 0&&(Je.mapping=s(Xe.mapping,TEXTURE_MAPPING)),Xe.channel!==void 0&&(Je.channel=Xe.channel),Xe.offset!==void 0&&Je.offset.fromArray(Xe.offset),Xe.repeat!==void 0&&Je.repeat.fromArray(Xe.repeat),Xe.center!==void 0&&Je.center.fromArray(Xe.center),Xe.rotation!==void 0&&(Je.rotation=Xe.rotation),Xe.wrap!==void 0&&(Je.wrapS=s(Xe.wrap[0],TEXTURE_WRAPPING),Je.wrapT=s(Xe.wrap[1],TEXTURE_WRAPPING)),Xe.format!==void 0&&(Je.format=Xe.format),Xe.internalFormat!==void 0&&(Je.internalFormat=Xe.internalFormat),Xe.type!==void 0&&(Je.type=Xe.type),Xe.colorSpace!==void 0&&(Je.colorSpace=Xe.colorSpace),Xe.encoding!==void 0&&(Je.encoding=Xe.encoding),Xe.minFilter!==void 0&&(Je.minFilter=s(Xe.minFilter,TEXTURE_FILTER)),Xe.magFilter!==void 0&&(Je.magFilter=s(Xe.magFilter,TEXTURE_FILTER)),Xe.anisotropy!==void 0&&(Je.anisotropy=Xe.anisotropy),Xe.flipY!==void 0&&(Je.flipY=Xe.flipY),Xe.generateMipmaps!==void 0&&(Je.generateMipmaps=Xe.generateMipmaps),Xe.premultiplyAlpha!==void 0&&(Je.premultiplyAlpha=Xe.premultiplyAlpha),Xe.unpackAlignment!==void 0&&(Je.unpackAlignment=Xe.unpackAlignment),Xe.compareFunction!==void 0&&(Je.compareFunction=Xe.compareFunction),Xe.userData!==void 0&&(Je.userData=Xe.userData),r[Xe.uuid]=Je}return r};function serializeMap(c){if(c==null)return null;const e={geometries:{},materials:{},textures:{},images:{}},s=c.toJSON(e),r=extractFromCache(e.images);return c instanceof VideoTexture&&(r[0].url=c.source.data.src,s.isVideoTexture=!0),r.length>0&&(s.images=r),s.sourceFile=c.sourceFile,s}function extractFromCache(c){const e=[];for(const s in c){const r=c[s];delete r.metadata,e.push(r)}return e}const needsUpdateAttributeName=["transparent","alphaTest","fog","vertexColors","vertexShader","fragmentShader","sizeAttenuation"];class SetMaterialValue extends Command{constructor(e,s,r,f,de){super(e),this.type="SetMaterialValue",this.name=`Set Material.${r}`,this.updatable=!0,this.object=s,this.materialSlot=de,this.material=this.editor.getObjectMaterial(s,de),this.oldValue=this.material!==void 0?this.material[r]:void 0,this.newValue=f,this.attributeName=r}execute(){this.material!==void 0&&(this.material[this.attributeName]=this.newValue,needsUpdateAttributeName.includes(this.attributeName)&&(this.material.needsUpdate=!0),this.editor.emit("objectChanged",this.object),this.editor.emit("materialChanged",this.material),setTimeout(()=>{this.attributeName==="name"&&this.editor.pencil.event.emit("object3dListChange")}))}undo(){this.material[this.attributeName]=this.oldValue,needsUpdateAttributeName.includes(this.attributeName)&&(this.material.needsUpdate=!0),this.editor.emit("objectChanged",this.object),this.editor.emit("materialChanged",this.material),setTimeout(()=>{this.attributeName==="name"&&this.editor.pencil.event.emit("object3dListChange")})}update(e){this.newValue=e.newValue}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.materialSlot=this.materialSlot,e.attributeName=this.attributeName,e.oldValue=this.oldValue,e.newValue=this.newValue,e}fromJSON(e){super.fromJSON(e),this.attributeName=e.attributeName,this.oldValue=e.oldValue,this.newValue=e.newValue,this.object=this.editor.objectByUuid(e.objectUuid),this.materialSlot=e.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot)}}class SetMaterialVector extends Command{constructor(e,s,r,f,de){super(e),this.type="SetMaterialVector",this.name=`Set Material.${r}`,this.updatable=!0,this.object=s,this.materialSlot=de,this.material=this.editor.getObjectMaterial(s,de),this.oldValue=this.material!==void 0?this.material[r].toArray():void 0,this.newValue=f,this.attributeName=r}execute(){this.material[this.attributeName].fromArray(this.newValue),this.editor.emit("materialChanged",this.material)}undo(){this.material[this.attributeName].fromArray(this.oldValue),this.editor.emit("materialChanged",this.material)}update(e){this.newValue=e.newValue}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.materialSlot=this.materialSlot,e.attributeName=this.attributeName,e.oldValue=this.oldValue,e.newValue=this.newValue,e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),this.materialSlot=e.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=e.attributeName,this.oldValue=e.oldValue,this.newValue=e.newValue}}class SetMaterialMapVector extends Command{constructor(e,s,r,f,de,Xe="repeat"){var Je,Ke,Qe,_e;super(e),this.type="SetMaterialMapVector",this.attributeName2=Xe,this.name=`Set Material.${r}.${Xe}`,this.updatable=!0,this.object=s,this.materialSlot=de,this.material=this.editor.getObjectMaterial(s,de),this.material instanceof it$1&&r==="map"&&Xe==="repeat"?this.oldValue=this.material.repeat.toArray():((Ke=(Je=this.material)==null?void 0:Je[r])==null?void 0:Ke[Xe])instanceof Vector2?this.oldValue=this.material[r][Xe].toArray():typeof((_e=(Qe=this.material)==null?void 0:Qe[r])==null?void 0:_e[Xe])!="undefined"&&(this.oldValue=this.material[r][Xe]),this.newValue=f,this.attributeName=r}execute(){var e,s,r,f,de;if((e=this.material)!=null&&e[this.attributeName]){const Xe=this.attributeName;this.material[Xe].wrapS!==RepeatWrapping&&(this.material[Xe].wrapS=RepeatWrapping,this.material[Xe].wrapT=RepeatWrapping,this.material[Xe].needsUpdate=!0)}this.material instanceof it$1&&this.attributeName==="map"&&this.attributeName2==="repeat"?this.material[this.attributeName2].fromArray(this.newValue):((r=(s=this.material)==null?void 0:s[this.attributeName])==null?void 0:r[this.attributeName2])instanceof Vector2?this.material[this.attributeName][this.attributeName2].fromArray(this.newValue):typeof((de=(f=this.material)==null?void 0:f[this.attributeName])==null?void 0:de[this.attributeName2])!="undefined"&&(this.material[this.attributeName][this.attributeName2]=this.newValue),this.editor.emit("materialChanged",this.material)}undo(){var e,s,r,f;this.material instanceof it$1&&this.attributeName==="map"&&this.attributeName2==="repeat"?this.material[this.attributeName2].fromArray(this.oldValue):((s=(e=this.material)==null?void 0:e[this.attributeName])==null?void 0:s[this.attributeName2])instanceof Vector2?this.material[this.attributeName][this.attributeName2].fromArray(this.oldValue):typeof((f=(r=this.material)==null?void 0:r[this.attributeName])==null?void 0:f[this.attributeName2])!="undefined"&&(this.material[this.attributeName][this.attributeName2]=this.oldValue),this.editor.emit("materialChanged",this.material)}update(e){this.newValue=e.newValue}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.materialSlot=this.materialSlot,e.attributeName=this.attributeName,e.attributeName2=this.attributeName2,e.oldValue=this.oldValue,e.newValue=this.newValue,e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),this.materialSlot=e.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=e.attributeName,e.attributeName2&&(this.attributeName2=e.attributeName2),this.oldValue=e.oldValue,this.newValue=e.newValue,this.attributeName==="repeat"&&(this.attributeName="map")}}class SetPosition extends Command{constructor(e,s,r,f,de){super(e),this.type="SetPosition",this.name="Set Position",this.updatable=!0,this.cameraControls=de,this.object=s,s!==void 0&&r!==void 0&&(this.oldPosition=s.position.clone(),this.newPosition=r.clone()),f!==void 0&&(this.oldPosition=f.clone())}execute(){this.cameraControls?this.cameraControls.setPosition(this.newPosition.x,this.newPosition.y,this.newPosition.z,!1):(this.object.position.copy(this.newPosition),this.object.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}undo(){this.cameraControls?this.cameraControls.setPosition(this.oldPosition.x,this.oldPosition.y,this.oldPosition.z,!1):(this.object.position.copy(this.oldPosition),this.object.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}update(e){this.newPosition.copy(e.newPosition)}toJSON(){var s;const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.oldPosition=(s=this.oldPosition)==null?void 0:s.toArray(),e.newPosition=this.newPosition.toArray(),e.cameraControls=!!this.cameraControls,e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),e.oldPosition&&(this.oldPosition=new Vector3().fromArray(e.oldPosition)),this.newPosition=new Vector3().fromArray(e.newPosition),e.cameraControls&&(this.cameraControls=this.editor.pencil.controls)}}class SetRotation extends Command{constructor(e,s,r,f){super(e),this.type="SetRotation",this.name="Set Rotation",this.updatable=!0,this.object=s,s!==void 0&&r!==void 0&&(this.oldRotation=s.rotation.clone(),this.newRotation=r.clone()),f!==void 0&&(this.oldRotation=f.clone())}execute(){this.object.rotation.copy(this.newRotation),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}undo(){this.object.rotation.copy(this.oldRotation),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}update(e){this.newRotation.copy(e.newRotation)}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.oldRotation=this.oldRotation.toArray(),e.newRotation=this.newRotation.toArray(),e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),e.oldRotation&&(this.oldRotation=new Euler().fromArray(e.oldRotation)),this.newRotation=new Euler().fromArray(e.newRotation)}}class SetScale extends Command{constructor(e,s,r,f){super(e),this.type="SetScale",this.name="Set Scale",this.updatable=!0,this.object=s,s!==void 0&&r!==void 0&&(this.oldScale=s.scale.clone(),this.newScale=r.clone()),f!==void 0&&(this.oldScale=f.clone())}execute(){this.object.scale.copy(this.newScale),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}undo(){this.object.scale.copy(this.oldScale),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}update(e){this.newScale.copy(e.newScale)}toJSON(){var s;const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.oldScale=(s=this.oldScale)==null?void 0:s.toArray(),e.newScale=this.newScale.toArray(),e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),e.oldScale&&(this.oldScale=new Vector3().fromArray(e.oldScale)),this.newScale=new Vector3().fromArray(e.newScale)}}class SetValue extends Command{constructor(e,s,r,f,de){super(e),this.type="SetValue",this.name=`Set ${r}`,this.updatable=!0,this.object=s,this.properties=de,this.attributeName=r;const Xe=s===void 0?void 0:this.properties?this.object[this.properties]:this.object;this.oldValue=Xe!==void 0?Xe[r]:void 0,this.newValue=f}execute(){const e=this.properties?this.object[this.properties]:this.object;e&&(e instanceof RectAreaLight&&this.attributeName==="castShadow"||(e[this.attributeName]=this.newValue,this.fixObj(),this.editor.emit("objectChanged",this.object),setTimeout(()=>{this.attributeName==="name"&&this.editor.pencil.event.emit("object3dListChange")})))}fixObj(){const e=this.properties?this.object[this.properties]:this.object;e.isCamera&&["fov","left","right","top","bottom","near","far"].includes(this.attributeName)&&e.updateProjectionMatrix()}undo(){const e=this.properties?this.object[this.properties]:this.object;e[this.attributeName]=this.oldValue,this.fixObj(),this.editor.emit("objectChanged",this.object),setTimeout(()=>{this.attributeName==="name"&&this.editor.pencil.event.emit("object3dListChange")})}update(e){this.newValue=e.newValue}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.properties=this.properties,e.attributeName=this.attributeName,e.oldValue=this.oldValue,e.newValue=this.newValue,e}fromJSON(e){super.fromJSON(e),this.attributeName=e.attributeName,this.oldValue=e.oldValue,this.newValue=e.newValue,this.object=this.editor.objectByUuid(e.objectUuid),this.properties=e.properties}}class SetVector extends Command{constructor(e,s,r,f,de){super(e),this.type="SetVector",this.name=`Set ${r}`,this.updatable=!0,this.object=s,this.properties=de,this.attributeName=r;const Xe=s===void 0?void 0:this.properties?this.object[this.properties]:this.object;this.oldValue=Xe!==void 0?Xe[r].toArray():void 0,this.newValue=f}execute(){const e=this.properties?this.object[this.properties]:this.object;e&&(e[this.attributeName].fromArray(this.newValue),this.fixObj(),this.editor.emit("objectChanged",this.object))}fixObj(){this.editor.playing||this.attributeName==="mapSize"&&this.object[this.properties].map&&(this.object[this.properties].map.dispose(),this.object[this.properties].map=null)}undo(){(this.properties?this.object[this.properties]:this.object)[this.attributeName].fromArray(this.oldValue),this.fixObj(),this.editor.emit("objectChanged",this.object)}update(e){this.newValue=e.newValue}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.properties=this.properties,e.attributeName=this.attributeName,e.oldValue=this.oldValue,e.newValue=this.newValue,e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),this.attributeName=e.attributeName,this.oldValue=e.oldValue,this.newValue=e.newValue,this.properties=e.properties}}class AddVis extends Command{constructor(s,r,f){super(s);F0(this,"visType");F0(this,"visOptions");this.type="AddVis",this.visType=r,this.visOptions=f,r!==void 0&&(this.name=`Add Vis: ${r}`)}execute(){return q0(this,null,function*(){yield this.editor.viewport.setVis(this.visType,this.visOptions),this.editor.select(null)})}undo(){const s=window.confirm("将删除所有记录,是否继续?");return s&&this.editor.viewport.dispose(),s}toJSON(){const s=super.toJSON();return s.visType=this.visType,s.visOptions=this.visOptions,s}fromJSON(s){super.fromJSON(s),this.visType=s.visType,this.visOptions=s.visOptions}}class AddObject extends Command{constructor(s,r,f){super(s);F0(this,"objectType");F0(this,"objectOptions");F0(this,"obj");F0(this,"addObjectUuid");this.type="AddObject",this.objectType=r,this.objectOptions=f,r!==void 0&&(this.name=`Add Object: ${r}`)}execute(){return q0(this,null,function*(){var f,de,Xe;this.obj=yield this.editor.viewport.vis.drawController.draw(this.objectType,zi(ci({},this.objectOptions),{key:`${this.id}`}));const s=this.editor.viewport.vis.mList;if(s.objectList.has(this.obj.object3d))(f=this.editor.viewport.vis)==null||f.mList.changeObject3dKey(this.obj.object3d,`$1_${this.id}`);else{const Je=this.obj.objectType.replace("BaseObject#","");(de=this.editor.viewport.vis)==null||de.mList.setObject3d(this.obj.object3d,`${Je}_${this.id}`,{baseObject:this.obj})}this.addObjectUuid=s.getObject3dKey(this.obj.object3d);const r=this.editor.selectOption.at(-1);if(r)if(r.parent){const Je=this.editor.uuidByObject(r.parent);Je&&this.editor.select(Je)}else this.editor.select(r.uuid);else this.editor.select(null);(Xe=this.editor.viewport.vis)==null||Xe.initBaseObjectUserData(this.obj)})}undo(){var s;this.obj.erase(),(s=this.editor.viewport.vis)==null||s.mList.delObject3d(this.obj.object3d),this.editor.select(null)}toJSON(){const s=super.toJSON();return s.objectType=this.objectType,s.objectOptions=this.objectOptions,s.addObjectUuid=this.addObjectUuid,s}fromJSON(s){super.fromJSON(s),this.objectType=s.objectType,this.objectOptions=s.objectOptions,this.addObjectUuid=s.addObjectUuid}fixJSON(){const s=this.json;s&&!s.addObjectUuid&&(s.addObjectUuid=this.addObjectUuid)}}class RemoveObject extends Command{constructor(s,r){super(s);F0(this,"object");F0(this,"objectUuid");this.type="RemoveObject",this.name="Remove Object",this.object=r,this.objectUuid=this.editor.uuidByBaseObject(r)}execute(){var s;this.object.hide(),(s=this.editor.viewport.vis)==null||s.mList.selectHideObject3d(this.object.object3d),this.editor.select(null)}undo(){return q0(this,null,function*(){var s;this.object.show(),(s=this.editor.viewport.vis)==null||s.mList.selectShowObject3d(this.object.object3d)})}toJSON(){const s=super.toJSON();return s.objectUuid=this.objectUuid,s}fromJSON(s){super.fromJSON(s),this.object=this.editor.baseObjectByUuid(s.objectUuid)}}class CopyObject extends Command{constructor(s,r){super(s);F0(this,"object");F0(this,"copyObject",null);F0(this,"copyObjectUuid");this.type="CopyObject",this.name="Copy Object",this.object=r}execute(){return q0(this,null,function*(){var Xe,Je;const s=this.editor.viewport.vis.mList,r=s.getObject3dKey(this.object.object3d),f=yield this.object.instantiate();this.copyObject=f,s.objectList.has(f.object3d)?(Xe=this.editor.viewport.vis)==null||Xe.mList.changeObject3dKey(f.object3d,`$1_${this.id}`):s.setObject3d(f.object3d,`${r}_${this.id}`,{baseObject:f}),this.copyObjectUuid=s.getObject3dKey(f.object3d);const de=this.editor.selectOption.at(-1);if(de)if(de.parent){const Ke=this.editor.uuidByObject(de.parent);Ke&&this.editor.select(Ke)}else this.editor.select(de.uuid);else this.editor.select(null);(Je=this.editor.viewport.vis)==null||Je.initBaseObjectUserData(f)})}undo(){return q0(this,null,function*(){var s,r;(s=this.editor.viewport.vis)==null||s.mList.delObject3d(this.copyObject.object3d),(r=this.copyObject)==null||r.erase(),this.editor.select(null)})}toJSON(){const s=super.toJSON();return s.objectUuid=this.editor.uuidByBaseObject(this.object),s.copyObjectUuid=this.copyObjectUuid,s}fromJSON(s){super.fromJSON(s),this.object=this.editor.baseObjectByUuid(s.objectUuid),this.copyObjectUuid=s.copyObjectUuid}fixJSON(){const s=this.json;s&&!s.copyObjectUuid&&(s.copyObjectUuid=this.copyObjectUuid)}}class SetSetting extends Command{constructor(s,r,f){super(s);F0(this,"attributeName");F0(this,"newValue");F0(this,"oldValue");this.type="SetSetting",this.updatable=!0,this.name=`Set Setting.${r}`,this.attributeName=r,this.newValue=f,s.viewport.vis&&(this.oldValue=s.viewport.vis.settings[r])}execute(){return q0(this,null,function*(){const s=this.editor.viewport.vis;s.settings[this.attributeName]=this.newValue,yield s.settings[this.attributeName],this.editor.emit("settingsChanged")})}undo(){return q0(this,null,function*(){const s=this.editor.viewport.vis;s.settings[this.attributeName]=this.oldValue,yield s.settings[this.attributeName],this.editor.emit("settingsChanged")})}update(s){this.newValue=s.newValue}toJSON(){const s=super.toJSON();return s.name=this.name,s.attributeName=this.attributeName,s.newValue=this.newValue,s.oldValue=this.oldValue,s}fromJSON(s){super.fromJSON(s),this.name=s.name,this.attributeName=s.attributeName||s.name,this.newValue=s.newValue,this.oldValue=s.oldValue}}class SetTarget extends Command{constructor(e,s,r,f,de){super(e),this.type="SetTarget",this.name="Set Target",this.updatable=!0,this.cameraControls=de,this.object=s,s!==void 0&&r!==void 0&&(this.oldPosition=s.position.clone(),this.newPosition=r.clone()),f!==void 0&&(this.oldPosition=f.clone())}execute(){this.cameraControls?this.cameraControls.setTarget(this.newPosition.x,this.newPosition.y,this.newPosition.z,!1):(this.object.target.copy(this.newPosition),this.object.target.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}undo(){this.cameraControls?this.cameraControls.setTarget(this.oldPosition.x,this.oldPosition.y,this.oldPosition.z,!1):(this.object.target.copy(this.oldPosition),this.object.target.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}update(e){this.newPosition.copy(e.newPosition)}toJSON(){var s;const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.oldPosition=(s=this.oldPosition)==null?void 0:s.toArray(),e.newPosition=this.newPosition.toArray(),e.cameraControls=!!this.cameraControls,e}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),e.oldPosition&&(this.oldPosition=new Vector3().fromArray(e.oldPosition)),this.newPosition=new Vector3().fromArray(e.newPosition),e.cameraControls&&(this.cameraControls=this.editor.pencil.controls)}}class SetSceenMap extends SetMaterialMap{constructor(e,s,r,f,de){super(e),this.type="SetSceenMap",this.name="Set Sceen.background",this.object=s,this.materialSlot=de,this.material=s!==void 0?s[de]:void 0,this.oldMap=s!==void 0?this.material[r]:void 0,this.newMap=f,this.oldMap&&this.newMap&&(this.newMap.wrapS=this.oldMap.wrapS,this.newMap.wrapT=this.oldMap.wrapT),this.mapName=r}fromJSON(e){super.fromJSON(e),this.material=this.object[this.materialSlot]}}class SetGeometry extends Command{constructor(e,s=null,r){super(e),this.type="SetGeometry",this.name="Set Geometry",this.updatable=!0,this.object=s,this.oldGeometry=s!==null?s.geometry:null,this.newGeometry=r||null}execute(){this.object.geometry.dispose(),this.object.geometry=this.newGeometry,this.object.geometry.computeBoundingSphere(),this.editor.emit("geometryChanged",this.object)}undo(){this.object.geometry.dispose(),this.object.geometry=this.oldGeometry,this.object.geometry.computeBoundingSphere(),this.editor.emit("geometryChanged",this.object)}update(e){this.newGeometry=e.newGeometry}toJSON(){const e=super.toJSON(this);return e.objectUuid=this.editor.uuidByObject(this.object),e.oldGeometry=this.geometryToJSON(this.oldGeometry),e.newGeometry=this.geometryToJSON(this.newGeometry),e}geometryToJSON(e){return e?e.type==="MeshLine"?{type:"MeshLine",points:e.points,variableWidth:!!e.widthCallback}:e.toJSON():void 0}parseGeometry(e){if(!e)return;if(e.type==="MeshLine"){const f=new he;return f.setPoints(e.points,e.variableWidth?de=>de:void 0),f}return new ObjectLoader().parseGeometries([e])[e.uuid]}fromJSON(e){super.fromJSON(e),this.object=this.editor.objectByUuid(e.objectUuid),this.oldGeometry=this.parseGeometry(e.oldGeometry),this.newGeometry=this.parseGeometry(e.newGeometry)}}const Commands=Object.freeze(Object.defineProperty({__proto__:null,AddObject,AddVis,CopyObject,RemoveObject,SetColor,SetGeometry,SetMaterial,SetMaterialColor,SetMaterialMap,SetMaterialMapVector,SetMaterialValue,SetMaterialVector,SetPosition,SetRotation,SetScale,SetSceenMap,SetSetting,SetTarget,SetValue,SetVector},Symbol.toStringTag,{value:"Module"}));class History{constructor(e){F0(this,"editor");F0(this,"undos");F0(this,"redos");F0(this,"lastCmdTime");F0(this,"idCounter");F0(this,"historyDisabled");this.editor=e,this.undos=[],this.redos=[],this.lastCmdTime=Date.now(),this.idCounter=0,this.historyDisabled=!1}execute(e,s){return q0(this,null,function*(){const r=this.undos[this.undos.length-1],f=Date.now()-this.lastCmdTime;r&&r.updatable&&e.updatable&&r.object===e.object&&r.type===e.type&&r.attributeName===e.attributeName&&r.attributeName2===e.attributeName2&&r.name===e.name&&r.objectUuid===e.objectUuid&&r.materialSlot===e.materialSlot&&f<500?(r.update(e),e=r):(this.undos.push(e),e.id=++this.idCounter),e.name=s!==void 0?s:e.name;try{yield e.execute()}catch(Xe){console.error(Xe,e)}this.editor.playing||(e.json=e.toJSON()),this.lastCmdTime=Date.now(),this.redos=[],this.editor.emit("historyChanged",e)})}undo(){if(this.historyDisabled)return;let e;if(this.undos.length>0&&(e=this.undos.pop()),e!==void 0){if(!e.name){console.log("压缩配置,不支持 undo"),this.undos.push(e);return}e.undo(),this.redos.push(e),this.editor.emit("historyChanged",e)}return e}redo(){if(this.historyDisabled)return;let e;return this.redos.length>0&&(e=this.redos.pop()),e!==void 0&&(e.execute(),this.undos.push(e),this.editor.emit("historyChanged",e)),e}toJSON(){const e={u:[]};for(let s=0;s<this.undos.length;s++)this.undos[s].hasOwnProperty("json")&&e.u.push(this.undos[s].json);return e}fromJSON(e,s){if(e===void 0)return;let r=-1;for(let f=0;f<e.u.length;f++){const de=e.u[f];if(de.id<=r){console.error("历史记录id错误");continue}if(de.id===1&&de.visOptions&&s&&(de.visOptions=s(de.visOptions)),de.type==="SetOption"||!de.type)continue;de.type.endsWith("Command")&&(de.type=de.type.replace("Command",""));const Xe=new Commands[de.type](this.editor);Xe.json=de,Xe.id=de.id,Xe.name=de.name,this.undos.push(Xe),this.idCounter=de.id>this.idCounter?de.id:this.idCounter,r=de.id}this.editor.emit("historyChanged",this.undos[this.undos.length-1])}processUndos(e=1e3/60){return new Promise((s,r)=>{const f=[...this.undos],de=f.length;let Xe=0;const Je=()=>q0(this,null,function*(){const Ke=performance.now();for(;f.length>0&&performance.now()-Ke<e;){if(this.editor._dispose){r("dispose");return}const Qe=f.shift();yield this.executeUndo(Qe),Xe+=1}this.editor.emit("progress",{type:"还原场景",value:Xe/de*100|0}),f.length>0?requestAnimationFrame(Je):s("")});requestAnimationFrame(Je)})}executeUndo(e){return q0(this,null,function*(){e.fromJSON(e.json);try{(e.json.type==="AddObject"||!e.json.objectUuid||e.object)&&(yield e.execute(),e.fixJSON())}catch(s){console.error(s,e)}})}clear(){this.undos.length=0,this.redos.length=0,this.idCounter=0,this.editor.emit("historyChanged",this.undos[this.undos.length-1])}}class Viewport{constructor(e,s){F0(this,"editor");F0(this,"vis");F0(this,"extendsOptions",{});F0(this,"delLoadObj");F0(this,"options");this.options=s,this.editor=e}setSaveCamera(){return q0(this,null,function*(){var f;const e=this.vis.pencil,s=e.cameraPositon,r=e.cameraTarget;yield this.editor.execute(new SetPosition(this.editor,e.camera,s,s,e.controls)),yield this.editor.execute(new SetTarget(this.editor,e.camera,r,r,e.controls)),(f=e.controls)==null||f.saveState()})}addVis(r){return q0(this,arguments,function*(e,s={}){this.replaceVis()&&(yield this.editor.execute(new AddVis(this.editor,e,s)))})}replaceVis(){if(this.vis){const e=window.confirm("将删除所有记录,是否继续?");return e&&this.dispose(),e}return!0}setVis(r){return q0(this,arguments,function*(e,s={}){var de;if(!this.options.visFactories&&(this.editor.setViewportVis(e),!this.options.visFactories)){console.error("visFactories is not defined");return}if(this.vis=this.options.visFactories,this.vis.visName!==e)throw new Error(`visName is not match, import {${e}}`);this.vis.setOptions(ci(ci({},s),this.extendsOptions)),this.delLoadObj&&(this.vis.delLoadArr=this.delLoadObj),this.vis.playing=this.editor.playing,this.vis.on("loaderProgress",(Xe,Je)=>{this.editor.emit("progress",{type:"下载资源",value:Xe/Je*100|0})}),this.vis.on("settingsChanged",()=>{this.editor.emit("settingsChanged")}),this.vis.on("show",()=>{this.editor.emit("visShow")}),yield this.vis.init();const{pencil:f}=this.vis;f.userData.EditorEnv=!this.editor.playing,this.editor.pencil=f,this.editor.changeSelectOption(),this.editor.playing||(this.initEvent(),this.editor.emit("visChanged",this.vis)),(de=this.vis)==null||de.pencil.event.on("object3dListChange",()=>{this.editor.changeSelectOption()})})}setResetCameraUp(){var Xe,Je,Ke;const s=((Xe=this.vis)==null?void 0:Xe.pencil.getPlugin("draw").group).getSize(),r=(s.max.x+s.min.x)/2,f=(s.max.y+s.min.y)/2,de=(Je=this.vis)==null?void 0:Je.pencil.cameraPositon.z;(Ke=this.vis)==null||Ke.pencil.controls.setLookAt(r,f,de,r,f,0,!0)}initEvent(){var s,r,f,de;const{pencil:e}=this.vis;e.controls.addEventListener("update",()=>{this.editor.emit("refreshSidebarObject3D",e.camera)}),(s=e.transformController)==null||s.event.on("change",Xe=>{this.editor.emit("refreshSidebarObject3D",Xe)}),(r=e.transformController)==null||r.event.on("translate",(Xe,Je,Ke)=>{this.editor.execute(new SetPosition(this.editor,Xe,Je,Ke))}),(f=e.transformController)==null||f.event.on("rotate",(Xe,Je,Ke)=>{this.editor.execute(new SetRotation(this.editor,Xe,Je,Ke))}),(de=e.transformController)==null||de.event.on("scale",(Xe,Je,Ke)=>{this.editor.execute(new SetScale(this.editor,Xe,Je,Ke))})}addObj(r){return q0(this,arguments,function*(e,s={}){const f=objs$5[e].getInitOptions;f&&Object.assign(s,f(this.vis.pencil,s)),yield this.editor.execute(new AddObject(this.editor,e,s))})}removeObj(e,s=!1){return q0(this,null,function*(){const{vis:r}=this;if(!r)return;const f=this.editor.baseObjectByUuid(e,s);this.editor.execute(new RemoveObject(this.editor,f))})}copyObj(e,s=!1){return q0(this,null,function*(){const{vis:r}=this;if(!r)return;const f=this.editor.baseObjectByUuid(e,s);this.editor.execute(new CopyObject(this.editor,f))})}setExtendsOptions(e,s){this.extendsOptions[e]=s,this.vis.extendsOptions[e]=s,this.editor.emit("optionsChanged"),setTimeout(()=>{const r=this.editor.toJSON();this.dispose(),this.editor.fromJSON(r)})}toJSON(){var s;const e=(s=this.vis)==null?void 0:s.loader.getUnusedAssets();return{eo:this.extendsOptions,delLoadObj:e}}fromJSON(e){this.extendsOptions=e.eo||{},e.delLoadObj&&e.delLoadObj.length&&(this.delLoadObj=[...e.delLoadObj])}getLoadObj(){return this.vis?[...this.vis.loader.assets.keys()].filter(s=>this.vis.loader.delLoadArr.indexOf(s)===-1):[]}setTransformControlsModal(e){var r;const{pencil:s}=this.vis;(r=s.transformController)==null||r.controls.setMode(e)}dispose(){var e;(e=this.vis)==null||e.dispose(),this.options.visFactories=void 0,this.extendsOptions={},this.delLoadObj=void 0,this.vis=void 0,this.editor.history.clear()}}const compareVersion=(c,e)=>{if(!c&&!e)return 0;if(!c&&e)return-1;if(c&&!e)return 1;const s=c.split("."),r=e.split("."),f=Math.max(s.length,r.length);for(;s.length<f;)s.push("0");for(;r.length<f;)r.push("0");for(let de=0;de<f;de++){const Xe=parseInt(s[de]),Je=parseInt(r[de]);if(Xe>Je)return 1;if(Xe<Je)return-1}return 0},fixJSON=c=>{var e,s,r,f;if(c.c||(c={h:{u:c.u},v:{eo:c.eo,bg:c.bg},c:{name:c.name,version:c.v}}),(e=c.c)!=null&&e.key&&delete c.c.key,compareVersion(c.c.version,"0.5.38")===-1&&((s=c.v)!=null&&s.eo&&Object.keys(c.v.eo).forEach(de=>{["mouseLeft","mouseRight","mouseWheel","label","labelLite","shadowMap","autoRotate","equirectangular"].includes(de)&&(c.v.eo[de]=!!c.v.eo[de])}),c.h.u.forEach(de=>{de.type==="SetSetting"&&(de.attributeName==="阴影"&&(de.attributeName="shadowMap"),de.newValue=!!de.newValue,de.oldValue=!!de.oldValue)})),compareVersion(c.c.version,"0.7.14")===-1&&c.h.u.forEach(de=>{de.objectUuid&&(de.objectUuid=de.objectUuid.replace(de.objectUuid[0],de.objectUuid[0].toLowerCase()))}),c.h.u[0]&&c.h.u[0].visType==="city"&&(c.h.u[0].visOptions.jsonName||(c.h.u=[])),c.h.u[0]&&c.h.u[0].visType==="map"){if(c.h.u[0].visOptions.geojson){const{geojson:de,adcode:Xe,geojsonLite:Je}=c.h.u[0].visOptions;c.h.u[0].visOptions=zi(ci({},c.h.u[0].visOptions),{geojsonMap:{[Xe]:de},extrudeLineGeojsonMap:{[Xe]:Je}}),delete c.h.u[0].visOptions.geojson,delete c.h.u[0].visOptions.geojsonLite}if(c.h.u[0].visOptions.bbox){const{bbox:de,bboxMap:Xe,adcode:Je}=c.h.u[0].visOptions;c.h.u[0].visOptions=zi(ci({},c.h.u[0].visOptions),{bboxMap:Xe||{[Je]:de}}),delete c.h.u[0].visOptions.bbox}if(c.h.u[0].visOptions.worldBg){const{worldBg:de}=c.h.u[0].visOptions;c.h.u[0].visOptions=zi(ci({},c.h.u[0].visOptions),{parentBg:de}),delete c.h.u[0].visOptions.worldBg}compareVersion(c.c.version,"0.13.0")===-1&&c.h.u[0].visOptions.adcode===0&&(c.h.u[0].visType="world")}if(compareVersion(c.c.version,"0.13.0")===-1&&c.h.u[0]&&c.h.u[0].visType==="world"&&(c.h.u[0].visType="map",c.h.u[0].visOptions={adcode:0,mapDepth:5,lineWidth:2,worldPacificCentre:!0,extrudeLine:!1}),c.h.u[0]&&c.h.u[0].visType==="FJ"&&(c.h.u[0].visType="map2"),c.h.u[0]&&c.h.u[0].visType==="map2"){const{adcode:de}=c.h.u[0].visOptions;de===35e4&&(c.h.u[0].visOptions.drillDownHideParent=!0)}return compareVersion(c.c.version,"0.18.1")===-1&&c.h.u[0]&&c.h.u[0].visType==="earth3"&&(c.h.u[0].visType="earth",c.h.u[0].visOptions.style="countryPlate"),compareVersion(c.c.version,"0.18.14")===-1&&c.h.u[0]&&c.h.u[0].visType==="map"&&c.h.u.forEach(de=>{if(de.type==="SetSetting"&&de.attributeName.startsWith("测试")&&typeof de.newValue=="string"&&de.newValue.includes(":::")){const Xe=de.newValue.split(":::")[1];de.attributeName+=":::"+Xe,de.newValue=de.newValue.split(":::")[0],de.oldValue&&typeof de.oldValue=="string"&&(de.oldValue=de.oldValue.split(":::")[0])}}),compareVersion(c.c.version,"0.18.16")===-1&&c.h.u[0]&&c.h.u[0].visType==="map"&&c.h.u.forEach(de=>{if(de.type==="SetSetting"&&de.attributeName.startsWith("测试")&&de.attributeName.includes(":::")&&!de.attributeName.includes("caId")){const Xe=de.attributeName.split(":::")[1];de.attributeName=de.attributeName.replace(Xe,`caId.${Xe}`)}}),compareVersion(c.c.version,"0.21.24")===-1&&c.h.u[0]&&c.h.u[0].visType==="map"&&(f=(r=c.v)==null?void 0:r.eo)!=null&&f.parentBgCurvatureResolution&&(delete c.v.eo.parentBgCurvatureResolution,c.v.eo.parentBgTopSegments=400),c},jsonFetch=(c,e,s=!1)=>{const r=esusLite.makePromiseCreator(!0),f=c.endsWith("gzip")||s;return window.fetch(c).then(de=>{let Xe=de;if(Xe.ok)return f?Xe.blob().then(Je=>{const Ke=new DecompressionStream("gzip"),Qe=Je.stream().pipeThrough(Ke);return new Response(Qe)}):Xe;throw new Error("Network response was not ok.")}).then(de=>de.json()).then(de=>{r.resolve(de)}).catch(de=>{r.reject(de)}),r.promise};class Editor{constructor(e){F0(this,"selected",null);F0(this,"playing",!0);F0(this,"currentMaterialSlot",0);F0(this,"events",new events.EventEmitter);F0(this,"history");F0(this,"viewport");F0(this,"pencil");F0(this,"on",this.events.on.bind(this.events));F0(this,"emit",this.events.emit.bind(this.events));F0(this,"sdkVersion",version);F0(this,"jsonVersion");F0(this,"key");F0(this,"name");F0(this,"open",!1);F0(this,"options");F0(this,"selectOption",[]);F0(this,"selectOption2",[]);F0(this,"checkSelectOption",lodashEs.throttle(e=>{const s=new window.Map;e.forEach(r=>{s.has(r.uuid)?console.warn("uuid重复",r.uuid):s.set(r.uuid,!0)}),s.clear()},500,{leading:!1}));F0(this,"_dispose",!1);this.options=ci({assetsPrefix:"",processUndosMaxFrameTime:Number.MAX_VALUE},e),this.events.setMaxListeners(9999999),this.viewport=new Viewport(this,{visFactories:e.visFactories}),this.history=new History(this)}getObjectMaterial(e,s){if(!e)return;const r=this.pencil.getPlugin("draw").objMap.get(e);let f=e.material||(r==null?void 0:r.userData.material);return Array.isArray(f)&&s!==void 0&&(f=f[s]),f}setObjectMaterial(e,s,r){const f=this.viewport.vis,{mList:de}=f;let Xe=e.material;if(Array.isArray(e.material)&&s!==void 0?(Xe=e.material[s],e.material[s]=r):e.material=r,Xe&&e.userData.fixBufferGeometry){const Je=f.pencil.getPlugin("draw"),Ke=Qe=>{let _e=!1;if(Qe.material)if(Array.isArray(Qe.material)){const $e=Qe.material;$e.forEach((qe,st)=>{qe===Xe&&(_e=!0,$e[st]=r)})}else Qe.material===Xe&&(_e=!0,Qe.material=r);return _e?Qe:null};this.pencil.scene.traverse(Qe=>{const _e=Qe;Ke(_e);const $e=Je.objMap.get(_e);$e!=null&&$e.materialList&&Object.keys($e.materialList).forEach(qe=>{if(qe!==$e.useMaterialType||!Array.isArray($e.materialList[qe])){const st=$e.materialList[qe],dt=Ke({material:st});dt&&$e.setMaterialList(qe,dt.material)}})}),de.materialList.forEach((Qe,_e)=>{Qe===Xe&&de.materialList.set(_e,r)})}}uuidByObject(e){var s;return(s=this.selectOption.find(r=>r.object===e))==null?void 0:s.uuid}objectByUuid(e){var s;return(s=this.selectOption.find(r=>r.uuid===e||r.fixUuid===e))==null?void 0:s.object}uuidByBaseObject(e){var s;return(s=this.selectOption.find(r=>r.baseObject===e))==null?void 0:s.uuid}baseObjectByUuid(e,s=!1){var r,f;return s?(r=this.findSelect2Item(this.selectOption2,e))==null?void 0:r.baseObject:(f=this.selectOption.find(de=>de.uuid===e||de.fixUuid===e))==null?void 0:f.baseObject}findSelect2Item(e,s){for(let r=0;r<e.length;r++){const f=e[r];if(f.uuid===s)return f;if(f.children){const de=this.findSelect2Item(f.children,s);if(de)return de}}}changeSelectOption(){const e=this.viewport.vis,{pencil:s,mList:r}=e,de=r.getValidShowObjectListArr().map(Xe=>{const{key:Je,object3d:Ke,baseObject:Qe,parent:_e}=Xe,$e=Je.replace(Je[0],Je[0].toLowerCase());let qe=!1;return Qe&&Xe.remove!==!1&&(qe=!0),!this.playing&&Qe&&!Qe.userData.bindpicker&&(Qe.userData.bindpicker=!0,Qe.onPointerEvent("click",()=>{this.select($e)})),{uuid:$e,object:Ke,name:Ke.name,baseObject:Qe,remove:qe,parent:_e}});if(de.unshift({name:"场景",object:s.scene,uuid:"scene"},{name:"相机",object:s.camera,uuid:"camera"}),!this.jsonVersion){const Xe=new window.Map;de.forEach((Je,Ke)=>{Xe.has(Je.name)?Je.fixUuid=Je.name+"_"+Ke:(Je.fixUuid=Je.name,Xe.set(Je.name,!0))}),Xe.clear()}this.checkSelectOption(de),this.selectOption=de,this.viewport.vis.drawController.group,this.emit("sceneGraphChanged")}traverseSelectOption2(e){return e.map(s=>(!this.playing&&!s.userData.bindpicker&&(s.userData.bindpicker=!0,s.onPointerEvent("click",()=>{this.select2(s.key)})),{object:s.object3d,id:s.objectType.replace("BaseObject#",""),uuid:s.key,baseObject:s,children:s.children.length>0?this.traverseSelectOption2(s.children):[]}))}execute(e,s){return q0(this,null,function*(){yield this.history.execute(e,s)})}fromJSON(e,s){return q0(this,null,function*(){var r,f,de,Xe;try{window.postMessage({type:"vis-core.fromJSON.start"}),console.time("vis-core:time.fromJSON");let Je;if(typeof e=="string"){const Ke=this.options.assetsPrefix+e,{res:Qe}=yield jsonFetch(Ke);Je=Qe}else Je=e;if(Je=fixJSON(Je),Je.at&&(accessToken.token=Je.at),!this.storage){if(!accessToken.token)throw new Error("设置 token 或平台重新下载 JSON 文件");const Ke=accessToken.getInfo();if(!Ke||!Ke.isValid)throw new Error("need accessToken")}if(compareVersion(Je.c.version,this.sdkVersion)===1&&console.warn("vis-core 版本过低,可能会出现问题","json:"+Je.c.version,"sdk:"+this.sdkVersion),this.setConfig(Je.c),this.history.fromJSON(Je.h,s),this.viewport.fromJSON(Je.v),yield this.history.processUndos(this.options.processUndosMaxFrameTime),(r=Je.v.bg)!=null&&r.texture&&this.viewport.vis){const Ke=parseTexture(Je.v.bg.texture);Ke.colorSpace=SRGBColorSpace,this.viewport.vis.pencil.scene.background=Ke}return(f=this.viewport.vis)==null||f.show(),(de=this.pencil.controls)==null||de.saveState(),this.select(null),console.timeEnd("vis-core:time.fromJSON"),window.postMessage({type:"vis-core.fromJSON.end"}),(Xe=this.viewport.vis)!=null&&Xe.workerOnce&&this.playing&&window.requestIdleCallback(()=>{var Ke;(Ke=this.viewport.vis)==null||Ke.worker.dispose()}),Je}catch(Je){throw window.postMessage({type:"vis-core.fromJSON.error"}),new Error("fromJSON error:"+Je)}})}toJSON(){return{}}select(...e){}select2(...e){}setViewportVis(...e){}setConfig(e){const s={name:this.name,key:this.key,version:this.jsonVersion,open:this.open};e.name&&typeof e.name=="string"&&(this.name=e.name),e.key!==void 0&&(this.key=e.key),e.version!==void 0&&(this.jsonVersion=e.version),e.open!==void 0&&(this.open=e.open),this.emit("configChanged",{name:this.name,key:this.key,version:this.jsonVersion,open:this.open},s)}getDataURL(){return this.pencil?(this.pencil.render(),this.pencil.renderer.domElement.toDataURL()):""}dispose(){this.events.removeAllListeners(),this.viewport.dispose(),this.history.clear(),this._dispose=!0}}const BLOCKLISTED_GPUS=["geforce 320m","geforce 8600","geforce 8600m gt","geforce 8800 gs","geforce 8800 gt","geforce 9400","geforce 9400m g","geforce 9400m","geforce 9600m gt","geforce 9600m","geforce fx go5200","geforce gt 120","geforce gt 130","geforce gt 330m","geforce gtx 285","google swiftshader","intel g41","intel g45","intel gma 4500mhd","intel gma x3100","intel hd 3000","intel q45","legacy","mali-2","mali-3","mali-4","quadro fx 1500","quadro fx 4","quadro fx 5","radeon hd 2400","radeon hd 2600","radeon hd 4670","radeon hd 4850","radeon hd 4870","radeon hd 5670","radeon hd 5750","radeon hd 6290","radeon hd 6300","radeon hd 6310","radeon hd 6320","radeon hd 6490m","radeon hd 6630m","radeon hd 6750m","radeon hd 6770m","radeon hd 6970m","sgx 543","sgx543"],apple=[],amd=["2","3","4","6","11","12","15","25","48","455","535","575","600","610","625","630","640","694","699","880","900","2000","2270","2600","3800","3900","4000","4150","4170","4190","4250","4800","5170","5400","5450","5470","5650","5670","5730","5750","5950","6150","6230","6250","6290","6300","6310","6320","6350","6370","6380","6410","6450","6460","6470","6480","6490","6510","6520","6530","6540","6550","6570","6620","6630","6670","6730","6760","6790","6980","7290","7310","7340","7400","7420","7450","7480","7500","7520","7540","7550","7610","7620","7640","7650","7670","7730","7820","8180","8210","8240","8250","8330","8350","8400","8410","8450","8490","8500","8510","8530","8600","8610","8690","8730","8760","8850","9171","9173","9874","10000","v","9999999999"],radeon=["2","3","4","6","11","25","48","455","535","575","610","625","630","640","880","1305","1605","2600","4150","4250","5000","5400","5450","5470","5650","5670","5730","5750","5770","6230","6250","6290","6300","6310","6320","6350","6370","6380","6410","6450","6460","6470","6480","6490","6510","6520","6530","6540","6550","6570","6620","6630","6670","6730","6760","6790","7000","7290","7310","7340","7400","7420","7450","7480","7500","7520","7540","7550","7610","7620","7640","7650","7670","7730","8180","8210","8240","8250","8330","8350","8400","8410","8450","8490","8500","8510","8530","8600","8610","8690","8730","8850","9171","9173"],nvidia=["1","6","15","51","120","140","160","180","210","220","250","260","295","310","315","320","410","415","420","425","430","440","445","510","525","530","540","545","555","590","605","610","615","625","630","635","705","710","720","730","735","755","765","800","810","820","840","845","860","910","945","1010","1100","1800","2800","5010","5400","8400","8600","9300","9400","9600","9800","gpu","prexpe"],geforce=["10","120","210","240","250","280","295","320","410","415","420","425","430","440","445","510","520","525","530","540","545","555","590","605","610","615","620","625","630","635","705","710","720","730","735","755","765","800","810","820","840","845","860","910","945","1010","2075","8400","8600","9300","9400","9600","9800","gpu","prexpe"],adreno=["5","7","540","618","630","675","680","685"],tier0GPU={apple,amd,radeon,nvidia,geforce,adreno},types=["intel","apple","amd","radeon","nvidia","geforce","adreno"],getGpuType=c=>{for(const e of types)if(c.includes(e))return e},getGPUVersion=c=>{var r;const e=c.replace(/\([^)]+\)/,""),s=e.match(/\d+/)||e.match(/(\W|^)([A-Za-z]{1,3})(\W|$)/g);return(r=s==null?void 0:s.join("").replace(/\W|amd/g,""))!=null?r:""},queryFallback=c=>{const e=BLOCKLISTED_GPUS.find(s=>c.includes(s));return e?{tier:0,gpu:e}:{tier:3,gpu:c}};function queryBenchmarks(c){const e=getGpuType(c);if(!e)return queryFallback(c);if(e==="intel")return{tier:0,gpu:c};const s=tier0GPU[e],r=getGPUVersion(c);return s.includes(r)?{tier:0,renderer:c}:queryFallback(c)}const queryBenchmarks$1=c=>queryBenchmarks(c),detect=()=>{try{const c="vis-core:detect"+version,e=window.localStorage.getItem(c);if(e)return JSON.parse(e);const s=document.createElement("canvas"),r=s.toDataURL("image/webp").indexOf("data:image/webp")==0,f=s.getContext("webgl"),de=f==null?void 0:f.getExtension("WEBGL_debug_renderer_info"),Xe=document.createElement("canvas").getContext("webgl2"),Je=typeof window.WebGL2RenderingContext!="undefined";let Ke="";f&&de&&(Ke=f.getParameter(de.UNMASKED_RENDERER_WEBGL));const Qe=!/SwiftShader/gi.test(Ke),_e=Ke.toLowerCase().replace(/.*angle ?\((.+)\)(?: on vulkan [0-9.]+)?$/i,"$1").replace(/\s(\d{1,2}gb|direct3d.+$)|\(r\)| \([^)]+\)$/g,"").replace(/(?:vulkan|opengl) \d+\.\d+(?:\.\d+)?(?: \((.*)\))?/,"$1"),$e=queryBenchmarks$1(_e),qe=ci({WebP:r,WebGL:!!f,WebGL2:!!Xe,WebGL2RC:Je,isGPUAcceleratorEnabled:Qe},$e);return window.localStorage.setItem(c,JSON.stringify(qe)),qe}catch(c){return console.error("vis-core: feature detection failed",c),""}},IS_DEV=!1;class Base extends Event{constructor(s){super();F0(this,"container");F0(this,"playing",!0);F0(this,"leftTruck",!0);F0(this,"options");F0(this,"pencilConfig",{});F0(this,"showState",!1);F0(this,"settings",{});F0(this,"delLoadArr");F0(this,"extendsOptions",{});F0(this,"pencil");F0(this,"drawController",new Rl(objs$5));F0(this,"mList");F0(this,"loader");F0(this,"worker");F0(this,"workerOnce",!0);F0(this,"pmremGenerator",null);F0(this,"re",null);F0(this,"roomEnvMap");F0(this,"visName");F0(this,"editor");F0(this,"tier0",!1);F0(this,"initSettingsObj");F0(this,"mouseButtonsActiveStore",null);if(this.container=s.container,this.options=ci({assetsPrefix:"",editor:!0,logarithmicDepthBuffer:!0},s),!this.options.assetsPrefix){let r="/";r==="/"&&(r=""),this.options.assetsPrefix=r}if(this.options.editor){const r=detect();this.tier0=r.tier!==3,this.editor=new Editor({assetsPrefix:this.options.assetsPrefix,visFactories:this}),console.info("vis-core:detect",version,JSON.stringify(r,null,2))}this.visName=this.constructor.VisName}setOptions(s){this.options=ci(ci({},this.options),s)}get fromJSON(){return this.editor.fromJSON.bind(this.editor)}get baseObjectByUuid(){return this.editor.baseObjectByUuid.bind(this.editor)}get objectByUuid(){return this.editor.objectByUuid.bind(this.editor)}get getDataURL(){return this.editor.getDataURL.bind(this.editor)}loaderAdd(...s){}initMaterial(...s){return q0(this,null,function*(){})}initVis(...s){return q0(this,null,function*(){})}init(...s){return q0(this,null,function*(){yield this.initPencil(),this.loaderAdd(),console.time(`vis-core:time.${this.visName}-loader`),yield this.loader.loadAll(),console.timeEnd(`vis-core:time.${this.visName}-loader`),yield this.initMaterial(),yield this.initVis(),yield Promise.all(this.drawController.objectsPromise)})}initPencil(){return q0(this,null,function*(){if(this.pencil)return;this.pencilConfig=ci({},this.pencilConfig),this.options.css2DContainer&&(this.pencilConfig.css2DRendererParams={container:this.options.css2DContainer}),this.initPencilPlugin();const s=new Vt$1(ci(ci(zi(ci({container:this.container,isdev:!this.playing&&IS_DEV,stats:!this.playing&&IS_DEV,gui:!this.playing&&IS_DEV,helper:!this.playing,viewHelper:!this.playing,transformControls:!this.playing,css2DRenderer:!0},this.tier0?{composer:{multisampling:0}}:{}),{renderer:{alpha:!0,logarithmicDepthBuffer:this.options.logarithmicDepthBuffer},camera:{near:.1,far:1e3,fov:45},bloom:!0,ssao:!0,ssaoParams:{minDistance:.001},scene:{background:new Color$1(0)}}),this.pencilConfig),this.options.pencilConfig)),r=s.composerController.ssaoPass;r&&(r.enabled=!1),this.leftTruck&&(s.controls.mouseButtons.left=Ts.TRUCK,s.controls.mouseButtons.right=Ts.ROTATE),s.use(this.mList),s.use(this.loader),s.use(this.worker),s.use(this.drawController),yield this.drawController.initGroup(),this.drawController.hide(),this.pencil=s,this.initSceneUserData(),this.playing||(window.vis=this,window.pencil=s),this.initSettings()})}initSceneUserData(){var Je,Ke,Qe,_e,$e,qe;const s=this.pencil,r=s.scene.background,f=r instanceof Color$1?"Color":r instanceof Texture?"Texture":"None",de=f==="Texture"?r:null,Xe=f==="Color"?"#"+r.getHexString():"#000000";s.scene.userData=new Proxy({backgroundType:f,backgroundColor:Xe,backgroundTexture:de,shadowMapEnabled:this.pencil.renderer.shadowMap.enabled,shadowMapType:this.pencil.renderer.shadowMap.type,bloomThreshold:(Ke=(Je=this.pencil.composerController)==null?void 0:Je.bloomPass)==null?void 0:Ke.threshold,bloomRadius:(_e=(Qe=this.pencil.composerController)==null?void 0:Qe.bloomPass)==null?void 0:_e.radius,bloomStrength:(qe=($e=this.pencil.composerController)==null?void 0:$e.bloomPass)==null?void 0:qe.strength},{set:(st,dt,Wt)=>(dt==="shadowMapEnabled"||dt==="shadowMapType"?(dt==="shadowMapEnabled"?this.pencil.renderer.shadowMap.enabled=Wt:dt==="shadowMapType"&&(this.pencil.renderer.shadowMap.type=Wt),this.pencil.scene.traverse(Yt=>{const rt=Yt;if(rt.receiveShadow&&rt.material){const Zt=rt.material;Array.isArray(Zt)?Zt.forEach(vt=>{vt.needsUpdate=!0}):Zt.needsUpdate=!0}})):dt==="backgroundType"?Wt==="None"?s.scene.background=null:s.scene.userData.backgroundColor?s.scene.background=new Color$1(s.scene.userData.backgroundColor):s.scene.userData.backgroundTexture&&(s.scene.background=s.scene.userData.backgroundTexture):dt==="backgroundColor"?s.scene.background=new Color$1(Wt):dt==="backgroundTexture"?s.scene.background=Wt:dt==="bloomThreshold"?s.composerController.bloomPass.threshold=Wt:dt==="bloomRadius"?s.composerController.bloomPass.radius=Wt:dt==="bloomStrength"&&(s.composerController.bloomPass.strength=Wt),Reflect.set(st,dt,Wt))})}initBaseObjectUserData(s){const r={bloom:!1};s.objectType!=="BaseObject#Light"&&(prefabType.includes(s.objectType.split("#")[1])&&(r.prefab=s.prefab),s.object3d.userData=new Proxy(r,{set:(f,de,Xe)=>{if(de==="bloom")this.pencil.composerController.toggleBloomSelection(s,Xe);else if(de==="prefab"){const Je=this.pencil.getPlugin("draw");s.prefab=Xe,Xe?Je.prefabGroup.attach(s):Je.group.attach(s)}return Reflect.set(f,de,Xe)}}))}initPencilPlugin(){this.mList=new MaterialList,this.loader=new Jl(ci({prefix:this.options.assetsPrefix,simpleTexture4deleted:!0},this.tier0?{anisotropy:1}:{})),this.worker=new Cl({dbName:this.visName,cacheVersion:version}),this.delLoadArr&&(this.loader.delLoadArr=this.delLoadArr),this.loader.on("progress",(...s)=>{this.emit("loaderProgress",...s)})}addCSS3DRenderer(){this.pencil&&this.pencil.cssRendererController.addRenderer("css3d",{container:this.pencil.cssRendererController.container,zIndex:"auto"})}set verticalDragToForward(s){this.pencil.controls.verticalDragToForward=s}get verticalDragToForward(){var s;return(s=this.pencil)==null?void 0:s.controls.verticalDragToForward}initSettings(){const s={mouseLeft:this.leftTruck?Ts.TRUCK:Ts.ROTATE,mouseRight:this.leftTruck?Ts.ROTATE:Ts.TRUCK,mouseWheel:Ts.DOLLY};this.settings=new Proxy(zi(ci(ci({},this.initSettingsObj),s),{mouseNone:!1,viewportPadding:[0,0,0,0]}),{set:(r,f,de)=>{if(!(f in r)&&!(f.replace(/(:::.+)\..*$/,"$1")in r))return Reflect.set({},f,de);f==="mouseWheel"?typeof de=="boolean"&&(de=de?s.mouseWheel:Ts.NONE):f==="mouseLeft"?typeof de=="boolean"&&(de=de?s.mouseLeft:Ts.NONE):f==="mouseRight"&&typeof de=="boolean"&&(de=de?s.mouseRight:Ts.NONE);const Xe=f.includes(":::");return Reflect.set(r,Xe?f.replace(/(:::.+)\..*$/,"$1"):f,this.handleSetting(f,de))},get:(r,f)=>{const Xe=f.includes(":::")?f.replace(/(:::.+)\..*$/,"$1"):f,Je=Reflect.get(r,Xe);return Je instanceof Promise?Je.then(Ke=>(Reflect.set(r,Xe,Ke),Ke)):Je}})}handleSetting(s,r){return q0(this,null,function*(){const{pencil:f}=this;if(s==="mouseWheel"||s==="mouseLeft"||s==="mouseRight"){const de=s.replace("mouse","").toLowerCase();(r||this.playing)&&(f.controls.mouseButtons[de]=r)}else s==="mouseNone"?r?(this.mouseButtonsActiveStore={mouseLeft:f.controls.mouseButtons.left,mouseRight:f.controls.mouseButtons.right,mouseWheel:f.controls.mouseButtons.wheel},f.controls.mouseButtons.left=Ts.NONE,f.controls.mouseButtons.right=Ts.NONE,f.controls.mouseButtons.wheel=Ts.NONE):this.mouseButtonsActiveStore&&(f.controls.mouseButtons.left=this.mouseButtonsActiveStore.mouseLeft,f.controls.mouseButtons.right=this.mouseButtonsActiveStore.mouseRight,f.controls.mouseButtons.wheel=this.mouseButtonsActiveStore.mouseWheel):s==="viewportPadding"&&f.rendererController.setViewPadding(...r);return r})}show(){this.showState||this.options.disableInitShow||(this.showState="ing",this.playing?this.drawController.show():(this.drawController.showPrefab(),this.drawController.show()),this.pencil.start(),this.showState=!0,this.emit("show"))}hide(){this.showState&&(this.playing?this.drawController.hide():(this.drawController.hidePrefab(),this.drawController.hide()),this.showState=!1,this.emit("hide"))}addCSS2D(f){return q0(this,arguments,function*(s,r={}){typeof r=="string"&&(r={display:r}),r.display&&(s.style.display=r.display);let de=0;typeof r.onTop!="undefined"&&(de=r.onTop);const Xe=yield this.drawController.draw("Node",{onTop:de});return Xe.setChildren(s),Xe})}addCSS3D(f){return q0(this,arguments,function*(s,r={}){r.display&&(s.style.display=r.display);let de=0;typeof r.onTop!="undefined"&&(de=r.onTop);let Xe="3d";typeof r.type!="undefined"&&(Xe=r.type);const Je=yield this.drawController.draw("Node",{onTop:de,type:Xe});return Je.setChildren(s),Je})}lookAt(s,r,f,de,Xe,Je,Ke=!1,Qe=250){return q0(this,null,function*(){this.pencil.controls.smoothTime=Qe/1e3,yield this.pencil.controls.setLookAt(s,r,f,de,Xe,Je,Ke),this.pencil.controls.smoothTime=250/1e3})}truck(s,r,f=!1,de=250){return q0(this,null,function*(){this.pencil.controls.smoothTime=de/1e3,this.pencil.controls.restThreshold=0,yield this.pencil.controls.truck(s,r,f),this.pencil.controls.restThreshold=.0025,this.pencil.controls.smoothTime=250/1e3})}absoluteAngle(s,r){const f=Math.PI*2,de=s-r;return MathUtils.euclideanModulo(de+Math.PI,f)-Math.PI}lookAtTarget(s,r=!1,f=250){return q0(this,null,function*(){this.pencil.controls.smoothTime=f/1e3;const de=this.pencil.controls.azimuthAngle,Xe=this.pencil.controls.polarAngle,Je=this.pencil.controls.distance,Ke=this.pencil.cameraTarget.clone(),Qe=s.azimuthAngle||de,_e=s.polarAngle||Xe,$e=s.distance||Je,qe=s.target||Ke,st=de!==Qe||Xe!==_e,dt=Je!==$e,Wt=!qe.equals(Ke);yield Promise.all([Wt&&this.pencil.controls.moveTo(qe.x,qe.y,qe.z,r),dt&&this.pencil.controls.dollyTo($e,r),st&&this.pencil.controls.rotate(this.absoluteAngle(Qe,de),this.absoluteAngle(_e,Xe),r)].filter(Boolean)),this.pencil.controls.smoothTime=250/1e3})}resetCamera(s=!1,r=250){return q0(this,null,function*(){this.pencil.controls.smoothTime=r/1e3,yield this.pencil.controls.reset(s),this.pencil.controls.smoothTime=250/1e3})}unproject(s,r=0){const f=new Vector3,de=new Vector3,{left:Xe,top:Je,width:Ke,height:Qe}=this.container.getBoundingClientRect(),_e=(s.clientX-Xe)/Ke*2-1,$e=-((s.clientY-Je)/Qe)*2+1,qe=this.pencil.cameraPositon.clone();f.set(_e,$e,.5),f.unproject(this.pencil.camera),f.sub(qe).normalize();const st=(r-qe.z)/f.z;return de.copy(qe).add(f.multiplyScalar(st)),de}getRoomEnvMap(){if(this.roomEnvMap)return this.roomEnvMap;const s=new PMREMGenerator(this.pencil.renderer);s.compileEquirectangularShader();const r=new RoomEnvironment,f=s.fromScene(r,.04).texture;return this.pmremGenerator=s,this.re=r,this.roomEnvMap=f,f}handlePick(s,r,f){console.warn("handlePick is deprecated, use BaseObject.onPointerEvent"),this.drawController.handlePick(s,r,f)}getScreenPosition(s,r,f){const de=new Vector3(s,r,f);de.project(this.pencil.camera);const{width:Xe,height:Je}=this.pencil.getSize(),Ke=(de.x*.5+.5)*Xe,Qe=(de.y*-.5+.5)*Je;return{x:Ke,y:Qe}}dispose(){var s,r,f;super.dispose(),this.editor&&(this.editor.viewport.vis=void 0,this.editor.dispose()),(s=this.pencil)==null||s.dispose(),(r=this.pmremGenerator)==null||r.dispose(),(f=this.re)==null||f.dispose()}}F0(Base,"VisName","base");const type="FeatureCollection",features=[{type:"Feature",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-180,65.067236],[-179.3521,65.516748],[-179.683301,66.184131],[-178.526562,66.401562],[-178.939062,66.032764],[-178.4125,65.495557],[-176.093262,65.471045],[-175.395117,64.802393],[-173.729736,64.364502],[-173.32749,64.539551],[-173.275488,64.289648],[-172.903174,64.526074],[-172.401465,64.413916],[-173.085791,64.817334],[-172.213184,65.048145],[-172.783301,65.681055],[-171.105859,65.511035],[-171.421533,65.810352],[-170.666309,65.621533],[-169.777881,66.143115],[-170.604443,66.248926],[-171.795557,66.931738],[-173.00752,67.064893],[-172.520117,66.95249],[-173.258936,66.840088],[-173.679688,67.144775],[-174.550098,67.090625],[-173.773975,66.434668],[-174.065039,66.22959],[-174.084766,66.473096],[-174.394092,66.344238],[-174.924902,66.623145],[-175.345215,67.678076],[-178.373047,68.565674],[-178.055811,68.264893],[-179.798535,68.94043],[-180,68.738672],[-180,65.067236]]],[[[-179.999951,70.993018],[-177.523584,71.166895],[-178.876465,71.577051],[-179.999951,71.537744],[-179.999951,70.993018]]],[[[-178.194385,-14.255469],[-178.158594,-14.311914],[-178.04668,-14.318359],[-178.194385,-14.255469]]],[[[-178.168262,51.903027],[-177.879053,51.649707],[-177.644482,51.82627],[-178.168262,51.903027]]],[[[-177.670215,51.701074],[-177.148193,51.716748],[-177.110059,51.92876],[-177.670215,51.701074]]],[[[-176.961621,51.603662],[-176.452344,51.735693],[-176.593311,51.866699],[-176.961621,51.603662]]],[[[-176.847656,-43.823926],[-176.515527,-44.116602],[-176.516553,-43.784766],[-176.177637,-43.740332],[-176.847656,-43.823926]]],[[[-175.362354,-21.106836],[-175.156592,-21.263672],[-175.161914,-21.169336],[-175.362354,-21.106836]]],[[[-175.295557,52.022168],[-174.677393,52.03501],[-174.045605,52.367236],[-175.295557,52.022168]]],[[[-173.99248,52.12334],[-173.0229,52.07915],[-173.55332,52.136279],[-173.99248,52.12334]]],[[[-172.778516,-13.516797],[-172.224951,-13.804297],[-172.333496,-13.465234],[-172.778516,-13.516797]]],[[[-171.631836,63.351221],[-170.848389,63.444385],[-169.676367,62.956104],[-168.761328,63.21377],[-170.299365,63.680615],[-171.463037,63.640039],[-171.631836,63.351221]]],[[[-170.820508,-14.312109],[-170.72627,-14.351172],[-170.568115,-14.266797],[-170.820508,-14.312109]]],[[[-169.94834,-19.072852],[-169.803418,-19.083008],[-169.834033,-18.966016],[-169.94834,-19.072852]]],[[[-169.088916,52.832031],[-167.964355,53.345117],[-167.828076,53.507959],[-168.287695,53.500146],[-169.088916,52.832031]]],[[[-168.088379,65.657764],[-166.157031,65.28584],[-166.928418,65.15708],[-166.142773,64.582764],[-163.144336,64.423828],[-163.203906,64.652002],[-162.807031,64.374219],[-161.759375,64.81626],[-160.855908,64.755615],[-161.490723,64.433789],[-160.778564,63.818945],[-161.099707,63.55791],[-162.282812,63.529199],[-163.287842,63.046436],[-164.409033,63.215039],[-164.757861,62.496729],[-166.078809,61.803125],[-165.565869,61.102344],[-165.273633,61.274854],[-164.868994,61.111768],[-165.114844,60.932812],[-163.749023,60.969727],[-163.420947,60.757422],[-164.372363,60.591846],[-164.805176,60.892041],[-165.353809,60.541211],[-163.680371,59.801514],[-162.570752,59.989746],[-162.684961,60.268945],[-161.962012,60.695361],[-162.421338,60.283984],[-161.828711,59.588623],[-161.981055,59.146143],[-161.644385,59.109668],[-162.144922,58.644238],[-160.363135,59.051172],[-158.950684,58.404541],[-158.809473,58.973877],[-158.080518,58.977441],[-158.503174,58.850342],[-158.190918,58.614258],[-156.808887,59.134277],[-157.523633,58.421338],[-157.193701,58.194189],[-157.610889,58.05083],[-157.461914,57.506201],[-158.320947,57.2979],[-158.675146,56.794873],[-160.302051,56.314111],[-160.291699,55.805078],[-161.697314,55.907227],[-163.278809,55.121826],[-163.335303,54.83916],[-163.131104,54.916553],[-163.119629,55.064697],[-162.674365,54.996582],[-162.630371,55.24668],[-162.073975,55.139307],[-161.516943,55.618408],[-161.381934,55.371289],[-159.771387,55.841113],[-159.659668,55.625928],[-158.275635,56.19624],[-158.414404,56.43584],[-156.629004,57.009961],[-156.435889,57.359961],[-154.247021,58.159424],[-153.437598,58.754834],[-154.17832,59.155566],[-152.660107,59.997217],[-153.025,60.295654],[-152.540918,60.26543],[-151.593506,60.979639],[-149.433545,61.500781],[-150.053271,61.171094],[-149.075098,60.876416],[-150.44126,61.023584],[-151.356445,60.722949],[-151.853223,59.78208],[-151.046484,59.771826],[-151.884619,59.386328],[-151.738184,59.188525],[-150.934521,59.249121],[-149.713867,59.91958],[-149.598047,59.770459],[-149.395264,60.105762],[-148.430713,59.989111],[-147.964111,60.484863],[-148.640137,60.489453],[-148.256738,60.675293],[-148.556152,60.827002],[-147.751855,61.218945],[-147.891113,60.889893],[-146.284912,61.112646],[-146.570459,60.72915],[-145.674902,60.651123],[-145.898877,60.478174],[-145.248291,60.380127],[-144.691113,60.669092],[-144.901318,60.335156],[-144.147217,60.016406],[-141.40874,60.117676],[-141.408301,59.902783],[-140.419824,59.710742],[-139.431445,60.012256],[-138.988086,59.83501],[-139.286719,59.610938],[-139.512305,59.953564],[-139.773291,59.527295],[-136.607422,58.243994],[-136.061475,58.452734],[-136.989014,59.034473],[-136.22583,58.765479],[-136.150049,59.048096],[-135.897559,58.400195],[-135.090234,58.24585],[-135.363672,59.419434],[-134.776123,58.453857],[-134.208838,58.232959],[-133.876758,58.518164],[-134.031104,58.072168],[-133.194336,57.877686],[-133.535205,57.832959],[-133.117041,57.566211],[-133.64873,57.642285],[-133.465869,57.172168],[-131.551367,56.206787],[-132.15542,55.599561],[-131.032764,56.088086],[-130.748193,55.318018],[-131.047852,55.157666],[-130.575342,54.769678],[-130.214062,55.025879],[-130.025098,55.888232],[-130.048486,55.057275],[-129.795166,55.55957],[-129.560645,55.462549],[-130.430273,54.420996],[-129.626025,54.230273],[-130.335254,53.723926],[-129.563721,53.251465],[-128.959375,53.841455],[-128.532129,53.858105],[-128.675537,53.55459],[-127.927832,53.274707],[-128.905615,53.559326],[-128.85459,53.704541],[-129.171582,53.533594],[-128.365039,52.825781],[-128.053271,52.910693],[-128.271533,52.362988],[-127.940234,52.545166],[-128.357617,52.158887],[-128.102246,51.788428],[-127.791895,52.289355],[-126.951367,52.751025],[-127.193994,52.457666],[-126.713965,52.060693],[-127.437939,52.356152],[-127.795361,52.191016],[-127.850537,51.673193],[-127.668701,51.477588],[-127.338721,51.707373],[-126.691455,51.703418],[-127.419678,51.608057],[-127.708105,51.151172],[-127.057568,50.867529],[-126.517334,51.056836],[-126.514355,50.679395],[-125.904102,50.704932],[-126.447461,50.587744],[-126.094336,50.497607],[-125.058789,50.513867],[-124.859863,50.872412],[-125.056689,50.418652],[-124.782373,50.020117],[-124.141602,49.792676],[-123.880127,50.173633],[-123.874414,49.736816],[-123.582471,49.68125],[-124.028613,49.602881],[-123.530566,49.397314],[-123.1875,49.680322],[-123.276758,49.343945],[-122.879102,49.398926],[-123.196338,49.147705],[-122.78877,48.993018],[-122.241992,48.010742],[-122.353809,47.371582],[-122.701953,47.110889],[-123.027588,47.138916],[-122.577881,47.293164],[-122.532812,47.919727],[-123.139062,47.386084],[-122.656641,47.881152],[-122.778613,48.137598],[-124.709961,48.380371],[-124.139258,46.954688],[-123.842871,46.963184],[-124.112549,46.862695],[-124.072754,46.279443],[-123.220605,46.153613],[-123.989307,46.219385],[-124.14873,43.691748],[-124.539648,42.812891],[-124.071924,41.459521],[-124.324023,40.251953],[-122.998779,37.988623],[-122.521338,37.826416],[-122.393359,38.144824],[-121.525342,38.055908],[-122.314258,38.007324],[-122.070508,37.478271],[-122.445605,37.797998],[-122.499219,37.542627],[-121.807422,36.851221],[-121.877393,36.331055],[-120.659082,35.122412],[-120.644678,34.57998],[-118.506201,34.017383],[-118.410449,33.743945],[-117.467432,33.295508],[-117.128271,32.53335],[-115.673828,29.756396],[-114.048486,28.426172],[-114.265869,27.934473],[-114.069336,27.675684],[-114.300586,27.872998],[-114.993506,27.736035],[-113.598535,26.721289],[-113.155811,26.94624],[-113.020752,26.583252],[-112.377246,26.213916],[-112.069873,25.572852],[-112.072559,24.840039],[-110.362695,23.604932],[-110.00625,22.894043],[-109.495703,23.159814],[-109.42085,23.480127],[-110.262891,24.344531],[-110.367432,24.100488],[-110.659326,24.341455],[-111.569678,26.707617],[-111.795264,26.879688],[-111.699414,26.580957],[-111.862646,26.678516],[-112.734033,27.825977],[-112.87085,28.424219],[-114.550488,30.022266],[-114.933594,31.900732],[-113.046729,31.179248],[-113.057666,30.651025],[-112.161768,29.018896],[-111.121387,27.966992],[-110.529883,27.864209],[-110.377295,27.233301],[-109.27627,26.533887],[-109.116699,26.252734],[-109.425635,26.032568],[-109.384961,25.727148],[-108.886572,25.733447],[-109.028809,25.480469],[-108.051465,25.067041],[-108.280762,25.081543],[-107.951172,24.614893],[-107.511914,24.48916],[-107.764941,24.471924],[-105.791797,22.62749],[-105.649121,21.988086],[-105.208691,21.49082],[-105.51084,20.80874],[-105.260156,20.579053],[-105.669434,20.385596],[-104.938477,19.309375],[-103.912451,18.828467],[-103.441602,18.325391],[-101.918701,17.959766],[-100.847803,17.200488],[-97.754785,15.966846],[-96.213574,15.693066],[-94.799414,16.209668],[-95.02085,16.277637],[-94.858691,16.419727],[-94.587109,16.31582],[-94.661523,16.201904],[-94.00127,16.018945],[-94.37417,16.284766],[-93.166895,15.448047],[-92.235156,14.54541],[-91.377344,13.990186],[-90.095215,13.736523],[-88.512012,13.183936],[-88.685645,13.281494],[-87.930859,13.180664],[-87.814209,13.39917],[-87.489111,13.35293],[-87.337256,12.979248],[-87.667529,12.903564],[-85.744336,11.062109],[-85.908008,10.897559],[-85.667236,10.74502],[-85.849658,10.292041],[-85.681006,9.958594],[-85.114502,9.581787],[-84.886426,9.820947],[-85.263184,10.256641],[-85.025049,10.115723],[-84.581592,9.568359],[-83.637256,9.035352],[-83.604736,8.480322],[-83.291504,8.406006],[-83.469727,8.706836],[-83.285791,8.664355],[-82.879346,8.070654],[-82.781152,8.303516],[-82.235449,8.311035],[-81.727637,8.137549],[-81.268408,7.625488],[-81.063867,7.899756],[-80.845557,7.220068],[-80.438867,7.274951],[-80.01123,7.500049],[-80.458984,8.213867],[-79.50708,8.970068],[-79.086377,8.997168],[-78.409863,8.355322],[-78.099463,8.496973],[-77.760547,8.133252],[-78.141895,8.386084],[-78.421582,8.060986],[-77.901172,7.229346],[-77.368799,6.575586],[-77.469434,6.176758],[-77.249268,5.780176],[-77.534424,5.537109],[-77.286328,4.721729],[-77.520703,4.212793],[-77.076807,3.913281],[-77.813574,2.716357],[-78.591699,2.356641],[-78.576904,1.773779],[-79.025439,1.623682],[-78.859668,1.455371],[-78.899658,1.20625],[-80.088281,.784766],[-80.046143,.155371],[-80.482275,-.368262],[-80.282373,-.620508],[-80.902393,-1.078906],[-80.760596,-1.93457],[-80.932178,-2.269141],[-80.284717,-2.706738],[-80.006641,-2.353809],[-79.925586,-2.548535],[-79.842139,-2.067383],[-79.729883,-2.579102],[-79.96333,-3.157715],[-80.324658,-3.387891],[-81.283203,-4.322266],[-81.336621,-4.669531],[-80.881934,-5.635059],[-81.142041,-6.056738],[-79.994971,-6.768945],[-78.762256,-8.616992],[-77.633203,-11.287793],[-76.223633,-13.371191],[-76.289014,-14.133105],[-75.104248,-15.411914],[-72.467676,-16.708105],[-70.418262,-18.345605],[-70.080029,-21.356836],[-70.593359,-23.255469],[-70.392334,-23.565918],[-70.445361,-25.172656],[-70.925781,-27.588672],[-71.519238,-28.926465],[-71.315723,-29.649707],[-71.708936,-30.628027],[-71.452246,-32.65957],[-72.223779,-35.096191],[-73.215967,-37.166895],[-73.662402,-37.341016],[-73.226465,-39.224414],[-73.965869,-41.118262],[-73.624023,-41.773633],[-72.318262,-41.499023],[-72.824072,-41.908789],[-72.499414,-41.980859],[-72.412354,-42.388184],[-72.773242,-42.257715],[-72.758008,-43.039453],[-73.224463,-43.897949],[-73.265088,-44.168652],[-72.663867,-44.436426],[-72.680078,-44.593945],[-73.444971,-45.238184],[-72.933838,-45.452344],[-73.730762,-45.47998],[-73.591846,-45.899121],[-73.845361,-46.566016],[-73.735254,-45.811719],[-73.967578,-46.154102],[-74.392969,-46.217383],[-74.019922,-46.055859],[-73.957178,-45.404395],[-74.157861,-45.767188],[-75.066699,-45.874902],[-74.924463,-46.159668],[-75.706396,-46.705273],[-75.430371,-46.93457],[-75.540332,-46.69873],[-74.98418,-46.512109],[-75.005957,-46.741113],[-74.313574,-46.788184],[-74.158398,-47.18252],[-74.482666,-47.430469],[-74.134082,-47.59082],[-74.654932,-47.702246],[-74.227051,-47.968945],[-73.715869,-47.655469],[-73.391064,-48.145898],[-74.584668,-47.999023],[-74.474414,-48.463965],[-74.009082,-48.475],[-74.341016,-48.595703],[-74.366553,-49.400488],[-73.934961,-49.020898],[-73.836377,-49.609375],[-74.29082,-49.604102],[-73.958594,-49.994727],[-74.62959,-50.194043],[-73.950342,-50.510547],[-74.185596,-50.485352],[-73.978027,-50.827051],[-73.654443,-50.492676],[-73.806543,-50.938379],[-74.139404,-50.817773],[-74.365576,-50.487891],[-74.644482,-50.360938],[-74.685742,-50.662012],[-75.094678,-50.68125],[-74.814746,-51.062891],[-73.939502,-51.266309],[-74.19668,-51.680566],[-73.518164,-52.041016],[-72.600049,-51.799121],[-73.16875,-51.453906],[-72.76123,-51.573242],[-72.489648,-51.763672],[-72.52334,-52.255469],[-72.677051,-52.384668],[-72.79502,-51.949512],[-73.834473,-52.233984],[-74.264941,-52.104883],[-74.014453,-52.639355],[-73.123926,-52.487988],[-73.645215,-52.837012],[-73.122461,-53.073926],[-72.712109,-52.535547],[-71.511279,-52.605371],[-72.727686,-52.762305],[-73.052734,-53.243457],[-72.548926,-53.460742],[-72.278027,-53.132324],[-71.227148,-52.810645],[-71.791455,-53.48457],[-71.941699,-53.234082],[-72.412891,-53.350195],[-71.297754,-53.883398],[-70.795117,-52.76875],[-69.241016,-52.205469],[-68.443359,-52.356641],[-68.965332,-51.677148],[-69.46543,-51.584473],[-69.035303,-51.488965],[-69.358594,-51.028125],[-69.044775,-50.499121],[-68.421875,-50.15791],[-68.97959,-50.003027],[-68.667578,-49.752539],[-68.257227,-50.10459],[-67.825977,-49.919629],[-67.466309,-48.951758],[-65.810059,-47.941113],[-66.225244,-47.826758],[-65.738086,-47.344922],[-65.998535,-47.09375],[-66.776855,-47.005859],[-67.599561,-46.052539],[-66.941406,-45.257324],[-65.63877,-45.007812],[-65.252344,-43.571875],[-64.319141,-42.968945],[-64.970703,-42.666309],[-64.487842,-42.513477],[-64.034766,-42.88125],[-63.617334,-42.695801],[-63.795557,-42.113867],[-64.42041,-42.433789],[-64.986377,-42.102051],[-65.133398,-40.880664],[-64.869482,-40.73584],[-63.621777,-41.159766],[-62.39502,-40.89082],[-62.053662,-39.373828],[-62.334766,-38.800098],[-61.602539,-38.998828],[-59.82832,-38.838184],[-57.546973,-38.085645],[-56.672021,-36.85127],[-56.698096,-36.426465],[-57.335449,-36.026758],[-57.303662,-35.188477],[-58.28335,-34.683496],[-58.525488,-34.296191],[-58.39248,-34.192969],[-58.547217,-33.663477],[-58.424463,-33.111523],[-58.170996,-32.959277],[-58.201172,-32.47168],[-58.092676,-32.967383],[-58.363525,-33.182324],[-58.438135,-33.719141],[-57.829102,-34.477344],[-57.170703,-34.452344],[-56.249951,-34.90127],[-54.902295,-34.932813],[-53.785303,-34.380371],[-53.370605,-33.742188],[-52.652246,-33.137793],[-51.972461,-31.383789],[-51.283057,-30.751562],[-51.298047,-30.034863],[-51.024951,-30.368652],[-50.563525,-30.253613],[-50.581934,-30.438867],[-51.272168,-31.476953],[-52.063232,-31.830371],[-52.039209,-32.114844],[-50.921387,-31.258398],[-49.745996,-29.363184],[-48.799658,-28.575293],[-48.55415,-27.195996],[-48.748291,-26.268652],[-48.401172,-25.597363],[-48.731738,-25.36875],[-48.202734,-25.416504],[-46.867285,-24.236328],[-45.97207,-23.795508],[-45.464307,-23.802539],[-44.569678,-23.274023],[-44.637256,-23.055469],[-43.22417,-22.991211],[-43.154297,-22.725195],[-42.958301,-22.96709],[-42.042383,-22.94707],[-41.705518,-22.309668],[-41.000293,-21.999023],[-40.954541,-21.237891],[-39.783301,-19.571777],[-39.650781,-18.252344],[-39.154004,-17.703906],[-38.880615,-15.864258],[-39.089355,-13.588184],[-38.851758,-12.790137],[-38.690967,-12.623926],[-38.498926,-12.956641],[-38.239746,-12.844238],[-37.359229,-11.252539],[-37.356006,-11.403906],[-35.340869,-9.230664],[-34.834668,-7.971484],[-34.805469,-7.288379],[-35.481689,-5.166016],[-37.174658,-4.912402],[-38.475781,-3.71748],[-39.964697,-2.861523],[-41.479932,-2.916504],[-43.380078,-2.376074],[-44.192676,-2.80957],[-44.228613,-2.471289],[-44.723047,-3.204785],[-44.381836,-2.365527],[-44.435449,-2.168066],[-44.756348,-2.265527],[-44.537793,-2.052734],[-44.65127,-1.745801],[-45.076367,-1.466406],[-45.32915,-1.717285],[-45.458594,-1.35625],[-47.398096,-.62666],[-48.115088,-.7375],[-48.449805,-1.145508],[-48.349805,-1.482129],[-48.71001,-1.487695],[-49.211035,-1.916504],[-49.636523,-2.656934],[-49.313672,-1.731738],[-50.403223,-2.015527],[-50.690039,-1.761719],[-50.894922,-.937598],[-51.947559,-1.586719],[-52.66416,-1.551758],[-51.980811,-1.367969],[-51.28291,-.085205],[-49.898877,1.162988],[-49.957129,1.659863],[-50.714404,2.134033],[-51.219922,4.093604],[-51.54707,4.310889],[-51.652539,4.061279],[-51.827539,4.635693],[-52.00293,4.352295],[-52.058105,4.717383],[-52.899316,5.425049],[-53.847168,5.782227],[-54.155957,5.358984],[-54.054199,5.80791],[-54.833691,5.98833],[-55.828174,5.96167],[-55.897607,5.699316],[-56.969824,5.992871],[-57.194775,5.548438],[-57.227539,6.178418],[-57.982568,6.785889],[-58.41499,6.851172],[-58.672949,6.390771],[-58.511084,7.398047],[-60.017529,8.549316],[-61.304004,8.4104],[-61.618701,8.597461],[-61.247266,8.600342],[-60.79248,9.360742],[-61.588867,9.894531],[-61.735938,9.631201],[-62.0771,9.975049],[-62.32041,9.783057],[-62.550342,10.200439],[-62.740576,10.056152],[-62.913574,10.531494],[-61.879492,10.741016],[-64.298193,10.635156],[-63.731885,10.503418],[-65.129102,10.070068],[-65.851758,10.257764],[-66.247217,10.632227],[-68.139941,10.492725],[-68.398633,11.160986],[-68.827979,11.431738],[-69.631592,11.479932],[-70.003955,12.177881],[-70.286523,11.886035],[-69.804785,11.474219],[-71.469531,10.96416],[-71.494238,10.533203],[-71.052686,9.705811],[-71.241406,9.160449],[-71.619531,9.047949],[-72.112842,9.815576],[-71.594336,10.657373],[-71.956934,11.569922],[-71.319727,11.861914],[-71.137305,12.046338],[-71.262109,12.335303],[-71.714551,12.419971],[-73.313379,11.295752],[-74.14292,11.32085],[-74.400879,10.765234],[-74.330225,10.99668],[-74.84458,11.109717],[-75.70835,10.143408],[-75.538574,10.205176],[-75.639355,9.450439],[-76.920459,8.57373],[-76.786572,7.931592],[-77.374219,8.658301],[-78.082764,9.236279],[-79.577295,9.597852],[-81.354785,8.780566],[-81.894482,9.14043],[-81.780225,8.957227],[-82.244189,9.031494],[-82.563574,9.57666],[-83.641992,10.917236],[-83.867871,11.300049],[-83.651758,11.642041],[-83.754248,12.501953],[-83.593359,12.713086],[-83.510938,12.411816],[-83.567334,13.320312],[-83.187744,14.340088],[-83.413721,14.825342],[-83.15752,14.993066],[-84.095068,15.400928],[-83.765283,15.405469],[-84.261426,15.822607],[-84.97373,15.989893],[-88.22832,15.729004],[-88.894043,15.890625],[-88.313428,16.632764],[-88.085254,18.226123],[-88.295654,18.472412],[-88.031738,18.838916],[-87.881982,18.273877],[-87.761816,18.446143],[-87.424756,19.58335],[-87.687695,19.637109],[-86.771777,21.150537],[-87.034766,21.592236],[-88.466699,21.569385],[-90.353125,21.009424],[-90.739258,19.352246],[-91.43667,18.889795],[-91.275244,18.624463],[-91.533984,18.456543],[-92.441016,18.675293],[-94.459766,18.16665],[-95.181836,18.700732],[-95.920361,18.81958],[-97.186328,20.717041],[-97.753809,22.02666],[-97.40918,21.272559],[-97.314502,21.564209],[-97.84248,22.510303],[-97.667676,24.38999],[-97.14624,25.961475],[-97.485107,27.237402],[-97.768457,27.45752],[-97.439111,27.328271],[-97.156494,28.144336],[-96.421094,28.457324],[-96.640039,28.708789],[-96.011035,28.631934],[-96.234521,28.488965],[-95.273486,28.963867],[-94.888281,29.370557],[-95.022852,29.702344],[-94.52627,29.547949],[-94.759619,29.384277],[-93.890479,29.689355],[-93.841455,29.979736],[-93.826465,29.725146],[-92.26084,29.556836],[-91.893164,29.836035],[-91.248828,29.564209],[-91.290137,29.288965],[-90.751025,29.130859],[-90.379199,29.295117],[-90.212793,29.104932],[-90.159082,29.537158],[-89.376123,28.981348],[-89.015723,29.202881],[-89.720898,29.619287],[-89.354443,29.820215],[-89.400732,30.046045],[-90.175342,30.029102],[-90.331982,30.277588],[-88.135449,30.366602],[-88.011328,30.694189],[-87.790283,30.291797],[-88.005957,30.230908],[-87.281055,30.339258],[-86.997559,30.570312],[-87.201172,30.339258],[-86.257373,30.493018],[-86.454443,30.399121],[-85.603516,30.286768],[-85.318945,29.680225],[-84.309668,30.064746],[-83.694385,29.925977],[-82.651465,28.8875],[-82.843506,27.845996],[-82.405762,27.862891],[-82.7146,27.499609],[-82.441357,27.059668],[-82.242871,26.848877],[-82.013281,26.961572],[-81.715479,25.983154],[-80.94043,25.264209],[-81.110498,25.138037],[-80.484668,25.229834],[-80.126367,25.833496],[-80.050049,26.807715],[-80.838184,28.757666],[-80.456885,27.900684],[-80.524121,28.486084],[-81.249512,29.793799],[-81.516211,30.801807],[-81.380957,31.353271],[-80.694238,32.215723],[-80.802539,32.448047],[-80.579346,32.287305],[-80.63418,32.511719],[-79.940723,32.667139],[-78.841455,33.724072],[-78.01333,33.911816],[-77.953271,34.168994],[-77.927832,33.939746],[-77.412256,34.730811],[-76.439795,34.84292],[-76.974951,35.025195],[-77.070264,35.154639],[-76.77915,34.990332],[-76.512939,35.27041],[-77.03999,35.527393],[-76.173828,35.35415],[-75.758838,35.843262],[-76.083594,35.690527],[-76.069775,35.970312],[-76.726221,35.957617],[-76.733643,36.22915],[-76.559375,36.015332],[-76.147852,36.279297],[-75.820068,36.112842],[-75.946484,36.659082],[-75.53418,35.819092],[-75.999414,36.912646],[-76.487842,36.897021],[-77.250879,37.329199],[-76.283301,37.052686],[-76.757715,37.50542],[-76.453906,37.273535],[-76.305566,37.571484],[-76.549463,37.669141],[-77.111084,38.165674],[-76.49248,37.682227],[-76.344141,37.675684],[-76.264258,37.893555],[-77.273242,38.351758],[-77.2604,38.6],[-77.030371,38.889258],[-77.23252,38.407715],[-76.341162,38.087012],[-76.668555,38.5375],[-76.394092,38.368994],[-76.57041,39.269336],[-75.958936,39.585059],[-76.341162,38.709668],[-76.016943,38.625098],[-76.264648,38.436426],[-75.858691,38.362061],[-75.659277,37.953955],[-75.934375,37.151904],[-75.03877,38.426367],[-75.187109,38.591113],[-75.088672,38.777539],[-75.392188,39.092773],[-75.587598,39.640771],[-75.07417,39.983496],[-75.524219,39.490186],[-74.897021,39.145459],[-74.954297,38.949951],[-74.794482,39.001904],[-74.0646,39.993115],[-74.079932,39.788135],[-73.972266,40.400342],[-74.264209,40.528613],[-73.969922,41.249707],[-73.987109,40.751367],[-72.924707,41.285156],[-71.522852,41.378955],[-71.390137,41.795312],[-71.168555,41.489404],[-69.948633,41.677148],[-69.977881,41.961279],[-70.108936,42.07832],[-70.001416,41.826172],[-70.42666,41.757275],[-71.046191,42.331104],[-70.612939,42.623242],[-70.733105,43.07002],[-70.178809,43.766357],[-69.226074,43.986475],[-68.762695,44.570752],[-68.53252,44.258643],[-68.450586,44.507617],[-68.056641,44.384326],[-67.19126,44.675586],[-67.124854,45.169434],[-66.439844,45.095898],[-66.026562,45.417578],[-65.884473,45.2229],[-64.778516,45.638428],[-64.632715,45.946631],[-64.314648,45.835693],[-64.873145,45.35459],[-63.368018,45.364795],[-64.135498,45.023047],[-64.448145,45.337451],[-66.090625,44.504932],[-65.868018,44.568799],[-66.125732,43.813818],[-65.481689,43.518066],[-64.286084,44.550342],[-63.609766,44.47998],[-63.604004,44.683203],[-61.031543,45.291748],[-61.955518,45.868164],[-62.750098,45.648242],[-64.541504,46.240332],[-64.831396,47.060791],[-65.318896,47.101221],[-64.703223,47.724854],[-65.607227,47.67002],[-66.704395,48.022461],[-65.926709,48.188867],[-65.259424,48.02124],[-64.348828,48.423193],[-64.513721,48.841113],[-64.216211,48.873633],[-64.836328,49.191748],[-66.178174,49.213135],[-68.238184,48.626416],[-70.519482,47.03252],[-71.261182,46.75625],[-72.109277,46.551221],[-73.15957,46.010059],[-73.558105,45.425098],[-74.708887,45.003857],[-73.973828,45.345117],[-74.315088,45.531055],[-73.476611,45.738232],[-72.981006,46.209717],[-71.87959,46.686816],[-71.267773,46.795947],[-70.705859,47.139795],[-69.994434,47.739893],[-69.865527,48.172266],[-71.018262,48.455615],[-69.673877,48.19917],[-68.281934,49.197168],[-67.372021,49.348438],[-66.495508,50.211865],[-62.71543,50.30166],[-61.724854,50.104053],[-59.886328,50.316406],[-58.510352,51.295068],[-56.975977,51.457666],[-55.695215,52.137793],[-56.011719,52.394482],[-55.746484,52.474561],[-56.324902,52.544531],[-55.802832,52.643164],[-55.797949,53.211963],[-56.46499,53.765039],[-57.331738,53.469092],[-57.416064,54.162744],[-58.19209,54.228174],[-57.935986,54.091162],[-60.329492,53.266113],[-60.100293,53.486963],[-60.39541,53.65332],[-58.633203,54.049561],[-57.404492,54.590869],[-57.962451,54.875732],[-58.780176,54.838379],[-59.25957,55.199951],[-59.837793,54.813965],[-59.437891,55.175928],[-59.758789,55.30957],[-60.617139,55.060205],[-60.341016,55.784668],[-61.449512,55.995703],[-61.364697,56.216016],[-61.713086,56.230957],[-61.425293,56.360645],[-62.497266,56.801709],[-61.371631,56.680811],[-61.33374,57.010596],[-62.495557,57.489209],[-61.967969,57.611914],[-61.958643,57.911768],[-62.48623,58.154053],[-63.261523,58.014697],[-62.593848,58.474023],[-63.537061,58.329932],[-62.873877,58.672461],[-63.248437,59.068311],[-63.971143,59.053809],[-63.415137,59.194385],[-63.945459,59.380176],[-64.283496,60.064062],[-64.768457,60.012109],[-64.499414,60.268262],[-64.817334,60.331055],[-65.028174,59.770703],[-65.433398,59.776514],[-65.038232,59.387891],[-65.475098,59.470312],[-65.383545,59.060205],[-66.043066,58.820654],[-66.002393,58.431201],[-66.362402,58.791162],[-67.678271,57.991113],[-68.021045,58.485303],[-68.413574,58.051758],[-69.04082,57.90249],[-68.356543,58.163232],[-68.381152,58.743506],[-68.698193,58.904541],[-70.154346,58.760596],[-69.531641,58.869238],[-69.344043,59.303076],[-69.681885,59.341748],[-69.733936,59.918018],[-70.654834,60.026221],[-69.67373,60.075879],[-69.50332,61.04043],[-69.992432,60.856494],[-71.422705,61.158936],[-71.638281,61.617188],[-72.215869,61.587256],[-72.686963,62.124561],[-73.705078,62.473145],[-74.632568,62.115674],[-77.372412,62.57251],[-78.133398,62.282275],[-77.514355,61.556299],[-78.181348,60.819141],[-77.589551,60.808594],[-77.349072,59.578955],[-77.726172,59.675879],[-78.515088,58.682373],[-76.809814,57.657959],[-76.604053,56.199561],[-77.775293,55.29126],[-79.712354,54.671826],[-78.996045,54.00249],[-78.448096,52.261377],[-78.981641,51.774561],[-78.903174,51.200293],[-79.338672,51.628174],[-79.737451,51.186279],[-79.3479,50.762646],[-80.103564,51.282861],[-80.851221,51.125],[-80.443311,51.388574],[-80.588037,51.667236],[-81.827881,52.224219],[-81.599414,52.432617],[-82.291553,53.030713],[-82.393262,55.067822],[-83.910596,55.314648],[-85.365283,55.079297],[-85.559326,55.540186],[-87.482422,56.021289],[-88.948486,56.851318],[-90.897461,57.256934],[-92.798145,56.921973],[-92.432812,57.320312],[-93.17876,58.725635],[-94.123193,58.736719],[-94.332227,58.297363],[-94.287061,58.716016],[-94.957324,59.068848],[-94.761719,60.498242],[-93.312012,61.767285],[-93.581787,61.942041],[-92.905518,62.215137],[-93.205371,62.364941],[-92.527979,62.168408],[-92.551416,62.546729],[-91.93584,62.592383],[-92.361279,62.819385],[-90.698584,63.063867],[-90.970068,63.442773],[-91.841846,63.697559],[-92.465088,63.555078],[-92.156885,63.691699],[-93.559814,63.865283],[-93.696338,64.147168],[-90.811914,63.580908],[-90.154736,63.689648],[-90.04165,64.140869],[-89.131543,63.968506],[-88.105615,64.183301],[-87.027539,65.198096],[-88.974023,65.348291],[-89.924072,65.780273],[-91.427246,65.9479],[-89.749414,65.936035],[-87.452881,65.338965],[-85.95874,66.119043],[-86.708154,66.523047],[-85.603857,66.568262],[-83.869043,66.213574],[-84.223047,66.682471],[-85.113721,66.906934],[-84.538477,66.972803],[-83.406445,66.37124],[-81.467578,67.069873],[-81.294336,67.497412],[-82.552686,68.446484],[-81.281543,68.657227],[-81.95791,68.883643],[-81.377832,69.185645],[-82.227539,69.248877],[-82.618359,69.691064],[-85.507373,69.845264],[-84.867578,68.77334],[-85.643164,68.699707],[-86.560791,67.482129],[-87.359375,67.177246],[-88.313818,67.950342],[-88.346973,68.288281],[-87.813574,68.345703],[-88.223535,68.915039],[-89.279541,69.255469],[-90.204785,68.257471],[-91.237207,69.285547],[-90.415576,69.456982],[-92.887793,69.668213],[-91.976709,70.038672],[-92.320508,70.235352],[-91.564062,70.178271],[-94.734863,71.982959],[-95.872314,71.573145],[-95.564258,71.336768],[-96.446582,71.239893],[-95.878613,70.548975],[-96.551367,70.210303],[-95.964941,69.802783],[-93.532275,69.480908],[-94.600439,68.803223],[-93.852441,69.000342],[-93.448926,68.618896],[-95.460693,68.021387],[-95.25874,67.262549],[-95.399658,66.949463],[-96.036865,66.9375],[-95.787549,66.616797],[-96.422559,67.051758],[-95.418896,67.013232],[-96.369141,67.509766],[-95.970312,68.249121],[-96.72207,68.03877],[-96.430664,68.310596],[-97.410352,68.496533],[-98.650488,68.363525],[-98.192529,67.922998],[-97.206543,67.855078],[-97.454932,67.616992],[-98.631543,68.072559],[-98.412109,67.807178],[-98.920459,67.725781],[-102.320361,67.735645],[-103.474121,68.115039],[-104.486816,68.063184],[-106.164453,68.919873],[-108.313477,68.610791],[-108.718115,68.297461],[-107.73418,68.17373],[-105.750195,68.592285],[-107.958398,67.818604],[-107.259473,66.398535],[-108.496045,67.092285],[-107.988721,67.256396],[-110.073926,67.99292],[-112.503027,67.681934],[-115.133203,67.819189],[-115.127051,68.132031],[-113.964404,68.399072],[-115.442285,68.940918],[-117.226953,68.913428],[-122.070068,69.816162],[-123.025781,69.81001],[-123.528418,69.389355],[-124.338086,69.364844],[-124.555029,70.151221],[-125.524951,69.351563],[-127.991016,70.573828],[-127.683789,70.260352],[-128.853027,69.751025],[-128.898926,69.966162],[-130.117627,69.720068],[-130.970654,69.209082],[-131.063428,69.450684],[-131.788379,69.431982],[-133.196826,68.739844],[-132.81748,69.205762],[-129.648291,69.997754],[-129.675635,70.192969],[-134.174316,69.252832],[-134.408936,69.681787],[-135.691455,69.311182],[-135.939014,68.97417],[-135.258838,68.684326],[-141.002148,69.650781],[-143.218311,70.11626],[-145.197363,70.008691],[-149.269434,70.500781],[-151.944678,70.4521],[-152.491211,70.880957],[-154.195215,70.801123],[-155.166846,71.099219],[-155.973535,70.841992],[-155.579443,71.121094],[-156.470215,71.407666],[-157.909375,70.860107],[-159.680908,70.786768],[-159.865674,70.278857],[-160.117139,70.591211],[-162.073877,70.161963],[-161.880957,70.331738],[-163.86792,69.03667],[-166.209082,68.885352],[-166.786279,68.359619],[-164.125195,67.606738],[-163.531836,67.102588],[-161.719922,67.020557],[-161.856689,66.700342],[-160.360889,66.6125],[-160.231689,66.420264],[-161.591016,66.459521],[-162.361621,66.947314],[-161.916895,66.411816],[-161.034277,66.188818],[-163.695361,66.083838],[-163.638232,66.574658],[-164.460498,66.588428],[-168.088379,65.657764]]],[[[-167.780859,53.300244],[-166.354541,53.673535],[-166.230859,53.932617],[-166.615332,53.900928],[-167.038086,53.942188],[-166.808984,53.646143],[-167.780859,53.300244]]],[[[-167.436426,60.206641],[-166.14873,59.764111],[-165.591797,59.913135],[-166.135449,60.383545],[-167.436426,60.206641]]],[[[-164.823438,54.419092],[-163.083252,54.668994],[-163.378955,54.815527],[-163.476025,54.980713],[-164.478613,54.906836],[-164.823438,54.419092]]],[[[-160.795068,55.145215],[-160.487549,55.184863],[-160.684912,55.314795],[-160.795068,55.145215]]],[[[-159.832031,-21.200488],[-159.740527,-21.249219],[-159.768359,-21.188477],[-159.832031,-21.200488]]],[[[-159.78916,22.041797],[-159.372754,21.932373],[-159.352051,22.21958],[-159.78916,22.041797]]],[[[-158.273145,21.585254],[-158.110352,21.318604],[-157.6354,21.307617],[-157.799365,21.456641],[-157.9625,21.701367],[-158.273145,21.585254]]],[[[-157.578955,1.902051],[-157.175781,1.739844],[-157.342139,1.855566],[-157.578955,1.902051]]],[[[-156.697754,20.949072],[-156.408789,20.605176],[-155.989844,20.757129],[-156.486816,20.932568],[-156.697754,20.949072]]],[[[-156.048682,19.749951],[-155.881299,19.070508],[-155.581348,19.012012],[-154.804199,19.524463],[-155.831641,20.27583],[-156.048682,19.749951]]],[[[-154.673193,57.446094],[-154.338965,56.920898],[-154.24375,57.143018],[-153.793213,56.989502],[-154.027344,56.777979],[-152.679053,57.345117],[-152.940771,57.498096],[-152.216211,57.577002],[-152.898047,57.823926],[-153.841553,57.862842],[-153.687695,57.305127],[-154.116162,57.651221],[-154.673193,57.446094]]],[[[-153.381348,58.087207],[-152.068896,58.17793],[-152.416943,58.360205],[-152.841113,58.416406],[-153.381348,58.087207]]],[[[-149.63501,-17.564258],[-149.181787,-17.862305],[-149.321533,-17.690039],[-149.63501,-17.564258]]],[[[-139.134082,-9.829492],[-138.827344,-9.741602],[-139.024316,-9.695215],[-139.134082,-9.829492]]],[[[-136.568604,57.972168],[-135.910791,57.446582],[-135.564209,57.666406],[-134.931494,57.481152],[-135.338477,57.768652],[-134.954688,58.015332],[-135.613232,57.991846],[-135.730371,58.244238],[-136.568604,57.972168]]],[[[-135.812305,57.009521],[-135.454932,57.249414],[-134.681885,56.216162],[-134.969775,57.351416],[-135.448682,57.534375],[-135.812305,57.009521]]],[[[-134.923486,58.354639],[-134.516016,57.042578],[-133.911133,57.352539],[-134.292334,58.044727],[-133.822754,57.628662],[-134.240088,58.143994],[-134.680273,58.16167],[-134.923486,58.354639]]],[[[-134.373682,56.838672],[-134.1896,56.076953],[-133.738379,56.650439],[-133.9896,56.844971],[-134.373682,56.838672]]],[[[-133.979443,57.00957],[-133.48418,56.451758],[-133.158154,56.495166],[-133.328955,56.830078],[-132.95918,56.677051],[-133.366211,57.003516],[-133.979443,57.00957]]],[[[-133.742529,55.964844],[-133.241504,55.920801],[-133.680176,55.785156],[-133.033398,55.589697],[-133.118555,55.327637],[-132.064746,54.713135],[-131.976416,55.208594],[-132.631299,55.473193],[-132.172705,55.480615],[-133.566113,56.339209],[-133.742529,55.964844]]],[[[-133.737109,55.496924],[-133.650195,55.269287],[-133.305078,55.54375],[-133.737109,55.496924]]],[[[-133.429053,55.303809],[-132.705811,54.68418],[-132.862256,54.894434],[-133.429053,55.303809]]],[[[-133.079492,53.837012],[-132.347266,53.189209],[-131.957422,53.308691],[-131.667627,54.141357],[-132.534668,53.651709],[-132.166113,53.955225],[-132.655518,54.12749],[-133.048389,54.158936],[-133.079492,53.837012]]],[[[-132.659912,56.078174],[-132.287305,55.929395],[-132.112354,56.109375],[-132.379834,56.498779],[-132.659912,56.078174]]],[[[-132.546777,53.1375],[-131.221533,52.153613],[-131.455225,52.701709],[-131.971777,52.879834],[-131.634668,52.922168],[-131.753711,53.195557],[-132.546777,53.1375]]],[[[-131.7625,55.16582],[-131.447559,55.408789],[-131.187891,55.206299],[-130.97915,55.48916],[-131.269238,55.955371],[-131.7625,55.16582]]],[[[-131.56543,55.264111],[-131.329541,54.887744],[-131.339746,55.079834],[-131.56543,55.264111]]],[[[-130.703174,53.892236],[-130.236279,53.958545],[-130.447998,54.089014],[-130.703174,53.892236]]],[[[-129.175928,52.964941],[-128.746338,52.763379],[-128.678955,52.289648],[-128.552441,52.939746],[-129.033252,53.279932],[-129.175928,52.964941]]],[[[-128.346045,50.744238],[-128.05835,50.498486],[-127.465918,50.583105],[-127.486523,50.404639],[-127.905859,50.445215],[-127.863916,50.127734],[-127.249805,50.137988],[-127.114307,49.879736],[-126.134082,49.672314],[-126.519141,49.396777],[-125.9354,49.401465],[-125.489453,48.933789],[-124.812646,49.212646],[-125.120703,48.760791],[-123.310645,48.411035],[-125.48208,50.316797],[-127.197314,50.640381],[-127.918066,50.860547],[-128.346045,50.744238]]],[[[-128.342188,-24.370703],[-128.290088,-24.397363],[-128.330127,-24.323242],[-128.342188,-24.370703]]],[[[-125.845312,71.978662],[-124.007764,71.677441],[-123.095654,71.093799],[-120.619336,71.505762],[-120.179883,72.212646],[-115.446875,73.438867],[-117.514844,74.231738],[-119.736328,74.112646],[-121.50415,74.545117],[-124.69624,74.348193],[-123.797266,73.768164],[-125.845312,71.978662]]],[[[-122.533057,75.950928],[-120.848389,76.182666],[-119.912891,75.858838],[-117.880811,76.805078],[-117.233594,76.281543],[-115.55127,77.363281],[-116.511328,77.547607],[-116.843555,77.339551],[-119.090186,77.305078],[-122.519385,76.353174],[-122.533057,75.950928]]],[[[-119.39458,75.617334],[-118.328125,75.579688],[-117.633691,76.115088],[-119.39458,75.617334]]],[[[-118.987695,71.764258],[-117.742334,71.659326],[-117.935645,71.39209],[-115.303418,71.493701],[-118.269092,71.034717],[-117.587061,70.629541],[-113.757275,70.690723],[-111.632568,70.308838],[-117.19541,70.054053],[-116.513477,69.424609],[-113.694141,69.19502],[-113.127734,68.494141],[-109.472119,68.676709],[-107.439893,69.002148],[-106.659082,69.4396],[-104.571436,68.872119],[-101.857129,69.023975],[-102.045947,69.464844],[-103.120215,69.20459],[-103.464893,69.644482],[-102.621094,69.551514],[-102.182129,69.845947],[-100.982373,69.679883],[-101.042676,70.110791],[-103.58457,70.630859],[-104.514795,71.064258],[-105.415137,72.78833],[-106.482129,73.196191],[-108.029053,73.34873],[-108.237402,73.149902],[-107.306006,71.894678],[-107.812842,71.626172],[-110.008447,72.983643],[-110.66084,73.008203],[-110.205127,72.661279],[-111.675098,72.300146],[-111.269727,72.713721],[-112.753613,72.986035],[-114.521533,72.59292],[-114.051709,73.070996],[-114.638232,73.372656],[-118.133105,72.632812],[-118.987695,71.764258]]],[[[-117.565234,75.23335],[-115.728857,74.968115],[-114.451758,75.087891],[-114.016504,75.434277],[-113.711768,75.068604],[-111.093457,75.256299],[-114.312695,74.715088],[-112.519336,74.416846],[-108.831299,75.064893],[-107.153418,74.927148],[-106.092627,75.089453],[-105.632666,75.945361],[-106.677002,76.02373],[-106.913525,75.679639],[-108.292383,76.057129],[-109.098242,76.811865],[-110.314453,76.369385],[-108.947168,75.541797],[-111.052686,75.548535],[-112.697607,76.201709],[-114.998486,76.497461],[-115.822168,76.27002],[-114.778613,76.172607],[-116.209863,76.194434],[-116.664551,75.957568],[-114.991504,75.896338],[-117.163623,75.644873],[-115.141846,75.678516],[-117.565234,75.23335]]],[[[-115.35293,28.103955],[-115.170605,28.069385],[-115.233545,28.368359],[-115.35293,28.103955]]],[[[-114.98042,77.91543],[-113.832471,77.754639],[-114.330371,78.077539],[-114.98042,77.91543]]],[[[-113.223047,78.2979],[-109.484473,78.316406],[-109.815967,78.650391],[-110.877588,78.735059],[-113.223047,78.2979]]],[[[-113.215186,77.903516],[-112.372656,77.364111],[-110.198486,77.524512],[-110.865625,77.834131],[-109.622266,78.074756],[-110.458057,78.103223],[-113.215186,77.903516]]],[[[-112.514062,28.847607],[-112.278418,28.769336],[-112.203076,29.005322],[-112.423535,29.203662],[-112.514062,28.847607]]],[[[-112.296777,24.789648],[-112.057275,24.545703],[-112.159424,25.285645],[-112.296777,24.789648]]],[[[-106.921533,73.479834],[-105.288916,72.919922],[-104.5875,73.578076],[-106.613965,73.695605],[-106.921533,73.479834]]],[[[-105.514551,79.24248],[-104.895508,78.808154],[-104.151953,78.989893],[-103.371582,78.736328],[-104.763574,78.35166],[-102.731348,78.371045],[-100.274658,77.832715],[-99.166406,77.856934],[-99.609424,78.583057],[-101.703662,79.078906],[-102.576172,78.879395],[-103.426025,79.315625],[-105.514551,79.24248]]],[[[-104.887402,75.147754],[-104.119922,75.036328],[-104.346191,75.429932],[-104.887402,75.147754]]],[[[-104.35752,76.334619],[-103.311377,76.347559],[-104.022852,76.583105],[-104.35752,76.334619]]],[[[-104.350635,76.182324],[-103.314746,75.764209],[-102.227344,76.014893],[-102.728027,76.307031],[-104.350635,76.182324]]],[[[-102.70874,72.764502],[-98.662891,71.3021],[-98.322705,71.852344],[-97.582275,71.629688],[-96.613428,71.833838],[-96.445605,72.552441],[-97.636328,73.027637],[-98.421777,72.941016],[-97.170508,73.824854],[-99.157959,73.731592],[-100.001904,73.945898],[-100.962988,73.791406],[-100.52168,73.449316],[-101.523193,73.486377],[-99.825146,73.213867],[-100.536377,73.197852],[-100.128125,72.906689],[-101.273193,72.72168],[-102.204004,73.077295],[-102.70874,72.764502]]],[[[-102.587402,75.513672],[-99.19458,75.698389],[-100.711914,75.406348],[-100.234375,75.007715],[-97.674316,75.127295],[-97.700928,76.466504],[-98.71084,76.693848],[-98.890332,76.465576],[-100.829736,76.523877],[-99.541064,76.146289],[-99.865479,75.924219],[-101.415186,76.424902],[-102.104688,76.331201],[-100.972803,75.798438],[-102.144727,75.875049],[-102.587402,75.513672]]],[[[-102.447705,77.880615],[-101.693555,77.696582],[-101.193213,77.829785],[-102.447705,77.880615]]],[[[-100.053271,80.093359],[-98.945215,79.724072],[-98.791602,79.981104],[-100.053271,80.093359]]],[[[-99.494678,68.95957],[-96.401562,68.470703],[-95.267773,68.826074],[-97.439453,69.642676],[-98.200488,69.796973],[-98.041357,69.456641],[-98.545996,69.5729],[-99.494678,68.95957]]],[[[-99.416992,73.89541],[-98.270361,73.868506],[-97.698242,74.108691],[-99.416992,73.89541]]],[[[-98.332617,78.773535],[-96.989648,77.806006],[-94.934277,78.075635],[-94.915381,78.390527],[-96.204492,78.531299],[-98.332617,78.773535]]],[[[-96.915137,75.379688],[-96.078564,75.510107],[-96.367822,75.654639],[-96.915137,75.379688]]],[[[-96.880713,76.73833],[-95.273877,76.264404],[-93.091748,76.354004],[-91.549121,74.655566],[-90.880225,74.817773],[-89.558691,74.554736],[-88.534961,74.831738],[-88.423047,74.494141],[-84.425537,74.508105],[-83.531885,74.585693],[-83.52207,74.901465],[-82.735791,74.530273],[-80.262744,74.584473],[-80.347754,74.902979],[-79.401416,74.917627],[-80.381982,75.03418],[-79.509082,75.259814],[-80.321973,75.629102],[-83.931982,75.818945],[-85.951465,75.39502],[-88.644971,75.658447],[-88.916699,75.453955],[-91.407324,76.220068],[-89.284521,76.301611],[-91.415088,76.455859],[-90.542627,76.495752],[-91.305029,76.680762],[-93.53457,76.447705],[-93.230029,76.770264],[-94.294971,76.912451],[-95.849512,77.066211],[-96.880713,76.73833]]],[[[-96.773242,80.135791],[-96.589062,79.91665],[-95.739355,79.660156],[-94.401855,79.736328],[-95.662891,79.527344],[-95.103174,79.289893],[-91.299902,79.372705],[-94.1146,78.928906],[-91.866895,78.542676],[-92.35127,78.312891],[-89.525684,78.159619],[-90.037109,78.606836],[-88.822412,78.185889],[-88.040186,78.995312],[-87.617383,78.676318],[-85.042139,79.28457],[-85.647852,79.611426],[-87.295166,79.580176],[-87.675,80.372119],[-88.857324,80.166211],[-91.885547,81.132861],[-94.220117,81.330762],[-93.286719,81.100293],[-95.514746,80.838135],[-93.92793,80.55918],[-95.926953,80.720654],[-96.394092,80.315039],[-94.262598,80.194873],[-96.773242,80.135791]]],[[[-96.599609,75.031787],[-94.534521,74.636719],[-93.573096,74.668848],[-93.542578,75.02793],[-94.878174,75.630029],[-96.599609,75.031787]]],[[[-95.987061,77.484131],[-93.543945,77.46665],[-93.300977,77.739795],[-95.484375,77.791992],[-95.987061,77.484131]]],[[[-95.63291,73.695459],[-95.007861,72.012793],[-94.037549,72.02876],[-93.555176,72.421143],[-94.211328,72.756934],[-92.11792,72.753809],[-90.381396,73.824756],[-93.17085,74.160986],[-94.973535,74.041406],[-94.697607,73.663574],[-95.63291,73.695459]]],[[[-91.647559,81.683838],[-89.82168,81.634863],[-90.416309,81.405371],[-87.597021,81.52583],[-89.673682,81.328613],[-89.623047,81.032471],[-84.941211,81.28623],[-89.166895,80.941309],[-88.003662,80.675391],[-83.288818,81.147949],[-86.250342,80.565771],[-81.007031,80.654883],[-76.885107,81.430273],[-78.716211,80.95166],[-76.862988,80.864795],[-82.987012,80.322607],[-80.475928,79.60625],[-83.723633,80.228955],[-86.498535,80.258252],[-86.420752,79.845215],[-83.575879,79.053662],[-84.412012,78.996582],[-81.750098,78.975781],[-83.271436,78.770312],[-86.80791,78.774365],[-87.551758,78.176611],[-85.920068,78.342871],[-85.585938,78.10957],[-84.783203,78.527588],[-84.222705,78.176025],[-85.547559,77.927686],[-85.289355,77.559033],[-83.779395,77.532617],[-82.710352,77.849512],[-83.721289,77.414209],[-84.738672,77.361035],[-86.755078,77.863721],[-88.016992,77.784717],[-86.812256,77.184912],[-89.499756,76.826807],[-89.369629,76.474463],[-88.545801,76.420898],[-88.49585,76.772852],[-88.395996,76.405273],[-87.497559,76.386279],[-87.489795,76.58584],[-86.680225,76.376611],[-86.453711,76.584863],[-85.14126,76.30459],[-84.275342,76.356543],[-84.223779,76.675342],[-83.885693,76.453125],[-82.233154,76.46582],[-82.529834,76.723291],[-80.799707,76.173584],[-78.284326,76.57124],[-78.288867,76.977979],[-82.056787,77.296533],[-81.659082,77.525439],[-78.708496,77.342139],[-78.012598,77.946045],[-75.865967,78.009814],[-75.193457,78.327734],[-76.416113,78.511523],[-74.486328,78.750098],[-78.581641,79.075],[-74.640918,79.035547],[-76.898828,79.512305],[-73.361523,79.504004],[-74.394482,79.874072],[-71.387842,79.761768],[-70.568408,80.093701],[-72.055957,80.123242],[-70.264893,80.233594],[-70.712598,80.5396],[-69.550684,80.383252],[-64.780078,81.492871],[-68.688525,81.293311],[-61.615381,82.184424],[-63.641016,82.812598],[-68.469336,82.653369],[-66.422559,82.926855],[-69.488867,83.016797],[-72.81167,83.081201],[-72.658691,82.721631],[-74.41416,83.013135],[-77.124902,83.008545],[-76.009375,82.535156],[-77.618066,82.89585],[-80.154932,82.911133],[-78.748779,82.679395],[-81.010156,82.779053],[-82.447559,82.39502],[-79.465625,81.851123],[-84.896826,82.449414],[-86.615625,82.218555],[-85.044824,81.982812],[-88.063184,82.096484],[-91.647559,81.683838]]],[[[-91.596826,.0021],[-91.120947,-.559082],[-91.49541,-.860938],[-91.131055,-1.019629],[-90.799658,-.752051],[-91.272168,.025146],[-91.596826,.0021]]],[[[-91.019043,77.643896],[-90.993213,77.329492],[-89.833252,77.267627],[-91.019043,77.643896]]],[[[-90.531689,-.581445],[-90.334863,-.771582],[-90.269385,-.484668],[-90.531689,-.581445]]],[[[-89.861523,72.411914],[-89.805371,71.462305],[-87.140088,71.011621],[-89.455908,71.061719],[-88.782715,70.494482],[-87.838135,70.246582],[-86.396875,70.465332],[-85.780029,70.03667],[-81.564697,69.942725],[-80.921729,69.730908],[-81.651953,70.094629],[-78.889648,69.97749],[-79.066406,70.603564],[-75.647754,69.212549],[-76.557227,69.009473],[-76.585059,68.69873],[-74.716699,69.045508],[-74.892969,68.808154],[-74.270117,68.541211],[-73.822119,68.685986],[-72.22002,67.254297],[-74.416406,66.16709],[-73.550781,65.485254],[-75.798682,65.29751],[-75.4521,64.841602],[-75.82832,65.227051],[-77.326709,65.453125],[-78.095605,64.939258],[-78.045215,64.499268],[-76.856152,64.237646],[-74.694727,64.496582],[-74.681396,64.830664],[-74.064795,64.424658],[-73.271289,64.58252],[-72.498438,63.823486],[-71.380859,63.580322],[-71.992236,63.416162],[-71.347266,63.066113],[-69.604736,62.767725],[-68.535889,62.255615],[-66.123877,61.893066],[-65.980176,62.208887],[-68.911084,63.703223],[-67.722559,63.422754],[-67.893262,63.73374],[-66.697461,63.069531],[-66.65498,63.264746],[-65.108496,62.626465],[-65.162793,62.932617],[-64.672363,62.921973],[-65.191846,63.764258],[-64.664648,63.245361],[-64.410937,63.706348],[-65.580322,64.293848],[-65.074609,64.43667],[-65.529346,64.504785],[-65.274805,64.631543],[-66.635498,65.000342],[-66.697412,64.815186],[-67.117969,65.440381],[-67.936768,65.564893],[-68.748926,66.200049],[-67.350439,65.929736],[-67.883398,66.467432],[-67.225391,66.310254],[-66.986328,66.62749],[-66.063721,66.132715],[-65.656348,66.204736],[-65.825732,65.996924],[-64.445361,66.317139],[-65.401611,65.764014],[-64.555078,65.116602],[-64.269678,65.400781],[-63.606592,64.928076],[-63.45874,65.853027],[-62.658887,65.639941],[-62.624121,66.01626],[-61.991602,66.035303],[-62.553125,66.406836],[-61.570801,66.3729],[-62.12334,66.643066],[-61.353418,66.689209],[-62.123584,67.046729],[-63.701562,66.822363],[-63.040137,67.23501],[-64.699951,67.350537],[-63.850195,67.566064],[-65.021094,67.787549],[-64.922314,68.031641],[-65.40127,67.674854],[-65.942383,68.070947],[-66.443945,67.833838],[-66.212402,68.28042],[-66.923096,68.065723],[-66.742725,68.457764],[-69.319092,68.856982],[-67.883203,68.783984],[-67.832617,69.065967],[-69.040625,69.097998],[-68.406299,69.232227],[-66.707422,69.168213],[-67.236963,69.460107],[-69.250781,69.511914],[-67.221631,69.730713],[-67.363672,70.034424],[-68.059082,70.317236],[-68.744043,69.941406],[-68.778223,70.203564],[-70.057715,70.042627],[-68.363525,70.48125],[-69.949805,70.84502],[-71.429443,70.127783],[-71.275879,70.500293],[-71.890186,70.431543],[-70.672656,71.052197],[-72.632715,70.830762],[-71.229395,71.33877],[-72.901953,71.677783],[-73.180615,71.282861],[-73.712842,71.587598],[-74.197266,71.40415],[-73.814062,71.771436],[-74.996191,71.218115],[-74.700781,71.675586],[-75.204785,71.709131],[-74.209326,71.978662],[-74.903174,72.100488],[-75.922803,71.717236],[-75.052686,72.226367],[-75.704297,72.571533],[-77.753223,72.724756],[-78.484277,72.470605],[-77.516504,72.177783],[-78.699268,72.351416],[-78.585107,71.880615],[-79.831299,72.446289],[-80.925146,71.907666],[-80.611475,72.45083],[-81.229346,72.311719],[-80.277246,72.770166],[-81.946143,73.729834],[-85.454736,73.105469],[-84.256641,72.796729],[-85.262109,72.954004],[-85.649902,72.722168],[-84.28374,72.044482],[-85.321875,72.233154],[-85.911621,71.986523],[-84.699414,71.631445],[-84.82373,71.028613],[-86.589355,71.010791],[-85.023389,71.353223],[-86.218457,71.899121],[-86.656299,72.724023],[-84.946777,73.721631],[-85.950781,73.850146],[-88.705176,73.403271],[-89.861523,72.411914]]],[[[-89.608594,-.888574],[-89.418896,-.911035],[-89.287842,-.689844],[-89.608594,-.888574]]],[[[-87.151904,63.585645],[-85.768945,63.700342],[-85.392627,63.119678],[-83.303955,64.143799],[-81.046387,63.461572],[-80.302051,63.762207],[-80.828955,64.089941],[-81.887109,64.016406],[-82.05,64.644287],[-84.501123,65.458447],[-84.919629,65.261084],[-85.554688,65.918652],[-86.2521,64.136865],[-87.151904,63.585645]]],[[[-85.116748,29.632812],[-84.90791,29.642627],[-84.737158,29.732422],[-85.116748,29.632812]]],[[[-84.887207,21.856982],[-84.030957,21.943115],[-82.738037,22.689258],[-81.838818,22.672461],[-81.710352,22.49668],[-82.077734,22.387695],[-81.849414,22.213672],[-81.185498,22.267969],[-79.357422,21.585156],[-78.727686,21.592725],[-78.116357,20.761865],[-77.22959,20.64375],[-77.103809,20.40752],[-77.715088,19.855469],[-75.116406,19.901416],[-74.153711,20.168555],[-74.882568,20.650635],[-75.724561,20.714551],[-75.722949,21.111035],[-77.252881,21.483496],[-77.366162,21.612646],[-77.144141,21.643604],[-77.497266,21.871631],[-79.275684,22.407617],[-79.820264,22.887012],[-81.837451,23.163037],[-84.044922,22.666016],[-84.361279,22.378906],[-84.326367,22.074316],[-84.887207,21.856982]]],[[[-84.407178,66.131006],[-84.118262,65.771777],[-83.332422,65.631055],[-83.725977,65.796729],[-84.407178,66.131006]]],[[[-83.910498,62.45415],[-83.698877,62.160254],[-82.568262,62.403223],[-82.000488,62.954199],[-83.376416,62.904932],[-83.910498,62.45415]]],[[[-83.183789,21.593457],[-82.561768,21.57168],[-82.991211,21.942725],[-82.973584,21.592285],[-83.183789,21.593457]]],[[[-82.039258,53.049902],[-80.731689,52.747266],[-81.135596,53.205811],[-82.039258,53.049902]]],[[[-81.404785,19.278418],[-81.107129,19.305176],[-81.369531,19.348877],[-81.404785,19.278418]]],[[[-80.848877,73.72124],[-79.820703,72.826318],[-76.183398,72.843066],[-77.206543,73.499561],[-79.537305,73.654492],[-80.848877,73.72124]]],[[[-80.794775,69.689258],[-79.977832,69.509668],[-79.430664,69.787793],[-80.794775,69.689258]]],[[[-80.580566,24.954248],[-80.381836,25.142285],[-80.25708,25.347607],[-80.580566,24.954248]]],[[[-80.260059,62.109033],[-79.816113,61.594629],[-79.323926,62.026074],[-79.545312,62.411719],[-80.260059,62.109033]]],[[[-80.223682,-2.753125],[-80.131592,-2.973145],[-79.909033,-2.725586],[-80.223682,-2.753125]]],[[[-79.9875,55.892139],[-79.544727,56.128369],[-79.764746,55.806787],[-79.495117,55.874756],[-79.182129,56.212158],[-79.175488,55.885059],[-78.935596,56.266064],[-79.272412,56.600439],[-79.536328,56.180078],[-79.458887,56.539746],[-79.9875,55.892139]]],[[[-79.64375,52.010059],[-79.384277,51.951953],[-79.271289,52.086816],[-79.64375,52.010059]]],[[[-79.63877,75.84292],[-79.063086,75.925879],[-79.009326,76.145898],[-79.63877,75.84292]]],[[[-78.985645,26.689502],[-78.743652,26.500684],[-77.922461,26.691113],[-78.492871,26.729053],[-78.985645,26.689502]]],[[[-78.536768,63.42373],[-77.942432,63.114404],[-77.532715,63.233643],[-77.876709,63.470557],[-78.536768,63.42373]]],[[[-78.366504,24.544189],[-78.044922,24.287451],[-77.743848,24.707422],[-78.211377,25.19126],[-78.366504,24.544189]]],[[[-78.339502,18.287207],[-77.20498,17.714941],[-76.853223,17.97373],[-76.210791,17.913525],[-77.261475,18.457422],[-77.873438,18.522217],[-78.339502,18.287207]]],[[[-77.999902,24.219824],[-77.57373,23.73916],[-77.657715,24.249463],[-77.999902,24.219824]]],[[[-77.94375,26.903564],[-77.238623,26.561133],[-77.403174,26.024707],[-77.225635,25.904199],[-77.066357,26.530176],[-77.533887,26.903418],[-77.94375,26.903564]]],[[[-77.187549,69.440088],[-76.995361,69.14375],[-76.668848,69.366162],[-77.187549,69.440088]]],[[[-77.125879,67.94707],[-76.944189,67.250293],[-75.201953,67.45918],[-75.078125,68.173145],[-75.675879,68.32251],[-76.595801,68.278955],[-77.125879,67.94707]]],[[[-76.648828,25.487402],[-76.1604,25.119336],[-76.169531,24.649414],[-76.126611,25.140527],[-76.648828,25.487402]]],[[[-75.72666,24.689355],[-75.503223,24.139062],[-75.308398,24.2],[-75.72666,24.689355]]],[[[-75.641162,-49.19541],[-75.106689,-48.836523],[-75.583105,-48.858887],[-75.641162,-49.19541]]],[[[-75.549805,-49.791309],[-75.066016,-49.852344],[-74.723828,-49.423828],[-74.594727,-50.006641],[-74.476172,-49.147852],[-74.546094,-48.766895],[-74.89624,-48.733203],[-75.549805,-49.791309]]],[[[-75.510254,-48.763477],[-75.158496,-48.622656],[-75.391406,-48.019727],[-75.510254,-48.763477]]],[[[-75.449121,-50.343359],[-75.054785,-50.296094],[-74.875977,-50.109961],[-75.32666,-50.011816],[-75.449121,-50.343359]]],[[[-75.427637,-50.480566],[-75.302002,-50.67998],[-75.115332,-50.510449],[-75.427637,-50.480566]]],[[[-75.315967,23.668359],[-75.22334,23.165332],[-74.840479,22.894336],[-75.315967,23.668359]]],[[[-75.289111,-51.625391],[-74.558643,-51.277051],[-75.153662,-51.278809],[-75.289111,-51.625391]]],[[[-75.212891,-48.141699],[-74.923047,-48.626465],[-74.567285,-48.591992],[-74.895654,-47.839355],[-75.212891,-48.141699]]],[[[-75.105371,-51.788867],[-74.694482,-52.279199],[-74.822949,-51.630176],[-75.105371,-51.788867]]],[[[-74.706543,68.06709],[-74.573389,67.828662],[-73.621729,67.783838],[-73.49375,68.000635],[-74.706543,68.06709]]],[[[-74.689844,-45.662598],[-74.312891,-45.691504],[-74.310547,-45.172656],[-74.689844,-45.662598]]],[[[-74.617773,-44.647949],[-74.01626,-45.344922],[-73.728174,-45.195898],[-74.002051,-44.590918],[-73.735352,-44.394531],[-73.994922,-44.140234],[-74.617773,-44.647949]]],[[[-74.478125,18.45],[-73.884961,18.041895],[-73.385156,18.251172],[-71.768311,18.03916],[-71.438965,17.635596],[-71.027832,18.273193],[-69.274512,18.439844],[-68.687402,18.214941],[-68.33916,18.611523],[-69.623633,19.117822],[-69.232471,19.271826],[-69.739404,19.299219],[-69.956836,19.671875],[-70.95415,19.913965],[-71.779248,19.718164],[-73.400537,19.807422],[-72.703223,19.441064],[-72.811084,19.071582],[-72.376074,18.574463],[-72.789355,18.434814],[-74.227734,18.662695],[-74.478125,18.45]]],[[[-74.387354,-43.231641],[-73.773389,-43.345898],[-73.436328,-42.936523],[-73.789258,-42.585742],[-73.4229,-42.192871],[-73.527832,-41.896289],[-74.03667,-41.795508],[-74.387354,-43.231641]]],[[[-74.014893,40.581201],[-71.903223,41.060693],[-72.509766,40.986035],[-72.274121,41.153027],[-73.573828,40.919629],[-74.014893,40.581201]]],[[[-73.960547,45.441406],[-73.566504,45.469092],[-73.476074,45.704736],[-73.960547,45.441406]]],[[[-73.845459,-53.545801],[-73.210645,-53.98584],[-72.76377,-53.864844],[-72.870996,-54.126562],[-72.20542,-53.807422],[-72.923242,-53.481641],[-73.845459,-53.545801]]],[[[-73.681152,20.975586],[-73.164551,20.97915],[-73.026855,21.192383],[-73.523096,21.19082],[-73.681152,20.975586]]],[[[-73.39707,-44.774316],[-72.986133,-44.780078],[-72.776367,-44.508594],[-73.207715,-44.334961],[-73.39707,-44.774316]]],[[[-72.818066,78.194336],[-69.351367,77.467139],[-66.691211,77.681201],[-66.389453,77.280273],[-68.135547,77.37959],[-71.141455,77.028662],[-68.114258,76.650635],[-69.484082,76.39917],[-68.14873,76.067041],[-66.674805,75.977393],[-66.992578,76.212939],[-63.291309,76.352051],[-58.516211,75.689062],[-58.565527,75.352734],[-56.255469,74.526807],[-57.230566,74.125293],[-56.225391,74.129102],[-55.288281,73.3271],[-55.668555,73.00791],[-54.737939,72.87251],[-55.601709,72.453467],[-55.581445,72.178857],[-54.840137,72.356104],[-55.594043,71.553516],[-53.962988,71.458984],[-53.652148,72.362646],[-53.440088,71.579004],[-51.769922,71.671729],[-53.007568,71.17998],[-51.018945,71.001318],[-51.774316,71.010449],[-50.872363,70.364893],[-52.801953,70.750586],[-54.530762,70.699268],[-52.254639,70.058936],[-50.291699,70.014453],[-50.945703,68.682666],[-51.623145,68.534814],[-52.60459,68.70874],[-53.383154,68.297363],[-51.210156,68.419922],[-51.456494,68.116064],[-53.151562,68.207764],[-53.735205,67.549023],[-52.344824,67.836914],[-50.968848,67.806641],[-50.613477,67.52793],[-52.666455,67.749707],[-53.884424,67.135547],[-52.386865,66.881152],[-53.41875,66.648535],[-53.53877,66.139355],[-51.225,66.881543],[-53.392041,66.04834],[-53.198975,65.594043],[-52.55127,65.461377],[-51.091895,65.775781],[-52.537695,65.328809],[-51.922607,64.21875],[-50.721582,64.797607],[-50.960645,65.201123],[-50.121631,64.70376],[-50.008984,64.447266],[-50.49209,64.693164],[-51.40376,64.463184],[-51.584912,64.103174],[-50.260693,64.214258],[-51.54751,64.006104],[-51.468848,63.642285],[-50.390088,62.822021],[-49.793115,63.044629],[-50.319238,62.473193],[-49.553467,62.232715],[-49.623779,61.998584],[-48.828711,62.079688],[-49.380273,61.890186],[-49.289062,61.589941],[-48.386426,61.004736],[-47.770312,60.997754],[-48.180811,60.769238],[-46.874463,60.816406],[-45.870215,61.218311],[-46.046631,60.615723],[-45.380518,60.444922],[-44.756738,60.6646],[-45.379248,60.20293],[-44.613281,60.01665],[-44.224365,60.273535],[-44.412939,59.922607],[-43.906543,59.815479],[-43.955029,60.025488],[-43.1229,60.06123],[-43.212988,60.390674],[-43.922705,60.595361],[-43.044092,60.523682],[-42.585303,61.71748],[-42.110205,61.857227],[-42.152979,62.568457],[-42.94165,62.720215],[-41.908984,62.737109],[-41.634473,62.972461],[-42.174512,63.208789],[-41.387891,63.061865],[-40.550391,63.725244],[-40.617773,64.131738],[-41.581006,64.29834],[-40.781738,64.221777],[-40.182227,64.479932],[-41.084424,65.10083],[-39.937256,65.141602],[-39.57793,65.340771],[-40.173535,65.556152],[-38.203369,65.711719],[-38.520361,66.009668],[-38.139941,65.903516],[-37.752344,66.261523],[-38.156641,66.385596],[-37.278711,66.304395],[-37.954785,65.633594],[-36.665186,65.790088],[-36.527246,66.007715],[-36.379199,65.830811],[-35.630078,66.139941],[-35.867236,66.441406],[-35.188574,66.250293],[-34.198242,66.655078],[-32.164551,67.991113],[-32.327441,68.437305],[-30.978564,68.061328],[-26.48291,68.675928],[-22.287061,70.033398],[-25.529883,70.353174],[-27.38418,69.991602],[-27.56084,70.124463],[-26.621777,70.463379],[-29.07207,70.444971],[-28.069873,70.699023],[-28.398438,70.99292],[-26.71792,70.950488],[-25.742236,71.183594],[-25.842725,71.480176],[-27.087207,71.626562],[-25.885156,71.571924],[-24.562207,71.223535],[-23.327832,70.450977],[-22.690674,70.437305],[-22.437012,70.86001],[-22.384131,70.462402],[-21.522656,70.526221],[-21.752246,71.47832],[-22.479639,71.383447],[-21.959668,71.744678],[-25.117871,72.346973],[-24.81333,72.901514],[-26.657617,72.71582],[-24.62998,73.037646],[-24.069043,72.49873],[-22.293213,72.119531],[-22.036328,72.918457],[-24.132666,73.409375],[-27.348047,73.067822],[-27.561621,73.138477],[-26.541846,73.248975],[-27.27041,73.436279],[-26.062305,73.253027],[-24.79126,73.511279],[-25.521289,73.851611],[-22.346875,73.269238],[-20.509668,73.492871],[-20.367285,73.848242],[-22.134814,73.990479],[-22.321582,74.302539],[-21.94292,74.565723],[-21.954932,74.244287],[-20.653125,74.137354],[-19.369141,74.284033],[-19.287012,74.546387],[-19.984912,74.975195],[-20.861572,74.635938],[-20.985791,75.074365],[-22.232861,75.119727],[-20.484961,75.314258],[-19.526367,75.180225],[-19.508984,75.75752],[-20.103613,76.219092],[-21.488232,76.271875],[-22.609326,76.704297],[-20.486719,76.920801],[-18.510303,76.778174],[-18.442627,77.259375],[-20.680811,77.618994],[-19.49043,77.718896],[-20.862598,77.911865],[-21.72959,77.708545],[-21.13374,78.658643],[-18.991992,79.178369],[-20.150146,80.01123],[-19.429199,80.257715],[-16.48877,80.251953],[-16.760596,80.573389],[-11.430664,81.456836],[-14.241992,81.813867],[-17.456055,81.397705],[-19.629932,81.639893],[-23.117725,80.778174],[-21.337988,82.068701],[-24.293066,81.700977],[-25.148828,82.001123],[-29.887402,82.054834],[-23.118066,82.324707],[-21.58252,82.63418],[-25.123389,83.159619],[-32.032715,82.983447],[-25.795068,83.260986],[-29.952881,83.564844],[-37.72334,83.497754],[-38.15625,82.998633],[-40.356836,83.332178],[-41.300146,83.100781],[-43.009277,83.2646],[-46.169043,83.063867],[-46.136816,82.858838],[-41.369629,82.75],[-45.556543,82.747021],[-44.238867,82.368164],[-44.729492,81.779834],[-50.037109,82.472412],[-49.541064,81.918066],[-53.022559,82.321729],[-53.555664,81.653271],[-54.548877,82.350635],[-59.261816,82.006641],[-56.615137,81.362891],[-59.281934,81.884033],[-60.842871,81.855371],[-61.435986,81.133594],[-62.903369,81.218359],[-63.028662,80.889551],[-64.515527,81],[-67.050635,80.384521],[-66.843652,80.076221],[-64.17915,80.099268],[-65.825537,79.17373],[-71.651318,78.623145],[-72.818066,78.194336]]],[[[-72.210449,-54.047754],[-71.948535,-54.300879],[-71.143262,-54.374023],[-71.021924,-54.111816],[-71.390479,-54.032812],[-71.996484,-53.884863],[-72.210449,-54.047754]]],[[[-71.927734,-54.528711],[-68.653223,-54.853613],[-66.511133,-55.032129],[-65.179004,-54.678125],[-67.294238,-54.049805],[-68.488525,-53.260938],[-68.240137,-53.081836],[-68.629932,-52.652637],[-69.414062,-52.48623],[-69.935449,-52.821094],[-70.380127,-52.751953],[-70.329297,-53.377637],[-69.355957,-53.416309],[-70.151123,-53.888086],[-69.044336,-54.406738],[-69.253174,-54.557422],[-70.535303,-54.136133],[-70.531299,-53.627344],[-70.863086,-54.110449],[-70.310986,-54.528516],[-70.797266,-54.327246],[-71.927734,-54.528711]]],[[[-71.847656,21.843457],[-71.661426,21.765234],[-71.668359,21.833447],[-71.847656,21.843457]]],[[[-71.437207,-54.889258],[-70.297852,-55.11377],[-70.991602,-54.867969],[-71.437207,-54.889258]]],[[[-70.066113,12.546973],[-69.899121,12.452002],[-70.035107,12.614111],[-70.066113,12.546973]]],[[[-69.979785,-55.147461],[-69.411816,-55.444238],[-69.192627,-55.171875],[-68.04834,-55.643164],[-68.458008,-54.959668],[-69.702979,-54.919043],[-69.979785,-55.147461]]],[[[-69.158887,12.380273],[-68.995117,12.141846],[-68.751074,12.059766],[-69.158887,12.380273]]],[[[-68.301367,-54.980664],[-68.07002,-55.221094],[-67.079932,-55.153809],[-68.301367,-54.980664]]],[[[-68.233789,60.240918],[-67.818848,60.449512],[-68.087598,60.587842],[-68.233789,60.240918]]],[[[-67.196875,17.994189],[-65.970801,17.974365],[-65.62085,18.242334],[-66.129395,18.444922],[-67.158643,18.499219],[-67.196875,17.994189]]],[[[-65.432129,61.649512],[-64.832617,61.366064],[-64.789648,61.662207],[-65.432129,61.649512]]],[[[-64.889111,17.701709],[-64.580469,17.750195],[-64.765625,17.794336],[-64.889111,17.701709]]],[[[-64.862842,32.273877],[-64.730273,32.293457],[-64.668311,32.381934],[-64.862842,32.273877]]],[[[-64.637354,-54.902539],[-63.81543,-54.725098],[-64.54917,-54.716211],[-64.637354,-54.902539]]],[[[-64.485205,49.886963],[-63.041504,49.224951],[-61.801123,49.093896],[-62.858545,49.705469],[-64.485205,49.886963]]],[[[-64.426074,18.513086],[-64.395215,18.4646],[-64.324658,18.51748],[-64.426074,18.513086]]],[[[-64.402344,10.981592],[-63.917627,10.887549],[-63.849365,11.131006],[-64.402344,10.981592]]],[[[-64.388037,46.640869],[-63.641016,46.230469],[-62.978467,46.316357],[-63.02207,46.066602],[-62.531348,45.977295],[-62.02373,46.421582],[-63.811279,46.468701],[-63.993555,47.061572],[-64.388037,46.640869]]],[[[-63.16001,18.171387],[-63.001221,18.221777],[-63.026025,18.269727],[-63.16001,18.171387]]],[[[-63.123047,18.068945],[-63.023047,18.019189],[-63.011182,18.068945],[-63.063086,18.115332],[-63.123047,18.068945]]],[[[-62.874219,17.922266],[-62.831934,17.876465],[-62.799707,17.908691],[-62.874219,17.922266]]],[[[-62.838916,17.339258],[-62.630664,17.23999],[-62.827051,17.386426],[-62.838916,17.339258]]],[[[-62.221631,16.699512],[-62.148438,16.740332],[-62.191357,16.804395],[-62.221631,16.699512]]],[[[-61.906104,10.069141],[-61.012109,10.134326],[-60.917627,10.840234],[-61.651172,10.718066],[-61.499316,10.268555],[-61.906104,10.069141]]],[[[-61.887109,17.098145],[-61.716064,17.037012],[-61.817285,17.168945],[-61.887109,17.098145]]],[[[-61.715527,12.012646],[-61.607031,12.223291],[-61.71499,12.185156],[-61.715527,12.012646]]],[[[-61.522168,16.228027],[-61.327148,16.23042],[-61.172607,16.256104],[-61.471191,16.506641],[-61.522168,16.228027]]],[[[-61.458105,15.633105],[-61.281689,15.249023],[-61.277246,15.526709],[-61.458105,15.633105]]],[[[-61.449805,45.716211],[-60.672949,45.59082],[-59.842188,45.941553],[-60.297949,46.31123],[-60.737891,45.751416],[-61.059033,45.703369],[-60.865234,45.983496],[-61.105176,45.944727],[-60.494531,46.270264],[-60.408203,47.003516],[-61.408643,46.170361],[-61.449805,45.716211]]],[[[-61.268457,13.287695],[-61.174512,13.158105],[-61.138965,13.35874],[-61.268457,13.287695]]],[[[-61.21333,14.848584],[-61.063721,14.46709],[-60.82627,14.494482],[-61.21333,14.848584]]],[[[-61.073145,13.865576],[-60.895215,13.821973],[-60.908105,14.093359],[-61.073145,13.865576]]],[[[-60.961426,-52.057324],[-60.686377,-52.188379],[-59.268066,-51.427539],[-60.28623,-51.461914],[-60.568457,-51.357812],[-60.245166,-51.638867],[-60.58252,-51.712695],[-60.238477,-51.771973],[-60.961426,-52.057324]]],[[[-59.64668,13.303125],[-59.493311,13.081982],[-59.427637,13.152783],[-59.64668,13.303125]]],[[[-59.570801,-51.925391],[-59.395654,-52.308008],[-59.19585,-52.017676],[-58.652783,-52.099219],[-57.791797,-51.636133],[-57.976514,-51.384375],[-58.271582,-51.574707],[-58.850195,-51.269922],[-59.570801,-51.925391]]],[[[-59.320654,47.736914],[-59.116943,47.570703],[-58.336865,47.730859],[-56.774121,47.56499],[-55.85791,47.819189],[-56.127246,47.502832],[-55.576123,47.465234],[-54.784619,47.664746],[-55.919238,47.016895],[-55.788525,46.867236],[-54.488135,47.403857],[-54.191846,47.859814],[-53.849512,47.440332],[-54.17373,46.880371],[-53.597363,47.145996],[-53.589795,46.638867],[-53.114844,46.655811],[-52.653662,47.549414],[-52.782422,47.769434],[-53.169824,47.512109],[-52.866016,48.112988],[-53.672363,47.648242],[-53.86958,48.019678],[-53.027588,48.634717],[-54.114453,48.393604],[-53.706348,48.655518],[-54.161279,48.787695],[-53.619434,49.321631],[-54.448242,49.329443],[-54.502197,49.527344],[-55.353174,49.079443],[-55.229541,49.508154],[-56.087305,49.451953],[-55.869824,49.670166],[-56.140186,49.619141],[-55.50293,49.983154],[-56.161279,49.940137],[-56.179395,50.11499],[-56.822168,49.613477],[-55.8,51.033301],[-56.031104,51.328369],[-55.45874,51.536523],[-56.025586,51.568359],[-57.035937,51.01084],[-57.791309,49.48999],[-58.213379,49.38667],[-57.990527,48.987939],[-58.403662,49.084326],[-58.716455,48.598047],[-58.841797,48.746436],[-59.167676,48.558496],[-58.330225,48.522119],[-59.320654,47.736914]]],[[[-56.384766,46.819434],[-56.26709,46.838477],[-56.364648,47.098975],[-56.384766,46.819434]]],[[[-56.214795,72.719189],[-55.566602,72.564355],[-55.016895,72.791113],[-56.214795,72.719189]]],[[[-54.919141,69.713623],[-53.578418,69.256641],[-51.900195,69.604785],[-52.731152,69.944727],[-54.371631,70.317285],[-54.919141,69.713623]]],[[[-51.83252,-1.433789],[-51.276318,-1.021777],[-51.254004,-.541406],[-51.546045,-.649609],[-51.83252,-1.433789]]],[[[-50.796094,-.90625],[-50.507617,-1.787988],[-49.805127,-1.790234],[-48.833594,-1.390039],[-48.392676,-.297363],[-49.628662,-.229199],[-50.645508,-.272852],[-50.796094,-.90625]]],[[[-50.623926,.054395],[-50.426123,.139258],[-50.372754,.590869],[-50.623926,.054395]]],[[[-50.339453,.043359],[-49.91709,-.023193],[-49.738232,.268164],[-50.272656,.231738],[-50.339453,.043359]]],[[[-50.281689,.516504],[-50.15293,.393018],[-50.058838,.638037],[-50.281689,.516504]]],[[[-49.830078,-.093896],[-49.443896,-.112402],[-49.503467,.083691],[-49.830078,-.093896]]],[[[-47.272266,82.656934],[-44.864551,82.083643],[-44.91748,82.480518],[-47.272266,82.656934]]],[[[-46.788086,60.758398],[-46.266699,60.781396],[-46.205225,60.943506],[-46.788086,60.758398]]],[[[-45.451416,-23.895605],[-45.260254,-23.88916],[-45.302344,-23.727539],[-45.451416,-23.895605]]],[[[-38.017432,-54.008008],[-36.085498,-54.866797],[-35.798584,-54.763477],[-36.326465,-54.251172],[-37.10332,-54.065625],[-38.017432,-54.008008]]],[[[-28.035254,70.486816],[-26.604687,70.553369],[-26.217871,70.454053],[-25.432324,70.921338],[-27.617236,70.91377],[-28.035254,70.486816]]],[[[-25.337109,17.091016],[-25.169824,16.946484],[-25.034668,17.176465],[-25.337109,17.091016]]],[[[-24.475684,65.525195],[-21.844385,65.447363],[-22.509082,65.196777],[-21.892139,65.048779],[-24.026172,64.863428],[-21.590625,64.626367],[-22.053369,64.313916],[-21.46333,64.37915],[-22.701172,64.083203],[-22.652197,63.827734],[-21.152393,63.944531],[-20.198145,63.555811],[-18.653613,63.406689],[-14.927393,64.319678],[-13.599316,65.035938],[-13.617871,65.519336],[-14.8271,65.764258],[-15.117383,66.125635],[-14.59585,66.381543],[-15.543115,66.228516],[-16.249316,66.5229],[-16.48501,66.195947],[-17.550439,65.964404],[-18.297168,66.157422],[-18.141943,65.734082],[-18.845898,66.183936],[-19.489697,65.768066],[-20.20752,66.100098],[-21.129687,65.266602],[-21.406885,66.025586],[-22.944336,66.429443],[-22.441699,65.908301],[-23.452539,66.181006],[-23.832617,65.849219],[-23.285352,65.75],[-24.092627,65.776465],[-23.856738,65.538379],[-24.475684,65.525195]]],[[[-23.748096,15.328516],[-23.705371,14.961328],[-23.444238,15.007959],[-23.748096,15.328516]]],[[[-22.959277,16.045117],[-22.710107,16.043359],[-22.917725,16.237256],[-22.959277,16.045117]]],[[[-19.138281,79.852344],[-17.6125,79.825879],[-17.98291,80.055176],[-19.138281,79.852344]]],[[[-18.856055,75.319141],[-18.670801,75.00166],[-17.391992,75.036914],[-18.000537,75.407324],[-18.856055,75.319141]]],[[[-17.535645,14.755127],[-16.618115,14.040527],[-16.766943,13.904932],[-16.562305,13.587305],[-16.351807,13.343359],[-15.42749,13.468359],[-16.413379,13.269727],[-16.669336,13.475],[-16.76333,13.06416],[-16.743896,12.585449],[-16.442871,12.609473],[-16.760303,12.525781],[-16.711816,12.354834],[-16.24458,12.237109],[-16.328076,12.051611],[-15.941748,11.786621],[-15.078271,11.968994],[-15.501904,11.723779],[-15.072656,11.597803],[-15.479492,11.410303],[-15.043018,10.940137],[-14.593506,10.766699],[-14.426904,10.24834],[-13.689795,9.927783],[-13.691357,9.535791],[-13.292676,9.049219],[-13.059473,8.881152],[-13.181836,8.576904],[-12.894092,8.629785],[-13.272754,8.429736],[-12.850879,7.818701],[-12.480273,7.753271],[-12.485645,7.386279],[-11.50752,6.906543],[-9.132178,5.054639],[-7.544971,4.351318],[-5.061816,5.130664],[-5.282373,5.210254],[-3.347559,5.130664],[-3.199951,5.354492],[-3.019141,5.130811],[-3.086719,5.12832],[-3.114014,5.088672],[-2.001855,4.762451],[.259668,5.757324],[.949707,5.810254],[1.187207,6.089404],[1.622656,6.216797],[2.706445,6.369238],[3.716992,6.597949],[3.450781,6.427051],[4.431348,6.348584],[5.112402,5.641553],[5.456641,5.611719],[5.199219,5.533545],[5.549707,5.474219],[5.367969,5.337744],[5.493262,4.83877],[6.076563,4.290625],[6.860352,4.37334],[6.767676,4.724707],[6.923242,4.390674],[7.154688,4.514404],[7.076563,4.716162],[7.800781,4.522266],[8.293066,4.557617],[8.252734,4.923975],[8.555859,4.755225],[8.574414,4.526221],[8.918262,4.55376],[9.000098,4.091602],[9.688867,4.056396],[9.556152,3.798047],[9.948438,3.079053],[9.800781,2.304443],[9.385938,1.139258],[9.59082,1.031982],[9.617969,.576514],[9.324805,.5521],[10.001465,.194971],[9.796777,.044238],[9.354883,.343604],[9.29668,-.35127],[8.946387,-.68877],[8.703125,-.591016],[9.064648,-1.29834],[9.501074,-1.555176],[9.318848,-1.632031],[9.036328,-1.308887],[9.624609,-2.36709],[10.062012,-2.549902],[9.72207,-2.467578],[11.130176,-3.916309],[12.018359,-5.004297],[12.213672,-5.758691],[12.45293,-6.000488],[13.068164,-5.864844],[12.283301,-6.124316],[13.378516,-8.369727],[12.998535,-9.048047],[13.833594,-10.929688],[13.785352,-11.812793],[12.550488,-13.437793],[11.750879,-15.831934],[11.743066,-17.249219],[11.775879,-18.001758],[14.462793,-22.449121],[14.501562,-24.201953],[14.967773,-26.318066],[15.341504,-27.386523],[16.447559,-28.617578],[18.21084,-31.74248],[18.325293,-32.50498],[17.851074,-32.827441],[18.433008,-33.717285],[18.410352,-34.295605],[18.752148,-34.082617],[18.831348,-34.364062],[20.020605,-34.785742],[20.529883,-34.463086],[21.788965,-34.372656],[22.553809,-34.010059],[25.574219,-34.035352],[25.805859,-33.737109],[26.613672,-33.707422],[27.860645,-33.053906],[29.971191,-31.32207],[31.335156,-29.378125],[32.285742,-28.621484],[32.886133,-26.849316],[32.954883,-26.083594],[32.848828,-26.268066],[32.59043,-26.004102],[32.792188,-25.644336],[34.99209,-24.650586],[35.489648,-24.065527],[35.530078,-22.248145],[35.315723,-22.396875],[34.649414,-19.701367],[34.947852,-19.812695],[36.403711,-18.769727],[37.244531,-17.739941],[39.844629,-16.435645],[40.558984,-15.473438],[40.844531,-14.718652],[40.436816,-12.983105],[40.463574,-10.464355],[39.725195,-10.000488],[39.304004,-8.443848],[39.288477,-7.517871],[39.546094,-7.024023],[38.804688,-6.070117],[39.221777,-4.692383],[40.11543,-3.250586],[40.222461,-2.688379],[41.532715,-1.695312],[43.717578,.857861],[46.878809,3.285645],[47.975293,4.497021],[49.049316,6.173633],[49.852051,7.962549],[50.825,9.428174],[50.930078,10.335547],[51.390234,10.422607],[51.031836,10.444775],[51.254883,11.830713],[50.792285,11.983691],[50.110059,11.529297],[48.938574,11.258447],[47.40498,11.174023],[46.565039,10.745996],[45.816699,10.835889],[44.386523,10.430225],[43.245996,11.499805],[42.521777,11.572168],[43.380273,12.09126],[43.116699,12.708594],[41.176465,14.620312],[40.204102,15.014111],[39.86377,15.470312],[39.785547,15.124854],[38.609473,18.005078],[37.471289,18.820117],[37.258594,21.108545],[36.871387,21.996729],[35.697852,22.946191],[35.504395,23.779297],[35.783887,23.937793],[35.194141,24.475146],[33.959082,26.649023],[33.54707,27.898145],[32.359766,29.630664],[32.565723,29.973975],[33.247754,28.567725],[34.220117,27.764307],[34.904297,29.477344],[34.973438,29.555029],[34.950781,29.353516],[34.625,28.064502],[35.180469,28.034863],[37.148828,25.291113],[37.543066,24.29165],[38.46416,23.711865],[39.062012,22.592188],[38.987891,21.881738],[39.276074,20.973975],[39.72832,20.390332],[40.75918,19.755469],[41.229492,18.678418],[42.293945,17.434961],[42.799316,16.371777],[42.657812,15.232812],[42.936426,14.938574],[43.231934,13.26709],[43.487598,12.698828],[44.005859,12.607666],[45.038672,12.815869],[45.657324,13.338721],[46.788867,13.465576],[47.989941,14.048096],[48.668359,14.050146],[49.349902,14.637793],[52.21748,15.655518],[52.327734,16.293555],[53.085645,16.648389],[54.068164,17.005518],[55.06416,17.038916],[55.479102,17.843262],[56.383496,17.987988],[56.825977,18.753516],[57.811621,19.01709],[57.861816,20.244141],[58.169434,20.589502],[58.474219,20.406885],[59.8,22.219922],[59.823242,22.508984],[59.429395,22.66084],[58.773047,23.517188],[57.123047,23.980713],[56.387988,24.979199],[56.297852,25.650684],[56.413086,26.351172],[56.080469,26.062646],[54.147949,24.171191],[52.118555,23.971094],[51.568359,24.286182],[51.267969,24.607227],[51.608887,25.052881],[51.543066,25.902393],[51.262305,26.153271],[50.762891,25.444727],[50.804395,24.789258],[50.081055,25.961377],[50.149805,26.662646],[48.797168,27.724316],[48.44248,28.54292],[48.051465,29.355371],[47.722656,29.393018],[48.143457,29.572461],[47.978711,29.982812],[48.546484,29.962354],[48.919141,30.120898],[49.001953,30.506543],[49.554883,30.028955],[50.071582,30.198535],[51.278906,28.131348],[53.705762,26.725586],[54.759277,26.505078],[55.424023,26.770557],[55.650293,26.977539],[56.356152,27.200244],[56.982227,26.905469],[57.33457,25.791553],[59.046094,25.417285],[61.587891,25.202344],[64.059375,25.40293],[64.658984,25.184082],[66.467676,25.445312],[66.131152,25.493262],[66.324219,25.601807],[66.698633,25.226318],[66.703027,24.860938],[67.171484,24.756104],[67.563086,23.881836],[68.165039,23.857324],[68.234961,23.596973],[68.776758,23.8521],[68.41748,23.571484],[69.235937,22.848535],[69.664648,22.759082],[70.489258,23.089502],[70.177246,22.572754],[68.969922,22.290283],[70.485059,20.840186],[71.024609,20.738867],[72.015234,21.155713],[72.254004,21.531006],[72.037207,21.823047],[72.182813,22.269727],[72.80918,22.233301],[72.553027,22.159961],[72.543066,21.696582],[73.1125,21.750439],[72.613281,21.461816],[72.89375,20.672754],[72.667773,19.830957],[72.987207,19.277441],[72.803027,19.079297],[72.97207,19.15332],[72.875488,18.642822],[73.476074,16.054248],[74.382227,14.494727],[74.945508,12.564551],[75.723828,11.361768],[76.553418,8.902783],[77.517578,8.07832],[78.060156,8.38457],[78.421484,9.105029],[79.411426,9.192383],[78.939941,9.565771],[79.314551,10.256689],[79.838184,10.322559],[79.693164,11.312549],[80.342383,13.361328],[80.062109,13.60625],[80.306543,13.485059],[80.053418,15.074023],[80.293457,15.710742],[80.646582,15.89502],[80.978711,15.75835],[81.286133,16.337061],[82.258789,16.559863],[82.35957,17.096191],[84.104102,18.292676],[85.441602,19.626562],[85.180762,19.594873],[85.248633,19.757666],[86.279492,19.919434],[86.975488,20.700146],[86.954102,21.365332],[87.82373,21.727344],[88.159277,22.121729],[87.941406,22.374316],[88.196289,22.139551],[88.12207,21.635791],[88.584668,21.659717],[88.641602,22.121973],[88.74502,21.584375],[89.05166,21.654102],[89.051465,22.093164],[89.353711,21.721094],[89.483203,22.275537],[89.568555,21.767432],[89.985156,22.466406],[89.918066,22.116162],[90.20957,22.156592],[90.230566,21.829785],[90.616113,22.362158],[90.435059,22.751904],[90.590918,23.266406],[90.269141,23.455859],[90.604004,23.591357],[90.945605,22.597021],[91.480078,22.884814],[91.863379,22.350488],[92.324121,20.791846],[92.722852,20.295605],[92.735645,20.562695],[92.82832,20.177588],[93.066797,20.377637],[93.129492,19.858008],[93.25,20.070117],[93.707031,19.912158],[93.998145,19.440869],[93.824902,19.238477],[93.493066,19.369482],[93.929199,18.899658],[94.044922,19.287402],[94.588965,17.569336],[94.223828,16.016455],[94.70332,16.511914],[94.661523,15.904395],[94.893164,16.182812],[94.942578,15.818262],[95.176953,15.825684],[95.346777,16.097607],[95.389551,15.722754],[96.324316,16.444434],[96.189063,16.768311],[96.431152,16.504932],[96.76543,16.710352],[96.851465,17.401025],[97.375879,16.522949],[97.725977,16.568555],[97.584277,16.01958],[97.812305,14.858936],[98.110645,13.712891],[98.200391,13.980176],[98.575977,13.161914],[98.636328,11.738379],[98.875977,11.719727],[98.464941,10.67583],[98.562598,10.034961],[98.702539,10.190381],[98.241797,8.767871],[98.305469,8.226221],[98.703516,8.256738],[100.119141,6.441992],[100.71543,3.966211],[101.299902,3.253271],[101.295508,2.885205],[103.480273,1.329492],[103.694531,1.449658],[103.991504,1.454785],[103.981445,1.623633],[104.250098,1.388574],[103.812207,2.580469],[103.439453,2.933105],[103.41582,4.850293],[103.09707,5.408447],[102.101074,6.242236],[101.497949,6.865283],[100.423535,7.187842],[100.160742,7.599268],[100.256641,7.774902],[100.545215,7.226904],[100.279395,8.268506],[99.835547,9.288379],[99.253906,9.265234],[99.165039,10.319824],[99.989062,12.170801],[99.990527,13.243457],[100.235645,13.484473],[100.962695,13.431982],[100.897754,12.653809],[101.835742,12.640381],[102.594141,12.203027],[102.933887,11.706689],[103.152832,10.913721],[103.532422,11.14668],[103.721875,10.890137],[103.587109,10.552197],[104.426367,10.41123],[105.084473,9.995703],[104.77041,8.597656],[105.114355,8.629199],[106.168359,9.396729],[105.830957,10.000732],[106.484082,9.559424],[106.136426,10.22168],[106.595605,9.859863],[106.785254,10.116455],[106.464063,10.298291],[106.757422,10.295801],[106.605859,10.464941],[106.947461,10.400342],[107.006641,10.660547],[107.261523,10.398389],[108.001367,10.720361],[108.986719,11.336377],[109.198633,11.724854],[109.423926,12.955957],[108.821289,15.37793],[106.370508,17.746875],[106.499023,17.946436],[105.621777,18.966309],[105.984082,19.939062],[106.572852,20.392188],[106.683398,21.000293],[107.164746,20.94873],[107.972656,21.507959],[107.958,21.534131],[108.034376,21.545821],[108.108289,21.508521],[108.193905,21.519656],[108.156332,21.55083],[108.205608,21.597579],[108.241332,21.599805],[108.249955,21.561406],[108.210535,21.505737],[108.230245,21.491259],[108.330027,21.540254],[108.397781,21.533017],[108.492635,21.554727],[108.591802,21.677129],[108.626294,21.67991],[108.658939,21.643757],[108.678033,21.659331],[108.735931,21.628181],[108.734084,21.626512],[108.745786,21.602587],[108.801837,21.626512],[108.83325,21.610933],[108.881293,21.627068],[108.937959,21.589789],[109.093792,21.579215],[109.09872,21.571424],[109.110422,21.568085],[109.138756,21.567528],[109.142451,21.511861],[109.074698,21.489589],[109.039589,21.457844],[109.046365,21.424421],[109.095024,21.419407],[109.138756,21.388762],[109.186183,21.390991],[109.245929,21.425536],[109.41716,21.438906],[109.484914,21.453388],[109.540964,21.466199],[109.576689,21.493487],[109.581,21.548047],[109.612413,21.556953],[109.654913,21.493487],[109.704188,21.462857],[109.785492,21.45673],[109.819369,21.445033],[109.894513,21.442248],[109.904368,21.429992],[109.868644,21.365913],[109.770709,21.359783],[109.757775,21.346963],[109.763934,21.226514],[109.674623,21.136671],[109.674007,21.067997],[109.655529,20.929435],[109.664768,20.862343],[109.711579,20.774519],[109.730057,20.719673],[109.74484,20.621124],[109.793499,20.615522],[109.813825,20.574627],[109.811977,20.541566],[109.839695,20.489439],[109.888354,20.475423],[109.895745,20.42776],[109.864948,20.40196],[109.861252,20.376717],[109.916071,20.316677],[109.909296,20.236961],[109.929006,20.211691],[109.993679,20.254368],[110.082375,20.258859],[110.118099,20.219553],[110.168606,20.219553],[110.220345,20.25156],[110.296722,20.249314],[110.349076,20.258859],[110.384185,20.293103],[110.425453,20.291419],[110.452554,20.311064],[110.491358,20.373912],[110.54125,20.42047],[110.550489,20.47262],[110.499982,20.572386],[110.487047,20.640167],[110.466105,20.680485],[110.411286,20.670966],[110.392192,20.682724],[110.407591,20.731987],[110.393424,20.816479],[110.350924,20.84165],[110.327519,20.847802],[110.269004,20.839972],[110.209874,20.860106],[110.184005,20.891979],[110.180925,20.98197],[110.204947,21.003202],[110.208642,21.050684],[110.241903,21.016051],[110.24991,21.045098],[110.296722,21.093684],[110.39096,21.124949],[110.422373,21.190807],[110.44902602101257,21.186697045051638],[110.445163,21.184669],[110.431612,21.180763],[110.43346,21.171276],[110.489511,21.138904],[110.508605,21.140579],[110.544945,21.083633],[110.582517,21.094801],[110.632409,21.210893],[110.589293,21.194713],[110.525235,21.190249],[110.499366,21.213125],[110.46671964325972,21.195986009032694],[110.501213,21.217588],[110.534474,21.204198],[110.626249,21.215915],[110.65951,21.239902],[110.713097,21.3124],[110.768531,21.364799],[110.796248,21.37483],[110.888639,21.367585],[110.929291,21.375945],[111.034617,21.438906],[111.103602,21.455616],[111.171355,21.458401],[111.28284,21.485691],[111.276065,21.443362],[111.250196,21.45116],[111.257587,21.41495],[111.28592,21.41885],[111.353058,21.464528],[111.382623,21.495714],[111.444217,21.514088],[111.494724,21.501282],[111.521825,21.517429],[111.560629,21.50518],[111.609904,21.530234],[111.650556,21.512418],[111.677658,21.529677],[111.693672,21.590345],[111.736788,21.609821],[111.794686,21.61149],[111.832258,21.578659],[111.810084,21.555283],[111.887693,21.578659],[111.941896,21.607039],[111.972692,21.603144],[112.026895,21.633744],[111.997946,21.657107],[111.954214,21.667674],[111.956062,21.710494],[112.036134,21.761637],[112.136532,21.793871],[112.192583,21.789425],[112.196894,21.736624],[112.236315,21.727173],[112.238778,21.702153],[112.353343,21.707157],[112.415553,21.734956],[112.427256,21.789981],[112.445734,21.803317],[112.497473,21.785535],[112.535661,21.753856],[112.647146,21.758302],[112.68595,21.810541],[112.792508,21.921067],[112.841167,21.920512],[112.893522,21.84443],[112.929862,21.838875],[112.989608,21.869424],[113.047507,21.956595],[113.053666,22.012089],[113.032108,22.04593],[113.045659,22.088636],[113.086927,22.12634],[113.091854,22.065344],[113.142977,22.012089],[113.1516,21.979905],[113.235368,21.887751],[113.266781,21.871646],[113.319752,21.909407],[113.330223,21.96159],[113.442324,22.009315],[113.45957,22.043711],[113.527939,22.073663],[113.567359,22.075327],[113.554425,22.107489],[113.6037,22.132438],[113.575983,22.194513],[113.558736,22.212244],[113.594461,22.228864],[113.595693,22.304186],[113.617866,22.315259],[113.604932,22.339617],[113.627721,22.349027],[113.669605,22.416539],[113.66591,22.438667],[113.624642,22.443092],[113.608627,22.408793],[113.573519,22.41156],[113.631417,22.475723],[113.668373,22.4807],[113.691779,22.514981],[113.740438,22.534329],[113.717033,22.645391],[113.678228,22.726007],[113.733663,22.736494],[113.758301,22.683496],[113.765692,22.665825],[113.803264,22.593463],[113.856851,22.539857],[113.869786,22.459685],[113.893807,22.442539],[113.952937,22.486783],[113.954785,22.491206],[113.976343,22.510558],[114.031778,22.503923],[114.000981,22.491206],[113.977575,22.45692],[113.918445,22.418199],[113.920293,22.367845],[113.951706,22.355116],[113.956633,22.359543],[113.980039,22.366185],[114.026234,22.34792],[113.955401,22.298649],[113.969568,22.321349],[113.898119,22.308615],[113.889496,22.271514],[113.8433,22.229418],[113.84946,22.191188],[113.899351,22.215568],[113.935691,22.205041],[113.981271,22.229972],[113.996669,22.206149],[114.026234,22.229418],[114.004676,22.239389],[114.02993,22.263207],[114.034857,22.300864],[114.069966,22.326885],[114.121089,22.320795],[114.145726,22.300864],[114.120473,22.272068],[114.164821,22.226648],[114.200545,22.232188],[114.203009,22.206703],[114.265835,22.200608],[114.248588,22.274837],[114.262139,22.294773],[114.284929,22.263761],[114.313262,22.264315],[114.315726,22.299203],[114.316958,22.298649],[114.316342,22.30031],[114.315726,22.299756],[114.278153,22.328546],[114.283081,22.386661],[114.322501,22.385554],[114.319421,22.382234],[114.320037,22.381127],[114.323733,22.384447],[114.356994,22.340171],[114.394566,22.361757],[114.385327,22.41156],[114.406269,22.432582],[114.406269,22.433688],[114.376088,22.436454],[114.325581,22.479041],[114.278769,22.435901],[114.220255,22.427603],[114.205473,22.449729],[114.23319,22.466875],[114.2529,22.445304],[114.340979,22.50337],[114.309566,22.497288],[114.28924,22.52272],[114.263987,22.541515],[114.263371,22.541515],[114.260291,22.547595],[114.232574,22.528801],[114.232574,22.539857],[114.294784,22.563623],[114.321885,22.587385],[114.381631,22.60175],[114.427211,22.589042],[114.472174,22.522168],[114.476486,22.459132],[114.506667,22.438667],[114.549167,22.465769],[114.611377,22.481806],[114.628623,22.513875],[114.614456,22.545384],[114.568261,22.560859],[114.559022,22.583517],[114.603369,22.638763],[114.579964,22.661407],[114.51529,22.655332],[114.567029,22.685705],[114.591666,22.690122],[114.601521,22.730975],[114.689601,22.7674],[114.709927,22.787817],[114.749963,22.764089],[114.73518,22.724351],[114.728405,22.651466],[114.743803,22.632687],[114.746267,22.581859],[114.866375,22.591805],[114.88547,22.538751],[114.922426,22.549253],[114.927969,22.621639],[114.945216,22.645391],[115.039454,22.713862],[115.02344,22.726007],[115.053621,22.747533],[115.076411,22.788368],[115.154635,22.80161],[115.190975,22.77347],[115.190359,22.818711],[115.236555,22.82533],[115.230396,22.776781],[115.319091,22.783402],[115.338185,22.776781],[115.349272,22.712206],[115.381301,22.684048],[115.430576,22.684048],[115.471844,22.697852],[115.575322,22.650914],[115.565467,22.684048],[115.609198,22.753052],[115.541445,22.755259],[115.570394,22.786713],[115.583945,22.82864],[115.654162,22.865591],[115.696046,22.84298],[115.760103,22.834707],[115.788437,22.809885],[115.796444,22.739254],[115.829089,22.734838],[115.883291,22.78561],[115.931334,22.802713],[115.965211,22.800506],[115.99724,22.826985],[116.05637,22.844635],[116.104413,22.816505],[116.14137,22.835259],[116.239304,22.921275],[116.259014,22.932298],[116.302746,22.951588],[116.382818,22.91907],[116.449955,22.936707],[116.50539,22.930645],[116.544194,22.996769],[116.576839,23.014397],[116.557129,23.056253],[116.566368,23.088738],[116.550969,23.109656],[116.566368,23.134424],[116.665534,23.158086],[116.701259,23.198248],[116.74499,23.215299],[116.806584,23.200998],[116.821367,23.240597],[116.798577,23.244996],[116.782563,23.313714],[116.871874,23.4159],[116.871258,23.416449],[116.874338,23.447199],[116.874953,23.447748],[116.895895,23.476295],[116.888504,23.501543],[116.92854,23.530079],[116.963649,23.507031],[117.01046,23.502641],[117.044953,23.539955],[117.085605,23.536663],[117.192778,23.5619],[117.291328,23.571225],[117.302415,23.550379],[117.387415,23.555317],[117.463791,23.584937],[117.454552,23.628259],[117.493357,23.642514],[117.501364,23.70445],[117.54448,23.715956],[117.601762,23.70171],[117.660276,23.789357],[117.651653,23.815093],[117.671979,23.878041],[117.691073,23.888985],[117.762522,23.886796],[117.792703,23.906494],[117.807486,23.947521],[117.864768,24.004938],[117.910347,24.012045],[117.927594,24.039922],[117.936217,24.100029],[118.000275,24.152462],[118.019369,24.197232],[118.074803,24.225615],[118.115455,24.229435],[118.158571,24.269814],[118.112376,24.357075],[118.081579,24.35653],[118.088354,24.408858],[118.048934,24.418122],[118.084042,24.528695],[118.09239571321075,24.537893355812823],[118.068644,24.463344],[118.084042,24.435559],[118.143173,24.420847],[118.19368,24.463344],[118.204151,24.504737],[118.191832,24.536861],[118.14502,24.560814],[118.09581516917014,24.541658552415488],[118.121615,24.570067],[118.150564,24.583673],[118.169042,24.559725],[118.242955,24.51236],[118.375382,24.536317],[118.363679,24.567889],[118.444367,24.614689],[118.512736,24.60816],[118.557084,24.572788],[118.558316,24.51236],[118.614366,24.521617],[118.680272,24.58204],[118.687047,24.63373],[118.661178,24.622306],[118.652554,24.653857],[118.670417,24.679962],[118.703677,24.665278],[118.778822,24.743569],[118.786213,24.77672],[118.650707,24.808774],[118.647627,24.843536],[118.702445,24.865258],[118.69875,24.848967],[118.748641,24.84245],[118.807771,24.870687],[118.834256,24.854397],[118.864437,24.887518],[118.933423,24.870687],[118.988857,24.878831],[118.987009,24.898375],[118.932807,24.906518],[118.91864,24.932569],[118.945741,24.954275],[119.014111,24.941252],[119.032589,24.961328],[119.032589,24.961871],[119.007335,24.963499],[119.004872,24.970009],[118.989473,24.973807],[119.023966,25.04377],[119.016575,25.058409],[118.974691,25.024792],[118.945126,25.028588],[118.892155,25.092558],[118.974691,25.115319],[118.951901,25.15162],[118.985162,25.168954],[118.985162,25.19495],[118.942046,25.211195],[118.940198,25.21715],[118.943278,25.221482],[118.903242,25.239347],[118.900162,25.242595],[118.919256,25.248008],[118.91556,25.256668],[118.918024,25.25721],[118.956212,25.272905],[118.996864,25.266411],[118.975307,25.237723],[118.990089,25.20199],[119.055379,25.219316],[119.074473,25.211195],[119.054147,25.168412],[119.032589,25.17437],[119.028893,25.139702],[119.06585,25.102855],[119.075705,25.099604],[119.134219,25.106107],[119.107118,25.075214],[119.119436,25.012861],[119.146538,25.056782],[119.165632,25.145661],[119.137299,25.15487],[119.108349,25.193867],[119.131755,25.223106],[119.190269,25.175995],[119.231537,25.188993],[119.26911,25.159746],[119.314689,25.190076],[119.294979,25.237182],[119.331935,25.230685],[119.380595,25.250173],[119.333167,25.287516],[119.299291,25.328634],[119.247552,25.333502],[119.240776,25.316733],[119.218603,25.368115],[119.14469,25.388121],[119.151465,25.426503],[119.191501,25.424341],[119.219834,25.468654],[119.256175,25.488643],[119.275269,25.476758],[119.26295,25.428124],[119.288204,25.410827],[119.353493,25.411908],[119.343638,25.472436],[119.359037,25.521592],[119.400921,25.493505],[119.45266,25.493505],[119.438493,25.412449],[119.463131,25.448661],[119.491464,25.443257],[119.48592,25.418935],[119.507478,25.396231],[119.486536,25.369737],[119.548746,25.365952],[119.578927,25.400556],[119.555521,25.429205],[119.577695,25.445959],[119.59063,25.398394],[119.582623,25.374063],[119.597405,25.334584],[119.649144,25.342697],[119.665159,25.3719],[119.656535,25.396772],[119.670086,25.435691],[119.622659,25.434069],[119.675014,25.468113],[119.682405,25.445959],[119.688564,25.441095],[119.773564,25.395691],[119.764325,25.433529],[119.804977,25.457847],[119.866571,25.455145],[119.864107,25.469734],[119.862875,25.474597],[119.811136,25.507009],[119.81668,25.532393],[119.861027,25.531313],[119.883817,25.546432],[119.831462,25.579905],[119.843165,25.597717],[119.790194,25.614447],[119.785883,25.66786],[119.700267,25.616606],[119.683637,25.592859],[119.716898,25.551292],[119.715666,25.51187],[119.680557,25.497827],[119.675014,25.475137],[119.634362,25.475137],[119.611572,25.519972],[119.616499,25.556691],[119.586934,25.59232],[119.534579,25.585303],[119.541355,25.6247],[119.478529,25.631715],[119.472986,25.662466],[119.543819,25.684581],[119.602949,25.68512],[119.602949,25.714779],[119.626354,25.723406],[119.628202,25.87212],[119.638057,25.889888],[119.69534,25.904424],[119.723673,26.011503],[119.700267,26.032477],[119.668854,26.026024],[119.654688,26.090002],[119.618963,26.11956],[119.60970386388662,26.15051878787737],[119.642985,26.129231],[119.665159,26.155556],[119.62697,26.173282],[119.60832969648179,26.15511344516218],[119.604181,26.168985],[119.664543,26.202282],[119.676246,26.262943],[119.7711,26.285481],[119.802513,26.268846],[119.806825,26.307479],[119.845013,26.323036],[119.862875,26.307479],[119.904143,26.308552],[119.95465,26.352534],[119.946027,26.374519],[119.893672,26.355752],[119.835774,26.434019],[119.83639,26.454381],[119.788346,26.583435],[119.740303,26.610727],[119.670086,26.618218],[119.605412,26.595744],[119.577695,26.622498],[119.619579,26.649246],[119.637441,26.703256],[119.664543,26.726243],[119.711354,26.686681],[119.833926,26.690959],[119.864107,26.671174],[119.873962,26.642827],[119.908455,26.661547],[119.899216,26.693098],[119.938636,26.747088],[119.942947,26.784492],[120.052584,26.786629],[120.061824,26.768997],[119.99407,26.720363],[119.969433,26.686681],[119.972512,26.654594],[119.949107,26.624638],[119.901679,26.624638],[119.851788,26.595209],[119.828383,26.524013],[119.867187,26.509019],[119.947875,26.56042],[119.93802,26.576478],[119.967585,26.597885],[120.007621,26.595744],[120.063671,26.627848],[120.093852,26.613938],[120.1382,26.638012],[120.110483,26.692563],[120.162222,26.717691],[120.151135,26.750829],[120.106787,26.752966],[120.136352,26.797847],[120.103707,26.794642],[120.102476,26.82669],[120.073526,26.823485],[120.042729,26.828292],[120.054432,26.863533],[120.117874,26.882751],[120.126497,26.920644],[120.130193,26.917976],[120.1807,26.920644],[120.233055,26.907837],[120.25954,26.982526],[120.279866,26.987326],[120.275554,27.027315],[120.29588,27.035845],[120.282946,27.089671],[120.391967,27.081146],[120.403054,27.10086],[120.461568,27.142407],[120.492365,27.136016],[120.545952,27.156785],[120.574901,27.234501],[120.554575,27.25206],[120.580444,27.321203],[120.665444,27.357884],[120.673451,27.420055],[120.703016,27.478475],[120.637111,27.561271],[120.634647,27.577186],[120.685154,27.622797],[120.709176,27.682699],[120.771386,27.734623],[120.797871,27.779638],[120.809574,27.775402],[120.840371,27.758986],[120.910588,27.864852],[120.942001,27.896592],[120.97403,27.887071],[121.027616,27.832574],[121.070116,27.834162],[121.107688,27.81352],[121.152036,27.815638],[121.134174,27.787051],[121.134174,27.785992],[121.13479,27.787051],[121.149572,27.801345],[121.149572,27.801875],[121.153268,27.809815],[121.152652,27.810344],[121.192072,27.822518],[121.193304,27.872259],[121.162507,27.879136],[121.162507,27.90717],[121.099681,27.895005],[121.05595,27.900294],[120.991892,27.95],[121.015298,27.981714],[121.059029,28.096338],[121.108304,28.139092],[121.121239,28.12537],[121.140949,28.031382],[121.176058,28.022401],[121.261057,28.034551],[121.299862,28.067297],[121.328195,28.134343],[121.373774,28.133287],[121.402107,28.197127],[121.45631,28.250385],[121.488955,28.301509],[121.538846,28.299401],[121.571491,28.279376],[121.580114,28.240368],[121.627541,28.251966],[121.669425,28.33312],[121.660186,28.355768],[121.634317,28.347868],[121.658954,28.392628],[121.692831,28.407368],[121.671273,28.472621],[121.646019,28.511544],[121.634317,28.562542],[121.596128,28.575156],[121.557324,28.645033],[121.540694,28.655537],[121.646019,28.682842],[121.689135,28.719062],[121.704534,28.804577],[121.687287,28.863294],[121.774751,28.863818],[121.772287,28.898404],[121.743338,28.954451],[121.711309,28.985865],[121.712541,29.028783],[121.658954,29.058606],[121.660186,29.118226],[121.616454,29.143318],[121.608447,29.168927],[121.715621,29.125022],[121.750113,29.136523],[121.767975,29.166837],[121.780294,29.10986],[121.811091,29.10986],[121.85975,29.086328],[121.884388,29.105677],[121.966308,29.052852],[121.970004,29.092604],[121.988482,29.110906],[121.986634,29.154817],[121.97905363781277,29.162492642742635],[121.976779,29.191918],[121.95383742357252,29.18802580950293],[121.948446,29.193485],[121.971851,29.193485],[121.966924,29.249894],[122.002032,29.260336],[122.000185,29.278608],[121.94475,29.28435],[121.958301,29.334448],[121.936127,29.348012],[121.937975,29.384],[121.975547,29.411113],[121.993409,29.45229],[121.973083,29.477821],[121.968772,29.515846],[121.995257,29.545007],[122.000185,29.582486],[121.966308,29.636078],[121.909641,29.650122],[121.872685,29.632437],[121.833265,29.653242],[121.937359,29.748373],[122.003264,29.762401],[122.043916,29.822647],[122.10243,29.859504],[122.143082,29.877668],[122.140003,29.901535],[122.00696,29.891678],[122.00388,29.92021],[121.971235,29.955476],[121.919497,29.920729],[121.835113,29.958068],[121.78399,29.99332],[121.721164,29.992802],[121.699606,30.007832],[121.652795,30.071037],[121.635548,30.070002],[121.561636,30.184395],[121.497578,30.258861],[121.395332,30.338435],[121.371926,30.37097],[121.328195,30.397299],[121.225333,30.404526],[121.183449,30.434458],[121.092906,30.515952],[121.058413,30.563888],[121.148956,30.599953],[121.188992,30.632916],[121.239499,30.648878],[121.274608,30.677191],[121.362071,30.679764],[121.426129,30.730192],[121.517288,30.775451],[121.601056,30.805269],[121.681128,30.818633],[121.904714,30.814007],[121.943518,30.776993],[121.968156,30.688514],[121.997105,30.658659],[122.087032,30.602014],[122.133227,30.595317],[122.075329,30.647848],[122.011271,30.66947],[121.992793,30.695204],[121.987866,30.753338],[121.970004,30.789333],[121.954605,30.825828],[121.994025,30.862823],[121.990945,30.96859],[121.977395,31.016301],[121.946598,31.066039],[121.809859,31.196669],[121.722396,31.3036],[121.599208,31.37465],[121.520984,31.394575],[121.404571,31.479337],[121.343593,31.511996],[121.371926,31.553314],[121.395332,31.585437],[121.434136,31.590535],[121.547469,31.531382],[121.625693,31.501792],[121.682976,31.491075],[121.819098,31.437987],[121.890547,31.428795],[121.981706,31.464024],[121.995873,31.493117],[121.974931,31.61704],[121.970004,31.718911],[121.889315,31.866425],[121.856055,31.955328],[121.772287,32.032984],[121.759352,32.059362],[121.525295,32.136423],[121.542542,32.152132],[121.458774,32.177462],[121.499426,32.211394],[121.493882,32.263533],[121.450151,32.282256],[121.425513,32.430885],[121.390405,32.460682],[121.352216,32.474315],[121.269681,32.483402],[121.153268,32.52933],[121.076892,32.576243],[121.020225,32.605489],[120.961711,32.612042],[120.979573,32.636236],[120.963559,32.68259],[120.916131,32.701225],[120.953088,32.714318],[120.972182,32.761134],[120.981421,32.85972],[120.957399,32.893395],[120.932762,33.005887],[120.917979,33.02596],[120.871784,33.047032],[120.874247,33.093672],[120.843451,33.209915],[120.819429,33.237951],[120.833595,33.274984],[120.813885,33.303499],[120.769538,33.307],[120.741205,33.337505],[120.717183,33.436945],[120.680227,33.520306],[120.622944,33.615051],[120.611241,33.627012],[120.583524,33.668362],[120.534249,33.782346],[120.500372,33.818152],[120.48559,33.859411],[120.367329,34.091674],[120.347619,34.179352],[120.314359,34.255563],[120.311895,34.306991],[120.103707,34.391481],[119.962657,34.459112],[119.811752,34.485754],[119.781571,34.515839],[119.641137,34.569078],[119.610956,34.592729],[119.569072,34.615389],[119.465594,34.672994],[119.525956,34.73351],[119.456971,34.748264],[119.381827,34.752198],[119.494543,34.754656],[119.497007,34.754164],[119.439725,34.785136],[119.440957,34.769406],[119.378747,34.764489],[119.312841,34.774813],[119.272189,34.797914],[119.238313,34.799388],[119.217371,34.827886],[119.202588,34.890253],[119.214907,34.925589],[119.211211,34.981507],[119.238313,35.048657],[119.285124,35.068252],[119.291899,35.028567],[119.307298,35.032977],[119.292515,35.068742],[119.306066,35.076578],[119.354109,35.080007],[119.373819,35.078538],[119.428022,35.121136],[119.397841,35.137777],[119.411392,35.231689],[119.450812,35.285443],[119.493312,35.318655],[119.538275,35.296678],[119.543819,35.347949],[119.590014,35.37284],[119.579543,35.406504],[119.618963,35.459655],[119.663311,35.562931],[119.662079,35.589215],[119.718129,35.615492],[119.75139,35.617924],[119.772332,35.578995],[119.780339,35.584835],[119.792658,35.615492],[119.824071,35.646136],[119.83023,35.620357],[119.868419,35.60868],[119.925085,35.637382],[119.91215,35.660725],[119.950339,35.729741],[119.920157,35.739943],[119.926317,35.759856],[119.958346,35.760342],[120.01378,35.714193],[120.049505,35.786562],[120.032258,35.812288],[120.064287,35.873414],[120.112331,35.885052],[120.125265,35.906868],[120.152983,35.907353],[120.207801,35.947575],[120.169613,35.888446],[120.202258,35.89184],[120.209033,35.917531],[120.265699,35.966468],[120.30512,35.971796],[120.316206,36.002304],[120.289721,36.017311],[120.285409,36.01247],[120.249069,35.992136],[120.257076,36.025055],[120.198562,35.995525],[120.234902,36.030863],[120.239214,36.062316],[120.181316,36.066669],[120.152367,36.095206],[120.116642,36.102943],[120.108635,36.127599],[120.142512,36.143549],[120.140664,36.173507],[120.181316,36.203936],[120.22012,36.209248],[120.224432,36.19138],[120.260772,36.198624],[120.263236,36.182202],[120.310047,36.185101],[120.297112,36.225664],[120.319902,36.232423],[120.362402,36.196209],[120.35809,36.174956],[120.286025,36.047317],[120.337764,36.055058],[120.429539,36.056994],[120.468959,36.087952],[120.546568,36.091821],[120.546568,36.107778],[120.593995,36.100525],[120.615553,36.120348],[120.64327,36.114547],[120.672835,36.130016],[120.712255,36.126632],[120.696857,36.15563],[120.696857,36.203936],[120.680843,36.238698],[120.686386,36.279234],[120.657437,36.276339],[120.66298,36.331803],[120.744284,36.327946],[120.694393,36.390118],[120.759683,36.46283],[120.828668,36.46668],[120.837291,36.459942],[120.858849,36.424797],[120.848994,36.403124],[120.871784,36.36699],[120.911204,36.412276],[120.917979,36.417573],[120.90874,36.450315],[120.938305,36.447908],[120.965407,36.466199],[120.95432,36.507578],[120.983269,36.546051],[120.962327,36.562877],[120.909972,36.568645],[120.884718,36.601323],[120.847146,36.618617],[120.882255,36.627262],[120.926602,36.611892],[120.955551,36.575855],[121.028848,36.572971],[121.078123,36.607568],[121.161275,36.651273],[121.251818,36.671436],[121.29863,36.702151],[121.31218,36.702151],[121.35776,36.713186],[121.400876,36.701191],[121.3941,36.738129],[121.454462,36.752515],[121.48653600138134,36.78471276929255],[121.532071,36.73621],[121.575186,36.740047],[121.556092,36.764502],[121.651563,36.723739],[121.631853,36.80093],[121.6762,36.819137],[121.726092,36.826323],[121.762432,36.84644],[121.767975,36.874691],[121.927504,36.932597],[121.965076,36.938337],[122.008808,36.96225],[122.042684,36.871819],[122.051923,36.904846],[122.093191,36.913938],[122.115981,36.94025],[122.124604,36.944077],[122.141235,36.938337],[122.119677,36.891924],[122.175727,36.894317],[122.188662,36.866073],[122.174495,36.842609],[122.220691,36.848835],[122.275509,36.83734],[122.280437,36.835904],[122.344495,36.828239],[122.378371,36.844525],[122.383915,36.865595],[122.415944,36.85937],[122.454748,36.879],[122.452284,36.88618],[122.434422,36.914416],[122.483081,36.913938],[122.48924,36.886659],[122.532356,36.901496],[122.55761,36.968467],[122.544675,37.004797],[122.583479,37.037289],[122.575472,37.054485],[122.494168,37.033945],[122.467067,37.037289],[122.478769,37.058784],[122.484313,37.128956],[122.533588,37.153286],[122.581015,37.147562],[122.573624,37.176178],[122.624131,37.190959],[122.592718,37.261485],[122.567465,37.25958],[122.573624,37.296247],[122.611196,37.339558],[122.607501,37.364296],[122.650616,37.388551],[122.6925,37.373809],[122.714058,37.392355],[122.701739,37.418501],[122.67587,37.413273],[122.641377,37.428482],[122.553914,37.407093],[122.4954,37.413748],[122.487393,37.43466],[122.41656,37.414699],[122.337103,37.414223],[122.281053,37.430858],[122.287212,37.445114],[122.25272,37.467917],[122.194205,37.456041],[122.166488,37.438937],[122.131996,37.49926],[122.163408,37.519199],[122.150474,37.557163],[122.08888,37.554316],[122.075329,37.540556],[122.017431,37.531065],[121.997721,37.494512],[121.923808,37.473142],[121.772903,37.466492],[121.66573,37.473617],[121.635548,37.494037],[121.575802,37.460317],[121.571491,37.441313],[121.477252,37.475992],[121.460006,37.522522],[121.400876,37.557638],[121.395948,37.589891],[121.435368,37.592737],[121.391021,37.625449],[121.349137,37.635403],[121.358376,37.597479],[121.304789,37.582778],[121.217326,37.582778],[121.17421,37.597479],[121.148956,37.626397],[121.161891,37.646302],[121.142797,37.661464],[121.160043,37.698882],[121.136022,37.723501],[121.037471,37.718767],[120.994356,37.759468],[120.943233,37.785486],[120.940769,37.819533],[120.874863,37.833241],[120.845298,37.826623],[120.839139,37.82426],[120.733197,37.833714],[120.656821,37.793054],[120.634031,37.796364],[120.590915,37.7642],[120.517619,37.750005],[120.454793,37.757576],[120.367945,37.697935],[120.227511,37.693673],[120.22012,37.671886],[120.269395,37.658622],[120.272475,37.636824],[120.215192,37.621183],[120.208417,37.588469],[120.246605,37.556689],[120.222584,37.532963],[120.144359,37.481691],[120.086461,37.465067],[120.064903,37.448915],[120.010085,37.442263],[119.949723,37.419927],[119.926933,37.386649],[119.843781,37.376662],[119.837006,37.346695],[119.883201,37.311004],[119.89244,37.263866],[119.865339,37.233854],[119.83023,37.225754],[119.808057,37.196203],[119.740303,37.133727],[119.698419,37.127047],[119.687332,37.143746],[119.678709,37.158056],[119.576463,37.127524],[119.489616,37.134681],[119.428022,37.125616],[119.361501,37.125616],[119.327624,37.115595],[119.301138,37.139452],[119.298675,37.197156],[119.2069,37.223371],[119.190885,37.25958],[119.204436,37.280058],[119.136683,37.230995],[119.12806,37.254816],[119.091103,37.257674],[119.084328,37.239572],[119.054147,37.254816],[119.03998,37.30434],[119.001176,37.31862],[118.942662,37.497361],[118.939582,37.527268],[118.988857,37.620709],[119.02027,37.6572],[119.080016,37.696514],[119.133603,37.705511],[119.246936,37.698409],[119.275885,37.717347],[119.275269,37.739594],[119.225378,37.752844],[119.217371,37.810077],[119.154545,37.806294],[119.12806,37.814332],[119.12806,37.847892],[119.110813,37.921577],[119.001792,37.99613],[118.974075,38.094162],[118.908169,38.139362],[118.811467,38.157717],[118.703677,38.151129],[118.626069,38.138421],[118.607591,38.129006],[118.597736,38.079088],[118.552156,38.05553],[118.534294,38.063541],[118.517048,38.088509],[118.504729,38.11394],[118.44991,38.124299],[118.431432,38.106406],[118.404331,38.121003],[118.331034,38.12524],[118.217085,38.146893],[118.177665,38.186417],[118.112376,38.210403],[118.045238,38.214165],[118.018753,38.202409],[117.896797,38.279495],[117.895565,38.301572],[117.948536,38.346644],[117.957775,38.376208],[117.937449,38.387936],[117.84629,38.368232],[117.781,38.373862],[117.730493,38.424985],[117.72495,38.457328],[117.678754,38.477008],[117.644878,38.52759],[117.68553,38.539293],[117.638102,38.54491],[117.639334,38.626776],[117.65658,38.66043],[117.729261,38.680055],[117.740964,38.700141],[117.740964,38.753833],[117.671363,38.772032],[117.646725,38.788827],[117.64611,38.828933],[117.616699,38.852881],[117.865723,39.19126],[118.976953,39.182568],[119.391113,39.75249],[120.479102,40.230957],[121.174512,40.90127],[121.834863,40.974268],[122.275,40.541846],[121.26748,39.544678],[121.818457,39.386523],[121.106738,38.920801],[121.163574,38.731641],[122.840039,39.60083],[124.362109,40.004053],[124.638281,39.615088],[124.775293,39.758057],[125.36084,39.526611],[125.168848,38.805518],[125.554492,38.68623],[124.690918,38.129199],[125.206738,38.081543],[124.98877,37.931445],[125.357813,37.724805],[125.769141,37.985352],[126.116699,37.74292],[126.633887,37.781836],[126.976855,36.939404],[126.487012,37.007471],[126.160547,36.771924],[126.487695,36.693799],[126.753027,35.871973],[126.291113,35.15415],[126.593359,34.824365],[126.264453,34.673242],[126.531445,34.314258],[127.24707,34.755127],[127.324609,34.463281],[127.714844,34.954688],[128.443945,34.870361],[128.510938,35.100977],[129.076758,35.122705],[129.419141,35.497852],[129.418262,37.059033],[128.374609,38.623438],[127.394531,39.20791],[127.568164,39.781982],[129.708691,40.857324],[129.756348,41.712256],[130.687305,42.302539],[130.709375,42.656396],[131.158301,42.626025],[131.938965,43.301953],[131.866602,43.095166],[132.30957,43.313525],[132.303809,42.883301],[133.159961,42.696973],[135.131055,43.525732],[137.685449,45.818359],[140.170605,48.523682],[140.520898,50.800195],[141.485254,52.178516],[140.839648,53.087891],[141.18125,53.015283],[141.37373,53.292773],[139.707422,54.277148],[138.657227,54.29834],[138.450684,53.537012],[138.52793,53.959863],[137.950488,53.603564],[137.253711,53.546143],[137.834766,53.946729],[137.339258,54.100537],[137.666016,54.283301],[137.141602,54.182227],[137.155371,53.82168],[136.718848,53.804102],[136.797266,54.620996],[135.851562,54.583936],[135.2625,54.943311],[137.691504,56.139355],[142.580273,59.240137],[145.55459,59.413525],[146.049512,59.170557],[146.537207,59.456982],[148.72666,59.25791],[148.79707,59.532324],[149.642578,59.77041],[152.260645,59.223584],[151.121094,59.08252],[151.326758,58.875098],[152.817871,58.92627],[153.361133,59.214795],[155.160449,59.190137],[154.971289,59.449609],[154.149805,59.528516],[154.293066,59.83335],[157.08418,61.675684],[160.309375,61.894385],[159.79043,60.956641],[160.378906,61.025488],[160.173633,60.638428],[162.392578,61.662109],[163.085254,61.570557],[163.331738,62.550928],[164.418359,62.704639],[165.417383,62.44707],[164.207227,62.292236],[163.709961,60.916797],[162.068164,60.466406],[158.275195,58.008984],[156.829883,57.779639],[156.848828,57.290186],[155.98252,56.695215],[155.620312,54.864551],[156.847461,51.006592],[158.103516,51.809619],[158.47207,53.032373],[160.025098,53.12959],[160.074414,54.18916],[162.105566,54.752148],[161.723926,55.496143],[162.084961,56.089648],[162.671484,56.490088],[163.038379,56.521875],[162.628125,56.232275],[162.840332,56.065625],[163.335547,56.23252],[163.256543,56.688037],[162.791113,56.875391],[163.225781,57.790381],[162.654297,57.948242],[162.391406,57.717236],[161.960059,58.076904],[163.743848,60.028027],[164.953711,59.843604],[166.352148,60.484814],[166.273047,59.85625],[167.226758,60.406299],[169.226758,60.595947],[170.350977,59.965527],[170.608203,60.434912],[172.856543,61.469189],[177.159473,62.560986],[177.023535,62.777246],[179.120703,62.320361],[179.570508,62.6875],[178.44043,63.605566],[178.381445,64.260889],[177.6875,64.304736],[177.427441,64.763379],[176.140918,64.58584],[176.056543,64.904736],[174.548828,64.683887],[176.061133,64.960889],[177.06875,64.78667],[177.037305,64.999658],[176.341016,65.047314],[176.880859,65.081934],[178.519531,64.602979],[180,65.067236],[180,68.983447],[179.272656,69.259668],[175.921484,69.895312],[173.277441,69.823828],[170.486816,70.107568],[170.160938,69.626562],[170.99541,69.045312],[169.609863,68.786035],[167.856836,69.728223],[166.820312,69.499561],[163.201367,69.714746],[161.536914,69.379541],[161.565625,68.905176],[160.856055,68.53833],[161.309863,68.982275],[160.910742,69.606348],[159.729395,69.870215],[160.006445,70.309668],[159.350684,70.790723],[156.68457,71.09375],[152.508789,70.834473],[151.582422,71.286963],[150.097656,71.226562],[150.599805,71.520117],[148.968164,71.690479],[150.016895,71.895654],[149.501563,72.164307],[147.261816,72.327881],[146.073242,71.80835],[145.188574,71.695801],[145.758594,72.225879],[146.113281,71.944971],[146.831836,72.29541],[144.294922,72.192627],[146.25293,72.442236],[140.808203,72.890967],[141.079297,72.586914],[139.14082,72.329736],[140.187695,72.191309],[139.359277,71.951367],[139.98418,71.491504],[138.23418,71.596338],[137.939648,71.133398],[136.090332,71.61958],[133.688867,71.434229],[132.653906,71.925977],[131.021582,70.746094],[129.761914,71.119531],[128.843262,71.663477],[129.210254,71.916943],[128.911426,71.755322],[127.841406,72.308252],[129.410645,72.166309],[128.418262,72.535156],[129.250391,72.705176],[128.599023,72.895166],[129.100586,73.112354],[127.740332,73.481543],[126.552539,73.334912],[124.541211,73.75127],[123.491113,73.666357],[123.622266,73.193262],[122.260156,72.880566],[119.750391,72.979102],[118.430273,73.246533],[118.870898,73.537891],[115.337695,73.702588],[113.510352,73.50498],[113.664551,72.634521],[113.032813,73.913867],[112.147266,73.708936],[111.550586,74.028516],[110.261426,74.017432],[109.706738,73.74375],[110.868164,73.730713],[109.855273,73.472461],[105.143945,72.777051],[112.924902,75.015039],[113.726172,75.450635],[112.453027,75.830176],[113.567578,75.568408],[113.272656,76.25166],[112.65625,76.053564],[111.39248,76.68667],[106.413574,76.512256],[107.429785,76.926562],[104.202441,77.101807],[106.05957,77.390527],[104.014551,77.73042],[100.989941,76.990479],[101.597754,76.439209],[98.805664,76.480664],[99.540723,75.798584],[98.662012,76.242676],[96.49707,75.891211],[95.65332,75.892188],[95.578711,76.137305],[93.259277,76.098779],[92.89043,75.909961],[94.075195,75.912891],[87.005957,75.169824],[87.041797,74.778857],[85.791016,74.645117],[87.229688,74.363867],[86.001367,74.316016],[87.571191,73.810742],[85.938965,73.456494],[86.677051,73.106787],[85.792578,73.43833],[86.892969,73.887109],[80.583203,73.568457],[80.827051,72.488281],[83.534375,71.683936],[83.15127,71.103613],[83.735938,70.546484],[83.080762,70.093018],[82.869141,70.954834],[82.221191,70.395703],[82.163184,70.598145],[83.233594,71.668164],[81.661621,71.715967],[79.42207,72.380762],[77.471582,72.192139],[78.232422,71.952295],[77.777539,71.836426],[76.871387,72.033008],[76.032422,71.9104],[76.433398,71.55249],[78.942187,70.933789],[75.332031,71.341748],[75.741406,72.29624],[75.152441,72.852734],[74.992188,72.144824],[73.08623,71.444922],[74.343359,70.578711],[73.578125,69.802979],[73.836035,69.143213],[76.000977,69.235059],[77.650684,68.903027],[77.588281,67.751904],[78.922461,67.589111],[77.174414,67.778516],[77.238477,68.46958],[76.10752,68.975732],[74.57959,68.751221],[74.769531,67.766357],[72.321582,66.332129],[70.339453,66.342383],[69.194336,66.578662],[69.217773,66.828613],[70.690723,66.745312],[70.724902,66.519434],[71.539551,66.683105],[71.365234,66.961523],[73.066797,67.766943],[73.591699,68.481885],[72.576758,68.968701],[72.704492,70.963232],[71.867285,71.457373],[72.812109,72.691406],[69.611816,72.981934],[68.269238,71.682812],[66.639648,71.081396],[67.284766,70.738721],[66.89668,69.553809],[67.624121,69.584424],[68.542773,68.96709],[69.140527,68.950635],[68.371191,68.314258],[64.19043,69.534668],[60.909082,69.847119],[60.170605,69.590918],[60.933594,68.986768],[59.725684,68.351611],[59.099023,68.444336],[59.057324,69.006055],[57.126855,68.554004],[55.418066,68.567822],[54.861328,68.201855],[53.260547,68.26748],[53.930859,68.435547],[53.797656,68.907471],[54.491211,68.992334],[53.801953,68.995898],[52.344043,68.608154],[52.39668,68.351709],[51.994727,68.53877],[48.754297,67.895947],[48.833203,67.681494],[47.874707,67.58418],[47.655859,66.975928],[46.492383,66.800195],[44.902148,67.413135],[45.528711,67.757568],[46.69043,67.848828],[45.891992,68.479688],[43.333203,68.673389],[44.204688,68.25376],[44.104395,66.008594],[42.210547,66.519678],[39.816504,65.597949],[40.444922,64.778711],[39.758008,64.577051],[36.882812,65.172363],[36.624219,64.750537],[38.062207,64.091016],[37.442188,63.813379],[35.035352,64.440234],[34.406445,65.395752],[34.691797,65.951855],[31.895313,67.161426],[34.482617,66.550342],[38.653906,66.069043],[40.10332,66.299951],[41.188965,66.826172],[40.966406,67.713477],[35.85791,69.191748],[33.684375,69.310254],[33.141211,69.068701],[33.454297,69.428174],[32.377734,69.479102],[32.176758,69.674023],[33.007812,69.722119],[31.98457,69.953662],[31.546973,69.696924],[30.869727,69.783447],[29.79209,69.727881],[28.804297,70.092529],[30.944141,70.274414],[30.065137,70.702979],[28.831543,70.863965],[28.192969,70.248584],[28.392285,70.975293],[27.59707,71.091309],[26.989355,70.511377],[26.585059,70.41001],[26.661328,70.939746],[25.043848,70.109033],[25.768164,70.853174],[24.658008,71.001025],[23.353906,69.983398],[22.68457,70.374756],[21.355762,70.233398],[21.974707,69.83457],[20.62207,69.913916],[20.739453,69.520508],[20.054492,69.332666],[20.324219,69.945312],[19.641504,69.424023],[19.722461,69.781641],[19.197266,69.747852],[18.915918,69.335596],[18.259766,69.470605],[18.101465,69.156299],[16.514355,68.532568],[17.552832,68.42627],[16.203809,68.316748],[16.312305,67.881445],[16.00791,68.228711],[14.798926,67.809326],[15.594434,67.348535],[14.961914,67.574268],[14.441699,67.271387],[15.415723,67.202441],[14.108789,67.119238],[13.211426,66.64082],[13.118848,66.230664],[14.03418,66.297559],[12.783789,66.100439],[12.133887,65.27915],[12.915527,65.339258],[11.489355,64.97583],[9.567285,63.706152],[10.055078,63.512695],[11.306641,64.048877],[11.370703,63.804834],[10.020996,63.39082],[9.696875,63.624561],[9.156055,63.459326],[8.576172,63.601172],[8.158008,63.161523],[8.623145,62.84624],[7.571875,63.099512],[6.734961,62.720703],[8.045508,62.77124],[7.653125,62.564014],[6.35293,62.611133],[6.136133,62.407471],[6.580078,62.407275],[5.143164,62.159912],[5.266895,61.935596],[6.730762,61.869775],[4.930078,61.87832],[5.106738,61.187549],[7.173535,61.165967],[7.442578,61.434619],[7.604492,61.210547],[7.038672,60.95293],[6.777832,61.142432],[5.008594,61.038184],[5.11582,60.635986],[5.64834,60.687988],[5.137109,60.445605],[5.688574,60.123193],[5.205664,60.087939],[5.145801,59.638818],[6.15332,60.34624],[6.995703,60.511963],[5.730469,59.863086],[6.216602,59.818359],[5.242188,59.564307],[5.173242,59.162549],[6.415332,59.547119],[5.88916,59.097949],[6.363281,59.000928],[5.555566,58.975195],[5.706836,58.523633],[7.004883,58.024219],[8.166113,58.145312],[9.557227,59.112695],[10.179395,59.009277],[10.595312,59.764551],[10.834473,59.183936],[11.388281,59.036523],[11.248242,58.369141],[12.883691,56.617725],[12.80166,56.263916],[12.471191,56.290527],[12.88584,55.411377],[14.17373,55.396631],[14.401953,55.976758],[15.82666,56.124951],[16.34873,56.709277],[16.923828,58.492578],[16.214258,58.63667],[18.285352,59.109375],[18.560254,59.394482],[17.964258,59.359375],[18.970508,59.757227],[17.955762,60.589795],[17.250977,60.700781],[17.410254,62.508398],[20.762695,63.867822],[21.519629,64.463086],[21.410352,65.317432],[22.400977,65.862109],[24.155469,65.805273],[24.628027,65.85918],[25.347852,65.479248],[25.288184,64.860352],[24.55791,64.801025],[21.143848,62.73999],[21.436035,60.596387],[22.584961,60.380566],[22.462695,60.029199],[22.911719,60.209717],[23.021289,59.816016],[25.758008,60.267529],[26.569336,60.624561],[26.534668,60.412891],[27.797656,60.536133],[28.512793,60.677295],[29.069141,60.191455],[30.172656,59.957129],[28.058008,59.781543],[28.0125,59.484277],[25.509277,59.639014],[23.494434,59.195654],[23.767578,58.36084],[24.529102,58.354248],[24.322559,57.870605],[24.382617,57.250049],[23.647754,56.971045],[22.55459,57.724268],[21.728711,57.570996],[21.071289,56.82373],[21.046094,56.070068],[21.235742,55.264111],[20.995898,54.902686],[20.594824,54.982373],[20.957813,55.278906],[21.114844,55.616504],[20.899805,55.28667],[19.604395,54.45918],[18.836426,54.36958],[18.43623,54.744727],[18.759277,54.68457],[18.323438,54.838184],[17.842969,54.816699],[14.211426,53.950342],[13.827734,54.127246],[14.213672,53.870752],[14.583496,53.639355],[14.258887,53.729639],[12.575391,54.467383],[11.399609,53.944629],[10.85459,54.009814],[11.013379,54.37915],[9.868652,54.472461],[9.739746,54.825537],[9.591113,55.493213],[10.926172,56.443262],[10.282715,56.620508],[10.609961,57.736914],[8.284082,56.852344],[8.468359,56.664551],[9.254883,57.011719],[8.67168,56.495654],[8.163965,56.606885],[8.132129,55.599805],[8.615918,55.418213],[8.670313,54.903418],[8.92041,53.965332],[9.783984,53.554639],[8.618945,53.875],[8.495215,53.394238],[8.009277,53.690723],[7.285254,53.681348],[7.197266,53.282275],[6.062207,53.40708],[4.76875,52.941309],[3.946875,51.810547],[4.274121,51.471631],[3.448926,51.540771],[4.226172,51.386475],[3.350098,51.377686],[2.524902,51.097119],[1.672266,50.88501],[1.592773,50.252197],[.186719,49.703027],[.416895,49.448389],[-1.138525,49.387891],[-1.258643,49.680176],[-1.856445,49.683789],[-1.376465,48.652588],[-2.692334,48.536816],[-3.231445,48.84082],[-4.7625,48.450244],[-4.241406,48.303662],[-4.678809,48.039502],[-4.312109,47.8229],[-1.742529,47.215967],[-2.19707,47.162939],[-2.059375,46.810303],[-1.146289,46.311377],[-1.195996,45.714453],[-.548486,45.000586],[-1.081006,45.532422],[-1.076953,44.689844],[-1.484863,43.56377],[-1.794043,43.407324],[-4.523047,43.415723],[-8.004687,43.694385],[-9.178076,43.174023],[-8.777148,41.941064],[-8.684619,40.752539],[-9.479736,38.798779],[-9.356738,38.6979],[-9.135791,38.742773],[-8.791602,39.078174],[-9.021484,38.746875],[-9.250391,38.656738],[-9.213281,38.448096],[-8.798877,38.518164],[-8.668311,38.424316],[-8.881104,38.44668],[-8.81416,37.430811],[-8.997803,37.032275],[-7.406152,37.179443],[-6.86377,37.278906],[-6.216797,36.913574],[-6.384131,36.637012],[-5.625488,36.025928],[-4.366846,36.718115],[-2.111523,36.77666],[-1.640967,37.386963],[-.721582,37.631055],[-.520801,38.317285],[.201563,38.75918],[-.327002,39.519873],[.891113,40.722363],[.714648,40.822852],[3.004883,41.767432],[3.211426,42.431152],[3.051758,42.915137],[3.91084,43.563086],[6.115918,43.072363],[7.377734,43.731738],[7.438672,43.750439],[7.493164,43.767139],[8.76582,44.422314],[10.188086,43.94751],[10.514844,42.967529],[11.141211,42.389893],[15.692773,39.990186],[16.209961,38.941113],[15.645801,38.034229],[16.056836,37.941846],[16.616699,38.800146],[17.174609,38.998096],[17.114551,39.380615],[16.521875,39.747559],[16.928223,40.458057],[17.865039,40.280176],[18.34375,39.821387],[18.460645,40.221045],[15.900488,41.512061],[16.164648,41.896191],[15.16875,41.934033],[14.540723,42.244287],[13.56416,43.571289],[12.396289,44.223877],[12.274316,45.446045],[13.206348,45.771387],[13.719824,45.587598],[13.57793,45.516895],[13.860742,44.837402],[14.550488,45.297705],[15.470996,44.271973],[15.18584,44.172119],[15.985547,43.519775],[16.903125,43.392432],[17.585156,42.938379],[17.667578,42.897119],[17.04541,43.014893],[18.51748,42.43291],[19.342383,41.869092],[19.575684,41.64043],[19.322266,40.40708],[20.00127,39.709424],[20.713379,39.035156],[21.118359,39.02998],[20.768555,38.874414],[21.182617,38.345557],[22.42168,38.438525],[23.148926,38.176074],[22.920313,37.958301],[21.824707,38.328125],[21.124707,37.891602],[21.678906,37.387207],[21.58291,37.080957],[21.892383,36.737305],[22.080469,37.028955],[22.427734,36.475781],[22.717188,36.793945],[23.160156,36.448096],[22.725391,37.542139],[23.489258,37.440186],[23.036328,37.878369],[23.501758,38.034863],[24.019727,37.677734],[24.024512,38.139795],[22.569141,38.86748],[23.066699,39.037939],[22.921387,39.306348],[23.327734,39.174902],[22.592188,40.036914],[22.629492,40.495557],[22.922266,40.590869],[23.627344,39.924072],[23.42627,40.263965],[23.94707,39.965576],[23.72793,40.329736],[24.343359,40.147705],[23.762793,40.747803],[25.104492,40.994727],[26.038965,40.726758],[26.79209,40.626611],[26.202734,40.075391],[27.499414,40.973145],[28.95625,41.008203],[29.057227,41.229736],[28.197852,41.554492],[28.014453,41.969043],[27.484766,42.468066],[28.585352,43.742236],[28.891504,44.918652],[29.55752,44.843408],[29.705859,45.259912],[29.628418,45.722461],[30.219043,45.866748],[30.796289,46.552002],[31.563379,46.777295],[31.872852,46.649756],[31.75918,47.212842],[32.044336,46.64248],[32.578027,46.615625],[31.554883,46.554297],[32.008496,46.42998],[31.83125,46.281689],[33.594141,46.09624],[32.508008,45.403809],[33.555176,45.097656],[33.450684,44.553662],[33.755664,44.398926],[35.472559,45.098486],[36.393359,45.065381],[36.575,45.393555],[35.45752,45.316309],[35.001674,45.733383],[34.849609,46.189893],[35.230371,46.440625],[35.014551,46.106006],[35.827148,46.624316],[38.214355,47.091455],[39.02373,47.272217],[39.293457,47.105762],[38.500977,46.663672],[37.766504,46.636133],[38.492285,46.090527],[37.933105,46.001709],[37.647168,45.377197],[36.865918,45.427051],[36.627637,45.151318],[38.717285,44.288086],[39.97832,43.419824],[41.48877,42.659326],[41.762988,41.97002],[41.510059,41.51748],[40.265234,40.961328],[39.426367,41.106445],[38.381055,40.924512],[36.405371,41.274609],[36.051758,41.682568],[35.297754,41.728516],[35.006445,42.063281],[33.381348,42.017578],[31.254883,41.107617],[29.148145,41.221045],[29.113867,40.937842],[29.849219,40.760107],[28.958008,40.630566],[29.007129,40.389746],[26.738086,40.400244],[26.181348,39.990088],[26.113086,39.467383],[26.899219,39.549658],[26.681836,39.292236],[27.013672,38.886865],[26.763672,38.709619],[27.144238,38.451953],[26.674219,38.335742],[26.441309,38.641211],[26.290723,38.277197],[27.232422,37.978662],[27.067969,37.65791],[27.535059,37.163867],[27.262988,36.976562],[28.242383,37.029053],[27.453906,36.712158],[28.969629,36.715332],[29.689062,36.156689],[30.446094,36.269873],[30.644043,36.865674],[31.240625,36.821729],[32.794824,36.035889],[33.694727,36.181982],[34.703613,36.816797],[35.393164,36.575195],[36.048926,36.910596],[35.892676,35.916553],[35.97627,34.629199],[35.108594,33.083691],[34.477344,31.584863],[34.198145,31.322607],[32.60332,31.06875],[32.216211,31.29375],[32.101758,31.092822],[31.771094,31.292578],[31.892188,31.482471],[32.136035,31.341064],[31.888965,31.541406],[31.08291,31.60332],[29.07207,30.830273],[25.150488,31.65498],[24.878516,31.984277],[23.286328,32.213818],[23.090625,32.61875],[21.635938,32.937305],[20.121484,32.21875],[19.926367,31.817529],[20.111523,30.963721],[19.713281,30.488379],[19.12373,30.266113],[17.830469,30.927588],[15.705957,31.426416],[15.176563,32.391162],[13.283496,32.914648],[12.279883,32.858545],[11.50459,33.181934],[10.049023,34.056299],[11.120117,35.240283],[10.476562,36.175146],[11.053906,37.07251],[10.412305,36.731836],[10.196387,37.205859],[9.830273,37.135352],[9.687988,37.340381],[8.576563,36.937207],[6.486523,37.085742],[5.29541,36.648242],[4.758105,36.896338],[3.779004,36.896191],[1.257227,36.51958],[-.048242,35.832812],[-2.1465622685019294,35.12871667945419],[-2.169914,35.168396],[-2.604306,35.179093],[-3.640057,35.399855],[-4.039146048776526,35.175892665789945],[-4.782307393482333,35.20229696341822],[-5.148889433077334,35.500966765814304],[-5.429531094668953,35.9295233146618],[-5.929994,35.759988],[-6.244342,35.145865],[-6.912544,34.110476],[-7.654178,33.697065],[-8.657476,33.240245],[-9.300693,32.564679],[-9.434793,32.038096],[-9.814718,31.177736],[-9.877355699072067,30.68629166460741],[-9.597180971168186,30.361220316713258],[-9.672623943461721,30.09108819372929],[-9.780379071750275,29.941745053973325],[-10.038966086024871,29.633046940055145],[-10.103602699450102,29.454898410008525],[-10.448325113547368,29.116531380159252],[-10.68530154742217,28.928086751556595],[-11.083839007148903,28.7204185147544],[-11.23461048737026,28.578599604074313],[-11.35306993341981,28.47448285215847],[-11.460737490605299,28.3228644817722],[-11.891536871394049,28.190028431990328],[-12.042289728487292,28.09504872142759],[-12.289986640984635,28.02851474866666],[-12.429995970729847,28.009497893074816],[-12.656169236015813,27.99047811642588],[-12.892993098086,27.97153026914642],[-13.011387013729953,27.84780427128572],[-13.173567497206768,27.677418664518154],[-13.559827491157638,26.73785838401752],[-14.291724260856041,26.391254579995923],[-14.560670683302268,26.149971745427454],[-14.871884296608592,25.141159522975073],[-14.907057383633063,24.6510461772376],[-15.58534126327849,24.17051806327689],[-16.02652962864312,23.589636595830388],[-16.499413299541665,22.291199058977963],[-16.843810765324722,22.161709738893574],[-17.11358075705762,20.828306801004423],[-16.988524458207397,21.179056133390134],[-17.048047,20.806152],[-16.92793,21.114795],[-16.210449,20.22793],[-16.514453,19.361963],[-16.213086,19.00332],[-16.030322,17.887939],[-16.535254,15.838379],[-17.147168,14.922021],[-17.535645,14.755127]],[[-13.073550441778853,22.866164996749216],[-12.874222,23.284832],[-12.677519301851715,23.39199449358867],[-12.076462070870914,23.437210427501725],[-13.073550441778853,22.866164996749216]],[[-11.966358134622416,25.99541146822568],[-11.966167546427405,26.00441694767847],[-8.682259927530346,26.033344752435514],[-8.682227,25.995508],[-11.966358134622416,25.99541146822568]],[[-8.6844,27.395744],[-8.68335,27.406297110085074],[-8.68335,27.28979357242441],[-8.6844,27.395744]],[[-8.674116,28.841289],[-7.95635489478496,29.169277016643434],[-8.67304874755875,28.692972329897337],[-8.674116,28.841289]],[[-7.3813633568509465,29.4320250713144],[-7.059228,29.579228],[-6.557158925863941,29.655887105255452],[-7.3813633568509465,29.4320250713144]],[[-3.687000096846229,30.956273545366393],[-3.6825615877315983,31.03279392621878],[-3.666797,30.964014],[-3.687000096846229,30.956273545366393]],[[-2.6408307022175985,32.07453980488804],[-2.616605,32.094346],[-1.307899,32.262889],[-1.153485348238215,32.59019140158135],[-1.065527,32.468311],[-1.225928,32.107227],[-2.6408307022175985,32.07453980488804]],[[-2.0484189258141985,34.961951266180016],[-1.795605,34.751904],[-1.726220069144104,33.89760017615008],[-1.733455,33.919713],[-1.792986,34.527919],[-2.0484189258141985,34.961951266180016]],[[-1.4186953374524551,32.95768238607865],[-1.2996522739152434,32.79272912490445],[-1.388049,32.864015],[-1.4186953374524551,32.95768238607865]],[[35.816125,33.361879],[35.840723,33.415674],[35.869141,33.431738],[35.816125,33.361879]],[[46.707227,44.50332],[47.463281,45.679688],[48.72959,45.896826],[49.232227,46.337158],[51.178027,47.110156],[52.138281,46.828613],[52.483203,46.990674],[53.069434,46.856055],[53.135254,46.19165],[52.773828,45.572754],[53.200391,45.331982],[51.415723,45.357861],[51.009375,44.921826],[51.543555,44.531006],[50.409473,44.624023],[50.25293,44.461523],[50.830762,44.192773],[51.29541,43.174121],[52.596582,42.760156],[52.493848,41.780371],[52.850391,41.200293],[52.97002,41.976221],[53.804688,42.117627],[54.703711,41.071143],[54.377344,40.693262],[53.87002,40.648682],[52.943457,41.038086],[52.733691,40.39873],[53.035547,39.774414],[52.9875,39.987598],[53.487305,39.909375],[53.603125,39.546973],[53.235645,39.608545],[53.156641,39.26499],[53.70459,39.20957],[53.868652,38.949268],[53.91416,37.343555],[53.970117,36.818311],[52.190137,36.621729],[51.118555,36.742578],[50.130469,37.407129],[49.171191,37.600586],[48.86875,38.435498],[49.551172,40.194141],[50.365918,40.279492],[49.456738,40.799854],[48.572852,41.844482],[47.463184,43.035059],[47.646484,43.884619],[47.462793,43.555029],[47.307031,44.103125],[46.707227,44.50332]],[[121.48923850365568,36.78742570004626],[121.496962,36.795179],[121.506817,36.803805],[121.565331,36.830635],[121.548701,36.807638],[121.48923850365568,36.78742570004626]]],[[[-17.190869,32.868604],[-17.018262,32.662793],[-16.693262,32.758008],[-17.190869,32.868604]]],[[[-16.905322,28.3396],[-16.658008,28.007178],[-16.334473,28.379932],[-16.123633,28.575977],[-16.905322,28.3396]]],[[[-15.710303,27.784082],[-15.436768,27.810693],[-15.400586,28.147363],[-15.682764,28.154053],[-15.710303,27.784082]]],[[[-14.491797,28.100928],[-14.196777,28.169287],[-13.928027,28.253467],[-13.857227,28.738037],[-14.491797,28.100928]]],[[[-12.951611,7.57085],[-12.526074,7.436328],[-12.615234,7.637207],[-12.951611,7.57085]]],[[[-10.356689,52.206934],[-9.909668,52.122949],[-10.341064,51.798926],[-9.598828,51.874414],[-10.120752,51.600684],[-8.813428,51.584912],[-8.40918,51.88877],[-6.325,52.24668],[-6.027393,52.9271],[-6.218018,54.088721],[-5.47041,54.500195],[-6.035791,55.144531],[-7.218652,55.091992],[-6.96167,55.237891],[-7.308789,55.36582],[-7.65874,54.970947],[-7.66709,55.256494],[-8.274609,55.146289],[-8.763916,54.681201],[-8.133447,54.64082],[-8.545557,54.241211],[-10.056396,54.257812],[-9.578223,53.80542],[-10.09126,53.412842],[-8.930127,53.20708],[-9.916602,52.569727],[-8.783447,52.679639],[-10.356689,52.206934]]],[[[-7.172168,62.285596],[-6.725195,61.951465],[-6.631055,62.227881],[-7.172168,62.285596]]],[[[-7.085254,58.182178],[-6.983105,57.75],[-6.198682,58.363281],[-7.085254,58.182178]]],[[[-6.761133,57.442383],[-5.949072,57.045166],[-5.672461,57.252686],[-6.135547,57.314258],[-6.144727,57.50498],[-6.305957,57.671973],[-6.761133,57.442383]]],[[[-6.313428,56.293652],[-5.777881,56.344336],[-6.286328,56.611865],[-6.313428,56.293652]]],[[[-6.132764,56.718018],[-5.652441,56.531982],[-5.188379,56.758057],[-5.768213,55.362646],[-4.996973,56.23335],[-5.228223,55.886328],[-4.800293,56.15835],[-4.584082,55.938672],[-5.135498,54.85752],[-4.91123,54.689453],[-3.03623,54.953076],[-3.592041,54.564355],[-3.165967,54.12793],[-2.867578,54.177246],[-3.0646,53.512842],[-2.749512,53.310205],[-4.268555,53.144531],[-4.683057,52.806152],[-4.101465,52.915479],[-4.149365,52.32627],[-5.262305,51.880176],[-3.562354,51.413818],[-2.667676,51.622998],[-2.433057,51.740723],[-3.135986,51.205029],[-4.188184,51.188525],[-5.622119,50.050684],[-4.19458,50.393311],[-3.679785,50.239941],[-2.999414,50.716602],[-2.03584,50.603076],[-1.416455,50.896875],[.205078,50.763037],[.960156,50.925879],[1.414941,51.363281],[.424512,51.465625],[1.274414,51.845361],[1.743359,52.578516],[1.271289,52.924561],[.045898,52.905615],[.270996,53.335498],[-.659912,53.724023],[.115332,53.609277],[-.084375,54.118066],[-1.232422,54.703711],[-1.655371,55.570361],[-2.599316,56.027295],[-3.789062,56.095215],[-2.674268,56.253418],[-3.309961,56.363477],[-2.592676,56.561572],[-1.77793,57.49375],[-2.074072,57.702393],[-4.134521,57.577734],[-3.053076,58.634814],[-4.924658,58.588379],[-5.413184,58.069727],[-5.157227,57.881348],[-5.744922,57.668311],[-5.561914,57.232715],[-5.730615,56.853076],[-6.132764,56.718018]]],[[[-5.78252,-16.004004],[-5.692139,-15.997754],[-5.707861,-15.906152],[-5.78252,-16.004004]]],[[[-4.785352,54.073047],[-4.412061,54.185352],[-4.424707,54.407178],[-4.785352,54.073047]]],[[[-4.567871,53.386475],[-4.373047,53.13418],[-4.196777,53.321436],[-4.567871,53.386475]]],[[[-3.310352,59.130811],[-2.793018,58.906934],[-3.057422,59.029639],[-3.310352,59.130811]]],[[[-2.639014,49.450928],[-2.547363,49.428711],[-2.512305,49.494531],[-2.639014,49.450928]]],[[[-2.23584,49.176367],[-2.018652,49.23125],[-2.220508,49.266357],[-2.23584,49.176367]]],[[[-1.66377,60.28252],[-1.299463,59.878662],[-1.308105,60.5375],[-1.66377,60.28252]]],[[[1.22334,38.903857],[1.445215,38.918701],[1.564453,39.121045],[1.22334,38.903857]]],[[[2.37002,39.57207],[3.072852,39.30127],[3.461816,39.697754],[3.145313,39.790088],[3.158691,39.970508],[2.37002,39.57207]]],[[[6.468164,.227344],[6.659961,.120654],[6.686914,.404395],[6.468164,.227344]]],[[[8.224219,40.91333],[8.648535,38.926562],[9.056348,39.23916],[9.5625,39.166016],[9.632031,40.882031],[9.228418,41.25708],[8.571875,40.850195],[8.224219,40.91333]]],[[[8.474902,3.264648],[8.704004,3.223633],[8.946094,3.627539],[8.735742,3.758301],[8.474902,3.264648]]],[[[8.565625,42.357715],[8.80752,41.588379],[9.186133,41.384912],[9.550684,42.129736],[9.480371,42.80542],[9.363184,43.017383],[9.313379,42.713184],[8.565625,42.357715]]],[[[9.860645,55.515479],[9.98877,55.163184],[10.785254,55.133398],[10.645117,55.609814],[9.860645,55.515479]]],[[[10.737598,79.520166],[13.150195,78.2375],[14.638281,78.4146],[14.689258,78.720947],[15.417383,78.473242],[16.782617,78.663623],[17.00293,78.369385],[13.680566,78.028125],[14.089941,77.771387],[16.914062,77.897998],[13.995703,77.508203],[16.700488,76.579297],[19.676758,78.60957],[21.38877,78.74043],[18.677832,79.261719],[18.397363,79.605176],[17.66875,79.385938],[16.786719,79.906738],[16.245703,80.049463],[16.34375,78.976123],[14.593652,79.79873],[14.02959,79.344141],[12.555371,79.569482],[13.692871,79.860986],[10.804004,79.798779],[10.737598,79.520166]]],[[[10.978906,55.721533],[11.862305,54.772607],[12.56875,55.785059],[12.218945,56.118652],[11.819727,55.697656],[11.627734,55.956885],[10.978906,55.721533]]],[[[11.035547,54.773096],[11.765918,54.679443],[11.361426,54.89165],[11.035547,54.773096]]],[[[12.435547,37.819775],[15.112598,36.687842],[15.295703,37.055176],[15.099512,37.458594],[15.576563,38.220312],[13.788867,37.981201],[12.734375,38.183057],[12.435547,37.819775]]],[[[13.190039,54.325635],[13.70918,54.382715],[13.336816,54.697119],[13.190039,54.325635]]],[[[14.25752,68.190771],[15.975293,68.40249],[16.328906,68.876318],[15.760352,68.56123],[16.048047,69.302051],[15.412598,68.61582],[14.25752,68.190771]]],[[[14.35127,35.978418],[14.436426,35.82168],[14.566211,35.852734],[14.35127,35.978418]]],[[[14.404688,68.663232],[15.22207,68.616309],[15.207129,68.943115],[14.404688,68.663232]]],[[[14.450391,45.079199],[14.810254,44.977051],[14.571094,45.224756],[14.450391,45.079199]]],[[[17.08252,69.013672],[17.950684,69.198145],[17.503027,69.59624],[17.08252,69.013672]]],[[[17.916895,80.143115],[18.725,79.760742],[20.784082,79.748584],[20.128223,79.4896],[23.947754,79.194287],[25.641211,79.403027],[26.86084,80.16001],[24.297559,80.3604],[23.114551,80.186963],[23.008008,80.473975],[22.289746,80.049219],[20.897852,80.249951],[19.733301,80.477832],[19.343359,80.116406],[17.916895,80.143115]]],[[[18.129883,69.557861],[19.334766,69.820264],[19.255078,70.066406],[19.132715,70.244141],[18.129883,69.557861]]],[[[18.136523,57.556641],[18.146387,56.920508],[19.076465,57.835938],[18.136523,57.556641]]],[[[19.646484,39.76709],[20.07793,39.432715],[19.926074,39.77373],[19.646484,39.76709]]],[[[19.799805,60.081738],[20.258887,60.261279],[19.989551,60.351172],[19.799805,60.081738]]],[[[20.22793,78.477832],[21.653125,77.923535],[20.928125,77.459668],[22.685352,77.553516],[22.553711,77.26665],[24.901855,77.756592],[23.116699,77.991504],[21.608105,78.595703],[20.22793,78.477832]]],[[[20.352539,38.179883],[20.761328,38.070557],[20.612305,38.38335],[20.352539,38.179883]]],[[[21.862305,58.497168],[21.996875,57.931348],[23.323242,58.45083],[22.617383,58.62124],[21.862305,58.497168]]],[[[21.994531,70.657129],[22.829102,70.541553],[23.440527,70.815771],[21.994531,70.657129]]],[[[22.05625,58.943604],[22.542188,58.68999],[22.92373,58.826904],[22.649414,59.087109],[22.05625,58.943604]]],[[[22.870313,38.870508],[24.536523,37.979736],[24.127539,38.648486],[23.41543,38.958643],[22.870313,38.870508]]],[[[23.569824,35.534766],[23.592773,35.257227],[24.799805,34.934473],[26.165625,35.018604],[26.320215,35.315137],[25.791309,35.122852],[25.730176,35.348584],[23.852246,35.535449],[23.569824,35.534766]]],[[[25.844141,39.200049],[26.46875,38.972803],[26.410156,39.329443],[25.844141,39.200049]]],[[[25.846094,38.574023],[26.094043,38.218066],[26.160352,38.540723],[25.846094,38.574023]]],[[[26.581055,37.72373],[27.055078,37.709277],[26.824414,37.811426],[26.581055,37.72373]]],[[[27.716309,36.171582],[27.842773,35.929297],[28.231836,36.433643],[27.716309,36.171582]]],[[[31.481934,80.10791],[32.525977,80.119141],[33.629297,80.217432],[31.481934,80.10791]]],[[[32.317188,34.95332],[33.00791,34.56958],[34.004492,35.065234],[33.941992,35.292041],[34.556055,35.662061],[32.712695,35.171045],[32.317188,34.95332]]],[[[39.182324,-6.172559],[39.480957,-6.453711],[39.496484,-6.174609],[39.308984,-5.721973],[39.182324,-6.172559]]],[[[39.673438,-4.927051],[39.749316,-5.443848],[39.865039,-4.906152],[39.673438,-4.927051]]],[[[39.956738,15.889404],[39.975195,15.612451],[40.399023,15.579883],[40.141211,15.696143],[39.956738,15.889404]]],[[[41.801563,16.77876],[42.157812,16.570703],[41.987695,16.715625],[41.860449,17.002539],[41.801563,16.77876]]],[[[43.22666,-11.751855],[43.46582,-11.90127],[43.299023,-11.374512],[43.22666,-11.751855]]],[[[43.264844,-22.383594],[44.035352,-24.995703],[45.205762,-25.570508],[46.728516,-25.149902],[47.177344,-24.787207],[49.362891,-18.336328],[49.449316,-17.240625],[49.839063,-16.486523],[49.664355,-15.521582],[49.892578,-15.457715],[50.208984,-15.960449],[50.482715,-15.385645],[49.9375,-13.072266],[49.538281,-12.432129],[49.207031,-12.07959],[48.786328,-12.470898],[48.796484,-13.26748],[48.255273,-13.719336],[47.941016,-13.662402],[47.77334,-14.369922],[47.96416,-14.672559],[47.47832,-15.009375],[47.351953,-14.766113],[47.099219,-15.43418],[46.942285,-15.219043],[46.475098,-15.513477],[46.399609,-15.924609],[46.15752,-15.738281],[44.476172,-16.217285],[43.979395,-17.391602],[44.404688,-19.92207],[43.501855,-21.356445],[43.264844,-22.383594]]],[[[44.220117,-12.171387],[44.50498,-12.356543],[44.476367,-12.081543],[44.220117,-12.171387]]],[[[44.90498,80.611279],[46.141406,80.446729],[47.705273,80.765186],[48.683594,80.633252],[47.441992,80.853662],[44.90498,80.611279]]],[[[46.644434,80.300342],[47.737305,80.081689],[51.703613,80.687646],[50.278125,80.927246],[49.087793,80.515771],[46.644434,80.300342]]],[[[48.439062,68.804883],[49.62627,68.859717],[50.265234,69.185596],[48.844922,69.494727],[48.439062,68.804883]]],[[[49.824023,-17.086523],[49.936426,-16.90293],[50.023047,-16.695312],[49.824023,-17.086523]]],[[[50.469922,26.228955],[50.607227,25.883105],[50.585938,26.240723],[50.469922,26.228955]]],[[[51.511328,71.648096],[53.411621,71.530127],[54.155664,71.125488],[53.383594,70.873535],[57.145898,70.589111],[57.625391,70.728809],[55.297852,71.935352],[56.42959,73.201172],[55.319824,73.308301],[53.251172,73.182959],[51.511328,71.648096]]],[[[52.249609,71.284912],[53.022656,70.968701],[52.90332,71.36499],[52.249609,71.284912]]],[[[52.343555,80.213232],[53.521387,80.185205],[52.853906,80.402393],[52.343555,80.213232]]],[[[53.31582,12.533154],[53.718848,12.318994],[54.511133,12.552783],[53.763184,12.636816],[53.31582,12.533154]]],[[[53.762891,73.766162],[54.299902,73.350977],[56.963867,73.366553],[58.534668,74.498926],[59.674023,74.610156],[61.355957,75.314844],[67.765332,76.237598],[68.941699,76.707666],[67.651855,77.011572],[64.463477,76.378174],[61.20166,76.282031],[58.88125,75.854785],[57.606836,75.34126],[55.810059,75.124902],[56.49873,74.95708],[55.582227,74.627686],[56.137109,74.496094],[53.762891,73.766162]]],[[[54.668164,80.738672],[57.580371,80.755469],[54.718945,81.115967],[54.668164,80.738672]]],[[[55.311328,-20.904102],[55.362695,-21.273633],[55.797363,-21.339355],[55.661914,-20.90625],[55.311328,-20.904102]]],[[[55.311523,26.592627],[56.187988,26.921143],[55.757617,26.947656],[55.762598,26.811963],[55.311523,26.592627]]],[[[55.383398,-4.609277],[55.542969,-4.785547],[55.540332,-4.693066],[55.383398,-4.609277]]],[[[55.716699,81.188477],[57.769727,81.169727],[57.810254,81.546045],[55.716699,81.188477]]],[[[55.811621,80.087158],[56.986914,80.071484],[57.078711,80.350928],[55.811621,80.087158]]],[[[57.075,80.493945],[57.95625,80.123242],[59.255469,80.343213],[57.075,80.493945]]],[[[57.210938,81.01709],[58.285645,80.764893],[58.622363,81.04165],[57.210938,81.01709]]],[[[57.317676,-20.427637],[57.65127,-20.484863],[57.656543,-19.989941],[57.317676,-20.427637]]],[[[58.519922,70.318311],[59.637012,69.721045],[60.440234,69.725928],[60.450488,69.934863],[59.048047,70.460498],[58.519922,70.318311]]],[[[59.592285,80.816504],[59.649805,80.43125],[61.05127,80.418604],[62.167773,80.834766],[59.592285,80.816504]]],[[[60.07832,80.99917],[61.14082,80.950342],[61.457422,81.103955],[60.07832,80.99917]]],[[[62.592578,80.853027],[63.373828,80.700098],[65.437402,80.930713],[64.802051,81.197266],[62.592578,80.853027]]],[[[68.814746,-49.699609],[69.153125,-49.529688],[70.124316,-49.704395],[70.247754,-49.530664],[69.759961,-49.430176],[70.386133,-49.433984],[70.555469,-49.201465],[70.320215,-49.058594],[69.542383,-49.255664],[69.592773,-48.970996],[69.184863,-49.10957],[69.002441,-48.66123],[68.814746,-49.699609]]],[[[69.995898,73.359375],[70.040723,73.037158],[70.673926,73.09502],[71.626172,73.173975],[70.940234,73.514404],[69.995898,73.359375]]],[[[72.349707,-7.263379],[72.429102,-7.435352],[72.491992,-7.377441],[72.445605,-7.22041],[72.447266,-7.395703],[72.349707,-7.263379]]],[[[73.251172,-52.975781],[73.465137,-53.18418],[73.707422,-53.137109],[73.251172,-52.975781]]],[[[73.473047,4.170703],[73.512207,4.164551],[73.517773,4.247656],[73.473047,4.170703]]],[[[74.198535,73.109082],[74.660547,72.873438],[74.961523,73.0625],[74.198535,73.109082]]],[[[76.871094,72.317041],[77.63252,72.29126],[78.365137,72.482422],[77.748535,72.631201],[76.871094,72.317041]]],[[[78.633203,72.850732],[79.501465,72.721924],[79.164258,73.094336],[78.633203,72.850732]]],[[[79.712988,8.182324],[79.859375,6.829297],[80.095313,6.153174],[80.724121,5.979053],[81.637402,6.425146],[81.874121,7.28833],[80.711133,9.366357],[79.982324,9.812695],[80.42832,9.480957],[80.086328,9.577832],[79.783496,8.018457],[79.712988,8.182324]]],[[[90.515039,22.065137],[90.777637,22.089307],[90.868164,22.484863],[90.596484,22.863525],[90.680469,22.32749],[90.515039,22.065137]]],[[[91.229297,80.030713],[92.683496,79.685205],[93.803125,79.904541],[91.229297,80.030713]]],[[[91.523828,80.358545],[93.654688,80.009619],[97.298438,80.272754],[97.869922,80.763281],[96.526563,81.075586],[95.15957,81.270996],[92.710352,80.872168],[91.523828,80.358545]]],[[[92.352832,10.751123],[92.502832,10.554883],[92.510352,10.897461],[92.352832,10.751123]]],[[[92.533887,11.873389],[92.722754,11.536084],[93.062305,13.545459],[92.533887,11.873389]]],[[[93.070801,79.495312],[95.02041,79.052686],[98.411133,78.787793],[99.929297,78.961426],[99.041797,79.293018],[100.06123,79.7771],[98.596484,80.052197],[97.65166,79.760645],[97.674512,80.158252],[94.987305,80.096826],[93.070801,79.495312]]],[[[93.4875,18.867529],[93.69082,18.684277],[93.744727,18.865527],[93.4875,18.867529]]],[[[93.658008,7.016064],[93.890039,6.831055],[93.822461,7.236621],[93.658008,7.016064]]],[[[95.227832,5.564795],[95.578613,4.661963],[96.968945,3.575146],[97.59082,2.846582],[97.700781,2.358545],[98.595313,1.8646],[99.15918,.351758],[99.669824,.045068],[100.308203,-.82666],[100.889551,-2.248535],[101.578613,-3.166992],[104.601562,-5.90459],[104.639551,-5.52041],[105.081348,-5.745508],[105.349414,-5.549512],[105.74834,-5.818262],[106.044336,-3.10625],[105.396973,-2.380176],[104.650781,-2.595215],[104.845215,-2.092969],[104.515918,-1.819434],[104.360547,-1.038379],[103.721094,-.886719],[103.438574,-.575586],[103.428516,-.191797],[103.786719,.046973],[103.672656,.288916],[103.338965,.513721],[102.55,.216455],[103.031836,.578906],[102.389941,.841992],[102.019922,1.442139],[101.47666,1.693066],[101.046191,2.257471],[100.828223,2.242578],[100.887891,1.948242],[100.523828,2.18916],[99.732324,3.183057],[98.307324,4.092871],[97.547168,5.205859],[96.492578,5.229346],[95.227832,5.564795]]],[[[95.270312,77.018848],[96.285449,77.02666],[96.528418,77.205518],[95.270312,77.018848]]],[[[97.079199,1.425488],[97.82041,.564453],[97.931934,.973926],[97.481543,1.465088],[97.079199,1.425488]]],[[[98.296289,7.776074],[98.409082,7.902051],[98.32207,8.166309],[98.296289,7.776074]]],[[[98.322949,-781e-6],[98.459277,-.530469],[98.544141,-.257617],[98.322949,-781e-6]]],[[[98.376465,11.791504],[98.434766,11.56709],[98.553809,11.744873],[98.376465,11.791504]]],[[[98.676074,-.970508],[98.827734,-1.609961],[99.163867,-1.77793],[98.932617,-.954004],[98.676074,-.970508]]],[[[99.500293,77.976074],[105.312598,78.499902],[103.800781,79.149268],[102.412305,78.835449],[102.884766,79.253955],[101.590625,79.350439],[99.500293,77.976074]]],[[[99.646289,6.418359],[99.74375,6.263281],[99.848047,6.465723],[99.646289,6.418359]]],[[[99.987891,-2.525391],[100.014941,-2.819727],[100.204102,-2.741016],[99.987891,-2.525391]]],[[[100.198535,-2.785547],[100.465137,-3.328516],[100.425098,-3.18291],[100.198535,-2.785547]]],[[[101.409668,2.02168],[101.500781,1.733203],[101.719434,1.78916],[101.708105,2.078418],[101.409668,2.02168]]],[[[102.49043,.856641],[103.027539,.746631],[102.506641,1.08877],[102.49043,.856641]]],[[[103.650195,1.325537],[103.969727,1.331445],[103.817969,1.44707],[103.650195,1.325537]]],[[[103.849512,10.371094],[104.018457,10.029199],[104.063965,10.39082],[103.849512,10.371094]]],[[[104.251953,1.014893],[104.575195,.831934],[104.585352,1.216113],[104.251953,1.014893]]],[[[104.257129,-.463281],[104.363184,-.658594],[104.590137,-.466602],[104.474219,-.334668],[104.257129,-.463281]]],[[[104.44707,-.18916],[105.005371,-.282812],[104.778613,-.175977],[104.542676,.017725],[104.44707,-.18916]]],[[[105.133398,-2.042578],[105.78584,-2.181348],[105.99873,-2.824902],[106.667188,-3.071777],[106.818457,-2.57334],[106.365918,-2.464844],[106.045703,-1.669434],[105.45957,-1.574707],[105.133398,-2.042578]]],[[[105.255469,-6.835254],[106.198242,-6.927832],[106.519727,-7.053711],[106.455273,-7.368652],[107.91748,-7.724121],[109.281641,-7.704883],[111.509961,-8.305078],[113.25332,-8.286719],[114.583789,-8.769629],[114.386914,-8.405176],[114.409277,-7.79248],[113.013574,-7.657715],[112.539258,-6.926465],[111.181543,-6.686719],[110.834766,-6.424219],[110.42627,-6.947266],[108.677832,-6.790527],[108.330176,-6.286035],[107.373926,-6.007617],[106.075,-5.91416],[105.255469,-6.835254]]],[[[105.584082,-10.5125],[105.696875,-10.56416],[105.725391,-10.492969],[105.584082,-10.5125]]],[[[107.614453,-3.209375],[108.055273,-3.226855],[108.207227,-2.997656],[108.215137,-2.696973],[107.666309,-2.566309],[107.614453,-3.209375]]],[[[108.002344,3.982861],[108.316016,3.689648],[108.24834,4.217139],[108.002344,3.982861]]],[[[108.19679674,6.53760583],[108.19687578,6.53630242],[108.23630689,6.22476797],[108.23638164,6.22427602],[108.26004031,6.09098419],[108.26055972,6.08912451],[108.29013305,6.01266273],[108.29170425,6.00995718],[108.29403462,6.00786957],[108.29689603,6.00660426],[108.3000084,6.00628511],[108.30306706,6.00694335],[108.30577262,6.00851455],[108.30786022,6.01084492],[108.30912553,6.01370633],[108.30944469,6.0168187],[108.30878645,6.01987736],[108.279563,6.09543449],[108.25611734,6.22752625],[108.21679964,6.53816468],[108.21876335,6.94964057],[108.24419535,7.07390742],[108.24433543,7.07703297],[108.24350281,7.08004883],[108.24177899,7.0826598],[108.2393327,7.08461028],[108.23640341,7.08570936],[108.23327786,7.08584944],[108.230262,7.08501682],[108.22765103,7.083293],[108.22570055,7.08084671],[108.22460147,7.07791743],[108.19897125,6.95268198],[108.1987683,6.95072469],[108.19679674,6.53760583]]],[[[108.591186,19.141592],[108.598577,19.055633],[108.630606,19.003017],[108.637997,18.924346],[108.595497,18.872256],[108.593033,18.809386],[108.65278,18.740258],[108.663866,18.67337],[108.641077,18.565614],[108.644772,18.486738],[108.68912,18.447571],[108.776583,18.441894],[108.881293,18.416344],[108.905315,18.389087],[108.944735,18.314107],[109.006329,18.323198],[109.108575,18.323766],[109.138756,18.268081],[109.17448,18.260125],[109.287813,18.264671],[109.355566,18.215221],[109.441182,18.199303],[109.467051,18.173718],[109.527413,18.169169],[109.584696,18.143579],[109.661688,18.175424],[109.726362,18.177698],[109.749767,18.193618],[109.785492,18.339672],[109.919767,18.375457],[110.022629,18.360121],[110.070672,18.376025],[110.090382,18.399309],[110.116867,18.506602],[110.214186,18.578662],[110.246215,18.609859],[110.329366,18.642185],[110.367555,18.631977],[110.499366,18.651824],[110.499366,18.751592],[110.578206,18.784458],[110.590525,18.838841],[110.585597,18.88075],[110.619474,19.152334],[110.676756,19.286264],[110.706321,19.320153],[110.729727,19.378878],[110.787009,19.399765],[110.844292,19.449996],[110.888023,19.518827],[110.920668,19.552668],[111.008747,19.60398],[111.061718,19.612436],[111.071573,19.628784],[111.043856,19.763448],[111.013675,19.850159],[110.966248,20.018377],[110.940994,20.028499],[110.871393,20.01163],[110.808567,20.035808],[110.778386,20.068415],[110.744509,20.074036],[110.717408,20.148778],[110.687843,20.163947],[110.655814,20.134169],[110.562191,20.110006],[110.526467,20.07516],[110.495054,20.077408],[110.387265,20.113378],[110.318279,20.108882],[110.28933,20.056047],[110.243135,20.077408],[110.144585,20.074598],[110.106396,20.026812],[110.042339,19.991384],[109.997375,19.980136],[109.965346,19.993634],[109.898825,19.994196],[109.855093,19.984073],[109.814441,19.993072],[109.76147,19.981261],[109.712195,20.017253],[109.657993,20.01163],[109.585312,19.98801],[109.526797,19.943573],[109.498464,19.873236],[109.411001,19.895184],[109.349407,19.898561],[109.300748,19.917693],[109.25948,19.898561],[109.255784,19.867045],[109.231147,19.863105],[109.159082,19.79048],[109.169553,19.736411],[109.147379,19.704863],[109.093792,19.68965],[109.048829,19.619764],[108.993394,19.587065],[108.92872,19.524468],[108.855424,19.469182],[108.806148,19.450561],[108.765496,19.400894],[108.694047,19.387346],[108.644772,19.349518],[108.609048,19.276661],[108.591186,19.141592]]],[[[108.944531,.355664],[109.25752,.031152],[109.258789,-.807422],[109.983301,-1.274805],[110.256055,-2.966113],[111.694727,-2.889453],[111.858105,-3.551855],[112.758008,-3.322168],[113.033984,-2.933496],[113.705078,-3.455273],[114.344336,-3.235156],[114.693555,-4.169727],[115.956152,-3.59502],[116.257227,-3.126367],[116.166309,-2.93457],[116.56543,-2.299707],[116.275488,-1.784863],[116.753418,-1.327344],[116.739844,-1.044238],[116.913965,-1.223633],[117.5625,-.770898],[117.522168,.235889],[117.911621,1.098682],[118.534766,.813525],[118.984961,.982129],[117.789258,2.026855],[118.066602,2.317822],[117.055957,3.622656],[117.777246,3.689258],[117.574414,4.170605],[118.54834,4.379248],[118.260547,4.988867],[118.9125,5.0229],[119.266309,5.308105],[118.353125,5.806055],[117.973633,5.70625],[118.003809,6.05332],[117.501172,5.884668],[117.69375,6.35],[117.229883,6.93999],[116.788086,6.606104],[116.749805,6.9771],[115.877148,5.613525],[115.419043,5.413184],[115.554492,5.093555],[115.140039,4.899756],[115.026758,4.899707],[114.063867,4.592676],[112.987891,3.161914],[111.5125,2.743018],[111.028711,1.557812],[111.223242,1.39585],[109.864844,1.764453],[109.628906,2.027539],[109.075879,1.495898],[108.944531,.355664]]],[[[109.088249,21.014934],[109.11227,21.02499],[109.117814,21.017727],[109.144299,21.041189],[109.138756,21.067439],[109.09256,21.057386],[109.088865,21.031134],[109.088249,21.014934]]],[[[109.29101677,16.20072311],[109.29161878,16.19765288],[109.29314007,16.19491896],[109.51574449,15.91095759],[109.57455994,15.82609887],[109.67264555,15.66561455],[109.77065019,15.44468789],[109.82951587,15.22896754],[109.84522534,15.15316562],[109.84633168,15.15023907],[109.84828823,15.14779763],[109.85090347,15.14608029],[109.85392139,15.14525516],[109.85704658,15.145403],[109.85997314,15.14650935],[109.86241457,15.1484659],[109.86413191,15.15108113],[109.86495704,15.15409906],[109.8648092,15.15722425],[109.84903675,15.23333003],[109.84889209,15.23393326],[109.78974541,15.45068337],[109.7892391,15.45210582],[109.69066131,15.67432448],[109.6900529,15.67548445],[109.59147511,15.83677407],[109.59116145,15.8372556],[109.53201478,15.92259221],[109.53166592,15.92306523],[109.30888011,16.20725797],[109.30658844,16.20938798],[109.30375073,16.21070558],[109.30064474,16.21108179],[109.29757451,16.21047978],[109.29484059,16.20895848],[109.29271057,16.20666681],[109.29139298,16.2038291],[109.29101677,16.20072311]]],[[[109.463672,-1.277539],[109.710254,-1.180664],[109.475977,-.985352],[109.463672,-1.277539]]],[[[109.463972,7.315254],[109.513247,7.320002],[109.571761,7.373422],[109.654297,7.479648],[109.709115,7.511095],[109.791651,7.524742],[109.938861,7.504569],[109.948716,7.522962],[109.904984,7.55144],[109.816289,7.572797],[109.72205,7.575763],[109.653065,7.559745],[109.536037,7.448792],[109.463972,7.344339],[109.463972,7.315254]]],[[[109.936397,7.823665],[109.988136,7.8124],[110.050346,7.846194],[110.082991,7.896584],[110.078063,7.949339],[110.0331,7.944597],[109.953027,7.888878],[109.936397,7.848566],[109.936397,7.823665]]],[[[110.05402458,11.2473615],[110.05471962,11.24431099],[110.05632331,11.24162456],[110.05867865,11.23956519],[110.0615551,11.23833444],[110.06467109,11.23805281],[110.0677216,11.23874785],[110.07040803,11.24035153],[110.07246741,11.24270688],[110.14541497,11.35870461],[110.14588682,11.35954163],[110.20700505,11.48128846],[110.20728377,11.48189306],[110.25854422,11.60358735],[110.25901765,11.60499559],[110.30436343,11.7826124],[110.30456934,11.78364161],[110.32822801,11.94571326],[110.32832827,11.94685414],[110.33424294,12.14159753],[110.33424553,12.14210167],[110.33227398,12.24038351],[110.33172267,12.24346324],[110.33024665,12.24622187],[110.3279904,12.24838938],[110.32517479,12.24975358],[110.32207543,12.25018094],[110.3189957,12.24962962],[110.31623706,12.2481536],[110.31406956,12.24589736],[110.31270536,12.24308175],[110.312278,12.23998238],[110.3142445,12.14195265],[110.3083549,11.94803461],[110.28485499,11.78705054],[110.23982347,11.61066468],[110.18898148,11.48996382],[110.12822847,11.36894451],[110.05553696,11.25335394],[110.05430621,11.25047749],[110.05402458,11.2473615]]],[[[110.201251,20.938378],[110.309656,20.963529],[110.347845,20.984763],[110.407591,20.990351],[110.47288,20.983087],[110.511684,20.916578],[110.535706,20.922727],[110.539402,20.987557],[110.560344,21.061295],[110.517844,21.079166],[110.459946,21.062971],[110.398352,21.096476],[110.352772,21.079724],[110.305961,21.0881],[110.27578,21.033369],[110.211106,20.986999],[110.201251,20.938378]]],[[[110.405127,20.678245],[110.437772,20.677685],[110.414366,20.710157],[110.405127,20.678245]]],[[[110.459946,8.116449],[110.471032,8.072012],[110.554184,8.093935],[110.599764,8.156735],[110.568351,8.17273],[110.461793,8.128298],[110.459946,8.116449]]],[[[110.460561,7.799948],[110.487663,7.783346],[110.511684,7.805878],[110.485199,7.827815],[110.460561,7.799948]]],[[[110.548641,20.908752],[110.562807,20.861224],[110.611467,20.860106],[110.646575,20.917137],[110.644727,20.935584],[110.584365,20.948998],[110.548641,20.908752]]],[[[110.556648,20.32734],[110.593604,20.360447],[110.586213,20.381205],[110.556648,20.32734]]],[[[110.609003,8.010976],[110.642879,7.989049],[110.641648,8.031125],[110.622553,8.041199],[110.609003,8.010976]]],[[[111.203384,19.925007],[111.204,19.92557],[111.204,19.926132],[111.203384,19.92557],[111.203384,19.925007]]],[[[111.452224,17.092936],[111.463311,17.077491],[111.536607,17.104949],[111.4861,17.058039],[111.559397,17.087788],[111.542151,17.11982],[111.452224,17.092936]]],[[[111.463311,8.52504],[111.497187,8.523857],[111.509506,8.550489],[111.463311,8.52504]]],[[[111.49534,16.4374],[111.545847,16.43453],[111.538455,16.461507],[111.500267,16.45175],[111.49534,16.4374]]],[[[111.503418,74.353076],[112.782422,74.095068],[113.387207,74.400439],[112.084473,74.548975],[111.503418,74.353076]]],[[[111.539071,7.54432],[111.542767,7.524742],[111.583419,7.543134],[111.612368,7.592374],[111.566788,7.606017],[111.539071,7.54432]]],[[[111.553854,7.807656],[111.585267,7.771487],[111.619759,7.840265],[111.603745,7.861608],[111.553854,7.807656]]],[[[111.56802,16.162834],[111.611136,16.156511],[111.690592,16.211112],[111.606825,16.177779],[111.598817,16.198469],[111.681353,16.262251],[111.649324,16.255931],[111.577875,16.208239],[111.56802,16.162834]]],[[[111.572948,16.470116],[111.578491,16.447158],[111.614216,16.44027],[111.592658,16.490775],[111.572948,16.470116]]],[[[111.638853,7.907254],[111.665339,7.887099],[111.712766,7.887099],[111.713382,7.927408],[111.651788,7.932743],[111.638853,7.907254]]],[[[111.657947,8.672974],[111.665955,8.622683],[111.717694,8.6499],[111.697368,8.67889],[111.657947,8.672974]]],[[[111.670266,7.651098],[111.707223,7.648725],[111.749722,7.703884],[111.726317,7.729977],[111.691208,7.711593],[111.670266,7.651098]]],[[[111.690592,16.587731],[111.724469,16.560198],[111.717078,16.59404],[111.690592,16.587731]]],[[[111.716462,16.249036],[111.789758,16.250186],[111.790374,16.220307],[111.734324,16.19732],[111.779903,16.19732],[111.81686,16.224329],[111.813164,16.261676],[111.782367,16.273741],[111.716462,16.249036]]],[[[111.739251,16.452898],[111.766969,16.470116],[111.786679,16.520039],[111.759577,16.545857],[111.765737,16.495366],[111.739251,16.452898]]],[[[111.761425,16.061642],[111.791606,16.028859],[111.828563,16.049565],[111.829795,16.070844],[111.761425,16.061642]]],[[[111.77915495,3.40802995],[111.77936129,3.40490807],[111.78052226,3.40200275],[111.78252419,3.39959839],[111.78517113,3.39793033],[111.78820398,3.39716187],[111.79132585,3.39736822],[112.31181658,3.51544515],[112.31248917,3.51562254],[112.52147408,3.5785908],[112.52281386,3.57910186],[112.85206367,3.73256867],[112.85465776,3.7343178],[112.85658437,3.73678292],[112.85765492,3.73972276],[112.85776462,3.74284952],[112.85690272,3.74585715],[112.8551536,3.74845124],[112.85268847,3.75037785],[112.84974864,3.7514484],[112.84662187,3.75155809],[112.84361424,3.7506962],[112.51501594,3.59753306],[112.30705249,3.53487257],[111.78690114,3.41687263],[111.78399583,3.41571167],[111.78159146,3.41370973],[111.77992341,3.41106279],[111.77915495,3.40802995]]],[[[111.925265,8.070827],[111.949287,8.05068],[111.994866,8.047125],[112.018888,8.065494],[112.013344,8.093342],[111.95483,8.106377],[111.925265,8.070827]]],[[[111.97454,16.323715],[112.002258,16.306484],[112.07617,16.323715],[112.074938,16.349558],[112.047221,16.360469],[112.002874,16.350707],[111.97454,16.323715]]],[[[111.99733,3.848065],[112.015192,3.823583],[112.064467,3.830152],[112.073707,3.865979],[112.03367,3.892251],[111.99733,3.848065]]],[[[112.180264,8.862244],[112.216604,8.866383],[112.206133,8.88767],[112.180264,8.862244]]],[[[112.20367,15.71398],[112.233851,15.69612],[112.25972,15.734718],[112.240626,15.741055],[112.20367,15.71398]]],[[[112.207981,8.835634],[112.235699,8.827355],[112.241242,8.852783],[112.207981,8.835634]]],[[[112.207981,16.987081],[112.222764,16.960751],[112.292981,16.96762],[112.266496,16.993949],[112.232619,16.996239],[112.207981,16.987081]]],[[[112.208597,3.876129],[112.241858,3.845677],[112.280046,3.86777],[112.260336,3.917925],[112.219068,3.908969],[112.208597,3.876129]]],[[[112.211061,16.795819],[112.226459,16.759147],[112.254177,16.751698],[112.262184,16.778057],[112.211061,16.795819]]],[[[112.241858,3.942404],[112.292365,3.946583],[112.288053,3.97345],[112.254177,3.97942],[112.241858,3.942404]]],[[[112.244322,8.874662],[112.281278,8.855148],[112.288669,8.885896],[112.244322,8.874662]]],[[[112.30222,16.963041],[112.349031,16.912088],[112.360734,16.925257],[112.334249,16.962469],[112.30222,16.963041]]],[[[112.345952,8.926101],[112.392763,8.919598],[112.384756,8.946793],[112.345952,8.926101]]],[[[112.350263,5.621747],[112.385988,5.615791],[112.385372,5.643187],[112.350263,5.621747]]],[[[112.383524,16.265698],[112.411241,16.2634],[112.475915,16.288677],[112.531349,16.285805],[112.536893,16.312228],[112.509176,16.317397],[112.409393,16.294996],[112.383524,16.265698]]],[[[112.435263,21.663781],[112.456205,21.648763],[112.458669,21.68992],[112.435263,21.663781]]],[[[112.448814,16.005274],[112.476531,16.001247],[112.570154,16.011027],[112.612037,16.039212],[112.588016,16.070844],[112.462364,16.043813],[112.448814,16.005274]]],[[[112.472219,5.73966],[112.496857,5.736683],[112.498089,5.775387],[112.472219,5.73966]]],[[[112.499321,16.493645],[112.507328,16.466098],[112.586784,16.525777],[112.575081,16.537251],[112.499321,16.493645]]],[[[112.50856,9.525679],[112.568922,9.516826],[112.567074,9.554008],[112.512255,9.544566],[112.50856,9.525679]]],[[[112.523342,5.656289],[112.5449,5.616386],[112.565842,5.63068],[112.56153,5.677133],[112.528886,5.687257],[112.523342,5.656289]]],[[[112.527654,5.79444],[112.531965,5.766455],[112.562762,5.75931],[112.562146,5.820637],[112.527654,5.79444]]],[[[112.530733,21.583667],[112.563378,21.591458],[112.571385,21.619835],[112.621277,21.606482],[112.665624,21.642644],[112.639139,21.67268],[112.66624,21.683803],[112.663776,21.714386],[112.592327,21.693256],[112.560299,21.666562],[112.57077,21.645982],[112.535045,21.628737],[112.530733,21.583667]]],[[[112.537509,8.846278],[112.57077,8.815527],[112.639755,8.818484],[112.598487,8.859288],[112.537509,8.846278]]],[[[112.553523,5.942676],[112.575697,5.971247],[112.554139,5.97839],[112.553523,5.942676]]],[[[112.557219,5.109326],[112.568922,5.071771],[112.610806,5.091443],[112.601567,5.120055],[112.557219,5.109326]]],[[[112.583088,5.56159],[112.606494,5.51751],[112.614501,5.465683],[112.642834,5.489512],[112.616349,5.568737],[112.583088,5.56159]]],[[[112.612037,5.367973],[112.640371,5.347715],[112.685334,5.371548],[112.690878,5.406702],[112.62374,5.401935],[112.612037,5.367973]]],[[[112.64653,16.385733],[112.681639,16.400661],[112.660081,16.426494],[112.64653,16.385733]]],[[[112.650842,5.106941],[112.655769,5.055676],[112.682871,5.048522],[112.719211,5.075944],[112.678559,5.121247],[112.650842,5.106941]]],[[[112.671784,16.331755],[112.701349,16.331755],[112.677943,16.35932],[112.671784,16.331755]]],[[[112.70566,21.679354],[112.734609,21.666562],[112.780189,21.671568],[112.730914,21.613715],[112.775261,21.564189],[112.817145,21.590345],[112.798667,21.610933],[112.821457,21.655994],[112.804826,21.686583],[112.83316,21.736624],[112.853486,21.740515],[112.876275,21.772753],[112.840551,21.776644],[112.782653,21.739959],[112.724138,21.719945],[112.70566,21.679354]]],[[[112.725879,-7.072754],[113.844531,-7.105371],[114.073633,-6.960156],[113.067383,-6.87998],[112.725879,-7.072754]]],[[[112.823305,8.910729],[112.859645,8.889444],[112.873196,8.908364],[112.823305,8.910729]]],[[[112.89229,7.844416],[112.929862,7.827815],[112.93171,7.867537],[112.89229,7.844416]]],[[[112.907072,4.993079],[112.943413,4.991887],[112.952652,5.047926],[112.910768,5.038388],[112.907072,4.993079]]],[[[112.945261,8.410204],[112.985297,8.429149],[112.949572,8.432701],[112.945261,8.410204]]],[[[112.980369,19.496263],[112.993304,19.472003],[113.038883,19.480466],[113.048123,19.506417],[113.029028,19.52898],[112.993304,19.52616],[112.980369,19.496263]]],[[[113.007471,21.869424],[113.025333,21.847762],[113.045659,21.882753],[113.007471,21.869424]]],[[[113.136818,21.868869],[113.142977,21.831653],[113.162071,21.853873],[113.203955,21.861093],[113.167615,21.876644],[113.136818,21.868869]]],[[[113.184766,-26.182227],[114.028125,-27.347266],[114.165137,-28.080664],[114.856836,-29.142969],[115.07793,-30.560449],[115.698438,-31.694531],[115.683008,-33.192871],[115.358789,-33.639941],[114.993848,-33.515332],[115.008789,-34.255859],[116.517188,-34.987891],[117.581934,-35.097754],[119.450586,-34.368262],[119.854102,-33.974707],[123.506836,-33.916211],[124.24375,-33.015234],[125.917188,-32.296973],[127.319824,-32.264062],[129.187695,-31.659961],[131.143652,-31.495703],[134.23418,-32.548535],[134.173535,-32.979102],[134.791016,-33.32832],[135.45,-34.581055],[135.123047,-34.585742],[135.647559,-34.939648],[135.969727,-34.981836],[135.891016,-34.660938],[136.430664,-34.02998],[137.237305,-33.629492],[137.783203,-32.578125],[137.931836,-33.579102],[137.493848,-34.161133],[137.391016,-34.913281],[137.014258,-34.91582],[136.883594,-35.239746],[137.691699,-35.142969],[138.089258,-34.169824],[138.511133,-35.024414],[138.184375,-35.612695],[139.28252,-35.375391],[139.289453,-35.611328],[138.968945,-35.580762],[139.729004,-36.371387],[139.784277,-37.245801],[140.39043,-37.89668],[141.424219,-38.363477],[142.455859,-38.386328],[143.538965,-38.820898],[144.891309,-37.899805],[145.119922,-38.091309],[144.717773,-38.340332],[144.95957,-38.500781],[145.475781,-38.24375],[145.397266,-38.535352],[146.4,-39.145508],[146.21748,-38.727441],[146.856836,-38.663477],[147.876758,-37.93418],[149.932715,-37.528516],[150.195312,-35.833594],[150.80459,-35.012891],[151.29209,-33.580957],[152.47041,-32.439062],[152.943945,-31.434863],[153.616895,-28.673047],[153.116797,-27.194434],[153.164941,-25.96416],[151.831641,-24.122949],[150.843164,-23.458008],[150.672461,-22.418164],[150.541309,-22.559082],[150.076172,-22.164453],[149.974414,-22.550684],[149.703906,-22.440527],[149.454102,-21.578711],[148.683691,-20.580176],[148.884766,-20.480859],[148.759375,-20.289551],[147.418555,-19.378125],[146.383398,-18.977051],[146.032227,-18.272852],[145.912109,-16.9125],[145.426074,-16.406152],[145.287695,-14.943164],[144.473047,-14.231836],[143.756348,-14.348828],[143.178906,-11.954492],[142.872559,-11.821387],[142.779688,-11.115332],[142.456445,-10.707324],[142.168359,-10.946582],[141.961133,-12.054297],[141.688574,-12.351074],[141.929785,-12.739844],[141.613574,-12.943457],[141.625488,-15.056641],[141.291406,-16.463477],[140.830469,-17.414453],[140.03584,-17.702637],[139.248438,-17.328613],[139.009863,-16.899316],[138.24502,-16.718359],[135.45332,-14.923145],[135.954492,-13.934863],[135.927344,-13.304297],[136.461035,-13.225195],[136.897461,-12.243555],[136.443359,-11.951465],[136.081836,-12.422461],[136.008496,-12.191406],[135.704395,-12.209863],[135.922461,-11.825781],[135.029688,-12.19375],[131.961523,-11.180859],[131.822461,-11.302441],[132.072852,-11.474707],[132.674219,-11.649023],[132.712793,-12.123438],[131.438281,-12.276953],[131.291602,-12.067871],[130.867383,-12.557813],[130.622656,-12.431055],[130.168164,-12.957422],[130.259766,-13.302246],[129.838867,-13.572949],[129.378711,-14.39248],[129.84873,-14.828906],[129.637109,-14.850977],[129.634766,-15.139746],[129.267578,-14.871484],[129.21582,-15.160254],[129.058203,-14.884375],[128.575781,-14.774512],[128.069434,-15.329297],[128.180469,-14.711621],[127.457617,-14.031445],[126.903223,-13.744141],[126.569727,-14.160938],[126.053906,-13.977246],[126.020703,-14.494531],[125.661621,-14.529492],[125.627734,-14.256641],[125.178711,-14.714746],[125.355664,-15.119824],[124.839063,-15.160742],[125.062988,-15.442285],[124.692578,-15.273633],[124.439551,-15.493555],[124.381641,-15.758203],[124.648535,-15.870215],[124.404883,-16.298926],[124.771973,-16.402637],[123.607031,-16.224023],[123.49043,-16.490723],[123.874414,-16.918652],[123.831055,-17.120801],[123.593555,-17.030371],[123.563086,-17.520898],[122.970703,-16.436816],[122.260938,-17.135742],[122.34541,-18.111914],[120.997949,-19.604395],[119.104492,-19.995313],[117.40625,-20.721191],[116.706738,-20.653809],[114.709277,-21.823438],[114.141602,-22.483105],[114.022852,-21.881445],[113.417676,-24.435645],[114.214258,-25.851562],[114.215723,-26.289453],[113.72373,-26.129785],[113.451367,-25.599121],[113.836426,-26.500586],[113.581641,-26.558105],[113.356055,-26.080469],[113.184766,-26.182227]]],[[[113.217506,6.306249],[113.230441,6.285429],[113.243991,6.325878],[113.217506,6.306249]]],[[[113.221817,8.073789],[113.235984,8.068456],[113.283411,8.111117],[113.269861,8.120004],[113.221817,8.073789]]],[[[113.266165,8.125929],[113.311129,8.177469],[113.343157,8.193463],[113.288955,8.119412],[113.349933,8.172137],[113.386273,8.238479],[113.386273,8.289412],[113.354244,8.304217],[113.353628,8.237887],[113.293882,8.176284],[113.266165,8.125929]]],[[[113.575983,22.194513],[113.586453,22.201162],[113.575983,22.201162],[113.575983,22.194513]]],[[[113.580294,6.920344],[113.62341,6.942325],[113.600004,6.961929],[113.580294,6.920344]]],[[[113.596924,10.240836],[113.617866,10.22199],[113.638192,10.243192],[113.596924,10.240836]]],[[[113.638192,8.976942],[113.654823,8.962163],[113.730583,9.004133],[113.719496,9.020092],[113.644968,8.989355],[113.638192,8.976942]]],[[[113.660366,9.231039],[113.676997,9.202683],[113.697323,9.225722],[113.660366,9.231039]]],[[[113.71888,21.951599],[113.723192,21.922177],[113.742902,21.950489],[113.71888,21.951599]]],[[[113.74167,21.991559],[113.765076,21.962145],[113.774315,21.998218],[113.74167,21.991559]]],[[[113.769387,7.636862],[113.773699,7.601865],[113.814967,7.603051],[113.831597,7.644573],[113.769387,7.636862]]],[[[113.786634,22.413773],[113.819894,22.396068],[113.813735,22.419858],[113.786634,22.413773]]],[[[113.792177,7.373422],[113.828518,7.362145],[113.829134,7.383511],[113.792177,7.373422]]],[[[113.799568,19.19925],[113.832213,19.158552],[113.874097,19.151203],[113.914749,19.172119],[113.920293,19.223551],[113.875945,19.237113],[113.80696,19.222986],[113.799568,19.19925]]],[[[113.845764,10.018733],[113.865474,10.00341],[113.872249,10.123029],[113.856851,10.12185],[113.845764,10.018733]]],[[[113.860546,15.477068],[113.893807,15.463802],[113.890112,15.490909],[113.860546,15.477068]]],[[[113.893807,8.862836],[113.916597,8.837999],[113.939387,8.875253],[113.912285,8.888853],[113.893807,8.862836]]],[[[113.895039,8.00505],[113.904894,7.963564],[113.9708,7.944597],[113.969568,7.974825],[113.940003,8.018088],[113.895039,8.00505]]],[[[113.896887,7.607204],[113.919677,7.566865],[113.98743,7.536014],[114.058879,7.537794],[114.157429,7.561525],[114.289856,7.617288],[114.368696,7.638642],[114.407501,7.683126],[114.419819,7.765557],[114.464167,7.814771],[114.540543,7.862201],[114.555326,7.891249],[114.540543,7.945783],[114.511594,7.966527],[114.47279,7.968898],[114.414892,7.952895],[114.268298,7.870501],[114.211632,7.786904],[114.095219,7.721082],[114.029314,7.670078],[113.921524,7.639235],[113.896887,7.607204]]],[[[113.938771,15.8355],[113.973263,15.805558],[113.9708,15.83953],[113.938771,15.8355]]],[[[113.956017,8.840365],[113.975111,8.793054],[114.012068,8.798376],[113.977575,8.841548],[113.956017,8.840365]]],[[[113.976959,8.872888],[114.013299,8.836817],[114.035473,8.783591],[114.060111,8.816119],[114.041017,8.843913],[113.989894,8.878801],[113.976959,8.872888]]],[[[114.064422,10.904437],[114.110002,10.918541],[114.096451,10.947921],[114.074893,10.929118],[114.064422,10.904437]]],[[[114.10569,16.004124],[114.110618,15.978235],[114.132176,16.007575],[114.10569,16.004124]]],[[[114.120473,22.177888],[114.154965,22.177888],[114.166668,22.205041],[114.142647,22.213906],[114.123553,22.238836],[114.120473,22.177888]]],[[[114.124169,21.985455],[114.153734,21.97491],[114.171596,22.000437],[114.124169,21.985455]]],[[[114.166668,9.38459],[114.175291,9.342075],[114.195617,9.350933],[114.194386,9.391676],[114.166668,9.38459]]],[[[114.180835,22.00987],[114.190074,21.986564],[114.229494,21.995443],[114.180835,22.00987]]],[[[114.194386,8.764664],[114.201161,8.727991],[114.248588,8.724442],[114.222103,8.784773],[114.194386,8.764664]]],[[[114.212864,16.040937],[114.31203,16.034611],[114.306487,16.057616],[114.268914,16.059342],[114.212864,16.040937]]],[[[114.231342,22.016528],[114.311414,22.041493],[114.302791,22.050368],[114.239965,22.03539],[114.231342,22.016528]]],[[[114.242429,10.242014],[114.263371,10.239658],[114.326197,10.284414],[114.312646,10.300901],[114.265219,10.275581],[114.242429,10.242014]]],[[[114.305255,22.372826],[114.305871,22.369506],[114.305871,22.372273],[114.313878,22.340724],[114.332972,22.353455],[114.305255,22.372826]]],[[[114.323733,22.297541],[114.324349,22.297541],[114.323733,22.298095],[114.323733,22.297541]]],[[[114.372392,22.32301],[114.373008,22.323564],[114.372392,22.323564],[114.372392,22.32301]]],[[[114.448153,16.034035],[114.485109,16.034611],[114.521449,16.056466],[114.465399,16.067393],[114.448153,16.034035]]],[[[114.457392,15.599305],[114.466631,15.576823],[114.491884,15.59354],[114.457392,15.599305]]],[[[114.467578,-8.166309],[115.055078,-8.573047],[115.144922,-8.849023],[115.704297,-8.407129],[115.447852,-8.155176],[114.467578,-8.166309]]],[[[114.469095,10.836261],[114.475254,10.814512],[114.513442,10.848605],[114.565181,10.836261],[114.593514,10.856245],[114.587355,10.909138],[114.55471,10.900911],[114.469095,10.836261]]],[[[114.493116,10.717504],[114.513442,10.722208],[114.562717,10.778064],[114.539312,10.793349],[114.493116,10.717504]]],[[[114.507899,8.120004],[114.530073,8.103415],[114.595978,8.120596],[114.624311,8.149626],[114.595978,8.15792],[114.507899,8.120004]]],[[[114.581195,15.625242],[114.610761,15.615444],[114.610145,15.649447],[114.581195,15.625242]]],[[[114.599058,8.846278],[114.645869,8.844504],[114.68221,8.881166],[114.665579,8.900087],[114.61692,8.881166],[114.599058,8.846278]]],[[[114.617536,9.965688],[114.642173,9.917351],[114.672355,9.927963],[114.685905,9.979245],[114.617536,9.965688]]],[[[114.62,11.432264],[114.652644,11.436957],[114.661884,11.522584],[114.621232,11.518479],[114.62,11.432264]]],[[[114.665579,7.590001],[114.671739,7.563898],[114.72163,7.59178],[114.703767,7.614915],[114.665579,7.590001]]],[[[114.669891,8.210048],[114.691449,8.18517],[114.74134,8.189316],[114.726557,8.21064],[114.669891,8.210048]]],[[[114.680978,9.707416],[114.704999,9.700337],[114.714854,9.736909],[114.693296,9.741038],[114.680978,9.707416]]],[[[114.688985,11.469217],[114.722246,11.429331],[114.737644,11.463938],[114.720398,11.49209],[114.688985,11.469217]]],[[[114.689601,10.345648],[114.702536,10.312677],[114.725941,10.319154],[114.747499,10.37214],[114.717318,10.380381],[114.689601,10.345648]]],[[[114.696992,11.004322],[114.710543,11.001972],[114.793079,11.07657],[114.799854,11.10476],[114.766593,11.110045],[114.710543,11.039567],[114.696992,11.004322]]],[[[114.703151,16.170307],[114.816484,16.198469],[114.802934,16.215135],[114.704383,16.199044],[114.703151,16.170307]]],[[[114.777064,8.114079],[114.812173,8.110524],[114.818332,8.141332],[114.791847,8.160882],[114.777064,8.114079]]],[[[114.819564,7.192957],[114.869455,7.198895],[114.854057,7.244611],[114.819564,7.192957]]],[[[114.868223,7.983715],[114.907643,7.951117],[114.914419,8.00742],[114.883006,8.011569],[114.868223,7.983715]]],[[[114.895325,16.036336],[114.910723,16.001823],[114.926122,16.036911],[114.895325,16.036336]]],[[[114.910723,10.863298],[114.931049,10.841551],[114.959998,10.902087],[114.934129,10.902674],[114.910723,10.863298]]],[[[114.948911,7.508722],[114.960614,7.484988],[115.012353,7.484988],[115.013585,7.525928],[114.948911,7.508722]]],[[[114.985252,11.078332],[115.013585,11.063062],[115.021592,11.085967],[114.985252,11.078332]]],[[[115.16757,8.386523],[115.18112,8.345668],[115.235939,8.321982],[115.285214,8.314876],[115.315395,8.356326],[115.299381,8.370537],[115.202678,8.395403],[115.16757,8.386523]]],[[[115.240527,-6.86123],[115.377051,-6.970801],[115.546094,-6.938672],[115.240527,-6.86123]]],[[[115.258113,8.509652],[115.271048,8.477098],[115.296301,8.510836],[115.258113,8.509652]]],[[[115.28275,10.191951],[115.288294,10.172513],[115.333257,10.200198],[115.28891,10.211388],[115.28275,10.191951]]],[[[115.361591,13.948985],[115.397315,13.92517],[115.438583,13.943757],[115.423185,13.977443],[115.377605,13.968732],[115.361591,13.948985]]],[[[115.436119,9.393447],[115.450286,9.345028],[115.469996,9.3592],[115.456445,9.417064],[115.436119,9.393447]]],[[[115.500177,9.897897],[115.54822,9.869007],[115.585177,9.896128],[115.581481,9.917351],[115.518039,9.933857],[115.500177,9.897897]]],[[[115.509416,8.490712],[115.521735,8.460523],[115.55438,8.461115],[115.569162,8.49012],[115.558691,8.523265],[115.514344,8.519122],[115.509416,8.490712]]],[[[115.52706908,7.15393736],[115.52732596,7.15081924],[115.52853383,7.1479331],[115.53057445,7.14556148],[115.53324806,7.14393652],[115.53629295,7.14321728],[115.53941108,7.14347417],[115.54229721,7.14468204],[115.54466883,7.14672265],[116.2504858,7.979279],[116.25211077,7.98195261],[116.25283001,7.9849975],[116.25257312,7.98811563],[116.25136525,7.99100176],[116.24932463,7.99337338],[116.24665102,7.99499834],[116.24360613,7.99571758],[116.240488,7.99546069],[116.23760187,7.99425282],[116.23523025,7.99221221],[115.52941328,7.15965587],[115.52778832,7.15698226],[115.52706908,7.15393736]]],[[[115.758256,10.461018],[115.776118,10.434534],[115.801987,10.463372],[115.758256,10.461018]]],[[[115.782277,10.541046],[115.795212,10.499858],[115.805067,10.524571],[115.782277,10.541046]]],[[[115.834632,22.722143],[115.835248,22.722695],[115.834632,22.723247],[115.834632,22.722143]]],[[[115.837712,9.709775],[115.861117,9.694438],[115.867277,9.650191],[115.901153,9.67084],[115.925791,9.781734],[115.901153,9.795888],[115.870972,9.778785],[115.837712,9.709775]]],[[[115.857324,-8.787891],[116.586523,-8.886133],[116.64082,-8.613867],[116.718945,-8.336035],[116.401563,-8.204199],[115.857324,-8.787891]]],[[[115.926407,9.311366],[115.943037,9.269433],[115.976298,9.268252],[115.999088,9.293649],[115.97753,9.321997],[115.926407,9.311366]]],[[[115.926407,20.981411],[115.939342,20.945644],[115.970139,20.919373],[115.999088,20.922727],[116.000936,20.948439],[115.954124,20.99985],[115.926407,20.981411]]],[[[115.943037,21.097592],[115.953508,21.064088],[115.989233,21.035603],[116.040356,21.02052],[116.067457,21.04063],[116.044051,21.110434],[116.024341,21.12439],[115.965211,21.123832],[115.943037,21.097592]]],[[[116.045283,10.095338],[116.067457,10.065876],[116.09579,10.09357],[116.070537,10.12892],[116.045283,10.095338]]],[[[116.058789,-4.006934],[116.30332,-3.868164],[116.269727,-3.251074],[116.058789,-4.006934]]],[[[116.152457,9.579384],[116.189413,9.565221],[116.187565,9.595317],[116.152457,9.579384]]],[[[116.273181,8.879392],[116.294123,8.858105],[116.332311,8.901269],[116.305826,8.917233],[116.273181,8.879392]]],[[[116.457347,9.174326],[116.477057,9.137103],[116.500462,9.164282],[116.457347,9.174326]]],[[[116.461658,10.34918],[116.467202,10.309144],[116.511549,10.297957],[116.566368,10.304434],[116.644592,10.335051],[116.637817,10.365076],[116.514629,10.34918],[116.542346,10.41982],[116.526332,10.426883],[116.48876,10.395686],[116.461658,10.34918]]],[[[116.469665,9.810041],[116.47952,9.785272],[116.50847,9.79117],[116.490607,9.821246],[116.469665,9.810041]]],[[[116.557129,9.745167],[116.566368,9.718623],[116.593469,9.723932],[116.557129,9.745167]]],[[[116.638433,10.503977],[116.653215,10.491031],[116.70865,10.492797],[116.699411,10.517511],[116.638433,10.503977]]],[[[116.695099,16.345538],[116.708034,16.299591],[116.738831,16.303612],[116.747454,16.360469],[116.717889,16.373676],[116.695099,16.345538]]],[[[116.699411,9.049053],[116.70865,9.024229],[116.740679,9.028367],[116.749302,9.056736],[116.699411,9.049053]]],[[[116.727128,11.501473],[116.765316,11.430504],[116.772092,11.445755],[116.738215,11.514961],[116.727128,11.501473]]],[[[116.749302,20.600958],[116.796113,20.582471],[116.862635,20.588633],[116.905135,20.619443],[116.934084,20.676565],[116.925461,20.726949],[116.88604,20.775638],[116.820135,20.780674],[116.769628,20.771721],[116.761005,20.750456],[116.87249,20.738143],[116.889736,20.683284],[116.849084,20.628405],[116.749302,20.600958]]],[[[116.788477,-9.006348],[119.129687,-8.668164],[118.926172,-8.297656],[118.242383,-8.317773],[117.755273,-8.149512],[118.234863,-8.591895],[117.969531,-8.728027],[117.164844,-8.367188],[116.835059,-8.532422],[116.788477,-9.006348]]],[[[116.832454,10.476908],[116.855243,10.468669],[116.868794,10.495739],[116.832454,10.476908]]],[[[116.944555,23.440061],[116.951946,23.419744],[117.027091,23.41535],[117.050496,23.400522],[117.081909,23.409309],[117.124409,23.389537],[117.142887,23.400522],[117.142887,23.459826],[117.129336,23.483431],[117.093612,23.459277],[117.058503,23.47355],[117.029554,23.443356],[117.024627,23.437865],[116.982743,23.460924],[116.944555,23.440061]]],[[[117.187235,10.741612],[117.206945,10.707507],[117.21372,10.735144],[117.187235,10.741612]]],[[[117.258068,10.320331],[117.299336,10.313855],[117.299952,10.343293],[117.274698,10.358011],[117.258068,10.320331]]],[[[117.264227,11.063062],[117.284553,11.02547],[117.304263,11.027232],[117.299336,11.077745],[117.264227,11.063062]]],[[[117.266691,10.69163],[117.348611,10.672811],[117.404661,10.671047],[117.418212,10.702803],[117.369553,10.7422],[117.293176,10.735144],[117.266691,10.69163]]],[[[117.311133,8.4396],[119.686914,10.500342],[119.55332,11.313525],[119.223828,10.477295],[117.349902,8.713574],[117.311133,8.4396]]],[[[117.347995,10.090624],[117.354154,10.06293],[117.385567,10.063519],[117.373864,10.106532],[117.347995,10.090624]]],[[[117.649023,4.168994],[117.736816,4.004004],[117.884766,4.186133],[117.649023,4.168994]]],[[[117.653501,11.046029],[117.655965,11.024882],[117.690457,11.016658],[117.691073,11.048965],[117.653501,11.046029]]],[[[117.708319,15.182712],[117.712631,15.118592],[117.726798,15.105303],[117.827812,15.111659],[117.72495,15.131302],[117.720638,15.195418],[117.74466,15.217941],[117.784696,15.16885],[117.838899,15.15903],[117.782848,15.187333],[117.748355,15.230068],[117.715095,15.222561],[117.708319,15.182712]]],[[[117.770529,10.773361],[117.798862,10.753371],[117.835819,10.803931],[117.831507,10.838612],[117.801942,10.839788],[117.775457,10.809222],[117.770529,10.773361]]],[[[118.230636,24.401228],[118.273752,24.441007],[118.233716,24.445911],[118.230636,24.401228]]],[[[118.282375,24.413218],[118.329802,24.382152],[118.353208,24.415398],[118.405563,24.427931],[118.457918,24.412128],[118.477012,24.437738],[118.451758,24.506915],[118.412338,24.514538],[118.374766,24.458986],[118.318715,24.486765],[118.298389,24.477506],[118.31194,24.424661],[118.282375,24.413218]]],[[[118.52385237,10.909443],[118.52463726,10.90641436],[118.52631962,10.9037765],[118.5287348,10.90178762],[118.53164636,10.90064241],[118.53476931,10.90045298],[118.53779795,10.90123786],[118.54043581,10.90292022],[118.54242469,10.9053354],[118.70409227,11.18010771],[118.70476212,11.18147468],[118.87431591,11.606662],[118.87459939,11.60747236],[118.98894963,11.98573108],[118.98937534,11.98883067],[118.9888224,11.99191011],[118.98734492,11.99466796],[118.98508753,11.99683427],[118.98227119,11.99819697],[118.9791716,11.99862269],[118.97609216,11.99806975],[118.97333431,11.99659227],[118.97116801,11.99433487],[118.9698053,11.99151854],[118.85557939,11.6136711],[118.68646749,11.18959191],[118.52518702,10.91547751],[118.52404181,10.91256595],[118.52385237,10.909443]]],[[[118.783301,-2.720801],[118.867676,-3.398047],[119.46748,-3.512988],[119.623633,-4.034375],[119.360352,-5.31416],[119.557422,-5.611035],[120.430371,-5.591016],[120.261035,-2.949316],[120.653613,-2.667578],[121.052148,-2.75166],[120.891797,-3.520605],[121.618066,-4.092676],[121.588672,-4.75957],[122.038086,-4.832422],[122.114258,-4.540234],[122.872266,-4.391992],[122.847949,-4.064551],[122.25293,-3.62041],[122.291699,-2.907617],[121.355469,-1.878223],[122.250684,-1.555273],[122.902832,-.900977],[123.37793,-1.004102],[123.43418,-.778223],[123.171484,-.570703],[121.969629,-.933301],[121.575586,-.828516],[121.148535,-1.339453],[120.667383,-1.370117],[120.062891,-.555566],[120.192285,.268506],[120.579004,.52832],[123.753809,.305518],[124.427539,.470605],[124.888867,.995312],[125.233789,1.502295],[125.110938,1.685693],[123.930762,.850439],[122.838281,.845703],[121.081738,1.327637],[120.602539,.854395],[120.269531,.970801],[119.721875,-.088477],[119.844336,-.861914],[119.711328,-.680762],[119.508203,-.906738],[119.321875,-1.929688],[118.783301,-2.720801]]],[[[118.82009,39.108576],[118.857662,39.098824],[118.869365,39.142932],[118.82009,39.108576]]],[[[118.958789,-9.519336],[120.144824,-10.200098],[120.698047,-10.206641],[120.784473,-9.957031],[120.0125,-9.374707],[118.958789,-9.519336]]],[[[119.0521839,15.00781004],[119.05262758,15.00471297],[119.05400659,15.00190458],[119.05618595,14.99965979],[119.05895232,14.99819832],[119.06203491,14.99766324],[119.06513198,14.99810691],[119.06794036,14.99948592],[119.07018516,15.00166528],[119.07164663,15.00443165],[119.07218171,15.00751424],[119.0726746,15.04083704],[119.0726757,15.04098494],[119.0726757,16.04388528],[119.07218626,16.04697545],[119.07076587,16.04976313],[119.06855355,16.05197545],[119.06576587,16.05339584],[119.0626757,16.05388528],[119.05958553,16.05339584],[119.05679784,16.05197545],[119.05458553,16.04976313],[119.05316513,16.04697545],[119.0526757,16.04388528],[119.0526757,15.04105889],[119.0521839,15.00781004]]],[[[119.421247,23.216949],[119.436029,23.186146],[119.453275,23.216399],[119.421247,23.216949]]],[[[119.44342,25.238806],[119.444036,25.20199],[119.471138,25.197116],[119.507478,25.183036],[119.52534,25.157579],[119.549362,25.161912],[119.566608,25.210112],[119.540739,25.20199],[119.501319,25.21715],[119.473601,25.259916],[119.44342,25.238806]]],[[[119.45495876,18.01053737],[119.45584765,18.00753761],[119.45762002,18.00495935],[119.46010237,18.00305497],[119.4630517,18.00201089],[119.46617933,18.0019293],[119.46917909,18.0028182],[119.47175735,18.00459056],[119.47366172,18.00707291],[120.02569734,19.02403788],[120.02674143,19.02698721],[120.02682302,19.03011484],[120.02593412,19.0331146],[120.02416175,19.03569286],[120.02167941,19.03759723],[120.01873007,19.03864132],[120.01560245,19.03872291],[120.01260269,19.03783401],[120.01002443,19.03606165],[120.00812005,19.0335793],[119.45608443,18.01661433],[119.45504035,18.01366499],[119.45495876,18.01053737]]],[[[119.47237,23.556962],[119.519181,23.559705],[119.52534,23.62497],[119.506246,23.625518],[119.506246,23.577259],[119.47237,23.556962]]],[[[119.495159,23.349982],[119.516717,23.349982],[119.497623,23.38679],[119.495159,23.349982]]],[[[119.557369,23.666634],[119.608492,23.620035],[119.615268,23.661153],[119.586318,23.675952],[119.557369,23.666634]]],[[[119.562297,23.530627],[119.578927,23.502641],[119.609108,23.503738],[119.646064,23.550928],[119.691028,23.547087],[119.678093,23.600294],[119.61034,23.604132],[119.601717,23.575613],[119.566608,23.584937],[119.562297,23.530627]]],[[[119.580159,25.627398],[119.611572,25.669479],[119.580775,25.650059],[119.580159,25.627398]]],[[[119.651608,26.657269],[119.668238,26.628383],[119.720593,26.635873],[119.758781,26.659408],[119.748926,26.681334],[119.712586,26.6685],[119.673782,26.680799],[119.651608,26.657269]]],[[[119.662079,25.646822],[119.673782,25.632794],[119.718745,25.634952],[119.716898,25.664624],[119.662079,25.646822]]],[[[119.760629,26.613402],[119.776644,26.600025],[119.818527,26.616613],[119.796354,26.630523],[119.760629,26.613402]]],[[[119.772559,16.255127],[120.082129,14.851074],[120.43877,14.453369],[120.583691,14.88125],[120.941309,14.645068],[120.637109,13.804492],[121.344141,13.649121],[121.77793,13.937646],[122.599902,13.194141],[122.595215,13.907617],[123.310938,13.044092],[123.948535,12.916406],[124.059766,12.56709],[124.142773,13.035791],[123.785156,13.110547],[123.549609,13.645752],[123.815723,13.837109],[123.320312,14.06167],[123.101953,13.750244],[122.627148,14.317529],[122.199707,14.148047],[122.211719,13.930176],[121.766602,14.168066],[121.392285,15.324414],[121.595313,15.933252],[122.135156,16.184814],[122.519141,17.124854],[122.152344,17.664404],[122.265527,18.458838],[121.845605,18.29541],[121.101562,18.615283],[120.599707,18.507861],[120.36875,16.10957],[119.772559,16.255127]]],[[[119.80791,-8.697656],[121.035254,-8.935449],[122.78291,-8.611719],[122.916992,-8.105566],[122.323242,-8.62832],[120.610254,-8.24043],[119.874805,-8.419824],[119.80791,-8.697656]]],[[[119.885742,12.299854],[120.010547,12.008252],[120.314551,12.012402],[120.1,12.167676],[119.885742,12.299854]]],[[[119.906607,26.68989],[119.926933,26.664756],[119.950954,26.692563],[119.906607,26.68989]]],[[[119.919542,26.172208],[119.929397,26.134067],[119.960194,26.146961],[119.919542,26.172208]]],[[[119.970665,26.217852],[119.976824,26.191005],[120.016244,26.217316],[119.998998,26.235569],[119.970665,26.217852]]],[[[120.018708,23.073322],[120.029795,23.048544],[120.133272,23.000625],[120.149287,22.896468],[120.20041,22.721039],[120.274323,22.560307],[120.297112,22.531565],[120.443706,22.441432],[120.517619,22.408793],[120.569973,22.361757],[120.640806,22.241605],[120.659285,22.154056],[120.661748,22.067007],[120.651277,22.033171],[120.667908,21.983235],[120.701784,21.927174],[120.743052,21.915515],[120.781857,21.923843],[120.854537,21.883309],[120.873016,21.897191],[120.86624,21.984345],[120.907508,22.033171],[120.912436,22.086418],[120.903197,22.12634],[120.914899,22.302525],[120.981421,22.528248],[121.014682,22.584069],[121.03316,22.650914],[121.078739,22.669691],[121.170514,22.723247],[121.21055,22.770711],[121.237652,22.836362],[121.276456,22.877171],[121.324499,22.945526],[121.35468,23.00999],[121.370695,23.084334],[121.409499,23.1025],[121.430441,23.137175],[121.415042,23.196047],[121.440296,23.271937],[121.479716,23.322507],[121.497578,23.419744],[121.5216,23.483431],[121.522832,23.538858],[121.587505,23.760878],[121.621382,23.920718],[121.65957,24.007125],[121.63986,24.064514],[121.643556,24.097843],[121.678048,24.133895],[121.689135,24.174303],[121.809243,24.339083],[121.82649,24.423572],[121.867758,24.47914],[121.88562,24.529784],[121.892395,24.617953],[121.86283,24.671261],[121.841272,24.734329],[121.844968,24.836476],[121.933047,24.938539],[122.012503,25.001471],[121.98109,25.030757],[121.947214,25.031841],[121.917033,25.138076],[121.841888,25.135367],[121.782142,25.160287],[121.745186,25.161912],[121.707613,25.191701],[121.700222,25.226896],[121.655259,25.242054],[121.62323,25.29455],[121.585041,25.309159],[121.53515,25.307535],[121.444607,25.27074],[121.413194,25.238806],[121.371926,25.159746],[121.319572,25.140785],[121.209318,25.12724],[121.132942,25.078466],[121.102145,25.075214],[121.024537,25.040517],[121.009754,24.993878],[120.961095,24.940167],[120.914899,24.864715],[120.89211,24.767482],[120.82374,24.688118],[120.762147,24.658208],[120.68885,24.600542],[120.642654,24.490033],[120.589068,24.43229],[120.546568,24.370159],[120.520698,24.311816],[120.470807,24.242533],[120.451713,24.182493],[120.391967,24.118055],[120.316206,23.984708],[120.278018,23.92783],[120.245989,23.840276],[120.175156,23.807427],[120.102476,23.701162],[120.095084,23.58768],[120.12157,23.504836],[120.108019,23.341191],[120.081534,23.291728],[120.018708,23.073322]]],[[[120.034106,26.488667],[120.066751,26.498308],[120.071679,26.521336],[120.035954,26.515981],[120.034106,26.488667]]],[[[120.117874,26.568984],[120.135736,26.550784],[120.167149,26.571661],[120.153598,26.604841],[120.117874,26.568984]]],[[[120.140048,26.795176],[120.163454,26.798381],[120.161606,26.803189],[120.150519,26.798916],[120.140048,26.795176]]],[[[120.159142,35.765198],[120.169613,35.740428],[120.193019,35.756942],[120.172077,35.785591],[120.159142,35.765198]]],[[[120.319286,26.944654],[120.360554,26.916909],[120.394431,26.933984],[120.363018,26.967592],[120.327909,26.963858],[120.319286,26.944654]]],[[[120.338477,13.412354],[121.236719,12.218799],[121.540625,12.638184],[121.522754,13.131201],[121.202734,13.432324],[120.704395,13.479492],[120.338477,13.412354]]],[[[120.355011,22.327439],[120.395663,22.342385],[120.383344,22.355669],[120.355011,22.327439]]],[[[120.477344,-5.775293],[120.487305,-6.464844],[120.52832,-6.298438],[120.477344,-5.775293]]],[[[120.602002,37.978678],[120.62664,37.94565],[120.631567,37.981037],[120.602002,37.978678]]],[[[120.692545,37.983867],[120.732581,37.961694],[120.724574,37.987641],[120.692545,37.983867]]],[[[120.721495,37.917328],[120.76461,37.895134],[120.76461,37.923937],[120.729502,37.947065],[120.721495,37.917328]]],[[[120.742436,38.199116],[120.750444,38.150188],[120.7874,38.158658],[120.742436,38.199116]]],[[[120.774465,40.48016],[120.786784,40.473787],[120.83298,40.491995],[120.8299,40.516112],[120.805262,40.525666],[120.774465,40.48016]]],[[[120.802183,38.284193],[120.848378,38.305799],[120.816349,38.318008],[120.802183,38.284193]]],[[[120.876367,5.952637],[121.411035,5.939844],[121.159375,6.075635],[120.876367,5.952637]]],[[[120.895189,38.36307],[120.918595,38.345236],[120.914899,38.373393],[120.895189,38.36307]]],[[[120.950624,36.414684],[120.990044,36.413239],[120.978341,36.428649],[120.950624,36.414684]]],[[[121.038087,27.948942],[121.098449,27.937311],[121.152652,27.961629],[121.120623,27.986471],[121.0695,27.984357],[121.038087,27.948942]]],[[[121.044247,27.979072],[121.089826,27.998625],[121.073812,28.007608],[121.044247,27.979072]]],[[[121.066421,27.461483],[121.107073,27.443958],[121.067036,27.478475],[121.066421,27.478475],[121.066421,27.461483]]],[[[121.15437729,20.81255297],[121.15465558,20.80943668],[121.15588324,20.80655891],[121.1579401,20.80420136],[121.1606248,20.8025948],[121.16367457,20.80189649],[121.16679085,20.80217478],[121.16966862,20.80340244],[121.17202617,20.8054593],[121.90938804,21.68743347],[121.9109946,21.69011818],[121.91169291,21.69316794],[121.91141462,21.69628423],[121.91018696,21.699162],[121.9081301,21.70151955],[121.9054454,21.70312611],[121.90239563,21.70382443],[121.89927934,21.70354613],[121.89640158,21.70231847],[121.89404403,21.70026162],[121.15668216,20.81828744],[121.1550756,20.81560273],[121.15437729,20.81255297]]],[[[121.17113,27.978543],[121.185913,27.963215],[121.237652,27.988056],[121.197616,28.000739],[121.17113,27.978543]]],[[[121.197616,27.618025],[121.198848,27.616964],[121.203775,27.625979],[121.201311,27.623328],[121.197616,27.618025]]],[[[121.468013,22.67687],[121.474788,22.643734],[121.513592,22.631582],[121.514824,22.676318],[121.468013,22.67687]]],[[[121.485875,37.578509],[121.487723,37.578035],[121.487723,37.577561],[121.488955,37.578035],[121.488955,37.578509],[121.485875,37.578509]]],[[[121.488955,37.578035],[121.489571,37.577086],[121.489571,37.578509],[121.488955,37.578035]]],[[[121.507433,22.048704],[121.533918,22.022076],[121.594281,21.995443],[121.604752,22.022631],[121.575186,22.037055],[121.575802,22.0842],[121.510513,22.086972],[121.507433,22.048704]]],[[[121.509897,31.4824],[121.572107,31.435944],[121.727939,31.35472],[121.76428,31.31536],[121.785222,31.31127],[121.795693,31.330186],[121.792613,31.363408],[121.742106,31.407345],[121.585657,31.454836],[121.567179,31.48342],[121.520984,31.494137],[121.509897,31.4824]]],[[[121.579498,31.479848],[121.626925,31.445135],[121.631853,31.456878],[121.579498,31.479848]]],[[[121.704688,-10.555664],[121.883008,-10.590332],[121.99834,-10.446973],[121.704688,-10.555664]]],[[[121.790765,29.082144],[121.832649,29.050236],[121.84312,29.082144],[121.82033,29.099402],[121.790765,29.082144]]],[[[121.792613,31.377715],[121.801852,31.356765],[121.8037,31.328652],[121.840656,31.295418],[121.932431,31.283144],[122.016199,31.282121],[122.097503,31.255522],[122.122756,31.307179],[122.116597,31.320984],[122.040837,31.324051],[121.951525,31.337343],[121.845584,31.37465],[121.792613,31.377715]]],[[[121.808496,-5.256152],[122.042969,-5.437988],[121.913672,-5.072266],[121.808496,-5.256152]]],[[[121.832031,6.664062],[122.092871,6.42832],[122.323535,6.602246],[121.832031,6.664062]]],[[[121.837577,28.770484],[121.86283,28.782024],[121.861598,28.814016],[121.837577,28.770484]]],[[[121.839844,15.038135],[121.933008,14.656055],[122.033496,15.005029],[121.839844,15.038135]]],[[[121.84004,30.047211],[121.844968,29.982953],[121.850511,29.977251],[121.874533,29.964809],[121.933047,29.994875],[121.924424,30.052391],[121.88562,30.094859],[121.848663,30.101072],[121.84004,30.047211]]],[[[121.869605,28.423685],[121.910873,28.44],[121.889931,28.45105],[121.869605,28.423685]]],[[[121.881924,28.502603],[121.889315,28.471569],[121.918881,28.497344],[121.881924,28.502603]]],[[[121.88254,31.240684],[121.909026,31.195133],[121.923808,31.234032],[121.88254,31.240684]]],[[[121.910257,30.089163],[121.945982,30.064304],[121.962612,30.106249],[121.940438,30.114533],[121.910257,30.089163]]],[[[121.914844,13.540332],[122.004883,13.20498],[122.114551,13.463184],[121.914844,13.540332]]],[[[121.916016,11.854346],[122.103516,11.64292],[121.954004,10.444385],[122.769922,10.823828],[123.119531,11.286816],[123.158301,11.535547],[122.496191,11.615088],[121.916016,11.854346]]],[[[121.921344,30.30744],[121.957685,30.287804],[122.0008,30.308473],[121.989098,30.339985],[121.94167,30.33327],[121.921344,30.30744]]],[[[121.934895,30.161631],[121.983554,30.100554],[121.989714,30.077252],[121.978011,30.059125],[122.027902,29.991247],[122.106742,30.005759],[122.118445,29.986582],[122.163408,29.988137],[122.239785,29.962735],[122.279205,29.937326],[122.322321,29.940438],[122.341415,29.976733],[122.343879,30.020269],[122.310002,30.039958],[122.290908,30.074663],[122.301379,30.086574],[122.293988,30.100554],[122.152938,30.113497],[122.095655,30.158008],[122.048844,30.147141],[121.955221,30.183878],[121.934895,30.161631]]],[[[121.943518,31.215608],[121.959533,31.159291],[121.995873,31.160828],[122.008808,31.221238],[121.950909,31.228915],[121.943518,31.215608]]],[[[121.964258,6.968213],[122.616211,7.763135],[123.390918,7.40752],[123.66582,7.817773],[124.206641,7.396436],[123.985254,6.993701],[124.078125,6.404443],[124.927344,5.875342],[125.231543,6.069531],[125.346484,5.598975],[125.667969,5.978662],[125.380664,6.689941],[125.689258,7.263037],[125.824414,7.333301],[126.189355,6.309668],[126.19209,6.852539],[126.581543,7.247754],[126.458691,8.202832],[126.139551,8.595654],[126.30459,8.952051],[126.005957,9.320947],[125.471289,9.756787],[125.49873,9.014746],[124.868945,8.972266],[124.731152,8.562988],[124.404883,8.599854],[123.799414,8.049121],[123.849219,8.432715],[123.43457,8.70332],[122.911133,8.156445],[122.243359,7.945117],[121.964258,6.968213]]],[[[122.011271,29.746294],[122.02975,29.716673],[122.038373,29.759284],[122.011271,29.746294]]],[[[122.013119,29.151681],[122.056851,29.158476],[122.075945,29.176243],[122.036525,29.20759],[122.026054,29.178333],[122.013119,29.151681]]],[[[122.013965,12.105615],[122.094043,12.354883],[122.14502,12.652637],[122.013965,12.105615]]],[[[122.017431,30.186464],[122.025438,30.161631],[122.065474,30.179739],[122.055619,30.200431],[122.017431,30.186464]]],[[[122.029134,29.954957],[122.043916,29.930584],[122.058699,29.955994],[122.029134,29.954957]]],[[[122.047612,29.719791],[122.074097,29.701599],[122.095655,29.716673],[122.138155,29.662083],[122.182503,29.650642],[122.211452,29.692241],[122.200365,29.712515],[122.146778,29.749412],[122.13138,29.788893],[122.083952,29.78318],[122.047612,29.719791]]],[[[122.058083,30.291938],[122.154169,30.244903],[122.231778,30.234562],[122.247176,30.30124],[122.228082,30.329654],[122.191126,30.329654],[122.176343,30.351863],[122.162793,30.329654],[122.058083,30.291938]]],[[[122.066706,25.6247],[122.087032,25.61067],[122.092575,25.639268],[122.066706,25.6247]]],[[[122.097503,25.499987],[122.110438,25.465952],[122.122141,25.495666],[122.097503,25.499987]]],[[[122.143698,30.163183],[122.168336,30.138343],[122.213915,30.186464],[122.178807,30.199396],[122.152938,30.19112],[122.143698,30.163183]]],[[[122.152322,29.97103],[122.155401,29.970512],[122.18435,29.955476],[122.192974,29.965327],[122.163408,29.988137],[122.152322,29.97103]]],[[[122.200365,29.969475],[122.233626,29.946661],[122.273662,29.93214],[122.239785,29.960142],[122.200365,29.969475]]],[[[122.210836,29.700559],[122.269966,29.685482],[122.231162,29.710435],[122.229314,29.711995],[122.210836,29.700559]]],[[[122.2133,29.771752],[122.251488,29.731225],[122.287828,29.723949],[122.301379,29.748373],[122.258263,29.753569],[122.241633,29.784738],[122.2133,29.771752]]],[[[122.221307,29.832512],[122.248408,29.804473],[122.310002,29.766557],[122.325401,29.781621],[122.299531,29.819532],[122.319241,29.829397],[122.265038,29.84549],[122.221307,29.832512]]],[[[122.253952,30.237147],[122.28017962597609,30.242651169197263],[122.358661,30.236113],[122.365437,30.255242],[122.417175,30.238699],[122.40732,30.272817],[122.333408,30.272817],[122.317393,30.249556],[122.2944070951352,30.24563696736184],[122.315545,30.250073],[122.300147,30.271266],[122.264423,30.269716],[122.253952,30.237147]]],[[[122.277973,30.471603],[122.281669,30.418461],[122.318625,30.407106],[122.352502,30.422074],[122.43011,30.408655],[122.432574,30.445294],[122.37406,30.461802],[122.277973,30.471603]]],[[[122.282901,29.860542],[122.30877,29.849642],[122.343263,29.860542],[122.343263,29.882857],[122.301379,29.883895],[122.282901,29.860542]]],[[[122.283105,-5.319531],[122.645117,-5.269434],[122.701953,-4.618652],[122.368945,-4.767188],[122.283105,-5.319531]]],[[[122.318625,39.170775],[122.345111,39.144788],[122.366053,39.174951],[122.398697,39.16196],[122.383299,39.190723],[122.393154,39.213448],[122.343263,39.203246],[122.322321,39.177271],[122.322937,39.174487],[122.319241,39.172167],[122.318625,39.170775]]],[[[122.330944,29.937845],[122.338951,29.911911],[122.353734,29.89946],[122.362973,29.894272],[122.372212,29.893234],[122.386379,29.834069],[122.415944,29.828877],[122.401777,29.869884],[122.433806,29.883376],[122.43319,29.919173],[122.411632,29.951846],[122.398081,29.9394],[122.351886,29.959105],[122.330944,29.937845]]],[[[122.3679,29.980361],[122.391306,29.970512],[122.411632,30.025969],[122.378371,30.023896],[122.3679,29.980361]]],[[[122.399512,9.823047],[123.130859,9.064111],[123.320508,9.272949],[123.162012,9.864258],[123.567578,10.780762],[123.256641,10.993945],[122.983301,10.886621],[122.855566,10.086914],[122.399512,9.823047]]],[[[122.427031,30.697777],[122.532972,30.696748],[122.528045,30.725047],[122.475074,30.714243],[122.445509,30.745109],[122.427646,30.738422],[122.427031,30.697777]]],[[[122.445509,29.952365],[122.446741,29.951327],[122.447972,29.947698],[122.459059,29.950809],[122.458443,29.951846],[122.455364,29.955994],[122.454132,29.956513],[122.447972,29.955994],[122.445509,29.952365]]],[[[122.449204,29.9394],[122.4529,29.936807],[122.452284,29.935252],[122.45598,29.926435],[122.457827,29.927472],[122.462755,29.927991],[122.467067,29.928509],[122.459059,29.938882],[122.461523,29.944068],[122.459675,29.944586],[122.460291,29.947179],[122.451668,29.943031],[122.451052,29.940956],[122.450436,29.940956],[122.449204,29.9394]]],[[[122.470762,29.925916],[122.473226,29.925397],[122.47261,29.927472],[122.471378,29.927472],[122.470762,29.925916]]],[[[122.49897813,23.46254804],[122.49967552,23.45949807],[122.50128127,23.45681287],[122.5036382,23.45475531],[122.5065156,23.45352678],[122.50963181,23.45324755],[122.51268178,23.45394494],[122.51536697,23.45555069],[122.51742454,23.45790762],[122.51865306,23.46078502],[122.79861399,24.57367379],[122.79889322,24.57678999],[122.79819583,24.57983997],[122.79659008,24.58252516],[122.79423315,24.58458272],[122.79135575,24.58581125],[122.78823955,24.58609049],[122.78518957,24.5853931],[122.78250438,24.58378734],[122.78044682,24.58143041],[122.77921829,24.57855302],[122.49925737,23.46566424],[122.49897813,23.46254804]]],[[[122.502175,39.224112],[122.547755,39.229211],[122.503407,39.241263],[122.502175,39.224112]]],[[[122.50895,39.290377],[122.57732,39.269994],[122.67895,39.268605],[122.673406,39.269531],[122.662935,39.273701],[122.655544,39.277407],[122.640761,39.288061],[122.63953,39.286209],[122.593334,39.278334],[122.539131,39.308439],[122.50895,39.290377]]],[[[122.546523,30.651967],[122.570544,30.644244],[122.559457,30.679764],[122.546523,30.651967]]],[[[122.628443,39.231993],[122.690037,39.234774],[122.691268,39.23431],[122.691884,39.23292],[122.696812,39.206492],[122.751631,39.229675],[122.740544,39.248679],[122.635834,39.241727],[122.628443,39.231993]]],[[[122.64502,-5.663379],[123.187305,-5.333008],[122.97168,-5.138477],[123.179785,-4.551172],[123.074609,-4.386914],[122.85332,-4.618359],[122.64502,-5.663379]]],[[[122.704819,39.044463],[122.733152,39.014244],[122.75779,39.009594],[122.739312,39.036561],[122.738696,39.034701],[122.704819,39.044463]]],[[[122.757174,30.713728],[122.781196,30.694175],[122.799674,30.716301],[122.778732,30.729677],[122.757174,30.713728]]],[[[122.760254,30.141966],[122.784275,30.130062],[122.781196,30.13265],[122.778116,30.13679],[122.770725,30.138861],[122.763333,30.141966],[122.762101,30.142484],[122.760254,30.141966]]],[[[122.807681,30.714243],[122.836014,30.698806],[122.831087,30.728648],[122.807681,30.714243]]],[[[122.845703,-10.761816],[122.948926,-10.909277],[123.418164,-10.65127],[123.371094,-10.474902],[122.845703,-10.761816]]],[[[122.89043,-1.587207],[123.150391,-1.304492],[123.172949,-1.616016],[123.511914,-1.447363],[123.212305,-1.171289],[122.908008,-1.182227],[122.89043,-1.587207]]],[[[122.945035,39.520198],[122.995542,39.495264],[123.036194,39.533123],[123.022644,39.546507],[122.96105,39.551122],[122.945035,39.520198]]],[[[122.95752,13.107178],[123.367188,12.70083],[123.281836,12.853418],[122.95752,13.107178]]],[[[122.969043,-4.02998],[123.076172,-4.227148],[123.242383,-4.112988],[122.969043,-4.02998]]],[[[123.054057,39.457847],[123.086702,39.426881],[123.090397,39.450915],[123.054057,39.457847]]],[[[123.143984,39.038885],[123.160614,39.025404],[123.205578,39.057011],[123.20065,39.077921],[123.145832,39.091857],[123.143984,39.038885]]],[[[123.157813,11.925635],[123.47373,12.21665],[124.045508,11.752441],[123.716602,12.287354],[123.236426,12.583496],[123.157813,11.925635]]],[[[123.230078,-8.530664],[123.924805,-8.272461],[123.391211,-8.280469],[123.230078,-8.530664]]],[[[123.370313,9.449609],[124.00498,10.400098],[124.038867,11.273535],[123.38623,9.96709],[123.370313,9.449609]]],[[[123.445178,25.726102],[123.469816,25.712623],[123.50862,25.722867],[123.512316,25.755212],[123.479055,25.768687],[123.445794,25.749822],[123.445178,25.726102]]],[[[123.572461,-12.423926],[123.573145,-12.43418],[123.594531,-12.425684],[123.572461,-12.423926]]],[[[123.589258,-9.966797],[123.747266,-10.347168],[124.427539,-10.148633],[125.068164,-9.511914],[127.296094,-8.424512],[125.381836,-8.575391],[124.922266,-8.94248],[124.444434,-9.190332],[124.036328,-9.341602],[123.589258,-9.966797]]],[[[123.666916,25.914114],[123.706952,25.91519],[123.689706,25.939949],[123.666916,25.914114]]],[[[123.716807,39.74512],[123.756843,39.754322],[123.719887,39.763063],[123.716807,39.74512]]],[[[123.817187,9.817383],[124.122461,9.599316],[124.593848,9.787207],[124.335742,10.159912],[123.817187,9.817383]]],[[[124.038867,13.663135],[124.353613,13.632227],[124.224902,14.077588],[124.038867,13.663135]]],[[[124.294727,12.569336],[124.445703,12.152783],[124.99502,11.764941],[125.034277,11.34126],[125.735645,11.049609],[125.535645,12.191406],[125.239551,12.527881],[124.294727,12.569336]]],[[[124.329688,-1.858887],[125.314063,-1.877148],[124.969531,-1.705469],[124.417578,-1.659277],[124.329688,-1.858887]]],[[[124.330664,11.535205],[124.445508,10.923584],[124.786719,10.781396],[124.780762,10.168066],[125.026563,10.033105],[124.9875,10.367578],[125.268457,10.307715],[125.026563,11.211719],[124.574609,11.343066],[124.330664,11.535205]]],[[[124.380664,-8.415137],[125.131738,-8.326465],[124.575586,-8.14082],[124.380664,-8.415137]]],[[[124.542782,25.903886],[124.584666,25.908731],[124.566804,25.941563],[124.542782,25.903886]]],[[[125.387207,-1.843066],[126.331738,-1.822852],[126.024219,-1.789746],[125.387207,-1.843066]]],[[[125.494824,10.118701],[125.690234,9.914453],[125.666797,10.440137],[125.494824,10.118701]]],[[[125.798242,-7.98457],[126.47207,-7.950391],[126.800977,-7.667871],[125.975293,-7.663379],[125.798242,-7.98457]]],[[[126.056543,-3.420996],[126.686328,-3.823633],[127.22959,-3.633008],[126.861133,-3.087891],[126.088281,-3.105469],[126.056543,-3.420996]]],[[[126.326953,33.223633],[126.901172,33.515137],[126.337695,33.4604],[126.326953,33.223633]]],[[[127.3,-.500293],[127.761133,-.883691],[127.566992,-.318945],[127.3,-.500293]]],[[[127.39502,-1.589844],[128.153027,-1.660547],[127.64668,-1.332422],[127.39502,-1.589844]]],[[[127.428516,1.13999],[127.691602,-.241895],[128.425488,-.892676],[127.887402,.29834],[127.983105,.471875],[128.899609,.21626],[128.260645,.733789],[128.702637,1.106396],[128.688379,1.572559],[127.732715,.848145],[127.652832,1.013867],[128.011719,1.331738],[128.036426,2.199023],[127.631738,1.843701],[127.428516,1.13999]]],[[[127.653125,26.094727],[128.258789,26.652783],[128.254883,26.881885],[127.907227,26.693604],[127.653125,26.094727]]],[[[127.902344,-3.496289],[128.132031,-3.157422],[128.516602,-3.449121],[128.8625,-3.234961],[129.467676,-3.453223],[129.844141,-3.327148],[130.805078,-3.857715],[130.569922,-3.130859],[129.754688,-2.86582],[128.198535,-2.865918],[127.902344,-3.496289]]],[[[127.925,-3.699316],[128.275586,-3.674609],[128.329102,-3.515918],[127.925,-3.699316]]],[[[128.217969,2.297461],[128.453906,2.051758],[128.602148,2.597607],[128.217969,2.297461]]],[[[128.489258,34.865283],[128.741016,34.798535],[128.667969,35.008789],[128.489258,34.865283]]],[[[129.164648,28.249756],[129.452539,28.208984],[129.689551,28.51748],[129.164648,28.249756]]],[[[129.580078,33.236279],[129.991699,32.851562],[129.679102,33.059961],[129.768555,32.570996],[130.34043,32.701855],[130.2375,33.177637],[130.547266,32.831592],[130.147266,31.408496],[130.58877,31.178516],[130.77627,31.706299],[130.685742,31.015137],[131.070801,31.436865],[131.337207,31.404688],[132.002148,32.882373],[131.896582,33.25459],[131.537402,33.274072],[131.696289,33.602832],[131.174609,33.602588],[130.715625,33.927783],[129.580078,33.236279]]],[[[129.737695,-1.866895],[130.248047,-2.047754],[130.35332,-1.690527],[129.737695,-1.866895]]],[[[130.043262,-11.787305],[130.60625,-11.816602],[130.459277,-11.679297],[130.294922,-11.336816],[130.043262,-11.787305]]],[[[130.236621,-.209668],[130.750195,-.443848],[130.899219,-.344434],[130.622168,-.085938],[131.005371,-.360742],[131.339746,-.290332],[130.813281,-.004102],[130.236621,-.209668]]],[[[130.38457,-11.192188],[130.511914,-11.617871],[130.950977,-11.926465],[131.538574,-11.436914],[131.268262,-11.189844],[130.618848,-11.376074],[130.38457,-11.192188]]],[[[130.672949,-.959766],[131.001855,-1.315527],[131.033008,-.917578],[130.672949,-.959766]]],[[[130.918848,33.975732],[131.740527,34.052051],[132.146484,33.83877],[132.312598,34.324951],[133.142383,34.302441],[134.740039,34.765234],[135.415918,34.61748],[135.12793,34.006982],[135.695312,33.486963],[136.329883,34.176855],[136.853711,34.324072],[136.533008,34.678369],[136.804199,35.050293],[136.871289,34.733105],[137.275195,34.77251],[137.061719,34.582812],[138.189063,34.596338],[138.719629,35.124072],[138.8375,34.619238],[139.249414,35.278027],[139.675,35.149268],[139.834766,35.658057],[140.096875,35.585156],[139.843945,34.914893],[140.354688,35.181445],[140.874023,35.724951],[140.573535,36.231348],[141.00166,37.114648],[140.962109,38.148877],[141.46748,38.40415],[141.976953,39.428809],[141.430469,40.72334],[141.455469,41.404736],[141.229297,41.372656],[140.936914,41.505566],[140.801855,41.253662],[141.244238,41.205615],[141.118555,40.882275],[140.748633,40.830322],[140.627637,41.19541],[140.344434,41.20332],[139.741504,39.92085],[140.064746,39.624414],[139.801953,38.881592],[139.363867,38.099023],[138.319922,37.218408],[137.246289,36.753174],[136.899902,37.117676],[137.322656,37.52207],[136.843457,37.382129],[135.903125,35.606885],[135.326953,35.525537],[135.174316,35.74707],[132.922949,35.511279],[131.354395,34.413184],[131.004199,34.392578],[130.918848,33.975732]]],[[[130.995898,-1.424707],[131.930371,-1.559668],[132.307617,-2.242285],[133.921582,-2.102051],[133.700098,-2.624609],[133.191016,-2.437793],[132.725,-2.789062],[131.971191,-2.788574],[132.751367,-3.294629],[132.914453,-4.056934],[133.400879,-3.899023],[133.841504,-3.054785],[133.67832,-3.479492],[133.973828,-3.817969],[134.886523,-3.938477],[134.679688,-4.079102],[135.195605,-4.450684],[137.279785,-4.94541],[138.06084,-5.465234],[138.087109,-5.70918],[138.339648,-5.675684],[138.199609,-5.807031],[138.864551,-6.858398],[138.601367,-6.936523],[139.176855,-7.19043],[138.747949,-7.251465],[139.087988,-7.587207],[138.890625,-8.237793],[139.248828,-7.982422],[139.385645,-8.189062],[140.116992,-7.92373],[140.00293,-8.195508],[140.976172,-9.11875],[142.647168,-9.327832],[143.366211,-8.961035],[143.111816,-8.474512],[142.206836,-8.195801],[143.61377,-8.200391],[143.518164,-8.000684],[143.942285,-7.944238],[143.654883,-7.460352],[144.142871,-7.757227],[144.509863,-7.567383],[146.033203,-8.076367],[147.768652,-10.070117],[149.754102,-10.353027],[150.319922,-10.654883],[150.647168,-10.517969],[150.446094,-10.307324],[150.849512,-10.236035],[149.874414,-10.012988],[149.76123,-9.805859],[150.011035,-9.688184],[149.263184,-9.497852],[149.19834,-9.03125],[148.583105,-9.051758],[148.126758,-8.103613],[147.190039,-7.378125],[146.953613,-6.834082],[147.845508,-6.662402],[147.566699,-6.056934],[145.745215,-5.402441],[145.766992,-4.823047],[144.477734,-3.825293],[140.973438,-2.609766],[139.789551,-2.348242],[137.80625,-1.483203],[137.123438,-1.840918],[137.07207,-2.105078],[136.389941,-2.27334],[135.85918,-2.995313],[135.251563,-3.368555],[134.886816,-3.209863],[134.627441,-2.536719],[134.459961,-2.832324],[134.194824,-2.309082],[134.25957,-1.362988],[133.974512,-.744336],[132.39375,-.355469],[131.257227,-.855469],[130.995898,-1.424707]]],[[[131.11377,-7.997363],[131.325586,-7.999512],[131.624414,-7.626172],[131.643457,-7.112793],[131.137793,-7.684863],[131.11377,-7.997363]]],[[[132.032617,33.33999],[132.412793,33.430469],[132.495117,32.916602],[132.804297,32.752002],[133.632031,33.510986],[134.181641,33.247217],[134.738867,33.820508],[134.6375,34.226611],[134.357422,34.256348],[133.94834,34.348047],[133.193066,33.933203],[132.935156,34.095312],[132.032617,33.33999]]],[[[134.09082,-6.833789],[134.322754,-6.84873],[134.536816,-6.442285],[134.114648,-6.19082],[134.09082,-6.833789]]],[[[134.154883,-6.062891],[134.441113,-6.334863],[134.71416,-6.295117],[134.746973,-5.707031],[134.570801,-5.427344],[134.205371,-5.707227],[134.343066,-5.833008],[134.154883,-6.062891]]],[[[134.515723,7.525781],[134.59541,7.382031],[134.651172,7.712109],[134.515723,7.525781]]],[[[134.667871,34.294141],[134.932812,34.288135],[135.004688,34.544043],[134.667871,34.294141]]],[[[135.383008,-.651367],[135.915039,-1.178418],[136.375293,-1.094043],[135.383008,-.651367]]],[[[135.474219,-1.591797],[136.228125,-1.893652],[136.892578,-1.799707],[135.474219,-1.591797]]],[[[136.180273,-11.676758],[136.338672,-11.602344],[136.479297,-11.465918],[136.180273,-11.676758]]],[[[136.335449,-14.211816],[136.894336,-14.293066],[136.89082,-13.786621],[136.714648,-13.803906],[136.424707,-13.864844],[136.335449,-14.211816]]],[[[136.540625,-35.890137],[137.448438,-36.074805],[138.123438,-35.852344],[137.596484,-35.738672],[137.334082,-35.59248],[136.540625,-35.890137]]],[[[136.947656,75.325537],[139.099121,74.656543],[139.68125,74.964062],[142.472754,74.82041],[143.12793,74.970312],[142.30791,75.691699],[144.019727,75.044678],[145.359961,75.530469],[141.485449,76.137158],[140.815918,75.630713],[140.04873,75.828955],[138.919531,76.196729],[138.207617,76.114941],[136.947656,75.325537]]],[[[137.23291,54.790576],[137.721484,54.663232],[138.206152,55.033545],[137.940527,55.092627],[137.577344,55.197021],[137.23291,54.790576]]],[[[137.650391,-8.386133],[138.535352,-8.273633],[138.989063,-7.696094],[138.769824,-7.39043],[138.081836,-7.566211],[137.650391,-8.386133]]],[[[138.563379,-8.309082],[138.895117,-8.388672],[138.796191,-8.173633],[138.563379,-8.309082]]],[[[139.15957,-16.741699],[139.507812,-16.573047],[139.587891,-16.395215],[139.15957,-16.741699]]],[[[139.785547,73.355225],[143.451465,73.231299],[142.184863,73.895898],[141.084766,73.865869],[139.785547,73.355225]]],[[[139.860156,42.581738],[140.085156,41.434082],[140.659863,41.815576],[141.150977,41.805078],[140.32666,42.293359],[140.480469,42.559375],[140.986133,42.342139],[141.851367,42.579053],[143.236523,42.000195],[143.969336,42.881396],[145.833008,43.385938],[145.34082,43.302539],[145.139648,43.6625],[145.369531,44.327393],[144.715234,43.927979],[143.824316,44.116992],[141.937695,45.509521],[141.667969,45.40127],[141.760938,44.48252],[141.374121,43.279639],[140.392383,43.303125],[140.432227,42.954102],[139.860156,42.581738]]],[[[140.193555,74.236719],[140.409473,73.92168],[141.010254,73.999463],[141.038574,74.242725],[140.193555,74.236719]]],[[[141.66084,52.272949],[142.206738,51.222559],[141.866309,48.750098],[142.181738,48.013379],[141.830371,46.451074],[142.077148,45.917041],[142.578027,46.700781],[143.282324,46.558984],[143.431641,46.028662],[143.580664,46.360693],[142.556934,47.737891],[143.10498,49.198828],[144.04873,49.24917],[144.71377,48.640283],[143.299512,51.632373],[143.324707,52.963086],[142.761035,54.393945],[142.334961,54.280713],[142.705957,53.895703],[142.526172,53.447461],[141.823535,53.339502],[141.66084,52.272949]]],[[[144.649316,13.428711],[144.741797,13.259277],[144.875391,13.614648],[144.649316,13.428711]]],[[[144.718555,-40.672266],[144.766113,-41.390039],[145.516602,-42.354492],[145.198828,-42.230859],[145.487598,-42.92666],[146.208008,-43.316211],[146.043164,-43.547168],[146.873926,-43.6125],[147.297949,-42.790918],[147.94541,-43.181836],[148.213672,-41.97002],[148.342578,-42.215332],[148.215234,-40.854883],[146.31748,-41.163477],[145.042969,-40.786719],[144.718555,-40.672266]]],[[[145.461719,43.870898],[145.555859,43.6646],[146.567773,44.44043],[146.207617,44.497656],[145.461719,43.870898]]],[[[145.713184,15.215283],[145.751953,15.133154],[145.821875,15.265381],[145.713184,15.215283]]],[[[146.098828,-18.251758],[146.298828,-18.484766],[146.27832,-18.23125],[146.098828,-18.251758]]],[[[146.148535,75.198291],[148.296875,74.800439],[150.646289,74.94458],[150.822363,75.156543],[146.795215,75.370752],[146.5375,75.581787],[146.148535,75.198291]]],[[[146.546484,-2.208594],[147.438086,-2.058984],[147.067578,-1.960156],[146.65625,-1.974023],[146.546484,-2.208594]]],[[[146.897461,44.404297],[148.599512,45.317627],[148.812207,45.51001],[148.324219,45.282422],[147.924023,45.383301],[146.897461,44.404297]]],[[[147.767188,-39.870313],[148.105664,-40.262109],[148.297363,-39.985742],[148.000391,-39.757617],[147.767188,-39.870313]]],[[[148.020117,-40.404199],[148.404004,-40.486523],[148.32627,-40.306934],[148.020117,-40.404199]]],[[[148.337207,-5.669434],[149.652539,-6.29043],[150.473535,-6.263379],[151.515137,-5.552344],[152.077051,-5.458301],[151.983691,-5.074414],[152.351172,-4.822168],[152.405664,-4.340723],[151.915625,-4.296777],[151.593066,-4.200781],[151.671191,-4.883301],[150.900293,-5.447168],[150.183105,-5.523633],[150.090039,-5.011816],[149.831445,-5.524121],[148.432031,-5.471777],[148.337207,-5.669434]]],[[[149.44707,45.593359],[149.687695,45.642041],[150.553125,46.208545],[149.44707,45.593359]]],[[[149.961621,-2.473828],[150.436621,-2.661816],[150.227148,-2.38418],[149.961621,-2.473828]]],[[[150.109766,-9.361914],[150.34541,-9.493848],[150.208301,-9.206348],[150.109766,-9.361914]]],[[[150.43623,-9.624609],[150.894043,-9.66748],[150.528418,-9.346582],[150.43623,-9.624609]]],[[[150.746094,-2.738867],[152.279395,-3.582422],[152.96582,-4.756348],[153.016797,-4.105664],[152.03291,-3.251367],[150.825391,-2.572949],[150.746094,-2.738867]]],[[[150.776074,-9.709082],[151.230859,-10.194727],[151.296484,-9.956738],[151.080957,-10.020117],[150.776074,-9.709082]]],[[[151.723438,46.828809],[152.002051,46.897168],[152.288867,47.142188],[151.723438,46.828809]]],[[[153.203613,-11.324121],[153.759863,-11.586328],[153.536133,-11.476172],[153.203613,-11.324121]]],[[[154.729297,-5.444434],[154.759277,-5.931348],[155.344043,-6.72168],[155.719336,-6.862793],[155.957617,-6.686816],[154.729297,-5.444434]]],[[[155.243066,50.094629],[155.921094,50.302197],[156.096875,50.771875],[155.243066,50.094629]]],[[[156.452539,-6.638281],[157.101562,-7.323633],[157.486719,-7.330371],[156.452539,-6.638281]]],[[[156.560938,-7.574023],[156.687891,-7.923047],[156.809082,-7.722852],[156.560938,-7.574023]]],[[[157.212305,-8.565039],[157.388965,-8.713477],[157.379492,-8.420898],[157.212305,-8.565039]]],[[[157.217578,-8.262793],[157.558008,-8.269922],[157.819336,-8.612012],[157.763477,-8.242188],[157.490625,-7.965723],[157.217578,-8.262793]]],[[[158.134766,6.944824],[158.314844,6.813672],[158.294629,6.951074],[158.134766,6.944824]]],[[[158.457422,-7.544727],[159.879102,-8.534277],[159.431445,-8.029004],[158.457422,-7.544727]]],[[[159.612305,-9.470703],[159.802734,-9.763477],[160.818945,-9.862793],[160.35459,-9.421582],[159.750391,-9.272656],[159.612305,-9.470703]]],[[[160.59043,-8.372754],[160.77207,-8.963867],[161.367383,-9.61123],[160.749414,-8.313965],[160.59043,-8.372754]]],[[[161.304785,-10.204395],[161.786816,-10.716895],[162.37334,-10.823242],[162.105371,-10.453809],[161.715332,-10.387305],[161.304785,-10.204395]]],[[[163.635156,58.603369],[164.615723,58.885596],[164.572656,59.221143],[163.760938,59.015039],[163.635156,58.603369]]],[[[164.059668,-20.141504],[164.927441,-21.289844],[166.467969,-22.256055],[166.970313,-22.322852],[166.942383,-22.090137],[165.191797,-20.768848],[164.202344,-20.246094],[164.059668,-20.141504]]],[[[165.751074,55.294531],[166.650293,54.839062],[166.275781,55.311963],[165.751074,55.294531]]],[[[165.88916,-50.807715],[166.221094,-50.761523],[166.101367,-50.538965],[165.88916,-50.807715]]],[[[166.488281,-45.831836],[166.916699,-45.957227],[166.731543,-46.197852],[167.539453,-46.148535],[168.382129,-46.605371],[169.342285,-46.620508],[170.77627,-45.870898],[171.240723,-44.26416],[172.179785,-43.895996],[172.035547,-43.701758],[173.065625,-43.874609],[172.52666,-43.464746],[172.624023,-43.272461],[173.221191,-42.976562],[174.283105,-41.740625],[174.069336,-41.429492],[174.370117,-41.103711],[174.038574,-41.241895],[174.302539,-41.019531],[173.797852,-41.271973],[173.947168,-40.924121],[173.115332,-41.279297],[172.704395,-40.667773],[172.943652,-40.51875],[172.640625,-40.518262],[171.48623,-41.794727],[171.011719,-42.885059],[170.969922,-42.718359],[169.178906,-43.913086],[168.457422,-44.030566],[167.908984,-44.664746],[167.194531,-44.963477],[167.155664,-45.410938],[166.743066,-45.468457],[167.00332,-45.712109],[166.488281,-45.831836]]],[[[166.567383,-14.641797],[166.631055,-15.406055],[166.758301,-15.631152],[167.093945,-15.580859],[167.075586,-14.935645],[166.810156,-15.157422],[166.745801,-14.826855],[166.567383,-14.641797]]],[[[166.61939537900003,19.281642971000053],[166.64421634200005,19.27558014500005],[166.63819420700008,19.286444403000075],[166.61939537900003,19.281642971000053]]],[[[166.907031,-.52373],[166.938965,-.550781],[166.958398,-.516602],[166.907031,-.52373]]],[[[167.055762,-20.720215],[167.072656,-20.997266],[167.400879,-21.160645],[167.297949,-20.73252],[167.055762,-20.720215]]],[[[167.199512,-15.885059],[167.449316,-16.55498],[167.836621,-16.449707],[167.4125,-16.095898],[167.199512,-15.885059]]],[[[167.521973,-47.258691],[168.240918,-47.07002],[168.144922,-46.862207],[167.783984,-46.699805],[167.521973,-47.258691]]],[[[167.674219,-15.451562],[167.911328,-15.435938],[168.002539,-15.283203],[167.674219,-15.451562]]],[[[167.81543,-21.392676],[167.966797,-21.641602],[168.010938,-21.42998],[167.81543,-21.392676]]],[[[167.864746,69.901074],[169.200781,69.580469],[169.374805,69.882617],[167.864746,69.901074]]],[[[167.929004,-16.228711],[168.29668,-16.336523],[168.163867,-16.081641],[167.929004,-16.228711]]],[[[167.939453,-29.017676],[167.960742,-29.096289],[167.99043,-29.04209],[167.939453,-29.017676]]],[[[168.158203,-17.710547],[168.524609,-17.798047],[168.445801,-17.542188],[168.158203,-17.710547]]],[[[168.986914,-18.871289],[169.334375,-18.940234],[169.01582,-18.64375],[168.986914,-18.871289]]],[[[169.247461,-19.344727],[169.347266,-19.623535],[169.491309,-19.540137],[169.247461,-19.344727]]],[[[171.035742,7.156104],[171.235352,7.06875],[171.39375,7.110938],[171.101953,7.138232],[171.035742,7.156104]]],[[[172.494824,52.937891],[172.935156,52.7521],[173.436035,52.852051],[172.811816,53.012988],[172.494824,52.937891]]],[[[172.705957,-34.455176],[173.313965,-35.443359],[173.626172,-35.319141],[173.412207,-35.542578],[174.054688,-36.359766],[173.914453,-35.908691],[174.392773,-36.240039],[174.401562,-36.601953],[174.188867,-36.492285],[174.475586,-36.941895],[174.928906,-37.084766],[174.58584,-37.097754],[174.928027,-37.804492],[174.597363,-38.785059],[173.763672,-39.31875],[175.155957,-40.114941],[175.1625,-40.621582],[174.635352,-41.289453],[175.309766,-41.610645],[176.842188,-40.157812],[177.076758,-39.221777],[177.522949,-39.073828],[177.908789,-39.239551],[178.53623,-37.69209],[178.00918,-37.554883],[177.274023,-37.993457],[176.108398,-37.645117],[175.46084,-36.475684],[175.54248,-37.201367],[174.722461,-36.841211],[174.802148,-36.309473],[174.320312,-35.24668],[173.269434,-34.934766],[173.043945,-34.429102],[172.705957,-34.455176]]],[[[177.321387,-18.077539],[177.955469,-18.264062],[178.667676,-18.080859],[178.280176,-17.371973],[177.504492,-17.539551],[177.321387,-18.077539]]],[[[178.497461,-16.787891],[178.706641,-16.976172],[179.202344,-16.712695],[179.92793,-16.744434],[179.930371,-16.519434],[179.56416,-16.636914],[179.999219,-16.168555],[180,-16.15293],[178.497461,-16.787891]]],[[[178.683887,71.105664],[178.861523,70.826416],[180,70.993018],[180,71.537744],[178.683887,71.105664]]],[[[179.195703,-8.534766],[179.213672,-8.524219],[179.203027,-8.466309],[179.195703,-8.534766]]]]}}],countriesExclATALite={type,features},bbox100000=[73.502355,18.143579,135.09567,53.563269],bboxworld=[-180,-55.643164,180,83.564844],countriesJson=zi(ci({},countries),{features:countries.features.map(c=>{if(c.properties.ISO_A2==="CN"){const e=c.geometry.coordinates,s=[...json100000.features[0].geometry.coordinates];return s[0]=[[...e[0][0].slice(73),...s[0][0].slice(3505,4657),e[0][0][73]]],zi(ci({},c),{geometry:zi(ci({},c.geometry),{coordinates:s})})}else return c})}),countriesJsonExclATA=zi(ci({},countriesJson),{features:countriesJson.features.filter(c=>c.properties.ISO_A3!=="ATA")}),countriesJsonExclATALite=countriesExclATALite,PENCIL_CONFIG$4={camera:{near:.1,far:1e3}},hideMaterial=new MeshBasicMaterial({colorWrite:!1,transparent:!0});let PlaneMap$1=class extends C$1{constructor(s){super();F0(this,"options");F0(this,"isActive",!0);F0(this,"groupArr",[]);F0(this,"areaArr",[]);F0(this,"lineArr");F0(this,"mergeSideArea",null);F0(this,"extrudelineArr");this.options=ci({areaGroup:!0,hasSide:!0,lineOffset:0,topSegments:0,depth:2,bloom:!1,mergeSide:!1,onTop:0},s)}create(){return q0(this,null,function*(){const{geojson:s,extrudeLineGeojson:r,bbox:f,areaGroup:de,materialOptions:Xe,hasSide:Je,mergeSide:Ke}=this.options;this.createGroup();const Qe=this.pencil.getPlugin("draw");if(de){const $t=yield Promise.all(s.features.map(e0=>q0(this,null,function*(){const{properties:t0}=e0,i0=`area-group-${this.getPropertiesKey(t0)}`,n0=yield Qe.draw("Group",{target:this,key:i0});return n0.userData=ci({},t0),n0})));this.groupArr=$t}const{lineMat:_e,extrudeLineMat:$e,topMat:qe,sideMat:st,bgTopMat:dt,bgSideMat:Wt,bgLineMat:Yt,bgExtrudeLineMat:rt}=Xe,[Zt,vt,Tt,Jt]=yield Promise.all([this.addArea(s,{material:Je?[qe,Ke?hideMaterial:st]:qe,bbox:f,areaGroup:de,hasSide:Je,hasTop:!0,castShadow:!Ke,onTop:this.options.onTop}),this.addLine(s,{material:_e,onTop:this.options.onTop+2,areaGroup:de}),r&&this.addLine(r,{material:$e,onTop:this.options.onTop+3}),Ke&&r&&this.addArea(r,{material:st,bbox:f,castShadow:!0,areaGroup:!1,hasSide:!0,hasTop:!1,onTop:this.options.onTop})]);Jt&&(this.mergeSideArea=Jt[0]),this.areaArr=Zt.filter($t=>!$t.userData.ignore),vt.forEach($t=>{$t.position.z=this.options.depth+this.options.lineOffset}),this.lineArr=vt.filter($t=>!$t.userData.ignore),Tt&&(Tt.forEach($t=>{$t.position.z=this.options.depth+this.options.lineOffset}),this.extrudelineArr=Tt.filter($t=>!$t.userData.ignore)),dt&&Wt&&this.setAreaMaterial("bg",[dt,Wt]),Yt&&this.setLineMaterial("bg",Yt),rt&&this.setExtrudeLineMaterial("bg",rt)})}setAreaColor(s,r){if(r==="origin"){s.useMaterial("origin");return}const f="Color"+r,de=s.setMaterialList(f,"clone",!1),Xe=0;de[Xe].color.set(r);const Je=1,Ke=de[Je];return de[Je]=s.materialList.origin[Je],v$1({material:Ke}),s.useMaterial(f),de[Xe]}setAreaEmissive(s,r,f=1){if(r==="origin"){s.useMaterial("origin");return}const de="Emissive"+r+"_"+f,Xe=s.setMaterialList(de,"clone",!1),Je=0;return Xe[Je].emissive.set(r),Xe[Je].emissiveIntensity=f,s.useMaterial(de),Xe[Je]}setLineColor(s,r){if(r==="origin"){s.useMaterial("origin");return}const f=s.setMaterialList(r,"clone",!0);return f.color.set(r),s.useMaterial(r),f}setLineWidth(s,r){if(r==="origin"){s.useMaterial("origin");return}const f="LineWidth"+r,de=s.setMaterialList(f,"clone",!0);return de.lineWidth=r,s.useMaterial(f),de}addArea(s,r){return q0(this,null,function*(){var _e;const{bbox:f,material:de,onTop:Xe}=r,Je=this.geojson2Meta(s),Ke=this.pencil.getPlugin("worker"),Qe=this.pencil.getPlugin("draw");if(this.pencil.installPlugins.get("materialList"),r.areaGroup)return yield Promise.all(Je.map($e=>q0(this,null,function*(){var rt;const{coords:qe,properties:st}=$e,dt=this.findGroup(this.getPropertiesKey(st)),Wt=yield Ke.geoGeometry("extrudePolygon",{mesaage:{coordinatesArr:qe,projection:this.options.projection,topSegments:this.options.topSegments,bbox:f,depth:[this.options.depth],hasBottom:!1,hasSide:r.hasSide,hasTop:r.hasTop,useGroups:r.hasSide&&r.hasTop?2:0,splitPolygons:((rt=this.options.projection.rotate)==null?void 0:rt[0])===-160?300:0}}),Yt=yield Qe.draw("ExtrudePolygon",{geometry:Wt,material:de,onTop:Xe},dt);return r!=null&&r.castShadow&&(Yt.object3d.castShadow=!0),Yt.userData=ci({},st),Yt})));{const $e=yield Ke.geoGeometry("extrudePolygon",{mesaage:{coordinatesArr:Je.map(({coords:st})=>st).flat(),projection:ci({},this.options.projection),topSegments:this.options.topSegments,bbox:f,depth:[this.options.depth],hasSide:r.hasSide,hasTop:r.hasTop,hasBottom:!1,useGroups:2,splitPolygons:((_e=this.options.projection.rotate)==null?void 0:_e[0])===-160?300:0}}),qe=yield Qe.draw("ExtrudePolygon",{geometry:$e,material:de},this);return r!=null&&r.castShadow&&(qe.object3d.castShadow=!0),qe.userData={},[qe]}})}getPropertiesKey(s){return`${this.key}-${s.adcode||s.DistrictID||s.NAME_CN}`}addPlane(s,r){return q0(this,null,function*(){var Wt,Yt,rt;const{material:f}=r,de=this.geojson2Meta({type:"FeatureCollection",features:[s]}),Xe=this.pencil.getPlugin("worker"),Je=this.pencil.getPlugin("draw");(Wt=r.topSegments)!=null||this.options.topSegments;const{coords:Ke,properties:Qe}=de[0],_e=this.findGroup(this.getPropertiesKey(Qe)),$e=yield Je.draw("Group",{target:_e});$e.userData=ci({},Qe);const[qe,st]=yield Promise.all([Xe.geoGeometry("extrudePolygon",{mesaage:{coordinatesArr:Ke,projection:this.options.projection,topSegments:this.options.topSegments,depth:[0],hasBottom:!1,hasSide:!1,useGroups:0,splitPolygons:((Yt=this.options.projection.rotate)==null?void 0:Yt[0])===-160?300:0}}),Xe.geoGeometry("line",{mesaage:{coordinatesArr:Ke,lineWidth:[1],projection:this.options.projection,splitPolygons:((rt=this.options.projection.rotate)==null?void 0:rt[0])===-160?300:0}})]),dt=Math.max(this.options.onTop,...this.extrudelineArr?this.extrudelineArr.map(Zt=>Zt.object3d.renderOrder):[],...this.lineArr.map(Zt=>Zt.object3d.renderOrder));return yield Promise.all([Je.draw("ExtrudePolygon",{geometry:qe,material:f,onTop:dt},$e),Je.draw("Line",{geometry:st,material:r.lineMaterial,onTop:dt+1},$e)]),$e.position.z=this.options.depth+.01,$e})}addLine(s,r){return q0(this,null,function*(){var Qe;const{material:f,onTop:de}=r,Xe=this.geojson2Meta(s),Je=this.pencil.getPlugin("worker"),Ke=this.pencil.getPlugin("draw");if(r.areaGroup)return yield Promise.all(Xe.map(_e=>q0(this,null,function*(){var Yt;const{coords:$e,properties:qe}=_e,st=this.findGroup(this.getPropertiesKey(qe)),dt=yield Je.geoGeometry("line",{mesaage:{coordinatesArr:$e,lineWidth:[1],projection:this.options.projection,splitPolygons:((Yt=this.options.projection.rotate)==null?void 0:Yt[0])===-160?300:0}}),Wt=yield Ke.draw("Line",{geometry:dt,material:f,onTop:de},st);return Wt.userData=ci({},qe),Wt})));{const _e=yield Je.geoGeometry("line",{mesaage:{coordinatesArr:Xe.map(({coords:qe})=>qe).flat(),lineWidth:[1],projection:this.options.projection,splitPolygons:((Qe=this.options.projection.rotate)==null?void 0:Qe[0])===-160?300:0}});return[yield Ke.draw("Line",{geometry:_e,material:f,onTop:de},this)]}})}geojson2Meta(s){return s.features.filter(r=>r.geometry).map(r=>{const{type:f,coordinates:de}=r.geometry;let Xe=[];return f==="Polygon"?Xe=de:f==="MultiPolygon"&&(Xe=de.flat()),{coords:Xe,properties:r.properties}})}pickArea(s){const{pencil:r}=this,f=this.areaArr.map(Xe=>Xe.object3d),de=r.pick(s,f,!0);if(de)return this.drawController.objMap.get(de.object)}update(s,r){const{lineMat:f,extrudeLineMat:de}=this.options.materialOptions;this.isActive&&[f,de].forEach(Xe=>{!Xe||!Xe.uniforms.lineLightAnimation.value||(Xe.uniforms.time.value=r)})}findGroup(s){return this.pencil.getPlugin("draw").getObject("Group",{key:`area-group-${s}`})}setAreaMaterial(s,r){this.areaArr.forEach(f=>{f.setMaterialList(s,this.mergeSideArea&&Array.isArray(r)?[r[0],hideMaterial]:r)}),this.mergeSideArea&&Array.isArray(r)&&this.mergeSideArea.setMaterialList(s,r[1])}useAreaMaterial(s){this.areaArr.forEach(r=>{r.useMaterial(s)}),this.mergeSideArea&&this.mergeSideArea.useMaterial(s)}setLineMaterial(s,r){this.lineArr.forEach(f=>{f.setMaterialList(s,r)})}useLineMaterial(s){this.lineArr.forEach(r=>{r.useMaterial(s)})}setExtrudeLineMaterial(s,r){var f;(f=this.extrudelineArr)==null||f.forEach(de=>{de.setMaterialList(s,r)})}useExtrudeLineMaterial(s){var r;(r=this.extrudelineArr)==null||r.forEach(f=>{f.useMaterial(s)})}changeLineAnimateParams({speed:s=.5,extrude:r=!1}){const{lineMat:f,extrudeLineMat:de}=this.options.materialOptions,Xe=r?de:f;if(!Xe)return;Xe.uniforms.time.value=0,Xe.uniforms.speed.value=s,Xe.uniforms.lineLightAnimation.value=1;const{size:Je,min:Ke,max:Qe}=this.getSize();Xe.uniforms.size.value=Math.max(Je.x,Je.y)/2,Xe.uniforms.uCenter.value=new Vector2((Ke.x+Qe.x)/2,(Ke.y+Qe.y)/2)}deactive(){this.isActive&&(this.options,this.isActive=!1,this.options.bloom&&this.toggleExtrudelineBloom(!1),this.useAreaMaterial("bg"),this.useLineMaterial("bg"),this.useExtrudeLineMaterial("bg"))}render(){this.options.bloom&&this.toggleExtrudelineBloom(!0)}toggleExtrudelineBloom(s){var r;(r=this.extrudelineArr)==null||r.forEach(f=>{this.pencil.composerController.toggleBloomSelection(f,s)})}active(){this.isActive||(this.isActive=!0,this.useAreaMaterial("origin"),this.useLineMaterial("origin"),this.useExtrudeLineMaterial("origin"),this.options.bloom&&this.toggleExtrudelineBloom(!0))}dispose(){super.dispose(),this.areaArr.length=0,this.lineArr&&(this.lineArr.length=0),this.extrudelineArr&&(this.extrudelineArr.length=0)}};class ContinentsBg extends C$1{constructor(s){super();F0(this,"options");F0(this,"mapArr",[]);this.options=s}create(){return q0(this,null,function*(){const{depth:s}=this.options,r=this.pencil.installPlugins.get("materialList"),f=this.pencil.getPlugin("draw"),de=r.getMaterialObj("continents");this.createGroup(),this.object3d.name="大洲组",yield Promise.all(continents.features.map(Xe=>q0(this,null,function*(){const Je=Xe.properties.name;Je==="大洋洲"&&(Xe.geometry.coordinates[4]=[],Xe.geometry.coordinates[21]=[]);const Ke=turf.centroid(Xe).geometry.coordinates;let Qe=0,_e=0,$e=this.options.scale;const qe=30,st=25;Je==="南美洲"?(Qe=-qe,_e=st,$e=$e*.2):Je==="北美洲"?(Qe=0,_e=st,$e=$e*.18):Je==="大洋洲"?(Qe=qe,_e=st,$e=$e*.3):Je==="亚洲"?(Qe=-qe,_e=-st,$e=$e*.15):Je==="欧洲"?(Qe=0,_e=-st,$e=$e*.3):Je==="非洲"&&(Qe=qe,_e=-st,$e=$e*.2);const dt=yield f.draw("PlaneMap",{geojson:{type:"FeatureCollection",features:[Xe]},projection:{center:Ke,scale:$e,rotate:[0,0],projectionType:"equirectangular"},areaGroup:!1,depth:s,materialOptions:ci({},de)},this);dt.userData.projection=F$1({center:Ke,scale:$e,rotate:[0,0],projectionType:"equirectangular"}),dt.userData.name=Je,dt.position.set(Qe,_e,0),this.mapArr.push(dt)})))})}getPointInContinentInfo(s){return continents.features.find(r=>r.geometry.coordinates.some(f=>f.length?turf.booleanPointInPolygon(turf.point(s),turf.polygon(f)):!1))}getPointInContinent(s){return!!this.getPointInContinentInfo(s)}getLocationPosition(s,r){var de;const f=r||((de=this.getPointInContinentInfo(s))==null?void 0:de.properties.name);if(f){const Xe=this.mapArr.find(Je=>Je.userData.name===f);if(Xe){const{projection:Je}=Xe.userData,[Ke,Qe]=s,[_e,$e]=Je([Ke,Qe]),qe=new Vector3(_e,-$e,this.options.depth);return qe.applyMatrix4(Xe.object3d.matrixWorld),[qe.x,qe.y,qe.z]}}}render(){const s=this.pencil.installPlugins.get("materialList");s.setObject3d(this.object3d,"continents-group",{baseObject:this,remove:!1}),this.mapArr.forEach(r=>{s.setObject3d(r.object3d,"continents-"+r.userData.name,{baseObject:r,remove:!1,parent:this.object3d})}),s.setObject3dMeta("continentsArea",{parent:this.object3d}),s.setObject3dMeta("continentsLine",{parent:this.object3d})}dispose(){this.mapArr.forEach(s=>{s.dispose()}),this.mapArr.length=0}}class PlaneMap extends C$1{constructor(s){super();F0(this,"options");F0(this,"isActive",!0);F0(this,"groupArr",[]);F0(this,"areaArr",[]);F0(this,"lineArr");F0(this,"extrudelineArr");this.options=ci({depth:2},s)}geojson2Meta(s){return s.features.filter(r=>r.geometry).map(r=>{const{type:f,coordinates:de}=r.geometry;let Xe=[];return f==="Polygon"?Xe=de:f==="MultiPolygon"&&(Xe=de.flat()),{coords:Xe,properties:r.properties}})}create(){return q0(this,null,function*(){const{geojson:s,bbox:r}=this.options,f=this.geojson2Meta(s),de=this.pencil.getPlugin("worker"),Xe=this.pencil.getPlugin("draw"),Ke=yield this.pencil.getPlugin("loader").load("/1.png"),Qe=yield de.geoGeometry("extrudePolygon",{mesaage:{coordinatesArr:f.map(({coords:Zt})=>Zt).flat(),projection:ci({},this.options.projection),topSegments:100,bbox:r,depth:[this.options.depth],hasBottom:!1,hasSide:!1}}),_e=Qe.attributes.position.count;Qe.setAttribute("color",new BufferAttribute(new Float32Array(_e*3),3));const $e=this.options.depth;this.setNoise(Qe,Ke.image,$e);const qe=new Color$1,st=Qe.attributes.color,dt=Qe.attributes.position,Wt=new Color$1("red"),Yt=new Color$1("green");for(let Zt=0;Zt<_e;Zt++){const vt=dt.getZ(Zt)/$e;qe.lerpColors(Wt,Yt,vt),st.setXYZ(Zt,qe.r,qe.g,qe.b)}const rt=yield Xe.draw("ExtrudePolygon",{geometry:Qe,material:new MeshStandardMaterial({flatShading:!0,vertexColors:!0})},null);rt.position.z+=.001,this.object3d=rt.object3d})}setNoise(s,r,f=1){const de=document.createElement("canvas"),Xe=[];de.width=r.width,de.height=r.height;const Je=de.getContext("2d");Je.drawImage(r,0,0);const Qe=Je.getImageData(0,0,r.width,r.height).data;for(let st=0;st<r.height;st++){Xe[st]=[];for(let dt=0;dt<r.width;dt++){const Wt=(st*r.width+dt)*4,Yt=Qe[Wt];Xe[st][dt]=Yt/255}}const _e=s.attributes.position,$e=s.attributes.uv,qe=new Vector2;for(let st=0;st<_e.count;st++){qe.fromBufferAttribute($e,st);let dt=Math.round(qe.x*r.width)-1,Wt=Math.round(qe.y*r.height)-1;dt<0&&(dt=0),Wt<0&&(Wt=0);const Yt=Xe[Wt][dt];_e.setZ(st,Yt*f)}}}const objs$4=zi(ci({},objs$5),{PlaneMap:PlaneMap$1,ContinentsBg,Mountain:PlaneMap}),worldPacificCentre=c=>{c.options.curvatureResolution=0,c.loaderAdd=function(){const e=this.loader;e.add(["/image/map/jianbian.webp"]),e.add(["/image/map/hp2.webp","/image/map/fx2.webp"])},c.initMaterial=function(){return q0(this,null,function*(){const e=this.loader,s=this.mList,r=(()=>{const f=e.getAsset("/image/map/hp2.webp");f.center.set(.5,.5),f.repeat.set(.97,1.01);const de=new MeshStandardMaterial({name:"顶面",map:e.getAsset("/image/map/hp2.webp"),normalMap:e.getAsset("/image/map/fx2.webp"),normalScale:new Vector2(2,1)}),Xe=new MeshBasicMaterial({name:"侧面",map:e.getAsset("/image/map/jianbian.webp")}),Je=new it$1({color:new Color$1("#73FEDD"),sizeAttenuation:0,lineWidth:this.options.lineWidth,depthWrite:!1}),Ke=new it$1({color:new Color$1("#73FEDD"),sizeAttenuation:0,lineWidth:this.options.extrudeLineWidth,depthWrite:!1});return{topMat:de,sideMat:Xe,lineMat:Je,extrudeLineMat:c.options.extrudeLine?Ke:null}})();s.setMaterialObj("plane",r),s.setShowMaterialList("area",["plane#topMat","plane#sideMat"],{name:"板块"}),s.setShowMaterialList("line","plane#lineMat",{name:"板块线"})})}},world=c=>{if(c.initSettingsObj=ci({"测试板块颜色.color:::caId":"ffffff","测试边框颜色.color:::caId":"ffffff","测试边框宽度:::caId":0,"测试添加面.btn:::caId":0},c.initSettingsObj),c.options.extrudeLine&&(c.options.extrudeLineGeojsonMap[0]=countriesJsonExclATALite),c.options.lineOffset=.02,delete c.extendsOptions.handleBackKeepCamvasState,c.extendsOptions.extrudeLine=()=>c.options.extrudeLine,c.extendsOptions.worldPacificCentre=()=>c.options.worldPacificCentre,c.options.worldPacificCentre){worldPacificCentre(c);return}c.initMaterial=function(){return q0(this,null,function*(){const e=this.mList,s=(()=>{const r=new MeshBasicMaterial({name:"顶面",color:"#0d2425"}),f=new MeshBasicMaterial({name:"侧面",color:"#0d2425"}),de=new it$1({color:new Color$1("#73FEDD"),sizeAttenuation:0,lineWidth:this.options.lineWidth,depthWrite:!1}),Xe=new it$1({color:new Color$1("#73FEDD"),sizeAttenuation:0,lineWidth:this.options.extrudeLineWidth,depthWrite:!1});return{topMat:r,sideMat:f,lineMat:de,extrudeLineMat:c.options.extrudeLine?Xe:null}})();e.setMaterialObj("plane",s),e.setShowMaterialList("area",["plane#topMat","plane#sideMat"],{name:"板块"}),e.setShowMaterialList("line","plane#lineMat",{name:"板块线"})})}},china=c=>{c.initSettingsObj=ci({"测试板块颜色.color:::caId":"ffffff","测试边框颜色.color:::caId":"ffffff","测试边框宽度:::caId":0,"测试添加面.btn:::caId":0},c.initSettingsObj),c.options.lineOffset=.005,c.loaderAdd=function(){return q0(this,null,function*(){this.loader.add(["/image/map/jianbian.webp","/image/map/hp.webp","/image/map/shuchu2.webp"]),this.loaderAddBg()})},c.initMaterial=function(){return q0(this,null,function*(){const e=this.loader,s=(()=>{const r=new MeshStandardMaterial({name:"顶面",map:e.getAsset("/image/map/hp.webp"),normalMap:e.getAsset("/image/map/shuchu2.webp")}),f=new MeshBasicMaterial({name:"侧面",map:e.getAsset("/image/map/jianbian.webp")}),de=new it$1({color:new Color$1("#73FEDD"),sizeAttenuation:0,lineWidth:this.options.lineWidth,depthWrite:!1}),Xe=new it$1({name:"板块边线",color:new Color$1("#00FFED"),sizeAttenuation:0,lineWidth:this.options.extrudeLineWidth,depthWrite:!1});return{topMat:r,sideMat:f,lineMat:de,extrudeLineMat:Xe}})();this.mList.setMaterialObj("plane",s),this.mList.setShowMaterialList("area",["plane#topMat","plane#sideMat"],{name:"板块"}),this.mList.setShowMaterialList("line","plane#lineMat",{name:"板块线"}),this.initMaterialBg()})}},base$1=c=>{c.loaderAdd=function(){return q0(this,null,function*(){this.loader.add(["/image/map/jianbian.webp"]),this.loaderAddBg()})},c.initMaterial=function(){return q0(this,null,function*(){const e=this.loader,s=(()=>{const r=new MeshBasicMaterial({name:"顶面",color:new Color$1("#0d2425")}),f=new MeshBasicMaterial({name:"侧面",map:e.getAsset("/image/map/jianbian.webp")}),de=new it$1({color:new Color$1("#73FEDD"),sizeAttenuation:0,lineWidth:this.options.lineWidth,depthWrite:!1}),Xe=new it$1({color:new Color$1("#00FFED"),sizeAttenuation:0,lineWidth:this.options.extrudeLineWidth,depthWrite:!1});return{topMat:r,sideMat:f,lineMat:de,extrudeLineMat:Xe}})();this.mList.setMaterialObj("plane",s),this.mList.setShowMaterialList("area",["plane#topMat","plane#sideMat"],{name:"板块"}),this.mList.setShowMaterialList("line","plane#lineMat",{name:"板块线"}),this.initMaterialBg()})}},getLabelElement=c=>{const e=document.createElement("div");return c.replace(/省|市|特别行政区|自治区|维吾尔自治区|回族自治区|壮族自治区/,""),e.classList.add("vis-map-label","absolute","top-1/2","left-1/2","-translate-x-1/2","-translate-y-1/2"),e.innerHTML=`
|
|
5266
|
-
<div class="text-
|
|
5266
|
+
<div class="text-white text-opacity-80 text-center leading-[1] text-sm whitespace-nowrap">
|
|
5267
5267
|
${c}
|
|
5268
5268
|
</div>
|
|
5269
5269
|
`,e},hn=class hn extends Base{constructor(){super(...arguments);F0(this,"drawController",new Rl(objs$4));F0(this,"mapHistory",[]);F0(this,"activePlaneMap",null);F0(this,"isAnimating",!1);F0(this,"parentBg",[]);F0(this,"continentsBg");F0(this,"group");F0(this,"projection");F0(this,"pcenter",[104,37.5]);F0(this,"pscale",5e4/1e3);F0(this,"meters");F0(this,"extendsOptions",{mapDepth:()=>this.mapObj.depth,equirectangular:()=>this.options.projectionType==="equirectangular",handleBackKeepCamvasState:()=>this.options.handleBackKeepCamvasState,mapBoundary:()=>this.options.mapBoundary,mergeSide:()=>this.options.mergeSide});F0(this,"initSettingsObj",{label:!1,labelLite:!1,shadowMap:!1});F0(this,"caId");F0(this,"shadowMapLight");F0(this,"planeShadow")}get mapObj(){return this.mapHistory[this.mapHistory.length-1]}get map(){var s;return(s=this.mapObj)==null?void 0:s.map}get mapInfo(){var s;return(s=this.mapObj)==null?void 0:s.mapInfo}get mapArea(){var s;return(s=this.map)==null?void 0:s.areaArr}get mapLine(){var s;return(s=this.map)==null?void 0:s.lineArr}get adcodes(){return this.mapHistory.map(s=>s.mapInfo.adcode)}setOptions(s){const r=ci({0:countriesJsonExclATA,1e5:chinaJson},s==null?void 0:s.geojsonMap);let f={1e5:json100000};const de=ci({0:bboxworld,1e5:bbox100000},s==null?void 0:s.bboxMap);Object.keys(r).forEach(Xe=>{Xe!=="0"&&Xe!=="100000"&&r[+Xe].features.forEach(Ke=>{const Qe=Ke.properties.adcode;f[Qe]={type:"FeatureCollection",features:[Ke]}})}),f=ci(ci({},f),s==null?void 0:s.extrudeLineGeojsonMap),super.setOptions(zi(ci({parentBg:!1,continentsBg:!1,continentsBgDepth:0,parentBgDepth:0,parentBgTopSegments:0,clickOusideBack:!0,mapDepth:[1,.4,.2],mapPadding:[100,100,100,100],plateInCenter:!0,drillDownPlateInCenter:!0,drillDownHideParent:!1,drillDownRestrictions:"district",showDistrict:!0,showLabel:!1,lineWidth:2,lineOffset:0,extrudeLineWidth:6,extrudeLine:!0,equirectangular:!1,fahey:!1,projectionType:"mercator",polarAngle:Math.PI/180*120,azimuthAngle:0,showOneLevel:!1,handleBackKeepCamvasState:!0,curvatureResolution:0,worldPacificCentre:!1,mapBoundary:!0,mergeSide:!1},s),{geojsonMap:r,extrudeLineGeojsonMap:f,bboxMap:de})),this.options.equirectangular&&(this.options.projectionType="equirectangular"),this.options.fahey&&(this.options.projectionType="fahey",this.pscale=100,this.pcenter=[0,0]),this.pencilConfig=PENCIL_CONFIG$4,(this.getAdcodeShowLevel(this.options.adcode)==="province"||this.getAdcodeShowLevel(this.options.adcode)==="country")&&(this.extendsOptions.parentBg=()=>this.options.parentBg,this.extendsOptions.parentBgDepth=()=>this.options.parentBgDepth,this.extendsOptions.parentBgTopSegments=()=>this.options.parentBgTopSegments,this.extendsOptions.continentsBg=()=>this.options.continentsBg,this.extendsOptions.continentsBgDepth=()=>this.options.continentsBgDepth),this.options.adcode===0?world(this):this.options.style==="map2"||(this.options.adcode===1e5?china(this):base$1(this))}handleSetting(s,r){return q0(this,null,function*(){if(yield on(hn.prototype,this,"handleSetting").call(this,s,r),s==="label")r===!1?(this.eraseLabels(),this.options.showLabel=!1):(this.settings.labelLite=!1,yield this.settings.labelLite,this.options.showLabel=!0,yield this.drawLabels());else if(s==="labelLite")r===!1?(this.eraseLabels(),this.options.showLabel=!1):(this.settings.label=!1,yield this.settings.label,this.options.showLabel="lite",yield this.drawLabels());else if(s==="shadowMap")r===!1?this.shadowMapDisabled():yield this.shadowMapEnabled();else if(s.startsWith("测试板块颜色.color")){const[,f]=s.split("caId.");if(f){const de=this.options.adcode===0,Xe=de?"ISO_A2":"adcode";this.setAreaColorByProperty(Xe,de?f:+f,r)}}else if(s.startsWith("测试边框颜色.color")){const[,f]=s.split("caId.");if(f){const de=this.options.adcode===0,Xe=de?"ISO_A2":"adcode";this.setLineColorByProperty(Xe,de?f:+f,r)}}else if(s.startsWith("测试边框宽度")){const[,f]=s.split("caId.");if(f){const de=this.options.adcode===0,Xe=de?"ISO_A2":"adcode";this.setLineWidthByProperty(Xe,de?f:+f,r)}}else if(s.startsWith("测试添加面")){const[,f]=s.split("caId.");if(f){const de=this.options.adcode===0,Xe=de?"ISO_A2":"adcode";yield this.addAreaPlaneByProperty(Xe,de?f:+f)}}return r})}init(){return q0(this,null,function*(){const{adcode:s}=this.options;this.options.center&&(this.pcenter=this.options.center),this.projection=F$1({center:this.pcenter,scale:this.pscale,projectionType:this.options.projectionType,rotate:this.options.worldPacificCentre?[-160,0]:void 0}),this.meters=this.projection([1*1141e-8+this.pcenter[0],0])[0],yield this.initPencil(),console.time(`vis-core:time.${this.visName}-loader`),this.loaderAdd(),console.timeEnd(`vis-core:time.${this.visName}-loader`),yield this.loader.loadAll(),this.group=yield this.drawController.draw("Group"),yield this.initMaterial(),yield this.initVis(s),yield Promise.all(this.drawController.objectsPromise)})}initVis(s){return q0(this,null,function*(){var Xe;if(this.options.parentBg){const Je=geojsonCn.adcodeMap[s].parent||0,Ke=this.options.geojsonMap[Je],Qe=this.options.bboxMap[Je],_e=this.mList.getMaterialObj("parentPlane"),$e=yield this.drawController.draw("PlaneMap",{geojson:Ke,projection:{center:this.pcenter,scale:this.pscale,rotate:[0,0],projectionType:this.options.projectionType},areaGroup:!1,bbox:Qe,depth:this.options.parentBgDepth,topSegments:this.options.parentBgTopSegments,materialOptions:ci({},_e)}),qe=Je===0?"world":`${Je}`;$e.lineArr.forEach(st=>{st.object3d.name="背景线",this.mList.setObject3d(st.object3d,qe+"line",{baseObject:st}),this.initBaseObjectUserData(st)}),$e.areaArr.forEach(st=>{st.object3d.name="背景板块",this.mList.setObject3d(st.object3d,qe+"area",{baseObject:st})}),$e.position.z=-this.options.parentBgDepth,this.parentBg.push($e)}if(this.options.continentsBg){this.continentsBg=yield this.drawController.draw("ContinentsBg",{depth:this.options.continentsBgDepth,scale:this.pscale});const Je=this.getLocationPosition([104,37.5]);this.continentsBg.position.set(...Je),this.continentsBg.position.z=.1}yield this.setAdcode({adcodes:[s],duration:0});const r=yield this.drawController.draw("Light",{type:"SpotLight",color:this.options.worldPacificCentre?"#82d9f2":"#c1e6dd",intensity:3,distance:0,angle:this.options.continentsBg?1:.5,penumbra:1,decay:0});this.fitTo(this.map,{enableTransition:!1});const f=this.pencil.controls.getPosition(new Vector3,!1),de=this.pencil.controls.getTarget(new Vector3,!1);if(r==null||r.spotLight.position.copy(f),r==null||r.spotLight.target.position.copy(de),this.options.mapBoundary){const Je=new Box3().setFromObject((Xe=this.map)==null?void 0:Xe.object3d);this.pencil.controls.setBoundary(Je)}})}loaderAddBg(){const s=this.loader;(this.options.parentBg||this.options.continentsBg)&&s.add(["/image/map/dian.webp"])}initMaterialBg(){return q0(this,null,function*(){const s=this.loader;if(this.options.parentBg){const r=(()=>{const f=s.getAsset("/image/map/dian.webp");f.wrapS=RepeatWrapping,f.wrapT=RepeatWrapping;const de=150;f.repeat.set(de,de);const Xe=new MeshStandardMaterial({name:"顶面",emissive:"#081417",map:f}),Je=new MeshBasicMaterial({name:"侧面",map:s.getAsset("/image/map/jianbian.webp")}),Ke=new it$1({color:new Color$1("#50766E"),sizeAttenuation:0,lineWidth:this.options.lineWidth});return{topMat:Xe,sideMat:Je,lineMat:Ke}})();this.mList.setMaterialObj("parentPlane",r)}if(this.options.continentsBg){const r=(()=>{const f=s.getAsset("/image/map/dian.webp");f.wrapS=RepeatWrapping,f.wrapT=RepeatWrapping;const de=50;f.repeat.set(de,de);const Xe=new MeshStandardMaterial({name:"顶面",emissive:"#154532",map:f}),Je=new MeshBasicMaterial({name:"侧面",color:"#0c1528"}),Ke=new it$1({color:new Color$1("#09e6c1"),sizeAttenuation:0,lineWidth:this.options.lineWidth});return{topMat:Xe,sideMat:Je,lineMat:Ke}})();this.mList.setMaterialObj("continents",r),this.mList.setShowMaterialList("continentsArea",["continents#topMat","continents#sideMat"],{name:"板块材质"}),this.mList.setShowMaterialList("continentsLine","continents#lineMat",{name:"线材质"})}})}setAreaMixColor(s,r){this.setAreaColorByProperty("adcode",s,r,!0)}setAreaColorByProperty(s,r,f,de=!1){if(!this.map)return;const Xe=this.map.areaArr.find(Je=>Je.userData[s]===r);if(Xe){const Je=this.map.setAreaColor(Xe,f);de&&Je&&(Je.color.set("#ffffff"),Je.onBeforeCompile=Ke=>{Ke.uniforms.c={value:new Color$1(f)},Ke.fragmentShader=`
|
|
@@ -5328,7 +5328,7 @@ version 0.8.2
|
|
|
5328
5328
|
gl_FragColor = vec4(ccccc, alpha * 0.65);
|
|
5329
5329
|
|
|
5330
5330
|
|
|
5331
|
-
`)},Je.needsUpdate=!0)}}setAreaEmissiveByProperty(s,r,f,de=1){if(!this.map)return;const Xe=this.map.areaArr.find(Je=>Je.userData[s]===r);Xe&&this.map.setAreaEmissive(Xe,f,de)}setLineColorByProperty(s,r,f){if(!this.map)return;const de=this.map.lineArr.find(Xe=>Xe.userData[s]===r);de&&this.map.setLineColor(de,f)}setLineWidthByProperty(s,r,f){if(!this.map)return;const de=this.map.lineArr.find(Xe=>Xe.userData[s]===r);de&&this.map.setLineWidth(de,f)}addAreaPlaneByProperty(de,Xe){return q0(this,arguments,function*(s,r,f={}){var Qe;if(!this.map)return;const Ke=this.map.options.geojson.features.find(_e=>_e.properties&&_e.properties[s]===r);if(Ke){const _e=`${r}`;let $e=!1;if(this.mList.objectList.forEach((Wt,Yt)=>{if(Wt.key==="planeCopyExtrudePolygon"+_e){console.warn("已经存在复制面",_e),$e=!0;return}}),$e)return;let qe;f.material?n$1(f.material)?qe=new MeshBasicMaterial(ci({},f.material)):qe=f.material:qe=new MeshBasicMaterial({color:"red"});let st;f.lineMaterial?n$1(f.lineMaterial)?st=new it$1(ci({},f.lineMaterial)):st=f.lineMaterial:st=new it$1({color:new Color$1("blue"),sizeAttenuation:0,lineWidth:this.options.lineWidth});const dt=yield this.map.addPlane(Ke,{material:qe,lineMaterial:st,topSegments:(Qe=f.topSegments)!=null?Qe:0});return dt.children.forEach(Wt=>{Wt instanceof je?(Wt.object3d.name="复制面"+_e,this.mList.setObject3d(Wt.object3d,"planeCopyExtrudePolygon"+_e,{baseObject:Wt})):Wt instanceof Ge&&(Wt.object3d.name="复制线"+_e,this.mList.setObject3d(Wt.object3d,"planeCopyLine"+_e,{baseObject:Wt}))}),dt}})}show(){return q0(this,null,function*(){if(this.showState||this.options.disableInitShow)return;on(hn.prototype,this,"show").call(this);const s=this.drawController.group;this.mapHistory[0]&&(yield sinusoidalInOut({onUpdate:r=>{s.position.z=-this.mapHistory[0].depth*(1-r)}}).start()),this.handlePickTest()})}handlePickTest(){return q0(this,null,function*(){var s;this.playing||(s=this.mapArea)==null||s.forEach(r=>{r.onPointerEvent("down",f=>q0(this,null,function*(){var Ke,Qe,_e;(Qe=(Ke=this.pencil)==null?void 0:Ke.helperController)==null||Qe.removeAllExcludeScene(),(_e=this.pencil.helperController)==null||_e.add(f.object3d),this.caId=f.userData.ISO_A2||f.userData.adcode;const de=this.mapLine.find($e=>$e.userData.ISO_A2===this.caId||$e.userData.adcode===this.caId),Je=f.object3d.material[0].color.getHexString();this.settings["测试板块颜色.color:::caId"]="#"+Je,yield this.settings["测试板块颜色.color:::caId"],this.settings["测试边框颜色.color:::caId"]="#"+(de==null?void 0:de.material.color.getHexString()),yield this.settings["测试边框颜色.color:::caId"],this.settings["测试边框宽度:::caId"]=de==null?void 0:de.material.lineWidth,yield this.settings["测试边框宽度:::caId"],this.emit("settingsChanged")}))})})}hide(){return q0(this,null,function*(){if(!this.showState)return;const s=this.drawController.group;yield sinusoidalInOut({onUpdate:r=>{s.position.z=-this.mapHistory[0].depth*r}}).start(),setTimeout(()=>{on(hn.prototype,this,"hide").call(this)})})}shadowMapEnabled(){return q0(this,null,function*(){if(this.pencil.scene.userData.shadowMapEnabled)return;this.pencil.scene.userData.shadowMapEnabled=!0;const s=yield this.drawController.draw("Light",{type:"SpotLight",color:"#c1e6dd",intensity:1,distance:0,angle:.5,penumbra:1,decay:0}),r=s.object3d;this.mList.changeObject3dKey(r,"Shadow$1"),this.mList.changeObject3dKey(r.target,"Shadow$1"),this.shadowMapLight=s,s.object3d.position.set(.281,32.487,43.077),s.object3d.castShadow=!0;const f=yield this.drawController.draw("PlaneShadow");this.mList.setObject3d(f.object3d,"PlaneShadow",{baseObject:f}),this.planeShadow=f})}shadowMapDisabled(){this.pencil.scene.userData.shadowMapEnabled&&(this.pencil.scene.userData.shadowMapEnabled=!1,this.shadowMapLight&&(this.shadowMapLight.erase(),this.mList.delObject3d(this.shadowMapLight.object3d),this.shadowMapLight=void 0),this.planeShadow&&(this.mList.delObject3d(this.planeShadow.object3d),this.planeShadow.erase(),this.planeShadow=void 0))}getDepth(s,r){const f=this.getAdcodeShowLevel(s);let de=this.options.mapDepth;Array.isArray(de)||(de=new Array(3).fill(de));let Xe;if(f==="country"?Xe=de[0]:f==="province"?Xe=de[1]:Xe=de[2],this.options.depthReference&&this.options.bboxMap[s]){const Je=this.options.depthReference,Ke=this.options.bboxMap[s];Xe=Xe*this.getReferenceScale(Je,Ke)}else if(this.mapHistory.length&&this.options.bboxMap[this.mapHistory[0].mapInfo.adcode]){const Je=this.options.bboxMap[this.mapHistory[0].mapInfo.adcode],Ke=turf.bbox(r),Qe=this.getReferenceScale(Je,Ke);Xe=Xe*Qe}return Xe}getReferenceScale(s,r){const f=Math.abs(r[3]-r[1])/Math.abs(s[3]-s[1]),de=Math.abs(r[2]-r[0])/Math.abs(s[2]-s[0]);return Math.max(f,de)}getAdcodeShowLevel(s){var r;if((r=this.options.fixCity)!=null&&r[s]&&(s=this.options.fixCity[s]),s===0)return"world";if(s===1e5)return"country";{const{level:f,parent:de}=geojsonCn.adcodeMap[s],Xe=de&&geojsonCn.adcodeMap[de].level;return f==="district"&&Xe==="province"?"city":f}}handleClick(s){var de;const{drillDownRestrictions:r}=this.options;if(this.isAnimating)return;const f=(de=this.map)==null?void 0:de.pickArea(s);if(f&&f.userData.adcode&&this.getAdcodeShowLevel(f.userData.adcode)!==r)this.clickArea({adcodes:[...this.adcodes,f.userData.adcode]});else if(this.options.clickOusideBack&&!f&&this.mapHistory.length>1){const Xe=[...this.adcodes];Xe.pop(),this.clickArea({adcodes:Xe})}}beforeClickArea(s){return!0}clickArea(f){return q0(this,arguments,function*({adcodes:s,duration:r=1e3}){(yield this.beforeClickArea(s))!==!1&&(this.emit("beforeDrillDown",s),yield this.setAdcode({adcodes:s,duration:r}),this.emit("afterDrillDown",s))})}drawLabels(){return q0(this,null,function*(){var f;const s=this.options.showLabel;!((f=this.mapArea)!=null&&f.length)||!s||this.drawController.getAllObject("Node",{key:"mapLabel"}).length||(yield Promise.all(this.mapArea.map(de=>q0(this,null,function*(){let{name:Xe,adcode:Je,centroid:Ke}=de.userData;const{DistrictID:Qe,DistName:_e,NAME_CN:$e,CENTROID:qe,center:st}=de.userData;Je=Je||Qe,Ke=this.options.adcode===0?qe:Ke||st,Xe=this.options.adcode===0?$e:Xe||_e;const dt=this.getLocationPosition(Ke);if(this.drawController.getObject("Node",{key:`mapLabel-${Je}`})||!dt)return;const[Wt,Yt,rt]=dt;let Zt=Xe;s==="lite"&&Zt&&(Zt=Xe.replace("自治州","").replace("地区","").replace("自治区","").replace("省","").replace("市","").replace("壮族","").replace("特别行政区","").replace("回族","").replace("维吾尔",""));const vt=Zt&&getLabelElement(Zt),Tt=Zt!=null&&Zt.startsWith("澳门")?-1:0;yield this.drawController.draw("Node",{position:new Vector3(Wt,Yt+Tt,rt),children:vt,key:`mapLabel#${this.options.adcode===0?Xe:Je}`})}))))})}eraseLabels(){const s=this.drawController.getAllObject("Node",{key:"mapLabel"});this.drawController.erase(...s)}geAdcodePosition(s){var f;const r=(f=this.mapArea)==null?void 0:f.find(de=>de.userData.adcode===s);if(r){const{centroid:de,center:Xe}=r.userData;return this.getLocationPosition(de||Xe)}}getLocationPosition(s){const[r,f]=s,[de,Xe]=this.projection([r,f]);return[de,-Xe,this.mapObj?this.mapObj.z+this.mapObj.depth:0]}getAdcodeScreenPosition(s){const r=this.geAdcodePosition(s);if(r){const[f,de,Xe]=r,Je=new Vector3(f,de,Xe);Je.project(this.pencil.camera);const{width:Ke,height:Qe}=this.pencil.getSize(),_e=(Je.x*.5+.5)*Ke,$e=(Je.y*-.5+.5)*Qe;return{x:_e,y:$e}}}booleanPointInCn(s){return json100000.features[0].geometry.coordinates.some(r=>turf.booleanPointInPolygon(turf.point(s),turf.polygon(r)))}handleDrillDown(de){return q0(this,arguments,function*({adcode:s,duration:r,saveBackCamvasState:f}){var Xe,Je,Ke,Qe,_e,$e,qe,st;if(typeof s!="undefined"&&!this.isAnimating){const dt=(Xe=this.map)==null?void 0:Xe.findGroup(s),Wt=geojsonCn.findLevelJsonItem(+s)||s===0;if(this.isAnimating||!Wt)return;this.isAnimating=!0;const{name:Yt}=Wt;let{res:rt}=(Je=this.options.geojsonMap)!=null&&Je[s]?{res:(Ke=this.options.geojsonMap)==null?void 0:Ke[s]}:yield jsonFetch(`${this.options.assetsPrefix}/geojson/json/${s}.json`),{res:Zt}=this.options.extrudeLine?(Qe=this.options.extrudeLineGeojsonMap)!=null&&Qe[s]?{res:(_e=this.options.extrudeLineGeojsonMap)==null?void 0:_e[s]}:yield jsonFetch(`${this.options.assetsPrefix}/geojson/json-lite/${s}.json`):{res:void 0};if(!this.options.showDistrict&&this.getAdcodeShowLevel(s)==="city"&&(rt=Zt,Zt=void 0),[rt,Zt].filter(Boolean).forEach(Tt=>{if(!Tt.features[0].properties.adcode&&s!==0){const Jt=geojsonCn.adcodeMap[s];Tt.features[0].properties=zi(ci(ci({},Tt.features[0].properties),Jt),{center:[Jt.lng,Jt.lat]})}}),rt){const Tt=this.options.plateInCenter&&(this.mapHistory.length<1||this.options.drillDownPlateInCenter);if(Tt&&this.fixNear(s),($e=this.options.fixGeojson)!=null&&$e[s]){const c0=(qe=this.options.fixGeojson)==null?void 0:qe[s];if(c0.startsWith("-")){const l0=+c0.slice(1);rt.features=rt.features.filter(m0=>m0.properties.adcode!==l0)}}const Jt=this.options.bboxMap[s]||Object.values(this.options.bboxMap).pop();this.eraseLabels(),this.map&&(this.options.drillDownHideParent&&this.parentBg.forEach(c0=>{c0.hide()}),this.options.showOneLevel?this.map.hide():this.map.deactive(),(f!=null?f:this.options.handleBackKeepCamvasState)&&this.saveBackCamvasState(-1));const $t=this.mapHistory.length,e0=$t-1,t0=this.getDepth(s,Zt||rt),i0=(st=this.mapHistory[e0])==null?void 0:st.depth,n0=$t===0?0:this.mapHistory[e0].z+(this.options.showOneLevel?0:i0),s0=$t===0?0:n0-t0,d0=turf.center(rt).geometry.coordinates,[u0,G0]=this.projection(d0),h0=yield this.drawPlaneMap({geojson:rt,extrudeLineGeojson:Zt,depth:t0,bbox:Jt,adcode:s});h0.position.setZ(s0),this.mapHistory.push({map:h0,mapInfo:Wt,z:n0,depth:t0,cX:u0,cY:-G0});const o0=h0.position.z;Tt&&(h0.position.z=n0,this.fitTo(h0,{enableTransition:r!==0}),h0.position.z=o0),dt==null||dt.hide(),this.map&&$t!==0&&(r?yield sinusoidalInOut({onUpdate:c0=>{this.map.position.z=o0+(n0-o0)*c0}}).start({duration:r}):this.map.position.z=n0),this.drawLabels()}else console.log(`${Yt}的地图数据不存在`);this.event.emit("handleDrillDown",{adcode:s,z:this.mapObj.z+this.mapObj.depth})}this.isAnimating=!1})}saveBackCamvasState(s){const r=this.mapHistory.at(s);r&&(r.cameraPositon=this.pencil.cameraPositon.clone(),r.cameraTarget=this.pencil.cameraTarget.clone())}fixNear(s){const r=this.getAdcodeShowLevel(s);s===0?(this.pencil.camera.near=1,this.pencil.camera.far=1e3,this.pencil.camera.updateProjectionMatrix()):(r==="country"||r==="province")&&this.pencil.camera.near!==this.pencilConfig.camera.near*10?(this.pencil.camera.near=this.pencilConfig.camera.near*10,this.pencil.camera.updateProjectionMatrix()):(r==="city"||r==="district")&&this.pencil.camera.near!==this.pencilConfig.camera.near&&(this.pencil.camera.near=this.pencilConfig.camera.near,this.pencil.camera.updateProjectionMatrix())}absoluteAngle(s,r){const f=Math.PI*2,de=s-r;return MathUtils.euclideanModulo(de+Math.PI,f)-Math.PI}fitTo(Xe){return q0(this,arguments,function*(s,{polarAngle:r,azimuthAngle:f,enableTransition:de=!0}={}){var Wt,Yt,rt;if(!(s!=null&&s.object3d))return;const Je=(Yt=this.options.lookAtMap)==null?void 0:Yt[(Wt=this.mapInfo)==null?void 0:Wt.adcode];if(Je){const[Zt,vt,Tt,Jt,$t,e0]=Je;yield(rt=this.pencil.controls)==null?void 0:rt.setLookAt(Zt,vt,Tt,Jt,$t,e0,de);return}const Ke=this.options.mapPadding,{height:Qe,width:_e}=this.pencil.getSize();Qe<Ke[0]+Ke[2]+100&&(Ke[0]=0,Ke[2]=0),_e<Ke[1]+Ke[3]+100&&(Ke[1]=0,Ke[3]=0);const $e=r||this.options.polarAngle,qe=f||this.options.azimuthAngle,st=this.pencil.controls.azimuthAngle,dt=this.pencil.controls.polarAngle;yield Promise.all([this.paddingInCssPixel(s,Ke[0],Ke[1],Ke[2],Ke[3],de),this.pencil.controls.rotateTo(st+this.absoluteAngle(qe,st),dt+this.absoluteAngle($e,dt),de)])})}paddingInCssPixel(s,r,f,de,Xe,Je){const{camera:Ke,controls:Qe}=this.pencil,_e=Ke.fov*MathUtils.DEG2RAD,$e=this.pencil.getSize().height,{size:qe}=s.getSize(),st=qe.x,dt=qe.y,Wt=qe.z;let Yt=Qe.getDistanceToFitBox(st,dt,Wt),rt=0,Zt=0,vt=0,Tt=0;for(let Jt=0;Jt<10;Jt++){const $t=Yt-Wt*.5,e0=2*Math.tan(_e*.5)*Math.abs($t)/$e;rt=r*e0,Zt=de*e0,vt=Xe*e0,Tt=f*e0,Yt=Qe.getDistanceToFitBox(st+vt+Tt,dt+rt+Zt,Wt)}return Qe.fitToBox(s.object3d,Je,{paddingLeft:vt,paddingRight:Tt,paddingBottom:Zt,paddingTop:rt})}drawPlaneMap(Je){return q0(this,arguments,function*({geojson:s,extrudeLineGeojson:r,bbox:f,depth:de,adcode:Xe}){const Ke=this.mList.getMaterialObj("plane"),Qe=ci({},Ke),_e=yield this.drawController.draw("PlaneMap",{geojson:s,extrudeLineGeojson:r,depth:de,projection:{center:this.pcenter,scale:this.pscale,rotate:this.options.worldPacificCentre?[-160,0]:void 0,projectionType:this.options.projectionType},materialOptions:Qe,bbox:f,topSegments:this.options.topSegments,lineOffset:this.options.lineOffset,mergeSide:this.options.mergeSide},this.group);return _e.extrudelineArr&&_e.extrudelineArr.forEach($e=>{$e.object3d.name="板块边线",this.mList.setObject3d($e.object3d,"extrudeLine",{baseObject:$e}),this.initBaseObjectUserData($e)}),this.mList.setObject3d(_e.object3d,Xe===1e5?"chinaGroup":"planeMapGroup",{baseObject:_e}),_e})}handleBack(){return q0(this,arguments,function*({duration:s=1e3,handleLookBack:r=!0}={}){if(this.mapHistory.length>1&&!this.isAnimating){this.isAnimating=!0;const f=this.mapHistory.pop();if(f!=null&&f.map){if(!this.options.drillDownPlateInCenter){const Je=f.map.position.z,Ke=this.mapObj.z+(this.mapObj.depth-f.depth);yield sinusoidalInOut({onUpdate:Qe=>{f.map.position.z=Je+(Ke-Je)*Qe}}).start({duration:s})}this.drawController.eraseWithoutMaterial(f.map)}const{map:de}=this.mapObj,Xe=de==null?void 0:de.findGroup(f==null?void 0:f.mapInfo.adcode);Xe&&Xe.show(),de&&r&&(this.eraseLabels(),this.options.showOneLevel?de.show():de.active(),this.options.drillDownHideParent&&this.parentBg.forEach(Je=>{Je.show()}),yield this.handleLookBack(s),this.drawLabels()),this.emit("handleBack",{adcodes:this.adcodes}),this.isAnimating=!1}})}handleLookBack(s){return q0(this,null,function*(){var Xe;const{map:r,cameraPositon:f,cameraTarget:de}=this.mapObj;f&&de?yield(Xe=this.pencil.controls)==null?void 0:Xe.setLookAt(f.x,f.y,f.z,de.x,de.y,de.z,s!==0):yield this.fitTo(r,{enableTransition:s!==0})})}compareLocations(s,r){const f=s.filter(Ke=>Ke),de=r.filter(Ke=>Ke),Xe=[];let Je=0;for(let Ke=0;Ke<Math.min(f.length,de.length)&&f[Ke]===de[Ke];Ke++)Je++;for(let Ke=Je;Ke<f.length;Ke++)Xe.push(-1);for(let Ke=Je;Ke<de.length;Ke++)Xe.push(de[Ke]);return Xe}setAdcode(f){return q0(this,arguments,function*({adcodes:s,duration:r}){const{adcodes:de}=this;if(!(JSON.stringify(s)===JSON.stringify(de)||this.isAnimating))if(JSON.stringify(s)===JSON.stringify([0]))try{yield this.handleDrillDown({adcode:0,duration:r})}catch(_e){console.error(_e)}else{const{country:_e,province:$e,city:qe,district:st}=s.reduce((vt,Tt)=>{const Jt=this.getAdcodeShowLevel(Tt);return vt[Jt]=Tt,vt},{}),{country:dt,province:Wt,city:Yt,district:rt}=de.reduce((vt,Tt)=>{const Jt=this.getAdcodeShowLevel(Tt);return vt[Jt]=Tt,vt},{}),Zt=this.compareLocations([dt,Wt,Yt,rt],[_e,$e,qe,st]);try{for(var Xe=Yn(Zt.entries()),Je,Ke,Qe;Je=!(Ke=yield Xe.next()).done;Je=!1){const[vt,Tt]=Ke.value;const Jt=vt===Zt.length-1?r:0;Tt===-1?yield this.handleBack({duration:Jt,handleLookBack:!!Jt}):yield this.handleDrillDown({adcode:Tt,duration:Jt,saveBackCamvasState:Zt.includes(-1)?!1:this.options.handleBackKeepCamvasState})}}catch(Ke){Qe=[Ke]}finally{try{Je&&(Ke=Xe.return)&&(yield Ke.call(Xe))}finally{if(Qe)throw Qe[0]}}}})}setPadding(s,r=!1){this.options.mapPadding=s,r&&this.fitTo(this.map)}dispose(){var s,r;(s=this.map)==null||s.dispose(),this.parentBg.forEach(f=>{f.dispose()}),this.parentBg.length=0,(r=this.continentsBg)==null||r.dispose(),this.continentsBg=void 0,this.mapHistory.length=0,super.dispose()}};F0(hn,"VisName","map");let Map$2=hn;const PENCIL_CONFIG$3={camera:{near:.01,far:100,fov:45,up:new Vector3(0,0,1)}};class Reflector extends Mesh{constructor(e,s={}){super(e),this.isReflector=!0,this.type="Reflector",this.camera=new PerspectiveCamera;const r=this,f=s.color!==void 0?new Color$1(s.color):new Color$1(8355711),de=s.textureWidth||512,Xe=s.textureHeight||512,Je=s.clipBias||0,Ke=s.shader||Reflector.ReflectorShader,Qe=s.multisample!==void 0?s.multisample:4,_e=new Plane$1,$e=new Vector3,qe=new Vector3,st=new Vector3,dt=new Matrix4,Wt=new Vector3(0,0,-1),Yt=new Vector4,rt=new Vector3,Zt=new Vector3,vt=new Vector4,Tt=new Matrix4,Jt=this.camera,$t=new WebGLRenderTarget(de,Xe,{samples:Qe,type:HalfFloatType}),e0=new ShaderMaterial({name:Ke.name!==void 0?Ke.name:"unspecified",uniforms:UniformsUtils.clone(Ke.uniforms),fragmentShader:Ke.fragmentShader,vertexShader:Ke.vertexShader});e0.uniforms.tDiffuse.value=$t.texture,e0.uniforms.color.value=f,e0.uniforms.textureMatrix.value=Tt,this.material=e0,this.onBeforeRender=function(t0,i0,n0){if(qe.setFromMatrixPosition(r.matrixWorld),st.setFromMatrixPosition(n0.matrixWorld),dt.extractRotation(r.matrixWorld),$e.set(0,0,1),$e.applyMatrix4(dt),rt.subVectors(qe,st),rt.dot($e)>0)return;rt.reflect($e).negate(),rt.add(qe),dt.extractRotation(n0.matrixWorld),Wt.set(0,0,-1),Wt.applyMatrix4(dt),Wt.add(st),Zt.subVectors(qe,Wt),Zt.reflect($e).negate(),Zt.add(qe),Jt.position.copy(rt),Jt.up.set(0,1,0),Jt.up.applyMatrix4(dt),Jt.up.reflect($e),Jt.lookAt(Zt),Jt.far=n0.far,Jt.updateMatrixWorld(),Jt.projectionMatrix.copy(n0.projectionMatrix),Tt.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),Tt.multiply(Jt.projectionMatrix),Tt.multiply(Jt.matrixWorldInverse),Tt.multiply(r.matrixWorld),_e.setFromNormalAndCoplanarPoint($e,qe),_e.applyMatrix4(Jt.matrixWorldInverse),Yt.set(_e.normal.x,_e.normal.y,_e.normal.z,_e.constant);const s0=Jt.projectionMatrix;vt.x=(Math.sign(Yt.x)+s0.elements[8])/s0.elements[0],vt.y=(Math.sign(Yt.y)+s0.elements[9])/s0.elements[5],vt.z=-1,vt.w=(1+s0.elements[10])/s0.elements[14],Yt.multiplyScalar(2/Yt.dot(vt)),s0.elements[2]=Yt.x,s0.elements[6]=Yt.y,s0.elements[10]=Yt.z+1-Je,s0.elements[14]=Yt.w,r.visible=!1;const d0=t0.getRenderTarget(),u0=t0.xr.enabled,G0=t0.shadowMap.autoUpdate;t0.xr.enabled=!1,t0.shadowMap.autoUpdate=!1,t0.setRenderTarget($t),t0.state.buffers.depth.setMask(!0),t0.autoClear===!1&&t0.clear(),t0.render(i0,Jt),t0.xr.enabled=u0,t0.shadowMap.autoUpdate=G0,t0.setRenderTarget(d0);const h0=n0.viewport;h0!==void 0&&t0.state.viewport(h0),r.visible=!0},this.getRenderTarget=function(){return $t},this.dispose=function(){$t.dispose(),r.material.dispose()}}}Reflector.ReflectorShader={name:"ReflectorShader",uniforms:{color:{value:null},tDiffuse:{value:null},textureMatrix:{value:null}},vertexShader:`
|
|
5331
|
+
`)},Je.needsUpdate=!0)}}setAreaEmissiveByProperty(s,r,f,de=1){if(!this.map)return;const Xe=this.map.areaArr.find(Je=>Je.userData[s]===r);Xe&&this.map.setAreaEmissive(Xe,f,de)}setLineColorByProperty(s,r,f){if(!this.map)return;const de=this.map.lineArr.find(Xe=>Xe.userData[s]===r);de&&this.map.setLineColor(de,f)}setLineWidthByProperty(s,r,f){if(!this.map)return;const de=this.map.lineArr.find(Xe=>Xe.userData[s]===r);de&&this.map.setLineWidth(de,f)}addAreaPlaneByProperty(de,Xe){return q0(this,arguments,function*(s,r,f={}){var Qe;if(!this.map)return;const Ke=this.map.options.geojson.features.find(_e=>_e.properties&&_e.properties[s]===r);if(Ke){const _e=`${r}`;let $e=!1;if(this.mList.objectList.forEach((Wt,Yt)=>{if(Wt.key==="planeCopyExtrudePolygon"+_e){console.warn("已经存在复制面",_e),$e=!0;return}}),$e)return;let qe;f.material?n$1(f.material)?qe=new MeshBasicMaterial(ci({},f.material)):qe=f.material:qe=new MeshBasicMaterial({color:"red"});let st;f.lineMaterial?n$1(f.lineMaterial)?st=new it$1(ci({},f.lineMaterial)):st=f.lineMaterial:st=new it$1({color:new Color$1("blue"),sizeAttenuation:0,lineWidth:this.options.lineWidth});const dt=yield this.map.addPlane(Ke,{material:qe,lineMaterial:st,topSegments:(Qe=f.topSegments)!=null?Qe:0});return dt.children.forEach(Wt=>{Wt instanceof je?(Wt.object3d.name="复制面"+_e,this.mList.setObject3d(Wt.object3d,"planeCopyExtrudePolygon"+_e,{baseObject:Wt})):Wt instanceof Ge&&(Wt.object3d.name="复制线"+_e,this.mList.setObject3d(Wt.object3d,"planeCopyLine"+_e,{baseObject:Wt}))}),dt}})}show(){return q0(this,null,function*(){if(this.showState||this.options.disableInitShow)return;on(hn.prototype,this,"show").call(this);const s=this.drawController.group;this.mapHistory[0]&&(yield sinusoidalInOut({onUpdate:r=>{s.position.z=-this.mapHistory[0].depth*(1-r)}}).start()),this.handlePickTest()})}handlePickTest(){return q0(this,null,function*(){var s;this.playing||(s=this.mapArea)==null||s.forEach(r=>{r.onPointerEvent("down",f=>q0(this,null,function*(){var Ke,Qe,_e;(Qe=(Ke=this.pencil)==null?void 0:Ke.helperController)==null||Qe.removeAllExcludeScene(),(_e=this.pencil.helperController)==null||_e.add(f.object3d),this.caId=f.userData.ISO_A2||f.userData.adcode;const de=this.mapLine.find($e=>$e.userData.ISO_A2===this.caId||$e.userData.adcode===this.caId),Je=f.object3d.material[0].color.getHexString();this.settings["测试板块颜色.color:::caId"]="#"+Je,yield this.settings["测试板块颜色.color:::caId"],this.settings["测试边框颜色.color:::caId"]="#"+(de==null?void 0:de.material.color.getHexString()),yield this.settings["测试边框颜色.color:::caId"],this.settings["测试边框宽度:::caId"]=de==null?void 0:de.material.lineWidth,yield this.settings["测试边框宽度:::caId"],this.emit("settingsChanged")}))})})}hide(){return q0(this,null,function*(){if(!this.showState)return;const s=this.drawController.group;yield sinusoidalInOut({onUpdate:r=>{s.position.z=-this.mapHistory[0].depth*r}}).start(),setTimeout(()=>{on(hn.prototype,this,"hide").call(this)})})}shadowMapEnabled(){return q0(this,null,function*(){if(this.pencil.scene.userData.shadowMapEnabled)return;this.pencil.scene.userData.shadowMapEnabled=!0;const s=yield this.drawController.draw("Light",{type:"SpotLight",color:"#c1e6dd",intensity:1,distance:0,angle:.5,penumbra:1,decay:0}),r=s.object3d;this.mList.changeObject3dKey(r,"Shadow$1"),this.mList.changeObject3dKey(r.target,"Shadow$1"),this.shadowMapLight=s,s.object3d.position.set(.281,32.487,43.077),s.object3d.castShadow=!0;const f=yield this.drawController.draw("PlaneShadow");this.mList.setObject3d(f.object3d,"PlaneShadow",{baseObject:f}),this.planeShadow=f})}shadowMapDisabled(){this.pencil.scene.userData.shadowMapEnabled&&(this.pencil.scene.userData.shadowMapEnabled=!1,this.shadowMapLight&&(this.shadowMapLight.erase(),this.mList.delObject3d(this.shadowMapLight.object3d),this.shadowMapLight=void 0),this.planeShadow&&(this.mList.delObject3d(this.planeShadow.object3d),this.planeShadow.erase(),this.planeShadow=void 0))}getDepth(s,r){const f=this.getAdcodeShowLevel(s);let de=this.options.mapDepth;Array.isArray(de)||(de=new Array(3).fill(de));let Xe;if(f==="country"?Xe=de[0]:f==="province"?Xe=de[1]:Xe=de[2],this.options.depthReference&&this.options.bboxMap[s]){const Je=this.options.depthReference,Ke=this.options.bboxMap[s];Xe=Xe*this.getReferenceScale(Je,Ke)}else if(this.mapHistory.length&&this.options.bboxMap[this.mapHistory[0].mapInfo.adcode]){const Je=this.options.bboxMap[this.mapHistory[0].mapInfo.adcode],Ke=turf.bbox(r),Qe=this.getReferenceScale(Je,Ke);Xe=Xe*Qe}return Xe}getReferenceScale(s,r){const f=Math.abs(r[3]-r[1])/Math.abs(s[3]-s[1]),de=Math.abs(r[2]-r[0])/Math.abs(s[2]-s[0]);return Math.max(f,de)}getAdcodeShowLevel(s){var r;if((r=this.options.fixCity)!=null&&r[s]&&(s=this.options.fixCity[s]),s===0)return"world";if(s===1e5)return"country";{const{level:f,parent:de}=geojsonCn.adcodeMap[s],Xe=de&&geojsonCn.adcodeMap[de].level;return f==="district"&&Xe==="province"?"city":f}}handleClick(s){var de;const{drillDownRestrictions:r}=this.options;if(this.isAnimating)return;const f=(de=this.map)==null?void 0:de.pickArea(s);if(f&&f.userData.adcode&&this.getAdcodeShowLevel(f.userData.adcode)!==r)this.clickArea({adcodes:[...this.adcodes,f.userData.adcode]});else if(this.options.clickOusideBack&&!f&&this.mapHistory.length>1){const Xe=[...this.adcodes];Xe.pop(),this.clickArea({adcodes:Xe})}}beforeClickArea(s){return!0}clickArea(f){return q0(this,arguments,function*({adcodes:s,duration:r=1e3}){(yield this.beforeClickArea(s))!==!1&&(this.emit("beforeDrillDown",s),yield this.setAdcode({adcodes:s,duration:r}),this.emit("afterDrillDown",s))})}drawLabels(){return q0(this,null,function*(){var f;const s=this.options.showLabel;!((f=this.mapArea)!=null&&f.length)||!s||this.drawController.getAllObject("Node",{key:"mapLabel"}).length||(yield Promise.all(this.mapArea.map(de=>q0(this,null,function*(){let{name:Xe,adcode:Je,centroid:Ke}=de.userData;const{DistrictID:Qe,DistName:_e,NAME_CN:$e,CENTROID:qe,center:st}=de.userData;if(Je=Je||Qe,Ke=this.options.adcode===0?qe:Ke||st,Xe=this.options.adcode===0?$e:Xe||_e,!Ke)return;const dt=this.getLocationPosition(Ke);if(this.drawController.getObject("Node",{key:`mapLabel-${Je}`})||!dt)return;const[Wt,Yt,rt]=dt;let Zt=Xe;s==="lite"&&Zt&&(Zt=Xe.replace("自治州","").replace("地区","").replace("自治区","").replace("省","").replace("市","").replace("壮族","").replace("特别行政区","").replace("回族","").replace("维吾尔",""));const vt=Zt&&getLabelElement(Zt),Tt=Zt!=null&&Zt.startsWith("澳门")?-1:0;yield this.drawController.draw("Node",{position:new Vector3(Wt,Yt+Tt,rt),children:vt,key:`mapLabel#${this.options.adcode===0?Xe:Je}`})}))))})}eraseLabels(){const s=this.drawController.getAllObject("Node",{key:"mapLabel"});this.drawController.erase(...s)}geAdcodePosition(s){var f;const r=(f=this.mapArea)==null?void 0:f.find(de=>de.userData.adcode===s);if(r){const{centroid:de,center:Xe}=r.userData;return this.getLocationPosition(de||Xe)}}getLocationPosition(s){const[r,f]=s,[de,Xe]=this.projection([r,f]);return[de,-Xe,this.mapObj?this.mapObj.z+this.mapObj.depth:0]}getAdcodeScreenPosition(s){const r=this.geAdcodePosition(s);if(r){const[f,de,Xe]=r,Je=new Vector3(f,de,Xe);Je.project(this.pencil.camera);const{width:Ke,height:Qe}=this.pencil.getSize(),_e=(Je.x*.5+.5)*Ke,$e=(Je.y*-.5+.5)*Qe;return{x:_e,y:$e}}}booleanPointInCn(s){return json100000.features[0].geometry.coordinates.some(r=>turf.booleanPointInPolygon(turf.point(s),turf.polygon(r)))}handleDrillDown(de){return q0(this,arguments,function*({adcode:s,duration:r,saveBackCamvasState:f}){var Xe,Je,Ke,Qe,_e,$e,qe,st;if(typeof s!="undefined"&&!this.isAnimating){const dt=(Xe=this.map)==null?void 0:Xe.findGroup(s),Wt=geojsonCn.findLevelJsonItem(+s)||s===0;if(this.isAnimating||!Wt)return;this.isAnimating=!0;const{name:Yt}=Wt;let{res:rt}=(Je=this.options.geojsonMap)!=null&&Je[s]?{res:(Ke=this.options.geojsonMap)==null?void 0:Ke[s]}:yield jsonFetch(`${this.options.assetsPrefix}/geojson/json/${s}.json`),{res:Zt}=this.options.extrudeLine?(Qe=this.options.extrudeLineGeojsonMap)!=null&&Qe[s]?{res:(_e=this.options.extrudeLineGeojsonMap)==null?void 0:_e[s]}:yield jsonFetch(`${this.options.assetsPrefix}/geojson/json-lite/${s}.json`):{res:void 0};if(!this.options.showDistrict&&this.getAdcodeShowLevel(s)==="city"&&(rt=Zt,Zt=void 0),[rt,Zt].filter(Boolean).forEach(Tt=>{if(!Tt.features[0].properties.adcode&&s!==0){const Jt=geojsonCn.adcodeMap[s];Tt.features[0].properties=zi(ci(ci({},Tt.features[0].properties),Jt),{center:[Jt.lng,Jt.lat]})}}),rt){const Tt=this.options.plateInCenter&&(this.mapHistory.length<1||this.options.drillDownPlateInCenter);if(Tt&&this.fixNear(s),($e=this.options.fixGeojson)!=null&&$e[s]){const c0=(qe=this.options.fixGeojson)==null?void 0:qe[s];if(c0.startsWith("-")){const l0=+c0.slice(1);rt.features=rt.features.filter(m0=>m0.properties.adcode!==l0)}}const Jt=this.options.bboxMap[s]||Object.values(this.options.bboxMap).pop();this.eraseLabels(),this.map&&(this.options.drillDownHideParent&&this.parentBg.forEach(c0=>{c0.hide()}),this.options.showOneLevel?this.map.hide():this.map.deactive(),(f!=null?f:this.options.handleBackKeepCamvasState)&&this.saveBackCamvasState(-1));const $t=this.mapHistory.length,e0=$t-1,t0=this.getDepth(s,Zt||rt),i0=(st=this.mapHistory[e0])==null?void 0:st.depth,n0=$t===0?0:this.mapHistory[e0].z+(this.options.showOneLevel?0:i0),s0=$t===0?0:n0-t0,d0=turf.center(rt).geometry.coordinates,[u0,G0]=this.projection(d0),h0=yield this.drawPlaneMap({geojson:rt,extrudeLineGeojson:Zt,depth:t0,bbox:Jt,adcode:s});h0.position.setZ(s0),this.mapHistory.push({map:h0,mapInfo:Wt,z:n0,depth:t0,cX:u0,cY:-G0});const o0=h0.position.z;Tt&&(h0.position.z=n0,this.fitTo(h0,{enableTransition:r!==0}),h0.position.z=o0),dt==null||dt.hide(),this.map&&$t!==0&&(r?yield sinusoidalInOut({onUpdate:c0=>{this.map.position.z=o0+(n0-o0)*c0}}).start({duration:r}):this.map.position.z=n0),this.drawLabels()}else console.log(`${Yt}的地图数据不存在`);this.event.emit("handleDrillDown",{adcode:s,z:this.mapObj.z+this.mapObj.depth})}this.isAnimating=!1})}saveBackCamvasState(s){const r=this.mapHistory.at(s);r&&(r.cameraPositon=this.pencil.cameraPositon.clone(),r.cameraTarget=this.pencil.cameraTarget.clone())}fixNear(s){const r=this.getAdcodeShowLevel(s);s===0?(this.pencil.camera.near=1,this.pencil.camera.far=1e3,this.pencil.camera.updateProjectionMatrix()):(r==="country"||r==="province")&&this.pencil.camera.near!==this.pencilConfig.camera.near*10?(this.pencil.camera.near=this.pencilConfig.camera.near*10,this.pencil.camera.updateProjectionMatrix()):(r==="city"||r==="district")&&this.pencil.camera.near!==this.pencilConfig.camera.near&&(this.pencil.camera.near=this.pencilConfig.camera.near,this.pencil.camera.updateProjectionMatrix())}absoluteAngle(s,r){const f=Math.PI*2,de=s-r;return MathUtils.euclideanModulo(de+Math.PI,f)-Math.PI}fitTo(Xe){return q0(this,arguments,function*(s,{polarAngle:r,azimuthAngle:f,enableTransition:de=!0}={}){var Wt,Yt,rt;if(!(s!=null&&s.object3d))return;const Je=(Yt=this.options.lookAtMap)==null?void 0:Yt[(Wt=this.mapInfo)==null?void 0:Wt.adcode];if(Je){const[Zt,vt,Tt,Jt,$t,e0]=Je;yield(rt=this.pencil.controls)==null?void 0:rt.setLookAt(Zt,vt,Tt,Jt,$t,e0,de);return}const Ke=this.options.mapPadding,{height:Qe,width:_e}=this.pencil.getSize();Qe<Ke[0]+Ke[2]+100&&(Ke[0]=0,Ke[2]=0),_e<Ke[1]+Ke[3]+100&&(Ke[1]=0,Ke[3]=0);const $e=r||this.options.polarAngle,qe=f||this.options.azimuthAngle,st=this.pencil.controls.azimuthAngle,dt=this.pencil.controls.polarAngle;yield Promise.all([this.paddingInCssPixel(s,Ke[0],Ke[1],Ke[2],Ke[3],de),this.pencil.controls.rotateTo(st+this.absoluteAngle(qe,st),dt+this.absoluteAngle($e,dt),de)])})}paddingInCssPixel(s,r,f,de,Xe,Je){const{camera:Ke,controls:Qe}=this.pencil,_e=Ke.fov*MathUtils.DEG2RAD,$e=this.pencil.getSize().height,{size:qe}=s.getSize(),st=qe.x,dt=qe.y,Wt=qe.z;let Yt=Qe.getDistanceToFitBox(st,dt,Wt),rt=0,Zt=0,vt=0,Tt=0;for(let Jt=0;Jt<10;Jt++){const $t=Yt-Wt*.5,e0=2*Math.tan(_e*.5)*Math.abs($t)/$e;rt=r*e0,Zt=de*e0,vt=Xe*e0,Tt=f*e0,Yt=Qe.getDistanceToFitBox(st+vt+Tt,dt+rt+Zt,Wt)}return Qe.fitToBox(s.object3d,Je,{paddingLeft:vt,paddingRight:Tt,paddingBottom:Zt,paddingTop:rt})}drawPlaneMap(Je){return q0(this,arguments,function*({geojson:s,extrudeLineGeojson:r,bbox:f,depth:de,adcode:Xe}){const Ke=this.mList.getMaterialObj("plane"),Qe=ci({},Ke),_e=yield this.drawController.draw("PlaneMap",{geojson:s,extrudeLineGeojson:r,depth:de,projection:{center:this.pcenter,scale:this.pscale,rotate:this.options.worldPacificCentre?[-160,0]:void 0,projectionType:this.options.projectionType},materialOptions:Qe,bbox:f,topSegments:this.options.topSegments,lineOffset:this.options.lineOffset,mergeSide:this.options.mergeSide},this.group);return _e.extrudelineArr&&_e.extrudelineArr.forEach($e=>{$e.object3d.name="板块边线",this.mList.setObject3d($e.object3d,"extrudeLine",{baseObject:$e}),this.initBaseObjectUserData($e)}),this.mList.setObject3d(_e.object3d,Xe===1e5?"chinaGroup":"planeMapGroup",{baseObject:_e}),_e})}handleBack(){return q0(this,arguments,function*({duration:s=1e3,handleLookBack:r=!0}={}){if(this.mapHistory.length>1&&!this.isAnimating){this.isAnimating=!0;const f=this.mapHistory.pop();if(f!=null&&f.map){if(!this.options.drillDownPlateInCenter){const Je=f.map.position.z,Ke=this.mapObj.z+(this.mapObj.depth-f.depth);yield sinusoidalInOut({onUpdate:Qe=>{f.map.position.z=Je+(Ke-Je)*Qe}}).start({duration:s})}this.drawController.eraseWithoutMaterial(f.map)}const{map:de}=this.mapObj,Xe=de==null?void 0:de.findGroup(f==null?void 0:f.mapInfo.adcode);Xe&&Xe.show(),de&&r&&(this.eraseLabels(),this.options.showOneLevel?de.show():de.active(),this.options.drillDownHideParent&&this.parentBg.forEach(Je=>{Je.show()}),yield this.handleLookBack(s),this.drawLabels()),this.emit("handleBack",{adcodes:this.adcodes}),this.isAnimating=!1}})}handleLookBack(s){return q0(this,null,function*(){var Xe;const{map:r,cameraPositon:f,cameraTarget:de}=this.mapObj;f&&de?yield(Xe=this.pencil.controls)==null?void 0:Xe.setLookAt(f.x,f.y,f.z,de.x,de.y,de.z,s!==0):yield this.fitTo(r,{enableTransition:s!==0})})}compareLocations(s,r){const f=s.filter(Ke=>Ke),de=r.filter(Ke=>Ke),Xe=[];let Je=0;for(let Ke=0;Ke<Math.min(f.length,de.length)&&f[Ke]===de[Ke];Ke++)Je++;for(let Ke=Je;Ke<f.length;Ke++)Xe.push(-1);for(let Ke=Je;Ke<de.length;Ke++)Xe.push(de[Ke]);return Xe}setAdcode(f){return q0(this,arguments,function*({adcodes:s,duration:r}){const{adcodes:de}=this;if(!(JSON.stringify(s)===JSON.stringify(de)||this.isAnimating))if(JSON.stringify(s)===JSON.stringify([0]))try{yield this.handleDrillDown({adcode:0,duration:r})}catch(_e){console.error(_e)}else{const{country:_e,province:$e,city:qe,district:st}=s.reduce((vt,Tt)=>{const Jt=this.getAdcodeShowLevel(Tt);return vt[Jt]=Tt,vt},{}),{country:dt,province:Wt,city:Yt,district:rt}=de.reduce((vt,Tt)=>{const Jt=this.getAdcodeShowLevel(Tt);return vt[Jt]=Tt,vt},{}),Zt=this.compareLocations([dt,Wt,Yt,rt],[_e,$e,qe,st]);try{for(var Xe=Yn(Zt.entries()),Je,Ke,Qe;Je=!(Ke=yield Xe.next()).done;Je=!1){const[vt,Tt]=Ke.value;const Jt=vt===Zt.length-1?r:0;Tt===-1?yield this.handleBack({duration:Jt,handleLookBack:!!Jt}):yield this.handleDrillDown({adcode:Tt,duration:Jt,saveBackCamvasState:Zt.includes(-1)?!1:this.options.handleBackKeepCamvasState})}}catch(Ke){Qe=[Ke]}finally{try{Je&&(Ke=Xe.return)&&(yield Ke.call(Xe))}finally{if(Qe)throw Qe[0]}}}})}setPadding(s,r=!1){this.options.mapPadding=s,r&&this.fitTo(this.map)}dispose(){var s,r;(s=this.map)==null||s.dispose(),this.parentBg.forEach(f=>{f.dispose()}),this.parentBg.length=0,(r=this.continentsBg)==null||r.dispose(),this.continentsBg=void 0,this.mapHistory.length=0,super.dispose()}};F0(hn,"VisName","map");let Map$2=hn;const PENCIL_CONFIG$3={camera:{near:.01,far:100,fov:45,up:new Vector3(0,0,1)}};class Reflector extends Mesh{constructor(e,s={}){super(e),this.isReflector=!0,this.type="Reflector",this.camera=new PerspectiveCamera;const r=this,f=s.color!==void 0?new Color$1(s.color):new Color$1(8355711),de=s.textureWidth||512,Xe=s.textureHeight||512,Je=s.clipBias||0,Ke=s.shader||Reflector.ReflectorShader,Qe=s.multisample!==void 0?s.multisample:4,_e=new Plane$1,$e=new Vector3,qe=new Vector3,st=new Vector3,dt=new Matrix4,Wt=new Vector3(0,0,-1),Yt=new Vector4,rt=new Vector3,Zt=new Vector3,vt=new Vector4,Tt=new Matrix4,Jt=this.camera,$t=new WebGLRenderTarget(de,Xe,{samples:Qe,type:HalfFloatType}),e0=new ShaderMaterial({name:Ke.name!==void 0?Ke.name:"unspecified",uniforms:UniformsUtils.clone(Ke.uniforms),fragmentShader:Ke.fragmentShader,vertexShader:Ke.vertexShader});e0.uniforms.tDiffuse.value=$t.texture,e0.uniforms.color.value=f,e0.uniforms.textureMatrix.value=Tt,this.material=e0,this.onBeforeRender=function(t0,i0,n0){if(qe.setFromMatrixPosition(r.matrixWorld),st.setFromMatrixPosition(n0.matrixWorld),dt.extractRotation(r.matrixWorld),$e.set(0,0,1),$e.applyMatrix4(dt),rt.subVectors(qe,st),rt.dot($e)>0)return;rt.reflect($e).negate(),rt.add(qe),dt.extractRotation(n0.matrixWorld),Wt.set(0,0,-1),Wt.applyMatrix4(dt),Wt.add(st),Zt.subVectors(qe,Wt),Zt.reflect($e).negate(),Zt.add(qe),Jt.position.copy(rt),Jt.up.set(0,1,0),Jt.up.applyMatrix4(dt),Jt.up.reflect($e),Jt.lookAt(Zt),Jt.far=n0.far,Jt.updateMatrixWorld(),Jt.projectionMatrix.copy(n0.projectionMatrix),Tt.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),Tt.multiply(Jt.projectionMatrix),Tt.multiply(Jt.matrixWorldInverse),Tt.multiply(r.matrixWorld),_e.setFromNormalAndCoplanarPoint($e,qe),_e.applyMatrix4(Jt.matrixWorldInverse),Yt.set(_e.normal.x,_e.normal.y,_e.normal.z,_e.constant);const s0=Jt.projectionMatrix;vt.x=(Math.sign(Yt.x)+s0.elements[8])/s0.elements[0],vt.y=(Math.sign(Yt.y)+s0.elements[9])/s0.elements[5],vt.z=-1,vt.w=(1+s0.elements[10])/s0.elements[14],Yt.multiplyScalar(2/Yt.dot(vt)),s0.elements[2]=Yt.x,s0.elements[6]=Yt.y,s0.elements[10]=Yt.z+1-Je,s0.elements[14]=Yt.w,r.visible=!1;const d0=t0.getRenderTarget(),u0=t0.xr.enabled,G0=t0.shadowMap.autoUpdate;t0.xr.enabled=!1,t0.shadowMap.autoUpdate=!1,t0.setRenderTarget($t),t0.state.buffers.depth.setMask(!0),t0.autoClear===!1&&t0.clear(),t0.render(i0,Jt),t0.xr.enabled=u0,t0.shadowMap.autoUpdate=G0,t0.setRenderTarget(d0);const h0=n0.viewport;h0!==void 0&&t0.state.viewport(h0),r.visible=!0},this.getRenderTarget=function(){return $t},this.dispose=function(){$t.dispose(),r.material.dispose()}}}Reflector.ReflectorShader={name:"ReflectorShader",uniforms:{color:{value:null},tDiffuse:{value:null},textureMatrix:{value:null}},vertexShader:`
|
|
5332
5332
|
uniform mat4 textureMatrix;
|
|
5333
5333
|
varying vec4 vUv;
|
|
5334
5334
|
|