/*!
 * Simple jQuery Equal Heights
 *
 * Copyright (c) 2013 Matt Banks
 * Dual licensed under the MIT and GPL licenses.
 * Uses the same license as jQuery, see:
 * http://docs.jquery.com/License
 *
 * @version 1.5.1
 */
!function(a){a.fn.equalHeights=function(){var b=0,c=a(this);return c.each(function(){var c=a(this).innerHeight();c>b&&(b=c)}),c.css("height",b)},a("[data-equal]").each(function(){var b=a(this),c=b.data("equal");b.find(c).equalHeights()})}(jQuery);
/*!
 * imagesLoaded PACKAGED v4.1.4
 * JavaScript is all like "You images are done yet or what?"
 * MIT License
 */

!function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o<i.length;o++){var r=i[o],s=n&&n[r];s&&(this.off(e,r),delete n[r]),r.apply(this,t)}return this}},t.allOff=function(){delete this._events,delete this._onceEvents},e}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],function(i){return t(e,i)}):"object"==typeof module&&module.exports?module.exports=t(e,require("ev-emitter")):e.imagesLoaded=t(e,e.EvEmitter)}("undefined"!=typeof window?window:this,function(e,t){function i(e,t){for(var i in t)e[i]=t[i];return e}function n(e){if(Array.isArray(e))return e;var t="object"==typeof e&&"number"==typeof e.length;return t?d.call(e):[e]}function o(e,t,r){if(!(this instanceof o))return new o(e,t,r);var s=e;return"string"==typeof e&&(s=document.querySelectorAll(e)),s?(this.elements=n(s),this.options=i({},this.options),"function"==typeof t?r=t:i(this.options,t),r&&this.on("always",r),this.getImages(),h&&(this.jqDeferred=new h.Deferred),void setTimeout(this.check.bind(this))):void a.error("Bad element for imagesLoaded "+(s||e))}function r(e){this.img=e}function s(e,t){this.url=e,this.element=t,this.img=new Image}var h=e.jQuery,a=e.console,d=Array.prototype.slice;o.prototype=Object.create(t.prototype),o.prototype.options={},o.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},o.prototype.addElementImages=function(e){"IMG"==e.nodeName&&this.addImage(e),this.options.background===!0&&this.addElementBackgroundImages(e);var t=e.nodeType;if(t&&u[t]){for(var i=e.querySelectorAll("img"),n=0;n<i.length;n++){var o=i[n];this.addImage(o)}if("string"==typeof this.options.background){var r=e.querySelectorAll(this.options.background);for(n=0;n<r.length;n++){var s=r[n];this.addElementBackgroundImages(s)}}}};var u={1:!0,9:!0,11:!0};return o.prototype.addElementBackgroundImages=function(e){var t=getComputedStyle(e);if(t)for(var i=/url\((['"])?(.*?)\1\)/gi,n=i.exec(t.backgroundImage);null!==n;){var o=n&&n[2];o&&this.addBackground(o,e),n=i.exec(t.backgroundImage)}},o.prototype.addImage=function(e){var t=new r(e);this.images.push(t)},o.prototype.addBackground=function(e,t){var i=new s(e,t);this.images.push(i)},o.prototype.check=function(){function e(e,i,n){setTimeout(function(){t.progress(e,i,n)})}var t=this;return this.progressedCount=0,this.hasAnyBroken=!1,this.images.length?void this.images.forEach(function(t){t.once("progress",e),t.check()}):void this.complete()},o.prototype.progress=function(e,t,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded,this.emitEvent("progress",[this,e,t]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,e),this.progressedCount==this.images.length&&this.complete(),this.options.debug&&a&&a.log("progress: "+i,e,t)},o.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(e,[this]),this.emitEvent("always",[this]),this.jqDeferred){var t=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[t](this)}},r.prototype=Object.create(t.prototype),r.prototype.check=function(){var e=this.getIsImageComplete();return e?void this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),void(this.proxyImage.src=this.img.src))},r.prototype.getIsImageComplete=function(){return this.img.complete&&this.img.naturalWidth},r.prototype.confirm=function(e,t){this.isLoaded=e,this.emitEvent("progress",[this,this.img,t])},r.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},r.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},r.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},r.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},s.prototype=Object.create(r.prototype),s.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url;var e=this.getIsImageComplete();e&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},s.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},s.prototype.confirm=function(e,t){this.isLoaded=e,this.emitEvent("progress",[this,this.element,t])},o.makeJQueryPlugin=function(t){t=t||e.jQuery,t&&(h=t,h.fn.imagesLoaded=function(e,t){var i=new o(this,e,t);return i.jqDeferred.promise(h(this))})},o.makeJQueryPlugin(),o});
// Generated by CoffeeScript 1.9.3
(function(){var e;e=function(){function e(e,t){var n,r;this.options={target:"instafeed",get:"popular",resolution:"thumbnail",sortBy:"none",links:!0,mock:!1,useHttp:!1};if(typeof e=="object")for(n in e)r=e[n],this.options[n]=r;this.context=t!=null?t:this,this.unique=this._genKey()}return e.prototype.hasNext=function(){return typeof this.context.nextUrl=="string"&&this.context.nextUrl.length>0},e.prototype.next=function(){return this.hasNext()?this.run(this.context.nextUrl):!1},e.prototype.run=function(t){var n,r,i;if(typeof this.options.clientId!="string"&&typeof this.options.accessToken!="string")throw new Error("Missing clientId or accessToken.");if(typeof this.options.accessToken!="string"&&typeof this.options.clientId!="string")throw new Error("Missing clientId or accessToken.");return this.options.before!=null&&typeof this.options.before=="function"&&this.options.before.call(this),typeof document!="undefined"&&document!==null&&(i=document.createElement("script"),i.id="instafeed-fetcher",i.src=t||this._buildUrl(),n=document.getElementsByTagName("head"),n[0].appendChild(i),r="instafeedCache"+this.unique,window[r]=new e(this.options,this),window[r].unique=this.unique),!0},e.prototype.parse=function(e){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w,E,S,x,T,N,C,k,L,A,O,M,_,D;if(typeof e!="object"){if(this.options.error!=null&&typeof this.options.error=="function")return this.options.error.call(this,"Invalid JSON data"),!1;throw new Error("Invalid JSON response")}if(e.meta.code!==200){if(this.options.error!=null&&typeof this.options.error=="function")return this.options.error.call(this,e.meta.error_message),!1;throw new Error("Error from Instagram: "+e.meta.error_message)}if(e.data.length===0){if(this.options.error!=null&&typeof this.options.error=="function")return this.options.error.call(this,"No images were returned from Instagram"),!1;throw new Error("No images were returned from Instagram")}this.options.success!=null&&typeof this.options.success=="function"&&this.options.success.call(this,e),this.context.nextUrl="",e.pagination!=null&&(this.context.nextUrl=e.pagination.next_url);if(this.options.sortBy!=="none"){this.options.sortBy==="random"?M=["","random"]:M=this.options.sortBy.split("-"),O=M[0]==="least"?!0:!1;switch(M[1]){case"random":e.data.sort(function(){return.5-Math.random()});break;case"recent":e.data=this._sortBy(e.data,"created_time",O);break;case"liked":e.data=this._sortBy(e.data,"likes.count",O);break;case"commented":e.data=this._sortBy(e.data,"comments.count",O);break;default:throw new Error("Invalid option for sortBy: '"+this.options.sortBy+"'.")}}if(typeof document!="undefined"&&document!==null&&this.options.mock===!1){m=e.data,A=parseInt(this.options.limit,10),this.options.limit!=null&&m.length>A&&(m=m.slice(0,A)),u=document.createDocumentFragment(),this.options.filter!=null&&typeof this.options.filter=="function"&&(m=this._filter(m,this.options.filter));if(this.options.template!=null&&typeof this.options.template=="string"){f="",d="",w="",D=document.createElement("div");for(c=0,N=m.length;c<N;c++){h=m[c],p=h.images[this.options.resolution];if(typeof p!="object")throw o="No image found for resolution: "+this.options.resolution+".",new Error(o);E=p.width,y=p.height,b="square",E>y&&(b="landscape"),E<y&&(b="portrait"),v=p.url,l=window.location.protocol.indexOf("http")>=0,l&&!this.options.useHttp&&(v=v.replace(/https?:\/\//,"//")),d=this._makeTemplate(this.options.template,{model:h,id:h.id,link:h.link,type:h.type,image:v,width:E,height:y,orientation:b,caption:this._getObjectProperty(h,"caption.text"),likes:h.likes.count,comments:h.comments.count,location:this._getObjectProperty(h,"location.name")}),f+=d}D.innerHTML=f,i=[],r=0,n=D.childNodes.length;while(r<n)i.push(D.childNodes[r]),r+=1;for(x=0,C=i.length;x<C;x++)L=i[x],u.appendChild(L)}else for(T=0,k=m.length;T<k;T++){h=m[T],g=document.createElement("img"),p=h.images[this.options.resolution];if(typeof p!="object")throw o="No image found for resolution: "+this.options.resolution+".",new Error(o);v=p.url,l=window.location.protocol.indexOf("http")>=0,l&&!this.options.useHttp&&(v=v.replace(/https?:\/\//,"//")),g.src=v,this.options.links===!0?(t=document.createElement("a"),t.href=h.link,t.appendChild(g),u.appendChild(t)):u.appendChild(g)}_=this.options.target,typeof _=="string"&&(_=document.getElementById(_));if(_==null)throw o='No element with id="'+this.options.target+'" on page.',new Error(o);_.appendChild(u),a=document.getElementsByTagName("head")[0],a.removeChild(document.getElementById("instafeed-fetcher")),S="instafeedCache"+this.unique,window[S]=void 0;try{delete window[S]}catch(P){s=P}}return this.options.after!=null&&typeof this.options.after=="function"&&this.options.after.call(this),!0},e.prototype._buildUrl=function(){var e,t,n;e="https://api.instagram.com/v1";switch(this.options.get){case"popular":t="media/popular";break;case"tagged":if(!this.options.tagName)throw new Error("No tag name specified. Use the 'tagName' option.");t="tags/"+this.options.tagName+"/media/recent";break;case"location":if(!this.options.locationId)throw new Error("No location specified. Use the 'locationId' option.");t="locations/"+this.options.locationId+"/media/recent";break;case"user":if(!this.options.userId)throw new Error("No user specified. Use the 'userId' option.");t="users/"+this.options.userId+"/media/recent";break;default:throw new Error("Invalid option for get: '"+this.options.get+"'.")}return n=e+"/"+t,this.options.accessToken!=null?n+="?access_token="+this.options.accessToken:n+="?client_id="+this.options.clientId,this.options.limit!=null&&(n+="&count="+this.options.limit),n+="&callback=instafeedCache"+this.unique+".parse",n},e.prototype._genKey=function(){var e;return e=function(){return((1+Math.random())*65536|0).toString(16).substring(1)},""+e()+e()+e()+e()},e.prototype._makeTemplate=function(e,t){var n,r,i,s,o;r=/(?:\{{2})([\w\[\]\.]+)(?:\}{2})/,n=e;while(r.test(n))s=n.match(r)[1],o=(i=this._getObjectProperty(t,s))!=null?i:"",n=n.replace(r,function(){return""+o});return n},e.prototype._getObjectProperty=function(e,t){var n,r;t=t.replace(/\[(\w+)\]/g,".$1"),r=t.split(".");while(r.length){n=r.shift();if(!(e!=null&&n in e))return null;e=e[n]}return e},e.prototype._sortBy=function(e,t,n){var r;return r=function(e,r){var i,s;return i=this._getObjectProperty(e,t),s=this._getObjectProperty(r,t),n?i>s?1:-1:i<s?1:-1},e.sort(r.bind(this)),e},e.prototype._filter=function(e,t){var n,r,i,s,o;n=[],r=function(e){if(t(e))return n.push(e)};for(i=0,o=e.length;i<o;i++)s=e[i],r(s);return n},e}(),function(e,t){return typeof define=="function"&&define.amd?define([],t):typeof module=="object"&&module.exports?module.exports=t():e.Instafeed=t()}(this,function(){return e})}).call(this);
/*!
 * Isotope PACKAGED v3.0.4
 *
 * Licensed GPLv3 for open source use
 * or Isotope Commercial License for commercial use
 *
 * http://isotope.metafizzy.co
 * Copyright 2017 Metafizzy
 */

!function(t,e){"function"==typeof define&&define.amd?define("jquery-bridget/jquery-bridget",["jquery"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("jquery")):t.jQueryBridget=e(t,t.jQuery)}(window,function(t,e){"use strict";function i(i,s,a){function u(t,e,o){var n,s="$()."+i+'("'+e+'")';return t.each(function(t,u){var h=a.data(u,i);if(!h)return void r(i+" not initialized. Cannot call methods, i.e. "+s);var d=h[e];if(!d||"_"==e.charAt(0))return void r(s+" is not a valid method");var l=d.apply(h,o);n=void 0===n?l:n}),void 0!==n?n:t}function h(t,e){t.each(function(t,o){var n=a.data(o,i);n?(n.option(e),n._init()):(n=new s(o,e),a.data(o,i,n))})}a=a||e||t.jQuery,a&&(s.prototype.option||(s.prototype.option=function(t){a.isPlainObject(t)&&(this.options=a.extend(!0,this.options,t))}),a.fn[i]=function(t){if("string"==typeof t){var e=n.call(arguments,1);return u(this,t,e)}return h(this,t),this},o(a))}function o(t){!t||t&&t.bridget||(t.bridget=i)}var n=Array.prototype.slice,s=t.console,r="undefined"==typeof s?function(){}:function(t){s.error(t)};return o(e||t.jQuery),i}),function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},o=i[t]=i[t]||[];return o.indexOf(e)==-1&&o.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{},o=i[t]=i[t]||{};return o[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var o=i.indexOf(e);return o!=-1&&i.splice(o,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var o=0,n=i[o];e=e||[];for(var s=this._onceEvents&&this._onceEvents[t];n;){var r=s&&s[n];r&&(this.off(t,n),delete s[n]),n.apply(this,e),o+=r?0:1,n=i[o]}return this}},t}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("get-size/get-size",[],function(){return e()}):"object"==typeof module&&module.exports?module.exports=e():t.getSize=e()}(window,function(){"use strict";function t(t){var e=parseFloat(t),i=t.indexOf("%")==-1&&!isNaN(e);return i&&e}function e(){}function i(){for(var t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},e=0;e<h;e++){var i=u[e];t[i]=0}return t}function o(t){var e=getComputedStyle(t);return e||a("Style returned "+e+". Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizebug1"),e}function n(){if(!d){d=!0;var e=document.createElement("div");e.style.width="200px",e.style.padding="1px 2px 3px 4px",e.style.borderStyle="solid",e.style.borderWidth="1px 2px 3px 4px",e.style.boxSizing="border-box";var i=document.body||document.documentElement;i.appendChild(e);var n=o(e);s.isBoxSizeOuter=r=200==t(n.width),i.removeChild(e)}}function s(e){if(n(),"string"==typeof e&&(e=document.querySelector(e)),e&&"object"==typeof e&&e.nodeType){var s=o(e);if("none"==s.display)return i();var a={};a.width=e.offsetWidth,a.height=e.offsetHeight;for(var d=a.isBorderBox="border-box"==s.boxSizing,l=0;l<h;l++){var f=u[l],c=s[f],m=parseFloat(c);a[f]=isNaN(m)?0:m}var p=a.paddingLeft+a.paddingRight,y=a.paddingTop+a.paddingBottom,g=a.marginLeft+a.marginRight,v=a.marginTop+a.marginBottom,_=a.borderLeftWidth+a.borderRightWidth,I=a.borderTopWidth+a.borderBottomWidth,z=d&&r,x=t(s.width);x!==!1&&(a.width=x+(z?0:p+_));var S=t(s.height);return S!==!1&&(a.height=S+(z?0:y+I)),a.innerWidth=a.width-(p+_),a.innerHeight=a.height-(y+I),a.outerWidth=a.width+g,a.outerHeight=a.height+v,a}}var r,a="undefined"==typeof console?e:function(t){console.error(t)},u=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],h=u.length,d=!1;return s}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("desandro-matches-selector/matches-selector",e):"object"==typeof module&&module.exports?module.exports=e():t.matchesSelector=e()}(window,function(){"use strict";var t=function(){var t=window.Element.prototype;if(t.matches)return"matches";if(t.matchesSelector)return"matchesSelector";for(var e=["webkit","moz","ms","o"],i=0;i<e.length;i++){var o=e[i],n=o+"MatchesSelector";if(t[n])return n}}();return function(e,i){return e[t](i)}}),function(t,e){"function"==typeof define&&define.amd?define("fizzy-ui-utils/utils",["desandro-matches-selector/matches-selector"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("desandro-matches-selector")):t.fizzyUIUtils=e(t,t.matchesSelector)}(window,function(t,e){var i={};i.extend=function(t,e){for(var i in e)t[i]=e[i];return t},i.modulo=function(t,e){return(t%e+e)%e},i.makeArray=function(t){var e=[];if(Array.isArray(t))e=t;else if(t&&"object"==typeof t&&"number"==typeof t.length)for(var i=0;i<t.length;i++)e.push(t[i]);else e.push(t);return e},i.removeFrom=function(t,e){var i=t.indexOf(e);i!=-1&&t.splice(i,1)},i.getParent=function(t,i){for(;t.parentNode&&t!=document.body;)if(t=t.parentNode,e(t,i))return t},i.getQueryElement=function(t){return"string"==typeof t?document.querySelector(t):t},i.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},i.filterFindElements=function(t,o){t=i.makeArray(t);var n=[];return t.forEach(function(t){if(t instanceof HTMLElement){if(!o)return void n.push(t);e(t,o)&&n.push(t);for(var i=t.querySelectorAll(o),s=0;s<i.length;s++)n.push(i[s])}}),n},i.debounceMethod=function(t,e,i){var o=t.prototype[e],n=e+"Timeout";t.prototype[e]=function(){var t=this[n];t&&clearTimeout(t);var e=arguments,s=this;this[n]=setTimeout(function(){o.apply(s,e),delete s[n]},i||100)}},i.docReady=function(t){var e=document.readyState;"complete"==e||"interactive"==e?setTimeout(t):document.addEventListener("DOMContentLoaded",t)},i.toDashed=function(t){return t.replace(/(.)([A-Z])/g,function(t,e,i){return e+"-"+i}).toLowerCase()};var o=t.console;return i.htmlInit=function(e,n){i.docReady(function(){var s=i.toDashed(n),r="data-"+s,a=document.querySelectorAll("["+r+"]"),u=document.querySelectorAll(".js-"+s),h=i.makeArray(a).concat(i.makeArray(u)),d=r+"-options",l=t.jQuery;h.forEach(function(t){var i,s=t.getAttribute(r)||t.getAttribute(d);try{i=s&&JSON.parse(s)}catch(a){return void(o&&o.error("Error parsing "+r+" on "+t.className+": "+a))}var u=new e(t,i);l&&l.data(t,n,u)})})},i}),function(t,e){"function"==typeof define&&define.amd?define("outlayer/item",["ev-emitter/ev-emitter","get-size/get-size"],e):"object"==typeof module&&module.exports?module.exports=e(require("ev-emitter"),require("get-size")):(t.Outlayer={},t.Outlayer.Item=e(t.EvEmitter,t.getSize))}(window,function(t,e){"use strict";function i(t){for(var e in t)return!1;return e=null,!0}function o(t,e){t&&(this.element=t,this.layout=e,this.position={x:0,y:0},this._create())}function n(t){return t.replace(/([A-Z])/g,function(t){return"-"+t.toLowerCase()})}var s=document.documentElement.style,r="string"==typeof s.transition?"transition":"WebkitTransition",a="string"==typeof s.transform?"transform":"WebkitTransform",u={WebkitTransition:"webkitTransitionEnd",transition:"transitionend"}[r],h={transform:a,transition:r,transitionDuration:r+"Duration",transitionProperty:r+"Property",transitionDelay:r+"Delay"},d=o.prototype=Object.create(t.prototype);d.constructor=o,d._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},d.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},d.getSize=function(){this.size=e(this.element)},d.css=function(t){var e=this.element.style;for(var i in t){var o=h[i]||i;e[o]=t[i]}},d.getPosition=function(){var t=getComputedStyle(this.element),e=this.layout._getOption("originLeft"),i=this.layout._getOption("originTop"),o=t[e?"left":"right"],n=t[i?"top":"bottom"],s=this.layout.size,r=o.indexOf("%")!=-1?parseFloat(o)/100*s.width:parseInt(o,10),a=n.indexOf("%")!=-1?parseFloat(n)/100*s.height:parseInt(n,10);r=isNaN(r)?0:r,a=isNaN(a)?0:a,r-=e?s.paddingLeft:s.paddingRight,a-=i?s.paddingTop:s.paddingBottom,this.position.x=r,this.position.y=a},d.layoutPosition=function(){var t=this.layout.size,e={},i=this.layout._getOption("originLeft"),o=this.layout._getOption("originTop"),n=i?"paddingLeft":"paddingRight",s=i?"left":"right",r=i?"right":"left",a=this.position.x+t[n];e[s]=this.getXValue(a),e[r]="";var u=o?"paddingTop":"paddingBottom",h=o?"top":"bottom",d=o?"bottom":"top",l=this.position.y+t[u];e[h]=this.getYValue(l),e[d]="",this.css(e),this.emitEvent("layout",[this])},d.getXValue=function(t){var e=this.layout._getOption("horizontal");return this.layout.options.percentPosition&&!e?t/this.layout.size.width*100+"%":t+"px"},d.getYValue=function(t){var e=this.layout._getOption("horizontal");return this.layout.options.percentPosition&&e?t/this.layout.size.height*100+"%":t+"px"},d._transitionTo=function(t,e){this.getPosition();var i=this.position.x,o=this.position.y,n=parseInt(t,10),s=parseInt(e,10),r=n===this.position.x&&s===this.position.y;if(this.setPosition(t,e),r&&!this.isTransitioning)return void this.layoutPosition();var a=t-i,u=e-o,h={};h.transform=this.getTranslate(a,u),this.transition({to:h,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},d.getTranslate=function(t,e){var i=this.layout._getOption("originLeft"),o=this.layout._getOption("originTop");return t=i?t:-t,e=o?e:-e,"translate3d("+t+"px, "+e+"px, 0)"},d.goTo=function(t,e){this.setPosition(t,e),this.layoutPosition()},d.moveTo=d._transitionTo,d.setPosition=function(t,e){this.position.x=parseInt(t,10),this.position.y=parseInt(e,10)},d._nonTransition=function(t){this.css(t.to),t.isCleaning&&this._removeStyles(t.to);for(var e in t.onTransitionEnd)t.onTransitionEnd[e].call(this)},d.transition=function(t){if(!parseFloat(this.layout.options.transitionDuration))return void this._nonTransition(t);var e=this._transn;for(var i in t.onTransitionEnd)e.onEnd[i]=t.onTransitionEnd[i];for(i in t.to)e.ingProperties[i]=!0,t.isCleaning&&(e.clean[i]=!0);if(t.from){this.css(t.from);var o=this.element.offsetHeight;o=null}this.enableTransition(t.to),this.css(t.to),this.isTransitioning=!0};var l="opacity,"+n(a);d.enableTransition=function(){if(!this.isTransitioning){var t=this.layout.options.transitionDuration;t="number"==typeof t?t+"ms":t,this.css({transitionProperty:l,transitionDuration:t,transitionDelay:this.staggerDelay||0}),this.element.addEventListener(u,this,!1)}},d.onwebkitTransitionEnd=function(t){this.ontransitionend(t)},d.onotransitionend=function(t){this.ontransitionend(t)};var f={"-webkit-transform":"transform"};d.ontransitionend=function(t){if(t.target===this.element){var e=this._transn,o=f[t.propertyName]||t.propertyName;if(delete e.ingProperties[o],i(e.ingProperties)&&this.disableTransition(),o in e.clean&&(this.element.style[t.propertyName]="",delete e.clean[o]),o in e.onEnd){var n=e.onEnd[o];n.call(this),delete e.onEnd[o]}this.emitEvent("transitionEnd",[this])}},d.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(u,this,!1),this.isTransitioning=!1},d._removeStyles=function(t){var e={};for(var i in t)e[i]="";this.css(e)};var c={transitionProperty:"",transitionDuration:"",transitionDelay:""};return d.removeTransitionStyles=function(){this.css(c)},d.stagger=function(t){t=isNaN(t)?0:t,this.staggerDelay=t+"ms"},d.removeElem=function(){this.element.parentNode.removeChild(this.element),this.css({display:""}),this.emitEvent("remove",[this])},d.remove=function(){return r&&parseFloat(this.layout.options.transitionDuration)?(this.once("transitionEnd",function(){this.removeElem()}),void this.hide()):void this.removeElem()},d.reveal=function(){delete this.isHidden,this.css({display:""});var t=this.layout.options,e={},i=this.getHideRevealTransitionEndProperty("visibleStyle");e[i]=this.onRevealTransitionEnd,this.transition({from:t.hiddenStyle,to:t.visibleStyle,isCleaning:!0,onTransitionEnd:e})},d.onRevealTransitionEnd=function(){this.isHidden||this.emitEvent("reveal")},d.getHideRevealTransitionEndProperty=function(t){var e=this.layout.options[t];if(e.opacity)return"opacity";for(var i in e)return i},d.hide=function(){this.isHidden=!0,this.css({display:""});var t=this.layout.options,e={},i=this.getHideRevealTransitionEndProperty("hiddenStyle");e[i]=this.onHideTransitionEnd,this.transition({from:t.visibleStyle,to:t.hiddenStyle,isCleaning:!0,onTransitionEnd:e})},d.onHideTransitionEnd=function(){this.isHidden&&(this.css({display:"none"}),this.emitEvent("hide"))},d.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},o}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("outlayer/outlayer",["ev-emitter/ev-emitter","get-size/get-size","fizzy-ui-utils/utils","./item"],function(i,o,n,s){return e(t,i,o,n,s)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter"),require("get-size"),require("fizzy-ui-utils"),require("./item")):t.Outlayer=e(t,t.EvEmitter,t.getSize,t.fizzyUIUtils,t.Outlayer.Item)}(window,function(t,e,i,o,n){"use strict";function s(t,e){var i=o.getQueryElement(t);if(!i)return void(u&&u.error("Bad element for "+this.constructor.namespace+": "+(i||t)));this.element=i,h&&(this.$element=h(this.element)),this.options=o.extend({},this.constructor.defaults),this.option(e);var n=++l;this.element.outlayerGUID=n,f[n]=this,this._create();var s=this._getOption("initLayout");s&&this.layout()}function r(t){function e(){t.apply(this,arguments)}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}function a(t){if("number"==typeof t)return t;var e=t.match(/(^\d*\.?\d*)(\w*)/),i=e&&e[1],o=e&&e[2];if(!i.length)return 0;i=parseFloat(i);var n=m[o]||1;return i*n}var u=t.console,h=t.jQuery,d=function(){},l=0,f={};s.namespace="outlayer",s.Item=n,s.defaults={containerStyle:{position:"relative"},initLayout:!0,originLeft:!0,originTop:!0,resize:!0,resizeContainer:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}};var c=s.prototype;o.extend(c,e.prototype),c.option=function(t){o.extend(this.options,t)},c._getOption=function(t){var e=this.constructor.compatOptions[t];return e&&void 0!==this.options[e]?this.options[e]:this.options[t]},s.compatOptions={initLayout:"isInitLayout",horizontal:"isHorizontal",layoutInstant:"isLayoutInstant",originLeft:"isOriginLeft",originTop:"isOriginTop",resize:"isResizeBound",resizeContainer:"isResizingContainer"},c._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),o.extend(this.element.style,this.options.containerStyle);var t=this._getOption("resize");t&&this.bindResize()},c.reloadItems=function(){this.items=this._itemize(this.element.children)},c._itemize=function(t){for(var e=this._filterFindItemElements(t),i=this.constructor.Item,o=[],n=0;n<e.length;n++){var s=e[n],r=new i(s,this);o.push(r)}return o},c._filterFindItemElements=function(t){return o.filterFindElements(t,this.options.itemSelector)},c.getItemElements=function(){return this.items.map(function(t){return t.element})},c.layout=function(){this._resetLayout(),this._manageStamps();var t=this._getOption("layoutInstant"),e=void 0!==t?t:!this._isLayoutInited;this.layoutItems(this.items,e),this._isLayoutInited=!0},c._init=c.layout,c._resetLayout=function(){this.getSize()},c.getSize=function(){this.size=i(this.element)},c._getMeasurement=function(t,e){var o,n=this.options[t];n?("string"==typeof n?o=this.element.querySelector(n):n instanceof HTMLElement&&(o=n),this[t]=o?i(o)[e]:n):this[t]=0},c.layoutItems=function(t,e){t=this._getItemsForLayout(t),this._layoutItems(t,e),this._postLayout()},c._getItemsForLayout=function(t){return t.filter(function(t){return!t.isIgnored})},c._layoutItems=function(t,e){if(this._emitCompleteOnItems("layout",t),t&&t.length){var i=[];t.forEach(function(t){var o=this._getItemLayoutPosition(t);o.item=t,o.isInstant=e||t.isLayoutInstant,i.push(o)},this),this._processLayoutQueue(i)}},c._getItemLayoutPosition=function(){return{x:0,y:0}},c._processLayoutQueue=function(t){this.updateStagger(),t.forEach(function(t,e){this._positionItem(t.item,t.x,t.y,t.isInstant,e)},this)},c.updateStagger=function(){var t=this.options.stagger;return null===t||void 0===t?void(this.stagger=0):(this.stagger=a(t),this.stagger)},c._positionItem=function(t,e,i,o,n){o?t.goTo(e,i):(t.stagger(n*this.stagger),t.moveTo(e,i))},c._postLayout=function(){this.resizeContainer()},c.resizeContainer=function(){var t=this._getOption("resizeContainer");if(t){var e=this._getContainerSize();e&&(this._setContainerMeasure(e.width,!0),this._setContainerMeasure(e.height,!1))}},c._getContainerSize=d,c._setContainerMeasure=function(t,e){if(void 0!==t){var i=this.size;i.isBorderBox&&(t+=e?i.paddingLeft+i.paddingRight+i.borderLeftWidth+i.borderRightWidth:i.paddingBottom+i.paddingTop+i.borderTopWidth+i.borderBottomWidth),t=Math.max(t,0),this.element.style[e?"width":"height"]=t+"px"}},c._emitCompleteOnItems=function(t,e){function i(){n.dispatchEvent(t+"Complete",null,[e])}function o(){r++,r==s&&i()}var n=this,s=e.length;if(!e||!s)return void i();var r=0;e.forEach(function(e){e.once(t,o)})},c.dispatchEvent=function(t,e,i){var o=e?[e].concat(i):i;if(this.emitEvent(t,o),h)if(this.$element=this.$element||h(this.element),e){var n=h.Event(e);n.type=t,this.$element.trigger(n,i)}else this.$element.trigger(t,i)},c.ignore=function(t){var e=this.getItem(t);e&&(e.isIgnored=!0)},c.unignore=function(t){var e=this.getItem(t);e&&delete e.isIgnored},c.stamp=function(t){t=this._find(t),t&&(this.stamps=this.stamps.concat(t),t.forEach(this.ignore,this))},c.unstamp=function(t){t=this._find(t),t&&t.forEach(function(t){o.removeFrom(this.stamps,t),this.unignore(t)},this)},c._find=function(t){if(t)return"string"==typeof t&&(t=this.element.querySelectorAll(t)),t=o.makeArray(t)},c._manageStamps=function(){this.stamps&&this.stamps.length&&(this._getBoundingRect(),this.stamps.forEach(this._manageStamp,this))},c._getBoundingRect=function(){var t=this.element.getBoundingClientRect(),e=this.size;this._boundingRect={left:t.left+e.paddingLeft+e.borderLeftWidth,top:t.top+e.paddingTop+e.borderTopWidth,right:t.right-(e.paddingRight+e.borderRightWidth),bottom:t.bottom-(e.paddingBottom+e.borderBottomWidth)}},c._manageStamp=d,c._getElementOffset=function(t){var e=t.getBoundingClientRect(),o=this._boundingRect,n=i(t),s={left:e.left-o.left-n.marginLeft,top:e.top-o.top-n.marginTop,right:o.right-e.right-n.marginRight,bottom:o.bottom-e.bottom-n.marginBottom};return s},c.handleEvent=o.handleEvent,c.bindResize=function(){t.addEventListener("resize",this),this.isResizeBound=!0},c.unbindResize=function(){t.removeEventListener("resize",this),this.isResizeBound=!1},c.onresize=function(){this.resize()},o.debounceMethod(s,"onresize",100),c.resize=function(){this.isResizeBound&&this.needsResizeLayout()&&this.layout()},c.needsResizeLayout=function(){var t=i(this.element),e=this.size&&t;return e&&t.innerWidth!==this.size.innerWidth},c.addItems=function(t){var e=this._itemize(t);return e.length&&(this.items=this.items.concat(e)),e},c.appended=function(t){var e=this.addItems(t);e.length&&(this.layoutItems(e,!0),this.reveal(e))},c.prepended=function(t){var e=this._itemize(t);if(e.length){var i=this.items.slice(0);this.items=e.concat(i),this._resetLayout(),this._manageStamps(),this.layoutItems(e,!0),this.reveal(e),this.layoutItems(i)}},c.reveal=function(t){if(this._emitCompleteOnItems("reveal",t),t&&t.length){var e=this.updateStagger();t.forEach(function(t,i){t.stagger(i*e),t.reveal()})}},c.hide=function(t){if(this._emitCompleteOnItems("hide",t),t&&t.length){var e=this.updateStagger();t.forEach(function(t,i){t.stagger(i*e),t.hide()})}},c.revealItemElements=function(t){var e=this.getItems(t);this.reveal(e)},c.hideItemElements=function(t){var e=this.getItems(t);this.hide(e)},c.getItem=function(t){for(var e=0;e<this.items.length;e++){var i=this.items[e];if(i.element==t)return i}},c.getItems=function(t){t=o.makeArray(t);var e=[];return t.forEach(function(t){var i=this.getItem(t);i&&e.push(i)},this),e},c.remove=function(t){var e=this.getItems(t);this._emitCompleteOnItems("remove",e),e&&e.length&&e.forEach(function(t){t.remove(),o.removeFrom(this.items,t)},this)},c.destroy=function(){var t=this.element.style;t.height="",t.position="",t.width="",this.items.forEach(function(t){t.destroy()}),this.unbindResize();var e=this.element.outlayerGUID;delete f[e],delete this.element.outlayerGUID,h&&h.removeData(this.element,this.constructor.namespace)},s.data=function(t){t=o.getQueryElement(t);var e=t&&t.outlayerGUID;return e&&f[e]},s.create=function(t,e){var i=r(s);return i.defaults=o.extend({},s.defaults),o.extend(i.defaults,e),i.compatOptions=o.extend({},s.compatOptions),i.namespace=t,i.data=s.data,i.Item=r(n),o.htmlInit(i,t),h&&h.bridget&&h.bridget(t,i),i};var m={ms:1,s:1e3};return s.Item=n,s}),function(t,e){"function"==typeof define&&define.amd?define("isotope/js/item",["outlayer/outlayer"],e):"object"==typeof module&&module.exports?module.exports=e(require("outlayer")):(t.Isotope=t.Isotope||{},t.Isotope.Item=e(t.Outlayer))}(window,function(t){"use strict";function e(){t.Item.apply(this,arguments)}var i=e.prototype=Object.create(t.Item.prototype),o=i._create;i._create=function(){this.id=this.layout.itemGUID++,o.call(this),this.sortData={}},i.updateSortData=function(){if(!this.isIgnored){this.sortData.id=this.id,this.sortData["original-order"]=this.id,this.sortData.random=Math.random();var t=this.layout.options.getSortData,e=this.layout._sorters;for(var i in t){var o=e[i];this.sortData[i]=o(this.element,this)}}};var n=i.destroy;return i.destroy=function(){n.apply(this,arguments),this.css({display:""})},e}),function(t,e){"function"==typeof define&&define.amd?define("isotope/js/layout-mode",["get-size/get-size","outlayer/outlayer"],e):"object"==typeof module&&module.exports?module.exports=e(require("get-size"),require("outlayer")):(t.Isotope=t.Isotope||{},t.Isotope.LayoutMode=e(t.getSize,t.Outlayer))}(window,function(t,e){"use strict";function i(t){this.isotope=t,t&&(this.options=t.options[this.namespace],this.element=t.element,this.items=t.filteredItems,this.size=t.size)}var o=i.prototype,n=["_resetLayout","_getItemLayoutPosition","_manageStamp","_getContainerSize","_getElementOffset","needsResizeLayout","_getOption"];return n.forEach(function(t){o[t]=function(){return e.prototype[t].apply(this.isotope,arguments)}}),o.needsVerticalResizeLayout=function(){var e=t(this.isotope.element),i=this.isotope.size&&e;return i&&e.innerHeight!=this.isotope.size.innerHeight},o._getMeasurement=function(){this.isotope._getMeasurement.apply(this,arguments)},o.getColumnWidth=function(){this.getSegmentSize("column","Width")},o.getRowHeight=function(){this.getSegmentSize("row","Height")},o.getSegmentSize=function(t,e){var i=t+e,o="outer"+e;if(this._getMeasurement(i,o),!this[i]){var n=this.getFirstItemSize();this[i]=n&&n[o]||this.isotope.size["inner"+e]}},o.getFirstItemSize=function(){var e=this.isotope.filteredItems[0];return e&&e.element&&t(e.element)},o.layout=function(){this.isotope.layout.apply(this.isotope,arguments)},o.getSize=function(){this.isotope.getSize(),this.size=this.isotope.size},i.modes={},i.create=function(t,e){function n(){i.apply(this,arguments)}return n.prototype=Object.create(o),n.prototype.constructor=n,e&&(n.options=e),n.prototype.namespace=t,i.modes[t]=n,n},i}),function(t,e){"function"==typeof define&&define.amd?define("masonry/masonry",["outlayer/outlayer","get-size/get-size"],e):"object"==typeof module&&module.exports?module.exports=e(require("outlayer"),require("get-size")):t.Masonry=e(t.Outlayer,t.getSize)}(window,function(t,e){var i=t.create("masonry");i.compatOptions.fitWidth="isFitWidth";var o=i.prototype;return o._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns(),this.colYs=[];for(var t=0;t<this.cols;t++)this.colYs.push(0);this.maxY=0,this.horizontalColIndex=0},o.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var t=this.items[0],i=t&&t.element;this.columnWidth=i&&e(i).outerWidth||this.containerWidth}var o=this.columnWidth+=this.gutter,n=this.containerWidth+this.gutter,s=n/o,r=o-n%o,a=r&&r<1?"round":"floor";s=Math[a](s),this.cols=Math.max(s,1)},o.getContainerWidth=function(){var t=this._getOption("fitWidth"),i=t?this.element.parentNode:this.element,o=e(i);this.containerWidth=o&&o.innerWidth},o._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth%this.columnWidth,i=e&&e<1?"round":"ceil",o=Math[i](t.size.outerWidth/this.columnWidth);o=Math.min(o,this.cols);for(var n=this.options.horizontalOrder?"_getHorizontalColPosition":"_getTopColPosition",s=this[n](o,t),r={x:this.columnWidth*s.col,y:s.y},a=s.y+t.size.outerHeight,u=o+s.col,h=s.col;h<u;h++)this.colYs[h]=a;return r},o._getTopColPosition=function(t){var e=this._getTopColGroup(t),i=Math.min.apply(Math,e);return{col:e.indexOf(i),y:i}},o._getTopColGroup=function(t){if(t<2)return this.colYs;for(var e=[],i=this.cols+1-t,o=0;o<i;o++)e[o]=this._getColGroupY(o,t);return e},o._getColGroupY=function(t,e){if(e<2)return this.colYs[t];var i=this.colYs.slice(t,t+e);return Math.max.apply(Math,i)},o._getHorizontalColPosition=function(t,e){var i=this.horizontalColIndex%this.cols,o=t>1&&i+t>this.cols;i=o?0:i;var n=e.size.outerWidth&&e.size.outerHeight;return this.horizontalColIndex=n?i+t:this.horizontalColIndex,{col:i,y:this._getColGroupY(i,t)}},o._manageStamp=function(t){var i=e(t),o=this._getElementOffset(t),n=this._getOption("originLeft"),s=n?o.left:o.right,r=s+i.outerWidth,a=Math.floor(s/this.columnWidth);a=Math.max(0,a);var u=Math.floor(r/this.columnWidth);u-=r%this.columnWidth?0:1,u=Math.min(this.cols-1,u);for(var h=this._getOption("originTop"),d=(h?o.top:o.bottom)+i.outerHeight,l=a;l<=u;l++)this.colYs[l]=Math.max(d,this.colYs[l])},o._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var t={height:this.maxY};return this._getOption("fitWidth")&&(t.width=this._getContainerFitWidth()),t},o._getContainerFitWidth=function(){for(var t=0,e=this.cols;--e&&0===this.colYs[e];)t++;return(this.cols-t)*this.columnWidth-this.gutter},o.needsResizeLayout=function(){var t=this.containerWidth;return this.getContainerWidth(),t!=this.containerWidth},i}),function(t,e){"function"==typeof define&&define.amd?define("isotope/js/layout-modes/masonry",["../layout-mode","masonry/masonry"],e):"object"==typeof module&&module.exports?module.exports=e(require("../layout-mode"),require("masonry-layout")):e(t.Isotope.LayoutMode,t.Masonry)}(window,function(t,e){"use strict";var i=t.create("masonry"),o=i.prototype,n={_getElementOffset:!0,layout:!0,_getMeasurement:!0};for(var s in e.prototype)n[s]||(o[s]=e.prototype[s]);var r=o.measureColumns;o.measureColumns=function(){this.items=this.isotope.filteredItems,r.call(this)};var a=o._getOption;return o._getOption=function(t){return"fitWidth"==t?void 0!==this.options.isFitWidth?this.options.isFitWidth:this.options.fitWidth:a.apply(this.isotope,arguments)},i}),function(t,e){"function"==typeof define&&define.amd?define("isotope/js/layout-modes/fit-rows",["../layout-mode"],e):"object"==typeof exports?module.exports=e(require("../layout-mode")):e(t.Isotope.LayoutMode)}(window,function(t){"use strict";var e=t.create("fitRows"),i=e.prototype;return i._resetLayout=function(){this.x=0,this.y=0,this.maxY=0,this._getMeasurement("gutter","outerWidth")},i._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth+this.gutter,i=this.isotope.size.innerWidth+this.gutter;0!==this.x&&e+this.x>i&&(this.x=0,this.y=this.maxY);var o={x:this.x,y:this.y};return this.maxY=Math.max(this.maxY,this.y+t.size.outerHeight),this.x+=e,o},i._getContainerSize=function(){return{height:this.maxY}},e}),function(t,e){"function"==typeof define&&define.amd?define("isotope/js/layout-modes/vertical",["../layout-mode"],e):"object"==typeof module&&module.exports?module.exports=e(require("../layout-mode")):e(t.Isotope.LayoutMode)}(window,function(t){"use strict";var e=t.create("vertical",{horizontalAlignment:0}),i=e.prototype;return i._resetLayout=function(){this.y=0},i._getItemLayoutPosition=function(t){t.getSize();var e=(this.isotope.size.innerWidth-t.size.outerWidth)*this.options.horizontalAlignment,i=this.y;return this.y+=t.size.outerHeight,{x:e,y:i}},i._getContainerSize=function(){return{height:this.y}},e}),function(t,e){"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size","desandro-matches-selector/matches-selector","fizzy-ui-utils/utils","isotope/js/item","isotope/js/layout-mode","isotope/js/layout-modes/masonry","isotope/js/layout-modes/fit-rows","isotope/js/layout-modes/vertical"],function(i,o,n,s,r,a){return e(t,i,o,n,s,r,a)}):"object"==typeof module&&module.exports?module.exports=e(t,require("outlayer"),require("get-size"),require("desandro-matches-selector"),require("fizzy-ui-utils"),require("isotope/js/item"),require("isotope/js/layout-mode"),require("isotope/js/layout-modes/masonry"),require("isotope/js/layout-modes/fit-rows"),require("isotope/js/layout-modes/vertical")):t.Isotope=e(t,t.Outlayer,t.getSize,t.matchesSelector,t.fizzyUIUtils,t.Isotope.Item,t.Isotope.LayoutMode)}(window,function(t,e,i,o,n,s,r){function a(t,e){return function(i,o){for(var n=0;n<t.length;n++){var s=t[n],r=i.sortData[s],a=o.sortData[s];if(r>a||r<a){var u=void 0!==e[s]?e[s]:e,h=u?1:-1;return(r>a?1:-1)*h}}return 0}}var u=t.jQuery,h=String.prototype.trim?function(t){return t.trim()}:function(t){return t.replace(/^\s+|\s+$/g,"")},d=e.create("isotope",{layoutMode:"masonry",isJQueryFiltering:!0,sortAscending:!0});d.Item=s,d.LayoutMode=r;var l=d.prototype;l._create=function(){this.itemGUID=0,this._sorters={},this._getSorters(),e.prototype._create.call(this),this.modes={},this.filteredItems=this.items,this.sortHistory=["original-order"];for(var t in r.modes)this._initLayoutMode(t)},l.reloadItems=function(){this.itemGUID=0,e.prototype.reloadItems.call(this)},l._itemize=function(){for(var t=e.prototype._itemize.apply(this,arguments),i=0;i<t.length;i++){var o=t[i];o.id=this.itemGUID++}return this._updateItemsSortData(t),t},l._initLayoutMode=function(t){var e=r.modes[t],i=this.options[t]||{};this.options[t]=e.options?n.extend(e.options,i):i,this.modes[t]=new e(this)},l.layout=function(){return!this._isLayoutInited&&this._getOption("initLayout")?void this.arrange():void this._layout()},l._layout=function(){var t=this._getIsInstant();this._resetLayout(),this._manageStamps(),this.layoutItems(this.filteredItems,t),this._isLayoutInited=!0},l.arrange=function(t){this.option(t),this._getIsInstant();var e=this._filter(this.items);this.filteredItems=e.matches,this._bindArrangeComplete(),this._isInstant?this._noTransition(this._hideReveal,[e]):this._hideReveal(e),this._sort(),this._layout()},l._init=l.arrange,l._hideReveal=function(t){this.reveal(t.needReveal),this.hide(t.needHide)},l._getIsInstant=function(){var t=this._getOption("layoutInstant"),e=void 0!==t?t:!this._isLayoutInited;return this._isInstant=e,e},l._bindArrangeComplete=function(){function t(){e&&i&&o&&n.dispatchEvent("arrangeComplete",null,[n.filteredItems])}var e,i,o,n=this;this.once("layoutComplete",function(){e=!0,t()}),this.once("hideComplete",function(){i=!0,t()}),this.once("revealComplete",function(){o=!0,t()})},l._filter=function(t){var e=this.options.filter;e=e||"*";for(var i=[],o=[],n=[],s=this._getFilterTest(e),r=0;r<t.length;r++){var a=t[r];if(!a.isIgnored){var u=s(a);u&&i.push(a),u&&a.isHidden?o.push(a):u||a.isHidden||n.push(a)}}return{matches:i,needReveal:o,needHide:n}},l._getFilterTest=function(t){return u&&this.options.isJQueryFiltering?function(e){return u(e.element).is(t)}:"function"==typeof t?function(e){return t(e.element)}:function(e){return o(e.element,t)}},l.updateSortData=function(t){
var e;t?(t=n.makeArray(t),e=this.getItems(t)):e=this.items,this._getSorters(),this._updateItemsSortData(e)},l._getSorters=function(){var t=this.options.getSortData;for(var e in t){var i=t[e];this._sorters[e]=f(i)}},l._updateItemsSortData=function(t){for(var e=t&&t.length,i=0;e&&i<e;i++){var o=t[i];o.updateSortData()}};var f=function(){function t(t){if("string"!=typeof t)return t;var i=h(t).split(" "),o=i[0],n=o.match(/^\[(.+)\]$/),s=n&&n[1],r=e(s,o),a=d.sortDataParsers[i[1]];return t=a?function(t){return t&&a(r(t))}:function(t){return t&&r(t)}}function e(t,e){return t?function(e){return e.getAttribute(t)}:function(t){var i=t.querySelector(e);return i&&i.textContent}}return t}();d.sortDataParsers={parseInt:function(t){return parseInt(t,10)},parseFloat:function(t){return parseFloat(t)}},l._sort=function(){if(this.options.sortBy){var t=n.makeArray(this.options.sortBy);this._getIsSameSortBy(t)||(this.sortHistory=t.concat(this.sortHistory));var e=a(this.sortHistory,this.options.sortAscending);this.filteredItems.sort(e)}},l._getIsSameSortBy=function(t){for(var e=0;e<t.length;e++)if(t[e]!=this.sortHistory[e])return!1;return!0},l._mode=function(){var t=this.options.layoutMode,e=this.modes[t];if(!e)throw new Error("No layout mode: "+t);return e.options=this.options[t],e},l._resetLayout=function(){e.prototype._resetLayout.call(this),this._mode()._resetLayout()},l._getItemLayoutPosition=function(t){return this._mode()._getItemLayoutPosition(t)},l._manageStamp=function(t){this._mode()._manageStamp(t)},l._getContainerSize=function(){return this._mode()._getContainerSize()},l.needsResizeLayout=function(){return this._mode().needsResizeLayout()},l.appended=function(t){var e=this.addItems(t);if(e.length){var i=this._filterRevealAdded(e);this.filteredItems=this.filteredItems.concat(i)}},l.prepended=function(t){var e=this._itemize(t);if(e.length){this._resetLayout(),this._manageStamps();var i=this._filterRevealAdded(e);this.layoutItems(this.filteredItems),this.filteredItems=i.concat(this.filteredItems),this.items=e.concat(this.items)}},l._filterRevealAdded=function(t){var e=this._filter(t);return this.hide(e.needHide),this.reveal(e.matches),this.layoutItems(e.matches,!0),e.matches},l.insert=function(t){var e=this.addItems(t);if(e.length){var i,o,n=e.length;for(i=0;i<n;i++)o=e[i],this.element.appendChild(o.element);var s=this._filter(e).matches;for(i=0;i<n;i++)e[i].isLayoutInstant=!0;for(this.arrange(),i=0;i<n;i++)delete e[i].isLayoutInstant;this.reveal(s)}};var c=l.remove;return l.remove=function(t){t=n.makeArray(t);var e=this.getItems(t);c.call(this,t);for(var i=e&&e.length,o=0;i&&o<i;o++){var s=e[o];n.removeFrom(this.filteredItems,s)}},l.shuffle=function(){for(var t=0;t<this.items.length;t++){var e=this.items[t];e.sortData.random=Math.random()}this.options.sortBy="random",this._sort(),this._layout()},l._noTransition=function(t,e){var i=this.options.transitionDuration;this.options.transitionDuration=0;var o=t.apply(this,e);return this.options.transitionDuration=i,o},l.getFilteredItemElements=function(){return this.filteredItems.map(function(t){return t.element})},d});
/*
* Copyright (C) 2009 Joel Sutherland
* Licenced under the MIT license
* http://www.newmediacampaigns.com/page/jquery-flickr-plugin
*
* Available tags for templates:
* title, link, date_taken, description, published, author, author_id, tags, image*
*/
(function($){$.fn.jflickrfeed=function(settings,callback){settings=$.extend(true,{flickrbase:'http://api.flickr.com/services/feeds/',feedapi:'photos_public.gne',limit:20,qstrings:{lang:'en-us',format:'json',jsoncallback:'?'},cleanDescription:true,useTemplate:true,itemTemplate:'',itemCallback:function(){}},settings);var url=settings.flickrbase+settings.feedapi+'?';var first=true;for(var key in settings.qstrings){if(!first)
url+='&';url+=key+'='+settings.qstrings[key];first=false;}
return $(this).each(function(){var $container=$(this);var container=this;$.getJSON(url,function(data){$.each(data.items,function(i,item){if(i<settings.limit){if(settings.cleanDescription){var regex=/<p>(.*?)<\/p>/g;var input=item.description;if(regex.test(input)){item.description=input.match(regex)[2]
if(item.description!=undefined)
item.description=item.description.replace('<p>','').replace('</p>','');}}
item['image_s']=item.media.m.replace('_m','_s');item['image_t']=item.media.m.replace('_m','_t');item['image_m']=item.media.m.replace('_m','_m');item['image']=item.media.m.replace('_m','');item['image_b']=item.media.m.replace('_m','_b');delete item.media;if(settings.useTemplate){var template=settings.itemTemplate;for(var key in item){var rgx=new RegExp('{{'+key+'}}','g');template=template.replace(rgx,item[key]);}
$container.append(template)}
settings.itemCallback.call(container,item);}});if($.isFunction(callback)){callback.call(container,data);}});});}})(jQuery);
/*
 * ScrollToFixed
 * https://github.com/bigspotteddog/ScrollToFixed
 *
 * Copyright (c) 2011 Joseph Cava-Lynch
 * MIT license
 */
 (function(a){a.isScrollToFixed=function(b){return !!a(b).data("ScrollToFixed")};a.ScrollToFixed=function(d,i){var m=this;m.$el=a(d);m.el=d;m.$el.data("ScrollToFixed",m);var c=false;var H=m.$el;var I;var F;var k;var e;var z;var E=0;var r=0;var j=-1;var f=-1;var u=null;var A;var g;function v(){H.trigger("preUnfixed.ScrollToFixed");l();H.trigger("unfixed.ScrollToFixed");f=-1;E=H.offset().top;r=H.offset().left;if(m.options.offsets){r+=(H.offset().left-H.position().left)}if(j==-1){j=r}I=H.css("position");c=true;if(m.options.bottom!=-1){H.trigger("preFixed.ScrollToFixed");x();H.trigger("fixed.ScrollToFixed")}}function o(){var J=m.options.limit;if(!J){return 0}if(typeof(J)==="function"){return J.apply(H)}return J}function q(){return I==="fixed"}function y(){return I==="absolute"}function h(){return !(q()||y())}function x(){if(!q()){var J=H[0].getBoundingClientRect();u.css({display:H.css("display"),width:J.width,height:J.height,"float":H.css("float")});cssOptions={"z-index":m.options.zIndex,position:"fixed",top:m.options.bottom==-1?t():"",bottom:m.options.bottom==-1?"":m.options.bottom,"margin-left":"0px"};if(!m.options.dontSetWidth){cssOptions.width=H.css("width")}H.css(cssOptions);H.addClass(m.options.baseClassName);if(m.options.className){H.addClass(m.options.className)}I="fixed"}}function b(){var K=o();var J=r;if(m.options.removeOffsets){J="";K=K-E}cssOptions={position:"absolute",top:K,left:J,"margin-left":"0px",bottom:""};if(!m.options.dontSetWidth){cssOptions.width=H.css("width")}H.css(cssOptions);I="absolute"}function l(){if(!h()){f=-1;u.css("display","none");H.css({"z-index":z,width:"",position:F,left:"",top:e,"margin-left":""});H.removeClass("scroll-to-fixed-fixed");if(m.options.className){H.removeClass(m.options.className)}I=null}}function w(J){if(J!=f){H.css("left",r-J);f=J}}function t(){var J=m.options.marginTop;if(!J){return 0}if(typeof(J)==="function"){return J.apply(H)}return J}function B(){if(!a.isScrollToFixed(H)||H.is(":hidden")){return}var M=c;var L=h();if(!c){v()}else{if(h()){E=H.offset().top;r=H.offset().left}}var J=a(window).scrollLeft();var N=a(window).scrollTop();var K=o();if(m.options.minWidth&&a(window).width()<m.options.minWidth){if(!h()||!M){p();H.trigger("preUnfixed.ScrollToFixed");l();H.trigger("unfixed.ScrollToFixed")}}else{if(m.options.maxWidth&&a(window).width()>m.options.maxWidth){if(!h()||!M){p();H.trigger("preUnfixed.ScrollToFixed");l();H.trigger("unfixed.ScrollToFixed")}}else{if(m.options.bottom==-1){if(K>0&&N>=K-t()){if(!L&&(!y()||!M)){p();H.trigger("preAbsolute.ScrollToFixed");b();H.trigger("unfixed.ScrollToFixed")}}else{if(N>=E-t()){if(!q()||!M){p();H.trigger("preFixed.ScrollToFixed");x();f=-1;H.trigger("fixed.ScrollToFixed")}w(J)}else{if(!h()||!M){p();H.trigger("preUnfixed.ScrollToFixed");l();H.trigger("unfixed.ScrollToFixed")}}}}else{if(K>0){if(N+a(window).height()-H.outerHeight(true)>=K-(t()||-n())){if(q()){p();H.trigger("preUnfixed.ScrollToFixed");if(F==="absolute"){b()}else{l()}H.trigger("unfixed.ScrollToFixed")}}else{if(!q()){p();H.trigger("preFixed.ScrollToFixed");x()}w(J);H.trigger("fixed.ScrollToFixed")}}else{w(J)}}}}}function n(){if(!m.options.bottom){return 0}return m.options.bottom}function p(){var J=H.css("position");if(J=="absolute"){H.trigger("postAbsolute.ScrollToFixed")}else{if(J=="fixed"){H.trigger("postFixed.ScrollToFixed")}else{H.trigger("postUnfixed.ScrollToFixed")}}}var D=function(J){if(H.is(":visible")){c=false;B()}else{l()}};var G=function(J){(!!window.requestAnimationFrame)?requestAnimationFrame(B):B()};var C=function(){var K=document.body;if(document.createElement&&K&&K.appendChild&&K.removeChild){var M=document.createElement("div");if(!M.getBoundingClientRect){return null}M.innerHTML="x";M.style.cssText="position:fixed;top:100px;";K.appendChild(M);var N=K.style.height,O=K.scrollTop;K.style.height="3000px";K.scrollTop=500;var J=M.getBoundingClientRect().top;K.style.height=N;var L=(J===100);K.removeChild(M);K.scrollTop=O;return L}return null};var s=function(J){J=J||window.event;if(J.preventDefault){J.preventDefault()}J.returnValue=false};m.init=function(){m.options=a.extend({},a.ScrollToFixed.defaultOptions,i);z=H.css("z-index");m.$el.css("z-index",m.options.zIndex);u=a("<div />");I=H.css("position");F=H.css("position");k=H.css("float");e=H.css("top");if(h()){m.$el.after(u)}a(window).bind("resize.ScrollToFixed",D);a(window).bind("scroll.ScrollToFixed",G);if("ontouchmove" in window){a(window).bind("touchmove.ScrollToFixed",B)}if(m.options.preFixed){H.bind("preFixed.ScrollToFixed",m.options.preFixed)}if(m.options.postFixed){H.bind("postFixed.ScrollToFixed",m.options.postFixed)}if(m.options.preUnfixed){H.bind("preUnfixed.ScrollToFixed",m.options.preUnfixed)}if(m.options.postUnfixed){H.bind("postUnfixed.ScrollToFixed",m.options.postUnfixed)}if(m.options.preAbsolute){H.bind("preAbsolute.ScrollToFixed",m.options.preAbsolute)}if(m.options.postAbsolute){H.bind("postAbsolute.ScrollToFixed",m.options.postAbsolute)}if(m.options.fixed){H.bind("fixed.ScrollToFixed",m.options.fixed)}if(m.options.unfixed){H.bind("unfixed.ScrollToFixed",m.options.unfixed)}if(m.options.spacerClass){u.addClass(m.options.spacerClass)}H.bind("resize.ScrollToFixed",function(){u.height(H.height())});H.bind("scroll.ScrollToFixed",function(){H.trigger("preUnfixed.ScrollToFixed");l();H.trigger("unfixed.ScrollToFixed");B()});H.bind("detach.ScrollToFixed",function(J){s(J);H.trigger("preUnfixed.ScrollToFixed");l();H.trigger("unfixed.ScrollToFixed");a(window).unbind("resize.ScrollToFixed",D);a(window).unbind("scroll.ScrollToFixed",G);H.unbind(".ScrollToFixed");u.remove();m.$el.removeData("ScrollToFixed")});D()};m.init()};a.ScrollToFixed.defaultOptions={marginTop:0,limit:0,bottom:-1,zIndex:1000,baseClassName:"scroll-to-fixed-fixed"};a.fn.scrollToFixed=function(b){return this.each(function(){(new a.ScrollToFixed(this,b))})}})(jQuery);
/***********
	Animates element's number to new number with commas
	Parameters:
		stop (number): number to stop on
        commas (boolean): turn commas on/off (default is true)
		duration (number): how long in ms (default is 1000)
		ease (string): type of easing (default is "swing", others are avaiable from jQuery's easing plugin
	Examples:
        $("#div").animateNumbers(1234, false, 500, "linear"); // half second linear without commas
		$("#div").animateNumbers(1234, true, 2000); // two second swing with commas
		$("#div").animateNumbers(4321); // one second swing with commas
	This fully expects an element containing an integer
	If the number is within copy then separate it with a span and target the span
    Will work in appropriate inputs
	Inserts and accounts for commas during animation by default
    
    https://github.com/talmand/jquery-animate-numbers
***********/

!function(e){e.fn.animateNumbers=function(t,a,n,l){return this.each(function(){var i=e(this),r=i.is("input"),v=parseInt(r?i.val().replace(/,/g,""):i.text().replace(/,/g,"")),u=/(\d)(?=(\d\d\d)+(?!\d))/g;a=void 0===a?!0:a,r&&"number"===i[0].type&&(a=!1),e({value:v}).animate({value:t},{duration:void 0===n?1e3:n,easing:void 0===l?"swing":l,step:function(){r?i.val(Math.floor(this.value)):i.text(Math.floor(this.value)),a&&(r?i.val(i.val().replace(u,"$1,")):i.text(i.text().replace(u,"$1,")))},complete:function(){(parseInt(i.text())!==t||parseInt(i.val())!==t)&&(r?i.val(t):i.text(t),a&&(r?i.val(i.val().replace(u,"$1,")):i.text(i.text().replace(u,"$1,"))))}})})}}(jQuery);
/*
 * jQuery appear plugin
 *
 * Copyright (c) 2012 Andrey Sidorov
 * licensed under MIT license.
 *
 * https://github.com/morr/jquery.appear/
 *
 * Version: 0.3.6
 */
(function($) {
  var selectors = [];

  var check_binded = false;
  var check_lock = false;
  var defaults = {
    interval: 250,
    force_process: false
  };
  var $window = $(window);

  var $prior_appeared = [];

  function appeared(selector) {
    return $(selector).filter(function() {
      return $(this).is(':appeared');
    });
  }

  function process() {
    check_lock = false;
    for (var index = 0, selectorsLength = selectors.length; index < selectorsLength; index++) {
      var $appeared = appeared(selectors[index]);

      $appeared.trigger('appear', [$appeared]);

      if ($prior_appeared[index]) {
        var $disappeared = $prior_appeared[index].not($appeared);
        $disappeared.trigger('disappear', [$disappeared]);
      }
      $prior_appeared[index] = $appeared;
    }
  }

  function add_selector(selector) {
    selectors.push(selector);
    $prior_appeared.push();
  }

  // "appeared" custom filter
  $.expr[':'].appeared = function(element) {
    var $element = $(element);
    if (!$element.is(':visible')) {
      return false;
    }

    var window_left = $window.scrollLeft();
    var window_top = $window.scrollTop();
    var offset = $element.offset();
    var left = offset.left;
    var top = offset.top;

    if (top + $element.height() >= window_top &&
        top - ($element.data('appear-top-offset') || 0) <= window_top + $window.height() &&
        left + $element.width() >= window_left &&
        left - ($element.data('appear-left-offset') || 0) <= window_left + $window.width()) {
      return true;
    } else {
      return false;
    }
  };

  $.fn.extend({
    // watching for element's appearance in browser viewport
    appear: function(options) {
      var opts = $.extend({}, defaults, options || {});
      var selector = this.selector || this;
      if (!check_binded) {
        var on_check = function() {
          if (check_lock) {
            return;
          }
          check_lock = true;

          setTimeout(process, opts.interval);
        };

        $(window).scroll(on_check).resize(on_check);
        check_binded = true;
      }

      if (opts.force_process) {
        setTimeout(process, opts.interval);
      }
      add_selector(selector);
      return $(selector);
    }
  });

  $.extend({
    // force elements's appearance check
    force_appear: function() {
      if (check_binded) {
        process();
        return true;
      }
      return false;
    }
  });
})(function() {
  if (typeof module !== 'undefined') {
    // Node
    return require('jquery');
  } else {
    return jQuery;
  }
}());

/*!
 * The Final Countdown for jQuery v2.2.0 (http://hilios.github.io/jQuery.countdown/)
 * Copyright (c) 2016 Edson Hilios
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){"use strict";function b(a){if(a instanceof Date)return a;if(String(a).match(g))return String(a).match(/^[0-9]*$/)&&(a=Number(a)),String(a).match(/\-/)&&(a=String(a).replace(/\-/g,"/")),new Date(a);throw new Error("Couldn't cast `"+a+"` to a date object.")}function c(a){var b=a.toString().replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1");return new RegExp(b)}function d(a){return function(b){var d=b.match(/%(-|!)?[A-Z]{1}(:[^;]+;)?/gi);if(d)for(var f=0,g=d.length;f<g;++f){var h=d[f].match(/%(-|!)?([a-zA-Z]{1})(:[^;]+;)?/),j=c(h[0]),k=h[1]||"",l=h[3]||"",m=null;h=h[2],i.hasOwnProperty(h)&&(m=i[h],m=Number(a[m])),null!==m&&("!"===k&&(m=e(l,m)),""===k&&m<10&&(m="0"+m.toString()),b=b.replace(j,m.toString()))}return b=b.replace(/%%/,"%")}}function e(a,b){var c="s",d="";return a&&(a=a.replace(/(:|;|\s)/gi,"").split(/\,/),1===a.length?c=a[0]:(d=a[0],c=a[1])),Math.abs(b)>1?c:d}var f=[],g=[],h={precision:100,elapse:!1,defer:!1};g.push(/^[0-9]*$/.source),g.push(/([0-9]{1,2}\/){2}[0-9]{4}( [0-9]{1,2}(:[0-9]{2}){2})?/.source),g.push(/[0-9]{4}([\/\-][0-9]{1,2}){2}( [0-9]{1,2}(:[0-9]{2}){2})?/.source),g=new RegExp(g.join("|"));var i={Y:"years",m:"months",n:"daysToMonth",d:"daysToWeek",w:"weeks",W:"weeksToMonth",H:"hours",M:"minutes",S:"seconds",D:"totalDays",I:"totalHours",N:"totalMinutes",T:"totalSeconds"},j=function(b,c,d){this.el=b,this.$el=a(b),this.interval=null,this.offset={},this.options=a.extend({},h),this.firstTick=!0,this.instanceNumber=f.length,f.push(this),this.$el.data("countdown-instance",this.instanceNumber),d&&("function"==typeof d?(this.$el.on("update.countdown",d),this.$el.on("stoped.countdown",d),this.$el.on("finish.countdown",d)):this.options=a.extend({},h,d)),this.setFinalDate(c),this.options.defer===!1&&this.start()};a.extend(j.prototype,{start:function(){null!==this.interval&&clearInterval(this.interval);var a=this;this.update(),this.interval=setInterval(function(){a.update.call(a)},this.options.precision)},stop:function(){clearInterval(this.interval),this.interval=null,this.dispatchEvent("stoped")},toggle:function(){this.interval?this.stop():this.start()},pause:function(){this.stop()},resume:function(){this.start()},remove:function(){this.stop.call(this),f[this.instanceNumber]=null,delete this.$el.data().countdownInstance},setFinalDate:function(a){this.finalDate=b(a)},update:function(){if(0===this.$el.closest("html").length)return void this.remove();var a,b=new Date;return a=this.finalDate.getTime()-b.getTime(),a=Math.ceil(a/1e3),a=!this.options.elapse&&a<0?0:Math.abs(a),this.totalSecsLeft===a||this.firstTick?void(this.firstTick=!1):(this.totalSecsLeft=a,this.elapsed=b>=this.finalDate,this.offset={seconds:this.totalSecsLeft%60,minutes:Math.floor(this.totalSecsLeft/60)%60,hours:Math.floor(this.totalSecsLeft/60/60)%24,days:Math.floor(this.totalSecsLeft/60/60/24)%7,daysToWeek:Math.floor(this.totalSecsLeft/60/60/24)%7,daysToMonth:Math.floor(this.totalSecsLeft/60/60/24%30.4368),weeks:Math.floor(this.totalSecsLeft/60/60/24/7),weeksToMonth:Math.floor(this.totalSecsLeft/60/60/24/7)%4,months:Math.floor(this.totalSecsLeft/60/60/24/30.4368),years:Math.abs(this.finalDate.getFullYear()-b.getFullYear()),totalDays:Math.floor(this.totalSecsLeft/60/60/24),totalHours:Math.floor(this.totalSecsLeft/60/60),totalMinutes:Math.floor(this.totalSecsLeft/60),totalSeconds:this.totalSecsLeft},void(this.options.elapse||0!==this.totalSecsLeft?this.dispatchEvent("update"):(this.stop(),this.dispatchEvent("finish"))))},dispatchEvent:function(b){var c=a.Event(b+".countdown");c.finalDate=this.finalDate,c.elapsed=this.elapsed,c.offset=a.extend({},this.offset),c.strftime=d(this.offset),this.$el.trigger(c)}}),a.fn.countdown=function(){var b=Array.prototype.slice.call(arguments,0);return this.each(function(){var c=a(this).data("countdown-instance");if(void 0!==c){var d=f[c],e=b[0];j.prototype.hasOwnProperty(e)?d[e].apply(d,b.slice(1)):null===String(e).match(/^[$A-Z_][0-9A-Z_$]*$/i)?(d.setFinalDate.call(d,e),d.start()):a.error("Method %s does not exist on jQuery.countdown".replace(/\%s/gi,e))}else new j(this,b[0],b[1])})}});
(function (factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        // CommonJS
        factory(require('jquery'));
    } else {
        // Browser globals
        factory(jQuery);
    }
}(function ($) {
  var CountTo = function (element, options) {
    this.$element = $(element);
    this.options  = $.extend({}, CountTo.DEFAULTS, this.dataOptions(), options);
    this.init();
  };

  CountTo.DEFAULTS = {
    from: 0,               // the number the element should start at
    to: 0,                 // the number the element should end at
    speed: 1000,           // how long it should take to count between the target numbers
    refreshInterval: 100,  // how often the element should be updated
    decimals: 0,           // the number of decimal places to show
    formatter: formatter,  // handler for formatting the value before rendering
    onUpdate: null,        // callback method for every time the element is updated
    onComplete: null       // callback method for when the element finishes updating
  };

  CountTo.prototype.init = function () {
    this.value     = this.options.from;
    this.loops     = Math.ceil(this.options.speed / this.options.refreshInterval);
    this.loopCount = 0;
    this.increment = (this.options.to - this.options.from) / this.loops;
  };

  CountTo.prototype.dataOptions = function () {
    var options = {
      from:            this.$element.data('from'),
      to:              this.$element.data('to'),
      speed:           this.$element.data('speed'),
      refreshInterval: this.$element.data('refresh-interval'),
      decimals:        this.$element.data('decimals')
    };

    var keys = Object.keys(options);

    for (var i in keys) {
      var key = keys[i];

      if (typeof(options[key]) === 'undefined') {
        delete options[key];
      }
    }

    return options;
  };

  CountTo.prototype.update = function () {
    this.value += this.increment;
    this.loopCount++;

    this.render();

    if (typeof(this.options.onUpdate) == 'function') {
      this.options.onUpdate.call(this.$element, this.value);
    }

    if (this.loopCount >= this.loops) {
      clearInterval(this.interval);
      this.value = this.options.to;

      if (typeof(this.options.onComplete) == 'function') {
        this.options.onComplete.call(this.$element, this.value);
      }
    }
  };

  CountTo.prototype.render = function () {
    var formattedValue = this.options.formatter.call(this.$element, this.value, this.options);
    this.$element.text(formattedValue);
  };

  CountTo.prototype.restart = function () {
    this.stop();
    this.init();
    this.start();
  };

  CountTo.prototype.start = function () {
    this.stop();
    this.render();
    this.interval = setInterval(this.update.bind(this), this.options.refreshInterval);
  };

  CountTo.prototype.stop = function () {
    if (this.interval) {
      clearInterval(this.interval);
    }
  };

  CountTo.prototype.toggle = function () {
    if (this.interval) {
      this.stop();
    } else {
      this.start();
    }
  };

  function formatter(value, options) {
    return value.toFixed(options.decimals);
  }

  $.fn.countTo = function (option) {
    return this.each(function () {
      var $this   = $(this);
      var data    = $this.data('countTo');
      var init    = !data || typeof(option) === 'object';
      var options = typeof(option) === 'object' ? option : {};
      var method  = typeof(option) === 'string' ? option : 'start';

      if (init) {
        if (data) data.stop();
        $this.data('countTo', data = new CountTo(this, options));
      }

      data[method].call(data);
    });
  };
}));

//Title: Custom DropDown plugin by PC
//Documentation: http://designwithpc.com/Plugins/ddslick
(function(e){e.fn.ddslick=function(l){if(c[l]){return c[l].apply(this,Array.prototype.slice.call(arguments,1))}else{if(typeof l==="object"||!l){return c.init.apply(this,arguments)}else{e.error("Method "+l+" does not exists.")}}};var c={},d={data:[],keepJSONItemsOnTop:false,width:260,height:null,background:"#eee",selectText:"",defaultSelectedIndex:null,truncateDescription:true,imagePosition:"left",showSelectedHTML:true,clickOffToClose:true,embedCSS:true,onSelected:function(){}},i='<div class="dd-select"><input class="dd-selected-value" type="hidden" /><a class="dd-selected"></a><span class="dd-pointer dd-pointer-down"></span></div>',a='<ul class="dd-options"></ul>',b='<style id="css-ddslick">.dd-select{ border-radius:2px; border:solid 1px #ccc; position:relative; cursor:pointer;}.dd-desc { color:#aaa; display:block; overflow: hidden; font-weight:normal; line-height: 1.4em; }.dd-selected{ overflow:hidden; display:block; padding:10px; font-weight:bold;}.dd-pointer{ width:0; height:0; position:absolute; right:10px; top:50%; margin-top:-3px;}.dd-pointer-down{ border:solid 5px transparent; border-top:solid 5px #000; }.dd-pointer-up{border:solid 5px transparent !important; border-bottom:solid 5px #000 !important; margin-top:-8px;}.dd-options{ border:solid 1px #ccc; border-top:none; list-style:none; box-shadow:0px 1px 5px #ddd; display:none; position:absolute; z-index:2000; margin:0; padding:0;background:#fff; overflow:auto;}.dd-option{ padding:10px; display:block; border-bottom:solid 1px #ddd; overflow:hidden; text-decoration:none; color:#333; cursor:pointer;-webkit-transition: all 0.25s ease-in-out; -moz-transition: all 0.25s ease-in-out;-o-transition: all 0.25s ease-in-out;-ms-transition: all 0.25s ease-in-out; }.dd-options > li:last-child > .dd-option{ border-bottom:none;}.dd-option:hover{ background:#f3f3f3; color:#000;}.dd-selected-description-truncated { text-overflow: ellipsis; white-space:nowrap; }.dd-option-selected { background:#f6f6f6; }.dd-option-image, .dd-selected-image { vertical-align:middle; float:left; margin-right:5px; max-width:64px;}.dd-image-right { float:right; margin-right:15px; margin-left:5px;}.dd-container{ position:relative;}​ .dd-selected-text { font-weight:bold}​</style>';c.init=function(l){var l=e.extend({},d,l);if(e("#css-ddslick").length<=0&&l.embedCSS){e(b).appendTo("head")}return this.each(function(){var p=e(this),q=p.data("ddslick");if(!q){var n=[],o=l.data;p.find("option").each(function(){var w=e(this),v=w.data();n.push({text:e.trim(w.text()),value:w.val(),selected:w.is(":selected"),description:v.description,imageSrc:v.imagesrc})});if(l.keepJSONItemsOnTop){e.merge(l.data,n)}else{l.data=e.merge(n,l.data)}var m=p,s=e('<div id="'+p.attr("id")+'"></div>');p.replaceWith(s);p=s;p.addClass("dd-container").append(i).append(a);var n=p.find(".dd-select"),u=p.find(".dd-options");u.css({width:l.width});n.css({width:l.width,background:l.background});p.css({width:l.width});if(l.height!=null){u.css({height:l.height,overflow:"auto"})}e.each(l.data,function(v,w){if(w.selected){l.defaultSelectedIndex=v}u.append('<li><a class="dd-option">'+(w.value?' <input class="dd-option-value" type="hidden" value="'+w.value+'" />':"")+(w.imageSrc?' <img class="dd-option-image'+(l.imagePosition=="right"?" dd-image-right":"")+'" src="'+w.imageSrc+'" />':"")+(w.text?' <label class="dd-option-text">'+w.text+"</label>":"")+(w.description?' <small class="dd-option-description dd-desc">'+w.description+"</small>":"")+"</a></li>")});var t={settings:l,original:m,selectedIndex:-1,selectedItem:null,selectedData:null};p.data("ddslick",t);if(l.selectText.length>0&&l.defaultSelectedIndex==null){p.find(".dd-selected").html(l.selectText)}else{var r=(l.defaultSelectedIndex!=null&&l.defaultSelectedIndex>=0&&l.defaultSelectedIndex<l.data.length)?l.defaultSelectedIndex:0;j(p,r)}p.find(".dd-select").on("click.ddslick",function(){f(p)});p.find(".dd-option").on("click.ddslick",function(){j(p,e(this).closest("li").index())});if(l.clickOffToClose){u.addClass("dd-click-off-close");p.on("click.ddslick",function(v){v.stopPropagation()});e("body").on("click",function(){e(".dd-click-off-close").slideUp(50).siblings(".dd-select").find(".dd-pointer").removeClass("dd-pointer-up")})}}})};c.select=function(l){return this.each(function(){if(l.index!==undefined){j(e(this),l.index)}})};c.open=function(){return this.each(function(){var m=e(this),l=m.data("ddslick");if(l){f(m)}})};c.close=function(){return this.each(function(){var m=e(this),l=m.data("ddslick");if(l){k(m)}})};c.destroy=function(){return this.each(function(){var n=e(this),m=n.data("ddslick");if(m){var l=m.original;n.removeData("ddslick").unbind(".ddslick").replaceWith(l)}})};function j(q,s){var u=q.data("ddslick");var r=q.find(".dd-selected"),n=r.siblings(".dd-selected-value"),v=q.find(".dd-options"),l=r.siblings(".dd-pointer"),p=q.find(".dd-option").eq(s),m=p.closest("li"),o=u.settings,t=u.settings.data[s];q.find(".dd-option").removeClass("dd-option-selected");p.addClass("dd-option-selected");u.selectedIndex=s;u.selectedItem=m;u.selectedData=t;if(o.showSelectedHTML){r.html((t.imageSrc?'<img class="dd-selected-image'+(o.imagePosition=="right"?" dd-image-right":"")+'" src="'+t.imageSrc+'" />':"")+(t.text?'<label class="dd-selected-text">'+t.text+"</label>":"")+(t.description?'<small class="dd-selected-description dd-desc'+(o.truncateDescription?" dd-selected-description-truncated":"")+'" >'+t.description+"</small>":""))}else{r.html(t.text)}n.val(t.value);u.original.val(t.value);q.data("ddslick",u);k(q);g(q);if(typeof o.onSelected=="function"){o.onSelected.call(this,u)}}function f(p){var o=p.find(".dd-select"),m=o.siblings(".dd-options"),l=o.find(".dd-pointer"),n=m.is(":visible");e(".dd-click-off-close").not(m).slideUp(50);e(".dd-pointer").removeClass("dd-pointer-up");if(n){m.slideUp("fast");l.removeClass("dd-pointer-up")}else{m.slideDown("fast");l.addClass("dd-pointer-up")}h(p)}function k(l){l.find(".dd-options").slideUp(50);l.find(".dd-pointer").removeClass("dd-pointer-up").removeClass("dd-pointer-up")}function g(o){var n=o.find(".dd-select").css("height");var m=o.find(".dd-selected-description");var l=o.find(".dd-selected-image");if(m.length<=0&&l.length>0){o.find(".dd-selected-text").css("lineHeight",n)}}function h(l){l.find(".dd-option").each(function(){var p=e(this);var n=p.css("height");var o=p.find(".dd-option-description");var m=l.find(".dd-option-image");if(o.length<=0&&m.length>0){p.find(".dd-option-text").css("lineHeight",n)}})}})(jQuery);
/*
 * jQuery Easing v1.4.0 - http://gsgd.co.uk/sandbox/jquery/easing/
 * Open source under the BSD License.
 * Copyright © 2008 George McGinley Smith
 * All rights reserved.
 * https://raw.github.com/gdsmith/jquery-easing/master/LICENSE
*/
!function(n){"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e)}):"object"==typeof module&&"object"==typeof module.exports?exports=n(require("jquery")):n(jQuery)}(function(n){function e(n){var e=7.5625,t=2.75;return n<1/t?e*n*n:n<2/t?e*(n-=1.5/t)*n+.75:n<2.5/t?e*(n-=2.25/t)*n+.9375:e*(n-=2.625/t)*n+.984375}n.easing.jswing=n.easing.swing;var t=Math.pow,u=Math.sqrt,r=Math.sin,i=Math.cos,a=Math.PI,c=1.70158,o=1.525*c,s=2*a/3,f=2*a/4.5;n.extend(n.easing,{def:"easeOutQuad",swing:function(e){return n.easing[n.easing.def](e)},easeInQuad:function(n){return n*n},easeOutQuad:function(n){return 1-(1-n)*(1-n)},easeInOutQuad:function(n){return n<.5?2*n*n:1-t(-2*n+2,2)/2},easeInCubic:function(n){return n*n*n},easeOutCubic:function(n){return 1-t(1-n,3)},easeInOutCubic:function(n){return n<.5?4*n*n*n:1-t(-2*n+2,3)/2},easeInQuart:function(n){return n*n*n*n},easeOutQuart:function(n){return 1-t(1-n,4)},easeInOutQuart:function(n){return n<.5?8*n*n*n*n:1-t(-2*n+2,4)/2},easeInQuint:function(n){return n*n*n*n*n},easeOutQuint:function(n){return 1-t(1-n,5)},easeInOutQuint:function(n){return n<.5?16*n*n*n*n*n:1-t(-2*n+2,5)/2},easeInSine:function(n){return 1-i(n*a/2)},easeOutSine:function(n){return r(n*a/2)},easeInOutSine:function(n){return-(i(a*n)-1)/2},easeInExpo:function(n){return 0===n?0:t(2,10*n-10)},easeOutExpo:function(n){return 1===n?1:1-t(2,-10*n)},easeInOutExpo:function(n){return 0===n?0:1===n?1:n<.5?t(2,20*n-10)/2:(2-t(2,-20*n+10))/2},easeInCirc:function(n){return 1-u(1-t(n,2))},easeOutCirc:function(n){return u(1-t(n-1,2))},easeInOutCirc:function(n){return n<.5?(1-u(1-t(2*n,2)))/2:(u(1-t(-2*n+2,2))+1)/2},easeInElastic:function(n){return 0===n?0:1===n?1:-t(2,10*n-10)*r((10*n-10.75)*s)},easeOutElastic:function(n){return 0===n?0:1===n?1:t(2,-10*n)*r((10*n-.75)*s)+1},easeInOutElastic:function(n){return 0===n?0:1===n?1:n<.5?-(t(2,20*n-10)*r((20*n-11.125)*f))/2:t(2,-20*n+10)*r((20*n-11.125)*f)/2+1},easeInBack:function(n){return(c+1)*n*n*n-c*n*n},easeOutBack:function(n){return 1+(c+1)*t(n-1,3)+c*t(n-1,2)},easeInOutBack:function(n){return n<.5?t(2*n,2)*(7.189819*n-o)/2:(t(2*n-2,2)*((o+1)*(2*n-2)+o)+2)/2},easeInBounce:function(n){return 1-e(1-n)},easeOutBounce:e,easeInOutBounce:function(n){return n<.5?(1-e(1-2*n))/2:(1+e(2*n-1))/2}})});
/**!
 * easy-pie-chart
 * Lightweight plugin to render simple, animated and retina optimized pie charts
 *
 * @license 
 * @author Robert Fleischmann <rendro87@gmail.com> (http://robert-fleischmann.de)
 * @version 2.1.7
 **/
!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement("canvas");a.appendChild(d),"object"==typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size;var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f>=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(a,b){},onStep:function(a,b,c){},onStop:function(a,b){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));"string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?e.easing=jQuery.easing[e.easing]:e.easing=d.easing,"number"==typeof e.animate&&(e.animate={duration:e.animate,enabled:!0}),"boolean"!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,"easyPieChart")||(d=a.extend({},b,a(this).data()),a.data(this,"easyPieChart",new c(this,d)))})}});
!function(e){function o(){e(window).load(s),e(window).on("redraw",function(){switched=!1,s()}),e(window).on("resize",s)}function s(){w.draw(),v.draw(),b.draw(),f.draw()}function r(e){return Math.PI/180*e-Math.PI/180*90}function t(){i={total:Math.floor((d.end-d.start)/86400),days:Math.floor((d.end-d.now)/86400),hours:24-Math.floor((d.end-d.now)%86400/3600),minutes:60-Math.floor((d.end-d.now)%86400%3600/60),seconds:60-Math.floor((d.end-d.now)%86400%3600%60)}}function n(){var o=e("#"+d.selectors.canvas_seconds).width(),s=new Kinetic.Stage({container:d.selectors.canvas_seconds,width:o,height:o});c=new Kinetic.Shape({drawFunc:function(o){var s=e("#"+d.selectors.canvas_seconds).width(),t=s/2-d.seconds.borderWidth/2,n=s/2,a=s/2;o.beginPath(),o.arc(n,a,t,r(0),r(6*i.seconds)),o.fillStrokeShape(this),e(d.selectors.value_seconds).html(60-i.seconds)},stroke:d.seconds.borderColor,strokeWidth:d.seconds.borderWidth}),w=new Kinetic.Layer,w.add(c),s.add(w);var t=e("#"+d.selectors.canvas_minutes).width(),n=new Kinetic.Stage({container:d.selectors.canvas_minutes,width:t,height:t});h=new Kinetic.Shape({drawFunc:function(o){var s=e("#"+d.selectors.canvas_minutes).width(),t=s/2-d.minutes.borderWidth/2,n=s/2,a=s/2;o.beginPath(),o.arc(n,a,t,r(0),r(6*i.minutes)),o.fillStrokeShape(this),e(d.selectors.value_minutes).html(60-i.minutes)},stroke:d.minutes.borderColor,strokeWidth:d.minutes.borderWidth}),v=new Kinetic.Layer,v.add(h),n.add(v);var a=e("#"+d.selectors.canvas_hours).width(),y=new Kinetic.Stage({container:d.selectors.canvas_hours,width:a,height:a});l=new Kinetic.Shape({drawFunc:function(o){var s=e("#"+d.selectors.canvas_hours).width(),t=s/2-d.hours.borderWidth/2,n=s/2,a=s/2;o.beginPath(),o.arc(n,a,t,r(0),r(360*i.hours/24)),o.fillStrokeShape(this),e(d.selectors.value_hours).html(24-i.hours)},stroke:d.hours.borderColor,strokeWidth:d.hours.borderWidth}),b=new Kinetic.Layer,b.add(l),y.add(b);var _=e("#"+d.selectors.canvas_days).width(),m=new Kinetic.Stage({container:d.selectors.canvas_days,width:_,height:_});u=new Kinetic.Shape({drawFunc:function(o){var s=e("#"+d.selectors.canvas_days).width(),t=s/2-d.days.borderWidth/2,n=s/2,a=s/2;o.beginPath(),0==i.total?o.arc(n,a,t,r(0),r(360)):o.arc(n,a,t,r(0),r(360/i.total*(i.total-i.days))),o.fillStrokeShape(this),e(d.selectors.value_days).html(i.days)},stroke:d.days.borderColor,strokeWidth:d.days.borderWidth}),f=new Kinetic.Layer,f.add(u),m.add(f)}function a(){var e=setInterval(function(){if(i.seconds>59){if(60-i.minutes==0&&24-i.hours==0&&0==i.days)return clearInterval(e),void(void 0!==_&&_.call(this));i.seconds=1,i.minutes>59?(i.minutes=1,v.draw(),i.hours>23?(i.hours=1,i.days>0&&(i.days--,f.draw())):i.hours++,b.draw()):i.minutes++,v.draw()}else i.seconds++;w.draw()},1e3)}var d,i,c,h,l,u,w,v,b,f,y,_;e.fn.final_countdown=function(s,r){if(y=e(this),y.is(":visible")){var i=e.extend({start:void 0,end:void 0,now:void 0,selectors:{value_seconds:".clock-seconds .val",canvas_seconds:"canvas-seconds",value_minutes:".clock-minutes .val",canvas_minutes:"canvas-minutes",value_hours:".clock-hours .val",canvas_hours:"canvas-hours",value_days:".clock-days .val",canvas_days:"canvas-days"},seconds:{borderColor:"#7995D5",borderWidth:"6"},minutes:{borderColor:"#ACC742",borderWidth:"6"},hours:{borderColor:"#ECEFCB",borderWidth:"6"},days:{borderColor:"#FF9900",borderWidth:"6"}},s);d=e.extend({},i,s),void 0===d.start&&(d.start=y.data("start")),void 0===d.end&&(d.end=y.data("end")),void 0===d.now&&(d.now=y.data("now")),y.data("border-color")&&(d.seconds.borderColor=d.minutes.borderColor=d.hours.borderColor=d.days.borderColor=y.data("border-color")),d.now<d.start&&(d.start=d.now,d.end=d.now),d.now>d.end&&(d.start=d.now,d.end=d.now),"function"==typeof r&&(_=r),o(),t(),n(),a()}}}(jQuery);
/*global jQuery */
/*!
* FitText.js 1.2
*
* Copyright 2011, Dave Rupert http://daverupert.com
* Released under the WTFPL license
* http://sam.zoy.org/wtfpl/
*
* Date: Thu May 05 14:23:00 2011 -0600
*/

(function( $ ){

  $.fn.fitText = function( kompressor, options ) {

    // Setup options
    var compressor = kompressor || 1,
        settings = $.extend({
          'minFontSize' : Number.NEGATIVE_INFINITY,
          'maxFontSize' : Number.POSITIVE_INFINITY
        }, options);

    return this.each(function(){

      // Store the object
      var $this = $(this);

      // Resizer() resizes items based on the object width divided by the compressor * 10
      var resizer = function () {
        $this.css('font-size', Math.max(Math.min($this.width() / (compressor*10), parseFloat(settings.maxFontSize)), parseFloat(settings.minFontSize)));
      };

      // Call once to set.
      resizer();

      // Call on resize. Opera debounces their resize by default.
      $(window).on('resize.fittext orientationchange.fittext', resizer);

    });

  };

})( jQuery );

/*jshint browser:true */
/*!
* FitVids 1.1
*
* Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
* Released under the WTFPL license - http://sam.zoy.org/wtfpl/
*
*/

;(function( $ ){

  'use strict';

  $.fn.fitVids = function( options ) {
    var settings = {
      customSelector: null,
      ignore: null
    };

    if(!document.getElementById('fit-vids-style')) {
      // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js
      var head = document.head || document.getElementsByTagName('head')[0];
      var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}';
      var div = document.createElement("div");
      div.innerHTML = '<p>x</p><style id="fit-vids-style">' + css + '</style>';
      head.appendChild(div.childNodes[1]);
    }

    if ( options ) {
      $.extend( settings, options );
    }

    return this.each(function(){
      var selectors = [
        'iframe[src*="player.vimeo.com"]',
        'iframe[src*="youtube.com"]',
        'iframe[src*="youtube-nocookie.com"]',
        'iframe[src*="kickstarter.com"][src*="video.html"]',
        'object',
        'embed'
      ];

      if (settings.customSelector) {
        selectors.push(settings.customSelector);
      }

      var ignoreList = '.fitvidsignore';

      if(settings.ignore) {
        ignoreList = ignoreList + ', ' + settings.ignore;
      }

      var $allVideos = $(this).find(selectors.join(','));
      $allVideos = $allVideos.not('object object'); // SwfObj conflict patch
      $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video.

      $allVideos.each(function(){
        var $this = $(this);
        if($this.parents(ignoreList).length > 0) {
          return; // Disable FitVids on this video.
        }
        if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
        if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width'))))
        {
          $this.attr('height', 9);
          $this.attr('width', 16);
        }
        var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),
            width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
            aspectRatio = height / width;
        if(!$this.attr('name')){
          var videoName = 'fitvid' + $.fn.fitVids._count;
          $this.attr('name', videoName);
          $.fn.fitVids._count++;
        }
        $this.wrap('<div class="fluid-width-video-wrapper"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%');
        $this.removeAttr('height').removeAttr('width');
      });
    });
  };
  
  // Internal counter for unique video names.
  $.fn.fitVids._count = 0;
  
// Works with either jQuery or Zepto
})( window.jQuery || window.Zepto );

/*!
 * jQuery Form Plugin
 * version: 4.2.2
 * Requires jQuery v1.7.2 or later
 * Project repository: https://github.com/jquery-form/form

 * Copyright 2017 Kevin Morris
 * Copyright 2006 M. Alsup

 * Dual licensed under the LGPL-2.1+ or MIT licenses
 * https://github.com/jquery-form/form#license

 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 */
!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,r){return void 0===r&&(r="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(r),r}:e(jQuery)}(function(e){"use strict";function t(t){var r=t.data;t.isDefaultPrevented()||(t.preventDefault(),e(t.target).closest("form").ajaxSubmit(r))}function r(t){var r=t.target,a=e(r);if(!a.is("[type=submit],[type=image]")){var n=a.closest("[type=submit]");if(0===n.length)return;r=n[0]}var i=r.form;if(i.clk=r,"image"===r.type)if(void 0!==t.offsetX)i.clk_x=t.offsetX,i.clk_y=t.offsetY;else if("function"==typeof e.fn.offset){var o=a.offset();i.clk_x=t.pageX-o.left,i.clk_y=t.pageY-o.top}else i.clk_x=t.pageX-r.offsetLeft,i.clk_y=t.pageY-r.offsetTop;setTimeout(function(){i.clk=i.clk_x=i.clk_y=null},100)}function a(){if(e.fn.ajaxSubmit.debug){var t="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(t):window.opera&&window.opera.postError&&window.opera.postError(t)}}var n=/\r?\n/g,i={};i.fileapi=void 0!==e('<input type="file">').get(0).files,i.formdata=void 0!==window.FormData;var o=!!e.fn.prop;e.fn.attr2=function(){if(!o)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t,r,n,s){function u(r){var a,n,i=e.param(r,t.traditional).split("&"),o=i.length,s=[];for(a=0;a<o;a++)i[a]=i[a].replace(/\+/g," "),n=i[a].split("="),s.push([decodeURIComponent(n[0]),decodeURIComponent(n[1])]);return s}function c(r){function n(e){var t=null;try{e.contentWindow&&(t=e.contentWindow.document)}catch(e){a("cannot get iframe.contentWindow document: "+e)}if(t)return t;try{t=e.contentDocument?e.contentDocument:e.document}catch(r){a("cannot get iframe.contentDocument: "+r),t=e.document}return t}function i(){function t(){try{var e=n(v).readyState;a("state = "+e),e&&"uninitialized"===e.toLowerCase()&&setTimeout(t,50)}catch(e){a("Server abort: ",e," (",e.name,")"),s(L),j&&clearTimeout(j),j=void 0}}var r=p.attr2("target"),i=p.attr2("action"),o=p.attr("enctype")||p.attr("encoding")||"multipart/form-data";w.setAttribute("target",m),l&&!/post/i.test(l)||w.setAttribute("method","POST"),i!==f.url&&w.setAttribute("action",f.url),f.skipEncodingOverride||l&&!/post/i.test(l)||p.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"}),f.timeout&&(j=setTimeout(function(){T=!0,s(A)},f.timeout));var u=[];try{if(f.extraData)for(var c in f.extraData)f.extraData.hasOwnProperty(c)&&(e.isPlainObject(f.extraData[c])&&f.extraData[c].hasOwnProperty("name")&&f.extraData[c].hasOwnProperty("value")?u.push(e('<input type="hidden" name="'+f.extraData[c].name+'">',k).val(f.extraData[c].value).appendTo(w)[0]):u.push(e('<input type="hidden" name="'+c+'">',k).val(f.extraData[c]).appendTo(w)[0]));f.iframeTarget||h.appendTo(D),v.attachEvent?v.attachEvent("onload",s):v.addEventListener("load",s,!1),setTimeout(t,15);try{w.submit()}catch(e){document.createElement("form").submit.apply(w)}}finally{w.setAttribute("action",i),w.setAttribute("enctype",o),r?w.setAttribute("target",r):p.removeAttr("target"),e(u).remove()}}function s(t){if(!x.aborted&&!X){if((O=n(v))||(a("cannot access response document"),t=L),t===A&&x)return x.abort("timeout"),void S.reject(x,"timeout");if(t===L&&x)return x.abort("server abort"),void S.reject(x,"error","server abort");if(O&&O.location.href!==f.iframeSrc||T){v.detachEvent?v.detachEvent("onload",s):v.removeEventListener("load",s,!1);var r,i="success";try{if(T)throw"timeout";var o="xml"===f.dataType||O.XMLDocument||e.isXMLDoc(O);if(a("isXml="+o),!o&&window.opera&&(null===O.body||!O.body.innerHTML)&&--C)return a("requeing onLoad callback, DOM not available"),void setTimeout(s,250);var u=O.body?O.body:O.documentElement;x.responseText=u?u.innerHTML:null,x.responseXML=O.XMLDocument?O.XMLDocument:O,o&&(f.dataType="xml"),x.getResponseHeader=function(e){return{"content-type":f.dataType}[e.toLowerCase()]},u&&(x.status=Number(u.getAttribute("status"))||x.status,x.statusText=u.getAttribute("statusText")||x.statusText);var c=(f.dataType||"").toLowerCase(),l=/(json|script|text)/.test(c);if(l||f.textarea){var p=O.getElementsByTagName("textarea")[0];if(p)x.responseText=p.value,x.status=Number(p.getAttribute("status"))||x.status,x.statusText=p.getAttribute("statusText")||x.statusText;else if(l){var m=O.getElementsByTagName("pre")[0],g=O.getElementsByTagName("body")[0];m?x.responseText=m.textContent?m.textContent:m.innerText:g&&(x.responseText=g.textContent?g.textContent:g.innerText)}}else"xml"===c&&!x.responseXML&&x.responseText&&(x.responseXML=q(x.responseText));try{M=N(x,c,f)}catch(e){i="parsererror",x.error=r=e||i}}catch(e){a("error caught: ",e),i="error",x.error=r=e||i}x.aborted&&(a("upload aborted"),i=null),x.status&&(i=x.status>=200&&x.status<300||304===x.status?"success":"error"),"success"===i?(f.success&&f.success.call(f.context,M,"success",x),S.resolve(x.responseText,"success",x),d&&e.event.trigger("ajaxSuccess",[x,f])):i&&(void 0===r&&(r=x.statusText),f.error&&f.error.call(f.context,x,i,r),S.reject(x,"error",r),d&&e.event.trigger("ajaxError",[x,f,r])),d&&e.event.trigger("ajaxComplete",[x,f]),d&&!--e.active&&e.event.trigger("ajaxStop"),f.complete&&f.complete.call(f.context,x,i),X=!0,f.timeout&&clearTimeout(j),setTimeout(function(){f.iframeTarget?h.attr("src",f.iframeSrc):h.remove(),x.responseXML=null},100)}}}var u,c,f,d,m,h,v,x,y,b,T,j,w=p[0],S=e.Deferred();if(S.abort=function(e){x.abort(e)},r)for(c=0;c<g.length;c++)u=e(g[c]),o?u.prop("disabled",!1):u.removeAttr("disabled");(f=e.extend(!0,{},e.ajaxSettings,t)).context=f.context||f,m="jqFormIO"+(new Date).getTime();var k=w.ownerDocument,D=p.closest("body");if(f.iframeTarget?(b=(h=e(f.iframeTarget,k)).attr2("name"))?m=b:h.attr2("name",m):(h=e('<iframe name="'+m+'" src="'+f.iframeSrc+'" />',k)).css({position:"absolute",top:"-1000px",left:"-1000px"}),v=h[0],x={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var r="timeout"===t?"timeout":"aborted";a("aborting upload... "+r),this.aborted=1;try{v.contentWindow.document.execCommand&&v.contentWindow.document.execCommand("Stop")}catch(e){}h.attr("src",f.iframeSrc),x.error=r,f.error&&f.error.call(f.context,x,r,t),d&&e.event.trigger("ajaxError",[x,f,r]),f.complete&&f.complete.call(f.context,x,r)}},(d=f.global)&&0==e.active++&&e.event.trigger("ajaxStart"),d&&e.event.trigger("ajaxSend",[x,f]),f.beforeSend&&!1===f.beforeSend.call(f.context,x,f))return f.global&&e.active--,S.reject(),S;if(x.aborted)return S.reject(),S;(y=w.clk)&&(b=y.name)&&!y.disabled&&(f.extraData=f.extraData||{},f.extraData[b]=y.value,"image"===y.type&&(f.extraData[b+".x"]=w.clk_x,f.extraData[b+".y"]=w.clk_y));var A=1,L=2,F=e("meta[name=csrf-token]").attr("content"),E=e("meta[name=csrf-param]").attr("content");E&&F&&(f.extraData=f.extraData||{},f.extraData[E]=F),f.forceSync?i():setTimeout(i,10);var M,O,X,C=50,q=e.parseXML||function(e,t){return window.ActiveXObject?((t=new ActiveXObject("Microsoft.XMLDOM")).async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!==t.documentElement.nodeName?t:null},_=e.parseJSON||function(e){return window.eval("("+e+")")},N=function(t,r,a){var n=t.getResponseHeader("content-type")||"",i=("xml"===r||!r)&&n.indexOf("xml")>=0,o=i?t.responseXML:t.responseText;return i&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),a&&a.dataFilter&&(o=a.dataFilter(o,r)),"string"==typeof o&&(("json"===r||!r)&&n.indexOf("json")>=0?o=_(o):("script"===r||!r)&&n.indexOf("javascript")>=0&&e.globalEval(o)),o};return S}if(!this.length)return a("ajaxSubmit: skipping submit process - no element selected"),this;var l,f,d,p=this;"function"==typeof t?t={success:t}:"string"==typeof t||!1===t&&arguments.length>0?(t={url:t,data:r,dataType:n},"function"==typeof s&&(t.success=s)):void 0===t&&(t={}),l=t.method||t.type||this.attr2("method"),(d=(d="string"==typeof(f=t.url||this.attr2("action"))?e.trim(f):"")||window.location.href||"")&&(d=(d.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:d,success:e.ajaxSettings.success,type:l||e.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var m={};if(this.trigger("form-pre-serialize",[this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&!1===t.beforeSerialize(this,t))return a("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var h=t.traditional;void 0===h&&(h=e.ajaxSettings.traditional);var v,g=[],x=this.formToArray(t.semantic,g,t.filtering);if(t.data){var y=e.isFunction(t.data)?t.data(x):t.data;t.extraData=y,v=e.param(y,h)}if(t.beforeSubmit&&!1===t.beforeSubmit(x,this,t))return a("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[x,this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var b=e.param(x,h);v&&(b=b?b+"&"+v:v),"GET"===t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+b,t.data=null):t.data=b;var T=[];if(t.resetForm&&T.push(function(){p.resetForm()}),t.clearForm&&T.push(function(){p.clearForm(t.includeHidden)}),!t.dataType&&t.target){var j=t.success||function(){};T.push(function(r,a,n){var i=arguments,o=t.replaceTarget?"replaceWith":"html";e(t.target)[o](r).each(function(){j.apply(this,i)})})}else t.success&&(e.isArray(t.success)?e.merge(T,t.success):T.push(t.success));if(t.success=function(e,r,a){for(var n=t.context||this,i=0,o=T.length;i<o;i++)T[i].apply(n,[e,r,a||p,p])},t.error){var w=t.error;t.error=function(e,r,a){var n=t.context||this;w.apply(n,[e,r,a,p])}}if(t.complete){var S=t.complete;t.complete=function(e,r){var a=t.context||this;S.apply(a,[e,r,p])}}var k=e("input[type=file]:enabled",this).filter(function(){return""!==e(this).val()}).length>0,D="multipart/form-data",A=p.attr("enctype")===D||p.attr("encoding")===D,L=i.fileapi&&i.formdata;a("fileAPI :"+L);var F,E=(k||A)&&!L;!1!==t.iframe&&(t.iframe||E)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){F=c(x)}):F=c(x):F=(k||A)&&L?function(r){for(var a=new FormData,n=0;n<r.length;n++)a.append(r[n].name,r[n].value);if(t.extraData){var i=u(t.extraData);for(n=0;n<i.length;n++)i[n]&&a.append(i[n][0],i[n][1])}t.data=null;var o=e.extend(!0,{},e.ajaxSettings,t,{contentType:!1,processData:!1,cache:!1,type:l||"POST"});t.uploadProgress&&(o.xhr=function(){var r=e.ajaxSettings.xhr();return r.upload&&r.upload.addEventListener("progress",function(e){var r=0,a=e.loaded||e.position,n=e.total;e.lengthComputable&&(r=Math.ceil(a/n*100)),t.uploadProgress(e,a,n,r)},!1),r}),o.data=null;var s=o.beforeSend;return o.beforeSend=function(e,r){t.formData?r.data=t.formData:r.data=a,s&&s.call(this,e,r)},e.ajax(o)}(x):e.ajax(t),p.removeData("jqxhr").data("jqxhr",F);for(var M=0;M<g.length;M++)g[M]=null;return this.trigger("form-submit-notify",[this,t]),this},e.fn.ajaxForm=function(n,i,o,s){if(("string"==typeof n||!1===n&&arguments.length>0)&&(n={url:n,data:i,dataType:o},"function"==typeof s&&(n.success=s)),n=n||{},n.delegation=n.delegation&&e.isFunction(e.fn.on),!n.delegation&&0===this.length){var u={s:this.selector,c:this.context};return!e.isReady&&u.s?(a("DOM not ready, queuing ajaxForm"),e(function(){e(u.s,u.c).ajaxForm(n)}),this):(a("terminating; zero elements found by selector"+(e.isReady?"":" (DOM not ready)")),this)}return n.delegation?(e(document).off("submit.form-plugin",this.selector,t).off("click.form-plugin",this.selector,r).on("submit.form-plugin",this.selector,n,t).on("click.form-plugin",this.selector,n,r),this):this.ajaxFormUnbind().on("submit.form-plugin",n,t).on("click.form-plugin",n,r)},e.fn.ajaxFormUnbind=function(){return this.off("submit.form-plugin click.form-plugin")},e.fn.formToArray=function(t,r,a){var n=[];if(0===this.length)return n;var o,s=this[0],u=this.attr("id"),c=t||void 0===s.elements?s.getElementsByTagName("*"):s.elements;if(c&&(c=e.makeArray(c)),u&&(t||/(Edge|Trident)\//.test(navigator.userAgent))&&(o=e(':input[form="'+u+'"]').get()).length&&(c=(c||[]).concat(o)),!c||!c.length)return n;e.isFunction(a)&&(c=e.map(c,a));var l,f,d,p,m,h,v;for(l=0,h=c.length;l<h;l++)if(m=c[l],(d=m.name)&&!m.disabled)if(t&&s.clk&&"image"===m.type)s.clk===m&&(n.push({name:d,value:e(m).val(),type:m.type}),n.push({name:d+".x",value:s.clk_x},{name:d+".y",value:s.clk_y}));else if((p=e.fieldValue(m,!0))&&p.constructor===Array)for(r&&r.push(m),f=0,v=p.length;f<v;f++)n.push({name:d,value:p[f]});else if(i.fileapi&&"file"===m.type){r&&r.push(m);var g=m.files;if(g.length)for(f=0;f<g.length;f++)n.push({name:d,value:g[f],type:m.type});else n.push({name:d,value:"",type:m.type})}else null!==p&&void 0!==p&&(r&&r.push(m),n.push({name:d,value:p,type:m.type,required:m.required}));if(!t&&s.clk){var x=e(s.clk),y=x[0];(d=y.name)&&!y.disabled&&"image"===y.type&&(n.push({name:d,value:x.val()}),n.push({name:d+".x",value:s.clk_x},{name:d+".y",value:s.clk_y}))}return n},e.fn.formSerialize=function(t){return e.param(this.formToArray(t))},e.fn.fieldSerialize=function(t){var r=[];return this.each(function(){var a=this.name;if(a){var n=e.fieldValue(this,t);if(n&&n.constructor===Array)for(var i=0,o=n.length;i<o;i++)r.push({name:a,value:n[i]});else null!==n&&void 0!==n&&r.push({name:this.name,value:n})}}),e.param(r)},e.fn.fieldValue=function(t){for(var r=[],a=0,n=this.length;a<n;a++){var i=this[a],o=e.fieldValue(i,t);null===o||void 0===o||o.constructor===Array&&!o.length||(o.constructor===Array?e.merge(r,o):r.push(o))}return r},e.fieldValue=function(t,r){var a=t.name,i=t.type,o=t.tagName.toLowerCase();if(void 0===r&&(r=!0),r&&(!a||t.disabled||"reset"===i||"button"===i||("checkbox"===i||"radio"===i)&&!t.checked||("submit"===i||"image"===i)&&t.form&&t.form.clk!==t||"select"===o&&-1===t.selectedIndex))return null;if("select"===o){var s=t.selectedIndex;if(s<0)return null;for(var u=[],c=t.options,l="select-one"===i,f=l?s+1:c.length,d=l?s:0;d<f;d++){var p=c[d];if(p.selected&&!p.disabled){var m=p.value;if(m||(m=p.attributes&&p.attributes.value&&!p.attributes.value.specified?p.text:p.value),l)return m;u.push(m)}}return u}return e(t).val().replace(n,"\r\n")},e.fn.clearForm=function(t){return this.each(function(){e("input,select,textarea",this).clearFields(t)})},e.fn.clearFields=e.fn.clearInputs=function(t){var r=/^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;return this.each(function(){var a=this.type,n=this.tagName.toLowerCase();r.test(a)||"textarea"===n?this.value="":"checkbox"===a||"radio"===a?this.checked=!1:"select"===n?this.selectedIndex=-1:"file"===a?/MSIE/.test(navigator.userAgent)?e(this).replaceWith(e(this).clone(!0)):e(this).val(""):t&&(!0===t&&/hidden/.test(a)||"string"==typeof t&&e(this).is(t))&&(this.value="")})},e.fn.resetForm=function(){return this.each(function(){var t=e(this),r=this.tagName.toLowerCase();switch(r){case"input":this.checked=this.defaultChecked;case"textarea":return this.value=this.defaultValue,!0;case"option":case"optgroup":var a=t.parents("select");return a.length&&a[0].multiple?"option"===r?this.selected=this.defaultSelected:t.find("option").resetForm():a.resetForm(),!0;case"select":return t.find("option").each(function(e){if(this.selected=this.defaultSelected,this.defaultSelected&&!t[0].multiple)return t[0].selectedIndex=e,!1}),!0;case"label":var n=e(t.attr("for")),i=t.find("input,select,textarea");return n[0]&&i.unshift(n[0]),i.resetForm(),!0;case"form":return("function"==typeof this.reset||"object"==typeof this.reset&&!this.reset.nodeType)&&this.reset(),!0;default:return t.find("form,input,label,select,textarea").resetForm(),!0}})},e.fn.enable=function(e){return void 0===e&&(e=!0),this.each(function(){this.disabled=!e})},e.fn.selected=function(t){return void 0===t&&(t=!0),this.each(function(){var r=this.type;if("checkbox"===r||"radio"===r)this.checked=t;else if("option"===this.tagName.toLowerCase()){var a=e(this).parent("select");t&&a[0]&&"select-one"===a[0].type&&a.find("option").selected(!1),this.selected=t}})},e.fn.ajaxSubmit.debug=!1});
//# sourceMappingURL=jquery.form.min.js.map

/**
 * Copyright (c) 2007-2015 Ariel Flesler - aflesler<a>gmail<d>com | http://flesler.blogspot.com
 * Licensed under MIT
 * @author Ariel Flesler
 * @version 1.4.0
 */
;(function(a){if(typeof define==='function'&&define.amd){define(['jquery'],a)}else{a(jQuery)}}(function($){var g=location.href.replace(/#.*/,'');var h=$.localScroll=function(a){$('body').localScroll(a)};h.defaults={duration:1000,axis:'y',event:'click',stop:true,target:window};$.fn.localScroll=function(a){a=$.extend({},h.defaults,a);if(a.hash&&location.hash){if(a.target)window.scrollTo(0,0);scroll(0,location,a)}return a.lazy?this.on(a.event,'a,area',function(e){if(filter.call(this)){scroll(e,this,a)}}):this.find('a,area').filter(filter).bind(a.event,function(e){scroll(e,this,a)}).end().end();function filter(){return!!this.href&&!!this.hash&&this.href.replace(this.hash,'')===g&&(!a.filter||$(this).is(a.filter))}};h.hash=function(){};function scroll(e,a,b){var c=a.hash.slice(1),elem=document.getElementById(c)||document.getElementsByName(c)[0];if(!elem)return;if(e)e.preventDefault();var d=$(b.target);if(b.lock&&d.is(':animated')||b.onBefore&&b.onBefore(e,elem,d)===false)return;if(b.stop){d.stop(true)}if(b.hash){var f=elem.id===c?'id':'name',$a=$('<a> </a>').attr(f,c).css({position:'absolute',top:$(window).scrollTop(),left:$(window).scrollLeft()});elem[f]='';$('body').prepend($a);location.hash=a.hash;$a.remove();elem[f]=c}d.scrollTo(elem,b).trigger('notify.serialScroll',[elem])}return h}));
/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)
 * Licensed under the MIT License (LICENSE.txt).
 *
 * Version: 3.1.12
 *
 * Requires: jQuery 1.2.2+
 */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})});
/*
Plugin: jQuery Parallax
Version 1.1.3
Author: Ian Lunn
Twitter: @IanLunn
Author URL: http://www.ianlunn.co.uk/
Plugin URL: http://www.ianlunn.co.uk/plugins/jquery-parallax/

Dual licensed under the MIT and GPL licenses:
http://www.opensource.org/licenses/mit-license.php
http://www.gnu.org/licenses/gpl.html
*/

(function( $ ){
	var $window = $(window);
	var windowHeight = $window.height();

	$window.resize(function () {
		windowHeight = $window.height();
	});

	$.fn.parallax = function(xpos, speedFactor, outerHeight) {
		var $this = $(this);
		var getHeight;
		var firstTop;
		var paddingTop = 0;
		
		//get the starting position of each element to have parallax applied to it		
		$this.each(function(){
		    firstTop = $this.offset().top;
		});

		if (outerHeight) {
			getHeight = function(jqo) {
				return jqo.outerHeight(true);
			};
		} else {
			getHeight = function(jqo) {
				return jqo.height();
			};
		}
			
		// setup defaults if arguments aren't specified
		if (arguments.length < 1 || xpos === null) xpos = "50%";
		if (arguments.length < 2 || speedFactor === null) speedFactor = 0.1;
		if (arguments.length < 3 || outerHeight === null) outerHeight = true;
		
		// function to be called whenever the window is scrolled or resized
		function update(){
			var pos = $window.scrollTop();				

			$this.each(function(){
				var $element = $(this);
				var top = $element.offset().top;
				var height = getHeight($element);

				// Check if totally above or totally below viewport
				if (top + height < pos || top > pos + windowHeight) {
					return;
				}

				$this.css('backgroundPosition', xpos + " " + Math.round((firstTop - pos) * speedFactor) + "px");
			});
		}		

		$window.bind('scroll', update).resize(update);
		update();
	};
})(jQuery);

/**
 * Copyright (c) 2007-2015 Ariel Flesler - aflesler<a>gmail<d>com | http://flesler.blogspot.com
 * Licensed under MIT
 * @author Ariel Flesler
 * @version 2.1.2
 */
;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1<b.axis.length;u&&(d/=2);b.offset=h(b.offset);b.over=h(b.over);return this.each(function(){function k(a){var k=$.extend({},b,{queue:!0,duration:d,complete:a&&function(){a.call(q,e,b)}});r.animate(f,k)}if(null!==a){var l=n(this),q=l?this.contentWindow||window:this,r=$(q),e=a,f={},t;switch(typeof e){case "number":case "string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(e)){e= h(e);break}e=l?$(e):$(e,q);case "object":if(e.length===0)return;if(e.is||e.style)t=(e=$(e)).offset()}var v=$.isFunction(b.offset)&&b.offset(q,e)||b.offset;$.each(b.axis.split(""),function(a,c){var d="x"===c?"Left":"Top",m=d.toLowerCase(),g="scroll"+d,h=r[g](),n=p.max(q,c);t?(f[g]=t[m]+(l?0:h-r.offset()[m]),b.margin&&(f[g]-=parseInt(e.css("margin"+d),10)||0,f[g]-=parseInt(e.css("border"+d+"Width"),10)||0),f[g]+=v[m]||0,b.over[m]&&(f[g]+=e["x"===c?"width":"height"]()*b.over[m])):(d=e[m],f[g]=d.slice&& "%"===d.slice(-1)?parseFloat(d)/100*n:d);b.limit&&/^\d+$/.test(f[g])&&(f[g]=0>=f[g]?0:Math.min(f[g],n));!a&&1<b.axis.length&&(h===f[g]?f={}:u&&(k(b.onAfterFirst),f={}))});k(b.onAfter)}})};p.max=function(a,d){var b="x"===d?"Width":"Height",h="scroll"+b;if(!n(a))return a[h]-$(a)[b.toLowerCase()]();var b="client"+b,k=a.ownerDocument||a.document,l=k.documentElement,k=k.body;return Math.max(l[h],k[h])-Math.min(l[b],k[b])};$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(a){return $(a.elem)[a.prop]()}, set:function(a){var d=this.get(a);if(a.options.interrupt&&a._last&&a._last!==d)return $(a.elem).stop();var b=Math.round(a.now);d!==b&&($(a.elem)[a.prop](b),a._last=this.get(a))}};return p});
// Sticky Plugin v1.0.4 for jQuery
// =============
// Author: Anthony Garand
// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk)
// Improvements by Leonardo C. Daronco (daronco)
// Created: 02/14/2011
// Date: 07/20/2015
// Website: http://stickyjs.com/
// Description: Makes an element on the page stick on the screen as you scroll
//              It will only set the 'top' and 'position' of your element, you
//              might need to adjust the width in some cases.

(function (factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['jquery'], factory);
    } else if (typeof module === 'object' && module.exports) {
        // Node/CommonJS
        module.exports = factory(require('jquery'));
    } else {
        // Browser globals
        factory(jQuery);
    }
}(function ($) {
    var slice = Array.prototype.slice; // save ref to original slice()
    var splice = Array.prototype.splice; // save ref to original slice()

  var defaults = {
      topSpacing: 0,
      bottomSpacing: 0,
      className: 'is-sticky',
      wrapperClassName: 'sticky-wrapper',
      center: false,
      getWidthFrom: '',
      widthFromWrapper: true, // works only when .getWidthFrom is empty
      responsiveWidth: false,
      zIndex: 'inherit'
    },
    $window = $(window),
    $document = $(document),
    sticked = [],
    windowHeight = $window.height(),
    scroller = function() {
      var scrollTop = $window.scrollTop(),
        documentHeight = $document.height(),
        dwh = documentHeight - windowHeight,
        extra = (scrollTop > dwh) ? dwh - scrollTop : 0;

      for (var i = 0, l = sticked.length; i < l; i++) {
        var s = sticked[i],
          elementTop = s.stickyWrapper.offset().top,
          etse = elementTop - s.topSpacing - extra;

        //update height in case of dynamic content
        s.stickyWrapper.css('height', s.stickyElement.outerHeight());

        if (scrollTop <= etse) {
          if (s.currentTop !== null) {
            s.stickyElement
              .css({
                'width': '',
                'position': '',
                'top': '',
                'z-index': ''
              });
            s.stickyElement.parent().removeClass(s.className);
            s.stickyElement.trigger('sticky-end', [s]);
            s.currentTop = null;
          }
        }
        else {
          var newTop = documentHeight - s.stickyElement.outerHeight()
            - s.topSpacing - s.bottomSpacing - scrollTop - extra;
          if (newTop < 0) {
            newTop = newTop + s.topSpacing;
          } else {
            newTop = s.topSpacing;
          }
          if (s.currentTop !== newTop) {
            var newWidth;
            if (s.getWidthFrom) {
                padding =  s.stickyElement.innerWidth() - s.stickyElement.width();
                newWidth = $(s.getWidthFrom).width() - padding || null;
            } else if (s.widthFromWrapper) {
                newWidth = s.stickyWrapper.width();
            }
            if (newWidth == null) {
                newWidth = s.stickyElement.width();
            }
            s.stickyElement
              .css('width', newWidth)
              .css('position', 'fixed')
              .css('top', newTop)
              .css('z-index', s.zIndex);

            s.stickyElement.parent().addClass(s.className);

            if (s.currentTop === null) {
              s.stickyElement.trigger('sticky-start', [s]);
            } else {
              // sticky is started but it have to be repositioned
              s.stickyElement.trigger('sticky-update', [s]);
            }

            if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) {
              // just reached bottom || just started to stick but bottom is already reached
              s.stickyElement.trigger('sticky-bottom-reached', [s]);
            } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) {
              // sticky is started && sticked at topSpacing && overflowing from top just finished
              s.stickyElement.trigger('sticky-bottom-unreached', [s]);
            }

            s.currentTop = newTop;
          }

          // Check if sticky has reached end of container and stop sticking
          var stickyWrapperContainer = s.stickyWrapper.parent();
          var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing);

          if( unstick ) {
            s.stickyElement
              .css('position', 'absolute')
              .css('top', '')
              .css('bottom', 0)
              .css('z-index', '');
          } else {
            s.stickyElement
              .css('position', 'fixed')
              .css('top', newTop)
              .css('bottom', '')
              .css('z-index', s.zIndex);
          }
        }
      }
    },
    resizer = function() {
      windowHeight = $window.height();

      for (var i = 0, l = sticked.length; i < l; i++) {
        var s = sticked[i];
        var newWidth = null;
        if (s.getWidthFrom) {
            if (s.responsiveWidth) {
                newWidth = $(s.getWidthFrom).width();
            }
        } else if(s.widthFromWrapper) {
            newWidth = s.stickyWrapper.width();
        }
        if (newWidth != null) {
            s.stickyElement.css('width', newWidth);
        }
      }
    },
    methods = {
      init: function(options) {
        return this.each(function() {
          var o = $.extend({}, defaults, options);
          var stickyElement = $(this);

          var stickyId = stickyElement.attr('id');
          var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName;
          var wrapper = $('<div></div>')
            .attr('id', wrapperId)
            .addClass(o.wrapperClassName);

          stickyElement.wrapAll(function() {
            if ($(this).parent("#" + wrapperId).length == 0) {
                    return wrapper;
            }
});

          var stickyWrapper = stickyElement.parent();

          if (o.center) {
            stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"});
          }

          if (stickyElement.css("float") === "right") {
            stickyElement.css({"float":"none"}).parent().css({"float":"right"});
          }

          o.stickyElement = stickyElement;
          o.stickyWrapper = stickyWrapper;
          o.currentTop    = null;

          sticked.push(o);

          methods.setWrapperHeight(this);
          methods.setupChangeListeners(this);
        });
      },

      setWrapperHeight: function(stickyElement) {
        var element = $(stickyElement);
        var stickyWrapper = element.parent();
        if (stickyWrapper) {
          stickyWrapper.css('height', element.outerHeight());
        }
      },

      setupChangeListeners: function(stickyElement) {
        if (window.MutationObserver) {
          var mutationObserver = new window.MutationObserver(function(mutations) {
            if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
              methods.setWrapperHeight(stickyElement);
            }
          });
          mutationObserver.observe(stickyElement, {subtree: true, childList: true});
        } else {
          if (window.addEventListener) {
            stickyElement.addEventListener('DOMNodeInserted', function() {
              methods.setWrapperHeight(stickyElement);
            }, false);
            stickyElement.addEventListener('DOMNodeRemoved', function() {
              methods.setWrapperHeight(stickyElement);
            }, false);
          } else if (window.attachEvent) {
            stickyElement.attachEvent('onDOMNodeInserted', function() {
              methods.setWrapperHeight(stickyElement);
            });
            stickyElement.attachEvent('onDOMNodeRemoved', function() {
              methods.setWrapperHeight(stickyElement);
            });
          }
        }
      },
      update: scroller,
      unstick: function(options) {
        return this.each(function() {
          var that = this;
          var unstickyElement = $(that);

          var removeIdx = -1;
          var i = sticked.length;
          while (i-- > 0) {
            if (sticked[i].stickyElement.get(0) === that) {
                splice.call(sticked,i,1);
                removeIdx = i;
            }
          }
          if(removeIdx !== -1) {
            unstickyElement.unwrap();
            unstickyElement
              .css({
                'width': '',
                'position': '',
                'top': '',
                'float': '',
                'z-index': ''
              })
            ;
          }
        });
      }
    };

  // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
  if (window.addEventListener) {
    window.addEventListener('scroll', scroller, false);
    window.addEventListener('resize', resizer, false);
  } else if (window.attachEvent) {
    window.attachEvent('onscroll', scroller);
    window.attachEvent('onresize', resizer);
  }

  $.fn.sticky = function(method) {
    if (methods[method]) {
      return methods[method].apply(this, slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error('Method ' + method + ' does not exist on jQuery.sticky');
    }
  };

  $.fn.unstick = function(method) {
    if (methods[method]) {
      return methods[method].apply(this, slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method ) {
      return methods.unstick.apply( this, arguments );
    } else {
      $.error('Method ' + method + ' does not exist on jQuery.sticky');
    }
  };
  $(function() {
    setTimeout(scroller, 0);
  });
}));

/*!
 * @fileOverview TouchSwipe - jQuery Plugin
 * @version 1.6.18
 *
 * @author Matt Bryson http://www.github.com/mattbryson
 * @see https://github.com/mattbryson/TouchSwipe-Jquery-Plugin
 * @see http://labs.rampinteractive.co.uk/touchSwipe/
 * @see http://plugins.jquery.com/project/touchSwipe
 * @license
 * Copyright (c) 2010-2015 Matt Bryson
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 */
!function(factory){"function"==typeof define&&define.amd&&define.amd.jQuery?define(["jquery"],factory):factory("undefined"!=typeof module&&module.exports?require("jquery"):jQuery)}(function($){"use strict";function init(options){return!options||void 0!==options.allowPageScroll||void 0===options.swipe&&void 0===options.swipeStatus||(options.allowPageScroll=NONE),void 0!==options.click&&void 0===options.tap&&(options.tap=options.click),options||(options={}),options=$.extend({},$.fn.swipe.defaults,options),this.each(function(){var $this=$(this),plugin=$this.data(PLUGIN_NS);plugin||(plugin=new TouchSwipe(this,options),$this.data(PLUGIN_NS,plugin))})}function TouchSwipe(element,options){function touchStart(jqEvent){if(!(getTouchInProgress()||$(jqEvent.target).closest(options.excludedElements,$element).length>0)){var event=jqEvent.originalEvent?jqEvent.originalEvent:jqEvent;if(!event.pointerType||"mouse"!=event.pointerType||0!=options.fallbackToMouseEvents){var ret,touches=event.touches,evt=touches?touches[0]:event;return phase=PHASE_START,touches?fingerCount=touches.length:options.preventDefaultEvents!==!1&&jqEvent.preventDefault(),distance=0,direction=null,currentDirection=null,pinchDirection=null,duration=0,startTouchesDistance=0,endTouchesDistance=0,pinchZoom=1,pinchDistance=0,maximumsMap=createMaximumsData(),cancelMultiFingerRelease(),createFingerData(0,evt),!touches||fingerCount===options.fingers||options.fingers===ALL_FINGERS||hasPinches()?(startTime=getTimeStamp(),2==fingerCount&&(createFingerData(1,touches[1]),startTouchesDistance=endTouchesDistance=calculateTouchesDistance(fingerData[0].start,fingerData[1].start)),(options.swipeStatus||options.pinchStatus)&&(ret=triggerHandler(event,phase))):ret=!1,ret===!1?(phase=PHASE_CANCEL,triggerHandler(event,phase),ret):(options.hold&&(holdTimeout=setTimeout($.proxy(function(){$element.trigger("hold",[event.target]),options.hold&&(ret=options.hold.call($element,event,event.target))},this),options.longTapThreshold)),setTouchInProgress(!0),null)}}}function touchMove(jqEvent){var event=jqEvent.originalEvent?jqEvent.originalEvent:jqEvent;if(phase!==PHASE_END&&phase!==PHASE_CANCEL&&!inMultiFingerRelease()){var ret,touches=event.touches,evt=touches?touches[0]:event,currentFinger=updateFingerData(evt);if(endTime=getTimeStamp(),touches&&(fingerCount=touches.length),options.hold&&clearTimeout(holdTimeout),phase=PHASE_MOVE,2==fingerCount&&(0==startTouchesDistance?(createFingerData(1,touches[1]),startTouchesDistance=endTouchesDistance=calculateTouchesDistance(fingerData[0].start,fingerData[1].start)):(updateFingerData(touches[1]),endTouchesDistance=calculateTouchesDistance(fingerData[0].end,fingerData[1].end),pinchDirection=calculatePinchDirection(fingerData[0].end,fingerData[1].end)),pinchZoom=calculatePinchZoom(startTouchesDistance,endTouchesDistance),pinchDistance=Math.abs(startTouchesDistance-endTouchesDistance)),fingerCount===options.fingers||options.fingers===ALL_FINGERS||!touches||hasPinches()){if(direction=calculateDirection(currentFinger.start,currentFinger.end),currentDirection=calculateDirection(currentFinger.last,currentFinger.end),validateDefaultEvent(jqEvent,currentDirection),distance=calculateDistance(currentFinger.start,currentFinger.end),duration=calculateDuration(),setMaxDistance(direction,distance),ret=triggerHandler(event,phase),!options.triggerOnTouchEnd||options.triggerOnTouchLeave){var inBounds=!0;if(options.triggerOnTouchLeave){var bounds=getbounds(this);inBounds=isInBounds(currentFinger.end,bounds)}!options.triggerOnTouchEnd&&inBounds?phase=getNextPhase(PHASE_MOVE):options.triggerOnTouchLeave&&!inBounds&&(phase=getNextPhase(PHASE_END)),phase!=PHASE_CANCEL&&phase!=PHASE_END||triggerHandler(event,phase)}}else phase=PHASE_CANCEL,triggerHandler(event,phase);ret===!1&&(phase=PHASE_CANCEL,triggerHandler(event,phase))}}function touchEnd(jqEvent){var event=jqEvent.originalEvent?jqEvent.originalEvent:jqEvent,touches=event.touches;if(touches){if(touches.length&&!inMultiFingerRelease())return startMultiFingerRelease(event),!0;if(touches.length&&inMultiFingerRelease())return!0}return inMultiFingerRelease()&&(fingerCount=fingerCountAtRelease),endTime=getTimeStamp(),duration=calculateDuration(),didSwipeBackToCancel()||!validateSwipeDistance()?(phase=PHASE_CANCEL,triggerHandler(event,phase)):options.triggerOnTouchEnd||options.triggerOnTouchEnd===!1&&phase===PHASE_MOVE?(options.preventDefaultEvents!==!1&&jqEvent.cancelable!==!1&&jqEvent.preventDefault(),phase=PHASE_END,triggerHandler(event,phase)):!options.triggerOnTouchEnd&&hasTap()?(phase=PHASE_END,triggerHandlerForGesture(event,phase,TAP)):phase===PHASE_MOVE&&(phase=PHASE_CANCEL,triggerHandler(event,phase)),setTouchInProgress(!1),null}function touchCancel(){fingerCount=0,endTime=0,startTime=0,startTouchesDistance=0,endTouchesDistance=0,pinchZoom=1,cancelMultiFingerRelease(),setTouchInProgress(!1)}function touchLeave(jqEvent){var event=jqEvent.originalEvent?jqEvent.originalEvent:jqEvent;options.triggerOnTouchLeave&&(phase=getNextPhase(PHASE_END),triggerHandler(event,phase))}function removeListeners(){$element.unbind(START_EV,touchStart),$element.unbind(CANCEL_EV,touchCancel),$element.unbind(MOVE_EV,touchMove),$element.unbind(END_EV,touchEnd),LEAVE_EV&&$element.unbind(LEAVE_EV,touchLeave),setTouchInProgress(!1)}function getNextPhase(currentPhase){var nextPhase=currentPhase,validTime=validateSwipeTime(),validDistance=validateSwipeDistance(),didCancel=didSwipeBackToCancel();return!validTime||didCancel?nextPhase=PHASE_CANCEL:!validDistance||currentPhase!=PHASE_MOVE||options.triggerOnTouchEnd&&!options.triggerOnTouchLeave?!validDistance&&currentPhase==PHASE_END&&options.triggerOnTouchLeave&&(nextPhase=PHASE_CANCEL):nextPhase=PHASE_END,nextPhase}function triggerHandler(event,phase){var ret,touches=event.touches;return(didSwipe()||hasSwipes())&&(ret=triggerHandlerForGesture(event,phase,SWIPE)),(didPinch()||hasPinches())&&ret!==!1&&(ret=triggerHandlerForGesture(event,phase,PINCH)),didDoubleTap()&&ret!==!1?ret=triggerHandlerForGesture(event,phase,DOUBLE_TAP):didLongTap()&&ret!==!1?ret=triggerHandlerForGesture(event,phase,LONG_TAP):didTap()&&ret!==!1&&(ret=triggerHandlerForGesture(event,phase,TAP)),phase===PHASE_CANCEL&&touchCancel(event),phase===PHASE_END&&(touches?touches.length||touchCancel(event):touchCancel(event)),ret}function triggerHandlerForGesture(event,phase,gesture){var ret;if(gesture==SWIPE){if($element.trigger("swipeStatus",[phase,direction||null,distance||0,duration||0,fingerCount,fingerData,currentDirection]),options.swipeStatus&&(ret=options.swipeStatus.call($element,event,phase,direction||null,distance||0,duration||0,fingerCount,fingerData,currentDirection),ret===!1))return!1;if(phase==PHASE_END&&validateSwipe()){if(clearTimeout(singleTapTimeout),clearTimeout(holdTimeout),$element.trigger("swipe",[direction,distance,duration,fingerCount,fingerData,currentDirection]),options.swipe&&(ret=options.swipe.call($element,event,direction,distance,duration,fingerCount,fingerData,currentDirection),ret===!1))return!1;switch(direction){case LEFT:$element.trigger("swipeLeft",[direction,distance,duration,fingerCount,fingerData,currentDirection]),options.swipeLeft&&(ret=options.swipeLeft.call($element,event,direction,distance,duration,fingerCount,fingerData,currentDirection));break;case RIGHT:$element.trigger("swipeRight",[direction,distance,duration,fingerCount,fingerData,currentDirection]),options.swipeRight&&(ret=options.swipeRight.call($element,event,direction,distance,duration,fingerCount,fingerData,currentDirection));break;case UP:$element.trigger("swipeUp",[direction,distance,duration,fingerCount,fingerData,currentDirection]),options.swipeUp&&(ret=options.swipeUp.call($element,event,direction,distance,duration,fingerCount,fingerData,currentDirection));break;case DOWN:$element.trigger("swipeDown",[direction,distance,duration,fingerCount,fingerData,currentDirection]),options.swipeDown&&(ret=options.swipeDown.call($element,event,direction,distance,duration,fingerCount,fingerData,currentDirection))}}}if(gesture==PINCH){if($element.trigger("pinchStatus",[phase,pinchDirection||null,pinchDistance||0,duration||0,fingerCount,pinchZoom,fingerData]),options.pinchStatus&&(ret=options.pinchStatus.call($element,event,phase,pinchDirection||null,pinchDistance||0,duration||0,fingerCount,pinchZoom,fingerData),ret===!1))return!1;if(phase==PHASE_END&&validatePinch())switch(pinchDirection){case IN:$element.trigger("pinchIn",[pinchDirection||null,pinchDistance||0,duration||0,fingerCount,pinchZoom,fingerData]),options.pinchIn&&(ret=options.pinchIn.call($element,event,pinchDirection||null,pinchDistance||0,duration||0,fingerCount,pinchZoom,fingerData));break;case OUT:$element.trigger("pinchOut",[pinchDirection||null,pinchDistance||0,duration||0,fingerCount,pinchZoom,fingerData]),options.pinchOut&&(ret=options.pinchOut.call($element,event,pinchDirection||null,pinchDistance||0,duration||0,fingerCount,pinchZoom,fingerData))}}return gesture==TAP?phase!==PHASE_CANCEL&&phase!==PHASE_END||(clearTimeout(singleTapTimeout),clearTimeout(holdTimeout),hasDoubleTap()&&!inDoubleTap()?(doubleTapStartTime=getTimeStamp(),singleTapTimeout=setTimeout($.proxy(function(){doubleTapStartTime=null,$element.trigger("tap",[event.target]),options.tap&&(ret=options.tap.call($element,event,event.target))},this),options.doubleTapThreshold)):(doubleTapStartTime=null,$element.trigger("tap",[event.target]),options.tap&&(ret=options.tap.call($element,event,event.target)))):gesture==DOUBLE_TAP?phase!==PHASE_CANCEL&&phase!==PHASE_END||(clearTimeout(singleTapTimeout),clearTimeout(holdTimeout),doubleTapStartTime=null,$element.trigger("doubletap",[event.target]),options.doubleTap&&(ret=options.doubleTap.call($element,event,event.target))):gesture==LONG_TAP&&(phase!==PHASE_CANCEL&&phase!==PHASE_END||(clearTimeout(singleTapTimeout),doubleTapStartTime=null,$element.trigger("longtap",[event.target]),options.longTap&&(ret=options.longTap.call($element,event,event.target)))),ret}function validateSwipeDistance(){var valid=!0;return null!==options.threshold&&(valid=distance>=options.threshold),valid}function didSwipeBackToCancel(){var cancelled=!1;return null!==options.cancelThreshold&&null!==direction&&(cancelled=getMaxDistance(direction)-distance>=options.cancelThreshold),cancelled}function validatePinchDistance(){return null===options.pinchThreshold||pinchDistance>=options.pinchThreshold}function validateSwipeTime(){var result;return result=!options.maxTimeThreshold||!(duration>=options.maxTimeThreshold)}function validateDefaultEvent(jqEvent,direction){if(options.preventDefaultEvents!==!1)if(options.allowPageScroll===NONE)jqEvent.preventDefault();else{var auto=options.allowPageScroll===AUTO;switch(direction){case LEFT:(options.swipeLeft&&auto||!auto&&options.allowPageScroll!=HORIZONTAL)&&jqEvent.preventDefault();break;case RIGHT:(options.swipeRight&&auto||!auto&&options.allowPageScroll!=HORIZONTAL)&&jqEvent.preventDefault();break;case UP:(options.swipeUp&&auto||!auto&&options.allowPageScroll!=VERTICAL)&&jqEvent.preventDefault();break;case DOWN:(options.swipeDown&&auto||!auto&&options.allowPageScroll!=VERTICAL)&&jqEvent.preventDefault();break;case NONE:}}}function validatePinch(){var hasCorrectFingerCount=validateFingers(),hasEndPoint=validateEndPoint(),hasCorrectDistance=validatePinchDistance();return hasCorrectFingerCount&&hasEndPoint&&hasCorrectDistance}function hasPinches(){return!!(options.pinchStatus||options.pinchIn||options.pinchOut)}function didPinch(){return!(!validatePinch()||!hasPinches())}function validateSwipe(){var hasValidTime=validateSwipeTime(),hasValidDistance=validateSwipeDistance(),hasCorrectFingerCount=validateFingers(),hasEndPoint=validateEndPoint(),didCancel=didSwipeBackToCancel(),valid=!didCancel&&hasEndPoint&&hasCorrectFingerCount&&hasValidDistance&&hasValidTime;return valid}function hasSwipes(){return!!(options.swipe||options.swipeStatus||options.swipeLeft||options.swipeRight||options.swipeUp||options.swipeDown)}function didSwipe(){return!(!validateSwipe()||!hasSwipes())}function validateFingers(){return fingerCount===options.fingers||options.fingers===ALL_FINGERS||!SUPPORTS_TOUCH}function validateEndPoint(){return 0!==fingerData[0].end.x}function hasTap(){return!!options.tap}function hasDoubleTap(){return!!options.doubleTap}function hasLongTap(){return!!options.longTap}function validateDoubleTap(){if(null==doubleTapStartTime)return!1;var now=getTimeStamp();return hasDoubleTap()&&now-doubleTapStartTime<=options.doubleTapThreshold}function inDoubleTap(){return validateDoubleTap()}function validateTap(){return(1===fingerCount||!SUPPORTS_TOUCH)&&(isNaN(distance)||distance<options.threshold)}function validateLongTap(){return duration>options.longTapThreshold&&distance<DOUBLE_TAP_THRESHOLD}function didTap(){return!(!validateTap()||!hasTap())}function didDoubleTap(){return!(!validateDoubleTap()||!hasDoubleTap())}function didLongTap(){return!(!validateLongTap()||!hasLongTap())}function startMultiFingerRelease(event){previousTouchEndTime=getTimeStamp(),fingerCountAtRelease=event.touches.length+1}function cancelMultiFingerRelease(){previousTouchEndTime=0,fingerCountAtRelease=0}function inMultiFingerRelease(){var withinThreshold=!1;if(previousTouchEndTime){var diff=getTimeStamp()-previousTouchEndTime;diff<=options.fingerReleaseThreshold&&(withinThreshold=!0)}return withinThreshold}function getTouchInProgress(){return!($element.data(PLUGIN_NS+"_intouch")!==!0)}function setTouchInProgress(val){$element&&(val===!0?($element.bind(MOVE_EV,touchMove),$element.bind(END_EV,touchEnd),LEAVE_EV&&$element.bind(LEAVE_EV,touchLeave)):($element.unbind(MOVE_EV,touchMove,!1),$element.unbind(END_EV,touchEnd,!1),LEAVE_EV&&$element.unbind(LEAVE_EV,touchLeave,!1)),$element.data(PLUGIN_NS+"_intouch",val===!0))}function createFingerData(id,evt){var f={start:{x:0,y:0},last:{x:0,y:0},end:{x:0,y:0}};return f.start.x=f.last.x=f.end.x=evt.pageX||evt.clientX,f.start.y=f.last.y=f.end.y=evt.pageY||evt.clientY,fingerData[id]=f,f}function updateFingerData(evt){var id=void 0!==evt.identifier?evt.identifier:0,f=getFingerData(id);return null===f&&(f=createFingerData(id,evt)),f.last.x=f.end.x,f.last.y=f.end.y,f.end.x=evt.pageX||evt.clientX,f.end.y=evt.pageY||evt.clientY,f}function getFingerData(id){return fingerData[id]||null}function setMaxDistance(direction,distance){direction!=NONE&&(distance=Math.max(distance,getMaxDistance(direction)),maximumsMap[direction].distance=distance)}function getMaxDistance(direction){if(maximumsMap[direction])return maximumsMap[direction].distance}function createMaximumsData(){var maxData={};return maxData[LEFT]=createMaximumVO(LEFT),maxData[RIGHT]=createMaximumVO(RIGHT),maxData[UP]=createMaximumVO(UP),maxData[DOWN]=createMaximumVO(DOWN),maxData}function createMaximumVO(dir){return{direction:dir,distance:0}}function calculateDuration(){return endTime-startTime}function calculateTouchesDistance(startPoint,endPoint){var diffX=Math.abs(startPoint.x-endPoint.x),diffY=Math.abs(startPoint.y-endPoint.y);return Math.round(Math.sqrt(diffX*diffX+diffY*diffY))}function calculatePinchZoom(startDistance,endDistance){var percent=endDistance/startDistance*1;return percent.toFixed(2)}function calculatePinchDirection(){return pinchZoom<1?OUT:IN}function calculateDistance(startPoint,endPoint){return Math.round(Math.sqrt(Math.pow(endPoint.x-startPoint.x,2)+Math.pow(endPoint.y-startPoint.y,2)))}function calculateAngle(startPoint,endPoint){var x=startPoint.x-endPoint.x,y=endPoint.y-startPoint.y,r=Math.atan2(y,x),angle=Math.round(180*r/Math.PI);return angle<0&&(angle=360-Math.abs(angle)),angle}function calculateDirection(startPoint,endPoint){if(comparePoints(startPoint,endPoint))return NONE;var angle=calculateAngle(startPoint,endPoint);return angle<=45&&angle>=0?LEFT:angle<=360&&angle>=315?LEFT:angle>=135&&angle<=225?RIGHT:angle>45&&angle<135?DOWN:UP}function getTimeStamp(){var now=new Date;return now.getTime()}function getbounds(el){el=$(el);var offset=el.offset(),bounds={left:offset.left,right:offset.left+el.outerWidth(),top:offset.top,bottom:offset.top+el.outerHeight()};return bounds}function isInBounds(point,bounds){return point.x>bounds.left&&point.x<bounds.right&&point.y>bounds.top&&point.y<bounds.bottom}function comparePoints(pointA,pointB){return pointA.x==pointB.x&&pointA.y==pointB.y}var options=$.extend({},options),useTouchEvents=SUPPORTS_TOUCH||SUPPORTS_POINTER||!options.fallbackToMouseEvents,START_EV=useTouchEvents?SUPPORTS_POINTER?SUPPORTS_POINTER_IE10?"MSPointerDown":"pointerdown":"touchstart":"mousedown",MOVE_EV=useTouchEvents?SUPPORTS_POINTER?SUPPORTS_POINTER_IE10?"MSPointerMove":"pointermove":"touchmove":"mousemove",END_EV=useTouchEvents?SUPPORTS_POINTER?SUPPORTS_POINTER_IE10?"MSPointerUp":"pointerup":"touchend":"mouseup",LEAVE_EV=useTouchEvents?SUPPORTS_POINTER?"mouseleave":null:"mouseleave",CANCEL_EV=SUPPORTS_POINTER?SUPPORTS_POINTER_IE10?"MSPointerCancel":"pointercancel":"touchcancel",distance=0,direction=null,currentDirection=null,duration=0,startTouchesDistance=0,endTouchesDistance=0,pinchZoom=1,pinchDistance=0,pinchDirection=0,maximumsMap=null,$element=$(element),phase="start",fingerCount=0,fingerData={},startTime=0,endTime=0,previousTouchEndTime=0,fingerCountAtRelease=0,doubleTapStartTime=0,singleTapTimeout=null,holdTimeout=null;try{$element.bind(START_EV,touchStart),$element.bind(CANCEL_EV,touchCancel)}catch(e){$.error("events not supported "+START_EV+","+CANCEL_EV+" on jQuery.swipe")}this.enable=function(){return this.disable(),$element.bind(START_EV,touchStart),$element.bind(CANCEL_EV,touchCancel),$element},this.disable=function(){return removeListeners(),$element},this.destroy=function(){removeListeners(),$element.data(PLUGIN_NS,null),$element=null},this.option=function(property,value){if("object"==typeof property)options=$.extend(options,property);else if(void 0!==options[property]){if(void 0===value)return options[property];options[property]=value}else{if(!property)return options;$.error("Option "+property+" does not exist on jQuery.swipe.options")}return null}}var VERSION="1.6.18",LEFT="left",RIGHT="right",UP="up",DOWN="down",IN="in",OUT="out",NONE="none",AUTO="auto",SWIPE="swipe",PINCH="pinch",TAP="tap",DOUBLE_TAP="doubletap",LONG_TAP="longtap",HORIZONTAL="horizontal",VERTICAL="vertical",ALL_FINGERS="all",DOUBLE_TAP_THRESHOLD=10,PHASE_START="start",PHASE_MOVE="move",PHASE_END="end",PHASE_CANCEL="cancel",SUPPORTS_TOUCH="ontouchstart"in window,SUPPORTS_POINTER_IE10=window.navigator.msPointerEnabled&&!window.navigator.pointerEnabled&&!SUPPORTS_TOUCH,SUPPORTS_POINTER=(window.navigator.pointerEnabled||window.navigator.msPointerEnabled)&&!SUPPORTS_TOUCH,PLUGIN_NS="TouchSwipe",defaults={fingers:1,threshold:75,cancelThreshold:null,pinchThreshold:20,maxTimeThreshold:null,fingerReleaseThreshold:250,longTapThreshold:500,doubleTapThreshold:200,swipe:null,swipeLeft:null,swipeRight:null,swipeUp:null,swipeDown:null,swipeStatus:null,pinchIn:null,pinchOut:null,pinchStatus:null,click:null,tap:null,doubleTap:null,longTap:null,hold:null,triggerOnTouchEnd:!0,triggerOnTouchLeave:!1,allowPageScroll:"auto",fallbackToMouseEvents:!0,excludedElements:".noSwipe",preventDefaultEvents:!0};$.fn.swipe=function(method){var $this=$(this),plugin=$this.data(PLUGIN_NS);if(plugin&&"string"==typeof method){if(plugin[method])return plugin[method].apply(plugin,Array.prototype.slice.call(arguments,1));$.error("Method "+method+" does not exist on jQuery.swipe")}else if(plugin&&"object"==typeof method)plugin.option.apply(plugin,arguments);else if(!(plugin||"object"!=typeof method&&method))return init.apply(this,arguments);return $this},$.fn.swipe.version=VERSION,$.fn.swipe.defaults=defaults,$.fn.swipe.phases={PHASE_START:PHASE_START,PHASE_MOVE:PHASE_MOVE,PHASE_END:PHASE_END,PHASE_CANCEL:PHASE_CANCEL},$.fn.swipe.directions={LEFT:LEFT,RIGHT:RIGHT,UP:UP,DOWN:DOWN,IN:IN,OUT:OUT},$.fn.swipe.pageScroll={NONE:NONE,HORIZONTAL:HORIZONTAL,VERTICAL:VERTICAL,AUTO:AUTO},$.fn.swipe.fingers={ONE:1,TWO:2,THREE:3,FOUR:4,FIVE:5,ALL:ALL_FINGERS}});
/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
 * https://jqueryvalidation.org/
 * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr.pseudos||a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(""+c)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=".  Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&"normalizer"!==d?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var b,c={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a});
/*! KineticJS v5.1.0 2014-03-27 http://www.kineticjs.com by Eric Rowell @ericdrowell - MIT License https://github.com/ericdrowell/KineticJS/wiki/License*/
var Kinetic={};!function(a){var b=Math.PI/180;Kinetic={version:"5.1.0",stages:[],idCounter:0,ids:{},names:{},shapes:{},listenClickTap:!1,inDblClickWindow:!1,enableTrace:!1,traceArrMax:100,dblClickWindow:400,pixelRatio:void 0,dragDistance:0,angleDeg:!0,UA:function(){var b=a.navigator&&a.navigator.userAgent||"",c=b.toLowerCase(),d=/(chrome)[ \/]([\w.]+)/.exec(c)||/(webkit)[ \/]([\w.]+)/.exec(c)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(c)||/(msie) ([\w.]+)/.exec(c)||c.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(c)||[],e=!!b.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i);return{browser:d[1]||"",version:d[2]||"0",mobile:e}}(),Filters:{},Node:function(a){this._init(a)},Shape:function(a){this.__init(a)},Container:function(a){this.__init(a)},Stage:function(a){this.___init(a)},BaseLayer:function(a){this.___init(a)},Layer:function(a){this.____init(a)},FastLayer:function(a){this.____init(a)},Group:function(a){this.___init(a)},isDragging:function(){var a=Kinetic.DD;return a?a.isDragging:!1},isDragReady:function(){var a=Kinetic.DD;return a?!!a.node:!1},_addId:function(a,b){void 0!==b&&(this.ids[b]=a)},_removeId:function(a){void 0!==a&&delete this.ids[a]},_addName:function(a,b){void 0!==b&&(void 0===this.names[b]&&(this.names[b]=[]),this.names[b].push(a))},_removeName:function(a,b){if(void 0!==a){var c=this.names[a];if(void 0!==c){for(var d=0;d<c.length;d++){var e=c[d];e._id===b&&c.splice(d,1)}0===c.length&&delete this.names[a]}}},getAngle:function(a){return this.angleDeg?a*b:a}}}(this),function(a,b){if("object"==typeof exports){var c=require("canvas"),d=require("jsdom").jsdom,e=d("<!DOCTYPE html><html><head></head><body></body></html>"),f=b();return Kinetic.document=e,Kinetic.window=Kinetic.document.createWindow(),Kinetic.window.Image=c.Image,Kinetic.root=a,Kinetic._nodeCanvas=c,void(module.exports=f)}"function"==typeof define&&define.amd&&define(b),Kinetic.document=document,Kinetic.window=window,Kinetic.root=a}((1,eval)("this"),function(){return Kinetic}),function(){Kinetic.Collection=function(){var a=[].slice.call(arguments),b=a.length,c=0;for(this.length=b;b>c;c++)this[c]=a[c];return this},Kinetic.Collection.prototype=[],Kinetic.Collection.prototype.each=function(a){for(var b=0;b<this.length;b++)a(this[b],b)},Kinetic.Collection.prototype.toArray=function(){var a,b=[],c=this.length;for(a=0;c>a;a++)b.push(this[a]);return b},Kinetic.Collection.toCollection=function(a){var b,c=new Kinetic.Collection,d=a.length;for(b=0;d>b;b++)c.push(a[b]);return c},Kinetic.Collection._mapMethod=function(a){Kinetic.Collection.prototype[a]=function(){var b,c=this.length,d=[].slice.call(arguments);for(b=0;c>b;b++)this[b][a].apply(this[b],d);return this}},Kinetic.Collection.mapMethods=function(a){var b=a.prototype;for(var c in b)Kinetic.Collection._mapMethod(c)},Kinetic.Transform=function(a){this.m=a&&a.slice()||[1,0,0,1,0,0]},Kinetic.Transform.prototype={copy:function(){return new Kinetic.Transform(this.m)},point:function(a){var b=this.m;return{x:b[0]*a.x+b[2]*a.y+b[4],y:b[1]*a.x+b[3]*a.y+b[5]}},translate:function(a,b){return this.m[4]+=this.m[0]*a+this.m[2]*b,this.m[5]+=this.m[1]*a+this.m[3]*b,this},scale:function(a,b){return this.m[0]*=a,this.m[1]*=a,this.m[2]*=b,this.m[3]*=b,this},rotate:function(a){var b=Math.cos(a),c=Math.sin(a),d=this.m[0]*b+this.m[2]*c,e=this.m[1]*b+this.m[3]*c,f=this.m[0]*-c+this.m[2]*b,g=this.m[1]*-c+this.m[3]*b;return this.m[0]=d,this.m[1]=e,this.m[2]=f,this.m[3]=g,this},getTranslation:function(){return{x:this.m[4],y:this.m[5]}},skew:function(a,b){var c=this.m[0]+this.m[2]*b,d=this.m[1]+this.m[3]*b,e=this.m[2]+this.m[0]*a,f=this.m[3]+this.m[1]*a;return this.m[0]=c,this.m[1]=d,this.m[2]=e,this.m[3]=f,this},multiply:function(a){var b=this.m[0]*a.m[0]+this.m[2]*a.m[1],c=this.m[1]*a.m[0]+this.m[3]*a.m[1],d=this.m[0]*a.m[2]+this.m[2]*a.m[3],e=this.m[1]*a.m[2]+this.m[3]*a.m[3],f=this.m[0]*a.m[4]+this.m[2]*a.m[5]+this.m[4],g=this.m[1]*a.m[4]+this.m[3]*a.m[5]+this.m[5];return this.m[0]=b,this.m[1]=c,this.m[2]=d,this.m[3]=e,this.m[4]=f,this.m[5]=g,this},invert:function(){var a=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),b=this.m[3]*a,c=-this.m[1]*a,d=-this.m[2]*a,e=this.m[0]*a,f=a*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),g=a*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);return this.m[0]=b,this.m[1]=c,this.m[2]=d,this.m[3]=e,this.m[4]=f,this.m[5]=g,this},getMatrix:function(){return this.m},setAbsolutePosition:function(a,b){var c=this.m[0],d=this.m[1],e=this.m[2],f=this.m[3],g=this.m[4],h=this.m[5],i=(c*(b-h)-d*(a-g))/(c*f-d*e),j=(a-g-e*i)/c;return this.translate(j,i)}};var a="2d",b="[object Array]",c="[object Number]",d="[object String]",e=Math.PI/180,f=180/Math.PI,g="#",h="",i="0",j="Kinetic warning: ",k="Kinetic error: ",l="rgb(",m={aqua:[0,255,255],lime:[0,255,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,255],navy:[0,0,128],white:[255,255,255],fuchsia:[255,0,255],olive:[128,128,0],yellow:[255,255,0],orange:[255,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[255,0,0],pink:[255,192,203],cyan:[0,255,255],transparent:[255,255,255,0]},n=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/;Kinetic.Util={_isElement:function(a){return!(!a||1!=a.nodeType)},_isFunction:function(a){return!!(a&&a.constructor&&a.call&&a.apply)},_isObject:function(a){return!!a&&a.constructor==Object},_isArray:function(a){return Object.prototype.toString.call(a)==b},_isNumber:function(a){return Object.prototype.toString.call(a)==c},_isString:function(a){return Object.prototype.toString.call(a)==d},_throttle:function(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:(new Date).getTime(),g=null,f=a.apply(d,e),d=e=null};return function(){var j=(new Date).getTime();h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e),d=e=null):g||c.trailing===!1||(g=setTimeout(i,k)),f}},_hasMethods:function(a){var b,c=[];for(b in a)this._isFunction(a[b])&&c.push(b);return c.length>0},createCanvasElement:function(){var a=Kinetic.document.createElement("canvas");return a.style=a.style||{},a},isBrowser:function(){return"object"!=typeof exports},_isInDocument:function(a){for(;a=a.parentNode;)if(a==Kinetic.document)return!0;return!1},_simplifyArray:function(a){var b,c,d=[],e=a.length,f=Kinetic.Util;for(b=0;e>b;b++)c=a[b],f._isNumber(c)?c=Math.round(1e3*c)/1e3:f._isString(c)||(c=c.toString()),d.push(c);return d},_getImage:function(b,c){var d,e;if(b)if(this._isElement(b))c(b);else if(this._isString(b))d=new Kinetic.window.Image,d.onload=function(){c(d)},d.src=b;else if(b.data){e=Kinetic.Util.createCanvasElement(),e.width=b.width,e.height=b.height;var f=e.getContext(a);f.putImageData(b,0,0),this._getImage(e.toDataURL(),c)}else c(null);else c(null)},_getRGBAString:function(a){var b=a.red||0,c=a.green||0,d=a.blue||0,e=a.alpha||1;return["rgba(",b,",",c,",",d,",",e,")"].join(h)},_rgbToHex:function(a,b,c){return((1<<24)+(a<<16)+(b<<8)+c).toString(16).slice(1)},_hexToRgb:function(a){a=a.replace(g,h);var b=parseInt(a,16);return{r:b>>16&255,g:b>>8&255,b:255&b}},getRandomColor:function(){for(var a=(16777215*Math.random()<<0).toString(16);a.length<6;)a=i+a;return g+a},get:function(a,b){return void 0===a?b:a},getRGB:function(a){var b;return a in m?(b=m[a],{r:b[0],g:b[1],b:b[2]}):a[0]===g?this._hexToRgb(a.substring(1)):a.substr(0,4)===l?(b=n.exec(a.replace(/ /g,"")),{r:parseInt(b[1],10),g:parseInt(b[2],10),b:parseInt(b[3],10)}):{r:0,g:0,b:0}},_merge:function(a,b){var c=this._clone(b);for(var d in a)c[d]=this._isObject(a[d])?this._merge(a[d],c[d]):a[d];return c},cloneObject:function(a){var b={};for(var c in a)b[c]=this._isObject(a[c])?this.cloneObject(a[c]):this._isArray(a[c])?this.cloneArray(a[c]):a[c];return b},cloneArray:function(a){return a.slice(0)},_degToRad:function(a){return a*e},_radToDeg:function(a){return a*f},_capitalize:function(a){return a.charAt(0).toUpperCase()+a.slice(1)},error:function(a){throw new Error(k+a)},warn:function(a){Kinetic.root.console&&console.warn&&console.warn(j+a)},extend:function(a,b){for(var c in b.prototype)c in a.prototype||(a.prototype[c]=b.prototype[c])},addMethods:function(a,b){var c;for(c in b)a.prototype[c]=b[c]},_getControlPoints:function(a,b,c,d,e,f,g){var h=Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2)),i=Math.sqrt(Math.pow(e-c,2)+Math.pow(f-d,2)),j=g*h/(h+i),k=g*i/(h+i),l=c-j*(e-a),m=d-j*(f-b),n=c+k*(e-a),o=d+k*(f-b);return[l,m,n,o]},_expandPoints:function(a,b){var c,d,e=a.length,f=[];for(c=2;e-2>c;c+=2)d=Kinetic.Util._getControlPoints(a[c-2],a[c-1],a[c],a[c+1],a[c+2],a[c+3],b),f.push(d[0]),f.push(d[1]),f.push(a[c]),f.push(a[c+1]),f.push(d[2]),f.push(d[3]);return f},_removeLastLetter:function(a){return a.substring(0,a.length-1)}}}(),function(){var a=Kinetic.Util.createCanvasElement(),b=a.getContext("2d"),c=Kinetic.UA.mobile?function(){var a=window.devicePixelRatio||1,c=b.webkitBackingStorePixelRatio||b.mozBackingStorePixelRatio||b.msBackingStorePixelRatio||b.oBackingStorePixelRatio||b.backingStorePixelRatio||1;return a/c}():1;Kinetic.Canvas=function(a){this.init(a)},Kinetic.Canvas.prototype={init:function(a){a=a||{};var b=a.pixelRatio||Kinetic.pixelRatio||c;this.pixelRatio=b,this._canvas=Kinetic.Util.createCanvasElement(),this._canvas.style.padding=0,this._canvas.style.margin=0,this._canvas.style.border=0,this._canvas.style.background="transparent",this._canvas.style.position="absolute",this._canvas.style.top=0,this._canvas.style.left=0},getContext:function(){return this.context},getPixelRatio:function(){return this.pixelRatio},setPixelRatio:function(a){this.pixelRatio=a,this.setSize(this.getWidth(),this.getHeight())},setWidth:function(a){this.width=this._canvas.width=a*this.pixelRatio,this._canvas.style.width=a+"px"},setHeight:function(a){this.height=this._canvas.height=a*this.pixelRatio,this._canvas.style.height=a+"px"},getWidth:function(){return this.width},getHeight:function(){return this.height},setSize:function(a,b){this.setWidth(a),this.setHeight(b)},toDataURL:function(a,b){try{return this._canvas.toDataURL(a,b)}catch(c){try{return this._canvas.toDataURL()}catch(d){return Kinetic.Util.warn("Unable to get data URL. "+d.message),""}}}},Kinetic.SceneCanvas=function(a){a=a||{};var b=a.width||0,c=a.height||0;Kinetic.Canvas.call(this,a),this.context=new Kinetic.SceneContext(this),this.setSize(b,c)},Kinetic.SceneCanvas.prototype={setWidth:function(a){var b=this.pixelRatio,c=this.getContext()._context;Kinetic.Canvas.prototype.setWidth.call(this,a),c.scale(b,b)},setHeight:function(a){var b=this.pixelRatio,c=this.getContext()._context;Kinetic.Canvas.prototype.setHeight.call(this,a),c.scale(b,b)}},Kinetic.Util.extend(Kinetic.SceneCanvas,Kinetic.Canvas),Kinetic.HitCanvas=function(a){a=a||{};var b=a.width||0,c=a.height||0;Kinetic.Canvas.call(this,a),this.context=new Kinetic.HitContext(this),this.setSize(b,c)},Kinetic.Util.extend(Kinetic.HitCanvas,Kinetic.Canvas)}(),function(){var a=",",b="(",c=")",d="([",e="])",f=";",g="()",h="=",i=["arc","arcTo","beginPath","bezierCurveTo","clearRect","clip","closePath","createLinearGradient","createPattern","createRadialGradient","drawImage","fill","fillText","getImageData","createImageData","lineTo","moveTo","putImageData","quadraticCurveTo","rect","restore","rotate","save","scale","setLineDash","setTransform","stroke","strokeText","transform","translate"];Kinetic.Context=function(a){this.init(a)},Kinetic.Context.prototype={init:function(a){this.canvas=a,this._context=a._canvas.getContext("2d"),Kinetic.enableTrace&&(this.traceArr=[],this._enableTrace())},fillShape:function(a){a.getFillEnabled()&&this._fill(a)},strokeShape:function(a){a.getStrokeEnabled()&&this._stroke(a)},fillStrokeShape:function(a){var b=a.getFillEnabled();b&&this._fill(a),a.getStrokeEnabled()&&this._stroke(a)},getTrace:function(i){var j,k,l,m,n=this.traceArr,o=n.length,p="";for(j=0;o>j;j++)k=n[j],l=k.method,l?(m=k.args,p+=l,p+=i?g:Kinetic.Util._isArray(m[0])?d+m.join(a)+e:b+m.join(a)+c):(p+=k.property,i||(p+=h+k.val)),p+=f;return p},clearTrace:function(){this.traceArr=[]},_trace:function(a){var b,c=this.traceArr;c.push(a),b=c.length,b>=Kinetic.traceArrMax&&c.shift()},reset:function(){var a=this.getCanvas().getPixelRatio();this.setTransform(1*a,0,0,1*a,0,0)},getCanvas:function(){return this.canvas},clear:function(a){var b=this.getCanvas();a?this.clearRect(a.x||0,a.y||0,a.width||0,a.height||0):this.clearRect(0,0,b.getWidth(),b.getHeight())},_applyLineCap:function(a){var b=a.getLineCap();b&&this.setAttr("lineCap",b)},_applyOpacity:function(a){var b=a.getAbsoluteOpacity();1!==b&&this.setAttr("globalAlpha",b)},_applyLineJoin:function(a){var b=a.getLineJoin();b&&this.setAttr("lineJoin",b)},setAttr:function(a,b){this._context[a]=b},arc:function(){var a=arguments;this._context.arc(a[0],a[1],a[2],a[3],a[4],a[5])},beginPath:function(){this._context.beginPath()},bezierCurveTo:function(){var a=arguments;this._context.bezierCurveTo(a[0],a[1],a[2],a[3],a[4],a[5])},clearRect:function(){var a=arguments;this._context.clearRect(a[0],a[1],a[2],a[3])},clip:function(){this._context.clip()},closePath:function(){this._context.closePath()},createImageData:function(){var a=arguments;return 2===a.length?this._context.createImageData(a[0],a[1]):1===a.length?this._context.createImageData(a[0]):void 0},createLinearGradient:function(){var a=arguments;return this._context.createLinearGradient(a[0],a[1],a[2],a[3])},createPattern:function(){var a=arguments;return this._context.createPattern(a[0],a[1])},createRadialGradient:function(){var a=arguments;return this._context.createRadialGradient(a[0],a[1],a[2],a[3],a[4],a[5])},drawImage:function(){var a=arguments,b=this._context;3===a.length?b.drawImage(a[0],a[1],a[2]):5===a.length?b.drawImage(a[0],a[1],a[2],a[3],a[4]):9===a.length&&b.drawImage(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8])},fill:function(){this._context.fill()},fillText:function(){var a=arguments;this._context.fillText(a[0],a[1],a[2])},getImageData:function(){var a=arguments;return this._context.getImageData(a[0],a[1],a[2],a[3])},lineTo:function(){var a=arguments;this._context.lineTo(a[0],a[1])},moveTo:function(){var a=arguments;this._context.moveTo(a[0],a[1])},rect:function(){var a=arguments;this._context.rect(a[0],a[1],a[2],a[3])},putImageData:function(){var a=arguments;this._context.putImageData(a[0],a[1],a[2])},quadraticCurveTo:function(){var a=arguments;this._context.quadraticCurveTo(a[0],a[1],a[2],a[3])},restore:function(){this._context.restore()},rotate:function(){var a=arguments;this._context.rotate(a[0])},save:function(){this._context.save()},scale:function(){var a=arguments;this._context.scale(a[0],a[1])},setLineDash:function(){var a=arguments,b=this._context;this._context.setLineDash?b.setLineDash(a[0]):"mozDash"in b?b.mozDash=a[0]:"webkitLineDash"in b&&(b.webkitLineDash=a[0])},setTransform:function(){var a=arguments;this._context.setTransform(a[0],a[1],a[2],a[3],a[4],a[5])},stroke:function(){this._context.stroke()},strokeText:function(){var a=arguments;this._context.strokeText(a[0],a[1],a[2])},transform:function(){var a=arguments;this._context.transform(a[0],a[1],a[2],a[3],a[4],a[5])},translate:function(){var a=arguments;this._context.translate(a[0],a[1])},_enableTrace:function(){var a,b,c=this,d=i.length,e=Kinetic.Util._simplifyArray,f=this.setAttr,g=function(a){var d,f=c[a];c[a]=function(){return b=e(Array.prototype.slice.call(arguments,0)),d=f.apply(c,arguments),c._trace({method:a,args:b}),d}};for(a=0;d>a;a++)g(i[a]);c.setAttr=function(){f.apply(c,arguments),c._trace({property:arguments[0],val:arguments[1]})}}},Kinetic.SceneContext=function(a){Kinetic.Context.call(this,a)},Kinetic.SceneContext.prototype={_fillColor:function(a){var b=a.fill()||Kinetic.Util._getRGBAString({red:a.fillRed(),green:a.fillGreen(),blue:a.fillBlue(),alpha:a.fillAlpha()});this.setAttr("fillStyle",b),a._fillFunc(this)},_fillPattern:function(a){var b=a.getFillPatternImage(),c=a.getFillPatternX(),d=a.getFillPatternY(),e=a.getFillPatternScale(),f=Kinetic.getAngle(a.getFillPatternRotation()),g=a.getFillPatternOffset(),h=a.getFillPatternRepeat();(c||d)&&this.translate(c||0,d||0),f&&this.rotate(f),e&&this.scale(e.x,e.y),g&&this.translate(-1*g.x,-1*g.y),this.setAttr("fillStyle",this.createPattern(b,h||"repeat")),this.fill()},_fillLinearGradient:function(a){var b=a.getFillLinearGradientStartPoint(),c=a.getFillLinearGradientEndPoint(),d=a.getFillLinearGradientColorStops(),e=this.createLinearGradient(b.x,b.y,c.x,c.y);if(d){for(var f=0;f<d.length;f+=2)e.addColorStop(d[f],d[f+1]);this.setAttr("fillStyle",e),this.fill()}},_fillRadialGradient:function(a){for(var b=a.getFillRadialGradientStartPoint(),c=a.getFillRadialGradientEndPoint(),d=a.getFillRadialGradientStartRadius(),e=a.getFillRadialGradientEndRadius(),f=a.getFillRadialGradientColorStops(),g=this.createRadialGradient(b.x,b.y,d,c.x,c.y,e),h=0;h<f.length;h+=2)g.addColorStop(f[h],f[h+1]);this.setAttr("fillStyle",g),this.fill()},_fill:function(a){var b=a.fill()||a.fillRed()||a.fillGreen()||a.fillBlue(),c=a.getFillPatternImage(),d=a.getFillLinearGradientColorStops(),e=a.getFillRadialGradientColorStops(),f=a.getFillPriority();b&&"color"===f?this._fillColor(a):c&&"pattern"===f?this._fillPattern(a):d&&"linear-gradient"===f?this._fillLinearGradient(a):e&&"radial-gradient"===f?this._fillRadialGradient(a):b?this._fillColor(a):c?this._fillPattern(a):d?this._fillLinearGradient(a):e&&this._fillRadialGradient(a)},_stroke:function(a){var b=a.dash(),c=a.getStrokeScaleEnabled();a.hasStroke()&&(c||(this.save(),this.setTransform(1,0,0,1,0,0)),this._applyLineCap(a),b&&a.dashEnabled()&&this.setLineDash(b),this.setAttr("lineWidth",a.strokeWidth()),this.setAttr("strokeStyle",a.stroke()||Kinetic.Util._getRGBAString({red:a.strokeRed(),green:a.strokeGreen(),blue:a.strokeBlue(),alpha:a.strokeAlpha()})),a._strokeFunc(this),c||this.restore())},_applyShadow:function(a){var b=Kinetic.Util,c=a.getAbsoluteOpacity(),d=b.get(a.getShadowColor(),"black"),e=b.get(a.getShadowBlur(),5),f=b.get(a.getShadowOpacity(),1),g=b.get(a.getShadowOffset(),{x:0,y:0});f&&this.setAttr("globalAlpha",f*c),this.setAttr("shadowColor",d),this.setAttr("shadowBlur",e),this.setAttr("shadowOffsetX",g.x),this.setAttr("shadowOffsetY",g.y)}},Kinetic.Util.extend(Kinetic.SceneContext,Kinetic.Context),Kinetic.HitContext=function(a){Kinetic.Context.call(this,a)},Kinetic.HitContext.prototype={_fill:function(a){this.save(),this.setAttr("fillStyle",a.colorKey),a._fillFuncHit(this),this.restore()},_stroke:function(a){a.hasStroke()&&(this._applyLineCap(a),this.setAttr("lineWidth",a.strokeWidth()),this.setAttr("strokeStyle",a.colorKey),a._strokeFuncHit(this))}},Kinetic.Util.extend(Kinetic.HitContext,Kinetic.Context)}(),function(){var a="get",b="set";Kinetic.Factory={addGetterSetter:function(a,b,c,d,e){this.addGetter(a,b,c),this.addSetter(a,b,d,e),this.addOverloadedGetterSetter(a,b)},addGetter:function(b,c,d){var e=a+Kinetic.Util._capitalize(c);b.prototype[e]=function(){var a=this.attrs[c];return void 0===a?d:a}},addSetter:function(a,c,d,e){var f=b+Kinetic.Util._capitalize(c);a.prototype[f]=function(a){return d&&(a=d.call(this,a)),this._setAttr(c,a),e&&e.call(this),this}},addComponentsGetterSetter:function(c,d,e,f,g){var h,i,j=e.length,k=Kinetic.Util._capitalize,l=a+k(d),m=b+k(d);c.prototype[l]=function(){var a={};for(h=0;j>h;h++)i=e[h],a[i]=this.getAttr(d+k(i));return a},c.prototype[m]=function(a){var b,c=this.attrs[d];f&&(a=f.call(this,a));for(b in a)this._setAttr(d+k(b),a[b]);return this._fireChangeEvent(d,c,a),g&&g.call(this),this},this.addOverloadedGetterSetter(c,d)},addOverloadedGetterSetter:function(c,d){var e=Kinetic.Util._capitalize(d),f=b+e,g=a+e;c.prototype[d]=function(){return arguments.length?(this[f](arguments[0]),this):this[g]()}},backCompat:function(a,b){var c;for(c in b)a.prototype[c]=a.prototype[b[c]]},afterSetFilter:function(){this._filterUpToDate=!1}},Kinetic.Validators={RGBComponent:function(a){return a>255?255:0>a?0:Math.round(a)},alphaComponent:function(a){return a>1?1:1e-4>a?1e-4:a}}}(),function(){var a="absoluteOpacity",b="absoluteTransform",c="Change",d="children",e=".",f="",g="get",h="id",i="kinetic",j="listening",k="mouseenter",l="mouseleave",m="name",n="set",o="Shape",p=" ",q="stage",r="transform",s="Stage",t="visible",u=["id"],v=["xChange.kinetic","yChange.kinetic","scaleXChange.kinetic","scaleYChange.kinetic","skewXChange.kinetic","skewYChange.kinetic","rotationChange.kinetic","offsetXChange.kinetic","offsetYChange.kinetic","transformsEnabledChange.kinetic"].join(p);Kinetic.Util.addMethods(Kinetic.Node,{_init:function(c){var d=this;this._id=Kinetic.idCounter++,this.eventListeners={},this.attrs={},this._cache={},this._filterUpToDate=!1,this.setAttrs(c),this.on(v,function(){this._clearCache(r),d._clearSelfAndDescendantCache(b)}),this.on("visibleChange.kinetic",function(){d._clearSelfAndDescendantCache(t)}),this.on("listeningChange.kinetic",function(){d._clearSelfAndDescendantCache(j)}),this.on("opacityChange.kinetic",function(){d._clearSelfAndDescendantCache(a)})},_clearCache:function(a){a?delete this._cache[a]:this._cache={}},_getCache:function(a,b){var c=this._cache[a];return void 0===c&&(this._cache[a]=b.call(this)),this._cache[a]},_clearSelfAndDescendantCache:function(a){this._clearCache(a),this.children&&this.getChildren().each(function(b){b._clearSelfAndDescendantCache(a)})},clearCache:function(){return delete this._cache.canvas,this._filterUpToDate=!1,this},cache:function(a){{var b=a||{},c=b.x||0,d=b.y||0,e=b.width||this.width(),f=b.height||this.height(),g=b.drawBorder||!1;this.getLayer()}if(0===e||0===f)return void Kinetic.Util.warn("Width or height of caching configuration equals 0. Cache is ignored.");var h=new Kinetic.SceneCanvas({pixelRatio:1,width:e,height:f}),i=new Kinetic.SceneCanvas({pixelRatio:1,width:e,height:f}),j=new Kinetic.HitCanvas({width:e,height:f}),k=(this.transformsEnabled(),this.x(),this.y(),h.getContext()),l=j.getContext();return this.clearCache(),k.save(),l.save(),g&&(k.save(),k.beginPath(),k.rect(0,0,e,f),k.closePath(),k.setAttr("strokeStyle","red"),k.setAttr("lineWidth",5),k.stroke(),k.restore()),k.translate(-1*c,-1*d),l.translate(-1*c,-1*d),"Shape"===this.nodeType&&(k.translate(-1*this.x(),-1*this.y()),l.translate(-1*this.x(),-1*this.y())),this.drawScene(h,this),this.drawHit(j,this),k.restore(),l.restore(),this._cache.canvas={scene:h,filter:i,hit:j},this},_drawCachedSceneCanvas:function(a){a.save(),this.getLayer()._applyTransform(this,a),a.drawImage(this._getCachedSceneCanvas()._canvas,0,0),a.restore()},_getCachedSceneCanvas:function(){var a,b,c,d,e=this.filters(),f=this._cache.canvas,g=f.scene,h=f.filter,i=h.getContext();if(e){if(!this._filterUpToDate){try{for(a=e.length,i.clear(),i.drawImage(g._canvas,0,0),b=i.getImageData(0,0,h.getWidth(),h.getHeight()),c=0;a>c;c++)d=e[c],d.call(this,b),i.putImageData(b,0,0)}catch(j){Kinetic.Util.warn("Unable to apply filter. "+j.message)}this._filterUpToDate=!0}return h}return g},_drawCachedHitCanvas:function(a){var b=this._cache.canvas,c=b.hit;a.save(),this.getLayer()._applyTransform(this,a),a.drawImage(c._canvas,0,0),a.restore()},on:function(a,b){var c,d,g,h,i,j=a.split(p),k=j.length;for(c=0;k>c;c++)d=j[c],g=d.split(e),h=g[0],i=g[1]||f,this.eventListeners[h]||(this.eventListeners[h]=[]),this.eventListeners[h].push({name:i,handler:b});return this},off:function(a){var b,c,d,f,g,h,i=a.split(p),j=i.length;for(b=0;j>b;b++)if(d=i[b],f=d.split(e),g=f[0],h=f[1],g)this.eventListeners[g]&&this._off(g,h);else for(c in this.eventListeners)this._off(c,h);return this},dispatchEvent:function(a){var b={target:this,type:a.type,evt:a};this.fire(a.type,b)},addEventListener:function(a,b){this.on(a,function(a){b.call(this,a.evt)})},remove:function(){var c=this.getParent();return c&&c.children&&(c.children.splice(this.index,1),c._setChildrenIndices(),delete this.parent),this._clearSelfAndDescendantCache(q),this._clearSelfAndDescendantCache(b),this._clearSelfAndDescendantCache(t),this._clearSelfAndDescendantCache(j),this._clearSelfAndDescendantCache(a),this},destroy:function(){Kinetic._removeId(this.getId()),Kinetic._removeName(this.getName(),this._id),this.remove()},getAttr:function(a){var b=g+Kinetic.Util._capitalize(a);return Kinetic.Util._isFunction(this[b])?this[b]():this.attrs[a]},getAncestors:function(){for(var a=this.getParent(),b=new Kinetic.Collection;a;)b.push(a),a=a.getParent();return b},getAttrs:function(){return this.attrs||{}},setAttrs:function(a){var b,c;if(a)for(b in a)b===d||(c=n+Kinetic.Util._capitalize(b),Kinetic.Util._isFunction(this[c])?this[c](a[b]):this._setAttr(b,a[b]));return this},isListening:function(){return this._getCache(j,this._isListening)},_isListening:function(){var a=this.getListening(),b=this.getParent();return"inherit"===a?b?b.isListening():!0:a},isVisible:function(){return this._getCache(t,this._isVisible)},_isVisible:function(){var a=this.getVisible(),b=this.getParent();return"inherit"===a?b?b.isVisible():!0:a},shouldDrawHit:function(){var a=this.getLayer();return a&&a.hitGraphEnabled()&&this.isListening()&&this.isVisible()&&!Kinetic.isDragging()},show:function(){return this.setVisible(!0),this},hide:function(){return this.setVisible(!1),this},getZIndex:function(){return this.index||0},getAbsoluteZIndex:function(){function a(i){for(b=[],c=i.length,d=0;c>d;d++)e=i[d],h++,e.nodeType!==o&&(b=b.concat(e.getChildren().toArray())),e._id===g._id&&(d=c);b.length>0&&b[0].getDepth()<=f&&a(b)}var b,c,d,e,f=this.getDepth(),g=this,h=0;return g.nodeType!==s&&a(g.getStage().getChildren()),h},getDepth:function(){for(var a=0,b=this.parent;b;)a++,b=b.parent;return a},setPosition:function(a){return this.setX(a.x),this.setY(a.y),this},getPosition:function(){return{x:this.getX(),y:this.getY()}},getAbsolutePosition:function(){var a=this.getAbsoluteTransform().getMatrix(),b=new Kinetic.Transform,c=this.offset();return b.m=a.slice(),b.translate(c.x,c.y),b.getTranslation()},setAbsolutePosition:function(a){var b,c=this._clearTransform();return this.attrs.x=c.x,this.attrs.y=c.y,delete c.x,delete c.y,b=this.getAbsoluteTransform(),b.invert(),b.translate(a.x,a.y),a={x:this.attrs.x+b.getTranslation().x,y:this.attrs.y+b.getTranslation().y},this.setPosition({x:a.x,y:a.y}),this._setTransform(c),this},_setTransform:function(a){var c;for(c in a)this.attrs[c]=a[c];this._clearCache(r),this._clearSelfAndDescendantCache(b)},_clearTransform:function(){var a={x:this.getX(),y:this.getY(),rotation:this.getRotation(),scaleX:this.getScaleX(),scaleY:this.getScaleY(),offsetX:this.getOffsetX(),offsetY:this.getOffsetY(),skewX:this.getSkewX(),skewY:this.getSkewY()};return this.attrs.x=0,this.attrs.y=0,this.attrs.rotation=0,this.attrs.scaleX=1,this.attrs.scaleY=1,this.attrs.offsetX=0,this.attrs.offsetY=0,this.attrs.skewX=0,this.attrs.skewY=0,this._clearCache(r),this._clearSelfAndDescendantCache(b),a},move:function(a){var b=a.x,c=a.y,d=this.getX(),e=this.getY();return void 0!==b&&(d+=b),void 0!==c&&(e+=c),this.setPosition({x:d,y:e}),this},_eachAncestorReverse:function(a,b){var c,d,e=[],f=this.getParent();if(b&&b._id===this._id)return a(this),!0;for(e.unshift(this);f&&(!b||f._id!==b._id);)e.unshift(f),f=f.parent;for(c=e.length,d=0;c>d;d++)a(e[d])},rotate:function(a){return this.setRotation(this.getRotation()+a),this},moveToTop:function(){if(!this.parent)return void Kinetic.Util.warn("Node has no parent. moveToTop function is ignored.");var a=this.index;return this.parent.children.splice(a,1),this.parent.children.push(this),this.parent._setChildrenIndices(),!0},moveUp:function(){if(!this.parent)return void Kinetic.Util.warn("Node has no parent. moveUp function is ignored.");var a=this.index,b=this.parent.getChildren().length;return b-1>a?(this.parent.children.splice(a,1),this.parent.children.splice(a+1,0,this),this.parent._setChildrenIndices(),!0):!1},moveDown:function(){if(!this.parent)return void Kinetic.Util.warn("Node has no parent. moveDown function is ignored.");var a=this.index;return a>0?(this.parent.children.splice(a,1),this.parent.children.splice(a-1,0,this),this.parent._setChildrenIndices(),!0):!1},moveToBottom:function(){if(!this.parent)return void Kinetic.Util.warn("Node has no parent. moveToBottom function is ignored.");var a=this.index;return a>0?(this.parent.children.splice(a,1),this.parent.children.unshift(this),this.parent._setChildrenIndices(),!0):!1},setZIndex:function(a){if(!this.parent)return void Kinetic.Util.warn("Node has no parent. zIndex parameter is ignored.");var b=this.index;return this.parent.children.splice(b,1),this.parent.children.splice(a,0,this),this.parent._setChildrenIndices(),this},getAbsoluteOpacity:function(){return this._getCache(a,this._getAbsoluteOpacity)},_getAbsoluteOpacity:function(){var a=this.getOpacity();return this.getParent()&&(a*=this.getParent().getAbsoluteOpacity()),a},moveTo:function(a){return Kinetic.Node.prototype.remove.call(this),a.add(this),this},toObject:function(){var a,b,c,d,e=Kinetic.Util,f={},g=this.getAttrs();f.attrs={};for(a in g)b=g[a],e._isFunction(b)||e._isElement(b)||e._isObject(b)&&e._hasMethods(b)||(c=this[a],delete g[a],d=c?c.call(this):null,g[a]=b,d!==b&&(f.attrs[a]=b));return f.className=this.getClassName(),f},toJSON:function(){return JSON.stringify(this.toObject())},getParent:function(){return this.parent},getLayer:function(){var a=this.getParent();return a?a.getLayer():null},getStage:function(){return this._getCache(q,this._getStage)},_getStage:function(){var a=this.getParent();return a?a.getStage():void 0},fire:function(a,b,c){return c?this._fireAndBubble(a,b||{}):this._fire(a,b||{}),this},getAbsoluteTransform:function(a){return a?this._getAbsoluteTransform(a):this._getCache(b,this._getAbsoluteTransform)},_getAbsoluteTransform:function(a){var b,c,d=new Kinetic.Transform;return this._eachAncestorReverse(function(a){b=a.transformsEnabled(),c=a.getTransform(),"all"===b?d.multiply(c):"position"===b&&d.translate(a.x(),a.y())},a),d},getTransform:function(){return this._getCache(r,this._getTransform)},_getTransform:function(){var a=new Kinetic.Transform,b=this.getX(),c=this.getY(),d=Kinetic.getAngle(this.getRotation()),e=this.getScaleX(),f=this.getScaleY(),g=this.getSkewX(),h=this.getSkewY(),i=this.getOffsetX(),j=this.getOffsetY();return(0!==b||0!==c)&&a.translate(b,c),0!==d&&a.rotate(d),(0!==g||0!==h)&&a.skew(g,h),(1!==e||1!==f)&&a.scale(e,f),(0!==i||0!==j)&&a.translate(-1*i,-1*j),a},clone:function(a){var b,c,d,e,f,g=this.getClassName(),h=Kinetic.Util.cloneObject(this.attrs);for(var j in u){var k=u[j];delete h[k]}for(b in a)h[b]=a[b];var l=new Kinetic[g](h);for(b in this.eventListeners)for(c=this.eventListeners[b],d=c.length,e=0;d>e;e++)f=c[e],f.name.indexOf(i)<0&&(l.eventListeners[b]||(l.eventListeners[b]=[]),l.eventListeners[b].push(f));return l},toDataURL:function(a){a=a||{};var b=a.mimeType||null,c=a.quality||null,d=this.getStage(),e=a.x||0,f=a.y||0,g=new Kinetic.SceneCanvas({width:a.width||this.getWidth()||(d?d.getWidth():0),height:a.height||this.getHeight()||(d?d.getHeight():0),pixelRatio:1}),h=g.getContext();return h.save(),(e||f)&&h.translate(-1*e,-1*f),this.drawScene(g),h.restore(),g.toDataURL(b,c)},toImage:function(a){Kinetic.Util._getImage(this.toDataURL(a),function(b){a.callback(b)})},setSize:function(a){return this.setWidth(a.width),this.setHeight(a.height),this},getSize:function(){return{width:this.getWidth(),height:this.getHeight()}},getWidth:function(){return this.attrs.width||0},getHeight:function(){return this.attrs.height||0},getClassName:function(){return this.className||this.nodeType},getType:function(){return this.nodeType},getDragDistance:function(){return void 0!==this.attrs.dragDistance?this.attrs.dragDistance:this.parent?this.parent.getDragDistance():Kinetic.dragDistance},_get:function(a){return this.nodeType===a?[this]:[]},_off:function(a,b){var c,d,e=this.eventListeners[a];for(c=0;c<e.length;c++)if(d=e[c].name,!("kinetic"===d&&"kinetic"!==b||b&&d!==b)){if(e.splice(c,1),0===e.length){delete this.eventListeners[a];break}c--}},_fireChangeEvent:function(a,b,d){this._fire(a+c,{oldVal:b,newVal:d})},setId:function(a){var b=this.getId();return Kinetic._removeId(b),Kinetic._addId(this,a),this._setAttr(h,a),this
},setName:function(a){var b=this.getName();return Kinetic._removeName(b,this._id),Kinetic._addName(this,a),this._setAttr(m,a),this},setAttr:function(){var a=Array.prototype.slice.call(arguments),b=a[0],c=a[1],d=n+Kinetic.Util._capitalize(b),e=this[d];return Kinetic.Util._isFunction(e)?e.call(this,c):this._setAttr(b,c),this},_setAttr:function(a,b){var c;void 0!==b&&(c=this.attrs[a],this.attrs[a]=b,this._fireChangeEvent(a,c,b))},_setComponentAttr:function(a,b,c){var d;void 0!==c&&(d=this.attrs[a],d||(this.attrs[a]=this.getAttr(a)),this.attrs[a][b]=c,this._fireChangeEvent(a,d,c))},_fireAndBubble:function(a,b,c){var d=!0;b&&this.nodeType===o&&(b.target=this),a===k&&c&&this._id===c._id?d=!1:a===l&&c&&this._id===c._id&&(d=!1),d&&(this._fire(a,b),b&&!b.cancelBubble&&this.parent&&(c&&c.parent?this._fireAndBubble.call(this.parent,a,b,c.parent):this._fireAndBubble.call(this.parent,a,b)))},_fire:function(a,b){var c,d=this.eventListeners[a];if(b.type=a,d)for(c=0;c<d.length;c++)d[c].handler.call(this,b)},draw:function(){return this.drawScene(),this.drawHit(),this}}),Kinetic.Node.create=function(a,b){return this._createNode(JSON.parse(a),b)},Kinetic.Node._createNode=function(a,b){var c,d,e,f=Kinetic.Node.prototype.getClassName.call(a),g=a.children;if(b&&(a.attrs.container=b),c=new Kinetic[f](a.attrs),g)for(d=g.length,e=0;d>e;e++)c.add(this._createNode(g[e]));return c},Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node,"position"),Kinetic.Factory.addGetterSetter(Kinetic.Node,"x",0),Kinetic.Factory.addGetterSetter(Kinetic.Node,"y",0),Kinetic.Factory.addGetterSetter(Kinetic.Node,"opacity",1),Kinetic.Factory.addGetter(Kinetic.Node,"name"),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node,"name"),Kinetic.Factory.addGetter(Kinetic.Node,"id"),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node,"id"),Kinetic.Factory.addGetterSetter(Kinetic.Node,"rotation",0),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node,"scale",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Node,"scaleX",1),Kinetic.Factory.addGetterSetter(Kinetic.Node,"scaleY",1),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node,"skew",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Node,"skewX",0),Kinetic.Factory.addGetterSetter(Kinetic.Node,"skewY",0),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node,"offset",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Node,"offsetX",0),Kinetic.Factory.addGetterSetter(Kinetic.Node,"offsetY",0),Kinetic.Factory.addSetter(Kinetic.Node,"dragDistance"),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node,"dragDistance"),Kinetic.Factory.addSetter(Kinetic.Node,"width",0),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node,"width"),Kinetic.Factory.addSetter(Kinetic.Node,"height",0),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node,"height"),Kinetic.Factory.addGetterSetter(Kinetic.Node,"listening","inherit"),Kinetic.Factory.addGetterSetter(Kinetic.Node,"filters",void 0,function(a){return this._filterUpToDate=!1,a}),Kinetic.Factory.addGetterSetter(Kinetic.Node,"visible","inherit"),Kinetic.Factory.addGetterSetter(Kinetic.Node,"transformsEnabled","all"),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node,"size"),Kinetic.Factory.backCompat(Kinetic.Node,{rotateDeg:"rotate",setRotationDeg:"setRotation",getRotationDeg:"getRotation"}),Kinetic.Collection.mapMethods(Kinetic.Node)}(),function(){Kinetic.Filters.Grayscale=function(a){var b,c,d=a.data,e=d.length;for(b=0;e>b;b+=4)c=.34*d[b]+.5*d[b+1]+.16*d[b+2],d[b]=c,d[b+1]=c,d[b+2]=c}}(),function(){Kinetic.Filters.Brighten=function(a){var b,c=255*this.brightness(),d=a.data,e=d.length;for(b=0;e>b;b+=4)d[b]+=c,d[b+1]+=c,d[b+2]+=c},Kinetic.Factory.addGetterSetter(Kinetic.Node,"brightness",0,null,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Filters.Invert=function(a){var b,c=a.data,d=c.length;for(b=0;d>b;b+=4)c[b]=255-c[b],c[b+1]=255-c[b+1],c[b+2]=255-c[b+2]}}(),function(){function a(){this.r=0,this.g=0,this.b=0,this.a=0,this.next=null}function b(b,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D=b.data,E=b.width,F=b.height,G=e+e+1,H=E-1,I=F-1,J=e+1,K=J*(J+1)/2,L=new a,M=null,N=L,O=null,P=null,Q=c[e],R=d[e];for(h=1;G>h;h++)N=N.next=new a,h==J&&(M=N);for(N.next=L,l=k=0,g=0;F>g;g++){for(u=v=w=x=m=n=o=p=0,q=J*(y=D[k]),r=J*(z=D[k+1]),s=J*(A=D[k+2]),t=J*(B=D[k+3]),m+=K*y,n+=K*z,o+=K*A,p+=K*B,N=L,h=0;J>h;h++)N.r=y,N.g=z,N.b=A,N.a=B,N=N.next;for(h=1;J>h;h++)i=k+((h>H?H:h)<<2),m+=(N.r=y=D[i])*(C=J-h),n+=(N.g=z=D[i+1])*C,o+=(N.b=A=D[i+2])*C,p+=(N.a=B=D[i+3])*C,u+=y,v+=z,w+=A,x+=B,N=N.next;for(O=L,P=M,f=0;E>f;f++)D[k+3]=B=p*Q>>R,0!==B?(B=255/B,D[k]=(m*Q>>R)*B,D[k+1]=(n*Q>>R)*B,D[k+2]=(o*Q>>R)*B):D[k]=D[k+1]=D[k+2]=0,m-=q,n-=r,o-=s,p-=t,q-=O.r,r-=O.g,s-=O.b,t-=O.a,i=l+((i=f+e+1)<H?i:H)<<2,u+=O.r=D[i],v+=O.g=D[i+1],w+=O.b=D[i+2],x+=O.a=D[i+3],m+=u,n+=v,o+=w,p+=x,O=O.next,q+=y=P.r,r+=z=P.g,s+=A=P.b,t+=B=P.a,u-=y,v-=z,w-=A,x-=B,P=P.next,k+=4;l+=E}for(f=0;E>f;f++){for(v=w=x=u=n=o=p=m=0,k=f<<2,q=J*(y=D[k]),r=J*(z=D[k+1]),s=J*(A=D[k+2]),t=J*(B=D[k+3]),m+=K*y,n+=K*z,o+=K*A,p+=K*B,N=L,h=0;J>h;h++)N.r=y,N.g=z,N.b=A,N.a=B,N=N.next;for(j=E,h=1;e>=h;h++)k=j+f<<2,m+=(N.r=y=D[k])*(C=J-h),n+=(N.g=z=D[k+1])*C,o+=(N.b=A=D[k+2])*C,p+=(N.a=B=D[k+3])*C,u+=y,v+=z,w+=A,x+=B,N=N.next,I>h&&(j+=E);for(k=f,O=L,P=M,g=0;F>g;g++)i=k<<2,D[i+3]=B=p*Q>>R,B>0?(B=255/B,D[i]=(m*Q>>R)*B,D[i+1]=(n*Q>>R)*B,D[i+2]=(o*Q>>R)*B):D[i]=D[i+1]=D[i+2]=0,m-=q,n-=r,o-=s,p-=t,q-=O.r,r-=O.g,s-=O.b,t-=O.a,i=f+((i=g+J)<I?i:I)*E<<2,m+=u+=O.r=D[i],n+=v+=O.g=D[i+1],o+=w+=O.b=D[i+2],p+=x+=O.a=D[i+3],O=O.next,q+=y=P.r,r+=z=P.g,s+=A=P.b,t+=B=P.a,u-=y,v-=z,w-=A,x-=B,P=P.next,k+=E}}var c=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259],d=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];Kinetic.Filters.Blur=function(a){var c=Math.round(this.blurRadius());c>0&&b(a,c)},Kinetic.Factory.addGetterSetter(Kinetic.Node,"blurRadius",0,null,Kinetic.Factory.afterSetFilter)}(),function(){function a(a,b,c){var d=4*(c*a.width+b),e=[];return e.push(a.data[d++],a.data[d++],a.data[d++],a.data[d++]),e}function b(a,b){return Math.sqrt(Math.pow(a[0]-b[0],2)+Math.pow(a[1]-b[1],2)+Math.pow(a[2]-b[2],2))}function c(a){for(var b=[0,0,0],c=0;c<a.length;c++)b[0]+=a[c][0],b[1]+=a[c][1],b[2]+=a[c][2];return b[0]/=a.length,b[1]/=a.length,b[2]/=a.length,b}function d(d,e){var f=a(d,0,0),g=a(d,d.width-1,0),h=a(d,0,d.height-1),i=a(d,d.width-1,d.height-1),j=e||10;if(b(f,g)<j&&b(g,i)<j&&b(i,h)<j&&b(h,f)<j){for(var k=c([g,f,i,h]),l=[],m=0;m<d.width*d.height;m++){var n=b(k,[d.data[4*m],d.data[4*m+1],d.data[4*m+2]]);l[m]=j>n?0:255}return l}}function e(a,b){for(var c=0;c<a.width*a.height;c++)a.data[4*c+3]=b[c]}function f(a,b,c){for(var d=[1,1,1,1,0,1,1,1,1],e=Math.round(Math.sqrt(d.length)),f=Math.floor(e/2),g=[],h=0;c>h;h++)for(var i=0;b>i;i++){for(var j=h*b+i,k=0,l=0;e>l;l++)for(var m=0;e>m;m++){var n=h+l-f,o=i+m-f;if(n>=0&&c>n&&o>=0&&b>o){var p=n*b+o,q=d[l*e+m];k+=a[p]*q}}g[j]=2040===k?255:0}return g}function g(a,b,c){for(var d=[1,1,1,1,1,1,1,1,1],e=Math.round(Math.sqrt(d.length)),f=Math.floor(e/2),g=[],h=0;c>h;h++)for(var i=0;b>i;i++){for(var j=h*b+i,k=0,l=0;e>l;l++)for(var m=0;e>m;m++){var n=h+l-f,o=i+m-f;if(n>=0&&c>n&&o>=0&&b>o){var p=n*b+o,q=d[l*e+m];k+=a[p]*q}}g[j]=k>=1020?255:0}return g}function h(a,b,c){for(var d=[1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9],e=Math.round(Math.sqrt(d.length)),f=Math.floor(e/2),g=[],h=0;c>h;h++)for(var i=0;b>i;i++){for(var j=h*b+i,k=0,l=0;e>l;l++)for(var m=0;e>m;m++){var n=h+l-f,o=i+m-f;if(n>=0&&c>n&&o>=0&&b>o){var p=n*b+o,q=d[l*e+m];k+=a[p]*q}}g[j]=k}return g}Kinetic.Filters.Mask=function(a){var b=this.threshold(),c=d(a,b);return c&&(c=f(c,a.width,a.height),c=g(c,a.width,a.height),c=h(c,a.width,a.height),e(a,c)),a},Kinetic.Factory.addGetterSetter(Kinetic.Node,"threshold",0,null,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Filters.RGB=function(a){var b,c,d=a.data,e=d.length,f=this.red(),g=this.green(),h=this.blue();for(b=0;e>b;b+=4)c=(.34*d[b]+.5*d[b+1]+.16*d[b+2])/255,d[b]=c*f,d[b+1]=c*g,d[b+2]=c*h,d[b+3]=d[b+3]},Kinetic.Factory.addGetterSetter(Kinetic.Node,"red",0,function(a){return this._filterUpToDate=!1,a>255?255:0>a?0:Math.round(a)}),Kinetic.Factory.addGetterSetter(Kinetic.Node,"green",0,function(a){return this._filterUpToDate=!1,a>255?255:0>a?0:Math.round(a)}),Kinetic.Factory.addGetterSetter(Kinetic.Node,"blue",0,Kinetic.Validators.RGBComponent,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Filters.HSV=function(a){var b,c,d,e,f,g=a.data,h=g.length,i=Math.pow(2,this.value()),j=Math.pow(2,this.saturation()),k=Math.abs(this.hue()+360)%360,l=i*j*Math.cos(k*Math.PI/180),m=i*j*Math.sin(k*Math.PI/180),n=.299*i+.701*l+.167*m,o=.587*i-.587*l+.33*m,p=.114*i-.114*l-.497*m,q=.299*i-.299*l-.328*m,r=.587*i+.413*l+.035*m,s=.114*i-.114*l+.293*m,t=.299*i-.3*l+1.25*m,u=.587*i-.586*l-1.05*m,v=.114*i+.886*l-.2*m;for(b=0;h>b;b+=4)c=g[b+0],d=g[b+1],e=g[b+2],f=g[b+3],g[b+0]=n*c+o*d+p*e,g[b+1]=q*c+r*d+s*e,g[b+2]=t*c+u*d+v*e,g[b+3]=f},Kinetic.Factory.addGetterSetter(Kinetic.Node,"hue",0,null,Kinetic.Factory.afterSetFilter),Kinetic.Factory.addGetterSetter(Kinetic.Node,"saturation",0,null,Kinetic.Factory.afterSetFilter),Kinetic.Factory.addGetterSetter(Kinetic.Node,"value",0,null,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Factory.addGetterSetter(Kinetic.Node,"hue",0,null,Kinetic.Factory.afterSetFilter),Kinetic.Factory.addGetterSetter(Kinetic.Node,"saturation",0,null,Kinetic.Factory.afterSetFilter),Kinetic.Factory.addGetterSetter(Kinetic.Node,"luminance",0,null,Kinetic.Factory.afterSetFilter),Kinetic.Filters.HSL=function(a){var b,c,d,e,f,g=a.data,h=g.length,i=1,j=Math.pow(2,this.saturation()),k=Math.abs(this.hue()+360)%360,l=127*this.luminance(),m=i*j*Math.cos(k*Math.PI/180),n=i*j*Math.sin(k*Math.PI/180),o=.299*i+.701*m+.167*n,p=.587*i-.587*m+.33*n,q=.114*i-.114*m-.497*n,r=.299*i-.299*m-.328*n,s=.587*i+.413*m+.035*n,t=.114*i-.114*m+.293*n,u=.299*i-.3*m+1.25*n,v=.587*i-.586*m-1.05*n,w=.114*i+.886*m-.2*n;for(b=0;h>b;b+=4)c=g[b+0],d=g[b+1],e=g[b+2],f=g[b+3],g[b+0]=o*c+p*d+q*e+l,g[b+1]=r*c+s*d+t*e+l,g[b+2]=u*c+v*d+w*e+l,g[b+3]=f}}(),function(){Kinetic.Filters.Emboss=function(a){var b=10*this.embossStrength(),c=255*this.embossWhiteLevel(),d=this.embossDirection(),e=this.embossBlend(),f=0,g=0,h=a.data,i=a.width,j=a.height,k=4*i,l=j;switch(d){case"top-left":f=-1,g=-1;break;case"top":f=-1,g=0;break;case"top-right":f=-1,g=1;break;case"right":f=0,g=1;break;case"bottom-right":f=1,g=1;break;case"bottom":f=1,g=0;break;case"bottom-left":f=1,g=-1;break;case"left":f=0,g=-1}do{var m=(l-1)*k,n=f;1>l+n&&(n=0),l+n>j&&(n=0);var o=(l-1+n)*i*4,p=i;do{var q=m+4*(p-1),r=g;1>p+r&&(r=0),p+r>i&&(r=0);var s=o+4*(p-1+r),t=h[q]-h[s],u=h[q+1]-h[s+1],v=h[q+2]-h[s+2],w=t,x=w>0?w:-w,y=u>0?u:-u,z=v>0?v:-v;if(y>x&&(w=u),z>x&&(w=v),w*=b,e){var A=h[q]+w,B=h[q+1]+w,C=h[q+2]+w;h[q]=A>255?255:0>A?0:A,h[q+1]=B>255?255:0>B?0:B,h[q+2]=C>255?255:0>C?0:C}else{var D=c-w;0>D?D=0:D>255&&(D=255),h[q]=h[q+1]=h[q+2]=D}}while(--p)}while(--l)},Kinetic.Factory.addGetterSetter(Kinetic.Node,"embossStrength",.5,null,Kinetic.Factory.afterSetFilter),Kinetic.Factory.addGetterSetter(Kinetic.Node,"embossWhiteLevel",.5,null,Kinetic.Factory.afterSetFilter),Kinetic.Factory.addGetterSetter(Kinetic.Node,"embossDirection","top-left",null,Kinetic.Factory.afterSetFilter),Kinetic.Factory.addGetterSetter(Kinetic.Node,"embossBlend",!1,null,Kinetic.Factory.afterSetFilter)}(),function(){function a(a,b,c,d,e){var f,g=c-b,h=e-d;return 0===g?d+h/2:0===h?d:(f=(a-b)/g,f=h*f+d)}Kinetic.Filters.Enhance=function(b){var c,d,e,f,g=b.data,h=g.length,i=g[0],j=i,k=g[1],l=k,m=g[2],n=m,o=g[3],p=o,q=this.enhance();if(0!==q){for(f=0;h>f;f+=4)c=g[f+0],i>c?i=c:c>j&&(j=c),d=g[f+1],k>d?k=d:d>l&&(l=d),e=g[f+2],m>e?m=e:e>n&&(n=e);j===i&&(j=255,i=0),l===k&&(l=255,k=0),n===m&&(n=255,m=0),p===o&&(p=255,o=0);var r,s,t,u,v,w,x,y,z,A,B,C;for(q>0?(s=j+q*(255-j),t=i-q*(i-0),v=l+q*(255-l),w=k-q*(k-0),y=n+q*(255-n),C=m-q*(m-0),B=p+q*(255-p),z=o-q*(o-0)):(r=.5*(j+i),s=j+q*(j-r),t=i+q*(i-r),u=.5*(l+k),v=l+q*(l-u),w=k+q*(k-u),x=.5*(n+m),y=n+q*(n-x),C=m+q*(m-x),A=.5*(p+o),B=p+q*(p-A),z=o+q*(o-A)),f=0;h>f;f+=4)g[f+0]=a(g[f+0],i,j,t,s),g[f+1]=a(g[f+1],k,l,w,v),g[f+2]=a(g[f+2],m,n,C,y)}},Kinetic.Factory.addGetterSetter(Kinetic.Node,"enhance",0,null,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Filters.Posterize=function(a){var b,c=Math.round(254*this.levels())+1,d=a.data,e=d.length,f=255/c;for(b=0;e>b;b+=1)d[b]=Math.floor(d[b]/f)*f},Kinetic.Factory.addGetterSetter(Kinetic.Node,"levels",.5,null,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Filters.Noise=function(a){var b,c=255*this.noise(),d=a.data,e=d.length,f=c/2;for(b=0;e>b;b+=4)d[b+0]+=f-2*f*Math.random(),d[b+1]+=f-2*f*Math.random(),d[b+2]+=f-2*f*Math.random()},Kinetic.Factory.addGetterSetter(Kinetic.Node,"noise",.2,null,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Filters.Pixelate=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p=Math.ceil(this.pixelSize()),q=a.width,r=a.height,s=Math.ceil(q/p),t=Math.ceil(r/p);for(a=a.data,m=0;s>m;m+=1)for(n=0;t>n;n+=1){for(e=0,f=0,g=0,h=0,i=m*p,j=i+p,k=n*p,l=k+p,o=0,b=i;j>b;b+=1)if(!(b>=q))for(c=k;l>c;c+=1)c>=r||(d=4*(q*c+b),e+=a[d+0],f+=a[d+1],g+=a[d+2],h+=a[d+3],o+=1);for(e/=o,f/=o,g/=o,b=i;j>b;b+=1)if(!(b>=q))for(c=k;l>c;c+=1)c>=r||(d=4*(q*c+b),a[d+0]=e,a[d+1]=f,a[d+2]=g,a[d+3]=h)}},Kinetic.Factory.addGetterSetter(Kinetic.Node,"pixelSize",8,null,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Filters.Threshold=function(a){var b,c=255*this.threshold(),d=a.data,e=d.length;for(b=0;e>b;b+=1)d[b]=d[b]<c?0:255},Kinetic.Factory.addGetterSetter(Kinetic.Node,"threshold",.5,null,Kinetic.Factory.afterSetFilter)}(),function(){Kinetic.Filters.Sepia=function(a){var b,c,d,e,f,g,h,i,j,k=a.data,l=a.width,m=a.height,n=4*l;do{b=(m-1)*n,c=l;do d=b+4*(c-1),e=k[d],f=k[d+1],g=k[d+2],h=.393*e+.769*f+.189*g,i=.349*e+.686*f+.168*g,j=.272*e+.534*f+.131*g,k[d]=h>255?255:h,k[d+1]=i>255?255:i,k[d+2]=j>255?255:j,k[d+3]=k[d+3];while(--c)}while(--m)}}(),function(){Kinetic.Filters.Solarize=function(a){var b=a.data,c=a.width,d=a.height,e=4*c,f=d;do{var g=(f-1)*e,h=c;do{var i=g+4*(h-1),j=b[i],k=b[i+1],l=b[i+2];j>127&&(j=255-j),k>127&&(k=255-k),l>127&&(l=255-l),b[i]=j,b[i+1]=k,b[i+2]=l}while(--h)}while(--f)}}(),function(){var a=function(a,b,c){var d,e,f,g,h=a.data,i=b.data,j=a.width,k=a.height,l=c.polarCenterX||j/2,m=c.polarCenterY||k/2,n=0,o=0,p=0,q=0,r=Math.sqrt(l*l+m*m);e=j-l,f=k-m,g=Math.sqrt(e*e+f*f),r=g>r?g:r;var s,t,u,v,w=k,x=j,y=360/x*Math.PI/180;for(t=0;x>t;t+=1)for(u=Math.sin(t*y),v=Math.cos(t*y),s=0;w>s;s+=1)e=Math.floor(l+r*s/w*v),f=Math.floor(m+r*s/w*u),d=4*(f*j+e),n=h[d+0],o=h[d+1],p=h[d+2],q=h[d+3],d=4*(t+s*j),i[d+0]=n,i[d+1]=o,i[d+2]=p,i[d+3]=q},b=function(a,b,c){var d,e,f,g,h,i,j=a.data,k=b.data,l=a.width,m=a.height,n=c.polarCenterX||l/2,o=c.polarCenterY||m/2,p=0,q=0,r=0,s=0,t=Math.sqrt(n*n+o*o);e=l-n,f=m-o,i=Math.sqrt(e*e+f*f),t=i>t?i:t;var u,v,w,x,y=m,z=l,A=c.polarRotation||0;for(e=0;l>e;e+=1)for(f=0;m>f;f+=1)g=e-n,h=f-o,u=Math.sqrt(g*g+h*h)*y/t,v=(180*Math.atan2(h,g)/Math.PI+360+A)%360,v=v*z/360,w=Math.floor(v),x=Math.floor(u),d=4*(x*l+w),p=j[d+0],q=j[d+1],r=j[d+2],s=j[d+3],d=4*(f*l+e),k[d+0]=p,k[d+1]=q,k[d+2]=r,k[d+3]=s},c=Kinetic.Util.createCanvasElement();Kinetic.Filters.Kaleidoscope=function(d){var e,f,g,h,i,j,k,l,m,n,o=d.width,p=d.height,q=Math.round(this.kaleidoscopePower()),r=Math.round(this.kaleidoscopeAngle()),s=Math.floor(o*(r%360)/360);if(!(1>q)){c.width=o,c.height=p;var t=c.getContext("2d").getImageData(0,0,o,p);a(d,t,{polarCenterX:o/2,polarCenterY:p/2});for(var u=o/Math.pow(2,q);8>=u;)u=2*u,q-=1;u=Math.ceil(u);var v=u,w=0,x=v,y=1;for(s+u>o&&(w=v,x=0,y=-1),f=0;p>f;f+=1)for(e=w;e!==x;e+=y)g=Math.round(e+s)%o,m=4*(o*f+g),i=t.data[m+0],j=t.data[m+1],k=t.data[m+2],l=t.data[m+3],n=4*(o*f+e),t.data[n+0]=i,t.data[n+1]=j,t.data[n+2]=k,t.data[n+3]=l;for(f=0;p>f;f+=1)for(v=Math.floor(u),h=0;q>h;h+=1){for(e=0;v+1>e;e+=1)m=4*(o*f+e),i=t.data[m+0],j=t.data[m+1],k=t.data[m+2],l=t.data[m+3],n=4*(o*f+2*v-e-1),t.data[n+0]=i,t.data[n+1]=j,t.data[n+2]=k,t.data[n+3]=l;v*=2}b(t,d,{polarRotation:0})}},Kinetic.Factory.addGetterSetter(Kinetic.Node,"kaleidoscopePower",2,null,Kinetic.Factory.afterSetFilter),Kinetic.Factory.addGetterSetter(Kinetic.Node,"kaleidoscopeAngle",0,null,Kinetic.Factory.afterSetFilter)}(),function(){function a(a){Kinetic.root.setTimeout(a,1e3/60)}function b(){return e.apply(Kinetic.root,arguments)}var c=500,d=function(){return Kinetic.root.performance&&Kinetic.root.performance.now?function(){return Kinetic.root.performance.now()}:function(){return(new Date).getTime()}}(),e=function(){return Kinetic.root.requestAnimationFrame||Kinetic.root.webkitRequestAnimationFrame||Kinetic.root.mozRequestAnimationFrame||Kinetic.root.oRequestAnimationFrame||Kinetic.root.msRequestAnimationFrame||a}();Kinetic.Animation=function(a,b){var c=Kinetic.Animation;this.func=a,this.setLayers(b),this.id=c.animIdCounter++,this.frame={time:0,timeDiff:0,lastTime:d()}},Kinetic.Animation.prototype={setLayers:function(a){var b=[];b=a?a.length>0?a:[a]:[],this.layers=b},getLayers:function(){return this.layers},addLayer:function(a){var b,c,d=this.layers;if(d){for(b=d.length,c=0;b>c;c++)if(d[c]._id===a._id)return!1}else this.layers=[];return this.layers.push(a),!0},isRunning:function(){var a,b=Kinetic.Animation,c=b.animations,d=c.length;for(a=0;d>a;a++)if(c[a].id===this.id)return!0;return!1},start:function(){var a=Kinetic.Animation;this.stop(),this.frame.timeDiff=0,this.frame.lastTime=d(),a._addAnimation(this)},stop:function(){Kinetic.Animation._removeAnimation(this)},_updateFrameObject:function(a){this.frame.timeDiff=a-this.frame.lastTime,this.frame.lastTime=a,this.frame.time+=this.frame.timeDiff,this.frame.frameRate=1e3/this.frame.timeDiff}},Kinetic.Animation.animations=[],Kinetic.Animation.animIdCounter=0,Kinetic.Animation.animRunning=!1,Kinetic.Animation._addAnimation=function(a){this.animations.push(a),this._handleAnimation()},Kinetic.Animation._removeAnimation=function(a){var b,c=a.id,d=this.animations,e=d.length;for(b=0;e>b;b++)if(d[b].id===c){this.animations.splice(b,1);break}},Kinetic.Animation._runFrames=function(){var a,b,c,e,f,g,h,i,j={},k=this.animations;for(e=0;e<k.length;e++){for(a=k[e],b=a.layers,c=a.func,a._updateFrameObject(d()),g=b.length,f=0;g>f;f++)h=b[f],void 0!==h._id&&(j[h._id]=h);c&&c.call(a,a.frame)}for(i in j)j[i].draw()},Kinetic.Animation._animationLoop=function(){var a=Kinetic.Animation;a.animations.length?(b(a._animationLoop),a._runFrames()):a.animRunning=!1},Kinetic.Animation._handleAnimation=function(){var a=this;this.animRunning||(this.animRunning=!0,a._animationLoop())};var f=Kinetic.Node.prototype.moveTo;Kinetic.Node.prototype.moveTo=function(a){f.call(this,a)},Kinetic.Layer.prototype.batchDraw=function(){var a=this,b=Kinetic.Animation;this.batchAnim||(this.batchAnim=new b(function(){a.lastBatchDrawTime&&d()-a.lastBatchDrawTime>c&&a.batchAnim.stop()},this)),this.lastBatchDrawTime=d(),this.batchAnim.isRunning()||(this.draw(),this.batchAnim.start())},Kinetic.Stage.prototype.batchDraw=function(){this.getChildren().each(function(a){a.batchDraw()})}}((1,eval)("this")),function(){var a={node:1,duration:1,easing:1,onFinish:1,yoyo:1},b=1,c=2,d=3,e=0;Kinetic.Tween=function(b){var c,d=this,g=b.node,h=g._id,i=b.duration||1,j=b.easing||Kinetic.Easings.Linear,k=!!b.yoyo;this.node=g,this._id=e++,this.anim=new Kinetic.Animation(function(){d.tween.onEnterFrame()},g.getLayer()),this.tween=new f(c,function(a){d._tweenFunc(a)},j,0,1,1e3*i,k),this._addListeners(),Kinetic.Tween.attrs[h]||(Kinetic.Tween.attrs[h]={}),Kinetic.Tween.attrs[h][this._id]||(Kinetic.Tween.attrs[h][this._id]={}),Kinetic.Tween.tweens[h]||(Kinetic.Tween.tweens[h]={});for(c in b)void 0===a[c]&&this._addAttr(c,b[c]);this.reset(),this.onFinish=b.onFinish,this.onReset=b.onReset},Kinetic.Tween.attrs={},Kinetic.Tween.tweens={},Kinetic.Tween.prototype={_addAttr:function(a,b){var c,d,e,f,g,h=this.node,i=h._id;if(e=Kinetic.Tween.tweens[i][a],e&&delete Kinetic.Tween.attrs[i][e][a],c=h.getAttr(a),Kinetic.Util._isArray(b))for(d=[],g=b.length,f=0;g>f;f++)d.push(b[f]-c[f]);else d=b-c;Kinetic.Tween.attrs[i][this._id][a]={start:c,diff:d},Kinetic.Tween.tweens[i][a]=this._id},_tweenFunc:function(a){var b,c,d,e,f,g,h,i=this.node,j=Kinetic.Tween.attrs[i._id][this._id];for(b in j){if(c=j[b],d=c.start,e=c.diff,Kinetic.Util._isArray(d))for(f=[],h=d.length,g=0;h>g;g++)f.push(d[g]+e[g]*a);else f=d+e*a;i.setAttr(b,f)}},_addListeners:function(){var a=this;this.tween.onPlay=function(){a.anim.start()},this.tween.onReverse=function(){a.anim.start()},this.tween.onPause=function(){a.anim.stop()},this.tween.onFinish=function(){a.onFinish&&a.onFinish()},this.tween.onReset=function(){a.onReset&&a.onReset()}},play:function(){return this.tween.play(),this},reverse:function(){return this.tween.reverse(),this},reset:function(){this.node;return this.tween.reset(),this},seek:function(a){this.node;return this.tween.seek(1e3*a),this},pause:function(){return this.tween.pause(),this},finish:function(){this.node;return this.tween.finish(),this},destroy:function(){var a,b=this.node._id,c=this._id,d=Kinetic.Tween.tweens[b];this.pause();for(a in d)delete Kinetic.Tween.tweens[b][a];delete Kinetic.Tween.attrs[b][c]}};var f=function(a,b,c,d,e,f,g){this.prop=a,this.propFunc=b,this.begin=d,this._pos=d,this.duration=f,this._change=0,this.prevPos=0,this.yoyo=g,this._time=0,this._position=0,this._startTime=0,this._finish=0,this.func=c,this._change=e-this.begin,this.pause()};f.prototype={fire:function(a){var b=this[a];b&&b()},setTime:function(a){a>this.duration?this.yoyo?(this._time=this.duration,this.reverse()):this.finish():0>a?this.yoyo?(this._time=0,this.play()):this.reset():(this._time=a,this.update())},getTime:function(){return this._time},setPosition:function(a){this.prevPos=this._pos,this.propFunc(a),this._pos=a},getPosition:function(a){return void 0===a&&(a=this._time),this.func(a,this.begin,this._change,this.duration)},play:function(){this.state=c,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onPlay")},reverse:function(){this.state=d,this._time=this.duration-this._time,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onReverse")},seek:function(a){this.pause(),this._time=a,this.update(),this.fire("onSeek")},reset:function(){this.pause(),this._time=0,this.update(),this.fire("onReset")},finish:function(){this.pause(),this._time=this.duration,this.update(),this.fire("onFinish")},update:function(){this.setPosition(this.getPosition(this._time))},onEnterFrame:function(){var a=this.getTimer()-this._startTime;this.state===c?this.setTime(a):this.state===d&&this.setTime(this.duration-a)},pause:function(){this.state=b,this.fire("onPause")},getTimer:function(){return(new Date).getTime()}},Kinetic.Easings={BackEaseIn:function(a,b,c,d){var e=1.70158;return c*(a/=d)*a*((e+1)*a-e)+b},BackEaseOut:function(a,b,c,d){var e=1.70158;return c*((a=a/d-1)*a*((e+1)*a+e)+1)+b},BackEaseInOut:function(a,b,c,d){var e=1.70158;return(a/=d/2)<1?c/2*a*a*(((e*=1.525)+1)*a-e)+b:c/2*((a-=2)*a*(((e*=1.525)+1)*a+e)+2)+b},ElasticEaseIn:function(a,b,c,d,e,f){var g=0;return 0===a?b:1==(a/=d)?b+c:(f||(f=.3*d),!e||e<Math.abs(c)?(e=c,g=f/4):g=f/(2*Math.PI)*Math.asin(c/e),-(e*Math.pow(2,10*(a-=1))*Math.sin(2*(a*d-g)*Math.PI/f))+b)},ElasticEaseOut:function(a,b,c,d,e,f){var g=0;return 0===a?b:1==(a/=d)?b+c:(f||(f=.3*d),!e||e<Math.abs(c)?(e=c,g=f/4):g=f/(2*Math.PI)*Math.asin(c/e),e*Math.pow(2,-10*a)*Math.sin(2*(a*d-g)*Math.PI/f)+c+b)},ElasticEaseInOut:function(a,b,c,d,e,f){var g=0;return 0===a?b:2==(a/=d/2)?b+c:(f||(f=.3*d*1.5),!e||e<Math.abs(c)?(e=c,g=f/4):g=f/(2*Math.PI)*Math.asin(c/e),1>a?-.5*e*Math.pow(2,10*(a-=1))*Math.sin(2*(a*d-g)*Math.PI/f)+b:e*Math.pow(2,-10*(a-=1))*Math.sin(2*(a*d-g)*Math.PI/f)*.5+c+b)},BounceEaseOut:function(a,b,c,d){return(a/=d)<1/2.75?7.5625*c*a*a+b:2/2.75>a?c*(7.5625*(a-=1.5/2.75)*a+.75)+b:2.5/2.75>a?c*(7.5625*(a-=2.25/2.75)*a+.9375)+b:c*(7.5625*(a-=2.625/2.75)*a+.984375)+b},BounceEaseIn:function(a,b,c,d){return c-Kinetic.Easings.BounceEaseOut(d-a,0,c,d)+b},BounceEaseInOut:function(a,b,c,d){return d/2>a?.5*Kinetic.Easings.BounceEaseIn(2*a,0,c,d)+b:.5*Kinetic.Easings.BounceEaseOut(2*a-d,0,c,d)+.5*c+b},EaseIn:function(a,b,c,d){return c*(a/=d)*a+b},EaseOut:function(a,b,c,d){return-c*(a/=d)*(a-2)+b},EaseInOut:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b},StrongEaseIn:function(a,b,c,d){return c*(a/=d)*a*a*a*a+b},StrongEaseOut:function(a,b,c,d){return c*((a=a/d-1)*a*a*a*a+1)+b},StrongEaseInOut:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a*a+b:c/2*((a-=2)*a*a*a*a+2)+b},Linear:function(a,b,c,d){return c*a/d+b}}}(),function(){Kinetic.DD={anim:new Kinetic.Animation,isDragging:!1,offset:{x:0,y:0},node:null,_drag:function(a){var b=Kinetic.DD,c=b.node;if(c){if(!b.isDragging){var d=c.getStage().getPointerPosition(),e=c.dragDistance(),f=Math.max(Math.abs(d.x-b.startPointerPos.x),Math.abs(d.y-b.startPointerPos.y));if(e>f)return}c._setDragPosition(a),b.isDragging||(b.isDragging=!0,c.fire("dragstart",{type:"dragstart",target:c,evt:a},!0)),c.fire("dragmove",{type:"dragmove",target:c,evt:a},!0)}},_endDragBefore:function(a){var b,c,d=Kinetic.DD,e=d.node;e&&(b=e.nodeType,c=e.getLayer(),d.anim.stop(),d.isDragging&&(d.isDragging=!1,Kinetic.listenClickTap=!1,a&&(a.dragEndNode=e)),delete d.node,(c||e).draw())},_endDragAfter:function(a){a=a||{};var b=a.dragEndNode;a&&b&&b.fire("dragend",{type:"dragend",target:b,evt:a},!0)}},Kinetic.Node.prototype.startDrag=function(){var a=Kinetic.DD,b=this.getStage(),c=this.getLayer(),d=b.getPointerPosition(),e=this.getAbsolutePosition();d&&(a.node&&a.node.stopDrag(),a.node=this,a.startPointerPos=d,a.offset.x=d.x-e.x,a.offset.y=d.y-e.y,a.anim.setLayers(c||this.getLayers()),a.anim.start(),this._setDragPosition())},Kinetic.Node.prototype._setDragPosition=function(a){var b=Kinetic.DD,c=this.getStage().getPointerPosition(),d=this.getDragBoundFunc();if(c){var e={x:c.x-b.offset.x,y:c.y-b.offset.y};void 0!==d&&(e=d.call(this,e,a)),this.setAbsolutePosition(e)}},Kinetic.Node.prototype.stopDrag=function(){var a=Kinetic.DD,b={};a._endDragBefore(b),a._endDragAfter(b)},Kinetic.Node.prototype.setDraggable=function(a){this._setAttr("draggable",a),this._dragChange()};var a=Kinetic.Node.prototype.destroy;Kinetic.Node.prototype.destroy=function(){var b=Kinetic.DD;b.node&&b.node._id===this._id&&this.stopDrag(),a.call(this)},Kinetic.Node.prototype.isDragging=function(){var a=Kinetic.DD;return a.node&&a.node._id===this._id&&a.isDragging},Kinetic.Node.prototype._listenDrag=function(){var a=this;this._dragCleanup(),"Stage"===this.getClassName()?this.on("contentMousedown.kinetic contentTouchstart.kinetic",function(b){Kinetic.DD.node||a.startDrag(b)}):this.on("mousedown.kinetic touchstart.kinetic",function(b){Kinetic.DD.node||a.startDrag(b)})},Kinetic.Node.prototype._dragChange=function(){if(this.attrs.draggable)this._listenDrag();else{this._dragCleanup();var a=this.getStage(),b=Kinetic.DD;a&&b.node&&b.node._id===this._id&&b.node.stopDrag()}},Kinetic.Node.prototype._dragCleanup=function(){"Stage"===this.getClassName()?(this.off("contentMousedown.kinetic"),this.off("contentTouchstart.kinetic")):(this.off("mousedown.kinetic"),this.off("touchstart.kinetic"))},Kinetic.Factory.addGetterSetter(Kinetic.Node,"dragBoundFunc"),Kinetic.Factory.addGetter(Kinetic.Node,"draggable",!1),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node,"draggable");var b=Kinetic.document.documentElement;b.addEventListener("mouseup",Kinetic.DD._endDragBefore,!0),b.addEventListener("touchend",Kinetic.DD._endDragBefore,!0),b.addEventListener("mouseup",Kinetic.DD._endDragAfter,!1),b.addEventListener("touchend",Kinetic.DD._endDragAfter,!1)}(),function(){Kinetic.Util.addMethods(Kinetic.Container,{__init:function(a){this.children=new Kinetic.Collection,Kinetic.Node.call(this,a)},getChildren:function(a){if(a){var b=new Kinetic.Collection;return this.children.each(function(c){a(c)&&b.push(c)}),b}return this.children},hasChildren:function(){return this.getChildren().length>0},removeChildren:function(){for(var a,b=Kinetic.Collection.toCollection(this.children),c=0;c<b.length;c++)a=b[c],delete a.parent,a.index=0,a.hasChildren()&&a.removeChildren(),a.remove();return b=null,this.children=new Kinetic.Collection,this},destroyChildren:function(){for(var a,b=Kinetic.Collection.toCollection(this.children),c=0;c<b.length;c++)a=b[c],delete a.parent,a.index=0,a.destroy();return b=null,this.children=new Kinetic.Collection,this},add:function(a){if(!(arguments.length>1)){if(a.getParent())return void a.moveTo(this);var b=this.children;return this._validateAdd(a),a.index=b.length,a.parent=this,b.push(a),this._fire("add",{child:a}),this}for(var c=0;c<arguments.length;c++)this.add(arguments[c])},destroy:function(){this.hasChildren()&&this.destroyChildren(),Kinetic.Node.prototype.destroy.call(this)},find:function(a){var b,c,d,e,f,g,h,i=[],j=a.replace(/ /g,"").split(","),k=j.length;for(b=0;k>b;b++)if(d=j[b],"#"===d.charAt(0))f=this._getNodeById(d.slice(1)),f&&i.push(f);else if("."===d.charAt(0))e=this._getNodesByName(d.slice(1)),i=i.concat(e);else for(g=this.getChildren(),h=g.length,c=0;h>c;c++)i=i.concat(g[c]._get(d));return Kinetic.Collection.toCollection(i)},_getNodeById:function(a){var b=Kinetic.ids[a];return void 0!==b&&this.isAncestorOf(b)?b:null},_getNodesByName:function(a){var b=Kinetic.names[a]||[];return this._getDescendants(b)},_get:function(a){for(var b=Kinetic.Node.prototype._get.call(this,a),c=this.getChildren(),d=c.length,e=0;d>e;e++)b=b.concat(c[e]._get(a));return b},toObject:function(){var a=Kinetic.Node.prototype.toObject.call(this);a.children=[];for(var b=this.getChildren(),c=b.length,d=0;c>d;d++){var e=b[d];a.children.push(e.toObject())}return a},_getDescendants:function(a){for(var b=[],c=a.length,d=0;c>d;d++){var e=a[d];this.isAncestorOf(e)&&b.push(e)}return b},isAncestorOf:function(a){for(var b=a.getParent();b;){if(b._id===this._id)return!0;b=b.getParent()}return!1},clone:function(a){var b=Kinetic.Node.prototype.clone.call(this,a);return this.getChildren().each(function(a){b.add(a.clone())}),b},getAllIntersections:function(a){var b=[];return this.find("Shape").each(function(c){c.isVisible()&&c.intersects(a)&&b.push(c)}),b},_setChildrenIndices:function(){this.children.each(function(a,b){a.index=b})},drawScene:function(a,b){var c=this.getLayer(),d=a||c&&c.getCanvas(),e=d&&d.getContext(),f=this._cache.canvas,g=f&&f.scene;return this.isVisible()&&(g?this._drawCachedSceneCanvas(e):this._drawChildren(d,"drawScene",b)),this
},drawHit:function(a,b){var c=this.getLayer(),d=a||c&&c.hitCanvas,e=d&&d.getContext(),f=this._cache.canvas,g=f&&f.hit;return this.shouldDrawHit()&&(g?this._drawCachedHitCanvas(e):this._drawChildren(d,"drawHit",b)),this},_drawChildren:function(a,b,c){var d,e,f=this.getLayer(),g=a&&a.getContext(),h=this.getClipWidth(),i=this.getClipHeight(),j=h&&i;j&&f&&(d=this.getClipX(),e=this.getClipY(),g.save(),f._applyTransform(this,g),g.beginPath(),g.rect(d,e,h,i),g.clip(),g.reset()),this.children.each(function(d){d[b](a,c)}),j&&g.restore()}}),Kinetic.Util.extend(Kinetic.Container,Kinetic.Node),Kinetic.Container.prototype.get=Kinetic.Container.prototype.find,Kinetic.Factory.addComponentsGetterSetter(Kinetic.Container,"clip",["x","y","width","height"]),Kinetic.Factory.addGetterSetter(Kinetic.Container,"clipX"),Kinetic.Factory.addGetterSetter(Kinetic.Container,"clipY"),Kinetic.Factory.addGetterSetter(Kinetic.Container,"clipWidth"),Kinetic.Factory.addGetterSetter(Kinetic.Container,"clipHeight"),Kinetic.Collection.mapMethods(Kinetic.Container)}(),function(){function a(a){a.fill()}function b(a){a.stroke()}function c(a){a.fill()}function d(a){a.stroke()}function e(){this._clearCache(f)}var f="hasShadow";Kinetic.Util.addMethods(Kinetic.Shape,{__init:function(f){this.nodeType="Shape",this._fillFunc=a,this._strokeFunc=b,this._fillFuncHit=c,this._strokeFuncHit=d;for(var g,h=Kinetic.shapes;;)if(g=Kinetic.Util.getRandomColor(),g&&!(g in h))break;this.colorKey=g,h[g]=this,Kinetic.Node.call(this,f),this.on("shadowColorChange.kinetic shadowBlurChange.kinetic shadowOffsetChange.kinetic shadowOpacityChange.kinetic shadowEnabledChange.kinetic",e)},hasChildren:function(){return!1},getChildren:function(){return[]},getContext:function(){return this.getLayer().getContext()},getCanvas:function(){return this.getLayer().getCanvas()},hasShadow:function(){return this._getCache(f,this._hasShadow)},_hasShadow:function(){return this.getShadowEnabled()&&0!==this.getShadowOpacity()&&!!(this.getShadowColor()||this.getShadowBlur()||this.getShadowOffsetX()||this.getShadowOffsetY())},hasFill:function(){return!!(this.getFill()||this.getFillPatternImage()||this.getFillLinearGradientColorStops()||this.getFillRadialGradientColorStops())},hasStroke:function(){return!!(this.stroke()||this.strokeRed()||this.strokeGreen()||this.strokeBlue())},_get:function(a){return this.className===a||this.nodeType===a?[this]:[]},intersects:function(a){var b,c=this.getStage(),d=c.bufferHitCanvas;return d.getContext().clear(),this.drawScene(d),b=d.context.getImageData(Math.round(a.x),Math.round(a.y),1,1).data,b[3]>0},destroy:function(){Kinetic.Node.prototype.destroy.call(this),delete Kinetic.shapes[this.colorKey]},_useBufferCanvas:function(){return(this.hasShadow()||1!==this.getAbsoluteOpacity())&&this.hasFill()&&this.hasStroke()&&this.getStage()},drawScene:function(a,b){var c,d,e,f=this.getLayer(),g=a||f.getCanvas(),h=g.getContext(),i=this._cache.canvas,j=this.sceneFunc(),k=this.hasShadow();return this.isVisible()&&(i?this._drawCachedSceneCanvas(h):j&&(h.save(),this._useBufferCanvas()?(c=this.getStage(),d=c.bufferCanvas,e=d.getContext(),e.clear(),e.save(),e._applyLineJoin(this),f._applyTransform(this,e,b),j.call(this,e),e.restore(),k&&(h.save(),h._applyShadow(this),h.drawImage(d._canvas,0,0),h.restore()),h._applyOpacity(this),h.drawImage(d._canvas,0,0)):(h._applyLineJoin(this),f._applyTransform(this,h,b),k&&(h.save(),h._applyShadow(this),j.call(this,h),h.restore()),h._applyOpacity(this),j.call(this,h)),h.restore())),this},drawHit:function(a,b){var c=this.getLayer(),d=a||c.hitCanvas,e=d.getContext(),f=this.hitFunc()||this.sceneFunc(),g=this._cache.canvas,h=g&&g.hit;return this.shouldDrawHit()&&(h?this._drawCachedHitCanvas(e):f&&(e.save(),e._applyLineJoin(this),c._applyTransform(this,e,b),f.call(this,e),e.restore())),this},drawHitFromCache:function(a){var b,c,d,e,f,g,h,i,j=a||0,k=this._cache.canvas,l=this._getCachedSceneCanvas(),m=l.getContext(),n=k.hit,o=n.getContext(),p=l.getWidth(),q=l.getHeight();o.clear();try{for(b=m.getImageData(0,0,p,q),c=b.data,d=o.getImageData(0,0,p,q),e=d.data,f=c.length,g=Kinetic.Util._hexToRgb(this.colorKey),h=0;f>h;h+=4)i=c[h+3],i>j&&(e[h]=g.r,e[h+1]=g.g,e[h+2]=g.b,e[h+3]=255);o.putImageData(d,0,0)}catch(r){Kinetic.Util.warn("Unable to draw hit graph from cached scene canvas. "+r.message)}return this}}),Kinetic.Util.extend(Kinetic.Shape,Kinetic.Node),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"stroke"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"strokeRed",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"strokeGreen",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"strokeBlue",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"strokeAlpha",1,Kinetic.Validators.alphaComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"strokeWidth",2),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"lineJoin"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"lineCap"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"sceneFunc"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"hitFunc"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"dash"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowColor"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowRed",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowGreen",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowBlue",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowAlpha",1,Kinetic.Validators.alphaComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowBlur"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowOpacity"),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape,"shadowOffset",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowOffsetX",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowOffsetY",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternImage"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fill"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillRed",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillGreen",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillBlue",0,Kinetic.Validators.RGBComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillAlpha",1,Kinetic.Validators.alphaComponent),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternX",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternY",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillLinearGradientColorStops"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillRadialGradientStartRadius",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillRadialGradientEndRadius",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillRadialGradientColorStops"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternRepeat","repeat"),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillEnabled",!0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"strokeEnabled",!0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"shadowEnabled",!0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"dashEnabled",!0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"strokeScaleEnabled",!0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPriority","color"),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape,"fillPatternOffset",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternOffsetX",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternOffsetY",0),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape,"fillPatternScale",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternScaleX",1),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternScaleY",1),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape,"fillLinearGradientStartPoint",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillLinearGradientStartPointX",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillLinearGradientStartPointY",0),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape,"fillLinearGradientEndPoint",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillLinearGradientEndPointX",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillLinearGradientEndPointY",0),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape,"fillRadialGradientStartPoint",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillRadialGradientStartPointX",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillRadialGradientStartPointY",0),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape,"fillRadialGradientEndPoint",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillRadialGradientEndPointX",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillRadialGradientEndPointY",0),Kinetic.Factory.addGetterSetter(Kinetic.Shape,"fillPatternRotation",0),Kinetic.Factory.backCompat(Kinetic.Shape,{dashArray:"dash",getDashArray:"getDash",setDashArray:"getDash",drawFunc:"sceneFunc",getDrawFunc:"getSceneFunc",setDrawFunc:"setSceneFunc",drawHitFunc:"hitFunc",getDrawHitFunc:"getHitFunc",setDrawHitFunc:"setHitFunc"}),Kinetic.Collection.mapMethods(Kinetic.Shape)}(),function(){function a(a,b){a.content.addEventListener(b,function(c){a[I+b](c)},!1)}var b="Stage",c="string",d="px",e="mouseout",f="mouseleave",g="mouseover",h="mouseenter",i="mousemove",j="mousedown",k="mouseup",l="click",m="dblclick",n="touchstart",o="touchend",p="tap",q="dbltap",r="touchmove",s="contentMouseout",t="contentMouseover",u="contentMousemove",v="contentMousedown",w="contentMouseup",x="contentClick",y="contentDblclick",z="contentTouchstart",A="contentTouchend",B="contentDbltap",C="contentTouchmove",D="div",E="relative",F="inline-block",G="kineticjs-content",H=" ",I="_",J="container",K="",L=[j,i,k,e,n,r,o,g],M=L.length;Kinetic.Util.addMethods(Kinetic.Stage,{___init:function(a){this.nodeType=b,Kinetic.Container.call(this,a),this._id=Kinetic.idCounter++,this._buildDOM(),this._bindContentEvents(),this._enableNestedTransforms=!1,Kinetic.stages.push(this)},_validateAdd:function(a){"Layer"!==a.getType()&&Kinetic.Util.error("You may only add layers to the stage.")},setContainer:function(a){if(typeof a===c){var b=a;if(a=Kinetic.document.getElementById(a),!a)throw"Can not find container in document with id "+b}return this._setAttr(J,a),this},shouldDrawHit:function(){return!0},draw:function(){return Kinetic.Node.prototype.draw.call(this),this},setHeight:function(a){return Kinetic.Node.prototype.setHeight.call(this,a),this._resizeDOM(),this},setWidth:function(a){return Kinetic.Node.prototype.setWidth.call(this,a),this._resizeDOM(),this},clear:function(){var a,b=this.children,c=b.length;for(a=0;c>a;a++)b[a].clear();return this},clone:function(a){return a||(a={}),a.container=Kinetic.document.createElement(D),Kinetic.Container.prototype.clone.call(this,a)},destroy:function(){var a=this.content;Kinetic.Container.prototype.destroy.call(this),a&&Kinetic.Util._isInDocument(a)&&this.getContainer().removeChild(a);var b=Kinetic.stages.indexOf(this);b>-1&&Kinetic.stages.splice(b,1)},getPointerPosition:function(){return this.pointerPos},getStage:function(){return this},getContent:function(){return this.content},toDataURL:function(a){function b(e){var f=i[e],j=f.toDataURL(),k=new Kinetic.window.Image;k.onload=function(){h.drawImage(k,0,0),e<i.length-1?b(e+1):a.callback(g.toDataURL(c,d))},k.src=j}a=a||{};var c=a.mimeType||null,d=a.quality||null,e=a.x||0,f=a.y||0,g=new Kinetic.SceneCanvas({width:a.width||this.getWidth(),height:a.height||this.getHeight(),pixelRatio:1}),h=g.getContext()._context,i=this.children;(e||f)&&h.translate(-1*e,-1*f),b(0)},toImage:function(a){var b=a.callback;a.callback=function(a){Kinetic.Util._getImage(a,function(a){b(a)})},this.toDataURL(a)},getIntersection:function(a){var b,c,d=this.getChildren(),e=d.length,f=e-1;for(b=f;b>=0;b--)if(c=d[b].getIntersection(a))return c;return null},_resizeDOM:function(){if(this.content){var a,b,c=this.getWidth(),e=this.getHeight(),f=this.getChildren(),g=f.length;for(this.content.style.width=c+d,this.content.style.height=e+d,this.bufferCanvas.setSize(c,e),this.bufferHitCanvas.setSize(c,e),a=0;g>a;a++)b=f[a],b.getCanvas().setSize(c,e),b.hitCanvas.setSize(c,e),b.draw()}},add:function(a){if(!(arguments.length>1))return Kinetic.Container.prototype.add.call(this,a),a._setCanvasSize(this.width(),this.height()),a.draw(),this.content.appendChild(a.canvas._canvas),this;for(var b=0;b<arguments.length;b++)this.add(arguments[b])},getParent:function(){return null},getLayer:function(){return null},getLayers:function(){return this.getChildren()},_bindContentEvents:function(){for(var b=0;M>b;b++)a(this,L[b])},_mouseover:function(a){Kinetic.UA.mobile||(this._setPointerPosition(a),this._fire(t,{evt:a}))},_mouseout:function(a){if(!Kinetic.UA.mobile){this._setPointerPosition(a);var b=this.targetShape;b&&!Kinetic.isDragging()&&(b._fireAndBubble(e,{evt:a}),b._fireAndBubble(f,{evt:a}),this.targetShape=null),this.pointerPos=void 0,this._fire(s,{evt:a})}},_mousemove:function(a){if(!Kinetic.UA.mobile){this._setPointerPosition(a);var b=Kinetic.DD,c=this.getIntersection(this.getPointerPosition());c&&c.isListening()?Kinetic.isDragging()||this.targetShape&&this.targetShape._id===c._id?c._fireAndBubble(i,{evt:a}):(this.targetShape&&(this.targetShape._fireAndBubble(e,{evt:a},c),this.targetShape._fireAndBubble(f,{evt:a},c)),c._fireAndBubble(g,{evt:a},this.targetShape),c._fireAndBubble(h,{evt:a},this.targetShape),this.targetShape=c):this.targetShape&&!Kinetic.isDragging()&&(this.targetShape._fireAndBubble(e,{evt:a}),this.targetShape._fireAndBubble(f,{evt:a}),this.targetShape=null),this._fire(u,{evt:a}),b&&b._drag(a)}a.preventDefault&&a.preventDefault()},_mousedown:function(a){if(!Kinetic.UA.mobile){this._setPointerPosition(a);var b=this.getIntersection(this.getPointerPosition());Kinetic.listenClickTap=!0,b&&b.isListening()&&(this.clickStartShape=b,b._fireAndBubble(j,{evt:a})),this._fire(v,{evt:a})}a.preventDefault&&a.preventDefault()},_mouseup:function(a){if(!Kinetic.UA.mobile){this._setPointerPosition(a);var b=this.getIntersection(this.getPointerPosition()),c=this.clickStartShape,d=!1;Kinetic.inDblClickWindow?(d=!0,Kinetic.inDblClickWindow=!1):Kinetic.inDblClickWindow=!0,setTimeout(function(){Kinetic.inDblClickWindow=!1},Kinetic.dblClickWindow),b&&b.isListening()&&(b._fireAndBubble(k,{evt:a}),Kinetic.listenClickTap&&c&&c._id===b._id&&(b._fireAndBubble(l,{evt:a}),d&&b._fireAndBubble(m,{evt:a}))),this._fire(w,{evt:a}),Kinetic.listenClickTap&&(this._fire(x,{evt:a}),d&&this._fire(y,{evt:a})),Kinetic.listenClickTap=!1}a.preventDefault&&a.preventDefault()},_touchstart:function(a){this._setPointerPosition(a);var b=this.getIntersection(this.getPointerPosition());Kinetic.listenClickTap=!0,b&&b.isListening()&&(this.tapStartShape=b,b._fireAndBubble(n,{evt:a}),b.isListening()&&a.preventDefault&&a.preventDefault()),this._fire(z,{evt:a})},_touchend:function(a){this._setPointerPosition(a);var b=this.getIntersection(this.getPointerPosition()),c=!1;Kinetic.inDblClickWindow?(c=!0,Kinetic.inDblClickWindow=!1):Kinetic.inDblClickWindow=!0,setTimeout(function(){Kinetic.inDblClickWindow=!1},Kinetic.dblClickWindow),b&&b.isListening()&&(b._fireAndBubble(o,{evt:a}),Kinetic.listenClickTap&&b._id===this.tapStartShape._id&&(b._fireAndBubble(p,{evt:a}),c&&b._fireAndBubble(q,{evt:a})),b.isListening()&&a.preventDefault&&a.preventDefault()),Kinetic.listenClickTap&&(this._fire(A,{evt:a}),c&&this._fire(B,{evt:a})),Kinetic.listenClickTap=!1},_touchmove:function(a){this._setPointerPosition(a);var b=Kinetic.DD,c=this.getIntersection(this.getPointerPosition());c&&c.isListening()&&(c._fireAndBubble(r,{evt:a}),c.isListening()&&a.preventDefault&&a.preventDefault()),this._fire(C,{evt:a}),b&&b._drag(a)},_setPointerPosition:function(a){var b,c=this._getContentPosition(),d=a.offsetX,e=a.clientX,f=null,g=null;a=a?a:window.event,void 0!==a.touches?a.touches.length>0&&(b=a.touches[0],f=b.clientX-c.left,g=b.clientY-c.top):void 0!==d?(f=d,g=a.offsetY):"mozilla"===Kinetic.UA.browser?(f=a.layerX,g=a.layerY):void 0!==e&&c&&(f=e-c.left,g=a.clientY-c.top),null!==f&&null!==g&&(this.pointerPos={x:f,y:g})},_getContentPosition:function(){var a=this.content.getBoundingClientRect?this.content.getBoundingClientRect():{top:0,left:0};return{top:a.top,left:a.left}},_buildDOM:function(){var a=this.getContainer();if(!a){if(Kinetic.Util.isBrowser())throw"Stage has not container. But container is required";a=Kinetic.document.createElement(D)}a.innerHTML=K,this.content=Kinetic.document.createElement(D),this.content.style.position=E,this.content.style.display=F,this.content.className=G,this.content.setAttribute("role","presentation"),a.appendChild(this.content),this.bufferCanvas=new Kinetic.SceneCanvas({pixelRatio:1}),this.bufferHitCanvas=new Kinetic.HitCanvas,this._resizeDOM()},_onContent:function(a,b){var c,d,e=a.split(H),f=e.length;for(c=0;f>c;c++)d=e[c],this.content.addEventListener(d,b,!1)},cache:function(){Kinetic.Util.warn("Cache function is not allowed for stage. You may use cache only for layers, groups and shapes.")},clearCache:function(){}}),Kinetic.Util.extend(Kinetic.Stage,Kinetic.Container),Kinetic.Factory.addGetter(Kinetic.Stage,"container"),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Stage,"container")}(),function(){Kinetic.Util.addMethods(Kinetic.BaseLayer,{___init:function(a){this.nodeType="Layer",Kinetic.Container.call(this,a)},createPNGStream:function(){return this.canvas._canvas.createPNGStream()},getCanvas:function(){return this.canvas},getHitCanvas:function(){return this.hitCanvas},getContext:function(){return this.getCanvas().getContext()},clear:function(a){return this.getContext().clear(a),this.getHitCanvas().getContext().clear(a),this},setZIndex:function(a){Kinetic.Node.prototype.setZIndex.call(this,a);var b=this.getStage();return b&&(b.content.removeChild(this.getCanvas()._canvas),a<b.getChildren().length-1?b.content.insertBefore(this.getCanvas()._canvas,b.getChildren()[a+1].getCanvas()._canvas):b.content.appendChild(this.getCanvas()._canvas)),this},moveToTop:function(){Kinetic.Node.prototype.moveToTop.call(this);var a=this.getStage();a&&(a.content.removeChild(this.getCanvas()._canvas),a.content.appendChild(this.getCanvas()._canvas))},moveUp:function(){if(Kinetic.Node.prototype.moveUp.call(this)){var a=this.getStage();a&&(a.content.removeChild(this.getCanvas()._canvas),this.index<a.getChildren().length-1?a.content.insertBefore(this.getCanvas()._canvas,a.getChildren()[this.index+1].getCanvas()._canvas):a.content.appendChild(this.getCanvas()._canvas))}},moveDown:function(){if(Kinetic.Node.prototype.moveDown.call(this)){var a=this.getStage();if(a){var b=a.getChildren();a.content.removeChild(this.getCanvas()._canvas),a.content.insertBefore(this.getCanvas()._canvas,b[this.index+1].getCanvas()._canvas)}}},moveToBottom:function(){if(Kinetic.Node.prototype.moveToBottom.call(this)){var a=this.getStage();if(a){var b=a.getChildren();a.content.removeChild(this.getCanvas()._canvas),a.content.insertBefore(this.getCanvas()._canvas,b[1].getCanvas()._canvas)}}},getLayer:function(){return this},remove:function(){var a=this.getCanvas()._canvas;return Kinetic.Node.prototype.remove.call(this),a&&a.parentNode&&Kinetic.Util._isInDocument(a)&&a.parentNode.removeChild(a),this},getStage:function(){return this.parent}}),Kinetic.Util.extend(Kinetic.BaseLayer,Kinetic.Container),Kinetic.Factory.addGetterSetter(Kinetic.BaseLayer,"clearBeforeDraw",!0),Kinetic.Collection.mapMethods(Kinetic.BaseLayer)}(),function(){var a="#",b="beforeDraw",c="draw",d=[{x:0,y:0},{x:-1,y:0},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:1,y:0},{x:1,y:1},{x:0,y:1},{x:-1,y:1}],e=d.length;Kinetic.Util.addMethods(Kinetic.Layer,{____init:function(a){this.nodeType="Layer",this.canvas=new Kinetic.SceneCanvas,this.hitCanvas=new Kinetic.HitCanvas,Kinetic.BaseLayer.call(this,a)},_setCanvasSize:function(a,b){this.canvas.setSize(a,b),this.hitCanvas.setSize(a,b)},_validateAdd:function(a){var b=a.getType();"Group"!==b&&"Shape"!==b&&Kinetic.Util.error("You may only add groups and shapes to a layer.")},getIntersection:function(a){var b,c,f,g;if(!this.hitGraphEnabled()||!this.isVisible())return null;for(c=0;e>c;c++){if(f=d[c],b=this._getIntersection({x:a.x+f.x,y:a.y+f.y}),g=b.shape)return g;if(!b.antialiased)return null}},_getIntersection:function(b){var c,d,e=this.hitCanvas.context._context.getImageData(b.x,b.y,1,1).data,f=e[3];return 255===f?(c=Kinetic.Util._rgbToHex(e[0],e[1],e[2]),d=Kinetic.shapes[a+c],{shape:d}):f>0?{antialiased:!0}:{}},drawScene:function(a,d){var e=this.getLayer(),f=a||e&&e.getCanvas();return this._fire(b,{node:this}),this.getClearBeforeDraw()&&f.getContext().clear(),Kinetic.Container.prototype.drawScene.call(this,f,d),this._fire(c,{node:this}),this},_applyTransform:function(a,b,c){var d=a.getAbsoluteTransform(c).getMatrix();b.transform(d[0],d[1],d[2],d[3],d[4],d[5])},drawHit:function(a,b){var c=this.getLayer(),d=a||c&&c.hitCanvas;return c&&c.getClearBeforeDraw()&&c.getHitCanvas().getContext().clear(),Kinetic.Container.prototype.drawHit.call(this,d,b),this},clear:function(a){return this.getContext().clear(a),this.getHitCanvas().getContext().clear(a),this},setVisible:function(a){return Kinetic.Node.prototype.setVisible.call(this,a),a?(this.getCanvas()._canvas.style.display="block",this.hitCanvas._canvas.style.display="block"):(this.getCanvas()._canvas.style.display="none",this.hitCanvas._canvas.style.display="none"),this},enableHitGraph:function(){return this.setHitGraphEnabled(!0),this},disableHitGraph:function(){return this.setHitGraphEnabled(!1),this}}),Kinetic.Util.extend(Kinetic.Layer,Kinetic.BaseLayer),Kinetic.Factory.addGetterSetter(Kinetic.Layer,"hitGraphEnabled",!0),Kinetic.Collection.mapMethods(Kinetic.Layer)}(),function(){Kinetic.Util.addMethods(Kinetic.FastLayer,{____init:function(a){this.nodeType="Layer",this.canvas=new Kinetic.SceneCanvas,Kinetic.BaseLayer.call(this,a)},_validateAdd:function(a){var b=a.getType();"Shape"!==b&&Kinetic.Util.error("You may only add shapes to a fast layer.")},_setCanvasSize:function(a,b){this.canvas.setSize(a,b)},hitGraphEnabled:function(){return!1},getIntersection:function(){return null},drawScene:function(a){var b=this.getLayer(),c=a||b&&b.getCanvas();return this.getClearBeforeDraw()&&c.getContext().clear(),Kinetic.Container.prototype.drawScene.call(this,c),this},_applyTransform:function(a,b,c){if(!c||c._id!==this._id){var d=a.getTransform().getMatrix();b.transform(d[0],d[1],d[2],d[3],d[4],d[5])}},draw:function(){return this.drawScene(),this},clear:function(a){return this.getContext().clear(a),this},setVisible:function(a){return Kinetic.Node.prototype.setVisible.call(this,a),this.getCanvas()._canvas.style.display=a?"block":"none",this}}),Kinetic.Util.extend(Kinetic.FastLayer,Kinetic.BaseLayer),Kinetic.Collection.mapMethods(Kinetic.FastLayer)}(),function(){Kinetic.Util.addMethods(Kinetic.Group,{___init:function(a){this.nodeType="Group",Kinetic.Container.call(this,a)},_validateAdd:function(a){var b=a.getType();"Group"!==b&&"Shape"!==b&&Kinetic.Util.error("You may only add groups and shapes to groups.")}}),Kinetic.Util.extend(Kinetic.Group,Kinetic.Container),Kinetic.Collection.mapMethods(Kinetic.Group)}(),function(){Kinetic.Rect=function(a){this.___init(a)},Kinetic.Rect.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="Rect",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){var b=this.getCornerRadius(),c=this.getWidth(),d=this.getHeight();a.beginPath(),b?(a.moveTo(b,0),a.lineTo(c-b,0),a.arc(c-b,b,b,3*Math.PI/2,0,!1),a.lineTo(c,d-b),a.arc(c-b,d-b,b,0,Math.PI/2,!1),a.lineTo(b,d),a.arc(b,d-b,b,Math.PI/2,Math.PI,!1),a.lineTo(0,b),a.arc(b,b,b,Math.PI,3*Math.PI/2,!1)):a.rect(0,0,c,d),a.closePath(),a.fillStrokeShape(this)}},Kinetic.Util.extend(Kinetic.Rect,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Rect,"cornerRadius",0),Kinetic.Collection.mapMethods(Kinetic.Rect)}(),function(){var a=2*Math.PI-1e-4,b="Circle";Kinetic.Circle=function(a){this.___init(a)},Kinetic.Circle.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className=b,this.sceneFunc(this._sceneFunc)},_sceneFunc:function(b){b.beginPath(),b.arc(0,0,this.getRadius(),0,a,!1),b.closePath(),b.fillStrokeShape(this)},getWidth:function(){return 2*this.getRadius()},getHeight:function(){return 2*this.getRadius()},setWidth:function(a){Kinetic.Node.prototype.setWidth.call(this,a),this.setRadius(a/2)},setHeight:function(a){Kinetic.Node.prototype.setHeight.call(this,a),this.setRadius(a/2)}},Kinetic.Util.extend(Kinetic.Circle,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Circle,"radius",0),Kinetic.Collection.mapMethods(Kinetic.Circle)}(),function(){var a=2*Math.PI-1e-4,b="Ellipse";Kinetic.Ellipse=function(a){this.___init(a)},Kinetic.Ellipse.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className=b,this.sceneFunc(this._sceneFunc)},_sceneFunc:function(b){var c=this.getRadius(),d=c.x,e=c.y;b.beginPath(),b.save(),d!==e&&b.scale(1,e/d),b.arc(0,0,d,0,a,!1),b.restore(),b.closePath(),b.fillStrokeShape(this)},getWidth:function(){return 2*this.getRadius().x},getHeight:function(){return 2*this.getRadius().y},setWidth:function(a){Kinetic.Node.prototype.setWidth.call(this,a),this.setRadius({x:a/2})},setHeight:function(a){Kinetic.Node.prototype.setHeight.call(this,a),this.setRadius({y:a/2})}},Kinetic.Util.extend(Kinetic.Ellipse,Kinetic.Shape),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Ellipse,"radius",["x","y"]),Kinetic.Factory.addGetterSetter(Kinetic.Ellipse,"radiusX",0),Kinetic.Factory.addGetterSetter(Kinetic.Ellipse,"radiusY",0),Kinetic.Collection.mapMethods(Kinetic.Ellipse)}(),function(){var a=2*Math.PI-1e-4;Kinetic.Ring=function(a){this.___init(a)},Kinetic.Ring.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="Ring",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(b){b.beginPath(),b.arc(0,0,this.getInnerRadius(),0,a,!1),b.moveTo(this.getOuterRadius(),0),b.arc(0,0,this.getOuterRadius(),a,0,!0),b.closePath(),b.fillStrokeShape(this)},getWidth:function(){return 2*this.getOuterRadius()},getHeight:function(){return 2*this.getOuterRadius()},setWidth:function(a){Kinetic.Node.prototype.setWidth.call(this,a),this.setOuterRadius(a/2)},setHeight:function(a){Kinetic.Node.prototype.setHeight.call(this,a),this.setOuterRadius(a/2)}},Kinetic.Util.extend(Kinetic.Ring,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Ring,"innerRadius",0),Kinetic.Factory.addGetterSetter(Kinetic.Ring,"outerRadius",0),Kinetic.Collection.mapMethods(Kinetic.Ring)}(),function(){Kinetic.Wedge=function(a){this.___init(a)},Kinetic.Wedge.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="Wedge",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){a.beginPath(),a.arc(0,0,this.getRadius(),0,Kinetic.getAngle(this.getAngle()),this.getClockwise()),a.lineTo(0,0),a.closePath(),a.fillStrokeShape(this)}},Kinetic.Util.extend(Kinetic.Wedge,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Wedge,"radius",0),Kinetic.Factory.addGetterSetter(Kinetic.Wedge,"angle",0),Kinetic.Factory.addGetterSetter(Kinetic.Wedge,"clockwise",!1),Kinetic.Factory.backCompat(Kinetic.Wedge,{angleDeg:"angle",getAngleDeg:"getAngle",setAngleDeg:"setAngle"}),Kinetic.Collection.mapMethods(Kinetic.Wedge)}(),function(){Math.PI/180;Kinetic.Arc=function(a){this.___init(a)},Kinetic.Arc.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="Arc",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){var b=Kinetic.getAngle(this.angle()),c=this.clockwise();a.beginPath(),a.arc(0,0,this.getOuterRadius(),0,b,c),a.arc(0,0,this.getInnerRadius(),b,0,!c),a.closePath(),a.fillStrokeShape(this)}},Kinetic.Util.extend(Kinetic.Arc,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Arc,"innerRadius",0),Kinetic.Factory.addGetterSetter(Kinetic.Arc,"outerRadius",0),Kinetic.Factory.addGetterSetter(Kinetic.Arc,"angle",0),Kinetic.Factory.addGetterSetter(Kinetic.Arc,"clockwise",!1),Kinetic.Collection.mapMethods(Kinetic.Arc)}(),function(){var a="Image";Kinetic.Image=function(a){this.___init(a)},Kinetic.Image.prototype={___init:function(b){Kinetic.Shape.call(this,b),this.className=a,this.sceneFunc(this._sceneFunc),this.hitFunc(this._hitFunc)},_useBufferCanvas:function(){return(this.hasShadow()||1!==this.getAbsoluteOpacity())&&this.hasStroke()},_sceneFunc:function(a){var b,c,d,e,f=this.getWidth(),g=this.getHeight(),h=this.getImage();h&&(b=this.getCrop(),c=b.width,d=b.height,e=c&&d?[h,b.x,b.y,c,d,0,0,f,g]:[h,0,0,f,g]),a.beginPath(),a.rect(0,0,f,g),a.closePath(),a.fillStrokeShape(this),h&&a.drawImage.apply(a,e)},_hitFunc:function(a){var b=this.getWidth(),c=this.getHeight();a.beginPath(),a.rect(0,0,b,c),a.closePath(),a.fillStrokeShape(this)},getWidth:function(){var a=this.getImage();return this.attrs.width||(a?a.width:0)},getHeight:function(){var a=this.getImage();return this.attrs.height||(a?a.height:0)}},Kinetic.Util.extend(Kinetic.Image,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Image,"image"),Kinetic.Factory.addComponentsGetterSetter(Kinetic.Image,"crop",["x","y","width","height"]),Kinetic.Factory.addGetterSetter(Kinetic.Image,"cropX",0),Kinetic.Factory.addGetterSetter(Kinetic.Image,"cropY",0),Kinetic.Factory.addGetterSetter(Kinetic.Image,"cropWidth",0),Kinetic.Factory.addGetterSetter(Kinetic.Image,"cropHeight",0),Kinetic.Collection.mapMethods(Kinetic.Image)}(),function(){function a(a){a.fillText(this.partialText,0,0)}function b(a){a.strokeText(this.partialText,0,0)}var c="auto",d="center",e="Change.kinetic",f="2d",g="-",h="",i="left",j="text",k="Text",l="middle",m="normal",n="px ",o=" ",p="right",q="word",r="char",s="none",t=["fontFamily","fontSize","fontStyle","fontVariant","padding","align","lineHeight","text","width","height","wrap"],u=t.length,v=Kinetic.Util.createCanvasElement().getContext(f);Kinetic.Text=function(a){this.___init(a)},Kinetic.Text.prototype={___init:function(d){var f=this;void 0===d.width&&(d.width=c),void 0===d.height&&(d.height=c),Kinetic.Shape.call(this,d),this._fillFunc=a,this._strokeFunc=b,this.className=k;for(var g=0;u>g;g++)this.on(t[g]+e,f._setTextData);this._setTextData(),this.sceneFunc(this._sceneFunc),this.hitFunc(this._hitFunc)},_sceneFunc:function(a){var b,c=this.getPadding(),e=this.getTextHeight(),f=this.getLineHeight()*e,g=this.textArr,h=g.length,j=this.getWidth();for(a.setAttr("font",this._getContextFont()),a.setAttr("textBaseline",l),a.setAttr("textAlign",i),a.save(),a.translate(c,0),a.translate(0,c+e/2),b=0;h>b;b++){var k=g[b],m=k.text,n=k.width;a.save(),this.getAlign()===p?a.translate(j-n-2*c,0):this.getAlign()===d&&a.translate((j-n-2*c)/2,0),this.partialText=m,a.fillStrokeShape(this),a.restore(),a.translate(0,f)}a.restore()},_hitFunc:function(a){var b=this.getWidth(),c=this.getHeight();a.beginPath(),a.rect(0,0,b,c),a.closePath(),a.fillStrokeShape(this)},setText:function(a){var b=Kinetic.Util._isString(a)?a:a.toString();return this._setAttr(j,b),this},getWidth:function(){return this.attrs.width===c?this.getTextWidth()+2*this.getPadding():this.attrs.width},getHeight:function(){return this.attrs.height===c?this.getTextHeight()*this.textArr.length*this.getLineHeight()+2*this.getPadding():this.attrs.height},getTextWidth:function(){return this.textWidth},getTextHeight:function(){return this.textHeight},_getTextSize:function(a){var b,c=v,d=this.getFontSize();return c.save(),c.font=this._getContextFont(),b=c.measureText(a),c.restore(),{width:b.width,height:parseInt(d,10)}},_getContextFont:function(){return this.getFontStyle()+o+this.getFontVariant()+o+this.getFontSize()+n+this.getFontFamily()},_addTextLine:function(a,b){return this.textArr.push({text:a,width:b})},_getTextWidth:function(a){return v.measureText(a).width},_setTextData:function(){var a=this.getText().split("\n"),b=+this.getFontSize(),d=0,e=this.getLineHeight()*b,f=this.attrs.width,h=this.attrs.height,i=f!==c,j=h!==c,k=this.getPadding(),l=f-2*k,m=h-2*k,n=0,p=this.getWrap(),q=p!==s,t=p!==r&&q;this.textArr=[],v.save(),v.font=this._getContextFont();
for(var u=0,w=a.length;w>u;++u){var x=a[u],y=this._getTextWidth(x);if(i&&y>l)for(;x.length>0;){for(var z=0,A=x.length,B="",C=0;A>z;){var D=z+A>>>1,E=x.slice(0,D+1),F=this._getTextWidth(E);l>=F?(z=D+1,B=E,C=F):A=D}if(!B)break;if(t){var G=Math.max(B.lastIndexOf(o),B.lastIndexOf(g))+1;G>0&&(z=G,B=B.slice(0,z),C=this._getTextWidth(B))}if(this._addTextLine(B,C),d=Math.max(d,C),n+=e,!q||j&&n+e>m)break;if(x=x.slice(z),x.length>0&&(y=this._getTextWidth(x),l>=y)){this._addTextLine(x,y),n+=e,d=Math.max(d,y);break}}else this._addTextLine(x,y),n+=e,d=Math.max(d,y);if(j&&n+e>m)break}v.restore(),this.textHeight=b,this.textWidth=d}},Kinetic.Util.extend(Kinetic.Text,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Text,"fontFamily","Arial"),Kinetic.Factory.addGetterSetter(Kinetic.Text,"fontSize",12),Kinetic.Factory.addGetterSetter(Kinetic.Text,"fontStyle",m),Kinetic.Factory.addGetterSetter(Kinetic.Text,"fontVariant",m),Kinetic.Factory.addGetterSetter(Kinetic.Text,"padding",0),Kinetic.Factory.addGetterSetter(Kinetic.Text,"align",i),Kinetic.Factory.addGetterSetter(Kinetic.Text,"lineHeight",1),Kinetic.Factory.addGetterSetter(Kinetic.Text,"wrap",q),Kinetic.Factory.addGetter(Kinetic.Text,"text",h),Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Text,"text"),Kinetic.Collection.mapMethods(Kinetic.Text)}(),function(){Kinetic.Line=function(a){this.___init(a)},Kinetic.Line.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="Line",this.on("pointsChange.kinetic tensionChange.kinetic closedChange.kinetic",function(){this._clearCache("tensionPoints")}),this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){var b,c,d,e=this.getPoints(),f=e.length,g=this.getTension(),h=this.getClosed();if(a.beginPath(),a.moveTo(e[0],e[1]),0!==g&&f>4){for(b=this.getTensionPoints(),c=b.length,d=h?0:4,h||a.quadraticCurveTo(b[0],b[1],b[2],b[3]);c-2>d;)a.bezierCurveTo(b[d++],b[d++],b[d++],b[d++],b[d++],b[d++]);h||a.quadraticCurveTo(b[c-2],b[c-1],e[f-2],e[f-1])}else for(d=2;f>d;d+=2)a.lineTo(e[d],e[d+1]);h?(a.closePath(),a.fillStrokeShape(this)):a.strokeShape(this)},getTensionPoints:function(){return this._getCache("tensionPoints",this._getTensionPoints)},_getTensionPoints:function(){return this.getClosed()?this._getTensionPointsClosed():Kinetic.Util._expandPoints(this.getPoints(),this.getTension())},_getTensionPointsClosed:function(){var a=this.getPoints(),b=a.length,c=this.getTension(),d=Kinetic.Util,e=d._getControlPoints(a[b-2],a[b-1],a[0],a[1],a[2],a[3],c),f=d._getControlPoints(a[b-4],a[b-3],a[b-2],a[b-1],a[0],a[1],c),g=Kinetic.Util._expandPoints(a,c),h=[e[2],e[3]].concat(g).concat([f[0],f[1],a[b-2],a[b-1],f[2],f[3],e[0],e[1],a[0],a[1]]);return h}},Kinetic.Util.extend(Kinetic.Line,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Line,"closed",!1),Kinetic.Factory.addGetterSetter(Kinetic.Line,"tension",0),Kinetic.Factory.addGetterSetter(Kinetic.Line,"points"),Kinetic.Collection.mapMethods(Kinetic.Line)}(),function(){Kinetic.Sprite=function(a){this.___init(a)},Kinetic.Sprite.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="Sprite",this.anim=new Kinetic.Animation,this.on("animationChange.kinetic",function(){this.frameIndex(0)}),this.on("frameRateChange.kinetic",function(){this.anim.isRunning()&&(clearInterval(this.interval),this._setInterval())}),this.sceneFunc(this._sceneFunc),this.hitFunc(this._hitFunc)},_sceneFunc:function(a){var b=this.getAnimation(),c=this.frameIndex(),d=4*c,e=this.getAnimations()[b],f=e[d+0],g=e[d+1],h=e[d+2],i=e[d+3],j=this.getImage();j&&a.drawImage(j,f,g,h,i,0,0,h,i)},_hitFunc:function(a){var b=this.getAnimation(),c=this.frameIndex(),d=4*c,e=this.getAnimations()[b],f=e[d+2],g=e[d+3];a.beginPath(),a.rect(0,0,f,g),a.closePath(),a.fillShape(this)},_useBufferCanvas:function(){return(this.hasShadow()||1!==this.getAbsoluteOpacity())&&this.hasStroke()},_setInterval:function(){var a=this;this.interval=setInterval(function(){a._updateIndex()},1e3/this.getFrameRate())},start:function(){var a=this.getLayer();this.anim.setLayers(a),this._setInterval(),this.anim.start()},stop:function(){this.anim.stop(),clearInterval(this.interval)},isRunning:function(){return this.anim.isRunning()},_updateIndex:function(){var a=this.frameIndex(),b=this.getAnimation(),c=this.getAnimations(),d=c[b],e=d.length/4;this.frameIndex(e-1>a?a+1:0)}},Kinetic.Util.extend(Kinetic.Sprite,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Sprite,"animation"),Kinetic.Factory.addGetterSetter(Kinetic.Sprite,"animations"),Kinetic.Factory.addGetterSetter(Kinetic.Sprite,"image"),Kinetic.Factory.addGetterSetter(Kinetic.Sprite,"frameIndex",0),Kinetic.Factory.addGetterSetter(Kinetic.Sprite,"frameRate",17),Kinetic.Factory.backCompat(Kinetic.Sprite,{index:"frameIndex",getIndex:"getFrameIndex",setIndex:"setFrameIndex"}),Kinetic.Collection.mapMethods(Kinetic.Sprite)}(),function(){Kinetic.Path=function(a){this.___init(a)},Kinetic.Path.prototype={___init:function(a){this.dataArray=[];var b=this;Kinetic.Shape.call(this,a),this.className="Path",this.dataArray=Kinetic.Path.parsePathData(this.getData()),this.on("dataChange.kinetic",function(){b.dataArray=Kinetic.Path.parsePathData(this.getData())}),this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){var b=this.dataArray,c=!1;a.beginPath();for(var d=0;d<b.length;d++){var e=b[d].command,f=b[d].points;switch(e){case"L":a.lineTo(f[0],f[1]);break;case"M":a.moveTo(f[0],f[1]);break;case"C":a.bezierCurveTo(f[0],f[1],f[2],f[3],f[4],f[5]);break;case"Q":a.quadraticCurveTo(f[0],f[1],f[2],f[3]);break;case"A":var g=f[0],h=f[1],i=f[2],j=f[3],k=f[4],l=f[5],m=f[6],n=f[7],o=i>j?i:j,p=i>j?1:i/j,q=i>j?j/i:1;a.translate(g,h),a.rotate(m),a.scale(p,q),a.arc(0,0,o,k,k+l,1-n),a.scale(1/p,1/q),a.rotate(-m),a.translate(-g,-h);break;case"z":a.closePath(),c=!0}}c?a.fillStrokeShape(this):a.strokeShape(this)}},Kinetic.Util.extend(Kinetic.Path,Kinetic.Shape),Kinetic.Path.getLineLength=function(a,b,c,d){return Math.sqrt((c-a)*(c-a)+(d-b)*(d-b))},Kinetic.Path.getPointOnLine=function(a,b,c,d,e,f,g){void 0===f&&(f=b),void 0===g&&(g=c);var h=(e-c)/(d-b+1e-8),i=Math.sqrt(a*a/(1+h*h));b>d&&(i*=-1);var j,k=h*i;if(d===b)j={x:f,y:g+k};else if((g-c)/(f-b+1e-8)===h)j={x:f+i,y:g+k};else{var l,m,n=this.getLineLength(b,c,d,e);if(1e-8>n)return void 0;var o=(f-b)*(d-b)+(g-c)*(e-c);o/=n*n,l=b+o*(d-b),m=c+o*(e-c);var p=this.getLineLength(f,g,l,m),q=Math.sqrt(a*a-p*p);i=Math.sqrt(q*q/(1+h*h)),b>d&&(i*=-1),k=h*i,j={x:l+i,y:m+k}}return j},Kinetic.Path.getPointOnCubicBezier=function(a,b,c,d,e,f,g,h,i){function j(a){return a*a*a}function k(a){return 3*a*a*(1-a)}function l(a){return 3*a*(1-a)*(1-a)}function m(a){return(1-a)*(1-a)*(1-a)}var n=h*j(a)+f*k(a)+d*l(a)+b*m(a),o=i*j(a)+g*k(a)+e*l(a)+c*m(a);return{x:n,y:o}},Kinetic.Path.getPointOnQuadraticBezier=function(a,b,c,d,e,f,g){function h(a){return a*a}function i(a){return 2*a*(1-a)}function j(a){return(1-a)*(1-a)}var k=f*h(a)+d*i(a)+b*j(a),l=g*h(a)+e*i(a)+c*j(a);return{x:k,y:l}},Kinetic.Path.getPointOnEllipticalArc=function(a,b,c,d,e,f){var g=Math.cos(f),h=Math.sin(f),i={x:c*Math.cos(e),y:d*Math.sin(e)};return{x:a+(i.x*g-i.y*h),y:b+(i.x*h+i.y*g)}},Kinetic.Path.parsePathData=function(a){if(!a)return[];var b=a,c=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"];b=b.replace(new RegExp(" ","g"),",");for(var d=0;d<c.length;d++)b=b.replace(new RegExp(c[d],"g"),"|"+c[d]);var e=b.split("|"),f=[],g=0,h=0;for(d=1;d<e.length;d++){var i=e[d],j=i.charAt(0);i=i.slice(1),i=i.replace(new RegExp(",-","g"),"-"),i=i.replace(new RegExp("-","g"),",-"),i=i.replace(new RegExp("e,-","g"),"e-");var k=i.split(",");k.length>0&&""===k[0]&&k.shift();for(var l=0;l<k.length;l++)k[l]=parseFloat(k[l]);for(;k.length>0&&!isNaN(k[0]);){var m,n,o,p,q,r,s,t,u,v,w=null,x=[],y=g,z=h;switch(j){case"l":g+=k.shift(),h+=k.shift(),w="L",x.push(g,h);break;case"L":g=k.shift(),h=k.shift(),x.push(g,h);break;case"m":var A=k.shift(),B=k.shift();if(g+=A,h+=B,w="M",f.length>2&&"z"===f[f.length-1].command)for(var C=f.length-2;C>=0;C--)if("M"===f[C].command){g=f[C].points[0]+A,h=f[C].points[1]+B;break}x.push(g,h),j="l";break;case"M":g=k.shift(),h=k.shift(),w="M",x.push(g,h),j="L";break;case"h":g+=k.shift(),w="L",x.push(g,h);break;case"H":g=k.shift(),w="L",x.push(g,h);break;case"v":h+=k.shift(),w="L",x.push(g,h);break;case"V":h=k.shift(),w="L",x.push(g,h);break;case"C":x.push(k.shift(),k.shift(),k.shift(),k.shift()),g=k.shift(),h=k.shift(),x.push(g,h);break;case"c":x.push(g+k.shift(),h+k.shift(),g+k.shift(),h+k.shift()),g+=k.shift(),h+=k.shift(),w="C",x.push(g,h);break;case"S":n=g,o=h,m=f[f.length-1],"C"===m.command&&(n=g+(g-m.points[2]),o=h+(h-m.points[3])),x.push(n,o,k.shift(),k.shift()),g=k.shift(),h=k.shift(),w="C",x.push(g,h);break;case"s":n=g,o=h,m=f[f.length-1],"C"===m.command&&(n=g+(g-m.points[2]),o=h+(h-m.points[3])),x.push(n,o,g+k.shift(),h+k.shift()),g+=k.shift(),h+=k.shift(),w="C",x.push(g,h);break;case"Q":x.push(k.shift(),k.shift()),g=k.shift(),h=k.shift(),x.push(g,h);break;case"q":x.push(g+k.shift(),h+k.shift()),g+=k.shift(),h+=k.shift(),w="Q",x.push(g,h);break;case"T":n=g,o=h,m=f[f.length-1],"Q"===m.command&&(n=g+(g-m.points[0]),o=h+(h-m.points[1])),g=k.shift(),h=k.shift(),w="Q",x.push(n,o,g,h);break;case"t":n=g,o=h,m=f[f.length-1],"Q"===m.command&&(n=g+(g-m.points[0]),o=h+(h-m.points[1])),g+=k.shift(),h+=k.shift(),w="Q",x.push(n,o,g,h);break;case"A":p=k.shift(),q=k.shift(),r=k.shift(),s=k.shift(),t=k.shift(),u=g,v=h,g=k.shift(),h=k.shift(),w="A",x=this.convertEndpointToCenterParameterization(u,v,g,h,s,t,p,q,r);break;case"a":p=k.shift(),q=k.shift(),r=k.shift(),s=k.shift(),t=k.shift(),u=g,v=h,g+=k.shift(),h+=k.shift(),w="A",x=this.convertEndpointToCenterParameterization(u,v,g,h,s,t,p,q,r)}f.push({command:w||j,points:x,start:{x:y,y:z},pathLength:this.calcLength(y,z,w||j,x)})}("z"===j||"Z"===j)&&f.push({command:"z",points:[],start:void 0,pathLength:0})}return f},Kinetic.Path.calcLength=function(a,b,c,d){var e,f,g,h,i=Kinetic.Path;switch(c){case"L":return i.getLineLength(a,b,d[0],d[1]);case"C":for(e=0,f=i.getPointOnCubicBezier(0,a,b,d[0],d[1],d[2],d[3],d[4],d[5]),h=.01;1>=h;h+=.01)g=i.getPointOnCubicBezier(h,a,b,d[0],d[1],d[2],d[3],d[4],d[5]),e+=i.getLineLength(f.x,f.y,g.x,g.y),f=g;return e;case"Q":for(e=0,f=i.getPointOnQuadraticBezier(0,a,b,d[0],d[1],d[2],d[3]),h=.01;1>=h;h+=.01)g=i.getPointOnQuadraticBezier(h,a,b,d[0],d[1],d[2],d[3]),e+=i.getLineLength(f.x,f.y,g.x,g.y),f=g;return e;case"A":e=0;var j=d[4],k=d[5],l=d[4]+k,m=Math.PI/180;if(Math.abs(j-l)<m&&(m=Math.abs(j-l)),f=i.getPointOnEllipticalArc(d[0],d[1],d[2],d[3],j,0),0>k)for(h=j-m;h>l;h-=m)g=i.getPointOnEllipticalArc(d[0],d[1],d[2],d[3],h,0),e+=i.getLineLength(f.x,f.y,g.x,g.y),f=g;else for(h=j+m;l>h;h+=m)g=i.getPointOnEllipticalArc(d[0],d[1],d[2],d[3],h,0),e+=i.getLineLength(f.x,f.y,g.x,g.y),f=g;return g=i.getPointOnEllipticalArc(d[0],d[1],d[2],d[3],l,0),e+=i.getLineLength(f.x,f.y,g.x,g.y)}return 0},Kinetic.Path.convertEndpointToCenterParameterization=function(a,b,c,d,e,f,g,h,i){var j=i*(Math.PI/180),k=Math.cos(j)*(a-c)/2+Math.sin(j)*(b-d)/2,l=-1*Math.sin(j)*(a-c)/2+Math.cos(j)*(b-d)/2,m=k*k/(g*g)+l*l/(h*h);m>1&&(g*=Math.sqrt(m),h*=Math.sqrt(m));var n=Math.sqrt((g*g*h*h-g*g*l*l-h*h*k*k)/(g*g*l*l+h*h*k*k));e===f&&(n*=-1),isNaN(n)&&(n=0);var o=n*g*l/h,p=n*-h*k/g,q=(a+c)/2+Math.cos(j)*o-Math.sin(j)*p,r=(b+d)/2+Math.sin(j)*o+Math.cos(j)*p,s=function(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1])},t=function(a,b){return(a[0]*b[0]+a[1]*b[1])/(s(a)*s(b))},u=function(a,b){return(a[0]*b[1]<a[1]*b[0]?-1:1)*Math.acos(t(a,b))},v=u([1,0],[(k-o)/g,(l-p)/h]),w=[(k-o)/g,(l-p)/h],x=[(-1*k-o)/g,(-1*l-p)/h],y=u(w,x);return t(w,x)<=-1&&(y=Math.PI),t(w,x)>=1&&(y=0),0===f&&y>0&&(y-=2*Math.PI),1===f&&0>y&&(y+=2*Math.PI),[q,r,g,h,v,y,j,f]},Kinetic.Factory.addGetterSetter(Kinetic.Path,"data"),Kinetic.Collection.mapMethods(Kinetic.Path)}(),function(){function a(a){a.fillText(this.partialText,0,0)}function b(a){a.strokeText(this.partialText,0,0)}var c="",d="normal";Kinetic.TextPath=function(a){this.___init(a)},Kinetic.TextPath.prototype={___init:function(c){var d=this;this.dummyCanvas=Kinetic.Util.createCanvasElement(),this.dataArray=[],Kinetic.Shape.call(this,c),this._fillFunc=a,this._strokeFunc=b,this._fillFuncHit=a,this._strokeFuncHit=b,this.className="TextPath",this.dataArray=Kinetic.Path.parsePathData(this.attrs.data),this.on("dataChange.kinetic",function(){d.dataArray=Kinetic.Path.parsePathData(this.attrs.data)}),this.on("textChange.kinetic textStroke.kinetic textStrokeWidth.kinetic",d._setTextData),d._setTextData(),this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){a.setAttr("font",this._getContextFont()),a.setAttr("textBaseline","middle"),a.setAttr("textAlign","left"),a.save();for(var b=this.glyphInfo,c=0;c<b.length;c++){a.save();var d=b[c].p0;a.translate(d.x,d.y),a.rotate(b[c].rotation),this.partialText=b[c].text,a.fillStrokeShape(this),a.restore()}a.restore()},getTextWidth:function(){return this.textWidth},getTextHeight:function(){return this.textHeight},setText:function(a){Kinetic.Text.prototype.setText.call(this,a)},_getTextSize:function(a){var b=this.dummyCanvas,c=b.getContext("2d");c.save(),c.font=this._getContextFont();var d=c.measureText(a);return c.restore(),{width:d.width,height:parseInt(this.attrs.fontSize,10)}},_setTextData:function(){var a=this,b=this._getTextSize(this.attrs.text);this.textWidth=b.width,this.textHeight=b.height,this.glyphInfo=[];for(var c,d,e,f=this.attrs.text.split(""),g=-1,h=0,i=function(){h=0;for(var b=a.dataArray,d=g+1;d<b.length;d++){if(b[d].pathLength>0)return g=d,b[d];"M"==b[d].command&&(c={x:b[d].points[0],y:b[d].points[1]})}return{}},j=function(b){var f=a._getTextSize(b).width,g=0,j=0;for(d=void 0;Math.abs(f-g)/f>.01&&25>j;){j++;for(var k=g;void 0===e;)e=i(),e&&k+e.pathLength<f&&(k+=e.pathLength,e=void 0);if(e==={}||void 0===c)return void 0;var l=!1;switch(e.command){case"L":Kinetic.Path.getLineLength(c.x,c.y,e.points[0],e.points[1])>f?d=Kinetic.Path.getPointOnLine(f,c.x,c.y,e.points[0],e.points[1],c.x,c.y):e=void 0;break;case"A":var m=e.points[4],n=e.points[5],o=e.points[4]+n;0===h?h=m+1e-8:f>g?h+=Math.PI/180*n/Math.abs(n):h-=Math.PI/360*n/Math.abs(n),(0>n&&o>h||n>=0&&h>o)&&(h=o,l=!0),d=Kinetic.Path.getPointOnEllipticalArc(e.points[0],e.points[1],e.points[2],e.points[3],h,e.points[6]);break;case"C":0===h?h=f>e.pathLength?1e-8:f/e.pathLength:f>g?h+=(f-g)/e.pathLength:h-=(g-f)/e.pathLength,h>1&&(h=1,l=!0),d=Kinetic.Path.getPointOnCubicBezier(h,e.start.x,e.start.y,e.points[0],e.points[1],e.points[2],e.points[3],e.points[4],e.points[5]);break;case"Q":0===h?h=f/e.pathLength:f>g?h+=(f-g)/e.pathLength:h-=(g-f)/e.pathLength,h>1&&(h=1,l=!0),d=Kinetic.Path.getPointOnQuadraticBezier(h,e.start.x,e.start.y,e.points[0],e.points[1],e.points[2],e.points[3])}void 0!==d&&(g=Kinetic.Path.getLineLength(c.x,c.y,d.x,d.y)),l&&(l=!1,e=void 0)}},k=0;k<f.length&&(j(f[k]),void 0!==c&&void 0!==d);k++){var l=Kinetic.Path.getLineLength(c.x,c.y,d.x,d.y),m=0,n=Kinetic.Path.getPointOnLine(m+l/2,c.x,c.y,d.x,d.y),o=Math.atan2(d.y-c.y,d.x-c.x);this.glyphInfo.push({transposeX:n.x,transposeY:n.y,text:f[k],rotation:o,p0:c,p1:d}),c=d}}},Kinetic.TextPath.prototype._getContextFont=Kinetic.Text.prototype._getContextFont,Kinetic.Util.extend(Kinetic.TextPath,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.TextPath,"fontFamily","Arial"),Kinetic.Factory.addGetterSetter(Kinetic.TextPath,"fontSize",12),Kinetic.Factory.addGetterSetter(Kinetic.TextPath,"fontStyle",d),Kinetic.Factory.addGetterSetter(Kinetic.TextPath,"fontVariant",d),Kinetic.Factory.addGetter(Kinetic.TextPath,"text",c),Kinetic.Collection.mapMethods(Kinetic.TextPath)}(),function(){Kinetic.RegularPolygon=function(a){this.___init(a)},Kinetic.RegularPolygon.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="RegularPolygon",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){var b,c,d,e=this.attrs.sides,f=this.attrs.radius;for(a.beginPath(),a.moveTo(0,0-f),b=1;e>b;b++)c=f*Math.sin(2*b*Math.PI/e),d=-1*f*Math.cos(2*b*Math.PI/e),a.lineTo(c,d);a.closePath(),a.fillStrokeShape(this)}},Kinetic.Util.extend(Kinetic.RegularPolygon,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.RegularPolygon,"radius",0),Kinetic.Factory.addGetterSetter(Kinetic.RegularPolygon,"sides",0),Kinetic.Collection.mapMethods(Kinetic.RegularPolygon)}(),function(){Kinetic.Star=function(a){this.___init(a)},Kinetic.Star.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="Star",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){var b=this.innerRadius(),c=this.outerRadius(),d=this.numPoints();a.beginPath(),a.moveTo(0,0-c);for(var e=1;2*d>e;e++){var f=e%2===0?c:b,g=f*Math.sin(e*Math.PI/d),h=-1*f*Math.cos(e*Math.PI/d);a.lineTo(g,h)}a.closePath(),a.fillStrokeShape(this)}},Kinetic.Util.extend(Kinetic.Star,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Star,"numPoints",5),Kinetic.Factory.addGetterSetter(Kinetic.Star,"innerRadius",0),Kinetic.Factory.addGetterSetter(Kinetic.Star,"outerRadius",0),Kinetic.Collection.mapMethods(Kinetic.Star)}(),function(){var a=["fontFamily","fontSize","fontStyle","padding","lineHeight","text"],b="Change.kinetic",c="none",d="up",e="right",f="down",g="left",h="Label",i=a.length;Kinetic.Label=function(a){this.____init(a)},Kinetic.Label.prototype={____init:function(a){var b=this;this.className=h,Kinetic.Group.call(this,a),this.on("add.kinetic",function(a){b._addListeners(a.child),b._sync()})},getText:function(){return this.find("Text")[0]},getTag:function(){return this.find("Tag")[0]},_addListeners:function(c){var d,e=this,f=function(){e._sync()};for(d=0;i>d;d++)c.on(a[d]+b,f)},getWidth:function(){return this.getText().getWidth()},getHeight:function(){return this.getText().getHeight()},_sync:function(){var a,b,c,h,i,j,k,l=this.getText(),m=this.getTag();if(l&&m){switch(a=l.getWidth(),b=l.getHeight(),c=m.getPointerDirection(),h=m.getPointerWidth(),k=m.getPointerHeight(),i=0,j=0,c){case d:i=a/2,j=-1*k;break;case e:i=a+h,j=b/2;break;case f:i=a/2,j=b+k;break;case g:i=-1*h,j=b/2}m.setAttrs({x:-1*i,y:-1*j,width:a,height:b}),l.setAttrs({x:-1*i,y:-1*j})}}},Kinetic.Util.extend(Kinetic.Label,Kinetic.Group),Kinetic.Collection.mapMethods(Kinetic.Label),Kinetic.Tag=function(a){this.___init(a)},Kinetic.Tag.prototype={___init:function(a){Kinetic.Shape.call(this,a),this.className="Tag",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(a){var b=this.getWidth(),c=this.getHeight(),h=this.getPointerDirection(),i=this.getPointerWidth(),j=this.getPointerHeight();a.beginPath(),a.moveTo(0,0),h===d&&(a.lineTo((b-i)/2,0),a.lineTo(b/2,-1*j),a.lineTo((b+i)/2,0)),a.lineTo(b,0),h===e&&(a.lineTo(b,(c-j)/2),a.lineTo(b+i,c/2),a.lineTo(b,(c+j)/2)),a.lineTo(b,c),h===f&&(a.lineTo((b+i)/2,c),a.lineTo(b/2,c+j),a.lineTo((b-i)/2,c)),a.lineTo(0,c),h===g&&(a.lineTo(0,(c+j)/2),a.lineTo(-1*i,c/2),a.lineTo(0,(c-j)/2)),a.closePath(),a.fillStrokeShape(this)}},Kinetic.Util.extend(Kinetic.Tag,Kinetic.Shape),Kinetic.Factory.addGetterSetter(Kinetic.Tag,"pointerDirection",c),Kinetic.Factory.addGetterSetter(Kinetic.Tag,"pointerWidth",0),Kinetic.Factory.addGetterSetter(Kinetic.Tag,"pointerHeight",0),Kinetic.Factory.addGetterSetter(Kinetic.Tag,"cornerRadius",0),Kinetic.Collection.mapMethods(Kinetic.Tag)}();
/*
 Copyright (C) Federico Zivolo 2017
 Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
 */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:e?e.ownerDocument.documentElement:document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',i=e.nodeName;if('BODY'===i||'HTML'===i){var n=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||n;return r[o]}return e[o]}function l(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=a(t,'top'),n=a(t,'left'),r=o?-1:1;return e.top+=i*r,e.bottom+=i*r,e.left+=n*r,e.right+=n*r,e}function f(e,t){var o='x'===t?'Left':'Top',i='Left'==o?'Right':'Bottom';return parseFloat(e['border'+o+'Width'],10)+parseFloat(e['border'+i+'Width'],10)}function m(e,t,o,i){return J(t['offset'+e],t['scroll'+e],o['client'+e],o['offset'+e],o['scroll'+e],ie()?o['offset'+e]+i['margin'+('Height'===e?'Top':'Left')]+i['margin'+('Height'===e?'Bottom':'Right')]:0)}function h(){var e=document.body,t=document.documentElement,o=ie()&&getComputedStyle(t);return{height:m('Height',e,t,o),width:m('Width',e,t,o)}}function c(e){return se({},e,{right:e.left+e.width,bottom:e.top+e.height})}function g(e){var o={};if(ie())try{o=e.getBoundingClientRect();var i=a(e,'top'),n=a(e,'left');o.top+=i,o.left+=n,o.bottom+=i,o.right+=n}catch(e){}else o=e.getBoundingClientRect();var r={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},p='HTML'===e.nodeName?h():{},s=p.width||e.clientWidth||r.right-r.left,d=p.height||e.clientHeight||r.bottom-r.top,l=e.offsetWidth-s,m=e.offsetHeight-d;if(l||m){var g=t(e);l-=f(g,'x'),m-=f(g,'y'),r.width-=l,r.height-=m}return c(r)}function u(e,o){var i=ie(),r='HTML'===o.nodeName,p=g(e),s=g(o),d=n(e),a=t(o),f=parseFloat(a.borderTopWidth,10),m=parseFloat(a.borderLeftWidth,10),h=c({top:p.top-s.top-f,left:p.left-s.left-m,width:p.width,height:p.height});if(h.marginTop=0,h.marginLeft=0,!i&&r){var u=parseFloat(a.marginTop,10),b=parseFloat(a.marginLeft,10);h.top-=f-u,h.bottom-=f-u,h.left-=m-b,h.right-=m-b,h.marginTop=u,h.marginLeft=b}return(i?o.contains(d):o===d&&'BODY'!==d.nodeName)&&(h=l(h,o)),h}function b(e){var t=e.ownerDocument.documentElement,o=u(e,t),i=J(t.clientWidth,window.innerWidth||0),n=J(t.clientHeight,window.innerHeight||0),r=a(t),p=a(t,'left'),s={top:r-o.top+o.marginTop,left:p-o.left+o.marginLeft,width:i,height:n};return c(s)}function w(e){var i=e.nodeName;return'BODY'===i||'HTML'===i?!1:'fixed'===t(e,'position')||w(o(e))}function y(e,t,i,r){var p={top:0,left:0},s=d(e,t);if('viewport'===r)p=b(s);else{var a;'scrollParent'===r?(a=n(o(t)),'BODY'===a.nodeName&&(a=e.ownerDocument.documentElement)):'window'===r?a=e.ownerDocument.documentElement:a=r;var l=u(a,s);if('HTML'===a.nodeName&&!w(s)){var f=h(),m=f.height,c=f.width;p.top+=l.top-l.marginTop,p.bottom=m+l.top,p.left+=l.left-l.marginLeft,p.right=c+l.left}else p=l}return p.left+=i,p.top+=i,p.right-=i,p.bottom-=i,p}function E(e){var t=e.width,o=e.height;return t*o}function v(e,t,o,i,n){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=y(o,i,r,n),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return se({key:e},s[e],{area:E(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,i=e.height;return t>=o.clientWidth&&i>=o.clientHeight}),l=0<a.length?a[0].key:d[0].key,f=e.split('-')[1];return l+(f?'-'+f:'')}function O(e,t,o){var i=d(t,o);return u(o,i)}function L(e){var t=getComputedStyle(e),o=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight),n={width:e.offsetWidth+i,height:e.offsetHeight+o};return n}function x(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function S(e,t,o){o=o.split('-')[0];var i=L(e),n={width:i.width,height:i.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return n[p]=t[p]+t[d]/2-i[d]/2,n[s]=o===s?t[s]-i[a]:t[x(s)],n}function T(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function D(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var i=T(e,function(e){return e[t]===o});return e.indexOf(i)}function C(t,o,i){var n=void 0===i?t:t.slice(0,D(t,'name',i));return n.forEach(function(t){t['function']&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var i=t['function']||t.fn;t.enabled&&e(i)&&(o.offsets.popper=c(o.offsets.popper),o.offsets.reference=c(o.offsets.reference),o=i(o,t))}),o}function N(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=O(this.state,this.popper,this.reference),e.placement=v(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.offsets.popper=S(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position='absolute',e=C(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function k(e,t){return e.some(function(e){var o=e.name,i=e.enabled;return i&&o===t})}function W(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length-1;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof document.body.style[r])return r}return null}function P(){return this.state.isDestroyed=!0,k(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[W('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function B(e){var t=e.ownerDocument;return t?t.defaultView:window}function H(e,t,o,i){var r='BODY'===e.nodeName,p=r?e.ownerDocument.defaultView:e;p.addEventListener(t,o,{passive:!0}),r||H(n(p.parentNode),t,o,i),i.push(p)}function A(e,t,o,i){o.updateBound=i,B(e).addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return H(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function I(){this.state.eventsEnabled||(this.state=A(this.reference,this.options,this.state,this.scheduleUpdate))}function M(e,t){return B(e).removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function R(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=M(this.reference,this.state))}function U(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function Y(e,t){Object.keys(t).forEach(function(o){var i='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&U(t[o])&&(i='px'),e.style[o]=t[o]+i})}function j(e,t){Object.keys(t).forEach(function(o){var i=t[o];!1===i?e.removeAttribute(o):e.setAttribute(o,t[o])})}function F(e,t,o){var i=T(e,function(e){var o=e.name;return o===t}),n=!!i&&e.some(function(e){return e.name===o&&e.enabled&&e.order<i.order});if(!n){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return n}function K(e){return'end'===e?'start':'start'===e?'end':e}function q(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=ae.indexOf(e),i=ae.slice(o+1).concat(ae.slice(0,o));return t?i.reverse():i}function V(e,t,o,i){var n=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+n[1],p=n[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=i;}var d=c(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?J(document.documentElement.clientHeight,window.innerHeight||0):J(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function z(e,t,o,i){var n=[0,0],r=-1!==['right','left'].indexOf(i),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(T(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,i){var n=(1===i?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return V(e,n,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,i){U(o)&&(n[t]+=o*('-'===e[i-1]?-1:1))})}),n}function G(e,t){var o,i=t.offset,n=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=n.split('-')[0];return o=U(+i)?[+i,0]:z(i,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e}for(var _=Math.min,X=Math.floor,J=Math.max,Q='undefined'!=typeof window&&'undefined'!=typeof document,Z=['Edge','Trident','Firefox'],$=0,ee=0;ee<Z.length;ee+=1)if(Q&&0<=navigator.userAgent.indexOf(Z[ee])){$=1;break}var i,te=Q&&window.Promise,oe=te?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},$))}},ie=function(){return void 0==i&&(i=-1!==navigator.appVersion.indexOf('MSIE 10')),i},ne=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},re=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,i){return o&&e(t.prototype,o),i&&e(t,i),t}}(),pe=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},se=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var i in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},de=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],ae=de.slice(3),le={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},fe=function(){function t(o,i){var n=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};ne(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=oe(this.update.bind(this)),this.options=se({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o&&o.jquery?o[0]:o,this.popper=i&&i.jquery?i[0]:i,this.options.modifiers={},Object.keys(se({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){n.options.modifiers[e]=se({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return se({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return re(t,[{key:'update',value:function(){return N.call(this)}},{key:'destroy',value:function(){return P.call(this)}},{key:'enableEventListeners',value:function(){return I.call(this)}},{key:'disableEventListeners',value:function(){return R.call(this)}}]),t}();return fe.Utils=('undefined'==typeof window?global:window).PopperUtils,fe.placements=de,fe.Defaults={placement:'bottom',eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],i=t.split('-')[1];if(i){var n=e.offsets,r=n.reference,p=n.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',l={start:pe({},d,r[d]),end:pe({},d,r[d]+r[a]-p[a])};e.offsets.popper=se({},p,l[i])}return e}},offset:{order:200,enabled:!0,fn:G,offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||r(e.instance.popper);e.instance.reference===o&&(o=r(o));var i=y(e.instance.popper,e.instance.reference,t.padding,o);t.boundaries=i;var n=t.priority,p=e.offsets.popper,s={primary:function(e){var o=p[e];return p[e]<i[e]&&!t.escapeWithReference&&(o=J(p[e],i[e])),pe({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=p[o];return p[e]>i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(i[d])&&(e.offsets.popper[d]=r(i[d])-o[a]),o[d]>r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-u<s[m]&&(e.offsets.popper[m]-=s[m]-(d[g]-u)),d[m]+u>s[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)<f(l.right)||'top'===i&&f(a.bottom)>f(l.top)||'bottom'===i&&f(a.top)<f(l.bottom),h=f(a.left)<f(o.left),c=f(a.right)>f(o.right),g=f(a.top)<f(o.top),u=f(a.bottom)>f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,i=t.y,n=e.offsets.popper,p=T(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;void 0!==p&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===p?t.gpuAcceleration:p,l=r(e.instance.popper),f=g(l),m={position:n.position},h={left:X(n.left),top:X(n.top),bottom:X(n.bottom),right:X(n.right)},c='bottom'===o?'top':'bottom',u='right'===i?'left':'right',b=W('transform');if(d='bottom'==c?-f.height+h.bottom:h.top,s='right'==u?-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[u]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==u?-1:1;m[c]=d*w,m[u]=s*y,m.willChange=c+', '+u}var E={"x-placement":e.placement};return e.attributes=se({},E,e.attributes),e.styles=se({},m,e.styles),e.arrowStyles=se({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return Y(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&Y(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,i,n){var r=O(n,t,e),p=v(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),Y(t,{position:'absolute'}),o},gpuAcceleration:void 0}}},fe});
//# sourceMappingURL=popper.min.js.map

/*! ScrollMagic v2.0.5 | (c) 2015 Jan Paepke (@janpaepke) | license & info: http://scrollmagic.io */
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.ScrollMagic=t()}(this,function(){"use strict";var e=function(){};e.version="2.0.5",window.addEventListener("mousewheel",function(){});var t="data-scrollmagic-pin-spacer";e.Controller=function(r){var o,s,a="ScrollMagic.Controller",l="FORWARD",c="REVERSE",u="PAUSED",f=n.defaults,d=this,h=i.extend({},f,r),g=[],p=!1,v=0,m=u,w=!0,y=0,S=!0,b=function(){for(var e in h)f.hasOwnProperty(e)||delete h[e];if(h.container=i.get.elements(h.container)[0],!h.container)throw a+" init failed.";w=h.container===window||h.container===document.body||!document.body.contains(h.container),w&&(h.container=window),y=z(),h.container.addEventListener("resize",T),h.container.addEventListener("scroll",T),h.refreshInterval=parseInt(h.refreshInterval)||f.refreshInterval,E()},E=function(){h.refreshInterval>0&&(s=window.setTimeout(A,h.refreshInterval))},x=function(){return h.vertical?i.get.scrollTop(h.container):i.get.scrollLeft(h.container)},z=function(){return h.vertical?i.get.height(h.container):i.get.width(h.container)},C=this._setScrollPos=function(e){h.vertical?w?window.scrollTo(i.get.scrollLeft(),e):h.container.scrollTop=e:w?window.scrollTo(e,i.get.scrollTop()):h.container.scrollLeft=e},F=function(){if(S&&p){var e=i.type.Array(p)?p:g.slice(0);p=!1;var t=v;v=d.scrollPos();var n=v-t;0!==n&&(m=n>0?l:c),m===c&&e.reverse(),e.forEach(function(e){e.update(!0)})}},L=function(){o=i.rAF(F)},T=function(e){"resize"==e.type&&(y=z(),m=u),p!==!0&&(p=!0,L())},A=function(){if(!w&&y!=z()){var e;try{e=new Event("resize",{bubbles:!1,cancelable:!1})}catch(t){e=document.createEvent("Event"),e.initEvent("resize",!1,!1)}h.container.dispatchEvent(e)}g.forEach(function(e){e.refresh()}),E()};this._options=h;var O=function(e){if(e.length<=1)return e;var t=e.slice(0);return t.sort(function(e,t){return e.scrollOffset()>t.scrollOffset()?1:-1}),t};return this.addScene=function(t){if(i.type.Array(t))t.forEach(function(e){d.addScene(e)});else if(t instanceof e.Scene)if(t.controller()!==d)t.addTo(d);else if(g.indexOf(t)<0){g.push(t),g=O(g),t.on("shift.controller_sort",function(){g=O(g)});for(var n in h.globalSceneOptions)t[n]&&t[n].call(t,h.globalSceneOptions[n])}return d},this.removeScene=function(e){if(i.type.Array(e))e.forEach(function(e){d.removeScene(e)});else{var t=g.indexOf(e);t>-1&&(e.off("shift.controller_sort"),g.splice(t,1),e.remove())}return d},this.updateScene=function(t,n){return i.type.Array(t)?t.forEach(function(e){d.updateScene(e,n)}):n?t.update(!0):p!==!0&&t instanceof e.Scene&&(p=p||[],-1==p.indexOf(t)&&p.push(t),p=O(p),L()),d},this.update=function(e){return T({type:"resize"}),e&&F(),d},this.scrollTo=function(n,r){if(i.type.Number(n))C.call(h.container,n,r);else if(n instanceof e.Scene)n.controller()===d&&d.scrollTo(n.scrollOffset(),r);else if(i.type.Function(n))C=n;else{var o=i.get.elements(n)[0];if(o){for(;o.parentNode.hasAttribute(t);)o=o.parentNode;var s=h.vertical?"top":"left",a=i.get.offset(h.container),l=i.get.offset(o);w||(a[s]-=d.scrollPos()),d.scrollTo(l[s]-a[s],r)}}return d},this.scrollPos=function(e){return arguments.length?(i.type.Function(e)&&(x=e),d):x.call(d)},this.info=function(e){var t={size:y,vertical:h.vertical,scrollPos:v,scrollDirection:m,container:h.container,isDocument:w};return arguments.length?void 0!==t[e]?t[e]:void 0:t},this.loglevel=function(){return d},this.enabled=function(e){return arguments.length?(S!=e&&(S=!!e,d.updateScene(g,!0)),d):S},this.destroy=function(e){window.clearTimeout(s);for(var t=g.length;t--;)g[t].destroy(e);return h.container.removeEventListener("resize",T),h.container.removeEventListener("scroll",T),i.cAF(o),null},b(),d};var n={defaults:{container:window,vertical:!0,globalSceneOptions:{},loglevel:2,refreshInterval:100}};e.Controller.addOption=function(e,t){n.defaults[e]=t},e.Controller.extend=function(t){var n=this;e.Controller=function(){return n.apply(this,arguments),this.$super=i.extend({},this),t.apply(this,arguments)||this},i.extend(e.Controller,n),e.Controller.prototype=n.prototype,e.Controller.prototype.constructor=e.Controller},e.Scene=function(n){var o,s,a="BEFORE",l="DURING",c="AFTER",u=r.defaults,f=this,d=i.extend({},u,n),h=a,g=0,p={start:0,end:0},v=0,m=!0,w=function(){for(var e in d)u.hasOwnProperty(e)||delete d[e];for(var t in u)L(t);C()},y={};this.on=function(e,t){return i.type.Function(t)&&(e=e.trim().split(" "),e.forEach(function(e){var n=e.split("."),r=n[0],i=n[1];"*"!=r&&(y[r]||(y[r]=[]),y[r].push({namespace:i||"",callback:t}))})),f},this.off=function(e,t){return e?(e=e.trim().split(" "),e.forEach(function(e){var n=e.split("."),r=n[0],i=n[1]||"",o="*"===r?Object.keys(y):[r];o.forEach(function(e){for(var n=y[e]||[],r=n.length;r--;){var o=n[r];!o||i!==o.namespace&&"*"!==i||t&&t!=o.callback||n.splice(r,1)}n.length||delete y[e]})}),f):f},this.trigger=function(t,n){if(t){var r=t.trim().split("."),i=r[0],o=r[1],s=y[i];s&&s.forEach(function(t){o&&o!==t.namespace||t.callback.call(f,new e.Event(i,t.namespace,f,n))})}return f},f.on("change.internal",function(e){"loglevel"!==e.what&&"tweenChanges"!==e.what&&("triggerElement"===e.what?E():"reverse"===e.what&&f.update())}).on("shift.internal",function(){S(),f.update()}),this.addTo=function(t){return t instanceof e.Controller&&s!=t&&(s&&s.removeScene(f),s=t,C(),b(!0),E(!0),S(),s.info("container").addEventListener("resize",x),t.addScene(f),f.trigger("add",{controller:s}),f.update()),f},this.enabled=function(e){return arguments.length?(m!=e&&(m=!!e,f.update(!0)),f):m},this.remove=function(){if(s){s.info("container").removeEventListener("resize",x);var e=s;s=void 0,e.removeScene(f),f.trigger("remove")}return f},this.destroy=function(e){return f.trigger("destroy",{reset:e}),f.remove(),f.off("*.*"),null},this.update=function(e){if(s)if(e)if(s.enabled()&&m){var t,n=s.info("scrollPos");t=d.duration>0?(n-p.start)/(p.end-p.start):n>=p.start?1:0,f.trigger("update",{startPos:p.start,endPos:p.end,scrollPos:n}),f.progress(t)}else T&&h===l&&O(!0);else s.updateScene(f,!1);return f},this.refresh=function(){return b(),E(),f},this.progress=function(e){if(arguments.length){var t=!1,n=h,r=s?s.info("scrollDirection"):"PAUSED",i=d.reverse||e>=g;if(0===d.duration?(t=g!=e,g=1>e&&i?0:1,h=0===g?a:l):0>e&&h!==a&&i?(g=0,h=a,t=!0):e>=0&&1>e&&i?(g=e,h=l,t=!0):e>=1&&h!==c?(g=1,h=c,t=!0):h!==l||i||O(),t){var o={progress:g,state:h,scrollDirection:r},u=h!=n,p=function(e){f.trigger(e,o)};u&&n!==l&&(p("enter"),p(n===a?"start":"end")),p("progress"),u&&h!==l&&(p(h===a?"start":"end"),p("leave"))}return f}return g};var S=function(){p={start:v+d.offset},s&&d.triggerElement&&(p.start-=s.info("size")*d.triggerHook),p.end=p.start+d.duration},b=function(e){if(o){var t="duration";F(t,o.call(f))&&!e&&(f.trigger("change",{what:t,newval:d[t]}),f.trigger("shift",{reason:t}))}},E=function(e){var n=0,r=d.triggerElement;if(s&&r){for(var o=s.info(),a=i.get.offset(o.container),l=o.vertical?"top":"left";r.parentNode.hasAttribute(t);)r=r.parentNode;var c=i.get.offset(r);o.isDocument||(a[l]-=s.scrollPos()),n=c[l]-a[l]}var u=n!=v;v=n,u&&!e&&f.trigger("shift",{reason:"triggerElementPosition"})},x=function(){d.triggerHook>0&&f.trigger("shift",{reason:"containerResize"})},z=i.extend(r.validate,{duration:function(e){if(i.type.String(e)&&e.match(/^(\.|\d)*\d+%$/)){var t=parseFloat(e)/100;e=function(){return s?s.info("size")*t:0}}if(i.type.Function(e)){o=e;try{e=parseFloat(o())}catch(n){e=-1}}if(e=parseFloat(e),!i.type.Number(e)||0>e)throw o?(o=void 0,0):0;return e}}),C=function(e){e=arguments.length?[e]:Object.keys(z),e.forEach(function(e){var t;if(z[e])try{t=z[e](d[e])}catch(n){t=u[e]}finally{d[e]=t}})},F=function(e,t){var n=!1,r=d[e];return d[e]!=t&&(d[e]=t,C(e),n=r!=d[e]),n},L=function(e){f[e]||(f[e]=function(t){return arguments.length?("duration"===e&&(o=void 0),F(e,t)&&(f.trigger("change",{what:e,newval:d[e]}),r.shifts.indexOf(e)>-1&&f.trigger("shift",{reason:e})),f):d[e]})};this.controller=function(){return s},this.state=function(){return h},this.scrollOffset=function(){return p.start},this.triggerPosition=function(){var e=d.offset;return s&&(e+=d.triggerElement?v:s.info("size")*f.triggerHook()),e};var T,A;f.on("shift.internal",function(e){var t="duration"===e.reason;(h===c&&t||h===l&&0===d.duration)&&O(),t&&_()}).on("progress.internal",function(){O()}).on("add.internal",function(){_()}).on("destroy.internal",function(e){f.removePin(e.reset)});var O=function(e){if(T&&s){var t=s.info(),n=A.spacer.firstChild;if(e||h!==l){var r={position:A.inFlow?"relative":"absolute",top:0,left:0},o=i.css(n,"position")!=r.position;A.pushFollowers?d.duration>0&&(h===c&&0===parseFloat(i.css(A.spacer,"padding-top"))?o=!0:h===a&&0===parseFloat(i.css(A.spacer,"padding-bottom"))&&(o=!0)):r[t.vertical?"top":"left"]=d.duration*g,i.css(n,r),o&&_()}else{"fixed"!=i.css(n,"position")&&(i.css(n,{position:"fixed"}),_());var u=i.get.offset(A.spacer,!0),f=d.reverse||0===d.duration?t.scrollPos-p.start:Math.round(g*d.duration*10)/10;u[t.vertical?"top":"left"]+=f,i.css(A.spacer.firstChild,{top:u.top,left:u.left})}}},_=function(){if(T&&s&&A.inFlow){var e=h===l,t=s.info("vertical"),n=A.spacer.firstChild,r=i.isMarginCollapseType(i.css(A.spacer,"display")),o={};A.relSize.width||A.relSize.autoFullWidth?e?i.css(T,{width:i.get.width(A.spacer)}):i.css(T,{width:"100%"}):(o["min-width"]=i.get.width(t?T:n,!0,!0),o.width=e?o["min-width"]:"auto"),A.relSize.height?e?i.css(T,{height:i.get.height(A.spacer)-(A.pushFollowers?d.duration:0)}):i.css(T,{height:"100%"}):(o["min-height"]=i.get.height(t?n:T,!0,!r),o.height=e?o["min-height"]:"auto"),A.pushFollowers&&(o["padding"+(t?"Top":"Left")]=d.duration*g,o["padding"+(t?"Bottom":"Right")]=d.duration*(1-g)),i.css(A.spacer,o)}},N=function(){s&&T&&h===l&&!s.info("isDocument")&&O()},P=function(){s&&T&&h===l&&((A.relSize.width||A.relSize.autoFullWidth)&&i.get.width(window)!=i.get.width(A.spacer.parentNode)||A.relSize.height&&i.get.height(window)!=i.get.height(A.spacer.parentNode))&&_()},D=function(e){s&&T&&h===l&&!s.info("isDocument")&&(e.preventDefault(),s._setScrollPos(s.info("scrollPos")-((e.wheelDelta||e[s.info("vertical")?"wheelDeltaY":"wheelDeltaX"])/3||30*-e.detail)))};this.setPin=function(e,n){var r={pushFollowers:!0,spacerClass:"scrollmagic-pin-spacer"};if(n=i.extend({},r,n),e=i.get.elements(e)[0],!e)return f;if("fixed"===i.css(e,"position"))return f;if(T){if(T===e)return f;f.removePin()}T=e;var o=T.parentNode.style.display,s=["top","left","bottom","right","margin","marginLeft","marginRight","marginTop","marginBottom"];T.parentNode.style.display="none";var a="absolute"!=i.css(T,"position"),l=i.css(T,s.concat(["display"])),c=i.css(T,["width","height"]);T.parentNode.style.display=o,!a&&n.pushFollowers&&(n.pushFollowers=!1);var u=T.parentNode.insertBefore(document.createElement("div"),T),d=i.extend(l,{position:a?"relative":"absolute",boxSizing:"content-box",mozBoxSizing:"content-box",webkitBoxSizing:"content-box"});if(a||i.extend(d,i.css(T,["width","height"])),i.css(u,d),u.setAttribute(t,""),i.addClass(u,n.spacerClass),A={spacer:u,relSize:{width:"%"===c.width.slice(-1),height:"%"===c.height.slice(-1),autoFullWidth:"auto"===c.width&&a&&i.isMarginCollapseType(l.display)},pushFollowers:n.pushFollowers,inFlow:a},!T.___origStyle){T.___origStyle={};var h=T.style,g=s.concat(["width","height","position","boxSizing","mozBoxSizing","webkitBoxSizing"]);g.forEach(function(e){T.___origStyle[e]=h[e]||""})}return A.relSize.width&&i.css(u,{width:c.width}),A.relSize.height&&i.css(u,{height:c.height}),u.appendChild(T),i.css(T,{position:a?"relative":"absolute",margin:"auto",top:"auto",left:"auto",bottom:"auto",right:"auto"}),(A.relSize.width||A.relSize.autoFullWidth)&&i.css(T,{boxSizing:"border-box",mozBoxSizing:"border-box",webkitBoxSizing:"border-box"}),window.addEventListener("scroll",N),window.addEventListener("resize",N),window.addEventListener("resize",P),T.addEventListener("mousewheel",D),T.addEventListener("DOMMouseScroll",D),O(),f},this.removePin=function(e){if(T){if(h===l&&O(!0),e||!s){var n=A.spacer.firstChild;if(n.hasAttribute(t)){var r=A.spacer.style,o=["margin","marginLeft","marginRight","marginTop","marginBottom"];margins={},o.forEach(function(e){margins[e]=r[e]||""}),i.css(n,margins)}A.spacer.parentNode.insertBefore(n,A.spacer),A.spacer.parentNode.removeChild(A.spacer),T.parentNode.hasAttribute(t)||(i.css(T,T.___origStyle),delete T.___origStyle)}window.removeEventListener("scroll",N),window.removeEventListener("resize",N),window.removeEventListener("resize",P),T.removeEventListener("mousewheel",D),T.removeEventListener("DOMMouseScroll",D),T=void 0}return f};var R,k=[];return f.on("destroy.internal",function(e){f.removeClassToggle(e.reset)}),this.setClassToggle=function(e,t){var n=i.get.elements(e);return 0!==n.length&&i.type.String(t)?(k.length>0&&f.removeClassToggle(),R=t,k=n,f.on("enter.internal_class leave.internal_class",function(e){var t="enter"===e.type?i.addClass:i.removeClass;k.forEach(function(e){t(e,R)})}),f):f},this.removeClassToggle=function(e){return e&&k.forEach(function(e){i.removeClass(e,R)}),f.off("start.internal_class end.internal_class"),R=void 0,k=[],f},w(),f};var r={defaults:{duration:0,offset:0,triggerElement:void 0,triggerHook:.5,reverse:!0,loglevel:2},validate:{offset:function(e){if(e=parseFloat(e),!i.type.Number(e))throw 0;return e},triggerElement:function(e){if(e=e||void 0){var t=i.get.elements(e)[0];if(!t)throw 0;e=t}return e},triggerHook:function(e){var t={onCenter:.5,onEnter:1,onLeave:0};if(i.type.Number(e))e=Math.max(0,Math.min(parseFloat(e),1));else{if(!(e in t))throw 0;e=t[e]}return e},reverse:function(e){return!!e}},shifts:["duration","offset","triggerHook"]};e.Scene.addOption=function(e,t,n,i){e in r.defaults||(r.defaults[e]=t,r.validate[e]=n,i&&r.shifts.push(e))},e.Scene.extend=function(t){var n=this;e.Scene=function(){return n.apply(this,arguments),this.$super=i.extend({},this),t.apply(this,arguments)||this},i.extend(e.Scene,n),e.Scene.prototype=n.prototype,e.Scene.prototype.constructor=e.Scene},e.Event=function(e,t,n,r){r=r||{};for(var i in r)this[i]=r[i];return this.type=e,this.target=this.currentTarget=n,this.namespace=t||"",this.timeStamp=this.timestamp=Date.now(),this};var i=e._util=function(e){var t,n={},r=function(e){return parseFloat(e)||0},i=function(t){return t.currentStyle?t.currentStyle:e.getComputedStyle(t)},o=function(t,n,o,s){if(n=n===document?e:n,n===e)s=!1;else if(!f.DomElement(n))return 0;t=t.charAt(0).toUpperCase()+t.substr(1).toLowerCase();var a=(o?n["offset"+t]||n["outer"+t]:n["client"+t]||n["inner"+t])||0;if(o&&s){var l=i(n);a+="Height"===t?r(l.marginTop)+r(l.marginBottom):r(l.marginLeft)+r(l.marginRight)}return a},s=function(e){return e.replace(/^[^a-z]+([a-z])/g,"$1").replace(/-([a-z])/g,function(e){return e[1].toUpperCase()})};n.extend=function(e){for(e=e||{},t=1;t<arguments.length;t++)if(arguments[t])for(var n in arguments[t])arguments[t].hasOwnProperty(n)&&(e[n]=arguments[t][n]);return e},n.isMarginCollapseType=function(e){return["block","flex","list-item","table","-webkit-box"].indexOf(e)>-1};var a=0,l=["ms","moz","webkit","o"],c=e.requestAnimationFrame,u=e.cancelAnimationFrame;for(t=0;!c&&t<l.length;++t)c=e[l[t]+"RequestAnimationFrame"],u=e[l[t]+"CancelAnimationFrame"]||e[l[t]+"CancelRequestAnimationFrame"];c||(c=function(t){var n=(new Date).getTime(),r=Math.max(0,16-(n-a)),i=e.setTimeout(function(){t(n+r)},r);return a=n+r,i}),u||(u=function(t){e.clearTimeout(t)}),n.rAF=c.bind(e),n.cAF=u.bind(e);var f=n.type=function(e){return Object.prototype.toString.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase()};f.String=function(e){return"string"===f(e)},f.Function=function(e){return"function"===f(e)},f.Array=function(e){return Array.isArray(e)},f.Number=function(e){return!f.Array(e)&&e-parseFloat(e)+1>=0},f.DomElement=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&null!==e&&1===e.nodeType&&"string"==typeof e.nodeName};var d=n.get={};return d.elements=function(t){var n=[];if(f.String(t))try{t=document.querySelectorAll(t)}catch(r){return n}if("nodelist"===f(t)||f.Array(t))for(var i=0,o=n.length=t.length;o>i;i++){var s=t[i];n[i]=f.DomElement(s)?s:d.elements(s)}else(f.DomElement(t)||t===document||t===e)&&(n=[t]);return n},d.scrollTop=function(t){return t&&"number"==typeof t.scrollTop?t.scrollTop:e.pageYOffset||0},d.scrollLeft=function(t){return t&&"number"==typeof t.scrollLeft?t.scrollLeft:e.pageXOffset||0},d.width=function(e,t,n){return o("width",e,t,n)},d.height=function(e,t,n){return o("height",e,t,n)},d.offset=function(e,t){var n={top:0,left:0};if(e&&e.getBoundingClientRect){var r=e.getBoundingClientRect();n.top=r.top,n.left=r.left,t||(n.top+=d.scrollTop(),n.left+=d.scrollLeft())}return n},n.addClass=function(e,t){t&&(e.classList?e.classList.add(t):e.className+=" "+t)},n.removeClass=function(e,t){t&&(e.classList?e.classList.remove(t):e.className=e.className.replace(RegExp("(^|\\b)"+t.split(" ").join("|")+"(\\b|$)","gi")," "))},n.css=function(e,t){if(f.String(t))return i(e)[s(t)];if(f.Array(t)){var n={},r=i(e);return t.forEach(function(e){n[e]=r[s(e)]}),n}for(var o in t){var a=t[o];a==parseFloat(a)&&(a+="px"),e.style[s(o)]=a}},n}(window||{});return e});
/*!
 * 
 *   typed.js - A JavaScript Typing Animation Library
 *   Author: Matt Boldt <me@mattboldt.com>
 *   Version: v2.0.4
 *   Url: https://github.com/mattboldt/typed.js
 *   License(s): MIT
 * 
 */
(function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Typed=e():t.Typed=e()})(this,function(){return function(t){function e(n){if(s[n])return s[n].exports;var i=s[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var s={};return e.m=t,e.c=s,e.p="",e(0)}([function(t,e,s){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function t(t,e){for(var s=0;s<e.length;s++){var n=e[s];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,s,n){return s&&t(e.prototype,s),n&&t(e,n),e}}(),r=s(1),o=s(3),a=function(){function t(e,s){n(this,t),r.initializer.load(this,s,e),this.begin()}return i(t,[{key:"toggle",value:function(){this.pause.status?this.start():this.stop()}},{key:"stop",value:function(){this.typingComplete||this.pause.status||(this.toggleBlinking(!0),this.pause.status=!0,this.options.onStop(this.arrayPos,this))}},{key:"start",value:function(){this.typingComplete||this.pause.status&&(this.pause.status=!1,this.pause.typewrite?this.typewrite(this.pause.curString,this.pause.curStrPos):this.backspace(this.pause.curString,this.pause.curStrPos),this.options.onStart(this.arrayPos,this))}},{key:"destroy",value:function(){this.reset(!1),this.options.onDestroy(this)}},{key:"reset",value:function(){var t=arguments.length<=0||void 0===arguments[0]||arguments[0];clearInterval(this.timeout),this.replaceText(""),this.cursor&&this.cursor.parentNode&&(this.cursor.parentNode.removeChild(this.cursor),this.cursor=null),this.strPos=0,this.arrayPos=0,this.curLoop=0,t&&(this.insertCursor(),this.options.onReset(this),this.begin())}},{key:"begin",value:function(){var t=this;this.typingComplete=!1,this.shuffleStringsIfNeeded(this),this.insertCursor(),this.bindInputFocusEvents&&this.bindFocusEvents(),this.timeout=setTimeout(function(){t.currentElContent&&0!==t.currentElContent.length?t.backspace(t.currentElContent,t.currentElContent.length):t.typewrite(t.strings[t.sequence[t.arrayPos]],t.strPos)},this.startDelay)}},{key:"typewrite",value:function(t,e){var s=this;this.fadeOut&&this.el.classList.contains(this.fadeOutClass)&&(this.el.classList.remove(this.fadeOutClass),this.cursor&&this.cursor.classList.remove(this.fadeOutClass));var n=this.humanizer(this.typeSpeed),i=1;return this.pause.status===!0?void this.setPauseStatus(t,e,!0):void(this.timeout=setTimeout(function(){e=o.htmlParser.typeHtmlChars(t,e,s);var n=0,r=t.substr(e);if("^"===r.charAt(0)&&/^\^\d+/.test(r)){var a=1;r=/\d+/.exec(r)[0],a+=r.length,n=parseInt(r),s.temporaryPause=!0,s.options.onTypingPaused(s.arrayPos,s),t=t.substring(0,e)+t.substring(e+a),s.toggleBlinking(!0)}if("`"===r.charAt(0)){for(;"`"!==t.substr(e+i).charAt(0)&&(i++,!(e+i>t.length)););var u=t.substring(0,e),l=t.substring(u.length+1,e+i),c=t.substring(e+i+1);t=u+l+c,i--}s.timeout=setTimeout(function(){s.toggleBlinking(!1),e===t.length?s.doneTyping(t,e):s.keepTyping(t,e,i),s.temporaryPause&&(s.temporaryPause=!1,s.options.onTypingResumed(s.arrayPos,s))},n)},n))}},{key:"keepTyping",value:function(t,e,s){0===e&&(this.toggleBlinking(!1),this.options.preStringTyped(this.arrayPos,this)),e+=s;var n=t.substr(0,e);this.replaceText(n),this.typewrite(t,e)}},{key:"doneTyping",value:function(t,e){var s=this;this.options.onStringTyped(this.arrayPos,this),this.toggleBlinking(!0),this.arrayPos===this.strings.length-1&&(this.complete(),this.loop===!1||this.curLoop===this.loopCount)||(this.timeout=setTimeout(function(){s.backspace(t,e)},this.backDelay))}},{key:"backspace",value:function(t,e){var s=this;if(this.pause.status===!0)return void this.setPauseStatus(t,e,!0);if(this.fadeOut)return this.initFadeOut();this.toggleBlinking(!1);var n=this.humanizer(this.backSpeed);this.timeout=setTimeout(function(){e=o.htmlParser.backSpaceHtmlChars(t,e,s);var n=t.substr(0,e);if(s.replaceText(n),s.smartBackspace){var i=s.strings[s.arrayPos+1];i&&n===i.substr(0,e)?s.stopNum=e:s.stopNum=0}e>s.stopNum?(e--,s.backspace(t,e)):e<=s.stopNum&&(s.arrayPos++,s.arrayPos===s.strings.length?(s.arrayPos=0,s.options.onLastStringBackspaced(),s.shuffleStringsIfNeeded(),s.begin()):s.typewrite(s.strings[s.sequence[s.arrayPos]],e))},n)}},{key:"complete",value:function(){this.options.onComplete(this),this.loop?this.curLoop++:this.typingComplete=!0}},{key:"setPauseStatus",value:function(t,e,s){this.pause.typewrite=s,this.pause.curString=t,this.pause.curStrPos=e}},{key:"toggleBlinking",value:function(t){if(this.cursor&&!this.pause.status&&this.cursorBlinking!==t){this.cursorBlinking=t;var e=t?"infinite":0;this.cursor.style.animationIterationCount=e}}},{key:"humanizer",value:function(t){return Math.round(Math.random()*t/2)+t}},{key:"shuffleStringsIfNeeded",value:function(){this.shuffle&&(this.sequence=this.sequence.sort(function(){return Math.random()-.5}))}},{key:"initFadeOut",value:function(){var t=this;return this.el.className+=" "+this.fadeOutClass,this.cursor&&(this.cursor.className+=" "+this.fadeOutClass),setTimeout(function(){t.arrayPos++,t.replaceText(""),t.strings.length>t.arrayPos?t.typewrite(t.strings[t.sequence[t.arrayPos]],0):(t.typewrite(t.strings[0],0),t.arrayPos=0)},this.fadeOutDelay)}},{key:"replaceText",value:function(t){this.attr?this.el.setAttribute(this.attr,t):this.isInput?this.el.value=t:"html"===this.contentType?this.el.innerHTML=t:this.el.textContent=t}},{key:"bindFocusEvents",value:function(){var t=this;this.isInput&&(this.el.addEventListener("focus",function(e){t.stop()}),this.el.addEventListener("blur",function(e){t.el.value&&0!==t.el.value.length||t.start()}))}},{key:"insertCursor",value:function(){this.showCursor&&(this.cursor||(this.cursor=document.createElement("span"),this.cursor.className="typed-cursor",this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)))}}]),t}();e["default"]=a,t.exports=e["default"]},function(t,e,s){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var s=arguments[e];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(t[n]=s[n])}return t},o=function(){function t(t,e){for(var s=0;s<e.length;s++){var n=e[s];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,s,n){return s&&t(e.prototype,s),n&&t(e,n),e}}(),a=s(2),u=n(a),l=function(){function t(){i(this,t)}return o(t,[{key:"load",value:function(t,e,s){if("string"==typeof s?t.el=document.querySelector(s):t.el=s,t.options=r({},u["default"],e),t.isInput="input"===t.el.tagName.toLowerCase(),t.attr=t.options.attr,t.bindInputFocusEvents=t.options.bindInputFocusEvents,t.showCursor=!t.isInput&&t.options.showCursor,t.cursorChar=t.options.cursorChar,t.cursorBlinking=!0,t.elContent=t.attr?t.el.getAttribute(t.attr):t.el.textContent,t.contentType=t.options.contentType,t.typeSpeed=t.options.typeSpeed,t.startDelay=t.options.startDelay,t.backSpeed=t.options.backSpeed,t.smartBackspace=t.options.smartBackspace,t.backDelay=t.options.backDelay,t.fadeOut=t.options.fadeOut,t.fadeOutClass=t.options.fadeOutClass,t.fadeOutDelay=t.options.fadeOutDelay,t.isPaused=!1,t.strings=t.options.strings.map(function(t){return t.trim()}),"string"==typeof t.options.stringsElement?t.stringsElement=document.querySelector(t.options.stringsElement):t.stringsElement=t.options.stringsElement,t.stringsElement){t.strings=[],t.stringsElement.style.display="none";var n=Array.prototype.slice.apply(t.stringsElement.children),i=!0,o=!1,a=void 0;try{for(var l,c=n[Symbol.iterator]();!(i=(l=c.next()).done);i=!0){var p=l.value;t.strings.push(p.innerHTML.trim())}}catch(h){o=!0,a=h}finally{try{!i&&c["return"]&&c["return"]()}finally{if(o)throw a}}}t.strPos=0,t.arrayPos=0,t.stopNum=0,t.loop=t.options.loop,t.loopCount=t.options.loopCount,t.curLoop=0,t.shuffle=t.options.shuffle,t.sequence=[],t.pause={status:!1,typewrite:!0,curString:"",curStrPos:0},t.typingComplete=!1;for(var f in t.strings)t.sequence[f]=f;t.currentElContent=this.getCurrentElContent(t),t.autoInsertCss=t.options.autoInsertCss,this.appendAnimationCss(t)}},{key:"getCurrentElContent",value:function(t){var e="";return e=t.attr?t.el.getAttribute(t.attr):t.isInput?t.el.value:"html"===t.contentType?t.el.innerHTML:t.el.textContent}},{key:"appendAnimationCss",value:function(t){if(t.autoInsertCss&&t.showCursor&&t.fadeOut){var e=document.createElement("style");e.type="text/css";var s="";t.showCursor&&(s+="\n        .typed-cursor{\n          opacity: 1;\n          animation: typedjsBlink 0.7s infinite;\n          -webkit-animation: typedjsBlink 0.7s infinite;\n                  animation: typedjsBlink 0.7s infinite;\n        }\n        @keyframes typedjsBlink{\n          50% { opacity: 0.0; }\n        }\n        @-webkit-keyframes typedjsBlink{\n          0% { opacity: 1; }\n          50% { opacity: 0.0; }\n          100% { opacity: 1; }\n        }\n      "),t.fadeOut&&(s+="\n        .typed-fade-out{\n          opacity: 0;\n          transition: opacity .25s;\n          -webkit-animation: 0;\n                  animation: 0;\n        }\n      "),0!==e.length&&(e.innerHTML=s,document.head.appendChild(e))}}}]),t}();e["default"]=l;var c=new l;e.initializer=c},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],stringsElement:null,typeSpeed:0,startDelay:0,backSpeed:0,smartBackspace:!0,shuffle:!1,backDelay:700,fadeOut:!1,fadeOutClass:"typed-fade-out",fadeOutDelay:500,loop:!1,loopCount:1/0,showCursor:!0,cursorChar:"|",autoInsertCss:!0,attr:null,bindInputFocusEvents:!1,contentType:"html",onComplete:function(t){},preStringTyped:function(t,e){},onStringTyped:function(t,e){},onLastStringBackspaced:function(t){},onTypingPaused:function(t,e){},onTypingResumed:function(t,e){},onReset:function(t){},onStop:function(t,e){},onStart:function(t,e){},onDestroy:function(t){}};e["default"]=s,t.exports=e["default"]},function(t,e){"use strict";function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var s=0;s<e.length;s++){var n=e[s];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,s,n){return s&&t(e.prototype,s),n&&t(e,n),e}}(),i=function(){function t(){s(this,t)}return n(t,[{key:"typeHtmlChars",value:function(t,e,s){if("html"!==s.contentType)return e;var n=t.substr(e).charAt(0);if("<"===n||"&"===n){var i="";for(i="<"===n?">":";";t.substr(e+1).charAt(0)!==i&&(e++,!(e+1>t.length)););e++}return e}},{key:"backSpaceHtmlChars",value:function(t,e,s){if("html"!==s.contentType)return e;var n=t.substr(e).charAt(0);if(">"===n||";"===n){var i="";for(i=">"===n?"<":"&";t.substr(e-1).charAt(0)!==i&&(e--,!(e<0)););e--}return e}}]),t}();e["default"]=i;var r=new i;e.htmlParser=r}])});
//# sourceMappingURL=typed.min.js.map

/*! WOW - v1.1.3 - 2016-05-06
* Copyright (c) 2016 Matthieu Aussaguel;*/(function(){var a,b,c,d,e,f=function(a,b){return function(){return a.apply(b,arguments)}},g=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=function(){function a(){}return a.prototype.extend=function(a,b){var c,d;for(c in b)d=b[c],null==a[c]&&(a[c]=d);return a},a.prototype.isMobile=function(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)},a.prototype.createEvent=function(a,b,c,d){var e;return null==b&&(b=!1),null==c&&(c=!1),null==d&&(d=null),null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e},a.prototype.emitEvent=function(a,b){return null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b in(null!=a)?a["on"+b]():void 0},a.prototype.addEvent=function(a,b,c){return null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c},a.prototype.removeEvent=function(a,b,c){return null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]},a.prototype.innerHeight=function(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight},a}(),c=this.WeakMap||this.MozWeakMap||(c=function(){function a(){this.keys=[],this.values=[]}return a.prototype.get=function(a){var b,c,d,e,f;for(f=this.keys,b=d=0,e=f.length;e>d;b=++d)if(c=f[b],c===a)return this.values[b]},a.prototype.set=function(a,b){var c,d,e,f,g;for(g=this.keys,c=e=0,f=g.length;f>e;c=++e)if(d=g[c],d===a)return void(this.values[c]=b);return this.keys.push(a),this.values.push(b)},a}()),a=this.MutationObserver||this.WebkitMutationObserver||this.MozMutationObserver||(a=function(){function a(){"undefined"!=typeof console&&null!==console&&console.warn("MutationObserver is not supported by your browser."),"undefined"!=typeof console&&null!==console&&console.warn("WOW.js cannot detect dom mutations, please call .sync() after loading new content.")}return a.notSupported=!0,a.prototype.observe=function(){},a}()),d=this.getComputedStyle||function(a,b){return this.getPropertyValue=function(b){var c;return"float"===b&&(b="styleFloat"),e.test(b)&&b.replace(e,function(a,b){return b.toUpperCase()}),(null!=(c=a.currentStyle)?c[b]:void 0)||null},this},e=/(\-([a-z]){1})/g,this.WOW=function(){function e(a){null==a&&(a={}),this.scrollCallback=f(this.scrollCallback,this),this.scrollHandler=f(this.scrollHandler,this),this.resetAnimation=f(this.resetAnimation,this),this.start=f(this.start,this),this.scrolled=!0,this.config=this.util().extend(a,this.defaults),null!=a.scrollContainer&&(this.config.scrollContainer=document.querySelector(a.scrollContainer)),this.animationNameCache=new c,this.wowEvent=this.util().createEvent(this.config.boxClass)}return e.prototype.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0,live:!0,callback:null,scrollContainer:null},e.prototype.init=function(){var a;return this.element=window.document.documentElement,"interactive"===(a=document.readyState)||"complete"===a?this.start():this.util().addEvent(document,"DOMContentLoaded",this.start),this.finished=[]},e.prototype.start=function(){var b,c,d,e;if(this.stopped=!1,this.boxes=function(){var a,c,d,e;for(d=this.element.querySelectorAll("."+this.config.boxClass),e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.all=function(){var a,c,d,e;for(d=this.boxes,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.boxes.length)if(this.disabled())this.resetStyle();else for(e=this.boxes,c=0,d=e.length;d>c;c++)b=e[c],this.applyStyle(b,!0);return this.disabled()||(this.util().addEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().addEvent(window,"resize",this.scrollHandler),this.interval=setInterval(this.scrollCallback,50)),this.config.live?new a(function(a){return function(b){var c,d,e,f,g;for(g=[],c=0,d=b.length;d>c;c++)f=b[c],g.push(function(){var a,b,c,d;for(c=f.addedNodes||[],d=[],a=0,b=c.length;b>a;a++)e=c[a],d.push(this.doSync(e));return d}.call(a));return g}}(this)).observe(document.body,{childList:!0,subtree:!0}):void 0},e.prototype.stop=function(){return this.stopped=!0,this.util().removeEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().removeEvent(window,"resize",this.scrollHandler),null!=this.interval?clearInterval(this.interval):void 0},e.prototype.sync=function(b){return a.notSupported?this.doSync(this.element):void 0},e.prototype.doSync=function(a){var b,c,d,e,f;if(null==a&&(a=this.element),1===a.nodeType){for(a=a.parentNode||a,e=a.querySelectorAll("."+this.config.boxClass),f=[],c=0,d=e.length;d>c;c++)b=e[c],g.call(this.all,b)<0?(this.boxes.push(b),this.all.push(b),this.stopped||this.disabled()?this.resetStyle():this.applyStyle(b,!0),f.push(this.scrolled=!0)):f.push(void 0);return f}},e.prototype.show=function(a){return this.applyStyle(a),a.className=a.className+" "+this.config.animateClass,null!=this.config.callback&&this.config.callback(a),this.util().emitEvent(a,this.wowEvent),this.util().addEvent(a,"animationend",this.resetAnimation),this.util().addEvent(a,"oanimationend",this.resetAnimation),this.util().addEvent(a,"webkitAnimationEnd",this.resetAnimation),this.util().addEvent(a,"MSAnimationEnd",this.resetAnimation),a},e.prototype.applyStyle=function(a,b){var c,d,e;return d=a.getAttribute("data-wow-duration"),c=a.getAttribute("data-wow-delay"),e=a.getAttribute("data-wow-iteration"),this.animate(function(f){return function(){return f.customStyle(a,b,d,c,e)}}(this))},e.prototype.animate=function(){return"requestAnimationFrame"in window?function(a){return window.requestAnimationFrame(a)}:function(a){return a()}}(),e.prototype.resetStyle=function(){var a,b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(a.style.visibility="visible");return e},e.prototype.resetAnimation=function(a){var b;return a.type.toLowerCase().indexOf("animationend")>=0?(b=a.target||a.srcElement,b.className=b.className.replace(this.config.animateClass,"").trim()):void 0},e.prototype.customStyle=function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a},e.prototype.vendors=["moz","webkit"],e.prototype.vendorSet=function(a,b){var c,d,e,f;d=[];for(c in b)e=b[c],a[""+c]=e,d.push(function(){var b,d,g,h;for(g=this.vendors,h=[],b=0,d=g.length;d>b;b++)f=g[b],h.push(a[""+f+c.charAt(0).toUpperCase()+c.substr(1)]=e);return h}.call(this));return d},e.prototype.vendorCSS=function(a,b){var c,e,f,g,h,i;for(h=d(a),g=h.getPropertyCSSValue(b),f=this.vendors,c=0,e=f.length;e>c;c++)i=f[c],g=g||h.getPropertyCSSValue("-"+i+"-"+b);return g},e.prototype.animationName=function(a){var b;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=d(a).getPropertyValue("animation-name")}return"none"===b?"":b},e.prototype.cacheAnimationName=function(a){return this.animationNameCache.set(a,this.animationName(a))},e.prototype.cachedAnimationName=function(a){return this.animationNameCache.get(a)},e.prototype.scrollHandler=function(){return this.scrolled=!0},e.prototype.scrollCallback=function(){var a;return!this.scrolled||(this.scrolled=!1,this.boxes=function(){var b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],a&&(this.isVisible(a)?this.show(a):e.push(a));return e}.call(this),this.boxes.length||this.config.live)?void 0:this.stop()},e.prototype.offsetTop=function(a){for(var b;void 0===a.offsetTop;)a=a.parentNode;for(b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop;return b},e.prototype.isVisible=function(a){var b,c,d,e,f;return c=a.getAttribute("data-wow-offset")||this.config.offset,f=this.config.scrollContainer&&this.config.scrollContainer.scrollTop||window.pageYOffset,e=f+Math.min(this.element.clientHeight,this.util().innerHeight())-c,d=this.offsetTop(a),b=d+a.clientHeight,e>=d&&b>=f},e.prototype.util=function(){return null!=this._util?this._util:this._util=new b},e.prototype.disabled=function(){return!this.config.mobile&&this.util().isMobile(navigator.userAgent)},e}()}).call(this);
/**
 * bxSlider v4.2.12
 * Copyright 2013-2015 Steven Wanderski
 * Written while drinking Belgian ales and listening to jazz
 * Licensed under MIT (http://opensource.org/licenses/MIT)
 */
!function(t){var e={mode:"horizontal",slideSelector:"",infiniteLoop:!0,hideControlOnEnd:!1,speed:500,easing:null,slideMargin:0,startSlide:0,randomStart:!1,captions:!1,ticker:!1,tickerHover:!1,adaptiveHeight:!1,adaptiveHeightSpeed:500,video:!1,useCSS:!0,preloadImages:"visible",responsive:!0,slideZIndex:50,wrapperClass:"bx-wrapper",touchEnabled:!0,swipeThreshold:50,oneToOneTouch:!0,preventDefaultSwipeX:!0,preventDefaultSwipeY:!1,ariaLive:!0,ariaHidden:!0,keyboardEnabled:!1,pager:!0,pagerType:"full",pagerShortSeparator:" / ",pagerSelector:null,buildPager:null,pagerCustom:null,controls:!0,nextText:"Next",prevText:"Prev",nextSelector:null,prevSelector:null,autoControls:!1,startText:"Start",stopText:"Stop",autoControlsCombine:!1,autoControlsSelector:null,auto:!1,pause:4e3,autoStart:!0,autoDirection:"next",stopAutoOnClick:!1,autoHover:!1,autoDelay:0,autoSlideForOnePage:!1,minSlides:1,maxSlides:1,moveSlides:0,slideWidth:0,shrinkItems:!1,onSliderLoad:function(){return!0},onSlideBefore:function(){return!0},onSlideAfter:function(){return!0},onSlideNext:function(){return!0},onSlidePrev:function(){return!0},onSliderResize:function(){return!0}};t.fn.bxSlider=function(n){if(0===this.length)return this;if(this.length>1)return this.each(function(){t(this).bxSlider(n)}),this;var s={},o=this,r=t(window).width(),a=t(window).height();if(!t(o).data("bxSlider")){var l=function(){t(o).data("bxSlider")||(s.settings=t.extend({},e,n),s.settings.slideWidth=parseInt(s.settings.slideWidth),s.children=o.children(s.settings.slideSelector),s.children.length<s.settings.minSlides&&(s.settings.minSlides=s.children.length),s.children.length<s.settings.maxSlides&&(s.settings.maxSlides=s.children.length),s.settings.randomStart&&(s.settings.startSlide=Math.floor(Math.random()*s.children.length)),s.active={index:s.settings.startSlide},s.carousel=s.settings.minSlides>1||s.settings.maxSlides>1,s.carousel&&(s.settings.preloadImages="all"),s.minThreshold=s.settings.minSlides*s.settings.slideWidth+(s.settings.minSlides-1)*s.settings.slideMargin,s.maxThreshold=s.settings.maxSlides*s.settings.slideWidth+(s.settings.maxSlides-1)*s.settings.slideMargin,s.working=!1,s.controls={},s.interval=null,s.animProp="vertical"===s.settings.mode?"top":"left",s.usingCSS=s.settings.useCSS&&"fade"!==s.settings.mode&&function(){for(var t=document.createElement("div"),e=["WebkitPerspective","MozPerspective","OPerspective","msPerspective"],i=0;i<e.length;i++)if(void 0!==t.style[e[i]])return s.cssPrefix=e[i].replace("Perspective","").toLowerCase(),s.animProp="-"+s.cssPrefix+"-transform",!0;return!1}(),"vertical"===s.settings.mode&&(s.settings.maxSlides=s.settings.minSlides),o.data("origStyle",o.attr("style")),o.children(s.settings.slideSelector).each(function(){t(this).data("origStyle",t(this).attr("style"))}),d())},d=function(){var e=s.children.eq(s.settings.startSlide);o.wrap('<div class="'+s.settings.wrapperClass+'"><div class="bx-viewport"></div></div>'),s.viewport=o.parent(),s.settings.ariaLive&&!s.settings.ticker&&s.viewport.attr("aria-live","polite"),s.loader=t('<div class="bx-loading" />'),s.viewport.prepend(s.loader),o.css({width:"horizontal"===s.settings.mode?1e3*s.children.length+215+"%":"auto",position:"relative"}),s.usingCSS&&s.settings.easing?o.css("-"+s.cssPrefix+"-transition-timing-function",s.settings.easing):s.settings.easing||(s.settings.easing="swing"),s.viewport.css({width:"100%",overflow:"hidden",position:"relative"}),s.viewport.parent().css({maxWidth:u()}),s.children.css({float:"horizontal"===s.settings.mode?"left":"none",listStyle:"none",position:"relative"}),s.children.css("width",h()),"horizontal"===s.settings.mode&&s.settings.slideMargin>0&&s.children.css("marginRight",s.settings.slideMargin),"vertical"===s.settings.mode&&s.settings.slideMargin>0&&s.children.css("marginBottom",s.settings.slideMargin),"fade"===s.settings.mode&&(s.children.css({position:"absolute",zIndex:0,display:"none"}),s.children.eq(s.settings.startSlide).css({zIndex:s.settings.slideZIndex,display:"block"})),s.controls.el=t('<div class="bx-controls" />'),s.settings.captions&&P(),s.active.last=s.settings.startSlide===f()-1,s.settings.video&&o.fitVids(),("all"===s.settings.preloadImages||s.settings.ticker)&&(e=s.children),s.settings.ticker?s.settings.pager=!1:(s.settings.controls&&C(),s.settings.auto&&s.settings.autoControls&&T(),s.settings.pager&&w(),(s.settings.controls||s.settings.autoControls||s.settings.pager)&&s.viewport.after(s.controls.el)),c(e,g)},c=function(e,i){var n=e.find('img:not([src=""]), iframe').length,s=0;return 0===n?void i():void e.find('img:not([src=""]), iframe').each(function(){t(this).one("load error",function(){++s===n&&i()}).each(function(){this.complete&&t(this).trigger("load")})})},g=function(){if(s.settings.infiniteLoop&&"fade"!==s.settings.mode&&!s.settings.ticker){var e="vertical"===s.settings.mode?s.settings.minSlides:s.settings.maxSlides,i=s.children.slice(0,e).clone(!0).addClass("bx-clone"),n=s.children.slice(-e).clone(!0).addClass("bx-clone");s.settings.ariaHidden&&(i.attr("aria-hidden",!0),n.attr("aria-hidden",!0)),o.append(i).prepend(n)}s.loader.remove(),m(),"vertical"===s.settings.mode&&(s.settings.adaptiveHeight=!0),s.viewport.height(p()),o.redrawSlider(),s.settings.onSliderLoad.call(o,s.active.index),s.initialized=!0,s.settings.responsive&&t(window).bind("resize",Z),s.settings.auto&&s.settings.autoStart&&(f()>1||s.settings.autoSlideForOnePage)&&H(),s.settings.ticker&&W(),s.settings.pager&&I(s.settings.startSlide),s.settings.controls&&D(),s.settings.touchEnabled&&!s.settings.ticker&&N(),s.settings.keyboardEnabled&&!s.settings.ticker&&t(document).keydown(F)},p=function(){var e=0,n=t();if("vertical"===s.settings.mode||s.settings.adaptiveHeight)if(s.carousel){var o=1===s.settings.moveSlides?s.active.index:s.active.index*x();for(n=s.children.eq(o),i=1;i<=s.settings.maxSlides-1;i++)n=o+i>=s.children.length?n.add(s.children.eq(i-1)):n.add(s.children.eq(o+i))}else n=s.children.eq(s.active.index);else n=s.children;return"vertical"===s.settings.mode?(n.each(function(i){e+=t(this).outerHeight()}),s.settings.slideMargin>0&&(e+=s.settings.slideMargin*(s.settings.minSlides-1))):e=Math.max.apply(Math,n.map(function(){return t(this).outerHeight(!1)}).get()),"border-box"===s.viewport.css("box-sizing")?e+=parseFloat(s.viewport.css("padding-top"))+parseFloat(s.viewport.css("padding-bottom"))+parseFloat(s.viewport.css("border-top-width"))+parseFloat(s.viewport.css("border-bottom-width")):"padding-box"===s.viewport.css("box-sizing")&&(e+=parseFloat(s.viewport.css("padding-top"))+parseFloat(s.viewport.css("padding-bottom"))),e},u=function(){var t="100%";return s.settings.slideWidth>0&&(t="horizontal"===s.settings.mode?s.settings.maxSlides*s.settings.slideWidth+(s.settings.maxSlides-1)*s.settings.slideMargin:s.settings.slideWidth),t},h=function(){var t=s.settings.slideWidth,e=s.viewport.width();if(0===s.settings.slideWidth||s.settings.slideWidth>e&&!s.carousel||"vertical"===s.settings.mode)t=e;else if(s.settings.maxSlides>1&&"horizontal"===s.settings.mode){if(e>s.maxThreshold)return t;e<s.minThreshold?t=(e-s.settings.slideMargin*(s.settings.minSlides-1))/s.settings.minSlides:s.settings.shrinkItems&&(t=Math.floor((e+s.settings.slideMargin)/Math.ceil((e+s.settings.slideMargin)/(t+s.settings.slideMargin))-s.settings.slideMargin))}return t},v=function(){var t=1,e=null;return"horizontal"===s.settings.mode&&s.settings.slideWidth>0?s.viewport.width()<s.minThreshold?t=s.settings.minSlides:s.viewport.width()>s.maxThreshold?t=s.settings.maxSlides:(e=s.children.first().width()+s.settings.slideMargin,t=Math.floor((s.viewport.width()+s.settings.slideMargin)/e)):"vertical"===s.settings.mode&&(t=s.settings.minSlides),t},f=function(){var t=0,e=0,i=0;if(s.settings.moveSlides>0)if(s.settings.infiniteLoop)t=Math.ceil(s.children.length/x());else for(;e<s.children.length;)++t,e=i+v(),i+=s.settings.moveSlides<=v()?s.settings.moveSlides:v();else t=Math.ceil(s.children.length/v());return t},x=function(){return s.settings.moveSlides>0&&s.settings.moveSlides<=v()?s.settings.moveSlides:v()},m=function(){var t,e,i;s.children.length>s.settings.maxSlides&&s.active.last&&!s.settings.infiniteLoop?"horizontal"===s.settings.mode?(e=s.children.last(),t=e.position(),S(-(t.left-(s.viewport.width()-e.outerWidth())),"reset",0)):"vertical"===s.settings.mode&&(i=s.children.length-s.settings.minSlides,t=s.children.eq(i).position(),S(-t.top,"reset",0)):(t=s.children.eq(s.active.index*x()).position(),s.active.index===f()-1&&(s.active.last=!0),void 0!==t&&("horizontal"===s.settings.mode?S(-t.left,"reset",0):"vertical"===s.settings.mode&&S(-t.top,"reset",0)))},S=function(e,i,n,r){var a,l;s.usingCSS?(l="vertical"===s.settings.mode?"translate3d(0, "+e+"px, 0)":"translate3d("+e+"px, 0, 0)",o.css("-"+s.cssPrefix+"-transition-duration",n/1e3+"s"),"slide"===i?(o.css(s.animProp,l),0!==n?o.bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",function(e){t(e.target).is(o)&&(o.unbind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd"),q())}):q()):"reset"===i?o.css(s.animProp,l):"ticker"===i&&(o.css("-"+s.cssPrefix+"-transition-timing-function","linear"),o.css(s.animProp,l),0!==n?o.bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",function(e){t(e.target).is(o)&&(o.unbind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd"),S(r.resetValue,"reset",0),L())}):(S(r.resetValue,"reset",0),L()))):(a={},a[s.animProp]=e,"slide"===i?o.animate(a,n,s.settings.easing,function(){q()}):"reset"===i?o.css(s.animProp,e):"ticker"===i&&o.animate(a,n,"linear",function(){S(r.resetValue,"reset",0),L()}))},b=function(){for(var e="",i="",n=f(),o=0;o<n;o++)i="",s.settings.buildPager&&t.isFunction(s.settings.buildPager)||s.settings.pagerCustom?(i=s.settings.buildPager(o),s.pagerEl.addClass("bx-custom-pager")):(i=o+1,s.pagerEl.addClass("bx-default-pager")),e+='<div class="bx-pager-item"><a href="" data-slide-index="'+o+'" class="bx-pager-link">'+i+"</a></div>";s.pagerEl.html(e)},w=function(){s.settings.pagerCustom?s.pagerEl=t(s.settings.pagerCustom):(s.pagerEl=t('<div class="bx-pager" />'),s.settings.pagerSelector?t(s.settings.pagerSelector).html(s.pagerEl):s.controls.el.addClass("bx-has-pager").append(s.pagerEl),b()),s.pagerEl.on("click touchend","a",z)},C=function(){s.controls.next=t('<a class="bx-next" href="">'+s.settings.nextText+"</a>"),s.controls.prev=t('<a class="bx-prev" href="">'+s.settings.prevText+"</a>"),s.controls.next.bind("click touchend",E),s.controls.prev.bind("click touchend",k),s.settings.nextSelector&&t(s.settings.nextSelector).append(s.controls.next),s.settings.prevSelector&&t(s.settings.prevSelector).append(s.controls.prev),s.settings.nextSelector||s.settings.prevSelector||(s.controls.directionEl=t('<div class="bx-controls-direction" />'),s.controls.directionEl.append(s.controls.prev).append(s.controls.next),s.controls.el.addClass("bx-has-controls-direction").append(s.controls.directionEl))},T=function(){s.controls.start=t('<div class="bx-controls-auto-item"><a class="bx-start" href="">'+s.settings.startText+"</a></div>"),s.controls.stop=t('<div class="bx-controls-auto-item"><a class="bx-stop" href="">'+s.settings.stopText+"</a></div>"),s.controls.autoEl=t('<div class="bx-controls-auto" />'),s.controls.autoEl.on("click",".bx-start",M),s.controls.autoEl.on("click",".bx-stop",y),s.settings.autoControlsCombine?s.controls.autoEl.append(s.controls.start):s.controls.autoEl.append(s.controls.start).append(s.controls.stop),s.settings.autoControlsSelector?t(s.settings.autoControlsSelector).html(s.controls.autoEl):s.controls.el.addClass("bx-has-controls-auto").append(s.controls.autoEl),A(s.settings.autoStart?"stop":"start")},P=function(){s.children.each(function(e){var i=t(this).find("img:first").attr("title");void 0!==i&&(""+i).length&&t(this).append('<div class="bx-caption"><span>'+i+"</span></div>")})},E=function(t){t.preventDefault(),s.controls.el.hasClass("disabled")||(s.settings.auto&&s.settings.stopAutoOnClick&&o.stopAuto(),o.goToNextSlide())},k=function(t){t.preventDefault(),s.controls.el.hasClass("disabled")||(s.settings.auto&&s.settings.stopAutoOnClick&&o.stopAuto(),o.goToPrevSlide())},M=function(t){o.startAuto(),t.preventDefault()},y=function(t){o.stopAuto(),t.preventDefault()},z=function(e){var i,n;e.preventDefault(),s.controls.el.hasClass("disabled")||(s.settings.auto&&s.settings.stopAutoOnClick&&o.stopAuto(),i=t(e.currentTarget),void 0!==i.attr("data-slide-index")&&(n=parseInt(i.attr("data-slide-index")),n!==s.active.index&&o.goToSlide(n)))},I=function(e){var i=s.children.length;return"short"===s.settings.pagerType?(s.settings.maxSlides>1&&(i=Math.ceil(s.children.length/s.settings.maxSlides)),void s.pagerEl.html(e+1+s.settings.pagerShortSeparator+i)):(s.pagerEl.find("a").removeClass("active"),void s.pagerEl.each(function(i,n){t(n).find("a").eq(e).addClass("active")}))},q=function(){if(s.settings.infiniteLoop){var t="";0===s.active.index?t=s.children.eq(0).position():s.active.index===f()-1&&s.carousel?t=s.children.eq((f()-1)*x()).position():s.active.index===s.children.length-1&&(t=s.children.eq(s.children.length-1).position()),t&&("horizontal"===s.settings.mode?S(-t.left,"reset",0):"vertical"===s.settings.mode&&S(-t.top,"reset",0))}s.working=!1,s.settings.onSlideAfter.call(o,s.children.eq(s.active.index),s.oldIndex,s.active.index)},A=function(t){s.settings.autoControlsCombine?s.controls.autoEl.html(s.controls[t]):(s.controls.autoEl.find("a").removeClass("active"),s.controls.autoEl.find("a:not(.bx-"+t+")").addClass("active"))},D=function(){1===f()?(s.controls.prev.addClass("disabled"),s.controls.next.addClass("disabled")):!s.settings.infiniteLoop&&s.settings.hideControlOnEnd&&(0===s.active.index?(s.controls.prev.addClass("disabled"),s.controls.next.removeClass("disabled")):s.active.index===f()-1?(s.controls.next.addClass("disabled"),s.controls.prev.removeClass("disabled")):(s.controls.prev.removeClass("disabled"),s.controls.next.removeClass("disabled")))},H=function(){if(s.settings.autoDelay>0){setTimeout(o.startAuto,s.settings.autoDelay)}else o.startAuto(),t(window).focus(function(){o.startAuto()}).blur(function(){o.stopAuto()});s.settings.autoHover&&o.hover(function(){s.interval&&(o.stopAuto(!0),s.autoPaused=!0)},function(){s.autoPaused&&(o.startAuto(!0),s.autoPaused=null)})},W=function(){var e,i,n,r,a,l,d,c,g=0;"next"===s.settings.autoDirection?o.append(s.children.clone().addClass("bx-clone")):(o.prepend(s.children.clone().addClass("bx-clone")),e=s.children.first().position(),g="horizontal"===s.settings.mode?-e.left:-e.top),S(g,"reset",0),s.settings.pager=!1,s.settings.controls=!1,s.settings.autoControls=!1,s.settings.tickerHover&&(s.usingCSS?(r="horizontal"===s.settings.mode?4:5,s.viewport.hover(function(){i=o.css("-"+s.cssPrefix+"-transform"),n=parseFloat(i.split(",")[r]),S(n,"reset",0)},function(){c=0,s.children.each(function(e){c+="horizontal"===s.settings.mode?t(this).outerWidth(!0):t(this).outerHeight(!0)}),a=s.settings.speed/c,l="horizontal"===s.settings.mode?"left":"top",d=a*(c-Math.abs(parseInt(n))),L(d)})):s.viewport.hover(function(){o.stop()},function(){c=0,s.children.each(function(e){c+="horizontal"===s.settings.mode?t(this).outerWidth(!0):t(this).outerHeight(!0)}),a=s.settings.speed/c,l="horizontal"===s.settings.mode?"left":"top",d=a*(c-Math.abs(parseInt(o.css(l)))),L(d)})),L()},L=function(t){var e,i,n,r=t?t:s.settings.speed,a={left:0,top:0},l={left:0,top:0};"next"===s.settings.autoDirection?a=o.find(".bx-clone").first().position():l=s.children.first().position(),e="horizontal"===s.settings.mode?-a.left:-a.top,i="horizontal"===s.settings.mode?-l.left:-l.top,n={resetValue:i},S(e,"ticker",r,n)},O=function(e){var i=t(window),n={top:i.scrollTop(),left:i.scrollLeft()},s=e.offset();return n.right=n.left+i.width(),n.bottom=n.top+i.height(),s.right=s.left+e.outerWidth(),s.bottom=s.top+e.outerHeight(),!(n.right<s.left||n.left>s.right||n.bottom<s.top||n.top>s.bottom)},F=function(t){var e=document.activeElement.tagName.toLowerCase(),i="input|textarea",n=new RegExp(e,["i"]),s=n.exec(i);if(null==s&&O(o)){if(39===t.keyCode)return E(t),!1;if(37===t.keyCode)return k(t),!1}},N=function(){s.touch={start:{x:0,y:0},end:{x:0,y:0}},s.viewport.bind("touchstart MSPointerDown pointerdown",X),s.viewport.on("click",".bxslider a",function(t){s.viewport.hasClass("click-disabled")&&(t.preventDefault(),s.viewport.removeClass("click-disabled"))})},X=function(t){if(s.controls.el.addClass("disabled"),s.working)t.preventDefault(),s.controls.el.removeClass("disabled");else{s.touch.originalPos=o.position();var e=t.originalEvent,i="undefined"!=typeof e.changedTouches?e.changedTouches:[e];s.touch.start.x=i[0].pageX,s.touch.start.y=i[0].pageY,s.viewport.get(0).setPointerCapture&&(s.pointerId=e.pointerId,s.viewport.get(0).setPointerCapture(s.pointerId)),s.viewport.bind("touchmove MSPointerMove pointermove",V),s.viewport.bind("touchend MSPointerUp pointerup",R),s.viewport.bind("MSPointerCancel pointercancel",Y)}},Y=function(t){S(s.touch.originalPos.left,"reset",0),s.controls.el.removeClass("disabled"),s.viewport.unbind("MSPointerCancel pointercancel",Y),s.viewport.unbind("touchmove MSPointerMove pointermove",V),s.viewport.unbind("touchend MSPointerUp pointerup",R),s.viewport.get(0).releasePointerCapture&&s.viewport.get(0).releasePointerCapture(s.pointerId)},V=function(t){var e=t.originalEvent,i="undefined"!=typeof e.changedTouches?e.changedTouches:[e],n=Math.abs(i[0].pageX-s.touch.start.x),o=Math.abs(i[0].pageY-s.touch.start.y),r=0,a=0;3*n>o&&s.settings.preventDefaultSwipeX?t.preventDefault():3*o>n&&s.settings.preventDefaultSwipeY&&t.preventDefault(),"fade"!==s.settings.mode&&s.settings.oneToOneTouch&&("horizontal"===s.settings.mode?(a=i[0].pageX-s.touch.start.x,r=s.touch.originalPos.left+a):(a=i[0].pageY-s.touch.start.y,r=s.touch.originalPos.top+a),S(r,"reset",0))},R=function(t){s.viewport.unbind("touchmove MSPointerMove pointermove",V),s.controls.el.removeClass("disabled");var e=t.originalEvent,i="undefined"!=typeof e.changedTouches?e.changedTouches:[e],n=0,r=0;s.touch.end.x=i[0].pageX,s.touch.end.y=i[0].pageY,"fade"===s.settings.mode?(r=Math.abs(s.touch.start.x-s.touch.end.x),r>=s.settings.swipeThreshold&&(s.touch.start.x>s.touch.end.x?o.goToNextSlide():o.goToPrevSlide(),o.stopAuto())):("horizontal"===s.settings.mode?(r=s.touch.end.x-s.touch.start.x,n=s.touch.originalPos.left):(r=s.touch.end.y-s.touch.start.y,n=s.touch.originalPos.top),!s.settings.infiniteLoop&&(0===s.active.index&&r>0||s.active.last&&r<0)?S(n,"reset",200):Math.abs(r)>=s.settings.swipeThreshold?(r<0?o.goToNextSlide():o.goToPrevSlide(),o.stopAuto()):S(n,"reset",200)),s.viewport.unbind("touchend MSPointerUp pointerup",R),s.viewport.get(0).releasePointerCapture&&s.viewport.get(0).releasePointerCapture(s.pointerId)},Z=function(e){if(s.initialized)if(s.working)window.setTimeout(Z,10);else{var i=t(window).width(),n=t(window).height();r===i&&a===n||(r=i,a=n,o.redrawSlider(),s.settings.onSliderResize.call(o,s.active.index))}},B=function(t){var e=v();s.settings.ariaHidden&&!s.settings.ticker&&(s.children.attr("aria-hidden","true"),s.children.slice(t,t+e).attr("aria-hidden","false"))},U=function(t){return t<0?s.settings.infiniteLoop?f()-1:s.active.index:t>=f()?s.settings.infiniteLoop?0:s.active.index:t};return o.goToSlide=function(e,i){var n,r,a,l,d=!0,c=0,g={left:0,top:0},u=null;if(s.oldIndex=s.active.index,s.active.index=U(e),!s.working&&s.active.index!==s.oldIndex){if(s.working=!0,d=s.settings.onSlideBefore.call(o,s.children.eq(s.active.index),s.oldIndex,s.active.index),"undefined"!=typeof d&&!d)return s.active.index=s.oldIndex,void(s.working=!1);"next"===i?s.settings.onSlideNext.call(o,s.children.eq(s.active.index),s.oldIndex,s.active.index)||(d=!1):"prev"===i&&(s.settings.onSlidePrev.call(o,s.children.eq(s.active.index),s.oldIndex,s.active.index)||(d=!1)),s.active.last=s.active.index>=f()-1,(s.settings.pager||s.settings.pagerCustom)&&I(s.active.index),s.settings.controls&&D(),"fade"===s.settings.mode?(s.settings.adaptiveHeight&&s.viewport.height()!==p()&&s.viewport.animate({height:p()},s.settings.adaptiveHeightSpeed),s.children.filter(":visible").fadeOut(s.settings.speed).css({zIndex:0}),s.children.eq(s.active.index).css("zIndex",s.settings.slideZIndex+1).fadeIn(s.settings.speed,function(){t(this).css("zIndex",s.settings.slideZIndex),q()})):(s.settings.adaptiveHeight&&s.viewport.height()!==p()&&s.viewport.animate({height:p()},s.settings.adaptiveHeightSpeed),!s.settings.infiniteLoop&&s.carousel&&s.active.last?"horizontal"===s.settings.mode?(u=s.children.eq(s.children.length-1),g=u.position(),c=s.viewport.width()-u.outerWidth()):(n=s.children.length-s.settings.minSlides,g=s.children.eq(n).position()):s.carousel&&s.active.last&&"prev"===i?(r=1===s.settings.moveSlides?s.settings.maxSlides-x():(f()-1)*x()-(s.children.length-s.settings.maxSlides),u=o.children(".bx-clone").eq(r),g=u.position()):"next"===i&&0===s.active.index?(g=o.find("> .bx-clone").eq(s.settings.maxSlides).position(),s.active.last=!1):e>=0&&(l=e*parseInt(x()),g=s.children.eq(l).position()),"undefined"!=typeof g?(a="horizontal"===s.settings.mode?-(g.left-c):-g.top,S(a,"slide",s.settings.speed)):s.working=!1),s.settings.ariaHidden&&B(s.active.index*x())}},o.goToNextSlide=function(){if(s.settings.infiniteLoop||!s.active.last){var t=parseInt(s.active.index)+1;o.goToSlide(t,"next")}},o.goToPrevSlide=function(){if(s.settings.infiniteLoop||0!==s.active.index){var t=parseInt(s.active.index)-1;o.goToSlide(t,"prev")}},o.startAuto=function(t){s.interval||(s.interval=setInterval(function(){"next"===s.settings.autoDirection?o.goToNextSlide():o.goToPrevSlide()},s.settings.pause),s.settings.autoControls&&t!==!0&&A("stop"))},o.stopAuto=function(t){s.interval&&(clearInterval(s.interval),s.interval=null,s.settings.autoControls&&t!==!0&&A("start"))},o.getCurrentSlide=function(){return s.active.index},o.getCurrentSlideElement=function(){return s.children.eq(s.active.index)},o.getSlideElement=function(t){return s.children.eq(t)},o.getSlideCount=function(){return s.children.length},o.isWorking=function(){return s.working},o.redrawSlider=function(){s.children.add(o.find(".bx-clone")).outerWidth(h()),s.viewport.css("height",p()),s.settings.ticker||m(),s.active.last&&(s.active.index=f()-1),s.active.index>=f()&&(s.active.last=!0),s.settings.pager&&!s.settings.pagerCustom&&(b(),I(s.active.index)),s.settings.ariaHidden&&B(s.active.index*x())},o.destroySlider=function(){s.initialized&&(s.initialized=!1,t(".bx-clone",this).remove(),s.children.each(function(){void 0!==t(this).data("origStyle")?t(this).attr("style",t(this).data("origStyle")):t(this).removeAttr("style")}),void 0!==t(this).data("origStyle")?this.attr("style",t(this).data("origStyle")):t(this).removeAttr("style"),t(this).unwrap().unwrap(),s.controls.el&&s.controls.el.remove(),s.controls.next&&s.controls.next.remove(),s.controls.prev&&s.controls.prev.remove(),s.pagerEl&&s.settings.controls&&!s.settings.pagerCustom&&s.pagerEl.remove(),t(".bx-caption",this).remove(),s.controls.autoEl&&s.controls.autoEl.remove(),clearInterval(s.interval),s.settings.responsive&&t(window).unbind("resize",Z),s.settings.keyboardEnabled&&t(document).unbind("keydown",F),t(this).removeData("bxSlider"))},o.reloadSlider=function(e){void 0!==e&&(n=e),o.destroySlider(),l(),t(o).data("bxSlider",this)},l(),t(o).data("bxSlider",this),this}}}(jQuery);
/*
 * jQuery FlexSlider v2.6.3
 * Copyright 2012 WooThemes
 * Contributing Author: Tyler Smith
 */!function($){var e=!0;$.flexslider=function(t,a){var n=$(t);n.vars=$.extend({},$.flexslider.defaults,a);var i=n.vars.namespace,s=window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture,r=("ontouchstart"in window||s||window.DocumentTouch&&document instanceof DocumentTouch)&&n.vars.touch,o="click touchend MSPointerUp keyup",l="",c,d="vertical"===n.vars.direction,u=n.vars.reverse,v=n.vars.itemWidth>0,p="fade"===n.vars.animation,m=""!==n.vars.asNavFor,f={};$.data(t,"flexslider",n),f={init:function(){n.animating=!1,n.currentSlide=parseInt(n.vars.startAt?n.vars.startAt:0,10),isNaN(n.currentSlide)&&(n.currentSlide=0),n.animatingTo=n.currentSlide,n.atEnd=0===n.currentSlide||n.currentSlide===n.last,n.containerSelector=n.vars.selector.substr(0,n.vars.selector.search(" ")),n.slides=$(n.vars.selector,n),n.container=$(n.containerSelector,n),n.count=n.slides.length,n.syncExists=$(n.vars.sync).length>0,"slide"===n.vars.animation&&(n.vars.animation="swing"),n.prop=d?"top":"marginLeft",n.args={},n.manualPause=!1,n.stopped=!1,n.started=!1,n.startTimeout=null,n.transitions=!n.vars.video&&!p&&n.vars.useCSS&&function(){var e=document.createElement("div"),t=["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"];for(var a in t)if(void 0!==e.style[t[a]])return n.pfx=t[a].replace("Perspective","").toLowerCase(),n.prop="-"+n.pfx+"-transform",!0;return!1}(),n.ensureAnimationEnd="",""!==n.vars.controlsContainer&&(n.controlsContainer=$(n.vars.controlsContainer).length>0&&$(n.vars.controlsContainer)),""!==n.vars.manualControls&&(n.manualControls=$(n.vars.manualControls).length>0&&$(n.vars.manualControls)),""!==n.vars.customDirectionNav&&(n.customDirectionNav=2===$(n.vars.customDirectionNav).length&&$(n.vars.customDirectionNav)),n.vars.randomize&&(n.slides.sort(function(){return Math.round(Math.random())-.5}),n.container.empty().append(n.slides)),n.doMath(),n.setup("init"),n.vars.controlNav&&f.controlNav.setup(),n.vars.directionNav&&f.directionNav.setup(),n.vars.keyboard&&(1===$(n.containerSelector).length||n.vars.multipleKeyboard)&&$(document).bind("keyup",function(e){var t=e.keyCode;if(!n.animating&&(39===t||37===t)){var a=39===t?n.getTarget("next"):37===t?n.getTarget("prev"):!1;n.flexAnimate(a,n.vars.pauseOnAction)}}),n.vars.mousewheel&&n.bind("mousewheel",function(e,t,a,i){e.preventDefault();var s=0>t?n.getTarget("next"):n.getTarget("prev");n.flexAnimate(s,n.vars.pauseOnAction)}),n.vars.pausePlay&&f.pausePlay.setup(),n.vars.slideshow&&n.vars.pauseInvisible&&f.pauseInvisible.init(),n.vars.slideshow&&(n.vars.pauseOnHover&&n.hover(function(){n.manualPlay||n.manualPause||n.pause()},function(){n.manualPause||n.manualPlay||n.stopped||n.play()}),n.vars.pauseInvisible&&f.pauseInvisible.isHidden()||(n.vars.initDelay>0?n.startTimeout=setTimeout(n.play,n.vars.initDelay):n.play())),m&&f.asNav.setup(),r&&n.vars.touch&&f.touch(),(!p||p&&n.vars.smoothHeight)&&$(window).bind("resize orientationchange focus",f.resize),n.find("img").attr("draggable","false"),setTimeout(function(){n.vars.start(n)},200)},asNav:{setup:function(){n.asNav=!0,n.animatingTo=Math.floor(n.currentSlide/n.move),n.currentItem=n.currentSlide,n.slides.removeClass(i+"active-slide").eq(n.currentItem).addClass(i+"active-slide"),s?(t._slider=n,n.slides.each(function(){var e=this;e._gesture=new MSGesture,e._gesture.target=e,e.addEventListener("MSPointerDown",function(e){e.preventDefault(),e.currentTarget._gesture&&e.currentTarget._gesture.addPointer(e.pointerId)},!1),e.addEventListener("MSGestureTap",function(e){e.preventDefault();var t=$(this),a=t.index();$(n.vars.asNavFor).data("flexslider").animating||t.hasClass("active")||(n.direction=n.currentItem<a?"next":"prev",n.flexAnimate(a,n.vars.pauseOnAction,!1,!0,!0))})})):n.slides.on(o,function(e){e.preventDefault();var t=$(this),a=t.index(),s=t.offset().left-$(n).scrollLeft();0>=s&&t.hasClass(i+"active-slide")?n.flexAnimate(n.getTarget("prev"),!0):$(n.vars.asNavFor).data("flexslider").animating||t.hasClass(i+"active-slide")||(n.direction=n.currentItem<a?"next":"prev",n.flexAnimate(a,n.vars.pauseOnAction,!1,!0,!0))})}},controlNav:{setup:function(){n.manualControls?f.controlNav.setupManual():f.controlNav.setupPaging()},setupPaging:function(){var e="thumbnails"===n.vars.controlNav?"control-thumbs":"control-paging",t=1,a,s;if(n.controlNavScaffold=$('<ol class="'+i+"control-nav "+i+e+'"></ol>'),n.pagingCount>1)for(var r=0;r<n.pagingCount;r++){s=n.slides.eq(r),void 0===s.attr("data-thumb-alt")&&s.attr("data-thumb-alt","");var c=""!==s.attr("data-thumb-alt")?c=' alt="'+s.attr("data-thumb-alt")+'"':"";if(a="thumbnails"===n.vars.controlNav?'<img src="'+s.attr("data-thumb")+'"'+c+"/>":'<a href="#">'+t+"</a>","thumbnails"===n.vars.controlNav&&!0===n.vars.thumbCaptions){var d=s.attr("data-thumbcaption");""!==d&&void 0!==d&&(a+='<span class="'+i+'caption">'+d+"</span>")}n.controlNavScaffold.append("<li>"+a+"</li>"),t++}n.controlsContainer?$(n.controlsContainer).append(n.controlNavScaffold):n.append(n.controlNavScaffold),f.controlNav.set(),f.controlNav.active(),n.controlNavScaffold.delegate("a, img",o,function(e){if(e.preventDefault(),""===l||l===e.type){var t=$(this),a=n.controlNav.index(t);t.hasClass(i+"active")||(n.direction=a>n.currentSlide?"next":"prev",n.flexAnimate(a,n.vars.pauseOnAction))}""===l&&(l=e.type),f.setToClearWatchedEvent()})},setupManual:function(){n.controlNav=n.manualControls,f.controlNav.active(),n.controlNav.bind(o,function(e){if(e.preventDefault(),""===l||l===e.type){var t=$(this),a=n.controlNav.index(t);t.hasClass(i+"active")||(a>n.currentSlide?n.direction="next":n.direction="prev",n.flexAnimate(a,n.vars.pauseOnAction))}""===l&&(l=e.type),f.setToClearWatchedEvent()})},set:function(){var e="thumbnails"===n.vars.controlNav?"img":"a";n.controlNav=$("."+i+"control-nav li "+e,n.controlsContainer?n.controlsContainer:n)},active:function(){n.controlNav.removeClass(i+"active").eq(n.animatingTo).addClass(i+"active")},update:function(e,t){n.pagingCount>1&&"add"===e?n.controlNavScaffold.append($('<li><a href="#">'+n.count+"</a></li>")):1===n.pagingCount?n.controlNavScaffold.find("li").remove():n.controlNav.eq(t).closest("li").remove(),f.controlNav.set(),n.pagingCount>1&&n.pagingCount!==n.controlNav.length?n.update(t,e):f.controlNav.active()}},directionNav:{setup:function(){var e=$('<ul class="'+i+'direction-nav"><li class="'+i+'nav-prev"><a class="'+i+'prev" href="#">'+n.vars.prevText+'</a></li><li class="'+i+'nav-next"><a class="'+i+'next" href="#">'+n.vars.nextText+"</a></li></ul>");n.customDirectionNav?n.directionNav=n.customDirectionNav:n.controlsContainer?($(n.controlsContainer).append(e),n.directionNav=$("."+i+"direction-nav li a",n.controlsContainer)):(n.append(e),n.directionNav=$("."+i+"direction-nav li a",n)),f.directionNav.update(),n.directionNav.bind(o,function(e){e.preventDefault();var t;""!==l&&l!==e.type||(t=$(this).hasClass(i+"next")?n.getTarget("next"):n.getTarget("prev"),n.flexAnimate(t,n.vars.pauseOnAction)),""===l&&(l=e.type),f.setToClearWatchedEvent()})},update:function(){var e=i+"disabled";1===n.pagingCount?n.directionNav.addClass(e).attr("tabindex","-1"):n.vars.animationLoop?n.directionNav.removeClass(e).removeAttr("tabindex"):0===n.animatingTo?n.directionNav.removeClass(e).filter("."+i+"prev").addClass(e).attr("tabindex","-1"):n.animatingTo===n.last?n.directionNav.removeClass(e).filter("."+i+"next").addClass(e).attr("tabindex","-1"):n.directionNav.removeClass(e).removeAttr("tabindex")}},pausePlay:{setup:function(){var e=$('<div class="'+i+'pauseplay"><a href="#"></a></div>');n.controlsContainer?(n.controlsContainer.append(e),n.pausePlay=$("."+i+"pauseplay a",n.controlsContainer)):(n.append(e),n.pausePlay=$("."+i+"pauseplay a",n)),f.pausePlay.update(n.vars.slideshow?i+"pause":i+"play"),n.pausePlay.bind(o,function(e){e.preventDefault(),""!==l&&l!==e.type||($(this).hasClass(i+"pause")?(n.manualPause=!0,n.manualPlay=!1,n.pause()):(n.manualPause=!1,n.manualPlay=!0,n.play())),""===l&&(l=e.type),f.setToClearWatchedEvent()})},update:function(e){"play"===e?n.pausePlay.removeClass(i+"pause").addClass(i+"play").html(n.vars.playText):n.pausePlay.removeClass(i+"play").addClass(i+"pause").html(n.vars.pauseText)}},touch:function(){function e(e){e.stopPropagation(),n.animating?e.preventDefault():(n.pause(),t._gesture.addPointer(e.pointerId),T=0,c=d?n.h:n.w,f=Number(new Date),l=v&&u&&n.animatingTo===n.last?0:v&&u?n.limit-(n.itemW+n.vars.itemMargin)*n.move*n.animatingTo:v&&n.currentSlide===n.last?n.limit:v?(n.itemW+n.vars.itemMargin)*n.move*n.currentSlide:u?(n.last-n.currentSlide+n.cloneOffset)*c:(n.currentSlide+n.cloneOffset)*c)}function a(e){e.stopPropagation();var a=e.target._slider;if(a){var n=-e.translationX,i=-e.translationY;return T+=d?i:n,m=T,y=d?Math.abs(T)<Math.abs(-n):Math.abs(T)<Math.abs(-i),e.detail===e.MSGESTURE_FLAG_INERTIA?void setImmediate(function(){t._gesture.stop()}):void((!y||Number(new Date)-f>500)&&(e.preventDefault(),!p&&a.transitions&&(a.vars.animationLoop||(m=T/(0===a.currentSlide&&0>T||a.currentSlide===a.last&&T>0?Math.abs(T)/c+2:1)),a.setProps(l+m,"setTouch"))))}}function i(e){e.stopPropagation();var t=e.target._slider;if(t){if(t.animatingTo===t.currentSlide&&!y&&null!==m){var a=u?-m:m,n=a>0?t.getTarget("next"):t.getTarget("prev");t.canAdvance(n)&&(Number(new Date)-f<550&&Math.abs(a)>50||Math.abs(a)>c/2)?t.flexAnimate(n,t.vars.pauseOnAction):p||t.flexAnimate(t.currentSlide,t.vars.pauseOnAction,!0)}r=null,o=null,m=null,l=null,T=0}}var r,o,l,c,m,f,g,h,S,y=!1,x=0,b=0,T=0;s?(t.style.msTouchAction="none",t._gesture=new MSGesture,t._gesture.target=t,t.addEventListener("MSPointerDown",e,!1),t._slider=n,t.addEventListener("MSGestureChange",a,!1),t.addEventListener("MSGestureEnd",i,!1)):(g=function(e){n.animating?e.preventDefault():(window.navigator.msPointerEnabled||1===e.touches.length)&&(n.pause(),c=d?n.h:n.w,f=Number(new Date),x=e.touches[0].pageX,b=e.touches[0].pageY,l=v&&u&&n.animatingTo===n.last?0:v&&u?n.limit-(n.itemW+n.vars.itemMargin)*n.move*n.animatingTo:v&&n.currentSlide===n.last?n.limit:v?(n.itemW+n.vars.itemMargin)*n.move*n.currentSlide:u?(n.last-n.currentSlide+n.cloneOffset)*c:(n.currentSlide+n.cloneOffset)*c,r=d?b:x,o=d?x:b,t.addEventListener("touchmove",h,!1),t.addEventListener("touchend",S,!1))},h=function(e){x=e.touches[0].pageX,b=e.touches[0].pageY,m=d?r-b:r-x,y=d?Math.abs(m)<Math.abs(x-o):Math.abs(m)<Math.abs(b-o);var t=500;(!y||Number(new Date)-f>t)&&(e.preventDefault(),!p&&n.transitions&&(n.vars.animationLoop||(m/=0===n.currentSlide&&0>m||n.currentSlide===n.last&&m>0?Math.abs(m)/c+2:1),n.setProps(l+m,"setTouch")))},S=function(e){if(t.removeEventListener("touchmove",h,!1),n.animatingTo===n.currentSlide&&!y&&null!==m){var a=u?-m:m,i=a>0?n.getTarget("next"):n.getTarget("prev");n.canAdvance(i)&&(Number(new Date)-f<550&&Math.abs(a)>50||Math.abs(a)>c/2)?n.flexAnimate(i,n.vars.pauseOnAction):p||n.flexAnimate(n.currentSlide,n.vars.pauseOnAction,!0)}t.removeEventListener("touchend",S,!1),r=null,o=null,m=null,l=null},t.addEventListener("touchstart",g,!1))},resize:function(){!n.animating&&n.is(":visible")&&(v||n.doMath(),p?f.smoothHeight():v?(n.slides.width(n.computedW),n.update(n.pagingCount),n.setProps()):d?(n.viewport.height(n.h),n.setProps(n.h,"setTotal")):(n.vars.smoothHeight&&f.smoothHeight(),n.newSlides.width(n.computedW),n.setProps(n.computedW,"setTotal")))},smoothHeight:function(e){if(!d||p){var t=p?n:n.viewport;e?t.animate({height:n.slides.eq(n.animatingTo).innerHeight()},e):t.innerHeight(n.slides.eq(n.animatingTo).innerHeight())}},sync:function(e){var t=$(n.vars.sync).data("flexslider"),a=n.animatingTo;switch(e){case"animate":t.flexAnimate(a,n.vars.pauseOnAction,!1,!0);break;case"play":t.playing||t.asNav||t.play();break;case"pause":t.pause()}},uniqueID:function(e){return e.filter("[id]").add(e.find("[id]")).each(function(){var e=$(this);e.attr("id",e.attr("id")+"_clone")}),e},pauseInvisible:{visProp:null,init:function(){var e=f.pauseInvisible.getHiddenProp();if(e){var t=e.replace(/[H|h]idden/,"")+"visibilitychange";document.addEventListener(t,function(){f.pauseInvisible.isHidden()?n.startTimeout?clearTimeout(n.startTimeout):n.pause():n.started?n.play():n.vars.initDelay>0?setTimeout(n.play,n.vars.initDelay):n.play()})}},isHidden:function(){var e=f.pauseInvisible.getHiddenProp();return e?document[e]:!1},getHiddenProp:function(){var e=["webkit","moz","ms","o"];if("hidden"in document)return"hidden";for(var t=0;t<e.length;t++)if(e[t]+"Hidden"in document)return e[t]+"Hidden";return null}},setToClearWatchedEvent:function(){clearTimeout(c),c=setTimeout(function(){l=""},3e3)}},n.flexAnimate=function(e,t,a,s,o){if(n.vars.animationLoop||e===n.currentSlide||(n.direction=e>n.currentSlide?"next":"prev"),m&&1===n.pagingCount&&(n.direction=n.currentItem<e?"next":"prev"),!n.animating&&(n.canAdvance(e,o)||a)&&n.is(":visible")){if(m&&s){var l=$(n.vars.asNavFor).data("flexslider");if(n.atEnd=0===e||e===n.count-1,l.flexAnimate(e,!0,!1,!0,o),n.direction=n.currentItem<e?"next":"prev",l.direction=n.direction,Math.ceil((e+1)/n.visible)-1===n.currentSlide||0===e)return n.currentItem=e,n.slides.removeClass(i+"active-slide").eq(e).addClass(i+"active-slide"),!1;n.currentItem=e,n.slides.removeClass(i+"active-slide").eq(e).addClass(i+"active-slide"),e=Math.floor(e/n.visible)}if(n.animating=!0,n.animatingTo=e,t&&n.pause(),n.vars.before(n),n.syncExists&&!o&&f.sync("animate"),n.vars.controlNav&&f.controlNav.active(),v||n.slides.removeClass(i+"active-slide").eq(e).addClass(i+"active-slide"),n.atEnd=0===e||e===n.last,n.vars.directionNav&&f.directionNav.update(),e===n.last&&(n.vars.end(n),n.vars.animationLoop||n.pause()),p)r?(n.slides.eq(n.currentSlide).css({opacity:0,zIndex:1}),n.slides.eq(e).css({opacity:1,zIndex:2}),n.wrapup(c)):(n.slides.eq(n.currentSlide).css({zIndex:1}).animate({opacity:0},n.vars.animationSpeed,n.vars.easing),n.slides.eq(e).css({zIndex:2}).animate({opacity:1},n.vars.animationSpeed,n.vars.easing,n.wrapup));else{var c=d?n.slides.filter(":first").height():n.computedW,g,h,S;v?(g=n.vars.itemMargin,S=(n.itemW+g)*n.move*n.animatingTo,h=S>n.limit&&1!==n.visible?n.limit:S):h=0===n.currentSlide&&e===n.count-1&&n.vars.animationLoop&&"next"!==n.direction?u?(n.count+n.cloneOffset)*c:0:n.currentSlide===n.last&&0===e&&n.vars.animationLoop&&"prev"!==n.direction?u?0:(n.count+1)*c:u?(n.count-1-e+n.cloneOffset)*c:(e+n.cloneOffset)*c,n.setProps(h,"",n.vars.animationSpeed),n.transitions?(n.vars.animationLoop&&n.atEnd||(n.animating=!1,n.currentSlide=n.animatingTo),n.container.unbind("webkitTransitionEnd transitionend"),n.container.bind("webkitTransitionEnd transitionend",function(){clearTimeout(n.ensureAnimationEnd),n.wrapup(c)}),clearTimeout(n.ensureAnimationEnd),n.ensureAnimationEnd=setTimeout(function(){n.wrapup(c)},n.vars.animationSpeed+100)):n.container.animate(n.args,n.vars.animationSpeed,n.vars.easing,function(){n.wrapup(c)})}n.vars.smoothHeight&&f.smoothHeight(n.vars.animationSpeed)}},n.wrapup=function(e){p||v||(0===n.currentSlide&&n.animatingTo===n.last&&n.vars.animationLoop?n.setProps(e,"jumpEnd"):n.currentSlide===n.last&&0===n.animatingTo&&n.vars.animationLoop&&n.setProps(e,"jumpStart")),n.animating=!1,n.currentSlide=n.animatingTo,n.vars.after(n)},n.animateSlides=function(){!n.animating&&e&&n.flexAnimate(n.getTarget("next"))},n.pause=function(){clearInterval(n.animatedSlides),n.animatedSlides=null,n.playing=!1,n.vars.pausePlay&&f.pausePlay.update("play"),n.syncExists&&f.sync("pause")},n.play=function(){n.playing&&clearInterval(n.animatedSlides),n.animatedSlides=n.animatedSlides||setInterval(n.animateSlides,n.vars.slideshowSpeed),n.started=n.playing=!0,n.vars.pausePlay&&f.pausePlay.update("pause"),n.syncExists&&f.sync("play")},n.stop=function(){n.pause(),n.stopped=!0},n.canAdvance=function(e,t){var a=m?n.pagingCount-1:n.last;return t?!0:m&&n.currentItem===n.count-1&&0===e&&"prev"===n.direction?!0:m&&0===n.currentItem&&e===n.pagingCount-1&&"next"!==n.direction?!1:e!==n.currentSlide||m?n.vars.animationLoop?!0:n.atEnd&&0===n.currentSlide&&e===a&&"next"!==n.direction?!1:!n.atEnd||n.currentSlide!==a||0!==e||"next"!==n.direction:!1},n.getTarget=function(e){return n.direction=e,"next"===e?n.currentSlide===n.last?0:n.currentSlide+1:0===n.currentSlide?n.last:n.currentSlide-1},n.setProps=function(e,t,a){var i=function(){var a=e?e:(n.itemW+n.vars.itemMargin)*n.move*n.animatingTo,i=function(){if(v)return"setTouch"===t?e:u&&n.animatingTo===n.last?0:u?n.limit-(n.itemW+n.vars.itemMargin)*n.move*n.animatingTo:n.animatingTo===n.last?n.limit:a;switch(t){case"setTotal":return u?(n.count-1-n.currentSlide+n.cloneOffset)*e:(n.currentSlide+n.cloneOffset)*e;case"setTouch":return u?e:e;case"jumpEnd":return u?e:n.count*e;case"jumpStart":return u?n.count*e:e;default:return e}}();return-1*i+"px"}();n.transitions&&(i=d?"translate3d(0,"+i+",0)":"translate3d("+i+",0,0)",a=void 0!==a?a/1e3+"s":"0s",n.container.css("-"+n.pfx+"-transition-duration",a),n.container.css("transition-duration",a)),n.args[n.prop]=i,(n.transitions||void 0===a)&&n.container.css(n.args),n.container.css("transform",i)},n.setup=function(e){if(p)n.slides.css({width:"100%","float":"left",marginRight:"-100%",position:"relative"}),"init"===e&&(r?n.slides.css({opacity:0,display:"block",webkitTransition:"opacity "+n.vars.animationSpeed/1e3+"s ease",zIndex:1}).eq(n.currentSlide).css({opacity:1,zIndex:2}):0==n.vars.fadeFirstSlide?n.slides.css({opacity:0,display:"block",zIndex:1}).eq(n.currentSlide).css({zIndex:2}).css({opacity:1}):n.slides.css({opacity:0,display:"block",zIndex:1}).eq(n.currentSlide).css({zIndex:2}).animate({opacity:1},n.vars.animationSpeed,n.vars.easing)),n.vars.smoothHeight&&f.smoothHeight();else{var t,a;"init"===e&&(n.viewport=$('<div class="'+i+'viewport"></div>').css({overflow:"hidden",position:"relative"}).appendTo(n).append(n.container),n.cloneCount=0,n.cloneOffset=0,u&&(a=$.makeArray(n.slides).reverse(),n.slides=$(a),n.container.empty().append(n.slides))),n.vars.animationLoop&&!v&&(n.cloneCount=2,n.cloneOffset=1,"init"!==e&&n.container.find(".clone").remove(),n.container.append(f.uniqueID(n.slides.first().clone().addClass("clone")).attr("aria-hidden","true")).prepend(f.uniqueID(n.slides.last().clone().addClass("clone")).attr("aria-hidden","true"))),n.newSlides=$(n.vars.selector,n),t=u?n.count-1-n.currentSlide+n.cloneOffset:n.currentSlide+n.cloneOffset,d&&!v?(n.container.height(200*(n.count+n.cloneCount)+"%").css("position","absolute").width("100%"),setTimeout(function(){n.newSlides.css({display:"block"}),n.doMath(),n.viewport.height(n.h),n.setProps(t*n.h,"init")},"init"===e?100:0)):(n.container.width(200*(n.count+n.cloneCount)+"%"),n.setProps(t*n.computedW,"init"),setTimeout(function(){n.doMath(),n.newSlides.css({width:n.computedW,marginRight:n.computedM,"float":"left",display:"block"}),n.vars.smoothHeight&&f.smoothHeight()},"init"===e?100:0))}v||n.slides.removeClass(i+"active-slide").eq(n.currentSlide).addClass(i+"active-slide"),n.vars.init(n)},n.doMath=function(){var e=n.slides.first(),t=n.vars.itemMargin,a=n.vars.minItems,i=n.vars.maxItems;n.w=void 0===n.viewport?n.width():n.viewport.width(),n.h=e.height(),n.boxPadding=e.outerWidth()-e.width(),v?(n.itemT=n.vars.itemWidth+t,n.itemM=t,n.minW=a?a*n.itemT:n.w,n.maxW=i?i*n.itemT-t:n.w,n.itemW=n.minW>n.w?(n.w-t*(a-1))/a:n.maxW<n.w?(n.w-t*(i-1))/i:n.vars.itemWidth>n.w?n.w:n.vars.itemWidth,n.visible=Math.floor(n.w/n.itemW),n.move=n.vars.move>0&&n.vars.move<n.visible?n.vars.move:n.visible,n.pagingCount=Math.ceil((n.count-n.visible)/n.move+1),n.last=n.pagingCount-1,n.limit=1===n.pagingCount?0:n.vars.itemWidth>n.w?n.itemW*(n.count-1)+t*(n.count-1):(n.itemW+t)*n.count-n.w-t):(n.itemW=n.w,n.itemM=t,n.pagingCount=n.count,n.last=n.count-1),n.computedW=n.itemW-n.boxPadding,n.computedM=n.itemM},n.update=function(e,t){n.doMath(),v||(e<n.currentSlide?n.currentSlide+=1:e<=n.currentSlide&&0!==e&&(n.currentSlide-=1),n.animatingTo=n.currentSlide),n.vars.controlNav&&!n.manualControls&&("add"===t&&!v||n.pagingCount>n.controlNav.length?f.controlNav.update("add"):("remove"===t&&!v||n.pagingCount<n.controlNav.length)&&(v&&n.currentSlide>n.last&&(n.currentSlide-=1,n.animatingTo-=1),f.controlNav.update("remove",n.last))),n.vars.directionNav&&f.directionNav.update()},n.addSlide=function(e,t){var a=$(e);n.count+=1,n.last=n.count-1,d&&u?void 0!==t?n.slides.eq(n.count-t).after(a):n.container.prepend(a):void 0!==t?n.slides.eq(t).before(a):n.container.append(a),n.update(t,"add"),n.slides=$(n.vars.selector+":not(.clone)",n),n.setup(),n.vars.added(n)},n.removeSlide=function(e){var t=isNaN(e)?n.slides.index($(e)):e;n.count-=1,n.last=n.count-1,isNaN(e)?$(e,n.slides).remove():d&&u?n.slides.eq(n.last).remove():n.slides.eq(e).remove(),n.doMath(),n.update(t,"remove"),n.slides=$(n.vars.selector+":not(.clone)",n),n.setup(),n.vars.removed(n)},f.init()},$(window).blur(function(t){e=!1}).focus(function(t){e=!0}),$.flexslider.defaults={namespace:"flex-",selector:".slides > li",animation:"fade",easing:"swing",direction:"horizontal",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7e3,animationSpeed:600,initDelay:0,randomize:!1,fadeFirstSlide:!0,thumbCaptions:!1,pauseOnAction:!0,pauseOnHover:!1,pauseInvisible:!0,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:"Previous",nextText:"Next",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:"Pause",playText:"Play",controlsContainer:"",manualControls:"",customDirectionNav:"",sync:"",asNavFor:"",itemWidth:0,itemMargin:0,minItems:1,maxItems:0,move:0,allowOneSlide:!0,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){},init:function(){}},$.fn.flexslider=function(e){if(void 0===e&&(e={}),"object"==typeof e)return this.each(function(){var t=$(this),a=e.selector?e.selector:".slides > li",n=t.find(a);1===n.length&&e.allowOneSlide===!1||0===n.length?(n.fadeIn(400),e.start&&e.start(t)):void 0===t.data("flexslider")&&new $.flexslider(this,e)});var t=$(this).data("flexslider");switch(e){case"play":t.play();break;case"pause":t.pause();break;case"stop":t.stop();break;case"next":t.flexAnimate(t.getTarget("next"),!0);break;case"prev":case"previous":t.flexAnimate(t.getTarget("prev"),!0);break;default:"number"==typeof e&&t.flexAnimate(e,!0)}}}(jQuery);
/*! Magnific Popup - v1.1.0 - 2016-02-20
* http://dimsemenov.com/plugins/magnific-popup/
* Copyright (c) 2016 Dmitry Semenov; */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isLowIE=b.isIE8=document.all&&!document.addEventListener,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e<h.length;e++)if(g=h[e],g.parsed&&(g=g.el[0]),g===c.el[0]){b.index=e;break}}else b.items=a.isArray(c.items)?c.items:[c.items],b.index=c.index||0;if(b.isOpen)return void b.updateItemHTML();b.types=[],f="",c.mainEl&&c.mainEl.length?b.ev=c.mainEl.eq(0):b.ev=d,c.key?(b.popupsCache[c.key]||(b.popupsCache[c.key]={}),b.currTemplate=b.popupsCache[c.key]):b.currTemplate={},b.st=a.extend(!0,{},a.magnificPopup.defaults,c),b.fixedContentPos="auto"===b.st.fixedContentPos?!b.probablyMobile:b.st.fixedContentPos,b.st.modal&&(b.st.closeOnContentClick=!1,b.st.closeOnBgClick=!1,b.st.showCloseBtn=!1,b.st.enableEscapeKey=!1),b.bgOverlay||(b.bgOverlay=x("bg").on("click"+p,function(){b.close()}),b.wrap=x("wrap").attr("tabindex",-1).on("click"+p,function(a){b._checkIfClose(a.target)&&b.close()}),b.container=x("container",b.wrap)),b.contentContainer=x("content"),b.st.preloader&&(b.preloader=x("preloader",b.container,b.st.tLoading));var i=a.magnificPopup.modules;for(e=0;e<i.length;e++){var j=i[e];j=j.charAt(0).toUpperCase()+j.slice(1),b["init"+j].call(b)}y("BeforeOpen"),b.st.showCloseBtn&&(b.st.closeBtnInside?(w(l,function(a,b,c,d){c.close_replaceWith=z(d.type)}),f+=" mfp-close-btn-in"):b.wrap.append(z())),b.st.alignTop&&(f+=" mfp-align-top"),b.fixedContentPos?b.wrap.css({overflow:b.st.overflowY,overflowX:"hidden",overflowY:b.st.overflowY}):b.wrap.css({top:v.scrollTop(),position:"absolute"}),(b.st.fixedBgPos===!1||"auto"===b.st.fixedBgPos&&!b.fixedContentPos)&&b.bgOverlay.css({height:d.height(),position:"absolute"}),b.st.enableEscapeKey&&d.on("keyup"+p,function(a){27===a.keyCode&&b.close()}),v.on("resize"+p,function(){b.updateSize()}),b.st.closeOnContentClick||(f+=" mfp-auto-cursor"),f&&b.wrap.addClass(f);var k=b.wH=v.height(),n={};if(b.fixedContentPos&&b._hasScrollBar(k)){var o=b._getScrollbarSize();o&&(n.marginRight=o)}b.fixedContentPos&&(b.isIE7?a("body, html").css("overflow","hidden"):n.overflow="hidden");var r=b.st.mainClass;return b.isIE7&&(r+=" mfp-ie7"),r&&b._addClassToMFP(r),b.updateItemHTML(),y("BuildControls"),a("html").css(n),b.bgOverlay.add(b.wrap).prependTo(b.st.prependTo||a(document.body)),b._lastFocusedEl=document.activeElement,setTimeout(function(){b.content?(b._addClassToMFP(q),b._setFocus()):b.bgOverlay.addClass(q),d.on("focusin"+p,b._onFocusIn)},16),b.isOpen=!0,b.updateSize(k),y(m),c},close:function(){b.isOpen&&(y(i),b.isOpen=!1,b.st.removalDelay&&!b.isLowIE&&b.supportsTransition?(b._addClassToMFP(r),setTimeout(function(){b._close()},b.st.removalDelay)):b._close())},_close:function(){y(h);var c=r+" "+q+" ";if(b.bgOverlay.detach(),b.wrap.detach(),b.container.empty(),b.st.mainClass&&(c+=b.st.mainClass+" "),b._removeClassFromMFP(c),b.fixedContentPos){var e={marginRight:""};b.isIE7?a("body, html").css("overflow",""):e.overflow="",a("html").css(e)}d.off("keyup"+p+" focusin"+p),b.ev.off(p),b.wrap.attr("class","mfp-wrap").removeAttr("style"),b.bgOverlay.attr("class","mfp-bg"),b.container.attr("class","mfp-container"),!b.st.showCloseBtn||b.st.closeBtnInside&&b.currTemplate[b.currItem.type]!==!0||b.currTemplate.closeBtn&&b.currTemplate.closeBtn.detach(),b.st.autoFocusLast&&b._lastFocusedEl&&a(b._lastFocusedEl).focus(),b.currItem=null,b.content=null,b.currTemplate=null,b.prevHeight=0,y(j)},updateSize:function(a){if(b.isIOS){var c=document.documentElement.clientWidth/window.innerWidth,d=window.innerHeight*c;b.wrap.css("height",d),b.wH=d}else b.wH=a||v.height();b.fixedContentPos||b.wrap.css("height",b.wH),y("Resize")},updateItemHTML:function(){var c=b.items[b.index];b.contentContainer.detach(),b.content&&b.content.detach(),c.parsed||(c=b.parseEl(b.index));var d=c.type;if(y("BeforeChange",[b.currItem?b.currItem.type:"",d]),b.currItem=c,!b.currTemplate[d]){var f=b.st[d]?b.st[d].markup:!1;y("FirstMarkupParse",f),f?b.currTemplate[d]=a(f):b.currTemplate[d]=!0}e&&e!==c.type&&b.container.removeClass("mfp-"+e+"-holder");var g=b["get"+d.charAt(0).toUpperCase()+d.slice(1)](c,b.currTemplate[d]);b.appendContent(g,d),c.preloaded=!0,y(n,c),e=c.type,b.container.prepend(b.contentContainer),y("AfterChange")},appendContent:function(a,c){b.content=a,a?b.st.showCloseBtn&&b.st.closeBtnInside&&b.currTemplate[c]===!0?b.content.find(".mfp-close").length||b.content.append(z()):b.content=a:b.content="",y(k),b.container.addClass("mfp-"+c+"-holder"),b.contentContainer.append(b.content)},parseEl:function(c){var d,e=b.items[c];if(e.tagName?e={el:a(e)}:(d=e.type,e={data:e,src:e.src}),e.el){for(var f=b.types,g=0;g<f.length;g++)if(e.el.hasClass("mfp-"+f[g])){d=f[g];break}e.src=e.el.attr("data-mfp-src"),e.src||(e.src=e.el.attr("href"))}return e.type=d||b.st.type||"inline",e.index=c,e.parsed=!0,b.items[c]=e,y("ElementParse",e),b.items[c]},addGroup:function(a,c){var d=function(d){d.mfpEl=this,b._openClick(d,a,c)};c||(c={});var e="click.magnificPopup";c.mainEl=a,c.items?(c.isObj=!0,a.off(e).on(e,d)):(c.isObj=!1,c.delegate?a.off(e).on(e,c.delegate,d):(c.items=a,a.off(e).on(e,d)))},_openClick:function(c,d,e){var f=void 0!==e.midClick?e.midClick:a.magnificPopup.defaults.midClick;if(f||!(2===c.which||c.ctrlKey||c.metaKey||c.altKey||c.shiftKey)){var g=void 0!==e.disableOn?e.disableOn:a.magnificPopup.defaults.disableOn;if(g)if(a.isFunction(g)){if(!g.call(b))return!0}else if(v.width()<g)return!0;c.type&&(c.preventDefault(),b.isOpen&&c.stopPropagation()),e.el=a(c.mfpEl),e.delegate&&(e.items=d.find(e.delegate)),b.open(e)}},updateStatus:function(a,d){if(b.preloader){c!==a&&b.container.removeClass("mfp-s-"+c),d||"loading"!==a||(d=b.st.tLoading);var e={status:a,text:d};y("UpdateStatus",e),a=e.status,d=e.text,b.preloader.html(d),b.preloader.find("a").on("click",function(a){a.stopImmediatePropagation()}),b.container.addClass("mfp-s-"+a),c=a}},_checkIfClose:function(c){if(!a(c).hasClass(s)){var d=b.st.closeOnContentClick,e=b.st.closeOnBgClick;if(d&&e)return!0;if(!b.content||a(c).hasClass("mfp-close")||b.preloader&&c===b.preloader[0])return!0;if(c===b.content[0]||a.contains(b.content[0],c)){if(d)return!0}else if(e&&a.contains(document,c))return!0;return!1}},_addClassToMFP:function(a){b.bgOverlay.addClass(a),b.wrap.addClass(a)},_removeClassFromMFP:function(a){this.bgOverlay.removeClass(a),b.wrap.removeClass(a)},_hasScrollBar:function(a){return(b.isIE7?d.height():document.body.scrollHeight)>(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(c,d){if(void 0===d||d===!1)return!0;if(e=c.split("_"),e.length>1){var f=b.find(p+"-"+e[0]);if(f.length>0){var g=e[1];"replaceWith"===g?f[0]!==d[0]&&f.replaceWith(d):"img"===g?f.is("img")?f.attr("src",d):f.replaceWith(a("<img>").attr("src",d).attr("class",f.attr("class"))):f.attr(e[1],d)}}else b.find(p+"-"+c).html(d)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'<button title="%title%" type="button" class="mfp-close">&#215;</button>',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("<div>");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I="ajax",J=function(){H&&a(document.body).removeClass(H)},K=function(){J(),b.req&&b.req.abort()};a.magnificPopup.registerModule(I,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'<a href="%url%">The content</a> could not be loaded.'},proto:{initAjax:function(){b.types.push(I),H=b.st.ajax.cursor,w(h+"."+I,K),w("BeforeChange."+I,K)},getAjax:function(c){H&&a(document.body).addClass(H),b.updateStatus("loading");var d=a.extend({url:c.src,success:function(d,e,f){var g={data:d,xhr:f};y("ParseAjax",g),b.appendContent(a(g.data),I),c.finished=!0,J(),b._setFocus(),setTimeout(function(){b.wrap.addClass(q)},16),b.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),c.finished=c.loadError=!0,b.updateStatus("error",b.st.ajax.tError.replace("%url%",c.src))}},b.st.ajax.settings);return b.req=a.ajax(d),""}}});var L,M=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'<div class="mfp-figure"><div class="mfp-close"></div><figure><div class="mfp-img"></div><figcaption><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></figcaption></figure></div>',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'<a href="%url%">The image</a> could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){L&&clearInterval(L),L=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(L),c++,void(3===c?e(10):40===c?e(50):100===c&&e(500)))},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:M(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(L&&clearInterval(L),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var N,O=function(){return void 0===N&&(N=void 0!==document.createElement("p").style.MozTransform),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return O()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var P="iframe",Q="//about:blank",R=function(a){if(b.currTemplate[P]){var c=b.currTemplate[P].find("iframe");c.length&&(a||(c[0].src=Q),b.isIE8&&c.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'<div class="mfp-iframe-scaler"><div class="mfp-close"></div><iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe></div>',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){b.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(h+"."+P,function(){R()})},getIframe:function(c,d){var e=c.src,f=b.st.iframe;a.each(f.patterns,function(){return e.indexOf(this.index)>-1?(this.id&&(e="string"==typeof this.id?e.substr(e.lastIndexOf(this.id)+this.id.length,e.length):this.id.call(this,e)),e=this.src.replace("%id%",e),!1):void 0});var g={};return f.srcAction&&(g[f.srcAction]=e),b._parseMarkup(d,g,c),b.updateStatus("ready"),d}}});var S=function(a){var c=b.items.length;return a>c-1?a-c:0>a?c+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=b.st.gallery,e=".mfp-gallery";return b.direction=!0,c&&c.enabled?(f+=" mfp-gallery",w(m+e,function(){c.navigateByImgClick&&b.wrap.on("click"+e,".mfp-img",function(){return b.items.length>1?(b.next(),!1):void 0}),d.on("keydown"+e,function(a){37===a.keyCode?b.prev():39===a.keyCode&&b.next()})}),w("UpdateStatus"+e,function(a,c){c.text&&(c.text=T(c.text,b.currItem.index,b.items.length))}),w(l+e,function(a,d,e,f){var g=b.items.length;e.counter=g>1?T(c.tCounter,f.index,g):""}),w("BuildControls"+e,function(){if(b.items.length>1&&c.arrows&&!b.arrowLeft){var d=c.arrowMarkup,e=b.arrowLeft=a(d.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(s),f=b.arrowRight=a(d.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(s);e.click(function(){b.prev()}),f.click(function(){b.next()}),b.container.append(e.add(f))}}),w(n+e,function(){b._preloadTimeout&&clearTimeout(b._preloadTimeout),b._preloadTimeout=setTimeout(function(){b.preloadNearbyImages(),b._preloadTimeout=null},16)}),void w(h+e,function(){d.off(e),b.wrap.off("click"+e),b.arrowRight=b.arrowLeft=null})):!1},next:function(){b.direction=!0,b.index=S(b.index+1),b.updateItemHTML()},prev:function(){b.direction=!1,b.index=S(b.index-1),b.updateItemHTML()},goTo:function(a){b.direction=a>=b.index,b.index=a,b.updateItemHTML()},preloadNearbyImages:function(){var a,c=b.st.gallery.preload,d=Math.min(c[0],b.items.length),e=Math.min(c[1],b.items.length);for(a=1;a<=(b.direction?e:d);a++)b._preloadItem(b.index+a);for(a=1;a<=(b.direction?d:e);a++)b._preloadItem(b.index-a)},_preloadItem:function(c){if(c=S(c),!b.items[c].preloaded){var d=b.items[c];d.parsed||(d=b.parseEl(c)),y("LazyLoad",d),"image"===d.type&&(d.img=a('<img class="mfp-img" />').on("load.mfploader",function(){d.hasSize=!0}).on("error.mfploader",function(){d.hasSize=!0,d.loadError=!0,y("LazyLoadError",d)}).attr("src",d.src)),d.preloaded=!0}}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+U,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+U,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()});
/*! menuFullpage - v1.0.0 - 2015-03-26
* https://github.com/rottenstudios/menufullpage
* Copyright (c) 2015 Carmelo Catalfamo - rottenStudios.it */
!function(a){"use strict";a.fn.menufullpage=function(b){var c=a.extend({menu:"#fullpage-nav",push:".push",side:"left",menuWidth:"100%",speed:"400",activeBtn:"menu-open"},b),d=this,e=a(c.menu),f=a(c.push),g=c.menuWidth,h={position:"fixed",top:"0",bottom:"0","settings.side":"-"+c.menuWidth,width:c.menuWidth,height:"100%"},i={"-webkit-transition":c.side+" "+c.speed+"ms ease","-moz-transition":c.side+" "+c.speed+"ms ease","-ms-transition":c.side+" "+c.speed+"ms ease","-o-transition":c.side+" "+c.speed+"ms ease",transition:c.side+" "+c.speed+"ms ease"};return e.css(h),f.css(c.side,"0"),e.css(i),f.css(i),e._state="closed",e.open=function(){e._state="open",e.css(c.side,"0"),f.css(c.side,g),d.addClass(c.activeBtn)},e.close=function(){e._state="closed",e.css(c.side,"-"+g),f.css(c.side,"0"),d.removeClass(c.activeBtn)},a(document).on("click.menufullpage",function(b){a(b.target).parents().andSelf().is(d)||"open"!==e._state||(e.close(),d.removeClass(c.activeBtn))}),d.on("click.menufullpage",function(a){a.preventDefault(),"closed"===e._state?e.open():e.close()}),d.on("touchend",function(a){d.trigger("click.menufullpage"),a.preventDefault()}),e}}(jQuery);!function(e,t){"function"==typeof define&&define.amd?define("smoothScroll",t(e)):"object"==typeof exports?module.exports=t(e):e.smoothScroll=t(e)}(window||this,function(e){"use strict";var t,n,o,r={},a=!!document.querySelector&&!!e.addEventListener,c={speed:500,easing:"easeInOutCubic",offset:0,updateURL:!0,callbackBefore:function(){},callbackAfter:function(){}},u=function(e,t,n){if("[object Object]"===Object.prototype.toString.call(e))for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.call(n,e[o],o,e);else for(var r=0,a=e.length;a>r;r++)t.call(n,e[r],r,e)},i=function(e,t){var n={};return u(e,function(t,o){n[o]=e[o]}),u(t,function(e,o){n[o]=t[o]}),n},l=function(e,t){for(var n=t.charAt(0);e&&e!==document;e=e.parentNode)if("."===n){if(e.classList.contains(t.substr(1)))return e}else if("#"===n){if(e.id===t.substr(1))return e}else if("["===n&&e.hasAttribute(t.substr(1,t.length-2)))return e;return!1},s=function(e){return Math.max(e.scrollHeight,e.offsetHeight,e.clientHeight)},f=function(e){for(var t,n=String(e),o=n.length,r=-1,a="",c=n.charCodeAt(0);++r<o;){if(t=n.charCodeAt(r),0===t)throw new InvalidCharacterError("Invalid character: the input contains U+0000.");a+=t>=1&&31>=t||127==t||0===r&&t>=48&&57>=t||1===r&&t>=48&&57>=t&&45===c?"\\"+t.toString(16)+" ":t>=128||45===t||95===t||t>=48&&57>=t||t>=65&&90>=t||t>=97&&122>=t?n.charAt(r):"\\"+n.charAt(r)}return a},d=function(e,t){var n;return"easeInQuad"===e&&(n=t*t),"easeOutQuad"===e&&(n=t*(2-t)),"easeInOutQuad"===e&&(n=.5>t?2*t*t:-1+(4-2*t)*t),"easeInCubic"===e&&(n=t*t*t),"easeOutCubic"===e&&(n=--t*t*t+1),"easeInOutCubic"===e&&(n=.5>t?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1),"easeInQuart"===e&&(n=t*t*t*t),"easeOutQuart"===e&&(n=1- --t*t*t*t),"easeInOutQuart"===e&&(n=.5>t?8*t*t*t*t:1-8*--t*t*t*t),"easeInQuint"===e&&(n=t*t*t*t*t),"easeOutQuint"===e&&(n=1+--t*t*t*t*t),"easeInOutQuint"===e&&(n=.5>t?16*t*t*t*t*t:1+16*--t*t*t*t*t),n||t},h=function(e,t,n){var o=0;if(e.offsetParent)do o+=e.offsetTop,e=e.offsetParent;while(e);return o=o-t-n,o>=0?o:0},m=function(){return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},p=function(e){return e&&"object"==typeof JSON&&"function"==typeof JSON.parse?JSON.parse(e):{}},v=function(t,n){history.pushState&&(n||"true"===n)&&history.pushState(null,null,[e.location.protocol,"//",e.location.host,e.location.pathname,e.location.search,t].join(""))};r.animateScroll=function(t,n,r){var a=i(a||c,r||{}),u=p(t?t.getAttribute("data-options"):null);a=i(a,u),n="#"+f(n.substr(1));var l="#"===n?document.documentElement:document.querySelector(n),g=e.pageYOffset;o||(o=document.querySelector("[data-scroll-header]"));var b,O,y,S=null===o?0:s(o)+o.offsetTop,I=h(l,S,parseInt(a.offset,10)),H=I-g,E=m(),A=0;v(n,a.updateURL);var L=function(o,r,c){var u=e.pageYOffset;(o==r||u==r||e.innerHeight+u>=E)&&(clearInterval(c),l.focus(),a.callbackAfter(t,n))},Q=function(){A+=16,O=A/parseInt(a.speed,10),O=O>1?1:O,y=g+H*d(a.easing,O),e.scrollTo(0,Math.floor(y)),L(y,I,b)},C=function(){a.callbackBefore(t,n),b=setInterval(Q,16)};0===e.pageYOffset&&e.scrollTo(0,0),C()};var g=function(e){var n=l(e.target,"[data-scroll]");n&&"a"===n.tagName.toLowerCase()&&(e.preventDefault(),r.animateScroll(n,n.hash,t))},b=function(){n||(n=setTimeout(function(){n=null,headerHeight=null===o?0:s(o)+o.offsetTop},66))};return r.destroy=function(){t&&(document.removeEventListener("click",g,!1),e.removeEventListener("resize",b,!1),t=null,n=null,o=null)},r.init=function(n){a&&(r.destroy(),t=i(c,n||{}),o=document.querySelector("[data-scroll-header]"),document.addEventListener("click",g,!1),o&&e.addEventListener("resize",b,!1))},r});

/*
 * Nivo Lightbox v1.3.1
 * http://dev7studios.com/nivo-lightbox
 *
 * Copyright 2013, Dev7studios
 * Free to use and abuse under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 */
!function(t,i,o,e){function n(i,o){this.el=i,this.$el=t(this.el),this.options=t.extend({},l,o),this._defaults=l,this._name=a,this.init()}var a="nivoLightbox",l={effect:"fade",theme:"default",keyboardNav:!0,clickImgToClose:!1,clickOverlayToClose:!0,onInit:function(){},beforeShowLightbox:function(){},afterShowLightbox:function(t){},beforeHideLightbox:function(){},afterHideLightbox:function(){},beforePrev:function(t){},onPrev:function(t){},beforeNext:function(t){},onNext:function(t){},errorMessage:"The requested content cannot be loaded. Please try again later."};n.prototype={init:function(){var i=this;t("html").hasClass("nivo-lightbox-notouch")||t("html").addClass("nivo-lightbox-notouch"),"ontouchstart"in o&&t("html").removeClass("nivo-lightbox-notouch"),this.$el.on("click",function(t){i.showLightbox(t)}),this.options.keyboardNav&&t("body").off("keyup").on("keyup",function(o){var e=o.keyCode?o.keyCode:o.which;27==e&&i.destructLightbox(),37==e&&t(".nivo-lightbox-prev").trigger("click"),39==e&&t(".nivo-lightbox-next").trigger("click")}),this.options.onInit.call(this)},showLightbox:function(i){var o=this,e=this.$el,n=this.checkContent(e);if(n){i.preventDefault(),this.options.beforeShowLightbox.call(this);var a=this.constructLightbox();if(a){var l=a.find(".nivo-lightbox-content");if(l){if(t("body").addClass("nivo-lightbox-body-effect-"+this.options.effect),this.processContent(l,e),this.$el.attr("data-lightbox-gallery")){var h=t('[data-lightbox-gallery="'+this.$el.attr("data-lightbox-gallery")+'"]');t(".nivo-lightbox-nav").show(),t(".nivo-lightbox-prev").off("click").on("click",function(i){i.preventDefault();var n=h.index(e);e=h.eq(n-1),t(e).length||(e=h.last()),t.when(o.options.beforePrev.call(this,[e])).done(function(){o.processContent(l,e),o.options.onPrev.call(this,[e])})}),t(".nivo-lightbox-next").off("click").on("click",function(i){i.preventDefault();var n=h.index(e);e=h.eq(n+1),t(e).length||(e=h.first()),t.when(o.options.beforeNext.call(this,[e])).done(function(){o.processContent(l,e),o.options.onNext.call(this,[e])})})}setTimeout(function(){a.addClass("nivo-lightbox-open"),o.options.afterShowLightbox.call(this,[a])},1)}}}},checkContent:function(t){var i=t.attr("href"),o=i.match(/(youtube|youtube-nocookie|youtu|vimeo)\.(com|be)\/(watch\?v=([\w-]+)|([\w-]+))/);return null!==i.match(/\.(jpeg|jpg|gif|png)$/i)||(!!o||("ajax"==t.attr("data-lightbox-type")||("#"==i.substring(0,1)&&"inline"==t.attr("data-lightbox-type")||"iframe"==t.attr("data-lightbox-type"))))},processContent:function(o,e){var n=this,a=e.attr("href"),l=a.match(/(youtube|youtube-nocookie|youtu|vimeo)\.(com|be)\/(watch\?v=([\w-]+)|([\w-]+))/);if(o.html("").addClass("nivo-lightbox-loading"),this.isHidpi()&&e.attr("data-lightbox-hidpi")&&(a=e.attr("data-lightbox-hidpi")),null!==a.match(/\.(jpeg|jpg|gif|png)$/i)){var h=t("<img>",{src:a,class:"nivo-lightbox-image-display"});h.one("load",function(){var e=t('<div class="nivo-lightbox-image" />');e.append(h),o.html(e).removeClass("nivo-lightbox-loading"),e.css({"line-height":t(".nivo-lightbox-content").height()+"px",height:t(".nivo-lightbox-content").height()+"px"}),t(i).resize(function(){e.css({"line-height":t(".nivo-lightbox-content").height()+"px",height:t(".nivo-lightbox-content").height()+"px"})})}).each(function(){this.complete&&t(this).load()}),h.error(function(){var i=t('<div class="nivo-lightbox-error"><p>'+n.options.errorMessage+"</p></div>");o.html(i).removeClass("nivo-lightbox-loading")})}else if(l){var s="",r="nivo-lightbox-video";if("youtube"==l[1]&&(s="//www.youtube.com/embed/"+l[4],r="nivo-lightbox-youtube"),"youtube-nocookie"==l[1]&&(s=a,r="nivo-lightbox-youtube"),"youtu"==l[1]&&(s="//www.youtube.com/embed/"+l[3],r="nivo-lightbox-youtube"),"vimeo"==l[1]&&(s="//player.vimeo.com/video/"+l[3],r="nivo-lightbox-vimeo"),s){var c=t("<iframe>",{src:s,class:r,frameborder:0,vspace:0,hspace:0,scrolling:"auto"});o.html(c),c.load(function(){o.removeClass("nivo-lightbox-loading")})}}else if("ajax"==e.attr("data-lightbox-type"))t.ajax({url:a,cache:!1,success:function(e){var n=t('<div class="nivo-lightbox-ajax" />');n.append(e),o.html(n).removeClass("nivo-lightbox-loading"),n.outerHeight()<o.height()&&n.css({position:"relative",top:"50%","margin-top":-(n.outerHeight()/2)+"px"}),t(i).resize(function(){n.outerHeight()<o.height()&&n.css({position:"relative",top:"50%","margin-top":-(n.outerHeight()/2)+"px"})})},error:function(){var i=t('<div class="nivo-lightbox-error"><p>'+n.options.errorMessage+"</p></div>");o.html(i).removeClass("nivo-lightbox-loading")}});else if("#"==a.substring(0,1)&&"inline"==e.attr("data-lightbox-type"))if(t(a).length){var g=t('<div class="nivo-lightbox-inline" />');g.append(t(a).clone().show()),o.html(g).removeClass("nivo-lightbox-loading"),g.outerHeight()<o.height()&&g.css({position:"relative",top:"50%","margin-top":-(g.outerHeight()/2)+"px"}),t(i).resize(function(){g.outerHeight()<o.height()&&g.css({position:"relative",top:"50%","margin-top":-(g.outerHeight()/2)+"px"})})}else{var v=t('<div class="nivo-lightbox-error"><p>'+n.options.errorMessage+"</p></div>");o.html(v).removeClass("nivo-lightbox-loading")}else{if("iframe"!=e.attr("data-lightbox-type"))return!1;var b=t("<iframe>",{src:a,class:"nivo-lightbox-item",frameborder:0,vspace:0,hspace:0,scrolling:"auto"});o.html(b),b.load(function(){o.removeClass("nivo-lightbox-loading")})}if(e.attr("title")){var x=t("<span>",{class:"nivo-lightbox-title"});x.text(e.attr("title")),t(".nivo-lightbox-title-wrap").html(x)}else t(".nivo-lightbox-title-wrap").html("")},constructLightbox:function(){if(t(".nivo-lightbox-overlay").length)return t(".nivo-lightbox-overlay");var i=t("<div>",{class:"nivo-lightbox-overlay nivo-lightbox-theme-"+this.options.theme+" nivo-lightbox-effect-"+this.options.effect}),o=t("<div>",{class:"nivo-lightbox-wrap"}),e=t("<div>",{class:"nivo-lightbox-content"}),n=t('<a href="#" class="nivo-lightbox-nav nivo-lightbox-prev">Previous</a><a href="#" class="nivo-lightbox-nav nivo-lightbox-next">Next</a>'),a=t('<a href="#" class="nivo-lightbox-close" title="Close">Close</a>'),l=t("<div>",{class:"nivo-lightbox-title-wrap"}),h=/*@cc_on!@*/0;h&&i.addClass("nivo-lightbox-ie"),o.append(e),o.append(l),i.append(o),i.append(n),i.append(a),t("body").append(i);var s=this;return s.options.clickOverlayToClose&&i.on("click",function(i){(i.target===this||t(i.target).hasClass("nivo-lightbox-content")||t(i.target).hasClass("nivo-lightbox-image"))&&s.destructLightbox()}),s.options.clickImgToClose&&i.on("click",function(i){(i.target===this||t(i.target).hasClass("nivo-lightbox-image-display"))&&s.destructLightbox()}),a.on("click",function(t){t.preventDefault(),s.destructLightbox()}),i},destructLightbox:function(){var i=this;this.options.beforeHideLightbox.call(this),t(".nivo-lightbox-overlay").removeClass("nivo-lightbox-open"),t(".nivo-lightbox-nav").hide(),t("body").removeClass("nivo-lightbox-body-effect-"+i.options.effect);var o=/*@cc_on!@*/0;o&&(t(".nivo-lightbox-overlay iframe").attr("src"," "),t(".nivo-lightbox-overlay iframe").remove()),t(".nivo-lightbox-prev").off("click"),t(".nivo-lightbox-next").off("click"),t(".nivo-lightbox-content").empty(),this.options.afterHideLightbox.call(this)},isHidpi:function(){var t="(-webkit-min-device-pixel-ratio: 1.5),                              (min--moz-device-pixel-ratio: 1.5),                              (-o-min-device-pixel-ratio: 3/2),                              (min-resolution: 1.5dppx)";return i.devicePixelRatio>1||!(!i.matchMedia||!i.matchMedia(t).matches)}},t.fn[a]=function(i){return this.each(function(){t.data(this,a)||t.data(this,a,new n(this,i))})}}(jQuery,window,document);
/**
 * Owl Carousel v2.3.0
 * Copyright 2013-2017 David Deutsch
 * Licensed under  ()
 */
!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},a.each(["onResize","onThrottledResize"],a.proxy(function(b,c){this._handlers[c]=a.proxy(this[c],this)},this)),a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a.charAt(0).toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Workers,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}e.Defaults={items:3,loop:!1,center:!1,rewind:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,fallbackEasing:"swing",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Type={Event:"event",State:"state"},e.Plugins={},e.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(a){var b=this.settings.margin||"",c=!this.settings.autoWidth,d=this.settings.rtl,e={width:"auto","margin-left":d?b:"","margin-right":d?"":b};!c&&this.$stage.children().css(e),a.css=e}},{filter:["width","items","settings"],run:function(a){var b=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,c=null,d=this._items.length,e=!this.settings.autoWidth,f=[];for(a.items={merge:!1,width:b};d--;)c=this._mergers[d],c=this.settings.mergeFit&&Math.min(c,this.settings.items)||c,a.items.merge=c>1||a.items.merge,f[d]=e?b*c:this._items[d].width();this._widths=f}},{filter:["items","settings"],run:function(){var b=[],c=this._items,d=this.settings,e=Math.max(2*d.items,4),f=2*Math.ceil(c.length/2),g=d.loop&&c.length?d.rewind?e:Math.max(e,f):0,h="",i="";for(g/=2;g>0;)b.push(this.normalize(b.length/2,!0)),h+=c[b[b.length-1]][0].outerHTML,b.push(this.normalize(c.length-1-(b.length-1)/2,!0)),i=c[b[b.length-1]][0].outerHTML+i,g-=1;this._clones=b,a(h).addClass("cloned").appendTo(this.$stage),a(i).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var a=this.settings.rtl?1:-1,b=this._clones.length+this._items.length,c=-1,d=0,e=0,f=[];++c<b;)d=f[c-1]||0,e=this._widths[this.relative(c)]+this.settings.margin,f.push(d+e*a);this._coordinates=f}},{filter:["width","items","settings"],run:function(){var a=this.settings.stagePadding,b=this._coordinates,c={width:Math.ceil(Math.abs(b[b.length-1]))+2*a,"padding-left":a||"","padding-right":a||""};this.$stage.css(c)}},{filter:["width","items","settings"],run:function(a){var b=this._coordinates.length,c=!this.settings.autoWidth,d=this.$stage.children();if(c&&a.items.merge)for(;b--;)a.css.width=this._widths[this.relative(b)],d.eq(b).css(a.css);else c&&(a.css.width=a.items.width,d.css(a.css))}},{filter:["items"],run:function(){this._coordinates.length<1&&this.$stage.removeAttr("style")}},{filter:["width","items","settings"],run:function(a){a.current=a.current?this.$stage.children().index(a.current):0,a.current=Math.max(this.minimum(),Math.min(this.maximum(),a.current)),this.reset(a.current)}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){var a,b,c,d,e=this.settings.rtl?1:-1,f=2*this.settings.stagePadding,g=this.coordinates(this.current())+f,h=g+this.width()*e,i=[];for(c=0,d=this._coordinates.length;d>c;c++)a=this._coordinates[c-1]||0,b=Math.abs(this._coordinates[c])+f*e,(this.op(a,"<=",g)&&this.op(a,">",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass("active"),this.$stage.children(".center").removeClass("center"),this.settings.center&&this.$stage.children().eq(this.current()).addClass("center")}}],e.prototype.initialize=function(){if(this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")){var b,c,e;b=this.$element.find("img"),c=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,e=this.$element.children(c).width(),b.length&&0>=e&&this.preloadAutoWidthImages(b)}this.$element.addClass(this.options.loadingClass),this.$stage=a("<"+this.settings.stageElement+' class="'+this.settings.stageClass+'"/>').wrap('<div class="'+this.settings.stageOuterClass+'"/>'),this.$element.append(this.$stage.parent()),this.replace(this.$element.children().not(this.$stage.parent())),this.$element.is(":visible")?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){b>=a&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),"function"==typeof e.stagePadding&&(e.stagePadding=e.stagePadding()),delete e.responsive,e.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+d))):e=a.extend({},this.options),this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},e.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};c>b;)(this._invalidated.all||a.grep(this._pipe[b].filter,d).length>0)&&this._pipe[b].run(e),b++;this._invalidated={},!this.is("valid")&&this.enter("valid")},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return this._items.length?this._width===this.$element.width()?!1:this.$element.is(":visible")?(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized"))):!1:!1},e.prototype.registerEventHandlers=function(){a.support.transition&&this.$stage.on(a.support.transition.end+".owl.core",a.proxy(this.onTransitionEnd,this)),this.settings.responsive!==!1&&this.on(b,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",a.proxy(this.onDragEnd,this)))},e.prototype.onDragStart=function(b){var d=null;3!==b.which&&(a.support.transform?(d=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","),d={x:d[16===d.length?12:4],y:d[16===d.length?13:5]}):(d=this.$stage.position(),d={x:this.settings.rtl?d.left+this.$stage.width()-this.width()+this.settings.margin:d.left,y:d.top}),this.is("animating")&&(a.support.transform?this.animate(d.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===b.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=a(b.target),this._drag.stage.start=d,this._drag.stage.current=d,this._drag.pointer=this.pointer(b),a(c).on("mouseup.owl.core touchend.owl.core",a.proxy(this.onDragEnd,this)),a(c).one("mousemove.owl.core touchmove.owl.core",a.proxy(function(b){var d=this.difference(this._drag.pointer,this.pointer(b));a(c).on("mousemove.owl.core touchmove.owl.core",a.proxy(this.onDragMove,this)),Math.abs(d.x)<Math.abs(d.y)&&this.is("valid")||(b.preventDefault(),this.enter("dragging"),this.trigger("drag"))},this)))},e.prototype.onDragMove=function(a){var b=null,c=null,d=null,e=this.difference(this._drag.pointer,this.pointer(a)),f=this.difference(this._drag.stage.start,e);this.is("dragging")&&(a.preventDefault(),this.settings.loop?(b=this.coordinates(this.minimum()),c=this.coordinates(this.maximum()+1)-b,f.x=((f.x-b)%c+c)%c+b):(b=this.settings.rtl?this.coordinates(this.maximum()):this.coordinates(this.minimum()),c=this.settings.rtl?this.coordinates(this.minimum()):this.coordinates(this.maximum()),d=this.settings.pullDrag?-1*e.x/5:0,f.x=Math.max(Math.min(f.x,b+d),c+d)),this._drag.stage.current=f,this.animate(f.x))},e.prototype.onDragEnd=function(b){var d=this.difference(this._drag.pointer,this.pointer(b)),e=this._drag.stage.current,f=d.x>0^this.settings.rtl?"left":"right";a(c).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==d.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==d.x?f:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=f,(Math.abs(d.x)>3||(new Date).getTime()-this._drag.time>300)&&this._drag.target.one("click.owl.core",function(){return!1})),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},e.prototype.closest=function(b,c){var d=-1,e=30,f=this.width(),g=this.coordinates();return this.settings.freeDrag||a.each(g,a.proxy(function(a,h){return"left"===c&&b>h-e&&h+e>b?d=a:"right"===c&&b>h-f-e&&h-f+e>b?d=a+1:this.op(b,"<",h)&&this.op(b,">",g[a+1]||h-f)&&(d="left"===c?a+1:a),-1===d},this)),this.settings.loop||(this.op(b,">",g[this.minimum()])?d=b=this.minimum():this.op(b,"<",g[this.maximum()])&&(d=b=this.maximum())),d},e.prototype.animate=function(b){var c=this.speed()>0;this.is("animating")&&this.onTransitionEnd(),c&&(this.enter("animating"),this.trigger("translate")),a.support.transform3d&&a.support.transition?this.$stage.css({transform:"translate3d("+b+"px,0px,0px)",transition:this.speed()/1e3+"s"}):c?this.$stage.animate({left:b+"px"},this.speed(),this.settings.fallbackEasing,a.proxy(this.onTransitionEnd,this)):this.$stage.css({left:b+"px"})},e.prototype.is=function(a){return this._states.current[a]&&this._states.current[a]>0},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(b){return"string"===a.type(b)&&(this._invalidated[b]=!0,this.is("valid")&&this.leave("valid")),a.map(this._invalidated,function(a,b){return b})},e.prototype.reset=function(a){a=this.normalize(a),a!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(a,b){var c=this._items.length,e=b?0:this._clones.length;return!this.isNumeric(a)||1>c?a=d:(0>a||a>=c+e)&&(a=((a-e/2)%c+c)%c+e/2),a},e.prototype.relative=function(a){return a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=this.settings,f=this._coordinates.length;if(e.loop)f=this._clones.length/2+this._items.length-1;else if(e.autoWidth||e.merge){if(b=this._items.length)for(c=this._items[--b].width(),d=this.$element.width();b--&&(c+=this._items[b].width()+this.settings.margin,!(c>d)););f=b+1}else f=e.center?this._items.length-1:this._items.length-e.items;return a&&(f-=this._clones.length/2),Math.max(f,0)},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2===0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c,e=1,f=b-1;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(this.settings.rtl&&(e=-1,f=b+1),c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[f]||0))/2*e):c=this._coordinates[f]||0,c=Math.ceil(c))},e.prototype.duration=function(a,b,c){return 0===c?0:Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(a,b){var c=this.current(),d=null,e=a-this.relative(c),f=(e>0)-(0>e),g=this._items.length,h=this.minimum(),i=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(e)>g/2&&(e+=-1*f*g),a=c+e,d=((a-h)%g+g)%g+h,d!==a&&i>=d-e&&d-e>0&&(c=d-e,a=d,this.reset(c))):this.settings.rewind?(i+=1,a=(a%i+i)%i):a=Math.max(h,Math.min(i,a)),this.speed(this.duration(c,a,b)),this.current(a),this.$element.is(":visible")&&this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.onTransitionEnd=function(a){return a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0))?!1:(this.leave("animating"),void this.trigger("translated"))},e.prototype.viewport=function(){var d;return this.options.responsiveBaseElement!==b?d=a(this.options.responsiveBaseElement).width():b.innerWidth?d=b.innerWidth:c.documentElement&&c.documentElement.clientWidth?d=c.documentElement.clientWidth:console.warn("Can not detect viewport width."),d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(b,c){var e=this.relative(this._current);c=c===d?this._items.length:this.normalize(c,!0),b=b instanceof jQuery?b:a(b),this.trigger("add",{content:b,position:c}),b=this.prepare(b),0===this._items.length||c===this._items.length?(0===this._items.length&&this.$stage.append(b),0!==this._items.length&&this._items[c-1].after(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[c].before(b),this._items.splice(c,0,b),this._mergers.splice(c,0,1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[e]&&this.reset(this._items[e].index()),this.invalidate("items"),this.trigger("added",{content:b,position:c})},e.prototype.remove=function(a){a=this.normalize(a,!0),a!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.preloadAutoWidthImages=function(b){b.each(a.proxy(function(b,c){this.enter("pre-loading"),c=a(c),a(new Image).one("load",a.proxy(function(a){c.attr("src",a.target.src),c.css("opacity",1),this.leave("pre-loading"),!this.is("pre-loading")&&!this.is("initializing")&&this.refresh()},this)).attr("src",c.attr("src")||c.attr("data-src")||c.attr("data-src-retina"))},this))},e.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),a(c).off(".owl.core"),this.settings.responsive!==!1&&(b.clearTimeout(this.resizeTimer),this.off(b,"resize",this._handlers.onThrottledResize));for(var d in this._plugins)this._plugins[d].destroy();this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$stage.remove(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:c>a;case">":return d?c>a:a>c;case">=":return d?c>=a:a>=c;case"<=":return d?a>=c:c>=a}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d,f,g){var h={item:{count:this._items.length,index:this.current()}},i=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),j=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},h,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(j)}),this.register({type:e.Type.Event,name:b}),this.$element.trigger(j),this.settings&&"function"==typeof this.settings[i]&&this.settings[i].call(this,j)),j},e.prototype.enter=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]===d&&(this._states.current[b]=0),this._states.current[b]++},this))},e.prototype.leave=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]--},this))},e.prototype.register=function(b){if(b.type===e.Type.Event){if(a.event.special[b.name]||(a.event.special[b.name]={}),!a.event.special[b.name].owl){var c=a.event.special[b.name]._default;a.event.special[b.name]._default=function(a){return!c||!c.apply||a.namespace&&-1!==a.namespace.indexOf("owl")?a.namespace&&a.namespace.indexOf("owl")>-1:c.apply(this,arguments)},a.event.special[b.name].owl=!0}}else b.type===e.Type.State&&(this._states.tags[b.name]?this._states.tags[b.name]=this._states.tags[b.name].concat(b.tags):this._states.tags[b.name]=b.tags,this._states.tags[b.name]=a.grep(this._states.tags[b.name],a.proxy(function(c,d){return a.inArray(c,this._states.tags[b.name])===d},this)))},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.pointer=function(a){var c={x:null,y:null};return a=a.originalEvent||a||b.event,a=a.touches&&a.touches.length?a.touches[0]:a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:a,a.pageX?(c.x=a.pageX,c.y=a.pageY):(c.x=a.clientX,c.y=a.clientY),c},e.prototype.isNumeric=function(a){return!isNaN(parseFloat(a))},e.prototype.difference=function(a,b){return{x:a.x-b.x,y:a.y-b.y}},a.fn.owlCarousel=function(b){var c=Array.prototype.slice.call(arguments,1);return this.each(function(){var d=a(this),f=d.data("owl.carousel");f||(f=new e(this,"object"==typeof b&&b),d.data("owl.carousel",f),a.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(b,c){f.register({type:e.Type.Event,name:c}),f.$element.on(c+".owl.carousel.core",a.proxy(function(a){a.namespace&&a.relatedTarget!==this&&(this.suppress([c]),f[c].apply(this,[].slice.call(arguments,1)),this.release([c]))},f))})),"string"==typeof b&&"_"!==b.charAt(0)&&f[b].apply(f,c)})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoRefresh:!0,autoRefreshInterval:500},e.prototype.watch=function(){this._interval||(this._visible=this._core.$element.is(":visible"),this._interval=b.setInterval(a.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},e.prototype.refresh=function(){this._core.$element.is(":visible")!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible&&this._core.invalidate("width")&&this._core.refresh())},e.prototype.destroy=function(){var a,c;b.clearInterval(this._interval);for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoRefresh=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type))for(var c=this._core.settings,e=c.center&&Math.ceil(c.items/2)||c.items,f=c.center&&-1*e||0,g=(b.property&&b.property.value!==d?b.property.value:this._core.current())+f,h=this._core.clones().length,i=a.proxy(function(a,b){this.load(b)},this);f++<e;)this.load(h/2+this._core.relative(g)),h&&a.each(this._core.clones(this._core.relative(g)),i),g++},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={lazyLoad:!1},e.prototype.load=function(c){var d=this._core.$stage.children().eq(c),e=d&&d.find(".owl-lazy");!e||a.inArray(d.get(0),this._loaded)>-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":'url("'+g+'")',opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&"position"==a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},e.prototype.update=function(){var b=this._core._current,c=b+this._core.settings.items,d=this._core.$stage.children().toArray().slice(b,c),e=[],f=0;a.each(d,function(b,c){e.push(a(c).height())}),f=Math.max.apply(null,e),this._core.$stage.parent().height(f).addClass(this._core.settings.autoHeightClass)},e.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.video&&this.isInFullScreen()&&a.preventDefault()},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"===a.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};e.Defaults={video:!1,videoHeight:!1,videoWidth:!1},e.prototype.fetch=function(a,b){var c=function(){return a.attr("data-vimeo-id")?"vimeo":a.attr("data-vzaar-id")?"vzaar":"youtube"}(),d=a.attr("data-vimeo-id")||a.attr("data-youtube-id")||a.attr("data-vzaar-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else if(d[3].indexOf("vimeo")>-1)c="vimeo";else{if(!(d[3].indexOf("vzaar")>-1))throw new Error("Video URL not supported.");c="vzaar"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},e.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?'style="width:'+c.width+"px;height:"+c.height+'px;"':"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(a){e='<div class="owl-video-play-icon"></div>',d=k.lazyLoad?'<div class="owl-video-tn '+j+'" '+i+'="'+a+'"></div>':'<div class="owl-video-tn" style="opacity:1;background-image:url('+a+')"></div>',b.after(d),b.after(e)};return b.wrap('<div class="owl-video-wrapper"'+g+"></div>"),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length?(l(h.attr(i)),h.remove(),!1):void("youtube"===c.type?(f="//img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type?a.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}):"vzaar"===c.type&&a.ajax({type:"GET",url:"//vzaar.com/api/videos/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a.framegrab_url,l(f)}}))},e.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},e.prototype.play=function(b){var c,d=a(b.target),e=d.closest("."+this._core.settings.itemClass),f=this._videos[e.attr("data-video")],g=f.width||"100%",h=f.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),e=this._core.items(this._core.relative(e.index())),this._core.reset(e.index()),"youtube"===f.type?c='<iframe width="'+g+'" height="'+h+'" src="//www.youtube.com/embed/'+f.id+"?autoplay=1&rel=0&v="+f.id+'" frameborder="0" allowfullscreen></iframe>':"vimeo"===f.type?c='<iframe src="//player.vimeo.com/video/'+f.id+'?autoplay=1" width="'+g+'" height="'+h+'" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>':"vzaar"===f.type&&(c='<iframe frameborder="0"height="'+h+'"width="'+g+'" allowfullscreen mozallowfullscreen webkitAllowFullScreen src="//view.vzaar.com/'+f.id+'/player?autoplay=true"></iframe>'),a('<div class="owl-video-frame">'+c+"</div>").insertAfter(e.find(".owl-video")),this._playing=e.addClass("owl-video-playing"))},e.prototype.isInFullScreen=function(){var b=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return b&&a(b).parent().hasClass("owl-video-frame")},e.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){a.namespace&&(this.swapping="translated"==a.type)},this),"translate.owl.carousel":a.proxy(function(a){a.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&a.support.animation&&a.support.transition){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.one(a.support.animation.end,c).css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g)),f&&e.one(a.support.animation.end,c).addClass("animated owl-animated-in").addClass(f))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null);
},a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._call=null,this._time=0,this._timeout=0,this._paused=!0,this._handlers={"changed.owl.carousel":a.proxy(function(a){a.namespace&&"settings"===a.property.name?this._core.settings.autoplay?this.play():this.stop():a.namespace&&"position"===a.property.name&&this._paused&&(this._time=0)},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":a.proxy(function(a,b,c){a.namespace&&this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(a){a.namespace&&this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=a.extend({},e.Defaults,this._core.options)};e.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},e.prototype._next=function(d){this._call=b.setTimeout(a.proxy(this._next,this,d),this._timeout*(Math.round(this.read()/this._timeout)+1)-this.read()),this._core.is("busy")||this._core.is("interacting")||c.hidden||this._core.next(d||this._core.settings.autoplaySpeed)},e.prototype.read=function(){return(new Date).getTime()-this._time},e.prototype.play=function(c,d){var e;this._core.is("rotating")||this._core.enter("rotating"),c=c||this._core.settings.autoplayTimeout,e=Math.min(this._time%(this._timeout||c),c),this._paused?(this._time=this.read(),this._paused=!1):b.clearTimeout(this._call),this._time+=this.read()%c-e,this._timeout=c,this._call=b.setTimeout(a.proxy(this._next,this,d),c-e)},e.prototype.stop=function(){this._core.is("rotating")&&(this._time=0,this._paused=!0,b.clearTimeout(this._call),this._core.leave("rotating"))},e.prototype.pause=function(){this._core.is("rotating")&&!this._paused&&(this._time=this.read(),this._paused=!0,b.clearTimeout(this._call))},e.prototype.destroy=function(){var a,b;this.stop();for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(b){this._core=b,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){b.namespace&&this._core.settings.dotsData&&this._templates.push('<div class="'+this._core.settings.dotClass+'">'+a(b.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"</div>")},this),"added.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,0,this._templates.pop())},this),"remove.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&this.draw()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)};e.Defaults={nav:!1,navText:['<span aria-label="prev">&#x2039;</span>','<span aria-label="next">&#x203a;</span>'],navSpeed:!1,navElement:'button role="presentation"',navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var b,c=this._core.settings;this._controls.$relative=(c.navContainer?a(c.navContainer):a("<div>").addClass(c.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=a("<"+c.navElement+">").addClass(c.navClass[0]).html(c.navText[0]).prependTo(this._controls.$relative).on("click",a.proxy(function(a){this.prev(c.navSpeed)},this)),this._controls.$next=a("<"+c.navElement+">").addClass(c.navClass[1]).html(c.navText[1]).appendTo(this._controls.$relative).on("click",a.proxy(function(a){this.next(c.navSpeed)},this)),c.dotsData||(this._templates=[a("<button>").addClass(c.dotClass).append(a("<span>")).prop("outerHTML")]),this._controls.$absolute=(c.dotsContainer?a(c.dotsContainer):a("<div>").addClass(c.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","button",a.proxy(function(b){var d=a(b.target).parent().is(this._controls.$absolute)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(d,c.dotsSpeed)},this));for(b in this._overrides)this._core[b]=a.proxy(this[b],this)},e.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)"$relative"===b&&settings.navContainer?this._controls[b].html(""):this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},e.prototype.update=function(){var a,b,c,d=this._core.clones().length/2,e=d+this._core.items().length,f=this._core.maximum(!0),g=this._core.settings,h=g.center||g.autoWidth||g.dotsData?1:g.dotsEach||g.items;if("page"!==g.slideBy&&(g.slideBy=Math.min(g.slideBy,g.items)),g.dots||"page"==g.slideBy)for(this._pages=[],a=d,b=0,c=0;e>a;a++){if(b>=h||0===b){if(this._pages.push({start:Math.min(f,a-d),end:a-d+h-1}),Math.min(f,a-d)===f)break;b=0,++c}b+=this._core.mergers(this._core.relative(a))}},e.prototype.draw=function(){var b,c=this._core.settings,d=this._core.items().length<=c.items,e=this._core.relative(this._core.current()),f=c.loop||c.rewind;this._controls.$relative.toggleClass("disabled",!c.nav||d),c.nav&&(this._controls.$previous.toggleClass("disabled",!f&&e<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!f&&e>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!c.dots||d),c.dots&&(b=this._pages.length-this._controls.$absolute.children().length,c.dotsData&&0!==b?this._controls.$absolute.html(this._templates.join("")):b>0?this._controls.$absolute.append(new Array(b+1).join(this._templates[0])):0>b&&this._controls.$absolute.children().slice(b).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(a.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotsData?1:c.dotsEach||c.items)}},e.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,a.proxy(function(a,c){return a.start<=b&&a.end>=b},this)).pop()},e.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},e.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},e.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},e.prototype.to=function(b,c,d){var e;!d&&this._pages.length?(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c)):a.proxy(this._overrides.to,this._core)(b,c)},a.fn.owlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(c){this._core=c,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(c){c.namespace&&"URLHash"===this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash");if(!c)return;this._hashes[c]=b.content}},this),"changed.owl.carousel":a.proxy(function(c){if(c.namespace&&"position"===c.property.name){var d=this._core.items(this._core.relative(this._core.current())),e=a.map(this._hashes,function(a,b){return a===d?b:null}).join();if(!e||b.location.hash.slice(1)===e)return;b.location.hash=e}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(a){var c=b.location.hash.substring(1),e=this._core.$stage.children(),f=this._hashes[c]&&e.index(this._hashes[c]);f!==d&&f!==this._core.current()&&this._core.to(this._core.relative(f),!1,!0)},this))};e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){function e(b,c){var e=!1,f=b.charAt(0).toUpperCase()+b.slice(1);return a.each((b+" "+h.join(f+" ")+f).split(" "),function(a,b){return g[b]!==d?(e=c?b:!0,!1):void 0}),e}function f(a){return e(a,!0)}var g=a("<support>").get(0).style,h="Webkit Moz O ms".split(" "),i={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}},j={csstransforms:function(){return!!e("transform")},csstransforms3d:function(){return!!e("perspective")},csstransitions:function(){return!!e("transition")},cssanimations:function(){return!!e("animation")}};j.csstransitions()&&(a.support.transition=new String(f("transition")),a.support.transition.end=i.transition.end[a.support.transition]),j.cssanimations()&&(a.support.animation=new String(f("animation")),a.support.animation.end=i.animation.end[a.support.animation]),j.csstransforms()&&(a.support.transform=new String(f("transform")),a.support.transform3d=j.csstransforms3d())}(window.Zepto||window.jQuery,window,document);
/*
     _ _      _       _
 ___| (_) ___| | __  (_)___
/ __| | |/ __| |/ /  | / __|
\__ \ | | (__|   < _ | \__ \
|___/_|_|\___|_|\_(_)/ |___/
                   |__/

 Version: 1.9.0
  Author: Ken Wheeler
 Website: http://kenwheeler.github.io
    Docs: http://kenwheeler.github.io/slick
    Repo: http://github.com/kenwheeler/slick
  Issues: http://github.com/kenwheeler/slick/issues

 */
(function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"undefined"!=typeof exports?module.exports=i(require("jquery")):i(jQuery)})(function(i){"use strict";var e=window.Slick||{};e=function(){function e(e,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(e),appendDots:i(e),arrows:!0,asNavFor:null,prevArrow:'<button class="slick-prev" aria-label="Previous" type="button">Previous</button>',nextArrow:'<button class="slick-next" aria-label="Next" type="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i('<button type="button" />').text(t+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden="hidden",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(e),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange="visibilitychange",n.windowWidth=0,n.windowTimer=null,s=i(e).data("slick")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,"undefined"!=typeof document.mozHidden?(n.hidden="mozHidden",n.visibilityChange="mozvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(n.hidden="webkitHidden",n.visibilityChange="webkitvisibilitychange"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=t++,n.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}var t=0;return e}(),e.prototype.activateADA=function(){var i=this;i.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var s=this;if("boolean"==typeof t)o=t,t=null;else if(t<0||t>=s.slideCount)return!1;s.unload(),"number"==typeof t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):o===!0?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr("data-slick-index",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var i=this;if(1===i.options.slidesToShow&&i.options.adaptiveHeight===!0&&i.options.vertical===!1){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var o={},s=this;s.animateHeight(),s.options.rtl===!0&&s.options.vertical===!1&&(e=-e),s.transformsEnabled===!1?s.options.vertical===!1?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):s.cssTransitions===!1?(s.options.rtl===!0&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),s.options.vertical===!1?(o[s.animType]="translate("+i+"px, 0px)",s.$slideTrack.css(o)):(o[s.animType]="translate(0px,"+i+"px)",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),s.options.vertical===!1?o[s.animType]="translate3d("+e+"px, 0px, 0px)":o[s.animType]="translate3d(0px,"+e+"px, 0px)",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var e=this,t=e.options.asNavFor;return t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var t=this,o=t.getNavTarget();null!==o&&"object"==typeof o&&o.each(function(){var t=i(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var e=this,t={};e.options.fade===!1?t[e.transitionType]=e.transformType+" "+e.options.speed+"ms "+e.options.cssEase:t[e.transitionType]="opacity "+e.options.speed+"ms "+e.options.cssEase,e.options.fade===!1?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(i.options.infinite===!1&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1===0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var e=this;e.options.arrows===!0&&(e.$prevArrow=i(e.options.prevArrow).addClass("slick-arrow"),e.$nextArrow=i(e.options.nextArrow).addClass("slick-arrow"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),e.options.infinite!==!0&&e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):e.$prevArrow.add(e.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},e.prototype.buildDots=function(){var e,t,o=this;if(o.options.dots===!0&&o.slideCount>o.options.slidesToShow){for(o.$slider.addClass("slick-dotted"),t=i("<ul />").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i("<li />").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find("li").first().addClass("slick-active")}},e.prototype.buildOut=function(){var e=this;e.$slides=e.$slider.children(e.options.slide+":not(.slick-cloned)").addClass("slick-slide"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr("data-slick-index",e).data("originalStyling",i(t).attr("style")||"")}),e.$slider.addClass("slick-slider"),e.$slideTrack=0===e.slideCount?i('<div class="slick-track"/>').appendTo(e.$slider):e.$slides.wrapAll('<div class="slick-track"/>').parent(),e.$list=e.$slideTrack.wrap('<div class="slick-list"/>').parent(),e.$slideTrack.css("opacity",0),e.options.centerMode!==!0&&e.options.swipeToSlide!==!0||(e.options.slidesToScroll=1),i("img[data-lazy]",e.$slider).not("[src]").addClass("slick-loading"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),e.options.draggable===!0&&e.$list.addClass("draggable")},e.prototype.buildRows=function(){var i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.options.rows>0){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;i<s;i++){var d=document.createElement("div");for(e=0;e<l.options.rows;e++){var a=document.createElement("div");for(t=0;t<l.options.slidesPerRow;t++){var c=i*r+(e*l.options.slidesPerRow+t);n.get(c)&&a.appendChild(n.get(c))}d.appendChild(a)}o.appendChild(d)}l.$slider.empty().append(o),l.$slider.children().children().children().css({width:100/l.options.slidesPerRow+"%",display:"inline-block"})}},e.prototype.checkResponsive=function(e,t){var o,s,n,r=this,l=!1,d=r.$slider.width(),a=window.innerWidth||i(window).width();if("window"===r.respondTo?n=a:"slider"===r.respondTo?n=d:"min"===r.respondTo&&(n=Math.min(a,d)),r.options.responsive&&r.options.responsive.length&&null!==r.options.responsive){s=null;for(o in r.breakpoints)r.breakpoints.hasOwnProperty(o)&&(r.originalSettings.mobileFirst===!1?n<r.breakpoints[o]&&(s=r.breakpoints[o]):n>r.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),e===!0&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),e===!0&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,e===!0&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||l===!1||r.$slider.trigger("breakpoint",[r,l])}},e.prototype.changeSlide=function(e,t){var o,s,n,r=this,l=i(e.currentTarget);switch(l.is("a")&&e.preventDefault(),l.is("li")||(l=l.closest("li")),n=r.slideCount%r.options.slidesToScroll!==0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case"previous":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case"next":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case"index":var d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger("focus");break;default:return}},e.prototype.checkNavigable=function(i){var e,t,o=this;if(e=o.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else for(var s in e){if(i<e[s]){i=t;break}t=e[s]}return i},e.prototype.cleanUpEvents=function(){var e=this;e.options.dots&&null!==e.$dots&&(i("li",e.$dots).off("click.slick",e.changeSlide).off("mouseenter.slick",i.proxy(e.interrupt,e,!0)).off("mouseleave.slick",i.proxy(e.interrupt,e,!1)),e.options.accessibility===!0&&e.$dots.off("keydown.slick",e.keyHandler)),e.$slider.off("focus.slick blur.slick"),e.options.arrows===!0&&e.slideCount>e.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off("click.slick",e.changeSlide),e.$nextArrow&&e.$nextArrow.off("click.slick",e.changeSlide),e.options.accessibility===!0&&(e.$prevArrow&&e.$prevArrow.off("keydown.slick",e.keyHandler),e.$nextArrow&&e.$nextArrow.off("keydown.slick",e.keyHandler))),e.$list.off("touchstart.slick mousedown.slick",e.swipeHandler),e.$list.off("touchmove.slick mousemove.slick",e.swipeHandler),e.$list.off("touchend.slick mouseup.slick",e.swipeHandler),e.$list.off("touchcancel.slick mouseleave.slick",e.swipeHandler),e.$list.off("click.slick",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),e.options.accessibility===!0&&e.$list.off("keydown.slick",e.keyHandler),e.options.focusOnSelect===!0&&i(e.$slideTrack).children().off("click.slick",e.selectHandler),i(window).off("orientationchange.slick.slick-"+e.instanceUid,e.orientationChange),i(window).off("resize.slick.slick-"+e.instanceUid,e.resize),i("[draggable!=true]",e.$slideTrack).off("dragstart",e.preventDefault),i(window).off("load.slick.slick-"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var e=this;e.$list.off("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.off("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var i,e=this;e.options.rows>0&&(i=e.$slides.children().children(),i.removeAttr("style"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){var e=this;e.shouldClick===!1&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(".slick-cloned",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){i(this).attr("style",i(this).data("originalStyling"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass("slick-slider"),t.$slider.removeClass("slick-initialized"),t.$slider.removeClass("slick-dotted"),t.unslicked=!0,e||t.$slider.trigger("destroy",[t])},e.prototype.disableTransition=function(i){var e=this,t={};t[e.transitionType]="",e.options.fade===!1?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var t=this;t.cssTransitions===!1?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var e=this;e.cssTransitions===!1?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var e=this;e.$slider.off("focus.slick blur.slick").on("focus.slick","*",function(t){var o=i(this);setTimeout(function(){e.options.pauseOnFocus&&o.is(":focus")&&(e.focussed=!0,e.autoPlay())},0)}).on("blur.slick","*",function(t){i(this);e.options.pauseOnFocus&&(e.focussed=!1,e.autoPlay())})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){var i=this;return i.currentSlide},e.prototype.getDotCount=function(){var i=this,e=0,t=0,o=0;if(i.options.infinite===!0)if(i.slideCount<=i.options.slidesToShow)++o;else for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else if(i.options.centerMode===!0)o=i.slideCount;else if(i.options.asNavFor)for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else o=1+Math.ceil((i.slideCount-i.options.slidesToShow)/i.options.slidesToScroll);return o-1},e.prototype.getLeft=function(i){var e,t,o,s,n=this,r=0;return n.slideOffset=0,t=n.$slides.first().outerHeight(!0),n.options.infinite===!0?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,n.options.vertical===!0&&n.options.centerMode===!0&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!==0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),n.options.centerMode===!0&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:n.options.centerMode===!0&&n.options.infinite===!0?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:n.options.centerMode===!0&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=n.options.vertical===!1?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,n.options.variableWidth===!0&&(o=n.slideCount<=n.options.slidesToShow||n.options.infinite===!1?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow),e=n.options.rtl===!0?o[0]?(n.$slideTrack.width()-o[0].offsetLeft-o.width())*-1:0:o[0]?o[0].offsetLeft*-1:0,n.options.centerMode===!0&&(o=n.slideCount<=n.options.slidesToShow||n.options.infinite===!1?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow+1),e=n.options.rtl===!0?o[0]?(n.$slideTrack.width()-o[0].offsetLeft-o.width())*-1:0:o[0]?o[0].offsetLeft*-1:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){var e=this;return e.options[i]},e.prototype.getNavigableIndexes=function(){var i,e=this,t=0,o=0,s=[];for(e.options.infinite===!1?i=e.slideCount:(t=e.options.slidesToScroll*-1,o=e.options.slidesToScroll*-1,i=2*e.slideCount);t<i;)s.push(t),t=o+e.options.slidesToScroll,o+=e.options.slidesToScroll<=e.options.slidesToShow?e.options.slidesToScroll:e.options.slidesToShow;return s},e.prototype.getSlick=function(){return this},e.prototype.getSlideCount=function(){var e,t,o,s,n=this;return s=n.options.centerMode===!0?Math.floor(n.$list.width()/2):0,o=n.swipeLeft*-1+s,n.options.swipeToSlide===!0?(n.$slideTrack.find(".slick-slide").each(function(e,s){var r,l,d;if(r=i(s).outerWidth(),l=s.offsetLeft,n.options.centerMode!==!0&&(l+=r/2),d=l+r,o<d)return t=s,!1}),e=Math.abs(i(t).attr("data-slick-index")-n.currentSlide)||1):n.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){var t=this;t.changeSlide({data:{message:"index",index:parseInt(i)}},e)},e.prototype.init=function(e){var t=this;i(t.$slider).hasClass("slick-initialized")||(i(t.$slider).addClass("slick-initialized"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger("init",[t]),t.options.accessibility===!0&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return i>=0&&i<e.slideCount});e.$slides.add(e.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),null!==e.$dots&&(e.$slides.not(e.$slideTrack.find(".slick-cloned")).each(function(t){var s=o.indexOf(t);if(i(this).attr({role:"tabpanel",id:"slick-slide"+e.instanceUid+t,tabindex:-1}),s!==-1){var n="slick-slide-control"+e.instanceUid+s;i("#"+n).length&&i(this).attr({"aria-describedby":n})}}),e.$dots.attr("role","tablist").find("li").each(function(s){var n=o[s];i(this).attr({role:"presentation"}),i(this).find("button").first().attr({role:"tab",id:"slick-slide-control"+e.instanceUid+s,"aria-controls":"slick-slide"+e.instanceUid+n,"aria-label":s+1+" of "+t,"aria-selected":null,tabindex:"-1"})}).eq(e.currentSlide).find("button").attr({"aria-selected":"true",tabindex:"0"}).end());for(var s=e.currentSlide,n=s+e.options.slidesToShow;s<n;s++)e.options.focusOnChange?e.$slides.eq(s).attr({tabindex:"0"}):e.$slides.eq(s).removeAttr("tabindex");e.activateADA()},e.prototype.initArrowEvents=function(){var i=this;i.options.arrows===!0&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},i.changeSlide),i.$nextArrow.off("click.slick").on("click.slick",{message:"next"},i.changeSlide),i.options.accessibility===!0&&(i.$prevArrow.on("keydown.slick",i.keyHandler),i.$nextArrow.on("keydown.slick",i.keyHandler)))},e.prototype.initDotEvents=function(){var e=this;e.options.dots===!0&&e.slideCount>e.options.slidesToShow&&(i("li",e.$dots).on("click.slick",{message:"index"},e.changeSlide),e.options.accessibility===!0&&e.$dots.on("keydown.slick",e.keyHandler)),e.options.dots===!0&&e.options.pauseOnDotsHover===!0&&e.slideCount>e.options.slidesToShow&&i("li",e.$dots).on("mouseenter.slick",i.proxy(e.interrupt,e,!0)).on("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var e=this;e.options.pauseOnHover&&(e.$list.on("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.on("mouseleave.slick",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on("touchstart.slick mousedown.slick",{action:"start"},e.swipeHandler),e.$list.on("touchmove.slick mousemove.slick",{action:"move"},e.swipeHandler),e.$list.on("touchend.slick mouseup.slick",{action:"end"},e.swipeHandler),e.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},e.swipeHandler),e.$list.on("click.slick",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),e.options.accessibility===!0&&e.$list.on("keydown.slick",e.keyHandler),e.options.focusOnSelect===!0&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),i(window).on("orientationchange.slick.slick-"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on("resize.slick.slick-"+e.instanceUid,i.proxy(e.resize,e)),i("[draggable!=true]",e.$slideTrack).on("dragstart",e.preventDefault),i(window).on("load.slick.slick-"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var i=this;i.options.arrows===!0&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),i.options.dots===!0&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var e=this;i.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===i.keyCode&&e.options.accessibility===!0?e.changeSlide({data:{message:e.options.rtl===!0?"next":"previous"}}):39===i.keyCode&&e.options.accessibility===!0&&e.changeSlide({data:{message:e.options.rtl===!0?"previous":"next"}}))},e.prototype.lazyLoad=function(){function e(e){i("img[data-lazy]",e).each(function(){var e=i(this),t=i(this).attr("data-lazy"),o=i(this).attr("data-srcset"),s=i(this).attr("data-sizes")||r.$slider.attr("data-sizes"),n=document.createElement("img");n.onload=function(){e.animate({opacity:0},100,function(){o&&(e.attr("srcset",o),s&&e.attr("sizes",s)),e.attr("src",t).animate({opacity:1},200,function(){e.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading")}),r.$slider.trigger("lazyLoaded",[r,e,t])})},n.onerror=function(){e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),r.$slider.trigger("lazyLoadError",[r,e,t])},n.src=t})}var t,o,s,n,r=this;if(r.options.centerMode===!0?r.options.infinite===!0?(s=r.currentSlide+(r.options.slidesToShow/2+1),n=s+r.options.slidesToShow+2):(s=Math.max(0,r.currentSlide-(r.options.slidesToShow/2+1)),n=2+(r.options.slidesToShow/2+1)+r.currentSlide):(s=r.options.infinite?r.options.slidesToShow+r.currentSlide:r.currentSlide,n=Math.ceil(s+r.options.slidesToShow),r.options.fade===!0&&(s>0&&s--,n<=r.slideCount&&n++)),t=r.$slider.find(".slick-slide").slice(s,n),"anticipated"===r.options.lazyLoad)for(var l=s-1,d=n,a=r.$slider.find(".slick-slide"),c=0;c<r.options.slidesToScroll;c++)l<0&&(l=r.slideCount-1),t=t.add(a.eq(l)),t=t.add(a.eq(d)),l--,d++;e(t),r.slideCount<=r.options.slidesToShow?(o=r.$slider.find(".slick-slide"),e(o)):r.currentSlide>=r.slideCount-r.options.slidesToShow?(o=r.$slider.find(".slick-cloned").slice(0,r.options.slidesToShow),e(o)):0===r.currentSlide&&(o=r.$slider.find(".slick-cloned").slice(r.options.slidesToShow*-1),e(o))},e.prototype.loadSlider=function(){var i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass("slick-loading"),i.initUI(),"progressive"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){var i=this;i.changeSlide({data:{message:"next"}})},e.prototype.orientationChange=function(){var i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var t=this;if(!t.unslicked&&(t.$slider.trigger("afterChange",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),t.options.accessibility===!0&&(t.initADA(),t.options.focusOnChange))){var o=i(t.$slides.get(t.currentSlide));o.attr("tabindex",0).focus()}},e.prototype.prev=e.prototype.slickPrev=function(){var i=this;i.changeSlide({data:{message:"previous"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var t,o,s,n,r,l=this,d=i("img[data-lazy]",l.$slider);d.length?(t=d.first(),o=t.attr("data-lazy"),s=t.attr("data-srcset"),n=t.attr("data-sizes")||l.$slider.attr("data-sizes"),r=document.createElement("img"),r.onload=function(){s&&(t.attr("srcset",s),n&&t.attr("sizes",n)),t.attr("src",o).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading"),l.options.adaptiveHeight===!0&&l.setPosition(),l.$slider.trigger("lazyLoaded",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),l.$slider.trigger("lazyLoadError",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger("allImagesLoaded",[l])},e.prototype.refresh=function(e){var t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:"index",index:t}},!1)},e.prototype.registerBreakpoints=function(){var e,t,o,s=this,n=s.options.responsive||null;if("array"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||"window";for(e in n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass("slick-slide"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),e.options.focusOnSelect===!0&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger("reInit",[e])},e.prototype.resize=function(){var e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var o=this;return"boolean"==typeof i?(e=i,i=e===!0?0:o.slideCount-1):i=e===!0?--i:i,!(o.slideCount<1||i<0||i>o.slideCount-1)&&(o.unload(),t===!0?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,void o.reinit())},e.prototype.setCSS=function(i){var e,t,o=this,s={};o.options.rtl===!0&&(i=-i),e="left"==o.positionProp?Math.ceil(i)+"px":"0px",t="top"==o.positionProp?Math.ceil(i)+"px":"0px",s[o.positionProp]=i,o.transformsEnabled===!1?o.$slideTrack.css(s):(s={},o.cssTransitions===!1?(s[o.animType]="translate("+e+", "+t+")",o.$slideTrack.css(s)):(s[o.animType]="translate3d("+e+", "+t+", 0px)",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var i=this;i.options.vertical===!1?i.options.centerMode===!0&&i.$list.css({padding:"0px "+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),i.options.centerMode===!0&&i.$list.css({padding:i.options.centerPadding+" 0px"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),i.options.vertical===!1&&i.options.variableWidth===!1?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(".slick-slide").length))):i.options.variableWidth===!0?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(".slick-slide").length)));var e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();i.options.variableWidth===!1&&i.$slideTrack.children(".slick-slide").width(i.slideWidth-e)},e.prototype.setFade=function(){var e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,t.options.rtl===!0?i(s).css({position:"relative",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}):i(s).css({position:"relative",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var i=this;if(1===i.options.slidesToShow&&i.options.adaptiveHeight===!0&&i.options.vertical===!1){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css("height",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var e,t,o,s,n,r=this,l=!1;if("object"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n="multiple"):"string"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],"responsive"===arguments[0]&&"array"===i.type(arguments[1])?n="responsive":"undefined"!=typeof arguments[1]&&(n="single")),"single"===n)r.options[o]=s;else if("multiple"===n)i.each(o,function(i,e){r.options[i]=e});else if("responsive"===n)for(t in s)if("array"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var i=this;i.setDimensions(),i.setHeight(),i.options.fade===!1?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger("setPosition",[i])},e.prototype.setProps=function(){var i=this,e=document.body.style;i.positionProp=i.options.vertical===!0?"top":"left",
"top"===i.positionProp?i.$slider.addClass("slick-vertical"):i.$slider.removeClass("slick-vertical"),void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||i.options.useCSS===!0&&(i.cssTransitions=!0),i.options.fade&&("number"==typeof i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void 0!==e.OTransform&&(i.animType="OTransform",i.transformType="-o-transform",i.transitionType="OTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.MozTransform&&(i.animType="MozTransform",i.transformType="-moz-transform",i.transitionType="MozTransition",void 0===e.perspectiveProperty&&void 0===e.MozPerspective&&(i.animType=!1)),void 0!==e.webkitTransform&&(i.animType="webkitTransform",i.transformType="-webkit-transform",i.transitionType="webkitTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.msTransform&&(i.animType="msTransform",i.transformType="-ms-transform",i.transitionType="msTransition",void 0===e.msTransform&&(i.animType=!1)),void 0!==e.transform&&i.animType!==!1&&(i.animType="transform",i.transformType="transform",i.transitionType="transition"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&i.animType!==!1},e.prototype.setSlideClasses=function(i){var e,t,o,s,n=this;if(t=n.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),n.$slides.eq(i).addClass("slick-current"),n.options.centerMode===!0){var r=n.options.slidesToShow%2===0?1:0;e=Math.floor(n.options.slidesToShow/2),n.options.infinite===!0&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass("slick-active").attr("aria-hidden","false"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass("slick-active").attr("aria-hidden","false")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass("slick-center"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass("slick-center")),n.$slides.eq(i).addClass("slick-center")}else i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):t.length<=n.options.slidesToShow?t.addClass("slick-active").attr("aria-hidden","false"):(s=n.slideCount%n.options.slidesToShow,o=n.options.infinite===!0?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-i<n.options.slidesToShow?t.slice(o-(n.options.slidesToShow-s),o+s).addClass("slick-active").attr("aria-hidden","false"):t.slice(o,o+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"));"ondemand"!==n.options.lazyLoad&&"anticipated"!==n.options.lazyLoad||n.lazyLoad()},e.prototype.setupInfinite=function(){var e,t,o,s=this;if(s.options.fade===!0&&(s.options.centerMode=!1),s.options.infinite===!0&&s.options.fade===!1&&(t=null,s.slideCount>s.options.slidesToShow)){for(o=s.options.centerMode===!0?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t-s.slideCount).prependTo(s.$slideTrack).addClass("slick-cloned");for(e=0;e<o+s.slideCount;e+=1)t=e,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t+s.slideCount).appendTo(s.$slideTrack).addClass("slick-cloned");s.$slideTrack.find(".slick-cloned").find("[id]").each(function(){i(this).attr("id","")})}},e.prototype.interrupt=function(i){var e=this;i||e.autoPlay(),e.interrupted=i},e.prototype.selectHandler=function(e){var t=this,o=i(e.target).is(".slick-slide")?i(e.target):i(e.target).parents(".slick-slide"),s=parseInt(o.attr("data-slick-index"));return s||(s=0),t.slideCount<=t.options.slidesToShow?void t.slideHandler(s,!1,!0):void t.slideHandler(s)},e.prototype.slideHandler=function(i,e,t){var o,s,n,r,l,d=null,a=this;if(e=e||!1,!(a.animating===!0&&a.options.waitForAnimate===!0||a.options.fade===!0&&a.currentSlide===i))return e===!1&&a.asNavFor(i),o=i,d=a.getLeft(o),r=a.getLeft(a.currentSlide),a.currentLeft=null===a.swipeLeft?r:a.swipeLeft,a.options.infinite===!1&&a.options.centerMode===!1&&(i<0||i>a.getDotCount()*a.options.slidesToScroll)?void(a.options.fade===!1&&(o=a.currentSlide,t!==!0&&a.slideCount>a.options.slidesToShow?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o))):a.options.infinite===!1&&a.options.centerMode===!0&&(i<0||i>a.slideCount-a.options.slidesToScroll)?void(a.options.fade===!1&&(o=a.currentSlide,t!==!0&&a.slideCount>a.options.slidesToShow?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o))):(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!==0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!==0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger("beforeChange",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=a.getNavTarget(),l=l.slick("getSlick"),l.slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide)),a.updateDots(),a.updateArrows(),a.options.fade===!0?(t!==!0?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void a.animateHeight()):void(t!==!0&&a.slideCount>a.options.slidesToShow?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)))},e.prototype.startLoad=function(){var i=this;i.options.arrows===!0&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),i.options.dots===!0&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass("slick-loading")},e.prototype.swipeDirection=function(){var i,e,t,o,s=this;return i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),o=Math.round(180*t/Math.PI),o<0&&(o=360-Math.abs(o)),o<=45&&o>=0?s.options.rtl===!1?"left":"right":o<=360&&o>=315?s.options.rtl===!1?"left":"right":o>=135&&o<=225?s.options.rtl===!1?"right":"left":s.options.verticalSwiping===!0?o>=35&&o<=135?"down":"up":"vertical"},e.prototype.swipeEnd=function(i){var e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void 0===o.touchObject.curX)return!1;if(o.touchObject.edgeHit===!0&&o.$slider.trigger("edge",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case"left":case"down":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case"right":case"up":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}"vertical"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger("swipe",[o,t]))}else o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var e=this;if(!(e.options.swipe===!1||"ontouchend"in document&&e.options.swipe===!1||e.options.draggable===!1&&i.type.indexOf("mouse")!==-1))switch(e.touchObject.fingerCount=i.originalEvent&&void 0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,e.options.verticalSwiping===!0&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case"start":e.swipeStart(i);break;case"move":e.swipeMove(i);break;case"end":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var e,t,o,s,n,r,l=this;return n=void 0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void 0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void 0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(l.options.verticalSwiping===!0&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void 0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(l.options.rtl===!1?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),l.options.verticalSwiping===!0&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,l.options.infinite===!1&&(0===l.currentSlide&&"right"===t||l.currentSlide>=l.getDotCount()&&"left"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),l.options.vertical===!1?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,l.options.verticalSwiping===!0&&(l.swipeLeft=e+o*s),l.options.fade!==!0&&l.options.touchMove!==!1&&(l.animating===!0?(l.swipeLeft=null,!1):void l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var e,t=this;return t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow?(t.touchObject={},!1):(void 0!==i.originalEvent&&void 0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void 0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void 0!==e?e.pageY:i.clientY,void(t.dragging=!0))},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var e=this;i(".slick-cloned",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},e.prototype.unslick=function(i){var e=this;e.$slider.trigger("unslick",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var i,e=this;i=Math.floor(e.options.slidesToShow/2),e.options.arrows===!0&&e.slideCount>e.options.slidesToShow&&!e.options.infinite&&(e.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),e.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===e.currentSlide?(e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),e.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):e.currentSlide>=e.slideCount-e.options.slidesToShow&&e.options.centerMode===!1?(e.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),e.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):e.currentSlide>=e.slideCount-1&&e.options.centerMode===!0&&(e.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),e.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},e.prototype.updateDots=function(){var i=this;null!==i.$dots&&(i.$dots.find("li").removeClass("slick-active").end(),i.$dots.find("li").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass("slick-active"))},e.prototype.visibility=function(){var i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i<r;i++)if("object"==typeof s||"undefined"==typeof s?o[i].slick=new e(o[i],s):t=o[i].slick[s].apply(o[i].slick,n),"undefined"!=typeof t)return t;return o}});
!function(e){"function"==typeof define&&define.amd?define([],e):"undefined"!=typeof module&&null!==module&&module.exports?module.exports=e:e()}(function(){function e(e){return new CustomEvent(e,P)}function t(e){return e[B]||(e[B]={})}function n(e,n,i,o,a){function c(e){i(e,o)}n=n.split(O);for(var u,r=t(e),d=n.length;d--;)(r[u=n[d]]||(r[u]=[])).push([i,c]),e.addEventListener(u,c)}function i(e,n,i,o){n=n.split(O);var a,c,u,r=t(e),d=n.length;if(r)for(;d--;)if(a=n[d],c=r[a])for(u=c.length;u--;)c[u][0]===i&&(e.removeEventListener(a,c[u][1]),c.splice(u,1))}function o(t,n,i){var o=e(n);i&&L(o,i),t.dispatchEvent(o)}function a(e){function t(e){i?(n(),C(t),o=!0,i=!1):o=!1}var n=e,i=!1,o=!1;this.kick=function(e){i=!0,o||t()},this.end=function(e){var t=n;e&&(o?(n=i?function(){t(),e()}:e,i=!0):e())}}function c(){}function u(e){e.preventDefault()}function r(e){return!!D[e.target.tagName.toLowerCase()]}function d(e){return 1===e.which&&!e.ctrlKey&&!e.altKey}function m(e,t){var n,i;if(e.identifiedTouch)return e.identifiedTouch(t);for(n=-1,i=e.length;++n<i;)if(e[n].identifier===t)return e[n]}function f(e,t){var n=m(e.changedTouches,t.identifier);if(n&&(n.pageX!==t.pageX||n.pageY!==t.pageY))return n}function v(e){d(e)&&(r(e)||(n(document,N.move,s,e),n(document,N.cancel,l,e)))}function s(e,t){y(e,t,e,g)}function l(e,t){g()}function g(){i(document,N.move,s),i(document,N.cancel,l)}function p(e){if(!D[e.target.tagName.toLowerCase()]){var t=e.changedTouches[0],i={target:t.target,pageX:t.pageX,pageY:t.pageY,identifier:t.identifier,touchmove:function(e,t){h(e,t)},touchend:function(e,t){X(e,t)}};n(document,z.move,i.touchmove,i),n(document,z.cancel,i.touchend,i)}}function h(e,t){var n=f(e,t);n&&y(e,t,n,Y)}function X(e,t){m(e.changedTouches,t.identifier)&&Y(t)}function Y(e){i(document,z.move,e.touchmove),i(document,z.cancel,e.touchend)}function y(e,t,n,i){var o=n.pageX-t.pageX,a=n.pageY-t.pageY;o*o+a*a<R*R||w(e,t,n,o,a,i)}function w(e,t,n,i,a,u){var r=e.targetTouches,d=e.timeStamp-t.timeStamp,m={altKey:e.altKey,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,startX:t.pageX,startY:t.pageY,distX:i,distY:a,deltaX:i,deltaY:a,pageX:n.pageX,pageY:n.pageY,velocityX:i/d,velocityY:a/d,identifier:t.identifier,targetTouches:r,finger:r?r.length:1,enableMove:function(){this.moveEnabled=!0,this.enableMove=c,e.preventDefault()}};o(t.target,"movestart",m),u(t)}function T(e,t){var n=t.timer;t.touch=e,t.timeStamp=e.timeStamp,n.kick()}function b(e,t){var n=t.target,o=t.event,a=t.timer;S(),Q(n,o,a,function(){setTimeout(function(){i(n,"click",u)},0)})}function S(){i(document,N.move,T),i(document,N.end,b)}function k(e,t){var n=t.event,i=t.timer,o=f(e,n);o&&(e.preventDefault(),n.targetTouches=e.targetTouches,t.touch=o,t.timeStamp=e.timeStamp,i.kick())}function K(e,t){var n=t.target,i=t.event,o=t.timer;m(e.changedTouches,i.identifier)&&(j(t),Q(n,i,o))}function j(e){i(document,z.move,e.activeTouchmove),i(document,z.end,e.activeTouchend)}function E(e,t,n){var i=n-e.timeStamp;e.distX=t.pageX-e.startX,e.distY=t.pageY-e.startY,e.deltaX=t.pageX-e.pageX,e.deltaY=t.pageY-e.pageY,e.velocityX=.3*e.velocityX+.7*e.deltaX/i,e.velocityY=.3*e.velocityY+.7*e.deltaY/i,e.pageX=t.pageX,e.pageY=t.pageY}function Q(e,t,n,i){n.end(function(){return o(e,"moveend",t),i&&i()})}function q(e){function t(e){E(i,c.touch,c.timeStamp),o(c.target,"move",i)}if(!e.defaultPrevented&&e.moveEnabled){var i={startX:e.startX,startY:e.startY,pageX:e.pageX,pageY:e.pageY,distX:e.distX,distY:e.distY,deltaX:e.deltaX,deltaY:e.deltaY,velocityX:e.velocityX,velocityY:e.velocityY,identifier:e.identifier,targetTouches:e.targetTouches,finger:e.finger},c={target:e.target,event:i,timer:new a(t),touch:void 0,timeStamp:e.timeStamp};void 0===e.identifier?(n(e.target,"click",u),n(document,N.move,T,c),n(document,N.end,b,c)):(c.activeTouchmove=function(e,t){k(e,t)},c.activeTouchend=function(e,t){K(e,t)},n(document,z.move,c.activeTouchmove,c),n(document,z.end,c.activeTouchend,c))}}function A(e){e.enableMove()}function F(e){e.enableMove()}function M(e){e.enableMove()}function x(e){var t=e.handler;e.handler=function(e){for(var n,i=G.length;i--;)e[n=G[i]]=e.originalEvent[n];t.apply(this,arguments)}}var L=Object.assign||window.jQuery&&jQuery.extend,R=8,C=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e,t){return window.setTimeout(function(){e()},25)}}(),D={textarea:!0,input:!0,select:!0,button:!0},N={move:"mousemove",cancel:"mouseup dragstart",end:"mouseup"},z={move:"touchmove",cancel:"touchend",end:"touchend"},O=/\s+/,P={bubbles:!0,cancelable:!0},B=Symbol("events");if(n(document,"mousedown",v),n(document,"touchstart",p),n(document,"movestart",q),window.jQuery){var G="startX startY pageX pageY distX distY deltaX deltaY velocityX velocityY".split(" ");jQuery.event.special.movestart={setup:function(){return n(this,"movestart",A),!1},teardown:function(){return i(this,"movestart",A),!1},add:x},jQuery.event.special.move={setup:function(){return n(this,"movestart",F),!1},teardown:function(){return i(this,"movestart",F),!1},add:x},jQuery.event.special.moveend={setup:function(){return n(this,"movestart",M),!1},teardown:function(){return i(this,"movestart",M),!1},add:x}}});
!function(t){t.fn.twentytwenty=function(e){var e=t.extend({default_offset_pct:.5,orientation:"horizontal",before_label:"Before",after_label:"After",no_overlay:!1},e);return this.each(function(){var n=e.default_offset_pct,a=t(this),i=e.orientation,s="vertical"===i?"down":"left",r="vertical"===i?"up":"right";a.wrap("<div class='twentytwenty-wrapper twentytwenty-"+i+"'></div>"),e.no_overlay||a.append("<div class='twentytwenty-overlay'></div>");var d=a.find("img:first"),c=a.find("img:last");a.append("<div class='twentytwenty-handle'></div>");var l=a.find(".twentytwenty-handle");l.append("<span class='twentytwenty-"+s+"-arrow'></span>"),l.append("<span class='twentytwenty-"+r+"-arrow'></span>"),a.addClass("twentytwenty-container"),d.addClass("twentytwenty-before"),c.addClass("twentytwenty-after");var o=a.find(".twentytwenty-overlay");o.append("<div class='twentytwenty-before-label' data-content='"+e.before_label+"'></div>"),o.append("<div class='twentytwenty-after-label' data-content='"+e.after_label+"'></div>");var w=function(t){var e=d.width(),n=d.height();return{w:e+"px",h:n+"px",cw:t*e+"px",ch:t*n+"px"}},f=function(t){"vertical"===i?(d.css("clip","rect(0,"+t.w+","+t.ch+",0)"),c.css("clip","rect("+t.ch+","+t.w+","+t.h+",0)")):(d.css("clip","rect(0,"+t.cw+","+t.h+",0)"),c.css("clip","rect(0,"+t.w+","+t.h+","+t.cw+")")),a.css("height",t.h)},v=function(t){var e=w(t);l.css("vertical"===i?"top":"left","vertical"===i?e.ch:e.cw),f(e)};t(window).on("resize.twentytwenty",function(t){v(n)});var p=0,y=0,h=0,u=0;l.on("movestart",function(t){(t.distX>t.distY&&t.distX<-t.distY||t.distX<t.distY&&t.distX>-t.distY)&&"vertical"!==i?t.preventDefault():(t.distX<t.distY&&t.distX<-t.distY||t.distX>t.distY&&t.distX>-t.distY)&&"vertical"===i&&t.preventDefault(),a.addClass("active"),p=a.offset().left,y=a.offset().top,h=d.width(),u=d.height()}),l.on("moveend",function(t){a.removeClass("active")}),l.on("move",function(t){a.hasClass("active")&&((n="vertical"===i?(t.pageY-y)/u:(t.pageX-p)/h)<0&&(n=0),n>1&&(n=1),v(n))}),a.find("img").on("mousedown",function(t){t.preventDefault()}),t(window).trigger("resize.twentytwenty")})}}(jQuery);
/*!
Waypoints - 4.0.1
Copyright © 2011-2016 Caleb Troughton
Licensed under the MIT license.
https://github.com/imakewebthings/waypoints/blob/master/licenses.txt
*/
!function(){"use strict";function t(o){if(!o)throw new Error("No options passed to Waypoint constructor");if(!o.element)throw new Error("No element option passed to Waypoint constructor");if(!o.handler)throw new Error("No handler option passed to Waypoint constructor");this.key="waypoint-"+e,this.options=t.Adapter.extend({},t.defaults,o),this.element=this.options.element,this.adapter=new t.Adapter(this.element),this.callback=o.handler,this.axis=this.options.horizontal?"horizontal":"vertical",this.enabled=this.options.enabled,this.triggerPoint=null,this.group=t.Group.findOrCreate({name:this.options.group,axis:this.axis}),this.context=t.Context.findOrCreateByElement(this.options.context),t.offsetAliases[this.options.offset]&&(this.options.offset=t.offsetAliases[this.options.offset]),this.group.add(this),this.context.add(this),i[this.key]=this,e+=1}var e=0,i={};t.prototype.queueTrigger=function(t){this.group.queueTrigger(this,t)},t.prototype.trigger=function(t){this.enabled&&this.callback&&this.callback.apply(this,t)},t.prototype.destroy=function(){this.context.remove(this),this.group.remove(this),delete i[this.key]},t.prototype.disable=function(){return this.enabled=!1,this},t.prototype.enable=function(){return this.context.refresh(),this.enabled=!0,this},t.prototype.next=function(){return this.group.next(this)},t.prototype.previous=function(){return this.group.previous(this)},t.invokeAll=function(t){var e=[];for(var o in i)e.push(i[o]);for(var n=0,r=e.length;r>n;n++)e[n][t]()},t.destroyAll=function(){t.invokeAll("destroy")},t.disableAll=function(){t.invokeAll("disable")},t.enableAll=function(){t.Context.refreshAll();for(var e in i)i[e].enabled=!0;return this},t.refreshAll=function(){t.Context.refreshAll()},t.viewportHeight=function(){return window.innerHeight||document.documentElement.clientHeight},t.viewportWidth=function(){return document.documentElement.clientWidth},t.adapters=[],t.defaults={context:window,continuous:!0,enabled:!0,group:"default",horizontal:!1,offset:0},t.offsetAliases={"bottom-in-view":function(){return this.context.innerHeight()-this.adapter.outerHeight()},"right-in-view":function(){return this.context.innerWidth()-this.adapter.outerWidth()}},window.Waypoint=t}(),function(){"use strict";function t(t){window.setTimeout(t,1e3/60)}function e(t){this.element=t,this.Adapter=n.Adapter,this.adapter=new this.Adapter(t),this.key="waypoint-context-"+i,this.didScroll=!1,this.didResize=!1,this.oldScroll={x:this.adapter.scrollLeft(),y:this.adapter.scrollTop()},this.waypoints={vertical:{},horizontal:{}},t.waypointContextKey=this.key,o[t.waypointContextKey]=this,i+=1,n.windowContext||(n.windowContext=!0,n.windowContext=new e(window)),this.createThrottledScrollHandler(),this.createThrottledResizeHandler()}var i=0,o={},n=window.Waypoint,r=window.onload;e.prototype.add=function(t){var e=t.options.horizontal?"horizontal":"vertical";this.waypoints[e][t.key]=t,this.refresh()},e.prototype.checkEmpty=function(){var t=this.Adapter.isEmptyObject(this.waypoints.horizontal),e=this.Adapter.isEmptyObject(this.waypoints.vertical),i=this.element==this.element.window;t&&e&&!i&&(this.adapter.off(".waypoints"),delete o[this.key])},e.prototype.createThrottledResizeHandler=function(){function t(){e.handleResize(),e.didResize=!1}var e=this;this.adapter.on("resize.waypoints",function(){e.didResize||(e.didResize=!0,n.requestAnimationFrame(t))})},e.prototype.createThrottledScrollHandler=function(){function t(){e.handleScroll(),e.didScroll=!1}var e=this;this.adapter.on("scroll.waypoints",function(){(!e.didScroll||n.isTouch)&&(e.didScroll=!0,n.requestAnimationFrame(t))})},e.prototype.handleResize=function(){n.Context.refreshAll()},e.prototype.handleScroll=function(){var t={},e={horizontal:{newScroll:this.adapter.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.adapter.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};for(var i in e){var o=e[i],n=o.newScroll>o.oldScroll,r=n?o.forward:o.backward;for(var s in this.waypoints[i]){var a=this.waypoints[i][s];if(null!==a.triggerPoint){var l=o.oldScroll<a.triggerPoint,h=o.newScroll>=a.triggerPoint,p=l&&h,u=!l&&!h;(p||u)&&(a.queueTrigger(r),t[a.group.id]=a.group)}}}for(var c in t)t[c].flushTriggers();this.oldScroll={x:e.horizontal.newScroll,y:e.vertical.newScroll}},e.prototype.innerHeight=function(){return this.element==this.element.window?n.viewportHeight():this.adapter.innerHeight()},e.prototype.remove=function(t){delete this.waypoints[t.axis][t.key],this.checkEmpty()},e.prototype.innerWidth=function(){return this.element==this.element.window?n.viewportWidth():this.adapter.innerWidth()},e.prototype.destroy=function(){var t=[];for(var e in this.waypoints)for(var i in this.waypoints[e])t.push(this.waypoints[e][i]);for(var o=0,n=t.length;n>o;o++)t[o].destroy()},e.prototype.refresh=function(){var t,e=this.element==this.element.window,i=e?void 0:this.adapter.offset(),o={};this.handleScroll(),t={horizontal:{contextOffset:e?0:i.left,contextScroll:e?0:this.oldScroll.x,contextDimension:this.innerWidth(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:e?0:i.top,contextScroll:e?0:this.oldScroll.y,contextDimension:this.innerHeight(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};for(var r in t){var s=t[r];for(var a in this.waypoints[r]){var l,h,p,u,c,d=this.waypoints[r][a],f=d.options.offset,w=d.triggerPoint,y=0,g=null==w;d.element!==d.element.window&&(y=d.adapter.offset()[s.offsetProp]),"function"==typeof f?f=f.apply(d):"string"==typeof f&&(f=parseFloat(f),d.options.offset.indexOf("%")>-1&&(f=Math.ceil(s.contextDimension*f/100))),l=s.contextScroll-s.contextOffset,d.triggerPoint=Math.floor(y+l-f),h=w<s.oldScroll,p=d.triggerPoint>=s.oldScroll,u=h&&p,c=!h&&!p,!g&&u?(d.queueTrigger(s.backward),o[d.group.id]=d.group):!g&&c?(d.queueTrigger(s.forward),o[d.group.id]=d.group):g&&s.oldScroll>=d.triggerPoint&&(d.queueTrigger(s.forward),o[d.group.id]=d.group)}}return n.requestAnimationFrame(function(){for(var t in o)o[t].flushTriggers()}),this},e.findOrCreateByElement=function(t){return e.findByElement(t)||new e(t)},e.refreshAll=function(){for(var t in o)o[t].refresh()},e.findByElement=function(t){return o[t.waypointContextKey]},window.onload=function(){r&&r(),e.refreshAll()},n.requestAnimationFrame=function(e){var i=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||t;i.call(window,e)},n.Context=e}(),function(){"use strict";function t(t,e){return t.triggerPoint-e.triggerPoint}function e(t,e){return e.triggerPoint-t.triggerPoint}function i(t){this.name=t.name,this.axis=t.axis,this.id=this.name+"-"+this.axis,this.waypoints=[],this.clearTriggerQueues(),o[this.axis][this.name]=this}var o={vertical:{},horizontal:{}},n=window.Waypoint;i.prototype.add=function(t){this.waypoints.push(t)},i.prototype.clearTriggerQueues=function(){this.triggerQueues={up:[],down:[],left:[],right:[]}},i.prototype.flushTriggers=function(){for(var i in this.triggerQueues){var o=this.triggerQueues[i],n="up"===i||"left"===i;o.sort(n?e:t);for(var r=0,s=o.length;s>r;r+=1){var a=o[r];(a.options.continuous||r===o.length-1)&&a.trigger([i])}}this.clearTriggerQueues()},i.prototype.next=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints),o=i===this.waypoints.length-1;return o?null:this.waypoints[i+1]},i.prototype.previous=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints);return i?this.waypoints[i-1]:null},i.prototype.queueTrigger=function(t,e){this.triggerQueues[e].push(t)},i.prototype.remove=function(t){var e=n.Adapter.inArray(t,this.waypoints);e>-1&&this.waypoints.splice(e,1)},i.prototype.first=function(){return this.waypoints[0]},i.prototype.last=function(){return this.waypoints[this.waypoints.length-1]},i.findOrCreate=function(t){return o[t.axis][t.name]||new i(t)},n.Group=i}(),function(){"use strict";function t(t){this.$element=e(t)}var e=window.jQuery,i=window.Waypoint;e.each(["innerHeight","innerWidth","off","offset","on","outerHeight","outerWidth","scrollLeft","scrollTop"],function(e,i){t.prototype[i]=function(){var t=Array.prototype.slice.call(arguments);return this.$element[i].apply(this.$element,t)}}),e.each(["extend","inArray","isEmptyObject"],function(i,o){t[o]=e[o]}),i.adapters.push({name:"jquery",Adapter:t}),i.Adapter=t}(),function(){"use strict";function t(t){return function(){var i=[],o=arguments[0];return t.isFunction(arguments[0])&&(o=t.extend({},arguments[1]),o.handler=arguments[0]),this.each(function(){var n=t.extend({},o,{element:this});"string"==typeof n.context&&(n.context=t(this).closest(n.context)[0]),i.push(new e(n))}),i}}var e=window.Waypoint;window.jQuery&&(window.jQuery.fn.waypoint=t(window.jQuery)),window.Zepto&&(window.Zepto.fn.waypoint=t(window.Zepto))}();
/*! lightgallery - v1.6.10 - 2018-05-01
* http://sachinchoolur.github.io/lightGallery/
* Copyright (c) 2018 Sachin N; Licensed GPLv3 */
!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(){"use strict";function b(b,d){if(this.el=b,this.$el=a(b),this.s=a.extend({},c,d),this.s.dynamic&&"undefined"!==this.s.dynamicEl&&this.s.dynamicEl.constructor===Array&&!this.s.dynamicEl.length)throw"When using dynamic mode, you must also define dynamicEl as an Array.";return this.modules={},this.lGalleryOn=!1,this.lgBusy=!1,this.hideBartimeout=!1,this.isTouch="ontouchstart"in document.documentElement,this.s.slideEndAnimatoin&&(this.s.hideControlOnEnd=!1),this.s.dynamic?this.$items=this.s.dynamicEl:"this"===this.s.selector?this.$items=this.$el:""!==this.s.selector?this.s.selectWithin?this.$items=a(this.s.selectWithin).find(this.s.selector):this.$items=this.$el.find(a(this.s.selector)):this.$items=this.$el.children(),this.$slide="",this.$outer="",this.init(),this}var c={mode:"lg-slide",cssEasing:"ease",easing:"linear",speed:600,height:"100%",width:"100%",addClass:"",startClass:"lg-start-zoom",backdropDuration:150,hideBarsDelay:6e3,useLeft:!1,closable:!0,loop:!0,escKey:!0,keyPress:!0,controls:!0,slideEndAnimatoin:!0,hideControlOnEnd:!1,mousewheel:!0,getCaptionFromTitleOrAlt:!0,appendSubHtmlTo:".lg-sub-html",subHtmlSelectorRelative:!1,preload:1,showAfterLoad:!0,selector:"",selectWithin:"",nextHtml:"",prevHtml:"",index:!1,iframeMaxWidth:"100%",download:!0,counter:!0,appendCounterTo:".lg-toolbar",swipeThreshold:50,enableSwipe:!0,enableDrag:!0,dynamic:!1,dynamicEl:[],galleryId:1};b.prototype.init=function(){var b=this;b.s.preload>b.$items.length&&(b.s.preload=b.$items.length);var c=window.location.hash;c.indexOf("lg="+this.s.galleryId)>0&&(b.index=parseInt(c.split("&slide=")[1],10),a("body").addClass("lg-from-hash"),a("body").hasClass("lg-on")||(setTimeout(function(){b.build(b.index)}),a("body").addClass("lg-on"))),b.s.dynamic?(b.$el.trigger("onBeforeOpen.lg"),b.index=b.s.index||0,a("body").hasClass("lg-on")||setTimeout(function(){b.build(b.index),a("body").addClass("lg-on")})):b.$items.on("click.lgcustom",function(c){try{c.preventDefault(),c.preventDefault()}catch(a){c.returnValue=!1}b.$el.trigger("onBeforeOpen.lg"),b.index=b.s.index||b.$items.index(this),a("body").hasClass("lg-on")||(b.build(b.index),a("body").addClass("lg-on"))})},b.prototype.build=function(b){var c=this;c.structure(),a.each(a.fn.lightGallery.modules,function(b){c.modules[b]=new a.fn.lightGallery.modules[b](c.el)}),c.slide(b,!1,!1,!1),c.s.keyPress&&c.keyPress(),c.$items.length>1?(c.arrow(),setTimeout(function(){c.enableDrag(),c.enableSwipe()},50),c.s.mousewheel&&c.mousewheel()):c.$slide.on("click.lg",function(){c.$el.trigger("onSlideClick.lg")}),c.counter(),c.closeGallery(),c.$el.trigger("onAfterOpen.lg"),c.$outer.on("mousemove.lg click.lg touchstart.lg",function(){c.$outer.removeClass("lg-hide-items"),clearTimeout(c.hideBartimeout),c.hideBartimeout=setTimeout(function(){c.$outer.addClass("lg-hide-items")},c.s.hideBarsDelay)}),c.$outer.trigger("mousemove.lg")},b.prototype.structure=function(){var b,c="",d="",e=0,f="",g=this;for(a("body").append('<div class="lg-backdrop"></div>'),a(".lg-backdrop").css("transition-duration",this.s.backdropDuration+"ms"),e=0;e<this.$items.length;e++)c+='<div class="lg-item"></div>';if(this.s.controls&&this.$items.length>1&&(d='<div class="lg-actions"><button class="lg-prev lg-icon">'+this.s.prevHtml+'</button><button class="lg-next lg-icon">'+this.s.nextHtml+"</button></div>"),".lg-sub-html"===this.s.appendSubHtmlTo&&(f='<div class="lg-sub-html"></div>'),b='<div class="lg-outer '+this.s.addClass+" "+this.s.startClass+'"><div class="lg" style="width:'+this.s.width+"; height:"+this.s.height+'"><div class="lg-inner">'+c+'</div><div class="lg-toolbar lg-group"><span class="lg-close lg-icon"></span></div>'+d+f+"</div></div>",a("body").append(b),this.$outer=a(".lg-outer"),this.$slide=this.$outer.find(".lg-item"),this.s.useLeft?(this.$outer.addClass("lg-use-left"),this.s.mode="lg-slide"):this.$outer.addClass("lg-use-css3"),g.setTop(),a(window).on("resize.lg orientationchange.lg",function(){setTimeout(function(){g.setTop()},100)}),this.$slide.eq(this.index).addClass("lg-current"),this.doCss()?this.$outer.addClass("lg-css3"):(this.$outer.addClass("lg-css"),this.s.speed=0),this.$outer.addClass(this.s.mode),this.s.enableDrag&&this.$items.length>1&&this.$outer.addClass("lg-grab"),this.s.showAfterLoad&&this.$outer.addClass("lg-show-after-load"),this.doCss()){var h=this.$outer.find(".lg-inner");h.css("transition-timing-function",this.s.cssEasing),h.css("transition-duration",this.s.speed+"ms")}setTimeout(function(){a(".lg-backdrop").addClass("in")}),setTimeout(function(){g.$outer.addClass("lg-visible")},this.s.backdropDuration),this.s.download&&this.$outer.find(".lg-toolbar").append('<a id="lg-download" target="_blank" download class="lg-download lg-icon"></a>'),this.prevScrollTop=a(window).scrollTop()},b.prototype.setTop=function(){if("100%"!==this.s.height){var b=a(window).height(),c=(b-parseInt(this.s.height,10))/2,d=this.$outer.find(".lg");b>=parseInt(this.s.height,10)?d.css("top",c+"px"):d.css("top","0px")}},b.prototype.doCss=function(){return!!function(){var a=["transition","MozTransition","WebkitTransition","OTransition","msTransition","KhtmlTransition"],b=document.documentElement,c=0;for(c=0;c<a.length;c++)if(a[c]in b.style)return!0}()},b.prototype.isVideo=function(a,b){var c;if(c=this.s.dynamic?this.s.dynamicEl[b].html:this.$items.eq(b).attr("data-html"),!a)return c?{html5:!0}:(console.error("lightGallery :- data-src is not pvovided on slide item "+(b+1)+". Please make sure the selector property is properly configured. More info - http://sachinchoolur.github.io/lightGallery/demos/html-markup.html"),!1);var d=a.match(/\/\/(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=|embed\/)?([a-z0-9\-\_\%]+)/i),e=a.match(/\/\/(?:www\.)?vimeo.com\/([0-9a-z\-_]+)/i),f=a.match(/\/\/(?:www\.)?dai.ly\/([0-9a-z\-_]+)/i),g=a.match(/\/\/(?:www\.)?(?:vk\.com|vkontakte\.ru)\/(?:video_ext\.php\?)(.*)/i);return d?{youtube:d}:e?{vimeo:e}:f?{dailymotion:f}:g?{vk:g}:void 0},b.prototype.counter=function(){this.s.counter&&a(this.s.appendCounterTo).append('<div id="lg-counter"><span id="lg-counter-current">'+(parseInt(this.index,10)+1)+'</span> / <span id="lg-counter-all">'+this.$items.length+"</span></div>")},b.prototype.addHtml=function(b){var c,d,e=null;if(this.s.dynamic?this.s.dynamicEl[b].subHtmlUrl?c=this.s.dynamicEl[b].subHtmlUrl:e=this.s.dynamicEl[b].subHtml:(d=this.$items.eq(b),d.attr("data-sub-html-url")?c=d.attr("data-sub-html-url"):(e=d.attr("data-sub-html"),this.s.getCaptionFromTitleOrAlt&&!e&&(e=d.attr("title")||d.find("img").first().attr("alt")))),!c)if(void 0!==e&&null!==e){var f=e.substring(0,1);"."!==f&&"#"!==f||(e=this.s.subHtmlSelectorRelative&&!this.s.dynamic?d.find(e).html():a(e).html())}else e="";".lg-sub-html"===this.s.appendSubHtmlTo?c?this.$outer.find(this.s.appendSubHtmlTo).load(c):this.$outer.find(this.s.appendSubHtmlTo).html(e):c?this.$slide.eq(b).load(c):this.$slide.eq(b).append(e),void 0!==e&&null!==e&&(""===e?this.$outer.find(this.s.appendSubHtmlTo).addClass("lg-empty-html"):this.$outer.find(this.s.appendSubHtmlTo).removeClass("lg-empty-html")),this.$el.trigger("onAfterAppendSubHtml.lg",[b])},b.prototype.preload=function(a){var b=1,c=1;for(b=1;b<=this.s.preload&&!(b>=this.$items.length-a);b++)this.loadContent(a+b,!1,0);for(c=1;c<=this.s.preload&&!(a-c<0);c++)this.loadContent(a-c,!1,0)},b.prototype.loadContent=function(b,c,d){var e,f,g,h,i,j,k=this,l=!1,m=function(b){for(var c=[],d=[],e=0;e<b.length;e++){var g=b[e].split(" ");""===g[0]&&g.splice(0,1),d.push(g[0]),c.push(g[1])}for(var h=a(window).width(),i=0;i<c.length;i++)if(parseInt(c[i],10)>h){f=d[i];break}};if(k.s.dynamic){if(k.s.dynamicEl[b].poster&&(l=!0,g=k.s.dynamicEl[b].poster),j=k.s.dynamicEl[b].html,f=k.s.dynamicEl[b].src,k.s.dynamicEl[b].responsive){m(k.s.dynamicEl[b].responsive.split(","))}h=k.s.dynamicEl[b].srcset,i=k.s.dynamicEl[b].sizes}else{if(k.$items.eq(b).attr("data-poster")&&(l=!0,g=k.$items.eq(b).attr("data-poster")),j=k.$items.eq(b).attr("data-html"),f=k.$items.eq(b).attr("href")||k.$items.eq(b).attr("data-src"),k.$items.eq(b).attr("data-responsive")){m(k.$items.eq(b).attr("data-responsive").split(","))}h=k.$items.eq(b).attr("data-srcset"),i=k.$items.eq(b).attr("data-sizes")}var n=!1;k.s.dynamic?k.s.dynamicEl[b].iframe&&(n=!0):"true"===k.$items.eq(b).attr("data-iframe")&&(n=!0);var o=k.isVideo(f,b);if(!k.$slide.eq(b).hasClass("lg-loaded")){if(n)k.$slide.eq(b).prepend('<div class="lg-video-cont lg-has-iframe" style="max-width:'+k.s.iframeMaxWidth+'"><div class="lg-video"><iframe class="lg-object" frameborder="0" src="'+f+'"  allowfullscreen="true"></iframe></div></div>');else if(l){var p="";p=o&&o.youtube?"lg-has-youtube":o&&o.vimeo?"lg-has-vimeo":"lg-has-html5",k.$slide.eq(b).prepend('<div class="lg-video-cont '+p+' "><div class="lg-video"><span class="lg-video-play"></span><img class="lg-object lg-has-poster" src="'+g+'" /></div></div>')}else o?(k.$slide.eq(b).prepend('<div class="lg-video-cont "><div class="lg-video"></div></div>'),k.$el.trigger("hasVideo.lg",[b,f,j])):k.$slide.eq(b).prepend('<div class="lg-img-wrap"><img class="lg-object lg-image" src="'+f+'" /></div>');if(k.$el.trigger("onAferAppendSlide.lg",[b]),e=k.$slide.eq(b).find(".lg-object"),i&&e.attr("sizes",i),h){e.attr("srcset",h);try{picturefill({elements:[e[0]]})}catch(a){console.warn("lightGallery :- If you want srcset to be supported for older browser please include picturefil version 2 javascript library in your document.")}}".lg-sub-html"!==this.s.appendSubHtmlTo&&k.addHtml(b),k.$slide.eq(b).addClass("lg-loaded")}k.$slide.eq(b).find(".lg-object").on("load.lg error.lg",function(){var c=0;d&&!a("body").hasClass("lg-from-hash")&&(c=d),setTimeout(function(){k.$slide.eq(b).addClass("lg-complete"),k.$el.trigger("onSlideItemLoad.lg",[b,d||0])},c)}),o&&o.html5&&!l&&k.$slide.eq(b).addClass("lg-complete"),!0===c&&(k.$slide.eq(b).hasClass("lg-complete")?k.preload(b):k.$slide.eq(b).find(".lg-object").on("load.lg error.lg",function(){k.preload(b)}))},b.prototype.slide=function(b,c,d,e){var f=this.$outer.find(".lg-current").index(),g=this;if(!g.lGalleryOn||f!==b){var h=this.$slide.length,i=g.lGalleryOn?this.s.speed:0;if(!g.lgBusy){if(this.s.download){var j;j=g.s.dynamic?!1!==g.s.dynamicEl[b].downloadUrl&&(g.s.dynamicEl[b].downloadUrl||g.s.dynamicEl[b].src):"false"!==g.$items.eq(b).attr("data-download-url")&&(g.$items.eq(b).attr("data-download-url")||g.$items.eq(b).attr("href")||g.$items.eq(b).attr("data-src")),j?(a("#lg-download").attr("href",j),g.$outer.removeClass("lg-hide-download")):g.$outer.addClass("lg-hide-download")}if(this.$el.trigger("onBeforeSlide.lg",[f,b,c,d]),g.lgBusy=!0,clearTimeout(g.hideBartimeout),".lg-sub-html"===this.s.appendSubHtmlTo&&setTimeout(function(){g.addHtml(b)},i),this.arrowDisable(b),e||(b<f?e="prev":b>f&&(e="next")),c){this.$slide.removeClass("lg-prev-slide lg-current lg-next-slide");var k,l;h>2?(k=b-1,l=b+1,0===b&&f===h-1?(l=0,k=h-1):b===h-1&&0===f&&(l=0,k=h-1)):(k=0,l=1),"prev"===e?g.$slide.eq(l).addClass("lg-next-slide"):g.$slide.eq(k).addClass("lg-prev-slide"),g.$slide.eq(b).addClass("lg-current")}else g.$outer.addClass("lg-no-trans"),this.$slide.removeClass("lg-prev-slide lg-next-slide"),"prev"===e?(this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(f).addClass("lg-next-slide")):(this.$slide.eq(b).addClass("lg-next-slide"),this.$slide.eq(f).addClass("lg-prev-slide")),setTimeout(function(){g.$slide.removeClass("lg-current"),g.$slide.eq(b).addClass("lg-current"),g.$outer.removeClass("lg-no-trans")},50);g.lGalleryOn?(setTimeout(function(){g.loadContent(b,!0,0)},this.s.speed+50),setTimeout(function(){g.lgBusy=!1,g.$el.trigger("onAfterSlide.lg",[f,b,c,d])},this.s.speed)):(g.loadContent(b,!0,g.s.backdropDuration),g.lgBusy=!1,g.$el.trigger("onAfterSlide.lg",[f,b,c,d])),g.lGalleryOn=!0,this.s.counter&&a("#lg-counter-current").text(b+1)}g.index=b}},b.prototype.goToNextSlide=function(a){var b=this,c=b.s.loop;a&&b.$slide.length<3&&(c=!1),b.lgBusy||(b.index+1<b.$slide.length?(b.index++,b.$el.trigger("onBeforeNextSlide.lg",[b.index]),b.slide(b.index,a,!1,"next")):c?(b.index=0,b.$el.trigger("onBeforeNextSlide.lg",[b.index]),b.slide(b.index,a,!1,"next")):b.s.slideEndAnimatoin&&!a&&(b.$outer.addClass("lg-right-end"),setTimeout(function(){b.$outer.removeClass("lg-right-end")},400)))},b.prototype.goToPrevSlide=function(a){var b=this,c=b.s.loop;a&&b.$slide.length<3&&(c=!1),b.lgBusy||(b.index>0?(b.index--,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1,"prev")):c?(b.index=b.$items.length-1,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1,"prev")):b.s.slideEndAnimatoin&&!a&&(b.$outer.addClass("lg-left-end"),setTimeout(function(){b.$outer.removeClass("lg-left-end")},400)))},b.prototype.keyPress=function(){var b=this;this.$items.length>1&&a(window).on("keyup.lg",function(a){b.$items.length>1&&(37===a.keyCode&&(a.preventDefault(),b.goToPrevSlide()),39===a.keyCode&&(a.preventDefault(),b.goToNextSlide()))}),a(window).on("keydown.lg",function(a){!0===b.s.escKey&&27===a.keyCode&&(a.preventDefault(),b.$outer.hasClass("lg-thumb-open")?b.$outer.removeClass("lg-thumb-open"):b.destroy())})},b.prototype.arrow=function(){var a=this;this.$outer.find(".lg-prev").on("click.lg",function(){a.goToPrevSlide()}),this.$outer.find(".lg-next").on("click.lg",function(){a.goToNextSlide()})},b.prototype.arrowDisable=function(a){!this.s.loop&&this.s.hideControlOnEnd&&(a+1<this.$slide.length?this.$outer.find(".lg-next").removeAttr("disabled").removeClass("disabled"):this.$outer.find(".lg-next").attr("disabled","disabled").addClass("disabled"),a>0?this.$outer.find(".lg-prev").removeAttr("disabled").removeClass("disabled"):this.$outer.find(".lg-prev").attr("disabled","disabled").addClass("disabled"))},b.prototype.setTranslate=function(a,b,c){this.s.useLeft?a.css("left",b):a.css({transform:"translate3d("+b+"px, "+c+"px, 0px)"})},b.prototype.touchMove=function(b,c){var d=c-b;Math.abs(d)>15&&(this.$outer.addClass("lg-dragging"),this.setTranslate(this.$slide.eq(this.index),d,0),this.setTranslate(a(".lg-prev-slide"),-this.$slide.eq(this.index).width()+d,0),this.setTranslate(a(".lg-next-slide"),this.$slide.eq(this.index).width()+d,0))},b.prototype.touchEnd=function(a){var b=this;"lg-slide"!==b.s.mode&&b.$outer.addClass("lg-slide"),this.$slide.not(".lg-current, .lg-prev-slide, .lg-next-slide").css("opacity","0"),setTimeout(function(){b.$outer.removeClass("lg-dragging"),a<0&&Math.abs(a)>b.s.swipeThreshold?b.goToNextSlide(!0):a>0&&Math.abs(a)>b.s.swipeThreshold?b.goToPrevSlide(!0):Math.abs(a)<5&&b.$el.trigger("onSlideClick.lg"),b.$slide.removeAttr("style")}),setTimeout(function(){b.$outer.hasClass("lg-dragging")||"lg-slide"===b.s.mode||b.$outer.removeClass("lg-slide")},b.s.speed+100)},b.prototype.enableSwipe=function(){var a=this,b=0,c=0,d=!1;a.s.enableSwipe&&a.doCss()&&(a.$slide.on("touchstart.lg",function(c){a.$outer.hasClass("lg-zoomed")||a.lgBusy||(c.preventDefault(),a.manageSwipeClass(),b=c.originalEvent.targetTouches[0].pageX)}),a.$slide.on("touchmove.lg",function(e){a.$outer.hasClass("lg-zoomed")||(e.preventDefault(),c=e.originalEvent.targetTouches[0].pageX,a.touchMove(b,c),d=!0)}),a.$slide.on("touchend.lg",function(){a.$outer.hasClass("lg-zoomed")||(d?(d=!1,a.touchEnd(c-b)):a.$el.trigger("onSlideClick.lg"))}))},b.prototype.enableDrag=function(){var b=this,c=0,d=0,e=!1,f=!1;b.s.enableDrag&&b.doCss()&&(b.$slide.on("mousedown.lg",function(d){b.$outer.hasClass("lg-zoomed")||b.lgBusy||a(d.target).text().trim()||(d.preventDefault(),b.manageSwipeClass(),c=d.pageX,e=!0,b.$outer.scrollLeft+=1,b.$outer.scrollLeft-=1,b.$outer.removeClass("lg-grab").addClass("lg-grabbing"),b.$el.trigger("onDragstart.lg"))}),a(window).on("mousemove.lg",function(a){e&&(f=!0,d=a.pageX,b.touchMove(c,d),b.$el.trigger("onDragmove.lg"))}),a(window).on("mouseup.lg",function(g){f?(f=!1,b.touchEnd(d-c),b.$el.trigger("onDragend.lg")):(a(g.target).hasClass("lg-object")||a(g.target).hasClass("lg-video-play"))&&b.$el.trigger("onSlideClick.lg"),e&&(e=!1,b.$outer.removeClass("lg-grabbing").addClass("lg-grab"))}))},b.prototype.manageSwipeClass=function(){var a=this.index+1,b=this.index-1;this.s.loop&&this.$slide.length>2&&(0===this.index?b=this.$slide.length-1:this.index===this.$slide.length-1&&(a=0)),this.$slide.removeClass("lg-next-slide lg-prev-slide"),b>-1&&this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(a).addClass("lg-next-slide")},b.prototype.mousewheel=function(){var a=this;a.$outer.on("mousewheel.lg",function(b){b.deltaY&&(b.deltaY>0?a.goToPrevSlide():a.goToNextSlide(),b.preventDefault())})},b.prototype.closeGallery=function(){var b=this,c=!1;this.$outer.find(".lg-close").on("click.lg",function(){b.destroy()}),b.s.closable&&(b.$outer.on("mousedown.lg",function(b){c=!!(a(b.target).is(".lg-outer")||a(b.target).is(".lg-item ")||a(b.target).is(".lg-img-wrap"))}),b.$outer.on("mousemove.lg",function(){c=!1}),b.$outer.on("mouseup.lg",function(d){(a(d.target).is(".lg-outer")||a(d.target).is(".lg-item ")||a(d.target).is(".lg-img-wrap")&&c)&&(b.$outer.hasClass("lg-dragging")||b.destroy())}))},b.prototype.destroy=function(b){var c=this;b||(c.$el.trigger("onBeforeClose.lg"),a(window).scrollTop(c.prevScrollTop)),b&&(c.s.dynamic||this.$items.off("click.lg click.lgcustom"),a.removeData(c.el,"lightGallery")),this.$el.off(".lg.tm"),a.each(a.fn.lightGallery.modules,function(a){c.modules[a]&&c.modules[a].destroy()}),this.lGalleryOn=!1,clearTimeout(c.hideBartimeout),this.hideBartimeout=!1,a(window).off(".lg"),a("body").removeClass("lg-on lg-from-hash"),c.$outer&&c.$outer.removeClass("lg-visible"),a(".lg-backdrop").removeClass("in"),setTimeout(function(){c.$outer&&c.$outer.remove(),a(".lg-backdrop").remove(),b||c.$el.trigger("onCloseAfter.lg")},c.s.backdropDuration+50)},a.fn.lightGallery=function(c){return this.each(function(){if(a.data(this,"lightGallery"))try{a(this).data("lightGallery").init()}catch(a){console.error("lightGallery has not initiated properly")}else a.data(this,"lightGallery",new b(this,c))})},a.fn.lightGallery.modules={}}()}),function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(0,function(a){!function(){"use strict";var b={autoplay:!1,pause:5e3,progressBar:!0,fourceAutoplay:!1,autoplayControls:!0,appendAutoplayControlsTo:".lg-toolbar"},c=function(c){return this.core=a(c).data("lightGallery"),this.$el=a(c),!(this.core.$items.length<2)&&(this.core.s=a.extend({},b,this.core.s),this.interval=!1,this.fromAuto=!0,this.canceledOnTouch=!1,this.fourceAutoplayTemp=this.core.s.fourceAutoplay,this.core.doCss()||(this.core.s.progressBar=!1),this.init(),this)};c.prototype.init=function(){var a=this;a.core.s.autoplayControls&&a.controls(),a.core.s.progressBar&&a.core.$outer.find(".lg").append('<div class="lg-progress-bar"><div class="lg-progress"></div></div>'),a.progress(),a.core.s.autoplay&&a.$el.one("onSlideItemLoad.lg.tm",function(){a.startlAuto()}),a.$el.on("onDragstart.lg.tm touchstart.lg.tm",function(){a.interval&&(a.cancelAuto(),a.canceledOnTouch=!0)}),a.$el.on("onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm",function(){!a.interval&&a.canceledOnTouch&&(a.startlAuto(),a.canceledOnTouch=!1)})},c.prototype.progress=function(){var a,b,c=this;c.$el.on("onBeforeSlide.lg.tm",function(){c.core.s.progressBar&&c.fromAuto&&(a=c.core.$outer.find(".lg-progress-bar"),b=c.core.$outer.find(".lg-progress"),c.interval&&(b.removeAttr("style"),a.removeClass("lg-start"),setTimeout(function(){b.css("transition","width "+(c.core.s.speed+c.core.s.pause)+"ms ease 0s"),a.addClass("lg-start")},20))),c.fromAuto||c.core.s.fourceAutoplay||c.cancelAuto(),c.fromAuto=!1})},c.prototype.controls=function(){var b=this;a(this.core.s.appendAutoplayControlsTo).append('<span class="lg-autoplay-button lg-icon"></span>'),b.core.$outer.find(".lg-autoplay-button").on("click.lg",function(){a(b.core.$outer).hasClass("lg-show-autoplay")?(b.cancelAuto(),b.core.s.fourceAutoplay=!1):b.interval||(b.startlAuto(),b.core.s.fourceAutoplay=b.fourceAutoplayTemp)})},c.prototype.startlAuto=function(){var a=this;a.core.$outer.find(".lg-progress").css("transition","width "+(a.core.s.speed+a.core.s.pause)+"ms ease 0s"),a.core.$outer.addClass("lg-show-autoplay"),a.core.$outer.find(".lg-progress-bar").addClass("lg-start"),a.interval=setInterval(function(){a.core.index+1<a.core.$items.length?a.core.index++:a.core.index=0,a.fromAuto=!0,a.core.slide(a.core.index,!1,!1,"next")},a.core.s.speed+a.core.s.pause)},c.prototype.cancelAuto=function(){clearInterval(this.interval),this.interval=!1,this.core.$outer.find(".lg-progress").removeAttr("style"),this.core.$outer.removeClass("lg-show-autoplay"),this.core.$outer.find(".lg-progress-bar").removeClass("lg-start")},c.prototype.destroy=function(){this.cancelAuto(),this.core.$outer.find(".lg-progress-bar").remove()},a.fn.lightGallery.modules.autoplay=c}()}),function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(0,function(a){!function(){"use strict";var b={fullScreen:!0},c=function(c){return this.core=a(c).data("lightGallery"),this.$el=a(c),this.core.s=a.extend({},b,this.core.s),this.init(),this};c.prototype.init=function(){var a="";if(this.core.s.fullScreen){if(!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled))return;a='<span class="lg-fullscreen lg-icon"></span>',this.core.$outer.find(".lg-toolbar").append(a),this.fullScreen()}},c.prototype.requestFullscreen=function(){var a=document.documentElement;a.requestFullscreen?a.requestFullscreen():a.msRequestFullscreen?a.msRequestFullscreen():a.mozRequestFullScreen?a.mozRequestFullScreen():a.webkitRequestFullscreen&&a.webkitRequestFullscreen()},c.prototype.exitFullscreen=function(){document.exitFullscreen?document.exitFullscreen():document.msExitFullscreen?document.msExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen()},c.prototype.fullScreen=function(){var b=this;a(document).on("fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg",function(){b.core.$outer.toggleClass("lg-fullscreen-on")}),this.core.$outer.find(".lg-fullscreen").on("click.lg",function(){document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?b.exitFullscreen():b.requestFullscreen()})},c.prototype.destroy=function(){this.exitFullscreen(),a(document).off("fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg")},a.fn.lightGallery.modules.fullscreen=c}()}),function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(0,function(a){!function(){"use strict";var b={pager:!1},c=function(c){return this.core=a(c).data("lightGallery"),this.$el=a(c),this.core.s=a.extend({},b,this.core.s),this.core.s.pager&&this.core.$items.length>1&&this.init(),this};c.prototype.init=function(){var b,c,d,e=this,f="";if(e.core.$outer.find(".lg").append('<div class="lg-pager-outer"></div>'),e.core.s.dynamic)for(var g=0;g<e.core.s.dynamicEl.length;g++)f+='<span class="lg-pager-cont"> <span class="lg-pager"></span><div class="lg-pager-thumb-cont"><span class="lg-caret"></span> <img src="'+e.core.s.dynamicEl[g].thumb+'" /></div></span>';else e.core.$items.each(function(){e.core.s.exThumbImage?f+='<span class="lg-pager-cont"> <span class="lg-pager"></span><div class="lg-pager-thumb-cont"><span class="lg-caret"></span> <img src="'+a(this).attr(e.core.s.exThumbImage)+'" /></div></span>':f+='<span class="lg-pager-cont"> <span class="lg-pager"></span><div class="lg-pager-thumb-cont"><span class="lg-caret"></span> <img src="'+a(this).find("img").attr("src")+'" /></div></span>'});c=e.core.$outer.find(".lg-pager-outer"),c.html(f),b=e.core.$outer.find(".lg-pager-cont"),b.on("click.lg touchend.lg",function(){var b=a(this);e.core.index=b.index(),e.core.slide(e.core.index,!1,!0,!1)}),c.on("mouseover.lg",function(){clearTimeout(d),c.addClass("lg-pager-hover")}),c.on("mouseout.lg",function(){d=setTimeout(function(){c.removeClass("lg-pager-hover")})}),e.core.$el.on("onBeforeSlide.lg.tm",function(a,c,d){b.removeClass("lg-pager-active"),b.eq(d).addClass("lg-pager-active")})},c.prototype.destroy=function(){},a.fn.lightGallery.modules.pager=c}()}),function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(0,function(a){!function(){"use strict";var b={thumbnail:!0,animateThumb:!0,currentPagerPosition:"middle",thumbWidth:100,thumbHeight:"80px",thumbContHeight:100,thumbMargin:5,exThumbImage:!1,showThumbByDefault:!0,toogleThumb:!0,pullCaptionUp:!0,enableThumbDrag:!0,enableThumbSwipe:!0,swipeThreshold:50,loadYoutubeThumbnail:!0,youtubeThumbSize:1,loadVimeoThumbnail:!0,vimeoThumbSize:"thumbnail_small",loadDailymotionThumbnail:!0},c=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},b,this.core.s),this.$el=a(c),this.$thumbOuter=null,this.thumbOuterWidth=0,this.thumbTotalWidth=this.core.$items.length*(this.core.s.thumbWidth+this.core.s.thumbMargin),this.thumbIndex=this.core.index,this.core.s.animateThumb&&(this.core.s.thumbHeight="100%"),this.left=0,this.init(),this};c.prototype.init=function(){var a=this;this.core.s.thumbnail&&this.core.$items.length>1&&(this.core.s.showThumbByDefault&&setTimeout(function(){a.core.$outer.addClass("lg-thumb-open")},700),this.core.s.pullCaptionUp&&this.core.$outer.addClass("lg-pull-caption-up"),this.build(),this.core.s.animateThumb&&this.core.doCss()?(this.core.s.enableThumbDrag&&this.enableThumbDrag(),this.core.s.enableThumbSwipe&&this.enableThumbSwipe(),this.thumbClickable=!1):this.thumbClickable=!0,this.toogle(),this.thumbkeyPress())},c.prototype.build=function(){function b(a,b,c){var g,h=d.core.isVideo(a,c)||{},i="";h.youtube||h.vimeo||h.dailymotion?h.youtube?g=d.core.s.loadYoutubeThumbnail?"//img.youtube.com/vi/"+h.youtube[1]+"/"+d.core.s.youtubeThumbSize+".jpg":b:h.vimeo?d.core.s.loadVimeoThumbnail?(g="//i.vimeocdn.com/video/error_"+f+".jpg",i=h.vimeo[1]):g=b:h.dailymotion&&(g=d.core.s.loadDailymotionThumbnail?"//www.dailymotion.com/thumbnail/video/"+h.dailymotion[1]:b):g=b,e+='<div data-vimeo-id="'+i+'" class="lg-thumb-item" style="width:'+d.core.s.thumbWidth+"px; height: "+d.core.s.thumbHeight+"; margin-right: "+d.core.s.thumbMargin+'px"><img src="'+g+'" /></div>',i=""}var c,d=this,e="",f="",g='<div class="lg-thumb-outer"><div class="lg-thumb lg-group"></div></div>';switch(this.core.s.vimeoThumbSize){case"thumbnail_large":f="640";break;case"thumbnail_medium":f="200x150";break;case"thumbnail_small":f="100x75"}if(d.core.$outer.addClass("lg-has-thumb"),d.core.$outer.find(".lg").append(g),d.$thumbOuter=d.core.$outer.find(".lg-thumb-outer"),d.thumbOuterWidth=d.$thumbOuter.width(),d.core.s.animateThumb&&d.core.$outer.find(".lg-thumb").css({width:d.thumbTotalWidth+"px",position:"relative"}),this.core.s.animateThumb&&d.$thumbOuter.css("height",d.core.s.thumbContHeight+"px"),d.core.s.dynamic)for(var h=0;h<d.core.s.dynamicEl.length;h++)b(d.core.s.dynamicEl[h].src,d.core.s.dynamicEl[h].thumb,h);else d.core.$items.each(function(c){d.core.s.exThumbImage?b(a(this).attr("href")||a(this).attr("data-src"),a(this).attr(d.core.s.exThumbImage),c):b(a(this).attr("href")||a(this).attr("data-src"),a(this).find("img").attr("src"),c)});d.core.$outer.find(".lg-thumb").html(e),c=d.core.$outer.find(".lg-thumb-item"),c.each(function(){var b=a(this),c=b.attr("data-vimeo-id");c&&a.getJSON("//www.vimeo.com/api/v2/video/"+c+".json?callback=?",{format:"json"},function(a){b.find("img").attr("src",a[0][d.core.s.vimeoThumbSize])})}),c.eq(d.core.index).addClass("active"),d.core.$el.on("onBeforeSlide.lg.tm",function(){c.removeClass("active"),c.eq(d.core.index).addClass("active")}),c.on("click.lg touchend.lg",function(){var b=a(this);setTimeout(function(){(d.thumbClickable&&!d.core.lgBusy||!d.core.doCss())&&(d.core.index=b.index(),d.core.slide(d.core.index,!1,!0,!1))},50)}),d.core.$el.on("onBeforeSlide.lg.tm",function(){d.animateThumb(d.core.index)}),a(window).on("resize.lg.thumb orientationchange.lg.thumb",function(){setTimeout(function(){d.animateThumb(d.core.index),d.thumbOuterWidth=d.$thumbOuter.width()},200)})},c.prototype.setTranslate=function(a){this.core.$outer.find(".lg-thumb").css({transform:"translate3d(-"+a+"px, 0px, 0px)"})},c.prototype.animateThumb=function(a){var b=this.core.$outer.find(".lg-thumb");if(this.core.s.animateThumb){var c;switch(this.core.s.currentPagerPosition){case"left":c=0;break;case"middle":c=this.thumbOuterWidth/2-this.core.s.thumbWidth/2;break;case"right":c=this.thumbOuterWidth-this.core.s.thumbWidth}this.left=(this.core.s.thumbWidth+this.core.s.thumbMargin)*a-1-c,this.left>this.thumbTotalWidth-this.thumbOuterWidth&&(this.left=this.thumbTotalWidth-this.thumbOuterWidth),this.left<0&&(this.left=0),this.core.lGalleryOn?(b.hasClass("on")||this.core.$outer.find(".lg-thumb").css("transition-duration",this.core.s.speed+"ms"),this.core.doCss()||b.animate({left:-this.left+"px"},this.core.s.speed)):this.core.doCss()||b.css("left",-this.left+"px"),this.setTranslate(this.left)}},c.prototype.enableThumbDrag=function(){var b=this,c=0,d=0,e=!1,f=!1,g=0;b.$thumbOuter.addClass("lg-grab"),b.core.$outer.find(".lg-thumb").on("mousedown.lg.thumb",function(a){b.thumbTotalWidth>b.thumbOuterWidth&&(a.preventDefault(),c=a.pageX,e=!0,b.core.$outer.scrollLeft+=1,b.core.$outer.scrollLeft-=1,b.thumbClickable=!1,b.$thumbOuter.removeClass("lg-grab").addClass("lg-grabbing"))}),a(window).on("mousemove.lg.thumb",function(a){e&&(g=b.left,f=!0,d=a.pageX,b.$thumbOuter.addClass("lg-dragging"),g-=d-c,g>b.thumbTotalWidth-b.thumbOuterWidth&&(g=b.thumbTotalWidth-b.thumbOuterWidth),g<0&&(g=0),b.setTranslate(g))}),a(window).on("mouseup.lg.thumb",function(){f?(f=!1,b.$thumbOuter.removeClass("lg-dragging"),b.left=g,Math.abs(d-c)<b.core.s.swipeThreshold&&(b.thumbClickable=!0)):b.thumbClickable=!0,e&&(e=!1,b.$thumbOuter.removeClass("lg-grabbing").addClass("lg-grab"))})},c.prototype.enableThumbSwipe=function(){var a=this,b=0,c=0,d=!1,e=0;a.core.$outer.find(".lg-thumb").on("touchstart.lg",function(c){a.thumbTotalWidth>a.thumbOuterWidth&&(c.preventDefault(),b=c.originalEvent.targetTouches[0].pageX,a.thumbClickable=!1)}),a.core.$outer.find(".lg-thumb").on("touchmove.lg",function(f){a.thumbTotalWidth>a.thumbOuterWidth&&(f.preventDefault(),c=f.originalEvent.targetTouches[0].pageX,d=!0,a.$thumbOuter.addClass("lg-dragging"),e=a.left,e-=c-b,e>a.thumbTotalWidth-a.thumbOuterWidth&&(e=a.thumbTotalWidth-a.thumbOuterWidth),e<0&&(e=0),a.setTranslate(e))}),a.core.$outer.find(".lg-thumb").on("touchend.lg",function(){a.thumbTotalWidth>a.thumbOuterWidth&&d?(d=!1,a.$thumbOuter.removeClass("lg-dragging"),Math.abs(c-b)<a.core.s.swipeThreshold&&(a.thumbClickable=!0),a.left=e):a.thumbClickable=!0})},c.prototype.toogle=function(){var a=this;a.core.s.toogleThumb&&(a.core.$outer.addClass("lg-can-toggle"),a.$thumbOuter.append('<span class="lg-toogle-thumb lg-icon"></span>'),a.core.$outer.find(".lg-toogle-thumb").on("click.lg",function(){a.core.$outer.toggleClass("lg-thumb-open")}))},c.prototype.thumbkeyPress=function(){var b=this;a(window).on("keydown.lg.thumb",function(a){38===a.keyCode?(a.preventDefault(),b.core.$outer.addClass("lg-thumb-open")):40===a.keyCode&&(a.preventDefault(),b.core.$outer.removeClass("lg-thumb-open"))})},c.prototype.destroy=function(){this.core.s.thumbnail&&this.core.$items.length>1&&(a(window).off("resize.lg.thumb orientationchange.lg.thumb keydown.lg.thumb"),
this.$thumbOuter.remove(),this.core.$outer.removeClass("lg-has-thumb"))},a.fn.lightGallery.modules.Thumbnail=c}()}),function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(){"use strict";function b(a,b,c,d){var e=this;if(e.core.$slide.eq(b).find(".lg-video").append(e.loadVideo(c,"lg-object",!0,b,d)),d)if(e.core.s.videojs)try{videojs(e.core.$slide.eq(b).find(".lg-html5").get(0),e.core.s.videojsOptions,function(){!e.videoLoaded&&e.core.s.autoplayFirstVideo&&this.play()})}catch(a){console.error("Make sure you have included videojs")}else!e.videoLoaded&&e.core.s.autoplayFirstVideo&&e.core.$slide.eq(b).find(".lg-html5").get(0).play()}function c(a,b){var c=this.core.$slide.eq(b).find(".lg-video-cont");c.hasClass("lg-has-iframe")||(c.css("max-width",this.core.s.videoMaxWidth),this.videoLoaded=!0)}function d(b,c,d){var e=this,f=e.core.$slide.eq(c),g=f.find(".lg-youtube").get(0),h=f.find(".lg-vimeo").get(0),i=f.find(".lg-dailymotion").get(0),j=f.find(".lg-vk").get(0),k=f.find(".lg-html5").get(0);if(g)g.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*");else if(h)try{$f(h).api("pause")}catch(a){console.error("Make sure you have included froogaloop2 js")}else if(i)i.contentWindow.postMessage("pause","*");else if(k)if(e.core.s.videojs)try{videojs(k).pause()}catch(a){console.error("Make sure you have included videojs")}else k.pause();j&&a(j).attr("src",a(j).attr("src").replace("&autoplay","&noplay"));var l;l=e.core.s.dynamic?e.core.s.dynamicEl[d].src:e.core.$items.eq(d).attr("href")||e.core.$items.eq(d).attr("data-src");var m=e.core.isVideo(l,d)||{};(m.youtube||m.vimeo||m.dailymotion||m.vk)&&e.core.$outer.addClass("lg-hide-download")}var e={videoMaxWidth:"855px",autoplayFirstVideo:!0,youtubePlayerParams:!1,vimeoPlayerParams:!1,dailymotionPlayerParams:!1,vkPlayerParams:!1,videojs:!1,videojsOptions:{}},f=function(b){return this.core=a(b).data("lightGallery"),this.$el=a(b),this.core.s=a.extend({},e,this.core.s),this.videoLoaded=!1,this.init(),this};f.prototype.init=function(){var e=this;e.core.$el.on("hasVideo.lg.tm",b.bind(this)),e.core.$el.on("onAferAppendSlide.lg.tm",c.bind(this)),e.core.doCss()&&e.core.$items.length>1&&(e.core.s.enableSwipe||e.core.s.enableDrag)?e.core.$el.on("onSlideClick.lg.tm",function(){var a=e.core.$slide.eq(e.core.index);e.loadVideoOnclick(a)}):e.core.$slide.on("click.lg",function(){e.loadVideoOnclick(a(this))}),e.core.$el.on("onBeforeSlide.lg.tm",d.bind(this)),e.core.$el.on("onAfterSlide.lg.tm",function(a,b){e.core.$slide.eq(b).removeClass("lg-video-playing")}),e.core.s.autoplayFirstVideo&&e.core.$el.on("onAferAppendSlide.lg.tm",function(a,b){if(!e.core.lGalleryOn){var c=e.core.$slide.eq(b);setTimeout(function(){e.loadVideoOnclick(c)},100)}})},f.prototype.loadVideo=function(b,c,d,e,f){var g="",h=1,i="",j=this.core.isVideo(b,e)||{};if(d&&(h=this.videoLoaded?0:this.core.s.autoplayFirstVideo?1:0),j.youtube)i="?wmode=opaque&autoplay="+h+"&enablejsapi=1",this.core.s.youtubePlayerParams&&(i=i+"&"+a.param(this.core.s.youtubePlayerParams)),g='<iframe class="lg-video-object lg-youtube '+c+'" width="560" height="315" src="//www.youtube.com/embed/'+j.youtube[1]+i+'" frameborder="0" allowfullscreen></iframe>';else if(j.vimeo)i="?autoplay="+h+"&api=1",this.core.s.vimeoPlayerParams&&(i=i+"&"+a.param(this.core.s.vimeoPlayerParams)),g='<iframe class="lg-video-object lg-vimeo '+c+'" width="560" height="315"  src="//player.vimeo.com/video/'+j.vimeo[1]+i+'" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>';else if(j.dailymotion)i="?wmode=opaque&autoplay="+h+"&api=postMessage",this.core.s.dailymotionPlayerParams&&(i=i+"&"+a.param(this.core.s.dailymotionPlayerParams)),g='<iframe class="lg-video-object lg-dailymotion '+c+'" width="560" height="315" src="//www.dailymotion.com/embed/video/'+j.dailymotion[1]+i+'" frameborder="0" allowfullscreen></iframe>';else if(j.html5){var k=f.substring(0,1);"."!==k&&"#"!==k||(f=a(f).html()),g=f}else j.vk&&(i="&autoplay="+h,this.core.s.vkPlayerParams&&(i=i+"&"+a.param(this.core.s.vkPlayerParams)),g='<iframe class="lg-video-object lg-vk '+c+'" width="560" height="315" src="//vk.com/video_ext.php?'+j.vk[1]+i+'" frameborder="0" allowfullscreen></iframe>');return g},f.prototype.loadVideoOnclick=function(a){var b=this;if(a.find(".lg-object").hasClass("lg-has-poster")&&a.find(".lg-object").is(":visible"))if(a.hasClass("lg-has-video")){var c=a.find(".lg-youtube").get(0),d=a.find(".lg-vimeo").get(0),e=a.find(".lg-dailymotion").get(0),f=a.find(".lg-html5").get(0);if(c)c.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*");else if(d)try{$f(d).api("play")}catch(a){console.error("Make sure you have included froogaloop2 js")}else if(e)e.contentWindow.postMessage("play","*");else if(f)if(b.core.s.videojs)try{videojs(f).play()}catch(a){console.error("Make sure you have included videojs")}else f.play();a.addClass("lg-video-playing")}else{a.addClass("lg-video-playing lg-has-video");var g,h,i=function(c,d){if(a.find(".lg-video").append(b.loadVideo(c,"",!1,b.core.index,d)),d)if(b.core.s.videojs)try{videojs(b.core.$slide.eq(b.core.index).find(".lg-html5").get(0),b.core.s.videojsOptions,function(){this.play()})}catch(a){console.error("Make sure you have included videojs")}else b.core.$slide.eq(b.core.index).find(".lg-html5").get(0).play()};b.core.s.dynamic?(g=b.core.s.dynamicEl[b.core.index].src,h=b.core.s.dynamicEl[b.core.index].html,i(g,h)):(g=b.core.$items.eq(b.core.index).attr("href")||b.core.$items.eq(b.core.index).attr("data-src"),h=b.core.$items.eq(b.core.index).attr("data-html"),i(g,h));var j=a.find(".lg-object");a.find(".lg-video").append(j),a.find(".lg-video-object").hasClass("lg-html5")||(a.removeClass("lg-complete"),a.find(".lg-video-object").on("load.lg error.lg",function(){a.addClass("lg-complete")}))}},f.prototype.destroy=function(){this.videoLoaded=!1},a.fn.lightGallery.modules.video=f}()}),function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(0,function(a){!function(){"use strict";var b=function(){var a=!1,b=navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);return b&&parseInt(b[2],10)<54&&(a=!0),a},c={scale:1,zoom:!0,actualSize:!0,enableZoomAfter:300,useLeftForZoom:b()},d=function(b){return this.core=a(b).data("lightGallery"),this.core.s=a.extend({},c,this.core.s),this.core.s.zoom&&this.core.doCss()&&(this.init(),this.zoomabletimeout=!1,this.pageX=a(window).width()/2,this.pageY=a(window).height()/2+a(window).scrollTop()),this};d.prototype.init=function(){var b=this,c='<span id="lg-zoom-in" class="lg-icon"></span><span id="lg-zoom-out" class="lg-icon"></span>';b.core.s.actualSize&&(c+='<span id="lg-actual-size" class="lg-icon"></span>'),b.core.s.useLeftForZoom?b.core.$outer.addClass("lg-use-left-for-zoom"):b.core.$outer.addClass("lg-use-transition-for-zoom"),this.core.$outer.find(".lg-toolbar").append(c),b.core.$el.on("onSlideItemLoad.lg.tm.zoom",function(c,d,e){var f=b.core.s.enableZoomAfter+e;a("body").hasClass("lg-from-hash")&&e?f=0:a("body").removeClass("lg-from-hash"),b.zoomabletimeout=setTimeout(function(){b.core.$slide.eq(d).addClass("lg-zoomable")},f+30)});var d=1,e=function(c){var d,e,f=b.core.$outer.find(".lg-current .lg-image"),g=(a(window).width()-f.prop("offsetWidth"))/2,h=(a(window).height()-f.prop("offsetHeight"))/2+a(window).scrollTop();d=b.pageX-g,e=b.pageY-h;var i=(c-1)*d,j=(c-1)*e;f.css("transform","scale3d("+c+", "+c+", 1)").attr("data-scale",c),b.core.s.useLeftForZoom?f.parent().css({left:-i+"px",top:-j+"px"}).attr("data-x",i).attr("data-y",j):f.parent().css("transform","translate3d(-"+i+"px, -"+j+"px, 0)").attr("data-x",i).attr("data-y",j)},f=function(){d>1?b.core.$outer.addClass("lg-zoomed"):b.resetZoom(),d<1&&(d=1),e(d)},g=function(c,e,g,h){var i,j=e.prop("offsetWidth");i=b.core.s.dynamic?b.core.s.dynamicEl[g].width||e[0].naturalWidth||j:b.core.$items.eq(g).attr("data-width")||e[0].naturalWidth||j;var k;b.core.$outer.hasClass("lg-zoomed")?d=1:i>j&&(k=i/j,d=k||2),h?(b.pageX=a(window).width()/2,b.pageY=a(window).height()/2+a(window).scrollTop()):(b.pageX=c.pageX||c.originalEvent.targetTouches[0].pageX,b.pageY=c.pageY||c.originalEvent.targetTouches[0].pageY),f(),setTimeout(function(){b.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")},10)},h=!1;b.core.$el.on("onAferAppendSlide.lg.tm.zoom",function(a,c){var d=b.core.$slide.eq(c).find(".lg-image");d.on("dblclick",function(a){g(a,d,c)}),d.on("touchstart",function(a){h?(clearTimeout(h),h=null,g(a,d,c)):h=setTimeout(function(){h=null},300),a.preventDefault()})}),a(window).on("resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom",function(){b.pageX=a(window).width()/2,b.pageY=a(window).height()/2+a(window).scrollTop(),e(d)}),a("#lg-zoom-out").on("click.lg",function(){b.core.$outer.find(".lg-current .lg-image").length&&(d-=b.core.s.scale,f())}),a("#lg-zoom-in").on("click.lg",function(){b.core.$outer.find(".lg-current .lg-image").length&&(d+=b.core.s.scale,f())}),a("#lg-actual-size").on("click.lg",function(a){g(a,b.core.$slide.eq(b.core.index).find(".lg-image"),b.core.index,!0)}),b.core.$el.on("onBeforeSlide.lg.tm",function(){d=1,b.resetZoom()}),b.zoomDrag(),b.zoomSwipe()},d.prototype.resetZoom=function(){this.core.$outer.removeClass("lg-zoomed"),this.core.$slide.find(".lg-img-wrap").removeAttr("style data-x data-y"),this.core.$slide.find(".lg-image").removeAttr("style data-scale"),this.pageX=a(window).width()/2,this.pageY=a(window).height()/2+a(window).scrollTop()},d.prototype.zoomSwipe=function(){var a=this,b={},c={},d=!1,e=!1,f=!1;a.core.$slide.on("touchstart.lg",function(c){if(a.core.$outer.hasClass("lg-zoomed")){var d=a.core.$slide.eq(a.core.index).find(".lg-object");f=d.prop("offsetHeight")*d.attr("data-scale")>a.core.$outer.find(".lg").height(),e=d.prop("offsetWidth")*d.attr("data-scale")>a.core.$outer.find(".lg").width(),(e||f)&&(c.preventDefault(),b={x:c.originalEvent.targetTouches[0].pageX,y:c.originalEvent.targetTouches[0].pageY})}}),a.core.$slide.on("touchmove.lg",function(g){if(a.core.$outer.hasClass("lg-zoomed")){var h,i,j=a.core.$slide.eq(a.core.index).find(".lg-img-wrap");g.preventDefault(),d=!0,c={x:g.originalEvent.targetTouches[0].pageX,y:g.originalEvent.targetTouches[0].pageY},a.core.$outer.addClass("lg-zoom-dragging"),i=f?-Math.abs(j.attr("data-y"))+(c.y-b.y):-Math.abs(j.attr("data-y")),h=e?-Math.abs(j.attr("data-x"))+(c.x-b.x):-Math.abs(j.attr("data-x")),(Math.abs(c.x-b.x)>15||Math.abs(c.y-b.y)>15)&&(a.core.s.useLeftForZoom?j.css({left:h+"px",top:i+"px"}):j.css("transform","translate3d("+h+"px, "+i+"px, 0)"))}}),a.core.$slide.on("touchend.lg",function(){a.core.$outer.hasClass("lg-zoomed")&&d&&(d=!1,a.core.$outer.removeClass("lg-zoom-dragging"),a.touchendZoom(b,c,e,f))})},d.prototype.zoomDrag=function(){var b=this,c={},d={},e=!1,f=!1,g=!1,h=!1;b.core.$slide.on("mousedown.lg.zoom",function(d){var f=b.core.$slide.eq(b.core.index).find(".lg-object");h=f.prop("offsetHeight")*f.attr("data-scale")>b.core.$outer.find(".lg").height(),g=f.prop("offsetWidth")*f.attr("data-scale")>b.core.$outer.find(".lg").width(),b.core.$outer.hasClass("lg-zoomed")&&a(d.target).hasClass("lg-object")&&(g||h)&&(d.preventDefault(),c={x:d.pageX,y:d.pageY},e=!0,b.core.$outer.scrollLeft+=1,b.core.$outer.scrollLeft-=1,b.core.$outer.removeClass("lg-grab").addClass("lg-grabbing"))}),a(window).on("mousemove.lg.zoom",function(a){if(e){var i,j,k=b.core.$slide.eq(b.core.index).find(".lg-img-wrap");f=!0,d={x:a.pageX,y:a.pageY},b.core.$outer.addClass("lg-zoom-dragging"),j=h?-Math.abs(k.attr("data-y"))+(d.y-c.y):-Math.abs(k.attr("data-y")),i=g?-Math.abs(k.attr("data-x"))+(d.x-c.x):-Math.abs(k.attr("data-x")),b.core.s.useLeftForZoom?k.css({left:i+"px",top:j+"px"}):k.css("transform","translate3d("+i+"px, "+j+"px, 0)")}}),a(window).on("mouseup.lg.zoom",function(a){e&&(e=!1,b.core.$outer.removeClass("lg-zoom-dragging"),!f||c.x===d.x&&c.y===d.y||(d={x:a.pageX,y:a.pageY},b.touchendZoom(c,d,g,h)),f=!1),b.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")})},d.prototype.touchendZoom=function(a,b,c,d){var e=this,f=e.core.$slide.eq(e.core.index).find(".lg-img-wrap"),g=e.core.$slide.eq(e.core.index).find(".lg-object"),h=-Math.abs(f.attr("data-x"))+(b.x-a.x),i=-Math.abs(f.attr("data-y"))+(b.y-a.y),j=(e.core.$outer.find(".lg").height()-g.prop("offsetHeight"))/2,k=Math.abs(g.prop("offsetHeight")*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").height()+j),l=(e.core.$outer.find(".lg").width()-g.prop("offsetWidth"))/2,m=Math.abs(g.prop("offsetWidth")*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").width()+l);(Math.abs(b.x-a.x)>15||Math.abs(b.y-a.y)>15)&&(d&&(i<=-k?i=-k:i>=-j&&(i=-j)),c&&(h<=-m?h=-m:h>=-l&&(h=-l)),d?f.attr("data-y",Math.abs(i)):i=-Math.abs(f.attr("data-y")),c?f.attr("data-x",Math.abs(h)):h=-Math.abs(f.attr("data-x")),e.core.s.useLeftForZoom?f.css({left:h+"px",top:i+"px"}):f.css("transform","translate3d("+h+"px, "+i+"px, 0)"))},d.prototype.destroy=function(){var b=this;b.core.$el.off(".lg.zoom"),a(window).off(".lg.zoom"),b.core.$slide.off(".lg.zoom"),b.core.$el.off(".lg.tm.zoom"),b.resetZoom(),clearTimeout(b.zoomabletimeout),b.zoomabletimeout=!1},a.fn.lightGallery.modules.zoom=d}()}),function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(0,function(a){!function(){"use strict";var b={hash:!0},c=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},b,this.core.s),this.core.s.hash&&(this.oldHash=window.location.hash,this.init()),this};c.prototype.init=function(){var b,c=this;c.core.$el.on("onAfterSlide.lg.tm",function(a,b,d){history.replaceState?history.replaceState(null,null,window.location.pathname+window.location.search+"#lg="+c.core.s.galleryId+"&slide="+d):window.location.hash="lg="+c.core.s.galleryId+"&slide="+d}),a(window).on("hashchange.lg.hash",function(){b=window.location.hash;var a=parseInt(b.split("&slide=")[1],10);b.indexOf("lg="+c.core.s.galleryId)>-1?c.core.slide(a,!1,!1):c.core.lGalleryOn&&c.core.destroy()})},c.prototype.destroy=function(){this.core.s.hash&&(this.oldHash&&this.oldHash.indexOf("lg="+this.core.s.galleryId)<0?history.replaceState?history.replaceState(null,null,this.oldHash):window.location.hash=this.oldHash:history.replaceState?history.replaceState(null,document.title,window.location.pathname+window.location.search):window.location.hash="",this.core.$el.off(".lg.hash"))},a.fn.lightGallery.modules.hash=c}()}),function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(0,function(a){!function(){"use strict";var b={share:!0,facebook:!0,facebookDropdownText:"Facebook",twitter:!0,twitterDropdownText:"Twitter",googlePlus:!0,googlePlusDropdownText:"GooglePlus",pinterest:!0,pinterestDropdownText:"Pinterest"},c=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},b,this.core.s),this.core.s.share&&this.init(),this};c.prototype.init=function(){var b=this,c='<span id="lg-share" class="lg-icon"><ul class="lg-dropdown" style="position: absolute;">';c+=b.core.s.facebook?'<li><a id="lg-share-facebook" target="_blank"><span class="lg-icon"></span><span class="lg-dropdown-text">'+this.core.s.facebookDropdownText+"</span></a></li>":"",c+=b.core.s.twitter?'<li><a id="lg-share-twitter" target="_blank"><span class="lg-icon"></span><span class="lg-dropdown-text">'+this.core.s.twitterDropdownText+"</span></a></li>":"",c+=b.core.s.googlePlus?'<li><a id="lg-share-googleplus" target="_blank"><span class="lg-icon"></span><span class="lg-dropdown-text">'+this.core.s.googlePlusDropdownText+"</span></a></li>":"",c+=b.core.s.pinterest?'<li><a id="lg-share-pinterest" target="_blank"><span class="lg-icon"></span><span class="lg-dropdown-text">'+this.core.s.pinterestDropdownText+"</span></a></li>":"",c+="</ul></span>",this.core.$outer.find(".lg-toolbar").append(c),this.core.$outer.find(".lg").append('<div id="lg-dropdown-overlay"></div>'),a("#lg-share").on("click.lg",function(){b.core.$outer.toggleClass("lg-dropdown-active")}),a("#lg-dropdown-overlay").on("click.lg",function(){b.core.$outer.removeClass("lg-dropdown-active")}),b.core.$el.on("onAfterSlide.lg.tm",function(c,d,e){setTimeout(function(){a("#lg-share-facebook").attr("href","https://www.facebook.com/sharer/sharer.php?u="+encodeURIComponent(b.getSahreProps(e,"facebookShareUrl")||window.location.href)),a("#lg-share-twitter").attr("href","https://twitter.com/intent/tweet?text="+b.getSahreProps(e,"tweetText")+"&url="+encodeURIComponent(b.getSahreProps(e,"twitterShareUrl")||window.location.href)),a("#lg-share-googleplus").attr("href","https://plus.google.com/share?url="+encodeURIComponent(b.getSahreProps(e,"googleplusShareUrl")||window.location.href)),a("#lg-share-pinterest").attr("href","http://www.pinterest.com/pin/create/button/?url="+encodeURIComponent(b.getSahreProps(e,"pinterestShareUrl")||window.location.href)+"&media="+encodeURIComponent(b.getSahreProps(e,"src"))+"&description="+b.getSahreProps(e,"pinterestText"))},100)})},c.prototype.getSahreProps=function(a,b){var c="";if(this.core.s.dynamic)c=this.core.s.dynamicEl[a][b];else{var d=this.core.$items.eq(a).attr("href"),e=this.core.$items.eq(a).data(b);c="src"===b?d||e:e}return c},c.prototype.destroy=function(){},a.fn.lightGallery.modules.share=c}()});
/* ------------------------------------------------------------------------
	Class: prettyPhoto
	Use: Lightbox clone for jQuery
	Author: Stephane Caron (http://www.no-margin-for-errors.com)
	Version: 3.1.6
------------------------------------------------------------------------- */
(function($) {
	$.prettyPhoto = {version: '3.1.6'};
	
	$.fn.prettyPhoto = function(pp_settings) {
		pp_settings = jQuery.extend({
			hook: 'rel', /* the attribute tag to use for prettyPhoto hooks. default: 'rel'. For HTML5, use "data-rel" or similar. */
			animation_speed: 'fast', /* fast/slow/normal */
			ajaxcallback: function() {},
			slideshow: 5000, /* false OR interval time in ms */
			autoplay_slideshow: false, /* true/false */
			opacity: 0.80, /* Value between 0 and 1 */
			show_title: true, /* true/false */
			allow_resize: true, /* Resize the photos bigger than viewport. true/false */
			allow_expand: true, /* Allow the user to expand a resized image. true/false */
			default_width: 500,
			default_height: 344,
			counter_separator_label: '/', /* The separator for the gallery counter 1 "of" 2 */
			theme: 'pp_default', /* light_rounded / dark_rounded / light_square / dark_square / facebook */
			horizontal_padding: 20, /* The padding on each side of the picture */
			hideflash: false, /* Hides all the flash object on a page, set to TRUE if flash appears over prettyPhoto */
			wmode: 'opaque', /* Set the flash wmode attribute */
			autoplay: true, /* Automatically start videos: True/False */
			modal: false, /* If set to true, only the close button will close the window */
			deeplinking: true, /* Allow prettyPhoto to update the url to enable deeplinking. */
			overlay_gallery: true, /* If set to true, a gallery will overlay the fullscreen image on mouse over */
			overlay_gallery_max: 30, /* Maximum number of pictures in the overlay gallery */
			keyboard_shortcuts: true, /* Set to false if you open forms inside prettyPhoto */
			changepicturecallback: function(){}, /* Called everytime an item is shown/changed */
			callback: function(){}, /* Called when prettyPhoto is closed */
			ie6_fallback: true,
			markup: '<div class="pp_pic_holder"> \
						<div class="ppt">&nbsp;</div> \
						<div class="pp_top"> \
							<div class="pp_left"></div> \
							<div class="pp_middle"></div> \
							<div class="pp_right"></div> \
						</div> \
						<div class="pp_content_container"> \
							<div class="pp_left"> \
							<div class="pp_right"> \
								<div class="pp_content"> \
									<div class="pp_loaderIcon"></div> \
									<div class="pp_fade"> \
										<a href="#" class="pp_expand" title="Expand the image">Expand</a> \
										<div class="pp_hoverContainer"> \
											<a class="pp_next" href="#">next</a> \
											<a class="pp_previous" href="#">previous</a> \
										</div> \
										<div id="pp_full_res"></div> \
										<div class="pp_details"> \
											<div class="pp_nav"> \
												<a href="#" class="pp_arrow_previous">Previous</a> \
												<p class="currentTextHolder">0/0</p> \
												<a href="#" class="pp_arrow_next">Next</a> \
											</div> \
											<p class="pp_description"></p> \
											<div class="pp_social">{pp_social}</div> \
											<a class="pp_close" href="#">Close</a> \
										</div> \
									</div> \
								</div> \
							</div> \
							</div> \
						</div> \
						<div class="pp_bottom"> \
							<div class="pp_left"></div> \
							<div class="pp_middle"></div> \
							<div class="pp_right"></div> \
						</div> \
					</div> \
					<div class="pp_overlay"></div>',
			gallery_markup: '<div class="pp_gallery"> \
								<a href="#" class="pp_arrow_previous">Previous</a> \
								<div> \
									<ul> \
										{gallery} \
									</ul> \
								</div> \
								<a href="#" class="pp_arrow_next">Next</a> \
							</div>',
			image_markup: '<img id="fullResImage" src="{path}" />',
			flash_markup: '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{width}" height="{height}"><param name="wmode" value="{wmode}" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{path}" /><embed src="{path}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="{width}" height="{height}" wmode="{wmode}"></embed></object>',
			quicktime_markup: '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="{height}" width="{width}"><param name="src" value="{path}"><param name="autoplay" value="{autoplay}"><param name="type" value="video/quicktime"><embed src="{path}" height="{height}" width="{width}" autoplay="{autoplay}" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"></embed></object>',
			iframe_markup: '<iframe src ="{path}" width="{width}" height="{height}" frameborder="no"></iframe>',
			inline_markup: '<div class="pp_inline">{content}</div>',
			custom_markup: '',
			social_tools: '<div class="twitter"><a href="http://twitter.com/share" class="twitter-share-button" data-count="none">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="facebook"><iframe src="//www.facebook.com/plugins/like.php?locale=en_US&href={location_href}&amp;layout=button_count&amp;show_faces=true&amp;width=500&amp;action=like&amp;font&amp;colorscheme=light&amp;height=23" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:23px;" allowTransparency="true"></iframe></div>' /* html or false to disable */
		}, pp_settings);
		
		// Global variables accessible only by prettyPhoto
		var matchedObjects = this, percentBased = false, pp_dimensions, pp_open,
		
		// prettyPhoto container specific
		pp_contentHeight, pp_contentWidth, pp_containerHeight, pp_containerWidth,
		
		// Window size
		windowHeight = $(window).height(), windowWidth = $(window).width(),

		// Global elements
		pp_slideshow;
		
		doresize = true, scroll_pos = _get_scroll();
	
		// Window/Keyboard events
		$(window).unbind('resize.prettyphoto').bind('resize.prettyphoto',function(){ _center_overlay(); _resize_overlay(); });
		
		if(pp_settings.keyboard_shortcuts) {
			$(document).unbind('keydown.prettyphoto').bind('keydown.prettyphoto',function(e){
				if(typeof $pp_pic_holder != 'undefined'){
					if($pp_pic_holder.is(':visible')){
						switch(e.keyCode){
							case 37:
								$.prettyPhoto.changePage('previous');
								e.preventDefault();
								break;
							case 39:
								$.prettyPhoto.changePage('next');
								e.preventDefault();
								break;
							case 27:
								if(!settings.modal)
								$.prettyPhoto.close();
								e.preventDefault();
								break;
						};
						// return false;
					};
				};
			});
		};
		
		/**
		* Initialize prettyPhoto.
		*/
		$.prettyPhoto.initialize = function() {
			
			settings = pp_settings;
			
			if(settings.theme == 'pp_default') settings.horizontal_padding = 16;
			
			// Find out if the picture is part of a set
			theRel = $(this).attr(settings.hook);
			galleryRegExp = /\[(?:.*)\]/;
			isSet = (galleryRegExp.exec(theRel)) ? true : false;
			
			// Put the SRCs, TITLEs, ALTs into an array.
			pp_images = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return $(n).attr('href'); }) : $.makeArray($(this).attr('href'));
			pp_titles = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return ($(n).find('img').attr('alt')) ? $(n).find('img').attr('alt') : ""; }) : $.makeArray($(this).find('img').attr('alt'));
			pp_descriptions = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return ($(n).attr('title')) ? $(n).attr('title') : ""; }) : $.makeArray($(this).attr('title'));
			
			if(pp_images.length > settings.overlay_gallery_max) settings.overlay_gallery = false;
			
			set_position = jQuery.inArray($(this).attr('href'), pp_images); // Define where in the array the clicked item is positionned
			rel_index = (isSet) ? set_position : $("a["+settings.hook+"^='"+theRel+"']").index($(this));
			
			_build_overlay(this); // Build the overlay {this} being the caller
			
			if(settings.allow_resize)
				$(window).bind('scroll.prettyphoto',function(){ _center_overlay(); });
			
			
			$.prettyPhoto.open();
			
			return false;
		}


		/**
		* Opens the prettyPhoto modal box.
		* @param image {String,Array} Full path to the image to be open, can also be an array containing full images paths.
		* @param title {String,Array} The title to be displayed with the picture, can also be an array containing all the titles.
		* @param description {String,Array} The description to be displayed with the picture, can also be an array containing all the descriptions.
		*/
		$.prettyPhoto.open = function(event) {
			if(typeof settings == "undefined"){ // Means it's an API call, need to manually get the settings and set the variables
				settings = pp_settings;
				pp_images = $.makeArray(arguments[0]);
				pp_titles = (arguments[1]) ? $.makeArray(arguments[1]) : $.makeArray("");
				pp_descriptions = (arguments[2]) ? $.makeArray(arguments[2]) : $.makeArray("");
				isSet = (pp_images.length > 1) ? true : false;
				set_position = (arguments[3])? arguments[3]: 0;
				_build_overlay(event.target); // Build the overlay {this} being the caller
			}
			
			if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','hidden'); // Hide the flash

			_checkPosition($(pp_images).size()); // Hide the next/previous links if on first or last images.
		
			$('.pp_loaderIcon').show();
		
			if(settings.deeplinking)
				setHashtag();
		
			// Rebuild Facebook Like Button with updated href
			if(settings.social_tools){
				facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); 
				$pp_pic_holder.find('.pp_social').html(facebook_like_link);
			}
			
			// Fade the content in
			if($ppt.is(':hidden')) $ppt.css('opacity',0).show();
			$pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);

			// Display the current position
			$pp_pic_holder.find('.currentTextHolder').text((set_position+1) + settings.counter_separator_label + $(pp_images).size());

			// Set the description
			if(typeof pp_descriptions[set_position] != 'undefined' && pp_descriptions[set_position] != ""){
				$pp_pic_holder.find('.pp_description').show().html(unescape(pp_descriptions[set_position]));
			}else{
				$pp_pic_holder.find('.pp_description').hide();
			}
			
			// Get the dimensions
			movie_width = ( parseFloat(getParam('width',pp_images[set_position])) ) ? getParam('width',pp_images[set_position]) : settings.default_width.toString();
			movie_height = ( parseFloat(getParam('height',pp_images[set_position])) ) ? getParam('height',pp_images[set_position]) : settings.default_height.toString();
			
			// If the size is % based, calculate according to window dimensions
			percentBased=false;
			if(movie_height.indexOf('%') != -1) { movie_height = parseFloat(($(window).height() * parseFloat(movie_height) / 100) - 150); percentBased = true; }
			if(movie_width.indexOf('%') != -1) { movie_width = parseFloat(($(window).width() * parseFloat(movie_width) / 100) - 150); percentBased = true; }
			
			// Fade the holder
			$pp_pic_holder.fadeIn(function(){
				// Set the title
				(settings.show_title && pp_titles[set_position] != "" && typeof pp_titles[set_position] != "undefined") ? $ppt.html(unescape(pp_titles[set_position])) : $ppt.html('&nbsp;');
				
				imgPreloader = "";
				skipInjection = false;
				
				// Inject the proper content
				switch(_getFileType(pp_images[set_position])){
					case 'image':
						imgPreloader = new Image();

						// Preload the neighbour images
						nextImage = new Image();
						if(isSet && set_position < $(pp_images).size() -1) nextImage.src = pp_images[set_position + 1];
						prevImage = new Image();
						if(isSet && pp_images[set_position - 1]) prevImage.src = pp_images[set_position - 1];

						$pp_pic_holder.find('#pp_full_res')[0].innerHTML = settings.image_markup.replace(/{path}/g,pp_images[set_position]);

						imgPreloader.onload = function(){
							// Fit item to viewport
							pp_dimensions = _fitToViewport(imgPreloader.width,imgPreloader.height);

							_showContent();
						};

						imgPreloader.onerror = function(){
							alert('Image cannot be loaded. Make sure the path is correct and image exist.');
							$.prettyPhoto.close();
						};
					
						imgPreloader.src = pp_images[set_position];
					break;
				
					case 'youtube':
						pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
						
						// Regular youtube link
						movie_id = getParam('v',pp_images[set_position]);
						
						// youtu.be link
						if(movie_id == ""){
							movie_id = pp_images[set_position].split('youtu.be/');
							movie_id = movie_id[1];
							if(movie_id.indexOf('?') > 0)
								movie_id = movie_id.substr(0,movie_id.indexOf('?')); // Strip anything after the ?

							if(movie_id.indexOf('&') > 0)
								movie_id = movie_id.substr(0,movie_id.indexOf('&')); // Strip anything after the &
						}

						movie = 'http://www.youtube.com/embed/'+movie_id;
						(getParam('rel',pp_images[set_position])) ? movie+="?rel="+getParam('rel',pp_images[set_position]) : movie+="?rel=1";
							
						if(settings.autoplay) movie += "&autoplay=1";
					
						toInject = settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);
					break;
				
					case 'vimeo':
						pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
					
						movie_id = pp_images[set_position];
						var regExp = /http(s?):\/\/(www\.)?vimeo.com\/(\d+)/;
						var match = movie_id.match(regExp);
						
						movie = 'http://player.vimeo.com/video/'+ match[3] +'?title=0&amp;byline=0&amp;portrait=0';
						if(settings.autoplay) movie += "&autoplay=1;";
				
						vimeo_width = pp_dimensions['width'] + '/embed/?moog_width='+ pp_dimensions['width'];
				
						toInject = settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,movie);
					break;
				
					case 'quicktime':
						pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
						pp_dimensions['height']+=15; pp_dimensions['contentHeight']+=15; pp_dimensions['containerHeight']+=15; // Add space for the control bar
				
						toInject = settings.quicktime_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);
					break;
				
					case 'flash':
						pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
					
						flash_vars = pp_images[set_position];
						flash_vars = flash_vars.substring(pp_images[set_position].indexOf('flashvars') + 10,pp_images[set_position].length);

						filename = pp_images[set_position];
						filename = filename.substring(0,filename.indexOf('?'));
					
						toInject =  settings.flash_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+'?'+flash_vars);
					break;
				
					case 'iframe':
						pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
				
						frame_url = pp_images[set_position];
						frame_url = frame_url.substr(0,frame_url.indexOf('iframe')-1);

						toInject = settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,frame_url);
					break;
					
					case 'ajax':
						doresize = false; // Make sure the dimensions are not resized.
						pp_dimensions = _fitToViewport(movie_width,movie_height);
						doresize = true; // Reset the dimensions
					
						skipInjection = true;
						$.get(pp_images[set_position],function(responseHTML){
							toInject = settings.inline_markup.replace(/{content}/g,responseHTML);
							$pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject;
							_showContent();
						});
						
					break;
					
					case 'custom':
						pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
					
						toInject = settings.custom_markup;
					break;
				
					case 'inline':
						// to get the item height clone it, apply default width, wrap it in the prettyPhoto containers , then delete
						myClone = $(pp_images[set_position]).clone().append('<br clear="all" />').css({'width':settings.default_width}).wrapInner('<div id="pp_full_res"><div class="pp_inline"></div></div>').appendTo($('body')).show();
						doresize = false; // Make sure the dimensions are not resized.
						pp_dimensions = _fitToViewport($(myClone).width(),$(myClone).height());
						doresize = true; // Reset the dimensions
						$(myClone).remove();
						toInject = settings.inline_markup.replace(/{content}/g,$(pp_images[set_position]).html());
					break;
				};

				if(!imgPreloader && !skipInjection){
					$pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject;
				
					// Show content
					_showContent();
				};
			});

			return false;
		};

	
		/**
		* Change page in the prettyPhoto modal box
		* @param direction {String} Direction of the paging, previous or next.
		*/
		$.prettyPhoto.changePage = function(direction){
			currentGalleryPage = 0;
			
			if(direction == 'previous') {
				set_position--;
				if (set_position < 0) set_position = $(pp_images).size()-1;
			}else if(direction == 'next'){
				set_position++;
				if(set_position > $(pp_images).size()-1) set_position = 0;
			}else{
				set_position=direction;
			};
			
			rel_index = set_position;

			if(!doresize) doresize = true; // Allow the resizing of the images
			if(settings.allow_expand) {
				$('.pp_contract').removeClass('pp_contract').addClass('pp_expand');
			}

			_hideContent(function(){ $.prettyPhoto.open(); });
		};


		/**
		* Change gallery page in the prettyPhoto modal box
		* @param direction {String} Direction of the paging, previous or next.
		*/
		$.prettyPhoto.changeGalleryPage = function(direction){
			if(direction=='next'){
				currentGalleryPage ++;

				if(currentGalleryPage > totalPage) currentGalleryPage = 0;
			}else if(direction=='previous'){
				currentGalleryPage --;

				if(currentGalleryPage < 0) currentGalleryPage = totalPage;
			}else{
				currentGalleryPage = direction;
			};
			
			slide_speed = (direction == 'next' || direction == 'previous') ? settings.animation_speed : 0;

			slide_to = currentGalleryPage * (itemsPerPage * itemWidth);

			$pp_gallery.find('ul').animate({left:-slide_to},slide_speed);
		};


		/**
		* Start the slideshow...
		*/
		$.prettyPhoto.startSlideshow = function(){
			if(typeof pp_slideshow == 'undefined'){
				$pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function(){
					$.prettyPhoto.stopSlideshow();
					return false;
				});
				pp_slideshow = setInterval($.prettyPhoto.startSlideshow,settings.slideshow);
			}else{
				$.prettyPhoto.changePage('next');	
			};
		}


		/**
		* Stop the slideshow...
		*/
		$.prettyPhoto.stopSlideshow = function(){
			$pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function(){
				$.prettyPhoto.startSlideshow();
				return false;
			});
			clearInterval(pp_slideshow);
			pp_slideshow=undefined;
		}


		/**
		* Closes prettyPhoto.
		*/
		$.prettyPhoto.close = function(){
			if($pp_overlay.is(":animated")) return;
			
			$.prettyPhoto.stopSlideshow();
			
			$pp_pic_holder.stop().find('object,embed').css('visibility','hidden');
			
			$('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed,function(){ $(this).remove(); });
			
			$pp_overlay.fadeOut(settings.animation_speed, function(){
				
				if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','visible'); // Show the flash
				
				$(this).remove(); // No more need for the prettyPhoto markup
				
				$(window).unbind('scroll.prettyphoto');
				
				clearHashtag();
				
				settings.callback();
				
				doresize = true;
				
				pp_open = false;
				
				delete settings;
			});
		};
	
		/**
		* Set the proper sizes on the containers and animate the content in.
		*/
		function _showContent(){
			$('.pp_loaderIcon').hide();

			// Calculate the opened top position of the pic holder
			projectedTop = scroll_pos['scrollTop'] + ((windowHeight/2) - (pp_dimensions['containerHeight']/2));
			if(projectedTop < 0) projectedTop = 0;

			$ppt.fadeTo(settings.animation_speed,1);

			// Resize the content holder
			$pp_pic_holder.find('.pp_content')
				.animate({
					height:pp_dimensions['contentHeight'],
					width:pp_dimensions['contentWidth']
				},settings.animation_speed);
			
			// Resize picture the holder
			$pp_pic_holder.animate({
				'top': projectedTop,
				'left': ((windowWidth/2) - (pp_dimensions['containerWidth']/2) < 0) ? 0 : (windowWidth/2) - (pp_dimensions['containerWidth']/2),
				width:pp_dimensions['containerWidth']
			},settings.animation_speed,function(){
				$pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']);

				$pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed); // Fade the new content

				// Show the nav
				if(isSet && _getFileType(pp_images[set_position])=="image") { $pp_pic_holder.find('.pp_hoverContainer').show(); }else{ $pp_pic_holder.find('.pp_hoverContainer').hide(); }
			
				if(settings.allow_expand) {
					if(pp_dimensions['resized']){ // Fade the resizing link if the image is resized
						$('a.pp_expand,a.pp_contract').show();
					}else{
						$('a.pp_expand').hide();
					}
				}
				
				if(settings.autoplay_slideshow && !pp_slideshow && !pp_open) $.prettyPhoto.startSlideshow();
				
				settings.changepicturecallback(); // Callback!
				
				pp_open = true;
			});
			
			_insert_gallery();
			pp_settings.ajaxcallback();
		};
		
		/**
		* Hide the content...DUH!
		*/
		function _hideContent(callback){
			// Fade out the current picture
			$pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden');
			$pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed,function(){
				$('.pp_loaderIcon').show();
				
				callback();
			});
		};
	
		/**
		* Check the item position in the gallery array, hide or show the navigation links
		* @param setCount {integer} The total number of items in the set
		*/
		function _checkPosition(setCount){
			(setCount > 1) ? $('.pp_nav').show() : $('.pp_nav').hide(); // Hide the bottom nav if it's not a set.
		};
	
		/**
		* Resize the item dimensions if it's bigger than the viewport
		* @param width {integer} Width of the item to be opened
		* @param height {integer} Height of the item to be opened
		* @return An array containin the "fitted" dimensions
		*/
		function _fitToViewport(width,height){
			resized = false;

			_getDimensions(width,height);
			
			// Define them in case there's no resize needed
			imageWidth = width, imageHeight = height;

			if( ((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)) && doresize && settings.allow_resize && !percentBased) {
				resized = true, fitting = false;
			
				while (!fitting){
					if((pp_containerWidth > windowWidth)){
						imageWidth = (windowWidth - 200);
						imageHeight = (height/width) * imageWidth;
					}else if((pp_containerHeight > windowHeight)){
						imageHeight = (windowHeight - 200);
						imageWidth = (width/height) * imageHeight;
					}else{
						fitting = true;
					};

					pp_containerHeight = imageHeight, pp_containerWidth = imageWidth;
				};
			

				
				if((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)){
					_fitToViewport(pp_containerWidth,pp_containerHeight)
				};
				
				_getDimensions(imageWidth,imageHeight);
			};
			
			return {
				width:Math.floor(imageWidth),
				height:Math.floor(imageHeight),
				containerHeight:Math.floor(pp_containerHeight),
				containerWidth:Math.floor(pp_containerWidth) + (settings.horizontal_padding * 2),
				contentHeight:Math.floor(pp_contentHeight),
				contentWidth:Math.floor(pp_contentWidth),
				resized:resized
			};
		};
		
		/**
		* Get the containers dimensions according to the item size
		* @param width {integer} Width of the item to be opened
		* @param height {integer} Height of the item to be opened
		*/
		function _getDimensions(width,height){
			width = parseFloat(width);
			height = parseFloat(height);
			
			// Get the details height, to do so, I need to clone it since it's invisible
			$pp_details = $pp_pic_holder.find('.pp_details');
			$pp_details.width(width);
			detailsHeight = parseFloat($pp_details.css('marginTop')) + parseFloat($pp_details.css('marginBottom'));
			
			$pp_details = $pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({
				'position':'absolute',
				'top':-10000
			});
			detailsHeight += $pp_details.height();
			detailsHeight = (detailsHeight <= 34) ? 36 : detailsHeight; // Min-height for the details
			$pp_details.remove();
			
			// Get the titles height, to do so, I need to clone it since it's invisible
			$pp_title = $pp_pic_holder.find('.ppt');
			$pp_title.width(width);
			titleHeight = parseFloat($pp_title.css('marginTop')) + parseFloat($pp_title.css('marginBottom'));
			$pp_title = $pp_title.clone().appendTo($('body')).css({
				'position':'absolute',
				'top':-10000
			});
			titleHeight += $pp_title.height();
			$pp_title.remove();
			
			// Get the container size, to resize the holder to the right dimensions
			pp_contentHeight = height + detailsHeight;
			pp_contentWidth = width;
			pp_containerHeight = pp_contentHeight + titleHeight + $pp_pic_holder.find('.pp_top').height() + $pp_pic_holder.find('.pp_bottom').height();
			pp_containerWidth = width;
		}
	
		function _getFileType(itemSrc){
			if (itemSrc.match(/youtube\.com\/watch/i) || itemSrc.match(/youtu\.be/i)) {
				return 'youtube';
			}else if (itemSrc.match(/vimeo\.com/i)) {
				return 'vimeo';
			}else if(itemSrc.match(/\b.mov\b/i)){ 
				return 'quicktime';
			}else if(itemSrc.match(/\b.swf\b/i)){
				return 'flash';
			}else if(itemSrc.match(/\biframe=true\b/i)){
				return 'iframe';
			}else if(itemSrc.match(/\bajax=true\b/i)){
				return 'ajax';
			}else if(itemSrc.match(/\bcustom=true\b/i)){
				return 'custom';
			}else if(itemSrc.substr(0,1) == '#'){
				return 'inline';
			}else{
				return 'image';
			};
		};
	
		function _center_overlay(){
			if(doresize && typeof $pp_pic_holder != 'undefined') {
				scroll_pos = _get_scroll();
				contentHeight = $pp_pic_holder.height(), contentwidth = $pp_pic_holder.width();

				projectedTop = (windowHeight/2) + scroll_pos['scrollTop'] - (contentHeight/2);
				if(projectedTop < 0) projectedTop = 0;
				
				if(contentHeight > windowHeight)
					return;

				$pp_pic_holder.css({
					'top': projectedTop,
					'left': (windowWidth/2) + scroll_pos['scrollLeft'] - (contentwidth/2)
				});
			};
		};
	
		function _get_scroll(){
			if (self.pageYOffset) {
				return {scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset};
			} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
				return {scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft};
			} else if (document.body) {// all other Explorers
				return {scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft};
			};
		};
	
		function _resize_overlay() {
			windowHeight = $(window).height(), windowWidth = $(window).width();
			
			if(typeof $pp_overlay != "undefined") $pp_overlay.height($(document).height()).width(windowWidth);
		};
	
		function _insert_gallery(){
			if(isSet && settings.overlay_gallery && _getFileType(pp_images[set_position])=="image") {
				itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin.
				navWidth = (settings.theme == "facebook" || settings.theme == "pp_default") ? 50 : 30; // Define the arrow width depending on the theme
				
				itemsPerPage = Math.floor((pp_dimensions['containerWidth'] - 100 - navWidth) / itemWidth);
				itemsPerPage = (itemsPerPage < pp_images.length) ? itemsPerPage : pp_images.length;
				totalPage = Math.ceil(pp_images.length / itemsPerPage) - 1;

				// Hide the nav in the case there's no need for links
				if(totalPage == 0){
					navWidth = 0; // No nav means no width!
					$pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').hide();
				}else{
					$pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').show();
				};

				galleryWidth = itemsPerPage * itemWidth;
				fullGalleryWidth = pp_images.length * itemWidth;
				
				// Set the proper width to the gallery items
				$pp_gallery
					.css('margin-left',-((galleryWidth/2) + (navWidth/2)))
					.find('div:first').width(galleryWidth+5)
					.find('ul').width(fullGalleryWidth)
					.find('li.selected').removeClass('selected');
				
				goToPage = (Math.floor(set_position/itemsPerPage) < totalPage) ? Math.floor(set_position/itemsPerPage) : totalPage;

				$.prettyPhoto.changeGalleryPage(goToPage);
				
				$pp_gallery_li.filter(':eq('+set_position+')').addClass('selected');
			}else{
				$pp_pic_holder.find('.pp_content').unbind('mouseenter mouseleave');
				// $pp_gallery.hide();
			}
		}
	
		function _build_overlay(caller){
			// Inject Social Tool markup into General markup
			if(settings.social_tools)
				facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); 

			settings.markup = settings.markup.replace('{pp_social}',''); 
			
			$('body').append(settings.markup); // Inject the markup
			
			$pp_pic_holder = $('.pp_pic_holder') , $ppt = $('.ppt'), $pp_overlay = $('div.pp_overlay'); // Set my global selectors
			
			// Inject the inline gallery!
			if(isSet && settings.overlay_gallery) {
				currentGalleryPage = 0;
				toInject = "";
				for (var i=0; i < pp_images.length; i++) {
					if(!pp_images[i].match(/\b(jpg|jpeg|png|gif)\b/gi)){
						classname = 'default';
						img_src = '';
					}else{
						classname = '';
						img_src = pp_images[i];
					}
					toInject += "<li class='"+classname+"'><a href='#'><img src='" + img_src + "' width='50' alt='' /></a></li>";
				};
				
				toInject = settings.gallery_markup.replace(/{gallery}/g,toInject);
				
				$pp_pic_holder.find('#pp_full_res').after(toInject);
				
				$pp_gallery = $('.pp_pic_holder .pp_gallery'), $pp_gallery_li = $pp_gallery.find('li'); // Set the gallery selectors
				
				$pp_gallery.find('.pp_arrow_next').click(function(){
					$.prettyPhoto.changeGalleryPage('next');
					$.prettyPhoto.stopSlideshow();
					return false;
				});
				
				$pp_gallery.find('.pp_arrow_previous').click(function(){
					$.prettyPhoto.changeGalleryPage('previous');
					$.prettyPhoto.stopSlideshow();
					return false;
				});
				
				$pp_pic_holder.find('.pp_content').hover(
					function(){
						$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn();
					},
					function(){
						$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut();
					});

				itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin.
				$pp_gallery_li.each(function(i){
					$(this)
						.find('a')
						.click(function(){
							$.prettyPhoto.changePage(i);
							$.prettyPhoto.stopSlideshow();
							return false;
						});
				});
			};
			
			
			// Inject the play/pause if it's a slideshow
			if(settings.slideshow){
				$pp_pic_holder.find('.pp_nav').prepend('<a href="#" class="pp_play">Play</a>')
				$pp_pic_holder.find('.pp_nav .pp_play').click(function(){
					$.prettyPhoto.startSlideshow();
					return false;
				});
			}
			
			$pp_pic_holder.attr('class','pp_pic_holder ' + settings.theme); // Set the proper theme
			
			$pp_overlay
				.css({
					'opacity':0,
					'height':$(document).height(),
					'width':$(window).width()
					})
				.bind('click',function(){
					if(!settings.modal) $.prettyPhoto.close();
				});

			$('a.pp_close').bind('click',function(){ $.prettyPhoto.close(); return false; });


			if(settings.allow_expand) {
				$('a.pp_expand').bind('click',function(e){
					// Expand the image
					if($(this).hasClass('pp_expand')){
						$(this).removeClass('pp_expand').addClass('pp_contract');
						doresize = false;
					}else{
						$(this).removeClass('pp_contract').addClass('pp_expand');
						doresize = true;
					};
				
					_hideContent(function(){ $.prettyPhoto.open(); });
			
					return false;
				});
			}
		
			$pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click',function(){
				$.prettyPhoto.changePage('previous');
				$.prettyPhoto.stopSlideshow();
				return false;
			});
		
			$pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click',function(){
				$.prettyPhoto.changePage('next');
				$.prettyPhoto.stopSlideshow();
				return false;
			});
			
			_center_overlay(); // Center it
		};

		if(!pp_alreadyInitialized && getHashtag()){
			pp_alreadyInitialized = true;
			
			// Grab the rel index to trigger the click on the correct element
			hashIndex = getHashtag();
			hashRel = hashIndex;
			hashIndex = hashIndex.substring(hashIndex.indexOf('/')+1,hashIndex.length-1);
			hashRel = hashRel.substring(0,hashRel.indexOf('/'));

			// Little timeout to make sure all the prettyPhoto initialize scripts has been run.
			// Useful in the event the page contain several init scripts.
			setTimeout(function(){ $("a["+pp_settings.hook+"^='"+hashRel+"']:eq("+hashIndex+")").trigger('click'); },50);
		}
		
		return this.unbind('click.prettyphoto').bind('click.prettyphoto',$.prettyPhoto.initialize); // Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once
	};
	
	function getHashtag(){
		var url = location.href;
		hashtag = (url.indexOf('#prettyPhoto') !== -1) ? decodeURI(url.substring(url.indexOf('#prettyPhoto')+1,url.length)) : false;
		if(hashtag){  hashtag = hashtag.replace(/<|>/g,''); }
		return hashtag;
	};
	
	function setHashtag(){
		if(typeof theRel == 'undefined') return; // theRel is set on normal calls, it's impossible to deeplink using the API
		location.hash = theRel + '/'+rel_index+'/';
	};
	
	function clearHashtag(){
		if ( location.href.indexOf('#prettyPhoto') !== -1 ) location.hash = "prettyPhoto";
	}
	
	function getParam(name,url){
	  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regexS = "[\\?&]"+name+"=([^&#]*)";
	  var regex = new RegExp( regexS );
	  var results = regex.exec( url );
	  return ( results == null ) ? "" : results[1];
	}
	
})(jQuery);

var pp_alreadyInitialized = false; // Used for the deep linking to make sure not to call the same function several times.

//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVxdWFsaGVpZ2h0cy5qcyIsImltYWdlc2xvYWRlZC5wa2dkLm1pbi5qcyIsImluc3RhZmVlZC5taW4uanMiLCJpc290b3BlLnBrZ2QubWluLmpzIiwiamZsaWNrcmZlZWQubWluLmpzIiwianF1ZXJ5LXNjcm9sbHRvZml4ZWQtbWluLmpzIiwianF1ZXJ5LmFuaW1hdGVudW1iZXJzLm1pbi5qcyIsImpxdWVyeS5hcHBlYXIuanMiLCJqcXVlcnkuY291bnRkb3duLm1pbi5qcyIsImpxdWVyeS5jb3VudHRvLmpzIiwianF1ZXJ5LmRkc2xpY2subWluLmpzIiwianF1ZXJ5LmVhc2luZy5taW4uanMiLCJqcXVlcnkuZWFzeXBpZWNoYXJ0Lm1pbi5qcyIsImpxdWVyeS5maW5hbC1jb3VudGRvd24ubWluLmpzIiwianF1ZXJ5LmZpdHRleHQuanMiLCJqcXVlcnkuZml0dmlkcy5qcyIsImpxdWVyeS5mb3JtLm1pbi5qcyIsImpxdWVyeS5sb2NhbHNjcm9sbC5taW4uanMiLCJqcXVlcnkubW91c2V3aGVlbC5taW4uanMiLCJqcXVlcnkucGFyYWxsYXgtMS4xLjMuanMiLCJqcXVlcnkuc2Nyb2xsdG8ubWluLmpzIiwianF1ZXJ5LnN0aWNreS5qcyIsImpxdWVyeS50b3VjaHN3aXBlLm1pbi5qcyIsImpxdWVyeS52YWxpZGF0ZS5taW4uanMiLCJraW5ldGljLmpzIiwicG9wcGVyLm1pbi5qcyIsInNjcm9sbG1hZ2ljLm1pbi5qcyIsInR5cGVkLm1pbi5qcyIsIndvdy5taW4uanMiLCJieHNsaWRlci9qcXVlcnkuYnhzbGlkZXIubWluLmpzIiwiZmxleHNsaWRlci9qcXVlcnkuZmxleHNsaWRlci1taW4uanMiLCJtYWduaWZpYy1wb3B1cC9qcXVlcnkubWFnbmlmaWMtcG9wdXAubWluLmpzIiwibWVudWZ1bGxwYWdlL21lbnVmdWxscGFnZS5taW4uanMiLCJuaXZvLWxpZ2h0Ym94L25pdm8tbGlnaHRib3gubWluLmpzIiwib3dsLWNhcm91c2VsL293bC5jYXJvdXNlbC5taW4uanMiLCJzbGljay9zbGljay5taW4uanMiLCJ0d2VudHl0d2VudHkvanF1ZXJ5LmV2ZW50Lm1vdmUuanMiLCJ0d2VudHl0d2VudHkvanF1ZXJ5LnR3ZW50eXR3ZW50eS5qcyIsIndheXBvaW50cy9qcXVlcnkud2F5cG9pbnRzLm1pbi5qcyIsImxpZ2h0Z2FsbGVyeS9qcy9saWdodGdhbGxlcnktYWxsLm1pbi5qcyIsInByZXR0eXBob3RvL2pzL2pxdWVyeS5wcmV0dHlwaG90by5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNOQTtBQUNBO0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbElBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNSQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ0xBO0FBQ0E7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNYQTtBQUNBO0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqQkE7QUNBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJqYXZhc2NyaXB0LXBsdWdpbnMtYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohXHJcbiAqIFNpbXBsZSBqUXVlcnkgRXF1YWwgSGVpZ2h0c1xyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMgTWF0dCBCYW5rc1xyXG4gKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcy5cclxuICogVXNlcyB0aGUgc2FtZSBsaWNlbnNlIGFzIGpRdWVyeSwgc2VlOlxyXG4gKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL0xpY2Vuc2VcclxuICpcclxuICogQHZlcnNpb24gMS41LjFcclxuICovXHJcbiFmdW5jdGlvbihhKXthLmZuLmVxdWFsSGVpZ2h0cz1mdW5jdGlvbigpe3ZhciBiPTAsYz1hKHRoaXMpO3JldHVybiBjLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLmlubmVySGVpZ2h0KCk7Yz5iJiYoYj1jKX0pLGMuY3NzKFwiaGVpZ2h0XCIsYil9LGEoXCJbZGF0YS1lcXVhbF1cIikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyksYz1iLmRhdGEoXCJlcXVhbFwiKTtiLmZpbmQoYykuZXF1YWxIZWlnaHRzKCl9KX0oalF1ZXJ5KTsiLCIvKiFcclxuICogaW1hZ2VzTG9hZGVkIFBBQ0tBR0VEIHY0LjEuNFxyXG4gKiBKYXZhU2NyaXB0IGlzIGFsbCBsaWtlIFwiWW91IGltYWdlcyBhcmUgZG9uZSB5ZXQgb3Igd2hhdD9cIlxyXG4gKiBNSVQgTGljZW5zZVxyXG4gKi9cclxuXHJcbiFmdW5jdGlvbihlLHQpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJldi1lbWl0dGVyL2V2LWVtaXR0ZXJcIix0KTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10KCk6ZS5FdkVtaXR0ZXI9dCgpfShcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe312YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5vbj1mdW5jdGlvbihlLHQpe2lmKGUmJnQpe3ZhciBpPXRoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9LG49aVtlXT1pW2VdfHxbXTtyZXR1cm4gbi5pbmRleE9mKHQpPT0tMSYmbi5wdXNoKHQpLHRoaXN9fSx0Lm9uY2U9ZnVuY3Rpb24oZSx0KXtpZihlJiZ0KXt0aGlzLm9uKGUsdCk7dmFyIGk9dGhpcy5fb25jZUV2ZW50cz10aGlzLl9vbmNlRXZlbnRzfHx7fSxuPWlbZV09aVtlXXx8e307cmV0dXJuIG5bdF09ITAsdGhpc319LHQub2ZmPWZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHNbZV07aWYoaSYmaS5sZW5ndGgpe3ZhciBuPWkuaW5kZXhPZih0KTtyZXR1cm4gbiE9LTEmJmkuc3BsaWNlKG4sMSksdGhpc319LHQuZW1pdEV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHNbZV07aWYoaSYmaS5sZW5ndGgpe2k9aS5zbGljZSgwKSx0PXR8fFtdO2Zvcih2YXIgbj10aGlzLl9vbmNlRXZlbnRzJiZ0aGlzLl9vbmNlRXZlbnRzW2VdLG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIHI9aVtvXSxzPW4mJm5bcl07cyYmKHRoaXMub2ZmKGUsciksZGVsZXRlIG5bcl0pLHIuYXBwbHkodGhpcyx0KX1yZXR1cm4gdGhpc319LHQuYWxsT2ZmPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuX2V2ZW50cyxkZWxldGUgdGhpcy5fb25jZUV2ZW50c30sZX0pLGZ1bmN0aW9uKGUsdCl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJldi1lbWl0dGVyL2V2LWVtaXR0ZXJcIl0sZnVuY3Rpb24oaSl7cmV0dXJuIHQoZSxpKX0pOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPXQoZSxyZXF1aXJlKFwiZXYtZW1pdHRlclwiKSk6ZS5pbWFnZXNMb2FkZWQ9dChlLGUuRXZFbWl0dGVyKX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0KXtmb3IodmFyIGkgaW4gdCllW2ldPXRbaV07cmV0dXJuIGV9ZnVuY3Rpb24gbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlO3ZhciB0PVwib2JqZWN0XCI9PXR5cGVvZiBlJiZcIm51bWJlclwiPT10eXBlb2YgZS5sZW5ndGg7cmV0dXJuIHQ/ZC5jYWxsKGUpOltlXX1mdW5jdGlvbiBvKGUsdCxyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBvKSlyZXR1cm4gbmV3IG8oZSx0LHIpO3ZhciBzPWU7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGUmJihzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSkpLHM/KHRoaXMuZWxlbWVudHM9bihzKSx0aGlzLm9wdGlvbnM9aSh7fSx0aGlzLm9wdGlvbnMpLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/cj10OmkodGhpcy5vcHRpb25zLHQpLHImJnRoaXMub24oXCJhbHdheXNcIixyKSx0aGlzLmdldEltYWdlcygpLGgmJih0aGlzLmpxRGVmZXJyZWQ9bmV3IGguRGVmZXJyZWQpLHZvaWQgc2V0VGltZW91dCh0aGlzLmNoZWNrLmJpbmQodGhpcykpKTp2b2lkIGEuZXJyb3IoXCJCYWQgZWxlbWVudCBmb3IgaW1hZ2VzTG9hZGVkIFwiKyhzfHxlKSl9ZnVuY3Rpb24gcihlKXt0aGlzLmltZz1lfWZ1bmN0aW9uIHMoZSx0KXt0aGlzLnVybD1lLHRoaXMuZWxlbWVudD10LHRoaXMuaW1nPW5ldyBJbWFnZX12YXIgaD1lLmpRdWVyeSxhPWUuY29uc29sZSxkPUFycmF5LnByb3RvdHlwZS5zbGljZTtvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxvLnByb3RvdHlwZS5vcHRpb25zPXt9LG8ucHJvdG90eXBlLmdldEltYWdlcz1mdW5jdGlvbigpe3RoaXMuaW1hZ2VzPVtdLHRoaXMuZWxlbWVudHMuZm9yRWFjaCh0aGlzLmFkZEVsZW1lbnRJbWFnZXMsdGhpcyl9LG8ucHJvdG90eXBlLmFkZEVsZW1lbnRJbWFnZXM9ZnVuY3Rpb24oZSl7XCJJTUdcIj09ZS5ub2RlTmFtZSYmdGhpcy5hZGRJbWFnZShlKSx0aGlzLm9wdGlvbnMuYmFja2dyb3VuZD09PSEwJiZ0aGlzLmFkZEVsZW1lbnRCYWNrZ3JvdW5kSW1hZ2VzKGUpO3ZhciB0PWUubm9kZVR5cGU7aWYodCYmdVt0XSl7Zm9yKHZhciBpPWUucXVlcnlTZWxlY3RvckFsbChcImltZ1wiKSxuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBvPWlbbl07dGhpcy5hZGRJbWFnZShvKX1pZihcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5vcHRpb25zLmJhY2tncm91bmQpe3ZhciByPWUucXVlcnlTZWxlY3RvckFsbCh0aGlzLm9wdGlvbnMuYmFja2dyb3VuZCk7Zm9yKG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIHM9cltuXTt0aGlzLmFkZEVsZW1lbnRCYWNrZ3JvdW5kSW1hZ2VzKHMpfX19fTt2YXIgdT17MTohMCw5OiEwLDExOiEwfTtyZXR1cm4gby5wcm90b3R5cGUuYWRkRWxlbWVudEJhY2tncm91bmRJbWFnZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9Z2V0Q29tcHV0ZWRTdHlsZShlKTtpZih0KWZvcih2YXIgaT0vdXJsXFwoKFsnXCJdKT8oLio/KVxcMVxcKS9naSxuPWkuZXhlYyh0LmJhY2tncm91bmRJbWFnZSk7bnVsbCE9PW47KXt2YXIgbz1uJiZuWzJdO28mJnRoaXMuYWRkQmFja2dyb3VuZChvLGUpLG49aS5leGVjKHQuYmFja2dyb3VuZEltYWdlKX19LG8ucHJvdG90eXBlLmFkZEltYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyByKGUpO3RoaXMuaW1hZ2VzLnB1c2godCl9LG8ucHJvdG90eXBlLmFkZEJhY2tncm91bmQ9ZnVuY3Rpb24oZSx0KXt2YXIgaT1uZXcgcyhlLHQpO3RoaXMuaW1hZ2VzLnB1c2goaSl9LG8ucHJvdG90eXBlLmNoZWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLGksbil7c2V0VGltZW91dChmdW5jdGlvbigpe3QucHJvZ3Jlc3MoZSxpLG4pfSl9dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5wcm9ncmVzc2VkQ291bnQ9MCx0aGlzLmhhc0FueUJyb2tlbj0hMSx0aGlzLmltYWdlcy5sZW5ndGg/dm9pZCB0aGlzLmltYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Qub25jZShcInByb2dyZXNzXCIsZSksdC5jaGVjaygpfSk6dm9pZCB0aGlzLmNvbXBsZXRlKCl9LG8ucHJvdG90eXBlLnByb2dyZXNzPWZ1bmN0aW9uKGUsdCxpKXt0aGlzLnByb2dyZXNzZWRDb3VudCsrLHRoaXMuaGFzQW55QnJva2VuPXRoaXMuaGFzQW55QnJva2VufHwhZS5pc0xvYWRlZCx0aGlzLmVtaXRFdmVudChcInByb2dyZXNzXCIsW3RoaXMsZSx0XSksdGhpcy5qcURlZmVycmVkJiZ0aGlzLmpxRGVmZXJyZWQubm90aWZ5JiZ0aGlzLmpxRGVmZXJyZWQubm90aWZ5KHRoaXMsZSksdGhpcy5wcm9ncmVzc2VkQ291bnQ9PXRoaXMuaW1hZ2VzLmxlbmd0aCYmdGhpcy5jb21wbGV0ZSgpLHRoaXMub3B0aW9ucy5kZWJ1ZyYmYSYmYS5sb2coXCJwcm9ncmVzczogXCIraSxlLHQpfSxvLnByb3RvdHlwZS5jb21wbGV0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaGFzQW55QnJva2VuP1wiZmFpbFwiOlwiZG9uZVwiO2lmKHRoaXMuaXNDb21wbGV0ZT0hMCx0aGlzLmVtaXRFdmVudChlLFt0aGlzXSksdGhpcy5lbWl0RXZlbnQoXCJhbHdheXNcIixbdGhpc10pLHRoaXMuanFEZWZlcnJlZCl7dmFyIHQ9dGhpcy5oYXNBbnlCcm9rZW4/XCJyZWplY3RcIjpcInJlc29sdmVcIjt0aGlzLmpxRGVmZXJyZWRbdF0odGhpcyl9fSxyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxyLnByb3RvdHlwZS5jaGVjaz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SXNJbWFnZUNvbXBsZXRlKCk7cmV0dXJuIGU/dm9pZCB0aGlzLmNvbmZpcm0oMCE9PXRoaXMuaW1nLm5hdHVyYWxXaWR0aCxcIm5hdHVyYWxXaWR0aFwiKToodGhpcy5wcm94eUltYWdlPW5ldyBJbWFnZSx0aGlzLnByb3h5SW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIix0aGlzKSx0aGlzLnByb3h5SW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsdGhpcyksdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIix0aGlzKSx0aGlzLmltZy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIix0aGlzKSx2b2lkKHRoaXMucHJveHlJbWFnZS5zcmM9dGhpcy5pbWcuc3JjKSl9LHIucHJvdG90eXBlLmdldElzSW1hZ2VDb21wbGV0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmltZy5jb21wbGV0ZSYmdGhpcy5pbWcubmF0dXJhbFdpZHRofSxyLnByb3RvdHlwZS5jb25maXJtPWZ1bmN0aW9uKGUsdCl7dGhpcy5pc0xvYWRlZD1lLHRoaXMuZW1pdEV2ZW50KFwicHJvZ3Jlc3NcIixbdGhpcyx0aGlzLmltZyx0XSl9LHIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGUpe3ZhciB0PVwib25cIitlLnR5cGU7dGhpc1t0XSYmdGhpc1t0XShlKX0sci5wcm90b3R5cGUub25sb2FkPWZ1bmN0aW9uKCl7dGhpcy5jb25maXJtKCEwLFwib25sb2FkXCIpLHRoaXMudW5iaW5kRXZlbnRzKCl9LHIucHJvdG90eXBlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLmNvbmZpcm0oITEsXCJvbmVycm9yXCIpLHRoaXMudW5iaW5kRXZlbnRzKCl9LHIucHJvdG90eXBlLnVuYmluZEV2ZW50cz1mdW5jdGlvbigpe3RoaXMucHJveHlJbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLHRoaXMpLHRoaXMucHJveHlJbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIix0aGlzKSx0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLHRoaXMpLHRoaXMuaW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLHRoaXMpfSxzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSxzLnByb3RvdHlwZS5jaGVjaz1mdW5jdGlvbigpe3RoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsdGhpcyksdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsdGhpcyksdGhpcy5pbWcuc3JjPXRoaXMudXJsO3ZhciBlPXRoaXMuZ2V0SXNJbWFnZUNvbXBsZXRlKCk7ZSYmKHRoaXMuY29uZmlybSgwIT09dGhpcy5pbWcubmF0dXJhbFdpZHRoLFwibmF0dXJhbFdpZHRoXCIpLHRoaXMudW5iaW5kRXZlbnRzKCkpfSxzLnByb3RvdHlwZS51bmJpbmRFdmVudHM9ZnVuY3Rpb24oKXt0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLHRoaXMpLHRoaXMuaW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLHRoaXMpfSxzLnByb3RvdHlwZS5jb25maXJtPWZ1bmN0aW9uKGUsdCl7dGhpcy5pc0xvYWRlZD1lLHRoaXMuZW1pdEV2ZW50KFwicHJvZ3Jlc3NcIixbdGhpcyx0aGlzLmVsZW1lbnQsdF0pfSxvLm1ha2VKUXVlcnlQbHVnaW49ZnVuY3Rpb24odCl7dD10fHxlLmpRdWVyeSx0JiYoaD10LGguZm4uaW1hZ2VzTG9hZGVkPWZ1bmN0aW9uKGUsdCl7dmFyIGk9bmV3IG8odGhpcyxlLHQpO3JldHVybiBpLmpxRGVmZXJyZWQucHJvbWlzZShoKHRoaXMpKX0pfSxvLm1ha2VKUXVlcnlQbHVnaW4oKSxvfSk7IiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjkuM1xyXG4oZnVuY3Rpb24oKXt2YXIgZTtlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3ZhciBuLHI7dGhpcy5vcHRpb25zPXt0YXJnZXQ6XCJpbnN0YWZlZWRcIixnZXQ6XCJwb3B1bGFyXCIscmVzb2x1dGlvbjpcInRodW1ibmFpbFwiLHNvcnRCeTpcIm5vbmVcIixsaW5rczohMCxtb2NrOiExLHVzZUh0dHA6ITF9O2lmKHR5cGVvZiBlPT1cIm9iamVjdFwiKWZvcihuIGluIGUpcj1lW25dLHRoaXMub3B0aW9uc1tuXT1yO3RoaXMuY29udGV4dD10IT1udWxsP3Q6dGhpcyx0aGlzLnVuaXF1ZT10aGlzLl9nZW5LZXkoKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgdGhpcy5jb250ZXh0Lm5leHRVcmw9PVwic3RyaW5nXCImJnRoaXMuY29udGV4dC5uZXh0VXJsLmxlbmd0aD4wfSxlLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzTmV4dCgpP3RoaXMucnVuKHRoaXMuY29udGV4dC5uZXh0VXJsKTohMX0sZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQpe3ZhciBuLHIsaTtpZih0eXBlb2YgdGhpcy5vcHRpb25zLmNsaWVudElkIT1cInN0cmluZ1wiJiZ0eXBlb2YgdGhpcy5vcHRpb25zLmFjY2Vzc1Rva2VuIT1cInN0cmluZ1wiKXRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgY2xpZW50SWQgb3IgYWNjZXNzVG9rZW4uXCIpO2lmKHR5cGVvZiB0aGlzLm9wdGlvbnMuYWNjZXNzVG9rZW4hPVwic3RyaW5nXCImJnR5cGVvZiB0aGlzLm9wdGlvbnMuY2xpZW50SWQhPVwic3RyaW5nXCIpdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBjbGllbnRJZCBvciBhY2Nlc3NUb2tlbi5cIik7cmV0dXJuIHRoaXMub3B0aW9ucy5iZWZvcmUhPW51bGwmJnR5cGVvZiB0aGlzLm9wdGlvbnMuYmVmb3JlPT1cImZ1bmN0aW9uXCImJnRoaXMub3B0aW9ucy5iZWZvcmUuY2FsbCh0aGlzKSx0eXBlb2YgZG9jdW1lbnQhPVwidW5kZWZpbmVkXCImJmRvY3VtZW50IT09bnVsbCYmKGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSxpLmlkPVwiaW5zdGFmZWVkLWZldGNoZXJcIixpLnNyYz10fHx0aGlzLl9idWlsZFVybCgpLG49ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpLG5bMF0uYXBwZW5kQ2hpbGQoaSkscj1cImluc3RhZmVlZENhY2hlXCIrdGhpcy51bmlxdWUsd2luZG93W3JdPW5ldyBlKHRoaXMub3B0aW9ucyx0aGlzKSx3aW5kb3dbcl0udW5pcXVlPXRoaXMudW5pcXVlKSwhMH0sZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscyxvLHUsYSxmLGwsYyxoLHAsZCx2LG0sZyx5LGIsdyxFLFMseCxULE4sQyxrLEwsQSxPLE0sXyxEO2lmKHR5cGVvZiBlIT1cIm9iamVjdFwiKXtpZih0aGlzLm9wdGlvbnMuZXJyb3IhPW51bGwmJnR5cGVvZiB0aGlzLm9wdGlvbnMuZXJyb3I9PVwiZnVuY3Rpb25cIilyZXR1cm4gdGhpcy5vcHRpb25zLmVycm9yLmNhbGwodGhpcyxcIkludmFsaWQgSlNPTiBkYXRhXCIpLCExO3Rocm93IG5ldyBFcnJvcihcIkludmFsaWQgSlNPTiByZXNwb25zZVwiKX1pZihlLm1ldGEuY29kZSE9PTIwMCl7aWYodGhpcy5vcHRpb25zLmVycm9yIT1udWxsJiZ0eXBlb2YgdGhpcy5vcHRpb25zLmVycm9yPT1cImZ1bmN0aW9uXCIpcmV0dXJuIHRoaXMub3B0aW9ucy5lcnJvci5jYWxsKHRoaXMsZS5tZXRhLmVycm9yX21lc3NhZ2UpLCExO3Rocm93IG5ldyBFcnJvcihcIkVycm9yIGZyb20gSW5zdGFncmFtOiBcIitlLm1ldGEuZXJyb3JfbWVzc2FnZSl9aWYoZS5kYXRhLmxlbmd0aD09PTApe2lmKHRoaXMub3B0aW9ucy5lcnJvciE9bnVsbCYmdHlwZW9mIHRoaXMub3B0aW9ucy5lcnJvcj09XCJmdW5jdGlvblwiKXJldHVybiB0aGlzLm9wdGlvbnMuZXJyb3IuY2FsbCh0aGlzLFwiTm8gaW1hZ2VzIHdlcmUgcmV0dXJuZWQgZnJvbSBJbnN0YWdyYW1cIiksITE7dGhyb3cgbmV3IEVycm9yKFwiTm8gaW1hZ2VzIHdlcmUgcmV0dXJuZWQgZnJvbSBJbnN0YWdyYW1cIil9dGhpcy5vcHRpb25zLnN1Y2Nlc3MhPW51bGwmJnR5cGVvZiB0aGlzLm9wdGlvbnMuc3VjY2Vzcz09XCJmdW5jdGlvblwiJiZ0aGlzLm9wdGlvbnMuc3VjY2Vzcy5jYWxsKHRoaXMsZSksdGhpcy5jb250ZXh0Lm5leHRVcmw9XCJcIixlLnBhZ2luYXRpb24hPW51bGwmJih0aGlzLmNvbnRleHQubmV4dFVybD1lLnBhZ2luYXRpb24ubmV4dF91cmwpO2lmKHRoaXMub3B0aW9ucy5zb3J0QnkhPT1cIm5vbmVcIil7dGhpcy5vcHRpb25zLnNvcnRCeT09PVwicmFuZG9tXCI/TT1bXCJcIixcInJhbmRvbVwiXTpNPXRoaXMub3B0aW9ucy5zb3J0Qnkuc3BsaXQoXCItXCIpLE89TVswXT09PVwibGVhc3RcIj8hMDohMTtzd2l0Y2goTVsxXSl7Y2FzZVwicmFuZG9tXCI6ZS5kYXRhLnNvcnQoZnVuY3Rpb24oKXtyZXR1cm4uNS1NYXRoLnJhbmRvbSgpfSk7YnJlYWs7Y2FzZVwicmVjZW50XCI6ZS5kYXRhPXRoaXMuX3NvcnRCeShlLmRhdGEsXCJjcmVhdGVkX3RpbWVcIixPKTticmVhaztjYXNlXCJsaWtlZFwiOmUuZGF0YT10aGlzLl9zb3J0QnkoZS5kYXRhLFwibGlrZXMuY291bnRcIixPKTticmVhaztjYXNlXCJjb21tZW50ZWRcIjplLmRhdGE9dGhpcy5fc29ydEJ5KGUuZGF0YSxcImNvbW1lbnRzLmNvdW50XCIsTyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9wdGlvbiBmb3Igc29ydEJ5OiAnXCIrdGhpcy5vcHRpb25zLnNvcnRCeStcIicuXCIpfX1pZih0eXBlb2YgZG9jdW1lbnQhPVwidW5kZWZpbmVkXCImJmRvY3VtZW50IT09bnVsbCYmdGhpcy5vcHRpb25zLm1vY2s9PT0hMSl7bT1lLmRhdGEsQT1wYXJzZUludCh0aGlzLm9wdGlvbnMubGltaXQsMTApLHRoaXMub3B0aW9ucy5saW1pdCE9bnVsbCYmbS5sZW5ndGg+QSYmKG09bS5zbGljZSgwLEEpKSx1PWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSx0aGlzLm9wdGlvbnMuZmlsdGVyIT1udWxsJiZ0eXBlb2YgdGhpcy5vcHRpb25zLmZpbHRlcj09XCJmdW5jdGlvblwiJiYobT10aGlzLl9maWx0ZXIobSx0aGlzLm9wdGlvbnMuZmlsdGVyKSk7aWYodGhpcy5vcHRpb25zLnRlbXBsYXRlIT1udWxsJiZ0eXBlb2YgdGhpcy5vcHRpb25zLnRlbXBsYXRlPT1cInN0cmluZ1wiKXtmPVwiXCIsZD1cIlwiLHc9XCJcIixEPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zm9yKGM9MCxOPW0ubGVuZ3RoO2M8TjtjKyspe2g9bVtjXSxwPWguaW1hZ2VzW3RoaXMub3B0aW9ucy5yZXNvbHV0aW9uXTtpZih0eXBlb2YgcCE9XCJvYmplY3RcIil0aHJvdyBvPVwiTm8gaW1hZ2UgZm91bmQgZm9yIHJlc29sdXRpb246IFwiK3RoaXMub3B0aW9ucy5yZXNvbHV0aW9uK1wiLlwiLG5ldyBFcnJvcihvKTtFPXAud2lkdGgseT1wLmhlaWdodCxiPVwic3F1YXJlXCIsRT55JiYoYj1cImxhbmRzY2FwZVwiKSxFPHkmJihiPVwicG9ydHJhaXRcIiksdj1wLnVybCxsPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbC5pbmRleE9mKFwiaHR0cFwiKT49MCxsJiYhdGhpcy5vcHRpb25zLnVzZUh0dHAmJih2PXYucmVwbGFjZSgvaHR0cHM/OlxcL1xcLy8sXCIvL1wiKSksZD10aGlzLl9tYWtlVGVtcGxhdGUodGhpcy5vcHRpb25zLnRlbXBsYXRlLHttb2RlbDpoLGlkOmguaWQsbGluazpoLmxpbmssdHlwZTpoLnR5cGUsaW1hZ2U6dix3aWR0aDpFLGhlaWdodDp5LG9yaWVudGF0aW9uOmIsY2FwdGlvbjp0aGlzLl9nZXRPYmplY3RQcm9wZXJ0eShoLFwiY2FwdGlvbi50ZXh0XCIpLGxpa2VzOmgubGlrZXMuY291bnQsY29tbWVudHM6aC5jb21tZW50cy5jb3VudCxsb2NhdGlvbjp0aGlzLl9nZXRPYmplY3RQcm9wZXJ0eShoLFwibG9jYXRpb24ubmFtZVwiKX0pLGYrPWR9RC5pbm5lckhUTUw9ZixpPVtdLHI9MCxuPUQuY2hpbGROb2Rlcy5sZW5ndGg7d2hpbGUocjxuKWkucHVzaChELmNoaWxkTm9kZXNbcl0pLHIrPTE7Zm9yKHg9MCxDPWkubGVuZ3RoO3g8Qzt4KyspTD1pW3hdLHUuYXBwZW5kQ2hpbGQoTCl9ZWxzZSBmb3IoVD0wLGs9bS5sZW5ndGg7VDxrO1QrKyl7aD1tW1RdLGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKSxwPWguaW1hZ2VzW3RoaXMub3B0aW9ucy5yZXNvbHV0aW9uXTtpZih0eXBlb2YgcCE9XCJvYmplY3RcIil0aHJvdyBvPVwiTm8gaW1hZ2UgZm91bmQgZm9yIHJlc29sdXRpb246IFwiK3RoaXMub3B0aW9ucy5yZXNvbHV0aW9uK1wiLlwiLG5ldyBFcnJvcihvKTt2PXAudXJsLGw9d2luZG93LmxvY2F0aW9uLnByb3RvY29sLmluZGV4T2YoXCJodHRwXCIpPj0wLGwmJiF0aGlzLm9wdGlvbnMudXNlSHR0cCYmKHY9di5yZXBsYWNlKC9odHRwcz86XFwvXFwvLyxcIi8vXCIpKSxnLnNyYz12LHRoaXMub3B0aW9ucy5saW5rcz09PSEwPyh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpLHQuaHJlZj1oLmxpbmssdC5hcHBlbmRDaGlsZChnKSx1LmFwcGVuZENoaWxkKHQpKTp1LmFwcGVuZENoaWxkKGcpfV89dGhpcy5vcHRpb25zLnRhcmdldCx0eXBlb2YgXz09XCJzdHJpbmdcIiYmKF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXykpO2lmKF89PW51bGwpdGhyb3cgbz0nTm8gZWxlbWVudCB3aXRoIGlkPVwiJyt0aGlzLm9wdGlvbnMudGFyZ2V0KydcIiBvbiBwYWdlLicsbmV3IEVycm9yKG8pO18uYXBwZW5kQ2hpbGQodSksYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0sYS5yZW1vdmVDaGlsZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImluc3RhZmVlZC1mZXRjaGVyXCIpKSxTPVwiaW5zdGFmZWVkQ2FjaGVcIit0aGlzLnVuaXF1ZSx3aW5kb3dbU109dm9pZCAwO3RyeXtkZWxldGUgd2luZG93W1NdfWNhdGNoKFApe3M9UH19cmV0dXJuIHRoaXMub3B0aW9ucy5hZnRlciE9bnVsbCYmdHlwZW9mIHRoaXMub3B0aW9ucy5hZnRlcj09XCJmdW5jdGlvblwiJiZ0aGlzLm9wdGlvbnMuYWZ0ZXIuY2FsbCh0aGlzKSwhMH0sZS5wcm90b3R5cGUuX2J1aWxkVXJsPWZ1bmN0aW9uKCl7dmFyIGUsdCxuO2U9XCJodHRwczovL2FwaS5pbnN0YWdyYW0uY29tL3YxXCI7c3dpdGNoKHRoaXMub3B0aW9ucy5nZXQpe2Nhc2VcInBvcHVsYXJcIjp0PVwibWVkaWEvcG9wdWxhclwiO2JyZWFrO2Nhc2VcInRhZ2dlZFwiOmlmKCF0aGlzLm9wdGlvbnMudGFnTmFtZSl0aHJvdyBuZXcgRXJyb3IoXCJObyB0YWcgbmFtZSBzcGVjaWZpZWQuIFVzZSB0aGUgJ3RhZ05hbWUnIG9wdGlvbi5cIik7dD1cInRhZ3MvXCIrdGhpcy5vcHRpb25zLnRhZ05hbWUrXCIvbWVkaWEvcmVjZW50XCI7YnJlYWs7Y2FzZVwibG9jYXRpb25cIjppZighdGhpcy5vcHRpb25zLmxvY2F0aW9uSWQpdGhyb3cgbmV3IEVycm9yKFwiTm8gbG9jYXRpb24gc3BlY2lmaWVkLiBVc2UgdGhlICdsb2NhdGlvbklkJyBvcHRpb24uXCIpO3Q9XCJsb2NhdGlvbnMvXCIrdGhpcy5vcHRpb25zLmxvY2F0aW9uSWQrXCIvbWVkaWEvcmVjZW50XCI7YnJlYWs7Y2FzZVwidXNlclwiOmlmKCF0aGlzLm9wdGlvbnMudXNlcklkKXRocm93IG5ldyBFcnJvcihcIk5vIHVzZXIgc3BlY2lmaWVkLiBVc2UgdGhlICd1c2VySWQnIG9wdGlvbi5cIik7dD1cInVzZXJzL1wiK3RoaXMub3B0aW9ucy51c2VySWQrXCIvbWVkaWEvcmVjZW50XCI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9wdGlvbiBmb3IgZ2V0OiAnXCIrdGhpcy5vcHRpb25zLmdldCtcIicuXCIpfXJldHVybiBuPWUrXCIvXCIrdCx0aGlzLm9wdGlvbnMuYWNjZXNzVG9rZW4hPW51bGw/bis9XCI/YWNjZXNzX3Rva2VuPVwiK3RoaXMub3B0aW9ucy5hY2Nlc3NUb2tlbjpuKz1cIj9jbGllbnRfaWQ9XCIrdGhpcy5vcHRpb25zLmNsaWVudElkLHRoaXMub3B0aW9ucy5saW1pdCE9bnVsbCYmKG4rPVwiJmNvdW50PVwiK3RoaXMub3B0aW9ucy5saW1pdCksbis9XCImY2FsbGJhY2s9aW5zdGFmZWVkQ2FjaGVcIit0aGlzLnVuaXF1ZStcIi5wYXJzZVwiLG59LGUucHJvdG90eXBlLl9nZW5LZXk9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gZT1mdW5jdGlvbigpe3JldHVybigoMStNYXRoLnJhbmRvbSgpKSo2NTUzNnwwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpfSxcIlwiK2UoKStlKCkrZSgpK2UoKX0sZS5wcm90b3R5cGUuX21ha2VUZW1wbGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG87cj0vKD86XFx7ezJ9KShbXFx3XFxbXFxdXFwuXSspKD86XFx9ezJ9KS8sbj1lO3doaWxlKHIudGVzdChuKSlzPW4ubWF0Y2gocilbMV0sbz0oaT10aGlzLl9nZXRPYmplY3RQcm9wZXJ0eSh0LHMpKSE9bnVsbD9pOlwiXCIsbj1uLnJlcGxhY2UocixmdW5jdGlvbigpe3JldHVyblwiXCIrb30pO3JldHVybiBufSxlLnByb3RvdHlwZS5fZ2V0T2JqZWN0UHJvcGVydHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyO3Q9dC5yZXBsYWNlKC9cXFsoXFx3KylcXF0vZyxcIi4kMVwiKSxyPXQuc3BsaXQoXCIuXCIpO3doaWxlKHIubGVuZ3RoKXtuPXIuc2hpZnQoKTtpZighKGUhPW51bGwmJm4gaW4gZSkpcmV0dXJuIG51bGw7ZT1lW25dfXJldHVybiBlfSxlLnByb3RvdHlwZS5fc29ydEJ5PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gcj1mdW5jdGlvbihlLHIpe3ZhciBpLHM7cmV0dXJuIGk9dGhpcy5fZ2V0T2JqZWN0UHJvcGVydHkoZSx0KSxzPXRoaXMuX2dldE9iamVjdFByb3BlcnR5KHIsdCksbj9pPnM/MTotMTppPHM/MTotMX0sZS5zb3J0KHIuYmluZCh0aGlzKSksZX0sZS5wcm90b3R5cGUuX2ZpbHRlcj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG87bj1bXSxyPWZ1bmN0aW9uKGUpe2lmKHQoZSkpcmV0dXJuIG4ucHVzaChlKX07Zm9yKGk9MCxvPWUubGVuZ3RoO2k8bztpKyspcz1lW2ldLHIocyk7cmV0dXJuIG59LGV9KCksZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHlwZW9mIGRlZmluZT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KTp0eXBlb2YgbW9kdWxlPT1cIm9iamVjdFwiJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10KCk6ZS5JbnN0YWZlZWQ9dCgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGV9KX0pLmNhbGwodGhpcyk7IiwiLyohXHJcbiAqIElzb3RvcGUgUEFDS0FHRUQgdjMuMC40XHJcbiAqXHJcbiAqIExpY2Vuc2VkIEdQTHYzIGZvciBvcGVuIHNvdXJjZSB1c2VcclxuICogb3IgSXNvdG9wZSBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlXHJcbiAqXHJcbiAqIGh0dHA6Ly9pc290b3BlLm1ldGFmaXp6eS5jb1xyXG4gKiBDb3B5cmlnaHQgMjAxNyBNZXRhZml6enlcclxuICovXHJcblxyXG4hZnVuY3Rpb24odCxlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFwianF1ZXJ5LWJyaWRnZXQvanF1ZXJ5LWJyaWRnZXRcIixbXCJqcXVlcnlcIl0sZnVuY3Rpb24oaSl7cmV0dXJuIGUodCxpKX0pOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUodCxyZXF1aXJlKFwianF1ZXJ5XCIpKTp0LmpRdWVyeUJyaWRnZXQ9ZSh0LHQualF1ZXJ5KX0od2luZG93LGZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaShpLHMsYSl7ZnVuY3Rpb24gdSh0LGUsbyl7dmFyIG4scz1cIiQoKS5cIitpKycoXCInK2UrJ1wiKSc7cmV0dXJuIHQuZWFjaChmdW5jdGlvbih0LHUpe3ZhciBoPWEuZGF0YSh1LGkpO2lmKCFoKXJldHVybiB2b2lkIHIoaStcIiBub3QgaW5pdGlhbGl6ZWQuIENhbm5vdCBjYWxsIG1ldGhvZHMsIGkuZS4gXCIrcyk7dmFyIGQ9aFtlXTtpZighZHx8XCJfXCI9PWUuY2hhckF0KDApKXJldHVybiB2b2lkIHIocytcIiBpcyBub3QgYSB2YWxpZCBtZXRob2RcIik7dmFyIGw9ZC5hcHBseShoLG8pO249dm9pZCAwPT09bj9sOm59KSx2b2lkIDAhPT1uP246dH1mdW5jdGlvbiBoKHQsZSl7dC5lYWNoKGZ1bmN0aW9uKHQsbyl7dmFyIG49YS5kYXRhKG8saSk7bj8obi5vcHRpb24oZSksbi5faW5pdCgpKToobj1uZXcgcyhvLGUpLGEuZGF0YShvLGksbikpfSl9YT1hfHxlfHx0LmpRdWVyeSxhJiYocy5wcm90b3R5cGUub3B0aW9ufHwocy5wcm90b3R5cGUub3B0aW9uPWZ1bmN0aW9uKHQpe2EuaXNQbGFpbk9iamVjdCh0KSYmKHRoaXMub3B0aW9ucz1hLmV4dGVuZCghMCx0aGlzLm9wdGlvbnMsdCkpfSksYS5mbltpXT1mdW5jdGlvbih0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7dmFyIGU9bi5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdSh0aGlzLHQsZSl9cmV0dXJuIGgodGhpcyx0KSx0aGlzfSxvKGEpKX1mdW5jdGlvbiBvKHQpeyF0fHx0JiZ0LmJyaWRnZXR8fCh0LmJyaWRnZXQ9aSl9dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLHM9dC5jb25zb2xlLHI9XCJ1bmRlZmluZWRcIj09dHlwZW9mIHM/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKHQpe3MuZXJyb3IodCl9O3JldHVybiBvKGV8fHQualF1ZXJ5KSxpfSksZnVuY3Rpb24odCxlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFwiZXYtZW1pdHRlci9ldi1lbWl0dGVyXCIsZSk6XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZSgpOnQuRXZFbWl0dGVyPWUoKX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUub249ZnVuY3Rpb24odCxlKXtpZih0JiZlKXt2YXIgaT10aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSxvPWlbdF09aVt0XXx8W107cmV0dXJuIG8uaW5kZXhPZihlKT09LTEmJm8ucHVzaChlKSx0aGlzfX0sZS5vbmNlPWZ1bmN0aW9uKHQsZSl7aWYodCYmZSl7dGhpcy5vbih0LGUpO3ZhciBpPXRoaXMuX29uY2VFdmVudHM9dGhpcy5fb25jZUV2ZW50c3x8e30sbz1pW3RdPWlbdF18fHt9O3JldHVybiBvW2VdPSEwLHRoaXN9fSxlLm9mZj1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW3RdO2lmKGkmJmkubGVuZ3RoKXt2YXIgbz1pLmluZGV4T2YoZSk7cmV0dXJuIG8hPS0xJiZpLnNwbGljZShvLDEpLHRoaXN9fSxlLmVtaXRFdmVudD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW3RdO2lmKGkmJmkubGVuZ3RoKXt2YXIgbz0wLG49aVtvXTtlPWV8fFtdO2Zvcih2YXIgcz10aGlzLl9vbmNlRXZlbnRzJiZ0aGlzLl9vbmNlRXZlbnRzW3RdO247KXt2YXIgcj1zJiZzW25dO3ImJih0aGlzLm9mZih0LG4pLGRlbGV0ZSBzW25dKSxuLmFwcGx5KHRoaXMsZSksbys9cj8wOjEsbj1pW29dfXJldHVybiB0aGlzfX0sdH0pLGZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcImdldC1zaXplL2dldC1zaXplXCIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZSgpfSk6XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZSgpOnQuZ2V0U2l6ZT1lKCl9KHdpbmRvdyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQodCl7dmFyIGU9cGFyc2VGbG9hdCh0KSxpPXQuaW5kZXhPZihcIiVcIik9PS0xJiYhaXNOYU4oZSk7cmV0dXJuIGkmJmV9ZnVuY3Rpb24gZSgpe31mdW5jdGlvbiBpKCl7Zm9yKHZhciB0PXt3aWR0aDowLGhlaWdodDowLGlubmVyV2lkdGg6MCxpbm5lckhlaWdodDowLG91dGVyV2lkdGg6MCxvdXRlckhlaWdodDowfSxlPTA7ZTxoO2UrKyl7dmFyIGk9dVtlXTt0W2ldPTB9cmV0dXJuIHR9ZnVuY3Rpb24gbyh0KXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKHQpO3JldHVybiBlfHxhKFwiU3R5bGUgcmV0dXJuZWQgXCIrZStcIi4gQXJlIHlvdSBydW5uaW5nIHRoaXMgY29kZSBpbiBhIGhpZGRlbiBpZnJhbWUgb24gRmlyZWZveD8gU2VlIGh0dHA6Ly9iaXQubHkvZ2V0c2l6ZWJ1ZzFcIiksZX1mdW5jdGlvbiBuKCl7aWYoIWQpe2Q9ITA7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlLnN0eWxlLndpZHRoPVwiMjAwcHhcIixlLnN0eWxlLnBhZGRpbmc9XCIxcHggMnB4IDNweCA0cHhcIixlLnN0eWxlLmJvcmRlclN0eWxlPVwic29saWRcIixlLnN0eWxlLmJvcmRlcldpZHRoPVwiMXB4IDJweCAzcHggNHB4XCIsZS5zdHlsZS5ib3hTaXppbmc9XCJib3JkZXItYm94XCI7dmFyIGk9ZG9jdW1lbnQuYm9keXx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2kuYXBwZW5kQ2hpbGQoZSk7dmFyIG49byhlKTtzLmlzQm94U2l6ZU91dGVyPXI9MjAwPT10KG4ud2lkdGgpLGkucmVtb3ZlQ2hpbGQoZSl9fWZ1bmN0aW9uIHMoZSl7aWYobigpLFwic3RyaW5nXCI9PXR5cGVvZiBlJiYoZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpKSxlJiZcIm9iamVjdFwiPT10eXBlb2YgZSYmZS5ub2RlVHlwZSl7dmFyIHM9byhlKTtpZihcIm5vbmVcIj09cy5kaXNwbGF5KXJldHVybiBpKCk7dmFyIGE9e307YS53aWR0aD1lLm9mZnNldFdpZHRoLGEuaGVpZ2h0PWUub2Zmc2V0SGVpZ2h0O2Zvcih2YXIgZD1hLmlzQm9yZGVyQm94PVwiYm9yZGVyLWJveFwiPT1zLmJveFNpemluZyxsPTA7bDxoO2wrKyl7dmFyIGY9dVtsXSxjPXNbZl0sbT1wYXJzZUZsb2F0KGMpO2FbZl09aXNOYU4obSk/MDptfXZhciBwPWEucGFkZGluZ0xlZnQrYS5wYWRkaW5nUmlnaHQseT1hLnBhZGRpbmdUb3ArYS5wYWRkaW5nQm90dG9tLGc9YS5tYXJnaW5MZWZ0K2EubWFyZ2luUmlnaHQsdj1hLm1hcmdpblRvcCthLm1hcmdpbkJvdHRvbSxfPWEuYm9yZGVyTGVmdFdpZHRoK2EuYm9yZGVyUmlnaHRXaWR0aCxJPWEuYm9yZGVyVG9wV2lkdGgrYS5ib3JkZXJCb3R0b21XaWR0aCx6PWQmJnIseD10KHMud2lkdGgpO3ghPT0hMSYmKGEud2lkdGg9eCsoej8wOnArXykpO3ZhciBTPXQocy5oZWlnaHQpO3JldHVybiBTIT09ITEmJihhLmhlaWdodD1TKyh6PzA6eStJKSksYS5pbm5lcldpZHRoPWEud2lkdGgtKHArXyksYS5pbm5lckhlaWdodD1hLmhlaWdodC0oeStJKSxhLm91dGVyV2lkdGg9YS53aWR0aCtnLGEub3V0ZXJIZWlnaHQ9YS5oZWlnaHQrdixhfX12YXIgcixhPVwidW5kZWZpbmVkXCI9PXR5cGVvZiBjb25zb2xlP2U6ZnVuY3Rpb24odCl7Y29uc29sZS5lcnJvcih0KX0sdT1bXCJwYWRkaW5nTGVmdFwiLFwicGFkZGluZ1JpZ2h0XCIsXCJwYWRkaW5nVG9wXCIsXCJwYWRkaW5nQm90dG9tXCIsXCJtYXJnaW5MZWZ0XCIsXCJtYXJnaW5SaWdodFwiLFwibWFyZ2luVG9wXCIsXCJtYXJnaW5Cb3R0b21cIixcImJvcmRlckxlZnRXaWR0aFwiLFwiYm9yZGVyUmlnaHRXaWR0aFwiLFwiYm9yZGVyVG9wV2lkdGhcIixcImJvcmRlckJvdHRvbVdpZHRoXCJdLGg9dS5sZW5ndGgsZD0hMTtyZXR1cm4gc30pLGZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcImRlc2FuZHJvLW1hdGNoZXMtc2VsZWN0b3IvbWF0Y2hlcy1zZWxlY3RvclwiLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUoKTp0Lm1hdGNoZXNTZWxlY3Rvcj1lKCl9KHdpbmRvdyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciB0PWZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlO2lmKHQubWF0Y2hlcylyZXR1cm5cIm1hdGNoZXNcIjtpZih0Lm1hdGNoZXNTZWxlY3RvcilyZXR1cm5cIm1hdGNoZXNTZWxlY3RvclwiO2Zvcih2YXIgZT1bXCJ3ZWJraXRcIixcIm1velwiLFwibXNcIixcIm9cIl0saT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldLG49bytcIk1hdGNoZXNTZWxlY3RvclwiO2lmKHRbbl0pcmV0dXJuIG59fSgpO3JldHVybiBmdW5jdGlvbihlLGkpe3JldHVybiBlW3RdKGkpfX0pLGZ1bmN0aW9uKHQsZSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcImZpenp5LXVpLXV0aWxzL3V0aWxzXCIsW1wiZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3Rvci9tYXRjaGVzLXNlbGVjdG9yXCJdLGZ1bmN0aW9uKGkpe3JldHVybiBlKHQsaSl9KTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHQscmVxdWlyZShcImRlc2FuZHJvLW1hdGNoZXMtc2VsZWN0b3JcIikpOnQuZml6enlVSVV0aWxzPWUodCx0Lm1hdGNoZXNTZWxlY3Rvcil9KHdpbmRvdyxmdW5jdGlvbih0LGUpe3ZhciBpPXt9O2kuZXh0ZW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIGUpdFtpXT1lW2ldO3JldHVybiB0fSxpLm1vZHVsbz1mdW5jdGlvbih0LGUpe3JldHVybih0JWUrZSklZX0saS5tYWtlQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9W107aWYoQXJyYXkuaXNBcnJheSh0KSllPXQ7ZWxzZSBpZih0JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmXCJudW1iZXJcIj09dHlwZW9mIHQubGVuZ3RoKWZvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWUucHVzaCh0W2ldKTtlbHNlIGUucHVzaCh0KTtyZXR1cm4gZX0saS5yZW1vdmVGcm9tPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5pbmRleE9mKGUpO2khPS0xJiZ0LnNwbGljZShpLDEpfSxpLmdldFBhcmVudD1mdW5jdGlvbih0LGkpe2Zvcig7dC5wYXJlbnROb2RlJiZ0IT1kb2N1bWVudC5ib2R5OylpZih0PXQucGFyZW50Tm9kZSxlKHQsaSkpcmV0dXJuIHR9LGkuZ2V0UXVlcnlFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0P2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCk6dH0saS5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXt2YXIgZT1cIm9uXCIrdC50eXBlO3RoaXNbZV0mJnRoaXNbZV0odCl9LGkuZmlsdGVyRmluZEVsZW1lbnRzPWZ1bmN0aW9uKHQsbyl7dD1pLm1ha2VBcnJheSh0KTt2YXIgbj1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCl7aWYoIW8pcmV0dXJuIHZvaWQgbi5wdXNoKHQpO2UodCxvKSYmbi5wdXNoKHQpO2Zvcih2YXIgaT10LnF1ZXJ5U2VsZWN0b3JBbGwobykscz0wO3M8aS5sZW5ndGg7cysrKW4ucHVzaChpW3NdKX19KSxufSxpLmRlYm91bmNlTWV0aG9kPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10LnByb3RvdHlwZVtlXSxuPWUrXCJUaW1lb3V0XCI7dC5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgdD10aGlzW25dO3QmJmNsZWFyVGltZW91dCh0KTt2YXIgZT1hcmd1bWVudHMscz10aGlzO3RoaXNbbl09c2V0VGltZW91dChmdW5jdGlvbigpe28uYXBwbHkocyxlKSxkZWxldGUgc1tuXX0saXx8MTAwKX19LGkuZG9jUmVhZHk9ZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQucmVhZHlTdGF0ZTtcImNvbXBsZXRlXCI9PWV8fFwiaW50ZXJhY3RpdmVcIj09ZT9zZXRUaW1lb3V0KHQpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsdCl9LGkudG9EYXNoZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvKC4pKFtBLVpdKS9nLGZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gZStcIi1cIitpfSkudG9Mb3dlckNhc2UoKX07dmFyIG89dC5jb25zb2xlO3JldHVybiBpLmh0bWxJbml0PWZ1bmN0aW9uKGUsbil7aS5kb2NSZWFkeShmdW5jdGlvbigpe3ZhciBzPWkudG9EYXNoZWQobikscj1cImRhdGEtXCIrcyxhPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIrcitcIl1cIiksdT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmpzLVwiK3MpLGg9aS5tYWtlQXJyYXkoYSkuY29uY2F0KGkubWFrZUFycmF5KHUpKSxkPXIrXCItb3B0aW9uc1wiLGw9dC5qUXVlcnk7aC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBpLHM9dC5nZXRBdHRyaWJ1dGUocil8fHQuZ2V0QXR0cmlidXRlKGQpO3RyeXtpPXMmJkpTT04ucGFyc2Uocyl9Y2F0Y2goYSl7cmV0dXJuIHZvaWQobyYmby5lcnJvcihcIkVycm9yIHBhcnNpbmcgXCIrcitcIiBvbiBcIit0LmNsYXNzTmFtZStcIjogXCIrYSkpfXZhciB1PW5ldyBlKHQsaSk7bCYmbC5kYXRhKHQsbix1KX0pfSl9LGl9KSxmdW5jdGlvbih0LGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJvdXRsYXllci9pdGVtXCIsW1wiZXYtZW1pdHRlci9ldi1lbWl0dGVyXCIsXCJnZXQtc2l6ZS9nZXQtc2l6ZVwiXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJldi1lbWl0dGVyXCIpLHJlcXVpcmUoXCJnZXQtc2l6ZVwiKSk6KHQuT3V0bGF5ZXI9e30sdC5PdXRsYXllci5JdGVtPWUodC5FdkVtaXR0ZXIsdC5nZXRTaXplKSl9KHdpbmRvdyxmdW5jdGlvbih0LGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGkodCl7Zm9yKHZhciBlIGluIHQpcmV0dXJuITE7cmV0dXJuIGU9bnVsbCwhMH1mdW5jdGlvbiBvKHQsZSl7dCYmKHRoaXMuZWxlbWVudD10LHRoaXMubGF5b3V0PWUsdGhpcy5wb3NpdGlvbj17eDowLHk6MH0sdGhpcy5fY3JlYXRlKCkpfWZ1bmN0aW9uIG4odCl7cmV0dXJuIHQucmVwbGFjZSgvKFtBLVpdKS9nLGZ1bmN0aW9uKHQpe3JldHVyblwiLVwiK3QudG9Mb3dlckNhc2UoKX0pfXZhciBzPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxyPVwic3RyaW5nXCI9PXR5cGVvZiBzLnRyYW5zaXRpb24/XCJ0cmFuc2l0aW9uXCI6XCJXZWJraXRUcmFuc2l0aW9uXCIsYT1cInN0cmluZ1wiPT10eXBlb2Ygcy50cmFuc2Zvcm0/XCJ0cmFuc2Zvcm1cIjpcIldlYmtpdFRyYW5zZm9ybVwiLHU9e1dlYmtpdFRyYW5zaXRpb246XCJ3ZWJraXRUcmFuc2l0aW9uRW5kXCIsdHJhbnNpdGlvbjpcInRyYW5zaXRpb25lbmRcIn1bcl0saD17dHJhbnNmb3JtOmEsdHJhbnNpdGlvbjpyLHRyYW5zaXRpb25EdXJhdGlvbjpyK1wiRHVyYXRpb25cIix0cmFuc2l0aW9uUHJvcGVydHk6citcIlByb3BlcnR5XCIsdHJhbnNpdGlvbkRlbGF5OnIrXCJEZWxheVwifSxkPW8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2QuY29uc3RydWN0b3I9byxkLl9jcmVhdGU9ZnVuY3Rpb24oKXt0aGlzLl90cmFuc249e2luZ1Byb3BlcnRpZXM6e30sY2xlYW46e30sb25FbmQ6e319LHRoaXMuY3NzKHtwb3NpdGlvbjpcImFic29sdXRlXCJ9KX0sZC5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXt2YXIgZT1cIm9uXCIrdC50eXBlO3RoaXNbZV0mJnRoaXNbZV0odCl9LGQuZ2V0U2l6ZT1mdW5jdGlvbigpe3RoaXMuc2l6ZT1lKHRoaXMuZWxlbWVudCl9LGQuY3NzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWxlbWVudC5zdHlsZTtmb3IodmFyIGkgaW4gdCl7dmFyIG89aFtpXXx8aTtlW29dPXRbaV19fSxkLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9Z2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpLGU9dGhpcy5sYXlvdXQuX2dldE9wdGlvbihcIm9yaWdpbkxlZnRcIiksaT10aGlzLmxheW91dC5fZ2V0T3B0aW9uKFwib3JpZ2luVG9wXCIpLG89dFtlP1wibGVmdFwiOlwicmlnaHRcIl0sbj10W2k/XCJ0b3BcIjpcImJvdHRvbVwiXSxzPXRoaXMubGF5b3V0LnNpemUscj1vLmluZGV4T2YoXCIlXCIpIT0tMT9wYXJzZUZsb2F0KG8pLzEwMCpzLndpZHRoOnBhcnNlSW50KG8sMTApLGE9bi5pbmRleE9mKFwiJVwiKSE9LTE/cGFyc2VGbG9hdChuKS8xMDAqcy5oZWlnaHQ6cGFyc2VJbnQobiwxMCk7cj1pc05hTihyKT8wOnIsYT1pc05hTihhKT8wOmEsci09ZT9zLnBhZGRpbmdMZWZ0OnMucGFkZGluZ1JpZ2h0LGEtPWk/cy5wYWRkaW5nVG9wOnMucGFkZGluZ0JvdHRvbSx0aGlzLnBvc2l0aW9uLng9cix0aGlzLnBvc2l0aW9uLnk9YX0sZC5sYXlvdXRQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGF5b3V0LnNpemUsZT17fSxpPXRoaXMubGF5b3V0Ll9nZXRPcHRpb24oXCJvcmlnaW5MZWZ0XCIpLG89dGhpcy5sYXlvdXQuX2dldE9wdGlvbihcIm9yaWdpblRvcFwiKSxuPWk/XCJwYWRkaW5nTGVmdFwiOlwicGFkZGluZ1JpZ2h0XCIscz1pP1wibGVmdFwiOlwicmlnaHRcIixyPWk/XCJyaWdodFwiOlwibGVmdFwiLGE9dGhpcy5wb3NpdGlvbi54K3Rbbl07ZVtzXT10aGlzLmdldFhWYWx1ZShhKSxlW3JdPVwiXCI7dmFyIHU9bz9cInBhZGRpbmdUb3BcIjpcInBhZGRpbmdCb3R0b21cIixoPW8/XCJ0b3BcIjpcImJvdHRvbVwiLGQ9bz9cImJvdHRvbVwiOlwidG9wXCIsbD10aGlzLnBvc2l0aW9uLnkrdFt1XTtlW2hdPXRoaXMuZ2V0WVZhbHVlKGwpLGVbZF09XCJcIix0aGlzLmNzcyhlKSx0aGlzLmVtaXRFdmVudChcImxheW91dFwiLFt0aGlzXSl9LGQuZ2V0WFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGF5b3V0Ll9nZXRPcHRpb24oXCJob3Jpem9udGFsXCIpO3JldHVybiB0aGlzLmxheW91dC5vcHRpb25zLnBlcmNlbnRQb3NpdGlvbiYmIWU/dC90aGlzLmxheW91dC5zaXplLndpZHRoKjEwMCtcIiVcIjp0K1wicHhcIn0sZC5nZXRZVmFsdWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXlvdXQuX2dldE9wdGlvbihcImhvcml6b250YWxcIik7cmV0dXJuIHRoaXMubGF5b3V0Lm9wdGlvbnMucGVyY2VudFBvc2l0aW9uJiZlP3QvdGhpcy5sYXlvdXQuc2l6ZS5oZWlnaHQqMTAwK1wiJVwiOnQrXCJweFwifSxkLl90cmFuc2l0aW9uVG89ZnVuY3Rpb24odCxlKXt0aGlzLmdldFBvc2l0aW9uKCk7dmFyIGk9dGhpcy5wb3NpdGlvbi54LG89dGhpcy5wb3NpdGlvbi55LG49cGFyc2VJbnQodCwxMCkscz1wYXJzZUludChlLDEwKSxyPW49PT10aGlzLnBvc2l0aW9uLngmJnM9PT10aGlzLnBvc2l0aW9uLnk7aWYodGhpcy5zZXRQb3NpdGlvbih0LGUpLHImJiF0aGlzLmlzVHJhbnNpdGlvbmluZylyZXR1cm4gdm9pZCB0aGlzLmxheW91dFBvc2l0aW9uKCk7dmFyIGE9dC1pLHU9ZS1vLGg9e307aC50cmFuc2Zvcm09dGhpcy5nZXRUcmFuc2xhdGUoYSx1KSx0aGlzLnRyYW5zaXRpb24oe3RvOmgsb25UcmFuc2l0aW9uRW5kOnt0cmFuc2Zvcm06dGhpcy5sYXlvdXRQb3NpdGlvbn0saXNDbGVhbmluZzohMH0pfSxkLmdldFRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMubGF5b3V0Ll9nZXRPcHRpb24oXCJvcmlnaW5MZWZ0XCIpLG89dGhpcy5sYXlvdXQuX2dldE9wdGlvbihcIm9yaWdpblRvcFwiKTtyZXR1cm4gdD1pP3Q6LXQsZT1vP2U6LWUsXCJ0cmFuc2xhdGUzZChcIit0K1wicHgsIFwiK2UrXCJweCwgMClcIn0sZC5nb1RvPWZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRQb3NpdGlvbih0LGUpLHRoaXMubGF5b3V0UG9zaXRpb24oKX0sZC5tb3ZlVG89ZC5fdHJhbnNpdGlvblRvLGQuc2V0UG9zaXRpb249ZnVuY3Rpb24odCxlKXt0aGlzLnBvc2l0aW9uLng9cGFyc2VJbnQodCwxMCksdGhpcy5wb3NpdGlvbi55PXBhcnNlSW50KGUsMTApfSxkLl9ub25UcmFuc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuY3NzKHQudG8pLHQuaXNDbGVhbmluZyYmdGhpcy5fcmVtb3ZlU3R5bGVzKHQudG8pO2Zvcih2YXIgZSBpbiB0Lm9uVHJhbnNpdGlvbkVuZCl0Lm9uVHJhbnNpdGlvbkVuZFtlXS5jYWxsKHRoaXMpfSxkLnRyYW5zaXRpb249ZnVuY3Rpb24odCl7aWYoIXBhcnNlRmxvYXQodGhpcy5sYXlvdXQub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb24pKXJldHVybiB2b2lkIHRoaXMuX25vblRyYW5zaXRpb24odCk7dmFyIGU9dGhpcy5fdHJhbnNuO2Zvcih2YXIgaSBpbiB0Lm9uVHJhbnNpdGlvbkVuZCllLm9uRW5kW2ldPXQub25UcmFuc2l0aW9uRW5kW2ldO2ZvcihpIGluIHQudG8pZS5pbmdQcm9wZXJ0aWVzW2ldPSEwLHQuaXNDbGVhbmluZyYmKGUuY2xlYW5baV09ITApO2lmKHQuZnJvbSl7dGhpcy5jc3ModC5mcm9tKTt2YXIgbz10aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O289bnVsbH10aGlzLmVuYWJsZVRyYW5zaXRpb24odC50byksdGhpcy5jc3ModC50byksdGhpcy5pc1RyYW5zaXRpb25pbmc9ITB9O3ZhciBsPVwib3BhY2l0eSxcIituKGEpO2QuZW5hYmxlVHJhbnNpdGlvbj1mdW5jdGlvbigpe2lmKCF0aGlzLmlzVHJhbnNpdGlvbmluZyl7dmFyIHQ9dGhpcy5sYXlvdXQub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb247dD1cIm51bWJlclwiPT10eXBlb2YgdD90K1wibXNcIjp0LHRoaXMuY3NzKHt0cmFuc2l0aW9uUHJvcGVydHk6bCx0cmFuc2l0aW9uRHVyYXRpb246dCx0cmFuc2l0aW9uRGVsYXk6dGhpcy5zdGFnZ2VyRGVsYXl8fDB9KSx0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih1LHRoaXMsITEpfX0sZC5vbndlYmtpdFRyYW5zaXRpb25FbmQ9ZnVuY3Rpb24odCl7dGhpcy5vbnRyYW5zaXRpb25lbmQodCl9LGQub25vdHJhbnNpdGlvbmVuZD1mdW5jdGlvbih0KXt0aGlzLm9udHJhbnNpdGlvbmVuZCh0KX07dmFyIGY9e1wiLXdlYmtpdC10cmFuc2Zvcm1cIjpcInRyYW5zZm9ybVwifTtkLm9udHJhbnNpdGlvbmVuZD1mdW5jdGlvbih0KXtpZih0LnRhcmdldD09PXRoaXMuZWxlbWVudCl7dmFyIGU9dGhpcy5fdHJhbnNuLG89Zlt0LnByb3BlcnR5TmFtZV18fHQucHJvcGVydHlOYW1lO2lmKGRlbGV0ZSBlLmluZ1Byb3BlcnRpZXNbb10saShlLmluZ1Byb3BlcnRpZXMpJiZ0aGlzLmRpc2FibGVUcmFuc2l0aW9uKCksbyBpbiBlLmNsZWFuJiYodGhpcy5lbGVtZW50LnN0eWxlW3QucHJvcGVydHlOYW1lXT1cIlwiLGRlbGV0ZSBlLmNsZWFuW29dKSxvIGluIGUub25FbmQpe3ZhciBuPWUub25FbmRbb107bi5jYWxsKHRoaXMpLGRlbGV0ZSBlLm9uRW5kW29dfXRoaXMuZW1pdEV2ZW50KFwidHJhbnNpdGlvbkVuZFwiLFt0aGlzXSl9fSxkLmRpc2FibGVUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVUcmFuc2l0aW9uU3R5bGVzKCksdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodSx0aGlzLCExKSx0aGlzLmlzVHJhbnNpdGlvbmluZz0hMX0sZC5fcmVtb3ZlU3R5bGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Zvcih2YXIgaSBpbiB0KWVbaV09XCJcIjt0aGlzLmNzcyhlKX07dmFyIGM9e3RyYW5zaXRpb25Qcm9wZXJ0eTpcIlwiLHRyYW5zaXRpb25EdXJhdGlvbjpcIlwiLHRyYW5zaXRpb25EZWxheTpcIlwifTtyZXR1cm4gZC5yZW1vdmVUcmFuc2l0aW9uU3R5bGVzPWZ1bmN0aW9uKCl7dGhpcy5jc3MoYyl9LGQuc3RhZ2dlcj1mdW5jdGlvbih0KXt0PWlzTmFOKHQpPzA6dCx0aGlzLnN0YWdnZXJEZWxheT10K1wibXNcIn0sZC5yZW1vdmVFbGVtPWZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLmNzcyh7ZGlzcGxheTpcIlwifSksdGhpcy5lbWl0RXZlbnQoXCJyZW1vdmVcIixbdGhpc10pfSxkLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiByJiZwYXJzZUZsb2F0KHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uKT8odGhpcy5vbmNlKFwidHJhbnNpdGlvbkVuZFwiLGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVFbGVtKCl9KSx2b2lkIHRoaXMuaGlkZSgpKTp2b2lkIHRoaXMucmVtb3ZlRWxlbSgpfSxkLnJldmVhbD1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmlzSGlkZGVuLHRoaXMuY3NzKHtkaXNwbGF5OlwiXCJ9KTt2YXIgdD10aGlzLmxheW91dC5vcHRpb25zLGU9e30saT10aGlzLmdldEhpZGVSZXZlYWxUcmFuc2l0aW9uRW5kUHJvcGVydHkoXCJ2aXNpYmxlU3R5bGVcIik7ZVtpXT10aGlzLm9uUmV2ZWFsVHJhbnNpdGlvbkVuZCx0aGlzLnRyYW5zaXRpb24oe2Zyb206dC5oaWRkZW5TdHlsZSx0bzp0LnZpc2libGVTdHlsZSxpc0NsZWFuaW5nOiEwLG9uVHJhbnNpdGlvbkVuZDplfSl9LGQub25SZXZlYWxUcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKCl7dGhpcy5pc0hpZGRlbnx8dGhpcy5lbWl0RXZlbnQoXCJyZXZlYWxcIil9LGQuZ2V0SGlkZVJldmVhbFRyYW5zaXRpb25FbmRQcm9wZXJ0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmxheW91dC5vcHRpb25zW3RdO2lmKGUub3BhY2l0eSlyZXR1cm5cIm9wYWNpdHlcIjtmb3IodmFyIGkgaW4gZSlyZXR1cm4gaX0sZC5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5pc0hpZGRlbj0hMCx0aGlzLmNzcyh7ZGlzcGxheTpcIlwifSk7dmFyIHQ9dGhpcy5sYXlvdXQub3B0aW9ucyxlPXt9LGk9dGhpcy5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5KFwiaGlkZGVuU3R5bGVcIik7ZVtpXT10aGlzLm9uSGlkZVRyYW5zaXRpb25FbmQsdGhpcy50cmFuc2l0aW9uKHtmcm9tOnQudmlzaWJsZVN0eWxlLHRvOnQuaGlkZGVuU3R5bGUsaXNDbGVhbmluZzohMCxvblRyYW5zaXRpb25FbmQ6ZX0pfSxkLm9uSGlkZVRyYW5zaXRpb25FbmQ9ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVuJiYodGhpcy5jc3Moe2Rpc3BsYXk6XCJub25lXCJ9KSx0aGlzLmVtaXRFdmVudChcImhpZGVcIikpfSxkLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNzcyh7cG9zaXRpb246XCJcIixsZWZ0OlwiXCIscmlnaHQ6XCJcIix0b3A6XCJcIixib3R0b206XCJcIix0cmFuc2l0aW9uOlwiXCIsdHJhbnNmb3JtOlwiXCJ9KX0sb30pLGZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcIm91dGxheWVyL291dGxheWVyXCIsW1wiZXYtZW1pdHRlci9ldi1lbWl0dGVyXCIsXCJnZXQtc2l6ZS9nZXQtc2l6ZVwiLFwiZml6enktdWktdXRpbHMvdXRpbHNcIixcIi4vaXRlbVwiXSxmdW5jdGlvbihpLG8sbixzKXtyZXR1cm4gZSh0LGksbyxuLHMpfSk6XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZSh0LHJlcXVpcmUoXCJldi1lbWl0dGVyXCIpLHJlcXVpcmUoXCJnZXQtc2l6ZVwiKSxyZXF1aXJlKFwiZml6enktdWktdXRpbHNcIikscmVxdWlyZShcIi4vaXRlbVwiKSk6dC5PdXRsYXllcj1lKHQsdC5FdkVtaXR0ZXIsdC5nZXRTaXplLHQuZml6enlVSVV0aWxzLHQuT3V0bGF5ZXIuSXRlbSl9KHdpbmRvdyxmdW5jdGlvbih0LGUsaSxvLG4pe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHModCxlKXt2YXIgaT1vLmdldFF1ZXJ5RWxlbWVudCh0KTtpZighaSlyZXR1cm4gdm9pZCh1JiZ1LmVycm9yKFwiQmFkIGVsZW1lbnQgZm9yIFwiK3RoaXMuY29uc3RydWN0b3IubmFtZXNwYWNlK1wiOiBcIisoaXx8dCkpKTt0aGlzLmVsZW1lbnQ9aSxoJiYodGhpcy4kZWxlbWVudD1oKHRoaXMuZWxlbWVudCkpLHRoaXMub3B0aW9ucz1vLmV4dGVuZCh7fSx0aGlzLmNvbnN0cnVjdG9yLmRlZmF1bHRzKSx0aGlzLm9wdGlvbihlKTt2YXIgbj0rK2w7dGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRD1uLGZbbl09dGhpcyx0aGlzLl9jcmVhdGUoKTt2YXIgcz10aGlzLl9nZXRPcHRpb24oXCJpbml0TGF5b3V0XCIpO3MmJnRoaXMubGF5b3V0KCl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX1mdW5jdGlvbiBhKHQpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXJldHVybiB0O3ZhciBlPXQubWF0Y2goLyheXFxkKlxcLj9cXGQqKShcXHcqKS8pLGk9ZSYmZVsxXSxvPWUmJmVbMl07aWYoIWkubGVuZ3RoKXJldHVybiAwO2k9cGFyc2VGbG9hdChpKTt2YXIgbj1tW29dfHwxO3JldHVybiBpKm59dmFyIHU9dC5jb25zb2xlLGg9dC5qUXVlcnksZD1mdW5jdGlvbigpe30sbD0wLGY9e307cy5uYW1lc3BhY2U9XCJvdXRsYXllclwiLHMuSXRlbT1uLHMuZGVmYXVsdHM9e2NvbnRhaW5lclN0eWxlOntwb3NpdGlvbjpcInJlbGF0aXZlXCJ9LGluaXRMYXlvdXQ6ITAsb3JpZ2luTGVmdDohMCxvcmlnaW5Ub3A6ITAscmVzaXplOiEwLHJlc2l6ZUNvbnRhaW5lcjohMCx0cmFuc2l0aW9uRHVyYXRpb246XCIwLjRzXCIsaGlkZGVuU3R5bGU6e29wYWNpdHk6MCx0cmFuc2Zvcm06XCJzY2FsZSgwLjAwMSlcIn0sdmlzaWJsZVN0eWxlOntvcGFjaXR5OjEsdHJhbnNmb3JtOlwic2NhbGUoMSlcIn19O3ZhciBjPXMucHJvdG90eXBlO28uZXh0ZW5kKGMsZS5wcm90b3R5cGUpLGMub3B0aW9uPWZ1bmN0aW9uKHQpe28uZXh0ZW5kKHRoaXMub3B0aW9ucyx0KX0sYy5fZ2V0T3B0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IuY29tcGF0T3B0aW9uc1t0XTtyZXR1cm4gZSYmdm9pZCAwIT09dGhpcy5vcHRpb25zW2VdP3RoaXMub3B0aW9uc1tlXTp0aGlzLm9wdGlvbnNbdF19LHMuY29tcGF0T3B0aW9ucz17aW5pdExheW91dDpcImlzSW5pdExheW91dFwiLGhvcml6b250YWw6XCJpc0hvcml6b250YWxcIixsYXlvdXRJbnN0YW50OlwiaXNMYXlvdXRJbnN0YW50XCIsb3JpZ2luTGVmdDpcImlzT3JpZ2luTGVmdFwiLG9yaWdpblRvcDpcImlzT3JpZ2luVG9wXCIscmVzaXplOlwiaXNSZXNpemVCb3VuZFwiLHJlc2l6ZUNvbnRhaW5lcjpcImlzUmVzaXppbmdDb250YWluZXJcIn0sYy5fY3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5yZWxvYWRJdGVtcygpLHRoaXMuc3RhbXBzPVtdLHRoaXMuc3RhbXAodGhpcy5vcHRpb25zLnN0YW1wKSxvLmV4dGVuZCh0aGlzLmVsZW1lbnQuc3R5bGUsdGhpcy5vcHRpb25zLmNvbnRhaW5lclN0eWxlKTt2YXIgdD10aGlzLl9nZXRPcHRpb24oXCJyZXNpemVcIik7dCYmdGhpcy5iaW5kUmVzaXplKCl9LGMucmVsb2FkSXRlbXM9ZnVuY3Rpb24oKXt0aGlzLml0ZW1zPXRoaXMuX2l0ZW1pemUodGhpcy5lbGVtZW50LmNoaWxkcmVuKX0sYy5faXRlbWl6ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fZmlsdGVyRmluZEl0ZW1FbGVtZW50cyh0KSxpPXRoaXMuY29uc3RydWN0b3IuSXRlbSxvPVtdLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHM9ZVtuXSxyPW5ldyBpKHMsdGhpcyk7by5wdXNoKHIpfXJldHVybiBvfSxjLl9maWx0ZXJGaW5kSXRlbUVsZW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLmZpbHRlckZpbmRFbGVtZW50cyh0LHRoaXMub3B0aW9ucy5pdGVtU2VsZWN0b3IpfSxjLmdldEl0ZW1FbGVtZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZW1zLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5lbGVtZW50fSl9LGMubGF5b3V0PWZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRMYXlvdXQoKSx0aGlzLl9tYW5hZ2VTdGFtcHMoKTt2YXIgdD10aGlzLl9nZXRPcHRpb24oXCJsYXlvdXRJbnN0YW50XCIpLGU9dm9pZCAwIT09dD90OiF0aGlzLl9pc0xheW91dEluaXRlZDt0aGlzLmxheW91dEl0ZW1zKHRoaXMuaXRlbXMsZSksdGhpcy5faXNMYXlvdXRJbml0ZWQ9ITB9LGMuX2luaXQ9Yy5sYXlvdXQsYy5fcmVzZXRMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLmdldFNpemUoKX0sYy5nZXRTaXplPWZ1bmN0aW9uKCl7dGhpcy5zaXplPWkodGhpcy5lbGVtZW50KX0sYy5fZ2V0TWVhc3VyZW1lbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbyxuPXRoaXMub3B0aW9uc1t0XTtuPyhcInN0cmluZ1wiPT10eXBlb2Ygbj9vPXRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKG4pOm4gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmKG89biksdGhpc1t0XT1vP2kobylbZV06bik6dGhpc1t0XT0wfSxjLmxheW91dEl0ZW1zPWZ1bmN0aW9uKHQsZSl7dD10aGlzLl9nZXRJdGVtc0ZvckxheW91dCh0KSx0aGlzLl9sYXlvdXRJdGVtcyh0LGUpLHRoaXMuX3Bvc3RMYXlvdXQoKX0sYy5fZ2V0SXRlbXNGb3JMYXlvdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiF0LmlzSWdub3JlZH0pfSxjLl9sYXlvdXRJdGVtcz1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoXCJsYXlvdXRcIix0KSx0JiZ0Lmxlbmd0aCl7dmFyIGk9W107dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBvPXRoaXMuX2dldEl0ZW1MYXlvdXRQb3NpdGlvbih0KTtvLml0ZW09dCxvLmlzSW5zdGFudD1lfHx0LmlzTGF5b3V0SW5zdGFudCxpLnB1c2gobyl9LHRoaXMpLHRoaXMuX3Byb2Nlc3NMYXlvdXRRdWV1ZShpKX19LGMuX2dldEl0ZW1MYXlvdXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybnt4OjAseTowfX0sYy5fcHJvY2Vzc0xheW91dFF1ZXVlPWZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlU3RhZ2dlcigpLHQuZm9yRWFjaChmdW5jdGlvbih0LGUpe3RoaXMuX3Bvc2l0aW9uSXRlbSh0Lml0ZW0sdC54LHQueSx0LmlzSW5zdGFudCxlKX0sdGhpcyl9LGMudXBkYXRlU3RhZ2dlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5zdGFnZ2VyO3JldHVybiBudWxsPT09dHx8dm9pZCAwPT09dD92b2lkKHRoaXMuc3RhZ2dlcj0wKToodGhpcy5zdGFnZ2VyPWEodCksdGhpcy5zdGFnZ2VyKX0sYy5fcG9zaXRpb25JdGVtPWZ1bmN0aW9uKHQsZSxpLG8sbil7bz90LmdvVG8oZSxpKToodC5zdGFnZ2VyKG4qdGhpcy5zdGFnZ2VyKSx0Lm1vdmVUbyhlLGkpKX0sYy5fcG9zdExheW91dD1mdW5jdGlvbigpe3RoaXMucmVzaXplQ29udGFpbmVyKCl9LGMucmVzaXplQ29udGFpbmVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0T3B0aW9uKFwicmVzaXplQ29udGFpbmVyXCIpO2lmKHQpe3ZhciBlPXRoaXMuX2dldENvbnRhaW5lclNpemUoKTtlJiYodGhpcy5fc2V0Q29udGFpbmVyTWVhc3VyZShlLndpZHRoLCEwKSx0aGlzLl9zZXRDb250YWluZXJNZWFzdXJlKGUuaGVpZ2h0LCExKSl9fSxjLl9nZXRDb250YWluZXJTaXplPWQsYy5fc2V0Q29udGFpbmVyTWVhc3VyZT1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXQpe3ZhciBpPXRoaXMuc2l6ZTtpLmlzQm9yZGVyQm94JiYodCs9ZT9pLnBhZGRpbmdMZWZ0K2kucGFkZGluZ1JpZ2h0K2kuYm9yZGVyTGVmdFdpZHRoK2kuYm9yZGVyUmlnaHRXaWR0aDppLnBhZGRpbmdCb3R0b20raS5wYWRkaW5nVG9wK2kuYm9yZGVyVG9wV2lkdGgraS5ib3JkZXJCb3R0b21XaWR0aCksdD1NYXRoLm1heCh0LDApLHRoaXMuZWxlbWVudC5zdHlsZVtlP1wid2lkdGhcIjpcImhlaWdodFwiXT10K1wicHhcIn19LGMuX2VtaXRDb21wbGV0ZU9uSXRlbXM9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKCl7bi5kaXNwYXRjaEV2ZW50KHQrXCJDb21wbGV0ZVwiLG51bGwsW2VdKX1mdW5jdGlvbiBvKCl7cisrLHI9PXMmJmkoKX12YXIgbj10aGlzLHM9ZS5sZW5ndGg7aWYoIWV8fCFzKXJldHVybiB2b2lkIGkoKTt2YXIgcj0wO2UuZm9yRWFjaChmdW5jdGlvbihlKXtlLm9uY2UodCxvKX0pfSxjLmRpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWU/W2VdLmNvbmNhdChpKTppO2lmKHRoaXMuZW1pdEV2ZW50KHQsbyksaClpZih0aGlzLiRlbGVtZW50PXRoaXMuJGVsZW1lbnR8fGgodGhpcy5lbGVtZW50KSxlKXt2YXIgbj1oLkV2ZW50KGUpO24udHlwZT10LHRoaXMuJGVsZW1lbnQudHJpZ2dlcihuLGkpfWVsc2UgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHQsaSl9LGMuaWdub3JlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0SXRlbSh0KTtlJiYoZS5pc0lnbm9yZWQ9ITApfSxjLnVuaWdub3JlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0SXRlbSh0KTtlJiZkZWxldGUgZS5pc0lnbm9yZWR9LGMuc3RhbXA9ZnVuY3Rpb24odCl7dD10aGlzLl9maW5kKHQpLHQmJih0aGlzLnN0YW1wcz10aGlzLnN0YW1wcy5jb25jYXQodCksdC5mb3JFYWNoKHRoaXMuaWdub3JlLHRoaXMpKX0sYy51bnN0YW1wPWZ1bmN0aW9uKHQpe3Q9dGhpcy5fZmluZCh0KSx0JiZ0LmZvckVhY2goZnVuY3Rpb24odCl7by5yZW1vdmVGcm9tKHRoaXMuc3RhbXBzLHQpLHRoaXMudW5pZ25vcmUodCl9LHRoaXMpfSxjLl9maW5kPWZ1bmN0aW9uKHQpe2lmKHQpcmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQmJih0PXRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKSx0PW8ubWFrZUFycmF5KHQpfSxjLl9tYW5hZ2VTdGFtcHM9ZnVuY3Rpb24oKXt0aGlzLnN0YW1wcyYmdGhpcy5zdGFtcHMubGVuZ3RoJiYodGhpcy5fZ2V0Qm91bmRpbmdSZWN0KCksdGhpcy5zdGFtcHMuZm9yRWFjaCh0aGlzLl9tYW5hZ2VTdGFtcCx0aGlzKSl9LGMuX2dldEJvdW5kaW5nUmVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlPXRoaXMuc2l6ZTt0aGlzLl9ib3VuZGluZ1JlY3Q9e2xlZnQ6dC5sZWZ0K2UucGFkZGluZ0xlZnQrZS5ib3JkZXJMZWZ0V2lkdGgsdG9wOnQudG9wK2UucGFkZGluZ1RvcCtlLmJvcmRlclRvcFdpZHRoLHJpZ2h0OnQucmlnaHQtKGUucGFkZGluZ1JpZ2h0K2UuYm9yZGVyUmlnaHRXaWR0aCksYm90dG9tOnQuYm90dG9tLShlLnBhZGRpbmdCb3R0b20rZS5ib3JkZXJCb3R0b21XaWR0aCl9fSxjLl9tYW5hZ2VTdGFtcD1kLGMuX2dldEVsZW1lbnRPZmZzZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPXRoaXMuX2JvdW5kaW5nUmVjdCxuPWkodCkscz17bGVmdDplLmxlZnQtby5sZWZ0LW4ubWFyZ2luTGVmdCx0b3A6ZS50b3Atby50b3Atbi5tYXJnaW5Ub3AscmlnaHQ6by5yaWdodC1lLnJpZ2h0LW4ubWFyZ2luUmlnaHQsYm90dG9tOm8uYm90dG9tLWUuYm90dG9tLW4ubWFyZ2luQm90dG9tfTtyZXR1cm4gc30sYy5oYW5kbGVFdmVudD1vLmhhbmRsZUV2ZW50LGMuYmluZFJlc2l6ZT1mdW5jdGlvbigpe3QuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHRoaXMpLHRoaXMuaXNSZXNpemVCb3VuZD0hMH0sYy51bmJpbmRSZXNpemU9ZnVuY3Rpb24oKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0aGlzKSx0aGlzLmlzUmVzaXplQm91bmQ9ITF9LGMub25yZXNpemU9ZnVuY3Rpb24oKXt0aGlzLnJlc2l6ZSgpfSxvLmRlYm91bmNlTWV0aG9kKHMsXCJvbnJlc2l6ZVwiLDEwMCksYy5yZXNpemU9ZnVuY3Rpb24oKXt0aGlzLmlzUmVzaXplQm91bmQmJnRoaXMubmVlZHNSZXNpemVMYXlvdXQoKSYmdGhpcy5sYXlvdXQoKX0sYy5uZWVkc1Jlc2l6ZUxheW91dD1mdW5jdGlvbigpe3ZhciB0PWkodGhpcy5lbGVtZW50KSxlPXRoaXMuc2l6ZSYmdDtyZXR1cm4gZSYmdC5pbm5lcldpZHRoIT09dGhpcy5zaXplLmlubmVyV2lkdGh9LGMuYWRkSXRlbXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faXRlbWl6ZSh0KTtyZXR1cm4gZS5sZW5ndGgmJih0aGlzLml0ZW1zPXRoaXMuaXRlbXMuY29uY2F0KGUpKSxlfSxjLmFwcGVuZGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWRkSXRlbXModCk7ZS5sZW5ndGgmJih0aGlzLmxheW91dEl0ZW1zKGUsITApLHRoaXMucmV2ZWFsKGUpKX0sYy5wcmVwZW5kZWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faXRlbWl6ZSh0KTtpZihlLmxlbmd0aCl7dmFyIGk9dGhpcy5pdGVtcy5zbGljZSgwKTt0aGlzLml0ZW1zPWUuY29uY2F0KGkpLHRoaXMuX3Jlc2V0TGF5b3V0KCksdGhpcy5fbWFuYWdlU3RhbXBzKCksdGhpcy5sYXlvdXRJdGVtcyhlLCEwKSx0aGlzLnJldmVhbChlKSx0aGlzLmxheW91dEl0ZW1zKGkpfX0sYy5yZXZlYWw9ZnVuY3Rpb24odCl7aWYodGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyhcInJldmVhbFwiLHQpLHQmJnQubGVuZ3RoKXt2YXIgZT10aGlzLnVwZGF0ZVN0YWdnZXIoKTt0LmZvckVhY2goZnVuY3Rpb24odCxpKXt0LnN0YWdnZXIoaSplKSx0LnJldmVhbCgpfSl9fSxjLmhpZGU9ZnVuY3Rpb24odCl7aWYodGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyhcImhpZGVcIix0KSx0JiZ0Lmxlbmd0aCl7dmFyIGU9dGhpcy51cGRhdGVTdGFnZ2VyKCk7dC5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7dC5zdGFnZ2VyKGkqZSksdC5oaWRlKCl9KX19LGMucmV2ZWFsSXRlbUVsZW1lbnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0SXRlbXModCk7dGhpcy5yZXZlYWwoZSl9LGMuaGlkZUl0ZW1FbGVtZW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEl0ZW1zKHQpO3RoaXMuaGlkZShlKX0sYy5nZXRJdGVtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5pdGVtcy5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLml0ZW1zW2VdO2lmKGkuZWxlbWVudD09dClyZXR1cm4gaX19LGMuZ2V0SXRlbXM9ZnVuY3Rpb24odCl7dD1vLm1ha2VBcnJheSh0KTt2YXIgZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZ2V0SXRlbSh0KTtpJiZlLnB1c2goaSl9LHRoaXMpLGV9LGMucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0SXRlbXModCk7dGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyhcInJlbW92ZVwiLGUpLGUmJmUubGVuZ3RoJiZlLmZvckVhY2goZnVuY3Rpb24odCl7dC5yZW1vdmUoKSxvLnJlbW92ZUZyb20odGhpcy5pdGVtcyx0KX0sdGhpcyl9LGMuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudC5zdHlsZTt0LmhlaWdodD1cIlwiLHQucG9zaXRpb249XCJcIix0LndpZHRoPVwiXCIsdGhpcy5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZGVzdHJveSgpfSksdGhpcy51bmJpbmRSZXNpemUoKTt2YXIgZT10aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlEO2RlbGV0ZSBmW2VdLGRlbGV0ZSB0aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlELGgmJmgucmVtb3ZlRGF0YSh0aGlzLmVsZW1lbnQsdGhpcy5jb25zdHJ1Y3Rvci5uYW1lc3BhY2UpfSxzLmRhdGE9ZnVuY3Rpb24odCl7dD1vLmdldFF1ZXJ5RWxlbWVudCh0KTt2YXIgZT10JiZ0Lm91dGxheWVyR1VJRDtyZXR1cm4gZSYmZltlXX0scy5jcmVhdGU9ZnVuY3Rpb24odCxlKXt2YXIgaT1yKHMpO3JldHVybiBpLmRlZmF1bHRzPW8uZXh0ZW5kKHt9LHMuZGVmYXVsdHMpLG8uZXh0ZW5kKGkuZGVmYXVsdHMsZSksaS5jb21wYXRPcHRpb25zPW8uZXh0ZW5kKHt9LHMuY29tcGF0T3B0aW9ucyksaS5uYW1lc3BhY2U9dCxpLmRhdGE9cy5kYXRhLGkuSXRlbT1yKG4pLG8uaHRtbEluaXQoaSx0KSxoJiZoLmJyaWRnZXQmJmguYnJpZGdldCh0LGkpLGl9O3ZhciBtPXttczoxLHM6MWUzfTtyZXR1cm4gcy5JdGVtPW4sc30pLGZ1bmN0aW9uKHQsZSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcImlzb3RvcGUvanMvaXRlbVwiLFtcIm91dGxheWVyL291dGxheWVyXCJdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcIm91dGxheWVyXCIpKToodC5Jc290b3BlPXQuSXNvdG9wZXx8e30sdC5Jc290b3BlLkl0ZW09ZSh0Lk91dGxheWVyKSl9KHdpbmRvdyxmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBlKCl7dC5JdGVtLmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgaT1lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQuSXRlbS5wcm90b3R5cGUpLG89aS5fY3JlYXRlO2kuX2NyZWF0ZT1mdW5jdGlvbigpe3RoaXMuaWQ9dGhpcy5sYXlvdXQuaXRlbUdVSUQrKyxvLmNhbGwodGhpcyksdGhpcy5zb3J0RGF0YT17fX0saS51cGRhdGVTb3J0RGF0YT1mdW5jdGlvbigpe2lmKCF0aGlzLmlzSWdub3JlZCl7dGhpcy5zb3J0RGF0YS5pZD10aGlzLmlkLHRoaXMuc29ydERhdGFbXCJvcmlnaW5hbC1vcmRlclwiXT10aGlzLmlkLHRoaXMuc29ydERhdGEucmFuZG9tPU1hdGgucmFuZG9tKCk7dmFyIHQ9dGhpcy5sYXlvdXQub3B0aW9ucy5nZXRTb3J0RGF0YSxlPXRoaXMubGF5b3V0Ll9zb3J0ZXJzO2Zvcih2YXIgaSBpbiB0KXt2YXIgbz1lW2ldO3RoaXMuc29ydERhdGFbaV09byh0aGlzLmVsZW1lbnQsdGhpcyl9fX07dmFyIG49aS5kZXN0cm95O3JldHVybiBpLmRlc3Ryb3k9ZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNzcyh7ZGlzcGxheTpcIlwifSl9LGV9KSxmdW5jdGlvbih0LGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJpc290b3BlL2pzL2xheW91dC1tb2RlXCIsW1wiZ2V0LXNpemUvZ2V0LXNpemVcIixcIm91dGxheWVyL291dGxheWVyXCJdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcImdldC1zaXplXCIpLHJlcXVpcmUoXCJvdXRsYXllclwiKSk6KHQuSXNvdG9wZT10Lklzb3RvcGV8fHt9LHQuSXNvdG9wZS5MYXlvdXRNb2RlPWUodC5nZXRTaXplLHQuT3V0bGF5ZXIpKX0od2luZG93LGZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaSh0KXt0aGlzLmlzb3RvcGU9dCx0JiYodGhpcy5vcHRpb25zPXQub3B0aW9uc1t0aGlzLm5hbWVzcGFjZV0sdGhpcy5lbGVtZW50PXQuZWxlbWVudCx0aGlzLml0ZW1zPXQuZmlsdGVyZWRJdGVtcyx0aGlzLnNpemU9dC5zaXplKX12YXIgbz1pLnByb3RvdHlwZSxuPVtcIl9yZXNldExheW91dFwiLFwiX2dldEl0ZW1MYXlvdXRQb3NpdGlvblwiLFwiX21hbmFnZVN0YW1wXCIsXCJfZ2V0Q29udGFpbmVyU2l6ZVwiLFwiX2dldEVsZW1lbnRPZmZzZXRcIixcIm5lZWRzUmVzaXplTGF5b3V0XCIsXCJfZ2V0T3B0aW9uXCJdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XT1mdW5jdGlvbigpe3JldHVybiBlLnByb3RvdHlwZVt0XS5hcHBseSh0aGlzLmlzb3RvcGUsYXJndW1lbnRzKX19KSxvLm5lZWRzVmVydGljYWxSZXNpemVMYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMuaXNvdG9wZS5lbGVtZW50KSxpPXRoaXMuaXNvdG9wZS5zaXplJiZlO3JldHVybiBpJiZlLmlubmVySGVpZ2h0IT10aGlzLmlzb3RvcGUuc2l6ZS5pbm5lckhlaWdodH0sby5fZ2V0TWVhc3VyZW1lbnQ9ZnVuY3Rpb24oKXt0aGlzLmlzb3RvcGUuX2dldE1lYXN1cmVtZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sby5nZXRDb2x1bW5XaWR0aD1mdW5jdGlvbigpe3RoaXMuZ2V0U2VnbWVudFNpemUoXCJjb2x1bW5cIixcIldpZHRoXCIpfSxvLmdldFJvd0hlaWdodD1mdW5jdGlvbigpe3RoaXMuZ2V0U2VnbWVudFNpemUoXCJyb3dcIixcIkhlaWdodFwiKX0sby5nZXRTZWdtZW50U2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBpPXQrZSxvPVwib3V0ZXJcIitlO2lmKHRoaXMuX2dldE1lYXN1cmVtZW50KGksbyksIXRoaXNbaV0pe3ZhciBuPXRoaXMuZ2V0Rmlyc3RJdGVtU2l6ZSgpO3RoaXNbaV09biYmbltvXXx8dGhpcy5pc290b3BlLnNpemVbXCJpbm5lclwiK2VdfX0sby5nZXRGaXJzdEl0ZW1TaXplPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5pc290b3BlLmZpbHRlcmVkSXRlbXNbMF07cmV0dXJuIGUmJmUuZWxlbWVudCYmdChlLmVsZW1lbnQpfSxvLmxheW91dD1mdW5jdGlvbigpe3RoaXMuaXNvdG9wZS5sYXlvdXQuYXBwbHkodGhpcy5pc290b3BlLGFyZ3VtZW50cyl9LG8uZ2V0U2l6ZT1mdW5jdGlvbigpe3RoaXMuaXNvdG9wZS5nZXRTaXplKCksdGhpcy5zaXplPXRoaXMuaXNvdG9wZS5zaXplfSxpLm1vZGVzPXt9LGkuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe2kuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBuLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8pLG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW4sZSYmKG4ub3B0aW9ucz1lKSxuLnByb3RvdHlwZS5uYW1lc3BhY2U9dCxpLm1vZGVzW3RdPW4sbn0saX0pLGZ1bmN0aW9uKHQsZSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcIm1hc29ucnkvbWFzb25yeVwiLFtcIm91dGxheWVyL291dGxheWVyXCIsXCJnZXQtc2l6ZS9nZXQtc2l6ZVwiXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJvdXRsYXllclwiKSxyZXF1aXJlKFwiZ2V0LXNpemVcIikpOnQuTWFzb25yeT1lKHQuT3V0bGF5ZXIsdC5nZXRTaXplKX0od2luZG93LGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5jcmVhdGUoXCJtYXNvbnJ5XCIpO2kuY29tcGF0T3B0aW9ucy5maXRXaWR0aD1cImlzRml0V2lkdGhcIjt2YXIgbz1pLnByb3RvdHlwZTtyZXR1cm4gby5fcmVzZXRMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLmdldFNpemUoKSx0aGlzLl9nZXRNZWFzdXJlbWVudChcImNvbHVtbldpZHRoXCIsXCJvdXRlcldpZHRoXCIpLHRoaXMuX2dldE1lYXN1cmVtZW50KFwiZ3V0dGVyXCIsXCJvdXRlcldpZHRoXCIpLHRoaXMubWVhc3VyZUNvbHVtbnMoKSx0aGlzLmNvbFlzPVtdO2Zvcih2YXIgdD0wO3Q8dGhpcy5jb2xzO3QrKyl0aGlzLmNvbFlzLnB1c2goMCk7dGhpcy5tYXhZPTAsdGhpcy5ob3Jpem9udGFsQ29sSW5kZXg9MH0sby5tZWFzdXJlQ29sdW1ucz1mdW5jdGlvbigpe2lmKHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKSwhdGhpcy5jb2x1bW5XaWR0aCl7dmFyIHQ9dGhpcy5pdGVtc1swXSxpPXQmJnQuZWxlbWVudDt0aGlzLmNvbHVtbldpZHRoPWkmJmUoaSkub3V0ZXJXaWR0aHx8dGhpcy5jb250YWluZXJXaWR0aH12YXIgbz10aGlzLmNvbHVtbldpZHRoKz10aGlzLmd1dHRlcixuPXRoaXMuY29udGFpbmVyV2lkdGgrdGhpcy5ndXR0ZXIscz1uL28scj1vLW4lbyxhPXImJnI8MT9cInJvdW5kXCI6XCJmbG9vclwiO3M9TWF0aFthXShzKSx0aGlzLmNvbHM9TWF0aC5tYXgocywxKX0sby5nZXRDb250YWluZXJXaWR0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldE9wdGlvbihcImZpdFdpZHRoXCIpLGk9dD90aGlzLmVsZW1lbnQucGFyZW50Tm9kZTp0aGlzLmVsZW1lbnQsbz1lKGkpO3RoaXMuY29udGFpbmVyV2lkdGg9byYmby5pbm5lcldpZHRofSxvLl9nZXRJdGVtTGF5b3V0UG9zaXRpb249ZnVuY3Rpb24odCl7dC5nZXRTaXplKCk7dmFyIGU9dC5zaXplLm91dGVyV2lkdGgldGhpcy5jb2x1bW5XaWR0aCxpPWUmJmU8MT9cInJvdW5kXCI6XCJjZWlsXCIsbz1NYXRoW2ldKHQuc2l6ZS5vdXRlcldpZHRoL3RoaXMuY29sdW1uV2lkdGgpO289TWF0aC5taW4obyx0aGlzLmNvbHMpO2Zvcih2YXIgbj10aGlzLm9wdGlvbnMuaG9yaXpvbnRhbE9yZGVyP1wiX2dldEhvcml6b250YWxDb2xQb3NpdGlvblwiOlwiX2dldFRvcENvbFBvc2l0aW9uXCIscz10aGlzW25dKG8sdCkscj17eDp0aGlzLmNvbHVtbldpZHRoKnMuY29sLHk6cy55fSxhPXMueSt0LnNpemUub3V0ZXJIZWlnaHQsdT1vK3MuY29sLGg9cy5jb2w7aDx1O2grKyl0aGlzLmNvbFlzW2hdPWE7cmV0dXJuIHJ9LG8uX2dldFRvcENvbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2dldFRvcENvbEdyb3VwKHQpLGk9TWF0aC5taW4uYXBwbHkoTWF0aCxlKTtyZXR1cm57Y29sOmUuaW5kZXhPZihpKSx5Oml9fSxvLl9nZXRUb3BDb2xHcm91cD1mdW5jdGlvbih0KXtpZih0PDIpcmV0dXJuIHRoaXMuY29sWXM7Zm9yKHZhciBlPVtdLGk9dGhpcy5jb2xzKzEtdCxvPTA7bzxpO28rKyllW29dPXRoaXMuX2dldENvbEdyb3VwWShvLHQpO3JldHVybiBlfSxvLl9nZXRDb2xHcm91cFk9ZnVuY3Rpb24odCxlKXtpZihlPDIpcmV0dXJuIHRoaXMuY29sWXNbdF07dmFyIGk9dGhpcy5jb2xZcy5zbGljZSh0LHQrZSk7cmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsaSl9LG8uX2dldEhvcml6b250YWxDb2xQb3NpdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuaG9yaXpvbnRhbENvbEluZGV4JXRoaXMuY29scyxvPXQ+MSYmaSt0PnRoaXMuY29scztpPW8/MDppO3ZhciBuPWUuc2l6ZS5vdXRlcldpZHRoJiZlLnNpemUub3V0ZXJIZWlnaHQ7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbENvbEluZGV4PW4/aSt0OnRoaXMuaG9yaXpvbnRhbENvbEluZGV4LHtjb2w6aSx5OnRoaXMuX2dldENvbEdyb3VwWShpLHQpfX0sby5fbWFuYWdlU3RhbXA9ZnVuY3Rpb24odCl7dmFyIGk9ZSh0KSxvPXRoaXMuX2dldEVsZW1lbnRPZmZzZXQodCksbj10aGlzLl9nZXRPcHRpb24oXCJvcmlnaW5MZWZ0XCIpLHM9bj9vLmxlZnQ6by5yaWdodCxyPXMraS5vdXRlcldpZHRoLGE9TWF0aC5mbG9vcihzL3RoaXMuY29sdW1uV2lkdGgpO2E9TWF0aC5tYXgoMCxhKTt2YXIgdT1NYXRoLmZsb29yKHIvdGhpcy5jb2x1bW5XaWR0aCk7dS09ciV0aGlzLmNvbHVtbldpZHRoPzA6MSx1PU1hdGgubWluKHRoaXMuY29scy0xLHUpO2Zvcih2YXIgaD10aGlzLl9nZXRPcHRpb24oXCJvcmlnaW5Ub3BcIiksZD0oaD9vLnRvcDpvLmJvdHRvbSkraS5vdXRlckhlaWdodCxsPWE7bDw9dTtsKyspdGhpcy5jb2xZc1tsXT1NYXRoLm1heChkLHRoaXMuY29sWXNbbF0pfSxvLl9nZXRDb250YWluZXJTaXplPWZ1bmN0aW9uKCl7dGhpcy5tYXhZPU1hdGgubWF4LmFwcGx5KE1hdGgsdGhpcy5jb2xZcyk7dmFyIHQ9e2hlaWdodDp0aGlzLm1heFl9O3JldHVybiB0aGlzLl9nZXRPcHRpb24oXCJmaXRXaWR0aFwiKSYmKHQud2lkdGg9dGhpcy5fZ2V0Q29udGFpbmVyRml0V2lkdGgoKSksdH0sby5fZ2V0Q29udGFpbmVyRml0V2lkdGg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPXRoaXMuY29sczstLWUmJjA9PT10aGlzLmNvbFlzW2VdOyl0Kys7cmV0dXJuKHRoaXMuY29scy10KSp0aGlzLmNvbHVtbldpZHRoLXRoaXMuZ3V0dGVyfSxvLm5lZWRzUmVzaXplTGF5b3V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250YWluZXJXaWR0aDtyZXR1cm4gdGhpcy5nZXRDb250YWluZXJXaWR0aCgpLHQhPXRoaXMuY29udGFpbmVyV2lkdGh9LGl9KSxmdW5jdGlvbih0LGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJpc290b3BlL2pzL2xheW91dC1tb2Rlcy9tYXNvbnJ5XCIsW1wiLi4vbGF5b3V0LW1vZGVcIixcIm1hc29ucnkvbWFzb25yeVwiXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCIuLi9sYXlvdXQtbW9kZVwiKSxyZXF1aXJlKFwibWFzb25yeS1sYXlvdXRcIikpOmUodC5Jc290b3BlLkxheW91dE1vZGUsdC5NYXNvbnJ5KX0od2luZG93LGZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9dC5jcmVhdGUoXCJtYXNvbnJ5XCIpLG89aS5wcm90b3R5cGUsbj17X2dldEVsZW1lbnRPZmZzZXQ6ITAsbGF5b3V0OiEwLF9nZXRNZWFzdXJlbWVudDohMH07Zm9yKHZhciBzIGluIGUucHJvdG90eXBlKW5bc118fChvW3NdPWUucHJvdG90eXBlW3NdKTt2YXIgcj1vLm1lYXN1cmVDb2x1bW5zO28ubWVhc3VyZUNvbHVtbnM9ZnVuY3Rpb24oKXt0aGlzLml0ZW1zPXRoaXMuaXNvdG9wZS5maWx0ZXJlZEl0ZW1zLHIuY2FsbCh0aGlzKX07dmFyIGE9by5fZ2V0T3B0aW9uO3JldHVybiBvLl9nZXRPcHRpb249ZnVuY3Rpb24odCl7cmV0dXJuXCJmaXRXaWR0aFwiPT10P3ZvaWQgMCE9PXRoaXMub3B0aW9ucy5pc0ZpdFdpZHRoP3RoaXMub3B0aW9ucy5pc0ZpdFdpZHRoOnRoaXMub3B0aW9ucy5maXRXaWR0aDphLmFwcGx5KHRoaXMuaXNvdG9wZSxhcmd1bWVudHMpfSxpfSksZnVuY3Rpb24odCxlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFwiaXNvdG9wZS9qcy9sYXlvdXQtbW9kZXMvZml0LXJvd3NcIixbXCIuLi9sYXlvdXQtbW9kZVwiXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCIuLi9sYXlvdXQtbW9kZVwiKSk6ZSh0Lklzb3RvcGUuTGF5b3V0TW9kZSl9KHdpbmRvdyxmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgZT10LmNyZWF0ZShcImZpdFJvd3NcIiksaT1lLnByb3RvdHlwZTtyZXR1cm4gaS5fcmVzZXRMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLng9MCx0aGlzLnk9MCx0aGlzLm1heFk9MCx0aGlzLl9nZXRNZWFzdXJlbWVudChcImd1dHRlclwiLFwib3V0ZXJXaWR0aFwiKX0saS5fZ2V0SXRlbUxheW91dFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3QuZ2V0U2l6ZSgpO3ZhciBlPXQuc2l6ZS5vdXRlcldpZHRoK3RoaXMuZ3V0dGVyLGk9dGhpcy5pc290b3BlLnNpemUuaW5uZXJXaWR0aCt0aGlzLmd1dHRlcjswIT09dGhpcy54JiZlK3RoaXMueD5pJiYodGhpcy54PTAsdGhpcy55PXRoaXMubWF4WSk7dmFyIG89e3g6dGhpcy54LHk6dGhpcy55fTtyZXR1cm4gdGhpcy5tYXhZPU1hdGgubWF4KHRoaXMubWF4WSx0aGlzLnkrdC5zaXplLm91dGVySGVpZ2h0KSx0aGlzLngrPWUsb30saS5fZ2V0Q29udGFpbmVyU2l6ZT1mdW5jdGlvbigpe3JldHVybntoZWlnaHQ6dGhpcy5tYXhZfX0sZX0pLGZ1bmN0aW9uKHQsZSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcImlzb3RvcGUvanMvbGF5b3V0LW1vZGVzL3ZlcnRpY2FsXCIsW1wiLi4vbGF5b3V0LW1vZGVcIl0sZSk6XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwiLi4vbGF5b3V0LW1vZGVcIikpOmUodC5Jc290b3BlLkxheW91dE1vZGUpfSh3aW5kb3csZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9dC5jcmVhdGUoXCJ2ZXJ0aWNhbFwiLHtob3Jpem9udGFsQWxpZ25tZW50OjB9KSxpPWUucHJvdG90eXBlO3JldHVybiBpLl9yZXNldExheW91dD1mdW5jdGlvbigpe3RoaXMueT0wfSxpLl9nZXRJdGVtTGF5b3V0UG9zaXRpb249ZnVuY3Rpb24odCl7dC5nZXRTaXplKCk7dmFyIGU9KHRoaXMuaXNvdG9wZS5zaXplLmlubmVyV2lkdGgtdC5zaXplLm91dGVyV2lkdGgpKnRoaXMub3B0aW9ucy5ob3Jpem9udGFsQWxpZ25tZW50LGk9dGhpcy55O3JldHVybiB0aGlzLnkrPXQuc2l6ZS5vdXRlckhlaWdodCx7eDplLHk6aX19LGkuX2dldENvbnRhaW5lclNpemU9ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OnRoaXMueX19LGV9KSxmdW5jdGlvbih0LGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wib3V0bGF5ZXIvb3V0bGF5ZXJcIixcImdldC1zaXplL2dldC1zaXplXCIsXCJkZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yL21hdGNoZXMtc2VsZWN0b3JcIixcImZpenp5LXVpLXV0aWxzL3V0aWxzXCIsXCJpc290b3BlL2pzL2l0ZW1cIixcImlzb3RvcGUvanMvbGF5b3V0LW1vZGVcIixcImlzb3RvcGUvanMvbGF5b3V0LW1vZGVzL21hc29ucnlcIixcImlzb3RvcGUvanMvbGF5b3V0LW1vZGVzL2ZpdC1yb3dzXCIsXCJpc290b3BlL2pzL2xheW91dC1tb2Rlcy92ZXJ0aWNhbFwiXSxmdW5jdGlvbihpLG8sbixzLHIsYSl7cmV0dXJuIGUodCxpLG8sbixzLHIsYSl9KTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHQscmVxdWlyZShcIm91dGxheWVyXCIpLHJlcXVpcmUoXCJnZXQtc2l6ZVwiKSxyZXF1aXJlKFwiZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3RvclwiKSxyZXF1aXJlKFwiZml6enktdWktdXRpbHNcIikscmVxdWlyZShcImlzb3RvcGUvanMvaXRlbVwiKSxyZXF1aXJlKFwiaXNvdG9wZS9qcy9sYXlvdXQtbW9kZVwiKSxyZXF1aXJlKFwiaXNvdG9wZS9qcy9sYXlvdXQtbW9kZXMvbWFzb25yeVwiKSxyZXF1aXJlKFwiaXNvdG9wZS9qcy9sYXlvdXQtbW9kZXMvZml0LXJvd3NcIikscmVxdWlyZShcImlzb3RvcGUvanMvbGF5b3V0LW1vZGVzL3ZlcnRpY2FsXCIpKTp0Lklzb3RvcGU9ZSh0LHQuT3V0bGF5ZXIsdC5nZXRTaXplLHQubWF0Y2hlc1NlbGVjdG9yLHQuZml6enlVSVV0aWxzLHQuSXNvdG9wZS5JdGVtLHQuSXNvdG9wZS5MYXlvdXRNb2RlKX0od2luZG93LGZ1bmN0aW9uKHQsZSxpLG8sbixzLHIpe2Z1bmN0aW9uIGEodCxlKXtyZXR1cm4gZnVuY3Rpb24oaSxvKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHM9dFtuXSxyPWkuc29ydERhdGFbc10sYT1vLnNvcnREYXRhW3NdO2lmKHI+YXx8cjxhKXt2YXIgdT12b2lkIDAhPT1lW3NdP2Vbc106ZSxoPXU/MTotMTtyZXR1cm4ocj5hPzE6LTEpKmh9fXJldHVybiAwfX12YXIgdT10LmpRdWVyeSxoPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9OmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIil9LGQ9ZS5jcmVhdGUoXCJpc290b3BlXCIse2xheW91dE1vZGU6XCJtYXNvbnJ5XCIsaXNKUXVlcnlGaWx0ZXJpbmc6ITAsc29ydEFzY2VuZGluZzohMH0pO2QuSXRlbT1zLGQuTGF5b3V0TW9kZT1yO3ZhciBsPWQucHJvdG90eXBlO2wuX2NyZWF0ZT1mdW5jdGlvbigpe3RoaXMuaXRlbUdVSUQ9MCx0aGlzLl9zb3J0ZXJzPXt9LHRoaXMuX2dldFNvcnRlcnMoKSxlLnByb3RvdHlwZS5fY3JlYXRlLmNhbGwodGhpcyksdGhpcy5tb2Rlcz17fSx0aGlzLmZpbHRlcmVkSXRlbXM9dGhpcy5pdGVtcyx0aGlzLnNvcnRIaXN0b3J5PVtcIm9yaWdpbmFsLW9yZGVyXCJdO2Zvcih2YXIgdCBpbiByLm1vZGVzKXRoaXMuX2luaXRMYXlvdXRNb2RlKHQpfSxsLnJlbG9hZEl0ZW1zPWZ1bmN0aW9uKCl7dGhpcy5pdGVtR1VJRD0wLGUucHJvdG90eXBlLnJlbG9hZEl0ZW1zLmNhbGwodGhpcyl9LGwuX2l0ZW1pemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZS5wcm90b3R5cGUuX2l0ZW1pemUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG89dFtpXTtvLmlkPXRoaXMuaXRlbUdVSUQrK31yZXR1cm4gdGhpcy5fdXBkYXRlSXRlbXNTb3J0RGF0YSh0KSx0fSxsLl9pbml0TGF5b3V0TW9kZT1mdW5jdGlvbih0KXt2YXIgZT1yLm1vZGVzW3RdLGk9dGhpcy5vcHRpb25zW3RdfHx7fTt0aGlzLm9wdGlvbnNbdF09ZS5vcHRpb25zP24uZXh0ZW5kKGUub3B0aW9ucyxpKTppLHRoaXMubW9kZXNbdF09bmV3IGUodGhpcyl9LGwubGF5b3V0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2lzTGF5b3V0SW5pdGVkJiZ0aGlzLl9nZXRPcHRpb24oXCJpbml0TGF5b3V0XCIpP3ZvaWQgdGhpcy5hcnJhbmdlKCk6dm9pZCB0aGlzLl9sYXlvdXQoKX0sbC5fbGF5b3V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0SXNJbnN0YW50KCk7dGhpcy5fcmVzZXRMYXlvdXQoKSx0aGlzLl9tYW5hZ2VTdGFtcHMoKSx0aGlzLmxheW91dEl0ZW1zKHRoaXMuZmlsdGVyZWRJdGVtcyx0KSx0aGlzLl9pc0xheW91dEluaXRlZD0hMH0sbC5hcnJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9uKHQpLHRoaXMuX2dldElzSW5zdGFudCgpO3ZhciBlPXRoaXMuX2ZpbHRlcih0aGlzLml0ZW1zKTt0aGlzLmZpbHRlcmVkSXRlbXM9ZS5tYXRjaGVzLHRoaXMuX2JpbmRBcnJhbmdlQ29tcGxldGUoKSx0aGlzLl9pc0luc3RhbnQ/dGhpcy5fbm9UcmFuc2l0aW9uKHRoaXMuX2hpZGVSZXZlYWwsW2VdKTp0aGlzLl9oaWRlUmV2ZWFsKGUpLHRoaXMuX3NvcnQoKSx0aGlzLl9sYXlvdXQoKX0sbC5faW5pdD1sLmFycmFuZ2UsbC5faGlkZVJldmVhbD1mdW5jdGlvbih0KXt0aGlzLnJldmVhbCh0Lm5lZWRSZXZlYWwpLHRoaXMuaGlkZSh0Lm5lZWRIaWRlKX0sbC5fZ2V0SXNJbnN0YW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0T3B0aW9uKFwibGF5b3V0SW5zdGFudFwiKSxlPXZvaWQgMCE9PXQ/dDohdGhpcy5faXNMYXlvdXRJbml0ZWQ7cmV0dXJuIHRoaXMuX2lzSW5zdGFudD1lLGV9LGwuX2JpbmRBcnJhbmdlQ29tcGxldGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZSYmaSYmbyYmbi5kaXNwYXRjaEV2ZW50KFwiYXJyYW5nZUNvbXBsZXRlXCIsbnVsbCxbbi5maWx0ZXJlZEl0ZW1zXSl9dmFyIGUsaSxvLG49dGhpczt0aGlzLm9uY2UoXCJsYXlvdXRDb21wbGV0ZVwiLGZ1bmN0aW9uKCl7ZT0hMCx0KCl9KSx0aGlzLm9uY2UoXCJoaWRlQ29tcGxldGVcIixmdW5jdGlvbigpe2k9ITAsdCgpfSksdGhpcy5vbmNlKFwicmV2ZWFsQ29tcGxldGVcIixmdW5jdGlvbigpe289ITAsdCgpfSl9LGwuX2ZpbHRlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMuZmlsdGVyO2U9ZXx8XCIqXCI7Zm9yKHZhciBpPVtdLG89W10sbj1bXSxzPXRoaXMuX2dldEZpbHRlclRlc3QoZSkscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgYT10W3JdO2lmKCFhLmlzSWdub3JlZCl7dmFyIHU9cyhhKTt1JiZpLnB1c2goYSksdSYmYS5pc0hpZGRlbj9vLnB1c2goYSk6dXx8YS5pc0hpZGRlbnx8bi5wdXNoKGEpfX1yZXR1cm57bWF0Y2hlczppLG5lZWRSZXZlYWw6byxuZWVkSGlkZTpufX0sbC5fZ2V0RmlsdGVyVGVzdD1mdW5jdGlvbih0KXtyZXR1cm4gdSYmdGhpcy5vcHRpb25zLmlzSlF1ZXJ5RmlsdGVyaW5nP2Z1bmN0aW9uKGUpe3JldHVybiB1KGUuZWxlbWVudCkuaXModCl9OlwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZS5lbGVtZW50KX06ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZS5lbGVtZW50LHQpfX0sbC51cGRhdGVTb3J0RGF0YT1mdW5jdGlvbih0KXtcclxudmFyIGU7dD8odD1uLm1ha2VBcnJheSh0KSxlPXRoaXMuZ2V0SXRlbXModCkpOmU9dGhpcy5pdGVtcyx0aGlzLl9nZXRTb3J0ZXJzKCksdGhpcy5fdXBkYXRlSXRlbXNTb3J0RGF0YShlKX0sbC5fZ2V0U29ydGVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5nZXRTb3J0RGF0YTtmb3IodmFyIGUgaW4gdCl7dmFyIGk9dFtlXTt0aGlzLl9zb3J0ZXJzW2VdPWYoaSl9fSxsLl91cGRhdGVJdGVtc1NvcnREYXRhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10JiZ0Lmxlbmd0aCxpPTA7ZSYmaTxlO2krKyl7dmFyIG89dFtpXTtvLnVwZGF0ZVNvcnREYXRhKCl9fTt2YXIgZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpcmV0dXJuIHQ7dmFyIGk9aCh0KS5zcGxpdChcIiBcIiksbz1pWzBdLG49by5tYXRjaCgvXlxcWyguKylcXF0kLykscz1uJiZuWzFdLHI9ZShzLG8pLGE9ZC5zb3J0RGF0YVBhcnNlcnNbaVsxXV07cmV0dXJuIHQ9YT9mdW5jdGlvbih0KXtyZXR1cm4gdCYmYShyKHQpKX06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnIodCl9fWZ1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCl9OmZ1bmN0aW9uKHQpe3ZhciBpPXQucXVlcnlTZWxlY3RvcihlKTtyZXR1cm4gaSYmaS50ZXh0Q29udGVudH19cmV0dXJuIHR9KCk7ZC5zb3J0RGF0YVBhcnNlcnM9e3BhcnNlSW50OmZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0LDEwKX0scGFyc2VGbG9hdDpmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0KX19LGwuX3NvcnQ9ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuc29ydEJ5KXt2YXIgdD1uLm1ha2VBcnJheSh0aGlzLm9wdGlvbnMuc29ydEJ5KTt0aGlzLl9nZXRJc1NhbWVTb3J0QnkodCl8fCh0aGlzLnNvcnRIaXN0b3J5PXQuY29uY2F0KHRoaXMuc29ydEhpc3RvcnkpKTt2YXIgZT1hKHRoaXMuc29ydEhpc3RvcnksdGhpcy5vcHRpb25zLnNvcnRBc2NlbmRpbmcpO3RoaXMuZmlsdGVyZWRJdGVtcy5zb3J0KGUpfX0sbC5fZ2V0SXNTYW1lU29ydEJ5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0hPXRoaXMuc29ydEhpc3RvcnlbZV0pcmV0dXJuITE7cmV0dXJuITB9LGwuX21vZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMubGF5b3V0TW9kZSxlPXRoaXMubW9kZXNbdF07aWYoIWUpdGhyb3cgbmV3IEVycm9yKFwiTm8gbGF5b3V0IG1vZGU6IFwiK3QpO3JldHVybiBlLm9wdGlvbnM9dGhpcy5vcHRpb25zW3RdLGV9LGwuX3Jlc2V0TGF5b3V0PWZ1bmN0aW9uKCl7ZS5wcm90b3R5cGUuX3Jlc2V0TGF5b3V0LmNhbGwodGhpcyksdGhpcy5fbW9kZSgpLl9yZXNldExheW91dCgpfSxsLl9nZXRJdGVtTGF5b3V0UG9zaXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21vZGUoKS5fZ2V0SXRlbUxheW91dFBvc2l0aW9uKHQpfSxsLl9tYW5hZ2VTdGFtcD1mdW5jdGlvbih0KXt0aGlzLl9tb2RlKCkuX21hbmFnZVN0YW1wKHQpfSxsLl9nZXRDb250YWluZXJTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGUoKS5fZ2V0Q29udGFpbmVyU2l6ZSgpfSxsLm5lZWRzUmVzaXplTGF5b3V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGUoKS5uZWVkc1Jlc2l6ZUxheW91dCgpfSxsLmFwcGVuZGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWRkSXRlbXModCk7aWYoZS5sZW5ndGgpe3ZhciBpPXRoaXMuX2ZpbHRlclJldmVhbEFkZGVkKGUpO3RoaXMuZmlsdGVyZWRJdGVtcz10aGlzLmZpbHRlcmVkSXRlbXMuY29uY2F0KGkpfX0sbC5wcmVwZW5kZWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faXRlbWl6ZSh0KTtpZihlLmxlbmd0aCl7dGhpcy5fcmVzZXRMYXlvdXQoKSx0aGlzLl9tYW5hZ2VTdGFtcHMoKTt2YXIgaT10aGlzLl9maWx0ZXJSZXZlYWxBZGRlZChlKTt0aGlzLmxheW91dEl0ZW1zKHRoaXMuZmlsdGVyZWRJdGVtcyksdGhpcy5maWx0ZXJlZEl0ZW1zPWkuY29uY2F0KHRoaXMuZmlsdGVyZWRJdGVtcyksdGhpcy5pdGVtcz1lLmNvbmNhdCh0aGlzLml0ZW1zKX19LGwuX2ZpbHRlclJldmVhbEFkZGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2ZpbHRlcih0KTtyZXR1cm4gdGhpcy5oaWRlKGUubmVlZEhpZGUpLHRoaXMucmV2ZWFsKGUubWF0Y2hlcyksdGhpcy5sYXlvdXRJdGVtcyhlLm1hdGNoZXMsITApLGUubWF0Y2hlc30sbC5pbnNlcnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hZGRJdGVtcyh0KTtpZihlLmxlbmd0aCl7dmFyIGksbyxuPWUubGVuZ3RoO2ZvcihpPTA7aTxuO2krKylvPWVbaV0sdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKG8uZWxlbWVudCk7dmFyIHM9dGhpcy5fZmlsdGVyKGUpLm1hdGNoZXM7Zm9yKGk9MDtpPG47aSsrKWVbaV0uaXNMYXlvdXRJbnN0YW50PSEwO2Zvcih0aGlzLmFycmFuZ2UoKSxpPTA7aTxuO2krKylkZWxldGUgZVtpXS5pc0xheW91dEluc3RhbnQ7dGhpcy5yZXZlYWwocyl9fTt2YXIgYz1sLnJlbW92ZTtyZXR1cm4gbC5yZW1vdmU9ZnVuY3Rpb24odCl7dD1uLm1ha2VBcnJheSh0KTt2YXIgZT10aGlzLmdldEl0ZW1zKHQpO2MuY2FsbCh0aGlzLHQpO2Zvcih2YXIgaT1lJiZlLmxlbmd0aCxvPTA7aSYmbzxpO28rKyl7dmFyIHM9ZVtvXTtuLnJlbW92ZUZyb20odGhpcy5maWx0ZXJlZEl0ZW1zLHMpfX0sbC5zaHVmZmxlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLml0ZW1zLmxlbmd0aDt0Kyspe3ZhciBlPXRoaXMuaXRlbXNbdF07ZS5zb3J0RGF0YS5yYW5kb209TWF0aC5yYW5kb20oKX10aGlzLm9wdGlvbnMuc29ydEJ5PVwicmFuZG9tXCIsdGhpcy5fc29ydCgpLHRoaXMuX2xheW91dCgpfSxsLl9ub1RyYW5zaXRpb249ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uO3RoaXMub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb249MDt2YXIgbz10LmFwcGx5KHRoaXMsZSk7cmV0dXJuIHRoaXMub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb249aSxvfSxsLmdldEZpbHRlcmVkSXRlbUVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyZWRJdGVtcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuZWxlbWVudH0pfSxkfSk7IiwiLypcclxuKiBDb3B5cmlnaHQgKEMpIDIwMDkgSm9lbCBTdXRoZXJsYW5kXHJcbiogTGljZW5jZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXHJcbiogaHR0cDovL3d3dy5uZXdtZWRpYWNhbXBhaWducy5jb20vcGFnZS9qcXVlcnktZmxpY2tyLXBsdWdpblxyXG4qXHJcbiogQXZhaWxhYmxlIHRhZ3MgZm9yIHRlbXBsYXRlczpcclxuKiB0aXRsZSwgbGluaywgZGF0ZV90YWtlbiwgZGVzY3JpcHRpb24sIHB1Ymxpc2hlZCwgYXV0aG9yLCBhdXRob3JfaWQsIHRhZ3MsIGltYWdlKlxyXG4qL1xyXG4oZnVuY3Rpb24oJCl7JC5mbi5qZmxpY2tyZmVlZD1mdW5jdGlvbihzZXR0aW5ncyxjYWxsYmFjayl7c2V0dGluZ3M9JC5leHRlbmQodHJ1ZSx7ZmxpY2tyYmFzZTonaHR0cDovL2FwaS5mbGlja3IuY29tL3NlcnZpY2VzL2ZlZWRzLycsZmVlZGFwaToncGhvdG9zX3B1YmxpYy5nbmUnLGxpbWl0OjIwLHFzdHJpbmdzOntsYW5nOidlbi11cycsZm9ybWF0Oidqc29uJyxqc29uY2FsbGJhY2s6Jz8nfSxjbGVhbkRlc2NyaXB0aW9uOnRydWUsdXNlVGVtcGxhdGU6dHJ1ZSxpdGVtVGVtcGxhdGU6JycsaXRlbUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0sc2V0dGluZ3MpO3ZhciB1cmw9c2V0dGluZ3MuZmxpY2tyYmFzZStzZXR0aW5ncy5mZWVkYXBpKyc/Jzt2YXIgZmlyc3Q9dHJ1ZTtmb3IodmFyIGtleSBpbiBzZXR0aW5ncy5xc3RyaW5ncyl7aWYoIWZpcnN0KVxyXG51cmwrPScmJzt1cmwrPWtleSsnPScrc2V0dGluZ3MucXN0cmluZ3Nba2V5XTtmaXJzdD1mYWxzZTt9XHJcbnJldHVybiAkKHRoaXMpLmVhY2goZnVuY3Rpb24oKXt2YXIgJGNvbnRhaW5lcj0kKHRoaXMpO3ZhciBjb250YWluZXI9dGhpczskLmdldEpTT04odXJsLGZ1bmN0aW9uKGRhdGEpeyQuZWFjaChkYXRhLml0ZW1zLGZ1bmN0aW9uKGksaXRlbSl7aWYoaTxzZXR0aW5ncy5saW1pdCl7aWYoc2V0dGluZ3MuY2xlYW5EZXNjcmlwdGlvbil7dmFyIHJlZ2V4PS88cD4oLio/KTxcXC9wPi9nO3ZhciBpbnB1dD1pdGVtLmRlc2NyaXB0aW9uO2lmKHJlZ2V4LnRlc3QoaW5wdXQpKXtpdGVtLmRlc2NyaXB0aW9uPWlucHV0Lm1hdGNoKHJlZ2V4KVsyXVxyXG5pZihpdGVtLmRlc2NyaXB0aW9uIT11bmRlZmluZWQpXHJcbml0ZW0uZGVzY3JpcHRpb249aXRlbS5kZXNjcmlwdGlvbi5yZXBsYWNlKCc8cD4nLCcnKS5yZXBsYWNlKCc8L3A+JywnJyk7fX1cclxuaXRlbVsnaW1hZ2VfcyddPWl0ZW0ubWVkaWEubS5yZXBsYWNlKCdfbScsJ19zJyk7aXRlbVsnaW1hZ2VfdCddPWl0ZW0ubWVkaWEubS5yZXBsYWNlKCdfbScsJ190Jyk7aXRlbVsnaW1hZ2VfbSddPWl0ZW0ubWVkaWEubS5yZXBsYWNlKCdfbScsJ19tJyk7aXRlbVsnaW1hZ2UnXT1pdGVtLm1lZGlhLm0ucmVwbGFjZSgnX20nLCcnKTtpdGVtWydpbWFnZV9iJ109aXRlbS5tZWRpYS5tLnJlcGxhY2UoJ19tJywnX2InKTtkZWxldGUgaXRlbS5tZWRpYTtpZihzZXR0aW5ncy51c2VUZW1wbGF0ZSl7dmFyIHRlbXBsYXRlPXNldHRpbmdzLml0ZW1UZW1wbGF0ZTtmb3IodmFyIGtleSBpbiBpdGVtKXt2YXIgcmd4PW5ldyBSZWdFeHAoJ3t7JytrZXkrJ319JywnZycpO3RlbXBsYXRlPXRlbXBsYXRlLnJlcGxhY2Uocmd4LGl0ZW1ba2V5XSk7fVxyXG4kY29udGFpbmVyLmFwcGVuZCh0ZW1wbGF0ZSl9XHJcbnNldHRpbmdzLml0ZW1DYWxsYmFjay5jYWxsKGNvbnRhaW5lcixpdGVtKTt9fSk7aWYoJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSl7Y2FsbGJhY2suY2FsbChjb250YWluZXIsZGF0YSk7fX0pO30pO319KShqUXVlcnkpOyIsIi8qXHJcbiAqIFNjcm9sbFRvRml4ZWRcclxuICogaHR0cHM6Ly9naXRodWIuY29tL2JpZ3Nwb3R0ZWRkb2cvU2Nyb2xsVG9GaXhlZFxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTEgSm9zZXBoIENhdmEtTHluY2hcclxuICogTUlUIGxpY2Vuc2VcclxuICovXHJcbiAoZnVuY3Rpb24oYSl7YS5pc1Njcm9sbFRvRml4ZWQ9ZnVuY3Rpb24oYil7cmV0dXJuICEhYShiKS5kYXRhKFwiU2Nyb2xsVG9GaXhlZFwiKX07YS5TY3JvbGxUb0ZpeGVkPWZ1bmN0aW9uKGQsaSl7dmFyIG09dGhpczttLiRlbD1hKGQpO20uZWw9ZDttLiRlbC5kYXRhKFwiU2Nyb2xsVG9GaXhlZFwiLG0pO3ZhciBjPWZhbHNlO3ZhciBIPW0uJGVsO3ZhciBJO3ZhciBGO3ZhciBrO3ZhciBlO3ZhciB6O3ZhciBFPTA7dmFyIHI9MDt2YXIgaj0tMTt2YXIgZj0tMTt2YXIgdT1udWxsO3ZhciBBO3ZhciBnO2Z1bmN0aW9uIHYoKXtILnRyaWdnZXIoXCJwcmVVbmZpeGVkLlNjcm9sbFRvRml4ZWRcIik7bCgpO0gudHJpZ2dlcihcInVuZml4ZWQuU2Nyb2xsVG9GaXhlZFwiKTtmPS0xO0U9SC5vZmZzZXQoKS50b3A7cj1ILm9mZnNldCgpLmxlZnQ7aWYobS5vcHRpb25zLm9mZnNldHMpe3IrPShILm9mZnNldCgpLmxlZnQtSC5wb3NpdGlvbigpLmxlZnQpfWlmKGo9PS0xKXtqPXJ9ST1ILmNzcyhcInBvc2l0aW9uXCIpO2M9dHJ1ZTtpZihtLm9wdGlvbnMuYm90dG9tIT0tMSl7SC50cmlnZ2VyKFwicHJlRml4ZWQuU2Nyb2xsVG9GaXhlZFwiKTt4KCk7SC50cmlnZ2VyKFwiZml4ZWQuU2Nyb2xsVG9GaXhlZFwiKX19ZnVuY3Rpb24gbygpe3ZhciBKPW0ub3B0aW9ucy5saW1pdDtpZighSil7cmV0dXJuIDB9aWYodHlwZW9mKEopPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gSi5hcHBseShIKX1yZXR1cm4gSn1mdW5jdGlvbiBxKCl7cmV0dXJuIEk9PT1cImZpeGVkXCJ9ZnVuY3Rpb24geSgpe3JldHVybiBJPT09XCJhYnNvbHV0ZVwifWZ1bmN0aW9uIGgoKXtyZXR1cm4gIShxKCl8fHkoKSl9ZnVuY3Rpb24geCgpe2lmKCFxKCkpe3ZhciBKPUhbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dS5jc3Moe2Rpc3BsYXk6SC5jc3MoXCJkaXNwbGF5XCIpLHdpZHRoOkoud2lkdGgsaGVpZ2h0OkouaGVpZ2h0LFwiZmxvYXRcIjpILmNzcyhcImZsb2F0XCIpfSk7Y3NzT3B0aW9ucz17XCJ6LWluZGV4XCI6bS5vcHRpb25zLnpJbmRleCxwb3NpdGlvbjpcImZpeGVkXCIsdG9wOm0ub3B0aW9ucy5ib3R0b209PS0xP3QoKTpcIlwiLGJvdHRvbTptLm9wdGlvbnMuYm90dG9tPT0tMT9cIlwiOm0ub3B0aW9ucy5ib3R0b20sXCJtYXJnaW4tbGVmdFwiOlwiMHB4XCJ9O2lmKCFtLm9wdGlvbnMuZG9udFNldFdpZHRoKXtjc3NPcHRpb25zLndpZHRoPUguY3NzKFwid2lkdGhcIil9SC5jc3MoY3NzT3B0aW9ucyk7SC5hZGRDbGFzcyhtLm9wdGlvbnMuYmFzZUNsYXNzTmFtZSk7aWYobS5vcHRpb25zLmNsYXNzTmFtZSl7SC5hZGRDbGFzcyhtLm9wdGlvbnMuY2xhc3NOYW1lKX1JPVwiZml4ZWRcIn19ZnVuY3Rpb24gYigpe3ZhciBLPW8oKTt2YXIgSj1yO2lmKG0ub3B0aW9ucy5yZW1vdmVPZmZzZXRzKXtKPVwiXCI7Sz1LLUV9Y3NzT3B0aW9ucz17cG9zaXRpb246XCJhYnNvbHV0ZVwiLHRvcDpLLGxlZnQ6SixcIm1hcmdpbi1sZWZ0XCI6XCIwcHhcIixib3R0b206XCJcIn07aWYoIW0ub3B0aW9ucy5kb250U2V0V2lkdGgpe2Nzc09wdGlvbnMud2lkdGg9SC5jc3MoXCJ3aWR0aFwiKX1ILmNzcyhjc3NPcHRpb25zKTtJPVwiYWJzb2x1dGVcIn1mdW5jdGlvbiBsKCl7aWYoIWgoKSl7Zj0tMTt1LmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIik7SC5jc3Moe1wiei1pbmRleFwiOnosd2lkdGg6XCJcIixwb3NpdGlvbjpGLGxlZnQ6XCJcIix0b3A6ZSxcIm1hcmdpbi1sZWZ0XCI6XCJcIn0pO0gucmVtb3ZlQ2xhc3MoXCJzY3JvbGwtdG8tZml4ZWQtZml4ZWRcIik7aWYobS5vcHRpb25zLmNsYXNzTmFtZSl7SC5yZW1vdmVDbGFzcyhtLm9wdGlvbnMuY2xhc3NOYW1lKX1JPW51bGx9fWZ1bmN0aW9uIHcoSil7aWYoSiE9Zil7SC5jc3MoXCJsZWZ0XCIsci1KKTtmPUp9fWZ1bmN0aW9uIHQoKXt2YXIgSj1tLm9wdGlvbnMubWFyZ2luVG9wO2lmKCFKKXtyZXR1cm4gMH1pZih0eXBlb2YoSik9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBKLmFwcGx5KEgpfXJldHVybiBKfWZ1bmN0aW9uIEIoKXtpZighYS5pc1Njcm9sbFRvRml4ZWQoSCl8fEguaXMoXCI6aGlkZGVuXCIpKXtyZXR1cm59dmFyIE09Yzt2YXIgTD1oKCk7aWYoIWMpe3YoKX1lbHNle2lmKGgoKSl7RT1ILm9mZnNldCgpLnRvcDtyPUgub2Zmc2V0KCkubGVmdH19dmFyIEo9YSh3aW5kb3cpLnNjcm9sbExlZnQoKTt2YXIgTj1hKHdpbmRvdykuc2Nyb2xsVG9wKCk7dmFyIEs9bygpO2lmKG0ub3B0aW9ucy5taW5XaWR0aCYmYSh3aW5kb3cpLndpZHRoKCk8bS5vcHRpb25zLm1pbldpZHRoKXtpZighaCgpfHwhTSl7cCgpO0gudHJpZ2dlcihcInByZVVuZml4ZWQuU2Nyb2xsVG9GaXhlZFwiKTtsKCk7SC50cmlnZ2VyKFwidW5maXhlZC5TY3JvbGxUb0ZpeGVkXCIpfX1lbHNle2lmKG0ub3B0aW9ucy5tYXhXaWR0aCYmYSh3aW5kb3cpLndpZHRoKCk+bS5vcHRpb25zLm1heFdpZHRoKXtpZighaCgpfHwhTSl7cCgpO0gudHJpZ2dlcihcInByZVVuZml4ZWQuU2Nyb2xsVG9GaXhlZFwiKTtsKCk7SC50cmlnZ2VyKFwidW5maXhlZC5TY3JvbGxUb0ZpeGVkXCIpfX1lbHNle2lmKG0ub3B0aW9ucy5ib3R0b209PS0xKXtpZihLPjAmJk4+PUstdCgpKXtpZighTCYmKCF5KCl8fCFNKSl7cCgpO0gudHJpZ2dlcihcInByZUFic29sdXRlLlNjcm9sbFRvRml4ZWRcIik7YigpO0gudHJpZ2dlcihcInVuZml4ZWQuU2Nyb2xsVG9GaXhlZFwiKX19ZWxzZXtpZihOPj1FLXQoKSl7aWYoIXEoKXx8IU0pe3AoKTtILnRyaWdnZXIoXCJwcmVGaXhlZC5TY3JvbGxUb0ZpeGVkXCIpO3goKTtmPS0xO0gudHJpZ2dlcihcImZpeGVkLlNjcm9sbFRvRml4ZWRcIil9dyhKKX1lbHNle2lmKCFoKCl8fCFNKXtwKCk7SC50cmlnZ2VyKFwicHJlVW5maXhlZC5TY3JvbGxUb0ZpeGVkXCIpO2woKTtILnRyaWdnZXIoXCJ1bmZpeGVkLlNjcm9sbFRvRml4ZWRcIil9fX19ZWxzZXtpZihLPjApe2lmKE4rYSh3aW5kb3cpLmhlaWdodCgpLUgub3V0ZXJIZWlnaHQodHJ1ZSk+PUstKHQoKXx8LW4oKSkpe2lmKHEoKSl7cCgpO0gudHJpZ2dlcihcInByZVVuZml4ZWQuU2Nyb2xsVG9GaXhlZFwiKTtpZihGPT09XCJhYnNvbHV0ZVwiKXtiKCl9ZWxzZXtsKCl9SC50cmlnZ2VyKFwidW5maXhlZC5TY3JvbGxUb0ZpeGVkXCIpfX1lbHNle2lmKCFxKCkpe3AoKTtILnRyaWdnZXIoXCJwcmVGaXhlZC5TY3JvbGxUb0ZpeGVkXCIpO3goKX13KEopO0gudHJpZ2dlcihcImZpeGVkLlNjcm9sbFRvRml4ZWRcIil9fWVsc2V7dyhKKX19fX19ZnVuY3Rpb24gbigpe2lmKCFtLm9wdGlvbnMuYm90dG9tKXtyZXR1cm4gMH1yZXR1cm4gbS5vcHRpb25zLmJvdHRvbX1mdW5jdGlvbiBwKCl7dmFyIEo9SC5jc3MoXCJwb3NpdGlvblwiKTtpZihKPT1cImFic29sdXRlXCIpe0gudHJpZ2dlcihcInBvc3RBYnNvbHV0ZS5TY3JvbGxUb0ZpeGVkXCIpfWVsc2V7aWYoSj09XCJmaXhlZFwiKXtILnRyaWdnZXIoXCJwb3N0Rml4ZWQuU2Nyb2xsVG9GaXhlZFwiKX1lbHNle0gudHJpZ2dlcihcInBvc3RVbmZpeGVkLlNjcm9sbFRvRml4ZWRcIil9fX12YXIgRD1mdW5jdGlvbihKKXtpZihILmlzKFwiOnZpc2libGVcIikpe2M9ZmFsc2U7QigpfWVsc2V7bCgpfX07dmFyIEc9ZnVuY3Rpb24oSil7KCEhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSk/cmVxdWVzdEFuaW1hdGlvbkZyYW1lKEIpOkIoKX07dmFyIEM9ZnVuY3Rpb24oKXt2YXIgSz1kb2N1bWVudC5ib2R5O2lmKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQmJksmJksuYXBwZW5kQ2hpbGQmJksucmVtb3ZlQ2hpbGQpe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7aWYoIU0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXtyZXR1cm4gbnVsbH1NLmlubmVySFRNTD1cInhcIjtNLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjpmaXhlZDt0b3A6MTAwcHg7XCI7Sy5hcHBlbmRDaGlsZChNKTt2YXIgTj1LLnN0eWxlLmhlaWdodCxPPUsuc2Nyb2xsVG9wO0suc3R5bGUuaGVpZ2h0PVwiMzAwMHB4XCI7Sy5zY3JvbGxUb3A9NTAwO3ZhciBKPU0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO0suc3R5bGUuaGVpZ2h0PU47dmFyIEw9KEo9PT0xMDApO0sucmVtb3ZlQ2hpbGQoTSk7Sy5zY3JvbGxUb3A9TztyZXR1cm4gTH1yZXR1cm4gbnVsbH07dmFyIHM9ZnVuY3Rpb24oSil7Sj1KfHx3aW5kb3cuZXZlbnQ7aWYoSi5wcmV2ZW50RGVmYXVsdCl7Si5wcmV2ZW50RGVmYXVsdCgpfUoucmV0dXJuVmFsdWU9ZmFsc2V9O20uaW5pdD1mdW5jdGlvbigpe20ub3B0aW9ucz1hLmV4dGVuZCh7fSxhLlNjcm9sbFRvRml4ZWQuZGVmYXVsdE9wdGlvbnMsaSk7ej1ILmNzcyhcInotaW5kZXhcIik7bS4kZWwuY3NzKFwiei1pbmRleFwiLG0ub3B0aW9ucy56SW5kZXgpO3U9YShcIjxkaXYgLz5cIik7ST1ILmNzcyhcInBvc2l0aW9uXCIpO0Y9SC5jc3MoXCJwb3NpdGlvblwiKTtrPUguY3NzKFwiZmxvYXRcIik7ZT1ILmNzcyhcInRvcFwiKTtpZihoKCkpe20uJGVsLmFmdGVyKHUpfWEod2luZG93KS5iaW5kKFwicmVzaXplLlNjcm9sbFRvRml4ZWRcIixEKTthKHdpbmRvdykuYmluZChcInNjcm9sbC5TY3JvbGxUb0ZpeGVkXCIsRyk7aWYoXCJvbnRvdWNobW92ZVwiIGluIHdpbmRvdyl7YSh3aW5kb3cpLmJpbmQoXCJ0b3VjaG1vdmUuU2Nyb2xsVG9GaXhlZFwiLEIpfWlmKG0ub3B0aW9ucy5wcmVGaXhlZCl7SC5iaW5kKFwicHJlRml4ZWQuU2Nyb2xsVG9GaXhlZFwiLG0ub3B0aW9ucy5wcmVGaXhlZCl9aWYobS5vcHRpb25zLnBvc3RGaXhlZCl7SC5iaW5kKFwicG9zdEZpeGVkLlNjcm9sbFRvRml4ZWRcIixtLm9wdGlvbnMucG9zdEZpeGVkKX1pZihtLm9wdGlvbnMucHJlVW5maXhlZCl7SC5iaW5kKFwicHJlVW5maXhlZC5TY3JvbGxUb0ZpeGVkXCIsbS5vcHRpb25zLnByZVVuZml4ZWQpfWlmKG0ub3B0aW9ucy5wb3N0VW5maXhlZCl7SC5iaW5kKFwicG9zdFVuZml4ZWQuU2Nyb2xsVG9GaXhlZFwiLG0ub3B0aW9ucy5wb3N0VW5maXhlZCl9aWYobS5vcHRpb25zLnByZUFic29sdXRlKXtILmJpbmQoXCJwcmVBYnNvbHV0ZS5TY3JvbGxUb0ZpeGVkXCIsbS5vcHRpb25zLnByZUFic29sdXRlKX1pZihtLm9wdGlvbnMucG9zdEFic29sdXRlKXtILmJpbmQoXCJwb3N0QWJzb2x1dGUuU2Nyb2xsVG9GaXhlZFwiLG0ub3B0aW9ucy5wb3N0QWJzb2x1dGUpfWlmKG0ub3B0aW9ucy5maXhlZCl7SC5iaW5kKFwiZml4ZWQuU2Nyb2xsVG9GaXhlZFwiLG0ub3B0aW9ucy5maXhlZCl9aWYobS5vcHRpb25zLnVuZml4ZWQpe0guYmluZChcInVuZml4ZWQuU2Nyb2xsVG9GaXhlZFwiLG0ub3B0aW9ucy51bmZpeGVkKX1pZihtLm9wdGlvbnMuc3BhY2VyQ2xhc3Mpe3UuYWRkQ2xhc3MobS5vcHRpb25zLnNwYWNlckNsYXNzKX1ILmJpbmQoXCJyZXNpemUuU2Nyb2xsVG9GaXhlZFwiLGZ1bmN0aW9uKCl7dS5oZWlnaHQoSC5oZWlnaHQoKSl9KTtILmJpbmQoXCJzY3JvbGwuU2Nyb2xsVG9GaXhlZFwiLGZ1bmN0aW9uKCl7SC50cmlnZ2VyKFwicHJlVW5maXhlZC5TY3JvbGxUb0ZpeGVkXCIpO2woKTtILnRyaWdnZXIoXCJ1bmZpeGVkLlNjcm9sbFRvRml4ZWRcIik7QigpfSk7SC5iaW5kKFwiZGV0YWNoLlNjcm9sbFRvRml4ZWRcIixmdW5jdGlvbihKKXtzKEopO0gudHJpZ2dlcihcInByZVVuZml4ZWQuU2Nyb2xsVG9GaXhlZFwiKTtsKCk7SC50cmlnZ2VyKFwidW5maXhlZC5TY3JvbGxUb0ZpeGVkXCIpO2Eod2luZG93KS51bmJpbmQoXCJyZXNpemUuU2Nyb2xsVG9GaXhlZFwiLEQpO2Eod2luZG93KS51bmJpbmQoXCJzY3JvbGwuU2Nyb2xsVG9GaXhlZFwiLEcpO0gudW5iaW5kKFwiLlNjcm9sbFRvRml4ZWRcIik7dS5yZW1vdmUoKTttLiRlbC5yZW1vdmVEYXRhKFwiU2Nyb2xsVG9GaXhlZFwiKX0pO0QoKX07bS5pbml0KCl9O2EuU2Nyb2xsVG9GaXhlZC5kZWZhdWx0T3B0aW9ucz17bWFyZ2luVG9wOjAsbGltaXQ6MCxib3R0b206LTEsekluZGV4OjEwMDAsYmFzZUNsYXNzTmFtZTpcInNjcm9sbC10by1maXhlZC1maXhlZFwifTthLmZuLnNjcm9sbFRvRml4ZWQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyhuZXcgYS5TY3JvbGxUb0ZpeGVkKHRoaXMsYikpfSl9fSkoalF1ZXJ5KTsiLCIvKioqKioqKioqKipcclxuXHRBbmltYXRlcyBlbGVtZW50J3MgbnVtYmVyIHRvIG5ldyBudW1iZXIgd2l0aCBjb21tYXNcclxuXHRQYXJhbWV0ZXJzOlxyXG5cdFx0c3RvcCAobnVtYmVyKTogbnVtYmVyIHRvIHN0b3Agb25cclxuICAgICAgICBjb21tYXMgKGJvb2xlYW4pOiB0dXJuIGNvbW1hcyBvbi9vZmYgKGRlZmF1bHQgaXMgdHJ1ZSlcclxuXHRcdGR1cmF0aW9uIChudW1iZXIpOiBob3cgbG9uZyBpbiBtcyAoZGVmYXVsdCBpcyAxMDAwKVxyXG5cdFx0ZWFzZSAoc3RyaW5nKTogdHlwZSBvZiBlYXNpbmcgKGRlZmF1bHQgaXMgXCJzd2luZ1wiLCBvdGhlcnMgYXJlIGF2YWlhYmxlIGZyb20galF1ZXJ5J3MgZWFzaW5nIHBsdWdpblxyXG5cdEV4YW1wbGVzOlxyXG4gICAgICAgICQoXCIjZGl2XCIpLmFuaW1hdGVOdW1iZXJzKDEyMzQsIGZhbHNlLCA1MDAsIFwibGluZWFyXCIpOyAvLyBoYWxmIHNlY29uZCBsaW5lYXIgd2l0aG91dCBjb21tYXNcclxuXHRcdCQoXCIjZGl2XCIpLmFuaW1hdGVOdW1iZXJzKDEyMzQsIHRydWUsIDIwMDApOyAvLyB0d28gc2Vjb25kIHN3aW5nIHdpdGggY29tbWFzXHJcblx0XHQkKFwiI2RpdlwiKS5hbmltYXRlTnVtYmVycyg0MzIxKTsgLy8gb25lIHNlY29uZCBzd2luZyB3aXRoIGNvbW1hc1xyXG5cdFRoaXMgZnVsbHkgZXhwZWN0cyBhbiBlbGVtZW50IGNvbnRhaW5pbmcgYW4gaW50ZWdlclxyXG5cdElmIHRoZSBudW1iZXIgaXMgd2l0aGluIGNvcHkgdGhlbiBzZXBhcmF0ZSBpdCB3aXRoIGEgc3BhbiBhbmQgdGFyZ2V0IHRoZSBzcGFuXHJcbiAgICBXaWxsIHdvcmsgaW4gYXBwcm9wcmlhdGUgaW5wdXRzXHJcblx0SW5zZXJ0cyBhbmQgYWNjb3VudHMgZm9yIGNvbW1hcyBkdXJpbmcgYW5pbWF0aW9uIGJ5IGRlZmF1bHRcclxuICAgIFxyXG4gICAgaHR0cHM6Ly9naXRodWIuY29tL3RhbG1hbmQvanF1ZXJ5LWFuaW1hdGUtbnVtYmVyc1xyXG4qKioqKioqKioqKi9cclxuXHJcbiFmdW5jdGlvbihlKXtlLmZuLmFuaW1hdGVOdW1iZXJzPWZ1bmN0aW9uKHQsYSxuLGwpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lKHRoaXMpLHI9aS5pcyhcImlucHV0XCIpLHY9cGFyc2VJbnQocj9pLnZhbCgpLnJlcGxhY2UoLywvZyxcIlwiKTppLnRleHQoKS5yZXBsYWNlKC8sL2csXCJcIikpLHU9LyhcXGQpKD89KFxcZFxcZFxcZCkrKD8hXFxkKSkvZzthPXZvaWQgMD09PWE/ITA6YSxyJiZcIm51bWJlclwiPT09aVswXS50eXBlJiYoYT0hMSksZSh7dmFsdWU6dn0pLmFuaW1hdGUoe3ZhbHVlOnR9LHtkdXJhdGlvbjp2b2lkIDA9PT1uPzFlMzpuLGVhc2luZzp2b2lkIDA9PT1sP1wic3dpbmdcIjpsLHN0ZXA6ZnVuY3Rpb24oKXtyP2kudmFsKE1hdGguZmxvb3IodGhpcy52YWx1ZSkpOmkudGV4dChNYXRoLmZsb29yKHRoaXMudmFsdWUpKSxhJiYocj9pLnZhbChpLnZhbCgpLnJlcGxhY2UodSxcIiQxLFwiKSk6aS50ZXh0KGkudGV4dCgpLnJlcGxhY2UodSxcIiQxLFwiKSkpfSxjb21wbGV0ZTpmdW5jdGlvbigpeyhwYXJzZUludChpLnRleHQoKSkhPT10fHxwYXJzZUludChpLnZhbCgpKSE9PXQpJiYocj9pLnZhbCh0KTppLnRleHQodCksYSYmKHI/aS52YWwoaS52YWwoKS5yZXBsYWNlKHUsXCIkMSxcIikpOmkudGV4dChpLnRleHQoKS5yZXBsYWNlKHUsXCIkMSxcIikpKSl9fSl9KX19KGpRdWVyeSk7IiwiLypcclxuICogalF1ZXJ5IGFwcGVhciBwbHVnaW5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJleSBTaWRvcm92XHJcbiAqIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxyXG4gKlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW9yci9qcXVlcnkuYXBwZWFyL1xyXG4gKlxyXG4gKiBWZXJzaW9uOiAwLjMuNlxyXG4gKi9cclxuKGZ1bmN0aW9uKCQpIHtcclxuICB2YXIgc2VsZWN0b3JzID0gW107XHJcblxyXG4gIHZhciBjaGVja19iaW5kZWQgPSBmYWxzZTtcclxuICB2YXIgY2hlY2tfbG9jayA9IGZhbHNlO1xyXG4gIHZhciBkZWZhdWx0cyA9IHtcclxuICAgIGludGVydmFsOiAyNTAsXHJcbiAgICBmb3JjZV9wcm9jZXNzOiBmYWxzZVxyXG4gIH07XHJcbiAgdmFyICR3aW5kb3cgPSAkKHdpbmRvdyk7XHJcblxyXG4gIHZhciAkcHJpb3JfYXBwZWFyZWQgPSBbXTtcclxuXHJcbiAgZnVuY3Rpb24gYXBwZWFyZWQoc2VsZWN0b3IpIHtcclxuICAgIHJldHVybiAkKHNlbGVjdG9yKS5maWx0ZXIoZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiAkKHRoaXMpLmlzKCc6YXBwZWFyZWQnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcHJvY2VzcygpIHtcclxuICAgIGNoZWNrX2xvY2sgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGluZGV4ID0gMCwgc2VsZWN0b3JzTGVuZ3RoID0gc2VsZWN0b3JzLmxlbmd0aDsgaW5kZXggPCBzZWxlY3RvcnNMZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgdmFyICRhcHBlYXJlZCA9IGFwcGVhcmVkKHNlbGVjdG9yc1tpbmRleF0pO1xyXG5cclxuICAgICAgJGFwcGVhcmVkLnRyaWdnZXIoJ2FwcGVhcicsIFskYXBwZWFyZWRdKTtcclxuXHJcbiAgICAgIGlmICgkcHJpb3JfYXBwZWFyZWRbaW5kZXhdKSB7XHJcbiAgICAgICAgdmFyICRkaXNhcHBlYXJlZCA9ICRwcmlvcl9hcHBlYXJlZFtpbmRleF0ubm90KCRhcHBlYXJlZCk7XHJcbiAgICAgICAgJGRpc2FwcGVhcmVkLnRyaWdnZXIoJ2Rpc2FwcGVhcicsIFskZGlzYXBwZWFyZWRdKTtcclxuICAgICAgfVxyXG4gICAgICAkcHJpb3JfYXBwZWFyZWRbaW5kZXhdID0gJGFwcGVhcmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYWRkX3NlbGVjdG9yKHNlbGVjdG9yKSB7XHJcbiAgICBzZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XHJcbiAgICAkcHJpb3JfYXBwZWFyZWQucHVzaCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gXCJhcHBlYXJlZFwiIGN1c3RvbSBmaWx0ZXJcclxuICAkLmV4cHJbJzonXS5hcHBlYXJlZCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcclxuICAgIHZhciAkZWxlbWVudCA9ICQoZWxlbWVudCk7XHJcbiAgICBpZiAoISRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgd2luZG93X2xlZnQgPSAkd2luZG93LnNjcm9sbExlZnQoKTtcclxuICAgIHZhciB3aW5kb3dfdG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKTtcclxuICAgIHZhciBvZmZzZXQgPSAkZWxlbWVudC5vZmZzZXQoKTtcclxuICAgIHZhciBsZWZ0ID0gb2Zmc2V0LmxlZnQ7XHJcbiAgICB2YXIgdG9wID0gb2Zmc2V0LnRvcDtcclxuXHJcbiAgICBpZiAodG9wICsgJGVsZW1lbnQuaGVpZ2h0KCkgPj0gd2luZG93X3RvcCAmJlxyXG4gICAgICAgIHRvcCAtICgkZWxlbWVudC5kYXRhKCdhcHBlYXItdG9wLW9mZnNldCcpIHx8IDApIDw9IHdpbmRvd190b3AgKyAkd2luZG93LmhlaWdodCgpICYmXHJcbiAgICAgICAgbGVmdCArICRlbGVtZW50LndpZHRoKCkgPj0gd2luZG93X2xlZnQgJiZcclxuICAgICAgICBsZWZ0IC0gKCRlbGVtZW50LmRhdGEoJ2FwcGVhci1sZWZ0LW9mZnNldCcpIHx8IDApIDw9IHdpbmRvd19sZWZ0ICsgJHdpbmRvdy53aWR0aCgpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gICQuZm4uZXh0ZW5kKHtcclxuICAgIC8vIHdhdGNoaW5nIGZvciBlbGVtZW50J3MgYXBwZWFyYW5jZSBpbiBicm93c2VyIHZpZXdwb3J0XHJcbiAgICBhcHBlYXI6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICAgICAgdmFyIG9wdHMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pO1xyXG4gICAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yIHx8IHRoaXM7XHJcbiAgICAgIGlmICghY2hlY2tfYmluZGVkKSB7XHJcbiAgICAgICAgdmFyIG9uX2NoZWNrID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBpZiAoY2hlY2tfbG9jaykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjaGVja19sb2NrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KHByb2Nlc3MsIG9wdHMuaW50ZXJ2YWwpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICQod2luZG93KS5zY3JvbGwob25fY2hlY2spLnJlc2l6ZShvbl9jaGVjayk7XHJcbiAgICAgICAgY2hlY2tfYmluZGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG9wdHMuZm9yY2VfcHJvY2Vzcykge1xyXG4gICAgICAgIHNldFRpbWVvdXQocHJvY2Vzcywgb3B0cy5pbnRlcnZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgYWRkX3NlbGVjdG9yKHNlbGVjdG9yKTtcclxuICAgICAgcmV0dXJuICQoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICAkLmV4dGVuZCh7XHJcbiAgICAvLyBmb3JjZSBlbGVtZW50cydzIGFwcGVhcmFuY2UgY2hlY2tcclxuICAgIGZvcmNlX2FwcGVhcjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIGlmIChjaGVja19iaW5kZWQpIHtcclxuICAgICAgICBwcm9jZXNzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59KShmdW5jdGlvbigpIHtcclxuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIC8vIE5vZGVcclxuICAgIHJldHVybiByZXF1aXJlKCdqcXVlcnknKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGpRdWVyeTtcclxuICB9XHJcbn0oKSk7XHJcbiIsIi8qIVxyXG4gKiBUaGUgRmluYWwgQ291bnRkb3duIGZvciBqUXVlcnkgdjIuMi4wIChodHRwOi8vaGlsaW9zLmdpdGh1Yi5pby9qUXVlcnkuY291bnRkb3duLylcclxuICogQ29weXJpZ2h0IChjKSAyMDE2IEVkc29uIEhpbGlvc1xyXG4gKiBcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxyXG4gKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluXHJcbiAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG9cclxuICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2ZcclxuICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxyXG4gKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICogXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxyXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKiBcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xyXG4gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1JcclxuICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSXHJcbiAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXHJcbiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXHJcbiAqL1xyXG4hZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sYSk6YShqUXVlcnkpfShmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBiKGEpe2lmKGEgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBhO2lmKFN0cmluZyhhKS5tYXRjaChnKSlyZXR1cm4gU3RyaW5nKGEpLm1hdGNoKC9eWzAtOV0qJC8pJiYoYT1OdW1iZXIoYSkpLFN0cmluZyhhKS5tYXRjaCgvXFwtLykmJihhPVN0cmluZyhhKS5yZXBsYWNlKC9cXC0vZyxcIi9cIikpLG5ldyBEYXRlKGEpO3Rocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGNhc3QgYFwiK2ErXCJgIHRvIGEgZGF0ZSBvYmplY3QuXCIpfWZ1bmN0aW9uIGMoYSl7dmFyIGI9YS50b1N0cmluZygpLnJlcGxhY2UoLyhbLj8qK14kW1xcXVxcXFwoKXt9fC1dKS9nLFwiXFxcXCQxXCIpO3JldHVybiBuZXcgUmVnRXhwKGIpfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBkPWIubWF0Y2goLyUoLXwhKT9bQS1aXXsxfSg6W147XSs7KT8vZ2kpO2lmKGQpZm9yKHZhciBmPTAsZz1kLmxlbmd0aDtmPGc7KytmKXt2YXIgaD1kW2ZdLm1hdGNoKC8lKC18ISk/KFthLXpBLVpdezF9KSg6W147XSs7KT8vKSxqPWMoaFswXSksaz1oWzFdfHxcIlwiLGw9aFszXXx8XCJcIixtPW51bGw7aD1oWzJdLGkuaGFzT3duUHJvcGVydHkoaCkmJihtPWlbaF0sbT1OdW1iZXIoYVttXSkpLG51bGwhPT1tJiYoXCIhXCI9PT1rJiYobT1lKGwsbSkpLFwiXCI9PT1rJiZtPDEwJiYobT1cIjBcIittLnRvU3RyaW5nKCkpLGI9Yi5yZXBsYWNlKGosbS50b1N0cmluZygpKSl9cmV0dXJuIGI9Yi5yZXBsYWNlKC8lJS8sXCIlXCIpfX1mdW5jdGlvbiBlKGEsYil7dmFyIGM9XCJzXCIsZD1cIlwiO3JldHVybiBhJiYoYT1hLnJlcGxhY2UoLyg6fDt8XFxzKS9naSxcIlwiKS5zcGxpdCgvXFwsLyksMT09PWEubGVuZ3RoP2M9YVswXTooZD1hWzBdLGM9YVsxXSkpLE1hdGguYWJzKGIpPjE/YzpkfXZhciBmPVtdLGc9W10saD17cHJlY2lzaW9uOjEwMCxlbGFwc2U6ITEsZGVmZXI6ITF9O2cucHVzaCgvXlswLTldKiQvLnNvdXJjZSksZy5wdXNoKC8oWzAtOV17MSwyfVxcLyl7Mn1bMC05XXs0fSggWzAtOV17MSwyfSg6WzAtOV17Mn0pezJ9KT8vLnNvdXJjZSksZy5wdXNoKC9bMC05XXs0fShbXFwvXFwtXVswLTldezEsMn0pezJ9KCBbMC05XXsxLDJ9KDpbMC05XXsyfSl7Mn0pPy8uc291cmNlKSxnPW5ldyBSZWdFeHAoZy5qb2luKFwifFwiKSk7dmFyIGk9e1k6XCJ5ZWFyc1wiLG06XCJtb250aHNcIixuOlwiZGF5c1RvTW9udGhcIixkOlwiZGF5c1RvV2Vla1wiLHc6XCJ3ZWVrc1wiLFc6XCJ3ZWVrc1RvTW9udGhcIixIOlwiaG91cnNcIixNOlwibWludXRlc1wiLFM6XCJzZWNvbmRzXCIsRDpcInRvdGFsRGF5c1wiLEk6XCJ0b3RhbEhvdXJzXCIsTjpcInRvdGFsTWludXRlc1wiLFQ6XCJ0b3RhbFNlY29uZHNcIn0saj1mdW5jdGlvbihiLGMsZCl7dGhpcy5lbD1iLHRoaXMuJGVsPWEoYiksdGhpcy5pbnRlcnZhbD1udWxsLHRoaXMub2Zmc2V0PXt9LHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxoKSx0aGlzLmZpcnN0VGljaz0hMCx0aGlzLmluc3RhbmNlTnVtYmVyPWYubGVuZ3RoLGYucHVzaCh0aGlzKSx0aGlzLiRlbC5kYXRhKFwiY291bnRkb3duLWluc3RhbmNlXCIsdGhpcy5pbnN0YW5jZU51bWJlciksZCYmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGQ/KHRoaXMuJGVsLm9uKFwidXBkYXRlLmNvdW50ZG93blwiLGQpLHRoaXMuJGVsLm9uKFwic3RvcGVkLmNvdW50ZG93blwiLGQpLHRoaXMuJGVsLm9uKFwiZmluaXNoLmNvdW50ZG93blwiLGQpKTp0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30saCxkKSksdGhpcy5zZXRGaW5hbERhdGUoYyksdGhpcy5vcHRpb25zLmRlZmVyPT09ITEmJnRoaXMuc3RhcnQoKX07YS5leHRlbmQoai5wcm90b3R5cGUse3N0YXJ0OmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuaW50ZXJ2YWwmJmNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7dmFyIGE9dGhpczt0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJ2YWw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXthLnVwZGF0ZS5jYWxsKGEpfSx0aGlzLm9wdGlvbnMucHJlY2lzaW9uKX0sc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCksdGhpcy5pbnRlcnZhbD1udWxsLHRoaXMuZGlzcGF0Y2hFdmVudChcInN0b3BlZFwiKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5pbnRlcnZhbD90aGlzLnN0b3AoKTp0aGlzLnN0YXJ0KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5zdG9wKCl9LHJlc3VtZTpmdW5jdGlvbigpe3RoaXMuc3RhcnQoKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5zdG9wLmNhbGwodGhpcyksZlt0aGlzLmluc3RhbmNlTnVtYmVyXT1udWxsLGRlbGV0ZSB0aGlzLiRlbC5kYXRhKCkuY291bnRkb3duSW5zdGFuY2V9LHNldEZpbmFsRGF0ZTpmdW5jdGlvbihhKXt0aGlzLmZpbmFsRGF0ZT1iKGEpfSx1cGRhdGU6ZnVuY3Rpb24oKXtpZigwPT09dGhpcy4kZWwuY2xvc2VzdChcImh0bWxcIikubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlKCk7dmFyIGEsYj1uZXcgRGF0ZTtyZXR1cm4gYT10aGlzLmZpbmFsRGF0ZS5nZXRUaW1lKCktYi5nZXRUaW1lKCksYT1NYXRoLmNlaWwoYS8xZTMpLGE9IXRoaXMub3B0aW9ucy5lbGFwc2UmJmE8MD8wOk1hdGguYWJzKGEpLHRoaXMudG90YWxTZWNzTGVmdD09PWF8fHRoaXMuZmlyc3RUaWNrP3ZvaWQodGhpcy5maXJzdFRpY2s9ITEpOih0aGlzLnRvdGFsU2Vjc0xlZnQ9YSx0aGlzLmVsYXBzZWQ9Yj49dGhpcy5maW5hbERhdGUsdGhpcy5vZmZzZXQ9e3NlY29uZHM6dGhpcy50b3RhbFNlY3NMZWZ0JTYwLG1pbnV0ZXM6TWF0aC5mbG9vcih0aGlzLnRvdGFsU2Vjc0xlZnQvNjApJTYwLGhvdXJzOk1hdGguZmxvb3IodGhpcy50b3RhbFNlY3NMZWZ0LzYwLzYwKSUyNCxkYXlzOk1hdGguZmxvb3IodGhpcy50b3RhbFNlY3NMZWZ0LzYwLzYwLzI0KSU3LGRheXNUb1dlZWs6TWF0aC5mbG9vcih0aGlzLnRvdGFsU2Vjc0xlZnQvNjAvNjAvMjQpJTcsZGF5c1RvTW9udGg6TWF0aC5mbG9vcih0aGlzLnRvdGFsU2Vjc0xlZnQvNjAvNjAvMjQlMzAuNDM2OCksd2Vla3M6TWF0aC5mbG9vcih0aGlzLnRvdGFsU2Vjc0xlZnQvNjAvNjAvMjQvNyksd2Vla3NUb01vbnRoOk1hdGguZmxvb3IodGhpcy50b3RhbFNlY3NMZWZ0LzYwLzYwLzI0LzcpJTQsbW9udGhzOk1hdGguZmxvb3IodGhpcy50b3RhbFNlY3NMZWZ0LzYwLzYwLzI0LzMwLjQzNjgpLHllYXJzOk1hdGguYWJzKHRoaXMuZmluYWxEYXRlLmdldEZ1bGxZZWFyKCktYi5nZXRGdWxsWWVhcigpKSx0b3RhbERheXM6TWF0aC5mbG9vcih0aGlzLnRvdGFsU2Vjc0xlZnQvNjAvNjAvMjQpLHRvdGFsSG91cnM6TWF0aC5mbG9vcih0aGlzLnRvdGFsU2Vjc0xlZnQvNjAvNjApLHRvdGFsTWludXRlczpNYXRoLmZsb29yKHRoaXMudG90YWxTZWNzTGVmdC82MCksdG90YWxTZWNvbmRzOnRoaXMudG90YWxTZWNzTGVmdH0sdm9pZCh0aGlzLm9wdGlvbnMuZWxhcHNlfHwwIT09dGhpcy50b3RhbFNlY3NMZWZ0P3RoaXMuZGlzcGF0Y2hFdmVudChcInVwZGF0ZVwiKToodGhpcy5zdG9wKCksdGhpcy5kaXNwYXRjaEV2ZW50KFwiZmluaXNoXCIpKSkpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGIpe3ZhciBjPWEuRXZlbnQoYitcIi5jb3VudGRvd25cIik7Yy5maW5hbERhdGU9dGhpcy5maW5hbERhdGUsYy5lbGFwc2VkPXRoaXMuZWxhcHNlZCxjLm9mZnNldD1hLmV4dGVuZCh7fSx0aGlzLm9mZnNldCksYy5zdHJmdGltZT1kKHRoaXMub2Zmc2V0KSx0aGlzLiRlbC50cmlnZ2VyKGMpfX0pLGEuZm4uY291bnRkb3duPWZ1bmN0aW9uKCl7dmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLmRhdGEoXCJjb3VudGRvd24taW5zdGFuY2VcIik7aWYodm9pZCAwIT09Yyl7dmFyIGQ9ZltjXSxlPWJbMF07ai5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoZSk/ZFtlXS5hcHBseShkLGIuc2xpY2UoMSkpOm51bGw9PT1TdHJpbmcoZSkubWF0Y2goL15bJEEtWl9dWzAtOUEtWl8kXSokL2kpPyhkLnNldEZpbmFsRGF0ZS5jYWxsKGQsZSksZC5zdGFydCgpKTphLmVycm9yKFwiTWV0aG9kICVzIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5jb3VudGRvd25cIi5yZXBsYWNlKC9cXCVzL2dpLGUpKX1lbHNlIG5ldyBqKHRoaXMsYlswXSxiWzFdKX0pfX0pOyIsIihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1EXG4gICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDb21tb25KU1xuICAgICAgICBmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHNcbiAgICAgICAgZmFjdG9yeShqUXVlcnkpO1xuICAgIH1cbn0oZnVuY3Rpb24gKCQpIHtcbiAgdmFyIENvdW50VG8gPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIHRoaXMub3B0aW9ucyAgPSAkLmV4dGVuZCh7fSwgQ291bnRUby5ERUZBVUxUUywgdGhpcy5kYXRhT3B0aW9ucygpLCBvcHRpb25zKTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfTtcblxuICBDb3VudFRvLkRFRkFVTFRTID0ge1xuICAgIGZyb206IDAsICAgICAgICAgICAgICAgLy8gdGhlIG51bWJlciB0aGUgZWxlbWVudCBzaG91bGQgc3RhcnQgYXRcbiAgICB0bzogMCwgICAgICAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgdGhlIGVsZW1lbnQgc2hvdWxkIGVuZCBhdFxuICAgIHNwZWVkOiAxMDAwLCAgICAgICAgICAgLy8gaG93IGxvbmcgaXQgc2hvdWxkIHRha2UgdG8gY291bnQgYmV0d2VlbiB0aGUgdGFyZ2V0IG51bWJlcnNcbiAgICByZWZyZXNoSW50ZXJ2YWw6IDEwMCwgIC8vIGhvdyBvZnRlbiB0aGUgZWxlbWVudCBzaG91bGQgYmUgdXBkYXRlZFxuICAgIGRlY2ltYWxzOiAwLCAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byBzaG93XG4gICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsICAvLyBoYW5kbGVyIGZvciBmb3JtYXR0aW5nIHRoZSB2YWx1ZSBiZWZvcmUgcmVuZGVyaW5nXG4gICAgb25VcGRhdGU6IG51bGwsICAgICAgICAvLyBjYWxsYmFjayBtZXRob2QgZm9yIGV2ZXJ5IHRpbWUgdGhlIGVsZW1lbnQgaXMgdXBkYXRlZFxuICAgIG9uQ29tcGxldGU6IG51bGwgICAgICAgLy8gY2FsbGJhY2sgbWV0aG9kIGZvciB3aGVuIHRoZSBlbGVtZW50IGZpbmlzaGVzIHVwZGF0aW5nXG4gIH07XG5cbiAgQ291bnRUby5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnZhbHVlICAgICA9IHRoaXMub3B0aW9ucy5mcm9tO1xuICAgIHRoaXMubG9vcHMgICAgID0gTWF0aC5jZWlsKHRoaXMub3B0aW9ucy5zcGVlZCAvIHRoaXMub3B0aW9ucy5yZWZyZXNoSW50ZXJ2YWwpO1xuICAgIHRoaXMubG9vcENvdW50ID0gMDtcbiAgICB0aGlzLmluY3JlbWVudCA9ICh0aGlzLm9wdGlvbnMudG8gLSB0aGlzLm9wdGlvbnMuZnJvbSkgLyB0aGlzLmxvb3BzO1xuICB9O1xuXG4gIENvdW50VG8ucHJvdG90eXBlLmRhdGFPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgZnJvbTogICAgICAgICAgICB0aGlzLiRlbGVtZW50LmRhdGEoJ2Zyb20nKSxcbiAgICAgIHRvOiAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5kYXRhKCd0bycpLFxuICAgICAgc3BlZWQ6ICAgICAgICAgICB0aGlzLiRlbGVtZW50LmRhdGEoJ3NwZWVkJyksXG4gICAgICByZWZyZXNoSW50ZXJ2YWw6IHRoaXMuJGVsZW1lbnQuZGF0YSgncmVmcmVzaC1pbnRlcnZhbCcpLFxuICAgICAgZGVjaW1hbHM6ICAgICAgICB0aGlzLiRlbGVtZW50LmRhdGEoJ2RlY2ltYWxzJylcbiAgICB9O1xuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcblxuICAgIGZvciAodmFyIGkgaW4ga2V5cykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICh0eXBlb2Yob3B0aW9uc1trZXldKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZGVsZXRlIG9wdGlvbnNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfTtcblxuICBDb3VudFRvLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy52YWx1ZSArPSB0aGlzLmluY3JlbWVudDtcbiAgICB0aGlzLmxvb3BDb3VudCsrO1xuXG4gICAgdGhpcy5yZW5kZXIoKTtcblxuICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm9uVXBkYXRlKSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLm9wdGlvbnMub25VcGRhdGUuY2FsbCh0aGlzLiRlbGVtZW50LCB0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sb29wQ291bnQgPj0gdGhpcy5sb29wcykge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm9wdGlvbnMudG87XG5cbiAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm9uQ29tcGxldGUpID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ29tcGxldGUuY2FsbCh0aGlzLiRlbGVtZW50LCB0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQ291bnRUby5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMub3B0aW9ucy5mb3JtYXR0ZXIuY2FsbCh0aGlzLiRlbGVtZW50LCB0aGlzLnZhbHVlLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuJGVsZW1lbnQudGV4dChmb3JtYXR0ZWRWYWx1ZSk7XG4gIH07XG5cbiAgQ291bnRUby5wcm90b3R5cGUucmVzdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnN0b3AoKTtcbiAgICB0aGlzLmluaXQoKTtcbiAgICB0aGlzLnN0YXJ0KCk7XG4gIH07XG5cbiAgQ291bnRUby5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zdG9wKCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy51cGRhdGUuYmluZCh0aGlzKSwgdGhpcy5vcHRpb25zLnJlZnJlc2hJbnRlcnZhbCk7XG4gIH07XG5cbiAgQ291bnRUby5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAgICB9XG4gIH07XG5cbiAgQ291bnRUby5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmludGVydmFsKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydCgpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdmFsdWUudG9GaXhlZChvcHRpb25zLmRlY2ltYWxzKTtcbiAgfVxuXG4gICQuZm4uY291bnRUbyA9IGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKTtcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnY291bnRUbycpO1xuICAgICAgdmFyIGluaXQgICAgPSAhZGF0YSB8fCB0eXBlb2Yob3B0aW9uKSA9PT0gJ29iamVjdCc7XG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZihvcHRpb24pID09PSAnb2JqZWN0JyA/IG9wdGlvbiA6IHt9O1xuICAgICAgdmFyIG1ldGhvZCAgPSB0eXBlb2Yob3B0aW9uKSA9PT0gJ3N0cmluZycgPyBvcHRpb24gOiAnc3RhcnQnO1xuXG4gICAgICBpZiAoaW5pdCkge1xuICAgICAgICBpZiAoZGF0YSkgZGF0YS5zdG9wKCk7XG4gICAgICAgICR0aGlzLmRhdGEoJ2NvdW50VG8nLCBkYXRhID0gbmV3IENvdW50VG8odGhpcywgb3B0aW9ucykpO1xuICAgICAgfVxuXG4gICAgICBkYXRhW21ldGhvZF0uY2FsbChkYXRhKTtcbiAgICB9KTtcbiAgfTtcbn0pKTtcbiIsIi8vVGl0bGU6IEN1c3RvbSBEcm9wRG93biBwbHVnaW4gYnkgUENcclxuLy9Eb2N1bWVudGF0aW9uOiBodHRwOi8vZGVzaWdud2l0aHBjLmNvbS9QbHVnaW5zL2Rkc2xpY2tcclxuKGZ1bmN0aW9uKGUpe2UuZm4uZGRzbGljaz1mdW5jdGlvbihsKXtpZihjW2xdKXtyZXR1cm4gY1tsXS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9ZWxzZXtpZih0eXBlb2YgbD09PVwib2JqZWN0XCJ8fCFsKXtyZXR1cm4gYy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1lbHNle2UuZXJyb3IoXCJNZXRob2QgXCIrbCtcIiBkb2VzIG5vdCBleGlzdHMuXCIpfX19O3ZhciBjPXt9LGQ9e2RhdGE6W10sa2VlcEpTT05JdGVtc09uVG9wOmZhbHNlLHdpZHRoOjI2MCxoZWlnaHQ6bnVsbCxiYWNrZ3JvdW5kOlwiI2VlZVwiLHNlbGVjdFRleHQ6XCJcIixkZWZhdWx0U2VsZWN0ZWRJbmRleDpudWxsLHRydW5jYXRlRGVzY3JpcHRpb246dHJ1ZSxpbWFnZVBvc2l0aW9uOlwibGVmdFwiLHNob3dTZWxlY3RlZEhUTUw6dHJ1ZSxjbGlja09mZlRvQ2xvc2U6dHJ1ZSxlbWJlZENTUzp0cnVlLG9uU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt9fSxpPSc8ZGl2IGNsYXNzPVwiZGQtc2VsZWN0XCI+PGlucHV0IGNsYXNzPVwiZGQtc2VsZWN0ZWQtdmFsdWVcIiB0eXBlPVwiaGlkZGVuXCIgLz48YSBjbGFzcz1cImRkLXNlbGVjdGVkXCI+PC9hPjxzcGFuIGNsYXNzPVwiZGQtcG9pbnRlciBkZC1wb2ludGVyLWRvd25cIj48L3NwYW4+PC9kaXY+JyxhPSc8dWwgY2xhc3M9XCJkZC1vcHRpb25zXCI+PC91bD4nLGI9JzxzdHlsZSBpZD1cImNzcy1kZHNsaWNrXCI+LmRkLXNlbGVjdHsgYm9yZGVyLXJhZGl1czoycHg7IGJvcmRlcjpzb2xpZCAxcHggI2NjYzsgcG9zaXRpb246cmVsYXRpdmU7IGN1cnNvcjpwb2ludGVyO30uZGQtZGVzYyB7IGNvbG9yOiNhYWE7IGRpc3BsYXk6YmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IGZvbnQtd2VpZ2h0Om5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuNGVtOyB9LmRkLXNlbGVjdGVkeyBvdmVyZmxvdzpoaWRkZW47IGRpc3BsYXk6YmxvY2s7IHBhZGRpbmc6MTBweDsgZm9udC13ZWlnaHQ6Ym9sZDt9LmRkLXBvaW50ZXJ7IHdpZHRoOjA7IGhlaWdodDowOyBwb3NpdGlvbjphYnNvbHV0ZTsgcmlnaHQ6MTBweDsgdG9wOjUwJTsgbWFyZ2luLXRvcDotM3B4O30uZGQtcG9pbnRlci1kb3dueyBib3JkZXI6c29saWQgNXB4IHRyYW5zcGFyZW50OyBib3JkZXItdG9wOnNvbGlkIDVweCAjMDAwOyB9LmRkLXBvaW50ZXItdXB7Ym9yZGVyOnNvbGlkIDVweCB0cmFuc3BhcmVudCAhaW1wb3J0YW50OyBib3JkZXItYm90dG9tOnNvbGlkIDVweCAjMDAwICFpbXBvcnRhbnQ7IG1hcmdpbi10b3A6LThweDt9LmRkLW9wdGlvbnN7IGJvcmRlcjpzb2xpZCAxcHggI2NjYzsgYm9yZGVyLXRvcDpub25lOyBsaXN0LXN0eWxlOm5vbmU7IGJveC1zaGFkb3c6MHB4IDFweCA1cHggI2RkZDsgZGlzcGxheTpub25lOyBwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDoyMDAwOyBtYXJnaW46MDsgcGFkZGluZzowO2JhY2tncm91bmQ6I2ZmZjsgb3ZlcmZsb3c6YXV0bzt9LmRkLW9wdGlvbnsgcGFkZGluZzoxMHB4OyBkaXNwbGF5OmJsb2NrOyBib3JkZXItYm90dG9tOnNvbGlkIDFweCAjZGRkOyBvdmVyZmxvdzpoaWRkZW47IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjojMzMzOyBjdXJzb3I6cG9pbnRlcjstd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluLW91dDsgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4yNXMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjogYWxsIDAuMjVzIGVhc2UtaW4tb3V0Oy1tcy10cmFuc2l0aW9uOiBhbGwgMC4yNXMgZWFzZS1pbi1vdXQ7IH0uZGQtb3B0aW9ucyA+IGxpOmxhc3QtY2hpbGQgPiAuZGQtb3B0aW9ueyBib3JkZXItYm90dG9tOm5vbmU7fS5kZC1vcHRpb246aG92ZXJ7IGJhY2tncm91bmQ6I2YzZjNmMzsgY29sb3I6IzAwMDt9LmRkLXNlbGVjdGVkLWRlc2NyaXB0aW9uLXRydW5jYXRlZCB7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTpub3dyYXA7IH0uZGQtb3B0aW9uLXNlbGVjdGVkIHsgYmFja2dyb3VuZDojZjZmNmY2OyB9LmRkLW9wdGlvbi1pbWFnZSwgLmRkLXNlbGVjdGVkLWltYWdlIHsgdmVydGljYWwtYWxpZ246bWlkZGxlOyBmbG9hdDpsZWZ0OyBtYXJnaW4tcmlnaHQ6NXB4OyBtYXgtd2lkdGg6NjRweDt9LmRkLWltYWdlLXJpZ2h0IHsgZmxvYXQ6cmlnaHQ7IG1hcmdpbi1yaWdodDoxNXB4OyBtYXJnaW4tbGVmdDo1cHg7fS5kZC1jb250YWluZXJ7IHBvc2l0aW9uOnJlbGF0aXZlO33igIsgLmRkLXNlbGVjdGVkLXRleHQgeyBmb250LXdlaWdodDpib2xkfeKAizwvc3R5bGU+JztjLmluaXQ9ZnVuY3Rpb24obCl7dmFyIGw9ZS5leHRlbmQoe30sZCxsKTtpZihlKFwiI2Nzcy1kZHNsaWNrXCIpLmxlbmd0aDw9MCYmbC5lbWJlZENTUyl7ZShiKS5hcHBlbmRUbyhcImhlYWRcIil9cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBwPWUodGhpcykscT1wLmRhdGEoXCJkZHNsaWNrXCIpO2lmKCFxKXt2YXIgbj1bXSxvPWwuZGF0YTtwLmZpbmQoXCJvcHRpb25cIikuZWFjaChmdW5jdGlvbigpe3ZhciB3PWUodGhpcyksdj13LmRhdGEoKTtuLnB1c2goe3RleHQ6ZS50cmltKHcudGV4dCgpKSx2YWx1ZTp3LnZhbCgpLHNlbGVjdGVkOncuaXMoXCI6c2VsZWN0ZWRcIiksZGVzY3JpcHRpb246di5kZXNjcmlwdGlvbixpbWFnZVNyYzp2LmltYWdlc3JjfSl9KTtpZihsLmtlZXBKU09OSXRlbXNPblRvcCl7ZS5tZXJnZShsLmRhdGEsbil9ZWxzZXtsLmRhdGE9ZS5tZXJnZShuLGwuZGF0YSl9dmFyIG09cCxzPWUoJzxkaXYgaWQ9XCInK3AuYXR0cihcImlkXCIpKydcIj48L2Rpdj4nKTtwLnJlcGxhY2VXaXRoKHMpO3A9cztwLmFkZENsYXNzKFwiZGQtY29udGFpbmVyXCIpLmFwcGVuZChpKS5hcHBlbmQoYSk7dmFyIG49cC5maW5kKFwiLmRkLXNlbGVjdFwiKSx1PXAuZmluZChcIi5kZC1vcHRpb25zXCIpO3UuY3NzKHt3aWR0aDpsLndpZHRofSk7bi5jc3Moe3dpZHRoOmwud2lkdGgsYmFja2dyb3VuZDpsLmJhY2tncm91bmR9KTtwLmNzcyh7d2lkdGg6bC53aWR0aH0pO2lmKGwuaGVpZ2h0IT1udWxsKXt1LmNzcyh7aGVpZ2h0OmwuaGVpZ2h0LG92ZXJmbG93OlwiYXV0b1wifSl9ZS5lYWNoKGwuZGF0YSxmdW5jdGlvbih2LHcpe2lmKHcuc2VsZWN0ZWQpe2wuZGVmYXVsdFNlbGVjdGVkSW5kZXg9dn11LmFwcGVuZCgnPGxpPjxhIGNsYXNzPVwiZGQtb3B0aW9uXCI+Jysody52YWx1ZT8nIDxpbnB1dCBjbGFzcz1cImRkLW9wdGlvbi12YWx1ZVwiIHR5cGU9XCJoaWRkZW5cIiB2YWx1ZT1cIicrdy52YWx1ZSsnXCIgLz4nOlwiXCIpKyh3LmltYWdlU3JjPycgPGltZyBjbGFzcz1cImRkLW9wdGlvbi1pbWFnZScrKGwuaW1hZ2VQb3NpdGlvbj09XCJyaWdodFwiP1wiIGRkLWltYWdlLXJpZ2h0XCI6XCJcIikrJ1wiIHNyYz1cIicrdy5pbWFnZVNyYysnXCIgLz4nOlwiXCIpKyh3LnRleHQ/JyA8bGFiZWwgY2xhc3M9XCJkZC1vcHRpb24tdGV4dFwiPicrdy50ZXh0K1wiPC9sYWJlbD5cIjpcIlwiKSsody5kZXNjcmlwdGlvbj8nIDxzbWFsbCBjbGFzcz1cImRkLW9wdGlvbi1kZXNjcmlwdGlvbiBkZC1kZXNjXCI+Jyt3LmRlc2NyaXB0aW9uK1wiPC9zbWFsbD5cIjpcIlwiKStcIjwvYT48L2xpPlwiKX0pO3ZhciB0PXtzZXR0aW5nczpsLG9yaWdpbmFsOm0sc2VsZWN0ZWRJbmRleDotMSxzZWxlY3RlZEl0ZW06bnVsbCxzZWxlY3RlZERhdGE6bnVsbH07cC5kYXRhKFwiZGRzbGlja1wiLHQpO2lmKGwuc2VsZWN0VGV4dC5sZW5ndGg+MCYmbC5kZWZhdWx0U2VsZWN0ZWRJbmRleD09bnVsbCl7cC5maW5kKFwiLmRkLXNlbGVjdGVkXCIpLmh0bWwobC5zZWxlY3RUZXh0KX1lbHNle3ZhciByPShsLmRlZmF1bHRTZWxlY3RlZEluZGV4IT1udWxsJiZsLmRlZmF1bHRTZWxlY3RlZEluZGV4Pj0wJiZsLmRlZmF1bHRTZWxlY3RlZEluZGV4PGwuZGF0YS5sZW5ndGgpP2wuZGVmYXVsdFNlbGVjdGVkSW5kZXg6MDtqKHAscil9cC5maW5kKFwiLmRkLXNlbGVjdFwiKS5vbihcImNsaWNrLmRkc2xpY2tcIixmdW5jdGlvbigpe2YocCl9KTtwLmZpbmQoXCIuZGQtb3B0aW9uXCIpLm9uKFwiY2xpY2suZGRzbGlja1wiLGZ1bmN0aW9uKCl7aihwLGUodGhpcykuY2xvc2VzdChcImxpXCIpLmluZGV4KCkpfSk7aWYobC5jbGlja09mZlRvQ2xvc2Upe3UuYWRkQ2xhc3MoXCJkZC1jbGljay1vZmYtY2xvc2VcIik7cC5vbihcImNsaWNrLmRkc2xpY2tcIixmdW5jdGlvbih2KXt2LnN0b3BQcm9wYWdhdGlvbigpfSk7ZShcImJvZHlcIikub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7ZShcIi5kZC1jbGljay1vZmYtY2xvc2VcIikuc2xpZGVVcCg1MCkuc2libGluZ3MoXCIuZGQtc2VsZWN0XCIpLmZpbmQoXCIuZGQtcG9pbnRlclwiKS5yZW1vdmVDbGFzcyhcImRkLXBvaW50ZXItdXBcIil9KX19fSl9O2Muc2VsZWN0PWZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihsLmluZGV4IT09dW5kZWZpbmVkKXtqKGUodGhpcyksbC5pbmRleCl9fSl9O2Mub3Blbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbT1lKHRoaXMpLGw9bS5kYXRhKFwiZGRzbGlja1wiKTtpZihsKXtmKG0pfX0pfTtjLmNsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBtPWUodGhpcyksbD1tLmRhdGEoXCJkZHNsaWNrXCIpO2lmKGwpe2sobSl9fSl9O2MuZGVzdHJveT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1lKHRoaXMpLG09bi5kYXRhKFwiZGRzbGlja1wiKTtpZihtKXt2YXIgbD1tLm9yaWdpbmFsO24ucmVtb3ZlRGF0YShcImRkc2xpY2tcIikudW5iaW5kKFwiLmRkc2xpY2tcIikucmVwbGFjZVdpdGgobCl9fSl9O2Z1bmN0aW9uIGoocSxzKXt2YXIgdT1xLmRhdGEoXCJkZHNsaWNrXCIpO3ZhciByPXEuZmluZChcIi5kZC1zZWxlY3RlZFwiKSxuPXIuc2libGluZ3MoXCIuZGQtc2VsZWN0ZWQtdmFsdWVcIiksdj1xLmZpbmQoXCIuZGQtb3B0aW9uc1wiKSxsPXIuc2libGluZ3MoXCIuZGQtcG9pbnRlclwiKSxwPXEuZmluZChcIi5kZC1vcHRpb25cIikuZXEocyksbT1wLmNsb3Nlc3QoXCJsaVwiKSxvPXUuc2V0dGluZ3MsdD11LnNldHRpbmdzLmRhdGFbc107cS5maW5kKFwiLmRkLW9wdGlvblwiKS5yZW1vdmVDbGFzcyhcImRkLW9wdGlvbi1zZWxlY3RlZFwiKTtwLmFkZENsYXNzKFwiZGQtb3B0aW9uLXNlbGVjdGVkXCIpO3Uuc2VsZWN0ZWRJbmRleD1zO3Uuc2VsZWN0ZWRJdGVtPW07dS5zZWxlY3RlZERhdGE9dDtpZihvLnNob3dTZWxlY3RlZEhUTUwpe3IuaHRtbCgodC5pbWFnZVNyYz8nPGltZyBjbGFzcz1cImRkLXNlbGVjdGVkLWltYWdlJysoby5pbWFnZVBvc2l0aW9uPT1cInJpZ2h0XCI/XCIgZGQtaW1hZ2UtcmlnaHRcIjpcIlwiKSsnXCIgc3JjPVwiJyt0LmltYWdlU3JjKydcIiAvPic6XCJcIikrKHQudGV4dD8nPGxhYmVsIGNsYXNzPVwiZGQtc2VsZWN0ZWQtdGV4dFwiPicrdC50ZXh0K1wiPC9sYWJlbD5cIjpcIlwiKSsodC5kZXNjcmlwdGlvbj8nPHNtYWxsIGNsYXNzPVwiZGQtc2VsZWN0ZWQtZGVzY3JpcHRpb24gZGQtZGVzYycrKG8udHJ1bmNhdGVEZXNjcmlwdGlvbj9cIiBkZC1zZWxlY3RlZC1kZXNjcmlwdGlvbi10cnVuY2F0ZWRcIjpcIlwiKSsnXCIgPicrdC5kZXNjcmlwdGlvbitcIjwvc21hbGw+XCI6XCJcIikpfWVsc2V7ci5odG1sKHQudGV4dCl9bi52YWwodC52YWx1ZSk7dS5vcmlnaW5hbC52YWwodC52YWx1ZSk7cS5kYXRhKFwiZGRzbGlja1wiLHUpO2socSk7ZyhxKTtpZih0eXBlb2Ygby5vblNlbGVjdGVkPT1cImZ1bmN0aW9uXCIpe28ub25TZWxlY3RlZC5jYWxsKHRoaXMsdSl9fWZ1bmN0aW9uIGYocCl7dmFyIG89cC5maW5kKFwiLmRkLXNlbGVjdFwiKSxtPW8uc2libGluZ3MoXCIuZGQtb3B0aW9uc1wiKSxsPW8uZmluZChcIi5kZC1wb2ludGVyXCIpLG49bS5pcyhcIjp2aXNpYmxlXCIpO2UoXCIuZGQtY2xpY2stb2ZmLWNsb3NlXCIpLm5vdChtKS5zbGlkZVVwKDUwKTtlKFwiLmRkLXBvaW50ZXJcIikucmVtb3ZlQ2xhc3MoXCJkZC1wb2ludGVyLXVwXCIpO2lmKG4pe20uc2xpZGVVcChcImZhc3RcIik7bC5yZW1vdmVDbGFzcyhcImRkLXBvaW50ZXItdXBcIil9ZWxzZXttLnNsaWRlRG93bihcImZhc3RcIik7bC5hZGRDbGFzcyhcImRkLXBvaW50ZXItdXBcIil9aChwKX1mdW5jdGlvbiBrKGwpe2wuZmluZChcIi5kZC1vcHRpb25zXCIpLnNsaWRlVXAoNTApO2wuZmluZChcIi5kZC1wb2ludGVyXCIpLnJlbW92ZUNsYXNzKFwiZGQtcG9pbnRlci11cFwiKS5yZW1vdmVDbGFzcyhcImRkLXBvaW50ZXItdXBcIil9ZnVuY3Rpb24gZyhvKXt2YXIgbj1vLmZpbmQoXCIuZGQtc2VsZWN0XCIpLmNzcyhcImhlaWdodFwiKTt2YXIgbT1vLmZpbmQoXCIuZGQtc2VsZWN0ZWQtZGVzY3JpcHRpb25cIik7dmFyIGw9by5maW5kKFwiLmRkLXNlbGVjdGVkLWltYWdlXCIpO2lmKG0ubGVuZ3RoPD0wJiZsLmxlbmd0aD4wKXtvLmZpbmQoXCIuZGQtc2VsZWN0ZWQtdGV4dFwiKS5jc3MoXCJsaW5lSGVpZ2h0XCIsbil9fWZ1bmN0aW9uIGgobCl7bC5maW5kKFwiLmRkLW9wdGlvblwiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHA9ZSh0aGlzKTt2YXIgbj1wLmNzcyhcImhlaWdodFwiKTt2YXIgbz1wLmZpbmQoXCIuZGQtb3B0aW9uLWRlc2NyaXB0aW9uXCIpO3ZhciBtPWwuZmluZChcIi5kZC1vcHRpb24taW1hZ2VcIik7aWYoby5sZW5ndGg8PTAmJm0ubGVuZ3RoPjApe3AuZmluZChcIi5kZC1vcHRpb24tdGV4dFwiKS5jc3MoXCJsaW5lSGVpZ2h0XCIsbil9fSl9fSkoalF1ZXJ5KTsiLCIvKlxyXG4gKiBqUXVlcnkgRWFzaW5nIHYxLjQuMCAtIGh0dHA6Ly9nc2dkLmNvLnVrL3NhbmRib3gvanF1ZXJ5L2Vhc2luZy9cclxuICogT3BlbiBzb3VyY2UgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLlxyXG4gKiBDb3B5cmlnaHQgwqkgMjAwOCBHZW9yZ2UgTWNHaW5sZXkgU21pdGhcclxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9nZHNtaXRoL2pxdWVyeS1lYXNpbmcvbWFzdGVyL0xJQ0VOU0VcclxuKi9cclxuIWZ1bmN0aW9uKG4pe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKGUpe3JldHVybiBuKGUpfSk6XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZS5leHBvcnRzP2V4cG9ydHM9bihyZXF1aXJlKFwianF1ZXJ5XCIpKTpuKGpRdWVyeSl9KGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dmFyIGU9Ny41NjI1LHQ9Mi43NTtyZXR1cm4gbjwxL3Q/ZSpuKm46bjwyL3Q/ZSoobi09MS41L3QpKm4rLjc1Om48Mi41L3Q/ZSoobi09Mi4yNS90KSpuKy45Mzc1OmUqKG4tPTIuNjI1L3QpKm4rLjk4NDM3NX1uLmVhc2luZy5qc3dpbmc9bi5lYXNpbmcuc3dpbmc7dmFyIHQ9TWF0aC5wb3csdT1NYXRoLnNxcnQscj1NYXRoLnNpbixpPU1hdGguY29zLGE9TWF0aC5QSSxjPTEuNzAxNTgsbz0xLjUyNSpjLHM9MiphLzMsZj0yKmEvNC41O24uZXh0ZW5kKG4uZWFzaW5nLHtkZWY6XCJlYXNlT3V0UXVhZFwiLHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybiBuLmVhc2luZ1tuLmVhc2luZy5kZWZdKGUpfSxlYXNlSW5RdWFkOmZ1bmN0aW9uKG4pe3JldHVybiBuKm59LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKG4pe3JldHVybiAxLSgxLW4pKigxLW4pfSxlYXNlSW5PdXRRdWFkOmZ1bmN0aW9uKG4pe3JldHVybiBuPC41PzIqbipuOjEtdCgtMipuKzIsMikvMn0sZWFzZUluQ3ViaWM6ZnVuY3Rpb24obil7cmV0dXJuIG4qbipufSxlYXNlT3V0Q3ViaWM6ZnVuY3Rpb24obil7cmV0dXJuIDEtdCgxLW4sMyl9LGVhc2VJbk91dEN1YmljOmZ1bmN0aW9uKG4pe3JldHVybiBuPC41PzQqbipuKm46MS10KC0yKm4rMiwzKS8yfSxlYXNlSW5RdWFydDpmdW5jdGlvbihuKXtyZXR1cm4gbipuKm4qbn0sZWFzZU91dFF1YXJ0OmZ1bmN0aW9uKG4pe3JldHVybiAxLXQoMS1uLDQpfSxlYXNlSW5PdXRRdWFydDpmdW5jdGlvbihuKXtyZXR1cm4gbjwuNT84Km4qbipuKm46MS10KC0yKm4rMiw0KS8yfSxlYXNlSW5RdWludDpmdW5jdGlvbihuKXtyZXR1cm4gbipuKm4qbipufSxlYXNlT3V0UXVpbnQ6ZnVuY3Rpb24obil7cmV0dXJuIDEtdCgxLW4sNSl9LGVhc2VJbk91dFF1aW50OmZ1bmN0aW9uKG4pe3JldHVybiBuPC41PzE2Km4qbipuKm4qbjoxLXQoLTIqbisyLDUpLzJ9LGVhc2VJblNpbmU6ZnVuY3Rpb24obil7cmV0dXJuIDEtaShuKmEvMil9LGVhc2VPdXRTaW5lOmZ1bmN0aW9uKG4pe3JldHVybiByKG4qYS8yKX0sZWFzZUluT3V0U2luZTpmdW5jdGlvbihuKXtyZXR1cm4tKGkoYSpuKS0xKS8yfSxlYXNlSW5FeHBvOmZ1bmN0aW9uKG4pe3JldHVybiAwPT09bj8wOnQoMiwxMCpuLTEwKX0sZWFzZU91dEV4cG86ZnVuY3Rpb24obil7cmV0dXJuIDE9PT1uPzE6MS10KDIsLTEwKm4pfSxlYXNlSW5PdXRFeHBvOmZ1bmN0aW9uKG4pe3JldHVybiAwPT09bj8wOjE9PT1uPzE6bjwuNT90KDIsMjAqbi0xMCkvMjooMi10KDIsLTIwKm4rMTApKS8yfSxlYXNlSW5DaXJjOmZ1bmN0aW9uKG4pe3JldHVybiAxLXUoMS10KG4sMikpfSxlYXNlT3V0Q2lyYzpmdW5jdGlvbihuKXtyZXR1cm4gdSgxLXQobi0xLDIpKX0sZWFzZUluT3V0Q2lyYzpmdW5jdGlvbihuKXtyZXR1cm4gbjwuNT8oMS11KDEtdCgyKm4sMikpKS8yOih1KDEtdCgtMipuKzIsMikpKzEpLzJ9LGVhc2VJbkVsYXN0aWM6ZnVuY3Rpb24obil7cmV0dXJuIDA9PT1uPzA6MT09PW4/MTotdCgyLDEwKm4tMTApKnIoKDEwKm4tMTAuNzUpKnMpfSxlYXNlT3V0RWxhc3RpYzpmdW5jdGlvbihuKXtyZXR1cm4gMD09PW4/MDoxPT09bj8xOnQoMiwtMTAqbikqcigoMTAqbi0uNzUpKnMpKzF9LGVhc2VJbk91dEVsYXN0aWM6ZnVuY3Rpb24obil7cmV0dXJuIDA9PT1uPzA6MT09PW4/MTpuPC41Py0odCgyLDIwKm4tMTApKnIoKDIwKm4tMTEuMTI1KSpmKSkvMjp0KDIsLTIwKm4rMTApKnIoKDIwKm4tMTEuMTI1KSpmKS8yKzF9LGVhc2VJbkJhY2s6ZnVuY3Rpb24obil7cmV0dXJuKGMrMSkqbipuKm4tYypuKm59LGVhc2VPdXRCYWNrOmZ1bmN0aW9uKG4pe3JldHVybiAxKyhjKzEpKnQobi0xLDMpK2MqdChuLTEsMil9LGVhc2VJbk91dEJhY2s6ZnVuY3Rpb24obil7cmV0dXJuIG48LjU/dCgyKm4sMikqKDcuMTg5ODE5Km4tbykvMjoodCgyKm4tMiwyKSooKG8rMSkqKDIqbi0yKStvKSsyKS8yfSxlYXNlSW5Cb3VuY2U6ZnVuY3Rpb24obil7cmV0dXJuIDEtZSgxLW4pfSxlYXNlT3V0Qm91bmNlOmUsZWFzZUluT3V0Qm91bmNlOmZ1bmN0aW9uKG4pe3JldHVybiBuPC41PygxLWUoMS0yKm4pKS8yOigxK2UoMipuLTEpKS8yfX0pfSk7IiwiLyoqIVxyXG4gKiBlYXN5LXBpZS1jaGFydFxyXG4gKiBMaWdodHdlaWdodCBwbHVnaW4gdG8gcmVuZGVyIHNpbXBsZSwgYW5pbWF0ZWQgYW5kIHJldGluYSBvcHRpbWl6ZWQgcGllIGNoYXJ0c1xyXG4gKlxyXG4gKiBAbGljZW5zZSBcclxuICogQGF1dGhvciBSb2JlcnQgRmxlaXNjaG1hbm4gPHJlbmRybzg3QGdtYWlsLmNvbT4gKGh0dHA6Ly9yb2JlcnQtZmxlaXNjaG1hbm4uZGUpXHJcbiAqIEB2ZXJzaW9uIDIuMS43XHJcbiAqKi9cclxuIWZ1bmN0aW9uKGEsYil7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sZnVuY3Rpb24oYSl7cmV0dXJuIGIoYSl9KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1iKHJlcXVpcmUoXCJqcXVlcnlcIikpOmIoalF1ZXJ5KX0odGhpcyxmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTthLmFwcGVuZENoaWxkKGQpLFwib2JqZWN0XCI9PXR5cGVvZiBHX3ZtbENhbnZhc01hbmFnZXImJkdfdm1sQ2FudmFzTWFuYWdlci5pbml0RWxlbWVudChkKTt2YXIgZT1kLmdldENvbnRleHQoXCIyZFwiKTtkLndpZHRoPWQuaGVpZ2h0PWIuc2l6ZTt2YXIgZj0xO3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvPjEmJihmPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLGQuc3R5bGUud2lkdGg9ZC5zdHlsZS5oZWlnaHQ9W2Iuc2l6ZSxcInB4XCJdLmpvaW4oXCJcIiksZC53aWR0aD1kLmhlaWdodD1iLnNpemUqZixlLnNjYWxlKGYsZikpLGUudHJhbnNsYXRlKGIuc2l6ZS8yLGIuc2l6ZS8yKSxlLnJvdGF0ZSgoLTAuNStiLnJvdGF0ZS8xODApKk1hdGguUEkpO3ZhciBnPShiLnNpemUtYi5saW5lV2lkdGgpLzI7Yi5zY2FsZUNvbG9yJiZiLnNjYWxlTGVuZ3RoJiYoZy09Yi5zY2FsZUxlbmd0aCsyKSxEYXRlLm5vdz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9O3ZhciBoPWZ1bmN0aW9uKGEsYixjKXtjPU1hdGgubWluKE1hdGgubWF4KC0xLGN8fDApLDEpO3ZhciBkPTA+PWM/ITA6ITE7ZS5iZWdpblBhdGgoKSxlLmFyYygwLDAsZywwLDIqTWF0aC5QSSpjLGQpLGUuc3Ryb2tlU3R5bGU9YSxlLmxpbmVXaWR0aD1iLGUuc3Ryb2tlKCl9LGk9ZnVuY3Rpb24oKXt2YXIgYSxjO2UubGluZVdpZHRoPTEsZS5maWxsU3R5bGU9Yi5zY2FsZUNvbG9yLGUuc2F2ZSgpO2Zvcih2YXIgZD0yNDtkPjA7LS1kKWQlNj09PTA/KGM9Yi5zY2FsZUxlbmd0aCxhPTApOihjPS42KmIuc2NhbGVMZW5ndGgsYT1iLnNjYWxlTGVuZ3RoLWMpLGUuZmlsbFJlY3QoLWIuc2l6ZS8yK2EsMCxjLDEpLGUucm90YXRlKE1hdGguUEkvMTIpO2UucmVzdG9yZSgpfSxqPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGEsMWUzLzYwKX19KCksaz1mdW5jdGlvbigpe2Iuc2NhbGVDb2xvciYmaSgpLGIudHJhY2tDb2xvciYmaChiLnRyYWNrQ29sb3IsYi50cmFja1dpZHRofHxiLmxpbmVXaWR0aCwxKX07dGhpcy5nZXRDYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy5nZXRDdHg9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sdGhpcy5jbGVhcj1mdW5jdGlvbigpe2UuY2xlYXJSZWN0KGIuc2l6ZS8tMixiLnNpemUvLTIsYi5zaXplLGIuc2l6ZSl9LHRoaXMuZHJhdz1mdW5jdGlvbihhKXtiLnNjYWxlQ29sb3J8fGIudHJhY2tDb2xvcj9lLmdldEltYWdlRGF0YSYmZS5wdXRJbWFnZURhdGE/Yz9lLnB1dEltYWdlRGF0YShjLDAsMCk6KGsoKSxjPWUuZ2V0SW1hZ2VEYXRhKDAsMCxiLnNpemUqZixiLnNpemUqZikpOih0aGlzLmNsZWFyKCksaygpKTp0aGlzLmNsZWFyKCksZS5saW5lQ2FwPWIubGluZUNhcDt2YXIgZDtkPVwiZnVuY3Rpb25cIj09dHlwZW9mIGIuYmFyQ29sb3I/Yi5iYXJDb2xvcihhKTpiLmJhckNvbG9yLGgoZCxiLmxpbmVXaWR0aCxhLzEwMCl9LmJpbmQodGhpcyksdGhpcy5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9RGF0ZS5ub3coKTtiLm9uU3RhcnQoYSxjKTt2YXIgZT1mdW5jdGlvbigpe3ZhciBmPU1hdGgubWluKERhdGUubm93KCktZCxiLmFuaW1hdGUuZHVyYXRpb24pLGc9Yi5lYXNpbmcodGhpcyxmLGEsYy1hLGIuYW5pbWF0ZS5kdXJhdGlvbik7dGhpcy5kcmF3KGcpLGIub25TdGVwKGEsYyxnKSxmPj1iLmFuaW1hdGUuZHVyYXRpb24/Yi5vblN0b3AoYSxjKTpqKGUpfS5iaW5kKHRoaXMpO2ooZSl9LmJpbmQodGhpcyl9LGM9ZnVuY3Rpb24oYSxjKXt2YXIgZD17YmFyQ29sb3I6XCIjZWYxZTI1XCIsdHJhY2tDb2xvcjpcIiNmOWY5ZjlcIixzY2FsZUNvbG9yOlwiI2RmZTBlMFwiLHNjYWxlTGVuZ3RoOjUsbGluZUNhcDpcInJvdW5kXCIsbGluZVdpZHRoOjMsdHJhY2tXaWR0aDp2b2lkIDAsc2l6ZToxMTAscm90YXRlOjAsYW5pbWF0ZTp7ZHVyYXRpb246MWUzLGVuYWJsZWQ6ITB9LGVhc2luZzpmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBiLz1lLzIsMT5iP2QvMipiKmIrYzotZC8yKigtLWIqKGItMiktMSkrY30sb25TdGFydDpmdW5jdGlvbihhLGIpe30sb25TdGVwOmZ1bmN0aW9uKGEsYixjKXt9LG9uU3RvcDpmdW5jdGlvbihhLGIpe319O2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBiKWQucmVuZGVyZXI9YjtlbHNle2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTVkdSZW5kZXJlcil0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2UgbG9hZCBlaXRoZXIgdGhlIFNWRy0gb3IgdGhlIENhbnZhc1JlbmRlcmVyXCIpO2QucmVuZGVyZXI9U1ZHUmVuZGVyZXJ9dmFyIGU9e30sZj0wLGc9ZnVuY3Rpb24oKXt0aGlzLmVsPWEsdGhpcy5vcHRpb25zPWU7Zm9yKHZhciBiIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShiKSYmKGVbYl09YyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNbYl0/Y1tiXTpkW2JdLFwiZnVuY3Rpb25cIj09dHlwZW9mIGVbYl0mJihlW2JdPWVbYl0uYmluZCh0aGlzKSkpO1wic3RyaW5nXCI9PXR5cGVvZiBlLmVhc2luZyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGpRdWVyeSYmalF1ZXJ5LmlzRnVuY3Rpb24oalF1ZXJ5LmVhc2luZ1tlLmVhc2luZ10pP2UuZWFzaW5nPWpRdWVyeS5lYXNpbmdbZS5lYXNpbmddOmUuZWFzaW5nPWQuZWFzaW5nLFwibnVtYmVyXCI9PXR5cGVvZiBlLmFuaW1hdGUmJihlLmFuaW1hdGU9e2R1cmF0aW9uOmUuYW5pbWF0ZSxlbmFibGVkOiEwfSksXCJib29sZWFuXCIhPXR5cGVvZiBlLmFuaW1hdGV8fGUuYW5pbWF0ZXx8KGUuYW5pbWF0ZT17ZHVyYXRpb246MWUzLGVuYWJsZWQ6ZS5hbmltYXRlfSksdGhpcy5yZW5kZXJlcj1uZXcgZS5yZW5kZXJlcihhLGUpLHRoaXMucmVuZGVyZXIuZHJhdyhmKSxhLmRhdGFzZXQmJmEuZGF0YXNldC5wZXJjZW50P3RoaXMudXBkYXRlKHBhcnNlRmxvYXQoYS5kYXRhc2V0LnBlcmNlbnQpKTphLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBlcmNlbnRcIikmJnRoaXMudXBkYXRlKHBhcnNlRmxvYXQoYS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBlcmNlbnRcIikpKX0uYmluZCh0aGlzKTt0aGlzLnVwZGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gYT1wYXJzZUZsb2F0KGEpLGUuYW5pbWF0ZS5lbmFibGVkP3RoaXMucmVuZGVyZXIuYW5pbWF0ZShmLGEpOnRoaXMucmVuZGVyZXIuZHJhdyhhKSxmPWEsdGhpc30uYmluZCh0aGlzKSx0aGlzLmRpc2FibGVBbmltYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gZS5hbmltYXRlLmVuYWJsZWQ9ITEsdGhpc30sdGhpcy5lbmFibGVBbmltYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gZS5hbmltYXRlLmVuYWJsZWQ9ITAsdGhpc30sZygpfTthLmZuLmVhc3lQaWVDaGFydD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ7YS5kYXRhKHRoaXMsXCJlYXN5UGllQ2hhcnRcIil8fChkPWEuZXh0ZW5kKHt9LGIsYSh0aGlzKS5kYXRhKCkpLGEuZGF0YSh0aGlzLFwiZWFzeVBpZUNoYXJ0XCIsbmV3IGModGhpcyxkKSkpfSl9fSk7IiwiIWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG8oKXtlKHdpbmRvdykubG9hZChzKSxlKHdpbmRvdykub24oXCJyZWRyYXdcIixmdW5jdGlvbigpe3N3aXRjaGVkPSExLHMoKX0pLGUod2luZG93KS5vbihcInJlc2l6ZVwiLHMpfWZ1bmN0aW9uIHMoKXt3LmRyYXcoKSx2LmRyYXcoKSxiLmRyYXcoKSxmLmRyYXcoKX1mdW5jdGlvbiByKGUpe3JldHVybiBNYXRoLlBJLzE4MCplLU1hdGguUEkvMTgwKjkwfWZ1bmN0aW9uIHQoKXtpPXt0b3RhbDpNYXRoLmZsb29yKChkLmVuZC1kLnN0YXJ0KS84NjQwMCksZGF5czpNYXRoLmZsb29yKChkLmVuZC1kLm5vdykvODY0MDApLGhvdXJzOjI0LU1hdGguZmxvb3IoKGQuZW5kLWQubm93KSU4NjQwMC8zNjAwKSxtaW51dGVzOjYwLU1hdGguZmxvb3IoKGQuZW5kLWQubm93KSU4NjQwMCUzNjAwLzYwKSxzZWNvbmRzOjYwLU1hdGguZmxvb3IoKGQuZW5kLWQubm93KSU4NjQwMCUzNjAwJTYwKX19ZnVuY3Rpb24gbigpe3ZhciBvPWUoXCIjXCIrZC5zZWxlY3RvcnMuY2FudmFzX3NlY29uZHMpLndpZHRoKCkscz1uZXcgS2luZXRpYy5TdGFnZSh7Y29udGFpbmVyOmQuc2VsZWN0b3JzLmNhbnZhc19zZWNvbmRzLHdpZHRoOm8saGVpZ2h0Om99KTtjPW5ldyBLaW5ldGljLlNoYXBlKHtkcmF3RnVuYzpmdW5jdGlvbihvKXt2YXIgcz1lKFwiI1wiK2Quc2VsZWN0b3JzLmNhbnZhc19zZWNvbmRzKS53aWR0aCgpLHQ9cy8yLWQuc2Vjb25kcy5ib3JkZXJXaWR0aC8yLG49cy8yLGE9cy8yO28uYmVnaW5QYXRoKCksby5hcmMobixhLHQscigwKSxyKDYqaS5zZWNvbmRzKSksby5maWxsU3Ryb2tlU2hhcGUodGhpcyksZShkLnNlbGVjdG9ycy52YWx1ZV9zZWNvbmRzKS5odG1sKDYwLWkuc2Vjb25kcyl9LHN0cm9rZTpkLnNlY29uZHMuYm9yZGVyQ29sb3Isc3Ryb2tlV2lkdGg6ZC5zZWNvbmRzLmJvcmRlcldpZHRofSksdz1uZXcgS2luZXRpYy5MYXllcix3LmFkZChjKSxzLmFkZCh3KTt2YXIgdD1lKFwiI1wiK2Quc2VsZWN0b3JzLmNhbnZhc19taW51dGVzKS53aWR0aCgpLG49bmV3IEtpbmV0aWMuU3RhZ2Uoe2NvbnRhaW5lcjpkLnNlbGVjdG9ycy5jYW52YXNfbWludXRlcyx3aWR0aDp0LGhlaWdodDp0fSk7aD1uZXcgS2luZXRpYy5TaGFwZSh7ZHJhd0Z1bmM6ZnVuY3Rpb24obyl7dmFyIHM9ZShcIiNcIitkLnNlbGVjdG9ycy5jYW52YXNfbWludXRlcykud2lkdGgoKSx0PXMvMi1kLm1pbnV0ZXMuYm9yZGVyV2lkdGgvMixuPXMvMixhPXMvMjtvLmJlZ2luUGF0aCgpLG8uYXJjKG4sYSx0LHIoMCkscig2KmkubWludXRlcykpLG8uZmlsbFN0cm9rZVNoYXBlKHRoaXMpLGUoZC5zZWxlY3RvcnMudmFsdWVfbWludXRlcykuaHRtbCg2MC1pLm1pbnV0ZXMpfSxzdHJva2U6ZC5taW51dGVzLmJvcmRlckNvbG9yLHN0cm9rZVdpZHRoOmQubWludXRlcy5ib3JkZXJXaWR0aH0pLHY9bmV3IEtpbmV0aWMuTGF5ZXIsdi5hZGQoaCksbi5hZGQodik7dmFyIGE9ZShcIiNcIitkLnNlbGVjdG9ycy5jYW52YXNfaG91cnMpLndpZHRoKCkseT1uZXcgS2luZXRpYy5TdGFnZSh7Y29udGFpbmVyOmQuc2VsZWN0b3JzLmNhbnZhc19ob3Vycyx3aWR0aDphLGhlaWdodDphfSk7bD1uZXcgS2luZXRpYy5TaGFwZSh7ZHJhd0Z1bmM6ZnVuY3Rpb24obyl7dmFyIHM9ZShcIiNcIitkLnNlbGVjdG9ycy5jYW52YXNfaG91cnMpLndpZHRoKCksdD1zLzItZC5ob3Vycy5ib3JkZXJXaWR0aC8yLG49cy8yLGE9cy8yO28uYmVnaW5QYXRoKCksby5hcmMobixhLHQscigwKSxyKDM2MCppLmhvdXJzLzI0KSksby5maWxsU3Ryb2tlU2hhcGUodGhpcyksZShkLnNlbGVjdG9ycy52YWx1ZV9ob3VycykuaHRtbCgyNC1pLmhvdXJzKX0sc3Ryb2tlOmQuaG91cnMuYm9yZGVyQ29sb3Isc3Ryb2tlV2lkdGg6ZC5ob3Vycy5ib3JkZXJXaWR0aH0pLGI9bmV3IEtpbmV0aWMuTGF5ZXIsYi5hZGQobCkseS5hZGQoYik7dmFyIF89ZShcIiNcIitkLnNlbGVjdG9ycy5jYW52YXNfZGF5cykud2lkdGgoKSxtPW5ldyBLaW5ldGljLlN0YWdlKHtjb250YWluZXI6ZC5zZWxlY3RvcnMuY2FudmFzX2RheXMsd2lkdGg6XyxoZWlnaHQ6X30pO3U9bmV3IEtpbmV0aWMuU2hhcGUoe2RyYXdGdW5jOmZ1bmN0aW9uKG8pe3ZhciBzPWUoXCIjXCIrZC5zZWxlY3RvcnMuY2FudmFzX2RheXMpLndpZHRoKCksdD1zLzItZC5kYXlzLmJvcmRlcldpZHRoLzIsbj1zLzIsYT1zLzI7by5iZWdpblBhdGgoKSwwPT1pLnRvdGFsP28uYXJjKG4sYSx0LHIoMCkscigzNjApKTpvLmFyYyhuLGEsdCxyKDApLHIoMzYwL2kudG90YWwqKGkudG90YWwtaS5kYXlzKSkpLG8uZmlsbFN0cm9rZVNoYXBlKHRoaXMpLGUoZC5zZWxlY3RvcnMudmFsdWVfZGF5cykuaHRtbChpLmRheXMpfSxzdHJva2U6ZC5kYXlzLmJvcmRlckNvbG9yLHN0cm9rZVdpZHRoOmQuZGF5cy5ib3JkZXJXaWR0aH0pLGY9bmV3IEtpbmV0aWMuTGF5ZXIsZi5hZGQodSksbS5hZGQoZil9ZnVuY3Rpb24gYSgpe3ZhciBlPXNldEludGVydmFsKGZ1bmN0aW9uKCl7aWYoaS5zZWNvbmRzPjU5KXtpZig2MC1pLm1pbnV0ZXM9PTAmJjI0LWkuaG91cnM9PTAmJjA9PWkuZGF5cylyZXR1cm4gY2xlYXJJbnRlcnZhbChlKSx2b2lkKHZvaWQgMCE9PV8mJl8uY2FsbCh0aGlzKSk7aS5zZWNvbmRzPTEsaS5taW51dGVzPjU5PyhpLm1pbnV0ZXM9MSx2LmRyYXcoKSxpLmhvdXJzPjIzPyhpLmhvdXJzPTEsaS5kYXlzPjAmJihpLmRheXMtLSxmLmRyYXcoKSkpOmkuaG91cnMrKyxiLmRyYXcoKSk6aS5taW51dGVzKyssdi5kcmF3KCl9ZWxzZSBpLnNlY29uZHMrKzt3LmRyYXcoKX0sMWUzKX12YXIgZCxpLGMsaCxsLHUsdyx2LGIsZix5LF87ZS5mbi5maW5hbF9jb3VudGRvd249ZnVuY3Rpb24ocyxyKXtpZih5PWUodGhpcykseS5pcyhcIjp2aXNpYmxlXCIpKXt2YXIgaT1lLmV4dGVuZCh7c3RhcnQ6dm9pZCAwLGVuZDp2b2lkIDAsbm93OnZvaWQgMCxzZWxlY3RvcnM6e3ZhbHVlX3NlY29uZHM6XCIuY2xvY2stc2Vjb25kcyAudmFsXCIsY2FudmFzX3NlY29uZHM6XCJjYW52YXMtc2Vjb25kc1wiLHZhbHVlX21pbnV0ZXM6XCIuY2xvY2stbWludXRlcyAudmFsXCIsY2FudmFzX21pbnV0ZXM6XCJjYW52YXMtbWludXRlc1wiLHZhbHVlX2hvdXJzOlwiLmNsb2NrLWhvdXJzIC52YWxcIixjYW52YXNfaG91cnM6XCJjYW52YXMtaG91cnNcIix2YWx1ZV9kYXlzOlwiLmNsb2NrLWRheXMgLnZhbFwiLGNhbnZhc19kYXlzOlwiY2FudmFzLWRheXNcIn0sc2Vjb25kczp7Ym9yZGVyQ29sb3I6XCIjNzk5NUQ1XCIsYm9yZGVyV2lkdGg6XCI2XCJ9LG1pbnV0ZXM6e2JvcmRlckNvbG9yOlwiI0FDQzc0MlwiLGJvcmRlcldpZHRoOlwiNlwifSxob3Vyczp7Ym9yZGVyQ29sb3I6XCIjRUNFRkNCXCIsYm9yZGVyV2lkdGg6XCI2XCJ9LGRheXM6e2JvcmRlckNvbG9yOlwiI0ZGOTkwMFwiLGJvcmRlcldpZHRoOlwiNlwifX0scyk7ZD1lLmV4dGVuZCh7fSxpLHMpLHZvaWQgMD09PWQuc3RhcnQmJihkLnN0YXJ0PXkuZGF0YShcInN0YXJ0XCIpKSx2b2lkIDA9PT1kLmVuZCYmKGQuZW5kPXkuZGF0YShcImVuZFwiKSksdm9pZCAwPT09ZC5ub3cmJihkLm5vdz15LmRhdGEoXCJub3dcIikpLHkuZGF0YShcImJvcmRlci1jb2xvclwiKSYmKGQuc2Vjb25kcy5ib3JkZXJDb2xvcj1kLm1pbnV0ZXMuYm9yZGVyQ29sb3I9ZC5ob3Vycy5ib3JkZXJDb2xvcj1kLmRheXMuYm9yZGVyQ29sb3I9eS5kYXRhKFwiYm9yZGVyLWNvbG9yXCIpKSxkLm5vdzxkLnN0YXJ0JiYoZC5zdGFydD1kLm5vdyxkLmVuZD1kLm5vdyksZC5ub3c+ZC5lbmQmJihkLnN0YXJ0PWQubm93LGQuZW5kPWQubm93KSxcImZ1bmN0aW9uXCI9PXR5cGVvZiByJiYoXz1yKSxvKCksdCgpLG4oKSxhKCl9fX0oalF1ZXJ5KTsiLCIvKmdsb2JhbCBqUXVlcnkgKi9cclxuLyohXHJcbiogRml0VGV4dC5qcyAxLjJcclxuKlxyXG4qIENvcHlyaWdodCAyMDExLCBEYXZlIFJ1cGVydCBodHRwOi8vZGF2ZXJ1cGVydC5jb21cclxuKiBSZWxlYXNlZCB1bmRlciB0aGUgV1RGUEwgbGljZW5zZVxyXG4qIGh0dHA6Ly9zYW0uem95Lm9yZy93dGZwbC9cclxuKlxyXG4qIERhdGU6IFRodSBNYXkgMDUgMTQ6MjM6MDAgMjAxMSAtMDYwMFxyXG4qL1xyXG5cclxuKGZ1bmN0aW9uKCAkICl7XHJcblxyXG4gICQuZm4uZml0VGV4dCA9IGZ1bmN0aW9uKCBrb21wcmVzc29yLCBvcHRpb25zICkge1xyXG5cclxuICAgIC8vIFNldHVwIG9wdGlvbnNcclxuICAgIHZhciBjb21wcmVzc29yID0ga29tcHJlc3NvciB8fCAxLFxyXG4gICAgICAgIHNldHRpbmdzID0gJC5leHRlbmQoe1xyXG4gICAgICAgICAgJ21pbkZvbnRTaXplJyA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcclxuICAgICAgICAgICdtYXhGb250U2l6ZScgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcclxuICAgICAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7XHJcblxyXG4gICAgICAvLyBTdG9yZSB0aGUgb2JqZWN0XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XHJcblxyXG4gICAgICAvLyBSZXNpemVyKCkgcmVzaXplcyBpdGVtcyBiYXNlZCBvbiB0aGUgb2JqZWN0IHdpZHRoIGRpdmlkZWQgYnkgdGhlIGNvbXByZXNzb3IgKiAxMFxyXG4gICAgICB2YXIgcmVzaXplciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkdGhpcy5jc3MoJ2ZvbnQtc2l6ZScsIE1hdGgubWF4KE1hdGgubWluKCR0aGlzLndpZHRoKCkgLyAoY29tcHJlc3NvcioxMCksIHBhcnNlRmxvYXQoc2V0dGluZ3MubWF4Rm9udFNpemUpKSwgcGFyc2VGbG9hdChzZXR0aW5ncy5taW5Gb250U2l6ZSkpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIENhbGwgb25jZSB0byBzZXQuXHJcbiAgICAgIHJlc2l6ZXIoKTtcclxuXHJcbiAgICAgIC8vIENhbGwgb24gcmVzaXplLiBPcGVyYSBkZWJvdW5jZXMgdGhlaXIgcmVzaXplIGJ5IGRlZmF1bHQuXHJcbiAgICAgICQod2luZG93KS5vbigncmVzaXplLmZpdHRleHQgb3JpZW50YXRpb25jaGFuZ2UuZml0dGV4dCcsIHJlc2l6ZXIpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9O1xyXG5cclxufSkoIGpRdWVyeSApO1xyXG4iLCIvKmpzaGludCBicm93c2VyOnRydWUgKi9cclxuLyohXHJcbiogRml0VmlkcyAxLjFcclxuKlxyXG4qIENvcHlyaWdodCAyMDEzLCBDaHJpcyBDb3lpZXIgLSBodHRwOi8vY3NzLXRyaWNrcy5jb20gKyBEYXZlIFJ1cGVydCAtIGh0dHA6Ly9kYXZlcnVwZXJ0LmNvbVxyXG4qIENyZWRpdCB0byBUaGllcnJ5IEtvYmxlbnR6IC0gaHR0cDovL3d3dy5hbGlzdGFwYXJ0LmNvbS9hcnRpY2xlcy9jcmVhdGluZy1pbnRyaW5zaWMtcmF0aW9zLWZvci12aWRlby9cclxuKiBSZWxlYXNlZCB1bmRlciB0aGUgV1RGUEwgbGljZW5zZSAtIGh0dHA6Ly9zYW0uem95Lm9yZy93dGZwbC9cclxuKlxyXG4qL1xyXG5cclxuOyhmdW5jdGlvbiggJCApe1xyXG5cclxuICAndXNlIHN0cmljdCc7XHJcblxyXG4gICQuZm4uZml0VmlkcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xyXG4gICAgdmFyIHNldHRpbmdzID0ge1xyXG4gICAgICBjdXN0b21TZWxlY3RvcjogbnVsbCxcclxuICAgICAgaWdub3JlOiBudWxsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZml0LXZpZHMtc3R5bGUnKSkge1xyXG4gICAgICAvLyBhcHBlbmRTdHlsZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS90b2RkbW90dG8vZmx1aWR2aWRzL2Jsb2IvbWFzdGVyL2Rpc3QvZmx1aWR2aWRzLmpzXHJcbiAgICAgIHZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xyXG4gICAgICB2YXIgY3NzID0gJy5mbHVpZC13aWR0aC12aWRlby13cmFwcGVye3dpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzowO30uZmx1aWQtd2lkdGgtdmlkZW8td3JhcHBlciBpZnJhbWUsLmZsdWlkLXdpZHRoLXZpZGVvLXdyYXBwZXIgb2JqZWN0LC5mbHVpZC13aWR0aC12aWRlby13cmFwcGVyIGVtYmVkIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt9JztcclxuICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHA+eDwvcD48c3R5bGUgaWQ9XCJmaXQtdmlkcy1zdHlsZVwiPicgKyBjc3MgKyAnPC9zdHlsZT4nO1xyXG4gICAgICBoZWFkLmFwcGVuZENoaWxkKGRpdi5jaGlsZE5vZGVzWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIG9wdGlvbnMgKSB7XHJcbiAgICAgICQuZXh0ZW5kKCBzZXR0aW5ncywgb3B0aW9ucyApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtcclxuICAgICAgdmFyIHNlbGVjdG9ycyA9IFtcclxuICAgICAgICAnaWZyYW1lW3NyYyo9XCJwbGF5ZXIudmltZW8uY29tXCJdJyxcclxuICAgICAgICAnaWZyYW1lW3NyYyo9XCJ5b3V0dWJlLmNvbVwiXScsXHJcbiAgICAgICAgJ2lmcmFtZVtzcmMqPVwieW91dHViZS1ub2Nvb2tpZS5jb21cIl0nLFxyXG4gICAgICAgICdpZnJhbWVbc3JjKj1cImtpY2tzdGFydGVyLmNvbVwiXVtzcmMqPVwidmlkZW8uaHRtbFwiXScsXHJcbiAgICAgICAgJ29iamVjdCcsXHJcbiAgICAgICAgJ2VtYmVkJ1xyXG4gICAgICBdO1xyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLmN1c3RvbVNlbGVjdG9yKSB7XHJcbiAgICAgICAgc2VsZWN0b3JzLnB1c2goc2V0dGluZ3MuY3VzdG9tU2VsZWN0b3IpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgaWdub3JlTGlzdCA9ICcuZml0dmlkc2lnbm9yZSc7XHJcblxyXG4gICAgICBpZihzZXR0aW5ncy5pZ25vcmUpIHtcclxuICAgICAgICBpZ25vcmVMaXN0ID0gaWdub3JlTGlzdCArICcsICcgKyBzZXR0aW5ncy5pZ25vcmU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciAkYWxsVmlkZW9zID0gJCh0aGlzKS5maW5kKHNlbGVjdG9ycy5qb2luKCcsJykpO1xyXG4gICAgICAkYWxsVmlkZW9zID0gJGFsbFZpZGVvcy5ub3QoJ29iamVjdCBvYmplY3QnKTsgLy8gU3dmT2JqIGNvbmZsaWN0IHBhdGNoXHJcbiAgICAgICRhbGxWaWRlb3MgPSAkYWxsVmlkZW9zLm5vdChpZ25vcmVMaXN0KTsgLy8gRGlzYWJsZSBGaXRWaWRzIG9uIHRoaXMgdmlkZW8uXHJcblxyXG4gICAgICAkYWxsVmlkZW9zLmVhY2goZnVuY3Rpb24oKXtcclxuICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xyXG4gICAgICAgIGlmKCR0aGlzLnBhcmVudHMoaWdub3JlTGlzdCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcmV0dXJuOyAvLyBEaXNhYmxlIEZpdFZpZHMgb24gdGhpcyB2aWRlby5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZW1iZWQnICYmICR0aGlzLnBhcmVudCgnb2JqZWN0JykubGVuZ3RoIHx8ICR0aGlzLnBhcmVudCgnLmZsdWlkLXdpZHRoLXZpZGVvLXdyYXBwZXInKS5sZW5ndGgpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKCghJHRoaXMuY3NzKCdoZWlnaHQnKSAmJiAhJHRoaXMuY3NzKCd3aWR0aCcpKSAmJiAoaXNOYU4oJHRoaXMuYXR0cignaGVpZ2h0JykpIHx8IGlzTmFOKCR0aGlzLmF0dHIoJ3dpZHRoJykpKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAkdGhpcy5hdHRyKCdoZWlnaHQnLCA5KTtcclxuICAgICAgICAgICR0aGlzLmF0dHIoJ3dpZHRoJywgMTYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaGVpZ2h0ID0gKCB0aGlzLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29iamVjdCcgfHwgKCR0aGlzLmF0dHIoJ2hlaWdodCcpICYmICFpc05hTihwYXJzZUludCgkdGhpcy5hdHRyKCdoZWlnaHQnKSwgMTApKSkgKSA/IHBhcnNlSW50KCR0aGlzLmF0dHIoJ2hlaWdodCcpLCAxMCkgOiAkdGhpcy5oZWlnaHQoKSxcclxuICAgICAgICAgICAgd2lkdGggPSAhaXNOYU4ocGFyc2VJbnQoJHRoaXMuYXR0cignd2lkdGgnKSwgMTApKSA/IHBhcnNlSW50KCR0aGlzLmF0dHIoJ3dpZHRoJyksIDEwKSA6ICR0aGlzLndpZHRoKCksXHJcbiAgICAgICAgICAgIGFzcGVjdFJhdGlvID0gaGVpZ2h0IC8gd2lkdGg7XHJcbiAgICAgICAgaWYoISR0aGlzLmF0dHIoJ25hbWUnKSl7XHJcbiAgICAgICAgICB2YXIgdmlkZW9OYW1lID0gJ2ZpdHZpZCcgKyAkLmZuLmZpdFZpZHMuX2NvdW50O1xyXG4gICAgICAgICAgJHRoaXMuYXR0cignbmFtZScsIHZpZGVvTmFtZSk7XHJcbiAgICAgICAgICAkLmZuLmZpdFZpZHMuX2NvdW50Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICR0aGlzLndyYXAoJzxkaXYgY2xhc3M9XCJmbHVpZC13aWR0aC12aWRlby13cmFwcGVyXCI+PC9kaXY+JykucGFyZW50KCcuZmx1aWQtd2lkdGgtdmlkZW8td3JhcHBlcicpLmNzcygncGFkZGluZy10b3AnLCAoYXNwZWN0UmF0aW8gKiAxMDApKyclJyk7XHJcbiAgICAgICAgJHRoaXMucmVtb3ZlQXR0cignaGVpZ2h0JykucmVtb3ZlQXR0cignd2lkdGgnKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9O1xyXG4gIFxyXG4gIC8vIEludGVybmFsIGNvdW50ZXIgZm9yIHVuaXF1ZSB2aWRlbyBuYW1lcy5cclxuICAkLmZuLmZpdFZpZHMuX2NvdW50ID0gMDtcclxuICBcclxuLy8gV29ya3Mgd2l0aCBlaXRoZXIgalF1ZXJ5IG9yIFplcHRvXHJcbn0pKCB3aW5kb3cualF1ZXJ5IHx8IHdpbmRvdy5aZXB0byApO1xyXG4iLCIvKiFcbiAqIGpRdWVyeSBGb3JtIFBsdWdpblxuICogdmVyc2lvbjogNC4yLjJcbiAqIFJlcXVpcmVzIGpRdWVyeSB2MS43LjIgb3IgbGF0ZXJcbiAqIFByb2plY3QgcmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS1mb3JtL2Zvcm1cblxuICogQ29weXJpZ2h0IDIwMTcgS2V2aW4gTW9ycmlzXG4gKiBDb3B5cmlnaHQgMjAwNiBNLiBBbHN1cFxuXG4gKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBMR1BMLTIuMSsgb3IgTUlUIGxpY2Vuc2VzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5LWZvcm0vZm9ybSNsaWNlbnNlXG5cbiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuIWZ1bmN0aW9uKGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQscil7cmV0dXJuIHZvaWQgMD09PXImJihyPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/cmVxdWlyZShcImpxdWVyeVwiKTpyZXF1aXJlKFwianF1ZXJ5XCIpKHQpKSxlKHIpLHJ9OmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdCh0KXt2YXIgcj10LmRhdGE7dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8KHQucHJldmVudERlZmF1bHQoKSxlKHQudGFyZ2V0KS5jbG9zZXN0KFwiZm9ybVwiKS5hamF4U3VibWl0KHIpKX1mdW5jdGlvbiByKHQpe3ZhciByPXQudGFyZ2V0LGE9ZShyKTtpZighYS5pcyhcIlt0eXBlPXN1Ym1pdF0sW3R5cGU9aW1hZ2VdXCIpKXt2YXIgbj1hLmNsb3Nlc3QoXCJbdHlwZT1zdWJtaXRdXCIpO2lmKDA9PT1uLmxlbmd0aClyZXR1cm47cj1uWzBdfXZhciBpPXIuZm9ybTtpZihpLmNsaz1yLFwiaW1hZ2VcIj09PXIudHlwZSlpZih2b2lkIDAhPT10Lm9mZnNldFgpaS5jbGtfeD10Lm9mZnNldFgsaS5jbGtfeT10Lm9mZnNldFk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmZuLm9mZnNldCl7dmFyIG89YS5vZmZzZXQoKTtpLmNsa194PXQucGFnZVgtby5sZWZ0LGkuY2xrX3k9dC5wYWdlWS1vLnRvcH1lbHNlIGkuY2xrX3g9dC5wYWdlWC1yLm9mZnNldExlZnQsaS5jbGtfeT10LnBhZ2VZLXIub2Zmc2V0VG9wO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpLmNsaz1pLmNsa194PWkuY2xrX3k9bnVsbH0sMTAwKX1mdW5jdGlvbiBhKCl7aWYoZS5mbi5hamF4U3VibWl0LmRlYnVnKXt2YXIgdD1cIltqcXVlcnkuZm9ybV0gXCIrQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsXCJcIik7d2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZz93aW5kb3cuY29uc29sZS5sb2codCk6d2luZG93Lm9wZXJhJiZ3aW5kb3cub3BlcmEucG9zdEVycm9yJiZ3aW5kb3cub3BlcmEucG9zdEVycm9yKHQpfX12YXIgbj0vXFxyP1xcbi9nLGk9e307aS5maWxlYXBpPXZvaWQgMCE9PWUoJzxpbnB1dCB0eXBlPVwiZmlsZVwiPicpLmdldCgwKS5maWxlcyxpLmZvcm1kYXRhPXZvaWQgMCE9PXdpbmRvdy5Gb3JtRGF0YTt2YXIgbz0hIWUuZm4ucHJvcDtlLmZuLmF0dHIyPWZ1bmN0aW9uKCl7aWYoIW8pcmV0dXJuIHRoaXMuYXR0ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9dGhpcy5wcm9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZSYmZS5qcXVlcnl8fFwic3RyaW5nXCI9PXR5cGVvZiBlP2U6dGhpcy5hdHRyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5mbi5hamF4U3VibWl0PWZ1bmN0aW9uKHQscixuLHMpe2Z1bmN0aW9uIHUocil7dmFyIGEsbixpPWUucGFyYW0ocix0LnRyYWRpdGlvbmFsKS5zcGxpdChcIiZcIiksbz1pLmxlbmd0aCxzPVtdO2ZvcihhPTA7YTxvO2ErKylpW2FdPWlbYV0ucmVwbGFjZSgvXFwrL2csXCIgXCIpLG49aVthXS5zcGxpdChcIj1cIikscy5wdXNoKFtkZWNvZGVVUklDb21wb25lbnQoblswXSksZGVjb2RlVVJJQ29tcG9uZW50KG5bMV0pXSk7cmV0dXJuIHN9ZnVuY3Rpb24gYyhyKXtmdW5jdGlvbiBuKGUpe3ZhciB0PW51bGw7dHJ5e2UuY29udGVudFdpbmRvdyYmKHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KX1jYXRjaChlKXthKFwiY2Fubm90IGdldCBpZnJhbWUuY29udGVudFdpbmRvdyBkb2N1bWVudDogXCIrZSl9aWYodClyZXR1cm4gdDt0cnl7dD1lLmNvbnRlbnREb2N1bWVudD9lLmNvbnRlbnREb2N1bWVudDplLmRvY3VtZW50fWNhdGNoKHIpe2EoXCJjYW5ub3QgZ2V0IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ6IFwiK3IpLHQ9ZS5kb2N1bWVudH1yZXR1cm4gdH1mdW5jdGlvbiBpKCl7ZnVuY3Rpb24gdCgpe3RyeXt2YXIgZT1uKHYpLnJlYWR5U3RhdGU7YShcInN0YXRlID0gXCIrZSksZSYmXCJ1bmluaXRpYWxpemVkXCI9PT1lLnRvTG93ZXJDYXNlKCkmJnNldFRpbWVvdXQodCw1MCl9Y2F0Y2goZSl7YShcIlNlcnZlciBhYm9ydDogXCIsZSxcIiAoXCIsZS5uYW1lLFwiKVwiKSxzKEwpLGomJmNsZWFyVGltZW91dChqKSxqPXZvaWQgMH19dmFyIHI9cC5hdHRyMihcInRhcmdldFwiKSxpPXAuYXR0cjIoXCJhY3Rpb25cIiksbz1wLmF0dHIoXCJlbmN0eXBlXCIpfHxwLmF0dHIoXCJlbmNvZGluZ1wiKXx8XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCI7dy5zZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIixtKSxsJiYhL3Bvc3QvaS50ZXN0KGwpfHx3LnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLFwiUE9TVFwiKSxpIT09Zi51cmwmJncuc2V0QXR0cmlidXRlKFwiYWN0aW9uXCIsZi51cmwpLGYuc2tpcEVuY29kaW5nT3ZlcnJpZGV8fGwmJiEvcG9zdC9pLnRlc3QobCl8fHAuYXR0cih7ZW5jb2Rpbmc6XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIsZW5jdHlwZTpcIm11bHRpcGFydC9mb3JtLWRhdGFcIn0pLGYudGltZW91dCYmKGo9c2V0VGltZW91dChmdW5jdGlvbigpe1Q9ITAscyhBKX0sZi50aW1lb3V0KSk7dmFyIHU9W107dHJ5e2lmKGYuZXh0cmFEYXRhKWZvcih2YXIgYyBpbiBmLmV4dHJhRGF0YSlmLmV4dHJhRGF0YS5oYXNPd25Qcm9wZXJ0eShjKSYmKGUuaXNQbGFpbk9iamVjdChmLmV4dHJhRGF0YVtjXSkmJmYuZXh0cmFEYXRhW2NdLmhhc093blByb3BlcnR5KFwibmFtZVwiKSYmZi5leHRyYURhdGFbY10uaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKT91LnB1c2goZSgnPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJytmLmV4dHJhRGF0YVtjXS5uYW1lKydcIj4nLGspLnZhbChmLmV4dHJhRGF0YVtjXS52YWx1ZSkuYXBwZW5kVG8odylbMF0pOnUucHVzaChlKCc8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCInK2MrJ1wiPicsaykudmFsKGYuZXh0cmFEYXRhW2NdKS5hcHBlbmRUbyh3KVswXSkpO2YuaWZyYW1lVGFyZ2V0fHxoLmFwcGVuZFRvKEQpLHYuYXR0YWNoRXZlbnQ/di5hdHRhY2hFdmVudChcIm9ubG9hZFwiLHMpOnYuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixzLCExKSxzZXRUaW1lb3V0KHQsMTUpO3RyeXt3LnN1Ym1pdCgpfWNhdGNoKGUpe2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpLnN1Ym1pdC5hcHBseSh3KX19ZmluYWxseXt3LnNldEF0dHJpYnV0ZShcImFjdGlvblwiLGkpLHcuc2V0QXR0cmlidXRlKFwiZW5jdHlwZVwiLG8pLHI/dy5zZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIixyKTpwLnJlbW92ZUF0dHIoXCJ0YXJnZXRcIiksZSh1KS5yZW1vdmUoKX19ZnVuY3Rpb24gcyh0KXtpZigheC5hYm9ydGVkJiYhWCl7aWYoKE89bih2KSl8fChhKFwiY2Fubm90IGFjY2VzcyByZXNwb25zZSBkb2N1bWVudFwiKSx0PUwpLHQ9PT1BJiZ4KXJldHVybiB4LmFib3J0KFwidGltZW91dFwiKSx2b2lkIFMucmVqZWN0KHgsXCJ0aW1lb3V0XCIpO2lmKHQ9PT1MJiZ4KXJldHVybiB4LmFib3J0KFwic2VydmVyIGFib3J0XCIpLHZvaWQgUy5yZWplY3QoeCxcImVycm9yXCIsXCJzZXJ2ZXIgYWJvcnRcIik7aWYoTyYmTy5sb2NhdGlvbi5ocmVmIT09Zi5pZnJhbWVTcmN8fFQpe3YuZGV0YWNoRXZlbnQ/di5kZXRhY2hFdmVudChcIm9ubG9hZFwiLHMpOnYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRcIixzLCExKTt2YXIgcixpPVwic3VjY2Vzc1wiO3RyeXtpZihUKXRocm93XCJ0aW1lb3V0XCI7dmFyIG89XCJ4bWxcIj09PWYuZGF0YVR5cGV8fE8uWE1MRG9jdW1lbnR8fGUuaXNYTUxEb2MoTyk7aWYoYShcImlzWG1sPVwiK28pLCFvJiZ3aW5kb3cub3BlcmEmJihudWxsPT09Ty5ib2R5fHwhTy5ib2R5LmlubmVySFRNTCkmJi0tQylyZXR1cm4gYShcInJlcXVlaW5nIG9uTG9hZCBjYWxsYmFjaywgRE9NIG5vdCBhdmFpbGFibGVcIiksdm9pZCBzZXRUaW1lb3V0KHMsMjUwKTt2YXIgdT1PLmJvZHk/Ty5ib2R5Ok8uZG9jdW1lbnRFbGVtZW50O3gucmVzcG9uc2VUZXh0PXU/dS5pbm5lckhUTUw6bnVsbCx4LnJlc3BvbnNlWE1MPU8uWE1MRG9jdW1lbnQ/Ty5YTUxEb2N1bWVudDpPLG8mJihmLmRhdGFUeXBlPVwieG1sXCIpLHguZ2V0UmVzcG9uc2VIZWFkZXI9ZnVuY3Rpb24oZSl7cmV0dXJue1wiY29udGVudC10eXBlXCI6Zi5kYXRhVHlwZX1bZS50b0xvd2VyQ2FzZSgpXX0sdSYmKHguc3RhdHVzPU51bWJlcih1LmdldEF0dHJpYnV0ZShcInN0YXR1c1wiKSl8fHguc3RhdHVzLHguc3RhdHVzVGV4dD11LmdldEF0dHJpYnV0ZShcInN0YXR1c1RleHRcIil8fHguc3RhdHVzVGV4dCk7dmFyIGM9KGYuZGF0YVR5cGV8fFwiXCIpLnRvTG93ZXJDYXNlKCksbD0vKGpzb258c2NyaXB0fHRleHQpLy50ZXN0KGMpO2lmKGx8fGYudGV4dGFyZWEpe3ZhciBwPU8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZXh0YXJlYVwiKVswXTtpZihwKXgucmVzcG9uc2VUZXh0PXAudmFsdWUseC5zdGF0dXM9TnVtYmVyKHAuZ2V0QXR0cmlidXRlKFwic3RhdHVzXCIpKXx8eC5zdGF0dXMseC5zdGF0dXNUZXh0PXAuZ2V0QXR0cmlidXRlKFwic3RhdHVzVGV4dFwiKXx8eC5zdGF0dXNUZXh0O2Vsc2UgaWYobCl7dmFyIG09Ty5nZXRFbGVtZW50c0J5VGFnTmFtZShcInByZVwiKVswXSxnPU8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdO20/eC5yZXNwb25zZVRleHQ9bS50ZXh0Q29udGVudD9tLnRleHRDb250ZW50Om0uaW5uZXJUZXh0OmcmJih4LnJlc3BvbnNlVGV4dD1nLnRleHRDb250ZW50P2cudGV4dENvbnRlbnQ6Zy5pbm5lclRleHQpfX1lbHNlXCJ4bWxcIj09PWMmJiF4LnJlc3BvbnNlWE1MJiZ4LnJlc3BvbnNlVGV4dCYmKHgucmVzcG9uc2VYTUw9cSh4LnJlc3BvbnNlVGV4dCkpO3RyeXtNPU4oeCxjLGYpfWNhdGNoKGUpe2k9XCJwYXJzZXJlcnJvclwiLHguZXJyb3I9cj1lfHxpfX1jYXRjaChlKXthKFwiZXJyb3IgY2F1Z2h0OiBcIixlKSxpPVwiZXJyb3JcIix4LmVycm9yPXI9ZXx8aX14LmFib3J0ZWQmJihhKFwidXBsb2FkIGFib3J0ZWRcIiksaT1udWxsKSx4LnN0YXR1cyYmKGk9eC5zdGF0dXM+PTIwMCYmeC5zdGF0dXM8MzAwfHwzMDQ9PT14LnN0YXR1cz9cInN1Y2Nlc3NcIjpcImVycm9yXCIpLFwic3VjY2Vzc1wiPT09aT8oZi5zdWNjZXNzJiZmLnN1Y2Nlc3MuY2FsbChmLmNvbnRleHQsTSxcInN1Y2Nlc3NcIix4KSxTLnJlc29sdmUoeC5yZXNwb25zZVRleHQsXCJzdWNjZXNzXCIseCksZCYmZS5ldmVudC50cmlnZ2VyKFwiYWpheFN1Y2Nlc3NcIixbeCxmXSkpOmkmJih2b2lkIDA9PT1yJiYocj14LnN0YXR1c1RleHQpLGYuZXJyb3ImJmYuZXJyb3IuY2FsbChmLmNvbnRleHQseCxpLHIpLFMucmVqZWN0KHgsXCJlcnJvclwiLHIpLGQmJmUuZXZlbnQudHJpZ2dlcihcImFqYXhFcnJvclwiLFt4LGYscl0pKSxkJiZlLmV2ZW50LnRyaWdnZXIoXCJhamF4Q29tcGxldGVcIixbeCxmXSksZCYmIS0tZS5hY3RpdmUmJmUuZXZlbnQudHJpZ2dlcihcImFqYXhTdG9wXCIpLGYuY29tcGxldGUmJmYuY29tcGxldGUuY2FsbChmLmNvbnRleHQseCxpKSxYPSEwLGYudGltZW91dCYmY2xlYXJUaW1lb3V0KGopLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlmcmFtZVRhcmdldD9oLmF0dHIoXCJzcmNcIixmLmlmcmFtZVNyYyk6aC5yZW1vdmUoKSx4LnJlc3BvbnNlWE1MPW51bGx9LDEwMCl9fX12YXIgdSxjLGYsZCxtLGgsdix4LHksYixULGosdz1wWzBdLFM9ZS5EZWZlcnJlZCgpO2lmKFMuYWJvcnQ9ZnVuY3Rpb24oZSl7eC5hYm9ydChlKX0scilmb3IoYz0wO2M8Zy5sZW5ndGg7YysrKXU9ZShnW2NdKSxvP3UucHJvcChcImRpc2FibGVkXCIsITEpOnUucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpOyhmPWUuZXh0ZW5kKCEwLHt9LGUuYWpheFNldHRpbmdzLHQpKS5jb250ZXh0PWYuY29udGV4dHx8ZixtPVwianFGb3JtSU9cIisobmV3IERhdGUpLmdldFRpbWUoKTt2YXIgaz13Lm93bmVyRG9jdW1lbnQsRD1wLmNsb3Nlc3QoXCJib2R5XCIpO2lmKGYuaWZyYW1lVGFyZ2V0PyhiPShoPWUoZi5pZnJhbWVUYXJnZXQsaykpLmF0dHIyKFwibmFtZVwiKSk/bT1iOmguYXR0cjIoXCJuYW1lXCIsbSk6KGg9ZSgnPGlmcmFtZSBuYW1lPVwiJyttKydcIiBzcmM9XCInK2YuaWZyYW1lU3JjKydcIiAvPicsaykpLmNzcyh7cG9zaXRpb246XCJhYnNvbHV0ZVwiLHRvcDpcIi0xMDAwcHhcIixsZWZ0OlwiLTEwMDBweFwifSksdj1oWzBdLHg9e2Fib3J0ZWQ6MCxyZXNwb25zZVRleHQ6bnVsbCxyZXNwb25zZVhNTDpudWxsLHN0YXR1czowLHN0YXR1c1RleHQ6XCJuL2FcIixnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXt9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKCl7fSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKCl7fSxhYm9ydDpmdW5jdGlvbih0KXt2YXIgcj1cInRpbWVvdXRcIj09PXQ/XCJ0aW1lb3V0XCI6XCJhYm9ydGVkXCI7YShcImFib3J0aW5nIHVwbG9hZC4uLiBcIityKSx0aGlzLmFib3J0ZWQ9MTt0cnl7di5jb250ZW50V2luZG93LmRvY3VtZW50LmV4ZWNDb21tYW5kJiZ2LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJTdG9wXCIpfWNhdGNoKGUpe31oLmF0dHIoXCJzcmNcIixmLmlmcmFtZVNyYykseC5lcnJvcj1yLGYuZXJyb3ImJmYuZXJyb3IuY2FsbChmLmNvbnRleHQseCxyLHQpLGQmJmUuZXZlbnQudHJpZ2dlcihcImFqYXhFcnJvclwiLFt4LGYscl0pLGYuY29tcGxldGUmJmYuY29tcGxldGUuY2FsbChmLmNvbnRleHQseCxyKX19LChkPWYuZ2xvYmFsKSYmMD09ZS5hY3RpdmUrKyYmZS5ldmVudC50cmlnZ2VyKFwiYWpheFN0YXJ0XCIpLGQmJmUuZXZlbnQudHJpZ2dlcihcImFqYXhTZW5kXCIsW3gsZl0pLGYuYmVmb3JlU2VuZCYmITE9PT1mLmJlZm9yZVNlbmQuY2FsbChmLmNvbnRleHQseCxmKSlyZXR1cm4gZi5nbG9iYWwmJmUuYWN0aXZlLS0sUy5yZWplY3QoKSxTO2lmKHguYWJvcnRlZClyZXR1cm4gUy5yZWplY3QoKSxTOyh5PXcuY2xrKSYmKGI9eS5uYW1lKSYmIXkuZGlzYWJsZWQmJihmLmV4dHJhRGF0YT1mLmV4dHJhRGF0YXx8e30sZi5leHRyYURhdGFbYl09eS52YWx1ZSxcImltYWdlXCI9PT15LnR5cGUmJihmLmV4dHJhRGF0YVtiK1wiLnhcIl09dy5jbGtfeCxmLmV4dHJhRGF0YVtiK1wiLnlcIl09dy5jbGtfeSkpO3ZhciBBPTEsTD0yLEY9ZShcIm1ldGFbbmFtZT1jc3JmLXRva2VuXVwiKS5hdHRyKFwiY29udGVudFwiKSxFPWUoXCJtZXRhW25hbWU9Y3NyZi1wYXJhbV1cIikuYXR0cihcImNvbnRlbnRcIik7RSYmRiYmKGYuZXh0cmFEYXRhPWYuZXh0cmFEYXRhfHx7fSxmLmV4dHJhRGF0YVtFXT1GKSxmLmZvcmNlU3luYz9pKCk6c2V0VGltZW91dChpLDEwKTt2YXIgTSxPLFgsQz01MCxxPWUucGFyc2VYTUx8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHdpbmRvdy5BY3RpdmVYT2JqZWN0PygodD1uZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxET01cIikpLmFzeW5jPVwiZmFsc2VcIix0LmxvYWRYTUwoZSkpOnQ9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLFwidGV4dC94bWxcIiksdCYmdC5kb2N1bWVudEVsZW1lbnQmJlwicGFyc2VyZXJyb3JcIiE9PXQuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lP3Q6bnVsbH0sXz1lLnBhcnNlSlNPTnx8ZnVuY3Rpb24oZSl7cmV0dXJuIHdpbmRvdy5ldmFsKFwiKFwiK2UrXCIpXCIpfSxOPWZ1bmN0aW9uKHQscixhKXt2YXIgbj10LmdldFJlc3BvbnNlSGVhZGVyKFwiY29udGVudC10eXBlXCIpfHxcIlwiLGk9KFwieG1sXCI9PT1yfHwhcikmJm4uaW5kZXhPZihcInhtbFwiKT49MCxvPWk/dC5yZXNwb25zZVhNTDp0LnJlc3BvbnNlVGV4dDtyZXR1cm4gaSYmXCJwYXJzZXJlcnJvclwiPT09by5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUmJmUuZXJyb3ImJmUuZXJyb3IoXCJwYXJzZXJlcnJvclwiKSxhJiZhLmRhdGFGaWx0ZXImJihvPWEuZGF0YUZpbHRlcihvLHIpKSxcInN0cmluZ1wiPT10eXBlb2YgbyYmKChcImpzb25cIj09PXJ8fCFyKSYmbi5pbmRleE9mKFwianNvblwiKT49MD9vPV8obyk6KFwic2NyaXB0XCI9PT1yfHwhcikmJm4uaW5kZXhPZihcImphdmFzY3JpcHRcIik+PTAmJmUuZ2xvYmFsRXZhbChvKSksb307cmV0dXJuIFN9aWYoIXRoaXMubGVuZ3RoKXJldHVybiBhKFwiYWpheFN1Ym1pdDogc2tpcHBpbmcgc3VibWl0IHByb2Nlc3MgLSBubyBlbGVtZW50IHNlbGVjdGVkXCIpLHRoaXM7dmFyIGwsZixkLHA9dGhpcztcImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q9e3N1Y2Nlc3M6dH06XCJzdHJpbmdcIj09dHlwZW9mIHR8fCExPT09dCYmYXJndW1lbnRzLmxlbmd0aD4wPyh0PXt1cmw6dCxkYXRhOnIsZGF0YVR5cGU6bn0sXCJmdW5jdGlvblwiPT10eXBlb2YgcyYmKHQuc3VjY2Vzcz1zKSk6dm9pZCAwPT09dCYmKHQ9e30pLGw9dC5tZXRob2R8fHQudHlwZXx8dGhpcy5hdHRyMihcIm1ldGhvZFwiKSwoZD0oZD1cInN0cmluZ1wiPT10eXBlb2YoZj10LnVybHx8dGhpcy5hdHRyMihcImFjdGlvblwiKSk/ZS50cmltKGYpOlwiXCIpfHx3aW5kb3cubG9jYXRpb24uaHJlZnx8XCJcIikmJihkPShkLm1hdGNoKC9eKFteI10rKS8pfHxbXSlbMV0pLHQ9ZS5leHRlbmQoITAse3VybDpkLHN1Y2Nlc3M6ZS5hamF4U2V0dGluZ3Muc3VjY2Vzcyx0eXBlOmx8fGUuYWpheFNldHRpbmdzLnR5cGUsaWZyYW1lU3JjOi9eaHR0cHMvaS50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmfHxcIlwiKT9cImphdmFzY3JpcHQ6ZmFsc2VcIjpcImFib3V0OmJsYW5rXCJ9LHQpO3ZhciBtPXt9O2lmKHRoaXMudHJpZ2dlcihcImZvcm0tcHJlLXNlcmlhbGl6ZVwiLFt0aGlzLHQsbV0pLG0udmV0bylyZXR1cm4gYShcImFqYXhTdWJtaXQ6IHN1Ym1pdCB2ZXRvZWQgdmlhIGZvcm0tcHJlLXNlcmlhbGl6ZSB0cmlnZ2VyXCIpLHRoaXM7aWYodC5iZWZvcmVTZXJpYWxpemUmJiExPT09dC5iZWZvcmVTZXJpYWxpemUodGhpcyx0KSlyZXR1cm4gYShcImFqYXhTdWJtaXQ6IHN1Ym1pdCBhYm9ydGVkIHZpYSBiZWZvcmVTZXJpYWxpemUgY2FsbGJhY2tcIiksdGhpczt2YXIgaD10LnRyYWRpdGlvbmFsO3ZvaWQgMD09PWgmJihoPWUuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKTt2YXIgdixnPVtdLHg9dGhpcy5mb3JtVG9BcnJheSh0LnNlbWFudGljLGcsdC5maWx0ZXJpbmcpO2lmKHQuZGF0YSl7dmFyIHk9ZS5pc0Z1bmN0aW9uKHQuZGF0YSk/dC5kYXRhKHgpOnQuZGF0YTt0LmV4dHJhRGF0YT15LHY9ZS5wYXJhbSh5LGgpfWlmKHQuYmVmb3JlU3VibWl0JiYhMT09PXQuYmVmb3JlU3VibWl0KHgsdGhpcyx0KSlyZXR1cm4gYShcImFqYXhTdWJtaXQ6IHN1Ym1pdCBhYm9ydGVkIHZpYSBiZWZvcmVTdWJtaXQgY2FsbGJhY2tcIiksdGhpcztpZih0aGlzLnRyaWdnZXIoXCJmb3JtLXN1Ym1pdC12YWxpZGF0ZVwiLFt4LHRoaXMsdCxtXSksbS52ZXRvKXJldHVybiBhKFwiYWpheFN1Ym1pdDogc3VibWl0IHZldG9lZCB2aWEgZm9ybS1zdWJtaXQtdmFsaWRhdGUgdHJpZ2dlclwiKSx0aGlzO3ZhciBiPWUucGFyYW0oeCxoKTt2JiYoYj1iP2IrXCImXCIrdjp2KSxcIkdFVFwiPT09dC50eXBlLnRvVXBwZXJDYXNlKCk/KHQudXJsKz0odC51cmwuaW5kZXhPZihcIj9cIik+PTA/XCImXCI6XCI/XCIpK2IsdC5kYXRhPW51bGwpOnQuZGF0YT1iO3ZhciBUPVtdO2lmKHQucmVzZXRGb3JtJiZULnB1c2goZnVuY3Rpb24oKXtwLnJlc2V0Rm9ybSgpfSksdC5jbGVhckZvcm0mJlQucHVzaChmdW5jdGlvbigpe3AuY2xlYXJGb3JtKHQuaW5jbHVkZUhpZGRlbil9KSwhdC5kYXRhVHlwZSYmdC50YXJnZXQpe3ZhciBqPXQuc3VjY2Vzc3x8ZnVuY3Rpb24oKXt9O1QucHVzaChmdW5jdGlvbihyLGEsbil7dmFyIGk9YXJndW1lbnRzLG89dC5yZXBsYWNlVGFyZ2V0P1wicmVwbGFjZVdpdGhcIjpcImh0bWxcIjtlKHQudGFyZ2V0KVtvXShyKS5lYWNoKGZ1bmN0aW9uKCl7ai5hcHBseSh0aGlzLGkpfSl9KX1lbHNlIHQuc3VjY2VzcyYmKGUuaXNBcnJheSh0LnN1Y2Nlc3MpP2UubWVyZ2UoVCx0LnN1Y2Nlc3MpOlQucHVzaCh0LnN1Y2Nlc3MpKTtpZih0LnN1Y2Nlc3M9ZnVuY3Rpb24oZSxyLGEpe2Zvcih2YXIgbj10LmNvbnRleHR8fHRoaXMsaT0wLG89VC5sZW5ndGg7aTxvO2krKylUW2ldLmFwcGx5KG4sW2UscixhfHxwLHBdKX0sdC5lcnJvcil7dmFyIHc9dC5lcnJvcjt0LmVycm9yPWZ1bmN0aW9uKGUscixhKXt2YXIgbj10LmNvbnRleHR8fHRoaXM7dy5hcHBseShuLFtlLHIsYSxwXSl9fWlmKHQuY29tcGxldGUpe3ZhciBTPXQuY29tcGxldGU7dC5jb21wbGV0ZT1mdW5jdGlvbihlLHIpe3ZhciBhPXQuY29udGV4dHx8dGhpcztTLmFwcGx5KGEsW2UscixwXSl9fXZhciBrPWUoXCJpbnB1dFt0eXBlPWZpbGVdOmVuYWJsZWRcIix0aGlzKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm5cIlwiIT09ZSh0aGlzKS52YWwoKX0pLmxlbmd0aD4wLEQ9XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIsQT1wLmF0dHIoXCJlbmN0eXBlXCIpPT09RHx8cC5hdHRyKFwiZW5jb2RpbmdcIik9PT1ELEw9aS5maWxlYXBpJiZpLmZvcm1kYXRhO2EoXCJmaWxlQVBJIDpcIitMKTt2YXIgRixFPShrfHxBKSYmIUw7ITEhPT10LmlmcmFtZSYmKHQuaWZyYW1lfHxFKT90LmNsb3NlS2VlcEFsaXZlP2UuZ2V0KHQuY2xvc2VLZWVwQWxpdmUsZnVuY3Rpb24oKXtGPWMoeCl9KTpGPWMoeCk6Rj0oa3x8QSkmJkw/ZnVuY3Rpb24ocil7Zm9yKHZhciBhPW5ldyBGb3JtRGF0YSxuPTA7bjxyLmxlbmd0aDtuKyspYS5hcHBlbmQocltuXS5uYW1lLHJbbl0udmFsdWUpO2lmKHQuZXh0cmFEYXRhKXt2YXIgaT11KHQuZXh0cmFEYXRhKTtmb3Iobj0wO248aS5sZW5ndGg7bisrKWlbbl0mJmEuYXBwZW5kKGlbbl1bMF0saVtuXVsxXSl9dC5kYXRhPW51bGw7dmFyIG89ZS5leHRlbmQoITAse30sZS5hamF4U2V0dGluZ3MsdCx7Y29udGVudFR5cGU6ITEscHJvY2Vzc0RhdGE6ITEsY2FjaGU6ITEsdHlwZTpsfHxcIlBPU1RcIn0pO3QudXBsb2FkUHJvZ3Jlc3MmJihvLnhocj1mdW5jdGlvbigpe3ZhciByPWUuYWpheFNldHRpbmdzLnhocigpO3JldHVybiByLnVwbG9hZCYmci51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcihcInByb2dyZXNzXCIsZnVuY3Rpb24oZSl7dmFyIHI9MCxhPWUubG9hZGVkfHxlLnBvc2l0aW9uLG49ZS50b3RhbDtlLmxlbmd0aENvbXB1dGFibGUmJihyPU1hdGguY2VpbChhL24qMTAwKSksdC51cGxvYWRQcm9ncmVzcyhlLGEsbixyKX0sITEpLHJ9KSxvLmRhdGE9bnVsbDt2YXIgcz1vLmJlZm9yZVNlbmQ7cmV0dXJuIG8uYmVmb3JlU2VuZD1mdW5jdGlvbihlLHIpe3QuZm9ybURhdGE/ci5kYXRhPXQuZm9ybURhdGE6ci5kYXRhPWEscyYmcy5jYWxsKHRoaXMsZSxyKX0sZS5hamF4KG8pfSh4KTplLmFqYXgodCkscC5yZW1vdmVEYXRhKFwianF4aHJcIikuZGF0YShcImpxeGhyXCIsRik7Zm9yKHZhciBNPTA7TTxnLmxlbmd0aDtNKyspZ1tNXT1udWxsO3JldHVybiB0aGlzLnRyaWdnZXIoXCJmb3JtLXN1Ym1pdC1ub3RpZnlcIixbdGhpcyx0XSksdGhpc30sZS5mbi5hamF4Rm9ybT1mdW5jdGlvbihuLGksbyxzKXtpZigoXCJzdHJpbmdcIj09dHlwZW9mIG58fCExPT09biYmYXJndW1lbnRzLmxlbmd0aD4wKSYmKG49e3VybDpuLGRhdGE6aSxkYXRhVHlwZTpvfSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBzJiYobi5zdWNjZXNzPXMpKSxuPW58fHt9LG4uZGVsZWdhdGlvbj1uLmRlbGVnYXRpb24mJmUuaXNGdW5jdGlvbihlLmZuLm9uKSwhbi5kZWxlZ2F0aW9uJiYwPT09dGhpcy5sZW5ndGgpe3ZhciB1PXtzOnRoaXMuc2VsZWN0b3IsYzp0aGlzLmNvbnRleHR9O3JldHVybiFlLmlzUmVhZHkmJnUucz8oYShcIkRPTSBub3QgcmVhZHksIHF1ZXVpbmcgYWpheEZvcm1cIiksZShmdW5jdGlvbigpe2UodS5zLHUuYykuYWpheEZvcm0obil9KSx0aGlzKTooYShcInRlcm1pbmF0aW5nOyB6ZXJvIGVsZW1lbnRzIGZvdW5kIGJ5IHNlbGVjdG9yXCIrKGUuaXNSZWFkeT9cIlwiOlwiIChET00gbm90IHJlYWR5KVwiKSksdGhpcyl9cmV0dXJuIG4uZGVsZWdhdGlvbj8oZShkb2N1bWVudCkub2ZmKFwic3VibWl0LmZvcm0tcGx1Z2luXCIsdGhpcy5zZWxlY3Rvcix0KS5vZmYoXCJjbGljay5mb3JtLXBsdWdpblwiLHRoaXMuc2VsZWN0b3Iscikub24oXCJzdWJtaXQuZm9ybS1wbHVnaW5cIix0aGlzLnNlbGVjdG9yLG4sdCkub24oXCJjbGljay5mb3JtLXBsdWdpblwiLHRoaXMuc2VsZWN0b3IsbixyKSx0aGlzKTp0aGlzLmFqYXhGb3JtVW5iaW5kKCkub24oXCJzdWJtaXQuZm9ybS1wbHVnaW5cIixuLHQpLm9uKFwiY2xpY2suZm9ybS1wbHVnaW5cIixuLHIpfSxlLmZuLmFqYXhGb3JtVW5iaW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2ZmKFwic3VibWl0LmZvcm0tcGx1Z2luIGNsaWNrLmZvcm0tcGx1Z2luXCIpfSxlLmZuLmZvcm1Ub0FycmF5PWZ1bmN0aW9uKHQscixhKXt2YXIgbj1bXTtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIG47dmFyIG8scz10aGlzWzBdLHU9dGhpcy5hdHRyKFwiaWRcIiksYz10fHx2b2lkIDA9PT1zLmVsZW1lbnRzP3MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpOnMuZWxlbWVudHM7aWYoYyYmKGM9ZS5tYWtlQXJyYXkoYykpLHUmJih0fHwvKEVkZ2V8VHJpZGVudClcXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpJiYobz1lKCc6aW5wdXRbZm9ybT1cIicrdSsnXCJdJykuZ2V0KCkpLmxlbmd0aCYmKGM9KGN8fFtdKS5jb25jYXQobykpLCFjfHwhYy5sZW5ndGgpcmV0dXJuIG47ZS5pc0Z1bmN0aW9uKGEpJiYoYz1lLm1hcChjLGEpKTt2YXIgbCxmLGQscCxtLGgsdjtmb3IobD0wLGg9Yy5sZW5ndGg7bDxoO2wrKylpZihtPWNbbF0sKGQ9bS5uYW1lKSYmIW0uZGlzYWJsZWQpaWYodCYmcy5jbGsmJlwiaW1hZ2VcIj09PW0udHlwZSlzLmNsaz09PW0mJihuLnB1c2goe25hbWU6ZCx2YWx1ZTplKG0pLnZhbCgpLHR5cGU6bS50eXBlfSksbi5wdXNoKHtuYW1lOmQrXCIueFwiLHZhbHVlOnMuY2xrX3h9LHtuYW1lOmQrXCIueVwiLHZhbHVlOnMuY2xrX3l9KSk7ZWxzZSBpZigocD1lLmZpZWxkVmFsdWUobSwhMCkpJiZwLmNvbnN0cnVjdG9yPT09QXJyYXkpZm9yKHImJnIucHVzaChtKSxmPTAsdj1wLmxlbmd0aDtmPHY7ZisrKW4ucHVzaCh7bmFtZTpkLHZhbHVlOnBbZl19KTtlbHNlIGlmKGkuZmlsZWFwaSYmXCJmaWxlXCI9PT1tLnR5cGUpe3ImJnIucHVzaChtKTt2YXIgZz1tLmZpbGVzO2lmKGcubGVuZ3RoKWZvcihmPTA7ZjxnLmxlbmd0aDtmKyspbi5wdXNoKHtuYW1lOmQsdmFsdWU6Z1tmXSx0eXBlOm0udHlwZX0pO2Vsc2Ugbi5wdXNoKHtuYW1lOmQsdmFsdWU6XCJcIix0eXBlOm0udHlwZX0pfWVsc2UgbnVsbCE9PXAmJnZvaWQgMCE9PXAmJihyJiZyLnB1c2gobSksbi5wdXNoKHtuYW1lOmQsdmFsdWU6cCx0eXBlOm0udHlwZSxyZXF1aXJlZDptLnJlcXVpcmVkfSkpO2lmKCF0JiZzLmNsayl7dmFyIHg9ZShzLmNsaykseT14WzBdOyhkPXkubmFtZSkmJiF5LmRpc2FibGVkJiZcImltYWdlXCI9PT15LnR5cGUmJihuLnB1c2goe25hbWU6ZCx2YWx1ZTp4LnZhbCgpfSksbi5wdXNoKHtuYW1lOmQrXCIueFwiLHZhbHVlOnMuY2xrX3h9LHtuYW1lOmQrXCIueVwiLHZhbHVlOnMuY2xrX3l9KSl9cmV0dXJuIG59LGUuZm4uZm9ybVNlcmlhbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5wYXJhbSh0aGlzLmZvcm1Ub0FycmF5KHQpKX0sZS5mbi5maWVsZFNlcmlhbGl6ZT1mdW5jdGlvbih0KXt2YXIgcj1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYW1lO2lmKGEpe3ZhciBuPWUuZmllbGRWYWx1ZSh0aGlzLHQpO2lmKG4mJm4uY29uc3RydWN0b3I9PT1BcnJheSlmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspci5wdXNoKHtuYW1lOmEsdmFsdWU6bltpXX0pO2Vsc2UgbnVsbCE9PW4mJnZvaWQgMCE9PW4mJnIucHVzaCh7bmFtZTp0aGlzLm5hbWUsdmFsdWU6bn0pfX0pLGUucGFyYW0ocil9LGUuZm4uZmllbGRWYWx1ZT1mdW5jdGlvbih0KXtmb3IodmFyIHI9W10sYT0wLG49dGhpcy5sZW5ndGg7YTxuO2ErKyl7dmFyIGk9dGhpc1thXSxvPWUuZmllbGRWYWx1ZShpLHQpO251bGw9PT1vfHx2b2lkIDA9PT1vfHxvLmNvbnN0cnVjdG9yPT09QXJyYXkmJiFvLmxlbmd0aHx8KG8uY29uc3RydWN0b3I9PT1BcnJheT9lLm1lcmdlKHIsbyk6ci5wdXNoKG8pKX1yZXR1cm4gcn0sZS5maWVsZFZhbHVlPWZ1bmN0aW9uKHQscil7dmFyIGE9dC5uYW1lLGk9dC50eXBlLG89dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7aWYodm9pZCAwPT09ciYmKHI9ITApLHImJighYXx8dC5kaXNhYmxlZHx8XCJyZXNldFwiPT09aXx8XCJidXR0b25cIj09PWl8fChcImNoZWNrYm94XCI9PT1pfHxcInJhZGlvXCI9PT1pKSYmIXQuY2hlY2tlZHx8KFwic3VibWl0XCI9PT1pfHxcImltYWdlXCI9PT1pKSYmdC5mb3JtJiZ0LmZvcm0uY2xrIT09dHx8XCJzZWxlY3RcIj09PW8mJi0xPT09dC5zZWxlY3RlZEluZGV4KSlyZXR1cm4gbnVsbDtpZihcInNlbGVjdFwiPT09byl7dmFyIHM9dC5zZWxlY3RlZEluZGV4O2lmKHM8MClyZXR1cm4gbnVsbDtmb3IodmFyIHU9W10sYz10Lm9wdGlvbnMsbD1cInNlbGVjdC1vbmVcIj09PWksZj1sP3MrMTpjLmxlbmd0aCxkPWw/czowO2Q8ZjtkKyspe3ZhciBwPWNbZF07aWYocC5zZWxlY3RlZCYmIXAuZGlzYWJsZWQpe3ZhciBtPXAudmFsdWU7aWYobXx8KG09cC5hdHRyaWJ1dGVzJiZwLmF0dHJpYnV0ZXMudmFsdWUmJiFwLmF0dHJpYnV0ZXMudmFsdWUuc3BlY2lmaWVkP3AudGV4dDpwLnZhbHVlKSxsKXJldHVybiBtO3UucHVzaChtKX19cmV0dXJuIHV9cmV0dXJuIGUodCkudmFsKCkucmVwbGFjZShuLFwiXFxyXFxuXCIpfSxlLmZuLmNsZWFyRm9ybT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZShcImlucHV0LHNlbGVjdCx0ZXh0YXJlYVwiLHRoaXMpLmNsZWFyRmllbGRzKHQpfSl9LGUuZm4uY2xlYXJGaWVsZHM9ZS5mbi5jbGVhcklucHV0cz1mdW5jdGlvbih0KXt2YXIgcj0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZW1haWx8bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrKSQvaTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlLG49dGhpcy50YWdOYW1lLnRvTG93ZXJDYXNlKCk7ci50ZXN0KGEpfHxcInRleHRhcmVhXCI9PT1uP3RoaXMudmFsdWU9XCJcIjpcImNoZWNrYm94XCI9PT1hfHxcInJhZGlvXCI9PT1hP3RoaXMuY2hlY2tlZD0hMTpcInNlbGVjdFwiPT09bj90aGlzLnNlbGVjdGVkSW5kZXg9LTE6XCJmaWxlXCI9PT1hPy9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpP2UodGhpcykucmVwbGFjZVdpdGgoZSh0aGlzKS5jbG9uZSghMCkpOmUodGhpcykudmFsKFwiXCIpOnQmJighMD09PXQmJi9oaWRkZW4vLnRlc3QoYSl8fFwic3RyaW5nXCI9PXR5cGVvZiB0JiZlKHRoaXMpLmlzKHQpKSYmKHRoaXMudmFsdWU9XCJcIil9KX0sZS5mbi5yZXNldEZvcm09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxyPXRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpO3N3aXRjaChyKXtjYXNlXCJpbnB1dFwiOnRoaXMuY2hlY2tlZD10aGlzLmRlZmF1bHRDaGVja2VkO2Nhc2VcInRleHRhcmVhXCI6cmV0dXJuIHRoaXMudmFsdWU9dGhpcy5kZWZhdWx0VmFsdWUsITA7Y2FzZVwib3B0aW9uXCI6Y2FzZVwib3B0Z3JvdXBcIjp2YXIgYT10LnBhcmVudHMoXCJzZWxlY3RcIik7cmV0dXJuIGEubGVuZ3RoJiZhWzBdLm11bHRpcGxlP1wib3B0aW9uXCI9PT1yP3RoaXMuc2VsZWN0ZWQ9dGhpcy5kZWZhdWx0U2VsZWN0ZWQ6dC5maW5kKFwib3B0aW9uXCIpLnJlc2V0Rm9ybSgpOmEucmVzZXRGb3JtKCksITA7Y2FzZVwic2VsZWN0XCI6cmV0dXJuIHQuZmluZChcIm9wdGlvblwiKS5lYWNoKGZ1bmN0aW9uKGUpe2lmKHRoaXMuc2VsZWN0ZWQ9dGhpcy5kZWZhdWx0U2VsZWN0ZWQsdGhpcy5kZWZhdWx0U2VsZWN0ZWQmJiF0WzBdLm11bHRpcGxlKXJldHVybiB0WzBdLnNlbGVjdGVkSW5kZXg9ZSwhMX0pLCEwO2Nhc2VcImxhYmVsXCI6dmFyIG49ZSh0LmF0dHIoXCJmb3JcIikpLGk9dC5maW5kKFwiaW5wdXQsc2VsZWN0LHRleHRhcmVhXCIpO3JldHVybiBuWzBdJiZpLnVuc2hpZnQoblswXSksaS5yZXNldEZvcm0oKSwhMDtjYXNlXCJmb3JtXCI6cmV0dXJuKFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMucmVzZXR8fFwib2JqZWN0XCI9PXR5cGVvZiB0aGlzLnJlc2V0JiYhdGhpcy5yZXNldC5ub2RlVHlwZSkmJnRoaXMucmVzZXQoKSwhMDtkZWZhdWx0OnJldHVybiB0LmZpbmQoXCJmb3JtLGlucHV0LGxhYmVsLHNlbGVjdCx0ZXh0YXJlYVwiKS5yZXNldEZvcm0oKSwhMH19KX0sZS5mbi5lbmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSEwKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPSFlfSl9LGUuZm4uc2VsZWN0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSEwKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcj10aGlzLnR5cGU7aWYoXCJjaGVja2JveFwiPT09cnx8XCJyYWRpb1wiPT09cil0aGlzLmNoZWNrZWQ9dDtlbHNlIGlmKFwib3B0aW9uXCI9PT10aGlzLnRhZ05hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGE9ZSh0aGlzKS5wYXJlbnQoXCJzZWxlY3RcIik7dCYmYVswXSYmXCJzZWxlY3Qtb25lXCI9PT1hWzBdLnR5cGUmJmEuZmluZChcIm9wdGlvblwiKS5zZWxlY3RlZCghMSksdGhpcy5zZWxlY3RlZD10fX0pfSxlLmZuLmFqYXhTdWJtaXQuZGVidWc9ITF9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5mb3JtLm1pbi5qcy5tYXBcbiIsIi8qKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxNSBBcmllbCBGbGVzbGVyIC0gYWZsZXNsZXI8YT5nbWFpbDxkPmNvbSB8IGh0dHA6Ly9mbGVzbGVyLmJsb2dzcG90LmNvbVxyXG4gKiBMaWNlbnNlZCB1bmRlciBNSVRcclxuICogQGF1dGhvciBBcmllbCBGbGVzbGVyXHJcbiAqIEB2ZXJzaW9uIDEuNC4wXHJcbiAqL1xyXG47KGZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBkZWZpbmU9PT0nZnVuY3Rpb24nJiZkZWZpbmUuYW1kKXtkZWZpbmUoWydqcXVlcnknXSxhKX1lbHNle2EoalF1ZXJ5KX19KGZ1bmN0aW9uKCQpe3ZhciBnPWxvY2F0aW9uLmhyZWYucmVwbGFjZSgvIy4qLywnJyk7dmFyIGg9JC5sb2NhbFNjcm9sbD1mdW5jdGlvbihhKXskKCdib2R5JykubG9jYWxTY3JvbGwoYSl9O2guZGVmYXVsdHM9e2R1cmF0aW9uOjEwMDAsYXhpczoneScsZXZlbnQ6J2NsaWNrJyxzdG9wOnRydWUsdGFyZ2V0OndpbmRvd307JC5mbi5sb2NhbFNjcm9sbD1mdW5jdGlvbihhKXthPSQuZXh0ZW5kKHt9LGguZGVmYXVsdHMsYSk7aWYoYS5oYXNoJiZsb2NhdGlvbi5oYXNoKXtpZihhLnRhcmdldCl3aW5kb3cuc2Nyb2xsVG8oMCwwKTtzY3JvbGwoMCxsb2NhdGlvbixhKX1yZXR1cm4gYS5sYXp5P3RoaXMub24oYS5ldmVudCwnYSxhcmVhJyxmdW5jdGlvbihlKXtpZihmaWx0ZXIuY2FsbCh0aGlzKSl7c2Nyb2xsKGUsdGhpcyxhKX19KTp0aGlzLmZpbmQoJ2EsYXJlYScpLmZpbHRlcihmaWx0ZXIpLmJpbmQoYS5ldmVudCxmdW5jdGlvbihlKXtzY3JvbGwoZSx0aGlzLGEpfSkuZW5kKCkuZW5kKCk7ZnVuY3Rpb24gZmlsdGVyKCl7cmV0dXJuISF0aGlzLmhyZWYmJiEhdGhpcy5oYXNoJiZ0aGlzLmhyZWYucmVwbGFjZSh0aGlzLmhhc2gsJycpPT09ZyYmKCFhLmZpbHRlcnx8JCh0aGlzKS5pcyhhLmZpbHRlcikpfX07aC5oYXNoPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBzY3JvbGwoZSxhLGIpe3ZhciBjPWEuaGFzaC5zbGljZSgxKSxlbGVtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGMpfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShjKVswXTtpZighZWxlbSlyZXR1cm47aWYoZSllLnByZXZlbnREZWZhdWx0KCk7dmFyIGQ9JChiLnRhcmdldCk7aWYoYi5sb2NrJiZkLmlzKCc6YW5pbWF0ZWQnKXx8Yi5vbkJlZm9yZSYmYi5vbkJlZm9yZShlLGVsZW0sZCk9PT1mYWxzZSlyZXR1cm47aWYoYi5zdG9wKXtkLnN0b3AodHJ1ZSl9aWYoYi5oYXNoKXt2YXIgZj1lbGVtLmlkPT09Yz8naWQnOiduYW1lJywkYT0kKCc8YT4gPC9hPicpLmF0dHIoZixjKS5jc3Moe3Bvc2l0aW9uOidhYnNvbHV0ZScsdG9wOiQod2luZG93KS5zY3JvbGxUb3AoKSxsZWZ0OiQod2luZG93KS5zY3JvbGxMZWZ0KCl9KTtlbGVtW2ZdPScnOyQoJ2JvZHknKS5wcmVwZW5kKCRhKTtsb2NhdGlvbi5oYXNoPWEuaGFzaDskYS5yZW1vdmUoKTtlbGVtW2ZdPWN9ZC5zY3JvbGxUbyhlbGVtLGIpLnRyaWdnZXIoJ25vdGlmeS5zZXJpYWxTY3JvbGwnLFtlbGVtXSl9cmV0dXJuIGh9KSk7IiwiLyohIENvcHlyaWdodCAoYykgMjAxMyBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbi5hYXJvbi5zaClcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuXHJcbiAqXHJcbiAqIFZlcnNpb246IDMuMS4xMlxyXG4gKlxyXG4gKiBSZXF1aXJlczogalF1ZXJ5IDEuMi4yK1xyXG4gKi9cclxuIWZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGEpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWE6YShqUXVlcnkpfShmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe3ZhciBnPWJ8fHdpbmRvdy5ldmVudCxoPWkuY2FsbChhcmd1bWVudHMsMSksaj0wLGw9MCxtPTAsbj0wLG89MCxwPTA7aWYoYj1hLmV2ZW50LmZpeChnKSxiLnR5cGU9XCJtb3VzZXdoZWVsXCIsXCJkZXRhaWxcImluIGcmJihtPS0xKmcuZGV0YWlsKSxcIndoZWVsRGVsdGFcImluIGcmJihtPWcud2hlZWxEZWx0YSksXCJ3aGVlbERlbHRhWVwiaW4gZyYmKG09Zy53aGVlbERlbHRhWSksXCJ3aGVlbERlbHRhWFwiaW4gZyYmKGw9LTEqZy53aGVlbERlbHRhWCksXCJheGlzXCJpbiBnJiZnLmF4aXM9PT1nLkhPUklaT05UQUxfQVhJUyYmKGw9LTEqbSxtPTApLGo9MD09PW0/bDptLFwiZGVsdGFZXCJpbiBnJiYobT0tMSpnLmRlbHRhWSxqPW0pLFwiZGVsdGFYXCJpbiBnJiYobD1nLmRlbHRhWCwwPT09bSYmKGo9LTEqbCkpLDAhPT1tfHwwIT09bCl7aWYoMT09PWcuZGVsdGFNb2RlKXt2YXIgcT1hLmRhdGEodGhpcyxcIm1vdXNld2hlZWwtbGluZS1oZWlnaHRcIik7aio9cSxtKj1xLGwqPXF9ZWxzZSBpZigyPT09Zy5kZWx0YU1vZGUpe3ZhciByPWEuZGF0YSh0aGlzLFwibW91c2V3aGVlbC1wYWdlLWhlaWdodFwiKTtqKj1yLG0qPXIsbCo9cn1pZihuPU1hdGgubWF4KE1hdGguYWJzKG0pLE1hdGguYWJzKGwpKSwoIWZ8fGY+bikmJihmPW4sZChnLG4pJiYoZi89NDApKSxkKGcsbikmJihqLz00MCxsLz00MCxtLz00MCksaj1NYXRoW2o+PTE/XCJmbG9vclwiOlwiY2VpbFwiXShqL2YpLGw9TWF0aFtsPj0xP1wiZmxvb3JcIjpcImNlaWxcIl0obC9mKSxtPU1hdGhbbT49MT9cImZsb29yXCI6XCJjZWlsXCJdKG0vZiksay5zZXR0aW5ncy5ub3JtYWxpemVPZmZzZXQmJnRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXt2YXIgcz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO289Yi5jbGllbnRYLXMubGVmdCxwPWIuY2xpZW50WS1zLnRvcH1yZXR1cm4gYi5kZWx0YVg9bCxiLmRlbHRhWT1tLGIuZGVsdGFGYWN0b3I9ZixiLm9mZnNldFg9byxiLm9mZnNldFk9cCxiLmRlbHRhTW9kZT0wLGgudW5zaGlmdChiLGosbCxtKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGMsMjAwKSwoYS5ldmVudC5kaXNwYXRjaHx8YS5ldmVudC5oYW5kbGUpLmFwcGx5KHRoaXMsaCl9fWZ1bmN0aW9uIGMoKXtmPW51bGx9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBrLnNldHRpbmdzLmFkanVzdE9sZERlbHRhcyYmXCJtb3VzZXdoZWVsXCI9PT1hLnR5cGUmJmIlMTIwPT09MH12YXIgZSxmLGc9W1wid2hlZWxcIixcIm1vdXNld2hlZWxcIixcIkRPTU1vdXNlU2Nyb2xsXCIsXCJNb3pNb3VzZVBpeGVsU2Nyb2xsXCJdLGg9XCJvbndoZWVsXCJpbiBkb2N1bWVudHx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPj05P1tcIndoZWVsXCJdOltcIm1vdXNld2hlZWxcIixcIkRvbU1vdXNlU2Nyb2xsXCIsXCJNb3pNb3VzZVBpeGVsU2Nyb2xsXCJdLGk9QXJyYXkucHJvdG90eXBlLnNsaWNlO2lmKGEuZXZlbnQuZml4SG9va3MpZm9yKHZhciBqPWcubGVuZ3RoO2o7KWEuZXZlbnQuZml4SG9va3NbZ1stLWpdXT1hLmV2ZW50Lm1vdXNlSG9va3M7dmFyIGs9YS5ldmVudC5zcGVjaWFsLm1vdXNld2hlZWw9e3ZlcnNpb246XCIzLjEuMTJcIixzZXR1cDpmdW5jdGlvbigpe2lmKHRoaXMuYWRkRXZlbnRMaXN0ZW5lcilmb3IodmFyIGM9aC5sZW5ndGg7YzspdGhpcy5hZGRFdmVudExpc3RlbmVyKGhbLS1jXSxiLCExKTtlbHNlIHRoaXMub25tb3VzZXdoZWVsPWI7YS5kYXRhKHRoaXMsXCJtb3VzZXdoZWVsLWxpbmUtaGVpZ2h0XCIsay5nZXRMaW5lSGVpZ2h0KHRoaXMpKSxhLmRhdGEodGhpcyxcIm1vdXNld2hlZWwtcGFnZS1oZWlnaHRcIixrLmdldFBhZ2VIZWlnaHQodGhpcykpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcilmb3IodmFyIGM9aC5sZW5ndGg7YzspdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGhbLS1jXSxiLCExKTtlbHNlIHRoaXMub25tb3VzZXdoZWVsPW51bGw7YS5yZW1vdmVEYXRhKHRoaXMsXCJtb3VzZXdoZWVsLWxpbmUtaGVpZ2h0XCIpLGEucmVtb3ZlRGF0YSh0aGlzLFwibW91c2V3aGVlbC1wYWdlLWhlaWdodFwiKX0sZ2V0TGluZUhlaWdodDpmdW5jdGlvbihiKXt2YXIgYz1hKGIpLGQ9Y1tcIm9mZnNldFBhcmVudFwiaW4gYS5mbj9cIm9mZnNldFBhcmVudFwiOlwicGFyZW50XCJdKCk7cmV0dXJuIGQubGVuZ3RofHwoZD1hKFwiYm9keVwiKSkscGFyc2VJbnQoZC5jc3MoXCJmb250U2l6ZVwiKSwxMCl8fHBhcnNlSW50KGMuY3NzKFwiZm9udFNpemVcIiksMTApfHwxNn0sZ2V0UGFnZUhlaWdodDpmdW5jdGlvbihiKXtyZXR1cm4gYShiKS5oZWlnaHQoKX0sc2V0dGluZ3M6e2FkanVzdE9sZERlbHRhczohMCxub3JtYWxpemVPZmZzZXQ6ITB9fTthLmZuLmV4dGVuZCh7bW91c2V3aGVlbDpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJpbmQoXCJtb3VzZXdoZWVsXCIsYSk6dGhpcy50cmlnZ2VyKFwibW91c2V3aGVlbFwiKX0sdW5tb3VzZXdoZWVsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVuYmluZChcIm1vdXNld2hlZWxcIixhKX19KX0pOyIsIi8qXHJcblBsdWdpbjogalF1ZXJ5IFBhcmFsbGF4XHJcblZlcnNpb24gMS4xLjNcclxuQXV0aG9yOiBJYW4gTHVublxyXG5Ud2l0dGVyOiBASWFuTHVublxyXG5BdXRob3IgVVJMOiBodHRwOi8vd3d3Lmlhbmx1bm4uY28udWsvXHJcblBsdWdpbiBVUkw6IGh0dHA6Ly93d3cuaWFubHVubi5jby51ay9wbHVnaW5zL2pxdWVyeS1wYXJhbGxheC9cclxuXHJcbkR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOlxyXG5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5odHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWxcclxuKi9cclxuXHJcbihmdW5jdGlvbiggJCApe1xyXG5cdHZhciAkd2luZG93ID0gJCh3aW5kb3cpO1xyXG5cdHZhciB3aW5kb3dIZWlnaHQgPSAkd2luZG93LmhlaWdodCgpO1xyXG5cclxuXHQkd2luZG93LnJlc2l6ZShmdW5jdGlvbiAoKSB7XHJcblx0XHR3aW5kb3dIZWlnaHQgPSAkd2luZG93LmhlaWdodCgpO1xyXG5cdH0pO1xyXG5cclxuXHQkLmZuLnBhcmFsbGF4ID0gZnVuY3Rpb24oeHBvcywgc3BlZWRGYWN0b3IsIG91dGVySGVpZ2h0KSB7XHJcblx0XHR2YXIgJHRoaXMgPSAkKHRoaXMpO1xyXG5cdFx0dmFyIGdldEhlaWdodDtcclxuXHRcdHZhciBmaXJzdFRvcDtcclxuXHRcdHZhciBwYWRkaW5nVG9wID0gMDtcclxuXHRcdFxyXG5cdFx0Ly9nZXQgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGVhY2ggZWxlbWVudCB0byBoYXZlIHBhcmFsbGF4IGFwcGxpZWQgdG8gaXRcdFx0XHJcblx0XHQkdGhpcy5lYWNoKGZ1bmN0aW9uKCl7XHJcblx0XHQgICAgZmlyc3RUb3AgPSAkdGhpcy5vZmZzZXQoKS50b3A7XHJcblx0XHR9KTtcclxuXHJcblx0XHRpZiAob3V0ZXJIZWlnaHQpIHtcclxuXHRcdFx0Z2V0SGVpZ2h0ID0gZnVuY3Rpb24oanFvKSB7XHJcblx0XHRcdFx0cmV0dXJuIGpxby5vdXRlckhlaWdodCh0cnVlKTtcclxuXHRcdFx0fTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGdldEhlaWdodCA9IGZ1bmN0aW9uKGpxbykge1xyXG5cdFx0XHRcdHJldHVybiBqcW8uaGVpZ2h0KCk7XHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0XHRcdFxyXG5cdFx0Ly8gc2V0dXAgZGVmYXVsdHMgaWYgYXJndW1lbnRzIGFyZW4ndCBzcGVjaWZpZWRcclxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCB4cG9zID09PSBudWxsKSB4cG9zID0gXCI1MCVcIjtcclxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMiB8fCBzcGVlZEZhY3RvciA9PT0gbnVsbCkgc3BlZWRGYWN0b3IgPSAwLjE7XHJcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMgfHwgb3V0ZXJIZWlnaHQgPT09IG51bGwpIG91dGVySGVpZ2h0ID0gdHJ1ZTtcclxuXHRcdFxyXG5cdFx0Ly8gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSB3aW5kb3cgaXMgc2Nyb2xsZWQgb3IgcmVzaXplZFxyXG5cdFx0ZnVuY3Rpb24gdXBkYXRlKCl7XHJcblx0XHRcdHZhciBwb3MgPSAkd2luZG93LnNjcm9sbFRvcCgpO1x0XHRcdFx0XHJcblxyXG5cdFx0XHQkdGhpcy5lYWNoKGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0dmFyICRlbGVtZW50ID0gJCh0aGlzKTtcclxuXHRcdFx0XHR2YXIgdG9wID0gJGVsZW1lbnQub2Zmc2V0KCkudG9wO1xyXG5cdFx0XHRcdHZhciBoZWlnaHQgPSBnZXRIZWlnaHQoJGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHQvLyBDaGVjayBpZiB0b3RhbGx5IGFib3ZlIG9yIHRvdGFsbHkgYmVsb3cgdmlld3BvcnRcclxuXHRcdFx0XHRpZiAodG9wICsgaGVpZ2h0IDwgcG9zIHx8IHRvcCA+IHBvcyArIHdpbmRvd0hlaWdodCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0JHRoaXMuY3NzKCdiYWNrZ3JvdW5kUG9zaXRpb24nLCB4cG9zICsgXCIgXCIgKyBNYXRoLnJvdW5kKChmaXJzdFRvcCAtIHBvcykgKiBzcGVlZEZhY3RvcikgKyBcInB4XCIpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cdFx0XHJcblxyXG5cdFx0JHdpbmRvdy5iaW5kKCdzY3JvbGwnLCB1cGRhdGUpLnJlc2l6ZSh1cGRhdGUpO1xyXG5cdFx0dXBkYXRlKCk7XHJcblx0fTtcclxufSkoalF1ZXJ5KTtcclxuIiwiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAwNy0yMDE1IEFyaWVsIEZsZXNsZXIgLSBhZmxlc2xlcjxhPmdtYWlsPGQ+Y29tIHwgaHR0cDovL2ZsZXNsZXIuYmxvZ3Nwb3QuY29tXHJcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVFxyXG4gKiBAYXV0aG9yIEFyaWVsIEZsZXNsZXJcclxuICogQHZlcnNpb24gMi4xLjJcclxuICovXHJcbjsoZnVuY3Rpb24oZil7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGYpOlwidW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1mKHJlcXVpcmUoXCJqcXVlcnlcIikpOmYoalF1ZXJ5KX0pKGZ1bmN0aW9uKCQpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4oYSl7cmV0dXJuIWEubm9kZU5hbWV8fC0xIT09JC5pbkFycmF5KGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxbXCJpZnJhbWVcIixcIiNkb2N1bWVudFwiLFwiaHRtbFwiLFwiYm9keVwiXSl9ZnVuY3Rpb24gaChhKXtyZXR1cm4gJC5pc0Z1bmN0aW9uKGEpfHwkLmlzUGxhaW5PYmplY3QoYSk/YTp7dG9wOmEsbGVmdDphfX12YXIgcD0kLnNjcm9sbFRvPWZ1bmN0aW9uKGEsZCxiKXtyZXR1cm4gJCh3aW5kb3cpLnNjcm9sbFRvKGEsZCxiKX07cC5kZWZhdWx0cz17YXhpczpcInh5XCIsZHVyYXRpb246MCxsaW1pdDohMH07JC5mbi5zY3JvbGxUbz1mdW5jdGlvbihhLGQsYil7XCJvYmplY3RcIj09PSB0eXBlb2YgZCYmKGI9ZCxkPTApO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiJiYoYj17b25BZnRlcjpifSk7XCJtYXhcIj09PWEmJihhPTlFOSk7Yj0kLmV4dGVuZCh7fSxwLmRlZmF1bHRzLGIpO2Q9ZHx8Yi5kdXJhdGlvbjt2YXIgdT1iLnF1ZXVlJiYxPGIuYXhpcy5sZW5ndGg7dSYmKGQvPTIpO2Iub2Zmc2V0PWgoYi5vZmZzZXQpO2Iub3Zlcj1oKGIub3Zlcik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2Z1bmN0aW9uIGsoYSl7dmFyIGs9JC5leHRlbmQoe30sYix7cXVldWU6ITAsZHVyYXRpb246ZCxjb21wbGV0ZTphJiZmdW5jdGlvbigpe2EuY2FsbChxLGUsYil9fSk7ci5hbmltYXRlKGYsayl9aWYobnVsbCE9PWEpe3ZhciBsPW4odGhpcykscT1sP3RoaXMuY29udGVudFdpbmRvd3x8d2luZG93OnRoaXMscj0kKHEpLGU9YSxmPXt9LHQ7c3dpdGNoKHR5cGVvZiBlKXtjYXNlIFwibnVtYmVyXCI6Y2FzZSBcInN0cmluZ1wiOmlmKC9eKFsrLV09Pyk/XFxkKyhcXC5cXGQrKT8ocHh8JSk/JC8udGVzdChlKSl7ZT0gaChlKTticmVha31lPWw/JChlKTokKGUscSk7Y2FzZSBcIm9iamVjdFwiOmlmKGUubGVuZ3RoPT09MClyZXR1cm47aWYoZS5pc3x8ZS5zdHlsZSl0PShlPSQoZSkpLm9mZnNldCgpfXZhciB2PSQuaXNGdW5jdGlvbihiLm9mZnNldCkmJmIub2Zmc2V0KHEsZSl8fGIub2Zmc2V0OyQuZWFjaChiLmF4aXMuc3BsaXQoXCJcIiksZnVuY3Rpb24oYSxjKXt2YXIgZD1cInhcIj09PWM/XCJMZWZ0XCI6XCJUb3BcIixtPWQudG9Mb3dlckNhc2UoKSxnPVwic2Nyb2xsXCIrZCxoPXJbZ10oKSxuPXAubWF4KHEsYyk7dD8oZltnXT10W21dKyhsPzA6aC1yLm9mZnNldCgpW21dKSxiLm1hcmdpbiYmKGZbZ10tPXBhcnNlSW50KGUuY3NzKFwibWFyZ2luXCIrZCksMTApfHwwLGZbZ10tPXBhcnNlSW50KGUuY3NzKFwiYm9yZGVyXCIrZCtcIldpZHRoXCIpLDEwKXx8MCksZltnXSs9dlttXXx8MCxiLm92ZXJbbV0mJihmW2ddKz1lW1wieFwiPT09Yz9cIndpZHRoXCI6XCJoZWlnaHRcIl0oKSpiLm92ZXJbbV0pKTooZD1lW21dLGZbZ109ZC5zbGljZSYmIFwiJVwiPT09ZC5zbGljZSgtMSk/cGFyc2VGbG9hdChkKS8xMDAqbjpkKTtiLmxpbWl0JiYvXlxcZCskLy50ZXN0KGZbZ10pJiYoZltnXT0wPj1mW2ddPzA6TWF0aC5taW4oZltnXSxuKSk7IWEmJjE8Yi5heGlzLmxlbmd0aCYmKGg9PT1mW2ddP2Y9e306dSYmKGsoYi5vbkFmdGVyRmlyc3QpLGY9e30pKX0pO2soYi5vbkFmdGVyKX19KX07cC5tYXg9ZnVuY3Rpb24oYSxkKXt2YXIgYj1cInhcIj09PWQ/XCJXaWR0aFwiOlwiSGVpZ2h0XCIsaD1cInNjcm9sbFwiK2I7aWYoIW4oYSkpcmV0dXJuIGFbaF0tJChhKVtiLnRvTG93ZXJDYXNlKCldKCk7dmFyIGI9XCJjbGllbnRcIitiLGs9YS5vd25lckRvY3VtZW50fHxhLmRvY3VtZW50LGw9ay5kb2N1bWVudEVsZW1lbnQsaz1rLmJvZHk7cmV0dXJuIE1hdGgubWF4KGxbaF0sa1toXSktTWF0aC5taW4obFtiXSxrW2JdKX07JC5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdD0kLlR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3A9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gJChhLmVsZW0pW2EucHJvcF0oKX0sIHNldDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldChhKTtpZihhLm9wdGlvbnMuaW50ZXJydXB0JiZhLl9sYXN0JiZhLl9sYXN0IT09ZClyZXR1cm4gJChhLmVsZW0pLnN0b3AoKTt2YXIgYj1NYXRoLnJvdW5kKGEubm93KTtkIT09YiYmKCQoYS5lbGVtKVthLnByb3BdKGIpLGEuX2xhc3Q9dGhpcy5nZXQoYSkpfX07cmV0dXJuIHB9KTsiLCIvLyBTdGlja3kgUGx1Z2luIHYxLjAuNCBmb3IgalF1ZXJ5XHJcbi8vID09PT09PT09PT09PT1cclxuLy8gQXV0aG9yOiBBbnRob255IEdhcmFuZFxyXG4vLyBJbXByb3ZlbWVudHMgYnkgR2VybWFuIE0uIEJyYXZvIChLcm9udXopIGFuZCBSdXVkIEthbXBodWlzIChydXVkaylcclxuLy8gSW1wcm92ZW1lbnRzIGJ5IExlb25hcmRvIEMuIERhcm9uY28gKGRhcm9uY28pXHJcbi8vIENyZWF0ZWQ6IDAyLzE0LzIwMTFcclxuLy8gRGF0ZTogMDcvMjAvMjAxNVxyXG4vLyBXZWJzaXRlOiBodHRwOi8vc3RpY2t5anMuY29tL1xyXG4vLyBEZXNjcmlwdGlvbjogTWFrZXMgYW4gZWxlbWVudCBvbiB0aGUgcGFnZSBzdGljayBvbiB0aGUgc2NyZWVuIGFzIHlvdSBzY3JvbGxcclxuLy8gICAgICAgICAgICAgIEl0IHdpbGwgb25seSBzZXQgdGhlICd0b3AnIGFuZCAncG9zaXRpb24nIG9mIHlvdXIgZWxlbWVudCwgeW91XHJcbi8vICAgICAgICAgICAgICBtaWdodCBuZWVkIHRvIGFkanVzdCB0aGUgd2lkdGggaW4gc29tZSBjYXNlcy5cclxuXHJcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xyXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xyXG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cclxuICAgICAgICBkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XHJcbiAgICAgICAgLy8gTm9kZS9Db21tb25KU1xyXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCdqcXVlcnknKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xyXG4gICAgICAgIGZhY3RvcnkoalF1ZXJ5KTtcclxuICAgIH1cclxufShmdW5jdGlvbiAoJCkge1xyXG4gICAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOyAvLyBzYXZlIHJlZiB0byBvcmlnaW5hbCBzbGljZSgpXHJcbiAgICB2YXIgc3BsaWNlID0gQXJyYXkucHJvdG90eXBlLnNwbGljZTsgLy8gc2F2ZSByZWYgdG8gb3JpZ2luYWwgc2xpY2UoKVxyXG5cclxuICB2YXIgZGVmYXVsdHMgPSB7XHJcbiAgICAgIHRvcFNwYWNpbmc6IDAsXHJcbiAgICAgIGJvdHRvbVNwYWNpbmc6IDAsXHJcbiAgICAgIGNsYXNzTmFtZTogJ2lzLXN0aWNreScsXHJcbiAgICAgIHdyYXBwZXJDbGFzc05hbWU6ICdzdGlja3ktd3JhcHBlcicsXHJcbiAgICAgIGNlbnRlcjogZmFsc2UsXHJcbiAgICAgIGdldFdpZHRoRnJvbTogJycsXHJcbiAgICAgIHdpZHRoRnJvbVdyYXBwZXI6IHRydWUsIC8vIHdvcmtzIG9ubHkgd2hlbiAuZ2V0V2lkdGhGcm9tIGlzIGVtcHR5XHJcbiAgICAgIHJlc3BvbnNpdmVXaWR0aDogZmFsc2UsXHJcbiAgICAgIHpJbmRleDogJ2luaGVyaXQnXHJcbiAgICB9LFxyXG4gICAgJHdpbmRvdyA9ICQod2luZG93KSxcclxuICAgICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpLFxyXG4gICAgc3RpY2tlZCA9IFtdLFxyXG4gICAgd2luZG93SGVpZ2h0ID0gJHdpbmRvdy5oZWlnaHQoKSxcclxuICAgIHNjcm9sbGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBzY3JvbGxUb3AgPSAkd2luZG93LnNjcm9sbFRvcCgpLFxyXG4gICAgICAgIGRvY3VtZW50SGVpZ2h0ID0gJGRvY3VtZW50LmhlaWdodCgpLFxyXG4gICAgICAgIGR3aCA9IGRvY3VtZW50SGVpZ2h0IC0gd2luZG93SGVpZ2h0LFxyXG4gICAgICAgIGV4dHJhID0gKHNjcm9sbFRvcCA+IGR3aCkgPyBkd2ggLSBzY3JvbGxUb3AgOiAwO1xyXG5cclxuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBzdGlja2VkLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIHZhciBzID0gc3RpY2tlZFtpXSxcclxuICAgICAgICAgIGVsZW1lbnRUb3AgPSBzLnN0aWNreVdyYXBwZXIub2Zmc2V0KCkudG9wLFxyXG4gICAgICAgICAgZXRzZSA9IGVsZW1lbnRUb3AgLSBzLnRvcFNwYWNpbmcgLSBleHRyYTtcclxuXHJcbiAgICAgICAgLy91cGRhdGUgaGVpZ2h0IGluIGNhc2Ugb2YgZHluYW1pYyBjb250ZW50XHJcbiAgICAgICAgcy5zdGlja3lXcmFwcGVyLmNzcygnaGVpZ2h0Jywgcy5zdGlja3lFbGVtZW50Lm91dGVySGVpZ2h0KCkpO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsVG9wIDw9IGV0c2UpIHtcclxuICAgICAgICAgIGlmIChzLmN1cnJlbnRUb3AgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcy5zdGlja3lFbGVtZW50XHJcbiAgICAgICAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAnd2lkdGgnOiAnJyxcclxuICAgICAgICAgICAgICAgICdwb3NpdGlvbic6ICcnLFxyXG4gICAgICAgICAgICAgICAgJ3RvcCc6ICcnLFxyXG4gICAgICAgICAgICAgICAgJ3otaW5kZXgnOiAnJ1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzLnN0aWNreUVsZW1lbnQucGFyZW50KCkucmVtb3ZlQ2xhc3Mocy5jbGFzc05hbWUpO1xyXG4gICAgICAgICAgICBzLnN0aWNreUVsZW1lbnQudHJpZ2dlcignc3RpY2t5LWVuZCcsIFtzXSk7XHJcbiAgICAgICAgICAgIHMuY3VycmVudFRvcCA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdmFyIG5ld1RvcCA9IGRvY3VtZW50SGVpZ2h0IC0gcy5zdGlja3lFbGVtZW50Lm91dGVySGVpZ2h0KClcclxuICAgICAgICAgICAgLSBzLnRvcFNwYWNpbmcgLSBzLmJvdHRvbVNwYWNpbmcgLSBzY3JvbGxUb3AgLSBleHRyYTtcclxuICAgICAgICAgIGlmIChuZXdUb3AgPCAwKSB7XHJcbiAgICAgICAgICAgIG5ld1RvcCA9IG5ld1RvcCArIHMudG9wU3BhY2luZztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5ld1RvcCA9IHMudG9wU3BhY2luZztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzLmN1cnJlbnRUb3AgIT09IG5ld1RvcCkge1xyXG4gICAgICAgICAgICB2YXIgbmV3V2lkdGg7XHJcbiAgICAgICAgICAgIGlmIChzLmdldFdpZHRoRnJvbSkge1xyXG4gICAgICAgICAgICAgICAgcGFkZGluZyA9ICBzLnN0aWNreUVsZW1lbnQuaW5uZXJXaWR0aCgpIC0gcy5zdGlja3lFbGVtZW50LndpZHRoKCk7XHJcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9ICQocy5nZXRXaWR0aEZyb20pLndpZHRoKCkgLSBwYWRkaW5nIHx8IG51bGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocy53aWR0aEZyb21XcmFwcGVyKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHMuc3RpY2t5V3JhcHBlci53aWR0aCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChuZXdXaWR0aCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHMuc3RpY2t5RWxlbWVudC53aWR0aCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHMuc3RpY2t5RWxlbWVudFxyXG4gICAgICAgICAgICAgIC5jc3MoJ3dpZHRoJywgbmV3V2lkdGgpXHJcbiAgICAgICAgICAgICAgLmNzcygncG9zaXRpb24nLCAnZml4ZWQnKVxyXG4gICAgICAgICAgICAgIC5jc3MoJ3RvcCcsIG5ld1RvcClcclxuICAgICAgICAgICAgICAuY3NzKCd6LWluZGV4Jywgcy56SW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgcy5zdGlja3lFbGVtZW50LnBhcmVudCgpLmFkZENsYXNzKHMuY2xhc3NOYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzLmN1cnJlbnRUb3AgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBzLnN0aWNreUVsZW1lbnQudHJpZ2dlcignc3RpY2t5LXN0YXJ0JywgW3NdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBzdGlja3kgaXMgc3RhcnRlZCBidXQgaXQgaGF2ZSB0byBiZSByZXBvc2l0aW9uZWRcclxuICAgICAgICAgICAgICBzLnN0aWNreUVsZW1lbnQudHJpZ2dlcignc3RpY2t5LXVwZGF0ZScsIFtzXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzLmN1cnJlbnRUb3AgPT09IHMudG9wU3BhY2luZyAmJiBzLmN1cnJlbnRUb3AgPiBuZXdUb3AgfHwgcy5jdXJyZW50VG9wID09PSBudWxsICYmIG5ld1RvcCA8IHMudG9wU3BhY2luZykge1xyXG4gICAgICAgICAgICAgIC8vIGp1c3QgcmVhY2hlZCBib3R0b20gfHwganVzdCBzdGFydGVkIHRvIHN0aWNrIGJ1dCBib3R0b20gaXMgYWxyZWFkeSByZWFjaGVkXHJcbiAgICAgICAgICAgICAgcy5zdGlja3lFbGVtZW50LnRyaWdnZXIoJ3N0aWNreS1ib3R0b20tcmVhY2hlZCcsIFtzXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZihzLmN1cnJlbnRUb3AgIT09IG51bGwgJiYgbmV3VG9wID09PSBzLnRvcFNwYWNpbmcgJiYgcy5jdXJyZW50VG9wIDwgbmV3VG9wKSB7XHJcbiAgICAgICAgICAgICAgLy8gc3RpY2t5IGlzIHN0YXJ0ZWQgJiYgc3RpY2tlZCBhdCB0b3BTcGFjaW5nICYmIG92ZXJmbG93aW5nIGZyb20gdG9wIGp1c3QgZmluaXNoZWRcclxuICAgICAgICAgICAgICBzLnN0aWNreUVsZW1lbnQudHJpZ2dlcignc3RpY2t5LWJvdHRvbS11bnJlYWNoZWQnLCBbc10pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzLmN1cnJlbnRUb3AgPSBuZXdUb3A7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgc3RpY2t5IGhhcyByZWFjaGVkIGVuZCBvZiBjb250YWluZXIgYW5kIHN0b3Agc3RpY2tpbmdcclxuICAgICAgICAgIHZhciBzdGlja3lXcmFwcGVyQ29udGFpbmVyID0gcy5zdGlja3lXcmFwcGVyLnBhcmVudCgpO1xyXG4gICAgICAgICAgdmFyIHVuc3RpY2sgPSAocy5zdGlja3lFbGVtZW50Lm9mZnNldCgpLnRvcCArIHMuc3RpY2t5RWxlbWVudC5vdXRlckhlaWdodCgpID49IHN0aWNreVdyYXBwZXJDb250YWluZXIub2Zmc2V0KCkudG9wICsgc3RpY2t5V3JhcHBlckNvbnRhaW5lci5vdXRlckhlaWdodCgpKSAmJiAocy5zdGlja3lFbGVtZW50Lm9mZnNldCgpLnRvcCA8PSBzLnRvcFNwYWNpbmcpO1xyXG5cclxuICAgICAgICAgIGlmKCB1bnN0aWNrICkge1xyXG4gICAgICAgICAgICBzLnN0aWNreUVsZW1lbnRcclxuICAgICAgICAgICAgICAuY3NzKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgICAgICAgICAgLmNzcygndG9wJywgJycpXHJcbiAgICAgICAgICAgICAgLmNzcygnYm90dG9tJywgMClcclxuICAgICAgICAgICAgICAuY3NzKCd6LWluZGV4JywgJycpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcy5zdGlja3lFbGVtZW50XHJcbiAgICAgICAgICAgICAgLmNzcygncG9zaXRpb24nLCAnZml4ZWQnKVxyXG4gICAgICAgICAgICAgIC5jc3MoJ3RvcCcsIG5ld1RvcClcclxuICAgICAgICAgICAgICAuY3NzKCdib3R0b20nLCAnJylcclxuICAgICAgICAgICAgICAuY3NzKCd6LWluZGV4Jywgcy56SW5kZXgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHJlc2l6ZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgd2luZG93SGVpZ2h0ID0gJHdpbmRvdy5oZWlnaHQoKTtcclxuXHJcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3RpY2tlZC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICB2YXIgcyA9IHN0aWNrZWRbaV07XHJcbiAgICAgICAgdmFyIG5ld1dpZHRoID0gbnVsbDtcclxuICAgICAgICBpZiAocy5nZXRXaWR0aEZyb20pIHtcclxuICAgICAgICAgICAgaWYgKHMucmVzcG9uc2l2ZVdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9ICQocy5nZXRXaWR0aEZyb20pLndpZHRoKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYocy53aWR0aEZyb21XcmFwcGVyKSB7XHJcbiAgICAgICAgICAgIG5ld1dpZHRoID0gcy5zdGlja3lXcmFwcGVyLndpZHRoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuZXdXaWR0aCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHMuc3RpY2t5RWxlbWVudC5jc3MoJ3dpZHRoJywgbmV3V2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG1ldGhvZHMgPSB7XHJcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdmFyIG8gPSAkLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgdmFyIHN0aWNreUVsZW1lbnQgPSAkKHRoaXMpO1xyXG5cclxuICAgICAgICAgIHZhciBzdGlja3lJZCA9IHN0aWNreUVsZW1lbnQuYXR0cignaWQnKTtcclxuICAgICAgICAgIHZhciB3cmFwcGVySWQgPSBzdGlja3lJZCA/IHN0aWNreUlkICsgJy0nICsgZGVmYXVsdHMud3JhcHBlckNsYXNzTmFtZSA6IGRlZmF1bHRzLndyYXBwZXJDbGFzc05hbWU7XHJcbiAgICAgICAgICB2YXIgd3JhcHBlciA9ICQoJzxkaXY+PC9kaXY+JylcclxuICAgICAgICAgICAgLmF0dHIoJ2lkJywgd3JhcHBlcklkKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3Moby53cmFwcGVyQ2xhc3NOYW1lKTtcclxuXHJcbiAgICAgICAgICBzdGlja3lFbGVtZW50LndyYXBBbGwoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmICgkKHRoaXMpLnBhcmVudChcIiNcIiArIHdyYXBwZXJJZCkubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlcjtcclxuICAgICAgICAgICAgfVxyXG59KTtcclxuXHJcbiAgICAgICAgICB2YXIgc3RpY2t5V3JhcHBlciA9IHN0aWNreUVsZW1lbnQucGFyZW50KCk7XHJcblxyXG4gICAgICAgICAgaWYgKG8uY2VudGVyKSB7XHJcbiAgICAgICAgICAgIHN0aWNreVdyYXBwZXIuY3NzKHt3aWR0aDpzdGlja3lFbGVtZW50Lm91dGVyV2lkdGgoKSxtYXJnaW5MZWZ0OlwiYXV0b1wiLG1hcmdpblJpZ2h0OlwiYXV0b1wifSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHN0aWNreUVsZW1lbnQuY3NzKFwiZmxvYXRcIikgPT09IFwicmlnaHRcIikge1xyXG4gICAgICAgICAgICBzdGlja3lFbGVtZW50LmNzcyh7XCJmbG9hdFwiOlwibm9uZVwifSkucGFyZW50KCkuY3NzKHtcImZsb2F0XCI6XCJyaWdodFwifSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgby5zdGlja3lFbGVtZW50ID0gc3RpY2t5RWxlbWVudDtcclxuICAgICAgICAgIG8uc3RpY2t5V3JhcHBlciA9IHN0aWNreVdyYXBwZXI7XHJcbiAgICAgICAgICBvLmN1cnJlbnRUb3AgICAgPSBudWxsO1xyXG5cclxuICAgICAgICAgIHN0aWNrZWQucHVzaChvKTtcclxuXHJcbiAgICAgICAgICBtZXRob2RzLnNldFdyYXBwZXJIZWlnaHQodGhpcyk7XHJcbiAgICAgICAgICBtZXRob2RzLnNldHVwQ2hhbmdlTGlzdGVuZXJzKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgc2V0V3JhcHBlckhlaWdodDogZnVuY3Rpb24oc3RpY2t5RWxlbWVudCkge1xyXG4gICAgICAgIHZhciBlbGVtZW50ID0gJChzdGlja3lFbGVtZW50KTtcclxuICAgICAgICB2YXIgc3RpY2t5V3JhcHBlciA9IGVsZW1lbnQucGFyZW50KCk7XHJcbiAgICAgICAgaWYgKHN0aWNreVdyYXBwZXIpIHtcclxuICAgICAgICAgIHN0aWNreVdyYXBwZXIuY3NzKCdoZWlnaHQnLCBlbGVtZW50Lm91dGVySGVpZ2h0KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuXHJcbiAgICAgIHNldHVwQ2hhbmdlTGlzdGVuZXJzOiBmdW5jdGlvbihzdGlja3lFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKSB7XHJcbiAgICAgICAgICB2YXIgbXV0YXRpb25PYnNlcnZlciA9IG5ldyB3aW5kb3cuTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG11dGF0aW9uc1swXS5hZGRlZE5vZGVzLmxlbmd0aCB8fCBtdXRhdGlvbnNbMF0ucmVtb3ZlZE5vZGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIG1ldGhvZHMuc2V0V3JhcHBlckhlaWdodChzdGlja3lFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoc3RpY2t5RWxlbWVudCwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgc3RpY2t5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICBtZXRob2RzLnNldFdyYXBwZXJIZWlnaHQoc3RpY2t5RWxlbWVudCk7XHJcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcclxuICAgICAgICAgICAgc3RpY2t5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgIG1ldGhvZHMuc2V0V3JhcHBlckhlaWdodChzdGlja3lFbGVtZW50KTtcclxuICAgICAgICAgICAgfSwgZmFsc2UpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuYXR0YWNoRXZlbnQpIHtcclxuICAgICAgICAgICAgc3RpY2t5RWxlbWVudC5hdHRhY2hFdmVudCgnb25ET01Ob2RlSW5zZXJ0ZWQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICBtZXRob2RzLnNldFdyYXBwZXJIZWlnaHQoc3RpY2t5RWxlbWVudCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzdGlja3lFbGVtZW50LmF0dGFjaEV2ZW50KCdvbkRPTU5vZGVSZW1vdmVkJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgbWV0aG9kcy5zZXRXcmFwcGVySGVpZ2h0KHN0aWNreUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHVwZGF0ZTogc2Nyb2xsZXIsXHJcbiAgICAgIHVuc3RpY2s6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xyXG4gICAgICAgICAgdmFyIHVuc3RpY2t5RWxlbWVudCA9ICQodGhhdCk7XHJcblxyXG4gICAgICAgICAgdmFyIHJlbW92ZUlkeCA9IC0xO1xyXG4gICAgICAgICAgdmFyIGkgPSBzdGlja2VkLmxlbmd0aDtcclxuICAgICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGlja2VkW2ldLnN0aWNreUVsZW1lbnQuZ2V0KDApID09PSB0aGF0KSB7XHJcbiAgICAgICAgICAgICAgICBzcGxpY2UuY2FsbChzdGlja2VkLGksMSk7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVJZHggPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihyZW1vdmVJZHggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHVuc3RpY2t5RWxlbWVudC51bndyYXAoKTtcclxuICAgICAgICAgICAgdW5zdGlja3lFbGVtZW50XHJcbiAgICAgICAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAnd2lkdGgnOiAnJyxcclxuICAgICAgICAgICAgICAgICdwb3NpdGlvbic6ICcnLFxyXG4gICAgICAgICAgICAgICAgJ3RvcCc6ICcnLFxyXG4gICAgICAgICAgICAgICAgJ2Zsb2F0JzogJycsXHJcbiAgICAgICAgICAgICAgICAnei1pbmRleCc6ICcnXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAvLyBzaG91bGQgYmUgbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZyAkd2luZG93LnNjcm9sbChzY3JvbGxlcikgYW5kICR3aW5kb3cucmVzaXplKHJlc2l6ZXIpOlxyXG4gIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbGVyLCBmYWxzZSk7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplciwgZmFsc2UpO1xyXG4gIH0gZWxzZSBpZiAod2luZG93LmF0dGFjaEV2ZW50KSB7XHJcbiAgICB3aW5kb3cuYXR0YWNoRXZlbnQoJ29uc2Nyb2xsJywgc2Nyb2xsZXIpO1xyXG4gICAgd2luZG93LmF0dGFjaEV2ZW50KCdvbnJlc2l6ZScsIHJlc2l6ZXIpO1xyXG4gIH1cclxuXHJcbiAgJC5mbi5zdGlja3kgPSBmdW5jdGlvbihtZXRob2QpIHtcclxuICAgIGlmIChtZXRob2RzW21ldGhvZF0pIHtcclxuICAgICAgcmV0dXJuIG1ldGhvZHNbbWV0aG9kXS5hcHBseSh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0aG9kID09PSAnb2JqZWN0JyB8fCAhbWV0aG9kICkge1xyXG4gICAgICByZXR1cm4gbWV0aG9kcy5pbml0LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICQuZXJyb3IoJ01ldGhvZCAnICsgbWV0aG9kICsgJyBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuc3RpY2t5Jyk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgJC5mbi51bnN0aWNrID0gZnVuY3Rpb24obWV0aG9kKSB7XHJcbiAgICBpZiAobWV0aG9kc1ttZXRob2RdKSB7XHJcbiAgICAgIHJldHVybiBtZXRob2RzW21ldGhvZF0uYXBwbHkodGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ29iamVjdCcgfHwgIW1ldGhvZCApIHtcclxuICAgICAgcmV0dXJuIG1ldGhvZHMudW5zdGljay5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkLmVycm9yKCdNZXRob2QgJyArIG1ldGhvZCArICcgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LnN0aWNreScpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgJChmdW5jdGlvbigpIHtcclxuICAgIHNldFRpbWVvdXQoc2Nyb2xsZXIsIDApO1xyXG4gIH0pO1xyXG59KSk7XHJcbiIsIi8qIVxyXG4gKiBAZmlsZU92ZXJ2aWV3IFRvdWNoU3dpcGUgLSBqUXVlcnkgUGx1Z2luXHJcbiAqIEB2ZXJzaW9uIDEuNi4xOFxyXG4gKlxyXG4gKiBAYXV0aG9yIE1hdHQgQnJ5c29uIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9tYXR0YnJ5c29uXHJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hdHRicnlzb24vVG91Y2hTd2lwZS1KcXVlcnktUGx1Z2luXHJcbiAqIEBzZWUgaHR0cDovL2xhYnMucmFtcGludGVyYWN0aXZlLmNvLnVrL3RvdWNoU3dpcGUvXHJcbiAqIEBzZWUgaHR0cDovL3BsdWdpbnMuanF1ZXJ5LmNvbS9wcm9qZWN0L3RvdWNoU3dpcGVcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgTWF0dCBCcnlzb25cclxuICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuXHJcbiAqXHJcbiAqL1xyXG4hZnVuY3Rpb24oZmFjdG9yeSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeT9kZWZpbmUoW1wianF1ZXJ5XCJdLGZhY3RvcnkpOmZhY3RvcnkoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/cmVxdWlyZShcImpxdWVyeVwiKTpqUXVlcnkpfShmdW5jdGlvbigkKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpbml0KG9wdGlvbnMpe3JldHVybiFvcHRpb25zfHx2b2lkIDAhPT1vcHRpb25zLmFsbG93UGFnZVNjcm9sbHx8dm9pZCAwPT09b3B0aW9ucy5zd2lwZSYmdm9pZCAwPT09b3B0aW9ucy5zd2lwZVN0YXR1c3x8KG9wdGlvbnMuYWxsb3dQYWdlU2Nyb2xsPU5PTkUpLHZvaWQgMCE9PW9wdGlvbnMuY2xpY2smJnZvaWQgMD09PW9wdGlvbnMudGFwJiYob3B0aW9ucy50YXA9b3B0aW9ucy5jbGljayksb3B0aW9uc3x8KG9wdGlvbnM9e30pLG9wdGlvbnM9JC5leHRlbmQoe30sJC5mbi5zd2lwZS5kZWZhdWx0cyxvcHRpb25zKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHRoaXM9JCh0aGlzKSxwbHVnaW49JHRoaXMuZGF0YShQTFVHSU5fTlMpO3BsdWdpbnx8KHBsdWdpbj1uZXcgVG91Y2hTd2lwZSh0aGlzLG9wdGlvbnMpLCR0aGlzLmRhdGEoUExVR0lOX05TLHBsdWdpbikpfSl9ZnVuY3Rpb24gVG91Y2hTd2lwZShlbGVtZW50LG9wdGlvbnMpe2Z1bmN0aW9uIHRvdWNoU3RhcnQoanFFdmVudCl7aWYoIShnZXRUb3VjaEluUHJvZ3Jlc3MoKXx8JChqcUV2ZW50LnRhcmdldCkuY2xvc2VzdChvcHRpb25zLmV4Y2x1ZGVkRWxlbWVudHMsJGVsZW1lbnQpLmxlbmd0aD4wKSl7dmFyIGV2ZW50PWpxRXZlbnQub3JpZ2luYWxFdmVudD9qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ6anFFdmVudDtpZighZXZlbnQucG9pbnRlclR5cGV8fFwibW91c2VcIiE9ZXZlbnQucG9pbnRlclR5cGV8fDAhPW9wdGlvbnMuZmFsbGJhY2tUb01vdXNlRXZlbnRzKXt2YXIgcmV0LHRvdWNoZXM9ZXZlbnQudG91Y2hlcyxldnQ9dG91Y2hlcz90b3VjaGVzWzBdOmV2ZW50O3JldHVybiBwaGFzZT1QSEFTRV9TVEFSVCx0b3VjaGVzP2ZpbmdlckNvdW50PXRvdWNoZXMubGVuZ3RoOm9wdGlvbnMucHJldmVudERlZmF1bHRFdmVudHMhPT0hMSYmanFFdmVudC5wcmV2ZW50RGVmYXVsdCgpLGRpc3RhbmNlPTAsZGlyZWN0aW9uPW51bGwsY3VycmVudERpcmVjdGlvbj1udWxsLHBpbmNoRGlyZWN0aW9uPW51bGwsZHVyYXRpb249MCxzdGFydFRvdWNoZXNEaXN0YW5jZT0wLGVuZFRvdWNoZXNEaXN0YW5jZT0wLHBpbmNoWm9vbT0xLHBpbmNoRGlzdGFuY2U9MCxtYXhpbXVtc01hcD1jcmVhdGVNYXhpbXVtc0RhdGEoKSxjYW5jZWxNdWx0aUZpbmdlclJlbGVhc2UoKSxjcmVhdGVGaW5nZXJEYXRhKDAsZXZ0KSwhdG91Y2hlc3x8ZmluZ2VyQ291bnQ9PT1vcHRpb25zLmZpbmdlcnN8fG9wdGlvbnMuZmluZ2Vycz09PUFMTF9GSU5HRVJTfHxoYXNQaW5jaGVzKCk/KHN0YXJ0VGltZT1nZXRUaW1lU3RhbXAoKSwyPT1maW5nZXJDb3VudCYmKGNyZWF0ZUZpbmdlckRhdGEoMSx0b3VjaGVzWzFdKSxzdGFydFRvdWNoZXNEaXN0YW5jZT1lbmRUb3VjaGVzRGlzdGFuY2U9Y2FsY3VsYXRlVG91Y2hlc0Rpc3RhbmNlKGZpbmdlckRhdGFbMF0uc3RhcnQsZmluZ2VyRGF0YVsxXS5zdGFydCkpLChvcHRpb25zLnN3aXBlU3RhdHVzfHxvcHRpb25zLnBpbmNoU3RhdHVzKSYmKHJldD10cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpKTpyZXQ9ITEscmV0PT09ITE/KHBoYXNlPVBIQVNFX0NBTkNFTCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkscmV0KToob3B0aW9ucy5ob2xkJiYoaG9sZFRpbWVvdXQ9c2V0VGltZW91dCgkLnByb3h5KGZ1bmN0aW9uKCl7JGVsZW1lbnQudHJpZ2dlcihcImhvbGRcIixbZXZlbnQudGFyZ2V0XSksb3B0aW9ucy5ob2xkJiYocmV0PW9wdGlvbnMuaG9sZC5jYWxsKCRlbGVtZW50LGV2ZW50LGV2ZW50LnRhcmdldCkpfSx0aGlzKSxvcHRpb25zLmxvbmdUYXBUaHJlc2hvbGQpKSxzZXRUb3VjaEluUHJvZ3Jlc3MoITApLG51bGwpfX19ZnVuY3Rpb24gdG91Y2hNb3ZlKGpxRXZlbnQpe3ZhciBldmVudD1qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ/anFFdmVudC5vcmlnaW5hbEV2ZW50OmpxRXZlbnQ7aWYocGhhc2UhPT1QSEFTRV9FTkQmJnBoYXNlIT09UEhBU0VfQ0FOQ0VMJiYhaW5NdWx0aUZpbmdlclJlbGVhc2UoKSl7dmFyIHJldCx0b3VjaGVzPWV2ZW50LnRvdWNoZXMsZXZ0PXRvdWNoZXM/dG91Y2hlc1swXTpldmVudCxjdXJyZW50RmluZ2VyPXVwZGF0ZUZpbmdlckRhdGEoZXZ0KTtpZihlbmRUaW1lPWdldFRpbWVTdGFtcCgpLHRvdWNoZXMmJihmaW5nZXJDb3VudD10b3VjaGVzLmxlbmd0aCksb3B0aW9ucy5ob2xkJiZjbGVhclRpbWVvdXQoaG9sZFRpbWVvdXQpLHBoYXNlPVBIQVNFX01PVkUsMj09ZmluZ2VyQ291bnQmJigwPT1zdGFydFRvdWNoZXNEaXN0YW5jZT8oY3JlYXRlRmluZ2VyRGF0YSgxLHRvdWNoZXNbMV0pLHN0YXJ0VG91Y2hlc0Rpc3RhbmNlPWVuZFRvdWNoZXNEaXN0YW5jZT1jYWxjdWxhdGVUb3VjaGVzRGlzdGFuY2UoZmluZ2VyRGF0YVswXS5zdGFydCxmaW5nZXJEYXRhWzFdLnN0YXJ0KSk6KHVwZGF0ZUZpbmdlckRhdGEodG91Y2hlc1sxXSksZW5kVG91Y2hlc0Rpc3RhbmNlPWNhbGN1bGF0ZVRvdWNoZXNEaXN0YW5jZShmaW5nZXJEYXRhWzBdLmVuZCxmaW5nZXJEYXRhWzFdLmVuZCkscGluY2hEaXJlY3Rpb249Y2FsY3VsYXRlUGluY2hEaXJlY3Rpb24oZmluZ2VyRGF0YVswXS5lbmQsZmluZ2VyRGF0YVsxXS5lbmQpKSxwaW5jaFpvb209Y2FsY3VsYXRlUGluY2hab29tKHN0YXJ0VG91Y2hlc0Rpc3RhbmNlLGVuZFRvdWNoZXNEaXN0YW5jZSkscGluY2hEaXN0YW5jZT1NYXRoLmFicyhzdGFydFRvdWNoZXNEaXN0YW5jZS1lbmRUb3VjaGVzRGlzdGFuY2UpKSxmaW5nZXJDb3VudD09PW9wdGlvbnMuZmluZ2Vyc3x8b3B0aW9ucy5maW5nZXJzPT09QUxMX0ZJTkdFUlN8fCF0b3VjaGVzfHxoYXNQaW5jaGVzKCkpe2lmKGRpcmVjdGlvbj1jYWxjdWxhdGVEaXJlY3Rpb24oY3VycmVudEZpbmdlci5zdGFydCxjdXJyZW50RmluZ2VyLmVuZCksY3VycmVudERpcmVjdGlvbj1jYWxjdWxhdGVEaXJlY3Rpb24oY3VycmVudEZpbmdlci5sYXN0LGN1cnJlbnRGaW5nZXIuZW5kKSx2YWxpZGF0ZURlZmF1bHRFdmVudChqcUV2ZW50LGN1cnJlbnREaXJlY3Rpb24pLGRpc3RhbmNlPWNhbGN1bGF0ZURpc3RhbmNlKGN1cnJlbnRGaW5nZXIuc3RhcnQsY3VycmVudEZpbmdlci5lbmQpLGR1cmF0aW9uPWNhbGN1bGF0ZUR1cmF0aW9uKCksc2V0TWF4RGlzdGFuY2UoZGlyZWN0aW9uLGRpc3RhbmNlKSxyZXQ9dHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpLCFvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kfHxvcHRpb25zLnRyaWdnZXJPblRvdWNoTGVhdmUpe3ZhciBpbkJvdW5kcz0hMDtpZihvcHRpb25zLnRyaWdnZXJPblRvdWNoTGVhdmUpe3ZhciBib3VuZHM9Z2V0Ym91bmRzKHRoaXMpO2luQm91bmRzPWlzSW5Cb3VuZHMoY3VycmVudEZpbmdlci5lbmQsYm91bmRzKX0hb3B0aW9ucy50cmlnZ2VyT25Ub3VjaEVuZCYmaW5Cb3VuZHM/cGhhc2U9Z2V0TmV4dFBoYXNlKFBIQVNFX01PVkUpOm9wdGlvbnMudHJpZ2dlck9uVG91Y2hMZWF2ZSYmIWluQm91bmRzJiYocGhhc2U9Z2V0TmV4dFBoYXNlKFBIQVNFX0VORCkpLHBoYXNlIT1QSEFTRV9DQU5DRUwmJnBoYXNlIT1QSEFTRV9FTkR8fHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKX19ZWxzZSBwaGFzZT1QSEFTRV9DQU5DRUwsdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpO3JldD09PSExJiYocGhhc2U9UEhBU0VfQ0FOQ0VMLHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKSl9fWZ1bmN0aW9uIHRvdWNoRW5kKGpxRXZlbnQpe3ZhciBldmVudD1qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ/anFFdmVudC5vcmlnaW5hbEV2ZW50OmpxRXZlbnQsdG91Y2hlcz1ldmVudC50b3VjaGVzO2lmKHRvdWNoZXMpe2lmKHRvdWNoZXMubGVuZ3RoJiYhaW5NdWx0aUZpbmdlclJlbGVhc2UoKSlyZXR1cm4gc3RhcnRNdWx0aUZpbmdlclJlbGVhc2UoZXZlbnQpLCEwO2lmKHRvdWNoZXMubGVuZ3RoJiZpbk11bHRpRmluZ2VyUmVsZWFzZSgpKXJldHVybiEwfXJldHVybiBpbk11bHRpRmluZ2VyUmVsZWFzZSgpJiYoZmluZ2VyQ291bnQ9ZmluZ2VyQ291bnRBdFJlbGVhc2UpLGVuZFRpbWU9Z2V0VGltZVN0YW1wKCksZHVyYXRpb249Y2FsY3VsYXRlRHVyYXRpb24oKSxkaWRTd2lwZUJhY2tUb0NhbmNlbCgpfHwhdmFsaWRhdGVTd2lwZURpc3RhbmNlKCk/KHBoYXNlPVBIQVNFX0NBTkNFTCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpOm9wdGlvbnMudHJpZ2dlck9uVG91Y2hFbmR8fG9wdGlvbnMudHJpZ2dlck9uVG91Y2hFbmQ9PT0hMSYmcGhhc2U9PT1QSEFTRV9NT1ZFPyhvcHRpb25zLnByZXZlbnREZWZhdWx0RXZlbnRzIT09ITEmJmpxRXZlbnQuY2FuY2VsYWJsZSE9PSExJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCkscGhhc2U9UEhBU0VfRU5ELHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKSk6IW9wdGlvbnMudHJpZ2dlck9uVG91Y2hFbmQmJmhhc1RhcCgpPyhwaGFzZT1QSEFTRV9FTkQsdHJpZ2dlckhhbmRsZXJGb3JHZXN0dXJlKGV2ZW50LHBoYXNlLFRBUCkpOnBoYXNlPT09UEhBU0VfTU9WRSYmKHBoYXNlPVBIQVNFX0NBTkNFTCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpLHNldFRvdWNoSW5Qcm9ncmVzcyghMSksbnVsbH1mdW5jdGlvbiB0b3VjaENhbmNlbCgpe2ZpbmdlckNvdW50PTAsZW5kVGltZT0wLHN0YXJ0VGltZT0wLHN0YXJ0VG91Y2hlc0Rpc3RhbmNlPTAsZW5kVG91Y2hlc0Rpc3RhbmNlPTAscGluY2hab29tPTEsY2FuY2VsTXVsdGlGaW5nZXJSZWxlYXNlKCksc2V0VG91Y2hJblByb2dyZXNzKCExKX1mdW5jdGlvbiB0b3VjaExlYXZlKGpxRXZlbnQpe3ZhciBldmVudD1qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ/anFFdmVudC5vcmlnaW5hbEV2ZW50OmpxRXZlbnQ7b3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlJiYocGhhc2U9Z2V0TmV4dFBoYXNlKFBIQVNFX0VORCksdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpKX1mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKXskZWxlbWVudC51bmJpbmQoU1RBUlRfRVYsdG91Y2hTdGFydCksJGVsZW1lbnQudW5iaW5kKENBTkNFTF9FVix0b3VjaENhbmNlbCksJGVsZW1lbnQudW5iaW5kKE1PVkVfRVYsdG91Y2hNb3ZlKSwkZWxlbWVudC51bmJpbmQoRU5EX0VWLHRvdWNoRW5kKSxMRUFWRV9FViYmJGVsZW1lbnQudW5iaW5kKExFQVZFX0VWLHRvdWNoTGVhdmUpLHNldFRvdWNoSW5Qcm9ncmVzcyghMSl9ZnVuY3Rpb24gZ2V0TmV4dFBoYXNlKGN1cnJlbnRQaGFzZSl7dmFyIG5leHRQaGFzZT1jdXJyZW50UGhhc2UsdmFsaWRUaW1lPXZhbGlkYXRlU3dpcGVUaW1lKCksdmFsaWREaXN0YW5jZT12YWxpZGF0ZVN3aXBlRGlzdGFuY2UoKSxkaWRDYW5jZWw9ZGlkU3dpcGVCYWNrVG9DYW5jZWwoKTtyZXR1cm4hdmFsaWRUaW1lfHxkaWRDYW5jZWw/bmV4dFBoYXNlPVBIQVNFX0NBTkNFTDohdmFsaWREaXN0YW5jZXx8Y3VycmVudFBoYXNlIT1QSEFTRV9NT1ZFfHxvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kJiYhb3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlPyF2YWxpZERpc3RhbmNlJiZjdXJyZW50UGhhc2U9PVBIQVNFX0VORCYmb3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlJiYobmV4dFBoYXNlPVBIQVNFX0NBTkNFTCk6bmV4dFBoYXNlPVBIQVNFX0VORCxuZXh0UGhhc2V9ZnVuY3Rpb24gdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2Upe3ZhciByZXQsdG91Y2hlcz1ldmVudC50b3VjaGVzO3JldHVybihkaWRTd2lwZSgpfHxoYXNTd2lwZXMoKSkmJihyZXQ9dHJpZ2dlckhhbmRsZXJGb3JHZXN0dXJlKGV2ZW50LHBoYXNlLFNXSVBFKSksKGRpZFBpbmNoKCl8fGhhc1BpbmNoZXMoKSkmJnJldCE9PSExJiYocmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxQSU5DSCkpLGRpZERvdWJsZVRhcCgpJiZyZXQhPT0hMT9yZXQ9dHJpZ2dlckhhbmRsZXJGb3JHZXN0dXJlKGV2ZW50LHBoYXNlLERPVUJMRV9UQVApOmRpZExvbmdUYXAoKSYmcmV0IT09ITE/cmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxMT05HX1RBUCk6ZGlkVGFwKCkmJnJldCE9PSExJiYocmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxUQVApKSxwaGFzZT09PVBIQVNFX0NBTkNFTCYmdG91Y2hDYW5jZWwoZXZlbnQpLHBoYXNlPT09UEhBU0VfRU5EJiYodG91Y2hlcz90b3VjaGVzLmxlbmd0aHx8dG91Y2hDYW5jZWwoZXZlbnQpOnRvdWNoQ2FuY2VsKGV2ZW50KSkscmV0fWZ1bmN0aW9uIHRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxnZXN0dXJlKXt2YXIgcmV0O2lmKGdlc3R1cmU9PVNXSVBFKXtpZigkZWxlbWVudC50cmlnZ2VyKFwic3dpcGVTdGF0dXNcIixbcGhhc2UsZGlyZWN0aW9ufHxudWxsLGRpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbl0pLG9wdGlvbnMuc3dpcGVTdGF0dXMmJihyZXQ9b3B0aW9ucy5zd2lwZVN0YXR1cy5jYWxsKCRlbGVtZW50LGV2ZW50LHBoYXNlLGRpcmVjdGlvbnx8bnVsbCxkaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pLHJldD09PSExKSlyZXR1cm4hMTtpZihwaGFzZT09UEhBU0VfRU5EJiZ2YWxpZGF0ZVN3aXBlKCkpe2lmKGNsZWFyVGltZW91dChzaW5nbGVUYXBUaW1lb3V0KSxjbGVhclRpbWVvdXQoaG9sZFRpbWVvdXQpLCRlbGVtZW50LnRyaWdnZXIoXCJzd2lwZVwiLFtkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uXSksb3B0aW9ucy5zd2lwZSYmKHJldD1vcHRpb25zLnN3aXBlLmNhbGwoJGVsZW1lbnQsZXZlbnQsZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbikscmV0PT09ITEpKXJldHVybiExO3N3aXRjaChkaXJlY3Rpb24pe2Nhc2UgTEVGVDokZWxlbWVudC50cmlnZ2VyKFwic3dpcGVMZWZ0XCIsW2RpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlTGVmdCYmKHJldD1vcHRpb25zLnN3aXBlTGVmdC5jYWxsKCRlbGVtZW50LGV2ZW50LGRpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pKTticmVhaztjYXNlIFJJR0hUOiRlbGVtZW50LnRyaWdnZXIoXCJzd2lwZVJpZ2h0XCIsW2RpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlUmlnaHQmJihyZXQ9b3B0aW9ucy5zd2lwZVJpZ2h0LmNhbGwoJGVsZW1lbnQsZXZlbnQsZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbikpO2JyZWFrO2Nhc2UgVVA6JGVsZW1lbnQudHJpZ2dlcihcInN3aXBlVXBcIixbZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbl0pLG9wdGlvbnMuc3dpcGVVcCYmKHJldD1vcHRpb25zLnN3aXBlVXAuY2FsbCgkZWxlbWVudCxldmVudCxkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uKSk7YnJlYWs7Y2FzZSBET1dOOiRlbGVtZW50LnRyaWdnZXIoXCJzd2lwZURvd25cIixbZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbl0pLG9wdGlvbnMuc3dpcGVEb3duJiYocmV0PW9wdGlvbnMuc3dpcGVEb3duLmNhbGwoJGVsZW1lbnQsZXZlbnQsZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbikpfX19aWYoZ2VzdHVyZT09UElOQ0gpe2lmKCRlbGVtZW50LnRyaWdnZXIoXCJwaW5jaFN0YXR1c1wiLFtwaGFzZSxwaW5jaERpcmVjdGlvbnx8bnVsbCxwaW5jaERpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LHBpbmNoWm9vbSxmaW5nZXJEYXRhXSksb3B0aW9ucy5waW5jaFN0YXR1cyYmKHJldD1vcHRpb25zLnBpbmNoU3RhdHVzLmNhbGwoJGVsZW1lbnQsZXZlbnQscGhhc2UscGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YSkscmV0PT09ITEpKXJldHVybiExO2lmKHBoYXNlPT1QSEFTRV9FTkQmJnZhbGlkYXRlUGluY2goKSlzd2l0Y2gocGluY2hEaXJlY3Rpb24pe2Nhc2UgSU46JGVsZW1lbnQudHJpZ2dlcihcInBpbmNoSW5cIixbcGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YV0pLG9wdGlvbnMucGluY2hJbiYmKHJldD1vcHRpb25zLnBpbmNoSW4uY2FsbCgkZWxlbWVudCxldmVudCxwaW5jaERpcmVjdGlvbnx8bnVsbCxwaW5jaERpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LHBpbmNoWm9vbSxmaW5nZXJEYXRhKSk7YnJlYWs7Y2FzZSBPVVQ6JGVsZW1lbnQudHJpZ2dlcihcInBpbmNoT3V0XCIsW3BpbmNoRGlyZWN0aW9ufHxudWxsLHBpbmNoRGlzdGFuY2V8fDAsZHVyYXRpb258fDAsZmluZ2VyQ291bnQscGluY2hab29tLGZpbmdlckRhdGFdKSxvcHRpb25zLnBpbmNoT3V0JiYocmV0PW9wdGlvbnMucGluY2hPdXQuY2FsbCgkZWxlbWVudCxldmVudCxwaW5jaERpcmVjdGlvbnx8bnVsbCxwaW5jaERpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LHBpbmNoWm9vbSxmaW5nZXJEYXRhKSl9fXJldHVybiBnZXN0dXJlPT1UQVA/cGhhc2UhPT1QSEFTRV9DQU5DRUwmJnBoYXNlIT09UEhBU0VfRU5EfHwoY2xlYXJUaW1lb3V0KHNpbmdsZVRhcFRpbWVvdXQpLGNsZWFyVGltZW91dChob2xkVGltZW91dCksaGFzRG91YmxlVGFwKCkmJiFpbkRvdWJsZVRhcCgpPyhkb3VibGVUYXBTdGFydFRpbWU9Z2V0VGltZVN0YW1wKCksc2luZ2xlVGFwVGltZW91dD1zZXRUaW1lb3V0KCQucHJveHkoZnVuY3Rpb24oKXtkb3VibGVUYXBTdGFydFRpbWU9bnVsbCwkZWxlbWVudC50cmlnZ2VyKFwidGFwXCIsW2V2ZW50LnRhcmdldF0pLG9wdGlvbnMudGFwJiYocmV0PW9wdGlvbnMudGFwLmNhbGwoJGVsZW1lbnQsZXZlbnQsZXZlbnQudGFyZ2V0KSl9LHRoaXMpLG9wdGlvbnMuZG91YmxlVGFwVGhyZXNob2xkKSk6KGRvdWJsZVRhcFN0YXJ0VGltZT1udWxsLCRlbGVtZW50LnRyaWdnZXIoXCJ0YXBcIixbZXZlbnQudGFyZ2V0XSksb3B0aW9ucy50YXAmJihyZXQ9b3B0aW9ucy50YXAuY2FsbCgkZWxlbWVudCxldmVudCxldmVudC50YXJnZXQpKSkpOmdlc3R1cmU9PURPVUJMRV9UQVA/cGhhc2UhPT1QSEFTRV9DQU5DRUwmJnBoYXNlIT09UEhBU0VfRU5EfHwoY2xlYXJUaW1lb3V0KHNpbmdsZVRhcFRpbWVvdXQpLGNsZWFyVGltZW91dChob2xkVGltZW91dCksZG91YmxlVGFwU3RhcnRUaW1lPW51bGwsJGVsZW1lbnQudHJpZ2dlcihcImRvdWJsZXRhcFwiLFtldmVudC50YXJnZXRdKSxvcHRpb25zLmRvdWJsZVRhcCYmKHJldD1vcHRpb25zLmRvdWJsZVRhcC5jYWxsKCRlbGVtZW50LGV2ZW50LGV2ZW50LnRhcmdldCkpKTpnZXN0dXJlPT1MT05HX1RBUCYmKHBoYXNlIT09UEhBU0VfQ0FOQ0VMJiZwaGFzZSE9PVBIQVNFX0VORHx8KGNsZWFyVGltZW91dChzaW5nbGVUYXBUaW1lb3V0KSxkb3VibGVUYXBTdGFydFRpbWU9bnVsbCwkZWxlbWVudC50cmlnZ2VyKFwibG9uZ3RhcFwiLFtldmVudC50YXJnZXRdKSxvcHRpb25zLmxvbmdUYXAmJihyZXQ9b3B0aW9ucy5sb25nVGFwLmNhbGwoJGVsZW1lbnQsZXZlbnQsZXZlbnQudGFyZ2V0KSkpKSxyZXR9ZnVuY3Rpb24gdmFsaWRhdGVTd2lwZURpc3RhbmNlKCl7dmFyIHZhbGlkPSEwO3JldHVybiBudWxsIT09b3B0aW9ucy50aHJlc2hvbGQmJih2YWxpZD1kaXN0YW5jZT49b3B0aW9ucy50aHJlc2hvbGQpLHZhbGlkfWZ1bmN0aW9uIGRpZFN3aXBlQmFja1RvQ2FuY2VsKCl7dmFyIGNhbmNlbGxlZD0hMTtyZXR1cm4gbnVsbCE9PW9wdGlvbnMuY2FuY2VsVGhyZXNob2xkJiZudWxsIT09ZGlyZWN0aW9uJiYoY2FuY2VsbGVkPWdldE1heERpc3RhbmNlKGRpcmVjdGlvbiktZGlzdGFuY2U+PW9wdGlvbnMuY2FuY2VsVGhyZXNob2xkKSxjYW5jZWxsZWR9ZnVuY3Rpb24gdmFsaWRhdGVQaW5jaERpc3RhbmNlKCl7cmV0dXJuIG51bGw9PT1vcHRpb25zLnBpbmNoVGhyZXNob2xkfHxwaW5jaERpc3RhbmNlPj1vcHRpb25zLnBpbmNoVGhyZXNob2xkfWZ1bmN0aW9uIHZhbGlkYXRlU3dpcGVUaW1lKCl7dmFyIHJlc3VsdDtyZXR1cm4gcmVzdWx0PSFvcHRpb25zLm1heFRpbWVUaHJlc2hvbGR8fCEoZHVyYXRpb24+PW9wdGlvbnMubWF4VGltZVRocmVzaG9sZCl9ZnVuY3Rpb24gdmFsaWRhdGVEZWZhdWx0RXZlbnQoanFFdmVudCxkaXJlY3Rpb24pe2lmKG9wdGlvbnMucHJldmVudERlZmF1bHRFdmVudHMhPT0hMSlpZihvcHRpb25zLmFsbG93UGFnZVNjcm9sbD09PU5PTkUpanFFdmVudC5wcmV2ZW50RGVmYXVsdCgpO2Vsc2V7dmFyIGF1dG89b3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGw9PT1BVVRPO3N3aXRjaChkaXJlY3Rpb24pe2Nhc2UgTEVGVDoob3B0aW9ucy5zd2lwZUxlZnQmJmF1dG98fCFhdXRvJiZvcHRpb25zLmFsbG93UGFnZVNjcm9sbCE9SE9SSVpPTlRBTCkmJmpxRXZlbnQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIFJJR0hUOihvcHRpb25zLnN3aXBlUmlnaHQmJmF1dG98fCFhdXRvJiZvcHRpb25zLmFsbG93UGFnZVNjcm9sbCE9SE9SSVpPTlRBTCkmJmpxRXZlbnQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIFVQOihvcHRpb25zLnN3aXBlVXAmJmF1dG98fCFhdXRvJiZvcHRpb25zLmFsbG93UGFnZVNjcm9sbCE9VkVSVElDQUwpJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBET1dOOihvcHRpb25zLnN3aXBlRG93biYmYXV0b3x8IWF1dG8mJm9wdGlvbnMuYWxsb3dQYWdlU2Nyb2xsIT1WRVJUSUNBTCkmJmpxRXZlbnQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIE5PTkU6fX19ZnVuY3Rpb24gdmFsaWRhdGVQaW5jaCgpe3ZhciBoYXNDb3JyZWN0RmluZ2VyQ291bnQ9dmFsaWRhdGVGaW5nZXJzKCksaGFzRW5kUG9pbnQ9dmFsaWRhdGVFbmRQb2ludCgpLGhhc0NvcnJlY3REaXN0YW5jZT12YWxpZGF0ZVBpbmNoRGlzdGFuY2UoKTtyZXR1cm4gaGFzQ29ycmVjdEZpbmdlckNvdW50JiZoYXNFbmRQb2ludCYmaGFzQ29ycmVjdERpc3RhbmNlfWZ1bmN0aW9uIGhhc1BpbmNoZXMoKXtyZXR1cm4hIShvcHRpb25zLnBpbmNoU3RhdHVzfHxvcHRpb25zLnBpbmNoSW58fG9wdGlvbnMucGluY2hPdXQpfWZ1bmN0aW9uIGRpZFBpbmNoKCl7cmV0dXJuISghdmFsaWRhdGVQaW5jaCgpfHwhaGFzUGluY2hlcygpKX1mdW5jdGlvbiB2YWxpZGF0ZVN3aXBlKCl7dmFyIGhhc1ZhbGlkVGltZT12YWxpZGF0ZVN3aXBlVGltZSgpLGhhc1ZhbGlkRGlzdGFuY2U9dmFsaWRhdGVTd2lwZURpc3RhbmNlKCksaGFzQ29ycmVjdEZpbmdlckNvdW50PXZhbGlkYXRlRmluZ2VycygpLGhhc0VuZFBvaW50PXZhbGlkYXRlRW5kUG9pbnQoKSxkaWRDYW5jZWw9ZGlkU3dpcGVCYWNrVG9DYW5jZWwoKSx2YWxpZD0hZGlkQ2FuY2VsJiZoYXNFbmRQb2ludCYmaGFzQ29ycmVjdEZpbmdlckNvdW50JiZoYXNWYWxpZERpc3RhbmNlJiZoYXNWYWxpZFRpbWU7cmV0dXJuIHZhbGlkfWZ1bmN0aW9uIGhhc1N3aXBlcygpe3JldHVybiEhKG9wdGlvbnMuc3dpcGV8fG9wdGlvbnMuc3dpcGVTdGF0dXN8fG9wdGlvbnMuc3dpcGVMZWZ0fHxvcHRpb25zLnN3aXBlUmlnaHR8fG9wdGlvbnMuc3dpcGVVcHx8b3B0aW9ucy5zd2lwZURvd24pfWZ1bmN0aW9uIGRpZFN3aXBlKCl7cmV0dXJuISghdmFsaWRhdGVTd2lwZSgpfHwhaGFzU3dpcGVzKCkpfWZ1bmN0aW9uIHZhbGlkYXRlRmluZ2Vycygpe3JldHVybiBmaW5nZXJDb3VudD09PW9wdGlvbnMuZmluZ2Vyc3x8b3B0aW9ucy5maW5nZXJzPT09QUxMX0ZJTkdFUlN8fCFTVVBQT1JUU19UT1VDSH1mdW5jdGlvbiB2YWxpZGF0ZUVuZFBvaW50KCl7cmV0dXJuIDAhPT1maW5nZXJEYXRhWzBdLmVuZC54fWZ1bmN0aW9uIGhhc1RhcCgpe3JldHVybiEhb3B0aW9ucy50YXB9ZnVuY3Rpb24gaGFzRG91YmxlVGFwKCl7cmV0dXJuISFvcHRpb25zLmRvdWJsZVRhcH1mdW5jdGlvbiBoYXNMb25nVGFwKCl7cmV0dXJuISFvcHRpb25zLmxvbmdUYXB9ZnVuY3Rpb24gdmFsaWRhdGVEb3VibGVUYXAoKXtpZihudWxsPT1kb3VibGVUYXBTdGFydFRpbWUpcmV0dXJuITE7dmFyIG5vdz1nZXRUaW1lU3RhbXAoKTtyZXR1cm4gaGFzRG91YmxlVGFwKCkmJm5vdy1kb3VibGVUYXBTdGFydFRpbWU8PW9wdGlvbnMuZG91YmxlVGFwVGhyZXNob2xkfWZ1bmN0aW9uIGluRG91YmxlVGFwKCl7cmV0dXJuIHZhbGlkYXRlRG91YmxlVGFwKCl9ZnVuY3Rpb24gdmFsaWRhdGVUYXAoKXtyZXR1cm4oMT09PWZpbmdlckNvdW50fHwhU1VQUE9SVFNfVE9VQ0gpJiYoaXNOYU4oZGlzdGFuY2UpfHxkaXN0YW5jZTxvcHRpb25zLnRocmVzaG9sZCl9ZnVuY3Rpb24gdmFsaWRhdGVMb25nVGFwKCl7cmV0dXJuIGR1cmF0aW9uPm9wdGlvbnMubG9uZ1RhcFRocmVzaG9sZCYmZGlzdGFuY2U8RE9VQkxFX1RBUF9USFJFU0hPTER9ZnVuY3Rpb24gZGlkVGFwKCl7cmV0dXJuISghdmFsaWRhdGVUYXAoKXx8IWhhc1RhcCgpKX1mdW5jdGlvbiBkaWREb3VibGVUYXAoKXtyZXR1cm4hKCF2YWxpZGF0ZURvdWJsZVRhcCgpfHwhaGFzRG91YmxlVGFwKCkpfWZ1bmN0aW9uIGRpZExvbmdUYXAoKXtyZXR1cm4hKCF2YWxpZGF0ZUxvbmdUYXAoKXx8IWhhc0xvbmdUYXAoKSl9ZnVuY3Rpb24gc3RhcnRNdWx0aUZpbmdlclJlbGVhc2UoZXZlbnQpe3ByZXZpb3VzVG91Y2hFbmRUaW1lPWdldFRpbWVTdGFtcCgpLGZpbmdlckNvdW50QXRSZWxlYXNlPWV2ZW50LnRvdWNoZXMubGVuZ3RoKzF9ZnVuY3Rpb24gY2FuY2VsTXVsdGlGaW5nZXJSZWxlYXNlKCl7cHJldmlvdXNUb3VjaEVuZFRpbWU9MCxmaW5nZXJDb3VudEF0UmVsZWFzZT0wfWZ1bmN0aW9uIGluTXVsdGlGaW5nZXJSZWxlYXNlKCl7dmFyIHdpdGhpblRocmVzaG9sZD0hMTtpZihwcmV2aW91c1RvdWNoRW5kVGltZSl7dmFyIGRpZmY9Z2V0VGltZVN0YW1wKCktcHJldmlvdXNUb3VjaEVuZFRpbWU7ZGlmZjw9b3B0aW9ucy5maW5nZXJSZWxlYXNlVGhyZXNob2xkJiYod2l0aGluVGhyZXNob2xkPSEwKX1yZXR1cm4gd2l0aGluVGhyZXNob2xkfWZ1bmN0aW9uIGdldFRvdWNoSW5Qcm9ncmVzcygpe3JldHVybiEoJGVsZW1lbnQuZGF0YShQTFVHSU5fTlMrXCJfaW50b3VjaFwiKSE9PSEwKX1mdW5jdGlvbiBzZXRUb3VjaEluUHJvZ3Jlc3ModmFsKXskZWxlbWVudCYmKHZhbD09PSEwPygkZWxlbWVudC5iaW5kKE1PVkVfRVYsdG91Y2hNb3ZlKSwkZWxlbWVudC5iaW5kKEVORF9FVix0b3VjaEVuZCksTEVBVkVfRVYmJiRlbGVtZW50LmJpbmQoTEVBVkVfRVYsdG91Y2hMZWF2ZSkpOigkZWxlbWVudC51bmJpbmQoTU9WRV9FVix0b3VjaE1vdmUsITEpLCRlbGVtZW50LnVuYmluZChFTkRfRVYsdG91Y2hFbmQsITEpLExFQVZFX0VWJiYkZWxlbWVudC51bmJpbmQoTEVBVkVfRVYsdG91Y2hMZWF2ZSwhMSkpLCRlbGVtZW50LmRhdGEoUExVR0lOX05TK1wiX2ludG91Y2hcIix2YWw9PT0hMCkpfWZ1bmN0aW9uIGNyZWF0ZUZpbmdlckRhdGEoaWQsZXZ0KXt2YXIgZj17c3RhcnQ6e3g6MCx5OjB9LGxhc3Q6e3g6MCx5OjB9LGVuZDp7eDowLHk6MH19O3JldHVybiBmLnN0YXJ0Lng9Zi5sYXN0Lng9Zi5lbmQueD1ldnQucGFnZVh8fGV2dC5jbGllbnRYLGYuc3RhcnQueT1mLmxhc3QueT1mLmVuZC55PWV2dC5wYWdlWXx8ZXZ0LmNsaWVudFksZmluZ2VyRGF0YVtpZF09ZixmfWZ1bmN0aW9uIHVwZGF0ZUZpbmdlckRhdGEoZXZ0KXt2YXIgaWQ9dm9pZCAwIT09ZXZ0LmlkZW50aWZpZXI/ZXZ0LmlkZW50aWZpZXI6MCxmPWdldEZpbmdlckRhdGEoaWQpO3JldHVybiBudWxsPT09ZiYmKGY9Y3JlYXRlRmluZ2VyRGF0YShpZCxldnQpKSxmLmxhc3QueD1mLmVuZC54LGYubGFzdC55PWYuZW5kLnksZi5lbmQueD1ldnQucGFnZVh8fGV2dC5jbGllbnRYLGYuZW5kLnk9ZXZ0LnBhZ2VZfHxldnQuY2xpZW50WSxmfWZ1bmN0aW9uIGdldEZpbmdlckRhdGEoaWQpe3JldHVybiBmaW5nZXJEYXRhW2lkXXx8bnVsbH1mdW5jdGlvbiBzZXRNYXhEaXN0YW5jZShkaXJlY3Rpb24sZGlzdGFuY2Upe2RpcmVjdGlvbiE9Tk9ORSYmKGRpc3RhbmNlPU1hdGgubWF4KGRpc3RhbmNlLGdldE1heERpc3RhbmNlKGRpcmVjdGlvbikpLG1heGltdW1zTWFwW2RpcmVjdGlvbl0uZGlzdGFuY2U9ZGlzdGFuY2UpfWZ1bmN0aW9uIGdldE1heERpc3RhbmNlKGRpcmVjdGlvbil7aWYobWF4aW11bXNNYXBbZGlyZWN0aW9uXSlyZXR1cm4gbWF4aW11bXNNYXBbZGlyZWN0aW9uXS5kaXN0YW5jZX1mdW5jdGlvbiBjcmVhdGVNYXhpbXVtc0RhdGEoKXt2YXIgbWF4RGF0YT17fTtyZXR1cm4gbWF4RGF0YVtMRUZUXT1jcmVhdGVNYXhpbXVtVk8oTEVGVCksbWF4RGF0YVtSSUdIVF09Y3JlYXRlTWF4aW11bVZPKFJJR0hUKSxtYXhEYXRhW1VQXT1jcmVhdGVNYXhpbXVtVk8oVVApLG1heERhdGFbRE9XTl09Y3JlYXRlTWF4aW11bVZPKERPV04pLG1heERhdGF9ZnVuY3Rpb24gY3JlYXRlTWF4aW11bVZPKGRpcil7cmV0dXJue2RpcmVjdGlvbjpkaXIsZGlzdGFuY2U6MH19ZnVuY3Rpb24gY2FsY3VsYXRlRHVyYXRpb24oKXtyZXR1cm4gZW5kVGltZS1zdGFydFRpbWV9ZnVuY3Rpb24gY2FsY3VsYXRlVG91Y2hlc0Rpc3RhbmNlKHN0YXJ0UG9pbnQsZW5kUG9pbnQpe3ZhciBkaWZmWD1NYXRoLmFicyhzdGFydFBvaW50LngtZW5kUG9pbnQueCksZGlmZlk9TWF0aC5hYnMoc3RhcnRQb2ludC55LWVuZFBvaW50LnkpO3JldHVybiBNYXRoLnJvdW5kKE1hdGguc3FydChkaWZmWCpkaWZmWCtkaWZmWSpkaWZmWSkpfWZ1bmN0aW9uIGNhbGN1bGF0ZVBpbmNoWm9vbShzdGFydERpc3RhbmNlLGVuZERpc3RhbmNlKXt2YXIgcGVyY2VudD1lbmREaXN0YW5jZS9zdGFydERpc3RhbmNlKjE7cmV0dXJuIHBlcmNlbnQudG9GaXhlZCgyKX1mdW5jdGlvbiBjYWxjdWxhdGVQaW5jaERpcmVjdGlvbigpe3JldHVybiBwaW5jaFpvb208MT9PVVQ6SU59ZnVuY3Rpb24gY2FsY3VsYXRlRGlzdGFuY2Uoc3RhcnRQb2ludCxlbmRQb2ludCl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KGVuZFBvaW50Lngtc3RhcnRQb2ludC54LDIpK01hdGgucG93KGVuZFBvaW50Lnktc3RhcnRQb2ludC55LDIpKSl9ZnVuY3Rpb24gY2FsY3VsYXRlQW5nbGUoc3RhcnRQb2ludCxlbmRQb2ludCl7dmFyIHg9c3RhcnRQb2ludC54LWVuZFBvaW50LngseT1lbmRQb2ludC55LXN0YXJ0UG9pbnQueSxyPU1hdGguYXRhbjIoeSx4KSxhbmdsZT1NYXRoLnJvdW5kKDE4MCpyL01hdGguUEkpO3JldHVybiBhbmdsZTwwJiYoYW5nbGU9MzYwLU1hdGguYWJzKGFuZ2xlKSksYW5nbGV9ZnVuY3Rpb24gY2FsY3VsYXRlRGlyZWN0aW9uKHN0YXJ0UG9pbnQsZW5kUG9pbnQpe2lmKGNvbXBhcmVQb2ludHMoc3RhcnRQb2ludCxlbmRQb2ludCkpcmV0dXJuIE5PTkU7dmFyIGFuZ2xlPWNhbGN1bGF0ZUFuZ2xlKHN0YXJ0UG9pbnQsZW5kUG9pbnQpO3JldHVybiBhbmdsZTw9NDUmJmFuZ2xlPj0wP0xFRlQ6YW5nbGU8PTM2MCYmYW5nbGU+PTMxNT9MRUZUOmFuZ2xlPj0xMzUmJmFuZ2xlPD0yMjU/UklHSFQ6YW5nbGU+NDUmJmFuZ2xlPDEzNT9ET1dOOlVQfWZ1bmN0aW9uIGdldFRpbWVTdGFtcCgpe3ZhciBub3c9bmV3IERhdGU7cmV0dXJuIG5vdy5nZXRUaW1lKCl9ZnVuY3Rpb24gZ2V0Ym91bmRzKGVsKXtlbD0kKGVsKTt2YXIgb2Zmc2V0PWVsLm9mZnNldCgpLGJvdW5kcz17bGVmdDpvZmZzZXQubGVmdCxyaWdodDpvZmZzZXQubGVmdCtlbC5vdXRlcldpZHRoKCksdG9wOm9mZnNldC50b3AsYm90dG9tOm9mZnNldC50b3ArZWwub3V0ZXJIZWlnaHQoKX07cmV0dXJuIGJvdW5kc31mdW5jdGlvbiBpc0luQm91bmRzKHBvaW50LGJvdW5kcyl7cmV0dXJuIHBvaW50Lng+Ym91bmRzLmxlZnQmJnBvaW50Lng8Ym91bmRzLnJpZ2h0JiZwb2ludC55PmJvdW5kcy50b3AmJnBvaW50Lnk8Ym91bmRzLmJvdHRvbX1mdW5jdGlvbiBjb21wYXJlUG9pbnRzKHBvaW50QSxwb2ludEIpe3JldHVybiBwb2ludEEueD09cG9pbnRCLngmJnBvaW50QS55PT1wb2ludEIueX12YXIgb3B0aW9ucz0kLmV4dGVuZCh7fSxvcHRpb25zKSx1c2VUb3VjaEV2ZW50cz1TVVBQT1JUU19UT1VDSHx8U1VQUE9SVFNfUE9JTlRFUnx8IW9wdGlvbnMuZmFsbGJhY2tUb01vdXNlRXZlbnRzLFNUQVJUX0VWPXVzZVRvdWNoRXZlbnRzP1NVUFBPUlRTX1BPSU5URVI/U1VQUE9SVFNfUE9JTlRFUl9JRTEwP1wiTVNQb2ludGVyRG93blwiOlwicG9pbnRlcmRvd25cIjpcInRvdWNoc3RhcnRcIjpcIm1vdXNlZG93blwiLE1PVkVfRVY9dXNlVG91Y2hFdmVudHM/U1VQUE9SVFNfUE9JTlRFUj9TVVBQT1JUU19QT0lOVEVSX0lFMTA/XCJNU1BvaW50ZXJNb3ZlXCI6XCJwb2ludGVybW92ZVwiOlwidG91Y2htb3ZlXCI6XCJtb3VzZW1vdmVcIixFTkRfRVY9dXNlVG91Y2hFdmVudHM/U1VQUE9SVFNfUE9JTlRFUj9TVVBQT1JUU19QT0lOVEVSX0lFMTA/XCJNU1BvaW50ZXJVcFwiOlwicG9pbnRlcnVwXCI6XCJ0b3VjaGVuZFwiOlwibW91c2V1cFwiLExFQVZFX0VWPXVzZVRvdWNoRXZlbnRzP1NVUFBPUlRTX1BPSU5URVI/XCJtb3VzZWxlYXZlXCI6bnVsbDpcIm1vdXNlbGVhdmVcIixDQU5DRUxfRVY9U1VQUE9SVFNfUE9JTlRFUj9TVVBQT1JUU19QT0lOVEVSX0lFMTA/XCJNU1BvaW50ZXJDYW5jZWxcIjpcInBvaW50ZXJjYW5jZWxcIjpcInRvdWNoY2FuY2VsXCIsZGlzdGFuY2U9MCxkaXJlY3Rpb249bnVsbCxjdXJyZW50RGlyZWN0aW9uPW51bGwsZHVyYXRpb249MCxzdGFydFRvdWNoZXNEaXN0YW5jZT0wLGVuZFRvdWNoZXNEaXN0YW5jZT0wLHBpbmNoWm9vbT0xLHBpbmNoRGlzdGFuY2U9MCxwaW5jaERpcmVjdGlvbj0wLG1heGltdW1zTWFwPW51bGwsJGVsZW1lbnQ9JChlbGVtZW50KSxwaGFzZT1cInN0YXJ0XCIsZmluZ2VyQ291bnQ9MCxmaW5nZXJEYXRhPXt9LHN0YXJ0VGltZT0wLGVuZFRpbWU9MCxwcmV2aW91c1RvdWNoRW5kVGltZT0wLGZpbmdlckNvdW50QXRSZWxlYXNlPTAsZG91YmxlVGFwU3RhcnRUaW1lPTAsc2luZ2xlVGFwVGltZW91dD1udWxsLGhvbGRUaW1lb3V0PW51bGw7dHJ5eyRlbGVtZW50LmJpbmQoU1RBUlRfRVYsdG91Y2hTdGFydCksJGVsZW1lbnQuYmluZChDQU5DRUxfRVYsdG91Y2hDYW5jZWwpfWNhdGNoKGUpeyQuZXJyb3IoXCJldmVudHMgbm90IHN1cHBvcnRlZCBcIitTVEFSVF9FVitcIixcIitDQU5DRUxfRVYrXCIgb24galF1ZXJ5LnN3aXBlXCIpfXRoaXMuZW5hYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZSgpLCRlbGVtZW50LmJpbmQoU1RBUlRfRVYsdG91Y2hTdGFydCksJGVsZW1lbnQuYmluZChDQU5DRUxfRVYsdG91Y2hDYW5jZWwpLCRlbGVtZW50fSx0aGlzLmRpc2FibGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmVtb3ZlTGlzdGVuZXJzKCksJGVsZW1lbnR9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3JlbW92ZUxpc3RlbmVycygpLCRlbGVtZW50LmRhdGEoUExVR0lOX05TLG51bGwpLCRlbGVtZW50PW51bGx9LHRoaXMub3B0aW9uPWZ1bmN0aW9uKHByb3BlcnR5LHZhbHVlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgcHJvcGVydHkpb3B0aW9ucz0kLmV4dGVuZChvcHRpb25zLHByb3BlcnR5KTtlbHNlIGlmKHZvaWQgMCE9PW9wdGlvbnNbcHJvcGVydHldKXtpZih2b2lkIDA9PT12YWx1ZSlyZXR1cm4gb3B0aW9uc1twcm9wZXJ0eV07b3B0aW9uc1twcm9wZXJ0eV09dmFsdWV9ZWxzZXtpZighcHJvcGVydHkpcmV0dXJuIG9wdGlvbnM7JC5lcnJvcihcIk9wdGlvbiBcIitwcm9wZXJ0eStcIiBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuc3dpcGUub3B0aW9uc1wiKX1yZXR1cm4gbnVsbH19dmFyIFZFUlNJT049XCIxLjYuMThcIixMRUZUPVwibGVmdFwiLFJJR0hUPVwicmlnaHRcIixVUD1cInVwXCIsRE9XTj1cImRvd25cIixJTj1cImluXCIsT1VUPVwib3V0XCIsTk9ORT1cIm5vbmVcIixBVVRPPVwiYXV0b1wiLFNXSVBFPVwic3dpcGVcIixQSU5DSD1cInBpbmNoXCIsVEFQPVwidGFwXCIsRE9VQkxFX1RBUD1cImRvdWJsZXRhcFwiLExPTkdfVEFQPVwibG9uZ3RhcFwiLEhPUklaT05UQUw9XCJob3Jpem9udGFsXCIsVkVSVElDQUw9XCJ2ZXJ0aWNhbFwiLEFMTF9GSU5HRVJTPVwiYWxsXCIsRE9VQkxFX1RBUF9USFJFU0hPTEQ9MTAsUEhBU0VfU1RBUlQ9XCJzdGFydFwiLFBIQVNFX01PVkU9XCJtb3ZlXCIsUEhBU0VfRU5EPVwiZW5kXCIsUEhBU0VfQ0FOQ0VMPVwiY2FuY2VsXCIsU1VQUE9SVFNfVE9VQ0g9XCJvbnRvdWNoc3RhcnRcImluIHdpbmRvdyxTVVBQT1JUU19QT0lOVEVSX0lFMTA9d2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkJiYhd2luZG93Lm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCYmIVNVUFBPUlRTX1RPVUNILFNVUFBPUlRTX1BPSU5URVI9KHdpbmRvdy5uYXZpZ2F0b3IucG9pbnRlckVuYWJsZWR8fHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCkmJiFTVVBQT1JUU19UT1VDSCxQTFVHSU5fTlM9XCJUb3VjaFN3aXBlXCIsZGVmYXVsdHM9e2ZpbmdlcnM6MSx0aHJlc2hvbGQ6NzUsY2FuY2VsVGhyZXNob2xkOm51bGwscGluY2hUaHJlc2hvbGQ6MjAsbWF4VGltZVRocmVzaG9sZDpudWxsLGZpbmdlclJlbGVhc2VUaHJlc2hvbGQ6MjUwLGxvbmdUYXBUaHJlc2hvbGQ6NTAwLGRvdWJsZVRhcFRocmVzaG9sZDoyMDAsc3dpcGU6bnVsbCxzd2lwZUxlZnQ6bnVsbCxzd2lwZVJpZ2h0Om51bGwsc3dpcGVVcDpudWxsLHN3aXBlRG93bjpudWxsLHN3aXBlU3RhdHVzOm51bGwscGluY2hJbjpudWxsLHBpbmNoT3V0Om51bGwscGluY2hTdGF0dXM6bnVsbCxjbGljazpudWxsLHRhcDpudWxsLGRvdWJsZVRhcDpudWxsLGxvbmdUYXA6bnVsbCxob2xkOm51bGwsdHJpZ2dlck9uVG91Y2hFbmQ6ITAsdHJpZ2dlck9uVG91Y2hMZWF2ZTohMSxhbGxvd1BhZ2VTY3JvbGw6XCJhdXRvXCIsZmFsbGJhY2tUb01vdXNlRXZlbnRzOiEwLGV4Y2x1ZGVkRWxlbWVudHM6XCIubm9Td2lwZVwiLHByZXZlbnREZWZhdWx0RXZlbnRzOiEwfTskLmZuLnN3aXBlPWZ1bmN0aW9uKG1ldGhvZCl7dmFyICR0aGlzPSQodGhpcykscGx1Z2luPSR0aGlzLmRhdGEoUExVR0lOX05TKTtpZihwbHVnaW4mJlwic3RyaW5nXCI9PXR5cGVvZiBtZXRob2Qpe2lmKHBsdWdpblttZXRob2RdKXJldHVybiBwbHVnaW5bbWV0aG9kXS5hcHBseShwbHVnaW4sQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTskLmVycm9yKFwiTWV0aG9kIFwiK21ldGhvZCtcIiBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuc3dpcGVcIil9ZWxzZSBpZihwbHVnaW4mJlwib2JqZWN0XCI9PXR5cGVvZiBtZXRob2QpcGx1Z2luLm9wdGlvbi5hcHBseShwbHVnaW4sYXJndW1lbnRzKTtlbHNlIGlmKCEocGx1Z2lufHxcIm9iamVjdFwiIT10eXBlb2YgbWV0aG9kJiZtZXRob2QpKXJldHVybiBpbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gJHRoaXN9LCQuZm4uc3dpcGUudmVyc2lvbj1WRVJTSU9OLCQuZm4uc3dpcGUuZGVmYXVsdHM9ZGVmYXVsdHMsJC5mbi5zd2lwZS5waGFzZXM9e1BIQVNFX1NUQVJUOlBIQVNFX1NUQVJULFBIQVNFX01PVkU6UEhBU0VfTU9WRSxQSEFTRV9FTkQ6UEhBU0VfRU5ELFBIQVNFX0NBTkNFTDpQSEFTRV9DQU5DRUx9LCQuZm4uc3dpcGUuZGlyZWN0aW9ucz17TEVGVDpMRUZULFJJR0hUOlJJR0hULFVQOlVQLERPV046RE9XTixJTjpJTixPVVQ6T1VUfSwkLmZuLnN3aXBlLnBhZ2VTY3JvbGw9e05PTkU6Tk9ORSxIT1JJWk9OVEFMOkhPUklaT05UQUwsVkVSVElDQUw6VkVSVElDQUwsQVVUTzpBVVRPfSwkLmZuLnN3aXBlLmZpbmdlcnM9e09ORToxLFRXTzoyLFRIUkVFOjMsRk9VUjo0LEZJVkU6NSxBTEw6QUxMX0ZJTkdFUlN9fSk7IiwiLyohIGpRdWVyeSBWYWxpZGF0aW9uIFBsdWdpbiAtIHYxLjE5LjEgLSA2LzE1LzIwMTlcbiAqIGh0dHBzOi8vanF1ZXJ5dmFsaWRhdGlvbi5vcmcvXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgSsO2cm4gWmFlZmZlcmVyOyBMaWNlbnNlZCBNSVQgKi9cbiFmdW5jdGlvbihhKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImpxdWVyeVwiXSxhKTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hKHJlcXVpcmUoXCJqcXVlcnlcIikpOmEoalF1ZXJ5KX0oZnVuY3Rpb24oYSl7YS5leHRlbmQoYS5mbix7dmFsaWRhdGU6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB2b2lkKGImJmIuZGVidWcmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4oXCJOb3RoaW5nIHNlbGVjdGVkLCBjYW4ndCB2YWxpZGF0ZSwgcmV0dXJuaW5nIG5vdGhpbmcuXCIpKTt2YXIgYz1hLmRhdGEodGhpc1swXSxcInZhbGlkYXRvclwiKTtyZXR1cm4gYz9jOih0aGlzLmF0dHIoXCJub3ZhbGlkYXRlXCIsXCJub3ZhbGlkYXRlXCIpLGM9bmV3IGEudmFsaWRhdG9yKGIsdGhpc1swXSksYS5kYXRhKHRoaXNbMF0sXCJ2YWxpZGF0b3JcIixjKSxjLnNldHRpbmdzLm9uc3VibWl0JiYodGhpcy5vbihcImNsaWNrLnZhbGlkYXRlXCIsXCI6c3VibWl0XCIsZnVuY3Rpb24oYil7Yy5zdWJtaXRCdXR0b249Yi5jdXJyZW50VGFyZ2V0LGEodGhpcykuaGFzQ2xhc3MoXCJjYW5jZWxcIikmJihjLmNhbmNlbFN1Ym1pdD0hMCksdm9pZCAwIT09YSh0aGlzKS5hdHRyKFwiZm9ybW5vdmFsaWRhdGVcIikmJihjLmNhbmNlbFN1Ym1pdD0hMCl9KSx0aGlzLm9uKFwic3VibWl0LnZhbGlkYXRlXCIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZCgpe3ZhciBkLGU7cmV0dXJuIGMuc3VibWl0QnV0dG9uJiYoYy5zZXR0aW5ncy5zdWJtaXRIYW5kbGVyfHxjLmZvcm1TdWJtaXR0ZWQpJiYoZD1hKFwiPGlucHV0IHR5cGU9J2hpZGRlbicvPlwiKS5hdHRyKFwibmFtZVwiLGMuc3VibWl0QnV0dG9uLm5hbWUpLnZhbChhKGMuc3VibWl0QnV0dG9uKS52YWwoKSkuYXBwZW5kVG8oYy5jdXJyZW50Rm9ybSkpLCEoYy5zZXR0aW5ncy5zdWJtaXRIYW5kbGVyJiYhYy5zZXR0aW5ncy5kZWJ1Zyl8fChlPWMuc2V0dGluZ3Muc3VibWl0SGFuZGxlci5jYWxsKGMsYy5jdXJyZW50Rm9ybSxiKSxkJiZkLnJlbW92ZSgpLHZvaWQgMCE9PWUmJmUpfXJldHVybiBjLnNldHRpbmdzLmRlYnVnJiZiLnByZXZlbnREZWZhdWx0KCksYy5jYW5jZWxTdWJtaXQ/KGMuY2FuY2VsU3VibWl0PSExLGQoKSk6Yy5mb3JtKCk/Yy5wZW5kaW5nUmVxdWVzdD8oYy5mb3JtU3VibWl0dGVkPSEwLCExKTpkKCk6KGMuZm9jdXNJbnZhbGlkKCksITEpfSkpLGMpfSx2YWxpZDpmdW5jdGlvbigpe3ZhciBiLGMsZDtyZXR1cm4gYSh0aGlzWzBdKS5pcyhcImZvcm1cIik/Yj10aGlzLnZhbGlkYXRlKCkuZm9ybSgpOihkPVtdLGI9ITAsYz1hKHRoaXNbMF0uZm9ybSkudmFsaWRhdGUoKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtiPWMuZWxlbWVudCh0aGlzKSYmYixifHwoZD1kLmNvbmNhdChjLmVycm9yTGlzdCkpfSksYy5lcnJvckxpc3Q9ZCksYn0scnVsZXM6ZnVuY3Rpb24oYixjKXt2YXIgZCxlLGYsZyxoLGksaj10aGlzWzBdLGs9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHRoaXMuYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiKSYmXCJmYWxzZVwiIT09dGhpcy5hdHRyKFwiY29udGVudGVkaXRhYmxlXCIpO2lmKG51bGwhPWomJighai5mb3JtJiZrJiYoai5mb3JtPXRoaXMuY2xvc2VzdChcImZvcm1cIilbMF0sai5uYW1lPXRoaXMuYXR0cihcIm5hbWVcIikpLG51bGwhPWouZm9ybSkpe2lmKGIpc3dpdGNoKGQ9YS5kYXRhKGouZm9ybSxcInZhbGlkYXRvclwiKS5zZXR0aW5ncyxlPWQucnVsZXMsZj1hLnZhbGlkYXRvci5zdGF0aWNSdWxlcyhqKSxiKXtjYXNlXCJhZGRcIjphLmV4dGVuZChmLGEudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGUoYykpLGRlbGV0ZSBmLm1lc3NhZ2VzLGVbai5uYW1lXT1mLGMubWVzc2FnZXMmJihkLm1lc3NhZ2VzW2oubmFtZV09YS5leHRlbmQoZC5tZXNzYWdlc1tqLm5hbWVdLGMubWVzc2FnZXMpKTticmVhaztjYXNlXCJyZW1vdmVcIjpyZXR1cm4gYz8oaT17fSxhLmVhY2goYy5zcGxpdCgvXFxzLyksZnVuY3Rpb24oYSxiKXtpW2JdPWZbYl0sZGVsZXRlIGZbYl19KSxpKTooZGVsZXRlIGVbai5uYW1lXSxmKX1yZXR1cm4gZz1hLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlcyhhLmV4dGVuZCh7fSxhLnZhbGlkYXRvci5jbGFzc1J1bGVzKGopLGEudmFsaWRhdG9yLmF0dHJpYnV0ZVJ1bGVzKGopLGEudmFsaWRhdG9yLmRhdGFSdWxlcyhqKSxhLnZhbGlkYXRvci5zdGF0aWNSdWxlcyhqKSksaiksZy5yZXF1aXJlZCYmKGg9Zy5yZXF1aXJlZCxkZWxldGUgZy5yZXF1aXJlZCxnPWEuZXh0ZW5kKHtyZXF1aXJlZDpofSxnKSksZy5yZW1vdGUmJihoPWcucmVtb3RlLGRlbGV0ZSBnLnJlbW90ZSxnPWEuZXh0ZW5kKGcse3JlbW90ZTpofSkpLGd9fX0pLGEuZXh0ZW5kKGEuZXhwci5wc2V1ZG9zfHxhLmV4cHJbXCI6XCJdLHtibGFuazpmdW5jdGlvbihiKXtyZXR1cm4hYS50cmltKFwiXCIrYShiKS52YWwoKSl9LGZpbGxlZDpmdW5jdGlvbihiKXt2YXIgYz1hKGIpLnZhbCgpO3JldHVybiBudWxsIT09YyYmISFhLnRyaW0oXCJcIitjKX0sdW5jaGVja2VkOmZ1bmN0aW9uKGIpe3JldHVybiFhKGIpLnByb3AoXCJjaGVja2VkXCIpfX0pLGEudmFsaWRhdG9yPWZ1bmN0aW9uKGIsYyl7dGhpcy5zZXR0aW5ncz1hLmV4dGVuZCghMCx7fSxhLnZhbGlkYXRvci5kZWZhdWx0cyxiKSx0aGlzLmN1cnJlbnRGb3JtPWMsdGhpcy5pbml0KCl9LGEudmFsaWRhdG9yLmZvcm1hdD1mdW5jdGlvbihiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9mdW5jdGlvbigpe3ZhciBjPWEubWFrZUFycmF5KGFyZ3VtZW50cyk7cmV0dXJuIGMudW5zaGlmdChiKSxhLnZhbGlkYXRvci5mb3JtYXQuYXBwbHkodGhpcyxjKX06dm9pZCAwPT09Yz9iOihhcmd1bWVudHMubGVuZ3RoPjImJmMuY29uc3RydWN0b3IhPT1BcnJheSYmKGM9YS5tYWtlQXJyYXkoYXJndW1lbnRzKS5zbGljZSgxKSksYy5jb25zdHJ1Y3RvciE9PUFycmF5JiYoYz1bY10pLGEuZWFjaChjLGZ1bmN0aW9uKGEsYyl7Yj1iLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFx7XCIrYStcIlxcXFx9XCIsXCJnXCIpLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KX0pLGIpfSxhLmV4dGVuZChhLnZhbGlkYXRvcix7ZGVmYXVsdHM6e21lc3NhZ2VzOnt9LGdyb3Vwczp7fSxydWxlczp7fSxlcnJvckNsYXNzOlwiZXJyb3JcIixwZW5kaW5nQ2xhc3M6XCJwZW5kaW5nXCIsdmFsaWRDbGFzczpcInZhbGlkXCIsZXJyb3JFbGVtZW50OlwibGFiZWxcIixmb2N1c0NsZWFudXA6ITEsZm9jdXNJbnZhbGlkOiEwLGVycm9yQ29udGFpbmVyOmEoW10pLGVycm9yTGFiZWxDb250YWluZXI6YShbXSksb25zdWJtaXQ6ITAsaWdub3JlOlwiOmhpZGRlblwiLGlnbm9yZVRpdGxlOiExLG9uZm9jdXNpbjpmdW5jdGlvbihhKXt0aGlzLmxhc3RBY3RpdmU9YSx0aGlzLnNldHRpbmdzLmZvY3VzQ2xlYW51cCYmKHRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQmJnRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQuY2FsbCh0aGlzLGEsdGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzLHRoaXMuc2V0dGluZ3MudmFsaWRDbGFzcyksdGhpcy5oaWRlVGhlc2UodGhpcy5lcnJvcnNGb3IoYSkpKX0sb25mb2N1c291dDpmdW5jdGlvbihhKXt0aGlzLmNoZWNrYWJsZShhKXx8IShhLm5hbWUgaW4gdGhpcy5zdWJtaXR0ZWQpJiZ0aGlzLm9wdGlvbmFsKGEpfHx0aGlzLmVsZW1lbnQoYSl9LG9ua2V5dXA6ZnVuY3Rpb24oYixjKXt2YXIgZD1bMTYsMTcsMTgsMjAsMzUsMzYsMzcsMzgsMzksNDAsNDUsMTQ0LDIyNV07OT09PWMud2hpY2gmJlwiXCI9PT10aGlzLmVsZW1lbnRWYWx1ZShiKXx8YS5pbkFycmF5KGMua2V5Q29kZSxkKSE9PS0xfHwoYi5uYW1lIGluIHRoaXMuc3VibWl0dGVkfHxiLm5hbWUgaW4gdGhpcy5pbnZhbGlkKSYmdGhpcy5lbGVtZW50KGIpfSxvbmNsaWNrOmZ1bmN0aW9uKGEpe2EubmFtZSBpbiB0aGlzLnN1Ym1pdHRlZD90aGlzLmVsZW1lbnQoYSk6YS5wYXJlbnROb2RlLm5hbWUgaW4gdGhpcy5zdWJtaXR0ZWQmJnRoaXMuZWxlbWVudChhLnBhcmVudE5vZGUpfSxoaWdobGlnaHQ6ZnVuY3Rpb24oYixjLGQpe1wicmFkaW9cIj09PWIudHlwZT90aGlzLmZpbmRCeU5hbWUoYi5uYW1lKS5hZGRDbGFzcyhjKS5yZW1vdmVDbGFzcyhkKTphKGIpLmFkZENsYXNzKGMpLnJlbW92ZUNsYXNzKGQpfSx1bmhpZ2hsaWdodDpmdW5jdGlvbihiLGMsZCl7XCJyYWRpb1wiPT09Yi50eXBlP3RoaXMuZmluZEJ5TmFtZShiLm5hbWUpLnJlbW92ZUNsYXNzKGMpLmFkZENsYXNzKGQpOmEoYikucmVtb3ZlQ2xhc3MoYykuYWRkQ2xhc3MoZCl9fSxzZXREZWZhdWx0czpmdW5jdGlvbihiKXthLmV4dGVuZChhLnZhbGlkYXRvci5kZWZhdWx0cyxiKX0sbWVzc2FnZXM6e3JlcXVpcmVkOlwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cIixyZW1vdGU6XCJQbGVhc2UgZml4IHRoaXMgZmllbGQuXCIsZW1haWw6XCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlwiLHVybDpcIlBsZWFzZSBlbnRlciBhIHZhbGlkIFVSTC5cIixkYXRlOlwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZS5cIixkYXRlSVNPOlwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSAoSVNPKS5cIixudW1iZXI6XCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBudW1iZXIuXCIsZGlnaXRzOlwiUGxlYXNlIGVudGVyIG9ubHkgZGlnaXRzLlwiLGVxdWFsVG86XCJQbGVhc2UgZW50ZXIgdGhlIHNhbWUgdmFsdWUgYWdhaW4uXCIsbWF4bGVuZ3RoOmEudmFsaWRhdG9yLmZvcm1hdChcIlBsZWFzZSBlbnRlciBubyBtb3JlIHRoYW4gezB9IGNoYXJhY3RlcnMuXCIpLG1pbmxlbmd0aDphLnZhbGlkYXRvci5mb3JtYXQoXCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcnMuXCIpLHJhbmdlbGVuZ3RoOmEudmFsaWRhdG9yLmZvcm1hdChcIlBsZWFzZSBlbnRlciBhIHZhbHVlIGJldHdlZW4gezB9IGFuZCB7MX0gY2hhcmFjdGVycyBsb25nLlwiKSxyYW5nZTphLnZhbGlkYXRvci5mb3JtYXQoXCJQbGVhc2UgZW50ZXIgYSB2YWx1ZSBiZXR3ZWVuIHswfSBhbmQgezF9LlwiKSxtYXg6YS52YWxpZGF0b3IuZm9ybWF0KFwiUGxlYXNlIGVudGVyIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHswfS5cIiksbWluOmEudmFsaWRhdG9yLmZvcm1hdChcIlBsZWFzZSBlbnRlciBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7MH0uXCIpLHN0ZXA6YS52YWxpZGF0b3IuZm9ybWF0KFwiUGxlYXNlIGVudGVyIGEgbXVsdGlwbGUgb2YgezB9LlwiKX0sYXV0b0NyZWF0ZVJhbmdlczohMSxwcm90b3R5cGU6e2luaXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3ZhciBjPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBhKHRoaXMpLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIikmJlwiZmFsc2VcIiE9PWEodGhpcykuYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiKTtpZighdGhpcy5mb3JtJiZjJiYodGhpcy5mb3JtPWEodGhpcykuY2xvc2VzdChcImZvcm1cIilbMF0sdGhpcy5uYW1lPWEodGhpcykuYXR0cihcIm5hbWVcIikpLGQ9PT10aGlzLmZvcm0pe3ZhciBlPWEuZGF0YSh0aGlzLmZvcm0sXCJ2YWxpZGF0b3JcIiksZj1cIm9uXCIrYi50eXBlLnJlcGxhY2UoL152YWxpZGF0ZS8sXCJcIiksZz1lLnNldHRpbmdzO2dbZl0mJiFhKHRoaXMpLmlzKGcuaWdub3JlKSYmZ1tmXS5jYWxsKGUsdGhpcyxiKX19dGhpcy5sYWJlbENvbnRhaW5lcj1hKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJlbENvbnRhaW5lciksdGhpcy5lcnJvckNvbnRleHQ9dGhpcy5sYWJlbENvbnRhaW5lci5sZW5ndGgmJnRoaXMubGFiZWxDb250YWluZXJ8fGEodGhpcy5jdXJyZW50Rm9ybSksdGhpcy5jb250YWluZXJzPWEodGhpcy5zZXR0aW5ncy5lcnJvckNvbnRhaW5lcikuYWRkKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJlbENvbnRhaW5lciksdGhpcy5zdWJtaXR0ZWQ9e30sdGhpcy52YWx1ZUNhY2hlPXt9LHRoaXMucGVuZGluZ1JlcXVlc3Q9MCx0aGlzLnBlbmRpbmc9e30sdGhpcy5pbnZhbGlkPXt9LHRoaXMucmVzZXQoKTt2YXIgYyxkPXRoaXMuY3VycmVudEZvcm0sZT10aGlzLmdyb3Vwcz17fTthLmVhY2godGhpcy5zZXR0aW5ncy5ncm91cHMsZnVuY3Rpb24oYixjKXtcInN0cmluZ1wiPT10eXBlb2YgYyYmKGM9Yy5zcGxpdCgvXFxzLykpLGEuZWFjaChjLGZ1bmN0aW9uKGEsYyl7ZVtjXT1ifSl9KSxjPXRoaXMuc2V0dGluZ3MucnVsZXMsYS5lYWNoKGMsZnVuY3Rpb24oYixkKXtjW2JdPWEudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGUoZCl9KSxhKHRoaXMuY3VycmVudEZvcm0pLm9uKFwiZm9jdXNpbi52YWxpZGF0ZSBmb2N1c291dC52YWxpZGF0ZSBrZXl1cC52YWxpZGF0ZVwiLFwiOnRleHQsIFt0eXBlPSdwYXNzd29yZCddLCBbdHlwZT0nZmlsZSddLCBzZWxlY3QsIHRleHRhcmVhLCBbdHlwZT0nbnVtYmVyJ10sIFt0eXBlPSdzZWFyY2gnXSwgW3R5cGU9J3RlbCddLCBbdHlwZT0ndXJsJ10sIFt0eXBlPSdlbWFpbCddLCBbdHlwZT0nZGF0ZXRpbWUnXSwgW3R5cGU9J2RhdGUnXSwgW3R5cGU9J21vbnRoJ10sIFt0eXBlPSd3ZWVrJ10sIFt0eXBlPSd0aW1lJ10sIFt0eXBlPSdkYXRldGltZS1sb2NhbCddLCBbdHlwZT0ncmFuZ2UnXSwgW3R5cGU9J2NvbG9yJ10sIFt0eXBlPSdyYWRpbyddLCBbdHlwZT0nY2hlY2tib3gnXSwgW2NvbnRlbnRlZGl0YWJsZV0sIFt0eXBlPSdidXR0b24nXVwiLGIpLm9uKFwiY2xpY2sudmFsaWRhdGVcIixcInNlbGVjdCwgb3B0aW9uLCBbdHlwZT0ncmFkaW8nXSwgW3R5cGU9J2NoZWNrYm94J11cIixiKSx0aGlzLnNldHRpbmdzLmludmFsaWRIYW5kbGVyJiZhKHRoaXMuY3VycmVudEZvcm0pLm9uKFwiaW52YWxpZC1mb3JtLnZhbGlkYXRlXCIsdGhpcy5zZXR0aW5ncy5pbnZhbGlkSGFuZGxlcil9LGZvcm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja0Zvcm0oKSxhLmV4dGVuZCh0aGlzLnN1Ym1pdHRlZCx0aGlzLmVycm9yTWFwKSx0aGlzLmludmFsaWQ9YS5leHRlbmQoe30sdGhpcy5lcnJvck1hcCksdGhpcy52YWxpZCgpfHxhKHRoaXMuY3VycmVudEZvcm0pLnRyaWdnZXJIYW5kbGVyKFwiaW52YWxpZC1mb3JtXCIsW3RoaXNdKSx0aGlzLnNob3dFcnJvcnMoKSx0aGlzLnZhbGlkKCl9LGNoZWNrRm9ybTpmdW5jdGlvbigpe3RoaXMucHJlcGFyZUZvcm0oKTtmb3IodmFyIGE9MCxiPXRoaXMuY3VycmVudEVsZW1lbnRzPXRoaXMuZWxlbWVudHMoKTtiW2FdO2ErKyl0aGlzLmNoZWNrKGJbYV0pO3JldHVybiB0aGlzLnZhbGlkKCl9LGVsZW1lbnQ6ZnVuY3Rpb24oYil7dmFyIGMsZCxlPXRoaXMuY2xlYW4oYiksZj10aGlzLnZhbGlkYXRpb25UYXJnZXRGb3IoZSksZz10aGlzLGg9ITA7cmV0dXJuIHZvaWQgMD09PWY/ZGVsZXRlIHRoaXMuaW52YWxpZFtlLm5hbWVdOih0aGlzLnByZXBhcmVFbGVtZW50KGYpLHRoaXMuY3VycmVudEVsZW1lbnRzPWEoZiksZD10aGlzLmdyb3Vwc1tmLm5hbWVdLGQmJmEuZWFjaCh0aGlzLmdyb3VwcyxmdW5jdGlvbihhLGIpe2I9PT1kJiZhIT09Zi5uYW1lJiYoZT1nLnZhbGlkYXRpb25UYXJnZXRGb3IoZy5jbGVhbihnLmZpbmRCeU5hbWUoYSkpKSxlJiZlLm5hbWUgaW4gZy5pbnZhbGlkJiYoZy5jdXJyZW50RWxlbWVudHMucHVzaChlKSxoPWcuY2hlY2soZSkmJmgpKX0pLGM9dGhpcy5jaGVjayhmKSE9PSExLGg9aCYmYyxjP3RoaXMuaW52YWxpZFtmLm5hbWVdPSExOnRoaXMuaW52YWxpZFtmLm5hbWVdPSEwLHRoaXMubnVtYmVyT2ZJbnZhbGlkcygpfHwodGhpcy50b0hpZGU9dGhpcy50b0hpZGUuYWRkKHRoaXMuY29udGFpbmVycykpLHRoaXMuc2hvd0Vycm9ycygpLGEoYikuYXR0cihcImFyaWEtaW52YWxpZFwiLCFjKSksaH0sc2hvd0Vycm9yczpmdW5jdGlvbihiKXtpZihiKXt2YXIgYz10aGlzO2EuZXh0ZW5kKHRoaXMuZXJyb3JNYXAsYiksdGhpcy5lcnJvckxpc3Q9YS5tYXAodGhpcy5lcnJvck1hcCxmdW5jdGlvbihhLGIpe3JldHVybnttZXNzYWdlOmEsZWxlbWVudDpjLmZpbmRCeU5hbWUoYilbMF19fSksdGhpcy5zdWNjZXNzTGlzdD1hLmdyZXAodGhpcy5zdWNjZXNzTGlzdCxmdW5jdGlvbihhKXtyZXR1cm4hKGEubmFtZSBpbiBiKX0pfXRoaXMuc2V0dGluZ3Muc2hvd0Vycm9ycz90aGlzLnNldHRpbmdzLnNob3dFcnJvcnMuY2FsbCh0aGlzLHRoaXMuZXJyb3JNYXAsdGhpcy5lcnJvckxpc3QpOnRoaXMuZGVmYXVsdFNob3dFcnJvcnMoKX0scmVzZXRGb3JtOmZ1bmN0aW9uKCl7YS5mbi5yZXNldEZvcm0mJmEodGhpcy5jdXJyZW50Rm9ybSkucmVzZXRGb3JtKCksdGhpcy5pbnZhbGlkPXt9LHRoaXMuc3VibWl0dGVkPXt9LHRoaXMucHJlcGFyZUZvcm0oKSx0aGlzLmhpZGVFcnJvcnMoKTt2YXIgYj10aGlzLmVsZW1lbnRzKCkucmVtb3ZlRGF0YShcInByZXZpb3VzVmFsdWVcIikucmVtb3ZlQXR0cihcImFyaWEtaW52YWxpZFwiKTt0aGlzLnJlc2V0RWxlbWVudHMoYil9LHJlc2V0RWxlbWVudHM6ZnVuY3Rpb24oYSl7dmFyIGI7aWYodGhpcy5zZXR0aW5ncy51bmhpZ2hsaWdodClmb3IoYj0wO2FbYl07YisrKXRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQuY2FsbCh0aGlzLGFbYl0sdGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzLFwiXCIpLHRoaXMuZmluZEJ5TmFtZShhW2JdLm5hbWUpLnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MudmFsaWRDbGFzcyk7ZWxzZSBhLnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcykucmVtb3ZlQ2xhc3ModGhpcy5zZXR0aW5ncy52YWxpZENsYXNzKX0sbnVtYmVyT2ZJbnZhbGlkczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9iamVjdExlbmd0aCh0aGlzLmludmFsaWQpfSxvYmplY3RMZW5ndGg6ZnVuY3Rpb24oYSl7dmFyIGIsYz0wO2ZvcihiIGluIGEpdm9pZCAwIT09YVtiXSYmbnVsbCE9PWFbYl0mJmFbYl0hPT0hMSYmYysrO3JldHVybiBjfSxoaWRlRXJyb3JzOmZ1bmN0aW9uKCl7dGhpcy5oaWRlVGhlc2UodGhpcy50b0hpZGUpfSxoaWRlVGhlc2U6ZnVuY3Rpb24oYSl7YS5ub3QodGhpcy5jb250YWluZXJzKS50ZXh0KFwiXCIpLHRoaXMuYWRkV3JhcHBlcihhKS5oaWRlKCl9LHZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemUoKX0sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yTGlzdC5sZW5ndGh9LGZvY3VzSW52YWxpZDpmdW5jdGlvbigpe2lmKHRoaXMuc2V0dGluZ3MuZm9jdXNJbnZhbGlkKXRyeXthKHRoaXMuZmluZExhc3RBY3RpdmUoKXx8dGhpcy5lcnJvckxpc3QubGVuZ3RoJiZ0aGlzLmVycm9yTGlzdFswXS5lbGVtZW50fHxbXSkuZmlsdGVyKFwiOnZpc2libGVcIikudHJpZ2dlcihcImZvY3VzXCIpLnRyaWdnZXIoXCJmb2N1c2luXCIpfWNhdGNoKGIpe319LGZpbmRMYXN0QWN0aXZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5sYXN0QWN0aXZlO3JldHVybiBiJiYxPT09YS5ncmVwKHRoaXMuZXJyb3JMaXN0LGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsZW1lbnQubmFtZT09PWIubmFtZX0pLmxlbmd0aCYmYn0sZWxlbWVudHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9e307cmV0dXJuIGEodGhpcy5jdXJyZW50Rm9ybSkuZmluZChcImlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBbY29udGVudGVkaXRhYmxlXVwiKS5ub3QoXCI6c3VibWl0LCA6cmVzZXQsIDppbWFnZSwgOmRpc2FibGVkXCIpLm5vdCh0aGlzLnNldHRpbmdzLmlnbm9yZSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5uYW1lfHxhKHRoaXMpLmF0dHIoXCJuYW1lXCIpLGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGEodGhpcykuYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiKSYmXCJmYWxzZVwiIT09YSh0aGlzKS5hdHRyKFwiY29udGVudGVkaXRhYmxlXCIpO3JldHVybiFkJiZiLnNldHRpbmdzLmRlYnVnJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5lcnJvcihcIiVvIGhhcyBubyBuYW1lIGFzc2lnbmVkXCIsdGhpcyksZSYmKHRoaXMuZm9ybT1hKHRoaXMpLmNsb3Nlc3QoXCJmb3JtXCIpWzBdLHRoaXMubmFtZT1kKSx0aGlzLmZvcm09PT1iLmN1cnJlbnRGb3JtJiYoIShkIGluIGN8fCFiLm9iamVjdExlbmd0aChhKHRoaXMpLnJ1bGVzKCkpKSYmKGNbZF09ITAsITApKX0pfSxjbGVhbjpmdW5jdGlvbihiKXtyZXR1cm4gYShiKVswXX0sZXJyb3JzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzLnNwbGl0KFwiIFwiKS5qb2luKFwiLlwiKTtyZXR1cm4gYSh0aGlzLnNldHRpbmdzLmVycm9yRWxlbWVudCtcIi5cIitiLHRoaXMuZXJyb3JDb250ZXh0KX0scmVzZXRJbnRlcm5hbHM6ZnVuY3Rpb24oKXt0aGlzLnN1Y2Nlc3NMaXN0PVtdLHRoaXMuZXJyb3JMaXN0PVtdLHRoaXMuZXJyb3JNYXA9e30sdGhpcy50b1Nob3c9YShbXSksdGhpcy50b0hpZGU9YShbXSl9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5yZXNldEludGVybmFscygpLHRoaXMuY3VycmVudEVsZW1lbnRzPWEoW10pfSxwcmVwYXJlRm9ybTpmdW5jdGlvbigpe3RoaXMucmVzZXQoKSx0aGlzLnRvSGlkZT10aGlzLmVycm9ycygpLmFkZCh0aGlzLmNvbnRhaW5lcnMpfSxwcmVwYXJlRWxlbWVudDpmdW5jdGlvbihhKXt0aGlzLnJlc2V0KCksdGhpcy50b0hpZGU9dGhpcy5lcnJvcnNGb3IoYSl9LGVsZW1lbnRWYWx1ZTpmdW5jdGlvbihiKXt2YXIgYyxkLGU9YShiKSxmPWIudHlwZSxnPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBlLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIikmJlwiZmFsc2VcIiE9PWUuYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiKTtyZXR1cm5cInJhZGlvXCI9PT1mfHxcImNoZWNrYm94XCI9PT1mP3RoaXMuZmluZEJ5TmFtZShiLm5hbWUpLmZpbHRlcihcIjpjaGVja2VkXCIpLnZhbCgpOlwibnVtYmVyXCI9PT1mJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgYi52YWxpZGl0eT9iLnZhbGlkaXR5LmJhZElucHV0P1wiTmFOXCI6ZS52YWwoKTooYz1nP2UudGV4dCgpOmUudmFsKCksXCJmaWxlXCI9PT1mP1wiQzpcXFxcZmFrZXBhdGhcXFxcXCI9PT1jLnN1YnN0cigwLDEyKT9jLnN1YnN0cigxMik6KGQ9Yy5sYXN0SW5kZXhPZihcIi9cIiksZD49MD9jLnN1YnN0cihkKzEpOihkPWMubGFzdEluZGV4T2YoXCJcXFxcXCIpLGQ+PTA/Yy5zdWJzdHIoZCsxKTpjKSk6XCJzdHJpbmdcIj09dHlwZW9mIGM/Yy5yZXBsYWNlKC9cXHIvZyxcIlwiKTpjKX0sY2hlY2s6ZnVuY3Rpb24oYil7Yj10aGlzLnZhbGlkYXRpb25UYXJnZXRGb3IodGhpcy5jbGVhbihiKSk7dmFyIGMsZCxlLGYsZz1hKGIpLnJ1bGVzKCksaD1hLm1hcChnLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ9KS5sZW5ndGgsaT0hMSxqPXRoaXMuZWxlbWVudFZhbHVlKGIpO1wiZnVuY3Rpb25cIj09dHlwZW9mIGcubm9ybWFsaXplcj9mPWcubm9ybWFsaXplcjpcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLnNldHRpbmdzLm5vcm1hbGl6ZXImJihmPXRoaXMuc2V0dGluZ3Mubm9ybWFsaXplciksZiYmKGo9Zi5jYWxsKGIsaiksZGVsZXRlIGcubm9ybWFsaXplcik7Zm9yKGQgaW4gZyl7ZT17bWV0aG9kOmQscGFyYW1ldGVyczpnW2RdfTt0cnl7aWYoYz1hLnZhbGlkYXRvci5tZXRob2RzW2RdLmNhbGwodGhpcyxqLGIsZS5wYXJhbWV0ZXJzKSxcImRlcGVuZGVuY3ktbWlzbWF0Y2hcIj09PWMmJjE9PT1oKXtpPSEwO2NvbnRpbnVlfWlmKGk9ITEsXCJwZW5kaW5nXCI9PT1jKXJldHVybiB2b2lkKHRoaXMudG9IaWRlPXRoaXMudG9IaWRlLm5vdCh0aGlzLmVycm9yc0ZvcihiKSkpO2lmKCFjKXJldHVybiB0aGlzLmZvcm1hdEFuZEFkZChiLGUpLCExfWNhdGNoKGspe3Rocm93IHRoaXMuc2V0dGluZ3MuZGVidWcmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyhcIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGVuIGNoZWNraW5nIGVsZW1lbnQgXCIrYi5pZCtcIiwgY2hlY2sgdGhlICdcIitlLm1ldGhvZCtcIicgbWV0aG9kLlwiLGspLGsgaW5zdGFuY2VvZiBUeXBlRXJyb3ImJihrLm1lc3NhZ2UrPVwiLiAgRXhjZXB0aW9uIG9jY3VycmVkIHdoZW4gY2hlY2tpbmcgZWxlbWVudCBcIitiLmlkK1wiLCBjaGVjayB0aGUgJ1wiK2UubWV0aG9kK1wiJyBtZXRob2QuXCIpLGt9fWlmKCFpKXJldHVybiB0aGlzLm9iamVjdExlbmd0aChnKSYmdGhpcy5zdWNjZXNzTGlzdC5wdXNoKGIpLCEwfSxjdXN0b21EYXRhTWVzc2FnZTpmdW5jdGlvbihiLGMpe3JldHVybiBhKGIpLmRhdGEoXCJtc2dcIitjLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Muc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCkpfHxhKGIpLmRhdGEoXCJtc2dcIil9LGN1c3RvbU1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2FdO3JldHVybiBjJiYoYy5jb25zdHJ1Y3Rvcj09PVN0cmluZz9jOmNbYl0pfSxmaW5kRGVmaW5lZDpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8YXJndW1lbnRzLmxlbmd0aDthKyspaWYodm9pZCAwIT09YXJndW1lbnRzW2FdKXJldHVybiBhcmd1bWVudHNbYV19LGRlZmF1bHRNZXNzYWdlOmZ1bmN0aW9uKGIsYyl7XCJzdHJpbmdcIj09dHlwZW9mIGMmJihjPXttZXRob2Q6Y30pO3ZhciBkPXRoaXMuZmluZERlZmluZWQodGhpcy5jdXN0b21NZXNzYWdlKGIubmFtZSxjLm1ldGhvZCksdGhpcy5jdXN0b21EYXRhTWVzc2FnZShiLGMubWV0aG9kKSwhdGhpcy5zZXR0aW5ncy5pZ25vcmVUaXRsZSYmYi50aXRsZXx8dm9pZCAwLGEudmFsaWRhdG9yLm1lc3NhZ2VzW2MubWV0aG9kXSxcIjxzdHJvbmc+V2FybmluZzogTm8gbWVzc2FnZSBkZWZpbmVkIGZvciBcIitiLm5hbWUrXCI8L3N0cm9uZz5cIiksZT0vXFwkP1xceyhcXGQrKVxcfS9nO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGQ/ZD1kLmNhbGwodGhpcyxjLnBhcmFtZXRlcnMsYik6ZS50ZXN0KGQpJiYoZD1hLnZhbGlkYXRvci5mb3JtYXQoZC5yZXBsYWNlKGUsXCJ7JDF9XCIpLGMucGFyYW1ldGVycykpLGR9LGZvcm1hdEFuZEFkZDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZGVmYXVsdE1lc3NhZ2UoYSxiKTt0aGlzLmVycm9yTGlzdC5wdXNoKHttZXNzYWdlOmMsZWxlbWVudDphLG1ldGhvZDpiLm1ldGhvZH0pLHRoaXMuZXJyb3JNYXBbYS5uYW1lXT1jLHRoaXMuc3VibWl0dGVkW2EubmFtZV09Y30sYWRkV3JhcHBlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXR0aW5ncy53cmFwcGVyJiYoYT1hLmFkZChhLnBhcmVudCh0aGlzLnNldHRpbmdzLndyYXBwZXIpKSksYX0sZGVmYXVsdFNob3dFcnJvcnM6ZnVuY3Rpb24oKXt2YXIgYSxiLGM7Zm9yKGE9MDt0aGlzLmVycm9yTGlzdFthXTthKyspYz10aGlzLmVycm9yTGlzdFthXSx0aGlzLnNldHRpbmdzLmhpZ2hsaWdodCYmdGhpcy5zZXR0aW5ncy5oaWdobGlnaHQuY2FsbCh0aGlzLGMuZWxlbWVudCx0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MsdGhpcy5zZXR0aW5ncy52YWxpZENsYXNzKSx0aGlzLnNob3dMYWJlbChjLmVsZW1lbnQsYy5tZXNzYWdlKTtpZih0aGlzLmVycm9yTGlzdC5sZW5ndGgmJih0aGlzLnRvU2hvdz10aGlzLnRvU2hvdy5hZGQodGhpcy5jb250YWluZXJzKSksdGhpcy5zZXR0aW5ncy5zdWNjZXNzKWZvcihhPTA7dGhpcy5zdWNjZXNzTGlzdFthXTthKyspdGhpcy5zaG93TGFiZWwodGhpcy5zdWNjZXNzTGlzdFthXSk7aWYodGhpcy5zZXR0aW5ncy51bmhpZ2hsaWdodClmb3IoYT0wLGI9dGhpcy52YWxpZEVsZW1lbnRzKCk7YlthXTthKyspdGhpcy5zZXR0aW5ncy51bmhpZ2hsaWdodC5jYWxsKHRoaXMsYlthXSx0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MsdGhpcy5zZXR0aW5ncy52YWxpZENsYXNzKTt0aGlzLnRvSGlkZT10aGlzLnRvSGlkZS5ub3QodGhpcy50b1Nob3cpLHRoaXMuaGlkZUVycm9ycygpLHRoaXMuYWRkV3JhcHBlcih0aGlzLnRvU2hvdykuc2hvdygpfSx2YWxpZEVsZW1lbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudEVsZW1lbnRzLm5vdCh0aGlzLmludmFsaWRFbGVtZW50cygpKX0saW52YWxpZEVsZW1lbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcy5lcnJvckxpc3QpLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9KX0sc2hvd0xhYmVsOmZ1bmN0aW9uKGIsYyl7dmFyIGQsZSxmLGcsaD10aGlzLmVycm9yc0ZvcihiKSxpPXRoaXMuaWRPck5hbWUoYiksaj1hKGIpLmF0dHIoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpO2gubGVuZ3RoPyhoLnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MudmFsaWRDbGFzcykuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzKSxoLmh0bWwoYykpOihoPWEoXCI8XCIrdGhpcy5zZXR0aW5ncy5lcnJvckVsZW1lbnQrXCI+XCIpLmF0dHIoXCJpZFwiLGkrXCItZXJyb3JcIikuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzKS5odG1sKGN8fFwiXCIpLGQ9aCx0aGlzLnNldHRpbmdzLndyYXBwZXImJihkPWguaGlkZSgpLnNob3coKS53cmFwKFwiPFwiK3RoaXMuc2V0dGluZ3Mud3JhcHBlcitcIi8+XCIpLnBhcmVudCgpKSx0aGlzLmxhYmVsQ29udGFpbmVyLmxlbmd0aD90aGlzLmxhYmVsQ29udGFpbmVyLmFwcGVuZChkKTp0aGlzLnNldHRpbmdzLmVycm9yUGxhY2VtZW50P3RoaXMuc2V0dGluZ3MuZXJyb3JQbGFjZW1lbnQuY2FsbCh0aGlzLGQsYShiKSk6ZC5pbnNlcnRBZnRlcihiKSxoLmlzKFwibGFiZWxcIik/aC5hdHRyKFwiZm9yXCIsaSk6MD09PWgucGFyZW50cyhcImxhYmVsW2Zvcj0nXCIrdGhpcy5lc2NhcGVDc3NNZXRhKGkpK1wiJ11cIikubGVuZ3RoJiYoZj1oLmF0dHIoXCJpZFwiKSxqP2oubWF0Y2gobmV3IFJlZ0V4cChcIlxcXFxiXCIrdGhpcy5lc2NhcGVDc3NNZXRhKGYpK1wiXFxcXGJcIikpfHwoais9XCIgXCIrZik6aj1mLGEoYikuYXR0cihcImFyaWEtZGVzY3JpYmVkYnlcIixqKSxlPXRoaXMuZ3JvdXBzW2IubmFtZV0sZSYmKGc9dGhpcyxhLmVhY2goZy5ncm91cHMsZnVuY3Rpb24oYixjKXtjPT09ZSYmYShcIltuYW1lPSdcIitnLmVzY2FwZUNzc01ldGEoYikrXCInXVwiLGcuY3VycmVudEZvcm0pLmF0dHIoXCJhcmlhLWRlc2NyaWJlZGJ5XCIsaC5hdHRyKFwiaWRcIikpfSkpKSksIWMmJnRoaXMuc2V0dGluZ3Muc3VjY2VzcyYmKGgudGV4dChcIlwiKSxcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5zZXR0aW5ncy5zdWNjZXNzP2guYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5zdWNjZXNzKTp0aGlzLnNldHRpbmdzLnN1Y2Nlc3MoaCxiKSksdGhpcy50b1Nob3c9dGhpcy50b1Nob3cuYWRkKGgpfSxlcnJvcnNGb3I6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5lc2NhcGVDc3NNZXRhKHRoaXMuaWRPck5hbWUoYikpLGQ9YShiKS5hdHRyKFwiYXJpYS1kZXNjcmliZWRieVwiKSxlPVwibGFiZWxbZm9yPSdcIitjK1wiJ10sIGxhYmVsW2Zvcj0nXCIrYytcIiddICpcIjtyZXR1cm4gZCYmKGU9ZStcIiwgI1wiK3RoaXMuZXNjYXBlQ3NzTWV0YShkKS5yZXBsYWNlKC9cXHMrL2csXCIsICNcIikpLHRoaXMuZXJyb3JzKCkuZmlsdGVyKGUpfSxlc2NhcGVDc3NNZXRhOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoLyhbXFxcXCFcIiMkJSYnKCkqKywuXFwvOjs8PT4/QFxcW1xcXV5ge3x9fl0pL2csXCJcXFxcJDFcIil9LGlkT3JOYW1lOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdyb3Vwc1thLm5hbWVdfHwodGhpcy5jaGVja2FibGUoYSk/YS5uYW1lOmEuaWR8fGEubmFtZSl9LHZhbGlkYXRpb25UYXJnZXRGb3I6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuY2hlY2thYmxlKGIpJiYoYj10aGlzLmZpbmRCeU5hbWUoYi5uYW1lKSksYShiKS5ub3QodGhpcy5zZXR0aW5ncy5pZ25vcmUpWzBdfSxjaGVja2FibGU6ZnVuY3Rpb24oYSl7cmV0dXJuL3JhZGlvfGNoZWNrYm94L2kudGVzdChhLnR5cGUpfSxmaW5kQnlOYW1lOmZ1bmN0aW9uKGIpe3JldHVybiBhKHRoaXMuY3VycmVudEZvcm0pLmZpbmQoXCJbbmFtZT0nXCIrdGhpcy5lc2NhcGVDc3NNZXRhKGIpK1wiJ11cIil9LGdldExlbmd0aDpmdW5jdGlvbihiLGMpe3N3aXRjaChjLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2Nhc2VcInNlbGVjdFwiOnJldHVybiBhKFwib3B0aW9uOnNlbGVjdGVkXCIsYykubGVuZ3RoO2Nhc2VcImlucHV0XCI6aWYodGhpcy5jaGVja2FibGUoYykpcmV0dXJuIHRoaXMuZmluZEJ5TmFtZShjLm5hbWUpLmZpbHRlcihcIjpjaGVja2VkXCIpLmxlbmd0aH1yZXR1cm4gYi5sZW5ndGh9LGRlcGVuZDpmdW5jdGlvbihhLGIpe3JldHVybiF0aGlzLmRlcGVuZFR5cGVzW3R5cGVvZiBhXXx8dGhpcy5kZXBlbmRUeXBlc1t0eXBlb2YgYV0oYSxiKX0sZGVwZW5kVHlwZXM6e1wiYm9vbGVhblwiOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzdHJpbmc6ZnVuY3Rpb24oYixjKXtyZXR1cm4hIWEoYixjLmZvcm0pLmxlbmd0aH0sXCJmdW5jdGlvblwiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEoYil9fSxvcHRpb25hbDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmVsZW1lbnRWYWx1ZShiKTtyZXR1cm4hYS52YWxpZGF0b3IubWV0aG9kcy5yZXF1aXJlZC5jYWxsKHRoaXMsYyxiKSYmXCJkZXBlbmRlbmN5LW1pc21hdGNoXCJ9LHN0YXJ0UmVxdWVzdDpmdW5jdGlvbihiKXt0aGlzLnBlbmRpbmdbYi5uYW1lXXx8KHRoaXMucGVuZGluZ1JlcXVlc3QrKyxhKGIpLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MucGVuZGluZ0NsYXNzKSx0aGlzLnBlbmRpbmdbYi5uYW1lXT0hMCl9LHN0b3BSZXF1ZXN0OmZ1bmN0aW9uKGIsYyl7dGhpcy5wZW5kaW5nUmVxdWVzdC0tLHRoaXMucGVuZGluZ1JlcXVlc3Q8MCYmKHRoaXMucGVuZGluZ1JlcXVlc3Q9MCksZGVsZXRlIHRoaXMucGVuZGluZ1tiLm5hbWVdLGEoYikucmVtb3ZlQ2xhc3ModGhpcy5zZXR0aW5ncy5wZW5kaW5nQ2xhc3MpLGMmJjA9PT10aGlzLnBlbmRpbmdSZXF1ZXN0JiZ0aGlzLmZvcm1TdWJtaXR0ZWQmJnRoaXMuZm9ybSgpPyhhKHRoaXMuY3VycmVudEZvcm0pLnN1Ym1pdCgpLHRoaXMuc3VibWl0QnV0dG9uJiZhKFwiaW5wdXQ6aGlkZGVuW25hbWU9J1wiK3RoaXMuc3VibWl0QnV0dG9uLm5hbWUrXCInXVwiLHRoaXMuY3VycmVudEZvcm0pLnJlbW92ZSgpLHRoaXMuZm9ybVN1Ym1pdHRlZD0hMSk6IWMmJjA9PT10aGlzLnBlbmRpbmdSZXF1ZXN0JiZ0aGlzLmZvcm1TdWJtaXR0ZWQmJihhKHRoaXMuY3VycmVudEZvcm0pLnRyaWdnZXJIYW5kbGVyKFwiaW52YWxpZC1mb3JtXCIsW3RoaXNdKSx0aGlzLmZvcm1TdWJtaXR0ZWQ9ITEpfSxwcmV2aW91c1ZhbHVlOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGM9XCJzdHJpbmdcIj09dHlwZW9mIGMmJmN8fFwicmVtb3RlXCIsYS5kYXRhKGIsXCJwcmV2aW91c1ZhbHVlXCIpfHxhLmRhdGEoYixcInByZXZpb3VzVmFsdWVcIix7b2xkOm51bGwsdmFsaWQ6ITAsbWVzc2FnZTp0aGlzLmRlZmF1bHRNZXNzYWdlKGIse21ldGhvZDpjfSl9KX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMucmVzZXRGb3JtKCksYSh0aGlzLmN1cnJlbnRGb3JtKS5vZmYoXCIudmFsaWRhdGVcIikucmVtb3ZlRGF0YShcInZhbGlkYXRvclwiKS5maW5kKFwiLnZhbGlkYXRlLWVxdWFsVG8tYmx1clwiKS5vZmYoXCIudmFsaWRhdGUtZXF1YWxUb1wiKS5yZW1vdmVDbGFzcyhcInZhbGlkYXRlLWVxdWFsVG8tYmx1clwiKS5maW5kKFwiLnZhbGlkYXRlLWxlc3NUaGFuLWJsdXJcIikub2ZmKFwiLnZhbGlkYXRlLWxlc3NUaGFuXCIpLnJlbW92ZUNsYXNzKFwidmFsaWRhdGUtbGVzc1RoYW4tYmx1clwiKS5maW5kKFwiLnZhbGlkYXRlLWxlc3NUaGFuRXF1YWwtYmx1clwiKS5vZmYoXCIudmFsaWRhdGUtbGVzc1RoYW5FcXVhbFwiKS5yZW1vdmVDbGFzcyhcInZhbGlkYXRlLWxlc3NUaGFuRXF1YWwtYmx1clwiKS5maW5kKFwiLnZhbGlkYXRlLWdyZWF0ZXJUaGFuRXF1YWwtYmx1clwiKS5vZmYoXCIudmFsaWRhdGUtZ3JlYXRlclRoYW5FcXVhbFwiKS5yZW1vdmVDbGFzcyhcInZhbGlkYXRlLWdyZWF0ZXJUaGFuRXF1YWwtYmx1clwiKS5maW5kKFwiLnZhbGlkYXRlLWdyZWF0ZXJUaGFuLWJsdXJcIikub2ZmKFwiLnZhbGlkYXRlLWdyZWF0ZXJUaGFuXCIpLnJlbW92ZUNsYXNzKFwidmFsaWRhdGUtZ3JlYXRlclRoYW4tYmx1clwiKX19LGNsYXNzUnVsZVNldHRpbmdzOntyZXF1aXJlZDp7cmVxdWlyZWQ6ITB9LGVtYWlsOntlbWFpbDohMH0sdXJsOnt1cmw6ITB9LGRhdGU6e2RhdGU6ITB9LGRhdGVJU086e2RhdGVJU086ITB9LG51bWJlcjp7bnVtYmVyOiEwfSxkaWdpdHM6e2RpZ2l0czohMH0sY3JlZGl0Y2FyZDp7Y3JlZGl0Y2FyZDohMH19LGFkZENsYXNzUnVsZXM6ZnVuY3Rpb24oYixjKXtiLmNvbnN0cnVjdG9yPT09U3RyaW5nP3RoaXMuY2xhc3NSdWxlU2V0dGluZ3NbYl09YzphLmV4dGVuZCh0aGlzLmNsYXNzUnVsZVNldHRpbmdzLGIpfSxjbGFzc1J1bGVzOmZ1bmN0aW9uKGIpe3ZhciBjPXt9LGQ9YShiKS5hdHRyKFwiY2xhc3NcIik7cmV0dXJuIGQmJmEuZWFjaChkLnNwbGl0KFwiIFwiKSxmdW5jdGlvbigpe3RoaXMgaW4gYS52YWxpZGF0b3IuY2xhc3NSdWxlU2V0dGluZ3MmJmEuZXh0ZW5kKGMsYS52YWxpZGF0b3IuY2xhc3NSdWxlU2V0dGluZ3NbdGhpc10pfSksY30sbm9ybWFsaXplQXR0cmlidXRlUnVsZTpmdW5jdGlvbihhLGIsYyxkKXsvbWlufG1heHxzdGVwLy50ZXN0KGMpJiYobnVsbD09PWJ8fC9udW1iZXJ8cmFuZ2V8dGV4dC8udGVzdChiKSkmJihkPU51bWJlcihkKSxpc05hTihkKSYmKGQ9dm9pZCAwKSksZHx8MD09PWQ/YVtjXT1kOmI9PT1jJiZcInJhbmdlXCIhPT1iJiYoYVtjXT0hMCl9LGF0dHJpYnV0ZVJ1bGVzOmZ1bmN0aW9uKGIpe3ZhciBjLGQsZT17fSxmPWEoYiksZz1iLmdldEF0dHJpYnV0ZShcInR5cGVcIik7Zm9yKGMgaW4gYS52YWxpZGF0b3IubWV0aG9kcylcInJlcXVpcmVkXCI9PT1jPyhkPWIuZ2V0QXR0cmlidXRlKGMpLFwiXCI9PT1kJiYoZD0hMCksZD0hIWQpOmQ9Zi5hdHRyKGMpLHRoaXMubm9ybWFsaXplQXR0cmlidXRlUnVsZShlLGcsYyxkKTtyZXR1cm4gZS5tYXhsZW5ndGgmJi8tMXwyMTQ3NDgzNjQ3fDUyNDI4OC8udGVzdChlLm1heGxlbmd0aCkmJmRlbGV0ZSBlLm1heGxlbmd0aCxlfSxkYXRhUnVsZXM6ZnVuY3Rpb24oYil7dmFyIGMsZCxlPXt9LGY9YShiKSxnPWIuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtmb3IoYyBpbiBhLnZhbGlkYXRvci5tZXRob2RzKWQ9Zi5kYXRhKFwicnVsZVwiK2MuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKSksXCJcIj09PWQmJihkPSEwKSx0aGlzLm5vcm1hbGl6ZUF0dHJpYnV0ZVJ1bGUoZSxnLGMsZCk7cmV0dXJuIGV9LHN0YXRpY1J1bGVzOmZ1bmN0aW9uKGIpe3ZhciBjPXt9LGQ9YS5kYXRhKGIuZm9ybSxcInZhbGlkYXRvclwiKTtyZXR1cm4gZC5zZXR0aW5ncy5ydWxlcyYmKGM9YS52YWxpZGF0b3Iubm9ybWFsaXplUnVsZShkLnNldHRpbmdzLnJ1bGVzW2IubmFtZV0pfHx7fSksY30sbm9ybWFsaXplUnVsZXM6ZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5lYWNoKGIsZnVuY3Rpb24oZCxlKXtpZihlPT09ITEpcmV0dXJuIHZvaWQgZGVsZXRlIGJbZF07aWYoZS5wYXJhbXx8ZS5kZXBlbmRzKXt2YXIgZj0hMDtzd2l0Y2godHlwZW9mIGUuZGVwZW5kcyl7Y2FzZVwic3RyaW5nXCI6Zj0hIWEoZS5kZXBlbmRzLGMuZm9ybSkubGVuZ3RoO2JyZWFrO2Nhc2VcImZ1bmN0aW9uXCI6Zj1lLmRlcGVuZHMuY2FsbChjLGMpfWY/YltkXT12b2lkIDA9PT1lLnBhcmFtfHxlLnBhcmFtOihhLmRhdGEoYy5mb3JtLFwidmFsaWRhdG9yXCIpLnJlc2V0RWxlbWVudHMoYShjKSksZGVsZXRlIGJbZF0pfX0pLGEuZWFjaChiLGZ1bmN0aW9uKGQsZSl7YltkXT1hLmlzRnVuY3Rpb24oZSkmJlwibm9ybWFsaXplclwiIT09ZD9lKGMpOmV9KSxhLmVhY2goW1wibWlubGVuZ3RoXCIsXCJtYXhsZW5ndGhcIl0sZnVuY3Rpb24oKXtiW3RoaXNdJiYoYlt0aGlzXT1OdW1iZXIoYlt0aGlzXSkpfSksYS5lYWNoKFtcInJhbmdlbGVuZ3RoXCIsXCJyYW5nZVwiXSxmdW5jdGlvbigpe3ZhciBjO2JbdGhpc10mJihhLmlzQXJyYXkoYlt0aGlzXSk/Ylt0aGlzXT1bTnVtYmVyKGJbdGhpc11bMF0pLE51bWJlcihiW3RoaXNdWzFdKV06XCJzdHJpbmdcIj09dHlwZW9mIGJbdGhpc10mJihjPWJbdGhpc10ucmVwbGFjZSgvW1xcW1xcXV0vZyxcIlwiKS5zcGxpdCgvW1xccyxdKy8pLGJbdGhpc109W051bWJlcihjWzBdKSxOdW1iZXIoY1sxXSldKSl9KSxhLnZhbGlkYXRvci5hdXRvQ3JlYXRlUmFuZ2VzJiYobnVsbCE9Yi5taW4mJm51bGwhPWIubWF4JiYoYi5yYW5nZT1bYi5taW4sYi5tYXhdLGRlbGV0ZSBiLm1pbixkZWxldGUgYi5tYXgpLG51bGwhPWIubWlubGVuZ3RoJiZudWxsIT1iLm1heGxlbmd0aCYmKGIucmFuZ2VsZW5ndGg9W2IubWlubGVuZ3RoLGIubWF4bGVuZ3RoXSxkZWxldGUgYi5taW5sZW5ndGgsZGVsZXRlIGIubWF4bGVuZ3RoKSksYn0sbm9ybWFsaXplUnVsZTpmdW5jdGlvbihiKXtpZihcInN0cmluZ1wiPT10eXBlb2YgYil7dmFyIGM9e307YS5lYWNoKGIuc3BsaXQoL1xccy8pLGZ1bmN0aW9uKCl7Y1t0aGlzXT0hMH0pLGI9Y31yZXR1cm4gYn0sYWRkTWV0aG9kOmZ1bmN0aW9uKGIsYyxkKXthLnZhbGlkYXRvci5tZXRob2RzW2JdPWMsYS52YWxpZGF0b3IubWVzc2FnZXNbYl09dm9pZCAwIT09ZD9kOmEudmFsaWRhdG9yLm1lc3NhZ2VzW2JdLGMubGVuZ3RoPDMmJmEudmFsaWRhdG9yLmFkZENsYXNzUnVsZXMoYixhLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlKGIpKX0sbWV0aG9kczp7cmVxdWlyZWQ6ZnVuY3Rpb24oYixjLGQpe2lmKCF0aGlzLmRlcGVuZChkLGMpKXJldHVyblwiZGVwZW5kZW5jeS1taXNtYXRjaFwiO2lmKFwic2VsZWN0XCI9PT1jLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBlPWEoYykudmFsKCk7cmV0dXJuIGUmJmUubGVuZ3RoPjB9cmV0dXJuIHRoaXMuY2hlY2thYmxlKGMpP3RoaXMuZ2V0TGVuZ3RoKGIsYyk+MDp2b2lkIDAhPT1iJiZudWxsIT09YiYmYi5sZW5ndGg+MH0sZW1haWw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vcHRpb25hbChiKXx8L15bYS16QS1aMC05LiEjJCUmJyorXFwvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8udGVzdChhKX0sdXJsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub3B0aW9uYWwoYil8fC9eKD86KD86KD86aHR0cHM/fGZ0cCk6KT9cXC9cXC8pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzooPyEoPzoxMHwxMjcpKD86XFwuXFxkezEsM30pezN9KSg/ISg/OjE2OVxcLjI1NHwxOTJcXC4xNjgpKD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXpcXHUwMGExLVxcdWZmZmYwLTldLSopKlthLXpcXHUwMGExLVxcdWZmZmYwLTldKykoPzpcXC4oPzpbYS16XFx1MDBhMS1cXHVmZmZmMC05XS0qKSpbYS16XFx1MDBhMS1cXHVmZmZmMC05XSspKig/OlxcLig/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfSkpLj8pKD86OlxcZHsyLDV9KT8oPzpbXFwvPyNdXFxTKik/JC9pLnRlc3QoYSl9LGRhdGU6ZnVuY3Rpb24oKXt2YXIgYT0hMTtyZXR1cm4gZnVuY3Rpb24oYixjKXtyZXR1cm4gYXx8KGE9ITAsdGhpcy5zZXR0aW5ncy5kZWJ1ZyYmd2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2FybihcIlRoZSBgZGF0ZWAgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uICcyLjAuMCcuXFxuUGxlYXNlIGRvbid0IHVzZSBpdCwgc2luY2UgaXQgcmVsaWVzIG9uIHRoZSBEYXRlIGNvbnN0cnVjdG9yLCB3aGljaFxcbmJlaGF2ZXMgdmVyeSBkaWZmZXJlbnRseSBhY3Jvc3MgYnJvd3NlcnMgYW5kIGxvY2FsZXMuIFVzZSBgZGF0ZUlTT2BcXG5pbnN0ZWFkIG9yIG9uZSBvZiB0aGUgbG9jYWxlIHNwZWNpZmljIG1ldGhvZHMgaW4gYGxvY2FsaXphdGlvbnMvYFxcbmFuZCBgYWRkaXRpb25hbC1tZXRob2RzLmpzYC5cIikpLHRoaXMub3B0aW9uYWwoYyl8fCEvSW52YWxpZHxOYU4vLnRlc3QobmV3IERhdGUoYikudG9TdHJpbmcoKSl9fSgpLGRhdGVJU086ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vcHRpb25hbChiKXx8L15cXGR7NH1bXFwvXFwtXSgwP1sxLTldfDFbMDEyXSlbXFwvXFwtXSgwP1sxLTldfFsxMl1bMC05XXwzWzAxXSkkLy50ZXN0KGEpfSxudW1iZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vcHRpb25hbChiKXx8L14oPzotP1xcZCt8LT9cXGR7MSwzfSg/OixcXGR7M30pKyk/KD86XFwuXFxkKyk/JC8udGVzdChhKX0sZGlnaXRzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub3B0aW9uYWwoYil8fC9eXFxkKyQvLnRlc3QoYSl9LG1pbmxlbmd0aDpmdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5pc0FycmF5KGIpP2IubGVuZ3RoOnRoaXMuZ2V0TGVuZ3RoKGIsYyk7cmV0dXJuIHRoaXMub3B0aW9uYWwoYyl8fGU+PWR9LG1heGxlbmd0aDpmdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5pc0FycmF5KGIpP2IubGVuZ3RoOnRoaXMuZ2V0TGVuZ3RoKGIsYyk7cmV0dXJuIHRoaXMub3B0aW9uYWwoYyl8fGU8PWR9LHJhbmdlbGVuZ3RoOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmlzQXJyYXkoYik/Yi5sZW5ndGg6dGhpcy5nZXRMZW5ndGgoYixjKTtyZXR1cm4gdGhpcy5vcHRpb25hbChjKXx8ZT49ZFswXSYmZTw9ZFsxXX0sbWluOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vcHRpb25hbChiKXx8YT49Y30sbWF4OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vcHRpb25hbChiKXx8YTw9Y30scmFuZ2U6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9wdGlvbmFsKGIpfHxhPj1jWzBdJiZhPD1jWzFdfSxzdGVwOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmPWEoYykuYXR0cihcInR5cGVcIiksZz1cIlN0ZXAgYXR0cmlidXRlIG9uIGlucHV0IHR5cGUgXCIrZitcIiBpcyBub3Qgc3VwcG9ydGVkLlwiLGg9W1widGV4dFwiLFwibnVtYmVyXCIsXCJyYW5nZVwiXSxpPW5ldyBSZWdFeHAoXCJcXFxcYlwiK2YrXCJcXFxcYlwiKSxqPWYmJiFpLnRlc3QoaC5qb2luKCkpLGs9ZnVuY3Rpb24oYSl7dmFyIGI9KFwiXCIrYSkubWF0Y2goLyg/OlxcLihcXGQrKSk/JC8pO3JldHVybiBiJiZiWzFdP2JbMV0ubGVuZ3RoOjB9LGw9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoYSpNYXRoLnBvdygxMCxlKSl9LG09ITA7aWYoail0aHJvdyBuZXcgRXJyb3IoZyk7cmV0dXJuIGU9ayhkKSwoayhiKT5lfHxsKGIpJWwoZCkhPT0wKSYmKG09ITEpLHRoaXMub3B0aW9uYWwoYyl8fG19LGVxdWFsVG86ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEoZCk7cmV0dXJuIHRoaXMuc2V0dGluZ3Mub25mb2N1c291dCYmZS5ub3QoXCIudmFsaWRhdGUtZXF1YWxUby1ibHVyXCIpLmxlbmd0aCYmZS5hZGRDbGFzcyhcInZhbGlkYXRlLWVxdWFsVG8tYmx1clwiKS5vbihcImJsdXIudmFsaWRhdGUtZXF1YWxUb1wiLGZ1bmN0aW9uKCl7YShjKS52YWxpZCgpfSksYj09PWUudmFsKCl9LHJlbW90ZTpmdW5jdGlvbihiLGMsZCxlKXtpZih0aGlzLm9wdGlvbmFsKGMpKXJldHVyblwiZGVwZW5kZW5jeS1taXNtYXRjaFwiO2U9XCJzdHJpbmdcIj09dHlwZW9mIGUmJmV8fFwicmVtb3RlXCI7dmFyIGYsZyxoLGk9dGhpcy5wcmV2aW91c1ZhbHVlKGMsZSk7cmV0dXJuIHRoaXMuc2V0dGluZ3MubWVzc2FnZXNbYy5uYW1lXXx8KHRoaXMuc2V0dGluZ3MubWVzc2FnZXNbYy5uYW1lXT17fSksaS5vcmlnaW5hbE1lc3NhZ2U9aS5vcmlnaW5hbE1lc3NhZ2V8fHRoaXMuc2V0dGluZ3MubWVzc2FnZXNbYy5uYW1lXVtlXSx0aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2MubmFtZV1bZV09aS5tZXNzYWdlLGQ9XCJzdHJpbmdcIj09dHlwZW9mIGQmJnt1cmw6ZH18fGQsaD1hLnBhcmFtKGEuZXh0ZW5kKHtkYXRhOmJ9LGQuZGF0YSkpLGkub2xkPT09aD9pLnZhbGlkOihpLm9sZD1oLGY9dGhpcyx0aGlzLnN0YXJ0UmVxdWVzdChjKSxnPXt9LGdbYy5uYW1lXT1iLGEuYWpheChhLmV4dGVuZCghMCx7bW9kZTpcImFib3J0XCIscG9ydDpcInZhbGlkYXRlXCIrYy5uYW1lLGRhdGFUeXBlOlwianNvblwiLGRhdGE6Zyxjb250ZXh0OmYuY3VycmVudEZvcm0sc3VjY2VzczpmdW5jdGlvbihhKXt2YXIgZCxnLGgsaj1hPT09ITB8fFwidHJ1ZVwiPT09YTtmLnNldHRpbmdzLm1lc3NhZ2VzW2MubmFtZV1bZV09aS5vcmlnaW5hbE1lc3NhZ2Usaj8oaD1mLmZvcm1TdWJtaXR0ZWQsZi5yZXNldEludGVybmFscygpLGYudG9IaWRlPWYuZXJyb3JzRm9yKGMpLGYuZm9ybVN1Ym1pdHRlZD1oLGYuc3VjY2Vzc0xpc3QucHVzaChjKSxmLmludmFsaWRbYy5uYW1lXT0hMSxmLnNob3dFcnJvcnMoKSk6KGQ9e30sZz1hfHxmLmRlZmF1bHRNZXNzYWdlKGMse21ldGhvZDplLHBhcmFtZXRlcnM6Yn0pLGRbYy5uYW1lXT1pLm1lc3NhZ2U9ZyxmLmludmFsaWRbYy5uYW1lXT0hMCxmLnNob3dFcnJvcnMoZCkpLGkudmFsaWQ9aixmLnN0b3BSZXF1ZXN0KGMsail9fSxkKSksXCJwZW5kaW5nXCIpfX19KTt2YXIgYixjPXt9O3JldHVybiBhLmFqYXhQcmVmaWx0ZXI/YS5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGEsYixkKXt2YXIgZT1hLnBvcnQ7XCJhYm9ydFwiPT09YS5tb2RlJiYoY1tlXSYmY1tlXS5hYm9ydCgpLGNbZV09ZCl9KTooYj1hLmFqYXgsYS5hamF4PWZ1bmN0aW9uKGQpe3ZhciBlPShcIm1vZGVcImluIGQ/ZDphLmFqYXhTZXR0aW5ncykubW9kZSxmPShcInBvcnRcImluIGQ/ZDphLmFqYXhTZXR0aW5ncykucG9ydDtyZXR1cm5cImFib3J0XCI9PT1lPyhjW2ZdJiZjW2ZdLmFib3J0KCksY1tmXT1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjW2ZdKTpiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGF9KTsiLCIvKiEgS2luZXRpY0pTIHY1LjEuMCAyMDE0LTAzLTI3IGh0dHA6Ly93d3cua2luZXRpY2pzLmNvbSBieSBFcmljIFJvd2VsbCBAZXJpY2Ryb3dlbGwgLSBNSVQgTGljZW5zZSBodHRwczovL2dpdGh1Yi5jb20vZXJpY2Ryb3dlbGwvS2luZXRpY0pTL3dpa2kvTGljZW5zZSovXHJcbnZhciBLaW5ldGljPXt9OyFmdW5jdGlvbihhKXt2YXIgYj1NYXRoLlBJLzE4MDtLaW5ldGljPXt2ZXJzaW9uOlwiNS4xLjBcIixzdGFnZXM6W10saWRDb3VudGVyOjAsaWRzOnt9LG5hbWVzOnt9LHNoYXBlczp7fSxsaXN0ZW5DbGlja1RhcDohMSxpbkRibENsaWNrV2luZG93OiExLGVuYWJsZVRyYWNlOiExLHRyYWNlQXJyTWF4OjEwMCxkYmxDbGlja1dpbmRvdzo0MDAscGl4ZWxSYXRpbzp2b2lkIDAsZHJhZ0Rpc3RhbmNlOjAsYW5nbGVEZWc6ITAsVUE6ZnVuY3Rpb24oKXt2YXIgYj1hLm5hdmlnYXRvciYmYS5uYXZpZ2F0b3IudXNlckFnZW50fHxcIlwiLGM9Yi50b0xvd2VyQ2FzZSgpLGQ9LyhjaHJvbWUpWyBcXC9dKFtcXHcuXSspLy5leGVjKGMpfHwvKHdlYmtpdClbIFxcL10oW1xcdy5dKykvLmV4ZWMoYyl8fC8ob3BlcmEpKD86Lip2ZXJzaW9ufClbIFxcL10oW1xcdy5dKykvLmV4ZWMoYyl8fC8obXNpZSkgKFtcXHcuXSspLy5leGVjKGMpfHxjLmluZGV4T2YoXCJjb21wYXRpYmxlXCIpPDAmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcXHcuXSspfCkvLmV4ZWMoYyl8fFtdLGU9ISFiLm1hdGNoKC9BbmRyb2lkfEJsYWNrQmVycnl8aVBob25lfGlQYWR8aVBvZHxPcGVyYSBNaW5pfElFTW9iaWxlL2kpO3JldHVybnticm93c2VyOmRbMV18fFwiXCIsdmVyc2lvbjpkWzJdfHxcIjBcIixtb2JpbGU6ZX19KCksRmlsdGVyczp7fSxOb2RlOmZ1bmN0aW9uKGEpe3RoaXMuX2luaXQoYSl9LFNoYXBlOmZ1bmN0aW9uKGEpe3RoaXMuX19pbml0KGEpfSxDb250YWluZXI6ZnVuY3Rpb24oYSl7dGhpcy5fX2luaXQoYSl9LFN0YWdlOmZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0sQmFzZUxheWVyOmZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0sTGF5ZXI6ZnVuY3Rpb24oYSl7dGhpcy5fX19faW5pdChhKX0sRmFzdExheWVyOmZ1bmN0aW9uKGEpe3RoaXMuX19fX2luaXQoYSl9LEdyb3VwOmZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0saXNEcmFnZ2luZzpmdW5jdGlvbigpe3ZhciBhPUtpbmV0aWMuREQ7cmV0dXJuIGE/YS5pc0RyYWdnaW5nOiExfSxpc0RyYWdSZWFkeTpmdW5jdGlvbigpe3ZhciBhPUtpbmV0aWMuREQ7cmV0dXJuIGE/ISFhLm5vZGU6ITF9LF9hZGRJZDpmdW5jdGlvbihhLGIpe3ZvaWQgMCE9PWImJih0aGlzLmlkc1tiXT1hKX0sX3JlbW92ZUlkOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEmJmRlbGV0ZSB0aGlzLmlkc1thXX0sX2FkZE5hbWU6ZnVuY3Rpb24oYSxiKXt2b2lkIDAhPT1iJiYodm9pZCAwPT09dGhpcy5uYW1lc1tiXSYmKHRoaXMubmFtZXNbYl09W10pLHRoaXMubmFtZXNbYl0ucHVzaChhKSl9LF9yZW1vdmVOYW1lOmZ1bmN0aW9uKGEsYil7aWYodm9pZCAwIT09YSl7dmFyIGM9dGhpcy5uYW1lc1thXTtpZih2b2lkIDAhPT1jKXtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTtlLl9pZD09PWImJmMuc3BsaWNlKGQsMSl9MD09PWMubGVuZ3RoJiZkZWxldGUgdGhpcy5uYW1lc1thXX19fSxnZXRBbmdsZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hbmdsZURlZz9hKmI6YX19fSh0aGlzKSxmdW5jdGlvbihhLGIpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzKXt2YXIgYz1yZXF1aXJlKFwiY2FudmFzXCIpLGQ9cmVxdWlyZShcImpzZG9tXCIpLmpzZG9tLGU9ZChcIjwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjwvaGVhZD48Ym9keT48L2JvZHk+PC9odG1sPlwiKSxmPWIoKTtyZXR1cm4gS2luZXRpYy5kb2N1bWVudD1lLEtpbmV0aWMud2luZG93PUtpbmV0aWMuZG9jdW1lbnQuY3JlYXRlV2luZG93KCksS2luZXRpYy53aW5kb3cuSW1hZ2U9Yy5JbWFnZSxLaW5ldGljLnJvb3Q9YSxLaW5ldGljLl9ub2RlQ2FudmFzPWMsdm9pZChtb2R1bGUuZXhwb3J0cz1mKX1cImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShiKSxLaW5ldGljLmRvY3VtZW50PWRvY3VtZW50LEtpbmV0aWMud2luZG93PXdpbmRvdyxLaW5ldGljLnJvb3Q9YX0oKDEsZXZhbCkoXCJ0aGlzXCIpLGZ1bmN0aW9uKCl7cmV0dXJuIEtpbmV0aWN9KSxmdW5jdGlvbigpe0tpbmV0aWMuQ29sbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBhPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxiPWEubGVuZ3RoLGM9MDtmb3IodGhpcy5sZW5ndGg9YjtiPmM7YysrKXRoaXNbY109YVtjXTtyZXR1cm4gdGhpc30sS2luZXRpYy5Db2xsZWN0aW9uLnByb3RvdHlwZT1bXSxLaW5ldGljLkNvbGxlY3Rpb24ucHJvdG90eXBlLmVhY2g9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxlbmd0aDtiKyspYSh0aGlzW2JdLGIpfSxLaW5ldGljLkNvbGxlY3Rpb24ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXt2YXIgYSxiPVtdLGM9dGhpcy5sZW5ndGg7Zm9yKGE9MDtjPmE7YSsrKWIucHVzaCh0aGlzW2FdKTtyZXR1cm4gYn0sS2luZXRpYy5Db2xsZWN0aW9uLnRvQ29sbGVjdGlvbj1mdW5jdGlvbihhKXt2YXIgYixjPW5ldyBLaW5ldGljLkNvbGxlY3Rpb24sZD1hLmxlbmd0aDtmb3IoYj0wO2Q+YjtiKyspYy5wdXNoKGFbYl0pO3JldHVybiBjfSxLaW5ldGljLkNvbGxlY3Rpb24uX21hcE1ldGhvZD1mdW5jdGlvbihhKXtLaW5ldGljLkNvbGxlY3Rpb24ucHJvdG90eXBlW2FdPWZ1bmN0aW9uKCl7dmFyIGIsYz10aGlzLmxlbmd0aCxkPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtmb3IoYj0wO2M+YjtiKyspdGhpc1tiXVthXS5hcHBseSh0aGlzW2JdLGQpO3JldHVybiB0aGlzfX0sS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHM9ZnVuY3Rpb24oYSl7dmFyIGI9YS5wcm90b3R5cGU7Zm9yKHZhciBjIGluIGIpS2luZXRpYy5Db2xsZWN0aW9uLl9tYXBNZXRob2QoYyl9LEtpbmV0aWMuVHJhbnNmb3JtPWZ1bmN0aW9uKGEpe3RoaXMubT1hJiZhLnNsaWNlKCl8fFsxLDAsMCwxLDAsMF19LEtpbmV0aWMuVHJhbnNmb3JtLnByb3RvdHlwZT17Y29weTpmdW5jdGlvbigpe3JldHVybiBuZXcgS2luZXRpYy5UcmFuc2Zvcm0odGhpcy5tKX0scG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tO3JldHVybnt4OmJbMF0qYS54K2JbMl0qYS55K2JbNF0seTpiWzFdKmEueCtiWzNdKmEueStiWzVdfX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubVs0XSs9dGhpcy5tWzBdKmErdGhpcy5tWzJdKmIsdGhpcy5tWzVdKz10aGlzLm1bMV0qYSt0aGlzLm1bM10qYix0aGlzfSxzY2FsZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1bMF0qPWEsdGhpcy5tWzFdKj1hLHRoaXMubVsyXSo9Yix0aGlzLm1bM10qPWIsdGhpc30scm90YXRlOmZ1bmN0aW9uKGEpe3ZhciBiPU1hdGguY29zKGEpLGM9TWF0aC5zaW4oYSksZD10aGlzLm1bMF0qYit0aGlzLm1bMl0qYyxlPXRoaXMubVsxXSpiK3RoaXMubVszXSpjLGY9dGhpcy5tWzBdKi1jK3RoaXMubVsyXSpiLGc9dGhpcy5tWzFdKi1jK3RoaXMubVszXSpiO3JldHVybiB0aGlzLm1bMF09ZCx0aGlzLm1bMV09ZSx0aGlzLm1bMl09Zix0aGlzLm1bM109Zyx0aGlzfSxnZXRUcmFuc2xhdGlvbjpmdW5jdGlvbigpe3JldHVybnt4OnRoaXMubVs0XSx5OnRoaXMubVs1XX19LHNrZXc6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLm1bMF0rdGhpcy5tWzJdKmIsZD10aGlzLm1bMV0rdGhpcy5tWzNdKmIsZT10aGlzLm1bMl0rdGhpcy5tWzBdKmEsZj10aGlzLm1bM10rdGhpcy5tWzFdKmE7cmV0dXJuIHRoaXMubVswXT1jLHRoaXMubVsxXT1kLHRoaXMubVsyXT1lLHRoaXMubVszXT1mLHRoaXN9LG11bHRpcGx5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubVswXSphLm1bMF0rdGhpcy5tWzJdKmEubVsxXSxjPXRoaXMubVsxXSphLm1bMF0rdGhpcy5tWzNdKmEubVsxXSxkPXRoaXMubVswXSphLm1bMl0rdGhpcy5tWzJdKmEubVszXSxlPXRoaXMubVsxXSphLm1bMl0rdGhpcy5tWzNdKmEubVszXSxmPXRoaXMubVswXSphLm1bNF0rdGhpcy5tWzJdKmEubVs1XSt0aGlzLm1bNF0sZz10aGlzLm1bMV0qYS5tWzRdK3RoaXMubVszXSphLm1bNV0rdGhpcy5tWzVdO3JldHVybiB0aGlzLm1bMF09Yix0aGlzLm1bMV09Yyx0aGlzLm1bMl09ZCx0aGlzLm1bM109ZSx0aGlzLm1bNF09Zix0aGlzLm1bNV09Zyx0aGlzfSxpbnZlcnQ6ZnVuY3Rpb24oKXt2YXIgYT0xLyh0aGlzLm1bMF0qdGhpcy5tWzNdLXRoaXMubVsxXSp0aGlzLm1bMl0pLGI9dGhpcy5tWzNdKmEsYz0tdGhpcy5tWzFdKmEsZD0tdGhpcy5tWzJdKmEsZT10aGlzLm1bMF0qYSxmPWEqKHRoaXMubVsyXSp0aGlzLm1bNV0tdGhpcy5tWzNdKnRoaXMubVs0XSksZz1hKih0aGlzLm1bMV0qdGhpcy5tWzRdLXRoaXMubVswXSp0aGlzLm1bNV0pO3JldHVybiB0aGlzLm1bMF09Yix0aGlzLm1bMV09Yyx0aGlzLm1bMl09ZCx0aGlzLm1bM109ZSx0aGlzLm1bNF09Zix0aGlzLm1bNV09Zyx0aGlzfSxnZXRNYXRyaXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tfSxzZXRBYnNvbHV0ZVBvc2l0aW9uOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5tWzBdLGQ9dGhpcy5tWzFdLGU9dGhpcy5tWzJdLGY9dGhpcy5tWzNdLGc9dGhpcy5tWzRdLGg9dGhpcy5tWzVdLGk9KGMqKGItaCktZCooYS1nKSkvKGMqZi1kKmUpLGo9KGEtZy1lKmkpL2M7cmV0dXJuIHRoaXMudHJhbnNsYXRlKGosaSl9fTt2YXIgYT1cIjJkXCIsYj1cIltvYmplY3QgQXJyYXldXCIsYz1cIltvYmplY3QgTnVtYmVyXVwiLGQ9XCJbb2JqZWN0IFN0cmluZ11cIixlPU1hdGguUEkvMTgwLGY9MTgwL01hdGguUEksZz1cIiNcIixoPVwiXCIsaT1cIjBcIixqPVwiS2luZXRpYyB3YXJuaW5nOiBcIixrPVwiS2luZXRpYyBlcnJvcjogXCIsbD1cInJnYihcIixtPXthcXVhOlswLDI1NSwyNTVdLGxpbWU6WzAsMjU1LDBdLHNpbHZlcjpbMTkyLDE5MiwxOTJdLGJsYWNrOlswLDAsMF0sbWFyb29uOlsxMjgsMCwwXSx0ZWFsOlswLDEyOCwxMjhdLGJsdWU6WzAsMCwyNTVdLG5hdnk6WzAsMCwxMjhdLHdoaXRlOlsyNTUsMjU1LDI1NV0sZnVjaHNpYTpbMjU1LDAsMjU1XSxvbGl2ZTpbMTI4LDEyOCwwXSx5ZWxsb3c6WzI1NSwyNTUsMF0sb3JhbmdlOlsyNTUsMTY1LDBdLGdyYXk6WzEyOCwxMjgsMTI4XSxwdXJwbGU6WzEyOCwwLDEyOF0sZ3JlZW46WzAsMTI4LDBdLHJlZDpbMjU1LDAsMF0scGluazpbMjU1LDE5MiwyMDNdLGN5YW46WzAsMjU1LDI1NV0sdHJhbnNwYXJlbnQ6WzI1NSwyNTUsMjU1LDBdfSxuPS9yZ2JcXCgoXFxkezEsM30pLChcXGR7MSwzfSksKFxcZHsxLDN9KVxcKS87S2luZXRpYy5VdGlsPXtfaXNFbGVtZW50OmZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fDEhPWEubm9kZVR5cGUpfSxfaXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4hIShhJiZhLmNvbnN0cnVjdG9yJiZhLmNhbGwmJmEuYXBwbHkpfSxfaXNPYmplY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiZhLmNvbnN0cnVjdG9yPT1PYmplY3R9LF9pc0FycmF5OmZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk9PWJ9LF9pc051bWJlcjpmdW5jdGlvbihhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpPT1jfSxfaXNTdHJpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKT09ZH0sX3Rocm90dGxlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1udWxsLGg9MDtjfHwoYz17fSk7dmFyIGk9ZnVuY3Rpb24oKXtoPWMubGVhZGluZz09PSExPzA6KG5ldyBEYXRlKS5nZXRUaW1lKCksZz1udWxsLGY9YS5hcHBseShkLGUpLGQ9ZT1udWxsfTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaj0obmV3IERhdGUpLmdldFRpbWUoKTtofHxjLmxlYWRpbmchPT0hMXx8KGg9aik7dmFyIGs9Yi0oai1oKTtyZXR1cm4gZD10aGlzLGU9YXJndW1lbnRzLDA+PWs/KGNsZWFyVGltZW91dChnKSxnPW51bGwsaD1qLGY9YS5hcHBseShkLGUpLGQ9ZT1udWxsKTpnfHxjLnRyYWlsaW5nPT09ITF8fChnPXNldFRpbWVvdXQoaSxrKSksZn19LF9oYXNNZXRob2RzOmZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGIgaW4gYSl0aGlzLl9pc0Z1bmN0aW9uKGFbYl0pJiZjLnB1c2goYik7cmV0dXJuIGMubGVuZ3RoPjB9LGNyZWF0ZUNhbnZhc0VsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgYT1LaW5ldGljLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7cmV0dXJuIGEuc3R5bGU9YS5zdHlsZXx8e30sYX0saXNCcm93c2VyOmZ1bmN0aW9uKCl7cmV0dXJuXCJvYmplY3RcIiE9dHlwZW9mIGV4cG9ydHN9LF9pc0luRG9jdW1lbnQ6ZnVuY3Rpb24oYSl7Zm9yKDthPWEucGFyZW50Tm9kZTspaWYoYT09S2luZXRpYy5kb2N1bWVudClyZXR1cm4hMDtyZXR1cm4hMX0sX3NpbXBsaWZ5QXJyYXk6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPVtdLGU9YS5sZW5ndGgsZj1LaW5ldGljLlV0aWw7Zm9yKGI9MDtlPmI7YisrKWM9YVtiXSxmLl9pc051bWJlcihjKT9jPU1hdGgucm91bmQoMWUzKmMpLzFlMzpmLl9pc1N0cmluZyhjKXx8KGM9Yy50b1N0cmluZygpKSxkLnB1c2goYyk7cmV0dXJuIGR9LF9nZXRJbWFnZTpmdW5jdGlvbihiLGMpe3ZhciBkLGU7aWYoYilpZih0aGlzLl9pc0VsZW1lbnQoYikpYyhiKTtlbHNlIGlmKHRoaXMuX2lzU3RyaW5nKGIpKWQ9bmV3IEtpbmV0aWMud2luZG93LkltYWdlLGQub25sb2FkPWZ1bmN0aW9uKCl7YyhkKX0sZC5zcmM9YjtlbHNlIGlmKGIuZGF0YSl7ZT1LaW5ldGljLlV0aWwuY3JlYXRlQ2FudmFzRWxlbWVudCgpLGUud2lkdGg9Yi53aWR0aCxlLmhlaWdodD1iLmhlaWdodDt2YXIgZj1lLmdldENvbnRleHQoYSk7Zi5wdXRJbWFnZURhdGEoYiwwLDApLHRoaXMuX2dldEltYWdlKGUudG9EYXRhVVJMKCksYyl9ZWxzZSBjKG51bGwpO2Vsc2UgYyhudWxsKX0sX2dldFJHQkFTdHJpbmc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZWR8fDAsYz1hLmdyZWVufHwwLGQ9YS5ibHVlfHwwLGU9YS5hbHBoYXx8MTtyZXR1cm5bXCJyZ2JhKFwiLGIsXCIsXCIsYyxcIixcIixkLFwiLFwiLGUsXCIpXCJdLmpvaW4oaCl9LF9yZ2JUb0hleDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuKCgxPDwyNCkrKGE8PDE2KSsoYjw8OCkrYykudG9TdHJpbmcoMTYpLnNsaWNlKDEpfSxfaGV4VG9SZ2I6ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoZyxoKTt2YXIgYj1wYXJzZUludChhLDE2KTtyZXR1cm57cjpiPj4xNiYyNTUsZzpiPj44JjI1NSxiOjI1NSZifX0sZ2V0UmFuZG9tQ29sb3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9KDE2Nzc3MjE1Kk1hdGgucmFuZG9tKCk8PDApLnRvU3RyaW5nKDE2KTthLmxlbmd0aDw2OylhPWkrYTtyZXR1cm4gZythfSxnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwPT09YT9iOmF9LGdldFJHQjpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSBpbiBtPyhiPW1bYV0se3I6YlswXSxnOmJbMV0sYjpiWzJdfSk6YVswXT09PWc/dGhpcy5faGV4VG9SZ2IoYS5zdWJzdHJpbmcoMSkpOmEuc3Vic3RyKDAsNCk9PT1sPyhiPW4uZXhlYyhhLnJlcGxhY2UoLyAvZyxcIlwiKSkse3I6cGFyc2VJbnQoYlsxXSwxMCksZzpwYXJzZUludChiWzJdLDEwKSxiOnBhcnNlSW50KGJbM10sMTApfSk6e3I6MCxnOjAsYjowfX0sX21lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2xvbmUoYik7Zm9yKHZhciBkIGluIGEpY1tkXT10aGlzLl9pc09iamVjdChhW2RdKT90aGlzLl9tZXJnZShhW2RdLGNbZF0pOmFbZF07cmV0dXJuIGN9LGNsb25lT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109dGhpcy5faXNPYmplY3QoYVtjXSk/dGhpcy5jbG9uZU9iamVjdChhW2NdKTp0aGlzLl9pc0FycmF5KGFbY10pP3RoaXMuY2xvbmVBcnJheShhW2NdKTphW2NdO3JldHVybiBifSxjbG9uZUFycmF5OmZ1bmN0aW9uKGEpe3JldHVybiBhLnNsaWNlKDApfSxfZGVnVG9SYWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqZX0sX3JhZFRvRGVnOmZ1bmN0aW9uKGEpe3JldHVybiBhKmZ9LF9jYXBpdGFsaXplOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Euc2xpY2UoMSl9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihrK2EpfSx3YXJuOmZ1bmN0aW9uKGEpe0tpbmV0aWMucm9vdC5jb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybihqK2EpfSxleHRlbmQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMgaW4gYi5wcm90b3R5cGUpYyBpbiBhLnByb3RvdHlwZXx8KGEucHJvdG90eXBlW2NdPWIucHJvdG90eXBlW2NdKX0sYWRkTWV0aG9kczpmdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjIGluIGIpYS5wcm90b3R5cGVbY109YltjXX0sX2dldENvbnRyb2xQb2ludHM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9TWF0aC5zcXJ0KE1hdGgucG93KGMtYSwyKStNYXRoLnBvdyhkLWIsMikpLGk9TWF0aC5zcXJ0KE1hdGgucG93KGUtYywyKStNYXRoLnBvdyhmLWQsMikpLGo9ZypoLyhoK2kpLGs9ZyppLyhoK2kpLGw9Yy1qKihlLWEpLG09ZC1qKihmLWIpLG49YytrKihlLWEpLG89ZCtrKihmLWIpO3JldHVybltsLG0sbixvXX0sX2V4cGFuZFBvaW50czpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLmxlbmd0aCxmPVtdO2ZvcihjPTI7ZS0yPmM7Yys9MilkPUtpbmV0aWMuVXRpbC5fZ2V0Q29udHJvbFBvaW50cyhhW2MtMl0sYVtjLTFdLGFbY10sYVtjKzFdLGFbYysyXSxhW2MrM10sYiksZi5wdXNoKGRbMF0pLGYucHVzaChkWzFdKSxmLnB1c2goYVtjXSksZi5wdXNoKGFbYysxXSksZi5wdXNoKGRbMl0pLGYucHVzaChkWzNdKTtyZXR1cm4gZn0sX3JlbW92ZUxhc3RMZXR0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3Vic3RyaW5nKDAsYS5sZW5ndGgtMSl9fX0oKSxmdW5jdGlvbigpe3ZhciBhPUtpbmV0aWMuVXRpbC5jcmVhdGVDYW52YXNFbGVtZW50KCksYj1hLmdldENvbnRleHQoXCIyZFwiKSxjPUtpbmV0aWMuVUEubW9iaWxlP2Z1bmN0aW9uKCl7dmFyIGE9d2luZG93LmRldmljZVBpeGVsUmF0aW98fDEsYz1iLndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGIubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8Yi5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGIub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGIuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MTtyZXR1cm4gYS9jfSgpOjE7S2luZXRpYy5DYW52YXM9ZnVuY3Rpb24oYSl7dGhpcy5pbml0KGEpfSxLaW5ldGljLkNhbnZhcy5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oYSl7YT1hfHx7fTt2YXIgYj1hLnBpeGVsUmF0aW98fEtpbmV0aWMucGl4ZWxSYXRpb3x8Yzt0aGlzLnBpeGVsUmF0aW89Yix0aGlzLl9jYW52YXM9S2luZXRpYy5VdGlsLmNyZWF0ZUNhbnZhc0VsZW1lbnQoKSx0aGlzLl9jYW52YXMuc3R5bGUucGFkZGluZz0wLHRoaXMuX2NhbnZhcy5zdHlsZS5tYXJnaW49MCx0aGlzLl9jYW52YXMuc3R5bGUuYm9yZGVyPTAsdGhpcy5fY2FudmFzLnN0eWxlLmJhY2tncm91bmQ9XCJ0cmFuc3BhcmVudFwiLHRoaXMuX2NhbnZhcy5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdGhpcy5fY2FudmFzLnN0eWxlLnRvcD0wLHRoaXMuX2NhbnZhcy5zdHlsZS5sZWZ0PTB9LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZXh0fSxnZXRQaXhlbFJhdGlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGl4ZWxSYXRpb30sc2V0UGl4ZWxSYXRpbzpmdW5jdGlvbihhKXt0aGlzLnBpeGVsUmF0aW89YSx0aGlzLnNldFNpemUodGhpcy5nZXRXaWR0aCgpLHRoaXMuZ2V0SGVpZ2h0KCkpfSxzZXRXaWR0aDpmdW5jdGlvbihhKXt0aGlzLndpZHRoPXRoaXMuX2NhbnZhcy53aWR0aD1hKnRoaXMucGl4ZWxSYXRpbyx0aGlzLl9jYW52YXMuc3R5bGUud2lkdGg9YStcInB4XCJ9LHNldEhlaWdodDpmdW5jdGlvbihhKXt0aGlzLmhlaWdodD10aGlzLl9jYW52YXMuaGVpZ2h0PWEqdGhpcy5waXhlbFJhdGlvLHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQ9YStcInB4XCJ9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2lkdGh9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlaWdodH0sc2V0U2l6ZTpmdW5jdGlvbihhLGIpe3RoaXMuc2V0V2lkdGgoYSksdGhpcy5zZXRIZWlnaHQoYil9LHRvRGF0YVVSTDpmdW5jdGlvbihhLGIpe3RyeXtyZXR1cm4gdGhpcy5fY2FudmFzLnRvRGF0YVVSTChhLGIpfWNhdGNoKGMpe3RyeXtyZXR1cm4gdGhpcy5fY2FudmFzLnRvRGF0YVVSTCgpfWNhdGNoKGQpe3JldHVybiBLaW5ldGljLlV0aWwud2FybihcIlVuYWJsZSB0byBnZXQgZGF0YSBVUkwuIFwiK2QubWVzc2FnZSksXCJcIn19fX0sS2luZXRpYy5TY2VuZUNhbnZhcz1mdW5jdGlvbihhKXthPWF8fHt9O3ZhciBiPWEud2lkdGh8fDAsYz1hLmhlaWdodHx8MDtLaW5ldGljLkNhbnZhcy5jYWxsKHRoaXMsYSksdGhpcy5jb250ZXh0PW5ldyBLaW5ldGljLlNjZW5lQ29udGV4dCh0aGlzKSx0aGlzLnNldFNpemUoYixjKX0sS2luZXRpYy5TY2VuZUNhbnZhcy5wcm90b3R5cGU9e3NldFdpZHRoOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGl4ZWxSYXRpbyxjPXRoaXMuZ2V0Q29udGV4dCgpLl9jb250ZXh0O0tpbmV0aWMuQ2FudmFzLnByb3RvdHlwZS5zZXRXaWR0aC5jYWxsKHRoaXMsYSksYy5zY2FsZShiLGIpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5waXhlbFJhdGlvLGM9dGhpcy5nZXRDb250ZXh0KCkuX2NvbnRleHQ7S2luZXRpYy5DYW52YXMucHJvdG90eXBlLnNldEhlaWdodC5jYWxsKHRoaXMsYSksYy5zY2FsZShiLGIpfX0sS2luZXRpYy5VdGlsLmV4dGVuZChLaW5ldGljLlNjZW5lQ2FudmFzLEtpbmV0aWMuQ2FudmFzKSxLaW5ldGljLkhpdENhbnZhcz1mdW5jdGlvbihhKXthPWF8fHt9O3ZhciBiPWEud2lkdGh8fDAsYz1hLmhlaWdodHx8MDtLaW5ldGljLkNhbnZhcy5jYWxsKHRoaXMsYSksdGhpcy5jb250ZXh0PW5ldyBLaW5ldGljLkhpdENvbnRleHQodGhpcyksdGhpcy5zZXRTaXplKGIsYyl9LEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5IaXRDYW52YXMsS2luZXRpYy5DYW52YXMpfSgpLGZ1bmN0aW9uKCl7dmFyIGE9XCIsXCIsYj1cIihcIixjPVwiKVwiLGQ9XCIoW1wiLGU9XCJdKVwiLGY9XCI7XCIsZz1cIigpXCIsaD1cIj1cIixpPVtcImFyY1wiLFwiYXJjVG9cIixcImJlZ2luUGF0aFwiLFwiYmV6aWVyQ3VydmVUb1wiLFwiY2xlYXJSZWN0XCIsXCJjbGlwXCIsXCJjbG9zZVBhdGhcIixcImNyZWF0ZUxpbmVhckdyYWRpZW50XCIsXCJjcmVhdGVQYXR0ZXJuXCIsXCJjcmVhdGVSYWRpYWxHcmFkaWVudFwiLFwiZHJhd0ltYWdlXCIsXCJmaWxsXCIsXCJmaWxsVGV4dFwiLFwiZ2V0SW1hZ2VEYXRhXCIsXCJjcmVhdGVJbWFnZURhdGFcIixcImxpbmVUb1wiLFwibW92ZVRvXCIsXCJwdXRJbWFnZURhdGFcIixcInF1YWRyYXRpY0N1cnZlVG9cIixcInJlY3RcIixcInJlc3RvcmVcIixcInJvdGF0ZVwiLFwic2F2ZVwiLFwic2NhbGVcIixcInNldExpbmVEYXNoXCIsXCJzZXRUcmFuc2Zvcm1cIixcInN0cm9rZVwiLFwic3Ryb2tlVGV4dFwiLFwidHJhbnNmb3JtXCIsXCJ0cmFuc2xhdGVcIl07S2luZXRpYy5Db250ZXh0PWZ1bmN0aW9uKGEpe3RoaXMuaW5pdChhKX0sS2luZXRpYy5Db250ZXh0LnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhKXt0aGlzLmNhbnZhcz1hLHRoaXMuX2NvbnRleHQ9YS5fY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSxLaW5ldGljLmVuYWJsZVRyYWNlJiYodGhpcy50cmFjZUFycj1bXSx0aGlzLl9lbmFibGVUcmFjZSgpKX0sZmlsbFNoYXBlOmZ1bmN0aW9uKGEpe2EuZ2V0RmlsbEVuYWJsZWQoKSYmdGhpcy5fZmlsbChhKX0sc3Ryb2tlU2hhcGU6ZnVuY3Rpb24oYSl7YS5nZXRTdHJva2VFbmFibGVkKCkmJnRoaXMuX3N0cm9rZShhKX0sZmlsbFN0cm9rZVNoYXBlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0RmlsbEVuYWJsZWQoKTtiJiZ0aGlzLl9maWxsKGEpLGEuZ2V0U3Ryb2tlRW5hYmxlZCgpJiZ0aGlzLl9zdHJva2UoYSl9LGdldFRyYWNlOmZ1bmN0aW9uKGkpe3ZhciBqLGssbCxtLG49dGhpcy50cmFjZUFycixvPW4ubGVuZ3RoLHA9XCJcIjtmb3Ioaj0wO28+ajtqKyspaz1uW2pdLGw9ay5tZXRob2QsbD8obT1rLmFyZ3MscCs9bCxwKz1pP2c6S2luZXRpYy5VdGlsLl9pc0FycmF5KG1bMF0pP2QrbS5qb2luKGEpK2U6YittLmpvaW4oYSkrYyk6KHArPWsucHJvcGVydHksaXx8KHArPWgray52YWwpKSxwKz1mO3JldHVybiBwfSxjbGVhclRyYWNlOmZ1bmN0aW9uKCl7dGhpcy50cmFjZUFycj1bXX0sX3RyYWNlOmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy50cmFjZUFycjtjLnB1c2goYSksYj1jLmxlbmd0aCxiPj1LaW5ldGljLnRyYWNlQXJyTWF4JiZjLnNoaWZ0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDYW52YXMoKS5nZXRQaXhlbFJhdGlvKCk7dGhpcy5zZXRUcmFuc2Zvcm0oMSphLDAsMCwxKmEsMCwwKX0sZ2V0Q2FudmFzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzfSxjbGVhcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldENhbnZhcygpO2E/dGhpcy5jbGVhclJlY3QoYS54fHwwLGEueXx8MCxhLndpZHRofHwwLGEuaGVpZ2h0fHwwKTp0aGlzLmNsZWFyUmVjdCgwLDAsYi5nZXRXaWR0aCgpLGIuZ2V0SGVpZ2h0KCkpfSxfYXBwbHlMaW5lQ2FwOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0TGluZUNhcCgpO2ImJnRoaXMuc2V0QXR0cihcImxpbmVDYXBcIixiKX0sX2FwcGx5T3BhY2l0eTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEFic29sdXRlT3BhY2l0eSgpOzEhPT1iJiZ0aGlzLnNldEF0dHIoXCJnbG9iYWxBbHBoYVwiLGIpfSxfYXBwbHlMaW5lSm9pbjpmdW5jdGlvbihhKXt2YXIgYj1hLmdldExpbmVKb2luKCk7YiYmdGhpcy5zZXRBdHRyKFwibGluZUpvaW5cIixiKX0sc2V0QXR0cjpmdW5jdGlvbihhLGIpe3RoaXMuX2NvbnRleHRbYV09Yn0sYXJjOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3RoaXMuX2NvbnRleHQuYXJjKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdKX0sYmVnaW5QYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5iZWdpblBhdGgoKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50czt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0pfSxjbGVhclJlY3Q6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7dGhpcy5fY29udGV4dC5jbGVhclJlY3QoYVswXSxhWzFdLGFbMl0sYVszXSl9LGNsaXA6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsaXAoKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sY3JlYXRlSW1hZ2VEYXRhOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiAyPT09YS5sZW5ndGg/dGhpcy5fY29udGV4dC5jcmVhdGVJbWFnZURhdGEoYVswXSxhWzFdKToxPT09YS5sZW5ndGg/dGhpcy5fY29udGV4dC5jcmVhdGVJbWFnZURhdGEoYVswXSk6dm9pZCAwfSxjcmVhdGVMaW5lYXJHcmFkaWVudDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cztyZXR1cm4gdGhpcy5fY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChhWzBdLGFbMV0sYVsyXSxhWzNdKX0sY3JlYXRlUGF0dGVybjpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cztyZXR1cm4gdGhpcy5fY29udGV4dC5jcmVhdGVQYXR0ZXJuKGFbMF0sYVsxXSl9LGNyZWF0ZVJhZGlhbEdyYWRpZW50OmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiB0aGlzLl9jb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdKX0sZHJhd0ltYWdlOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzLGI9dGhpcy5fY29udGV4dDszPT09YS5sZW5ndGg/Yi5kcmF3SW1hZ2UoYVswXSxhWzFdLGFbMl0pOjU9PT1hLmxlbmd0aD9iLmRyYXdJbWFnZShhWzBdLGFbMV0sYVsyXSxhWzNdLGFbNF0pOjk9PT1hLmxlbmd0aCYmYi5kcmF3SW1hZ2UoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSxhWzddLGFbOF0pfSxmaWxsOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5maWxsKCl9LGZpbGxUZXh0OmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3RoaXMuX2NvbnRleHQuZmlsbFRleHQoYVswXSxhWzFdLGFbMl0pfSxnZXRJbWFnZURhdGE6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIHRoaXMuX2NvbnRleHQuZ2V0SW1hZ2VEYXRhKGFbMF0sYVsxXSxhWzJdLGFbM10pfSxsaW5lVG86ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7dGhpcy5fY29udGV4dC5saW5lVG8oYVswXSxhWzFdKX0sbW92ZVRvOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3RoaXMuX2NvbnRleHQubW92ZVRvKGFbMF0sYVsxXSl9LHJlY3Q6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7dGhpcy5fY29udGV4dC5yZWN0KGFbMF0sYVsxXSxhWzJdLGFbM10pfSxwdXRJbWFnZURhdGE6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7dGhpcy5fY29udGV4dC5wdXRJbWFnZURhdGEoYVswXSxhWzFdLGFbMl0pfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3RoaXMuX2NvbnRleHQucXVhZHJhdGljQ3VydmVUbyhhWzBdLGFbMV0sYVsyXSxhWzNdKX0scmVzdG9yZTpmdW5jdGlvbigpe3RoaXMuX2NvbnRleHQucmVzdG9yZSgpfSxyb3RhdGU6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7dGhpcy5fY29udGV4dC5yb3RhdGUoYVswXSl9LHNhdmU6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LnNhdmUoKX0sc2NhbGU6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7dGhpcy5fY29udGV4dC5zY2FsZShhWzBdLGFbMV0pfSxzZXRMaW5lRGFzaDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cyxiPXRoaXMuX2NvbnRleHQ7dGhpcy5fY29udGV4dC5zZXRMaW5lRGFzaD9iLnNldExpbmVEYXNoKGFbMF0pOlwibW96RGFzaFwiaW4gYj9iLm1vekRhc2g9YVswXTpcIndlYmtpdExpbmVEYXNoXCJpbiBiJiYoYi53ZWJraXRMaW5lRGFzaD1hWzBdKX0sc2V0VHJhbnNmb3JtOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3RoaXMuX2NvbnRleHQuc2V0VHJhbnNmb3JtKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdKX0sc3Ryb2tlOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5zdHJva2UoKX0sc3Ryb2tlVGV4dDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50czt0aGlzLl9jb250ZXh0LnN0cm9rZVRleHQoYVswXSxhWzFdLGFbMl0pfSx0cmFuc2Zvcm06ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7dGhpcy5fY29udGV4dC50cmFuc2Zvcm0oYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0pfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7dGhpcy5fY29udGV4dC50cmFuc2xhdGUoYVswXSxhWzFdKX0sX2VuYWJsZVRyYWNlOmZ1bmN0aW9uKCl7dmFyIGEsYixjPXRoaXMsZD1pLmxlbmd0aCxlPUtpbmV0aWMuVXRpbC5fc2ltcGxpZnlBcnJheSxmPXRoaXMuc2V0QXR0cixnPWZ1bmN0aW9uKGEpe3ZhciBkLGY9Y1thXTtjW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIGI9ZShBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpLGQ9Zi5hcHBseShjLGFyZ3VtZW50cyksYy5fdHJhY2Uoe21ldGhvZDphLGFyZ3M6Yn0pLGR9fTtmb3IoYT0wO2Q+YTthKyspZyhpW2FdKTtjLnNldEF0dHI9ZnVuY3Rpb24oKXtmLmFwcGx5KGMsYXJndW1lbnRzKSxjLl90cmFjZSh7cHJvcGVydHk6YXJndW1lbnRzWzBdLHZhbDphcmd1bWVudHNbMV19KX19fSxLaW5ldGljLlNjZW5lQ29udGV4dD1mdW5jdGlvbihhKXtLaW5ldGljLkNvbnRleHQuY2FsbCh0aGlzLGEpfSxLaW5ldGljLlNjZW5lQ29udGV4dC5wcm90b3R5cGU9e19maWxsQ29sb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS5maWxsKCl8fEtpbmV0aWMuVXRpbC5fZ2V0UkdCQVN0cmluZyh7cmVkOmEuZmlsbFJlZCgpLGdyZWVuOmEuZmlsbEdyZWVuKCksYmx1ZTphLmZpbGxCbHVlKCksYWxwaGE6YS5maWxsQWxwaGEoKX0pO3RoaXMuc2V0QXR0cihcImZpbGxTdHlsZVwiLGIpLGEuX2ZpbGxGdW5jKHRoaXMpfSxfZmlsbFBhdHRlcm46ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRGaWxsUGF0dGVybkltYWdlKCksYz1hLmdldEZpbGxQYXR0ZXJuWCgpLGQ9YS5nZXRGaWxsUGF0dGVyblkoKSxlPWEuZ2V0RmlsbFBhdHRlcm5TY2FsZSgpLGY9S2luZXRpYy5nZXRBbmdsZShhLmdldEZpbGxQYXR0ZXJuUm90YXRpb24oKSksZz1hLmdldEZpbGxQYXR0ZXJuT2Zmc2V0KCksaD1hLmdldEZpbGxQYXR0ZXJuUmVwZWF0KCk7KGN8fGQpJiZ0aGlzLnRyYW5zbGF0ZShjfHwwLGR8fDApLGYmJnRoaXMucm90YXRlKGYpLGUmJnRoaXMuc2NhbGUoZS54LGUueSksZyYmdGhpcy50cmFuc2xhdGUoLTEqZy54LC0xKmcueSksdGhpcy5zZXRBdHRyKFwiZmlsbFN0eWxlXCIsdGhpcy5jcmVhdGVQYXR0ZXJuKGIsaHx8XCJyZXBlYXRcIikpLHRoaXMuZmlsbCgpfSxfZmlsbExpbmVhckdyYWRpZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0RmlsbExpbmVhckdyYWRpZW50U3RhcnRQb2ludCgpLGM9YS5nZXRGaWxsTGluZWFyR3JhZGllbnRFbmRQb2ludCgpLGQ9YS5nZXRGaWxsTGluZWFyR3JhZGllbnRDb2xvclN0b3BzKCksZT10aGlzLmNyZWF0ZUxpbmVhckdyYWRpZW50KGIueCxiLnksYy54LGMueSk7aWYoZCl7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKz0yKWUuYWRkQ29sb3JTdG9wKGRbZl0sZFtmKzFdKTt0aGlzLnNldEF0dHIoXCJmaWxsU3R5bGVcIixlKSx0aGlzLmZpbGwoKX19LF9maWxsUmFkaWFsR3JhZGllbnQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWEuZ2V0RmlsbFJhZGlhbEdyYWRpZW50U3RhcnRQb2ludCgpLGM9YS5nZXRGaWxsUmFkaWFsR3JhZGllbnRFbmRQb2ludCgpLGQ9YS5nZXRGaWxsUmFkaWFsR3JhZGllbnRTdGFydFJhZGl1cygpLGU9YS5nZXRGaWxsUmFkaWFsR3JhZGllbnRFbmRSYWRpdXMoKSxmPWEuZ2V0RmlsbFJhZGlhbEdyYWRpZW50Q29sb3JTdG9wcygpLGc9dGhpcy5jcmVhdGVSYWRpYWxHcmFkaWVudChiLngsYi55LGQsYy54LGMueSxlKSxoPTA7aDxmLmxlbmd0aDtoKz0yKWcuYWRkQ29sb3JTdG9wKGZbaF0sZltoKzFdKTt0aGlzLnNldEF0dHIoXCJmaWxsU3R5bGVcIixnKSx0aGlzLmZpbGwoKX0sX2ZpbGw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5maWxsKCl8fGEuZmlsbFJlZCgpfHxhLmZpbGxHcmVlbigpfHxhLmZpbGxCbHVlKCksYz1hLmdldEZpbGxQYXR0ZXJuSW1hZ2UoKSxkPWEuZ2V0RmlsbExpbmVhckdyYWRpZW50Q29sb3JTdG9wcygpLGU9YS5nZXRGaWxsUmFkaWFsR3JhZGllbnRDb2xvclN0b3BzKCksZj1hLmdldEZpbGxQcmlvcml0eSgpO2ImJlwiY29sb3JcIj09PWY/dGhpcy5fZmlsbENvbG9yKGEpOmMmJlwicGF0dGVyblwiPT09Zj90aGlzLl9maWxsUGF0dGVybihhKTpkJiZcImxpbmVhci1ncmFkaWVudFwiPT09Zj90aGlzLl9maWxsTGluZWFyR3JhZGllbnQoYSk6ZSYmXCJyYWRpYWwtZ3JhZGllbnRcIj09PWY/dGhpcy5fZmlsbFJhZGlhbEdyYWRpZW50KGEpOmI/dGhpcy5fZmlsbENvbG9yKGEpOmM/dGhpcy5fZmlsbFBhdHRlcm4oYSk6ZD90aGlzLl9maWxsTGluZWFyR3JhZGllbnQoYSk6ZSYmdGhpcy5fZmlsbFJhZGlhbEdyYWRpZW50KGEpfSxfc3Ryb2tlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZGFzaCgpLGM9YS5nZXRTdHJva2VTY2FsZUVuYWJsZWQoKTthLmhhc1N0cm9rZSgpJiYoY3x8KHRoaXMuc2F2ZSgpLHRoaXMuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSksdGhpcy5fYXBwbHlMaW5lQ2FwKGEpLGImJmEuZGFzaEVuYWJsZWQoKSYmdGhpcy5zZXRMaW5lRGFzaChiKSx0aGlzLnNldEF0dHIoXCJsaW5lV2lkdGhcIixhLnN0cm9rZVdpZHRoKCkpLHRoaXMuc2V0QXR0cihcInN0cm9rZVN0eWxlXCIsYS5zdHJva2UoKXx8S2luZXRpYy5VdGlsLl9nZXRSR0JBU3RyaW5nKHtyZWQ6YS5zdHJva2VSZWQoKSxncmVlbjphLnN0cm9rZUdyZWVuKCksYmx1ZTphLnN0cm9rZUJsdWUoKSxhbHBoYTphLnN0cm9rZUFscGhhKCl9KSksYS5fc3Ryb2tlRnVuYyh0aGlzKSxjfHx0aGlzLnJlc3RvcmUoKSl9LF9hcHBseVNoYWRvdzpmdW5jdGlvbihhKXt2YXIgYj1LaW5ldGljLlV0aWwsYz1hLmdldEFic29sdXRlT3BhY2l0eSgpLGQ9Yi5nZXQoYS5nZXRTaGFkb3dDb2xvcigpLFwiYmxhY2tcIiksZT1iLmdldChhLmdldFNoYWRvd0JsdXIoKSw1KSxmPWIuZ2V0KGEuZ2V0U2hhZG93T3BhY2l0eSgpLDEpLGc9Yi5nZXQoYS5nZXRTaGFkb3dPZmZzZXQoKSx7eDowLHk6MH0pO2YmJnRoaXMuc2V0QXR0cihcImdsb2JhbEFscGhhXCIsZipjKSx0aGlzLnNldEF0dHIoXCJzaGFkb3dDb2xvclwiLGQpLHRoaXMuc2V0QXR0cihcInNoYWRvd0JsdXJcIixlKSx0aGlzLnNldEF0dHIoXCJzaGFkb3dPZmZzZXRYXCIsZy54KSx0aGlzLnNldEF0dHIoXCJzaGFkb3dPZmZzZXRZXCIsZy55KX19LEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5TY2VuZUNvbnRleHQsS2luZXRpYy5Db250ZXh0KSxLaW5ldGljLkhpdENvbnRleHQ9ZnVuY3Rpb24oYSl7S2luZXRpYy5Db250ZXh0LmNhbGwodGhpcyxhKX0sS2luZXRpYy5IaXRDb250ZXh0LnByb3RvdHlwZT17X2ZpbGw6ZnVuY3Rpb24oYSl7dGhpcy5zYXZlKCksdGhpcy5zZXRBdHRyKFwiZmlsbFN0eWxlXCIsYS5jb2xvcktleSksYS5fZmlsbEZ1bmNIaXQodGhpcyksdGhpcy5yZXN0b3JlKCl9LF9zdHJva2U6ZnVuY3Rpb24oYSl7YS5oYXNTdHJva2UoKSYmKHRoaXMuX2FwcGx5TGluZUNhcChhKSx0aGlzLnNldEF0dHIoXCJsaW5lV2lkdGhcIixhLnN0cm9rZVdpZHRoKCkpLHRoaXMuc2V0QXR0cihcInN0cm9rZVN0eWxlXCIsYS5jb2xvcktleSksYS5fc3Ryb2tlRnVuY0hpdCh0aGlzKSl9fSxLaW5ldGljLlV0aWwuZXh0ZW5kKEtpbmV0aWMuSGl0Q29udGV4dCxLaW5ldGljLkNvbnRleHQpfSgpLGZ1bmN0aW9uKCl7dmFyIGE9XCJnZXRcIixiPVwic2V0XCI7S2luZXRpYy5GYWN0b3J5PXthZGRHZXR0ZXJTZXR0ZXI6ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aGlzLmFkZEdldHRlcihhLGIsYyksdGhpcy5hZGRTZXR0ZXIoYSxiLGQsZSksdGhpcy5hZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKGEsYil9LGFkZEdldHRlcjpmdW5jdGlvbihiLGMsZCl7dmFyIGU9YStLaW5ldGljLlV0aWwuX2NhcGl0YWxpemUoYyk7Yi5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmF0dHJzW2NdO3JldHVybiB2b2lkIDA9PT1hP2Q6YX19LGFkZFNldHRlcjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1iK0tpbmV0aWMuVXRpbC5fY2FwaXRhbGl6ZShjKTthLnByb3RvdHlwZVtmXT1mdW5jdGlvbihhKXtyZXR1cm4gZCYmKGE9ZC5jYWxsKHRoaXMsYSkpLHRoaXMuX3NldEF0dHIoYyxhKSxlJiZlLmNhbGwodGhpcyksdGhpc319LGFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXI6ZnVuY3Rpb24oYyxkLGUsZixnKXt2YXIgaCxpLGo9ZS5sZW5ndGgsaz1LaW5ldGljLlV0aWwuX2NhcGl0YWxpemUsbD1hK2soZCksbT1iK2soZCk7Yy5wcm90b3R5cGVbbF09ZnVuY3Rpb24oKXt2YXIgYT17fTtmb3IoaD0wO2o+aDtoKyspaT1lW2hdLGFbaV09dGhpcy5nZXRBdHRyKGQrayhpKSk7cmV0dXJuIGF9LGMucHJvdG90eXBlW21dPWZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5hdHRyc1tkXTtmJiYoYT1mLmNhbGwodGhpcyxhKSk7Zm9yKGIgaW4gYSl0aGlzLl9zZXRBdHRyKGQrayhiKSxhW2JdKTtyZXR1cm4gdGhpcy5fZmlyZUNoYW5nZUV2ZW50KGQsYyxhKSxnJiZnLmNhbGwodGhpcyksdGhpc30sdGhpcy5hZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKGMsZCl9LGFkZE92ZXJsb2FkZWRHZXR0ZXJTZXR0ZXI6ZnVuY3Rpb24oYyxkKXt2YXIgZT1LaW5ldGljLlV0aWwuX2NhcGl0YWxpemUoZCksZj1iK2UsZz1hK2U7Yy5wcm90b3R5cGVbZF09ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpc1tmXShhcmd1bWVudHNbMF0pLHRoaXMpOnRoaXNbZ10oKX19LGJhY2tDb21wYXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYyBpbiBiKWEucHJvdG90eXBlW2NdPWEucHJvdG90eXBlW2JbY11dfSxhZnRlclNldEZpbHRlcjpmdW5jdGlvbigpe3RoaXMuX2ZpbHRlclVwVG9EYXRlPSExfX0sS2luZXRpYy5WYWxpZGF0b3JzPXtSR0JDb21wb25lbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE+MjU1PzI1NTowPmE/MDpNYXRoLnJvdW5kKGEpfSxhbHBoYUNvbXBvbmVudDpmdW5jdGlvbihhKXtyZXR1cm4gYT4xPzE6MWUtND5hPzFlLTQ6YX19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9XCJhYnNvbHV0ZU9wYWNpdHlcIixiPVwiYWJzb2x1dGVUcmFuc2Zvcm1cIixjPVwiQ2hhbmdlXCIsZD1cImNoaWxkcmVuXCIsZT1cIi5cIixmPVwiXCIsZz1cImdldFwiLGg9XCJpZFwiLGk9XCJraW5ldGljXCIsaj1cImxpc3RlbmluZ1wiLGs9XCJtb3VzZWVudGVyXCIsbD1cIm1vdXNlbGVhdmVcIixtPVwibmFtZVwiLG49XCJzZXRcIixvPVwiU2hhcGVcIixwPVwiIFwiLHE9XCJzdGFnZVwiLHI9XCJ0cmFuc2Zvcm1cIixzPVwiU3RhZ2VcIix0PVwidmlzaWJsZVwiLHU9W1wiaWRcIl0sdj1bXCJ4Q2hhbmdlLmtpbmV0aWNcIixcInlDaGFuZ2Uua2luZXRpY1wiLFwic2NhbGVYQ2hhbmdlLmtpbmV0aWNcIixcInNjYWxlWUNoYW5nZS5raW5ldGljXCIsXCJza2V3WENoYW5nZS5raW5ldGljXCIsXCJza2V3WUNoYW5nZS5raW5ldGljXCIsXCJyb3RhdGlvbkNoYW5nZS5raW5ldGljXCIsXCJvZmZzZXRYQ2hhbmdlLmtpbmV0aWNcIixcIm9mZnNldFlDaGFuZ2Uua2luZXRpY1wiLFwidHJhbnNmb3Jtc0VuYWJsZWRDaGFuZ2Uua2luZXRpY1wiXS5qb2luKHApO0tpbmV0aWMuVXRpbC5hZGRNZXRob2RzKEtpbmV0aWMuTm9kZSx7X2luaXQ6ZnVuY3Rpb24oYyl7dmFyIGQ9dGhpczt0aGlzLl9pZD1LaW5ldGljLmlkQ291bnRlcisrLHRoaXMuZXZlbnRMaXN0ZW5lcnM9e30sdGhpcy5hdHRycz17fSx0aGlzLl9jYWNoZT17fSx0aGlzLl9maWx0ZXJVcFRvRGF0ZT0hMSx0aGlzLnNldEF0dHJzKGMpLHRoaXMub24odixmdW5jdGlvbigpe3RoaXMuX2NsZWFyQ2FjaGUociksZC5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKGIpfSksdGhpcy5vbihcInZpc2libGVDaGFuZ2Uua2luZXRpY1wiLGZ1bmN0aW9uKCl7ZC5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKHQpfSksdGhpcy5vbihcImxpc3RlbmluZ0NoYW5nZS5raW5ldGljXCIsZnVuY3Rpb24oKXtkLl9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUoail9KSx0aGlzLm9uKFwib3BhY2l0eUNoYW5nZS5raW5ldGljXCIsZnVuY3Rpb24oKXtkLl9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUoYSl9KX0sX2NsZWFyQ2FjaGU6ZnVuY3Rpb24oYSl7YT9kZWxldGUgdGhpcy5fY2FjaGVbYV06dGhpcy5fY2FjaGU9e319LF9nZXRDYWNoZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2NhY2hlW2FdO3JldHVybiB2b2lkIDA9PT1jJiYodGhpcy5fY2FjaGVbYV09Yi5jYWxsKHRoaXMpKSx0aGlzLl9jYWNoZVthXX0sX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZTpmdW5jdGlvbihhKXt0aGlzLl9jbGVhckNhY2hlKGEpLHRoaXMuY2hpbGRyZW4mJnRoaXMuZ2V0Q2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKGIpe2IuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZShhKX0pfSxjbGVhckNhY2hlOmZ1bmN0aW9uKCl7cmV0dXJuIGRlbGV0ZSB0aGlzLl9jYWNoZS5jYW52YXMsdGhpcy5fZmlsdGVyVXBUb0RhdGU9ITEsdGhpc30sY2FjaGU6ZnVuY3Rpb24oYSl7e3ZhciBiPWF8fHt9LGM9Yi54fHwwLGQ9Yi55fHwwLGU9Yi53aWR0aHx8dGhpcy53aWR0aCgpLGY9Yi5oZWlnaHR8fHRoaXMuaGVpZ2h0KCksZz1iLmRyYXdCb3JkZXJ8fCExO3RoaXMuZ2V0TGF5ZXIoKX1pZigwPT09ZXx8MD09PWYpcmV0dXJuIHZvaWQgS2luZXRpYy5VdGlsLndhcm4oXCJXaWR0aCBvciBoZWlnaHQgb2YgY2FjaGluZyBjb25maWd1cmF0aW9uIGVxdWFscyAwLiBDYWNoZSBpcyBpZ25vcmVkLlwiKTt2YXIgaD1uZXcgS2luZXRpYy5TY2VuZUNhbnZhcyh7cGl4ZWxSYXRpbzoxLHdpZHRoOmUsaGVpZ2h0OmZ9KSxpPW5ldyBLaW5ldGljLlNjZW5lQ2FudmFzKHtwaXhlbFJhdGlvOjEsd2lkdGg6ZSxoZWlnaHQ6Zn0pLGo9bmV3IEtpbmV0aWMuSGl0Q2FudmFzKHt3aWR0aDplLGhlaWdodDpmfSksaz0odGhpcy50cmFuc2Zvcm1zRW5hYmxlZCgpLHRoaXMueCgpLHRoaXMueSgpLGguZ2V0Q29udGV4dCgpKSxsPWouZ2V0Q29udGV4dCgpO3JldHVybiB0aGlzLmNsZWFyQ2FjaGUoKSxrLnNhdmUoKSxsLnNhdmUoKSxnJiYoay5zYXZlKCksay5iZWdpblBhdGgoKSxrLnJlY3QoMCwwLGUsZiksay5jbG9zZVBhdGgoKSxrLnNldEF0dHIoXCJzdHJva2VTdHlsZVwiLFwicmVkXCIpLGsuc2V0QXR0cihcImxpbmVXaWR0aFwiLDUpLGsuc3Ryb2tlKCksay5yZXN0b3JlKCkpLGsudHJhbnNsYXRlKC0xKmMsLTEqZCksbC50cmFuc2xhdGUoLTEqYywtMSpkKSxcIlNoYXBlXCI9PT10aGlzLm5vZGVUeXBlJiYoay50cmFuc2xhdGUoLTEqdGhpcy54KCksLTEqdGhpcy55KCkpLGwudHJhbnNsYXRlKC0xKnRoaXMueCgpLC0xKnRoaXMueSgpKSksdGhpcy5kcmF3U2NlbmUoaCx0aGlzKSx0aGlzLmRyYXdIaXQoaix0aGlzKSxrLnJlc3RvcmUoKSxsLnJlc3RvcmUoKSx0aGlzLl9jYWNoZS5jYW52YXM9e3NjZW5lOmgsZmlsdGVyOmksaGl0Omp9LHRoaXN9LF9kcmF3Q2FjaGVkU2NlbmVDYW52YXM6ZnVuY3Rpb24oYSl7YS5zYXZlKCksdGhpcy5nZXRMYXllcigpLl9hcHBseVRyYW5zZm9ybSh0aGlzLGEpLGEuZHJhd0ltYWdlKHRoaXMuX2dldENhY2hlZFNjZW5lQ2FudmFzKCkuX2NhbnZhcywwLDApLGEucmVzdG9yZSgpfSxfZ2V0Q2FjaGVkU2NlbmVDYW52YXM6ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlPXRoaXMuZmlsdGVycygpLGY9dGhpcy5fY2FjaGUuY2FudmFzLGc9Zi5zY2VuZSxoPWYuZmlsdGVyLGk9aC5nZXRDb250ZXh0KCk7aWYoZSl7aWYoIXRoaXMuX2ZpbHRlclVwVG9EYXRlKXt0cnl7Zm9yKGE9ZS5sZW5ndGgsaS5jbGVhcigpLGkuZHJhd0ltYWdlKGcuX2NhbnZhcywwLDApLGI9aS5nZXRJbWFnZURhdGEoMCwwLGguZ2V0V2lkdGgoKSxoLmdldEhlaWdodCgpKSxjPTA7YT5jO2MrKylkPWVbY10sZC5jYWxsKHRoaXMsYiksaS5wdXRJbWFnZURhdGEoYiwwLDApfWNhdGNoKGope0tpbmV0aWMuVXRpbC53YXJuKFwiVW5hYmxlIHRvIGFwcGx5IGZpbHRlci4gXCIrai5tZXNzYWdlKX10aGlzLl9maWx0ZXJVcFRvRGF0ZT0hMH1yZXR1cm4gaH1yZXR1cm4gZ30sX2RyYXdDYWNoZWRIaXRDYW52YXM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY2FjaGUuY2FudmFzLGM9Yi5oaXQ7YS5zYXZlKCksdGhpcy5nZXRMYXllcigpLl9hcHBseVRyYW5zZm9ybSh0aGlzLGEpLGEuZHJhd0ltYWdlKGMuX2NhbnZhcywwLDApLGEucmVzdG9yZSgpfSxvbjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZyxoLGksaj1hLnNwbGl0KHApLGs9ai5sZW5ndGg7Zm9yKGM9MDtrPmM7YysrKWQ9altjXSxnPWQuc3BsaXQoZSksaD1nWzBdLGk9Z1sxXXx8Zix0aGlzLmV2ZW50TGlzdGVuZXJzW2hdfHwodGhpcy5ldmVudExpc3RlbmVyc1toXT1bXSksdGhpcy5ldmVudExpc3RlbmVyc1toXS5wdXNoKHtuYW1lOmksaGFuZGxlcjpifSk7cmV0dXJuIHRoaXN9LG9mZjpmdW5jdGlvbihhKXt2YXIgYixjLGQsZixnLGgsaT1hLnNwbGl0KHApLGo9aS5sZW5ndGg7Zm9yKGI9MDtqPmI7YisrKWlmKGQ9aVtiXSxmPWQuc3BsaXQoZSksZz1mWzBdLGg9ZlsxXSxnKXRoaXMuZXZlbnRMaXN0ZW5lcnNbZ10mJnRoaXMuX29mZihnLGgpO2Vsc2UgZm9yKGMgaW4gdGhpcy5ldmVudExpc3RlbmVycyl0aGlzLl9vZmYoYyxoKTtyZXR1cm4gdGhpc30sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihhKXt2YXIgYj17dGFyZ2V0OnRoaXMsdHlwZTphLnR5cGUsZXZ0OmF9O3RoaXMuZmlyZShhLnR5cGUsYil9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLm9uKGEsZnVuY3Rpb24oYSl7Yi5jYWxsKHRoaXMsYS5ldnQpfSl9LHJlbW92ZTpmdW5jdGlvbigpe3ZhciBjPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIGMmJmMuY2hpbGRyZW4mJihjLmNoaWxkcmVuLnNwbGljZSh0aGlzLmluZGV4LDEpLGMuX3NldENoaWxkcmVuSW5kaWNlcygpLGRlbGV0ZSB0aGlzLnBhcmVudCksdGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKHEpLHRoaXMuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZShiKSx0aGlzLl9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUodCksdGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKGopLHRoaXMuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZShhKSx0aGlzfSxkZXN0cm95OmZ1bmN0aW9uKCl7S2luZXRpYy5fcmVtb3ZlSWQodGhpcy5nZXRJZCgpKSxLaW5ldGljLl9yZW1vdmVOYW1lKHRoaXMuZ2V0TmFtZSgpLHRoaXMuX2lkKSx0aGlzLnJlbW92ZSgpfSxnZXRBdHRyOmZ1bmN0aW9uKGEpe3ZhciBiPWcrS2luZXRpYy5VdGlsLl9jYXBpdGFsaXplKGEpO3JldHVybiBLaW5ldGljLlV0aWwuX2lzRnVuY3Rpb24odGhpc1tiXSk/dGhpc1tiXSgpOnRoaXMuYXR0cnNbYV19LGdldEFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBhcmVudCgpLGI9bmV3IEtpbmV0aWMuQ29sbGVjdGlvbjthOyliLnB1c2goYSksYT1hLmdldFBhcmVudCgpO3JldHVybiBifSxnZXRBdHRyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHJzfHx7fX0sc2V0QXR0cnM6ZnVuY3Rpb24oYSl7dmFyIGIsYztpZihhKWZvcihiIGluIGEpYj09PWR8fChjPW4rS2luZXRpYy5VdGlsLl9jYXBpdGFsaXplKGIpLEtpbmV0aWMuVXRpbC5faXNGdW5jdGlvbih0aGlzW2NdKT90aGlzW2NdKGFbYl0pOnRoaXMuX3NldEF0dHIoYixhW2JdKSk7cmV0dXJuIHRoaXN9LGlzTGlzdGVuaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldENhY2hlKGosdGhpcy5faXNMaXN0ZW5pbmcpfSxfaXNMaXN0ZW5pbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldExpc3RlbmluZygpLGI9dGhpcy5nZXRQYXJlbnQoKTtyZXR1cm5cImluaGVyaXRcIj09PWE/Yj9iLmlzTGlzdGVuaW5nKCk6ITA6YX0saXNWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldENhY2hlKHQsdGhpcy5faXNWaXNpYmxlKX0sX2lzVmlzaWJsZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0VmlzaWJsZSgpLGI9dGhpcy5nZXRQYXJlbnQoKTtyZXR1cm5cImluaGVyaXRcIj09PWE/Yj9iLmlzVmlzaWJsZSgpOiEwOmF9LHNob3VsZERyYXdIaXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldExheWVyKCk7cmV0dXJuIGEmJmEuaGl0R3JhcGhFbmFibGVkKCkmJnRoaXMuaXNMaXN0ZW5pbmcoKSYmdGhpcy5pc1Zpc2libGUoKSYmIUtpbmV0aWMuaXNEcmFnZ2luZygpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0VmlzaWJsZSghMCksdGhpc30saGlkZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldFZpc2libGUoITEpLHRoaXN9LGdldFpJbmRleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4fHwwfSxnZXRBYnNvbHV0ZVpJbmRleDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoaSl7Zm9yKGI9W10sYz1pLmxlbmd0aCxkPTA7Yz5kO2QrKyllPWlbZF0saCsrLGUubm9kZVR5cGUhPT1vJiYoYj1iLmNvbmNhdChlLmdldENoaWxkcmVuKCkudG9BcnJheSgpKSksZS5faWQ9PT1nLl9pZCYmKGQ9Yyk7Yi5sZW5ndGg+MCYmYlswXS5nZXREZXB0aCgpPD1mJiZhKGIpfXZhciBiLGMsZCxlLGY9dGhpcy5nZXREZXB0aCgpLGc9dGhpcyxoPTA7cmV0dXJuIGcubm9kZVR5cGUhPT1zJiZhKGcuZ2V0U3RhZ2UoKS5nZXRDaGlsZHJlbigpKSxofSxnZXREZXB0aDpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI9dGhpcy5wYXJlbnQ7YjspYSsrLGI9Yi5wYXJlbnQ7cmV0dXJuIGF9LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldFgoYS54KSx0aGlzLnNldFkoYS55KSx0aGlzfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybnt4OnRoaXMuZ2V0WCgpLHk6dGhpcy5nZXRZKCl9fSxnZXRBYnNvbHV0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBYnNvbHV0ZVRyYW5zZm9ybSgpLmdldE1hdHJpeCgpLGI9bmV3IEtpbmV0aWMuVHJhbnNmb3JtLGM9dGhpcy5vZmZzZXQoKTtyZXR1cm4gYi5tPWEuc2xpY2UoKSxiLnRyYW5zbGF0ZShjLngsYy55KSxiLmdldFRyYW5zbGF0aW9uKCl9LHNldEFic29sdXRlUG9zaXRpb246ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLl9jbGVhclRyYW5zZm9ybSgpO3JldHVybiB0aGlzLmF0dHJzLng9Yy54LHRoaXMuYXR0cnMueT1jLnksZGVsZXRlIGMueCxkZWxldGUgYy55LGI9dGhpcy5nZXRBYnNvbHV0ZVRyYW5zZm9ybSgpLGIuaW52ZXJ0KCksYi50cmFuc2xhdGUoYS54LGEueSksYT17eDp0aGlzLmF0dHJzLngrYi5nZXRUcmFuc2xhdGlvbigpLngseTp0aGlzLmF0dHJzLnkrYi5nZXRUcmFuc2xhdGlvbigpLnl9LHRoaXMuc2V0UG9zaXRpb24oe3g6YS54LHk6YS55fSksdGhpcy5fc2V0VHJhbnNmb3JtKGMpLHRoaXN9LF9zZXRUcmFuc2Zvcm06ZnVuY3Rpb24oYSl7dmFyIGM7Zm9yKGMgaW4gYSl0aGlzLmF0dHJzW2NdPWFbY107dGhpcy5fY2xlYXJDYWNoZShyKSx0aGlzLl9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUoYil9LF9jbGVhclRyYW5zZm9ybTpmdW5jdGlvbigpe3ZhciBhPXt4OnRoaXMuZ2V0WCgpLHk6dGhpcy5nZXRZKCkscm90YXRpb246dGhpcy5nZXRSb3RhdGlvbigpLHNjYWxlWDp0aGlzLmdldFNjYWxlWCgpLHNjYWxlWTp0aGlzLmdldFNjYWxlWSgpLG9mZnNldFg6dGhpcy5nZXRPZmZzZXRYKCksb2Zmc2V0WTp0aGlzLmdldE9mZnNldFkoKSxza2V3WDp0aGlzLmdldFNrZXdYKCksc2tld1k6dGhpcy5nZXRTa2V3WSgpfTtyZXR1cm4gdGhpcy5hdHRycy54PTAsdGhpcy5hdHRycy55PTAsdGhpcy5hdHRycy5yb3RhdGlvbj0wLHRoaXMuYXR0cnMuc2NhbGVYPTEsdGhpcy5hdHRycy5zY2FsZVk9MSx0aGlzLmF0dHJzLm9mZnNldFg9MCx0aGlzLmF0dHJzLm9mZnNldFk9MCx0aGlzLmF0dHJzLnNrZXdYPTAsdGhpcy5hdHRycy5za2V3WT0wLHRoaXMuX2NsZWFyQ2FjaGUociksdGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKGIpLGF9LG1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9YS54LGM9YS55LGQ9dGhpcy5nZXRYKCksZT10aGlzLmdldFkoKTtyZXR1cm4gdm9pZCAwIT09YiYmKGQrPWIpLHZvaWQgMCE9PWMmJihlKz1jKSx0aGlzLnNldFBvc2l0aW9uKHt4OmQseTplfSksdGhpc30sX2VhY2hBbmNlc3RvclJldmVyc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9W10sZj10aGlzLmdldFBhcmVudCgpO2lmKGImJmIuX2lkPT09dGhpcy5faWQpcmV0dXJuIGEodGhpcyksITA7Zm9yKGUudW5zaGlmdCh0aGlzKTtmJiYoIWJ8fGYuX2lkIT09Yi5faWQpOyllLnVuc2hpZnQoZiksZj1mLnBhcmVudDtmb3IoYz1lLmxlbmd0aCxkPTA7Yz5kO2QrKylhKGVbZF0pfSxyb3RhdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0Um90YXRpb24odGhpcy5nZXRSb3RhdGlvbigpK2EpLHRoaXN9LG1vdmVUb1RvcDpmdW5jdGlvbigpe2lmKCF0aGlzLnBhcmVudClyZXR1cm4gdm9pZCBLaW5ldGljLlV0aWwud2FybihcIk5vZGUgaGFzIG5vIHBhcmVudC4gbW92ZVRvVG9wIGZ1bmN0aW9uIGlzIGlnbm9yZWQuXCIpO3ZhciBhPXRoaXMuaW5kZXg7cmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuLnNwbGljZShhLDEpLHRoaXMucGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyksdGhpcy5wYXJlbnQuX3NldENoaWxkcmVuSW5kaWNlcygpLCEwfSxtb3ZlVXA6ZnVuY3Rpb24oKXtpZighdGhpcy5wYXJlbnQpcmV0dXJuIHZvaWQgS2luZXRpYy5VdGlsLndhcm4oXCJOb2RlIGhhcyBubyBwYXJlbnQuIG1vdmVVcCBmdW5jdGlvbiBpcyBpZ25vcmVkLlwiKTt2YXIgYT10aGlzLmluZGV4LGI9dGhpcy5wYXJlbnQuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7cmV0dXJuIGItMT5hPyh0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoYSwxKSx0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoYSsxLDAsdGhpcyksdGhpcy5wYXJlbnQuX3NldENoaWxkcmVuSW5kaWNlcygpLCEwKTohMX0sbW92ZURvd246ZnVuY3Rpb24oKXtpZighdGhpcy5wYXJlbnQpcmV0dXJuIHZvaWQgS2luZXRpYy5VdGlsLndhcm4oXCJOb2RlIGhhcyBubyBwYXJlbnQuIG1vdmVEb3duIGZ1bmN0aW9uIGlzIGlnbm9yZWQuXCIpO3ZhciBhPXRoaXMuaW5kZXg7cmV0dXJuIGE+MD8odGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGEsMSksdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGEtMSwwLHRoaXMpLHRoaXMucGFyZW50Ll9zZXRDaGlsZHJlbkluZGljZXMoKSwhMCk6ITF9LG1vdmVUb0JvdHRvbTpmdW5jdGlvbigpe2lmKCF0aGlzLnBhcmVudClyZXR1cm4gdm9pZCBLaW5ldGljLlV0aWwud2FybihcIk5vZGUgaGFzIG5vIHBhcmVudC4gbW92ZVRvQm90dG9tIGZ1bmN0aW9uIGlzIGlnbm9yZWQuXCIpO3ZhciBhPXRoaXMuaW5kZXg7cmV0dXJuIGE+MD8odGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGEsMSksdGhpcy5wYXJlbnQuY2hpbGRyZW4udW5zaGlmdCh0aGlzKSx0aGlzLnBhcmVudC5fc2V0Q2hpbGRyZW5JbmRpY2VzKCksITApOiExfSxzZXRaSW5kZXg6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucGFyZW50KXJldHVybiB2b2lkIEtpbmV0aWMuVXRpbC53YXJuKFwiTm9kZSBoYXMgbm8gcGFyZW50LiB6SW5kZXggcGFyYW1ldGVyIGlzIGlnbm9yZWQuXCIpO3ZhciBiPXRoaXMuaW5kZXg7cmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuLnNwbGljZShiLDEpLHRoaXMucGFyZW50LmNoaWxkcmVuLnNwbGljZShhLDAsdGhpcyksdGhpcy5wYXJlbnQuX3NldENoaWxkcmVuSW5kaWNlcygpLHRoaXN9LGdldEFic29sdXRlT3BhY2l0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRDYWNoZShhLHRoaXMuX2dldEFic29sdXRlT3BhY2l0eSl9LF9nZXRBYnNvbHV0ZU9wYWNpdHk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldE9wYWNpdHkoKTtyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKSYmKGEqPXRoaXMuZ2V0UGFyZW50KCkuZ2V0QWJzb2x1dGVPcGFjaXR5KCkpLGF9LG1vdmVUbzpmdW5jdGlvbihhKXtyZXR1cm4gS2luZXRpYy5Ob2RlLnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzKSxhLmFkZCh0aGlzKSx0aGlzfSx0b09iamVjdDpmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9S2luZXRpYy5VdGlsLGY9e30sZz10aGlzLmdldEF0dHJzKCk7Zi5hdHRycz17fTtmb3IoYSBpbiBnKWI9Z1thXSxlLl9pc0Z1bmN0aW9uKGIpfHxlLl9pc0VsZW1lbnQoYil8fGUuX2lzT2JqZWN0KGIpJiZlLl9oYXNNZXRob2RzKGIpfHwoYz10aGlzW2FdLGRlbGV0ZSBnW2FdLGQ9Yz9jLmNhbGwodGhpcyk6bnVsbCxnW2FdPWIsZCE9PWImJihmLmF0dHJzW2FdPWIpKTtyZXR1cm4gZi5jbGFzc05hbWU9dGhpcy5nZXRDbGFzc05hbWUoKSxmfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b09iamVjdCgpKX0sZ2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50fSxnZXRMYXllcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIGE/YS5nZXRMYXllcigpOm51bGx9LGdldFN0YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldENhY2hlKHEsdGhpcy5fZ2V0U3RhZ2UpfSxfZ2V0U3RhZ2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBhcmVudCgpO3JldHVybiBhP2EuZ2V0U3RhZ2UoKTp2b2lkIDB9LGZpcmU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3RoaXMuX2ZpcmVBbmRCdWJibGUoYSxifHx7fSk6dGhpcy5fZmlyZShhLGJ8fHt9KSx0aGlzfSxnZXRBYnNvbHV0ZVRyYW5zZm9ybTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLl9nZXRBYnNvbHV0ZVRyYW5zZm9ybShhKTp0aGlzLl9nZXRDYWNoZShiLHRoaXMuX2dldEFic29sdXRlVHJhbnNmb3JtKX0sX2dldEFic29sdXRlVHJhbnNmb3JtOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1uZXcgS2luZXRpYy5UcmFuc2Zvcm07cmV0dXJuIHRoaXMuX2VhY2hBbmNlc3RvclJldmVyc2UoZnVuY3Rpb24oYSl7Yj1hLnRyYW5zZm9ybXNFbmFibGVkKCksYz1hLmdldFRyYW5zZm9ybSgpLFwiYWxsXCI9PT1iP2QubXVsdGlwbHkoYyk6XCJwb3NpdGlvblwiPT09YiYmZC50cmFuc2xhdGUoYS54KCksYS55KCkpfSxhKSxkfSxnZXRUcmFuc2Zvcm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Q2FjaGUocix0aGlzLl9nZXRUcmFuc2Zvcm0pfSxfZ2V0VHJhbnNmb3JtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IEtpbmV0aWMuVHJhbnNmb3JtLGI9dGhpcy5nZXRYKCksYz10aGlzLmdldFkoKSxkPUtpbmV0aWMuZ2V0QW5nbGUodGhpcy5nZXRSb3RhdGlvbigpKSxlPXRoaXMuZ2V0U2NhbGVYKCksZj10aGlzLmdldFNjYWxlWSgpLGc9dGhpcy5nZXRTa2V3WCgpLGg9dGhpcy5nZXRTa2V3WSgpLGk9dGhpcy5nZXRPZmZzZXRYKCksaj10aGlzLmdldE9mZnNldFkoKTtyZXR1cm4oMCE9PWJ8fDAhPT1jKSYmYS50cmFuc2xhdGUoYixjKSwwIT09ZCYmYS5yb3RhdGUoZCksKDAhPT1nfHwwIT09aCkmJmEuc2tldyhnLGgpLCgxIT09ZXx8MSE9PWYpJiZhLnNjYWxlKGUsZiksKDAhPT1pfHwwIT09aikmJmEudHJhbnNsYXRlKC0xKmksLTEqaiksYX0sY2xvbmU6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnPXRoaXMuZ2V0Q2xhc3NOYW1lKCksaD1LaW5ldGljLlV0aWwuY2xvbmVPYmplY3QodGhpcy5hdHRycyk7Zm9yKHZhciBqIGluIHUpe3ZhciBrPXVbal07ZGVsZXRlIGhba119Zm9yKGIgaW4gYSloW2JdPWFbYl07dmFyIGw9bmV3IEtpbmV0aWNbZ10oaCk7Zm9yKGIgaW4gdGhpcy5ldmVudExpc3RlbmVycylmb3IoYz10aGlzLmV2ZW50TGlzdGVuZXJzW2JdLGQ9Yy5sZW5ndGgsZT0wO2Q+ZTtlKyspZj1jW2VdLGYubmFtZS5pbmRleE9mKGkpPDAmJihsLmV2ZW50TGlzdGVuZXJzW2JdfHwobC5ldmVudExpc3RlbmVyc1tiXT1bXSksbC5ldmVudExpc3RlbmVyc1tiXS5wdXNoKGYpKTtyZXR1cm4gbH0sdG9EYXRhVVJMOmZ1bmN0aW9uKGEpe2E9YXx8e307dmFyIGI9YS5taW1lVHlwZXx8bnVsbCxjPWEucXVhbGl0eXx8bnVsbCxkPXRoaXMuZ2V0U3RhZ2UoKSxlPWEueHx8MCxmPWEueXx8MCxnPW5ldyBLaW5ldGljLlNjZW5lQ2FudmFzKHt3aWR0aDphLndpZHRofHx0aGlzLmdldFdpZHRoKCl8fChkP2QuZ2V0V2lkdGgoKTowKSxoZWlnaHQ6YS5oZWlnaHR8fHRoaXMuZ2V0SGVpZ2h0KCl8fChkP2QuZ2V0SGVpZ2h0KCk6MCkscGl4ZWxSYXRpbzoxfSksaD1nLmdldENvbnRleHQoKTtyZXR1cm4gaC5zYXZlKCksKGV8fGYpJiZoLnRyYW5zbGF0ZSgtMSplLC0xKmYpLHRoaXMuZHJhd1NjZW5lKGcpLGgucmVzdG9yZSgpLGcudG9EYXRhVVJMKGIsYyl9LHRvSW1hZ2U6ZnVuY3Rpb24oYSl7S2luZXRpYy5VdGlsLl9nZXRJbWFnZSh0aGlzLnRvRGF0YVVSTChhKSxmdW5jdGlvbihiKXthLmNhbGxiYWNrKGIpfSl9LHNldFNpemU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0V2lkdGgoYS53aWR0aCksdGhpcy5zZXRIZWlnaHQoYS5oZWlnaHQpLHRoaXN9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dGhpcy5nZXRXaWR0aCgpLGhlaWdodDp0aGlzLmdldEhlaWdodCgpfX0sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRycy53aWR0aHx8MH0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cnMuaGVpZ2h0fHwwfSxnZXRDbGFzc05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc05hbWV8fHRoaXMubm9kZVR5cGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlVHlwZX0sZ2V0RHJhZ0Rpc3RhbmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYXR0cnMuZHJhZ0Rpc3RhbmNlP3RoaXMuYXR0cnMuZHJhZ0Rpc3RhbmNlOnRoaXMucGFyZW50P3RoaXMucGFyZW50LmdldERyYWdEaXN0YW5jZSgpOktpbmV0aWMuZHJhZ0Rpc3RhbmNlfSxfZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGVUeXBlPT09YT9bdGhpc106W119LF9vZmY6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9dGhpcy5ldmVudExpc3RlbmVyc1thXTtmb3IoYz0wO2M8ZS5sZW5ndGg7YysrKWlmKGQ9ZVtjXS5uYW1lLCEoXCJraW5ldGljXCI9PT1kJiZcImtpbmV0aWNcIiE9PWJ8fGImJmQhPT1iKSl7aWYoZS5zcGxpY2UoYywxKSwwPT09ZS5sZW5ndGgpe2RlbGV0ZSB0aGlzLmV2ZW50TGlzdGVuZXJzW2FdO2JyZWFrfWMtLX19LF9maXJlQ2hhbmdlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuX2ZpcmUoYStjLHtvbGRWYWw6YixuZXdWYWw6ZH0pfSxzZXRJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldElkKCk7cmV0dXJuIEtpbmV0aWMuX3JlbW92ZUlkKGIpLEtpbmV0aWMuX2FkZElkKHRoaXMsYSksdGhpcy5fc2V0QXR0cihoLGEpLHRoaXNcclxufSxzZXROYW1lOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0TmFtZSgpO3JldHVybiBLaW5ldGljLl9yZW1vdmVOYW1lKGIsdGhpcy5faWQpLEtpbmV0aWMuX2FkZE5hbWUodGhpcyxhKSx0aGlzLl9zZXRBdHRyKG0sYSksdGhpc30sc2V0QXR0cjpmdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksYj1hWzBdLGM9YVsxXSxkPW4rS2luZXRpYy5VdGlsLl9jYXBpdGFsaXplKGIpLGU9dGhpc1tkXTtyZXR1cm4gS2luZXRpYy5VdGlsLl9pc0Z1bmN0aW9uKGUpP2UuY2FsbCh0aGlzLGMpOnRoaXMuX3NldEF0dHIoYixjKSx0aGlzfSxfc2V0QXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjO3ZvaWQgMCE9PWImJihjPXRoaXMuYXR0cnNbYV0sdGhpcy5hdHRyc1thXT1iLHRoaXMuX2ZpcmVDaGFuZ2VFdmVudChhLGMsYikpfSxfc2V0Q29tcG9uZW50QXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7dm9pZCAwIT09YyYmKGQ9dGhpcy5hdHRyc1thXSxkfHwodGhpcy5hdHRyc1thXT10aGlzLmdldEF0dHIoYSkpLHRoaXMuYXR0cnNbYV1bYl09Yyx0aGlzLl9maXJlQ2hhbmdlRXZlbnQoYSxkLGMpKX0sX2ZpcmVBbmRCdWJibGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSEwO2ImJnRoaXMubm9kZVR5cGU9PT1vJiYoYi50YXJnZXQ9dGhpcyksYT09PWsmJmMmJnRoaXMuX2lkPT09Yy5faWQ/ZD0hMTphPT09bCYmYyYmdGhpcy5faWQ9PT1jLl9pZCYmKGQ9ITEpLGQmJih0aGlzLl9maXJlKGEsYiksYiYmIWIuY2FuY2VsQnViYmxlJiZ0aGlzLnBhcmVudCYmKGMmJmMucGFyZW50P3RoaXMuX2ZpcmVBbmRCdWJibGUuY2FsbCh0aGlzLnBhcmVudCxhLGIsYy5wYXJlbnQpOnRoaXMuX2ZpcmVBbmRCdWJibGUuY2FsbCh0aGlzLnBhcmVudCxhLGIpKSl9LF9maXJlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10aGlzLmV2ZW50TGlzdGVuZXJzW2FdO2lmKGIudHlwZT1hLGQpZm9yKGM9MDtjPGQubGVuZ3RoO2MrKylkW2NdLmhhbmRsZXIuY2FsbCh0aGlzLGIpfSxkcmF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHJhd1NjZW5lKCksdGhpcy5kcmF3SGl0KCksdGhpc319KSxLaW5ldGljLk5vZGUuY3JlYXRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2NyZWF0ZU5vZGUoSlNPTi5wYXJzZShhKSxiKX0sS2luZXRpYy5Ob2RlLl9jcmVhdGVOb2RlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9S2luZXRpYy5Ob2RlLnByb3RvdHlwZS5nZXRDbGFzc05hbWUuY2FsbChhKSxnPWEuY2hpbGRyZW47aWYoYiYmKGEuYXR0cnMuY29udGFpbmVyPWIpLGM9bmV3IEtpbmV0aWNbZl0oYS5hdHRycyksZylmb3IoZD1nLmxlbmd0aCxlPTA7ZD5lO2UrKyljLmFkZCh0aGlzLl9jcmVhdGVOb2RlKGdbZV0pKTtyZXR1cm4gY30sS2luZXRpYy5GYWN0b3J5LmFkZE92ZXJsb2FkZWRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwicG9zaXRpb25cIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJ4XCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJ5XCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJvcGFjaXR5XCIsMSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlcihLaW5ldGljLk5vZGUsXCJuYW1lXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcIm5hbWVcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlcihLaW5ldGljLk5vZGUsXCJpZFwiKSxLaW5ldGljLkZhY3RvcnkuYWRkT3ZlcmxvYWRlZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJpZFwiKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcInJvdGF0aW9uXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwic2NhbGVcIixbXCJ4XCIsXCJ5XCJdKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcInNjYWxlWFwiLDEpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwic2NhbGVZXCIsMSksS2luZXRpYy5GYWN0b3J5LmFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwic2tld1wiLFtcInhcIixcInlcIl0pLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwic2tld1hcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcInNrZXdZXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwib2Zmc2V0XCIsW1wieFwiLFwieVwiXSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJvZmZzZXRYXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJvZmZzZXRZXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZFNldHRlcihLaW5ldGljLk5vZGUsXCJkcmFnRGlzdGFuY2VcIiksS2luZXRpYy5GYWN0b3J5LmFkZE92ZXJsb2FkZWRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwiZHJhZ0Rpc3RhbmNlXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRTZXR0ZXIoS2luZXRpYy5Ob2RlLFwid2lkdGhcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkT3ZlcmxvYWRlZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJ3aWR0aFwiKSxLaW5ldGljLkZhY3RvcnkuYWRkU2V0dGVyKEtpbmV0aWMuTm9kZSxcImhlaWdodFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImhlaWdodFwiKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImxpc3RlbmluZ1wiLFwiaW5oZXJpdFwiKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImZpbHRlcnNcIix2b2lkIDAsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2ZpbHRlclVwVG9EYXRlPSExLGF9KSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcInZpc2libGVcIixcImluaGVyaXRcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJ0cmFuc2Zvcm1zRW5hYmxlZFwiLFwiYWxsXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcInNpemVcIiksS2luZXRpYy5GYWN0b3J5LmJhY2tDb21wYXQoS2luZXRpYy5Ob2RlLHtyb3RhdGVEZWc6XCJyb3RhdGVcIixzZXRSb3RhdGlvbkRlZzpcInNldFJvdGF0aW9uXCIsZ2V0Um90YXRpb25EZWc6XCJnZXRSb3RhdGlvblwifSksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5Ob2RlKX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuRmlsdGVycy5HcmF5c2NhbGU9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEuZGF0YSxlPWQubGVuZ3RoO2ZvcihiPTA7ZT5iO2IrPTQpYz0uMzQqZFtiXSsuNSpkW2IrMV0rLjE2KmRbYisyXSxkW2JdPWMsZFtiKzFdPWMsZFtiKzJdPWN9fSgpLGZ1bmN0aW9uKCl7S2luZXRpYy5GaWx0ZXJzLkJyaWdodGVuPWZ1bmN0aW9uKGEpe3ZhciBiLGM9MjU1KnRoaXMuYnJpZ2h0bmVzcygpLGQ9YS5kYXRhLGU9ZC5sZW5ndGg7Zm9yKGI9MDtlPmI7Yis9NClkW2JdKz1jLGRbYisxXSs9YyxkW2IrMl0rPWN9LEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwiYnJpZ2h0bmVzc1wiLDAsbnVsbCxLaW5ldGljLkZhY3RvcnkuYWZ0ZXJTZXRGaWx0ZXIpfSgpLGZ1bmN0aW9uKCl7S2luZXRpYy5GaWx0ZXJzLkludmVydD1mdW5jdGlvbihhKXt2YXIgYixjPWEuZGF0YSxkPWMubGVuZ3RoO2ZvcihiPTA7ZD5iO2IrPTQpY1tiXT0yNTUtY1tiXSxjW2IrMV09MjU1LWNbYisxXSxjW2IrMl09MjU1LWNbYisyXX19KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dGhpcy5yPTAsdGhpcy5nPTAsdGhpcy5iPTAsdGhpcy5hPTAsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24gYihiLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHkseixBLEIsQyxEPWIuZGF0YSxFPWIud2lkdGgsRj1iLmhlaWdodCxHPWUrZSsxLEg9RS0xLEk9Ri0xLEo9ZSsxLEs9SiooSisxKS8yLEw9bmV3IGEsTT1udWxsLE49TCxPPW51bGwsUD1udWxsLFE9Y1tlXSxSPWRbZV07Zm9yKGg9MTtHPmg7aCsrKU49Ti5uZXh0PW5ldyBhLGg9PUomJihNPU4pO2ZvcihOLm5leHQ9TCxsPWs9MCxnPTA7Rj5nO2crKyl7Zm9yKHU9dj13PXg9bT1uPW89cD0wLHE9SiooeT1EW2tdKSxyPUoqKHo9RFtrKzFdKSxzPUoqKEE9RFtrKzJdKSx0PUoqKEI9RFtrKzNdKSxtKz1LKnksbis9Syp6LG8rPUsqQSxwKz1LKkIsTj1MLGg9MDtKPmg7aCsrKU4ucj15LE4uZz16LE4uYj1BLE4uYT1CLE49Ti5uZXh0O2ZvcihoPTE7Sj5oO2grKylpPWsrKChoPkg/SDpoKTw8MiksbSs9KE4ucj15PURbaV0pKihDPUotaCksbis9KE4uZz16PURbaSsxXSkqQyxvKz0oTi5iPUE9RFtpKzJdKSpDLHArPShOLmE9Qj1EW2krM10pKkMsdSs9eSx2Kz16LHcrPUEseCs9QixOPU4ubmV4dDtmb3IoTz1MLFA9TSxmPTA7RT5mO2YrKylEW2srM109Qj1wKlE+PlIsMCE9PUI/KEI9MjU1L0IsRFtrXT0obSpRPj5SKSpCLERbaysxXT0obipRPj5SKSpCLERbaysyXT0obypRPj5SKSpCKTpEW2tdPURbaysxXT1EW2srMl09MCxtLT1xLG4tPXIsby09cyxwLT10LHEtPU8ucixyLT1PLmcscy09Ty5iLHQtPU8uYSxpPWwrKChpPWYrZSsxKTxIP2k6SCk8PDIsdSs9Ty5yPURbaV0sdis9Ty5nPURbaSsxXSx3Kz1PLmI9RFtpKzJdLHgrPU8uYT1EW2krM10sbSs9dSxuKz12LG8rPXcscCs9eCxPPU8ubmV4dCxxKz15PVAucixyKz16PVAuZyxzKz1BPVAuYix0Kz1CPVAuYSx1LT15LHYtPXosdy09QSx4LT1CLFA9UC5uZXh0LGsrPTQ7bCs9RX1mb3IoZj0wO0U+ZjtmKyspe2Zvcih2PXc9eD11PW49bz1wPW09MCxrPWY8PDIscT1KKih5PURba10pLHI9Siooej1EW2srMV0pLHM9SiooQT1EW2srMl0pLHQ9SiooQj1EW2srM10pLG0rPUsqeSxuKz1LKnosbys9SypBLHArPUsqQixOPUwsaD0wO0o+aDtoKyspTi5yPXksTi5nPXosTi5iPUEsTi5hPUIsTj1OLm5leHQ7Zm9yKGo9RSxoPTE7ZT49aDtoKyspaz1qK2Y8PDIsbSs9KE4ucj15PURba10pKihDPUotaCksbis9KE4uZz16PURbaysxXSkqQyxvKz0oTi5iPUE9RFtrKzJdKSpDLHArPShOLmE9Qj1EW2srM10pKkMsdSs9eSx2Kz16LHcrPUEseCs9QixOPU4ubmV4dCxJPmgmJihqKz1FKTtmb3Ioaz1mLE89TCxQPU0sZz0wO0Y+ZztnKyspaT1rPDwyLERbaSszXT1CPXAqUT4+UixCPjA/KEI9MjU1L0IsRFtpXT0obSpRPj5SKSpCLERbaSsxXT0obipRPj5SKSpCLERbaSsyXT0obypRPj5SKSpCKTpEW2ldPURbaSsxXT1EW2krMl09MCxtLT1xLG4tPXIsby09cyxwLT10LHEtPU8ucixyLT1PLmcscy09Ty5iLHQtPU8uYSxpPWYrKChpPWcrSik8ST9pOkkpKkU8PDIsbSs9dSs9Ty5yPURbaV0sbis9dis9Ty5nPURbaSsxXSxvKz13Kz1PLmI9RFtpKzJdLHArPXgrPU8uYT1EW2krM10sTz1PLm5leHQscSs9eT1QLnIscis9ej1QLmcscys9QT1QLmIsdCs9Qj1QLmEsdS09eSx2LT16LHctPUEseC09QixQPVAubmV4dCxrKz1FfX12YXIgYz1bNTEyLDUxMiw0NTYsNTEyLDMyOCw0NTYsMzM1LDUxMiw0MDUsMzI4LDI3MSw0NTYsMzg4LDMzNSwyOTIsNTEyLDQ1NCw0MDUsMzY0LDMyOCwyOTgsMjcxLDQ5Niw0NTYsNDIwLDM4OCwzNjAsMzM1LDMxMiwyOTIsMjczLDUxMiw0ODIsNDU0LDQyOCw0MDUsMzgzLDM2NCwzNDUsMzI4LDMxMiwyOTgsMjg0LDI3MSwyNTksNDk2LDQ3NSw0NTYsNDM3LDQyMCw0MDQsMzg4LDM3NCwzNjAsMzQ3LDMzNSwzMjMsMzEyLDMwMiwyOTIsMjgyLDI3MywyNjUsNTEyLDQ5Nyw0ODIsNDY4LDQ1NCw0NDEsNDI4LDQxNyw0MDUsMzk0LDM4MywzNzMsMzY0LDM1NCwzNDUsMzM3LDMyOCwzMjAsMzEyLDMwNSwyOTgsMjkxLDI4NCwyNzgsMjcxLDI2NSwyNTksNTA3LDQ5Niw0ODUsNDc1LDQ2NSw0NTYsNDQ2LDQzNyw0MjgsNDIwLDQxMiw0MDQsMzk2LDM4OCwzODEsMzc0LDM2NywzNjAsMzU0LDM0NywzNDEsMzM1LDMyOSwzMjMsMzE4LDMxMiwzMDcsMzAyLDI5NywyOTIsMjg3LDI4MiwyNzgsMjczLDI2OSwyNjUsMjYxLDUxMiw1MDUsNDk3LDQ4OSw0ODIsNDc1LDQ2OCw0NjEsNDU0LDQ0Nyw0NDEsNDM1LDQyOCw0MjIsNDE3LDQxMSw0MDUsMzk5LDM5NCwzODksMzgzLDM3OCwzNzMsMzY4LDM2NCwzNTksMzU0LDM1MCwzNDUsMzQxLDMzNywzMzIsMzI4LDMyNCwzMjAsMzE2LDMxMiwzMDksMzA1LDMwMSwyOTgsMjk0LDI5MSwyODcsMjg0LDI4MSwyNzgsMjc0LDI3MSwyNjgsMjY1LDI2MiwyNTksMjU3LDUwNyw1MDEsNDk2LDQ5MSw0ODUsNDgwLDQ3NSw0NzAsNDY1LDQ2MCw0NTYsNDUxLDQ0Niw0NDIsNDM3LDQzMyw0MjgsNDI0LDQyMCw0MTYsNDEyLDQwOCw0MDQsNDAwLDM5NiwzOTIsMzg4LDM4NSwzODEsMzc3LDM3NCwzNzAsMzY3LDM2MywzNjAsMzU3LDM1NCwzNTAsMzQ3LDM0NCwzNDEsMzM4LDMzNSwzMzIsMzI5LDMyNiwzMjMsMzIwLDMxOCwzMTUsMzEyLDMxMCwzMDcsMzA0LDMwMiwyOTksMjk3LDI5NCwyOTIsMjg5LDI4NywyODUsMjgyLDI4MCwyNzgsMjc1LDI3MywyNzEsMjY5LDI2NywyNjUsMjYzLDI2MSwyNTldLGQ9WzksMTEsMTIsMTMsMTMsMTQsMTQsMTUsMTUsMTUsMTUsMTYsMTYsMTYsMTYsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjMsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjRdO0tpbmV0aWMuRmlsdGVycy5CbHVyPWZ1bmN0aW9uKGEpe3ZhciBjPU1hdGgucm91bmQodGhpcy5ibHVyUmFkaXVzKCkpO2M+MCYmYihhLGMpfSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImJsdXJSYWRpdXNcIiwwLG51bGwsS2luZXRpYy5GYWN0b3J5LmFmdGVyU2V0RmlsdGVyKX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiLGMpe3ZhciBkPTQqKGMqYS53aWR0aCtiKSxlPVtdO3JldHVybiBlLnB1c2goYS5kYXRhW2QrK10sYS5kYXRhW2QrK10sYS5kYXRhW2QrK10sYS5kYXRhW2QrK10pLGV9ZnVuY3Rpb24gYihhLGIpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coYVswXS1iWzBdLDIpK01hdGgucG93KGFbMV0tYlsxXSwyKStNYXRoLnBvdyhhWzJdLWJbMl0sMikpfWZ1bmN0aW9uIGMoYSl7Zm9yKHZhciBiPVswLDAsMF0sYz0wO2M8YS5sZW5ndGg7YysrKWJbMF0rPWFbY11bMF0sYlsxXSs9YVtjXVsxXSxiWzJdKz1hW2NdWzJdO3JldHVybiBiWzBdLz1hLmxlbmd0aCxiWzFdLz1hLmxlbmd0aCxiWzJdLz1hLmxlbmd0aCxifWZ1bmN0aW9uIGQoZCxlKXt2YXIgZj1hKGQsMCwwKSxnPWEoZCxkLndpZHRoLTEsMCksaD1hKGQsMCxkLmhlaWdodC0xKSxpPWEoZCxkLndpZHRoLTEsZC5oZWlnaHQtMSksaj1lfHwxMDtpZihiKGYsZyk8aiYmYihnLGkpPGomJmIoaSxoKTxqJiZiKGgsZik8ail7Zm9yKHZhciBrPWMoW2csZixpLGhdKSxsPVtdLG09MDttPGQud2lkdGgqZC5oZWlnaHQ7bSsrKXt2YXIgbj1iKGssW2QuZGF0YVs0Km1dLGQuZGF0YVs0Km0rMV0sZC5kYXRhWzQqbSsyXV0pO2xbbV09aj5uPzA6MjU1fXJldHVybiBsfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTA7YzxhLndpZHRoKmEuaGVpZ2h0O2MrKylhLmRhdGFbNCpjKzNdPWJbY119ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBkPVsxLDEsMSwxLDAsMSwxLDEsMV0sZT1NYXRoLnJvdW5kKE1hdGguc3FydChkLmxlbmd0aCkpLGY9TWF0aC5mbG9vcihlLzIpLGc9W10saD0wO2M+aDtoKyspZm9yKHZhciBpPTA7Yj5pO2krKyl7Zm9yKHZhciBqPWgqYitpLGs9MCxsPTA7ZT5sO2wrKylmb3IodmFyIG09MDtlPm07bSsrKXt2YXIgbj1oK2wtZixvPWkrbS1mO2lmKG4+PTAmJmM+biYmbz49MCYmYj5vKXt2YXIgcD1uKmIrbyxxPWRbbCplK21dO2srPWFbcF0qcX19Z1tqXT0yMDQwPT09az8yNTU6MH1yZXR1cm4gZ31mdW5jdGlvbiBnKGEsYixjKXtmb3IodmFyIGQ9WzEsMSwxLDEsMSwxLDEsMSwxXSxlPU1hdGgucm91bmQoTWF0aC5zcXJ0KGQubGVuZ3RoKSksZj1NYXRoLmZsb29yKGUvMiksZz1bXSxoPTA7Yz5oO2grKylmb3IodmFyIGk9MDtiPmk7aSsrKXtmb3IodmFyIGo9aCpiK2ksaz0wLGw9MDtlPmw7bCsrKWZvcih2YXIgbT0wO2U+bTttKyspe3ZhciBuPWgrbC1mLG89aSttLWY7aWYobj49MCYmYz5uJiZvPj0wJiZiPm8pe3ZhciBwPW4qYitvLHE9ZFtsKmUrbV07ays9YVtwXSpxfX1nW2pdPWs+PTEwMjA/MjU1OjB9cmV0dXJuIGd9ZnVuY3Rpb24gaChhLGIsYyl7Zm9yKHZhciBkPVsxLzksMS85LDEvOSwxLzksMS85LDEvOSwxLzksMS85LDEvOV0sZT1NYXRoLnJvdW5kKE1hdGguc3FydChkLmxlbmd0aCkpLGY9TWF0aC5mbG9vcihlLzIpLGc9W10saD0wO2M+aDtoKyspZm9yKHZhciBpPTA7Yj5pO2krKyl7Zm9yKHZhciBqPWgqYitpLGs9MCxsPTA7ZT5sO2wrKylmb3IodmFyIG09MDtlPm07bSsrKXt2YXIgbj1oK2wtZixvPWkrbS1mO2lmKG4+PTAmJmM+biYmbz49MCYmYj5vKXt2YXIgcD1uKmIrbyxxPWRbbCplK21dO2srPWFbcF0qcX19Z1tqXT1rfXJldHVybiBnfUtpbmV0aWMuRmlsdGVycy5NYXNrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGhyZXNob2xkKCksYz1kKGEsYik7cmV0dXJuIGMmJihjPWYoYyxhLndpZHRoLGEuaGVpZ2h0KSxjPWcoYyxhLndpZHRoLGEuaGVpZ2h0KSxjPWgoYyxhLndpZHRoLGEuaGVpZ2h0KSxlKGEsYykpLGF9LEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwidGhyZXNob2xkXCIsMCxudWxsLEtpbmV0aWMuRmFjdG9yeS5hZnRlclNldEZpbHRlcil9KCksZnVuY3Rpb24oKXtLaW5ldGljLkZpbHRlcnMuUkdCPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1hLmRhdGEsZT1kLmxlbmd0aCxmPXRoaXMucmVkKCksZz10aGlzLmdyZWVuKCksaD10aGlzLmJsdWUoKTtmb3IoYj0wO2U+YjtiKz00KWM9KC4zNCpkW2JdKy41KmRbYisxXSsuMTYqZFtiKzJdKS8yNTUsZFtiXT1jKmYsZFtiKzFdPWMqZyxkW2IrMl09YypoLGRbYiszXT1kW2IrM119LEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwicmVkXCIsMCxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fZmlsdGVyVXBUb0RhdGU9ITEsYT4yNTU/MjU1OjA+YT8wOk1hdGgucm91bmQoYSl9KSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImdyZWVuXCIsMCxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fZmlsdGVyVXBUb0RhdGU9ITEsYT4yNTU/MjU1OjA+YT8wOk1hdGgucm91bmQoYSl9KSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImJsdWVcIiwwLEtpbmV0aWMuVmFsaWRhdG9ycy5SR0JDb21wb25lbnQsS2luZXRpYy5GYWN0b3J5LmFmdGVyU2V0RmlsdGVyKX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuRmlsdGVycy5IU1Y9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnPWEuZGF0YSxoPWcubGVuZ3RoLGk9TWF0aC5wb3coMix0aGlzLnZhbHVlKCkpLGo9TWF0aC5wb3coMix0aGlzLnNhdHVyYXRpb24oKSksaz1NYXRoLmFicyh0aGlzLmh1ZSgpKzM2MCklMzYwLGw9aSpqKk1hdGguY29zKGsqTWF0aC5QSS8xODApLG09aSpqKk1hdGguc2luKGsqTWF0aC5QSS8xODApLG49LjI5OSppKy43MDEqbCsuMTY3Km0sbz0uNTg3KmktLjU4NypsKy4zMyptLHA9LjExNCppLS4xMTQqbC0uNDk3Km0scT0uMjk5KmktLjI5OSpsLS4zMjgqbSxyPS41ODcqaSsuNDEzKmwrLjAzNSptLHM9LjExNCppLS4xMTQqbCsuMjkzKm0sdD0uMjk5KmktLjMqbCsxLjI1Km0sdT0uNTg3KmktLjU4NipsLTEuMDUqbSx2PS4xMTQqaSsuODg2KmwtLjIqbTtmb3IoYj0wO2g+YjtiKz00KWM9Z1tiKzBdLGQ9Z1tiKzFdLGU9Z1tiKzJdLGY9Z1tiKzNdLGdbYiswXT1uKmMrbypkK3AqZSxnW2IrMV09cSpjK3IqZCtzKmUsZ1tiKzJdPXQqYyt1KmQrdiplLGdbYiszXT1mfSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImh1ZVwiLDAsbnVsbCxLaW5ldGljLkZhY3RvcnkuYWZ0ZXJTZXRGaWx0ZXIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwic2F0dXJhdGlvblwiLDAsbnVsbCxLaW5ldGljLkZhY3RvcnkuYWZ0ZXJTZXRGaWx0ZXIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwidmFsdWVcIiwwLG51bGwsS2luZXRpYy5GYWN0b3J5LmFmdGVyU2V0RmlsdGVyKX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwiaHVlXCIsMCxudWxsLEtpbmV0aWMuRmFjdG9yeS5hZnRlclNldEZpbHRlciksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJzYXR1cmF0aW9uXCIsMCxudWxsLEtpbmV0aWMuRmFjdG9yeS5hZnRlclNldEZpbHRlciksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJsdW1pbmFuY2VcIiwwLG51bGwsS2luZXRpYy5GYWN0b3J5LmFmdGVyU2V0RmlsdGVyKSxLaW5ldGljLkZpbHRlcnMuSFNMPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZz1hLmRhdGEsaD1nLmxlbmd0aCxpPTEsaj1NYXRoLnBvdygyLHRoaXMuc2F0dXJhdGlvbigpKSxrPU1hdGguYWJzKHRoaXMuaHVlKCkrMzYwKSUzNjAsbD0xMjcqdGhpcy5sdW1pbmFuY2UoKSxtPWkqaipNYXRoLmNvcyhrKk1hdGguUEkvMTgwKSxuPWkqaipNYXRoLnNpbihrKk1hdGguUEkvMTgwKSxvPS4yOTkqaSsuNzAxKm0rLjE2NypuLHA9LjU4NyppLS41ODcqbSsuMzMqbixxPS4xMTQqaS0uMTE0Km0tLjQ5NypuLHI9LjI5OSppLS4yOTkqbS0uMzI4Km4scz0uNTg3KmkrLjQxMyptKy4wMzUqbix0PS4xMTQqaS0uMTE0Km0rLjI5MypuLHU9LjI5OSppLS4zKm0rMS4yNSpuLHY9LjU4NyppLS41ODYqbS0xLjA1Km4sdz0uMTE0KmkrLjg4NiptLS4yKm47Zm9yKGI9MDtoPmI7Yis9NCljPWdbYiswXSxkPWdbYisxXSxlPWdbYisyXSxmPWdbYiszXSxnW2IrMF09bypjK3AqZCtxKmUrbCxnW2IrMV09cipjK3MqZCt0KmUrbCxnW2IrMl09dSpjK3YqZCt3KmUrbCxnW2IrM109Zn19KCksZnVuY3Rpb24oKXtLaW5ldGljLkZpbHRlcnMuRW1ib3NzPWZ1bmN0aW9uKGEpe3ZhciBiPTEwKnRoaXMuZW1ib3NzU3RyZW5ndGgoKSxjPTI1NSp0aGlzLmVtYm9zc1doaXRlTGV2ZWwoKSxkPXRoaXMuZW1ib3NzRGlyZWN0aW9uKCksZT10aGlzLmVtYm9zc0JsZW5kKCksZj0wLGc9MCxoPWEuZGF0YSxpPWEud2lkdGgsaj1hLmhlaWdodCxrPTQqaSxsPWo7c3dpdGNoKGQpe2Nhc2VcInRvcC1sZWZ0XCI6Zj0tMSxnPS0xO2JyZWFrO2Nhc2VcInRvcFwiOmY9LTEsZz0wO2JyZWFrO2Nhc2VcInRvcC1yaWdodFwiOmY9LTEsZz0xO2JyZWFrO2Nhc2VcInJpZ2h0XCI6Zj0wLGc9MTticmVhaztjYXNlXCJib3R0b20tcmlnaHRcIjpmPTEsZz0xO2JyZWFrO2Nhc2VcImJvdHRvbVwiOmY9MSxnPTA7YnJlYWs7Y2FzZVwiYm90dG9tLWxlZnRcIjpmPTEsZz0tMTticmVhaztjYXNlXCJsZWZ0XCI6Zj0wLGc9LTF9ZG97dmFyIG09KGwtMSkqayxuPWY7MT5sK24mJihuPTApLGwrbj5qJiYobj0wKTt2YXIgbz0obC0xK24pKmkqNCxwPWk7ZG97dmFyIHE9bSs0KihwLTEpLHI9ZzsxPnArciYmKHI9MCkscCtyPmkmJihyPTApO3ZhciBzPW8rNCoocC0xK3IpLHQ9aFtxXS1oW3NdLHU9aFtxKzFdLWhbcysxXSx2PWhbcSsyXS1oW3MrMl0sdz10LHg9dz4wP3c6LXcseT11PjA/dTotdSx6PXY+MD92Oi12O2lmKHk+eCYmKHc9dSksej54JiYodz12KSx3Kj1iLGUpe3ZhciBBPWhbcV0rdyxCPWhbcSsxXSt3LEM9aFtxKzJdK3c7aFtxXT1BPjI1NT8yNTU6MD5BPzA6QSxoW3ErMV09Qj4yNTU/MjU1OjA+Qj8wOkIsaFtxKzJdPUM+MjU1PzI1NTowPkM/MDpDfWVsc2V7dmFyIEQ9Yy13OzA+RD9EPTA6RD4yNTUmJihEPTI1NSksaFtxXT1oW3ErMV09aFtxKzJdPUR9fXdoaWxlKC0tcCl9d2hpbGUoLS1sKX0sS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJlbWJvc3NTdHJlbmd0aFwiLC41LG51bGwsS2luZXRpYy5GYWN0b3J5LmFmdGVyU2V0RmlsdGVyKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImVtYm9zc1doaXRlTGV2ZWxcIiwuNSxudWxsLEtpbmV0aWMuRmFjdG9yeS5hZnRlclNldEZpbHRlciksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJlbWJvc3NEaXJlY3Rpb25cIixcInRvcC1sZWZ0XCIsbnVsbCxLaW5ldGljLkZhY3RvcnkuYWZ0ZXJTZXRGaWx0ZXIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwiZW1ib3NzQmxlbmRcIiwhMSxudWxsLEtpbmV0aWMuRmFjdG9yeS5hZnRlclNldEZpbHRlcil9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYixjLGQsZSl7dmFyIGYsZz1jLWIsaD1lLWQ7cmV0dXJuIDA9PT1nP2QraC8yOjA9PT1oP2Q6KGY9KGEtYikvZyxmPWgqZitkKX1LaW5ldGljLkZpbHRlcnMuRW5oYW5jZT1mdW5jdGlvbihiKXt2YXIgYyxkLGUsZixnPWIuZGF0YSxoPWcubGVuZ3RoLGk9Z1swXSxqPWksaz1nWzFdLGw9ayxtPWdbMl0sbj1tLG89Z1szXSxwPW8scT10aGlzLmVuaGFuY2UoKTtpZigwIT09cSl7Zm9yKGY9MDtoPmY7Zis9NCljPWdbZiswXSxpPmM/aT1jOmM+aiYmKGo9YyksZD1nW2YrMV0saz5kP2s9ZDpkPmwmJihsPWQpLGU9Z1tmKzJdLG0+ZT9tPWU6ZT5uJiYobj1lKTtqPT09aSYmKGo9MjU1LGk9MCksbD09PWsmJihsPTI1NSxrPTApLG49PT1tJiYobj0yNTUsbT0wKSxwPT09byYmKHA9MjU1LG89MCk7dmFyIHIscyx0LHUsdix3LHgseSx6LEEsQixDO2ZvcihxPjA/KHM9aitxKigyNTUtaiksdD1pLXEqKGktMCksdj1sK3EqKDI1NS1sKSx3PWstcSooay0wKSx5PW4rcSooMjU1LW4pLEM9bS1xKihtLTApLEI9cCtxKigyNTUtcCksej1vLXEqKG8tMCkpOihyPS41KihqK2kpLHM9aitxKihqLXIpLHQ9aStxKihpLXIpLHU9LjUqKGwrayksdj1sK3EqKGwtdSksdz1rK3EqKGstdSkseD0uNSoobittKSx5PW4rcSoobi14KSxDPW0rcSoobS14KSxBPS41KihwK28pLEI9cCtxKihwLUEpLHo9bytxKihvLUEpKSxmPTA7aD5mO2YrPTQpZ1tmKzBdPWEoZ1tmKzBdLGksaix0LHMpLGdbZisxXT1hKGdbZisxXSxrLGwsdyx2KSxnW2YrMl09YShnW2YrMl0sbSxuLEMseSl9fSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImVuaGFuY2VcIiwwLG51bGwsS2luZXRpYy5GYWN0b3J5LmFmdGVyU2V0RmlsdGVyKX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuRmlsdGVycy5Qb3N0ZXJpemU9ZnVuY3Rpb24oYSl7dmFyIGIsYz1NYXRoLnJvdW5kKDI1NCp0aGlzLmxldmVscygpKSsxLGQ9YS5kYXRhLGU9ZC5sZW5ndGgsZj0yNTUvYztmb3IoYj0wO2U+YjtiKz0xKWRbYl09TWF0aC5mbG9vcihkW2JdL2YpKmZ9LEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwibGV2ZWxzXCIsLjUsbnVsbCxLaW5ldGljLkZhY3RvcnkuYWZ0ZXJTZXRGaWx0ZXIpfSgpLGZ1bmN0aW9uKCl7S2luZXRpYy5GaWx0ZXJzLk5vaXNlPWZ1bmN0aW9uKGEpe3ZhciBiLGM9MjU1KnRoaXMubm9pc2UoKSxkPWEuZGF0YSxlPWQubGVuZ3RoLGY9Yy8yO2ZvcihiPTA7ZT5iO2IrPTQpZFtiKzBdKz1mLTIqZipNYXRoLnJhbmRvbSgpLGRbYisxXSs9Zi0yKmYqTWF0aC5yYW5kb20oKSxkW2IrMl0rPWYtMipmKk1hdGgucmFuZG9tKCl9LEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwibm9pc2VcIiwuMixudWxsLEtpbmV0aWMuRmFjdG9yeS5hZnRlclNldEZpbHRlcil9KCksZnVuY3Rpb24oKXtLaW5ldGljLkZpbHRlcnMuUGl4ZWxhdGU9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwPU1hdGguY2VpbCh0aGlzLnBpeGVsU2l6ZSgpKSxxPWEud2lkdGgscj1hLmhlaWdodCxzPU1hdGguY2VpbChxL3ApLHQ9TWF0aC5jZWlsKHIvcCk7Zm9yKGE9YS5kYXRhLG09MDtzPm07bSs9MSlmb3Iobj0wO3Q+bjtuKz0xKXtmb3IoZT0wLGY9MCxnPTAsaD0wLGk9bSpwLGo9aStwLGs9bipwLGw9aytwLG89MCxiPWk7aj5iO2IrPTEpaWYoIShiPj1xKSlmb3IoYz1rO2w+YztjKz0xKWM+PXJ8fChkPTQqKHEqYytiKSxlKz1hW2QrMF0sZis9YVtkKzFdLGcrPWFbZCsyXSxoKz1hW2QrM10sbys9MSk7Zm9yKGUvPW8sZi89byxnLz1vLGI9aTtqPmI7Yis9MSlpZighKGI+PXEpKWZvcihjPWs7bD5jO2MrPTEpYz49cnx8KGQ9NCoocSpjK2IpLGFbZCswXT1lLGFbZCsxXT1mLGFbZCsyXT1nLGFbZCszXT1oKX19LEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwicGl4ZWxTaXplXCIsOCxudWxsLEtpbmV0aWMuRmFjdG9yeS5hZnRlclNldEZpbHRlcil9KCksZnVuY3Rpb24oKXtLaW5ldGljLkZpbHRlcnMuVGhyZXNob2xkPWZ1bmN0aW9uKGEpe3ZhciBiLGM9MjU1KnRoaXMudGhyZXNob2xkKCksZD1hLmRhdGEsZT1kLmxlbmd0aDtmb3IoYj0wO2U+YjtiKz0xKWRbYl09ZFtiXTxjPzA6MjU1fSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcInRocmVzaG9sZFwiLC41LG51bGwsS2luZXRpYy5GYWN0b3J5LmFmdGVyU2V0RmlsdGVyKX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuRmlsdGVycy5TZXBpYT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosaz1hLmRhdGEsbD1hLndpZHRoLG09YS5oZWlnaHQsbj00Kmw7ZG97Yj0obS0xKSpuLGM9bDtkbyBkPWIrNCooYy0xKSxlPWtbZF0sZj1rW2QrMV0sZz1rW2QrMl0saD0uMzkzKmUrLjc2OSpmKy4xODkqZyxpPS4zNDkqZSsuNjg2KmYrLjE2OCpnLGo9LjI3MiplKy41MzQqZisuMTMxKmcsa1tkXT1oPjI1NT8yNTU6aCxrW2QrMV09aT4yNTU/MjU1Omksa1tkKzJdPWo+MjU1PzI1NTpqLGtbZCszXT1rW2QrM107d2hpbGUoLS1jKX13aGlsZSgtLW0pfX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuRmlsdGVycy5Tb2xhcml6ZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGEsYz1hLndpZHRoLGQ9YS5oZWlnaHQsZT00KmMsZj1kO2Rve3ZhciBnPShmLTEpKmUsaD1jO2Rve3ZhciBpPWcrNCooaC0xKSxqPWJbaV0saz1iW2krMV0sbD1iW2krMl07aj4xMjcmJihqPTI1NS1qKSxrPjEyNyYmKGs9MjU1LWspLGw+MTI3JiYobD0yNTUtbCksYltpXT1qLGJbaSsxXT1rLGJbaSsyXT1sfXdoaWxlKC0taCl9d2hpbGUoLS1mKX19KCksZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLmRhdGEsaT1iLmRhdGEsaj1hLndpZHRoLGs9YS5oZWlnaHQsbD1jLnBvbGFyQ2VudGVyWHx8ai8yLG09Yy5wb2xhckNlbnRlcll8fGsvMixuPTAsbz0wLHA9MCxxPTAscj1NYXRoLnNxcnQobCpsK20qbSk7ZT1qLWwsZj1rLW0sZz1NYXRoLnNxcnQoZSplK2YqZikscj1nPnI/ZzpyO3ZhciBzLHQsdSx2LHc9ayx4PWoseT0zNjAveCpNYXRoLlBJLzE4MDtmb3IodD0wO3g+dDt0Kz0xKWZvcih1PU1hdGguc2luKHQqeSksdj1NYXRoLmNvcyh0KnkpLHM9MDt3PnM7cys9MSllPU1hdGguZmxvb3IobCtyKnMvdyp2KSxmPU1hdGguZmxvb3IobStyKnMvdyp1KSxkPTQqKGYqaitlKSxuPWhbZCswXSxvPWhbZCsxXSxwPWhbZCsyXSxxPWhbZCszXSxkPTQqKHQrcypqKSxpW2QrMF09bixpW2QrMV09byxpW2QrMl09cCxpW2QrM109cX0sYj1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGo9YS5kYXRhLGs9Yi5kYXRhLGw9YS53aWR0aCxtPWEuaGVpZ2h0LG49Yy5wb2xhckNlbnRlclh8fGwvMixvPWMucG9sYXJDZW50ZXJZfHxtLzIscD0wLHE9MCxyPTAscz0wLHQ9TWF0aC5zcXJ0KG4qbitvKm8pO2U9bC1uLGY9bS1vLGk9TWF0aC5zcXJ0KGUqZStmKmYpLHQ9aT50P2k6dDt2YXIgdSx2LHcseCx5PW0sej1sLEE9Yy5wb2xhclJvdGF0aW9ufHwwO2ZvcihlPTA7bD5lO2UrPTEpZm9yKGY9MDttPmY7Zis9MSlnPWUtbixoPWYtbyx1PU1hdGguc3FydChnKmcraCpoKSp5L3Qsdj0oMTgwKk1hdGguYXRhbjIoaCxnKS9NYXRoLlBJKzM2MCtBKSUzNjAsdj12KnovMzYwLHc9TWF0aC5mbG9vcih2KSx4PU1hdGguZmxvb3IodSksZD00Kih4KmwrdykscD1qW2QrMF0scT1qW2QrMV0scj1qW2QrMl0scz1qW2QrM10sZD00KihmKmwrZSksa1tkKzBdPXAsa1tkKzFdPXEsa1tkKzJdPXIsa1tkKzNdPXN9LGM9S2luZXRpYy5VdGlsLmNyZWF0ZUNhbnZhc0VsZW1lbnQoKTtLaW5ldGljLkZpbHRlcnMuS2FsZWlkb3Njb3BlPWZ1bmN0aW9uKGQpe3ZhciBlLGYsZyxoLGksaixrLGwsbSxuLG89ZC53aWR0aCxwPWQuaGVpZ2h0LHE9TWF0aC5yb3VuZCh0aGlzLmthbGVpZG9zY29wZVBvd2VyKCkpLHI9TWF0aC5yb3VuZCh0aGlzLmthbGVpZG9zY29wZUFuZ2xlKCkpLHM9TWF0aC5mbG9vcihvKihyJTM2MCkvMzYwKTtpZighKDE+cSkpe2Mud2lkdGg9byxjLmhlaWdodD1wO3ZhciB0PWMuZ2V0Q29udGV4dChcIjJkXCIpLmdldEltYWdlRGF0YSgwLDAsbyxwKTthKGQsdCx7cG9sYXJDZW50ZXJYOm8vMixwb2xhckNlbnRlclk6cC8yfSk7Zm9yKHZhciB1PW8vTWF0aC5wb3coMixxKTs4Pj11Oyl1PTIqdSxxLT0xO3U9TWF0aC5jZWlsKHUpO3ZhciB2PXUsdz0wLHg9dix5PTE7Zm9yKHMrdT5vJiYodz12LHg9MCx5PS0xKSxmPTA7cD5mO2YrPTEpZm9yKGU9dztlIT09eDtlKz15KWc9TWF0aC5yb3VuZChlK3MpJW8sbT00KihvKmYrZyksaT10LmRhdGFbbSswXSxqPXQuZGF0YVttKzFdLGs9dC5kYXRhW20rMl0sbD10LmRhdGFbbSszXSxuPTQqKG8qZitlKSx0LmRhdGFbbiswXT1pLHQuZGF0YVtuKzFdPWosdC5kYXRhW24rMl09ayx0LmRhdGFbbiszXT1sO2ZvcihmPTA7cD5mO2YrPTEpZm9yKHY9TWF0aC5mbG9vcih1KSxoPTA7cT5oO2grPTEpe2ZvcihlPTA7disxPmU7ZSs9MSltPTQqKG8qZitlKSxpPXQuZGF0YVttKzBdLGo9dC5kYXRhW20rMV0saz10LmRhdGFbbSsyXSxsPXQuZGF0YVttKzNdLG49NCoobypmKzIqdi1lLTEpLHQuZGF0YVtuKzBdPWksdC5kYXRhW24rMV09aix0LmRhdGFbbisyXT1rLHQuZGF0YVtuKzNdPWw7dio9Mn1iKHQsZCx7cG9sYXJSb3RhdGlvbjowfSl9fSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuTm9kZSxcImthbGVpZG9zY29wZVBvd2VyXCIsMixudWxsLEtpbmV0aWMuRmFjdG9yeS5hZnRlclNldEZpbHRlciksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJrYWxlaWRvc2NvcGVBbmdsZVwiLDAsbnVsbCxLaW5ldGljLkZhY3RvcnkuYWZ0ZXJTZXRGaWx0ZXIpfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtLaW5ldGljLnJvb3Quc2V0VGltZW91dChhLDFlMy82MCl9ZnVuY3Rpb24gYigpe3JldHVybiBlLmFwcGx5KEtpbmV0aWMucm9vdCxhcmd1bWVudHMpfXZhciBjPTUwMCxkPWZ1bmN0aW9uKCl7cmV0dXJuIEtpbmV0aWMucm9vdC5wZXJmb3JtYW5jZSYmS2luZXRpYy5yb290LnBlcmZvcm1hbmNlLm5vdz9mdW5jdGlvbigpe3JldHVybiBLaW5ldGljLnJvb3QucGVyZm9ybWFuY2Uubm93KCl9OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9fSgpLGU9ZnVuY3Rpb24oKXtyZXR1cm4gS2luZXRpYy5yb290LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8S2luZXRpYy5yb290LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZXx8S2luZXRpYy5yb290Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8S2luZXRpYy5yb290Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fEtpbmV0aWMucm9vdC5tc1JlcXVlc3RBbmltYXRpb25GcmFtZXx8YX0oKTtLaW5ldGljLkFuaW1hdGlvbj1mdW5jdGlvbihhLGIpe3ZhciBjPUtpbmV0aWMuQW5pbWF0aW9uO3RoaXMuZnVuYz1hLHRoaXMuc2V0TGF5ZXJzKGIpLHRoaXMuaWQ9Yy5hbmltSWRDb3VudGVyKyssdGhpcy5mcmFtZT17dGltZTowLHRpbWVEaWZmOjAsbGFzdFRpbWU6ZCgpfX0sS2luZXRpYy5BbmltYXRpb24ucHJvdG90eXBlPXtzZXRMYXllcnM6ZnVuY3Rpb24oYSl7dmFyIGI9W107Yj1hP2EubGVuZ3RoPjA/YTpbYV06W10sdGhpcy5sYXllcnM9Yn0sZ2V0TGF5ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJzfSxhZGRMYXllcjpmdW5jdGlvbihhKXt2YXIgYixjLGQ9dGhpcy5sYXllcnM7aWYoZCl7Zm9yKGI9ZC5sZW5ndGgsYz0wO2I+YztjKyspaWYoZFtjXS5faWQ9PT1hLl9pZClyZXR1cm4hMX1lbHNlIHRoaXMubGF5ZXJzPVtdO3JldHVybiB0aGlzLmxheWVycy5wdXNoKGEpLCEwfSxpc1J1bm5pbmc6ZnVuY3Rpb24oKXt2YXIgYSxiPUtpbmV0aWMuQW5pbWF0aW9uLGM9Yi5hbmltYXRpb25zLGQ9Yy5sZW5ndGg7Zm9yKGE9MDtkPmE7YSsrKWlmKGNbYV0uaWQ9PT10aGlzLmlkKXJldHVybiEwO3JldHVybiExfSxzdGFydDpmdW5jdGlvbigpe3ZhciBhPUtpbmV0aWMuQW5pbWF0aW9uO3RoaXMuc3RvcCgpLHRoaXMuZnJhbWUudGltZURpZmY9MCx0aGlzLmZyYW1lLmxhc3RUaW1lPWQoKSxhLl9hZGRBbmltYXRpb24odGhpcyl9LHN0b3A6ZnVuY3Rpb24oKXtLaW5ldGljLkFuaW1hdGlvbi5fcmVtb3ZlQW5pbWF0aW9uKHRoaXMpfSxfdXBkYXRlRnJhbWVPYmplY3Q6ZnVuY3Rpb24oYSl7dGhpcy5mcmFtZS50aW1lRGlmZj1hLXRoaXMuZnJhbWUubGFzdFRpbWUsdGhpcy5mcmFtZS5sYXN0VGltZT1hLHRoaXMuZnJhbWUudGltZSs9dGhpcy5mcmFtZS50aW1lRGlmZix0aGlzLmZyYW1lLmZyYW1lUmF0ZT0xZTMvdGhpcy5mcmFtZS50aW1lRGlmZn19LEtpbmV0aWMuQW5pbWF0aW9uLmFuaW1hdGlvbnM9W10sS2luZXRpYy5BbmltYXRpb24uYW5pbUlkQ291bnRlcj0wLEtpbmV0aWMuQW5pbWF0aW9uLmFuaW1SdW5uaW5nPSExLEtpbmV0aWMuQW5pbWF0aW9uLl9hZGRBbmltYXRpb249ZnVuY3Rpb24oYSl7dGhpcy5hbmltYXRpb25zLnB1c2goYSksdGhpcy5faGFuZGxlQW5pbWF0aW9uKCl9LEtpbmV0aWMuQW5pbWF0aW9uLl9yZW1vdmVBbmltYXRpb249ZnVuY3Rpb24oYSl7dmFyIGIsYz1hLmlkLGQ9dGhpcy5hbmltYXRpb25zLGU9ZC5sZW5ndGg7Zm9yKGI9MDtlPmI7YisrKWlmKGRbYl0uaWQ9PT1jKXt0aGlzLmFuaW1hdGlvbnMuc3BsaWNlKGIsMSk7YnJlYWt9fSxLaW5ldGljLkFuaW1hdGlvbi5fcnVuRnJhbWVzPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGUsZixnLGgsaSxqPXt9LGs9dGhpcy5hbmltYXRpb25zO2ZvcihlPTA7ZTxrLmxlbmd0aDtlKyspe2ZvcihhPWtbZV0sYj1hLmxheWVycyxjPWEuZnVuYyxhLl91cGRhdGVGcmFtZU9iamVjdChkKCkpLGc9Yi5sZW5ndGgsZj0wO2c+ZjtmKyspaD1iW2ZdLHZvaWQgMCE9PWguX2lkJiYoaltoLl9pZF09aCk7YyYmYy5jYWxsKGEsYS5mcmFtZSl9Zm9yKGkgaW4gailqW2ldLmRyYXcoKX0sS2luZXRpYy5BbmltYXRpb24uX2FuaW1hdGlvbkxvb3A9ZnVuY3Rpb24oKXt2YXIgYT1LaW5ldGljLkFuaW1hdGlvbjthLmFuaW1hdGlvbnMubGVuZ3RoPyhiKGEuX2FuaW1hdGlvbkxvb3ApLGEuX3J1bkZyYW1lcygpKTphLmFuaW1SdW5uaW5nPSExfSxLaW5ldGljLkFuaW1hdGlvbi5faGFuZGxlQW5pbWF0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLmFuaW1SdW5uaW5nfHwodGhpcy5hbmltUnVubmluZz0hMCxhLl9hbmltYXRpb25Mb29wKCkpfTt2YXIgZj1LaW5ldGljLk5vZGUucHJvdG90eXBlLm1vdmVUbztLaW5ldGljLk5vZGUucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbihhKXtmLmNhbGwodGhpcyxhKX0sS2luZXRpYy5MYXllci5wcm90b3R5cGUuYmF0Y2hEcmF3PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPUtpbmV0aWMuQW5pbWF0aW9uO3RoaXMuYmF0Y2hBbmltfHwodGhpcy5iYXRjaEFuaW09bmV3IGIoZnVuY3Rpb24oKXthLmxhc3RCYXRjaERyYXdUaW1lJiZkKCktYS5sYXN0QmF0Y2hEcmF3VGltZT5jJiZhLmJhdGNoQW5pbS5zdG9wKCl9LHRoaXMpKSx0aGlzLmxhc3RCYXRjaERyYXdUaW1lPWQoKSx0aGlzLmJhdGNoQW5pbS5pc1J1bm5pbmcoKXx8KHRoaXMuZHJhdygpLHRoaXMuYmF0Y2hBbmltLnN0YXJ0KCkpfSxLaW5ldGljLlN0YWdlLnByb3RvdHlwZS5iYXRjaERyYXc9ZnVuY3Rpb24oKXt0aGlzLmdldENoaWxkcmVuKCkuZWFjaChmdW5jdGlvbihhKXthLmJhdGNoRHJhdygpfSl9fSgoMSxldmFsKShcInRoaXNcIikpLGZ1bmN0aW9uKCl7dmFyIGE9e25vZGU6MSxkdXJhdGlvbjoxLGVhc2luZzoxLG9uRmluaXNoOjEseW95bzoxfSxiPTEsYz0yLGQ9MyxlPTA7S2luZXRpYy5Ud2Vlbj1mdW5jdGlvbihiKXt2YXIgYyxkPXRoaXMsZz1iLm5vZGUsaD1nLl9pZCxpPWIuZHVyYXRpb258fDEsaj1iLmVhc2luZ3x8S2luZXRpYy5FYXNpbmdzLkxpbmVhcixrPSEhYi55b3lvO3RoaXMubm9kZT1nLHRoaXMuX2lkPWUrKyx0aGlzLmFuaW09bmV3IEtpbmV0aWMuQW5pbWF0aW9uKGZ1bmN0aW9uKCl7ZC50d2Vlbi5vbkVudGVyRnJhbWUoKX0sZy5nZXRMYXllcigpKSx0aGlzLnR3ZWVuPW5ldyBmKGMsZnVuY3Rpb24oYSl7ZC5fdHdlZW5GdW5jKGEpfSxqLDAsMSwxZTMqaSxrKSx0aGlzLl9hZGRMaXN0ZW5lcnMoKSxLaW5ldGljLlR3ZWVuLmF0dHJzW2hdfHwoS2luZXRpYy5Ud2Vlbi5hdHRyc1toXT17fSksS2luZXRpYy5Ud2Vlbi5hdHRyc1toXVt0aGlzLl9pZF18fChLaW5ldGljLlR3ZWVuLmF0dHJzW2hdW3RoaXMuX2lkXT17fSksS2luZXRpYy5Ud2Vlbi50d2VlbnNbaF18fChLaW5ldGljLlR3ZWVuLnR3ZWVuc1toXT17fSk7Zm9yKGMgaW4gYil2b2lkIDA9PT1hW2NdJiZ0aGlzLl9hZGRBdHRyKGMsYltjXSk7dGhpcy5yZXNldCgpLHRoaXMub25GaW5pc2g9Yi5vbkZpbmlzaCx0aGlzLm9uUmVzZXQ9Yi5vblJlc2V0fSxLaW5ldGljLlR3ZWVuLmF0dHJzPXt9LEtpbmV0aWMuVHdlZW4udHdlZW5zPXt9LEtpbmV0aWMuVHdlZW4ucHJvdG90eXBlPXtfYWRkQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaD10aGlzLm5vZGUsaT1oLl9pZDtpZihlPUtpbmV0aWMuVHdlZW4udHdlZW5zW2ldW2FdLGUmJmRlbGV0ZSBLaW5ldGljLlR3ZWVuLmF0dHJzW2ldW2VdW2FdLGM9aC5nZXRBdHRyKGEpLEtpbmV0aWMuVXRpbC5faXNBcnJheShiKSlmb3IoZD1bXSxnPWIubGVuZ3RoLGY9MDtnPmY7ZisrKWQucHVzaChiW2ZdLWNbZl0pO2Vsc2UgZD1iLWM7S2luZXRpYy5Ud2Vlbi5hdHRyc1tpXVt0aGlzLl9pZF1bYV09e3N0YXJ0OmMsZGlmZjpkfSxLaW5ldGljLlR3ZWVuLnR3ZWVuc1tpXVthXT10aGlzLl9pZH0sX3R3ZWVuRnVuYzpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPXRoaXMubm9kZSxqPUtpbmV0aWMuVHdlZW4uYXR0cnNbaS5faWRdW3RoaXMuX2lkXTtmb3IoYiBpbiBqKXtpZihjPWpbYl0sZD1jLnN0YXJ0LGU9Yy5kaWZmLEtpbmV0aWMuVXRpbC5faXNBcnJheShkKSlmb3IoZj1bXSxoPWQubGVuZ3RoLGc9MDtoPmc7ZysrKWYucHVzaChkW2ddK2VbZ10qYSk7ZWxzZSBmPWQrZSphO2kuc2V0QXR0cihiLGYpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy50d2Vlbi5vblBsYXk9ZnVuY3Rpb24oKXthLmFuaW0uc3RhcnQoKX0sdGhpcy50d2Vlbi5vblJldmVyc2U9ZnVuY3Rpb24oKXthLmFuaW0uc3RhcnQoKX0sdGhpcy50d2Vlbi5vblBhdXNlPWZ1bmN0aW9uKCl7YS5hbmltLnN0b3AoKX0sdGhpcy50d2Vlbi5vbkZpbmlzaD1mdW5jdGlvbigpe2Eub25GaW5pc2gmJmEub25GaW5pc2goKX0sdGhpcy50d2Vlbi5vblJlc2V0PWZ1bmN0aW9uKCl7YS5vblJlc2V0JiZhLm9uUmVzZXQoKX19LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50d2Vlbi5wbGF5KCksdGhpc30scmV2ZXJzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR3ZWVuLnJldmVyc2UoKSx0aGlzfSxyZXNldDpmdW5jdGlvbigpe3RoaXMubm9kZTtyZXR1cm4gdGhpcy50d2Vlbi5yZXNldCgpLHRoaXN9LHNlZWs6ZnVuY3Rpb24oYSl7dGhpcy5ub2RlO3JldHVybiB0aGlzLnR3ZWVuLnNlZWsoMWUzKmEpLHRoaXN9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHdlZW4ucGF1c2UoKSx0aGlzfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLm5vZGU7cmV0dXJuIHRoaXMudHdlZW4uZmluaXNoKCksdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhLGI9dGhpcy5ub2RlLl9pZCxjPXRoaXMuX2lkLGQ9S2luZXRpYy5Ud2Vlbi50d2VlbnNbYl07dGhpcy5wYXVzZSgpO2ZvcihhIGluIGQpZGVsZXRlIEtpbmV0aWMuVHdlZW4udHdlZW5zW2JdW2FdO2RlbGV0ZSBLaW5ldGljLlR3ZWVuLmF0dHJzW2JdW2NdfX07dmFyIGY9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dGhpcy5wcm9wPWEsdGhpcy5wcm9wRnVuYz1iLHRoaXMuYmVnaW49ZCx0aGlzLl9wb3M9ZCx0aGlzLmR1cmF0aW9uPWYsdGhpcy5fY2hhbmdlPTAsdGhpcy5wcmV2UG9zPTAsdGhpcy55b3lvPWcsdGhpcy5fdGltZT0wLHRoaXMuX3Bvc2l0aW9uPTAsdGhpcy5fc3RhcnRUaW1lPTAsdGhpcy5fZmluaXNoPTAsdGhpcy5mdW5jPWMsdGhpcy5fY2hhbmdlPWUtdGhpcy5iZWdpbix0aGlzLnBhdXNlKCl9O2YucHJvdG90eXBlPXtmaXJlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbYV07YiYmYigpfSxzZXRUaW1lOmZ1bmN0aW9uKGEpe2E+dGhpcy5kdXJhdGlvbj90aGlzLnlveW8/KHRoaXMuX3RpbWU9dGhpcy5kdXJhdGlvbix0aGlzLnJldmVyc2UoKSk6dGhpcy5maW5pc2goKTowPmE/dGhpcy55b3lvPyh0aGlzLl90aW1lPTAsdGhpcy5wbGF5KCkpOnRoaXMucmVzZXQoKToodGhpcy5fdGltZT1hLHRoaXMudXBkYXRlKCkpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWV9LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe3RoaXMucHJldlBvcz10aGlzLl9wb3MsdGhpcy5wcm9wRnVuYyhhKSx0aGlzLl9wb3M9YX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWEmJihhPXRoaXMuX3RpbWUpLHRoaXMuZnVuYyhhLHRoaXMuYmVnaW4sdGhpcy5fY2hhbmdlLHRoaXMuZHVyYXRpb24pfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1jLHRoaXMuX3N0YXJ0VGltZT10aGlzLmdldFRpbWVyKCktdGhpcy5fdGltZSx0aGlzLm9uRW50ZXJGcmFtZSgpLHRoaXMuZmlyZShcIm9uUGxheVwiKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuc3RhdGU9ZCx0aGlzLl90aW1lPXRoaXMuZHVyYXRpb24tdGhpcy5fdGltZSx0aGlzLl9zdGFydFRpbWU9dGhpcy5nZXRUaW1lcigpLXRoaXMuX3RpbWUsdGhpcy5vbkVudGVyRnJhbWUoKSx0aGlzLmZpcmUoXCJvblJldmVyc2VcIil9LHNlZWs6ZnVuY3Rpb24oYSl7dGhpcy5wYXVzZSgpLHRoaXMuX3RpbWU9YSx0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZShcIm9uU2Vla1wiKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCksdGhpcy5fdGltZT0wLHRoaXMudXBkYXRlKCksdGhpcy5maXJlKFwib25SZXNldFwiKX0sZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpLHRoaXMuX3RpbWU9dGhpcy5kdXJhdGlvbix0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZShcIm9uRmluaXNoXCIpfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLnNldFBvc2l0aW9uKHRoaXMuZ2V0UG9zaXRpb24odGhpcy5fdGltZSkpfSxvbkVudGVyRnJhbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFRpbWVyKCktdGhpcy5fc3RhcnRUaW1lO3RoaXMuc3RhdGU9PT1jP3RoaXMuc2V0VGltZShhKTp0aGlzLnN0YXRlPT09ZCYmdGhpcy5zZXRUaW1lKHRoaXMuZHVyYXRpb24tYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1iLHRoaXMuZmlyZShcIm9uUGF1c2VcIil9LGdldFRpbWVyOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9fSxLaW5ldGljLkVhc2luZ3M9e0JhY2tFYXNlSW46ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9MS43MDE1ODtyZXR1cm4gYyooYS89ZCkqYSooKGUrMSkqYS1lKStifSxCYWNrRWFzZU91dDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0xLjcwMTU4O3JldHVybiBjKigoYT1hL2QtMSkqYSooKGUrMSkqYStlKSsxKStifSxCYWNrRWFzZUluT3V0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPTEuNzAxNTg7cmV0dXJuKGEvPWQvMik8MT9jLzIqYSphKigoKGUqPTEuNTI1KSsxKSphLWUpK2I6Yy8yKigoYS09MikqYSooKChlKj0xLjUyNSkrMSkqYStlKSsyKStifSxFbGFzdGljRWFzZUluOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz0wO3JldHVybiAwPT09YT9iOjE9PShhLz1kKT9iK2M6KGZ8fChmPS4zKmQpLCFlfHxlPE1hdGguYWJzKGMpPyhlPWMsZz1mLzQpOmc9Zi8oMipNYXRoLlBJKSpNYXRoLmFzaW4oYy9lKSwtKGUqTWF0aC5wb3coMiwxMCooYS09MSkpKk1hdGguc2luKDIqKGEqZC1nKSpNYXRoLlBJL2YpKStiKX0sRWxhc3RpY0Vhc2VPdXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPTA7cmV0dXJuIDA9PT1hP2I6MT09KGEvPWQpP2IrYzooZnx8KGY9LjMqZCksIWV8fGU8TWF0aC5hYnMoYyk/KGU9YyxnPWYvNCk6Zz1mLygyKk1hdGguUEkpKk1hdGguYXNpbihjL2UpLGUqTWF0aC5wb3coMiwtMTAqYSkqTWF0aC5zaW4oMiooYSpkLWcpKk1hdGguUEkvZikrYytiKX0sRWxhc3RpY0Vhc2VJbk91dDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9MDtyZXR1cm4gMD09PWE/YjoyPT0oYS89ZC8yKT9iK2M6KGZ8fChmPS4zKmQqMS41KSwhZXx8ZTxNYXRoLmFicyhjKT8oZT1jLGc9Zi80KTpnPWYvKDIqTWF0aC5QSSkqTWF0aC5hc2luKGMvZSksMT5hPy0uNSplKk1hdGgucG93KDIsMTAqKGEtPTEpKSpNYXRoLnNpbigyKihhKmQtZykqTWF0aC5QSS9mKStiOmUqTWF0aC5wb3coMiwtMTAqKGEtPTEpKSpNYXRoLnNpbigyKihhKmQtZykqTWF0aC5QSS9mKSouNStjK2IpfSxCb3VuY2VFYXNlT3V0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kKTwxLzIuNzU/Ny41NjI1KmMqYSphK2I6Mi8yLjc1PmE/YyooNy41NjI1KihhLT0xLjUvMi43NSkqYSsuNzUpK2I6Mi41LzIuNzU+YT9jKig3LjU2MjUqKGEtPTIuMjUvMi43NSkqYSsuOTM3NSkrYjpjKig3LjU2MjUqKGEtPTIuNjI1LzIuNzUpKmErLjk4NDM3NSkrYn0sQm91bmNlRWFzZUluOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjLUtpbmV0aWMuRWFzaW5ncy5Cb3VuY2VFYXNlT3V0KGQtYSwwLGMsZCkrYn0sQm91bmNlRWFzZUluT3V0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBkLzI+YT8uNSpLaW5ldGljLkVhc2luZ3MuQm91bmNlRWFzZUluKDIqYSwwLGMsZCkrYjouNSpLaW5ldGljLkVhc2luZ3MuQm91bmNlRWFzZU91dCgyKmEtZCwwLGMsZCkrLjUqYytifSxFYXNlSW46ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMqKGEvPWQpKmErYn0sRWFzZU91dDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4tYyooYS89ZCkqKGEtMikrYn0sRWFzZUluT3V0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYStiOi1jLzIqKC0tYSooYS0yKS0xKStifSxTdHJvbmdFYXNlSW46ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMqKGEvPWQpKmEqYSphKmErYn0sU3Ryb25nRWFzZU91dDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYyooKGE9YS9kLTEpKmEqYSphKmErMSkrYn0sU3Ryb25nRWFzZUluT3V0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sTGluZWFyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjKmEvZCtifX19KCksZnVuY3Rpb24oKXtLaW5ldGljLkREPXthbmltOm5ldyBLaW5ldGljLkFuaW1hdGlvbixpc0RyYWdnaW5nOiExLG9mZnNldDp7eDowLHk6MH0sbm9kZTpudWxsLF9kcmFnOmZ1bmN0aW9uKGEpe3ZhciBiPUtpbmV0aWMuREQsYz1iLm5vZGU7aWYoYyl7aWYoIWIuaXNEcmFnZ2luZyl7dmFyIGQ9Yy5nZXRTdGFnZSgpLmdldFBvaW50ZXJQb3NpdGlvbigpLGU9Yy5kcmFnRGlzdGFuY2UoKSxmPU1hdGgubWF4KE1hdGguYWJzKGQueC1iLnN0YXJ0UG9pbnRlclBvcy54KSxNYXRoLmFicyhkLnktYi5zdGFydFBvaW50ZXJQb3MueSkpO2lmKGU+ZilyZXR1cm59Yy5fc2V0RHJhZ1Bvc2l0aW9uKGEpLGIuaXNEcmFnZ2luZ3x8KGIuaXNEcmFnZ2luZz0hMCxjLmZpcmUoXCJkcmFnc3RhcnRcIix7dHlwZTpcImRyYWdzdGFydFwiLHRhcmdldDpjLGV2dDphfSwhMCkpLGMuZmlyZShcImRyYWdtb3ZlXCIse3R5cGU6XCJkcmFnbW92ZVwiLHRhcmdldDpjLGV2dDphfSwhMCl9fSxfZW5kRHJhZ0JlZm9yZTpmdW5jdGlvbihhKXt2YXIgYixjLGQ9S2luZXRpYy5ERCxlPWQubm9kZTtlJiYoYj1lLm5vZGVUeXBlLGM9ZS5nZXRMYXllcigpLGQuYW5pbS5zdG9wKCksZC5pc0RyYWdnaW5nJiYoZC5pc0RyYWdnaW5nPSExLEtpbmV0aWMubGlzdGVuQ2xpY2tUYXA9ITEsYSYmKGEuZHJhZ0VuZE5vZGU9ZSkpLGRlbGV0ZSBkLm5vZGUsKGN8fGUpLmRyYXcoKSl9LF9lbmREcmFnQWZ0ZXI6ZnVuY3Rpb24oYSl7YT1hfHx7fTt2YXIgYj1hLmRyYWdFbmROb2RlO2EmJmImJmIuZmlyZShcImRyYWdlbmRcIix7dHlwZTpcImRyYWdlbmRcIix0YXJnZXQ6YixldnQ6YX0sITApfX0sS2luZXRpYy5Ob2RlLnByb3RvdHlwZS5zdGFydERyYWc9ZnVuY3Rpb24oKXt2YXIgYT1LaW5ldGljLkRELGI9dGhpcy5nZXRTdGFnZSgpLGM9dGhpcy5nZXRMYXllcigpLGQ9Yi5nZXRQb2ludGVyUG9zaXRpb24oKSxlPXRoaXMuZ2V0QWJzb2x1dGVQb3NpdGlvbigpO2QmJihhLm5vZGUmJmEubm9kZS5zdG9wRHJhZygpLGEubm9kZT10aGlzLGEuc3RhcnRQb2ludGVyUG9zPWQsYS5vZmZzZXQueD1kLngtZS54LGEub2Zmc2V0Lnk9ZC55LWUueSxhLmFuaW0uc2V0TGF5ZXJzKGN8fHRoaXMuZ2V0TGF5ZXJzKCkpLGEuYW5pbS5zdGFydCgpLHRoaXMuX3NldERyYWdQb3NpdGlvbigpKX0sS2luZXRpYy5Ob2RlLnByb3RvdHlwZS5fc2V0RHJhZ1Bvc2l0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiPUtpbmV0aWMuREQsYz10aGlzLmdldFN0YWdlKCkuZ2V0UG9pbnRlclBvc2l0aW9uKCksZD10aGlzLmdldERyYWdCb3VuZEZ1bmMoKTtpZihjKXt2YXIgZT17eDpjLngtYi5vZmZzZXQueCx5OmMueS1iLm9mZnNldC55fTt2b2lkIDAhPT1kJiYoZT1kLmNhbGwodGhpcyxlLGEpKSx0aGlzLnNldEFic29sdXRlUG9zaXRpb24oZSl9fSxLaW5ldGljLk5vZGUucHJvdG90eXBlLnN0b3BEcmFnPWZ1bmN0aW9uKCl7dmFyIGE9S2luZXRpYy5ERCxiPXt9O2EuX2VuZERyYWdCZWZvcmUoYiksYS5fZW5kRHJhZ0FmdGVyKGIpfSxLaW5ldGljLk5vZGUucHJvdG90eXBlLnNldERyYWdnYWJsZT1mdW5jdGlvbihhKXt0aGlzLl9zZXRBdHRyKFwiZHJhZ2dhYmxlXCIsYSksdGhpcy5fZHJhZ0NoYW5nZSgpfTt2YXIgYT1LaW5ldGljLk5vZGUucHJvdG90eXBlLmRlc3Ryb3k7S2luZXRpYy5Ob2RlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGI9S2luZXRpYy5ERDtiLm5vZGUmJmIubm9kZS5faWQ9PT10aGlzLl9pZCYmdGhpcy5zdG9wRHJhZygpLGEuY2FsbCh0aGlzKX0sS2luZXRpYy5Ob2RlLnByb3RvdHlwZS5pc0RyYWdnaW5nPWZ1bmN0aW9uKCl7dmFyIGE9S2luZXRpYy5ERDtyZXR1cm4gYS5ub2RlJiZhLm5vZGUuX2lkPT09dGhpcy5faWQmJmEuaXNEcmFnZ2luZ30sS2luZXRpYy5Ob2RlLnByb3RvdHlwZS5fbGlzdGVuRHJhZz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5fZHJhZ0NsZWFudXAoKSxcIlN0YWdlXCI9PT10aGlzLmdldENsYXNzTmFtZSgpP3RoaXMub24oXCJjb250ZW50TW91c2Vkb3duLmtpbmV0aWMgY29udGVudFRvdWNoc3RhcnQua2luZXRpY1wiLGZ1bmN0aW9uKGIpe0tpbmV0aWMuREQubm9kZXx8YS5zdGFydERyYWcoYil9KTp0aGlzLm9uKFwibW91c2Vkb3duLmtpbmV0aWMgdG91Y2hzdGFydC5raW5ldGljXCIsZnVuY3Rpb24oYil7S2luZXRpYy5ERC5ub2RlfHxhLnN0YXJ0RHJhZyhiKX0pfSxLaW5ldGljLk5vZGUucHJvdG90eXBlLl9kcmFnQ2hhbmdlPWZ1bmN0aW9uKCl7aWYodGhpcy5hdHRycy5kcmFnZ2FibGUpdGhpcy5fbGlzdGVuRHJhZygpO2Vsc2V7dGhpcy5fZHJhZ0NsZWFudXAoKTt2YXIgYT10aGlzLmdldFN0YWdlKCksYj1LaW5ldGljLkREO2EmJmIubm9kZSYmYi5ub2RlLl9pZD09PXRoaXMuX2lkJiZiLm5vZGUuc3RvcERyYWcoKX19LEtpbmV0aWMuTm9kZS5wcm90b3R5cGUuX2RyYWdDbGVhbnVwPWZ1bmN0aW9uKCl7XCJTdGFnZVwiPT09dGhpcy5nZXRDbGFzc05hbWUoKT8odGhpcy5vZmYoXCJjb250ZW50TW91c2Vkb3duLmtpbmV0aWNcIiksdGhpcy5vZmYoXCJjb250ZW50VG91Y2hzdGFydC5raW5ldGljXCIpKToodGhpcy5vZmYoXCJtb3VzZWRvd24ua2luZXRpY1wiKSx0aGlzLm9mZihcInRvdWNoc3RhcnQua2luZXRpY1wiKSl9LEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Ob2RlLFwiZHJhZ0JvdW5kRnVuY1wiKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyKEtpbmV0aWMuTm9kZSxcImRyYWdnYWJsZVwiLCExKSxLaW5ldGljLkZhY3RvcnkuYWRkT3ZlcmxvYWRlZEdldHRlclNldHRlcihLaW5ldGljLk5vZGUsXCJkcmFnZ2FibGVcIik7dmFyIGI9S2luZXRpYy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Yi5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLEtpbmV0aWMuREQuX2VuZERyYWdCZWZvcmUsITApLGIuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsS2luZXRpYy5ERC5fZW5kRHJhZ0JlZm9yZSwhMCksYi5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLEtpbmV0aWMuREQuX2VuZERyYWdBZnRlciwhMSksYi5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIixLaW5ldGljLkRELl9lbmREcmFnQWZ0ZXIsITEpfSgpLGZ1bmN0aW9uKCl7S2luZXRpYy5VdGlsLmFkZE1ldGhvZHMoS2luZXRpYy5Db250YWluZXIse19faW5pdDpmdW5jdGlvbihhKXt0aGlzLmNoaWxkcmVuPW5ldyBLaW5ldGljLkNvbGxlY3Rpb24sS2luZXRpYy5Ob2RlLmNhbGwodGhpcyxhKX0sZ2V0Q2hpbGRyZW46ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IEtpbmV0aWMuQ29sbGVjdGlvbjtyZXR1cm4gdGhpcy5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKGMpe2EoYykmJmIucHVzaChjKX0pLGJ9cmV0dXJuIHRoaXMuY2hpbGRyZW59LGhhc0NoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg+MH0scmVtb3ZlQ2hpbGRyZW46ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj1LaW5ldGljLkNvbGxlY3Rpb24udG9Db2xsZWN0aW9uKHRoaXMuY2hpbGRyZW4pLGM9MDtjPGIubGVuZ3RoO2MrKylhPWJbY10sZGVsZXRlIGEucGFyZW50LGEuaW5kZXg9MCxhLmhhc0NoaWxkcmVuKCkmJmEucmVtb3ZlQ2hpbGRyZW4oKSxhLnJlbW92ZSgpO3JldHVybiBiPW51bGwsdGhpcy5jaGlsZHJlbj1uZXcgS2luZXRpYy5Db2xsZWN0aW9uLHRoaXN9LGRlc3Ryb3lDaGlsZHJlbjpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPUtpbmV0aWMuQ29sbGVjdGlvbi50b0NvbGxlY3Rpb24odGhpcy5jaGlsZHJlbiksYz0wO2M8Yi5sZW5ndGg7YysrKWE9YltjXSxkZWxldGUgYS5wYXJlbnQsYS5pbmRleD0wLGEuZGVzdHJveSgpO3JldHVybiBiPW51bGwsdGhpcy5jaGlsZHJlbj1uZXcgS2luZXRpYy5Db2xsZWN0aW9uLHRoaXN9LGFkZDpmdW5jdGlvbihhKXtpZighKGFyZ3VtZW50cy5sZW5ndGg+MSkpe2lmKGEuZ2V0UGFyZW50KCkpcmV0dXJuIHZvaWQgYS5tb3ZlVG8odGhpcyk7dmFyIGI9dGhpcy5jaGlsZHJlbjtyZXR1cm4gdGhpcy5fdmFsaWRhdGVBZGQoYSksYS5pbmRleD1iLmxlbmd0aCxhLnBhcmVudD10aGlzLGIucHVzaChhKSx0aGlzLl9maXJlKFwiYWRkXCIse2NoaWxkOmF9KSx0aGlzfWZvcih2YXIgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdGhpcy5hZGQoYXJndW1lbnRzW2NdKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuaGFzQ2hpbGRyZW4oKSYmdGhpcy5kZXN0cm95Q2hpbGRyZW4oKSxLaW5ldGljLk5vZGUucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sZmluZDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPVtdLGo9YS5yZXBsYWNlKC8gL2csXCJcIikuc3BsaXQoXCIsXCIpLGs9ai5sZW5ndGg7Zm9yKGI9MDtrPmI7YisrKWlmKGQ9altiXSxcIiNcIj09PWQuY2hhckF0KDApKWY9dGhpcy5fZ2V0Tm9kZUJ5SWQoZC5zbGljZSgxKSksZiYmaS5wdXNoKGYpO2Vsc2UgaWYoXCIuXCI9PT1kLmNoYXJBdCgwKSllPXRoaXMuX2dldE5vZGVzQnlOYW1lKGQuc2xpY2UoMSkpLGk9aS5jb25jYXQoZSk7ZWxzZSBmb3IoZz10aGlzLmdldENoaWxkcmVuKCksaD1nLmxlbmd0aCxjPTA7aD5jO2MrKylpPWkuY29uY2F0KGdbY10uX2dldChkKSk7cmV0dXJuIEtpbmV0aWMuQ29sbGVjdGlvbi50b0NvbGxlY3Rpb24oaSl9LF9nZXROb2RlQnlJZDpmdW5jdGlvbihhKXt2YXIgYj1LaW5ldGljLmlkc1thXTtyZXR1cm4gdm9pZCAwIT09YiYmdGhpcy5pc0FuY2VzdG9yT2YoYik/YjpudWxsfSxfZ2V0Tm9kZXNCeU5hbWU6ZnVuY3Rpb24oYSl7dmFyIGI9S2luZXRpYy5uYW1lc1thXXx8W107cmV0dXJuIHRoaXMuX2dldERlc2NlbmRhbnRzKGIpfSxfZ2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1LaW5ldGljLk5vZGUucHJvdG90eXBlLl9nZXQuY2FsbCh0aGlzLGEpLGM9dGhpcy5nZXRDaGlsZHJlbigpLGQ9Yy5sZW5ndGgsZT0wO2Q+ZTtlKyspYj1iLmNvbmNhdChjW2VdLl9nZXQoYSkpO3JldHVybiBifSx0b09iamVjdDpmdW5jdGlvbigpe3ZhciBhPUtpbmV0aWMuTm9kZS5wcm90b3R5cGUudG9PYmplY3QuY2FsbCh0aGlzKTthLmNoaWxkcmVuPVtdO2Zvcih2YXIgYj10aGlzLmdldENoaWxkcmVuKCksYz1iLmxlbmd0aCxkPTA7Yz5kO2QrKyl7dmFyIGU9YltkXTthLmNoaWxkcmVuLnB1c2goZS50b09iamVjdCgpKX1yZXR1cm4gYX0sX2dldERlc2NlbmRhbnRzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPWEubGVuZ3RoLGQ9MDtjPmQ7ZCsrKXt2YXIgZT1hW2RdO3RoaXMuaXNBbmNlc3Rvck9mKGUpJiZiLnB1c2goZSl9cmV0dXJuIGJ9LGlzQW5jZXN0b3JPZjpmdW5jdGlvbihhKXtmb3IodmFyIGI9YS5nZXRQYXJlbnQoKTtiOyl7aWYoYi5faWQ9PT10aGlzLl9pZClyZXR1cm4hMDtiPWIuZ2V0UGFyZW50KCl9cmV0dXJuITF9LGNsb25lOmZ1bmN0aW9uKGEpe3ZhciBiPUtpbmV0aWMuTm9kZS5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzLGEpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZWFjaChmdW5jdGlvbihhKXtiLmFkZChhLmNsb25lKCkpfSksYn0sZ2V0QWxsSW50ZXJzZWN0aW9uczpmdW5jdGlvbihhKXt2YXIgYj1bXTtyZXR1cm4gdGhpcy5maW5kKFwiU2hhcGVcIikuZWFjaChmdW5jdGlvbihjKXtjLmlzVmlzaWJsZSgpJiZjLmludGVyc2VjdHMoYSkmJmIucHVzaChjKX0pLGJ9LF9zZXRDaGlsZHJlbkluZGljZXM6ZnVuY3Rpb24oKXt0aGlzLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oYSxiKXthLmluZGV4PWJ9KX0sZHJhd1NjZW5lOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXRMYXllcigpLGQ9YXx8YyYmYy5nZXRDYW52YXMoKSxlPWQmJmQuZ2V0Q29udGV4dCgpLGY9dGhpcy5fY2FjaGUuY2FudmFzLGc9ZiYmZi5zY2VuZTtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmKGc/dGhpcy5fZHJhd0NhY2hlZFNjZW5lQ2FudmFzKGUpOnRoaXMuX2RyYXdDaGlsZHJlbihkLFwiZHJhd1NjZW5lXCIsYikpLHRoaXNcclxufSxkcmF3SGl0OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXRMYXllcigpLGQ9YXx8YyYmYy5oaXRDYW52YXMsZT1kJiZkLmdldENvbnRleHQoKSxmPXRoaXMuX2NhY2hlLmNhbnZhcyxnPWYmJmYuaGl0O3JldHVybiB0aGlzLnNob3VsZERyYXdIaXQoKSYmKGc/dGhpcy5fZHJhd0NhY2hlZEhpdENhbnZhcyhlKTp0aGlzLl9kcmF3Q2hpbGRyZW4oZCxcImRyYXdIaXRcIixiKSksdGhpc30sX2RyYXdDaGlsZHJlbjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXRoaXMuZ2V0TGF5ZXIoKSxnPWEmJmEuZ2V0Q29udGV4dCgpLGg9dGhpcy5nZXRDbGlwV2lkdGgoKSxpPXRoaXMuZ2V0Q2xpcEhlaWdodCgpLGo9aCYmaTtqJiZmJiYoZD10aGlzLmdldENsaXBYKCksZT10aGlzLmdldENsaXBZKCksZy5zYXZlKCksZi5fYXBwbHlUcmFuc2Zvcm0odGhpcyxnKSxnLmJlZ2luUGF0aCgpLGcucmVjdChkLGUsaCxpKSxnLmNsaXAoKSxnLnJlc2V0KCkpLHRoaXMuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihkKXtkW2JdKGEsYyl9KSxqJiZnLnJlc3RvcmUoKX19KSxLaW5ldGljLlV0aWwuZXh0ZW5kKEtpbmV0aWMuQ29udGFpbmVyLEtpbmV0aWMuTm9kZSksS2luZXRpYy5Db250YWluZXIucHJvdG90eXBlLmdldD1LaW5ldGljLkNvbnRhaW5lci5wcm90b3R5cGUuZmluZCxLaW5ldGljLkZhY3RvcnkuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcihLaW5ldGljLkNvbnRhaW5lcixcImNsaXBcIixbXCJ4XCIsXCJ5XCIsXCJ3aWR0aFwiLFwiaGVpZ2h0XCJdKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuQ29udGFpbmVyLFwiY2xpcFhcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkNvbnRhaW5lcixcImNsaXBZXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5Db250YWluZXIsXCJjbGlwV2lkdGhcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkNvbnRhaW5lcixcImNsaXBIZWlnaHRcIiksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5Db250YWluZXIpfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXthLmZpbGwoKX1mdW5jdGlvbiBiKGEpe2Euc3Ryb2tlKCl9ZnVuY3Rpb24gYyhhKXthLmZpbGwoKX1mdW5jdGlvbiBkKGEpe2Euc3Ryb2tlKCl9ZnVuY3Rpb24gZSgpe3RoaXMuX2NsZWFyQ2FjaGUoZil9dmFyIGY9XCJoYXNTaGFkb3dcIjtLaW5ldGljLlV0aWwuYWRkTWV0aG9kcyhLaW5ldGljLlNoYXBlLHtfX2luaXQ6ZnVuY3Rpb24oZil7dGhpcy5ub2RlVHlwZT1cIlNoYXBlXCIsdGhpcy5fZmlsbEZ1bmM9YSx0aGlzLl9zdHJva2VGdW5jPWIsdGhpcy5fZmlsbEZ1bmNIaXQ9Yyx0aGlzLl9zdHJva2VGdW5jSGl0PWQ7Zm9yKHZhciBnLGg9S2luZXRpYy5zaGFwZXM7OylpZihnPUtpbmV0aWMuVXRpbC5nZXRSYW5kb21Db2xvcigpLGcmJiEoZyBpbiBoKSlicmVhazt0aGlzLmNvbG9yS2V5PWcsaFtnXT10aGlzLEtpbmV0aWMuTm9kZS5jYWxsKHRoaXMsZiksdGhpcy5vbihcInNoYWRvd0NvbG9yQ2hhbmdlLmtpbmV0aWMgc2hhZG93Qmx1ckNoYW5nZS5raW5ldGljIHNoYWRvd09mZnNldENoYW5nZS5raW5ldGljIHNoYWRvd09wYWNpdHlDaGFuZ2Uua2luZXRpYyBzaGFkb3dFbmFibGVkQ2hhbmdlLmtpbmV0aWNcIixlKX0saGFzQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0Q2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExheWVyKCkuZ2V0Q29udGV4dCgpfSxnZXRDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXllcigpLmdldENhbnZhcygpfSxoYXNTaGFkb3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Q2FjaGUoZix0aGlzLl9oYXNTaGFkb3cpfSxfaGFzU2hhZG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U2hhZG93RW5hYmxlZCgpJiYwIT09dGhpcy5nZXRTaGFkb3dPcGFjaXR5KCkmJiEhKHRoaXMuZ2V0U2hhZG93Q29sb3IoKXx8dGhpcy5nZXRTaGFkb3dCbHVyKCl8fHRoaXMuZ2V0U2hhZG93T2Zmc2V0WCgpfHx0aGlzLmdldFNoYWRvd09mZnNldFkoKSl9LGhhc0ZpbGw6ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLmdldEZpbGwoKXx8dGhpcy5nZXRGaWxsUGF0dGVybkltYWdlKCl8fHRoaXMuZ2V0RmlsbExpbmVhckdyYWRpZW50Q29sb3JTdG9wcygpfHx0aGlzLmdldEZpbGxSYWRpYWxHcmFkaWVudENvbG9yU3RvcHMoKSl9LGhhc1N0cm9rZTpmdW5jdGlvbigpe3JldHVybiEhKHRoaXMuc3Ryb2tlKCl8fHRoaXMuc3Ryb2tlUmVkKCl8fHRoaXMuc3Ryb2tlR3JlZW4oKXx8dGhpcy5zdHJva2VCbHVlKCkpfSxfZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNsYXNzTmFtZT09PWF8fHRoaXMubm9kZVR5cGU9PT1hP1t0aGlzXTpbXX0saW50ZXJzZWN0czpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMuZ2V0U3RhZ2UoKSxkPWMuYnVmZmVySGl0Q2FudmFzO3JldHVybiBkLmdldENvbnRleHQoKS5jbGVhcigpLHRoaXMuZHJhd1NjZW5lKGQpLGI9ZC5jb250ZXh0LmdldEltYWdlRGF0YShNYXRoLnJvdW5kKGEueCksTWF0aC5yb3VuZChhLnkpLDEsMSkuZGF0YSxiWzNdPjB9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtLaW5ldGljLk5vZGUucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSxkZWxldGUgS2luZXRpYy5zaGFwZXNbdGhpcy5jb2xvcktleV19LF91c2VCdWZmZXJDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5oYXNTaGFkb3coKXx8MSE9PXRoaXMuZ2V0QWJzb2x1dGVPcGFjaXR5KCkpJiZ0aGlzLmhhc0ZpbGwoKSYmdGhpcy5oYXNTdHJva2UoKSYmdGhpcy5nZXRTdGFnZSgpfSxkcmF3U2NlbmU6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzLmdldExheWVyKCksZz1hfHxmLmdldENhbnZhcygpLGg9Zy5nZXRDb250ZXh0KCksaT10aGlzLl9jYWNoZS5jYW52YXMsaj10aGlzLnNjZW5lRnVuYygpLGs9dGhpcy5oYXNTaGFkb3coKTtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmKGk/dGhpcy5fZHJhd0NhY2hlZFNjZW5lQ2FudmFzKGgpOmomJihoLnNhdmUoKSx0aGlzLl91c2VCdWZmZXJDYW52YXMoKT8oYz10aGlzLmdldFN0YWdlKCksZD1jLmJ1ZmZlckNhbnZhcyxlPWQuZ2V0Q29udGV4dCgpLGUuY2xlYXIoKSxlLnNhdmUoKSxlLl9hcHBseUxpbmVKb2luKHRoaXMpLGYuX2FwcGx5VHJhbnNmb3JtKHRoaXMsZSxiKSxqLmNhbGwodGhpcyxlKSxlLnJlc3RvcmUoKSxrJiYoaC5zYXZlKCksaC5fYXBwbHlTaGFkb3codGhpcyksaC5kcmF3SW1hZ2UoZC5fY2FudmFzLDAsMCksaC5yZXN0b3JlKCkpLGguX2FwcGx5T3BhY2l0eSh0aGlzKSxoLmRyYXdJbWFnZShkLl9jYW52YXMsMCwwKSk6KGguX2FwcGx5TGluZUpvaW4odGhpcyksZi5fYXBwbHlUcmFuc2Zvcm0odGhpcyxoLGIpLGsmJihoLnNhdmUoKSxoLl9hcHBseVNoYWRvdyh0aGlzKSxqLmNhbGwodGhpcyxoKSxoLnJlc3RvcmUoKSksaC5fYXBwbHlPcGFjaXR5KHRoaXMpLGouY2FsbCh0aGlzLGgpKSxoLnJlc3RvcmUoKSkpLHRoaXN9LGRyYXdIaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmdldExheWVyKCksZD1hfHxjLmhpdENhbnZhcyxlPWQuZ2V0Q29udGV4dCgpLGY9dGhpcy5oaXRGdW5jKCl8fHRoaXMuc2NlbmVGdW5jKCksZz10aGlzLl9jYWNoZS5jYW52YXMsaD1nJiZnLmhpdDtyZXR1cm4gdGhpcy5zaG91bGREcmF3SGl0KCkmJihoP3RoaXMuX2RyYXdDYWNoZWRIaXRDYW52YXMoZSk6ZiYmKGUuc2F2ZSgpLGUuX2FwcGx5TGluZUpvaW4odGhpcyksYy5fYXBwbHlUcmFuc2Zvcm0odGhpcyxlLGIpLGYuY2FsbCh0aGlzLGUpLGUucmVzdG9yZSgpKSksdGhpc30sZHJhd0hpdEZyb21DYWNoZTpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGo9YXx8MCxrPXRoaXMuX2NhY2hlLmNhbnZhcyxsPXRoaXMuX2dldENhY2hlZFNjZW5lQ2FudmFzKCksbT1sLmdldENvbnRleHQoKSxuPWsuaGl0LG89bi5nZXRDb250ZXh0KCkscD1sLmdldFdpZHRoKCkscT1sLmdldEhlaWdodCgpO28uY2xlYXIoKTt0cnl7Zm9yKGI9bS5nZXRJbWFnZURhdGEoMCwwLHAscSksYz1iLmRhdGEsZD1vLmdldEltYWdlRGF0YSgwLDAscCxxKSxlPWQuZGF0YSxmPWMubGVuZ3RoLGc9S2luZXRpYy5VdGlsLl9oZXhUb1JnYih0aGlzLmNvbG9yS2V5KSxoPTA7Zj5oO2grPTQpaT1jW2grM10saT5qJiYoZVtoXT1nLnIsZVtoKzFdPWcuZyxlW2grMl09Zy5iLGVbaCszXT0yNTUpO28ucHV0SW1hZ2VEYXRhKGQsMCwwKX1jYXRjaChyKXtLaW5ldGljLlV0aWwud2FybihcIlVuYWJsZSB0byBkcmF3IGhpdCBncmFwaCBmcm9tIGNhY2hlZCBzY2VuZSBjYW52YXMuIFwiK3IubWVzc2FnZSl9cmV0dXJuIHRoaXN9fSksS2luZXRpYy5VdGlsLmV4dGVuZChLaW5ldGljLlNoYXBlLEtpbmV0aWMuTm9kZSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwic3Ryb2tlXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInN0cm9rZVJlZFwiLDAsS2luZXRpYy5WYWxpZGF0b3JzLlJHQkNvbXBvbmVudCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwic3Ryb2tlR3JlZW5cIiwwLEtpbmV0aWMuVmFsaWRhdG9ycy5SR0JDb21wb25lbnQpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInN0cm9rZUJsdWVcIiwwLEtpbmV0aWMuVmFsaWRhdG9ycy5SR0JDb21wb25lbnQpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInN0cm9rZUFscGhhXCIsMSxLaW5ldGljLlZhbGlkYXRvcnMuYWxwaGFDb21wb25lbnQpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInN0cm9rZVdpZHRoXCIsMiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwibGluZUpvaW5cIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwibGluZUNhcFwiKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJzY2VuZUZ1bmNcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiaGl0RnVuY1wiKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJkYXNoXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInNoYWRvd0NvbG9yXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInNoYWRvd1JlZFwiLDAsS2luZXRpYy5WYWxpZGF0b3JzLlJHQkNvbXBvbmVudCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwic2hhZG93R3JlZW5cIiwwLEtpbmV0aWMuVmFsaWRhdG9ycy5SR0JDb21wb25lbnQpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInNoYWRvd0JsdWVcIiwwLEtpbmV0aWMuVmFsaWRhdG9ycy5SR0JDb21wb25lbnQpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInNoYWRvd0FscGhhXCIsMSxLaW5ldGljLlZhbGlkYXRvcnMuYWxwaGFDb21wb25lbnQpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInNoYWRvd0JsdXJcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwic2hhZG93T3BhY2l0eVwiKSxLaW5ldGljLkZhY3RvcnkuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwic2hhZG93T2Zmc2V0XCIsW1wieFwiLFwieVwiXSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwic2hhZG93T2Zmc2V0WFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInNoYWRvd09mZnNldFlcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUGF0dGVybkltYWdlXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiZmlsbFJlZFwiLDAsS2luZXRpYy5WYWxpZGF0b3JzLlJHQkNvbXBvbmVudCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiZmlsbEdyZWVuXCIsMCxLaW5ldGljLlZhbGlkYXRvcnMuUkdCQ29tcG9uZW50KSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsQmx1ZVwiLDAsS2luZXRpYy5WYWxpZGF0b3JzLlJHQkNvbXBvbmVudCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiZmlsbEFscGhhXCIsMSxLaW5ldGljLlZhbGlkYXRvcnMuYWxwaGFDb21wb25lbnQpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxQYXR0ZXJuWFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxQYXR0ZXJuWVwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxMaW5lYXJHcmFkaWVudENvbG9yU3RvcHNcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiZmlsbFJhZGlhbEdyYWRpZW50U3RhcnRSYWRpdXNcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUmFkaWFsR3JhZGllbnRFbmRSYWRpdXNcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUmFkaWFsR3JhZGllbnRDb2xvclN0b3BzXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxQYXR0ZXJuUmVwZWF0XCIsXCJyZXBlYXRcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiZmlsbEVuYWJsZWRcIiwhMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwic3Ryb2tlRW5hYmxlZFwiLCEwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJzaGFkb3dFbmFibGVkXCIsITApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImRhc2hFbmFibGVkXCIsITApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcInN0cm9rZVNjYWxlRW5hYmxlZFwiLCEwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUHJpb3JpdHlcIixcImNvbG9yXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUGF0dGVybk9mZnNldFwiLFtcInhcIixcInlcIl0pLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxQYXR0ZXJuT2Zmc2V0WFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxQYXR0ZXJuT2Zmc2V0WVwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUGF0dGVyblNjYWxlXCIsW1wieFwiLFwieVwiXSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiZmlsbFBhdHRlcm5TY2FsZVhcIiwxKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUGF0dGVyblNjYWxlWVwiLDEpLEtpbmV0aWMuRmFjdG9yeS5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsTGluZWFyR3JhZGllbnRTdGFydFBvaW50XCIsW1wieFwiLFwieVwiXSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiZmlsbExpbmVhckdyYWRpZW50U3RhcnRQb2ludFhcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsTGluZWFyR3JhZGllbnRTdGFydFBvaW50WVwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsTGluZWFyR3JhZGllbnRFbmRQb2ludFwiLFtcInhcIixcInlcIl0pLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxMaW5lYXJHcmFkaWVudEVuZFBvaW50WFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxMaW5lYXJHcmFkaWVudEVuZFBvaW50WVwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUmFkaWFsR3JhZGllbnRTdGFydFBvaW50XCIsW1wieFwiLFwieVwiXSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlNoYXBlLFwiZmlsbFJhZGlhbEdyYWRpZW50U3RhcnRQb2ludFhcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUmFkaWFsR3JhZGllbnRTdGFydFBvaW50WVwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKEtpbmV0aWMuU2hhcGUsXCJmaWxsUmFkaWFsR3JhZGllbnRFbmRQb2ludFwiLFtcInhcIixcInlcIl0pLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxSYWRpYWxHcmFkaWVudEVuZFBvaW50WFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxSYWRpYWxHcmFkaWVudEVuZFBvaW50WVwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TaGFwZSxcImZpbGxQYXR0ZXJuUm90YXRpb25cIiwwKSxLaW5ldGljLkZhY3RvcnkuYmFja0NvbXBhdChLaW5ldGljLlNoYXBlLHtkYXNoQXJyYXk6XCJkYXNoXCIsZ2V0RGFzaEFycmF5OlwiZ2V0RGFzaFwiLHNldERhc2hBcnJheTpcImdldERhc2hcIixkcmF3RnVuYzpcInNjZW5lRnVuY1wiLGdldERyYXdGdW5jOlwiZ2V0U2NlbmVGdW5jXCIsc2V0RHJhd0Z1bmM6XCJzZXRTY2VuZUZ1bmNcIixkcmF3SGl0RnVuYzpcImhpdEZ1bmNcIixnZXREcmF3SGl0RnVuYzpcImdldEhpdEZ1bmNcIixzZXREcmF3SGl0RnVuYzpcInNldEhpdEZ1bmNcIn0pLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuU2hhcGUpfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2EuY29udGVudC5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYyl7YVtJK2JdKGMpfSwhMSl9dmFyIGI9XCJTdGFnZVwiLGM9XCJzdHJpbmdcIixkPVwicHhcIixlPVwibW91c2VvdXRcIixmPVwibW91c2VsZWF2ZVwiLGc9XCJtb3VzZW92ZXJcIixoPVwibW91c2VlbnRlclwiLGk9XCJtb3VzZW1vdmVcIixqPVwibW91c2Vkb3duXCIsaz1cIm1vdXNldXBcIixsPVwiY2xpY2tcIixtPVwiZGJsY2xpY2tcIixuPVwidG91Y2hzdGFydFwiLG89XCJ0b3VjaGVuZFwiLHA9XCJ0YXBcIixxPVwiZGJsdGFwXCIscj1cInRvdWNobW92ZVwiLHM9XCJjb250ZW50TW91c2VvdXRcIix0PVwiY29udGVudE1vdXNlb3ZlclwiLHU9XCJjb250ZW50TW91c2Vtb3ZlXCIsdj1cImNvbnRlbnRNb3VzZWRvd25cIix3PVwiY29udGVudE1vdXNldXBcIix4PVwiY29udGVudENsaWNrXCIseT1cImNvbnRlbnREYmxjbGlja1wiLHo9XCJjb250ZW50VG91Y2hzdGFydFwiLEE9XCJjb250ZW50VG91Y2hlbmRcIixCPVwiY29udGVudERibHRhcFwiLEM9XCJjb250ZW50VG91Y2htb3ZlXCIsRD1cImRpdlwiLEU9XCJyZWxhdGl2ZVwiLEY9XCJpbmxpbmUtYmxvY2tcIixHPVwia2luZXRpY2pzLWNvbnRlbnRcIixIPVwiIFwiLEk9XCJfXCIsSj1cImNvbnRhaW5lclwiLEs9XCJcIixMPVtqLGksayxlLG4scixvLGddLE09TC5sZW5ndGg7S2luZXRpYy5VdGlsLmFkZE1ldGhvZHMoS2luZXRpYy5TdGFnZSx7X19faW5pdDpmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPWIsS2luZXRpYy5Db250YWluZXIuY2FsbCh0aGlzLGEpLHRoaXMuX2lkPUtpbmV0aWMuaWRDb3VudGVyKyssdGhpcy5fYnVpbGRET00oKSx0aGlzLl9iaW5kQ29udGVudEV2ZW50cygpLHRoaXMuX2VuYWJsZU5lc3RlZFRyYW5zZm9ybXM9ITEsS2luZXRpYy5zdGFnZXMucHVzaCh0aGlzKX0sX3ZhbGlkYXRlQWRkOmZ1bmN0aW9uKGEpe1wiTGF5ZXJcIiE9PWEuZ2V0VHlwZSgpJiZLaW5ldGljLlV0aWwuZXJyb3IoXCJZb3UgbWF5IG9ubHkgYWRkIGxheWVycyB0byB0aGUgc3RhZ2UuXCIpfSxzZXRDb250YWluZXI6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PT1jKXt2YXIgYj1hO2lmKGE9S2luZXRpYy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSwhYSl0aHJvd1wiQ2FuIG5vdCBmaW5kIGNvbnRhaW5lciBpbiBkb2N1bWVudCB3aXRoIGlkIFwiK2J9cmV0dXJuIHRoaXMuX3NldEF0dHIoSixhKSx0aGlzfSxzaG91bGREcmF3SGl0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGRyYXc6ZnVuY3Rpb24oKXtyZXR1cm4gS2luZXRpYy5Ob2RlLnByb3RvdHlwZS5kcmF3LmNhbGwodGhpcyksdGhpc30sc2V0SGVpZ2h0OmZ1bmN0aW9uKGEpe3JldHVybiBLaW5ldGljLk5vZGUucHJvdG90eXBlLnNldEhlaWdodC5jYWxsKHRoaXMsYSksdGhpcy5fcmVzaXplRE9NKCksdGhpc30sc2V0V2lkdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIEtpbmV0aWMuTm9kZS5wcm90b3R5cGUuc2V0V2lkdGguY2FsbCh0aGlzLGEpLHRoaXMuX3Jlc2l6ZURPTSgpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLmNoaWxkcmVuLGM9Yi5sZW5ndGg7Zm9yKGE9MDtjPmE7YSsrKWJbYV0uY2xlYXIoKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGF8fChhPXt9KSxhLmNvbnRhaW5lcj1LaW5ldGljLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoRCksS2luZXRpYy5Db250YWluZXIucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyxhKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY29udGVudDtLaW5ldGljLkNvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLGEmJktpbmV0aWMuVXRpbC5faXNJbkRvY3VtZW50KGEpJiZ0aGlzLmdldENvbnRhaW5lcigpLnJlbW92ZUNoaWxkKGEpO3ZhciBiPUtpbmV0aWMuc3RhZ2VzLmluZGV4T2YodGhpcyk7Yj4tMSYmS2luZXRpYy5zdGFnZXMuc3BsaWNlKGIsMSl9LGdldFBvaW50ZXJQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvaW50ZXJQb3N9LGdldFN0YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50fSx0b0RhdGFVUkw6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihlKXt2YXIgZj1pW2VdLGo9Zi50b0RhdGFVUkwoKSxrPW5ldyBLaW5ldGljLndpbmRvdy5JbWFnZTtrLm9ubG9hZD1mdW5jdGlvbigpe2guZHJhd0ltYWdlKGssMCwwKSxlPGkubGVuZ3RoLTE/YihlKzEpOmEuY2FsbGJhY2soZy50b0RhdGFVUkwoYyxkKSl9LGsuc3JjPWp9YT1hfHx7fTt2YXIgYz1hLm1pbWVUeXBlfHxudWxsLGQ9YS5xdWFsaXR5fHxudWxsLGU9YS54fHwwLGY9YS55fHwwLGc9bmV3IEtpbmV0aWMuU2NlbmVDYW52YXMoe3dpZHRoOmEud2lkdGh8fHRoaXMuZ2V0V2lkdGgoKSxoZWlnaHQ6YS5oZWlnaHR8fHRoaXMuZ2V0SGVpZ2h0KCkscGl4ZWxSYXRpbzoxfSksaD1nLmdldENvbnRleHQoKS5fY29udGV4dCxpPXRoaXMuY2hpbGRyZW47KGV8fGYpJiZoLnRyYW5zbGF0ZSgtMSplLC0xKmYpLGIoMCl9LHRvSW1hZ2U6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jYWxsYmFjazthLmNhbGxiYWNrPWZ1bmN0aW9uKGEpe0tpbmV0aWMuVXRpbC5fZ2V0SW1hZ2UoYSxmdW5jdGlvbihhKXtiKGEpfSl9LHRoaXMudG9EYXRhVVJMKGEpfSxnZXRJbnRlcnNlY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPXRoaXMuZ2V0Q2hpbGRyZW4oKSxlPWQubGVuZ3RoLGY9ZS0xO2ZvcihiPWY7Yj49MDtiLS0paWYoYz1kW2JdLmdldEludGVyc2VjdGlvbihhKSlyZXR1cm4gYztyZXR1cm4gbnVsbH0sX3Jlc2l6ZURPTTpmdW5jdGlvbigpe2lmKHRoaXMuY29udGVudCl7dmFyIGEsYixjPXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCksZj10aGlzLmdldENoaWxkcmVuKCksZz1mLmxlbmd0aDtmb3IodGhpcy5jb250ZW50LnN0eWxlLndpZHRoPWMrZCx0aGlzLmNvbnRlbnQuc3R5bGUuaGVpZ2h0PWUrZCx0aGlzLmJ1ZmZlckNhbnZhcy5zZXRTaXplKGMsZSksdGhpcy5idWZmZXJIaXRDYW52YXMuc2V0U2l6ZShjLGUpLGE9MDtnPmE7YSsrKWI9ZlthXSxiLmdldENhbnZhcygpLnNldFNpemUoYyxlKSxiLmhpdENhbnZhcy5zZXRTaXplKGMsZSksYi5kcmF3KCl9fSxhZGQ6ZnVuY3Rpb24oYSl7aWYoIShhcmd1bWVudHMubGVuZ3RoPjEpKXJldHVybiBLaW5ldGljLkNvbnRhaW5lci5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxhKSxhLl9zZXRDYW52YXNTaXplKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKSxhLmRyYXcoKSx0aGlzLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYS5jYW52YXMuX2NhbnZhcyksdGhpcztmb3IodmFyIGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7YisrKXRoaXMuYWRkKGFyZ3VtZW50c1tiXSl9LGdldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRMYXllcjpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbigpfSxfYmluZENvbnRlbnRFdmVudHM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtNPmI7YisrKWEodGhpcyxMW2JdKX0sX21vdXNlb3ZlcjpmdW5jdGlvbihhKXtLaW5ldGljLlVBLm1vYmlsZXx8KHRoaXMuX3NldFBvaW50ZXJQb3NpdGlvbihhKSx0aGlzLl9maXJlKHQse2V2dDphfSkpfSxfbW91c2VvdXQ6ZnVuY3Rpb24oYSl7aWYoIUtpbmV0aWMuVUEubW9iaWxlKXt0aGlzLl9zZXRQb2ludGVyUG9zaXRpb24oYSk7dmFyIGI9dGhpcy50YXJnZXRTaGFwZTtiJiYhS2luZXRpYy5pc0RyYWdnaW5nKCkmJihiLl9maXJlQW5kQnViYmxlKGUse2V2dDphfSksYi5fZmlyZUFuZEJ1YmJsZShmLHtldnQ6YX0pLHRoaXMudGFyZ2V0U2hhcGU9bnVsbCksdGhpcy5wb2ludGVyUG9zPXZvaWQgMCx0aGlzLl9maXJlKHMse2V2dDphfSl9fSxfbW91c2Vtb3ZlOmZ1bmN0aW9uKGEpe2lmKCFLaW5ldGljLlVBLm1vYmlsZSl7dGhpcy5fc2V0UG9pbnRlclBvc2l0aW9uKGEpO3ZhciBiPUtpbmV0aWMuREQsYz10aGlzLmdldEludGVyc2VjdGlvbih0aGlzLmdldFBvaW50ZXJQb3NpdGlvbigpKTtjJiZjLmlzTGlzdGVuaW5nKCk/S2luZXRpYy5pc0RyYWdnaW5nKCl8fHRoaXMudGFyZ2V0U2hhcGUmJnRoaXMudGFyZ2V0U2hhcGUuX2lkPT09Yy5faWQ/Yy5fZmlyZUFuZEJ1YmJsZShpLHtldnQ6YX0pOih0aGlzLnRhcmdldFNoYXBlJiYodGhpcy50YXJnZXRTaGFwZS5fZmlyZUFuZEJ1YmJsZShlLHtldnQ6YX0sYyksdGhpcy50YXJnZXRTaGFwZS5fZmlyZUFuZEJ1YmJsZShmLHtldnQ6YX0sYykpLGMuX2ZpcmVBbmRCdWJibGUoZyx7ZXZ0OmF9LHRoaXMudGFyZ2V0U2hhcGUpLGMuX2ZpcmVBbmRCdWJibGUoaCx7ZXZ0OmF9LHRoaXMudGFyZ2V0U2hhcGUpLHRoaXMudGFyZ2V0U2hhcGU9Yyk6dGhpcy50YXJnZXRTaGFwZSYmIUtpbmV0aWMuaXNEcmFnZ2luZygpJiYodGhpcy50YXJnZXRTaGFwZS5fZmlyZUFuZEJ1YmJsZShlLHtldnQ6YX0pLHRoaXMudGFyZ2V0U2hhcGUuX2ZpcmVBbmRCdWJibGUoZix7ZXZ0OmF9KSx0aGlzLnRhcmdldFNoYXBlPW51bGwpLHRoaXMuX2ZpcmUodSx7ZXZ0OmF9KSxiJiZiLl9kcmFnKGEpfWEucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKX0sX21vdXNlZG93bjpmdW5jdGlvbihhKXtpZighS2luZXRpYy5VQS5tb2JpbGUpe3RoaXMuX3NldFBvaW50ZXJQb3NpdGlvbihhKTt2YXIgYj10aGlzLmdldEludGVyc2VjdGlvbih0aGlzLmdldFBvaW50ZXJQb3NpdGlvbigpKTtLaW5ldGljLmxpc3RlbkNsaWNrVGFwPSEwLGImJmIuaXNMaXN0ZW5pbmcoKSYmKHRoaXMuY2xpY2tTdGFydFNoYXBlPWIsYi5fZmlyZUFuZEJ1YmJsZShqLHtldnQ6YX0pKSx0aGlzLl9maXJlKHYse2V2dDphfSl9YS5wcmV2ZW50RGVmYXVsdCYmYS5wcmV2ZW50RGVmYXVsdCgpfSxfbW91c2V1cDpmdW5jdGlvbihhKXtpZighS2luZXRpYy5VQS5tb2JpbGUpe3RoaXMuX3NldFBvaW50ZXJQb3NpdGlvbihhKTt2YXIgYj10aGlzLmdldEludGVyc2VjdGlvbih0aGlzLmdldFBvaW50ZXJQb3NpdGlvbigpKSxjPXRoaXMuY2xpY2tTdGFydFNoYXBlLGQ9ITE7S2luZXRpYy5pbkRibENsaWNrV2luZG93PyhkPSEwLEtpbmV0aWMuaW5EYmxDbGlja1dpbmRvdz0hMSk6S2luZXRpYy5pbkRibENsaWNrV2luZG93PSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtLaW5ldGljLmluRGJsQ2xpY2tXaW5kb3c9ITF9LEtpbmV0aWMuZGJsQ2xpY2tXaW5kb3cpLGImJmIuaXNMaXN0ZW5pbmcoKSYmKGIuX2ZpcmVBbmRCdWJibGUoayx7ZXZ0OmF9KSxLaW5ldGljLmxpc3RlbkNsaWNrVGFwJiZjJiZjLl9pZD09PWIuX2lkJiYoYi5fZmlyZUFuZEJ1YmJsZShsLHtldnQ6YX0pLGQmJmIuX2ZpcmVBbmRCdWJibGUobSx7ZXZ0OmF9KSkpLHRoaXMuX2ZpcmUodyx7ZXZ0OmF9KSxLaW5ldGljLmxpc3RlbkNsaWNrVGFwJiYodGhpcy5fZmlyZSh4LHtldnQ6YX0pLGQmJnRoaXMuX2ZpcmUoeSx7ZXZ0OmF9KSksS2luZXRpYy5saXN0ZW5DbGlja1RhcD0hMX1hLnByZXZlbnREZWZhdWx0JiZhLnByZXZlbnREZWZhdWx0KCl9LF90b3VjaHN0YXJ0OmZ1bmN0aW9uKGEpe3RoaXMuX3NldFBvaW50ZXJQb3NpdGlvbihhKTt2YXIgYj10aGlzLmdldEludGVyc2VjdGlvbih0aGlzLmdldFBvaW50ZXJQb3NpdGlvbigpKTtLaW5ldGljLmxpc3RlbkNsaWNrVGFwPSEwLGImJmIuaXNMaXN0ZW5pbmcoKSYmKHRoaXMudGFwU3RhcnRTaGFwZT1iLGIuX2ZpcmVBbmRCdWJibGUobix7ZXZ0OmF9KSxiLmlzTGlzdGVuaW5nKCkmJmEucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKSksdGhpcy5fZmlyZSh6LHtldnQ6YX0pfSxfdG91Y2hlbmQ6ZnVuY3Rpb24oYSl7dGhpcy5fc2V0UG9pbnRlclBvc2l0aW9uKGEpO3ZhciBiPXRoaXMuZ2V0SW50ZXJzZWN0aW9uKHRoaXMuZ2V0UG9pbnRlclBvc2l0aW9uKCkpLGM9ITE7S2luZXRpYy5pbkRibENsaWNrV2luZG93PyhjPSEwLEtpbmV0aWMuaW5EYmxDbGlja1dpbmRvdz0hMSk6S2luZXRpYy5pbkRibENsaWNrV2luZG93PSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtLaW5ldGljLmluRGJsQ2xpY2tXaW5kb3c9ITF9LEtpbmV0aWMuZGJsQ2xpY2tXaW5kb3cpLGImJmIuaXNMaXN0ZW5pbmcoKSYmKGIuX2ZpcmVBbmRCdWJibGUobyx7ZXZ0OmF9KSxLaW5ldGljLmxpc3RlbkNsaWNrVGFwJiZiLl9pZD09PXRoaXMudGFwU3RhcnRTaGFwZS5faWQmJihiLl9maXJlQW5kQnViYmxlKHAse2V2dDphfSksYyYmYi5fZmlyZUFuZEJ1YmJsZShxLHtldnQ6YX0pKSxiLmlzTGlzdGVuaW5nKCkmJmEucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKSksS2luZXRpYy5saXN0ZW5DbGlja1RhcCYmKHRoaXMuX2ZpcmUoQSx7ZXZ0OmF9KSxjJiZ0aGlzLl9maXJlKEIse2V2dDphfSkpLEtpbmV0aWMubGlzdGVuQ2xpY2tUYXA9ITF9LF90b3VjaG1vdmU6ZnVuY3Rpb24oYSl7dGhpcy5fc2V0UG9pbnRlclBvc2l0aW9uKGEpO3ZhciBiPUtpbmV0aWMuREQsYz10aGlzLmdldEludGVyc2VjdGlvbih0aGlzLmdldFBvaW50ZXJQb3NpdGlvbigpKTtjJiZjLmlzTGlzdGVuaW5nKCkmJihjLl9maXJlQW5kQnViYmxlKHIse2V2dDphfSksYy5pc0xpc3RlbmluZygpJiZhLnByZXZlbnREZWZhdWx0JiZhLnByZXZlbnREZWZhdWx0KCkpLHRoaXMuX2ZpcmUoQyx7ZXZ0OmF9KSxiJiZiLl9kcmFnKGEpfSxfc2V0UG9pbnRlclBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5fZ2V0Q29udGVudFBvc2l0aW9uKCksZD1hLm9mZnNldFgsZT1hLmNsaWVudFgsZj1udWxsLGc9bnVsbDthPWE/YTp3aW5kb3cuZXZlbnQsdm9pZCAwIT09YS50b3VjaGVzP2EudG91Y2hlcy5sZW5ndGg+MCYmKGI9YS50b3VjaGVzWzBdLGY9Yi5jbGllbnRYLWMubGVmdCxnPWIuY2xpZW50WS1jLnRvcCk6dm9pZCAwIT09ZD8oZj1kLGc9YS5vZmZzZXRZKTpcIm1vemlsbGFcIj09PUtpbmV0aWMuVUEuYnJvd3Nlcj8oZj1hLmxheWVyWCxnPWEubGF5ZXJZKTp2b2lkIDAhPT1lJiZjJiYoZj1lLWMubGVmdCxnPWEuY2xpZW50WS1jLnRvcCksbnVsbCE9PWYmJm51bGwhPT1nJiYodGhpcy5wb2ludGVyUG9zPXt4OmYseTpnfSl9LF9nZXRDb250ZW50UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0P3RoaXMuY29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTp7dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmEudG9wLGxlZnQ6YS5sZWZ0fX0sX2J1aWxkRE9NOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDb250YWluZXIoKTtpZighYSl7aWYoS2luZXRpYy5VdGlsLmlzQnJvd3NlcigpKXRocm93XCJTdGFnZSBoYXMgbm90IGNvbnRhaW5lci4gQnV0IGNvbnRhaW5lciBpcyByZXF1aXJlZFwiO2E9S2luZXRpYy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KEQpfWEuaW5uZXJIVE1MPUssdGhpcy5jb250ZW50PUtpbmV0aWMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChEKSx0aGlzLmNvbnRlbnQuc3R5bGUucG9zaXRpb249RSx0aGlzLmNvbnRlbnQuc3R5bGUuZGlzcGxheT1GLHRoaXMuY29udGVudC5jbGFzc05hbWU9Ryx0aGlzLmNvbnRlbnQuc2V0QXR0cmlidXRlKFwicm9sZVwiLFwicHJlc2VudGF0aW9uXCIpLGEuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KSx0aGlzLmJ1ZmZlckNhbnZhcz1uZXcgS2luZXRpYy5TY2VuZUNhbnZhcyh7cGl4ZWxSYXRpbzoxfSksdGhpcy5idWZmZXJIaXRDYW52YXM9bmV3IEtpbmV0aWMuSGl0Q2FudmFzLHRoaXMuX3Jlc2l6ZURPTSgpfSxfb25Db250ZW50OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEuc3BsaXQoSCksZj1lLmxlbmd0aDtmb3IoYz0wO2Y+YztjKyspZD1lW2NdLHRoaXMuY29udGVudC5hZGRFdmVudExpc3RlbmVyKGQsYiwhMSl9LGNhY2hlOmZ1bmN0aW9uKCl7S2luZXRpYy5VdGlsLndhcm4oXCJDYWNoZSBmdW5jdGlvbiBpcyBub3QgYWxsb3dlZCBmb3Igc3RhZ2UuIFlvdSBtYXkgdXNlIGNhY2hlIG9ubHkgZm9yIGxheWVycywgZ3JvdXBzIGFuZCBzaGFwZXMuXCIpfSxjbGVhckNhY2hlOmZ1bmN0aW9uKCl7fX0pLEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5TdGFnZSxLaW5ldGljLkNvbnRhaW5lciksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlcihLaW5ldGljLlN0YWdlLFwiY29udGFpbmVyXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU3RhZ2UsXCJjb250YWluZXJcIil9KCksZnVuY3Rpb24oKXtLaW5ldGljLlV0aWwuYWRkTWV0aG9kcyhLaW5ldGljLkJhc2VMYXllcix7X19faW5pdDpmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPVwiTGF5ZXJcIixLaW5ldGljLkNvbnRhaW5lci5jYWxsKHRoaXMsYSl9LGNyZWF0ZVBOR1N0cmVhbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbnZhcy5fY2FudmFzLmNyZWF0ZVBOR1N0cmVhbSgpfSxnZXRDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXN9LGdldEhpdENhbnZhczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpdENhbnZhc30sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENhbnZhcygpLmdldENvbnRleHQoKX0sY2xlYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpLmNsZWFyKGEpLHRoaXMuZ2V0SGl0Q2FudmFzKCkuZ2V0Q29udGV4dCgpLmNsZWFyKGEpLHRoaXN9LHNldFpJbmRleDpmdW5jdGlvbihhKXtLaW5ldGljLk5vZGUucHJvdG90eXBlLnNldFpJbmRleC5jYWxsKHRoaXMsYSk7dmFyIGI9dGhpcy5nZXRTdGFnZSgpO3JldHVybiBiJiYoYi5jb250ZW50LnJlbW92ZUNoaWxkKHRoaXMuZ2V0Q2FudmFzKCkuX2NhbnZhcyksYTxiLmdldENoaWxkcmVuKCkubGVuZ3RoLTE/Yi5jb250ZW50Lmluc2VydEJlZm9yZSh0aGlzLmdldENhbnZhcygpLl9jYW52YXMsYi5nZXRDaGlsZHJlbigpW2ErMV0uZ2V0Q2FudmFzKCkuX2NhbnZhcyk6Yi5jb250ZW50LmFwcGVuZENoaWxkKHRoaXMuZ2V0Q2FudmFzKCkuX2NhbnZhcykpLHRoaXN9LG1vdmVUb1RvcDpmdW5jdGlvbigpe0tpbmV0aWMuTm9kZS5wcm90b3R5cGUubW92ZVRvVG9wLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5nZXRTdGFnZSgpO2EmJihhLmNvbnRlbnQucmVtb3ZlQ2hpbGQodGhpcy5nZXRDYW52YXMoKS5fY2FudmFzKSxhLmNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5nZXRDYW52YXMoKS5fY2FudmFzKSl9LG1vdmVVcDpmdW5jdGlvbigpe2lmKEtpbmV0aWMuTm9kZS5wcm90b3R5cGUubW92ZVVwLmNhbGwodGhpcykpe3ZhciBhPXRoaXMuZ2V0U3RhZ2UoKTthJiYoYS5jb250ZW50LnJlbW92ZUNoaWxkKHRoaXMuZ2V0Q2FudmFzKCkuX2NhbnZhcyksdGhpcy5pbmRleDxhLmdldENoaWxkcmVuKCkubGVuZ3RoLTE/YS5jb250ZW50Lmluc2VydEJlZm9yZSh0aGlzLmdldENhbnZhcygpLl9jYW52YXMsYS5nZXRDaGlsZHJlbigpW3RoaXMuaW5kZXgrMV0uZ2V0Q2FudmFzKCkuX2NhbnZhcyk6YS5jb250ZW50LmFwcGVuZENoaWxkKHRoaXMuZ2V0Q2FudmFzKCkuX2NhbnZhcykpfX0sbW92ZURvd246ZnVuY3Rpb24oKXtpZihLaW5ldGljLk5vZGUucHJvdG90eXBlLm1vdmVEb3duLmNhbGwodGhpcykpe3ZhciBhPXRoaXMuZ2V0U3RhZ2UoKTtpZihhKXt2YXIgYj1hLmdldENoaWxkcmVuKCk7YS5jb250ZW50LnJlbW92ZUNoaWxkKHRoaXMuZ2V0Q2FudmFzKCkuX2NhbnZhcyksYS5jb250ZW50Lmluc2VydEJlZm9yZSh0aGlzLmdldENhbnZhcygpLl9jYW52YXMsYlt0aGlzLmluZGV4KzFdLmdldENhbnZhcygpLl9jYW52YXMpfX19LG1vdmVUb0JvdHRvbTpmdW5jdGlvbigpe2lmKEtpbmV0aWMuTm9kZS5wcm90b3R5cGUubW92ZVRvQm90dG9tLmNhbGwodGhpcykpe3ZhciBhPXRoaXMuZ2V0U3RhZ2UoKTtpZihhKXt2YXIgYj1hLmdldENoaWxkcmVuKCk7YS5jb250ZW50LnJlbW92ZUNoaWxkKHRoaXMuZ2V0Q2FudmFzKCkuX2NhbnZhcyksYS5jb250ZW50Lmluc2VydEJlZm9yZSh0aGlzLmdldENhbnZhcygpLl9jYW52YXMsYlsxXS5nZXRDYW52YXMoKS5fY2FudmFzKX19fSxnZXRMYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldENhbnZhcygpLl9jYW52YXM7cmV0dXJuIEtpbmV0aWMuTm9kZS5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyksYSYmYS5wYXJlbnROb2RlJiZLaW5ldGljLlV0aWwuX2lzSW5Eb2N1bWVudChhKSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpLHRoaXN9LGdldFN0YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50fX0pLEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5CYXNlTGF5ZXIsS2luZXRpYy5Db250YWluZXIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5CYXNlTGF5ZXIsXCJjbGVhckJlZm9yZURyYXdcIiwhMCksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5CYXNlTGF5ZXIpfSgpLGZ1bmN0aW9uKCl7dmFyIGE9XCIjXCIsYj1cImJlZm9yZURyYXdcIixjPVwiZHJhd1wiLGQ9W3t4OjAseTowfSx7eDotMSx5OjB9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDoxLHk6MH0se3g6MSx5OjF9LHt4OjAseToxfSx7eDotMSx5OjF9XSxlPWQubGVuZ3RoO0tpbmV0aWMuVXRpbC5hZGRNZXRob2RzKEtpbmV0aWMuTGF5ZXIse19fX19pbml0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9XCJMYXllclwiLHRoaXMuY2FudmFzPW5ldyBLaW5ldGljLlNjZW5lQ2FudmFzLHRoaXMuaGl0Q2FudmFzPW5ldyBLaW5ldGljLkhpdENhbnZhcyxLaW5ldGljLkJhc2VMYXllci5jYWxsKHRoaXMsYSl9LF9zZXRDYW52YXNTaXplOmZ1bmN0aW9uKGEsYil7dGhpcy5jYW52YXMuc2V0U2l6ZShhLGIpLHRoaXMuaGl0Q2FudmFzLnNldFNpemUoYSxiKX0sX3ZhbGlkYXRlQWRkOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0VHlwZSgpO1wiR3JvdXBcIiE9PWImJlwiU2hhcGVcIiE9PWImJktpbmV0aWMuVXRpbC5lcnJvcihcIllvdSBtYXkgb25seSBhZGQgZ3JvdXBzIGFuZCBzaGFwZXMgdG8gYSBsYXllci5cIil9LGdldEludGVyc2VjdGlvbjpmdW5jdGlvbihhKXt2YXIgYixjLGYsZztpZighdGhpcy5oaXRHcmFwaEVuYWJsZWQoKXx8IXRoaXMuaXNWaXNpYmxlKCkpcmV0dXJuIG51bGw7Zm9yKGM9MDtlPmM7YysrKXtpZihmPWRbY10sYj10aGlzLl9nZXRJbnRlcnNlY3Rpb24oe3g6YS54K2YueCx5OmEueStmLnl9KSxnPWIuc2hhcGUpcmV0dXJuIGc7aWYoIWIuYW50aWFsaWFzZWQpcmV0dXJuIG51bGx9fSxfZ2V0SW50ZXJzZWN0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjLGQsZT10aGlzLmhpdENhbnZhcy5jb250ZXh0Ll9jb250ZXh0LmdldEltYWdlRGF0YShiLngsYi55LDEsMSkuZGF0YSxmPWVbM107cmV0dXJuIDI1NT09PWY/KGM9S2luZXRpYy5VdGlsLl9yZ2JUb0hleChlWzBdLGVbMV0sZVsyXSksZD1LaW5ldGljLnNoYXBlc1thK2NdLHtzaGFwZTpkfSk6Zj4wP3thbnRpYWxpYXNlZDohMH06e319LGRyYXdTY2VuZTpmdW5jdGlvbihhLGQpe3ZhciBlPXRoaXMuZ2V0TGF5ZXIoKSxmPWF8fGUmJmUuZ2V0Q2FudmFzKCk7cmV0dXJuIHRoaXMuX2ZpcmUoYix7bm9kZTp0aGlzfSksdGhpcy5nZXRDbGVhckJlZm9yZURyYXcoKSYmZi5nZXRDb250ZXh0KCkuY2xlYXIoKSxLaW5ldGljLkNvbnRhaW5lci5wcm90b3R5cGUuZHJhd1NjZW5lLmNhbGwodGhpcyxmLGQpLHRoaXMuX2ZpcmUoYyx7bm9kZTp0aGlzfSksdGhpc30sX2FwcGx5VHJhbnNmb3JtOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldEFic29sdXRlVHJhbnNmb3JtKGMpLmdldE1hdHJpeCgpO2IudHJhbnNmb3JtKGRbMF0sZFsxXSxkWzJdLGRbM10sZFs0XSxkWzVdKX0sZHJhd0hpdDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0TGF5ZXIoKSxkPWF8fGMmJmMuaGl0Q2FudmFzO3JldHVybiBjJiZjLmdldENsZWFyQmVmb3JlRHJhdygpJiZjLmdldEhpdENhbnZhcygpLmdldENvbnRleHQoKS5jbGVhcigpLEtpbmV0aWMuQ29udGFpbmVyLnByb3RvdHlwZS5kcmF3SGl0LmNhbGwodGhpcyxkLGIpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdldENvbnRleHQoKS5jbGVhcihhKSx0aGlzLmdldEhpdENhbnZhcygpLmdldENvbnRleHQoKS5jbGVhcihhKSx0aGlzfSxzZXRWaXNpYmxlOmZ1bmN0aW9uKGEpe3JldHVybiBLaW5ldGljLk5vZGUucHJvdG90eXBlLnNldFZpc2libGUuY2FsbCh0aGlzLGEpLGE/KHRoaXMuZ2V0Q2FudmFzKCkuX2NhbnZhcy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIix0aGlzLmhpdENhbnZhcy5fY2FudmFzLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiKToodGhpcy5nZXRDYW52YXMoKS5fY2FudmFzLnN0eWxlLmRpc3BsYXk9XCJub25lXCIsdGhpcy5oaXRDYW52YXMuX2NhbnZhcy5zdHlsZS5kaXNwbGF5PVwibm9uZVwiKSx0aGlzfSxlbmFibGVIaXRHcmFwaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldEhpdEdyYXBoRW5hYmxlZCghMCksdGhpc30sZGlzYWJsZUhpdEdyYXBoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0SGl0R3JhcGhFbmFibGVkKCExKSx0aGlzfX0pLEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5MYXllcixLaW5ldGljLkJhc2VMYXllciksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkxheWVyLFwiaGl0R3JhcGhFbmFibGVkXCIsITApLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuTGF5ZXIpfSgpLGZ1bmN0aW9uKCl7S2luZXRpYy5VdGlsLmFkZE1ldGhvZHMoS2luZXRpYy5GYXN0TGF5ZXIse19fX19pbml0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9XCJMYXllclwiLHRoaXMuY2FudmFzPW5ldyBLaW5ldGljLlNjZW5lQ2FudmFzLEtpbmV0aWMuQmFzZUxheWVyLmNhbGwodGhpcyxhKX0sX3ZhbGlkYXRlQWRkOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0VHlwZSgpO1wiU2hhcGVcIiE9PWImJktpbmV0aWMuVXRpbC5lcnJvcihcIllvdSBtYXkgb25seSBhZGQgc2hhcGVzIHRvIGEgZmFzdCBsYXllci5cIil9LF9zZXRDYW52YXNTaXplOmZ1bmN0aW9uKGEsYil7dGhpcy5jYW52YXMuc2V0U2l6ZShhLGIpfSxoaXRHcmFwaEVuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0SW50ZXJzZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGRyYXdTY2VuZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldExheWVyKCksYz1hfHxiJiZiLmdldENhbnZhcygpO3JldHVybiB0aGlzLmdldENsZWFyQmVmb3JlRHJhdygpJiZjLmdldENvbnRleHQoKS5jbGVhcigpLEtpbmV0aWMuQ29udGFpbmVyLnByb3RvdHlwZS5kcmF3U2NlbmUuY2FsbCh0aGlzLGMpLHRoaXN9LF9hcHBseVRyYW5zZm9ybTpmdW5jdGlvbihhLGIsYyl7aWYoIWN8fGMuX2lkIT09dGhpcy5faWQpe3ZhciBkPWEuZ2V0VHJhbnNmb3JtKCkuZ2V0TWF0cml4KCk7Yi50cmFuc2Zvcm0oZFswXSxkWzFdLGRbMl0sZFszXSxkWzRdLGRbNV0pfX0sZHJhdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRyYXdTY2VuZSgpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdldENvbnRleHQoKS5jbGVhcihhKSx0aGlzfSxzZXRWaXNpYmxlOmZ1bmN0aW9uKGEpe3JldHVybiBLaW5ldGljLk5vZGUucHJvdG90eXBlLnNldFZpc2libGUuY2FsbCh0aGlzLGEpLHRoaXMuZ2V0Q2FudmFzKCkuX2NhbnZhcy5zdHlsZS5kaXNwbGF5PWE/XCJibG9ja1wiOlwibm9uZVwiLHRoaXN9fSksS2luZXRpYy5VdGlsLmV4dGVuZChLaW5ldGljLkZhc3RMYXllcixLaW5ldGljLkJhc2VMYXllciksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5GYXN0TGF5ZXIpfSgpLGZ1bmN0aW9uKCl7S2luZXRpYy5VdGlsLmFkZE1ldGhvZHMoS2luZXRpYy5Hcm91cCx7X19faW5pdDpmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPVwiR3JvdXBcIixLaW5ldGljLkNvbnRhaW5lci5jYWxsKHRoaXMsYSl9LF92YWxpZGF0ZUFkZDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFR5cGUoKTtcIkdyb3VwXCIhPT1iJiZcIlNoYXBlXCIhPT1iJiZLaW5ldGljLlV0aWwuZXJyb3IoXCJZb3UgbWF5IG9ubHkgYWRkIGdyb3VwcyBhbmQgc2hhcGVzIHRvIGdyb3Vwcy5cIil9fSksS2luZXRpYy5VdGlsLmV4dGVuZChLaW5ldGljLkdyb3VwLEtpbmV0aWMuQ29udGFpbmVyKSxLaW5ldGljLkNvbGxlY3Rpb24ubWFwTWV0aG9kcyhLaW5ldGljLkdyb3VwKX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuUmVjdD1mdW5jdGlvbihhKXt0aGlzLl9fX2luaXQoYSl9LEtpbmV0aWMuUmVjdC5wcm90b3R5cGU9e19fX2luaXQ6ZnVuY3Rpb24oYSl7S2luZXRpYy5TaGFwZS5jYWxsKHRoaXMsYSksdGhpcy5jbGFzc05hbWU9XCJSZWN0XCIsdGhpcy5zY2VuZUZ1bmModGhpcy5fc2NlbmVGdW5jKX0sX3NjZW5lRnVuYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldENvcm5lclJhZGl1cygpLGM9dGhpcy5nZXRXaWR0aCgpLGQ9dGhpcy5nZXRIZWlnaHQoKTthLmJlZ2luUGF0aCgpLGI/KGEubW92ZVRvKGIsMCksYS5saW5lVG8oYy1iLDApLGEuYXJjKGMtYixiLGIsMypNYXRoLlBJLzIsMCwhMSksYS5saW5lVG8oYyxkLWIpLGEuYXJjKGMtYixkLWIsYiwwLE1hdGguUEkvMiwhMSksYS5saW5lVG8oYixkKSxhLmFyYyhiLGQtYixiLE1hdGguUEkvMixNYXRoLlBJLCExKSxhLmxpbmVUbygwLGIpLGEuYXJjKGIsYixiLE1hdGguUEksMypNYXRoLlBJLzIsITEpKTphLnJlY3QoMCwwLGMsZCksYS5jbG9zZVBhdGgoKSxhLmZpbGxTdHJva2VTaGFwZSh0aGlzKX19LEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5SZWN0LEtpbmV0aWMuU2hhcGUpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5SZWN0LFwiY29ybmVyUmFkaXVzXCIsMCksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5SZWN0KX0oKSxmdW5jdGlvbigpe3ZhciBhPTIqTWF0aC5QSS0xZS00LGI9XCJDaXJjbGVcIjtLaW5ldGljLkNpcmNsZT1mdW5jdGlvbihhKXt0aGlzLl9fX2luaXQoYSl9LEtpbmV0aWMuQ2lyY2xlLnByb3RvdHlwZT17X19faW5pdDpmdW5jdGlvbihhKXtLaW5ldGljLlNoYXBlLmNhbGwodGhpcyxhKSx0aGlzLmNsYXNzTmFtZT1iLHRoaXMuc2NlbmVGdW5jKHRoaXMuX3NjZW5lRnVuYyl9LF9zY2VuZUZ1bmM6ZnVuY3Rpb24oYil7Yi5iZWdpblBhdGgoKSxiLmFyYygwLDAsdGhpcy5nZXRSYWRpdXMoKSwwLGEsITEpLGIuY2xvc2VQYXRoKCksYi5maWxsU3Ryb2tlU2hhcGUodGhpcyl9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDIqdGhpcy5nZXRSYWRpdXMoKX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDIqdGhpcy5nZXRSYWRpdXMoKX0sc2V0V2lkdGg6ZnVuY3Rpb24oYSl7S2luZXRpYy5Ob2RlLnByb3RvdHlwZS5zZXRXaWR0aC5jYWxsKHRoaXMsYSksdGhpcy5zZXRSYWRpdXMoYS8yKX0sc2V0SGVpZ2h0OmZ1bmN0aW9uKGEpe0tpbmV0aWMuTm9kZS5wcm90b3R5cGUuc2V0SGVpZ2h0LmNhbGwodGhpcyxhKSx0aGlzLnNldFJhZGl1cyhhLzIpfX0sS2luZXRpYy5VdGlsLmV4dGVuZChLaW5ldGljLkNpcmNsZSxLaW5ldGljLlNoYXBlKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuQ2lyY2xlLFwicmFkaXVzXCIsMCksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5DaXJjbGUpfSgpLGZ1bmN0aW9uKCl7dmFyIGE9MipNYXRoLlBJLTFlLTQsYj1cIkVsbGlwc2VcIjtLaW5ldGljLkVsbGlwc2U9ZnVuY3Rpb24oYSl7dGhpcy5fX19pbml0KGEpfSxLaW5ldGljLkVsbGlwc2UucHJvdG90eXBlPXtfX19pbml0OmZ1bmN0aW9uKGEpe0tpbmV0aWMuU2hhcGUuY2FsbCh0aGlzLGEpLHRoaXMuY2xhc3NOYW1lPWIsdGhpcy5zY2VuZUZ1bmModGhpcy5fc2NlbmVGdW5jKX0sX3NjZW5lRnVuYzpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmdldFJhZGl1cygpLGQ9Yy54LGU9Yy55O2IuYmVnaW5QYXRoKCksYi5zYXZlKCksZCE9PWUmJmIuc2NhbGUoMSxlL2QpLGIuYXJjKDAsMCxkLDAsYSwhMSksYi5yZXN0b3JlKCksYi5jbG9zZVBhdGgoKSxiLmZpbGxTdHJva2VTaGFwZSh0aGlzKX0sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMip0aGlzLmdldFJhZGl1cygpLnh9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiAyKnRoaXMuZ2V0UmFkaXVzKCkueX0sc2V0V2lkdGg6ZnVuY3Rpb24oYSl7S2luZXRpYy5Ob2RlLnByb3RvdHlwZS5zZXRXaWR0aC5jYWxsKHRoaXMsYSksdGhpcy5zZXRSYWRpdXMoe3g6YS8yfSl9LHNldEhlaWdodDpmdW5jdGlvbihhKXtLaW5ldGljLk5vZGUucHJvdG90eXBlLnNldEhlaWdodC5jYWxsKHRoaXMsYSksdGhpcy5zZXRSYWRpdXMoe3k6YS8yfSl9fSxLaW5ldGljLlV0aWwuZXh0ZW5kKEtpbmV0aWMuRWxsaXBzZSxLaW5ldGljLlNoYXBlKSxLaW5ldGljLkZhY3RvcnkuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcihLaW5ldGljLkVsbGlwc2UsXCJyYWRpdXNcIixbXCJ4XCIsXCJ5XCJdKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuRWxsaXBzZSxcInJhZGl1c1hcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuRWxsaXBzZSxcInJhZGl1c1lcIiwwKSxLaW5ldGljLkNvbGxlY3Rpb24ubWFwTWV0aG9kcyhLaW5ldGljLkVsbGlwc2UpfSgpLGZ1bmN0aW9uKCl7dmFyIGE9MipNYXRoLlBJLTFlLTQ7S2luZXRpYy5SaW5nPWZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0sS2luZXRpYy5SaW5nLnByb3RvdHlwZT17X19faW5pdDpmdW5jdGlvbihhKXtLaW5ldGljLlNoYXBlLmNhbGwodGhpcyxhKSx0aGlzLmNsYXNzTmFtZT1cIlJpbmdcIix0aGlzLnNjZW5lRnVuYyh0aGlzLl9zY2VuZUZ1bmMpfSxfc2NlbmVGdW5jOmZ1bmN0aW9uKGIpe2IuYmVnaW5QYXRoKCksYi5hcmMoMCwwLHRoaXMuZ2V0SW5uZXJSYWRpdXMoKSwwLGEsITEpLGIubW92ZVRvKHRoaXMuZ2V0T3V0ZXJSYWRpdXMoKSwwKSxiLmFyYygwLDAsdGhpcy5nZXRPdXRlclJhZGl1cygpLGEsMCwhMCksYi5jbG9zZVBhdGgoKSxiLmZpbGxTdHJva2VTaGFwZSh0aGlzKX0sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMip0aGlzLmdldE91dGVyUmFkaXVzKCl9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiAyKnRoaXMuZ2V0T3V0ZXJSYWRpdXMoKX0sc2V0V2lkdGg6ZnVuY3Rpb24oYSl7S2luZXRpYy5Ob2RlLnByb3RvdHlwZS5zZXRXaWR0aC5jYWxsKHRoaXMsYSksdGhpcy5zZXRPdXRlclJhZGl1cyhhLzIpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24oYSl7S2luZXRpYy5Ob2RlLnByb3RvdHlwZS5zZXRIZWlnaHQuY2FsbCh0aGlzLGEpLHRoaXMuc2V0T3V0ZXJSYWRpdXMoYS8yKX19LEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5SaW5nLEtpbmV0aWMuU2hhcGUpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5SaW5nLFwiaW5uZXJSYWRpdXNcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuUmluZyxcIm91dGVyUmFkaXVzXCIsMCksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5SaW5nKX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuV2VkZ2U9ZnVuY3Rpb24oYSl7dGhpcy5fX19pbml0KGEpfSxLaW5ldGljLldlZGdlLnByb3RvdHlwZT17X19faW5pdDpmdW5jdGlvbihhKXtLaW5ldGljLlNoYXBlLmNhbGwodGhpcyxhKSx0aGlzLmNsYXNzTmFtZT1cIldlZGdlXCIsdGhpcy5zY2VuZUZ1bmModGhpcy5fc2NlbmVGdW5jKX0sX3NjZW5lRnVuYzpmdW5jdGlvbihhKXthLmJlZ2luUGF0aCgpLGEuYXJjKDAsMCx0aGlzLmdldFJhZGl1cygpLDAsS2luZXRpYy5nZXRBbmdsZSh0aGlzLmdldEFuZ2xlKCkpLHRoaXMuZ2V0Q2xvY2t3aXNlKCkpLGEubGluZVRvKDAsMCksYS5jbG9zZVBhdGgoKSxhLmZpbGxTdHJva2VTaGFwZSh0aGlzKX19LEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5XZWRnZSxLaW5ldGljLlNoYXBlKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuV2VkZ2UsXCJyYWRpdXNcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuV2VkZ2UsXCJhbmdsZVwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5XZWRnZSxcImNsb2Nrd2lzZVwiLCExKSxLaW5ldGljLkZhY3RvcnkuYmFja0NvbXBhdChLaW5ldGljLldlZGdlLHthbmdsZURlZzpcImFuZ2xlXCIsZ2V0QW5nbGVEZWc6XCJnZXRBbmdsZVwiLHNldEFuZ2xlRGVnOlwic2V0QW5nbGVcIn0pLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuV2VkZ2UpfSgpLGZ1bmN0aW9uKCl7TWF0aC5QSS8xODA7S2luZXRpYy5BcmM9ZnVuY3Rpb24oYSl7dGhpcy5fX19pbml0KGEpfSxLaW5ldGljLkFyYy5wcm90b3R5cGU9e19fX2luaXQ6ZnVuY3Rpb24oYSl7S2luZXRpYy5TaGFwZS5jYWxsKHRoaXMsYSksdGhpcy5jbGFzc05hbWU9XCJBcmNcIix0aGlzLnNjZW5lRnVuYyh0aGlzLl9zY2VuZUZ1bmMpfSxfc2NlbmVGdW5jOmZ1bmN0aW9uKGEpe3ZhciBiPUtpbmV0aWMuZ2V0QW5nbGUodGhpcy5hbmdsZSgpKSxjPXRoaXMuY2xvY2t3aXNlKCk7YS5iZWdpblBhdGgoKSxhLmFyYygwLDAsdGhpcy5nZXRPdXRlclJhZGl1cygpLDAsYixjKSxhLmFyYygwLDAsdGhpcy5nZXRJbm5lclJhZGl1cygpLGIsMCwhYyksYS5jbG9zZVBhdGgoKSxhLmZpbGxTdHJva2VTaGFwZSh0aGlzKX19LEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5BcmMsS2luZXRpYy5TaGFwZSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkFyYyxcImlubmVyUmFkaXVzXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkFyYyxcIm91dGVyUmFkaXVzXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkFyYyxcImFuZ2xlXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkFyYyxcImNsb2Nrd2lzZVwiLCExKSxLaW5ldGljLkNvbGxlY3Rpb24ubWFwTWV0aG9kcyhLaW5ldGljLkFyYyl9KCksZnVuY3Rpb24oKXt2YXIgYT1cIkltYWdlXCI7S2luZXRpYy5JbWFnZT1mdW5jdGlvbihhKXt0aGlzLl9fX2luaXQoYSl9LEtpbmV0aWMuSW1hZ2UucHJvdG90eXBlPXtfX19pbml0OmZ1bmN0aW9uKGIpe0tpbmV0aWMuU2hhcGUuY2FsbCh0aGlzLGIpLHRoaXMuY2xhc3NOYW1lPWEsdGhpcy5zY2VuZUZ1bmModGhpcy5fc2NlbmVGdW5jKSx0aGlzLmhpdEZ1bmModGhpcy5faGl0RnVuYyl9LF91c2VCdWZmZXJDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5oYXNTaGFkb3coKXx8MSE9PXRoaXMuZ2V0QWJzb2x1dGVPcGFjaXR5KCkpJiZ0aGlzLmhhc1N0cm9rZSgpfSxfc2NlbmVGdW5jOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY9dGhpcy5nZXRXaWR0aCgpLGc9dGhpcy5nZXRIZWlnaHQoKSxoPXRoaXMuZ2V0SW1hZ2UoKTtoJiYoYj10aGlzLmdldENyb3AoKSxjPWIud2lkdGgsZD1iLmhlaWdodCxlPWMmJmQ/W2gsYi54LGIueSxjLGQsMCwwLGYsZ106W2gsMCwwLGYsZ10pLGEuYmVnaW5QYXRoKCksYS5yZWN0KDAsMCxmLGcpLGEuY2xvc2VQYXRoKCksYS5maWxsU3Ryb2tlU2hhcGUodGhpcyksaCYmYS5kcmF3SW1hZ2UuYXBwbHkoYSxlKX0sX2hpdEZ1bmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRXaWR0aCgpLGM9dGhpcy5nZXRIZWlnaHQoKTthLmJlZ2luUGF0aCgpLGEucmVjdCgwLDAsYixjKSxhLmNsb3NlUGF0aCgpLGEuZmlsbFN0cm9rZVNoYXBlKHRoaXMpfSxnZXRXaWR0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0SW1hZ2UoKTtyZXR1cm4gdGhpcy5hdHRycy53aWR0aHx8KGE/YS53aWR0aDowKX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRJbWFnZSgpO3JldHVybiB0aGlzLmF0dHJzLmhlaWdodHx8KGE/YS5oZWlnaHQ6MCl9fSxLaW5ldGljLlV0aWwuZXh0ZW5kKEtpbmV0aWMuSW1hZ2UsS2luZXRpYy5TaGFwZSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkltYWdlLFwiaW1hZ2VcIiksS2luZXRpYy5GYWN0b3J5LmFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIoS2luZXRpYy5JbWFnZSxcImNyb3BcIixbXCJ4XCIsXCJ5XCIsXCJ3aWR0aFwiLFwiaGVpZ2h0XCJdKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuSW1hZ2UsXCJjcm9wWFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5JbWFnZSxcImNyb3BZXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkltYWdlLFwiY3JvcFdpZHRoXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLkltYWdlLFwiY3JvcEhlaWdodFwiLDApLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuSW1hZ2UpfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXthLmZpbGxUZXh0KHRoaXMucGFydGlhbFRleHQsMCwwKX1mdW5jdGlvbiBiKGEpe2Euc3Ryb2tlVGV4dCh0aGlzLnBhcnRpYWxUZXh0LDAsMCl9dmFyIGM9XCJhdXRvXCIsZD1cImNlbnRlclwiLGU9XCJDaGFuZ2Uua2luZXRpY1wiLGY9XCIyZFwiLGc9XCItXCIsaD1cIlwiLGk9XCJsZWZ0XCIsaj1cInRleHRcIixrPVwiVGV4dFwiLGw9XCJtaWRkbGVcIixtPVwibm9ybWFsXCIsbj1cInB4IFwiLG89XCIgXCIscD1cInJpZ2h0XCIscT1cIndvcmRcIixyPVwiY2hhclwiLHM9XCJub25lXCIsdD1bXCJmb250RmFtaWx5XCIsXCJmb250U2l6ZVwiLFwiZm9udFN0eWxlXCIsXCJmb250VmFyaWFudFwiLFwicGFkZGluZ1wiLFwiYWxpZ25cIixcImxpbmVIZWlnaHRcIixcInRleHRcIixcIndpZHRoXCIsXCJoZWlnaHRcIixcIndyYXBcIl0sdT10Lmxlbmd0aCx2PUtpbmV0aWMuVXRpbC5jcmVhdGVDYW52YXNFbGVtZW50KCkuZ2V0Q29udGV4dChmKTtLaW5ldGljLlRleHQ9ZnVuY3Rpb24oYSl7dGhpcy5fX19pbml0KGEpfSxLaW5ldGljLlRleHQucHJvdG90eXBlPXtfX19pbml0OmZ1bmN0aW9uKGQpe3ZhciBmPXRoaXM7dm9pZCAwPT09ZC53aWR0aCYmKGQud2lkdGg9Yyksdm9pZCAwPT09ZC5oZWlnaHQmJihkLmhlaWdodD1jKSxLaW5ldGljLlNoYXBlLmNhbGwodGhpcyxkKSx0aGlzLl9maWxsRnVuYz1hLHRoaXMuX3N0cm9rZUZ1bmM9Yix0aGlzLmNsYXNzTmFtZT1rO2Zvcih2YXIgZz0wO3U+ZztnKyspdGhpcy5vbih0W2ddK2UsZi5fc2V0VGV4dERhdGEpO3RoaXMuX3NldFRleHREYXRhKCksdGhpcy5zY2VuZUZ1bmModGhpcy5fc2NlbmVGdW5jKSx0aGlzLmhpdEZ1bmModGhpcy5faGl0RnVuYyl9LF9zY2VuZUZ1bmM6ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLmdldFBhZGRpbmcoKSxlPXRoaXMuZ2V0VGV4dEhlaWdodCgpLGY9dGhpcy5nZXRMaW5lSGVpZ2h0KCkqZSxnPXRoaXMudGV4dEFycixoPWcubGVuZ3RoLGo9dGhpcy5nZXRXaWR0aCgpO2ZvcihhLnNldEF0dHIoXCJmb250XCIsdGhpcy5fZ2V0Q29udGV4dEZvbnQoKSksYS5zZXRBdHRyKFwidGV4dEJhc2VsaW5lXCIsbCksYS5zZXRBdHRyKFwidGV4dEFsaWduXCIsaSksYS5zYXZlKCksYS50cmFuc2xhdGUoYywwKSxhLnRyYW5zbGF0ZSgwLGMrZS8yKSxiPTA7aD5iO2IrKyl7dmFyIGs9Z1tiXSxtPWsudGV4dCxuPWsud2lkdGg7YS5zYXZlKCksdGhpcy5nZXRBbGlnbigpPT09cD9hLnRyYW5zbGF0ZShqLW4tMipjLDApOnRoaXMuZ2V0QWxpZ24oKT09PWQmJmEudHJhbnNsYXRlKChqLW4tMipjKS8yLDApLHRoaXMucGFydGlhbFRleHQ9bSxhLmZpbGxTdHJva2VTaGFwZSh0aGlzKSxhLnJlc3RvcmUoKSxhLnRyYW5zbGF0ZSgwLGYpfWEucmVzdG9yZSgpfSxfaGl0RnVuYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFdpZHRoKCksYz10aGlzLmdldEhlaWdodCgpO2EuYmVnaW5QYXRoKCksYS5yZWN0KDAsMCxiLGMpLGEuY2xvc2VQYXRoKCksYS5maWxsU3Ryb2tlU2hhcGUodGhpcyl9LHNldFRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9S2luZXRpYy5VdGlsLl9pc1N0cmluZyhhKT9hOmEudG9TdHJpbmcoKTtyZXR1cm4gdGhpcy5fc2V0QXR0cihqLGIpLHRoaXN9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cnMud2lkdGg9PT1jP3RoaXMuZ2V0VGV4dFdpZHRoKCkrMip0aGlzLmdldFBhZGRpbmcoKTp0aGlzLmF0dHJzLndpZHRofSxnZXRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRycy5oZWlnaHQ9PT1jP3RoaXMuZ2V0VGV4dEhlaWdodCgpKnRoaXMudGV4dEFyci5sZW5ndGgqdGhpcy5nZXRMaW5lSGVpZ2h0KCkrMip0aGlzLmdldFBhZGRpbmcoKTp0aGlzLmF0dHJzLmhlaWdodH0sZ2V0VGV4dFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dFdpZHRofSxnZXRUZXh0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dEhlaWdodH0sX2dldFRleHRTaXplOmZ1bmN0aW9uKGEpe3ZhciBiLGM9dixkPXRoaXMuZ2V0Rm9udFNpemUoKTtyZXR1cm4gYy5zYXZlKCksYy5mb250PXRoaXMuX2dldENvbnRleHRGb250KCksYj1jLm1lYXN1cmVUZXh0KGEpLGMucmVzdG9yZSgpLHt3aWR0aDpiLndpZHRoLGhlaWdodDpwYXJzZUludChkLDEwKX19LF9nZXRDb250ZXh0Rm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZvbnRTdHlsZSgpK28rdGhpcy5nZXRGb250VmFyaWFudCgpK28rdGhpcy5nZXRGb250U2l6ZSgpK24rdGhpcy5nZXRGb250RmFtaWx5KCl9LF9hZGRUZXh0TGluZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRleHRBcnIucHVzaCh7dGV4dDphLHdpZHRoOmJ9KX0sX2dldFRleHRXaWR0aDpmdW5jdGlvbihhKXtyZXR1cm4gdi5tZWFzdXJlVGV4dChhKS53aWR0aH0sX3NldFRleHREYXRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRUZXh0KCkuc3BsaXQoXCJcXG5cIiksYj0rdGhpcy5nZXRGb250U2l6ZSgpLGQ9MCxlPXRoaXMuZ2V0TGluZUhlaWdodCgpKmIsZj10aGlzLmF0dHJzLndpZHRoLGg9dGhpcy5hdHRycy5oZWlnaHQsaT1mIT09YyxqPWghPT1jLGs9dGhpcy5nZXRQYWRkaW5nKCksbD1mLTIqayxtPWgtMiprLG49MCxwPXRoaXMuZ2V0V3JhcCgpLHE9cCE9PXMsdD1wIT09ciYmcTt0aGlzLnRleHRBcnI9W10sdi5zYXZlKCksdi5mb250PXRoaXMuX2dldENvbnRleHRGb250KCk7XHJcbmZvcih2YXIgdT0wLHc9YS5sZW5ndGg7dz51OysrdSl7dmFyIHg9YVt1XSx5PXRoaXMuX2dldFRleHRXaWR0aCh4KTtpZihpJiZ5PmwpZm9yKDt4Lmxlbmd0aD4wOyl7Zm9yKHZhciB6PTAsQT14Lmxlbmd0aCxCPVwiXCIsQz0wO0E+ejspe3ZhciBEPXorQT4+PjEsRT14LnNsaWNlKDAsRCsxKSxGPXRoaXMuX2dldFRleHRXaWR0aChFKTtsPj1GPyh6PUQrMSxCPUUsQz1GKTpBPUR9aWYoIUIpYnJlYWs7aWYodCl7dmFyIEc9TWF0aC5tYXgoQi5sYXN0SW5kZXhPZihvKSxCLmxhc3RJbmRleE9mKGcpKSsxO0c+MCYmKHo9RyxCPUIuc2xpY2UoMCx6KSxDPXRoaXMuX2dldFRleHRXaWR0aChCKSl9aWYodGhpcy5fYWRkVGV4dExpbmUoQixDKSxkPU1hdGgubWF4KGQsQyksbis9ZSwhcXx8aiYmbitlPm0pYnJlYWs7aWYoeD14LnNsaWNlKHopLHgubGVuZ3RoPjAmJih5PXRoaXMuX2dldFRleHRXaWR0aCh4KSxsPj15KSl7dGhpcy5fYWRkVGV4dExpbmUoeCx5KSxuKz1lLGQ9TWF0aC5tYXgoZCx5KTticmVha319ZWxzZSB0aGlzLl9hZGRUZXh0TGluZSh4LHkpLG4rPWUsZD1NYXRoLm1heChkLHkpO2lmKGomJm4rZT5tKWJyZWFrfXYucmVzdG9yZSgpLHRoaXMudGV4dEhlaWdodD1iLHRoaXMudGV4dFdpZHRoPWR9fSxLaW5ldGljLlV0aWwuZXh0ZW5kKEtpbmV0aWMuVGV4dCxLaW5ldGljLlNoYXBlKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuVGV4dCxcImZvbnRGYW1pbHlcIixcIkFyaWFsXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5UZXh0LFwiZm9udFNpemVcIiwxMiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRleHQsXCJmb250U3R5bGVcIixtKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuVGV4dCxcImZvbnRWYXJpYW50XCIsbSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRleHQsXCJwYWRkaW5nXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRleHQsXCJhbGlnblwiLGkpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5UZXh0LFwibGluZUhlaWdodFwiLDEpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5UZXh0LFwid3JhcFwiLHEpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXIoS2luZXRpYy5UZXh0LFwidGV4dFwiLGgpLEtpbmV0aWMuRmFjdG9yeS5hZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKEtpbmV0aWMuVGV4dCxcInRleHRcIiksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5UZXh0KX0oKSxmdW5jdGlvbigpe0tpbmV0aWMuTGluZT1mdW5jdGlvbihhKXt0aGlzLl9fX2luaXQoYSl9LEtpbmV0aWMuTGluZS5wcm90b3R5cGU9e19fX2luaXQ6ZnVuY3Rpb24oYSl7S2luZXRpYy5TaGFwZS5jYWxsKHRoaXMsYSksdGhpcy5jbGFzc05hbWU9XCJMaW5lXCIsdGhpcy5vbihcInBvaW50c0NoYW5nZS5raW5ldGljIHRlbnNpb25DaGFuZ2Uua2luZXRpYyBjbG9zZWRDaGFuZ2Uua2luZXRpY1wiLGZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJDYWNoZShcInRlbnNpb25Qb2ludHNcIil9KSx0aGlzLnNjZW5lRnVuYyh0aGlzLl9zY2VuZUZ1bmMpfSxfc2NlbmVGdW5jOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXMuZ2V0UG9pbnRzKCksZj1lLmxlbmd0aCxnPXRoaXMuZ2V0VGVuc2lvbigpLGg9dGhpcy5nZXRDbG9zZWQoKTtpZihhLmJlZ2luUGF0aCgpLGEubW92ZVRvKGVbMF0sZVsxXSksMCE9PWcmJmY+NCl7Zm9yKGI9dGhpcy5nZXRUZW5zaW9uUG9pbnRzKCksYz1iLmxlbmd0aCxkPWg/MDo0LGh8fGEucXVhZHJhdGljQ3VydmVUbyhiWzBdLGJbMV0sYlsyXSxiWzNdKTtjLTI+ZDspYS5iZXppZXJDdXJ2ZVRvKGJbZCsrXSxiW2QrK10sYltkKytdLGJbZCsrXSxiW2QrK10sYltkKytdKTtofHxhLnF1YWRyYXRpY0N1cnZlVG8oYltjLTJdLGJbYy0xXSxlW2YtMl0sZVtmLTFdKX1lbHNlIGZvcihkPTI7Zj5kO2QrPTIpYS5saW5lVG8oZVtkXSxlW2QrMV0pO2g/KGEuY2xvc2VQYXRoKCksYS5maWxsU3Ryb2tlU2hhcGUodGhpcykpOmEuc3Ryb2tlU2hhcGUodGhpcyl9LGdldFRlbnNpb25Qb2ludHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Q2FjaGUoXCJ0ZW5zaW9uUG9pbnRzXCIsdGhpcy5fZ2V0VGVuc2lvblBvaW50cyl9LF9nZXRUZW5zaW9uUG9pbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q2xvc2VkKCk/dGhpcy5fZ2V0VGVuc2lvblBvaW50c0Nsb3NlZCgpOktpbmV0aWMuVXRpbC5fZXhwYW5kUG9pbnRzKHRoaXMuZ2V0UG9pbnRzKCksdGhpcy5nZXRUZW5zaW9uKCkpfSxfZ2V0VGVuc2lvblBvaW50c0Nsb3NlZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9pbnRzKCksYj1hLmxlbmd0aCxjPXRoaXMuZ2V0VGVuc2lvbigpLGQ9S2luZXRpYy5VdGlsLGU9ZC5fZ2V0Q29udHJvbFBvaW50cyhhW2ItMl0sYVtiLTFdLGFbMF0sYVsxXSxhWzJdLGFbM10sYyksZj1kLl9nZXRDb250cm9sUG9pbnRzKGFbYi00XSxhW2ItM10sYVtiLTJdLGFbYi0xXSxhWzBdLGFbMV0sYyksZz1LaW5ldGljLlV0aWwuX2V4cGFuZFBvaW50cyhhLGMpLGg9W2VbMl0sZVszXV0uY29uY2F0KGcpLmNvbmNhdChbZlswXSxmWzFdLGFbYi0yXSxhW2ItMV0sZlsyXSxmWzNdLGVbMF0sZVsxXSxhWzBdLGFbMV1dKTtyZXR1cm4gaH19LEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5MaW5lLEtpbmV0aWMuU2hhcGUpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5MaW5lLFwiY2xvc2VkXCIsITEpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5MaW5lLFwidGVuc2lvblwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5MaW5lLFwicG9pbnRzXCIpLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuTGluZSl9KCksZnVuY3Rpb24oKXtLaW5ldGljLlNwcml0ZT1mdW5jdGlvbihhKXt0aGlzLl9fX2luaXQoYSl9LEtpbmV0aWMuU3ByaXRlLnByb3RvdHlwZT17X19faW5pdDpmdW5jdGlvbihhKXtLaW5ldGljLlNoYXBlLmNhbGwodGhpcyxhKSx0aGlzLmNsYXNzTmFtZT1cIlNwcml0ZVwiLHRoaXMuYW5pbT1uZXcgS2luZXRpYy5BbmltYXRpb24sdGhpcy5vbihcImFuaW1hdGlvbkNoYW5nZS5raW5ldGljXCIsZnVuY3Rpb24oKXt0aGlzLmZyYW1lSW5kZXgoMCl9KSx0aGlzLm9uKFwiZnJhbWVSYXRlQ2hhbmdlLmtpbmV0aWNcIixmdW5jdGlvbigpe3RoaXMuYW5pbS5pc1J1bm5pbmcoKSYmKGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCksdGhpcy5fc2V0SW50ZXJ2YWwoKSl9KSx0aGlzLnNjZW5lRnVuYyh0aGlzLl9zY2VuZUZ1bmMpLHRoaXMuaGl0RnVuYyh0aGlzLl9oaXRGdW5jKX0sX3NjZW5lRnVuYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldEFuaW1hdGlvbigpLGM9dGhpcy5mcmFtZUluZGV4KCksZD00KmMsZT10aGlzLmdldEFuaW1hdGlvbnMoKVtiXSxmPWVbZCswXSxnPWVbZCsxXSxoPWVbZCsyXSxpPWVbZCszXSxqPXRoaXMuZ2V0SW1hZ2UoKTtqJiZhLmRyYXdJbWFnZShqLGYsZyxoLGksMCwwLGgsaSl9LF9oaXRGdW5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0QW5pbWF0aW9uKCksYz10aGlzLmZyYW1lSW5kZXgoKSxkPTQqYyxlPXRoaXMuZ2V0QW5pbWF0aW9ucygpW2JdLGY9ZVtkKzJdLGc9ZVtkKzNdO2EuYmVnaW5QYXRoKCksYS5yZWN0KDAsMCxmLGcpLGEuY2xvc2VQYXRoKCksYS5maWxsU2hhcGUodGhpcyl9LF91c2VCdWZmZXJDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5oYXNTaGFkb3coKXx8MSE9PXRoaXMuZ2V0QWJzb2x1dGVPcGFjaXR5KCkpJiZ0aGlzLmhhc1N0cm9rZSgpfSxfc2V0SW50ZXJ2YWw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuaW50ZXJ2YWw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXthLl91cGRhdGVJbmRleCgpfSwxZTMvdGhpcy5nZXRGcmFtZVJhdGUoKSl9LHN0YXJ0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRMYXllcigpO3RoaXMuYW5pbS5zZXRMYXllcnMoYSksdGhpcy5fc2V0SW50ZXJ2YWwoKSx0aGlzLmFuaW0uc3RhcnQoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuYW5pbS5zdG9wKCksY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKX0saXNSdW5uaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYW5pbS5pc1J1bm5pbmcoKX0sX3VwZGF0ZUluZGV4OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mcmFtZUluZGV4KCksYj10aGlzLmdldEFuaW1hdGlvbigpLGM9dGhpcy5nZXRBbmltYXRpb25zKCksZD1jW2JdLGU9ZC5sZW5ndGgvNDt0aGlzLmZyYW1lSW5kZXgoZS0xPmE/YSsxOjApfX0sS2luZXRpYy5VdGlsLmV4dGVuZChLaW5ldGljLlNwcml0ZSxLaW5ldGljLlNoYXBlKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU3ByaXRlLFwiYW5pbWF0aW9uXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TcHJpdGUsXCJhbmltYXRpb25zXCIpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TcHJpdGUsXCJpbWFnZVwiKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU3ByaXRlLFwiZnJhbWVJbmRleFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5TcHJpdGUsXCJmcmFtZVJhdGVcIiwxNyksS2luZXRpYy5GYWN0b3J5LmJhY2tDb21wYXQoS2luZXRpYy5TcHJpdGUse2luZGV4OlwiZnJhbWVJbmRleFwiLGdldEluZGV4OlwiZ2V0RnJhbWVJbmRleFwiLHNldEluZGV4Olwic2V0RnJhbWVJbmRleFwifSksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5TcHJpdGUpfSgpLGZ1bmN0aW9uKCl7S2luZXRpYy5QYXRoPWZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0sS2luZXRpYy5QYXRoLnByb3RvdHlwZT17X19faW5pdDpmdW5jdGlvbihhKXt0aGlzLmRhdGFBcnJheT1bXTt2YXIgYj10aGlzO0tpbmV0aWMuU2hhcGUuY2FsbCh0aGlzLGEpLHRoaXMuY2xhc3NOYW1lPVwiUGF0aFwiLHRoaXMuZGF0YUFycmF5PUtpbmV0aWMuUGF0aC5wYXJzZVBhdGhEYXRhKHRoaXMuZ2V0RGF0YSgpKSx0aGlzLm9uKFwiZGF0YUNoYW5nZS5raW5ldGljXCIsZnVuY3Rpb24oKXtiLmRhdGFBcnJheT1LaW5ldGljLlBhdGgucGFyc2VQYXRoRGF0YSh0aGlzLmdldERhdGEoKSl9KSx0aGlzLnNjZW5lRnVuYyh0aGlzLl9zY2VuZUZ1bmMpfSxfc2NlbmVGdW5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGF0YUFycmF5LGM9ITE7YS5iZWdpblBhdGgoKTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5jb21tYW5kLGY9YltkXS5wb2ludHM7c3dpdGNoKGUpe2Nhc2VcIkxcIjphLmxpbmVUbyhmWzBdLGZbMV0pO2JyZWFrO2Nhc2VcIk1cIjphLm1vdmVUbyhmWzBdLGZbMV0pO2JyZWFrO2Nhc2VcIkNcIjphLmJlemllckN1cnZlVG8oZlswXSxmWzFdLGZbMl0sZlszXSxmWzRdLGZbNV0pO2JyZWFrO2Nhc2VcIlFcIjphLnF1YWRyYXRpY0N1cnZlVG8oZlswXSxmWzFdLGZbMl0sZlszXSk7YnJlYWs7Y2FzZVwiQVwiOnZhciBnPWZbMF0saD1mWzFdLGk9ZlsyXSxqPWZbM10saz1mWzRdLGw9Zls1XSxtPWZbNl0sbj1mWzddLG89aT5qP2k6aixwPWk+aj8xOmkvaixxPWk+aj9qL2k6MTthLnRyYW5zbGF0ZShnLGgpLGEucm90YXRlKG0pLGEuc2NhbGUocCxxKSxhLmFyYygwLDAsbyxrLGsrbCwxLW4pLGEuc2NhbGUoMS9wLDEvcSksYS5yb3RhdGUoLW0pLGEudHJhbnNsYXRlKC1nLC1oKTticmVhaztjYXNlXCJ6XCI6YS5jbG9zZVBhdGgoKSxjPSEwfX1jP2EuZmlsbFN0cm9rZVNoYXBlKHRoaXMpOmEuc3Ryb2tlU2hhcGUodGhpcyl9fSxLaW5ldGljLlV0aWwuZXh0ZW5kKEtpbmV0aWMuUGF0aCxLaW5ldGljLlNoYXBlKSxLaW5ldGljLlBhdGguZ2V0TGluZUxlbmd0aD1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gTWF0aC5zcXJ0KChjLWEpKihjLWEpKyhkLWIpKihkLWIpKX0sS2luZXRpYy5QYXRoLmdldFBvaW50T25MaW5lPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZvaWQgMD09PWYmJihmPWIpLHZvaWQgMD09PWcmJihnPWMpO3ZhciBoPShlLWMpLyhkLWIrMWUtOCksaT1NYXRoLnNxcnQoYSphLygxK2gqaCkpO2I+ZCYmKGkqPS0xKTt2YXIgaixrPWgqaTtpZihkPT09YilqPXt4OmYseTpnK2t9O2Vsc2UgaWYoKGctYykvKGYtYisxZS04KT09PWgpaj17eDpmK2kseTpnK2t9O2Vsc2V7dmFyIGwsbSxuPXRoaXMuZ2V0TGluZUxlbmd0aChiLGMsZCxlKTtpZigxZS04Pm4pcmV0dXJuIHZvaWQgMDt2YXIgbz0oZi1iKSooZC1iKSsoZy1jKSooZS1jKTtvLz1uKm4sbD1iK28qKGQtYiksbT1jK28qKGUtYyk7dmFyIHA9dGhpcy5nZXRMaW5lTGVuZ3RoKGYsZyxsLG0pLHE9TWF0aC5zcXJ0KGEqYS1wKnApO2k9TWF0aC5zcXJ0KHEqcS8oMStoKmgpKSxiPmQmJihpKj0tMSksaz1oKmksaj17eDpsK2kseTptK2t9fXJldHVybiBqfSxLaW5ldGljLlBhdGguZ2V0UG9pbnRPbkN1YmljQmV6aWVyPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtmdW5jdGlvbiBqKGEpe3JldHVybiBhKmEqYX1mdW5jdGlvbiBrKGEpe3JldHVybiAzKmEqYSooMS1hKX1mdW5jdGlvbiBsKGEpe3JldHVybiAzKmEqKDEtYSkqKDEtYSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4oMS1hKSooMS1hKSooMS1hKX12YXIgbj1oKmooYSkrZiprKGEpK2QqbChhKStiKm0oYSksbz1pKmooYSkrZyprKGEpK2UqbChhKStjKm0oYSk7cmV0dXJue3g6bix5Om99fSxLaW5ldGljLlBhdGguZ2V0UG9pbnRPblF1YWRyYXRpY0Jlemllcj1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXtmdW5jdGlvbiBoKGEpe3JldHVybiBhKmF9ZnVuY3Rpb24gaShhKXtyZXR1cm4gMiphKigxLWEpfWZ1bmN0aW9uIGooYSl7cmV0dXJuKDEtYSkqKDEtYSl9dmFyIGs9ZipoKGEpK2QqaShhKStiKmooYSksbD1nKmgoYSkrZSppKGEpK2MqaihhKTtyZXR1cm57eDprLHk6bH19LEtpbmV0aWMuUGF0aC5nZXRQb2ludE9uRWxsaXB0aWNhbEFyYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9TWF0aC5jb3MoZiksaD1NYXRoLnNpbihmKSxpPXt4OmMqTWF0aC5jb3MoZSkseTpkKk1hdGguc2luKGUpfTtyZXR1cm57eDphKyhpLngqZy1pLnkqaCkseTpiKyhpLngqaCtpLnkqZyl9fSxLaW5ldGljLlBhdGgucGFyc2VQYXRoRGF0YT1mdW5jdGlvbihhKXtpZighYSlyZXR1cm5bXTt2YXIgYj1hLGM9W1wibVwiLFwiTVwiLFwibFwiLFwiTFwiLFwidlwiLFwiVlwiLFwiaFwiLFwiSFwiLFwielwiLFwiWlwiLFwiY1wiLFwiQ1wiLFwicVwiLFwiUVwiLFwidFwiLFwiVFwiLFwic1wiLFwiU1wiLFwiYVwiLFwiQVwiXTtiPWIucmVwbGFjZShuZXcgUmVnRXhwKFwiIFwiLFwiZ1wiKSxcIixcIik7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYj1iLnJlcGxhY2UobmV3IFJlZ0V4cChjW2RdLFwiZ1wiKSxcInxcIitjW2RdKTt2YXIgZT1iLnNwbGl0KFwifFwiKSxmPVtdLGc9MCxoPTA7Zm9yKGQ9MTtkPGUubGVuZ3RoO2QrKyl7dmFyIGk9ZVtkXSxqPWkuY2hhckF0KDApO2k9aS5zbGljZSgxKSxpPWkucmVwbGFjZShuZXcgUmVnRXhwKFwiLC1cIixcImdcIiksXCItXCIpLGk9aS5yZXBsYWNlKG5ldyBSZWdFeHAoXCItXCIsXCJnXCIpLFwiLC1cIiksaT1pLnJlcGxhY2UobmV3IFJlZ0V4cChcImUsLVwiLFwiZ1wiKSxcImUtXCIpO3ZhciBrPWkuc3BsaXQoXCIsXCIpO2subGVuZ3RoPjAmJlwiXCI9PT1rWzBdJiZrLnNoaWZ0KCk7Zm9yKHZhciBsPTA7bDxrLmxlbmd0aDtsKyspa1tsXT1wYXJzZUZsb2F0KGtbbF0pO2Zvcig7ay5sZW5ndGg+MCYmIWlzTmFOKGtbMF0pOyl7dmFyIG0sbixvLHAscSxyLHMsdCx1LHYsdz1udWxsLHg9W10seT1nLHo9aDtzd2l0Y2goail7Y2FzZVwibFwiOmcrPWsuc2hpZnQoKSxoKz1rLnNoaWZ0KCksdz1cIkxcIix4LnB1c2goZyxoKTticmVhaztjYXNlXCJMXCI6Zz1rLnNoaWZ0KCksaD1rLnNoaWZ0KCkseC5wdXNoKGcsaCk7YnJlYWs7Y2FzZVwibVwiOnZhciBBPWsuc2hpZnQoKSxCPWsuc2hpZnQoKTtpZihnKz1BLGgrPUIsdz1cIk1cIixmLmxlbmd0aD4yJiZcInpcIj09PWZbZi5sZW5ndGgtMV0uY29tbWFuZClmb3IodmFyIEM9Zi5sZW5ndGgtMjtDPj0wO0MtLSlpZihcIk1cIj09PWZbQ10uY29tbWFuZCl7Zz1mW0NdLnBvaW50c1swXStBLGg9ZltDXS5wb2ludHNbMV0rQjticmVha314LnB1c2goZyxoKSxqPVwibFwiO2JyZWFrO2Nhc2VcIk1cIjpnPWsuc2hpZnQoKSxoPWsuc2hpZnQoKSx3PVwiTVwiLHgucHVzaChnLGgpLGo9XCJMXCI7YnJlYWs7Y2FzZVwiaFwiOmcrPWsuc2hpZnQoKSx3PVwiTFwiLHgucHVzaChnLGgpO2JyZWFrO2Nhc2VcIkhcIjpnPWsuc2hpZnQoKSx3PVwiTFwiLHgucHVzaChnLGgpO2JyZWFrO2Nhc2VcInZcIjpoKz1rLnNoaWZ0KCksdz1cIkxcIix4LnB1c2goZyxoKTticmVhaztjYXNlXCJWXCI6aD1rLnNoaWZ0KCksdz1cIkxcIix4LnB1c2goZyxoKTticmVhaztjYXNlXCJDXCI6eC5wdXNoKGsuc2hpZnQoKSxrLnNoaWZ0KCksay5zaGlmdCgpLGsuc2hpZnQoKSksZz1rLnNoaWZ0KCksaD1rLnNoaWZ0KCkseC5wdXNoKGcsaCk7YnJlYWs7Y2FzZVwiY1wiOngucHVzaChnK2suc2hpZnQoKSxoK2suc2hpZnQoKSxnK2suc2hpZnQoKSxoK2suc2hpZnQoKSksZys9ay5zaGlmdCgpLGgrPWsuc2hpZnQoKSx3PVwiQ1wiLHgucHVzaChnLGgpO2JyZWFrO2Nhc2VcIlNcIjpuPWcsbz1oLG09ZltmLmxlbmd0aC0xXSxcIkNcIj09PW0uY29tbWFuZCYmKG49ZysoZy1tLnBvaW50c1syXSksbz1oKyhoLW0ucG9pbnRzWzNdKSkseC5wdXNoKG4sbyxrLnNoaWZ0KCksay5zaGlmdCgpKSxnPWsuc2hpZnQoKSxoPWsuc2hpZnQoKSx3PVwiQ1wiLHgucHVzaChnLGgpO2JyZWFrO2Nhc2VcInNcIjpuPWcsbz1oLG09ZltmLmxlbmd0aC0xXSxcIkNcIj09PW0uY29tbWFuZCYmKG49ZysoZy1tLnBvaW50c1syXSksbz1oKyhoLW0ucG9pbnRzWzNdKSkseC5wdXNoKG4sbyxnK2suc2hpZnQoKSxoK2suc2hpZnQoKSksZys9ay5zaGlmdCgpLGgrPWsuc2hpZnQoKSx3PVwiQ1wiLHgucHVzaChnLGgpO2JyZWFrO2Nhc2VcIlFcIjp4LnB1c2goay5zaGlmdCgpLGsuc2hpZnQoKSksZz1rLnNoaWZ0KCksaD1rLnNoaWZ0KCkseC5wdXNoKGcsaCk7YnJlYWs7Y2FzZVwicVwiOngucHVzaChnK2suc2hpZnQoKSxoK2suc2hpZnQoKSksZys9ay5zaGlmdCgpLGgrPWsuc2hpZnQoKSx3PVwiUVwiLHgucHVzaChnLGgpO2JyZWFrO2Nhc2VcIlRcIjpuPWcsbz1oLG09ZltmLmxlbmd0aC0xXSxcIlFcIj09PW0uY29tbWFuZCYmKG49ZysoZy1tLnBvaW50c1swXSksbz1oKyhoLW0ucG9pbnRzWzFdKSksZz1rLnNoaWZ0KCksaD1rLnNoaWZ0KCksdz1cIlFcIix4LnB1c2gobixvLGcsaCk7YnJlYWs7Y2FzZVwidFwiOm49ZyxvPWgsbT1mW2YubGVuZ3RoLTFdLFwiUVwiPT09bS5jb21tYW5kJiYobj1nKyhnLW0ucG9pbnRzWzBdKSxvPWgrKGgtbS5wb2ludHNbMV0pKSxnKz1rLnNoaWZ0KCksaCs9ay5zaGlmdCgpLHc9XCJRXCIseC5wdXNoKG4sbyxnLGgpO2JyZWFrO2Nhc2VcIkFcIjpwPWsuc2hpZnQoKSxxPWsuc2hpZnQoKSxyPWsuc2hpZnQoKSxzPWsuc2hpZnQoKSx0PWsuc2hpZnQoKSx1PWcsdj1oLGc9ay5zaGlmdCgpLGg9ay5zaGlmdCgpLHc9XCJBXCIseD10aGlzLmNvbnZlcnRFbmRwb2ludFRvQ2VudGVyUGFyYW1ldGVyaXphdGlvbih1LHYsZyxoLHMsdCxwLHEscik7YnJlYWs7Y2FzZVwiYVwiOnA9ay5zaGlmdCgpLHE9ay5zaGlmdCgpLHI9ay5zaGlmdCgpLHM9ay5zaGlmdCgpLHQ9ay5zaGlmdCgpLHU9Zyx2PWgsZys9ay5zaGlmdCgpLGgrPWsuc2hpZnQoKSx3PVwiQVwiLHg9dGhpcy5jb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb24odSx2LGcsaCxzLHQscCxxLHIpfWYucHVzaCh7Y29tbWFuZDp3fHxqLHBvaW50czp4LHN0YXJ0Ont4OnkseTp6fSxwYXRoTGVuZ3RoOnRoaXMuY2FsY0xlbmd0aCh5LHosd3x8aix4KX0pfShcInpcIj09PWp8fFwiWlwiPT09aikmJmYucHVzaCh7Y29tbWFuZDpcInpcIixwb2ludHM6W10sc3RhcnQ6dm9pZCAwLHBhdGhMZW5ndGg6MH0pfXJldHVybiBmfSxLaW5ldGljLlBhdGguY2FsY0xlbmd0aD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGcsaCxpPUtpbmV0aWMuUGF0aDtzd2l0Y2goYyl7Y2FzZVwiTFwiOnJldHVybiBpLmdldExpbmVMZW5ndGgoYSxiLGRbMF0sZFsxXSk7Y2FzZVwiQ1wiOmZvcihlPTAsZj1pLmdldFBvaW50T25DdWJpY0JlemllcigwLGEsYixkWzBdLGRbMV0sZFsyXSxkWzNdLGRbNF0sZFs1XSksaD0uMDE7MT49aDtoKz0uMDEpZz1pLmdldFBvaW50T25DdWJpY0JlemllcihoLGEsYixkWzBdLGRbMV0sZFsyXSxkWzNdLGRbNF0sZFs1XSksZSs9aS5nZXRMaW5lTGVuZ3RoKGYueCxmLnksZy54LGcueSksZj1nO3JldHVybiBlO2Nhc2VcIlFcIjpmb3IoZT0wLGY9aS5nZXRQb2ludE9uUXVhZHJhdGljQmV6aWVyKDAsYSxiLGRbMF0sZFsxXSxkWzJdLGRbM10pLGg9LjAxOzE+PWg7aCs9LjAxKWc9aS5nZXRQb2ludE9uUXVhZHJhdGljQmV6aWVyKGgsYSxiLGRbMF0sZFsxXSxkWzJdLGRbM10pLGUrPWkuZ2V0TGluZUxlbmd0aChmLngsZi55LGcueCxnLnkpLGY9ZztyZXR1cm4gZTtjYXNlXCJBXCI6ZT0wO3ZhciBqPWRbNF0saz1kWzVdLGw9ZFs0XStrLG09TWF0aC5QSS8xODA7aWYoTWF0aC5hYnMoai1sKTxtJiYobT1NYXRoLmFicyhqLWwpKSxmPWkuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMoZFswXSxkWzFdLGRbMl0sZFszXSxqLDApLDA+aylmb3IoaD1qLW07aD5sO2gtPW0pZz1pLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKGRbMF0sZFsxXSxkWzJdLGRbM10saCwwKSxlKz1pLmdldExpbmVMZW5ndGgoZi54LGYueSxnLngsZy55KSxmPWc7ZWxzZSBmb3IoaD1qK207bD5oO2grPW0pZz1pLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKGRbMF0sZFsxXSxkWzJdLGRbM10saCwwKSxlKz1pLmdldExpbmVMZW5ndGgoZi54LGYueSxnLngsZy55KSxmPWc7cmV0dXJuIGc9aS5nZXRQb2ludE9uRWxsaXB0aWNhbEFyYyhkWzBdLGRbMV0sZFsyXSxkWzNdLGwsMCksZSs9aS5nZXRMaW5lTGVuZ3RoKGYueCxmLnksZy54LGcueSl9cmV0dXJuIDB9LEtpbmV0aWMuUGF0aC5jb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb249ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciBqPWkqKE1hdGguUEkvMTgwKSxrPU1hdGguY29zKGopKihhLWMpLzIrTWF0aC5zaW4oaikqKGItZCkvMixsPS0xKk1hdGguc2luKGopKihhLWMpLzIrTWF0aC5jb3MoaikqKGItZCkvMixtPWsqay8oZypnKStsKmwvKGgqaCk7bT4xJiYoZyo9TWF0aC5zcXJ0KG0pLGgqPU1hdGguc3FydChtKSk7dmFyIG49TWF0aC5zcXJ0KChnKmcqaCpoLWcqZypsKmwtaCpoKmsqaykvKGcqZypsKmwraCpoKmsqaykpO2U9PT1mJiYobio9LTEpLGlzTmFOKG4pJiYobj0wKTt2YXIgbz1uKmcqbC9oLHA9biotaCprL2cscT0oYStjKS8yK01hdGguY29zKGopKm8tTWF0aC5zaW4oaikqcCxyPShiK2QpLzIrTWF0aC5zaW4oaikqbytNYXRoLmNvcyhqKSpwLHM9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydChhWzBdKmFbMF0rYVsxXSphWzFdKX0sdD1mdW5jdGlvbihhLGIpe3JldHVybihhWzBdKmJbMF0rYVsxXSpiWzFdKS8ocyhhKSpzKGIpKX0sdT1mdW5jdGlvbihhLGIpe3JldHVybihhWzBdKmJbMV08YVsxXSpiWzBdPy0xOjEpKk1hdGguYWNvcyh0KGEsYikpfSx2PXUoWzEsMF0sWyhrLW8pL2csKGwtcCkvaF0pLHc9WyhrLW8pL2csKGwtcCkvaF0seD1bKC0xKmstbykvZywoLTEqbC1wKS9oXSx5PXUodyx4KTtyZXR1cm4gdCh3LHgpPD0tMSYmKHk9TWF0aC5QSSksdCh3LHgpPj0xJiYoeT0wKSwwPT09ZiYmeT4wJiYoeS09MipNYXRoLlBJKSwxPT09ZiYmMD55JiYoeSs9MipNYXRoLlBJKSxbcSxyLGcsaCx2LHksaixmXX0sS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlBhdGgsXCJkYXRhXCIpLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuUGF0aCl9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2EuZmlsbFRleHQodGhpcy5wYXJ0aWFsVGV4dCwwLDApfWZ1bmN0aW9uIGIoYSl7YS5zdHJva2VUZXh0KHRoaXMucGFydGlhbFRleHQsMCwwKX12YXIgYz1cIlwiLGQ9XCJub3JtYWxcIjtLaW5ldGljLlRleHRQYXRoPWZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0sS2luZXRpYy5UZXh0UGF0aC5wcm90b3R5cGU9e19fX2luaXQ6ZnVuY3Rpb24oYyl7dmFyIGQ9dGhpczt0aGlzLmR1bW15Q2FudmFzPUtpbmV0aWMuVXRpbC5jcmVhdGVDYW52YXNFbGVtZW50KCksdGhpcy5kYXRhQXJyYXk9W10sS2luZXRpYy5TaGFwZS5jYWxsKHRoaXMsYyksdGhpcy5fZmlsbEZ1bmM9YSx0aGlzLl9zdHJva2VGdW5jPWIsdGhpcy5fZmlsbEZ1bmNIaXQ9YSx0aGlzLl9zdHJva2VGdW5jSGl0PWIsdGhpcy5jbGFzc05hbWU9XCJUZXh0UGF0aFwiLHRoaXMuZGF0YUFycmF5PUtpbmV0aWMuUGF0aC5wYXJzZVBhdGhEYXRhKHRoaXMuYXR0cnMuZGF0YSksdGhpcy5vbihcImRhdGFDaGFuZ2Uua2luZXRpY1wiLGZ1bmN0aW9uKCl7ZC5kYXRhQXJyYXk9S2luZXRpYy5QYXRoLnBhcnNlUGF0aERhdGEodGhpcy5hdHRycy5kYXRhKX0pLHRoaXMub24oXCJ0ZXh0Q2hhbmdlLmtpbmV0aWMgdGV4dFN0cm9rZS5raW5ldGljIHRleHRTdHJva2VXaWR0aC5raW5ldGljXCIsZC5fc2V0VGV4dERhdGEpLGQuX3NldFRleHREYXRhKCksdGhpcy5zY2VuZUZ1bmModGhpcy5fc2NlbmVGdW5jKX0sX3NjZW5lRnVuYzpmdW5jdGlvbihhKXthLnNldEF0dHIoXCJmb250XCIsdGhpcy5fZ2V0Q29udGV4dEZvbnQoKSksYS5zZXRBdHRyKFwidGV4dEJhc2VsaW5lXCIsXCJtaWRkbGVcIiksYS5zZXRBdHRyKFwidGV4dEFsaWduXCIsXCJsZWZ0XCIpLGEuc2F2ZSgpO2Zvcih2YXIgYj10aGlzLmdseXBoSW5mbyxjPTA7YzxiLmxlbmd0aDtjKyspe2Euc2F2ZSgpO3ZhciBkPWJbY10ucDA7YS50cmFuc2xhdGUoZC54LGQueSksYS5yb3RhdGUoYltjXS5yb3RhdGlvbiksdGhpcy5wYXJ0aWFsVGV4dD1iW2NdLnRleHQsYS5maWxsU3Ryb2tlU2hhcGUodGhpcyksYS5yZXN0b3JlKCl9YS5yZXN0b3JlKCl9LGdldFRleHRXaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHRXaWR0aH0sZ2V0VGV4dEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHRIZWlnaHR9LHNldFRleHQ6ZnVuY3Rpb24oYSl7S2luZXRpYy5UZXh0LnByb3RvdHlwZS5zZXRUZXh0LmNhbGwodGhpcyxhKX0sX2dldFRleHRTaXplOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZHVtbXlDYW52YXMsYz1iLmdldENvbnRleHQoXCIyZFwiKTtjLnNhdmUoKSxjLmZvbnQ9dGhpcy5fZ2V0Q29udGV4dEZvbnQoKTt2YXIgZD1jLm1lYXN1cmVUZXh0KGEpO3JldHVybiBjLnJlc3RvcmUoKSx7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hdHRycy5mb250U2l6ZSwxMCl9fSxfc2V0VGV4dERhdGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9dGhpcy5fZ2V0VGV4dFNpemUodGhpcy5hdHRycy50ZXh0KTt0aGlzLnRleHRXaWR0aD1iLndpZHRoLHRoaXMudGV4dEhlaWdodD1iLmhlaWdodCx0aGlzLmdseXBoSW5mbz1bXTtmb3IodmFyIGMsZCxlLGY9dGhpcy5hdHRycy50ZXh0LnNwbGl0KFwiXCIpLGc9LTEsaD0wLGk9ZnVuY3Rpb24oKXtoPTA7Zm9yKHZhciBiPWEuZGF0YUFycmF5LGQ9ZysxO2Q8Yi5sZW5ndGg7ZCsrKXtpZihiW2RdLnBhdGhMZW5ndGg+MClyZXR1cm4gZz1kLGJbZF07XCJNXCI9PWJbZF0uY29tbWFuZCYmKGM9e3g6YltkXS5wb2ludHNbMF0seTpiW2RdLnBvaW50c1sxXX0pfXJldHVybnt9fSxqPWZ1bmN0aW9uKGIpe3ZhciBmPWEuX2dldFRleHRTaXplKGIpLndpZHRoLGc9MCxqPTA7Zm9yKGQ9dm9pZCAwO01hdGguYWJzKGYtZykvZj4uMDEmJjI1Pmo7KXtqKys7Zm9yKHZhciBrPWc7dm9pZCAwPT09ZTspZT1pKCksZSYmaytlLnBhdGhMZW5ndGg8ZiYmKGsrPWUucGF0aExlbmd0aCxlPXZvaWQgMCk7aWYoZT09PXt9fHx2b2lkIDA9PT1jKXJldHVybiB2b2lkIDA7dmFyIGw9ITE7c3dpdGNoKGUuY29tbWFuZCl7Y2FzZVwiTFwiOktpbmV0aWMuUGF0aC5nZXRMaW5lTGVuZ3RoKGMueCxjLnksZS5wb2ludHNbMF0sZS5wb2ludHNbMV0pPmY/ZD1LaW5ldGljLlBhdGguZ2V0UG9pbnRPbkxpbmUoZixjLngsYy55LGUucG9pbnRzWzBdLGUucG9pbnRzWzFdLGMueCxjLnkpOmU9dm9pZCAwO2JyZWFrO2Nhc2VcIkFcIjp2YXIgbT1lLnBvaW50c1s0XSxuPWUucG9pbnRzWzVdLG89ZS5wb2ludHNbNF0rbjswPT09aD9oPW0rMWUtODpmPmc/aCs9TWF0aC5QSS8xODAqbi9NYXRoLmFicyhuKTpoLT1NYXRoLlBJLzM2MCpuL01hdGguYWJzKG4pLCgwPm4mJm8+aHx8bj49MCYmaD5vKSYmKGg9byxsPSEwKSxkPUtpbmV0aWMuUGF0aC5nZXRQb2ludE9uRWxsaXB0aWNhbEFyYyhlLnBvaW50c1swXSxlLnBvaW50c1sxXSxlLnBvaW50c1syXSxlLnBvaW50c1szXSxoLGUucG9pbnRzWzZdKTticmVhaztjYXNlXCJDXCI6MD09PWg/aD1mPmUucGF0aExlbmd0aD8xZS04OmYvZS5wYXRoTGVuZ3RoOmY+Zz9oKz0oZi1nKS9lLnBhdGhMZW5ndGg6aC09KGctZikvZS5wYXRoTGVuZ3RoLGg+MSYmKGg9MSxsPSEwKSxkPUtpbmV0aWMuUGF0aC5nZXRQb2ludE9uQ3ViaWNCZXppZXIoaCxlLnN0YXJ0LngsZS5zdGFydC55LGUucG9pbnRzWzBdLGUucG9pbnRzWzFdLGUucG9pbnRzWzJdLGUucG9pbnRzWzNdLGUucG9pbnRzWzRdLGUucG9pbnRzWzVdKTticmVhaztjYXNlXCJRXCI6MD09PWg/aD1mL2UucGF0aExlbmd0aDpmPmc/aCs9KGYtZykvZS5wYXRoTGVuZ3RoOmgtPShnLWYpL2UucGF0aExlbmd0aCxoPjEmJihoPTEsbD0hMCksZD1LaW5ldGljLlBhdGguZ2V0UG9pbnRPblF1YWRyYXRpY0JlemllcihoLGUuc3RhcnQueCxlLnN0YXJ0LnksZS5wb2ludHNbMF0sZS5wb2ludHNbMV0sZS5wb2ludHNbMl0sZS5wb2ludHNbM10pfXZvaWQgMCE9PWQmJihnPUtpbmV0aWMuUGF0aC5nZXRMaW5lTGVuZ3RoKGMueCxjLnksZC54LGQueSkpLGwmJihsPSExLGU9dm9pZCAwKX19LGs9MDtrPGYubGVuZ3RoJiYoaihmW2tdKSx2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kKTtrKyspe3ZhciBsPUtpbmV0aWMuUGF0aC5nZXRMaW5lTGVuZ3RoKGMueCxjLnksZC54LGQueSksbT0wLG49S2luZXRpYy5QYXRoLmdldFBvaW50T25MaW5lKG0rbC8yLGMueCxjLnksZC54LGQueSksbz1NYXRoLmF0YW4yKGQueS1jLnksZC54LWMueCk7dGhpcy5nbHlwaEluZm8ucHVzaCh7dHJhbnNwb3NlWDpuLngsdHJhbnNwb3NlWTpuLnksdGV4dDpmW2tdLHJvdGF0aW9uOm8scDA6YyxwMTpkfSksYz1kfX19LEtpbmV0aWMuVGV4dFBhdGgucHJvdG90eXBlLl9nZXRDb250ZXh0Rm9udD1LaW5ldGljLlRleHQucHJvdG90eXBlLl9nZXRDb250ZXh0Rm9udCxLaW5ldGljLlV0aWwuZXh0ZW5kKEtpbmV0aWMuVGV4dFBhdGgsS2luZXRpYy5TaGFwZSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRleHRQYXRoLFwiZm9udEZhbWlseVwiLFwiQXJpYWxcIiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRleHRQYXRoLFwiZm9udFNpemVcIiwxMiksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRleHRQYXRoLFwiZm9udFN0eWxlXCIsZCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRleHRQYXRoLFwiZm9udFZhcmlhbnRcIixkKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyKEtpbmV0aWMuVGV4dFBhdGgsXCJ0ZXh0XCIsYyksS2luZXRpYy5Db2xsZWN0aW9uLm1hcE1ldGhvZHMoS2luZXRpYy5UZXh0UGF0aCl9KCksZnVuY3Rpb24oKXtLaW5ldGljLlJlZ3VsYXJQb2x5Z29uPWZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0sS2luZXRpYy5SZWd1bGFyUG9seWdvbi5wcm90b3R5cGU9e19fX2luaXQ6ZnVuY3Rpb24oYSl7S2luZXRpYy5TaGFwZS5jYWxsKHRoaXMsYSksdGhpcy5jbGFzc05hbWU9XCJSZWd1bGFyUG9seWdvblwiLHRoaXMuc2NlbmVGdW5jKHRoaXMuX3NjZW5lRnVuYyl9LF9zY2VuZUZ1bmM6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpcy5hdHRycy5zaWRlcyxmPXRoaXMuYXR0cnMucmFkaXVzO2ZvcihhLmJlZ2luUGF0aCgpLGEubW92ZVRvKDAsMC1mKSxiPTE7ZT5iO2IrKyljPWYqTWF0aC5zaW4oMipiKk1hdGguUEkvZSksZD0tMSpmKk1hdGguY29zKDIqYipNYXRoLlBJL2UpLGEubGluZVRvKGMsZCk7YS5jbG9zZVBhdGgoKSxhLmZpbGxTdHJva2VTaGFwZSh0aGlzKX19LEtpbmV0aWMuVXRpbC5leHRlbmQoS2luZXRpYy5SZWd1bGFyUG9seWdvbixLaW5ldGljLlNoYXBlKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuUmVndWxhclBvbHlnb24sXCJyYWRpdXNcIiwwKSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuUmVndWxhclBvbHlnb24sXCJzaWRlc1wiLDApLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuUmVndWxhclBvbHlnb24pfSgpLGZ1bmN0aW9uKCl7S2luZXRpYy5TdGFyPWZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0sS2luZXRpYy5TdGFyLnByb3RvdHlwZT17X19faW5pdDpmdW5jdGlvbihhKXtLaW5ldGljLlNoYXBlLmNhbGwodGhpcyxhKSx0aGlzLmNsYXNzTmFtZT1cIlN0YXJcIix0aGlzLnNjZW5lRnVuYyh0aGlzLl9zY2VuZUZ1bmMpfSxfc2NlbmVGdW5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuaW5uZXJSYWRpdXMoKSxjPXRoaXMub3V0ZXJSYWRpdXMoKSxkPXRoaXMubnVtUG9pbnRzKCk7YS5iZWdpblBhdGgoKSxhLm1vdmVUbygwLDAtYyk7Zm9yKHZhciBlPTE7MipkPmU7ZSsrKXt2YXIgZj1lJTI9PT0wP2M6YixnPWYqTWF0aC5zaW4oZSpNYXRoLlBJL2QpLGg9LTEqZipNYXRoLmNvcyhlKk1hdGguUEkvZCk7YS5saW5lVG8oZyxoKX1hLmNsb3NlUGF0aCgpLGEuZmlsbFN0cm9rZVNoYXBlKHRoaXMpfX0sS2luZXRpYy5VdGlsLmV4dGVuZChLaW5ldGljLlN0YXIsS2luZXRpYy5TaGFwZSksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlN0YXIsXCJudW1Qb2ludHNcIiw1KSxLaW5ldGljLkZhY3RvcnkuYWRkR2V0dGVyU2V0dGVyKEtpbmV0aWMuU3RhcixcImlubmVyUmFkaXVzXCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlN0YXIsXCJvdXRlclJhZGl1c1wiLDApLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuU3Rhcil9KCksZnVuY3Rpb24oKXt2YXIgYT1bXCJmb250RmFtaWx5XCIsXCJmb250U2l6ZVwiLFwiZm9udFN0eWxlXCIsXCJwYWRkaW5nXCIsXCJsaW5lSGVpZ2h0XCIsXCJ0ZXh0XCJdLGI9XCJDaGFuZ2Uua2luZXRpY1wiLGM9XCJub25lXCIsZD1cInVwXCIsZT1cInJpZ2h0XCIsZj1cImRvd25cIixnPVwibGVmdFwiLGg9XCJMYWJlbFwiLGk9YS5sZW5ndGg7S2luZXRpYy5MYWJlbD1mdW5jdGlvbihhKXt0aGlzLl9fX19pbml0KGEpfSxLaW5ldGljLkxhYmVsLnByb3RvdHlwZT17X19fX2luaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLmNsYXNzTmFtZT1oLEtpbmV0aWMuR3JvdXAuY2FsbCh0aGlzLGEpLHRoaXMub24oXCJhZGQua2luZXRpY1wiLGZ1bmN0aW9uKGEpe2IuX2FkZExpc3RlbmVycyhhLmNoaWxkKSxiLl9zeW5jKCl9KX0sZ2V0VGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbmQoXCJUZXh0XCIpWzBdfSxnZXRUYWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kKFwiVGFnXCIpWzBdfSxfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKGMpe3ZhciBkLGU9dGhpcyxmPWZ1bmN0aW9uKCl7ZS5fc3luYygpfTtmb3IoZD0wO2k+ZDtkKyspYy5vbihhW2RdK2IsZil9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dCgpLmdldFdpZHRoKCl9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRleHQoKS5nZXRIZWlnaHQoKX0sX3N5bmM6ZnVuY3Rpb24oKXt2YXIgYSxiLGMsaCxpLGosayxsPXRoaXMuZ2V0VGV4dCgpLG09dGhpcy5nZXRUYWcoKTtpZihsJiZtKXtzd2l0Y2goYT1sLmdldFdpZHRoKCksYj1sLmdldEhlaWdodCgpLGM9bS5nZXRQb2ludGVyRGlyZWN0aW9uKCksaD1tLmdldFBvaW50ZXJXaWR0aCgpLGs9bS5nZXRQb2ludGVySGVpZ2h0KCksaT0wLGo9MCxjKXtjYXNlIGQ6aT1hLzIsaj0tMSprO2JyZWFrO2Nhc2UgZTppPWEraCxqPWIvMjticmVhaztjYXNlIGY6aT1hLzIsaj1iK2s7YnJlYWs7Y2FzZSBnOmk9LTEqaCxqPWIvMn1tLnNldEF0dHJzKHt4Oi0xKmkseTotMSpqLHdpZHRoOmEsaGVpZ2h0OmJ9KSxsLnNldEF0dHJzKHt4Oi0xKmkseTotMSpqfSl9fX0sS2luZXRpYy5VdGlsLmV4dGVuZChLaW5ldGljLkxhYmVsLEtpbmV0aWMuR3JvdXApLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuTGFiZWwpLEtpbmV0aWMuVGFnPWZ1bmN0aW9uKGEpe3RoaXMuX19faW5pdChhKX0sS2luZXRpYy5UYWcucHJvdG90eXBlPXtfX19pbml0OmZ1bmN0aW9uKGEpe0tpbmV0aWMuU2hhcGUuY2FsbCh0aGlzLGEpLHRoaXMuY2xhc3NOYW1lPVwiVGFnXCIsdGhpcy5zY2VuZUZ1bmModGhpcy5fc2NlbmVGdW5jKX0sX3NjZW5lRnVuYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFdpZHRoKCksYz10aGlzLmdldEhlaWdodCgpLGg9dGhpcy5nZXRQb2ludGVyRGlyZWN0aW9uKCksaT10aGlzLmdldFBvaW50ZXJXaWR0aCgpLGo9dGhpcy5nZXRQb2ludGVySGVpZ2h0KCk7YS5iZWdpblBhdGgoKSxhLm1vdmVUbygwLDApLGg9PT1kJiYoYS5saW5lVG8oKGItaSkvMiwwKSxhLmxpbmVUbyhiLzIsLTEqaiksYS5saW5lVG8oKGIraSkvMiwwKSksYS5saW5lVG8oYiwwKSxoPT09ZSYmKGEubGluZVRvKGIsKGMtaikvMiksYS5saW5lVG8oYitpLGMvMiksYS5saW5lVG8oYiwoYytqKS8yKSksYS5saW5lVG8oYixjKSxoPT09ZiYmKGEubGluZVRvKChiK2kpLzIsYyksYS5saW5lVG8oYi8yLGMraiksYS5saW5lVG8oKGItaSkvMixjKSksYS5saW5lVG8oMCxjKSxoPT09ZyYmKGEubGluZVRvKDAsKGMraikvMiksYS5saW5lVG8oLTEqaSxjLzIpLGEubGluZVRvKDAsKGMtaikvMikpLGEuY2xvc2VQYXRoKCksYS5maWxsU3Ryb2tlU2hhcGUodGhpcyl9fSxLaW5ldGljLlV0aWwuZXh0ZW5kKEtpbmV0aWMuVGFnLEtpbmV0aWMuU2hhcGUpLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5UYWcsXCJwb2ludGVyRGlyZWN0aW9uXCIsYyksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRhZyxcInBvaW50ZXJXaWR0aFwiLDApLEtpbmV0aWMuRmFjdG9yeS5hZGRHZXR0ZXJTZXR0ZXIoS2luZXRpYy5UYWcsXCJwb2ludGVySGVpZ2h0XCIsMCksS2luZXRpYy5GYWN0b3J5LmFkZEdldHRlclNldHRlcihLaW5ldGljLlRhZyxcImNvcm5lclJhZGl1c1wiLDApLEtpbmV0aWMuQ29sbGVjdGlvbi5tYXBNZXRob2RzKEtpbmV0aWMuVGFnKX0oKTsiLCIvKlxyXG4gQ29weXJpZ2h0IChDKSBGZWRlcmljbyBaaXZvbG8gMjAxN1xyXG4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChsaWNlbnNlIHRlcm1zIGFyZSBhdCBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUKS5cclxuICovKGZ1bmN0aW9uKGUsdCl7J29iamVjdCc9PXR5cGVvZiBleHBvcnRzJiYndW5kZWZpbmVkJyE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6J2Z1bmN0aW9uJz09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6ZS5Qb3BwZXI9dCgpfSkodGhpcyxmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztmdW5jdGlvbiBlKGUpe3JldHVybiBlJiYnW29iamVjdCBGdW5jdGlvbl0nPT09e30udG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiB0KGUsdCl7aWYoMSE9PWUubm9kZVR5cGUpcmV0dXJuW107dmFyIG89Z2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpO3JldHVybiB0P29bdF06b31mdW5jdGlvbiBvKGUpe3JldHVybidIVE1MJz09PWUubm9kZU5hbWU/ZTplLnBhcmVudE5vZGV8fGUuaG9zdH1mdW5jdGlvbiBuKGUpe2lmKCFlKXJldHVybiBkb2N1bWVudC5ib2R5O3N3aXRjaChlLm5vZGVOYW1lKXtjYXNlJ0hUTUwnOmNhc2UnQk9EWSc6cmV0dXJuIGUub3duZXJEb2N1bWVudC5ib2R5O2Nhc2UnI2RvY3VtZW50JzpyZXR1cm4gZS5ib2R5O312YXIgaT10KGUpLHI9aS5vdmVyZmxvdyxwPWkub3ZlcmZsb3dYLHM9aS5vdmVyZmxvd1k7cmV0dXJuIC8oYXV0b3xzY3JvbGwpLy50ZXN0KHIrcytwKT9lOm4obyhlKSl9ZnVuY3Rpb24gcihlKXt2YXIgbz1lJiZlLm9mZnNldFBhcmVudCxpPW8mJm8ubm9kZU5hbWU7cmV0dXJuIGkmJidCT0RZJyE9PWkmJidIVE1MJyE9PWk/LTEhPT1bJ1REJywnVEFCTEUnXS5pbmRleE9mKG8ubm9kZU5hbWUpJiYnc3RhdGljJz09PXQobywncG9zaXRpb24nKT9yKG8pOm86ZT9lLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiBwKGUpe3ZhciB0PWUubm9kZU5hbWU7cmV0dXJuJ0JPRFknIT09dCYmKCdIVE1MJz09PXR8fHIoZS5maXJzdEVsZW1lbnRDaGlsZCk9PT1lKX1mdW5jdGlvbiBzKGUpe3JldHVybiBudWxsPT09ZS5wYXJlbnROb2RlP2U6cyhlLnBhcmVudE5vZGUpfWZ1bmN0aW9uIGQoZSx0KXtpZighZXx8IWUubm9kZVR5cGV8fCF0fHwhdC5ub2RlVHlwZSlyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBvPWUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkmTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcsaT1vP2U6dCxuPW8/dDplLGE9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTthLnNldFN0YXJ0KGksMCksYS5zZXRFbmQobiwwKTt2YXIgbD1hLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO2lmKGUhPT1sJiZ0IT09bHx8aS5jb250YWlucyhuKSlyZXR1cm4gcChsKT9sOnIobCk7dmFyIGY9cyhlKTtyZXR1cm4gZi5ob3N0P2QoZi5ob3N0LHQpOmQoZSxzKHQpLmhvc3QpfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOid0b3AnLG89J3RvcCc9PT10PydzY3JvbGxUb3AnOidzY3JvbGxMZWZ0JyxpPWUubm9kZU5hbWU7aWYoJ0JPRFknPT09aXx8J0hUTUwnPT09aSl7dmFyIG49ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPWUub3duZXJEb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50fHxuO3JldHVybiByW29dfXJldHVybiBlW29dfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLGk9YSh0LCd0b3AnKSxuPWEodCwnbGVmdCcpLHI9bz8tMToxO3JldHVybiBlLnRvcCs9aSpyLGUuYm90dG9tKz1pKnIsZS5sZWZ0Kz1uKnIsZS5yaWdodCs9bipyLGV9ZnVuY3Rpb24gZihlLHQpe3ZhciBvPSd4Jz09PXQ/J0xlZnQnOidUb3AnLGk9J0xlZnQnPT1vPydSaWdodCc6J0JvdHRvbSc7cmV0dXJuIHBhcnNlRmxvYXQoZVsnYm9yZGVyJytvKydXaWR0aCddLDEwKStwYXJzZUZsb2F0KGVbJ2JvcmRlcicraSsnV2lkdGgnXSwxMCl9ZnVuY3Rpb24gbShlLHQsbyxpKXtyZXR1cm4gSih0WydvZmZzZXQnK2VdLHRbJ3Njcm9sbCcrZV0sb1snY2xpZW50JytlXSxvWydvZmZzZXQnK2VdLG9bJ3Njcm9sbCcrZV0saWUoKT9vWydvZmZzZXQnK2VdK2lbJ21hcmdpbicrKCdIZWlnaHQnPT09ZT8nVG9wJzonTGVmdCcpXStpWydtYXJnaW4nKygnSGVpZ2h0Jz09PWU/J0JvdHRvbSc6J1JpZ2h0JyldOjApfWZ1bmN0aW9uIGgoKXt2YXIgZT1kb2N1bWVudC5ib2R5LHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG89aWUoKSYmZ2V0Q29tcHV0ZWRTdHlsZSh0KTtyZXR1cm57aGVpZ2h0Om0oJ0hlaWdodCcsZSx0LG8pLHdpZHRoOm0oJ1dpZHRoJyxlLHQsbyl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIHNlKHt9LGUse3JpZ2h0OmUubGVmdCtlLndpZHRoLGJvdHRvbTplLnRvcCtlLmhlaWdodH0pfWZ1bmN0aW9uIGcoZSl7dmFyIG89e307aWYoaWUoKSl0cnl7bz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBpPWEoZSwndG9wJyksbj1hKGUsJ2xlZnQnKTtvLnRvcCs9aSxvLmxlZnQrPW4sby5ib3R0b20rPWksby5yaWdodCs9bn1jYXRjaChlKXt9ZWxzZSBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIHI9e2xlZnQ6by5sZWZ0LHRvcDpvLnRvcCx3aWR0aDpvLnJpZ2h0LW8ubGVmdCxoZWlnaHQ6by5ib3R0b20tby50b3B9LHA9J0hUTUwnPT09ZS5ub2RlTmFtZT9oKCk6e30scz1wLndpZHRofHxlLmNsaWVudFdpZHRofHxyLnJpZ2h0LXIubGVmdCxkPXAuaGVpZ2h0fHxlLmNsaWVudEhlaWdodHx8ci5ib3R0b20tci50b3AsbD1lLm9mZnNldFdpZHRoLXMsbT1lLm9mZnNldEhlaWdodC1kO2lmKGx8fG0pe3ZhciBnPXQoZSk7bC09ZihnLCd4JyksbS09ZihnLCd5Jyksci53aWR0aC09bCxyLmhlaWdodC09bX1yZXR1cm4gYyhyKX1mdW5jdGlvbiB1KGUsbyl7dmFyIGk9aWUoKSxyPSdIVE1MJz09PW8ubm9kZU5hbWUscD1nKGUpLHM9ZyhvKSxkPW4oZSksYT10KG8pLGY9cGFyc2VGbG9hdChhLmJvcmRlclRvcFdpZHRoLDEwKSxtPXBhcnNlRmxvYXQoYS5ib3JkZXJMZWZ0V2lkdGgsMTApLGg9Yyh7dG9wOnAudG9wLXMudG9wLWYsbGVmdDpwLmxlZnQtcy5sZWZ0LW0sd2lkdGg6cC53aWR0aCxoZWlnaHQ6cC5oZWlnaHR9KTtpZihoLm1hcmdpblRvcD0wLGgubWFyZ2luTGVmdD0wLCFpJiZyKXt2YXIgdT1wYXJzZUZsb2F0KGEubWFyZ2luVG9wLDEwKSxiPXBhcnNlRmxvYXQoYS5tYXJnaW5MZWZ0LDEwKTtoLnRvcC09Zi11LGguYm90dG9tLT1mLXUsaC5sZWZ0LT1tLWIsaC5yaWdodC09bS1iLGgubWFyZ2luVG9wPXUsaC5tYXJnaW5MZWZ0PWJ9cmV0dXJuKGk/by5jb250YWlucyhkKTpvPT09ZCYmJ0JPRFknIT09ZC5ub2RlTmFtZSkmJihoPWwoaCxvKSksaH1mdW5jdGlvbiBiKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbz11KGUsdCksaT1KKHQuY2xpZW50V2lkdGgsd2luZG93LmlubmVyV2lkdGh8fDApLG49Sih0LmNsaWVudEhlaWdodCx3aW5kb3cuaW5uZXJIZWlnaHR8fDApLHI9YSh0KSxwPWEodCwnbGVmdCcpLHM9e3RvcDpyLW8udG9wK28ubWFyZ2luVG9wLGxlZnQ6cC1vLmxlZnQrby5tYXJnaW5MZWZ0LHdpZHRoOmksaGVpZ2h0Om59O3JldHVybiBjKHMpfWZ1bmN0aW9uIHcoZSl7dmFyIGk9ZS5ub2RlTmFtZTtyZXR1cm4nQk9EWSc9PT1pfHwnSFRNTCc9PT1pPyExOidmaXhlZCc9PT10KGUsJ3Bvc2l0aW9uJyl8fHcobyhlKSl9ZnVuY3Rpb24geShlLHQsaSxyKXt2YXIgcD17dG9wOjAsbGVmdDowfSxzPWQoZSx0KTtpZigndmlld3BvcnQnPT09cilwPWIocyk7ZWxzZXt2YXIgYTsnc2Nyb2xsUGFyZW50Jz09PXI/KGE9bihvKHQpKSwnQk9EWSc9PT1hLm5vZGVOYW1lJiYoYT1lLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk6J3dpbmRvdyc9PT1yP2E9ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDphPXI7dmFyIGw9dShhLHMpO2lmKCdIVE1MJz09PWEubm9kZU5hbWUmJiF3KHMpKXt2YXIgZj1oKCksbT1mLmhlaWdodCxjPWYud2lkdGg7cC50b3ArPWwudG9wLWwubWFyZ2luVG9wLHAuYm90dG9tPW0rbC50b3AscC5sZWZ0Kz1sLmxlZnQtbC5tYXJnaW5MZWZ0LHAucmlnaHQ9YytsLmxlZnR9ZWxzZSBwPWx9cmV0dXJuIHAubGVmdCs9aSxwLnRvcCs9aSxwLnJpZ2h0LT1pLHAuYm90dG9tLT1pLHB9ZnVuY3Rpb24gRShlKXt2YXIgdD1lLndpZHRoLG89ZS5oZWlnaHQ7cmV0dXJuIHQqb31mdW5jdGlvbiB2KGUsdCxvLGksbil7dmFyIHI9NTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOjA7aWYoLTE9PT1lLmluZGV4T2YoJ2F1dG8nKSlyZXR1cm4gZTt2YXIgcD15KG8saSxyLG4pLHM9e3RvcDp7d2lkdGg6cC53aWR0aCxoZWlnaHQ6dC50b3AtcC50b3B9LHJpZ2h0Ont3aWR0aDpwLnJpZ2h0LXQucmlnaHQsaGVpZ2h0OnAuaGVpZ2h0fSxib3R0b206e3dpZHRoOnAud2lkdGgsaGVpZ2h0OnAuYm90dG9tLXQuYm90dG9tfSxsZWZ0Ont3aWR0aDp0LmxlZnQtcC5sZWZ0LGhlaWdodDpwLmhlaWdodH19LGQ9T2JqZWN0LmtleXMocykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBzZSh7a2V5OmV9LHNbZV0se2FyZWE6RShzW2VdKX0pfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiB0LmFyZWEtZS5hcmVhfSksYT1kLmZpbHRlcihmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLGk9ZS5oZWlnaHQ7cmV0dXJuIHQ+PW8uY2xpZW50V2lkdGgmJmk+PW8uY2xpZW50SGVpZ2h0fSksbD0wPGEubGVuZ3RoP2FbMF0ua2V5OmRbMF0ua2V5LGY9ZS5zcGxpdCgnLScpWzFdO3JldHVybiBsKyhmPyctJytmOicnKX1mdW5jdGlvbiBPKGUsdCxvKXt2YXIgaT1kKHQsbyk7cmV0dXJuIHUobyxpKX1mdW5jdGlvbiBMKGUpe3ZhciB0PWdldENvbXB1dGVkU3R5bGUoZSksbz1wYXJzZUZsb2F0KHQubWFyZ2luVG9wKStwYXJzZUZsb2F0KHQubWFyZ2luQm90dG9tKSxpPXBhcnNlRmxvYXQodC5tYXJnaW5MZWZ0KStwYXJzZUZsb2F0KHQubWFyZ2luUmlnaHQpLG49e3dpZHRoOmUub2Zmc2V0V2lkdGgraSxoZWlnaHQ6ZS5vZmZzZXRIZWlnaHQrb307cmV0dXJuIG59ZnVuY3Rpb24geChlKXt2YXIgdD17bGVmdDoncmlnaHQnLHJpZ2h0OidsZWZ0Jyxib3R0b206J3RvcCcsdG9wOidib3R0b20nfTtyZXR1cm4gZS5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZyxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pfWZ1bmN0aW9uIFMoZSx0LG8pe289by5zcGxpdCgnLScpWzBdO3ZhciBpPUwoZSksbj17d2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9LHI9LTEhPT1bJ3JpZ2h0JywnbGVmdCddLmluZGV4T2YobykscD1yPyd0b3AnOidsZWZ0JyxzPXI/J2xlZnQnOid0b3AnLGQ9cj8naGVpZ2h0Jzond2lkdGgnLGE9cj8nd2lkdGgnOidoZWlnaHQnO3JldHVybiBuW3BdPXRbcF0rdFtkXS8yLWlbZF0vMixuW3NdPW89PT1zP3Rbc10taVthXTp0W3gocyldLG59ZnVuY3Rpb24gVChlLHQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmluZD9lLmZpbmQodCk6ZS5maWx0ZXIodClbMF19ZnVuY3Rpb24gRChlLHQsbyl7aWYoQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleClyZXR1cm4gZS5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIGVbdF09PT1vfSk7dmFyIGk9VChlLGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdPT09b30pO3JldHVybiBlLmluZGV4T2YoaSl9ZnVuY3Rpb24gQyh0LG8saSl7dmFyIG49dm9pZCAwPT09aT90OnQuc2xpY2UoMCxEKHQsJ25hbWUnLGkpKTtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RbJ2Z1bmN0aW9uJ10mJmNvbnNvbGUud2FybignYG1vZGlmaWVyLmZ1bmN0aW9uYCBpcyBkZXByZWNhdGVkLCB1c2UgYG1vZGlmaWVyLmZuYCEnKTt2YXIgaT10WydmdW5jdGlvbiddfHx0LmZuO3QuZW5hYmxlZCYmZShpKSYmKG8ub2Zmc2V0cy5wb3BwZXI9YyhvLm9mZnNldHMucG9wcGVyKSxvLm9mZnNldHMucmVmZXJlbmNlPWMoby5vZmZzZXRzLnJlZmVyZW5jZSksbz1pKG8sdCkpfSksb31mdW5jdGlvbiBOKCl7aWYoIXRoaXMuc3RhdGUuaXNEZXN0cm95ZWQpe3ZhciBlPXtpbnN0YW5jZTp0aGlzLHN0eWxlczp7fSxhcnJvd1N0eWxlczp7fSxhdHRyaWJ1dGVzOnt9LGZsaXBwZWQ6ITEsb2Zmc2V0czp7fX07ZS5vZmZzZXRzLnJlZmVyZW5jZT1PKHRoaXMuc3RhdGUsdGhpcy5wb3BwZXIsdGhpcy5yZWZlcmVuY2UpLGUucGxhY2VtZW50PXYodGhpcy5vcHRpb25zLnBsYWNlbWVudCxlLm9mZnNldHMucmVmZXJlbmNlLHRoaXMucG9wcGVyLHRoaXMucmVmZXJlbmNlLHRoaXMub3B0aW9ucy5tb2RpZmllcnMuZmxpcC5ib3VuZGFyaWVzRWxlbWVudCx0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAucGFkZGluZyksZS5vcmlnaW5hbFBsYWNlbWVudD1lLnBsYWNlbWVudCxlLm9mZnNldHMucG9wcGVyPVModGhpcy5wb3BwZXIsZS5vZmZzZXRzLnJlZmVyZW5jZSxlLnBsYWNlbWVudCksZS5vZmZzZXRzLnBvcHBlci5wb3NpdGlvbj0nYWJzb2x1dGUnLGU9Qyh0aGlzLm1vZGlmaWVycyxlKSx0aGlzLnN0YXRlLmlzQ3JlYXRlZD90aGlzLm9wdGlvbnMub25VcGRhdGUoZSk6KHRoaXMuc3RhdGUuaXNDcmVhdGVkPSEwLHRoaXMub3B0aW9ucy5vbkNyZWF0ZShlKSl9fWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUpe3ZhciBvPWUubmFtZSxpPWUuZW5hYmxlZDtyZXR1cm4gaSYmbz09PXR9KX1mdW5jdGlvbiBXKGUpe2Zvcih2YXIgdD1bITEsJ21zJywnV2Via2l0JywnTW96JywnTyddLG89ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49MDtuPHQubGVuZ3RoLTE7bisrKXt2YXIgaT10W25dLHI9aT8nJytpK286ZTtpZigndW5kZWZpbmVkJyE9dHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbcl0pcmV0dXJuIHJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gUCgpe3JldHVybiB0aGlzLnN0YXRlLmlzRGVzdHJveWVkPSEwLGsodGhpcy5tb2RpZmllcnMsJ2FwcGx5U3R5bGUnKSYmKHRoaXMucG9wcGVyLnJlbW92ZUF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnKSx0aGlzLnBvcHBlci5zdHlsZS5sZWZ0PScnLHRoaXMucG9wcGVyLnN0eWxlLnBvc2l0aW9uPScnLHRoaXMucG9wcGVyLnN0eWxlLnRvcD0nJyx0aGlzLnBvcHBlci5zdHlsZVtXKCd0cmFuc2Zvcm0nKV09JycpLHRoaXMuZGlzYWJsZUV2ZW50TGlzdGVuZXJzKCksdGhpcy5vcHRpb25zLnJlbW92ZU9uRGVzdHJveSYmdGhpcy5wb3BwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlciksdGhpc31mdW5jdGlvbiBCKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudDtyZXR1cm4gdD90LmRlZmF1bHRWaWV3OndpbmRvd31mdW5jdGlvbiBIKGUsdCxvLGkpe3ZhciByPSdCT0RZJz09PWUubm9kZU5hbWUscD1yP2Uub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzplO3AuYWRkRXZlbnRMaXN0ZW5lcih0LG8se3Bhc3NpdmU6ITB9KSxyfHxIKG4ocC5wYXJlbnROb2RlKSx0LG8saSksaS5wdXNoKHApfWZ1bmN0aW9uIEEoZSx0LG8saSl7by51cGRhdGVCb3VuZD1pLEIoZSkuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxvLnVwZGF0ZUJvdW5kLHtwYXNzaXZlOiEwfSk7dmFyIHI9bihlKTtyZXR1cm4gSChyLCdzY3JvbGwnLG8udXBkYXRlQm91bmQsby5zY3JvbGxQYXJlbnRzKSxvLnNjcm9sbEVsZW1lbnQ9cixvLmV2ZW50c0VuYWJsZWQ9ITAsb31mdW5jdGlvbiBJKCl7dGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkfHwodGhpcy5zdGF0ZT1BKHRoaXMucmVmZXJlbmNlLHRoaXMub3B0aW9ucyx0aGlzLnN0YXRlLHRoaXMuc2NoZWR1bGVVcGRhdGUpKX1mdW5jdGlvbiBNKGUsdCl7cmV0dXJuIEIoZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJyx0LnVwZGF0ZUJvdW5kKSx0LnNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdC51cGRhdGVCb3VuZCl9KSx0LnVwZGF0ZUJvdW5kPW51bGwsdC5zY3JvbGxQYXJlbnRzPVtdLHQuc2Nyb2xsRWxlbWVudD1udWxsLHQuZXZlbnRzRW5hYmxlZD0hMSx0fWZ1bmN0aW9uIFIoKXt0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjaGVkdWxlVXBkYXRlKSx0aGlzLnN0YXRlPU0odGhpcy5yZWZlcmVuY2UsdGhpcy5zdGF0ZSkpfWZ1bmN0aW9uIFUoZSl7cmV0dXJuJychPT1lJiYhaXNOYU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfWZ1bmN0aW9uIFkoZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPScnOy0xIT09Wyd3aWR0aCcsJ2hlaWdodCcsJ3RvcCcsJ3JpZ2h0JywnYm90dG9tJywnbGVmdCddLmluZGV4T2YobykmJlUodFtvXSkmJihpPSdweCcpLGUuc3R5bGVbb109dFtvXStpfSl9ZnVuY3Rpb24gaihlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9dFtvXTshMT09PWk/ZS5yZW1vdmVBdHRyaWJ1dGUobyk6ZS5zZXRBdHRyaWJ1dGUobyx0W29dKX0pfWZ1bmN0aW9uIEYoZSx0LG8pe3ZhciBpPVQoZSxmdW5jdGlvbihlKXt2YXIgbz1lLm5hbWU7cmV0dXJuIG89PT10fSksbj0hIWkmJmUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lPT09byYmZS5lbmFibGVkJiZlLm9yZGVyPGkub3JkZXJ9KTtpZighbil7dmFyIHI9J2AnK3QrJ2AnO2NvbnNvbGUud2FybignYCcrbysnYCcrJyBtb2RpZmllciBpcyByZXF1aXJlZCBieSAnK3IrJyBtb2RpZmllciBpbiBvcmRlciB0byB3b3JrLCBiZSBzdXJlIHRvIGluY2x1ZGUgaXQgYmVmb3JlICcrcisnIScpfXJldHVybiBufWZ1bmN0aW9uIEsoZSl7cmV0dXJuJ2VuZCc9PT1lPydzdGFydCc6J3N0YXJ0Jz09PWU/J2VuZCc6ZX1mdW5jdGlvbiBxKGUpe3ZhciB0PTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sbz1hZS5pbmRleE9mKGUpLGk9YWUuc2xpY2UobysxKS5jb25jYXQoYWUuc2xpY2UoMCxvKSk7cmV0dXJuIHQ/aS5yZXZlcnNlKCk6aX1mdW5jdGlvbiBWKGUsdCxvLGkpe3ZhciBuPWUubWF0Y2goLygoPzpcXC18XFwrKT9cXGQqXFwuP1xcZCopKC4qKS8pLHI9K25bMV0scD1uWzJdO2lmKCFyKXJldHVybiBlO2lmKDA9PT1wLmluZGV4T2YoJyUnKSl7dmFyIHM7c3dpdGNoKHApe2Nhc2UnJXAnOnM9bzticmVhaztjYXNlJyUnOmNhc2UnJXInOmRlZmF1bHQ6cz1pO312YXIgZD1jKHMpO3JldHVybiBkW3RdLzEwMCpyfWlmKCd2aCc9PT1wfHwndncnPT09cCl7dmFyIGE7cmV0dXJuIGE9J3ZoJz09PXA/Sihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodHx8MCk6Sihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsd2luZG93LmlubmVyV2lkdGh8fDApLGEvMTAwKnJ9cmV0dXJuIHJ9ZnVuY3Rpb24geihlLHQsbyxpKXt2YXIgbj1bMCwwXSxyPS0xIT09WydyaWdodCcsJ2xlZnQnXS5pbmRleE9mKGkpLHA9ZS5zcGxpdCgvKFxcK3xcXC0pLykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pLHM9cC5pbmRleE9mKFQocCxmdW5jdGlvbihlKXtyZXR1cm4tMSE9PWUuc2VhcmNoKC8sfFxccy8pfSkpO3Bbc10mJi0xPT09cFtzXS5pbmRleE9mKCcsJykmJmNvbnNvbGUud2FybignT2Zmc2V0cyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UocykgYXJlIGRlcHJlY2F0ZWQsIHVzZSBhIGNvbW1hICgsKSBpbnN0ZWFkLicpO3ZhciBkPS9cXHMqLFxccyp8XFxzKy8sYT0tMT09PXM/W3BdOltwLnNsaWNlKDAscykuY29uY2F0KFtwW3NdLnNwbGl0KGQpWzBdXSksW3Bbc10uc3BsaXQoZClbMV1dLmNvbmNhdChwLnNsaWNlKHMrMSkpXTtyZXR1cm4gYT1hLm1hcChmdW5jdGlvbihlLGkpe3ZhciBuPSgxPT09aT8hcjpyKT8naGVpZ2h0Jzond2lkdGgnLHA9ITE7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuJyc9PT1lW2UubGVuZ3RoLTFdJiYtMSE9PVsnKycsJy0nXS5pbmRleE9mKHQpPyhlW2UubGVuZ3RoLTFdPXQscD0hMCxlKTpwPyhlW2UubGVuZ3RoLTFdKz10LHA9ITEsZSk6ZS5jb25jYXQodCl9LFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFYoZSxuLHQsbyl9KX0pLGEuZm9yRWFjaChmdW5jdGlvbihlLHQpe2UuZm9yRWFjaChmdW5jdGlvbihvLGkpe1UobykmJihuW3RdKz1vKignLSc9PT1lW2ktMV0/LTE6MSkpfSl9KSxufWZ1bmN0aW9uIEcoZSx0KXt2YXIgbyxpPXQub2Zmc2V0LG49ZS5wbGFjZW1lbnQscj1lLm9mZnNldHMscD1yLnBvcHBlcixzPXIucmVmZXJlbmNlLGQ9bi5zcGxpdCgnLScpWzBdO3JldHVybiBvPVUoK2kpP1sraSwwXTp6KGkscCxzLGQpLCdsZWZ0Jz09PWQ/KHAudG9wKz1vWzBdLHAubGVmdC09b1sxXSk6J3JpZ2h0Jz09PWQ/KHAudG9wKz1vWzBdLHAubGVmdCs9b1sxXSk6J3RvcCc9PT1kPyhwLmxlZnQrPW9bMF0scC50b3AtPW9bMV0pOidib3R0b20nPT09ZCYmKHAubGVmdCs9b1swXSxwLnRvcCs9b1sxXSksZS5wb3BwZXI9cCxlfWZvcih2YXIgXz1NYXRoLm1pbixYPU1hdGguZmxvb3IsSj1NYXRoLm1heCxRPSd1bmRlZmluZWQnIT10eXBlb2Ygd2luZG93JiYndW5kZWZpbmVkJyE9dHlwZW9mIGRvY3VtZW50LFo9WydFZGdlJywnVHJpZGVudCcsJ0ZpcmVmb3gnXSwkPTAsZWU9MDtlZTxaLmxlbmd0aDtlZSs9MSlpZihRJiYwPD1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoWltlZV0pKXskPTE7YnJlYWt9dmFyIGksdGU9USYmd2luZG93LlByb21pc2Usb2U9dGU/ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsd2luZG93LlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXt0PSExLGUoKX0pKX19OmZ1bmN0aW9uKGUpe3ZhciB0PSExO3JldHVybiBmdW5jdGlvbigpe3R8fCh0PSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0PSExLGUoKX0sJCkpfX0saWU9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT1pJiYoaT0tMSE9PW5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ01TSUUgMTAnKSksaX0sbmU9ZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKX0scmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBvLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0sby5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsJ3ZhbHVlJ2luIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxvLmtleSxvKX1yZXR1cm4gZnVuY3Rpb24odCxvLGkpe3JldHVybiBvJiZlKHQucHJvdG90eXBlLG8pLGkmJmUodCxpKSx0fX0oKSxwZT1mdW5jdGlvbihlLHQsbyl7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpvLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1vLGV9LHNlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbb10sdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmKGVbaV09dFtpXSk7cmV0dXJuIGV9LGRlPVsnYXV0by1zdGFydCcsJ2F1dG8nLCdhdXRvLWVuZCcsJ3RvcC1zdGFydCcsJ3RvcCcsJ3RvcC1lbmQnLCdyaWdodC1zdGFydCcsJ3JpZ2h0JywncmlnaHQtZW5kJywnYm90dG9tLWVuZCcsJ2JvdHRvbScsJ2JvdHRvbS1zdGFydCcsJ2xlZnQtZW5kJywnbGVmdCcsJ2xlZnQtc3RhcnQnXSxhZT1kZS5zbGljZSgzKSxsZT17RkxJUDonZmxpcCcsQ0xPQ0tXSVNFOidjbG9ja3dpc2UnLENPVU5URVJDTE9DS1dJU0U6J2NvdW50ZXJjbG9ja3dpc2UnfSxmZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobyxpKXt2YXIgbj10aGlzLHI9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O25lKHRoaXMsdCksdGhpcy5zY2hlZHVsZVVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobi51cGRhdGUpfSx0aGlzLnVwZGF0ZT1vZSh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKSx0aGlzLm9wdGlvbnM9c2Uoe30sdC5EZWZhdWx0cyxyKSx0aGlzLnN0YXRlPXtpc0Rlc3Ryb3llZDohMSxpc0NyZWF0ZWQ6ITEsc2Nyb2xsUGFyZW50czpbXX0sdGhpcy5yZWZlcmVuY2U9byYmby5qcXVlcnk/b1swXTpvLHRoaXMucG9wcGVyPWkmJmkuanF1ZXJ5P2lbMF06aSx0aGlzLm9wdGlvbnMubW9kaWZpZXJzPXt9LE9iamVjdC5rZXlzKHNlKHt9LHQuRGVmYXVsdHMubW9kaWZpZXJzLHIubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbihlKXtuLm9wdGlvbnMubW9kaWZpZXJzW2VdPXNlKHt9LHQuRGVmYXVsdHMubW9kaWZpZXJzW2VdfHx7fSxyLm1vZGlmaWVycz9yLm1vZGlmaWVyc1tlXTp7fSl9KSx0aGlzLm1vZGlmaWVycz1PYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMubW9kaWZpZXJzKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHNlKHtuYW1lOmV9LG4ub3B0aW9ucy5tb2RpZmllcnNbZV0pfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLm9yZGVyLXQub3JkZXJ9KSx0aGlzLm1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZW5hYmxlZCYmZSh0Lm9uTG9hZCkmJnQub25Mb2FkKG4ucmVmZXJlbmNlLG4ucG9wcGVyLG4ub3B0aW9ucyx0LG4uc3RhdGUpfSksdGhpcy51cGRhdGUoKTt2YXIgcD10aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtwJiZ0aGlzLmVuYWJsZUV2ZW50TGlzdGVuZXJzKCksdGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkPXB9cmV0dXJuIHJlKHQsW3trZXk6J3VwZGF0ZScsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gTi5jYWxsKHRoaXMpfX0se2tleTonZGVzdHJveScsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gUC5jYWxsKHRoaXMpfX0se2tleTonZW5hYmxlRXZlbnRMaXN0ZW5lcnMnLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEkuY2FsbCh0aGlzKX19LHtrZXk6J2Rpc2FibGVFdmVudExpc3RlbmVycycsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gUi5jYWxsKHRoaXMpfX1dKSx0fSgpO3JldHVybiBmZS5VdGlscz0oJ3VuZGVmaW5lZCc9PXR5cGVvZiB3aW5kb3c/Z2xvYmFsOndpbmRvdykuUG9wcGVyVXRpbHMsZmUucGxhY2VtZW50cz1kZSxmZS5EZWZhdWx0cz17cGxhY2VtZW50Oidib3R0b20nLGV2ZW50c0VuYWJsZWQ6ITAscmVtb3ZlT25EZXN0cm95OiExLG9uQ3JlYXRlOmZ1bmN0aW9uKCl7fSxvblVwZGF0ZTpmdW5jdGlvbigpe30sbW9kaWZpZXJzOntzaGlmdDp7b3JkZXI6MTAwLGVuYWJsZWQ6ITAsZm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wbGFjZW1lbnQsbz10LnNwbGl0KCctJylbMF0saT10LnNwbGl0KCctJylbMV07aWYoaSl7dmFyIG49ZS5vZmZzZXRzLHI9bi5yZWZlcmVuY2UscD1uLnBvcHBlcixzPS0xIT09Wydib3R0b20nLCd0b3AnXS5pbmRleE9mKG8pLGQ9cz8nbGVmdCc6J3RvcCcsYT1zPyd3aWR0aCc6J2hlaWdodCcsbD17c3RhcnQ6cGUoe30sZCxyW2RdKSxlbmQ6cGUoe30sZCxyW2RdK3JbYV0tcFthXSl9O2Uub2Zmc2V0cy5wb3BwZXI9c2Uoe30scCxsW2ldKX1yZXR1cm4gZX19LG9mZnNldDp7b3JkZXI6MjAwLGVuYWJsZWQ6ITAsZm46RyxvZmZzZXQ6MH0scHJldmVudE92ZXJmbG93OntvcmRlcjozMDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlLHQpe3ZhciBvPXQuYm91bmRhcmllc0VsZW1lbnR8fHIoZS5pbnN0YW5jZS5wb3BwZXIpO2UuaW5zdGFuY2UucmVmZXJlbmNlPT09byYmKG89cihvKSk7dmFyIGk9eShlLmluc3RhbmNlLnBvcHBlcixlLmluc3RhbmNlLnJlZmVyZW5jZSx0LnBhZGRpbmcsbyk7dC5ib3VuZGFyaWVzPWk7dmFyIG49dC5wcmlvcml0eSxwPWUub2Zmc2V0cy5wb3BwZXIscz17cHJpbWFyeTpmdW5jdGlvbihlKXt2YXIgbz1wW2VdO3JldHVybiBwW2VdPGlbZV0mJiF0LmVzY2FwZVdpdGhSZWZlcmVuY2UmJihvPUoocFtlXSxpW2VdKSkscGUoe30sZSxvKX0sc2Vjb25kYXJ5OmZ1bmN0aW9uKGUpe3ZhciBvPSdyaWdodCc9PT1lPydsZWZ0JzondG9wJyxuPXBbb107cmV0dXJuIHBbZV0+aVtlXSYmIXQuZXNjYXBlV2l0aFJlZmVyZW5jZSYmKG49XyhwW29dLGlbZV0tKCdyaWdodCc9PT1lP3Aud2lkdGg6cC5oZWlnaHQpKSkscGUoe30sbyxuKX19O3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9LTE9PT1bJ2xlZnQnLCd0b3AnXS5pbmRleE9mKGUpPydzZWNvbmRhcnknOidwcmltYXJ5JztwPXNlKHt9LHAsc1t0XShlKSl9KSxlLm9mZnNldHMucG9wcGVyPXAsZX0scHJpb3JpdHk6WydsZWZ0JywncmlnaHQnLCd0b3AnLCdib3R0b20nXSxwYWRkaW5nOjUsYm91bmRhcmllc0VsZW1lbnQ6J3Njcm9sbFBhcmVudCd9LGtlZXBUb2dldGhlcjp7b3JkZXI6NDAwLGVuYWJsZWQ6ITAsZm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vZmZzZXRzLG89dC5wb3BwZXIsaT10LnJlZmVyZW5jZSxuPWUucGxhY2VtZW50LnNwbGl0KCctJylbMF0scj1YLHA9LTEhPT1bJ3RvcCcsJ2JvdHRvbSddLmluZGV4T2Yobikscz1wPydyaWdodCc6J2JvdHRvbScsZD1wPydsZWZ0JzondG9wJyxhPXA/J3dpZHRoJzonaGVpZ2h0JztyZXR1cm4gb1tzXTxyKGlbZF0pJiYoZS5vZmZzZXRzLnBvcHBlcltkXT1yKGlbZF0pLW9bYV0pLG9bZF0+cihpW3NdKSYmKGUub2Zmc2V0cy5wb3BwZXJbZF09cihpW3NdKSksZX19LGFycm93OntvcmRlcjo1MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlLG8pe3ZhciBpO2lmKCFGKGUuaW5zdGFuY2UubW9kaWZpZXJzLCdhcnJvdycsJ2tlZXBUb2dldGhlcicpKXJldHVybiBlO3ZhciBuPW8uZWxlbWVudDtpZignc3RyaW5nJz09dHlwZW9mIG4pe2lmKG49ZS5pbnN0YW5jZS5wb3BwZXIucXVlcnlTZWxlY3RvcihuKSwhbilyZXR1cm4gZTt9ZWxzZSBpZighZS5pbnN0YW5jZS5wb3BwZXIuY29udGFpbnMobikpcmV0dXJuIGNvbnNvbGUud2FybignV0FSTklORzogYGFycm93LmVsZW1lbnRgIG11c3QgYmUgY2hpbGQgb2YgaXRzIHBvcHBlciBlbGVtZW50IScpLGU7dmFyIHI9ZS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXSxwPWUub2Zmc2V0cyxzPXAucG9wcGVyLGQ9cC5yZWZlcmVuY2UsYT0tMSE9PVsnbGVmdCcsJ3JpZ2h0J10uaW5kZXhPZihyKSxsPWE/J2hlaWdodCc6J3dpZHRoJyxmPWE/J1RvcCc6J0xlZnQnLG09Zi50b0xvd2VyQ2FzZSgpLGg9YT8nbGVmdCc6J3RvcCcsZz1hPydib3R0b20nOidyaWdodCcsdT1MKG4pW2xdO2RbZ10tdTxzW21dJiYoZS5vZmZzZXRzLnBvcHBlclttXS09c1ttXS0oZFtnXS11KSksZFttXSt1PnNbZ10mJihlLm9mZnNldHMucG9wcGVyW21dKz1kW21dK3Utc1tnXSksZS5vZmZzZXRzLnBvcHBlcj1jKGUub2Zmc2V0cy5wb3BwZXIpO3ZhciBiPWRbbV0rZFtsXS8yLXUvMix3PXQoZS5pbnN0YW5jZS5wb3BwZXIpLHk9cGFyc2VGbG9hdCh3WydtYXJnaW4nK2ZdLDEwKSxFPXBhcnNlRmxvYXQod1snYm9yZGVyJytmKydXaWR0aCddLDEwKSx2PWItZS5vZmZzZXRzLnBvcHBlclttXS15LUU7cmV0dXJuIHY9SihfKHNbbF0tdSx2KSwwKSxlLmFycm93RWxlbWVudD1uLGUub2Zmc2V0cy5hcnJvdz0oaT17fSxwZShpLG0sTWF0aC5yb3VuZCh2KSkscGUoaSxoLCcnKSxpKSxlfSxlbGVtZW50OidbeC1hcnJvd10nfSxmbGlwOntvcmRlcjo2MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlLHQpe2lmKGsoZS5pbnN0YW5jZS5tb2RpZmllcnMsJ2lubmVyJykpcmV0dXJuIGU7aWYoZS5mbGlwcGVkJiZlLnBsYWNlbWVudD09PWUub3JpZ2luYWxQbGFjZW1lbnQpcmV0dXJuIGU7dmFyIG89eShlLmluc3RhbmNlLnBvcHBlcixlLmluc3RhbmNlLnJlZmVyZW5jZSx0LnBhZGRpbmcsdC5ib3VuZGFyaWVzRWxlbWVudCksaT1lLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdLG49eChpKSxyPWUucGxhY2VtZW50LnNwbGl0KCctJylbMV18fCcnLHA9W107c3dpdGNoKHQuYmVoYXZpb3Ipe2Nhc2UgbGUuRkxJUDpwPVtpLG5dO2JyZWFrO2Nhc2UgbGUuQ0xPQ0tXSVNFOnA9cShpKTticmVhaztjYXNlIGxlLkNPVU5URVJDTE9DS1dJU0U6cD1xKGksITApO2JyZWFrO2RlZmF1bHQ6cD10LmJlaGF2aW9yO31yZXR1cm4gcC5mb3JFYWNoKGZ1bmN0aW9uKHMsZCl7aWYoaSE9PXN8fHAubGVuZ3RoPT09ZCsxKXJldHVybiBlO2k9ZS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXSxuPXgoaSk7dmFyIGE9ZS5vZmZzZXRzLnBvcHBlcixsPWUub2Zmc2V0cy5yZWZlcmVuY2UsZj1YLG09J2xlZnQnPT09aSYmZihhLnJpZ2h0KT5mKGwubGVmdCl8fCdyaWdodCc9PT1pJiZmKGEubGVmdCk8ZihsLnJpZ2h0KXx8J3RvcCc9PT1pJiZmKGEuYm90dG9tKT5mKGwudG9wKXx8J2JvdHRvbSc9PT1pJiZmKGEudG9wKTxmKGwuYm90dG9tKSxoPWYoYS5sZWZ0KTxmKG8ubGVmdCksYz1mKGEucmlnaHQpPmYoby5yaWdodCksZz1mKGEudG9wKTxmKG8udG9wKSx1PWYoYS5ib3R0b20pPmYoby5ib3R0b20pLGI9J2xlZnQnPT09aSYmaHx8J3JpZ2h0Jz09PWkmJmN8fCd0b3AnPT09aSYmZ3x8J2JvdHRvbSc9PT1pJiZ1LHc9LTEhPT1bJ3RvcCcsJ2JvdHRvbSddLmluZGV4T2YoaSkseT0hIXQuZmxpcFZhcmlhdGlvbnMmJih3JiYnc3RhcnQnPT09ciYmaHx8dyYmJ2VuZCc9PT1yJiZjfHwhdyYmJ3N0YXJ0Jz09PXImJmd8fCF3JiYnZW5kJz09PXImJnUpOyhtfHxifHx5KSYmKGUuZmxpcHBlZD0hMCwobXx8YikmJihpPXBbZCsxXSkseSYmKHI9SyhyKSksZS5wbGFjZW1lbnQ9aSsocj8nLScrcjonJyksZS5vZmZzZXRzLnBvcHBlcj1zZSh7fSxlLm9mZnNldHMucG9wcGVyLFMoZS5pbnN0YW5jZS5wb3BwZXIsZS5vZmZzZXRzLnJlZmVyZW5jZSxlLnBsYWNlbWVudCkpLGU9QyhlLmluc3RhbmNlLm1vZGlmaWVycyxlLCdmbGlwJykpfSksZX0sYmVoYXZpb3I6J2ZsaXAnLHBhZGRpbmc6NSxib3VuZGFyaWVzRWxlbWVudDondmlld3BvcnQnfSxpbm5lcjp7b3JkZXI6NzAwLGVuYWJsZWQ6ITEsZm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wbGFjZW1lbnQsbz10LnNwbGl0KCctJylbMF0saT1lLm9mZnNldHMsbj1pLnBvcHBlcixyPWkucmVmZXJlbmNlLHA9LTEhPT1bJ2xlZnQnLCdyaWdodCddLmluZGV4T2Yobykscz0tMT09PVsndG9wJywnbGVmdCddLmluZGV4T2Yobyk7cmV0dXJuIG5bcD8nbGVmdCc6J3RvcCddPXJbb10tKHM/bltwPyd3aWR0aCc6J2hlaWdodCddOjApLGUucGxhY2VtZW50PXgodCksZS5vZmZzZXRzLnBvcHBlcj1jKG4pLGV9fSxoaWRlOntvcmRlcjo4MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXtpZighRihlLmluc3RhbmNlLm1vZGlmaWVycywnaGlkZScsJ3ByZXZlbnRPdmVyZmxvdycpKXJldHVybiBlO3ZhciB0PWUub2Zmc2V0cy5yZWZlcmVuY2Usbz1UKGUuaW5zdGFuY2UubW9kaWZpZXJzLGZ1bmN0aW9uKGUpe3JldHVybidwcmV2ZW50T3ZlcmZsb3cnPT09ZS5uYW1lfSkuYm91bmRhcmllcztpZih0LmJvdHRvbTxvLnRvcHx8dC5sZWZ0Pm8ucmlnaHR8fHQudG9wPm8uYm90dG9tfHx0LnJpZ2h0PG8ubGVmdCl7aWYoITA9PT1lLmhpZGUpcmV0dXJuIGU7ZS5oaWRlPSEwLGUuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddPScnfWVsc2V7aWYoITE9PT1lLmhpZGUpcmV0dXJuIGU7ZS5oaWRlPSExLGUuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddPSExfXJldHVybiBlfX0sY29tcHV0ZVN0eWxlOntvcmRlcjo4NTAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlLHQpe3ZhciBvPXQueCxpPXQueSxuPWUub2Zmc2V0cy5wb3BwZXIscD1UKGUuaW5zdGFuY2UubW9kaWZpZXJzLGZ1bmN0aW9uKGUpe3JldHVybidhcHBseVN0eWxlJz09PWUubmFtZX0pLmdwdUFjY2VsZXJhdGlvbjt2b2lkIDAhPT1wJiZjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBncHVBY2NlbGVyYXRpb25gIG9wdGlvbiBtb3ZlZCB0byBgY29tcHV0ZVN0eWxlYCBtb2RpZmllciBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQb3BwZXIuanMhJyk7dmFyIHMsZCxhPXZvaWQgMD09PXA/dC5ncHVBY2NlbGVyYXRpb246cCxsPXIoZS5pbnN0YW5jZS5wb3BwZXIpLGY9ZyhsKSxtPXtwb3NpdGlvbjpuLnBvc2l0aW9ufSxoPXtsZWZ0Olgobi5sZWZ0KSx0b3A6WChuLnRvcCksYm90dG9tOlgobi5ib3R0b20pLHJpZ2h0Olgobi5yaWdodCl9LGM9J2JvdHRvbSc9PT1vPyd0b3AnOidib3R0b20nLHU9J3JpZ2h0Jz09PWk/J2xlZnQnOidyaWdodCcsYj1XKCd0cmFuc2Zvcm0nKTtpZihkPSdib3R0b20nPT1jPy1mLmhlaWdodCtoLmJvdHRvbTpoLnRvcCxzPSdyaWdodCc9PXU/LWYud2lkdGgraC5yaWdodDpoLmxlZnQsYSYmYiltW2JdPSd0cmFuc2xhdGUzZCgnK3MrJ3B4LCAnK2QrJ3B4LCAwKScsbVtjXT0wLG1bdV09MCxtLndpbGxDaGFuZ2U9J3RyYW5zZm9ybSc7ZWxzZXt2YXIgdz0nYm90dG9tJz09Yz8tMToxLHk9J3JpZ2h0Jz09dT8tMToxO21bY109ZCp3LG1bdV09cyp5LG0ud2lsbENoYW5nZT1jKycsICcrdX12YXIgRT17XCJ4LXBsYWNlbWVudFwiOmUucGxhY2VtZW50fTtyZXR1cm4gZS5hdHRyaWJ1dGVzPXNlKHt9LEUsZS5hdHRyaWJ1dGVzKSxlLnN0eWxlcz1zZSh7fSxtLGUuc3R5bGVzKSxlLmFycm93U3R5bGVzPXNlKHt9LGUub2Zmc2V0cy5hcnJvdyxlLmFycm93U3R5bGVzKSxlfSxncHVBY2NlbGVyYXRpb246ITAseDonYm90dG9tJyx5OidyaWdodCd9LGFwcGx5U3R5bGU6e29yZGVyOjkwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUpe3JldHVybiBZKGUuaW5zdGFuY2UucG9wcGVyLGUuc3R5bGVzKSxqKGUuaW5zdGFuY2UucG9wcGVyLGUuYXR0cmlidXRlcyksZS5hcnJvd0VsZW1lbnQmJk9iamVjdC5rZXlzKGUuYXJyb3dTdHlsZXMpLmxlbmd0aCYmWShlLmFycm93RWxlbWVudCxlLmFycm93U3R5bGVzKSxlfSxvbkxvYWQ6ZnVuY3Rpb24oZSx0LG8saSxuKXt2YXIgcj1PKG4sdCxlKSxwPXYoby5wbGFjZW1lbnQscix0LGUsby5tb2RpZmllcnMuZmxpcC5ib3VuZGFyaWVzRWxlbWVudCxvLm1vZGlmaWVycy5mbGlwLnBhZGRpbmcpO3JldHVybiB0LnNldEF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnLHApLFkodCx7cG9zaXRpb246J2Fic29sdXRlJ30pLG99LGdwdUFjY2VsZXJhdGlvbjp2b2lkIDB9fX0sZmV9KTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLm1pbi5qcy5tYXBcclxuIiwiLyohIFNjcm9sbE1hZ2ljIHYyLjAuNSB8IChjKSAyMDE1IEphbiBQYWVwa2UgKEBqYW5wYWVwa2UpIHwgbGljZW5zZSAmIGluZm86IGh0dHA6Ly9zY3JvbGxtYWdpYy5pbyAqL1xyXG4hZnVuY3Rpb24oZSx0KXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQoKTplLlNjcm9sbE1hZ2ljPXQoKX0odGhpcyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBlPWZ1bmN0aW9uKCl7fTtlLnZlcnNpb249XCIyLjAuNVwiLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V3aGVlbFwiLGZ1bmN0aW9uKCl7fSk7dmFyIHQ9XCJkYXRhLXNjcm9sbG1hZ2ljLXBpbi1zcGFjZXJcIjtlLkNvbnRyb2xsZXI9ZnVuY3Rpb24ocil7dmFyIG8scyxhPVwiU2Nyb2xsTWFnaWMuQ29udHJvbGxlclwiLGw9XCJGT1JXQVJEXCIsYz1cIlJFVkVSU0VcIix1PVwiUEFVU0VEXCIsZj1uLmRlZmF1bHRzLGQ9dGhpcyxoPWkuZXh0ZW5kKHt9LGYsciksZz1bXSxwPSExLHY9MCxtPXUsdz0hMCx5PTAsUz0hMCxiPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIGgpZi5oYXNPd25Qcm9wZXJ0eShlKXx8ZGVsZXRlIGhbZV07aWYoaC5jb250YWluZXI9aS5nZXQuZWxlbWVudHMoaC5jb250YWluZXIpWzBdLCFoLmNvbnRhaW5lcil0aHJvdyBhK1wiIGluaXQgZmFpbGVkLlwiO3c9aC5jb250YWluZXI9PT13aW5kb3d8fGguY29udGFpbmVyPT09ZG9jdW1lbnQuYm9keXx8IWRvY3VtZW50LmJvZHkuY29udGFpbnMoaC5jb250YWluZXIpLHcmJihoLmNvbnRhaW5lcj13aW5kb3cpLHk9eigpLGguY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixUKSxoLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsVCksaC5yZWZyZXNoSW50ZXJ2YWw9cGFyc2VJbnQoaC5yZWZyZXNoSW50ZXJ2YWwpfHxmLnJlZnJlc2hJbnRlcnZhbCxFKCl9LEU9ZnVuY3Rpb24oKXtoLnJlZnJlc2hJbnRlcnZhbD4wJiYocz13aW5kb3cuc2V0VGltZW91dChBLGgucmVmcmVzaEludGVydmFsKSl9LHg9ZnVuY3Rpb24oKXtyZXR1cm4gaC52ZXJ0aWNhbD9pLmdldC5zY3JvbGxUb3AoaC5jb250YWluZXIpOmkuZ2V0LnNjcm9sbExlZnQoaC5jb250YWluZXIpfSx6PWZ1bmN0aW9uKCl7cmV0dXJuIGgudmVydGljYWw/aS5nZXQuaGVpZ2h0KGguY29udGFpbmVyKTppLmdldC53aWR0aChoLmNvbnRhaW5lcil9LEM9dGhpcy5fc2V0U2Nyb2xsUG9zPWZ1bmN0aW9uKGUpe2gudmVydGljYWw/dz93aW5kb3cuc2Nyb2xsVG8oaS5nZXQuc2Nyb2xsTGVmdCgpLGUpOmguY29udGFpbmVyLnNjcm9sbFRvcD1lOnc/d2luZG93LnNjcm9sbFRvKGUsaS5nZXQuc2Nyb2xsVG9wKCkpOmguY29udGFpbmVyLnNjcm9sbExlZnQ9ZX0sRj1mdW5jdGlvbigpe2lmKFMmJnApe3ZhciBlPWkudHlwZS5BcnJheShwKT9wOmcuc2xpY2UoMCk7cD0hMTt2YXIgdD12O3Y9ZC5zY3JvbGxQb3MoKTt2YXIgbj12LXQ7MCE9PW4mJihtPW4+MD9sOmMpLG09PT1jJiZlLnJldmVyc2UoKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS51cGRhdGUoITApfSl9fSxMPWZ1bmN0aW9uKCl7bz1pLnJBRihGKX0sVD1mdW5jdGlvbihlKXtcInJlc2l6ZVwiPT1lLnR5cGUmJih5PXooKSxtPXUpLHAhPT0hMCYmKHA9ITAsTCgpKX0sQT1mdW5jdGlvbigpe2lmKCF3JiZ5IT16KCkpe3ZhciBlO3RyeXtlPW5ldyBFdmVudChcInJlc2l6ZVwiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX1jYXRjaCh0KXtlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIiksZS5pbml0RXZlbnQoXCJyZXNpemVcIiwhMSwhMSl9aC5jb250YWluZXIuZGlzcGF0Y2hFdmVudChlKX1nLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yZWZyZXNoKCl9KSxFKCl9O3RoaXMuX29wdGlvbnM9aDt2YXIgTz1mdW5jdGlvbihlKXtpZihlLmxlbmd0aDw9MSlyZXR1cm4gZTt2YXIgdD1lLnNsaWNlKDApO3JldHVybiB0LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zY3JvbGxPZmZzZXQoKT50LnNjcm9sbE9mZnNldCgpPzE6LTF9KSx0fTtyZXR1cm4gdGhpcy5hZGRTY2VuZT1mdW5jdGlvbih0KXtpZihpLnR5cGUuQXJyYXkodCkpdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2QuYWRkU2NlbmUoZSl9KTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBlLlNjZW5lKWlmKHQuY29udHJvbGxlcigpIT09ZCl0LmFkZFRvKGQpO2Vsc2UgaWYoZy5pbmRleE9mKHQpPDApe2cucHVzaCh0KSxnPU8oZyksdC5vbihcInNoaWZ0LmNvbnRyb2xsZXJfc29ydFwiLGZ1bmN0aW9uKCl7Zz1PKGcpfSk7Zm9yKHZhciBuIGluIGguZ2xvYmFsU2NlbmVPcHRpb25zKXRbbl0mJnRbbl0uY2FsbCh0LGguZ2xvYmFsU2NlbmVPcHRpb25zW25dKX1yZXR1cm4gZH0sdGhpcy5yZW1vdmVTY2VuZT1mdW5jdGlvbihlKXtpZihpLnR5cGUuQXJyYXkoZSkpZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2QucmVtb3ZlU2NlbmUoZSl9KTtlbHNle3ZhciB0PWcuaW5kZXhPZihlKTt0Pi0xJiYoZS5vZmYoXCJzaGlmdC5jb250cm9sbGVyX3NvcnRcIiksZy5zcGxpY2UodCwxKSxlLnJlbW92ZSgpKX1yZXR1cm4gZH0sdGhpcy51cGRhdGVTY2VuZT1mdW5jdGlvbih0LG4pe3JldHVybiBpLnR5cGUuQXJyYXkodCk/dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2QudXBkYXRlU2NlbmUoZSxuKX0pOm4/dC51cGRhdGUoITApOnAhPT0hMCYmdCBpbnN0YW5jZW9mIGUuU2NlbmUmJihwPXB8fFtdLC0xPT1wLmluZGV4T2YodCkmJnAucHVzaCh0KSxwPU8ocCksTCgpKSxkfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gVCh7dHlwZTpcInJlc2l6ZVwifSksZSYmRigpLGR9LHRoaXMuc2Nyb2xsVG89ZnVuY3Rpb24obixyKXtpZihpLnR5cGUuTnVtYmVyKG4pKUMuY2FsbChoLmNvbnRhaW5lcixuLHIpO2Vsc2UgaWYobiBpbnN0YW5jZW9mIGUuU2NlbmUpbi5jb250cm9sbGVyKCk9PT1kJiZkLnNjcm9sbFRvKG4uc2Nyb2xsT2Zmc2V0KCkscik7ZWxzZSBpZihpLnR5cGUuRnVuY3Rpb24obikpQz1uO2Vsc2V7dmFyIG89aS5nZXQuZWxlbWVudHMobilbMF07aWYobyl7Zm9yKDtvLnBhcmVudE5vZGUuaGFzQXR0cmlidXRlKHQpOylvPW8ucGFyZW50Tm9kZTt2YXIgcz1oLnZlcnRpY2FsP1widG9wXCI6XCJsZWZ0XCIsYT1pLmdldC5vZmZzZXQoaC5jb250YWluZXIpLGw9aS5nZXQub2Zmc2V0KG8pO3d8fChhW3NdLT1kLnNjcm9sbFBvcygpKSxkLnNjcm9sbFRvKGxbc10tYVtzXSxyKX19cmV0dXJuIGR9LHRoaXMuc2Nyb2xsUG9zPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnR5cGUuRnVuY3Rpb24oZSkmJih4PWUpLGQpOnguY2FsbChkKX0sdGhpcy5pbmZvPWZ1bmN0aW9uKGUpe3ZhciB0PXtzaXplOnksdmVydGljYWw6aC52ZXJ0aWNhbCxzY3JvbGxQb3M6dixzY3JvbGxEaXJlY3Rpb246bSxjb250YWluZXI6aC5jb250YWluZXIsaXNEb2N1bWVudDp3fTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD92b2lkIDAhPT10W2VdP3RbZV06dm9pZCAwOnR9LHRoaXMubG9nbGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy5lbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTIT1lJiYoUz0hIWUsZC51cGRhdGVTY2VuZShnLCEwKSksZCk6U30sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKGUpe3dpbmRvdy5jbGVhclRpbWVvdXQocyk7Zm9yKHZhciB0PWcubGVuZ3RoO3QtLTspZ1t0XS5kZXN0cm95KGUpO3JldHVybiBoLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsVCksaC5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLFQpLGkuY0FGKG8pLG51bGx9LGIoKSxkfTt2YXIgbj17ZGVmYXVsdHM6e2NvbnRhaW5lcjp3aW5kb3csdmVydGljYWw6ITAsZ2xvYmFsU2NlbmVPcHRpb25zOnt9LGxvZ2xldmVsOjIscmVmcmVzaEludGVydmFsOjEwMH19O2UuQ29udHJvbGxlci5hZGRPcHRpb249ZnVuY3Rpb24oZSx0KXtuLmRlZmF1bHRzW2VdPXR9LGUuQ29udHJvbGxlci5leHRlbmQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztlLkNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy4kc3VwZXI9aS5leHRlbmQoe30sdGhpcyksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9LGkuZXh0ZW5kKGUuQ29udHJvbGxlcixuKSxlLkNvbnRyb2xsZXIucHJvdG90eXBlPW4ucHJvdG90eXBlLGUuQ29udHJvbGxlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZS5Db250cm9sbGVyfSxlLlNjZW5lPWZ1bmN0aW9uKG4pe3ZhciBvLHMsYT1cIkJFRk9SRVwiLGw9XCJEVVJJTkdcIixjPVwiQUZURVJcIix1PXIuZGVmYXVsdHMsZj10aGlzLGQ9aS5leHRlbmQoe30sdSxuKSxoPWEsZz0wLHA9e3N0YXJ0OjAsZW5kOjB9LHY9MCxtPSEwLHc9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gZCl1Lmhhc093blByb3BlcnR5KGUpfHxkZWxldGUgZFtlXTtmb3IodmFyIHQgaW4gdSlMKHQpO0MoKX0seT17fTt0aGlzLm9uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkudHlwZS5GdW5jdGlvbih0KSYmKGU9ZS50cmltKCkuc3BsaXQoXCIgXCIpLGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnNwbGl0KFwiLlwiKSxyPW5bMF0saT1uWzFdO1wiKlwiIT1yJiYoeVtyXXx8KHlbcl09W10pLHlbcl0ucHVzaCh7bmFtZXNwYWNlOml8fFwiXCIsY2FsbGJhY2s6dH0pKX0pKSxmfSx0aGlzLm9mZj1mdW5jdGlvbihlLHQpe3JldHVybiBlPyhlPWUudHJpbSgpLnNwbGl0KFwiIFwiKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG49ZS5zcGxpdChcIi5cIikscj1uWzBdLGk9blsxXXx8XCJcIixvPVwiKlwiPT09cj9PYmplY3Qua2V5cyh5KTpbcl07by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj15W2VdfHxbXSxyPW4ubGVuZ3RoO3ItLTspe3ZhciBvPW5bcl07IW98fGkhPT1vLm5hbWVzcGFjZSYmXCIqXCIhPT1pfHx0JiZ0IT1vLmNhbGxiYWNrfHxuLnNwbGljZShyLDEpfW4ubGVuZ3RofHxkZWxldGUgeVtlXX0pfSksZik6Zn0sdGhpcy50cmlnZ2VyPWZ1bmN0aW9uKHQsbil7aWYodCl7dmFyIHI9dC50cmltKCkuc3BsaXQoXCIuXCIpLGk9clswXSxvPXJbMV0scz15W2ldO3MmJnMuZm9yRWFjaChmdW5jdGlvbih0KXtvJiZvIT09dC5uYW1lc3BhY2V8fHQuY2FsbGJhY2suY2FsbChmLG5ldyBlLkV2ZW50KGksdC5uYW1lc3BhY2UsZixuKSl9KX1yZXR1cm4gZn0sZi5vbihcImNoYW5nZS5pbnRlcm5hbFwiLGZ1bmN0aW9uKGUpe1wibG9nbGV2ZWxcIiE9PWUud2hhdCYmXCJ0d2VlbkNoYW5nZXNcIiE9PWUud2hhdCYmKFwidHJpZ2dlckVsZW1lbnRcIj09PWUud2hhdD9FKCk6XCJyZXZlcnNlXCI9PT1lLndoYXQmJmYudXBkYXRlKCkpfSkub24oXCJzaGlmdC5pbnRlcm5hbFwiLGZ1bmN0aW9uKCl7UygpLGYudXBkYXRlKCl9KSx0aGlzLmFkZFRvPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZS5Db250cm9sbGVyJiZzIT10JiYocyYmcy5yZW1vdmVTY2VuZShmKSxzPXQsQygpLGIoITApLEUoITApLFMoKSxzLmluZm8oXCJjb250YWluZXJcIikuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHgpLHQuYWRkU2NlbmUoZiksZi50cmlnZ2VyKFwiYWRkXCIse2NvbnRyb2xsZXI6c30pLGYudXBkYXRlKCkpLGZ9LHRoaXMuZW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obSE9ZSYmKG09ISFlLGYudXBkYXRlKCEwKSksZik6bX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oKXtpZihzKXtzLmluZm8oXCJjb250YWluZXJcIikucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHgpO3ZhciBlPXM7cz12b2lkIDAsZS5yZW1vdmVTY2VuZShmKSxmLnRyaWdnZXIoXCJyZW1vdmVcIil9cmV0dXJuIGZ9LHRoaXMuZGVzdHJveT1mdW5jdGlvbihlKXtyZXR1cm4gZi50cmlnZ2VyKFwiZGVzdHJveVwiLHtyZXNldDplfSksZi5yZW1vdmUoKSxmLm9mZihcIiouKlwiKSxudWxsfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXtpZihzKWlmKGUpaWYocy5lbmFibGVkKCkmJm0pe3ZhciB0LG49cy5pbmZvKFwic2Nyb2xsUG9zXCIpO3Q9ZC5kdXJhdGlvbj4wPyhuLXAuc3RhcnQpLyhwLmVuZC1wLnN0YXJ0KTpuPj1wLnN0YXJ0PzE6MCxmLnRyaWdnZXIoXCJ1cGRhdGVcIix7c3RhcnRQb3M6cC5zdGFydCxlbmRQb3M6cC5lbmQsc2Nyb2xsUG9zOm59KSxmLnByb2dyZXNzKHQpfWVsc2UgVCYmaD09PWwmJk8oITApO2Vsc2Ugcy51cGRhdGVTY2VuZShmLCExKTtyZXR1cm4gZn0sdGhpcy5yZWZyZXNoPWZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxFKCksZn0sdGhpcy5wcm9ncmVzcz1mdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgdD0hMSxuPWgscj1zP3MuaW5mbyhcInNjcm9sbERpcmVjdGlvblwiKTpcIlBBVVNFRFwiLGk9ZC5yZXZlcnNlfHxlPj1nO2lmKDA9PT1kLmR1cmF0aW9uPyh0PWchPWUsZz0xPmUmJmk/MDoxLGg9MD09PWc/YTpsKTowPmUmJmghPT1hJiZpPyhnPTAsaD1hLHQ9ITApOmU+PTAmJjE+ZSYmaT8oZz1lLGg9bCx0PSEwKTplPj0xJiZoIT09Yz8oZz0xLGg9Yyx0PSEwKTpoIT09bHx8aXx8TygpLHQpe3ZhciBvPXtwcm9ncmVzczpnLHN0YXRlOmgsc2Nyb2xsRGlyZWN0aW9uOnJ9LHU9aCE9bixwPWZ1bmN0aW9uKGUpe2YudHJpZ2dlcihlLG8pfTt1JiZuIT09bCYmKHAoXCJlbnRlclwiKSxwKG49PT1hP1wic3RhcnRcIjpcImVuZFwiKSkscChcInByb2dyZXNzXCIpLHUmJmghPT1sJiYocChoPT09YT9cInN0YXJ0XCI6XCJlbmRcIikscChcImxlYXZlXCIpKX1yZXR1cm4gZn1yZXR1cm4gZ307dmFyIFM9ZnVuY3Rpb24oKXtwPXtzdGFydDp2K2Qub2Zmc2V0fSxzJiZkLnRyaWdnZXJFbGVtZW50JiYocC5zdGFydC09cy5pbmZvKFwic2l6ZVwiKSpkLnRyaWdnZXJIb29rKSxwLmVuZD1wLnN0YXJ0K2QuZHVyYXRpb259LGI9ZnVuY3Rpb24oZSl7aWYobyl7dmFyIHQ9XCJkdXJhdGlvblwiO0YodCxvLmNhbGwoZikpJiYhZSYmKGYudHJpZ2dlcihcImNoYW5nZVwiLHt3aGF0OnQsbmV3dmFsOmRbdF19KSxmLnRyaWdnZXIoXCJzaGlmdFwiLHtyZWFzb246dH0pKX19LEU9ZnVuY3Rpb24oZSl7dmFyIG49MCxyPWQudHJpZ2dlckVsZW1lbnQ7aWYocyYmcil7Zm9yKHZhciBvPXMuaW5mbygpLGE9aS5nZXQub2Zmc2V0KG8uY29udGFpbmVyKSxsPW8udmVydGljYWw/XCJ0b3BcIjpcImxlZnRcIjtyLnBhcmVudE5vZGUuaGFzQXR0cmlidXRlKHQpOylyPXIucGFyZW50Tm9kZTt2YXIgYz1pLmdldC5vZmZzZXQocik7by5pc0RvY3VtZW50fHwoYVtsXS09cy5zY3JvbGxQb3MoKSksbj1jW2xdLWFbbF19dmFyIHU9biE9djt2PW4sdSYmIWUmJmYudHJpZ2dlcihcInNoaWZ0XCIse3JlYXNvbjpcInRyaWdnZXJFbGVtZW50UG9zaXRpb25cIn0pfSx4PWZ1bmN0aW9uKCl7ZC50cmlnZ2VySG9vaz4wJiZmLnRyaWdnZXIoXCJzaGlmdFwiLHtyZWFzb246XCJjb250YWluZXJSZXNpemVcIn0pfSx6PWkuZXh0ZW5kKHIudmFsaWRhdGUse2R1cmF0aW9uOmZ1bmN0aW9uKGUpe2lmKGkudHlwZS5TdHJpbmcoZSkmJmUubWF0Y2goL14oXFwufFxcZCkqXFxkKyUkLykpe3ZhciB0PXBhcnNlRmxvYXQoZSkvMTAwO2U9ZnVuY3Rpb24oKXtyZXR1cm4gcz9zLmluZm8oXCJzaXplXCIpKnQ6MH19aWYoaS50eXBlLkZ1bmN0aW9uKGUpKXtvPWU7dHJ5e2U9cGFyc2VGbG9hdChvKCkpfWNhdGNoKG4pe2U9LTF9fWlmKGU9cGFyc2VGbG9hdChlKSwhaS50eXBlLk51bWJlcihlKXx8MD5lKXRocm93IG8/KG89dm9pZCAwLDApOjA7cmV0dXJuIGV9fSksQz1mdW5jdGlvbihlKXtlPWFyZ3VtZW50cy5sZW5ndGg/W2VdOk9iamVjdC5rZXlzKHopLGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdDtpZih6W2VdKXRyeXt0PXpbZV0oZFtlXSl9Y2F0Y2gobil7dD11W2VdfWZpbmFsbHl7ZFtlXT10fX0pfSxGPWZ1bmN0aW9uKGUsdCl7dmFyIG49ITEscj1kW2VdO3JldHVybiBkW2VdIT10JiYoZFtlXT10LEMoZSksbj1yIT1kW2VdKSxufSxMPWZ1bmN0aW9uKGUpe2ZbZV18fChmW2VdPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhcImR1cmF0aW9uXCI9PT1lJiYobz12b2lkIDApLEYoZSx0KSYmKGYudHJpZ2dlcihcImNoYW5nZVwiLHt3aGF0OmUsbmV3dmFsOmRbZV19KSxyLnNoaWZ0cy5pbmRleE9mKGUpPi0xJiZmLnRyaWdnZXIoXCJzaGlmdFwiLHtyZWFzb246ZX0pKSxmKTpkW2VdfSl9O3RoaXMuY29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiBzfSx0aGlzLnN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGh9LHRoaXMuc2Nyb2xsT2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHAuc3RhcnR9LHRoaXMudHJpZ2dlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9ZC5vZmZzZXQ7cmV0dXJuIHMmJihlKz1kLnRyaWdnZXJFbGVtZW50P3Y6cy5pbmZvKFwic2l6ZVwiKSpmLnRyaWdnZXJIb29rKCkpLGV9O3ZhciBULEE7Zi5vbihcInNoaWZ0LmludGVybmFsXCIsZnVuY3Rpb24oZSl7dmFyIHQ9XCJkdXJhdGlvblwiPT09ZS5yZWFzb247KGg9PT1jJiZ0fHxoPT09bCYmMD09PWQuZHVyYXRpb24pJiZPKCksdCYmXygpfSkub24oXCJwcm9ncmVzcy5pbnRlcm5hbFwiLGZ1bmN0aW9uKCl7TygpfSkub24oXCJhZGQuaW50ZXJuYWxcIixmdW5jdGlvbigpe18oKX0pLm9uKFwiZGVzdHJveS5pbnRlcm5hbFwiLGZ1bmN0aW9uKGUpe2YucmVtb3ZlUGluKGUucmVzZXQpfSk7dmFyIE89ZnVuY3Rpb24oZSl7aWYoVCYmcyl7dmFyIHQ9cy5pbmZvKCksbj1BLnNwYWNlci5maXJzdENoaWxkO2lmKGV8fGghPT1sKXt2YXIgcj17cG9zaXRpb246QS5pbkZsb3c/XCJyZWxhdGl2ZVwiOlwiYWJzb2x1dGVcIix0b3A6MCxsZWZ0OjB9LG89aS5jc3MobixcInBvc2l0aW9uXCIpIT1yLnBvc2l0aW9uO0EucHVzaEZvbGxvd2Vycz9kLmR1cmF0aW9uPjAmJihoPT09YyYmMD09PXBhcnNlRmxvYXQoaS5jc3MoQS5zcGFjZXIsXCJwYWRkaW5nLXRvcFwiKSk/bz0hMDpoPT09YSYmMD09PXBhcnNlRmxvYXQoaS5jc3MoQS5zcGFjZXIsXCJwYWRkaW5nLWJvdHRvbVwiKSkmJihvPSEwKSk6clt0LnZlcnRpY2FsP1widG9wXCI6XCJsZWZ0XCJdPWQuZHVyYXRpb24qZyxpLmNzcyhuLHIpLG8mJl8oKX1lbHNle1wiZml4ZWRcIiE9aS5jc3MobixcInBvc2l0aW9uXCIpJiYoaS5jc3Mobix7cG9zaXRpb246XCJmaXhlZFwifSksXygpKTt2YXIgdT1pLmdldC5vZmZzZXQoQS5zcGFjZXIsITApLGY9ZC5yZXZlcnNlfHwwPT09ZC5kdXJhdGlvbj90LnNjcm9sbFBvcy1wLnN0YXJ0Ok1hdGgucm91bmQoZypkLmR1cmF0aW9uKjEwKS8xMDt1W3QudmVydGljYWw/XCJ0b3BcIjpcImxlZnRcIl0rPWYsaS5jc3MoQS5zcGFjZXIuZmlyc3RDaGlsZCx7dG9wOnUudG9wLGxlZnQ6dS5sZWZ0fSl9fX0sXz1mdW5jdGlvbigpe2lmKFQmJnMmJkEuaW5GbG93KXt2YXIgZT1oPT09bCx0PXMuaW5mbyhcInZlcnRpY2FsXCIpLG49QS5zcGFjZXIuZmlyc3RDaGlsZCxyPWkuaXNNYXJnaW5Db2xsYXBzZVR5cGUoaS5jc3MoQS5zcGFjZXIsXCJkaXNwbGF5XCIpKSxvPXt9O0EucmVsU2l6ZS53aWR0aHx8QS5yZWxTaXplLmF1dG9GdWxsV2lkdGg/ZT9pLmNzcyhULHt3aWR0aDppLmdldC53aWR0aChBLnNwYWNlcil9KTppLmNzcyhULHt3aWR0aDpcIjEwMCVcIn0pOihvW1wibWluLXdpZHRoXCJdPWkuZ2V0LndpZHRoKHQ/VDpuLCEwLCEwKSxvLndpZHRoPWU/b1tcIm1pbi13aWR0aFwiXTpcImF1dG9cIiksQS5yZWxTaXplLmhlaWdodD9lP2kuY3NzKFQse2hlaWdodDppLmdldC5oZWlnaHQoQS5zcGFjZXIpLShBLnB1c2hGb2xsb3dlcnM/ZC5kdXJhdGlvbjowKX0pOmkuY3NzKFQse2hlaWdodDpcIjEwMCVcIn0pOihvW1wibWluLWhlaWdodFwiXT1pLmdldC5oZWlnaHQodD9uOlQsITAsIXIpLG8uaGVpZ2h0PWU/b1tcIm1pbi1oZWlnaHRcIl06XCJhdXRvXCIpLEEucHVzaEZvbGxvd2VycyYmKG9bXCJwYWRkaW5nXCIrKHQ/XCJUb3BcIjpcIkxlZnRcIildPWQuZHVyYXRpb24qZyxvW1wicGFkZGluZ1wiKyh0P1wiQm90dG9tXCI6XCJSaWdodFwiKV09ZC5kdXJhdGlvbiooMS1nKSksaS5jc3MoQS5zcGFjZXIsbyl9fSxOPWZ1bmN0aW9uKCl7cyYmVCYmaD09PWwmJiFzLmluZm8oXCJpc0RvY3VtZW50XCIpJiZPKCl9LFA9ZnVuY3Rpb24oKXtzJiZUJiZoPT09bCYmKChBLnJlbFNpemUud2lkdGh8fEEucmVsU2l6ZS5hdXRvRnVsbFdpZHRoKSYmaS5nZXQud2lkdGgod2luZG93KSE9aS5nZXQud2lkdGgoQS5zcGFjZXIucGFyZW50Tm9kZSl8fEEucmVsU2l6ZS5oZWlnaHQmJmkuZ2V0LmhlaWdodCh3aW5kb3cpIT1pLmdldC5oZWlnaHQoQS5zcGFjZXIucGFyZW50Tm9kZSkpJiZfKCl9LEQ9ZnVuY3Rpb24oZSl7cyYmVCYmaD09PWwmJiFzLmluZm8oXCJpc0RvY3VtZW50XCIpJiYoZS5wcmV2ZW50RGVmYXVsdCgpLHMuX3NldFNjcm9sbFBvcyhzLmluZm8oXCJzY3JvbGxQb3NcIiktKChlLndoZWVsRGVsdGF8fGVbcy5pbmZvKFwidmVydGljYWxcIik/XCJ3aGVlbERlbHRhWVwiOlwid2hlZWxEZWx0YVhcIl0pLzN8fDMwKi1lLmRldGFpbCkpKX07dGhpcy5zZXRQaW49ZnVuY3Rpb24oZSxuKXt2YXIgcj17cHVzaEZvbGxvd2VyczohMCxzcGFjZXJDbGFzczpcInNjcm9sbG1hZ2ljLXBpbi1zcGFjZXJcIn07aWYobj1pLmV4dGVuZCh7fSxyLG4pLGU9aS5nZXQuZWxlbWVudHMoZSlbMF0sIWUpcmV0dXJuIGY7aWYoXCJmaXhlZFwiPT09aS5jc3MoZSxcInBvc2l0aW9uXCIpKXJldHVybiBmO2lmKFQpe2lmKFQ9PT1lKXJldHVybiBmO2YucmVtb3ZlUGluKCl9VD1lO3ZhciBvPVQucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5LHM9W1widG9wXCIsXCJsZWZ0XCIsXCJib3R0b21cIixcInJpZ2h0XCIsXCJtYXJnaW5cIixcIm1hcmdpbkxlZnRcIixcIm1hcmdpblJpZ2h0XCIsXCJtYXJnaW5Ub3BcIixcIm1hcmdpbkJvdHRvbVwiXTtULnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjt2YXIgYT1cImFic29sdXRlXCIhPWkuY3NzKFQsXCJwb3NpdGlvblwiKSxsPWkuY3NzKFQscy5jb25jYXQoW1wiZGlzcGxheVwiXSkpLGM9aS5jc3MoVCxbXCJ3aWR0aFwiLFwiaGVpZ2h0XCJdKTtULnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheT1vLCFhJiZuLnB1c2hGb2xsb3dlcnMmJihuLnB1c2hGb2xsb3dlcnM9ITEpO3ZhciB1PVQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxUKSxkPWkuZXh0ZW5kKGwse3Bvc2l0aW9uOmE/XCJyZWxhdGl2ZVwiOlwiYWJzb2x1dGVcIixib3hTaXppbmc6XCJjb250ZW50LWJveFwiLG1vekJveFNpemluZzpcImNvbnRlbnQtYm94XCIsd2Via2l0Qm94U2l6aW5nOlwiY29udGVudC1ib3hcIn0pO2lmKGF8fGkuZXh0ZW5kKGQsaS5jc3MoVCxbXCJ3aWR0aFwiLFwiaGVpZ2h0XCJdKSksaS5jc3ModSxkKSx1LnNldEF0dHJpYnV0ZSh0LFwiXCIpLGkuYWRkQ2xhc3ModSxuLnNwYWNlckNsYXNzKSxBPXtzcGFjZXI6dSxyZWxTaXplOnt3aWR0aDpcIiVcIj09PWMud2lkdGguc2xpY2UoLTEpLGhlaWdodDpcIiVcIj09PWMuaGVpZ2h0LnNsaWNlKC0xKSxhdXRvRnVsbFdpZHRoOlwiYXV0b1wiPT09Yy53aWR0aCYmYSYmaS5pc01hcmdpbkNvbGxhcHNlVHlwZShsLmRpc3BsYXkpfSxwdXNoRm9sbG93ZXJzOm4ucHVzaEZvbGxvd2VycyxpbkZsb3c6YX0sIVQuX19fb3JpZ1N0eWxlKXtULl9fX29yaWdTdHlsZT17fTt2YXIgaD1ULnN0eWxlLGc9cy5jb25jYXQoW1wid2lkdGhcIixcImhlaWdodFwiLFwicG9zaXRpb25cIixcImJveFNpemluZ1wiLFwibW96Qm94U2l6aW5nXCIsXCJ3ZWJraXRCb3hTaXppbmdcIl0pO2cuZm9yRWFjaChmdW5jdGlvbihlKXtULl9fX29yaWdTdHlsZVtlXT1oW2VdfHxcIlwifSl9cmV0dXJuIEEucmVsU2l6ZS53aWR0aCYmaS5jc3ModSx7d2lkdGg6Yy53aWR0aH0pLEEucmVsU2l6ZS5oZWlnaHQmJmkuY3NzKHUse2hlaWdodDpjLmhlaWdodH0pLHUuYXBwZW5kQ2hpbGQoVCksaS5jc3MoVCx7cG9zaXRpb246YT9cInJlbGF0aXZlXCI6XCJhYnNvbHV0ZVwiLG1hcmdpbjpcImF1dG9cIix0b3A6XCJhdXRvXCIsbGVmdDpcImF1dG9cIixib3R0b206XCJhdXRvXCIscmlnaHQ6XCJhdXRvXCJ9KSwoQS5yZWxTaXplLndpZHRofHxBLnJlbFNpemUuYXV0b0Z1bGxXaWR0aCkmJmkuY3NzKFQse2JveFNpemluZzpcImJvcmRlci1ib3hcIixtb3pCb3hTaXppbmc6XCJib3JkZXItYm94XCIsd2Via2l0Qm94U2l6aW5nOlwiYm9yZGVyLWJveFwifSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIixOKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLE4pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsUCksVC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V3aGVlbFwiLEQpLFQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsRCksTygpLGZ9LHRoaXMucmVtb3ZlUGluPWZ1bmN0aW9uKGUpe2lmKFQpe2lmKGg9PT1sJiZPKCEwKSxlfHwhcyl7dmFyIG49QS5zcGFjZXIuZmlyc3RDaGlsZDtpZihuLmhhc0F0dHJpYnV0ZSh0KSl7dmFyIHI9QS5zcGFjZXIuc3R5bGUsbz1bXCJtYXJnaW5cIixcIm1hcmdpbkxlZnRcIixcIm1hcmdpblJpZ2h0XCIsXCJtYXJnaW5Ub3BcIixcIm1hcmdpbkJvdHRvbVwiXTttYXJnaW5zPXt9LG8uZm9yRWFjaChmdW5jdGlvbihlKXttYXJnaW5zW2VdPXJbZV18fFwiXCJ9KSxpLmNzcyhuLG1hcmdpbnMpfUEuc3BhY2VyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4sQS5zcGFjZXIpLEEuc3BhY2VyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoQS5zcGFjZXIpLFQucGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUodCl8fChpLmNzcyhULFQuX19fb3JpZ1N0eWxlKSxkZWxldGUgVC5fX19vcmlnU3R5bGUpfXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsTiksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixOKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLFApLFQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIixEKSxULnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01Nb3VzZVNjcm9sbFwiLEQpLFQ9dm9pZCAwfXJldHVybiBmfTt2YXIgUixrPVtdO3JldHVybiBmLm9uKFwiZGVzdHJveS5pbnRlcm5hbFwiLGZ1bmN0aW9uKGUpe2YucmVtb3ZlQ2xhc3NUb2dnbGUoZS5yZXNldCl9KSx0aGlzLnNldENsYXNzVG9nZ2xlPWZ1bmN0aW9uKGUsdCl7dmFyIG49aS5nZXQuZWxlbWVudHMoZSk7cmV0dXJuIDAhPT1uLmxlbmd0aCYmaS50eXBlLlN0cmluZyh0KT8oay5sZW5ndGg+MCYmZi5yZW1vdmVDbGFzc1RvZ2dsZSgpLFI9dCxrPW4sZi5vbihcImVudGVyLmludGVybmFsX2NsYXNzIGxlYXZlLmludGVybmFsX2NsYXNzXCIsZnVuY3Rpb24oZSl7dmFyIHQ9XCJlbnRlclwiPT09ZS50eXBlP2kuYWRkQ2xhc3M6aS5yZW1vdmVDbGFzcztrLmZvckVhY2goZnVuY3Rpb24oZSl7dChlLFIpfSl9KSxmKTpmfSx0aGlzLnJlbW92ZUNsYXNzVG9nZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZrLmZvckVhY2goZnVuY3Rpb24oZSl7aS5yZW1vdmVDbGFzcyhlLFIpfSksZi5vZmYoXCJzdGFydC5pbnRlcm5hbF9jbGFzcyBlbmQuaW50ZXJuYWxfY2xhc3NcIiksUj12b2lkIDAsaz1bXSxmfSx3KCksZn07dmFyIHI9e2RlZmF1bHRzOntkdXJhdGlvbjowLG9mZnNldDowLHRyaWdnZXJFbGVtZW50OnZvaWQgMCx0cmlnZ2VySG9vazouNSxyZXZlcnNlOiEwLGxvZ2xldmVsOjJ9LHZhbGlkYXRlOntvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoZT1wYXJzZUZsb2F0KGUpLCFpLnR5cGUuTnVtYmVyKGUpKXRocm93IDA7cmV0dXJuIGV9LHRyaWdnZXJFbGVtZW50OmZ1bmN0aW9uKGUpe2lmKGU9ZXx8dm9pZCAwKXt2YXIgdD1pLmdldC5lbGVtZW50cyhlKVswXTtpZighdCl0aHJvdyAwO2U9dH1yZXR1cm4gZX0sdHJpZ2dlckhvb2s6ZnVuY3Rpb24oZSl7dmFyIHQ9e29uQ2VudGVyOi41LG9uRW50ZXI6MSxvbkxlYXZlOjB9O2lmKGkudHlwZS5OdW1iZXIoZSkpZT1NYXRoLm1heCgwLE1hdGgubWluKHBhcnNlRmxvYXQoZSksMSkpO2Vsc2V7aWYoIShlIGluIHQpKXRocm93IDA7ZT10W2VdfXJldHVybiBlfSxyZXZlcnNlOmZ1bmN0aW9uKGUpe3JldHVybiEhZX19LHNoaWZ0czpbXCJkdXJhdGlvblwiLFwib2Zmc2V0XCIsXCJ0cmlnZ2VySG9va1wiXX07ZS5TY2VuZS5hZGRPcHRpb249ZnVuY3Rpb24oZSx0LG4saSl7ZSBpbiByLmRlZmF1bHRzfHwoci5kZWZhdWx0c1tlXT10LHIudmFsaWRhdGVbZV09bixpJiZyLnNoaWZ0cy5wdXNoKGUpKX0sZS5TY2VuZS5leHRlbmQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztlLlNjZW5lPWZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuJHN1cGVyPWkuZXh0ZW5kKHt9LHRoaXMpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfSxpLmV4dGVuZChlLlNjZW5lLG4pLGUuU2NlbmUucHJvdG90eXBlPW4ucHJvdG90eXBlLGUuU2NlbmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUuU2NlbmV9LGUuRXZlbnQ9ZnVuY3Rpb24oZSx0LG4scil7cj1yfHx7fTtmb3IodmFyIGkgaW4gcil0aGlzW2ldPXJbaV07cmV0dXJuIHRoaXMudHlwZT1lLHRoaXMudGFyZ2V0PXRoaXMuY3VycmVudFRhcmdldD1uLHRoaXMubmFtZXNwYWNlPXR8fFwiXCIsdGhpcy50aW1lU3RhbXA9dGhpcy50aW1lc3RhbXA9RGF0ZS5ub3coKSx0aGlzfTt2YXIgaT1lLl91dGlsPWZ1bmN0aW9uKGUpe3ZhciB0LG49e30scj1mdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VGbG9hdChlKXx8MH0saT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jdXJyZW50U3R5bGU/dC5jdXJyZW50U3R5bGU6ZS5nZXRDb21wdXRlZFN0eWxlKHQpfSxvPWZ1bmN0aW9uKHQsbixvLHMpe2lmKG49bj09PWRvY3VtZW50P2U6bixuPT09ZSlzPSExO2Vsc2UgaWYoIWYuRG9tRWxlbWVudChuKSlyZXR1cm4gMDt0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKTt2YXIgYT0obz9uW1wib2Zmc2V0XCIrdF18fG5bXCJvdXRlclwiK3RdOm5bXCJjbGllbnRcIit0XXx8bltcImlubmVyXCIrdF0pfHwwO2lmKG8mJnMpe3ZhciBsPWkobik7YSs9XCJIZWlnaHRcIj09PXQ/cihsLm1hcmdpblRvcCkrcihsLm1hcmdpbkJvdHRvbSk6cihsLm1hcmdpbkxlZnQpK3IobC5tYXJnaW5SaWdodCl9cmV0dXJuIGF9LHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXlteYS16XSsoW2Etel0pL2csXCIkMVwiKS5yZXBsYWNlKC8tKFthLXpdKS9nLGZ1bmN0aW9uKGUpe3JldHVybiBlWzFdLnRvVXBwZXJDYXNlKCl9KX07bi5leHRlbmQ9ZnVuY3Rpb24oZSl7Zm9yKGU9ZXx8e30sdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspaWYoYXJndW1lbnRzW3RdKWZvcih2YXIgbiBpbiBhcmd1bWVudHNbdF0pYXJndW1lbnRzW3RdLmhhc093blByb3BlcnR5KG4pJiYoZVtuXT1hcmd1bWVudHNbdF1bbl0pO3JldHVybiBlfSxuLmlzTWFyZ2luQ29sbGFwc2VUeXBlPWZ1bmN0aW9uKGUpe3JldHVybltcImJsb2NrXCIsXCJmbGV4XCIsXCJsaXN0LWl0ZW1cIixcInRhYmxlXCIsXCItd2Via2l0LWJveFwiXS5pbmRleE9mKGUpPi0xfTt2YXIgYT0wLGw9W1wibXNcIixcIm1velwiLFwid2Via2l0XCIsXCJvXCJdLGM9ZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsdT1lLmNhbmNlbEFuaW1hdGlvbkZyYW1lO2Zvcih0PTA7IWMmJnQ8bC5sZW5ndGg7Kyt0KWM9ZVtsW3RdK1wiUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdLHU9ZVtsW3RdK1wiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl18fGVbbFt0XStcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiXTtjfHwoYz1mdW5jdGlvbih0KXt2YXIgbj0obmV3IERhdGUpLmdldFRpbWUoKSxyPU1hdGgubWF4KDAsMTYtKG4tYSkpLGk9ZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dChuK3IpfSxyKTtyZXR1cm4gYT1uK3IsaX0pLHV8fCh1PWZ1bmN0aW9uKHQpe2UuY2xlYXJUaW1lb3V0KHQpfSksbi5yQUY9Yy5iaW5kKGUpLG4uY0FGPXUuYmluZChlKTt2YXIgZj1uLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5yZXBsYWNlKC9eXFxbb2JqZWN0ICguKylcXF0kLyxcIiQxXCIpLnRvTG93ZXJDYXNlKCl9O2YuU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVyblwic3RyaW5nXCI9PT1mKGUpfSxmLkZ1bmN0aW9uPWZ1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09PWYoZSl9LGYuQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9LGYuTnVtYmVyPWZ1bmN0aW9uKGUpe3JldHVybiFmLkFycmF5KGUpJiZlLXBhcnNlRmxvYXQoZSkrMT49MH0sZi5Eb21FbGVtZW50PWZ1bmN0aW9uKGUpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiBIVE1MRWxlbWVudD9lIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ6ZSYmXCJvYmplY3RcIj09dHlwZW9mIGUmJm51bGwhPT1lJiYxPT09ZS5ub2RlVHlwZSYmXCJzdHJpbmdcIj09dHlwZW9mIGUubm9kZU5hbWV9O3ZhciBkPW4uZ2V0PXt9O3JldHVybiBkLmVsZW1lbnRzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2lmKGYuU3RyaW5nKHQpKXRyeXt0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9Y2F0Y2gocil7cmV0dXJuIG59aWYoXCJub2RlbGlzdFwiPT09Zih0KXx8Zi5BcnJheSh0KSlmb3IodmFyIGk9MCxvPW4ubGVuZ3RoPXQubGVuZ3RoO28+aTtpKyspe3ZhciBzPXRbaV07bltpXT1mLkRvbUVsZW1lbnQocyk/czpkLmVsZW1lbnRzKHMpfWVsc2UoZi5Eb21FbGVtZW50KHQpfHx0PT09ZG9jdW1lbnR8fHQ9PT1lKSYmKG49W3RdKTtyZXR1cm4gbn0sZC5zY3JvbGxUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwibnVtYmVyXCI9PXR5cGVvZiB0LnNjcm9sbFRvcD90LnNjcm9sbFRvcDplLnBhZ2VZT2Zmc2V0fHwwfSxkLnNjcm9sbExlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwibnVtYmVyXCI9PXR5cGVvZiB0LnNjcm9sbExlZnQ/dC5zY3JvbGxMZWZ0OmUucGFnZVhPZmZzZXR8fDB9LGQud2lkdGg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBvKFwid2lkdGhcIixlLHQsbil9LGQuaGVpZ2h0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbyhcImhlaWdodFwiLGUsdCxuKX0sZC5vZmZzZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj17dG9wOjAsbGVmdDowfTtpZihlJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCl7dmFyIHI9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtuLnRvcD1yLnRvcCxuLmxlZnQ9ci5sZWZ0LHR8fChuLnRvcCs9ZC5zY3JvbGxUb3AoKSxuLmxlZnQrPWQuc2Nyb2xsTGVmdCgpKX1yZXR1cm4gbn0sbi5hZGRDbGFzcz1mdW5jdGlvbihlLHQpe3QmJihlLmNsYXNzTGlzdD9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc05hbWUrPVwiIFwiK3QpfSxuLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKGUsdCl7dCYmKGUuY2xhc3NMaXN0P2UuY2xhc3NMaXN0LnJlbW92ZSh0KTplLmNsYXNzTmFtZT1lLmNsYXNzTmFtZS5yZXBsYWNlKFJlZ0V4cChcIihefFxcXFxiKVwiK3Quc3BsaXQoXCIgXCIpLmpvaW4oXCJ8XCIpK1wiKFxcXFxifCQpXCIsXCJnaVwiKSxcIiBcIikpfSxuLmNzcz1mdW5jdGlvbihlLHQpe2lmKGYuU3RyaW5nKHQpKXJldHVybiBpKGUpW3ModCldO2lmKGYuQXJyYXkodCkpe3ZhciBuPXt9LHI9aShlKTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09cltzKGUpXX0pLG59Zm9yKHZhciBvIGluIHQpe3ZhciBhPXRbb107YT09cGFyc2VGbG9hdChhKSYmKGErPVwicHhcIiksZS5zdHlsZVtzKG8pXT1hfX0sbn0od2luZG93fHx7fSk7cmV0dXJuIGV9KTsiLCIvKiFcclxuICogXHJcbiAqICAgdHlwZWQuanMgLSBBIEphdmFTY3JpcHQgVHlwaW5nIEFuaW1hdGlvbiBMaWJyYXJ5XHJcbiAqICAgQXV0aG9yOiBNYXR0IEJvbGR0IDxtZUBtYXR0Ym9sZHQuY29tPlxyXG4gKiAgIFZlcnNpb246IHYyLjAuNFxyXG4gKiAgIFVybDogaHR0cHM6Ly9naXRodWIuY29tL21hdHRib2xkdC90eXBlZC5qc1xyXG4gKiAgIExpY2Vuc2Uocyk6IE1JVFxyXG4gKiBcclxuICovXHJcbihmdW5jdGlvbih0LGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuVHlwZWQ9ZSgpOnQuVHlwZWQ9ZSgpfSkodGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe2lmKHNbbl0pcmV0dXJuIHNbbl0uZXhwb3J0czt2YXIgaT1zW25dPXtleHBvcnRzOnt9LGlkOm4sbG9hZGVkOiExfTtyZXR1cm4gdFtuXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxlKSxpLmxvYWRlZD0hMCxpLmV4cG9ydHN9dmFyIHM9e307cmV0dXJuIGUubT10LGUuYz1zLGUucD1cIlwiLGUoMCl9KFtmdW5jdGlvbih0LGUscyl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBuPWVbc107bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxzLG4pe3JldHVybiBzJiZ0KGUucHJvdG90eXBlLHMpLG4mJnQoZSxuKSxlfX0oKSxyPXMoMSksbz1zKDMpLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUscyl7bih0aGlzLHQpLHIuaW5pdGlhbGl6ZXIubG9hZCh0aGlzLHMsZSksdGhpcy5iZWdpbigpfXJldHVybiBpKHQsW3trZXk6XCJ0b2dnbGVcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucGF1c2Uuc3RhdHVzP3RoaXMuc3RhcnQoKTp0aGlzLnN0b3AoKX19LHtrZXk6XCJzdG9wXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnR5cGluZ0NvbXBsZXRlfHx0aGlzLnBhdXNlLnN0YXR1c3x8KHRoaXMudG9nZ2xlQmxpbmtpbmcoITApLHRoaXMucGF1c2Uuc3RhdHVzPSEwLHRoaXMub3B0aW9ucy5vblN0b3AodGhpcy5hcnJheVBvcyx0aGlzKSl9fSx7a2V5Olwic3RhcnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudHlwaW5nQ29tcGxldGV8fHRoaXMucGF1c2Uuc3RhdHVzJiYodGhpcy5wYXVzZS5zdGF0dXM9ITEsdGhpcy5wYXVzZS50eXBld3JpdGU/dGhpcy50eXBld3JpdGUodGhpcy5wYXVzZS5jdXJTdHJpbmcsdGhpcy5wYXVzZS5jdXJTdHJQb3MpOnRoaXMuYmFja3NwYWNlKHRoaXMucGF1c2UuY3VyU3RyaW5nLHRoaXMucGF1c2UuY3VyU3RyUG9zKSx0aGlzLm9wdGlvbnMub25TdGFydCh0aGlzLmFycmF5UG9zLHRoaXMpKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCExKSx0aGlzLm9wdGlvbnMub25EZXN0cm95KHRoaXMpfX0se2tleTpcInJlc2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF18fGFyZ3VtZW50c1swXTtjbGVhckludGVydmFsKHRoaXMudGltZW91dCksdGhpcy5yZXBsYWNlVGV4dChcIlwiKSx0aGlzLmN1cnNvciYmdGhpcy5jdXJzb3IucGFyZW50Tm9kZSYmKHRoaXMuY3Vyc29yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jdXJzb3IpLHRoaXMuY3Vyc29yPW51bGwpLHRoaXMuc3RyUG9zPTAsdGhpcy5hcnJheVBvcz0wLHRoaXMuY3VyTG9vcD0wLHQmJih0aGlzLmluc2VydEN1cnNvcigpLHRoaXMub3B0aW9ucy5vblJlc2V0KHRoaXMpLHRoaXMuYmVnaW4oKSl9fSx7a2V5OlwiYmVnaW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy50eXBpbmdDb21wbGV0ZT0hMSx0aGlzLnNodWZmbGVTdHJpbmdzSWZOZWVkZWQodGhpcyksdGhpcy5pbnNlcnRDdXJzb3IoKSx0aGlzLmJpbmRJbnB1dEZvY3VzRXZlbnRzJiZ0aGlzLmJpbmRGb2N1c0V2ZW50cygpLHRoaXMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5jdXJyZW50RWxDb250ZW50JiYwIT09dC5jdXJyZW50RWxDb250ZW50Lmxlbmd0aD90LmJhY2tzcGFjZSh0LmN1cnJlbnRFbENvbnRlbnQsdC5jdXJyZW50RWxDb250ZW50Lmxlbmd0aCk6dC50eXBld3JpdGUodC5zdHJpbmdzW3Quc2VxdWVuY2VbdC5hcnJheVBvc11dLHQuc3RyUG9zKX0sdGhpcy5zdGFydERlbGF5KX19LHtrZXk6XCJ0eXBld3JpdGVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBzPXRoaXM7dGhpcy5mYWRlT3V0JiZ0aGlzLmVsLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLmZhZGVPdXRDbGFzcykmJih0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5mYWRlT3V0Q2xhc3MpLHRoaXMuY3Vyc29yJiZ0aGlzLmN1cnNvci5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZmFkZU91dENsYXNzKSk7dmFyIG49dGhpcy5odW1hbml6ZXIodGhpcy50eXBlU3BlZWQpLGk9MTtyZXR1cm4gdGhpcy5wYXVzZS5zdGF0dXM9PT0hMD92b2lkIHRoaXMuc2V0UGF1c2VTdGF0dXModCxlLCEwKTp2b2lkKHRoaXMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1vLmh0bWxQYXJzZXIudHlwZUh0bWxDaGFycyh0LGUscyk7dmFyIG49MCxyPXQuc3Vic3RyKGUpO2lmKFwiXlwiPT09ci5jaGFyQXQoMCkmJi9eXFxeXFxkKy8udGVzdChyKSl7dmFyIGE9MTtyPS9cXGQrLy5leGVjKHIpWzBdLGErPXIubGVuZ3RoLG49cGFyc2VJbnQocikscy50ZW1wb3JhcnlQYXVzZT0hMCxzLm9wdGlvbnMub25UeXBpbmdQYXVzZWQocy5hcnJheVBvcyxzKSx0PXQuc3Vic3RyaW5nKDAsZSkrdC5zdWJzdHJpbmcoZSthKSxzLnRvZ2dsZUJsaW5raW5nKCEwKX1pZihcImBcIj09PXIuY2hhckF0KDApKXtmb3IoO1wiYFwiIT09dC5zdWJzdHIoZStpKS5jaGFyQXQoMCkmJihpKyssIShlK2k+dC5sZW5ndGgpKTspO3ZhciB1PXQuc3Vic3RyaW5nKDAsZSksbD10LnN1YnN0cmluZyh1Lmxlbmd0aCsxLGUraSksYz10LnN1YnN0cmluZyhlK2krMSk7dD11K2wrYyxpLS19cy50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLnRvZ2dsZUJsaW5raW5nKCExKSxlPT09dC5sZW5ndGg/cy5kb25lVHlwaW5nKHQsZSk6cy5rZWVwVHlwaW5nKHQsZSxpKSxzLnRlbXBvcmFyeVBhdXNlJiYocy50ZW1wb3JhcnlQYXVzZT0hMSxzLm9wdGlvbnMub25UeXBpbmdSZXN1bWVkKHMuYXJyYXlQb3MscykpfSxuKX0sbikpfX0se2tleTpcImtlZXBUeXBpbmdcIix2YWx1ZTpmdW5jdGlvbih0LGUscyl7MD09PWUmJih0aGlzLnRvZ2dsZUJsaW5raW5nKCExKSx0aGlzLm9wdGlvbnMucHJlU3RyaW5nVHlwZWQodGhpcy5hcnJheVBvcyx0aGlzKSksZSs9czt2YXIgbj10LnN1YnN0cigwLGUpO3RoaXMucmVwbGFjZVRleHQobiksdGhpcy50eXBld3JpdGUodCxlKX19LHtrZXk6XCJkb25lVHlwaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgcz10aGlzO3RoaXMub3B0aW9ucy5vblN0cmluZ1R5cGVkKHRoaXMuYXJyYXlQb3MsdGhpcyksdGhpcy50b2dnbGVCbGlua2luZyghMCksdGhpcy5hcnJheVBvcz09PXRoaXMuc3RyaW5ncy5sZW5ndGgtMSYmKHRoaXMuY29tcGxldGUoKSx0aGlzLmxvb3A9PT0hMXx8dGhpcy5jdXJMb29wPT09dGhpcy5sb29wQ291bnQpfHwodGhpcy50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmJhY2tzcGFjZSh0LGUpfSx0aGlzLmJhY2tEZWxheSkpfX0se2tleTpcImJhY2tzcGFjZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIHM9dGhpcztpZih0aGlzLnBhdXNlLnN0YXR1cz09PSEwKXJldHVybiB2b2lkIHRoaXMuc2V0UGF1c2VTdGF0dXModCxlLCEwKTtpZih0aGlzLmZhZGVPdXQpcmV0dXJuIHRoaXMuaW5pdEZhZGVPdXQoKTt0aGlzLnRvZ2dsZUJsaW5raW5nKCExKTt2YXIgbj10aGlzLmh1bWFuaXplcih0aGlzLmJhY2tTcGVlZCk7dGhpcy50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlPW8uaHRtbFBhcnNlci5iYWNrU3BhY2VIdG1sQ2hhcnModCxlLHMpO3ZhciBuPXQuc3Vic3RyKDAsZSk7aWYocy5yZXBsYWNlVGV4dChuKSxzLnNtYXJ0QmFja3NwYWNlKXt2YXIgaT1zLnN0cmluZ3Nbcy5hcnJheVBvcysxXTtpJiZuPT09aS5zdWJzdHIoMCxlKT9zLnN0b3BOdW09ZTpzLnN0b3BOdW09MH1lPnMuc3RvcE51bT8oZS0tLHMuYmFja3NwYWNlKHQsZSkpOmU8PXMuc3RvcE51bSYmKHMuYXJyYXlQb3MrKyxzLmFycmF5UG9zPT09cy5zdHJpbmdzLmxlbmd0aD8ocy5hcnJheVBvcz0wLHMub3B0aW9ucy5vbkxhc3RTdHJpbmdCYWNrc3BhY2VkKCkscy5zaHVmZmxlU3RyaW5nc0lmTmVlZGVkKCkscy5iZWdpbigpKTpzLnR5cGV3cml0ZShzLnN0cmluZ3Nbcy5zZXF1ZW5jZVtzLmFycmF5UG9zXV0sZSkpfSxuKX19LHtrZXk6XCJjb21wbGV0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9uQ29tcGxldGUodGhpcyksdGhpcy5sb29wP3RoaXMuY3VyTG9vcCsrOnRoaXMudHlwaW5nQ29tcGxldGU9ITB9fSx7a2V5Olwic2V0UGF1c2VTdGF0dXNcIix2YWx1ZTpmdW5jdGlvbih0LGUscyl7dGhpcy5wYXVzZS50eXBld3JpdGU9cyx0aGlzLnBhdXNlLmN1clN0cmluZz10LHRoaXMucGF1c2UuY3VyU3RyUG9zPWV9fSx7a2V5OlwidG9nZ2xlQmxpbmtpbmdcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmN1cnNvciYmIXRoaXMucGF1c2Uuc3RhdHVzJiZ0aGlzLmN1cnNvckJsaW5raW5nIT09dCl7dGhpcy5jdXJzb3JCbGlua2luZz10O3ZhciBlPXQ/XCJpbmZpbml0ZVwiOjA7dGhpcy5jdXJzb3Iuc3R5bGUuYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ9ZX19fSx7a2V5OlwiaHVtYW5pemVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSp0LzIpK3R9fSx7a2V5Olwic2h1ZmZsZVN0cmluZ3NJZk5lZWRlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zaHVmZmxlJiYodGhpcy5zZXF1ZW5jZT10aGlzLnNlcXVlbmNlLnNvcnQoZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0uNX0pKX19LHtrZXk6XCJpbml0RmFkZU91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5lbC5jbGFzc05hbWUrPVwiIFwiK3RoaXMuZmFkZU91dENsYXNzLHRoaXMuY3Vyc29yJiYodGhpcy5jdXJzb3IuY2xhc3NOYW1lKz1cIiBcIit0aGlzLmZhZGVPdXRDbGFzcyksc2V0VGltZW91dChmdW5jdGlvbigpe3QuYXJyYXlQb3MrKyx0LnJlcGxhY2VUZXh0KFwiXCIpLHQuc3RyaW5ncy5sZW5ndGg+dC5hcnJheVBvcz90LnR5cGV3cml0ZSh0LnN0cmluZ3NbdC5zZXF1ZW5jZVt0LmFycmF5UG9zXV0sMCk6KHQudHlwZXdyaXRlKHQuc3RyaW5nc1swXSwwKSx0LmFycmF5UG9zPTApfSx0aGlzLmZhZGVPdXREZWxheSl9fSx7a2V5OlwicmVwbGFjZVRleHRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmF0dHI/dGhpcy5lbC5zZXRBdHRyaWJ1dGUodGhpcy5hdHRyLHQpOnRoaXMuaXNJbnB1dD90aGlzLmVsLnZhbHVlPXQ6XCJodG1sXCI9PT10aGlzLmNvbnRlbnRUeXBlP3RoaXMuZWwuaW5uZXJIVE1MPXQ6dGhpcy5lbC50ZXh0Q29udGVudD10fX0se2tleTpcImJpbmRGb2N1c0V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmlzSW5wdXQmJih0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLGZ1bmN0aW9uKGUpe3Quc3RvcCgpfSksdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLGZ1bmN0aW9uKGUpe3QuZWwudmFsdWUmJjAhPT10LmVsLnZhbHVlLmxlbmd0aHx8dC5zdGFydCgpfSkpfX0se2tleTpcImluc2VydEN1cnNvclwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zaG93Q3Vyc29yJiYodGhpcy5jdXJzb3J8fCh0aGlzLmN1cnNvcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSx0aGlzLmN1cnNvci5jbGFzc05hbWU9XCJ0eXBlZC1jdXJzb3JcIix0aGlzLmN1cnNvci5pbm5lckhUTUw9dGhpcy5jdXJzb3JDaGFyLHRoaXMuZWwucGFyZW50Tm9kZSYmdGhpcy5lbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmN1cnNvcix0aGlzLmVsLm5leHRTaWJsaW5nKSkpfX1dKSx0fSgpO2VbXCJkZWZhdWx0XCJdPWEsdC5leHBvcnRzPWVbXCJkZWZhdWx0XCJdfSxmdW5jdGlvbih0LGUscyl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e1wiZGVmYXVsdFwiOnR9fWZ1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciByPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBzPWFyZ3VtZW50c1tlXTtmb3IodmFyIG4gaW4gcylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxuKSYmKHRbbl09c1tuXSl9cmV0dXJuIHR9LG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBuPWVbc107bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxzLG4pe3JldHVybiBzJiZ0KGUucHJvdG90eXBlLHMpLG4mJnQoZSxuKSxlfX0oKSxhPXMoMiksdT1uKGEpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7aSh0aGlzLHQpfXJldHVybiBvKHQsW3trZXk6XCJsb2FkXCIsdmFsdWU6ZnVuY3Rpb24odCxlLHMpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBzP3QuZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzKTp0LmVsPXMsdC5vcHRpb25zPXIoe30sdVtcImRlZmF1bHRcIl0sZSksdC5pc0lucHV0PVwiaW5wdXRcIj09PXQuZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpLHQuYXR0cj10Lm9wdGlvbnMuYXR0cix0LmJpbmRJbnB1dEZvY3VzRXZlbnRzPXQub3B0aW9ucy5iaW5kSW5wdXRGb2N1c0V2ZW50cyx0LnNob3dDdXJzb3I9IXQuaXNJbnB1dCYmdC5vcHRpb25zLnNob3dDdXJzb3IsdC5jdXJzb3JDaGFyPXQub3B0aW9ucy5jdXJzb3JDaGFyLHQuY3Vyc29yQmxpbmtpbmc9ITAsdC5lbENvbnRlbnQ9dC5hdHRyP3QuZWwuZ2V0QXR0cmlidXRlKHQuYXR0cik6dC5lbC50ZXh0Q29udGVudCx0LmNvbnRlbnRUeXBlPXQub3B0aW9ucy5jb250ZW50VHlwZSx0LnR5cGVTcGVlZD10Lm9wdGlvbnMudHlwZVNwZWVkLHQuc3RhcnREZWxheT10Lm9wdGlvbnMuc3RhcnREZWxheSx0LmJhY2tTcGVlZD10Lm9wdGlvbnMuYmFja1NwZWVkLHQuc21hcnRCYWNrc3BhY2U9dC5vcHRpb25zLnNtYXJ0QmFja3NwYWNlLHQuYmFja0RlbGF5PXQub3B0aW9ucy5iYWNrRGVsYXksdC5mYWRlT3V0PXQub3B0aW9ucy5mYWRlT3V0LHQuZmFkZU91dENsYXNzPXQub3B0aW9ucy5mYWRlT3V0Q2xhc3MsdC5mYWRlT3V0RGVsYXk9dC5vcHRpb25zLmZhZGVPdXREZWxheSx0LmlzUGF1c2VkPSExLHQuc3RyaW5ncz10Lm9wdGlvbnMuc3RyaW5ncy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSksXCJzdHJpbmdcIj09dHlwZW9mIHQub3B0aW9ucy5zdHJpbmdzRWxlbWVudD90LnN0cmluZ3NFbGVtZW50PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodC5vcHRpb25zLnN0cmluZ3NFbGVtZW50KTp0LnN0cmluZ3NFbGVtZW50PXQub3B0aW9ucy5zdHJpbmdzRWxlbWVudCx0LnN0cmluZ3NFbGVtZW50KXt0LnN0cmluZ3M9W10sdC5zdHJpbmdzRWxlbWVudC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO3ZhciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSh0LnN0cmluZ3NFbGVtZW50LmNoaWxkcmVuKSxpPSEwLG89ITEsYT12b2lkIDA7dHJ5e2Zvcih2YXIgbCxjPW5bU3ltYm9sLml0ZXJhdG9yXSgpOyEoaT0obD1jLm5leHQoKSkuZG9uZSk7aT0hMCl7dmFyIHA9bC52YWx1ZTt0LnN0cmluZ3MucHVzaChwLmlubmVySFRNTC50cmltKCkpfX1jYXRjaChoKXtvPSEwLGE9aH1maW5hbGx5e3RyeXshaSYmY1tcInJldHVyblwiXSYmY1tcInJldHVyblwiXSgpfWZpbmFsbHl7aWYobyl0aHJvdyBhfX19dC5zdHJQb3M9MCx0LmFycmF5UG9zPTAsdC5zdG9wTnVtPTAsdC5sb29wPXQub3B0aW9ucy5sb29wLHQubG9vcENvdW50PXQub3B0aW9ucy5sb29wQ291bnQsdC5jdXJMb29wPTAsdC5zaHVmZmxlPXQub3B0aW9ucy5zaHVmZmxlLHQuc2VxdWVuY2U9W10sdC5wYXVzZT17c3RhdHVzOiExLHR5cGV3cml0ZTohMCxjdXJTdHJpbmc6XCJcIixjdXJTdHJQb3M6MH0sdC50eXBpbmdDb21wbGV0ZT0hMTtmb3IodmFyIGYgaW4gdC5zdHJpbmdzKXQuc2VxdWVuY2VbZl09Zjt0LmN1cnJlbnRFbENvbnRlbnQ9dGhpcy5nZXRDdXJyZW50RWxDb250ZW50KHQpLHQuYXV0b0luc2VydENzcz10Lm9wdGlvbnMuYXV0b0luc2VydENzcyx0aGlzLmFwcGVuZEFuaW1hdGlvbkNzcyh0KX19LHtrZXk6XCJnZXRDdXJyZW50RWxDb250ZW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9XCJcIjtyZXR1cm4gZT10LmF0dHI/dC5lbC5nZXRBdHRyaWJ1dGUodC5hdHRyKTp0LmlzSW5wdXQ/dC5lbC52YWx1ZTpcImh0bWxcIj09PXQuY29udGVudFR5cGU/dC5lbC5pbm5lckhUTUw6dC5lbC50ZXh0Q29udGVudH19LHtrZXk6XCJhcHBlbmRBbmltYXRpb25Dc3NcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0LmF1dG9JbnNlcnRDc3MmJnQuc2hvd0N1cnNvciYmdC5mYWRlT3V0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7ZS50eXBlPVwidGV4dC9jc3NcIjt2YXIgcz1cIlwiO3Quc2hvd0N1cnNvciYmKHMrPVwiXFxuICAgICAgICAudHlwZWQtY3Vyc29ye1xcbiAgICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgICBhbmltYXRpb246IHR5cGVkanNCbGluayAwLjdzIGluZmluaXRlO1xcbiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogdHlwZWRqc0JsaW5rIDAuN3MgaW5maW5pdGU7XFxuICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiB0eXBlZGpzQmxpbmsgMC43cyBpbmZpbml0ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIEBrZXlmcmFtZXMgdHlwZWRqc0JsaW5re1xcbiAgICAgICAgICA1MCUgeyBvcGFjaXR5OiAwLjA7IH1cXG4gICAgICAgIH1cXG4gICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyB0eXBlZGpzQmxpbmt7XFxuICAgICAgICAgIDAlIHsgb3BhY2l0eTogMTsgfVxcbiAgICAgICAgICA1MCUgeyBvcGFjaXR5OiAwLjA7IH1cXG4gICAgICAgICAgMTAwJSB7IG9wYWNpdHk6IDE7IH1cXG4gICAgICAgIH1cXG4gICAgICBcIiksdC5mYWRlT3V0JiYocys9XCJcXG4gICAgICAgIC50eXBlZC1mYWRlLW91dHtcXG4gICAgICAgICAgb3BhY2l0eTogMDtcXG4gICAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAuMjVzO1xcbiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogMDtcXG4gICAgICAgICAgICAgICAgICBhbmltYXRpb246IDA7XFxuICAgICAgICB9XFxuICAgICAgXCIpLDAhPT1lLmxlbmd0aCYmKGUuaW5uZXJIVE1MPXMsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKSl9fX1dKSx0fSgpO2VbXCJkZWZhdWx0XCJdPWw7dmFyIGM9bmV3IGw7ZS5pbml0aWFsaXplcj1jfSxmdW5jdGlvbih0LGUpe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBzPXtzdHJpbmdzOltcIlRoZXNlIGFyZSB0aGUgZGVmYXVsdCB2YWx1ZXMuLi5cIixcIllvdSBrbm93IHdoYXQgeW91IHNob3VsZCBkbz9cIixcIlVzZSB5b3VyIG93biFcIixcIkhhdmUgYSBncmVhdCBkYXkhXCJdLHN0cmluZ3NFbGVtZW50Om51bGwsdHlwZVNwZWVkOjAsc3RhcnREZWxheTowLGJhY2tTcGVlZDowLHNtYXJ0QmFja3NwYWNlOiEwLHNodWZmbGU6ITEsYmFja0RlbGF5OjcwMCxmYWRlT3V0OiExLGZhZGVPdXRDbGFzczpcInR5cGVkLWZhZGUtb3V0XCIsZmFkZU91dERlbGF5OjUwMCxsb29wOiExLGxvb3BDb3VudDoxLzAsc2hvd0N1cnNvcjohMCxjdXJzb3JDaGFyOlwifFwiLGF1dG9JbnNlcnRDc3M6ITAsYXR0cjpudWxsLGJpbmRJbnB1dEZvY3VzRXZlbnRzOiExLGNvbnRlbnRUeXBlOlwiaHRtbFwiLG9uQ29tcGxldGU6ZnVuY3Rpb24odCl7fSxwcmVTdHJpbmdUeXBlZDpmdW5jdGlvbih0LGUpe30sb25TdHJpbmdUeXBlZDpmdW5jdGlvbih0LGUpe30sb25MYXN0U3RyaW5nQmFja3NwYWNlZDpmdW5jdGlvbih0KXt9LG9uVHlwaW5nUGF1c2VkOmZ1bmN0aW9uKHQsZSl7fSxvblR5cGluZ1Jlc3VtZWQ6ZnVuY3Rpb24odCxlKXt9LG9uUmVzZXQ6ZnVuY3Rpb24odCl7fSxvblN0b3A6ZnVuY3Rpb24odCxlKXt9LG9uU3RhcnQ6ZnVuY3Rpb24odCxlKXt9LG9uRGVzdHJveTpmdW5jdGlvbih0KXt9fTtlW1wiZGVmYXVsdFwiXT1zLHQuZXhwb3J0cz1lW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24odCxlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBzKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIG49ZVtzXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLHMsbil7cmV0dXJuIHMmJnQoZS5wcm90b3R5cGUscyksbiYmdChlLG4pLGV9fSgpLGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cyh0aGlzLHQpfXJldHVybiBuKHQsW3trZXk6XCJ0eXBlSHRtbENoYXJzXCIsdmFsdWU6ZnVuY3Rpb24odCxlLHMpe2lmKFwiaHRtbFwiIT09cy5jb250ZW50VHlwZSlyZXR1cm4gZTt2YXIgbj10LnN1YnN0cihlKS5jaGFyQXQoMCk7aWYoXCI8XCI9PT1ufHxcIiZcIj09PW4pe3ZhciBpPVwiXCI7Zm9yKGk9XCI8XCI9PT1uP1wiPlwiOlwiO1wiO3Quc3Vic3RyKGUrMSkuY2hhckF0KDApIT09aSYmKGUrKywhKGUrMT50Lmxlbmd0aCkpOyk7ZSsrfXJldHVybiBlfX0se2tleTpcImJhY2tTcGFjZUh0bWxDaGFyc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxzKXtpZihcImh0bWxcIiE9PXMuY29udGVudFR5cGUpcmV0dXJuIGU7dmFyIG49dC5zdWJzdHIoZSkuY2hhckF0KDApO2lmKFwiPlwiPT09bnx8XCI7XCI9PT1uKXt2YXIgaT1cIlwiO2ZvcihpPVwiPlwiPT09bj9cIjxcIjpcIiZcIjt0LnN1YnN0cihlLTEpLmNoYXJBdCgwKSE9PWkmJihlLS0sIShlPDApKTspO2UtLX1yZXR1cm4gZX19XSksdH0oKTtlW1wiZGVmYXVsdFwiXT1pO3ZhciByPW5ldyBpO2UuaHRtbFBhcnNlcj1yfV0pfSk7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVkLm1pbi5qcy5tYXBcclxuIiwiLyohIFdPVyAtIHYxLjEuMyAtIDIwMTYtMDUtMDZcclxuKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWF0dGhpZXUgQXVzc2FndWVsOyovKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX0sZz1bXS5pbmRleE9mfHxmdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPXRoaXMubGVuZ3RoO2M+YjtiKyspaWYoYiBpbiB0aGlzJiZ0aGlzW2JdPT09YSlyZXR1cm4gYjtyZXR1cm4tMX07Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt9cmV0dXJuIGEucHJvdG90eXBlLmV4dGVuZD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7Zm9yKGMgaW4gYilkPWJbY10sbnVsbD09YVtjXSYmKGFbY109ZCk7cmV0dXJuIGF9LGEucHJvdG90eXBlLmlzTW9iaWxlPWZ1bmN0aW9uKGEpe3JldHVybi9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChhKX0sYS5wcm90b3R5cGUuY3JlYXRlRXZlbnQ9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7cmV0dXJuIG51bGw9PWImJihiPSExKSxudWxsPT1jJiYoYz0hMSksbnVsbD09ZCYmKGQ9bnVsbCksbnVsbCE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQ/KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKSxlLmluaXRDdXN0b21FdmVudChhLGIsYyxkKSk6bnVsbCE9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3Q/KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKSxlLmV2ZW50VHlwZT1hKTplLmV2ZW50TmFtZT1hLGV9LGEucHJvdG90eXBlLmVtaXRFdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiBudWxsIT1hLmRpc3BhdGNoRXZlbnQ/YS5kaXNwYXRjaEV2ZW50KGIpOmIgaW4obnVsbCE9YSk/YVtiXSgpOlwib25cIitiIGluKG51bGwhPWEpP2FbXCJvblwiK2JdKCk6dm9pZCAwfSxhLnByb3RvdHlwZS5hZGRFdmVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGwhPWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKTpudWxsIT1hLmF0dGFjaEV2ZW50P2EuYXR0YWNoRXZlbnQoXCJvblwiK2IsYyk6YVtiXT1jfSxhLnByb3RvdHlwZS5yZW1vdmVFdmVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGwhPWEucmVtb3ZlRXZlbnRMaXN0ZW5lcj9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKTpudWxsIT1hLmRldGFjaEV2ZW50P2EuZGV0YWNoRXZlbnQoXCJvblwiK2IsYyk6ZGVsZXRlIGFbYl19LGEucHJvdG90eXBlLmlubmVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuXCJpbm5lckhlaWdodFwiaW4gd2luZG93P3dpbmRvdy5pbm5lckhlaWdodDpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fSxhfSgpLGM9dGhpcy5XZWFrTWFwfHx0aGlzLk1veldlYWtNYXB8fChjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMua2V5cz1bXSx0aGlzLnZhbHVlcz1bXX1yZXR1cm4gYS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY7Zm9yKGY9dGhpcy5rZXlzLGI9ZD0wLGU9Zi5sZW5ndGg7ZT5kO2I9KytkKWlmKGM9ZltiXSxjPT09YSlyZXR1cm4gdGhpcy52YWx1ZXNbYl19LGEucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGc9dGhpcy5rZXlzLGM9ZT0wLGY9Zy5sZW5ndGg7Zj5lO2M9KytlKWlmKGQ9Z1tjXSxkPT09YSlyZXR1cm4gdm9pZCh0aGlzLnZhbHVlc1tjXT1iKTtyZXR1cm4gdGhpcy5rZXlzLnB1c2goYSksdGhpcy52YWx1ZXMucHVzaChiKX0sYX0oKSksYT10aGlzLk11dGF0aW9uT2JzZXJ2ZXJ8fHRoaXMuV2Via2l0TXV0YXRpb25PYnNlcnZlcnx8dGhpcy5Nb3pNdXRhdGlvbk9ic2VydmVyfHwoYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtcInVuZGVmaW5lZFwiIT10eXBlb2YgY29uc29sZSYmbnVsbCE9PWNvbnNvbGUmJmNvbnNvbGUud2FybihcIk11dGF0aW9uT2JzZXJ2ZXIgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuXCIpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBjb25zb2xlJiZudWxsIT09Y29uc29sZSYmY29uc29sZS53YXJuKFwiV09XLmpzIGNhbm5vdCBkZXRlY3QgZG9tIG11dGF0aW9ucywgcGxlYXNlIGNhbGwgLnN5bmMoKSBhZnRlciBsb2FkaW5nIG5ldyBjb250ZW50LlwiKX1yZXR1cm4gYS5ub3RTdXBwb3J0ZWQ9ITAsYS5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbigpe30sYX0oKSksZD10aGlzLmdldENvbXB1dGVkU3R5bGV8fGZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZT1mdW5jdGlvbihiKXt2YXIgYztyZXR1cm5cImZsb2F0XCI9PT1iJiYoYj1cInN0eWxlRmxvYXRcIiksZS50ZXN0KGIpJiZiLnJlcGxhY2UoZSxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KSwobnVsbCE9KGM9YS5jdXJyZW50U3R5bGUpP2NbYl06dm9pZCAwKXx8bnVsbH0sdGhpc30sZT0vKFxcLShbYS16XSl7MX0pL2csdGhpcy5XT1c9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGEpe251bGw9PWEmJihhPXt9KSx0aGlzLnNjcm9sbENhbGxiYWNrPWYodGhpcy5zY3JvbGxDYWxsYmFjayx0aGlzKSx0aGlzLnNjcm9sbEhhbmRsZXI9Zih0aGlzLnNjcm9sbEhhbmRsZXIsdGhpcyksdGhpcy5yZXNldEFuaW1hdGlvbj1mKHRoaXMucmVzZXRBbmltYXRpb24sdGhpcyksdGhpcy5zdGFydD1mKHRoaXMuc3RhcnQsdGhpcyksdGhpcy5zY3JvbGxlZD0hMCx0aGlzLmNvbmZpZz10aGlzLnV0aWwoKS5leHRlbmQoYSx0aGlzLmRlZmF1bHRzKSxudWxsIT1hLnNjcm9sbENvbnRhaW5lciYmKHRoaXMuY29uZmlnLnNjcm9sbENvbnRhaW5lcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGEuc2Nyb2xsQ29udGFpbmVyKSksdGhpcy5hbmltYXRpb25OYW1lQ2FjaGU9bmV3IGMsdGhpcy53b3dFdmVudD10aGlzLnV0aWwoKS5jcmVhdGVFdmVudCh0aGlzLmNvbmZpZy5ib3hDbGFzcyl9cmV0dXJuIGUucHJvdG90eXBlLmRlZmF1bHRzPXtib3hDbGFzczpcIndvd1wiLGFuaW1hdGVDbGFzczpcImFuaW1hdGVkXCIsb2Zmc2V0OjAsbW9iaWxlOiEwLGxpdmU6ITAsY2FsbGJhY2s6bnVsbCxzY3JvbGxDb250YWluZXI6bnVsbH0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBhO3JldHVybiB0aGlzLmVsZW1lbnQ9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcImludGVyYWN0aXZlXCI9PT0oYT1kb2N1bWVudC5yZWFkeVN0YXRlKXx8XCJjb21wbGV0ZVwiPT09YT90aGlzLnN0YXJ0KCk6dGhpcy51dGlsKCkuYWRkRXZlbnQoZG9jdW1lbnQsXCJET01Db250ZW50TG9hZGVkXCIsdGhpcy5zdGFydCksdGhpcy5maW5pc2hlZD1bXX0sZS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXt2YXIgYixjLGQsZTtpZih0aGlzLnN0b3BwZWQ9ITEsdGhpcy5ib3hlcz1mdW5jdGlvbigpe3ZhciBhLGMsZCxlO2ZvcihkPXRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiK3RoaXMuY29uZmlnLmJveENsYXNzKSxlPVtdLGE9MCxjPWQubGVuZ3RoO2M+YTthKyspYj1kW2FdLGUucHVzaChiKTtyZXR1cm4gZX0uY2FsbCh0aGlzKSx0aGlzLmFsbD1mdW5jdGlvbigpe3ZhciBhLGMsZCxlO2ZvcihkPXRoaXMuYm94ZXMsZT1bXSxhPTAsYz1kLmxlbmd0aDtjPmE7YSsrKWI9ZFthXSxlLnB1c2goYik7cmV0dXJuIGV9LmNhbGwodGhpcyksdGhpcy5ib3hlcy5sZW5ndGgpaWYodGhpcy5kaXNhYmxlZCgpKXRoaXMucmVzZXRTdHlsZSgpO2Vsc2UgZm9yKGU9dGhpcy5ib3hlcyxjPTAsZD1lLmxlbmd0aDtkPmM7YysrKWI9ZVtjXSx0aGlzLmFwcGx5U3R5bGUoYiwhMCk7cmV0dXJuIHRoaXMuZGlzYWJsZWQoKXx8KHRoaXMudXRpbCgpLmFkZEV2ZW50KHRoaXMuY29uZmlnLnNjcm9sbENvbnRhaW5lcnx8d2luZG93LFwic2Nyb2xsXCIsdGhpcy5zY3JvbGxIYW5kbGVyKSx0aGlzLnV0aWwoKS5hZGRFdmVudCh3aW5kb3csXCJyZXNpemVcIix0aGlzLnNjcm9sbEhhbmRsZXIpLHRoaXMuaW50ZXJ2YWw9c2V0SW50ZXJ2YWwodGhpcy5zY3JvbGxDYWxsYmFjayw1MCkpLHRoaXMuY29uZmlnLmxpdmU/bmV3IGEoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGc9W10sYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrKylmPWJbY10sZy5wdXNoKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Zm9yKGM9Zi5hZGRlZE5vZGVzfHxbXSxkPVtdLGE9MCxiPWMubGVuZ3RoO2I+YTthKyspZT1jW2FdLGQucHVzaCh0aGlzLmRvU3luYyhlKSk7cmV0dXJuIGR9LmNhbGwoYSkpO3JldHVybiBnfX0odGhpcykpLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KTp2b2lkIDB9LGUucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9wcGVkPSEwLHRoaXMudXRpbCgpLnJlbW92ZUV2ZW50KHRoaXMuY29uZmlnLnNjcm9sbENvbnRhaW5lcnx8d2luZG93LFwic2Nyb2xsXCIsdGhpcy5zY3JvbGxIYW5kbGVyKSx0aGlzLnV0aWwoKS5yZW1vdmVFdmVudCh3aW5kb3csXCJyZXNpemVcIix0aGlzLnNjcm9sbEhhbmRsZXIpLG51bGwhPXRoaXMuaW50ZXJ2YWw/Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTp2b2lkIDB9LGUucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24oYil7cmV0dXJuIGEubm90U3VwcG9ydGVkP3RoaXMuZG9TeW5jKHRoaXMuZWxlbWVudCk6dm9pZCAwfSxlLnByb3RvdHlwZS5kb1N5bmM9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZjtpZihudWxsPT1hJiYoYT10aGlzLmVsZW1lbnQpLDE9PT1hLm5vZGVUeXBlKXtmb3IoYT1hLnBhcmVudE5vZGV8fGEsZT1hLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIrdGhpcy5jb25maWcuYm94Q2xhc3MpLGY9W10sYz0wLGQ9ZS5sZW5ndGg7ZD5jO2MrKyliPWVbY10sZy5jYWxsKHRoaXMuYWxsLGIpPDA/KHRoaXMuYm94ZXMucHVzaChiKSx0aGlzLmFsbC5wdXNoKGIpLHRoaXMuc3RvcHBlZHx8dGhpcy5kaXNhYmxlZCgpP3RoaXMucmVzZXRTdHlsZSgpOnRoaXMuYXBwbHlTdHlsZShiLCEwKSxmLnB1c2godGhpcy5zY3JvbGxlZD0hMCkpOmYucHVzaCh2b2lkIDApO3JldHVybiBmfX0sZS5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcHBseVN0eWxlKGEpLGEuY2xhc3NOYW1lPWEuY2xhc3NOYW1lK1wiIFwiK3RoaXMuY29uZmlnLmFuaW1hdGVDbGFzcyxudWxsIT10aGlzLmNvbmZpZy5jYWxsYmFjayYmdGhpcy5jb25maWcuY2FsbGJhY2soYSksdGhpcy51dGlsKCkuZW1pdEV2ZW50KGEsdGhpcy53b3dFdmVudCksdGhpcy51dGlsKCkuYWRkRXZlbnQoYSxcImFuaW1hdGlvbmVuZFwiLHRoaXMucmVzZXRBbmltYXRpb24pLHRoaXMudXRpbCgpLmFkZEV2ZW50KGEsXCJvYW5pbWF0aW9uZW5kXCIsdGhpcy5yZXNldEFuaW1hdGlvbiksdGhpcy51dGlsKCkuYWRkRXZlbnQoYSxcIndlYmtpdEFuaW1hdGlvbkVuZFwiLHRoaXMucmVzZXRBbmltYXRpb24pLHRoaXMudXRpbCgpLmFkZEV2ZW50KGEsXCJNU0FuaW1hdGlvbkVuZFwiLHRoaXMucmVzZXRBbmltYXRpb24pLGF9LGUucHJvdG90eXBlLmFwcGx5U3R5bGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7cmV0dXJuIGQ9YS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdvdy1kdXJhdGlvblwiKSxjPWEuZ2V0QXR0cmlidXRlKFwiZGF0YS13b3ctZGVsYXlcIiksZT1hLmdldEF0dHJpYnV0ZShcImRhdGEtd293LWl0ZXJhdGlvblwiKSx0aGlzLmFuaW1hdGUoZnVuY3Rpb24oZil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYuY3VzdG9tU3R5bGUoYSxiLGQsYyxlKX19KHRoaXMpKX0sZS5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbigpe3JldHVyblwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJpbiB3aW5kb3c/ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYSl9OmZ1bmN0aW9uKGEpe3JldHVybiBhKCl9fSgpLGUucHJvdG90eXBlLnJlc2V0U3R5bGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2ZvcihkPXRoaXMuYm94ZXMsZT1bXSxiPTAsYz1kLmxlbmd0aDtjPmI7YisrKWE9ZFtiXSxlLnB1c2goYS5zdHlsZS52aXNpYmlsaXR5PVwidmlzaWJsZVwiKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUucmVzZXRBbmltYXRpb249ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGEudHlwZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJhbmltYXRpb25lbmRcIik+PTA/KGI9YS50YXJnZXR8fGEuc3JjRWxlbWVudCxiLmNsYXNzTmFtZT1iLmNsYXNzTmFtZS5yZXBsYWNlKHRoaXMuY29uZmlnLmFuaW1hdGVDbGFzcyxcIlwiKS50cmltKCkpOnZvaWQgMH0sZS5wcm90b3R5cGUuY3VzdG9tU3R5bGU9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gYiYmdGhpcy5jYWNoZUFuaW1hdGlvbk5hbWUoYSksYS5zdHlsZS52aXNpYmlsaXR5PWI/XCJoaWRkZW5cIjpcInZpc2libGVcIixjJiZ0aGlzLnZlbmRvclNldChhLnN0eWxlLHthbmltYXRpb25EdXJhdGlvbjpjfSksZCYmdGhpcy52ZW5kb3JTZXQoYS5zdHlsZSx7YW5pbWF0aW9uRGVsYXk6ZH0pLGUmJnRoaXMudmVuZG9yU2V0KGEuc3R5bGUse2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OmV9KSx0aGlzLnZlbmRvclNldChhLnN0eWxlLHthbmltYXRpb25OYW1lOmI/XCJub25lXCI6dGhpcy5jYWNoZWRBbmltYXRpb25OYW1lKGEpfSksYX0sZS5wcm90b3R5cGUudmVuZG9ycz1bXCJtb3pcIixcIndlYmtpdFwiXSxlLnByb3RvdHlwZS52ZW5kb3JTZXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZjtkPVtdO2ZvcihjIGluIGIpZT1iW2NdLGFbXCJcIitjXT1lLGQucHVzaChmdW5jdGlvbigpe3ZhciBiLGQsZyxoO2ZvcihnPXRoaXMudmVuZG9ycyxoPVtdLGI9MCxkPWcubGVuZ3RoO2Q+YjtiKyspZj1nW2JdLGgucHVzaChhW1wiXCIrZitjLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Muc3Vic3RyKDEpXT1lKTtyZXR1cm4gaH0uY2FsbCh0aGlzKSk7cmV0dXJuIGR9LGUucHJvdG90eXBlLnZlbmRvckNTUz1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaTtmb3IoaD1kKGEpLGc9aC5nZXRQcm9wZXJ0eUNTU1ZhbHVlKGIpLGY9dGhpcy52ZW5kb3JzLGM9MCxlPWYubGVuZ3RoO2U+YztjKyspaT1mW2NdLGc9Z3x8aC5nZXRQcm9wZXJ0eUNTU1ZhbHVlKFwiLVwiK2krXCItXCIrYik7cmV0dXJuIGd9LGUucHJvdG90eXBlLmFuaW1hdGlvbk5hbWU9ZnVuY3Rpb24oYSl7dmFyIGI7dHJ5e2I9dGhpcy52ZW5kb3JDU1MoYSxcImFuaW1hdGlvbi1uYW1lXCIpLmNzc1RleHR9Y2F0Y2goYyl7Yj1kKGEpLmdldFByb3BlcnR5VmFsdWUoXCJhbmltYXRpb24tbmFtZVwiKX1yZXR1cm5cIm5vbmVcIj09PWI/XCJcIjpifSxlLnByb3RvdHlwZS5jYWNoZUFuaW1hdGlvbk5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYW5pbWF0aW9uTmFtZUNhY2hlLnNldChhLHRoaXMuYW5pbWF0aW9uTmFtZShhKSl9LGUucHJvdG90eXBlLmNhY2hlZEFuaW1hdGlvbk5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYW5pbWF0aW9uTmFtZUNhY2hlLmdldChhKX0sZS5wcm90b3R5cGUuc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVkPSEwfSxlLnByb3RvdHlwZS5zY3JvbGxDYWxsYmFjaz1mdW5jdGlvbigpe3ZhciBhO3JldHVybiF0aGlzLnNjcm9sbGVkfHwodGhpcy5zY3JvbGxlZD0hMSx0aGlzLmJveGVzPWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGU7Zm9yKGQ9dGhpcy5ib3hlcyxlPVtdLGI9MCxjPWQubGVuZ3RoO2M+YjtiKyspYT1kW2JdLGEmJih0aGlzLmlzVmlzaWJsZShhKT90aGlzLnNob3coYSk6ZS5wdXNoKGEpKTtyZXR1cm4gZX0uY2FsbCh0aGlzKSx0aGlzLmJveGVzLmxlbmd0aHx8dGhpcy5jb25maWcubGl2ZSk/dm9pZCAwOnRoaXMuc3RvcCgpfSxlLnByb3RvdHlwZS5vZmZzZXRUb3A9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiO3ZvaWQgMD09PWEub2Zmc2V0VG9wOylhPWEucGFyZW50Tm9kZTtmb3IoYj1hLm9mZnNldFRvcDthPWEub2Zmc2V0UGFyZW50OyliKz1hLm9mZnNldFRvcDtyZXR1cm4gYn0sZS5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY7cmV0dXJuIGM9YS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdvdy1vZmZzZXRcIil8fHRoaXMuY29uZmlnLm9mZnNldCxmPXRoaXMuY29uZmlnLnNjcm9sbENvbnRhaW5lciYmdGhpcy5jb25maWcuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcHx8d2luZG93LnBhZ2VZT2Zmc2V0LGU9ZitNYXRoLm1pbih0aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0LHRoaXMudXRpbCgpLmlubmVySGVpZ2h0KCkpLWMsZD10aGlzLm9mZnNldFRvcChhKSxiPWQrYS5jbGllbnRIZWlnaHQsZT49ZCYmYj49Zn0sZS5wcm90b3R5cGUudXRpbD1mdW5jdGlvbigpe3JldHVybiBudWxsIT10aGlzLl91dGlsP3RoaXMuX3V0aWw6dGhpcy5fdXRpbD1uZXcgYn0sZS5wcm90b3R5cGUuZGlzYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5jb25maWcubW9iaWxlJiZ0aGlzLnV0aWwoKS5pc01vYmlsZShuYXZpZ2F0b3IudXNlckFnZW50KX0sZX0oKX0pLmNhbGwodGhpcyk7IiwiLyoqXHJcbiAqIGJ4U2xpZGVyIHY0LjIuMTJcclxuICogQ29weXJpZ2h0IDIwMTMtMjAxNSBTdGV2ZW4gV2FuZGVyc2tpXHJcbiAqIFdyaXR0ZW4gd2hpbGUgZHJpbmtpbmcgQmVsZ2lhbiBhbGVzIGFuZCBsaXN0ZW5pbmcgdG8gamF6elxyXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpXHJcbiAqL1xyXG4hZnVuY3Rpb24odCl7dmFyIGU9e21vZGU6XCJob3Jpem9udGFsXCIsc2xpZGVTZWxlY3RvcjpcIlwiLGluZmluaXRlTG9vcDohMCxoaWRlQ29udHJvbE9uRW5kOiExLHNwZWVkOjUwMCxlYXNpbmc6bnVsbCxzbGlkZU1hcmdpbjowLHN0YXJ0U2xpZGU6MCxyYW5kb21TdGFydDohMSxjYXB0aW9uczohMSx0aWNrZXI6ITEsdGlja2VySG92ZXI6ITEsYWRhcHRpdmVIZWlnaHQ6ITEsYWRhcHRpdmVIZWlnaHRTcGVlZDo1MDAsdmlkZW86ITEsdXNlQ1NTOiEwLHByZWxvYWRJbWFnZXM6XCJ2aXNpYmxlXCIscmVzcG9uc2l2ZTohMCxzbGlkZVpJbmRleDo1MCx3cmFwcGVyQ2xhc3M6XCJieC13cmFwcGVyXCIsdG91Y2hFbmFibGVkOiEwLHN3aXBlVGhyZXNob2xkOjUwLG9uZVRvT25lVG91Y2g6ITAscHJldmVudERlZmF1bHRTd2lwZVg6ITAscHJldmVudERlZmF1bHRTd2lwZVk6ITEsYXJpYUxpdmU6ITAsYXJpYUhpZGRlbjohMCxrZXlib2FyZEVuYWJsZWQ6ITEscGFnZXI6ITAscGFnZXJUeXBlOlwiZnVsbFwiLHBhZ2VyU2hvcnRTZXBhcmF0b3I6XCIgLyBcIixwYWdlclNlbGVjdG9yOm51bGwsYnVpbGRQYWdlcjpudWxsLHBhZ2VyQ3VzdG9tOm51bGwsY29udHJvbHM6ITAsbmV4dFRleHQ6XCJOZXh0XCIscHJldlRleHQ6XCJQcmV2XCIsbmV4dFNlbGVjdG9yOm51bGwscHJldlNlbGVjdG9yOm51bGwsYXV0b0NvbnRyb2xzOiExLHN0YXJ0VGV4dDpcIlN0YXJ0XCIsc3RvcFRleHQ6XCJTdG9wXCIsYXV0b0NvbnRyb2xzQ29tYmluZTohMSxhdXRvQ29udHJvbHNTZWxlY3RvcjpudWxsLGF1dG86ITEscGF1c2U6NGUzLGF1dG9TdGFydDohMCxhdXRvRGlyZWN0aW9uOlwibmV4dFwiLHN0b3BBdXRvT25DbGljazohMSxhdXRvSG92ZXI6ITEsYXV0b0RlbGF5OjAsYXV0b1NsaWRlRm9yT25lUGFnZTohMSxtaW5TbGlkZXM6MSxtYXhTbGlkZXM6MSxtb3ZlU2xpZGVzOjAsc2xpZGVXaWR0aDowLHNocmlua0l0ZW1zOiExLG9uU2xpZGVyTG9hZDpmdW5jdGlvbigpe3JldHVybiEwfSxvblNsaWRlQmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVBZnRlcjpmdW5jdGlvbigpe3JldHVybiEwfSxvblNsaWRlTmV4dDpmdW5jdGlvbigpe3JldHVybiEwfSxvblNsaWRlUHJldjpmdW5jdGlvbigpe3JldHVybiEwfSxvblNsaWRlclJlc2l6ZTpmdW5jdGlvbigpe3JldHVybiEwfX07dC5mbi5ieFNsaWRlcj1mdW5jdGlvbihuKXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7aWYodGhpcy5sZW5ndGg+MSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS5ieFNsaWRlcihuKX0pLHRoaXM7dmFyIHM9e30sbz10aGlzLHI9dCh3aW5kb3cpLndpZHRoKCksYT10KHdpbmRvdykuaGVpZ2h0KCk7aWYoIXQobykuZGF0YShcImJ4U2xpZGVyXCIpKXt2YXIgbD1mdW5jdGlvbigpe3QobykuZGF0YShcImJ4U2xpZGVyXCIpfHwocy5zZXR0aW5ncz10LmV4dGVuZCh7fSxlLG4pLHMuc2V0dGluZ3Muc2xpZGVXaWR0aD1wYXJzZUludChzLnNldHRpbmdzLnNsaWRlV2lkdGgpLHMuY2hpbGRyZW49by5jaGlsZHJlbihzLnNldHRpbmdzLnNsaWRlU2VsZWN0b3IpLHMuY2hpbGRyZW4ubGVuZ3RoPHMuc2V0dGluZ3MubWluU2xpZGVzJiYocy5zZXR0aW5ncy5taW5TbGlkZXM9cy5jaGlsZHJlbi5sZW5ndGgpLHMuY2hpbGRyZW4ubGVuZ3RoPHMuc2V0dGluZ3MubWF4U2xpZGVzJiYocy5zZXR0aW5ncy5tYXhTbGlkZXM9cy5jaGlsZHJlbi5sZW5ndGgpLHMuc2V0dGluZ3MucmFuZG9tU3RhcnQmJihzLnNldHRpbmdzLnN0YXJ0U2xpZGU9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnMuY2hpbGRyZW4ubGVuZ3RoKSkscy5hY3RpdmU9e2luZGV4OnMuc2V0dGluZ3Muc3RhcnRTbGlkZX0scy5jYXJvdXNlbD1zLnNldHRpbmdzLm1pblNsaWRlcz4xfHxzLnNldHRpbmdzLm1heFNsaWRlcz4xLHMuY2Fyb3VzZWwmJihzLnNldHRpbmdzLnByZWxvYWRJbWFnZXM9XCJhbGxcIikscy5taW5UaHJlc2hvbGQ9cy5zZXR0aW5ncy5taW5TbGlkZXMqcy5zZXR0aW5ncy5zbGlkZVdpZHRoKyhzLnNldHRpbmdzLm1pblNsaWRlcy0xKSpzLnNldHRpbmdzLnNsaWRlTWFyZ2luLHMubWF4VGhyZXNob2xkPXMuc2V0dGluZ3MubWF4U2xpZGVzKnMuc2V0dGluZ3Muc2xpZGVXaWR0aCsocy5zZXR0aW5ncy5tYXhTbGlkZXMtMSkqcy5zZXR0aW5ncy5zbGlkZU1hcmdpbixzLndvcmtpbmc9ITEscy5jb250cm9scz17fSxzLmludGVydmFsPW51bGwscy5hbmltUHJvcD1cInZlcnRpY2FsXCI9PT1zLnNldHRpbmdzLm1vZGU/XCJ0b3BcIjpcImxlZnRcIixzLnVzaW5nQ1NTPXMuc2V0dGluZ3MudXNlQ1NTJiZcImZhZGVcIiE9PXMuc2V0dGluZ3MubW9kZSYmZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxlPVtcIldlYmtpdFBlcnNwZWN0aXZlXCIsXCJNb3pQZXJzcGVjdGl2ZVwiLFwiT1BlcnNwZWN0aXZlXCIsXCJtc1BlcnNwZWN0aXZlXCJdLGk9MDtpPGUubGVuZ3RoO2krKylpZih2b2lkIDAhPT10LnN0eWxlW2VbaV1dKXJldHVybiBzLmNzc1ByZWZpeD1lW2ldLnJlcGxhY2UoXCJQZXJzcGVjdGl2ZVwiLFwiXCIpLnRvTG93ZXJDYXNlKCkscy5hbmltUHJvcD1cIi1cIitzLmNzc1ByZWZpeCtcIi10cmFuc2Zvcm1cIiwhMDtyZXR1cm4hMX0oKSxcInZlcnRpY2FsXCI9PT1zLnNldHRpbmdzLm1vZGUmJihzLnNldHRpbmdzLm1heFNsaWRlcz1zLnNldHRpbmdzLm1pblNsaWRlcyksby5kYXRhKFwib3JpZ1N0eWxlXCIsby5hdHRyKFwic3R5bGVcIikpLG8uY2hpbGRyZW4ocy5zZXR0aW5ncy5zbGlkZVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS5kYXRhKFwib3JpZ1N0eWxlXCIsdCh0aGlzKS5hdHRyKFwic3R5bGVcIikpfSksZCgpKX0sZD1mdW5jdGlvbigpe3ZhciBlPXMuY2hpbGRyZW4uZXEocy5zZXR0aW5ncy5zdGFydFNsaWRlKTtvLndyYXAoJzxkaXYgY2xhc3M9XCInK3Muc2V0dGluZ3Mud3JhcHBlckNsYXNzKydcIj48ZGl2IGNsYXNzPVwiYngtdmlld3BvcnRcIj48L2Rpdj48L2Rpdj4nKSxzLnZpZXdwb3J0PW8ucGFyZW50KCkscy5zZXR0aW5ncy5hcmlhTGl2ZSYmIXMuc2V0dGluZ3MudGlja2VyJiZzLnZpZXdwb3J0LmF0dHIoXCJhcmlhLWxpdmVcIixcInBvbGl0ZVwiKSxzLmxvYWRlcj10KCc8ZGl2IGNsYXNzPVwiYngtbG9hZGluZ1wiIC8+Jykscy52aWV3cG9ydC5wcmVwZW5kKHMubG9hZGVyKSxvLmNzcyh7d2lkdGg6XCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGU/MWUzKnMuY2hpbGRyZW4ubGVuZ3RoKzIxNStcIiVcIjpcImF1dG9cIixwb3NpdGlvbjpcInJlbGF0aXZlXCJ9KSxzLnVzaW5nQ1NTJiZzLnNldHRpbmdzLmVhc2luZz9vLmNzcyhcIi1cIitzLmNzc1ByZWZpeCtcIi10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvblwiLHMuc2V0dGluZ3MuZWFzaW5nKTpzLnNldHRpbmdzLmVhc2luZ3x8KHMuc2V0dGluZ3MuZWFzaW5nPVwic3dpbmdcIikscy52aWV3cG9ydC5jc3Moe3dpZHRoOlwiMTAwJVwiLG92ZXJmbG93OlwiaGlkZGVuXCIscG9zaXRpb246XCJyZWxhdGl2ZVwifSkscy52aWV3cG9ydC5wYXJlbnQoKS5jc3Moe21heFdpZHRoOnUoKX0pLHMuY2hpbGRyZW4uY3NzKHtmbG9hdDpcImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT9cImxlZnRcIjpcIm5vbmVcIixsaXN0U3R5bGU6XCJub25lXCIscG9zaXRpb246XCJyZWxhdGl2ZVwifSkscy5jaGlsZHJlbi5jc3MoXCJ3aWR0aFwiLGgoKSksXCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGUmJnMuc2V0dGluZ3Muc2xpZGVNYXJnaW4+MCYmcy5jaGlsZHJlbi5jc3MoXCJtYXJnaW5SaWdodFwiLHMuc2V0dGluZ3Muc2xpZGVNYXJnaW4pLFwidmVydGljYWxcIj09PXMuc2V0dGluZ3MubW9kZSYmcy5zZXR0aW5ncy5zbGlkZU1hcmdpbj4wJiZzLmNoaWxkcmVuLmNzcyhcIm1hcmdpbkJvdHRvbVwiLHMuc2V0dGluZ3Muc2xpZGVNYXJnaW4pLFwiZmFkZVwiPT09cy5zZXR0aW5ncy5tb2RlJiYocy5jaGlsZHJlbi5jc3Moe3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix6SW5kZXg6MCxkaXNwbGF5Olwibm9uZVwifSkscy5jaGlsZHJlbi5lcShzLnNldHRpbmdzLnN0YXJ0U2xpZGUpLmNzcyh7ekluZGV4OnMuc2V0dGluZ3Muc2xpZGVaSW5kZXgsZGlzcGxheTpcImJsb2NrXCJ9KSkscy5jb250cm9scy5lbD10KCc8ZGl2IGNsYXNzPVwiYngtY29udHJvbHNcIiAvPicpLHMuc2V0dGluZ3MuY2FwdGlvbnMmJlAoKSxzLmFjdGl2ZS5sYXN0PXMuc2V0dGluZ3Muc3RhcnRTbGlkZT09PWYoKS0xLHMuc2V0dGluZ3MudmlkZW8mJm8uZml0VmlkcygpLChcImFsbFwiPT09cy5zZXR0aW5ncy5wcmVsb2FkSW1hZ2VzfHxzLnNldHRpbmdzLnRpY2tlcikmJihlPXMuY2hpbGRyZW4pLHMuc2V0dGluZ3MudGlja2VyP3Muc2V0dGluZ3MucGFnZXI9ITE6KHMuc2V0dGluZ3MuY29udHJvbHMmJkMoKSxzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3MuYXV0b0NvbnRyb2xzJiZUKCkscy5zZXR0aW5ncy5wYWdlciYmdygpLChzLnNldHRpbmdzLmNvbnRyb2xzfHxzLnNldHRpbmdzLmF1dG9Db250cm9sc3x8cy5zZXR0aW5ncy5wYWdlcikmJnMudmlld3BvcnQuYWZ0ZXIocy5jb250cm9scy5lbCkpLGMoZSxnKX0sYz1mdW5jdGlvbihlLGkpe3ZhciBuPWUuZmluZCgnaW1nOm5vdChbc3JjPVwiXCJdKSwgaWZyYW1lJykubGVuZ3RoLHM9MDtyZXR1cm4gMD09PW4/dm9pZCBpKCk6dm9pZCBlLmZpbmQoJ2ltZzpub3QoW3NyYz1cIlwiXSksIGlmcmFtZScpLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLm9uZShcImxvYWQgZXJyb3JcIixmdW5jdGlvbigpeysrcz09PW4mJmkoKX0pLmVhY2goZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlJiZ0KHRoaXMpLnRyaWdnZXIoXCJsb2FkXCIpfSl9KX0sZz1mdW5jdGlvbigpe2lmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wJiZcImZhZGVcIiE9PXMuc2V0dGluZ3MubW9kZSYmIXMuc2V0dGluZ3MudGlja2VyKXt2YXIgZT1cInZlcnRpY2FsXCI9PT1zLnNldHRpbmdzLm1vZGU/cy5zZXR0aW5ncy5taW5TbGlkZXM6cy5zZXR0aW5ncy5tYXhTbGlkZXMsaT1zLmNoaWxkcmVuLnNsaWNlKDAsZSkuY2xvbmUoITApLmFkZENsYXNzKFwiYngtY2xvbmVcIiksbj1zLmNoaWxkcmVuLnNsaWNlKC1lKS5jbG9uZSghMCkuYWRkQ2xhc3MoXCJieC1jbG9uZVwiKTtzLnNldHRpbmdzLmFyaWFIaWRkZW4mJihpLmF0dHIoXCJhcmlhLWhpZGRlblwiLCEwKSxuLmF0dHIoXCJhcmlhLWhpZGRlblwiLCEwKSksby5hcHBlbmQoaSkucHJlcGVuZChuKX1zLmxvYWRlci5yZW1vdmUoKSxtKCksXCJ2ZXJ0aWNhbFwiPT09cy5zZXR0aW5ncy5tb2RlJiYocy5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodD0hMCkscy52aWV3cG9ydC5oZWlnaHQocCgpKSxvLnJlZHJhd1NsaWRlcigpLHMuc2V0dGluZ3Mub25TbGlkZXJMb2FkLmNhbGwobyxzLmFjdGl2ZS5pbmRleCkscy5pbml0aWFsaXplZD0hMCxzLnNldHRpbmdzLnJlc3BvbnNpdmUmJnQod2luZG93KS5iaW5kKFwicmVzaXplXCIsWikscy5zZXR0aW5ncy5hdXRvJiZzLnNldHRpbmdzLmF1dG9TdGFydCYmKGYoKT4xfHxzLnNldHRpbmdzLmF1dG9TbGlkZUZvck9uZVBhZ2UpJiZIKCkscy5zZXR0aW5ncy50aWNrZXImJlcoKSxzLnNldHRpbmdzLnBhZ2VyJiZJKHMuc2V0dGluZ3Muc3RhcnRTbGlkZSkscy5zZXR0aW5ncy5jb250cm9scyYmRCgpLHMuc2V0dGluZ3MudG91Y2hFbmFibGVkJiYhcy5zZXR0aW5ncy50aWNrZXImJk4oKSxzLnNldHRpbmdzLmtleWJvYXJkRW5hYmxlZCYmIXMuc2V0dGluZ3MudGlja2VyJiZ0KGRvY3VtZW50KS5rZXlkb3duKEYpfSxwPWZ1bmN0aW9uKCl7dmFyIGU9MCxuPXQoKTtpZihcInZlcnRpY2FsXCI9PT1zLnNldHRpbmdzLm1vZGV8fHMuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHQpaWYocy5jYXJvdXNlbCl7dmFyIG89MT09PXMuc2V0dGluZ3MubW92ZVNsaWRlcz9zLmFjdGl2ZS5pbmRleDpzLmFjdGl2ZS5pbmRleCp4KCk7Zm9yKG49cy5jaGlsZHJlbi5lcShvKSxpPTE7aTw9cy5zZXR0aW5ncy5tYXhTbGlkZXMtMTtpKyspbj1vK2k+PXMuY2hpbGRyZW4ubGVuZ3RoP24uYWRkKHMuY2hpbGRyZW4uZXEoaS0xKSk6bi5hZGQocy5jaGlsZHJlbi5lcShvK2kpKX1lbHNlIG49cy5jaGlsZHJlbi5lcShzLmFjdGl2ZS5pbmRleCk7ZWxzZSBuPXMuY2hpbGRyZW47cmV0dXJuXCJ2ZXJ0aWNhbFwiPT09cy5zZXR0aW5ncy5tb2RlPyhuLmVhY2goZnVuY3Rpb24oaSl7ZSs9dCh0aGlzKS5vdXRlckhlaWdodCgpfSkscy5zZXR0aW5ncy5zbGlkZU1hcmdpbj4wJiYoZSs9cy5zZXR0aW5ncy5zbGlkZU1hcmdpbioocy5zZXR0aW5ncy5taW5TbGlkZXMtMSkpKTplPU1hdGgubWF4LmFwcGx5KE1hdGgsbi5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzKS5vdXRlckhlaWdodCghMSl9KS5nZXQoKSksXCJib3JkZXItYm94XCI9PT1zLnZpZXdwb3J0LmNzcyhcImJveC1zaXppbmdcIik/ZSs9cGFyc2VGbG9hdChzLnZpZXdwb3J0LmNzcyhcInBhZGRpbmctdG9wXCIpKStwYXJzZUZsb2F0KHMudmlld3BvcnQuY3NzKFwicGFkZGluZy1ib3R0b21cIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoXCJib3JkZXItdG9wLXdpZHRoXCIpKStwYXJzZUZsb2F0KHMudmlld3BvcnQuY3NzKFwiYm9yZGVyLWJvdHRvbS13aWR0aFwiKSk6XCJwYWRkaW5nLWJveFwiPT09cy52aWV3cG9ydC5jc3MoXCJib3gtc2l6aW5nXCIpJiYoZSs9cGFyc2VGbG9hdChzLnZpZXdwb3J0LmNzcyhcInBhZGRpbmctdG9wXCIpKStwYXJzZUZsb2F0KHMudmlld3BvcnQuY3NzKFwicGFkZGluZy1ib3R0b21cIikpKSxlfSx1PWZ1bmN0aW9uKCl7dmFyIHQ9XCIxMDAlXCI7cmV0dXJuIHMuc2V0dGluZ3Muc2xpZGVXaWR0aD4wJiYodD1cImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT9zLnNldHRpbmdzLm1heFNsaWRlcypzLnNldHRpbmdzLnNsaWRlV2lkdGgrKHMuc2V0dGluZ3MubWF4U2xpZGVzLTEpKnMuc2V0dGluZ3Muc2xpZGVNYXJnaW46cy5zZXR0aW5ncy5zbGlkZVdpZHRoKSx0fSxoPWZ1bmN0aW9uKCl7dmFyIHQ9cy5zZXR0aW5ncy5zbGlkZVdpZHRoLGU9cy52aWV3cG9ydC53aWR0aCgpO2lmKDA9PT1zLnNldHRpbmdzLnNsaWRlV2lkdGh8fHMuc2V0dGluZ3Muc2xpZGVXaWR0aD5lJiYhcy5jYXJvdXNlbHx8XCJ2ZXJ0aWNhbFwiPT09cy5zZXR0aW5ncy5tb2RlKXQ9ZTtlbHNlIGlmKHMuc2V0dGluZ3MubWF4U2xpZGVzPjEmJlwiaG9yaXpvbnRhbFwiPT09cy5zZXR0aW5ncy5tb2RlKXtpZihlPnMubWF4VGhyZXNob2xkKXJldHVybiB0O2U8cy5taW5UaHJlc2hvbGQ/dD0oZS1zLnNldHRpbmdzLnNsaWRlTWFyZ2luKihzLnNldHRpbmdzLm1pblNsaWRlcy0xKSkvcy5zZXR0aW5ncy5taW5TbGlkZXM6cy5zZXR0aW5ncy5zaHJpbmtJdGVtcyYmKHQ9TWF0aC5mbG9vcigoZStzLnNldHRpbmdzLnNsaWRlTWFyZ2luKS9NYXRoLmNlaWwoKGUrcy5zZXR0aW5ncy5zbGlkZU1hcmdpbikvKHQrcy5zZXR0aW5ncy5zbGlkZU1hcmdpbikpLXMuc2V0dGluZ3Muc2xpZGVNYXJnaW4pKX1yZXR1cm4gdH0sdj1mdW5jdGlvbigpe3ZhciB0PTEsZT1udWxsO3JldHVyblwiaG9yaXpvbnRhbFwiPT09cy5zZXR0aW5ncy5tb2RlJiZzLnNldHRpbmdzLnNsaWRlV2lkdGg+MD9zLnZpZXdwb3J0LndpZHRoKCk8cy5taW5UaHJlc2hvbGQ/dD1zLnNldHRpbmdzLm1pblNsaWRlczpzLnZpZXdwb3J0LndpZHRoKCk+cy5tYXhUaHJlc2hvbGQ/dD1zLnNldHRpbmdzLm1heFNsaWRlczooZT1zLmNoaWxkcmVuLmZpcnN0KCkud2lkdGgoKStzLnNldHRpbmdzLnNsaWRlTWFyZ2luLHQ9TWF0aC5mbG9vcigocy52aWV3cG9ydC53aWR0aCgpK3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4pL2UpKTpcInZlcnRpY2FsXCI9PT1zLnNldHRpbmdzLm1vZGUmJih0PXMuc2V0dGluZ3MubWluU2xpZGVzKSx0fSxmPWZ1bmN0aW9uKCl7dmFyIHQ9MCxlPTAsaT0wO2lmKHMuc2V0dGluZ3MubW92ZVNsaWRlcz4wKWlmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wKXQ9TWF0aC5jZWlsKHMuY2hpbGRyZW4ubGVuZ3RoL3goKSk7ZWxzZSBmb3IoO2U8cy5jaGlsZHJlbi5sZW5ndGg7KSsrdCxlPWkrdigpLGkrPXMuc2V0dGluZ3MubW92ZVNsaWRlczw9digpP3Muc2V0dGluZ3MubW92ZVNsaWRlczp2KCk7ZWxzZSB0PU1hdGguY2VpbChzLmNoaWxkcmVuLmxlbmd0aC92KCkpO3JldHVybiB0fSx4PWZ1bmN0aW9uKCl7cmV0dXJuIHMuc2V0dGluZ3MubW92ZVNsaWRlcz4wJiZzLnNldHRpbmdzLm1vdmVTbGlkZXM8PXYoKT9zLnNldHRpbmdzLm1vdmVTbGlkZXM6digpfSxtPWZ1bmN0aW9uKCl7dmFyIHQsZSxpO3MuY2hpbGRyZW4ubGVuZ3RoPnMuc2V0dGluZ3MubWF4U2xpZGVzJiZzLmFjdGl2ZS5sYXN0JiYhcy5zZXR0aW5ncy5pbmZpbml0ZUxvb3A/XCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGU/KGU9cy5jaGlsZHJlbi5sYXN0KCksdD1lLnBvc2l0aW9uKCksUygtKHQubGVmdC0ocy52aWV3cG9ydC53aWR0aCgpLWUub3V0ZXJXaWR0aCgpKSksXCJyZXNldFwiLDApKTpcInZlcnRpY2FsXCI9PT1zLnNldHRpbmdzLm1vZGUmJihpPXMuY2hpbGRyZW4ubGVuZ3RoLXMuc2V0dGluZ3MubWluU2xpZGVzLHQ9cy5jaGlsZHJlbi5lcShpKS5wb3NpdGlvbigpLFMoLXQudG9wLFwicmVzZXRcIiwwKSk6KHQ9cy5jaGlsZHJlbi5lcShzLmFjdGl2ZS5pbmRleCp4KCkpLnBvc2l0aW9uKCkscy5hY3RpdmUuaW5kZXg9PT1mKCktMSYmKHMuYWN0aXZlLmxhc3Q9ITApLHZvaWQgMCE9PXQmJihcImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT9TKC10LmxlZnQsXCJyZXNldFwiLDApOlwidmVydGljYWxcIj09PXMuc2V0dGluZ3MubW9kZSYmUygtdC50b3AsXCJyZXNldFwiLDApKSl9LFM9ZnVuY3Rpb24oZSxpLG4scil7dmFyIGEsbDtzLnVzaW5nQ1NTPyhsPVwidmVydGljYWxcIj09PXMuc2V0dGluZ3MubW9kZT9cInRyYW5zbGF0ZTNkKDAsIFwiK2UrXCJweCwgMClcIjpcInRyYW5zbGF0ZTNkKFwiK2UrXCJweCwgMCwgMClcIixvLmNzcyhcIi1cIitzLmNzc1ByZWZpeCtcIi10cmFuc2l0aW9uLWR1cmF0aW9uXCIsbi8xZTMrXCJzXCIpLFwic2xpZGVcIj09PWk/KG8uY3NzKHMuYW5pbVByb3AsbCksMCE9PW4/by5iaW5kKFwidHJhbnNpdGlvbmVuZCB3ZWJraXRUcmFuc2l0aW9uRW5kIG9UcmFuc2l0aW9uRW5kIE1TVHJhbnNpdGlvbkVuZFwiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8pJiYoby51bmJpbmQoXCJ0cmFuc2l0aW9uZW5kIHdlYmtpdFRyYW5zaXRpb25FbmQgb1RyYW5zaXRpb25FbmQgTVNUcmFuc2l0aW9uRW5kXCIpLHEoKSl9KTpxKCkpOlwicmVzZXRcIj09PWk/by5jc3Mocy5hbmltUHJvcCxsKTpcInRpY2tlclwiPT09aSYmKG8uY3NzKFwiLVwiK3MuY3NzUHJlZml4K1wiLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uXCIsXCJsaW5lYXJcIiksby5jc3Mocy5hbmltUHJvcCxsKSwwIT09bj9vLmJpbmQoXCJ0cmFuc2l0aW9uZW5kIHdlYmtpdFRyYW5zaXRpb25FbmQgb1RyYW5zaXRpb25FbmQgTVNUcmFuc2l0aW9uRW5kXCIsZnVuY3Rpb24oZSl7dChlLnRhcmdldCkuaXMobykmJihvLnVuYmluZChcInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmRcIiksUyhyLnJlc2V0VmFsdWUsXCJyZXNldFwiLDApLEwoKSl9KTooUyhyLnJlc2V0VmFsdWUsXCJyZXNldFwiLDApLEwoKSkpKTooYT17fSxhW3MuYW5pbVByb3BdPWUsXCJzbGlkZVwiPT09aT9vLmFuaW1hdGUoYSxuLHMuc2V0dGluZ3MuZWFzaW5nLGZ1bmN0aW9uKCl7cSgpfSk6XCJyZXNldFwiPT09aT9vLmNzcyhzLmFuaW1Qcm9wLGUpOlwidGlja2VyXCI9PT1pJiZvLmFuaW1hdGUoYSxuLFwibGluZWFyXCIsZnVuY3Rpb24oKXtTKHIucmVzZXRWYWx1ZSxcInJlc2V0XCIsMCksTCgpfSkpfSxiPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVwiXCIsaT1cIlwiLG49ZigpLG89MDtvPG47bysrKWk9XCJcIixzLnNldHRpbmdzLmJ1aWxkUGFnZXImJnQuaXNGdW5jdGlvbihzLnNldHRpbmdzLmJ1aWxkUGFnZXIpfHxzLnNldHRpbmdzLnBhZ2VyQ3VzdG9tPyhpPXMuc2V0dGluZ3MuYnVpbGRQYWdlcihvKSxzLnBhZ2VyRWwuYWRkQ2xhc3MoXCJieC1jdXN0b20tcGFnZXJcIikpOihpPW8rMSxzLnBhZ2VyRWwuYWRkQ2xhc3MoXCJieC1kZWZhdWx0LXBhZ2VyXCIpKSxlKz0nPGRpdiBjbGFzcz1cImJ4LXBhZ2VyLWl0ZW1cIj48YSBocmVmPVwiXCIgZGF0YS1zbGlkZS1pbmRleD1cIicrbysnXCIgY2xhc3M9XCJieC1wYWdlci1saW5rXCI+JytpK1wiPC9hPjwvZGl2PlwiO3MucGFnZXJFbC5odG1sKGUpfSx3PWZ1bmN0aW9uKCl7cy5zZXR0aW5ncy5wYWdlckN1c3RvbT9zLnBhZ2VyRWw9dChzLnNldHRpbmdzLnBhZ2VyQ3VzdG9tKToocy5wYWdlckVsPXQoJzxkaXYgY2xhc3M9XCJieC1wYWdlclwiIC8+Jykscy5zZXR0aW5ncy5wYWdlclNlbGVjdG9yP3Qocy5zZXR0aW5ncy5wYWdlclNlbGVjdG9yKS5odG1sKHMucGFnZXJFbCk6cy5jb250cm9scy5lbC5hZGRDbGFzcyhcImJ4LWhhcy1wYWdlclwiKS5hcHBlbmQocy5wYWdlckVsKSxiKCkpLHMucGFnZXJFbC5vbihcImNsaWNrIHRvdWNoZW5kXCIsXCJhXCIseil9LEM9ZnVuY3Rpb24oKXtzLmNvbnRyb2xzLm5leHQ9dCgnPGEgY2xhc3M9XCJieC1uZXh0XCIgaHJlZj1cIlwiPicrcy5zZXR0aW5ncy5uZXh0VGV4dCtcIjwvYT5cIikscy5jb250cm9scy5wcmV2PXQoJzxhIGNsYXNzPVwiYngtcHJldlwiIGhyZWY9XCJcIj4nK3Muc2V0dGluZ3MucHJldlRleHQrXCI8L2E+XCIpLHMuY29udHJvbHMubmV4dC5iaW5kKFwiY2xpY2sgdG91Y2hlbmRcIixFKSxzLmNvbnRyb2xzLnByZXYuYmluZChcImNsaWNrIHRvdWNoZW5kXCIsaykscy5zZXR0aW5ncy5uZXh0U2VsZWN0b3ImJnQocy5zZXR0aW5ncy5uZXh0U2VsZWN0b3IpLmFwcGVuZChzLmNvbnRyb2xzLm5leHQpLHMuc2V0dGluZ3MucHJldlNlbGVjdG9yJiZ0KHMuc2V0dGluZ3MucHJldlNlbGVjdG9yKS5hcHBlbmQocy5jb250cm9scy5wcmV2KSxzLnNldHRpbmdzLm5leHRTZWxlY3Rvcnx8cy5zZXR0aW5ncy5wcmV2U2VsZWN0b3J8fChzLmNvbnRyb2xzLmRpcmVjdGlvbkVsPXQoJzxkaXYgY2xhc3M9XCJieC1jb250cm9scy1kaXJlY3Rpb25cIiAvPicpLHMuY29udHJvbHMuZGlyZWN0aW9uRWwuYXBwZW5kKHMuY29udHJvbHMucHJldikuYXBwZW5kKHMuY29udHJvbHMubmV4dCkscy5jb250cm9scy5lbC5hZGRDbGFzcyhcImJ4LWhhcy1jb250cm9scy1kaXJlY3Rpb25cIikuYXBwZW5kKHMuY29udHJvbHMuZGlyZWN0aW9uRWwpKX0sVD1mdW5jdGlvbigpe3MuY29udHJvbHMuc3RhcnQ9dCgnPGRpdiBjbGFzcz1cImJ4LWNvbnRyb2xzLWF1dG8taXRlbVwiPjxhIGNsYXNzPVwiYngtc3RhcnRcIiBocmVmPVwiXCI+JytzLnNldHRpbmdzLnN0YXJ0VGV4dCtcIjwvYT48L2Rpdj5cIikscy5jb250cm9scy5zdG9wPXQoJzxkaXYgY2xhc3M9XCJieC1jb250cm9scy1hdXRvLWl0ZW1cIj48YSBjbGFzcz1cImJ4LXN0b3BcIiBocmVmPVwiXCI+JytzLnNldHRpbmdzLnN0b3BUZXh0K1wiPC9hPjwvZGl2PlwiKSxzLmNvbnRyb2xzLmF1dG9FbD10KCc8ZGl2IGNsYXNzPVwiYngtY29udHJvbHMtYXV0b1wiIC8+Jykscy5jb250cm9scy5hdXRvRWwub24oXCJjbGlja1wiLFwiLmJ4LXN0YXJ0XCIsTSkscy5jb250cm9scy5hdXRvRWwub24oXCJjbGlja1wiLFwiLmJ4LXN0b3BcIix5KSxzLnNldHRpbmdzLmF1dG9Db250cm9sc0NvbWJpbmU/cy5jb250cm9scy5hdXRvRWwuYXBwZW5kKHMuY29udHJvbHMuc3RhcnQpOnMuY29udHJvbHMuYXV0b0VsLmFwcGVuZChzLmNvbnRyb2xzLnN0YXJ0KS5hcHBlbmQocy5jb250cm9scy5zdG9wKSxzLnNldHRpbmdzLmF1dG9Db250cm9sc1NlbGVjdG9yP3Qocy5zZXR0aW5ncy5hdXRvQ29udHJvbHNTZWxlY3RvcikuaHRtbChzLmNvbnRyb2xzLmF1dG9FbCk6cy5jb250cm9scy5lbC5hZGRDbGFzcyhcImJ4LWhhcy1jb250cm9scy1hdXRvXCIpLmFwcGVuZChzLmNvbnRyb2xzLmF1dG9FbCksQShzLnNldHRpbmdzLmF1dG9TdGFydD9cInN0b3BcIjpcInN0YXJ0XCIpfSxQPWZ1bmN0aW9uKCl7cy5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBpPXQodGhpcykuZmluZChcImltZzpmaXJzdFwiKS5hdHRyKFwidGl0bGVcIik7dm9pZCAwIT09aSYmKFwiXCIraSkubGVuZ3RoJiZ0KHRoaXMpLmFwcGVuZCgnPGRpdiBjbGFzcz1cImJ4LWNhcHRpb25cIj48c3Bhbj4nK2krXCI8L3NwYW4+PC9kaXY+XCIpfSl9LEU9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwuaGFzQ2xhc3MoXCJkaXNhYmxlZFwiKXx8KHMuc2V0dGluZ3MuYXV0byYmcy5zZXR0aW5ncy5zdG9wQXV0b09uQ2xpY2smJm8uc3RvcEF1dG8oKSxvLmdvVG9OZXh0U2xpZGUoKSl9LGs9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwuaGFzQ2xhc3MoXCJkaXNhYmxlZFwiKXx8KHMuc2V0dGluZ3MuYXV0byYmcy5zZXR0aW5ncy5zdG9wQXV0b09uQ2xpY2smJm8uc3RvcEF1dG8oKSxvLmdvVG9QcmV2U2xpZGUoKSl9LE09ZnVuY3Rpb24odCl7by5zdGFydEF1dG8oKSx0LnByZXZlbnREZWZhdWx0KCl9LHk9ZnVuY3Rpb24odCl7by5zdG9wQXV0bygpLHQucHJldmVudERlZmF1bHQoKX0sej1mdW5jdGlvbihlKXt2YXIgaSxuO2UucHJldmVudERlZmF1bHQoKSxzLmNvbnRyb2xzLmVsLmhhc0NsYXNzKFwiZGlzYWJsZWRcIil8fChzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrJiZvLnN0b3BBdXRvKCksaT10KGUuY3VycmVudFRhcmdldCksdm9pZCAwIT09aS5hdHRyKFwiZGF0YS1zbGlkZS1pbmRleFwiKSYmKG49cGFyc2VJbnQoaS5hdHRyKFwiZGF0YS1zbGlkZS1pbmRleFwiKSksbiE9PXMuYWN0aXZlLmluZGV4JiZvLmdvVG9TbGlkZShuKSkpfSxJPWZ1bmN0aW9uKGUpe3ZhciBpPXMuY2hpbGRyZW4ubGVuZ3RoO3JldHVyblwic2hvcnRcIj09PXMuc2V0dGluZ3MucGFnZXJUeXBlPyhzLnNldHRpbmdzLm1heFNsaWRlcz4xJiYoaT1NYXRoLmNlaWwocy5jaGlsZHJlbi5sZW5ndGgvcy5zZXR0aW5ncy5tYXhTbGlkZXMpKSx2b2lkIHMucGFnZXJFbC5odG1sKGUrMStzLnNldHRpbmdzLnBhZ2VyU2hvcnRTZXBhcmF0b3IraSkpOihzLnBhZ2VyRWwuZmluZChcImFcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIiksdm9pZCBzLnBhZ2VyRWwuZWFjaChmdW5jdGlvbihpLG4pe3QobikuZmluZChcImFcIikuZXEoZSkuYWRkQ2xhc3MoXCJhY3RpdmVcIil9KSl9LHE9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmluZmluaXRlTG9vcCl7dmFyIHQ9XCJcIjswPT09cy5hY3RpdmUuaW5kZXg/dD1zLmNoaWxkcmVuLmVxKDApLnBvc2l0aW9uKCk6cy5hY3RpdmUuaW5kZXg9PT1mKCktMSYmcy5jYXJvdXNlbD90PXMuY2hpbGRyZW4uZXEoKGYoKS0xKSp4KCkpLnBvc2l0aW9uKCk6cy5hY3RpdmUuaW5kZXg9PT1zLmNoaWxkcmVuLmxlbmd0aC0xJiYodD1zLmNoaWxkcmVuLmVxKHMuY2hpbGRyZW4ubGVuZ3RoLTEpLnBvc2l0aW9uKCkpLHQmJihcImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT9TKC10LmxlZnQsXCJyZXNldFwiLDApOlwidmVydGljYWxcIj09PXMuc2V0dGluZ3MubW9kZSYmUygtdC50b3AsXCJyZXNldFwiLDApKX1zLndvcmtpbmc9ITEscy5zZXR0aW5ncy5vblNsaWRlQWZ0ZXIuY2FsbChvLHMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgpLHMub2xkSW5kZXgscy5hY3RpdmUuaW5kZXgpfSxBPWZ1bmN0aW9uKHQpe3Muc2V0dGluZ3MuYXV0b0NvbnRyb2xzQ29tYmluZT9zLmNvbnRyb2xzLmF1dG9FbC5odG1sKHMuY29udHJvbHNbdF0pOihzLmNvbnRyb2xzLmF1dG9FbC5maW5kKFwiYVwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKSxzLmNvbnRyb2xzLmF1dG9FbC5maW5kKFwiYTpub3QoLmJ4LVwiK3QrXCIpXCIpLmFkZENsYXNzKFwiYWN0aXZlXCIpKX0sRD1mdW5jdGlvbigpezE9PT1mKCk/KHMuY29udHJvbHMucHJldi5hZGRDbGFzcyhcImRpc2FibGVkXCIpLHMuY29udHJvbHMubmV4dC5hZGRDbGFzcyhcImRpc2FibGVkXCIpKTohcy5zZXR0aW5ncy5pbmZpbml0ZUxvb3AmJnMuc2V0dGluZ3MuaGlkZUNvbnRyb2xPbkVuZCYmKDA9PT1zLmFjdGl2ZS5pbmRleD8ocy5jb250cm9scy5wcmV2LmFkZENsYXNzKFwiZGlzYWJsZWRcIikscy5jb250cm9scy5uZXh0LnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIikpOnMuYWN0aXZlLmluZGV4PT09ZigpLTE/KHMuY29udHJvbHMubmV4dC5hZGRDbGFzcyhcImRpc2FibGVkXCIpLHMuY29udHJvbHMucHJldi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpKToocy5jb250cm9scy5wcmV2LnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIikscy5jb250cm9scy5uZXh0LnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIikpKX0sSD1mdW5jdGlvbigpe2lmKHMuc2V0dGluZ3MuYXV0b0RlbGF5PjApe3NldFRpbWVvdXQoby5zdGFydEF1dG8scy5zZXR0aW5ncy5hdXRvRGVsYXkpfWVsc2Ugby5zdGFydEF1dG8oKSx0KHdpbmRvdykuZm9jdXMoZnVuY3Rpb24oKXtvLnN0YXJ0QXV0bygpfSkuYmx1cihmdW5jdGlvbigpe28uc3RvcEF1dG8oKX0pO3Muc2V0dGluZ3MuYXV0b0hvdmVyJiZvLmhvdmVyKGZ1bmN0aW9uKCl7cy5pbnRlcnZhbCYmKG8uc3RvcEF1dG8oITApLHMuYXV0b1BhdXNlZD0hMCl9LGZ1bmN0aW9uKCl7cy5hdXRvUGF1c2VkJiYoby5zdGFydEF1dG8oITApLHMuYXV0b1BhdXNlZD1udWxsKX0pfSxXPWZ1bmN0aW9uKCl7dmFyIGUsaSxuLHIsYSxsLGQsYyxnPTA7XCJuZXh0XCI9PT1zLnNldHRpbmdzLmF1dG9EaXJlY3Rpb24/by5hcHBlbmQocy5jaGlsZHJlbi5jbG9uZSgpLmFkZENsYXNzKFwiYngtY2xvbmVcIikpOihvLnByZXBlbmQocy5jaGlsZHJlbi5jbG9uZSgpLmFkZENsYXNzKFwiYngtY2xvbmVcIikpLGU9cy5jaGlsZHJlbi5maXJzdCgpLnBvc2l0aW9uKCksZz1cImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT8tZS5sZWZ0Oi1lLnRvcCksUyhnLFwicmVzZXRcIiwwKSxzLnNldHRpbmdzLnBhZ2VyPSExLHMuc2V0dGluZ3MuY29udHJvbHM9ITEscy5zZXR0aW5ncy5hdXRvQ29udHJvbHM9ITEscy5zZXR0aW5ncy50aWNrZXJIb3ZlciYmKHMudXNpbmdDU1M/KHI9XCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGU/NDo1LHMudmlld3BvcnQuaG92ZXIoZnVuY3Rpb24oKXtpPW8uY3NzKFwiLVwiK3MuY3NzUHJlZml4K1wiLXRyYW5zZm9ybVwiKSxuPXBhcnNlRmxvYXQoaS5zcGxpdChcIixcIilbcl0pLFMobixcInJlc2V0XCIsMCl9LGZ1bmN0aW9uKCl7Yz0wLHMuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihlKXtjKz1cImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT90KHRoaXMpLm91dGVyV2lkdGgoITApOnQodGhpcykub3V0ZXJIZWlnaHQoITApfSksYT1zLnNldHRpbmdzLnNwZWVkL2MsbD1cImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT9cImxlZnRcIjpcInRvcFwiLGQ9YSooYy1NYXRoLmFicyhwYXJzZUludChuKSkpLEwoZCl9KSk6cy52aWV3cG9ydC5ob3ZlcihmdW5jdGlvbigpe28uc3RvcCgpfSxmdW5jdGlvbigpe2M9MCxzLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oZSl7Yys9XCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGU/dCh0aGlzKS5vdXRlcldpZHRoKCEwKTp0KHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLGE9cy5zZXR0aW5ncy5zcGVlZC9jLGw9XCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGU/XCJsZWZ0XCI6XCJ0b3BcIixkPWEqKGMtTWF0aC5hYnMocGFyc2VJbnQoby5jc3MobCkpKSksTChkKX0pKSxMKCl9LEw9ZnVuY3Rpb24odCl7dmFyIGUsaSxuLHI9dD90OnMuc2V0dGluZ3Muc3BlZWQsYT17bGVmdDowLHRvcDowfSxsPXtsZWZ0OjAsdG9wOjB9O1wibmV4dFwiPT09cy5zZXR0aW5ncy5hdXRvRGlyZWN0aW9uP2E9by5maW5kKFwiLmJ4LWNsb25lXCIpLmZpcnN0KCkucG9zaXRpb24oKTpsPXMuY2hpbGRyZW4uZmlyc3QoKS5wb3NpdGlvbigpLGU9XCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGU/LWEubGVmdDotYS50b3AsaT1cImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT8tbC5sZWZ0Oi1sLnRvcCxuPXtyZXNldFZhbHVlOml9LFMoZSxcInRpY2tlclwiLHIsbil9LE89ZnVuY3Rpb24oZSl7dmFyIGk9dCh3aW5kb3cpLG49e3RvcDppLnNjcm9sbFRvcCgpLGxlZnQ6aS5zY3JvbGxMZWZ0KCl9LHM9ZS5vZmZzZXQoKTtyZXR1cm4gbi5yaWdodD1uLmxlZnQraS53aWR0aCgpLG4uYm90dG9tPW4udG9wK2kuaGVpZ2h0KCkscy5yaWdodD1zLmxlZnQrZS5vdXRlcldpZHRoKCkscy5ib3R0b209cy50b3ArZS5vdXRlckhlaWdodCgpLCEobi5yaWdodDxzLmxlZnR8fG4ubGVmdD5zLnJpZ2h0fHxuLmJvdHRvbTxzLnRvcHx8bi50b3A+cy5ib3R0b20pfSxGPWZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLGk9XCJpbnB1dHx0ZXh0YXJlYVwiLG49bmV3IFJlZ0V4cChlLFtcImlcIl0pLHM9bi5leGVjKGkpO2lmKG51bGw9PXMmJk8obykpe2lmKDM5PT09dC5rZXlDb2RlKXJldHVybiBFKHQpLCExO2lmKDM3PT09dC5rZXlDb2RlKXJldHVybiBrKHQpLCExfX0sTj1mdW5jdGlvbigpe3MudG91Y2g9e3N0YXJ0Ont4OjAseTowfSxlbmQ6e3g6MCx5OjB9fSxzLnZpZXdwb3J0LmJpbmQoXCJ0b3VjaHN0YXJ0IE1TUG9pbnRlckRvd24gcG9pbnRlcmRvd25cIixYKSxzLnZpZXdwb3J0Lm9uKFwiY2xpY2tcIixcIi5ieHNsaWRlciBhXCIsZnVuY3Rpb24odCl7cy52aWV3cG9ydC5oYXNDbGFzcyhcImNsaWNrLWRpc2FibGVkXCIpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHMudmlld3BvcnQucmVtb3ZlQ2xhc3MoXCJjbGljay1kaXNhYmxlZFwiKSl9KX0sWD1mdW5jdGlvbih0KXtpZihzLmNvbnRyb2xzLmVsLmFkZENsYXNzKFwiZGlzYWJsZWRcIikscy53b3JraW5nKXQucHJldmVudERlZmF1bHQoKSxzLmNvbnRyb2xzLmVsLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7ZWxzZXtzLnRvdWNoLm9yaWdpbmFsUG9zPW8ucG9zaXRpb24oKTt2YXIgZT10Lm9yaWdpbmFsRXZlbnQsaT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZS5jaGFuZ2VkVG91Y2hlcz9lLmNoYW5nZWRUb3VjaGVzOltlXTtzLnRvdWNoLnN0YXJ0Lng9aVswXS5wYWdlWCxzLnRvdWNoLnN0YXJ0Lnk9aVswXS5wYWdlWSxzLnZpZXdwb3J0LmdldCgwKS5zZXRQb2ludGVyQ2FwdHVyZSYmKHMucG9pbnRlcklkPWUucG9pbnRlcklkLHMudmlld3BvcnQuZ2V0KDApLnNldFBvaW50ZXJDYXB0dXJlKHMucG9pbnRlcklkKSkscy52aWV3cG9ydC5iaW5kKFwidG91Y2htb3ZlIE1TUG9pbnRlck1vdmUgcG9pbnRlcm1vdmVcIixWKSxzLnZpZXdwb3J0LmJpbmQoXCJ0b3VjaGVuZCBNU1BvaW50ZXJVcCBwb2ludGVydXBcIixSKSxzLnZpZXdwb3J0LmJpbmQoXCJNU1BvaW50ZXJDYW5jZWwgcG9pbnRlcmNhbmNlbFwiLFkpfX0sWT1mdW5jdGlvbih0KXtTKHMudG91Y2gub3JpZ2luYWxQb3MubGVmdCxcInJlc2V0XCIsMCkscy5jb250cm9scy5lbC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpLHMudmlld3BvcnQudW5iaW5kKFwiTVNQb2ludGVyQ2FuY2VsIHBvaW50ZXJjYW5jZWxcIixZKSxzLnZpZXdwb3J0LnVuYmluZChcInRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlXCIsVikscy52aWV3cG9ydC51bmJpbmQoXCJ0b3VjaGVuZCBNU1BvaW50ZXJVcCBwb2ludGVydXBcIixSKSxzLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUmJnMudmlld3BvcnQuZ2V0KDApLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShzLnBvaW50ZXJJZCl9LFY9ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LGk9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGUuY2hhbmdlZFRvdWNoZXM/ZS5jaGFuZ2VkVG91Y2hlczpbZV0sbj1NYXRoLmFicyhpWzBdLnBhZ2VYLXMudG91Y2guc3RhcnQueCksbz1NYXRoLmFicyhpWzBdLnBhZ2VZLXMudG91Y2guc3RhcnQueSkscj0wLGE9MDszKm4+byYmcy5zZXR0aW5ncy5wcmV2ZW50RGVmYXVsdFN3aXBlWD90LnByZXZlbnREZWZhdWx0KCk6MypvPm4mJnMuc2V0dGluZ3MucHJldmVudERlZmF1bHRTd2lwZVkmJnQucHJldmVudERlZmF1bHQoKSxcImZhZGVcIiE9PXMuc2V0dGluZ3MubW9kZSYmcy5zZXR0aW5ncy5vbmVUb09uZVRvdWNoJiYoXCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGU/KGE9aVswXS5wYWdlWC1zLnRvdWNoLnN0YXJ0Lngscj1zLnRvdWNoLm9yaWdpbmFsUG9zLmxlZnQrYSk6KGE9aVswXS5wYWdlWS1zLnRvdWNoLnN0YXJ0Lnkscj1zLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCthKSxTKHIsXCJyZXNldFwiLDApKX0sUj1mdW5jdGlvbih0KXtzLnZpZXdwb3J0LnVuYmluZChcInRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlXCIsVikscy5jb250cm9scy5lbC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO3ZhciBlPXQub3JpZ2luYWxFdmVudCxpPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBlLmNoYW5nZWRUb3VjaGVzP2UuY2hhbmdlZFRvdWNoZXM6W2VdLG49MCxyPTA7cy50b3VjaC5lbmQueD1pWzBdLnBhZ2VYLHMudG91Y2guZW5kLnk9aVswXS5wYWdlWSxcImZhZGVcIj09PXMuc2V0dGluZ3MubW9kZT8ocj1NYXRoLmFicyhzLnRvdWNoLnN0YXJ0Lngtcy50b3VjaC5lbmQueCkscj49cy5zZXR0aW5ncy5zd2lwZVRocmVzaG9sZCYmKHMudG91Y2guc3RhcnQueD5zLnRvdWNoLmVuZC54P28uZ29Ub05leHRTbGlkZSgpOm8uZ29Ub1ByZXZTbGlkZSgpLG8uc3RvcEF1dG8oKSkpOihcImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT8ocj1zLnRvdWNoLmVuZC54LXMudG91Y2guc3RhcnQueCxuPXMudG91Y2gub3JpZ2luYWxQb3MubGVmdCk6KHI9cy50b3VjaC5lbmQueS1zLnRvdWNoLnN0YXJ0Lnksbj1zLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCksIXMuc2V0dGluZ3MuaW5maW5pdGVMb29wJiYoMD09PXMuYWN0aXZlLmluZGV4JiZyPjB8fHMuYWN0aXZlLmxhc3QmJnI8MCk/UyhuLFwicmVzZXRcIiwyMDApOk1hdGguYWJzKHIpPj1zLnNldHRpbmdzLnN3aXBlVGhyZXNob2xkPyhyPDA/by5nb1RvTmV4dFNsaWRlKCk6by5nb1RvUHJldlNsaWRlKCksby5zdG9wQXV0bygpKTpTKG4sXCJyZXNldFwiLDIwMCkpLHMudmlld3BvcnQudW5iaW5kKFwidG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwXCIsUikscy52aWV3cG9ydC5nZXQoMCkucmVsZWFzZVBvaW50ZXJDYXB0dXJlJiZzLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUocy5wb2ludGVySWQpfSxaPWZ1bmN0aW9uKGUpe2lmKHMuaW5pdGlhbGl6ZWQpaWYocy53b3JraW5nKXdpbmRvdy5zZXRUaW1lb3V0KFosMTApO2Vsc2V7dmFyIGk9dCh3aW5kb3cpLndpZHRoKCksbj10KHdpbmRvdykuaGVpZ2h0KCk7cj09PWkmJmE9PT1ufHwocj1pLGE9bixvLnJlZHJhd1NsaWRlcigpLHMuc2V0dGluZ3Mub25TbGlkZXJSZXNpemUuY2FsbChvLHMuYWN0aXZlLmluZGV4KSl9fSxCPWZ1bmN0aW9uKHQpe3ZhciBlPXYoKTtzLnNldHRpbmdzLmFyaWFIaWRkZW4mJiFzLnNldHRpbmdzLnRpY2tlciYmKHMuY2hpbGRyZW4uYXR0cihcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLHMuY2hpbGRyZW4uc2xpY2UodCx0K2UpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIikpfSxVPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/cy5zZXR0aW5ncy5pbmZpbml0ZUxvb3A/ZigpLTE6cy5hY3RpdmUuaW5kZXg6dD49ZigpP3Muc2V0dGluZ3MuaW5maW5pdGVMb29wPzA6cy5hY3RpdmUuaW5kZXg6dH07cmV0dXJuIG8uZ29Ub1NsaWRlPWZ1bmN0aW9uKGUsaSl7dmFyIG4scixhLGwsZD0hMCxjPTAsZz17bGVmdDowLHRvcDowfSx1PW51bGw7aWYocy5vbGRJbmRleD1zLmFjdGl2ZS5pbmRleCxzLmFjdGl2ZS5pbmRleD1VKGUpLCFzLndvcmtpbmcmJnMuYWN0aXZlLmluZGV4IT09cy5vbGRJbmRleCl7aWYocy53b3JraW5nPSEwLGQ9cy5zZXR0aW5ncy5vblNsaWRlQmVmb3JlLmNhbGwobyxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KSxzLm9sZEluZGV4LHMuYWN0aXZlLmluZGV4KSxcInVuZGVmaW5lZFwiIT10eXBlb2YgZCYmIWQpcmV0dXJuIHMuYWN0aXZlLmluZGV4PXMub2xkSW5kZXgsdm9pZChzLndvcmtpbmc9ITEpO1wibmV4dFwiPT09aT9zLnNldHRpbmdzLm9uU2xpZGVOZXh0LmNhbGwobyxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KSxzLm9sZEluZGV4LHMuYWN0aXZlLmluZGV4KXx8KGQ9ITEpOlwicHJldlwiPT09aSYmKHMuc2V0dGluZ3Mub25TbGlkZVByZXYuY2FsbChvLHMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgpLHMub2xkSW5kZXgscy5hY3RpdmUuaW5kZXgpfHwoZD0hMSkpLHMuYWN0aXZlLmxhc3Q9cy5hY3RpdmUuaW5kZXg+PWYoKS0xLChzLnNldHRpbmdzLnBhZ2VyfHxzLnNldHRpbmdzLnBhZ2VyQ3VzdG9tKSYmSShzLmFjdGl2ZS5pbmRleCkscy5zZXR0aW5ncy5jb250cm9scyYmRCgpLFwiZmFkZVwiPT09cy5zZXR0aW5ncy5tb2RlPyhzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0JiZzLnZpZXdwb3J0LmhlaWdodCgpIT09cCgpJiZzLnZpZXdwb3J0LmFuaW1hdGUoe2hlaWdodDpwKCl9LHMuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHRTcGVlZCkscy5jaGlsZHJlbi5maWx0ZXIoXCI6dmlzaWJsZVwiKS5mYWRlT3V0KHMuc2V0dGluZ3Muc3BlZWQpLmNzcyh7ekluZGV4OjB9KSxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KS5jc3MoXCJ6SW5kZXhcIixzLnNldHRpbmdzLnNsaWRlWkluZGV4KzEpLmZhZGVJbihzLnNldHRpbmdzLnNwZWVkLGZ1bmN0aW9uKCl7dCh0aGlzKS5jc3MoXCJ6SW5kZXhcIixzLnNldHRpbmdzLnNsaWRlWkluZGV4KSxxKCl9KSk6KHMuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHQmJnMudmlld3BvcnQuaGVpZ2h0KCkhPT1wKCkmJnMudmlld3BvcnQuYW5pbWF0ZSh7aGVpZ2h0OnAoKX0scy5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodFNwZWVkKSwhcy5zZXR0aW5ncy5pbmZpbml0ZUxvb3AmJnMuY2Fyb3VzZWwmJnMuYWN0aXZlLmxhc3Q/XCJob3Jpem9udGFsXCI9PT1zLnNldHRpbmdzLm1vZGU/KHU9cy5jaGlsZHJlbi5lcShzLmNoaWxkcmVuLmxlbmd0aC0xKSxnPXUucG9zaXRpb24oKSxjPXMudmlld3BvcnQud2lkdGgoKS11Lm91dGVyV2lkdGgoKSk6KG49cy5jaGlsZHJlbi5sZW5ndGgtcy5zZXR0aW5ncy5taW5TbGlkZXMsZz1zLmNoaWxkcmVuLmVxKG4pLnBvc2l0aW9uKCkpOnMuY2Fyb3VzZWwmJnMuYWN0aXZlLmxhc3QmJlwicHJldlwiPT09aT8ocj0xPT09cy5zZXR0aW5ncy5tb3ZlU2xpZGVzP3Muc2V0dGluZ3MubWF4U2xpZGVzLXgoKTooZigpLTEpKngoKS0ocy5jaGlsZHJlbi5sZW5ndGgtcy5zZXR0aW5ncy5tYXhTbGlkZXMpLHU9by5jaGlsZHJlbihcIi5ieC1jbG9uZVwiKS5lcShyKSxnPXUucG9zaXRpb24oKSk6XCJuZXh0XCI9PT1pJiYwPT09cy5hY3RpdmUuaW5kZXg/KGc9by5maW5kKFwiPiAuYngtY2xvbmVcIikuZXEocy5zZXR0aW5ncy5tYXhTbGlkZXMpLnBvc2l0aW9uKCkscy5hY3RpdmUubGFzdD0hMSk6ZT49MCYmKGw9ZSpwYXJzZUludCh4KCkpLGc9cy5jaGlsZHJlbi5lcShsKS5wb3NpdGlvbigpKSxcInVuZGVmaW5lZFwiIT10eXBlb2YgZz8oYT1cImhvcml6b250YWxcIj09PXMuc2V0dGluZ3MubW9kZT8tKGcubGVmdC1jKTotZy50b3AsUyhhLFwic2xpZGVcIixzLnNldHRpbmdzLnNwZWVkKSk6cy53b3JraW5nPSExKSxzLnNldHRpbmdzLmFyaWFIaWRkZW4mJkIocy5hY3RpdmUuaW5kZXgqeCgpKX19LG8uZ29Ub05leHRTbGlkZT1mdW5jdGlvbigpe2lmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wfHwhcy5hY3RpdmUubGFzdCl7dmFyIHQ9cGFyc2VJbnQocy5hY3RpdmUuaW5kZXgpKzE7by5nb1RvU2xpZGUodCxcIm5leHRcIil9fSxvLmdvVG9QcmV2U2xpZGU9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmluZmluaXRlTG9vcHx8MCE9PXMuYWN0aXZlLmluZGV4KXt2YXIgdD1wYXJzZUludChzLmFjdGl2ZS5pbmRleCktMTtvLmdvVG9TbGlkZSh0LFwicHJldlwiKX19LG8uc3RhcnRBdXRvPWZ1bmN0aW9uKHQpe3MuaW50ZXJ2YWx8fChzLmludGVydmFsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7XCJuZXh0XCI9PT1zLnNldHRpbmdzLmF1dG9EaXJlY3Rpb24/by5nb1RvTmV4dFNsaWRlKCk6by5nb1RvUHJldlNsaWRlKCl9LHMuc2V0dGluZ3MucGF1c2UpLHMuc2V0dGluZ3MuYXV0b0NvbnRyb2xzJiZ0IT09ITAmJkEoXCJzdG9wXCIpKX0sby5zdG9wQXV0bz1mdW5jdGlvbih0KXtzLmludGVydmFsJiYoY2xlYXJJbnRlcnZhbChzLmludGVydmFsKSxzLmludGVydmFsPW51bGwscy5zZXR0aW5ncy5hdXRvQ29udHJvbHMmJnQhPT0hMCYmQShcInN0YXJ0XCIpKX0sby5nZXRDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gcy5hY3RpdmUuaW5kZXh9LG8uZ2V0Q3VycmVudFNsaWRlRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiBzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KX0sby5nZXRTbGlkZUVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHMuY2hpbGRyZW4uZXEodCl9LG8uZ2V0U2xpZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiBzLmNoaWxkcmVuLmxlbmd0aH0sby5pc1dvcmtpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcy53b3JraW5nfSxvLnJlZHJhd1NsaWRlcj1mdW5jdGlvbigpe3MuY2hpbGRyZW4uYWRkKG8uZmluZChcIi5ieC1jbG9uZVwiKSkub3V0ZXJXaWR0aChoKCkpLHMudmlld3BvcnQuY3NzKFwiaGVpZ2h0XCIscCgpKSxzLnNldHRpbmdzLnRpY2tlcnx8bSgpLHMuYWN0aXZlLmxhc3QmJihzLmFjdGl2ZS5pbmRleD1mKCktMSkscy5hY3RpdmUuaW5kZXg+PWYoKSYmKHMuYWN0aXZlLmxhc3Q9ITApLHMuc2V0dGluZ3MucGFnZXImJiFzLnNldHRpbmdzLnBhZ2VyQ3VzdG9tJiYoYigpLEkocy5hY3RpdmUuaW5kZXgpKSxzLnNldHRpbmdzLmFyaWFIaWRkZW4mJkIocy5hY3RpdmUuaW5kZXgqeCgpKX0sby5kZXN0cm95U2xpZGVyPWZ1bmN0aW9uKCl7cy5pbml0aWFsaXplZCYmKHMuaW5pdGlhbGl6ZWQ9ITEsdChcIi5ieC1jbG9uZVwiLHRoaXMpLnJlbW92ZSgpLHMuY2hpbGRyZW4uZWFjaChmdW5jdGlvbigpe3ZvaWQgMCE9PXQodGhpcykuZGF0YShcIm9yaWdTdHlsZVwiKT90KHRoaXMpLmF0dHIoXCJzdHlsZVwiLHQodGhpcykuZGF0YShcIm9yaWdTdHlsZVwiKSk6dCh0aGlzKS5yZW1vdmVBdHRyKFwic3R5bGVcIil9KSx2b2lkIDAhPT10KHRoaXMpLmRhdGEoXCJvcmlnU3R5bGVcIik/dGhpcy5hdHRyKFwic3R5bGVcIix0KHRoaXMpLmRhdGEoXCJvcmlnU3R5bGVcIikpOnQodGhpcykucmVtb3ZlQXR0cihcInN0eWxlXCIpLHQodGhpcykudW53cmFwKCkudW53cmFwKCkscy5jb250cm9scy5lbCYmcy5jb250cm9scy5lbC5yZW1vdmUoKSxzLmNvbnRyb2xzLm5leHQmJnMuY29udHJvbHMubmV4dC5yZW1vdmUoKSxzLmNvbnRyb2xzLnByZXYmJnMuY29udHJvbHMucHJldi5yZW1vdmUoKSxzLnBhZ2VyRWwmJnMuc2V0dGluZ3MuY29udHJvbHMmJiFzLnNldHRpbmdzLnBhZ2VyQ3VzdG9tJiZzLnBhZ2VyRWwucmVtb3ZlKCksdChcIi5ieC1jYXB0aW9uXCIsdGhpcykucmVtb3ZlKCkscy5jb250cm9scy5hdXRvRWwmJnMuY29udHJvbHMuYXV0b0VsLnJlbW92ZSgpLGNsZWFySW50ZXJ2YWwocy5pbnRlcnZhbCkscy5zZXR0aW5ncy5yZXNwb25zaXZlJiZ0KHdpbmRvdykudW5iaW5kKFwicmVzaXplXCIsWikscy5zZXR0aW5ncy5rZXlib2FyZEVuYWJsZWQmJnQoZG9jdW1lbnQpLnVuYmluZChcImtleWRvd25cIixGKSx0KHRoaXMpLnJlbW92ZURhdGEoXCJieFNsaWRlclwiKSl9LG8ucmVsb2FkU2xpZGVyPWZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihuPWUpLG8uZGVzdHJveVNsaWRlcigpLGwoKSx0KG8pLmRhdGEoXCJieFNsaWRlclwiLHRoaXMpfSxsKCksdChvKS5kYXRhKFwiYnhTbGlkZXJcIix0aGlzKSx0aGlzfX19KGpRdWVyeSk7IiwiLypcclxuICogalF1ZXJ5IEZsZXhTbGlkZXIgdjIuNi4zXHJcbiAqIENvcHlyaWdodCAyMDEyIFdvb1RoZW1lc1xyXG4gKiBDb250cmlidXRpbmcgQXV0aG9yOiBUeWxlciBTbWl0aFxyXG4gKi8hZnVuY3Rpb24oJCl7dmFyIGU9ITA7JC5mbGV4c2xpZGVyPWZ1bmN0aW9uKHQsYSl7dmFyIG49JCh0KTtuLnZhcnM9JC5leHRlbmQoe30sJC5mbGV4c2xpZGVyLmRlZmF1bHRzLGEpO3ZhciBpPW4udmFycy5uYW1lc3BhY2Uscz13aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQmJndpbmRvdy5NU0dlc3R1cmUscj0oXCJvbnRvdWNoc3RhcnRcImluIHdpbmRvd3x8c3x8d2luZG93LkRvY3VtZW50VG91Y2gmJmRvY3VtZW50IGluc3RhbmNlb2YgRG9jdW1lbnRUb3VjaCkmJm4udmFycy50b3VjaCxvPVwiY2xpY2sgdG91Y2hlbmQgTVNQb2ludGVyVXAga2V5dXBcIixsPVwiXCIsYyxkPVwidmVydGljYWxcIj09PW4udmFycy5kaXJlY3Rpb24sdT1uLnZhcnMucmV2ZXJzZSx2PW4udmFycy5pdGVtV2lkdGg+MCxwPVwiZmFkZVwiPT09bi52YXJzLmFuaW1hdGlvbixtPVwiXCIhPT1uLnZhcnMuYXNOYXZGb3IsZj17fTskLmRhdGEodCxcImZsZXhzbGlkZXJcIixuKSxmPXtpbml0OmZ1bmN0aW9uKCl7bi5hbmltYXRpbmc9ITEsbi5jdXJyZW50U2xpZGU9cGFyc2VJbnQobi52YXJzLnN0YXJ0QXQ/bi52YXJzLnN0YXJ0QXQ6MCwxMCksaXNOYU4obi5jdXJyZW50U2xpZGUpJiYobi5jdXJyZW50U2xpZGU9MCksbi5hbmltYXRpbmdUbz1uLmN1cnJlbnRTbGlkZSxuLmF0RW5kPTA9PT1uLmN1cnJlbnRTbGlkZXx8bi5jdXJyZW50U2xpZGU9PT1uLmxhc3Qsbi5jb250YWluZXJTZWxlY3Rvcj1uLnZhcnMuc2VsZWN0b3Iuc3Vic3RyKDAsbi52YXJzLnNlbGVjdG9yLnNlYXJjaChcIiBcIikpLG4uc2xpZGVzPSQobi52YXJzLnNlbGVjdG9yLG4pLG4uY29udGFpbmVyPSQobi5jb250YWluZXJTZWxlY3RvcixuKSxuLmNvdW50PW4uc2xpZGVzLmxlbmd0aCxuLnN5bmNFeGlzdHM9JChuLnZhcnMuc3luYykubGVuZ3RoPjAsXCJzbGlkZVwiPT09bi52YXJzLmFuaW1hdGlvbiYmKG4udmFycy5hbmltYXRpb249XCJzd2luZ1wiKSxuLnByb3A9ZD9cInRvcFwiOlwibWFyZ2luTGVmdFwiLG4uYXJncz17fSxuLm1hbnVhbFBhdXNlPSExLG4uc3RvcHBlZD0hMSxuLnN0YXJ0ZWQ9ITEsbi5zdGFydFRpbWVvdXQ9bnVsbCxuLnRyYW5zaXRpb25zPSFuLnZhcnMudmlkZW8mJiFwJiZuLnZhcnMudXNlQ1NTJiZmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdD1bXCJwZXJzcGVjdGl2ZVByb3BlcnR5XCIsXCJXZWJraXRQZXJzcGVjdGl2ZVwiLFwiTW96UGVyc3BlY3RpdmVcIixcIk9QZXJzcGVjdGl2ZVwiLFwibXNQZXJzcGVjdGl2ZVwiXTtmb3IodmFyIGEgaW4gdClpZih2b2lkIDAhPT1lLnN0eWxlW3RbYV1dKXJldHVybiBuLnBmeD10W2FdLnJlcGxhY2UoXCJQZXJzcGVjdGl2ZVwiLFwiXCIpLnRvTG93ZXJDYXNlKCksbi5wcm9wPVwiLVwiK24ucGZ4K1wiLXRyYW5zZm9ybVwiLCEwO3JldHVybiExfSgpLG4uZW5zdXJlQW5pbWF0aW9uRW5kPVwiXCIsXCJcIiE9PW4udmFycy5jb250cm9sc0NvbnRhaW5lciYmKG4uY29udHJvbHNDb250YWluZXI9JChuLnZhcnMuY29udHJvbHNDb250YWluZXIpLmxlbmd0aD4wJiYkKG4udmFycy5jb250cm9sc0NvbnRhaW5lcikpLFwiXCIhPT1uLnZhcnMubWFudWFsQ29udHJvbHMmJihuLm1hbnVhbENvbnRyb2xzPSQobi52YXJzLm1hbnVhbENvbnRyb2xzKS5sZW5ndGg+MCYmJChuLnZhcnMubWFudWFsQ29udHJvbHMpKSxcIlwiIT09bi52YXJzLmN1c3RvbURpcmVjdGlvbk5hdiYmKG4uY3VzdG9tRGlyZWN0aW9uTmF2PTI9PT0kKG4udmFycy5jdXN0b21EaXJlY3Rpb25OYXYpLmxlbmd0aCYmJChuLnZhcnMuY3VzdG9tRGlyZWN0aW9uTmF2KSksbi52YXJzLnJhbmRvbWl6ZSYmKG4uc2xpZGVzLnNvcnQoZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKS0uNX0pLG4uY29udGFpbmVyLmVtcHR5KCkuYXBwZW5kKG4uc2xpZGVzKSksbi5kb01hdGgoKSxuLnNldHVwKFwiaW5pdFwiKSxuLnZhcnMuY29udHJvbE5hdiYmZi5jb250cm9sTmF2LnNldHVwKCksbi52YXJzLmRpcmVjdGlvbk5hdiYmZi5kaXJlY3Rpb25OYXYuc2V0dXAoKSxuLnZhcnMua2V5Ym9hcmQmJigxPT09JChuLmNvbnRhaW5lclNlbGVjdG9yKS5sZW5ndGh8fG4udmFycy5tdWx0aXBsZUtleWJvYXJkKSYmJChkb2N1bWVudCkuYmluZChcImtleXVwXCIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5rZXlDb2RlO2lmKCFuLmFuaW1hdGluZyYmKDM5PT09dHx8Mzc9PT10KSl7dmFyIGE9Mzk9PT10P24uZ2V0VGFyZ2V0KFwibmV4dFwiKTozNz09PXQ/bi5nZXRUYXJnZXQoXCJwcmV2XCIpOiExO24uZmxleEFuaW1hdGUoYSxuLnZhcnMucGF1c2VPbkFjdGlvbil9fSksbi52YXJzLm1vdXNld2hlZWwmJm4uYmluZChcIm1vdXNld2hlZWxcIixmdW5jdGlvbihlLHQsYSxpKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIHM9MD50P24uZ2V0VGFyZ2V0KFwibmV4dFwiKTpuLmdldFRhcmdldChcInByZXZcIik7bi5mbGV4QW5pbWF0ZShzLG4udmFycy5wYXVzZU9uQWN0aW9uKX0pLG4udmFycy5wYXVzZVBsYXkmJmYucGF1c2VQbGF5LnNldHVwKCksbi52YXJzLnNsaWRlc2hvdyYmbi52YXJzLnBhdXNlSW52aXNpYmxlJiZmLnBhdXNlSW52aXNpYmxlLmluaXQoKSxuLnZhcnMuc2xpZGVzaG93JiYobi52YXJzLnBhdXNlT25Ib3ZlciYmbi5ob3ZlcihmdW5jdGlvbigpe24ubWFudWFsUGxheXx8bi5tYW51YWxQYXVzZXx8bi5wYXVzZSgpfSxmdW5jdGlvbigpe24ubWFudWFsUGF1c2V8fG4ubWFudWFsUGxheXx8bi5zdG9wcGVkfHxuLnBsYXkoKX0pLG4udmFycy5wYXVzZUludmlzaWJsZSYmZi5wYXVzZUludmlzaWJsZS5pc0hpZGRlbigpfHwobi52YXJzLmluaXREZWxheT4wP24uc3RhcnRUaW1lb3V0PXNldFRpbWVvdXQobi5wbGF5LG4udmFycy5pbml0RGVsYXkpOm4ucGxheSgpKSksbSYmZi5hc05hdi5zZXR1cCgpLHImJm4udmFycy50b3VjaCYmZi50b3VjaCgpLCghcHx8cCYmbi52YXJzLnNtb290aEhlaWdodCkmJiQod2luZG93KS5iaW5kKFwicmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIGZvY3VzXCIsZi5yZXNpemUpLG4uZmluZChcImltZ1wiKS5hdHRyKFwiZHJhZ2dhYmxlXCIsXCJmYWxzZVwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi52YXJzLnN0YXJ0KG4pfSwyMDApfSxhc05hdjp7c2V0dXA6ZnVuY3Rpb24oKXtuLmFzTmF2PSEwLG4uYW5pbWF0aW5nVG89TWF0aC5mbG9vcihuLmN1cnJlbnRTbGlkZS9uLm1vdmUpLG4uY3VycmVudEl0ZW09bi5jdXJyZW50U2xpZGUsbi5zbGlkZXMucmVtb3ZlQ2xhc3MoaStcImFjdGl2ZS1zbGlkZVwiKS5lcShuLmN1cnJlbnRJdGVtKS5hZGRDbGFzcyhpK1wiYWN0aXZlLXNsaWRlXCIpLHM/KHQuX3NsaWRlcj1uLG4uc2xpZGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuX2dlc3R1cmU9bmV3IE1TR2VzdHVyZSxlLl9nZXN0dXJlLnRhcmdldD1lLGUuYWRkRXZlbnRMaXN0ZW5lcihcIk1TUG9pbnRlckRvd25cIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZS5jdXJyZW50VGFyZ2V0Ll9nZXN0dXJlJiZlLmN1cnJlbnRUYXJnZXQuX2dlc3R1cmUuYWRkUG9pbnRlcihlLnBvaW50ZXJJZCl9LCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoXCJNU0dlc3R1cmVUYXBcIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIHQ9JCh0aGlzKSxhPXQuaW5kZXgoKTskKG4udmFycy5hc05hdkZvcikuZGF0YShcImZsZXhzbGlkZXJcIikuYW5pbWF0aW5nfHx0Lmhhc0NsYXNzKFwiYWN0aXZlXCIpfHwobi5kaXJlY3Rpb249bi5jdXJyZW50SXRlbTxhP1wibmV4dFwiOlwicHJldlwiLG4uZmxleEFuaW1hdGUoYSxuLnZhcnMucGF1c2VPbkFjdGlvbiwhMSwhMCwhMCkpfSl9KSk6bi5zbGlkZXMub24obyxmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIHQ9JCh0aGlzKSxhPXQuaW5kZXgoKSxzPXQub2Zmc2V0KCkubGVmdC0kKG4pLnNjcm9sbExlZnQoKTswPj1zJiZ0Lmhhc0NsYXNzKGkrXCJhY3RpdmUtc2xpZGVcIik/bi5mbGV4QW5pbWF0ZShuLmdldFRhcmdldChcInByZXZcIiksITApOiQobi52YXJzLmFzTmF2Rm9yKS5kYXRhKFwiZmxleHNsaWRlclwiKS5hbmltYXRpbmd8fHQuaGFzQ2xhc3MoaStcImFjdGl2ZS1zbGlkZVwiKXx8KG4uZGlyZWN0aW9uPW4uY3VycmVudEl0ZW08YT9cIm5leHRcIjpcInByZXZcIixuLmZsZXhBbmltYXRlKGEsbi52YXJzLnBhdXNlT25BY3Rpb24sITEsITAsITApKX0pfX0sY29udHJvbE5hdjp7c2V0dXA6ZnVuY3Rpb24oKXtuLm1hbnVhbENvbnRyb2xzP2YuY29udHJvbE5hdi5zZXR1cE1hbnVhbCgpOmYuY29udHJvbE5hdi5zZXR1cFBhZ2luZygpfSxzZXR1cFBhZ2luZzpmdW5jdGlvbigpe3ZhciBlPVwidGh1bWJuYWlsc1wiPT09bi52YXJzLmNvbnRyb2xOYXY/XCJjb250cm9sLXRodW1ic1wiOlwiY29udHJvbC1wYWdpbmdcIix0PTEsYSxzO2lmKG4uY29udHJvbE5hdlNjYWZmb2xkPSQoJzxvbCBjbGFzcz1cIicraStcImNvbnRyb2wtbmF2IFwiK2krZSsnXCI+PC9vbD4nKSxuLnBhZ2luZ0NvdW50PjEpZm9yKHZhciByPTA7cjxuLnBhZ2luZ0NvdW50O3IrKyl7cz1uLnNsaWRlcy5lcShyKSx2b2lkIDA9PT1zLmF0dHIoXCJkYXRhLXRodW1iLWFsdFwiKSYmcy5hdHRyKFwiZGF0YS10aHVtYi1hbHRcIixcIlwiKTt2YXIgYz1cIlwiIT09cy5hdHRyKFwiZGF0YS10aHVtYi1hbHRcIik/Yz0nIGFsdD1cIicrcy5hdHRyKFwiZGF0YS10aHVtYi1hbHRcIikrJ1wiJzpcIlwiO2lmKGE9XCJ0aHVtYm5haWxzXCI9PT1uLnZhcnMuY29udHJvbE5hdj8nPGltZyBzcmM9XCInK3MuYXR0cihcImRhdGEtdGh1bWJcIikrJ1wiJytjK1wiLz5cIjonPGEgaHJlZj1cIiNcIj4nK3QrXCI8L2E+XCIsXCJ0aHVtYm5haWxzXCI9PT1uLnZhcnMuY29udHJvbE5hdiYmITA9PT1uLnZhcnMudGh1bWJDYXB0aW9ucyl7dmFyIGQ9cy5hdHRyKFwiZGF0YS10aHVtYmNhcHRpb25cIik7XCJcIiE9PWQmJnZvaWQgMCE9PWQmJihhKz0nPHNwYW4gY2xhc3M9XCInK2krJ2NhcHRpb25cIj4nK2QrXCI8L3NwYW4+XCIpfW4uY29udHJvbE5hdlNjYWZmb2xkLmFwcGVuZChcIjxsaT5cIithK1wiPC9saT5cIiksdCsrfW4uY29udHJvbHNDb250YWluZXI/JChuLmNvbnRyb2xzQ29udGFpbmVyKS5hcHBlbmQobi5jb250cm9sTmF2U2NhZmZvbGQpOm4uYXBwZW5kKG4uY29udHJvbE5hdlNjYWZmb2xkKSxmLmNvbnRyb2xOYXYuc2V0KCksZi5jb250cm9sTmF2LmFjdGl2ZSgpLG4uY29udHJvbE5hdlNjYWZmb2xkLmRlbGVnYXRlKFwiYSwgaW1nXCIsbyxmdW5jdGlvbihlKXtpZihlLnByZXZlbnREZWZhdWx0KCksXCJcIj09PWx8fGw9PT1lLnR5cGUpe3ZhciB0PSQodGhpcyksYT1uLmNvbnRyb2xOYXYuaW5kZXgodCk7dC5oYXNDbGFzcyhpK1wiYWN0aXZlXCIpfHwobi5kaXJlY3Rpb249YT5uLmN1cnJlbnRTbGlkZT9cIm5leHRcIjpcInByZXZcIixuLmZsZXhBbmltYXRlKGEsbi52YXJzLnBhdXNlT25BY3Rpb24pKX1cIlwiPT09bCYmKGw9ZS50eXBlKSxmLnNldFRvQ2xlYXJXYXRjaGVkRXZlbnQoKX0pfSxzZXR1cE1hbnVhbDpmdW5jdGlvbigpe24uY29udHJvbE5hdj1uLm1hbnVhbENvbnRyb2xzLGYuY29udHJvbE5hdi5hY3RpdmUoKSxuLmNvbnRyb2xOYXYuYmluZChvLGZ1bmN0aW9uKGUpe2lmKGUucHJldmVudERlZmF1bHQoKSxcIlwiPT09bHx8bD09PWUudHlwZSl7dmFyIHQ9JCh0aGlzKSxhPW4uY29udHJvbE5hdi5pbmRleCh0KTt0Lmhhc0NsYXNzKGkrXCJhY3RpdmVcIil8fChhPm4uY3VycmVudFNsaWRlP24uZGlyZWN0aW9uPVwibmV4dFwiOm4uZGlyZWN0aW9uPVwicHJldlwiLG4uZmxleEFuaW1hdGUoYSxuLnZhcnMucGF1c2VPbkFjdGlvbikpfVwiXCI9PT1sJiYobD1lLnR5cGUpLGYuc2V0VG9DbGVhcldhdGNoZWRFdmVudCgpfSl9LHNldDpmdW5jdGlvbigpe3ZhciBlPVwidGh1bWJuYWlsc1wiPT09bi52YXJzLmNvbnRyb2xOYXY/XCJpbWdcIjpcImFcIjtuLmNvbnRyb2xOYXY9JChcIi5cIitpK1wiY29udHJvbC1uYXYgbGkgXCIrZSxuLmNvbnRyb2xzQ29udGFpbmVyP24uY29udHJvbHNDb250YWluZXI6bil9LGFjdGl2ZTpmdW5jdGlvbigpe24uY29udHJvbE5hdi5yZW1vdmVDbGFzcyhpK1wiYWN0aXZlXCIpLmVxKG4uYW5pbWF0aW5nVG8pLmFkZENsYXNzKGkrXCJhY3RpdmVcIil9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe24ucGFnaW5nQ291bnQ+MSYmXCJhZGRcIj09PWU/bi5jb250cm9sTmF2U2NhZmZvbGQuYXBwZW5kKCQoJzxsaT48YSBocmVmPVwiI1wiPicrbi5jb3VudCtcIjwvYT48L2xpPlwiKSk6MT09PW4ucGFnaW5nQ291bnQ/bi5jb250cm9sTmF2U2NhZmZvbGQuZmluZChcImxpXCIpLnJlbW92ZSgpOm4uY29udHJvbE5hdi5lcSh0KS5jbG9zZXN0KFwibGlcIikucmVtb3ZlKCksZi5jb250cm9sTmF2LnNldCgpLG4ucGFnaW5nQ291bnQ+MSYmbi5wYWdpbmdDb3VudCE9PW4uY29udHJvbE5hdi5sZW5ndGg/bi51cGRhdGUodCxlKTpmLmNvbnRyb2xOYXYuYWN0aXZlKCl9fSxkaXJlY3Rpb25OYXY6e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGU9JCgnPHVsIGNsYXNzPVwiJytpKydkaXJlY3Rpb24tbmF2XCI+PGxpIGNsYXNzPVwiJytpKyduYXYtcHJldlwiPjxhIGNsYXNzPVwiJytpKydwcmV2XCIgaHJlZj1cIiNcIj4nK24udmFycy5wcmV2VGV4dCsnPC9hPjwvbGk+PGxpIGNsYXNzPVwiJytpKyduYXYtbmV4dFwiPjxhIGNsYXNzPVwiJytpKyduZXh0XCIgaHJlZj1cIiNcIj4nK24udmFycy5uZXh0VGV4dCtcIjwvYT48L2xpPjwvdWw+XCIpO24uY3VzdG9tRGlyZWN0aW9uTmF2P24uZGlyZWN0aW9uTmF2PW4uY3VzdG9tRGlyZWN0aW9uTmF2Om4uY29udHJvbHNDb250YWluZXI/KCQobi5jb250cm9sc0NvbnRhaW5lcikuYXBwZW5kKGUpLG4uZGlyZWN0aW9uTmF2PSQoXCIuXCIraStcImRpcmVjdGlvbi1uYXYgbGkgYVwiLG4uY29udHJvbHNDb250YWluZXIpKToobi5hcHBlbmQoZSksbi5kaXJlY3Rpb25OYXY9JChcIi5cIitpK1wiZGlyZWN0aW9uLW5hdiBsaSBhXCIsbikpLGYuZGlyZWN0aW9uTmF2LnVwZGF0ZSgpLG4uZGlyZWN0aW9uTmF2LmJpbmQobyxmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIHQ7XCJcIiE9PWwmJmwhPT1lLnR5cGV8fCh0PSQodGhpcykuaGFzQ2xhc3MoaStcIm5leHRcIik/bi5nZXRUYXJnZXQoXCJuZXh0XCIpOm4uZ2V0VGFyZ2V0KFwicHJldlwiKSxuLmZsZXhBbmltYXRlKHQsbi52YXJzLnBhdXNlT25BY3Rpb24pKSxcIlwiPT09bCYmKGw9ZS50eXBlKSxmLnNldFRvQ2xlYXJXYXRjaGVkRXZlbnQoKX0pfSx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgZT1pK1wiZGlzYWJsZWRcIjsxPT09bi5wYWdpbmdDb3VudD9uLmRpcmVjdGlvbk5hdi5hZGRDbGFzcyhlKS5hdHRyKFwidGFiaW5kZXhcIixcIi0xXCIpOm4udmFycy5hbmltYXRpb25Mb29wP24uZGlyZWN0aW9uTmF2LnJlbW92ZUNsYXNzKGUpLnJlbW92ZUF0dHIoXCJ0YWJpbmRleFwiKTowPT09bi5hbmltYXRpbmdUbz9uLmRpcmVjdGlvbk5hdi5yZW1vdmVDbGFzcyhlKS5maWx0ZXIoXCIuXCIraStcInByZXZcIikuYWRkQ2xhc3MoZSkuYXR0cihcInRhYmluZGV4XCIsXCItMVwiKTpuLmFuaW1hdGluZ1RvPT09bi5sYXN0P24uZGlyZWN0aW9uTmF2LnJlbW92ZUNsYXNzKGUpLmZpbHRlcihcIi5cIitpK1wibmV4dFwiKS5hZGRDbGFzcyhlKS5hdHRyKFwidGFiaW5kZXhcIixcIi0xXCIpOm4uZGlyZWN0aW9uTmF2LnJlbW92ZUNsYXNzKGUpLnJlbW92ZUF0dHIoXCJ0YWJpbmRleFwiKX19LHBhdXNlUGxheTp7c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZT0kKCc8ZGl2IGNsYXNzPVwiJytpKydwYXVzZXBsYXlcIj48YSBocmVmPVwiI1wiPjwvYT48L2Rpdj4nKTtuLmNvbnRyb2xzQ29udGFpbmVyPyhuLmNvbnRyb2xzQ29udGFpbmVyLmFwcGVuZChlKSxuLnBhdXNlUGxheT0kKFwiLlwiK2krXCJwYXVzZXBsYXkgYVwiLG4uY29udHJvbHNDb250YWluZXIpKToobi5hcHBlbmQoZSksbi5wYXVzZVBsYXk9JChcIi5cIitpK1wicGF1c2VwbGF5IGFcIixuKSksZi5wYXVzZVBsYXkudXBkYXRlKG4udmFycy5zbGlkZXNob3c/aStcInBhdXNlXCI6aStcInBsYXlcIiksbi5wYXVzZVBsYXkuYmluZChvLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSxcIlwiIT09bCYmbCE9PWUudHlwZXx8KCQodGhpcykuaGFzQ2xhc3MoaStcInBhdXNlXCIpPyhuLm1hbnVhbFBhdXNlPSEwLG4ubWFudWFsUGxheT0hMSxuLnBhdXNlKCkpOihuLm1hbnVhbFBhdXNlPSExLG4ubWFudWFsUGxheT0hMCxuLnBsYXkoKSkpLFwiXCI9PT1sJiYobD1lLnR5cGUpLGYuc2V0VG9DbGVhcldhdGNoZWRFdmVudCgpfSl9LHVwZGF0ZTpmdW5jdGlvbihlKXtcInBsYXlcIj09PWU/bi5wYXVzZVBsYXkucmVtb3ZlQ2xhc3MoaStcInBhdXNlXCIpLmFkZENsYXNzKGkrXCJwbGF5XCIpLmh0bWwobi52YXJzLnBsYXlUZXh0KTpuLnBhdXNlUGxheS5yZW1vdmVDbGFzcyhpK1wicGxheVwiKS5hZGRDbGFzcyhpK1wicGF1c2VcIikuaHRtbChuLnZhcnMucGF1c2VUZXh0KX19LHRvdWNoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtlLnN0b3BQcm9wYWdhdGlvbigpLG4uYW5pbWF0aW5nP2UucHJldmVudERlZmF1bHQoKToobi5wYXVzZSgpLHQuX2dlc3R1cmUuYWRkUG9pbnRlcihlLnBvaW50ZXJJZCksVD0wLGM9ZD9uLmg6bi53LGY9TnVtYmVyKG5ldyBEYXRlKSxsPXYmJnUmJm4uYW5pbWF0aW5nVG89PT1uLmxhc3Q/MDp2JiZ1P24ubGltaXQtKG4uaXRlbVcrbi52YXJzLml0ZW1NYXJnaW4pKm4ubW92ZSpuLmFuaW1hdGluZ1RvOnYmJm4uY3VycmVudFNsaWRlPT09bi5sYXN0P24ubGltaXQ6dj8obi5pdGVtVytuLnZhcnMuaXRlbU1hcmdpbikqbi5tb3ZlKm4uY3VycmVudFNsaWRlOnU/KG4ubGFzdC1uLmN1cnJlbnRTbGlkZStuLmNsb25lT2Zmc2V0KSpjOihuLmN1cnJlbnRTbGlkZStuLmNsb25lT2Zmc2V0KSpjKX1mdW5jdGlvbiBhKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9ZS50YXJnZXQuX3NsaWRlcjtpZihhKXt2YXIgbj0tZS50cmFuc2xhdGlvblgsaT0tZS50cmFuc2xhdGlvblk7cmV0dXJuIFQrPWQ/aTpuLG09VCx5PWQ/TWF0aC5hYnMoVCk8TWF0aC5hYnMoLW4pOk1hdGguYWJzKFQpPE1hdGguYWJzKC1pKSxlLmRldGFpbD09PWUuTVNHRVNUVVJFX0ZMQUdfSU5FUlRJQT92b2lkIHNldEltbWVkaWF0ZShmdW5jdGlvbigpe3QuX2dlc3R1cmUuc3RvcCgpfSk6dm9pZCgoIXl8fE51bWJlcihuZXcgRGF0ZSktZj41MDApJiYoZS5wcmV2ZW50RGVmYXVsdCgpLCFwJiZhLnRyYW5zaXRpb25zJiYoYS52YXJzLmFuaW1hdGlvbkxvb3B8fChtPVQvKDA9PT1hLmN1cnJlbnRTbGlkZSYmMD5UfHxhLmN1cnJlbnRTbGlkZT09PWEubGFzdCYmVD4wP01hdGguYWJzKFQpL2MrMjoxKSksYS5zZXRQcm9wcyhsK20sXCJzZXRUb3VjaFwiKSkpKX19ZnVuY3Rpb24gaShlKXtlLnN0b3BQcm9wYWdhdGlvbigpO3ZhciB0PWUudGFyZ2V0Ll9zbGlkZXI7aWYodCl7aWYodC5hbmltYXRpbmdUbz09PXQuY3VycmVudFNsaWRlJiYheSYmbnVsbCE9PW0pe3ZhciBhPXU/LW06bSxuPWE+MD90LmdldFRhcmdldChcIm5leHRcIik6dC5nZXRUYXJnZXQoXCJwcmV2XCIpO3QuY2FuQWR2YW5jZShuKSYmKE51bWJlcihuZXcgRGF0ZSktZjw1NTAmJk1hdGguYWJzKGEpPjUwfHxNYXRoLmFicyhhKT5jLzIpP3QuZmxleEFuaW1hdGUobix0LnZhcnMucGF1c2VPbkFjdGlvbik6cHx8dC5mbGV4QW5pbWF0ZSh0LmN1cnJlbnRTbGlkZSx0LnZhcnMucGF1c2VPbkFjdGlvbiwhMCl9cj1udWxsLG89bnVsbCxtPW51bGwsbD1udWxsLFQ9MH19dmFyIHIsbyxsLGMsbSxmLGcsaCxTLHk9ITEseD0wLGI9MCxUPTA7cz8odC5zdHlsZS5tc1RvdWNoQWN0aW9uPVwibm9uZVwiLHQuX2dlc3R1cmU9bmV3IE1TR2VzdHVyZSx0Ll9nZXN0dXJlLnRhcmdldD10LHQuYWRkRXZlbnRMaXN0ZW5lcihcIk1TUG9pbnRlckRvd25cIixlLCExKSx0Ll9zbGlkZXI9bix0LmFkZEV2ZW50TGlzdGVuZXIoXCJNU0dlc3R1cmVDaGFuZ2VcIixhLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJNU0dlc3R1cmVFbmRcIixpLCExKSk6KGc9ZnVuY3Rpb24oZSl7bi5hbmltYXRpbmc/ZS5wcmV2ZW50RGVmYXVsdCgpOih3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWR8fDE9PT1lLnRvdWNoZXMubGVuZ3RoKSYmKG4ucGF1c2UoKSxjPWQ/bi5oOm4udyxmPU51bWJlcihuZXcgRGF0ZSkseD1lLnRvdWNoZXNbMF0ucGFnZVgsYj1lLnRvdWNoZXNbMF0ucGFnZVksbD12JiZ1JiZuLmFuaW1hdGluZ1RvPT09bi5sYXN0PzA6diYmdT9uLmxpbWl0LShuLml0ZW1XK24udmFycy5pdGVtTWFyZ2luKSpuLm1vdmUqbi5hbmltYXRpbmdUbzp2JiZuLmN1cnJlbnRTbGlkZT09PW4ubGFzdD9uLmxpbWl0OnY/KG4uaXRlbVcrbi52YXJzLml0ZW1NYXJnaW4pKm4ubW92ZSpuLmN1cnJlbnRTbGlkZTp1PyhuLmxhc3Qtbi5jdXJyZW50U2xpZGUrbi5jbG9uZU9mZnNldCkqYzoobi5jdXJyZW50U2xpZGUrbi5jbG9uZU9mZnNldCkqYyxyPWQ/Yjp4LG89ZD94OmIsdC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsaCwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIixTLCExKSl9LGg9ZnVuY3Rpb24oZSl7eD1lLnRvdWNoZXNbMF0ucGFnZVgsYj1lLnRvdWNoZXNbMF0ucGFnZVksbT1kP3ItYjpyLXgseT1kP01hdGguYWJzKG0pPE1hdGguYWJzKHgtbyk6TWF0aC5hYnMobSk8TWF0aC5hYnMoYi1vKTt2YXIgdD01MDA7KCF5fHxOdW1iZXIobmV3IERhdGUpLWY+dCkmJihlLnByZXZlbnREZWZhdWx0KCksIXAmJm4udHJhbnNpdGlvbnMmJihuLnZhcnMuYW5pbWF0aW9uTG9vcHx8KG0vPTA9PT1uLmN1cnJlbnRTbGlkZSYmMD5tfHxuLmN1cnJlbnRTbGlkZT09PW4ubGFzdCYmbT4wP01hdGguYWJzKG0pL2MrMjoxKSxuLnNldFByb3BzKGwrbSxcInNldFRvdWNoXCIpKSl9LFM9ZnVuY3Rpb24oZSl7aWYodC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsaCwhMSksbi5hbmltYXRpbmdUbz09PW4uY3VycmVudFNsaWRlJiYheSYmbnVsbCE9PW0pe3ZhciBhPXU/LW06bSxpPWE+MD9uLmdldFRhcmdldChcIm5leHRcIik6bi5nZXRUYXJnZXQoXCJwcmV2XCIpO24uY2FuQWR2YW5jZShpKSYmKE51bWJlcihuZXcgRGF0ZSktZjw1NTAmJk1hdGguYWJzKGEpPjUwfHxNYXRoLmFicyhhKT5jLzIpP24uZmxleEFuaW1hdGUoaSxuLnZhcnMucGF1c2VPbkFjdGlvbik6cHx8bi5mbGV4QW5pbWF0ZShuLmN1cnJlbnRTbGlkZSxuLnZhcnMucGF1c2VPbkFjdGlvbiwhMCl9dC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIixTLCExKSxyPW51bGwsbz1udWxsLG09bnVsbCxsPW51bGx9LHQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIixnLCExKSl9LHJlc2l6ZTpmdW5jdGlvbigpeyFuLmFuaW1hdGluZyYmbi5pcyhcIjp2aXNpYmxlXCIpJiYodnx8bi5kb01hdGgoKSxwP2Yuc21vb3RoSGVpZ2h0KCk6dj8obi5zbGlkZXMud2lkdGgobi5jb21wdXRlZFcpLG4udXBkYXRlKG4ucGFnaW5nQ291bnQpLG4uc2V0UHJvcHMoKSk6ZD8obi52aWV3cG9ydC5oZWlnaHQobi5oKSxuLnNldFByb3BzKG4uaCxcInNldFRvdGFsXCIpKToobi52YXJzLnNtb290aEhlaWdodCYmZi5zbW9vdGhIZWlnaHQoKSxuLm5ld1NsaWRlcy53aWR0aChuLmNvbXB1dGVkVyksbi5zZXRQcm9wcyhuLmNvbXB1dGVkVyxcInNldFRvdGFsXCIpKSl9LHNtb290aEhlaWdodDpmdW5jdGlvbihlKXtpZighZHx8cCl7dmFyIHQ9cD9uOm4udmlld3BvcnQ7ZT90LmFuaW1hdGUoe2hlaWdodDpuLnNsaWRlcy5lcShuLmFuaW1hdGluZ1RvKS5pbm5lckhlaWdodCgpfSxlKTp0LmlubmVySGVpZ2h0KG4uc2xpZGVzLmVxKG4uYW5pbWF0aW5nVG8pLmlubmVySGVpZ2h0KCkpfX0sc3luYzpmdW5jdGlvbihlKXt2YXIgdD0kKG4udmFycy5zeW5jKS5kYXRhKFwiZmxleHNsaWRlclwiKSxhPW4uYW5pbWF0aW5nVG87c3dpdGNoKGUpe2Nhc2VcImFuaW1hdGVcIjp0LmZsZXhBbmltYXRlKGEsbi52YXJzLnBhdXNlT25BY3Rpb24sITEsITApO2JyZWFrO2Nhc2VcInBsYXlcIjp0LnBsYXlpbmd8fHQuYXNOYXZ8fHQucGxheSgpO2JyZWFrO2Nhc2VcInBhdXNlXCI6dC5wYXVzZSgpfX0sdW5pcXVlSUQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZmlsdGVyKFwiW2lkXVwiKS5hZGQoZS5maW5kKFwiW2lkXVwiKSkuZWFjaChmdW5jdGlvbigpe3ZhciBlPSQodGhpcyk7ZS5hdHRyKFwiaWRcIixlLmF0dHIoXCJpZFwiKStcIl9jbG9uZVwiKX0pLGV9LHBhdXNlSW52aXNpYmxlOnt2aXNQcm9wOm51bGwsaW5pdDpmdW5jdGlvbigpe3ZhciBlPWYucGF1c2VJbnZpc2libGUuZ2V0SGlkZGVuUHJvcCgpO2lmKGUpe3ZhciB0PWUucmVwbGFjZSgvW0h8aF1pZGRlbi8sXCJcIikrXCJ2aXNpYmlsaXR5Y2hhbmdlXCI7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKCl7Zi5wYXVzZUludmlzaWJsZS5pc0hpZGRlbigpP24uc3RhcnRUaW1lb3V0P2NsZWFyVGltZW91dChuLnN0YXJ0VGltZW91dCk6bi5wYXVzZSgpOm4uc3RhcnRlZD9uLnBsYXkoKTpuLnZhcnMuaW5pdERlbGF5PjA/c2V0VGltZW91dChuLnBsYXksbi52YXJzLmluaXREZWxheSk6bi5wbGF5KCl9KX19LGlzSGlkZGVuOmZ1bmN0aW9uKCl7dmFyIGU9Zi5wYXVzZUludmlzaWJsZS5nZXRIaWRkZW5Qcm9wKCk7cmV0dXJuIGU/ZG9jdW1lbnRbZV06ITF9LGdldEhpZGRlblByb3A6ZnVuY3Rpb24oKXt2YXIgZT1bXCJ3ZWJraXRcIixcIm1velwiLFwibXNcIixcIm9cIl07aWYoXCJoaWRkZW5cImluIGRvY3VtZW50KXJldHVyblwiaGlkZGVuXCI7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoZVt0XStcIkhpZGRlblwiaW4gZG9jdW1lbnQpcmV0dXJuIGVbdF0rXCJIaWRkZW5cIjtyZXR1cm4gbnVsbH19LHNldFRvQ2xlYXJXYXRjaGVkRXZlbnQ6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYyksYz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bD1cIlwifSwzZTMpfX0sbi5mbGV4QW5pbWF0ZT1mdW5jdGlvbihlLHQsYSxzLG8pe2lmKG4udmFycy5hbmltYXRpb25Mb29wfHxlPT09bi5jdXJyZW50U2xpZGV8fChuLmRpcmVjdGlvbj1lPm4uY3VycmVudFNsaWRlP1wibmV4dFwiOlwicHJldlwiKSxtJiYxPT09bi5wYWdpbmdDb3VudCYmKG4uZGlyZWN0aW9uPW4uY3VycmVudEl0ZW08ZT9cIm5leHRcIjpcInByZXZcIiksIW4uYW5pbWF0aW5nJiYobi5jYW5BZHZhbmNlKGUsbyl8fGEpJiZuLmlzKFwiOnZpc2libGVcIikpe2lmKG0mJnMpe3ZhciBsPSQobi52YXJzLmFzTmF2Rm9yKS5kYXRhKFwiZmxleHNsaWRlclwiKTtpZihuLmF0RW5kPTA9PT1lfHxlPT09bi5jb3VudC0xLGwuZmxleEFuaW1hdGUoZSwhMCwhMSwhMCxvKSxuLmRpcmVjdGlvbj1uLmN1cnJlbnRJdGVtPGU/XCJuZXh0XCI6XCJwcmV2XCIsbC5kaXJlY3Rpb249bi5kaXJlY3Rpb24sTWF0aC5jZWlsKChlKzEpL24udmlzaWJsZSktMT09PW4uY3VycmVudFNsaWRlfHwwPT09ZSlyZXR1cm4gbi5jdXJyZW50SXRlbT1lLG4uc2xpZGVzLnJlbW92ZUNsYXNzKGkrXCJhY3RpdmUtc2xpZGVcIikuZXEoZSkuYWRkQ2xhc3MoaStcImFjdGl2ZS1zbGlkZVwiKSwhMTtuLmN1cnJlbnRJdGVtPWUsbi5zbGlkZXMucmVtb3ZlQ2xhc3MoaStcImFjdGl2ZS1zbGlkZVwiKS5lcShlKS5hZGRDbGFzcyhpK1wiYWN0aXZlLXNsaWRlXCIpLGU9TWF0aC5mbG9vcihlL24udmlzaWJsZSl9aWYobi5hbmltYXRpbmc9ITAsbi5hbmltYXRpbmdUbz1lLHQmJm4ucGF1c2UoKSxuLnZhcnMuYmVmb3JlKG4pLG4uc3luY0V4aXN0cyYmIW8mJmYuc3luYyhcImFuaW1hdGVcIiksbi52YXJzLmNvbnRyb2xOYXYmJmYuY29udHJvbE5hdi5hY3RpdmUoKSx2fHxuLnNsaWRlcy5yZW1vdmVDbGFzcyhpK1wiYWN0aXZlLXNsaWRlXCIpLmVxKGUpLmFkZENsYXNzKGkrXCJhY3RpdmUtc2xpZGVcIiksbi5hdEVuZD0wPT09ZXx8ZT09PW4ubGFzdCxuLnZhcnMuZGlyZWN0aW9uTmF2JiZmLmRpcmVjdGlvbk5hdi51cGRhdGUoKSxlPT09bi5sYXN0JiYobi52YXJzLmVuZChuKSxuLnZhcnMuYW5pbWF0aW9uTG9vcHx8bi5wYXVzZSgpKSxwKXI/KG4uc2xpZGVzLmVxKG4uY3VycmVudFNsaWRlKS5jc3Moe29wYWNpdHk6MCx6SW5kZXg6MX0pLG4uc2xpZGVzLmVxKGUpLmNzcyh7b3BhY2l0eToxLHpJbmRleDoyfSksbi53cmFwdXAoYykpOihuLnNsaWRlcy5lcShuLmN1cnJlbnRTbGlkZSkuY3NzKHt6SW5kZXg6MX0pLmFuaW1hdGUoe29wYWNpdHk6MH0sbi52YXJzLmFuaW1hdGlvblNwZWVkLG4udmFycy5lYXNpbmcpLG4uc2xpZGVzLmVxKGUpLmNzcyh7ekluZGV4OjJ9KS5hbmltYXRlKHtvcGFjaXR5OjF9LG4udmFycy5hbmltYXRpb25TcGVlZCxuLnZhcnMuZWFzaW5nLG4ud3JhcHVwKSk7ZWxzZXt2YXIgYz1kP24uc2xpZGVzLmZpbHRlcihcIjpmaXJzdFwiKS5oZWlnaHQoKTpuLmNvbXB1dGVkVyxnLGgsUzt2PyhnPW4udmFycy5pdGVtTWFyZ2luLFM9KG4uaXRlbVcrZykqbi5tb3ZlKm4uYW5pbWF0aW5nVG8saD1TPm4ubGltaXQmJjEhPT1uLnZpc2libGU/bi5saW1pdDpTKTpoPTA9PT1uLmN1cnJlbnRTbGlkZSYmZT09PW4uY291bnQtMSYmbi52YXJzLmFuaW1hdGlvbkxvb3AmJlwibmV4dFwiIT09bi5kaXJlY3Rpb24/dT8obi5jb3VudCtuLmNsb25lT2Zmc2V0KSpjOjA6bi5jdXJyZW50U2xpZGU9PT1uLmxhc3QmJjA9PT1lJiZuLnZhcnMuYW5pbWF0aW9uTG9vcCYmXCJwcmV2XCIhPT1uLmRpcmVjdGlvbj91PzA6KG4uY291bnQrMSkqYzp1PyhuLmNvdW50LTEtZStuLmNsb25lT2Zmc2V0KSpjOihlK24uY2xvbmVPZmZzZXQpKmMsbi5zZXRQcm9wcyhoLFwiXCIsbi52YXJzLmFuaW1hdGlvblNwZWVkKSxuLnRyYW5zaXRpb25zPyhuLnZhcnMuYW5pbWF0aW9uTG9vcCYmbi5hdEVuZHx8KG4uYW5pbWF0aW5nPSExLG4uY3VycmVudFNsaWRlPW4uYW5pbWF0aW5nVG8pLG4uY29udGFpbmVyLnVuYmluZChcIndlYmtpdFRyYW5zaXRpb25FbmQgdHJhbnNpdGlvbmVuZFwiKSxuLmNvbnRhaW5lci5iaW5kKFwid2Via2l0VHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kXCIsZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQobi5lbnN1cmVBbmltYXRpb25FbmQpLG4ud3JhcHVwKGMpfSksY2xlYXJUaW1lb3V0KG4uZW5zdXJlQW5pbWF0aW9uRW5kKSxuLmVuc3VyZUFuaW1hdGlvbkVuZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi53cmFwdXAoYyl9LG4udmFycy5hbmltYXRpb25TcGVlZCsxMDApKTpuLmNvbnRhaW5lci5hbmltYXRlKG4uYXJncyxuLnZhcnMuYW5pbWF0aW9uU3BlZWQsbi52YXJzLmVhc2luZyxmdW5jdGlvbigpe24ud3JhcHVwKGMpfSl9bi52YXJzLnNtb290aEhlaWdodCYmZi5zbW9vdGhIZWlnaHQobi52YXJzLmFuaW1hdGlvblNwZWVkKX19LG4ud3JhcHVwPWZ1bmN0aW9uKGUpe3B8fHZ8fCgwPT09bi5jdXJyZW50U2xpZGUmJm4uYW5pbWF0aW5nVG89PT1uLmxhc3QmJm4udmFycy5hbmltYXRpb25Mb29wP24uc2V0UHJvcHMoZSxcImp1bXBFbmRcIik6bi5jdXJyZW50U2xpZGU9PT1uLmxhc3QmJjA9PT1uLmFuaW1hdGluZ1RvJiZuLnZhcnMuYW5pbWF0aW9uTG9vcCYmbi5zZXRQcm9wcyhlLFwianVtcFN0YXJ0XCIpKSxuLmFuaW1hdGluZz0hMSxuLmN1cnJlbnRTbGlkZT1uLmFuaW1hdGluZ1RvLG4udmFycy5hZnRlcihuKX0sbi5hbmltYXRlU2xpZGVzPWZ1bmN0aW9uKCl7IW4uYW5pbWF0aW5nJiZlJiZuLmZsZXhBbmltYXRlKG4uZ2V0VGFyZ2V0KFwibmV4dFwiKSl9LG4ucGF1c2U9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKG4uYW5pbWF0ZWRTbGlkZXMpLG4uYW5pbWF0ZWRTbGlkZXM9bnVsbCxuLnBsYXlpbmc9ITEsbi52YXJzLnBhdXNlUGxheSYmZi5wYXVzZVBsYXkudXBkYXRlKFwicGxheVwiKSxuLnN5bmNFeGlzdHMmJmYuc3luYyhcInBhdXNlXCIpfSxuLnBsYXk9ZnVuY3Rpb24oKXtuLnBsYXlpbmcmJmNsZWFySW50ZXJ2YWwobi5hbmltYXRlZFNsaWRlcyksbi5hbmltYXRlZFNsaWRlcz1uLmFuaW1hdGVkU2xpZGVzfHxzZXRJbnRlcnZhbChuLmFuaW1hdGVTbGlkZXMsbi52YXJzLnNsaWRlc2hvd1NwZWVkKSxuLnN0YXJ0ZWQ9bi5wbGF5aW5nPSEwLG4udmFycy5wYXVzZVBsYXkmJmYucGF1c2VQbGF5LnVwZGF0ZShcInBhdXNlXCIpLG4uc3luY0V4aXN0cyYmZi5zeW5jKFwicGxheVwiKX0sbi5zdG9wPWZ1bmN0aW9uKCl7bi5wYXVzZSgpLG4uc3RvcHBlZD0hMH0sbi5jYW5BZHZhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIGE9bT9uLnBhZ2luZ0NvdW50LTE6bi5sYXN0O3JldHVybiB0PyEwOm0mJm4uY3VycmVudEl0ZW09PT1uLmNvdW50LTEmJjA9PT1lJiZcInByZXZcIj09PW4uZGlyZWN0aW9uPyEwOm0mJjA9PT1uLmN1cnJlbnRJdGVtJiZlPT09bi5wYWdpbmdDb3VudC0xJiZcIm5leHRcIiE9PW4uZGlyZWN0aW9uPyExOmUhPT1uLmN1cnJlbnRTbGlkZXx8bT9uLnZhcnMuYW5pbWF0aW9uTG9vcD8hMDpuLmF0RW5kJiYwPT09bi5jdXJyZW50U2xpZGUmJmU9PT1hJiZcIm5leHRcIiE9PW4uZGlyZWN0aW9uPyExOiFuLmF0RW5kfHxuLmN1cnJlbnRTbGlkZSE9PWF8fDAhPT1lfHxcIm5leHRcIiE9PW4uZGlyZWN0aW9uOiExfSxuLmdldFRhcmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbi5kaXJlY3Rpb249ZSxcIm5leHRcIj09PWU/bi5jdXJyZW50U2xpZGU9PT1uLmxhc3Q/MDpuLmN1cnJlbnRTbGlkZSsxOjA9PT1uLmN1cnJlbnRTbGlkZT9uLmxhc3Q6bi5jdXJyZW50U2xpZGUtMX0sbi5zZXRQcm9wcz1mdW5jdGlvbihlLHQsYSl7dmFyIGk9ZnVuY3Rpb24oKXt2YXIgYT1lP2U6KG4uaXRlbVcrbi52YXJzLml0ZW1NYXJnaW4pKm4ubW92ZSpuLmFuaW1hdGluZ1RvLGk9ZnVuY3Rpb24oKXtpZih2KXJldHVyblwic2V0VG91Y2hcIj09PXQ/ZTp1JiZuLmFuaW1hdGluZ1RvPT09bi5sYXN0PzA6dT9uLmxpbWl0LShuLml0ZW1XK24udmFycy5pdGVtTWFyZ2luKSpuLm1vdmUqbi5hbmltYXRpbmdUbzpuLmFuaW1hdGluZ1RvPT09bi5sYXN0P24ubGltaXQ6YTtzd2l0Y2godCl7Y2FzZVwic2V0VG90YWxcIjpyZXR1cm4gdT8obi5jb3VudC0xLW4uY3VycmVudFNsaWRlK24uY2xvbmVPZmZzZXQpKmU6KG4uY3VycmVudFNsaWRlK24uY2xvbmVPZmZzZXQpKmU7Y2FzZVwic2V0VG91Y2hcIjpyZXR1cm4gdT9lOmU7Y2FzZVwianVtcEVuZFwiOnJldHVybiB1P2U6bi5jb3VudCplO2Nhc2VcImp1bXBTdGFydFwiOnJldHVybiB1P24uY291bnQqZTplO2RlZmF1bHQ6cmV0dXJuIGV9fSgpO3JldHVybi0xKmkrXCJweFwifSgpO24udHJhbnNpdGlvbnMmJihpPWQ/XCJ0cmFuc2xhdGUzZCgwLFwiK2krXCIsMClcIjpcInRyYW5zbGF0ZTNkKFwiK2krXCIsMCwwKVwiLGE9dm9pZCAwIT09YT9hLzFlMytcInNcIjpcIjBzXCIsbi5jb250YWluZXIuY3NzKFwiLVwiK24ucGZ4K1wiLXRyYW5zaXRpb24tZHVyYXRpb25cIixhKSxuLmNvbnRhaW5lci5jc3MoXCJ0cmFuc2l0aW9uLWR1cmF0aW9uXCIsYSkpLG4uYXJnc1tuLnByb3BdPWksKG4udHJhbnNpdGlvbnN8fHZvaWQgMD09PWEpJiZuLmNvbnRhaW5lci5jc3Mobi5hcmdzKSxuLmNvbnRhaW5lci5jc3MoXCJ0cmFuc2Zvcm1cIixpKX0sbi5zZXR1cD1mdW5jdGlvbihlKXtpZihwKW4uc2xpZGVzLmNzcyh7d2lkdGg6XCIxMDAlXCIsXCJmbG9hdFwiOlwibGVmdFwiLG1hcmdpblJpZ2h0OlwiLTEwMCVcIixwb3NpdGlvbjpcInJlbGF0aXZlXCJ9KSxcImluaXRcIj09PWUmJihyP24uc2xpZGVzLmNzcyh7b3BhY2l0eTowLGRpc3BsYXk6XCJibG9ja1wiLHdlYmtpdFRyYW5zaXRpb246XCJvcGFjaXR5IFwiK24udmFycy5hbmltYXRpb25TcGVlZC8xZTMrXCJzIGVhc2VcIix6SW5kZXg6MX0pLmVxKG4uY3VycmVudFNsaWRlKS5jc3Moe29wYWNpdHk6MSx6SW5kZXg6Mn0pOjA9PW4udmFycy5mYWRlRmlyc3RTbGlkZT9uLnNsaWRlcy5jc3Moe29wYWNpdHk6MCxkaXNwbGF5OlwiYmxvY2tcIix6SW5kZXg6MX0pLmVxKG4uY3VycmVudFNsaWRlKS5jc3Moe3pJbmRleDoyfSkuY3NzKHtvcGFjaXR5OjF9KTpuLnNsaWRlcy5jc3Moe29wYWNpdHk6MCxkaXNwbGF5OlwiYmxvY2tcIix6SW5kZXg6MX0pLmVxKG4uY3VycmVudFNsaWRlKS5jc3Moe3pJbmRleDoyfSkuYW5pbWF0ZSh7b3BhY2l0eToxfSxuLnZhcnMuYW5pbWF0aW9uU3BlZWQsbi52YXJzLmVhc2luZykpLG4udmFycy5zbW9vdGhIZWlnaHQmJmYuc21vb3RoSGVpZ2h0KCk7ZWxzZXt2YXIgdCxhO1wiaW5pdFwiPT09ZSYmKG4udmlld3BvcnQ9JCgnPGRpdiBjbGFzcz1cIicraSsndmlld3BvcnRcIj48L2Rpdj4nKS5jc3Moe292ZXJmbG93OlwiaGlkZGVuXCIscG9zaXRpb246XCJyZWxhdGl2ZVwifSkuYXBwZW5kVG8obikuYXBwZW5kKG4uY29udGFpbmVyKSxuLmNsb25lQ291bnQ9MCxuLmNsb25lT2Zmc2V0PTAsdSYmKGE9JC5tYWtlQXJyYXkobi5zbGlkZXMpLnJldmVyc2UoKSxuLnNsaWRlcz0kKGEpLG4uY29udGFpbmVyLmVtcHR5KCkuYXBwZW5kKG4uc2xpZGVzKSkpLG4udmFycy5hbmltYXRpb25Mb29wJiYhdiYmKG4uY2xvbmVDb3VudD0yLG4uY2xvbmVPZmZzZXQ9MSxcImluaXRcIiE9PWUmJm4uY29udGFpbmVyLmZpbmQoXCIuY2xvbmVcIikucmVtb3ZlKCksbi5jb250YWluZXIuYXBwZW5kKGYudW5pcXVlSUQobi5zbGlkZXMuZmlyc3QoKS5jbG9uZSgpLmFkZENsYXNzKFwiY2xvbmVcIikpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSkucHJlcGVuZChmLnVuaXF1ZUlEKG4uc2xpZGVzLmxhc3QoKS5jbG9uZSgpLmFkZENsYXNzKFwiY2xvbmVcIikpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSkpLG4ubmV3U2xpZGVzPSQobi52YXJzLnNlbGVjdG9yLG4pLHQ9dT9uLmNvdW50LTEtbi5jdXJyZW50U2xpZGUrbi5jbG9uZU9mZnNldDpuLmN1cnJlbnRTbGlkZStuLmNsb25lT2Zmc2V0LGQmJiF2PyhuLmNvbnRhaW5lci5oZWlnaHQoMjAwKihuLmNvdW50K24uY2xvbmVDb3VudCkrXCIlXCIpLmNzcyhcInBvc2l0aW9uXCIsXCJhYnNvbHV0ZVwiKS53aWR0aChcIjEwMCVcIiksc2V0VGltZW91dChmdW5jdGlvbigpe24ubmV3U2xpZGVzLmNzcyh7ZGlzcGxheTpcImJsb2NrXCJ9KSxuLmRvTWF0aCgpLG4udmlld3BvcnQuaGVpZ2h0KG4uaCksbi5zZXRQcm9wcyh0Km4uaCxcImluaXRcIil9LFwiaW5pdFwiPT09ZT8xMDA6MCkpOihuLmNvbnRhaW5lci53aWR0aCgyMDAqKG4uY291bnQrbi5jbG9uZUNvdW50KStcIiVcIiksbi5zZXRQcm9wcyh0Km4uY29tcHV0ZWRXLFwiaW5pdFwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5kb01hdGgoKSxuLm5ld1NsaWRlcy5jc3Moe3dpZHRoOm4uY29tcHV0ZWRXLG1hcmdpblJpZ2h0Om4uY29tcHV0ZWRNLFwiZmxvYXRcIjpcImxlZnRcIixkaXNwbGF5OlwiYmxvY2tcIn0pLG4udmFycy5zbW9vdGhIZWlnaHQmJmYuc21vb3RoSGVpZ2h0KCl9LFwiaW5pdFwiPT09ZT8xMDA6MCkpfXZ8fG4uc2xpZGVzLnJlbW92ZUNsYXNzKGkrXCJhY3RpdmUtc2xpZGVcIikuZXEobi5jdXJyZW50U2xpZGUpLmFkZENsYXNzKGkrXCJhY3RpdmUtc2xpZGVcIiksbi52YXJzLmluaXQobil9LG4uZG9NYXRoPWZ1bmN0aW9uKCl7dmFyIGU9bi5zbGlkZXMuZmlyc3QoKSx0PW4udmFycy5pdGVtTWFyZ2luLGE9bi52YXJzLm1pbkl0ZW1zLGk9bi52YXJzLm1heEl0ZW1zO24udz12b2lkIDA9PT1uLnZpZXdwb3J0P24ud2lkdGgoKTpuLnZpZXdwb3J0LndpZHRoKCksbi5oPWUuaGVpZ2h0KCksbi5ib3hQYWRkaW5nPWUub3V0ZXJXaWR0aCgpLWUud2lkdGgoKSx2PyhuLml0ZW1UPW4udmFycy5pdGVtV2lkdGgrdCxuLml0ZW1NPXQsbi5taW5XPWE/YSpuLml0ZW1UOm4udyxuLm1heFc9aT9pKm4uaXRlbVQtdDpuLncsbi5pdGVtVz1uLm1pblc+bi53PyhuLnctdCooYS0xKSkvYTpuLm1heFc8bi53PyhuLnctdCooaS0xKSkvaTpuLnZhcnMuaXRlbVdpZHRoPm4udz9uLnc6bi52YXJzLml0ZW1XaWR0aCxuLnZpc2libGU9TWF0aC5mbG9vcihuLncvbi5pdGVtVyksbi5tb3ZlPW4udmFycy5tb3ZlPjAmJm4udmFycy5tb3ZlPG4udmlzaWJsZT9uLnZhcnMubW92ZTpuLnZpc2libGUsbi5wYWdpbmdDb3VudD1NYXRoLmNlaWwoKG4uY291bnQtbi52aXNpYmxlKS9uLm1vdmUrMSksbi5sYXN0PW4ucGFnaW5nQ291bnQtMSxuLmxpbWl0PTE9PT1uLnBhZ2luZ0NvdW50PzA6bi52YXJzLml0ZW1XaWR0aD5uLnc/bi5pdGVtVyoobi5jb3VudC0xKSt0KihuLmNvdW50LTEpOihuLml0ZW1XK3QpKm4uY291bnQtbi53LXQpOihuLml0ZW1XPW4udyxuLml0ZW1NPXQsbi5wYWdpbmdDb3VudD1uLmNvdW50LG4ubGFzdD1uLmNvdW50LTEpLG4uY29tcHV0ZWRXPW4uaXRlbVctbi5ib3hQYWRkaW5nLG4uY29tcHV0ZWRNPW4uaXRlbU19LG4udXBkYXRlPWZ1bmN0aW9uKGUsdCl7bi5kb01hdGgoKSx2fHwoZTxuLmN1cnJlbnRTbGlkZT9uLmN1cnJlbnRTbGlkZSs9MTplPD1uLmN1cnJlbnRTbGlkZSYmMCE9PWUmJihuLmN1cnJlbnRTbGlkZS09MSksbi5hbmltYXRpbmdUbz1uLmN1cnJlbnRTbGlkZSksbi52YXJzLmNvbnRyb2xOYXYmJiFuLm1hbnVhbENvbnRyb2xzJiYoXCJhZGRcIj09PXQmJiF2fHxuLnBhZ2luZ0NvdW50Pm4uY29udHJvbE5hdi5sZW5ndGg/Zi5jb250cm9sTmF2LnVwZGF0ZShcImFkZFwiKTooXCJyZW1vdmVcIj09PXQmJiF2fHxuLnBhZ2luZ0NvdW50PG4uY29udHJvbE5hdi5sZW5ndGgpJiYodiYmbi5jdXJyZW50U2xpZGU+bi5sYXN0JiYobi5jdXJyZW50U2xpZGUtPTEsbi5hbmltYXRpbmdUby09MSksZi5jb250cm9sTmF2LnVwZGF0ZShcInJlbW92ZVwiLG4ubGFzdCkpKSxuLnZhcnMuZGlyZWN0aW9uTmF2JiZmLmRpcmVjdGlvbk5hdi51cGRhdGUoKX0sbi5hZGRTbGlkZT1mdW5jdGlvbihlLHQpe3ZhciBhPSQoZSk7bi5jb3VudCs9MSxuLmxhc3Q9bi5jb3VudC0xLGQmJnU/dm9pZCAwIT09dD9uLnNsaWRlcy5lcShuLmNvdW50LXQpLmFmdGVyKGEpOm4uY29udGFpbmVyLnByZXBlbmQoYSk6dm9pZCAwIT09dD9uLnNsaWRlcy5lcSh0KS5iZWZvcmUoYSk6bi5jb250YWluZXIuYXBwZW5kKGEpLG4udXBkYXRlKHQsXCJhZGRcIiksbi5zbGlkZXM9JChuLnZhcnMuc2VsZWN0b3IrXCI6bm90KC5jbG9uZSlcIixuKSxuLnNldHVwKCksbi52YXJzLmFkZGVkKG4pfSxuLnJlbW92ZVNsaWRlPWZ1bmN0aW9uKGUpe3ZhciB0PWlzTmFOKGUpP24uc2xpZGVzLmluZGV4KCQoZSkpOmU7bi5jb3VudC09MSxuLmxhc3Q9bi5jb3VudC0xLGlzTmFOKGUpPyQoZSxuLnNsaWRlcykucmVtb3ZlKCk6ZCYmdT9uLnNsaWRlcy5lcShuLmxhc3QpLnJlbW92ZSgpOm4uc2xpZGVzLmVxKGUpLnJlbW92ZSgpLG4uZG9NYXRoKCksbi51cGRhdGUodCxcInJlbW92ZVwiKSxuLnNsaWRlcz0kKG4udmFycy5zZWxlY3RvcitcIjpub3QoLmNsb25lKVwiLG4pLG4uc2V0dXAoKSxuLnZhcnMucmVtb3ZlZChuKX0sZi5pbml0KCl9LCQod2luZG93KS5ibHVyKGZ1bmN0aW9uKHQpe2U9ITF9KS5mb2N1cyhmdW5jdGlvbih0KXtlPSEwfSksJC5mbGV4c2xpZGVyLmRlZmF1bHRzPXtuYW1lc3BhY2U6XCJmbGV4LVwiLHNlbGVjdG9yOlwiLnNsaWRlcyA+IGxpXCIsYW5pbWF0aW9uOlwiZmFkZVwiLGVhc2luZzpcInN3aW5nXCIsZGlyZWN0aW9uOlwiaG9yaXpvbnRhbFwiLHJldmVyc2U6ITEsYW5pbWF0aW9uTG9vcDohMCxzbW9vdGhIZWlnaHQ6ITEsc3RhcnRBdDowLHNsaWRlc2hvdzohMCxzbGlkZXNob3dTcGVlZDo3ZTMsYW5pbWF0aW9uU3BlZWQ6NjAwLGluaXREZWxheTowLHJhbmRvbWl6ZTohMSxmYWRlRmlyc3RTbGlkZTohMCx0aHVtYkNhcHRpb25zOiExLHBhdXNlT25BY3Rpb246ITAscGF1c2VPbkhvdmVyOiExLHBhdXNlSW52aXNpYmxlOiEwLHVzZUNTUzohMCx0b3VjaDohMCx2aWRlbzohMSxjb250cm9sTmF2OiEwLGRpcmVjdGlvbk5hdjohMCxwcmV2VGV4dDpcIlByZXZpb3VzXCIsbmV4dFRleHQ6XCJOZXh0XCIsa2V5Ym9hcmQ6ITAsbXVsdGlwbGVLZXlib2FyZDohMSxtb3VzZXdoZWVsOiExLHBhdXNlUGxheTohMSxwYXVzZVRleHQ6XCJQYXVzZVwiLHBsYXlUZXh0OlwiUGxheVwiLGNvbnRyb2xzQ29udGFpbmVyOlwiXCIsbWFudWFsQ29udHJvbHM6XCJcIixjdXN0b21EaXJlY3Rpb25OYXY6XCJcIixzeW5jOlwiXCIsYXNOYXZGb3I6XCJcIixpdGVtV2lkdGg6MCxpdGVtTWFyZ2luOjAsbWluSXRlbXM6MSxtYXhJdGVtczowLG1vdmU6MCxhbGxvd09uZVNsaWRlOiEwLHN0YXJ0OmZ1bmN0aW9uKCl7fSxiZWZvcmU6ZnVuY3Rpb24oKXt9LGFmdGVyOmZ1bmN0aW9uKCl7fSxlbmQ6ZnVuY3Rpb24oKXt9LGFkZGVkOmZ1bmN0aW9uKCl7fSxyZW1vdmVkOmZ1bmN0aW9uKCl7fSxpbml0OmZ1bmN0aW9uKCl7fX0sJC5mbi5mbGV4c2xpZGVyPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPXt9KSxcIm9iamVjdFwiPT10eXBlb2YgZSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9JCh0aGlzKSxhPWUuc2VsZWN0b3I/ZS5zZWxlY3RvcjpcIi5zbGlkZXMgPiBsaVwiLG49dC5maW5kKGEpOzE9PT1uLmxlbmd0aCYmZS5hbGxvd09uZVNsaWRlPT09ITF8fDA9PT1uLmxlbmd0aD8obi5mYWRlSW4oNDAwKSxlLnN0YXJ0JiZlLnN0YXJ0KHQpKTp2b2lkIDA9PT10LmRhdGEoXCJmbGV4c2xpZGVyXCIpJiZuZXcgJC5mbGV4c2xpZGVyKHRoaXMsZSl9KTt2YXIgdD0kKHRoaXMpLmRhdGEoXCJmbGV4c2xpZGVyXCIpO3N3aXRjaChlKXtjYXNlXCJwbGF5XCI6dC5wbGF5KCk7YnJlYWs7Y2FzZVwicGF1c2VcIjp0LnBhdXNlKCk7YnJlYWs7Y2FzZVwic3RvcFwiOnQuc3RvcCgpO2JyZWFrO2Nhc2VcIm5leHRcIjp0LmZsZXhBbmltYXRlKHQuZ2V0VGFyZ2V0KFwibmV4dFwiKSwhMCk7YnJlYWs7Y2FzZVwicHJldlwiOmNhc2VcInByZXZpb3VzXCI6dC5mbGV4QW5pbWF0ZSh0LmdldFRhcmdldChcInByZXZcIiksITApO2JyZWFrO2RlZmF1bHQ6XCJudW1iZXJcIj09dHlwZW9mIGUmJnQuZmxleEFuaW1hdGUoZSwhMCl9fX0oalF1ZXJ5KTsiLCIvKiEgTWFnbmlmaWMgUG9wdXAgLSB2MS4xLjAgLSAyMDE2LTAyLTIwXHJcbiogaHR0cDovL2RpbXNlbWVub3YuY29tL3BsdWdpbnMvbWFnbmlmaWMtcG9wdXAvXHJcbiogQ29weXJpZ2h0IChjKSAyMDE2IERtaXRyeSBTZW1lbm92OyAqL1xyXG4hZnVuY3Rpb24oYSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sYSk6YShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9yZXF1aXJlKFwianF1ZXJ5XCIpOndpbmRvdy5qUXVlcnl8fHdpbmRvdy5aZXB0byl9KGZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPVwiQ2xvc2VcIixpPVwiQmVmb3JlQ2xvc2VcIixqPVwiQWZ0ZXJDbG9zZVwiLGs9XCJCZWZvcmVBcHBlbmRcIixsPVwiTWFya3VwUGFyc2VcIixtPVwiT3BlblwiLG49XCJDaGFuZ2VcIixvPVwibWZwXCIscD1cIi5cIitvLHE9XCJtZnAtcmVhZHlcIixyPVwibWZwLXJlbW92aW5nXCIscz1cIm1mcC1wcmV2ZW50LWNsb3NlXCIsdD1mdW5jdGlvbigpe30sdT0hIXdpbmRvdy5qUXVlcnksdj1hKHdpbmRvdyksdz1mdW5jdGlvbihhLGMpe2IuZXYub24obythK3AsYyl9LHg9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gZi5jbGFzc05hbWU9XCJtZnAtXCIrYixkJiYoZi5pbm5lckhUTUw9ZCksZT9jJiZjLmFwcGVuZENoaWxkKGYpOihmPWEoZiksYyYmZi5hcHBlbmRUbyhjKSksZn0seT1mdW5jdGlvbihjLGQpe2IuZXYudHJpZ2dlckhhbmRsZXIobytjLGQpLGIuc3QuY2FsbGJhY2tzJiYoYz1jLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK2Muc2xpY2UoMSksYi5zdC5jYWxsYmFja3NbY10mJmIuc3QuY2FsbGJhY2tzW2NdLmFwcGx5KGIsYS5pc0FycmF5KGQpP2Q6W2RdKSl9LHo9ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PT1nJiZiLmN1cnJUZW1wbGF0ZS5jbG9zZUJ0bnx8KGIuY3VyclRlbXBsYXRlLmNsb3NlQnRuPWEoYi5zdC5jbG9zZU1hcmt1cC5yZXBsYWNlKFwiJXRpdGxlJVwiLGIuc3QudENsb3NlKSksZz1jKSxiLmN1cnJUZW1wbGF0ZS5jbG9zZUJ0bn0sQT1mdW5jdGlvbigpe2EubWFnbmlmaWNQb3B1cC5pbnN0YW5jZXx8KGI9bmV3IHQsYi5pbml0KCksYS5tYWduaWZpY1BvcHVwLmluc3RhbmNlPWIpfSxCPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIikuc3R5bGUsYj1bXCJtc1wiLFwiT1wiLFwiTW96XCIsXCJXZWJraXRcIl07aWYodm9pZCAwIT09YS50cmFuc2l0aW9uKXJldHVybiEwO2Zvcig7Yi5sZW5ndGg7KWlmKGIucG9wKCkrXCJUcmFuc2l0aW9uXCJpbiBhKXJldHVybiEwO3JldHVybiExfTt0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dCxpbml0OmZ1bmN0aW9uKCl7dmFyIGM9bmF2aWdhdG9yLmFwcFZlcnNpb247Yi5pc0xvd0lFPWIuaXNJRTg9ZG9jdW1lbnQuYWxsJiYhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcixiLmlzQW5kcm9pZD0vYW5kcm9pZC9naS50ZXN0KGMpLGIuaXNJT1M9L2lwaG9uZXxpcGFkfGlwb2QvZ2kudGVzdChjKSxiLnN1cHBvcnRzVHJhbnNpdGlvbj1CKCksYi5wcm9iYWJseU1vYmlsZT1iLmlzQW5kcm9pZHx8Yi5pc0lPU3x8LyhPcGVyYSBNaW5pKXxLaW5kbGV8d2ViT1N8QmxhY2tCZXJyeXwoT3BlcmEgTW9iaSl8KFdpbmRvd3MgUGhvbmUpfElFTW9iaWxlL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxkPWEoZG9jdW1lbnQpLGIucG9wdXBzQ2FjaGU9e319LG9wZW46ZnVuY3Rpb24oYyl7dmFyIGU7aWYoYy5pc09iaj09PSExKXtiLml0ZW1zPWMuaXRlbXMudG9BcnJheSgpLGIuaW5kZXg9MDt2YXIgZyxoPWMuaXRlbXM7Zm9yKGU9MDtlPGgubGVuZ3RoO2UrKylpZihnPWhbZV0sZy5wYXJzZWQmJihnPWcuZWxbMF0pLGc9PT1jLmVsWzBdKXtiLmluZGV4PWU7YnJlYWt9fWVsc2UgYi5pdGVtcz1hLmlzQXJyYXkoYy5pdGVtcyk/Yy5pdGVtczpbYy5pdGVtc10sYi5pbmRleD1jLmluZGV4fHwwO2lmKGIuaXNPcGVuKXJldHVybiB2b2lkIGIudXBkYXRlSXRlbUhUTUwoKTtiLnR5cGVzPVtdLGY9XCJcIixjLm1haW5FbCYmYy5tYWluRWwubGVuZ3RoP2IuZXY9Yy5tYWluRWwuZXEoMCk6Yi5ldj1kLGMua2V5PyhiLnBvcHVwc0NhY2hlW2Mua2V5XXx8KGIucG9wdXBzQ2FjaGVbYy5rZXldPXt9KSxiLmN1cnJUZW1wbGF0ZT1iLnBvcHVwc0NhY2hlW2Mua2V5XSk6Yi5jdXJyVGVtcGxhdGU9e30sYi5zdD1hLmV4dGVuZCghMCx7fSxhLm1hZ25pZmljUG9wdXAuZGVmYXVsdHMsYyksYi5maXhlZENvbnRlbnRQb3M9XCJhdXRvXCI9PT1iLnN0LmZpeGVkQ29udGVudFBvcz8hYi5wcm9iYWJseU1vYmlsZTpiLnN0LmZpeGVkQ29udGVudFBvcyxiLnN0Lm1vZGFsJiYoYi5zdC5jbG9zZU9uQ29udGVudENsaWNrPSExLGIuc3QuY2xvc2VPbkJnQ2xpY2s9ITEsYi5zdC5zaG93Q2xvc2VCdG49ITEsYi5zdC5lbmFibGVFc2NhcGVLZXk9ITEpLGIuYmdPdmVybGF5fHwoYi5iZ092ZXJsYXk9eChcImJnXCIpLm9uKFwiY2xpY2tcIitwLGZ1bmN0aW9uKCl7Yi5jbG9zZSgpfSksYi53cmFwPXgoXCJ3cmFwXCIpLmF0dHIoXCJ0YWJpbmRleFwiLC0xKS5vbihcImNsaWNrXCIrcCxmdW5jdGlvbihhKXtiLl9jaGVja0lmQ2xvc2UoYS50YXJnZXQpJiZiLmNsb3NlKCl9KSxiLmNvbnRhaW5lcj14KFwiY29udGFpbmVyXCIsYi53cmFwKSksYi5jb250ZW50Q29udGFpbmVyPXgoXCJjb250ZW50XCIpLGIuc3QucHJlbG9hZGVyJiYoYi5wcmVsb2FkZXI9eChcInByZWxvYWRlclwiLGIuY29udGFpbmVyLGIuc3QudExvYWRpbmcpKTt2YXIgaT1hLm1hZ25pZmljUG9wdXAubW9kdWxlcztmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKXt2YXIgaj1pW2VdO2o9ai5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStqLnNsaWNlKDEpLGJbXCJpbml0XCIral0uY2FsbChiKX15KFwiQmVmb3JlT3BlblwiKSxiLnN0LnNob3dDbG9zZUJ0biYmKGIuc3QuY2xvc2VCdG5JbnNpZGU/KHcobCxmdW5jdGlvbihhLGIsYyxkKXtjLmNsb3NlX3JlcGxhY2VXaXRoPXooZC50eXBlKX0pLGYrPVwiIG1mcC1jbG9zZS1idG4taW5cIik6Yi53cmFwLmFwcGVuZCh6KCkpKSxiLnN0LmFsaWduVG9wJiYoZis9XCIgbWZwLWFsaWduLXRvcFwiKSxiLmZpeGVkQ29udGVudFBvcz9iLndyYXAuY3NzKHtvdmVyZmxvdzpiLnN0Lm92ZXJmbG93WSxvdmVyZmxvd1g6XCJoaWRkZW5cIixvdmVyZmxvd1k6Yi5zdC5vdmVyZmxvd1l9KTpiLndyYXAuY3NzKHt0b3A6di5zY3JvbGxUb3AoKSxwb3NpdGlvbjpcImFic29sdXRlXCJ9KSwoYi5zdC5maXhlZEJnUG9zPT09ITF8fFwiYXV0b1wiPT09Yi5zdC5maXhlZEJnUG9zJiYhYi5maXhlZENvbnRlbnRQb3MpJiZiLmJnT3ZlcmxheS5jc3Moe2hlaWdodDpkLmhlaWdodCgpLHBvc2l0aW9uOlwiYWJzb2x1dGVcIn0pLGIuc3QuZW5hYmxlRXNjYXBlS2V5JiZkLm9uKFwia2V5dXBcIitwLGZ1bmN0aW9uKGEpezI3PT09YS5rZXlDb2RlJiZiLmNsb3NlKCl9KSx2Lm9uKFwicmVzaXplXCIrcCxmdW5jdGlvbigpe2IudXBkYXRlU2l6ZSgpfSksYi5zdC5jbG9zZU9uQ29udGVudENsaWNrfHwoZis9XCIgbWZwLWF1dG8tY3Vyc29yXCIpLGYmJmIud3JhcC5hZGRDbGFzcyhmKTt2YXIgaz1iLndIPXYuaGVpZ2h0KCksbj17fTtpZihiLmZpeGVkQ29udGVudFBvcyYmYi5faGFzU2Nyb2xsQmFyKGspKXt2YXIgbz1iLl9nZXRTY3JvbGxiYXJTaXplKCk7byYmKG4ubWFyZ2luUmlnaHQ9byl9Yi5maXhlZENvbnRlbnRQb3MmJihiLmlzSUU3P2EoXCJib2R5LCBodG1sXCIpLmNzcyhcIm92ZXJmbG93XCIsXCJoaWRkZW5cIik6bi5vdmVyZmxvdz1cImhpZGRlblwiKTt2YXIgcj1iLnN0Lm1haW5DbGFzcztyZXR1cm4gYi5pc0lFNyYmKHIrPVwiIG1mcC1pZTdcIiksciYmYi5fYWRkQ2xhc3NUb01GUChyKSxiLnVwZGF0ZUl0ZW1IVE1MKCkseShcIkJ1aWxkQ29udHJvbHNcIiksYShcImh0bWxcIikuY3NzKG4pLGIuYmdPdmVybGF5LmFkZChiLndyYXApLnByZXBlbmRUbyhiLnN0LnByZXBlbmRUb3x8YShkb2N1bWVudC5ib2R5KSksYi5fbGFzdEZvY3VzZWRFbD1kb2N1bWVudC5hY3RpdmVFbGVtZW50LHNldFRpbWVvdXQoZnVuY3Rpb24oKXtiLmNvbnRlbnQ/KGIuX2FkZENsYXNzVG9NRlAocSksYi5fc2V0Rm9jdXMoKSk6Yi5iZ092ZXJsYXkuYWRkQ2xhc3MocSksZC5vbihcImZvY3VzaW5cIitwLGIuX29uRm9jdXNJbil9LDE2KSxiLmlzT3Blbj0hMCxiLnVwZGF0ZVNpemUoaykseShtKSxjfSxjbG9zZTpmdW5jdGlvbigpe2IuaXNPcGVuJiYoeShpKSxiLmlzT3Blbj0hMSxiLnN0LnJlbW92YWxEZWxheSYmIWIuaXNMb3dJRSYmYi5zdXBwb3J0c1RyYW5zaXRpb24/KGIuX2FkZENsYXNzVG9NRlAociksc2V0VGltZW91dChmdW5jdGlvbigpe2IuX2Nsb3NlKCl9LGIuc3QucmVtb3ZhbERlbGF5KSk6Yi5fY2xvc2UoKSl9LF9jbG9zZTpmdW5jdGlvbigpe3koaCk7dmFyIGM9citcIiBcIitxK1wiIFwiO2lmKGIuYmdPdmVybGF5LmRldGFjaCgpLGIud3JhcC5kZXRhY2goKSxiLmNvbnRhaW5lci5lbXB0eSgpLGIuc3QubWFpbkNsYXNzJiYoYys9Yi5zdC5tYWluQ2xhc3MrXCIgXCIpLGIuX3JlbW92ZUNsYXNzRnJvbU1GUChjKSxiLmZpeGVkQ29udGVudFBvcyl7dmFyIGU9e21hcmdpblJpZ2h0OlwiXCJ9O2IuaXNJRTc/YShcImJvZHksIGh0bWxcIikuY3NzKFwib3ZlcmZsb3dcIixcIlwiKTplLm92ZXJmbG93PVwiXCIsYShcImh0bWxcIikuY3NzKGUpfWQub2ZmKFwia2V5dXBcIitwK1wiIGZvY3VzaW5cIitwKSxiLmV2Lm9mZihwKSxiLndyYXAuYXR0cihcImNsYXNzXCIsXCJtZnAtd3JhcFwiKS5yZW1vdmVBdHRyKFwic3R5bGVcIiksYi5iZ092ZXJsYXkuYXR0cihcImNsYXNzXCIsXCJtZnAtYmdcIiksYi5jb250YWluZXIuYXR0cihcImNsYXNzXCIsXCJtZnAtY29udGFpbmVyXCIpLCFiLnN0LnNob3dDbG9zZUJ0bnx8Yi5zdC5jbG9zZUJ0bkluc2lkZSYmYi5jdXJyVGVtcGxhdGVbYi5jdXJySXRlbS50eXBlXSE9PSEwfHxiLmN1cnJUZW1wbGF0ZS5jbG9zZUJ0biYmYi5jdXJyVGVtcGxhdGUuY2xvc2VCdG4uZGV0YWNoKCksYi5zdC5hdXRvRm9jdXNMYXN0JiZiLl9sYXN0Rm9jdXNlZEVsJiZhKGIuX2xhc3RGb2N1c2VkRWwpLmZvY3VzKCksYi5jdXJySXRlbT1udWxsLGIuY29udGVudD1udWxsLGIuY3VyclRlbXBsYXRlPW51bGwsYi5wcmV2SGVpZ2h0PTAseShqKX0sdXBkYXRlU2l6ZTpmdW5jdGlvbihhKXtpZihiLmlzSU9TKXt2YXIgYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgvd2luZG93LmlubmVyV2lkdGgsZD13aW5kb3cuaW5uZXJIZWlnaHQqYztiLndyYXAuY3NzKFwiaGVpZ2h0XCIsZCksYi53SD1kfWVsc2UgYi53SD1hfHx2LmhlaWdodCgpO2IuZml4ZWRDb250ZW50UG9zfHxiLndyYXAuY3NzKFwiaGVpZ2h0XCIsYi53SCkseShcIlJlc2l6ZVwiKX0sdXBkYXRlSXRlbUhUTUw6ZnVuY3Rpb24oKXt2YXIgYz1iLml0ZW1zW2IuaW5kZXhdO2IuY29udGVudENvbnRhaW5lci5kZXRhY2goKSxiLmNvbnRlbnQmJmIuY29udGVudC5kZXRhY2goKSxjLnBhcnNlZHx8KGM9Yi5wYXJzZUVsKGIuaW5kZXgpKTt2YXIgZD1jLnR5cGU7aWYoeShcIkJlZm9yZUNoYW5nZVwiLFtiLmN1cnJJdGVtP2IuY3Vyckl0ZW0udHlwZTpcIlwiLGRdKSxiLmN1cnJJdGVtPWMsIWIuY3VyclRlbXBsYXRlW2RdKXt2YXIgZj1iLnN0W2RdP2Iuc3RbZF0ubWFya3VwOiExO3koXCJGaXJzdE1hcmt1cFBhcnNlXCIsZiksZj9iLmN1cnJUZW1wbGF0ZVtkXT1hKGYpOmIuY3VyclRlbXBsYXRlW2RdPSEwfWUmJmUhPT1jLnR5cGUmJmIuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwibWZwLVwiK2UrXCItaG9sZGVyXCIpO3ZhciBnPWJbXCJnZXRcIitkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Quc2xpY2UoMSldKGMsYi5jdXJyVGVtcGxhdGVbZF0pO2IuYXBwZW5kQ29udGVudChnLGQpLGMucHJlbG9hZGVkPSEwLHkobixjKSxlPWMudHlwZSxiLmNvbnRhaW5lci5wcmVwZW5kKGIuY29udGVudENvbnRhaW5lcikseShcIkFmdGVyQ2hhbmdlXCIpfSxhcHBlbmRDb250ZW50OmZ1bmN0aW9uKGEsYyl7Yi5jb250ZW50PWEsYT9iLnN0LnNob3dDbG9zZUJ0biYmYi5zdC5jbG9zZUJ0bkluc2lkZSYmYi5jdXJyVGVtcGxhdGVbY109PT0hMD9iLmNvbnRlbnQuZmluZChcIi5tZnAtY2xvc2VcIikubGVuZ3RofHxiLmNvbnRlbnQuYXBwZW5kKHooKSk6Yi5jb250ZW50PWE6Yi5jb250ZW50PVwiXCIseShrKSxiLmNvbnRhaW5lci5hZGRDbGFzcyhcIm1mcC1cIitjK1wiLWhvbGRlclwiKSxiLmNvbnRlbnRDb250YWluZXIuYXBwZW5kKGIuY29udGVudCl9LHBhcnNlRWw6ZnVuY3Rpb24oYyl7dmFyIGQsZT1iLml0ZW1zW2NdO2lmKGUudGFnTmFtZT9lPXtlbDphKGUpfTooZD1lLnR5cGUsZT17ZGF0YTplLHNyYzplLnNyY30pLGUuZWwpe2Zvcih2YXIgZj1iLnR5cGVzLGc9MDtnPGYubGVuZ3RoO2crKylpZihlLmVsLmhhc0NsYXNzKFwibWZwLVwiK2ZbZ10pKXtkPWZbZ107YnJlYWt9ZS5zcmM9ZS5lbC5hdHRyKFwiZGF0YS1tZnAtc3JjXCIpLGUuc3JjfHwoZS5zcmM9ZS5lbC5hdHRyKFwiaHJlZlwiKSl9cmV0dXJuIGUudHlwZT1kfHxiLnN0LnR5cGV8fFwiaW5saW5lXCIsZS5pbmRleD1jLGUucGFyc2VkPSEwLGIuaXRlbXNbY109ZSx5KFwiRWxlbWVudFBhcnNlXCIsZSksYi5pdGVtc1tjXX0sYWRkR3JvdXA6ZnVuY3Rpb24oYSxjKXt2YXIgZD1mdW5jdGlvbihkKXtkLm1mcEVsPXRoaXMsYi5fb3BlbkNsaWNrKGQsYSxjKX07Y3x8KGM9e30pO3ZhciBlPVwiY2xpY2subWFnbmlmaWNQb3B1cFwiO2MubWFpbkVsPWEsYy5pdGVtcz8oYy5pc09iaj0hMCxhLm9mZihlKS5vbihlLGQpKTooYy5pc09iaj0hMSxjLmRlbGVnYXRlP2Eub2ZmKGUpLm9uKGUsYy5kZWxlZ2F0ZSxkKTooYy5pdGVtcz1hLGEub2ZmKGUpLm9uKGUsZCkpKX0sX29wZW5DbGljazpmdW5jdGlvbihjLGQsZSl7dmFyIGY9dm9pZCAwIT09ZS5taWRDbGljaz9lLm1pZENsaWNrOmEubWFnbmlmaWNQb3B1cC5kZWZhdWx0cy5taWRDbGljaztpZihmfHwhKDI9PT1jLndoaWNofHxjLmN0cmxLZXl8fGMubWV0YUtleXx8Yy5hbHRLZXl8fGMuc2hpZnRLZXkpKXt2YXIgZz12b2lkIDAhPT1lLmRpc2FibGVPbj9lLmRpc2FibGVPbjphLm1hZ25pZmljUG9wdXAuZGVmYXVsdHMuZGlzYWJsZU9uO2lmKGcpaWYoYS5pc0Z1bmN0aW9uKGcpKXtpZighZy5jYWxsKGIpKXJldHVybiEwfWVsc2UgaWYodi53aWR0aCgpPGcpcmV0dXJuITA7Yy50eXBlJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGIuaXNPcGVuJiZjLnN0b3BQcm9wYWdhdGlvbigpKSxlLmVsPWEoYy5tZnBFbCksZS5kZWxlZ2F0ZSYmKGUuaXRlbXM9ZC5maW5kKGUuZGVsZWdhdGUpKSxiLm9wZW4oZSl9fSx1cGRhdGVTdGF0dXM6ZnVuY3Rpb24oYSxkKXtpZihiLnByZWxvYWRlcil7YyE9PWEmJmIuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwibWZwLXMtXCIrYyksZHx8XCJsb2FkaW5nXCIhPT1hfHwoZD1iLnN0LnRMb2FkaW5nKTt2YXIgZT17c3RhdHVzOmEsdGV4dDpkfTt5KFwiVXBkYXRlU3RhdHVzXCIsZSksYT1lLnN0YXR1cyxkPWUudGV4dCxiLnByZWxvYWRlci5odG1sKGQpLGIucHJlbG9hZGVyLmZpbmQoXCJhXCIpLm9uKFwiY2xpY2tcIixmdW5jdGlvbihhKXthLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSksYi5jb250YWluZXIuYWRkQ2xhc3MoXCJtZnAtcy1cIithKSxjPWF9fSxfY2hlY2tJZkNsb3NlOmZ1bmN0aW9uKGMpe2lmKCFhKGMpLmhhc0NsYXNzKHMpKXt2YXIgZD1iLnN0LmNsb3NlT25Db250ZW50Q2xpY2ssZT1iLnN0LmNsb3NlT25CZ0NsaWNrO2lmKGQmJmUpcmV0dXJuITA7aWYoIWIuY29udGVudHx8YShjKS5oYXNDbGFzcyhcIm1mcC1jbG9zZVwiKXx8Yi5wcmVsb2FkZXImJmM9PT1iLnByZWxvYWRlclswXSlyZXR1cm4hMDtpZihjPT09Yi5jb250ZW50WzBdfHxhLmNvbnRhaW5zKGIuY29udGVudFswXSxjKSl7aWYoZClyZXR1cm4hMH1lbHNlIGlmKGUmJmEuY29udGFpbnMoZG9jdW1lbnQsYykpcmV0dXJuITA7cmV0dXJuITF9fSxfYWRkQ2xhc3NUb01GUDpmdW5jdGlvbihhKXtiLmJnT3ZlcmxheS5hZGRDbGFzcyhhKSxiLndyYXAuYWRkQ2xhc3MoYSl9LF9yZW1vdmVDbGFzc0Zyb21NRlA6ZnVuY3Rpb24oYSl7dGhpcy5iZ092ZXJsYXkucmVtb3ZlQ2xhc3MoYSksYi53cmFwLnJlbW92ZUNsYXNzKGEpfSxfaGFzU2Nyb2xsQmFyOmZ1bmN0aW9uKGEpe3JldHVybihiLmlzSUU3P2QuaGVpZ2h0KCk6ZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpPihhfHx2LmhlaWdodCgpKX0sX3NldEZvY3VzOmZ1bmN0aW9uKCl7KGIuc3QuZm9jdXM/Yi5jb250ZW50LmZpbmQoYi5zdC5mb2N1cykuZXEoMCk6Yi53cmFwKS5mb2N1cygpfSxfb25Gb2N1c0luOmZ1bmN0aW9uKGMpe3JldHVybiBjLnRhcmdldD09PWIud3JhcFswXXx8YS5jb250YWlucyhiLndyYXBbMF0sYy50YXJnZXQpP3ZvaWQgMDooYi5fc2V0Rm9jdXMoKSwhMSl9LF9wYXJzZU1hcmt1cDpmdW5jdGlvbihiLGMsZCl7dmFyIGU7ZC5kYXRhJiYoYz1hLmV4dGVuZChkLmRhdGEsYykpLHkobCxbYixjLGRdKSxhLmVhY2goYyxmdW5jdGlvbihjLGQpe2lmKHZvaWQgMD09PWR8fGQ9PT0hMSlyZXR1cm4hMDtpZihlPWMuc3BsaXQoXCJfXCIpLGUubGVuZ3RoPjEpe3ZhciBmPWIuZmluZChwK1wiLVwiK2VbMF0pO2lmKGYubGVuZ3RoPjApe3ZhciBnPWVbMV07XCJyZXBsYWNlV2l0aFwiPT09Zz9mWzBdIT09ZFswXSYmZi5yZXBsYWNlV2l0aChkKTpcImltZ1wiPT09Zz9mLmlzKFwiaW1nXCIpP2YuYXR0cihcInNyY1wiLGQpOmYucmVwbGFjZVdpdGgoYShcIjxpbWc+XCIpLmF0dHIoXCJzcmNcIixkKS5hdHRyKFwiY2xhc3NcIixmLmF0dHIoXCJjbGFzc1wiKSkpOmYuYXR0cihlWzFdLGQpfX1lbHNlIGIuZmluZChwK1wiLVwiK2MpLmh0bWwoZCl9KX0sX2dldFNjcm9sbGJhclNpemU6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1iLnNjcm9sbGJhclNpemUpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7YS5zdHlsZS5jc3NUZXh0PVwid2lkdGg6IDk5cHg7IGhlaWdodDogOTlweDsgb3ZlcmZsb3c6IHNjcm9sbDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IC05OTk5cHg7XCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKSxiLnNjcm9sbGJhclNpemU9YS5vZmZzZXRXaWR0aC1hLmNsaWVudFdpZHRoLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSl9cmV0dXJuIGIuc2Nyb2xsYmFyU2l6ZX19LGEubWFnbmlmaWNQb3B1cD17aW5zdGFuY2U6bnVsbCxwcm90bzp0LnByb3RvdHlwZSxtb2R1bGVzOltdLG9wZW46ZnVuY3Rpb24oYixjKXtyZXR1cm4gQSgpLGI9Yj9hLmV4dGVuZCghMCx7fSxiKTp7fSxiLmlzT2JqPSEwLGIuaW5kZXg9Y3x8MCx0aGlzLmluc3RhbmNlLm9wZW4oYil9LGNsb3NlOmZ1bmN0aW9uKCl7cmV0dXJuIGEubWFnbmlmaWNQb3B1cC5pbnN0YW5jZSYmYS5tYWduaWZpY1BvcHVwLmluc3RhbmNlLmNsb3NlKCl9LHJlZ2lzdGVyTW9kdWxlOmZ1bmN0aW9uKGIsYyl7Yy5vcHRpb25zJiYoYS5tYWduaWZpY1BvcHVwLmRlZmF1bHRzW2JdPWMub3B0aW9ucyksYS5leHRlbmQodGhpcy5wcm90byxjLnByb3RvKSx0aGlzLm1vZHVsZXMucHVzaChiKX0sZGVmYXVsdHM6e2Rpc2FibGVPbjowLGtleTpudWxsLG1pZENsaWNrOiExLG1haW5DbGFzczpcIlwiLHByZWxvYWRlcjohMCxmb2N1czpcIlwiLGNsb3NlT25Db250ZW50Q2xpY2s6ITEsY2xvc2VPbkJnQ2xpY2s6ITAsY2xvc2VCdG5JbnNpZGU6ITAsc2hvd0Nsb3NlQnRuOiEwLGVuYWJsZUVzY2FwZUtleTohMCxtb2RhbDohMSxhbGlnblRvcDohMSxyZW1vdmFsRGVsYXk6MCxwcmVwZW5kVG86bnVsbCxmaXhlZENvbnRlbnRQb3M6XCJhdXRvXCIsZml4ZWRCZ1BvczpcImF1dG9cIixvdmVyZmxvd1k6XCJhdXRvXCIsY2xvc2VNYXJrdXA6JzxidXR0b24gdGl0bGU9XCIldGl0bGUlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWZwLWNsb3NlXCI+JiMyMTU7PC9idXR0b24+Jyx0Q2xvc2U6XCJDbG9zZSAoRXNjKVwiLHRMb2FkaW5nOlwiTG9hZGluZy4uLlwiLGF1dG9Gb2N1c0xhc3Q6ITB9fSxhLmZuLm1hZ25pZmljUG9wdXA9ZnVuY3Rpb24oYyl7QSgpO3ZhciBkPWEodGhpcyk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGMpaWYoXCJvcGVuXCI9PT1jKXt2YXIgZSxmPXU/ZC5kYXRhKFwibWFnbmlmaWNQb3B1cFwiKTpkWzBdLm1hZ25pZmljUG9wdXAsZz1wYXJzZUludChhcmd1bWVudHNbMV0sMTApfHwwO2YuaXRlbXM/ZT1mLml0ZW1zW2ddOihlPWQsZi5kZWxlZ2F0ZSYmKGU9ZS5maW5kKGYuZGVsZWdhdGUpKSxlPWUuZXEoZykpLGIuX29wZW5DbGljayh7bWZwRWw6ZX0sZCxmKX1lbHNlIGIuaXNPcGVuJiZiW2NdLmFwcGx5KGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTtlbHNlIGM9YS5leHRlbmQoITAse30sYyksdT9kLmRhdGEoXCJtYWduaWZpY1BvcHVwXCIsYyk6ZFswXS5tYWduaWZpY1BvcHVwPWMsYi5hZGRHcm91cChkLGMpO3JldHVybiBkfTt2YXIgQyxELEUsRj1cImlubGluZVwiLEc9ZnVuY3Rpb24oKXtFJiYoRC5hZnRlcihFLmFkZENsYXNzKEMpKS5kZXRhY2goKSxFPW51bGwpfTthLm1hZ25pZmljUG9wdXAucmVnaXN0ZXJNb2R1bGUoRix7b3B0aW9uczp7aGlkZGVuQ2xhc3M6XCJoaWRlXCIsbWFya3VwOlwiXCIsdE5vdEZvdW5kOlwiQ29udGVudCBub3QgZm91bmRcIn0scHJvdG86e2luaXRJbmxpbmU6ZnVuY3Rpb24oKXtiLnR5cGVzLnB1c2goRiksdyhoK1wiLlwiK0YsZnVuY3Rpb24oKXtHKCl9KX0sZ2V0SW5saW5lOmZ1bmN0aW9uKGMsZCl7aWYoRygpLGMuc3JjKXt2YXIgZT1iLnN0LmlubGluZSxmPWEoYy5zcmMpO2lmKGYubGVuZ3RoKXt2YXIgZz1mWzBdLnBhcmVudE5vZGU7ZyYmZy50YWdOYW1lJiYoRHx8KEM9ZS5oaWRkZW5DbGFzcyxEPXgoQyksQz1cIm1mcC1cIitDKSxFPWYuYWZ0ZXIoRCkuZGV0YWNoKCkucmVtb3ZlQ2xhc3MoQykpLGIudXBkYXRlU3RhdHVzKFwicmVhZHlcIil9ZWxzZSBiLnVwZGF0ZVN0YXR1cyhcImVycm9yXCIsZS50Tm90Rm91bmQpLGY9YShcIjxkaXY+XCIpO3JldHVybiBjLmlubGluZUVsZW1lbnQ9ZixmfXJldHVybiBiLnVwZGF0ZVN0YXR1cyhcInJlYWR5XCIpLGIuX3BhcnNlTWFya3VwKGQse30sYyksZH19fSk7dmFyIEgsST1cImFqYXhcIixKPWZ1bmN0aW9uKCl7SCYmYShkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhIKX0sSz1mdW5jdGlvbigpe0ooKSxiLnJlcSYmYi5yZXEuYWJvcnQoKX07YS5tYWduaWZpY1BvcHVwLnJlZ2lzdGVyTW9kdWxlKEkse29wdGlvbnM6e3NldHRpbmdzOm51bGwsY3Vyc29yOlwibWZwLWFqYXgtY3VyXCIsdEVycm9yOic8YSBocmVmPVwiJXVybCVcIj5UaGUgY29udGVudDwvYT4gY291bGQgbm90IGJlIGxvYWRlZC4nfSxwcm90bzp7aW5pdEFqYXg6ZnVuY3Rpb24oKXtiLnR5cGVzLnB1c2goSSksSD1iLnN0LmFqYXguY3Vyc29yLHcoaCtcIi5cIitJLEspLHcoXCJCZWZvcmVDaGFuZ2UuXCIrSSxLKX0sZ2V0QWpheDpmdW5jdGlvbihjKXtIJiZhKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKEgpLGIudXBkYXRlU3RhdHVzKFwibG9hZGluZ1wiKTt2YXIgZD1hLmV4dGVuZCh7dXJsOmMuc3JjLHN1Y2Nlc3M6ZnVuY3Rpb24oZCxlLGYpe3ZhciBnPXtkYXRhOmQseGhyOmZ9O3koXCJQYXJzZUFqYXhcIixnKSxiLmFwcGVuZENvbnRlbnQoYShnLmRhdGEpLEkpLGMuZmluaXNoZWQ9ITAsSigpLGIuX3NldEZvY3VzKCksc2V0VGltZW91dChmdW5jdGlvbigpe2Iud3JhcC5hZGRDbGFzcyhxKX0sMTYpLGIudXBkYXRlU3RhdHVzKFwicmVhZHlcIikseShcIkFqYXhDb250ZW50QWRkZWRcIil9LGVycm9yOmZ1bmN0aW9uKCl7SigpLGMuZmluaXNoZWQ9Yy5sb2FkRXJyb3I9ITAsYi51cGRhdGVTdGF0dXMoXCJlcnJvclwiLGIuc3QuYWpheC50RXJyb3IucmVwbGFjZShcIiV1cmwlXCIsYy5zcmMpKX19LGIuc3QuYWpheC5zZXR0aW5ncyk7cmV0dXJuIGIucmVxPWEuYWpheChkKSxcIlwifX19KTt2YXIgTCxNPWZ1bmN0aW9uKGMpe2lmKGMuZGF0YSYmdm9pZCAwIT09Yy5kYXRhLnRpdGxlKXJldHVybiBjLmRhdGEudGl0bGU7dmFyIGQ9Yi5zdC5pbWFnZS50aXRsZVNyYztpZihkKXtpZihhLmlzRnVuY3Rpb24oZCkpcmV0dXJuIGQuY2FsbChiLGMpO2lmKGMuZWwpcmV0dXJuIGMuZWwuYXR0cihkKXx8XCJcIn1yZXR1cm5cIlwifTthLm1hZ25pZmljUG9wdXAucmVnaXN0ZXJNb2R1bGUoXCJpbWFnZVwiLHtvcHRpb25zOnttYXJrdXA6JzxkaXYgY2xhc3M9XCJtZnAtZmlndXJlXCI+PGRpdiBjbGFzcz1cIm1mcC1jbG9zZVwiPjwvZGl2PjxmaWd1cmU+PGRpdiBjbGFzcz1cIm1mcC1pbWdcIj48L2Rpdj48ZmlnY2FwdGlvbj48ZGl2IGNsYXNzPVwibWZwLWJvdHRvbS1iYXJcIj48ZGl2IGNsYXNzPVwibWZwLXRpdGxlXCI+PC9kaXY+PGRpdiBjbGFzcz1cIm1mcC1jb3VudGVyXCI+PC9kaXY+PC9kaXY+PC9maWdjYXB0aW9uPjwvZmlndXJlPjwvZGl2PicsY3Vyc29yOlwibWZwLXpvb20tb3V0LWN1clwiLHRpdGxlU3JjOlwidGl0bGVcIix2ZXJ0aWNhbEZpdDohMCx0RXJyb3I6JzxhIGhyZWY9XCIldXJsJVwiPlRoZSBpbWFnZTwvYT4gY291bGQgbm90IGJlIGxvYWRlZC4nfSxwcm90bzp7aW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIGM9Yi5zdC5pbWFnZSxkPVwiLmltYWdlXCI7Yi50eXBlcy5wdXNoKFwiaW1hZ2VcIiksdyhtK2QsZnVuY3Rpb24oKXtcImltYWdlXCI9PT1iLmN1cnJJdGVtLnR5cGUmJmMuY3Vyc29yJiZhKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKGMuY3Vyc29yKX0pLHcoaCtkLGZ1bmN0aW9uKCl7Yy5jdXJzb3ImJmEoZG9jdW1lbnQuYm9keSkucmVtb3ZlQ2xhc3MoYy5jdXJzb3IpLHYub2ZmKFwicmVzaXplXCIrcCl9KSx3KFwiUmVzaXplXCIrZCxiLnJlc2l6ZUltYWdlKSxiLmlzTG93SUUmJncoXCJBZnRlckNoYW5nZVwiLGIucmVzaXplSW1hZ2UpfSxyZXNpemVJbWFnZTpmdW5jdGlvbigpe3ZhciBhPWIuY3Vyckl0ZW07aWYoYSYmYS5pbWcmJmIuc3QuaW1hZ2UudmVydGljYWxGaXQpe3ZhciBjPTA7Yi5pc0xvd0lFJiYoYz1wYXJzZUludChhLmltZy5jc3MoXCJwYWRkaW5nLXRvcFwiKSwxMCkrcGFyc2VJbnQoYS5pbWcuY3NzKFwicGFkZGluZy1ib3R0b21cIiksMTApKSxhLmltZy5jc3MoXCJtYXgtaGVpZ2h0XCIsYi53SC1jKX19LF9vbkltYWdlSGFzU2l6ZTpmdW5jdGlvbihhKXthLmltZyYmKGEuaGFzU2l6ZT0hMCxMJiZjbGVhckludGVydmFsKEwpLGEuaXNDaGVja2luZ0ltZ1NpemU9ITEseShcIkltYWdlSGFzU2l6ZVwiLGEpLGEuaW1nSGlkZGVuJiYoYi5jb250ZW50JiZiLmNvbnRlbnQucmVtb3ZlQ2xhc3MoXCJtZnAtbG9hZGluZ1wiKSxhLmltZ0hpZGRlbj0hMSkpfSxmaW5kSW1hZ2VTaXplOmZ1bmN0aW9uKGEpe3ZhciBjPTAsZD1hLmltZ1swXSxlPWZ1bmN0aW9uKGYpe0wmJmNsZWFySW50ZXJ2YWwoTCksTD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3JldHVybiBkLm5hdHVyYWxXaWR0aD4wP3ZvaWQgYi5fb25JbWFnZUhhc1NpemUoYSk6KGM+MjAwJiZjbGVhckludGVydmFsKEwpLGMrKyx2b2lkKDM9PT1jP2UoMTApOjQwPT09Yz9lKDUwKToxMDA9PT1jJiZlKDUwMCkpKX0sZil9O2UoMSl9LGdldEltYWdlOmZ1bmN0aW9uKGMsZCl7dmFyIGU9MCxmPWZ1bmN0aW9uKCl7YyYmKGMuaW1nWzBdLmNvbXBsZXRlPyhjLmltZy5vZmYoXCIubWZwbG9hZGVyXCIpLGM9PT1iLmN1cnJJdGVtJiYoYi5fb25JbWFnZUhhc1NpemUoYyksYi51cGRhdGVTdGF0dXMoXCJyZWFkeVwiKSksYy5oYXNTaXplPSEwLGMubG9hZGVkPSEwLHkoXCJJbWFnZUxvYWRDb21wbGV0ZVwiKSk6KGUrKywyMDA+ZT9zZXRUaW1lb3V0KGYsMTAwKTpnKCkpKX0sZz1mdW5jdGlvbigpe2MmJihjLmltZy5vZmYoXCIubWZwbG9hZGVyXCIpLGM9PT1iLmN1cnJJdGVtJiYoYi5fb25JbWFnZUhhc1NpemUoYyksYi51cGRhdGVTdGF0dXMoXCJlcnJvclwiLGgudEVycm9yLnJlcGxhY2UoXCIldXJsJVwiLGMuc3JjKSkpLGMuaGFzU2l6ZT0hMCxjLmxvYWRlZD0hMCxjLmxvYWRFcnJvcj0hMCl9LGg9Yi5zdC5pbWFnZSxpPWQuZmluZChcIi5tZnAtaW1nXCIpO2lmKGkubGVuZ3RoKXt2YXIgaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO2ouY2xhc3NOYW1lPVwibWZwLWltZ1wiLGMuZWwmJmMuZWwuZmluZChcImltZ1wiKS5sZW5ndGgmJihqLmFsdD1jLmVsLmZpbmQoXCJpbWdcIikuYXR0cihcImFsdFwiKSksYy5pbWc9YShqKS5vbihcImxvYWQubWZwbG9hZGVyXCIsZikub24oXCJlcnJvci5tZnBsb2FkZXJcIixnKSxqLnNyYz1jLnNyYyxpLmlzKFwiaW1nXCIpJiYoYy5pbWc9Yy5pbWcuY2xvbmUoKSksaj1jLmltZ1swXSxqLm5hdHVyYWxXaWR0aD4wP2MuaGFzU2l6ZT0hMDpqLndpZHRofHwoYy5oYXNTaXplPSExKX1yZXR1cm4gYi5fcGFyc2VNYXJrdXAoZCx7dGl0bGU6TShjKSxpbWdfcmVwbGFjZVdpdGg6Yy5pbWd9LGMpLGIucmVzaXplSW1hZ2UoKSxjLmhhc1NpemU/KEwmJmNsZWFySW50ZXJ2YWwoTCksYy5sb2FkRXJyb3I/KGQuYWRkQ2xhc3MoXCJtZnAtbG9hZGluZ1wiKSxiLnVwZGF0ZVN0YXR1cyhcImVycm9yXCIsaC50RXJyb3IucmVwbGFjZShcIiV1cmwlXCIsYy5zcmMpKSk6KGQucmVtb3ZlQ2xhc3MoXCJtZnAtbG9hZGluZ1wiKSxiLnVwZGF0ZVN0YXR1cyhcInJlYWR5XCIpKSxkKTooYi51cGRhdGVTdGF0dXMoXCJsb2FkaW5nXCIpLGMubG9hZGluZz0hMCxjLmhhc1NpemV8fChjLmltZ0hpZGRlbj0hMCxkLmFkZENsYXNzKFwibWZwLWxvYWRpbmdcIiksYi5maW5kSW1hZ2VTaXplKGMpKSxkKX19fSk7dmFyIE4sTz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1OJiYoTj12b2lkIDAhPT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKS5zdHlsZS5Nb3pUcmFuc2Zvcm0pLE59O2EubWFnbmlmaWNQb3B1cC5yZWdpc3Rlck1vZHVsZShcInpvb21cIix7b3B0aW9uczp7ZW5hYmxlZDohMSxlYXNpbmc6XCJlYXNlLWluLW91dFwiLGR1cmF0aW9uOjMwMCxvcGVuZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXMoXCJpbWdcIik/YTphLmZpbmQoXCJpbWdcIil9fSxwcm90bzp7aW5pdFpvb206ZnVuY3Rpb24oKXt2YXIgYSxjPWIuc3Quem9vbSxkPVwiLnpvb21cIjtpZihjLmVuYWJsZWQmJmIuc3VwcG9ydHNUcmFuc2l0aW9uKXt2YXIgZSxmLGc9Yy5kdXJhdGlvbixqPWZ1bmN0aW9uKGEpe3ZhciBiPWEuY2xvbmUoKS5yZW1vdmVBdHRyKFwic3R5bGVcIikucmVtb3ZlQXR0cihcImNsYXNzXCIpLmFkZENsYXNzKFwibWZwLWFuaW1hdGVkLWltYWdlXCIpLGQ9XCJhbGwgXCIrYy5kdXJhdGlvbi8xZTMrXCJzIFwiK2MuZWFzaW5nLGU9e3Bvc2l0aW9uOlwiZml4ZWRcIix6SW5kZXg6OTk5OSxsZWZ0OjAsdG9wOjAsXCItd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHlcIjpcImhpZGRlblwifSxmPVwidHJhbnNpdGlvblwiO3JldHVybiBlW1wiLXdlYmtpdC1cIitmXT1lW1wiLW1vei1cIitmXT1lW1wiLW8tXCIrZl09ZVtmXT1kLGIuY3NzKGUpLGJ9LGs9ZnVuY3Rpb24oKXtiLmNvbnRlbnQuY3NzKFwidmlzaWJpbGl0eVwiLFwidmlzaWJsZVwiKX07dyhcIkJ1aWxkQ29udHJvbHNcIitkLGZ1bmN0aW9uKCl7aWYoYi5fYWxsb3dab29tKCkpe2lmKGNsZWFyVGltZW91dChlKSxiLmNvbnRlbnQuY3NzKFwidmlzaWJpbGl0eVwiLFwiaGlkZGVuXCIpLGE9Yi5fZ2V0SXRlbVRvWm9vbSgpLCFhKXJldHVybiB2b2lkIGsoKTtmPWooYSksZi5jc3MoYi5fZ2V0T2Zmc2V0KCkpLGIud3JhcC5hcHBlbmQoZiksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jc3MoYi5fZ2V0T2Zmc2V0KCEwKSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aygpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnJlbW92ZSgpLGE9Zj1udWxsLHkoXCJab29tQW5pbWF0aW9uRW5kZWRcIil9LDE2KX0sZyl9LDE2KX19KSx3KGkrZCxmdW5jdGlvbigpe2lmKGIuX2FsbG93Wm9vbSgpKXtpZihjbGVhclRpbWVvdXQoZSksYi5zdC5yZW1vdmFsRGVsYXk9ZywhYSl7aWYoYT1iLl9nZXRJdGVtVG9ab29tKCksIWEpcmV0dXJuO2Y9aihhKX1mLmNzcyhiLl9nZXRPZmZzZXQoITApKSxiLndyYXAuYXBwZW5kKGYpLGIuY29udGVudC5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJoaWRkZW5cIiksc2V0VGltZW91dChmdW5jdGlvbigpe2YuY3NzKGIuX2dldE9mZnNldCgpKX0sMTYpfX0pLHcoaCtkLGZ1bmN0aW9uKCl7Yi5fYWxsb3dab29tKCkmJihrKCksZiYmZi5yZW1vdmUoKSxhPW51bGwpfSl9fSxfYWxsb3dab29tOmZ1bmN0aW9uKCl7cmV0dXJuXCJpbWFnZVwiPT09Yi5jdXJySXRlbS50eXBlfSxfZ2V0SXRlbVRvWm9vbTpmdW5jdGlvbigpe3JldHVybiBiLmN1cnJJdGVtLmhhc1NpemU/Yi5jdXJySXRlbS5pbWc6ITF9LF9nZXRPZmZzZXQ6ZnVuY3Rpb24oYyl7dmFyIGQ7ZD1jP2IuY3Vyckl0ZW0uaW1nOmIuc3Quem9vbS5vcGVuZXIoYi5jdXJySXRlbS5lbHx8Yi5jdXJySXRlbSk7dmFyIGU9ZC5vZmZzZXQoKSxmPXBhcnNlSW50KGQuY3NzKFwicGFkZGluZy10b3BcIiksMTApLGc9cGFyc2VJbnQoZC5jc3MoXCJwYWRkaW5nLWJvdHRvbVwiKSwxMCk7ZS50b3AtPWEod2luZG93KS5zY3JvbGxUb3AoKS1mO3ZhciBoPXt3aWR0aDpkLndpZHRoKCksaGVpZ2h0Oih1P2QuaW5uZXJIZWlnaHQoKTpkWzBdLm9mZnNldEhlaWdodCktZy1mfTtyZXR1cm4gTygpP2hbXCItbW96LXRyYW5zZm9ybVwiXT1oLnRyYW5zZm9ybT1cInRyYW5zbGF0ZShcIitlLmxlZnQrXCJweCxcIitlLnRvcCtcInB4KVwiOihoLmxlZnQ9ZS5sZWZ0LGgudG9wPWUudG9wKSxofX19KTt2YXIgUD1cImlmcmFtZVwiLFE9XCIvL2Fib3V0OmJsYW5rXCIsUj1mdW5jdGlvbihhKXtpZihiLmN1cnJUZW1wbGF0ZVtQXSl7dmFyIGM9Yi5jdXJyVGVtcGxhdGVbUF0uZmluZChcImlmcmFtZVwiKTtjLmxlbmd0aCYmKGF8fChjWzBdLnNyYz1RKSxiLmlzSUU4JiZjLmNzcyhcImRpc3BsYXlcIixhP1wiYmxvY2tcIjpcIm5vbmVcIikpfX07YS5tYWduaWZpY1BvcHVwLnJlZ2lzdGVyTW9kdWxlKFAse29wdGlvbnM6e21hcmt1cDonPGRpdiBjbGFzcz1cIm1mcC1pZnJhbWUtc2NhbGVyXCI+PGRpdiBjbGFzcz1cIm1mcC1jbG9zZVwiPjwvZGl2PjxpZnJhbWUgY2xhc3M9XCJtZnAtaWZyYW1lXCIgc3JjPVwiLy9hYm91dDpibGFua1wiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT48L2Rpdj4nLHNyY0FjdGlvbjpcImlmcmFtZV9zcmNcIixwYXR0ZXJuczp7eW91dHViZTp7aW5kZXg6XCJ5b3V0dWJlLmNvbVwiLGlkOlwidj1cIixzcmM6XCIvL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8laWQlP2F1dG9wbGF5PTFcIn0sdmltZW86e2luZGV4OlwidmltZW8uY29tL1wiLGlkOlwiL1wiLHNyYzpcIi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8laWQlP2F1dG9wbGF5PTFcIn0sZ21hcHM6e2luZGV4OlwiLy9tYXBzLmdvb2dsZS5cIixzcmM6XCIlaWQlJm91dHB1dD1lbWJlZFwifX19LHByb3RvOntpbml0SWZyYW1lOmZ1bmN0aW9uKCl7Yi50eXBlcy5wdXNoKFApLHcoXCJCZWZvcmVDaGFuZ2VcIixmdW5jdGlvbihhLGIsYyl7YiE9PWMmJihiPT09UD9SKCk6Yz09PVAmJlIoITApKX0pLHcoaCtcIi5cIitQLGZ1bmN0aW9uKCl7UigpfSl9LGdldElmcmFtZTpmdW5jdGlvbihjLGQpe3ZhciBlPWMuc3JjLGY9Yi5zdC5pZnJhbWU7YS5lYWNoKGYucGF0dGVybnMsZnVuY3Rpb24oKXtyZXR1cm4gZS5pbmRleE9mKHRoaXMuaW5kZXgpPi0xPyh0aGlzLmlkJiYoZT1cInN0cmluZ1wiPT10eXBlb2YgdGhpcy5pZD9lLnN1YnN0cihlLmxhc3RJbmRleE9mKHRoaXMuaWQpK3RoaXMuaWQubGVuZ3RoLGUubGVuZ3RoKTp0aGlzLmlkLmNhbGwodGhpcyxlKSksZT10aGlzLnNyYy5yZXBsYWNlKFwiJWlkJVwiLGUpLCExKTp2b2lkIDB9KTt2YXIgZz17fTtyZXR1cm4gZi5zcmNBY3Rpb24mJihnW2Yuc3JjQWN0aW9uXT1lKSxiLl9wYXJzZU1hcmt1cChkLGcsYyksYi51cGRhdGVTdGF0dXMoXCJyZWFkeVwiKSxkfX19KTt2YXIgUz1mdW5jdGlvbihhKXt2YXIgYz1iLml0ZW1zLmxlbmd0aDtyZXR1cm4gYT5jLTE/YS1jOjA+YT9jK2E6YX0sVD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEucmVwbGFjZSgvJWN1cnIlL2dpLGIrMSkucmVwbGFjZSgvJXRvdGFsJS9naSxjKX07YS5tYWduaWZpY1BvcHVwLnJlZ2lzdGVyTW9kdWxlKFwiZ2FsbGVyeVwiLHtvcHRpb25zOntlbmFibGVkOiExLGFycm93TWFya3VwOic8YnV0dG9uIHRpdGxlPVwiJXRpdGxlJVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1mcC1hcnJvdyBtZnAtYXJyb3ctJWRpciVcIj48L2J1dHRvbj4nLHByZWxvYWQ6WzAsMl0sbmF2aWdhdGVCeUltZ0NsaWNrOiEwLGFycm93czohMCx0UHJldjpcIlByZXZpb3VzIChMZWZ0IGFycm93IGtleSlcIix0TmV4dDpcIk5leHQgKFJpZ2h0IGFycm93IGtleSlcIix0Q291bnRlcjpcIiVjdXJyJSBvZiAldG90YWwlXCJ9LHByb3RvOntpbml0R2FsbGVyeTpmdW5jdGlvbigpe3ZhciBjPWIuc3QuZ2FsbGVyeSxlPVwiLm1mcC1nYWxsZXJ5XCI7cmV0dXJuIGIuZGlyZWN0aW9uPSEwLGMmJmMuZW5hYmxlZD8oZis9XCIgbWZwLWdhbGxlcnlcIix3KG0rZSxmdW5jdGlvbigpe2MubmF2aWdhdGVCeUltZ0NsaWNrJiZiLndyYXAub24oXCJjbGlja1wiK2UsXCIubWZwLWltZ1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGIuaXRlbXMubGVuZ3RoPjE/KGIubmV4dCgpLCExKTp2b2lkIDB9KSxkLm9uKFwia2V5ZG93blwiK2UsZnVuY3Rpb24oYSl7Mzc9PT1hLmtleUNvZGU/Yi5wcmV2KCk6Mzk9PT1hLmtleUNvZGUmJmIubmV4dCgpfSl9KSx3KFwiVXBkYXRlU3RhdHVzXCIrZSxmdW5jdGlvbihhLGMpe2MudGV4dCYmKGMudGV4dD1UKGMudGV4dCxiLmN1cnJJdGVtLmluZGV4LGIuaXRlbXMubGVuZ3RoKSl9KSx3KGwrZSxmdW5jdGlvbihhLGQsZSxmKXt2YXIgZz1iLml0ZW1zLmxlbmd0aDtlLmNvdW50ZXI9Zz4xP1QoYy50Q291bnRlcixmLmluZGV4LGcpOlwiXCJ9KSx3KFwiQnVpbGRDb250cm9sc1wiK2UsZnVuY3Rpb24oKXtpZihiLml0ZW1zLmxlbmd0aD4xJiZjLmFycm93cyYmIWIuYXJyb3dMZWZ0KXt2YXIgZD1jLmFycm93TWFya3VwLGU9Yi5hcnJvd0xlZnQ9YShkLnJlcGxhY2UoLyV0aXRsZSUvZ2ksYy50UHJldikucmVwbGFjZSgvJWRpciUvZ2ksXCJsZWZ0XCIpKS5hZGRDbGFzcyhzKSxmPWIuYXJyb3dSaWdodD1hKGQucmVwbGFjZSgvJXRpdGxlJS9naSxjLnROZXh0KS5yZXBsYWNlKC8lZGlyJS9naSxcInJpZ2h0XCIpKS5hZGRDbGFzcyhzKTtlLmNsaWNrKGZ1bmN0aW9uKCl7Yi5wcmV2KCl9KSxmLmNsaWNrKGZ1bmN0aW9uKCl7Yi5uZXh0KCl9KSxiLmNvbnRhaW5lci5hcHBlbmQoZS5hZGQoZikpfX0pLHcobitlLGZ1bmN0aW9uKCl7Yi5fcHJlbG9hZFRpbWVvdXQmJmNsZWFyVGltZW91dChiLl9wcmVsb2FkVGltZW91dCksYi5fcHJlbG9hZFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2IucHJlbG9hZE5lYXJieUltYWdlcygpLGIuX3ByZWxvYWRUaW1lb3V0PW51bGx9LDE2KX0pLHZvaWQgdyhoK2UsZnVuY3Rpb24oKXtkLm9mZihlKSxiLndyYXAub2ZmKFwiY2xpY2tcIitlKSxiLmFycm93UmlnaHQ9Yi5hcnJvd0xlZnQ9bnVsbH0pKTohMX0sbmV4dDpmdW5jdGlvbigpe2IuZGlyZWN0aW9uPSEwLGIuaW5kZXg9UyhiLmluZGV4KzEpLGIudXBkYXRlSXRlbUhUTUwoKX0scHJldjpmdW5jdGlvbigpe2IuZGlyZWN0aW9uPSExLGIuaW5kZXg9UyhiLmluZGV4LTEpLGIudXBkYXRlSXRlbUhUTUwoKX0sZ29UbzpmdW5jdGlvbihhKXtiLmRpcmVjdGlvbj1hPj1iLmluZGV4LGIuaW5kZXg9YSxiLnVwZGF0ZUl0ZW1IVE1MKCl9LHByZWxvYWROZWFyYnlJbWFnZXM6ZnVuY3Rpb24oKXt2YXIgYSxjPWIuc3QuZ2FsbGVyeS5wcmVsb2FkLGQ9TWF0aC5taW4oY1swXSxiLml0ZW1zLmxlbmd0aCksZT1NYXRoLm1pbihjWzFdLGIuaXRlbXMubGVuZ3RoKTtmb3IoYT0xO2E8PShiLmRpcmVjdGlvbj9lOmQpO2ErKyliLl9wcmVsb2FkSXRlbShiLmluZGV4K2EpO2ZvcihhPTE7YTw9KGIuZGlyZWN0aW9uP2Q6ZSk7YSsrKWIuX3ByZWxvYWRJdGVtKGIuaW5kZXgtYSl9LF9wcmVsb2FkSXRlbTpmdW5jdGlvbihjKXtpZihjPVMoYyksIWIuaXRlbXNbY10ucHJlbG9hZGVkKXt2YXIgZD1iLml0ZW1zW2NdO2QucGFyc2VkfHwoZD1iLnBhcnNlRWwoYykpLHkoXCJMYXp5TG9hZFwiLGQpLFwiaW1hZ2VcIj09PWQudHlwZSYmKGQuaW1nPWEoJzxpbWcgY2xhc3M9XCJtZnAtaW1nXCIgLz4nKS5vbihcImxvYWQubWZwbG9hZGVyXCIsZnVuY3Rpb24oKXtkLmhhc1NpemU9ITB9KS5vbihcImVycm9yLm1mcGxvYWRlclwiLGZ1bmN0aW9uKCl7ZC5oYXNTaXplPSEwLGQubG9hZEVycm9yPSEwLHkoXCJMYXp5TG9hZEVycm9yXCIsZCl9KS5hdHRyKFwic3JjXCIsZC5zcmMpKSxkLnByZWxvYWRlZD0hMH19fX0pO3ZhciBVPVwicmV0aW5hXCI7YS5tYWduaWZpY1BvcHVwLnJlZ2lzdGVyTW9kdWxlKFUse29wdGlvbnM6e3JlcGxhY2VTcmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjLnJlcGxhY2UoL1xcLlxcdyskLyxmdW5jdGlvbihhKXtyZXR1cm5cIkAyeFwiK2F9KX0scmF0aW86MX0scHJvdG86e2luaXRSZXRpbmE6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz4xKXt2YXIgYT1iLnN0LnJldGluYSxjPWEucmF0aW87Yz1pc05hTihjKT9jKCk6YyxjPjEmJih3KFwiSW1hZ2VIYXNTaXplLlwiK1UsZnVuY3Rpb24oYSxiKXtiLmltZy5jc3Moe1wibWF4LXdpZHRoXCI6Yi5pbWdbMF0ubmF0dXJhbFdpZHRoL2Msd2lkdGg6XCIxMDAlXCJ9KX0pLHcoXCJFbGVtZW50UGFyc2UuXCIrVSxmdW5jdGlvbihiLGQpe2Quc3JjPWEucmVwbGFjZVNyYyhkLGMpfSkpfX19fSksQSgpfSk7IiwiLyohIG1lbnVGdWxscGFnZSAtIHYxLjAuMCAtIDIwMTUtMDMtMjZcclxuKiBodHRwczovL2dpdGh1Yi5jb20vcm90dGVuc3R1ZGlvcy9tZW51ZnVsbHBhZ2VcclxuKiBDb3B5cmlnaHQgKGMpIDIwMTUgQ2FybWVsbyBDYXRhbGZhbW8gLSByb3R0ZW5TdHVkaW9zLml0ICovXHJcbiFmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjthLmZuLm1lbnVmdWxscGFnZT1mdW5jdGlvbihiKXt2YXIgYz1hLmV4dGVuZCh7bWVudTpcIiNmdWxscGFnZS1uYXZcIixwdXNoOlwiLnB1c2hcIixzaWRlOlwibGVmdFwiLG1lbnVXaWR0aDpcIjEwMCVcIixzcGVlZDpcIjQwMFwiLGFjdGl2ZUJ0bjpcIm1lbnUtb3BlblwifSxiKSxkPXRoaXMsZT1hKGMubWVudSksZj1hKGMucHVzaCksZz1jLm1lbnVXaWR0aCxoPXtwb3NpdGlvbjpcImZpeGVkXCIsdG9wOlwiMFwiLGJvdHRvbTpcIjBcIixcInNldHRpbmdzLnNpZGVcIjpcIi1cIitjLm1lbnVXaWR0aCx3aWR0aDpjLm1lbnVXaWR0aCxoZWlnaHQ6XCIxMDAlXCJ9LGk9e1wiLXdlYmtpdC10cmFuc2l0aW9uXCI6Yy5zaWRlK1wiIFwiK2Muc3BlZWQrXCJtcyBlYXNlXCIsXCItbW96LXRyYW5zaXRpb25cIjpjLnNpZGUrXCIgXCIrYy5zcGVlZCtcIm1zIGVhc2VcIixcIi1tcy10cmFuc2l0aW9uXCI6Yy5zaWRlK1wiIFwiK2Muc3BlZWQrXCJtcyBlYXNlXCIsXCItby10cmFuc2l0aW9uXCI6Yy5zaWRlK1wiIFwiK2Muc3BlZWQrXCJtcyBlYXNlXCIsdHJhbnNpdGlvbjpjLnNpZGUrXCIgXCIrYy5zcGVlZCtcIm1zIGVhc2VcIn07cmV0dXJuIGUuY3NzKGgpLGYuY3NzKGMuc2lkZSxcIjBcIiksZS5jc3MoaSksZi5jc3MoaSksZS5fc3RhdGU9XCJjbG9zZWRcIixlLm9wZW49ZnVuY3Rpb24oKXtlLl9zdGF0ZT1cIm9wZW5cIixlLmNzcyhjLnNpZGUsXCIwXCIpLGYuY3NzKGMuc2lkZSxnKSxkLmFkZENsYXNzKGMuYWN0aXZlQnRuKX0sZS5jbG9zZT1mdW5jdGlvbigpe2UuX3N0YXRlPVwiY2xvc2VkXCIsZS5jc3MoYy5zaWRlLFwiLVwiK2cpLGYuY3NzKGMuc2lkZSxcIjBcIiksZC5yZW1vdmVDbGFzcyhjLmFjdGl2ZUJ0bil9LGEoZG9jdW1lbnQpLm9uKFwiY2xpY2subWVudWZ1bGxwYWdlXCIsZnVuY3Rpb24oYil7YShiLnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5pcyhkKXx8XCJvcGVuXCIhPT1lLl9zdGF0ZXx8KGUuY2xvc2UoKSxkLnJlbW92ZUNsYXNzKGMuYWN0aXZlQnRuKSl9KSxkLm9uKFwiY2xpY2subWVudWZ1bGxwYWdlXCIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpLFwiY2xvc2VkXCI9PT1lLl9zdGF0ZT9lLm9wZW4oKTplLmNsb3NlKCl9KSxkLm9uKFwidG91Y2hlbmRcIixmdW5jdGlvbihhKXtkLnRyaWdnZXIoXCJjbGljay5tZW51ZnVsbHBhZ2VcIiksYS5wcmV2ZW50RGVmYXVsdCgpfSksZX19KGpRdWVyeSk7IWZ1bmN0aW9uKGUsdCl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcInNtb290aFNjcm9sbFwiLHQoZSkpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQoZSk6ZS5zbW9vdGhTY3JvbGw9dChlKX0od2luZG93fHx0aGlzLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO3ZhciB0LG4sbyxyPXt9LGE9ISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yJiYhIWUuYWRkRXZlbnRMaXN0ZW5lcixjPXtzcGVlZDo1MDAsZWFzaW5nOlwiZWFzZUluT3V0Q3ViaWNcIixvZmZzZXQ6MCx1cGRhdGVVUkw6ITAsY2FsbGJhY2tCZWZvcmU6ZnVuY3Rpb24oKXt9LGNhbGxiYWNrQWZ0ZXI6ZnVuY3Rpb24oKXt9fSx1PWZ1bmN0aW9uKGUsdCxuKXtpZihcIltvYmplY3QgT2JqZWN0XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKWZvcih2YXIgbyBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiZ0LmNhbGwobixlW29dLG8sZSk7ZWxzZSBmb3IodmFyIHI9MCxhPWUubGVuZ3RoO2E+cjtyKyspdC5jYWxsKG4sZVtyXSxyLGUpfSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIHUoZSxmdW5jdGlvbih0LG8pe25bb109ZVtvXX0pLHUodCxmdW5jdGlvbihlLG8pe25bb109dFtvXX0pLG59LGw9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dC5jaGFyQXQoMCk7ZSYmZSE9PWRvY3VtZW50O2U9ZS5wYXJlbnROb2RlKWlmKFwiLlwiPT09bil7aWYoZS5jbGFzc0xpc3QuY29udGFpbnModC5zdWJzdHIoMSkpKXJldHVybiBlfWVsc2UgaWYoXCIjXCI9PT1uKXtpZihlLmlkPT09dC5zdWJzdHIoMSkpcmV0dXJuIGV9ZWxzZSBpZihcIltcIj09PW4mJmUuaGFzQXR0cmlidXRlKHQuc3Vic3RyKDEsdC5sZW5ndGgtMikpKXJldHVybiBlO3JldHVybiExfSxzPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heChlLnNjcm9sbEhlaWdodCxlLm9mZnNldEhlaWdodCxlLmNsaWVudEhlaWdodCl9LGY9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49U3RyaW5nKGUpLG89bi5sZW5ndGgscj0tMSxhPVwiXCIsYz1uLmNoYXJDb2RlQXQoMCk7KytyPG87KXtpZih0PW4uY2hhckNvZGVBdChyKSwwPT09dCl0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXI6IHRoZSBpbnB1dCBjb250YWlucyBVKzAwMDAuXCIpO2ErPXQ+PTEmJjMxPj10fHwxMjc9PXR8fDA9PT1yJiZ0Pj00OCYmNTc+PXR8fDE9PT1yJiZ0Pj00OCYmNTc+PXQmJjQ1PT09Yz9cIlxcXFxcIit0LnRvU3RyaW5nKDE2KStcIiBcIjp0Pj0xMjh8fDQ1PT09dHx8OTU9PT10fHx0Pj00OCYmNTc+PXR8fHQ+PTY1JiY5MD49dHx8dD49OTcmJjEyMj49dD9uLmNoYXJBdChyKTpcIlxcXFxcIituLmNoYXJBdChyKX1yZXR1cm4gYX0sZD1mdW5jdGlvbihlLHQpe3ZhciBuO3JldHVyblwiZWFzZUluUXVhZFwiPT09ZSYmKG49dCp0KSxcImVhc2VPdXRRdWFkXCI9PT1lJiYobj10KigyLXQpKSxcImVhc2VJbk91dFF1YWRcIj09PWUmJihuPS41PnQ/Mip0KnQ6LTErKDQtMip0KSp0KSxcImVhc2VJbkN1YmljXCI9PT1lJiYobj10KnQqdCksXCJlYXNlT3V0Q3ViaWNcIj09PWUmJihuPS0tdCp0KnQrMSksXCJlYXNlSW5PdXRDdWJpY1wiPT09ZSYmKG49LjU+dD80KnQqdCp0Oih0LTEpKigyKnQtMikqKDIqdC0yKSsxKSxcImVhc2VJblF1YXJ0XCI9PT1lJiYobj10KnQqdCp0KSxcImVhc2VPdXRRdWFydFwiPT09ZSYmKG49MS0gLS10KnQqdCp0KSxcImVhc2VJbk91dFF1YXJ0XCI9PT1lJiYobj0uNT50PzgqdCp0KnQqdDoxLTgqLS10KnQqdCp0KSxcImVhc2VJblF1aW50XCI9PT1lJiYobj10KnQqdCp0KnQpLFwiZWFzZU91dFF1aW50XCI9PT1lJiYobj0xKy0tdCp0KnQqdCp0KSxcImVhc2VJbk91dFF1aW50XCI9PT1lJiYobj0uNT50PzE2KnQqdCp0KnQqdDoxKzE2Ki0tdCp0KnQqdCp0KSxufHx0fSxoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz0wO2lmKGUub2Zmc2V0UGFyZW50KWRvIG8rPWUub2Zmc2V0VG9wLGU9ZS5vZmZzZXRQYXJlbnQ7d2hpbGUoZSk7cmV0dXJuIG89by10LW4sbz49MD9vOjB9LG09ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpfSxwPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZcIm9iamVjdFwiPT10eXBlb2YgSlNPTiYmXCJmdW5jdGlvblwiPT10eXBlb2YgSlNPTi5wYXJzZT9KU09OLnBhcnNlKGUpOnt9fSx2PWZ1bmN0aW9uKHQsbil7aGlzdG9yeS5wdXNoU3RhdGUmJihufHxcInRydWVcIj09PW4pJiZoaXN0b3J5LnB1c2hTdGF0ZShudWxsLG51bGwsW2UubG9jYXRpb24ucHJvdG9jb2wsXCIvL1wiLGUubG9jYXRpb24uaG9zdCxlLmxvY2F0aW9uLnBhdGhuYW1lLGUubG9jYXRpb24uc2VhcmNoLHRdLmpvaW4oXCJcIikpfTtyLmFuaW1hdGVTY3JvbGw9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPWkoYXx8YyxyfHx7fSksdT1wKHQ/dC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW9wdGlvbnNcIik6bnVsbCk7YT1pKGEsdSksbj1cIiNcIitmKG4uc3Vic3RyKDEpKTt2YXIgbD1cIiNcIj09PW4/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobiksZz1lLnBhZ2VZT2Zmc2V0O298fChvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1zY3JvbGwtaGVhZGVyXVwiKSk7dmFyIGIsTyx5LFM9bnVsbD09PW8/MDpzKG8pK28ub2Zmc2V0VG9wLEk9aChsLFMscGFyc2VJbnQoYS5vZmZzZXQsMTApKSxIPUktZyxFPW0oKSxBPTA7dihuLGEudXBkYXRlVVJMKTt2YXIgTD1mdW5jdGlvbihvLHIsYyl7dmFyIHU9ZS5wYWdlWU9mZnNldDsobz09cnx8dT09cnx8ZS5pbm5lckhlaWdodCt1Pj1FKSYmKGNsZWFySW50ZXJ2YWwoYyksbC5mb2N1cygpLGEuY2FsbGJhY2tBZnRlcih0LG4pKX0sUT1mdW5jdGlvbigpe0ErPTE2LE89QS9wYXJzZUludChhLnNwZWVkLDEwKSxPPU8+MT8xOk8seT1nK0gqZChhLmVhc2luZyxPKSxlLnNjcm9sbFRvKDAsTWF0aC5mbG9vcih5KSksTCh5LEksYil9LEM9ZnVuY3Rpb24oKXthLmNhbGxiYWNrQmVmb3JlKHQsbiksYj1zZXRJbnRlcnZhbChRLDE2KX07MD09PWUucGFnZVlPZmZzZXQmJmUuc2Nyb2xsVG8oMCwwKSxDKCl9O3ZhciBnPWZ1bmN0aW9uKGUpe3ZhciBuPWwoZS50YXJnZXQsXCJbZGF0YS1zY3JvbGxdXCIpO24mJlwiYVwiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJihlLnByZXZlbnREZWZhdWx0KCksci5hbmltYXRlU2Nyb2xsKG4sbi5oYXNoLHQpKX0sYj1mdW5jdGlvbigpe258fChuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtuPW51bGwsaGVhZGVySGVpZ2h0PW51bGw9PT1vPzA6cyhvKStvLm9mZnNldFRvcH0sNjYpKX07cmV0dXJuIHIuZGVzdHJveT1mdW5jdGlvbigpe3QmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIixnLCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixiLCExKSx0PW51bGwsbj1udWxsLG89bnVsbCl9LHIuaW5pdD1mdW5jdGlvbihuKXthJiYoci5kZXN0cm95KCksdD1pKGMsbnx8e30pLG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLXNjcm9sbC1oZWFkZXJdXCIpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGcsITEpLG8mJmUuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLGIsITEpKX0scn0pO1xyXG4iLCIvKlxyXG4gKiBOaXZvIExpZ2h0Ym94IHYxLjMuMVxyXG4gKiBodHRwOi8vZGV2N3N0dWRpb3MuY29tL25pdm8tbGlnaHRib3hcclxuICpcclxuICogQ29weXJpZ2h0IDIwMTMsIERldjdzdHVkaW9zXHJcbiAqIEZyZWUgdG8gdXNlIGFuZCBhYnVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXHJcbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcbiAqL1xyXG4hZnVuY3Rpb24odCxpLG8sZSl7ZnVuY3Rpb24gbihpLG8pe3RoaXMuZWw9aSx0aGlzLiRlbD10KHRoaXMuZWwpLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxsLG8pLHRoaXMuX2RlZmF1bHRzPWwsdGhpcy5fbmFtZT1hLHRoaXMuaW5pdCgpfXZhciBhPVwibml2b0xpZ2h0Ym94XCIsbD17ZWZmZWN0OlwiZmFkZVwiLHRoZW1lOlwiZGVmYXVsdFwiLGtleWJvYXJkTmF2OiEwLGNsaWNrSW1nVG9DbG9zZTohMSxjbGlja092ZXJsYXlUb0Nsb3NlOiEwLG9uSW5pdDpmdW5jdGlvbigpe30sYmVmb3JlU2hvd0xpZ2h0Ym94OmZ1bmN0aW9uKCl7fSxhZnRlclNob3dMaWdodGJveDpmdW5jdGlvbih0KXt9LGJlZm9yZUhpZGVMaWdodGJveDpmdW5jdGlvbigpe30sYWZ0ZXJIaWRlTGlnaHRib3g6ZnVuY3Rpb24oKXt9LGJlZm9yZVByZXY6ZnVuY3Rpb24odCl7fSxvblByZXY6ZnVuY3Rpb24odCl7fSxiZWZvcmVOZXh0OmZ1bmN0aW9uKHQpe30sb25OZXh0OmZ1bmN0aW9uKHQpe30sZXJyb3JNZXNzYWdlOlwiVGhlIHJlcXVlc3RlZCBjb250ZW50IGNhbm5vdCBiZSBsb2FkZWQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCJ9O24ucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKCl7dmFyIGk9dGhpczt0KFwiaHRtbFwiKS5oYXNDbGFzcyhcIm5pdm8tbGlnaHRib3gtbm90b3VjaFwiKXx8dChcImh0bWxcIikuYWRkQ2xhc3MoXCJuaXZvLWxpZ2h0Ym94LW5vdG91Y2hcIiksXCJvbnRvdWNoc3RhcnRcImluIG8mJnQoXCJodG1sXCIpLnJlbW92ZUNsYXNzKFwibml2by1saWdodGJveC1ub3RvdWNoXCIpLHRoaXMuJGVsLm9uKFwiY2xpY2tcIixmdW5jdGlvbih0KXtpLnNob3dMaWdodGJveCh0KX0pLHRoaXMub3B0aW9ucy5rZXlib2FyZE5hdiYmdChcImJvZHlcIikub2ZmKFwia2V5dXBcIikub24oXCJrZXl1cFwiLGZ1bmN0aW9uKG8pe3ZhciBlPW8ua2V5Q29kZT9vLmtleUNvZGU6by53aGljaDsyNz09ZSYmaS5kZXN0cnVjdExpZ2h0Ym94KCksMzc9PWUmJnQoXCIubml2by1saWdodGJveC1wcmV2XCIpLnRyaWdnZXIoXCJjbGlja1wiKSwzOT09ZSYmdChcIi5uaXZvLWxpZ2h0Ym94LW5leHRcIikudHJpZ2dlcihcImNsaWNrXCIpfSksdGhpcy5vcHRpb25zLm9uSW5pdC5jYWxsKHRoaXMpfSxzaG93TGlnaHRib3g6ZnVuY3Rpb24oaSl7dmFyIG89dGhpcyxlPXRoaXMuJGVsLG49dGhpcy5jaGVja0NvbnRlbnQoZSk7aWYobil7aS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMub3B0aW9ucy5iZWZvcmVTaG93TGlnaHRib3guY2FsbCh0aGlzKTt2YXIgYT10aGlzLmNvbnN0cnVjdExpZ2h0Ym94KCk7aWYoYSl7dmFyIGw9YS5maW5kKFwiLm5pdm8tbGlnaHRib3gtY29udGVudFwiKTtpZihsKXtpZih0KFwiYm9keVwiKS5hZGRDbGFzcyhcIm5pdm8tbGlnaHRib3gtYm9keS1lZmZlY3QtXCIrdGhpcy5vcHRpb25zLmVmZmVjdCksdGhpcy5wcm9jZXNzQ29udGVudChsLGUpLHRoaXMuJGVsLmF0dHIoXCJkYXRhLWxpZ2h0Ym94LWdhbGxlcnlcIikpe3ZhciBoPXQoJ1tkYXRhLWxpZ2h0Ym94LWdhbGxlcnk9XCInK3RoaXMuJGVsLmF0dHIoXCJkYXRhLWxpZ2h0Ym94LWdhbGxlcnlcIikrJ1wiXScpO3QoXCIubml2by1saWdodGJveC1uYXZcIikuc2hvdygpLHQoXCIubml2by1saWdodGJveC1wcmV2XCIpLm9mZihcImNsaWNrXCIpLm9uKFwiY2xpY2tcIixmdW5jdGlvbihpKXtpLnByZXZlbnREZWZhdWx0KCk7dmFyIG49aC5pbmRleChlKTtlPWguZXEobi0xKSx0KGUpLmxlbmd0aHx8KGU9aC5sYXN0KCkpLHQud2hlbihvLm9wdGlvbnMuYmVmb3JlUHJldi5jYWxsKHRoaXMsW2VdKSkuZG9uZShmdW5jdGlvbigpe28ucHJvY2Vzc0NvbnRlbnQobCxlKSxvLm9wdGlvbnMub25QcmV2LmNhbGwodGhpcyxbZV0pfSl9KSx0KFwiLm5pdm8tbGlnaHRib3gtbmV4dFwiKS5vZmYoXCJjbGlja1wiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oaSl7aS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBuPWguaW5kZXgoZSk7ZT1oLmVxKG4rMSksdChlKS5sZW5ndGh8fChlPWguZmlyc3QoKSksdC53aGVuKG8ub3B0aW9ucy5iZWZvcmVOZXh0LmNhbGwodGhpcyxbZV0pKS5kb25lKGZ1bmN0aW9uKCl7by5wcm9jZXNzQ29udGVudChsLGUpLG8ub3B0aW9ucy5vbk5leHQuY2FsbCh0aGlzLFtlXSl9KX0pfXNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmFkZENsYXNzKFwibml2by1saWdodGJveC1vcGVuXCIpLG8ub3B0aW9ucy5hZnRlclNob3dMaWdodGJveC5jYWxsKHRoaXMsW2FdKX0sMSl9fX19LGNoZWNrQ29udGVudDpmdW5jdGlvbih0KXt2YXIgaT10LmF0dHIoXCJocmVmXCIpLG89aS5tYXRjaCgvKHlvdXR1YmV8eW91dHViZS1ub2Nvb2tpZXx5b3V0dXx2aW1lbylcXC4oY29tfGJlKVxcLyh3YXRjaFxcP3Y9KFtcXHctXSspfChbXFx3LV0rKSkvKTtyZXR1cm4gbnVsbCE9PWkubWF0Y2goL1xcLihqcGVnfGpwZ3xnaWZ8cG5nKSQvaSl8fCghIW98fChcImFqYXhcIj09dC5hdHRyKFwiZGF0YS1saWdodGJveC10eXBlXCIpfHwoXCIjXCI9PWkuc3Vic3RyaW5nKDAsMSkmJlwiaW5saW5lXCI9PXQuYXR0cihcImRhdGEtbGlnaHRib3gtdHlwZVwiKXx8XCJpZnJhbWVcIj09dC5hdHRyKFwiZGF0YS1saWdodGJveC10eXBlXCIpKSkpfSxwcm9jZXNzQ29udGVudDpmdW5jdGlvbihvLGUpe3ZhciBuPXRoaXMsYT1lLmF0dHIoXCJocmVmXCIpLGw9YS5tYXRjaCgvKHlvdXR1YmV8eW91dHViZS1ub2Nvb2tpZXx5b3V0dXx2aW1lbylcXC4oY29tfGJlKVxcLyh3YXRjaFxcP3Y9KFtcXHctXSspfChbXFx3LV0rKSkvKTtpZihvLmh0bWwoXCJcIikuYWRkQ2xhc3MoXCJuaXZvLWxpZ2h0Ym94LWxvYWRpbmdcIiksdGhpcy5pc0hpZHBpKCkmJmUuYXR0cihcImRhdGEtbGlnaHRib3gtaGlkcGlcIikmJihhPWUuYXR0cihcImRhdGEtbGlnaHRib3gtaGlkcGlcIikpLG51bGwhPT1hLm1hdGNoKC9cXC4oanBlZ3xqcGd8Z2lmfHBuZykkL2kpKXt2YXIgaD10KFwiPGltZz5cIix7c3JjOmEsY2xhc3M6XCJuaXZvLWxpZ2h0Ym94LWltYWdlLWRpc3BsYXlcIn0pO2gub25lKFwibG9hZFwiLGZ1bmN0aW9uKCl7dmFyIGU9dCgnPGRpdiBjbGFzcz1cIm5pdm8tbGlnaHRib3gtaW1hZ2VcIiAvPicpO2UuYXBwZW5kKGgpLG8uaHRtbChlKS5yZW1vdmVDbGFzcyhcIm5pdm8tbGlnaHRib3gtbG9hZGluZ1wiKSxlLmNzcyh7XCJsaW5lLWhlaWdodFwiOnQoXCIubml2by1saWdodGJveC1jb250ZW50XCIpLmhlaWdodCgpK1wicHhcIixoZWlnaHQ6dChcIi5uaXZvLWxpZ2h0Ym94LWNvbnRlbnRcIikuaGVpZ2h0KCkrXCJweFwifSksdChpKS5yZXNpemUoZnVuY3Rpb24oKXtlLmNzcyh7XCJsaW5lLWhlaWdodFwiOnQoXCIubml2by1saWdodGJveC1jb250ZW50XCIpLmhlaWdodCgpK1wicHhcIixoZWlnaHQ6dChcIi5uaXZvLWxpZ2h0Ym94LWNvbnRlbnRcIikuaGVpZ2h0KCkrXCJweFwifSl9KX0pLmVhY2goZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlJiZ0KHRoaXMpLmxvYWQoKX0pLGguZXJyb3IoZnVuY3Rpb24oKXt2YXIgaT10KCc8ZGl2IGNsYXNzPVwibml2by1saWdodGJveC1lcnJvclwiPjxwPicrbi5vcHRpb25zLmVycm9yTWVzc2FnZStcIjwvcD48L2Rpdj5cIik7by5odG1sKGkpLnJlbW92ZUNsYXNzKFwibml2by1saWdodGJveC1sb2FkaW5nXCIpfSl9ZWxzZSBpZihsKXt2YXIgcz1cIlwiLHI9XCJuaXZvLWxpZ2h0Ym94LXZpZGVvXCI7aWYoXCJ5b3V0dWJlXCI9PWxbMV0mJihzPVwiLy93d3cueW91dHViZS5jb20vZW1iZWQvXCIrbFs0XSxyPVwibml2by1saWdodGJveC15b3V0dWJlXCIpLFwieW91dHViZS1ub2Nvb2tpZVwiPT1sWzFdJiYocz1hLHI9XCJuaXZvLWxpZ2h0Ym94LXlvdXR1YmVcIiksXCJ5b3V0dVwiPT1sWzFdJiYocz1cIi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL1wiK2xbM10scj1cIm5pdm8tbGlnaHRib3gteW91dHViZVwiKSxcInZpbWVvXCI9PWxbMV0mJihzPVwiLy9wbGF5ZXIudmltZW8uY29tL3ZpZGVvL1wiK2xbM10scj1cIm5pdm8tbGlnaHRib3gtdmltZW9cIikscyl7dmFyIGM9dChcIjxpZnJhbWU+XCIse3NyYzpzLGNsYXNzOnIsZnJhbWVib3JkZXI6MCx2c3BhY2U6MCxoc3BhY2U6MCxzY3JvbGxpbmc6XCJhdXRvXCJ9KTtvLmh0bWwoYyksYy5sb2FkKGZ1bmN0aW9uKCl7by5yZW1vdmVDbGFzcyhcIm5pdm8tbGlnaHRib3gtbG9hZGluZ1wiKX0pfX1lbHNlIGlmKFwiYWpheFwiPT1lLmF0dHIoXCJkYXRhLWxpZ2h0Ym94LXR5cGVcIikpdC5hamF4KHt1cmw6YSxjYWNoZTohMSxzdWNjZXNzOmZ1bmN0aW9uKGUpe3ZhciBuPXQoJzxkaXYgY2xhc3M9XCJuaXZvLWxpZ2h0Ym94LWFqYXhcIiAvPicpO24uYXBwZW5kKGUpLG8uaHRtbChuKS5yZW1vdmVDbGFzcyhcIm5pdm8tbGlnaHRib3gtbG9hZGluZ1wiKSxuLm91dGVySGVpZ2h0KCk8by5oZWlnaHQoKSYmbi5jc3Moe3Bvc2l0aW9uOlwicmVsYXRpdmVcIix0b3A6XCI1MCVcIixcIm1hcmdpbi10b3BcIjotKG4ub3V0ZXJIZWlnaHQoKS8yKStcInB4XCJ9KSx0KGkpLnJlc2l6ZShmdW5jdGlvbigpe24ub3V0ZXJIZWlnaHQoKTxvLmhlaWdodCgpJiZuLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLHRvcDpcIjUwJVwiLFwibWFyZ2luLXRvcFwiOi0obi5vdXRlckhlaWdodCgpLzIpK1wicHhcIn0pfSl9LGVycm9yOmZ1bmN0aW9uKCl7dmFyIGk9dCgnPGRpdiBjbGFzcz1cIm5pdm8tbGlnaHRib3gtZXJyb3JcIj48cD4nK24ub3B0aW9ucy5lcnJvck1lc3NhZ2UrXCI8L3A+PC9kaXY+XCIpO28uaHRtbChpKS5yZW1vdmVDbGFzcyhcIm5pdm8tbGlnaHRib3gtbG9hZGluZ1wiKX19KTtlbHNlIGlmKFwiI1wiPT1hLnN1YnN0cmluZygwLDEpJiZcImlubGluZVwiPT1lLmF0dHIoXCJkYXRhLWxpZ2h0Ym94LXR5cGVcIikpaWYodChhKS5sZW5ndGgpe3ZhciBnPXQoJzxkaXYgY2xhc3M9XCJuaXZvLWxpZ2h0Ym94LWlubGluZVwiIC8+Jyk7Zy5hcHBlbmQodChhKS5jbG9uZSgpLnNob3coKSksby5odG1sKGcpLnJlbW92ZUNsYXNzKFwibml2by1saWdodGJveC1sb2FkaW5nXCIpLGcub3V0ZXJIZWlnaHQoKTxvLmhlaWdodCgpJiZnLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLHRvcDpcIjUwJVwiLFwibWFyZ2luLXRvcFwiOi0oZy5vdXRlckhlaWdodCgpLzIpK1wicHhcIn0pLHQoaSkucmVzaXplKGZ1bmN0aW9uKCl7Zy5vdXRlckhlaWdodCgpPG8uaGVpZ2h0KCkmJmcuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIsdG9wOlwiNTAlXCIsXCJtYXJnaW4tdG9wXCI6LShnLm91dGVySGVpZ2h0KCkvMikrXCJweFwifSl9KX1lbHNle3ZhciB2PXQoJzxkaXYgY2xhc3M9XCJuaXZvLWxpZ2h0Ym94LWVycm9yXCI+PHA+JytuLm9wdGlvbnMuZXJyb3JNZXNzYWdlK1wiPC9wPjwvZGl2PlwiKTtvLmh0bWwodikucmVtb3ZlQ2xhc3MoXCJuaXZvLWxpZ2h0Ym94LWxvYWRpbmdcIil9ZWxzZXtpZihcImlmcmFtZVwiIT1lLmF0dHIoXCJkYXRhLWxpZ2h0Ym94LXR5cGVcIikpcmV0dXJuITE7dmFyIGI9dChcIjxpZnJhbWU+XCIse3NyYzphLGNsYXNzOlwibml2by1saWdodGJveC1pdGVtXCIsZnJhbWVib3JkZXI6MCx2c3BhY2U6MCxoc3BhY2U6MCxzY3JvbGxpbmc6XCJhdXRvXCJ9KTtvLmh0bWwoYiksYi5sb2FkKGZ1bmN0aW9uKCl7by5yZW1vdmVDbGFzcyhcIm5pdm8tbGlnaHRib3gtbG9hZGluZ1wiKX0pfWlmKGUuYXR0cihcInRpdGxlXCIpKXt2YXIgeD10KFwiPHNwYW4+XCIse2NsYXNzOlwibml2by1saWdodGJveC10aXRsZVwifSk7eC50ZXh0KGUuYXR0cihcInRpdGxlXCIpKSx0KFwiLm5pdm8tbGlnaHRib3gtdGl0bGUtd3JhcFwiKS5odG1sKHgpfWVsc2UgdChcIi5uaXZvLWxpZ2h0Ym94LXRpdGxlLXdyYXBcIikuaHRtbChcIlwiKX0sY29uc3RydWN0TGlnaHRib3g6ZnVuY3Rpb24oKXtpZih0KFwiLm5pdm8tbGlnaHRib3gtb3ZlcmxheVwiKS5sZW5ndGgpcmV0dXJuIHQoXCIubml2by1saWdodGJveC1vdmVybGF5XCIpO3ZhciBpPXQoXCI8ZGl2PlwiLHtjbGFzczpcIm5pdm8tbGlnaHRib3gtb3ZlcmxheSBuaXZvLWxpZ2h0Ym94LXRoZW1lLVwiK3RoaXMub3B0aW9ucy50aGVtZStcIiBuaXZvLWxpZ2h0Ym94LWVmZmVjdC1cIit0aGlzLm9wdGlvbnMuZWZmZWN0fSksbz10KFwiPGRpdj5cIix7Y2xhc3M6XCJuaXZvLWxpZ2h0Ym94LXdyYXBcIn0pLGU9dChcIjxkaXY+XCIse2NsYXNzOlwibml2by1saWdodGJveC1jb250ZW50XCJ9KSxuPXQoJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJuaXZvLWxpZ2h0Ym94LW5hdiBuaXZvLWxpZ2h0Ym94LXByZXZcIj5QcmV2aW91czwvYT48YSBocmVmPVwiI1wiIGNsYXNzPVwibml2by1saWdodGJveC1uYXYgbml2by1saWdodGJveC1uZXh0XCI+TmV4dDwvYT4nKSxhPXQoJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJuaXZvLWxpZ2h0Ym94LWNsb3NlXCIgdGl0bGU9XCJDbG9zZVwiPkNsb3NlPC9hPicpLGw9dChcIjxkaXY+XCIse2NsYXNzOlwibml2by1saWdodGJveC10aXRsZS13cmFwXCJ9KSxoPS8qQGNjX29uIUAqLzA7aCYmaS5hZGRDbGFzcyhcIm5pdm8tbGlnaHRib3gtaWVcIiksby5hcHBlbmQoZSksby5hcHBlbmQobCksaS5hcHBlbmQobyksaS5hcHBlbmQobiksaS5hcHBlbmQoYSksdChcImJvZHlcIikuYXBwZW5kKGkpO3ZhciBzPXRoaXM7cmV0dXJuIHMub3B0aW9ucy5jbGlja092ZXJsYXlUb0Nsb3NlJiZpLm9uKFwiY2xpY2tcIixmdW5jdGlvbihpKXsoaS50YXJnZXQ9PT10aGlzfHx0KGkudGFyZ2V0KS5oYXNDbGFzcyhcIm5pdm8tbGlnaHRib3gtY29udGVudFwiKXx8dChpLnRhcmdldCkuaGFzQ2xhc3MoXCJuaXZvLWxpZ2h0Ym94LWltYWdlXCIpKSYmcy5kZXN0cnVjdExpZ2h0Ym94KCl9KSxzLm9wdGlvbnMuY2xpY2tJbWdUb0Nsb3NlJiZpLm9uKFwiY2xpY2tcIixmdW5jdGlvbihpKXsoaS50YXJnZXQ9PT10aGlzfHx0KGkudGFyZ2V0KS5oYXNDbGFzcyhcIm5pdm8tbGlnaHRib3gtaW1hZ2UtZGlzcGxheVwiKSkmJnMuZGVzdHJ1Y3RMaWdodGJveCgpfSksYS5vbihcImNsaWNrXCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHMuZGVzdHJ1Y3RMaWdodGJveCgpfSksaX0sZGVzdHJ1Y3RMaWdodGJveDpmdW5jdGlvbigpe3ZhciBpPXRoaXM7dGhpcy5vcHRpb25zLmJlZm9yZUhpZGVMaWdodGJveC5jYWxsKHRoaXMpLHQoXCIubml2by1saWdodGJveC1vdmVybGF5XCIpLnJlbW92ZUNsYXNzKFwibml2by1saWdodGJveC1vcGVuXCIpLHQoXCIubml2by1saWdodGJveC1uYXZcIikuaGlkZSgpLHQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibml2by1saWdodGJveC1ib2R5LWVmZmVjdC1cIitpLm9wdGlvbnMuZWZmZWN0KTt2YXIgbz0vKkBjY19vbiFAKi8wO28mJih0KFwiLm5pdm8tbGlnaHRib3gtb3ZlcmxheSBpZnJhbWVcIikuYXR0cihcInNyY1wiLFwiIFwiKSx0KFwiLm5pdm8tbGlnaHRib3gtb3ZlcmxheSBpZnJhbWVcIikucmVtb3ZlKCkpLHQoXCIubml2by1saWdodGJveC1wcmV2XCIpLm9mZihcImNsaWNrXCIpLHQoXCIubml2by1saWdodGJveC1uZXh0XCIpLm9mZihcImNsaWNrXCIpLHQoXCIubml2by1saWdodGJveC1jb250ZW50XCIpLmVtcHR5KCksdGhpcy5vcHRpb25zLmFmdGVySGlkZUxpZ2h0Ym94LmNhbGwodGhpcyl9LGlzSGlkcGk6ZnVuY3Rpb24oKXt2YXIgdD1cIigtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMS41KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMy8yKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWluLXJlc29sdXRpb246IDEuNWRwcHgpXCI7cmV0dXJuIGkuZGV2aWNlUGl4ZWxSYXRpbz4xfHwhKCFpLm1hdGNoTWVkaWF8fCFpLm1hdGNoTWVkaWEodCkubWF0Y2hlcyl9fSx0LmZuW2FdPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0LmRhdGEodGhpcyxhKXx8dC5kYXRhKHRoaXMsYSxuZXcgbih0aGlzLGkpKX0pfX0oalF1ZXJ5LHdpbmRvdyxkb2N1bWVudCk7IiwiLyoqXHJcbiAqIE93bCBDYXJvdXNlbCB2Mi4zLjBcclxuICogQ29weXJpZ2h0IDIwMTMtMjAxNyBEYXZpZCBEZXV0c2NoXHJcbiAqIExpY2Vuc2VkIHVuZGVyICAoKVxyXG4gKi9cclxuIWZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGUoYixjKXt0aGlzLnNldHRpbmdzPW51bGwsdGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsYyksdGhpcy4kZWxlbWVudD1hKGIpLHRoaXMuX2hhbmRsZXJzPXt9LHRoaXMuX3BsdWdpbnM9e30sdGhpcy5fc3VwcmVzcz17fSx0aGlzLl9jdXJyZW50PW51bGwsdGhpcy5fc3BlZWQ9bnVsbCx0aGlzLl9jb29yZGluYXRlcz1bXSx0aGlzLl9icmVha3BvaW50PW51bGwsdGhpcy5fd2lkdGg9bnVsbCx0aGlzLl9pdGVtcz1bXSx0aGlzLl9jbG9uZXM9W10sdGhpcy5fbWVyZ2Vycz1bXSx0aGlzLl93aWR0aHM9W10sdGhpcy5faW52YWxpZGF0ZWQ9e30sdGhpcy5fcGlwZT1bXSx0aGlzLl9kcmFnPXt0aW1lOm51bGwsdGFyZ2V0Om51bGwscG9pbnRlcjpudWxsLHN0YWdlOntzdGFydDpudWxsLGN1cnJlbnQ6bnVsbH0sZGlyZWN0aW9uOm51bGx9LHRoaXMuX3N0YXRlcz17Y3VycmVudDp7fSx0YWdzOntpbml0aWFsaXppbmc6W1wiYnVzeVwiXSxhbmltYXRpbmc6W1wiYnVzeVwiXSxkcmFnZ2luZzpbXCJpbnRlcmFjdGluZ1wiXX19LGEuZWFjaChbXCJvblJlc2l6ZVwiLFwib25UaHJvdHRsZWRSZXNpemVcIl0sYS5wcm94eShmdW5jdGlvbihiLGMpe3RoaXMuX2hhbmRsZXJzW2NdPWEucHJveHkodGhpc1tjXSx0aGlzKX0sdGhpcykpLGEuZWFjaChlLlBsdWdpbnMsYS5wcm94eShmdW5jdGlvbihhLGIpe3RoaXMuX3BsdWdpbnNbYS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSthLnNsaWNlKDEpXT1uZXcgYih0aGlzKX0sdGhpcykpLGEuZWFjaChlLldvcmtlcnMsYS5wcm94eShmdW5jdGlvbihiLGMpe3RoaXMuX3BpcGUucHVzaCh7ZmlsdGVyOmMuZmlsdGVyLHJ1bjphLnByb3h5KGMucnVuLHRoaXMpfSl9LHRoaXMpKSx0aGlzLnNldHVwKCksdGhpcy5pbml0aWFsaXplKCl9ZS5EZWZhdWx0cz17aXRlbXM6Myxsb29wOiExLGNlbnRlcjohMSxyZXdpbmQ6ITEsbW91c2VEcmFnOiEwLHRvdWNoRHJhZzohMCxwdWxsRHJhZzohMCxmcmVlRHJhZzohMSxtYXJnaW46MCxzdGFnZVBhZGRpbmc6MCxtZXJnZTohMSxtZXJnZUZpdDohMCxhdXRvV2lkdGg6ITEsc3RhcnRQb3NpdGlvbjowLHJ0bDohMSxzbWFydFNwZWVkOjI1MCxmbHVpZFNwZWVkOiExLGRyYWdFbmRTcGVlZDohMSxyZXNwb25zaXZlOnt9LHJlc3BvbnNpdmVSZWZyZXNoUmF0ZToyMDAscmVzcG9uc2l2ZUJhc2VFbGVtZW50OmIsZmFsbGJhY2tFYXNpbmc6XCJzd2luZ1wiLGluZm86ITEsbmVzdGVkSXRlbVNlbGVjdG9yOiExLGl0ZW1FbGVtZW50OlwiZGl2XCIsc3RhZ2VFbGVtZW50OlwiZGl2XCIscmVmcmVzaENsYXNzOlwib3dsLXJlZnJlc2hcIixsb2FkZWRDbGFzczpcIm93bC1sb2FkZWRcIixsb2FkaW5nQ2xhc3M6XCJvd2wtbG9hZGluZ1wiLHJ0bENsYXNzOlwib3dsLXJ0bFwiLHJlc3BvbnNpdmVDbGFzczpcIm93bC1yZXNwb25zaXZlXCIsZHJhZ0NsYXNzOlwib3dsLWRyYWdcIixpdGVtQ2xhc3M6XCJvd2wtaXRlbVwiLHN0YWdlQ2xhc3M6XCJvd2wtc3RhZ2VcIixzdGFnZU91dGVyQ2xhc3M6XCJvd2wtc3RhZ2Utb3V0ZXJcIixncmFiQ2xhc3M6XCJvd2wtZ3JhYlwifSxlLldpZHRoPXtEZWZhdWx0OlwiZGVmYXVsdFwiLElubmVyOlwiaW5uZXJcIixPdXRlcjpcIm91dGVyXCJ9LGUuVHlwZT17RXZlbnQ6XCJldmVudFwiLFN0YXRlOlwic3RhdGVcIn0sZS5QbHVnaW5zPXt9LGUuV29ya2Vycz1be2ZpbHRlcjpbXCJ3aWR0aFwiLFwic2V0dGluZ3NcIl0scnVuOmZ1bmN0aW9uKCl7dGhpcy5fd2lkdGg9dGhpcy4kZWxlbWVudC53aWR0aCgpfX0se2ZpbHRlcjpbXCJ3aWR0aFwiLFwiaXRlbXNcIixcInNldHRpbmdzXCJdLHJ1bjpmdW5jdGlvbihhKXthLmN1cnJlbnQ9dGhpcy5faXRlbXMmJnRoaXMuX2l0ZW1zW3RoaXMucmVsYXRpdmUodGhpcy5fY3VycmVudCldfX0se2ZpbHRlcjpbXCJpdGVtc1wiLFwic2V0dGluZ3NcIl0scnVuOmZ1bmN0aW9uKCl7dGhpcy4kc3RhZ2UuY2hpbGRyZW4oXCIuY2xvbmVkXCIpLnJlbW92ZSgpfX0se2ZpbHRlcjpbXCJ3aWR0aFwiLFwiaXRlbXNcIixcInNldHRpbmdzXCJdLHJ1bjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnNldHRpbmdzLm1hcmdpbnx8XCJcIixjPSF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxkPXRoaXMuc2V0dGluZ3MucnRsLGU9e3dpZHRoOlwiYXV0b1wiLFwibWFyZ2luLWxlZnRcIjpkP2I6XCJcIixcIm1hcmdpbi1yaWdodFwiOmQ/XCJcIjpifTshYyYmdGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS5jc3MoZSksYS5jc3M9ZX19LHtmaWx0ZXI6W1wid2lkdGhcIixcIml0ZW1zXCIsXCJzZXR0aW5nc1wiXSxydW46ZnVuY3Rpb24oYSl7dmFyIGI9KHRoaXMud2lkdGgoKS90aGlzLnNldHRpbmdzLml0ZW1zKS50b0ZpeGVkKDMpLXRoaXMuc2V0dGluZ3MubWFyZ2luLGM9bnVsbCxkPXRoaXMuX2l0ZW1zLmxlbmd0aCxlPSF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxmPVtdO2ZvcihhLml0ZW1zPXttZXJnZTohMSx3aWR0aDpifTtkLS07KWM9dGhpcy5fbWVyZ2Vyc1tkXSxjPXRoaXMuc2V0dGluZ3MubWVyZ2VGaXQmJk1hdGgubWluKGMsdGhpcy5zZXR0aW5ncy5pdGVtcyl8fGMsYS5pdGVtcy5tZXJnZT1jPjF8fGEuaXRlbXMubWVyZ2UsZltkXT1lP2IqYzp0aGlzLl9pdGVtc1tkXS53aWR0aCgpO3RoaXMuX3dpZHRocz1mfX0se2ZpbHRlcjpbXCJpdGVtc1wiLFwic2V0dGluZ3NcIl0scnVuOmZ1bmN0aW9uKCl7dmFyIGI9W10sYz10aGlzLl9pdGVtcyxkPXRoaXMuc2V0dGluZ3MsZT1NYXRoLm1heCgyKmQuaXRlbXMsNCksZj0yKk1hdGguY2VpbChjLmxlbmd0aC8yKSxnPWQubG9vcCYmYy5sZW5ndGg/ZC5yZXdpbmQ/ZTpNYXRoLm1heChlLGYpOjAsaD1cIlwiLGk9XCJcIjtmb3IoZy89MjtnPjA7KWIucHVzaCh0aGlzLm5vcm1hbGl6ZShiLmxlbmd0aC8yLCEwKSksaCs9Y1tiW2IubGVuZ3RoLTFdXVswXS5vdXRlckhUTUwsYi5wdXNoKHRoaXMubm9ybWFsaXplKGMubGVuZ3RoLTEtKGIubGVuZ3RoLTEpLzIsITApKSxpPWNbYltiLmxlbmd0aC0xXV1bMF0ub3V0ZXJIVE1MK2ksZy09MTt0aGlzLl9jbG9uZXM9YixhKGgpLmFkZENsYXNzKFwiY2xvbmVkXCIpLmFwcGVuZFRvKHRoaXMuJHN0YWdlKSxhKGkpLmFkZENsYXNzKFwiY2xvbmVkXCIpLnByZXBlbmRUbyh0aGlzLiRzdGFnZSl9fSx7ZmlsdGVyOltcIndpZHRoXCIsXCJpdGVtc1wiLFwic2V0dGluZ3NcIl0scnVuOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuc2V0dGluZ3MucnRsPzE6LTEsYj10aGlzLl9jbG9uZXMubGVuZ3RoK3RoaXMuX2l0ZW1zLmxlbmd0aCxjPS0xLGQ9MCxlPTAsZj1bXTsrK2M8YjspZD1mW2MtMV18fDAsZT10aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShjKV0rdGhpcy5zZXR0aW5ncy5tYXJnaW4sZi5wdXNoKGQrZSphKTt0aGlzLl9jb29yZGluYXRlcz1mfX0se2ZpbHRlcjpbXCJ3aWR0aFwiLFwiaXRlbXNcIixcInNldHRpbmdzXCJdLHJ1bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nLGI9dGhpcy5fY29vcmRpbmF0ZXMsYz17d2lkdGg6TWF0aC5jZWlsKE1hdGguYWJzKGJbYi5sZW5ndGgtMV0pKSsyKmEsXCJwYWRkaW5nLWxlZnRcIjphfHxcIlwiLFwicGFkZGluZy1yaWdodFwiOmF8fFwiXCJ9O3RoaXMuJHN0YWdlLmNzcyhjKX19LHtmaWx0ZXI6W1wid2lkdGhcIixcIml0ZW1zXCIsXCJzZXR0aW5nc1wiXSxydW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoLGM9IXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLGQ9dGhpcy4kc3RhZ2UuY2hpbGRyZW4oKTtpZihjJiZhLml0ZW1zLm1lcmdlKWZvcig7Yi0tOylhLmNzcy53aWR0aD10aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShiKV0sZC5lcShiKS5jc3MoYS5jc3MpO2Vsc2UgYyYmKGEuY3NzLndpZHRoPWEuaXRlbXMud2lkdGgsZC5jc3MoYS5jc3MpKX19LHtmaWx0ZXI6W1wiaXRlbXNcIl0scnVuOmZ1bmN0aW9uKCl7dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoPDEmJnRoaXMuJHN0YWdlLnJlbW92ZUF0dHIoXCJzdHlsZVwiKX19LHtmaWx0ZXI6W1wid2lkdGhcIixcIml0ZW1zXCIsXCJzZXR0aW5nc1wiXSxydW46ZnVuY3Rpb24oYSl7YS5jdXJyZW50PWEuY3VycmVudD90aGlzLiRzdGFnZS5jaGlsZHJlbigpLmluZGV4KGEuY3VycmVudCk6MCxhLmN1cnJlbnQ9TWF0aC5tYXgodGhpcy5taW5pbXVtKCksTWF0aC5taW4odGhpcy5tYXhpbXVtKCksYS5jdXJyZW50KSksdGhpcy5yZXNldChhLmN1cnJlbnQpfX0se2ZpbHRlcjpbXCJwb3NpdGlvblwiXSxydW46ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGUodGhpcy5jb29yZGluYXRlcyh0aGlzLl9jdXJyZW50KSl9fSx7ZmlsdGVyOltcIndpZHRoXCIsXCJwb3NpdGlvblwiLFwiaXRlbXNcIixcInNldHRpbmdzXCJdLHJ1bjpmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9dGhpcy5zZXR0aW5ncy5ydGw/MTotMSxmPTIqdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcsZz10aGlzLmNvb3JkaW5hdGVzKHRoaXMuY3VycmVudCgpKStmLGg9Zyt0aGlzLndpZHRoKCkqZSxpPVtdO2ZvcihjPTAsZD10aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZD5jO2MrKylhPXRoaXMuX2Nvb3JkaW5hdGVzW2MtMV18fDAsYj1NYXRoLmFicyh0aGlzLl9jb29yZGluYXRlc1tjXSkrZiplLCh0aGlzLm9wKGEsXCI8PVwiLGcpJiZ0aGlzLm9wKGEsXCI+XCIsaCl8fHRoaXMub3AoYixcIjxcIixnKSYmdGhpcy5vcChiLFwiPlwiLGgpKSYmaS5wdXNoKGMpO3RoaXMuJHN0YWdlLmNoaWxkcmVuKFwiLmFjdGl2ZVwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKSx0aGlzLiRzdGFnZS5jaGlsZHJlbihcIjplcShcIitpLmpvaW4oXCIpLCA6ZXEoXCIpK1wiKVwiKS5hZGRDbGFzcyhcImFjdGl2ZVwiKSx0aGlzLiRzdGFnZS5jaGlsZHJlbihcIi5jZW50ZXJcIikucmVtb3ZlQ2xhc3MoXCJjZW50ZXJcIiksdGhpcy5zZXR0aW5ncy5jZW50ZXImJnRoaXMuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5jdXJyZW50KCkpLmFkZENsYXNzKFwiY2VudGVyXCIpfX1dLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtpZih0aGlzLmVudGVyKFwiaW5pdGlhbGl6aW5nXCIpLHRoaXMudHJpZ2dlcihcImluaXRpYWxpemVcIiksdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcyh0aGlzLnNldHRpbmdzLnJ0bENsYXNzLHRoaXMuc2V0dGluZ3MucnRsKSx0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCYmIXRoaXMuaXMoXCJwcmUtbG9hZGluZ1wiKSl7dmFyIGIsYyxlO2I9dGhpcy4kZWxlbWVudC5maW5kKFwiaW1nXCIpLGM9dGhpcy5zZXR0aW5ncy5uZXN0ZWRJdGVtU2VsZWN0b3I/XCIuXCIrdGhpcy5zZXR0aW5ncy5uZXN0ZWRJdGVtU2VsZWN0b3I6ZCxlPXRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oYykud2lkdGgoKSxiLmxlbmd0aCYmMD49ZSYmdGhpcy5wcmVsb2FkQXV0b1dpZHRoSW1hZ2VzKGIpfXRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzcyksdGhpcy4kc3RhZ2U9YShcIjxcIit0aGlzLnNldHRpbmdzLnN0YWdlRWxlbWVudCsnIGNsYXNzPVwiJyt0aGlzLnNldHRpbmdzLnN0YWdlQ2xhc3MrJ1wiLz4nKS53cmFwKCc8ZGl2IGNsYXNzPVwiJyt0aGlzLnNldHRpbmdzLnN0YWdlT3V0ZXJDbGFzcysnXCIvPicpLHRoaXMuJGVsZW1lbnQuYXBwZW5kKHRoaXMuJHN0YWdlLnBhcmVudCgpKSx0aGlzLnJlcGxhY2UodGhpcy4kZWxlbWVudC5jaGlsZHJlbigpLm5vdCh0aGlzLiRzdGFnZS5wYXJlbnQoKSkpLHRoaXMuJGVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKT90aGlzLnJlZnJlc2goKTp0aGlzLmludmFsaWRhdGUoXCJ3aWR0aFwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpLmFkZENsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcyksdGhpcy5yZWdpc3RlckV2ZW50SGFuZGxlcnMoKSx0aGlzLmxlYXZlKFwiaW5pdGlhbGl6aW5nXCIpLHRoaXMudHJpZ2dlcihcImluaXRpYWxpemVkXCIpfSxlLnByb3RvdHlwZS5zZXR1cD1mdW5jdGlvbigpe3ZhciBiPXRoaXMudmlld3BvcnQoKSxjPXRoaXMub3B0aW9ucy5yZXNwb25zaXZlLGQ9LTEsZT1udWxsO2M/KGEuZWFjaChjLGZ1bmN0aW9uKGEpe2I+PWEmJmE+ZCYmKGQ9TnVtYmVyKGEpKX0pLGU9YS5leHRlbmQoe30sdGhpcy5vcHRpb25zLGNbZF0pLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUuc3RhZ2VQYWRkaW5nJiYoZS5zdGFnZVBhZGRpbmc9ZS5zdGFnZVBhZGRpbmcoKSksZGVsZXRlIGUucmVzcG9uc2l2ZSxlLnJlc3BvbnNpdmVDbGFzcyYmdGhpcy4kZWxlbWVudC5hdHRyKFwiY2xhc3NcIix0aGlzLiRlbGVtZW50LmF0dHIoXCJjbGFzc1wiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXCIrdGhpcy5vcHRpb25zLnJlc3BvbnNpdmVDbGFzcytcIi0pXFxcXFMrXFxcXHNcIixcImdcIiksXCIkMVwiK2QpKSk6ZT1hLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMpLHRoaXMudHJpZ2dlcihcImNoYW5nZVwiLHtwcm9wZXJ0eTp7bmFtZTpcInNldHRpbmdzXCIsdmFsdWU6ZX19KSx0aGlzLl9icmVha3BvaW50PWQsdGhpcy5zZXR0aW5ncz1lLHRoaXMuaW52YWxpZGF0ZShcInNldHRpbmdzXCIpLHRoaXMudHJpZ2dlcihcImNoYW5nZWRcIix7cHJvcGVydHk6e25hbWU6XCJzZXR0aW5nc1wiLHZhbHVlOnRoaXMuc2V0dGluZ3N9fSl9LGUucHJvdG90eXBlLm9wdGlvbnNMb2dpYz1mdW5jdGlvbigpe3RoaXMuc2V0dGluZ3MuYXV0b1dpZHRoJiYodGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmc9ITEsdGhpcy5zZXR0aW5ncy5tZXJnZT0hMSl9LGUucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy50cmlnZ2VyKFwicHJlcGFyZVwiLHtjb250ZW50OmJ9KTtyZXR1cm4gYy5kYXRhfHwoYy5kYXRhPWEoXCI8XCIrdGhpcy5zZXR0aW5ncy5pdGVtRWxlbWVudCtcIi8+XCIpLmFkZENsYXNzKHRoaXMub3B0aW9ucy5pdGVtQ2xhc3MpLmFwcGVuZChiKSksdGhpcy50cmlnZ2VyKFwicHJlcGFyZWRcIix7Y29udGVudDpjLmRhdGF9KSxjLmRhdGF9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wLGM9dGhpcy5fcGlwZS5sZW5ndGgsZD1hLnByb3h5KGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdfSx0aGlzLl9pbnZhbGlkYXRlZCksZT17fTtjPmI7KSh0aGlzLl9pbnZhbGlkYXRlZC5hbGx8fGEuZ3JlcCh0aGlzLl9waXBlW2JdLmZpbHRlcixkKS5sZW5ndGg+MCkmJnRoaXMuX3BpcGVbYl0ucnVuKGUpLGIrKzt0aGlzLl9pbnZhbGlkYXRlZD17fSwhdGhpcy5pcyhcInZhbGlkXCIpJiZ0aGlzLmVudGVyKFwidmFsaWRcIil9LGUucHJvdG90eXBlLndpZHRoPWZ1bmN0aW9uKGEpe3N3aXRjaChhPWF8fGUuV2lkdGguRGVmYXVsdCl7Y2FzZSBlLldpZHRoLklubmVyOmNhc2UgZS5XaWR0aC5PdXRlcjpyZXR1cm4gdGhpcy5fd2lkdGg7ZGVmYXVsdDpyZXR1cm4gdGhpcy5fd2lkdGgtMip0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyt0aGlzLnNldHRpbmdzLm1hcmdpbn19LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt0aGlzLmVudGVyKFwicmVmcmVzaGluZ1wiKSx0aGlzLnRyaWdnZXIoXCJyZWZyZXNoXCIpLHRoaXMuc2V0dXAoKSx0aGlzLm9wdGlvbnNMb2dpYygpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLnJlZnJlc2hDbGFzcyksdGhpcy51cGRhdGUoKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpLHRoaXMubGVhdmUoXCJyZWZyZXNoaW5nXCIpLHRoaXMudHJpZ2dlcihcInJlZnJlc2hlZFwiKX0sZS5wcm90b3R5cGUub25UaHJvdHRsZWRSZXNpemU9ZnVuY3Rpb24oKXtiLmNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVyKSx0aGlzLnJlc2l6ZVRpbWVyPWIuc2V0VGltZW91dCh0aGlzLl9oYW5kbGVycy5vblJlc2l6ZSx0aGlzLnNldHRpbmdzLnJlc3BvbnNpdmVSZWZyZXNoUmF0ZSl9LGUucHJvdG90eXBlLm9uUmVzaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW1zLmxlbmd0aD90aGlzLl93aWR0aD09PXRoaXMuJGVsZW1lbnQud2lkdGgoKT8hMTp0aGlzLiRlbGVtZW50LmlzKFwiOnZpc2libGVcIik/KHRoaXMuZW50ZXIoXCJyZXNpemluZ1wiKSx0aGlzLnRyaWdnZXIoXCJyZXNpemVcIikuaXNEZWZhdWx0UHJldmVudGVkKCk/KHRoaXMubGVhdmUoXCJyZXNpemluZ1wiKSwhMSk6KHRoaXMuaW52YWxpZGF0ZShcIndpZHRoXCIpLHRoaXMucmVmcmVzaCgpLHRoaXMubGVhdmUoXCJyZXNpemluZ1wiKSx2b2lkIHRoaXMudHJpZ2dlcihcInJlc2l6ZWRcIikpKTohMTohMX0sZS5wcm90b3R5cGUucmVnaXN0ZXJFdmVudEhhbmRsZXJzPWZ1bmN0aW9uKCl7YS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJHN0YWdlLm9uKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCtcIi5vd2wuY29yZVwiLGEucHJveHkodGhpcy5vblRyYW5zaXRpb25FbmQsdGhpcykpLHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZSE9PSExJiZ0aGlzLm9uKGIsXCJyZXNpemVcIix0aGlzLl9oYW5kbGVycy5vblRocm90dGxlZFJlc2l6ZSksdGhpcy5zZXR0aW5ncy5tb3VzZURyYWcmJih0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5kcmFnQ2xhc3MpLHRoaXMuJHN0YWdlLm9uKFwibW91c2Vkb3duLm93bC5jb3JlXCIsYS5wcm94eSh0aGlzLm9uRHJhZ1N0YXJ0LHRoaXMpKSx0aGlzLiRzdGFnZS5vbihcImRyYWdzdGFydC5vd2wuY29yZSBzZWxlY3RzdGFydC5vd2wuY29yZVwiLGZ1bmN0aW9uKCl7cmV0dXJuITF9KSksdGhpcy5zZXR0aW5ncy50b3VjaERyYWcmJih0aGlzLiRzdGFnZS5vbihcInRvdWNoc3RhcnQub3dsLmNvcmVcIixhLnByb3h5KHRoaXMub25EcmFnU3RhcnQsdGhpcykpLHRoaXMuJHN0YWdlLm9uKFwidG91Y2hjYW5jZWwub3dsLmNvcmVcIixhLnByb3h5KHRoaXMub25EcmFnRW5kLHRoaXMpKSl9LGUucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKGIpe3ZhciBkPW51bGw7MyE9PWIud2hpY2gmJihhLnN1cHBvcnQudHJhbnNmb3JtPyhkPXRoaXMuJHN0YWdlLmNzcyhcInRyYW5zZm9ybVwiKS5yZXBsYWNlKC8uKlxcKHxcXCl8IC9nLFwiXCIpLnNwbGl0KFwiLFwiKSxkPXt4OmRbMTY9PT1kLmxlbmd0aD8xMjo0XSx5OmRbMTY9PT1kLmxlbmd0aD8xMzo1XX0pOihkPXRoaXMuJHN0YWdlLnBvc2l0aW9uKCksZD17eDp0aGlzLnNldHRpbmdzLnJ0bD9kLmxlZnQrdGhpcy4kc3RhZ2Uud2lkdGgoKS10aGlzLndpZHRoKCkrdGhpcy5zZXR0aW5ncy5tYXJnaW46ZC5sZWZ0LHk6ZC50b3B9KSx0aGlzLmlzKFwiYW5pbWF0aW5nXCIpJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT90aGlzLmFuaW1hdGUoZC54KTp0aGlzLiRzdGFnZS5zdG9wKCksdGhpcy5pbnZhbGlkYXRlKFwicG9zaXRpb25cIikpLHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3ModGhpcy5vcHRpb25zLmdyYWJDbGFzcyxcIm1vdXNlZG93blwiPT09Yi50eXBlKSx0aGlzLnNwZWVkKDApLHRoaXMuX2RyYWcudGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLl9kcmFnLnRhcmdldD1hKGIudGFyZ2V0KSx0aGlzLl9kcmFnLnN0YWdlLnN0YXJ0PWQsdGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50PWQsdGhpcy5fZHJhZy5wb2ludGVyPXRoaXMucG9pbnRlcihiKSxhKGMpLm9uKFwibW91c2V1cC5vd2wuY29yZSB0b3VjaGVuZC5vd2wuY29yZVwiLGEucHJveHkodGhpcy5vbkRyYWdFbmQsdGhpcykpLGEoYykub25lKFwibW91c2Vtb3ZlLm93bC5jb3JlIHRvdWNobW92ZS5vd2wuY29yZVwiLGEucHJveHkoZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcucG9pbnRlcix0aGlzLnBvaW50ZXIoYikpO2EoYykub24oXCJtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlXCIsYS5wcm94eSh0aGlzLm9uRHJhZ01vdmUsdGhpcykpLE1hdGguYWJzKGQueCk8TWF0aC5hYnMoZC55KSYmdGhpcy5pcyhcInZhbGlkXCIpfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuZW50ZXIoXCJkcmFnZ2luZ1wiKSx0aGlzLnRyaWdnZXIoXCJkcmFnXCIpKX0sdGhpcykpKX0sZS5wcm90b3R5cGUub25EcmFnTW92ZT1mdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxkPW51bGwsZT10aGlzLmRpZmZlcmVuY2UodGhpcy5fZHJhZy5wb2ludGVyLHRoaXMucG9pbnRlcihhKSksZj10aGlzLmRpZmZlcmVuY2UodGhpcy5fZHJhZy5zdGFnZS5zdGFydCxlKTt0aGlzLmlzKFwiZHJhZ2dpbmdcIikmJihhLnByZXZlbnREZWZhdWx0KCksdGhpcy5zZXR0aW5ncy5sb29wPyhiPXRoaXMuY29vcmRpbmF0ZXModGhpcy5taW5pbXVtKCkpLGM9dGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSsxKS1iLGYueD0oKGYueC1iKSVjK2MpJWMrYik6KGI9dGhpcy5zZXR0aW5ncy5ydGw/dGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSk6dGhpcy5jb29yZGluYXRlcyh0aGlzLm1pbmltdW0oKSksYz10aGlzLnNldHRpbmdzLnJ0bD90aGlzLmNvb3JkaW5hdGVzKHRoaXMubWluaW11bSgpKTp0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWF4aW11bSgpKSxkPXRoaXMuc2V0dGluZ3MucHVsbERyYWc/LTEqZS54LzU6MCxmLng9TWF0aC5tYXgoTWF0aC5taW4oZi54LGIrZCksYytkKSksdGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50PWYsdGhpcy5hbmltYXRlKGYueCkpfSxlLnByb3RvdHlwZS5vbkRyYWdFbmQ9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcucG9pbnRlcix0aGlzLnBvaW50ZXIoYikpLGU9dGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50LGY9ZC54PjBedGhpcy5zZXR0aW5ncy5ydGw/XCJsZWZ0XCI6XCJyaWdodFwiO2EoYykub2ZmKFwiLm93bC5jb3JlXCIpLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmdyYWJDbGFzcyksKDAhPT1kLngmJnRoaXMuaXMoXCJkcmFnZ2luZ1wiKXx8IXRoaXMuaXMoXCJ2YWxpZFwiKSkmJih0aGlzLnNwZWVkKHRoaXMuc2V0dGluZ3MuZHJhZ0VuZFNwZWVkfHx0aGlzLnNldHRpbmdzLnNtYXJ0U3BlZWQpLHRoaXMuY3VycmVudCh0aGlzLmNsb3Nlc3QoZS54LDAhPT1kLng/Zjp0aGlzLl9kcmFnLmRpcmVjdGlvbikpLHRoaXMuaW52YWxpZGF0ZShcInBvc2l0aW9uXCIpLHRoaXMudXBkYXRlKCksdGhpcy5fZHJhZy5kaXJlY3Rpb249ZiwoTWF0aC5hYnMoZC54KT4zfHwobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9kcmFnLnRpbWU+MzAwKSYmdGhpcy5fZHJhZy50YXJnZXQub25lKFwiY2xpY2sub3dsLmNvcmVcIixmdW5jdGlvbigpe3JldHVybiExfSkpLHRoaXMuaXMoXCJkcmFnZ2luZ1wiKSYmKHRoaXMubGVhdmUoXCJkcmFnZ2luZ1wiKSx0aGlzLnRyaWdnZXIoXCJkcmFnZ2VkXCIpKX0sZS5wcm90b3R5cGUuY2xvc2VzdD1mdW5jdGlvbihiLGMpe3ZhciBkPS0xLGU9MzAsZj10aGlzLndpZHRoKCksZz10aGlzLmNvb3JkaW5hdGVzKCk7cmV0dXJuIHRoaXMuc2V0dGluZ3MuZnJlZURyYWd8fGEuZWFjaChnLGEucHJveHkoZnVuY3Rpb24oYSxoKXtyZXR1cm5cImxlZnRcIj09PWMmJmI+aC1lJiZoK2U+Yj9kPWE6XCJyaWdodFwiPT09YyYmYj5oLWYtZSYmaC1mK2U+Yj9kPWErMTp0aGlzLm9wKGIsXCI8XCIsaCkmJnRoaXMub3AoYixcIj5cIixnW2ErMV18fGgtZikmJihkPVwibGVmdFwiPT09Yz9hKzE6YSksLTE9PT1kfSx0aGlzKSksdGhpcy5zZXR0aW5ncy5sb29wfHwodGhpcy5vcChiLFwiPlwiLGdbdGhpcy5taW5pbXVtKCldKT9kPWI9dGhpcy5taW5pbXVtKCk6dGhpcy5vcChiLFwiPFwiLGdbdGhpcy5tYXhpbXVtKCldKSYmKGQ9Yj10aGlzLm1heGltdW0oKSkpLGR9LGUucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5zcGVlZCgpPjA7dGhpcy5pcyhcImFuaW1hdGluZ1wiKSYmdGhpcy5vblRyYW5zaXRpb25FbmQoKSxjJiYodGhpcy5lbnRlcihcImFuaW1hdGluZ1wiKSx0aGlzLnRyaWdnZXIoXCJ0cmFuc2xhdGVcIikpLGEuc3VwcG9ydC50cmFuc2Zvcm0zZCYmYS5zdXBwb3J0LnRyYW5zaXRpb24/dGhpcy4kc3RhZ2UuY3NzKHt0cmFuc2Zvcm06XCJ0cmFuc2xhdGUzZChcIitiK1wicHgsMHB4LDBweClcIix0cmFuc2l0aW9uOnRoaXMuc3BlZWQoKS8xZTMrXCJzXCJ9KTpjP3RoaXMuJHN0YWdlLmFuaW1hdGUoe2xlZnQ6YitcInB4XCJ9LHRoaXMuc3BlZWQoKSx0aGlzLnNldHRpbmdzLmZhbGxiYWNrRWFzaW5nLGEucHJveHkodGhpcy5vblRyYW5zaXRpb25FbmQsdGhpcykpOnRoaXMuJHN0YWdlLmNzcyh7bGVmdDpiK1wicHhcIn0pfSxlLnByb3RvdHlwZS5pcz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fc3RhdGVzLmN1cnJlbnRbYV0mJnRoaXMuX3N0YXRlcy5jdXJyZW50W2FdPjB9LGUucHJvdG90eXBlLmN1cnJlbnQ9ZnVuY3Rpb24oYSl7aWYoYT09PWQpcmV0dXJuIHRoaXMuX2N1cnJlbnQ7aWYoMD09PXRoaXMuX2l0ZW1zLmxlbmd0aClyZXR1cm4gZDtpZihhPXRoaXMubm9ybWFsaXplKGEpLHRoaXMuX2N1cnJlbnQhPT1hKXt2YXIgYj10aGlzLnRyaWdnZXIoXCJjaGFuZ2VcIix7cHJvcGVydHk6e25hbWU6XCJwb3NpdGlvblwiLHZhbHVlOmF9fSk7Yi5kYXRhIT09ZCYmKGE9dGhpcy5ub3JtYWxpemUoYi5kYXRhKSksdGhpcy5fY3VycmVudD1hLHRoaXMuaW52YWxpZGF0ZShcInBvc2l0aW9uXCIpLHRoaXMudHJpZ2dlcihcImNoYW5nZWRcIix7cHJvcGVydHk6e25hbWU6XCJwb3NpdGlvblwiLHZhbHVlOnRoaXMuX2N1cnJlbnR9fSl9cmV0dXJuIHRoaXMuX2N1cnJlbnR9LGUucHJvdG90eXBlLmludmFsaWRhdGU9ZnVuY3Rpb24oYil7cmV0dXJuXCJzdHJpbmdcIj09PWEudHlwZShiKSYmKHRoaXMuX2ludmFsaWRhdGVkW2JdPSEwLHRoaXMuaXMoXCJ2YWxpZFwiKSYmdGhpcy5sZWF2ZShcInZhbGlkXCIpKSxhLm1hcCh0aGlzLl9pbnZhbGlkYXRlZCxmdW5jdGlvbihhLGIpe3JldHVybiBifSl9LGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKGEpe2E9dGhpcy5ub3JtYWxpemUoYSksYSE9PWQmJih0aGlzLl9zcGVlZD0wLHRoaXMuX2N1cnJlbnQ9YSx0aGlzLnN1cHByZXNzKFtcInRyYW5zbGF0ZVwiLFwidHJhbnNsYXRlZFwiXSksdGhpcy5hbmltYXRlKHRoaXMuY29vcmRpbmF0ZXMoYSkpLHRoaXMucmVsZWFzZShbXCJ0cmFuc2xhdGVcIixcInRyYW5zbGF0ZWRcIl0pKX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5faXRlbXMubGVuZ3RoLGU9Yj8wOnRoaXMuX2Nsb25lcy5sZW5ndGg7cmV0dXJuIXRoaXMuaXNOdW1lcmljKGEpfHwxPmM/YT1kOigwPmF8fGE+PWMrZSkmJihhPSgoYS1lLzIpJWMrYyklYytlLzIpLGF9LGUucHJvdG90eXBlLnJlbGF0aXZlPWZ1bmN0aW9uKGEpe3JldHVybiBhLT10aGlzLl9jbG9uZXMubGVuZ3RoLzIsdGhpcy5ub3JtYWxpemUoYSwhMCl9LGUucHJvdG90eXBlLm1heGltdW09ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpcy5zZXR0aW5ncyxmPXRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtpZihlLmxvb3ApZj10aGlzLl9jbG9uZXMubGVuZ3RoLzIrdGhpcy5faXRlbXMubGVuZ3RoLTE7ZWxzZSBpZihlLmF1dG9XaWR0aHx8ZS5tZXJnZSl7aWYoYj10aGlzLl9pdGVtcy5sZW5ndGgpZm9yKGM9dGhpcy5faXRlbXNbLS1iXS53aWR0aCgpLGQ9dGhpcy4kZWxlbWVudC53aWR0aCgpO2ItLSYmKGMrPXRoaXMuX2l0ZW1zW2JdLndpZHRoKCkrdGhpcy5zZXR0aW5ncy5tYXJnaW4sIShjPmQpKTspO2Y9YisxfWVsc2UgZj1lLmNlbnRlcj90aGlzLl9pdGVtcy5sZW5ndGgtMTp0aGlzLl9pdGVtcy5sZW5ndGgtZS5pdGVtcztyZXR1cm4gYSYmKGYtPXRoaXMuX2Nsb25lcy5sZW5ndGgvMiksTWF0aC5tYXgoZiwwKX0sZS5wcm90b3R5cGUubWluaW11bT1mdW5jdGlvbihhKXtyZXR1cm4gYT8wOnRoaXMuX2Nsb25lcy5sZW5ndGgvMn0sZS5wcm90b3R5cGUuaXRlbXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1kP3RoaXMuX2l0ZW1zLnNsaWNlKCk6KGE9dGhpcy5ub3JtYWxpemUoYSwhMCksdGhpcy5faXRlbXNbYV0pfSxlLnByb3RvdHlwZS5tZXJnZXJzPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09ZD90aGlzLl9tZXJnZXJzLnNsaWNlKCk6KGE9dGhpcy5ub3JtYWxpemUoYSwhMCksdGhpcy5fbWVyZ2Vyc1thXSl9LGUucHJvdG90eXBlLmNsb25lcz1mdW5jdGlvbihiKXt2YXIgYz10aGlzLl9jbG9uZXMubGVuZ3RoLzIsZT1jK3RoaXMuX2l0ZW1zLmxlbmd0aCxmPWZ1bmN0aW9uKGEpe3JldHVybiBhJTI9PT0wP2UrYS8yOmMtKGErMSkvMn07cmV0dXJuIGI9PT1kP2EubWFwKHRoaXMuX2Nsb25lcyxmdW5jdGlvbihhLGIpe3JldHVybiBmKGIpfSk6YS5tYXAodGhpcy5fY2xvbmVzLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE9PT1iP2YoYyk6bnVsbH0pfSxlLnByb3RvdHlwZS5zcGVlZD1mdW5jdGlvbihhKXtyZXR1cm4gYSE9PWQmJih0aGlzLl9zcGVlZD1hKSx0aGlzLl9zcGVlZH0sZS5wcm90b3R5cGUuY29vcmRpbmF0ZXM9ZnVuY3Rpb24oYil7dmFyIGMsZT0xLGY9Yi0xO3JldHVybiBiPT09ZD9hLm1hcCh0aGlzLl9jb29yZGluYXRlcyxhLnByb3h5KGZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXMoYil9LHRoaXMpKToodGhpcy5zZXR0aW5ncy5jZW50ZXI/KHRoaXMuc2V0dGluZ3MucnRsJiYoZT0tMSxmPWIrMSksYz10aGlzLl9jb29yZGluYXRlc1tiXSxjKz0odGhpcy53aWR0aCgpLWMrKHRoaXMuX2Nvb3JkaW5hdGVzW2ZdfHwwKSkvMiplKTpjPXRoaXMuX2Nvb3JkaW5hdGVzW2ZdfHwwLGM9TWF0aC5jZWlsKGMpKX0sZS5wcm90b3R5cGUuZHVyYXRpb249ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAwPT09Yz8wOk1hdGgubWluKE1hdGgubWF4KE1hdGguYWJzKGItYSksMSksNikqTWF0aC5hYnMoY3x8dGhpcy5zZXR0aW5ncy5zbWFydFNwZWVkKX0sZS5wcm90b3R5cGUudG89ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmN1cnJlbnQoKSxkPW51bGwsZT1hLXRoaXMucmVsYXRpdmUoYyksZj0oZT4wKS0oMD5lKSxnPXRoaXMuX2l0ZW1zLmxlbmd0aCxoPXRoaXMubWluaW11bSgpLGk9dGhpcy5tYXhpbXVtKCk7dGhpcy5zZXR0aW5ncy5sb29wPyghdGhpcy5zZXR0aW5ncy5yZXdpbmQmJk1hdGguYWJzKGUpPmcvMiYmKGUrPS0xKmYqZyksYT1jK2UsZD0oKGEtaCklZytnKSVnK2gsZCE9PWEmJmk+PWQtZSYmZC1lPjAmJihjPWQtZSxhPWQsdGhpcy5yZXNldChjKSkpOnRoaXMuc2V0dGluZ3MucmV3aW5kPyhpKz0xLGE9KGElaStpKSVpKTphPU1hdGgubWF4KGgsTWF0aC5taW4oaSxhKSksdGhpcy5zcGVlZCh0aGlzLmR1cmF0aW9uKGMsYSxiKSksdGhpcy5jdXJyZW50KGEpLHRoaXMuJGVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKSYmdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihhKXthPWF8fCExLHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSkrMSxhKX0sZS5wcm90b3R5cGUucHJldj1mdW5jdGlvbihhKXthPWF8fCExLHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSktMSxhKX0sZS5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKGEpe3JldHVybiBhIT09ZCYmKGEuc3RvcFByb3BhZ2F0aW9uKCksKGEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fGEub3JpZ2luYWxUYXJnZXQpIT09dGhpcy4kc3RhZ2UuZ2V0KDApKT8hMToodGhpcy5sZWF2ZShcImFuaW1hdGluZ1wiKSx2b2lkIHRoaXMudHJpZ2dlcihcInRyYW5zbGF0ZWRcIikpfSxlLnByb3RvdHlwZS52aWV3cG9ydD1mdW5jdGlvbigpe3ZhciBkO3JldHVybiB0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUJhc2VFbGVtZW50IT09Yj9kPWEodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVCYXNlRWxlbWVudCkud2lkdGgoKTpiLmlubmVyV2lkdGg/ZD1iLmlubmVyV2lkdGg6Yy5kb2N1bWVudEVsZW1lbnQmJmMuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoP2Q9Yy5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6Y29uc29sZS53YXJuKFwiQ2FuIG5vdCBkZXRlY3Qgdmlld3BvcnQgd2lkdGguXCIpLGR9LGUucHJvdG90eXBlLnJlcGxhY2U9ZnVuY3Rpb24oYil7dGhpcy4kc3RhZ2UuZW1wdHkoKSx0aGlzLl9pdGVtcz1bXSxiJiYoYj1iIGluc3RhbmNlb2YgalF1ZXJ5P2I6YShiKSksdGhpcy5zZXR0aW5ncy5uZXN0ZWRJdGVtU2VsZWN0b3ImJihiPWIuZmluZChcIi5cIit0aGlzLnNldHRpbmdzLm5lc3RlZEl0ZW1TZWxlY3RvcikpLGIuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLm5vZGVUeXBlfSkuZWFjaChhLnByb3h5KGZ1bmN0aW9uKGEsYil7Yj10aGlzLnByZXBhcmUoYiksdGhpcy4kc3RhZ2UuYXBwZW5kKGIpLHRoaXMuX2l0ZW1zLnB1c2goYiksdGhpcy5fbWVyZ2Vycy5wdXNoKDEqYi5maW5kKFwiW2RhdGEtbWVyZ2VdXCIpLmFkZEJhY2soXCJbZGF0YS1tZXJnZV1cIikuYXR0cihcImRhdGEtbWVyZ2VcIil8fDEpfSx0aGlzKSksdGhpcy5yZXNldCh0aGlzLmlzTnVtZXJpYyh0aGlzLnNldHRpbmdzLnN0YXJ0UG9zaXRpb24pP3RoaXMuc2V0dGluZ3Muc3RhcnRQb3NpdGlvbjowKSx0aGlzLmludmFsaWRhdGUoXCJpdGVtc1wiKX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGIsYyl7dmFyIGU9dGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KTtjPWM9PT1kP3RoaXMuX2l0ZW1zLmxlbmd0aDp0aGlzLm5vcm1hbGl6ZShjLCEwKSxiPWIgaW5zdGFuY2VvZiBqUXVlcnk/YjphKGIpLHRoaXMudHJpZ2dlcihcImFkZFwiLHtjb250ZW50OmIscG9zaXRpb246Y30pLGI9dGhpcy5wcmVwYXJlKGIpLDA9PT10aGlzLl9pdGVtcy5sZW5ndGh8fGM9PT10aGlzLl9pdGVtcy5sZW5ndGg/KDA9PT10aGlzLl9pdGVtcy5sZW5ndGgmJnRoaXMuJHN0YWdlLmFwcGVuZChiKSwwIT09dGhpcy5faXRlbXMubGVuZ3RoJiZ0aGlzLl9pdGVtc1tjLTFdLmFmdGVyKGIpLHRoaXMuX2l0ZW1zLnB1c2goYiksdGhpcy5fbWVyZ2Vycy5wdXNoKDEqYi5maW5kKFwiW2RhdGEtbWVyZ2VdXCIpLmFkZEJhY2soXCJbZGF0YS1tZXJnZV1cIikuYXR0cihcImRhdGEtbWVyZ2VcIil8fDEpKToodGhpcy5faXRlbXNbY10uYmVmb3JlKGIpLHRoaXMuX2l0ZW1zLnNwbGljZShjLDAsYiksdGhpcy5fbWVyZ2Vycy5zcGxpY2UoYywwLDEqYi5maW5kKFwiW2RhdGEtbWVyZ2VdXCIpLmFkZEJhY2soXCJbZGF0YS1tZXJnZV1cIikuYXR0cihcImRhdGEtbWVyZ2VcIil8fDEpKSx0aGlzLl9pdGVtc1tlXSYmdGhpcy5yZXNldCh0aGlzLl9pdGVtc1tlXS5pbmRleCgpKSx0aGlzLmludmFsaWRhdGUoXCJpdGVtc1wiKSx0aGlzLnRyaWdnZXIoXCJhZGRlZFwiLHtjb250ZW50OmIscG9zaXRpb246Y30pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oYSl7YT10aGlzLm5vcm1hbGl6ZShhLCEwKSxhIT09ZCYmKHRoaXMudHJpZ2dlcihcInJlbW92ZVwiLHtjb250ZW50OnRoaXMuX2l0ZW1zW2FdLHBvc2l0aW9uOmF9KSx0aGlzLl9pdGVtc1thXS5yZW1vdmUoKSx0aGlzLl9pdGVtcy5zcGxpY2UoYSwxKSx0aGlzLl9tZXJnZXJzLnNwbGljZShhLDEpLHRoaXMuaW52YWxpZGF0ZShcIml0ZW1zXCIpLHRoaXMudHJpZ2dlcihcInJlbW92ZWRcIix7Y29udGVudDpudWxsLHBvc2l0aW9uOmF9KSl9LGUucHJvdG90eXBlLnByZWxvYWRBdXRvV2lkdGhJbWFnZXM9ZnVuY3Rpb24oYil7Yi5lYWNoKGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLmVudGVyKFwicHJlLWxvYWRpbmdcIiksYz1hKGMpLGEobmV3IEltYWdlKS5vbmUoXCJsb2FkXCIsYS5wcm94eShmdW5jdGlvbihhKXtjLmF0dHIoXCJzcmNcIixhLnRhcmdldC5zcmMpLGMuY3NzKFwib3BhY2l0eVwiLDEpLHRoaXMubGVhdmUoXCJwcmUtbG9hZGluZ1wiKSwhdGhpcy5pcyhcInByZS1sb2FkaW5nXCIpJiYhdGhpcy5pcyhcImluaXRpYWxpemluZ1wiKSYmdGhpcy5yZWZyZXNoKCl9LHRoaXMpKS5hdHRyKFwic3JjXCIsYy5hdHRyKFwic3JjXCIpfHxjLmF0dHIoXCJkYXRhLXNyY1wiKXx8Yy5hdHRyKFwiZGF0YS1zcmMtcmV0aW5hXCIpKX0sdGhpcykpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5vZmYoXCIub3dsLmNvcmVcIiksdGhpcy4kc3RhZ2Uub2ZmKFwiLm93bC5jb3JlXCIpLGEoYykub2ZmKFwiLm93bC5jb3JlXCIpLHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZSE9PSExJiYoYi5jbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lciksdGhpcy5vZmYoYixcInJlc2l6ZVwiLHRoaXMuX2hhbmRsZXJzLm9uVGhyb3R0bGVkUmVzaXplKSk7Zm9yKHZhciBkIGluIHRoaXMuX3BsdWdpbnMpdGhpcy5fcGx1Z2luc1tkXS5kZXN0cm95KCk7dGhpcy4kc3RhZ2UuY2hpbGRyZW4oXCIuY2xvbmVkXCIpLnJlbW92ZSgpLHRoaXMuJHN0YWdlLnVud3JhcCgpLHRoaXMuJHN0YWdlLmNoaWxkcmVuKCkuY29udGVudHMoKS51bndyYXAoKSx0aGlzLiRzdGFnZS5jaGlsZHJlbigpLnVud3JhcCgpLHRoaXMuJHN0YWdlLnJlbW92ZSgpLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLnJlZnJlc2hDbGFzcykucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzcykucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRlZENsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMucnRsQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5kcmFnQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ncmFiQ2xhc3MpLmF0dHIoXCJjbGFzc1wiLHRoaXMuJGVsZW1lbnQuYXR0cihcImNsYXNzXCIpLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUNsYXNzK1wiLVxcXFxTK1xcXFxzXCIsXCJnXCIpLFwiXCIpKS5yZW1vdmVEYXRhKFwib3dsLmNhcm91c2VsXCIpfSxlLnByb3RvdHlwZS5vcD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5zZXR0aW5ncy5ydGw7c3dpdGNoKGIpe2Nhc2VcIjxcIjpyZXR1cm4gZD9hPmM6Yz5hO2Nhc2VcIj5cIjpyZXR1cm4gZD9jPmE6YT5jO2Nhc2VcIj49XCI6cmV0dXJuIGQ/Yz49YTphPj1jO2Nhc2VcIjw9XCI6cmV0dXJuIGQ/YT49YzpjPj1hfX0sZS5wcm90b3R5cGUub249ZnVuY3Rpb24oYSxiLGMsZCl7YS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsZCk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudChcIm9uXCIrYixjKX0sZS5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKGEsYixjLGQpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcj9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLGQpOmEuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoXCJvblwiK2IsYyl9LGUucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24oYixjLGQsZixnKXt2YXIgaD17aXRlbTp7Y291bnQ6dGhpcy5faXRlbXMubGVuZ3RoLGluZGV4OnRoaXMuY3VycmVudCgpfX0saT1hLmNhbWVsQ2FzZShhLmdyZXAoW1wib25cIixiLGRdLGZ1bmN0aW9uKGEpe3JldHVybiBhfSkuam9pbihcIi1cIikudG9Mb3dlckNhc2UoKSksaj1hLkV2ZW50KFtiLFwib3dsXCIsZHx8XCJjYXJvdXNlbFwiXS5qb2luKFwiLlwiKS50b0xvd2VyQ2FzZSgpLGEuZXh0ZW5kKHtyZWxhdGVkVGFyZ2V0OnRoaXN9LGgsYykpO3JldHVybiB0aGlzLl9zdXByZXNzW2JdfHwoYS5lYWNoKHRoaXMuX3BsdWdpbnMsZnVuY3Rpb24oYSxiKXtiLm9uVHJpZ2dlciYmYi5vblRyaWdnZXIoail9KSx0aGlzLnJlZ2lzdGVyKHt0eXBlOmUuVHlwZS5FdmVudCxuYW1lOmJ9KSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoaiksdGhpcy5zZXR0aW5ncyYmXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5zZXR0aW5nc1tpXSYmdGhpcy5zZXR0aW5nc1tpXS5jYWxsKHRoaXMsaikpLGp9LGUucHJvdG90eXBlLmVudGVyPWZ1bmN0aW9uKGIpe2EuZWFjaChbYl0uY29uY2F0KHRoaXMuX3N0YXRlcy50YWdzW2JdfHxbXSksYS5wcm94eShmdW5jdGlvbihhLGIpe3RoaXMuX3N0YXRlcy5jdXJyZW50W2JdPT09ZCYmKHRoaXMuX3N0YXRlcy5jdXJyZW50W2JdPTApLHRoaXMuX3N0YXRlcy5jdXJyZW50W2JdKyt9LHRoaXMpKX0sZS5wcm90b3R5cGUubGVhdmU9ZnVuY3Rpb24oYil7YS5lYWNoKFtiXS5jb25jYXQodGhpcy5fc3RhdGVzLnRhZ3NbYl18fFtdKSxhLnByb3h5KGZ1bmN0aW9uKGEsYil7dGhpcy5fc3RhdGVzLmN1cnJlbnRbYl0tLX0sdGhpcykpfSxlLnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbihiKXtpZihiLnR5cGU9PT1lLlR5cGUuRXZlbnQpe2lmKGEuZXZlbnQuc3BlY2lhbFtiLm5hbWVdfHwoYS5ldmVudC5zcGVjaWFsW2IubmFtZV09e30pLCFhLmV2ZW50LnNwZWNpYWxbYi5uYW1lXS5vd2wpe3ZhciBjPWEuZXZlbnQuc3BlY2lhbFtiLm5hbWVdLl9kZWZhdWx0O2EuZXZlbnQuc3BlY2lhbFtiLm5hbWVdLl9kZWZhdWx0PWZ1bmN0aW9uKGEpe3JldHVybiFjfHwhYy5hcHBseXx8YS5uYW1lc3BhY2UmJi0xIT09YS5uYW1lc3BhY2UuaW5kZXhPZihcIm93bFwiKT9hLm5hbWVzcGFjZSYmYS5uYW1lc3BhY2UuaW5kZXhPZihcIm93bFwiKT4tMTpjLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYS5ldmVudC5zcGVjaWFsW2IubmFtZV0ub3dsPSEwfX1lbHNlIGIudHlwZT09PWUuVHlwZS5TdGF0ZSYmKHRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV0/dGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT10aGlzLl9zdGF0ZXMudGFnc1tiLm5hbWVdLmNvbmNhdChiLnRhZ3MpOnRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV09Yi50YWdzLHRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV09YS5ncmVwKHRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV0sYS5wcm94eShmdW5jdGlvbihjLGQpe3JldHVybiBhLmluQXJyYXkoYyx0aGlzLl9zdGF0ZXMudGFnc1tiLm5hbWVdKT09PWR9LHRoaXMpKSl9LGUucHJvdG90eXBlLnN1cHByZXNzPWZ1bmN0aW9uKGIpe2EuZWFjaChiLGEucHJveHkoZnVuY3Rpb24oYSxiKXt0aGlzLl9zdXByZXNzW2JdPSEwfSx0aGlzKSl9LGUucHJvdG90eXBlLnJlbGVhc2U9ZnVuY3Rpb24oYil7YS5lYWNoKGIsYS5wcm94eShmdW5jdGlvbihhLGIpe2RlbGV0ZSB0aGlzLl9zdXByZXNzW2JdfSx0aGlzKSl9LGUucHJvdG90eXBlLnBvaW50ZXI9ZnVuY3Rpb24oYSl7dmFyIGM9e3g6bnVsbCx5Om51bGx9O3JldHVybiBhPWEub3JpZ2luYWxFdmVudHx8YXx8Yi5ldmVudCxhPWEudG91Y2hlcyYmYS50b3VjaGVzLmxlbmd0aD9hLnRvdWNoZXNbMF06YS5jaGFuZ2VkVG91Y2hlcyYmYS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg/YS5jaGFuZ2VkVG91Y2hlc1swXTphLGEucGFnZVg/KGMueD1hLnBhZ2VYLGMueT1hLnBhZ2VZKTooYy54PWEuY2xpZW50WCxjLnk9YS5jbGllbnRZKSxjfSxlLnByb3RvdHlwZS5pc051bWVyaWM9ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpfSxlLnByb3RvdHlwZS5kaWZmZXJlbmNlPWZ1bmN0aW9uKGEsYil7cmV0dXJue3g6YS54LWIueCx5OmEueS1iLnl9fSxhLmZuLm93bENhcm91c2VsPWZ1bmN0aW9uKGIpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxmPWQuZGF0YShcIm93bC5jYXJvdXNlbFwiKTtmfHwoZj1uZXcgZSh0aGlzLFwib2JqZWN0XCI9PXR5cGVvZiBiJiZiKSxkLmRhdGEoXCJvd2wuY2Fyb3VzZWxcIixmKSxhLmVhY2goW1wibmV4dFwiLFwicHJldlwiLFwidG9cIixcImRlc3Ryb3lcIixcInJlZnJlc2hcIixcInJlcGxhY2VcIixcImFkZFwiLFwicmVtb3ZlXCJdLGZ1bmN0aW9uKGIsYyl7Zi5yZWdpc3Rlcih7dHlwZTplLlR5cGUuRXZlbnQsbmFtZTpjfSksZi4kZWxlbWVudC5vbihjK1wiLm93bC5jYXJvdXNlbC5jb3JlXCIsYS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmYS5yZWxhdGVkVGFyZ2V0IT09dGhpcyYmKHRoaXMuc3VwcHJlc3MoW2NdKSxmW2NdLmFwcGx5KHRoaXMsW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpLHRoaXMucmVsZWFzZShbY10pKX0sZikpfSkpLFwic3RyaW5nXCI9PXR5cGVvZiBiJiZcIl9cIiE9PWIuY2hhckF0KDApJiZmW2JdLmFwcGx5KGYsYyl9KX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvcj1lfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5faW50ZXJ2YWw9bnVsbCx0aGlzLl92aXNpYmxlPW51bGwsdGhpcy5faGFuZGxlcnM9e1wiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsXCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvUmVmcmVzaCYmdGhpcy53YXRjaCgpfSx0aGlzKX0sdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKSx0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKX07ZS5EZWZhdWx0cz17YXV0b1JlZnJlc2g6ITAsYXV0b1JlZnJlc2hJbnRlcnZhbDo1MDB9LGUucHJvdG90eXBlLndhdGNoPWZ1bmN0aW9uKCl7dGhpcy5faW50ZXJ2YWx8fCh0aGlzLl92aXNpYmxlPXRoaXMuX2NvcmUuJGVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKSx0aGlzLl9pbnRlcnZhbD1iLnNldEludGVydmFsKGEucHJveHkodGhpcy5yZWZyZXNoLHRoaXMpLHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b1JlZnJlc2hJbnRlcnZhbCkpfSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS4kZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpIT09dGhpcy5fdmlzaWJsZSYmKHRoaXMuX3Zpc2libGU9IXRoaXMuX3Zpc2libGUsdGhpcy5fY29yZS4kZWxlbWVudC50b2dnbGVDbGFzcyhcIm93bC1oaWRkZW5cIiwhdGhpcy5fdmlzaWJsZSksdGhpcy5fdmlzaWJsZSYmdGhpcy5fY29yZS5pbnZhbGlkYXRlKFwid2lkdGhcIikmJnRoaXMuX2NvcmUucmVmcmVzaCgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGM7Yi5jbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYyBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSlcImZ1bmN0aW9uXCIhPXR5cGVvZiB0aGlzW2NdJiYodGhpc1tjXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkF1dG9SZWZyZXNoPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWZ1bmN0aW9uKGIpe3RoaXMuX2NvcmU9Yix0aGlzLl9sb2FkZWQ9W10sdGhpcy5faGFuZGxlcnM9e1wiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIGNoYW5nZS5vd2wuY2Fyb3VzZWwgcmVzaXplZC5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGIpe2lmKGIubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmxhenlMb2FkJiYoYi5wcm9wZXJ0eSYmXCJwb3NpdGlvblwiPT1iLnByb3BlcnR5Lm5hbWV8fFwiaW5pdGlhbGl6ZWRcIj09Yi50eXBlKSlmb3IodmFyIGM9dGhpcy5fY29yZS5zZXR0aW5ncyxlPWMuY2VudGVyJiZNYXRoLmNlaWwoYy5pdGVtcy8yKXx8Yy5pdGVtcyxmPWMuY2VudGVyJiYtMSplfHwwLGc9KGIucHJvcGVydHkmJmIucHJvcGVydHkudmFsdWUhPT1kP2IucHJvcGVydHkudmFsdWU6dGhpcy5fY29yZS5jdXJyZW50KCkpK2YsaD10aGlzLl9jb3JlLmNsb25lcygpLmxlbmd0aCxpPWEucHJveHkoZnVuY3Rpb24oYSxiKXt0aGlzLmxvYWQoYil9LHRoaXMpO2YrKzxlOyl0aGlzLmxvYWQoaC8yK3RoaXMuX2NvcmUucmVsYXRpdmUoZykpLGgmJmEuZWFjaCh0aGlzLl9jb3JlLmNsb25lcyh0aGlzLl9jb3JlLnJlbGF0aXZlKGcpKSxpKSxnKyt9LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpfTtlLkRlZmF1bHRzPXtsYXp5TG9hZDohMX0sZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbihjKXt2YXIgZD10aGlzLl9jb3JlLiRzdGFnZS5jaGlsZHJlbigpLmVxKGMpLGU9ZCYmZC5maW5kKFwiLm93bC1sYXp5XCIpOyFlfHxhLmluQXJyYXkoZC5nZXQoMCksdGhpcy5fbG9hZGVkKT4tMXx8KGUuZWFjaChhLnByb3h5KGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKGQpLGc9Yi5kZXZpY2VQaXhlbFJhdGlvPjEmJmYuYXR0cihcImRhdGEtc3JjLXJldGluYVwiKXx8Zi5hdHRyKFwiZGF0YS1zcmNcIik7dGhpcy5fY29yZS50cmlnZ2VyKFwibG9hZFwiLHtlbGVtZW50OmYsdXJsOmd9LFwibGF6eVwiKSxmLmlzKFwiaW1nXCIpP2Yub25lKFwibG9hZC5vd2wubGF6eVwiLGEucHJveHkoZnVuY3Rpb24oKXtmLmNzcyhcIm9wYWNpdHlcIiwxKSx0aGlzLl9jb3JlLnRyaWdnZXIoXCJsb2FkZWRcIix7ZWxlbWVudDpmLHVybDpnfSxcImxhenlcIil9LHRoaXMpKS5hdHRyKFwic3JjXCIsZyk6KGU9bmV3IEltYWdlLGUub25sb2FkPWEucHJveHkoZnVuY3Rpb24oKXtmLmNzcyh7XCJiYWNrZ3JvdW5kLWltYWdlXCI6J3VybChcIicrZysnXCIpJyxvcGFjaXR5OlwiMVwifSksdGhpcy5fY29yZS50cmlnZ2VyKFwibG9hZGVkXCIse2VsZW1lbnQ6Zix1cmw6Z30sXCJsYXp5XCIpfSx0aGlzKSxlLnNyYz1nKX0sdGhpcykpLHRoaXMuX2xvYWRlZC5wdXNoKGQuZ2V0KDApKSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiO2ZvcihhIGluIHRoaXMuaGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYSx0aGlzLmhhbmRsZXJzW2FdKTtmb3IoYiBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSlcImZ1bmN0aW9uXCIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkxhenk9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5fY29yZT1iLHRoaXMuX2hhbmRsZXJzPXtcImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCByZWZyZXNoZWQub3dsLmNhcm91c2VsXCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0JiZ0aGlzLnVwZGF0ZSgpfSx0aGlzKSxcImNoYW5nZWQub3dsLmNhcm91c2VsXCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0JiZcInBvc2l0aW9uXCI9PWEucHJvcGVydHkubmFtZSYmdGhpcy51cGRhdGUoKX0sdGhpcyksXCJsb2FkZWQub3dsLmxhenlcIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9IZWlnaHQmJmEuZWxlbWVudC5jbG9zZXN0KFwiLlwiK3RoaXMuX2NvcmUuc2V0dGluZ3MuaXRlbUNsYXNzKS5pbmRleCgpPT09dGhpcy5fY29yZS5jdXJyZW50KCkmJnRoaXMudXBkYXRlKCl9LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpfTtlLkRlZmF1bHRzPXthdXRvSGVpZ2h0OiExLGF1dG9IZWlnaHRDbGFzczpcIm93bC1oZWlnaHRcIn0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY29yZS5fY3VycmVudCxjPWIrdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtcyxkPXRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCkudG9BcnJheSgpLnNsaWNlKGIsYyksZT1bXSxmPTA7YS5lYWNoKGQsZnVuY3Rpb24oYixjKXtlLnB1c2goYShjKS5oZWlnaHQoKSl9KSxmPU1hdGgubWF4LmFwcGx5KG51bGwsZSksdGhpcy5fY29yZS4kc3RhZ2UucGFyZW50KCkuaGVpZ2h0KGYpLmFkZENsYXNzKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodENsYXNzKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGI7Zm9yKGEgaW4gdGhpcy5faGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYSx0aGlzLl9oYW5kbGVyc1thXSk7Zm9yKGIgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpXCJmdW5jdGlvblwiIT10eXBlb2YgdGhpc1tiXSYmKHRoaXNbYl09bnVsbCl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5BdXRvSGVpZ2h0PWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWZ1bmN0aW9uKGIpe3RoaXMuX2NvcmU9Yix0aGlzLl92aWRlb3M9e30sdGhpcy5fcGxheWluZz1udWxsLHRoaXMuX2hhbmRsZXJzPXtcImluaXRpYWxpemVkLm93bC5jYXJvdXNlbFwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUucmVnaXN0ZXIoe3R5cGU6XCJzdGF0ZVwiLG5hbWU6XCJwbGF5aW5nXCIsdGFnczpbXCJpbnRlcmFjdGluZ1wiXX0pfSx0aGlzKSxcInJlc2l6ZS5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvJiZ0aGlzLmlzSW5GdWxsU2NyZWVuKCkmJmEucHJldmVudERlZmF1bHQoKX0sdGhpcyksXCJyZWZyZXNoZWQub3dsLmNhcm91c2VsXCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5pcyhcInJlc2l6aW5nXCIpJiZ0aGlzLl9jb3JlLiRzdGFnZS5maW5kKFwiLmNsb25lZCAub3dsLXZpZGVvLWZyYW1lXCIpLnJlbW92ZSgpfSx0aGlzKSxcImNoYW5nZWQub3dsLmNhcm91c2VsXCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmXCJwb3NpdGlvblwiPT09YS5wcm9wZXJ0eS5uYW1lJiZ0aGlzLl9wbGF5aW5nJiZ0aGlzLnN0b3AoKX0sdGhpcyksXCJwcmVwYXJlZC5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGIpe2lmKGIubmFtZXNwYWNlKXt2YXIgYz1hKGIuY29udGVudCkuZmluZChcIi5vd2wtdmlkZW9cIik7Yy5sZW5ndGgmJihjLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIiksdGhpcy5mZXRjaChjLGEoYi5jb250ZW50KSkpfX0sdGhpcyl9LHRoaXMuX2NvcmUub3B0aW9ucz1hLmV4dGVuZCh7fSxlLkRlZmF1bHRzLHRoaXMuX2NvcmUub3B0aW9ucyksdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5fY29yZS4kZWxlbWVudC5vbihcImNsaWNrLm93bC52aWRlb1wiLFwiLm93bC12aWRlby1wbGF5LWljb25cIixhLnByb3h5KGZ1bmN0aW9uKGEpe3RoaXMucGxheShhKX0sdGhpcykpfTtlLkRlZmF1bHRzPXt2aWRlbzohMSx2aWRlb0hlaWdodDohMSx2aWRlb1dpZHRoOiExfSxlLnByb3RvdHlwZS5mZXRjaD1mdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXR0cihcImRhdGEtdmltZW8taWRcIik/XCJ2aW1lb1wiOmEuYXR0cihcImRhdGEtdnphYXItaWRcIik/XCJ2emFhclwiOlwieW91dHViZVwifSgpLGQ9YS5hdHRyKFwiZGF0YS12aW1lby1pZFwiKXx8YS5hdHRyKFwiZGF0YS15b3V0dWJlLWlkXCIpfHxhLmF0dHIoXCJkYXRhLXZ6YWFyLWlkXCIpLGU9YS5hdHRyKFwiZGF0YS13aWR0aFwiKXx8dGhpcy5fY29yZS5zZXR0aW5ncy52aWRlb1dpZHRoLGY9YS5hdHRyKFwiZGF0YS1oZWlnaHRcIil8fHRoaXMuX2NvcmUuc2V0dGluZ3MudmlkZW9IZWlnaHQsZz1hLmF0dHIoXCJocmVmXCIpO2lmKCFnKXRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdmlkZW8gVVJMLlwiKTtpZihkPWcubWF0Y2goLyhodHRwOnxodHRwczp8KVxcL1xcLyhwbGF5ZXIufHd3dy58YXBwLik/KHZpbWVvXFwuY29tfHlvdXR1KGJlXFwuY29tfFxcLmJlfGJlXFwuZ29vZ2xlYXBpc1xcLmNvbSl8dnphYXJcXC5jb20pXFwvKHZpZGVvXFwvfHZpZGVvc1xcL3xlbWJlZFxcL3xjaGFubmVsc1xcLy4rXFwvfGdyb3Vwc1xcLy4rXFwvfHdhdGNoXFw/dj18dlxcLyk/KFtBLVphLXowLTkuXyUtXSopKFxcJlxcUyspPy8pLGRbM10uaW5kZXhPZihcInlvdXR1XCIpPi0xKWM9XCJ5b3V0dWJlXCI7ZWxzZSBpZihkWzNdLmluZGV4T2YoXCJ2aW1lb1wiKT4tMSljPVwidmltZW9cIjtlbHNle2lmKCEoZFszXS5pbmRleE9mKFwidnphYXJcIik+LTEpKXRocm93IG5ldyBFcnJvcihcIlZpZGVvIFVSTCBub3Qgc3VwcG9ydGVkLlwiKTtjPVwidnphYXJcIn1kPWRbNl0sdGhpcy5fdmlkZW9zW2ddPXt0eXBlOmMsaWQ6ZCx3aWR0aDplLGhlaWdodDpmfSxiLmF0dHIoXCJkYXRhLXZpZGVvXCIsZyksdGhpcy50aHVtYm5haWwoYSx0aGlzLl92aWRlb3NbZ10pfSxlLnByb3RvdHlwZS50aHVtYm5haWw9ZnVuY3Rpb24oYixjKXt2YXIgZCxlLGYsZz1jLndpZHRoJiZjLmhlaWdodD8nc3R5bGU9XCJ3aWR0aDonK2Mud2lkdGgrXCJweDtoZWlnaHQ6XCIrYy5oZWlnaHQrJ3B4O1wiJzpcIlwiLGg9Yi5maW5kKFwiaW1nXCIpLGk9XCJzcmNcIixqPVwiXCIsaz10aGlzLl9jb3JlLnNldHRpbmdzLGw9ZnVuY3Rpb24oYSl7ZT0nPGRpdiBjbGFzcz1cIm93bC12aWRlby1wbGF5LWljb25cIj48L2Rpdj4nLGQ9ay5sYXp5TG9hZD8nPGRpdiBjbGFzcz1cIm93bC12aWRlby10biAnK2orJ1wiICcraSsnPVwiJythKydcIj48L2Rpdj4nOic8ZGl2IGNsYXNzPVwib3dsLXZpZGVvLXRuXCIgc3R5bGU9XCJvcGFjaXR5OjE7YmFja2dyb3VuZC1pbWFnZTp1cmwoJythKycpXCI+PC9kaXY+JyxiLmFmdGVyKGQpLGIuYWZ0ZXIoZSl9O3JldHVybiBiLndyYXAoJzxkaXYgY2xhc3M9XCJvd2wtdmlkZW8td3JhcHBlclwiJytnK1wiPjwvZGl2PlwiKSx0aGlzLl9jb3JlLnNldHRpbmdzLmxhenlMb2FkJiYoaT1cImRhdGEtc3JjXCIsaj1cIm93bC1sYXp5XCIpLGgubGVuZ3RoPyhsKGguYXR0cihpKSksaC5yZW1vdmUoKSwhMSk6dm9pZChcInlvdXR1YmVcIj09PWMudHlwZT8oZj1cIi8vaW1nLnlvdXR1YmUuY29tL3ZpL1wiK2MuaWQrXCIvaHFkZWZhdWx0LmpwZ1wiLGwoZikpOlwidmltZW9cIj09PWMudHlwZT9hLmFqYXgoe3R5cGU6XCJHRVRcIix1cmw6XCIvL3ZpbWVvLmNvbS9hcGkvdjIvdmlkZW8vXCIrYy5pZCtcIi5qc29uXCIsanNvbnA6XCJjYWxsYmFja1wiLGRhdGFUeXBlOlwianNvbnBcIixzdWNjZXNzOmZ1bmN0aW9uKGEpe2Y9YVswXS50aHVtYm5haWxfbGFyZ2UsbChmKX19KTpcInZ6YWFyXCI9PT1jLnR5cGUmJmEuYWpheCh7dHlwZTpcIkdFVFwiLHVybDpcIi8vdnphYXIuY29tL2FwaS92aWRlb3MvXCIrYy5pZCtcIi5qc29uXCIsanNvbnA6XCJjYWxsYmFja1wiLGRhdGFUeXBlOlwianNvbnBcIixzdWNjZXNzOmZ1bmN0aW9uKGEpe2Y9YS5mcmFtZWdyYWJfdXJsLGwoZil9fSkpfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS50cmlnZ2VyKFwic3RvcFwiLG51bGwsXCJ2aWRlb1wiKSx0aGlzLl9wbGF5aW5nLmZpbmQoXCIub3dsLXZpZGVvLWZyYW1lXCIpLnJlbW92ZSgpLHRoaXMuX3BsYXlpbmcucmVtb3ZlQ2xhc3MoXCJvd2wtdmlkZW8tcGxheWluZ1wiKSx0aGlzLl9wbGF5aW5nPW51bGwsdGhpcy5fY29yZS5sZWF2ZShcInBsYXlpbmdcIiksdGhpcy5fY29yZS50cmlnZ2VyKFwic3RvcHBlZFwiLG51bGwsXCJ2aWRlb1wiKX0sZS5wcm90b3R5cGUucGxheT1mdW5jdGlvbihiKXt2YXIgYyxkPWEoYi50YXJnZXQpLGU9ZC5jbG9zZXN0KFwiLlwiK3RoaXMuX2NvcmUuc2V0dGluZ3MuaXRlbUNsYXNzKSxmPXRoaXMuX3ZpZGVvc1tlLmF0dHIoXCJkYXRhLXZpZGVvXCIpXSxnPWYud2lkdGh8fFwiMTAwJVwiLGg9Zi5oZWlnaHR8fHRoaXMuX2NvcmUuJHN0YWdlLmhlaWdodCgpO3RoaXMuX3BsYXlpbmd8fCh0aGlzLl9jb3JlLmVudGVyKFwicGxheWluZ1wiKSx0aGlzLl9jb3JlLnRyaWdnZXIoXCJwbGF5XCIsbnVsbCxcInZpZGVvXCIpLGU9dGhpcy5fY29yZS5pdGVtcyh0aGlzLl9jb3JlLnJlbGF0aXZlKGUuaW5kZXgoKSkpLHRoaXMuX2NvcmUucmVzZXQoZS5pbmRleCgpKSxcInlvdXR1YmVcIj09PWYudHlwZT9jPSc8aWZyYW1lIHdpZHRoPVwiJytnKydcIiBoZWlnaHQ9XCInK2grJ1wiIHNyYz1cIi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLycrZi5pZCtcIj9hdXRvcGxheT0xJnJlbD0wJnY9XCIrZi5pZCsnXCIgZnJhbWVib3JkZXI9XCIwXCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPic6XCJ2aW1lb1wiPT09Zi50eXBlP2M9JzxpZnJhbWUgc3JjPVwiLy9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLycrZi5pZCsnP2F1dG9wbGF5PTFcIiB3aWR0aD1cIicrZysnXCIgaGVpZ2h0PVwiJytoKydcIiBmcmFtZWJvcmRlcj1cIjBcIiB3ZWJraXRhbGxvd2Z1bGxzY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nOlwidnphYXJcIj09PWYudHlwZSYmKGM9JzxpZnJhbWUgZnJhbWVib3JkZXI9XCIwXCJoZWlnaHQ9XCInK2grJ1wid2lkdGg9XCInK2crJ1wiIGFsbG93ZnVsbHNjcmVlbiBtb3phbGxvd2Z1bGxzY3JlZW4gd2Via2l0QWxsb3dGdWxsU2NyZWVuIHNyYz1cIi8vdmlldy52emFhci5jb20vJytmLmlkKycvcGxheWVyP2F1dG9wbGF5PXRydWVcIj48L2lmcmFtZT4nKSxhKCc8ZGl2IGNsYXNzPVwib3dsLXZpZGVvLWZyYW1lXCI+JytjK1wiPC9kaXY+XCIpLmluc2VydEFmdGVyKGUuZmluZChcIi5vd2wtdmlkZW9cIikpLHRoaXMuX3BsYXlpbmc9ZS5hZGRDbGFzcyhcIm93bC12aWRlby1wbGF5aW5nXCIpKX0sZS5wcm90b3R5cGUuaXNJbkZ1bGxTY3JlZW49ZnVuY3Rpb24oKXt2YXIgYj1jLmZ1bGxzY3JlZW5FbGVtZW50fHxjLm1vekZ1bGxTY3JlZW5FbGVtZW50fHxjLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50O3JldHVybiBiJiZhKGIpLnBhcmVudCgpLmhhc0NsYXNzKFwib3dsLXZpZGVvLWZyYW1lXCIpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGEsYjt0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihcImNsaWNrLm93bC52aWRlb1wiKTtmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYiBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSlcImZ1bmN0aW9uXCIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLlZpZGVvPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWZ1bmN0aW9uKGIpe3RoaXMuY29yZT1iLHRoaXMuY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5jb3JlLm9wdGlvbnMpLHRoaXMuc3dhcHBpbmc9ITAsdGhpcy5wcmV2aW91cz1kLHRoaXMubmV4dD1kLHRoaXMuaGFuZGxlcnM9e1wiY2hhbmdlLm93bC5jYXJvdXNlbFwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJlwicG9zaXRpb25cIj09YS5wcm9wZXJ0eS5uYW1lJiYodGhpcy5wcmV2aW91cz10aGlzLmNvcmUuY3VycmVudCgpLHRoaXMubmV4dD1hLnByb3BlcnR5LnZhbHVlKX0sdGhpcyksXCJkcmFnLm93bC5jYXJvdXNlbCBkcmFnZ2VkLm93bC5jYXJvdXNlbCB0cmFuc2xhdGVkLm93bC5jYXJvdXNlbFwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJih0aGlzLnN3YXBwaW5nPVwidHJhbnNsYXRlZFwiPT1hLnR5cGUpfSx0aGlzKSxcInRyYW5zbGF0ZS5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLnN3YXBwaW5nJiYodGhpcy5jb3JlLm9wdGlvbnMuYW5pbWF0ZU91dHx8dGhpcy5jb3JlLm9wdGlvbnMuYW5pbWF0ZUluKSYmdGhpcy5zd2FwKCl9LHRoaXMpfSx0aGlzLmNvcmUuJGVsZW1lbnQub24odGhpcy5oYW5kbGVycyl9O2UuRGVmYXVsdHM9e2FuaW1hdGVPdXQ6ITEsYW5pbWF0ZUluOiExfSxlLnByb3RvdHlwZS5zd2FwPWZ1bmN0aW9uKCl7aWYoMT09PXRoaXMuY29yZS5zZXR0aW5ncy5pdGVtcyYmYS5zdXBwb3J0LmFuaW1hdGlvbiYmYS5zdXBwb3J0LnRyYW5zaXRpb24pe3RoaXMuY29yZS5zcGVlZCgwKTt2YXIgYixjPWEucHJveHkodGhpcy5jbGVhcix0aGlzKSxkPXRoaXMuY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS5lcSh0aGlzLnByZXZpb3VzKSxlPXRoaXMuY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS5lcSh0aGlzLm5leHQpLGY9dGhpcy5jb3JlLnNldHRpbmdzLmFuaW1hdGVJbixnPXRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlT3V0O3RoaXMuY29yZS5jdXJyZW50KCkhPT10aGlzLnByZXZpb3VzJiYoZyYmKGI9dGhpcy5jb3JlLmNvb3JkaW5hdGVzKHRoaXMucHJldmlvdXMpLXRoaXMuY29yZS5jb29yZGluYXRlcyh0aGlzLm5leHQpLGQub25lKGEuc3VwcG9ydC5hbmltYXRpb24uZW5kLGMpLmNzcyh7bGVmdDpiK1wicHhcIn0pLmFkZENsYXNzKFwiYW5pbWF0ZWQgb3dsLWFuaW1hdGVkLW91dFwiKS5hZGRDbGFzcyhnKSksZiYmZS5vbmUoYS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsYykuYWRkQ2xhc3MoXCJhbmltYXRlZCBvd2wtYW5pbWF0ZWQtaW5cIikuYWRkQ2xhc3MoZikpfX0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oYil7YShiLnRhcmdldCkuY3NzKHtsZWZ0OlwiXCJ9KS5yZW1vdmVDbGFzcyhcImFuaW1hdGVkIG93bC1hbmltYXRlZC1vdXQgb3dsLWFuaW1hdGVkLWluXCIpLnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4pLnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlT3V0KSx0aGlzLmNvcmUub25UcmFuc2l0aW9uRW5kKCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiO2ZvcihhIGluIHRoaXMuaGFuZGxlcnMpdGhpcy5jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuaGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKVwiZnVuY3Rpb25cIiE9dHlwZW9mIHRoaXNbYl0mJih0aGlzW2JdPW51bGwpO1xyXG59LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5BbmltYXRlPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWZ1bmN0aW9uKGIpe3RoaXMuX2NvcmU9Yix0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0wLHRoaXMuX3RpbWVvdXQ9MCx0aGlzLl9wYXVzZWQ9ITAsdGhpcy5faGFuZGxlcnM9e1wiY2hhbmdlZC5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZcInNldHRpbmdzXCI9PT1hLnByb3BlcnR5Lm5hbWU/dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheT90aGlzLnBsYXkoKTp0aGlzLnN0b3AoKTphLm5hbWVzcGFjZSYmXCJwb3NpdGlvblwiPT09YS5wcm9wZXJ0eS5uYW1lJiZ0aGlzLl9wYXVzZWQmJih0aGlzLl90aW1lPTApfSx0aGlzKSxcImluaXRpYWxpemVkLm93bC5jYXJvdXNlbFwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXkmJnRoaXMucGxheSgpfSx0aGlzKSxcInBsYXkub3dsLmF1dG9wbGF5XCI6YS5wcm94eShmdW5jdGlvbihhLGIsYyl7YS5uYW1lc3BhY2UmJnRoaXMucGxheShiLGMpfSx0aGlzKSxcInN0b3Aub3dsLmF1dG9wbGF5XCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5zdG9wKCl9LHRoaXMpLFwibW91c2VvdmVyLm93bC5hdXRvcGxheVwiOmEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSYmdGhpcy5fY29yZS5pcyhcInJvdGF0aW5nXCIpJiZ0aGlzLnBhdXNlKCl9LHRoaXMpLFwibW91c2VsZWF2ZS5vd2wuYXV0b3BsYXlcIjphLnByb3h5KGZ1bmN0aW9uKCl7dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UmJnRoaXMuX2NvcmUuaXMoXCJyb3RhdGluZ1wiKSYmdGhpcy5wbGF5KCl9LHRoaXMpLFwidG91Y2hzdGFydC5vd2wuY29yZVwiOmEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSYmdGhpcy5fY29yZS5pcyhcInJvdGF0aW5nXCIpJiZ0aGlzLnBhdXNlKCl9LHRoaXMpLFwidG91Y2hlbmQub3dsLmNvcmVcIjphLnByb3h5KGZ1bmN0aW9uKCl7dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UmJnRoaXMucGxheSgpfSx0aGlzKX0sdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKX07ZS5EZWZhdWx0cz17YXV0b3BsYXk6ITEsYXV0b3BsYXlUaW1lb3V0OjVlMyxhdXRvcGxheUhvdmVyUGF1c2U6ITEsYXV0b3BsYXlTcGVlZDohMX0sZS5wcm90b3R5cGUuX25leHQ9ZnVuY3Rpb24oZCl7dGhpcy5fY2FsbD1iLnNldFRpbWVvdXQoYS5wcm94eSh0aGlzLl9uZXh0LHRoaXMsZCksdGhpcy5fdGltZW91dCooTWF0aC5yb3VuZCh0aGlzLnJlYWQoKS90aGlzLl90aW1lb3V0KSsxKS10aGlzLnJlYWQoKSksdGhpcy5fY29yZS5pcyhcImJ1c3lcIil8fHRoaXMuX2NvcmUuaXMoXCJpbnRlcmFjdGluZ1wiKXx8Yy5oaWRkZW58fHRoaXMuX2NvcmUubmV4dChkfHx0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5U3BlZWQpfSxlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fdGltZX0sZS5wcm90b3R5cGUucGxheT1mdW5jdGlvbihjLGQpe3ZhciBlO3RoaXMuX2NvcmUuaXMoXCJyb3RhdGluZ1wiKXx8dGhpcy5fY29yZS5lbnRlcihcInJvdGF0aW5nXCIpLGM9Y3x8dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheVRpbWVvdXQsZT1NYXRoLm1pbih0aGlzLl90aW1lJSh0aGlzLl90aW1lb3V0fHxjKSxjKSx0aGlzLl9wYXVzZWQ/KHRoaXMuX3RpbWU9dGhpcy5yZWFkKCksdGhpcy5fcGF1c2VkPSExKTpiLmNsZWFyVGltZW91dCh0aGlzLl9jYWxsKSx0aGlzLl90aW1lKz10aGlzLnJlYWQoKSVjLWUsdGhpcy5fdGltZW91dD1jLHRoaXMuX2NhbGw9Yi5zZXRUaW1lb3V0KGEucHJveHkodGhpcy5fbmV4dCx0aGlzLGQpLGMtZSl9LGUucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLl9jb3JlLmlzKFwicm90YXRpbmdcIikmJih0aGlzLl90aW1lPTAsdGhpcy5fcGF1c2VkPSEwLGIuY2xlYXJUaW1lb3V0KHRoaXMuX2NhbGwpLHRoaXMuX2NvcmUubGVhdmUoXCJyb3RhdGluZ1wiKSl9LGUucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS5pcyhcInJvdGF0aW5nXCIpJiYhdGhpcy5fcGF1c2VkJiYodGhpcy5fdGltZT10aGlzLnJlYWQoKSx0aGlzLl9wYXVzZWQ9ITAsYi5jbGVhclRpbWVvdXQodGhpcy5fY2FsbCkpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGEsYjt0aGlzLnN0b3AoKTtmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYiBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSlcImZ1bmN0aW9uXCIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLmF1dG9wbGF5PWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe1widXNlIHN0cmljdFwiO3ZhciBlPWZ1bmN0aW9uKGIpe3RoaXMuX2NvcmU9Yix0aGlzLl9pbml0aWFsaXplZD0hMSx0aGlzLl9wYWdlcz1bXSx0aGlzLl9jb250cm9scz17fSx0aGlzLl90ZW1wbGF0ZXM9W10sdGhpcy4kZWxlbWVudD10aGlzLl9jb3JlLiRlbGVtZW50LHRoaXMuX292ZXJyaWRlcz17bmV4dDp0aGlzLl9jb3JlLm5leHQscHJldjp0aGlzLl9jb3JlLnByZXYsdG86dGhpcy5fY29yZS50b30sdGhpcy5faGFuZGxlcnM9e1wicHJlcGFyZWQub3dsLmNhcm91c2VsXCI6YS5wcm94eShmdW5jdGlvbihiKXtiLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5kb3RzRGF0YSYmdGhpcy5fdGVtcGxhdGVzLnB1c2goJzxkaXYgY2xhc3M9XCInK3RoaXMuX2NvcmUuc2V0dGluZ3MuZG90Q2xhc3MrJ1wiPicrYShiLmNvbnRlbnQpLmZpbmQoXCJbZGF0YS1kb3RdXCIpLmFkZEJhY2soXCJbZGF0YS1kb3RdXCIpLmF0dHIoXCJkYXRhLWRvdFwiKStcIjwvZGl2PlwiKX0sdGhpcyksXCJhZGRlZC5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhJiZ0aGlzLl90ZW1wbGF0ZXMuc3BsaWNlKGEucG9zaXRpb24sMCx0aGlzLl90ZW1wbGF0ZXMucG9wKCkpfSx0aGlzKSxcInJlbW92ZS5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhJiZ0aGlzLl90ZW1wbGF0ZXMuc3BsaWNlKGEucG9zaXRpb24sMSl9LHRoaXMpLFwiY2hhbmdlZC5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZcInBvc2l0aW9uXCI9PWEucHJvcGVydHkubmFtZSYmdGhpcy5kcmF3KCl9LHRoaXMpLFwiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsXCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmIXRoaXMuX2luaXRpYWxpemVkJiYodGhpcy5fY29yZS50cmlnZ2VyKFwiaW5pdGlhbGl6ZVwiLG51bGwsXCJuYXZpZ2F0aW9uXCIpLHRoaXMuaW5pdGlhbGl6ZSgpLHRoaXMudXBkYXRlKCksdGhpcy5kcmF3KCksdGhpcy5faW5pdGlhbGl6ZWQ9ITAsdGhpcy5fY29yZS50cmlnZ2VyKFwiaW5pdGlhbGl6ZWRcIixudWxsLFwibmF2aWdhdGlvblwiKSl9LHRoaXMpLFwicmVmcmVzaGVkLm93bC5jYXJvdXNlbFwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2luaXRpYWxpemVkJiYodGhpcy5fY29yZS50cmlnZ2VyKFwicmVmcmVzaFwiLG51bGwsXCJuYXZpZ2F0aW9uXCIpLHRoaXMudXBkYXRlKCksdGhpcy5kcmF3KCksdGhpcy5fY29yZS50cmlnZ2VyKFwicmVmcmVzaGVkXCIsbnVsbCxcIm5hdmlnYXRpb25cIikpfSx0aGlzKX0sdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKSx0aGlzLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKX07ZS5EZWZhdWx0cz17bmF2OiExLG5hdlRleHQ6Wyc8c3BhbiBhcmlhLWxhYmVsPVwicHJldlwiPiYjeDIwMzk7PC9zcGFuPicsJzxzcGFuIGFyaWEtbGFiZWw9XCJuZXh0XCI+JiN4MjAzYTs8L3NwYW4+J10sbmF2U3BlZWQ6ITEsbmF2RWxlbWVudDonYnV0dG9uIHJvbGU9XCJwcmVzZW50YXRpb25cIicsbmF2Q29udGFpbmVyOiExLG5hdkNvbnRhaW5lckNsYXNzOlwib3dsLW5hdlwiLG5hdkNsYXNzOltcIm93bC1wcmV2XCIsXCJvd2wtbmV4dFwiXSxzbGlkZUJ5OjEsZG90Q2xhc3M6XCJvd2wtZG90XCIsZG90c0NsYXNzOlwib3dsLWRvdHNcIixkb3RzOiEwLGRvdHNFYWNoOiExLGRvdHNEYXRhOiExLGRvdHNTcGVlZDohMSxkb3RzQ29udGFpbmVyOiExfSxlLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7dmFyIGIsYz10aGlzLl9jb3JlLnNldHRpbmdzO3RoaXMuX2NvbnRyb2xzLiRyZWxhdGl2ZT0oYy5uYXZDb250YWluZXI/YShjLm5hdkNvbnRhaW5lcik6YShcIjxkaXY+XCIpLmFkZENsYXNzKGMubmF2Q29udGFpbmVyQ2xhc3MpLmFwcGVuZFRvKHRoaXMuJGVsZW1lbnQpKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpLHRoaXMuX2NvbnRyb2xzLiRwcmV2aW91cz1hKFwiPFwiK2MubmF2RWxlbWVudCtcIj5cIikuYWRkQ2xhc3MoYy5uYXZDbGFzc1swXSkuaHRtbChjLm5hdlRleHRbMF0pLnByZXBlbmRUbyh0aGlzLl9jb250cm9scy4kcmVsYXRpdmUpLm9uKFwiY2xpY2tcIixhLnByb3h5KGZ1bmN0aW9uKGEpe3RoaXMucHJldihjLm5hdlNwZWVkKX0sdGhpcykpLHRoaXMuX2NvbnRyb2xzLiRuZXh0PWEoXCI8XCIrYy5uYXZFbGVtZW50K1wiPlwiKS5hZGRDbGFzcyhjLm5hdkNsYXNzWzFdKS5odG1sKGMubmF2VGV4dFsxXSkuYXBwZW5kVG8odGhpcy5fY29udHJvbHMuJHJlbGF0aXZlKS5vbihcImNsaWNrXCIsYS5wcm94eShmdW5jdGlvbihhKXt0aGlzLm5leHQoYy5uYXZTcGVlZCl9LHRoaXMpKSxjLmRvdHNEYXRhfHwodGhpcy5fdGVtcGxhdGVzPVthKFwiPGJ1dHRvbj5cIikuYWRkQ2xhc3MoYy5kb3RDbGFzcykuYXBwZW5kKGEoXCI8c3Bhbj5cIikpLnByb3AoXCJvdXRlckhUTUxcIildKSx0aGlzLl9jb250cm9scy4kYWJzb2x1dGU9KGMuZG90c0NvbnRhaW5lcj9hKGMuZG90c0NvbnRhaW5lcik6YShcIjxkaXY+XCIpLmFkZENsYXNzKGMuZG90c0NsYXNzKS5hcHBlbmRUbyh0aGlzLiRlbGVtZW50KSkuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKSx0aGlzLl9jb250cm9scy4kYWJzb2x1dGUub24oXCJjbGlja1wiLFwiYnV0dG9uXCIsYS5wcm94eShmdW5jdGlvbihiKXt2YXIgZD1hKGIudGFyZ2V0KS5wYXJlbnQoKS5pcyh0aGlzLl9jb250cm9scy4kYWJzb2x1dGUpP2EoYi50YXJnZXQpLmluZGV4KCk6YShiLnRhcmdldCkucGFyZW50KCkuaW5kZXgoKTtiLnByZXZlbnREZWZhdWx0KCksdGhpcy50byhkLGMuZG90c1NwZWVkKX0sdGhpcykpO2ZvcihiIGluIHRoaXMuX292ZXJyaWRlcyl0aGlzLl9jb3JlW2JdPWEucHJveHkodGhpc1tiXSx0aGlzKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGIsYyxkO2ZvcihhIGluIHRoaXMuX2hhbmRsZXJzKXRoaXMuJGVsZW1lbnQub2ZmKGEsdGhpcy5faGFuZGxlcnNbYV0pO2ZvcihiIGluIHRoaXMuX2NvbnRyb2xzKVwiJHJlbGF0aXZlXCI9PT1iJiZzZXR0aW5ncy5uYXZDb250YWluZXI/dGhpcy5fY29udHJvbHNbYl0uaHRtbChcIlwiKTp0aGlzLl9jb250cm9sc1tiXS5yZW1vdmUoKTtmb3IoZCBpbiB0aGlzLm92ZXJpZGVzKXRoaXMuX2NvcmVbZF09dGhpcy5fb3ZlcnJpZGVzW2RdO2ZvcihjIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKVwiZnVuY3Rpb25cIiE9dHlwZW9mIHRoaXNbY10mJih0aGlzW2NdPW51bGwpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZD10aGlzLl9jb3JlLmNsb25lcygpLmxlbmd0aC8yLGU9ZCt0aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoLGY9dGhpcy5fY29yZS5tYXhpbXVtKCEwKSxnPXRoaXMuX2NvcmUuc2V0dGluZ3MsaD1nLmNlbnRlcnx8Zy5hdXRvV2lkdGh8fGcuZG90c0RhdGE/MTpnLmRvdHNFYWNofHxnLml0ZW1zO2lmKFwicGFnZVwiIT09Zy5zbGlkZUJ5JiYoZy5zbGlkZUJ5PU1hdGgubWluKGcuc2xpZGVCeSxnLml0ZW1zKSksZy5kb3RzfHxcInBhZ2VcIj09Zy5zbGlkZUJ5KWZvcih0aGlzLl9wYWdlcz1bXSxhPWQsYj0wLGM9MDtlPmE7YSsrKXtpZihiPj1ofHwwPT09Yil7aWYodGhpcy5fcGFnZXMucHVzaCh7c3RhcnQ6TWF0aC5taW4oZixhLWQpLGVuZDphLWQraC0xfSksTWF0aC5taW4oZixhLWQpPT09ZilicmVhaztiPTAsKytjfWIrPXRoaXMuX2NvcmUubWVyZ2Vycyh0aGlzLl9jb3JlLnJlbGF0aXZlKGEpKX19LGUucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXt2YXIgYixjPXRoaXMuX2NvcmUuc2V0dGluZ3MsZD10aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoPD1jLml0ZW1zLGU9dGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSksZj1jLmxvb3B8fGMucmV3aW5kO3RoaXMuX2NvbnRyb2xzLiRyZWxhdGl2ZS50b2dnbGVDbGFzcyhcImRpc2FibGVkXCIsIWMubmF2fHxkKSxjLm5hdiYmKHRoaXMuX2NvbnRyb2xzLiRwcmV2aW91cy50b2dnbGVDbGFzcyhcImRpc2FibGVkXCIsIWYmJmU8PXRoaXMuX2NvcmUubWluaW11bSghMCkpLHRoaXMuX2NvbnRyb2xzLiRuZXh0LnRvZ2dsZUNsYXNzKFwiZGlzYWJsZWRcIiwhZiYmZT49dGhpcy5fY29yZS5tYXhpbXVtKCEwKSkpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS50b2dnbGVDbGFzcyhcImRpc2FibGVkXCIsIWMuZG90c3x8ZCksYy5kb3RzJiYoYj10aGlzLl9wYWdlcy5sZW5ndGgtdGhpcy5fY29udHJvbHMuJGFic29sdXRlLmNoaWxkcmVuKCkubGVuZ3RoLGMuZG90c0RhdGEmJjAhPT1iP3RoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5odG1sKHRoaXMuX3RlbXBsYXRlcy5qb2luKFwiXCIpKTpiPjA/dGhpcy5fY29udHJvbHMuJGFic29sdXRlLmFwcGVuZChuZXcgQXJyYXkoYisxKS5qb2luKHRoaXMuX3RlbXBsYXRlc1swXSkpOjA+YiYmdGhpcy5fY29udHJvbHMuJGFic29sdXRlLmNoaWxkcmVuKCkuc2xpY2UoYikucmVtb3ZlKCksdGhpcy5fY29udHJvbHMuJGFic29sdXRlLmZpbmQoXCIuYWN0aXZlXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLmVxKGEuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSx0aGlzLl9wYWdlcykpLmFkZENsYXNzKFwiYWN0aXZlXCIpKX0sZS5wcm90b3R5cGUub25UcmlnZ2VyPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuX2NvcmUuc2V0dGluZ3M7Yi5wYWdlPXtpbmRleDphLmluQXJyYXkodGhpcy5jdXJyZW50KCksdGhpcy5fcGFnZXMpLGNvdW50OnRoaXMuX3BhZ2VzLmxlbmd0aCxzaXplOmMmJihjLmNlbnRlcnx8Yy5hdXRvV2lkdGh8fGMuZG90c0RhdGE/MTpjLmRvdHNFYWNofHxjLml0ZW1zKX19LGUucHJvdG90eXBlLmN1cnJlbnQ9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKTtyZXR1cm4gYS5ncmVwKHRoaXMuX3BhZ2VzLGEucHJveHkoZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5zdGFydDw9YiYmYS5lbmQ+PWJ9LHRoaXMpKS5wb3AoKX0sZS5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24oYil7dmFyIGMsZCxlPXRoaXMuX2NvcmUuc2V0dGluZ3M7cmV0dXJuXCJwYWdlXCI9PWUuc2xpZGVCeT8oYz1hLmluQXJyYXkodGhpcy5jdXJyZW50KCksdGhpcy5fcGFnZXMpLGQ9dGhpcy5fcGFnZXMubGVuZ3RoLGI/KytjOi0tYyxjPXRoaXMuX3BhZ2VzWyhjJWQrZCklZF0uc3RhcnQpOihjPXRoaXMuX2NvcmUucmVsYXRpdmUodGhpcy5fY29yZS5jdXJyZW50KCkpLGQ9dGhpcy5fY29yZS5pdGVtcygpLmxlbmd0aCxiP2MrPWUuc2xpZGVCeTpjLT1lLnNsaWRlQnkpLGN9LGUucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oYil7YS5wcm94eSh0aGlzLl9vdmVycmlkZXMudG8sdGhpcy5fY29yZSkodGhpcy5nZXRQb3NpdGlvbighMCksYil9LGUucHJvdG90eXBlLnByZXY9ZnVuY3Rpb24oYil7YS5wcm94eSh0aGlzLl9vdmVycmlkZXMudG8sdGhpcy5fY29yZSkodGhpcy5nZXRQb3NpdGlvbighMSksYil9LGUucHJvdG90eXBlLnRvPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZTshZCYmdGhpcy5fcGFnZXMubGVuZ3RoPyhlPXRoaXMuX3BhZ2VzLmxlbmd0aCxhLnByb3h5KHRoaXMuX292ZXJyaWRlcy50byx0aGlzLl9jb3JlKSh0aGlzLl9wYWdlc1soYiVlK2UpJWVdLnN0YXJ0LGMpKTphLnByb3h5KHRoaXMuX292ZXJyaWRlcy50byx0aGlzLl9jb3JlKShiLGMpfSxhLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuTmF2aWdhdGlvbj1lfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyxkKXtcInVzZSBzdHJpY3RcIjt2YXIgZT1mdW5jdGlvbihjKXt0aGlzLl9jb3JlPWMsdGhpcy5faGFzaGVzPXt9LHRoaXMuJGVsZW1lbnQ9dGhpcy5fY29yZS4kZWxlbWVudCx0aGlzLl9oYW5kbGVycz17XCJpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGMpe2MubmFtZXNwYWNlJiZcIlVSTEhhc2hcIj09PXRoaXMuX2NvcmUuc2V0dGluZ3Muc3RhcnRQb3NpdGlvbiYmYShiKS50cmlnZ2VyKFwiaGFzaGNoYW5nZS5vd2wubmF2aWdhdGlvblwiKX0sdGhpcyksXCJwcmVwYXJlZC5vd2wuY2Fyb3VzZWxcIjphLnByb3h5KGZ1bmN0aW9uKGIpe2lmKGIubmFtZXNwYWNlKXt2YXIgYz1hKGIuY29udGVudCkuZmluZChcIltkYXRhLWhhc2hdXCIpLmFkZEJhY2soXCJbZGF0YS1oYXNoXVwiKS5hdHRyKFwiZGF0YS1oYXNoXCIpO2lmKCFjKXJldHVybjt0aGlzLl9oYXNoZXNbY109Yi5jb250ZW50fX0sdGhpcyksXCJjaGFuZ2VkLm93bC5jYXJvdXNlbFwiOmEucHJveHkoZnVuY3Rpb24oYyl7aWYoYy5uYW1lc3BhY2UmJlwicG9zaXRpb25cIj09PWMucHJvcGVydHkubmFtZSl7dmFyIGQ9dGhpcy5fY29yZS5pdGVtcyh0aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSksZT1hLm1hcCh0aGlzLl9oYXNoZXMsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWQ/YjpudWxsfSkuam9pbigpO2lmKCFlfHxiLmxvY2F0aW9uLmhhc2guc2xpY2UoMSk9PT1lKXJldHVybjtiLmxvY2F0aW9uLmhhc2g9ZX19LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpLGEoYikub24oXCJoYXNoY2hhbmdlLm93bC5uYXZpZ2F0aW9uXCIsYS5wcm94eShmdW5jdGlvbihhKXt2YXIgYz1iLmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpLGU9dGhpcy5fY29yZS4kc3RhZ2UuY2hpbGRyZW4oKSxmPXRoaXMuX2hhc2hlc1tjXSYmZS5pbmRleCh0aGlzLl9oYXNoZXNbY10pO2YhPT1kJiZmIT09dGhpcy5fY29yZS5jdXJyZW50KCkmJnRoaXMuX2NvcmUudG8odGhpcy5fY29yZS5yZWxhdGl2ZShmKSwhMSwhMCl9LHRoaXMpKX07ZS5EZWZhdWx0cz17VVJMaGFzaExpc3RlbmVyOiExfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGMsZDthKGIpLm9mZihcImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb25cIik7Zm9yKGMgaW4gdGhpcy5faGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYyx0aGlzLl9oYW5kbGVyc1tjXSk7Zm9yKGQgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpXCJmdW5jdGlvblwiIT10eXBlb2YgdGhpc1tkXSYmKHRoaXNbZF09bnVsbCl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5IYXNoPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGUoYixjKXt2YXIgZT0hMSxmPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKTtyZXR1cm4gYS5lYWNoKChiK1wiIFwiK2guam9pbihmK1wiIFwiKStmKS5zcGxpdChcIiBcIiksZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ1tiXSE9PWQ/KGU9Yz9iOiEwLCExKTp2b2lkIDB9KSxlfWZ1bmN0aW9uIGYoYSl7cmV0dXJuIGUoYSwhMCl9dmFyIGc9YShcIjxzdXBwb3J0PlwiKS5nZXQoMCkuc3R5bGUsaD1cIldlYmtpdCBNb3ogTyBtc1wiLnNwbGl0KFwiIFwiKSxpPXt0cmFuc2l0aW9uOntlbmQ6e1dlYmtpdFRyYW5zaXRpb246XCJ3ZWJraXRUcmFuc2l0aW9uRW5kXCIsTW96VHJhbnNpdGlvbjpcInRyYW5zaXRpb25lbmRcIixPVHJhbnNpdGlvbjpcIm9UcmFuc2l0aW9uRW5kXCIsdHJhbnNpdGlvbjpcInRyYW5zaXRpb25lbmRcIn19LGFuaW1hdGlvbjp7ZW5kOntXZWJraXRBbmltYXRpb246XCJ3ZWJraXRBbmltYXRpb25FbmRcIixNb3pBbmltYXRpb246XCJhbmltYXRpb25lbmRcIixPQW5pbWF0aW9uOlwib0FuaW1hdGlvbkVuZFwiLGFuaW1hdGlvbjpcImFuaW1hdGlvbmVuZFwifX19LGo9e2Nzc3RyYW5zZm9ybXM6ZnVuY3Rpb24oKXtyZXR1cm4hIWUoXCJ0cmFuc2Zvcm1cIil9LGNzc3RyYW5zZm9ybXMzZDpmdW5jdGlvbigpe3JldHVybiEhZShcInBlcnNwZWN0aXZlXCIpfSxjc3N0cmFuc2l0aW9uczpmdW5jdGlvbigpe3JldHVybiEhZShcInRyYW5zaXRpb25cIil9LGNzc2FuaW1hdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4hIWUoXCJhbmltYXRpb25cIil9fTtqLmNzc3RyYW5zaXRpb25zKCkmJihhLnN1cHBvcnQudHJhbnNpdGlvbj1uZXcgU3RyaW5nKGYoXCJ0cmFuc2l0aW9uXCIpKSxhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQ9aS50cmFuc2l0aW9uLmVuZFthLnN1cHBvcnQudHJhbnNpdGlvbl0pLGouY3NzYW5pbWF0aW9ucygpJiYoYS5zdXBwb3J0LmFuaW1hdGlvbj1uZXcgU3RyaW5nKGYoXCJhbmltYXRpb25cIikpLGEuc3VwcG9ydC5hbmltYXRpb24uZW5kPWkuYW5pbWF0aW9uLmVuZFthLnN1cHBvcnQuYW5pbWF0aW9uXSksai5jc3N0cmFuc2Zvcm1zKCkmJihhLnN1cHBvcnQudHJhbnNmb3JtPW5ldyBTdHJpbmcoZihcInRyYW5zZm9ybVwiKSksYS5zdXBwb3J0LnRyYW5zZm9ybTNkPWouY3NzdHJhbnNmb3JtczNkKCkpfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KTsiLCIvKlxyXG4gICAgIF8gXyAgICAgIF8gICAgICAgX1xyXG4gX19ffCAoXykgX19ffCB8IF9fICAoXylfX19cclxuLyBfX3wgfCB8LyBfX3wgfC8gLyAgfCAvIF9ffFxyXG5cXF9fIFxcIHwgfCAoX198ICAgPCBfIHwgXFxfXyBcXFxyXG58X19fL198X3xcXF9fX3xffFxcXyhfKS8gfF9fXy9cclxuICAgICAgICAgICAgICAgICAgIHxfXy9cclxuXHJcbiBWZXJzaW9uOiAxLjkuMFxyXG4gIEF1dGhvcjogS2VuIFdoZWVsZXJcclxuIFdlYnNpdGU6IGh0dHA6Ly9rZW53aGVlbGVyLmdpdGh1Yi5pb1xyXG4gICAgRG9jczogaHR0cDovL2tlbndoZWVsZXIuZ2l0aHViLmlvL3NsaWNrXHJcbiAgICBSZXBvOiBodHRwOi8vZ2l0aHViLmNvbS9rZW53aGVlbGVyL3NsaWNrXHJcbiAgSXNzdWVzOiBodHRwOi8vZ2l0aHViLmNvbS9rZW53aGVlbGVyL3NsaWNrL2lzc3Vlc1xyXG5cclxuICovXHJcbihmdW5jdGlvbihpKXtcInVzZSBzdHJpY3RcIjtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImpxdWVyeVwiXSxpKTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1pKHJlcXVpcmUoXCJqcXVlcnlcIikpOmkoalF1ZXJ5KX0pKGZ1bmN0aW9uKGkpe1widXNlIHN0cmljdFwiO3ZhciBlPXdpbmRvdy5TbGlja3x8e307ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSxvKXt2YXIgcyxuPXRoaXM7bi5kZWZhdWx0cz17YWNjZXNzaWJpbGl0eTohMCxhZGFwdGl2ZUhlaWdodDohMSxhcHBlbmRBcnJvd3M6aShlKSxhcHBlbmREb3RzOmkoZSksYXJyb3dzOiEwLGFzTmF2Rm9yOm51bGwscHJldkFycm93Oic8YnV0dG9uIGNsYXNzPVwic2xpY2stcHJldlwiIGFyaWEtbGFiZWw9XCJQcmV2aW91c1wiIHR5cGU9XCJidXR0b25cIj5QcmV2aW91czwvYnV0dG9uPicsbmV4dEFycm93Oic8YnV0dG9uIGNsYXNzPVwic2xpY2stbmV4dFwiIGFyaWEtbGFiZWw9XCJOZXh0XCIgdHlwZT1cImJ1dHRvblwiPk5leHQ8L2J1dHRvbj4nLGF1dG9wbGF5OiExLGF1dG9wbGF5U3BlZWQ6M2UzLGNlbnRlck1vZGU6ITEsY2VudGVyUGFkZGluZzpcIjUwcHhcIixjc3NFYXNlOlwiZWFzZVwiLGN1c3RvbVBhZ2luZzpmdW5jdGlvbihlLHQpe3JldHVybiBpKCc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAvPicpLnRleHQodCsxKX0sZG90czohMSxkb3RzQ2xhc3M6XCJzbGljay1kb3RzXCIsZHJhZ2dhYmxlOiEwLGVhc2luZzpcImxpbmVhclwiLGVkZ2VGcmljdGlvbjouMzUsZmFkZTohMSxmb2N1c09uU2VsZWN0OiExLGZvY3VzT25DaGFuZ2U6ITEsaW5maW5pdGU6ITAsaW5pdGlhbFNsaWRlOjAsbGF6eUxvYWQ6XCJvbmRlbWFuZFwiLG1vYmlsZUZpcnN0OiExLHBhdXNlT25Ib3ZlcjohMCxwYXVzZU9uRm9jdXM6ITAscGF1c2VPbkRvdHNIb3ZlcjohMSxyZXNwb25kVG86XCJ3aW5kb3dcIixyZXNwb25zaXZlOm51bGwscm93czoxLHJ0bDohMSxzbGlkZTpcIlwiLHNsaWRlc1BlclJvdzoxLHNsaWRlc1RvU2hvdzoxLHNsaWRlc1RvU2Nyb2xsOjEsc3BlZWQ6NTAwLHN3aXBlOiEwLHN3aXBlVG9TbGlkZTohMSx0b3VjaE1vdmU6ITAsdG91Y2hUaHJlc2hvbGQ6NSx1c2VDU1M6ITAsdXNlVHJhbnNmb3JtOiEwLHZhcmlhYmxlV2lkdGg6ITEsdmVydGljYWw6ITEsdmVydGljYWxTd2lwaW5nOiExLHdhaXRGb3JBbmltYXRlOiEwLHpJbmRleDoxZTN9LG4uaW5pdGlhbHM9e2FuaW1hdGluZzohMSxkcmFnZ2luZzohMSxhdXRvUGxheVRpbWVyOm51bGwsY3VycmVudERpcmVjdGlvbjowLGN1cnJlbnRMZWZ0Om51bGwsY3VycmVudFNsaWRlOjAsZGlyZWN0aW9uOjEsJGRvdHM6bnVsbCxsaXN0V2lkdGg6bnVsbCxsaXN0SGVpZ2h0Om51bGwsbG9hZEluZGV4OjAsJG5leHRBcnJvdzpudWxsLCRwcmV2QXJyb3c6bnVsbCxzY3JvbGxpbmc6ITEsc2xpZGVDb3VudDpudWxsLHNsaWRlV2lkdGg6bnVsbCwkc2xpZGVUcmFjazpudWxsLCRzbGlkZXM6bnVsbCxzbGlkaW5nOiExLHNsaWRlT2Zmc2V0OjAsc3dpcGVMZWZ0Om51bGwsc3dpcGluZzohMSwkbGlzdDpudWxsLHRvdWNoT2JqZWN0Ont9LHRyYW5zZm9ybXNFbmFibGVkOiExLHVuc2xpY2tlZDohMX0saS5leHRlbmQobixuLmluaXRpYWxzKSxuLmFjdGl2ZUJyZWFrcG9pbnQ9bnVsbCxuLmFuaW1UeXBlPW51bGwsbi5hbmltUHJvcD1udWxsLG4uYnJlYWtwb2ludHM9W10sbi5icmVha3BvaW50U2V0dGluZ3M9W10sbi5jc3NUcmFuc2l0aW9ucz0hMSxuLmZvY3Vzc2VkPSExLG4uaW50ZXJydXB0ZWQ9ITEsbi5oaWRkZW49XCJoaWRkZW5cIixuLnBhdXNlZD0hMCxuLnBvc2l0aW9uUHJvcD1udWxsLG4ucmVzcG9uZFRvPW51bGwsbi5yb3dDb3VudD0xLG4uc2hvdWxkQ2xpY2s9ITAsbi4kc2xpZGVyPWkoZSksbi4kc2xpZGVzQ2FjaGU9bnVsbCxuLnRyYW5zZm9ybVR5cGU9bnVsbCxuLnRyYW5zaXRpb25UeXBlPW51bGwsbi52aXNpYmlsaXR5Q2hhbmdlPVwidmlzaWJpbGl0eWNoYW5nZVwiLG4ud2luZG93V2lkdGg9MCxuLndpbmRvd1RpbWVyPW51bGwscz1pKGUpLmRhdGEoXCJzbGlja1wiKXx8e30sbi5vcHRpb25zPWkuZXh0ZW5kKHt9LG4uZGVmYXVsdHMsbyxzKSxuLmN1cnJlbnRTbGlkZT1uLm9wdGlvbnMuaW5pdGlhbFNsaWRlLG4ub3JpZ2luYWxTZXR0aW5ncz1uLm9wdGlvbnMsXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50Lm1vekhpZGRlbj8obi5oaWRkZW49XCJtb3pIaWRkZW5cIixuLnZpc2liaWxpdHlDaGFuZ2U9XCJtb3p2aXNpYmlsaXR5Y2hhbmdlXCIpOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBkb2N1bWVudC53ZWJraXRIaWRkZW4mJihuLmhpZGRlbj1cIndlYmtpdEhpZGRlblwiLG4udmlzaWJpbGl0eUNoYW5nZT1cIndlYmtpdHZpc2liaWxpdHljaGFuZ2VcIiksbi5hdXRvUGxheT1pLnByb3h5KG4uYXV0b1BsYXksbiksbi5hdXRvUGxheUNsZWFyPWkucHJveHkobi5hdXRvUGxheUNsZWFyLG4pLG4uYXV0b1BsYXlJdGVyYXRvcj1pLnByb3h5KG4uYXV0b1BsYXlJdGVyYXRvcixuKSxuLmNoYW5nZVNsaWRlPWkucHJveHkobi5jaGFuZ2VTbGlkZSxuKSxuLmNsaWNrSGFuZGxlcj1pLnByb3h5KG4uY2xpY2tIYW5kbGVyLG4pLG4uc2VsZWN0SGFuZGxlcj1pLnByb3h5KG4uc2VsZWN0SGFuZGxlcixuKSxuLnNldFBvc2l0aW9uPWkucHJveHkobi5zZXRQb3NpdGlvbixuKSxuLnN3aXBlSGFuZGxlcj1pLnByb3h5KG4uc3dpcGVIYW5kbGVyLG4pLG4uZHJhZ0hhbmRsZXI9aS5wcm94eShuLmRyYWdIYW5kbGVyLG4pLG4ua2V5SGFuZGxlcj1pLnByb3h5KG4ua2V5SGFuZGxlcixuKSxuLmluc3RhbmNlVWlkPXQrKyxuLmh0bWxFeHByPS9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKikkLyxuLnJlZ2lzdGVyQnJlYWtwb2ludHMoKSxuLmluaXQoITApfXZhciB0PTA7cmV0dXJuIGV9KCksZS5wcm90b3R5cGUuYWN0aXZhdGVBREE9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCIwXCJ9KX0sZS5wcm90b3R5cGUuYWRkU2xpZGU9ZS5wcm90b3R5cGUuc2xpY2tBZGQ9ZnVuY3Rpb24oZSx0LG8pe3ZhciBzPXRoaXM7aWYoXCJib29sZWFuXCI9PXR5cGVvZiB0KW89dCx0PW51bGw7ZWxzZSBpZih0PDB8fHQ+PXMuc2xpZGVDb3VudClyZXR1cm4hMTtzLnVubG9hZCgpLFwibnVtYmVyXCI9PXR5cGVvZiB0PzA9PT10JiYwPT09cy4kc2xpZGVzLmxlbmd0aD9pKGUpLmFwcGVuZFRvKHMuJHNsaWRlVHJhY2spOm8/aShlKS5pbnNlcnRCZWZvcmUocy4kc2xpZGVzLmVxKHQpKTppKGUpLmluc2VydEFmdGVyKHMuJHNsaWRlcy5lcSh0KSk6bz09PSEwP2koZSkucHJlcGVuZFRvKHMuJHNsaWRlVHJhY2spOmkoZSkuYXBwZW5kVG8ocy4kc2xpZGVUcmFjaykscy4kc2xpZGVzPXMuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKSxzLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCkscy4kc2xpZGVUcmFjay5hcHBlbmQocy4kc2xpZGVzKSxzLiRzbGlkZXMuZWFjaChmdW5jdGlvbihlLHQpe2kodCkuYXR0cihcImRhdGEtc2xpY2staW5kZXhcIixlKX0pLHMuJHNsaWRlc0NhY2hlPXMuJHNsaWRlcyxzLnJlaW5pdCgpfSxlLnByb3RvdHlwZS5hbmltYXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpZigxPT09aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmaS5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0PT09ITAmJmkub3B0aW9ucy52ZXJ0aWNhbD09PSExKXt2YXIgZT1pLiRzbGlkZXMuZXEoaS5jdXJyZW50U2xpZGUpLm91dGVySGVpZ2h0KCEwKTtpLiRsaXN0LmFuaW1hdGUoe2hlaWdodDplfSxpLm9wdGlvbnMuc3BlZWQpfX0sZS5wcm90b3R5cGUuYW5pbWF0ZVNsaWRlPWZ1bmN0aW9uKGUsdCl7dmFyIG89e30scz10aGlzO3MuYW5pbWF0ZUhlaWdodCgpLHMub3B0aW9ucy5ydGw9PT0hMCYmcy5vcHRpb25zLnZlcnRpY2FsPT09ITEmJihlPS1lKSxzLnRyYW5zZm9ybXNFbmFibGVkPT09ITE/cy5vcHRpb25zLnZlcnRpY2FsPT09ITE/cy4kc2xpZGVUcmFjay5hbmltYXRlKHtsZWZ0OmV9LHMub3B0aW9ucy5zcGVlZCxzLm9wdGlvbnMuZWFzaW5nLHQpOnMuJHNsaWRlVHJhY2suYW5pbWF0ZSh7dG9wOmV9LHMub3B0aW9ucy5zcGVlZCxzLm9wdGlvbnMuZWFzaW5nLHQpOnMuY3NzVHJhbnNpdGlvbnM9PT0hMT8ocy5vcHRpb25zLnJ0bD09PSEwJiYocy5jdXJyZW50TGVmdD0tcy5jdXJyZW50TGVmdCksaSh7YW5pbVN0YXJ0OnMuY3VycmVudExlZnR9KS5hbmltYXRlKHthbmltU3RhcnQ6ZX0se2R1cmF0aW9uOnMub3B0aW9ucy5zcGVlZCxlYXNpbmc6cy5vcHRpb25zLmVhc2luZyxzdGVwOmZ1bmN0aW9uKGkpe2k9TWF0aC5jZWlsKGkpLHMub3B0aW9ucy52ZXJ0aWNhbD09PSExPyhvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlKFwiK2krXCJweCwgMHB4KVwiLHMuJHNsaWRlVHJhY2suY3NzKG8pKToob1tzLmFuaW1UeXBlXT1cInRyYW5zbGF0ZSgwcHgsXCIraStcInB4KVwiLHMuJHNsaWRlVHJhY2suY3NzKG8pKX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0JiZ0LmNhbGwoKX19KSk6KHMuYXBwbHlUcmFuc2l0aW9uKCksZT1NYXRoLmNlaWwoZSkscy5vcHRpb25zLnZlcnRpY2FsPT09ITE/b1tzLmFuaW1UeXBlXT1cInRyYW5zbGF0ZTNkKFwiK2UrXCJweCwgMHB4LCAwcHgpXCI6b1tzLmFuaW1UeXBlXT1cInRyYW5zbGF0ZTNkKDBweCxcIitlK1wicHgsIDBweClcIixzLiRzbGlkZVRyYWNrLmNzcyhvKSx0JiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5kaXNhYmxlVHJhbnNpdGlvbigpLHQuY2FsbCgpfSxzLm9wdGlvbnMuc3BlZWQpKX0sZS5wcm90b3R5cGUuZ2V0TmF2VGFyZ2V0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUub3B0aW9ucy5hc05hdkZvcjtyZXR1cm4gdCYmbnVsbCE9PXQmJih0PWkodCkubm90KGUuJHNsaWRlcikpLHR9LGUucHJvdG90eXBlLmFzTmF2Rm9yPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbz10LmdldE5hdlRhcmdldCgpO251bGwhPT1vJiZcIm9iamVjdFwiPT10eXBlb2YgbyYmby5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9aSh0aGlzKS5zbGljayhcImdldFNsaWNrXCIpO3QudW5zbGlja2VkfHx0LnNsaWRlSGFuZGxlcihlLCEwKX0pfSxlLnByb3RvdHlwZS5hcHBseVRyYW5zaXRpb249ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcyx0PXt9O2Uub3B0aW9ucy5mYWRlPT09ITE/dFtlLnRyYW5zaXRpb25UeXBlXT1lLnRyYW5zZm9ybVR5cGUrXCIgXCIrZS5vcHRpb25zLnNwZWVkK1wibXMgXCIrZS5vcHRpb25zLmNzc0Vhc2U6dFtlLnRyYW5zaXRpb25UeXBlXT1cIm9wYWNpdHkgXCIrZS5vcHRpb25zLnNwZWVkK1wibXMgXCIrZS5vcHRpb25zLmNzc0Vhc2UsZS5vcHRpb25zLmZhZGU9PT0hMT9lLiRzbGlkZVRyYWNrLmNzcyh0KTplLiRzbGlkZXMuZXEoaSkuY3NzKHQpfSxlLnByb3RvdHlwZS5hdXRvUGxheT1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5hdXRvUGxheUNsZWFyKCksaS5zbGlkZUNvdW50Pmkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihpLmF1dG9QbGF5VGltZXI9c2V0SW50ZXJ2YWwoaS5hdXRvUGxheUl0ZXJhdG9yLGkub3B0aW9ucy5hdXRvcGxheVNwZWVkKSl9LGUucHJvdG90eXBlLmF1dG9QbGF5Q2xlYXI9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXlUaW1lciYmY2xlYXJJbnRlcnZhbChpLmF1dG9QbGF5VGltZXIpfSxlLnByb3RvdHlwZS5hdXRvUGxheUl0ZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPWkuY3VycmVudFNsaWRlK2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDtpLnBhdXNlZHx8aS5pbnRlcnJ1cHRlZHx8aS5mb2N1c3NlZHx8KGkub3B0aW9ucy5pbmZpbml0ZT09PSExJiYoMT09PWkuZGlyZWN0aW9uJiZpLmN1cnJlbnRTbGlkZSsxPT09aS5zbGlkZUNvdW50LTE/aS5kaXJlY3Rpb249MDowPT09aS5kaXJlY3Rpb24mJihlPWkuY3VycmVudFNsaWRlLWkub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxpLmN1cnJlbnRTbGlkZS0xPT09MCYmKGkuZGlyZWN0aW9uPTEpKSksaS5zbGlkZUhhbmRsZXIoZSkpfSxlLnByb3RvdHlwZS5idWlsZEFycm93cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5vcHRpb25zLmFycm93cz09PSEwJiYoZS4kcHJldkFycm93PWkoZS5vcHRpb25zLnByZXZBcnJvdykuYWRkQ2xhc3MoXCJzbGljay1hcnJvd1wiKSxlLiRuZXh0QXJyb3c9aShlLm9wdGlvbnMubmV4dEFycm93KS5hZGRDbGFzcyhcInNsaWNrLWFycm93XCIpLGUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93PyhlLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1oaWRkZW5cIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuIHRhYmluZGV4XCIpLGUuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXhcIiksZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5wcmV2QXJyb3cpJiZlLiRwcmV2QXJyb3cucHJlcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLGUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMubmV4dEFycm93KSYmZS4kbmV4dEFycm93LmFwcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLGUub3B0aW9ucy5pbmZpbml0ZSE9PSEwJiZlLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSk6ZS4kcHJldkFycm93LmFkZChlLiRuZXh0QXJyb3cpLmFkZENsYXNzKFwic2xpY2staGlkZGVuXCIpLmF0dHIoe1wiYXJpYS1kaXNhYmxlZFwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pKX0sZS5wcm90b3R5cGUuYnVpbGREb3RzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXM7aWYoby5vcHRpb25zLmRvdHM9PT0hMCYmby5zbGlkZUNvdW50Pm8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpe2ZvcihvLiRzbGlkZXIuYWRkQ2xhc3MoXCJzbGljay1kb3R0ZWRcIiksdD1pKFwiPHVsIC8+XCIpLmFkZENsYXNzKG8ub3B0aW9ucy5kb3RzQ2xhc3MpLGU9MDtlPD1vLmdldERvdENvdW50KCk7ZSs9MSl0LmFwcGVuZChpKFwiPGxpIC8+XCIpLmFwcGVuZChvLm9wdGlvbnMuY3VzdG9tUGFnaW5nLmNhbGwodGhpcyxvLGUpKSk7by4kZG90cz10LmFwcGVuZFRvKG8ub3B0aW9ucy5hcHBlbmREb3RzKSxvLiRkb3RzLmZpbmQoXCJsaVwiKS5maXJzdCgpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpfX0sZS5wcm90b3R5cGUuYnVpbGRPdXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuJHNsaWRlcz1lLiRzbGlkZXIuY2hpbGRyZW4oZS5vcHRpb25zLnNsaWRlK1wiOm5vdCguc2xpY2stY2xvbmVkKVwiKS5hZGRDbGFzcyhcInNsaWNrLXNsaWRlXCIpLGUuc2xpZGVDb3VudD1lLiRzbGlkZXMubGVuZ3RoLGUuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGUsdCl7aSh0KS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLGUpLmRhdGEoXCJvcmlnaW5hbFN0eWxpbmdcIixpKHQpLmF0dHIoXCJzdHlsZVwiKXx8XCJcIil9KSxlLiRzbGlkZXIuYWRkQ2xhc3MoXCJzbGljay1zbGlkZXJcIiksZS4kc2xpZGVUcmFjaz0wPT09ZS5zbGlkZUNvdW50P2koJzxkaXYgY2xhc3M9XCJzbGljay10cmFja1wiLz4nKS5hcHBlbmRUbyhlLiRzbGlkZXIpOmUuJHNsaWRlcy53cmFwQWxsKCc8ZGl2IGNsYXNzPVwic2xpY2stdHJhY2tcIi8+JykucGFyZW50KCksZS4kbGlzdD1lLiRzbGlkZVRyYWNrLndyYXAoJzxkaXYgY2xhc3M9XCJzbGljay1saXN0XCIvPicpLnBhcmVudCgpLGUuJHNsaWRlVHJhY2suY3NzKFwib3BhY2l0eVwiLDApLGUub3B0aW9ucy5jZW50ZXJNb2RlIT09ITAmJmUub3B0aW9ucy5zd2lwZVRvU2xpZGUhPT0hMHx8KGUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbD0xKSxpKFwiaW1nW2RhdGEtbGF6eV1cIixlLiRzbGlkZXIpLm5vdChcIltzcmNdXCIpLmFkZENsYXNzKFwic2xpY2stbG9hZGluZ1wiKSxlLnNldHVwSW5maW5pdGUoKSxlLmJ1aWxkQXJyb3dzKCksZS5idWlsZERvdHMoKSxlLnVwZGF0ZURvdHMoKSxlLnNldFNsaWRlQ2xhc3NlcyhcIm51bWJlclwiPT10eXBlb2YgZS5jdXJyZW50U2xpZGU/ZS5jdXJyZW50U2xpZGU6MCksZS5vcHRpb25zLmRyYWdnYWJsZT09PSEwJiZlLiRsaXN0LmFkZENsYXNzKFwiZHJhZ2dhYmxlXCIpfSxlLnByb3RvdHlwZS5idWlsZFJvd3M9ZnVuY3Rpb24oKXt2YXIgaSxlLHQsbyxzLG4scixsPXRoaXM7aWYobz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbj1sLiRzbGlkZXIuY2hpbGRyZW4oKSxsLm9wdGlvbnMucm93cz4wKXtmb3Iocj1sLm9wdGlvbnMuc2xpZGVzUGVyUm93Kmwub3B0aW9ucy5yb3dzLHM9TWF0aC5jZWlsKG4ubGVuZ3RoL3IpLGk9MDtpPHM7aSsrKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2ZvcihlPTA7ZTxsLm9wdGlvbnMucm93cztlKyspe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zm9yKHQ9MDt0PGwub3B0aW9ucy5zbGlkZXNQZXJSb3c7dCsrKXt2YXIgYz1pKnIrKGUqbC5vcHRpb25zLnNsaWRlc1BlclJvdyt0KTtuLmdldChjKSYmYS5hcHBlbmRDaGlsZChuLmdldChjKSl9ZC5hcHBlbmRDaGlsZChhKX1vLmFwcGVuZENoaWxkKGQpfWwuJHNsaWRlci5lbXB0eSgpLmFwcGVuZChvKSxsLiRzbGlkZXIuY2hpbGRyZW4oKS5jaGlsZHJlbigpLmNoaWxkcmVuKCkuY3NzKHt3aWR0aDoxMDAvbC5vcHRpb25zLnNsaWRlc1BlclJvdytcIiVcIixkaXNwbGF5OlwiaW5saW5lLWJsb2NrXCJ9KX19LGUucHJvdG90eXBlLmNoZWNrUmVzcG9uc2l2ZT1mdW5jdGlvbihlLHQpe3ZhciBvLHMsbixyPXRoaXMsbD0hMSxkPXIuJHNsaWRlci53aWR0aCgpLGE9d2luZG93LmlubmVyV2lkdGh8fGkod2luZG93KS53aWR0aCgpO2lmKFwid2luZG93XCI9PT1yLnJlc3BvbmRUbz9uPWE6XCJzbGlkZXJcIj09PXIucmVzcG9uZFRvP249ZDpcIm1pblwiPT09ci5yZXNwb25kVG8mJihuPU1hdGgubWluKGEsZCkpLHIub3B0aW9ucy5yZXNwb25zaXZlJiZyLm9wdGlvbnMucmVzcG9uc2l2ZS5sZW5ndGgmJm51bGwhPT1yLm9wdGlvbnMucmVzcG9uc2l2ZSl7cz1udWxsO2ZvcihvIGluIHIuYnJlYWtwb2ludHMpci5icmVha3BvaW50cy5oYXNPd25Qcm9wZXJ0eShvKSYmKHIub3JpZ2luYWxTZXR0aW5ncy5tb2JpbGVGaXJzdD09PSExP248ci5icmVha3BvaW50c1tvXSYmKHM9ci5icmVha3BvaW50c1tvXSk6bj5yLmJyZWFrcG9pbnRzW29dJiYocz1yLmJyZWFrcG9pbnRzW29dKSk7bnVsbCE9PXM/bnVsbCE9PXIuYWN0aXZlQnJlYWtwb2ludD8ocyE9PXIuYWN0aXZlQnJlYWtwb2ludHx8dCkmJihyLmFjdGl2ZUJyZWFrcG9pbnQ9cyxcInVuc2xpY2tcIj09PXIuYnJlYWtwb2ludFNldHRpbmdzW3NdP3IudW5zbGljayhzKTooci5vcHRpb25zPWkuZXh0ZW5kKHt9LHIub3JpZ2luYWxTZXR0aW5ncyxyLmJyZWFrcG9pbnRTZXR0aW5nc1tzXSksZT09PSEwJiYoci5jdXJyZW50U2xpZGU9ci5vcHRpb25zLmluaXRpYWxTbGlkZSksci5yZWZyZXNoKGUpKSxsPXMpOihyLmFjdGl2ZUJyZWFrcG9pbnQ9cyxcInVuc2xpY2tcIj09PXIuYnJlYWtwb2ludFNldHRpbmdzW3NdP3IudW5zbGljayhzKTooci5vcHRpb25zPWkuZXh0ZW5kKHt9LHIub3JpZ2luYWxTZXR0aW5ncyxyLmJyZWFrcG9pbnRTZXR0aW5nc1tzXSksZT09PSEwJiYoci5jdXJyZW50U2xpZGU9ci5vcHRpb25zLmluaXRpYWxTbGlkZSksci5yZWZyZXNoKGUpKSxsPXMpOm51bGwhPT1yLmFjdGl2ZUJyZWFrcG9pbnQmJihyLmFjdGl2ZUJyZWFrcG9pbnQ9bnVsbCxyLm9wdGlvbnM9ci5vcmlnaW5hbFNldHRpbmdzLGU9PT0hMCYmKHIuY3VycmVudFNsaWRlPXIub3B0aW9ucy5pbml0aWFsU2xpZGUpLHIucmVmcmVzaChlKSxsPXMpLGV8fGw9PT0hMXx8ci4kc2xpZGVyLnRyaWdnZXIoXCJicmVha3BvaW50XCIsW3IsbF0pfX0sZS5wcm90b3R5cGUuY2hhbmdlU2xpZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbyxzLG4scj10aGlzLGw9aShlLmN1cnJlbnRUYXJnZXQpO3N3aXRjaChsLmlzKFwiYVwiKSYmZS5wcmV2ZW50RGVmYXVsdCgpLGwuaXMoXCJsaVwiKXx8KGw9bC5jbG9zZXN0KFwibGlcIikpLG49ci5zbGlkZUNvdW50JXIub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCE9PTAsbz1uPzA6KHIuc2xpZGVDb3VudC1yLmN1cnJlbnRTbGlkZSklci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLGUuZGF0YS5tZXNzYWdlKXtjYXNlXCJwcmV2aW91c1wiOnM9MD09PW8/ci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOnIub3B0aW9ucy5zbGlkZXNUb1Nob3ctbyxyLnNsaWRlQ291bnQ+ci5vcHRpb25zLnNsaWRlc1RvU2hvdyYmci5zbGlkZUhhbmRsZXIoci5jdXJyZW50U2xpZGUtcywhMSx0KTticmVhaztjYXNlXCJuZXh0XCI6cz0wPT09bz9yLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6byxyLnNsaWRlQ291bnQ+ci5vcHRpb25zLnNsaWRlc1RvU2hvdyYmci5zbGlkZUhhbmRsZXIoci5jdXJyZW50U2xpZGUrcywhMSx0KTticmVhaztjYXNlXCJpbmRleFwiOnZhciBkPTA9PT1lLmRhdGEuaW5kZXg/MDplLmRhdGEuaW5kZXh8fGwuaW5kZXgoKSpyLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7ci5zbGlkZUhhbmRsZXIoci5jaGVja05hdmlnYWJsZShkKSwhMSx0KSxsLmNoaWxkcmVuKCkudHJpZ2dlcihcImZvY3VzXCIpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX0sZS5wcm90b3R5cGUuY2hlY2tOYXZpZ2FibGU9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvPXRoaXM7aWYoZT1vLmdldE5hdmlnYWJsZUluZGV4ZXMoKSx0PTAsaT5lW2UubGVuZ3RoLTFdKWk9ZVtlLmxlbmd0aC0xXTtlbHNlIGZvcih2YXIgcyBpbiBlKXtpZihpPGVbc10pe2k9dDticmVha310PWVbc119cmV0dXJuIGl9LGUucHJvdG90eXBlLmNsZWFuVXBFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2Uub3B0aW9ucy5kb3RzJiZudWxsIT09ZS4kZG90cyYmKGkoXCJsaVwiLGUuJGRvdHMpLm9mZihcImNsaWNrLnNsaWNrXCIsZS5jaGFuZ2VTbGlkZSkub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLm9mZihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKSxlLm9wdGlvbnMuYWNjZXNzaWJpbGl0eT09PSEwJiZlLiRkb3RzLm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSxlLiRzbGlkZXIub2ZmKFwiZm9jdXMuc2xpY2sgYmx1ci5zbGlja1wiKSxlLm9wdGlvbnMuYXJyb3dzPT09ITAmJmUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS4kcHJldkFycm93JiZlLiRwcmV2QXJyb3cub2ZmKFwiY2xpY2suc2xpY2tcIixlLmNoYW5nZVNsaWRlKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiLGUuY2hhbmdlU2xpZGUpLGUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITAmJihlLiRwcmV2QXJyb3cmJmUuJHByZXZBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSkpLGUuJGxpc3Qub2ZmKFwidG91Y2hzdGFydC5zbGljayBtb3VzZWRvd24uc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJ0b3VjaG1vdmUuc2xpY2sgbW91c2Vtb3ZlLnNsaWNrXCIsZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub2ZmKFwidG91Y2hlbmQuc2xpY2sgbW91c2V1cC5zbGlja1wiLGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9mZihcInRvdWNoY2FuY2VsLnNsaWNrIG1vdXNlbGVhdmUuc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vZmYoZS52aXNpYmlsaXR5Q2hhbmdlLGUudmlzaWJpbGl0eSksZS5jbGVhblVwU2xpZGVFdmVudHMoKSxlLm9wdGlvbnMuYWNjZXNzaWJpbGl0eT09PSEwJiZlLiRsaXN0Lm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpLGUub3B0aW9ucy5mb2N1c09uU2VsZWN0PT09ITAmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vZmYoXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9mZihcIm9yaWVudGF0aW9uY2hhbmdlLnNsaWNrLnNsaWNrLVwiK2UuaW5zdGFuY2VVaWQsZS5vcmllbnRhdGlvbkNoYW5nZSksaSh3aW5kb3cpLm9mZihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUucmVzaXplKSxpKFwiW2RyYWdnYWJsZSE9dHJ1ZV1cIixlLiRzbGlkZVRyYWNrKS5vZmYoXCJkcmFnc3RhcnRcIixlLnByZXZlbnREZWZhdWx0KSxpKHdpbmRvdykub2ZmKFwibG9hZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pfSxlLnByb3RvdHlwZS5jbGVhblVwU2xpZGVFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuJGxpc3Qub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLGUuJGxpc3Qub2ZmKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpfSxlLnByb3RvdHlwZS5jbGVhblVwUm93cz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcztlLm9wdGlvbnMucm93cz4wJiYoaT1lLiRzbGlkZXMuY2hpbGRyZW4oKS5jaGlsZHJlbigpLGkucmVtb3ZlQXR0cihcInN0eWxlXCIpLGUuJHNsaWRlci5lbXB0eSgpLmFwcGVuZChpKSl9LGUucHJvdG90eXBlLmNsaWNrSGFuZGxlcj1mdW5jdGlvbihpKXt2YXIgZT10aGlzO2Uuc2hvdWxkQ2xpY2s9PT0hMSYmKGkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksaS5zdG9wUHJvcGFnYXRpb24oKSxpLnByZXZlbnREZWZhdWx0KCkpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5hdXRvUGxheUNsZWFyKCksdC50b3VjaE9iamVjdD17fSx0LmNsZWFuVXBFdmVudHMoKSxpKFwiLnNsaWNrLWNsb25lZFwiLHQuJHNsaWRlcikuZGV0YWNoKCksdC4kZG90cyYmdC4kZG90cy5yZW1vdmUoKSx0LiRwcmV2QXJyb3cmJnQuJHByZXZBcnJvdy5sZW5ndGgmJih0LiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZCBzbGljay1hcnJvdyBzbGljay1oaWRkZW5cIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuIGFyaWEtZGlzYWJsZWQgdGFiaW5kZXhcIikuY3NzKFwiZGlzcGxheVwiLFwiXCIpLHQuaHRtbEV4cHIudGVzdCh0Lm9wdGlvbnMucHJldkFycm93KSYmdC4kcHJldkFycm93LnJlbW92ZSgpKSx0LiRuZXh0QXJyb3cmJnQuJG5leHRBcnJvdy5sZW5ndGgmJih0LiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZCBzbGljay1hcnJvdyBzbGljay1oaWRkZW5cIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuIGFyaWEtZGlzYWJsZWQgdGFiaW5kZXhcIikuY3NzKFwiZGlzcGxheVwiLFwiXCIpLHQuaHRtbEV4cHIudGVzdCh0Lm9wdGlvbnMubmV4dEFycm93KSYmdC4kbmV4dEFycm93LnJlbW92ZSgpKSx0LiRzbGlkZXMmJih0LiRzbGlkZXMucmVtb3ZlQ2xhc3MoXCJzbGljay1zbGlkZSBzbGljay1hY3RpdmUgc2xpY2stY2VudGVyIHNsaWNrLXZpc2libGUgc2xpY2stY3VycmVudFwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW5cIikucmVtb3ZlQXR0cihcImRhdGEtc2xpY2staW5kZXhcIikuZWFjaChmdW5jdGlvbigpe2kodGhpcykuYXR0cihcInN0eWxlXCIsaSh0aGlzKS5kYXRhKFwib3JpZ2luYWxTdHlsaW5nXCIpKX0pLHQuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSx0LiRzbGlkZVRyYWNrLmRldGFjaCgpLHQuJGxpc3QuZGV0YWNoKCksdC4kc2xpZGVyLmFwcGVuZCh0LiRzbGlkZXMpKSx0LmNsZWFuVXBSb3dzKCksdC4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGVyXCIpLHQuJHNsaWRlci5yZW1vdmVDbGFzcyhcInNsaWNrLWluaXRpYWxpemVkXCIpLHQuJHNsaWRlci5yZW1vdmVDbGFzcyhcInNsaWNrLWRvdHRlZFwiKSx0LnVuc2xpY2tlZD0hMCxlfHx0LiRzbGlkZXIudHJpZ2dlcihcImRlc3Ryb3lcIixbdF0pfSxlLnByb3RvdHlwZS5kaXNhYmxlVHJhbnNpdGlvbj1mdW5jdGlvbihpKXt2YXIgZT10aGlzLHQ9e307dFtlLnRyYW5zaXRpb25UeXBlXT1cIlwiLGUub3B0aW9ucy5mYWRlPT09ITE/ZS4kc2xpZGVUcmFjay5jc3ModCk6ZS4kc2xpZGVzLmVxKGkpLmNzcyh0KX0sZS5wcm90b3R5cGUuZmFkZVNsaWRlPWZ1bmN0aW9uKGksZSl7dmFyIHQ9dGhpczt0LmNzc1RyYW5zaXRpb25zPT09ITE/KHQuJHNsaWRlcy5lcShpKS5jc3Moe3pJbmRleDp0Lm9wdGlvbnMuekluZGV4fSksdC4kc2xpZGVzLmVxKGkpLmFuaW1hdGUoe29wYWNpdHk6MX0sdC5vcHRpb25zLnNwZWVkLHQub3B0aW9ucy5lYXNpbmcsZSkpOih0LmFwcGx5VHJhbnNpdGlvbihpKSx0LiRzbGlkZXMuZXEoaSkuY3NzKHtvcGFjaXR5OjEsekluZGV4OnQub3B0aW9ucy56SW5kZXh9KSxlJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5kaXNhYmxlVHJhbnNpdGlvbihpKSxlLmNhbGwoKX0sdC5vcHRpb25zLnNwZWVkKSl9LGUucHJvdG90eXBlLmZhZGVTbGlkZU91dD1mdW5jdGlvbihpKXt2YXIgZT10aGlzO2UuY3NzVHJhbnNpdGlvbnM9PT0hMT9lLiRzbGlkZXMuZXEoaSkuYW5pbWF0ZSh7b3BhY2l0eTowLHpJbmRleDplLm9wdGlvbnMuekluZGV4LTJ9LGUub3B0aW9ucy5zcGVlZCxlLm9wdGlvbnMuZWFzaW5nKTooZS5hcHBseVRyYW5zaXRpb24oaSksZS4kc2xpZGVzLmVxKGkpLmNzcyh7b3BhY2l0eTowLHpJbmRleDplLm9wdGlvbnMuekluZGV4LTJ9KSl9LGUucHJvdG90eXBlLmZpbHRlclNsaWRlcz1lLnByb3RvdHlwZS5zbGlja0ZpbHRlcj1mdW5jdGlvbihpKXt2YXIgZT10aGlzO251bGwhPT1pJiYoZS4kc2xpZGVzQ2FjaGU9ZS4kc2xpZGVzLGUudW5sb2FkKCksZS4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLGUuJHNsaWRlc0NhY2hlLmZpbHRlcihpKS5hcHBlbmRUbyhlLiRzbGlkZVRyYWNrKSxlLnJlaW5pdCgpKX0sZS5wcm90b3R5cGUuZm9jdXNIYW5kbGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLiRzbGlkZXIub2ZmKFwiZm9jdXMuc2xpY2sgYmx1ci5zbGlja1wiKS5vbihcImZvY3VzLnNsaWNrXCIsXCIqXCIsZnVuY3Rpb24odCl7dmFyIG89aSh0aGlzKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vcHRpb25zLnBhdXNlT25Gb2N1cyYmby5pcyhcIjpmb2N1c1wiKSYmKGUuZm9jdXNzZWQ9ITAsZS5hdXRvUGxheSgpKX0sMCl9KS5vbihcImJsdXIuc2xpY2tcIixcIipcIixmdW5jdGlvbih0KXtpKHRoaXMpO2Uub3B0aW9ucy5wYXVzZU9uRm9jdXMmJihlLmZvY3Vzc2VkPSExLGUuYXV0b1BsYXkoKSl9KX0sZS5wcm90b3R5cGUuZ2V0Q3VycmVudD1lLnByb3RvdHlwZS5zbGlja0N1cnJlbnRTbGlkZT1mdW5jdGlvbigpe3ZhciBpPXRoaXM7cmV0dXJuIGkuY3VycmVudFNsaWRlfSxlLnByb3RvdHlwZS5nZXREb3RDb3VudD1mdW5jdGlvbigpe3ZhciBpPXRoaXMsZT0wLHQ9MCxvPTA7aWYoaS5vcHRpb25zLmluZmluaXRlPT09ITApaWYoaS5zbGlkZUNvdW50PD1pLm9wdGlvbnMuc2xpZGVzVG9TaG93KSsrbztlbHNlIGZvcig7ZTxpLnNsaWRlQ291bnQ7KSsrbyxlPXQraS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLHQrPWkub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDw9aS5vcHRpb25zLnNsaWRlc1RvU2hvdz9pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6aS5vcHRpb25zLnNsaWRlc1RvU2hvdztlbHNlIGlmKGkub3B0aW9ucy5jZW50ZXJNb2RlPT09ITApbz1pLnNsaWRlQ291bnQ7ZWxzZSBpZihpLm9wdGlvbnMuYXNOYXZGb3IpZm9yKDtlPGkuc2xpZGVDb3VudDspKytvLGU9dCtpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsdCs9aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPD1pLm9wdGlvbnMuc2xpZGVzVG9TaG93P2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDppLm9wdGlvbnMuc2xpZGVzVG9TaG93O2Vsc2Ugbz0xK01hdGguY2VpbCgoaS5zbGlkZUNvdW50LWkub3B0aW9ucy5zbGlkZXNUb1Nob3cpL2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCk7cmV0dXJuIG8tMX0sZS5wcm90b3R5cGUuZ2V0TGVmdD1mdW5jdGlvbihpKXt2YXIgZSx0LG8scyxuPXRoaXMscj0wO3JldHVybiBuLnNsaWRlT2Zmc2V0PTAsdD1uLiRzbGlkZXMuZmlyc3QoKS5vdXRlckhlaWdodCghMCksbi5vcHRpb25zLmluZmluaXRlPT09ITA/KG4uc2xpZGVDb3VudD5uLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYobi5zbGlkZU9mZnNldD1uLnNsaWRlV2lkdGgqbi5vcHRpb25zLnNsaWRlc1RvU2hvdyotMSxzPS0xLG4ub3B0aW9ucy52ZXJ0aWNhbD09PSEwJiZuLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiYoMj09PW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/cz0tMS41OjE9PT1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYocz0tMikpLHI9dCpuLm9wdGlvbnMuc2xpZGVzVG9TaG93KnMpLG4uc2xpZGVDb3VudCVuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPT0wJiZpK24ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbD5uLnNsaWRlQ291bnQmJm4uc2xpZGVDb3VudD5uLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaT5uLnNsaWRlQ291bnQ/KG4uc2xpZGVPZmZzZXQ9KG4ub3B0aW9ucy5zbGlkZXNUb1Nob3ctKGktbi5zbGlkZUNvdW50KSkqbi5zbGlkZVdpZHRoKi0xLHI9KG4ub3B0aW9ucy5zbGlkZXNUb1Nob3ctKGktbi5zbGlkZUNvdW50KSkqdCotMSk6KG4uc2xpZGVPZmZzZXQ9bi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCpuLnNsaWRlV2lkdGgqLTEscj1uLnNsaWRlQ291bnQlbi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKnQqLTEpKSk6aStuLm9wdGlvbnMuc2xpZGVzVG9TaG93Pm4uc2xpZGVDb3VudCYmKG4uc2xpZGVPZmZzZXQ9KGkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdy1uLnNsaWRlQ291bnQpKm4uc2xpZGVXaWR0aCxyPShpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3ctbi5zbGlkZUNvdW50KSp0KSxuLnNsaWRlQ291bnQ8PW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihuLnNsaWRlT2Zmc2V0PTAscj0wKSxuLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiZuLnNsaWRlQ291bnQ8PW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/bi5zbGlkZU9mZnNldD1uLnNsaWRlV2lkdGgqTWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS8yLW4uc2xpZGVXaWR0aCpuLnNsaWRlQ291bnQvMjpuLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiZuLm9wdGlvbnMuaW5maW5pdGU9PT0hMD9uLnNsaWRlT2Zmc2V0Kz1uLnNsaWRlV2lkdGgqTWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpLW4uc2xpZGVXaWR0aDpuLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiYobi5zbGlkZU9mZnNldD0wLG4uc2xpZGVPZmZzZXQrPW4uc2xpZGVXaWR0aCpNYXRoLmZsb29yKG4ub3B0aW9ucy5zbGlkZXNUb1Nob3cvMikpLGU9bi5vcHRpb25zLnZlcnRpY2FsPT09ITE/aSpuLnNsaWRlV2lkdGgqLTErbi5zbGlkZU9mZnNldDppKnQqLTErcixuLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSEwJiYobz1uLnNsaWRlQ291bnQ8PW4ub3B0aW9ucy5zbGlkZXNUb1Nob3d8fG4ub3B0aW9ucy5pbmZpbml0ZT09PSExP24uJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoaSk6bi4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5lcShpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLGU9bi5vcHRpb25zLnJ0bD09PSEwP29bMF0/KG4uJHNsaWRlVHJhY2sud2lkdGgoKS1vWzBdLm9mZnNldExlZnQtby53aWR0aCgpKSotMTowOm9bMF0/b1swXS5vZmZzZXRMZWZ0Ki0xOjAsbi5vcHRpb25zLmNlbnRlck1vZGU9PT0hMCYmKG89bi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93fHxuLm9wdGlvbnMuaW5maW5pdGU9PT0hMT9uLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkpOm4uJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KzEpLGU9bi5vcHRpb25zLnJ0bD09PSEwP29bMF0/KG4uJHNsaWRlVHJhY2sud2lkdGgoKS1vWzBdLm9mZnNldExlZnQtby53aWR0aCgpKSotMTowOm9bMF0/b1swXS5vZmZzZXRMZWZ0Ki0xOjAsZSs9KG4uJGxpc3Qud2lkdGgoKS1vLm91dGVyV2lkdGgoKSkvMikpLGV9LGUucHJvdG90eXBlLmdldE9wdGlvbj1lLnByb3RvdHlwZS5zbGlja0dldE9wdGlvbj1mdW5jdGlvbihpKXt2YXIgZT10aGlzO3JldHVybiBlLm9wdGlvbnNbaV19LGUucHJvdG90eXBlLmdldE5hdmlnYWJsZUluZGV4ZXM9ZnVuY3Rpb24oKXt2YXIgaSxlPXRoaXMsdD0wLG89MCxzPVtdO2ZvcihlLm9wdGlvbnMuaW5maW5pdGU9PT0hMT9pPWUuc2xpZGVDb3VudDoodD1lLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwqLTEsbz1lLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwqLTEsaT0yKmUuc2xpZGVDb3VudCk7dDxpOylzLnB1c2godCksdD1vK2Uub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxvKz1lLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWUub3B0aW9ucy5zbGlkZXNUb1Nob3c/ZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmUub3B0aW9ucy5zbGlkZXNUb1Nob3c7cmV0dXJuIHN9LGUucHJvdG90eXBlLmdldFNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmdldFNsaWRlQ291bnQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG8scyxuPXRoaXM7cmV0dXJuIHM9bi5vcHRpb25zLmNlbnRlck1vZGU9PT0hMD9NYXRoLmZsb29yKG4uJGxpc3Qud2lkdGgoKS8yKTowLG89bi5zd2lwZUxlZnQqLTErcyxuLm9wdGlvbnMuc3dpcGVUb1NsaWRlPT09ITA/KG4uJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1zbGlkZVwiKS5lYWNoKGZ1bmN0aW9uKGUscyl7dmFyIHIsbCxkO2lmKHI9aShzKS5vdXRlcldpZHRoKCksbD1zLm9mZnNldExlZnQsbi5vcHRpb25zLmNlbnRlck1vZGUhPT0hMCYmKGwrPXIvMiksZD1sK3IsbzxkKXJldHVybiB0PXMsITF9KSxlPU1hdGguYWJzKGkodCkuYXR0cihcImRhdGEtc2xpY2staW5kZXhcIiktbi5jdXJyZW50U2xpZGUpfHwxKTpuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGx9LGUucHJvdG90eXBlLmdvVG89ZS5wcm90b3R5cGUuc2xpY2tHb1RvPWZ1bmN0aW9uKGksZSl7dmFyIHQ9dGhpczt0LmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDpwYXJzZUludChpKX19LGUpfSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aSh0LiRzbGlkZXIpLmhhc0NsYXNzKFwic2xpY2staW5pdGlhbGl6ZWRcIil8fChpKHQuJHNsaWRlcikuYWRkQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKSx0LmJ1aWxkUm93cygpLHQuYnVpbGRPdXQoKSx0LnNldFByb3BzKCksdC5zdGFydExvYWQoKSx0LmxvYWRTbGlkZXIoKSx0LmluaXRpYWxpemVFdmVudHMoKSx0LnVwZGF0ZUFycm93cygpLHQudXBkYXRlRG90cygpLHQuY2hlY2tSZXNwb25zaXZlKCEwKSx0LmZvY3VzSGFuZGxlcigpKSxlJiZ0LiRzbGlkZXIudHJpZ2dlcihcImluaXRcIixbdF0pLHQub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITAmJnQuaW5pdEFEQSgpLHQub3B0aW9ucy5hdXRvcGxheSYmKHQucGF1c2VkPSExLHQuYXV0b1BsYXkoKSl9LGUucHJvdG90eXBlLmluaXRBREE9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9TWF0aC5jZWlsKGUuc2xpZGVDb3VudC9lLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxvPWUuZ2V0TmF2aWdhYmxlSW5kZXhlcygpLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gaT49MCYmaTxlLnNsaWRlQ291bnR9KTtlLiRzbGlkZXMuYWRkKGUuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikpLmF0dHIoe1wiYXJpYS1oaWRkZW5cIjpcInRydWVcIix0YWJpbmRleDpcIi0xXCJ9KS5maW5kKFwiYSwgaW5wdXQsIGJ1dHRvbiwgc2VsZWN0XCIpLmF0dHIoe3RhYmluZGV4OlwiLTFcIn0pLG51bGwhPT1lLiRkb3RzJiYoZS4kc2xpZGVzLm5vdChlLiRzbGlkZVRyYWNrLmZpbmQoXCIuc2xpY2stY2xvbmVkXCIpKS5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBzPW8uaW5kZXhPZih0KTtpZihpKHRoaXMpLmF0dHIoe3JvbGU6XCJ0YWJwYW5lbFwiLGlkOlwic2xpY2stc2xpZGVcIitlLmluc3RhbmNlVWlkK3QsdGFiaW5kZXg6LTF9KSxzIT09LTEpe3ZhciBuPVwic2xpY2stc2xpZGUtY29udHJvbFwiK2UuaW5zdGFuY2VVaWQrcztpKFwiI1wiK24pLmxlbmd0aCYmaSh0aGlzKS5hdHRyKHtcImFyaWEtZGVzY3JpYmVkYnlcIjpufSl9fSksZS4kZG90cy5hdHRyKFwicm9sZVwiLFwidGFibGlzdFwiKS5maW5kKFwibGlcIikuZWFjaChmdW5jdGlvbihzKXt2YXIgbj1vW3NdO2kodGhpcykuYXR0cih7cm9sZTpcInByZXNlbnRhdGlvblwifSksaSh0aGlzKS5maW5kKFwiYnV0dG9uXCIpLmZpcnN0KCkuYXR0cih7cm9sZTpcInRhYlwiLGlkOlwic2xpY2stc2xpZGUtY29udHJvbFwiK2UuaW5zdGFuY2VVaWQrcyxcImFyaWEtY29udHJvbHNcIjpcInNsaWNrLXNsaWRlXCIrZS5pbnN0YW5jZVVpZCtuLFwiYXJpYS1sYWJlbFwiOnMrMStcIiBvZiBcIit0LFwiYXJpYS1zZWxlY3RlZFwiOm51bGwsdGFiaW5kZXg6XCItMVwifSl9KS5lcShlLmN1cnJlbnRTbGlkZSkuZmluZChcImJ1dHRvblwiKS5hdHRyKHtcImFyaWEtc2VsZWN0ZWRcIjpcInRydWVcIix0YWJpbmRleDpcIjBcIn0pLmVuZCgpKTtmb3IodmFyIHM9ZS5jdXJyZW50U2xpZGUsbj1zK2Uub3B0aW9ucy5zbGlkZXNUb1Nob3c7czxuO3MrKyllLm9wdGlvbnMuZm9jdXNPbkNoYW5nZT9lLiRzbGlkZXMuZXEocykuYXR0cih7dGFiaW5kZXg6XCIwXCJ9KTplLiRzbGlkZXMuZXEocykucmVtb3ZlQXR0cihcInRhYmluZGV4XCIpO2UuYWN0aXZhdGVBREEoKX0sZS5wcm90b3R5cGUuaW5pdEFycm93RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLm9wdGlvbnMuYXJyb3dzPT09ITAmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93Lm9mZihcImNsaWNrLnNsaWNrXCIpLm9uKFwiY2xpY2suc2xpY2tcIix7bWVzc2FnZTpcInByZXZpb3VzXCJ9LGkuY2hhbmdlU2xpZGUpLGkuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiKS5vbihcImNsaWNrLnNsaWNrXCIse21lc3NhZ2U6XCJuZXh0XCJ9LGkuY2hhbmdlU2xpZGUpLGkub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITAmJihpLiRwcmV2QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSxpLiRuZXh0QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSkpfSxlLnByb3RvdHlwZS5pbml0RG90RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLm9wdGlvbnMuZG90cz09PSEwJiZlLnNsaWRlQ291bnQ+ZS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGkoXCJsaVwiLGUuJGRvdHMpLm9uKFwiY2xpY2suc2xpY2tcIix7bWVzc2FnZTpcImluZGV4XCJ9LGUuY2hhbmdlU2xpZGUpLGUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITAmJmUuJGRvdHMub24oXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSksZS5vcHRpb25zLmRvdHM9PT0hMCYmZS5vcHRpb25zLnBhdXNlT25Eb3RzSG92ZXI9PT0hMCYmZS5zbGlkZUNvdW50PmUub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmkoXCJsaVwiLGUuJGRvdHMpLm9uKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLm9uKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpfSxlLnByb3RvdHlwZS5pbml0U2xpZGVFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2Uub3B0aW9ucy5wYXVzZU9uSG92ZXImJihlLiRsaXN0Lm9uKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLGUuJGxpc3Qub24oXCJtb3VzZWxlYXZlLnNsaWNrXCIsaS5wcm94eShlLmludGVycnVwdCxlLCExKSkpfSxlLnByb3RvdHlwZS5pbml0aWFsaXplRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmluaXRBcnJvd0V2ZW50cygpLGUuaW5pdERvdEV2ZW50cygpLGUuaW5pdFNsaWRlRXZlbnRzKCksZS4kbGlzdC5vbihcInRvdWNoc3RhcnQuc2xpY2sgbW91c2Vkb3duLnNsaWNrXCIse2FjdGlvbjpcInN0YXJ0XCJ9LGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9uKFwidG91Y2htb3ZlLnNsaWNrIG1vdXNlbW92ZS5zbGlja1wiLHthY3Rpb246XCJtb3ZlXCJ9LGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9uKFwidG91Y2hlbmQuc2xpY2sgbW91c2V1cC5zbGlja1wiLHthY3Rpb246XCJlbmRcIn0sZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub24oXCJ0b3VjaGNhbmNlbC5zbGljayBtb3VzZWxlYXZlLnNsaWNrXCIse2FjdGlvbjpcImVuZFwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcImNsaWNrLnNsaWNrXCIsZS5jbGlja0hhbmRsZXIpLGkoZG9jdW1lbnQpLm9uKGUudmlzaWJpbGl0eUNoYW5nZSxpLnByb3h5KGUudmlzaWJpbGl0eSxlKSksZS5vcHRpb25zLmFjY2Vzc2liaWxpdHk9PT0hMCYmZS4kbGlzdC5vbihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpLGUub3B0aW9ucy5mb2N1c09uU2VsZWN0PT09ITAmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vbihcImNsaWNrLnNsaWNrXCIsZS5zZWxlY3RIYW5kbGVyKSxpKHdpbmRvdykub24oXCJvcmllbnRhdGlvbmNoYW5nZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGkucHJveHkoZS5vcmllbnRhdGlvbkNoYW5nZSxlKSksaSh3aW5kb3cpLm9uKFwicmVzaXplLnNsaWNrLnNsaWNrLVwiK2UuaW5zdGFuY2VVaWQsaS5wcm94eShlLnJlc2l6ZSxlKSksaShcIltkcmFnZ2FibGUhPXRydWVdXCIsZS4kc2xpZGVUcmFjaykub24oXCJkcmFnc3RhcnRcIixlLnByZXZlbnREZWZhdWx0KSxpKHdpbmRvdykub24oXCJsb2FkLnNsaWNrLnNsaWNrLVwiK2UuaW5zdGFuY2VVaWQsZS5zZXRQb3NpdGlvbiksaShlLnNldFBvc2l0aW9uKX0sZS5wcm90b3R5cGUuaW5pdFVJPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLm9wdGlvbnMuYXJyb3dzPT09ITAmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93LnNob3coKSxpLiRuZXh0QXJyb3cuc2hvdygpKSxpLm9wdGlvbnMuZG90cz09PSEwJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmaS4kZG90cy5zaG93KCl9LGUucHJvdG90eXBlLmtleUhhbmRsZXI9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztpLnRhcmdldC50YWdOYW1lLm1hdGNoKFwiVEVYVEFSRUF8SU5QVVR8U0VMRUNUXCIpfHwoMzc9PT1pLmtleUNvZGUmJmUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITA/ZS5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTplLm9wdGlvbnMucnRsPT09ITA/XCJuZXh0XCI6XCJwcmV2aW91c1wifX0pOjM5PT09aS5rZXlDb2RlJiZlLm9wdGlvbnMuYWNjZXNzaWJpbGl0eT09PSEwJiZlLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOmUub3B0aW9ucy5ydGw9PT0hMD9cInByZXZpb3VzXCI6XCJuZXh0XCJ9fSkpfSxlLnByb3RvdHlwZS5sYXp5TG9hZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aShcImltZ1tkYXRhLWxhenldXCIsZSkuZWFjaChmdW5jdGlvbigpe3ZhciBlPWkodGhpcyksdD1pKHRoaXMpLmF0dHIoXCJkYXRhLWxhenlcIiksbz1pKHRoaXMpLmF0dHIoXCJkYXRhLXNyY3NldFwiKSxzPWkodGhpcykuYXR0cihcImRhdGEtc2l6ZXNcIil8fHIuJHNsaWRlci5hdHRyKFwiZGF0YS1zaXplc1wiKSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7bi5vbmxvYWQ9ZnVuY3Rpb24oKXtlLmFuaW1hdGUoe29wYWNpdHk6MH0sMTAwLGZ1bmN0aW9uKCl7byYmKGUuYXR0cihcInNyY3NldFwiLG8pLHMmJmUuYXR0cihcInNpemVzXCIscykpLGUuYXR0cihcInNyY1wiLHQpLmFuaW1hdGUoe29wYWNpdHk6MX0sMjAwLGZ1bmN0aW9uKCl7ZS5yZW1vdmVBdHRyKFwiZGF0YS1sYXp5IGRhdGEtc3Jjc2V0IGRhdGEtc2l6ZXNcIikucmVtb3ZlQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpfSksci4kc2xpZGVyLnRyaWdnZXIoXCJsYXp5TG9hZGVkXCIsW3IsZSx0XSl9KX0sbi5vbmVycm9yPWZ1bmN0aW9uKCl7ZS5yZW1vdmVBdHRyKFwiZGF0YS1sYXp5XCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKS5hZGRDbGFzcyhcInNsaWNrLWxhenlsb2FkLWVycm9yXCIpLHIuJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRFcnJvclwiLFtyLGUsdF0pfSxuLnNyYz10fSl9dmFyIHQsbyxzLG4scj10aGlzO2lmKHIub3B0aW9ucy5jZW50ZXJNb2RlPT09ITA/ci5vcHRpb25zLmluZmluaXRlPT09ITA/KHM9ci5jdXJyZW50U2xpZGUrKHIub3B0aW9ucy5zbGlkZXNUb1Nob3cvMisxKSxuPXMrci5vcHRpb25zLnNsaWRlc1RvU2hvdysyKToocz1NYXRoLm1heCgwLHIuY3VycmVudFNsaWRlLShyLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpLG49Misoci5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKzEpK3IuY3VycmVudFNsaWRlKToocz1yLm9wdGlvbnMuaW5maW5pdGU/ci5vcHRpb25zLnNsaWRlc1RvU2hvdytyLmN1cnJlbnRTbGlkZTpyLmN1cnJlbnRTbGlkZSxuPU1hdGguY2VpbChzK3Iub3B0aW9ucy5zbGlkZXNUb1Nob3cpLHIub3B0aW9ucy5mYWRlPT09ITAmJihzPjAmJnMtLSxuPD1yLnNsaWRlQ291bnQmJm4rKykpLHQ9ci4kc2xpZGVyLmZpbmQoXCIuc2xpY2stc2xpZGVcIikuc2xpY2UocyxuKSxcImFudGljaXBhdGVkXCI9PT1yLm9wdGlvbnMubGF6eUxvYWQpZm9yKHZhciBsPXMtMSxkPW4sYT1yLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKSxjPTA7YzxyLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7YysrKWw8MCYmKGw9ci5zbGlkZUNvdW50LTEpLHQ9dC5hZGQoYS5lcShsKSksdD10LmFkZChhLmVxKGQpKSxsLS0sZCsrO2UodCksci5zbGlkZUNvdW50PD1yLm9wdGlvbnMuc2xpZGVzVG9TaG93PyhvPXIuJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLGUobykpOnIuY3VycmVudFNsaWRlPj1yLnNsaWRlQ291bnQtci5vcHRpb25zLnNsaWRlc1RvU2hvdz8obz1yLiRzbGlkZXIuZmluZChcIi5zbGljay1jbG9uZWRcIikuc2xpY2UoMCxyLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxlKG8pKTowPT09ci5jdXJyZW50U2xpZGUmJihvPXIuJHNsaWRlci5maW5kKFwiLnNsaWNrLWNsb25lZFwiKS5zbGljZShyLm9wdGlvbnMuc2xpZGVzVG9TaG93Ki0xKSxlKG8pKX0sZS5wcm90b3R5cGUubG9hZFNsaWRlcj1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5zZXRQb3NpdGlvbigpLGkuJHNsaWRlVHJhY2suY3NzKHtvcGFjaXR5OjF9KSxpLiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLGkuaW5pdFVJKCksXCJwcm9ncmVzc2l2ZVwiPT09aS5vcHRpb25zLmxhenlMb2FkJiZpLnByb2dyZXNzaXZlTGF6eUxvYWQoKX0sZS5wcm90b3R5cGUubmV4dD1lLnByb3RvdHlwZS5zbGlja05leHQ9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6XCJuZXh0XCJ9fSl9LGUucHJvdG90eXBlLm9yaWVudGF0aW9uQ2hhbmdlPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmNoZWNrUmVzcG9uc2l2ZSgpLGkuc2V0UG9zaXRpb24oKX0sZS5wcm90b3R5cGUucGF1c2U9ZS5wcm90b3R5cGUuc2xpY2tQYXVzZT1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5hdXRvUGxheUNsZWFyKCksaS5wYXVzZWQ9ITB9LGUucHJvdG90eXBlLnBsYXk9ZS5wcm90b3R5cGUuc2xpY2tQbGF5PWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5KCksaS5vcHRpb25zLmF1dG9wbGF5PSEwLGkucGF1c2VkPSExLGkuZm9jdXNzZWQ9ITEsaS5pbnRlcnJ1cHRlZD0hMX0sZS5wcm90b3R5cGUucG9zdFNsaWRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoIXQudW5zbGlja2VkJiYodC4kc2xpZGVyLnRyaWdnZXIoXCJhZnRlckNoYW5nZVwiLFt0LGVdKSx0LmFuaW1hdGluZz0hMSx0LnNsaWRlQ291bnQ+dC5vcHRpb25zLnNsaWRlc1RvU2hvdyYmdC5zZXRQb3NpdGlvbigpLHQuc3dpcGVMZWZ0PW51bGwsdC5vcHRpb25zLmF1dG9wbGF5JiZ0LmF1dG9QbGF5KCksdC5vcHRpb25zLmFjY2Vzc2liaWxpdHk9PT0hMCYmKHQuaW5pdEFEQSgpLHQub3B0aW9ucy5mb2N1c09uQ2hhbmdlKSkpe3ZhciBvPWkodC4kc2xpZGVzLmdldCh0LmN1cnJlbnRTbGlkZSkpO28uYXR0cihcInRhYmluZGV4XCIsMCkuZm9jdXMoKX19LGUucHJvdG90eXBlLnByZXY9ZS5wcm90b3R5cGUuc2xpY2tQcmV2PWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwicHJldmlvdXNcIn19KX0sZS5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oaSl7aS5wcmV2ZW50RGVmYXVsdCgpfSxlLnByb3RvdHlwZS5wcm9ncmVzc2l2ZUxhenlMb2FkPWZ1bmN0aW9uKGUpe2U9ZXx8MTt2YXIgdCxvLHMsbixyLGw9dGhpcyxkPWkoXCJpbWdbZGF0YS1sYXp5XVwiLGwuJHNsaWRlcik7ZC5sZW5ndGg/KHQ9ZC5maXJzdCgpLG89dC5hdHRyKFwiZGF0YS1sYXp5XCIpLHM9dC5hdHRyKFwiZGF0YS1zcmNzZXRcIiksbj10LmF0dHIoXCJkYXRhLXNpemVzXCIpfHxsLiRzbGlkZXIuYXR0cihcImRhdGEtc2l6ZXNcIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLHIub25sb2FkPWZ1bmN0aW9uKCl7cyYmKHQuYXR0cihcInNyY3NldFwiLHMpLG4mJnQuYXR0cihcInNpemVzXCIsbikpLHQuYXR0cihcInNyY1wiLG8pLnJlbW92ZUF0dHIoXCJkYXRhLWxhenkgZGF0YS1zcmNzZXQgZGF0YS1zaXplc1wiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWxvYWRpbmdcIiksbC5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0PT09ITAmJmwuc2V0UG9zaXRpb24oKSxsLiRzbGlkZXIudHJpZ2dlcihcImxhenlMb2FkZWRcIixbbCx0LG9dKSxsLnByb2dyZXNzaXZlTGF6eUxvYWQoKX0sci5vbmVycm9yPWZ1bmN0aW9uKCl7ZTwzP3NldFRpbWVvdXQoZnVuY3Rpb24oKXtsLnByb2dyZXNzaXZlTGF6eUxvYWQoZSsxKX0sNTAwKToodC5yZW1vdmVBdHRyKFwiZGF0YS1sYXp5XCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKS5hZGRDbGFzcyhcInNsaWNrLWxhenlsb2FkLWVycm9yXCIpLGwuJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRFcnJvclwiLFtsLHQsb10pLGwucHJvZ3Jlc3NpdmVMYXp5TG9hZCgpKX0sci5zcmM9byk6bC4kc2xpZGVyLnRyaWdnZXIoXCJhbGxJbWFnZXNMb2FkZWRcIixbbF0pfSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKGUpe3ZhciB0LG8scz10aGlzO289cy5zbGlkZUNvdW50LXMub3B0aW9ucy5zbGlkZXNUb1Nob3csIXMub3B0aW9ucy5pbmZpbml0ZSYmcy5jdXJyZW50U2xpZGU+byYmKHMuY3VycmVudFNsaWRlPW8pLHMuc2xpZGVDb3VudDw9cy5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKHMuY3VycmVudFNsaWRlPTApLHQ9cy5jdXJyZW50U2xpZGUscy5kZXN0cm95KCEwKSxpLmV4dGVuZChzLHMuaW5pdGlhbHMse2N1cnJlbnRTbGlkZTp0fSkscy5pbml0KCksZXx8cy5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTpcImluZGV4XCIsaW5kZXg6dH19LCExKX0sZS5wcm90b3R5cGUucmVnaXN0ZXJCcmVha3BvaW50cz1mdW5jdGlvbigpe3ZhciBlLHQsbyxzPXRoaXMsbj1zLm9wdGlvbnMucmVzcG9uc2l2ZXx8bnVsbDtpZihcImFycmF5XCI9PT1pLnR5cGUobikmJm4ubGVuZ3RoKXtzLnJlc3BvbmRUbz1zLm9wdGlvbnMucmVzcG9uZFRvfHxcIndpbmRvd1wiO2ZvcihlIGluIG4paWYobz1zLmJyZWFrcG9pbnRzLmxlbmd0aC0xLG4uaGFzT3duUHJvcGVydHkoZSkpe2Zvcih0PW5bZV0uYnJlYWtwb2ludDtvPj0wOylzLmJyZWFrcG9pbnRzW29dJiZzLmJyZWFrcG9pbnRzW29dPT09dCYmcy5icmVha3BvaW50cy5zcGxpY2UobywxKSxvLS07cy5icmVha3BvaW50cy5wdXNoKHQpLHMuYnJlYWtwb2ludFNldHRpbmdzW3RdPW5bZV0uc2V0dGluZ3N9cy5icmVha3BvaW50cy5zb3J0KGZ1bmN0aW9uKGksZSl7cmV0dXJuIHMub3B0aW9ucy5tb2JpbGVGaXJzdD9pLWU6ZS1pfSl9fSxlLnByb3RvdHlwZS5yZWluaXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuJHNsaWRlcz1lLiRzbGlkZVRyYWNrLmNoaWxkcmVuKGUub3B0aW9ucy5zbGlkZSkuYWRkQ2xhc3MoXCJzbGljay1zbGlkZVwiKSxlLnNsaWRlQ291bnQ9ZS4kc2xpZGVzLmxlbmd0aCxlLmN1cnJlbnRTbGlkZT49ZS5zbGlkZUNvdW50JiYwIT09ZS5jdXJyZW50U2xpZGUmJihlLmN1cnJlbnRTbGlkZT1lLmN1cnJlbnRTbGlkZS1lLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwpLGUuc2xpZGVDb3VudDw9ZS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGUuY3VycmVudFNsaWRlPTApLGUucmVnaXN0ZXJCcmVha3BvaW50cygpLGUuc2V0UHJvcHMoKSxlLnNldHVwSW5maW5pdGUoKSxlLmJ1aWxkQXJyb3dzKCksZS51cGRhdGVBcnJvd3MoKSxlLmluaXRBcnJvd0V2ZW50cygpLGUuYnVpbGREb3RzKCksZS51cGRhdGVEb3RzKCksZS5pbml0RG90RXZlbnRzKCksZS5jbGVhblVwU2xpZGVFdmVudHMoKSxlLmluaXRTbGlkZUV2ZW50cygpLGUuY2hlY2tSZXNwb25zaXZlKCExLCEwKSxlLm9wdGlvbnMuZm9jdXNPblNlbGVjdD09PSEwJiZpKGUuJHNsaWRlVHJhY2spLmNoaWxkcmVuKCkub24oXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksZS5zZXRTbGlkZUNsYXNzZXMoXCJudW1iZXJcIj09dHlwZW9mIGUuY3VycmVudFNsaWRlP2UuY3VycmVudFNsaWRlOjApLGUuc2V0UG9zaXRpb24oKSxlLmZvY3VzSGFuZGxlcigpLGUucGF1c2VkPSFlLm9wdGlvbnMuYXV0b3BsYXksZS5hdXRvUGxheSgpLGUuJHNsaWRlci50cmlnZ2VyKFwicmVJbml0XCIsW2VdKX0sZS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpKHdpbmRvdykud2lkdGgoKSE9PWUud2luZG93V2lkdGgmJihjbGVhclRpbWVvdXQoZS53aW5kb3dEZWxheSksZS53aW5kb3dEZWxheT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uud2luZG93V2lkdGg9aSh3aW5kb3cpLndpZHRoKCksZS5jaGVja1Jlc3BvbnNpdmUoKSxlLnVuc2xpY2tlZHx8ZS5zZXRQb3NpdGlvbigpfSw1MCkpfSxlLnByb3RvdHlwZS5yZW1vdmVTbGlkZT1lLnByb3RvdHlwZS5zbGlja1JlbW92ZT1mdW5jdGlvbihpLGUsdCl7dmFyIG89dGhpcztyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIGk/KGU9aSxpPWU9PT0hMD8wOm8uc2xpZGVDb3VudC0xKTppPWU9PT0hMD8tLWk6aSwhKG8uc2xpZGVDb3VudDwxfHxpPDB8fGk+by5zbGlkZUNvdW50LTEpJiYoby51bmxvYWQoKSx0PT09ITA/by4kc2xpZGVUcmFjay5jaGlsZHJlbigpLnJlbW92ZSgpOm8uJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5lcShpKS5yZW1vdmUoKSxvLiRzbGlkZXM9by4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLG8uJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxvLiRzbGlkZVRyYWNrLmFwcGVuZChvLiRzbGlkZXMpLG8uJHNsaWRlc0NhY2hlPW8uJHNsaWRlcyx2b2lkIG8ucmVpbml0KCkpfSxlLnByb3RvdHlwZS5zZXRDU1M9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvPXRoaXMscz17fTtvLm9wdGlvbnMucnRsPT09ITAmJihpPS1pKSxlPVwibGVmdFwiPT1vLnBvc2l0aW9uUHJvcD9NYXRoLmNlaWwoaSkrXCJweFwiOlwiMHB4XCIsdD1cInRvcFwiPT1vLnBvc2l0aW9uUHJvcD9NYXRoLmNlaWwoaSkrXCJweFwiOlwiMHB4XCIsc1tvLnBvc2l0aW9uUHJvcF09aSxvLnRyYW5zZm9ybXNFbmFibGVkPT09ITE/by4kc2xpZGVUcmFjay5jc3Mocyk6KHM9e30sby5jc3NUcmFuc2l0aW9ucz09PSExPyhzW28uYW5pbVR5cGVdPVwidHJhbnNsYXRlKFwiK2UrXCIsIFwiK3QrXCIpXCIsby4kc2xpZGVUcmFjay5jc3MocykpOihzW28uYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoXCIrZStcIiwgXCIrdCtcIiwgMHB4KVwiLG8uJHNsaWRlVHJhY2suY3NzKHMpKSl9LGUucHJvdG90eXBlLnNldERpbWVuc2lvbnM9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kub3B0aW9ucy52ZXJ0aWNhbD09PSExP2kub3B0aW9ucy5jZW50ZXJNb2RlPT09ITAmJmkuJGxpc3QuY3NzKHtwYWRkaW5nOlwiMHB4IFwiK2kub3B0aW9ucy5jZW50ZXJQYWRkaW5nfSk6KGkuJGxpc3QuaGVpZ2h0KGkuJHNsaWRlcy5maXJzdCgpLm91dGVySGVpZ2h0KCEwKSppLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxpLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiZpLiRsaXN0LmNzcyh7cGFkZGluZzppLm9wdGlvbnMuY2VudGVyUGFkZGluZytcIiAwcHhcIn0pKSxpLmxpc3RXaWR0aD1pLiRsaXN0LndpZHRoKCksaS5saXN0SGVpZ2h0PWkuJGxpc3QuaGVpZ2h0KCksaS5vcHRpb25zLnZlcnRpY2FsPT09ITEmJmkub3B0aW9ucy52YXJpYWJsZVdpZHRoPT09ITE/KGkuc2xpZGVXaWR0aD1NYXRoLmNlaWwoaS5saXN0V2lkdGgvaS5vcHRpb25zLnNsaWRlc1RvU2hvdyksaS4kc2xpZGVUcmFjay53aWR0aChNYXRoLmNlaWwoaS5zbGlkZVdpZHRoKmkuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikubGVuZ3RoKSkpOmkub3B0aW9ucy52YXJpYWJsZVdpZHRoPT09ITA/aS4kc2xpZGVUcmFjay53aWR0aCg1ZTMqaS5zbGlkZUNvdW50KTooaS5zbGlkZVdpZHRoPU1hdGguY2VpbChpLmxpc3RXaWR0aCksaS4kc2xpZGVUcmFjay5oZWlnaHQoTWF0aC5jZWlsKGkuJHNsaWRlcy5maXJzdCgpLm91dGVySGVpZ2h0KCEwKSppLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmxlbmd0aCkpKTt2YXIgZT1pLiRzbGlkZXMuZmlyc3QoKS5vdXRlcldpZHRoKCEwKS1pLiRzbGlkZXMuZmlyc3QoKS53aWR0aCgpO2kub3B0aW9ucy52YXJpYWJsZVdpZHRoPT09ITEmJmkuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikud2lkdGgoaS5zbGlkZVdpZHRoLWUpfSxlLnByb3RvdHlwZS5zZXRGYWRlPWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzO3QuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKG8scyl7ZT10LnNsaWRlV2lkdGgqbyotMSx0Lm9wdGlvbnMucnRsPT09ITA/aShzKS5jc3Moe3Bvc2l0aW9uOlwicmVsYXRpdmVcIixyaWdodDplLHRvcDowLHpJbmRleDp0Lm9wdGlvbnMuekluZGV4LTIsb3BhY2l0eTowfSk6aShzKS5jc3Moe3Bvc2l0aW9uOlwicmVsYXRpdmVcIixsZWZ0OmUsdG9wOjAsekluZGV4OnQub3B0aW9ucy56SW5kZXgtMixvcGFjaXR5OjB9KX0pLHQuJHNsaWRlcy5lcSh0LmN1cnJlbnRTbGlkZSkuY3NzKHt6SW5kZXg6dC5vcHRpb25zLnpJbmRleC0xLG9wYWNpdHk6MX0pfSxlLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2lmKDE9PT1pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZpLm9wdGlvbnMuYWRhcHRpdmVIZWlnaHQ9PT0hMCYmaS5vcHRpb25zLnZlcnRpY2FsPT09ITEpe3ZhciBlPWkuJHNsaWRlcy5lcShpLmN1cnJlbnRTbGlkZSkub3V0ZXJIZWlnaHQoITApO2kuJGxpc3QuY3NzKFwiaGVpZ2h0XCIsZSl9fSxlLnByb3RvdHlwZS5zZXRPcHRpb249ZS5wcm90b3R5cGUuc2xpY2tTZXRPcHRpb249ZnVuY3Rpb24oKXt2YXIgZSx0LG8scyxuLHI9dGhpcyxsPSExO2lmKFwib2JqZWN0XCI9PT1pLnR5cGUoYXJndW1lbnRzWzBdKT8obz1hcmd1bWVudHNbMF0sbD1hcmd1bWVudHNbMV0sbj1cIm11bHRpcGxlXCIpOlwic3RyaW5nXCI9PT1pLnR5cGUoYXJndW1lbnRzWzBdKSYmKG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdLFwicmVzcG9uc2l2ZVwiPT09YXJndW1lbnRzWzBdJiZcImFycmF5XCI9PT1pLnR5cGUoYXJndW1lbnRzWzFdKT9uPVwicmVzcG9uc2l2ZVwiOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBhcmd1bWVudHNbMV0mJihuPVwic2luZ2xlXCIpKSxcInNpbmdsZVwiPT09bilyLm9wdGlvbnNbb109cztlbHNlIGlmKFwibXVsdGlwbGVcIj09PW4paS5lYWNoKG8sZnVuY3Rpb24oaSxlKXtyLm9wdGlvbnNbaV09ZX0pO2Vsc2UgaWYoXCJyZXNwb25zaXZlXCI9PT1uKWZvcih0IGluIHMpaWYoXCJhcnJheVwiIT09aS50eXBlKHIub3B0aW9ucy5yZXNwb25zaXZlKSlyLm9wdGlvbnMucmVzcG9uc2l2ZT1bc1t0XV07ZWxzZXtmb3IoZT1yLm9wdGlvbnMucmVzcG9uc2l2ZS5sZW5ndGgtMTtlPj0wOylyLm9wdGlvbnMucmVzcG9uc2l2ZVtlXS5icmVha3BvaW50PT09c1t0XS5icmVha3BvaW50JiZyLm9wdGlvbnMucmVzcG9uc2l2ZS5zcGxpY2UoZSwxKSxlLS07ci5vcHRpb25zLnJlc3BvbnNpdmUucHVzaChzW3RdKX1sJiYoci51bmxvYWQoKSxyLnJlaW5pdCgpKX0sZS5wcm90b3R5cGUuc2V0UG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuc2V0RGltZW5zaW9ucygpLGkuc2V0SGVpZ2h0KCksaS5vcHRpb25zLmZhZGU9PT0hMT9pLnNldENTUyhpLmdldExlZnQoaS5jdXJyZW50U2xpZGUpKTppLnNldEZhZGUoKSxpLiRzbGlkZXIudHJpZ2dlcihcInNldFBvc2l0aW9uXCIsW2ldKX0sZS5wcm90b3R5cGUuc2V0UHJvcHM9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLGU9ZG9jdW1lbnQuYm9keS5zdHlsZTtpLnBvc2l0aW9uUHJvcD1pLm9wdGlvbnMudmVydGljYWw9PT0hMD9cInRvcFwiOlwibGVmdFwiLFxyXG5cInRvcFwiPT09aS5wb3NpdGlvblByb3A/aS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stdmVydGljYWxcIik6aS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stdmVydGljYWxcIiksdm9pZCAwPT09ZS5XZWJraXRUcmFuc2l0aW9uJiZ2b2lkIDA9PT1lLk1velRyYW5zaXRpb24mJnZvaWQgMD09PWUubXNUcmFuc2l0aW9ufHxpLm9wdGlvbnMudXNlQ1NTPT09ITAmJihpLmNzc1RyYW5zaXRpb25zPSEwKSxpLm9wdGlvbnMuZmFkZSYmKFwibnVtYmVyXCI9PXR5cGVvZiBpLm9wdGlvbnMuekluZGV4P2kub3B0aW9ucy56SW5kZXg8MyYmKGkub3B0aW9ucy56SW5kZXg9Myk6aS5vcHRpb25zLnpJbmRleD1pLmRlZmF1bHRzLnpJbmRleCksdm9pZCAwIT09ZS5PVHJhbnNmb3JtJiYoaS5hbmltVHlwZT1cIk9UcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItby10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiT1RyYW5zaXRpb25cIix2b2lkIDA9PT1lLnBlcnNwZWN0aXZlUHJvcGVydHkmJnZvaWQgMD09PWUud2Via2l0UGVyc3BlY3RpdmUmJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS5Nb3pUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwiTW96VHJhbnNmb3JtXCIsaS50cmFuc2Zvcm1UeXBlPVwiLW1vei10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiTW96VHJhbnNpdGlvblwiLHZvaWQgMD09PWUucGVyc3BlY3RpdmVQcm9wZXJ0eSYmdm9pZCAwPT09ZS5Nb3pQZXJzcGVjdGl2ZSYmKGkuYW5pbVR5cGU9ITEpKSx2b2lkIDAhPT1lLndlYmtpdFRyYW5zZm9ybSYmKGkuYW5pbVR5cGU9XCJ3ZWJraXRUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItd2Via2l0LXRyYW5zZm9ybVwiLGkudHJhbnNpdGlvblR5cGU9XCJ3ZWJraXRUcmFuc2l0aW9uXCIsdm9pZCAwPT09ZS5wZXJzcGVjdGl2ZVByb3BlcnR5JiZ2b2lkIDA9PT1lLndlYmtpdFBlcnNwZWN0aXZlJiYoaS5hbmltVHlwZT0hMSkpLHZvaWQgMCE9PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwibXNUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItbXMtdHJhbnNmb3JtXCIsaS50cmFuc2l0aW9uVHlwZT1cIm1zVHJhbnNpdGlvblwiLHZvaWQgMD09PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS50cmFuc2Zvcm0mJmkuYW5pbVR5cGUhPT0hMSYmKGkuYW5pbVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwidHJhbnNpdGlvblwiKSxpLnRyYW5zZm9ybXNFbmFibGVkPWkub3B0aW9ucy51c2VUcmFuc2Zvcm0mJm51bGwhPT1pLmFuaW1UeXBlJiZpLmFuaW1UeXBlIT09ITF9LGUucHJvdG90eXBlLnNldFNsaWRlQ2xhc3Nlcz1mdW5jdGlvbihpKXt2YXIgZSx0LG8scyxuPXRoaXM7aWYodD1uLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY3VycmVudFwiKSxuLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwKXt2YXIgcj1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JTI9PT0wPzE6MDtlPU1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKSxuLm9wdGlvbnMuaW5maW5pdGU9PT0hMCYmKGk+PWUmJmk8PW4uc2xpZGVDb3VudC0xLWU/bi4kc2xpZGVzLnNsaWNlKGktZStyLGkrZSsxKS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOihvPW4ub3B0aW9ucy5zbGlkZXNUb1Nob3craSx0LnNsaWNlKG8tZSsxK3IsbytlKzIpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIikpLDA9PT1pP3QuZXEodC5sZW5ndGgtMS1uLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWNlbnRlclwiKTppPT09bi5zbGlkZUNvdW50LTEmJnQuZXEobi5vcHRpb25zLnNsaWRlc1RvU2hvdykuYWRkQ2xhc3MoXCJzbGljay1jZW50ZXJcIikpLG4uJHNsaWRlcy5lcShpKS5hZGRDbGFzcyhcInNsaWNrLWNlbnRlclwiKX1lbHNlIGk+PTAmJmk8PW4uc2xpZGVDb3VudC1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P24uJHNsaWRlcy5zbGljZShpLGkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdykuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKTp0Lmxlbmd0aDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvdz90LmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6KHM9bi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Nob3csbz1uLm9wdGlvbnMuaW5maW5pdGU9PT0hMD9uLm9wdGlvbnMuc2xpZGVzVG9TaG93K2k6aSxuLm9wdGlvbnMuc2xpZGVzVG9TaG93PT1uLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwmJm4uc2xpZGVDb3VudC1pPG4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/dC5zbGljZShvLShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LXMpLG8rcykuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKTp0LnNsaWNlKG8sbytuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpKTtcIm9uZGVtYW5kXCIhPT1uLm9wdGlvbnMubGF6eUxvYWQmJlwiYW50aWNpcGF0ZWRcIiE9PW4ub3B0aW9ucy5sYXp5TG9hZHx8bi5sYXp5TG9hZCgpfSxlLnByb3RvdHlwZS5zZXR1cEluZmluaXRlPWZ1bmN0aW9uKCl7dmFyIGUsdCxvLHM9dGhpcztpZihzLm9wdGlvbnMuZmFkZT09PSEwJiYocy5vcHRpb25zLmNlbnRlck1vZGU9ITEpLHMub3B0aW9ucy5pbmZpbml0ZT09PSEwJiZzLm9wdGlvbnMuZmFkZT09PSExJiYodD1udWxsLHMuc2xpZGVDb3VudD5zLm9wdGlvbnMuc2xpZGVzVG9TaG93KSl7Zm9yKG89cy5vcHRpb25zLmNlbnRlck1vZGU9PT0hMD9zLm9wdGlvbnMuc2xpZGVzVG9TaG93KzE6cy5vcHRpb25zLnNsaWRlc1RvU2hvdyxlPXMuc2xpZGVDb3VudDtlPnMuc2xpZGVDb3VudC1vO2UtPTEpdD1lLTEsaShzLiRzbGlkZXNbdF0pLmNsb25lKCEwKS5hdHRyKFwiaWRcIixcIlwiKS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLHQtcy5zbGlkZUNvdW50KS5wcmVwZW5kVG8ocy4kc2xpZGVUcmFjaykuYWRkQ2xhc3MoXCJzbGljay1jbG9uZWRcIik7Zm9yKGU9MDtlPG8rcy5zbGlkZUNvdW50O2UrPTEpdD1lLGkocy4kc2xpZGVzW3RdKS5jbG9uZSghMCkuYXR0cihcImlkXCIsXCJcIikuYXR0cihcImRhdGEtc2xpY2staW5kZXhcIix0K3Muc2xpZGVDb3VudCkuYXBwZW5kVG8ocy4kc2xpZGVUcmFjaykuYWRkQ2xhc3MoXCJzbGljay1jbG9uZWRcIik7cy4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWNsb25lZFwiKS5maW5kKFwiW2lkXVwiKS5lYWNoKGZ1bmN0aW9uKCl7aSh0aGlzKS5hdHRyKFwiaWRcIixcIlwiKX0pfX0sZS5wcm90b3R5cGUuaW50ZXJydXB0PWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aXx8ZS5hdXRvUGxheSgpLGUuaW50ZXJydXB0ZWQ9aX0sZS5wcm90b3R5cGUuc2VsZWN0SGFuZGxlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG89aShlLnRhcmdldCkuaXMoXCIuc2xpY2stc2xpZGVcIik/aShlLnRhcmdldCk6aShlLnRhcmdldCkucGFyZW50cyhcIi5zbGljay1zbGlkZVwiKSxzPXBhcnNlSW50KG8uYXR0cihcImRhdGEtc2xpY2staW5kZXhcIikpO3JldHVybiBzfHwocz0wKSx0LnNsaWRlQ291bnQ8PXQub3B0aW9ucy5zbGlkZXNUb1Nob3c/dm9pZCB0LnNsaWRlSGFuZGxlcihzLCExLCEwKTp2b2lkIHQuc2xpZGVIYW5kbGVyKHMpfSxlLnByb3RvdHlwZS5zbGlkZUhhbmRsZXI9ZnVuY3Rpb24oaSxlLHQpe3ZhciBvLHMsbixyLGwsZD1udWxsLGE9dGhpcztpZihlPWV8fCExLCEoYS5hbmltYXRpbmc9PT0hMCYmYS5vcHRpb25zLndhaXRGb3JBbmltYXRlPT09ITB8fGEub3B0aW9ucy5mYWRlPT09ITAmJmEuY3VycmVudFNsaWRlPT09aSkpcmV0dXJuIGU9PT0hMSYmYS5hc05hdkZvcihpKSxvPWksZD1hLmdldExlZnQobykscj1hLmdldExlZnQoYS5jdXJyZW50U2xpZGUpLGEuY3VycmVudExlZnQ9bnVsbD09PWEuc3dpcGVMZWZ0P3I6YS5zd2lwZUxlZnQsYS5vcHRpb25zLmluZmluaXRlPT09ITEmJmEub3B0aW9ucy5jZW50ZXJNb2RlPT09ITEmJihpPDB8fGk+YS5nZXREb3RDb3VudCgpKmEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCk/dm9pZChhLm9wdGlvbnMuZmFkZT09PSExJiYobz1hLmN1cnJlbnRTbGlkZSx0IT09ITAmJmEuc2xpZGVDb3VudD5hLm9wdGlvbnMuc2xpZGVzVG9TaG93P2EuYW5pbWF0ZVNsaWRlKHIsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShvKX0pOmEucG9zdFNsaWRlKG8pKSk6YS5vcHRpb25zLmluZmluaXRlPT09ITEmJmEub3B0aW9ucy5jZW50ZXJNb2RlPT09ITAmJihpPDB8fGk+YS5zbGlkZUNvdW50LWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCk/dm9pZChhLm9wdGlvbnMuZmFkZT09PSExJiYobz1hLmN1cnJlbnRTbGlkZSx0IT09ITAmJmEuc2xpZGVDb3VudD5hLm9wdGlvbnMuc2xpZGVzVG9TaG93P2EuYW5pbWF0ZVNsaWRlKHIsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShvKX0pOmEucG9zdFNsaWRlKG8pKSk6KGEub3B0aW9ucy5hdXRvcGxheSYmY2xlYXJJbnRlcnZhbChhLmF1dG9QbGF5VGltZXIpLHM9bzwwP2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPT0wP2Euc2xpZGVDb3VudC1hLnNsaWRlQ291bnQlYS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmEuc2xpZGVDb3VudCtvOm8+PWEuc2xpZGVDb3VudD9hLnNsaWRlQ291bnQlYS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIT09MD8wOm8tYS5zbGlkZUNvdW50Om8sYS5hbmltYXRpbmc9ITAsYS4kc2xpZGVyLnRyaWdnZXIoXCJiZWZvcmVDaGFuZ2VcIixbYSxhLmN1cnJlbnRTbGlkZSxzXSksbj1hLmN1cnJlbnRTbGlkZSxhLmN1cnJlbnRTbGlkZT1zLGEuc2V0U2xpZGVDbGFzc2VzKGEuY3VycmVudFNsaWRlKSxhLm9wdGlvbnMuYXNOYXZGb3ImJihsPWEuZ2V0TmF2VGFyZ2V0KCksbD1sLnNsaWNrKFwiZ2V0U2xpY2tcIiksbC5zbGlkZUNvdW50PD1sLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZsLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSkpLGEudXBkYXRlRG90cygpLGEudXBkYXRlQXJyb3dzKCksYS5vcHRpb25zLmZhZGU9PT0hMD8odCE9PSEwPyhhLmZhZGVTbGlkZU91dChuKSxhLmZhZGVTbGlkZShzLGZ1bmN0aW9uKCl7YS5wb3N0U2xpZGUocyl9KSk6YS5wb3N0U2xpZGUocyksdm9pZCBhLmFuaW1hdGVIZWlnaHQoKSk6dm9pZCh0IT09ITAmJmEuc2xpZGVDb3VudD5hLm9wdGlvbnMuc2xpZGVzVG9TaG93P2EuYW5pbWF0ZVNsaWRlKGQsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShzKX0pOmEucG9zdFNsaWRlKHMpKSl9LGUucHJvdG90eXBlLnN0YXJ0TG9hZD1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5vcHRpb25zLmFycm93cz09PSEwJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGkuJHByZXZBcnJvdy5oaWRlKCksaS4kbmV4dEFycm93LmhpZGUoKSksaS5vcHRpb25zLmRvdHM9PT0hMCYmaS5zbGlkZUNvdW50Pmkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmkuJGRvdHMuaGlkZSgpLGkuJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLWxvYWRpbmdcIil9LGUucHJvdG90eXBlLnN3aXBlRGlyZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGksZSx0LG8scz10aGlzO3JldHVybiBpPXMudG91Y2hPYmplY3Quc3RhcnRYLXMudG91Y2hPYmplY3QuY3VyWCxlPXMudG91Y2hPYmplY3Quc3RhcnRZLXMudG91Y2hPYmplY3QuY3VyWSx0PU1hdGguYXRhbjIoZSxpKSxvPU1hdGgucm91bmQoMTgwKnQvTWF0aC5QSSksbzwwJiYobz0zNjAtTWF0aC5hYnMobykpLG88PTQ1JiZvPj0wP3Mub3B0aW9ucy5ydGw9PT0hMT9cImxlZnRcIjpcInJpZ2h0XCI6bzw9MzYwJiZvPj0zMTU/cy5vcHRpb25zLnJ0bD09PSExP1wibGVmdFwiOlwicmlnaHRcIjpvPj0xMzUmJm88PTIyNT9zLm9wdGlvbnMucnRsPT09ITE/XCJyaWdodFwiOlwibGVmdFwiOnMub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmc9PT0hMD9vPj0zNSYmbzw9MTM1P1wiZG93blwiOlwidXBcIjpcInZlcnRpY2FsXCJ9LGUucHJvdG90eXBlLnN3aXBlRW5kPWZ1bmN0aW9uKGkpe3ZhciBlLHQsbz10aGlzO2lmKG8uZHJhZ2dpbmc9ITEsby5zd2lwaW5nPSExLG8uc2Nyb2xsaW5nKXJldHVybiBvLnNjcm9sbGluZz0hMSwhMTtpZihvLmludGVycnVwdGVkPSExLG8uc2hvdWxkQ2xpY2s9IShvLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPjEwKSx2b2lkIDA9PT1vLnRvdWNoT2JqZWN0LmN1clgpcmV0dXJuITE7aWYoby50b3VjaE9iamVjdC5lZGdlSGl0PT09ITAmJm8uJHNsaWRlci50cmlnZ2VyKFwiZWRnZVwiLFtvLG8uc3dpcGVEaXJlY3Rpb24oKV0pLG8udG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+PW8udG91Y2hPYmplY3QubWluU3dpcGUpe3N3aXRjaCh0PW8uc3dpcGVEaXJlY3Rpb24oKSl7Y2FzZVwibGVmdFwiOmNhc2VcImRvd25cIjplPW8ub3B0aW9ucy5zd2lwZVRvU2xpZGU/by5jaGVja05hdmlnYWJsZShvLmN1cnJlbnRTbGlkZStvLmdldFNsaWRlQ291bnQoKSk6by5jdXJyZW50U2xpZGUrby5nZXRTbGlkZUNvdW50KCksby5jdXJyZW50RGlyZWN0aW9uPTA7YnJlYWs7Y2FzZVwicmlnaHRcIjpjYXNlXCJ1cFwiOmU9by5vcHRpb25zLnN3aXBlVG9TbGlkZT9vLmNoZWNrTmF2aWdhYmxlKG8uY3VycmVudFNsaWRlLW8uZ2V0U2xpZGVDb3VudCgpKTpvLmN1cnJlbnRTbGlkZS1vLmdldFNsaWRlQ291bnQoKSxvLmN1cnJlbnREaXJlY3Rpb249MX1cInZlcnRpY2FsXCIhPXQmJihvLnNsaWRlSGFuZGxlcihlKSxvLnRvdWNoT2JqZWN0PXt9LG8uJHNsaWRlci50cmlnZ2VyKFwic3dpcGVcIixbbyx0XSkpfWVsc2Ugby50b3VjaE9iamVjdC5zdGFydFghPT1vLnRvdWNoT2JqZWN0LmN1clgmJihvLnNsaWRlSGFuZGxlcihvLmN1cnJlbnRTbGlkZSksby50b3VjaE9iamVjdD17fSl9LGUucHJvdG90eXBlLnN3aXBlSGFuZGxlcj1mdW5jdGlvbihpKXt2YXIgZT10aGlzO2lmKCEoZS5vcHRpb25zLnN3aXBlPT09ITF8fFwib250b3VjaGVuZFwiaW4gZG9jdW1lbnQmJmUub3B0aW9ucy5zd2lwZT09PSExfHxlLm9wdGlvbnMuZHJhZ2dhYmxlPT09ITEmJmkudHlwZS5pbmRleE9mKFwibW91c2VcIikhPT0tMSkpc3dpdGNoKGUudG91Y2hPYmplY3QuZmluZ2VyQ291bnQ9aS5vcmlnaW5hbEV2ZW50JiZ2b2lkIDAhPT1pLm9yaWdpbmFsRXZlbnQudG91Y2hlcz9pLm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGg6MSxlLnRvdWNoT2JqZWN0Lm1pblN3aXBlPWUubGlzdFdpZHRoL2Uub3B0aW9ucy50b3VjaFRocmVzaG9sZCxlLm9wdGlvbnMudmVydGljYWxTd2lwaW5nPT09ITAmJihlLnRvdWNoT2JqZWN0Lm1pblN3aXBlPWUubGlzdEhlaWdodC9lLm9wdGlvbnMudG91Y2hUaHJlc2hvbGQpLGkuZGF0YS5hY3Rpb24pe2Nhc2VcInN0YXJ0XCI6ZS5zd2lwZVN0YXJ0KGkpO2JyZWFrO2Nhc2VcIm1vdmVcIjplLnN3aXBlTW92ZShpKTticmVhaztjYXNlXCJlbmRcIjplLnN3aXBlRW5kKGkpfX0sZS5wcm90b3R5cGUuc3dpcGVNb3ZlPWZ1bmN0aW9uKGkpe3ZhciBlLHQsbyxzLG4scixsPXRoaXM7cmV0dXJuIG49dm9pZCAwIT09aS5vcmlnaW5hbEV2ZW50P2kub3JpZ2luYWxFdmVudC50b3VjaGVzOm51bGwsISghbC5kcmFnZ2luZ3x8bC5zY3JvbGxpbmd8fG4mJjEhPT1uLmxlbmd0aCkmJihlPWwuZ2V0TGVmdChsLmN1cnJlbnRTbGlkZSksbC50b3VjaE9iamVjdC5jdXJYPXZvaWQgMCE9PW4/blswXS5wYWdlWDppLmNsaWVudFgsbC50b3VjaE9iamVjdC5jdXJZPXZvaWQgMCE9PW4/blswXS5wYWdlWTppLmNsaWVudFksbC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD1NYXRoLnJvdW5kKE1hdGguc3FydChNYXRoLnBvdyhsLnRvdWNoT2JqZWN0LmN1clgtbC50b3VjaE9iamVjdC5zdGFydFgsMikpKSxyPU1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KGwudG91Y2hPYmplY3QuY3VyWS1sLnRvdWNoT2JqZWN0LnN0YXJ0WSwyKSkpLCFsLm9wdGlvbnMudmVydGljYWxTd2lwaW5nJiYhbC5zd2lwaW5nJiZyPjQ/KGwuc2Nyb2xsaW5nPSEwLCExKToobC5vcHRpb25zLnZlcnRpY2FsU3dpcGluZz09PSEwJiYobC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD1yKSx0PWwuc3dpcGVEaXJlY3Rpb24oKSx2b2lkIDAhPT1pLm9yaWdpbmFsRXZlbnQmJmwudG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+NCYmKGwuc3dpcGluZz0hMCxpLnByZXZlbnREZWZhdWx0KCkpLHM9KGwub3B0aW9ucy5ydGw9PT0hMT8xOi0xKSoobC50b3VjaE9iamVjdC5jdXJYPmwudG91Y2hPYmplY3Quc3RhcnRYPzE6LTEpLGwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmc9PT0hMCYmKHM9bC50b3VjaE9iamVjdC5jdXJZPmwudG91Y2hPYmplY3Quc3RhcnRZPzE6LTEpLG89bC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCxsLnRvdWNoT2JqZWN0LmVkZ2VIaXQ9ITEsbC5vcHRpb25zLmluZmluaXRlPT09ITEmJigwPT09bC5jdXJyZW50U2xpZGUmJlwicmlnaHRcIj09PXR8fGwuY3VycmVudFNsaWRlPj1sLmdldERvdENvdW50KCkmJlwibGVmdFwiPT09dCkmJihvPWwudG91Y2hPYmplY3Quc3dpcGVMZW5ndGgqbC5vcHRpb25zLmVkZ2VGcmljdGlvbixsLnRvdWNoT2JqZWN0LmVkZ2VIaXQ9ITApLGwub3B0aW9ucy52ZXJ0aWNhbD09PSExP2wuc3dpcGVMZWZ0PWUrbypzOmwuc3dpcGVMZWZ0PWUrbyoobC4kbGlzdC5oZWlnaHQoKS9sLmxpc3RXaWR0aCkqcyxsLm9wdGlvbnMudmVydGljYWxTd2lwaW5nPT09ITAmJihsLnN3aXBlTGVmdD1lK28qcyksbC5vcHRpb25zLmZhZGUhPT0hMCYmbC5vcHRpb25zLnRvdWNoTW92ZSE9PSExJiYobC5hbmltYXRpbmc9PT0hMD8obC5zd2lwZUxlZnQ9bnVsbCwhMSk6dm9pZCBsLnNldENTUyhsLnN3aXBlTGVmdCkpKSl9LGUucHJvdG90eXBlLnN3aXBlU3RhcnQ9ZnVuY3Rpb24oaSl7dmFyIGUsdD10aGlzO3JldHVybiB0LmludGVycnVwdGVkPSEwLDEhPT10LnRvdWNoT2JqZWN0LmZpbmdlckNvdW50fHx0LnNsaWRlQ291bnQ8PXQub3B0aW9ucy5zbGlkZXNUb1Nob3c/KHQudG91Y2hPYmplY3Q9e30sITEpOih2b2lkIDAhPT1pLm9yaWdpbmFsRXZlbnQmJnZvaWQgMCE9PWkub3JpZ2luYWxFdmVudC50b3VjaGVzJiYoZT1pLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSksdC50b3VjaE9iamVjdC5zdGFydFg9dC50b3VjaE9iamVjdC5jdXJYPXZvaWQgMCE9PWU/ZS5wYWdlWDppLmNsaWVudFgsdC50b3VjaE9iamVjdC5zdGFydFk9dC50b3VjaE9iamVjdC5jdXJZPXZvaWQgMCE9PWU/ZS5wYWdlWTppLmNsaWVudFksdm9pZCh0LmRyYWdnaW5nPSEwKSl9LGUucHJvdG90eXBlLnVuZmlsdGVyU2xpZGVzPWUucHJvdG90eXBlLnNsaWNrVW5maWx0ZXI9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO251bGwhPT1pLiRzbGlkZXNDYWNoZSYmKGkudW5sb2FkKCksaS4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLGkuJHNsaWRlc0NhY2hlLmFwcGVuZFRvKGkuJHNsaWRlVHJhY2spLGkucmVpbml0KCkpfSxlLnByb3RvdHlwZS51bmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2koXCIuc2xpY2stY2xvbmVkXCIsZS4kc2xpZGVyKS5yZW1vdmUoKSxlLiRkb3RzJiZlLiRkb3RzLnJlbW92ZSgpLGUuJHByZXZBcnJvdyYmZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5wcmV2QXJyb3cpJiZlLiRwcmV2QXJyb3cucmVtb3ZlKCksZS4kbmV4dEFycm93JiZlLmh0bWxFeHByLnRlc3QoZS5vcHRpb25zLm5leHRBcnJvdykmJmUuJG5leHRBcnJvdy5yZW1vdmUoKSxlLiRzbGlkZXMucmVtb3ZlQ2xhc3MoXCJzbGljay1zbGlkZSBzbGljay1hY3RpdmUgc2xpY2stdmlzaWJsZSBzbGljay1jdXJyZW50XCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKS5jc3MoXCJ3aWR0aFwiLFwiXCIpfSxlLnByb3RvdHlwZS51bnNsaWNrPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7ZS4kc2xpZGVyLnRyaWdnZXIoXCJ1bnNsaWNrXCIsW2UsaV0pLGUuZGVzdHJveSgpfSxlLnByb3RvdHlwZS51cGRhdGVBcnJvd3M9ZnVuY3Rpb24oKXt2YXIgaSxlPXRoaXM7aT1NYXRoLmZsb29yKGUub3B0aW9ucy5zbGlkZXNUb1Nob3cvMiksZS5vcHRpb25zLmFycm93cz09PSEwJiZlLnNsaWRlQ291bnQ+ZS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmIWUub3B0aW9ucy5pbmZpbml0ZSYmKGUuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSxlLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIiksMD09PWUuY3VycmVudFNsaWRlPyhlLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxlLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpOmUuY3VycmVudFNsaWRlPj1lLnNsaWRlQ291bnQtZS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmZS5vcHRpb25zLmNlbnRlck1vZGU9PT0hMT8oZS4kbmV4dEFycm93LmFkZENsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcInRydWVcIiksZS4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcImZhbHNlXCIpKTplLmN1cnJlbnRTbGlkZT49ZS5zbGlkZUNvdW50LTEmJmUub3B0aW9ucy5jZW50ZXJNb2RlPT09ITAmJihlLiRuZXh0QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxlLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpKX0sZS5wcm90b3R5cGUudXBkYXRlRG90cz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7bnVsbCE9PWkuJGRvdHMmJihpLiRkb3RzLmZpbmQoXCJsaVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5lbmQoKSxpLiRkb3RzLmZpbmQoXCJsaVwiKS5lcShNYXRoLmZsb29yKGkuY3VycmVudFNsaWRlL2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpKX0sZS5wcm90b3R5cGUudmlzaWJpbGl0eT1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5vcHRpb25zLmF1dG9wbGF5JiYoZG9jdW1lbnRbaS5oaWRkZW5dP2kuaW50ZXJydXB0ZWQ9ITA6aS5pbnRlcnJ1cHRlZD0hMSl9LGkuZm4uc2xpY2s9ZnVuY3Rpb24oKXt2YXIgaSx0LG89dGhpcyxzPWFyZ3VtZW50c1swXSxuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxyPW8ubGVuZ3RoO2ZvcihpPTA7aTxyO2krKylpZihcIm9iamVjdFwiPT10eXBlb2Ygc3x8XCJ1bmRlZmluZWRcIj09dHlwZW9mIHM/b1tpXS5zbGljaz1uZXcgZShvW2ldLHMpOnQ9b1tpXS5zbGlja1tzXS5hcHBseShvW2ldLnNsaWNrLG4pLFwidW5kZWZpbmVkXCIhPXR5cGVvZiB0KXJldHVybiB0O3JldHVybiBvfX0pOyIsIiFmdW5jdGlvbihlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGUpOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm51bGwhPT1tb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWU6ZSgpfShmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIG5ldyBDdXN0b21FdmVudChlLFApfWZ1bmN0aW9uIHQoZSl7cmV0dXJuIGVbQl18fChlW0JdPXt9KX1mdW5jdGlvbiBuKGUsbixpLG8sYSl7ZnVuY3Rpb24gYyhlKXtpKGUsbyl9bj1uLnNwbGl0KE8pO2Zvcih2YXIgdSxyPXQoZSksZD1uLmxlbmd0aDtkLS07KShyW3U9bltkXV18fChyW3VdPVtdKSkucHVzaChbaSxjXSksZS5hZGRFdmVudExpc3RlbmVyKHUsYyl9ZnVuY3Rpb24gaShlLG4saSxvKXtuPW4uc3BsaXQoTyk7dmFyIGEsYyx1LHI9dChlKSxkPW4ubGVuZ3RoO2lmKHIpZm9yKDtkLS07KWlmKGE9bltkXSxjPXJbYV0pZm9yKHU9Yy5sZW5ndGg7dS0tOyljW3VdWzBdPT09aSYmKGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGNbdV1bMV0pLGMuc3BsaWNlKHUsMSkpfWZ1bmN0aW9uIG8odCxuLGkpe3ZhciBvPWUobik7aSYmTChvLGkpLHQuZGlzcGF0Y2hFdmVudChvKX1mdW5jdGlvbiBhKGUpe2Z1bmN0aW9uIHQoZSl7aT8obigpLEModCksbz0hMCxpPSExKTpvPSExfXZhciBuPWUsaT0hMSxvPSExO3RoaXMua2ljaz1mdW5jdGlvbihlKXtpPSEwLG98fHQoKX0sdGhpcy5lbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bjtlJiYobz8obj1pP2Z1bmN0aW9uKCl7dCgpLGUoKX06ZSxpPSEwKTplKCkpfX1mdW5jdGlvbiBjKCl7fWZ1bmN0aW9uIHUoZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuISFEW2UudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKV19ZnVuY3Rpb24gZChlKXtyZXR1cm4gMT09PWUud2hpY2gmJiFlLmN0cmxLZXkmJiFlLmFsdEtleX1mdW5jdGlvbiBtKGUsdCl7dmFyIG4saTtpZihlLmlkZW50aWZpZWRUb3VjaClyZXR1cm4gZS5pZGVudGlmaWVkVG91Y2godCk7Zm9yKG49LTEsaT1lLmxlbmd0aDsrK248aTspaWYoZVtuXS5pZGVudGlmaWVyPT09dClyZXR1cm4gZVtuXX1mdW5jdGlvbiBmKGUsdCl7dmFyIG49bShlLmNoYW5nZWRUb3VjaGVzLHQuaWRlbnRpZmllcik7aWYobiYmKG4ucGFnZVghPT10LnBhZ2VYfHxuLnBhZ2VZIT09dC5wYWdlWSkpcmV0dXJuIG59ZnVuY3Rpb24gdihlKXtkKGUpJiYocihlKXx8KG4oZG9jdW1lbnQsTi5tb3ZlLHMsZSksbihkb2N1bWVudCxOLmNhbmNlbCxsLGUpKSl9ZnVuY3Rpb24gcyhlLHQpe3koZSx0LGUsZyl9ZnVuY3Rpb24gbChlLHQpe2coKX1mdW5jdGlvbiBnKCl7aShkb2N1bWVudCxOLm1vdmUscyksaShkb2N1bWVudCxOLmNhbmNlbCxsKX1mdW5jdGlvbiBwKGUpe2lmKCFEW2UudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pe3ZhciB0PWUuY2hhbmdlZFRvdWNoZXNbMF0saT17dGFyZ2V0OnQudGFyZ2V0LHBhZ2VYOnQucGFnZVgscGFnZVk6dC5wYWdlWSxpZGVudGlmaWVyOnQuaWRlbnRpZmllcix0b3VjaG1vdmU6ZnVuY3Rpb24oZSx0KXtoKGUsdCl9LHRvdWNoZW5kOmZ1bmN0aW9uKGUsdCl7WChlLHQpfX07bihkb2N1bWVudCx6Lm1vdmUsaS50b3VjaG1vdmUsaSksbihkb2N1bWVudCx6LmNhbmNlbCxpLnRvdWNoZW5kLGkpfX1mdW5jdGlvbiBoKGUsdCl7dmFyIG49ZihlLHQpO24mJnkoZSx0LG4sWSl9ZnVuY3Rpb24gWChlLHQpe20oZS5jaGFuZ2VkVG91Y2hlcyx0LmlkZW50aWZpZXIpJiZZKHQpfWZ1bmN0aW9uIFkoZSl7aShkb2N1bWVudCx6Lm1vdmUsZS50b3VjaG1vdmUpLGkoZG9jdW1lbnQsei5jYW5jZWwsZS50b3VjaGVuZCl9ZnVuY3Rpb24geShlLHQsbixpKXt2YXIgbz1uLnBhZ2VYLXQucGFnZVgsYT1uLnBhZ2VZLXQucGFnZVk7bypvK2EqYTxSKlJ8fHcoZSx0LG4sbyxhLGkpfWZ1bmN0aW9uIHcoZSx0LG4saSxhLHUpe3ZhciByPWUudGFyZ2V0VG91Y2hlcyxkPWUudGltZVN0YW1wLXQudGltZVN0YW1wLG09e2FsdEtleTplLmFsdEtleSxjdHJsS2V5OmUuY3RybEtleSxzaGlmdEtleTplLnNoaWZ0S2V5LHN0YXJ0WDp0LnBhZ2VYLHN0YXJ0WTp0LnBhZ2VZLGRpc3RYOmksZGlzdFk6YSxkZWx0YVg6aSxkZWx0YVk6YSxwYWdlWDpuLnBhZ2VYLHBhZ2VZOm4ucGFnZVksdmVsb2NpdHlYOmkvZCx2ZWxvY2l0eVk6YS9kLGlkZW50aWZpZXI6dC5pZGVudGlmaWVyLHRhcmdldFRvdWNoZXM6cixmaW5nZXI6cj9yLmxlbmd0aDoxLGVuYWJsZU1vdmU6ZnVuY3Rpb24oKXt0aGlzLm1vdmVFbmFibGVkPSEwLHRoaXMuZW5hYmxlTW92ZT1jLGUucHJldmVudERlZmF1bHQoKX19O28odC50YXJnZXQsXCJtb3Zlc3RhcnRcIixtKSx1KHQpfWZ1bmN0aW9uIFQoZSx0KXt2YXIgbj10LnRpbWVyO3QudG91Y2g9ZSx0LnRpbWVTdGFtcD1lLnRpbWVTdGFtcCxuLmtpY2soKX1mdW5jdGlvbiBiKGUsdCl7dmFyIG49dC50YXJnZXQsbz10LmV2ZW50LGE9dC50aW1lcjtTKCksUShuLG8sYSxmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpKG4sXCJjbGlja1wiLHUpfSwwKX0pfWZ1bmN0aW9uIFMoKXtpKGRvY3VtZW50LE4ubW92ZSxUKSxpKGRvY3VtZW50LE4uZW5kLGIpfWZ1bmN0aW9uIGsoZSx0KXt2YXIgbj10LmV2ZW50LGk9dC50aW1lcixvPWYoZSxuKTtvJiYoZS5wcmV2ZW50RGVmYXVsdCgpLG4udGFyZ2V0VG91Y2hlcz1lLnRhcmdldFRvdWNoZXMsdC50b3VjaD1vLHQudGltZVN0YW1wPWUudGltZVN0YW1wLGkua2ljaygpKX1mdW5jdGlvbiBLKGUsdCl7dmFyIG49dC50YXJnZXQsaT10LmV2ZW50LG89dC50aW1lcjttKGUuY2hhbmdlZFRvdWNoZXMsaS5pZGVudGlmaWVyKSYmKGoodCksUShuLGksbykpfWZ1bmN0aW9uIGooZSl7aShkb2N1bWVudCx6Lm1vdmUsZS5hY3RpdmVUb3VjaG1vdmUpLGkoZG9jdW1lbnQsei5lbmQsZS5hY3RpdmVUb3VjaGVuZCl9ZnVuY3Rpb24gRShlLHQsbil7dmFyIGk9bi1lLnRpbWVTdGFtcDtlLmRpc3RYPXQucGFnZVgtZS5zdGFydFgsZS5kaXN0WT10LnBhZ2VZLWUuc3RhcnRZLGUuZGVsdGFYPXQucGFnZVgtZS5wYWdlWCxlLmRlbHRhWT10LnBhZ2VZLWUucGFnZVksZS52ZWxvY2l0eVg9LjMqZS52ZWxvY2l0eVgrLjcqZS5kZWx0YVgvaSxlLnZlbG9jaXR5WT0uMyplLnZlbG9jaXR5WSsuNyplLmRlbHRhWS9pLGUucGFnZVg9dC5wYWdlWCxlLnBhZ2VZPXQucGFnZVl9ZnVuY3Rpb24gUShlLHQsbixpKXtuLmVuZChmdW5jdGlvbigpe3JldHVybiBvKGUsXCJtb3ZlZW5kXCIsdCksaSYmaSgpfSl9ZnVuY3Rpb24gcShlKXtmdW5jdGlvbiB0KGUpe0UoaSxjLnRvdWNoLGMudGltZVN0YW1wKSxvKGMudGFyZ2V0LFwibW92ZVwiLGkpfWlmKCFlLmRlZmF1bHRQcmV2ZW50ZWQmJmUubW92ZUVuYWJsZWQpe3ZhciBpPXtzdGFydFg6ZS5zdGFydFgsc3RhcnRZOmUuc3RhcnRZLHBhZ2VYOmUucGFnZVgscGFnZVk6ZS5wYWdlWSxkaXN0WDplLmRpc3RYLGRpc3RZOmUuZGlzdFksZGVsdGFYOmUuZGVsdGFYLGRlbHRhWTplLmRlbHRhWSx2ZWxvY2l0eVg6ZS52ZWxvY2l0eVgsdmVsb2NpdHlZOmUudmVsb2NpdHlZLGlkZW50aWZpZXI6ZS5pZGVudGlmaWVyLHRhcmdldFRvdWNoZXM6ZS50YXJnZXRUb3VjaGVzLGZpbmdlcjplLmZpbmdlcn0sYz17dGFyZ2V0OmUudGFyZ2V0LGV2ZW50OmksdGltZXI6bmV3IGEodCksdG91Y2g6dm9pZCAwLHRpbWVTdGFtcDplLnRpbWVTdGFtcH07dm9pZCAwPT09ZS5pZGVudGlmaWVyPyhuKGUudGFyZ2V0LFwiY2xpY2tcIix1KSxuKGRvY3VtZW50LE4ubW92ZSxULGMpLG4oZG9jdW1lbnQsTi5lbmQsYixjKSk6KGMuYWN0aXZlVG91Y2htb3ZlPWZ1bmN0aW9uKGUsdCl7ayhlLHQpfSxjLmFjdGl2ZVRvdWNoZW5kPWZ1bmN0aW9uKGUsdCl7SyhlLHQpfSxuKGRvY3VtZW50LHoubW92ZSxjLmFjdGl2ZVRvdWNobW92ZSxjKSxuKGRvY3VtZW50LHouZW5kLGMuYWN0aXZlVG91Y2hlbmQsYykpfX1mdW5jdGlvbiBBKGUpe2UuZW5hYmxlTW92ZSgpfWZ1bmN0aW9uIEYoZSl7ZS5lbmFibGVNb3ZlKCl9ZnVuY3Rpb24gTShlKXtlLmVuYWJsZU1vdmUoKX1mdW5jdGlvbiB4KGUpe3ZhciB0PWUuaGFuZGxlcjtlLmhhbmRsZXI9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLGk9Ry5sZW5ndGg7aS0tOyllW249R1tpXV09ZS5vcmlnaW5hbEV2ZW50W25dO3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfX12YXIgTD1PYmplY3QuYXNzaWdufHx3aW5kb3cualF1ZXJ5JiZqUXVlcnkuZXh0ZW5kLFI9OCxDPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSgpfSwyNSl9fSgpLEQ9e3RleHRhcmVhOiEwLGlucHV0OiEwLHNlbGVjdDohMCxidXR0b246ITB9LE49e21vdmU6XCJtb3VzZW1vdmVcIixjYW5jZWw6XCJtb3VzZXVwIGRyYWdzdGFydFwiLGVuZDpcIm1vdXNldXBcIn0sej17bW92ZTpcInRvdWNobW92ZVwiLGNhbmNlbDpcInRvdWNoZW5kXCIsZW5kOlwidG91Y2hlbmRcIn0sTz0vXFxzKy8sUD17YnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSxCPVN5bWJvbChcImV2ZW50c1wiKTtpZihuKGRvY3VtZW50LFwibW91c2Vkb3duXCIsdiksbihkb2N1bWVudCxcInRvdWNoc3RhcnRcIixwKSxuKGRvY3VtZW50LFwibW92ZXN0YXJ0XCIscSksd2luZG93LmpRdWVyeSl7dmFyIEc9XCJzdGFydFggc3RhcnRZIHBhZ2VYIHBhZ2VZIGRpc3RYIGRpc3RZIGRlbHRhWCBkZWx0YVkgdmVsb2NpdHlYIHZlbG9jaXR5WVwiLnNwbGl0KFwiIFwiKTtqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3Zlc3RhcnQ9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcyxcIm1vdmVzdGFydFwiLEEpLCExfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBpKHRoaXMsXCJtb3Zlc3RhcnRcIixBKSwhMX0sYWRkOnh9LGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdmU9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcyxcIm1vdmVzdGFydFwiLEYpLCExfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBpKHRoaXMsXCJtb3Zlc3RhcnRcIixGKSwhMX0sYWRkOnh9LGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdmVlbmQ9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcyxcIm1vdmVzdGFydFwiLE0pLCExfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBpKHRoaXMsXCJtb3Zlc3RhcnRcIixNKSwhMX0sYWRkOnh9fX0pOyIsIiFmdW5jdGlvbih0KXt0LmZuLnR3ZW50eXR3ZW50eT1mdW5jdGlvbihlKXt2YXIgZT10LmV4dGVuZCh7ZGVmYXVsdF9vZmZzZXRfcGN0Oi41LG9yaWVudGF0aW9uOlwiaG9yaXpvbnRhbFwiLGJlZm9yZV9sYWJlbDpcIkJlZm9yZVwiLGFmdGVyX2xhYmVsOlwiQWZ0ZXJcIixub19vdmVybGF5OiExfSxlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49ZS5kZWZhdWx0X29mZnNldF9wY3QsYT10KHRoaXMpLGk9ZS5vcmllbnRhdGlvbixzPVwidmVydGljYWxcIj09PWk/XCJkb3duXCI6XCJsZWZ0XCIscj1cInZlcnRpY2FsXCI9PT1pP1widXBcIjpcInJpZ2h0XCI7YS53cmFwKFwiPGRpdiBjbGFzcz0ndHdlbnR5dHdlbnR5LXdyYXBwZXIgdHdlbnR5dHdlbnR5LVwiK2krXCInPjwvZGl2PlwiKSxlLm5vX292ZXJsYXl8fGEuYXBwZW5kKFwiPGRpdiBjbGFzcz0ndHdlbnR5dHdlbnR5LW92ZXJsYXknPjwvZGl2PlwiKTt2YXIgZD1hLmZpbmQoXCJpbWc6Zmlyc3RcIiksYz1hLmZpbmQoXCJpbWc6bGFzdFwiKTthLmFwcGVuZChcIjxkaXYgY2xhc3M9J3R3ZW50eXR3ZW50eS1oYW5kbGUnPjwvZGl2PlwiKTt2YXIgbD1hLmZpbmQoXCIudHdlbnR5dHdlbnR5LWhhbmRsZVwiKTtsLmFwcGVuZChcIjxzcGFuIGNsYXNzPSd0d2VudHl0d2VudHktXCIrcytcIi1hcnJvdyc+PC9zcGFuPlwiKSxsLmFwcGVuZChcIjxzcGFuIGNsYXNzPSd0d2VudHl0d2VudHktXCIrcitcIi1hcnJvdyc+PC9zcGFuPlwiKSxhLmFkZENsYXNzKFwidHdlbnR5dHdlbnR5LWNvbnRhaW5lclwiKSxkLmFkZENsYXNzKFwidHdlbnR5dHdlbnR5LWJlZm9yZVwiKSxjLmFkZENsYXNzKFwidHdlbnR5dHdlbnR5LWFmdGVyXCIpO3ZhciBvPWEuZmluZChcIi50d2VudHl0d2VudHktb3ZlcmxheVwiKTtvLmFwcGVuZChcIjxkaXYgY2xhc3M9J3R3ZW50eXR3ZW50eS1iZWZvcmUtbGFiZWwnIGRhdGEtY29udGVudD0nXCIrZS5iZWZvcmVfbGFiZWwrXCInPjwvZGl2PlwiKSxvLmFwcGVuZChcIjxkaXYgY2xhc3M9J3R3ZW50eXR3ZW50eS1hZnRlci1sYWJlbCcgZGF0YS1jb250ZW50PSdcIitlLmFmdGVyX2xhYmVsK1wiJz48L2Rpdj5cIik7dmFyIHc9ZnVuY3Rpb24odCl7dmFyIGU9ZC53aWR0aCgpLG49ZC5oZWlnaHQoKTtyZXR1cm57dzplK1wicHhcIixoOm4rXCJweFwiLGN3OnQqZStcInB4XCIsY2g6dCpuK1wicHhcIn19LGY9ZnVuY3Rpb24odCl7XCJ2ZXJ0aWNhbFwiPT09aT8oZC5jc3MoXCJjbGlwXCIsXCJyZWN0KDAsXCIrdC53K1wiLFwiK3QuY2grXCIsMClcIiksYy5jc3MoXCJjbGlwXCIsXCJyZWN0KFwiK3QuY2grXCIsXCIrdC53K1wiLFwiK3QuaCtcIiwwKVwiKSk6KGQuY3NzKFwiY2xpcFwiLFwicmVjdCgwLFwiK3QuY3crXCIsXCIrdC5oK1wiLDApXCIpLGMuY3NzKFwiY2xpcFwiLFwicmVjdCgwLFwiK3QudytcIixcIit0LmgrXCIsXCIrdC5jdytcIilcIikpLGEuY3NzKFwiaGVpZ2h0XCIsdC5oKX0sdj1mdW5jdGlvbih0KXt2YXIgZT13KHQpO2wuY3NzKFwidmVydGljYWxcIj09PWk/XCJ0b3BcIjpcImxlZnRcIixcInZlcnRpY2FsXCI9PT1pP2UuY2g6ZS5jdyksZihlKX07dCh3aW5kb3cpLm9uKFwicmVzaXplLnR3ZW50eXR3ZW50eVwiLGZ1bmN0aW9uKHQpe3Yobil9KTt2YXIgcD0wLHk9MCxoPTAsdT0wO2wub24oXCJtb3Zlc3RhcnRcIixmdW5jdGlvbih0KXsodC5kaXN0WD50LmRpc3RZJiZ0LmRpc3RYPC10LmRpc3RZfHx0LmRpc3RYPHQuZGlzdFkmJnQuZGlzdFg+LXQuZGlzdFkpJiZcInZlcnRpY2FsXCIhPT1pP3QucHJldmVudERlZmF1bHQoKToodC5kaXN0WDx0LmRpc3RZJiZ0LmRpc3RYPC10LmRpc3RZfHx0LmRpc3RYPnQuZGlzdFkmJnQuZGlzdFg+LXQuZGlzdFkpJiZcInZlcnRpY2FsXCI9PT1pJiZ0LnByZXZlbnREZWZhdWx0KCksYS5hZGRDbGFzcyhcImFjdGl2ZVwiKSxwPWEub2Zmc2V0KCkubGVmdCx5PWEub2Zmc2V0KCkudG9wLGg9ZC53aWR0aCgpLHU9ZC5oZWlnaHQoKX0pLGwub24oXCJtb3ZlZW5kXCIsZnVuY3Rpb24odCl7YS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKX0pLGwub24oXCJtb3ZlXCIsZnVuY3Rpb24odCl7YS5oYXNDbGFzcyhcImFjdGl2ZVwiKSYmKChuPVwidmVydGljYWxcIj09PWk/KHQucGFnZVkteSkvdToodC5wYWdlWC1wKS9oKTwwJiYobj0wKSxuPjEmJihuPTEpLHYobikpfSksYS5maW5kKFwiaW1nXCIpLm9uKFwibW91c2Vkb3duXCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpfSksdCh3aW5kb3cpLnRyaWdnZXIoXCJyZXNpemUudHdlbnR5dHdlbnR5XCIpfSl9fShqUXVlcnkpOyIsIi8qIVxyXG5XYXlwb2ludHMgLSA0LjAuMVxyXG5Db3B5cmlnaHQgwqkgMjAxMS0yMDE2IENhbGViIFRyb3VnaHRvblxyXG5MaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXHJcbmh0dHBzOi8vZ2l0aHViLmNvbS9pbWFrZXdlYnRoaW5ncy93YXlwb2ludHMvYmxvYi9tYXN0ZXIvbGljZW5zZXMudHh0XHJcbiovXHJcbiFmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQobyl7aWYoIW8pdGhyb3cgbmV3IEVycm9yKFwiTm8gb3B0aW9ucyBwYXNzZWQgdG8gV2F5cG9pbnQgY29uc3RydWN0b3JcIik7aWYoIW8uZWxlbWVudCl0aHJvdyBuZXcgRXJyb3IoXCJObyBlbGVtZW50IG9wdGlvbiBwYXNzZWQgdG8gV2F5cG9pbnQgY29uc3RydWN0b3JcIik7aWYoIW8uaGFuZGxlcil0aHJvdyBuZXcgRXJyb3IoXCJObyBoYW5kbGVyIG9wdGlvbiBwYXNzZWQgdG8gV2F5cG9pbnQgY29uc3RydWN0b3JcIik7dGhpcy5rZXk9XCJ3YXlwb2ludC1cIitlLHRoaXMub3B0aW9ucz10LkFkYXB0ZXIuZXh0ZW5kKHt9LHQuZGVmYXVsdHMsbyksdGhpcy5lbGVtZW50PXRoaXMub3B0aW9ucy5lbGVtZW50LHRoaXMuYWRhcHRlcj1uZXcgdC5BZGFwdGVyKHRoaXMuZWxlbWVudCksdGhpcy5jYWxsYmFjaz1vLmhhbmRsZXIsdGhpcy5heGlzPXRoaXMub3B0aW9ucy5ob3Jpem9udGFsP1wiaG9yaXpvbnRhbFwiOlwidmVydGljYWxcIix0aGlzLmVuYWJsZWQ9dGhpcy5vcHRpb25zLmVuYWJsZWQsdGhpcy50cmlnZ2VyUG9pbnQ9bnVsbCx0aGlzLmdyb3VwPXQuR3JvdXAuZmluZE9yQ3JlYXRlKHtuYW1lOnRoaXMub3B0aW9ucy5ncm91cCxheGlzOnRoaXMuYXhpc30pLHRoaXMuY29udGV4dD10LkNvbnRleHQuZmluZE9yQ3JlYXRlQnlFbGVtZW50KHRoaXMub3B0aW9ucy5jb250ZXh0KSx0Lm9mZnNldEFsaWFzZXNbdGhpcy5vcHRpb25zLm9mZnNldF0mJih0aGlzLm9wdGlvbnMub2Zmc2V0PXQub2Zmc2V0QWxpYXNlc1t0aGlzLm9wdGlvbnMub2Zmc2V0XSksdGhpcy5ncm91cC5hZGQodGhpcyksdGhpcy5jb250ZXh0LmFkZCh0aGlzKSxpW3RoaXMua2V5XT10aGlzLGUrPTF9dmFyIGU9MCxpPXt9O3QucHJvdG90eXBlLnF1ZXVlVHJpZ2dlcj1mdW5jdGlvbih0KXt0aGlzLmdyb3VwLnF1ZXVlVHJpZ2dlcih0aGlzLHQpfSx0LnByb3RvdHlwZS50cmlnZ2VyPWZ1bmN0aW9uKHQpe3RoaXMuZW5hYmxlZCYmdGhpcy5jYWxsYmFjayYmdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLHQpfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5jb250ZXh0LnJlbW92ZSh0aGlzKSx0aGlzLmdyb3VwLnJlbW92ZSh0aGlzKSxkZWxldGUgaVt0aGlzLmtleV19LHQucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGVkPSExLHRoaXN9LHQucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRleHQucmVmcmVzaCgpLHRoaXMuZW5hYmxlZD0hMCx0aGlzfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JvdXAubmV4dCh0aGlzKX0sdC5wcm90b3R5cGUucHJldmlvdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ncm91cC5wcmV2aW91cyh0aGlzKX0sdC5pbnZva2VBbGw9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBvIGluIGkpZS5wdXNoKGlbb10pO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7cj5uO24rKyllW25dW3RdKCl9LHQuZGVzdHJveUFsbD1mdW5jdGlvbigpe3QuaW52b2tlQWxsKFwiZGVzdHJveVwiKX0sdC5kaXNhYmxlQWxsPWZ1bmN0aW9uKCl7dC5pbnZva2VBbGwoXCJkaXNhYmxlXCIpfSx0LmVuYWJsZUFsbD1mdW5jdGlvbigpe3QuQ29udGV4dC5yZWZyZXNoQWxsKCk7Zm9yKHZhciBlIGluIGkpaVtlXS5lbmFibGVkPSEwO3JldHVybiB0aGlzfSx0LnJlZnJlc2hBbGw9ZnVuY3Rpb24oKXt0LkNvbnRleHQucmVmcmVzaEFsbCgpfSx0LnZpZXdwb3J0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodH0sdC52aWV3cG9ydFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aH0sdC5hZGFwdGVycz1bXSx0LmRlZmF1bHRzPXtjb250ZXh0OndpbmRvdyxjb250aW51b3VzOiEwLGVuYWJsZWQ6ITAsZ3JvdXA6XCJkZWZhdWx0XCIsaG9yaXpvbnRhbDohMSxvZmZzZXQ6MH0sdC5vZmZzZXRBbGlhc2VzPXtcImJvdHRvbS1pbi12aWV3XCI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZXh0LmlubmVySGVpZ2h0KCktdGhpcy5hZGFwdGVyLm91dGVySGVpZ2h0KCl9LFwicmlnaHQtaW4tdmlld1wiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dC5pbm5lcldpZHRoKCktdGhpcy5hZGFwdGVyLm91dGVyV2lkdGgoKX19LHdpbmRvdy5XYXlwb2ludD10fSgpLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdCh0KXt3aW5kb3cuc2V0VGltZW91dCh0LDFlMy82MCl9ZnVuY3Rpb24gZSh0KXt0aGlzLmVsZW1lbnQ9dCx0aGlzLkFkYXB0ZXI9bi5BZGFwdGVyLHRoaXMuYWRhcHRlcj1uZXcgdGhpcy5BZGFwdGVyKHQpLHRoaXMua2V5PVwid2F5cG9pbnQtY29udGV4dC1cIitpLHRoaXMuZGlkU2Nyb2xsPSExLHRoaXMuZGlkUmVzaXplPSExLHRoaXMub2xkU2Nyb2xsPXt4OnRoaXMuYWRhcHRlci5zY3JvbGxMZWZ0KCkseTp0aGlzLmFkYXB0ZXIuc2Nyb2xsVG9wKCl9LHRoaXMud2F5cG9pbnRzPXt2ZXJ0aWNhbDp7fSxob3Jpem9udGFsOnt9fSx0LndheXBvaW50Q29udGV4dEtleT10aGlzLmtleSxvW3Qud2F5cG9pbnRDb250ZXh0S2V5XT10aGlzLGkrPTEsbi53aW5kb3dDb250ZXh0fHwobi53aW5kb3dDb250ZXh0PSEwLG4ud2luZG93Q29udGV4dD1uZXcgZSh3aW5kb3cpKSx0aGlzLmNyZWF0ZVRocm90dGxlZFNjcm9sbEhhbmRsZXIoKSx0aGlzLmNyZWF0ZVRocm90dGxlZFJlc2l6ZUhhbmRsZXIoKX12YXIgaT0wLG89e30sbj13aW5kb3cuV2F5cG9pbnQscj13aW5kb3cub25sb2FkO2UucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMuaG9yaXpvbnRhbD9cImhvcml6b250YWxcIjpcInZlcnRpY2FsXCI7dGhpcy53YXlwb2ludHNbZV1bdC5rZXldPXQsdGhpcy5yZWZyZXNoKCl9LGUucHJvdG90eXBlLmNoZWNrRW1wdHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLkFkYXB0ZXIuaXNFbXB0eU9iamVjdCh0aGlzLndheXBvaW50cy5ob3Jpem9udGFsKSxlPXRoaXMuQWRhcHRlci5pc0VtcHR5T2JqZWN0KHRoaXMud2F5cG9pbnRzLnZlcnRpY2FsKSxpPXRoaXMuZWxlbWVudD09dGhpcy5lbGVtZW50LndpbmRvdzt0JiZlJiYhaSYmKHRoaXMuYWRhcHRlci5vZmYoXCIud2F5cG9pbnRzXCIpLGRlbGV0ZSBvW3RoaXMua2V5XSl9LGUucHJvdG90eXBlLmNyZWF0ZVRocm90dGxlZFJlc2l6ZUhhbmRsZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZS5oYW5kbGVSZXNpemUoKSxlLmRpZFJlc2l6ZT0hMX12YXIgZT10aGlzO3RoaXMuYWRhcHRlci5vbihcInJlc2l6ZS53YXlwb2ludHNcIixmdW5jdGlvbigpe2UuZGlkUmVzaXplfHwoZS5kaWRSZXNpemU9ITAsbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCkpfSl9LGUucHJvdG90eXBlLmNyZWF0ZVRocm90dGxlZFNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZS5oYW5kbGVTY3JvbGwoKSxlLmRpZFNjcm9sbD0hMX12YXIgZT10aGlzO3RoaXMuYWRhcHRlci5vbihcInNjcm9sbC53YXlwb2ludHNcIixmdW5jdGlvbigpeyghZS5kaWRTY3JvbGx8fG4uaXNUb3VjaCkmJihlLmRpZFNjcm9sbD0hMCxuLnJlcXVlc3RBbmltYXRpb25GcmFtZSh0KSl9KX0sZS5wcm90b3R5cGUuaGFuZGxlUmVzaXplPWZ1bmN0aW9uKCl7bi5Db250ZXh0LnJlZnJlc2hBbGwoKX0sZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsPWZ1bmN0aW9uKCl7dmFyIHQ9e30sZT17aG9yaXpvbnRhbDp7bmV3U2Nyb2xsOnRoaXMuYWRhcHRlci5zY3JvbGxMZWZ0KCksb2xkU2Nyb2xsOnRoaXMub2xkU2Nyb2xsLngsZm9yd2FyZDpcInJpZ2h0XCIsYmFja3dhcmQ6XCJsZWZ0XCJ9LHZlcnRpY2FsOntuZXdTY3JvbGw6dGhpcy5hZGFwdGVyLnNjcm9sbFRvcCgpLG9sZFNjcm9sbDp0aGlzLm9sZFNjcm9sbC55LGZvcndhcmQ6XCJkb3duXCIsYmFja3dhcmQ6XCJ1cFwifX07Zm9yKHZhciBpIGluIGUpe3ZhciBvPWVbaV0sbj1vLm5ld1Njcm9sbD5vLm9sZFNjcm9sbCxyPW4/by5mb3J3YXJkOm8uYmFja3dhcmQ7Zm9yKHZhciBzIGluIHRoaXMud2F5cG9pbnRzW2ldKXt2YXIgYT10aGlzLndheXBvaW50c1tpXVtzXTtpZihudWxsIT09YS50cmlnZ2VyUG9pbnQpe3ZhciBsPW8ub2xkU2Nyb2xsPGEudHJpZ2dlclBvaW50LGg9by5uZXdTY3JvbGw+PWEudHJpZ2dlclBvaW50LHA9bCYmaCx1PSFsJiYhaDsocHx8dSkmJihhLnF1ZXVlVHJpZ2dlcihyKSx0W2EuZ3JvdXAuaWRdPWEuZ3JvdXApfX19Zm9yKHZhciBjIGluIHQpdFtjXS5mbHVzaFRyaWdnZXJzKCk7dGhpcy5vbGRTY3JvbGw9e3g6ZS5ob3Jpem9udGFsLm5ld1Njcm9sbCx5OmUudmVydGljYWwubmV3U2Nyb2xsfX0sZS5wcm90b3R5cGUuaW5uZXJIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50PT10aGlzLmVsZW1lbnQud2luZG93P24udmlld3BvcnRIZWlnaHQoKTp0aGlzLmFkYXB0ZXIuaW5uZXJIZWlnaHQoKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLndheXBvaW50c1t0LmF4aXNdW3Qua2V5XSx0aGlzLmNoZWNrRW1wdHkoKX0sZS5wcm90b3R5cGUuaW5uZXJXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQ9PXRoaXMuZWxlbWVudC53aW5kb3c/bi52aWV3cG9ydFdpZHRoKCk6dGhpcy5hZGFwdGVyLmlubmVyV2lkdGgoKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLndheXBvaW50cylmb3IodmFyIGkgaW4gdGhpcy53YXlwb2ludHNbZV0pdC5wdXNoKHRoaXMud2F5cG9pbnRzW2VdW2ldKTtmb3IodmFyIG89MCxuPXQubGVuZ3RoO24+bztvKyspdFtvXS5kZXN0cm95KCl9LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZWxlbWVudD09dGhpcy5lbGVtZW50LndpbmRvdyxpPWU/dm9pZCAwOnRoaXMuYWRhcHRlci5vZmZzZXQoKSxvPXt9O3RoaXMuaGFuZGxlU2Nyb2xsKCksdD17aG9yaXpvbnRhbDp7Y29udGV4dE9mZnNldDplPzA6aS5sZWZ0LGNvbnRleHRTY3JvbGw6ZT8wOnRoaXMub2xkU2Nyb2xsLngsY29udGV4dERpbWVuc2lvbjp0aGlzLmlubmVyV2lkdGgoKSxvbGRTY3JvbGw6dGhpcy5vbGRTY3JvbGwueCxmb3J3YXJkOlwicmlnaHRcIixiYWNrd2FyZDpcImxlZnRcIixvZmZzZXRQcm9wOlwibGVmdFwifSx2ZXJ0aWNhbDp7Y29udGV4dE9mZnNldDplPzA6aS50b3AsY29udGV4dFNjcm9sbDplPzA6dGhpcy5vbGRTY3JvbGwueSxjb250ZXh0RGltZW5zaW9uOnRoaXMuaW5uZXJIZWlnaHQoKSxvbGRTY3JvbGw6dGhpcy5vbGRTY3JvbGwueSxmb3J3YXJkOlwiZG93blwiLGJhY2t3YXJkOlwidXBcIixvZmZzZXRQcm9wOlwidG9wXCJ9fTtmb3IodmFyIHIgaW4gdCl7dmFyIHM9dFtyXTtmb3IodmFyIGEgaW4gdGhpcy53YXlwb2ludHNbcl0pe3ZhciBsLGgscCx1LGMsZD10aGlzLndheXBvaW50c1tyXVthXSxmPWQub3B0aW9ucy5vZmZzZXQsdz1kLnRyaWdnZXJQb2ludCx5PTAsZz1udWxsPT13O2QuZWxlbWVudCE9PWQuZWxlbWVudC53aW5kb3cmJih5PWQuYWRhcHRlci5vZmZzZXQoKVtzLm9mZnNldFByb3BdKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBmP2Y9Zi5hcHBseShkKTpcInN0cmluZ1wiPT10eXBlb2YgZiYmKGY9cGFyc2VGbG9hdChmKSxkLm9wdGlvbnMub2Zmc2V0LmluZGV4T2YoXCIlXCIpPi0xJiYoZj1NYXRoLmNlaWwocy5jb250ZXh0RGltZW5zaW9uKmYvMTAwKSkpLGw9cy5jb250ZXh0U2Nyb2xsLXMuY29udGV4dE9mZnNldCxkLnRyaWdnZXJQb2ludD1NYXRoLmZsb29yKHkrbC1mKSxoPXc8cy5vbGRTY3JvbGwscD1kLnRyaWdnZXJQb2ludD49cy5vbGRTY3JvbGwsdT1oJiZwLGM9IWgmJiFwLCFnJiZ1PyhkLnF1ZXVlVHJpZ2dlcihzLmJhY2t3YXJkKSxvW2QuZ3JvdXAuaWRdPWQuZ3JvdXApOiFnJiZjPyhkLnF1ZXVlVHJpZ2dlcihzLmZvcndhcmQpLG9bZC5ncm91cC5pZF09ZC5ncm91cCk6ZyYmcy5vbGRTY3JvbGw+PWQudHJpZ2dlclBvaW50JiYoZC5xdWV1ZVRyaWdnZXIocy5mb3J3YXJkKSxvW2QuZ3JvdXAuaWRdPWQuZ3JvdXApfX1yZXR1cm4gbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gbylvW3RdLmZsdXNoVHJpZ2dlcnMoKX0pLHRoaXN9LGUuZmluZE9yQ3JlYXRlQnlFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiBlLmZpbmRCeUVsZW1lbnQodCl8fG5ldyBlKHQpfSxlLnJlZnJlc2hBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gbylvW3RdLnJlZnJlc2goKX0sZS5maW5kQnlFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiBvW3Qud2F5cG9pbnRDb250ZXh0S2V5XX0sd2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe3ImJnIoKSxlLnJlZnJlc2hBbGwoKX0sbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oZSl7dmFyIGk9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZXx8dDtpLmNhbGwod2luZG93LGUpfSxuLkNvbnRleHQ9ZX0oKSxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQodCxlKXtyZXR1cm4gdC50cmlnZ2VyUG9pbnQtZS50cmlnZ2VyUG9pbnR9ZnVuY3Rpb24gZSh0LGUpe3JldHVybiBlLnRyaWdnZXJQb2ludC10LnRyaWdnZXJQb2ludH1mdW5jdGlvbiBpKHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5heGlzPXQuYXhpcyx0aGlzLmlkPXRoaXMubmFtZStcIi1cIit0aGlzLmF4aXMsdGhpcy53YXlwb2ludHM9W10sdGhpcy5jbGVhclRyaWdnZXJRdWV1ZXMoKSxvW3RoaXMuYXhpc11bdGhpcy5uYW1lXT10aGlzfXZhciBvPXt2ZXJ0aWNhbDp7fSxob3Jpem9udGFsOnt9fSxuPXdpbmRvdy5XYXlwb2ludDtpLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy53YXlwb2ludHMucHVzaCh0KX0saS5wcm90b3R5cGUuY2xlYXJUcmlnZ2VyUXVldWVzPWZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyUXVldWVzPXt1cDpbXSxkb3duOltdLGxlZnQ6W10scmlnaHQ6W119fSxpLnByb3RvdHlwZS5mbHVzaFRyaWdnZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciBpIGluIHRoaXMudHJpZ2dlclF1ZXVlcyl7dmFyIG89dGhpcy50cmlnZ2VyUXVldWVzW2ldLG49XCJ1cFwiPT09aXx8XCJsZWZ0XCI9PT1pO28uc29ydChuP2U6dCk7Zm9yKHZhciByPTAscz1vLmxlbmd0aDtzPnI7cis9MSl7dmFyIGE9b1tyXTsoYS5vcHRpb25zLmNvbnRpbnVvdXN8fHI9PT1vLmxlbmd0aC0xKSYmYS50cmlnZ2VyKFtpXSl9fXRoaXMuY2xlYXJUcmlnZ2VyUXVldWVzKCl9LGkucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oZSl7dGhpcy53YXlwb2ludHMuc29ydCh0KTt2YXIgaT1uLkFkYXB0ZXIuaW5BcnJheShlLHRoaXMud2F5cG9pbnRzKSxvPWk9PT10aGlzLndheXBvaW50cy5sZW5ndGgtMTtyZXR1cm4gbz9udWxsOnRoaXMud2F5cG9pbnRzW2krMV19LGkucHJvdG90eXBlLnByZXZpb3VzPWZ1bmN0aW9uKGUpe3RoaXMud2F5cG9pbnRzLnNvcnQodCk7dmFyIGk9bi5BZGFwdGVyLmluQXJyYXkoZSx0aGlzLndheXBvaW50cyk7cmV0dXJuIGk/dGhpcy53YXlwb2ludHNbaS0xXTpudWxsfSxpLnByb3RvdHlwZS5xdWV1ZVRyaWdnZXI9ZnVuY3Rpb24odCxlKXt0aGlzLnRyaWdnZXJRdWV1ZXNbZV0ucHVzaCh0KX0saS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPW4uQWRhcHRlci5pbkFycmF5KHQsdGhpcy53YXlwb2ludHMpO2U+LTEmJnRoaXMud2F5cG9pbnRzLnNwbGljZShlLDEpfSxpLnByb3RvdHlwZS5maXJzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndheXBvaW50c1swXX0saS5wcm90b3R5cGUubGFzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndheXBvaW50c1t0aGlzLndheXBvaW50cy5sZW5ndGgtMV19LGkuZmluZE9yQ3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBvW3QuYXhpc11bdC5uYW1lXXx8bmV3IGkodCl9LG4uR3JvdXA9aX0oKSxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQodCl7dGhpcy4kZWxlbWVudD1lKHQpfXZhciBlPXdpbmRvdy5qUXVlcnksaT13aW5kb3cuV2F5cG9pbnQ7ZS5lYWNoKFtcImlubmVySGVpZ2h0XCIsXCJpbm5lcldpZHRoXCIsXCJvZmZcIixcIm9mZnNldFwiLFwib25cIixcIm91dGVySGVpZ2h0XCIsXCJvdXRlcldpZHRoXCIsXCJzY3JvbGxMZWZ0XCIsXCJzY3JvbGxUb3BcIl0sZnVuY3Rpb24oZSxpKXt0LnByb3RvdHlwZVtpXT1mdW5jdGlvbigpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuJGVsZW1lbnRbaV0uYXBwbHkodGhpcy4kZWxlbWVudCx0KX19KSxlLmVhY2goW1wiZXh0ZW5kXCIsXCJpbkFycmF5XCIsXCJpc0VtcHR5T2JqZWN0XCJdLGZ1bmN0aW9uKGksbyl7dFtvXT1lW29dfSksaS5hZGFwdGVycy5wdXNoKHtuYW1lOlwianF1ZXJ5XCIsQWRhcHRlcjp0fSksaS5BZGFwdGVyPXR9KCksZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPVtdLG89YXJndW1lbnRzWzBdO3JldHVybiB0LmlzRnVuY3Rpb24oYXJndW1lbnRzWzBdKSYmKG89dC5leHRlbmQoe30sYXJndW1lbnRzWzFdKSxvLmhhbmRsZXI9YXJndW1lbnRzWzBdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj10LmV4dGVuZCh7fSxvLHtlbGVtZW50OnRoaXN9KTtcInN0cmluZ1wiPT10eXBlb2Ygbi5jb250ZXh0JiYobi5jb250ZXh0PXQodGhpcykuY2xvc2VzdChuLmNvbnRleHQpWzBdKSxpLnB1c2gobmV3IGUobikpfSksaX19dmFyIGU9d2luZG93LldheXBvaW50O3dpbmRvdy5qUXVlcnkmJih3aW5kb3cualF1ZXJ5LmZuLndheXBvaW50PXQod2luZG93LmpRdWVyeSkpLHdpbmRvdy5aZXB0byYmKHdpbmRvdy5aZXB0by5mbi53YXlwb2ludD10KHdpbmRvdy5aZXB0bykpfSgpOyIsIi8qISBsaWdodGdhbGxlcnkgLSB2MS42LjEwIC0gMjAxOC0wNS0wMVxyXG4qIGh0dHA6Ly9zYWNoaW5jaG9vbHVyLmdpdGh1Yi5pby9saWdodEdhbGxlcnkvXHJcbiogQ29weXJpZ2h0IChjKSAyMDE4IFNhY2hpbiBOOyBMaWNlbnNlZCBHUEx2MyAqL1xyXG4hZnVuY3Rpb24oYSxiKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImpxdWVyeVwiXSxmdW5jdGlvbihhKXtyZXR1cm4gYihhKX0pOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWIocmVxdWlyZShcImpxdWVyeVwiKSk6YihhLmpRdWVyeSl9KHRoaXMsZnVuY3Rpb24oYSl7IWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihiLGQpe2lmKHRoaXMuZWw9Yix0aGlzLiRlbD1hKGIpLHRoaXMucz1hLmV4dGVuZCh7fSxjLGQpLHRoaXMucy5keW5hbWljJiZcInVuZGVmaW5lZFwiIT09dGhpcy5zLmR5bmFtaWNFbCYmdGhpcy5zLmR5bmFtaWNFbC5jb25zdHJ1Y3Rvcj09PUFycmF5JiYhdGhpcy5zLmR5bmFtaWNFbC5sZW5ndGgpdGhyb3dcIldoZW4gdXNpbmcgZHluYW1pYyBtb2RlLCB5b3UgbXVzdCBhbHNvIGRlZmluZSBkeW5hbWljRWwgYXMgYW4gQXJyYXkuXCI7cmV0dXJuIHRoaXMubW9kdWxlcz17fSx0aGlzLmxHYWxsZXJ5T249ITEsdGhpcy5sZ0J1c3k9ITEsdGhpcy5oaWRlQmFydGltZW91dD0hMSx0aGlzLmlzVG91Y2g9XCJvbnRvdWNoc3RhcnRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0aGlzLnMuc2xpZGVFbmRBbmltYXRvaW4mJih0aGlzLnMuaGlkZUNvbnRyb2xPbkVuZD0hMSksdGhpcy5zLmR5bmFtaWM/dGhpcy4kaXRlbXM9dGhpcy5zLmR5bmFtaWNFbDpcInRoaXNcIj09PXRoaXMucy5zZWxlY3Rvcj90aGlzLiRpdGVtcz10aGlzLiRlbDpcIlwiIT09dGhpcy5zLnNlbGVjdG9yP3RoaXMucy5zZWxlY3RXaXRoaW4/dGhpcy4kaXRlbXM9YSh0aGlzLnMuc2VsZWN0V2l0aGluKS5maW5kKHRoaXMucy5zZWxlY3Rvcik6dGhpcy4kaXRlbXM9dGhpcy4kZWwuZmluZChhKHRoaXMucy5zZWxlY3RvcikpOnRoaXMuJGl0ZW1zPXRoaXMuJGVsLmNoaWxkcmVuKCksdGhpcy4kc2xpZGU9XCJcIix0aGlzLiRvdXRlcj1cIlwiLHRoaXMuaW5pdCgpLHRoaXN9dmFyIGM9e21vZGU6XCJsZy1zbGlkZVwiLGNzc0Vhc2luZzpcImVhc2VcIixlYXNpbmc6XCJsaW5lYXJcIixzcGVlZDo2MDAsaGVpZ2h0OlwiMTAwJVwiLHdpZHRoOlwiMTAwJVwiLGFkZENsYXNzOlwiXCIsc3RhcnRDbGFzczpcImxnLXN0YXJ0LXpvb21cIixiYWNrZHJvcER1cmF0aW9uOjE1MCxoaWRlQmFyc0RlbGF5OjZlMyx1c2VMZWZ0OiExLGNsb3NhYmxlOiEwLGxvb3A6ITAsZXNjS2V5OiEwLGtleVByZXNzOiEwLGNvbnRyb2xzOiEwLHNsaWRlRW5kQW5pbWF0b2luOiEwLGhpZGVDb250cm9sT25FbmQ6ITEsbW91c2V3aGVlbDohMCxnZXRDYXB0aW9uRnJvbVRpdGxlT3JBbHQ6ITAsYXBwZW5kU3ViSHRtbFRvOlwiLmxnLXN1Yi1odG1sXCIsc3ViSHRtbFNlbGVjdG9yUmVsYXRpdmU6ITEscHJlbG9hZDoxLHNob3dBZnRlckxvYWQ6ITAsc2VsZWN0b3I6XCJcIixzZWxlY3RXaXRoaW46XCJcIixuZXh0SHRtbDpcIlwiLHByZXZIdG1sOlwiXCIsaW5kZXg6ITEsaWZyYW1lTWF4V2lkdGg6XCIxMDAlXCIsZG93bmxvYWQ6ITAsY291bnRlcjohMCxhcHBlbmRDb3VudGVyVG86XCIubGctdG9vbGJhclwiLHN3aXBlVGhyZXNob2xkOjUwLGVuYWJsZVN3aXBlOiEwLGVuYWJsZURyYWc6ITAsZHluYW1pYzohMSxkeW5hbWljRWw6W10sZ2FsbGVyeUlkOjF9O2IucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2Iucy5wcmVsb2FkPmIuJGl0ZW1zLmxlbmd0aCYmKGIucy5wcmVsb2FkPWIuJGl0ZW1zLmxlbmd0aCk7dmFyIGM9d2luZG93LmxvY2F0aW9uLmhhc2g7Yy5pbmRleE9mKFwibGc9XCIrdGhpcy5zLmdhbGxlcnlJZCk+MCYmKGIuaW5kZXg9cGFyc2VJbnQoYy5zcGxpdChcIiZzbGlkZT1cIilbMV0sMTApLGEoXCJib2R5XCIpLmFkZENsYXNzKFwibGctZnJvbS1oYXNoXCIpLGEoXCJib2R5XCIpLmhhc0NsYXNzKFwibGctb25cIil8fChzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5idWlsZChiLmluZGV4KX0pLGEoXCJib2R5XCIpLmFkZENsYXNzKFwibGctb25cIikpKSxiLnMuZHluYW1pYz8oYi4kZWwudHJpZ2dlcihcIm9uQmVmb3JlT3Blbi5sZ1wiKSxiLmluZGV4PWIucy5pbmRleHx8MCxhKFwiYm9keVwiKS5oYXNDbGFzcyhcImxnLW9uXCIpfHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5idWlsZChiLmluZGV4KSxhKFwiYm9keVwiKS5hZGRDbGFzcyhcImxnLW9uXCIpfSkpOmIuJGl0ZW1zLm9uKFwiY2xpY2subGdjdXN0b21cIixmdW5jdGlvbihjKXt0cnl7Yy5wcmV2ZW50RGVmYXVsdCgpLGMucHJldmVudERlZmF1bHQoKX1jYXRjaChhKXtjLnJldHVyblZhbHVlPSExfWIuJGVsLnRyaWdnZXIoXCJvbkJlZm9yZU9wZW4ubGdcIiksYi5pbmRleD1iLnMuaW5kZXh8fGIuJGl0ZW1zLmluZGV4KHRoaXMpLGEoXCJib2R5XCIpLmhhc0NsYXNzKFwibGctb25cIil8fChiLmJ1aWxkKGIuaW5kZXgpLGEoXCJib2R5XCIpLmFkZENsYXNzKFwibGctb25cIikpfSl9LGIucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7Yy5zdHJ1Y3R1cmUoKSxhLmVhY2goYS5mbi5saWdodEdhbGxlcnkubW9kdWxlcyxmdW5jdGlvbihiKXtjLm1vZHVsZXNbYl09bmV3IGEuZm4ubGlnaHRHYWxsZXJ5Lm1vZHVsZXNbYl0oYy5lbCl9KSxjLnNsaWRlKGIsITEsITEsITEpLGMucy5rZXlQcmVzcyYmYy5rZXlQcmVzcygpLGMuJGl0ZW1zLmxlbmd0aD4xPyhjLmFycm93KCksc2V0VGltZW91dChmdW5jdGlvbigpe2MuZW5hYmxlRHJhZygpLGMuZW5hYmxlU3dpcGUoKX0sNTApLGMucy5tb3VzZXdoZWVsJiZjLm1vdXNld2hlZWwoKSk6Yy4kc2xpZGUub24oXCJjbGljay5sZ1wiLGZ1bmN0aW9uKCl7Yy4kZWwudHJpZ2dlcihcIm9uU2xpZGVDbGljay5sZ1wiKX0pLGMuY291bnRlcigpLGMuY2xvc2VHYWxsZXJ5KCksYy4kZWwudHJpZ2dlcihcIm9uQWZ0ZXJPcGVuLmxnXCIpLGMuJG91dGVyLm9uKFwibW91c2Vtb3ZlLmxnIGNsaWNrLmxnIHRvdWNoc3RhcnQubGdcIixmdW5jdGlvbigpe2MuJG91dGVyLnJlbW92ZUNsYXNzKFwibGctaGlkZS1pdGVtc1wiKSxjbGVhclRpbWVvdXQoYy5oaWRlQmFydGltZW91dCksYy5oaWRlQmFydGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy1oaWRlLWl0ZW1zXCIpfSxjLnMuaGlkZUJhcnNEZWxheSl9KSxjLiRvdXRlci50cmlnZ2VyKFwibW91c2Vtb3ZlLmxnXCIpfSxiLnByb3RvdHlwZS5zdHJ1Y3R1cmU9ZnVuY3Rpb24oKXt2YXIgYixjPVwiXCIsZD1cIlwiLGU9MCxmPVwiXCIsZz10aGlzO2ZvcihhKFwiYm9keVwiKS5hcHBlbmQoJzxkaXYgY2xhc3M9XCJsZy1iYWNrZHJvcFwiPjwvZGl2PicpLGEoXCIubGctYmFja2Ryb3BcIikuY3NzKFwidHJhbnNpdGlvbi1kdXJhdGlvblwiLHRoaXMucy5iYWNrZHJvcER1cmF0aW9uK1wibXNcIiksZT0wO2U8dGhpcy4kaXRlbXMubGVuZ3RoO2UrKyljKz0nPGRpdiBjbGFzcz1cImxnLWl0ZW1cIj48L2Rpdj4nO2lmKHRoaXMucy5jb250cm9scyYmdGhpcy4kaXRlbXMubGVuZ3RoPjEmJihkPSc8ZGl2IGNsYXNzPVwibGctYWN0aW9uc1wiPjxidXR0b24gY2xhc3M9XCJsZy1wcmV2IGxnLWljb25cIj4nK3RoaXMucy5wcmV2SHRtbCsnPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cImxnLW5leHQgbGctaWNvblwiPicrdGhpcy5zLm5leHRIdG1sK1wiPC9idXR0b24+PC9kaXY+XCIpLFwiLmxnLXN1Yi1odG1sXCI9PT10aGlzLnMuYXBwZW5kU3ViSHRtbFRvJiYoZj0nPGRpdiBjbGFzcz1cImxnLXN1Yi1odG1sXCI+PC9kaXY+JyksYj0nPGRpdiBjbGFzcz1cImxnLW91dGVyICcrdGhpcy5zLmFkZENsYXNzK1wiIFwiK3RoaXMucy5zdGFydENsYXNzKydcIj48ZGl2IGNsYXNzPVwibGdcIiBzdHlsZT1cIndpZHRoOicrdGhpcy5zLndpZHRoK1wiOyBoZWlnaHQ6XCIrdGhpcy5zLmhlaWdodCsnXCI+PGRpdiBjbGFzcz1cImxnLWlubmVyXCI+JytjKyc8L2Rpdj48ZGl2IGNsYXNzPVwibGctdG9vbGJhciBsZy1ncm91cFwiPjxzcGFuIGNsYXNzPVwibGctY2xvc2UgbGctaWNvblwiPjwvc3Bhbj48L2Rpdj4nK2QrZitcIjwvZGl2PjwvZGl2PlwiLGEoXCJib2R5XCIpLmFwcGVuZChiKSx0aGlzLiRvdXRlcj1hKFwiLmxnLW91dGVyXCIpLHRoaXMuJHNsaWRlPXRoaXMuJG91dGVyLmZpbmQoXCIubGctaXRlbVwiKSx0aGlzLnMudXNlTGVmdD8odGhpcy4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy11c2UtbGVmdFwiKSx0aGlzLnMubW9kZT1cImxnLXNsaWRlXCIpOnRoaXMuJG91dGVyLmFkZENsYXNzKFwibGctdXNlLWNzczNcIiksZy5zZXRUb3AoKSxhKHdpbmRvdykub24oXCJyZXNpemUubGcgb3JpZW50YXRpb25jaGFuZ2UubGdcIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnLnNldFRvcCgpfSwxMDApfSksdGhpcy4kc2xpZGUuZXEodGhpcy5pbmRleCkuYWRkQ2xhc3MoXCJsZy1jdXJyZW50XCIpLHRoaXMuZG9Dc3MoKT90aGlzLiRvdXRlci5hZGRDbGFzcyhcImxnLWNzczNcIik6KHRoaXMuJG91dGVyLmFkZENsYXNzKFwibGctY3NzXCIpLHRoaXMucy5zcGVlZD0wKSx0aGlzLiRvdXRlci5hZGRDbGFzcyh0aGlzLnMubW9kZSksdGhpcy5zLmVuYWJsZURyYWcmJnRoaXMuJGl0ZW1zLmxlbmd0aD4xJiZ0aGlzLiRvdXRlci5hZGRDbGFzcyhcImxnLWdyYWJcIiksdGhpcy5zLnNob3dBZnRlckxvYWQmJnRoaXMuJG91dGVyLmFkZENsYXNzKFwibGctc2hvdy1hZnRlci1sb2FkXCIpLHRoaXMuZG9Dc3MoKSl7dmFyIGg9dGhpcy4kb3V0ZXIuZmluZChcIi5sZy1pbm5lclwiKTtoLmNzcyhcInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uXCIsdGhpcy5zLmNzc0Vhc2luZyksaC5jc3MoXCJ0cmFuc2l0aW9uLWR1cmF0aW9uXCIsdGhpcy5zLnNwZWVkK1wibXNcIil9c2V0VGltZW91dChmdW5jdGlvbigpe2EoXCIubGctYmFja2Ryb3BcIikuYWRkQ2xhc3MoXCJpblwiKX0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLiRvdXRlci5hZGRDbGFzcyhcImxnLXZpc2libGVcIil9LHRoaXMucy5iYWNrZHJvcER1cmF0aW9uKSx0aGlzLnMuZG93bmxvYWQmJnRoaXMuJG91dGVyLmZpbmQoXCIubGctdG9vbGJhclwiKS5hcHBlbmQoJzxhIGlkPVwibGctZG93bmxvYWRcIiB0YXJnZXQ9XCJfYmxhbmtcIiBkb3dubG9hZCBjbGFzcz1cImxnLWRvd25sb2FkIGxnLWljb25cIj48L2E+JyksdGhpcy5wcmV2U2Nyb2xsVG9wPWEod2luZG93KS5zY3JvbGxUb3AoKX0sYi5wcm90b3R5cGUuc2V0VG9wPWZ1bmN0aW9uKCl7aWYoXCIxMDAlXCIhPT10aGlzLnMuaGVpZ2h0KXt2YXIgYj1hKHdpbmRvdykuaGVpZ2h0KCksYz0oYi1wYXJzZUludCh0aGlzLnMuaGVpZ2h0LDEwKSkvMixkPXRoaXMuJG91dGVyLmZpbmQoXCIubGdcIik7Yj49cGFyc2VJbnQodGhpcy5zLmhlaWdodCwxMCk/ZC5jc3MoXCJ0b3BcIixjK1wicHhcIik6ZC5jc3MoXCJ0b3BcIixcIjBweFwiKX19LGIucHJvdG90eXBlLmRvQ3NzPWZ1bmN0aW9uKCl7cmV0dXJuISFmdW5jdGlvbigpe3ZhciBhPVtcInRyYW5zaXRpb25cIixcIk1velRyYW5zaXRpb25cIixcIldlYmtpdFRyYW5zaXRpb25cIixcIk9UcmFuc2l0aW9uXCIsXCJtc1RyYW5zaXRpb25cIixcIktodG1sVHJhbnNpdGlvblwiXSxiPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxjPTA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdaW4gYi5zdHlsZSlyZXR1cm4hMH0oKX0sYi5wcm90b3R5cGUuaXNWaWRlbz1mdW5jdGlvbihhLGIpe3ZhciBjO2lmKGM9dGhpcy5zLmR5bmFtaWM/dGhpcy5zLmR5bmFtaWNFbFtiXS5odG1sOnRoaXMuJGl0ZW1zLmVxKGIpLmF0dHIoXCJkYXRhLWh0bWxcIiksIWEpcmV0dXJuIGM/e2h0bWw1OiEwfTooY29uc29sZS5lcnJvcihcImxpZ2h0R2FsbGVyeSA6LSBkYXRhLXNyYyBpcyBub3QgcHZvdmlkZWQgb24gc2xpZGUgaXRlbSBcIisoYisxKStcIi4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2VsZWN0b3IgcHJvcGVydHkgaXMgcHJvcGVybHkgY29uZmlndXJlZC4gTW9yZSBpbmZvIC0gaHR0cDovL3NhY2hpbmNob29sdXIuZ2l0aHViLmlvL2xpZ2h0R2FsbGVyeS9kZW1vcy9odG1sLW1hcmt1cC5odG1sXCIpLCExKTt2YXIgZD1hLm1hdGNoKC9cXC9cXC8oPzp3d3dcXC4pP3lvdXR1KD86XFwuYmV8YmVcXC5jb20pXFwvKD86d2F0Y2hcXD92PXxlbWJlZFxcLyk/KFthLXowLTlcXC1cXF9cXCVdKykvaSksZT1hLm1hdGNoKC9cXC9cXC8oPzp3d3dcXC4pP3ZpbWVvLmNvbVxcLyhbMC05YS16XFwtX10rKS9pKSxmPWEubWF0Y2goL1xcL1xcLyg/Ond3d1xcLik/ZGFpLmx5XFwvKFswLTlhLXpcXC1fXSspL2kpLGc9YS5tYXRjaCgvXFwvXFwvKD86d3d3XFwuKT8oPzp2a1xcLmNvbXx2a29udGFrdGVcXC5ydSlcXC8oPzp2aWRlb19leHRcXC5waHBcXD8pKC4qKS9pKTtyZXR1cm4gZD97eW91dHViZTpkfTplP3t2aW1lbzplfTpmP3tkYWlseW1vdGlvbjpmfTpnP3t2azpnfTp2b2lkIDB9LGIucHJvdG90eXBlLmNvdW50ZXI9ZnVuY3Rpb24oKXt0aGlzLnMuY291bnRlciYmYSh0aGlzLnMuYXBwZW5kQ291bnRlclRvKS5hcHBlbmQoJzxkaXYgaWQ9XCJsZy1jb3VudGVyXCI+PHNwYW4gaWQ9XCJsZy1jb3VudGVyLWN1cnJlbnRcIj4nKyhwYXJzZUludCh0aGlzLmluZGV4LDEwKSsxKSsnPC9zcGFuPiAvIDxzcGFuIGlkPVwibGctY291bnRlci1hbGxcIj4nK3RoaXMuJGl0ZW1zLmxlbmd0aCtcIjwvc3Bhbj48L2Rpdj5cIil9LGIucHJvdG90eXBlLmFkZEh0bWw9ZnVuY3Rpb24oYil7dmFyIGMsZCxlPW51bGw7aWYodGhpcy5zLmR5bmFtaWM/dGhpcy5zLmR5bmFtaWNFbFtiXS5zdWJIdG1sVXJsP2M9dGhpcy5zLmR5bmFtaWNFbFtiXS5zdWJIdG1sVXJsOmU9dGhpcy5zLmR5bmFtaWNFbFtiXS5zdWJIdG1sOihkPXRoaXMuJGl0ZW1zLmVxKGIpLGQuYXR0cihcImRhdGEtc3ViLWh0bWwtdXJsXCIpP2M9ZC5hdHRyKFwiZGF0YS1zdWItaHRtbC11cmxcIik6KGU9ZC5hdHRyKFwiZGF0YS1zdWItaHRtbFwiKSx0aGlzLnMuZ2V0Q2FwdGlvbkZyb21UaXRsZU9yQWx0JiYhZSYmKGU9ZC5hdHRyKFwidGl0bGVcIil8fGQuZmluZChcImltZ1wiKS5maXJzdCgpLmF0dHIoXCJhbHRcIikpKSksIWMpaWYodm9pZCAwIT09ZSYmbnVsbCE9PWUpe3ZhciBmPWUuc3Vic3RyaW5nKDAsMSk7XCIuXCIhPT1mJiZcIiNcIiE9PWZ8fChlPXRoaXMucy5zdWJIdG1sU2VsZWN0b3JSZWxhdGl2ZSYmIXRoaXMucy5keW5hbWljP2QuZmluZChlKS5odG1sKCk6YShlKS5odG1sKCkpfWVsc2UgZT1cIlwiO1wiLmxnLXN1Yi1odG1sXCI9PT10aGlzLnMuYXBwZW5kU3ViSHRtbFRvP2M/dGhpcy4kb3V0ZXIuZmluZCh0aGlzLnMuYXBwZW5kU3ViSHRtbFRvKS5sb2FkKGMpOnRoaXMuJG91dGVyLmZpbmQodGhpcy5zLmFwcGVuZFN1Ykh0bWxUbykuaHRtbChlKTpjP3RoaXMuJHNsaWRlLmVxKGIpLmxvYWQoYyk6dGhpcy4kc2xpZGUuZXEoYikuYXBwZW5kKGUpLHZvaWQgMCE9PWUmJm51bGwhPT1lJiYoXCJcIj09PWU/dGhpcy4kb3V0ZXIuZmluZCh0aGlzLnMuYXBwZW5kU3ViSHRtbFRvKS5hZGRDbGFzcyhcImxnLWVtcHR5LWh0bWxcIik6dGhpcy4kb3V0ZXIuZmluZCh0aGlzLnMuYXBwZW5kU3ViSHRtbFRvKS5yZW1vdmVDbGFzcyhcImxnLWVtcHR5LWh0bWxcIikpLHRoaXMuJGVsLnRyaWdnZXIoXCJvbkFmdGVyQXBwZW5kU3ViSHRtbC5sZ1wiLFtiXSl9LGIucHJvdG90eXBlLnByZWxvYWQ9ZnVuY3Rpb24oYSl7dmFyIGI9MSxjPTE7Zm9yKGI9MTtiPD10aGlzLnMucHJlbG9hZCYmIShiPj10aGlzLiRpdGVtcy5sZW5ndGgtYSk7YisrKXRoaXMubG9hZENvbnRlbnQoYStiLCExLDApO2ZvcihjPTE7Yzw9dGhpcy5zLnByZWxvYWQmJiEoYS1jPDApO2MrKyl0aGlzLmxvYWRDb250ZW50KGEtYywhMSwwKX0sYi5wcm90b3R5cGUubG9hZENvbnRlbnQ9ZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoLGksaixrPXRoaXMsbD0hMSxtPWZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPVtdLGU9MDtlPGIubGVuZ3RoO2UrKyl7dmFyIGc9YltlXS5zcGxpdChcIiBcIik7XCJcIj09PWdbMF0mJmcuc3BsaWNlKDAsMSksZC5wdXNoKGdbMF0pLGMucHVzaChnWzFdKX1mb3IodmFyIGg9YSh3aW5kb3cpLndpZHRoKCksaT0wO2k8Yy5sZW5ndGg7aSsrKWlmKHBhcnNlSW50KGNbaV0sMTApPmgpe2Y9ZFtpXTticmVha319O2lmKGsucy5keW5hbWljKXtpZihrLnMuZHluYW1pY0VsW2JdLnBvc3RlciYmKGw9ITAsZz1rLnMuZHluYW1pY0VsW2JdLnBvc3Rlciksaj1rLnMuZHluYW1pY0VsW2JdLmh0bWwsZj1rLnMuZHluYW1pY0VsW2JdLnNyYyxrLnMuZHluYW1pY0VsW2JdLnJlc3BvbnNpdmUpe20oay5zLmR5bmFtaWNFbFtiXS5yZXNwb25zaXZlLnNwbGl0KFwiLFwiKSl9aD1rLnMuZHluYW1pY0VsW2JdLnNyY3NldCxpPWsucy5keW5hbWljRWxbYl0uc2l6ZXN9ZWxzZXtpZihrLiRpdGVtcy5lcShiKS5hdHRyKFwiZGF0YS1wb3N0ZXJcIikmJihsPSEwLGc9ay4kaXRlbXMuZXEoYikuYXR0cihcImRhdGEtcG9zdGVyXCIpKSxqPWsuJGl0ZW1zLmVxKGIpLmF0dHIoXCJkYXRhLWh0bWxcIiksZj1rLiRpdGVtcy5lcShiKS5hdHRyKFwiaHJlZlwiKXx8ay4kaXRlbXMuZXEoYikuYXR0cihcImRhdGEtc3JjXCIpLGsuJGl0ZW1zLmVxKGIpLmF0dHIoXCJkYXRhLXJlc3BvbnNpdmVcIikpe20oay4kaXRlbXMuZXEoYikuYXR0cihcImRhdGEtcmVzcG9uc2l2ZVwiKS5zcGxpdChcIixcIikpfWg9ay4kaXRlbXMuZXEoYikuYXR0cihcImRhdGEtc3Jjc2V0XCIpLGk9ay4kaXRlbXMuZXEoYikuYXR0cihcImRhdGEtc2l6ZXNcIil9dmFyIG49ITE7ay5zLmR5bmFtaWM/ay5zLmR5bmFtaWNFbFtiXS5pZnJhbWUmJihuPSEwKTpcInRydWVcIj09PWsuJGl0ZW1zLmVxKGIpLmF0dHIoXCJkYXRhLWlmcmFtZVwiKSYmKG49ITApO3ZhciBvPWsuaXNWaWRlbyhmLGIpO2lmKCFrLiRzbGlkZS5lcShiKS5oYXNDbGFzcyhcImxnLWxvYWRlZFwiKSl7aWYobilrLiRzbGlkZS5lcShiKS5wcmVwZW5kKCc8ZGl2IGNsYXNzPVwibGctdmlkZW8tY29udCBsZy1oYXMtaWZyYW1lXCIgc3R5bGU9XCJtYXgtd2lkdGg6JytrLnMuaWZyYW1lTWF4V2lkdGgrJ1wiPjxkaXYgY2xhc3M9XCJsZy12aWRlb1wiPjxpZnJhbWUgY2xhc3M9XCJsZy1vYmplY3RcIiBmcmFtZWJvcmRlcj1cIjBcIiBzcmM9XCInK2YrJ1wiICBhbGxvd2Z1bGxzY3JlZW49XCJ0cnVlXCI+PC9pZnJhbWU+PC9kaXY+PC9kaXY+Jyk7ZWxzZSBpZihsKXt2YXIgcD1cIlwiO3A9byYmby55b3V0dWJlP1wibGctaGFzLXlvdXR1YmVcIjpvJiZvLnZpbWVvP1wibGctaGFzLXZpbWVvXCI6XCJsZy1oYXMtaHRtbDVcIixrLiRzbGlkZS5lcShiKS5wcmVwZW5kKCc8ZGl2IGNsYXNzPVwibGctdmlkZW8tY29udCAnK3ArJyBcIj48ZGl2IGNsYXNzPVwibGctdmlkZW9cIj48c3BhbiBjbGFzcz1cImxnLXZpZGVvLXBsYXlcIj48L3NwYW4+PGltZyBjbGFzcz1cImxnLW9iamVjdCBsZy1oYXMtcG9zdGVyXCIgc3JjPVwiJytnKydcIiAvPjwvZGl2PjwvZGl2PicpfWVsc2Ugbz8oay4kc2xpZGUuZXEoYikucHJlcGVuZCgnPGRpdiBjbGFzcz1cImxnLXZpZGVvLWNvbnQgXCI+PGRpdiBjbGFzcz1cImxnLXZpZGVvXCI+PC9kaXY+PC9kaXY+Jyksay4kZWwudHJpZ2dlcihcImhhc1ZpZGVvLmxnXCIsW2IsZixqXSkpOmsuJHNsaWRlLmVxKGIpLnByZXBlbmQoJzxkaXYgY2xhc3M9XCJsZy1pbWctd3JhcFwiPjxpbWcgY2xhc3M9XCJsZy1vYmplY3QgbGctaW1hZ2VcIiBzcmM9XCInK2YrJ1wiIC8+PC9kaXY+Jyk7aWYoay4kZWwudHJpZ2dlcihcIm9uQWZlckFwcGVuZFNsaWRlLmxnXCIsW2JdKSxlPWsuJHNsaWRlLmVxKGIpLmZpbmQoXCIubGctb2JqZWN0XCIpLGkmJmUuYXR0cihcInNpemVzXCIsaSksaCl7ZS5hdHRyKFwic3Jjc2V0XCIsaCk7dHJ5e3BpY3R1cmVmaWxsKHtlbGVtZW50czpbZVswXV19KX1jYXRjaChhKXtjb25zb2xlLndhcm4oXCJsaWdodEdhbGxlcnkgOi0gSWYgeW91IHdhbnQgc3Jjc2V0IHRvIGJlIHN1cHBvcnRlZCBmb3Igb2xkZXIgYnJvd3NlciBwbGVhc2UgaW5jbHVkZSBwaWN0dXJlZmlsIHZlcnNpb24gMiBqYXZhc2NyaXB0IGxpYnJhcnkgaW4geW91ciBkb2N1bWVudC5cIil9fVwiLmxnLXN1Yi1odG1sXCIhPT10aGlzLnMuYXBwZW5kU3ViSHRtbFRvJiZrLmFkZEh0bWwoYiksay4kc2xpZGUuZXEoYikuYWRkQ2xhc3MoXCJsZy1sb2FkZWRcIil9ay4kc2xpZGUuZXEoYikuZmluZChcIi5sZy1vYmplY3RcIikub24oXCJsb2FkLmxnIGVycm9yLmxnXCIsZnVuY3Rpb24oKXt2YXIgYz0wO2QmJiFhKFwiYm9keVwiKS5oYXNDbGFzcyhcImxnLWZyb20taGFzaFwiKSYmKGM9ZCksc2V0VGltZW91dChmdW5jdGlvbigpe2suJHNsaWRlLmVxKGIpLmFkZENsYXNzKFwibGctY29tcGxldGVcIiksay4kZWwudHJpZ2dlcihcIm9uU2xpZGVJdGVtTG9hZC5sZ1wiLFtiLGR8fDBdKX0sYyl9KSxvJiZvLmh0bWw1JiYhbCYmay4kc2xpZGUuZXEoYikuYWRkQ2xhc3MoXCJsZy1jb21wbGV0ZVwiKSwhMD09PWMmJihrLiRzbGlkZS5lcShiKS5oYXNDbGFzcyhcImxnLWNvbXBsZXRlXCIpP2sucHJlbG9hZChiKTprLiRzbGlkZS5lcShiKS5maW5kKFwiLmxnLW9iamVjdFwiKS5vbihcImxvYWQubGcgZXJyb3IubGdcIixmdW5jdGlvbigpe2sucHJlbG9hZChiKX0pKX0sYi5wcm90b3R5cGUuc2xpZGU9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9dGhpcy4kb3V0ZXIuZmluZChcIi5sZy1jdXJyZW50XCIpLmluZGV4KCksZz10aGlzO2lmKCFnLmxHYWxsZXJ5T258fGYhPT1iKXt2YXIgaD10aGlzLiRzbGlkZS5sZW5ndGgsaT1nLmxHYWxsZXJ5T24/dGhpcy5zLnNwZWVkOjA7aWYoIWcubGdCdXN5KXtpZih0aGlzLnMuZG93bmxvYWQpe3ZhciBqO2o9Zy5zLmR5bmFtaWM/ITEhPT1nLnMuZHluYW1pY0VsW2JdLmRvd25sb2FkVXJsJiYoZy5zLmR5bmFtaWNFbFtiXS5kb3dubG9hZFVybHx8Zy5zLmR5bmFtaWNFbFtiXS5zcmMpOlwiZmFsc2VcIiE9PWcuJGl0ZW1zLmVxKGIpLmF0dHIoXCJkYXRhLWRvd25sb2FkLXVybFwiKSYmKGcuJGl0ZW1zLmVxKGIpLmF0dHIoXCJkYXRhLWRvd25sb2FkLXVybFwiKXx8Zy4kaXRlbXMuZXEoYikuYXR0cihcImhyZWZcIil8fGcuJGl0ZW1zLmVxKGIpLmF0dHIoXCJkYXRhLXNyY1wiKSksaj8oYShcIiNsZy1kb3dubG9hZFwiKS5hdHRyKFwiaHJlZlwiLGopLGcuJG91dGVyLnJlbW92ZUNsYXNzKFwibGctaGlkZS1kb3dubG9hZFwiKSk6Zy4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy1oaWRlLWRvd25sb2FkXCIpfWlmKHRoaXMuJGVsLnRyaWdnZXIoXCJvbkJlZm9yZVNsaWRlLmxnXCIsW2YsYixjLGRdKSxnLmxnQnVzeT0hMCxjbGVhclRpbWVvdXQoZy5oaWRlQmFydGltZW91dCksXCIubGctc3ViLWh0bWxcIj09PXRoaXMucy5hcHBlbmRTdWJIdG1sVG8mJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmFkZEh0bWwoYil9LGkpLHRoaXMuYXJyb3dEaXNhYmxlKGIpLGV8fChiPGY/ZT1cInByZXZcIjpiPmYmJihlPVwibmV4dFwiKSksYyl7dGhpcy4kc2xpZGUucmVtb3ZlQ2xhc3MoXCJsZy1wcmV2LXNsaWRlIGxnLWN1cnJlbnQgbGctbmV4dC1zbGlkZVwiKTt2YXIgayxsO2g+Mj8oaz1iLTEsbD1iKzEsMD09PWImJmY9PT1oLTE/KGw9MCxrPWgtMSk6Yj09PWgtMSYmMD09PWYmJihsPTAsaz1oLTEpKTooaz0wLGw9MSksXCJwcmV2XCI9PT1lP2cuJHNsaWRlLmVxKGwpLmFkZENsYXNzKFwibGctbmV4dC1zbGlkZVwiKTpnLiRzbGlkZS5lcShrKS5hZGRDbGFzcyhcImxnLXByZXYtc2xpZGVcIiksZy4kc2xpZGUuZXEoYikuYWRkQ2xhc3MoXCJsZy1jdXJyZW50XCIpfWVsc2UgZy4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy1uby10cmFuc1wiKSx0aGlzLiRzbGlkZS5yZW1vdmVDbGFzcyhcImxnLXByZXYtc2xpZGUgbGctbmV4dC1zbGlkZVwiKSxcInByZXZcIj09PWU/KHRoaXMuJHNsaWRlLmVxKGIpLmFkZENsYXNzKFwibGctcHJldi1zbGlkZVwiKSx0aGlzLiRzbGlkZS5lcShmKS5hZGRDbGFzcyhcImxnLW5leHQtc2xpZGVcIikpOih0aGlzLiRzbGlkZS5lcShiKS5hZGRDbGFzcyhcImxnLW5leHQtc2xpZGVcIiksdGhpcy4kc2xpZGUuZXEoZikuYWRkQ2xhc3MoXCJsZy1wcmV2LXNsaWRlXCIpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy4kc2xpZGUucmVtb3ZlQ2xhc3MoXCJsZy1jdXJyZW50XCIpLGcuJHNsaWRlLmVxKGIpLmFkZENsYXNzKFwibGctY3VycmVudFwiKSxnLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLW5vLXRyYW5zXCIpfSw1MCk7Zy5sR2FsbGVyeU9uPyhzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5sb2FkQ29udGVudChiLCEwLDApfSx0aGlzLnMuc3BlZWQrNTApLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmxnQnVzeT0hMSxnLiRlbC50cmlnZ2VyKFwib25BZnRlclNsaWRlLmxnXCIsW2YsYixjLGRdKX0sdGhpcy5zLnNwZWVkKSk6KGcubG9hZENvbnRlbnQoYiwhMCxnLnMuYmFja2Ryb3BEdXJhdGlvbiksZy5sZ0J1c3k9ITEsZy4kZWwudHJpZ2dlcihcIm9uQWZ0ZXJTbGlkZS5sZ1wiLFtmLGIsYyxkXSkpLGcubEdhbGxlcnlPbj0hMCx0aGlzLnMuY291bnRlciYmYShcIiNsZy1jb3VudGVyLWN1cnJlbnRcIikudGV4dChiKzEpfWcuaW5kZXg9Yn19LGIucHJvdG90eXBlLmdvVG9OZXh0U2xpZGU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWIucy5sb29wO2EmJmIuJHNsaWRlLmxlbmd0aDwzJiYoYz0hMSksYi5sZ0J1c3l8fChiLmluZGV4KzE8Yi4kc2xpZGUubGVuZ3RoPyhiLmluZGV4KyssYi4kZWwudHJpZ2dlcihcIm9uQmVmb3JlTmV4dFNsaWRlLmxnXCIsW2IuaW5kZXhdKSxiLnNsaWRlKGIuaW5kZXgsYSwhMSxcIm5leHRcIikpOmM/KGIuaW5kZXg9MCxiLiRlbC50cmlnZ2VyKFwib25CZWZvcmVOZXh0U2xpZGUubGdcIixbYi5pbmRleF0pLGIuc2xpZGUoYi5pbmRleCxhLCExLFwibmV4dFwiKSk6Yi5zLnNsaWRlRW5kQW5pbWF0b2luJiYhYSYmKGIuJG91dGVyLmFkZENsYXNzKFwibGctcmlnaHQtZW5kXCIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtiLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLXJpZ2h0LWVuZFwiKX0sNDAwKSkpfSxiLnByb3RvdHlwZS5nb1RvUHJldlNsaWRlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1iLnMubG9vcDthJiZiLiRzbGlkZS5sZW5ndGg8MyYmKGM9ITEpLGIubGdCdXN5fHwoYi5pbmRleD4wPyhiLmluZGV4LS0sYi4kZWwudHJpZ2dlcihcIm9uQmVmb3JlUHJldlNsaWRlLmxnXCIsW2IuaW5kZXgsYV0pLGIuc2xpZGUoYi5pbmRleCxhLCExLFwicHJldlwiKSk6Yz8oYi5pbmRleD1iLiRpdGVtcy5sZW5ndGgtMSxiLiRlbC50cmlnZ2VyKFwib25CZWZvcmVQcmV2U2xpZGUubGdcIixbYi5pbmRleCxhXSksYi5zbGlkZShiLmluZGV4LGEsITEsXCJwcmV2XCIpKTpiLnMuc2xpZGVFbmRBbmltYXRvaW4mJiFhJiYoYi4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy1sZWZ0LWVuZFwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi4kb3V0ZXIucmVtb3ZlQ2xhc3MoXCJsZy1sZWZ0LWVuZFwiKX0sNDAwKSkpfSxiLnByb3RvdHlwZS5rZXlQcmVzcz1mdW5jdGlvbigpe3ZhciBiPXRoaXM7dGhpcy4kaXRlbXMubGVuZ3RoPjEmJmEod2luZG93KS5vbihcImtleXVwLmxnXCIsZnVuY3Rpb24oYSl7Yi4kaXRlbXMubGVuZ3RoPjEmJigzNz09PWEua2V5Q29kZSYmKGEucHJldmVudERlZmF1bHQoKSxiLmdvVG9QcmV2U2xpZGUoKSksMzk9PT1hLmtleUNvZGUmJihhLnByZXZlbnREZWZhdWx0KCksYi5nb1RvTmV4dFNsaWRlKCkpKX0pLGEod2luZG93KS5vbihcImtleWRvd24ubGdcIixmdW5jdGlvbihhKXshMD09PWIucy5lc2NLZXkmJjI3PT09YS5rZXlDb2RlJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGIuJG91dGVyLmhhc0NsYXNzKFwibGctdGh1bWItb3BlblwiKT9iLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLXRodW1iLW9wZW5cIik6Yi5kZXN0cm95KCkpfSl9LGIucHJvdG90eXBlLmFycm93PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLiRvdXRlci5maW5kKFwiLmxnLXByZXZcIikub24oXCJjbGljay5sZ1wiLGZ1bmN0aW9uKCl7YS5nb1RvUHJldlNsaWRlKCl9KSx0aGlzLiRvdXRlci5maW5kKFwiLmxnLW5leHRcIikub24oXCJjbGljay5sZ1wiLGZ1bmN0aW9uKCl7YS5nb1RvTmV4dFNsaWRlKCl9KX0sYi5wcm90b3R5cGUuYXJyb3dEaXNhYmxlPWZ1bmN0aW9uKGEpeyF0aGlzLnMubG9vcCYmdGhpcy5zLmhpZGVDb250cm9sT25FbmQmJihhKzE8dGhpcy4kc2xpZGUubGVuZ3RoP3RoaXMuJG91dGVyLmZpbmQoXCIubGctbmV4dFwiKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIikucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTp0aGlzLiRvdXRlci5maW5kKFwiLmxnLW5leHRcIikuYXR0cihcImRpc2FibGVkXCIsXCJkaXNhYmxlZFwiKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpLGE+MD90aGlzLiRvdXRlci5maW5kKFwiLmxnLXByZXZcIikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik6dGhpcy4kb3V0ZXIuZmluZChcIi5sZy1wcmV2XCIpLmF0dHIoXCJkaXNhYmxlZFwiLFwiZGlzYWJsZWRcIikuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKSl9LGIucHJvdG90eXBlLnNldFRyYW5zbGF0ZT1mdW5jdGlvbihhLGIsYyl7dGhpcy5zLnVzZUxlZnQ/YS5jc3MoXCJsZWZ0XCIsYik6YS5jc3Moe3RyYW5zZm9ybTpcInRyYW5zbGF0ZTNkKFwiK2IrXCJweCwgXCIrYytcInB4LCAwcHgpXCJ9KX0sYi5wcm90b3R5cGUudG91Y2hNb3ZlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy1iO01hdGguYWJzKGQpPjE1JiYodGhpcy4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy1kcmFnZ2luZ1wiKSx0aGlzLnNldFRyYW5zbGF0ZSh0aGlzLiRzbGlkZS5lcSh0aGlzLmluZGV4KSxkLDApLHRoaXMuc2V0VHJhbnNsYXRlKGEoXCIubGctcHJldi1zbGlkZVwiKSwtdGhpcy4kc2xpZGUuZXEodGhpcy5pbmRleCkud2lkdGgoKStkLDApLHRoaXMuc2V0VHJhbnNsYXRlKGEoXCIubGctbmV4dC1zbGlkZVwiKSx0aGlzLiRzbGlkZS5lcSh0aGlzLmluZGV4KS53aWR0aCgpK2QsMCkpfSxiLnByb3RvdHlwZS50b3VjaEVuZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO1wibGctc2xpZGVcIiE9PWIucy5tb2RlJiZiLiRvdXRlci5hZGRDbGFzcyhcImxnLXNsaWRlXCIpLHRoaXMuJHNsaWRlLm5vdChcIi5sZy1jdXJyZW50LCAubGctcHJldi1zbGlkZSwgLmxnLW5leHQtc2xpZGVcIikuY3NzKFwib3BhY2l0eVwiLFwiMFwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi4kb3V0ZXIucmVtb3ZlQ2xhc3MoXCJsZy1kcmFnZ2luZ1wiKSxhPDAmJk1hdGguYWJzKGEpPmIucy5zd2lwZVRocmVzaG9sZD9iLmdvVG9OZXh0U2xpZGUoITApOmE+MCYmTWF0aC5hYnMoYSk+Yi5zLnN3aXBlVGhyZXNob2xkP2IuZ29Ub1ByZXZTbGlkZSghMCk6TWF0aC5hYnMoYSk8NSYmYi4kZWwudHJpZ2dlcihcIm9uU2xpZGVDbGljay5sZ1wiKSxiLiRzbGlkZS5yZW1vdmVBdHRyKFwic3R5bGVcIil9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi4kb3V0ZXIuaGFzQ2xhc3MoXCJsZy1kcmFnZ2luZ1wiKXx8XCJsZy1zbGlkZVwiPT09Yi5zLm1vZGV8fGIuJG91dGVyLnJlbW92ZUNsYXNzKFwibGctc2xpZGVcIil9LGIucy5zcGVlZCsxMDApfSxiLnByb3RvdHlwZS5lbmFibGVTd2lwZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj0wLGM9MCxkPSExO2Eucy5lbmFibGVTd2lwZSYmYS5kb0NzcygpJiYoYS4kc2xpZGUub24oXCJ0b3VjaHN0YXJ0LmxnXCIsZnVuY3Rpb24oYyl7YS4kb3V0ZXIuaGFzQ2xhc3MoXCJsZy16b29tZWRcIil8fGEubGdCdXN5fHwoYy5wcmV2ZW50RGVmYXVsdCgpLGEubWFuYWdlU3dpcGVDbGFzcygpLGI9Yy5vcmlnaW5hbEV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVgpfSksYS4kc2xpZGUub24oXCJ0b3VjaG1vdmUubGdcIixmdW5jdGlvbihlKXthLiRvdXRlci5oYXNDbGFzcyhcImxnLXpvb21lZFwiKXx8KGUucHJldmVudERlZmF1bHQoKSxjPWUub3JpZ2luYWxFdmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYLGEudG91Y2hNb3ZlKGIsYyksZD0hMCl9KSxhLiRzbGlkZS5vbihcInRvdWNoZW5kLmxnXCIsZnVuY3Rpb24oKXthLiRvdXRlci5oYXNDbGFzcyhcImxnLXpvb21lZFwiKXx8KGQ/KGQ9ITEsYS50b3VjaEVuZChjLWIpKTphLiRlbC50cmlnZ2VyKFwib25TbGlkZUNsaWNrLmxnXCIpKX0pKX0sYi5wcm90b3R5cGUuZW5hYmxlRHJhZz1mdW5jdGlvbigpe3ZhciBiPXRoaXMsYz0wLGQ9MCxlPSExLGY9ITE7Yi5zLmVuYWJsZURyYWcmJmIuZG9Dc3MoKSYmKGIuJHNsaWRlLm9uKFwibW91c2Vkb3duLmxnXCIsZnVuY3Rpb24oZCl7Yi4kb3V0ZXIuaGFzQ2xhc3MoXCJsZy16b29tZWRcIil8fGIubGdCdXN5fHxhKGQudGFyZ2V0KS50ZXh0KCkudHJpbSgpfHwoZC5wcmV2ZW50RGVmYXVsdCgpLGIubWFuYWdlU3dpcGVDbGFzcygpLGM9ZC5wYWdlWCxlPSEwLGIuJG91dGVyLnNjcm9sbExlZnQrPTEsYi4kb3V0ZXIuc2Nyb2xsTGVmdC09MSxiLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLWdyYWJcIikuYWRkQ2xhc3MoXCJsZy1ncmFiYmluZ1wiKSxiLiRlbC50cmlnZ2VyKFwib25EcmFnc3RhcnQubGdcIikpfSksYSh3aW5kb3cpLm9uKFwibW91c2Vtb3ZlLmxnXCIsZnVuY3Rpb24oYSl7ZSYmKGY9ITAsZD1hLnBhZ2VYLGIudG91Y2hNb3ZlKGMsZCksYi4kZWwudHJpZ2dlcihcIm9uRHJhZ21vdmUubGdcIikpfSksYSh3aW5kb3cpLm9uKFwibW91c2V1cC5sZ1wiLGZ1bmN0aW9uKGcpe2Y/KGY9ITEsYi50b3VjaEVuZChkLWMpLGIuJGVsLnRyaWdnZXIoXCJvbkRyYWdlbmQubGdcIikpOihhKGcudGFyZ2V0KS5oYXNDbGFzcyhcImxnLW9iamVjdFwiKXx8YShnLnRhcmdldCkuaGFzQ2xhc3MoXCJsZy12aWRlby1wbGF5XCIpKSYmYi4kZWwudHJpZ2dlcihcIm9uU2xpZGVDbGljay5sZ1wiKSxlJiYoZT0hMSxiLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLWdyYWJiaW5nXCIpLmFkZENsYXNzKFwibGctZ3JhYlwiKSl9KSl9LGIucHJvdG90eXBlLm1hbmFnZVN3aXBlQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmluZGV4KzEsYj10aGlzLmluZGV4LTE7dGhpcy5zLmxvb3AmJnRoaXMuJHNsaWRlLmxlbmd0aD4yJiYoMD09PXRoaXMuaW5kZXg/Yj10aGlzLiRzbGlkZS5sZW5ndGgtMTp0aGlzLmluZGV4PT09dGhpcy4kc2xpZGUubGVuZ3RoLTEmJihhPTApKSx0aGlzLiRzbGlkZS5yZW1vdmVDbGFzcyhcImxnLW5leHQtc2xpZGUgbGctcHJldi1zbGlkZVwiKSxiPi0xJiZ0aGlzLiRzbGlkZS5lcShiKS5hZGRDbGFzcyhcImxnLXByZXYtc2xpZGVcIiksdGhpcy4kc2xpZGUuZXEoYSkuYWRkQ2xhc3MoXCJsZy1uZXh0LXNsaWRlXCIpfSxiLnByb3RvdHlwZS5tb3VzZXdoZWVsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLiRvdXRlci5vbihcIm1vdXNld2hlZWwubGdcIixmdW5jdGlvbihiKXtiLmRlbHRhWSYmKGIuZGVsdGFZPjA/YS5nb1RvUHJldlNsaWRlKCk6YS5nb1RvTmV4dFNsaWRlKCksYi5wcmV2ZW50RGVmYXVsdCgpKX0pfSxiLnByb3RvdHlwZS5jbG9zZUdhbGxlcnk9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9ITE7dGhpcy4kb3V0ZXIuZmluZChcIi5sZy1jbG9zZVwiKS5vbihcImNsaWNrLmxnXCIsZnVuY3Rpb24oKXtiLmRlc3Ryb3koKX0pLGIucy5jbG9zYWJsZSYmKGIuJG91dGVyLm9uKFwibW91c2Vkb3duLmxnXCIsZnVuY3Rpb24oYil7Yz0hIShhKGIudGFyZ2V0KS5pcyhcIi5sZy1vdXRlclwiKXx8YShiLnRhcmdldCkuaXMoXCIubGctaXRlbSBcIil8fGEoYi50YXJnZXQpLmlzKFwiLmxnLWltZy13cmFwXCIpKX0pLGIuJG91dGVyLm9uKFwibW91c2Vtb3ZlLmxnXCIsZnVuY3Rpb24oKXtjPSExfSksYi4kb3V0ZXIub24oXCJtb3VzZXVwLmxnXCIsZnVuY3Rpb24oZCl7KGEoZC50YXJnZXQpLmlzKFwiLmxnLW91dGVyXCIpfHxhKGQudGFyZ2V0KS5pcyhcIi5sZy1pdGVtIFwiKXx8YShkLnRhcmdldCkuaXMoXCIubGctaW1nLXdyYXBcIikmJmMpJiYoYi4kb3V0ZXIuaGFzQ2xhc3MoXCJsZy1kcmFnZ2luZ1wiKXx8Yi5kZXN0cm95KCkpfSkpfSxiLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7Ynx8KGMuJGVsLnRyaWdnZXIoXCJvbkJlZm9yZUNsb3NlLmxnXCIpLGEod2luZG93KS5zY3JvbGxUb3AoYy5wcmV2U2Nyb2xsVG9wKSksYiYmKGMucy5keW5hbWljfHx0aGlzLiRpdGVtcy5vZmYoXCJjbGljay5sZyBjbGljay5sZ2N1c3RvbVwiKSxhLnJlbW92ZURhdGEoYy5lbCxcImxpZ2h0R2FsbGVyeVwiKSksdGhpcy4kZWwub2ZmKFwiLmxnLnRtXCIpLGEuZWFjaChhLmZuLmxpZ2h0R2FsbGVyeS5tb2R1bGVzLGZ1bmN0aW9uKGEpe2MubW9kdWxlc1thXSYmYy5tb2R1bGVzW2FdLmRlc3Ryb3koKX0pLHRoaXMubEdhbGxlcnlPbj0hMSxjbGVhclRpbWVvdXQoYy5oaWRlQmFydGltZW91dCksdGhpcy5oaWRlQmFydGltZW91dD0hMSxhKHdpbmRvdykub2ZmKFwiLmxnXCIpLGEoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibGctb24gbGctZnJvbS1oYXNoXCIpLGMuJG91dGVyJiZjLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLXZpc2libGVcIiksYShcIi5sZy1iYWNrZHJvcFwiKS5yZW1vdmVDbGFzcyhcImluXCIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjLiRvdXRlciYmYy4kb3V0ZXIucmVtb3ZlKCksYShcIi5sZy1iYWNrZHJvcFwiKS5yZW1vdmUoKSxifHxjLiRlbC50cmlnZ2VyKFwib25DbG9zZUFmdGVyLmxnXCIpfSxjLnMuYmFja2Ryb3BEdXJhdGlvbis1MCl9LGEuZm4ubGlnaHRHYWxsZXJ5PWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihhLmRhdGEodGhpcyxcImxpZ2h0R2FsbGVyeVwiKSl0cnl7YSh0aGlzKS5kYXRhKFwibGlnaHRHYWxsZXJ5XCIpLmluaXQoKX1jYXRjaChhKXtjb25zb2xlLmVycm9yKFwibGlnaHRHYWxsZXJ5IGhhcyBub3QgaW5pdGlhdGVkIHByb3Blcmx5XCIpfWVsc2UgYS5kYXRhKHRoaXMsXCJsaWdodEdhbGxlcnlcIixuZXcgYih0aGlzLGMpKX0pfSxhLmZuLmxpZ2h0R2FsbGVyeS5tb2R1bGVzPXt9fSgpfSksZnVuY3Rpb24oYSxiKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImpxdWVyeVwiXSxmdW5jdGlvbihhKXtyZXR1cm4gYihhKX0pOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWIocmVxdWlyZShcImpxdWVyeVwiKSk6YihqUXVlcnkpfSgwLGZ1bmN0aW9uKGEpeyFmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBiPXthdXRvcGxheTohMSxwYXVzZTo1ZTMscHJvZ3Jlc3NCYXI6ITAsZm91cmNlQXV0b3BsYXk6ITEsYXV0b3BsYXlDb250cm9sczohMCxhcHBlbmRBdXRvcGxheUNvbnRyb2xzVG86XCIubGctdG9vbGJhclwifSxjPWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLmNvcmU9YShjKS5kYXRhKFwibGlnaHRHYWxsZXJ5XCIpLHRoaXMuJGVsPWEoYyksISh0aGlzLmNvcmUuJGl0ZW1zLmxlbmd0aDwyKSYmKHRoaXMuY29yZS5zPWEuZXh0ZW5kKHt9LGIsdGhpcy5jb3JlLnMpLHRoaXMuaW50ZXJ2YWw9ITEsdGhpcy5mcm9tQXV0bz0hMCx0aGlzLmNhbmNlbGVkT25Ub3VjaD0hMSx0aGlzLmZvdXJjZUF1dG9wbGF5VGVtcD10aGlzLmNvcmUucy5mb3VyY2VBdXRvcGxheSx0aGlzLmNvcmUuZG9Dc3MoKXx8KHRoaXMuY29yZS5zLnByb2dyZXNzQmFyPSExKSx0aGlzLmluaXQoKSx0aGlzKX07Yy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5jb3JlLnMuYXV0b3BsYXlDb250cm9scyYmYS5jb250cm9scygpLGEuY29yZS5zLnByb2dyZXNzQmFyJiZhLmNvcmUuJG91dGVyLmZpbmQoXCIubGdcIikuYXBwZW5kKCc8ZGl2IGNsYXNzPVwibGctcHJvZ3Jlc3MtYmFyXCI+PGRpdiBjbGFzcz1cImxnLXByb2dyZXNzXCI+PC9kaXY+PC9kaXY+JyksYS5wcm9ncmVzcygpLGEuY29yZS5zLmF1dG9wbGF5JiZhLiRlbC5vbmUoXCJvblNsaWRlSXRlbUxvYWQubGcudG1cIixmdW5jdGlvbigpe2Euc3RhcnRsQXV0bygpfSksYS4kZWwub24oXCJvbkRyYWdzdGFydC5sZy50bSB0b3VjaHN0YXJ0LmxnLnRtXCIsZnVuY3Rpb24oKXthLmludGVydmFsJiYoYS5jYW5jZWxBdXRvKCksYS5jYW5jZWxlZE9uVG91Y2g9ITApfSksYS4kZWwub24oXCJvbkRyYWdlbmQubGcudG0gdG91Y2hlbmQubGcudG0gb25TbGlkZUNsaWNrLmxnLnRtXCIsZnVuY3Rpb24oKXshYS5pbnRlcnZhbCYmYS5jYW5jZWxlZE9uVG91Y2gmJihhLnN0YXJ0bEF1dG8oKSxhLmNhbmNlbGVkT25Ub3VjaD0hMSl9KX0sYy5wcm90b3R5cGUucHJvZ3Jlc3M9ZnVuY3Rpb24oKXt2YXIgYSxiLGM9dGhpcztjLiRlbC5vbihcIm9uQmVmb3JlU2xpZGUubGcudG1cIixmdW5jdGlvbigpe2MuY29yZS5zLnByb2dyZXNzQmFyJiZjLmZyb21BdXRvJiYoYT1jLmNvcmUuJG91dGVyLmZpbmQoXCIubGctcHJvZ3Jlc3MtYmFyXCIpLGI9Yy5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXByb2dyZXNzXCIpLGMuaW50ZXJ2YWwmJihiLnJlbW92ZUF0dHIoXCJzdHlsZVwiKSxhLnJlbW92ZUNsYXNzKFwibGctc3RhcnRcIiksc2V0VGltZW91dChmdW5jdGlvbigpe2IuY3NzKFwidHJhbnNpdGlvblwiLFwid2lkdGggXCIrKGMuY29yZS5zLnNwZWVkK2MuY29yZS5zLnBhdXNlKStcIm1zIGVhc2UgMHNcIiksYS5hZGRDbGFzcyhcImxnLXN0YXJ0XCIpfSwyMCkpKSxjLmZyb21BdXRvfHxjLmNvcmUucy5mb3VyY2VBdXRvcGxheXx8Yy5jYW5jZWxBdXRvKCksYy5mcm9tQXV0bz0hMX0pfSxjLnByb3RvdHlwZS5jb250cm9scz1mdW5jdGlvbigpe3ZhciBiPXRoaXM7YSh0aGlzLmNvcmUucy5hcHBlbmRBdXRvcGxheUNvbnRyb2xzVG8pLmFwcGVuZCgnPHNwYW4gY2xhc3M9XCJsZy1hdXRvcGxheS1idXR0b24gbGctaWNvblwiPjwvc3Bhbj4nKSxiLmNvcmUuJG91dGVyLmZpbmQoXCIubGctYXV0b3BsYXktYnV0dG9uXCIpLm9uKFwiY2xpY2subGdcIixmdW5jdGlvbigpe2EoYi5jb3JlLiRvdXRlcikuaGFzQ2xhc3MoXCJsZy1zaG93LWF1dG9wbGF5XCIpPyhiLmNhbmNlbEF1dG8oKSxiLmNvcmUucy5mb3VyY2VBdXRvcGxheT0hMSk6Yi5pbnRlcnZhbHx8KGIuc3RhcnRsQXV0bygpLGIuY29yZS5zLmZvdXJjZUF1dG9wbGF5PWIuZm91cmNlQXV0b3BsYXlUZW1wKX0pfSxjLnByb3RvdHlwZS5zdGFydGxBdXRvPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmNvcmUuJG91dGVyLmZpbmQoXCIubGctcHJvZ3Jlc3NcIikuY3NzKFwidHJhbnNpdGlvblwiLFwid2lkdGggXCIrKGEuY29yZS5zLnNwZWVkK2EuY29yZS5zLnBhdXNlKStcIm1zIGVhc2UgMHNcIiksYS5jb3JlLiRvdXRlci5hZGRDbGFzcyhcImxnLXNob3ctYXV0b3BsYXlcIiksYS5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXByb2dyZXNzLWJhclwiKS5hZGRDbGFzcyhcImxnLXN0YXJ0XCIpLGEuaW50ZXJ2YWw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXthLmNvcmUuaW5kZXgrMTxhLmNvcmUuJGl0ZW1zLmxlbmd0aD9hLmNvcmUuaW5kZXgrKzphLmNvcmUuaW5kZXg9MCxhLmZyb21BdXRvPSEwLGEuY29yZS5zbGlkZShhLmNvcmUuaW5kZXgsITEsITEsXCJuZXh0XCIpfSxhLmNvcmUucy5zcGVlZCthLmNvcmUucy5wYXVzZSl9LGMucHJvdG90eXBlLmNhbmNlbEF1dG89ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpLHRoaXMuaW50ZXJ2YWw9ITEsdGhpcy5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXByb2dyZXNzXCIpLnJlbW92ZUF0dHIoXCJzdHlsZVwiKSx0aGlzLmNvcmUuJG91dGVyLnJlbW92ZUNsYXNzKFwibGctc2hvdy1hdXRvcGxheVwiKSx0aGlzLmNvcmUuJG91dGVyLmZpbmQoXCIubGctcHJvZ3Jlc3MtYmFyXCIpLnJlbW92ZUNsYXNzKFwibGctc3RhcnRcIil9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEF1dG8oKSx0aGlzLmNvcmUuJG91dGVyLmZpbmQoXCIubGctcHJvZ3Jlc3MtYmFyXCIpLnJlbW92ZSgpfSxhLmZuLmxpZ2h0R2FsbGVyeS5tb2R1bGVzLmF1dG9wbGF5PWN9KCl9KSxmdW5jdGlvbihhLGIpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKGEpe3JldHVybiBiKGEpfSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YihyZXF1aXJlKFwianF1ZXJ5XCIpKTpiKGpRdWVyeSl9KDAsZnVuY3Rpb24oYSl7IWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9e2Z1bGxTY3JlZW46ITB9LGM9ZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuY29yZT1hKGMpLmRhdGEoXCJsaWdodEdhbGxlcnlcIiksdGhpcy4kZWw9YShjKSx0aGlzLmNvcmUucz1hLmV4dGVuZCh7fSxiLHRoaXMuY29yZS5zKSx0aGlzLmluaXQoKSx0aGlzfTtjLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIGE9XCJcIjtpZih0aGlzLmNvcmUucy5mdWxsU2NyZWVuKXtpZighKGRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkfHxkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRW5hYmxlZHx8ZG9jdW1lbnQubW96RnVsbFNjcmVlbkVuYWJsZWR8fGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVuYWJsZWQpKXJldHVybjthPSc8c3BhbiBjbGFzcz1cImxnLWZ1bGxzY3JlZW4gbGctaWNvblwiPjwvc3Bhbj4nLHRoaXMuY29yZS4kb3V0ZXIuZmluZChcIi5sZy10b29sYmFyXCIpLmFwcGVuZChhKSx0aGlzLmZ1bGxTY3JlZW4oKX19LGMucHJvdG90eXBlLnJlcXVlc3RGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2EucmVxdWVzdEZ1bGxzY3JlZW4/YS5yZXF1ZXN0RnVsbHNjcmVlbigpOmEubXNSZXF1ZXN0RnVsbHNjcmVlbj9hLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTphLm1velJlcXVlc3RGdWxsU2NyZWVuP2EubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTphLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuJiZhLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCl9LGMucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7ZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4/ZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTpkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuP2RvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTpkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuP2RvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTpkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbiYmZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKX0sYy5wcm90b3R5cGUuZnVsbFNjcmVlbj1mdW5jdGlvbigpe3ZhciBiPXRoaXM7YShkb2N1bWVudCkub24oXCJmdWxsc2NyZWVuY2hhbmdlLmxnIHdlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UubGcgbW96ZnVsbHNjcmVlbmNoYW5nZS5sZyBNU0Z1bGxzY3JlZW5DaGFuZ2UubGdcIixmdW5jdGlvbigpe2IuY29yZS4kb3V0ZXIudG9nZ2xlQ2xhc3MoXCJsZy1mdWxsc2NyZWVuLW9uXCIpfSksdGhpcy5jb3JlLiRvdXRlci5maW5kKFwiLmxnLWZ1bGxzY3JlZW5cIikub24oXCJjbGljay5sZ1wiLGZ1bmN0aW9uKCl7ZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnR8fGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50fHxkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudHx8ZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudD9iLmV4aXRGdWxsc2NyZWVuKCk6Yi5yZXF1ZXN0RnVsbHNjcmVlbigpfSl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmV4aXRGdWxsc2NyZWVuKCksYShkb2N1bWVudCkub2ZmKFwiZnVsbHNjcmVlbmNoYW5nZS5sZyB3ZWJraXRmdWxsc2NyZWVuY2hhbmdlLmxnIG1vemZ1bGxzY3JlZW5jaGFuZ2UubGcgTVNGdWxsc2NyZWVuQ2hhbmdlLmxnXCIpfSxhLmZuLmxpZ2h0R2FsbGVyeS5tb2R1bGVzLmZ1bGxzY3JlZW49Y30oKX0pLGZ1bmN0aW9uKGEsYil7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sZnVuY3Rpb24oYSl7cmV0dXJuIGIoYSl9KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1iKHJlcXVpcmUoXCJqcXVlcnlcIikpOmIoalF1ZXJ5KX0oMCxmdW5jdGlvbihhKXshZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYj17cGFnZXI6ITF9LGM9ZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuY29yZT1hKGMpLmRhdGEoXCJsaWdodEdhbGxlcnlcIiksdGhpcy4kZWw9YShjKSx0aGlzLmNvcmUucz1hLmV4dGVuZCh7fSxiLHRoaXMuY29yZS5zKSx0aGlzLmNvcmUucy5wYWdlciYmdGhpcy5jb3JlLiRpdGVtcy5sZW5ndGg+MSYmdGhpcy5pbml0KCksdGhpc307Yy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBiLGMsZCxlPXRoaXMsZj1cIlwiO2lmKGUuY29yZS4kb3V0ZXIuZmluZChcIi5sZ1wiKS5hcHBlbmQoJzxkaXYgY2xhc3M9XCJsZy1wYWdlci1vdXRlclwiPjwvZGl2PicpLGUuY29yZS5zLmR5bmFtaWMpZm9yKHZhciBnPTA7ZzxlLmNvcmUucy5keW5hbWljRWwubGVuZ3RoO2crKylmKz0nPHNwYW4gY2xhc3M9XCJsZy1wYWdlci1jb250XCI+IDxzcGFuIGNsYXNzPVwibGctcGFnZXJcIj48L3NwYW4+PGRpdiBjbGFzcz1cImxnLXBhZ2VyLXRodW1iLWNvbnRcIj48c3BhbiBjbGFzcz1cImxnLWNhcmV0XCI+PC9zcGFuPiA8aW1nIHNyYz1cIicrZS5jb3JlLnMuZHluYW1pY0VsW2ddLnRodW1iKydcIiAvPjwvZGl2Pjwvc3Bhbj4nO2Vsc2UgZS5jb3JlLiRpdGVtcy5lYWNoKGZ1bmN0aW9uKCl7ZS5jb3JlLnMuZXhUaHVtYkltYWdlP2YrPSc8c3BhbiBjbGFzcz1cImxnLXBhZ2VyLWNvbnRcIj4gPHNwYW4gY2xhc3M9XCJsZy1wYWdlclwiPjwvc3Bhbj48ZGl2IGNsYXNzPVwibGctcGFnZXItdGh1bWItY29udFwiPjxzcGFuIGNsYXNzPVwibGctY2FyZXRcIj48L3NwYW4+IDxpbWcgc3JjPVwiJythKHRoaXMpLmF0dHIoZS5jb3JlLnMuZXhUaHVtYkltYWdlKSsnXCIgLz48L2Rpdj48L3NwYW4+JzpmKz0nPHNwYW4gY2xhc3M9XCJsZy1wYWdlci1jb250XCI+IDxzcGFuIGNsYXNzPVwibGctcGFnZXJcIj48L3NwYW4+PGRpdiBjbGFzcz1cImxnLXBhZ2VyLXRodW1iLWNvbnRcIj48c3BhbiBjbGFzcz1cImxnLWNhcmV0XCI+PC9zcGFuPiA8aW1nIHNyYz1cIicrYSh0aGlzKS5maW5kKFwiaW1nXCIpLmF0dHIoXCJzcmNcIikrJ1wiIC8+PC9kaXY+PC9zcGFuPid9KTtjPWUuY29yZS4kb3V0ZXIuZmluZChcIi5sZy1wYWdlci1vdXRlclwiKSxjLmh0bWwoZiksYj1lLmNvcmUuJG91dGVyLmZpbmQoXCIubGctcGFnZXItY29udFwiKSxiLm9uKFwiY2xpY2subGcgdG91Y2hlbmQubGdcIixmdW5jdGlvbigpe3ZhciBiPWEodGhpcyk7ZS5jb3JlLmluZGV4PWIuaW5kZXgoKSxlLmNvcmUuc2xpZGUoZS5jb3JlLmluZGV4LCExLCEwLCExKX0pLGMub24oXCJtb3VzZW92ZXIubGdcIixmdW5jdGlvbigpe2NsZWFyVGltZW91dChkKSxjLmFkZENsYXNzKFwibGctcGFnZXItaG92ZXJcIil9KSxjLm9uKFwibW91c2VvdXQubGdcIixmdW5jdGlvbigpe2Q9c2V0VGltZW91dChmdW5jdGlvbigpe2MucmVtb3ZlQ2xhc3MoXCJsZy1wYWdlci1ob3ZlclwiKX0pfSksZS5jb3JlLiRlbC5vbihcIm9uQmVmb3JlU2xpZGUubGcudG1cIixmdW5jdGlvbihhLGMsZCl7Yi5yZW1vdmVDbGFzcyhcImxnLXBhZ2VyLWFjdGl2ZVwiKSxiLmVxKGQpLmFkZENsYXNzKFwibGctcGFnZXItYWN0aXZlXCIpfSl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LGEuZm4ubGlnaHRHYWxsZXJ5Lm1vZHVsZXMucGFnZXI9Y30oKX0pLGZ1bmN0aW9uKGEsYil7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sZnVuY3Rpb24oYSl7cmV0dXJuIGIoYSl9KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1iKHJlcXVpcmUoXCJqcXVlcnlcIikpOmIoalF1ZXJ5KX0oMCxmdW5jdGlvbihhKXshZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYj17dGh1bWJuYWlsOiEwLGFuaW1hdGVUaHVtYjohMCxjdXJyZW50UGFnZXJQb3NpdGlvbjpcIm1pZGRsZVwiLHRodW1iV2lkdGg6MTAwLHRodW1iSGVpZ2h0OlwiODBweFwiLHRodW1iQ29udEhlaWdodDoxMDAsdGh1bWJNYXJnaW46NSxleFRodW1iSW1hZ2U6ITEsc2hvd1RodW1iQnlEZWZhdWx0OiEwLHRvb2dsZVRodW1iOiEwLHB1bGxDYXB0aW9uVXA6ITAsZW5hYmxlVGh1bWJEcmFnOiEwLGVuYWJsZVRodW1iU3dpcGU6ITAsc3dpcGVUaHJlc2hvbGQ6NTAsbG9hZFlvdXR1YmVUaHVtYm5haWw6ITAseW91dHViZVRodW1iU2l6ZToxLGxvYWRWaW1lb1RodW1ibmFpbDohMCx2aW1lb1RodW1iU2l6ZTpcInRodW1ibmFpbF9zbWFsbFwiLGxvYWREYWlseW1vdGlvblRodW1ibmFpbDohMH0sYz1mdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5jb3JlPWEoYykuZGF0YShcImxpZ2h0R2FsbGVyeVwiKSx0aGlzLmNvcmUucz1hLmV4dGVuZCh7fSxiLHRoaXMuY29yZS5zKSx0aGlzLiRlbD1hKGMpLHRoaXMuJHRodW1iT3V0ZXI9bnVsbCx0aGlzLnRodW1iT3V0ZXJXaWR0aD0wLHRoaXMudGh1bWJUb3RhbFdpZHRoPXRoaXMuY29yZS4kaXRlbXMubGVuZ3RoKih0aGlzLmNvcmUucy50aHVtYldpZHRoK3RoaXMuY29yZS5zLnRodW1iTWFyZ2luKSx0aGlzLnRodW1iSW5kZXg9dGhpcy5jb3JlLmluZGV4LHRoaXMuY29yZS5zLmFuaW1hdGVUaHVtYiYmKHRoaXMuY29yZS5zLnRodW1iSGVpZ2h0PVwiMTAwJVwiKSx0aGlzLmxlZnQ9MCx0aGlzLmluaXQoKSx0aGlzfTtjLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLmNvcmUucy50aHVtYm5haWwmJnRoaXMuY29yZS4kaXRlbXMubGVuZ3RoPjEmJih0aGlzLmNvcmUucy5zaG93VGh1bWJCeURlZmF1bHQmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmNvcmUuJG91dGVyLmFkZENsYXNzKFwibGctdGh1bWItb3BlblwiKX0sNzAwKSx0aGlzLmNvcmUucy5wdWxsQ2FwdGlvblVwJiZ0aGlzLmNvcmUuJG91dGVyLmFkZENsYXNzKFwibGctcHVsbC1jYXB0aW9uLXVwXCIpLHRoaXMuYnVpbGQoKSx0aGlzLmNvcmUucy5hbmltYXRlVGh1bWImJnRoaXMuY29yZS5kb0NzcygpPyh0aGlzLmNvcmUucy5lbmFibGVUaHVtYkRyYWcmJnRoaXMuZW5hYmxlVGh1bWJEcmFnKCksdGhpcy5jb3JlLnMuZW5hYmxlVGh1bWJTd2lwZSYmdGhpcy5lbmFibGVUaHVtYlN3aXBlKCksdGhpcy50aHVtYkNsaWNrYWJsZT0hMSk6dGhpcy50aHVtYkNsaWNrYWJsZT0hMCx0aGlzLnRvb2dsZSgpLHRoaXMudGh1bWJrZXlQcmVzcygpKX0sYy5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGEsYixjKXt2YXIgZyxoPWQuY29yZS5pc1ZpZGVvKGEsYyl8fHt9LGk9XCJcIjtoLnlvdXR1YmV8fGgudmltZW98fGguZGFpbHltb3Rpb24/aC55b3V0dWJlP2c9ZC5jb3JlLnMubG9hZFlvdXR1YmVUaHVtYm5haWw/XCIvL2ltZy55b3V0dWJlLmNvbS92aS9cIitoLnlvdXR1YmVbMV0rXCIvXCIrZC5jb3JlLnMueW91dHViZVRodW1iU2l6ZStcIi5qcGdcIjpiOmgudmltZW8/ZC5jb3JlLnMubG9hZFZpbWVvVGh1bWJuYWlsPyhnPVwiLy9pLnZpbWVvY2RuLmNvbS92aWRlby9lcnJvcl9cIitmK1wiLmpwZ1wiLGk9aC52aW1lb1sxXSk6Zz1iOmguZGFpbHltb3Rpb24mJihnPWQuY29yZS5zLmxvYWREYWlseW1vdGlvblRodW1ibmFpbD9cIi8vd3d3LmRhaWx5bW90aW9uLmNvbS90aHVtYm5haWwvdmlkZW8vXCIraC5kYWlseW1vdGlvblsxXTpiKTpnPWIsZSs9JzxkaXYgZGF0YS12aW1lby1pZD1cIicraSsnXCIgY2xhc3M9XCJsZy10aHVtYi1pdGVtXCIgc3R5bGU9XCJ3aWR0aDonK2QuY29yZS5zLnRodW1iV2lkdGgrXCJweDsgaGVpZ2h0OiBcIitkLmNvcmUucy50aHVtYkhlaWdodCtcIjsgbWFyZ2luLXJpZ2h0OiBcIitkLmNvcmUucy50aHVtYk1hcmdpbisncHhcIj48aW1nIHNyYz1cIicrZysnXCIgLz48L2Rpdj4nLGk9XCJcIn12YXIgYyxkPXRoaXMsZT1cIlwiLGY9XCJcIixnPSc8ZGl2IGNsYXNzPVwibGctdGh1bWItb3V0ZXJcIj48ZGl2IGNsYXNzPVwibGctdGh1bWIgbGctZ3JvdXBcIj48L2Rpdj48L2Rpdj4nO3N3aXRjaCh0aGlzLmNvcmUucy52aW1lb1RodW1iU2l6ZSl7Y2FzZVwidGh1bWJuYWlsX2xhcmdlXCI6Zj1cIjY0MFwiO2JyZWFrO2Nhc2VcInRodW1ibmFpbF9tZWRpdW1cIjpmPVwiMjAweDE1MFwiO2JyZWFrO2Nhc2VcInRodW1ibmFpbF9zbWFsbFwiOmY9XCIxMDB4NzVcIn1pZihkLmNvcmUuJG91dGVyLmFkZENsYXNzKFwibGctaGFzLXRodW1iXCIpLGQuY29yZS4kb3V0ZXIuZmluZChcIi5sZ1wiKS5hcHBlbmQoZyksZC4kdGh1bWJPdXRlcj1kLmNvcmUuJG91dGVyLmZpbmQoXCIubGctdGh1bWItb3V0ZXJcIiksZC50aHVtYk91dGVyV2lkdGg9ZC4kdGh1bWJPdXRlci53aWR0aCgpLGQuY29yZS5zLmFuaW1hdGVUaHVtYiYmZC5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXRodW1iXCIpLmNzcyh7d2lkdGg6ZC50aHVtYlRvdGFsV2lkdGgrXCJweFwiLHBvc2l0aW9uOlwicmVsYXRpdmVcIn0pLHRoaXMuY29yZS5zLmFuaW1hdGVUaHVtYiYmZC4kdGh1bWJPdXRlci5jc3MoXCJoZWlnaHRcIixkLmNvcmUucy50aHVtYkNvbnRIZWlnaHQrXCJweFwiKSxkLmNvcmUucy5keW5hbWljKWZvcih2YXIgaD0wO2g8ZC5jb3JlLnMuZHluYW1pY0VsLmxlbmd0aDtoKyspYihkLmNvcmUucy5keW5hbWljRWxbaF0uc3JjLGQuY29yZS5zLmR5bmFtaWNFbFtoXS50aHVtYixoKTtlbHNlIGQuY29yZS4kaXRlbXMuZWFjaChmdW5jdGlvbihjKXtkLmNvcmUucy5leFRodW1iSW1hZ2U/YihhKHRoaXMpLmF0dHIoXCJocmVmXCIpfHxhKHRoaXMpLmF0dHIoXCJkYXRhLXNyY1wiKSxhKHRoaXMpLmF0dHIoZC5jb3JlLnMuZXhUaHVtYkltYWdlKSxjKTpiKGEodGhpcykuYXR0cihcImhyZWZcIil8fGEodGhpcykuYXR0cihcImRhdGEtc3JjXCIpLGEodGhpcykuZmluZChcImltZ1wiKS5hdHRyKFwic3JjXCIpLGMpfSk7ZC5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXRodW1iXCIpLmh0bWwoZSksYz1kLmNvcmUuJG91dGVyLmZpbmQoXCIubGctdGh1bWItaXRlbVwiKSxjLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGM9Yi5hdHRyKFwiZGF0YS12aW1lby1pZFwiKTtjJiZhLmdldEpTT04oXCIvL3d3dy52aW1lby5jb20vYXBpL3YyL3ZpZGVvL1wiK2MrXCIuanNvbj9jYWxsYmFjaz0/XCIse2Zvcm1hdDpcImpzb25cIn0sZnVuY3Rpb24oYSl7Yi5maW5kKFwiaW1nXCIpLmF0dHIoXCJzcmNcIixhWzBdW2QuY29yZS5zLnZpbWVvVGh1bWJTaXplXSl9KX0pLGMuZXEoZC5jb3JlLmluZGV4KS5hZGRDbGFzcyhcImFjdGl2ZVwiKSxkLmNvcmUuJGVsLm9uKFwib25CZWZvcmVTbGlkZS5sZy50bVwiLGZ1bmN0aW9uKCl7Yy5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKSxjLmVxKGQuY29yZS5pbmRleCkuYWRkQ2xhc3MoXCJhY3RpdmVcIil9KSxjLm9uKFwiY2xpY2subGcgdG91Y2hlbmQubGdcIixmdW5jdGlvbigpe3ZhciBiPWEodGhpcyk7c2V0VGltZW91dChmdW5jdGlvbigpeyhkLnRodW1iQ2xpY2thYmxlJiYhZC5jb3JlLmxnQnVzeXx8IWQuY29yZS5kb0NzcygpKSYmKGQuY29yZS5pbmRleD1iLmluZGV4KCksZC5jb3JlLnNsaWRlKGQuY29yZS5pbmRleCwhMSwhMCwhMSkpfSw1MCl9KSxkLmNvcmUuJGVsLm9uKFwib25CZWZvcmVTbGlkZS5sZy50bVwiLGZ1bmN0aW9uKCl7ZC5hbmltYXRlVGh1bWIoZC5jb3JlLmluZGV4KX0pLGEod2luZG93KS5vbihcInJlc2l6ZS5sZy50aHVtYiBvcmllbnRhdGlvbmNoYW5nZS5sZy50aHVtYlwiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2QuYW5pbWF0ZVRodW1iKGQuY29yZS5pbmRleCksZC50aHVtYk91dGVyV2lkdGg9ZC4kdGh1bWJPdXRlci53aWR0aCgpfSwyMDApfSl9LGMucHJvdG90eXBlLnNldFRyYW5zbGF0ZT1mdW5jdGlvbihhKXt0aGlzLmNvcmUuJG91dGVyLmZpbmQoXCIubGctdGh1bWJcIikuY3NzKHt0cmFuc2Zvcm06XCJ0cmFuc2xhdGUzZCgtXCIrYStcInB4LCAwcHgsIDBweClcIn0pfSxjLnByb3RvdHlwZS5hbmltYXRlVGh1bWI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXRodW1iXCIpO2lmKHRoaXMuY29yZS5zLmFuaW1hdGVUaHVtYil7dmFyIGM7c3dpdGNoKHRoaXMuY29yZS5zLmN1cnJlbnRQYWdlclBvc2l0aW9uKXtjYXNlXCJsZWZ0XCI6Yz0wO2JyZWFrO2Nhc2VcIm1pZGRsZVwiOmM9dGhpcy50aHVtYk91dGVyV2lkdGgvMi10aGlzLmNvcmUucy50aHVtYldpZHRoLzI7YnJlYWs7Y2FzZVwicmlnaHRcIjpjPXRoaXMudGh1bWJPdXRlcldpZHRoLXRoaXMuY29yZS5zLnRodW1iV2lkdGh9dGhpcy5sZWZ0PSh0aGlzLmNvcmUucy50aHVtYldpZHRoK3RoaXMuY29yZS5zLnRodW1iTWFyZ2luKSphLTEtYyx0aGlzLmxlZnQ+dGhpcy50aHVtYlRvdGFsV2lkdGgtdGhpcy50aHVtYk91dGVyV2lkdGgmJih0aGlzLmxlZnQ9dGhpcy50aHVtYlRvdGFsV2lkdGgtdGhpcy50aHVtYk91dGVyV2lkdGgpLHRoaXMubGVmdDwwJiYodGhpcy5sZWZ0PTApLHRoaXMuY29yZS5sR2FsbGVyeU9uPyhiLmhhc0NsYXNzKFwib25cIil8fHRoaXMuY29yZS4kb3V0ZXIuZmluZChcIi5sZy10aHVtYlwiKS5jc3MoXCJ0cmFuc2l0aW9uLWR1cmF0aW9uXCIsdGhpcy5jb3JlLnMuc3BlZWQrXCJtc1wiKSx0aGlzLmNvcmUuZG9Dc3MoKXx8Yi5hbmltYXRlKHtsZWZ0Oi10aGlzLmxlZnQrXCJweFwifSx0aGlzLmNvcmUucy5zcGVlZCkpOnRoaXMuY29yZS5kb0NzcygpfHxiLmNzcyhcImxlZnRcIiwtdGhpcy5sZWZ0K1wicHhcIiksdGhpcy5zZXRUcmFuc2xhdGUodGhpcy5sZWZ0KX19LGMucHJvdG90eXBlLmVuYWJsZVRodW1iRHJhZz1mdW5jdGlvbigpe3ZhciBiPXRoaXMsYz0wLGQ9MCxlPSExLGY9ITEsZz0wO2IuJHRodW1iT3V0ZXIuYWRkQ2xhc3MoXCJsZy1ncmFiXCIpLGIuY29yZS4kb3V0ZXIuZmluZChcIi5sZy10aHVtYlwiKS5vbihcIm1vdXNlZG93bi5sZy50aHVtYlwiLGZ1bmN0aW9uKGEpe2IudGh1bWJUb3RhbFdpZHRoPmIudGh1bWJPdXRlcldpZHRoJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGM9YS5wYWdlWCxlPSEwLGIuY29yZS4kb3V0ZXIuc2Nyb2xsTGVmdCs9MSxiLmNvcmUuJG91dGVyLnNjcm9sbExlZnQtPTEsYi50aHVtYkNsaWNrYWJsZT0hMSxiLiR0aHVtYk91dGVyLnJlbW92ZUNsYXNzKFwibGctZ3JhYlwiKS5hZGRDbGFzcyhcImxnLWdyYWJiaW5nXCIpKX0pLGEod2luZG93KS5vbihcIm1vdXNlbW92ZS5sZy50aHVtYlwiLGZ1bmN0aW9uKGEpe2UmJihnPWIubGVmdCxmPSEwLGQ9YS5wYWdlWCxiLiR0aHVtYk91dGVyLmFkZENsYXNzKFwibGctZHJhZ2dpbmdcIiksZy09ZC1jLGc+Yi50aHVtYlRvdGFsV2lkdGgtYi50aHVtYk91dGVyV2lkdGgmJihnPWIudGh1bWJUb3RhbFdpZHRoLWIudGh1bWJPdXRlcldpZHRoKSxnPDAmJihnPTApLGIuc2V0VHJhbnNsYXRlKGcpKX0pLGEod2luZG93KS5vbihcIm1vdXNldXAubGcudGh1bWJcIixmdW5jdGlvbigpe2Y/KGY9ITEsYi4kdGh1bWJPdXRlci5yZW1vdmVDbGFzcyhcImxnLWRyYWdnaW5nXCIpLGIubGVmdD1nLE1hdGguYWJzKGQtYyk8Yi5jb3JlLnMuc3dpcGVUaHJlc2hvbGQmJihiLnRodW1iQ2xpY2thYmxlPSEwKSk6Yi50aHVtYkNsaWNrYWJsZT0hMCxlJiYoZT0hMSxiLiR0aHVtYk91dGVyLnJlbW92ZUNsYXNzKFwibGctZ3JhYmJpbmdcIikuYWRkQ2xhc3MoXCJsZy1ncmFiXCIpKX0pfSxjLnByb3RvdHlwZS5lbmFibGVUaHVtYlN3aXBlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPTAsYz0wLGQ9ITEsZT0wO2EuY29yZS4kb3V0ZXIuZmluZChcIi5sZy10aHVtYlwiKS5vbihcInRvdWNoc3RhcnQubGdcIixmdW5jdGlvbihjKXthLnRodW1iVG90YWxXaWR0aD5hLnRodW1iT3V0ZXJXaWR0aCYmKGMucHJldmVudERlZmF1bHQoKSxiPWMub3JpZ2luYWxFdmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYLGEudGh1bWJDbGlja2FibGU9ITEpfSksYS5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXRodW1iXCIpLm9uKFwidG91Y2htb3ZlLmxnXCIsZnVuY3Rpb24oZil7YS50aHVtYlRvdGFsV2lkdGg+YS50aHVtYk91dGVyV2lkdGgmJihmLnByZXZlbnREZWZhdWx0KCksYz1mLm9yaWdpbmFsRXZlbnQudGFyZ2V0VG91Y2hlc1swXS5wYWdlWCxkPSEwLGEuJHRodW1iT3V0ZXIuYWRkQ2xhc3MoXCJsZy1kcmFnZ2luZ1wiKSxlPWEubGVmdCxlLT1jLWIsZT5hLnRodW1iVG90YWxXaWR0aC1hLnRodW1iT3V0ZXJXaWR0aCYmKGU9YS50aHVtYlRvdGFsV2lkdGgtYS50aHVtYk91dGVyV2lkdGgpLGU8MCYmKGU9MCksYS5zZXRUcmFuc2xhdGUoZSkpfSksYS5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXRodW1iXCIpLm9uKFwidG91Y2hlbmQubGdcIixmdW5jdGlvbigpe2EudGh1bWJUb3RhbFdpZHRoPmEudGh1bWJPdXRlcldpZHRoJiZkPyhkPSExLGEuJHRodW1iT3V0ZXIucmVtb3ZlQ2xhc3MoXCJsZy1kcmFnZ2luZ1wiKSxNYXRoLmFicyhjLWIpPGEuY29yZS5zLnN3aXBlVGhyZXNob2xkJiYoYS50aHVtYkNsaWNrYWJsZT0hMCksYS5sZWZ0PWUpOmEudGh1bWJDbGlja2FibGU9ITB9KX0sYy5wcm90b3R5cGUudG9vZ2xlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmNvcmUucy50b29nbGVUaHVtYiYmKGEuY29yZS4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy1jYW4tdG9nZ2xlXCIpLGEuJHRodW1iT3V0ZXIuYXBwZW5kKCc8c3BhbiBjbGFzcz1cImxnLXRvb2dsZS10aHVtYiBsZy1pY29uXCI+PC9zcGFuPicpLGEuY29yZS4kb3V0ZXIuZmluZChcIi5sZy10b29nbGUtdGh1bWJcIikub24oXCJjbGljay5sZ1wiLGZ1bmN0aW9uKCl7YS5jb3JlLiRvdXRlci50b2dnbGVDbGFzcyhcImxnLXRodW1iLW9wZW5cIil9KSl9LGMucHJvdG90eXBlLnRodW1ia2V5UHJlc3M9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2Eod2luZG93KS5vbihcImtleWRvd24ubGcudGh1bWJcIixmdW5jdGlvbihhKXszOD09PWEua2V5Q29kZT8oYS5wcmV2ZW50RGVmYXVsdCgpLGIuY29yZS4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy10aHVtYi1vcGVuXCIpKTo0MD09PWEua2V5Q29kZSYmKGEucHJldmVudERlZmF1bHQoKSxiLmNvcmUuJG91dGVyLnJlbW92ZUNsYXNzKFwibGctdGh1bWItb3BlblwiKSl9KX0sYy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuY29yZS5zLnRodW1ibmFpbCYmdGhpcy5jb3JlLiRpdGVtcy5sZW5ndGg+MSYmKGEod2luZG93KS5vZmYoXCJyZXNpemUubGcudGh1bWIgb3JpZW50YXRpb25jaGFuZ2UubGcudGh1bWIga2V5ZG93bi5sZy50aHVtYlwiKSxcclxudGhpcy4kdGh1bWJPdXRlci5yZW1vdmUoKSx0aGlzLmNvcmUuJG91dGVyLnJlbW92ZUNsYXNzKFwibGctaGFzLXRodW1iXCIpKX0sYS5mbi5saWdodEdhbGxlcnkubW9kdWxlcy5UaHVtYm5haWw9Y30oKX0pLGZ1bmN0aW9uKGEsYil7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sZnVuY3Rpb24oYSl7cmV0dXJuIGIoYSl9KTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1iKHJlcXVpcmUoXCJqcXVlcnlcIikpOmIoYS5qUXVlcnkpfSh0aGlzLGZ1bmN0aW9uKGEpeyFmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYSxiLGMsZCl7dmFyIGU9dGhpcztpZihlLmNvcmUuJHNsaWRlLmVxKGIpLmZpbmQoXCIubGctdmlkZW9cIikuYXBwZW5kKGUubG9hZFZpZGVvKGMsXCJsZy1vYmplY3RcIiwhMCxiLGQpKSxkKWlmKGUuY29yZS5zLnZpZGVvanMpdHJ5e3ZpZGVvanMoZS5jb3JlLiRzbGlkZS5lcShiKS5maW5kKFwiLmxnLWh0bWw1XCIpLmdldCgwKSxlLmNvcmUucy52aWRlb2pzT3B0aW9ucyxmdW5jdGlvbigpeyFlLnZpZGVvTG9hZGVkJiZlLmNvcmUucy5hdXRvcGxheUZpcnN0VmlkZW8mJnRoaXMucGxheSgpfSl9Y2F0Y2goYSl7Y29uc29sZS5lcnJvcihcIk1ha2Ugc3VyZSB5b3UgaGF2ZSBpbmNsdWRlZCB2aWRlb2pzXCIpfWVsc2UhZS52aWRlb0xvYWRlZCYmZS5jb3JlLnMuYXV0b3BsYXlGaXJzdFZpZGVvJiZlLmNvcmUuJHNsaWRlLmVxKGIpLmZpbmQoXCIubGctaHRtbDVcIikuZ2V0KDApLnBsYXkoKX1mdW5jdGlvbiBjKGEsYil7dmFyIGM9dGhpcy5jb3JlLiRzbGlkZS5lcShiKS5maW5kKFwiLmxnLXZpZGVvLWNvbnRcIik7Yy5oYXNDbGFzcyhcImxnLWhhcy1pZnJhbWVcIil8fChjLmNzcyhcIm1heC13aWR0aFwiLHRoaXMuY29yZS5zLnZpZGVvTWF4V2lkdGgpLHRoaXMudmlkZW9Mb2FkZWQ9ITApfWZ1bmN0aW9uIGQoYixjLGQpe3ZhciBlPXRoaXMsZj1lLmNvcmUuJHNsaWRlLmVxKGMpLGc9Zi5maW5kKFwiLmxnLXlvdXR1YmVcIikuZ2V0KDApLGg9Zi5maW5kKFwiLmxnLXZpbWVvXCIpLmdldCgwKSxpPWYuZmluZChcIi5sZy1kYWlseW1vdGlvblwiKS5nZXQoMCksaj1mLmZpbmQoXCIubGctdmtcIikuZ2V0KDApLGs9Zi5maW5kKFwiLmxnLWh0bWw1XCIpLmdldCgwKTtpZihnKWcuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgne1wiZXZlbnRcIjpcImNvbW1hbmRcIixcImZ1bmNcIjpcInBhdXNlVmlkZW9cIixcImFyZ3NcIjpcIlwifScsXCIqXCIpO2Vsc2UgaWYoaCl0cnl7JGYoaCkuYXBpKFwicGF1c2VcIil9Y2F0Y2goYSl7Y29uc29sZS5lcnJvcihcIk1ha2Ugc3VyZSB5b3UgaGF2ZSBpbmNsdWRlZCBmcm9vZ2Fsb29wMiBqc1wiKX1lbHNlIGlmKGkpaS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKFwicGF1c2VcIixcIipcIik7ZWxzZSBpZihrKWlmKGUuY29yZS5zLnZpZGVvanMpdHJ5e3ZpZGVvanMoaykucGF1c2UoKX1jYXRjaChhKXtjb25zb2xlLmVycm9yKFwiTWFrZSBzdXJlIHlvdSBoYXZlIGluY2x1ZGVkIHZpZGVvanNcIil9ZWxzZSBrLnBhdXNlKCk7aiYmYShqKS5hdHRyKFwic3JjXCIsYShqKS5hdHRyKFwic3JjXCIpLnJlcGxhY2UoXCImYXV0b3BsYXlcIixcIiZub3BsYXlcIikpO3ZhciBsO2w9ZS5jb3JlLnMuZHluYW1pYz9lLmNvcmUucy5keW5hbWljRWxbZF0uc3JjOmUuY29yZS4kaXRlbXMuZXEoZCkuYXR0cihcImhyZWZcIil8fGUuY29yZS4kaXRlbXMuZXEoZCkuYXR0cihcImRhdGEtc3JjXCIpO3ZhciBtPWUuY29yZS5pc1ZpZGVvKGwsZCl8fHt9OyhtLnlvdXR1YmV8fG0udmltZW98fG0uZGFpbHltb3Rpb258fG0udmspJiZlLmNvcmUuJG91dGVyLmFkZENsYXNzKFwibGctaGlkZS1kb3dubG9hZFwiKX12YXIgZT17dmlkZW9NYXhXaWR0aDpcIjg1NXB4XCIsYXV0b3BsYXlGaXJzdFZpZGVvOiEwLHlvdXR1YmVQbGF5ZXJQYXJhbXM6ITEsdmltZW9QbGF5ZXJQYXJhbXM6ITEsZGFpbHltb3Rpb25QbGF5ZXJQYXJhbXM6ITEsdmtQbGF5ZXJQYXJhbXM6ITEsdmlkZW9qczohMSx2aWRlb2pzT3B0aW9uczp7fX0sZj1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5jb3JlPWEoYikuZGF0YShcImxpZ2h0R2FsbGVyeVwiKSx0aGlzLiRlbD1hKGIpLHRoaXMuY29yZS5zPWEuZXh0ZW5kKHt9LGUsdGhpcy5jb3JlLnMpLHRoaXMudmlkZW9Mb2FkZWQ9ITEsdGhpcy5pbml0KCksdGhpc307Zi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jb3JlLiRlbC5vbihcImhhc1ZpZGVvLmxnLnRtXCIsYi5iaW5kKHRoaXMpKSxlLmNvcmUuJGVsLm9uKFwib25BZmVyQXBwZW5kU2xpZGUubGcudG1cIixjLmJpbmQodGhpcykpLGUuY29yZS5kb0NzcygpJiZlLmNvcmUuJGl0ZW1zLmxlbmd0aD4xJiYoZS5jb3JlLnMuZW5hYmxlU3dpcGV8fGUuY29yZS5zLmVuYWJsZURyYWcpP2UuY29yZS4kZWwub24oXCJvblNsaWRlQ2xpY2subGcudG1cIixmdW5jdGlvbigpe3ZhciBhPWUuY29yZS4kc2xpZGUuZXEoZS5jb3JlLmluZGV4KTtlLmxvYWRWaWRlb09uY2xpY2soYSl9KTplLmNvcmUuJHNsaWRlLm9uKFwiY2xpY2subGdcIixmdW5jdGlvbigpe2UubG9hZFZpZGVvT25jbGljayhhKHRoaXMpKX0pLGUuY29yZS4kZWwub24oXCJvbkJlZm9yZVNsaWRlLmxnLnRtXCIsZC5iaW5kKHRoaXMpKSxlLmNvcmUuJGVsLm9uKFwib25BZnRlclNsaWRlLmxnLnRtXCIsZnVuY3Rpb24oYSxiKXtlLmNvcmUuJHNsaWRlLmVxKGIpLnJlbW92ZUNsYXNzKFwibGctdmlkZW8tcGxheWluZ1wiKX0pLGUuY29yZS5zLmF1dG9wbGF5Rmlyc3RWaWRlbyYmZS5jb3JlLiRlbC5vbihcIm9uQWZlckFwcGVuZFNsaWRlLmxnLnRtXCIsZnVuY3Rpb24oYSxiKXtpZighZS5jb3JlLmxHYWxsZXJ5T24pe3ZhciBjPWUuY29yZS4kc2xpZGUuZXEoYik7c2V0VGltZW91dChmdW5jdGlvbigpe2UubG9hZFZpZGVvT25jbGljayhjKX0sMTAwKX19KX0sZi5wcm90b3R5cGUubG9hZFZpZGVvPWZ1bmN0aW9uKGIsYyxkLGUsZil7dmFyIGc9XCJcIixoPTEsaT1cIlwiLGo9dGhpcy5jb3JlLmlzVmlkZW8oYixlKXx8e307aWYoZCYmKGg9dGhpcy52aWRlb0xvYWRlZD8wOnRoaXMuY29yZS5zLmF1dG9wbGF5Rmlyc3RWaWRlbz8xOjApLGoueW91dHViZSlpPVwiP3dtb2RlPW9wYXF1ZSZhdXRvcGxheT1cIitoK1wiJmVuYWJsZWpzYXBpPTFcIix0aGlzLmNvcmUucy55b3V0dWJlUGxheWVyUGFyYW1zJiYoaT1pK1wiJlwiK2EucGFyYW0odGhpcy5jb3JlLnMueW91dHViZVBsYXllclBhcmFtcykpLGc9JzxpZnJhbWUgY2xhc3M9XCJsZy12aWRlby1vYmplY3QgbGcteW91dHViZSAnK2MrJ1wiIHdpZHRoPVwiNTYwXCIgaGVpZ2h0PVwiMzE1XCIgc3JjPVwiLy93d3cueW91dHViZS5jb20vZW1iZWQvJytqLnlvdXR1YmVbMV0raSsnXCIgZnJhbWVib3JkZXI9XCIwXCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPic7ZWxzZSBpZihqLnZpbWVvKWk9XCI/YXV0b3BsYXk9XCIraCtcIiZhcGk9MVwiLHRoaXMuY29yZS5zLnZpbWVvUGxheWVyUGFyYW1zJiYoaT1pK1wiJlwiK2EucGFyYW0odGhpcy5jb3JlLnMudmltZW9QbGF5ZXJQYXJhbXMpKSxnPSc8aWZyYW1lIGNsYXNzPVwibGctdmlkZW8tb2JqZWN0IGxnLXZpbWVvICcrYysnXCIgd2lkdGg9XCI1NjBcIiBoZWlnaHQ9XCIzMTVcIiAgc3JjPVwiLy9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLycrai52aW1lb1sxXStpKydcIiBmcmFtZWJvcmRlcj1cIjBcIiB3ZWJraXRBbGxvd0Z1bGxTY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93RnVsbFNjcmVlbj48L2lmcmFtZT4nO2Vsc2UgaWYoai5kYWlseW1vdGlvbilpPVwiP3dtb2RlPW9wYXF1ZSZhdXRvcGxheT1cIitoK1wiJmFwaT1wb3N0TWVzc2FnZVwiLHRoaXMuY29yZS5zLmRhaWx5bW90aW9uUGxheWVyUGFyYW1zJiYoaT1pK1wiJlwiK2EucGFyYW0odGhpcy5jb3JlLnMuZGFpbHltb3Rpb25QbGF5ZXJQYXJhbXMpKSxnPSc8aWZyYW1lIGNsYXNzPVwibGctdmlkZW8tb2JqZWN0IGxnLWRhaWx5bW90aW9uICcrYysnXCIgd2lkdGg9XCI1NjBcIiBoZWlnaHQ9XCIzMTVcIiBzcmM9XCIvL3d3dy5kYWlseW1vdGlvbi5jb20vZW1iZWQvdmlkZW8vJytqLmRhaWx5bW90aW9uWzFdK2krJ1wiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nO2Vsc2UgaWYoai5odG1sNSl7dmFyIGs9Zi5zdWJzdHJpbmcoMCwxKTtcIi5cIiE9PWsmJlwiI1wiIT09a3x8KGY9YShmKS5odG1sKCkpLGc9Zn1lbHNlIGoudmsmJihpPVwiJmF1dG9wbGF5PVwiK2gsdGhpcy5jb3JlLnMudmtQbGF5ZXJQYXJhbXMmJihpPWkrXCImXCIrYS5wYXJhbSh0aGlzLmNvcmUucy52a1BsYXllclBhcmFtcykpLGc9JzxpZnJhbWUgY2xhc3M9XCJsZy12aWRlby1vYmplY3QgbGctdmsgJytjKydcIiB3aWR0aD1cIjU2MFwiIGhlaWdodD1cIjMxNVwiIHNyYz1cIi8vdmsuY29tL3ZpZGVvX2V4dC5waHA/JytqLnZrWzFdK2krJ1wiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nKTtyZXR1cm4gZ30sZi5wcm90b3R5cGUubG9hZFZpZGVvT25jbGljaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2lmKGEuZmluZChcIi5sZy1vYmplY3RcIikuaGFzQ2xhc3MoXCJsZy1oYXMtcG9zdGVyXCIpJiZhLmZpbmQoXCIubGctb2JqZWN0XCIpLmlzKFwiOnZpc2libGVcIikpaWYoYS5oYXNDbGFzcyhcImxnLWhhcy12aWRlb1wiKSl7dmFyIGM9YS5maW5kKFwiLmxnLXlvdXR1YmVcIikuZ2V0KDApLGQ9YS5maW5kKFwiLmxnLXZpbWVvXCIpLmdldCgwKSxlPWEuZmluZChcIi5sZy1kYWlseW1vdGlvblwiKS5nZXQoMCksZj1hLmZpbmQoXCIubGctaHRtbDVcIikuZ2V0KDApO2lmKGMpYy5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7XCJldmVudFwiOlwiY29tbWFuZFwiLFwiZnVuY1wiOlwicGxheVZpZGVvXCIsXCJhcmdzXCI6XCJcIn0nLFwiKlwiKTtlbHNlIGlmKGQpdHJ5eyRmKGQpLmFwaShcInBsYXlcIil9Y2F0Y2goYSl7Y29uc29sZS5lcnJvcihcIk1ha2Ugc3VyZSB5b3UgaGF2ZSBpbmNsdWRlZCBmcm9vZ2Fsb29wMiBqc1wiKX1lbHNlIGlmKGUpZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKFwicGxheVwiLFwiKlwiKTtlbHNlIGlmKGYpaWYoYi5jb3JlLnMudmlkZW9qcyl0cnl7dmlkZW9qcyhmKS5wbGF5KCl9Y2F0Y2goYSl7Y29uc29sZS5lcnJvcihcIk1ha2Ugc3VyZSB5b3UgaGF2ZSBpbmNsdWRlZCB2aWRlb2pzXCIpfWVsc2UgZi5wbGF5KCk7YS5hZGRDbGFzcyhcImxnLXZpZGVvLXBsYXlpbmdcIil9ZWxzZXthLmFkZENsYXNzKFwibGctdmlkZW8tcGxheWluZyBsZy1oYXMtdmlkZW9cIik7dmFyIGcsaCxpPWZ1bmN0aW9uKGMsZCl7aWYoYS5maW5kKFwiLmxnLXZpZGVvXCIpLmFwcGVuZChiLmxvYWRWaWRlbyhjLFwiXCIsITEsYi5jb3JlLmluZGV4LGQpKSxkKWlmKGIuY29yZS5zLnZpZGVvanMpdHJ5e3ZpZGVvanMoYi5jb3JlLiRzbGlkZS5lcShiLmNvcmUuaW5kZXgpLmZpbmQoXCIubGctaHRtbDVcIikuZ2V0KDApLGIuY29yZS5zLnZpZGVvanNPcHRpb25zLGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCl9KX1jYXRjaChhKXtjb25zb2xlLmVycm9yKFwiTWFrZSBzdXJlIHlvdSBoYXZlIGluY2x1ZGVkIHZpZGVvanNcIil9ZWxzZSBiLmNvcmUuJHNsaWRlLmVxKGIuY29yZS5pbmRleCkuZmluZChcIi5sZy1odG1sNVwiKS5nZXQoMCkucGxheSgpfTtiLmNvcmUucy5keW5hbWljPyhnPWIuY29yZS5zLmR5bmFtaWNFbFtiLmNvcmUuaW5kZXhdLnNyYyxoPWIuY29yZS5zLmR5bmFtaWNFbFtiLmNvcmUuaW5kZXhdLmh0bWwsaShnLGgpKTooZz1iLmNvcmUuJGl0ZW1zLmVxKGIuY29yZS5pbmRleCkuYXR0cihcImhyZWZcIil8fGIuY29yZS4kaXRlbXMuZXEoYi5jb3JlLmluZGV4KS5hdHRyKFwiZGF0YS1zcmNcIiksaD1iLmNvcmUuJGl0ZW1zLmVxKGIuY29yZS5pbmRleCkuYXR0cihcImRhdGEtaHRtbFwiKSxpKGcsaCkpO3ZhciBqPWEuZmluZChcIi5sZy1vYmplY3RcIik7YS5maW5kKFwiLmxnLXZpZGVvXCIpLmFwcGVuZChqKSxhLmZpbmQoXCIubGctdmlkZW8tb2JqZWN0XCIpLmhhc0NsYXNzKFwibGctaHRtbDVcIil8fChhLnJlbW92ZUNsYXNzKFwibGctY29tcGxldGVcIiksYS5maW5kKFwiLmxnLXZpZGVvLW9iamVjdFwiKS5vbihcImxvYWQubGcgZXJyb3IubGdcIixmdW5jdGlvbigpe2EuYWRkQ2xhc3MoXCJsZy1jb21wbGV0ZVwiKX0pKX19LGYucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnZpZGVvTG9hZGVkPSExfSxhLmZuLmxpZ2h0R2FsbGVyeS5tb2R1bGVzLnZpZGVvPWZ9KCl9KSxmdW5jdGlvbihhLGIpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKGEpe3JldHVybiBiKGEpfSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YihyZXF1aXJlKFwianF1ZXJ5XCIpKTpiKGpRdWVyeSl9KDAsZnVuY3Rpb24oYSl7IWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tKGV8aXVtKVxcLyhbMC05XSspXFwuLyk7cmV0dXJuIGImJnBhcnNlSW50KGJbMl0sMTApPDU0JiYoYT0hMCksYX0sYz17c2NhbGU6MSx6b29tOiEwLGFjdHVhbFNpemU6ITAsZW5hYmxlWm9vbUFmdGVyOjMwMCx1c2VMZWZ0Rm9yWm9vbTpiKCl9LGQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuY29yZT1hKGIpLmRhdGEoXCJsaWdodEdhbGxlcnlcIiksdGhpcy5jb3JlLnM9YS5leHRlbmQoe30sYyx0aGlzLmNvcmUucyksdGhpcy5jb3JlLnMuem9vbSYmdGhpcy5jb3JlLmRvQ3NzKCkmJih0aGlzLmluaXQoKSx0aGlzLnpvb21hYmxldGltZW91dD0hMSx0aGlzLnBhZ2VYPWEod2luZG93KS53aWR0aCgpLzIsdGhpcy5wYWdlWT1hKHdpbmRvdykuaGVpZ2h0KCkvMithKHdpbmRvdykuc2Nyb2xsVG9wKCkpLHRoaXN9O2QucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9JzxzcGFuIGlkPVwibGctem9vbS1pblwiIGNsYXNzPVwibGctaWNvblwiPjwvc3Bhbj48c3BhbiBpZD1cImxnLXpvb20tb3V0XCIgY2xhc3M9XCJsZy1pY29uXCI+PC9zcGFuPic7Yi5jb3JlLnMuYWN0dWFsU2l6ZSYmKGMrPSc8c3BhbiBpZD1cImxnLWFjdHVhbC1zaXplXCIgY2xhc3M9XCJsZy1pY29uXCI+PC9zcGFuPicpLGIuY29yZS5zLnVzZUxlZnRGb3Jab29tP2IuY29yZS4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy11c2UtbGVmdC1mb3Item9vbVwiKTpiLmNvcmUuJG91dGVyLmFkZENsYXNzKFwibGctdXNlLXRyYW5zaXRpb24tZm9yLXpvb21cIiksdGhpcy5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXRvb2xiYXJcIikuYXBwZW5kKGMpLGIuY29yZS4kZWwub24oXCJvblNsaWRlSXRlbUxvYWQubGcudG0uem9vbVwiLGZ1bmN0aW9uKGMsZCxlKXt2YXIgZj1iLmNvcmUucy5lbmFibGVab29tQWZ0ZXIrZTthKFwiYm9keVwiKS5oYXNDbGFzcyhcImxnLWZyb20taGFzaFwiKSYmZT9mPTA6YShcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsZy1mcm9tLWhhc2hcIiksYi56b29tYWJsZXRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2IuY29yZS4kc2xpZGUuZXEoZCkuYWRkQ2xhc3MoXCJsZy16b29tYWJsZVwiKX0sZiszMCl9KTt2YXIgZD0xLGU9ZnVuY3Rpb24oYyl7dmFyIGQsZSxmPWIuY29yZS4kb3V0ZXIuZmluZChcIi5sZy1jdXJyZW50IC5sZy1pbWFnZVwiKSxnPShhKHdpbmRvdykud2lkdGgoKS1mLnByb3AoXCJvZmZzZXRXaWR0aFwiKSkvMixoPShhKHdpbmRvdykuaGVpZ2h0KCktZi5wcm9wKFwib2Zmc2V0SGVpZ2h0XCIpKS8yK2Eod2luZG93KS5zY3JvbGxUb3AoKTtkPWIucGFnZVgtZyxlPWIucGFnZVktaDt2YXIgaT0oYy0xKSpkLGo9KGMtMSkqZTtmLmNzcyhcInRyYW5zZm9ybVwiLFwic2NhbGUzZChcIitjK1wiLCBcIitjK1wiLCAxKVwiKS5hdHRyKFwiZGF0YS1zY2FsZVwiLGMpLGIuY29yZS5zLnVzZUxlZnRGb3Jab29tP2YucGFyZW50KCkuY3NzKHtsZWZ0Oi1pK1wicHhcIix0b3A6LWorXCJweFwifSkuYXR0cihcImRhdGEteFwiLGkpLmF0dHIoXCJkYXRhLXlcIixqKTpmLnBhcmVudCgpLmNzcyhcInRyYW5zZm9ybVwiLFwidHJhbnNsYXRlM2QoLVwiK2krXCJweCwgLVwiK2orXCJweCwgMClcIikuYXR0cihcImRhdGEteFwiLGkpLmF0dHIoXCJkYXRhLXlcIixqKX0sZj1mdW5jdGlvbigpe2Q+MT9iLmNvcmUuJG91dGVyLmFkZENsYXNzKFwibGctem9vbWVkXCIpOmIucmVzZXRab29tKCksZDwxJiYoZD0xKSxlKGQpfSxnPWZ1bmN0aW9uKGMsZSxnLGgpe3ZhciBpLGo9ZS5wcm9wKFwib2Zmc2V0V2lkdGhcIik7aT1iLmNvcmUucy5keW5hbWljP2IuY29yZS5zLmR5bmFtaWNFbFtnXS53aWR0aHx8ZVswXS5uYXR1cmFsV2lkdGh8fGo6Yi5jb3JlLiRpdGVtcy5lcShnKS5hdHRyKFwiZGF0YS13aWR0aFwiKXx8ZVswXS5uYXR1cmFsV2lkdGh8fGo7dmFyIGs7Yi5jb3JlLiRvdXRlci5oYXNDbGFzcyhcImxnLXpvb21lZFwiKT9kPTE6aT5qJiYoaz1pL2osZD1rfHwyKSxoPyhiLnBhZ2VYPWEod2luZG93KS53aWR0aCgpLzIsYi5wYWdlWT1hKHdpbmRvdykuaGVpZ2h0KCkvMithKHdpbmRvdykuc2Nyb2xsVG9wKCkpOihiLnBhZ2VYPWMucGFnZVh8fGMub3JpZ2luYWxFdmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYLGIucGFnZVk9Yy5wYWdlWXx8Yy5vcmlnaW5hbEV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVkpLGYoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5jb3JlLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLWdyYWJiaW5nXCIpLmFkZENsYXNzKFwibGctZ3JhYlwiKX0sMTApfSxoPSExO2IuY29yZS4kZWwub24oXCJvbkFmZXJBcHBlbmRTbGlkZS5sZy50bS56b29tXCIsZnVuY3Rpb24oYSxjKXt2YXIgZD1iLmNvcmUuJHNsaWRlLmVxKGMpLmZpbmQoXCIubGctaW1hZ2VcIik7ZC5vbihcImRibGNsaWNrXCIsZnVuY3Rpb24oYSl7ZyhhLGQsYyl9KSxkLm9uKFwidG91Y2hzdGFydFwiLGZ1bmN0aW9uKGEpe2g/KGNsZWFyVGltZW91dChoKSxoPW51bGwsZyhhLGQsYykpOmg9c2V0VGltZW91dChmdW5jdGlvbigpe2g9bnVsbH0sMzAwKSxhLnByZXZlbnREZWZhdWx0KCl9KX0pLGEod2luZG93KS5vbihcInJlc2l6ZS5sZy56b29tIHNjcm9sbC5sZy56b29tIG9yaWVudGF0aW9uY2hhbmdlLmxnLnpvb21cIixmdW5jdGlvbigpe2IucGFnZVg9YSh3aW5kb3cpLndpZHRoKCkvMixiLnBhZ2VZPWEod2luZG93KS5oZWlnaHQoKS8yK2Eod2luZG93KS5zY3JvbGxUb3AoKSxlKGQpfSksYShcIiNsZy16b29tLW91dFwiKS5vbihcImNsaWNrLmxnXCIsZnVuY3Rpb24oKXtiLmNvcmUuJG91dGVyLmZpbmQoXCIubGctY3VycmVudCAubGctaW1hZ2VcIikubGVuZ3RoJiYoZC09Yi5jb3JlLnMuc2NhbGUsZigpKX0pLGEoXCIjbGctem9vbS1pblwiKS5vbihcImNsaWNrLmxnXCIsZnVuY3Rpb24oKXtiLmNvcmUuJG91dGVyLmZpbmQoXCIubGctY3VycmVudCAubGctaW1hZ2VcIikubGVuZ3RoJiYoZCs9Yi5jb3JlLnMuc2NhbGUsZigpKX0pLGEoXCIjbGctYWN0dWFsLXNpemVcIikub24oXCJjbGljay5sZ1wiLGZ1bmN0aW9uKGEpe2coYSxiLmNvcmUuJHNsaWRlLmVxKGIuY29yZS5pbmRleCkuZmluZChcIi5sZy1pbWFnZVwiKSxiLmNvcmUuaW5kZXgsITApfSksYi5jb3JlLiRlbC5vbihcIm9uQmVmb3JlU2xpZGUubGcudG1cIixmdW5jdGlvbigpe2Q9MSxiLnJlc2V0Wm9vbSgpfSksYi56b29tRHJhZygpLGIuem9vbVN3aXBlKCl9LGQucHJvdG90eXBlLnJlc2V0Wm9vbT1mdW5jdGlvbigpe3RoaXMuY29yZS4kb3V0ZXIucmVtb3ZlQ2xhc3MoXCJsZy16b29tZWRcIiksdGhpcy5jb3JlLiRzbGlkZS5maW5kKFwiLmxnLWltZy13cmFwXCIpLnJlbW92ZUF0dHIoXCJzdHlsZSBkYXRhLXggZGF0YS15XCIpLHRoaXMuY29yZS4kc2xpZGUuZmluZChcIi5sZy1pbWFnZVwiKS5yZW1vdmVBdHRyKFwic3R5bGUgZGF0YS1zY2FsZVwiKSx0aGlzLnBhZ2VYPWEod2luZG93KS53aWR0aCgpLzIsdGhpcy5wYWdlWT1hKHdpbmRvdykuaGVpZ2h0KCkvMithKHdpbmRvdykuc2Nyb2xsVG9wKCl9LGQucHJvdG90eXBlLnpvb21Td2lwZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj17fSxjPXt9LGQ9ITEsZT0hMSxmPSExO2EuY29yZS4kc2xpZGUub24oXCJ0b3VjaHN0YXJ0LmxnXCIsZnVuY3Rpb24oYyl7aWYoYS5jb3JlLiRvdXRlci5oYXNDbGFzcyhcImxnLXpvb21lZFwiKSl7dmFyIGQ9YS5jb3JlLiRzbGlkZS5lcShhLmNvcmUuaW5kZXgpLmZpbmQoXCIubGctb2JqZWN0XCIpO2Y9ZC5wcm9wKFwib2Zmc2V0SGVpZ2h0XCIpKmQuYXR0cihcImRhdGEtc2NhbGVcIik+YS5jb3JlLiRvdXRlci5maW5kKFwiLmxnXCIpLmhlaWdodCgpLGU9ZC5wcm9wKFwib2Zmc2V0V2lkdGhcIikqZC5hdHRyKFwiZGF0YS1zY2FsZVwiKT5hLmNvcmUuJG91dGVyLmZpbmQoXCIubGdcIikud2lkdGgoKSwoZXx8ZikmJihjLnByZXZlbnREZWZhdWx0KCksYj17eDpjLm9yaWdpbmFsRXZlbnQudGFyZ2V0VG91Y2hlc1swXS5wYWdlWCx5OmMub3JpZ2luYWxFdmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VZfSl9fSksYS5jb3JlLiRzbGlkZS5vbihcInRvdWNobW92ZS5sZ1wiLGZ1bmN0aW9uKGcpe2lmKGEuY29yZS4kb3V0ZXIuaGFzQ2xhc3MoXCJsZy16b29tZWRcIikpe3ZhciBoLGksaj1hLmNvcmUuJHNsaWRlLmVxKGEuY29yZS5pbmRleCkuZmluZChcIi5sZy1pbWctd3JhcFwiKTtnLnByZXZlbnREZWZhdWx0KCksZD0hMCxjPXt4Omcub3JpZ2luYWxFdmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYLHk6Zy5vcmlnaW5hbEV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVl9LGEuY29yZS4kb3V0ZXIuYWRkQ2xhc3MoXCJsZy16b29tLWRyYWdnaW5nXCIpLGk9Zj8tTWF0aC5hYnMoai5hdHRyKFwiZGF0YS15XCIpKSsoYy55LWIueSk6LU1hdGguYWJzKGouYXR0cihcImRhdGEteVwiKSksaD1lPy1NYXRoLmFicyhqLmF0dHIoXCJkYXRhLXhcIikpKyhjLngtYi54KTotTWF0aC5hYnMoai5hdHRyKFwiZGF0YS14XCIpKSwoTWF0aC5hYnMoYy54LWIueCk+MTV8fE1hdGguYWJzKGMueS1iLnkpPjE1KSYmKGEuY29yZS5zLnVzZUxlZnRGb3Jab29tP2ouY3NzKHtsZWZ0OmgrXCJweFwiLHRvcDppK1wicHhcIn0pOmouY3NzKFwidHJhbnNmb3JtXCIsXCJ0cmFuc2xhdGUzZChcIitoK1wicHgsIFwiK2krXCJweCwgMClcIikpfX0pLGEuY29yZS4kc2xpZGUub24oXCJ0b3VjaGVuZC5sZ1wiLGZ1bmN0aW9uKCl7YS5jb3JlLiRvdXRlci5oYXNDbGFzcyhcImxnLXpvb21lZFwiKSYmZCYmKGQ9ITEsYS5jb3JlLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLXpvb20tZHJhZ2dpbmdcIiksYS50b3VjaGVuZFpvb20oYixjLGUsZikpfSl9LGQucHJvdG90eXBlLnpvb21EcmFnPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPXt9LGQ9e30sZT0hMSxmPSExLGc9ITEsaD0hMTtiLmNvcmUuJHNsaWRlLm9uKFwibW91c2Vkb3duLmxnLnpvb21cIixmdW5jdGlvbihkKXt2YXIgZj1iLmNvcmUuJHNsaWRlLmVxKGIuY29yZS5pbmRleCkuZmluZChcIi5sZy1vYmplY3RcIik7aD1mLnByb3AoXCJvZmZzZXRIZWlnaHRcIikqZi5hdHRyKFwiZGF0YS1zY2FsZVwiKT5iLmNvcmUuJG91dGVyLmZpbmQoXCIubGdcIikuaGVpZ2h0KCksZz1mLnByb3AoXCJvZmZzZXRXaWR0aFwiKSpmLmF0dHIoXCJkYXRhLXNjYWxlXCIpPmIuY29yZS4kb3V0ZXIuZmluZChcIi5sZ1wiKS53aWR0aCgpLGIuY29yZS4kb3V0ZXIuaGFzQ2xhc3MoXCJsZy16b29tZWRcIikmJmEoZC50YXJnZXQpLmhhc0NsYXNzKFwibGctb2JqZWN0XCIpJiYoZ3x8aCkmJihkLnByZXZlbnREZWZhdWx0KCksYz17eDpkLnBhZ2VYLHk6ZC5wYWdlWX0sZT0hMCxiLmNvcmUuJG91dGVyLnNjcm9sbExlZnQrPTEsYi5jb3JlLiRvdXRlci5zY3JvbGxMZWZ0LT0xLGIuY29yZS4kb3V0ZXIucmVtb3ZlQ2xhc3MoXCJsZy1ncmFiXCIpLmFkZENsYXNzKFwibGctZ3JhYmJpbmdcIikpfSksYSh3aW5kb3cpLm9uKFwibW91c2Vtb3ZlLmxnLnpvb21cIixmdW5jdGlvbihhKXtpZihlKXt2YXIgaSxqLGs9Yi5jb3JlLiRzbGlkZS5lcShiLmNvcmUuaW5kZXgpLmZpbmQoXCIubGctaW1nLXdyYXBcIik7Zj0hMCxkPXt4OmEucGFnZVgseTphLnBhZ2VZfSxiLmNvcmUuJG91dGVyLmFkZENsYXNzKFwibGctem9vbS1kcmFnZ2luZ1wiKSxqPWg/LU1hdGguYWJzKGsuYXR0cihcImRhdGEteVwiKSkrKGQueS1jLnkpOi1NYXRoLmFicyhrLmF0dHIoXCJkYXRhLXlcIikpLGk9Zz8tTWF0aC5hYnMoay5hdHRyKFwiZGF0YS14XCIpKSsoZC54LWMueCk6LU1hdGguYWJzKGsuYXR0cihcImRhdGEteFwiKSksYi5jb3JlLnMudXNlTGVmdEZvclpvb20/ay5jc3Moe2xlZnQ6aStcInB4XCIsdG9wOmorXCJweFwifSk6ay5jc3MoXCJ0cmFuc2Zvcm1cIixcInRyYW5zbGF0ZTNkKFwiK2krXCJweCwgXCIraitcInB4LCAwKVwiKX19KSxhKHdpbmRvdykub24oXCJtb3VzZXVwLmxnLnpvb21cIixmdW5jdGlvbihhKXtlJiYoZT0hMSxiLmNvcmUuJG91dGVyLnJlbW92ZUNsYXNzKFwibGctem9vbS1kcmFnZ2luZ1wiKSwhZnx8Yy54PT09ZC54JiZjLnk9PT1kLnl8fChkPXt4OmEucGFnZVgseTphLnBhZ2VZfSxiLnRvdWNoZW5kWm9vbShjLGQsZyxoKSksZj0hMSksYi5jb3JlLiRvdXRlci5yZW1vdmVDbGFzcyhcImxnLWdyYWJiaW5nXCIpLmFkZENsYXNzKFwibGctZ3JhYlwiKX0pfSxkLnByb3RvdHlwZS50b3VjaGVuZFpvb209ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcyxmPWUuY29yZS4kc2xpZGUuZXEoZS5jb3JlLmluZGV4KS5maW5kKFwiLmxnLWltZy13cmFwXCIpLGc9ZS5jb3JlLiRzbGlkZS5lcShlLmNvcmUuaW5kZXgpLmZpbmQoXCIubGctb2JqZWN0XCIpLGg9LU1hdGguYWJzKGYuYXR0cihcImRhdGEteFwiKSkrKGIueC1hLngpLGk9LU1hdGguYWJzKGYuYXR0cihcImRhdGEteVwiKSkrKGIueS1hLnkpLGo9KGUuY29yZS4kb3V0ZXIuZmluZChcIi5sZ1wiKS5oZWlnaHQoKS1nLnByb3AoXCJvZmZzZXRIZWlnaHRcIikpLzIsaz1NYXRoLmFicyhnLnByb3AoXCJvZmZzZXRIZWlnaHRcIikqTWF0aC5hYnMoZy5hdHRyKFwiZGF0YS1zY2FsZVwiKSktZS5jb3JlLiRvdXRlci5maW5kKFwiLmxnXCIpLmhlaWdodCgpK2opLGw9KGUuY29yZS4kb3V0ZXIuZmluZChcIi5sZ1wiKS53aWR0aCgpLWcucHJvcChcIm9mZnNldFdpZHRoXCIpKS8yLG09TWF0aC5hYnMoZy5wcm9wKFwib2Zmc2V0V2lkdGhcIikqTWF0aC5hYnMoZy5hdHRyKFwiZGF0YS1zY2FsZVwiKSktZS5jb3JlLiRvdXRlci5maW5kKFwiLmxnXCIpLndpZHRoKCkrbCk7KE1hdGguYWJzKGIueC1hLngpPjE1fHxNYXRoLmFicyhiLnktYS55KT4xNSkmJihkJiYoaTw9LWs/aT0tazppPj0taiYmKGk9LWopKSxjJiYoaDw9LW0/aD0tbTpoPj0tbCYmKGg9LWwpKSxkP2YuYXR0cihcImRhdGEteVwiLE1hdGguYWJzKGkpKTppPS1NYXRoLmFicyhmLmF0dHIoXCJkYXRhLXlcIikpLGM/Zi5hdHRyKFwiZGF0YS14XCIsTWF0aC5hYnMoaCkpOmg9LU1hdGguYWJzKGYuYXR0cihcImRhdGEteFwiKSksZS5jb3JlLnMudXNlTGVmdEZvclpvb20/Zi5jc3Moe2xlZnQ6aCtcInB4XCIsdG9wOmkrXCJweFwifSk6Zi5jc3MoXCJ0cmFuc2Zvcm1cIixcInRyYW5zbGF0ZTNkKFwiK2grXCJweCwgXCIraStcInB4LCAwKVwiKSl9LGQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2IuY29yZS4kZWwub2ZmKFwiLmxnLnpvb21cIiksYSh3aW5kb3cpLm9mZihcIi5sZy56b29tXCIpLGIuY29yZS4kc2xpZGUub2ZmKFwiLmxnLnpvb21cIiksYi5jb3JlLiRlbC5vZmYoXCIubGcudG0uem9vbVwiKSxiLnJlc2V0Wm9vbSgpLGNsZWFyVGltZW91dChiLnpvb21hYmxldGltZW91dCksYi56b29tYWJsZXRpbWVvdXQ9ITF9LGEuZm4ubGlnaHRHYWxsZXJ5Lm1vZHVsZXMuem9vbT1kfSgpfSksZnVuY3Rpb24oYSxiKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImpxdWVyeVwiXSxmdW5jdGlvbihhKXtyZXR1cm4gYihhKX0pOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWIocmVxdWlyZShcImpxdWVyeVwiKSk6YihqUXVlcnkpfSgwLGZ1bmN0aW9uKGEpeyFmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBiPXtoYXNoOiEwfSxjPWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLmNvcmU9YShjKS5kYXRhKFwibGlnaHRHYWxsZXJ5XCIpLHRoaXMuY29yZS5zPWEuZXh0ZW5kKHt9LGIsdGhpcy5jb3JlLnMpLHRoaXMuY29yZS5zLmhhc2gmJih0aGlzLm9sZEhhc2g9d2luZG93LmxvY2F0aW9uLmhhc2gsdGhpcy5pbml0KCkpLHRoaXN9O2MucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYixjPXRoaXM7Yy5jb3JlLiRlbC5vbihcIm9uQWZ0ZXJTbGlkZS5sZy50bVwiLGZ1bmN0aW9uKGEsYixkKXtoaXN0b3J5LnJlcGxhY2VTdGF0ZT9oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLG51bGwsd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lK3dpbmRvdy5sb2NhdGlvbi5zZWFyY2grXCIjbGc9XCIrYy5jb3JlLnMuZ2FsbGVyeUlkK1wiJnNsaWRlPVwiK2QpOndpbmRvdy5sb2NhdGlvbi5oYXNoPVwibGc9XCIrYy5jb3JlLnMuZ2FsbGVyeUlkK1wiJnNsaWRlPVwiK2R9KSxhKHdpbmRvdykub24oXCJoYXNoY2hhbmdlLmxnLmhhc2hcIixmdW5jdGlvbigpe2I9d2luZG93LmxvY2F0aW9uLmhhc2g7dmFyIGE9cGFyc2VJbnQoYi5zcGxpdChcIiZzbGlkZT1cIilbMV0sMTApO2IuaW5kZXhPZihcImxnPVwiK2MuY29yZS5zLmdhbGxlcnlJZCk+LTE/Yy5jb3JlLnNsaWRlKGEsITEsITEpOmMuY29yZS5sR2FsbGVyeU9uJiZjLmNvcmUuZGVzdHJveSgpfSl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNvcmUucy5oYXNoJiYodGhpcy5vbGRIYXNoJiZ0aGlzLm9sZEhhc2guaW5kZXhPZihcImxnPVwiK3RoaXMuY29yZS5zLmdhbGxlcnlJZCk8MD9oaXN0b3J5LnJlcGxhY2VTdGF0ZT9oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLG51bGwsdGhpcy5vbGRIYXNoKTp3aW5kb3cubG9jYXRpb24uaGFzaD10aGlzLm9sZEhhc2g6aGlzdG9yeS5yZXBsYWNlU3RhdGU/aGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCxkb2N1bWVudC50aXRsZSx3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUrd2luZG93LmxvY2F0aW9uLnNlYXJjaCk6d2luZG93LmxvY2F0aW9uLmhhc2g9XCJcIix0aGlzLmNvcmUuJGVsLm9mZihcIi5sZy5oYXNoXCIpKX0sYS5mbi5saWdodEdhbGxlcnkubW9kdWxlcy5oYXNoPWN9KCl9KSxmdW5jdGlvbihhLGIpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKGEpe3JldHVybiBiKGEpfSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YihyZXF1aXJlKFwianF1ZXJ5XCIpKTpiKGpRdWVyeSl9KDAsZnVuY3Rpb24oYSl7IWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9e3NoYXJlOiEwLGZhY2Vib29rOiEwLGZhY2Vib29rRHJvcGRvd25UZXh0OlwiRmFjZWJvb2tcIix0d2l0dGVyOiEwLHR3aXR0ZXJEcm9wZG93blRleHQ6XCJUd2l0dGVyXCIsZ29vZ2xlUGx1czohMCxnb29nbGVQbHVzRHJvcGRvd25UZXh0OlwiR29vZ2xlUGx1c1wiLHBpbnRlcmVzdDohMCxwaW50ZXJlc3REcm9wZG93blRleHQ6XCJQaW50ZXJlc3RcIn0sYz1mdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5jb3JlPWEoYykuZGF0YShcImxpZ2h0R2FsbGVyeVwiKSx0aGlzLmNvcmUucz1hLmV4dGVuZCh7fSxiLHRoaXMuY29yZS5zKSx0aGlzLmNvcmUucy5zaGFyZSYmdGhpcy5pbml0KCksdGhpc307Yy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBiPXRoaXMsYz0nPHNwYW4gaWQ9XCJsZy1zaGFyZVwiIGNsYXNzPVwibGctaWNvblwiPjx1bCBjbGFzcz1cImxnLWRyb3Bkb3duXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7XCI+JztjKz1iLmNvcmUucy5mYWNlYm9vaz8nPGxpPjxhIGlkPVwibGctc2hhcmUtZmFjZWJvb2tcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3BhbiBjbGFzcz1cImxnLWljb25cIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJsZy1kcm9wZG93bi10ZXh0XCI+Jyt0aGlzLmNvcmUucy5mYWNlYm9va0Ryb3Bkb3duVGV4dCtcIjwvc3Bhbj48L2E+PC9saT5cIjpcIlwiLGMrPWIuY29yZS5zLnR3aXR0ZXI/JzxsaT48YSBpZD1cImxnLXNoYXJlLXR3aXR0ZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3BhbiBjbGFzcz1cImxnLWljb25cIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJsZy1kcm9wZG93bi10ZXh0XCI+Jyt0aGlzLmNvcmUucy50d2l0dGVyRHJvcGRvd25UZXh0K1wiPC9zcGFuPjwvYT48L2xpPlwiOlwiXCIsYys9Yi5jb3JlLnMuZ29vZ2xlUGx1cz8nPGxpPjxhIGlkPVwibGctc2hhcmUtZ29vZ2xlcGx1c1wiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuIGNsYXNzPVwibGctaWNvblwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImxnLWRyb3Bkb3duLXRleHRcIj4nK3RoaXMuY29yZS5zLmdvb2dsZVBsdXNEcm9wZG93blRleHQrXCI8L3NwYW4+PC9hPjwvbGk+XCI6XCJcIixjKz1iLmNvcmUucy5waW50ZXJlc3Q/JzxsaT48YSBpZD1cImxnLXNoYXJlLXBpbnRlcmVzdFwiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuIGNsYXNzPVwibGctaWNvblwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImxnLWRyb3Bkb3duLXRleHRcIj4nK3RoaXMuY29yZS5zLnBpbnRlcmVzdERyb3Bkb3duVGV4dCtcIjwvc3Bhbj48L2E+PC9saT5cIjpcIlwiLGMrPVwiPC91bD48L3NwYW4+XCIsdGhpcy5jb3JlLiRvdXRlci5maW5kKFwiLmxnLXRvb2xiYXJcIikuYXBwZW5kKGMpLHRoaXMuY29yZS4kb3V0ZXIuZmluZChcIi5sZ1wiKS5hcHBlbmQoJzxkaXYgaWQ9XCJsZy1kcm9wZG93bi1vdmVybGF5XCI+PC9kaXY+JyksYShcIiNsZy1zaGFyZVwiKS5vbihcImNsaWNrLmxnXCIsZnVuY3Rpb24oKXtiLmNvcmUuJG91dGVyLnRvZ2dsZUNsYXNzKFwibGctZHJvcGRvd24tYWN0aXZlXCIpfSksYShcIiNsZy1kcm9wZG93bi1vdmVybGF5XCIpLm9uKFwiY2xpY2subGdcIixmdW5jdGlvbigpe2IuY29yZS4kb3V0ZXIucmVtb3ZlQ2xhc3MoXCJsZy1kcm9wZG93bi1hY3RpdmVcIil9KSxiLmNvcmUuJGVsLm9uKFwib25BZnRlclNsaWRlLmxnLnRtXCIsZnVuY3Rpb24oYyxkLGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXthKFwiI2xnLXNoYXJlLWZhY2Vib29rXCIpLmF0dHIoXCJocmVmXCIsXCJodHRwczovL3d3dy5mYWNlYm9vay5jb20vc2hhcmVyL3NoYXJlci5waHA/dT1cIitlbmNvZGVVUklDb21wb25lbnQoYi5nZXRTYWhyZVByb3BzKGUsXCJmYWNlYm9va1NoYXJlVXJsXCIpfHx3aW5kb3cubG9jYXRpb24uaHJlZikpLGEoXCIjbGctc2hhcmUtdHdpdHRlclwiKS5hdHRyKFwiaHJlZlwiLFwiaHR0cHM6Ly90d2l0dGVyLmNvbS9pbnRlbnQvdHdlZXQ/dGV4dD1cIitiLmdldFNhaHJlUHJvcHMoZSxcInR3ZWV0VGV4dFwiKStcIiZ1cmw9XCIrZW5jb2RlVVJJQ29tcG9uZW50KGIuZ2V0U2FocmVQcm9wcyhlLFwidHdpdHRlclNoYXJlVXJsXCIpfHx3aW5kb3cubG9jYXRpb24uaHJlZikpLGEoXCIjbGctc2hhcmUtZ29vZ2xlcGx1c1wiKS5hdHRyKFwiaHJlZlwiLFwiaHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vc2hhcmU/dXJsPVwiK2VuY29kZVVSSUNvbXBvbmVudChiLmdldFNhaHJlUHJvcHMoZSxcImdvb2dsZXBsdXNTaGFyZVVybFwiKXx8d2luZG93LmxvY2F0aW9uLmhyZWYpKSxhKFwiI2xnLXNoYXJlLXBpbnRlcmVzdFwiKS5hdHRyKFwiaHJlZlwiLFwiaHR0cDovL3d3dy5waW50ZXJlc3QuY29tL3Bpbi9jcmVhdGUvYnV0dG9uLz91cmw9XCIrZW5jb2RlVVJJQ29tcG9uZW50KGIuZ2V0U2FocmVQcm9wcyhlLFwicGludGVyZXN0U2hhcmVVcmxcIil8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKStcIiZtZWRpYT1cIitlbmNvZGVVUklDb21wb25lbnQoYi5nZXRTYWhyZVByb3BzKGUsXCJzcmNcIikpK1wiJmRlc2NyaXB0aW9uPVwiK2IuZ2V0U2FocmVQcm9wcyhlLFwicGludGVyZXN0VGV4dFwiKSl9LDEwMCl9KX0sYy5wcm90b3R5cGUuZ2V0U2FocmVQcm9wcz1mdW5jdGlvbihhLGIpe3ZhciBjPVwiXCI7aWYodGhpcy5jb3JlLnMuZHluYW1pYyljPXRoaXMuY29yZS5zLmR5bmFtaWNFbFthXVtiXTtlbHNle3ZhciBkPXRoaXMuY29yZS4kaXRlbXMuZXEoYSkuYXR0cihcImhyZWZcIiksZT10aGlzLmNvcmUuJGl0ZW1zLmVxKGEpLmRhdGEoYik7Yz1cInNyY1wiPT09Yj9kfHxlOmV9cmV0dXJuIGN9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LGEuZm4ubGlnaHRHYWxsZXJ5Lm1vZHVsZXMuc2hhcmU9Y30oKX0pOyIsIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdENsYXNzOiBwcmV0dHlQaG90b1xyXG5cdFVzZTogTGlnaHRib3ggY2xvbmUgZm9yIGpRdWVyeVxyXG5cdEF1dGhvcjogU3RlcGhhbmUgQ2Fyb24gKGh0dHA6Ly93d3cubm8tbWFyZ2luLWZvci1lcnJvcnMuY29tKVxyXG5cdFZlcnNpb246IDMuMS42XHJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuKGZ1bmN0aW9uKCQpIHtcclxuXHQkLnByZXR0eVBob3RvID0ge3ZlcnNpb246ICczLjEuNid9O1xyXG5cdFxyXG5cdCQuZm4ucHJldHR5UGhvdG8gPSBmdW5jdGlvbihwcF9zZXR0aW5ncykge1xyXG5cdFx0cHBfc2V0dGluZ3MgPSBqUXVlcnkuZXh0ZW5kKHtcclxuXHRcdFx0aG9vazogJ3JlbCcsIC8qIHRoZSBhdHRyaWJ1dGUgdGFnIHRvIHVzZSBmb3IgcHJldHR5UGhvdG8gaG9va3MuIGRlZmF1bHQ6ICdyZWwnLiBGb3IgSFRNTDUsIHVzZSBcImRhdGEtcmVsXCIgb3Igc2ltaWxhci4gKi9cclxuXHRcdFx0YW5pbWF0aW9uX3NwZWVkOiAnZmFzdCcsIC8qIGZhc3Qvc2xvdy9ub3JtYWwgKi9cclxuXHRcdFx0YWpheGNhbGxiYWNrOiBmdW5jdGlvbigpIHt9LFxyXG5cdFx0XHRzbGlkZXNob3c6IDUwMDAsIC8qIGZhbHNlIE9SIGludGVydmFsIHRpbWUgaW4gbXMgKi9cclxuXHRcdFx0YXV0b3BsYXlfc2xpZGVzaG93OiBmYWxzZSwgLyogdHJ1ZS9mYWxzZSAqL1xyXG5cdFx0XHRvcGFjaXR5OiAwLjgwLCAvKiBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDEgKi9cclxuXHRcdFx0c2hvd190aXRsZTogdHJ1ZSwgLyogdHJ1ZS9mYWxzZSAqL1xyXG5cdFx0XHRhbGxvd19yZXNpemU6IHRydWUsIC8qIFJlc2l6ZSB0aGUgcGhvdG9zIGJpZ2dlciB0aGFuIHZpZXdwb3J0LiB0cnVlL2ZhbHNlICovXHJcblx0XHRcdGFsbG93X2V4cGFuZDogdHJ1ZSwgLyogQWxsb3cgdGhlIHVzZXIgdG8gZXhwYW5kIGEgcmVzaXplZCBpbWFnZS4gdHJ1ZS9mYWxzZSAqL1xyXG5cdFx0XHRkZWZhdWx0X3dpZHRoOiA1MDAsXHJcblx0XHRcdGRlZmF1bHRfaGVpZ2h0OiAzNDQsXHJcblx0XHRcdGNvdW50ZXJfc2VwYXJhdG9yX2xhYmVsOiAnLycsIC8qIFRoZSBzZXBhcmF0b3IgZm9yIHRoZSBnYWxsZXJ5IGNvdW50ZXIgMSBcIm9mXCIgMiAqL1xyXG5cdFx0XHR0aGVtZTogJ3BwX2RlZmF1bHQnLCAvKiBsaWdodF9yb3VuZGVkIC8gZGFya19yb3VuZGVkIC8gbGlnaHRfc3F1YXJlIC8gZGFya19zcXVhcmUgLyBmYWNlYm9vayAqL1xyXG5cdFx0XHRob3Jpem9udGFsX3BhZGRpbmc6IDIwLCAvKiBUaGUgcGFkZGluZyBvbiBlYWNoIHNpZGUgb2YgdGhlIHBpY3R1cmUgKi9cclxuXHRcdFx0aGlkZWZsYXNoOiBmYWxzZSwgLyogSGlkZXMgYWxsIHRoZSBmbGFzaCBvYmplY3Qgb24gYSBwYWdlLCBzZXQgdG8gVFJVRSBpZiBmbGFzaCBhcHBlYXJzIG92ZXIgcHJldHR5UGhvdG8gKi9cclxuXHRcdFx0d21vZGU6ICdvcGFxdWUnLCAvKiBTZXQgdGhlIGZsYXNoIHdtb2RlIGF0dHJpYnV0ZSAqL1xyXG5cdFx0XHRhdXRvcGxheTogdHJ1ZSwgLyogQXV0b21hdGljYWxseSBzdGFydCB2aWRlb3M6IFRydWUvRmFsc2UgKi9cclxuXHRcdFx0bW9kYWw6IGZhbHNlLCAvKiBJZiBzZXQgdG8gdHJ1ZSwgb25seSB0aGUgY2xvc2UgYnV0dG9uIHdpbGwgY2xvc2UgdGhlIHdpbmRvdyAqL1xyXG5cdFx0XHRkZWVwbGlua2luZzogdHJ1ZSwgLyogQWxsb3cgcHJldHR5UGhvdG8gdG8gdXBkYXRlIHRoZSB1cmwgdG8gZW5hYmxlIGRlZXBsaW5raW5nLiAqL1xyXG5cdFx0XHRvdmVybGF5X2dhbGxlcnk6IHRydWUsIC8qIElmIHNldCB0byB0cnVlLCBhIGdhbGxlcnkgd2lsbCBvdmVybGF5IHRoZSBmdWxsc2NyZWVuIGltYWdlIG9uIG1vdXNlIG92ZXIgKi9cclxuXHRcdFx0b3ZlcmxheV9nYWxsZXJ5X21heDogMzAsIC8qIE1heGltdW0gbnVtYmVyIG9mIHBpY3R1cmVzIGluIHRoZSBvdmVybGF5IGdhbGxlcnkgKi9cclxuXHRcdFx0a2V5Ym9hcmRfc2hvcnRjdXRzOiB0cnVlLCAvKiBTZXQgdG8gZmFsc2UgaWYgeW91IG9wZW4gZm9ybXMgaW5zaWRlIHByZXR0eVBob3RvICovXHJcblx0XHRcdGNoYW5nZXBpY3R1cmVjYWxsYmFjazogZnVuY3Rpb24oKXt9LCAvKiBDYWxsZWQgZXZlcnl0aW1lIGFuIGl0ZW0gaXMgc2hvd24vY2hhbmdlZCAqL1xyXG5cdFx0XHRjYWxsYmFjazogZnVuY3Rpb24oKXt9LCAvKiBDYWxsZWQgd2hlbiBwcmV0dHlQaG90byBpcyBjbG9zZWQgKi9cclxuXHRcdFx0aWU2X2ZhbGxiYWNrOiB0cnVlLFxyXG5cdFx0XHRtYXJrdXA6ICc8ZGl2IGNsYXNzPVwicHBfcGljX2hvbGRlclwiPiBcXFxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHB0XCI+Jm5ic3A7PC9kaXY+IFxcXHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwcF90b3BcIj4gXFxcclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHBfbGVmdFwiPjwvZGl2PiBcXFxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwcF9taWRkbGVcIj48L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHBfcmlnaHRcIj48L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0PC9kaXY+IFxcXHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwcF9jb250ZW50X2NvbnRhaW5lclwiPiBcXFxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwcF9sZWZ0XCI+IFxcXHJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBwX3JpZ2h0XCI+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHBfY29udGVudFwiPiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHBfbG9hZGVySWNvblwiPjwvZGl2PiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHBfZmFkZVwiPiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJwcF9leHBhbmRcIiB0aXRsZT1cIkV4cGFuZCB0aGUgaW1hZ2VcIj5FeHBhbmQ8L2E+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBwX2hvdmVyQ29udGFpbmVyXCI+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8YSBjbGFzcz1cInBwX25leHRcIiBocmVmPVwiI1wiPm5leHQ8L2E+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8YSBjbGFzcz1cInBwX3ByZXZpb3VzXCIgaHJlZj1cIiNcIj5wcmV2aW91czwvYT4gXFxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwicHBfZnVsbF9yZXNcIj48L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHBfZGV0YWlsc1wiPiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBwX25hdlwiPiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8YSBocmVmPVwiI1wiIGNsYXNzPVwicHBfYXJyb3dfcHJldmlvdXNcIj5QcmV2aW91czwvYT4gXFxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjdXJyZW50VGV4dEhvbGRlclwiPjAvMDwvcD4gXFxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGEgaHJlZj1cIiNcIiBjbGFzcz1cInBwX2Fycm93X25leHRcIj5OZXh0PC9hPiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cCBjbGFzcz1cInBwX2Rlc2NyaXB0aW9uXCI+PC9wPiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBwX3NvY2lhbFwiPntwcF9zb2NpYWx9PC9kaXY+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8YSBjbGFzcz1cInBwX2Nsb3NlXCIgaHJlZj1cIiNcIj5DbG9zZTwvYT4gXFxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0PC9kaXY+IFxcXHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwcF9ib3R0b21cIj4gXFxcclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHBfbGVmdFwiPjwvZGl2PiBcXFxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwcF9taWRkbGVcIj48L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHBfcmlnaHRcIj48L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0PC9kaXY+IFxcXHJcblx0XHRcdFx0XHQ8L2Rpdj4gXFxcclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwcF9vdmVybGF5XCI+PC9kaXY+JyxcclxuXHRcdFx0Z2FsbGVyeV9tYXJrdXA6ICc8ZGl2IGNsYXNzPVwicHBfZ2FsbGVyeVwiPiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0PGEgaHJlZj1cIiNcIiBjbGFzcz1cInBwX2Fycm93X3ByZXZpb3VzXCI+UHJldmlvdXM8L2E+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2PiBcXFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dWw+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0e2dhbGxlcnl9IFxcXHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvdWw+IFxcXHJcblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj4gXFxcclxuXHRcdFx0XHRcdFx0XHRcdDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJwcF9hcnJvd19uZXh0XCI+TmV4dDwvYT4gXFxcclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj4nLFxyXG5cdFx0XHRpbWFnZV9tYXJrdXA6ICc8aW1nIGlkPVwiZnVsbFJlc0ltYWdlXCIgc3JjPVwie3BhdGh9XCIgLz4nLFxyXG5cdFx0XHRmbGFzaF9tYXJrdXA6ICc8b2JqZWN0IGNsYXNzaWQ9XCJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDBcIiB3aWR0aD1cInt3aWR0aH1cIiBoZWlnaHQ9XCJ7aGVpZ2h0fVwiPjxwYXJhbSBuYW1lPVwid21vZGVcIiB2YWx1ZT1cInt3bW9kZX1cIiAvPjxwYXJhbSBuYW1lPVwiYWxsb3dmdWxsc2NyZWVuXCIgdmFsdWU9XCJ0cnVlXCIgLz48cGFyYW0gbmFtZT1cImFsbG93c2NyaXB0YWNjZXNzXCIgdmFsdWU9XCJhbHdheXNcIiAvPjxwYXJhbSBuYW1lPVwibW92aWVcIiB2YWx1ZT1cIntwYXRofVwiIC8+PGVtYmVkIHNyYz1cIntwYXRofVwiIHR5cGU9XCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaFwiIGFsbG93ZnVsbHNjcmVlbj1cInRydWVcIiBhbGxvd3NjcmlwdGFjY2Vzcz1cImFsd2F5c1wiIHdpZHRoPVwie3dpZHRofVwiIGhlaWdodD1cIntoZWlnaHR9XCIgd21vZGU9XCJ7d21vZGV9XCI+PC9lbWJlZD48L29iamVjdD4nLFxyXG5cdFx0XHRxdWlja3RpbWVfbWFya3VwOiAnPG9iamVjdCBjbGFzc2lkPVwiY2xzaWQ6MDJCRjI1RDUtOEMxNy00QjIzLUJDODAtRDM0ODhBQkREQzZCXCIgY29kZWJhc2U9XCJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdGFjdGl2ZXgvcXRwbHVnaW4uY2FiXCIgaGVpZ2h0PVwie2hlaWdodH1cIiB3aWR0aD1cInt3aWR0aH1cIj48cGFyYW0gbmFtZT1cInNyY1wiIHZhbHVlPVwie3BhdGh9XCI+PHBhcmFtIG5hbWU9XCJhdXRvcGxheVwiIHZhbHVlPVwie2F1dG9wbGF5fVwiPjxwYXJhbSBuYW1lPVwidHlwZVwiIHZhbHVlPVwidmlkZW8vcXVpY2t0aW1lXCI+PGVtYmVkIHNyYz1cIntwYXRofVwiIGhlaWdodD1cIntoZWlnaHR9XCIgd2lkdGg9XCJ7d2lkdGh9XCIgYXV0b3BsYXk9XCJ7YXV0b3BsYXl9XCIgdHlwZT1cInZpZGVvL3F1aWNrdGltZVwiIHBsdWdpbnNwYWdlPVwiaHR0cDovL3d3dy5hcHBsZS5jb20vcXVpY2t0aW1lL2Rvd25sb2FkL1wiPjwvZW1iZWQ+PC9vYmplY3Q+JyxcclxuXHRcdFx0aWZyYW1lX21hcmt1cDogJzxpZnJhbWUgc3JjID1cIntwYXRofVwiIHdpZHRoPVwie3dpZHRofVwiIGhlaWdodD1cIntoZWlnaHR9XCIgZnJhbWVib3JkZXI9XCJub1wiPjwvaWZyYW1lPicsXHJcblx0XHRcdGlubGluZV9tYXJrdXA6ICc8ZGl2IGNsYXNzPVwicHBfaW5saW5lXCI+e2NvbnRlbnR9PC9kaXY+JyxcclxuXHRcdFx0Y3VzdG9tX21hcmt1cDogJycsXHJcblx0XHRcdHNvY2lhbF90b29sczogJzxkaXYgY2xhc3M9XCJ0d2l0dGVyXCI+PGEgaHJlZj1cImh0dHA6Ly90d2l0dGVyLmNvbS9zaGFyZVwiIGNsYXNzPVwidHdpdHRlci1zaGFyZS1idXR0b25cIiBkYXRhLWNvdW50PVwibm9uZVwiPlR3ZWV0PC9hPjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0dHA6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzXCI+PC9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz1cImZhY2Vib29rXCI+PGlmcmFtZSBzcmM9XCIvL3d3dy5mYWNlYm9vay5jb20vcGx1Z2lucy9saWtlLnBocD9sb2NhbGU9ZW5fVVMmaHJlZj17bG9jYXRpb25faHJlZn0mYW1wO2xheW91dD1idXR0b25fY291bnQmYW1wO3Nob3dfZmFjZXM9dHJ1ZSZhbXA7d2lkdGg9NTAwJmFtcDthY3Rpb249bGlrZSZhbXA7Zm9udCZhbXA7Y29sb3JzY2hlbWU9bGlnaHQmYW1wO2hlaWdodD0yM1wiIHNjcm9sbGluZz1cIm5vXCIgZnJhbWVib3JkZXI9XCIwXCIgc3R5bGU9XCJib3JkZXI6bm9uZTsgb3ZlcmZsb3c6aGlkZGVuOyB3aWR0aDo1MDBweDsgaGVpZ2h0OjIzcHg7XCIgYWxsb3dUcmFuc3BhcmVuY3k9XCJ0cnVlXCI+PC9pZnJhbWU+PC9kaXY+JyAvKiBodG1sIG9yIGZhbHNlIHRvIGRpc2FibGUgKi9cclxuXHRcdH0sIHBwX3NldHRpbmdzKTtcclxuXHRcdFxyXG5cdFx0Ly8gR2xvYmFsIHZhcmlhYmxlcyBhY2Nlc3NpYmxlIG9ubHkgYnkgcHJldHR5UGhvdG9cclxuXHRcdHZhciBtYXRjaGVkT2JqZWN0cyA9IHRoaXMsIHBlcmNlbnRCYXNlZCA9IGZhbHNlLCBwcF9kaW1lbnNpb25zLCBwcF9vcGVuLFxyXG5cdFx0XHJcblx0XHQvLyBwcmV0dHlQaG90byBjb250YWluZXIgc3BlY2lmaWNcclxuXHRcdHBwX2NvbnRlbnRIZWlnaHQsIHBwX2NvbnRlbnRXaWR0aCwgcHBfY29udGFpbmVySGVpZ2h0LCBwcF9jb250YWluZXJXaWR0aCxcclxuXHRcdFxyXG5cdFx0Ly8gV2luZG93IHNpemVcclxuXHRcdHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKSwgd2luZG93V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKSxcclxuXHJcblx0XHQvLyBHbG9iYWwgZWxlbWVudHNcclxuXHRcdHBwX3NsaWRlc2hvdztcclxuXHRcdFxyXG5cdFx0ZG9yZXNpemUgPSB0cnVlLCBzY3JvbGxfcG9zID0gX2dldF9zY3JvbGwoKTtcclxuXHRcclxuXHRcdC8vIFdpbmRvdy9LZXlib2FyZCBldmVudHNcclxuXHRcdCQod2luZG93KS51bmJpbmQoJ3Jlc2l6ZS5wcmV0dHlwaG90bycpLmJpbmQoJ3Jlc2l6ZS5wcmV0dHlwaG90bycsZnVuY3Rpb24oKXsgX2NlbnRlcl9vdmVybGF5KCk7IF9yZXNpemVfb3ZlcmxheSgpOyB9KTtcclxuXHRcdFxyXG5cdFx0aWYocHBfc2V0dGluZ3Mua2V5Ym9hcmRfc2hvcnRjdXRzKSB7XHJcblx0XHRcdCQoZG9jdW1lbnQpLnVuYmluZCgna2V5ZG93bi5wcmV0dHlwaG90bycpLmJpbmQoJ2tleWRvd24ucHJldHR5cGhvdG8nLGZ1bmN0aW9uKGUpe1xyXG5cdFx0XHRcdGlmKHR5cGVvZiAkcHBfcGljX2hvbGRlciAhPSAndW5kZWZpbmVkJyl7XHJcblx0XHRcdFx0XHRpZigkcHBfcGljX2hvbGRlci5pcygnOnZpc2libGUnKSl7XHJcblx0XHRcdFx0XHRcdHN3aXRjaChlLmtleUNvZGUpe1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzc6XHJcblx0XHRcdFx0XHRcdFx0XHQkLnByZXR0eVBob3RvLmNoYW5nZVBhZ2UoJ3ByZXZpb3VzJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDM5OlxyXG5cdFx0XHRcdFx0XHRcdFx0JC5wcmV0dHlQaG90by5jaGFuZ2VQYWdlKCduZXh0Jyk7XHJcblx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDI3OlxyXG5cdFx0XHRcdFx0XHRcdFx0aWYoIXNldHRpbmdzLm1vZGFsKVxyXG5cdFx0XHRcdFx0XHRcdFx0JC5wcmV0dHlQaG90by5jbG9zZSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdC8vIHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fSk7XHJcblx0XHR9O1xyXG5cdFx0XHJcblx0XHQvKipcclxuXHRcdCogSW5pdGlhbGl6ZSBwcmV0dHlQaG90by5cclxuXHRcdCovXHJcblx0XHQkLnByZXR0eVBob3RvLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHJcblx0XHRcdHNldHRpbmdzID0gcHBfc2V0dGluZ3M7XHJcblx0XHRcdFxyXG5cdFx0XHRpZihzZXR0aW5ncy50aGVtZSA9PSAncHBfZGVmYXVsdCcpIHNldHRpbmdzLmhvcml6b250YWxfcGFkZGluZyA9IDE2O1xyXG5cdFx0XHRcclxuXHRcdFx0Ly8gRmluZCBvdXQgaWYgdGhlIHBpY3R1cmUgaXMgcGFydCBvZiBhIHNldFxyXG5cdFx0XHR0aGVSZWwgPSAkKHRoaXMpLmF0dHIoc2V0dGluZ3MuaG9vayk7XHJcblx0XHRcdGdhbGxlcnlSZWdFeHAgPSAvXFxbKD86LiopXFxdLztcclxuXHRcdFx0aXNTZXQgPSAoZ2FsbGVyeVJlZ0V4cC5leGVjKHRoZVJlbCkpID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0XHRcclxuXHRcdFx0Ly8gUHV0IHRoZSBTUkNzLCBUSVRMRXMsIEFMVHMgaW50byBhbiBhcnJheS5cclxuXHRcdFx0cHBfaW1hZ2VzID0gKGlzU2V0KSA/IGpRdWVyeS5tYXAobWF0Y2hlZE9iamVjdHMsIGZ1bmN0aW9uKG4sIGkpeyBpZigkKG4pLmF0dHIoc2V0dGluZ3MuaG9vaykuaW5kZXhPZih0aGVSZWwpICE9IC0xKSByZXR1cm4gJChuKS5hdHRyKCdocmVmJyk7IH0pIDogJC5tYWtlQXJyYXkoJCh0aGlzKS5hdHRyKCdocmVmJykpO1xyXG5cdFx0XHRwcF90aXRsZXMgPSAoaXNTZXQpID8galF1ZXJ5Lm1hcChtYXRjaGVkT2JqZWN0cywgZnVuY3Rpb24obiwgaSl7IGlmKCQobikuYXR0cihzZXR0aW5ncy5ob29rKS5pbmRleE9mKHRoZVJlbCkgIT0gLTEpIHJldHVybiAoJChuKS5maW5kKCdpbWcnKS5hdHRyKCdhbHQnKSkgPyAkKG4pLmZpbmQoJ2ltZycpLmF0dHIoJ2FsdCcpIDogXCJcIjsgfSkgOiAkLm1ha2VBcnJheSgkKHRoaXMpLmZpbmQoJ2ltZycpLmF0dHIoJ2FsdCcpKTtcclxuXHRcdFx0cHBfZGVzY3JpcHRpb25zID0gKGlzU2V0KSA/IGpRdWVyeS5tYXAobWF0Y2hlZE9iamVjdHMsIGZ1bmN0aW9uKG4sIGkpeyBpZigkKG4pLmF0dHIoc2V0dGluZ3MuaG9vaykuaW5kZXhPZih0aGVSZWwpICE9IC0xKSByZXR1cm4gKCQobikuYXR0cigndGl0bGUnKSkgPyAkKG4pLmF0dHIoJ3RpdGxlJykgOiBcIlwiOyB9KSA6ICQubWFrZUFycmF5KCQodGhpcykuYXR0cigndGl0bGUnKSk7XHJcblx0XHRcdFxyXG5cdFx0XHRpZihwcF9pbWFnZXMubGVuZ3RoID4gc2V0dGluZ3Mub3ZlcmxheV9nYWxsZXJ5X21heCkgc2V0dGluZ3Mub3ZlcmxheV9nYWxsZXJ5ID0gZmFsc2U7XHJcblx0XHRcdFxyXG5cdFx0XHRzZXRfcG9zaXRpb24gPSBqUXVlcnkuaW5BcnJheSgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgcHBfaW1hZ2VzKTsgLy8gRGVmaW5lIHdoZXJlIGluIHRoZSBhcnJheSB0aGUgY2xpY2tlZCBpdGVtIGlzIHBvc2l0aW9ubmVkXHJcblx0XHRcdHJlbF9pbmRleCA9IChpc1NldCkgPyBzZXRfcG9zaXRpb24gOiAkKFwiYVtcIitzZXR0aW5ncy5ob29rK1wiXj0nXCIrdGhlUmVsK1wiJ11cIikuaW5kZXgoJCh0aGlzKSk7XHJcblx0XHRcdFxyXG5cdFx0XHRfYnVpbGRfb3ZlcmxheSh0aGlzKTsgLy8gQnVpbGQgdGhlIG92ZXJsYXkge3RoaXN9IGJlaW5nIHRoZSBjYWxsZXJcclxuXHRcdFx0XHJcblx0XHRcdGlmKHNldHRpbmdzLmFsbG93X3Jlc2l6ZSlcclxuXHRcdFx0XHQkKHdpbmRvdykuYmluZCgnc2Nyb2xsLnByZXR0eXBob3RvJyxmdW5jdGlvbigpeyBfY2VudGVyX292ZXJsYXkoKTsgfSk7XHJcblx0XHRcdFxyXG5cdFx0XHRcclxuXHRcdFx0JC5wcmV0dHlQaG90by5vcGVuKCk7XHJcblx0XHRcdFxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0KiBPcGVucyB0aGUgcHJldHR5UGhvdG8gbW9kYWwgYm94LlxyXG5cdFx0KiBAcGFyYW0gaW1hZ2Uge1N0cmluZyxBcnJheX0gRnVsbCBwYXRoIHRvIHRoZSBpbWFnZSB0byBiZSBvcGVuLCBjYW4gYWxzbyBiZSBhbiBhcnJheSBjb250YWluaW5nIGZ1bGwgaW1hZ2VzIHBhdGhzLlxyXG5cdFx0KiBAcGFyYW0gdGl0bGUge1N0cmluZyxBcnJheX0gVGhlIHRpdGxlIHRvIGJlIGRpc3BsYXllZCB3aXRoIHRoZSBwaWN0dXJlLCBjYW4gYWxzbyBiZSBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgdGl0bGVzLlxyXG5cdFx0KiBAcGFyYW0gZGVzY3JpcHRpb24ge1N0cmluZyxBcnJheX0gVGhlIGRlc2NyaXB0aW9uIHRvIGJlIGRpc3BsYXllZCB3aXRoIHRoZSBwaWN0dXJlLCBjYW4gYWxzbyBiZSBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZGVzY3JpcHRpb25zLlxyXG5cdFx0Ki9cclxuXHRcdCQucHJldHR5UGhvdG8ub3BlbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcblx0XHRcdGlmKHR5cGVvZiBzZXR0aW5ncyA9PSBcInVuZGVmaW5lZFwiKXsgLy8gTWVhbnMgaXQncyBhbiBBUEkgY2FsbCwgbmVlZCB0byBtYW51YWxseSBnZXQgdGhlIHNldHRpbmdzIGFuZCBzZXQgdGhlIHZhcmlhYmxlc1xyXG5cdFx0XHRcdHNldHRpbmdzID0gcHBfc2V0dGluZ3M7XHJcblx0XHRcdFx0cHBfaW1hZ2VzID0gJC5tYWtlQXJyYXkoYXJndW1lbnRzWzBdKTtcclxuXHRcdFx0XHRwcF90aXRsZXMgPSAoYXJndW1lbnRzWzFdKSA/ICQubWFrZUFycmF5KGFyZ3VtZW50c1sxXSkgOiAkLm1ha2VBcnJheShcIlwiKTtcclxuXHRcdFx0XHRwcF9kZXNjcmlwdGlvbnMgPSAoYXJndW1lbnRzWzJdKSA/ICQubWFrZUFycmF5KGFyZ3VtZW50c1syXSkgOiAkLm1ha2VBcnJheShcIlwiKTtcclxuXHRcdFx0XHRpc1NldCA9IChwcF9pbWFnZXMubGVuZ3RoID4gMSkgPyB0cnVlIDogZmFsc2U7XHJcblx0XHRcdFx0c2V0X3Bvc2l0aW9uID0gKGFyZ3VtZW50c1szXSk/IGFyZ3VtZW50c1szXTogMDtcclxuXHRcdFx0XHRfYnVpbGRfb3ZlcmxheShldmVudC50YXJnZXQpOyAvLyBCdWlsZCB0aGUgb3ZlcmxheSB7dGhpc30gYmVpbmcgdGhlIGNhbGxlclxyXG5cdFx0XHR9XHJcblx0XHRcdFxyXG5cdFx0XHRpZihzZXR0aW5ncy5oaWRlZmxhc2gpICQoJ29iamVjdCxlbWJlZCxpZnJhbWVbc3JjKj15b3V0dWJlXSxpZnJhbWVbc3JjKj12aW1lb10nKS5jc3MoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTsgLy8gSGlkZSB0aGUgZmxhc2hcclxuXHJcblx0XHRcdF9jaGVja1Bvc2l0aW9uKCQocHBfaW1hZ2VzKS5zaXplKCkpOyAvLyBIaWRlIHRoZSBuZXh0L3ByZXZpb3VzIGxpbmtzIGlmIG9uIGZpcnN0IG9yIGxhc3QgaW1hZ2VzLlxyXG5cdFx0XHJcblx0XHRcdCQoJy5wcF9sb2FkZXJJY29uJykuc2hvdygpO1xyXG5cdFx0XHJcblx0XHRcdGlmKHNldHRpbmdzLmRlZXBsaW5raW5nKVxyXG5cdFx0XHRcdHNldEhhc2h0YWcoKTtcclxuXHRcdFxyXG5cdFx0XHQvLyBSZWJ1aWxkIEZhY2Vib29rIExpa2UgQnV0dG9uIHdpdGggdXBkYXRlZCBocmVmXHJcblx0XHRcdGlmKHNldHRpbmdzLnNvY2lhbF90b29scyl7XHJcblx0XHRcdFx0ZmFjZWJvb2tfbGlrZV9saW5rID0gc2V0dGluZ3Muc29jaWFsX3Rvb2xzLnJlcGxhY2UoJ3tsb2NhdGlvbl9ocmVmfScsIGVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSk7IFxyXG5cdFx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9zb2NpYWwnKS5odG1sKGZhY2Vib29rX2xpa2VfbGluayk7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdC8vIEZhZGUgdGhlIGNvbnRlbnQgaW5cclxuXHRcdFx0aWYoJHBwdC5pcygnOmhpZGRlbicpKSAkcHB0LmNzcygnb3BhY2l0eScsMCkuc2hvdygpO1xyXG5cdFx0XHQkcHBfb3ZlcmxheS5zaG93KCkuZmFkZVRvKHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCxzZXR0aW5ncy5vcGFjaXR5KTtcclxuXHJcblx0XHRcdC8vIERpc3BsYXkgdGhlIGN1cnJlbnQgcG9zaXRpb25cclxuXHRcdFx0JHBwX3BpY19ob2xkZXIuZmluZCgnLmN1cnJlbnRUZXh0SG9sZGVyJykudGV4dCgoc2V0X3Bvc2l0aW9uKzEpICsgc2V0dGluZ3MuY291bnRlcl9zZXBhcmF0b3JfbGFiZWwgKyAkKHBwX2ltYWdlcykuc2l6ZSgpKTtcclxuXHJcblx0XHRcdC8vIFNldCB0aGUgZGVzY3JpcHRpb25cclxuXHRcdFx0aWYodHlwZW9mIHBwX2Rlc2NyaXB0aW9uc1tzZXRfcG9zaXRpb25dICE9ICd1bmRlZmluZWQnICYmIHBwX2Rlc2NyaXB0aW9uc1tzZXRfcG9zaXRpb25dICE9IFwiXCIpe1xyXG5cdFx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9kZXNjcmlwdGlvbicpLnNob3coKS5odG1sKHVuZXNjYXBlKHBwX2Rlc2NyaXB0aW9uc1tzZXRfcG9zaXRpb25dKSk7XHJcblx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9kZXNjcmlwdGlvbicpLmhpZGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRcclxuXHRcdFx0Ly8gR2V0IHRoZSBkaW1lbnNpb25zXHJcblx0XHRcdG1vdmllX3dpZHRoID0gKCBwYXJzZUZsb2F0KGdldFBhcmFtKCd3aWR0aCcscHBfaW1hZ2VzW3NldF9wb3NpdGlvbl0pKSApID8gZ2V0UGFyYW0oJ3dpZHRoJyxwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXSkgOiBzZXR0aW5ncy5kZWZhdWx0X3dpZHRoLnRvU3RyaW5nKCk7XHJcblx0XHRcdG1vdmllX2hlaWdodCA9ICggcGFyc2VGbG9hdChnZXRQYXJhbSgnaGVpZ2h0JyxwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXSkpICkgPyBnZXRQYXJhbSgnaGVpZ2h0JyxwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXSkgOiBzZXR0aW5ncy5kZWZhdWx0X2hlaWdodC50b1N0cmluZygpO1xyXG5cdFx0XHRcclxuXHRcdFx0Ly8gSWYgdGhlIHNpemUgaXMgJSBiYXNlZCwgY2FsY3VsYXRlIGFjY29yZGluZyB0byB3aW5kb3cgZGltZW5zaW9uc1xyXG5cdFx0XHRwZXJjZW50QmFzZWQ9ZmFsc2U7XHJcblx0XHRcdGlmKG1vdmllX2hlaWdodC5pbmRleE9mKCclJykgIT0gLTEpIHsgbW92aWVfaGVpZ2h0ID0gcGFyc2VGbG9hdCgoJCh3aW5kb3cpLmhlaWdodCgpICogcGFyc2VGbG9hdChtb3ZpZV9oZWlnaHQpIC8gMTAwKSAtIDE1MCk7IHBlcmNlbnRCYXNlZCA9IHRydWU7IH1cclxuXHRcdFx0aWYobW92aWVfd2lkdGguaW5kZXhPZignJScpICE9IC0xKSB7IG1vdmllX3dpZHRoID0gcGFyc2VGbG9hdCgoJCh3aW5kb3cpLndpZHRoKCkgKiBwYXJzZUZsb2F0KG1vdmllX3dpZHRoKSAvIDEwMCkgLSAxNTApOyBwZXJjZW50QmFzZWQgPSB0cnVlOyB9XHJcblx0XHRcdFxyXG5cdFx0XHQvLyBGYWRlIHRoZSBob2xkZXJcclxuXHRcdFx0JHBwX3BpY19ob2xkZXIuZmFkZUluKGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0Ly8gU2V0IHRoZSB0aXRsZVxyXG5cdFx0XHRcdChzZXR0aW5ncy5zaG93X3RpdGxlICYmIHBwX3RpdGxlc1tzZXRfcG9zaXRpb25dICE9IFwiXCIgJiYgdHlwZW9mIHBwX3RpdGxlc1tzZXRfcG9zaXRpb25dICE9IFwidW5kZWZpbmVkXCIpID8gJHBwdC5odG1sKHVuZXNjYXBlKHBwX3RpdGxlc1tzZXRfcG9zaXRpb25dKSkgOiAkcHB0Lmh0bWwoJyZuYnNwOycpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGltZ1ByZWxvYWRlciA9IFwiXCI7XHJcblx0XHRcdFx0c2tpcEluamVjdGlvbiA9IGZhbHNlO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8vIEluamVjdCB0aGUgcHJvcGVyIGNvbnRlbnRcclxuXHRcdFx0XHRzd2l0Y2goX2dldEZpbGVUeXBlKHBwX2ltYWdlc1tzZXRfcG9zaXRpb25dKSl7XHJcblx0XHRcdFx0XHRjYXNlICdpbWFnZSc6XHJcblx0XHRcdFx0XHRcdGltZ1ByZWxvYWRlciA9IG5ldyBJbWFnZSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gUHJlbG9hZCB0aGUgbmVpZ2hib3VyIGltYWdlc1xyXG5cdFx0XHRcdFx0XHRuZXh0SW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuXHRcdFx0XHRcdFx0aWYoaXNTZXQgJiYgc2V0X3Bvc2l0aW9uIDwgJChwcF9pbWFnZXMpLnNpemUoKSAtMSkgbmV4dEltYWdlLnNyYyA9IHBwX2ltYWdlc1tzZXRfcG9zaXRpb24gKyAxXTtcclxuXHRcdFx0XHRcdFx0cHJldkltYWdlID0gbmV3IEltYWdlKCk7XHJcblx0XHRcdFx0XHRcdGlmKGlzU2V0ICYmIHBwX2ltYWdlc1tzZXRfcG9zaXRpb24gLSAxXSkgcHJldkltYWdlLnNyYyA9IHBwX2ltYWdlc1tzZXRfcG9zaXRpb24gLSAxXTtcclxuXHJcblx0XHRcdFx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJyNwcF9mdWxsX3JlcycpWzBdLmlubmVySFRNTCA9IHNldHRpbmdzLmltYWdlX21hcmt1cC5yZXBsYWNlKC97cGF0aH0vZyxwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXSk7XHJcblxyXG5cdFx0XHRcdFx0XHRpbWdQcmVsb2FkZXIub25sb2FkID0gZnVuY3Rpb24oKXtcclxuXHRcdFx0XHRcdFx0XHQvLyBGaXQgaXRlbSB0byB2aWV3cG9ydFxyXG5cdFx0XHRcdFx0XHRcdHBwX2RpbWVuc2lvbnMgPSBfZml0VG9WaWV3cG9ydChpbWdQcmVsb2FkZXIud2lkdGgsaW1nUHJlbG9hZGVyLmhlaWdodCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdF9zaG93Q29udGVudCgpO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0aW1nUHJlbG9hZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpe1xyXG5cdFx0XHRcdFx0XHRcdGFsZXJ0KCdJbWFnZSBjYW5ub3QgYmUgbG9hZGVkLiBNYWtlIHN1cmUgdGhlIHBhdGggaXMgY29ycmVjdCBhbmQgaW1hZ2UgZXhpc3QuJyk7XHJcblx0XHRcdFx0XHRcdFx0JC5wcmV0dHlQaG90by5jbG9zZSgpO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdGltZ1ByZWxvYWRlci5zcmMgPSBwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFx0Y2FzZSAneW91dHViZSc6XHJcblx0XHRcdFx0XHRcdHBwX2RpbWVuc2lvbnMgPSBfZml0VG9WaWV3cG9ydChtb3ZpZV93aWR0aCxtb3ZpZV9oZWlnaHQpOyAvLyBGaXQgaXRlbSB0byB2aWV3cG9ydFxyXG5cdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0Ly8gUmVndWxhciB5b3V0dWJlIGxpbmtcclxuXHRcdFx0XHRcdFx0bW92aWVfaWQgPSBnZXRQYXJhbSgndicscHBfaW1hZ2VzW3NldF9wb3NpdGlvbl0pO1xyXG5cdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0Ly8geW91dHUuYmUgbGlua1xyXG5cdFx0XHRcdFx0XHRpZihtb3ZpZV9pZCA9PSBcIlwiKXtcclxuXHRcdFx0XHRcdFx0XHRtb3ZpZV9pZCA9IHBwX2ltYWdlc1tzZXRfcG9zaXRpb25dLnNwbGl0KCd5b3V0dS5iZS8nKTtcclxuXHRcdFx0XHRcdFx0XHRtb3ZpZV9pZCA9IG1vdmllX2lkWzFdO1xyXG5cdFx0XHRcdFx0XHRcdGlmKG1vdmllX2lkLmluZGV4T2YoJz8nKSA+IDApXHJcblx0XHRcdFx0XHRcdFx0XHRtb3ZpZV9pZCA9IG1vdmllX2lkLnN1YnN0cigwLG1vdmllX2lkLmluZGV4T2YoJz8nKSk7IC8vIFN0cmlwIGFueXRoaW5nIGFmdGVyIHRoZSA/XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmKG1vdmllX2lkLmluZGV4T2YoJyYnKSA+IDApXHJcblx0XHRcdFx0XHRcdFx0XHRtb3ZpZV9pZCA9IG1vdmllX2lkLnN1YnN0cigwLG1vdmllX2lkLmluZGV4T2YoJyYnKSk7IC8vIFN0cmlwIGFueXRoaW5nIGFmdGVyIHRoZSAmXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdG1vdmllID0gJ2h0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJyttb3ZpZV9pZDtcclxuXHRcdFx0XHRcdFx0KGdldFBhcmFtKCdyZWwnLHBwX2ltYWdlc1tzZXRfcG9zaXRpb25dKSkgPyBtb3ZpZSs9XCI/cmVsPVwiK2dldFBhcmFtKCdyZWwnLHBwX2ltYWdlc1tzZXRfcG9zaXRpb25dKSA6IG1vdmllKz1cIj9yZWw9MVwiO1xyXG5cdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRpZihzZXR0aW5ncy5hdXRvcGxheSkgbW92aWUgKz0gXCImYXV0b3BsYXk9MVwiO1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdHRvSW5qZWN0ID0gc2V0dGluZ3MuaWZyYW1lX21hcmt1cC5yZXBsYWNlKC97d2lkdGh9L2cscHBfZGltZW5zaW9uc1snd2lkdGgnXSkucmVwbGFjZSgve2hlaWdodH0vZyxwcF9kaW1lbnNpb25zWydoZWlnaHQnXSkucmVwbGFjZSgve3dtb2RlfS9nLHNldHRpbmdzLndtb2RlKS5yZXBsYWNlKC97cGF0aH0vZyxtb3ZpZSk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdGNhc2UgJ3ZpbWVvJzpcclxuXHRcdFx0XHRcdFx0cHBfZGltZW5zaW9ucyA9IF9maXRUb1ZpZXdwb3J0KG1vdmllX3dpZHRoLG1vdmllX2hlaWdodCk7IC8vIEZpdCBpdGVtIHRvIHZpZXdwb3J0XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0bW92aWVfaWQgPSBwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXTtcclxuXHRcdFx0XHRcdFx0dmFyIHJlZ0V4cCA9IC9odHRwKHM/KTpcXC9cXC8od3d3XFwuKT92aW1lby5jb21cXC8oXFxkKykvO1xyXG5cdFx0XHRcdFx0XHR2YXIgbWF0Y2ggPSBtb3ZpZV9pZC5tYXRjaChyZWdFeHApO1xyXG5cdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0bW92aWUgPSAnaHR0cDovL3BsYXllci52aW1lby5jb20vdmlkZW8vJysgbWF0Y2hbM10gKyc/dGl0bGU9MCZhbXA7YnlsaW5lPTAmYW1wO3BvcnRyYWl0PTAnO1xyXG5cdFx0XHRcdFx0XHRpZihzZXR0aW5ncy5hdXRvcGxheSkgbW92aWUgKz0gXCImYXV0b3BsYXk9MTtcIjtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0dmltZW9fd2lkdGggPSBwcF9kaW1lbnNpb25zWyd3aWR0aCddICsgJy9lbWJlZC8/bW9vZ193aWR0aD0nKyBwcF9kaW1lbnNpb25zWyd3aWR0aCddO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHR0b0luamVjdCA9IHNldHRpbmdzLmlmcmFtZV9tYXJrdXAucmVwbGFjZSgve3dpZHRofS9nLHZpbWVvX3dpZHRoKS5yZXBsYWNlKC97aGVpZ2h0fS9nLHBwX2RpbWVuc2lvbnNbJ2hlaWdodCddKS5yZXBsYWNlKC97cGF0aH0vZyxtb3ZpZSk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdGNhc2UgJ3F1aWNrdGltZSc6XHJcblx0XHRcdFx0XHRcdHBwX2RpbWVuc2lvbnMgPSBfZml0VG9WaWV3cG9ydChtb3ZpZV93aWR0aCxtb3ZpZV9oZWlnaHQpOyAvLyBGaXQgaXRlbSB0byB2aWV3cG9ydFxyXG5cdFx0XHRcdFx0XHRwcF9kaW1lbnNpb25zWydoZWlnaHQnXSs9MTU7IHBwX2RpbWVuc2lvbnNbJ2NvbnRlbnRIZWlnaHQnXSs9MTU7IHBwX2RpbWVuc2lvbnNbJ2NvbnRhaW5lckhlaWdodCddKz0xNTsgLy8gQWRkIHNwYWNlIGZvciB0aGUgY29udHJvbCBiYXJcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0dG9JbmplY3QgPSBzZXR0aW5ncy5xdWlja3RpbWVfbWFya3VwLnJlcGxhY2UoL3t3aWR0aH0vZyxwcF9kaW1lbnNpb25zWyd3aWR0aCddKS5yZXBsYWNlKC97aGVpZ2h0fS9nLHBwX2RpbWVuc2lvbnNbJ2hlaWdodCddKS5yZXBsYWNlKC97d21vZGV9L2csc2V0dGluZ3Mud21vZGUpLnJlcGxhY2UoL3twYXRofS9nLHBwX2ltYWdlc1tzZXRfcG9zaXRpb25dKS5yZXBsYWNlKC97YXV0b3BsYXl9L2csc2V0dGluZ3MuYXV0b3BsYXkpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0XHRjYXNlICdmbGFzaCc6XHJcblx0XHRcdFx0XHRcdHBwX2RpbWVuc2lvbnMgPSBfZml0VG9WaWV3cG9ydChtb3ZpZV93aWR0aCxtb3ZpZV9oZWlnaHQpOyAvLyBGaXQgaXRlbSB0byB2aWV3cG9ydFxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdGZsYXNoX3ZhcnMgPSBwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXTtcclxuXHRcdFx0XHRcdFx0Zmxhc2hfdmFycyA9IGZsYXNoX3ZhcnMuc3Vic3RyaW5nKHBwX2ltYWdlc1tzZXRfcG9zaXRpb25dLmluZGV4T2YoJ2ZsYXNodmFycycpICsgMTAscHBfaW1hZ2VzW3NldF9wb3NpdGlvbl0ubGVuZ3RoKTtcclxuXHJcblx0XHRcdFx0XHRcdGZpbGVuYW1lID0gcHBfaW1hZ2VzW3NldF9wb3NpdGlvbl07XHJcblx0XHRcdFx0XHRcdGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsZmlsZW5hbWUuaW5kZXhPZignPycpKTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHR0b0luamVjdCA9ICBzZXR0aW5ncy5mbGFzaF9tYXJrdXAucmVwbGFjZSgve3dpZHRofS9nLHBwX2RpbWVuc2lvbnNbJ3dpZHRoJ10pLnJlcGxhY2UoL3toZWlnaHR9L2cscHBfZGltZW5zaW9uc1snaGVpZ2h0J10pLnJlcGxhY2UoL3t3bW9kZX0vZyxzZXR0aW5ncy53bW9kZSkucmVwbGFjZSgve3BhdGh9L2csZmlsZW5hbWUrJz8nK2ZsYXNoX3ZhcnMpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0XHRjYXNlICdpZnJhbWUnOlxyXG5cdFx0XHRcdFx0XHRwcF9kaW1lbnNpb25zID0gX2ZpdFRvVmlld3BvcnQobW92aWVfd2lkdGgsbW92aWVfaGVpZ2h0KTsgLy8gRml0IGl0ZW0gdG8gdmlld3BvcnRcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0ZnJhbWVfdXJsID0gcHBfaW1hZ2VzW3NldF9wb3NpdGlvbl07XHJcblx0XHRcdFx0XHRcdGZyYW1lX3VybCA9IGZyYW1lX3VybC5zdWJzdHIoMCxmcmFtZV91cmwuaW5kZXhPZignaWZyYW1lJyktMSk7XHJcblxyXG5cdFx0XHRcdFx0XHR0b0luamVjdCA9IHNldHRpbmdzLmlmcmFtZV9tYXJrdXAucmVwbGFjZSgve3dpZHRofS9nLHBwX2RpbWVuc2lvbnNbJ3dpZHRoJ10pLnJlcGxhY2UoL3toZWlnaHR9L2cscHBfZGltZW5zaW9uc1snaGVpZ2h0J10pLnJlcGxhY2UoL3twYXRofS9nLGZyYW1lX3VybCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0Y2FzZSAnYWpheCc6XHJcblx0XHRcdFx0XHRcdGRvcmVzaXplID0gZmFsc2U7IC8vIE1ha2Ugc3VyZSB0aGUgZGltZW5zaW9ucyBhcmUgbm90IHJlc2l6ZWQuXHJcblx0XHRcdFx0XHRcdHBwX2RpbWVuc2lvbnMgPSBfZml0VG9WaWV3cG9ydChtb3ZpZV93aWR0aCxtb3ZpZV9oZWlnaHQpO1xyXG5cdFx0XHRcdFx0XHRkb3Jlc2l6ZSA9IHRydWU7IC8vIFJlc2V0IHRoZSBkaW1lbnNpb25zXHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0c2tpcEluamVjdGlvbiA9IHRydWU7XHJcblx0XHRcdFx0XHRcdCQuZ2V0KHBwX2ltYWdlc1tzZXRfcG9zaXRpb25dLGZ1bmN0aW9uKHJlc3BvbnNlSFRNTCl7XHJcblx0XHRcdFx0XHRcdFx0dG9JbmplY3QgPSBzZXR0aW5ncy5pbmxpbmVfbWFya3VwLnJlcGxhY2UoL3tjb250ZW50fS9nLHJlc3BvbnNlSFRNTCk7XHJcblx0XHRcdFx0XHRcdFx0JHBwX3BpY19ob2xkZXIuZmluZCgnI3BwX2Z1bGxfcmVzJylbMF0uaW5uZXJIVE1MID0gdG9JbmplY3Q7XHJcblx0XHRcdFx0XHRcdFx0X3Nob3dDb250ZW50KCk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRjYXNlICdjdXN0b20nOlxyXG5cdFx0XHRcdFx0XHRwcF9kaW1lbnNpb25zID0gX2ZpdFRvVmlld3BvcnQobW92aWVfd2lkdGgsbW92aWVfaGVpZ2h0KTsgLy8gRml0IGl0ZW0gdG8gdmlld3BvcnRcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHR0b0luamVjdCA9IHNldHRpbmdzLmN1c3RvbV9tYXJrdXA7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdGNhc2UgJ2lubGluZSc6XHJcblx0XHRcdFx0XHRcdC8vIHRvIGdldCB0aGUgaXRlbSBoZWlnaHQgY2xvbmUgaXQsIGFwcGx5IGRlZmF1bHQgd2lkdGgsIHdyYXAgaXQgaW4gdGhlIHByZXR0eVBob3RvIGNvbnRhaW5lcnMgLCB0aGVuIGRlbGV0ZVxyXG5cdFx0XHRcdFx0XHRteUNsb25lID0gJChwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXSkuY2xvbmUoKS5hcHBlbmQoJzxiciBjbGVhcj1cImFsbFwiIC8+JykuY3NzKHsnd2lkdGgnOnNldHRpbmdzLmRlZmF1bHRfd2lkdGh9KS53cmFwSW5uZXIoJzxkaXYgaWQ9XCJwcF9mdWxsX3Jlc1wiPjxkaXYgY2xhc3M9XCJwcF9pbmxpbmVcIj48L2Rpdj48L2Rpdj4nKS5hcHBlbmRUbygkKCdib2R5JykpLnNob3coKTtcclxuXHRcdFx0XHRcdFx0ZG9yZXNpemUgPSBmYWxzZTsgLy8gTWFrZSBzdXJlIHRoZSBkaW1lbnNpb25zIGFyZSBub3QgcmVzaXplZC5cclxuXHRcdFx0XHRcdFx0cHBfZGltZW5zaW9ucyA9IF9maXRUb1ZpZXdwb3J0KCQobXlDbG9uZSkud2lkdGgoKSwkKG15Q2xvbmUpLmhlaWdodCgpKTtcclxuXHRcdFx0XHRcdFx0ZG9yZXNpemUgPSB0cnVlOyAvLyBSZXNldCB0aGUgZGltZW5zaW9uc1xyXG5cdFx0XHRcdFx0XHQkKG15Q2xvbmUpLnJlbW92ZSgpO1xyXG5cdFx0XHRcdFx0XHR0b0luamVjdCA9IHNldHRpbmdzLmlubGluZV9tYXJrdXAucmVwbGFjZSgve2NvbnRlbnR9L2csJChwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXSkuaHRtbCgpKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGlmKCFpbWdQcmVsb2FkZXIgJiYgIXNraXBJbmplY3Rpb24pe1xyXG5cdFx0XHRcdFx0JHBwX3BpY19ob2xkZXIuZmluZCgnI3BwX2Z1bGxfcmVzJylbMF0uaW5uZXJIVE1MID0gdG9JbmplY3Q7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyBTaG93IGNvbnRlbnRcclxuXHRcdFx0XHRcdF9zaG93Q29udGVudCgpO1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fTtcclxuXHJcblx0XHJcblx0XHQvKipcclxuXHRcdCogQ2hhbmdlIHBhZ2UgaW4gdGhlIHByZXR0eVBob3RvIG1vZGFsIGJveFxyXG5cdFx0KiBAcGFyYW0gZGlyZWN0aW9uIHtTdHJpbmd9IERpcmVjdGlvbiBvZiB0aGUgcGFnaW5nLCBwcmV2aW91cyBvciBuZXh0LlxyXG5cdFx0Ki9cclxuXHRcdCQucHJldHR5UGhvdG8uY2hhbmdlUGFnZSA9IGZ1bmN0aW9uKGRpcmVjdGlvbil7XHJcblx0XHRcdGN1cnJlbnRHYWxsZXJ5UGFnZSA9IDA7XHJcblx0XHRcdFxyXG5cdFx0XHRpZihkaXJlY3Rpb24gPT0gJ3ByZXZpb3VzJykge1xyXG5cdFx0XHRcdHNldF9wb3NpdGlvbi0tO1xyXG5cdFx0XHRcdGlmIChzZXRfcG9zaXRpb24gPCAwKSBzZXRfcG9zaXRpb24gPSAkKHBwX2ltYWdlcykuc2l6ZSgpLTE7XHJcblx0XHRcdH1lbHNlIGlmKGRpcmVjdGlvbiA9PSAnbmV4dCcpe1xyXG5cdFx0XHRcdHNldF9wb3NpdGlvbisrO1xyXG5cdFx0XHRcdGlmKHNldF9wb3NpdGlvbiA+ICQocHBfaW1hZ2VzKS5zaXplKCktMSkgc2V0X3Bvc2l0aW9uID0gMDtcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0c2V0X3Bvc2l0aW9uPWRpcmVjdGlvbjtcclxuXHRcdFx0fTtcclxuXHRcdFx0XHJcblx0XHRcdHJlbF9pbmRleCA9IHNldF9wb3NpdGlvbjtcclxuXHJcblx0XHRcdGlmKCFkb3Jlc2l6ZSkgZG9yZXNpemUgPSB0cnVlOyAvLyBBbGxvdyB0aGUgcmVzaXppbmcgb2YgdGhlIGltYWdlc1xyXG5cdFx0XHRpZihzZXR0aW5ncy5hbGxvd19leHBhbmQpIHtcclxuXHRcdFx0XHQkKCcucHBfY29udHJhY3QnKS5yZW1vdmVDbGFzcygncHBfY29udHJhY3QnKS5hZGRDbGFzcygncHBfZXhwYW5kJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9oaWRlQ29udGVudChmdW5jdGlvbigpeyAkLnByZXR0eVBob3RvLm9wZW4oKTsgfSk7XHJcblx0XHR9O1xyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCogQ2hhbmdlIGdhbGxlcnkgcGFnZSBpbiB0aGUgcHJldHR5UGhvdG8gbW9kYWwgYm94XHJcblx0XHQqIEBwYXJhbSBkaXJlY3Rpb24ge1N0cmluZ30gRGlyZWN0aW9uIG9mIHRoZSBwYWdpbmcsIHByZXZpb3VzIG9yIG5leHQuXHJcblx0XHQqL1xyXG5cdFx0JC5wcmV0dHlQaG90by5jaGFuZ2VHYWxsZXJ5UGFnZSA9IGZ1bmN0aW9uKGRpcmVjdGlvbil7XHJcblx0XHRcdGlmKGRpcmVjdGlvbj09J25leHQnKXtcclxuXHRcdFx0XHRjdXJyZW50R2FsbGVyeVBhZ2UgKys7XHJcblxyXG5cdFx0XHRcdGlmKGN1cnJlbnRHYWxsZXJ5UGFnZSA+IHRvdGFsUGFnZSkgY3VycmVudEdhbGxlcnlQYWdlID0gMDtcclxuXHRcdFx0fWVsc2UgaWYoZGlyZWN0aW9uPT0ncHJldmlvdXMnKXtcclxuXHRcdFx0XHRjdXJyZW50R2FsbGVyeVBhZ2UgLS07XHJcblxyXG5cdFx0XHRcdGlmKGN1cnJlbnRHYWxsZXJ5UGFnZSA8IDApIGN1cnJlbnRHYWxsZXJ5UGFnZSA9IHRvdGFsUGFnZTtcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0Y3VycmVudEdhbGxlcnlQYWdlID0gZGlyZWN0aW9uO1xyXG5cdFx0XHR9O1xyXG5cdFx0XHRcclxuXHRcdFx0c2xpZGVfc3BlZWQgPSAoZGlyZWN0aW9uID09ICduZXh0JyB8fCBkaXJlY3Rpb24gPT0gJ3ByZXZpb3VzJykgPyBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQgOiAwO1xyXG5cclxuXHRcdFx0c2xpZGVfdG8gPSBjdXJyZW50R2FsbGVyeVBhZ2UgKiAoaXRlbXNQZXJQYWdlICogaXRlbVdpZHRoKTtcclxuXHJcblx0XHRcdCRwcF9nYWxsZXJ5LmZpbmQoJ3VsJykuYW5pbWF0ZSh7bGVmdDotc2xpZGVfdG99LHNsaWRlX3NwZWVkKTtcclxuXHRcdH07XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0KiBTdGFydCB0aGUgc2xpZGVzaG93Li4uXHJcblx0XHQqL1xyXG5cdFx0JC5wcmV0dHlQaG90by5zdGFydFNsaWRlc2hvdyA9IGZ1bmN0aW9uKCl7XHJcblx0XHRcdGlmKHR5cGVvZiBwcF9zbGlkZXNob3cgPT0gJ3VuZGVmaW5lZCcpe1xyXG5cdFx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9wbGF5JykudW5iaW5kKCdjbGljaycpLnJlbW92ZUNsYXNzKCdwcF9wbGF5JykuYWRkQ2xhc3MoJ3BwX3BhdXNlJykuY2xpY2soZnVuY3Rpb24oKXtcclxuXHRcdFx0XHRcdCQucHJldHR5UGhvdG8uc3RvcFNsaWRlc2hvdygpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHBwX3NsaWRlc2hvdyA9IHNldEludGVydmFsKCQucHJldHR5UGhvdG8uc3RhcnRTbGlkZXNob3csc2V0dGluZ3Muc2xpZGVzaG93KTtcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0JC5wcmV0dHlQaG90by5jaGFuZ2VQYWdlKCduZXh0Jyk7XHRcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQqIFN0b3AgdGhlIHNsaWRlc2hvdy4uLlxyXG5cdFx0Ki9cclxuXHRcdCQucHJldHR5UGhvdG8uc3RvcFNsaWRlc2hvdyA9IGZ1bmN0aW9uKCl7XHJcblx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9wYXVzZScpLnVuYmluZCgnY2xpY2snKS5yZW1vdmVDbGFzcygncHBfcGF1c2UnKS5hZGRDbGFzcygncHBfcGxheScpLmNsaWNrKGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0JC5wcmV0dHlQaG90by5zdGFydFNsaWRlc2hvdygpO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdGNsZWFySW50ZXJ2YWwocHBfc2xpZGVzaG93KTtcclxuXHRcdFx0cHBfc2xpZGVzaG93PXVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQqIENsb3NlcyBwcmV0dHlQaG90by5cclxuXHRcdCovXHJcblx0XHQkLnByZXR0eVBob3RvLmNsb3NlID0gZnVuY3Rpb24oKXtcclxuXHRcdFx0aWYoJHBwX292ZXJsYXkuaXMoXCI6YW5pbWF0ZWRcIikpIHJldHVybjtcclxuXHRcdFx0XHJcblx0XHRcdCQucHJldHR5UGhvdG8uc3RvcFNsaWRlc2hvdygpO1xyXG5cdFx0XHRcclxuXHRcdFx0JHBwX3BpY19ob2xkZXIuc3RvcCgpLmZpbmQoJ29iamVjdCxlbWJlZCcpLmNzcygndmlzaWJpbGl0eScsJ2hpZGRlbicpO1xyXG5cdFx0XHRcclxuXHRcdFx0JCgnZGl2LnBwX3BpY19ob2xkZXIsZGl2LnBwdCwucHBfZmFkZScpLmZhZGVPdXQoc2V0dGluZ3MuYW5pbWF0aW9uX3NwZWVkLGZ1bmN0aW9uKCl7ICQodGhpcykucmVtb3ZlKCk7IH0pO1xyXG5cdFx0XHRcclxuXHRcdFx0JHBwX292ZXJsYXkuZmFkZU91dChzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQsIGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0aWYoc2V0dGluZ3MuaGlkZWZsYXNoKSAkKCdvYmplY3QsZW1iZWQsaWZyYW1lW3NyYyo9eW91dHViZV0saWZyYW1lW3NyYyo9dmltZW9dJykuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpOyAvLyBTaG93IHRoZSBmbGFzaFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdCQodGhpcykucmVtb3ZlKCk7IC8vIE5vIG1vcmUgbmVlZCBmb3IgdGhlIHByZXR0eVBob3RvIG1hcmt1cFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdCQod2luZG93KS51bmJpbmQoJ3Njcm9sbC5wcmV0dHlwaG90bycpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNsZWFySGFzaHRhZygpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdHNldHRpbmdzLmNhbGxiYWNrKCk7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0ZG9yZXNpemUgPSB0cnVlO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdHBwX29wZW4gPSBmYWxzZTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRkZWxldGUgc2V0dGluZ3M7XHJcblx0XHRcdH0pO1xyXG5cdFx0fTtcclxuXHRcclxuXHRcdC8qKlxyXG5cdFx0KiBTZXQgdGhlIHByb3BlciBzaXplcyBvbiB0aGUgY29udGFpbmVycyBhbmQgYW5pbWF0ZSB0aGUgY29udGVudCBpbi5cclxuXHRcdCovXHJcblx0XHRmdW5jdGlvbiBfc2hvd0NvbnRlbnQoKXtcclxuXHRcdFx0JCgnLnBwX2xvYWRlckljb24nKS5oaWRlKCk7XHJcblxyXG5cdFx0XHQvLyBDYWxjdWxhdGUgdGhlIG9wZW5lZCB0b3AgcG9zaXRpb24gb2YgdGhlIHBpYyBob2xkZXJcclxuXHRcdFx0cHJvamVjdGVkVG9wID0gc2Nyb2xsX3Bvc1snc2Nyb2xsVG9wJ10gKyAoKHdpbmRvd0hlaWdodC8yKSAtIChwcF9kaW1lbnNpb25zWydjb250YWluZXJIZWlnaHQnXS8yKSk7XHJcblx0XHRcdGlmKHByb2plY3RlZFRvcCA8IDApIHByb2plY3RlZFRvcCA9IDA7XHJcblxyXG5cdFx0XHQkcHB0LmZhZGVUbyhzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQsMSk7XHJcblxyXG5cdFx0XHQvLyBSZXNpemUgdGhlIGNvbnRlbnQgaG9sZGVyXHJcblx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9jb250ZW50JylcclxuXHRcdFx0XHQuYW5pbWF0ZSh7XHJcblx0XHRcdFx0XHRoZWlnaHQ6cHBfZGltZW5zaW9uc1snY29udGVudEhlaWdodCddLFxyXG5cdFx0XHRcdFx0d2lkdGg6cHBfZGltZW5zaW9uc1snY29udGVudFdpZHRoJ11cclxuXHRcdFx0XHR9LHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCk7XHJcblx0XHRcdFxyXG5cdFx0XHQvLyBSZXNpemUgcGljdHVyZSB0aGUgaG9sZGVyXHJcblx0XHRcdCRwcF9waWNfaG9sZGVyLmFuaW1hdGUoe1xyXG5cdFx0XHRcdCd0b3AnOiBwcm9qZWN0ZWRUb3AsXHJcblx0XHRcdFx0J2xlZnQnOiAoKHdpbmRvd1dpZHRoLzIpIC0gKHBwX2RpbWVuc2lvbnNbJ2NvbnRhaW5lcldpZHRoJ10vMikgPCAwKSA/IDAgOiAod2luZG93V2lkdGgvMikgLSAocHBfZGltZW5zaW9uc1snY29udGFpbmVyV2lkdGgnXS8yKSxcclxuXHRcdFx0XHR3aWR0aDpwcF9kaW1lbnNpb25zWydjb250YWluZXJXaWR0aCddXHJcblx0XHRcdH0sc2V0dGluZ3MuYW5pbWF0aW9uX3NwZWVkLGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0JHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX2hvdmVyQ29udGFpbmVyLCNmdWxsUmVzSW1hZ2UnKS5oZWlnaHQocHBfZGltZW5zaW9uc1snaGVpZ2h0J10pLndpZHRoKHBwX2RpbWVuc2lvbnNbJ3dpZHRoJ10pO1xyXG5cclxuXHRcdFx0XHQkcHBfcGljX2hvbGRlci5maW5kKCcucHBfZmFkZScpLmZhZGVJbihzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQpOyAvLyBGYWRlIHRoZSBuZXcgY29udGVudFxyXG5cclxuXHRcdFx0XHQvLyBTaG93IHRoZSBuYXZcclxuXHRcdFx0XHRpZihpc1NldCAmJiBfZ2V0RmlsZVR5cGUocHBfaW1hZ2VzW3NldF9wb3NpdGlvbl0pPT1cImltYWdlXCIpIHsgJHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX2hvdmVyQ29udGFpbmVyJykuc2hvdygpOyB9ZWxzZXsgJHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX2hvdmVyQ29udGFpbmVyJykuaGlkZSgpOyB9XHJcblx0XHRcdFxyXG5cdFx0XHRcdGlmKHNldHRpbmdzLmFsbG93X2V4cGFuZCkge1xyXG5cdFx0XHRcdFx0aWYocHBfZGltZW5zaW9uc1sncmVzaXplZCddKXsgLy8gRmFkZSB0aGUgcmVzaXppbmcgbGluayBpZiB0aGUgaW1hZ2UgaXMgcmVzaXplZFxyXG5cdFx0XHRcdFx0XHQkKCdhLnBwX2V4cGFuZCxhLnBwX2NvbnRyYWN0Jykuc2hvdygpO1xyXG5cdFx0XHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0XHRcdCQoJ2EucHBfZXhwYW5kJykuaGlkZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZihzZXR0aW5ncy5hdXRvcGxheV9zbGlkZXNob3cgJiYgIXBwX3NsaWRlc2hvdyAmJiAhcHBfb3BlbikgJC5wcmV0dHlQaG90by5zdGFydFNsaWRlc2hvdygpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdHNldHRpbmdzLmNoYW5nZXBpY3R1cmVjYWxsYmFjaygpOyAvLyBDYWxsYmFjayFcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRwcF9vcGVuID0gdHJ1ZTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdFxyXG5cdFx0XHRfaW5zZXJ0X2dhbGxlcnkoKTtcclxuXHRcdFx0cHBfc2V0dGluZ3MuYWpheGNhbGxiYWNrKCk7XHJcblx0XHR9O1xyXG5cdFx0XHJcblx0XHQvKipcclxuXHRcdCogSGlkZSB0aGUgY29udGVudC4uLkRVSCFcclxuXHRcdCovXHJcblx0XHRmdW5jdGlvbiBfaGlkZUNvbnRlbnQoY2FsbGJhY2spe1xyXG5cdFx0XHQvLyBGYWRlIG91dCB0aGUgY3VycmVudCBwaWN0dXJlXHJcblx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJyNwcF9mdWxsX3JlcyBvYmplY3QsI3BwX2Z1bGxfcmVzIGVtYmVkJykuY3NzKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7XHJcblx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9mYWRlJykuZmFkZU91dChzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQsZnVuY3Rpb24oKXtcclxuXHRcdFx0XHQkKCcucHBfbG9hZGVySWNvbicpLnNob3coKTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRjYWxsYmFjaygpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH07XHJcblx0XHJcblx0XHQvKipcclxuXHRcdCogQ2hlY2sgdGhlIGl0ZW0gcG9zaXRpb24gaW4gdGhlIGdhbGxlcnkgYXJyYXksIGhpZGUgb3Igc2hvdyB0aGUgbmF2aWdhdGlvbiBsaW5rc1xyXG5cdFx0KiBAcGFyYW0gc2V0Q291bnQge2ludGVnZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHNldFxyXG5cdFx0Ki9cclxuXHRcdGZ1bmN0aW9uIF9jaGVja1Bvc2l0aW9uKHNldENvdW50KXtcclxuXHRcdFx0KHNldENvdW50ID4gMSkgPyAkKCcucHBfbmF2Jykuc2hvdygpIDogJCgnLnBwX25hdicpLmhpZGUoKTsgLy8gSGlkZSB0aGUgYm90dG9tIG5hdiBpZiBpdCdzIG5vdCBhIHNldC5cclxuXHRcdH07XHJcblx0XHJcblx0XHQvKipcclxuXHRcdCogUmVzaXplIHRoZSBpdGVtIGRpbWVuc2lvbnMgaWYgaXQncyBiaWdnZXIgdGhhbiB0aGUgdmlld3BvcnRcclxuXHRcdCogQHBhcmFtIHdpZHRoIHtpbnRlZ2VyfSBXaWR0aCBvZiB0aGUgaXRlbSB0byBiZSBvcGVuZWRcclxuXHRcdCogQHBhcmFtIGhlaWdodCB7aW50ZWdlcn0gSGVpZ2h0IG9mIHRoZSBpdGVtIHRvIGJlIG9wZW5lZFxyXG5cdFx0KiBAcmV0dXJuIEFuIGFycmF5IGNvbnRhaW5pbiB0aGUgXCJmaXR0ZWRcIiBkaW1lbnNpb25zXHJcblx0XHQqL1xyXG5cdFx0ZnVuY3Rpb24gX2ZpdFRvVmlld3BvcnQod2lkdGgsaGVpZ2h0KXtcclxuXHRcdFx0cmVzaXplZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0X2dldERpbWVuc2lvbnMod2lkdGgsaGVpZ2h0KTtcclxuXHRcdFx0XHJcblx0XHRcdC8vIERlZmluZSB0aGVtIGluIGNhc2UgdGhlcmUncyBubyByZXNpemUgbmVlZGVkXHJcblx0XHRcdGltYWdlV2lkdGggPSB3aWR0aCwgaW1hZ2VIZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0XHRpZiggKChwcF9jb250YWluZXJXaWR0aCA+IHdpbmRvd1dpZHRoKSB8fCAocHBfY29udGFpbmVySGVpZ2h0ID4gd2luZG93SGVpZ2h0KSkgJiYgZG9yZXNpemUgJiYgc2V0dGluZ3MuYWxsb3dfcmVzaXplICYmICFwZXJjZW50QmFzZWQpIHtcclxuXHRcdFx0XHRyZXNpemVkID0gdHJ1ZSwgZml0dGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcclxuXHRcdFx0XHR3aGlsZSAoIWZpdHRpbmcpe1xyXG5cdFx0XHRcdFx0aWYoKHBwX2NvbnRhaW5lcldpZHRoID4gd2luZG93V2lkdGgpKXtcclxuXHRcdFx0XHRcdFx0aW1hZ2VXaWR0aCA9ICh3aW5kb3dXaWR0aCAtIDIwMCk7XHJcblx0XHRcdFx0XHRcdGltYWdlSGVpZ2h0ID0gKGhlaWdodC93aWR0aCkgKiBpbWFnZVdpZHRoO1xyXG5cdFx0XHRcdFx0fWVsc2UgaWYoKHBwX2NvbnRhaW5lckhlaWdodCA+IHdpbmRvd0hlaWdodCkpe1xyXG5cdFx0XHRcdFx0XHRpbWFnZUhlaWdodCA9ICh3aW5kb3dIZWlnaHQgLSAyMDApO1xyXG5cdFx0XHRcdFx0XHRpbWFnZVdpZHRoID0gKHdpZHRoL2hlaWdodCkgKiBpbWFnZUhlaWdodDtcclxuXHRcdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0XHRmaXR0aW5nID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0cHBfY29udGFpbmVySGVpZ2h0ID0gaW1hZ2VIZWlnaHQsIHBwX2NvbnRhaW5lcldpZHRoID0gaW1hZ2VXaWR0aDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcclxuXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0aWYoKHBwX2NvbnRhaW5lcldpZHRoID4gd2luZG93V2lkdGgpIHx8IChwcF9jb250YWluZXJIZWlnaHQgPiB3aW5kb3dIZWlnaHQpKXtcclxuXHRcdFx0XHRcdF9maXRUb1ZpZXdwb3J0KHBwX2NvbnRhaW5lcldpZHRoLHBwX2NvbnRhaW5lckhlaWdodClcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdF9nZXREaW1lbnNpb25zKGltYWdlV2lkdGgsaW1hZ2VIZWlnaHQpO1xyXG5cdFx0XHR9O1xyXG5cdFx0XHRcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHR3aWR0aDpNYXRoLmZsb29yKGltYWdlV2lkdGgpLFxyXG5cdFx0XHRcdGhlaWdodDpNYXRoLmZsb29yKGltYWdlSGVpZ2h0KSxcclxuXHRcdFx0XHRjb250YWluZXJIZWlnaHQ6TWF0aC5mbG9vcihwcF9jb250YWluZXJIZWlnaHQpLFxyXG5cdFx0XHRcdGNvbnRhaW5lcldpZHRoOk1hdGguZmxvb3IocHBfY29udGFpbmVyV2lkdGgpICsgKHNldHRpbmdzLmhvcml6b250YWxfcGFkZGluZyAqIDIpLFxyXG5cdFx0XHRcdGNvbnRlbnRIZWlnaHQ6TWF0aC5mbG9vcihwcF9jb250ZW50SGVpZ2h0KSxcclxuXHRcdFx0XHRjb250ZW50V2lkdGg6TWF0aC5mbG9vcihwcF9jb250ZW50V2lkdGgpLFxyXG5cdFx0XHRcdHJlc2l6ZWQ6cmVzaXplZFxyXG5cdFx0XHR9O1xyXG5cdFx0fTtcclxuXHRcdFxyXG5cdFx0LyoqXHJcblx0XHQqIEdldCB0aGUgY29udGFpbmVycyBkaW1lbnNpb25zIGFjY29yZGluZyB0byB0aGUgaXRlbSBzaXplXHJcblx0XHQqIEBwYXJhbSB3aWR0aCB7aW50ZWdlcn0gV2lkdGggb2YgdGhlIGl0ZW0gdG8gYmUgb3BlbmVkXHJcblx0XHQqIEBwYXJhbSBoZWlnaHQge2ludGVnZXJ9IEhlaWdodCBvZiB0aGUgaXRlbSB0byBiZSBvcGVuZWRcclxuXHRcdCovXHJcblx0XHRmdW5jdGlvbiBfZ2V0RGltZW5zaW9ucyh3aWR0aCxoZWlnaHQpe1xyXG5cdFx0XHR3aWR0aCA9IHBhcnNlRmxvYXQod2lkdGgpO1xyXG5cdFx0XHRoZWlnaHQgPSBwYXJzZUZsb2F0KGhlaWdodCk7XHJcblx0XHRcdFxyXG5cdFx0XHQvLyBHZXQgdGhlIGRldGFpbHMgaGVpZ2h0LCB0byBkbyBzbywgSSBuZWVkIHRvIGNsb25lIGl0IHNpbmNlIGl0J3MgaW52aXNpYmxlXHJcblx0XHRcdCRwcF9kZXRhaWxzID0gJHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX2RldGFpbHMnKTtcclxuXHRcdFx0JHBwX2RldGFpbHMud2lkdGgod2lkdGgpO1xyXG5cdFx0XHRkZXRhaWxzSGVpZ2h0ID0gcGFyc2VGbG9hdCgkcHBfZGV0YWlscy5jc3MoJ21hcmdpblRvcCcpKSArIHBhcnNlRmxvYXQoJHBwX2RldGFpbHMuY3NzKCdtYXJnaW5Cb3R0b20nKSk7XHJcblx0XHRcdFxyXG5cdFx0XHQkcHBfZGV0YWlscyA9ICRwcF9kZXRhaWxzLmNsb25lKCkuYWRkQ2xhc3Moc2V0dGluZ3MudGhlbWUpLndpZHRoKHdpZHRoKS5hcHBlbmRUbygkKCdib2R5JykpLmNzcyh7XHJcblx0XHRcdFx0J3Bvc2l0aW9uJzonYWJzb2x1dGUnLFxyXG5cdFx0XHRcdCd0b3AnOi0xMDAwMFxyXG5cdFx0XHR9KTtcclxuXHRcdFx0ZGV0YWlsc0hlaWdodCArPSAkcHBfZGV0YWlscy5oZWlnaHQoKTtcclxuXHRcdFx0ZGV0YWlsc0hlaWdodCA9IChkZXRhaWxzSGVpZ2h0IDw9IDM0KSA/IDM2IDogZGV0YWlsc0hlaWdodDsgLy8gTWluLWhlaWdodCBmb3IgdGhlIGRldGFpbHNcclxuXHRcdFx0JHBwX2RldGFpbHMucmVtb3ZlKCk7XHJcblx0XHRcdFxyXG5cdFx0XHQvLyBHZXQgdGhlIHRpdGxlcyBoZWlnaHQsIHRvIGRvIHNvLCBJIG5lZWQgdG8gY2xvbmUgaXQgc2luY2UgaXQncyBpbnZpc2libGVcclxuXHRcdFx0JHBwX3RpdGxlID0gJHBwX3BpY19ob2xkZXIuZmluZCgnLnBwdCcpO1xyXG5cdFx0XHQkcHBfdGl0bGUud2lkdGgod2lkdGgpO1xyXG5cdFx0XHR0aXRsZUhlaWdodCA9IHBhcnNlRmxvYXQoJHBwX3RpdGxlLmNzcygnbWFyZ2luVG9wJykpICsgcGFyc2VGbG9hdCgkcHBfdGl0bGUuY3NzKCdtYXJnaW5Cb3R0b20nKSk7XHJcblx0XHRcdCRwcF90aXRsZSA9ICRwcF90aXRsZS5jbG9uZSgpLmFwcGVuZFRvKCQoJ2JvZHknKSkuY3NzKHtcclxuXHRcdFx0XHQncG9zaXRpb24nOidhYnNvbHV0ZScsXHJcblx0XHRcdFx0J3RvcCc6LTEwMDAwXHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aXRsZUhlaWdodCArPSAkcHBfdGl0bGUuaGVpZ2h0KCk7XHJcblx0XHRcdCRwcF90aXRsZS5yZW1vdmUoKTtcclxuXHRcdFx0XHJcblx0XHRcdC8vIEdldCB0aGUgY29udGFpbmVyIHNpemUsIHRvIHJlc2l6ZSB0aGUgaG9sZGVyIHRvIHRoZSByaWdodCBkaW1lbnNpb25zXHJcblx0XHRcdHBwX2NvbnRlbnRIZWlnaHQgPSBoZWlnaHQgKyBkZXRhaWxzSGVpZ2h0O1xyXG5cdFx0XHRwcF9jb250ZW50V2lkdGggPSB3aWR0aDtcclxuXHRcdFx0cHBfY29udGFpbmVySGVpZ2h0ID0gcHBfY29udGVudEhlaWdodCArIHRpdGxlSGVpZ2h0ICsgJHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX3RvcCcpLmhlaWdodCgpICsgJHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX2JvdHRvbScpLmhlaWdodCgpO1xyXG5cdFx0XHRwcF9jb250YWluZXJXaWR0aCA9IHdpZHRoO1xyXG5cdFx0fVxyXG5cdFxyXG5cdFx0ZnVuY3Rpb24gX2dldEZpbGVUeXBlKGl0ZW1TcmMpe1xyXG5cdFx0XHRpZiAoaXRlbVNyYy5tYXRjaCgveW91dHViZVxcLmNvbVxcL3dhdGNoL2kpIHx8IGl0ZW1TcmMubWF0Y2goL3lvdXR1XFwuYmUvaSkpIHtcclxuXHRcdFx0XHRyZXR1cm4gJ3lvdXR1YmUnO1xyXG5cdFx0XHR9ZWxzZSBpZiAoaXRlbVNyYy5tYXRjaCgvdmltZW9cXC5jb20vaSkpIHtcclxuXHRcdFx0XHRyZXR1cm4gJ3ZpbWVvJztcclxuXHRcdFx0fWVsc2UgaWYoaXRlbVNyYy5tYXRjaCgvXFxiLm1vdlxcYi9pKSl7IFxyXG5cdFx0XHRcdHJldHVybiAncXVpY2t0aW1lJztcclxuXHRcdFx0fWVsc2UgaWYoaXRlbVNyYy5tYXRjaCgvXFxiLnN3ZlxcYi9pKSl7XHJcblx0XHRcdFx0cmV0dXJuICdmbGFzaCc7XHJcblx0XHRcdH1lbHNlIGlmKGl0ZW1TcmMubWF0Y2goL1xcYmlmcmFtZT10cnVlXFxiL2kpKXtcclxuXHRcdFx0XHRyZXR1cm4gJ2lmcmFtZSc7XHJcblx0XHRcdH1lbHNlIGlmKGl0ZW1TcmMubWF0Y2goL1xcYmFqYXg9dHJ1ZVxcYi9pKSl7XHJcblx0XHRcdFx0cmV0dXJuICdhamF4JztcclxuXHRcdFx0fWVsc2UgaWYoaXRlbVNyYy5tYXRjaCgvXFxiY3VzdG9tPXRydWVcXGIvaSkpe1xyXG5cdFx0XHRcdHJldHVybiAnY3VzdG9tJztcclxuXHRcdFx0fWVsc2UgaWYoaXRlbVNyYy5zdWJzdHIoMCwxKSA9PSAnIycpe1xyXG5cdFx0XHRcdHJldHVybiAnaW5saW5lJztcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0cmV0dXJuICdpbWFnZSc7XHJcblx0XHRcdH07XHJcblx0XHR9O1xyXG5cdFxyXG5cdFx0ZnVuY3Rpb24gX2NlbnRlcl9vdmVybGF5KCl7XHJcblx0XHRcdGlmKGRvcmVzaXplICYmIHR5cGVvZiAkcHBfcGljX2hvbGRlciAhPSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRcdHNjcm9sbF9wb3MgPSBfZ2V0X3Njcm9sbCgpO1xyXG5cdFx0XHRcdGNvbnRlbnRIZWlnaHQgPSAkcHBfcGljX2hvbGRlci5oZWlnaHQoKSwgY29udGVudHdpZHRoID0gJHBwX3BpY19ob2xkZXIud2lkdGgoKTtcclxuXHJcblx0XHRcdFx0cHJvamVjdGVkVG9wID0gKHdpbmRvd0hlaWdodC8yKSArIHNjcm9sbF9wb3NbJ3Njcm9sbFRvcCddIC0gKGNvbnRlbnRIZWlnaHQvMik7XHJcblx0XHRcdFx0aWYocHJvamVjdGVkVG9wIDwgMCkgcHJvamVjdGVkVG9wID0gMDtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZihjb250ZW50SGVpZ2h0ID4gd2luZG93SGVpZ2h0KVxyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHQkcHBfcGljX2hvbGRlci5jc3Moe1xyXG5cdFx0XHRcdFx0J3RvcCc6IHByb2plY3RlZFRvcCxcclxuXHRcdFx0XHRcdCdsZWZ0JzogKHdpbmRvd1dpZHRoLzIpICsgc2Nyb2xsX3Bvc1snc2Nyb2xsTGVmdCddIC0gKGNvbnRlbnR3aWR0aC8yKVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9O1xyXG5cdFx0fTtcclxuXHRcclxuXHRcdGZ1bmN0aW9uIF9nZXRfc2Nyb2xsKCl7XHJcblx0XHRcdGlmIChzZWxmLnBhZ2VZT2Zmc2V0KSB7XHJcblx0XHRcdFx0cmV0dXJuIHtzY3JvbGxUb3A6c2VsZi5wYWdlWU9mZnNldCxzY3JvbGxMZWZ0OnNlbGYucGFnZVhPZmZzZXR9O1xyXG5cdFx0XHR9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSB7IC8vIEV4cGxvcmVyIDYgU3RyaWN0XHJcblx0XHRcdFx0cmV0dXJuIHtzY3JvbGxUb3A6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCxzY3JvbGxMZWZ0OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fTtcclxuXHRcdFx0fSBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSB7Ly8gYWxsIG90aGVyIEV4cGxvcmVyc1xyXG5cdFx0XHRcdHJldHVybiB7c2Nyb2xsVG9wOmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLHNjcm9sbExlZnQ6ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0fTtcclxuXHRcdFx0fTtcclxuXHRcdH07XHJcblx0XHJcblx0XHRmdW5jdGlvbiBfcmVzaXplX292ZXJsYXkoKSB7XHJcblx0XHRcdHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKSwgd2luZG93V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcclxuXHRcdFx0XHJcblx0XHRcdGlmKHR5cGVvZiAkcHBfb3ZlcmxheSAhPSBcInVuZGVmaW5lZFwiKSAkcHBfb3ZlcmxheS5oZWlnaHQoJChkb2N1bWVudCkuaGVpZ2h0KCkpLndpZHRoKHdpbmRvd1dpZHRoKTtcclxuXHRcdH07XHJcblx0XHJcblx0XHRmdW5jdGlvbiBfaW5zZXJ0X2dhbGxlcnkoKXtcclxuXHRcdFx0aWYoaXNTZXQgJiYgc2V0dGluZ3Mub3ZlcmxheV9nYWxsZXJ5ICYmIF9nZXRGaWxlVHlwZShwcF9pbWFnZXNbc2V0X3Bvc2l0aW9uXSk9PVwiaW1hZ2VcIikge1xyXG5cdFx0XHRcdGl0ZW1XaWR0aCA9IDUyKzU7IC8vIDUyIGJlaWduIHRoZSB0aHVtYiB3aWR0aCwgNSBiZWluZyB0aGUgcmlnaHQgbWFyZ2luLlxyXG5cdFx0XHRcdG5hdldpZHRoID0gKHNldHRpbmdzLnRoZW1lID09IFwiZmFjZWJvb2tcIiB8fCBzZXR0aW5ncy50aGVtZSA9PSBcInBwX2RlZmF1bHRcIikgPyA1MCA6IDMwOyAvLyBEZWZpbmUgdGhlIGFycm93IHdpZHRoIGRlcGVuZGluZyBvbiB0aGUgdGhlbWVcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpdGVtc1BlclBhZ2UgPSBNYXRoLmZsb29yKChwcF9kaW1lbnNpb25zWydjb250YWluZXJXaWR0aCddIC0gMTAwIC0gbmF2V2lkdGgpIC8gaXRlbVdpZHRoKTtcclxuXHRcdFx0XHRpdGVtc1BlclBhZ2UgPSAoaXRlbXNQZXJQYWdlIDwgcHBfaW1hZ2VzLmxlbmd0aCkgPyBpdGVtc1BlclBhZ2UgOiBwcF9pbWFnZXMubGVuZ3RoO1xyXG5cdFx0XHRcdHRvdGFsUGFnZSA9IE1hdGguY2VpbChwcF9pbWFnZXMubGVuZ3RoIC8gaXRlbXNQZXJQYWdlKSAtIDE7XHJcblxyXG5cdFx0XHRcdC8vIEhpZGUgdGhlIG5hdiBpbiB0aGUgY2FzZSB0aGVyZSdzIG5vIG5lZWQgZm9yIGxpbmtzXHJcblx0XHRcdFx0aWYodG90YWxQYWdlID09IDApe1xyXG5cdFx0XHRcdFx0bmF2V2lkdGggPSAwOyAvLyBObyBuYXYgbWVhbnMgbm8gd2lkdGghXHJcblx0XHRcdFx0XHQkcHBfZ2FsbGVyeS5maW5kKCcucHBfYXJyb3dfbmV4dCwucHBfYXJyb3dfcHJldmlvdXMnKS5oaWRlKCk7XHJcblx0XHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0XHQkcHBfZ2FsbGVyeS5maW5kKCcucHBfYXJyb3dfbmV4dCwucHBfYXJyb3dfcHJldmlvdXMnKS5zaG93KCk7XHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Z2FsbGVyeVdpZHRoID0gaXRlbXNQZXJQYWdlICogaXRlbVdpZHRoO1xyXG5cdFx0XHRcdGZ1bGxHYWxsZXJ5V2lkdGggPSBwcF9pbWFnZXMubGVuZ3RoICogaXRlbVdpZHRoO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8vIFNldCB0aGUgcHJvcGVyIHdpZHRoIHRvIHRoZSBnYWxsZXJ5IGl0ZW1zXHJcblx0XHRcdFx0JHBwX2dhbGxlcnlcclxuXHRcdFx0XHRcdC5jc3MoJ21hcmdpbi1sZWZ0JywtKChnYWxsZXJ5V2lkdGgvMikgKyAobmF2V2lkdGgvMikpKVxyXG5cdFx0XHRcdFx0LmZpbmQoJ2RpdjpmaXJzdCcpLndpZHRoKGdhbGxlcnlXaWR0aCs1KVxyXG5cdFx0XHRcdFx0LmZpbmQoJ3VsJykud2lkdGgoZnVsbEdhbGxlcnlXaWR0aClcclxuXHRcdFx0XHRcdC5maW5kKCdsaS5zZWxlY3RlZCcpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGdvVG9QYWdlID0gKE1hdGguZmxvb3Ioc2V0X3Bvc2l0aW9uL2l0ZW1zUGVyUGFnZSkgPCB0b3RhbFBhZ2UpID8gTWF0aC5mbG9vcihzZXRfcG9zaXRpb24vaXRlbXNQZXJQYWdlKSA6IHRvdGFsUGFnZTtcclxuXHJcblx0XHRcdFx0JC5wcmV0dHlQaG90by5jaGFuZ2VHYWxsZXJ5UGFnZShnb1RvUGFnZSk7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0JHBwX2dhbGxlcnlfbGkuZmlsdGVyKCc6ZXEoJytzZXRfcG9zaXRpb24rJyknKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0JHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX2NvbnRlbnQnKS51bmJpbmQoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpO1xyXG5cdFx0XHRcdC8vICRwcF9nYWxsZXJ5LmhpZGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFxyXG5cdFx0ZnVuY3Rpb24gX2J1aWxkX292ZXJsYXkoY2FsbGVyKXtcclxuXHRcdFx0Ly8gSW5qZWN0IFNvY2lhbCBUb29sIG1hcmt1cCBpbnRvIEdlbmVyYWwgbWFya3VwXHJcblx0XHRcdGlmKHNldHRpbmdzLnNvY2lhbF90b29scylcclxuXHRcdFx0XHRmYWNlYm9va19saWtlX2xpbmsgPSBzZXR0aW5ncy5zb2NpYWxfdG9vbHMucmVwbGFjZSgne2xvY2F0aW9uX2hyZWZ9JywgZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKTsgXHJcblxyXG5cdFx0XHRzZXR0aW5ncy5tYXJrdXAgPSBzZXR0aW5ncy5tYXJrdXAucmVwbGFjZSgne3BwX3NvY2lhbH0nLCcnKTsgXHJcblx0XHRcdFxyXG5cdFx0XHQkKCdib2R5JykuYXBwZW5kKHNldHRpbmdzLm1hcmt1cCk7IC8vIEluamVjdCB0aGUgbWFya3VwXHJcblx0XHRcdFxyXG5cdFx0XHQkcHBfcGljX2hvbGRlciA9ICQoJy5wcF9waWNfaG9sZGVyJykgLCAkcHB0ID0gJCgnLnBwdCcpLCAkcHBfb3ZlcmxheSA9ICQoJ2Rpdi5wcF9vdmVybGF5Jyk7IC8vIFNldCBteSBnbG9iYWwgc2VsZWN0b3JzXHJcblx0XHRcdFxyXG5cdFx0XHQvLyBJbmplY3QgdGhlIGlubGluZSBnYWxsZXJ5IVxyXG5cdFx0XHRpZihpc1NldCAmJiBzZXR0aW5ncy5vdmVybGF5X2dhbGxlcnkpIHtcclxuXHRcdFx0XHRjdXJyZW50R2FsbGVyeVBhZ2UgPSAwO1xyXG5cdFx0XHRcdHRvSW5qZWN0ID0gXCJcIjtcclxuXHRcdFx0XHRmb3IgKHZhciBpPTA7IGkgPCBwcF9pbWFnZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGlmKCFwcF9pbWFnZXNbaV0ubWF0Y2goL1xcYihqcGd8anBlZ3xwbmd8Z2lmKVxcYi9naSkpe1xyXG5cdFx0XHRcdFx0XHRjbGFzc25hbWUgPSAnZGVmYXVsdCc7XHJcblx0XHRcdFx0XHRcdGltZ19zcmMgPSAnJztcclxuXHRcdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0XHRjbGFzc25hbWUgPSAnJztcclxuXHRcdFx0XHRcdFx0aW1nX3NyYyA9IHBwX2ltYWdlc1tpXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRvSW5qZWN0ICs9IFwiPGxpIGNsYXNzPSdcIitjbGFzc25hbWUrXCInPjxhIGhyZWY9JyMnPjxpbWcgc3JjPSdcIiArIGltZ19zcmMgKyBcIicgd2lkdGg9JzUwJyBhbHQ9JycgLz48L2E+PC9saT5cIjtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdHRvSW5qZWN0ID0gc2V0dGluZ3MuZ2FsbGVyeV9tYXJrdXAucmVwbGFjZSgve2dhbGxlcnl9L2csdG9JbmplY3QpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJyNwcF9mdWxsX3JlcycpLmFmdGVyKHRvSW5qZWN0KTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQkcHBfZ2FsbGVyeSA9ICQoJy5wcF9waWNfaG9sZGVyIC5wcF9nYWxsZXJ5JyksICRwcF9nYWxsZXJ5X2xpID0gJHBwX2dhbGxlcnkuZmluZCgnbGknKTsgLy8gU2V0IHRoZSBnYWxsZXJ5IHNlbGVjdG9yc1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdCRwcF9nYWxsZXJ5LmZpbmQoJy5wcF9hcnJvd19uZXh0JykuY2xpY2soZnVuY3Rpb24oKXtcclxuXHRcdFx0XHRcdCQucHJldHR5UGhvdG8uY2hhbmdlR2FsbGVyeVBhZ2UoJ25leHQnKTtcclxuXHRcdFx0XHRcdCQucHJldHR5UGhvdG8uc3RvcFNsaWRlc2hvdygpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdCRwcF9nYWxsZXJ5LmZpbmQoJy5wcF9hcnJvd19wcmV2aW91cycpLmNsaWNrKGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0XHQkLnByZXR0eVBob3RvLmNoYW5nZUdhbGxlcnlQYWdlKCdwcmV2aW91cycpO1xyXG5cdFx0XHRcdFx0JC5wcmV0dHlQaG90by5zdG9wU2xpZGVzaG93KCk7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0JHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX2NvbnRlbnQnKS5ob3ZlcihcclxuXHRcdFx0XHRcdGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9nYWxsZXJ5Om5vdCguZGlzYWJsZWQpJykuZmFkZUluKCk7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKXtcclxuXHRcdFx0XHRcdFx0JHBwX3BpY19ob2xkZXIuZmluZCgnLnBwX2dhbGxlcnk6bm90KC5kaXNhYmxlZCknKS5mYWRlT3V0KCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aXRlbVdpZHRoID0gNTIrNTsgLy8gNTIgYmVpZ24gdGhlIHRodW1iIHdpZHRoLCA1IGJlaW5nIHRoZSByaWdodCBtYXJnaW4uXHJcblx0XHRcdFx0JHBwX2dhbGxlcnlfbGkuZWFjaChmdW5jdGlvbihpKXtcclxuXHRcdFx0XHRcdCQodGhpcylcclxuXHRcdFx0XHRcdFx0LmZpbmQoJ2EnKVxyXG5cdFx0XHRcdFx0XHQuY2xpY2soZnVuY3Rpb24oKXtcclxuXHRcdFx0XHRcdFx0XHQkLnByZXR0eVBob3RvLmNoYW5nZVBhZ2UoaSk7XHJcblx0XHRcdFx0XHRcdFx0JC5wcmV0dHlQaG90by5zdG9wU2xpZGVzaG93KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fTtcclxuXHRcdFx0XHJcblx0XHRcdFxyXG5cdFx0XHQvLyBJbmplY3QgdGhlIHBsYXkvcGF1c2UgaWYgaXQncyBhIHNsaWRlc2hvd1xyXG5cdFx0XHRpZihzZXR0aW5ncy5zbGlkZXNob3cpe1xyXG5cdFx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9uYXYnKS5wcmVwZW5kKCc8YSBocmVmPVwiI1wiIGNsYXNzPVwicHBfcGxheVwiPlBsYXk8L2E+JylcclxuXHRcdFx0XHQkcHBfcGljX2hvbGRlci5maW5kKCcucHBfbmF2IC5wcF9wbGF5JykuY2xpY2soZnVuY3Rpb24oKXtcclxuXHRcdFx0XHRcdCQucHJldHR5UGhvdG8uc3RhcnRTbGlkZXNob3coKTtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRcclxuXHRcdFx0JHBwX3BpY19ob2xkZXIuYXR0cignY2xhc3MnLCdwcF9waWNfaG9sZGVyICcgKyBzZXR0aW5ncy50aGVtZSk7IC8vIFNldCB0aGUgcHJvcGVyIHRoZW1lXHJcblx0XHRcdFxyXG5cdFx0XHQkcHBfb3ZlcmxheVxyXG5cdFx0XHRcdC5jc3Moe1xyXG5cdFx0XHRcdFx0J29wYWNpdHknOjAsXHJcblx0XHRcdFx0XHQnaGVpZ2h0JzokKGRvY3VtZW50KS5oZWlnaHQoKSxcclxuXHRcdFx0XHRcdCd3aWR0aCc6JCh3aW5kb3cpLndpZHRoKClcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0LmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpe1xyXG5cdFx0XHRcdFx0aWYoIXNldHRpbmdzLm1vZGFsKSAkLnByZXR0eVBob3RvLmNsb3NlKCk7XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHQkKCdhLnBwX2Nsb3NlJykuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCl7ICQucHJldHR5UGhvdG8uY2xvc2UoKTsgcmV0dXJuIGZhbHNlOyB9KTtcclxuXHJcblxyXG5cdFx0XHRpZihzZXR0aW5ncy5hbGxvd19leHBhbmQpIHtcclxuXHRcdFx0XHQkKCdhLnBwX2V4cGFuZCcpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbihlKXtcclxuXHRcdFx0XHRcdC8vIEV4cGFuZCB0aGUgaW1hZ2VcclxuXHRcdFx0XHRcdGlmKCQodGhpcykuaGFzQ2xhc3MoJ3BwX2V4cGFuZCcpKXtcclxuXHRcdFx0XHRcdFx0JCh0aGlzKS5yZW1vdmVDbGFzcygncHBfZXhwYW5kJykuYWRkQ2xhc3MoJ3BwX2NvbnRyYWN0Jyk7XHJcblx0XHRcdFx0XHRcdGRvcmVzaXplID0gZmFsc2U7XHJcblx0XHRcdFx0XHR9ZWxzZXtcclxuXHRcdFx0XHRcdFx0JCh0aGlzKS5yZW1vdmVDbGFzcygncHBfY29udHJhY3QnKS5hZGRDbGFzcygncHBfZXhwYW5kJyk7XHJcblx0XHRcdFx0XHRcdGRvcmVzaXplID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0XHRfaGlkZUNvbnRlbnQoZnVuY3Rpb24oKXsgJC5wcmV0dHlQaG90by5vcGVuKCk7IH0pO1xyXG5cdFx0XHRcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHJcblx0XHRcdCRwcF9waWNfaG9sZGVyLmZpbmQoJy5wcF9wcmV2aW91cywgLnBwX25hdiAucHBfYXJyb3dfcHJldmlvdXMnKS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKXtcclxuXHRcdFx0XHQkLnByZXR0eVBob3RvLmNoYW5nZVBhZ2UoJ3ByZXZpb3VzJyk7XHJcblx0XHRcdFx0JC5wcmV0dHlQaG90by5zdG9wU2xpZGVzaG93KCk7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9KTtcclxuXHRcdFxyXG5cdFx0XHQkcHBfcGljX2hvbGRlci5maW5kKCcucHBfbmV4dCwgLnBwX25hdiAucHBfYXJyb3dfbmV4dCcpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpe1xyXG5cdFx0XHRcdCQucHJldHR5UGhvdG8uY2hhbmdlUGFnZSgnbmV4dCcpO1xyXG5cdFx0XHRcdCQucHJldHR5UGhvdG8uc3RvcFNsaWRlc2hvdygpO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdFxyXG5cdFx0XHRfY2VudGVyX292ZXJsYXkoKTsgLy8gQ2VudGVyIGl0XHJcblx0XHR9O1xyXG5cclxuXHRcdGlmKCFwcF9hbHJlYWR5SW5pdGlhbGl6ZWQgJiYgZ2V0SGFzaHRhZygpKXtcclxuXHRcdFx0cHBfYWxyZWFkeUluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHRcdFx0XHJcblx0XHRcdC8vIEdyYWIgdGhlIHJlbCBpbmRleCB0byB0cmlnZ2VyIHRoZSBjbGljayBvbiB0aGUgY29ycmVjdCBlbGVtZW50XHJcblx0XHRcdGhhc2hJbmRleCA9IGdldEhhc2h0YWcoKTtcclxuXHRcdFx0aGFzaFJlbCA9IGhhc2hJbmRleDtcclxuXHRcdFx0aGFzaEluZGV4ID0gaGFzaEluZGV4LnN1YnN0cmluZyhoYXNoSW5kZXguaW5kZXhPZignLycpKzEsaGFzaEluZGV4Lmxlbmd0aC0xKTtcclxuXHRcdFx0aGFzaFJlbCA9IGhhc2hSZWwuc3Vic3RyaW5nKDAsaGFzaFJlbC5pbmRleE9mKCcvJykpO1xyXG5cclxuXHRcdFx0Ly8gTGl0dGxlIHRpbWVvdXQgdG8gbWFrZSBzdXJlIGFsbCB0aGUgcHJldHR5UGhvdG8gaW5pdGlhbGl6ZSBzY3JpcHRzIGhhcyBiZWVuIHJ1bi5cclxuXHRcdFx0Ly8gVXNlZnVsIGluIHRoZSBldmVudCB0aGUgcGFnZSBjb250YWluIHNldmVyYWwgaW5pdCBzY3JpcHRzLlxyXG5cdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQoXCJhW1wiK3BwX3NldHRpbmdzLmhvb2srXCJePSdcIitoYXNoUmVsK1wiJ106ZXEoXCIraGFzaEluZGV4K1wiKVwiKS50cmlnZ2VyKCdjbGljaycpOyB9LDUwKTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0cmV0dXJuIHRoaXMudW5iaW5kKCdjbGljay5wcmV0dHlwaG90bycpLmJpbmQoJ2NsaWNrLnByZXR0eXBob3RvJywkLnByZXR0eVBob3RvLmluaXRpYWxpemUpOyAvLyBSZXR1cm4gdGhlIGpRdWVyeSBvYmplY3QgZm9yIGNoYWluaW5nLiBUaGUgdW5iaW5kIG1ldGhvZCBpcyB1c2VkIHRvIGF2b2lkIGNsaWNrIGNvbmZsaWN0IHdoZW4gdGhlIHBsdWdpbiBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2VcclxuXHR9O1xyXG5cdFxyXG5cdGZ1bmN0aW9uIGdldEhhc2h0YWcoKXtcclxuXHRcdHZhciB1cmwgPSBsb2NhdGlvbi5ocmVmO1xyXG5cdFx0aGFzaHRhZyA9ICh1cmwuaW5kZXhPZignI3ByZXR0eVBob3RvJykgIT09IC0xKSA/IGRlY29kZVVSSSh1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKCcjcHJldHR5UGhvdG8nKSsxLHVybC5sZW5ndGgpKSA6IGZhbHNlO1xyXG5cdFx0aWYoaGFzaHRhZyl7ICBoYXNodGFnID0gaGFzaHRhZy5yZXBsYWNlKC88fD4vZywnJyk7IH1cclxuXHRcdHJldHVybiBoYXNodGFnO1xyXG5cdH07XHJcblx0XHJcblx0ZnVuY3Rpb24gc2V0SGFzaHRhZygpe1xyXG5cdFx0aWYodHlwZW9mIHRoZVJlbCA9PSAndW5kZWZpbmVkJykgcmV0dXJuOyAvLyB0aGVSZWwgaXMgc2V0IG9uIG5vcm1hbCBjYWxscywgaXQncyBpbXBvc3NpYmxlIHRvIGRlZXBsaW5rIHVzaW5nIHRoZSBBUElcclxuXHRcdGxvY2F0aW9uLmhhc2ggPSB0aGVSZWwgKyAnLycrcmVsX2luZGV4KycvJztcclxuXHR9O1xyXG5cdFxyXG5cdGZ1bmN0aW9uIGNsZWFySGFzaHRhZygpe1xyXG5cdFx0aWYgKCBsb2NhdGlvbi5ocmVmLmluZGV4T2YoJyNwcmV0dHlQaG90bycpICE9PSAtMSApIGxvY2F0aW9uLmhhc2ggPSBcInByZXR0eVBob3RvXCI7XHJcblx0fVxyXG5cdFxyXG5cdGZ1bmN0aW9uIGdldFBhcmFtKG5hbWUsdXJsKXtcclxuXHQgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLyxcIlxcXFxcXFtcIikucmVwbGFjZSgvW1xcXV0vLFwiXFxcXFxcXVwiKTtcclxuXHQgIHZhciByZWdleFMgPSBcIltcXFxcPyZdXCIrbmFtZStcIj0oW14mI10qKVwiO1xyXG5cdCAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCggcmVnZXhTICk7XHJcblx0ICB2YXIgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMoIHVybCApO1xyXG5cdCAgcmV0dXJuICggcmVzdWx0cyA9PSBudWxsICkgPyBcIlwiIDogcmVzdWx0c1sxXTtcclxuXHR9XHJcblx0XHJcbn0pKGpRdWVyeSk7XHJcblxyXG52YXIgcHBfYWxyZWFkeUluaXRpYWxpemVkID0gZmFsc2U7IC8vIFVzZWQgZm9yIHRoZSBkZWVwIGxpbmtpbmcgdG8gbWFrZSBzdXJlIG5vdCB0byBjYWxsIHRoZSBzYW1lIGZ1bmN0aW9uIHNldmVyYWwgdGltZXMuXHJcbiJdfQ==
