discourse/spec/fixtures/onebox/amazon-ebook.response

6170 lines
837 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

<html class="a-touch a-mobile a-js a-audio a-video a-canvas a-svg a-drag-drop a-geolocation a-history a-webworker a-autofocus a-input-placeholder a-textarea-placeholder a-local-storage a-touch a-gradients a-hires a-transform3d a-touch-scrolling a-ios a-mobile a-text-shadow a-text-stroke a-box-shadow a-border-radius a-border-image a-opacity a-transform a-transition a-ember" data-19ax5a9jf="mongoose" data-aui-build-date="3.18.2-2018-02-15" data-ember-extension="1" data-aui-version="00fd8dd141900eab878ed8d98dc8a72ba5df647b"><script type="text/javascript">window["_gaUserPrefs"] = { ioo : function() { return true; } }</script><!-- sp:feature:head-start --><head><script async="" src="https://images-na.ssl-images-amazon.com/images/G/01/AUIClients/ClientSideMetricsAUIJavascript-96ea10f95c9c40ac3d7cc81f2d76b78f0fdf178b._V2_.js" crossorigin="anonymous"></script><script>var aPageStart = (new Date()).getTime();</script><meta name="viewport" content="width=device-width, maximum-scale=1, minimum-scale=1, initial-scale=1, user-scalable=no, shrink-to-fit=no"><meta charset="utf-8">
<script type="text/javascript">var ue_t0=ue_t0||+new Date();</script><!-- sp:feature:cs-optimization -->
<script type="text/javascript">
var ue_csm = window,
ue_hob = +new Date();
(function(d){var e=d.ue=d.ue||{},f=Date.now||function(){return+new Date};e.d=function(b){return f()-(b?0:d.ue_t0)};e.stub=function(b,a){if(!b[a]){var c=[];b[a]=function(){c.push([c.slice.call(arguments),e.d(),d.ue_id])};b[a].replay=function(b){for(var a;a=c.shift();)b(a[0],a[1],a[2])};b[a].isStub=1}};e.exec=function(b,a){return function(){if(1==window.ueinit)try{return b.apply(this,arguments)}catch(c){ueLogError(c,{attribution:a||"undefined",logLevel:"WARN"})}}}})(ue_csm);
var ue_err_chan = 'jserr-rw';
(function(d,e){function h(f,b){if(!(a.ec>a.mxe)&&f){a.ter.push(f);b=b||{};var c=f.logLevel||b.logLevel;c&&c!==k&&c!==m&&c!==n&&c!==p||a.ec++;c&&c!=k||a.ecf++;b.pageURL=""+(e.location?e.location.href:"");b.logLevel=c;b.attribution=f.attribution||b.attribution;a.erl.push({ex:f,info:b})}}function l(a,b,c,e,g){d.ueLogError({m:a,f:b,l:c,c:""+e,err:g,fromOnError:1,args:arguments},g?{attribution:g.attribution,logLevel:g.logLevel}:void 0);return!1}var k="FATAL",m="ERROR",n="WARN",p="DOWNGRADED",a={ec:0,ecf:0,
pec:0,ts:0,erl:[],ter:[],mxe:50,startTimer:function(){a.ts++;setInterval(function(){d.ue&&a.pec<a.ec&&d.uex("at");a.pec=a.ec},1E4)}};l.skipTrace=1;h.skipTrace=1;h.isStub=1;d.ueLogError=h;d.ue_err=a;e.onerror=l})(ue_csm,window);
var ue_id = 'NDW9PCFNDRXWFHQVWR24',
ue_url = '/gp/uedata',
ue_navtiming = 1,
ue_mid = 'ATVPDKIKX0DER',
ue_sid = '147-0816675-1753153',
ue_sn = 'www.amazon.com',
ue_furl = 'fls-na.amazon.com',
ue_surl = 'https://unagi-na.amazon.com/1/events/com.amazon.csm.nexusclient.prod',
ue_fcsn = 1,
ue_urt = 3,
ue_rpl_ns = 'cel-rpl',
ue_ddq = 1,
ue_fpf = '//fls-na.amazon.com/1/batch/1/OP/ATVPDKIKX0DER:147-0816675-1753153:NDW9PCFNDRXWFHQVWR24$uedata=s:',
ue_rsc = 0,
ue_cdt = 1,
ue_swi = 1;
function ue_viz(){(function(c,e,a){function k(b){if(c.ue.viz.length<p&&!l){var a=b.type;b=b.originalEvent;/^focus./.test(a)&&b&&(b.toElement||b.fromElement||b.relatedTarget)||(a=e[m]||("blur"==a||"focusout"==a?"hidden":"visible"),c.ue.viz.push(a+":"+(+new Date-c.ue.t0)),"visible"==a&&(ue.isl&&uex("at"),l=1))}}for(var l=0,f,g,m,n=["","webkit","o","ms","moz"],d=0,p=20,h=0;h<n.length&&!d;h++)if(a=n[h],f=(a?a+"H":"h")+"idden",d="boolean"==typeof e[f])g=a+"visibilitychange",m=(a?a+"V":"v")+"isibilityState";
k({});d&&e.addEventListener(g,k,0);c.ue&&d&&(c.ue.pageViz={event:g,propHid:f})})(ue_csm,document,window)};
(function(a,g,x){function z(a){return a&&a.replace&&a.replace(/^\s+|\s+$/g,"")}function q(a){return"undefined"===typeof a}function J(e){if(a.ue_fpf&&g.encodeURIComponent&&e){var b=new Image;e=""+a.ue_fpf+g.encodeURIComponent(e)+":"+(+new Date-a.ue_t0);a.ue.iel.push(b);b.src=e}}function D(e){if(e&&0<e.length){var b=new Image;a.ue.iel.push(b);b.src=e}}function t(e,b,c,l){var g=l||+new Date,h;a.ueam&&a.ueam(b,e,l);if(b||q(c)){if(e)for(h in l=b?f("t",b)||f("t",b,{}):a.ue.t,l[e]=g,c)c.hasOwnProperty(h)&&
f(h,b,c[h]);return g}}function f(e,b,c){var l=a.ue,f=b&&b!=l.id?l.sc[b]:l;f||(f=l.sc[b]={});"id"==e&&c&&(l.cfa2=1);return f[e]=c||f[e]}function A(e,b,c,f,g){c="on"+c;var h=b[c];"function"===typeof h?e&&(a.ue.h[e]=h):h=function(){};b[c]=g?function(a){f(a);h(a)}:function(a){h(a);f(a)};b[c]&&(b[c].isUeh=1)}function E(e,b,c){function l(b,c){var d=[b],L=0,g={},l,h;c?(d.push("m=1"),g[c]=1):g=a.ue.sc;for(h in g)if(g.hasOwnProperty(h)){var k=f("wb",h),m=f("t",h)||{},p=f("t0",h)||a.ue.t0,n;if(c||2==k){k=k?
L++:"";d.push("sc"+k+"="+h);for(n in m)3>=n.length&&!q(m[n])&&null!==m[n]&&d.push(n+k+"="+(m[n]-p));d.push("t"+k+"="+m[e]);if(f("ctb",h)||f("wb",h))l=1}}!B&&l&&d.push("ctb=1");return d.join("&")}function K(b,c){if(a.ue.b){var e=a.ue.b;a.ue.b="";h(e,b,c,1)}}function h(b,c,e,d){if(b){var f=!d||!a.ue.log,l=a.ue_err,h;if(f&&(D(b),C&&"ul"===c&&r))try{r[F+a.ue.oid]=b}catch(k){}M?J(b):a.ue.log&&(h=g.chrome&&"ul"==c,a.ue.log(b,"uedata",a.ue_svi?{n:1,img:!d&&h?1:0}:{n:1}),a.ue.ielf.push(b));l&&!l.ts&&l.startTimer();
K(c,e);C&&f&&"ld"===c&&N(F,function(a){a&&a.length&&(a+="&csmtags=was-recoverered");D(a)})}}function v(b){if(!ue.collected){var c=b.timing,e=b.navigation,d=ue.t;c&&(d.na_=c.navigationStart,d.ul_=c.unloadEventStart,d._ul=c.unloadEventEnd,d.rd_=c.redirectStart,d._rd=c.redirectEnd,d.fe_=c.fetchStart,d.lk_=c.domainLookupStart,d._lk=c.domainLookupEnd,d.co_=c.connectStart,d._co=c.connectEnd,d.sc_=c.secureConnectionStart,d.rq_=c.requestStart,d.rs_=c.responseStart,d._rs=c.responseEnd,d.dl_=c.domLoading,d.di_=
c.domInteractive,d.de_=c.domContentLoadedEventStart,d._de=c.domContentLoadedEventEnd,d._dc=c.domComplete,d.ld_=c.loadEventStart,d._ld=c.loadEventEnd,c=d.na_,b="function"!==typeof b.now||q(c)?0:new Date(c+b.now())-new Date,d.ntd=b+a.ue.t0);e&&(d.ty=e.type+a.ue.t0,d.rc=e.redirectCount+a.ue.t0);ue.collected=1}}function s(b){var c=n&&n.navigation?n.navigation.type:y,d=c&&2!=c,e=a.ue.bfini;a.ue.cfa2||(e&&1<e&&(b+="&bfform=1",d||(a.ue.isBFT=e-1)),2==c&&(b+="&bfnt=1",a.ue.isBFT=a.ue.isBFT||1),a.ue.ssw&&
a.ue.isBFT&&(q(a.ue.isNRBF)&&(c=a.ue.ssw(a.ue.oid),c.e||q(c.val)||(a.ue.isNRBF=1<c.val?0:1)),q(a.ue.isNRBF)||(b+="&nrbf="+a.ue.isNRBF)),a.ue.isBFT&&!a.ue.isNRBF&&(b+="&bft="+a.ue.isBFT));return b}if(b||q(c)){for(var m in c)c.hasOwnProperty(m)&&f(m,b,c[m]);t("pc",b,c);m=f("id",b)||a.ue.id;var d=a.ue.url+"?"+e+"&v="+a.ue.v+"&id="+m,B=f("ctb",b)||f("wb",b),n=g.performance||g.webkitPerformance,k,p;B&&(d+="&ctb="+B);1<a.ueinit&&(d+="&ic="+a.ueinit);!a.ue._fi||"at"!=e||b&&b!=m||(d+=a.ue._fi());if(!("ld"!=
e&&"ul"!=e||b&&b!=m)){if("ld"==e){try{g.onbeforeunload&&g.onbeforeunload.isUeh&&(g.onbeforeunload=null)}catch(A){}if(g.chrome)for(p=0;p<ue.ulh.length;p++)G("beforeunload",ue.ulh[p]);(p=x.ue_backdetect)&&p.ue_back&&p.ue_back.value++;a._uess&&(k=a._uess());a.ue.isl=1}ue._bf&&(d+="&bf="+ue._bf());a.ue_navtiming&&n&&n.timing&&(f("ctb",m,"1"),1==a.ue_navtiming&&t("tc",y,y,n.timing.navigationStart));n&&v(n);a.ue.t.hob=a.ue_hob;a.ue.t.hoe=a.ue_hoe;a.ue.ifr&&(d+="&ifr=1")}t(e,b,c);c="ld"==e&&b&&f("wb",b);
var w;c||b&&b!==m||O(b);c||m==a.ue.oid||P((f("t",b)||{}).tc||+f("t0",b),+f("t0",b));a.ue_mbl&&a.ue_mbl.cnt&&!c&&(d+=a.ue_mbl.cnt());c?f("wb",b,2):"ld"==e&&(u.lid=z(m));for(w in a.ue.sc)if(1==f("wb",w))break;if(c){if(a.ue.s)return;d=l(d,null)}else p=l(d,null),p!=d&&(p=s(p),a.ue.b=p),k&&(d+=k),d=l(d,b||a.ue.id);d=s(d);if(a.ue.b||c)for(w in a.ue.sc)2==f("wb",w)&&delete a.ue.sc[w];k=0;ue._rt&&(d+="&rt="+ue._rt());c||(a.ue.s=0,(k=a.ue_err)&&0<k.ec&&k.pec<k.ec&&(k.pec=k.ec,d+="&ec="+k.ec+"&ecf="+k.ecf),
k=f("ctb",b),f("t",b,{}));d&&a.ue.tag&&0<a.ue.tag().length&&(d+="&csmtags="+a.ue.tag().join("|"),a.ue.tag=a.ue.tagC());d&&a.ue.viz&&0<a.ue.viz.length&&(d+="&viz="+a.ue.viz.join("|"),a.ue.viz=[]);d&&!q(a.ue_pty)&&(d+="&pty="+a.ue_pty+"&spty="+a.ue_spty+"&pti="+a.ue_pti);d&&a.ue.tabid&&(d+="&tid="+a.ue.tabid);d&&a.ue.aftb&&(d+="&aftb=1");d&&a.ue.sbf&&(d+="&sbf=1");!a.ue._ui||b&&b!=m||(d+=a.ue._ui());a.ue.a=d;h(d,e,k,c)}}function O(a){var b=g.ue_csm_markers||{},c;for(c in b)b.hasOwnProperty(c)&&t(c,
a,y,b[c])}function v(a,b,c){c=c||g;c.addEventListener?c.addEventListener(a,b,!!window.ue_clf):c.attachEvent&&c.attachEvent("on"+a,b)}function G(a,b,c){c=c||g;c.removeEventListener?c.removeEventListener(a,b,!!window.ue_clf):c.detachEvent&&c.detachEvent("on"+a,b)}function H(){function e(){a.onUl()}function b(a){return function(){c[a]||(c[a]=1,E(a))}}var c=a.ue.r,f,q;a.onLd=b("ld");a.onLdEnd=b("ld");a.onUl=b("ul");f={stop:b("os")};g.chrome?(v("beforeunload",e),ue.ulh.push(e)):f[Q]=a.onUl;for(q in f)f.hasOwnProperty(q)&&
A(0,g,q,f[q]);a.ue_viz&&ue_viz();R&&v("readystatechange",S,x);v("load",a.onLd);t("ue")}function S(){"complete"===x.readyState&&(T?setTimeout(I,0):I())}function I(){var e;if(!(e=ue.isl)&&(e=U))a:{e=x.images||[];for(var b=0;b<e.length;b++)if(!1===e[b].complete){e=!1;break a}e=!0}if(!e)a.onUl()}function P(e,b){a.ue_mbl&&a.ue_mbl.ajax&&a.ue_mbl.ajax(e,b);a.ue.tag("ajax-transition")}function N(a,b){if(r)try{for(var c=0;c<r.length;c++){var f=r.key(c);0===f.indexOf(a)&&(b(r[f]),r.removeItem(f))}}catch(g){}}
a.ueinit=(a.ueinit||0)+1;var u={t0:g.aPageStart||a.ue_t0,id:a.ue_id,url:a.ue_url,rid:a.ue_id,a:"",b:"",h:{},r:{ld:0,oe:0,ul:0},s:1,t:{},sc:{},iel:[],ielf:[],fc_idx:{},viz:[],v:"0.200010.0",d:a.ue&&a.ue.d,log:a.ue&&a.ue.log,clog:a.ue&&a.ue.clog,onflush:a.ue&&a.ue.onflush,onunload:a.ue&&a.ue.onunload,stub:a.ue&&a.ue.stub,lr:a.ue&&a.ue.lr,exec:a.ue&&a.ue.exec,event:a.ue&&a.ue.event,onSushiUnload:a.ue&&a.ue.onSushiUnload,onSushiFlush:a.ue&&a.ue.onSushiFlush,ulh:[],cfa2:0},M=a.ue_fpf?1:0,C=1===a.ue_sspb,
s;if(s=C)a:{try{s=g.sessionStorage;break a}catch(V){}s=void 0}var r=s,F="csmpb-",R=1===a.ue_rsc||3===a.ue_rsc,T=3===a.ue_rsc,U=1===a.ue_rsc,Q="beforeunload",y;u.oid=z(u.id);u.lid=z(u.id);a.ue=u;a.ue._t0=a.ue.t0;a.ue.tagC=function(){var a={};return function(b){b&&(a[b]=1);b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b}};a.ue.tag=a.ue.tagC();a.ue.ifr=g.top!==g.self||g.frameElement?1:0;ue.attach=v;ue.detach=G;ue.reset=function(e,b){e&&(a.ue_cel&&a.ue_cel.reset(),a.ue.t0=+new Date,a.ue.rid=
e,a.ue.id=e,a.ue.fc_idx={},a.ue.viz=[])};a.uei=H;a.ueh=A;a.ues=f;a.uet=t;a.uex=E;H()})(ue_csm,window,ue_csm.document);
ue.stub(ue,"event");ue.stub(ue,"onSushiUnload");ue.stub(ue,"onSushiFlush");
ue.stub(ue,"log");ue.stub(ue,"onunload");ue.stub(ue,"onflush");
(function(b){var a=b.ue;a.cv={};a.cv.scopes={};a.count=function(c,b,d){var e={},f=a.cv;e.counter=c;e.value=b;e.t=a.d();d&&d.scope&&(f=a.cv.scopes[d.scope]=a.cv.scopes[d.scope]||{},e.scope=d.scope);if(void 0===b)return f[c];f[c]=b;c=0;d&&d.bf&&(c=1);a.clog&&0===c?a.clog(e,"csmcount",{bf:c}):a.log&&a.log(e,"csmcount",{c:1,bf:c})};a.count("baselineCounter2",1);a&&a.event&&(a.event({requestId:b.ue_id||"rid",server:b.ue_sn||"sn",obfuscatedMarketplaceId:b.ue_mid||"mid"},"csm","csm.CSMBaselineEvent.4"),
a.count("nexusBaselineCounter",1,{bf:1}))})(ue_csm);
var ue_hoe = +new Date();
</script>
<!-- 1jes4rmwimxxvf4cuirw6r6xs0ruswaobn1o1istp26 --><!-- sp:feature:aui-assets -->
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/51Evq4eMXsL._RC|01-yf03D4rL.css,01gq5Ie9j3L.css,31stfprY0tL.css,01d8Fs5iBdL.css,21ZwnZnTQ7L.css,11UksSmDw-L.css,11+zKfQDbkL.css,21quTPIGBxL.css,01jkimhv0aL.css,310yHWaTVRL.css,01COiFb05sL.css,01djTkqmZSL.css,11pdOHTh95L.css,21g9AOmZB5L.css,11X2-nh0PYL.css,01h2e2BEitL.css,110Q3MAjYJL.css,11aMMTVEKqL.css,11oyQ9RIYtL.css,01vd5lqeZUL.css,31VU7Pt5U6L.css,01kPgnKe7wL.css,11mmd1QliNL.css,01Alnvtt1zL.css,01BBs40O5ZL.css_.css?AUIClients/AmazonUI#mobile.us.not-trident">
<script>
(function(g,h,L,la){function B(a){t&&t.tag&&t.tag(q(":","aui",a))}function u(a,b){t&&t.count&&t.count("aui:"+a,0===b?0:b||(t.count("aui:"+a)||0)+1)}function p(a){try{return a.test(navigator.userAgent)}catch(b){return!1}}function w(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)}function q(a,b,c,e){b=b&&c?b+a+c:b||c;return e?q(a,b,e):b}function C(a,b,c){try{Object.defineProperty(a,b,{value:c,writable:!1})}catch(e){a[b]=c}return c}function M(){return setTimeout(W,
0)}function ma(a,b){var c=a.length,e=c,f=function(){e--||(N.push(b),O||(M(),O=!0))};for(f();c--;)X[a[c]]?f():(x[a[c]]=x[a[c]]||[]).push(f)}function na(a,b,c,e,f){var d=h.createElement(a?"script":"link");w(d,"error",e);f&&w(d,"load",f);if(a){d.type="text/javascript";d.async=!0;if(a=c)a=-1!==b.indexOf("images/I")||/AUIClients/.test(b);a&&d.setAttribute("crossorigin","anonymous");d.src=b}else d.rel="stylesheet",d.href=b;h.getElementsByTagName("head")[0].appendChild(d)}function Y(a,b){function c(c,e){function f(){na(b,
c,h,function(b){!D&&h?(h=!1,u("resource_retry"),f()):(u("resource_error"),a.log("Asset failed to load: "+c,D?"WARN":void 0));b&&b.stopPropagation?b.stopPropagation():g.event&&(g.event.cancelBubble=!0)},e)}if(Z[c])return!1;Z[c]=!0;u("resource_count");var h=!0;return!f()}if(b){var e=0,f=0;c.andConfirm=function(a,b){return c(a,function(){e++;b&&b.apply(this,arguments)})};c.confirm=function(){f++};c.getCsriCounters=function(){return{reqs:e,full:f}}}return c}function oa(a,b,c){for(var e={name:a,guard:function(c){return b.guardFatal(a,
c)},logError:function(c,d,e){b.logError(c,d,e,a)}},f=[],d=0;d<c.length;d++)E.hasOwnProperty(c[d])&&(f[d]=P.hasOwnProperty(c[d])?P[c[d]](E[c[d]],e):E[c[d]]);return f}function y(a,b,c,e,f){return function(d,h){function l(){var a=null;e?a=h:"function"===typeof h&&(p.start=z(),a=h.apply(g,oa(d,k,m)),p.end=z());if(b){E[d]=a;a=d;for(X[a]=!0;(x[a]||[]).length;)x[a].shift()();delete x[a]}p.done=!0}var k=f||this;"function"===typeof d&&(h=d,d=void 0);b&&(d=(d||"__NONAME__").replace(/^prv:/,""),Q.hasOwnProperty(d)&&
k.error(q(", reregistered by ",q(" by ",d+" already registered",Q[d]),k.attribution),d),Q[d]=k.attribution);for(var m=[],n=0;n<a.length;n++)m[n]=a[n].replace(/^prv:/,"");var p=aa[d||"anon"+ ++pa]={depend:m,registered:z(),namespace:k.namespace};c?l():ma(m,k.guardFatal(d,l));return{decorate:function(a){P[d]=k.guardFatal(d,a)}}}}function ba(a){return function(){var b=Array.prototype.slice.call(arguments);return{execute:y(b,!1,a,!1,this),register:y(b,!0,a,!1,this)}}}function R(a,b){return function(c,
e){e||(e=c,c=void 0);var f=this.attribution;return function(){v.push(b||{attribution:f,name:c,logLevel:a});var d=e.apply(this,arguments);v.pop();return d}}}function F(a,b){this.load={js:Y(this,!0),css:Y(this)};C(this,"namespace",b);C(this,"attribution",a)}function ca(){h.body?n.trigger("a-bodyBegin"):setTimeout(ca,20)}function A(a,b){if(b){for(var c=a.className.split(" "),e=c.length;e--;)if(c[e]===b)return;a.className+=" "+b}}function da(a,b){for(var c=a.className.split(" "),e=[],f;void 0!==(f=c.pop());)f&&
f!==b&&e.push(f);a.className=e.join(" ")}function ea(a){try{return a()}catch(b){return!1}}function G(){if(H){var a=g.innerWidth?{w:g.innerWidth,h:g.innerHeight}:{w:k.clientWidth,h:k.clientHeight};5<Math.abs(a.w-S.w)||50<a.h-S.h?(S=a,I=4,(a=l.mobile||l.tablet?450<a.w&&a.w>a.h:1250<=a.w)?A(k,"a-ws"):da(k,"a-ws")):0<I&&(I--,fa=setTimeout(G,16))}}function qa(a){(H=void 0===a?!H:!!a)&&G()}function ra(){return H}"use strict";var J=L.now=L.now||function(){return+new L},z=function(a){return a&&a.now?a.now.bind(a):
J}(g.performance);la=z();var r=g.AmazonUIPageJS||g.P;if(r&&r.when&&r.register)throw Error("A copy of P has already been loaded on this page.");var t=g.ue;B();B("aui_build_date:3.18.2-2018-02-15");var N=[],O=!1,W;W=function(){for(var a=M(),b=J();N.length;)if(N.shift()(),50<J()-b)return;clearTimeout(a);O=!1};p(/OS 6_[0-9]+ like Mac OS X/i)&&w(g,"scroll",M);var X={},x={},Z={},D=!1;w(g,"beforeunload",function(){D=!0;setTimeout(function(){D=!1},1E4)});var Q={},E={},P={},aa={},pa=0,T,v=[],ga=g.onerror;
g.onerror=function(a,b,c,e,f){f&&"object"===typeof f||(f=Error(a,b,c),f.columnNumber=e,f.stack=b||c||e?q(String.fromCharCode(92),f.message,"at "+q(":",b,c,e)):void 0);var d=v.pop()||{};f.attribution=q(":",f.attribution||d.attribution,d.name);f.logLevel=d.logLevel;f.attribution&&console&&console.log&&console.log([f.logLevel||"ERROR",a,"thrown by",f.attribution].join(" "));v=[];ga&&(d=[].slice.call(arguments),d[4]=f,ga.apply(g,d))};F.prototype={logError:function(a,b,c,e){b={message:b,logLevel:c||"ERROR",
attribution:q(":",this.attribution,e)};if(g.ueLogError)return g.ueLogError(a||b,a?b:null),!0;console&&console.error&&(console.log(b),console.error(a));return!1},error:function(a,b,c,e){a=Error(q(":",e,a,c));a.attribution=q(":",this.attribution,b);throw a;},guardError:R(),guardFatal:R("FATAL"),guardCurrent:function(a){var b=v[v.length-1];return b?R(b.logLevel,b).call(this,a):a},log:function(a,b,c){return this.logError(null,a,b,c)},declare:y([],!0,!0,!0),register:y([],!0),execute:y([]),AUI_BUILD_DATE:"3.18.2-2018-02-15",
when:ba(),now:ba(!0),trigger:function(a,b,c){var e=J();this.declare(a,{data:b,pageElapsedTime:e-(g.aPageStart||NaN),triggerTime:e});c&&c.instrument&&T.when("prv:a-logTrigger").execute(function(b){b(a)})},handleTriggers:function(){this.log("handleTriggers deprecated")},attributeErrors:function(a){return new F(a)},_namespace:function(a,b){return new F(a,b)}};var n=C(g,"AmazonUIPageJS",new F);T=n._namespace("PageJS","AmazonUI");T.declare("prv:p-debug",aa);n.declare("p-recorder-events",[]);n.declare("p-recorder-stop",
function(){});C(g,"P",n);ca();if(h.addEventListener){var ha;h.addEventListener("DOMContentLoaded",ha=function(){n.trigger("a-domready");h.removeEventListener("DOMContentLoaded",ha,!1)},!1)}var k=h.documentElement,U=function(){var a=["O","ms","Moz","Webkit"],b=h.createElement("div");return{testGradients:function(){b.style.cssText=("background-image:-webkit-gradient(linear,left top,right bottom,from(#9f9),to(white));background-image:"+a.join("linear-gradient(left top,#9f9, white);background-image:")).slice(0,
-17);return-1<b.style.backgroundImage.indexOf("gradient")},test:function(c){var e=c.charAt(0).toUpperCase()+c.substr(1);c=(a.join(e+" ")+e+" "+c).split(" ");for(e=c.length;e--;)if(""===b.style[c[e]])return!0;return!1},testTransform3d:function(){var a=!1;g.matchMedia&&(a=g.matchMedia("(-webkit-transform-3d)").matches);return a}}}(),r=k.className,ia=/(^| )a-mobile( |$)/.test(r),ja=/(^| )a-tablet( |$)/.test(r),l={audio:function(){return!!h.createElement("audio").canPlayType},video:function(){return!!h.createElement("video").canPlayType},
canvas:function(){return!!h.createElement("canvas").getContext},svg:function(){return!!h.createElementNS&&!!h.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect},offline:function(){return navigator.hasOwnProperty&&navigator.hasOwnProperty("onLine")&&navigator.onLine},dragDrop:function(){return"draggable"in h.createElement("span")},geolocation:function(){return!!navigator.geolocation},history:function(){return!(!g.history||!g.history.pushState)},webworker:function(){return!!g.Worker},
autofocus:function(){return"autofocus"in h.createElement("input")},inputPlaceholder:function(){return"placeholder"in h.createElement("input")},textareaPlaceholder:function(){return"placeholder"in h.createElement("textarea")},localStorage:function(){return"localStorage"in g&&null!==g.localStorage},orientation:function(){return"orientation"in g},touch:function(){return"ontouchend"in h},gradients:function(){return U.testGradients()},hires:function(){var a=g.devicePixelRatio&&1.5<=g.devicePixelRatio||
g.matchMedia&&g.matchMedia("(min-resolution:144dpi)").matches;u("hiRes"+(ia?"Mobile":ja?"Tablet":"Desktop"),a?1:0);return a},transform3d:function(){return U.testTransform3d()},touchScrolling:function(){return p(/Windowshop|android.([3-9]|[L-Z])|OS ([5-9]|[1-9][0-9]+)(_[0-9]{1,2})+ like Mac OS X|Chrome|Silk|Firefox|Trident.+?; Touch/i)},ios:function(){return p(/OS [1-9][0-9]*(_[0-9]*)+ like Mac OS X/i)&&!p(/trident|Edge/i)},android:function(){return p(/android.([1-9]|[L-Z])/i)&&!p(/trident|Edge/i)},
mobile:function(){return ia},tablet:function(){return ja}},m;for(m in l)l.hasOwnProperty(m)&&(l[m]=ea(l[m]));for(var V="textShadow textStroke boxShadow borderRadius borderImage opacity transform transition".split(" "),K=0;K<V.length;K++)l[V[K]]=ea(function(){return U.test(V[K])});var H=!0,fa=0,S={w:0,h:0},I=4;G();w(g,"resize",function(){clearTimeout(fa);I=4;G()});var ka={getItem:function(a){try{return g.localStorage.getItem(a)}catch(b){}},setItem:function(a,b){try{return g.localStorage.setItem(a,
b)}catch(c){}}};da(k,"a-no-js");A(k,"a-js");!p(/OS [1-8](_[0-9]*)+ like Mac OS X/i)||g.navigator.standalone||p(/safari/i)||A(k,"a-ember");r=[];for(m in l)l.hasOwnProperty(m)&&l[m]&&r.push("a-"+m.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()}));A(k,r.join(" "));k.setAttribute("data-aui-build-date","3.18.2-2018-02-15");n.register("p-detect",function(){return{capabilities:l,localStorage:l.localStorage&&ka,toggleResponsiveGrid:qa,responsiveGridEnabled:ra}});p(/UCBrowser/i)||l.localStorage&&
A(k,ka.getItem("a-font-class"));n.declare("a-event-revised-handling",!1);(m=navigator.serviceWorker)&&m.getRegistrations?(B("sw:unregister:supported"),m.getRegistrations().then(function(a){a.forEach(function(a){a.unregister().then(function(a){u("sw:unregister:success")}).catch(function(a){u("sw:unregister:failure");n.logError(a,"[AUI SW] Failed to unregister service worker:")})})})):B("sw:unregister:unsupported");n.declare("a-fix-event-off",!1);u("pagejs:pkgExecTime",z()-NaN)})(window,document,Date);
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('sp.load.js').execute(function() {
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/61ea4y7yPdL._RC|11IYhapguOL.js,61-dJ29Zw5L.js,21dmoxZTACL.js,01E8f3KV-NL.js,31fv8bqHLoL.js,31ReKJl2X6L.js,51nK0kUyg2L.js,11Mdh5CVmhL.js,01xMsWWFUQL.js,11KkQiUpBPL.js,113pP0Sfh0L.js,21auxuI+dRL.js,01PoLXBDXWL.js,61x-Yxr2raL.js,318CMPRminL.js,11SW3HEKjtL.js,01qkmZhGmAL.js,01jUS+y5YWL.js_.js?AUIClients/AmazonUI#mobile');
});
</script>
<!-- sp:feature:nav-inline-css -->
<style>.nav-sprite-v3 .nav-sprite {
background-image: url(https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-1x_blueheaven._CB487546343_.png);
background-repeat: no-repeat;
}
.nav-spinner {
background-image: url(https://images-na.ssl-images-amazon.com/images/G/01/javascripts/lib/popover/images/snake._CB192571611_.gif);
}
</style><!-- -->
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/51eqcQuA8YL._RC|31H9QnSNj3L.css,01+72+wCC9L.css_.css?AUIClients/NavMobileMetaAsset#mobile">
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/21EugTBba7L.css?AUIClients/RetailSearchAutocompleteAssets#mobile">
<!-- sp:feature:host-assets -->
<!-- htmlBeginMarker -->
<link rel="dns-prefetch" href="//images-na.ssl-images-amazon.com">
<script type="text/javascript">
var CSMReqs={af:{c:2,p:'atf'},cf:{c:2,p:'cf'}};
var DPTimestamps={mainImgRepl:{c:1}};
var setCSMReq = function(a){
a=a.toLowerCase();
var b=CSMReqs[a];
if(--b.c==0){
if(typeof b.f == 'function'){
b.f();
}
else{
if(typeof
uet=='function'){uet(a);};
if(typeof P !=
'undefined'){P.register(b.p);};
}
}
}
var setDPTimestamp = function(a, t){
var b=DPTimestamps[a];
var w = window;
if(b && --b.c===0){
if (w.ue && typeof w.ue_t0 !== 'undefined' && typeof w.ue.count==='function') {
w.ue.count(a, Date.now()-w.ue_t0);
if(t && w.ue && w.ue.tag) {w.ue.tag(t);}
}
}
}
var addlongPoleTag = function(marker,customtag){
marker=marker.toLowerCase();
var b=CSMReqs[marker];
if(b.c==0){
if(window.ue && ue.tag) {ue.tag(customtag);}
}
}
</script>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;detail-page-device-type&quot;}">{"deviceType":"mobile"}</script>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;metrics-schema&quot;}">{"widgetSchema":"dp:widget:","dimensionSchema":"dp:dims:"}</script>
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/01ekIXTj5kL._RC|01j62IBqyaL.css,41wvsvL+sxL.css,31QLjTiBtrL.css,31ZYydvXTIL.css,11tkAOwE6OL.css,21xItms32EL.css,11q7D6YoQCL.css,018pZJ+Ms7L.css,21t5UAtA4iL.css,21mvSipn7pL.css,41Fasit8zhL.css,21QwDiO8ycL.css,01IHzhAZ28L.css,31no24Dqj1L.css,01wBE2Z+USL.css,11xlykx3aFL.css,01D-B-OeNDL.css,21CNSKZ67ML.css,11rhPo030XL.css,11zgKVdkIJL.css,51oAYplAOyL.css,21rUBtRF7wL.css,21lDMA2J74L.css,31AXqefcH0L.css,21thLxrpr2L.css,11P7nJr8UuL.css,012dCODns-L.css,11oH9gtOgDL.css,21ZKosCj0iL.css,313bzSzzhRL.css,21-9Q-rNd0L.css,01rgQ3jqo7L.css,01XzaDG7OBL.css,21Df5N8kF4L.css,61sSErmOJTL.css,014Z+MbaRaL.css,11hxZgqF80L.css,01QUs5FVXoL.css,016xTzXJLfL.css,31LBzl8T3vL.css,21DFs8eEV-L.css,11cAYJlTEgL.css,018mGORJ7tL.css,11fvu+DzMxL.css,11iDQvZvByL.css,01ticFfm7pL.css,01lh9w-GYYL.css,31UsSdSPS1L.css,01WKGP3G+gL.css,11Mso4bvY-L.css,01LCsoCesOL.css,11kkkHiWcRL.css,010kw0xkZfL.css,21M+Dg4s3dL.css,11qL99m7IWL.css_.css?AUIClients/DetailPageMobileWebMetaAsset#mobile.us.not-trident.130884-T1.121035-T1.128615-T1.133998-T1.133996-T1.113788-C.93121-T1.126720-T1.114362-T1.119597-T1.111960-T1.103671-T2.118535-T1.107067-T2.53691-T1.118886-T1.110554-T1.123375-T1.108941-T1.123873-T1.114779-T1.120067-T1.123880-T1.123881-T1.106820-T1.121807-T1.101955-T1.111760-T1.111763-T1.108310-T1.115439-T1.56891-T1.108343-T1.108344-T1.109378-T1.83029-T1.131720-T1">
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/11dUpTq5MCL._RC|11WDAK9GiRL.css,41egHtU1mNL.css_.css?AUIClients/DetailPageEbookMobileWebMetaAsset#mobile.not-trident">
<script type="text/javascript"> (typeof uet === 'function') && uet("x3") </script><style type="text/css">
#wow-twister-spinner {
background: url("https://images-na.ssl-images-amazon.com/images/G/01/amazonui/loading/loading-4x._V1_.gif") 50% 50% no-repeat;
}
#wow-twister-loading-dim {
background: url("https://images-na.ssl-images-amazon.com/images/G/01/amazonui/loading/loading-4x._V1_.gif") center center no-repeat;
}
</style><script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('atf').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/11Muzrhwo6L._RC|41ecatjAVfL.js,31cePTj3CrL.js,11AncM+ZunL.js,31hW3BxWLXL.js,21rOwfZB9SL.js,3118lZR+khL.js,516Cu4vSzCL.js,51Hi2VfLU+L.js,21yUMfZsKLL.js,31CyVESxcFL.js,016DBHJkIYL.js,21GuNBYH4BL.js,51WIGchpq5L.js,818Z3w8jMsL.js,21hyeuTdJ9L.js,01H0TE47EIL.js,013NxCyC-FL.js,11QIUl6VLbL.js,21jBAndZe0L.js,51YzCqyJFIL.js,0111g0cQvbL.js,01nKqcvaCIL.js,01X117Z9PgL.js,51GV9EHW+bL.js,01X5C8pWB1L.js,518iKhtj8UL.js,11sP283FW3L.js,21333KksJEL.js,31egXBuM55L.js,01RHiyjONOL.js,31CFyyZ6O-L.js,21aKFsvQBHL.js,51ryEHyLJ5L.js,314ZAgS3sJL.js,11bXLfk2j0L.js,31AnMfsNpuL.js,01q0JZaOPlL.js,116kAgu6ebL.js,31ze7I-RWjL.js,21q3UdjiveL.js,21HlHGr1+aL.js,0193uyIciNL.js,01DShqNIDKL.js,51NhK1niNZL.js,71FaatbojhL.js,01BZK417f8L.js,319kjuuQkzL.js,21mtabjvdBL.js,41yLu0U-ZDL.js,21e16+5SkdL.js,11NHZnHlFmL.js,21CbPMxfA+L.js,015J4NGaO3L.js,11B4fwZPeqL.js,21-q-ofQTaL.js,01cY00OaNgL.js,01jqyAujTwL.js,01KcbtwkAOL.js,01-XJ1YSEXL.js,113LFYzRWdL.js,01NAT+3p7KL.js,111vgqp2a0L.js,51GfggKdyCL.js,01MZJG6lH8L.js,01VtYReatCL.js,31P9rtuG-7L.js,01mL-cPJ2YL.js,01RQtSMdG+L.js,21iHrbWUPtL.js,013tU+A3QIL.js,41qfJxctTDL.js,01tk785UcvL.js,01l3c7okxRL.js,21lP+A1Np8L.js,01qwoVEkKlL.js,011HXD1ky3L.js,011X+p22ALL.js,01k57x9vvBL.js,01RNXZDiBuL.js,01ZF+ovNflL.js,31baJE6Ao6L.js,01S8y9NkxoL.js,41IRD+TgfRL.js,11ECelPydPL.js,01tJd4+VUOL.js,51-wBjbbYrL.js,410QCZl6RQL.js,01y-5aCXJyL.js,01rg6Ce9FhL.js_.js?AUIClients/DetailPageMobileWebMetaAsset#mobile.us.130884-T1.121035-T1.128615-T1.133998-T1.133996-T1.132705-T1.93121-T1.89963-T1.126720-T1.114362-T1.71277-T1.111960-T1.112610-T1.118535-T1.107067-T2.103593-C.53691-T1.123375-T1.108941-T1.123873-T1.114779-T1.120067-T1.123880-T1.123881-T1.122564-T1.99301-T1.106820-T1.121807-T1.101955-T1.103391-T1.111760-T1.111763-T1.135995-T1.108310-T1.105170-T2.107686-T1.108343-T1.108344-T1.109378-T1.123718-T1.87019-T1.83029-T1.100976-T1.131720-T1');
});
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('goldboxDealDetailPage').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/81pPtFtJAnL.js?AUIClients/GoldboxUDPAssets');
});
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('atf').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/31xCSJIY%2BCL._RC|31drGM5YkmL.js,11nHpUmNCjL.js_.js?AUIClients/DetailPageEbookMobileWebMetaAsset#mobile');
});
</script>
<script type="text/javascript">
P.when('atf').register('sp.load.js');
P.when('A', 'a-touch').execute(function(A, aTouch){
var $ = A.$;
A.on('a:popover:beforeSlideOut', function(){
$(document).bind('click.a-secondary-view-block', function(e){
e.preventDefault();
e.stopImmediatePropagation();
A.delay(function(){
$(document).unbind('click.a-secondary-view-block');
}, 600);
});
A.delay(function(){
$(document).unbind('click.a-secondary-view-block');
}, 2000);
});
});
</script><meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<link rel="canonical" href="https://www.amazon.com/Seven-Languages-Weeks-Programming-Programmers-ebook/dp/B00AYQNR46">
<meta name="description" content="Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers) - Kindle edition by Bruce Tate. Download it once and read it on your Kindle device, PC, phones or tablets. Use features like bookmarks, note taking and highlighting while reading Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers).">
<meta name="title" content="Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers) 1, Bruce Tate, eBook - Amazon.com">
<meta name="keywords" content="ebook,Bruce Tate,Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers),Pragmatic Bookshelf,Software Development &amp; Engineering - General,Computer Books: General,Computers,Computers - Languages / Programming,Computers / Programming Languages / General,Computers / Software Development &amp; Engineering / General,Computing: Professional &amp; Programming,Programming &amp; scripting languages: general,Programming languages (Electronic computers),Programming languages.,Software Development,Software Development &amp; Engineering - General,Software Engineering,Computers / Programming Languages / General,Computers / Software Development &amp; Engineering / General,Computers / Programming Languages / General,Computers / Software Development &amp; Engineering / General,Computers - Languages / Programming,Software Development,Computers,Computer Books: General,Computing: Professional &amp; Programming,Programming &amp; scripting languages: general">
<title>Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers) 1, Bruce Tate, eBook - Amazon.com</title>
<!--&&&Portal&Delimiter&&&--><!-- sp:end-feature:host-assets -->
<script type="text/javascript">
(function(e,c){function h(b,a){f.push([b,a])}function g(b,a){if(b){var c=e.head||e.getElementsByTagName("head")[0]||e.documentElement,d=e.createElement("script");d.async="async";d.src=b;d.setAttribute("crossorigin","anonymous");a&&a.onerror&&(d.onerror=a.onerror);a&&a.onload&&(d.onload=a.onload);c.insertBefore(d,c.firstChild)}}function k(){ue.uels=g;for(var b=0;b<f.length;b++){var a=f[b];g(a[0],a[1])}ue.deffered=1}var f=[];c.ue&&(ue.uels=h,c.ue.attach&&c.ue.attach("load",k))})(document,window);
(function(a){var b=a.alert;window.alert=function(){a.ueLogError&&a.ueLogError({message:"[CSM] Alert invocation detected with argument: "+arguments[0],logLevel:"WARN"});Function.prototype.apply.apply(b,[a,arguments||[]])}})(window);
(function(k,l,g){function m(a){c||(c=b[a.type].id,"undefined"===typeof a.clientX?(e=a.pageX,f=a.pageY):(e=a.clientX,f=a.clientY),2!=c||h&&(h!=e||n!=f)?(r(),d.isl&&l.setTimeout(function(){p("at",d.id)},0)):(h=e,n=f,c=0))}function r(){for(var a in b)b.hasOwnProperty(a)&&d.detach(a,m,b[a].parent)}function s(){for(var a in b)b.hasOwnProperty(a)&&d.attach(a,m,b[a].parent)}function t(){var a="";!q&&c&&(q=1,a+="&ui="+c);return a}var d=k.ue,p=k.uex,q=0,c=0,h,n,e,f,b={click:{id:1,parent:g},mousemove:{id:2,
parent:g},scroll:{id:3,parent:l},keydown:{id:4,parent:g}};d&&p&&(s(),d._ui=t)})(ue_csm,window,document);
if (window.ue && window.ue.uels) {
var cel_widgets = [ { "c":"celwidget" },{ "c":"feature" } ];
ue.uels("https://images-na.ssl-images-amazon.com/images/G/01/AUIClients/ClientSideMetricsAUIJavascript-96ea10f95c9c40ac3d7cc81f2d76b78f0fdf178b._V2_.js");
}
(function(k,c){function l(a,b){return a.filter(function(a){return a.initiatorType==b})}function f(a,c){if(b.t[a]){var g=b.t[a]-b._t0,e=c.filter(function(a){return 0!==a.responseEnd&&m(a)<g}),f=l(e,"script"),h=l(e,"link"),k=l(e,"img"),n=e.map(function(a){return a.name.split("/")[2]}).filter(function(a,b,c){return a&&c.lastIndexOf(a)==b}),q=e.filter(function(a){return a.duration<p}),s=g-Math.max.apply(null,e.map(m))<r|0;"af"==a&&(b._afjs=f.length);return a+":"+[e[d],f[d],h[d],k[d],n[d],q[d],s].join("-")}}
function m(a){return a.responseEnd-(b._t0-c.timing.navigationStart)}function n(){var a=c[h]("resource"),d=f("cf",a),g=f("af",a),a=f("ld",a);delete b._rt;b._ld=b.t.ld-b._t0;b._art&&b._art();return[d,g,a].join("_")}var p=20,r=50,d="length",b=k.ue,h="getEntriesByType";b._rre=m;b._rt=c&&c.timing&&c[h]&&n})(ue_csm,window.performance);
(function(m,d){function c(b){b="";var c=a.isBFT?"b":"s",d=""+a.oid,f=""+a.lid,g=d;d!=f&&20==f.length&&(c+="a",g+="-"+f);a.tabid&&(b=a.tabid+"+");b+=c+"-"+g;b!=e&&100>b.length&&(e=b,a.cookie?a.cookie.updateCsmHit(n,b+("|"+ +new Date),h):document.cookie="csm-hit="+b+("|"+ +new Date)+p+"; path=/")}function q(){e=0}function k(b){!0===d[a.pageViz.propHid]?e=0:!1===d[a.pageViz.propHid]&&c({type:"visible"})}var h=new Date(+new Date+6048E5),p="; expires="+h.toGMTString(),n="tb",e,a=m.ue||{},l=a.pageViz&&
a.pageViz.event&&a.pageViz.propHid;a.attach&&(a.attach("click",c),a.attach("keyup",c),l||(a.attach("focus",c),a.attach("blur",q)),l&&(a.attach(a.pageViz.event,k,d),k({})));a.aftb=1})(ue_csm,document);
ue_csm.ue.stub(ue,"impression");
(function(k,d,h){function f(a,c,b){a&&a.indexOf&&0===a.indexOf("http")&&0!==a.indexOf("https")&&l(s,c,a,b)}function g(a,c,b){a&&a.indexOf&&(location.href.split("#")[0]!=a&&null!==a&&"undefined"!==typeof a||l(t,c,a,b))}function l(a,c,b,e){m[b]||(e=u&&e?n(e):"N/A",d.ueLogError&&d.ueLogError({message:a+c+" : "+b,logLevel:v,stack:"N/A"},{attribution:e}),m[b]=1,p++)}function e(a,c){if(a&&c)for(var b=0;b<a.length;b++)try{c(a[b])}catch(d){}}function q(){return d.performance&&d.performance.getEntriesByType?
d.performance.getEntriesByType("resource"):[]}function n(a){if(a.id)return"//*[@id='"+a.id+"']";var c;c=1;var b;for(b=a.previousSibling;b;b=b.previousSibling)b.nodeName==a.nodeName&&(c+=1);b=a.nodeName;1!=c&&(b+="["+c+"]");a.parentNode&&(b=n(a.parentNode)+"/"+b);return b}function w(){var a=h.images;a&&a.length&&e(a,function(a){var b=a.getAttribute("src");f(b,"img",a);g(b,"img",a)})}function x(){var a=h.scripts;a&&a.length&&e(a,function(a){var b=a.getAttribute("src");f(b,"script",a);g(b,"script",a)})}
function y(){var a=h.styleSheets;a&&a.length&&e(a,function(a){if(a=a.ownerNode){var b=a.getAttribute("href");f(b,"style",a);g(b,"style",a)}})}function z(){if(A){var a=q();e(a,function(a){f(a.name,a.initiatorType)})}}function B(){e(q(),function(a){g(a.name,a.initiatorType)})}function r(){var a;a=d.location&&d.location.protocol?d.location.protocol:void 0;"https:"==a&&(z(),w(),x(),y(),B(),p<C&&setTimeout(r,D))}var s="[CSM] Insecure content detected ",t="[CSM] Ajax request to same page detected ",v="WARN",
m={},p=0,D=k.ue_nsip||1E3,C=5,A=1==k.ue_urt,u=!0;ue_csm.ue_disableNonSecure||(d.performance&&d.performance.setResourceTimingBufferSize&&d.performance.setResourceTimingBufferSize(300),r())})(ue_csm,window,document);
(function(d){d.ue_cel_stub||(d.ue_cel_stub=function(){var b={};return{registerModule:function(a,c){b[a]||(b[a]=c,b[a].on())},replayModule:function(a,c){b[a]&&(b[a].replay(c),b[a].off(),delete b[a])}}}())})(ue_csm);
(function(a,d,h){a.ue_mcm_stub||a.ue&&a.ue.isBF||(a.ue_mcm_stub=function(){function e(k){var b=c.d(),e=(d.body||{}).scrollWidth,l=(d.body||{}).scrollHeight,f;a.ue_cdt&&h&&"function"===typeof h.now&&k.timeStamp&&(f=h.now()-k.timeStamp,f=parseFloat(f.toFixed(2)));g.push({rawEvent:k,additionalData:{ots:b,ow:e,oh:l,odt:f}})}var c=a.ue,g=[];return{on:function(){c.attach&&c.attach("click",e,d)},off:function(){c.detach&&c.detach("click",e,d)},replay:function(a){for(var b=0;b<g.length;b++)a(g[b].rawEvent,
g[b].additionalData)}}}(),a.ue_cel_stub&&a.ue_cel_stub.registerModule("mcm",a.ue_mcm_stub))})(ue_csm,document,window.performance);
if(window.ue&&uet) { uet('bb'); }
</script><!-- sp:feature:head-close -->
<script>
window.P && P.register('bb');
if (typeof ues === 'function') {
ues('t0', 'portal-bb', new Date());
ues('ctb', 'portal-bb', 1);
}
</script>
<style type="text/css">#centerCol.centerColumn{margin-left:NaNpx !important;}</style><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/11Muzrhwo6L._RC|41ecatjAVfL.js,31cePTj3CrL.js,11AncM+ZunL.js,31hW3BxWLXL.js,21rOwfZB9SL.js,3118lZR+khL.js,516Cu4vSzCL.js,51Hi2VfLU+L.js,21yUMfZsKLL.js,31CyVESxcFL.js,016DBHJkIYL.js,21GuNBYH4BL.js,51WIGchpq5L.js,818Z3w8jMsL.js,21hyeuTdJ9L.js,01H0TE47EIL.js,013NxCyC-FL.js,11QIUl6VLbL.js,21jBAndZe0L.js,51YzCqyJFIL.js,0111g0cQvbL.js,01nKqcvaCIL.js,01X117Z9PgL.js,51GV9EHW+bL.js,01X5C8pWB1L.js,518iKhtj8UL.js,11sP283FW3L.js,21333KksJEL.js,31egXBuM55L.js,01RHiyjONOL.js,31CFyyZ6O-L.js,21aKFsvQBHL.js,51ryEHyLJ5L.js,314ZAgS3sJL.js,11bXLfk2j0L.js,31AnMfsNpuL.js,01q0JZaOPlL.js,116kAgu6ebL.js,31ze7I-RWjL.js,21q3UdjiveL.js,21HlHGr1+aL.js,0193uyIciNL.js,01DShqNIDKL.js,51NhK1niNZL.js,71FaatbojhL.js,01BZK417f8L.js,319kjuuQkzL.js,21mtabjvdBL.js,41yLu0U-ZDL.js,21e16+5SkdL.js,11NHZnHlFmL.js,21CbPMxfA+L.js,015J4NGaO3L.js,11B4fwZPeqL.js,21-q-ofQTaL.js,01cY00OaNgL.js,01jqyAujTwL.js,01KcbtwkAOL.js,01-XJ1YSEXL.js,113LFYzRWdL.js,01NAT+3p7KL.js,111vgqp2a0L.js,51GfggKdyCL.js,01MZJG6lH8L.js,01VtYReatCL.js,31P9rtuG-7L.js,01mL-cPJ2YL.js,01RQtSMdG+L.js,21iHrbWUPtL.js,013tU+A3QIL.js,41qfJxctTDL.js,01tk785UcvL.js,01l3c7okxRL.js,21lP+A1Np8L.js,01qwoVEkKlL.js,011HXD1ky3L.js,011X+p22ALL.js,01k57x9vvBL.js,01RNXZDiBuL.js,01ZF+ovNflL.js,31baJE6Ao6L.js,01S8y9NkxoL.js,41IRD+TgfRL.js,11ECelPydPL.js,01tJd4+VUOL.js,51-wBjbbYrL.js,410QCZl6RQL.js,01y-5aCXJyL.js,01rg6Ce9FhL.js_.js?AUIClients/DetailPageMobileWebMetaAsset#mobile.us.130884-T1.121035-T1.128615-T1.133998-T1.133996-T1.132705-T1.93121-T1.89963-T1.126720-T1.114362-T1.71277-T1.111960-T1.112610-T1.118535-T1.107067-T2.103593-C.53691-T1.123375-T1.108941-T1.123873-T1.114779-T1.120067-T1.123880-T1.123881-T1.122564-T1.99301-T1.106820-T1.121807-T1.101955-T1.103391-T1.111760-T1.111763-T1.135995-T1.108310-T1.105170-T2.107686-T1.108343-T1.108344-T1.109378-T1.123718-T1.87019-T1.83029-T1.100976-T1.131720-T1"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/31xCSJIY%2BCL._RC|31drGM5YkmL.js,11nHpUmNCjL.js_.js?AUIClients/DetailPageEbookMobileWebMetaAsset#mobile"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/61ea4y7yPdL._RC|11IYhapguOL.js,61-dJ29Zw5L.js,21dmoxZTACL.js,01E8f3KV-NL.js,31fv8bqHLoL.js,31ReKJl2X6L.js,51nK0kUyg2L.js,11Mdh5CVmhL.js,01xMsWWFUQL.js,11KkQiUpBPL.js,113pP0Sfh0L.js,21auxuI+dRL.js,01PoLXBDXWL.js,61x-Yxr2raL.js,318CMPRminL.js,11SW3HEKjtL.js,01qkmZhGmAL.js,01jUS+y5YWL.js_.js?AUIClients/AmazonUI#mobile"></script><script type="text/javascript" async="" crossorigin="anonymous" charset="utf-8" src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/61BFFVGtFXL.js?AUIClients/Swiper_AUIBuild"></script><script type="text/javascript" async="" crossorigin="anonymous" charset="utf-8" src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/G/01/AUIClients/CustomerReviewsMedleyAssets-d22f4f962f932cc6922bccca8b5b14475c306dc6._V2_.js#AUIClients/CustomerReviewsMedleyAssets.device_type-mobile.secure.weblab-DP_PROFILE_REVIEWS_GENOME_WIDGET_INTEG_112957-T1.min"></script><script type="text/javascript" async="" crossorigin="anonymous" charset="utf-8" src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/51Kf5ub7vtL._RC|01eV4Oqoy5L.js,31a72IenKyL.js_.js?AUIClients/NavMobileMetaAsset"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/517%2B4eJ4RGL.js?AUIClients/RetailSearchAutocompleteAssets#mobile"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/11QXqf0G81L.js?AUIClients/RetailWebsiteOverlayAUIAssets"></script><style></style></head><!-- sp:feature:start-body -->
<body class="a-m-us a-aui_51744-c a-aui_57326-c a-aui_72554-c a-aui_accessibility_49860-c a-aui_attr_validations_1_51371-c a-aui_bolt_62845-c a-aui_ux_59374-c a-aui_ux_60000-c"><div id="a-page"><script type="a-state" data-a-state="{&quot;key&quot;:&quot;a-wlab-states&quot;}">{"AUI_51744":"C","AUI_57326":"C","AUI_72554":"C","AUI_ACCESSIBILITY_49860":"C","AUI_ATTR_VALIDATIONS_1_51371":"C","AUI_BOLT_62845":"C","AUI_UX_59374":"C","AUI_UX_60000":"C"}</script><script>typeof uex === 'function' && uex('ld', 'portal-bb', {wb: 1})</script>
<!-- sp:feature:nav-inline-js -->
<!-- From remote config v3-->
<script type="text/javascript">
(function(d){document.createElement("header");function b(e){return[].slice.call(e)}function c(f,e){return{m:f,a:b(e)}}var a=function(f){var g={};g._sourceName=f;g._replay=[];g.getNow=function(i,h){return h};function e(i,h,j){i[j]=function(){g._replay.push(h.concat(c(j,arguments)))}}g.when=function(){var i=[c("when",arguments)];var h={};e(h,i,"run");e(h,i,"declare");e(h,i,"publish");e(h,i,"build");return h};e(g,[],"declare");e(g,[],"build");e(g,[],"publish");e(g,[],"importEvent");a._shims.push(g);return g};a._shims=[];if(!d.$Nav){d.$Nav=a("rcx-nav")}if(!d.$Nav.make){d.$Nav.make=a}}(window));
$Nav.importEvent('navbarJS-mobile');
$Nav.declare('img.sprite', {
'png32': 'https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-1x_blueheaven._CB487546343_.png',
'png32-2x': 'https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-2x_blueheaven._CB487546343_.png'
});
window._navbarSpriteUrl = 'https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-1x_blueheaven._CB487546343_.png';
$Nav.declare('img.pixel', 'https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/transparent-pixel._CB386942464_.gif');
var nav_t_after_preload_JS = + new Date();
</script>
<img src="https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-1x_blueheaven._CB487546343_.png" style="display:none" alt="">
<!-- -->
<script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('navCF').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/51Kf5ub7vtL._RC|01eV4Oqoy5L.js,31a72IenKyL.js_.js?AUIClients/NavMobileMetaAsset');
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/517%2B4eJ4RGL.js?AUIClients/RetailSearchAutocompleteAssets#mobile');
});
</script>
<!-- sp:feature:navbar -->
<!-- NAVYAAN-UPNAV -->
<style type="text/css">
#nav-mobile-airstream-stripe {
background-color: #ffffff;
text-align: center;
}
#nav-mobile-airstream-stripe-img {
width: 100%;
max-height: 80px;
}
</style>
<div id="nav-mobile-airstream-stripe">
<a id="nav-mobile-airstream-link" href="/stream/ref=nav_upnav_mobile_C_detailaw" aria-hidden="true" tabindex="-1">
<img id="nav-mobile-airstream-stripe-img" src="https://images-na.ssl-images-amazon.com/images/G/01/airstream/mobile-upnav/C/mobile_upnav_C_latest_2x._CB492140722_.jpg" alt="Beautiful things, updated daily">
</a>
</div>
<script type="text/javascript">
if(typeof(P) !== 'undefined' || typeof(window.AmazonUIPageJS) !== 'undefined') {
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('navCF').execute(function() {
var pixelRatio = window.devicePixelRatio || 1;
if ( pixelRatio > 1 ) {
document.getElementById("nav-mobile-airstream-stripe-img").src = "https://images-na.ssl-images-amazon.com/images/G/01/airstream/mobile-upnav/C/mobile_upnav_C_latest_2x._CB492140722_.jpg";
}
});
}
</script>
<!-- navmet initial definition -->
<script type="text/javascript">
if(window.navmet===undefined) {
window.navmet=[];
if (window.performance && window.performance.timing && window.ue_t0) {
var t = window.performance.timing;
var now = + new Date();
window.navmet.basic = {
'networkLatency': (t.responseStart - t.fetchStart),
'navFirstPaint': (now - t.responseStart),
'NavStart': (now - window.ue_t0)
};
}
}
</script>
<script type="text/javascript">window.navmet.tmp=+new Date();</script>
<style type="text/css">#nav-mobile-airstream-stripe img {max-width: 100%;}</style><script type="text/javascript">window.$Nav && $Nav.when('jQuery', 'searchScoping').run(function($){var hidden=$('#nav-search-form input[type=hidden]'); if(hidden.length===2 && hidden[1].value==='10329849011') {hidden[0].remove();}})</script><script type="text/javascript">var nav_t_after_ANI = + new Date();</script>
<script type="text/javascript">
window.$Nav && window.$Nav.declare("config",
{"searchISS":{"cxNoiseReductionTreatment":1,"cxNoiseReductionV2Treatment":"C","requestId":"NDW9PCFNDRXWFHQVWR24","isInIssXCatWeblabTreatment":0,"language":"en_US","pageType":"DetailAW","useSXISS":"","isAutoCompleteLegacyJsEnabled":0,"issRequestParamsTreatment":1,"mktID":"1","host":"completion.amazon.com/search/complete","sessionId":"147-0816675-1753153","customerId":"","aliases":"aps,amazon-custom-products,amazon-devices,amazonbasics,amazonfresh,stripbooks,popular,apparel,electronics,sporting,sports-and-fitness,outdoor-recreation,fan-shop,garden,videogames,toys-and-games,jewelry,digital-text,digital-music,prime-digital-music,watches,grocery,hpc,instant-video,handmade,handmade-jewelry,handmade-home-and-kitchen,prime-instant-video,shop-instant-video,baby-products,office-products,software,magazines,tools,automotive,misc,industrial,mi,pet-supplies,digital-music-track,digital-music-album,mobile,mobile-apps,movies-tv,music-artist,music-album,music-song,stripbooks-spanish,electronics-accessories,pantry,photo,audio-video,computers,furniture,kitchen,audible,audiobooks,beauty,shoes,arts-crafts,appliances,gift-cards,pets,outdoor,lawngarden,collectibles,replacement-parts,financial,fine-art,fashion,fashion-womens,fashion-womens-clothing,fashion-womens-jewelry,fashion-womens-shoes,fashion-womens-watches,fashion-womens-handbags,fashion-mens,fashion-mens-clothing,fashion-mens-jewelry,fashion-mens-shoes,fashion-mens-watches,fashion-girls,fashion-girls-clothing,fashion-girls-jewelry,fashion-girls-shoes,fashion-girls-watches,fashion-boys,fashion-boys-clothing,fashion-boys-jewelry,fashion-boys-shoes,fashion-boys-watches,fashion-baby,fashion-baby-boys,fashion-baby-girls,fashion-luggage,3d-printing,tradein-aps,local-services,vehicles,video-shorts,warehouse-deals,luxury-beauty,banjo-apps,black-friday,cyber-monday,alexa-skills,subscribe-with-amazon,courses,amazon-global-store,prime-wardrobe","ime":0,"autoScrollUpSearchBoxTreatment":0},"pseudoPrimeFirstBrowse":0,"searchIconAction":"footer","searchIconEvent":"nojs","navDeviceType":"mobile","mobileBlueheaven":"true","windowWidths":0}
);
</script>
<script type="text/javascript">var nav_t_after_config_declaration = + new Date();</script>
<script type="text/javascript">
window.uet && uet('ns');
</script>
<!-- navp-FVOij1lPsZUxWpj9h8els1lJfu2/rBMK9dtL57zNs+7xOgKEIGPitVLIJ3MJdHOgY91foWkAoqg= rid-NDW9PCFNDRXWFHQVWR24 (Sat Feb 17 08:29:15 2018) --><script type="text/javascript">window.navmet.push({key:'PreNav',end:+new Date(),begin:window.navmet.tmp});</script>
<!-- navp-FVOij1lPsZUxWpj9h8els1lJfu2/rBMK9dtL57zNs+7xOgKEIGPitVLIJ3MJdHOgY91foWkAoqg= rid-NDW9PCFNDRXWFHQVWR24 (Sat Feb 17 08:29:15 2018) -->
<script type="text/javascript">window.navmet.main=+new Date();</script>
<!-- NAVYAAN -->
<header class="nav-mobile nav-locale-us nav-lang-en nav-ssl nav-unrec nav-blueheaven">
<div id="navbar" role="navigation" class="nav-t-standard nav-sprite-v3">
<div id="nav-logobar">
<div class="nav-left">
<script type="text/javascript">window.navmet.tmp=+new Date();</script>
<div id="nav-logo">
<a href="/ref=navm_hdr_logo" class="nav-logo-link">
<span class="nav-sprite nav-logo-base"></span>
<span class="nav-sprite nav-logo-ext"></span>
<span class="nav-sprite nav-logo-locale"></span>
</a>
</div>
<script type="text/javascript">window.navmet.push({key:'Logo',end:+new Date(),begin:window.navmet.tmp});</script>
</div>
<div class="nav-right">
<a href="#nav-search-keywords" class="nav-a" id="nav-button-search">
<i class="nav-icon nav-icon-a11y nav-sprite">Search</i>
</a>
<a href="/gp/aw/ya/ref=navm_hdr_profile" class="nav-a" id="nav-button-avatar">
<i class="nav-icon nav-icon-a11y nav-sprite">your account</i>
</a>
<a href="/gp/aw/c/ref=navm_hdr_cart" aria-label="Cart" class="nav-a" id="nav-button-cart">
<div class="nav-cart-empty">
<i class="nav-icon nav-sprite"></i>
<span class="nav-cart-count">0</span>
</div>
</a>
</div>
</div>
<script type="text/javascript">var nav_t_after_searchbar = + new Date();</script>
</div>
</header>
<script type="text/javascript">var nav_t_after_navbar = + new Date();</script>
<script type="text/javascript">window.navmet.push({key:'NavBar',end:+new Date(),begin:window.navmet.main});</script>
<script type="text/javascript">window.navmet.tmp=+new Date();</script>
<script type="text/javascript">
(function (i) {
i.onload = function() {window.uet && uet('ne')};
i.src = window._navbarSpriteUrl;
}(new Image()));
var nav_t_end_nav = + new Date();
</script>
<script type="text/javascript">window.navmet.push({key:'PostNav',end:+new Date(),begin:window.navmet.tmp});</script>
<script type="text/javascript">window.navmet.MainEnd = new Date();</script>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;NAV:Constants&quot;}">{"aa_searchBox_in":"in","aa_all_departments":"All Departments"}</script>
<!-- sp:feature:host-atf -->
<div id="dp" class=" ebooks_mobile ">
<div class="a-container" role="main">
<script type="text/javascript">
P.when('atf').execute(function(){
if(typeof uet === 'function'){(function(t){var w = window;w.awTags = w.awTags || {};w.awTags[t] = w.awTags[t] || (ue.tag(t) && 1)})('smart-device');uet('bb', 'udpv3auiwait', {wb: 1});};
P.when('A','jQuery','a-carousel-framework','a-popover-base','a-popover-ajax','a-state').execute(function(){
if(typeof uet === 'function'){(function(t){var w = window;w.awTags = w.awTags || {};w.awTags[t] = w.awTags[t] || (ue.tag(t) && 1)})('smart-device');uet('be', 'udpv3auiwait', {wb: 1});};
if(typeof uex === 'function'){(function(t){var w = window;w.awTags = w.awTags || {};w.awTags[t] = w.awTags[t] || (ue.tag(t) && 1)})('smart-device');uex('ld', 'udpv3auiwait', {wb: 1});};
});
});
if(typeof uet === 'function'){(function(t){var w = window;w.awTags = w.awTags || {};w.awTags[t] = w.awTags[t] || (ue.tag(t) && 1)})('smart-device');uet('bb', 'udpv3atfwait', {wb: 1});};
</script>
<script type="text/javascript">var encodedImgSrc="data:image/webp;base64,UklGRooIAABXRUJQVlA4IH4IAACQMACdASqnAMgAP3GqxlYrp6SiKFbrUXguCelu3SZMXDreHnsEHXx8B5lf7Xzp0wzSZY7Jrg8iFw+ldNuuht8FcUu16AqLFc9WHTndGnsTSWvcyrguerPnX06cxWpNUQrWvGbk6j2KG7RVLKWtiXV8dufEBmeT1u2HERqs0j+ng1JnZMu27YBoroJ9l82YGf1GYI0QOciEH4OhN1OdAhExcEB+VQ8zniIC4vw3I0O4SM+SOaKxWzkzsywxD+zxy0UPRvclX62QKP2jcbVeq2N0yWm1de73NpGw/nQ/7jHfBc/SCFIFdoX5G1c4ZYZ7JF9ZlqlVUUyYukJJBLKSfnlqFXQ1zMCFUTd6V98ZE19OZYz/dtIf7/QqETG3YqeT8V9w1yo9lJ88UpMQkjeMGrznHn0/9y1kWCmTDfUr+zp+mQRwCOd/NLpSBuIBrySwFigSsZtBN+f2fZEgD3coR0XEDZwgInC0Pg93g0QXx+tjU5Dl86lEKVzqryFyS1YjvCiRY7OFtXBoIu4UrnowAP7vza3QRrnHpz/FpUN7Kv5ehCZtRiy/mGEMHmPcR9mSxwQXYljYxLTGT3W5AfOY+2UluSFtmOXuJZnVZzYrLSO27mCt0T8mrr6/tPFksBQ/pgKekbIM9vZgQNjrTQLnJUbcmAXi256tQMUropgNYQow9qOaDklk7dXlfX3Sh3akWwT0tL2XyYKcJBeKwDXdsNefNibZSwimY9622icxUVqEuGJshSi+Z1Lzr4HSjPi28EgN8NCVNpvjawInAQyP1ikt6i3uqCVzMfR+u7ySw5BPg7BQ4xPTfck8vKaQP+sMGjmH594H7+CJdyIuIXj9R6TvuXDugCDvBBEhdXZNCu8M2Gj1M/9nFufC2WSRuC9FVGVj8YL/TKdFITGeEWKuMy/6/vx9a1iwsbMJ+S70rgvLP2k5BzHZ3iP8jbOrEntukzUAhBf9VaT429LEe9nX6udeo8xL/FU0jHmFBGEuHcFRNMFWiC+v/x0/eY0UyN1W+DiNE72Rk2TBHJN9oCo3pbcIAsIbnYTtF2+N1uHMXtqOReqLezz4ddf26jVQek88e1IHsid4gTOXbVtNNyPGW920JxFzQTV7iQQyWNDAhX28KaaHDCiib8U7dGNjRnH4KN8Nv+H0GOOvDspXNQWl6AqwOrVXb75a4xqTFVd3n6VYgK6E0mpZ7BtsZAcGJTFSdjd6K+6TW8kJYgL/n2CGzoFap7Wf3r81ou0bFkyXjMHTCGqvtr7ojQh61MyUH0CNemMa8vTlUd+5yULevwIoBeGFakq4jW3vcXGG2jaRFvI3G9rKUyhdhSF1qK5qPDBB4TzyGmhwzKAPvghIy617GjZJJztrTMmPpbGYH9GaVgseuMq9CyOLqsmkWhF6Nl4ca2pr4ghB94JkrcFdBx4cl4wN3w9Z4/VZfZJrmeFYcHbaRESsedcCrIYdWbpG/tgZpL6r0jnsjYznIrQk5HTKRgAFbWMP/hHqMYndmQyHbVJURB2eKk7qDQAwj7Vs2a4Jjw55C58JTbvOOT6V46ovAIePgSkBmaaw0qrZBTU2rvSHRecSn4w9+4iDcTpPAMr1N6RUQQa3kGglIRaEdUnoKSmgNsPsJkSXFCmeEa6BwBq+hIBzu/uS5wcOEbe4WeMBlDct64fahAifi0HoHhBfvbCYVwFLj4JOqkLlTo14KocCIAUpwVxVsMnDfdsIWlEks417DiR/NxC6E8AbytGW+Bu20LRVVAsOK0LGnPPRt3Dts8jHxx8Up8pWUjwCnsbCSfW7yMzS+og599f5TnWp2V8mGyDBqBSfyShX8i4qHc4NPcY8kGVYBnys9SILLxEB02SIJDrjlVNVvOypWZaIODn8LH5qQc9MCWv3L91p94kCaSu+45ynVtLl7cBC4SIp5B3SpNOtNu/PXdSphrEwawiUvv7THI3D57BN2gUiD1Rpn+IUwKcytdXIV7RBiYAJJQN6PWcbZ2p32UVINOaI50o2/JJBa2w2F8aSvXR60O22PKWO9CGEEmQQIFeCVo9VMPYUBF3xki1+uExL97sgi715eanR7dTVDijS3XIj51E4SD3vrgJtc4VrHhymxkJB42ypP7M+Kw4VfSghathkgvhT2yd1Sp2gukzS/rH2T34uwP9eMfVcka6jhzvUBGUUnSjkzmPaybLM+63MQ5IxO6yOChfrv7UhIKDyDYAfPlcK6e0IM9oCzOduw5C1rUdVpktdhhTMzxnv84Ux0X5c+SN/2aFMR4p2gnG2/h4Lwontqt4KXilGo7yEdlqZ1IAPuEx1ti0UWUsVkf4frXaQCcCQ22yv/b2inDcc6agYGGxWmVN7Qv1V1ltFF8PTeQjChs/deCAr2k28Z79MxYVVjHSijImYSOOSqxp/5QJr6d6VmZpyrkfQKoc1uHZv3q7xHQ1SrrzdCYEy3V+A5IXsCvt+RRM/0PA4mezu+HBNJpYYecCm1HFaRc/G6M+oeK5ItBWSjcwSJbaMfFuejioBKOemnXsZpkV68UmSV0axUlT+F5nQ0khZ8N8cTBd19GwYCq0j2uNLDRKMv+5wR1kQxSCpCT/XXsonAap/wH3sYRYJNRhquZD1KIq0IKD3bVvR369hB4INQ0fZqShInEGodFJ4EP8Y+YF3tDyA5OupRmAdKuWJ6UFK2fv1rU5yfbwmeTbri2nLhMpzViYZZ8xqnZo7SuAMAsjrQy4x5AeEFwEGFIO7QJgSA6px3um5maht0HaFY62V1TAHcyYKscmFNqegE7wFssAhydkv46AVWrUvlisf0BIySU8burOoOupB40177ontdR1GqedHus0T6ndjbhHbVnonxin62BCzQAlUnWGNROUgscBaYXbK80/uLIGDhcyKxK9gV1C2M4AAAA==";</script><script type="text/javascript">
if(typeof uet === 'function'){uet('be', 'udpv3atfwait', {wb: 1});};
if(typeof uex === 'function'){uex('ld', 'udpv3atfwait', {wb: 1});};
</script>
<div id="ppd" class="a-row">
<div class="a-row a-spacing-none">
<div id="detailILM_feature_div" data-feature-name="detailILM" data-template-name="detailILM" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-row">
<div class="a-column a-span12">
<div style="margin: -1.2rem -1.4rem 0px; background-color: #FFFFFF;">
<div style="margin-left: auto; margin-right: auto; width: 320px;">
<a href="/gp/student/signup/info/ref=st_ILM_trialconmob/"><img alt="" src="https://images-na.ssl-images-amazon.com/images/G/01/img17/student/other/1061023_student_offtocollegestripe__ilm_640x90._CB503961461_.jpg" height="45" width="320" data-a-hires="https://images-na.ssl-images-amazon.com/images/G/01/img17/student/other/1061023_student_offtocollegestripe__ilm_640x90._CB503961461_.jpg"></a>
</div>
<hr>
</div>
</div>
</div>
</div>
<div id="ebooksInstantOrderUpdate_feature_div" data-feature-name="ebooksInstantOrderUpdate" data-template-name="ebooksInstantOrderUpdate" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="ebooksImportantMessage_feature_div" data-feature-name="ebooksImportantMessage" data-template-name="ebooksImportantMessage" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="dealOffer_feature_div" data-feature-name="dealOffer" data-template-name="dealOffer" class="a-section a-spacing-none feature t-prnt t-full">
<style>
.gb_box_info {border-color:#bbd3de;}
.gb_box_error {border-color:#c40000;}
.gb_box_warn {border-color:#8b6e00;}
.gb_box_success {border-color:#89cd89;}
</style>
</div>
<div id="andonCord_feature_div" data-feature-name="andonCord" data-template-name="andonCord" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="dbsPromo_feature_div" data-feature-name="dbsPromo" data-template-name="dbsPromo" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="promotionsBanner_feature_div" data-feature-name="promotionsBanner" data-template-name="promotionsBanner" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="ebookBuyboxPromotions_feature_div" data-feature-name="ebookBuyboxPromotions" data-template-name="ebookBuyboxPromotions" class="a-section a-spacing-none feature t-prnt t-full">
</div>
</div>
<div class="a-row a-spacing-none">
<div class="a-column a-span5">
<div id="imageBlockNew_feature_div" data-feature-name="imageBlockNew" data-template-name="imageBlockNew" class="a-section a-spacing-none feature t-prnt t-full">
<div id="ebooksImageBlockOuter" class="a-row">
<div id="ebooksSitbLogo" style="width: 85px; height: 19px; top: 0px; margin-left: 48.5px;">
<img alt="Look inside this book." src="https://images-na.ssl-images-amazon.com/images/G/01/digital/sitb/sticker/sitb-sticker-v3-medium._CB361552076_.png" class="litb-on-click" id="ebooksSitbLogoImg">
</div>
<div id="ebooksImageBlock" class="a-row">
<div id="ebooksImageBlockContainer" class="a-row a-grid-vertical-align a-grid-center maintain-height">
<div id="ebooks-main-image-container" class="a-column a-span12 a-text-center maintain-height a-span-last">
<div id="ebooks-img-wrapper" class="a-section maintain-height">
<div id="ebooks-img-canvas" class="a-section image-2d" style="top: 0px; left: 0.5px;">
<img alt="Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers) by [Tate, Bruce]" src="https://images-na.ssl-images-amazon.com/images/I/51LZT%2BtSrTL.jpg" onload="this.onload='';setCSMReq('af');setCSMReq('af');" data-a-image-name="ebooksImageBlockFront" class="a-dynamic-image frontImage" id="ebooksImgBlkFront" width="133px" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/51LZT%2BtSrTL._SX133_.jpg&quot;:[133,159],&quot;https://images-na.ssl-images-amazon.com/images/I/51LZT%2BtSrTL.jpg&quot;:[417,500]}" data-a-manual-replacement="true" style="top: 0px; left: 0px;">
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
(function(){
var insertCenterColStyle = function(width) {
var totalWidth = width + 40,
style = document.createElement('style'),
head = document.getElementsByTagName('head')[0],
css = '#centerCol.centerColumn{margin-left:' + totalWidth + 'px !important;}';
style.type = 'text/css';
if(style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
};
var maintainWidth = function() {
var w = window.innerWidth || document.body.offsetWidth;
if(w < 0) {
var containerWidth = 133,
containerHeight = containerWidth / 0.75,
leftCol = document.getElementById("leftCol"),
imageBlock = document.getElementById("ebooksImageBlock"),
imageBlockContainer = document.getElementById("ebooksImageBlockContainer"),
frontImage = document.getElementById("ebooksImgBlkFront"),
imageCanvas = document.getElementById("ebooks-img-canvas");
leftCol.style.width = containerWidth + "px";
imageBlock.style.width = containerWidth + "px";
imageBlock.style.height = containerHeight + 15 + "px";
imageBlockContainer.style.height = containerHeight + "px";
imageCanvas.style.height = containerHeight + "px";
imageCanvas.style.width = containerWidth + "px";
frontImage.style.height = containerHeight + "px";
frontImage.style.width = containerWidth + "px";
frontImage.style.overflow = "hidden";
}
insertCenterColStyle(containerWidth);
};
maintainWidth();
})();
P.when('A', 'atf').register("ebooksImageBlockATF", function(A) {
var data = {
'litbData' : {
'hasLitb' : true,
'litbReftag' : "dbs_P_W_litb_stkr",
'litbReaderUrl' : "/gp/aw/sitb/B00AYQNR46?ref=sib_dp_aw_kd_udp"
},
'windowWidthThreshold' : 0,
'configWidths' : [133, 133],
'holderRatio' : 0.75,
'containerMargin' : 15,
'frontImageWidth' : 133,
'frontImageHeight' : 159,
'frontImageAspectRatio' : 0.8364779874213837,
'centerColMargin' : 40,
'hasAnimatedCoverImage' : false,
'hasCoverImageInlineVideo' : false,
};
return data;
});
</script>
</div>
</div>
</div>
<div class="a-column a-span7 a-span-last">
<div class="a-row a-spacing-none">
<div id="mobile_productTitleGroup_inner_feature_div" data-feature-name="mobile_productTitleGroup_inner" data-template-name="mobile_productTitleGroup_inner" class="a-section a-spacing-none feature">
<div id="machineTranslation_feature_div" data-feature-name="machineTranslation" data-template-name="machineTranslation" class="a-section a-spacing-mini feature">
<style type="text/css">
#machine-translation-widget .a-size-base{
font-size: 1.4rem!important;
}
#machine-translation-widget .mt-link {
margin-left: 4px;
margin-right: 3px;
}
</style>
</div>
<div id="bylineInfo" class="a-row a-spacing-micro a-size-base bylineHidden feature">
<span class="a-size-medium" role="heading">
<a class="a-size-base a-link-normal" href="/kindle-dbs/author/ref=dbs_P_W_auth?_encoding=UTF8&amp;author=Bruce%20Tate&amp;searchAlias=digital-text&amp;asin=B001ITYIUU" role="link">
Bruce Tate
</a>
</span>
</div>
<div id="title_feature_div" class="a-section a-spacing-mini" role="heading">
<div class="a-section a-spacing-mini">
<div id="ebooksMobileTitleExpander" aria-live="polite" data-a-expander-collapsed-height="81" class="a-expander-collapsed-height a-row a-expander-container a-spacing-none a-expander-partial-collapse-container" style="max-height: none; height: 81px;">
<div aria-expanded="false" class="a-expander-content a-expander-partial-collapse-content" style="padding-bottom: 17px;">
<span id="ebooksTitle" class="a-size-base a-text-bold" role="heading">
Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)
</span>
</div>
<div id="mobileTitleExpanderHeading" class="a-expander-header a-expander-partial-collapse-header a-color-base-background" style="opacity: 1; display: block;"><div class="a-expander-content-fade"></div><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;See more&quot;, &quot;collapse_prompt&quot;:&quot;See less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">See more</span></a></div>
</div>
</div>
<div class="a-section a-spacing-micro">
<span id="bookEdition" class="a-size-base a-color-base a-text-bold">1st Edition</span>
</div>
<script type="text/javascript">
P.when('A', 'jQuery').execute(function (A, $) {
A.on.ready(function() {
var titleData = {
'productTitle': "Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)"
};
A.state.replace('productTitle',titleData);
});
var ebooksTitleJS = function () {
/*
A function to make sure the expander shows the desired number of lines
1. Get the number of lines to display from the config
2. Get the line height using JS
3. Set the expander height to that
*/
var numLines,titleLineHeight,totalTitleHeight,expanderHeadingHeight,totalHeight;
var title = $('#ebooksTitle');
var expanderHeading = $('#titleExpanderHeading');
var titleExpander = $('#ebooksTitleExpander');
if(title && expanderHeading && titleExpander && Number(title.height()) && Number(titleExpander.height()) && (title.height() > titleExpander.height())) {
numLines= parseInt(3);
titleLineHeight = title.css("line-height");
expanderHeadingHeight = expanderHeading.css("line-height");
if(titleLineHeight && expanderHeadingHeight) {
titleLineHeight = parseFloat(titleLineHeight);
totalTitleHeight = Math.round(titleLineHeight * numLines);
expanderHeadingHeight = parseFloat(expanderHeadingHeight);
totalHeight = Math.round(expanderHeadingHeight + totalTitleHeight);
if(Number(totalHeight)) {
titleExpander.data('a-expander-collapsed-height', totalHeight);
titleExpander.height(totalHeight);
}
}
expanderHeading.show();
}
}
return new ebooksTitleJS();
});
</script>
<style type="text/css">
#titleExpanderHeading {
display: none;
padding-bottom: 7px;
}
#ebooksTitleExpander .a-expander-content-expanded {
margin-bottom: 7px;
}
#mobileTitleExpanderHeading {
display: none;
font-size: 1.3rem;
}
</style>
</div>
<div class="a-row a-spacing-medium">
<a id="acrCustomerReviewLink" class="a-link-normal" href="/gp/aw/cr/B00AYQNR46/ref=mw_dp_cr">
<i class="a-icon a-icon-star-medium a-star-medium-4"><span class="a-icon-alt">4.2 out of 5 stars</span></i>
<span class="a-size-base">(58)</span>
<span id="textReviews" style="position: absolute; left: -10000px; top: auto; width: 2px; height: 1px; overflow: hidden;">Reviews</span>
</a>
</div>
<div class="a-row a-spacing-top-micro">
</div>
<div class="a-row">
<div class="a-section a-spacing-base">
<div class="a-row">
<span class="a-size-small">ISBN-13:</span>
<span class="a-size-small"> 978-1934356593</span>
</div>
</div>
</div>
</div>
</div>
<div class="a-row a-spacing-none">
<div id="ebooksPrice_feature_div" data-feature-name="ebooksPrice" data-template-name="ebooksPrice" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-section a-spacing-mini">
<div class="a-row a-spacing-none a-spacing-top-micro a-size-small a-grid-vertical-align a-grid-center list-price-label price_label">
<div class="a-column a-span6 a-text-left a-spacing-none">
<span class="a-color-secondary">
Print List Price:
</span>
</div>
<div class="a-column a-span6 a-spacing-none price-value a-span-last">
<span class="a-color-base a-text-strike">
$34.95
</span>
</div>
</div>
<div class="a-row a-spacing-none a-spacing-top-micro a-size-small a-grid-vertical-align a-grid-center kindle-price price_label">
<div class="a-column a-span6 a-text-left a-spacing-none">
<span class="a-color-secondary">
Kindle Price:
</span>
</div>
<div class="a-column a-span6 a-spacing-none price-value a-span-last">
<span class="a-size-small a-color-price a-text-bold">
$25.00
</span>
</div>
</div>
<div class="a-row a-spacing-none a-spacing-top-micro a-size-small a-grid-vertical-align a-grid-center ebooks-price-savings price_label">
<div class="a-column a-span6 a-text-left a-spacing-none">
<span class="a-color-secondary">
You Save:
</span>
</div>
<div class="a-column a-span6 a-spacing-none price-value a-span-last">
<span class="a-color-price">
$9.95 (28%)
</span>
</div>
</div>
</div>
<style type="text/css">
.price-value {
vertical-align: bottom!important;
}
</style>
</div>
</div>
<div class="a-row a-spacing-none">
<div id="kindleIllustratedBanner_feature_div" data-feature-name="kindleIllustratedBanner" data-template-name="kindleIllustratedBanner" class="a-section a-spacing-none feature t-prnt t-full">
</div>
</div>
</div>
</div>
<div class="a-row a-spacing-none">
<div id="newerVersion_feature_div" data-feature-name="newerVersion" data-template-name="newerVersion" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="shipsFromSoldBy_feature_div" data-feature-name="shipsFromSoldBy" data-template-name="shipsFromSoldBy" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="holidayAvailabilityMessage_feature_div" data-feature-name="holidayAvailabilityMessage" data-template-name="holidayAvailabilityMessage" class="a-section a-spacing-none feature">
</div>
<div id="purchaseGuidance_feature_div" data-feature-name="purchaseGuidance" data-template-name="purchaseGuidance" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="KindleFirstBanner_feature_div" data-feature-name="KindleFirstBanner" data-template-name="KindleFirstBanner" class="a-section a-spacing-none feature">
<style>
#KindleFirstTabletBanner {
margin-top: 5px;
}
</style>
</div>
<div id="MediaMatrixMobile_feature_div" data-feature-name="MediaMatrixMobile" data-template-name="MediaMatrixMobile" class="a-section a-spacing-none feature">
<div id="mediaMatrixContainer" cel_widget_id="mediaMatrixMobFeature" class="celwidget">
<div class="a-row a-spacing-medium">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;alternateBackground&quot;:&quot;true&quot;,&quot;name&quot;:&quot;mediaMatrix_secondary_view_div&quot;}">
<span id="mediaMatrixButton" class="a-button a-button-supplemental a-button-span12 a-button-toggle"><span class="a-button-inner"><i class="a-icon a-icon-supplemental"></i><input class="a-button-input" type="submit" aria-labelledby="mediaMatrixButton-announce"><span id="mediaMatrixButton-announce" class="a-button-text" aria-hidden="true">
Format
<strong class="dimension-label a-padding-mini">
Kindle
</strong>
</span></span></span>
<script type="text/javascript">
P.when('jQuery').execute(function($) {
$('a.mediaMatrixListItem').click(function() {
//Update selected state
$('a.mediaMatrixListItem').removeClass('a-active');
$(this).addClass('a-active');
var ue = window.ue;
if(ue && ue.count){
var mobileMediaMatrixSecViewRowClickedCounter = "mobileMediaMatrixSecViewRowClicked";
ue.count(mobileMediaMatrixSecViewRowClickedCounter, 1);
}
});
});
P.when('A').execute(function(A){
A.on("a:popover:afterShow:mediaMatrix_secondary_view_div", function(data){
var ue = window.ue;
if(ue && ue.count){
var mobileMediaMatrixSecViewOpenedCounter = "mobileMediaMatrixSecViewOpened";
ue.count(mobileMediaMatrixSecViewOpenedCounter, (ue.count(mobileMediaMatrixSecViewOpenedCounter) || 0) + 1);
}
});
});
</script>
</span>
</div>
<div class="a-popover-preload" id="a-popover-mediaMatrix_secondary_view_div">
<h2 class="a-spacing-base">
Select Format
</h2>
<div class="a-box a-vertical"><div class="a-box-inner a-padding-none"><ul class="a-unordered-list a-nostyle a-box-list a-last">
<li class="a-align-center"><span class="a-list-item">
<a href="/gp/aw/d/B00AYQNR46/ref=tmm_kin_title_sr?ie=UTF8&amp;qid=&amp;sr=" class="a-touch-link a-box a-touch-link-noborder a-touch-select a-active mediaMatrixListItem"><div class="a-box-inner"><i class="a-icon a-icon-touch-select"></i>
<span class="a-text-bold">Kindle</span>
<span class="a-color-tertiary"></span>
<span class="a-color-price">$25.00</span>
</div></a>
</span></li>
<li class="a-align-center"><span class="a-list-item">
<a href="/gp/aw/d/193435659X/ref=tmm_pap_title_0?ie=UTF8&amp;qid=&amp;sr=" class="a-touch-link a-box a-touch-link-noborder a-touch-select mediaMatrixListItem"><div class="a-box-inner"><i class="a-icon a-icon-touch-select"></i>
<span class="a-text-bold">Paperback</span>
<span class="a-color-tertiary"></span>
<span class="a-color-price">$21.11</span>
</div></a>
</span></li>
</ul></div></div>
</div>
</div>
</div>
<div id="CombinedBuyboxMobile_feature_div" data-feature-name="CombinedBuyboxMobile" data-template-name="CombinedBuyboxMobile" class="a-section a-spacing-none feature">
<div id="combinedBuyBox" class="a-section">
<form method="post" id="buyOneClick" action="https://www.amazon.com/gp/aw/kindle/order.html/ref=dbs_p_ebk_w0m_pbcb_cv1c00" spacing="none">
<input type="hidden" name="subtype.0" value="STANDARD" id="subtype">
<input type="hidden" name="buyActionIdentifier" value="arn:action:pa:1:QjAwQVlRTlI0NjpBVFZQREtJS1gwREVSOkJ1eTpudWxsOjI1LjAwOlVTRDpudWxs" id="buyActionIdentifier">
<input type="hidden" name="ref_" value="dbs_p_ebk_w0m_pbcb_cv1c00" id="refTag">
<input type="hidden" name="t" value="fiona">
<input type="hidden" name="itemCount" value="1">
<input type="hidden" name="ASIN.0" value="B00AYQNR46">
<input type="hidden" name="transactionMode" value="one-click" id="transactionMode">
<input type="hidden" name="surface" value="mobile" id="surface">
<input type="hidden" name="addNarration" value="0" id="addNarration">
<input type="hidden" name="audibleAsin" id="audibleAsin">
<input type="hidden" name="audibleOurPrice" id="audibleOurPrice">
<input type="hidden" name="addAyceBenefit" value="0" id="addAyceBenefit">
<input type="hidden" name="cor.0" value="DE">
<input type="hidden" name="displayedPrice" value="25.0">
<input type="hidden" name="displayedPriceCurrency" value="USD">
<input type="hidden" name="displayedGiftPrice" value="25.0">
<input type="hidden" name="displayedGiftPriceCurrencyCode" value="USD">
<input type="hidden" name="kindleCheckout" value="0" id="kindleCheckout">
<input type="hidden" name="isPaymentInstrumentSelected" value="0" id="isPaymentInstrumentSelected">
<input type="hidden" name="borrowProgram" id="borrowProgram">
<input type="hidden" name="borrowButtonAction" id="borrowButtonAction">
<div class="a-button-stack a-spacing-base">
<span id="checkoutButtonId" class="a-button a-button-normal a-spacing-small a-button-oneclick a-button-icon"><span class="a-button-inner"><i class="a-icon a-icon-1click"></i><input id="one-click-button" name="submit.one-click-order.x" class="a-button-input" type="submit" value="Buy now with 1-Click" aria-labelledby="checkoutButtonId-announce"><span id="checkoutButtonId-announce" class="a-button-text a-text-center" aria-hidden="true">
Buy now with 1-Click
</span></span></span>
<div class="a-section a-spacing-none a-spacing-top-micro a-text-left vat-tax-message">
<span class="a-size-mini a-color-tertiary">
Kindle price includes VAT
</span>
</div>
<div class="a-section a-spacing-none a-text-center print-sold-by">
<span class="a-size-mini a-color-tertiary">
Sold by Amazon Digital Services LLC.
</span>
</div>
<c:if test="true">
<c:if test="true">
<script type="text/javascript">
P.when('jQuery', 'a-button').execute(function ($, getButtonCollection) {
getButtonCollection('#oneClickButtonId').enable();
var onOneClickButtonClick = function () {
$("#one-click-button").click(function () {
$("#buyOneClick #transactionMode").attr("value", "one-click");
if ($("#bookClubRequest").length) {
$("#buyOneClick #subtype").val("BOTM_PURCHASE");
} else {
$("#buyOneClick #subtype").val("STANDARD");
}
$("#borrowProgram").val("");
$("#borrowButtonAction").val("");
$("#buyOneClick #kindleCheckout").val("0");
$("#buyOneClick #refTag").val("dbs_p_ebk_w0m_pbcb_cv1c00");
if (typeof setDsnAndXfsn === "function") {
setDsnAndXfsn();
}
if (typeof insertPaymentProvidersIntoKindleOrderForm === "function") {
insertPaymentProvidersIntoKindleOrderForm();
}
if (typeof trialModeSignIn === "function") {
trialModeSignIn("STANDARD", true, 0);
return false;
}
return true;
});
}();
var onCheckoutClick = function () {
$("#checkout-button").click(function () {
$("#buyOneClick #transactionMode").attr("value", "checkout");
$("#buyOneClick #subtype").val("STANDARD");
$("#borrowProgram").val("");
$("#borrowButtonAction").val("");
$("#buyOneClick #kindleCheckout").val("1");
$("#buyOneClick #refTag").val("dbs_p_ebk_w0m_pbcb_cvco00");
if (typeof setDsnAndXfsn === "function") {
setDsnAndXfsn();
}
if (typeof insertPaymentProvidersIntoKindleOrderForm === "function") {
insertPaymentProvidersIntoKindleOrderForm();
}
if (typeof trialModeSignIn === "function") {
trialModeSignIn("STANDARD", true, 1);
return false;
}
return true;
});
}();
var onOneClickPreorderButtonClick = function() {
$("#oneClick-preorder-button").click(function() {
$("#buyOneClick #kindleCheckout").val("0");
$("#buyOneClick #refTag").val("dbs_p_ebk_w0m_pbcb_cv1cpo");
if (typeof setDsnAndXfsn === "function") {
setDsnAndXfsn();
}
if (typeof insertPaymentProvidersIntoKindleOrderForm === "function") {
insertPaymentProvidersIntoKindleOrderForm();
}
if (typeof trialModeSignIn === "function") {
trialModeSignIn("STANDARD", true, 0);
return false;
}
return true;
});
}();
var onCheckoutPreorderButtonClick = function () {
$("#checkout-preorder-button").click(function () {
$('#buyOneClick #kindleCheckout').val("1");
$("#buyOneClick #refTag").val("dbs_p_ebk_w0m_pbcb_cvcopo");
if (typeof setDsnAndXfsn === "function") {
setDsnAndXfsn();
}
if (typeof insertPaymentProvidersIntoKindleOrderForm === "function") {
insertPaymentProvidersIntoKindleOrderForm();
}
if (typeof trialModeSignIn === "function") {
trialModeSignIn("STANDARD", true, 1);
return false;
}
return true;
});
}();
});
</script>
</c:if>
</c:if>
<script type="text/javascript">
P.when('A', 'jQuery').execute(function (A, $) {
$.fn.preventMultiSubmission = function() {
$(this).submit(function(e) {
if ($(this).data('submitted') === true) {
e.preventDefault();
} else {
$(this).data('submitted', true);
}
});
};
$("#buyOneClick").preventMultiSubmission();
A.on.ready(function() {
$("#sendSample").preventMultiSubmission();
});
});
</script>
<div class="a-row a-spacing-base">
</div>
<div id="sendSample" class="a-section a-spacing-none a-text-center">
<span id="sendSampleButton" class="a-button a-button-group-onlychild a-spacing-none a-spacing-top-micro"><span class="a-button-inner"><input class="a-button-input" type="submit" value="Send a free sample" aria-labelledby="sendSampleButton-announce"><span id="sendSampleButton-announce" class="a-button-text a-text-center" aria-hidden="true">
Send a free sample
</span></span></span>
</div>
<script>
P.when('A', 'jQuery', 'a-button').execute(function (A, $, getButtonCollection) {
var kindleCheckout = $("#kindleCheckout");
var sendSampleButton = function () {
$("#sendSampleButton").click(function () {
$("#subtype").val("FREE_CHAPTER");
$("#refTag").val("mt_kindle");
$("#borrowProgram").val("");
$("#borrowButtonAction").val("");
// making sure that the kindleCheckout variable is set to 0 before trying to process a send Sample request
if(kindleCheckout) {
kindleCheckout.val(0);
}
if (typeof trialModeSignIn === "function") {
trialModeSignIn("DOWNLOAD_SAMPLE", true, 0);
return false;
}
return true;
});
}();
getButtonCollection('#sendSampleButton').enable();
});
</script>
<div id="deliverTo" class="a-section a-spacing-micro a-spacing-top-mini a-text-center">
<div class="a-section a-spacing-none a-spacing-top-micro celwidget">
</div>
<p>Deliver to your Kindle or other device</p>
</div>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;deliverToState&quot;}">{"deliverToDropdownName":"a:dropdown:selected:target-fiona.0"}</script>
<style type="text/css">
.deviceDisabled .a-dropdown-link {
color: #aaa!important;
pointer-events: none;
}
.deviceDisabled {
cursor: not-allowed;
}
</style>
</div>
<style type="text/css">
#audiblePlayerStack .a-fixed-left-grid-inner {
padding-left: 7rem!important;
}
#audiblePlayerStack .audible-sample-container {
text-align: left!important;
}
</style>
</form>
<style type="text/css">
#buybox .a-dropdown-container .a-button-dropdown {
width: 100%;
display: inline-block !important;
}
#buybox .a-native-dropdown {
display: none;
}
</style>
</div>
<style type="text/css">
#ebookAccordion .a-dropdown-container .a-button-dropdown {
width: 100%;
display: inline-block !important;
}
</style>
<script type="text/javascript">
P.when('A', 'jQuery').execute(function(A) {
var $ = A.$;
A.on('a:accordion:ebookAccordion:select', function(data) {
$('#ebookAccordion span.a-color-price').removeClass('a-color-price').addClass('a-color-secondary').removeClass('a-size-medium');
$(data.selectedRow.$row).find('div.a-span-last span').removeClass('a-color-secondary').addClass('a-color-price').addClass('a-size-medium');
});
});
</script>
<script type="text/javascript">
P.when('A', 'jQuery', 'accordionInstrumentation').execute(function(A, $, instrumentation) {
// Getting counter for csm metrics
var counter = instrumentation.counter();
if (counter) {
counter.setAccordionCounterId('ebookAccordion');
counter.addRowsToCounterId('[BUY]');
}
A.on('a:accordion:ebookAccordion:select', function(data) {
// Increment count and send Client Side Metric counter
if (counter) {
counter.accordionSwitch();
}
});
});
</script>
</div>
<div id="ebooksGiveGift_feature_div" data-feature-name="ebooksGiveGift" data-template-name="ebooksGiveGift" class="a-section a-spacing-none feature t-prnt t-full">
<div id="giveGiftContainer" class="a-section a-spacing-micro a-spacing-top-micro">
<form method="post" id="giftForm" action="https://www.amazon.com/gp/aw/kindle/order.html/ref=dbs_p_ebk_w0m_pbcb_cv1c00" spacing="none">
<input type="hidden" name="subtype.0" value="STANDARD" id="subtype">
<input type="hidden" name="buyActionIdentifier" value="arn:action:pa:1:QjAwQVlRTlI0NjpBVFZQREtJS1gwREVSOkJ1eTpudWxsOjI1LjAwOlVTRDpudWxs" id="buyActionIdentifier">
<input type="hidden" name="ref_" value="dbs_p_ebk_w0m_pggg_gige00" id="refTag">
<input type="hidden" name="t" value="fiona">
<input type="hidden" name="itemCount" value="1">
<input type="hidden" name="ASIN.0" value="B00AYQNR46">
<input type="hidden" name="transactionMode" value="one-click" id="transactionMode">
<input type="hidden" name="surface" value="mobile" id="surface">
<input type="hidden" name="addNarration" value="0" id="addNarration">
<input type="hidden" name="audibleAsin" id="audibleAsin">
<input type="hidden" name="audibleOurPrice" id="audibleOurPrice">
<input type="hidden" name="addAyceBenefit" value="0" id="addAyceBenefit">
<input type="hidden" name="cor.0" value="DE">
<input type="hidden" name="displayedPrice" value="25.0">
<input type="hidden" name="displayedPriceCurrency" value="USD">
<input type="hidden" name="displayedGiftPrice" value="25.0">
<input type="hidden" name="displayedGiftPriceCurrencyCode" value="USD">
<input type="hidden" name="kindleCheckout" value="0" id="kindleCheckout">
<input type="hidden" name="isPaymentInstrumentSelected" value="0" id="isPaymentInstrumentSelected">
<div id="giftButtonStack" class="a-button-stack">
<span id="gift-button" class="a-button a-spacing-micro"><span class="a-button-inner"><input name="submit.give-as-gift" class="a-button-input" type="submit" value="Give as a Gift" aria-labelledby="gift-button-announce"><span id="gift-button-announce" class="a-button-text" aria-hidden="true">
Give as a Gift
</span></span></span>
</div>
<script type="text/javascript">
var giveawayGiftingShareVar = true;
</script>
<style>
#giveGiftBox {
padding: 0 18px;
}
</style>
</form>
</div>
<script type="text/javascript">
P.when('jQuery', 'a-button').execute(function ($, getButtonCollection) {
var onGiftingButtonClick = function () {
$("#gift-button").click(function () {
if (typeof setDsnAndXfsn === "function") {
setDsnAndXfsn();
}
if (typeof insertPaymentProvidersIntoKindleOrderForm === "function") {
insertPaymentProvidersIntoKindleOrderForm();
}
if (typeof trialModeSignIn === "function") {
trialModeSignIn("STANDARD", true, 0);
return false;
}
return true;
});
}();
});
</script>
<style type="text/css">
#giveGiftContainer {
padding-top: 0!important;
padding-bottom: 0!important;
}
#giftButtonStack {
padding-left: 1px;
padding-right: 1px;
}
</style>
</div>
<div id="ebooksBuyboxWishlist_feature_div" data-feature-name="ebooksBuyboxWishlist" data-template-name="ebooksBuyboxWishlist" class="a-section a-spacing-none feature t-prnt t-full">
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;atbr-migration-state&quot;}">{"isMigrationActive":true}</script>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;atwl&quot;}">{"useHzForAdd":true}</script>
<form id="addToWishlist" method="post" action="https://www.amazon.com/ap/signin?openid.return_to=https%3A%2F%2Fwww.amazon.com%2Fgp%2Faw%2Fd%2FB00AYQNR46&amp;openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.assoc_handle=usflex&amp;openid.mode=checkid_setup&amp;openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&amp;">
<div id="wishlistButtonStack" class="a-button-stack">
<span class="a-button a-button-supplemental a-spacing-none" id="a-autoid-0"><span class="a-button-inner"><i class="a-icon a-icon-supplemental"></i><button id="add-to-wishlist-button-submit" name="submit.add-to-registry.wishlist" title="Add to List" class="a-button-text a-text-left" type="null">
<span>Add to List</span>
</button></span></span>
</div>
</form>
<div class="a-box a-alert-inline a-alert-inline-error a-hidden a-spacing-top-small" aria-live="assertive" role="alert"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
<div id="atwl-error-message" class="a-section a-spacing-none">
We are sorry. Amazon has encountered an error. Please try again.
</div>
</div></div></div>
</div>
<div id="seriesWidget_feature_div" data-feature-name="seriesWidget" data-template-name="seriesWidget" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="otherKindleEditions_feature_div" data-feature-name="otherKindleEditions" data-template-name="otherKindleEditions" class="a-section a-spacing-none feature t-prnt t-full">
</div>
</div>
<script type="text/javascript">
setCSMReq('af');
</script>
</div>
<style type="text/css">
#mediaMatrixButton {
margin: 0!important;
}
</style><script type="text/javascript"> var BtfTimeToParse_tctr = Date.now(); </script><!-- MarkAF -->
<div id="WrapperDivToHideBTF" style="display:block;">
<script type="text/javascript"> ue.count('BtfTimeToParse', Date.now() - BtfTimeToParse_tctr) </script> <script type="text/javascript">P.when('cf').execute(function() { ue.count('dp:widget:dpxSize:dpxBTFSize', 129);ue.count('dp:widget:dpxSize:dpxATFSize', 52);});</script>
<div id="dp-lazy-fast-track_feature_div" data-feature-name="dpFastTrack" data-template-name="dpFastTrack" class="a-section a-spacing-none feature t-prnt t-full">
<script type="text/javascript">
P.when('jQuery', 'atf').execute(function($){
$('#dpFastTrack_feature_div, .dpFastTrackPlaceholder').html($('#lazy-fast-track').html());
$('#lazy-fast-track').remove();
});
</script>
</div><div id="lazy-holidayAvailabilityMessage_feature_div" data-feature-name="holidayAvailabilityMessage" data-template-name="holidayAvailabilityMessage" class="a-section a-spacing-none feature t-prnt t-full">
<script type="text/javascript">
P.when('jQuery', 'atf').execute(function($){
$('#holidayAvailabilityMessage_feature_div').html($('#lazy-holidayAvailabilityMessage').html());
$('#lazy-holidayAvailabilityMessage').remove();
});
</script>
</div><div style="display:flex">
<div class="twister-spinner-preload" style="width:0px; height:0px"></div>
</div><div id="tellAFriendBox_feature_div" data-feature-name="tellAFriendBox" data-template-name="tellAFriendBox" class="a-section a-spacing-none feature t-part t-full">
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;swf-1-click-page-state&quot;}">{"placementId":"awdo_t1_BHfIAbNWPFDXF"}</script>
<div class="a-row">
<div class="a-box a-spacing-none" style="height:52px;"><div class="a-box-inner a-padding-none">
<span class="a-declarative" data-action="swf-1-click-declarative" data-swf-1-click-declarative="{&quot;siteName&quot;:&quot;email&quot;}">
<div id="email" class="a-column a-span2 a-text-center a-spacing-large swf-share-box">
<a id="tell-a-friend" href="/gp/aw/social/swf/B00AYQNR46/o=WriteEmail/ref=cm_sw_em_ov_awdo_t1_BHfIAbNWPFDXF?ie=UTF8&amp;placementID=awdo_t1_BHfIAbNWPFDXF&amp;asin=B00AYQNR46&amp;isOneClick=1" target="_self" rel="noopener" class="a-touch-link a-box swf-sn-icon-link"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<i id="email_icon" class="a-icon a-icon-share-email" role="img" aria-label="Email"></i>
</div></a>
</div>
</span>
<span class="a-declarative" data-action="swf-1-click-declarative" data-swf-1-click-declarative="{&quot;siteName&quot;:&quot;facebook&quot;,&quot;refId&quot;:&quot;fa&quot;}">
<div id="facebook" class="a-column a-span2 a-text-center a-spacing-large swf-share-box">
<a id="tell-a-friend" href="/gp/redirect.html/ref=cm_sw_cl_fa_awdo_t1_BHfIAbNWPFDXF?_encoding=UTF8&amp;location=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fshare%3F_encoding%3DUTF8%26display%3Dpopup%26href%3Dhttps%253A%252F%252Fwww.amazon.com%252Fdp%252FB00AYQNR46%252Fref%253Dcm_sw_r_fa_awdo_t1_BHfIAbNWPFDXF%26redirect_uri%3Dhttps%253A%252F%252Fwww.amazon.com%252Fgp%252Fpdp%252Ftaf%252Ffb_post_redirect.html%252Fref%253Dcm_sw_s_fa_awdo_t1_BHfIAbNWPFDXF%26app_id%3D164734381262%26hashtag%3D%2523Amazon&amp;token=E0915379AEBDF40D2C90D4882003C7011F43D80C" target="_blank" rel="noopener" class="a-touch-link a-box swf-sn-icon-link"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<i id="facebook_icon" class="a-icon a-icon-share-facebook" role="img" aria-label="Facebook"></i>
</div></a>
</div>
</span>
<span class="a-declarative" data-action="swf-1-click-declarative" data-swf-1-click-declarative="{&quot;siteName&quot;:&quot;sms&quot;,&quot;refId&quot;:&quot;sms&quot;}">
<div id="sms" class="a-column a-span2 a-text-center a-spacing-large swf-share-box">
<a id="tell-a-friend" href="sms:&amp;body=Check%20this%20out%3A%20Seven%20Languages%20in%20Seven%20Weeks%3A%20A%20Pragmatic%20Guide%20to%20Learning%20Pr...%20https%3A%2F%2Fwww.amazon.com%2Fdp%2FB00AYQNR46%2Fref%3Dcm_sw_r_sms_awdo_t1_BHfIAbNWPFDXF" target="_self" rel="noopener" class="a-touch-link a-box swf-sn-icon-link"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<i id="sms_icon" class="a-icon a-icon-share-sms" role="img"></i>
</div></a>
</div>
</span>
<span class="a-declarative" data-action="swf-share-btn-declarative" data-swf-share-btn-declarative="{&quot;refId&quot;:&quot;sb&quot;}">
<span class="a-declarative" data-action="a-sheet" data-a-sheet="{&quot;name&quot;:&quot;shareSheet&quot;,&quot;preloadDomId&quot;:&quot;swf-sheet-content&quot;,&quot;closeType&quot;:&quot;icon&quot;}">
<div class="a-column a-span6 a-text-left swf-wide">
<a href="#" class="a-touch-link a-box swf-sn-share-link"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<span class="swf-share-text">
Share
</span>
</div></a>
</div>
</span>
</span>
</div></div>
<div id="swf_whatsapp_not_installed_alert" class="a-section" role="alert">
<div class="a-box a-alert-inline a-alert-inline-error" aria-live="assertive" role="alert"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
It looks like WhatsApp is not installed on your phone. Please use a different way to share.
</div></div></div>
</div>
</div>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;swf-share-sheet-page-state&quot;}">{"placementId":"awdb_t1_BHfIAbNWPFDXF","mailToEnabled":false}</script>
<div id="swf-sheet-content" class="a-box aok-hidden"><div class="a-box-inner">
<div class="a-row a-size-base a-color-base swf-sheet-title a-ws-row" style="height:47px;">
<span>Share this product with friends</span>
</div>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;sms&quot;,&quot;refId&quot;:&quot;sms&quot;}">
<div id="swf-sheet-sms" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_self" rel="noopener" href="sms:&amp;body=Check%20this%20out%3A%20Seven%20Languages%20in%20Seven%20Weeks%3A%20A%20Pragmatic%20Guide%20to%20Learning%20Pr...%20https%3A%2F%2Fwww.amazon.com%2Fdp%2FB00AYQNR46%2Fref%3Dcm_sw_r_sms_awdb_t1_BHfIAbNWPFDXF">
<i id="swf-sms-img" class="a-icon a-icon-share-sms swf-sheet-icon" role="img"></i>
<span class="swf-network-share">Text Message</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;email&quot;}">
<div id="swf-sheet-email" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_self" rel="noopener" href="/gp/aw/social/swf/B00AYQNR46/o=WriteEmail/ref=cm_sw_em_ov_awdb_t1_BHfIAbNWPFDXF?ie=UTF8&amp;placementID=awdb_t1_BHfIAbNWPFDXF&amp;asin=B00AYQNR46&amp;isOneClick=1">
<i id="swf-email-img" class="a-icon a-icon-share-email swf-sheet-icon" role="img" aria-label="Email"></i>
<span class="swf-network-share">Email</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;facebook&quot;,&quot;refId&quot;:&quot;fa&quot;}">
<div id="swf-sheet-facebook" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_blank" rel="noopener" href="/gp/redirect.html/ref=cm_sw_cl_fa_awdb_t1_BHfIAbNWPFDXF?_encoding=UTF8&amp;location=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fshare%3F_encoding%3DUTF8%26display%3Dpopup%26href%3Dhttps%253A%252F%252Fwww.amazon.com%252Fdp%252FB00AYQNR46%252Fref%253Dcm_sw_r_fa_awdb_t1_BHfIAbNWPFDXF%26redirect_uri%3Dhttps%253A%252F%252Fwww.amazon.com%252Fgp%252Fpdp%252Ftaf%252Ffb_post_redirect.html%252Fref%253Dcm_sw_s_fa_awdb_t1_BHfIAbNWPFDXF%26app_id%3D164734381262%26hashtag%3D%2523Amazon&amp;token=E0915379AEBDF40D2C90D4882003C7011F43D80C">
<i id="swf-facebook-img" class="a-icon a-icon-share-facebook swf-sheet-icon" role="img" aria-label="Facebook"></i>
<span class="swf-network-share">Facebook</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;twitter&quot;,&quot;refId&quot;:&quot;tw&quot;}">
<div id="swf-sheet-twitter" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_blank" rel="noopener" href="/gp/redirect.html/ref=cm_sw_cl_tw_awdb_t1_BHfIAbNWPFDXF?_encoding=UTF8&amp;location=https%3A%2F%2Ftwitter.com%2Fintent%2Ftweet%3Foriginal_referer%3Dhttps%25253A%25252F%25252Fwww.amazon.com%25252Fgp%25252Faw%25252Fd%25252FB00AYQNR46%25252Fref%25253Dcm_sw_r_tw_awdb_t1_x_BHfIAbNWPFDXF%26text%3DSeven%2520Languages%2520in%2520Seven%2520Weeks%253A%2520A%2520Pragmatic%2520Guide%2520to%2520Learning%2520Programming%2520Lan...%26related%3Damazondeals%252Camazonmp3%26url%3Dhttps%253A%252F%252Fwww.amazon.com%252Fdp%252FB00AYQNR46%252Fref%253Dcm_sw_r_tw_awdb_t1_x_BHfIAbNWPFDXF%26via%3Damazon&amp;token=BC5273EAB1B7E571BD3622704B44890CC537FE04">
<i id="swf-twitter-img" class="a-icon a-icon-share-twitter swf-sheet-icon" role="img" aria-label="Twitter"></i>
<span class="swf-network-share">Twitter</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;whatsapp&quot;,&quot;refId&quot;:&quot;wa&quot;}">
<div id="swf-sheet-whatsapp" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_self" rel="noopener" href="whatsapp://send?text=Check%20this%20out%3A%20Seven%20Languages%20in%20Seven%20Weeks%3A%20A%20Pragmatic%20Guide%20to%20Learning%20Pro...%20https%3A%2F%2Fwww.amazon.com%2Fdp%2FB00AYQNR46%2Fref%3Dcm_sw_r_wa_awdb_t1_BHfIAbNWPFDXF">
<i id="swf-whatsapp-img" class="a-icon a-icon-share-whatsapp swf-sheet-icon" role="img"></i>
<span class="swf-network-share">WhatsApp </span>
</a>
</div>
<div id="swf_bottom_sheet_wa_not_installed_alert" class="a-box a-alert-inline a-alert-inline-error" aria-live="assertive" role="alert"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
It looks like WhatsApp is not installed on your phone. Please use a different way to share.
</div></div></div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;pinterest&quot;,&quot;refId&quot;:&quot;pi&quot;}">
<div id="swf-sheet-pinterest" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_blank" rel="noopener" href="/gp/redirect.html/ref=cm_sw_cl_pi_awdb_t1_BHfIAbNWPFDXF?_encoding=UTF8&amp;location=https%3A%2F%2Fpinterest.com%2Fpin%2Fcreate%2Fbutton%3Furl%3Dhttps%253A%252F%252Fwww.amazon.com%252Fdp%252FB00AYQNR46%252Fref%253Dcm_sw_r_pi_awdb_t1_x_BHfIAbNWPFDXF%26title%3DSeven%2520Languages%2520in%2520Seven%2520Weeks%253A%2520A%2520Pragmatic%2520Guide%2520to%2520Lear...%26description%3DSeven%2520Languages%2520in%2520Seven%2520Weeks%253A%2520A%2520Pragmatic%2520Guide%2520to%2520Lear...%2520https%253A%252F%252Fwww.amazon.com%252Fdp%252FB00AYQNR46%252Fref%253Dcm_sw_r_pi_awdb_t1_x_BHfIAbNWPFDXF%26media%3Dhttps%253A%252F%252Fimages-na.ssl-images-amazon.com%252Fimages%252FI%252F51LZT%25252BtSrTL.jpg&amp;token=49402B6CEDC244163E355CFF5E75B587C25D0183">
<i id="swf-pinterest-img" class="a-icon a-icon-share-pinterest swf-sheet-icon" role="img" aria-label="Pinterest"></i>
<span class="swf-network-share">Pinterest</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;copy&quot;,&quot;refId&quot;:&quot;cp&quot;}">
<div id="swf-sheet-copy" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_blank" rel="noopener" href="https://www.amazon.com/dp/B00AYQNR46/ref=cm_sw_r_cp_awdb_t1_BHfIAbNWPFDXF">
<i id="swf-copy-img" class="a-icon a-icon-share-link swf-sheet-icon" role="img"></i>
<div class="a-section swf-copy-manual">
<span id="swf-copy-link">Copy</span><br>
<span id="swf-copy-instruction">press and hold to copy</span>
</div>
</a>
</div>
</span>
</div></div>
</div><div id="persistentWidget_feature_div" data-feature-name="persistentWidget" data-template-name="persistentWidget" class="a-section a-spacing-none feature t-prnt t-full">
<style>
.nfcx-mobile-container {
margin-left: -14px;
margin-right: -14px;
border-bottom: 1px;
padding-bottom: 14px;
border-top: 1px;
border-bottom-style: solid;
border-bottom-color: #979797;
border-top-color: #979797;
border-top-style: solid;
}
.pw-mobile-imagePosition {
margin-left: -14px;
}
</style>
</div><div id="promotions_feature_div" data-feature-name="promotions" data-template-name="promotions" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="FeatureAwarenessWidgetMobile_feature_div" data-feature-name="FeatureAwarenessWidgetMobile" data-template-name="FeatureAwarenessWidgetMobile" class="a-section a-spacing-none feature">
<script type="text/javascript">
if (typeof uet == 'function') {
uet('bb', 'featureWidget', {wb: 1});
}
</script>
<div class="a-section a-spacing-small" role="heading">
<h2>
Kindle Feature Spotlight
</h2>
</div>
<div data-a-carousel-options="{&quot;name&quot;:&quot;faw-carousel&quot;}" data-a-display-strategy="fawDisplay" data-a-transition-strategy="fawTransition" class="a-begin a-carousel-container a-carousel-display-fawDisplay a-carousel-transition-fawTransition"><input autocomplete="on" type="hidden" class="a-carousel-firstvisibleitem">
<div class="a-carousel-viewport"><ol class="a-carousel" role="list">
<li data-gif-tag="dbs_p_ebk_w0m_abfs_dipg00_0" data-gif-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/read_anywhere_gif._CB493748989_.gif" data-img-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/read_anywhere_img._CB490311866_.png" data-ref-tag="dbs_p_ebk_w0m_abfs_divf00_0" class="a-carousel-card fawCarouselCard" role="listitem">
<img alt="Search" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/read_anywhere_img._CB490311866_.png" class="fawPrimaryImage">
<video class="fawVideoPrimary" preload="none" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/read_anywhere_vid._CB493755271_.mp4">
</video>
<img alt="" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/read_anywhere_gif._CB493748989_.gif" class="fawPreloadGif">
</li>
<li data-gif-tag="dbs_p_ebk_w0m_abfs_dipg00_1" data-gif-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/page_flip_gif._CB505986127_.gif" data-img-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/page_flip_img._CB511393065_.png" data-ref-tag="dbs_p_ebk_w0m_abfs_divf00_1" class="a-carousel-card fawCarouselCard" role="listitem">
<img alt="Page Flip" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/page_flip_img._CB511393065_.png" class="fawPrimaryImage">
<video class="fawVideoPrimary" preload="none" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/page_flip_vid._CB511209878_.mp4">
</video>
</li>
<li data-gif-tag="dbs_p_ebk_w0m_abfs_dipg00_2" data-gif-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/search_gif._CB493748989_.gif" data-img-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/search_img._CB490353691_.png" data-ref-tag="dbs_p_ebk_w0m_abfs_divf00_2" class="a-carousel-card fawCarouselCard" role="listitem">
<img alt="Search" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/search_img._CB490353691_.png" class="fawPrimaryImage">
<video class="fawVideoPrimary" preload="none" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/search_vid._CB493756334_.mp4">
</video>
</li>
<li data-gif-tag="dbs_p_ebk_w0m_abfs_dipg00_3" data-gif-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/note_taking_gif._CB511393522_.gif" data-img-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/note_taking_img._CB511393115_.png" data-ref-tag="dbs_p_ebk_w0m_abfs_divf00_3" class="a-carousel-card fawCarouselCard" role="listitem">
<img alt="Notes &amp; Highlights" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/note_taking_img._CB511393115_.png" class="fawPrimaryImage">
<video class="fawVideoPrimary" preload="none" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/note_taking_vid._CB507148542_.mp4">
</video>
</li>
<li data-gif-tag="dbs_p_ebk_w0m_abfs_dipg00_4" data-gif-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/adjustable_fonts_gif._CB511393633_.gif" data-img-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/adjustable_fonts_img._CB511393101_.png" data-ref-tag="dbs_p_ebk_w0m_abfs_divf00_4" class="a-carousel-card fawCarouselCard" role="listitem">
<img alt="Adjustable Type" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/adjustable_fonts_img._CB511393101_.png" class="fawPrimaryImage">
<video class="fawVideoPrimary" preload="none" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/adjustable_fonts_vid._CB507148487_.mp4">
</video>
</li>
<li data-gif-tag="dbs_p_ebk_w0m_abfs_dipg00_5" data-gif-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/sharing_gif._CB511392085_.gif" data-img-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/sharing_img._CB511393056_.png" data-ref-tag="dbs_p_ebk_w0m_abfs_divf00_5" class="a-carousel-card fawCarouselCard" role="listitem">
<img alt="Sharing" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/sharing_img._CB511393056_.png" class="fawPrimaryImage">
<video class="fawVideoPrimary" preload="none" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/sharing_vid._CB507150195_.mp4">
</video>
</li>
<li data-gif-tag="dbs_p_ebk_w0m_abfs_dipg00_6" data-gif-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/prime_gif._CB489978105_.gif" data-img-url="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/prime_img._CB489977888_.png" data-ref-tag="dbs_p_ebk_w0m_abfs_divf00_6" class="a-carousel-card fawCarouselCard" role="listitem">
<img alt="X-Ray for Textbooks" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/prime_img._CB489977888_.png" class="fawPrimaryImage">
<video class="fawVideoPrimary" preload="none" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/prime_vid._CB489977857_.mp4">
</video>
</li>
</ol></div>
<span class="a-end aok-hidden"></span></div>
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;name&quot;:&quot;feature-awareness-secondary-view&quot;}">
<a class="a-size-base a-spacing-base a-spacing-top-base a-link-normal seeAllFeaturesLink" href="#">
</a>
</span>
<div class="a-popover-preload" id="a-popover-feature-awareness-secondary-view">
<div data-ref-tag="dbs_p_ebk_w0m_abfp_divf00_1" class="a-section a-spacing-medium fawPopCard" role="rowgroup">
<div class="a-row">
<div class="a-column a-span6">
<img alt="Page Flip" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/page_flip_img_secondary._CB510093554_.png" class="fawPopImage">
<video class="fawVideoSecondary" preload="none" controls="" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/page_flip_vid._CB511209878_.mp4">
</video>
</div>
<div class="a-column a-span6 a-span-last">
<div class="a-section a-spacing-mini" role="rowheader">
<a class="a-size-small a-link-emphasis featurePopVideoLink a-text-bold" href="#">
Page Flip
</a>
</div>
<div aria-live="polite" data-a-expander-name="fawExpander" data-a-expander-collapsed-height="100" class="a-expander-collapsed-height a-row a-expander-container a-spacing-base a-expander-partial-collapse-container" style="max-height:100px; _height:100px">
<div aria-expanded="false" class="a-expander-content fawExpanderContent a-expander-partial-collapse-content" style="">
<span class="a-size-small">
Zoom out and explore your books. Page Flip saves your place. Page Flip is available on select Kindle E-readers, Fire tablets, and the free Kindle app for iOS and Android.
</span>
</div>
<div class="a-expander-header a-expander-partial-collapse-header fawExpanderHeading a-color-base-background" style="opacity: 0; display: none;"><div class="a-expander-content-fade"></div><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;See More&quot;, &quot;collapse_prompt&quot;:&quot;See Less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">See More</span></a></div>
</div>
</div>
</div>
</div>
<div data-ref-tag="dbs_p_ebk_w0m_abfp_divf00_3" class="a-section a-spacing-medium fawPopCard" role="rowgroup">
<div class="a-row">
<div class="a-column a-span6">
<img alt="Notes &amp; Highlights" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/note_taking_img_secondary._CB510093565_.png" class="fawPopImage">
<video class="fawVideoSecondary" preload="none" controls="" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/note_taking_vid._CB507148542_.mp4">
</video>
</div>
<div class="a-column a-span6 a-span-last">
<div class="a-section a-spacing-mini" role="rowheader">
<a class="a-size-small a-link-emphasis featurePopVideoLink a-text-bold" href="#">
Notes &amp; Highlights
</a>
</div>
<div aria-live="polite" data-a-expander-name="fawExpander" data-a-expander-collapsed-height="100" class="a-expander-collapsed-height a-row a-expander-container a-spacing-base a-expander-partial-collapse-container" style="max-height:100px; _height:100px">
<div aria-expanded="false" class="a-expander-content fawExpanderContent a-expander-partial-collapse-content" style="">
<span class="a-size-small">
Capture memorable moments and ideas from your books. You can add or remove highlights and notes at any location in a Kindle book.
</span>
</div>
<div class="a-expander-header a-expander-partial-collapse-header fawExpanderHeading a-color-base-background" style="opacity: 0; display: none;"><div class="a-expander-content-fade"></div><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;See More&quot;, &quot;collapse_prompt&quot;:&quot;See Less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">See More</span></a></div>
</div>
</div>
</div>
</div>
<div data-ref-tag="dbs_p_ebk_w0m_abfp_divf00_4" class="a-section a-spacing-medium fawPopCard" role="rowgroup">
<div class="a-row">
<div class="a-column a-span6">
<img alt="Adjustable Type" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/adjustable_fonts_img_secondary._CB510093337_.png" class="fawPopImage">
<video class="fawVideoSecondary" preload="none" controls="" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/adjustable_fonts_vid._CB507148487_.mp4">
</video>
</div>
<div class="a-column a-span6 a-span-last">
<div class="a-section a-spacing-mini" role="rowheader">
<a class="a-size-small a-link-emphasis featurePopVideoLink a-text-bold" href="#">
Adjustable Type
</a>
</div>
<div aria-live="polite" data-a-expander-name="fawExpander" data-a-expander-collapsed-height="100" class="a-expander-collapsed-height a-row a-expander-container a-spacing-base a-expander-partial-collapse-container" style="max-height:100px; _height:100px">
<div aria-expanded="false" class="a-expander-content fawExpanderContent a-expander-partial-collapse-content" style="">
<span class="a-size-small">
Personalize your reading experience with adjustable type sizes and unique fonts chosen specifically for great reading experiences and accessibility. Page layout and margins automatically adapt to work well at even the largest font sizes.
</span>
</div>
<div class="a-expander-header a-expander-partial-collapse-header fawExpanderHeading a-color-base-background" style="opacity: 0; display: none;"><div class="a-expander-content-fade"></div><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;See More&quot;, &quot;collapse_prompt&quot;:&quot;See Less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">See More</span></a></div>
</div>
</div>
</div>
</div>
<div data-ref-tag="dbs_p_ebk_w0m_abfp_divf00_5" class="a-section a-spacing-medium fawPopCard" role="rowgroup">
<div class="a-row">
<div class="a-column a-span6">
<img alt="Sharing" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/sharing_img_secondary._CB510093540_.png" class="fawPopImage">
<video class="fawVideoSecondary" preload="none" controls="" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/sharing_vid._CB507150195_.mp4">
</video>
</div>
<div class="a-column a-span6 a-span-last">
<div class="a-section a-spacing-mini" role="rowheader">
<a class="a-size-small a-link-emphasis featurePopVideoLink a-text-bold" href="#">
Sharing
</a>
</div>
<div aria-live="polite" data-a-expander-name="fawExpander" data-a-expander-collapsed-height="100" class="a-expander-collapsed-height a-row a-expander-container a-spacing-base a-expander-partial-collapse-container" style="max-height:100px; _height:100px">
<div aria-expanded="false" class="a-expander-content fawExpanderContent a-expander-partial-collapse-content" style="">
<span class="a-size-small">
Recommend books and share quotes with friends. Your friends can instantly start reading the book youve shared. Discover the new sharing experience on Kindle for Android, Kindle for iOS, and your Fire tablet today.
</span>
</div>
<div class="a-expander-header a-expander-partial-collapse-header fawExpanderHeading a-color-base-background" style="opacity: 0; display: none;"><div class="a-expander-content-fade"></div><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;See More&quot;, &quot;collapse_prompt&quot;:&quot;See Less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">See More</span></a></div>
</div>
</div>
</div>
</div>
<div data-ref-tag="dbs_p_ebk_w0m_abfp_divf00_6" class="a-section a-spacing-medium fawPopCard" role="rowgroup">
<div class="a-row">
<div class="a-column a-span6">
<img alt="X-Ray for Textbooks" src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/prime_img._CB489977888_.png" class="fawPopImage">
<video class="fawVideoSecondary" preload="none" controls="" controlslist="nodownload noremote">
<source src="https://images-na.ssl-images-amazon.com/images/G/01/kindle/detail/faw/prime_vid._CB489977857_.mp4">
</video>
</div>
<div class="a-column a-span6 a-span-last">
<div class="a-section a-spacing-mini" role="rowheader">
<a class="a-size-small a-link-emphasis featurePopVideoLink a-text-bold" href="#">
X-Ray for Textbooks
</a>
</div>
<div aria-live="polite" data-a-expander-name="fawExpander" data-a-expander-collapsed-height="100" class="a-expander-collapsed-height a-row a-expander-container a-spacing-base a-expander-partial-collapse-container" style="max-height:100px; _height:100px">
<div aria-expanded="false" class="a-expander-content fawExpanderContent a-expander-partial-collapse-content" style="">
<span class="a-size-small">
X-Ray for Textbooks description
</span>
</div>
<div class="a-expander-header a-expander-partial-collapse-header fawExpanderHeading a-color-base-background" style="opacity: 0; display: none;"><div class="a-expander-content-fade"></div><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;See More&quot;, &quot;collapse_prompt&quot;:&quot;See Less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">See More</span></a></div>
</div>
</div>
</div>
</div>
<div id="faw-pop-video-overlay" class="a-section ebook-video-overlay ebook-video-overlay-hidden">
<div id="faw-pop-lightbox-dark" class="a-section ebook-lightbox-dark faw-lightbox-dark"></div>
<a id="faw-pop-lightbox-video-close" class="a-link-normal ebook-lightbox-video-close faw-lightbox-video-close" href="#"></a>
<div id="faw-pop-lightbox" class="a-section ebook-lightbox">
<div id="faw-pop-airy-player-container" class="a-section airy-player-container">
</div>
</div>
</div>
</div>
<script type="text/javascript">
if (typeof uex == 'function') {
uex('ld', 'featureWidget', {wb: 1});
}
</script>
</div><div id="AboutKindleEditionMobile_feature_div" data-feature-name="AboutKindleEditionMobile" data-template-name="AboutKindleEditionMobile" class="a-section a-spacing-none feature">
<div class="a-section a-spacing-small">
<h2>About the Kindle Edition</h2>
</div>
<div class="a-section a-spacing-large">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;closeButtonLabel&quot;:&quot;Close&quot;,&quot;name&quot;:&quot;about_kindle_edition_secondary_view_div&quot;,&quot;popoverLabel&quot;:&quot;About the Kindle Edition&quot;}">
<a id="aboutKindleEditionButton" href="#" class="a-touch-link a-box" role="link"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<li><span class="a-list-item">
Length: 330 pages
</span></li>
<li><span class="a-list-item">
<span>
Screen Reader: Supported
</span>
</span></li>
<li><span class="a-list-item">
Enhanced Typesetting: Enabled
</span></li>
<li><span class="a-list-item">
<span>
Page Flip: Enabled
</span>
</span></li>
<li><span class="a-list-item">
See all supported devices
</span></li>
</div></a>
</span>
</div>
<div class="a-popover-preload" id="a-popover-about_kindle_edition_secondary_view_div">
<div class="a-section a-spacing-small">
<h3> Length: 330 pages </h3>
Based on the print edition (ISBN 9781934356593).
</div>
<hr class="a-divider-text">
<div class="a-section a-spacing-small">
<h3>Screen Reader: Supported</h3>
<span>
The text of this eBook can be read by many popular screen readers: VoiceView on Fire Tablets and Kindle E-readers, VoiceOver on iOS, TalkBack on Android, and NVDA on Windows. Descriptive text for images (known as “ALT text”) can be read using the Kindle for PC app if the publisher has included it. If this eBook contains other types of non-text content (for example, some charts and math equations), that content will not currently be read by screen readers. See the Kindle Accessibility page to learn more
</span>
</div>
<hr class="a-divider-text">
<div class="a-section a-spacing-small">
<h3>Enhanced Typesetting: Enabled</h3>
Enhanced typesetting improvements offer faster reading with less eye strain and beautiful page layouts, even at larger font sizes.
</div>
<hr class="a-divider-text">
<div class="a-section a-spacing-small">
<h3>Page Flip: Enabled</h3>
<span>
Page Flip is a new way to explore your books without losing your place.
</span>
</div>
<hr class="a-divider-text">
<div class="a-section a-spacing-small">
<h3>See all supported devices</h3>
<div class="a-row">
<div class="a-column a-span3">
<span class="a-text-bold">
Kindle e-Readers
</span>
<ul class="a-unordered-list a-nostyle a-vertical">
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B007HCCNJU/ref=con_dp_avail_kin_sz">
Kindle (5th Generation)
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B002Y27P3M/ref=con_dp_avail_kink_w">
Kindle Keyboard
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B002GYWHSQ/ref=con_dp_avail_kindx">
Kindle DX
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B0015T963C/ref=con_dp_avail_kin2">
Kindle (2nd Generation)
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B000FI73MA/ref=con_dp_avail_kin1">
Kindle (1st Generation)
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00AWVXK5O/ref=con_dp_avail_kint_p">
Kindle Paperwhite
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B007OZNZG0/ref=con_dp_avail_kint_c">
Kindle Paperwhite (5th Generation)
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B005890G8Y/ref=con_dp_avail_kint_w">
Kindle Touch
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00IOY8XWQ/ref=con_dp_avail_kint_i">
Kindle Voyage
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00I15SB16/ref=con_dp_avail_kint_b">
Kindle
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00REQKWGA/ref=con_dp_avail_kint_o">
Kindle Oasis
</a>
</span></li>
</ul>
</div>
<div class="a-column a-span3">
<span class="a-text-bold">
Fire Tablets
</span>
<ul class="a-unordered-list a-nostyle a-vertical">
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00DOPNLJ0/ref=con_dp_avail_kin_ap">
Kindle Fire HDX 8.9''
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00DOPNO4M/ref=con_dp_avail_kin_th">
Kindle Fire HDX
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00CU0NSCU/ref=con_dp_avail_kin_so">
Kindle Fire HD (3rd Generation)
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00HCNHDN0/ref=con_dp_avail_kin_sa">
Fire HDX 8.9 Tablet
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00IKPYKWG/ref=con_dp_avail_kin_as">
Fire HD 7 Tablet
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00KC6I06S/ref=con_dp_avail_kin_ar">
Fire HD 6 Tablet
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B008GFRE5A/ref=con_dp_avail_kin_j">
Kindle Fire HD 8.9"
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B008GGCAVM/ref=con_dp_avail_kin_t">
Kindle Fire HD(1st Generation)
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B0083Q04IQ/ref=con_dp_avail_kin_f2">
Kindle Fire(2nd Generation)
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B0051VVOB2/ref=con_dp_avail_kinf">
Kindle Fire(1st Generation)
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00VKIY9RG/ref=con_dp_avail_kin_ap">
Fire HD 10
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00UIECE5M/ref=con_dp_avail_kin_th">
Fire HD 8
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00TSUGXKE/ref=con_dp_avail_kin_so">
Fire
</a>
</span></li>
</ul>
</div>
<div class="a-column a-span3">
<span class="a-text-bold">
Fire Phones
</span>
<ul class="a-unordered-list a-nostyle a-vertical">
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/product/B00EOE0WKQ/ref=con_dp_avail_kin_dk">
Fire Phone
</a>
</span></li>
</ul>
</div>
<div class="a-column a-span3 a-span-last">
<span class="a-text-bold">
Free Kindle Reading Apps
</span>
<ul class="a-unordered-list a-nostyle a-vertical">
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html?ie=UTF8&amp;docId=1000844301">
Kindle for Windows 8
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_wp_mkt_lnd?docId=1000623751">
Kindle for Windows Phone
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_bb_mkt_lnd?docId=1000468551">
Kindle for BlackBerry
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_red_mkt_lnd?docId=165849822">
Kindle for Android Phones
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_red_mkt_lnd?docId=165849822">
Kindle for Android Tablets
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_iph_mkt_lnd?docId=1000301301">
Kindle for iPhone
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_ipod_mkt_lnd?docId=1000301301">
Kindle for iPod Touch
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_ipad_mkt_lnd?docId=1000490441">
Kindle for iPad
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_mac_mkt_lnd?docId=1000464931">
Kindle for Mac
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html/ref=kcp_pc_mkt_lnd?docId=1000426311">
Kindle for PC
</a>
</span></li>
<li><span class="a-list-item">
<a class="a-link-normal" href="/gp/feature.html?ie=UTF8&amp;docId=1000579091">
Kindle Cloud Reader
</a>
</span></li>
</ul>
</div>
</div>
</div>
<hr class="a-divider-text">
<div class="a-section a-spacing-small">
<h3> Text to Speech: Enabled </h3>
Text-to-Speech is available for Kindle Touch, Kindle Keyboard, Kindle (2nd generation), and Kindle DX.
</div>
<hr class="a-divider-text">
</div>
</div><div id="ebooksBackgroundImage_feature_div" data-feature-name="ebooksBackgroundImage" data-template-name="ebooksBackgroundImage" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="mobile_aboutThisItemFeature_feature_div" data-feature-name="mobile_aboutThisItemFeature" data-template-name="mobile_aboutThisItemFeature" class="a-section a-spacing-none feature">
<div class="a-row a-spacing-large celwidget">
<div class="a-column a-span12">
<h2 class="a-box-title">About this item
</h2>
<div id="aboutThisItemFeature_boxGroup" class="a-box-group">
<div class="a-box feature"><div class="a-box-inner">
<div id="aplus_feature_div" data-feature-name="aplus" data-template-name="aplus" class="a-section a-spacing-none">
<h3>From the manufacturer</h3>
<div class="aplus-v2 mobile celwidget" cel_widget_id="m-aplus">
<style type="text/css">
.aplus-v2.mobile {display:inherit}
.aplus-v2.mobile .aplus-module {
min-width:inherit;
margin-bottom: 21px;
}
.aplus-v2.mobile .apm-sidemodule {width:inherit}
.aplus-v2.mobile .apm-fixed-width {width:inherit}
/* module-5 */
.aplus-v2.mobile .module-5{overflow:auto}
.aplus-v2.mobile .aplus-module-wrapper {
display: block;
}
.aplus-v2.mobile img.apm-middle-image {
vertical-align: middle;
}
.aplus-v2.mobile .apm-iconheader {
display: inline;
}
.aplus-v2.mobile .apm-tablemodule {
text-align: left;
}
.aplus-v2.mobile .apm-tablemodule-image {
background-color: #FFFFFF;
padding: 0 !important;
text-align: center;
overflow: hidden;
vertical-align: bottom;
}
.aplus-v2.mobile .apm-tablemodule-table .aplus-table-heading {
padding-bottom: 8px;
text-align: center;
}
.aplus-v2.mobile .apm-tablemodule-keyhead {
border-top: 1px solid #dddddd;
padding: 8px 14px 6px !important;
background-color: #f7f7f7;
font-weight: normal;
color: #626262;
float: none !important;
margin-right: 0;
text-align: center;
min-width: 106px;
}
.aplus-v2.mobile .apm-tablemodule-keyhead {
border-right: 1px solid #dddddd;
}
.aplus-v2.mobile .apm-tablemodule-keyvalue .aplus-table-data {
padding-top: 8px !important;
padding-left: 14px;
padding-bottom: 8px;
border-top: 1px solid #dddddd;
border-bottom: 1px solid #dddddd;
min-width: 150px;
}
.aplus-v2.mobile .apm-tablemodule-image {
background-color: #FFFFFF;
padding: 0 !important;
text-align: center;
overflow: hidden;
vertical-align: bottom;
}
.aplus-v2.mobile .apm-tablemodule-table .table-heading {
padding-bottom: 8px;
text-align: center;
}
.aplus-v2.mobile .apm-tablemodule-valuecell.selected {
background-color: #fff5ec;
}
</style>
<script>
if(P) {
P.when("a-expander").execute(function (expander) {
expander.initializeExpanders();
});
}
</script>
<script>
if(P) {
P.when("A","ready").execute(function (A) {
A.on('a:expander:aplus-module-expander:toggle:collapse', function(e) {
var $ = A.$;
var topOffset = $(e.expander.$expander[0]).offset().top;
if ($(window).scrollTop() > topOffset) {
$('html, body').animate({ scrollTop: topOffset });
}
});
});
}
</script>
<div class="celwidget aplus-module module-5" cel_widget_id="aplus-m-module-5">
<div class="aplus-module-wrapper">
<div class="apm-spacing">
<div class="apm-tablemodule">
<table class="a-normal a-align-center a-spacing-none apm-tablemodule-table">
<tbody><tr class="apm-tablemodule-imagerows">
<th class="aplus-table-heading apm-tablemodule-blankkeyhead"></th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/193435659X"><img alt="Seven Languages in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/a300f6d7-7341-4a32-bab1-b66533b350ed.jpg._CB276699932__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1941222153"><img alt="Seven More Languages in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/e453c406-cbd6-44c9-a4e2-c10453614bc2.jpg._CB276699931__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1934356921"><img alt="Seven Databases in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/35736e8d-2d1c-493c-a932-0525a4e5b730.jpg._CB276699926__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1937785637"><img alt="Seven Web Frameworks in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/67654a0e-5def-427f-a386-fea3cbd594bf.jpg._CB276700139__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1937785653"><img alt="Seven Concurrency Models in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/67da9c9b-ddc2-446b-92bb-49b96a4986ed.jpg._CB276700135__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1680501488"><img alt="Seven Mobile Apps in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/83c6fa81-f098-4b6e-9102-efbb3c59b46b.jpg._CB276700128__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
</tr>
<tr class="apm-tablemodule-imagerows">
<th class="aplus-table-heading apm-tablemodule-blankkeyhead"></th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/193435659X">Seven Languages in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1941222153">Seven More Languages in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1934356921">Seven Databases in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1937785637">Seven Web Frameworks in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1937785653">Seven Concurrency Models in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1680501488">Seven Mobile Apps in Seven Weeks</a>
</th>
</tr>
<tr class="apm-tablemodule-keyvalue">
<th class="aplus-table-heading apm-tablemodule-keyhead">
<span class="a-size-base a-text-normal a-color-secondary">
Subtitle
</span>
</th>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
A Pragmatic Guide to Learning Programming Languages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Languages That Are Shaping the Future
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
A Guide to Modern Databases and the NoSQL Movement
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Adventures in Better Web Apps
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
When Threads Unravel
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Native Apps, Multiple Platforms
</span>
</td>
</tr>
<tr class="apm-tablemodule-keyvalue">
<th class="aplus-table-heading apm-tablemodule-keyhead">
<span class="a-size-base a-text-normal a-color-secondary">
Content Coverage
</span>
</th>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Lua, Factor, Elixir, Elm, Julia, MiniKanren, and Idris
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Redis, Neo4J, CouchDB, MongoDB, HBase, Riak and Postgres
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Sinatra, CanJS, AngularJS, Ring, Webmachine, Yesod, and Immutant
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Threads &amp; locks, functional programming, separating identity &amp; state, actors, sequential processes, data parallelism, and the lambda architecture
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
iOS, Android, Windows, RubyMotion, React Native, and Xamarin
</span>
</td>
</tr>
<tr class="apm-tablemodule-keyvalue">
<th class="aplus-table-heading apm-tablemodule-keyhead">
<span class="a-size-base a-text-normal a-color-secondary">
Pages
</span>
</th>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
328 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
320 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
354 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
304 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
300 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
360 pages
</span>
</td>
</tr>
</tbody></table>
</div>
</div>
</div>
</div>
</div>
</div>
</div></div>
<div class="a-box feature"><div class="a-box-inner">
<div id="productDescription_feature_div" data-feature-name="productDescription" data-template-name="productDescription" class="a-section a-spacing-none">
<div class="a-section">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;data&quot;:{&quot;secViewId&quot;:&quot;productDescription_secondary_view_div&quot;},&quot;name&quot;:&quot;productDescription_secondary_view_div&quot;}">
<a href="#" class="a-touch-link a-box a-touch-link-noborder"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<h3>
Description
</h3>
<div id="productDescription" class="a-section a-spacing-small">
<p class="a-color-base" dir="auto">
You should learn a programming language every year, as recommended by The Pragmatic Programmer. But if one per year is good, how about Seven Languages in Seven Weeks? In this book you'll get a hands-o ...
</p>
</div>
</div></a>
</span>
<script type="text/javascript">
P.when('jQuery','A', 'a-popover-base', 'a-popover-ajax').execute(function($, A, popovers, popoverAjax) {
A.on("a:popover:beforeShow:productDescription_secondary_view_div", function(data){
P.now('dpmob-sec-view-instrumentation').execute(function(secViewInstrumentation){
if(typeof secViewInstrumentation !== "undefined") {
// Record the click time before showing the secondary view.
secViewInstrumentation.recordClickTime('productDescription');
}
});
});
A.on("a:popover:afterShow:productDescription_secondary_view_div", function(data){
var featureName = 'productDescription';
P.now('dpmob-sec-view-instrumentation').execute(function(secViewInstrumentation){
if(typeof secViewInstrumentation !== "undefined") {
// Record the end time once the secondary view is shown.
secViewInstrumentation.recordEndTime(featureName);
// Post the recorded metrics
secViewInstrumentation.postMetrics(featureName);
}
});
});
});
</script>
<div class="a-popover-preload" id="a-popover-productDescription_secondary_view_div">
<h3>
Description
</h3>
<div id="productDescription_fullView">
<h3>Product Description</h3>
<div class="a-section a-spacing-large">
<p></p><p>You should learn a programming language every year, as recommended by <i>The Pragmatic Programmer</i>. But if one per year is good, how about <i>Seven Languages in Seven Weeks</i>? In this book you'll get a hands-on tour of Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby. Whether or not your favorite language is on that list, you'll broaden your perspective of programming by examining these languages side-by-side. You'll learn something new from each, and best of all, you'll learn how to learn a language quickly.<br><br>Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell. With <i>Seven Languages in Seven Weeks,</i> by Bruce A. Tate, you'll go beyond the syntax-and beyond the 20-minute tutorial you'll find someplace online. This book has an audacious goal: to present a meaningful exploration of seven languages within a single book. Rather than serve as a complete reference or installation guide, <i>Seven Languages</i> hits what's essential and unique about each language. Moreover, this approach will help teach you how to grok new languages.<br><br>For each language, you'll solve a nontrivial problem, using techniques that show off the language's most important features. As the book proceeds, you'll discover the strengths and weaknesses of the languages, while dissecting the process of learning languages quickly--for example, finding the typing and programming models, decision structures, and how you interact with them.<br><br>Among this group of seven, you'll explore the most critical programming models of our time. Learn the dynamic typing that makes Ruby, Python, and Perl so flexible and compelling. Understand the underlying prototype system that's at the heart of JavaScript. See how pattern matching in Prolog shaped the development of Scala and Erlang. Discover how pure functional programming in Haskell is different from the Lisp family of languages, including Clojure.<br><br>Explore the concurrency techniques that are quickly becoming the backbone of a new generation of Internet applications. Find out how to use Erlang's let-it-crash philosophy for building fault-tolerant systems. Understand the actor model that drives concurrency design in Io and Scala. Learn how Clojure uses versioning to solve some of the most difficult concurrency problems.<br><br>It's all here, all in one place. Use the concepts from one language to find creative solutions in another-or discover a language that may become one of your favorites.</p><p></p>
</div>
<h3>Review</h3>
<div class="a-section a-spacing-large">
<p></p><p>""I have been programming for 25 years in a variety of hardware and software languages. After reading Seven Languages in Seven Weeks, I am starting to understand how to evaluate languages for their objective strengths and weaknesses. More importantly, I feel as if I could pick one of them to actually get some work done.""--Chris Kappler, Senior scientist Raytheon, BBN Technologies<br><br></p><p>""I spent most of my time as a computer sciences student saying I didn't want to be a software developer and then became one anyway. Seven Languages in Seven Weeks expanded my way of thinking about problems and reminded me what I love about programming.""--Travis Kaspar, Software engineer, Northrop Grumman<br><br></p><p>""Do you want seven kick starts into learning your "language of the year"? Do you want your thinking challenged about programming in general? Look no further than this book. I personally was taken back in time to my undergraduate computer science days, coasting through my programming languages survey course. The difference is that Bruce won't let you coast through this course! This isn't a leisurely read--you'll have to work this book. I believe you'll find it both mindblowing and intensely practical at the same time.""--Matt Stine Group leader, Research Application Development, St. Jude Children's Research Hospital</p>
</div>
<h3>About the Author</h3>
<div class="a-section a-spacing-large">
<p></p><div><p>Bruce Tate runs RapidRed, an Austin, TX-based practice that consults on lightweight development in Ruby. Previously he worked at IBM in roles ranging from a database systems programmer to Java consultant. He left IBM to work for several startups in roles ranging from Client Solutions Director to CTO. He speaks internationally and is the author of more than ten books, including From Java to Ruby, Deploying Rails Applications, the best-selling Bitter series, Beyond Java, and the Jolt-winning Better, Faster, Lighter Java.</p></div><p></p>
</div>
</div>
</div>
</div>
</div>
</div></div>
<div class="a-box feature"><div class="a-box-inner">
<div id="featureBulletsAndDetailBullets_feature_div" data-feature-name="featureBulletsAndDetailBullets" data-template-name="featureBulletsAndDetailBullets" class="a-section a-spacing-none">
<div class="a-section">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;data&quot;:{&quot;secViewId&quot;:&quot;featureBulletsAndDetailBullets_secondary_view_div&quot;},&quot;name&quot;:&quot;featureBulletsAndDetailBullets_secondary_view_div&quot;}">
<a href="#" class="a-touch-link a-box a-touch-link-noborder"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<h3>
Features &amp; details
</h3>
<div id="detailBullets_feature_div">
<style type="text/css">
#detailBullets_feature_div a {
color: #333;
display: inline;
}
#featureBulletsAndDetailBullets_feature_div .a-box-inner {
padding-left: 0px;
}
#featureBulletsAndDetailBullets_feature_div .a-icon {
right: 0;
}
#detailBullets_feature_div {
padding: 0 2.5em 0 0;
}
</style>
<div class="a-section">
<ul class="a-unordered-list a-nostyle a-vertical a-spacing-none">
<li><span class="a-list-item">
<span class="a-text-bold">
Publication date:
</span>
<span>November 10, 2010</span>
</span></li>
<li><span class="a-list-item">
<span class="a-text-bold">
Publisher:
</span>
<span>Pragmatic Bookshelf</span>
</span></li>
<li><span class="a-list-item">
<span class="a-text-bold">
Language:
</span>
<span>English</span>
</span></li>
</ul>
</div>
</div>
</div></a>
</span>
<script type="text/javascript">
P.when('jQuery','A', 'a-popover-base', 'a-popover-ajax').execute(function($, A, popovers, popoverAjax) {
A.on("a:popover:beforeShow:featureBulletsAndDetailBullets_secondary_view_div", function(data){
P.now('dpmob-sec-view-instrumentation').execute(function(secViewInstrumentation){
if(typeof secViewInstrumentation !== "undefined") {
// Record the click time before showing the secondary view.
secViewInstrumentation.recordClickTime('featureBulletsAndDetailBullets');
}
});
});
A.on("a:popover:afterShow:featureBulletsAndDetailBullets_secondary_view_div", function(data){
var featureName = 'featureBulletsAndDetailBullets';
P.now('dpmob-sec-view-instrumentation').execute(function(secViewInstrumentation){
if(typeof secViewInstrumentation !== "undefined") {
// Record the end time once the secondary view is shown.
secViewInstrumentation.recordEndTime(featureName);
// Post the recorded metrics
secViewInstrumentation.postMetrics(featureName);
}
});
});
});
</script>
<div class="a-popover-preload" id="a-popover-featureBulletsAndDetailBullets_secondary_view_div">
<h1>
About this item
</h1>
<div id="detailBullets_secondary_view_div" class="a-section">
<h3>
Product Details
</h3>
<style type="text/css">
#detailBullets_feature_div a {
color: #333;
display: inline;
}
#featureBulletsAndDetailBullets_feature_div .a-box-inner {
padding-left: 0px;
}
#featureBulletsAndDetailBullets_feature_div .a-icon {
right: 0;
}
#detailBullets_feature_div {
padding: 0 2.5em 0 0;
}
</style>
<div class="a-section">
<ul class="a-unordered-list a-nostyle a-vertical a-spacing-none">
<li><span class="a-list-item">
<span class="a-text-bold">
Publication date:
</span>
<span>November 10, 2010</span>
</span></li>
<li><span class="a-list-item">
<span class="a-text-bold">
Publisher:
</span>
<span>Pragmatic Bookshelf</span>
</span></li>
<li><span class="a-list-item">
<span class="a-text-bold">
Language:
</span>
<span>English</span>
</span></li>
<li><span class="a-list-item">
<span class="a-text-bold">
ASIN:
</span>
<span>B00AYQNR46</span>
</span></li>
<li><span class="a-list-item">
<span class="a-text-bold">
Amazon.com Sales Rank:
</span>
375493
</span></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div></div>
</div>
</div>
</div>
</div><script type="a-state" data-a-state="{&quot;key&quot;:&quot;sitb-btf-state&quot;}">{"endActionImage":"https://images-na.ssl-images-amazon.com/images/I/51LZT%2BtSrTL._SL110_.jpg","resizedImage":"https://images-na.ssl-images-amazon.com/images/I/91mt-Lita1L._SL480_.jpg","asin":"B00AYQNR46"}</script>
<script>
P.when('A', 'ready').execute(function (A) {
var $ = A.$;
var sitbStickerState = A.state('sitb-sticker-state');
var sitbBTFState = A.state('sitb-btf-state');
if (sitbStickerState && sitbStickerState.isSupportedSurface) {
var canLookInside = sitbStickerState.showLITB;
var asin = null;
if (sitbBTFState && sitbBTFState.asin) {
asin = sitbBTFState.asin;
}
var url = '';
if (asin) {
if (canLookInside) {
url = "/gp/aw/sitb/reftag/ref=rdr_mbl_dpload_kndl?asin=" + asin;
} else {
url = "/gp/aw/sitb/reftag/ref=rdr_mbl_nodpload_kndl?asin=" + asin;
}
$.post(url);
}
if (canLookInside && asin) {
if (sitbBTFState.resizedImage) {
var sitbCoverImage = new Image();
sitbCoverImage.src = sitbBTFState.resizedImage;
}
if (sitbBTFState.endActionImage) {
var sitbEndActionImage = new Image();
sitbEndActionImage.src = sitbBTFState.endActionImage;
}
}
}
});
</script><div id="socialFabric_feature_div" data-feature-name="socialFabric" data-template-name="socialFabric" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="recommendations_feature_div" data-feature-name="recommendations" data-template-name="recommendations" class="a-section a-spacing-none feature">
</div><div class="aw-campaigns"></div><div class="aw-campaigns"></div><div class="aw-campaigns"><script>if (typeof uet === 'function' && typeof ues === 'function') {var scope = 'detail_mobile-hero-quick-promo_mweb';var placementId = '';ues('wb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); uet('bb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); if (placementId) {ues('wb', 'adplacements:' + placementId, {wb:1});uet('bb', 'adplacements:' + placementId, {wb:1});}}</script> <style>@media screen and (max-width:240px){ div[id$=ape_detail_mobile-hero-quick-promo_mweb_wrapper]{ width:auto !important;margin-left:auto !important;left:auto !important} div[id$=ape_detail_mobile-hero-quick-promo_mweb_text-wrapper]{ width:auto !important;margin-left:auto !important;left:auto !important}}@media screen and (orientation:landscape){ [id$=ape_detail_mobile-hero-quick-promo_mweb_wrapper]{ max-width:414px !important;margin:auto !important} [id$=ape_detail_mobile-hero-quick-promo_mweb_text-wrapper]{ max-width:414px !important;margin:auto !important}}</style> <div id="ape_detail_mobile-hero-quick-promo_mweb_wrapper" class="celwidget text/x-dacx-safeframe" style="position:relative; text-align:center; margin-left: -14px; margin-right: -14px; margin-top: 20px; height: 125px; overflow: hidden;" data-ad-details="{&quot;slot&quot; :&quot;detail_mobile-hero-quick-promo_mweb&quot;,&quot;pageType&quot;: &quot;detail&quot;,&quot;subPageType&quot;: &quot;mweb&quot;,&quot;slotName&quot; :&quot;mobile-hero-quick-promo&quot;,&quot;src&quot; : &quot;prefetchEnabled&quot;,&quot;adServer&quot; :&quot;cs&quot;,&quot;campaignId&quot; : &quot;11598&quot;,&quot;arid&quot; :&quot;5ee18b81a5d64462b39540a5c7d61593&quot;, &quot;size&quot; :{&quot;width&quot; : &quot;100%&quot;,&quot;height&quot; : &quot;125px&quot;},&quot;maxAdWidth&quot;: &quot;&quot;,&quot;allowedSizes&quot; :[{&quot;width&quot;:&quot;414px&quot;,&quot;height&quot;:&quot;125px&quot;}, {&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;}],&quot;allowedDomains&quot; : [&quot;g-ecx.images-amazon.com&quot;, &quot;images-na.ssl-images-amazon.com&quot;],&quot;loadAfter&quot; : &quot;immediate&quot;,&quot;extraDelay&quot; : 0,&quot;iframeExtraStyle&quot;: &quot;width: 1px; min-width: 100%;&quot;,&quot;iframeClass&quot;: &quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;: false,&quot;adLabelWrapperId&quot;: &quot;ape_detail_mobile-hero-quick-promo_mweb_text-wrapper&quot;,&quot;adLabelId&quot;: &quot;ape_detail_mobile-hero-quick-promo_mweb_text&quot;,&quot;advTextWrapperDivStyle&quot;: &quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;: &quot;font-size: 10px; color: #555; text-align: right; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;: &quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9tb2JpbGUtaGVyby1xdWljay1wcm9tb19td2ViX3RleHQtd3JhcHBlciIgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyB0ZXh0LWFsaWduOmNlbnRlcjsgbWFyZ2luLWxlZnQ6IC0xNHB4OyBtYXJnaW4tcmlnaHQ6IC0xNHB4OyBoZWlnaHQ6IGF1dG87IiAgPjxkaXYgaWQ9ImFwZV9kZXRhaWxfbW9iaWxlLWhlcm8tcXVpY2stcHJvbW9fbXdlYl90ZXh0IiBzdHlsZT0iZm9udC1zaXplOiAxMHB4OyBjb2xvcjogIzU1NTsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbjogMHB4IDNweCA2cHggMDsiICA+QWR2ZXJ0aXNlbWVudDwvZGl2PjwvZGl2Pg==&quot;,&quot;adPixels&quot;: [],&quot;adPixelDelay&quot;: &quot;0&quot;,&quot;aaxImpPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/e/loi/imp?b=QnPEipalmGuTpmDFzkKDpUIAAAFhpJkoZQEAAAGQAWWpzsQ&quot;,&quot;aaxInstrPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/x/px/QnPEipalmGuTpmDFzkKDpUIAAAFhpJkoZQEAAAGQAWWpzsQ/&quot;,&quot;htmlContent&quot;: &quot;&quot;,&quot;htmlContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9tb2JpbGUtaGVyby1xdWljay1wcm9tb19td2ViX2NyZWF0aXZlV3JhcHBlciIgICA+PCFkb2N0eXBlIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD1VVEYtOD48dGl0bGU+PC90aXRsZT48c3R5bGU+aHRtbHtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjEuMTU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOm9iamVjdHN9YTphY3RpdmUsYTpob3ZlcntvdXRsaW5lLXdpZHRoOjB9aW1ne2JvcmRlci1zdHlsZTpub25lfSosOmFmdGVyLDpiZWZvcmV7Ym94LXNpemluZzpib3JkZXItYm94fWh0bWx7b3ZlcmZsb3c6aGlkZGVuO2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSBOZXVlLEhlbHZldGljYSxzYW5zLXNlcmlmO2NvbG9yOiMxMTE7Zm9udC1zaXplOjE0cHh9YXtjb2xvcjojMDA2NmMwO3RleHQtZGVjb3JhdGlvbjpub25lfWE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtjb2xvcjojYzQ1NTAwfSNhZHstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uYmxvY2t7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVufS5ibG9jazplbXB0eXtkaXNwbGF5Om5vbmV9LmJsb2NrLS1qdXN0aWZ5LWNlbnRlcnstd2Via2l0LWp1c3RpZnktY29udGVudDpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uYmxvY2stLWp1c3RpZnktZmxleC1lbmR7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7LW1zLWZsZXgtcGFjazplbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5ibG9jay0tYWxpZ24tZmxleC1zdGFydHstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7LW1zLWZsZXgtYWxpZ246c3RhcnQ7LW1zLWdyaWQtcm93LWFsaWduOmZsZXgtc3RhcnQ7YWxpZ24taXRlbXM6ZmxleC1zdGFydH0uYmxvY2stLWFsaWduLWNlbnRlcnstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7LW1zLWdyaWQtcm93LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmJsb2NrLS1hbGlnbi1mbGV4LWVuZHstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtZW5kOy1tcy1mbGV4LWFsaWduOmVuZDstbXMtZ3JpZC1yb3ctYWxpZ246ZmxleC1lbmQ7YWxpZ24taXRlbXM6ZmxleC1lbmR9LmJsb2NrLS1kaXJlY3Rpb24tY29sdW1uey13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5ibG9jay0tYmFja2dyb3VuZCwuYmxvY2stLWJhY2tncm91bmQ+LmJsb2Nre3Bvc2l0aW9uOnJlbGF0aXZlfS5ibG9ja19fYmFja2dyb3VuZHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uYmxvY2stLWxvY2t7LXdlYmtpdC1mbGV4LWdyb3c6MDstbXMtZmxleC1wb3NpdGl2ZTowO2ZsZXgtZ3JvdzowOy13ZWJraXQtZmxleC1zaHJpbms6MDstbXMtZmxleC1uZWdhdGl2ZTowO2ZsZXgtc2hyaW5rOjB9LmJsb2NrLS1pbmxpbmU6bm90KDplbXB0eSl7ZGlzcGxheTpibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjB9LmJsb2NrLS1pbmxpbmU6bm90KDplbXB0eSk+LmJsb2NrOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXNpemU6MTRweH0uaC1ub0ZsZXhib3ggLmJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktY2VudGVyPi5ibG9ja3t0ZXh0LWFsaWduOmxlZnR9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1mbGV4LWVuZHt0ZXh0LWFsaWduOnJpZ2h0fS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktZmxleC1lbmQ+LmJsb2Nre3RleHQtYWxpZ246bGVmdH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1mbGV4LXN0YXJ0Pi5ibG9ja3t2ZXJ0aWNhbC1hbGlnbjp0b3B9Lmgtbm9GbGV4Ym94IC5ibG9jay0tYWxpZ24tY2VudGVyPi5ibG9ja3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lmgtbm9GbGV4Ym94IC5ibG9jay0tYWxpZ24tZmxleC1lbmQ+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0uaC1ub0ZsZXhib3ggLmJsb2NrLS1kaXJlY3Rpb24tY29sdW1uPi5ibG9ja3tkaXNwbGF5OmJsb2NrfS5oLWNsb2Fre3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudH0uaC1lbGxpcHNpc3tvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LmFzaW5JbWFnZXtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0e2hlaWdodDphdXRvfS5hc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodD4uaW1hZ2VDb250YWluZXJ7aGVpZ2h0OjEwMCV9LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9ue2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5hc2luSW1hZ2UtLXdpdGhEZXNjcmlwdGlvbj4uaW1hZ2VDb250YWluZXJ7bWFyZ2luLWJvdHRvbTo1cHh9LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uPi50ZXh0Q29udGFpbmVye21pbi1oZWlnaHQ6MTVweDt0ZXh0LWFsaWduOmNlbnRlcn0uaW1hZ2VDb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uaW1hZ2VDb250YWluZXJfX2ltYWdle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtib3R0b206MDtyaWdodDowO21hcmdpbjphdXRvO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5pbWFnZUNvbnRhaW5lci0tbGVmdHtkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5pbWFnZUNvbnRhaW5lci0tbGVmdD4uaW1hZ2VDb250YWluZXJfX2ltYWdle3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MH0uaW1hZ2VDb250YWluZXItLXJpZ2h0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7bWFyZ2luOjA7bGVmdDphdXRvO2JvdHRvbTphdXRvO3RvcDphdXRvfS5pbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0e2hlaWdodDphdXRvfS5pbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpzdGF0aWM7bWFyZ2luOjAgYXV0b30udGV4dExpbmt7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS50ZXh0TGluay0tZGlzcGxheUFzVGV4dHtjb2xvcjojMTExfS50ZXh0TGluay0tZGlzcGxheUFzVGV4dDpob3Zlcntjb2xvcjojMTExO3RleHQtZGVjb3JhdGlvbjpub25lfS5za3kgLnRleHRMaW5re2ZvbnQtd2VpZ2h0OjYwMH0uc2t5IC50ZXh0TGluay0tZGlzcGxheUFzVGV4dCwuc2t5IC50ZXh0TGluay0tZGlzcGxheUFzVGV4dDpob3Zlcntjb2xvcjojMDAyZjM2fS5zdGFyUmF0aW5nX19zdGFyc3tkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTZweDt3aWR0aDo4MHB4O21hcmdpbi1yaWdodDo1cHg7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTozNDRweCAxNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uc3RhclJhdGluZ19fY291bnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE2cHh9LnN0YXJSYXRpbmc6aG92ZXI+LnN0YXJSYXRpbmdfX2NvdW50e3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9LnNreSAuc3RhclJhdGluZ19fY291bnR7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTNweH0ucHJpY2VCb3hfX2xpc3R7bWFyZ2luLXJpZ2h0OjRweH0ucHJpY2VCb3hfX3RheE1lc3NhZ2V7bWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxMXB4fS5wcmljZXtjb2xvcjojYjEyNzA0fS5wcmljZS0tbGlzdHtjb2xvcjojNTU1O3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2h9LnByaWNlLS1qdW1ib3tmb250LXNpemU6M2VtfS5wcmljZV9fanVtYm9DdXJyZW5jeSwucHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCwucHJpY2VfX2p1bWJvSW50ZWdlckFtb3VudHt2ZXJ0aWNhbC1hbGlnbjp0b3A7Zm9udC13ZWlnaHQ6NTAwfS5wcmljZV9fanVtYm9DdXJyZW5jeSwucHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudHtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6LjRlbTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMzUlKTtmb250LXdlaWdodDo3MDB9LnByaWNlX19qdW1ib0ludGVnZXJBbW91bnR7bGV0dGVyLXNwYWNpbmc6LS41cHh9LnNreSAucHJpY2V7Y29sb3I6I2IxMjcwNH0ucHJpbWVMb2dve21hcmdpbi10b3A6MnB4fS50ZW1wbGF0ZUNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZX0udGVtcGxhdGVDb250YWluZXJfX2xpbmt7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29wYWNpdHk6MH0uY2xpY2t0aHJvdWdoTGluazpub3QoLnRlbXBsYXRlQ29udGFpbmVyX19saW5rKXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjJ9PC9zdHlsZT48c2NyaXB0PnZhciBtb2Rlcm5penI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihvKXtpZih0W29dKXJldHVybiB0W29dLmV4cG9ydHM7dmFyIHI9dFtvXT17ZXhwb3J0czp7fSxpZDpvLGxvYWRlZDohMX07cmV0dXJuIGVbb10uY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsbiksci5sb2FkZWQ9ITAsci5leHBvcnRzfXZhciB0PXt9O3JldHVybiBuLm09ZSxuLmM9dCxuLnA9IiIsbigwKX0oezA6ZnVuY3Rpb24oZSxuLHQpe2UuZXhwb3J0cz10KDIwKX0sMjA6ZnVuY3Rpb24oZSxuKXsidXNlIHN0cmljdCI7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9OyFmdW5jdGlvbihlLG4sbyl7ZnVuY3Rpb24gcihlLG4pe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIGU/InVuZGVmaW5lZCI6dChlKSk9PT1ufWZ1bmN0aW9uIHMoKXt2YXIgZSxuLHQsbyxzLGksbDtmb3IodmFyIGYgaW4gYilpZihiLmhhc093blByb3BlcnR5KGYpKXtpZihlPVtdLG49YltmXSxuLm5hbWUmJihlLnB1c2gobi5uYW1lLnRvTG93ZXJDYXNlKCkpLG4ub3B0aW9ucyYmbi5vcHRpb25zLmFsaWFzZXMmJm4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aCkpZm9yKHQ9MDt0PG4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aDt0KyspZS5wdXNoKG4ub3B0aW9ucy5hbGlhc2VzW3RdLnRvTG93ZXJDYXNlKCkpO2ZvcihvPXIobi5mbiwiZnVuY3Rpb24iKT9uLmZuKCk6bi5mbixzPTA7czxlLmxlbmd0aDtzKyspaT1lW3NdLGw9aS5zcGxpdCgiLiIpLDE9PT1sLmxlbmd0aD93W2xbMF1dPW86KCF3W2xbMF1dfHx3W2xbMF1daW5zdGFuY2VvZiBCb29sZWFufHwod1tsWzBdXT1uZXcgQm9vbGVhbih3W2xbMF1dKSksd1tsWzBdXVtsWzFdXT1vKSxnLnB1c2goKG8/IiI6Im5vLSIpK2wuam9pbigiLSIpKX19ZnVuY3Rpb24gaShlKXt2YXIgbj1TLmNsYXNzTmFtZSx0PXcuX2NvbmZpZy5jbGFzc1ByZWZpeHx8IiI7aWYoXyYmKG49bi5iYXNlVmFsKSx3Ll9jb25maWcuZW5hYmxlSlNDbGFzcyl7dmFyIG89bmV3IFJlZ0V4cCgiKF58XFxzKSIrdCsibm8tanMoXFxzfCQpIik7bj1uLnJlcGxhY2UobywiJDEiK3QrImpzJDIiKX13Ll9jb25maWcuZW5hYmxlQ2xhc3NlcyYmKG4rPSIgIit0K2Uuam9pbigiICIrdCksXz9TLmNsYXNzTmFtZS5iYXNlVmFsPW46Uy5jbGFzc05hbWU9bil9ZnVuY3Rpb24gbChlLG4pe3JldHVybiEhfigiIitlKS5pbmRleE9mKG4pfWZ1bmN0aW9uIGYoKXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2Ygbi5jcmVhdGVFbGVtZW50P24uY3JlYXRlRWxlbWVudChhcmd1bWVudHNbMF0pOl8/bi5jcmVhdGVFbGVtZW50TlMuY2FsbChuLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsYXJndW1lbnRzWzBdKTpuLmNyZWF0ZUVsZW1lbnQuYXBwbHkobixhcmd1bWVudHMpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFthLXpdKS0oW2Etel0pL2csZnVuY3Rpb24oZSxuLHQpe3JldHVybiBuK3QudG9VcHBlckNhc2UoKX0pLnJlcGxhY2UoL14tLywiIil9ZnVuY3Rpb24gdShlLG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG4sYXJndW1lbnRzKX19ZnVuY3Rpb24gcChlLG4sdCl7dmFyIG87Zm9yKHZhciBzIGluIGUpaWYoZVtzXWluIG4pcmV0dXJuIHQ9PT0hMT9lW3NdOihvPW5bZVtzXV0scihvLCJmdW5jdGlvbiIpP3Uobyx0fHxuKTpvKTtyZXR1cm4hMX1mdW5jdGlvbiBkKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbQS1aXSkvZyxmdW5jdGlvbihlLG4pe3JldHVybiItIituLnRvTG93ZXJDYXNlKCl9KS5yZXBsYWNlKC9ebXMtLywiLW1zLSIpfWZ1bmN0aW9uIGMoKXt2YXIgZT1uLmJvZHk7cmV0dXJuIGV8fChlPWYoXz8ic3ZnIjoiYm9keSIpLGUuZmFrZT0hMCksZX1mdW5jdGlvbiBtKGUsdCxvLHIpe3ZhciBzLGksbCxhLHU9Im1vZGVybml6ciIscD1mKCJkaXYiKSxkPWMoKTtpZihwYXJzZUludChvLDEwKSlmb3IoO28tLTspbD1mKCJkaXYiKSxsLmlkPXI/cltvXTp1KyhvKzEpLHAuYXBwZW5kQ2hpbGQobCk7cmV0dXJuIHM9Zigic3R5bGUiKSxzLnR5cGU9InRleHQvY3NzIixzLmlkPSJzIit1LChkLmZha2U/ZDpwKS5hcHBlbmRDaGlsZChzKSxkLmFwcGVuZENoaWxkKHApLHMuc3R5bGVTaGVldD9zLnN0eWxlU2hlZXQuY3NzVGV4dD1lOnMuYXBwZW5kQ2hpbGQobi5jcmVhdGVUZXh0Tm9kZShlKSkscC5pZD11LGQuZmFrZSYmKGQuc3R5bGUuYmFja2dyb3VuZD0iIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGE9Uy5zdHlsZS5vdmVyZmxvdyxTLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLFMuYXBwZW5kQ2hpbGQoZCkpLGk9dChwLGUpLGQuZmFrZT8oZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLFMuc3R5bGUub3ZlcmZsb3c9YSxTLm9mZnNldEhlaWdodCk6cC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApLCEhaX1mdW5jdGlvbiB5KG4sdCl7dmFyIHI9bi5sZW5ndGg7aWYoIkNTUyJpbiBlJiYic3VwcG9ydHMiaW4gZS5DU1Mpe2Zvcig7ci0tOylpZihlLkNTUy5zdXBwb3J0cyhkKG5bcl0pLHQpKXJldHVybiEwO3JldHVybiExfWlmKCJDU1NTdXBwb3J0c1J1bGUiaW4gZSl7Zm9yKHZhciBzPVtdO3ItLTspcy5wdXNoKCIoIitkKG5bcl0pKyI6Iit0KyIpIik7cmV0dXJuIHM9cy5qb2luKCIgb3IgIiksbSgiQHN1cHBvcnRzICgiK3MrIikgeyAjbW9kZXJuaXpyIHsgcG9zaXRpb246IGFic29sdXRlOyB9IH0iLGZ1bmN0aW9uKGUpe3JldHVybiJhYnNvbHV0ZSI9PWdldENvbXB1dGVkU3R5bGUoZSxudWxsKS5wb3NpdGlvbn0pfXJldHVybiBvfWZ1bmN0aW9uIHYoZSxuLHQscyl7ZnVuY3Rpb24gaSgpe3AmJihkZWxldGUgTi5zdHlsZSxkZWxldGUgTi5tb2RFbGVtKX1pZihzPXIocywidW5kZWZpbmVkIik/ITE6cywhcih0LCJ1bmRlZmluZWQiKSl7dmFyIHU9eShlLHQpO2lmKCFyKHUsInVuZGVmaW5lZCIpKXJldHVybiB1fWZvcih2YXIgcCxkLGMsbSx2LGg9WyJtb2Rlcm5penIiLCJ0c3BhbiIsInNhbXAiXTshTi5zdHlsZSYmaC5sZW5ndGg7KXA9ITAsTi5tb2RFbGVtPWYoaC5zaGlmdCgpKSxOLnN0eWxlPU4ubW9kRWxlbS5zdHlsZTtmb3IoYz1lLmxlbmd0aCxkPTA7Yz5kO2QrKylpZihtPWVbZF0sdj1OLnN0eWxlW21dLGwobSwiLSIpJiYobT1hKG0pKSxOLnN0eWxlW21dIT09byl7aWYoc3x8cih0LCJ1bmRlZmluZWQiKSlyZXR1cm4gaSgpLCJwZngiPT1uP206ITA7dHJ5e04uc3R5bGVbbV09dH1jYXRjaCh4KXt9aWYoTi5zdHlsZVttXSE9dilyZXR1cm4gaSgpLCJwZngiPT1uP206ITB9cmV0dXJuIGkoKSwhMX1mdW5jdGlvbiBoKGUsbix0LG8scyl7dmFyIGk9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLGw9KGUrIiAiK1Quam9pbihpKyIgIikraSkuc3BsaXQoIiAiKTtyZXR1cm4gcihuLCJzdHJpbmciKXx8cihuLCJ1bmRlZmluZWQiKT92KGwsbixvLHMpOihsPShlKyIgIit6LmpvaW4oaSsiICIpK2kpLnNwbGl0KCIgIikscChsLG4sdCkpfWZ1bmN0aW9uIHgoZSxuLHQpe3JldHVybiBoKGUsbyxvLG4sdCl9dmFyIGc9W10sYj1bXSxDPXtfdmVyc2lvbjoiMy4zLjEiLF9jb25maWc6e2NsYXNzUHJlZml4OiIiLGVuYWJsZUNsYXNzZXM6ITAsZW5hYmxlSlNDbGFzczohMCx1c2VQcmVmaXhlczohMH0sX3E6W10sb246ZnVuY3Rpb24oZSxuKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuKHRbZV0pfSwwKX0sYWRkVGVzdDpmdW5jdGlvbihlLG4sdCl7Yi5wdXNoKHtuYW1lOmUsZm46bixvcHRpb25zOnR9KX0sYWRkQXN5bmNUZXN0OmZ1bmN0aW9uKGUpe2IucHVzaCh7bmFtZTpudWxsLGZuOmV9KX19LHc9ZnVuY3Rpb24oKXt9O3cucHJvdG90eXBlPUMsdz1uZXcgdzt2YXIgUz1uLmRvY3VtZW50RWxlbWVudCxfPSJzdmciPT09Uy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFA9Ik1veiBPIG1zIFdlYmtpdCIsVD1DLl9jb25maWcudXNlUHJlZml4ZXM/UC5zcGxpdCgiICIpOltdO0MuX2Nzc29tUHJlZml4ZXM9VDt2YXIgej1DLl9jb25maWcudXNlUHJlZml4ZXM/UC50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik6W107Qy5fZG9tUHJlZml4ZXM9ejt2YXIgRT17ZWxlbTpmKCJtb2Rlcm5penIiKX07dy5fcS5wdXNoKGZ1bmN0aW9uKCl7ZGVsZXRlIEUuZWxlbX0pO3ZhciBOPXtzdHlsZTpFLmVsZW0uc3R5bGV9O3cuX3EudW5zaGlmdChmdW5jdGlvbigpe2RlbGV0ZSBOLnN0eWxlfSksQy50ZXN0QWxsUHJvcHM9aCxDLnRlc3RBbGxQcm9wcz14LC8qIQoJICB7CgkgICAgIm5hbWUiOiAiRmxleGJveCIsCgkgICAgInByb3BlcnR5IjogImZsZXhib3giLAoJICAgICJjYW5pdXNlIjogImZsZXhib3giLAoJICAgICJ0YWdzIjogWyJjc3MiXSwKCSAgICAibm90ZXMiOiBbewoJICAgICAgIm5hbWUiOiAiVGhlIF9uZXdfIGZsZXhib3giLAoJICAgICAgImhyZWYiOiAiaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1mbGV4Ym94IgoJICAgIH1dLAoJICAgICJ3YXJuaW5ncyI6IFsKCSAgICAgICJBIGB0cnVlYCByZXN1bHQgZm9yIHRoaXMgZGV0ZWN0IGRvZXMgbm90IGltcGx5IHRoYXQgdGhlIGBmbGV4LXdyYXBgIHByb3BlcnR5IGlzIHN1cHBvcnRlZDsgc2VlIHRoZSBgZmxleHdyYXBgIGRldGVjdC4iCgkgICAgXQoJICB9CgkgICEqLwp3LmFkZFRlc3QoImZsZXhib3giLHgoImZsZXhCYXNpcyIsIjFweCIsITApKSwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3ggKGxlZ2FjeSkiLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94bGVnYWN5IiwKCSAgICAidGFncyI6IFsiY3NzIl0sCgkgICAgInBvbHlmaWxscyI6IFsiZmxleGllIl0sCgkgICAgIm5vdGVzIjogW3sKCSAgICAgICJuYW1lIjogIlRoZSBfb2xkXyBmbGV4Ym94IiwKCSAgICAgICJocmVmIjogImh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtZmxleGJveC0yMDA5MDcyMy8iCgkgICAgfV0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94bGVnYWN5Iix4KCJib3hEaXJlY3Rpb24iLCJyZXZlcnNlIiwhMCkpLC8qIQoJICB7CgkgICAgIm5hbWUiOiAiRmxleGJveCAodHdlZW5lcikiLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94dHdlZW5lciIsCgkgICAgInRhZ3MiOiBbImNzcyJdLAoJICAgICJwb2x5ZmlsbHMiOiBbImZsZXhpZSJdLAoJICAgICJub3RlcyI6IFt7CgkgICAgICAibmFtZSI6ICJUaGUgX2luYmV0d2Vlbl8gZmxleGJveCIsCgkgICAgICAiaHJlZiI6ICJodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1jc3MzLWZsZXhib3gtMjAxMTExMjkvIgoJICAgIH1dLAoJICAgICJ3YXJuaW5ncyI6IFsiVGhpcyByZXByZXNlbnRzIGFuIG9sZCBzeW50YXgsIG5vdCB0aGUgbGF0ZXN0IHN0YW5kYXJkIHN5bnRheC4iXQoJICB9CgkgICEqLwp3LmFkZFRlc3QoImZsZXhib3h0d2VlbmVyIix4KCJmbGV4QWxpZ24iLCJlbmQiLCEwKSkscygpLGkoZyksZGVsZXRlIEMuYWRkVGVzdCxkZWxldGUgQy5hZGRBc3luY1Rlc3Q7Zm9yKHZhciBqPTA7ajx3Ll9xLmxlbmd0aDtqKyspdy5fcVtqXSgpO2UuTW9kZXJuaXpyPXd9KHdpbmRvdyxkb2N1bWVudCl9fSk7O3ZhciBQZGFDbGllbnRBUEk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtpZihuW3JdKXJldHVybiBuW3JdLmV4cG9ydHM7dmFyIGk9bltyXT17ZXhwb3J0czp7fSxpZDpyLGxvYWRlZDohMX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsdCksaS5sb2FkZWQ9ITAsaS5leHBvcnRzfXZhciBuPXt9O3JldHVybiB0Lm09ZSx0LmM9bix0LnA9IiIsdCgwKX0oW2Z1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxNil9LCwsLCwsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHdpbmRvdy5ldmVudDtyZXR1cm4gbih0KX07aWYoZS5hZGRFdmVudExpc3RlbmVyKWUuYWRkRXZlbnRMaXN0ZW5lcih0LHIsITApO2Vsc2UgaWYodD0ib24iK3QsZS5hdHRhY2hFdmVudCllLmF0dGFjaEV2ZW50KHQscik7ZWxzZXt2YXIgaT1lW3RdO2VbdF09ZnVuY3Rpb24oKXtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX19LCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxhPW4oOSksdT1yKGEpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe2lmKGkodGhpcyxlKSx0aGlzLndpbmRvdz10LndpbmRvd3x8InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdywhdGhpcy53aW5kb3d8fCF0aGlzLndpbmRvdy5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoIldpbmRvdyBhbmQvb3IgZG9jdW1lbnQgaXMgbm90IGRlZmluZWQiKTt0aGlzLmRhY3hMb2dnZXI9dC5kYWN4TG9nZ2VyfHxuZXcgdVsiZGVmYXVsdCJdKHQuYmFzZVVybCx0LmltcHJlc3Npb25JZCx0LmFkU2Vzc2lvbklkKSx0aGlzLmFpZD10LmFkSWQsdGhpcy5jaWQ9dC5jcmVhdGl2ZUlkLHRoaXMuZGFjeExvZ2dlci5sb2dJbXByZXNzaW9uKCl9cmV0dXJuIG8oZSxbe2tleToiYXR0YWNoR2xvYmFscyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLndpbmRvdy5kb2N1bWVudC5hZD17YWlkOnRoaXMuYWRJZCxjaWQ6dGhpcy5jcmVhdGl2ZUlkfSx0aGlzLndpbmRvdy5EYWN4TG9nZ2VyPXRoaXMuZGFjeExvZ2dlcn19XSksZX0oKTt0WyJkZWZhdWx0Il09Y30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBhKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gdShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPW5ldyBmWyJkZWZhdWx0Il0oZSxkKSxyPXtpOnQuZGFjeEltcHJlc3Npb25JZCxhc2k6dC5kYWN4U2Vzc2lvbklkLGNsaWNrOjF9O3JldHVybiBuLmdldFBpeGVsVXJsKHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKTt0LmdlbmVyYXRlRGFjeENsaWNrVHJhY2tlclVybD1jO3ZhciBzPW4oMTApLGY9cihzKSxkPSI0MTY3MzE2MTMiLHA9ImNsaWVudF9pbXAiLGg9InZpZXciLHY9InN3aXBlIix5PS0xLGc9MSx3PTIsbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbixyKXtvKHRoaXMsdCk7dmFyIGk9YSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSxkKSk7cmV0dXJuIGkuaW1wcmVzc2lvbklkPW4saS5hZFNlc3Npb25JZD1yLGl9cmV0dXJuIHUodCxlKSxsKHQsW3trZXk6ImxvZ01ldHJpYyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pKHtpOnRoaXMuaW1wcmVzc2lvbklkLGFzaTp0aGlzLmFkU2Vzc2lvbklkfSxlLHR8fDEpO3RoaXMuZmlyZVBpeGVsKG4pfX0se2tleToibG9nSW1wcmVzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhwKX19LHtrZXk6ImxvZ1ZpZXdhYmlsaXR5U3VjY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLGcpfX0se2tleToibG9nQmFyZVZpZXdhYmlsaXR5U3VjY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLHcpfX0se2tleToibG9nVmlld2FiaWxpdHlGYWlsdXJlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubG9nTWV0cmljKGgseSl9fSx7a2V5OiJsb2dTd2lwZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyh2KX19XSksdH0oZlsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89bigxMSkuZ2V0UXVlcnlTdHJpbmcsYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtyKHRoaXMsZSksdGhpcy5iYXNlVXJsPXQsdGhpcy5jaGFubmVsPW59cmV0dXJuIGkoZSxbe2tleToiZ2V0UGl4ZWxVcmwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PSI/IitlbmNvZGVVUklDb21wb25lbnQobyhlKSk7cmV0dXJuIHRoaXMuYmFzZVVybCsiL2l1Mz9kPWZvcmVzdGVyLWRpZCZleC1mY2g9Iit0aGlzLmNoYW5uZWwrIiZleC1mYXJncz0iK3QrIiZjYj0iKyhuZXcgRGF0ZSkuZ2V0VGltZSgpfX0se2tleToiZmlyZVBpeGVsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1uZXcgSW1hZ2U7cmV0dXJuIHQuc3JjPXRoaXMuZ2V0UGl4ZWxVcmwoZSksdH19XSksZX0oKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiBlKW4ucHVzaChyKyI9IitlW3JdKTt2YXIgaT1uLmpvaW4oIiYiKTtyZXR1cm4gdD9lbmNvZGVVUklDb21wb25lbnQoaSk6aX1mdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtyPm47bisrKXQoZVtuXSxuLGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmdldFF1ZXJ5U3RyaW5nPW4sdC5mb3JFYWNoPXJ9LCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiBiKGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6YihpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oOCkscz1yKGwpLGY9bigxNyksZD1yKGYpLHA9bigxOCksaD1yKHApLHY9bigxOSkseT1yKHYpLGc9big2KSx3PVsiVEVUUklTX0lOTElORV9NRVNTQUdJTkciXSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7aSh0aGlzLHQpO3ZhciBuPW8odGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zaGF6YW1Mb2dnZXI9ZS5zaGF6YW1Mb2dnZXJ8fG5ldyBkWyJkZWZhdWx0Il0oZS5iYXNlVXJsLGUpLG4uc2hhemFtTG9nZ2VyLmxvZ0ltcHJlc3Npb24oKSxuLmNyZWF0aXZlQ2xpY2tMb2dnZXI9ZS5jcmVhdGl2ZUNsaWNrTG9nZ2VyfHxuZXcgeVsiZGVmYXVsdCJdKGUuYmFzZVVybCxlLmltcHJlc3Npb25JZCksbi50ZW1wbGF0ZU5hbWU9ZS50ZW1wbGF0ZU5hbWUsbn1yZXR1cm4gYSh0LGUpLHUodCxbe2tleToiYXR0YWNoR2xvYmFscyIsdmFsdWU6ZnVuY3Rpb24oKXtjKHQucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQucHJvdG90eXBlKSwiYXR0YWNoR2xvYmFscyIsdGhpcykuY2FsbCh0aGlzKSx0aGlzLndpbmRvdy5TaGF6YW1Mb2dnZXI9dGhpcy5zaGF6YW1Mb2dnZXIsdGhpcy53aW5kb3cuVmlld2FiaWxpdHk9aFsiZGVmYXVsdCJdfX0se2tleToidHJhY2tMb2FkTGF0ZW5jeSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuc2hhemFtTG9nZ2VyLnN0YXJ0VGltZXIoZFsiZGVmYXVsdCJdLkVWRU5UX05BTUVTLkNSRUFUSVZFX0xPQURfTEFURU5DWSksKDAsZy5hZGRMaXN0ZW5lcikodGhpcy53aW5kb3csImxvYWQiLGZ1bmN0aW9uKHQpe2Uuc2hhemFtTG9nZ2VyLmVuZFRpbWVyKGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpfSl9fSx7a2V5OiJhZGRFcnJvckxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy53aW5kb3cub25lcnJvcj1mdW5jdGlvbih0LG4scixpLG8pe2lmKG8mJm8uc3RhY2spe3ZhciBhPXQrIiA6ICIrby5zdGFjaztlLnNoYXphbUxvZ2dlci5hZGRDb3VudChkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuVU5DQVVHSFRfRVJST1IsYS5sZW5ndGg8NTAwP2E6YS5zdWJzdHJpbmcoMCw1MDApKX1lbHNlIGUuc2hhemFtTG9nZ2VyLmFkZENvdW50KGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5VTkNBVUdIVF9FUlJPUix0KyIgOiAiK24pfX19LHtrZXk6ImFkZFZpZXdhYmlsaXR5TGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj0uNSxyPTFlMyxpPS4wMSxvPTEsYT1uZXcgaFsiZGVmYXVsdCJdKGUsdGhpcy53aW5kb3cpO2EuZ2V0UGVyY2VudEluVmlldygpPD0tMT90aGlzLmRhY3hMb2dnZXIubG9nVmlld2FiaWxpdHlGYWlsdXJlKCk6KGEub25WaWV3KGksbyxmdW5jdGlvbigpe3JldHVybiB0LmRhY3hMb2dnZXIubG9nQmFyZVZpZXdhYmlsaXR5U3VjY2VzcygpfSksYS5vblZpZXcobixyLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGFjeExvZ2dlci5sb2dWaWV3YWJpbGl0eVN1Y2Nlc3MoKX0pKX19LHtrZXk6ImFkZENyZWF0aXZlQ2xpY2tMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt3LmluZGV4T2YodGhpcy50ZW1wbGF0ZU5hbWUpPj0wJiYoMCxnLmFkZExpc3RlbmVyKShlLCJjbGljayIsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3QuY3JlYXRpdmVDbGlja0xvZ2dlci5sb2dDbGljayhuLGUub2Zmc2V0V2lkdGgsZS5vZmZzZXRIZWlnaHQpfX0oZSkpfX1dKSx0fShzWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT1tfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiB5KGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6eShpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oMTApLHM9cihsKSxmPS4xLGQ9ImNsbWV0IixwPSJkYS1jeC1tZXRyaWNzIixoPVsic2hhemFtSWQiLCJ0ZW1wbGF0ZU5hbWUiLCJsb2NhbGUiLCJhZFNlcnZlciIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIiwidGVtcGxhdGVNaW5vclZlcnNpb24iLCJhZElkIiwiY3JlYXRpdmVJZCIsImltcHJlc3Npb25JZCJdLHY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe2kodGhpcyx0KTt2YXIgcj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlLHApKTtyZXR1cm4gci5zaG91bGRGaXJlTWV0cmljcz1NYXRoLnJhbmRvbSgpPD1mLHIudGltZXJzPXt9LHIuYWRJbmZvPW4saC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixlKSl0aHJvdyBuZXcgRXJyb3IoIlNoYXphbUxvZ2dlciBtaXNzaW5nIGFkSW5mbyBwcm9wZXJ0eTogIitlKX0pLHJ9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImZpcmVQaXhlbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zaG91bGRGaXJlTWV0cmljcyYmKGUuaT1lbmNvZGVVUklDb21wb25lbnQodGhpcy5hZEluZm8uaW1wcmVzc2lvbklkKSxlLmFwcD1lbmNvZGVVUklDb21wb25lbnQoZCksYyh0LnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSksImZpcmVQaXhlbCIsdGhpcykuY2FsbCh0aGlzLGUpKX19LHtrZXk6ImxvZ0V2ZW50Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9e307aWYobnVsbCE9ZSYmbnVsbCE9dCl7dHJ5e24mJihyLnR5cGU9biksci5lbj1lLHIuZXY9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2goaSl7ci5zdHJpbmdpZnlOb3RBdmFpbGFibGU9MX10aGlzLmZpcmVQaXhlbChyKX19fSx7a2V5OiJsb2dJbXByZXNzaW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuYWRJbmZvLHQ9e3M6ZS5zaGF6YW1JZCxuOmVuY29kZVVSSUNvbXBvbmVudChlLnRlbXBsYXRlTmFtZSksbDplLmxvY2FsZSxhczplLmFkU2VydmVyLHRtanY6ZS50ZW1wbGF0ZU1ham9yVmVyc2lvbix0bW52OmUudGVtcGxhdGVNaW5vclZlcnNpb24sYWk6ZS5hZElkLGNpOmUuY3JlYXRpdmVJZCxpOmUuaW1wcmVzc2lvbklkLGltcDoxfTtuYXZpZ2F0b3ImJih0LnVhPWVuY29kZVVSSUNvbXBvbmVudChuYXZpZ2F0b3IudXNlckFnZW50KSksdGhpcy5maXJlUGl4ZWwodCl9fSx7a2V5OiJzdGFydFRpbWVyIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnRpbWVyc1tlXT1uZXcgRGF0ZX19LHtrZXk6ImVuZFRpbWVyIix2YWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLnRpbWVyc1tlXSl7dmFyIG49bmV3IERhdGUtdGhpcy50aW1lcnNbZV07dGhpcy5sb2dFdmVudChlLG4sdC5FVkVOVF9UWVBFUy5USU1FUiksZGVsZXRlIHRoaXMudGltZXJzW2VdfX19LHtrZXk6ImFkZENvdW50Iix2YWx1ZTpmdW5jdGlvbihlLG4pe249bnx8MSx0aGlzLmxvZ0V2ZW50KGUsbix0LkVWRU5UX1RZUEVTLkNPVU5URVIpfX1dKSx0fShzWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT12LHYuRVZFTlRfVFlQRVM9e1RJTUVSOiJ0aW1lciIsQ09VTlRFUjoiY291bnRlciIsSlNPTjoianNvbiJ9LHYuRVZFTlRfTkFNRVM9e0JVWV9CT1hfTE9BRF9MQVRFTkNZOiJCdXlCb3hMb2FkTGF0ZW5jeSIsQUFOX0xBVEVOQ1k6IkFhbkxhdGVuY3kiLEFBTl9FUlJPUjoiQWFuRXJyb3IiLERST1BfRE9XTl9TRUxFQ1RPUjoiRHJvcERvd25TZWxlY3RvciIsVU5DQVVHSFRfRVJST1I6IlVuY2F1Z2h0RXJyb3IiLFVOREVGSU5FRF9UUkFDS0VSX0FSRzoiVW5kZWZpbmVkVHJhY2tlckFyZyIsQ09PUkRJTkFUT1JfVFJBQ0tFUjoiQ29vcmRpbmF0b3JUcmFja2VyIixJTUFHRV9MT0FEX0xBVEVOQ1k6IkltYWdlTG9hZExhdGVuY3kiLENSRUFUSVZFX0xPQURfTEFURU5DWToiQ3JlYXRpdmVMb2FkTGF0ZW5jeSJ9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcihlLHQpe3ZhciBuPWkodCkscj1vKHQpLHU9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPWEodS50b3AsdS5ib3R0b20sbiksbD1hKHUubGVmdCx1LnJpZ2h0LHIpLHM9YypsLGY9KHUuYm90dG9tLXUudG9wKSoodS5yaWdodC11LmxlZnQpO3JldHVybiBNYXRoLm1pbigxLE1hdGgubWF4KDAscy9mKSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS5pbm5lckhlaWdodHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGUuaW5uZXJXaWR0aHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh9ZnVuY3Rpb24gYShlLHQsbil7dmFyIHI9MDtyZXR1cm4gcj1lPjA/bi1lOnQ+MD9NYXRoLm1pbih0LG4pOjAsTWF0aC5taW4ocix0LWUpfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9bnVsbCxuPWZ1bmN0aW9uIHIoKXtlKCl8fCh0PXNldFRpbWVvdXQociwxMDApKX07cmV0dXJuIG4oKSx7Y2xlYXI6ZnVuY3Rpb24oKXt0JiZjbGVhclRpbWVvdXQodCl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXtuKHRoaXMsZSksdGhpcy53aW5kb3c9cnx8d2luZG93LHRoaXMuZWxlbT10fXJldHVybiBjKGUsW3trZXk6ImdldFBlcmNlbnRJblZpZXciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRUb3BXaW5kb3coKTtpZihlKXtpZih0aGlzLndpbmRvdz09PWUpcmV0dXJuIHIodGhpcy5lbGVtLGUpO2lmKHRoaXMud2luZG93LmZyYW1lRWxlbWVudClyZXR1cm4gcih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQsZSl9ZWxzZSBpZih0aGlzLndpbmRvdy4kc2YpdHJ5e3ZhciB0PXRoaXMud2luZG93LiRzZi5leHQuaW5WaWV3UGVyY2VudGFnZSgpfHwwO3JldHVybiB0LzEwMH1jYXRjaChuKXt9cmV0dXJuLTF9fSx7a2V5OiJnZXRUb3BXaW5kb3ciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9bnVsbDt0cnl7aWYoIXRoaXMud2luZG93LnRvcC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImNyb3NzLWRvbWFpbiBleGNlcHRpb24iKTtlPXRoaXMud2luZG93LnRvcH1jYXRjaCh0KXt9cmV0dXJuIGV9fSx7a2V5OiJvblZpZXdUaHJlc2hvbGQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMsbz1udWxsO3JldHVybiB1KGZ1bmN0aW9uKCl7aWYoaS5nZXRQZXJjZW50SW5WaWV3KCk+PWUmJmkuZ2V0UGVyY2VudEluVmlldygpPD10KXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTtpZihudWxsPT09bylvPWE7ZWxzZSBpZihhLW8+bilyZXR1cm4gcigpLCEwfWVsc2Ugbz1udWxsfSl9fSx7a2V5OiJvblZpZXciLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vblZpZXdUaHJlc2hvbGQoZSwxLHQsbil9fSx7a2V5OiJvbkhpZGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vblZpZXdUaHJlc2hvbGQoMCxlLHQsbil9fSx7a2V5OiJnZXRWZXJ0aWNhbFBvc2l0aW9uT25QYWdlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPS0xLHQ9dGhpcy5nZXRUb3BXaW5kb3coKTtpZih0KXtpZih0aGlzLndpbmRvdz09PXQpe3ZhciBuPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ascj1pKHQpLG89dGhpcy5lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtlPU1hdGgubWF4KE1hdGgubWluKG4vKHItbyksMSksMCl9ZWxzZSBpZih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQpe3ZhciBuPXRoaXMud2luZG93LmZyYW1lRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ascj1pKHQpLG89dGhpcy53aW5kb3cuZnJhbWVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtlPU1hdGgubWF4KE1hdGgubWluKG4vKHItbyksMSksMCl9fWVsc2UgaWYodGhpcy53aW5kb3cuJHNmKXRyeXtlPU1hdGgubWF4KE1hdGgubWluKCRzZi5leHQuZ2VvbSgpLnNlbGYudC8oJHNmLmV4dC5nZW9tKCkud2luLmgtJHNmLmV4dC5nZW9tKCkuc2VsZi5oKSwxKSwwKX1jYXRjaChhKXt9cmV0dXJuIGV9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWx9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBpKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyhlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxjPWZ1bmN0aW9uIHYoZSx0LG4pe251bGw9PT1lJiYoZT1GdW5jdGlvbi5wcm90b3R5cGUpO3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZih2b2lkIDA9PT1yKXt2YXIgaT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIG51bGw9PT1pP3ZvaWQgMDp2KGksdCxuKX1pZigidmFsdWUiaW4gcilyZXR1cm4gci52YWx1ZTt2YXIgbz1yLmdldDtpZih2b2lkIDAhPT1vKXJldHVybiBvLmNhbGwobil9LGw9bigxMCkscz1yKGwpLGY9ImRhLWN4LW1ldHJpY3MiLGQ9IkNvb3JkaW5hdGVDbGljayIscD0ianNvbiIsaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbil7aSh0aGlzLHQpO3ZhciByPW8odGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUsZikpO3JldHVybiByLmltcHJlc3Npb25JZD1uLHJ9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImxvZ0NsaWNrIix2YWx1ZTpmdW5jdGlvbihlLG4scil7dmFyIGk9e30sbz17Y3hjOmUucGFnZVgsY3ljOmUucGFnZVksY3B3Om4sY3BoOnJ9O2kuZW49ZCxpLnR5cGU9cCxpLmk9dGhpcy5pbXByZXNzaW9uSWQ7dHJ5e2kuZXY9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG8pKX1jYXRjaChhKXtpLnN0cmluZ2lmeU5vdEF2YWlsYWJsZT0xfWModC5wcm90b3R5cGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLCJmaXJlUGl4ZWwiLHRoaXMpLmNhbGwodGhpcyxpKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09aH1dKTs7d2luZG93LnBkYWdTY29wZSA9IHdpbmRvdy5wZGFnU2NvcGUgfHwge307d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkgPSBuZXcgUGRhQ2xpZW50QVBJLmRlZmF1bHQoeyJiYXNlVXJsIjoiaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20iLCJzaGF6YW1JZCI6Ijc5MjU4NTEiLCJ0ZW1wbGF0ZU5hbWUiOiJURVRSSVNfTU9CSUxFX1JBVkVOIiwidGVtcGxhdGVNYWpvclZlcnNpb24iOiIxIiwidGVtcGxhdGVNaW5vclZlcnNpb24iOiI4IiwibG9jYWxlIjoiVVMiLCJhZFNlcnZlciI6ImNvcm5lcnN0b25lIiwiYWRJZCI6IjQ1MzMwNzc4MTA3MDEiLCJjcmVhdGl2ZUlkIjoiNjEwNTU2NTk0MDcwMSIsImltcHJlc3Npb25JZCI6ImM4U0tscVdZYTVPbVlNWE9Rb09sUWciLCJhZFNlc3Npb25JZCI6IjAxMDFiMGRkOWU5ZWQ2ZTRkMTRlZTU5MmQxNDMwNzJjNTA1YTUzZTFlM2U3NmE2NTNhYjY2M2ZhMDEwZmVjOTkwMzg2In0pO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLnRyYWNrTG9hZExhdGVuY3koKTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS5hdHRhY2hHbG9iYWxzKCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYWRkRXJyb3JMaXN0ZW5lcigpOzwvc2NyaXB0PjwvaGVhZD48Ym9keT48ZGl2IGlkPWFkPjxkaXYgY2xhc3M9Im1vYmlsZVJhdmVuIHRlbXBsYXRlQ29udGFpbmVyIiBkYXRhLWNyZWF0aXZlLWlkPSI2MTA1NTY1OTQwNzAxIiBkYXRhLWFkLWlkPSI0NTMzMDc3ODEwNzAxIiBkYXRhLXJlYWN0cm9vdD0iIiBkYXRhLXJlYWN0aWQ9IjEiIGRhdGEtcmVhY3QtY2hlY2tzdW09IjY0NTYyNjQ2NSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgdGVtcGxhdGVDb250YWluZXJfX2xpbmsiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5QRWlwYWxtR3VUcG1ERnprS0RwVUlBQUFGaHBKa29aUUVBQUFHUUFXV3B6c1EvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8xNTA4NzY3NDgzP2FheGl0az1rSmJhLngyOVBwMHhFLktjb09lZlVBIiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iMiI+PC9hPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTI1cHg7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQ6I0ZGRkZGRjsiIGRhdGEtcmVhY3RpZD0iMyI+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxNjBweDtoZWlnaHQ6MTAwJTtwYWRkaW5nOjVweCAxMHB4IDVweCAxMHB4O2ZsZXg6MCAwIDEyNXB4OyIgZGF0YS1yZWFjdGlkPSI0Ij48ZGl2IGNsYXNzPSJhc2luSW1hZ2UiIGRhdGEtcmVhY3RpZD0iNSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgYXNpbkltYWdlIiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FuUEVpcGFsbUd1VHBtREZ6a0tEcFVJQUFBRmhwSmtvWlFFQUFBR1FBV1dwenNRL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMTUwODc2NzQ4Mz9hYXhpdGs9a0piYS54MjlQcDB4RS5LY29PZWZVQSIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjYiPjxkaXYgY2xhc3M9ImltYWdlQ29udGFpbmVyIiBkYXRhLXJlYWN0aWQ9IjciPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIGltYWdlQ29udGFpbmVyX19pbWFnZSIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvSS81MVZ6U2RqcmlPTC5fQUNfU1gxNjBfLmpwZyIgYWx0PSJMZWFybiBTLlEuTC4gZnJvbSB0aGUgZXhwZXJ0cyBpbiB0aGUgcHJlbWllciBndWlkZSBmb3IgYmVnaW5uZXJzIiBkYXRhLXJlYWN0aWQ9IjgiLz48L2Rpdj48L2E+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxMDAlO2JhY2tncm91bmQ6I0ZGRkZGRjsiIGRhdGEtcmVhY3RpZD0iOSI+PGRpdiBjbGFzcz0iYmxvY2sgYmxvY2stLWp1c3RpZnktY2VudGVyIGJsb2NrLS1kaXJlY3Rpb24tY29sdW1uIiBzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjAgMTBweCAwIDA7IiBkYXRhLXJlYWN0aWQ9IjEwIj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDAgNXB4IDA7IiBkYXRhLXJlYWN0aWQ9IjExIj48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZXh0TGluayB0ZXh0TGluay0tZGlzcGxheUFzVGV4dCIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9RblBFaXBhbG1HdVRwbURGemtLRHBVSUFBQUZocEprb1pRRUFBQUdRQVdXcHpzUS9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPWtKYmEueDI5UHAweEUuS2NvT2VmVUEiIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIxMiI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjE4cHg7IiBjbGFzcz0idGV4dENvbnRhaW5lciIgZGF0YS1yZWFjdGlkPSIxMyI+PHNwYW4gY2xhc3M9InRleHRDb250YWluZXJfX3RleHQiIGRhdGEtcmVhY3RpZD0iMTQiPlRyb3VibGUgbGV2ZXJhZ2luZyB5b3VyIGRhdGE/PC9zcGFuPjwvZGl2PjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDAgNXB4IDA7IiBkYXRhLXJlYWN0aWQ9IjE1Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZXh0TGluayIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9RblBFaXBhbG1HdVRwbURGemtLRHBVSUFBQUZocEprb1pRRUFBQUdRQVdXcHpzUS9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPWtKYmEueDI5UHAweEUuS2NvT2VmVUEiIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIxNiI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjEycHg7IiBjbGFzcz0idGV4dENvbnRhaW5lciBoLWVsbGlwc2lzIiBkYXRhLXJlYWN0aWQ9IjE3Ij48c3BhbiBjbGFzcz0idGV4dENvbnRhaW5lcl9fdGV4dCIgZGF0YS1yZWFjdGlkPSIxOCI+TGVhcm4gUy5RLkwuIGZyb20gdGhlIGV4cGVydHMgaW4gdGhlIHByZW1pZXIgZ3VpZGUgZm9yIGJlZ2lubmVyczwvc3Bhbj48L2Rpdj48L2E+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJtYXJnaW46MCAwIDRweCAwOyIgZGF0YS1yZWFjdGlkPSIxOSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgc3RhclJhdGluZyIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9RblBFaXBhbG1HdVRwbURGemtLRHBVSUFBQUZocEprb1pRRUFBQUdRQVdXcHpzUS9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPWtKYmEueDI5UHAweEUuS2NvT2VmVUEjY3VzdG9tZXJSZXZpZXdzIiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iMjAiPjxkaXYgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIHN0YXJSYXRpbmdfX3N0YXJzIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTp1cmwoJiN4Mjc7aHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGEvY3JlYXRpdmVzL2F1aS1taW5pLXNwcml0ZS0yMDE1LTAyLnBuZyYjeDI3Oyk7YmFja2dyb3VuZC1wb3NpdGlvbjotMTcwcHggMDsiIGRhdGEtcmVhY3RpZD0iMjEiPjwvZGl2PjxzcGFuIGNsYXNzPSJzdGFyUmF0aW5nX19jb3VudCIgZGF0YS1yZWFjdGlkPSIyMiI+MTU4PC9zcGFuPjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayBibG9jay0taW5saW5lICIgc3R5bGU9IndoaXRlLXNwYWNlOm5vcm1hbDsiIGRhdGEtcmVhY3RpZD0iMjMiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgNXB4IDAgMDsiIGRhdGEtcmVhY3RpZD0iMjQiPjxzcGFuIGNsYXNzPSJwcmljZUJveCIgZGF0YS1yZWFjdGlkPSIyNSI+PHNwYW4gY2xhc3M9InByaWNlIHByaWNlQm94X19idXkiIHN0eWxlPSJmb250LXNpemU6MTVweDsiIGRhdGEtcmVhY3RpZD0iMjYiPjxzcGFuIGNsYXNzPSJwcmljZV9fY3VycmVuY3kiIGRhdGEtcmVhY3RpZD0iMjciPiQ8L3NwYW4+PHNwYW4gY2xhc3M9InByaWNlX19hbW91bnQiIGRhdGEtcmVhY3RpZD0iMjgiPjE0Ljk5PC9zcGFuPjwvc3Bhbj48IS0tIHJlYWN0LXRleHQ6IDI5IC0tPjwhLS0gL3JlYWN0LXRleHQgLS0+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiIGRhdGEtcmVhY3RpZD0iMzAiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIHByaW1lTG9nbyIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYS9jcmVhdGl2ZXMvcHJpbWUtMngtMjAxNzA2MTQucG5nIiB3aWR0aD0iNDMiIGhlaWdodD0iMTIiIGFsdD0iUHJpbWUiIGRhdGEtcmVhY3RpZD0iMzEiLz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDEwcHggMCAxMHB4O2hlaWdodDoxMjNweDtvcGFjaXR5OjAuNjQ7ZmxleDowIDAgOXB4OyIgZGF0YS1yZWFjdGlkPSIzMiI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMzMiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIGltYWdlQ29udGFpbmVyX19pbWFnZSIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9BbWF6b25CcmFuZFN0b3Jlc1BsYXRmb3JtL2JsYWNrX2Fycm93LnBuZyIgYWx0PSJHcmF5IEFycm93IiByb2xlPSJwcmVzZW50YXRpb24iIGRhdGEtcmVhY3RpZD0iMzQiLz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC0xNS4zLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC1kb20tMTUuMy4yLm1pbi5qcyI+PC9zY3JpcHQ+PHNjcmlwdD52YXIgTGlicmFyeT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgbz1uW3JdPXtleHBvcnRzOnt9LGlkOnIsbG9hZGVkOiExfTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmxvYWRlZD0hMCxvLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQucD0iIix0KDApfShbZnVuY3Rpb24oZSx0LG4pe24oMSksZS5leHBvcnRzPW4oMTA0KX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJihPYmplY3QuYXNzaWduPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0KGUpLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbz1hcmd1bWVudHNbcl07aWYobnVsbCE9bylmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKG5baV09b1tpXSl9cmV0dXJuIG59KX0sLGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVJlYWN0fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDYpLGM9cihwKSxmPW4oMjcpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucHJvcHMudXBkYXRlT25SZXNpemUmJnRoaXMubGlzdGVuRm9yUmVzaXplKCl9fSx7a2V5OiJsaXN0ZW5Gb3JSZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczsidW5kZWZpbmVkIiE9dHlwZW9mIFNGQ2xpZW50JiZTRkNsaWVudCYmU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/U0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KToidW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50JiZNU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/TVNGQ2xpZW50LnJlZ2lzdGVyQ3VzdG9tTWVzc2FnZUxpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7ZS5vblJlc2l6ZSgpfSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KX19LHtrZXk6Im9uUmVzaXplIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZm9yY2VVcGRhdGUoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnJlbmRlcmluZ0NvbnRleHQsdD10aGlzLnByb3BzLnN0cnVjdHVyZSxuPXRoaXMucHJvcHMuY2xhc3NOYW1lKyh0aGlzLnByb3BzLnNreT8iIHNreSI6IiIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3RlbXBsYXRlSWQ6dGhpcy5wcm9wcy50ZW1wbGF0ZUlkLGNsYXNzTmFtZTpuLGhyZWY6ZS5hZExpbmssY2xpY2tVcmxzOmUuY2xpY2tVcmxzLGNyZWF0aXZlSWQ6ZS5jcmVhdGl2ZUlkLGFkSWQ6ZS5hZElkfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3JlbmRlcmluZ0NvbnRleHQ6ZSxibG9jazp0LGNvbXBvbmVudHNNYXA6dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6dGhpcy5wcm9wcy5kb21SZWZzfSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJ0ZW1wbGF0ZUNvbnRhaW5lciIsImJsb2NrIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZW1wbGF0ZSIsaC5wcm9wVHlwZXM9e3JlbmRlcmluZ0NvbnRleHQ6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsc3RydWN0dXJlOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY2xhc3NOYW1lOnUuUHJvcFR5cGVzLnN0cmluZyxkb21SZWZzOnUuUHJvcFR5cGVzLm9iamVjdCx0ZW1wbGF0ZUlkOnUuUHJvcFR5cGVzLnN0cmluZyx1cGRhdGVPblJlc2l6ZTp1LlByb3BUeXBlcy5ib29sLHNreTp1LlByb3BUeXBlcy5ib29sfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPW4oMjQpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zdGF0ZT17ZmxleGJveDohMH0sbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ub2RlJiZ0aGlzLnNldFN0YXRlKHtmbGV4Ym94OmRbImRlZmF1bHQiXS5zdXBwb3J0LmZsZXhib3goKX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUrIiAiOiIiKSsidGVtcGxhdGVDb250YWluZXIiKyh0aGlzLnN0YXRlLmZsZXhib3g/IiI6IiBoLW5vRmxleGJveCIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxjbGFzc05hbWU6dCxpZDp0aGlzLnByb3BzLnRlbXBsYXRlSWQsImRhdGEtY3JlYXRpdmUtaWQiOnRoaXMucHJvcHMuY3JlYXRpdmVJZCwiZGF0YS1hZC1pZCI6dGhpcy5wcm9wcy5hZElkLHJlZjpmdW5jdGlvbih0KXtlLm5vZGU9dH19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJ0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayJ9fSksdGhpcy5wcm9wcy5jaGlsZHJlbil9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIkNsaWNrdGhyb3VnaExpbmsiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRlbXBsYXRlQ29udGFpbmVyICIsaC5wcm9wVHlwZXM9e3N0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxjbGFzc05hbWU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRlbXBsYXRlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGhyZWY6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLGNyZWF0aXZlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFkSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1uKDMpLHA9cihsKSxjPW4oOCksZj1yKGMpLGQ9big5KSxoPXIoZCkseT1uKDEyKSxtPXIoeSksYj1uKDIzKSx2PXIoYiksZz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGIuQ09VUE9OX1RPS0VOX01BQ1JPLCgwLHZbImRlZmF1bHQiXSkoKSl9LF89ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJoYW5kbGVPbkNsaWNrIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnByb3BzLG49dC5jbGlja1RyYWNrZXJVcmxzLHI9dC51cmwsbz10LmNhc2NhZGluZ0ludGVudCxpPXQuaXNPZmZzaXRlOygwLGZbImRlZmF1bHQiXSkobiksKDAsbVsiZGVmYXVsdCJdKShnKHIpLGksbykmJmUucHJldmVudERlZmF1bHQoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5wcm9wcyxuPXQudXJsLHI9dC5pc09mZnNpdGUsbz10LmNoaWxkcmVuLGk9dC5hbmNob3JQcm9wcyxhPW51bGw7dGhpcy5jb250ZXh0LmlzU3RhdGljSHRtbCYmdGhpcy5wcm9wcy5jbGlja1RyYWNrZXJVcmxzJiYoYT10aGlzLnByb3BzLmNsaWNrVHJhY2tlclVybHMuam9pbigifCIpKTt2YXIgdT0iY2xpY2t0aHJvdWdoTGluayIrKGkuY2xhc3NOYW1lPyIgIitpLmNsYXNzTmFtZToiIik7cmV0dXJuIHBbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJhIixzKHt9LGkse2NsYXNzTmFtZTp1LGhyZWY6ZyhuKSx0YXJnZXQ6KDAsaFsiZGVmYXVsdCJdKShuLHIpLG9uQ2xpY2s6ZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlT25DbGljayh0KX0sb25Nb3VzZURvd246ZnVuY3Rpb24oKXtyZXR1cm4gZS5mb3JjZVVwZGF0ZSgpfSwiZGF0YS1jbGlja1RyYWNrZXJVcmxzIjphLHJlbDoibm9mb2xsb3cifSksbyl9fV0pLHR9KGwuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09XyxfLmRpc3BsYXlOYW1lPSJDbGlja3Rocm91Z2hMaW5rIixfLnByb3BUeXBlcz17dXJsOmwuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNhc2NhZGluZ0ludGVudDpsLlByb3BUeXBlcy5zdHJpbmcsaXNPZmZzaXRlOmwuUHJvcFR5cGVzLmJvb2wsY2xpY2tUcmFja2VyVXJsczpsLlByb3BUeXBlcy5hcnJheU9mKGwuUHJvcFR5cGVzLnN0cmluZyksYW5jaG9yUHJvcHM6bC5Qcm9wVHlwZXMub2JqZWN0LGNoaWxkcmVuOmwuUHJvcFR5cGVzLm5vZGV9LF8uY29udGV4dFR5cGVzPXtpc1N0YXRpY0h0bWw6bC5Qcm9wVHlwZXMuYm9vbH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG89MDtlPm87bysrKXRbb109YXJndW1lbnRzW29dO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhPXRbaV07aWYoYSlpZigic3RyaW5nIj09dHlwZW9mIGEpcihhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpcmUgcGl4ZWw6ICInK0pTT04uc3RyaW5naWZ5KGEpKyciIGlzIG5vdCBhIHN0cmluZyEnKTtuLmFwcGx5KHRoaXMsYSl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZSYmKChuZXcgSW1hZ2UpLnNyYz1lKX07dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49dHx8ISgwLGFbImRlZmF1bHQiXSkoZSk7cmV0dXJuIG4/cy5JTl9ORVdfV0lORE9XOnMuSU5fU0FNRV9XSU5ET1d9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1vO3ZhciBpPW4oMTApLGE9cihpKSxzPW4oMTEpfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe3JldHVybiByLnRlc3QoZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1uO3ZhciByPS9eKChodHRwcz86KT9cL1wvKSguKlwuKT9hbWF6b25cLi99LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj10LklOX1NBTUVfV0lORE9XPSJfdG9wIixyPXQuSU5fTkVXX1dJTkRPVz0iX2JsYW5rIjt0WyJkZWZhdWx0Il09e0lOX05FV19XSU5ET1c6cixJTl9TQU1FX1dJTkRPVzpufX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0LG4pe2lmKCF0JiZtWyJkZWZhdWx0Il0mJkMmJnBbImRlZmF1bHQiXS5tYXNoLmlzQVVJQXZhaWxhYmxlKCkmJigwLFRbImRlZmF1bHQiXSkoZSx0KT09PVAuSU5fTkVXX1dJTkRPVylwWyJkZWZhdWx0Il0ubWFzaC5vcGVuSW5FeHRlcm5hbEJyb3dzZXIuZXhlY3V0ZSh7dXJsOmV9KTtlbHNlIGlmKCF0fHwhTXx8dlsiZGVmYXVsdCJdJiYhUyhbMiwyLDEwXSl8fF9bImRlZmF1bHQiXSYmIVMoWzUsNSwxMzVdKSl7aWYoIXR8fCFJKXJldHVybiExO2ZbImRlZmF1bHQiXS5vcGVuKGUpfWVsc2UgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcihufHxlKTtyZXR1cm4hMH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuKDAsVFsiZGVmYXVsdCJdKShlLHQpPT09UC5JTl9TQU1FX1dJTkRPV31mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3JldHVybiB1WyJkZWZhdWx0Il0ub3BlbihlLCgwLFRbImRlZmF1bHQiXSkoZSx0KSl9LGE9ZnVuY3Rpb24oKXtyZXR1cm4gbyhlLHQsbil9LHM9ZnVuY3Rpb24oKXtyZXR1cm4gYSgpfHxyKCl9O3JldHVybiBpKGUsdCk/KHNldFRpbWVvdXQocyxOKSwhMCk6YSgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0WyJkZWZhdWx0Il09YTt2YXIgcz1uKDEzKSx1PXIocyksbD1uKDE0KSxwPXIobCksYz1uKDE1KSxmPXIoYyksZD1uKDE2KSxoPXIoZCkseT1uKDE3KSxtPXIoeSksYj1uKDE4KSx2PXIoYiksZz1uKDIxKSxfPXIoZyksUD1uKDExKSxrPW4oOSksVD1yKGspLHg9bigyMiksTz1yKHgpLHc9ISFwWyJkZWZhdWx0Il0sQz13JiYidW5kZWZpbmVkIiE9dHlwZW9mIHBbImRlZmF1bHQiXS5tYXNoLGo9ISFoWyJkZWZhdWx0Il0sTT1qJiYiZnVuY3Rpb24iPT10eXBlb2YgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcixFPSEhZlsiZGVmYXVsdCJdLEk9RSYmImZ1bmN0aW9uIj09dHlwZW9mIGZbImRlZmF1bHQiXS5vcGVuLFI9aiYmZnVuY3Rpb24oKXt2YXIgZT1oWyJkZWZhdWx0Il0uZ2V0U0RLVmVyc2lvbigpLm1hdGNoKC8oXGQrKVwuKFxkKykuKFxkKykkLyk7cmV0dXJuIGU/W2VbMV0sZVsyXSxlWzNdXTp2b2lkIDB9KCksUz1mdW5jdGlvbihlKXtyZXR1cm4gUiYmKDAsT1siZGVmYXVsdCJdKShSLGUpPj0wfSxOPTE1MH0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50O3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBtcmFpZCYmbXJhaWQ7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbiYmYW1hem9uO3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxpPW4oMTQpLGE9cihpKSxzPWZ1bmN0aW9uKCl7aWYoIWFbImRlZmF1bHQiXSlyZXR1cm4hMTt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYVsiZGVmYXVsdCJdLmdldERvY3VtZW50Q29va2llKCkpLnNwbGl0KCI7IikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10LnNwbGl0KCI9Iik7biYmbi5sZW5ndGg+PTImJihlW25bMF0udHJpbSgpXT1uWzFdLnRyaW0oKSl9KSx7djovXCJhdlwiOlwiKFsuXGRdKilcIi9pLnRlc3QoZVsiYW16bi1hcHAtY3R4dCJdKX19KCk7cmV0dXJuIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOm8oZSkpP2Uudjp2b2lkIDB9KCk7dFsiZGVmYXVsdCJdPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L2lQaG9uZXxpUGFkfGlQb2QvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE0KSxpPXIobyksYT1uKDIwKSxzPXIoYSksdT1pWyJkZWZhdWx0Il0mJmlbImRlZmF1bHQiXS5nZXRVc2VyQWdlbnRJbmZvKCl8fHNbImRlZmF1bHQiXSYmc1siZGVmYXVsdCJdLnVzZXJBZ2VudDt0WyJkZWZhdWx0Il09dX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3I7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L0FuZHJvaWQvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgbj1NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCkscj0wO24+cjtyKyspe3ZhciBvPWVbcl0saT10W3JdO2lmKG8+aSlyZXR1cm4gMTtpZihpPm8pcmV0dXJuLTF9cmV0dXJuIDB9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiJBTVMiO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hP2J0b2EoRGF0ZS5ub3coKSsoIjsiK2UpKToiIn1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW47dC5DT1VQT05fVE9LRU5fTUFDUk89IlZQQ19DU19NQUNSTyJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDI1KSxpPXIobyksYT1uKDI2KSxzPXIoYSksdT0vXi4qXC9cL1teXC9dKy87ZS5leHBvcnRzPXtzdXBwb3J0OntmbGV4Ym94OmZ1bmN0aW9uKCl7cmV0dXJuIE1vZGVybml6ciYmKE1vZGVybml6ci5mbGV4Ym94fHxNb2Rlcm5penIuZmxleGJveGxlZ2FjeXx8TW9kZXJuaXpyLmZsZXhib3h0d2VlbmVyKX19LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB0LnNwbGl0KCIuIikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5tYXRjaCgvKC4qKVxbKFxkKilcXS8pLHI9biYmblsxXSxvPW4mJm5bMl07cmV0dXJuIHImJm8/ZVtyXVtwYXJzZUludChvLDEwKV06ZVt0XX0sZSl9LGdldE1lZGlhQ2VudHJhbEltYWdlU3JjOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgbz1pWyJkZWZhdWx0Il0udXJscy5NRURJQV9DRU5UUkFMX1dXLGE9ZS5yZXBsYWNlKHUsIiIpLGw9bysoMD09PWEuaW5kZXhPZigiLyIpPyIiOiIvIikrYSxwPXt9LGM9cj8yOjE7cmV0dXJuIHQuYWMmJihwLkFDPSEwKSx0LnN4JiYocC5TWD10LnN4KmMpLHQuc3kmJihwLlNZPXQuc3kqYyksdC5xbCYmKHAuUUw9dC5xbCksdC5mbSYmKHAuRk09dC5mbSksc1siZGVmYXVsdCJdLnNldFRhZ3MobCxwLFsiQUMiLCJTWCIsIlNZIiwiRk0iLCJRTCJdLG4pfX19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dXJsczp7TUVESUFfQ0VOVFJBTF9XVzoiaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20iLE1FRElBX0NFTlRSQUxfQ046Imh0dHBzOi8vaW1hZ2VzLWNuLnNzbC1pbWFnZXMtYW1hem9uLmNvbSJ9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtzZXRUYWdzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPS9cLl8oW15cLl0rKSg/PV9cLlx3KyQpLyxpPW8uZXhlYyhlKSxhPWk/aVsxXS5zcGxpdCgiXyIpOltdLHM9T2JqZWN0LmFzc2lnbih7fSx0KSx1PVtdO3ImJmEuZm9yRWFjaChmdW5jdGlvbihlKXtpZigiIiE9PWUpe3ZhciB0LG49ZS5zdWJzdHJpbmcoMCwyKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNbbl0/KHNbbl09PT0hMSYmKHNbbl09bnVsbCksbj1udWxsKTp0PWUuc3Vic3RyaW5nKDIsZS5sZW5ndGgpLG51bGwhPT1uJiZ1LnB1c2gobit0KX19KSxuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9c1tlXTt0JiZ1LnB1c2goZSsodD09PSEwPyIiOnQpKX0pO3ZhciBsPS0xO3UuZm9yRWFjaChmdW5jdGlvbihlLHQpeyJDUiI9PT1lLnN1YnN0cmluZygwLDIpJiYobD10KX0pO3ZhciBwPSExO2lmKGw+PTApe3ZhciBjPXUuc3BsaWNlKGwsMSk7dS51bnNoaWZ0KGNbMF0pLHA9ITB9dmFyIGY9dS5pbmRleE9mKCJBQyIpO2lmKGY+MCl7dmFyIGQ9dS5zcGxpY2UoZiwxKTtwP3Uuc3BsaWNlKDEsMCxkWzBdKTp1LnVuc2hpZnQoZFswXSl9cmV0dXJuIHUubGVuZ3RoPjAmJihlPWEubGVuZ3RoPjA/ZS5yZXBsYWNlKG8sIi5fIit1LmpvaW4oIl8iKSk6ZS5yZXBsYWNlKC9cLig/PVx3KyQpLywiLl8iK3Uuam9pbigiXyIpKyJfLiIpKSxlfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigyNCksYz1yKHApLGY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtjbG9hazpuLmV4dHJhY3RNZXRhZGF0YShlLmJsb2NrLCJjbG9hayIpfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldFN0YXRlKHtjbG9hazohMX0pfX0se2tleToiZ2V0Q2xhc3NOYW1lIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJibG9jayIsdD0iIjt0aGlzLnByb3BzLmJsb2NrLmNzc0NsYXNzZXMmJih0PXRoaXMucHJvcHMuYmxvY2suY3NzQ2xhc3Nlcy5qb2luKCIgIikpLCIiIT09dCYmKGUrPSIgIit0KTt2YXIgbj10aGlzLnByb3BzLmJsb2NrLmxheW91dDtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1uW3RdOyJqdXN0aWZ5Q29udGVudCI9PT10JiYiZmxleC1zdGFydCIhPT1yP2UrPSIgYmxvY2stLWp1c3RpZnktIityOiJhbGlnbkl0ZW1zIj09PXQmJiJzdHJldGNoIiE9PXI/ZSs9IiBibG9jay0tYWxpZ24tIityOiJmbGV4RGlyZWN0aW9uIj09PXQmJiJyb3ciIT09ciYmKGUrPSIgYmxvY2stLWRpcmVjdGlvbi0iK3IpfSksdGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kJiZ0aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQuaWQmJihlKz0iIGJsb2NrLS1iYWNrZ3JvdW5kIiksdGhpcy5zdGF0ZS5jbG9hayYmKGUrPSIgaC1jbG9hayIpLGV9fSx7a2V5OiJwcmV2ZW50UHJvcGVydHkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJiIiIT09dD8ianVzdGlmeUNvbnRlbnQiPT09ZXx8ImFsaWduSXRlbXMiPT09ZXx8ImZsZXhEaXJlY3Rpb24iPT09ZTohMH19LHtrZXk6ImdldEJsb2NrTGF5b3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLmJsb2NrLmxheW91dCxuPXt9O3JldHVybiB0JiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPXRbcl07ZS5wcmV2ZW50UHJvcGVydHkocixvKXx8KG5bcl09byl9KSxufX0se2tleToiZ2V0QmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmJsb2NrLnN0eWxlLHQ9e307cmV0dXJuIGUmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnZhbHVlOyJ1bmRlZmluZWQiIT10eXBlb2YgdFtlLm5hbWVdJiYobj10W2UubmFtZV0rIjsiK2UubmFtZSsiOiIrbiksdFtlLm5hbWVdPW59KSx0fX0se2tleToiZ2V0UHJvcFZhbHVlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiJwYXRoIj09PXQudHlwZT9jWyJkZWZhdWx0Il0uZ2V0KGUsdC52YWx1ZSk6ImNvbnN0YW50Ij09PXQudHlwZT90LnZhbHVlOm51bGx9fSx7a2V5OiJnZXRDb21wb25lbnRQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXt9O3JldHVybiBlLnByb3BzJiZlLnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlLm5hbWVdPXQuZ2V0UHJvcFZhbHVlKHQucHJvcHMucmVuZGVyaW5nQ29udGV4dCxlKX0pLG59fSx7a2V5OiJleHRyYWN0TWV0YWRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKG49ZS52YWx1ZSl9KSxufX0se2tleToic2V0UmVmIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmV4dHJhY3RNZXRhZGF0YSh0aGlzLnByb3BzLmJsb2NrLCJyZWYiKTt0JiZ0aGlzLnByb3BzLmRvbVJlZnMmJih0aGlzLnByb3BzLmRvbVJlZnNbdF09ZSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImhpZGUiKSxyPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImlkIiksbz12b2lkIDAsaT12b2lkIDAsYT12b2lkIDAscz12b2lkIDAsdT12b2lkIDAscD12b2lkIDAsYz12b2lkIDA7aWYoIW4pe289dGhpcy5nZXRDbGFzc05hbWUoKTt2YXIgZj10aGlzLmdldEJsb2NrTGF5b3V0KCksZD10aGlzLmdldEJsb2NrU3R5bGUoKTtpPU9iamVjdC5hc3NpZ24oe30sZixkKSxhPVtdO3ZhciBoPXRoaXMucHJvcHMuYmxvY2suY2hpbGRyZW47aCYmaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2EucHVzaChsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCh0LHtyZW5kZXJpbmdDb250ZXh0OmUucHJvcHMucmVuZGVyaW5nQ29udGV4dCxibG9jazpuLGNvbXBvbmVudHNNYXA6ZS5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6ZS5wcm9wcy5kb21SZWZzLGtleTpuLmlkfSkpfSk7dmFyIHk9dGhpcy5wcm9wcy5ibG9jay5jb21wb25lbnQ7eSYmKHU9dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwW3kuaWRdLHM9dGhpcy5nZXRDb21wb25lbnRQcm9wcyh5KSk7dmFyIG09dGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kO20mJihjPXRoaXMucHJvcHMuY29tcG9uZW50c01hcFttLmlkXSxwPXRoaXMuZ2V0Q29tcG9uZW50UHJvcHMobSkpfXJldHVybiFuJiZsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7aWQ6cixjbGFzc05hbWU6byxzdHlsZTppLHJlZjpmdW5jdGlvbih0KXtlLnNldFJlZih0KX19LGMmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJsb2NrX19iYWNrZ3JvdW5kIn0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoYyxwKSksYS5sZW5ndGg+MD9hOnUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHUscykpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iQmxvY2siLGYucHJvcFR5cGVzPXtyZW5kZXJpbmdDb250ZXh0OnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGJsb2NrOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsZG9tUmVmczp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89MTk5LGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm1vZGVsPXQsdGhpcy5ibG9ja3NNYXA9e30sdGhpcy5fYnVpbGRCbG9ja3NNYXAoKX1yZXR1cm4gcihlLFt7a2V5OiJfYnVpbGRCbG9ja3NNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD17fTtlLnB1c2godGhpcy5tb2RlbCk7Zm9yKHZhciBuPTA7ZS5sZW5ndGg+MDspe3ZhciByPWUuc2hpZnQoKSxpPXRoaXMuX2dldFJlZklkKHIpO2lmKCIiIT09aSYmKHRoaXMuYmxvY2tzTWFwW2ldPXIpLHRbci5pZF18fCh0W3IuaWRdPSEwLGU9ZS5jb25jYXQoci5jaGlsZHJlbnx8W10pKSxuKyssbj5vKWJyZWFrfX19LHtrZXk6Il9nZXRSZWZJZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7InJlZiI9PT1lLm5hbWUmJih0PWUudmFsdWUpfSksdH19LHtrZXk6ImhpZGVCbG9jayIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiZuLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ImhpZGUiPT09ZS5uYW1lJiYoZS52YWx1ZT10KX0pfX0se2tleToiYWRkQmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuYmxvY2tzTWFwW2VdO3ImJihyLnN0eWxlPXIuc3R5bGV8fFtdLHIuc3R5bGUucHVzaCh7bmFtZTp0LHZhbHVlOm59KSl9fSx7a2V5OiJhZGRDc3NDbGFzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiYobi5jc3NDbGFzc2VzPW4uY3NzQ2xhc3Nlc3x8W10sbi5jc3NDbGFzc2VzLnB1c2godCkpfX0se2tleToiZ2V0Q29tcG9uZW50UHJvcCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXSxyPW51bGw7cmV0dXJuIG4mJm4uY29tcG9uZW50JiZuLmNvbXBvbmVudC5wcm9wcyYmbi5jb21wb25lbnQucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYocj1lKX0pLHJ9fSx7a2V5OiJzZXRDb21wb25lbnRQcm9wIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzLmJsb2Nrc01hcFtlXTtpZihvJiZvLmNvbXBvbmVudCl7dmFyIGk9ITE7by5jb21wb25lbnQucHJvcHM9by5jb21wb25lbnQucHJvcHN8fFtdLG8uY29tcG9uZW50LnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKGUudmFsdWU9bixlLnR5cGU9cixpPSEwKX0pLGl8fG8uY29tcG9uZW50LnByb3BzLnB1c2goe25hbWU6dCx2YWx1ZTpuLHR5cGU6cn0pfX19LHtrZXk6InNldENzc0NsYXNzZXMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ibG9ja3NNYXBbZV07biYmKG4uY3NzQ2xhc3Nlcz1uLmNzc0NsYXNzZXN8fFtdLEFycmF5LmlzQXJyYXkodCk/bi5jc3NDbGFzc2VzPXQ6bi5jc3NDbGFzc2VzLnB1c2godCkpfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1pfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM0KSxjPXIocCksZj1uKDM1KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0LGFsaWdubWVudDp0aGlzLnByb3BzLmFsaWdubWVudCxtYXhIZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHR9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7YWRkaXRpb25hbENsYXNzOnRoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzLHBhdGg6dGhpcy5wcm9wcy5wYXRoLHdpZHRoOnRoaXMucHJvcHMud2lkdGgsaGVpZ2h0OnRoaXMucHJvcHMuaGVpZ2h0LHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxxbDp0aGlzLnByb3BzLnFsLHJldGluYTp0aGlzLnByb3BzLnJldGluYSxhYzp0aGlzLnByb3BzLmFjLGZtOnRoaXMucHJvcHMuZm0sbWVyZ2VUYWdzOnRoaXMucHJvcHMubWVyZ2VUYWdzLGFsdDp0aGlzLnByb3BzLmFsdCxzcHJpdGU6dGhpcy5wcm9wcy5zcHJpdGUscm9sZTp0aGlzLnByb3BzLnJvbGUsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsiaW1hZ2VDb250YWluZXIiLCJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWgsaC5kaXNwbGF5TmFtZT0iTWVkaWFDZW50cmFsSW1hZ2VDb250YWluZXIiLGgucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyx3aWR0aDp1LlByb3BUeXBlcy5zdHJpbmcsaGVpZ2h0OnUuUHJvcFR5cGVzLnN0cmluZyxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHJldGluYTp1LlByb3BUeXBlcy5ib29sLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLGZtOnUuUHJvcFR5cGVzLnN0cmluZyxtZXJnZVRhZ3M6dS5Qcm9wVHlwZXMuYm9vbCxhbHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHNwcml0ZTp1LlByb3BUeXBlcy5ib29sLHJvbGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRpdGxlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3Qsb25Mb2FkOnUuUHJvcFR5cGVzLmZ1bmMsbWF4SGVpZ2h0OnUuUHJvcFR5cGVzLm51bWJlcn0saC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJpbWFnZUNvbnRhaW5lciIrKHRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0PyIgaW1hZ2VDb250YWluZXItLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIpO3RoaXMucHJvcHMuYWxpZ25tZW50JiYiIiE9PXRoaXMucHJvcHMuYWxpZ25tZW50JiYoZSs9IiBpbWFnZUNvbnRhaW5lci0tIit0aGlzLnByb3BzLmFsaWdubWVudCk7dmFyIHQ9e307cmV0dXJuIHRoaXMucHJvcHMubWF4SGVpZ2h0JiZPYmplY3QuYXNzaWduKHQse21heEhlaWdodDp0aGlzLnByb3BzLm1heEhlaWdodH0pLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ZSxzdHlsZTp0fSxsWyJkZWZhdWx0Il0uY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRyZW4se2FkZGl0aW9uYWxDbGFzczoiaW1hZ2VDb250YWluZXJfX2ltYWdlIn0pKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1wLHAuZGlzcGxheU5hbWU9IkltYWdlQ29udGFpbmVyIixwLnByb3BUeXBlcz17ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyxtYXhIZWlnaHQ6dS5Qcm9wVHlwZXMubnVtYmVyfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM2KSxjPShyKHApLG4oMjQpKSxmPXIoYyksZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRJbWFnZVNyYyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGZbImRlZmF1bHQiXS5nZXRNZWRpYUNlbnRyYWxJbWFnZVNyYyhlLHthYzp0aGlzLnByb3BzLmFjLHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxmbTp0aGlzLnByb3BzLmZtLHFsOnRoaXMucHJvcHMucWx9LHRoaXMucHJvcHMubWVyZ2VUYWdzLHRoaXMucHJvcHMucmV0aW5hKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRJbWFnZVNyYyh0aGlzLnByb3BzLnBhdGgpLG49Im1lZGlhQ2VudHJhbEltYWdlIisodGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiKTtpZih0aGlzLnByb3BzLnNwcml0ZSl7dmFyIHI9T2JqZWN0LmFzc2lnbih7d2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYmFja2dyb3VuZEltYWdlOiJ1cmwoJyIrdCsiJykifSx0aGlzLnByb3BzLnN0eWxlKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpuLHN0eWxlOnIsdGl0bGU6dGhpcy5wcm9wcy50aXRsZX0pfXJldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiaW1nIix7Y2xhc3NOYW1lOm4sc3JjOnQsd2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYWx0OnRoaXMucHJvcHMuYWx0LHJvbGU6dGhpcy5wcm9wcy5yb2xlLHRpdGxlOnRoaXMucHJvcHMudGl0bGUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxvbkxvYWQ6ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbkxvYWQmJmUucHJvcHMub25Mb2FkKHQudGFyZ2V0KX19KX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9Ik1lZGlhQ2VudHJhbEltYWdlIixkLnByb3BUeXBlcz17YWRkaXRpb25hbENsYXNzOnUuUHJvcFR5cGVzLnN0cmluZyxwYXRoOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIscmV0aW5hOnUuUHJvcFR5cGVzLmJvb2wsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsZm06dS5Qcm9wVHlwZXMuc3RyaW5nLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGFsdDp1LlByb3BUeXBlcy5zdHJpbmcsc3ByaXRlOnUuUHJvcFR5cGVzLmJvb2wscm9sZTp1LlByb3BUeXBlcy5zdHJpbmcsdGl0bGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxvbkxvYWQ6dS5Qcm9wVHlwZXMuZnVuY30sZC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInJldGluYSBtb2R1bGVzIGV4cGVjdHMgYSBmdW5jdGlvbiBvblJldGluYVN0YXRlQ2hhbmdlIGFjY2VwdGluZyBib29sZWFuIik7aWYod2luZG93Lm1hdGNoTWVkaWEpe3ZhciB0PXdpbmRvdy5tYXRjaE1lZGlhKCIoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwobWluLXJlc29sdXRpb246IDE5MmRwaSkiKSxuPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQubWF0Y2hlcyl9O3QmJm4odCksdC5hZGRMaXN0ZW5lciYmdC5hZGRMaXN0ZW5lcihuKX1lbHNlIGUod2luZG93LmRldmljZVBpeGVsUmF0aW8+MT8hMDohMSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzgpLGM9cihwKSxmPTk5OSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5fc2V0U3RhdGUoZSksbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0ZSh0aGlzLnByb3BzKSx0aGlzLl9oYW5kbGVUZXh0T3ZlcmZsb3coKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToiY29tcG9uZW50RGlkVXBkYXRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0idGV4dENvbnRhaW5lcl9fdGV4dCI7dCs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciBuPXtmb250U2l6ZTp0aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4fTtyZXR1cm4gT2JqZWN0LmFzc2lnbihuLHRoaXMucHJvcHMuc3R5bGUpLHRoaXMucHJvcHMudGV4dD9sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmZ1bmN0aW9uKHQpe2Uubm9kZT10fSxzdHlsZTpuLGNsYXNzTmFtZToidGV4dENvbnRhaW5lciIrKHRoaXMuc3RhdGUudXNlQ3NzVHJ1bmNhdGlvbj8iIGgtZWxsaXBzaXMiOiIiKX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtyZWY6ZnVuY3Rpb24odCl7ZS5zcGFuPXR9LGNsYXNzTmFtZTp0LGlkOnRoaXMucHJvcHMudGV4dElkfSx0aGlzLnByb3BzLnRleHQpKTpudWxsfX0se2tleToiX3NldFN0YXRlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QuYXNzaWduKHt9LGUuZm9udCk7dGhpcy5zdGF0ZT17Zm9udDp0LHVzZUNzc1RydW5jYXRpb246dC5tYXhMaW5lcz8xPT09dC5tYXhMaW5lczohMCxuZWVkc1RpdGxlQXR0cmlidXRlOiExLG9yaWdpbmFsVGV4dDplLnRleHR9fX0se2tleToiX3Nob3dUb29sdGlwIix2YWx1ZTpmdW5jdGlvbihlKXtlPygwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5hdHRyKCJ0aXRsZSIsdGhpcy5zdGF0ZS5vcmlnaW5hbFRleHQpOigwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5yZW1vdmVBdHRyKCJ0aXRsZSIpfX0se2tleToiX2hhbmRsZVRleHRPdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLm5vZGUpaWYodGhpcy5zdGF0ZS51c2VDc3NUcnVuY2F0aW9uKXt2YXIgZT0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5fc2hvd1Rvb2x0aXAoZS50ZXh0T3ZlcmZsb3coKSl9ZWxzZSB0aGlzLl90cnVuY2F0ZU11bHRpTGluZVRleHQoKX19LHtrZXk6Il90cnVuY2F0ZU11bHRpTGluZVRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9Ii4uLiIsdD0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5zcGFuLmlubmVySFRNTD10aGlzLnN0YXRlLm9yaWdpbmFsVGV4dDt2YXIgbj0oMCxjWyJkZWZhdWx0Il0pKHRoaXMuc3BhbikuZGVjb2RlRW50aXRpZXMoKTt0aGlzLm5vZGUuc3R5bGUuZm9udFNpemU9dGhpcy5zdGF0ZS5mb250Lm1heEZvbnRQeCsicHgiO2Zvcih2YXIgcj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsbz10aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4LGk9ITEsYT0wO3I+dGhpcy5zdGF0ZS5mb250Lm1heExpbmVzfHx0LmNoaWxkcmVuT3ZlcmZsb3coKTspe2lmKG88PXRoaXMuc3RhdGUuZm9udC5taW5Gb250UHgpe2l8fChuKz1lLGk9ITApO3ZhciBzPW4ubGVuZ3RoO249bi5zdWJzdHIoMCxzLWUubGVuZ3RoLTEpK2UsdGhpcy5zcGFuLmlubmVySFRNTD1ufWVsc2Ugby0tLHRoaXMubm9kZS5zdHlsZS5mb250U2l6ZT1vKyJweCI7aWYocj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsYSsrLGE+ZilicmVha310aGlzLl9zaG93VG9vbHRpcChpKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9IlRleHRDb250YWluZXIiLGQucHJvcFR5cGVzPXt0ZXh0OnUuUHJvcFR5cGVzLnN0cmluZyxhZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGZvbnQ6dS5Qcm9wVHlwZXMub2JqZWN0LHRleHRJZDp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm5vZGU9dH1yZXR1cm4gcihlLFt7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGVbZV19fSx7a2V5OiJmaW5kIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwodCkpfX0se2tleToicGFyZW50Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLm5vZGUucGFyZW50Tm9kZSl9fSx7a2V5OiJjaGlsZHJlbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkcmVuKX19LHtrZXk6ImNzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm5vZGVbMF18fHRoaXMubm9kZSxyPW4uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLG89cj9yLnNwbGl0KCI7IikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCI6Iil9KTpbXSxpPXt9O28uZm9yRWFjaChmdW5jdGlvbihlKXtlWzBdJiYiIiE9PWVbMF0mJihpW2VbMF1dPWVbMV0pfSksaVtlXT10O3ZhciBhPSIiO3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ErPWUrIjoiK2lbZV0rIjsifSksbi5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKSx0aGlzfX0se2tleToiYXR0ciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQ/KHRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoZSx0KSx0aGlzLm5vZGUpOnRoaXMubm9kZS5nZXRBdHRyaWJ1dGUoZSl9fSx7a2V5OiJyZW1vdmVBdHRyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlLnJlbW92ZUF0dHJpYnV0ZShlKSx0aGlzLm5vZGV9fSx7a2V5OiJvdXRlckhlaWdodCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLm5vZGUub2Zmc2V0SGVpZ2h0O3JldHVybiBlJiYodD1nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSksbis9cGFyc2VJbnQodC5tYXJnaW5Ub3ApK3BhcnNlSW50KHQubWFyZ2luQm90dG9tKSksbn19LHtrZXk6Im91dGVyV2lkdGgiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5ub2RlLm9mZnNldFdpZHRoO3JldHVybiBlJiYodD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUpLApuKz13aW5kb3cucGFyc2VJbnQodC5tYXJnaW5MZWZ0LDEwKSt3aW5kb3cucGFyc2VJbnQodC5tYXJnaW5SaWdodCwxMCkpLG59fSx7a2V5OiJ0ZXh0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUudGV4dENvbnRlbnR8fHRoaXMubm9kZS5pbm5lckhUTUx8fCIifX0se2tleToiY2hpbGRyZW5PdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm91dGVyV2lkdGgoITApLG49MDtyZXR1cm4gdGhpcy5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24odCl7bis9bmV3IGUodCkub3V0ZXJXaWR0aCghMCl9KSwtMT50LW59fSx7a2V5OiJ0ZXh0T3ZlcmZsb3ciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0ZXJXaWR0aCghMCk8dGhpcy5ub2RlLnNjcm9sbFdpZHRofX0se2tleToiZGVjb2RlRW50aXRpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYodGhpcy5ub2RlLmlubmVySFRNTCl7dmFyIHQ9dGhpcy5ub2RlLmlubmVySFRNTDtyZXR1cm4gdD10LnJlcGxhY2UoLzxzY3JpcHRbXj5dKj4oW1xTXHNdKj8pPFwvc2NyaXB0Pi9naW0sIiIpLHQ9dC5yZXBsYWNlKC88XC8/XHcoPzpbXiInPl18IlteIl0qInwnW14nXSonKSo+L2dpbSwiIiksdD10LnJlcGxhY2UoL1x1MDBhMC9nLCIgIiksZS5pbm5lckhUTUw9dCx0PWUudGV4dENvbnRlbnR8fGUuaW5uZXJIVE1MfHwiIixlLnRleHRDb250ZW50PSIiLHR9cmV0dXJuIiJ9fV0pLGV9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbyhlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNyksYz1yKHApLGY9big3KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9InRleHRMaW5rIisodGhpcy5wcm9wcy5kaXNwbGF5QXNUZXh0PyIgdGV4dExpbmstLWRpc3BsYXlBc1RleHQiOiIiKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoZFsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6ZX19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Zm9udDp0aGlzLnByb3BzLmZvbnQsdGV4dDp0aGlzLnByb3BzLnRleHQsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSx0ZXh0SWQ6dGhpcy5wcm9wcy50ZXh0SWR9KSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInRleHRDb250YWluZXIiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZXh0TGluayIsaC5wcm9wVHlwZXM9e3RleHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLmlzUmVxdWlyZWQsZm9udDp1LlByb3BUeXBlcy5vYmplY3QsdGV4dElkOnUuUHJvcFR5cGVzLnN0cmluZyxkaXNwbGF5QXNUZXh0OnUuUHJvcFR5cGVzLmJvb2wsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDMzKSxjPXIocCksZj1uKDcpLGQ9cihmKSxoPW4oMzcpLHk9cihoKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0iYXNpbkltYWdlIjtyZXR1cm4gZSs9dGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQ/IiBhc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIsZSs9dGhpcy5wcm9wcy5kZXNjcmlwdGlvbj8iIGFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uIjoiIixsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7ImRhdGEtYXNpbiI6dGhpcy5wcm9wcy5hc2luLGNsYXNzTmFtZTplfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZTplfX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtwYXRoOnRoaXMucHJvcHMucGF0aCxhbHQ6dGhpcy5wcm9wcy5hbHQsc3ByaXRlOnRoaXMucHJvcHMuc3ByaXRlLGV4dGVuZENvbnRhaW5lckhlaWdodDp0aGlzLnByb3BzLmV4dGVuZENvbnRhaW5lckhlaWdodCx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxzeDp0aGlzLnByb3BzLnN4LHN5OnRoaXMucHJvcHMuc3kscWw6dGhpcy5wcm9wcy5xbCxyZXRpbmE6dGhpcy5wcm9wcy5yZXRpbmEsYWM6dGhpcy5wcm9wcy5hYyxtZXJnZVRhZ3M6dGhpcy5wcm9wcy5tZXJnZVRhZ3MsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pLHRoaXMucHJvcHMuZGVzY3JpcHRpb24mJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHlbImRlZmF1bHQiXSx7dGV4dDp0aGlzLnByb3BzLmRlc2NyaXB0aW9uLGZvbnQ6dGhpcy5wcm9wcy5kZXNjcmlwdGlvbkZvbnR9KSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIsImNsaWNrdGhyb3VnaExpbmsiLCJ0ZXh0Q29udGFpbmVyIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09bSxtLmRpc3BsYXlOYW1lPSJBc2luSW1hZ2UiLG0ucHJvcFR5cGVzPXtocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWx0OnUuUHJvcFR5cGVzLnN0cmluZyxzcHJpdGU6dS5Qcm9wVHlwZXMuYm9vbCxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxkZXNjcmlwdGlvbjp1LlByb3BUeXBlcy5zdHJpbmcsZGVzY3JpcHRpb25Gb250OnUuUHJvcFR5cGVzLm9iamVjdCx0aXRsZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LG9uTG9hZDp1LlByb3BUeXBlcy5mdW5jLGFzaW46dS5Qcm9wVHlwZXMuc3RyaW5nfSxtLmRlZmF1bHRQcm9wcz17YWM6ITAscmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0icHJpY2UiO2UrPXRoaXMucHJvcHMuaXNKdW1ibz8iIHByaWNlLS1qdW1ibyI6IiIsZSs9dGhpcy5wcm9wcy5pc0xpc3Q/IiBwcmljZS0tbGlzdCI6IiIsZSs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciB0PSIiO2lmKHRoaXMucHJvcHMuaXNKdW1ibyl7dmFyIG49dGhpcy5wcm9wcy5wcmljZUluZm8ud2hvbGVBbW91bnQscj10aGlzLnByb3BzLnByaWNlSW5mby5kZWNpbWFsUGFydDt0PWxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOmUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0ludGVnZXJBbW91bnQifSxuKSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCJ9LHIpKX1lbHNlIHQ9bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19hbW91bnQifSx0aGlzLnByb3BzLmFtb3VudCkpO3JldHVybiB0aGlzLnByb3BzLmhyZWYmJnRoaXMucHJvcHMuY2xpY2tVcmxzP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJwcmljZSJ9fSx0KTp0fX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iUHJpY2UiLGYucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjdXJyZW5jeTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxpc0p1bWJvOnUuUHJvcFR5cGVzLmJvb2wscHJpY2VJbmZvOnUuUHJvcFR5cGVzLm9iamVjdCxpc0xpc3Q6dS5Qcm9wVHlwZXMuYm9vbCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNSksYz1yKHApLGY9big0MyksZD1yKGYpLGg9big3KSx5PXIoaCksbT0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9wcmltZS0yeC0yMDE3MDYxNC5wbmciLGI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiZ2V0UHJpbWVMb2dvUGF0aCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGRbImRlZmF1bHQiXS5jb21waWxlKG0se21lZGlhOmV9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFByaW1lTG9nb1BhdGgodGhpcy5wcm9wcy5tZWRpYSksdD1sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3BhdGg6ZSx3aWR0aDoiNDMiLGhlaWdodDoiMTIiLGFsdDoiUHJpbWUiLGFkZGl0aW9uYWxDbGFzczoicHJpbWVMb2dvIixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSk7cmV0dXJuIHRoaXMucHJvcHMuaHJlZiYmdGhpcy5wcm9wcy5jbGlja1VybHM/bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoeVsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InByaW1lTG9nbyJ9fSx0KTp0fX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWIsYi5kaXNwbGF5TmFtZT0iUHJpbWVMb2dvIixiLnByb3BUeXBlcz17bWVkaWE6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKSxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtuKHRoaXMsZSl9cmV0dXJuIHIoZSxbe2tleToiY29tcGlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0Lmhhc093blByb3BlcnR5KG4pJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFwkeyIrbisifSIsImciKSx0W25dKSl9KSxlfX1dKSxlfSgpO2UuZXhwb3J0cz1uZXcgb30sLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzUpLGM9cihwKSxmPW4oNyksZD1yKGYpLGg9big0MykseT1yKGgpLG09bigzNiksYj1yKG0pLHY9big1OSksZz1uKDYxKSxfPSIvaW1hZ2VzL0cvJHttZWRpYX0vZGEvY3JlYXRpdmVzL2F1aS1taW5pLXNwcml0ZS0yMDE1LTAyLnBuZyIsUD0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9hdWktbWluaS1zcHJpdGUtMngtdjMucG5nIixrPXsiMS4wIjoiLTY0cHggMCIsMS41OiItMjE4cHggMCIsIjIuMCI6Ii00OHB4IDAiLDIuNToiLTIwMnB4IDAiLCIzLjAiOiItMzJweCAwIiwzLjU6Ii0xODZweCAwIiwiNC4wIjoiLTE2cHggMCIsNC41OiItMTcwcHggMCIsIjUuMCI6IjAgMCJ9LFQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtyZXRpbmE6ITF9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7KDAsYlsiZGVmYXVsdCJdKShmdW5jdGlvbih0KXtlLnNldFN0YXRlKHtyZXRpbmE6dH0pfSl9fSx7a2V5OiJnZXRTdGFyc1BhdGgiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHlbImRlZmF1bHQiXS5jb21waWxlKHQ/UDpfLHttZWRpYTplfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTdGFyc1BhdGgodGhpcy5wcm9wcy5tZWRpYSx0aGlzLnN0YXRlLnJldGluYSksdD0oMCxnLmdldFJvdW5kZWRTdGFyUmF0aW5nKSh0aGlzLnByb3BzLnJhdGluZyksbj1rW3RdLHI9e2JhY2tncm91bmRQb3NpdGlvbjpufTtyZXR1cm4gbiYmdGhpcy5wcm9wcy5jb3VudCYmdGhpcy5wcm9wcy5jb3VudD4wP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJzdGFyUmF0aW5nIn19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7cGF0aDplLHNwcml0ZTohMCxzdHlsZTpyLGFkZGl0aW9uYWxDbGFzczoic3RhclJhdGluZ19fc3RhcnMifSksdGhpcy5wcm9wcy5jb3VudCYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InN0YXJSYXRpbmdfX2NvdW50IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSwoMCx2LmZvcm1hdE51bWJlcikodGhpcy5wcm9wcy5jb3VudCwwLHRoaXMucHJvcHMubWFya2V0UGxhY2UpKSk6bnVsbH19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsibWVkaWFDZW50cmFsSW1hZ2UiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09VCxULmRpc3BsYXlOYW1lPSJTdGFyUmF0aW5nIixULnByb3BUeXBlcz17cmF0aW5nOnUuUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLGNvdW50OnUuUHJvcFR5cGVzLm51bWJlcixtZWRpYTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxtYXJrZXRQbGFjZTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dmFyIG89big2MCksaT1yKG8pLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsbj1hcmd1bWVudHNbMl0scj0iLiIsbz0iLCI7biYmL14oREV8RlJ8SVR8RVN8QlIpJC9pLnRlc3QobikmJihyPSIsIixvPSIuIik7dmFyIGk9MSplLGE9aS50b0ZpeGVkKHQpLHM9YS50b1N0cmluZygpLnNwbGl0KCIuIiksdT1zWzBdLGw9c1sxXSxwPXUucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyxvKTtyZXR1cm4gbD9wK3IrbDpwfTtlLmV4cG9ydHMuZm9ybWF0TnVtYmVyPWEsZS5leHBvcnRzLmZvcm1hdEN1cnJlbmN5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1zKGUsdCk7cmV0dXJuIG49ci5pc1RyYWlsaW5nU3ltYm9sP3IubnVtYmVyKyIgIityLnN5bWJvbDpyLnN5bWJvbCtyLm51bWJlcn07dmFyIHM9ZnVuY3Rpb24odCxuKXt2YXIgcj1pWyJkZWZhdWx0Il1bbl0sbz0vXihERXxGUnxJVHxFUykkL2kudGVzdChuKSxhPSJKUCI9PT1uLHM9ci5jdXJyZW5jeSx1PWUuZXhwb3J0cy5mb3JtYXROdW1iZXIodCxhPzA6MixuKTtyZXR1cm57c3ltYm9sOnMsbnVtYmVyOnUsaXNUcmFpbGluZ1N5bWJvbDpvfX07ZS5leHBvcnRzLmdldFByaWNlT2JqZWN0PXMsZS5leHBvcnRzLmZvcm1hdERhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIixyPSIiLG89IiIsYT0iIjtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBzPWUuc3BsaXQoIi0iKTtuPXNbMl0scj1zWzFdLG89aVsiZGVmYXVsdCJdW3RdLmxvY2FsZU1vbnRoc1tyLTFdLGE9c1swXX1lbHNlIG49ZS5nZXREYXRlKCksbz1pWyJkZWZhdWx0Il1bdF0ubG9jYWxlTW9udGhzW2UuZ2V0TW9udGgoKV0sYT1lLmdldEZ1bGxZZWFyKCk7dmFyIHU9dm9pZCAwO3N3aXRjaCh0KXtjYXNlIkZSIjpjYXNlIklUIjpjYXNlIkVTIjp1PW4rIiAiK28udG9Mb3dlckNhc2UoKSsiICIrYTticmVhaztjYXNlIkRFIjp1PW4rIi4gIitvKyIgIithO2JyZWFrO2Nhc2UiSlAiOnU9YSsi5bm0IityKyLmnIgiK24rIuaXpSI7YnJlYWs7ZGVmYXVsdDp1PW8rIiAiK24rIiwgIithfXJldHVybiB1fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtVUzp7c2VsZWN0aW9uTGFiZWw6IkVuZ2xpc2ggKFVTKSIscmVnaW9uOiJuYSIsY3VycmVuY3k6IiQiLGRvbWFpbjoiYW1hem9uLmNvbSIsbWVkaWE6IjAxIixtZXJjaGFudElkOiJBVFZQREtJS1gwREVSIixtYXJrZXRwbGFjZUlkOiJBVFZQREtJS1gwREVSIixsb2NhbGVNb250aHM6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LENBOntzZWxlY3Rpb25MYWJlbDoiRW5nbGlzaCAoQ0EpIixyZWdpb246Im5hIixjdXJyZW5jeToiQ0ROJCAiLGRvbWFpbjoiYW1hem9uLmNhIixtZWRpYToiMTUiLG1lcmNoYW50SWQ6IkEzRFdZSUs2WTlFRVFCIixtYXJrZXRwbGFjZUlkOiJBMkVVUTFXVEdDVEJHMiIsbG9jYWxlTW9udGhzOlsiSmFuIiwiRmViIiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVnIiwiU2VwdCIsIk9jdCIsIk5vdiIsIkRlYyJdfSxVSzp7c2VsZWN0aW9uTGFiZWw6IkVuZ2xpc2ggKFVLKSIscmVnaW9uOiJldSIsY3VycmVuY3k6IsKjIixkb21haW46ImFtYXpvbi5jby51ayIsbWVkaWE6IjAyIixtZXJjaGFudElkOiJBM1A1Uk9LTDVBMU9MRSIsbWFya2V0cGxhY2VJZDoiQTFGODNHOEMyQVJPN1AiLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX0sREU6e3NlbGVjdGlvbkxhYmVsOiJHZXJtYW4iLHJlZ2lvbjoiZXUiLGN1cnJlbmN5OiJFVVIgIixkb21haW46ImFtYXpvbi5kZSIsbWVkaWE6IjAzIixtZXJjaGFudElkOiJBM0pXS0FLUjhYQjdYRiIsbWFya2V0cGxhY2VJZDoiQTFQQTY3OTVVS01GUjkiLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk3DpHJ6IiwiQXByIiwiTWFpIiwiSnVuaSIsIkp1bGkiLCJBdWciLCJTZXB0IiwiT2t0IiwiTm92IiwiRGV6Il19LEZSOntzZWxlY3Rpb25MYWJlbDoiRnJlbmNoIixyZWdpb246ImV1IixjdXJyZW5jeToiRVVSICIsZG9tYWluOiJhbWF6b24uZnIiLG1lZGlhOiIwOCIsbWVyY2hhbnRJZDoiQTFYNkZLNVJESE5COTYiLG1hcmtldHBsYWNlSWQ6IkExM1YxSUIzVklZWlpIIixsb2NhbGVNb250aHM6WyJKYW4uIiwiRsOpdnIuIiwiTWFycyIsIkF2ci4iLCJNYWkiLCJKdWluIiwiSnVpbC4iLCJBb8O7dCIsIlNlcHQuIiwiT2N0LiIsIk5vdi4iLCJEw6ljLiJdfSxJVDp7c2VsZWN0aW9uTGFiZWw6Ikl0YWxpYW4iLHJlZ2lvbjoiZXUiLGN1cnJlbmN5OiJFVVIgIixkb21haW46ImFtYXpvbi5pdCIsbWVkaWE6IjI5IixtZXJjaGFudElkOiJBMTFJTDJQTldZSlU3SCIsbWFya2V0cGxhY2VJZDoiQVBKNkpSQTlORzVWNCIsbG9jYWxlTW9udGhzOlsiR2VuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFnIiwiR2l1IiwiTHVnIiwiQWdvIiwiU2V0IiwiT3R0IiwiTm92IiwiRGljIl19LEVTOntzZWxlY3Rpb25MYWJlbDoiU3BhbmlzaCIscmVnaW9uOiJldSIsY3VycmVuY3k6IkVVUiAiLGRvbWFpbjoiYW1hem9uLmVzIixtZWRpYToiMzAiLG1lcmNoYW50SWQ6IkExQVQ3WVZQRkJXWEJMIixtYXJrZXRwbGFjZUlkOiJBMVJLS1VQSUhDUzlIUyIsbG9jYWxlTW9udGhzOlsiRW5lIiwiRmViIiwiTWFyIiwiQWJyIiwiTWF5IiwiSnVuIiwiSnVsIiwiQWdvIiwiU2VwIiwiT2N0IiwiTm92IiwiRGljIl19LElOOntzZWxlY3Rpb25MYWJlbDoiRW5nbGlzaCAoSU4pIixyZWdpb246ImV1IixjdXJyZW5jeToi4oK5Iixkb21haW46ImFtYXpvbi5pbiIsbWVkaWE6IjMxIixtZXJjaGFudElkOiJBVDk1SUc5T05aRDdTIixtYXJrZXRwbGFjZUlkOiJBMjFUSlJVVU40S0dWIixsb2NhbGVNb250aHM6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LEpQOntzZWxlY3Rpb25MYWJlbDoiSmFwYW5lc2UiLHJlZ2lvbjoiZmUiLGN1cnJlbmN5OiLvv6UiLGRvbWFpbjoiYW1hem9uLmNvLmpwIixtZWRpYToiMDkiLG1lcmNoYW50SWQ6IkFOMVZSUUVORlJKTjUiLG1hcmtldHBsYWNlSWQ6IkExVkMzOFQ3WVhCNTI4Iix5ZWFyVGV4dDoiw6XCucK0IixkYXlUZXh0OiLDpuKAlMKlIixtb250aFRleHQ6IsOmxZPLhiIsbG9jYWxlTW9udGhzOlsiSmFuIiwiRmViIiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVnIiwiU2VwdCIsIk9jdCIsIk5vdiIsIkRlYyJdfSxDTjp7c2VsZWN0aW9uTGFiZWw6IiIscmVnaW9uOiJjbiIsY3VycmVuY3k6IsKlICIsZG9tYWluOiJhbWF6b24uY24iLG1lZGlhOiIyOCIsbWVyY2hhbnRJZDoiQTFBSjE5UFNCNjZUR1UiLG1hcmtldHBsYWNlSWQ6IkFBSEtWMlg3QUZZTFciLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX19fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIkFyZ3VtZW50IHJhd1N0YXJSYXRpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXIiKTtyZXR1cm4oTWF0aC5yb3VuZCgyKmUpLzIpLnRvRml4ZWQoMSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0Um91bmRlZFN0YXJSYXRpbmc9bn0sLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big0MSksYz1yKHApLGY9ITEsZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy50YXhNZXNzYWdlJiYiIiE9PXRoaXMucHJvcHMudGF4TWVzc2FnZTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlQm94IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSx0aGlzLnByb3BzLmxpc3RBbW91bnQmJmYmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7YW1vdW50OnRoaXMucHJvcHMubGlzdEFtb3VudCxjdXJyZW5jeTp0aGlzLnByb3BzLmN1cnJlbmN5LGlzTGlzdDohMCxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19saXN0IixzdHlsZTp0aGlzLnByb3BzLmxpc3RQcmljZVN0eWxlfSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHthbW91bnQ6dGhpcy5wcm9wcy5idXlBbW91bnQsY3VycmVuY3k6dGhpcy5wcm9wcy5jdXJyZW5jeSxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19idXkiLHN0eWxlOnRoaXMucHJvcHMuYnV5UHJpY2VTdHlsZX0pLGUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZUJveF9fdGF4TWVzc2FnZSJ9LHRoaXMucHJvcHMudGF4TWVzc2FnZSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmljZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iUHJpY2VCb3giLGQucHJvcFR5cGVzPXtidXlBbW91bnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsbGlzdEFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcsY3VycmVuY3k6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsdGF4TWVzc2FnZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGJ1eVByaWNlU3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGxpc3RQcmljZVN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdH19LCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big1KSxjPXIocCksZj1uKDI4KSxkPXIoZiksaD1uKDM4KSx5PXIoaCksbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe28odGhpcyx0KTt2YXIgbj1pKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc3RydWN0dXJlPW5ldyBkWyJkZWZhdWx0Il0obi5nZXRTdHJ1Y3R1cmVzKCkpLG4uaW5pdFN0cnVjdHVyZShlKSxuLmNvbXBvbmVudHNNYXA9bi5nZXRDb21wb25lbnRzTWFwKCksbi5kb21SZWZzPXt9LG4uc3RhdGU9e3Nob3dMaXN0UHJpY2U6ITB9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImluaXRTdHJ1Y3R1cmUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZm9ybWF0dGVkUHJpY2UmJiIiIT09ZS5mb3JtYXR0ZWRQcmljZSYmIWUuaXNEaWdpdGFsO3RoaXMuc3RydWN0dXJlLmhpZGVCbG9jaygicHJpY2VCb3giLCF0KTt2YXIgbj10JiZlLmlzUHJpbWU7aWYodGhpcy5zdHJ1Y3R1cmUuaGlkZUJsb2NrKCJwcmltZUxvZ28iLCFuKSwiSlAiPT09dGhpcy5wcm9wcy5tYXJrZXRQbGFjZSl7dmFyIHI9dGhpcy5zdHJ1Y3R1cmUuZ2V0Q29tcG9uZW50UHJvcCgiaGVhZGxpbmUiLCJzdHlsZSIpO3ImJihyLnZhbHVlLmZvbnRTdHlsZT0ibm9ybWFsIix0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInN0eWxlIixyLnZhbHVlLCJjb25zdGFudCIpKX1lLm1vYmlsZUhlYWRsaW5lJiZ0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInRleHQiLCJtb2JpbGVIZWFkbGluZSIsInBhdGgiKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZG9tUmVmcy5wcmljaW5nJiZ0aGlzLnNldFN0YXRlKHtzaG93TGlzdFByaWNlOiEoMCx5WyJkZWZhdWx0Il0pKHRoaXMuZG9tUmVmcy5wcmljaW5nKS5jaGlsZHJlbk92ZXJmbG93KCl9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0YXRlLnNob3dMaXN0UHJpY2U/dGhpcy5wcm9wcy5mb3JtYXR0ZWRMaXN0UHJpY2U6bnVsbDtyZXR1cm4gdGhpcy5zdHJ1Y3R1cmUuc2V0Q29tcG9uZW50UHJvcCgicHJpY2VCb3giLCJsaXN0QW1vdW50IixlLCJjb25zdGFudCIpLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Y2xhc3NOYW1lOiJtb2JpbGVSYXZlbiIscmVuZGVyaW5nQ29udGV4dDp0aGlzLnByb3BzLHN0cnVjdHVyZTp0aGlzLnN0cnVjdHVyZS5tb2RlbCxjb21wb25lbnRzTWFwOnRoaXMuY29tcG9uZW50c01hcCxkb21SZWZzOnRoaXMuZG9tUmVmcyx1cGRhdGVPblJlc2l6ZTohMH0pfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPW0sbS5URU1QTEFURV9JRD0ibW9iaWxlUmF2ZW4iLG0uZGlzcGxheU5hbWU9Ik1vYmlsZVJhdmVuIixtLnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPShyKHUpLG4oMTAzKSkscD1yKGwpLGM9bigxMDUpLGY9cihjKSxkPW4oMTA2KSxoPXIoZCkseT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRTdHJ1Y3R1cmVzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybigwLGZbImRlZmF1bHQiXSkoKX19LHtrZXk6ImdldENvbXBvbmVudHNNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuQ09NUE9ORU5UU19NQVB9fV0pLHR9KHBbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPXkseS5DT01QT05FTlRTX01BUD1oWyJkZWZhdWx0Il0seS5kaXNwbGF5TmFtZT0iTW9iaWxlUmF2ZW5Db250cm9sIix5LnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJue2lkOiIwIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEyNXB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjAiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsd2lkdGg6IjE2MHB4IixoZWlnaHQ6IjEwMCUiLHBhZGRpbmc6IjVweCAxMHB4IDVweCAxMHB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJhc2luSW1hZ2UiLHByb3BzOlt7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToicGF0aCIsdmFsdWU6ImFzaW5JbWFnZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJhbHQiLHZhbHVlOiJwcm9kdWN0VGl0bGUiLHR5cGU6InBhdGgifSx7bmFtZToic3giLHZhbHVlOjgwLHR5cGU6ImNvbnN0YW50In1dfSxzdHlsZTpbe25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgMTI1cHgifV19LHtpZDoiMC4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHdpZHRoOiIxMDAlIixwYWRkaW5nOiIwIDEwcHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMC4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAwIDVweCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJoZWFkbGluZSJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InRleHRMaW5rIixwcm9wczpbe25hbWU6ImZvbnQiLHZhbHVlOnttYXhMaW5lczoyLG1pbkZvbnRQeDoxNixtYXhGb250UHg6MTh9LHR5cGU6ImNvbnN0YW50In0se25hbWU6InRleHQiLHZhbHVlOiJoZWFkbGluZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMCx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA1cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoidGV4dExpbmsiLHByb3BzOlt7bmFtZToiZm9udCIsdmFsdWU6e21heExpbmVzOjEsbWluRm9udFB4OjEyLG1heEZvbnRQeDoxMn0sdHlwZToiY29uc3RhbnQifSx7bmFtZToidGV4dCIsdmFsdWU6InByb2R1Y3RUaXRsZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMiIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA0cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoic3RhclJhdGluZyIscHJvcHM6W3tuYW1lOiJyYXRpbmciLHZhbHVlOiJjdXN0b21lclJldmlld1N1bW1hcnkucmF0aW5nIix0eXBlOiJwYXRoIn0se25hbWU6ImNvdW50Iix2YWx1ZToiY3VzdG9tZXJSZXZpZXdTdW1tYXJ5LmNvdW50Iix0eXBlOiJwYXRoIn0se25hbWU6ImhyZWYiLHZhbHVlOiJyZXZpZXdMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7bmFtZToibWFya2V0UGxhY2UiLHZhbHVlOiJtYXJrZXRQbGFjZSIsdHlwZToicGF0aCJ9XX19LHtpZDoiMC4xLjAuMyIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljaW5nIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAuMy4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCA1cHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljZUJveCJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaWNlQm94Iixwcm9wczpbe25hbWU6ImJ1eUFtb3VudCIsdmFsdWU6ImZvcm1hdHRlZFByaWNlIix0eXBlOiJwYXRoIn0se25hbWU6Imxpc3RBbW91bnQiLHZhbHVlOiJmb3JtYXR0ZWRMaXN0UHJpY2UiLHR5cGU6InBhdGgifSx7bmFtZToiY3VycmVuY3kiLHZhbHVlOiJjdXJyZW5jeVN5bWJvbCIsdHlwZToicGF0aCJ9LHtuYW1lOiJ0YXhNZXNzYWdlIix2YWx1ZToiaTE4bi50YXhNZXNzYWdlIix0eXBlOiJwYXRoIn0se25hbWU6ImJ1eVByaWNlU3R5bGUiLHZhbHVlOntmb250U2l6ZToiMTVweCJ9LHR5cGU6ImNvbnN0YW50In0se25hbWU6Imxpc3RQcmljZVN0eWxlIix2YWx1ZTp7Zm9udFNpemU6IjEzcHgifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMy4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3cifSxtZXRhZGF0YTpbe25hbWU6InJlZiIsdmFsdWU6InByaW1lTG9nbyJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaW1lTG9nbyIscHJvcHM6W3tuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7c3R5bGU6e3dpZHRoOiIyOXB4IixoZWlnaHQ6IjEzcHgifX1dfSxzdHlsZTpbe25hbWU6Im92ZXJmbG93Iix2YWx1ZToidmlzaWJsZSJ9XX1dLGNzc0NsYXNzZXM6WyJibG9jay0taW5saW5lIiwiIl0sc3R5bGU6W3tuYW1lOiJ3aGl0ZVNwYWNlIix2YWx1ZToibm9ybWFsIn1dfV19LHtpZDoiMC4xLjEiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsbWFyZ2luOiIwIDEwcHggMCAxMHB4IixoZWlnaHQ6IjEyM3B4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxzdHlsZTpbe25hbWU6Im9wYWNpdHkiLHZhbHVlOiIwLjY0In0se25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgOXB4In1dLGNvbXBvbmVudDp7aWQ6Im1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyIixwcm9wczpbe25hbWU6InBhdGgiLHZhbHVlOiIvaW1hZ2VzL0cvMDEvQW1hem9uQnJhbmRTdG9yZXNQbGF0Zm9ybS9ibGFja19hcnJvdy5wbmciLHR5cGU6ImNvbnN0YW50In0se25hbWU6ImFsdCIsdmFsdWU6IkdyYXkgQXJyb3ciLHR5cGU6ImNvbnN0YW50In0se25hbWU6InJvbGUiLHZhbHVlOiJwcmVzZW50YXRpb24iLHR5cGU6ImNvbnN0YW50In1dfX1dLHN0eWxlOlt7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6IiNGRkZGRkYifV19XSxzdHlsZTpbe25hbWU6ImJvcmRlciIsdmFsdWU6IjFweCBzb2xpZCAjZGRkIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiIjRkZGRkZGIn1dfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDQwKSxpPXIobyksYT1uKDM5KSxzPXIoYSksdT1uKDU4KSxsPXIodSkscD1uKDc4KSxjPXIocCksZj1uKDQyKSxkPXIoZiksaD1uKDMzKSx5PXIoaCk7ZS5leHBvcnRzPXthc2luSW1hZ2U6aVsiZGVmYXVsdCJdLHRleHRMaW5rOnNbImRlZmF1bHQiXSxzdGFyUmF0aW5nOmxbImRlZmF1bHQiXSxwcmljZUJveDpjWyJkZWZhdWx0Il0scHJpbWVMb2dvOmRbImRlZmF1bHQiXSxtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lcjp5WyJkZWZhdWx0Il19fV0pOzt2YXIgJGFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkJykscmVuZGVyaW5nQ29udGV4dCA9IHsibWFya2V0UGxhY2UiOiJVUyIsImFkTGluayI6Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5QRWlwYWxtR3VUcG1ERnprS0RwVUlBQUFGaHBKa29aUUVBQUFHUUFXV3B6c1EvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8xNTA4NzY3NDgzP2FheGl0az1rSmJhLngyOVBwMHhFLktjb09lZlVBIiwicmV2aWV3TGluayI6Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5QRWlwYWxtR3VUcG1ERnprS0RwVUlBQUFGaHBKa29aUUVBQUFHUUFXV3B6c1EvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8xNTA4NzY3NDgzP2FheGl0az1rSmJhLngyOVBwMHhFLktjb09lZlVBI2N1c3RvbWVyUmV2aWV3cyIsImNyZWF0aXZlSWQiOiI2MTA1NTY1OTQwNzAxIiwiYWRJZCI6IjQ1MzMwNzc4MTA3MDEiLCJwcm9kdWN0VGl0bGUiOiJMZWFybiBTLlEuTC4gZnJvbSB0aGUgZXhwZXJ0cyBpbiB0aGUgcHJlbWllciBndWlkZSBmb3IgYmVnaW5uZXJzIiwiaGVhZGxpbmUiOiJUcm91YmxlIGxldmVyYWdpbmcgeW91ciBkYXRhPyIsImFzaW5JbWFnZSI6Imh0dHBzOi8vaW1hZ2VzLW5hLnNzbC1pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS81MVZ6U2RqcmlPTC5fQUNfU1IxMjgsMTQ1Xy5qcGciLCJ1bnNwcml0ZWRJbWFnZSI6Imh0dHBzOi8vaW1hZ2VzLW5hLnNzbC1pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS81MWt6Z1ZTLS1RTC5qcGciLCJjdXN0b21lclJldmlld1N1bW1hcnkiOnsicmF0aW5nIjo0LjMwMzc1NDg2NywiY291bnQiOjE1OCwiYXNpbiI6IjE1MDg3Njc0ODMifSwiYmFkZ2VJbmZvcm1hdGlvbk1hcCI6bnVsbCwiY3VycmVuY3lTeW1ib2wiOiIkIiwiZm9ybWF0dGVkTGlzdFByaWNlIjoiMTguOTkiLCJmb3JtYXR0ZWRQcmljZSI6IjE0Ljk5IiwicHJpY2VJbmZvIjp7Indob2xlQW1vdW50IjoiMTQiLCJkZWNpbWFsUGFydCI6Ijk5In0sInByaWNlRm9ybWF0dGluZ0ZsYWdzIjp7ImlzU3ltYm9sU3VwZXJzY3JpcHQiOnRydWUsInN5bWJvbFBvc2l0aW9uIjoicHJlZml4ZWQifSwicHJpY2VQZXJVbml0TWVzc2FnZSI6IiIsImlzUHJpbWUiOnRydWUsImlzRGlnaXRhbCI6ZmFsc2UsImkxOG4iOnsic2V0dGluZ3MiOnsic2VsZWN0aW9uTGFiZWwiOiJFbmdsaXNoIChVUykiLCJyZWdpb24iOiJuYSIsImN1cnJlbmN5IjoiJCIsImRvbWFpbiI6ImFtYXpvbi5jb20iLCJtZWRpYSI6IjAxIiwibWVyY2hhbnRJZCI6IkFUVlBES0lLWDBERVIiLCJtYXJrZXRwbGFjZUlkIjoiQVRWUERLSUtYMERFUiIsImxvY2FsZU1vbnRocyI6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LCJ0YXhNZXNzYWdlIjoiIiwic3BvbnNvcmVkQnkiOiJTcG9uc29yZWQgYnkiLCJzaG9wTm93IjoiU2hvcCBub3ciLCJiZXN0U2VsbGVyIjoiQmVzdCBTZWxsZXIiLCJuZXdSZWxlYXNlIjoiTmV3IFJlbGVhc2UiLCJiYWRnZUluIjoiaW4ifSwiY2xpY2tVcmxzIjpbImh0dHBzOi8vcy5hbWF6b24tYWRzeXN0ZW0uY29tL2l1Mz9kPWZvcmVzdGVyLWRpZCZleC1mY2g9NDE2NzMxNjEzJmV4LWZhcmdzPT9pJTNEYzhTS2xxV1lhNU9tWU1YT1FvT2xRZyUyNmFzaSUzRCUzQTAxMDFiMGRkOWU5ZWQ2ZTRkMTRlZTU5MmQxNDMwNzJjNTA1YTUzZTFlM2U3NmE2NTNhYjY2M2ZhMDEwZmVjOTkwMzg2JTI2Y2xpY2slM0QxJmNiPTE1MTg4ODQ5NTYzMjQiXSwiYnJhbmRMb2dvIjoiaW1hZ2VzL1MvYWJzLWltYWdlLXVwbG9hZC1uYS9lL2Ftcy9BVFZQREtJS1gwREVSLzRiNjIwZmVlNGRlNzZhNTQ0YzNhZDkzY2IxMDY4YTY5Lnc1MDAuaDQ3NC5fQ1IxMywwLDQ3NCw0NzRfU0wyODBfU1k4MF8uanBnIiwiYnJhbmROYW1lIjoiQ2x5ZGVCYW5rIE1lZGlhIExMQyIsInByb2R1Y3RJbWFnZSI6eyJ1cmwiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTFremdWUy0tUUwuanBnIiwiaGVpZ2h0Ijo1MDAsIndpZHRoIjo0MDZ9fTtpZiAoJGFkKSB7UmVhY3RET00ucmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlicmFyeS5kZWZhdWx0LCByZW5kZXJpbmdDb250ZXh0KSwgJGFkKTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS5hZGRWaWV3YWJpbGl0eUxpc3RlbmVyKCRhZCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYWRkQ3JlYXRpdmVDbGlja0xpc3RlbmVyKCRhZCk7fTwvc2NyaXB0PjwvYm9keT48L2h0bWw+PC9kaXY+&quot;,&quot;serverSideFetchAd&quot;: &quot;true&quot;,&quot;enableAdBlockerDetector&quot;: false,&quot;disableResizeFunc&quot;: true,&quot;fallbackStaticAdImgUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;: &quot;&quot;,&quot;advertisementTextOnTop&quot;: false,&quot;viewabilityStandards&quot;: [{&quot;p&quot;: 0, &quot;t&quot;: 0, &quot;def&quot;: &quot;amzn&quot;}, {&quot;p&quot;: 50, &quot;t&quot;: 1, &quot;def&quot;: &quot;iab&quot;}, {&quot;p&quot;: 100, &quot;t&quot;: 0, &quot;def&quot;: &quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;: &quot;&quot;}" title="Advertisement" data-arid="5ee18b81a5d64462b39540a5c7d61593"><div id="ape_detail_mobile-hero-quick-promo_mweb_placement" style="text-align: center; position: absolute; height: 125px; width: 100%;" aria-hidden="true"><iframe name="{&quot;slot&quot;:&quot;detail_mobile-hero-quick-promo_mweb&quot;,&quot;pageType&quot;:&quot;detail&quot;,&quot;subPageType&quot;:&quot;mweb&quot;,&quot;slotName&quot;:&quot;mobile-hero-quick-promo&quot;,&quot;src&quot;:&quot;prefetchEnabled&quot;,&quot;adServer&quot;:&quot;cs&quot;,&quot;campaignId&quot;:&quot;11598&quot;,&quot;arid&quot;:&quot;5ee18b81a5d64462b39540a5c7d61593&quot;,&quot;size&quot;:{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;},&quot;maxAdWidth&quot;:&quot;&quot;,&quot;allowedSizes&quot;:[{&quot;width&quot;:&quot;414px&quot;,&quot;height&quot;:&quot;125px&quot;},{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;}],&quot;allowedDomains&quot;:[&quot;g-ecx.images-amazon.com&quot;,&quot;images-na.ssl-images-amazon.com&quot;,&quot;d3l3lkinz3f56t.cloudfront.net&quot;,&quot;g-ecx.images-amazon.com&quot;,&quot;z-ecx.images-amazon.com&quot;,&quot;images-na.ssl-images-amazon.com&quot;,&quot;g-ec4.images-amazon.com&quot;,&quot;images-cn.ssl-images-amazon.com&quot;],&quot;loadAfter&quot;:&quot;immediate&quot;,&quot;extraDelay&quot;:0,&quot;iframeExtraStyle&quot;:&quot;width: 1px; min-width: 100%;&quot;,&quot;iframeClass&quot;:&quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;:false,&quot;adLabelWrapperId&quot;:&quot;ape_detail_mobile-hero-quick-promo_mweb_text-wrapper&quot;,&quot;adLabelId&quot;:&quot;ape_detail_mobile-hero-quick-promo_mweb_text&quot;,&quot;advTextWrapperDivStyle&quot;:&quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;:&quot;font-size: 10px; color: #555; text-align: right; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;:&quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;:&quot;PGRpdiBpZD0iYXBlX2RldGFpbF9tb2JpbGUtaGVyby1xdWljay1wcm9tb19td2ViX3RleHQtd3JhcHBlciIgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyB0ZXh0LWFsaWduOmNlbnRlcjsgbWFyZ2luLWxlZnQ6IC0xNHB4OyBtYXJnaW4tcmlnaHQ6IC0xNHB4OyBoZWlnaHQ6IGF1dG87IiAgPjxkaXYgaWQ9ImFwZV9kZXRhaWxfbW9iaWxlLWhlcm8tcXVpY2stcHJvbW9fbXdlYl90ZXh0IiBzdHlsZT0iZm9udC1zaXplOiAxMHB4OyBjb2xvcjogIzU1NTsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbjogMHB4IDNweCA2cHggMDsiICA+QWR2ZXJ0aXNlbWVudDwvZGl2PjwvZGl2Pg==&quot;,&quot;adPixels&quot;:[],&quot;adPixelDelay&quot;:&quot;0&quot;,&quot;aaxImpPixelUrl&quot;:&quot;https://aax-us-east.amazon-adsystem.com/e/loi/imp?b=QnPEipalmGuTpmDFzkKDpUIAAAFhpJkoZQEAAAGQAWWpzsQ&quot;,&quot;aaxInstrPixelUrl&quot;:&quot;https://aax-us-east.amazon-adsystem.com/x/px/QnPEipalmGuTpmDFzkKDpUIAAAFhpJkoZQEAAAGQAWWpzsQ/&quot;,&quot;htmlContent&quot;:&quot;&quot;,&quot;htmlContentEncoded&quot;:&quot;PGRpdiBpZD0iYXBlX2RldGFpbF9tb2JpbGUtaGVyby1xdWljay1wcm9tb19td2ViX2NyZWF0aXZlV3JhcHBlciIgICA+PCFkb2N0eXBlIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD1VVEYtOD48dGl0bGU+PC90aXRsZT48c3R5bGU+aHRtbHtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjEuMTU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOm9iamVjdHN9YTphY3RpdmUsYTpob3ZlcntvdXRsaW5lLXdpZHRoOjB9aW1ne2JvcmRlci1zdHlsZTpub25lfSosOmFmdGVyLDpiZWZvcmV7Ym94LXNpemluZzpib3JkZXItYm94fWh0bWx7b3ZlcmZsb3c6aGlkZGVuO2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSBOZXVlLEhlbHZldGljYSxzYW5zLXNlcmlmO2NvbG9yOiMxMTE7Zm9udC1zaXplOjE0cHh9YXtjb2xvcjojMDA2NmMwO3RleHQtZGVjb3JhdGlvbjpub25lfWE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtjb2xvcjojYzQ1NTAwfSNhZHstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uYmxvY2t7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVufS5ibG9jazplbXB0eXtkaXNwbGF5Om5vbmV9LmJsb2NrLS1qdXN0aWZ5LWNlbnRlcnstd2Via2l0LWp1c3RpZnktY29udGVudDpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uYmxvY2stLWp1c3RpZnktZmxleC1lbmR7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7LW1zLWZsZXgtcGFjazplbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5ibG9jay0tYWxpZ24tZmxleC1zdGFydHstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7LW1zLWZsZXgtYWxpZ246c3RhcnQ7LW1zLWdyaWQtcm93LWFsaWduOmZsZXgtc3RhcnQ7YWxpZ24taXRlbXM6ZmxleC1zdGFydH0uYmxvY2stLWFsaWduLWNlbnRlcnstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7LW1zLWdyaWQtcm93LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmJsb2NrLS1hbGlnbi1mbGV4LWVuZHstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtZW5kOy1tcy1mbGV4LWFsaWduOmVuZDstbXMtZ3JpZC1yb3ctYWxpZ246ZmxleC1lbmQ7YWxpZ24taXRlbXM6ZmxleC1lbmR9LmJsb2NrLS1kaXJlY3Rpb24tY29sdW1uey13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5ibG9jay0tYmFja2dyb3VuZCwuYmxvY2stLWJhY2tncm91bmQ+LmJsb2Nre3Bvc2l0aW9uOnJlbGF0aXZlfS5ibG9ja19fYmFja2dyb3VuZHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uYmxvY2stLWxvY2t7LXdlYmtpdC1mbGV4LWdyb3c6MDstbXMtZmxleC1wb3NpdGl2ZTowO2ZsZXgtZ3JvdzowOy13ZWJraXQtZmxleC1zaHJpbms6MDstbXMtZmxleC1uZWdhdGl2ZTowO2ZsZXgtc2hyaW5rOjB9LmJsb2NrLS1pbmxpbmU6bm90KDplbXB0eSl7ZGlzcGxheTpibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjB9LmJsb2NrLS1pbmxpbmU6bm90KDplbXB0eSk+LmJsb2NrOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXNpemU6MTRweH0uaC1ub0ZsZXhib3ggLmJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktY2VudGVyPi5ibG9ja3t0ZXh0LWFsaWduOmxlZnR9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1mbGV4LWVuZHt0ZXh0LWFsaWduOnJpZ2h0fS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktZmxleC1lbmQ+LmJsb2Nre3RleHQtYWxpZ246bGVmdH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1mbGV4LXN0YXJ0Pi5ibG9ja3t2ZXJ0aWNhbC1hbGlnbjp0b3B9Lmgtbm9GbGV4Ym94IC5ibG9jay0tYWxpZ24tY2VudGVyPi5ibG9ja3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lmgtbm9GbGV4Ym94IC5ibG9jay0tYWxpZ24tZmxleC1lbmQ+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0uaC1ub0ZsZXhib3ggLmJsb2NrLS1kaXJlY3Rpb24tY29sdW1uPi5ibG9ja3tkaXNwbGF5OmJsb2NrfS5oLWNsb2Fre3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudH0uaC1lbGxpcHNpc3tvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LmFzaW5JbWFnZXtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0e2hlaWdodDphdXRvfS5hc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodD4uaW1hZ2VDb250YWluZXJ7aGVpZ2h0OjEwMCV9LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9ue2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5hc2luSW1hZ2UtLXdpdGhEZXNjcmlwdGlvbj4uaW1hZ2VDb250YWluZXJ7bWFyZ2luLWJvdHRvbTo1cHh9LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uPi50ZXh0Q29udGFpbmVye21pbi1oZWlnaHQ6MTVweDt0ZXh0LWFsaWduOmNlbnRlcn0uaW1hZ2VDb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uaW1hZ2VDb250YWluZXJfX2ltYWdle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtib3R0b206MDtyaWdodDowO21hcmdpbjphdXRvO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5pbWFnZUNvbnRhaW5lci0tbGVmdHtkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5pbWFnZUNvbnRhaW5lci0tbGVmdD4uaW1hZ2VDb250YWluZXJfX2ltYWdle3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MH0uaW1hZ2VDb250YWluZXItLXJpZ2h0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7bWFyZ2luOjA7bGVmdDphdXRvO2JvdHRvbTphdXRvO3RvcDphdXRvfS5pbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0e2hlaWdodDphdXRvfS5pbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpzdGF0aWM7bWFyZ2luOjAgYXV0b30udGV4dExpbmt7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS50ZXh0TGluay0tZGlzcGxheUFzVGV4dHtjb2xvcjojMTExfS50ZXh0TGluay0tZGlzcGxheUFzVGV4dDpob3Zlcntjb2xvcjojMTExO3RleHQtZGVjb3JhdGlvbjpub25lfS5za3kgLnRleHRMaW5re2ZvbnQtd2VpZ2h0OjYwMH0uc2t5IC50ZXh0TGluay0tZGlzcGxheUFzVGV4dCwuc2t5IC50ZXh0TGluay0tZGlzcGxheUFzVGV4dDpob3Zlcntjb2xvcjojMDAyZjM2fS5zdGFyUmF0aW5nX19zdGFyc3tkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTZweDt3aWR0aDo4MHB4O21hcmdpbi1yaWdodDo1cHg7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTozNDRweCAxNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uc3RhclJhdGluZ19fY291bnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE2cHh9LnN0YXJSYXRpbmc6aG92ZXI+LnN0YXJSYXRpbmdfX2NvdW50e3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9LnNreSAuc3RhclJhdGluZ19fY291bnR7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTNweH0ucHJpY2VCb3hfX2xpc3R7bWFyZ2luLXJpZ2h0OjRweH0ucHJpY2VCb3hfX3RheE1lc3NhZ2V7bWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxMXB4fS5wcmljZXtjb2xvcjojYjEyNzA0fS5wcmljZS0tbGlzdHtjb2xvcjojNTU1O3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2h9LnByaWNlLS1qdW1ib3tmb250LXNpemU6M2VtfS5wcmljZV9fanVtYm9DdXJyZW5jeSwucHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCwucHJpY2VfX2p1bWJvSW50ZWdlckFtb3VudHt2ZXJ0aWNhbC1hbGlnbjp0b3A7Zm9udC13ZWlnaHQ6NTAwfS5wcmljZV9fanVtYm9DdXJyZW5jeSwucHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudHtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6LjRlbTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMzUlKTtmb250LXdlaWdodDo3MDB9LnByaWNlX19qdW1ib0ludGVnZXJBbW91bnR7bGV0dGVyLXNwYWNpbmc6LS41cHh9LnNreSAucHJpY2V7Y29sb3I6I2IxMjcwNH0ucHJpbWVMb2dve21hcmdpbi10b3A6MnB4fS50ZW1wbGF0ZUNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZX0udGVtcGxhdGVDb250YWluZXJfX2xpbmt7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29wYWNpdHk6MH0uY2xpY2t0aHJvdWdoTGluazpub3QoLnRlbXBsYXRlQ29udGFpbmVyX19saW5rKXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjJ9PC9zdHlsZT48c2NyaXB0PnZhciBtb2Rlcm5penI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihvKXtpZih0W29dKXJldHVybiB0W29dLmV4cG9ydHM7dmFyIHI9dFtvXT17ZXhwb3J0czp7fSxpZDpvLGxvYWRlZDohMX07cmV0dXJuIGVbb10uY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsbiksci5sb2FkZWQ9ITAsci5leHBvcnRzfXZhciB0PXt9O3JldHVybiBuLm09ZSxuLmM9dCxuLnA9IiIsbigwKX0oezA6ZnVuY3Rpb24oZSxuLHQpe2UuZXhwb3J0cz10KDIwKX0sMjA6ZnVuY3Rpb24oZSxuKXsidXNlIHN0cmljdCI7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9OyFmdW5jdGlvbihlLG4sbyl7ZnVuY3Rpb24gcihlLG4pe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIGU/InVuZGVmaW5lZCI6dChlKSk9PT1ufWZ1bmN0aW9uIHMoKXt2YXIgZSxuLHQsbyxzLGksbDtmb3IodmFyIGYgaW4gYilpZihiLmhhc093blByb3BlcnR5KGYpKXtpZihlPVtdLG49YltmXSxuLm5hbWUmJihlLnB1c2gobi5uYW1lLnRvTG93ZXJDYXNlKCkpLG4ub3B0aW9ucyYmbi5vcHRpb25zLmFsaWFzZXMmJm4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aCkpZm9yKHQ9MDt0PG4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aDt0KyspZS5wdXNoKG4ub3B0aW9ucy5hbGlhc2VzW3RdLnRvTG93ZXJDYXNlKCkpO2ZvcihvPXIobi5mbiwiZnVuY3Rpb24iKT9uLmZuKCk6bi5mbixzPTA7czxlLmxlbmd0aDtzKyspaT1lW3NdLGw9aS5zcGxpdCgiLiIpLDE9PT1sLmxlbmd0aD93W2xbMF1dPW86KCF3W2xbMF1dfHx3W2xbMF1daW5zdGFuY2VvZiBCb29sZWFufHwod1tsWzBdXT1uZXcgQm9vbGVhbih3W2xbMF1dKSksd1tsWzBdXVtsWzFdXT1vKSxnLnB1c2goKG8/IiI6Im5vLSIpK2wuam9pbigiLSIpKX19ZnVuY3Rpb24gaShlKXt2YXIgbj1TLmNsYXNzTmFtZSx0PXcuX2NvbmZpZy5jbGFzc1ByZWZpeHx8IiI7aWYoXyYmKG49bi5iYXNlVmFsKSx3Ll9jb25maWcuZW5hYmxlSlNDbGFzcyl7dmFyIG89bmV3IFJlZ0V4cCgiKF58XFxzKSIrdCsibm8tanMoXFxzfCQpIik7bj1uLnJlcGxhY2UobywiJDEiK3QrImpzJDIiKX13Ll9jb25maWcuZW5hYmxlQ2xhc3NlcyYmKG4rPSIgIit0K2Uuam9pbigiICIrdCksXz9TLmNsYXNzTmFtZS5iYXNlVmFsPW46Uy5jbGFzc05hbWU9bil9ZnVuY3Rpb24gbChlLG4pe3JldHVybiEhfigiIitlKS5pbmRleE9mKG4pfWZ1bmN0aW9uIGYoKXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2Ygbi5jcmVhdGVFbGVtZW50P24uY3JlYXRlRWxlbWVudChhcmd1bWVudHNbMF0pOl8/bi5jcmVhdGVFbGVtZW50TlMuY2FsbChuLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsYXJndW1lbnRzWzBdKTpuLmNyZWF0ZUVsZW1lbnQuYXBwbHkobixhcmd1bWVudHMpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFthLXpdKS0oW2Etel0pL2csZnVuY3Rpb24oZSxuLHQpe3JldHVybiBuK3QudG9VcHBlckNhc2UoKX0pLnJlcGxhY2UoL14tLywiIil9ZnVuY3Rpb24gdShlLG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG4sYXJndW1lbnRzKX19ZnVuY3Rpb24gcChlLG4sdCl7dmFyIG87Zm9yKHZhciBzIGluIGUpaWYoZVtzXWluIG4pcmV0dXJuIHQ9PT0hMT9lW3NdOihvPW5bZVtzXV0scihvLCJmdW5jdGlvbiIpP3Uobyx0fHxuKTpvKTtyZXR1cm4hMX1mdW5jdGlvbiBkKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbQS1aXSkvZyxmdW5jdGlvbihlLG4pe3JldHVybiItIituLnRvTG93ZXJDYXNlKCl9KS5yZXBsYWNlKC9ebXMtLywiLW1zLSIpfWZ1bmN0aW9uIGMoKXt2YXIgZT1uLmJvZHk7cmV0dXJuIGV8fChlPWYoXz8ic3ZnIjoiYm9keSIpLGUuZmFrZT0hMCksZX1mdW5jdGlvbiBtKGUsdCxvLHIpe3ZhciBzLGksbCxhLHU9Im1vZGVybml6ciIscD1mKCJkaXYiKSxkPWMoKTtpZihwYXJzZUludChvLDEwKSlmb3IoO28tLTspbD1mKCJkaXYiKSxsLmlkPXI/cltvXTp1KyhvKzEpLHAuYXBwZW5kQ2hpbGQobCk7cmV0dXJuIHM9Zigic3R5bGUiKSxzLnR5cGU9InRleHQvY3NzIixzLmlkPSJzIit1LChkLmZha2U/ZDpwKS5hcHBlbmRDaGlsZChzKSxkLmFwcGVuZENoaWxkKHApLHMuc3R5bGVTaGVldD9zLnN0eWxlU2hlZXQuY3NzVGV4dD1lOnMuYXBwZW5kQ2hpbGQobi5jcmVhdGVUZXh0Tm9kZShlKSkscC5pZD11LGQuZmFrZSYmKGQuc3R5bGUuYmFja2dyb3VuZD0iIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGE9Uy5zdHlsZS5vdmVyZmxvdyxTLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLFMuYXBwZW5kQ2hpbGQoZCkpLGk9dChwLGUpLGQuZmFrZT8oZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLFMuc3R5bGUub3ZlcmZsb3c9YSxTLm9mZnNldEhlaWdodCk6cC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApLCEhaX1mdW5jdGlvbiB5KG4sdCl7dmFyIHI9bi5sZW5ndGg7aWYoIkNTUyJpbiBlJiYic3VwcG9ydHMiaW4gZS5DU1Mpe2Zvcig7ci0tOylpZihlLkNTUy5zdXBwb3J0cyhkKG5bcl0pLHQpKXJldHVybiEwO3JldHVybiExfWlmKCJDU1NTdXBwb3J0c1J1bGUiaW4gZSl7Zm9yKHZhciBzPVtdO3ItLTspcy5wdXNoKCIoIitkKG5bcl0pKyI6Iit0KyIpIik7cmV0dXJuIHM9cy5qb2luKCIgb3IgIiksbSgiQHN1cHBvcnRzICgiK3MrIikgeyAjbW9kZXJuaXpyIHsgcG9zaXRpb246IGFic29sdXRlOyB9IH0iLGZ1bmN0aW9uKGUpe3JldHVybiJhYnNvbHV0ZSI9PWdldENvbXB1dGVkU3R5bGUoZSxudWxsKS5wb3NpdGlvbn0pfXJldHVybiBvfWZ1bmN0aW9uIHYoZSxuLHQscyl7ZnVuY3Rpb24gaSgpe3AmJihkZWxldGUgTi5zdHlsZSxkZWxldGUgTi5tb2RFbGVtKX1pZihzPXIocywidW5kZWZpbmVkIik/ITE6cywhcih0LCJ1bmRlZmluZWQiKSl7dmFyIHU9eShlLHQpO2lmKCFyKHUsInVuZGVmaW5lZCIpKXJldHVybiB1fWZvcih2YXIgcCxkLGMsbSx2LGg9WyJtb2Rlcm5penIiLCJ0c3BhbiIsInNhbXAiXTshTi5zdHlsZSYmaC5sZW5ndGg7KXA9ITAsTi5tb2RFbGVtPWYoaC5zaGlmdCgpKSxOLnN0eWxlPU4ubW9kRWxlbS5zdHlsZTtmb3IoYz1lLmxlbmd0aCxkPTA7Yz5kO2QrKylpZihtPWVbZF0sdj1OLnN0eWxlW21dLGwobSwiLSIpJiYobT1hKG0pKSxOLnN0eWxlW21dIT09byl7aWYoc3x8cih0LCJ1bmRlZmluZWQiKSlyZXR1cm4gaSgpLCJwZngiPT1uP206ITA7dHJ5e04uc3R5bGVbbV09dH1jYXRjaCh4KXt9aWYoTi5zdHlsZVttXSE9dilyZXR1cm4gaSgpLCJwZngiPT1uP206ITB9cmV0dXJuIGkoKSwhMX1mdW5jdGlvbiBoKGUsbix0LG8scyl7dmFyIGk9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLGw9KGUrIiAiK1Quam9pbihpKyIgIikraSkuc3BsaXQoIiAiKTtyZXR1cm4gcihuLCJzdHJpbmciKXx8cihuLCJ1bmRlZmluZWQiKT92KGwsbixvLHMpOihsPShlKyIgIit6LmpvaW4oaSsiICIpK2kpLnNwbGl0KCIgIikscChsLG4sdCkpfWZ1bmN0aW9uIHgoZSxuLHQpe3JldHVybiBoKGUsbyxvLG4sdCl9dmFyIGc9W10sYj1bXSxDPXtfdmVyc2lvbjoiMy4zLjEiLF9jb25maWc6e2NsYXNzUHJlZml4OiIiLGVuYWJsZUNsYXNzZXM6ITAsZW5hYmxlSlNDbGFzczohMCx1c2VQcmVmaXhlczohMH0sX3E6W10sb246ZnVuY3Rpb24oZSxuKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuKHRbZV0pfSwwKX0sYWRkVGVzdDpmdW5jdGlvbihlLG4sdCl7Yi5wdXNoKHtuYW1lOmUsZm46bixvcHRpb25zOnR9KX0sYWRkQXN5bmNUZXN0OmZ1bmN0aW9uKGUpe2IucHVzaCh7bmFtZTpudWxsLGZuOmV9KX19LHc9ZnVuY3Rpb24oKXt9O3cucHJvdG90eXBlPUMsdz1uZXcgdzt2YXIgUz1uLmRvY3VtZW50RWxlbWVudCxfPSJzdmciPT09Uy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFA9Ik1veiBPIG1zIFdlYmtpdCIsVD1DLl9jb25maWcudXNlUHJlZml4ZXM/UC5zcGxpdCgiICIpOltdO0MuX2Nzc29tUHJlZml4ZXM9VDt2YXIgej1DLl9jb25maWcudXNlUHJlZml4ZXM/UC50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik6W107Qy5fZG9tUHJlZml4ZXM9ejt2YXIgRT17ZWxlbTpmKCJtb2Rlcm5penIiKX07dy5fcS5wdXNoKGZ1bmN0aW9uKCl7ZGVsZXRlIEUuZWxlbX0pO3ZhciBOPXtzdHlsZTpFLmVsZW0uc3R5bGV9O3cuX3EudW5zaGlmdChmdW5jdGlvbigpe2RlbGV0ZSBOLnN0eWxlfSksQy50ZXN0QWxsUHJvcHM9aCxDLnRlc3RBbGxQcm9wcz14LC8qIQoJICB7CgkgICAgIm5hbWUiOiAiRmxleGJveCIsCgkgICAgInByb3BlcnR5IjogImZsZXhib3giLAoJICAgICJjYW5pdXNlIjogImZsZXhib3giLAoJICAgICJ0YWdzIjogWyJjc3MiXSwKCSAgICAibm90ZXMiOiBbewoJICAgICAgIm5hbWUiOiAiVGhlIF9uZXdfIGZsZXhib3giLAoJICAgICAgImhyZWYiOiAiaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1mbGV4Ym94IgoJICAgIH1dLAoJICAgICJ3YXJuaW5ncyI6IFsKCSAgICAgICJBIGB0cnVlYCByZXN1bHQgZm9yIHRoaXMgZGV0ZWN0IGRvZXMgbm90IGltcGx5IHRoYXQgdGhlIGBmbGV4LXdyYXBgIHByb3BlcnR5IGlzIHN1cHBvcnRlZDsgc2VlIHRoZSBgZmxleHdyYXBgIGRldGVjdC4iCgkgICAgXQoJICB9CgkgICEqLwp3LmFkZFRlc3QoImZsZXhib3giLHgoImZsZXhCYXNpcyIsIjFweCIsITApKSwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3ggKGxlZ2FjeSkiLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94bGVnYWN5IiwKCSAgICAidGFncyI6IFsiY3NzIl0sCgkgICAgInBvbHlmaWxscyI6IFsiZmxleGllIl0sCgkgICAgIm5vdGVzIjogW3sKCSAgICAgICJuYW1lIjogIlRoZSBfb2xkXyBmbGV4Ym94IiwKCSAgICAgICJocmVmIjogImh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtZmxleGJveC0yMDA5MDcyMy8iCgkgICAgfV0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94bGVnYWN5Iix4KCJib3hEaXJlY3Rpb24iLCJyZXZlcnNlIiwhMCkpLC8qIQoJICB7CgkgICAgIm5hbWUiOiAiRmxleGJveCAodHdlZW5lcikiLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94dHdlZW5lciIsCgkgICAgInRhZ3MiOiBbImNzcyJdLAoJICAgICJwb2x5ZmlsbHMiOiBbImZsZXhpZSJdLAoJICAgICJub3RlcyI6IFt7CgkgICAgICAibmFtZSI6ICJUaGUgX2luYmV0d2Vlbl8gZmxleGJveCIsCgkgICAgICAiaHJlZiI6ICJodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1jc3MzLWZsZXhib3gtMjAxMTExMjkvIgoJICAgIH1dLAoJICAgICJ3YXJuaW5ncyI6IFsiVGhpcyByZXByZXNlbnRzIGFuIG9sZCBzeW50YXgsIG5vdCB0aGUgbGF0ZXN0IHN0YW5kYXJkIHN5bnRheC4iXQoJICB9CgkgICEqLwp3LmFkZFRlc3QoImZsZXhib3h0d2VlbmVyIix4KCJmbGV4QWxpZ24iLCJlbmQiLCEwKSkscygpLGkoZyksZGVsZXRlIEMuYWRkVGVzdCxkZWxldGUgQy5hZGRBc3luY1Rlc3Q7Zm9yKHZhciBqPTA7ajx3Ll9xLmxlbmd0aDtqKyspdy5fcVtqXSgpO2UuTW9kZXJuaXpyPXd9KHdpbmRvdyxkb2N1bWVudCl9fSk7O3ZhciBQZGFDbGllbnRBUEk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtpZihuW3JdKXJldHVybiBuW3JdLmV4cG9ydHM7dmFyIGk9bltyXT17ZXhwb3J0czp7fSxpZDpyLGxvYWRlZDohMX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsdCksaS5sb2FkZWQ9ITAsaS5leHBvcnRzfXZhciBuPXt9O3JldHVybiB0Lm09ZSx0LmM9bix0LnA9IiIsdCgwKX0oW2Z1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxNil9LCwsLCwsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHdpbmRvdy5ldmVudDtyZXR1cm4gbih0KX07aWYoZS5hZGRFdmVudExpc3RlbmVyKWUuYWRkRXZlbnRMaXN0ZW5lcih0LHIsITApO2Vsc2UgaWYodD0ib24iK3QsZS5hdHRhY2hFdmVudCllLmF0dGFjaEV2ZW50KHQscik7ZWxzZXt2YXIgaT1lW3RdO2VbdF09ZnVuY3Rpb24oKXtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX19LCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxhPW4oOSksdT1yKGEpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe2lmKGkodGhpcyxlKSx0aGlzLndpbmRvdz10LndpbmRvd3x8InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdywhdGhpcy53aW5kb3d8fCF0aGlzLndpbmRvdy5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoIldpbmRvdyBhbmQvb3IgZG9jdW1lbnQgaXMgbm90IGRlZmluZWQiKTt0aGlzLmRhY3hMb2dnZXI9dC5kYWN4TG9nZ2VyfHxuZXcgdVsiZGVmYXVsdCJdKHQuYmFzZVVybCx0LmltcHJlc3Npb25JZCx0LmFkU2Vzc2lvbklkKSx0aGlzLmFpZD10LmFkSWQsdGhpcy5jaWQ9dC5jcmVhdGl2ZUlkLHRoaXMuZGFjeExvZ2dlci5sb2dJbXByZXNzaW9uKCl9cmV0dXJuIG8oZSxbe2tleToiYXR0YWNoR2xvYmFscyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLndpbmRvdy5kb2N1bWVudC5hZD17YWlkOnRoaXMuYWRJZCxjaWQ6dGhpcy5jcmVhdGl2ZUlkfSx0aGlzLndpbmRvdy5EYWN4TG9nZ2VyPXRoaXMuZGFjeExvZ2dlcn19XSksZX0oKTt0WyJkZWZhdWx0Il09Y30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBhKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gdShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPW5ldyBmWyJkZWZhdWx0Il0oZSxkKSxyPXtpOnQuZGFjeEltcHJlc3Npb25JZCxhc2k6dC5kYWN4U2Vzc2lvbklkLGNsaWNrOjF9O3JldHVybiBuLmdldFBpeGVsVXJsKHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKTt0LmdlbmVyYXRlRGFjeENsaWNrVHJhY2tlclVybD1jO3ZhciBzPW4oMTApLGY9cihzKSxkPSI0MTY3MzE2MTMiLHA9ImNsaWVudF9pbXAiLGg9InZpZXciLHY9InN3aXBlIix5PS0xLGc9MSx3PTIsbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbixyKXtvKHRoaXMsdCk7dmFyIGk9YSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSxkKSk7cmV0dXJuIGkuaW1wcmVzc2lvbklkPW4saS5hZFNlc3Npb25JZD1yLGl9cmV0dXJuIHUodCxlKSxsKHQsW3trZXk6ImxvZ01ldHJpYyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pKHtpOnRoaXMuaW1wcmVzc2lvbklkLGFzaTp0aGlzLmFkU2Vzc2lvbklkfSxlLHR8fDEpO3RoaXMuZmlyZVBpeGVsKG4pfX0se2tleToibG9nSW1wcmVzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhwKX19LHtrZXk6ImxvZ1ZpZXdhYmlsaXR5U3VjY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLGcpfX0se2tleToibG9nQmFyZVZpZXdhYmlsaXR5U3VjY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLHcpfX0se2tleToibG9nVmlld2FiaWxpdHlGYWlsdXJlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubG9nTWV0cmljKGgseSl9fSx7a2V5OiJsb2dTd2lwZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyh2KX19XSksdH0oZlsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89bigxMSkuZ2V0UXVlcnlTdHJpbmcsYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtyKHRoaXMsZSksdGhpcy5iYXNlVXJsPXQsdGhpcy5jaGFubmVsPW59cmV0dXJuIGkoZSxbe2tleToiZ2V0UGl4ZWxVcmwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PSI/IitlbmNvZGVVUklDb21wb25lbnQobyhlKSk7cmV0dXJuIHRoaXMuYmFzZVVybCsiL2l1Mz9kPWZvcmVzdGVyLWRpZCZleC1mY2g9Iit0aGlzLmNoYW5uZWwrIiZleC1mYXJncz0iK3QrIiZjYj0iKyhuZXcgRGF0ZSkuZ2V0VGltZSgpfX0se2tleToiZmlyZVBpeGVsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1uZXcgSW1hZ2U7cmV0dXJuIHQuc3JjPXRoaXMuZ2V0UGl4ZWxVcmwoZSksdH19XSksZX0oKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiBlKW4ucHVzaChyKyI9IitlW3JdKTt2YXIgaT1uLmpvaW4oIiYiKTtyZXR1cm4gdD9lbmNvZGVVUklDb21wb25lbnQoaSk6aX1mdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtyPm47bisrKXQoZVtuXSxuLGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmdldFF1ZXJ5U3RyaW5nPW4sdC5mb3JFYWNoPXJ9LCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiBiKGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6YihpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oOCkscz1yKGwpLGY9bigxNyksZD1yKGYpLHA9bigxOCksaD1yKHApLHY9bigxOSkseT1yKHYpLGc9big2KSx3PVsiVEVUUklTX0lOTElORV9NRVNTQUdJTkciXSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7aSh0aGlzLHQpO3ZhciBuPW8odGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zaGF6YW1Mb2dnZXI9ZS5zaGF6YW1Mb2dnZXJ8fG5ldyBkWyJkZWZhdWx0Il0oZS5iYXNlVXJsLGUpLG4uc2hhemFtTG9nZ2VyLmxvZ0ltcHJlc3Npb24oKSxuLmNyZWF0aXZlQ2xpY2tMb2dnZXI9ZS5jcmVhdGl2ZUNsaWNrTG9nZ2VyfHxuZXcgeVsiZGVmYXVsdCJdKGUuYmFzZVVybCxlLmltcHJlc3Npb25JZCksbi50ZW1wbGF0ZU5hbWU9ZS50ZW1wbGF0ZU5hbWUsbn1yZXR1cm4gYSh0LGUpLHUodCxbe2tleToiYXR0YWNoR2xvYmFscyIsdmFsdWU6ZnVuY3Rpb24oKXtjKHQucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQucHJvdG90eXBlKSwiYXR0YWNoR2xvYmFscyIsdGhpcykuY2FsbCh0aGlzKSx0aGlzLndpbmRvdy5TaGF6YW1Mb2dnZXI9dGhpcy5zaGF6YW1Mb2dnZXIsdGhpcy53aW5kb3cuVmlld2FiaWxpdHk9aFsiZGVmYXVsdCJdfX0se2tleToidHJhY2tMb2FkTGF0ZW5jeSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuc2hhemFtTG9nZ2VyLnN0YXJ0VGltZXIoZFsiZGVmYXVsdCJdLkVWRU5UX05BTUVTLkNSRUFUSVZFX0xPQURfTEFURU5DWSksKDAsZy5hZGRMaXN0ZW5lcikodGhpcy53aW5kb3csImxvYWQiLGZ1bmN0aW9uKHQpe2Uuc2hhemFtTG9nZ2VyLmVuZFRpbWVyKGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpfSl9fSx7a2V5OiJhZGRFcnJvckxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy53aW5kb3cub25lcnJvcj1mdW5jdGlvbih0LG4scixpLG8pe2lmKG8mJm8uc3RhY2spe3ZhciBhPXQrIiA6ICIrby5zdGFjaztlLnNoYXphbUxvZ2dlci5hZGRDb3VudChkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuVU5DQVVHSFRfRVJST1IsYS5sZW5ndGg8NTAwP2E6YS5zdWJzdHJpbmcoMCw1MDApKX1lbHNlIGUuc2hhemFtTG9nZ2VyLmFkZENvdW50KGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5VTkNBVUdIVF9FUlJPUix0KyIgOiAiK24pfX19LHtrZXk6ImFkZFZpZXdhYmlsaXR5TGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj0uNSxyPTFlMyxpPS4wMSxvPTEsYT1uZXcgaFsiZGVmYXVsdCJdKGUsdGhpcy53aW5kb3cpO2EuZ2V0UGVyY2VudEluVmlldygpPD0tMT90aGlzLmRhY3hMb2dnZXIubG9nVmlld2FiaWxpdHlGYWlsdXJlKCk6KGEub25WaWV3KGksbyxmdW5jdGlvbigpe3JldHVybiB0LmRhY3hMb2dnZXIubG9nQmFyZVZpZXdhYmlsaXR5U3VjY2VzcygpfSksYS5vblZpZXcobixyLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGFjeExvZ2dlci5sb2dWaWV3YWJpbGl0eVN1Y2Nlc3MoKX0pKX19LHtrZXk6ImFkZENyZWF0aXZlQ2xpY2tMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt3LmluZGV4T2YodGhpcy50ZW1wbGF0ZU5hbWUpPj0wJiYoMCxnLmFkZExpc3RlbmVyKShlLCJjbGljayIsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3QuY3JlYXRpdmVDbGlja0xvZ2dlci5sb2dDbGljayhuLGUub2Zmc2V0V2lkdGgsZS5vZmZzZXRIZWlnaHQpfX0oZSkpfX1dKSx0fShzWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT1tfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiB5KGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6eShpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oMTApLHM9cihsKSxmPS4xLGQ9ImNsbWV0IixwPSJkYS1jeC1tZXRyaWNzIixoPVsic2hhemFtSWQiLCJ0ZW1wbGF0ZU5hbWUiLCJsb2NhbGUiLCJhZFNlcnZlciIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIiwidGVtcGxhdGVNaW5vclZlcnNpb24iLCJhZElkIiwiY3JlYXRpdmVJZCIsImltcHJlc3Npb25JZCJdLHY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe2kodGhpcyx0KTt2YXIgcj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlLHApKTtyZXR1cm4gci5zaG91bGRGaXJlTWV0cmljcz1NYXRoLnJhbmRvbSgpPD1mLHIudGltZXJzPXt9LHIuYWRJbmZvPW4saC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixlKSl0aHJvdyBuZXcgRXJyb3IoIlNoYXphbUxvZ2dlciBtaXNzaW5nIGFkSW5mbyBwcm9wZXJ0eTogIitlKX0pLHJ9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImZpcmVQaXhlbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zaG91bGRGaXJlTWV0cmljcyYmKGUuaT1lbmNvZGVVUklDb21wb25lbnQodGhpcy5hZEluZm8uaW1wcmVzc2lvbklkKSxlLmFwcD1lbmNvZGVVUklDb21wb25lbnQoZCksYyh0LnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSksImZpcmVQaXhlbCIsdGhpcykuY2FsbCh0aGlzLGUpKX19LHtrZXk6ImxvZ0V2ZW50Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9e307aWYobnVsbCE9ZSYmbnVsbCE9dCl7dHJ5e24mJihyLnR5cGU9biksci5lbj1lLHIuZXY9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2goaSl7ci5zdHJpbmdpZnlOb3RBdmFpbGFibGU9MX10aGlzLmZpcmVQaXhlbChyKX19fSx7a2V5OiJsb2dJbXByZXNzaW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuYWRJbmZvLHQ9e3M6ZS5zaGF6YW1JZCxuOmVuY29kZVVSSUNvbXBvbmVudChlLnRlbXBsYXRlTmFtZSksbDplLmxvY2FsZSxhczplLmFkU2VydmVyLHRtanY6ZS50ZW1wbGF0ZU1ham9yVmVyc2lvbix0bW52OmUudGVtcGxhdGVNaW5vclZlcnNpb24sYWk6ZS5hZElkLGNpOmUuY3JlYXRpdmVJZCxpOmUuaW1wcmVzc2lvbklkLGltcDoxfTtuYXZpZ2F0b3ImJih0LnVhPWVuY29kZVVSSUNvbXBvbmVudChuYXZpZ2F0b3IudXNlckFnZW50KSksdGhpcy5maXJlUGl4ZWwodCl9fSx7a2V5OiJzdGFydFRpbWVyIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnRpbWVyc1tlXT1uZXcgRGF0ZX19LHtrZXk6ImVuZFRpbWVyIix2YWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLnRpbWVyc1tlXSl7dmFyIG49bmV3IERhdGUtdGhpcy50aW1lcnNbZV07dGhpcy5sb2dFdmVudChlLG4sdC5FVkVOVF9UWVBFUy5USU1FUiksZGVsZXRlIHRoaXMudGltZXJzW2VdfX19LHtrZXk6ImFkZENvdW50Iix2YWx1ZTpmdW5jdGlvbihlLG4pe249bnx8MSx0aGlzLmxvZ0V2ZW50KGUsbix0LkVWRU5UX1RZUEVTLkNPVU5URVIpfX1dKSx0fShzWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT12LHYuRVZFTlRfVFlQRVM9e1RJTUVSOiJ0aW1lciIsQ09VTlRFUjoiY291bnRlciIsSlNPTjoianNvbiJ9LHYuRVZFTlRfTkFNRVM9e0JVWV9CT1hfTE9BRF9MQVRFTkNZOiJCdXlCb3hMb2FkTGF0ZW5jeSIsQUFOX0xBVEVOQ1k6IkFhbkxhdGVuY3kiLEFBTl9FUlJPUjoiQWFuRXJyb3IiLERST1BfRE9XTl9TRUxFQ1RPUjoiRHJvcERvd25TZWxlY3RvciIsVU5DQVVHSFRfRVJST1I6IlVuY2F1Z2h0RXJyb3IiLFVOREVGSU5FRF9UUkFDS0VSX0FSRzoiVW5kZWZpbmVkVHJhY2tlckFyZyIsQ09PUkRJTkFUT1JfVFJBQ0tFUjoiQ29vcmRpbmF0b3JUcmFja2VyIixJTUFHRV9MT0FEX0xBVEVOQ1k6IkltYWdlTG9hZExhdGVuY3kiLENSRUFUSVZFX0xPQURfTEFURU5DWToiQ3JlYXRpdmVMb2FkTGF0ZW5jeSJ9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcihlLHQpe3ZhciBuPWkodCkscj1vKHQpLHU9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPWEodS50b3AsdS5ib3R0b20sbiksbD1hKHUubGVmdCx1LnJpZ2h0LHIpLHM9YypsLGY9KHUuYm90dG9tLXUudG9wKSoodS5yaWdodC11LmxlZnQpO3JldHVybiBNYXRoLm1pbigxLE1hdGgubWF4KDAscy9mKSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS5pbm5lckhlaWdodHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGUuaW5uZXJXaWR0aHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh9ZnVuY3Rpb24gYShlLHQsbil7dmFyIHI9MDtyZXR1cm4gcj1lPjA/bi1lOnQ+MD9NYXRoLm1pbih0LG4pOjAsTWF0aC5taW4ocix0LWUpfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9bnVsbCxuPWZ1bmN0aW9uIHIoKXtlKCl8fCh0PXNldFRpbWVvdXQociwxMDApKX07cmV0dXJuIG4oKSx7Y2xlYXI6ZnVuY3Rpb24oKXt0JiZjbGVhclRpbWVvdXQodCl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXtuKHRoaXMsZSksdGhpcy53aW5kb3c9cnx8d2luZG93LHRoaXMuZWxlbT10fXJldHVybiBjKGUsW3trZXk6ImdldFBlcmNlbnRJblZpZXciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRUb3BXaW5kb3coKTtpZihlKXtpZih0aGlzLndpbmRvdz09PWUpcmV0dXJuIHIodGhpcy5lbGVtLGUpO2lmKHRoaXMud2luZG93LmZyYW1lRWxlbWVudClyZXR1cm4gcih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQsZSl9ZWxzZSBpZih0aGlzLndpbmRvdy4kc2YpdHJ5e3ZhciB0PXRoaXMud2luZG93LiRzZi5leHQuaW5WaWV3UGVyY2VudGFnZSgpfHwwO3JldHVybiB0LzEwMH1jYXRjaChuKXt9cmV0dXJuLTF9fSx7a2V5OiJnZXRUb3BXaW5kb3ciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9bnVsbDt0cnl7aWYoIXRoaXMud2luZG93LnRvcC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImNyb3NzLWRvbWFpbiBleGNlcHRpb24iKTtlPXRoaXMud2luZG93LnRvcH1jYXRjaCh0KXt9cmV0dXJuIGV9fSx7a2V5OiJvblZpZXdUaHJlc2hvbGQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMsbz1udWxsO3JldHVybiB1KGZ1bmN0aW9uKCl7aWYoaS5nZXRQZXJjZW50SW5WaWV3KCk+PWUmJmkuZ2V0UGVyY2VudEluVmlldygpPD10KXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTtpZihudWxsPT09bylvPWE7ZWxzZSBpZihhLW8+bilyZXR1cm4gcigpLCEwfWVsc2Ugbz1udWxsfSl9fSx7a2V5OiJvblZpZXciLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vblZpZXdUaHJlc2hvbGQoZSwxLHQsbil9fSx7a2V5OiJvbkhpZGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vblZpZXdUaHJlc2hvbGQoMCxlLHQsbil9fSx7a2V5OiJnZXRWZXJ0aWNhbFBvc2l0aW9uT25QYWdlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPS0xLHQ9dGhpcy5nZXRUb3BXaW5kb3coKTtpZih0KXtpZih0aGlzLndpbmRvdz09PXQpe3ZhciBuPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ascj1pKHQpLG89dGhpcy5lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtlPU1hdGgubWF4KE1hdGgubWluKG4vKHItbyksMSksMCl9ZWxzZSBpZih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQpe3ZhciBuPXRoaXMud2luZG93LmZyYW1lRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ascj1pKHQpLG89dGhpcy53aW5kb3cuZnJhbWVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtlPU1hdGgubWF4KE1hdGgubWluKG4vKHItbyksMSksMCl9fWVsc2UgaWYodGhpcy53aW5kb3cuJHNmKXRyeXtlPU1hdGgubWF4KE1hdGgubWluKCRzZi5leHQuZ2VvbSgpLnNlbGYudC8oJHNmLmV4dC5nZW9tKCkud2luLmgtJHNmLmV4dC5nZW9tKCkuc2VsZi5oKSwxKSwwKX1jYXRjaChhKXt9cmV0dXJuIGV9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWx9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBpKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyhlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxjPWZ1bmN0aW9uIHYoZSx0LG4pe251bGw9PT1lJiYoZT1GdW5jdGlvbi5wcm90b3R5cGUpO3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZih2b2lkIDA9PT1yKXt2YXIgaT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIG51bGw9PT1pP3ZvaWQgMDp2KGksdCxuKX1pZigidmFsdWUiaW4gcilyZXR1cm4gci52YWx1ZTt2YXIgbz1yLmdldDtpZih2b2lkIDAhPT1vKXJldHVybiBvLmNhbGwobil9LGw9bigxMCkscz1yKGwpLGY9ImRhLWN4LW1ldHJpY3MiLGQ9IkNvb3JkaW5hdGVDbGljayIscD0ianNvbiIsaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbil7aSh0aGlzLHQpO3ZhciByPW8odGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUsZikpO3JldHVybiByLmltcHJlc3Npb25JZD1uLHJ9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImxvZ0NsaWNrIix2YWx1ZTpmdW5jdGlvbihlLG4scil7dmFyIGk9e30sbz17Y3hjOmUucGFnZVgsY3ljOmUucGFnZVksY3B3Om4sY3BoOnJ9O2kuZW49ZCxpLnR5cGU9cCxpLmk9dGhpcy5pbXByZXNzaW9uSWQ7dHJ5e2kuZXY9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG8pKX1jYXRjaChhKXtpLnN0cmluZ2lmeU5vdEF2YWlsYWJsZT0xfWModC5wcm90b3R5cGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLCJmaXJlUGl4ZWwiLHRoaXMpLmNhbGwodGhpcyxpKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09aH1dKTs7d2luZG93LnBkYWdTY29wZSA9IHdpbmRvdy5wZGFnU2NvcGUgfHwge307d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkgPSBuZXcgUGRhQ2xpZW50QVBJLmRlZmF1bHQoeyJiYXNlVXJsIjoiaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20iLCJzaGF6YW1JZCI6Ijc5MjU4NTEiLCJ0ZW1wbGF0ZU5hbWUiOiJURVRSSVNfTU9CSUxFX1JBVkVOIiwidGVtcGxhdGVNYWpvclZlcnNpb24iOiIxIiwidGVtcGxhdGVNaW5vclZlcnNpb24iOiI4IiwibG9jYWxlIjoiVVMiLCJhZFNlcnZlciI6ImNvcm5lcnN0b25lIiwiYWRJZCI6IjQ1MzMwNzc4MTA3MDEiLCJjcmVhdGl2ZUlkIjoiNjEwNTU2NTk0MDcwMSIsImltcHJlc3Npb25JZCI6ImM4U0tscVdZYTVPbVlNWE9Rb09sUWciLCJhZFNlc3Npb25JZCI6IjAxMDFiMGRkOWU5ZWQ2ZTRkMTRlZTU5MmQxNDMwNzJjNTA1YTUzZTFlM2U3NmE2NTNhYjY2M2ZhMDEwZmVjOTkwMzg2In0pO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLnRyYWNrTG9hZExhdGVuY3koKTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS5hdHRhY2hHbG9iYWxzKCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYWRkRXJyb3JMaXN0ZW5lcigpOzwvc2NyaXB0PjwvaGVhZD48Ym9keT48ZGl2IGlkPWFkPjxkaXYgY2xhc3M9Im1vYmlsZVJhdmVuIHRlbXBsYXRlQ29udGFpbmVyIiBkYXRhLWNyZWF0aXZlLWlkPSI2MTA1NTY1OTQwNzAxIiBkYXRhLWFkLWlkPSI0NTMzMDc3ODEwNzAxIiBkYXRhLXJlYWN0cm9vdD0iIiBkYXRhLXJlYWN0aWQ9IjEiIGRhdGEtcmVhY3QtY2hlY2tzdW09IjY0NTYyNjQ2NSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgdGVtcGxhdGVDb250YWluZXJfX2xpbmsiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5QRWlwYWxtR3VUcG1ERnprS0RwVUlBQUFGaHBKa29aUUVBQUFHUUFXV3B6c1EvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8xNTA4NzY3NDgzP2FheGl0az1rSmJhLngyOVBwMHhFLktjb09lZlVBIiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iMiI+PC9hPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTI1cHg7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQ6I0ZGRkZGRjsiIGRhdGEtcmVhY3RpZD0iMyI+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxNjBweDtoZWlnaHQ6MTAwJTtwYWRkaW5nOjVweCAxMHB4IDVweCAxMHB4O2ZsZXg6MCAwIDEyNXB4OyIgZGF0YS1yZWFjdGlkPSI0Ij48ZGl2IGNsYXNzPSJhc2luSW1hZ2UiIGRhdGEtcmVhY3RpZD0iNSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgYXNpbkltYWdlIiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FuUEVpcGFsbUd1VHBtREZ6a0tEcFVJQUFBRmhwSmtvWlFFQUFBR1FBV1dwenNRL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMTUwODc2NzQ4Mz9hYXhpdGs9a0piYS54MjlQcDB4RS5LY29PZWZVQSIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjYiPjxkaXYgY2xhc3M9ImltYWdlQ29udGFpbmVyIiBkYXRhLXJlYWN0aWQ9IjciPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIGltYWdlQ29udGFpbmVyX19pbWFnZSIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvSS81MVZ6U2RqcmlPTC5fQUNfU1gxNjBfLmpwZyIgYWx0PSJMZWFybiBTLlEuTC4gZnJvbSB0aGUgZXhwZXJ0cyBpbiB0aGUgcHJlbWllciBndWlkZSBmb3IgYmVnaW5uZXJzIiBkYXRhLXJlYWN0aWQ9IjgiLz48L2Rpdj48L2E+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxMDAlO2JhY2tncm91bmQ6I0ZGRkZGRjsiIGRhdGEtcmVhY3RpZD0iOSI+PGRpdiBjbGFzcz0iYmxvY2sgYmxvY2stLWp1c3RpZnktY2VudGVyIGJsb2NrLS1kaXJlY3Rpb24tY29sdW1uIiBzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjAgMTBweCAwIDA7IiBkYXRhLXJlYWN0aWQ9IjEwIj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDAgNXB4IDA7IiBkYXRhLXJlYWN0aWQ9IjExIj48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZXh0TGluayB0ZXh0TGluay0tZGlzcGxheUFzVGV4dCIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9RblBFaXBhbG1HdVRwbURGemtLRHBVSUFBQUZocEprb1pRRUFBQUdRQVdXcHpzUS9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPWtKYmEueDI5UHAweEUuS2NvT2VmVUEiIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIxMiI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjE4cHg7IiBjbGFzcz0idGV4dENvbnRhaW5lciIgZGF0YS1yZWFjdGlkPSIxMyI+PHNwYW4gY2xhc3M9InRleHRDb250YWluZXJfX3RleHQiIGRhdGEtcmVhY3RpZD0iMTQiPlRyb3VibGUgbGV2ZXJhZ2luZyB5b3VyIGRhdGE/PC9zcGFuPjwvZGl2PjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDAgNXB4IDA7IiBkYXRhLXJlYWN0aWQ9IjE1Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZXh0TGluayIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9RblBFaXBhbG1HdVRwbURGemtLRHBVSUFBQUZocEprb1pRRUFBQUdRQVdXcHpzUS9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPWtKYmEueDI5UHAweEUuS2NvT2VmVUEiIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIxNiI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjEycHg7IiBjbGFzcz0idGV4dENvbnRhaW5lciBoLWVsbGlwc2lzIiBkYXRhLXJlYWN0aWQ9IjE3Ij48c3BhbiBjbGFzcz0idGV4dENvbnRhaW5lcl9fdGV4dCIgZGF0YS1yZWFjdGlkPSIxOCI+TGVhcm4gUy5RLkwuIGZyb20gdGhlIGV4cGVydHMgaW4gdGhlIHByZW1pZXIgZ3VpZGUgZm9yIGJlZ2lubmVyczwvc3Bhbj48L2Rpdj48L2E+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJtYXJnaW46MCAwIDRweCAwOyIgZGF0YS1yZWFjdGlkPSIxOSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgc3RhclJhdGluZyIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9RblBFaXBhbG1HdVRwbURGemtLRHBVSUFBQUZocEprb1pRRUFBQUdRQVdXcHpzUS9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPWtKYmEueDI5UHAweEUuS2NvT2VmVUEjY3VzdG9tZXJSZXZpZXdzIiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iMjAiPjxkaXYgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIHN0YXJSYXRpbmdfX3N0YXJzIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTp1cmwoJiN4Mjc7aHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGEvY3JlYXRpdmVzL2F1aS1taW5pLXNwcml0ZS0yMDE1LTAyLnBuZyYjeDI3Oyk7YmFja2dyb3VuZC1wb3NpdGlvbjotMTcwcHggMDsiIGRhdGEtcmVhY3RpZD0iMjEiPjwvZGl2PjxzcGFuIGNsYXNzPSJzdGFyUmF0aW5nX19jb3VudCIgZGF0YS1yZWFjdGlkPSIyMiI+MTU4PC9zcGFuPjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayBibG9jay0taW5saW5lICIgc3R5bGU9IndoaXRlLXNwYWNlOm5vcm1hbDsiIGRhdGEtcmVhY3RpZD0iMjMiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgNXB4IDAgMDsiIGRhdGEtcmVhY3RpZD0iMjQiPjxzcGFuIGNsYXNzPSJwcmljZUJveCIgZGF0YS1yZWFjdGlkPSIyNSI+PHNwYW4gY2xhc3M9InByaWNlIHByaWNlQm94X19idXkiIHN0eWxlPSJmb250LXNpemU6MTVweDsiIGRhdGEtcmVhY3RpZD0iMjYiPjxzcGFuIGNsYXNzPSJwcmljZV9fY3VycmVuY3kiIGRhdGEtcmVhY3RpZD0iMjciPiQ8L3NwYW4+PHNwYW4gY2xhc3M9InByaWNlX19hbW91bnQiIGRhdGEtcmVhY3RpZD0iMjgiPjE0Ljk5PC9zcGFuPjwvc3Bhbj48IS0tIHJlYWN0LXRleHQ6IDI5IC0tPjwhLS0gL3JlYWN0LXRleHQgLS0+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiIGRhdGEtcmVhY3RpZD0iMzAiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIHByaW1lTG9nbyIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYS9jcmVhdGl2ZXMvcHJpbWUtMngtMjAxNzA2MTQucG5nIiB3aWR0aD0iNDMiIGhlaWdodD0iMTIiIGFsdD0iUHJpbWUiIGRhdGEtcmVhY3RpZD0iMzEiLz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDEwcHggMCAxMHB4O2hlaWdodDoxMjNweDtvcGFjaXR5OjAuNjQ7ZmxleDowIDAgOXB4OyIgZGF0YS1yZWFjdGlkPSIzMiI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMzMiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIGltYWdlQ29udGFpbmVyX19pbWFnZSIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9BbWF6b25CcmFuZFN0b3Jlc1BsYXRmb3JtL2JsYWNrX2Fycm93LnBuZyIgYWx0PSJHcmF5IEFycm93IiByb2xlPSJwcmVzZW50YXRpb24iIGRhdGEtcmVhY3RpZD0iMzQiLz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC0xNS4zLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC1kb20tMTUuMy4yLm1pbi5qcyI+PC9zY3JpcHQ+PHNjcmlwdD52YXIgTGlicmFyeT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgbz1uW3JdPXtleHBvcnRzOnt9LGlkOnIsbG9hZGVkOiExfTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmxvYWRlZD0hMCxvLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQucD0iIix0KDApfShbZnVuY3Rpb24oZSx0LG4pe24oMSksZS5leHBvcnRzPW4oMTA0KX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJihPYmplY3QuYXNzaWduPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0KGUpLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbz1hcmd1bWVudHNbcl07aWYobnVsbCE9bylmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKG5baV09b1tpXSl9cmV0dXJuIG59KX0sLGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVJlYWN0fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDYpLGM9cihwKSxmPW4oMjcpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucHJvcHMudXBkYXRlT25SZXNpemUmJnRoaXMubGlzdGVuRm9yUmVzaXplKCl9fSx7a2V5OiJsaXN0ZW5Gb3JSZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczsidW5kZWZpbmVkIiE9dHlwZW9mIFNGQ2xpZW50JiZTRkNsaWVudCYmU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/U0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KToidW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50JiZNU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/TVNGQ2xpZW50LnJlZ2lzdGVyQ3VzdG9tTWVzc2FnZUxpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7ZS5vblJlc2l6ZSgpfSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KX19LHtrZXk6Im9uUmVzaXplIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZm9yY2VVcGRhdGUoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnJlbmRlcmluZ0NvbnRleHQsdD10aGlzLnByb3BzLnN0cnVjdHVyZSxuPXRoaXMucHJvcHMuY2xhc3NOYW1lKyh0aGlzLnByb3BzLnNreT8iIHNreSI6IiIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3RlbXBsYXRlSWQ6dGhpcy5wcm9wcy50ZW1wbGF0ZUlkLGNsYXNzTmFtZTpuLGhyZWY6ZS5hZExpbmssY2xpY2tVcmxzOmUuY2xpY2tVcmxzLGNyZWF0aXZlSWQ6ZS5jcmVhdGl2ZUlkLGFkSWQ6ZS5hZElkfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3JlbmRlcmluZ0NvbnRleHQ6ZSxibG9jazp0LGNvbXBvbmVudHNNYXA6dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6dGhpcy5wcm9wcy5kb21SZWZzfSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJ0ZW1wbGF0ZUNvbnRhaW5lciIsImJsb2NrIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZW1wbGF0ZSIsaC5wcm9wVHlwZXM9e3JlbmRlcmluZ0NvbnRleHQ6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsc3RydWN0dXJlOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY2xhc3NOYW1lOnUuUHJvcFR5cGVzLnN0cmluZyxkb21SZWZzOnUuUHJvcFR5cGVzLm9iamVjdCx0ZW1wbGF0ZUlkOnUuUHJvcFR5cGVzLnN0cmluZyx1cGRhdGVPblJlc2l6ZTp1LlByb3BUeXBlcy5ib29sLHNreTp1LlByb3BUeXBlcy5ib29sfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPW4oMjQpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zdGF0ZT17ZmxleGJveDohMH0sbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ub2RlJiZ0aGlzLnNldFN0YXRlKHtmbGV4Ym94OmRbImRlZmF1bHQiXS5zdXBwb3J0LmZsZXhib3goKX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUrIiAiOiIiKSsidGVtcGxhdGVDb250YWluZXIiKyh0aGlzLnN0YXRlLmZsZXhib3g/IiI6IiBoLW5vRmxleGJveCIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxjbGFzc05hbWU6dCxpZDp0aGlzLnByb3BzLnRlbXBsYXRlSWQsImRhdGEtY3JlYXRpdmUtaWQiOnRoaXMucHJvcHMuY3JlYXRpdmVJZCwiZGF0YS1hZC1pZCI6dGhpcy5wcm9wcy5hZElkLHJlZjpmdW5jdGlvbih0KXtlLm5vZGU9dH19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJ0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayJ9fSksdGhpcy5wcm9wcy5jaGlsZHJlbil9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIkNsaWNrdGhyb3VnaExpbmsiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRlbXBsYXRlQ29udGFpbmVyICIsaC5wcm9wVHlwZXM9e3N0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxjbGFzc05hbWU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRlbXBsYXRlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGhyZWY6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLGNyZWF0aXZlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFkSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1uKDMpLHA9cihsKSxjPW4oOCksZj1yKGMpLGQ9big5KSxoPXIoZCkseT1uKDEyKSxtPXIoeSksYj1uKDIzKSx2PXIoYiksZz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGIuQ09VUE9OX1RPS0VOX01BQ1JPLCgwLHZbImRlZmF1bHQiXSkoKSl9LF89ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJoYW5kbGVPbkNsaWNrIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnByb3BzLG49dC5jbGlja1RyYWNrZXJVcmxzLHI9dC51cmwsbz10LmNhc2NhZGluZ0ludGVudCxpPXQuaXNPZmZzaXRlOygwLGZbImRlZmF1bHQiXSkobiksKDAsbVsiZGVmYXVsdCJdKShnKHIpLGksbykmJmUucHJldmVudERlZmF1bHQoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5wcm9wcyxuPXQudXJsLHI9dC5pc09mZnNpdGUsbz10LmNoaWxkcmVuLGk9dC5hbmNob3JQcm9wcyxhPW51bGw7dGhpcy5jb250ZXh0LmlzU3RhdGljSHRtbCYmdGhpcy5wcm9wcy5jbGlja1RyYWNrZXJVcmxzJiYoYT10aGlzLnByb3BzLmNsaWNrVHJhY2tlclVybHMuam9pbigifCIpKTt2YXIgdT0iY2xpY2t0aHJvdWdoTGluayIrKGkuY2xhc3NOYW1lPyIgIitpLmNsYXNzTmFtZToiIik7cmV0dXJuIHBbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJhIixzKHt9LGkse2NsYXNzTmFtZTp1LGhyZWY6ZyhuKSx0YXJnZXQ6KDAsaFsiZGVmYXVsdCJdKShuLHIpLG9uQ2xpY2s6ZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlT25DbGljayh0KX0sb25Nb3VzZURvd246ZnVuY3Rpb24oKXtyZXR1cm4gZS5mb3JjZVVwZGF0ZSgpfSwiZGF0YS1jbGlja1RyYWNrZXJVcmxzIjphLHJlbDoibm9mb2xsb3cifSksbyl9fV0pLHR9KGwuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09XyxfLmRpc3BsYXlOYW1lPSJDbGlja3Rocm91Z2hMaW5rIixfLnByb3BUeXBlcz17dXJsOmwuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNhc2NhZGluZ0ludGVudDpsLlByb3BUeXBlcy5zdHJpbmcsaXNPZmZzaXRlOmwuUHJvcFR5cGVzLmJvb2wsY2xpY2tUcmFja2VyVXJsczpsLlByb3BUeXBlcy5hcnJheU9mKGwuUHJvcFR5cGVzLnN0cmluZyksYW5jaG9yUHJvcHM6bC5Qcm9wVHlwZXMub2JqZWN0LGNoaWxkcmVuOmwuUHJvcFR5cGVzLm5vZGV9LF8uY29udGV4dFR5cGVzPXtpc1N0YXRpY0h0bWw6bC5Qcm9wVHlwZXMuYm9vbH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG89MDtlPm87bysrKXRbb109YXJndW1lbnRzW29dO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhPXRbaV07aWYoYSlpZigic3RyaW5nIj09dHlwZW9mIGEpcihhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpcmUgcGl4ZWw6ICInK0pTT04uc3RyaW5naWZ5KGEpKyciIGlzIG5vdCBhIHN0cmluZyEnKTtuLmFwcGx5KHRoaXMsYSl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZSYmKChuZXcgSW1hZ2UpLnNyYz1lKX07dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49dHx8ISgwLGFbImRlZmF1bHQiXSkoZSk7cmV0dXJuIG4/cy5JTl9ORVdfV0lORE9XOnMuSU5fU0FNRV9XSU5ET1d9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1vO3ZhciBpPW4oMTApLGE9cihpKSxzPW4oMTEpfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe3JldHVybiByLnRlc3QoZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1uO3ZhciByPS9eKChodHRwcz86KT9cL1wvKSguKlwuKT9hbWF6b25cLi99LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj10LklOX1NBTUVfV0lORE9XPSJfdG9wIixyPXQuSU5fTkVXX1dJTkRPVz0iX2JsYW5rIjt0WyJkZWZhdWx0Il09e0lOX05FV19XSU5ET1c6cixJTl9TQU1FX1dJTkRPVzpufX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0LG4pe2lmKCF0JiZtWyJkZWZhdWx0Il0mJkMmJnBbImRlZmF1bHQiXS5tYXNoLmlzQVVJQXZhaWxhYmxlKCkmJigwLFRbImRlZmF1bHQiXSkoZSx0KT09PVAuSU5fTkVXX1dJTkRPVylwWyJkZWZhdWx0Il0ubWFzaC5vcGVuSW5FeHRlcm5hbEJyb3dzZXIuZXhlY3V0ZSh7dXJsOmV9KTtlbHNlIGlmKCF0fHwhTXx8dlsiZGVmYXVsdCJdJiYhUyhbMiwyLDEwXSl8fF9bImRlZmF1bHQiXSYmIVMoWzUsNSwxMzVdKSl7aWYoIXR8fCFJKXJldHVybiExO2ZbImRlZmF1bHQiXS5vcGVuKGUpfWVsc2UgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcihufHxlKTtyZXR1cm4hMH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuKDAsVFsiZGVmYXVsdCJdKShlLHQpPT09UC5JTl9TQU1FX1dJTkRPV31mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3JldHVybiB1WyJkZWZhdWx0Il0ub3BlbihlLCgwLFRbImRlZmF1bHQiXSkoZSx0KSl9LGE9ZnVuY3Rpb24oKXtyZXR1cm4gbyhlLHQsbil9LHM9ZnVuY3Rpb24oKXtyZXR1cm4gYSgpfHxyKCl9O3JldHVybiBpKGUsdCk/KHNldFRpbWVvdXQocyxOKSwhMCk6YSgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0WyJkZWZhdWx0Il09YTt2YXIgcz1uKDEzKSx1PXIocyksbD1uKDE0KSxwPXIobCksYz1uKDE1KSxmPXIoYyksZD1uKDE2KSxoPXIoZCkseT1uKDE3KSxtPXIoeSksYj1uKDE4KSx2PXIoYiksZz1uKDIxKSxfPXIoZyksUD1uKDExKSxrPW4oOSksVD1yKGspLHg9bigyMiksTz1yKHgpLHc9ISFwWyJkZWZhdWx0Il0sQz13JiYidW5kZWZpbmVkIiE9dHlwZW9mIHBbImRlZmF1bHQiXS5tYXNoLGo9ISFoWyJkZWZhdWx0Il0sTT1qJiYiZnVuY3Rpb24iPT10eXBlb2YgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcixFPSEhZlsiZGVmYXVsdCJdLEk9RSYmImZ1bmN0aW9uIj09dHlwZW9mIGZbImRlZmF1bHQiXS5vcGVuLFI9aiYmZnVuY3Rpb24oKXt2YXIgZT1oWyJkZWZhdWx0Il0uZ2V0U0RLVmVyc2lvbigpLm1hdGNoKC8oXGQrKVwuKFxkKykuKFxkKykkLyk7cmV0dXJuIGU/W2VbMV0sZVsyXSxlWzNdXTp2b2lkIDB9KCksUz1mdW5jdGlvbihlKXtyZXR1cm4gUiYmKDAsT1siZGVmYXVsdCJdKShSLGUpPj0wfSxOPTE1MH0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50O3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBtcmFpZCYmbXJhaWQ7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbiYmYW1hem9uO3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxpPW4oMTQpLGE9cihpKSxzPWZ1bmN0aW9uKCl7aWYoIWFbImRlZmF1bHQiXSlyZXR1cm4hMTt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYVsiZGVmYXVsdCJdLmdldERvY3VtZW50Q29va2llKCkpLnNwbGl0KCI7IikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10LnNwbGl0KCI9Iik7biYmbi5sZW5ndGg+PTImJihlW25bMF0udHJpbSgpXT1uWzFdLnRyaW0oKSl9KSx7djovXCJhdlwiOlwiKFsuXGRdKilcIi9pLnRlc3QoZVsiYW16bi1hcHAtY3R4dCJdKX19KCk7cmV0dXJuIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOm8oZSkpP2Uudjp2b2lkIDB9KCk7dFsiZGVmYXVsdCJdPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L2lQaG9uZXxpUGFkfGlQb2QvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE0KSxpPXIobyksYT1uKDIwKSxzPXIoYSksdT1pWyJkZWZhdWx0Il0mJmlbImRlZmF1bHQiXS5nZXRVc2VyQWdlbnRJbmZvKCl8fHNbImRlZmF1bHQiXSYmc1siZGVmYXVsdCJdLnVzZXJBZ2VudDt0WyJkZWZhdWx0Il09dX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3I7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L0FuZHJvaWQvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgbj1NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCkscj0wO24+cjtyKyspe3ZhciBvPWVbcl0saT10W3JdO2lmKG8+aSlyZXR1cm4gMTtpZihpPm8pcmV0dXJuLTF9cmV0dXJuIDB9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiJBTVMiO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hP2J0b2EoRGF0ZS5ub3coKSsoIjsiK2UpKToiIn1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW47dC5DT1VQT05fVE9LRU5fTUFDUk89IlZQQ19DU19NQUNSTyJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDI1KSxpPXIobyksYT1uKDI2KSxzPXIoYSksdT0vXi4qXC9cL1teXC9dKy87ZS5leHBvcnRzPXtzdXBwb3J0OntmbGV4Ym94OmZ1bmN0aW9uKCl7cmV0dXJuIE1vZGVybml6ciYmKE1vZGVybml6ci5mbGV4Ym94fHxNb2Rlcm5penIuZmxleGJveGxlZ2FjeXx8TW9kZXJuaXpyLmZsZXhib3h0d2VlbmVyKX19LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB0LnNwbGl0KCIuIikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5tYXRjaCgvKC4qKVxbKFxkKilcXS8pLHI9biYmblsxXSxvPW4mJm5bMl07cmV0dXJuIHImJm8/ZVtyXVtwYXJzZUludChvLDEwKV06ZVt0XX0sZSl9LGdldE1lZGlhQ2VudHJhbEltYWdlU3JjOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgbz1pWyJkZWZhdWx0Il0udXJscy5NRURJQV9DRU5UUkFMX1dXLGE9ZS5yZXBsYWNlKHUsIiIpLGw9bysoMD09PWEuaW5kZXhPZigiLyIpPyIiOiIvIikrYSxwPXt9LGM9cj8yOjE7cmV0dXJuIHQuYWMmJihwLkFDPSEwKSx0LnN4JiYocC5TWD10LnN4KmMpLHQuc3kmJihwLlNZPXQuc3kqYyksdC5xbCYmKHAuUUw9dC5xbCksdC5mbSYmKHAuRk09dC5mbSksc1siZGVmYXVsdCJdLnNldFRhZ3MobCxwLFsiQUMiLCJTWCIsIlNZIiwiRk0iLCJRTCJdLG4pfX19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dXJsczp7TUVESUFfQ0VOVFJBTF9XVzoiaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20iLE1FRElBX0NFTlRSQUxfQ046Imh0dHBzOi8vaW1hZ2VzLWNuLnNzbC1pbWFnZXMtYW1hem9uLmNvbSJ9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtzZXRUYWdzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPS9cLl8oW15cLl0rKSg/PV9cLlx3KyQpLyxpPW8uZXhlYyhlKSxhPWk/aVsxXS5zcGxpdCgiXyIpOltdLHM9T2JqZWN0LmFzc2lnbih7fSx0KSx1PVtdO3ImJmEuZm9yRWFjaChmdW5jdGlvbihlKXtpZigiIiE9PWUpe3ZhciB0LG49ZS5zdWJzdHJpbmcoMCwyKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNbbl0/KHNbbl09PT0hMSYmKHNbbl09bnVsbCksbj1udWxsKTp0PWUuc3Vic3RyaW5nKDIsZS5sZW5ndGgpLG51bGwhPT1uJiZ1LnB1c2gobit0KX19KSxuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9c1tlXTt0JiZ1LnB1c2goZSsodD09PSEwPyIiOnQpKX0pO3ZhciBsPS0xO3UuZm9yRWFjaChmdW5jdGlvbihlLHQpeyJDUiI9PT1lLnN1YnN0cmluZygwLDIpJiYobD10KX0pO3ZhciBwPSExO2lmKGw+PTApe3ZhciBjPXUuc3BsaWNlKGwsMSk7dS51bnNoaWZ0KGNbMF0pLHA9ITB9dmFyIGY9dS5pbmRleE9mKCJBQyIpO2lmKGY+MCl7dmFyIGQ9dS5zcGxpY2UoZiwxKTtwP3Uuc3BsaWNlKDEsMCxkWzBdKTp1LnVuc2hpZnQoZFswXSl9cmV0dXJuIHUubGVuZ3RoPjAmJihlPWEubGVuZ3RoPjA/ZS5yZXBsYWNlKG8sIi5fIit1LmpvaW4oIl8iKSk6ZS5yZXBsYWNlKC9cLig/PVx3KyQpLywiLl8iK3Uuam9pbigiXyIpKyJfLiIpKSxlfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigyNCksYz1yKHApLGY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtjbG9hazpuLmV4dHJhY3RNZXRhZGF0YShlLmJsb2NrLCJjbG9hayIpfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldFN0YXRlKHtjbG9hazohMX0pfX0se2tleToiZ2V0Q2xhc3NOYW1lIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJibG9jayIsdD0iIjt0aGlzLnByb3BzLmJsb2NrLmNzc0NsYXNzZXMmJih0PXRoaXMucHJvcHMuYmxvY2suY3NzQ2xhc3Nlcy5qb2luKCIgIikpLCIiIT09dCYmKGUrPSIgIit0KTt2YXIgbj10aGlzLnByb3BzLmJsb2NrLmxheW91dDtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1uW3RdOyJqdXN0aWZ5Q29udGVudCI9PT10JiYiZmxleC1zdGFydCIhPT1yP2UrPSIgYmxvY2stLWp1c3RpZnktIityOiJhbGlnbkl0ZW1zIj09PXQmJiJzdHJldGNoIiE9PXI/ZSs9IiBibG9jay0tYWxpZ24tIityOiJmbGV4RGlyZWN0aW9uIj09PXQmJiJyb3ciIT09ciYmKGUrPSIgYmxvY2stLWRpcmVjdGlvbi0iK3IpfSksdGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kJiZ0aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQuaWQmJihlKz0iIGJsb2NrLS1iYWNrZ3JvdW5kIiksdGhpcy5zdGF0ZS5jbG9hayYmKGUrPSIgaC1jbG9hayIpLGV9fSx7a2V5OiJwcmV2ZW50UHJvcGVydHkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJiIiIT09dD8ianVzdGlmeUNvbnRlbnQiPT09ZXx8ImFsaWduSXRlbXMiPT09ZXx8ImZsZXhEaXJlY3Rpb24iPT09ZTohMH19LHtrZXk6ImdldEJsb2NrTGF5b3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLmJsb2NrLmxheW91dCxuPXt9O3JldHVybiB0JiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPXRbcl07ZS5wcmV2ZW50UHJvcGVydHkocixvKXx8KG5bcl09byl9KSxufX0se2tleToiZ2V0QmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmJsb2NrLnN0eWxlLHQ9e307cmV0dXJuIGUmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnZhbHVlOyJ1bmRlZmluZWQiIT10eXBlb2YgdFtlLm5hbWVdJiYobj10W2UubmFtZV0rIjsiK2UubmFtZSsiOiIrbiksdFtlLm5hbWVdPW59KSx0fX0se2tleToiZ2V0UHJvcFZhbHVlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiJwYXRoIj09PXQudHlwZT9jWyJkZWZhdWx0Il0uZ2V0KGUsdC52YWx1ZSk6ImNvbnN0YW50Ij09PXQudHlwZT90LnZhbHVlOm51bGx9fSx7a2V5OiJnZXRDb21wb25lbnRQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXt9O3JldHVybiBlLnByb3BzJiZlLnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlLm5hbWVdPXQuZ2V0UHJvcFZhbHVlKHQucHJvcHMucmVuZGVyaW5nQ29udGV4dCxlKX0pLG59fSx7a2V5OiJleHRyYWN0TWV0YWRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKG49ZS52YWx1ZSl9KSxufX0se2tleToic2V0UmVmIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmV4dHJhY3RNZXRhZGF0YSh0aGlzLnByb3BzLmJsb2NrLCJyZWYiKTt0JiZ0aGlzLnByb3BzLmRvbVJlZnMmJih0aGlzLnByb3BzLmRvbVJlZnNbdF09ZSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImhpZGUiKSxyPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImlkIiksbz12b2lkIDAsaT12b2lkIDAsYT12b2lkIDAscz12b2lkIDAsdT12b2lkIDAscD12b2lkIDAsYz12b2lkIDA7aWYoIW4pe289dGhpcy5nZXRDbGFzc05hbWUoKTt2YXIgZj10aGlzLmdldEJsb2NrTGF5b3V0KCksZD10aGlzLmdldEJsb2NrU3R5bGUoKTtpPU9iamVjdC5hc3NpZ24oe30sZixkKSxhPVtdO3ZhciBoPXRoaXMucHJvcHMuYmxvY2suY2hpbGRyZW47aCYmaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2EucHVzaChsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCh0LHtyZW5kZXJpbmdDb250ZXh0OmUucHJvcHMucmVuZGVyaW5nQ29udGV4dCxibG9jazpuLGNvbXBvbmVudHNNYXA6ZS5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6ZS5wcm9wcy5kb21SZWZzLGtleTpuLmlkfSkpfSk7dmFyIHk9dGhpcy5wcm9wcy5ibG9jay5jb21wb25lbnQ7eSYmKHU9dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwW3kuaWRdLHM9dGhpcy5nZXRDb21wb25lbnRQcm9wcyh5KSk7dmFyIG09dGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kO20mJihjPXRoaXMucHJvcHMuY29tcG9uZW50c01hcFttLmlkXSxwPXRoaXMuZ2V0Q29tcG9uZW50UHJvcHMobSkpfXJldHVybiFuJiZsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7aWQ6cixjbGFzc05hbWU6byxzdHlsZTppLHJlZjpmdW5jdGlvbih0KXtlLnNldFJlZih0KX19LGMmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJsb2NrX19iYWNrZ3JvdW5kIn0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoYyxwKSksYS5sZW5ndGg+MD9hOnUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHUscykpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iQmxvY2siLGYucHJvcFR5cGVzPXtyZW5kZXJpbmdDb250ZXh0OnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGJsb2NrOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsZG9tUmVmczp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89MTk5LGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm1vZGVsPXQsdGhpcy5ibG9ja3NNYXA9e30sdGhpcy5fYnVpbGRCbG9ja3NNYXAoKX1yZXR1cm4gcihlLFt7a2V5OiJfYnVpbGRCbG9ja3NNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD17fTtlLnB1c2godGhpcy5tb2RlbCk7Zm9yKHZhciBuPTA7ZS5sZW5ndGg+MDspe3ZhciByPWUuc2hpZnQoKSxpPXRoaXMuX2dldFJlZklkKHIpO2lmKCIiIT09aSYmKHRoaXMuYmxvY2tzTWFwW2ldPXIpLHRbci5pZF18fCh0W3IuaWRdPSEwLGU9ZS5jb25jYXQoci5jaGlsZHJlbnx8W10pKSxuKyssbj5vKWJyZWFrfX19LHtrZXk6Il9nZXRSZWZJZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7InJlZiI9PT1lLm5hbWUmJih0PWUudmFsdWUpfSksdH19LHtrZXk6ImhpZGVCbG9jayIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiZuLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ImhpZGUiPT09ZS5uYW1lJiYoZS52YWx1ZT10KX0pfX0se2tleToiYWRkQmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuYmxvY2tzTWFwW2VdO3ImJihyLnN0eWxlPXIuc3R5bGV8fFtdLHIuc3R5bGUucHVzaCh7bmFtZTp0LHZhbHVlOm59KSl9fSx7a2V5OiJhZGRDc3NDbGFzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiYobi5jc3NDbGFzc2VzPW4uY3NzQ2xhc3Nlc3x8W10sbi5jc3NDbGFzc2VzLnB1c2godCkpfX0se2tleToiZ2V0Q29tcG9uZW50UHJvcCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXSxyPW51bGw7cmV0dXJuIG4mJm4uY29tcG9uZW50JiZuLmNvbXBvbmVudC5wcm9wcyYmbi5jb21wb25lbnQucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYocj1lKX0pLHJ9fSx7a2V5OiJzZXRDb21wb25lbnRQcm9wIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzLmJsb2Nrc01hcFtlXTtpZihvJiZvLmNvbXBvbmVudCl7dmFyIGk9ITE7by5jb21wb25lbnQucHJvcHM9by5jb21wb25lbnQucHJvcHN8fFtdLG8uY29tcG9uZW50LnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKGUudmFsdWU9bixlLnR5cGU9cixpPSEwKX0pLGl8fG8uY29tcG9uZW50LnByb3BzLnB1c2goe25hbWU6dCx2YWx1ZTpuLHR5cGU6cn0pfX19LHtrZXk6InNldENzc0NsYXNzZXMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ibG9ja3NNYXBbZV07biYmKG4uY3NzQ2xhc3Nlcz1uLmNzc0NsYXNzZXN8fFtdLEFycmF5LmlzQXJyYXkodCk/bi5jc3NDbGFzc2VzPXQ6bi5jc3NDbGFzc2VzLnB1c2godCkpfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1pfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM0KSxjPXIocCksZj1uKDM1KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0LGFsaWdubWVudDp0aGlzLnByb3BzLmFsaWdubWVudCxtYXhIZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHR9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7YWRkaXRpb25hbENsYXNzOnRoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzLHBhdGg6dGhpcy5wcm9wcy5wYXRoLHdpZHRoOnRoaXMucHJvcHMud2lkdGgsaGVpZ2h0OnRoaXMucHJvcHMuaGVpZ2h0LHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxxbDp0aGlzLnByb3BzLnFsLHJldGluYTp0aGlzLnByb3BzLnJldGluYSxhYzp0aGlzLnByb3BzLmFjLGZtOnRoaXMucHJvcHMuZm0sbWVyZ2VUYWdzOnRoaXMucHJvcHMubWVyZ2VUYWdzLGFsdDp0aGlzLnByb3BzLmFsdCxzcHJpdGU6dGhpcy5wcm9wcy5zcHJpdGUscm9sZTp0aGlzLnByb3BzLnJvbGUsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsiaW1hZ2VDb250YWluZXIiLCJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWgsaC5kaXNwbGF5TmFtZT0iTWVkaWFDZW50cmFsSW1hZ2VDb250YWluZXIiLGgucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyx3aWR0aDp1LlByb3BUeXBlcy5zdHJpbmcsaGVpZ2h0OnUuUHJvcFR5cGVzLnN0cmluZyxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHJldGluYTp1LlByb3BUeXBlcy5ib29sLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLGZtOnUuUHJvcFR5cGVzLnN0cmluZyxtZXJnZVRhZ3M6dS5Qcm9wVHlwZXMuYm9vbCxhbHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHNwcml0ZTp1LlByb3BUeXBlcy5ib29sLHJvbGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRpdGxlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3Qsb25Mb2FkOnUuUHJvcFR5cGVzLmZ1bmMsbWF4SGVpZ2h0OnUuUHJvcFR5cGVzLm51bWJlcn0saC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJpbWFnZUNvbnRhaW5lciIrKHRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0PyIgaW1hZ2VDb250YWluZXItLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIpO3RoaXMucHJvcHMuYWxpZ25tZW50JiYiIiE9PXRoaXMucHJvcHMuYWxpZ25tZW50JiYoZSs9IiBpbWFnZUNvbnRhaW5lci0tIit0aGlzLnByb3BzLmFsaWdubWVudCk7dmFyIHQ9e307cmV0dXJuIHRoaXMucHJvcHMubWF4SGVpZ2h0JiZPYmplY3QuYXNzaWduKHQse21heEhlaWdodDp0aGlzLnByb3BzLm1heEhlaWdodH0pLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ZSxzdHlsZTp0fSxsWyJkZWZhdWx0Il0uY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRyZW4se2FkZGl0aW9uYWxDbGFzczoiaW1hZ2VDb250YWluZXJfX2ltYWdlIn0pKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1wLHAuZGlzcGxheU5hbWU9IkltYWdlQ29udGFpbmVyIixwLnByb3BUeXBlcz17ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyxtYXhIZWlnaHQ6dS5Qcm9wVHlwZXMubnVtYmVyfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM2KSxjPShyKHApLG4oMjQpKSxmPXIoYyksZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRJbWFnZVNyYyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGZbImRlZmF1bHQiXS5nZXRNZWRpYUNlbnRyYWxJbWFnZVNyYyhlLHthYzp0aGlzLnByb3BzLmFjLHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxmbTp0aGlzLnByb3BzLmZtLHFsOnRoaXMucHJvcHMucWx9LHRoaXMucHJvcHMubWVyZ2VUYWdzLHRoaXMucHJvcHMucmV0aW5hKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRJbWFnZVNyYyh0aGlzLnByb3BzLnBhdGgpLG49Im1lZGlhQ2VudHJhbEltYWdlIisodGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiKTtpZih0aGlzLnByb3BzLnNwcml0ZSl7dmFyIHI9T2JqZWN0LmFzc2lnbih7d2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYmFja2dyb3VuZEltYWdlOiJ1cmwoJyIrdCsiJykifSx0aGlzLnByb3BzLnN0eWxlKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpuLHN0eWxlOnIsdGl0bGU6dGhpcy5wcm9wcy50aXRsZX0pfXJldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiaW1nIix7Y2xhc3NOYW1lOm4sc3JjOnQsd2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYWx0OnRoaXMucHJvcHMuYWx0LHJvbGU6dGhpcy5wcm9wcy5yb2xlLHRpdGxlOnRoaXMucHJvcHMudGl0bGUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxvbkxvYWQ6ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbkxvYWQmJmUucHJvcHMub25Mb2FkKHQudGFyZ2V0KX19KX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9Ik1lZGlhQ2VudHJhbEltYWdlIixkLnByb3BUeXBlcz17YWRkaXRpb25hbENsYXNzOnUuUHJvcFR5cGVzLnN0cmluZyxwYXRoOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIscmV0aW5hOnUuUHJvcFR5cGVzLmJvb2wsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsZm06dS5Qcm9wVHlwZXMuc3RyaW5nLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGFsdDp1LlByb3BUeXBlcy5zdHJpbmcsc3ByaXRlOnUuUHJvcFR5cGVzLmJvb2wscm9sZTp1LlByb3BUeXBlcy5zdHJpbmcsdGl0bGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxvbkxvYWQ6dS5Qcm9wVHlwZXMuZnVuY30sZC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInJldGluYSBtb2R1bGVzIGV4cGVjdHMgYSBmdW5jdGlvbiBvblJldGluYVN0YXRlQ2hhbmdlIGFjY2VwdGluZyBib29sZWFuIik7aWYod2luZG93Lm1hdGNoTWVkaWEpe3ZhciB0PXdpbmRvdy5tYXRjaE1lZGlhKCIoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwobWluLXJlc29sdXRpb246IDE5MmRwaSkiKSxuPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQubWF0Y2hlcyl9O3QmJm4odCksdC5hZGRMaXN0ZW5lciYmdC5hZGRMaXN0ZW5lcihuKX1lbHNlIGUod2luZG93LmRldmljZVBpeGVsUmF0aW8+MT8hMDohMSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzgpLGM9cihwKSxmPTk5OSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5fc2V0U3RhdGUoZSksbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0ZSh0aGlzLnByb3BzKSx0aGlzLl9oYW5kbGVUZXh0T3ZlcmZsb3coKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToiY29tcG9uZW50RGlkVXBkYXRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0idGV4dENvbnRhaW5lcl9fdGV4dCI7dCs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciBuPXtmb250U2l6ZTp0aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4fTtyZXR1cm4gT2JqZWN0LmFzc2lnbihuLHRoaXMucHJvcHMuc3R5bGUpLHRoaXMucHJvcHMudGV4dD9sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmZ1bmN0aW9uKHQpe2Uubm9kZT10fSxzdHlsZTpuLGNsYXNzTmFtZToidGV4dENvbnRhaW5lciIrKHRoaXMuc3RhdGUudXNlQ3NzVHJ1bmNhdGlvbj8iIGgtZWxsaXBzaXMiOiIiKX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtyZWY6ZnVuY3Rpb24odCl7ZS5zcGFuPXR9LGNsYXNzTmFtZTp0LGlkOnRoaXMucHJvcHMudGV4dElkfSx0aGlzLnByb3BzLnRleHQpKTpudWxsfX0se2tleToiX3NldFN0YXRlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QuYXNzaWduKHt9LGUuZm9udCk7dGhpcy5zdGF0ZT17Zm9udDp0LHVzZUNzc1RydW5jYXRpb246dC5tYXhMaW5lcz8xPT09dC5tYXhMaW5lczohMCxuZWVkc1RpdGxlQXR0cmlidXRlOiExLG9yaWdpbmFsVGV4dDplLnRleHR9fX0se2tleToiX3Nob3dUb29sdGlwIix2YWx1ZTpmdW5jdGlvbihlKXtlPygwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5hdHRyKCJ0aXRsZSIsdGhpcy5zdGF0ZS5vcmlnaW5hbFRleHQpOigwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5yZW1vdmVBdHRyKCJ0aXRsZSIpfX0se2tleToiX2hhbmRsZVRleHRPdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLm5vZGUpaWYodGhpcy5zdGF0ZS51c2VDc3NUcnVuY2F0aW9uKXt2YXIgZT0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5fc2hvd1Rvb2x0aXAoZS50ZXh0T3ZlcmZsb3coKSl9ZWxzZSB0aGlzLl90cnVuY2F0ZU11bHRpTGluZVRleHQoKX19LHtrZXk6Il90cnVuY2F0ZU11bHRpTGluZVRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9Ii4uLiIsdD0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5zcGFuLmlubmVySFRNTD10aGlzLnN0YXRlLm9yaWdpbmFsVGV4dDt2YXIgbj0oMCxjWyJkZWZhdWx0Il0pKHRoaXMuc3BhbikuZGVjb2RlRW50aXRpZXMoKTt0aGlzLm5vZGUuc3R5bGUuZm9udFNpemU9dGhpcy5zdGF0ZS5mb250Lm1heEZvbnRQeCsicHgiO2Zvcih2YXIgcj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsbz10aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4LGk9ITEsYT0wO3I+dGhpcy5zdGF0ZS5mb250Lm1heExpbmVzfHx0LmNoaWxkcmVuT3ZlcmZsb3coKTspe2lmKG88PXRoaXMuc3RhdGUuZm9udC5taW5Gb250UHgpe2l8fChuKz1lLGk9ITApO3ZhciBzPW4ubGVuZ3RoO249bi5zdWJzdHIoMCxzLWUubGVuZ3RoLTEpK2UsdGhpcy5zcGFuLmlubmVySFRNTD1ufWVsc2Ugby0tLHRoaXMubm9kZS5zdHlsZS5mb250U2l6ZT1vKyJweCI7aWYocj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsYSsrLGE+ZilicmVha310aGlzLl9zaG93VG9vbHRpcChpKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9IlRleHRDb250YWluZXIiLGQucHJvcFR5cGVzPXt0ZXh0OnUuUHJvcFR5cGVzLnN0cmluZyxhZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGZvbnQ6dS5Qcm9wVHlwZXMub2JqZWN0LHRleHRJZDp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm5vZGU9dH1yZXR1cm4gcihlLFt7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGVbZV19fSx7a2V5OiJmaW5kIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwodCkpfX0se2tleToicGFyZW50Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLm5vZGUucGFyZW50Tm9kZSl9fSx7a2V5OiJjaGlsZHJlbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkcmVuKX19LHtrZXk6ImNzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm5vZGVbMF18fHRoaXMubm9kZSxyPW4uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLG89cj9yLnNwbGl0KCI7IikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCI6Iil9KTpbXSxpPXt9O28uZm9yRWFjaChmdW5jdGlvbihlKXtlWzBdJiYiIiE9PWVbMF0mJihpW2VbMF1dPWVbMV0pfSksaVtlXT10O3ZhciBhPSIiO3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ErPWUrIjoiK2lbZV0rIjsifSksbi5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKSx0aGlzfX0se2tleToiYXR0ciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQ/KHRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoZSx0KSx0aGlzLm5vZGUpOnRoaXMubm9kZS5nZXRBdHRyaWJ1dGUoZSl9fSx7a2V5OiJyZW1vdmVBdHRyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlLnJlbW92ZUF0dHJpYnV0ZShlKSx0aGlzLm5vZGV9fSx7a2V5OiJvdXRlckhlaWdodCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLm5vZGUub2Zmc2V0SGVpZ2h0O3JldHVybiBlJiYodD1nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSksbis9cGFyc2VJbnQodC5tYXJnaW5Ub3ApK3BhcnNlSW50KHQubWFyZ2luQm90dG9tKSksbn19LHtrZXk6Im91dGVyV2lkdGgiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5ub2RlLm9mZnNldFdpZHRoO3JldHVybiBlJiYodD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUpLApuKz13aW5kb3cucGFyc2VJbnQodC5tYXJnaW5MZWZ0LDEwKSt3aW5kb3cucGFyc2VJbnQodC5tYXJnaW5SaWdodCwxMCkpLG59fSx7a2V5OiJ0ZXh0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUudGV4dENvbnRlbnR8fHRoaXMubm9kZS5pbm5lckhUTUx8fCIifX0se2tleToiY2hpbGRyZW5PdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm91dGVyV2lkdGgoITApLG49MDtyZXR1cm4gdGhpcy5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24odCl7bis9bmV3IGUodCkub3V0ZXJXaWR0aCghMCl9KSwtMT50LW59fSx7a2V5OiJ0ZXh0T3ZlcmZsb3ciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0ZXJXaWR0aCghMCk8dGhpcy5ub2RlLnNjcm9sbFdpZHRofX0se2tleToiZGVjb2RlRW50aXRpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYodGhpcy5ub2RlLmlubmVySFRNTCl7dmFyIHQ9dGhpcy5ub2RlLmlubmVySFRNTDtyZXR1cm4gdD10LnJlcGxhY2UoLzxzY3JpcHRbXj5dKj4oW1xTXHNdKj8pPFwvc2NyaXB0Pi9naW0sIiIpLHQ9dC5yZXBsYWNlKC88XC8/XHcoPzpbXiInPl18IlteIl0qInwnW14nXSonKSo+L2dpbSwiIiksdD10LnJlcGxhY2UoL1x1MDBhMC9nLCIgIiksZS5pbm5lckhUTUw9dCx0PWUudGV4dENvbnRlbnR8fGUuaW5uZXJIVE1MfHwiIixlLnRleHRDb250ZW50PSIiLHR9cmV0dXJuIiJ9fV0pLGV9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbyhlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNyksYz1yKHApLGY9big3KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9InRleHRMaW5rIisodGhpcy5wcm9wcy5kaXNwbGF5QXNUZXh0PyIgdGV4dExpbmstLWRpc3BsYXlBc1RleHQiOiIiKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoZFsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6ZX19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Zm9udDp0aGlzLnByb3BzLmZvbnQsdGV4dDp0aGlzLnByb3BzLnRleHQsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSx0ZXh0SWQ6dGhpcy5wcm9wcy50ZXh0SWR9KSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInRleHRDb250YWluZXIiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZXh0TGluayIsaC5wcm9wVHlwZXM9e3RleHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLmlzUmVxdWlyZWQsZm9udDp1LlByb3BUeXBlcy5vYmplY3QsdGV4dElkOnUuUHJvcFR5cGVzLnN0cmluZyxkaXNwbGF5QXNUZXh0OnUuUHJvcFR5cGVzLmJvb2wsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDMzKSxjPXIocCksZj1uKDcpLGQ9cihmKSxoPW4oMzcpLHk9cihoKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0iYXNpbkltYWdlIjtyZXR1cm4gZSs9dGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQ/IiBhc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIsZSs9dGhpcy5wcm9wcy5kZXNjcmlwdGlvbj8iIGFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uIjoiIixsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7ImRhdGEtYXNpbiI6dGhpcy5wcm9wcy5hc2luLGNsYXNzTmFtZTplfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZTplfX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtwYXRoOnRoaXMucHJvcHMucGF0aCxhbHQ6dGhpcy5wcm9wcy5hbHQsc3ByaXRlOnRoaXMucHJvcHMuc3ByaXRlLGV4dGVuZENvbnRhaW5lckhlaWdodDp0aGlzLnByb3BzLmV4dGVuZENvbnRhaW5lckhlaWdodCx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxzeDp0aGlzLnByb3BzLnN4LHN5OnRoaXMucHJvcHMuc3kscWw6dGhpcy5wcm9wcy5xbCxyZXRpbmE6dGhpcy5wcm9wcy5yZXRpbmEsYWM6dGhpcy5wcm9wcy5hYyxtZXJnZVRhZ3M6dGhpcy5wcm9wcy5tZXJnZVRhZ3MsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pLHRoaXMucHJvcHMuZGVzY3JpcHRpb24mJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHlbImRlZmF1bHQiXSx7dGV4dDp0aGlzLnByb3BzLmRlc2NyaXB0aW9uLGZvbnQ6dGhpcy5wcm9wcy5kZXNjcmlwdGlvbkZvbnR9KSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIsImNsaWNrdGhyb3VnaExpbmsiLCJ0ZXh0Q29udGFpbmVyIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09bSxtLmRpc3BsYXlOYW1lPSJBc2luSW1hZ2UiLG0ucHJvcFR5cGVzPXtocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWx0OnUuUHJvcFR5cGVzLnN0cmluZyxzcHJpdGU6dS5Qcm9wVHlwZXMuYm9vbCxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxkZXNjcmlwdGlvbjp1LlByb3BUeXBlcy5zdHJpbmcsZGVzY3JpcHRpb25Gb250OnUuUHJvcFR5cGVzLm9iamVjdCx0aXRsZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LG9uTG9hZDp1LlByb3BUeXBlcy5mdW5jLGFzaW46dS5Qcm9wVHlwZXMuc3RyaW5nfSxtLmRlZmF1bHRQcm9wcz17YWM6ITAscmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0icHJpY2UiO2UrPXRoaXMucHJvcHMuaXNKdW1ibz8iIHByaWNlLS1qdW1ibyI6IiIsZSs9dGhpcy5wcm9wcy5pc0xpc3Q/IiBwcmljZS0tbGlzdCI6IiIsZSs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciB0PSIiO2lmKHRoaXMucHJvcHMuaXNKdW1ibyl7dmFyIG49dGhpcy5wcm9wcy5wcmljZUluZm8ud2hvbGVBbW91bnQscj10aGlzLnByb3BzLnByaWNlSW5mby5kZWNpbWFsUGFydDt0PWxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOmUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0ludGVnZXJBbW91bnQifSxuKSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCJ9LHIpKX1lbHNlIHQ9bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19hbW91bnQifSx0aGlzLnByb3BzLmFtb3VudCkpO3JldHVybiB0aGlzLnByb3BzLmhyZWYmJnRoaXMucHJvcHMuY2xpY2tVcmxzP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJwcmljZSJ9fSx0KTp0fX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iUHJpY2UiLGYucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjdXJyZW5jeTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxpc0p1bWJvOnUuUHJvcFR5cGVzLmJvb2wscHJpY2VJbmZvOnUuUHJvcFR5cGVzLm9iamVjdCxpc0xpc3Q6dS5Qcm9wVHlwZXMuYm9vbCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNSksYz1yKHApLGY9big0MyksZD1yKGYpLGg9big3KSx5PXIoaCksbT0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9wcmltZS0yeC0yMDE3MDYxNC5wbmciLGI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiZ2V0UHJpbWVMb2dvUGF0aCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGRbImRlZmF1bHQiXS5jb21waWxlKG0se21lZGlhOmV9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFByaW1lTG9nb1BhdGgodGhpcy5wcm9wcy5tZWRpYSksdD1sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3BhdGg6ZSx3aWR0aDoiNDMiLGhlaWdodDoiMTIiLGFsdDoiUHJpbWUiLGFkZGl0aW9uYWxDbGFzczoicHJpbWVMb2dvIixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSk7cmV0dXJuIHRoaXMucHJvcHMuaHJlZiYmdGhpcy5wcm9wcy5jbGlja1VybHM/bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoeVsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InByaW1lTG9nbyJ9fSx0KTp0fX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWIsYi5kaXNwbGF5TmFtZT0iUHJpbWVMb2dvIixiLnByb3BUeXBlcz17bWVkaWE6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKSxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtuKHRoaXMsZSl9cmV0dXJuIHIoZSxbe2tleToiY29tcGlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0Lmhhc093blByb3BlcnR5KG4pJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFwkeyIrbisifSIsImciKSx0W25dKSl9KSxlfX1dKSxlfSgpO2UuZXhwb3J0cz1uZXcgb30sLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzUpLGM9cihwKSxmPW4oNyksZD1yKGYpLGg9big0MykseT1yKGgpLG09bigzNiksYj1yKG0pLHY9big1OSksZz1uKDYxKSxfPSIvaW1hZ2VzL0cvJHttZWRpYX0vZGEvY3JlYXRpdmVzL2F1aS1taW5pLXNwcml0ZS0yMDE1LTAyLnBuZyIsUD0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9hdWktbWluaS1zcHJpdGUtMngtdjMucG5nIixrPXsiMS4wIjoiLTY0cHggMCIsMS41OiItMjE4cHggMCIsIjIuMCI6Ii00OHB4IDAiLDIuNToiLTIwMnB4IDAiLCIzLjAiOiItMzJweCAwIiwzLjU6Ii0xODZweCAwIiwiNC4wIjoiLTE2cHggMCIsNC41OiItMTcwcHggMCIsIjUuMCI6IjAgMCJ9LFQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtyZXRpbmE6ITF9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7KDAsYlsiZGVmYXVsdCJdKShmdW5jdGlvbih0KXtlLnNldFN0YXRlKHtyZXRpbmE6dH0pfSl9fSx7a2V5OiJnZXRTdGFyc1BhdGgiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHlbImRlZmF1bHQiXS5jb21waWxlKHQ/UDpfLHttZWRpYTplfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTdGFyc1BhdGgodGhpcy5wcm9wcy5tZWRpYSx0aGlzLnN0YXRlLnJldGluYSksdD0oMCxnLmdldFJvdW5kZWRTdGFyUmF0aW5nKSh0aGlzLnByb3BzLnJhdGluZyksbj1rW3RdLHI9e2JhY2tncm91bmRQb3NpdGlvbjpufTtyZXR1cm4gbiYmdGhpcy5wcm9wcy5jb3VudCYmdGhpcy5wcm9wcy5jb3VudD4wP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJzdGFyUmF0aW5nIn19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7cGF0aDplLHNwcml0ZTohMCxzdHlsZTpyLGFkZGl0aW9uYWxDbGFzczoic3RhclJhdGluZ19fc3RhcnMifSksdGhpcy5wcm9wcy5jb3VudCYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InN0YXJSYXRpbmdfX2NvdW50IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSwoMCx2LmZvcm1hdE51bWJlcikodGhpcy5wcm9wcy5jb3VudCwwLHRoaXMucHJvcHMubWFya2V0UGxhY2UpKSk6bnVsbH19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsibWVkaWFDZW50cmFsSW1hZ2UiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09VCxULmRpc3BsYXlOYW1lPSJTdGFyUmF0aW5nIixULnByb3BUeXBlcz17cmF0aW5nOnUuUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLGNvdW50OnUuUHJvcFR5cGVzLm51bWJlcixtZWRpYTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxtYXJrZXRQbGFjZTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dmFyIG89big2MCksaT1yKG8pLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsbj1hcmd1bWVudHNbMl0scj0iLiIsbz0iLCI7biYmL14oREV8RlJ8SVR8RVN8QlIpJC9pLnRlc3QobikmJihyPSIsIixvPSIuIik7dmFyIGk9MSplLGE9aS50b0ZpeGVkKHQpLHM9YS50b1N0cmluZygpLnNwbGl0KCIuIiksdT1zWzBdLGw9c1sxXSxwPXUucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyxvKTtyZXR1cm4gbD9wK3IrbDpwfTtlLmV4cG9ydHMuZm9ybWF0TnVtYmVyPWEsZS5leHBvcnRzLmZvcm1hdEN1cnJlbmN5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1zKGUsdCk7cmV0dXJuIG49ci5pc1RyYWlsaW5nU3ltYm9sP3IubnVtYmVyKyIgIityLnN5bWJvbDpyLnN5bWJvbCtyLm51bWJlcn07dmFyIHM9ZnVuY3Rpb24odCxuKXt2YXIgcj1pWyJkZWZhdWx0Il1bbl0sbz0vXihERXxGUnxJVHxFUykkL2kudGVzdChuKSxhPSJKUCI9PT1uLHM9ci5jdXJyZW5jeSx1PWUuZXhwb3J0cy5mb3JtYXROdW1iZXIodCxhPzA6MixuKTtyZXR1cm57c3ltYm9sOnMsbnVtYmVyOnUsaXNUcmFpbGluZ1N5bWJvbDpvfX07ZS5leHBvcnRzLmdldFByaWNlT2JqZWN0PXMsZS5leHBvcnRzLmZvcm1hdERhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIixyPSIiLG89IiIsYT0iIjtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBzPWUuc3BsaXQoIi0iKTtuPXNbMl0scj1zWzFdLG89aVsiZGVmYXVsdCJdW3RdLmxvY2FsZU1vbnRoc1tyLTFdLGE9c1swXX1lbHNlIG49ZS5nZXREYXRlKCksbz1pWyJkZWZhdWx0Il1bdF0ubG9jYWxlTW9udGhzW2UuZ2V0TW9udGgoKV0sYT1lLmdldEZ1bGxZZWFyKCk7dmFyIHU9dm9pZCAwO3N3aXRjaCh0KXtjYXNlIkZSIjpjYXNlIklUIjpjYXNlIkVTIjp1PW4rIiAiK28udG9Mb3dlckNhc2UoKSsiICIrYTticmVhaztjYXNlIkRFIjp1PW4rIi4gIitvKyIgIithO2JyZWFrO2Nhc2UiSlAiOnU9YSsi5bm0IityKyLmnIgiK24rIuaXpSI7YnJlYWs7ZGVmYXVsdDp1PW8rIiAiK24rIiwgIithfXJldHVybiB1fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtVUzp7c2VsZWN0aW9uTGFiZWw6IkVuZ2xpc2ggKFVTKSIscmVnaW9uOiJuYSIsY3VycmVuY3k6IiQiLGRvbWFpbjoiYW1hem9uLmNvbSIsbWVkaWE6IjAxIixtZXJjaGFudElkOiJBVFZQREtJS1gwREVSIixtYXJrZXRwbGFjZUlkOiJBVFZQREtJS1gwREVSIixsb2NhbGVNb250aHM6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LENBOntzZWxlY3Rpb25MYWJlbDoiRW5nbGlzaCAoQ0EpIixyZWdpb246Im5hIixjdXJyZW5jeToiQ0ROJCAiLGRvbWFpbjoiYW1hem9uLmNhIixtZWRpYToiMTUiLG1lcmNoYW50SWQ6IkEzRFdZSUs2WTlFRVFCIixtYXJrZXRwbGFjZUlkOiJBMkVVUTFXVEdDVEJHMiIsbG9jYWxlTW9udGhzOlsiSmFuIiwiRmViIiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVnIiwiU2VwdCIsIk9jdCIsIk5vdiIsIkRlYyJdfSxVSzp7c2VsZWN0aW9uTGFiZWw6IkVuZ2xpc2ggKFVLKSIscmVnaW9uOiJldSIsY3VycmVuY3k6IsKjIixkb21haW46ImFtYXpvbi5jby51ayIsbWVkaWE6IjAyIixtZXJjaGFudElkOiJBM1A1Uk9LTDVBMU9MRSIsbWFya2V0cGxhY2VJZDoiQTFGODNHOEMyQVJPN1AiLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX0sREU6e3NlbGVjdGlvbkxhYmVsOiJHZXJtYW4iLHJlZ2lvbjoiZXUiLGN1cnJlbmN5OiJFVVIgIixkb21haW46ImFtYXpvbi5kZSIsbWVkaWE6IjAzIixtZXJjaGFudElkOiJBM0pXS0FLUjhYQjdYRiIsbWFya2V0cGxhY2VJZDoiQTFQQTY3OTVVS01GUjkiLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk3DpHJ6IiwiQXByIiwiTWFpIiwiSnVuaSIsIkp1bGkiLCJBdWciLCJTZXB0IiwiT2t0IiwiTm92IiwiRGV6Il19LEZSOntzZWxlY3Rpb25MYWJlbDoiRnJlbmNoIixyZWdpb246ImV1IixjdXJyZW5jeToiRVVSICIsZG9tYWluOiJhbWF6b24uZnIiLG1lZGlhOiIwOCIsbWVyY2hhbnRJZDoiQTFYNkZLNVJESE5COTYiLG1hcmtldHBsYWNlSWQ6IkExM1YxSUIzVklZWlpIIixsb2NhbGVNb250aHM6WyJKYW4uIiwiRsOpdnIuIiwiTWFycyIsIkF2ci4iLCJNYWkiLCJKdWluIiwiSnVpbC4iLCJBb8O7dCIsIlNlcHQuIiwiT2N0LiIsIk5vdi4iLCJEw6ljLiJdfSxJVDp7c2VsZWN0aW9uTGFiZWw6Ikl0YWxpYW4iLHJlZ2lvbjoiZXUiLGN1cnJlbmN5OiJFVVIgIixkb21haW46ImFtYXpvbi5pdCIsbWVkaWE6IjI5IixtZXJjaGFudElkOiJBMTFJTDJQTldZSlU3SCIsbWFya2V0cGxhY2VJZDoiQVBKNkpSQTlORzVWNCIsbG9jYWxlTW9udGhzOlsiR2VuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFnIiwiR2l1IiwiTHVnIiwiQWdvIiwiU2V0IiwiT3R0IiwiTm92IiwiRGljIl19LEVTOntzZWxlY3Rpb25MYWJlbDoiU3BhbmlzaCIscmVnaW9uOiJldSIsY3VycmVuY3k6IkVVUiAiLGRvbWFpbjoiYW1hem9uLmVzIixtZWRpYToiMzAiLG1lcmNoYW50SWQ6IkExQVQ3WVZQRkJXWEJMIixtYXJrZXRwbGFjZUlkOiJBMVJLS1VQSUhDUzlIUyIsbG9jYWxlTW9udGhzOlsiRW5lIiwiRmViIiwiTWFyIiwiQWJyIiwiTWF5IiwiSnVuIiwiSnVsIiwiQWdvIiwiU2VwIiwiT2N0IiwiTm92IiwiRGljIl19LElOOntzZWxlY3Rpb25MYWJlbDoiRW5nbGlzaCAoSU4pIixyZWdpb246ImV1IixjdXJyZW5jeToi4oK5Iixkb21haW46ImFtYXpvbi5pbiIsbWVkaWE6IjMxIixtZXJjaGFudElkOiJBVDk1SUc5T05aRDdTIixtYXJrZXRwbGFjZUlkOiJBMjFUSlJVVU40S0dWIixsb2NhbGVNb250aHM6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LEpQOntzZWxlY3Rpb25MYWJlbDoiSmFwYW5lc2UiLHJlZ2lvbjoiZmUiLGN1cnJlbmN5OiLvv6UiLGRvbWFpbjoiYW1hem9uLmNvLmpwIixtZWRpYToiMDkiLG1lcmNoYW50SWQ6IkFOMVZSUUVORlJKTjUiLG1hcmtldHBsYWNlSWQ6IkExVkMzOFQ3WVhCNTI4Iix5ZWFyVGV4dDoiw6XCucK0IixkYXlUZXh0OiLDpuKAlMKlIixtb250aFRleHQ6IsOmxZPLhiIsbG9jYWxlTW9udGhzOlsiSmFuIiwiRmViIiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVnIiwiU2VwdCIsIk9jdCIsIk5vdiIsIkRlYyJdfSxDTjp7c2VsZWN0aW9uTGFiZWw6IiIscmVnaW9uOiJjbiIsY3VycmVuY3k6IsKlICIsZG9tYWluOiJhbWF6b24uY24iLG1lZGlhOiIyOCIsbWVyY2hhbnRJZDoiQTFBSjE5UFNCNjZUR1UiLG1hcmtldHBsYWNlSWQ6IkFBSEtWMlg3QUZZTFciLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX19fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIkFyZ3VtZW50IHJhd1N0YXJSYXRpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXIiKTtyZXR1cm4oTWF0aC5yb3VuZCgyKmUpLzIpLnRvRml4ZWQoMSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0Um91bmRlZFN0YXJSYXRpbmc9bn0sLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big0MSksYz1yKHApLGY9ITEsZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy50YXhNZXNzYWdlJiYiIiE9PXRoaXMucHJvcHMudGF4TWVzc2FnZTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlQm94IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSx0aGlzLnByb3BzLmxpc3RBbW91bnQmJmYmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7YW1vdW50OnRoaXMucHJvcHMubGlzdEFtb3VudCxjdXJyZW5jeTp0aGlzLnByb3BzLmN1cnJlbmN5LGlzTGlzdDohMCxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19saXN0IixzdHlsZTp0aGlzLnByb3BzLmxpc3RQcmljZVN0eWxlfSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHthbW91bnQ6dGhpcy5wcm9wcy5idXlBbW91bnQsY3VycmVuY3k6dGhpcy5wcm9wcy5jdXJyZW5jeSxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19idXkiLHN0eWxlOnRoaXMucHJvcHMuYnV5UHJpY2VTdHlsZX0pLGUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZUJveF9fdGF4TWVzc2FnZSJ9LHRoaXMucHJvcHMudGF4TWVzc2FnZSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmljZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iUHJpY2VCb3giLGQucHJvcFR5cGVzPXtidXlBbW91bnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsbGlzdEFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcsY3VycmVuY3k6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsdGF4TWVzc2FnZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGJ1eVByaWNlU3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGxpc3RQcmljZVN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdH19LCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big1KSxjPXIocCksZj1uKDI4KSxkPXIoZiksaD1uKDM4KSx5PXIoaCksbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe28odGhpcyx0KTt2YXIgbj1pKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc3RydWN0dXJlPW5ldyBkWyJkZWZhdWx0Il0obi5nZXRTdHJ1Y3R1cmVzKCkpLG4uaW5pdFN0cnVjdHVyZShlKSxuLmNvbXBvbmVudHNNYXA9bi5nZXRDb21wb25lbnRzTWFwKCksbi5kb21SZWZzPXt9LG4uc3RhdGU9e3Nob3dMaXN0UHJpY2U6ITB9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImluaXRTdHJ1Y3R1cmUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZm9ybWF0dGVkUHJpY2UmJiIiIT09ZS5mb3JtYXR0ZWRQcmljZSYmIWUuaXNEaWdpdGFsO3RoaXMuc3RydWN0dXJlLmhpZGVCbG9jaygicHJpY2VCb3giLCF0KTt2YXIgbj10JiZlLmlzUHJpbWU7aWYodGhpcy5zdHJ1Y3R1cmUuaGlkZUJsb2NrKCJwcmltZUxvZ28iLCFuKSwiSlAiPT09dGhpcy5wcm9wcy5tYXJrZXRQbGFjZSl7dmFyIHI9dGhpcy5zdHJ1Y3R1cmUuZ2V0Q29tcG9uZW50UHJvcCgiaGVhZGxpbmUiLCJzdHlsZSIpO3ImJihyLnZhbHVlLmZvbnRTdHlsZT0ibm9ybWFsIix0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInN0eWxlIixyLnZhbHVlLCJjb25zdGFudCIpKX1lLm1vYmlsZUhlYWRsaW5lJiZ0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInRleHQiLCJtb2JpbGVIZWFkbGluZSIsInBhdGgiKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZG9tUmVmcy5wcmljaW5nJiZ0aGlzLnNldFN0YXRlKHtzaG93TGlzdFByaWNlOiEoMCx5WyJkZWZhdWx0Il0pKHRoaXMuZG9tUmVmcy5wcmljaW5nKS5jaGlsZHJlbk92ZXJmbG93KCl9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0YXRlLnNob3dMaXN0UHJpY2U/dGhpcy5wcm9wcy5mb3JtYXR0ZWRMaXN0UHJpY2U6bnVsbDtyZXR1cm4gdGhpcy5zdHJ1Y3R1cmUuc2V0Q29tcG9uZW50UHJvcCgicHJpY2VCb3giLCJsaXN0QW1vdW50IixlLCJjb25zdGFudCIpLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Y2xhc3NOYW1lOiJtb2JpbGVSYXZlbiIscmVuZGVyaW5nQ29udGV4dDp0aGlzLnByb3BzLHN0cnVjdHVyZTp0aGlzLnN0cnVjdHVyZS5tb2RlbCxjb21wb25lbnRzTWFwOnRoaXMuY29tcG9uZW50c01hcCxkb21SZWZzOnRoaXMuZG9tUmVmcyx1cGRhdGVPblJlc2l6ZTohMH0pfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPW0sbS5URU1QTEFURV9JRD0ibW9iaWxlUmF2ZW4iLG0uZGlzcGxheU5hbWU9Ik1vYmlsZVJhdmVuIixtLnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPShyKHUpLG4oMTAzKSkscD1yKGwpLGM9bigxMDUpLGY9cihjKSxkPW4oMTA2KSxoPXIoZCkseT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRTdHJ1Y3R1cmVzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybigwLGZbImRlZmF1bHQiXSkoKX19LHtrZXk6ImdldENvbXBvbmVudHNNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuQ09NUE9ORU5UU19NQVB9fV0pLHR9KHBbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPXkseS5DT01QT05FTlRTX01BUD1oWyJkZWZhdWx0Il0seS5kaXNwbGF5TmFtZT0iTW9iaWxlUmF2ZW5Db250cm9sIix5LnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJue2lkOiIwIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEyNXB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjAiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsd2lkdGg6IjE2MHB4IixoZWlnaHQ6IjEwMCUiLHBhZGRpbmc6IjVweCAxMHB4IDVweCAxMHB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJhc2luSW1hZ2UiLHByb3BzOlt7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToicGF0aCIsdmFsdWU6ImFzaW5JbWFnZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJhbHQiLHZhbHVlOiJwcm9kdWN0VGl0bGUiLHR5cGU6InBhdGgifSx7bmFtZToic3giLHZhbHVlOjgwLHR5cGU6ImNvbnN0YW50In1dfSxzdHlsZTpbe25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgMTI1cHgifV19LHtpZDoiMC4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHdpZHRoOiIxMDAlIixwYWRkaW5nOiIwIDEwcHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMC4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAwIDVweCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJoZWFkbGluZSJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InRleHRMaW5rIixwcm9wczpbe25hbWU6ImZvbnQiLHZhbHVlOnttYXhMaW5lczoyLG1pbkZvbnRQeDoxNixtYXhGb250UHg6MTh9LHR5cGU6ImNvbnN0YW50In0se25hbWU6InRleHQiLHZhbHVlOiJoZWFkbGluZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMCx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA1cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoidGV4dExpbmsiLHByb3BzOlt7bmFtZToiZm9udCIsdmFsdWU6e21heExpbmVzOjEsbWluRm9udFB4OjEyLG1heEZvbnRQeDoxMn0sdHlwZToiY29uc3RhbnQifSx7bmFtZToidGV4dCIsdmFsdWU6InByb2R1Y3RUaXRsZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMiIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA0cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoic3RhclJhdGluZyIscHJvcHM6W3tuYW1lOiJyYXRpbmciLHZhbHVlOiJjdXN0b21lclJldmlld1N1bW1hcnkucmF0aW5nIix0eXBlOiJwYXRoIn0se25hbWU6ImNvdW50Iix2YWx1ZToiY3VzdG9tZXJSZXZpZXdTdW1tYXJ5LmNvdW50Iix0eXBlOiJwYXRoIn0se25hbWU6ImhyZWYiLHZhbHVlOiJyZXZpZXdMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7bmFtZToibWFya2V0UGxhY2UiLHZhbHVlOiJtYXJrZXRQbGFjZSIsdHlwZToicGF0aCJ9XX19LHtpZDoiMC4xLjAuMyIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljaW5nIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAuMy4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCA1cHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljZUJveCJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaWNlQm94Iixwcm9wczpbe25hbWU6ImJ1eUFtb3VudCIsdmFsdWU6ImZvcm1hdHRlZFByaWNlIix0eXBlOiJwYXRoIn0se25hbWU6Imxpc3RBbW91bnQiLHZhbHVlOiJmb3JtYXR0ZWRMaXN0UHJpY2UiLHR5cGU6InBhdGgifSx7bmFtZToiY3VycmVuY3kiLHZhbHVlOiJjdXJyZW5jeVN5bWJvbCIsdHlwZToicGF0aCJ9LHtuYW1lOiJ0YXhNZXNzYWdlIix2YWx1ZToiaTE4bi50YXhNZXNzYWdlIix0eXBlOiJwYXRoIn0se25hbWU6ImJ1eVByaWNlU3R5bGUiLHZhbHVlOntmb250U2l6ZToiMTVweCJ9LHR5cGU6ImNvbnN0YW50In0se25hbWU6Imxpc3RQcmljZVN0eWxlIix2YWx1ZTp7Zm9udFNpemU6IjEzcHgifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMy4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3cifSxtZXRhZGF0YTpbe25hbWU6InJlZiIsdmFsdWU6InByaW1lTG9nbyJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaW1lTG9nbyIscHJvcHM6W3tuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7c3R5bGU6e3dpZHRoOiIyOXB4IixoZWlnaHQ6IjEzcHgifX1dfSxzdHlsZTpbe25hbWU6Im92ZXJmbG93Iix2YWx1ZToidmlzaWJsZSJ9XX1dLGNzc0NsYXNzZXM6WyJibG9jay0taW5saW5lIiwiIl0sc3R5bGU6W3tuYW1lOiJ3aGl0ZVNwYWNlIix2YWx1ZToibm9ybWFsIn1dfV19LHtpZDoiMC4xLjEiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsbWFyZ2luOiIwIDEwcHggMCAxMHB4IixoZWlnaHQ6IjEyM3B4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxzdHlsZTpbe25hbWU6Im9wYWNpdHkiLHZhbHVlOiIwLjY0In0se25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgOXB4In1dLGNvbXBvbmVudDp7aWQ6Im1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyIixwcm9wczpbe25hbWU6InBhdGgiLHZhbHVlOiIvaW1hZ2VzL0cvMDEvQW1hem9uQnJhbmRTdG9yZXNQbGF0Zm9ybS9ibGFja19hcnJvdy5wbmciLHR5cGU6ImNvbnN0YW50In0se25hbWU6ImFsdCIsdmFsdWU6IkdyYXkgQXJyb3ciLHR5cGU6ImNvbnN0YW50In0se25hbWU6InJvbGUiLHZhbHVlOiJwcmVzZW50YXRpb24iLHR5cGU6ImNvbnN0YW50In1dfX1dLHN0eWxlOlt7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6IiNGRkZGRkYifV19XSxzdHlsZTpbe25hbWU6ImJvcmRlciIsdmFsdWU6IjFweCBzb2xpZCAjZGRkIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiIjRkZGRkZGIn1dfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDQwKSxpPXIobyksYT1uKDM5KSxzPXIoYSksdT1uKDU4KSxsPXIodSkscD1uKDc4KSxjPXIocCksZj1uKDQyKSxkPXIoZiksaD1uKDMzKSx5PXIoaCk7ZS5leHBvcnRzPXthc2luSW1hZ2U6aVsiZGVmYXVsdCJdLHRleHRMaW5rOnNbImRlZmF1bHQiXSxzdGFyUmF0aW5nOmxbImRlZmF1bHQiXSxwcmljZUJveDpjWyJkZWZhdWx0Il0scHJpbWVMb2dvOmRbImRlZmF1bHQiXSxtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lcjp5WyJkZWZhdWx0Il19fV0pOzt2YXIgJGFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkJykscmVuZGVyaW5nQ29udGV4dCA9IHsibWFya2V0UGxhY2UiOiJVUyIsImFkTGluayI6Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5QRWlwYWxtR3VUcG1ERnprS0RwVUlBQUFGaHBKa29aUUVBQUFHUUFXV3B6c1EvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8xNTA4NzY3NDgzP2FheGl0az1rSmJhLngyOVBwMHhFLktjb09lZlVBIiwicmV2aWV3TGluayI6Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5QRWlwYWxtR3VUcG1ERnprS0RwVUlBQUFGaHBKa29aUUVBQUFHUUFXV3B6c1EvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8xNTA4NzY3NDgzP2FheGl0az1rSmJhLngyOVBwMHhFLktjb09lZlVBI2N1c3RvbWVyUmV2aWV3cyIsImNyZWF0aXZlSWQiOiI2MTA1NTY1OTQwNzAxIiwiYWRJZCI6IjQ1MzMwNzc4MTA3MDEiLCJwcm9kdWN0VGl0bGUiOiJMZWFybiBTLlEuTC4gZnJvbSB0aGUgZXhwZXJ0cyBpbiB0aGUgcHJlbWllciBndWlkZSBmb3IgYmVnaW5uZXJzIiwiaGVhZGxpbmUiOiJUcm91YmxlIGxldmVyYWdpbmcgeW91ciBkYXRhPyIsImFzaW5JbWFnZSI6Imh0dHBzOi8vaW1hZ2VzLW5hLnNzbC1pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS81MVZ6U2RqcmlPTC5fQUNfU1IxMjgsMTQ1Xy5qcGciLCJ1bnNwcml0ZWRJbWFnZSI6Imh0dHBzOi8vaW1hZ2VzLW5hLnNzbC1pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS81MWt6Z1ZTLS1RTC5qcGciLCJjdXN0b21lclJldmlld1N1bW1hcnkiOnsicmF0aW5nIjo0LjMwMzc1NDg2NywiY291bnQiOjE1OCwiYXNpbiI6IjE1MDg3Njc0ODMifSwiYmFkZ2VJbmZvcm1hdGlvbk1hcCI6bnVsbCwiY3VycmVuY3lTeW1ib2wiOiIkIiwiZm9ybWF0dGVkTGlzdFByaWNlIjoiMTguOTkiLCJmb3JtYXR0ZWRQcmljZSI6IjE0Ljk5IiwicHJpY2VJbmZvIjp7Indob2xlQW1vdW50IjoiMTQiLCJkZWNpbWFsUGFydCI6Ijk5In0sInByaWNlRm9ybWF0dGluZ0ZsYWdzIjp7ImlzU3ltYm9sU3VwZXJzY3JpcHQiOnRydWUsInN5bWJvbFBvc2l0aW9uIjoicHJlZml4ZWQifSwicHJpY2VQZXJVbml0TWVzc2FnZSI6IiIsImlzUHJpbWUiOnRydWUsImlzRGlnaXRhbCI6ZmFsc2UsImkxOG4iOnsic2V0dGluZ3MiOnsic2VsZWN0aW9uTGFiZWwiOiJFbmdsaXNoIChVUykiLCJyZWdpb24iOiJuYSIsImN1cnJlbmN5IjoiJCIsImRvbWFpbiI6ImFtYXpvbi5jb20iLCJtZWRpYSI6IjAxIiwibWVyY2hhbnRJZCI6IkFUVlBES0lLWDBERVIiLCJtYXJrZXRwbGFjZUlkIjoiQVRWUERLSUtYMERFUiIsImxvY2FsZU1vbnRocyI6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LCJ0YXhNZXNzYWdlIjoiIiwic3BvbnNvcmVkQnkiOiJTcG9uc29yZWQgYnkiLCJzaG9wTm93IjoiU2hvcCBub3ciLCJiZXN0U2VsbGVyIjoiQmVzdCBTZWxsZXIiLCJuZXdSZWxlYXNlIjoiTmV3IFJlbGVhc2UiLCJiYWRnZUluIjoiaW4ifSwiY2xpY2tVcmxzIjpbImh0dHBzOi8vcy5hbWF6b24tYWRzeXN0ZW0uY29tL2l1Mz9kPWZvcmVzdGVyLWRpZCZleC1mY2g9NDE2NzMxNjEzJmV4LWZhcmdzPT9pJTNEYzhTS2xxV1lhNU9tWU1YT1FvT2xRZyUyNmFzaSUzRCUzQTAxMDFiMGRkOWU5ZWQ2ZTRkMTRlZTU5MmQxNDMwNzJjNTA1YTUzZTFlM2U3NmE2NTNhYjY2M2ZhMDEwZmVjOTkwMzg2JTI2Y2xpY2slM0QxJmNiPTE1MTg4ODQ5NTYzMjQiXSwiYnJhbmRMb2dvIjoiaW1hZ2VzL1MvYWJzLWltYWdlLXVwbG9hZC1uYS9lL2Ftcy9BVFZQREtJS1gwREVSLzRiNjIwZmVlNGRlNzZhNTQ0YzNhZDkzY2IxMDY4YTY5Lnc1MDAuaDQ3NC5fQ1IxMywwLDQ3NCw0NzRfU0wyODBfU1k4MF8uanBnIiwiYnJhbmROYW1lIjoiQ2x5ZGVCYW5rIE1lZGlhIExMQyIsInByb2R1Y3RJbWFnZSI6eyJ1cmwiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTFremdWUy0tUUwuanBnIiwiaGVpZ2h0Ijo1MDAsIndpZHRoIjo0MDZ9fTtpZiAoJGFkKSB7UmVhY3RET00ucmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlicmFyeS5kZWZhdWx0LCByZW5kZXJpbmdDb250ZXh0KSwgJGFkKTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS5hZGRWaWV3YWJpbGl0eUxpc3RlbmVyKCRhZCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYWRkQ3JlYXRpdmVDbGlja0xpc3RlbmVyKCRhZCk7fTwvc2NyaXB0PjwvYm9keT48L2h0bWw+PC9kaXY+&quot;,&quot;serverSideFetchAd&quot;:&quot;true&quot;,&quot;enableAdBlockerDetector&quot;:false,&quot;disableResizeFunc&quot;:true,&quot;fallbackStaticAdImgUrl&quot;:&quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;:&quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;:&quot;&quot;,&quot;advertisementTextOnTop&quot;:false,&quot;viewabilityStandards&quot;:[{&quot;p&quot;:0,&quot;t&quot;:0,&quot;def&quot;:&quot;amzn&quot;},{&quot;p&quot;:50,&quot;t&quot;:1,&quot;def&quot;:&quot;iab&quot;},{&quot;p&quot;:100,&quot;t&quot;:0,&quot;def&quot;:&quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;:&quot;&quot;,&quot;hostDomain&quot;:&quot;https://www.amazon.com&quot;,&quot;userAgent&quot;:&quot;Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1&quot;,&quot;userConnectionInfo&quot;:{&quot;mobileConnectionType&quot;:null,&quot;connectionType&quot;:&quot;unknown&quot;},&quot;isAUIAvailable&quot;:&quot;3.18.2-2018-02-15&quot;,&quot;cookie&quot;:&quot;x-wl-uid=1WXBZ0Gt/NIjrMrKToWzqEoShlkbJFxXqK7d7eruyBHba3bx516TjY5FSIvziQCA3Gv7b0MffkZo=; aws_lang=en; aws-target-static-id=1485170961612-541803; aws-target-data=%7B%22support%22%3A%221%22%7D; aws-ubid-main=159-7441294-4671144; s_fid=5D55736E4E81630C-2BCB156C67276537; s_ppv=0; skin=noskin; session-token=GwmX9b8ErPr+y9/X4tOnH2NlakyrEB6uH0ndiwOgxZNJpv9EDYAzzTicJ2VkazGtd0qeseZAEF59w+otDIc1tgsjaHDIM9Ap01XspZFijLZnp4ZTcVlOy46T9mnipC6w67Im+F234XhEskN4jEHIOPuWvdjG6KieF9B1qlWzyY48ryzuxbHISWDfjFuLTn78ggiBueWBLjjxz8lfGNtReOgss5mLTZOaDB+7SUFgVbom2aIFlXb26PZ1UZQ04Ri1; ubid-main=131-2393016-1049709; session-id=147-0816675-1753153; aws-target-visitor-id=1485170961617-283514.26_17; aws-mkto-trk=id%3A112-TZM-766%26token%3A_mch-aws.amazon.com-1515491028950-95143; aws-session-id=140-3318658-9277840; aws-session-id-time=2146211066l; regStatus=registered; s_sq=%5B%5BB%5D%5D; __utmv=194891197.%22Y2eilR%401E0eaUd1y4Jy478UIiZmNGbRRjXHrbQvpCaiuGPXLvdZpy4%3FkXZ79EsvP%22; __utmc=194891197; pN=7; s_pers=%20s_vnum%3D1942562894050%2526vn%253D3%7C1942562894050%3B%20s_invisit%3Dtrue%7C1517331617155%3B%20s_nr%3D1517329817167-Repeat%7C1525105817167%3B; s_sess=%20s_cc%3Dtrue%3B%20s_sq%3D%3B; appstore-devportal-locale=en_US; AMCVS_4A8581745834114C0A495E2B%40AdobeOrg=1; AMCV_4A8581745834114C0A495E2B%40AdobeOrg=-1891778711%7CMCIDTS%7C17571%7CMCMID%7C11904074407816115763545700786442573624%7CMCOPTOUT-1518131239s%7CNONE%7CMCAID%7C2D04D1058530F5A2-6000030420009E4A%7CvVersion%7C2.4.0; s_lv=1518124039358; s_cc=true; c_m=undefinedwww.google.deNatural%20Search; session-id-time=2082787201l; s_vn=1549660061459%26vn%3D6; aws-userInfo=%7B%22arn%22%3A%22arn%3Aaws%3Aiam%3A%3A672413603088%3Aroot%22%2C%22alias%22%3A%22%22%2C%22username%22%3A%22Maja%2520Komel%22%2C%22keybase%22%3A%22%22%2C%22issuer%22%3A%22https%3A%2F%2Fwww.amazon.com%2Fap%2Fsignin%22%7D; aws-session-token=\&quot;+9lzzvGeCuRd2h296LsZD8fsOUkTpImyWpsvgPeqP6CutmWSJYNaJPpgFNd+LARPtdTJSouC444Vz/2kOOuvF9e1ccFSXb+ZnGkBaHuTY1xRGvDGe8RnwwC3J1w69hhrBu4Y1iWUo75hDCoOFI+QpavGp9nOhCVlx6xYEsCN0Y8s3pp1r/MWFsfmhN5pdiyZO1Lzcoc4isZiiTZLPz0Cuu8WoxHyC7I4ldZm8oIyCgM=\&quot;; __utma=194891197.1735141489.1485170987.1517331742.1518295984.26; __utmz=194891197.1518295984.26.19.utmccn=(referral)|utmcsr=console.aws.amazon.com|utmcct=/cloud9/home|utmcmd=referral; s_dslv=1518296040762; s_nr=1518296040774-Repeat; lc-main=en_US; p2dPopoverID_147-0816675-1753153=1; csm-hit=s-NDW9PCFNDRXWFHQVWR24|1518884955868&quot;,&quot;aPageStart&quot;:1518884955597,&quot;adStartTime&quot;:1518884957486}" id="ape_detail_mobile-hero-quick-promo_mweb_iframe" src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/msf-1.15._V488131532_.html" scrolling="no" height="125px" width="100%" class="" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="true" allowfullscreen="" mozallowfullscreen="" webkitallowfullscreen="" data-arid="5ee18b81a5d64462b39540a5c7d61593" style="width: 1px; min-width: 100%; display: none !important;"></iframe></div></div><script>(function(){function a(d,e){if(window.addEventListener){window.addEventListener(d,e,false);}else{if(window.attachEvent){window.attachEvent("on"+d,e);}}}function c(d,e){if(window.removeEventListener){window.removeEventListener(d,e,false);}else{if(window.detachEvent){window.detachEvent("on"+d,e);}}}var b=function(){(function(){(function(j,n){j.sfLogErrors=j.sfLogErrors||false;var o=o||function(s,r){r=r||new Error(s);if(j.ue&&typeof ue.count=="function"){ue.count("adplacements:safeFrameError",1);}if(!j.sfLogErrors){return;}if(j.ueLogError){j.ueLogError(r,{logLevel:"ERROR",attribution:"APE-safeframe",message:s+" "});}else{if(typeof console!=="undefined"&&console.error){console.error(s,r);}}};function d(){return j.innerHeight||n.documentElement.clientHeight;}function g(){return j.innerWidth||n.documentElement.clientWidth;}function e(t,r,s){if(t>0){return(s>t);}else{return(r>0);}}var f=function(){return(Date.now?Date.now():new Date().getTime());};throttle=function(s,u,y){var r,w,z;var x=null;var v=0;if(!y){y={};}var t=function(){v=y.leading===false?0:f();x=null;z=s.apply(r,w);if(!x){r=w=null;}};return function(){var B=f();if(!v&&y.leading===false){v=B;}var A=u-(B-v);r=this;w=arguments;if(A<=0||A>u){if(x){clearTimeout(x);x=null;}v=B;z=s.apply(r,w);if(!x){r=w=null;}}else{if(!x&&y.trailing!==false){x=setTimeout(t,A);}}return z;};};function l(u,w,v,r){try{var t=n.getElementById(u).getBoundingClientRect();if(e(t.top,t.bottom,d())&&e(t.left,t.right,g())){if(typeof uet=="function"){uet("bb","adplacements:viewablelatency:"+w,{wb:1});if(v){uet("bb","adplacements:viewablelatency:"+v,{wb:1});}}if(typeof uex=="function"&&j.ue&&typeof ue.count=="function"){if(j.apeViewableLatencyTrackers[r].loaded){uex("ld","adplacements:viewablelatency:"+w,{wb:1});if(v){uex("ld","adplacements:viewablelatency:"+v,{wb:1});}ue.count("adplacements:htmlviewed:loaded:"+w,1);if(v){ue.count("adplacements:htmlviewed:loaded:"+v,1);}}ue.count("adplacements:htmlviewed:"+w,1);if(v){ue.count("adplacements:htmlviewed:"+v,1);}}j.apeViewableLatencyTrackers[r].viewed=true;if(j.apeViewableLatencyTrackers[r].tracker){c("scroll",j.apeViewableLatencyTrackers[r].tracker);c("resize",j.apeViewableLatencyTrackers[r].tracker);}}}catch(s){j.apeViewableLatencyTrackers[r].valid=false;}}try{j.apeViewableLatencyTrackers=j.apeViewableLatencyTrackers||{};var q="ape_detail_mobile-hero-quick-promo_mweb_placement";var p="detail_mobile-hero-quick-promo_mweb".replace(/\_/g,":");var h="";var i="5ee18b81a5d64462b39540a5c7d61593";j.apeViewableLatencyTrackers[i]=j.apeViewableLatencyTrackers[i]||{};j.apeViewableLatencyTrackers[i].valid=true;l(q,p,h,i);if(j.apeViewableLatencyTrackers[i].valid&&!j.apeViewableLatencyTrackers[i].viewed){j.apeViewableLatencyTrackers[i].tracker=throttle(function(){l(q,p,h,i);},20);a("scroll",j.apeViewableLatencyTrackers[i].tracker);a("resize",j.apeViewableLatencyTrackers[i].tracker);}}catch(k){if(j.apeViewableLatencyTrackers&&j.apeViewableLatencyTrackers["5ee18b81a5d64462b39540a5c7d61593"]){j.apeViewableLatencyTrackers["5ee18b81a5d64462b39540a5c7d61593"].valid=false;}o("Error initializing viewable latency instrumentation",k);}try{j["mobile-hero-quick-promo"]={};j["mobile-hero-quick-promo"].adStartTime=(new Date()).getTime();var m=j.DAsf||j.MAsf||null;if(m){m.loadAds();}else{m=n.createElement("script");m.type="text/javascript";m.async=true;m.setAttribute("crossorigin","anonymous");m.charset="utf-8";m.src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame";m.onerror=function(){o("Error loading SafeFrame library");};(n.getElementsByTagName("head")[0]||n.getElementsByTagName("body")[0]).appendChild(m);}}catch(k){o("Error appending MAsf library",k);}}(window,document));})();};b();})();</script>
</div><div class="aw-campaigns"></div><div class="aw-campaigns"></div><div id="sponsoredProducts_feature_div" data-feature-name="sponsoredProducts" data-template-name="sponsoredProducts" class="a-section a-spacing-none feature">
<div class="a-row a-spacing-large"> <h2 class="a-carousel-heading">Sponsored products related to this item</h2> <div id="sp_phone_detail" data-a-carousel-options="{&quot;initialSeenAsins&quot;:&quot;\&quot;B017P2WPTO\&quot;,\&quot;B0756BCF9D\&quot;,\&quot;B01IFQWTS6\&quot;&quot;,&quot;set_size&quot;:3,&quot;name&quot;:&quot;sp_phone_detail_carousel&quot;,&quot;show_partial_text&quot;:true,&quot;ajax&quot;:{&quot;params&quot;:{&quot;cc&quot;:3,&quot;wName&quot;:&quot;sp_phone_detail&quot;,&quot;referringSearchEngine&quot;:&quot;goog&quot;,&quot;searchTerms&quot;:&quot;&quot;,&quot;start&quot;:3,&quot;ASIN&quot;:&quot;B00AYQNR46&quot;,&quot;pRID&quot;:&quot;NDW9PCFNDRXWFHQVWR24&quot;},&quot;url&quot;:&quot;/gp/nemo/spd/handlers/spd-shov.html&quot;},&quot;carousel_class&quot;:&quot;mobile&quot;}" data-a-display-strategy="stretchyGoodness" data-a-transition-strategy="none" data-a-class="mobile" class="a-begin a-carousel-container a-carousel-display-stretchyGoodness a-carousel-transition-none sponsored-products-detail-mobile"><input autocomplete="on" type="hidden" class="a-carousel-firstvisibleitem"> <div class="a-row a-carousel-controls a-carousel-row"><div class="a-carousel-row-inner"><div class="a-carousel-col a-carousel-center"><div class="a-carousel-viewport" sponsored-products-carousel-initialized="true"><ol class="a-carousel" role="list" style="width: 485px;"> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_B017OAFR8I" data-asin="B017OAFR8I" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;adId=200002682705171&amp;adIndex=0" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;adId=200002682705171&amp;eventType=2&amp;adIndex=0"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&id=7762849283780754&widgetName=sp_phone_detail&adId=200002682705171&eventType=2&adIndex=0"); }); </script> <script> P.when('A', 'SponsoredProductsViewability').execute(function(A, SV) { SV.registerViewTrackingElement(A.$("#sp_phone_detail_B017OAFR8I"), "sp_phone_detail"); });</script> <a class="a-link-normal" target="_top" rel="noopener" title="C# For Beginners: The tactical guidebook - Learn CSharp by coding" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_0?ie=UTF8&amp;adId=A097594332WK88PXUDLI0&amp;qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2FB017OAFR8I%2Fref%3Dsspa_mw_detail_0%3Fpsc%3D1"> <div class="a-row"> <img alt="C# For Beginners: The tactical guidebook - Learn CSharp by coding" src="https://images-na.ssl-images-amazon.com/images/I/51eImdRQv+L._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>C# For Beginners: The ...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">11 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$22.21</span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_B0754HLHCC" data-asin="B0754HLHCC" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;adId=200003579659371&amp;adIndex=1" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;adId=200003579659371&amp;eventType=2&amp;adIndex=1"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&id=7762849283780754&widgetName=sp_phone_detail&adId=200003579659371&eventType=2&adIndex=1"); }); </script> <script> P.when('A', 'SponsoredProductsViewability').execute(function(A, SV) { SV.registerViewTrackingElement(A.$("#sp_phone_detail_B0754HLHCC"), "sp_phone_detail"); });</script> <a class="a-link-normal" target="_top" rel="noopener" title="ASP.NET Core 1.1 Web API For Beginners: How To Build a Web API" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_1?ie=UTF8&amp;adId=A035204918ROYNO44ZBBX&amp;qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2FB0754HLHCC%2Fref%3Dsspa_mw_detail_1%3Fpsc%3D1"> <div class="a-row"> <img alt="ASP.NET Core 1.1 Web API For Beginners: How To Build a Web API" src="https://images-na.ssl-images-amazon.com/images/I/51vkswxUafL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>ASP.NET Core 1.1 Web A...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-5"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">3 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$19.00</span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_B01IF63FIY" data-asin="B01IF63FIY" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;adId=200002701557571&amp;adIndex=2" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;adId=200002701557571&amp;eventType=2&amp;adIndex=2"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518884955&id=7762849283780754&widgetName=sp_phone_detail&adId=200002701557571&eventType=2&adIndex=2"); }); </script> <script> P.when('A', 'SponsoredProductsViewability').execute(function(A, SV) { SV.registerViewTrackingElement(A.$("#sp_phone_detail_B01IF63FIY"), "sp_phone_detail"); });</script> <a class="a-link-normal" target="_top" rel="noopener" title="ASP.NET MVC 5 - Building a Website with Visual Studio 2015 and C Sharp: The Tactical Guidebook" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_2?ie=UTF8&amp;adId=A09402082EQKNEA02B9XR&amp;qualifier=1518884955&amp;id=7762849283780754&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2FB01IF63FIY%2Fref%3Dsspa_mw_detail_2%3Fpsc%3D1"> <div class="a-row"> <img alt="ASP.NET MVC 5 - Building a Website with Visual Studio 2015 and C Sharp: The Tactical Guidebook" src="https://images-na.ssl-images-amazon.com/images/I/51ot8UgIMWL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>ASP.NET MVC 5 - Buildi...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">6 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$37.00</span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"><span class="a-spinner a-spinner-medium" style="width:122px;height:259px;"></span></li></ol></div></div></div></div> <span class="a-end aok-hidden"></span></div></div><script type="text/javascript"> P.when('SponsoredProductsViewability').execute(function(SV) { SV.registerAuiEvents(['ready', 'scroll', 'resize', 'orientationchange']); });</script>
</div><link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/31Xp%2Bd6S31L.css?AUIClients/Swiper_AUIBuild">
<script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/61BFFVGtFXL.js?AUIClients/Swiper_AUIBuild');
</script>
<a></a><script type="text/javascript">
setCSMReq('cf');
setCSMReq('cf');
</script><div id="p13n-m-mobile-purchase-sims-feature-1" class="celwidget" cel_widget_id="mobile-purchase-sims-feature-1">
<div id="sims-purchase" class="a-section a-spacing-large sims">
<h2 class="a-size-large a-spacing-base">Customers who bought this also bought</h2>
<div data-ajax-params="{&quot;auiDeviceType&quot;:&quot;mobile&quot;,&quot;featureId&quot;:&quot;SimilaritiesMobileCarousel&quot;,&quot;reftagPrefix&quot;:&quot;pd_aw_sim_351&quot;,&quot;productDetailsTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::ProductDetails::Phone::Base&quot;,&quot;widgetTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::List::Static::Phone&quot;,&quot;faceoutTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::Product::Phone::ListFaceout&quot;}" data-ajax-url="/gp/p13n-shared/faceout-partial" data-p13n-feature-metadata="{&quot;baseAsin&quot;:&quot;B00AYQNR46&quot;}" data-p13n-feature-name="pd_aw_sim_351" data-p13n-global="{&quot;auiDeviceType&quot;:&quot;mobile&quot;,&quot;marketplaceId&quot;:&quot;ATVPDKIKX0DER&quot;,&quot;requestId&quot;:&quot;NDW9PCFNDRXWFHQVWR24&quot;,&quot;marketplace&quot;:&quot;US&quot;,&quot;session&quot;:&quot;147-0816675-1753153&quot;}" class="a-section a-spacing-micro p13n-sc-static-list">
<div class="a-section p13n-sc-list-cells-container">
<ul class="a-unordered-list a-nostyle a-vertical p13n-sc-list-cells">
<li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sim_351_1&quot;,&quot;asin&quot;:&quot;B00AYQNR50&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL._SY200_QL15_.jpg" href="/gp/aw/d/B00AYQNR50/ref=pd_aw_sim_351_1?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=81x-u6F2zNL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement" src="https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg" data-fling-asin="B00AYQNR50" data-fling-refmarker="pd_aw_sim_351_1" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL.__BG0,0,0,0_FMpng_AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL.__BG0,0,0,0_FMpng_AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg&quot;:[200,200]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL._SY200_QL15_.jpg" href="/gp/aw/d/B00AYQNR50/ref=pd_aw_sim_351_1?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=81x-u6F2zNL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4-5"><span class="a-icon-alt">4.4 out of 5 stars</span></i>&nbsp;<span aria-label="45 reviews" class="a-size-small">45</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$18.26</span></span> </div>
</a>
</div>
</div></div>
</span></li><li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sim_351_2&quot;,&quot;asin&quot;:&quot;B00RW8XFUK&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL._SY200_QL15_.jpg" href="/gp/aw/d/B00RW8XFUK/ref=pd_aw_sim_351_2?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=91X6qtR1pyL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven More Languages in Seven Weeks: Languages That Are Shaping the Future" src="https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg" data-fling-asin="B00RW8XFUK" data-fling-refmarker="pd_aw_sim_351_2" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL.__BG0,0,0,0_FMpng_AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL.__BG0,0,0,0_FMpng_AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg&quot;:[200,200]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL._SY200_QL15_.jpg" href="/gp/aw/d/B00RW8XFUK/ref=pd_aw_sim_351_2?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=91X6qtR1pyL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven More Languages in Seven Weeks: Languages That Are Shaping the Future
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4"><span class="a-icon-alt">3.8 out of 5 stars</span></i>&nbsp;<span aria-label="7 reviews" class="a-size-small">7</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$27.11</span></span> </div>
</a>
</div>
</div></div>
</span></li><li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sim_351_3&quot;,&quot;asin&quot;:&quot;B00MH6EMN6&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/81YF9U5iJeL._SY200_QL15_.jpg" href="/gp/aw/d/B00MH6EMN6/ref=pd_aw_sim_351_3?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=81YF9U5iJeL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven Concurrency Models in Seven Weeks: When Threads Unravel (The Pragmatic Programmers)" src="https://images-na.ssl-images-amazon.com/images/I/81YF9U5iJeL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg" data-fling-asin="B00MH6EMN6" data-fling-refmarker="pd_aw_sim_351_3" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/81YF9U5iJeL.__BG0,0,0,0_FMpng_AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/81YF9U5iJeL.__BG0,0,0,0_FMpng_AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/81YF9U5iJeL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg&quot;:[200,200]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/81YF9U5iJeL._SY200_QL15_.jpg" href="/gp/aw/d/B00MH6EMN6/ref=pd_aw_sim_351_3?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=81YF9U5iJeL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven Concurrency Models in Seven Weeks: When Threads Unravel (The Pragmatic Programmers)
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4-5"><span class="a-icon-alt">4.3 out of 5 stars</span></i>&nbsp;<span aria-label="26 reviews" class="a-size-small">26</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$18.66</span></span> </div>
</a>
</div>
</div></div>
</span></li>
</ul>
</div>
<div class="a-section p13n-sc-static-list-buttons">
<a href="/gp/p13n-mobile/overflow?ie=UTF8&amp;asins=B00AYQNR50%2CB00RW8XFUK%2CB00MH6EMN6%2CB01EX49FOU%2CB001GSTOAM%2CB003GCTQAE%2CB06XPJML5D%2CB078H61SCH%2CB00PKTGLWM%2CB0785Q7GSY%2CB01N48GFCQ%2CB075YQP38X%2CB00JDMPOK2%2CB0731JG96F%2CB008OHVDFM%2CB00B8139Z8%2CB0184N7WWS%2CB06XNKV5TS%2CB01JJSGE5S%2CB000SEIBB8%2CB00JDMPOSY%2CB0773PZ6HQ%2CB007WTFWJ6%2CB00ACC2536%2CB0170Q50LK%2CB0050JLC9Y%2CB00T3N7XB4%2CB003YMNVC0%2CB075LRM681%2CB01N2JT3ST%2CB071NVDFD6%2CB00I800FE0%2CB00PGCMGDQ%2CB00A32NYYE%2CB074D5YF1D%2CB007CNRCAO%2CB004VB3V0K%2CB01EER4Z4G%2CB06XFCP51L%2CB00KPTEH8C%2CB01GU387MS%2CB075RR1XVG%2CB007MQLL4E%2CB01M01YDQA%2CB008SGNJOW%2CB00LRROTI4%2CB0026OR2NQ%2CB01N1TTJFK%2CB00AYQNR5U%2CB01MQSM39Z%2CB073CPP581%2CB018UXJ9RI%2CB00BX1DX9U%2CB01M9ASFQ3%2CB019YLYLWI%2CB06VXKBLNG%2CB00W4DTP2A%2CB00JDMPMOA%2CB0026OR2ZY%2CB01N67AVPD%2CB005OYHF0A%2CB00CPSIQ7O%2CB01FL4BGOI%2CB018T6ZVPK%2CB00AA36RZY%2CB071K7FCD4%2CB006X2QEQS%2CB00794TAUG%2CB016JOMAEE%2CB005RZB65Q%2CB013UWFM52%2CB01JGMEA3U%2CB004IK8PLE%2CB00KN6XZ1M%2CB01FRIOYEC%2CB002EF2AQ6%2CB0131L3PW4%2CB01BJ4V66M%2CB073X6GNJ1%2CB01NAJAEN5%2CB00G3L19ZU%2CB01MRVFGX4%2CB01IO2VKGS%2CB01GP0Y5XQ%2CB00HU50A12%2CB009ZUZ9FW%2CB004OEJO0A%2CB00HJUBRPG%2CB01DAWQKWG%2CB0026OR2WM%2CB071JXYDDB%2CB013PNU6VQ%2CB01L2VFPZA%2CB00TKGY0GU%2CB01NCIA2KS%2CB00APSZCEQ%2CB01F749SF6&amp;baseAsin=B00AYQNR46&amp;faceoutTemplateClass=PI%3A%3AP13N%3A%3AViewTemplates%3A%3AProduct%3A%3APhone%3A%3AListFaceout&amp;parentFeatureID=SimilaritiesMobileCarousel&amp;productDetailsTemplateClass=PI%3A%3AP13N%3A%3AViewTemplates%3A%3AProductDetails%3A%3APhone%3A%3ABase&amp;ref=pd_aw_sim_351_l_of&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;reftagPrefix=pd_aw_sim_351&amp;title=Customers%20who%20bought%20this%20also%20bought" class="a-touch-link a-box"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>Show all 97 items</div></a>
</div>
</div>
</div>
</div><div class="aw-campaigns"><script>if (typeof uet === 'function' && typeof ues === 'function') {var scope = 'detail_btf_detail-mWeb';var placementId = '';ues('wb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); uet('bb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); if (placementId) {ues('wb', 'adplacements:' + placementId, {wb:1});uet('bb', 'adplacements:' + placementId, {wb:1});}}</script> <style>@media screen and (max-width:240px){ div[id$=detail_btf_detail-mWeb_wrapper]{ width:auto !important;margin-left:auto !important;left:auto !important} div[id$=detail_btf_detail-mWeb_text-wrapper]{ width:auto !important;margin-left:auto !important;left:auto !important}}@media screen and (orientation:landscape){ [id$=detail_btf_detail-mWeb_wrapper]{ max-width:414px !important;margin:auto !important} [id$=detail_btf_detail-mWeb_text-wrapper]{ max-width:414px !important;margin:auto !important}}</style> <div id="ape_detail_btf_detail-mWeb_wrapper" class="celwidget text/x-dacx-safeframe" style="position:relative; text-align:center; margin-left: -14px; margin-right: -14px; margin-top: 20px; height: 125px; overflow: hidden;" data-ad-details="{&quot;slot&quot; :&quot;detail_btf_detail-mWeb&quot;,&quot;pageType&quot;: &quot;detail&quot;,&quot;subPageType&quot;: &quot;detail-mWeb&quot;,&quot;slotName&quot; :&quot;btf&quot;,&quot;src&quot; : &quot;prefetchEnabled&quot;,&quot;adServer&quot; :&quot;cs&quot;,&quot;campaignId&quot; : &quot;9044&quot;,&quot;arid&quot; :&quot;5ba26b6b37fd4f0697e89fb00a56fc9d&quot;, &quot;size&quot; :{&quot;width&quot; : &quot;100%&quot;,&quot;height&quot; : &quot;125px&quot;},&quot;maxAdWidth&quot;: &quot;&quot;,&quot;allowedSizes&quot; :[{&quot;width&quot;:&quot;414px&quot;,&quot;height&quot;:&quot;125px&quot;}, {&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;}],&quot;allowedDomains&quot; : [],&quot;loadAfter&quot; : &quot;windowOnLoad&quot;,&quot;extraDelay&quot; : 0,&quot;iframeExtraStyle&quot;: &quot;width: 1px; min-width: 100%;&quot;,&quot;iframeClass&quot;: &quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;: true,&quot;adLabelWrapperId&quot;: &quot;ape_detail_btf_detail-mWeb_text-wrapper&quot;,&quot;adLabelId&quot;: &quot;ape_detail_btf_detail-mWeb_text&quot;,&quot;advTextWrapperDivStyle&quot;: &quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;: &quot;font-size: 10px; color: #555; text-align: right; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;: &quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfdGV4dC13cmFwcGVyIiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7IHRleHQtYWxpZ246Y2VudGVyOyBtYXJnaW4tbGVmdDogLTE0cHg7IG1hcmdpbi1yaWdodDogLTE0cHg7IGhlaWdodDogYXV0bzsiICA+PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfdGV4dCIgc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsgY29sb3I6ICM1NTU7IHRleHQtYWxpZ246IHJpZ2h0OyBtYXJnaW46IDBweCAzcHggNnB4IDA7IiAgPkFkdmVydGlzZW1lbnQ8L2Rpdj48L2Rpdj4=&quot;,&quot;adPixels&quot;: [],&quot;adPixelDelay&quot;: &quot;0&quot;,&quot;aaxImpPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/e/loi/imp?b=QkDqqNQSWyYWNK-gJZTTWvkAAAFhpJkqSAEAAAGQAW-4TTg&quot;,&quot;aaxInstrPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/x/px/QkDqqNQSWyYWNK-gJZTTWvkAAAFhpJkqSAEAAAGQAW-4TTg/&quot;,&quot;htmlContent&quot;: &quot;&quot;,&quot;htmlContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfY3JlYXRpdmVXcmFwcGVyIiAgID48IWRvY3R5cGUgaHRtbD48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PVVURi04Pjx0aXRsZT48L3RpdGxlPjxzdHlsZT5odG1se2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MS4xNTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXA6b2JqZWN0c31hOmFjdGl2ZSxhOmhvdmVye291dGxpbmUtd2lkdGg6MH1pbWd7Ym9yZGVyLXN0eWxlOm5vbmV9Kiw6YWZ0ZXIsOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3h9aHRtbHtvdmVyZmxvdzpoaWRkZW47Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhIE5ldWUsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6IzExMTtmb250LXNpemU6MTRweH1he2NvbG9yOiMwMDY2YzA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2NvbG9yOiNjNDU1MDB9I2Fkey13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlfS5ibG9ja3tkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW59LmJsb2NrOmVtcHR5e2Rpc3BsYXk6bm9uZX0uYmxvY2stLWp1c3RpZnktY2VudGVyey13ZWJraXQtanVzdGlmeS1jb250ZW50OmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5ibG9jay0tanVzdGlmeS1mbGV4LWVuZHstd2Via2l0LWp1c3RpZnktY29udGVudDpmbGV4LWVuZDstbXMtZmxleC1wYWNrOmVuZDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmJsb2NrLS1hbGlnbi1mbGV4LXN0YXJ0ey13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1zdGFydDstbXMtZmxleC1hbGlnbjpzdGFydDstbXMtZ3JpZC1yb3ctYWxpZ246ZmxleC1zdGFydDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5ibG9jay0tYWxpZ24tY2VudGVyey13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjstbXMtZ3JpZC1yb3ctYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0uYmxvY2stLWFsaWduLWZsZXgtZW5key13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1lbmQ7LW1zLWZsZXgtYWxpZ246ZW5kOy1tcy1ncmlkLXJvdy1hbGlnbjpmbGV4LWVuZDthbGlnbi1pdGVtczpmbGV4LWVuZH0uYmxvY2stLWRpcmVjdGlvbi1jb2x1bW57LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmJsb2NrLS1iYWNrZ3JvdW5kLC5ibG9jay0tYmFja2dyb3VuZD4uYmxvY2t7cG9zaXRpb246cmVsYXRpdmV9LmJsb2NrX19iYWNrZ3JvdW5ke3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5ibG9jay0tbG9ja3std2Via2l0LWZsZXgtZ3JvdzowOy1tcy1mbGV4LXBvc2l0aXZlOjA7ZmxleC1ncm93OjA7LXdlYmtpdC1mbGV4LXNocmluazowOy1tcy1mbGV4LW5lZ2F0aXZlOjA7ZmxleC1zaHJpbms6MH0uYmxvY2stLWlubGluZTpub3QoOmVtcHR5KXtkaXNwbGF5OmJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDtmb250LXNpemU6MH0uYmxvY2stLWlubGluZTpub3QoOmVtcHR5KT4uYmxvY2s6bm90KDplbXB0eSl7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZToxNHB4fS5oLW5vRmxleGJveCAuYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1jZW50ZXI+LmJsb2Nre3RleHQtYWxpZ246bGVmdH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1qdXN0aWZ5LWZsZXgtZW5ke3RleHQtYWxpZ246cmlnaHR9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1mbGV4LWVuZD4uYmxvY2t7dGV4dC1hbGlnbjpsZWZ0fS5oLW5vRmxleGJveCAuYmxvY2stLWFsaWduLWZsZXgtc3RhcnQ+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOnRvcH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1jZW50ZXI+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1mbGV4LWVuZD4uYmxvY2t7dmVydGljYWwtYWxpZ246Ym90dG9tfS5oLW5vRmxleGJveCAuYmxvY2stLWRpcmVjdGlvbi1jb2x1bW4+LmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmgtY2xvYWt7dmlzaWJpbGl0eTpoaWRkZW4haW1wb3J0YW50fS5oLWVsbGlwc2lze292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uYXNpbkltYWdle2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uYXNpbkltYWdlLS1leHRlbmRDb250YWluZXJIZWlnaHR7aGVpZ2h0OmF1dG99LmFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0Pi5pbWFnZUNvbnRhaW5lcntoZWlnaHQ6MTAwJX0uYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb257ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uPi5pbWFnZUNvbnRhaW5lcnttYXJnaW4tYm90dG9tOjVweH0uYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb24+LnRleHRDb250YWluZXJ7bWluLWhlaWdodDoxNXB4O3RleHQtYWxpZ246Y2VudGVyfS5pbWFnZUNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2JvdHRvbTowO3JpZ2h0OjA7bWFyZ2luOmF1dG87d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmltYWdlQ29udGFpbmVyLS1sZWZ0e2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmltYWdlQ29udGFpbmVyLS1sZWZ0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7cG9zaXRpb246c3RhdGljO21hcmdpbjowfS5pbWFnZUNvbnRhaW5lci0tcmlnaHQ+LmltYWdlQ29udGFpbmVyX19pbWFnZXttYXJnaW46MDtsZWZ0OmF1dG87Ym90dG9tOmF1dG87dG9wOmF1dG99LmltYWdlQ29udGFpbmVyLS1leHRlbmRDb250YWluZXJIZWlnaHR7aGVpZ2h0OmF1dG99LmltYWdlQ29udGFpbmVyLS1leHRlbmRDb250YWluZXJIZWlnaHQ+LmltYWdlQ29udGFpbmVyX19pbWFnZXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MCBhdXRvfS50ZXh0TGlua3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9LnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0e2NvbG9yOiMxMTF9LnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0OmhvdmVye2NvbG9yOiMxMTE7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnNreSAudGV4dExpbmt7Zm9udC13ZWlnaHQ6NjAwfS5za3kgLnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0LC5za3kgLnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0OmhvdmVye2NvbG9yOiMwMDJmMzZ9LnByaWNlQm94X19saXN0e21hcmdpbi1yaWdodDo0cHh9LnByaWNlQm94X190YXhNZXNzYWdle21hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTFweH0ucHJpY2V7Y29sb3I6I2IxMjcwNH0ucHJpY2UtLWxpc3R7Y29sb3I6IzU1NTt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdofS5wcmljZS0tanVtYm97Zm9udC1zaXplOjNlbX0ucHJpY2VfX2p1bWJvQ3VycmVuY3ksLnByaWNlX19qdW1ib0RlY2ltYWxBbW91bnQsLnByaWNlX19qdW1ib0ludGVnZXJBbW91bnR7dmVydGljYWwtYWxpZ246dG9wO2ZvbnQtd2VpZ2h0OjUwMH0ucHJpY2VfX2p1bWJvQ3VycmVuY3ksLnByaWNlX19qdW1ib0RlY2ltYWxBbW91bnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOi40ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgzNSUpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgzNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7Zm9udC13ZWlnaHQ6NzAwfS5wcmljZV9fanVtYm9JbnRlZ2VyQW1vdW50e2xldHRlci1zcGFjaW5nOi0uNXB4fS5za3kgLnByaWNle2NvbG9yOiNiMTI3MDR9LnByaW1lTG9nb3ttYXJnaW4tdG9wOjJweH0udGVtcGxhdGVDb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmV9LnRlbXBsYXRlQ29udGFpbmVyX19saW5re3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5OjB9LmNsaWNrdGhyb3VnaExpbms6bm90KC50ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayl7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfTwvc3R5bGU+PHNjcmlwdD52YXIgbW9kZXJuaXpyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4obyl7aWYodFtvXSlyZXR1cm4gdFtvXS5leHBvcnRzO3ZhciByPXRbb109e2V4cG9ydHM6e30saWQ6byxsb2FkZWQ6ITF9O3JldHVybiBlW29dLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubG9hZGVkPSEwLHIuZXhwb3J0c312YXIgdD17fTtyZXR1cm4gbi5tPWUsbi5jPXQsbi5wPSIiLG4oMCl9KHswOmZ1bmN0aW9uKGUsbix0KXtlLmV4cG9ydHM9dCgyMCl9LDIwOmZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiO3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfTshZnVuY3Rpb24oZSxuLG8pe2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOnQoZSkpPT09bn1mdW5jdGlvbiBzKCl7dmFyIGUsbix0LG8scyxpLGw7Zm9yKHZhciBmIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShmKSl7aWYoZT1bXSxuPWJbZl0sbi5uYW1lJiYoZS5wdXNoKG4ubmFtZS50b0xvd2VyQ2FzZSgpKSxuLm9wdGlvbnMmJm4ub3B0aW9ucy5hbGlhc2VzJiZuLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGgpKWZvcih0PTA7dDxuLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGg7dCsrKWUucHVzaChuLm9wdGlvbnMuYWxpYXNlc1t0XS50b0xvd2VyQ2FzZSgpKTtmb3Iobz1yKG4uZm4sImZ1bmN0aW9uIik/bi5mbigpOm4uZm4scz0wO3M8ZS5sZW5ndGg7cysrKWk9ZVtzXSxsPWkuc3BsaXQoIi4iKSwxPT09bC5sZW5ndGg/d1tsWzBdXT1vOighd1tsWzBdXXx8d1tsWzBdXWluc3RhbmNlb2YgQm9vbGVhbnx8KHdbbFswXV09bmV3IEJvb2xlYW4od1tsWzBdXSkpLHdbbFswXV1bbFsxXV09byksZy5wdXNoKChvPyIiOiJuby0iKStsLmpvaW4oIi0iKSl9fWZ1bmN0aW9uIGkoZSl7dmFyIG49Uy5jbGFzc05hbWUsdD13Ll9jb25maWcuY2xhc3NQcmVmaXh8fCIiO2lmKF8mJihuPW4uYmFzZVZhbCksdy5fY29uZmlnLmVuYWJsZUpTQ2xhc3Mpe3ZhciBvPW5ldyBSZWdFeHAoIihefFxccykiK3QrIm5vLWpzKFxcc3wkKSIpO249bi5yZXBsYWNlKG8sIiQxIit0KyJqcyQyIil9dy5fY29uZmlnLmVuYWJsZUNsYXNzZXMmJihuKz0iICIrdCtlLmpvaW4oIiAiK3QpLF8/Uy5jbGFzc05hbWUuYmFzZVZhbD1uOlMuY2xhc3NOYW1lPW4pfWZ1bmN0aW9uIGwoZSxuKXtyZXR1cm4hIX4oIiIrZSkuaW5kZXhPZihuKX1mdW5jdGlvbiBmKCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIG4uY3JlYXRlRWxlbWVudD9uLmNyZWF0ZUVsZW1lbnQoYXJndW1lbnRzWzBdKTpfP24uY3JlYXRlRWxlbWVudE5TLmNhbGwobiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGFyZ3VtZW50c1swXSk6bi5jcmVhdGVFbGVtZW50LmFwcGx5KG4sYXJndW1lbnRzKX1mdW5jdGlvbiBhKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbYS16XSktKFthLXpdKS9nLGZ1bmN0aW9uKGUsbix0KXtyZXR1cm4gbit0LnRvVXBwZXJDYXNlKCl9KS5yZXBsYWNlKC9eLS8sIiIpfWZ1bmN0aW9uIHUoZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShuLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHAoZSxuLHQpe3ZhciBvO2Zvcih2YXIgcyBpbiBlKWlmKGVbc11pbiBuKXJldHVybiB0PT09ITE/ZVtzXToobz1uW2Vbc11dLHIobywiZnVuY3Rpb24iKT91KG8sdHx8bik6byk7cmV0dXJuITF9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZS5yZXBsYWNlKC8oW0EtWl0pL2csZnVuY3Rpb24oZSxuKXtyZXR1cm4iLSIrbi50b0xvd2VyQ2FzZSgpfSkucmVwbGFjZSgvXm1zLS8sIi1tcy0iKX1mdW5jdGlvbiBjKCl7dmFyIGU9bi5ib2R5O3JldHVybiBlfHwoZT1mKF8/InN2ZyI6ImJvZHkiKSxlLmZha2U9ITApLGV9ZnVuY3Rpb24gbShlLHQsbyxyKXt2YXIgcyxpLGwsYSx1PSJtb2Rlcm5penIiLHA9ZigiZGl2IiksZD1jKCk7aWYocGFyc2VJbnQobywxMCkpZm9yKDtvLS07KWw9ZigiZGl2IiksbC5pZD1yP3Jbb106dSsobysxKSxwLmFwcGVuZENoaWxkKGwpO3JldHVybiBzPWYoInN0eWxlIikscy50eXBlPSJ0ZXh0L2NzcyIscy5pZD0icyIrdSwoZC5mYWtlP2Q6cCkuYXBwZW5kQ2hpbGQocyksZC5hcHBlbmRDaGlsZChwKSxzLnN0eWxlU2hlZXQ/cy5zdHlsZVNoZWV0LmNzc1RleHQ9ZTpzLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoZSkpLHAuaWQ9dSxkLmZha2UmJihkLnN0eWxlLmJhY2tncm91bmQ9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixhPVMuc3R5bGUub3ZlcmZsb3csUy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixTLmFwcGVuZENoaWxkKGQpKSxpPXQocCxlKSxkLmZha2U/KGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxTLnN0eWxlLm92ZXJmbG93PWEsUy5vZmZzZXRIZWlnaHQpOnAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKSwhIWl9ZnVuY3Rpb24geShuLHQpe3ZhciByPW4ubGVuZ3RoO2lmKCJDU1MiaW4gZSYmInN1cHBvcnRzImluIGUuQ1NTKXtmb3IoO3ItLTspaWYoZS5DU1Muc3VwcG9ydHMoZChuW3JdKSx0KSlyZXR1cm4hMDtyZXR1cm4hMX1pZigiQ1NTU3VwcG9ydHNSdWxlImluIGUpe2Zvcih2YXIgcz1bXTtyLS07KXMucHVzaCgiKCIrZChuW3JdKSsiOiIrdCsiKSIpO3JldHVybiBzPXMuam9pbigiIG9yICIpLG0oIkBzdXBwb3J0cyAoIitzKyIpIHsgI21vZGVybml6ciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfSB9IixmdW5jdGlvbihlKXtyZXR1cm4iYWJzb2x1dGUiPT1nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCkucG9zaXRpb259KX1yZXR1cm4gb31mdW5jdGlvbiB2KGUsbix0LHMpe2Z1bmN0aW9uIGkoKXtwJiYoZGVsZXRlIE4uc3R5bGUsZGVsZXRlIE4ubW9kRWxlbSl9aWYocz1yKHMsInVuZGVmaW5lZCIpPyExOnMsIXIodCwidW5kZWZpbmVkIikpe3ZhciB1PXkoZSx0KTtpZighcih1LCJ1bmRlZmluZWQiKSlyZXR1cm4gdX1mb3IodmFyIHAsZCxjLG0sdixoPVsibW9kZXJuaXpyIiwidHNwYW4iLCJzYW1wIl07IU4uc3R5bGUmJmgubGVuZ3RoOylwPSEwLE4ubW9kRWxlbT1mKGguc2hpZnQoKSksTi5zdHlsZT1OLm1vZEVsZW0uc3R5bGU7Zm9yKGM9ZS5sZW5ndGgsZD0wO2M+ZDtkKyspaWYobT1lW2RdLHY9Ti5zdHlsZVttXSxsKG0sIi0iKSYmKG09YShtKSksTi5zdHlsZVttXSE9PW8pe2lmKHN8fHIodCwidW5kZWZpbmVkIikpcmV0dXJuIGkoKSwicGZ4Ij09bj9tOiEwO3RyeXtOLnN0eWxlW21dPXR9Y2F0Y2goeCl7fWlmKE4uc3R5bGVbbV0hPXYpcmV0dXJuIGkoKSwicGZ4Ij09bj9tOiEwfXJldHVybiBpKCksITF9ZnVuY3Rpb24gaChlLG4sdCxvLHMpe3ZhciBpPWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxsPShlKyIgIitULmpvaW4oaSsiICIpK2kpLnNwbGl0KCIgIik7cmV0dXJuIHIobiwic3RyaW5nIil8fHIobiwidW5kZWZpbmVkIik/dihsLG4sbyxzKToobD0oZSsiICIrei5qb2luKGkrIiAiKStpKS5zcGxpdCgiICIpLHAobCxuLHQpKX1mdW5jdGlvbiB4KGUsbix0KXtyZXR1cm4gaChlLG8sbyxuLHQpfXZhciBnPVtdLGI9W10sQz17X3ZlcnNpb246IjMuMy4xIixfY29uZmlnOntjbGFzc1ByZWZpeDoiIixlbmFibGVDbGFzc2VzOiEwLGVuYWJsZUpTQ2xhc3M6ITAsdXNlUHJlZml4ZXM6ITB9LF9xOltdLG9uOmZ1bmN0aW9uKGUsbil7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bih0W2VdKX0sMCl9LGFkZFRlc3Q6ZnVuY3Rpb24oZSxuLHQpe2IucHVzaCh7bmFtZTplLGZuOm4sb3B0aW9uczp0fSl9LGFkZEFzeW5jVGVzdDpmdW5jdGlvbihlKXtiLnB1c2goe25hbWU6bnVsbCxmbjplfSl9fSx3PWZ1bmN0aW9uKCl7fTt3LnByb3RvdHlwZT1DLHc9bmV3IHc7dmFyIFM9bi5kb2N1bWVudEVsZW1lbnQsXz0ic3ZnIj09PVMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxQPSJNb3ogTyBtcyBXZWJraXQiLFQ9Qy5fY29uZmlnLnVzZVByZWZpeGVzP1Auc3BsaXQoIiAiKTpbXTtDLl9jc3NvbVByZWZpeGVzPVQ7dmFyIHo9Qy5fY29uZmlnLnVzZVByZWZpeGVzP1AudG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpOltdO0MuX2RvbVByZWZpeGVzPXo7dmFyIEU9e2VsZW06ZigibW9kZXJuaXpyIil9O3cuX3EucHVzaChmdW5jdGlvbigpe2RlbGV0ZSBFLmVsZW19KTt2YXIgTj17c3R5bGU6RS5lbGVtLnN0eWxlfTt3Ll9xLnVuc2hpZnQoZnVuY3Rpb24oKXtkZWxldGUgTi5zdHlsZX0pLEMudGVzdEFsbFByb3BzPWgsQy50ZXN0QWxsUHJvcHM9eCwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3giLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94IiwKCSAgICAiY2FuaXVzZSI6ICJmbGV4Ym94IiwKCSAgICAidGFncyI6IFsiY3NzIl0sCgkgICAgIm5vdGVzIjogW3sKCSAgICAgICJuYW1lIjogIlRoZSBfbmV3XyBmbGV4Ym94IiwKCSAgICAgICJocmVmIjogImh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2NzczMtZmxleGJveCIKCSAgICB9XSwKCSAgICAid2FybmluZ3MiOiBbCgkgICAgICAiQSBgdHJ1ZWAgcmVzdWx0IGZvciB0aGlzIGRldGVjdCBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBgZmxleC13cmFwYCBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQ7IHNlZSB0aGUgYGZsZXh3cmFwYCBkZXRlY3QuIgoJICAgIF0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94Iix4KCJmbGV4QmFzaXMiLCIxcHgiLCEwKSksLyohCgkgIHsKCSAgICAibmFtZSI6ICJGbGV4Ym94IChsZWdhY3kpIiwKCSAgICAicHJvcGVydHkiOiAiZmxleGJveGxlZ2FjeSIsCgkgICAgInRhZ3MiOiBbImNzcyJdLAoJICAgICJwb2x5ZmlsbHMiOiBbImZsZXhpZSJdLAoJICAgICJub3RlcyI6IFt7CgkgICAgICAibmFtZSI6ICJUaGUgX29sZF8gZmxleGJveCIsCgkgICAgICAiaHJlZiI6ICJodHRwczovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLWZsZXhib3gtMjAwOTA3MjMvIgoJICAgIH1dCgkgIH0KCSAgISovCncuYWRkVGVzdCgiZmxleGJveGxlZ2FjeSIseCgiYm94RGlyZWN0aW9uIiwicmV2ZXJzZSIsITApKSwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3ggKHR3ZWVuZXIpIiwKCSAgICAicHJvcGVydHkiOiAiZmxleGJveHR3ZWVuZXIiLAoJICAgICJ0YWdzIjogWyJjc3MiXSwKCSAgICAicG9seWZpbGxzIjogWyJmbGV4aWUiXSwKCSAgICAibm90ZXMiOiBbewoJICAgICAgIm5hbWUiOiAiVGhlIF9pbmJldHdlZW5fIGZsZXhib3giLAoJICAgICAgImhyZWYiOiAiaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTEvV0QtY3NzMy1mbGV4Ym94LTIwMTExMTI5LyIKCSAgICB9XSwKCSAgICAid2FybmluZ3MiOiBbIlRoaXMgcmVwcmVzZW50cyBhbiBvbGQgc3ludGF4LCBub3QgdGhlIGxhdGVzdCBzdGFuZGFyZCBzeW50YXguIl0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94dHdlZW5lciIseCgiZmxleEFsaWduIiwiZW5kIiwhMCkpLHMoKSxpKGcpLGRlbGV0ZSBDLmFkZFRlc3QsZGVsZXRlIEMuYWRkQXN5bmNUZXN0O2Zvcih2YXIgaj0wO2o8dy5fcS5sZW5ndGg7aisrKXcuX3Fbal0oKTtlLk1vZGVybml6cj13fSh3aW5kb3csZG9jdW1lbnQpfX0pOzt2YXIgUGRhQ2xpZW50QVBJPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBpPW5bcl09e2V4cG9ydHM6e30saWQ6cixsb2FkZWQ6ITF9O3JldHVybiBlW3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLHQpLGkubG9hZGVkPSEwLGkuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPSIiLHQoMCl9KFtmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTYpfSwsLCwsLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lfHx3aW5kb3cuZXZlbnQ7cmV0dXJuIG4odCl9O2lmKGUuYWRkRXZlbnRMaXN0ZW5lcillLmFkZEV2ZW50TGlzdGVuZXIodCxyLCEwKTtlbHNlIGlmKHQ9Im9uIit0LGUuYXR0YWNoRXZlbnQpZS5hdHRhY2hFdmVudCh0LHIpO2Vsc2V7dmFyIGk9ZVt0XTtlW3RdPWZ1bmN0aW9uKCl7ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYT1uKDkpLHU9cihhKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpZihpKHRoaXMsZSksdGhpcy53aW5kb3c9dC53aW5kb3d8fCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3csIXRoaXMud2luZG93fHwhdGhpcy53aW5kb3cuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJXaW5kb3cgYW5kL29yIGRvY3VtZW50IGlzIG5vdCBkZWZpbmVkIik7dGhpcy5kYWN4TG9nZ2VyPXQuZGFjeExvZ2dlcnx8bmV3IHVbImRlZmF1bHQiXSh0LmJhc2VVcmwsdC5pbXByZXNzaW9uSWQsdC5hZFNlc3Npb25JZCksdGhpcy5haWQ9dC5hZElkLHRoaXMuY2lkPXQuY3JlYXRpdmVJZCx0aGlzLmRhY3hMb2dnZXIubG9nSW1wcmVzc2lvbigpfXJldHVybiBvKGUsW3trZXk6ImF0dGFjaEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy53aW5kb3cuZG9jdW1lbnQuYWQ9e2FpZDp0aGlzLmFkSWQsY2lkOnRoaXMuY3JlYXRpdmVJZH0sdGhpcy53aW5kb3cuRGFjeExvZ2dlcj10aGlzLmRhY3hMb2dnZXJ9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBpKGUsdCxuKXtyZXR1cm4gdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gYShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIHUoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1uZXcgZlsiZGVmYXVsdCJdKGUsZCkscj17aTp0LmRhY3hJbXByZXNzaW9uSWQsYXNpOnQuZGFjeFNlc3Npb25JZCxjbGljazoxfTtyZXR1cm4gbi5nZXRQaXhlbFVybChyKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCk7dC5nZW5lcmF0ZURhY3hDbGlja1RyYWNrZXJVcmw9Yzt2YXIgcz1uKDEwKSxmPXIocyksZD0iNDE2NzMxNjEzIixwPSJjbGllbnRfaW1wIixoPSJ2aWV3Iix2PSJzd2lwZSIseT0tMSxnPTEsdz0yLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4scil7byh0aGlzLHQpO3ZhciBpPWEodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUsZCkpO3JldHVybiBpLmltcHJlc3Npb25JZD1uLGkuYWRTZXNzaW9uSWQ9cixpfXJldHVybiB1KHQsZSksbCh0LFt7a2V5OiJsb2dNZXRyaWMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49aSh7aTp0aGlzLmltcHJlc3Npb25JZCxhc2k6dGhpcy5hZFNlc3Npb25JZH0sZSx0fHwxKTt0aGlzLmZpcmVQaXhlbChuKX19LHtrZXk6ImxvZ0ltcHJlc3Npb24iLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMocCl9fSx7a2V5OiJsb2dWaWV3YWJpbGl0eVN1Y2Nlc3MiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMoaCxnKX19LHtrZXk6ImxvZ0JhcmVWaWV3YWJpbGl0eVN1Y2Nlc3MiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMoaCx3KX19LHtrZXk6ImxvZ1ZpZXdhYmlsaXR5RmFpbHVyZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLHkpfX0se2tleToibG9nU3dpcGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWModil9fV0pLHR9KGZbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPW19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxvPW4oMTEpLmdldFF1ZXJ5U3RyaW5nLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7cih0aGlzLGUpLHRoaXMuYmFzZVVybD10LHRoaXMuY2hhbm5lbD1ufXJldHVybiBpKGUsW3trZXk6ImdldFBpeGVsVXJsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iPyIrZW5jb2RlVVJJQ29tcG9uZW50KG8oZSkpO3JldHVybiB0aGlzLmJhc2VVcmwrIi9pdTM/ZD1mb3Jlc3Rlci1kaWQmZXgtZmNoPSIrdGhpcy5jaGFubmVsKyImZXgtZmFyZ3M9Iit0KyImY2I9IisobmV3IERhdGUpLmdldFRpbWUoKX19LHtrZXk6ImZpcmVQaXhlbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEltYWdlO3JldHVybiB0LnNyYz10aGlzLmdldFBpeGVsVXJsKGUpLHR9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWF9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1bXTtmb3IodmFyIHIgaW4gZSluLnB1c2gocisiPSIrZVtyXSk7dmFyIGk9bi5qb2luKCImIik7cmV0dXJuIHQ/ZW5jb2RlVVJJQ29tcG9uZW50KGkpOml9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7cj5uO24rKyl0KGVbbl0sbixlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRRdWVyeVN0cmluZz1uLHQuZm9yRWFjaD1yfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGM9ZnVuY3Rpb24gYihlLHQsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHZvaWQgMD09PXIpe3ZhciBpPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PWk/dm9pZCAwOmIoaSx0LG4pfWlmKCJ2YWx1ZSJpbiByKXJldHVybiByLnZhbHVlO3ZhciBvPXIuZ2V0O2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uY2FsbChuKX0sbD1uKDgpLHM9cihsKSxmPW4oMTcpLGQ9cihmKSxwPW4oMTgpLGg9cihwKSx2PW4oMTkpLHk9cih2KSxnPW4oNiksdz1bIlRFVFJJU19JTkxJTkVfTUVTU0FHSU5HIl0sbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe2kodGhpcyx0KTt2YXIgbj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc2hhemFtTG9nZ2VyPWUuc2hhemFtTG9nZ2VyfHxuZXcgZFsiZGVmYXVsdCJdKGUuYmFzZVVybCxlKSxuLnNoYXphbUxvZ2dlci5sb2dJbXByZXNzaW9uKCksbi5jcmVhdGl2ZUNsaWNrTG9nZ2VyPWUuY3JlYXRpdmVDbGlja0xvZ2dlcnx8bmV3IHlbImRlZmF1bHQiXShlLmJhc2VVcmwsZS5pbXByZXNzaW9uSWQpLG4udGVtcGxhdGVOYW1lPWUudGVtcGxhdGVOYW1lLG59cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImF0dGFjaEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7Yyh0LnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSksImF0dGFjaEdsb2JhbHMiLHRoaXMpLmNhbGwodGhpcyksdGhpcy53aW5kb3cuU2hhemFtTG9nZ2VyPXRoaXMuc2hhemFtTG9nZ2VyLHRoaXMud2luZG93LlZpZXdhYmlsaXR5PWhbImRlZmF1bHQiXX19LHtrZXk6InRyYWNrTG9hZExhdGVuY3kiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnNoYXphbUxvZ2dlci5zdGFydFRpbWVyKGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpLCgwLGcuYWRkTGlzdGVuZXIpKHRoaXMud2luZG93LCJsb2FkIixmdW5jdGlvbih0KXtlLnNoYXphbUxvZ2dlci5lbmRUaW1lcihkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuQ1JFQVRJVkVfTE9BRF9MQVRFTkNZKX0pfX0se2tleToiYWRkRXJyb3JMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMud2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24odCxuLHIsaSxvKXtpZihvJiZvLnN0YWNrKXt2YXIgYT10KyIgOiAiK28uc3RhY2s7ZS5zaGF6YW1Mb2dnZXIuYWRkQ291bnQoZFsiZGVmYXVsdCJdLkVWRU5UX05BTUVTLlVOQ0FVR0hUX0VSUk9SLGEubGVuZ3RoPDUwMD9hOmEuc3Vic3RyaW5nKDAsNTAwKSl9ZWxzZSBlLnNoYXphbUxvZ2dlci5hZGRDb3VudChkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuVU5DQVVHSFRfRVJST1IsdCsiIDogIituKX19fSx7a2V5OiJhZGRWaWV3YWJpbGl0eUxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49LjUscj0xZTMsaT0uMDEsbz0xLGE9bmV3IGhbImRlZmF1bHQiXShlLHRoaXMud2luZG93KTthLmdldFBlcmNlbnRJblZpZXcoKTw9LTE/dGhpcy5kYWN4TG9nZ2VyLmxvZ1ZpZXdhYmlsaXR5RmFpbHVyZSgpOihhLm9uVmlldyhpLG8sZnVuY3Rpb24oKXtyZXR1cm4gdC5kYWN4TG9nZ2VyLmxvZ0JhcmVWaWV3YWJpbGl0eVN1Y2Nlc3MoKX0pLGEub25WaWV3KG4scixmdW5jdGlvbigpe3JldHVybiB0LmRhY3hMb2dnZXIubG9nVmlld2FiaWxpdHlTdWNjZXNzKCl9KSl9fSx7a2V5OiJhZGRDcmVhdGl2ZUNsaWNrTGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dy5pbmRleE9mKHRoaXMudGVtcGxhdGVOYW1lKT49MCYmKDAsZy5hZGRMaXN0ZW5lcikoZSwiY2xpY2siLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXt0LmNyZWF0aXZlQ2xpY2tMb2dnZXIubG9nQ2xpY2sobixlLm9mZnNldFdpZHRoLGUub2Zmc2V0SGVpZ2h0KX19KGUpKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGM9ZnVuY3Rpb24geShlLHQsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHZvaWQgMD09PXIpe3ZhciBpPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PWk/dm9pZCAwOnkoaSx0LG4pfWlmKCJ2YWx1ZSJpbiByKXJldHVybiByLnZhbHVlO3ZhciBvPXIuZ2V0O2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uY2FsbChuKX0sbD1uKDEwKSxzPXIobCksZj0uMSxkPSJjbG1ldCIscD0iZGEtY3gtbWV0cmljcyIsaD1bInNoYXphbUlkIiwidGVtcGxhdGVOYW1lIiwibG9jYWxlIiwiYWRTZXJ2ZXIiLCJ0ZW1wbGF0ZU1ham9yVmVyc2lvbiIsInRlbXBsYXRlTWlub3JWZXJzaW9uIiwiYWRJZCIsImNyZWF0aXZlSWQiLCJpbXByZXNzaW9uSWQiXSx2PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSxuKXtpKHRoaXMsdCk7dmFyIHI9byh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSxwKSk7cmV0dXJuIHIuc2hvdWxkRmlyZU1ldHJpY3M9TWF0aC5yYW5kb20oKTw9ZixyLnRpbWVycz17fSxyLmFkSW5mbz1uLGguZm9yRWFjaChmdW5jdGlvbihlKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sZSkpdGhyb3cgbmV3IEVycm9yKCJTaGF6YW1Mb2dnZXIgbWlzc2luZyBhZEluZm8gcHJvcGVydHk6ICIrZSl9KSxyfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJmaXJlUGl4ZWwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuc2hvdWxkRmlyZU1ldHJpY3MmJihlLmk9ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWRJbmZvLmltcHJlc3Npb25JZCksZS5hcHA9ZW5jb2RlVVJJQ29tcG9uZW50KGQpLGModC5wcm90b3R5cGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLCJmaXJlUGl4ZWwiLHRoaXMpLmNhbGwodGhpcyxlKSl9fSx7a2V5OiJsb2dFdmVudCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O2lmKG51bGwhPWUmJm51bGwhPXQpe3RyeXtuJiYoci50eXBlPW4pLHIuZW49ZSxyLmV2PUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKGkpe3Iuc3RyaW5naWZ5Tm90QXZhaWxhYmxlPTF9dGhpcy5maXJlUGl4ZWwocil9fX0se2tleToibG9nSW1wcmVzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFkSW5mbyx0PXtzOmUuc2hhemFtSWQsbjplbmNvZGVVUklDb21wb25lbnQoZS50ZW1wbGF0ZU5hbWUpLGw6ZS5sb2NhbGUsYXM6ZS5hZFNlcnZlcix0bWp2OmUudGVtcGxhdGVNYWpvclZlcnNpb24sdG1udjplLnRlbXBsYXRlTWlub3JWZXJzaW9uLGFpOmUuYWRJZCxjaTplLmNyZWF0aXZlSWQsaTplLmltcHJlc3Npb25JZCxpbXA6MX07bmF2aWdhdG9yJiYodC51YT1lbmNvZGVVUklDb21wb25lbnQobmF2aWdhdG9yLnVzZXJBZ2VudCkpLHRoaXMuZmlyZVBpeGVsKHQpfX0se2tleToic3RhcnRUaW1lciIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy50aW1lcnNbZV09bmV3IERhdGV9fSx7a2V5OiJlbmRUaW1lciIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy50aW1lcnNbZV0pe3ZhciBuPW5ldyBEYXRlLXRoaXMudGltZXJzW2VdO3RoaXMubG9nRXZlbnQoZSxuLHQuRVZFTlRfVFlQRVMuVElNRVIpLGRlbGV0ZSB0aGlzLnRpbWVyc1tlXX19fSx7a2V5OiJhZGRDb3VudCIsdmFsdWU6ZnVuY3Rpb24oZSxuKXtuPW58fDEsdGhpcy5sb2dFdmVudChlLG4sdC5FVkVOVF9UWVBFUy5DT1VOVEVSKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09dix2LkVWRU5UX1RZUEVTPXtUSU1FUjoidGltZXIiLENPVU5URVI6ImNvdW50ZXIiLEpTT046Impzb24ifSx2LkVWRU5UX05BTUVTPXtCVVlfQk9YX0xPQURfTEFURU5DWToiQnV5Qm94TG9hZExhdGVuY3kiLEFBTl9MQVRFTkNZOiJBYW5MYXRlbmN5IixBQU5fRVJST1I6IkFhbkVycm9yIixEUk9QX0RPV05fU0VMRUNUT1I6IkRyb3BEb3duU2VsZWN0b3IiLFVOQ0FVR0hUX0VSUk9SOiJVbmNhdWdodEVycm9yIixVTkRFRklORURfVFJBQ0tFUl9BUkc6IlVuZGVmaW5lZFRyYWNrZXJBcmciLENPT1JESU5BVE9SX1RSQUNLRVI6IkNvb3JkaW5hdG9yVHJhY2tlciIsSU1BR0VfTE9BRF9MQVRFTkNZOiJJbWFnZUxvYWRMYXRlbmN5IixDUkVBVElWRV9MT0FEX0xBVEVOQ1k6IkNyZWF0aXZlTG9hZExhdGVuY3kifX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKHQpLHI9byh0KSx1PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1hKHUudG9wLHUuYm90dG9tLG4pLGw9YSh1LmxlZnQsdS5yaWdodCxyKSxzPWMqbCxmPSh1LmJvdHRvbS11LnRvcCkqKHUucmlnaHQtdS5sZWZ0KTtyZXR1cm4gTWF0aC5taW4oMSxNYXRoLm1heCgwLHMvZikpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUuaW5uZXJIZWlnaHR8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodH1mdW5jdGlvbiBvKGUpe3JldHVybiBlLmlubmVyV2lkdGh8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRofWZ1bmN0aW9uIGEoZSx0LG4pe3ZhciByPTA7cmV0dXJuIHI9ZT4wP24tZTp0PjA/TWF0aC5taW4odCxuKTowLE1hdGgubWluKHIsdC1lKX1mdW5jdGlvbiB1KGUpe3ZhciB0PW51bGwsbj1mdW5jdGlvbiByKCl7ZSgpfHwodD1zZXRUaW1lb3V0KHIsMTAwKSl9O3JldHVybiBuKCkse2NsZWFyOmZ1bmN0aW9uKCl7dCYmY2xlYXJUaW1lb3V0KHQpfX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7bih0aGlzLGUpLHRoaXMud2luZG93PXJ8fHdpbmRvdyx0aGlzLmVsZW09dH1yZXR1cm4gYyhlLFt7a2V5OiJnZXRQZXJjZW50SW5WaWV3Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VG9wV2luZG93KCk7aWYoZSl7aWYodGhpcy53aW5kb3c9PT1lKXJldHVybiByKHRoaXMuZWxlbSxlKTtpZih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQpcmV0dXJuIHIodGhpcy53aW5kb3cuZnJhbWVFbGVtZW50LGUpfWVsc2UgaWYodGhpcy53aW5kb3cuJHNmKXRyeXt2YXIgdD10aGlzLndpbmRvdy4kc2YuZXh0LmluVmlld1BlcmNlbnRhZ2UoKXx8MDtyZXR1cm4gdC8xMDB9Y2F0Y2gobil7fXJldHVybi0xfX0se2tleToiZ2V0VG9wV2luZG93Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPW51bGw7dHJ5e2lmKCF0aGlzLndpbmRvdy50b3AuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJjcm9zcy1kb21haW4gZXhjZXB0aW9uIik7ZT10aGlzLndpbmRvdy50b3B9Y2F0Y2godCl7fXJldHVybiBlfX0se2tleToib25WaWV3VGhyZXNob2xkIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLG89bnVsbDtyZXR1cm4gdShmdW5jdGlvbigpe2lmKGkuZ2V0UGVyY2VudEluVmlldygpPj1lJiZpLmdldFBlcmNlbnRJblZpZXcoKTw9dCl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYobnVsbD09PW8pbz1hO2Vsc2UgaWYoYS1vPm4pcmV0dXJuIHIoKSwhMH1lbHNlIG89bnVsbH0pfX0se2tleToib25WaWV3Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub25WaWV3VGhyZXNob2xkKGUsMSx0LG4pfX0se2tleToib25IaWRlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub25WaWV3VGhyZXNob2xkKDAsZSx0LG4pfX0se2tleToiZ2V0VmVydGljYWxQb3NpdGlvbk9uUGFnZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0tMSx0PXRoaXMuZ2V0VG9wV2luZG93KCk7aWYodCl7aWYodGhpcy53aW5kb3c9PT10KXt2YXIgbj10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLHI9aSh0KSxvPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7ZT1NYXRoLm1heChNYXRoLm1pbihuLyhyLW8pLDEpLDApfWVsc2UgaWYodGhpcy53aW5kb3cuZnJhbWVFbGVtZW50KXt2YXIgbj10aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLHI9aSh0KSxvPXRoaXMud2luZG93LmZyYW1lRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7ZT1NYXRoLm1heChNYXRoLm1pbihuLyhyLW8pLDEpLDApfX1lbHNlIGlmKHRoaXMud2luZG93LiRzZil0cnl7ZT1NYXRoLm1heChNYXRoLm1pbigkc2YuZXh0Lmdlb20oKS5zZWxmLnQvKCRzZi5leHQuZ2VvbSgpLndpbi5oLSRzZi5leHQuZ2VvbSgpLnNlbGYuaCksMSksMCl9Y2F0Y2goYSl7fXJldHVybiBlfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1sfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiB2KGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6dihpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oMTApLHM9cihsKSxmPSJkYS1jeC1tZXRyaWNzIixkPSJDb29yZGluYXRlQ2xpY2siLHA9Impzb24iLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe2kodGhpcyx0KTt2YXIgcj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlLGYpKTtyZXR1cm4gci5pbXByZXNzaW9uSWQ9bixyfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJsb2dDbGljayIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXt9LG89e2N4YzplLnBhZ2VYLGN5YzplLnBhZ2VZLGNwdzpuLGNwaDpyfTtpLmVuPWQsaS50eXBlPXAsaS5pPXRoaXMuaW1wcmVzc2lvbklkO3RyeXtpLmV2PWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvKSl9Y2F0Y2goYSl7aS5zdHJpbmdpZnlOb3RBdmFpbGFibGU9MX1jKHQucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQucHJvdG90eXBlKSwiZmlyZVBpeGVsIix0aGlzKS5jYWxsKHRoaXMsaSl9fV0pLHR9KHNbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPWh9XSk7O3dpbmRvdy5wZGFnU2NvcGUgPSB3aW5kb3cucGRhZ1Njb3BlIHx8IHt9O3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJID0gbmV3IFBkYUNsaWVudEFQSS5kZWZhdWx0KHsiYmFzZVVybCI6Imh0dHBzOi8vcy5hbWF6b24tYWRzeXN0ZW0uY29tIiwic2hhemFtSWQiOiI4MzQzNzc0IiwidGVtcGxhdGVOYW1lIjoiVEVUUklTX01PQklMRV9NWVNUSVFVRSIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIjoiMSIsInRlbXBsYXRlTWlub3JWZXJzaW9uIjoiOCIsImxvY2FsZSI6IlVTIiwiYWRTZXJ2ZXIiOiJjb3JuZXJzdG9uZSIsImFkSWQiOiI0NzU2NjgyNzMwOTAxIiwiY3JlYXRpdmVJZCI6IjQ5ODc4NTA1NTAwMDEiLCJpbXByZXNzaW9uSWQiOiJRT3FvMUJKYkpoWTByNkFsbE5OYS1RIiwiYWRTZXNzaW9uSWQiOiIwMTAxYjBkZDllOWVkNmU0ZDE0ZWU1OTJkMTQzMDcyYzUwNWE1M2UxZTNlNzZhNjUzYWI2NjNmYTAxMGZlYzk5MDM4NiJ9KTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS50cmFja0xvYWRMYXRlbmN5KCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYXR0YWNoR2xvYmFscygpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZEVycm9yTGlzdGVuZXIoKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+PGRpdiBpZD1hZD48ZGl2IGNsYXNzPSJtb2JpbGVNeXN0aXF1ZSB0ZW1wbGF0ZUNvbnRhaW5lciIgZGF0YS1jcmVhdGl2ZS1pZD0iNDk4Nzg1MDU1MDAwMSIgZGF0YS1hZC1pZD0iNDc1NjY4MjczMDkwMSIgZGF0YS1yZWFjdHJvb3Q9IiIgZGF0YS1yZWFjdGlkPSIxIiBkYXRhLXJlYWN0LWNoZWNrc3VtPSIxNjA3NjIwOTU4Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Ra0RxcU5RU1d5WVdOSy1nSlpUVFd2a0FBQUZocEprcVNBRUFBQUdRQVctNFRUZy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzA5OTYzNjY3MzM/YWF4aXRrPVNjYldVd1ZYbzZ0T3ZIYnVkYVZTMnciIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIyIj48L2E+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMjVweDtib3JkZXI6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojRkZGRkZGOyIgZGF0YS1yZWFjdGlkPSIzIj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9IndpZHRoOjE2MHB4O2hlaWdodDoxMDAlO3BhZGRpbmc6NXB4IDEwcHggNXB4IDEwcHg7ZmxleDowIDAgMTI1cHg7IiBkYXRhLXJlYWN0aWQ9IjQiPjxkaXYgY2xhc3M9ImFzaW5JbWFnZSIgZGF0YS1yZWFjdGlkPSI1Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayBhc2luSW1hZ2UiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUWtEcXFOUVNXeVlXTkstZ0paVFRXdmtBQUFGaHBKa3FTQUVBQUFHUUFXLTRUVGcvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wOTk2MzY2NzMzP2FheGl0az1TY2JXVXdWWG82dE92SGJ1ZGFWUzJ3IiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iNiI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iNyI+PGltZyBjbGFzcz0ibWVkaWFDZW50cmFsSW1hZ2UgaW1hZ2VDb250YWluZXJfX2ltYWdlIiBzcmM9Imh0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9JLzUxNno3MmhGaFpMLl9BQ19TWDE2MF8uanBnIiBhbHQ9IkJyaW5nIHlvdXIgd2ViIGRlc2lnbiB0byBsaWZlIHdpdGggc2ltcGxpZmllZCBKYXZhU2NyaXB0IGluc3RydWN0aW9uIiBkYXRhLXJlYWN0aWQ9IjgiLz48L2Rpdj48L2E+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxMDAlO2JhY2tncm91bmQ6I0ZGRkZGRjtiYWNrZ3JvdW5kOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI0ZGRkZGRiwgI0VCRUJFQik7YmFja2dyb3VuZDotby1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgLW8tbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpO2JhY2tncm91bmQ6LW1vei1saW5lYXItZ3JhZGllbnQoI0ZGRkZGRiwgI0VCRUJFQik7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpOyIgZGF0YS1yZWFjdGlkPSI5Ij48ZGl2IGNsYXNzPSJibG9jayBibG9jay0tanVzdGlmeS1jZW50ZXIgYmxvY2stLWRpcmVjdGlvbi1jb2x1bW4iIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6MCAxMHB4IDAgMDsiIGRhdGEtcmVhY3RpZD0iMTAiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMCA1cHggMDsiIGRhdGEtcmVhY3RpZD0iMTEiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHRleHRMaW5rIHRleHRMaW5rLS1kaXNwbGF5QXNUZXh0IiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FrRHFxTlFTV3lZV05LLWdKWlRUV3ZrQUFBRmhwSmtxU0FFQUFBR1FBVy00VFRnL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDk5NjM2NjczMz9hYXhpdGs9U2NiV1V3VlhvNnRPdkhidWRhVlMydyIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjEyIj48ZGl2IHN0eWxlPSJmb250LXNpemU6MThweDtmb250LXN0eWxlOml0YWxpYztjb2xvcjojNTU1O2xpbmUtaGVpZ2h0OjIwcHg7IiBjbGFzcz0idGV4dENvbnRhaW5lciIgZGF0YS1yZWFjdGlkPSIxMyI+PHNwYW4gY2xhc3M9InRleHRDb250YWluZXJfX3RleHQiIGRhdGEtcmVhY3RpZD0iMTQiPlJlYWR5IHRvIHdyaXRlIHRoZSBzY3JpcHQgdGhhdCBwb3dlcnMgdGhlIHdlYj88L3NwYW4+PC9kaXY+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMCA1cHggMDsiIGRhdGEtcmVhY3RpZD0iMTUiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHRleHRMaW5rIiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FrRHFxTlFTV3lZV05LLWdKWlRUV3ZrQUFBRmhwSmtxU0FFQUFBR1FBVy00VFRnL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDk5NjM2NjczMz9hYXhpdGs9U2NiV1V3VlhvNnRPdkhidWRhVlMydyIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjE2Ij48ZGl2IHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LXdlaWdodDo2MDA7IiBjbGFzcz0idGV4dENvbnRhaW5lciBoLWVsbGlwc2lzIiBkYXRhLXJlYWN0aWQ9IjE3Ij48c3BhbiBjbGFzcz0idGV4dENvbnRhaW5lcl9fdGV4dCIgZGF0YS1yZWFjdGlkPSIxOCI+QnJpbmcgeW91ciB3ZWIgZGVzaWduIHRvIGxpZmUgd2l0aCBzaW1wbGlmaWVkIEphdmFTY3JpcHQgaW5zdHJ1Y3Rpb248L3NwYW4+PC9kaXY+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIGJsb2NrLS1pbmxpbmUgIiBzdHlsZT0id2hpdGUtc3BhY2U6bm9ybWFsOyIgZGF0YS1yZWFjdGlkPSIxOSI+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJtYXJnaW46MCA1cHggMCAwOyIgZGF0YS1yZWFjdGlkPSIyMCI+PHNwYW4gY2xhc3M9InByaWNlQm94IiBkYXRhLXJlYWN0aWQ9IjIxIj48IS0tIHJlYWN0LXRleHQ6IDIyIC0tPjwhLS0gL3JlYWN0LXRleHQgLS0+PHNwYW4gY2xhc3M9InByaWNlIHByaWNlQm94X19idXkiIHN0eWxlPSJmb250LXNpemU6MTVweDsiIGRhdGEtcmVhY3RpZD0iMjMiPjxzcGFuIGNsYXNzPSJwcmljZV9fY3VycmVuY3kiIGRhdGEtcmVhY3RpZD0iMjQiPiQ8L3NwYW4+PHNwYW4gY2xhc3M9InByaWNlX19hbW91bnQiIGRhdGEtcmVhY3RpZD0iMjUiPjcuOTc8L3NwYW4+PC9zcGFuPjwhLS0gcmVhY3QtdGV4dDogMjYgLS0+PCEtLSAvcmVhY3QtdGV4dCAtLT48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlOyIgZGF0YS1yZWFjdGlkPSIyNyI+PGltZyBjbGFzcz0ibWVkaWFDZW50cmFsSW1hZ2UgcHJpbWVMb2dvIiBzcmM9Imh0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9HLzAxL2RhL2NyZWF0aXZlcy9wcmltZS0yeC0yMDE3MDYxNC5wbmciIHdpZHRoPSI0MyIgaGVpZ2h0PSIxMiIgYWx0PSJQcmltZSIgZGF0YS1yZWFjdGlkPSIyOCIvPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMTBweCAwIDEwcHg7aGVpZ2h0OjEyM3B4O29wYWNpdHk6MC42NDtmbGV4OjAgMCA5cHg7IiBkYXRhLXJlYWN0aWQ9IjI5Ij48ZGl2IGNsYXNzPSJpbWFnZUNvbnRhaW5lciIgZGF0YS1yZWFjdGlkPSIzMCI+PGltZyBjbGFzcz0ibWVkaWFDZW50cmFsSW1hZ2UgaW1hZ2VDb250YWluZXJfX2ltYWdlIiBzcmM9Imh0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9HLzAxL0FtYXpvbkJyYW5kU3RvcmVzUGxhdGZvcm0vYmxhY2tfYXJyb3cucG5nIiBhbHQ9IkdyYXkgQXJyb3ciIHJvbGU9InByZXNlbnRhdGlvbiIgZGF0YS1yZWFjdGlkPSIzMSIvPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxzY3JpcHQgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYWN4L2pzL3JlYWN0LTE1LjMuMi5taW4uanMiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYWN4L2pzL3JlYWN0LWRvbS0xNS4zLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0PnZhciBMaWJyYXJ5PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBvPW5bcl09e2V4cG9ydHM6e30saWQ6cixsb2FkZWQ6ITF9O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubG9hZGVkPSEwLG8uZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPSIiLHQoMCl9KFtmdW5jdGlvbihlLHQsbil7bigxKSxlLmV4cG9ydHM9bigxMDApfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjsiZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LmFzc2lnbiYmKE9iamVjdC5hc3NpZ249ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3QoZSkscj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe3ZhciBvPWFyZ3VtZW50c1tyXTtpZihudWxsIT1vKWZvcih2YXIgaSBpbiBvKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLGkpJiYobltpXT1vW2ldKX1yZXR1cm4gbn0pfSwsZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9UmVhY3R9LCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oNiksYz1yKHApLGY9bigyNyksZD1yKGYpLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wcm9wcy51cGRhdGVPblJlc2l6ZSYmdGhpcy5saXN0ZW5Gb3JSZXNpemUoKX19LHtrZXk6Imxpc3RlbkZvclJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzOyJ1bmRlZmluZWQiIT10eXBlb2YgU0ZDbGllbnQmJlNGQ2xpZW50JiZTRkNsaWVudC5yZWdpc3RlckN1c3RvbU1lc3NhZ2VMaXN0ZW5lcj9TRkNsaWVudC5yZWdpc3RlckN1c3RvbU1lc3NhZ2VMaXN0ZW5lcigicmVzaXplIixmdW5jdGlvbigpe2Uub25SZXNpemUoKX0pOiJ1bmRlZmluZWQiIT10eXBlb2YgTVNGQ2xpZW50JiZNU0ZDbGllbnQmJk1TRkNsaWVudC5yZWdpc3RlckN1c3RvbU1lc3NhZ2VMaXN0ZW5lcj9NU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixmdW5jdGlvbigpe2Uub25SZXNpemUoKX0pfX0se2tleToib25SZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5mb3JjZVVwZGF0ZSgpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMucmVuZGVyaW5nQ29udGV4dCx0PXRoaXMucHJvcHMuc3RydWN0dXJlLG49dGhpcy5wcm9wcy5jbGFzc05hbWUrKHRoaXMucHJvcHMuc2t5PyIgc2t5IjoiIik7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dGVtcGxhdGVJZDp0aGlzLnByb3BzLnRlbXBsYXRlSWQsY2xhc3NOYW1lOm4saHJlZjplLmFkTGluayxjbGlja1VybHM6ZS5jbGlja1VybHMsY3JlYXRpdmVJZDplLmNyZWF0aXZlSWQsYWRJZDplLmFkSWR9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7cmVuZGVyaW5nQ29udGV4dDplLGJsb2NrOnQsY29tcG9uZW50c01hcDp0aGlzLnByb3BzLmNvbXBvbmVudHNNYXAsZG9tUmVmczp0aGlzLnByb3BzLmRvbVJlZnN9KSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInRlbXBsYXRlQ29udGFpbmVyIiwiYmxvY2siXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRlbXBsYXRlIixoLnByb3BUeXBlcz17cmVuZGVyaW5nQ29udGV4dDp1LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxzdHJ1Y3R1cmU6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY29tcG9uZW50c01hcDp1LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxjbGFzc05hbWU6dS5Qcm9wVHlwZXMuc3RyaW5nLGRvbVJlZnM6dS5Qcm9wVHlwZXMub2JqZWN0LHRlbXBsYXRlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHVwZGF0ZU9uUmVzaXplOnUuUHJvcFR5cGVzLmJvb2wsc2t5OnUuUHJvcFR5cGVzLmJvb2x9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oNyksYz1yKHApLGY9bigyNCksZD1yKGYpLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtmbGV4Ym94OiEwfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm5vZGUmJnRoaXMuc2V0U3RhdGUoe2ZsZXhib3g6ZFsiZGVmYXVsdCJdLnN1cHBvcnQuZmxleGJveCgpfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSh0aGlzLnByb3BzLmNsYXNzTmFtZT90aGlzLnByb3BzLmNsYXNzTmFtZSsiICI6IiIpKyJ0ZW1wbGF0ZUNvbnRhaW5lciIrKHRoaXMuc3RhdGUuZmxleGJveD8iIjoiIGgtbm9GbGV4Ym94Iik7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtzdHlsZTp0aGlzLnByb3BzLnN0eWxlLGNsYXNzTmFtZTp0LGlkOnRoaXMucHJvcHMudGVtcGxhdGVJZCwiZGF0YS1jcmVhdGl2ZS1pZCI6dGhpcy5wcm9wcy5jcmVhdGl2ZUlkLCJkYXRhLWFkLWlkIjp0aGlzLnByb3BzLmFkSWQscmVmOmZ1bmN0aW9uKHQpe2Uubm9kZT10fX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InRlbXBsYXRlQ29udGFpbmVyX19saW5rIn19KSx0aGlzLnByb3BzLmNoaWxkcmVuKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsiQ2xpY2t0aHJvdWdoTGluayJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWgsaC5kaXNwbGF5TmFtZT0iVGVtcGxhdGVDb250YWluZXIgIixoLnByb3BUeXBlcz17c3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGNsYXNzTmFtZTp1LlByb3BUeXBlcy5zdHJpbmcsdGVtcGxhdGVJZDp1LlByb3BUeXBlcy5zdHJpbmcsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLmlzUmVxdWlyZWQsY3JlYXRpdmVJZDp1LlByb3BUeXBlcy5zdHJpbmcsYWRJZDp1LlByb3BUeXBlcy5zdHJpbmd9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxsPW4oMykscD1yKGwpLGM9big4KSxmPXIoYyksZD1uKDkpLGg9cihkKSx5PW4oMTIpLG09cih5KSxiPW4oMjMpLHY9cihiKSxnPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoYi5DT1VQT05fVE9LRU5fTUFDUk8sKDAsdlsiZGVmYXVsdCJdKSgpKX0sXz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImhhbmRsZU9uQ2xpY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucHJvcHMsbj10LmNsaWNrVHJhY2tlclVybHMscj10LnVybCxvPXQuY2FzY2FkaW5nSW50ZW50LGk9dC5pc09mZnNpdGU7KDAsZlsiZGVmYXVsdCJdKShuKSwoMCxtWyJkZWZhdWx0Il0pKGcociksaSxvKSYmZS5wcmV2ZW50RGVmYXVsdCgpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLG49dC51cmwscj10LmlzT2Zmc2l0ZSxvPXQuY2hpbGRyZW4saT10LmFuY2hvclByb3BzLGE9bnVsbDt0aGlzLmNvbnRleHQuaXNTdGF0aWNIdG1sJiZ0aGlzLnByb3BzLmNsaWNrVHJhY2tlclVybHMmJihhPXRoaXMucHJvcHMuY2xpY2tUcmFja2VyVXJscy5qb2luKCJ8IikpO3ZhciB1PSJjbGlja3Rocm91Z2hMaW5rIisoaS5jbGFzc05hbWU/IiAiK2kuY2xhc3NOYW1lOiIiKTtyZXR1cm4gcFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImEiLHMoe30saSx7Y2xhc3NOYW1lOnUsaHJlZjpnKG4pLHRhcmdldDooMCxoWyJkZWZhdWx0Il0pKG4sciksb25DbGljazpmdW5jdGlvbih0KXtyZXR1cm4gZS5oYW5kbGVPbkNsaWNrKHQpfSxvbk1vdXNlRG93bjpmdW5jdGlvbigpe3JldHVybiBlLmZvcmNlVXBkYXRlKCl9LCJkYXRhLWNsaWNrVHJhY2tlclVybHMiOmEscmVsOiJub2ZvbGxvdyJ9KSxvKX19XSksdH0obC5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1fLF8uZGlzcGxheU5hbWU9IkNsaWNrdGhyb3VnaExpbmsiLF8ucHJvcFR5cGVzPXt1cmw6bC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsY2FzY2FkaW5nSW50ZW50OmwuUHJvcFR5cGVzLnN0cmluZyxpc09mZnNpdGU6bC5Qcm9wVHlwZXMuYm9vbCxjbGlja1RyYWNrZXJVcmxzOmwuUHJvcFR5cGVzLmFycmF5T2YobC5Qcm9wVHlwZXMuc3RyaW5nKSxhbmNob3JQcm9wczpsLlByb3BUeXBlcy5vYmplY3QsY2hpbGRyZW46bC5Qcm9wVHlwZXMubm9kZX0sXy5jb250ZXh0VHlwZXM9e2lzU3RhdGljSHRtbDpsLlByb3BUeXBlcy5ib29sfX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSksbz0wO2U+bztvKyspdFtvXT1hcmd1bWVudHNbb107Zm9yKHZhciBpIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIGE9dFtpXTtpZihhKWlmKCJzdHJpbmciPT10eXBlb2YgYSlyKGEpO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmlyZSBwaXhlbDogIicrSlNPTi5zdHJpbmdpZnkoYSkrJyIgaXMgbm90IGEgc3RyaW5nIScpO24uYXBwbHkodGhpcyxhKX19fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbihlKXsidW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlJiYoKG5ldyBJbWFnZSkuc3JjPWUpfTt0WyJkZWZhdWx0Il09bn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj10fHwhKDAsYVsiZGVmYXVsdCJdKShlKTtyZXR1cm4gbj9zLklOX05FV19XSU5ET1c6cy5JTl9TQU1FX1dJTkRPV31PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW87dmFyIGk9bigxMCksYT1yKGkpLHM9bigxMSl9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHIudGVzdChlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW47dmFyIHI9L14oKGh0dHBzPzopP1wvXC8pKC4qXC4pP2FtYXpvblwuL30sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPXQuSU5fU0FNRV9XSU5ET1c9Il90b3AiLHI9dC5JTl9ORVdfV0lORE9XPSJfYmxhbmsiO3RbImRlZmF1bHQiXT17SU5fTkVXX1dJTkRPVzpyLElOX1NBTUVfV0lORE9XOm59fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQsbil7aWYoIXQmJm1bImRlZmF1bHQiXSYmQyYmcFsiZGVmYXVsdCJdLm1hc2guaXNBVUlBdmFpbGFibGUoKSYmKDAsVFsiZGVmYXVsdCJdKShlLHQpPT09UC5JTl9ORVdfV0lORE9XKXBbImRlZmF1bHQiXS5tYXNoLm9wZW5JbkV4dGVybmFsQnJvd3Nlci5leGVjdXRlKHt1cmw6ZX0pO2Vsc2UgaWYoIXR8fCFNfHx2WyJkZWZhdWx0Il0mJiFTKFsyLDIsMTBdKXx8X1siZGVmYXVsdCJdJiYhUyhbNSw1LDEzNV0pKXtpZighdHx8IUkpcmV0dXJuITE7ZlsiZGVmYXVsdCJdLm9wZW4oZSl9ZWxzZSBoWyJkZWZhdWx0Il0ub3BlbkluRXh0ZXJuYWxCcm93c2VyKG58fGUpO3JldHVybiEwfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4oMCxUWyJkZWZhdWx0Il0pKGUsdCk9PT1QLklOX1NBTUVfV0lORE9XfWZ1bmN0aW9uIGEoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuIHVbImRlZmF1bHQiXS5vcGVuKGUsKDAsVFsiZGVmYXVsdCJdKShlLHQpKX0sYT1mdW5jdGlvbigpe3JldHVybiBvKGUsdCxuKX0scz1mdW5jdGlvbigpe3JldHVybiBhKCl8fHIoKX07cmV0dXJuIGkoZSx0KT8oc2V0VGltZW91dChzLFIpLCEwKTphKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1hO3ZhciBzPW4oMTMpLHU9cihzKSxsPW4oMTQpLHA9cihsKSxjPW4oMTUpLGY9cihjKSxkPW4oMTYpLGg9cihkKSx5PW4oMTcpLG09cih5KSxiPW4oMTgpLHY9cihiKSxnPW4oMjEpLF89cihnKSxQPW4oMTEpLGs9big5KSxUPXIoaykseD1uKDIyKSxPPXIoeCksdz0hIXBbImRlZmF1bHQiXSxDPXcmJiJ1bmRlZmluZWQiIT10eXBlb2YgcFsiZGVmYXVsdCJdLm1hc2gsaj0hIWhbImRlZmF1bHQiXSxNPWomJiJmdW5jdGlvbiI9PXR5cGVvZiBoWyJkZWZhdWx0Il0ub3BlbkluRXh0ZXJuYWxCcm93c2VyLEU9ISFmWyJkZWZhdWx0Il0sST1FJiYiZnVuY3Rpb24iPT10eXBlb2YgZlsiZGVmYXVsdCJdLm9wZW4sTj1qJiZmdW5jdGlvbigpe3ZhciBlPWhbImRlZmF1bHQiXS5nZXRTREtWZXJzaW9uKCkubWF0Y2goLyhcZCspXC4oXGQrKS4oXGQrKSQvKTtyZXR1cm4gZT9bZVsxXSxlWzJdLGVbM11dOnZvaWQgMH0oKSxTPWZ1bmN0aW9uKGUpe3JldHVybiBOJiYoMCxPWyJkZWZhdWx0Il0pKE4sZSk+PTB9LFI9MTUwfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdzt0WyJkZWZhdWx0Il09bn0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgTVNGQ2xpZW50JiZNU0ZDbGllbnQ7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIG1yYWlkJiZtcmFpZDt0WyJkZWZhdWx0Il09bn0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uJiZhbWF6b247dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LGk9bigxNCksYT1yKGkpLHM9ZnVuY3Rpb24oKXtpZighYVsiZGVmYXVsdCJdKXJldHVybiExO3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhWyJkZWZhdWx0Il0uZ2V0RG9jdW1lbnRDb29raWUoKSkuc3BsaXQoIjsiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuc3BsaXQoIj0iKTtuJiZuLmxlbmd0aD49MiYmKGVbblswXS50cmltKCldPW5bMV0udHJpbSgpKX0pLHt2Oi9cImF2XCI6XCIoWy5cZF0qKVwiL2kudGVzdChlWyJhbXpuLWFwcC1jdHh0Il0pfX0oKTtyZXR1cm4ib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIGU/InVuZGVmaW5lZCI6byhlKSk/ZS52OnZvaWQgMH0oKTt0WyJkZWZhdWx0Il09c30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE5KSxpPXIobyksYT0vaVBob25lfGlQYWR8aVBvZC8udGVzdChpWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT1hfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTQpLGk9cihvKSxhPW4oMjApLHM9cihhKSx1PWlbImRlZmF1bHQiXSYmaVsiZGVmYXVsdCJdLmdldFVzZXJBZ2VudEluZm8oKXx8c1siZGVmYXVsdCJdJiZzWyJkZWZhdWx0Il0udXNlckFnZW50O3RbImRlZmF1bHQiXT11fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvcjt0WyJkZWZhdWx0Il09bn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE5KSxpPXIobyksYT0vQW5kcm9pZC8udGVzdChpWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT1hfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7bj5yO3IrKyl7dmFyIG89ZVtyXSxpPXRbcl07aWYobz5pKXJldHVybiAxO2lmKGk+bylyZXR1cm4tMX1yZXR1cm4gMH1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IkFNUyI7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGJ0b2E/YnRvYShEYXRlLm5vdygpKygiOyIrZSkpOiIifU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0WyJkZWZhdWx0Il09bjt0LkNPVVBPTl9UT0tFTl9NQUNSTz0iVlBDX0NTX01BQ1JPIn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXZhciBvPW4oMjUpLGk9cihvKSxhPW4oMjYpLHM9cihhKSx1PS9eLipcL1wvW15cL10rLztlLmV4cG9ydHM9e3N1cHBvcnQ6e2ZsZXhib3g6ZnVuY3Rpb24oKXtyZXR1cm4gTW9kZXJuaXpyJiYoTW9kZXJuaXpyLmZsZXhib3h8fE1vZGVybml6ci5mbGV4Ym94bGVnYWN5fHxNb2Rlcm5penIuZmxleGJveHR3ZWVuZXIpfX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuc3BsaXQoIi4iKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj10Lm1hdGNoKC8oLiopXFsoXGQqKVxdLykscj1uJiZuWzFdLG89biYmblsyXTtyZXR1cm4gciYmbz9lW3JdW3BhcnNlSW50KG8sMTApXTplW3RdfSxlKX0sZ2V0TWVkaWFDZW50cmFsSW1hZ2VTcmM6ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciBvPWlbImRlZmF1bHQiXS51cmxzLk1FRElBX0NFTlRSQUxfV1csYT1lLnJlcGxhY2UodSwiIiksbD1vKygwPT09YS5pbmRleE9mKCIvIik/IiI6Ii8iKSthLHA9e30sYz1yPzI6MTtyZXR1cm4gdC5hYyYmKHAuQUM9ITApLHQuc3gmJihwLlNYPXQuc3gqYyksdC5zeSYmKHAuU1k9dC5zeSpjKSx0LnFsJiYocC5RTD10LnFsKSx0LmZtJiYocC5GTT10LmZtKSxzWyJkZWZhdWx0Il0uc2V0VGFncyhsLHAsWyJBQyIsIlNYIiwiU1kiLCJGTSIsIlFMIl0sbil9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXt1cmxzOntNRURJQV9DRU5UUkFMX1dXOiJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbSIsTUVESUFfQ0VOVFJBTF9DTjoiaHR0cHM6Ly9pbWFnZXMtY24uc3NsLWltYWdlcy1hbWF6b24uY29tIn19fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e3NldFRhZ3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89L1wuXyhbXlwuXSspKD89X1wuXHcrJCkvLGk9by5leGVjKGUpLGE9aT9pWzFdLnNwbGl0KCJfIik6W10scz1PYmplY3QuYXNzaWduKHt9LHQpLHU9W107ciYmYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCIiIT09ZSl7dmFyIHQsbj1lLnN1YnN0cmluZygwLDIpOyJ1bmRlZmluZWQiIT10eXBlb2Ygc1tuXT8oc1tuXT09PSExJiYoc1tuXT1udWxsKSxuPW51bGwpOnQ9ZS5zdWJzdHJpbmcoMixlLmxlbmd0aCksbnVsbCE9PW4mJnUucHVzaChuK3QpfX0pLG4uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1zW2VdO3QmJnUucHVzaChlKyh0PT09ITA/IiI6dCkpfSk7dmFyIGw9LTE7dS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7IkNSIj09PWUuc3Vic3RyaW5nKDAsMikmJihsPXQpfSk7dmFyIHA9ITE7aWYobD49MCl7dmFyIGM9dS5zcGxpY2UobCwxKTt1LnVuc2hpZnQoY1swXSkscD0hMH12YXIgZj11LmluZGV4T2YoIkFDIik7aWYoZj4wKXt2YXIgZD11LnNwbGljZShmLDEpO3A/dS5zcGxpY2UoMSwwLGRbMF0pOnUudW5zaGlmdChkWzBdKX1yZXR1cm4gdS5sZW5ndGg+MCYmKGU9YS5sZW5ndGg+MD9lLnJlcGxhY2UobywiLl8iK3Uuam9pbigiXyIpKTplLnJlcGxhY2UoL1wuKD89XHcrJCkvLCIuXyIrdS5qb2luKCJfIikrIl8uIikpLGV9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDI0KSxjPXIocCksZj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe28odGhpcyx0KTt2YXIgbj1pKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc3RhdGU9e2Nsb2FrOm4uZXh0cmFjdE1ldGFkYXRhKGUuYmxvY2ssImNsb2FrIil9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2V0U3RhdGUoe2Nsb2FrOiExfSl9fSx7a2V5OiJnZXRDbGFzc05hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ImJsb2NrIix0PSIiO3RoaXMucHJvcHMuYmxvY2suY3NzQ2xhc3NlcyYmKHQ9dGhpcy5wcm9wcy5ibG9jay5jc3NDbGFzc2VzLmpvaW4oIiAiKSksIiIhPT10JiYoZSs9IiAiK3QpO3ZhciBuPXRoaXMucHJvcHMuYmxvY2subGF5b3V0O3JldHVybiBuJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPW5bdF07Imp1c3RpZnlDb250ZW50Ij09PXQmJiJmbGV4LXN0YXJ0IiE9PXI/ZSs9IiBibG9jay0tanVzdGlmeS0iK3I6ImFsaWduSXRlbXMiPT09dCYmInN0cmV0Y2giIT09cj9lKz0iIGJsb2NrLS1hbGlnbi0iK3I6ImZsZXhEaXJlY3Rpb24iPT09dCYmInJvdyIhPT1yJiYoZSs9IiBibG9jay0tZGlyZWN0aW9uLSIrcil9KSx0aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQmJnRoaXMucHJvcHMuYmxvY2suYmFja2dyb3VuZC5pZCYmKGUrPSIgYmxvY2stLWJhY2tncm91bmQiKSx0aGlzLnN0YXRlLmNsb2FrJiYoZSs9IiBoLWNsb2FrIiksZX19LHtrZXk6InByZXZlbnRQcm9wZXJ0eSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCYmIiIhPT10PyJqdXN0aWZ5Q29udGVudCI9PT1lfHwiYWxpZ25JdGVtcyI9PT1lfHwiZmxleERpcmVjdGlvbiI9PT1lOiEwfX0se2tleToiZ2V0QmxvY2tMYXlvdXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMucHJvcHMuYmxvY2subGF5b3V0LG49e307cmV0dXJuIHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIG89dFtyXTtlLnByZXZlbnRQcm9wZXJ0eShyLG8pfHwobltyXT1vKX0pLG59fSx7a2V5OiJnZXRCbG9ja1N0eWxlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMuYmxvY2suc3R5bGUsdD17fTtyZXR1cm4gZSYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPWUudmFsdWU7InVuZGVmaW5lZCIhPXR5cGVvZiB0W2UubmFtZV0mJihuPXRbZS5uYW1lXSsiOyIrZS5uYW1lKyI6IituKSx0W2UubmFtZV09bn0pLHR9fSx7a2V5OiJnZXRQcm9wVmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuInBhdGgiPT09dC50eXBlP2NbImRlZmF1bHQiXS5nZXQoZSx0LnZhbHVlKToiY29uc3RhbnQiPT09dC50eXBlP3QudmFsdWU6bnVsbH19LHtrZXk6ImdldENvbXBvbmVudFByb3BzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49e307cmV0dXJuIGUucHJvcHMmJmUucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtuW2UubmFtZV09dC5nZXRQcm9wVmFsdWUodC5wcm9wcy5yZW5kZXJpbmdDb250ZXh0LGUpfSksbn19LHtrZXk6ImV4dHJhY3RNZXRhZGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj12b2lkIDA7cmV0dXJuIGUubWV0YWRhdGEuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYobj1lLnZhbHVlKX0pLG59fSx7a2V5OiJzZXRSZWYiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssInJlZiIpO3QmJnRoaXMucHJvcHMuZG9tUmVmcyYmKHRoaXMucHJvcHMuZG9tUmVmc1t0XT1lKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dGhpcy5leHRyYWN0TWV0YWRhdGEodGhpcy5wcm9wcy5ibG9jaywiaGlkZSIpLHI9dGhpcy5leHRyYWN0TWV0YWRhdGEodGhpcy5wcm9wcy5ibG9jaywiaWQiKSxvPXZvaWQgMCxpPXZvaWQgMCxhPXZvaWQgMCxzPXZvaWQgMCx1PXZvaWQgMCxwPXZvaWQgMCxjPXZvaWQgMDtpZighbil7bz10aGlzLmdldENsYXNzTmFtZSgpO3ZhciBmPXRoaXMuZ2V0QmxvY2tMYXlvdXQoKSxkPXRoaXMuZ2V0QmxvY2tTdHlsZSgpO2k9T2JqZWN0LmFzc2lnbih7fSxmLGQpLGE9W107dmFyIGg9dGhpcy5wcm9wcy5ibG9jay5jaGlsZHJlbjtoJiZoLmZvckVhY2goZnVuY3Rpb24obil7YS5wdXNoKGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHQse3JlbmRlcmluZ0NvbnRleHQ6ZS5wcm9wcy5yZW5kZXJpbmdDb250ZXh0LGJsb2NrOm4sY29tcG9uZW50c01hcDplLnByb3BzLmNvbXBvbmVudHNNYXAsZG9tUmVmczplLnByb3BzLmRvbVJlZnMsa2V5Om4uaWR9KSl9KTt2YXIgeT10aGlzLnByb3BzLmJsb2NrLmNvbXBvbmVudDt5JiYodT10aGlzLnByb3BzLmNvbXBvbmVudHNNYXBbeS5pZF0scz10aGlzLmdldENvbXBvbmVudFByb3BzKHkpKTt2YXIgbT10aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQ7bSYmKGM9dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwW20uaWRdLHA9dGhpcy5nZXRDb21wb25lbnRQcm9wcyhtKSl9cmV0dXJuIW4mJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtpZDpyLGNsYXNzTmFtZTpvLHN0eWxlOmkscmVmOmZ1bmN0aW9uKHQpe2Uuc2V0UmVmKHQpfX0sYyYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYmxvY2tfX2JhY2tncm91bmQifSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjLHApKSxhLmxlbmd0aD4wP2E6dSYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQodSxzKSl9fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09ZixmLmRpc3BsYXlOYW1lPSJCbG9jayIsZi5wcm9wVHlwZXM9e3JlbmRlcmluZ0NvbnRleHQ6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsYmxvY2s6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY29tcG9uZW50c01hcDp1LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxkb21SZWZzOnUuUHJvcFR5cGVzLm9iamVjdH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz0xOTksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7bih0aGlzLGUpLHRoaXMubW9kZWw9dCx0aGlzLmJsb2Nrc01hcD17fSx0aGlzLl9idWlsZEJsb2Nrc01hcCgpfXJldHVybiByKGUsW3trZXk6Il9idWlsZEJsb2Nrc01hcCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXt9O2UucHVzaCh0aGlzLm1vZGVsKTtmb3IodmFyIG49MDtlLmxlbmd0aD4wOyl7dmFyIHI9ZS5zaGlmdCgpLGk9dGhpcy5fZ2V0UmVmSWQocik7aWYoIiIhPT1pJiYodGhpcy5ibG9ja3NNYXBbaV09ciksdFtyLmlkXXx8KHRbci5pZF09ITAsZT1lLmNvbmNhdChyLmNoaWxkcmVufHxbXSkpLG4rKyxuPm8pYnJlYWt9fX0se2tleToiX2dldFJlZklkIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD12b2lkIDA7cmV0dXJuIGUubWV0YWRhdGEuZm9yRWFjaChmdW5jdGlvbihlKXsicmVmIj09PWUubmFtZSYmKHQ9ZS52YWx1ZSl9KSx0fX0se2tleToiaGlkZUJsb2NrIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmxvY2tzTWFwW2VdO24mJm4ubWV0YWRhdGEuZm9yRWFjaChmdW5jdGlvbihlKXsiaGlkZSI9PT1lLm5hbWUmJihlLnZhbHVlPXQpfSl9fSx7a2V5OiJhZGRCbG9ja1N0eWxlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5ibG9ja3NNYXBbZV07ciYmKHIuc3R5bGU9ci5zdHlsZXx8W10sci5zdHlsZS5wdXNoKHtuYW1lOnQsdmFsdWU6bn0pKX19LHtrZXk6ImFkZENzc0NsYXNzIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmxvY2tzTWFwW2VdO24mJihuLmNzc0NsYXNzZXM9bi5jc3NDbGFzc2VzfHxbXSxuLmNzc0NsYXNzZXMucHVzaCh0KSl9fSx7a2V5OiJnZXRDb21wb25lbnRQcm9wIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmxvY2tzTWFwW2VdLHI9bnVsbDtyZXR1cm4gbiYmbi5jb21wb25lbnQmJm4uY29tcG9uZW50LnByb3BzJiZuLmNvbXBvbmVudC5wcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubmFtZT09PXQmJihyPWUpfSkscn19LHtrZXk6InNldENvbXBvbmVudFByb3AiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXMuYmxvY2tzTWFwW2VdO2lmKG8mJm8uY29tcG9uZW50KXt2YXIgaT0hMTtvLmNvbXBvbmVudC5wcm9wcz1vLmNvbXBvbmVudC5wcm9wc3x8W10sby5jb21wb25lbnQucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYoZS52YWx1ZT1uLGUudHlwZT1yLGk9ITApfSksaXx8by5jb21wb25lbnQucHJvcHMucHVzaCh7bmFtZTp0LHZhbHVlOm4sdHlwZTpyfSl9fX0se2tleToic2V0Q3NzQ2xhc3NlcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiYobi5jc3NDbGFzc2VzPW4uY3NzQ2xhc3Nlc3x8W10sQXJyYXkuaXNBcnJheSh0KT9uLmNzc0NsYXNzZXM9dDpuLmNzc0NsYXNzZXMucHVzaCh0KSl9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWl9LCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzQpLGM9cihwKSxmPW4oMzUpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtleHRlbmRDb250YWluZXJIZWlnaHQ6dGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQsYWxpZ25tZW50OnRoaXMucHJvcHMuYWxpZ25tZW50LG1heEhlaWdodDp0aGlzLnByb3BzLmhlaWdodH0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoZFsiZGVmYXVsdCJdLHthZGRpdGlvbmFsQ2xhc3M6dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3MscGF0aDp0aGlzLnByb3BzLnBhdGgsd2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsc3g6dGhpcy5wcm9wcy5zeCxzeTp0aGlzLnByb3BzLnN5LHFsOnRoaXMucHJvcHMucWwscmV0aW5hOnRoaXMucHJvcHMucmV0aW5hLGFjOnRoaXMucHJvcHMuYWMsZm06dGhpcy5wcm9wcy5mbSxtZXJnZVRhZ3M6dGhpcy5wcm9wcy5tZXJnZVRhZ3MsYWx0OnRoaXMucHJvcHMuYWx0LHNwcml0ZTp0aGlzLnByb3BzLnNwcml0ZSxyb2xlOnRoaXMucHJvcHMucm9sZSx0aXRsZTp0aGlzLnByb3BzLnRpdGxlLHN0eWxlOnRoaXMucHJvcHMuc3R5bGUsb25Mb2FkOnRoaXMucHJvcHMub25Mb2FkfSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJpbWFnZUNvbnRhaW5lciIsIm1lZGlhQ2VudHJhbEltYWdlIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJNZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIsaC5wcm9wVHlwZXM9e2FkZGl0aW9uYWxDbGFzczp1LlByb3BUeXBlcy5zdHJpbmcscGF0aDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxleHRlbmRDb250YWluZXJIZWlnaHQ6dS5Qcm9wVHlwZXMuYm9vbCxhbGlnbm1lbnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIscmV0aW5hOnUuUHJvcFR5cGVzLmJvb2wsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsZm06dS5Qcm9wVHlwZXMuc3RyaW5nLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGFsdDp1LlByb3BUeXBlcy5zdHJpbmcsc3ByaXRlOnUuUHJvcFR5cGVzLmJvb2wscm9sZTp1LlByb3BUeXBlcy5zdHJpbmcsdGl0bGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxvbkxvYWQ6dS5Qcm9wVHlwZXMuZnVuYyxtYXhIZWlnaHQ6dS5Qcm9wVHlwZXMubnVtYmVyfSxoLmRlZmF1bHRQcm9wcz17cmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ImltYWdlQ29udGFpbmVyIisodGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQ/IiBpbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0IjoiIik7dGhpcy5wcm9wcy5hbGlnbm1lbnQmJiIiIT09dGhpcy5wcm9wcy5hbGlnbm1lbnQmJihlKz0iIGltYWdlQ29udGFpbmVyLS0iK3RoaXMucHJvcHMuYWxpZ25tZW50KTt2YXIgdD17fTtyZXR1cm4gdGhpcy5wcm9wcy5tYXhIZWlnaHQmJk9iamVjdC5hc3NpZ24odCx7bWF4SGVpZ2h0OnRoaXMucHJvcHMubWF4SGVpZ2h0fSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTplLHN0eWxlOnR9LGxbImRlZmF1bHQiXS5jbG9uZUVsZW1lbnQodGhpcy5wcm9wcy5jaGlsZHJlbix7YWRkaXRpb25hbENsYXNzOiJpbWFnZUNvbnRhaW5lcl9faW1hZ2UifSkpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPXAscC5kaXNwbGF5TmFtZT0iSW1hZ2VDb250YWluZXIiLHAucHJvcFR5cGVzPXtleHRlbmRDb250YWluZXJIZWlnaHQ6dS5Qcm9wVHlwZXMuYm9vbCxhbGlnbm1lbnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLG1heEhlaWdodDp1LlByb3BUeXBlcy5udW1iZXJ9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzYpLGM9KHIocCksbigyNCkpLGY9cihjKSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImdldEltYWdlU3JjIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZlsiZGVmYXVsdCJdLmdldE1lZGlhQ2VudHJhbEltYWdlU3JjKGUse2FjOnRoaXMucHJvcHMuYWMsc3g6dGhpcy5wcm9wcy5zeCxzeTp0aGlzLnByb3BzLnN5LGZtOnRoaXMucHJvcHMuZm0scWw6dGhpcy5wcm9wcy5xbH0sdGhpcy5wcm9wcy5tZXJnZVRhZ3MsdGhpcy5wcm9wcy5yZXRpbmEpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLmdldEltYWdlU3JjKHRoaXMucHJvcHMucGF0aCksbj0ibWVkaWFDZW50cmFsSW1hZ2UiKyh0aGlzLnByb3BzLmFkZGl0aW9uYWxDbGFzcz8iICIrdGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M6IiIpO2lmKHRoaXMucHJvcHMuc3ByaXRlKXt2YXIgcj1PYmplY3QuYXNzaWduKHt3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxiYWNrZ3JvdW5kSW1hZ2U6InVybCgnIit0KyInKSJ9LHRoaXMucHJvcHMuc3R5bGUpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOm4sc3R5bGU6cix0aXRsZTp0aGlzLnByb3BzLnRpdGxlfSl9cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJpbWciLHtjbGFzc05hbWU6bixzcmM6dCx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxhbHQ6dGhpcy5wcm9wcy5hbHQscm9sZTp0aGlzLnByb3BzLnJvbGUsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDpmdW5jdGlvbih0KXtlLnByb3BzLm9uTG9hZCYmZS5wcm9wcy5vbkxvYWQodC50YXJnZXQpfX0pfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iTWVkaWFDZW50cmFsSW1hZ2UiLGQucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsd2lkdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLGhlaWdodDp1LlByb3BUeXBlcy5zdHJpbmcsc3g6dS5Qcm9wVHlwZXMubnVtYmVyLHN5OnUuUHJvcFR5cGVzLm51bWJlcixyZXRpbmE6dS5Qcm9wVHlwZXMuYm9vbCxhYzp1LlByb3BUeXBlcy5ib29sLHFsOnUuUHJvcFR5cGVzLm51bWJlcixmbTp1LlByb3BUeXBlcy5zdHJpbmcsbWVyZ2VUYWdzOnUuUHJvcFR5cGVzLmJvb2wsYWx0OnUuUHJvcFR5cGVzLnN0cmluZyxzcHJpdGU6dS5Qcm9wVHlwZXMuYm9vbCxyb2xlOnUuUHJvcFR5cGVzLnN0cmluZyx0aXRsZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LG9uTG9hZDp1LlByb3BUeXBlcy5mdW5jfSxkLmRlZmF1bHRQcm9wcz17cmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigicmV0aW5hIG1vZHVsZXMgZXhwZWN0cyBhIGZ1bmN0aW9uIG9uUmV0aW5hU3RhdGVDaGFuZ2UgYWNjZXB0aW5nIGJvb2xlYW4iKTtpZih3aW5kb3cubWF0Y2hNZWRpYSl7dmFyIHQ9d2luZG93Lm1hdGNoTWVkaWEoIigtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLChtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSIpLG49ZnVuY3Rpb24odCl7cmV0dXJuIGUodC5tYXRjaGVzKX07dCYmbih0KSx0LmFkZExpc3RlbmVyJiZ0LmFkZExpc3RlbmVyKG4pfWVsc2UgZSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz4xPyEwOiExKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzOCksYz1yKHApLGY9OTk5LGQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLl9zZXRTdGF0ZShlKSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX3NldFN0YXRlKHRoaXMucHJvcHMpLHRoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5faGFuZGxlVGV4dE92ZXJmbG93KCl9fSx7a2V5OiJjb21wb25lbnREaWRVcGRhdGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5faGFuZGxlVGV4dE92ZXJmbG93KCl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSJ0ZXh0Q29udGFpbmVyX190ZXh0Ijt0Kz10aGlzLnByb3BzLmFkZGl0aW9uYWxDbGFzcz8iICIrdGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M6IiI7dmFyIG49e2ZvbnRTaXplOnRoaXMuc3RhdGUuZm9udC5tYXhGb250UHh9O3JldHVybiBPYmplY3QuYXNzaWduKG4sdGhpcy5wcm9wcy5zdHlsZSksdGhpcy5wcm9wcy50ZXh0P2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtyZWY6ZnVuY3Rpb24odCl7ZS5ub2RlPXR9LHN0eWxlOm4sY2xhc3NOYW1lOiJ0ZXh0Q29udGFpbmVyIisodGhpcy5zdGF0ZS51c2VDc3NUcnVuY2F0aW9uPyIgaC1lbGxpcHNpcyI6IiIpfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse3JlZjpmdW5jdGlvbih0KXtlLnNwYW49dH0sY2xhc3NOYW1lOnQsaWQ6dGhpcy5wcm9wcy50ZXh0SWR9LHRoaXMucHJvcHMudGV4dCkpOm51bGx9fSx7a2V5OiJfc2V0U3RhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5hc3NpZ24oe30sZS5mb250KTt0aGlzLnN0YXRlPXtmb250OnQsdXNlQ3NzVHJ1bmNhdGlvbjp0Lm1heExpbmVzPzE9PT10Lm1heExpbmVzOiEwLG5lZWRzVGl0bGVBdHRyaWJ1dGU6ITEsb3JpZ2luYWxUZXh0OmUudGV4dH19fSx7a2V5OiJfc2hvd1Rvb2x0aXAiLHZhbHVlOmZ1bmN0aW9uKGUpe2U/KDAsY1siZGVmYXVsdCJdKSh0aGlzLnNwYW4pLmF0dHIoInRpdGxlIix0aGlzLnN0YXRlLm9yaWdpbmFsVGV4dCk6KDAsY1siZGVmYXVsdCJdKSh0aGlzLnNwYW4pLnJlbW92ZUF0dHIoInRpdGxlIil9fSx7a2V5OiJfaGFuZGxlVGV4dE92ZXJmbG93Iix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMubm9kZSlpZih0aGlzLnN0YXRlLnVzZUNzc1RydW5jYXRpb24pe3ZhciBlPSgwLGNbImRlZmF1bHQiXSkodGhpcy5ub2RlKTt0aGlzLl9zaG93VG9vbHRpcChlLnRleHRPdmVyZmxvdygpKX1lbHNlIHRoaXMuX3RydW5jYXRlTXVsdGlMaW5lVGV4dCgpfX0se2tleToiX3RydW5jYXRlTXVsdGlMaW5lVGV4dCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0iLi4uIix0PSgwLGNbImRlZmF1bHQiXSkodGhpcy5ub2RlKTt0aGlzLnNwYW4uaW5uZXJIVE1MPXRoaXMuc3RhdGUub3JpZ2luYWxUZXh0O3ZhciBuPSgwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5kZWNvZGVFbnRpdGllcygpO3RoaXMubm9kZS5zdHlsZS5mb250U2l6ZT10aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4KyJweCI7Zm9yKHZhciByPXRoaXMuc3Bhbi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCxvPXRoaXMuc3RhdGUuZm9udC5tYXhGb250UHgsaT0hMSxhPTA7cj50aGlzLnN0YXRlLmZvbnQubWF4TGluZXN8fHQuY2hpbGRyZW5PdmVyZmxvdygpOyl7aWYobzw9dGhpcy5zdGF0ZS5mb250Lm1pbkZvbnRQeCl7aXx8KG4rPWUsaT0hMCk7dmFyIHM9bi5sZW5ndGg7bj1uLnN1YnN0cigwLHMtZS5sZW5ndGgtMSkrZSx0aGlzLnNwYW4uaW5uZXJIVE1MPW59ZWxzZSBvLS0sdGhpcy5ub2RlLnN0eWxlLmZvbnRTaXplPW8rInB4IjtpZihyPXRoaXMuc3Bhbi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCxhKyssYT5mKWJyZWFrfXRoaXMuX3Nob3dUb29sdGlwKGkpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iVGV4dENvbnRhaW5lciIsZC5wcm9wVHlwZXM9e3RleHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFkZGl0aW9uYWxDbGFzczp1LlByb3BUeXBlcy5zdHJpbmcsZm9udDp1LlByb3BUeXBlcy5vYmplY3QsdGV4dElkOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7bih0aGlzLGUpLHRoaXMubm9kZT10fXJldHVybiByKGUsW3trZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubm9kZVtlXX19LHtrZXk6ImZpbmQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0aGlzLm5vZGUucXVlcnlTZWxlY3RvckFsbCh0KSl9fSx7a2V5OiJwYXJlbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMubm9kZS5wYXJlbnROb2RlKX19LHtrZXk6ImNoaWxkcmVuIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLm5vZGUuY2hpbGRyZW4pfX0se2tleToiY3NzIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubm9kZVswXXx8dGhpcy5ub2RlLHI9bi5nZXRBdHRyaWJ1dGUoInN0eWxlIiksbz1yP3Iuc3BsaXQoIjsiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BsaXQoIjoiKX0pOltdLGk9e307by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2VbMF0mJiIiIT09ZVswXSYmKGlbZVswXV09ZVsxXSl9KSxpW2VdPXQ7dmFyIGE9IiI7cmV0dXJuIE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7YSs9ZSsiOiIraVtlXSsiOyJ9KSxuLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpLHRoaXN9fSx7a2V5OiJhdHRyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdD8odGhpcy5ub2RlLnNldEF0dHJpYnV0ZShlLHQpLHRoaXMubm9kZSk6dGhpcy5ub2RlLmdldEF0dHJpYnV0ZShlKX19LHtrZXk6InJlbW92ZUF0dHIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGUucmVtb3ZlQXR0cmlidXRlKGUpLHRoaXMubm9kZX19LHtrZXk6Im91dGVySGVpZ2h0Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMubm9kZS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGUmJih0PWdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKSxuKz1wYXJzZUludCh0Lm1hcmdpblRvcCkrcGFyc2VJbnQodC5tYXJnaW5Cb3R0b20pKSxufX0se2tleToib3V0ZXJXaWR0aCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLm5vZGUub2Zmc2V0V2lkdGg7cmV0dXJuIGUmJih0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSksCm4rPXdpbmRvdy5wYXJzZUludCh0Lm1hcmdpbkxlZnQsMTApK3dpbmRvdy5wYXJzZUludCh0Lm1hcmdpblJpZ2h0LDEwKSksbn19LHtrZXk6InRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS50ZXh0Q29udGVudHx8dGhpcy5ub2RlLmlubmVySFRNTHx8IiJ9fSx7a2V5OiJjaGlsZHJlbk92ZXJmbG93Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3V0ZXJXaWR0aCghMCksbj0wO3JldHVybiB0aGlzLmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbih0KXtuKz1uZXcgZSh0KS5vdXRlcldpZHRoKCEwKX0pLC0xPnQtbn19LHtrZXk6InRleHRPdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdXRlcldpZHRoKCEwKTx0aGlzLm5vZGUuc2Nyb2xsV2lkdGh9fSx7a2V5OiJkZWNvZGVFbnRpdGllcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZih0aGlzLm5vZGUuaW5uZXJIVE1MKXt2YXIgdD10aGlzLm5vZGUuaW5uZXJIVE1MO3JldHVybiB0PXQucmVwbGFjZSgvPHNjcmlwdFtePl0qPihbXFNcc10qPyk8XC9zY3JpcHQ+L2dpbSwiIiksdD10LnJlcGxhY2UoLzxcLz9cdyg/OlteIic+XXwiW14iXSoifCdbXiddKicpKj4vZ2ltLCIiKSx0PXQucmVwbGFjZSgvXHUwMGEwL2csIiAiKSxlLmlubmVySFRNTD10LHQ9ZS50ZXh0Q29udGVudHx8ZS5pbm5lckhUTUx8fCIiLGUudGV4dENvbnRlbnQ9IiIsdH1yZXR1cm4iIn19XSksZX0oKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBvKGUpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM3KSxjPXIocCksZj1uKDcpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0idGV4dExpbmsiKyh0aGlzLnByb3BzLmRpc3BsYXlBc1RleHQ/IiB0ZXh0TGluay0tZGlzcGxheUFzVGV4dCI6IiIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZTplfX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtmb250OnRoaXMucHJvcHMuZm9udCx0ZXh0OnRoaXMucHJvcHMudGV4dCxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLHRleHRJZDp0aGlzLnByb3BzLnRleHRJZH0pKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsidGV4dENvbnRhaW5lciIsImNsaWNrdGhyb3VnaExpbmsiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRleHRMaW5rIixoLnByb3BUeXBlcz17dGV4dDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxmb250OnUuUHJvcFR5cGVzLm9iamVjdCx0ZXh0SWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGRpc3BsYXlBc1RleHQ6dS5Qcm9wVHlwZXMuYm9vbCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzMpLGM9cihwKSxmPW4oNyksZD1yKGYpLGg9bigzNykseT1yKGgpLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJhc2luSW1hZ2UiO3JldHVybiBlKz10aGlzLnByb3BzLmV4dGVuZENvbnRhaW5lckhlaWdodD8iIGFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0IjoiIixlKz10aGlzLnByb3BzLmRlc2NyaXB0aW9uPyIgYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb24iOiIiLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHsiZGF0YS1hc2luIjp0aGlzLnByb3BzLmFzaW4sY2xhc3NOYW1lOmV9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOmV9fSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3BhdGg6dGhpcy5wcm9wcy5wYXRoLGFsdDp0aGlzLnByb3BzLmFsdCxzcHJpdGU6dGhpcy5wcm9wcy5zcHJpdGUsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0LHdpZHRoOnRoaXMucHJvcHMud2lkdGgsaGVpZ2h0OnRoaXMucHJvcHMuaGVpZ2h0LHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxxbDp0aGlzLnByb3BzLnFsLHJldGluYTp0aGlzLnByb3BzLnJldGluYSxhYzp0aGlzLnByb3BzLmFjLG1lcmdlVGFnczp0aGlzLnByb3BzLm1lcmdlVGFncyx0aXRsZTp0aGlzLnByb3BzLnRpdGxlLHN0eWxlOnRoaXMucHJvcHMuc3R5bGUsb25Mb2FkOnRoaXMucHJvcHMub25Mb2FkfSksdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoeVsiZGVmYXVsdCJdLHt0ZXh0OnRoaXMucHJvcHMuZGVzY3JpcHRpb24sZm9udDp0aGlzLnByb3BzLmRlc2NyaXB0aW9uRm9udH0pKSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIm1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyIiwiY2xpY2t0aHJvdWdoTGluayIsInRleHRDb250YWluZXIiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1tLG0uZGlzcGxheU5hbWU9IkFzaW5JbWFnZSIsbS5wcm9wVHlwZXM9e2hyZWY6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQscGF0aDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxleHRlbmRDb250YWluZXJIZWlnaHQ6dS5Qcm9wVHlwZXMuYm9vbCxhbHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHNwcml0ZTp1LlByb3BUeXBlcy5ib29sLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIsd2lkdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLGhlaWdodDp1LlByb3BUeXBlcy5zdHJpbmcsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsbWVyZ2VUYWdzOnUuUHJvcFR5cGVzLmJvb2wsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLGRlc2NyaXB0aW9uOnUuUHJvcFR5cGVzLnN0cmluZyxkZXNjcmlwdGlvbkZvbnQ6dS5Qcm9wVHlwZXMub2JqZWN0LHRpdGxlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3Qsb25Mb2FkOnUuUHJvcFR5cGVzLmZ1bmMsYXNpbjp1LlByb3BUeXBlcy5zdHJpbmd9LG0uZGVmYXVsdFByb3BzPXthYzohMCxyZXRpbmE6ITB9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oNyksYz1yKHApLGY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJwcmljZSI7ZSs9dGhpcy5wcm9wcy5pc0p1bWJvPyIgcHJpY2UtLWp1bWJvIjoiIixlKz10aGlzLnByb3BzLmlzTGlzdD8iIHByaWNlLS1saXN0IjoiIixlKz10aGlzLnByb3BzLmFkZGl0aW9uYWxDbGFzcz8iICIrdGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M6IiI7dmFyIHQ9IiI7aWYodGhpcy5wcm9wcy5pc0p1bWJvKXt2YXIgbj10aGlzLnByb3BzLnByaWNlSW5mby53aG9sZUFtb3VudCxyPXRoaXMucHJvcHMucHJpY2VJbmZvLmRlY2ltYWxQYXJ0O3Q9bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvQ3VycmVuY3kifSx0aGlzLnByb3BzLmN1cnJlbmN5KSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvSW50ZWdlckFtb3VudCJ9LG4pLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZV9fanVtYm9EZWNpbWFsQW1vdW50In0scikpfWVsc2UgdD1sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZTplLHN0eWxlOnRoaXMucHJvcHMuc3R5bGV9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZV9fY3VycmVuY3kifSx0aGlzLnByb3BzLmN1cnJlbmN5KSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2Ftb3VudCJ9LHRoaXMucHJvcHMuYW1vdW50KSk7cmV0dXJuIHRoaXMucHJvcHMuaHJlZiYmdGhpcy5wcm9wcy5jbGlja1VybHM/bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InByaWNlIn19LHQpOnR9fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09ZixmLmRpc3BsYXlOYW1lPSJQcmljZSIsZi5wcm9wVHlwZXM9e2FkZGl0aW9uYWxDbGFzczp1LlByb3BUeXBlcy5zdHJpbmcsYW1vdW50OnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGN1cnJlbmN5OnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGlzSnVtYm86dS5Qcm9wVHlwZXMuYm9vbCxwcmljZUluZm86dS5Qcm9wVHlwZXMub2JqZWN0LGlzTGlzdDp1LlByb3BUeXBlcy5ib29sLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZyxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM1KSxjPXIocCksZj1uKDQzKSxkPXIoZiksaD1uKDcpLHk9cihoKSxtPSIvaW1hZ2VzL0cvJHttZWRpYX0vZGEvY3JlYXRpdmVzL3ByaW1lLTJ4LTIwMTcwNjE0LnBuZyIsYj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRQcmltZUxvZ29QYXRoIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZFsiZGVmYXVsdCJdLmNvbXBpbGUobSx7bWVkaWE6ZX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0UHJpbWVMb2dvUGF0aCh0aGlzLnByb3BzLm1lZGlhKSx0PWxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7cGF0aDplLHdpZHRoOiI0MyIsaGVpZ2h0OiIxMiIsYWx0OiJQcmltZSIsYWRkaXRpb25hbENsYXNzOiJwcmltZUxvZ28iLHN0eWxlOnRoaXMucHJvcHMuc3R5bGV9KTtyZXR1cm4gdGhpcy5wcm9wcy5ocmVmJiZ0aGlzLnByb3BzLmNsaWNrVXJscz9sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCh5WyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZToicHJpbWVMb2dvIn19LHQpOnR9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIm1lZGlhQ2VudHJhbEltYWdlIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09YixiLmRpc3BsYXlOYW1lPSJQcmltZUxvZ28iLGIucHJvcFR5cGVzPXttZWRpYTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZyxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX12YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe24odGhpcyxlKX1yZXR1cm4gcihlLFt7a2V5OiJjb21waWxlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QuaGFzT3duUHJvcGVydHkobikmJihlPWUucmVwbGFjZShuZXcgUmVnRXhwKCJcXCR7IituKyJ9IiwiZyIpLHRbbl0pKX0pLGV9fV0pLGV9KCk7ZS5leHBvcnRzPW5ldyBvfSwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDQxKSxjPXIocCksZj0hMSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnRheE1lc3NhZ2UmJiIiIT09dGhpcy5wcm9wcy50YXhNZXNzYWdlO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VCb3giLHN0eWxlOnRoaXMucHJvcHMuc3R5bGV9LHRoaXMucHJvcHMubGlzdEFtb3VudCYmZiYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHthbW91bnQ6dGhpcy5wcm9wcy5saXN0QW1vdW50LGN1cnJlbmN5OnRoaXMucHJvcHMuY3VycmVuY3ksaXNMaXN0OiEwLGFkZGl0aW9uYWxDbGFzczoicHJpY2VCb3hfX2xpc3QiLHN0eWxlOnRoaXMucHJvcHMubGlzdFByaWNlU3R5bGV9KSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se2Ftb3VudDp0aGlzLnByb3BzLmJ1eUFtb3VudCxjdXJyZW5jeTp0aGlzLnByb3BzLmN1cnJlbmN5LGFkZGl0aW9uYWxDbGFzczoicHJpY2VCb3hfX2J1eSIsc3R5bGU6dGhpcy5wcm9wcy5idXlQcmljZVN0eWxlfSksZSYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlQm94X190YXhNZXNzYWdlIn0sdGhpcy5wcm9wcy50YXhNZXNzYWdlKSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInByaWNlIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09ZCxkLmRpc3BsYXlOYW1lPSJQcmljZUJveCIsZC5wcm9wVHlwZXM9e2J1eUFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxsaXN0QW1vdW50OnUuUHJvcFR5cGVzLnN0cmluZyxjdXJyZW5jeTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCx0YXhNZXNzYWdlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsYnV5UHJpY2VTdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsbGlzdFByaWNlU3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sLCwsLCwsLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oNSksYz1yKHApLGY9bigyOCksZD1yKGYpLGg9bigzOCkseT1yKGgpLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0cnVjdHVyZT1uZXcgZFsiZGVmYXVsdCJdKG4uZ2V0U3RydWN0dXJlcygpKSxuLmluaXRTdHJ1Y3R1cmUoZSksbi5jb21wb25lbnRzTWFwPW4uZ2V0Q29tcG9uZW50c01hcCgpLG4uZG9tUmVmcz17fSxuLnN0YXRlPXtzaG93TGlzdFByaWNlOiEwfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJpbml0U3RydWN0dXJlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmZvcm1hdHRlZFByaWNlJiYiIiE9PWUuZm9ybWF0dGVkUHJpY2UmJiFlLmlzRGlnaXRhbDt0aGlzLnN0cnVjdHVyZS5oaWRlQmxvY2soInByaWNlQm94IiwhdCk7dmFyIG49dCYmZS5pc1ByaW1lO2lmKHRoaXMuc3RydWN0dXJlLmhpZGVCbG9jaygicHJpbWVMb2dvIiwhbiksIkpQIj09PXRoaXMucHJvcHMubWFya2V0UGxhY2Upe3ZhciByPXRoaXMuc3RydWN0dXJlLmdldENvbXBvbmVudFByb3AoImhlYWRsaW5lIiwic3R5bGUiKTtyJiYoci52YWx1ZS5mb250U3R5bGU9Im5vcm1hbCIsdGhpcy5zdHJ1Y3R1cmUuc2V0Q29tcG9uZW50UHJvcCgiaGVhZGxpbmUiLCJzdHlsZSIsci52YWx1ZSwiY29uc3RhbnQiKSl9ZS5tb2JpbGVIZWFkbGluZSYmdGhpcy5zdHJ1Y3R1cmUuc2V0Q29tcG9uZW50UHJvcCgiaGVhZGxpbmUiLCJ0ZXh0IiwibW9iaWxlSGVhZGxpbmUiLCJwYXRoIil9fSx7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRvbVJlZnMucHJpY2luZyYmdGhpcy5zZXRTdGF0ZSh7c2hvd0xpc3RQcmljZTohKDAseVsiZGVmYXVsdCJdKSh0aGlzLmRvbVJlZnMucHJpY2luZykuY2hpbGRyZW5PdmVyZmxvdygpfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zdGF0ZS5zaG93TGlzdFByaWNlP3RoaXMucHJvcHMuZm9ybWF0dGVkTGlzdFByaWNlOm51bGw7cmV0dXJuIHRoaXMuc3RydWN0dXJlLnNldENvbXBvbmVudFByb3AoInByaWNlQm94IiwibGlzdEFtb3VudCIsZSwiY29uc3RhbnQiKSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se2NsYXNzTmFtZToibW9iaWxlTXlzdGlxdWUiLHJlbmRlcmluZ0NvbnRleHQ6dGhpcy5wcm9wcyxzdHJ1Y3R1cmU6dGhpcy5zdHJ1Y3R1cmUubW9kZWwsY29tcG9uZW50c01hcDp0aGlzLmNvbXBvbmVudHNNYXAsZG9tUmVmczp0aGlzLmRvbVJlZnMsdXBkYXRlT25SZXNpemU6ITB9KX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1tLG0uVEVNUExBVEVfSUQ9Im1vYmlsZU15c3RpcXVlIixtLmRpc3BsYXlOYW1lPSJNb2JpbGVNeXN0aXF1ZSIsbS5wcm9wVHlwZXM9e319LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD0ocih1KSxuKDk5KSkscD1yKGwpLGM9bigxMDEpLGY9cihjKSxkPW4oMTAyKSxoPXIoZCkseT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRTdHJ1Y3R1cmVzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybigwLGZbImRlZmF1bHQiXSkoKX19LHtrZXk6ImdldENvbXBvbmVudHNNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuQ09NUE9ORU5UU19NQVB9fV0pLHR9KHBbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPXkseS5DT01QT05FTlRTX01BUD1oWyJkZWZhdWx0Il0seS5kaXNwbGF5TmFtZT0iTW9iaWxlTXlzdGlxdWVDb250cm9sIix5LnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJue2lkOiIwIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEyNXB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjAiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsd2lkdGg6IjE2MHB4IixoZWlnaHQ6IjEwMCUiLHBhZGRpbmc6IjVweCAxMHB4IDVweCAxMHB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJhc2luSW1hZ2UiLHByb3BzOlt7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToicGF0aCIsdmFsdWU6ImFzaW5JbWFnZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJhbHQiLHZhbHVlOiJwcm9kdWN0VGl0bGUiLHR5cGU6InBhdGgifSx7bmFtZToic3giLHZhbHVlOjgwLHR5cGU6ImNvbnN0YW50In1dfSxzdHlsZTpbe25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgMTI1cHgifV19LHtpZDoiMC4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHdpZHRoOiIxMDAlIixwYWRkaW5nOiIwIDEwcHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMC4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAwIDVweCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJoZWFkbGluZSJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InRleHRMaW5rIixwcm9wczpbe25hbWU6ImZvbnQiLHZhbHVlOnttYXhMaW5lczoyLG1pbkZvbnRQeDoxNixtYXhGb250UHg6MTh9LHR5cGU6ImNvbnN0YW50In0se25hbWU6InRleHQiLHZhbHVlOiJoZWFkbGluZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMCx0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJzdHlsZSIsdmFsdWU6e2ZvbnRTdHlsZToiaXRhbGljIixjb2xvcjoiIzU1NSIsbGluZUhlaWdodDoiMjBweCJ9LHR5cGU6ImNvbnN0YW50In1dfX0se2lkOiIwLjEuMC4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAwIDVweCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJ0ZXh0TGluayIscHJvcHM6W3tuYW1lOiJmb250Iix2YWx1ZTp7bWF4TGluZXM6MSxtaW5Gb250UHg6MTYsbWF4Rm9udFB4OjE2LHNpemU6MTZ9LHR5cGU6ImNvbnN0YW50In0se25hbWU6InRleHQiLHZhbHVlOiJwcm9kdWN0VGl0bGUiLHR5cGU6InBhdGgifSx7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToiZGlzcGxheUFzVGV4dCIsdmFsdWU6ITEsdHlwZToiY29uc3RhbnQifSx7bmFtZToic3R5bGUiLHZhbHVlOntmb250V2VpZ2h0OiI2MDAifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMiIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljaW5nIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAuMi4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCA1cHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljZUJveCJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaWNlQm94Iixwcm9wczpbe25hbWU6ImJ1eUFtb3VudCIsdmFsdWU6ImZvcm1hdHRlZFByaWNlIix0eXBlOiJwYXRoIn0se25hbWU6Imxpc3RBbW91bnQiLHZhbHVlOiJmb3JtYXR0ZWRMaXN0UHJpY2UiLHR5cGU6InBhdGgifSx7bmFtZToiY3VycmVuY3kiLHZhbHVlOiJjdXJyZW5jeVN5bWJvbCIsdHlwZToicGF0aCJ9LHtuYW1lOiJ0YXhNZXNzYWdlIix2YWx1ZToiaTE4bi50YXhNZXNzYWdlIix0eXBlOiJwYXRoIn0se25hbWU6ImJ1eVByaWNlU3R5bGUiLHZhbHVlOntmb250U2l6ZToiMTVweCJ9LHR5cGU6ImNvbnN0YW50In0se25hbWU6Imxpc3RQcmljZVN0eWxlIix2YWx1ZTp7Zm9udFNpemU6IjEzcHgifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMi4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3cifSxtZXRhZGF0YTpbe25hbWU6InJlZiIsdmFsdWU6InByaW1lTG9nbyJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaW1lTG9nbyIscHJvcHM6W3tuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7c3R5bGU6e3dpZHRoOiIyOXB4IixoZWlnaHQ6IjEzcHgifX1dfSxzdHlsZTpbe25hbWU6Im92ZXJmbG93Iix2YWx1ZToidmlzaWJsZSJ9XX1dLGNzc0NsYXNzZXM6WyJibG9jay0taW5saW5lIiwiIl0sc3R5bGU6W3tuYW1lOiJ3aGl0ZVNwYWNlIix2YWx1ZToibm9ybWFsIn1dfV19LHtpZDoiMC4xLjEiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsbWFyZ2luOiIwIDEwcHggMCAxMHB4IixoZWlnaHQ6IjEyM3B4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxzdHlsZTpbe25hbWU6Im9wYWNpdHkiLHZhbHVlOiIwLjY0In0se25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgOXB4In1dLGNvbXBvbmVudDp7aWQ6Im1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyIixwcm9wczpbe25hbWU6InBhdGgiLHZhbHVlOiIvaW1hZ2VzL0cvMDEvQW1hem9uQnJhbmRTdG9yZXNQbGF0Zm9ybS9ibGFja19hcnJvdy5wbmciLHR5cGU6ImNvbnN0YW50In0se25hbWU6ImFsdCIsdmFsdWU6IkdyYXkgQXJyb3ciLHR5cGU6ImNvbnN0YW50In0se25hbWU6InJvbGUiLHZhbHVlOiJwcmVzZW50YXRpb24iLHR5cGU6ImNvbnN0YW50In1dfX1dLHN0eWxlOlt7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6IiNGRkZGRkYifSx7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6Ii13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI0ZGRkZGRiwgI0VCRUJFQikifSx7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6Ii1vLWxpbmVhci1ncmFkaWVudChyaWdodCwgcmdiYSgyNTUsMjU1LDI1NSwxKSwgcmdiYSgyNTUsMjU1LDI1NSwwKSAyNSUsIHJnYmEoMjU1LDI1NSwyNTUsMCkpLCAtby1saW5lYXItZ3JhZGllbnQoI0ZGRkZGRiwgI0VCRUJFQikifSx7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6Ii1tb3otbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpIn1dfV0sc3R5bGU6W3tuYW1lOiJib3JkZXIiLHZhbHVlOiIxcHggc29saWQgI2RkZCJ9LHtuYW1lOiJiYWNrZ3JvdW5kIix2YWx1ZToiI0ZGRkZGRiJ9XX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dmFyIG89big0MCksaT1yKG8pLGE9bigzOSkscz1yKGEpLHU9big3OCksbD1yKHUpLHA9big0MiksYz1yKHApLGY9bigzMyksZD1yKGYpO2UuZXhwb3J0cz17YXNpbkltYWdlOmlbImRlZmF1bHQiXSx0ZXh0TGluazpzWyJkZWZhdWx0Il0scHJpY2VCb3g6bFsiZGVmYXVsdCJdLHByaW1lTG9nbzpjWyJkZWZhdWx0Il0sbWVkaWFDZW50cmFsSW1hZ2VDb250YWluZXI6ZFsiZGVmYXVsdCJdfX1dKTs7dmFyICRhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZCcpLHJlbmRlcmluZ0NvbnRleHQgPSB7Im1hcmtldFBsYWNlIjoiVVMiLCJhZExpbmsiOiJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FrRHFxTlFTV3lZV05LLWdKWlRUV3ZrQUFBRmhwSmtxU0FFQUFBR1FBVy00VFRnL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDk5NjM2NjczMz9hYXhpdGs9U2NiV1V3VlhvNnRPdkhidWRhVlMydyIsInJldmlld0xpbmsiOiJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FrRHFxTlFTV3lZV05LLWdKWlRUV3ZrQUFBRmhwSmtxU0FFQUFBR1FBVy00VFRnL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDk5NjM2NjczMz9hYXhpdGs9U2NiV1V3VlhvNnRPdkhidWRhVlMydyNjdXN0b21lclJldmlld3MiLCJjcmVhdGl2ZUlkIjoiNDk4Nzg1MDU1MDAwMSIsImFkSWQiOiI0NzU2NjgyNzMwOTAxIiwicHJvZHVjdFRpdGxlIjoiQnJpbmcgeW91ciB3ZWIgZGVzaWduIHRvIGxpZmUgd2l0aCBzaW1wbGlmaWVkIEphdmFTY3JpcHQgaW5zdHJ1Y3Rpb24iLCJoZWFkbGluZSI6IlJlYWR5IHRvIHdyaXRlIHRoZSBzY3JpcHQgdGhhdCBwb3dlcnMgdGhlIHdlYj8iLCJhc2luSW1hZ2UiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTE2ejcyaEZoWkwuX0FDX1NSMTI4LDE0NV8uanBnIiwidW5zcHJpdGVkSW1hZ2UiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTFyTVZRbjJRY0wuanBnIiwiY3VzdG9tZXJSZXZpZXdTdW1tYXJ5Ijp7InJhdGluZyI6NC4yMzg2MTkzODYsImNvdW50IjoxNiwiYXNpbiI6IjA5OTYzNjY3MzMifSwiYmFkZ2VJbmZvcm1hdGlvbk1hcCI6bnVsbCwiY3VycmVuY3lTeW1ib2wiOiIkIiwiZm9ybWF0dGVkTGlzdFByaWNlIjoiIiwiZm9ybWF0dGVkUHJpY2UiOiI3Ljk3IiwicHJpY2VJbmZvIjp7Indob2xlQW1vdW50IjoiNyIsImRlY2ltYWxQYXJ0IjoiOTcifSwicHJpY2VGb3JtYXR0aW5nRmxhZ3MiOnsiaXNTeW1ib2xTdXBlcnNjcmlwdCI6dHJ1ZSwic3ltYm9sUG9zaXRpb24iOiJwcmVmaXhlZCJ9LCJwcmljZVBlclVuaXRNZXNzYWdlIjoiIiwiaXNQcmltZSI6dHJ1ZSwiaXNEaWdpdGFsIjpmYWxzZSwiaTE4biI6eyJzZXR0aW5ncyI6eyJzZWxlY3Rpb25MYWJlbCI6IkVuZ2xpc2ggKFVTKSIsInJlZ2lvbiI6Im5hIiwiY3VycmVuY3kiOiIkIiwiZG9tYWluIjoiYW1hem9uLmNvbSIsIm1lZGlhIjoiMDEiLCJtZXJjaGFudElkIjoiQVRWUERLSUtYMERFUiIsIm1hcmtldHBsYWNlSWQiOiJBVFZQREtJS1gwREVSIiwibG9jYWxlTW9udGhzIjpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX0sInRheE1lc3NhZ2UiOiIiLCJzcG9uc29yZWRCeSI6IlNwb25zb3JlZCBieSIsInNob3BOb3ciOiJTaG9wIG5vdyIsImJlc3RTZWxsZXIiOiJCZXN0IFNlbGxlciIsIm5ld1JlbGVhc2UiOiJOZXcgUmVsZWFzZSIsImJhZGdlSW4iOiJpbiJ9LCJjbGlja1VybHMiOlsiaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20vaXUzP2Q9Zm9yZXN0ZXItZGlkJmV4LWZjaD00MTY3MzE2MTMmZXgtZmFyZ3M9P2klM0RRT3FvMUJKYkpoWTByNkFsbE5OYS1RJTI2YXNpJTNEJTNBMDEwMWIwZGQ5ZTllZDZlNGQxNGVlNTkyZDE0MzA3MmM1MDVhNTNlMWUzZTc2YTY1M2FiNjYzZmEwMTBmZWM5OTAzODYlMjZjbGljayUzRDEmY2I9MTUxODg4NDk1Njc3OSJdLCJicmFuZExvZ28iOiJpbWFnZXMvUy9hYnMtaW1hZ2UtdXBsb2FkLW5hLzQvQW1hem9uU3RvcmVzL0FUVlBES0lLWDBERVIvZmJjY2ZhYzZlMWYxOWM4NTA2ZmNkMzlhZThjNWU4OTAudzM1MC5oNzEuX0NSMCwwLDM1MCw3MV9TTDI4MF9TWTgwX19GTXBuZ18ucG5nIiwiYnJhbmROYW1lIjoiQ2x5ZGVCYW5rIE1lZGlhIExMQyIsInByb2R1Y3RJbWFnZSI6eyJ1cmwiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTFyTVZRbjJRY0wuanBnIiwiaGVpZ2h0Ijo1MDAsIndpZHRoIjo0MDF9fTtpZiAoJGFkKSB7UmVhY3RET00ucmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlicmFyeS5kZWZhdWx0LCByZW5kZXJpbmdDb250ZXh0KSwgJGFkKTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS5hZGRWaWV3YWJpbGl0eUxpc3RlbmVyKCRhZCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYWRkQ3JlYXRpdmVDbGlja0xpc3RlbmVyKCRhZCk7fTwvc2NyaXB0PjwvYm9keT48L2h0bWw+PC9kaXY+&quot;,&quot;serverSideFetchAd&quot;: &quot;true&quot;,&quot;enableAdBlockerDetector&quot;: true,&quot;disableResizeFunc&quot;: true,&quot;fallbackStaticAdImgUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;: &quot;&quot;,&quot;advertisementTextOnTop&quot;: false,&quot;viewabilityStandards&quot;: [{&quot;p&quot;: 0, &quot;t&quot;: 0, &quot;def&quot;: &quot;amzn&quot;}, {&quot;p&quot;: 50, &quot;t&quot;: 1, &quot;def&quot;: &quot;iab&quot;}, {&quot;p&quot;: 100, &quot;t&quot;: 0, &quot;def&quot;: &quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;: &quot;&quot;}" title="Advertisement" data-arid="5ba26b6b37fd4f0697e89fb00a56fc9d"><div id="ape_detail_btf_detail-mWeb_placement" style="text-align: center; position: absolute; height: 125px; width: 100%;" aria-hidden="true"><iframe name="{&quot;slot&quot;:&quot;detail_btf_detail-mWeb&quot;,&quot;pageType&quot;:&quot;detail&quot;,&quot;subPageType&quot;:&quot;detail-mWeb&quot;,&quot;slotName&quot;:&quot;btf&quot;,&quot;src&quot;:&quot;prefetchEnabled&quot;,&quot;adServer&quot;:&quot;cs&quot;,&quot;campaignId&quot;:&quot;9044&quot;,&quot;arid&quot;:&quot;5ba26b6b37fd4f0697e89fb00a56fc9d&quot;,&quot;size&quot;:{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;},&quot;maxAdWidth&quot;:&quot;&quot;,&quot;allowedSizes&quot;:[{&quot;width&quot;:&quot;414px&quot;,&quot;height&quot;:&quot;125px&quot;},{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;}],&quot;allowedDomains&quot;:[&quot;d3l3lkinz3f56t.cloudfront.net&quot;,&quot;g-ecx.images-amazon.com&quot;,&quot;z-ecx.images-amazon.com&quot;,&quot;images-na.ssl-images-amazon.com&quot;,&quot;g-ec4.images-amazon.com&quot;,&quot;images-cn.ssl-images-amazon.com&quot;],&quot;loadAfter&quot;:&quot;windowOnLoad&quot;,&quot;extraDelay&quot;:0,&quot;iframeExtraStyle&quot;:&quot;width: 1px; min-width: 100%;&quot;,&quot;iframeClass&quot;:&quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;:true,&quot;adLabelWrapperId&quot;:&quot;ape_detail_btf_detail-mWeb_text-wrapper&quot;,&quot;adLabelId&quot;:&quot;ape_detail_btf_detail-mWeb_text&quot;,&quot;advTextWrapperDivStyle&quot;:&quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;:&quot;font-size: 10px; color: #555; text-align: right; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;:&quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;:&quot;PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfdGV4dC13cmFwcGVyIiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7IHRleHQtYWxpZ246Y2VudGVyOyBtYXJnaW4tbGVmdDogLTE0cHg7IG1hcmdpbi1yaWdodDogLTE0cHg7IGhlaWdodDogYXV0bzsiICA+PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfdGV4dCIgc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsgY29sb3I6ICM1NTU7IHRleHQtYWxpZ246IHJpZ2h0OyBtYXJnaW46IDBweCAzcHggNnB4IDA7IiAgPkFkdmVydGlzZW1lbnQ8L2Rpdj48L2Rpdj4=&quot;,&quot;adPixels&quot;:[],&quot;adPixelDelay&quot;:&quot;0&quot;,&quot;aaxImpPixelUrl&quot;:&quot;https://aax-us-east.amazon-adsystem.com/e/loi/imp?b=QkDqqNQSWyYWNK-gJZTTWvkAAAFhpJkqSAEAAAGQAW-4TTg&quot;,&quot;aaxInstrPixelUrl&quot;:&quot;https://aax-us-east.amazon-adsystem.com/x/px/QkDqqNQSWyYWNK-gJZTTWvkAAAFhpJkqSAEAAAGQAW-4TTg/&quot;,&quot;htmlContent&quot;:&quot;&quot;,&quot;htmlContentEncoded&quot;:&quot;PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfY3JlYXRpdmVXcmFwcGVyIiAgID48IWRvY3R5cGUgaHRtbD48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PVVURi04Pjx0aXRsZT48L3RpdGxlPjxzdHlsZT5odG1se2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MS4xNTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXA6b2JqZWN0c31hOmFjdGl2ZSxhOmhvdmVye291dGxpbmUtd2lkdGg6MH1pbWd7Ym9yZGVyLXN0eWxlOm5vbmV9Kiw6YWZ0ZXIsOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3h9aHRtbHtvdmVyZmxvdzpoaWRkZW47Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhIE5ldWUsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6IzExMTtmb250LXNpemU6MTRweH1he2NvbG9yOiMwMDY2YzA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2NvbG9yOiNjNDU1MDB9I2Fkey13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlfS5ibG9ja3tkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW59LmJsb2NrOmVtcHR5e2Rpc3BsYXk6bm9uZX0uYmxvY2stLWp1c3RpZnktY2VudGVyey13ZWJraXQtanVzdGlmeS1jb250ZW50OmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5ibG9jay0tanVzdGlmeS1mbGV4LWVuZHstd2Via2l0LWp1c3RpZnktY29udGVudDpmbGV4LWVuZDstbXMtZmxleC1wYWNrOmVuZDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmJsb2NrLS1hbGlnbi1mbGV4LXN0YXJ0ey13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1zdGFydDstbXMtZmxleC1hbGlnbjpzdGFydDstbXMtZ3JpZC1yb3ctYWxpZ246ZmxleC1zdGFydDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5ibG9jay0tYWxpZ24tY2VudGVyey13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjstbXMtZ3JpZC1yb3ctYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0uYmxvY2stLWFsaWduLWZsZXgtZW5key13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1lbmQ7LW1zLWZsZXgtYWxpZ246ZW5kOy1tcy1ncmlkLXJvdy1hbGlnbjpmbGV4LWVuZDthbGlnbi1pdGVtczpmbGV4LWVuZH0uYmxvY2stLWRpcmVjdGlvbi1jb2x1bW57LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmJsb2NrLS1iYWNrZ3JvdW5kLC5ibG9jay0tYmFja2dyb3VuZD4uYmxvY2t7cG9zaXRpb246cmVsYXRpdmV9LmJsb2NrX19iYWNrZ3JvdW5ke3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5ibG9jay0tbG9ja3std2Via2l0LWZsZXgtZ3JvdzowOy1tcy1mbGV4LXBvc2l0aXZlOjA7ZmxleC1ncm93OjA7LXdlYmtpdC1mbGV4LXNocmluazowOy1tcy1mbGV4LW5lZ2F0aXZlOjA7ZmxleC1zaHJpbms6MH0uYmxvY2stLWlubGluZTpub3QoOmVtcHR5KXtkaXNwbGF5OmJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDtmb250LXNpemU6MH0uYmxvY2stLWlubGluZTpub3QoOmVtcHR5KT4uYmxvY2s6bm90KDplbXB0eSl7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZToxNHB4fS5oLW5vRmxleGJveCAuYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1jZW50ZXI+LmJsb2Nre3RleHQtYWxpZ246bGVmdH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1qdXN0aWZ5LWZsZXgtZW5ke3RleHQtYWxpZ246cmlnaHR9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1mbGV4LWVuZD4uYmxvY2t7dGV4dC1hbGlnbjpsZWZ0fS5oLW5vRmxleGJveCAuYmxvY2stLWFsaWduLWZsZXgtc3RhcnQ+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOnRvcH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1jZW50ZXI+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1mbGV4LWVuZD4uYmxvY2t7dmVydGljYWwtYWxpZ246Ym90dG9tfS5oLW5vRmxleGJveCAuYmxvY2stLWRpcmVjdGlvbi1jb2x1bW4+LmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmgtY2xvYWt7dmlzaWJpbGl0eTpoaWRkZW4haW1wb3J0YW50fS5oLWVsbGlwc2lze292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uYXNpbkltYWdle2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uYXNpbkltYWdlLS1leHRlbmRDb250YWluZXJIZWlnaHR7aGVpZ2h0OmF1dG99LmFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0Pi5pbWFnZUNvbnRhaW5lcntoZWlnaHQ6MTAwJX0uYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb257ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uPi5pbWFnZUNvbnRhaW5lcnttYXJnaW4tYm90dG9tOjVweH0uYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb24+LnRleHRDb250YWluZXJ7bWluLWhlaWdodDoxNXB4O3RleHQtYWxpZ246Y2VudGVyfS5pbWFnZUNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2JvdHRvbTowO3JpZ2h0OjA7bWFyZ2luOmF1dG87d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmltYWdlQ29udGFpbmVyLS1sZWZ0e2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmltYWdlQ29udGFpbmVyLS1sZWZ0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7cG9zaXRpb246c3RhdGljO21hcmdpbjowfS5pbWFnZUNvbnRhaW5lci0tcmlnaHQ+LmltYWdlQ29udGFpbmVyX19pbWFnZXttYXJnaW46MDtsZWZ0OmF1dG87Ym90dG9tOmF1dG87dG9wOmF1dG99LmltYWdlQ29udGFpbmVyLS1leHRlbmRDb250YWluZXJIZWlnaHR7aGVpZ2h0OmF1dG99LmltYWdlQ29udGFpbmVyLS1leHRlbmRDb250YWluZXJIZWlnaHQ+LmltYWdlQ29udGFpbmVyX19pbWFnZXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MCBhdXRvfS50ZXh0TGlua3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9LnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0e2NvbG9yOiMxMTF9LnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0OmhvdmVye2NvbG9yOiMxMTE7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnNreSAudGV4dExpbmt7Zm9udC13ZWlnaHQ6NjAwfS5za3kgLnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0LC5za3kgLnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0OmhvdmVye2NvbG9yOiMwMDJmMzZ9LnByaWNlQm94X19saXN0e21hcmdpbi1yaWdodDo0cHh9LnByaWNlQm94X190YXhNZXNzYWdle21hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTFweH0ucHJpY2V7Y29sb3I6I2IxMjcwNH0ucHJpY2UtLWxpc3R7Y29sb3I6IzU1NTt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdofS5wcmljZS0tanVtYm97Zm9udC1zaXplOjNlbX0ucHJpY2VfX2p1bWJvQ3VycmVuY3ksLnByaWNlX19qdW1ib0RlY2ltYWxBbW91bnQsLnByaWNlX19qdW1ib0ludGVnZXJBbW91bnR7dmVydGljYWwtYWxpZ246dG9wO2ZvbnQtd2VpZ2h0OjUwMH0ucHJpY2VfX2p1bWJvQ3VycmVuY3ksLnByaWNlX19qdW1ib0RlY2ltYWxBbW91bnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOi40ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgzNSUpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgzNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7Zm9udC13ZWlnaHQ6NzAwfS5wcmljZV9fanVtYm9JbnRlZ2VyQW1vdW50e2xldHRlci1zcGFjaW5nOi0uNXB4fS5za3kgLnByaWNle2NvbG9yOiNiMTI3MDR9LnByaW1lTG9nb3ttYXJnaW4tdG9wOjJweH0udGVtcGxhdGVDb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmV9LnRlbXBsYXRlQ29udGFpbmVyX19saW5re3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5OjB9LmNsaWNrdGhyb3VnaExpbms6bm90KC50ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayl7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfTwvc3R5bGU+PHNjcmlwdD52YXIgbW9kZXJuaXpyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4obyl7aWYodFtvXSlyZXR1cm4gdFtvXS5leHBvcnRzO3ZhciByPXRbb109e2V4cG9ydHM6e30saWQ6byxsb2FkZWQ6ITF9O3JldHVybiBlW29dLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubG9hZGVkPSEwLHIuZXhwb3J0c312YXIgdD17fTtyZXR1cm4gbi5tPWUsbi5jPXQsbi5wPSIiLG4oMCl9KHswOmZ1bmN0aW9uKGUsbix0KXtlLmV4cG9ydHM9dCgyMCl9LDIwOmZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiO3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfTshZnVuY3Rpb24oZSxuLG8pe2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOnQoZSkpPT09bn1mdW5jdGlvbiBzKCl7dmFyIGUsbix0LG8scyxpLGw7Zm9yKHZhciBmIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShmKSl7aWYoZT1bXSxuPWJbZl0sbi5uYW1lJiYoZS5wdXNoKG4ubmFtZS50b0xvd2VyQ2FzZSgpKSxuLm9wdGlvbnMmJm4ub3B0aW9ucy5hbGlhc2VzJiZuLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGgpKWZvcih0PTA7dDxuLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGg7dCsrKWUucHVzaChuLm9wdGlvbnMuYWxpYXNlc1t0XS50b0xvd2VyQ2FzZSgpKTtmb3Iobz1yKG4uZm4sImZ1bmN0aW9uIik/bi5mbigpOm4uZm4scz0wO3M8ZS5sZW5ndGg7cysrKWk9ZVtzXSxsPWkuc3BsaXQoIi4iKSwxPT09bC5sZW5ndGg/d1tsWzBdXT1vOighd1tsWzBdXXx8d1tsWzBdXWluc3RhbmNlb2YgQm9vbGVhbnx8KHdbbFswXV09bmV3IEJvb2xlYW4od1tsWzBdXSkpLHdbbFswXV1bbFsxXV09byksZy5wdXNoKChvPyIiOiJuby0iKStsLmpvaW4oIi0iKSl9fWZ1bmN0aW9uIGkoZSl7dmFyIG49Uy5jbGFzc05hbWUsdD13Ll9jb25maWcuY2xhc3NQcmVmaXh8fCIiO2lmKF8mJihuPW4uYmFzZVZhbCksdy5fY29uZmlnLmVuYWJsZUpTQ2xhc3Mpe3ZhciBvPW5ldyBSZWdFeHAoIihefFxccykiK3QrIm5vLWpzKFxcc3wkKSIpO249bi5yZXBsYWNlKG8sIiQxIit0KyJqcyQyIil9dy5fY29uZmlnLmVuYWJsZUNsYXNzZXMmJihuKz0iICIrdCtlLmpvaW4oIiAiK3QpLF8/Uy5jbGFzc05hbWUuYmFzZVZhbD1uOlMuY2xhc3NOYW1lPW4pfWZ1bmN0aW9uIGwoZSxuKXtyZXR1cm4hIX4oIiIrZSkuaW5kZXhPZihuKX1mdW5jdGlvbiBmKCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIG4uY3JlYXRlRWxlbWVudD9uLmNyZWF0ZUVsZW1lbnQoYXJndW1lbnRzWzBdKTpfP24uY3JlYXRlRWxlbWVudE5TLmNhbGwobiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGFyZ3VtZW50c1swXSk6bi5jcmVhdGVFbGVtZW50LmFwcGx5KG4sYXJndW1lbnRzKX1mdW5jdGlvbiBhKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbYS16XSktKFthLXpdKS9nLGZ1bmN0aW9uKGUsbix0KXtyZXR1cm4gbit0LnRvVXBwZXJDYXNlKCl9KS5yZXBsYWNlKC9eLS8sIiIpfWZ1bmN0aW9uIHUoZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShuLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHAoZSxuLHQpe3ZhciBvO2Zvcih2YXIgcyBpbiBlKWlmKGVbc11pbiBuKXJldHVybiB0PT09ITE/ZVtzXToobz1uW2Vbc11dLHIobywiZnVuY3Rpb24iKT91KG8sdHx8bik6byk7cmV0dXJuITF9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZS5yZXBsYWNlKC8oW0EtWl0pL2csZnVuY3Rpb24oZSxuKXtyZXR1cm4iLSIrbi50b0xvd2VyQ2FzZSgpfSkucmVwbGFjZSgvXm1zLS8sIi1tcy0iKX1mdW5jdGlvbiBjKCl7dmFyIGU9bi5ib2R5O3JldHVybiBlfHwoZT1mKF8/InN2ZyI6ImJvZHkiKSxlLmZha2U9ITApLGV9ZnVuY3Rpb24gbShlLHQsbyxyKXt2YXIgcyxpLGwsYSx1PSJtb2Rlcm5penIiLHA9ZigiZGl2IiksZD1jKCk7aWYocGFyc2VJbnQobywxMCkpZm9yKDtvLS07KWw9ZigiZGl2IiksbC5pZD1yP3Jbb106dSsobysxKSxwLmFwcGVuZENoaWxkKGwpO3JldHVybiBzPWYoInN0eWxlIikscy50eXBlPSJ0ZXh0L2NzcyIscy5pZD0icyIrdSwoZC5mYWtlP2Q6cCkuYXBwZW5kQ2hpbGQocyksZC5hcHBlbmRDaGlsZChwKSxzLnN0eWxlU2hlZXQ/cy5zdHlsZVNoZWV0LmNzc1RleHQ9ZTpzLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoZSkpLHAuaWQ9dSxkLmZha2UmJihkLnN0eWxlLmJhY2tncm91bmQ9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixhPVMuc3R5bGUub3ZlcmZsb3csUy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixTLmFwcGVuZENoaWxkKGQpKSxpPXQocCxlKSxkLmZha2U/KGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxTLnN0eWxlLm92ZXJmbG93PWEsUy5vZmZzZXRIZWlnaHQpOnAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKSwhIWl9ZnVuY3Rpb24geShuLHQpe3ZhciByPW4ubGVuZ3RoO2lmKCJDU1MiaW4gZSYmInN1cHBvcnRzImluIGUuQ1NTKXtmb3IoO3ItLTspaWYoZS5DU1Muc3VwcG9ydHMoZChuW3JdKSx0KSlyZXR1cm4hMDtyZXR1cm4hMX1pZigiQ1NTU3VwcG9ydHNSdWxlImluIGUpe2Zvcih2YXIgcz1bXTtyLS07KXMucHVzaCgiKCIrZChuW3JdKSsiOiIrdCsiKSIpO3JldHVybiBzPXMuam9pbigiIG9yICIpLG0oIkBzdXBwb3J0cyAoIitzKyIpIHsgI21vZGVybml6ciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfSB9IixmdW5jdGlvbihlKXtyZXR1cm4iYWJzb2x1dGUiPT1nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCkucG9zaXRpb259KX1yZXR1cm4gb31mdW5jdGlvbiB2KGUsbix0LHMpe2Z1bmN0aW9uIGkoKXtwJiYoZGVsZXRlIE4uc3R5bGUsZGVsZXRlIE4ubW9kRWxlbSl9aWYocz1yKHMsInVuZGVmaW5lZCIpPyExOnMsIXIodCwidW5kZWZpbmVkIikpe3ZhciB1PXkoZSx0KTtpZighcih1LCJ1bmRlZmluZWQiKSlyZXR1cm4gdX1mb3IodmFyIHAsZCxjLG0sdixoPVsibW9kZXJuaXpyIiwidHNwYW4iLCJzYW1wIl07IU4uc3R5bGUmJmgubGVuZ3RoOylwPSEwLE4ubW9kRWxlbT1mKGguc2hpZnQoKSksTi5zdHlsZT1OLm1vZEVsZW0uc3R5bGU7Zm9yKGM9ZS5sZW5ndGgsZD0wO2M+ZDtkKyspaWYobT1lW2RdLHY9Ti5zdHlsZVttXSxsKG0sIi0iKSYmKG09YShtKSksTi5zdHlsZVttXSE9PW8pe2lmKHN8fHIodCwidW5kZWZpbmVkIikpcmV0dXJuIGkoKSwicGZ4Ij09bj9tOiEwO3RyeXtOLnN0eWxlW21dPXR9Y2F0Y2goeCl7fWlmKE4uc3R5bGVbbV0hPXYpcmV0dXJuIGkoKSwicGZ4Ij09bj9tOiEwfXJldHVybiBpKCksITF9ZnVuY3Rpb24gaChlLG4sdCxvLHMpe3ZhciBpPWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxsPShlKyIgIitULmpvaW4oaSsiICIpK2kpLnNwbGl0KCIgIik7cmV0dXJuIHIobiwic3RyaW5nIil8fHIobiwidW5kZWZpbmVkIik/dihsLG4sbyxzKToobD0oZSsiICIrei5qb2luKGkrIiAiKStpKS5zcGxpdCgiICIpLHAobCxuLHQpKX1mdW5jdGlvbiB4KGUsbix0KXtyZXR1cm4gaChlLG8sbyxuLHQpfXZhciBnPVtdLGI9W10sQz17X3ZlcnNpb246IjMuMy4xIixfY29uZmlnOntjbGFzc1ByZWZpeDoiIixlbmFibGVDbGFzc2VzOiEwLGVuYWJsZUpTQ2xhc3M6ITAsdXNlUHJlZml4ZXM6ITB9LF9xOltdLG9uOmZ1bmN0aW9uKGUsbil7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bih0W2VdKX0sMCl9LGFkZFRlc3Q6ZnVuY3Rpb24oZSxuLHQpe2IucHVzaCh7bmFtZTplLGZuOm4sb3B0aW9uczp0fSl9LGFkZEFzeW5jVGVzdDpmdW5jdGlvbihlKXtiLnB1c2goe25hbWU6bnVsbCxmbjplfSl9fSx3PWZ1bmN0aW9uKCl7fTt3LnByb3RvdHlwZT1DLHc9bmV3IHc7dmFyIFM9bi5kb2N1bWVudEVsZW1lbnQsXz0ic3ZnIj09PVMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxQPSJNb3ogTyBtcyBXZWJraXQiLFQ9Qy5fY29uZmlnLnVzZVByZWZpeGVzP1Auc3BsaXQoIiAiKTpbXTtDLl9jc3NvbVByZWZpeGVzPVQ7dmFyIHo9Qy5fY29uZmlnLnVzZVByZWZpeGVzP1AudG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpOltdO0MuX2RvbVByZWZpeGVzPXo7dmFyIEU9e2VsZW06ZigibW9kZXJuaXpyIil9O3cuX3EucHVzaChmdW5jdGlvbigpe2RlbGV0ZSBFLmVsZW19KTt2YXIgTj17c3R5bGU6RS5lbGVtLnN0eWxlfTt3Ll9xLnVuc2hpZnQoZnVuY3Rpb24oKXtkZWxldGUgTi5zdHlsZX0pLEMudGVzdEFsbFByb3BzPWgsQy50ZXN0QWxsUHJvcHM9eCwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3giLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94IiwKCSAgICAiY2FuaXVzZSI6ICJmbGV4Ym94IiwKCSAgICAidGFncyI6IFsiY3NzIl0sCgkgICAgIm5vdGVzIjogW3sKCSAgICAgICJuYW1lIjogIlRoZSBfbmV3XyBmbGV4Ym94IiwKCSAgICAgICJocmVmIjogImh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2NzczMtZmxleGJveCIKCSAgICB9XSwKCSAgICAid2FybmluZ3MiOiBbCgkgICAgICAiQSBgdHJ1ZWAgcmVzdWx0IGZvciB0aGlzIGRldGVjdCBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBgZmxleC13cmFwYCBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQ7IHNlZSB0aGUgYGZsZXh3cmFwYCBkZXRlY3QuIgoJICAgIF0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94Iix4KCJmbGV4QmFzaXMiLCIxcHgiLCEwKSksLyohCgkgIHsKCSAgICAibmFtZSI6ICJGbGV4Ym94IChsZWdhY3kpIiwKCSAgICAicHJvcGVydHkiOiAiZmxleGJveGxlZ2FjeSIsCgkgICAgInRhZ3MiOiBbImNzcyJdLAoJICAgICJwb2x5ZmlsbHMiOiBbImZsZXhpZSJdLAoJICAgICJub3RlcyI6IFt7CgkgICAgICAibmFtZSI6ICJUaGUgX29sZF8gZmxleGJveCIsCgkgICAgICAiaHJlZiI6ICJodHRwczovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLWZsZXhib3gtMjAwOTA3MjMvIgoJICAgIH1dCgkgIH0KCSAgISovCncuYWRkVGVzdCgiZmxleGJveGxlZ2FjeSIseCgiYm94RGlyZWN0aW9uIiwicmV2ZXJzZSIsITApKSwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3ggKHR3ZWVuZXIpIiwKCSAgICAicHJvcGVydHkiOiAiZmxleGJveHR3ZWVuZXIiLAoJICAgICJ0YWdzIjogWyJjc3MiXSwKCSAgICAicG9seWZpbGxzIjogWyJmbGV4aWUiXSwKCSAgICAibm90ZXMiOiBbewoJICAgICAgIm5hbWUiOiAiVGhlIF9pbmJldHdlZW5fIGZsZXhib3giLAoJICAgICAgImhyZWYiOiAiaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTEvV0QtY3NzMy1mbGV4Ym94LTIwMTExMTI5LyIKCSAgICB9XSwKCSAgICAid2FybmluZ3MiOiBbIlRoaXMgcmVwcmVzZW50cyBhbiBvbGQgc3ludGF4LCBub3QgdGhlIGxhdGVzdCBzdGFuZGFyZCBzeW50YXguIl0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94dHdlZW5lciIseCgiZmxleEFsaWduIiwiZW5kIiwhMCkpLHMoKSxpKGcpLGRlbGV0ZSBDLmFkZFRlc3QsZGVsZXRlIEMuYWRkQXN5bmNUZXN0O2Zvcih2YXIgaj0wO2o8dy5fcS5sZW5ndGg7aisrKXcuX3Fbal0oKTtlLk1vZGVybml6cj13fSh3aW5kb3csZG9jdW1lbnQpfX0pOzt2YXIgUGRhQ2xpZW50QVBJPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBpPW5bcl09e2V4cG9ydHM6e30saWQ6cixsb2FkZWQ6ITF9O3JldHVybiBlW3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLHQpLGkubG9hZGVkPSEwLGkuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPSIiLHQoMCl9KFtmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTYpfSwsLCwsLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lfHx3aW5kb3cuZXZlbnQ7cmV0dXJuIG4odCl9O2lmKGUuYWRkRXZlbnRMaXN0ZW5lcillLmFkZEV2ZW50TGlzdGVuZXIodCxyLCEwKTtlbHNlIGlmKHQ9Im9uIit0LGUuYXR0YWNoRXZlbnQpZS5hdHRhY2hFdmVudCh0LHIpO2Vsc2V7dmFyIGk9ZVt0XTtlW3RdPWZ1bmN0aW9uKCl7ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYT1uKDkpLHU9cihhKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpZihpKHRoaXMsZSksdGhpcy53aW5kb3c9dC53aW5kb3d8fCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3csIXRoaXMud2luZG93fHwhdGhpcy53aW5kb3cuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJXaW5kb3cgYW5kL29yIGRvY3VtZW50IGlzIG5vdCBkZWZpbmVkIik7dGhpcy5kYWN4TG9nZ2VyPXQuZGFjeExvZ2dlcnx8bmV3IHVbImRlZmF1bHQiXSh0LmJhc2VVcmwsdC5pbXByZXNzaW9uSWQsdC5hZFNlc3Npb25JZCksdGhpcy5haWQ9dC5hZElkLHRoaXMuY2lkPXQuY3JlYXRpdmVJZCx0aGlzLmRhY3hMb2dnZXIubG9nSW1wcmVzc2lvbigpfXJldHVybiBvKGUsW3trZXk6ImF0dGFjaEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy53aW5kb3cuZG9jdW1lbnQuYWQ9e2FpZDp0aGlzLmFkSWQsY2lkOnRoaXMuY3JlYXRpdmVJZH0sdGhpcy53aW5kb3cuRGFjeExvZ2dlcj10aGlzLmRhY3hMb2dnZXJ9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBpKGUsdCxuKXtyZXR1cm4gdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gYShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIHUoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1uZXcgZlsiZGVmYXVsdCJdKGUsZCkscj17aTp0LmRhY3hJbXByZXNzaW9uSWQsYXNpOnQuZGFjeFNlc3Npb25JZCxjbGljazoxfTtyZXR1cm4gbi5nZXRQaXhlbFVybChyKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCk7dC5nZW5lcmF0ZURhY3hDbGlja1RyYWNrZXJVcmw9Yzt2YXIgcz1uKDEwKSxmPXIocyksZD0iNDE2NzMxNjEzIixwPSJjbGllbnRfaW1wIixoPSJ2aWV3Iix2PSJzd2lwZSIseT0tMSxnPTEsdz0yLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4scil7byh0aGlzLHQpO3ZhciBpPWEodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUsZCkpO3JldHVybiBpLmltcHJlc3Npb25JZD1uLGkuYWRTZXNzaW9uSWQ9cixpfXJldHVybiB1KHQsZSksbCh0LFt7a2V5OiJsb2dNZXRyaWMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49aSh7aTp0aGlzLmltcHJlc3Npb25JZCxhc2k6dGhpcy5hZFNlc3Npb25JZH0sZSx0fHwxKTt0aGlzLmZpcmVQaXhlbChuKX19LHtrZXk6ImxvZ0ltcHJlc3Npb24iLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMocCl9fSx7a2V5OiJsb2dWaWV3YWJpbGl0eVN1Y2Nlc3MiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMoaCxnKX19LHtrZXk6ImxvZ0JhcmVWaWV3YWJpbGl0eVN1Y2Nlc3MiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMoaCx3KX19LHtrZXk6ImxvZ1ZpZXdhYmlsaXR5RmFpbHVyZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLHkpfX0se2tleToibG9nU3dpcGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWModil9fV0pLHR9KGZbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPW19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxvPW4oMTEpLmdldFF1ZXJ5U3RyaW5nLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7cih0aGlzLGUpLHRoaXMuYmFzZVVybD10LHRoaXMuY2hhbm5lbD1ufXJldHVybiBpKGUsW3trZXk6ImdldFBpeGVsVXJsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iPyIrZW5jb2RlVVJJQ29tcG9uZW50KG8oZSkpO3JldHVybiB0aGlzLmJhc2VVcmwrIi9pdTM/ZD1mb3Jlc3Rlci1kaWQmZXgtZmNoPSIrdGhpcy5jaGFubmVsKyImZXgtZmFyZ3M9Iit0KyImY2I9IisobmV3IERhdGUpLmdldFRpbWUoKX19LHtrZXk6ImZpcmVQaXhlbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEltYWdlO3JldHVybiB0LnNyYz10aGlzLmdldFBpeGVsVXJsKGUpLHR9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWF9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1bXTtmb3IodmFyIHIgaW4gZSluLnB1c2gocisiPSIrZVtyXSk7dmFyIGk9bi5qb2luKCImIik7cmV0dXJuIHQ/ZW5jb2RlVVJJQ29tcG9uZW50KGkpOml9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7cj5uO24rKyl0KGVbbl0sbixlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRRdWVyeVN0cmluZz1uLHQuZm9yRWFjaD1yfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGM9ZnVuY3Rpb24gYihlLHQsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHZvaWQgMD09PXIpe3ZhciBpPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PWk/dm9pZCAwOmIoaSx0LG4pfWlmKCJ2YWx1ZSJpbiByKXJldHVybiByLnZhbHVlO3ZhciBvPXIuZ2V0O2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uY2FsbChuKX0sbD1uKDgpLHM9cihsKSxmPW4oMTcpLGQ9cihmKSxwPW4oMTgpLGg9cihwKSx2PW4oMTkpLHk9cih2KSxnPW4oNiksdz1bIlRFVFJJU19JTkxJTkVfTUVTU0FHSU5HIl0sbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe2kodGhpcyx0KTt2YXIgbj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc2hhemFtTG9nZ2VyPWUuc2hhemFtTG9nZ2VyfHxuZXcgZFsiZGVmYXVsdCJdKGUuYmFzZVVybCxlKSxuLnNoYXphbUxvZ2dlci5sb2dJbXByZXNzaW9uKCksbi5jcmVhdGl2ZUNsaWNrTG9nZ2VyPWUuY3JlYXRpdmVDbGlja0xvZ2dlcnx8bmV3IHlbImRlZmF1bHQiXShlLmJhc2VVcmwsZS5pbXByZXNzaW9uSWQpLG4udGVtcGxhdGVOYW1lPWUudGVtcGxhdGVOYW1lLG59cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImF0dGFjaEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7Yyh0LnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSksImF0dGFjaEdsb2JhbHMiLHRoaXMpLmNhbGwodGhpcyksdGhpcy53aW5kb3cuU2hhemFtTG9nZ2VyPXRoaXMuc2hhemFtTG9nZ2VyLHRoaXMud2luZG93LlZpZXdhYmlsaXR5PWhbImRlZmF1bHQiXX19LHtrZXk6InRyYWNrTG9hZExhdGVuY3kiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnNoYXphbUxvZ2dlci5zdGFydFRpbWVyKGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpLCgwLGcuYWRkTGlzdGVuZXIpKHRoaXMud2luZG93LCJsb2FkIixmdW5jdGlvbih0KXtlLnNoYXphbUxvZ2dlci5lbmRUaW1lcihkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuQ1JFQVRJVkVfTE9BRF9MQVRFTkNZKX0pfX0se2tleToiYWRkRXJyb3JMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMud2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24odCxuLHIsaSxvKXtpZihvJiZvLnN0YWNrKXt2YXIgYT10KyIgOiAiK28uc3RhY2s7ZS5zaGF6YW1Mb2dnZXIuYWRkQ291bnQoZFsiZGVmYXVsdCJdLkVWRU5UX05BTUVTLlVOQ0FVR0hUX0VSUk9SLGEubGVuZ3RoPDUwMD9hOmEuc3Vic3RyaW5nKDAsNTAwKSl9ZWxzZSBlLnNoYXphbUxvZ2dlci5hZGRDb3VudChkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuVU5DQVVHSFRfRVJST1IsdCsiIDogIituKX19fSx7a2V5OiJhZGRWaWV3YWJpbGl0eUxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49LjUscj0xZTMsaT0uMDEsbz0xLGE9bmV3IGhbImRlZmF1bHQiXShlLHRoaXMud2luZG93KTthLmdldFBlcmNlbnRJblZpZXcoKTw9LTE/dGhpcy5kYWN4TG9nZ2VyLmxvZ1ZpZXdhYmlsaXR5RmFpbHVyZSgpOihhLm9uVmlldyhpLG8sZnVuY3Rpb24oKXtyZXR1cm4gdC5kYWN4TG9nZ2VyLmxvZ0JhcmVWaWV3YWJpbGl0eVN1Y2Nlc3MoKX0pLGEub25WaWV3KG4scixmdW5jdGlvbigpe3JldHVybiB0LmRhY3hMb2dnZXIubG9nVmlld2FiaWxpdHlTdWNjZXNzKCl9KSl9fSx7a2V5OiJhZGRDcmVhdGl2ZUNsaWNrTGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dy5pbmRleE9mKHRoaXMudGVtcGxhdGVOYW1lKT49MCYmKDAsZy5hZGRMaXN0ZW5lcikoZSwiY2xpY2siLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXt0LmNyZWF0aXZlQ2xpY2tMb2dnZXIubG9nQ2xpY2sobixlLm9mZnNldFdpZHRoLGUub2Zmc2V0SGVpZ2h0KX19KGUpKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGM9ZnVuY3Rpb24geShlLHQsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHZvaWQgMD09PXIpe3ZhciBpPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PWk/dm9pZCAwOnkoaSx0LG4pfWlmKCJ2YWx1ZSJpbiByKXJldHVybiByLnZhbHVlO3ZhciBvPXIuZ2V0O2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uY2FsbChuKX0sbD1uKDEwKSxzPXIobCksZj0uMSxkPSJjbG1ldCIscD0iZGEtY3gtbWV0cmljcyIsaD1bInNoYXphbUlkIiwidGVtcGxhdGVOYW1lIiwibG9jYWxlIiwiYWRTZXJ2ZXIiLCJ0ZW1wbGF0ZU1ham9yVmVyc2lvbiIsInRlbXBsYXRlTWlub3JWZXJzaW9uIiwiYWRJZCIsImNyZWF0aXZlSWQiLCJpbXByZXNzaW9uSWQiXSx2PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSxuKXtpKHRoaXMsdCk7dmFyIHI9byh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSxwKSk7cmV0dXJuIHIuc2hvdWxkRmlyZU1ldHJpY3M9TWF0aC5yYW5kb20oKTw9ZixyLnRpbWVycz17fSxyLmFkSW5mbz1uLGguZm9yRWFjaChmdW5jdGlvbihlKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sZSkpdGhyb3cgbmV3IEVycm9yKCJTaGF6YW1Mb2dnZXIgbWlzc2luZyBhZEluZm8gcHJvcGVydHk6ICIrZSl9KSxyfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJmaXJlUGl4ZWwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuc2hvdWxkRmlyZU1ldHJpY3MmJihlLmk9ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWRJbmZvLmltcHJlc3Npb25JZCksZS5hcHA9ZW5jb2RlVVJJQ29tcG9uZW50KGQpLGModC5wcm90b3R5cGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLCJmaXJlUGl4ZWwiLHRoaXMpLmNhbGwodGhpcyxlKSl9fSx7a2V5OiJsb2dFdmVudCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O2lmKG51bGwhPWUmJm51bGwhPXQpe3RyeXtuJiYoci50eXBlPW4pLHIuZW49ZSxyLmV2PUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKGkpe3Iuc3RyaW5naWZ5Tm90QXZhaWxhYmxlPTF9dGhpcy5maXJlUGl4ZWwocil9fX0se2tleToibG9nSW1wcmVzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFkSW5mbyx0PXtzOmUuc2hhemFtSWQsbjplbmNvZGVVUklDb21wb25lbnQoZS50ZW1wbGF0ZU5hbWUpLGw6ZS5sb2NhbGUsYXM6ZS5hZFNlcnZlcix0bWp2OmUudGVtcGxhdGVNYWpvclZlcnNpb24sdG1udjplLnRlbXBsYXRlTWlub3JWZXJzaW9uLGFpOmUuYWRJZCxjaTplLmNyZWF0aXZlSWQsaTplLmltcHJlc3Npb25JZCxpbXA6MX07bmF2aWdhdG9yJiYodC51YT1lbmNvZGVVUklDb21wb25lbnQobmF2aWdhdG9yLnVzZXJBZ2VudCkpLHRoaXMuZmlyZVBpeGVsKHQpfX0se2tleToic3RhcnRUaW1lciIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy50aW1lcnNbZV09bmV3IERhdGV9fSx7a2V5OiJlbmRUaW1lciIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy50aW1lcnNbZV0pe3ZhciBuPW5ldyBEYXRlLXRoaXMudGltZXJzW2VdO3RoaXMubG9nRXZlbnQoZSxuLHQuRVZFTlRfVFlQRVMuVElNRVIpLGRlbGV0ZSB0aGlzLnRpbWVyc1tlXX19fSx7a2V5OiJhZGRDb3VudCIsdmFsdWU6ZnVuY3Rpb24oZSxuKXtuPW58fDEsdGhpcy5sb2dFdmVudChlLG4sdC5FVkVOVF9UWVBFUy5DT1VOVEVSKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09dix2LkVWRU5UX1RZUEVTPXtUSU1FUjoidGltZXIiLENPVU5URVI6ImNvdW50ZXIiLEpTT046Impzb24ifSx2LkVWRU5UX05BTUVTPXtCVVlfQk9YX0xPQURfTEFURU5DWToiQnV5Qm94TG9hZExhdGVuY3kiLEFBTl9MQVRFTkNZOiJBYW5MYXRlbmN5IixBQU5fRVJST1I6IkFhbkVycm9yIixEUk9QX0RPV05fU0VMRUNUT1I6IkRyb3BEb3duU2VsZWN0b3IiLFVOQ0FVR0hUX0VSUk9SOiJVbmNhdWdodEVycm9yIixVTkRFRklORURfVFJBQ0tFUl9BUkc6IlVuZGVmaW5lZFRyYWNrZXJBcmciLENPT1JESU5BVE9SX1RSQUNLRVI6IkNvb3JkaW5hdG9yVHJhY2tlciIsSU1BR0VfTE9BRF9MQVRFTkNZOiJJbWFnZUxvYWRMYXRlbmN5IixDUkVBVElWRV9MT0FEX0xBVEVOQ1k6IkNyZWF0aXZlTG9hZExhdGVuY3kifX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKHQpLHI9byh0KSx1PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1hKHUudG9wLHUuYm90dG9tLG4pLGw9YSh1LmxlZnQsdS5yaWdodCxyKSxzPWMqbCxmPSh1LmJvdHRvbS11LnRvcCkqKHUucmlnaHQtdS5sZWZ0KTtyZXR1cm4gTWF0aC5taW4oMSxNYXRoLm1heCgwLHMvZikpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUuaW5uZXJIZWlnaHR8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodH1mdW5jdGlvbiBvKGUpe3JldHVybiBlLmlubmVyV2lkdGh8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRofWZ1bmN0aW9uIGEoZSx0LG4pe3ZhciByPTA7cmV0dXJuIHI9ZT4wP24tZTp0PjA/TWF0aC5taW4odCxuKTowLE1hdGgubWluKHIsdC1lKX1mdW5jdGlvbiB1KGUpe3ZhciB0PW51bGwsbj1mdW5jdGlvbiByKCl7ZSgpfHwodD1zZXRUaW1lb3V0KHIsMTAwKSl9O3JldHVybiBuKCkse2NsZWFyOmZ1bmN0aW9uKCl7dCYmY2xlYXJUaW1lb3V0KHQpfX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7bih0aGlzLGUpLHRoaXMud2luZG93PXJ8fHdpbmRvdyx0aGlzLmVsZW09dH1yZXR1cm4gYyhlLFt7a2V5OiJnZXRQZXJjZW50SW5WaWV3Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VG9wV2luZG93KCk7aWYoZSl7aWYodGhpcy53aW5kb3c9PT1lKXJldHVybiByKHRoaXMuZWxlbSxlKTtpZih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQpcmV0dXJuIHIodGhpcy53aW5kb3cuZnJhbWVFbGVtZW50LGUpfWVsc2UgaWYodGhpcy53aW5kb3cuJHNmKXRyeXt2YXIgdD10aGlzLndpbmRvdy4kc2YuZXh0LmluVmlld1BlcmNlbnRhZ2UoKXx8MDtyZXR1cm4gdC8xMDB9Y2F0Y2gobil7fXJldHVybi0xfX0se2tleToiZ2V0VG9wV2luZG93Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPW51bGw7dHJ5e2lmKCF0aGlzLndpbmRvdy50b3AuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJjcm9zcy1kb21haW4gZXhjZXB0aW9uIik7ZT10aGlzLndpbmRvdy50b3B9Y2F0Y2godCl7fXJldHVybiBlfX0se2tleToib25WaWV3VGhyZXNob2xkIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLG89bnVsbDtyZXR1cm4gdShmdW5jdGlvbigpe2lmKGkuZ2V0UGVyY2VudEluVmlldygpPj1lJiZpLmdldFBlcmNlbnRJblZpZXcoKTw9dCl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYobnVsbD09PW8pbz1hO2Vsc2UgaWYoYS1vPm4pcmV0dXJuIHIoKSwhMH1lbHNlIG89bnVsbH0pfX0se2tleToib25WaWV3Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub25WaWV3VGhyZXNob2xkKGUsMSx0LG4pfX0se2tleToib25IaWRlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub25WaWV3VGhyZXNob2xkKDAsZSx0LG4pfX0se2tleToiZ2V0VmVydGljYWxQb3NpdGlvbk9uUGFnZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0tMSx0PXRoaXMuZ2V0VG9wV2luZG93KCk7aWYodCl7aWYodGhpcy53aW5kb3c9PT10KXt2YXIgbj10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLHI9aSh0KSxvPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7ZT1NYXRoLm1heChNYXRoLm1pbihuLyhyLW8pLDEpLDApfWVsc2UgaWYodGhpcy53aW5kb3cuZnJhbWVFbGVtZW50KXt2YXIgbj10aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLHI9aSh0KSxvPXRoaXMud2luZG93LmZyYW1lRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7ZT1NYXRoLm1heChNYXRoLm1pbihuLyhyLW8pLDEpLDApfX1lbHNlIGlmKHRoaXMud2luZG93LiRzZil0cnl7ZT1NYXRoLm1heChNYXRoLm1pbigkc2YuZXh0Lmdlb20oKS5zZWxmLnQvKCRzZi5leHQuZ2VvbSgpLndpbi5oLSRzZi5leHQuZ2VvbSgpLnNlbGYuaCksMSksMCl9Y2F0Y2goYSl7fXJldHVybiBlfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1sfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiB2KGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6dihpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oMTApLHM9cihsKSxmPSJkYS1jeC1tZXRyaWNzIixkPSJDb29yZGluYXRlQ2xpY2siLHA9Impzb24iLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe2kodGhpcyx0KTt2YXIgcj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlLGYpKTtyZXR1cm4gci5pbXByZXNzaW9uSWQ9bixyfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJsb2dDbGljayIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXt9LG89e2N4YzplLnBhZ2VYLGN5YzplLnBhZ2VZLGNwdzpuLGNwaDpyfTtpLmVuPWQsaS50eXBlPXAsaS5pPXRoaXMuaW1wcmVzc2lvbklkO3RyeXtpLmV2PWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvKSl9Y2F0Y2goYSl7aS5zdHJpbmdpZnlOb3RBdmFpbGFibGU9MX1jKHQucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQucHJvdG90eXBlKSwiZmlyZVBpeGVsIix0aGlzKS5jYWxsKHRoaXMsaSl9fV0pLHR9KHNbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPWh9XSk7O3dpbmRvdy5wZGFnU2NvcGUgPSB3aW5kb3cucGRhZ1Njb3BlIHx8IHt9O3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJID0gbmV3IFBkYUNsaWVudEFQSS5kZWZhdWx0KHsiYmFzZVVybCI6Imh0dHBzOi8vcy5hbWF6b24tYWRzeXN0ZW0uY29tIiwic2hhemFtSWQiOiI4MzQzNzc0IiwidGVtcGxhdGVOYW1lIjoiVEVUUklTX01PQklMRV9NWVNUSVFVRSIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIjoiMSIsInRlbXBsYXRlTWlub3JWZXJzaW9uIjoiOCIsImxvY2FsZSI6IlVTIiwiYWRTZXJ2ZXIiOiJjb3JuZXJzdG9uZSIsImFkSWQiOiI0NzU2NjgyNzMwOTAxIiwiY3JlYXRpdmVJZCI6IjQ5ODc4NTA1NTAwMDEiLCJpbXByZXNzaW9uSWQiOiJRT3FvMUJKYkpoWTByNkFsbE5OYS1RIiwiYWRTZXNzaW9uSWQiOiIwMTAxYjBkZDllOWVkNmU0ZDE0ZWU1OTJkMTQzMDcyYzUwNWE1M2UxZTNlNzZhNjUzYWI2NjNmYTAxMGZlYzk5MDM4NiJ9KTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS50cmFja0xvYWRMYXRlbmN5KCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYXR0YWNoR2xvYmFscygpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZEVycm9yTGlzdGVuZXIoKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+PGRpdiBpZD1hZD48ZGl2IGNsYXNzPSJtb2JpbGVNeXN0aXF1ZSB0ZW1wbGF0ZUNvbnRhaW5lciIgZGF0YS1jcmVhdGl2ZS1pZD0iNDk4Nzg1MDU1MDAwMSIgZGF0YS1hZC1pZD0iNDc1NjY4MjczMDkwMSIgZGF0YS1yZWFjdHJvb3Q9IiIgZGF0YS1yZWFjdGlkPSIxIiBkYXRhLXJlYWN0LWNoZWNrc3VtPSIxNjA3NjIwOTU4Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Ra0RxcU5RU1d5WVdOSy1nSlpUVFd2a0FBQUZocEprcVNBRUFBQUdRQVctNFRUZy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzA5OTYzNjY3MzM/YWF4aXRrPVNjYldVd1ZYbzZ0T3ZIYnVkYVZTMnciIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIyIj48L2E+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMjVweDtib3JkZXI6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojRkZGRkZGOyIgZGF0YS1yZWFjdGlkPSIzIj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9IndpZHRoOjE2MHB4O2hlaWdodDoxMDAlO3BhZGRpbmc6NXB4IDEwcHggNXB4IDEwcHg7ZmxleDowIDAgMTI1cHg7IiBkYXRhLXJlYWN0aWQ9IjQiPjxkaXYgY2xhc3M9ImFzaW5JbWFnZSIgZGF0YS1yZWFjdGlkPSI1Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayBhc2luSW1hZ2UiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUWtEcXFOUVNXeVlXTkstZ0paVFRXdmtBQUFGaHBKa3FTQUVBQUFHUUFXLTRUVGcvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wOTk2MzY2NzMzP2FheGl0az1TY2JXVXdWWG82dE92SGJ1ZGFWUzJ3IiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iNiI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iNyI+PGltZyBjbGFzcz0ibWVkaWFDZW50cmFsSW1hZ2UgaW1hZ2VDb250YWluZXJfX2ltYWdlIiBzcmM9Imh0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9JLzUxNno3MmhGaFpMLl9BQ19TWDE2MF8uanBnIiBhbHQ9IkJyaW5nIHlvdXIgd2ViIGRlc2lnbiB0byBsaWZlIHdpdGggc2ltcGxpZmllZCBKYXZhU2NyaXB0IGluc3RydWN0aW9uIiBkYXRhLXJlYWN0aWQ9IjgiLz48L2Rpdj48L2E+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxMDAlO2JhY2tncm91bmQ6I0ZGRkZGRjtiYWNrZ3JvdW5kOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI0ZGRkZGRiwgI0VCRUJFQik7YmFja2dyb3VuZDotby1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgLW8tbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpO2JhY2tncm91bmQ6LW1vei1saW5lYXItZ3JhZGllbnQoI0ZGRkZGRiwgI0VCRUJFQik7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpOyIgZGF0YS1yZWFjdGlkPSI5Ij48ZGl2IGNsYXNzPSJibG9jayBibG9jay0tanVzdGlmeS1jZW50ZXIgYmxvY2stLWRpcmVjdGlvbi1jb2x1bW4iIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6MCAxMHB4IDAgMDsiIGRhdGEtcmVhY3RpZD0iMTAiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMCA1cHggMDsiIGRhdGEtcmVhY3RpZD0iMTEiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHRleHRMaW5rIHRleHRMaW5rLS1kaXNwbGF5QXNUZXh0IiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FrRHFxTlFTV3lZV05LLWdKWlRUV3ZrQUFBRmhwSmtxU0FFQUFBR1FBVy00VFRnL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDk5NjM2NjczMz9hYXhpdGs9U2NiV1V3VlhvNnRPdkhidWRhVlMydyIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjEyIj48ZGl2IHN0eWxlPSJmb250LXNpemU6MThweDtmb250LXN0eWxlOml0YWxpYztjb2xvcjojNTU1O2xpbmUtaGVpZ2h0OjIwcHg7IiBjbGFzcz0idGV4dENvbnRhaW5lciIgZGF0YS1yZWFjdGlkPSIxMyI+PHNwYW4gY2xhc3M9InRleHRDb250YWluZXJfX3RleHQiIGRhdGEtcmVhY3RpZD0iMTQiPlJlYWR5IHRvIHdyaXRlIHRoZSBzY3JpcHQgdGhhdCBwb3dlcnMgdGhlIHdlYj88L3NwYW4+PC9kaXY+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMCA1cHggMDsiIGRhdGEtcmVhY3RpZD0iMTUiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHRleHRMaW5rIiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FrRHFxTlFTV3lZV05LLWdKWlRUV3ZrQUFBRmhwSmtxU0FFQUFBR1FBVy00VFRnL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDk5NjM2NjczMz9hYXhpdGs9U2NiV1V3VlhvNnRPdkhidWRhVlMydyIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjE2Ij48ZGl2IHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LXdlaWdodDo2MDA7IiBjbGFzcz0idGV4dENvbnRhaW5lciBoLWVsbGlwc2lzIiBkYXRhLXJlYWN0aWQ9IjE3Ij48c3BhbiBjbGFzcz0idGV4dENvbnRhaW5lcl9fdGV4dCIgZGF0YS1yZWFjdGlkPSIxOCI+QnJpbmcgeW91ciB3ZWIgZGVzaWduIHRvIGxpZmUgd2l0aCBzaW1wbGlmaWVkIEphdmFTY3JpcHQgaW5zdHJ1Y3Rpb248L3NwYW4+PC9kaXY+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIGJsb2NrLS1pbmxpbmUgIiBzdHlsZT0id2hpdGUtc3BhY2U6bm9ybWFsOyIgZGF0YS1yZWFjdGlkPSIxOSI+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJtYXJnaW46MCA1cHggMCAwOyIgZGF0YS1yZWFjdGlkPSIyMCI+PHNwYW4gY2xhc3M9InByaWNlQm94IiBkYXRhLXJlYWN0aWQ9IjIxIj48IS0tIHJlYWN0LXRleHQ6IDIyIC0tPjwhLS0gL3JlYWN0LXRleHQgLS0+PHNwYW4gY2xhc3M9InByaWNlIHByaWNlQm94X19idXkiIHN0eWxlPSJmb250LXNpemU6MTVweDsiIGRhdGEtcmVhY3RpZD0iMjMiPjxzcGFuIGNsYXNzPSJwcmljZV9fY3VycmVuY3kiIGRhdGEtcmVhY3RpZD0iMjQiPiQ8L3NwYW4+PHNwYW4gY2xhc3M9InByaWNlX19hbW91bnQiIGRhdGEtcmVhY3RpZD0iMjUiPjcuOTc8L3NwYW4+PC9zcGFuPjwhLS0gcmVhY3QtdGV4dDogMjYgLS0+PCEtLSAvcmVhY3QtdGV4dCAtLT48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlOyIgZGF0YS1yZWFjdGlkPSIyNyI+PGltZyBjbGFzcz0ibWVkaWFDZW50cmFsSW1hZ2UgcHJpbWVMb2dvIiBzcmM9Imh0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9HLzAxL2RhL2NyZWF0aXZlcy9wcmltZS0yeC0yMDE3MDYxNC5wbmciIHdpZHRoPSI0MyIgaGVpZ2h0PSIxMiIgYWx0PSJQcmltZSIgZGF0YS1yZWFjdGlkPSIyOCIvPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMTBweCAwIDEwcHg7aGVpZ2h0OjEyM3B4O29wYWNpdHk6MC42NDtmbGV4OjAgMCA5cHg7IiBkYXRhLXJlYWN0aWQ9IjI5Ij48ZGl2IGNsYXNzPSJpbWFnZUNvbnRhaW5lciIgZGF0YS1yZWFjdGlkPSIzMCI+PGltZyBjbGFzcz0ibWVkaWFDZW50cmFsSW1hZ2UgaW1hZ2VDb250YWluZXJfX2ltYWdlIiBzcmM9Imh0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9HLzAxL0FtYXpvbkJyYW5kU3RvcmVzUGxhdGZvcm0vYmxhY2tfYXJyb3cucG5nIiBhbHQ9IkdyYXkgQXJyb3ciIHJvbGU9InByZXNlbnRhdGlvbiIgZGF0YS1yZWFjdGlkPSIzMSIvPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxzY3JpcHQgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYWN4L2pzL3JlYWN0LTE1LjMuMi5taW4uanMiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYWN4L2pzL3JlYWN0LWRvbS0xNS4zLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0PnZhciBMaWJyYXJ5PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBvPW5bcl09e2V4cG9ydHM6e30saWQ6cixsb2FkZWQ6ITF9O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubG9hZGVkPSEwLG8uZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPSIiLHQoMCl9KFtmdW5jdGlvbihlLHQsbil7bigxKSxlLmV4cG9ydHM9bigxMDApfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjsiZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LmFzc2lnbiYmKE9iamVjdC5hc3NpZ249ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3QoZSkscj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe3ZhciBvPWFyZ3VtZW50c1tyXTtpZihudWxsIT1vKWZvcih2YXIgaSBpbiBvKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLGkpJiYobltpXT1vW2ldKX1yZXR1cm4gbn0pfSwsZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9UmVhY3R9LCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oNiksYz1yKHApLGY9bigyNyksZD1yKGYpLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wcm9wcy51cGRhdGVPblJlc2l6ZSYmdGhpcy5saXN0ZW5Gb3JSZXNpemUoKX19LHtrZXk6Imxpc3RlbkZvclJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzOyJ1bmRlZmluZWQiIT10eXBlb2YgU0ZDbGllbnQmJlNGQ2xpZW50JiZTRkNsaWVudC5yZWdpc3RlckN1c3RvbU1lc3NhZ2VMaXN0ZW5lcj9TRkNsaWVudC5yZWdpc3RlckN1c3RvbU1lc3NhZ2VMaXN0ZW5lcigicmVzaXplIixmdW5jdGlvbigpe2Uub25SZXNpemUoKX0pOiJ1bmRlZmluZWQiIT10eXBlb2YgTVNGQ2xpZW50JiZNU0ZDbGllbnQmJk1TRkNsaWVudC5yZWdpc3RlckN1c3RvbU1lc3NhZ2VMaXN0ZW5lcj9NU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixmdW5jdGlvbigpe2Uub25SZXNpemUoKX0pfX0se2tleToib25SZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5mb3JjZVVwZGF0ZSgpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMucmVuZGVyaW5nQ29udGV4dCx0PXRoaXMucHJvcHMuc3RydWN0dXJlLG49dGhpcy5wcm9wcy5jbGFzc05hbWUrKHRoaXMucHJvcHMuc2t5PyIgc2t5IjoiIik7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dGVtcGxhdGVJZDp0aGlzLnByb3BzLnRlbXBsYXRlSWQsY2xhc3NOYW1lOm4saHJlZjplLmFkTGluayxjbGlja1VybHM6ZS5jbGlja1VybHMsY3JlYXRpdmVJZDplLmNyZWF0aXZlSWQsYWRJZDplLmFkSWR9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7cmVuZGVyaW5nQ29udGV4dDplLGJsb2NrOnQsY29tcG9uZW50c01hcDp0aGlzLnByb3BzLmNvbXBvbmVudHNNYXAsZG9tUmVmczp0aGlzLnByb3BzLmRvbVJlZnN9KSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInRlbXBsYXRlQ29udGFpbmVyIiwiYmxvY2siXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRlbXBsYXRlIixoLnByb3BUeXBlcz17cmVuZGVyaW5nQ29udGV4dDp1LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxzdHJ1Y3R1cmU6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY29tcG9uZW50c01hcDp1LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxjbGFzc05hbWU6dS5Qcm9wVHlwZXMuc3RyaW5nLGRvbVJlZnM6dS5Qcm9wVHlwZXMub2JqZWN0LHRlbXBsYXRlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHVwZGF0ZU9uUmVzaXplOnUuUHJvcFR5cGVzLmJvb2wsc2t5OnUuUHJvcFR5cGVzLmJvb2x9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oNyksYz1yKHApLGY9bigyNCksZD1yKGYpLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtmbGV4Ym94OiEwfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm5vZGUmJnRoaXMuc2V0U3RhdGUoe2ZsZXhib3g6ZFsiZGVmYXVsdCJdLnN1cHBvcnQuZmxleGJveCgpfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSh0aGlzLnByb3BzLmNsYXNzTmFtZT90aGlzLnByb3BzLmNsYXNzTmFtZSsiICI6IiIpKyJ0ZW1wbGF0ZUNvbnRhaW5lciIrKHRoaXMuc3RhdGUuZmxleGJveD8iIjoiIGgtbm9GbGV4Ym94Iik7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtzdHlsZTp0aGlzLnByb3BzLnN0eWxlLGNsYXNzTmFtZTp0LGlkOnRoaXMucHJvcHMudGVtcGxhdGVJZCwiZGF0YS1jcmVhdGl2ZS1pZCI6dGhpcy5wcm9wcy5jcmVhdGl2ZUlkLCJkYXRhLWFkLWlkIjp0aGlzLnByb3BzLmFkSWQscmVmOmZ1bmN0aW9uKHQpe2Uubm9kZT10fX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InRlbXBsYXRlQ29udGFpbmVyX19saW5rIn19KSx0aGlzLnByb3BzLmNoaWxkcmVuKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsiQ2xpY2t0aHJvdWdoTGluayJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWgsaC5kaXNwbGF5TmFtZT0iVGVtcGxhdGVDb250YWluZXIgIixoLnByb3BUeXBlcz17c3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGNsYXNzTmFtZTp1LlByb3BUeXBlcy5zdHJpbmcsdGVtcGxhdGVJZDp1LlByb3BUeXBlcy5zdHJpbmcsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLmlzUmVxdWlyZWQsY3JlYXRpdmVJZDp1LlByb3BUeXBlcy5zdHJpbmcsYWRJZDp1LlByb3BUeXBlcy5zdHJpbmd9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxsPW4oMykscD1yKGwpLGM9big4KSxmPXIoYyksZD1uKDkpLGg9cihkKSx5PW4oMTIpLG09cih5KSxiPW4oMjMpLHY9cihiKSxnPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoYi5DT1VQT05fVE9LRU5fTUFDUk8sKDAsdlsiZGVmYXVsdCJdKSgpKX0sXz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImhhbmRsZU9uQ2xpY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucHJvcHMsbj10LmNsaWNrVHJhY2tlclVybHMscj10LnVybCxvPXQuY2FzY2FkaW5nSW50ZW50LGk9dC5pc09mZnNpdGU7KDAsZlsiZGVmYXVsdCJdKShuKSwoMCxtWyJkZWZhdWx0Il0pKGcociksaSxvKSYmZS5wcmV2ZW50RGVmYXVsdCgpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLG49dC51cmwscj10LmlzT2Zmc2l0ZSxvPXQuY2hpbGRyZW4saT10LmFuY2hvclByb3BzLGE9bnVsbDt0aGlzLmNvbnRleHQuaXNTdGF0aWNIdG1sJiZ0aGlzLnByb3BzLmNsaWNrVHJhY2tlclVybHMmJihhPXRoaXMucHJvcHMuY2xpY2tUcmFja2VyVXJscy5qb2luKCJ8IikpO3ZhciB1PSJjbGlja3Rocm91Z2hMaW5rIisoaS5jbGFzc05hbWU/IiAiK2kuY2xhc3NOYW1lOiIiKTtyZXR1cm4gcFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImEiLHMoe30saSx7Y2xhc3NOYW1lOnUsaHJlZjpnKG4pLHRhcmdldDooMCxoWyJkZWZhdWx0Il0pKG4sciksb25DbGljazpmdW5jdGlvbih0KXtyZXR1cm4gZS5oYW5kbGVPbkNsaWNrKHQpfSxvbk1vdXNlRG93bjpmdW5jdGlvbigpe3JldHVybiBlLmZvcmNlVXBkYXRlKCl9LCJkYXRhLWNsaWNrVHJhY2tlclVybHMiOmEscmVsOiJub2ZvbGxvdyJ9KSxvKX19XSksdH0obC5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1fLF8uZGlzcGxheU5hbWU9IkNsaWNrdGhyb3VnaExpbmsiLF8ucHJvcFR5cGVzPXt1cmw6bC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsY2FzY2FkaW5nSW50ZW50OmwuUHJvcFR5cGVzLnN0cmluZyxpc09mZnNpdGU6bC5Qcm9wVHlwZXMuYm9vbCxjbGlja1RyYWNrZXJVcmxzOmwuUHJvcFR5cGVzLmFycmF5T2YobC5Qcm9wVHlwZXMuc3RyaW5nKSxhbmNob3JQcm9wczpsLlByb3BUeXBlcy5vYmplY3QsY2hpbGRyZW46bC5Qcm9wVHlwZXMubm9kZX0sXy5jb250ZXh0VHlwZXM9e2lzU3RhdGljSHRtbDpsLlByb3BUeXBlcy5ib29sfX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSksbz0wO2U+bztvKyspdFtvXT1hcmd1bWVudHNbb107Zm9yKHZhciBpIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIGE9dFtpXTtpZihhKWlmKCJzdHJpbmciPT10eXBlb2YgYSlyKGEpO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmlyZSBwaXhlbDogIicrSlNPTi5zdHJpbmdpZnkoYSkrJyIgaXMgbm90IGEgc3RyaW5nIScpO24uYXBwbHkodGhpcyxhKX19fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbihlKXsidW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlJiYoKG5ldyBJbWFnZSkuc3JjPWUpfTt0WyJkZWZhdWx0Il09bn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj10fHwhKDAsYVsiZGVmYXVsdCJdKShlKTtyZXR1cm4gbj9zLklOX05FV19XSU5ET1c6cy5JTl9TQU1FX1dJTkRPV31PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW87dmFyIGk9bigxMCksYT1yKGkpLHM9bigxMSl9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHIudGVzdChlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW47dmFyIHI9L14oKGh0dHBzPzopP1wvXC8pKC4qXC4pP2FtYXpvblwuL30sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPXQuSU5fU0FNRV9XSU5ET1c9Il90b3AiLHI9dC5JTl9ORVdfV0lORE9XPSJfYmxhbmsiO3RbImRlZmF1bHQiXT17SU5fTkVXX1dJTkRPVzpyLElOX1NBTUVfV0lORE9XOm59fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQsbil7aWYoIXQmJm1bImRlZmF1bHQiXSYmQyYmcFsiZGVmYXVsdCJdLm1hc2guaXNBVUlBdmFpbGFibGUoKSYmKDAsVFsiZGVmYXVsdCJdKShlLHQpPT09UC5JTl9ORVdfV0lORE9XKXBbImRlZmF1bHQiXS5tYXNoLm9wZW5JbkV4dGVybmFsQnJvd3Nlci5leGVjdXRlKHt1cmw6ZX0pO2Vsc2UgaWYoIXR8fCFNfHx2WyJkZWZhdWx0Il0mJiFTKFsyLDIsMTBdKXx8X1siZGVmYXVsdCJdJiYhUyhbNSw1LDEzNV0pKXtpZighdHx8IUkpcmV0dXJuITE7ZlsiZGVmYXVsdCJdLm9wZW4oZSl9ZWxzZSBoWyJkZWZhdWx0Il0ub3BlbkluRXh0ZXJuYWxCcm93c2VyKG58fGUpO3JldHVybiEwfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4oMCxUWyJkZWZhdWx0Il0pKGUsdCk9PT1QLklOX1NBTUVfV0lORE9XfWZ1bmN0aW9uIGEoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuIHVbImRlZmF1bHQiXS5vcGVuKGUsKDAsVFsiZGVmYXVsdCJdKShlLHQpKX0sYT1mdW5jdGlvbigpe3JldHVybiBvKGUsdCxuKX0scz1mdW5jdGlvbigpe3JldHVybiBhKCl8fHIoKX07cmV0dXJuIGkoZSx0KT8oc2V0VGltZW91dChzLFIpLCEwKTphKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1hO3ZhciBzPW4oMTMpLHU9cihzKSxsPW4oMTQpLHA9cihsKSxjPW4oMTUpLGY9cihjKSxkPW4oMTYpLGg9cihkKSx5PW4oMTcpLG09cih5KSxiPW4oMTgpLHY9cihiKSxnPW4oMjEpLF89cihnKSxQPW4oMTEpLGs9big5KSxUPXIoaykseD1uKDIyKSxPPXIoeCksdz0hIXBbImRlZmF1bHQiXSxDPXcmJiJ1bmRlZmluZWQiIT10eXBlb2YgcFsiZGVmYXVsdCJdLm1hc2gsaj0hIWhbImRlZmF1bHQiXSxNPWomJiJmdW5jdGlvbiI9PXR5cGVvZiBoWyJkZWZhdWx0Il0ub3BlbkluRXh0ZXJuYWxCcm93c2VyLEU9ISFmWyJkZWZhdWx0Il0sST1FJiYiZnVuY3Rpb24iPT10eXBlb2YgZlsiZGVmYXVsdCJdLm9wZW4sTj1qJiZmdW5jdGlvbigpe3ZhciBlPWhbImRlZmF1bHQiXS5nZXRTREtWZXJzaW9uKCkubWF0Y2goLyhcZCspXC4oXGQrKS4oXGQrKSQvKTtyZXR1cm4gZT9bZVsxXSxlWzJdLGVbM11dOnZvaWQgMH0oKSxTPWZ1bmN0aW9uKGUpe3JldHVybiBOJiYoMCxPWyJkZWZhdWx0Il0pKE4sZSk+PTB9LFI9MTUwfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdzt0WyJkZWZhdWx0Il09bn0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgTVNGQ2xpZW50JiZNU0ZDbGllbnQ7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIG1yYWlkJiZtcmFpZDt0WyJkZWZhdWx0Il09bn0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uJiZhbWF6b247dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LGk9bigxNCksYT1yKGkpLHM9ZnVuY3Rpb24oKXtpZighYVsiZGVmYXVsdCJdKXJldHVybiExO3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhWyJkZWZhdWx0Il0uZ2V0RG9jdW1lbnRDb29raWUoKSkuc3BsaXQoIjsiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuc3BsaXQoIj0iKTtuJiZuLmxlbmd0aD49MiYmKGVbblswXS50cmltKCldPW5bMV0udHJpbSgpKX0pLHt2Oi9cImF2XCI6XCIoWy5cZF0qKVwiL2kudGVzdChlWyJhbXpuLWFwcC1jdHh0Il0pfX0oKTtyZXR1cm4ib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIGU/InVuZGVmaW5lZCI6byhlKSk/ZS52OnZvaWQgMH0oKTt0WyJkZWZhdWx0Il09c30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE5KSxpPXIobyksYT0vaVBob25lfGlQYWR8aVBvZC8udGVzdChpWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT1hfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTQpLGk9cihvKSxhPW4oMjApLHM9cihhKSx1PWlbImRlZmF1bHQiXSYmaVsiZGVmYXVsdCJdLmdldFVzZXJBZ2VudEluZm8oKXx8c1siZGVmYXVsdCJdJiZzWyJkZWZhdWx0Il0udXNlckFnZW50O3RbImRlZmF1bHQiXT11fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvcjt0WyJkZWZhdWx0Il09bn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE5KSxpPXIobyksYT0vQW5kcm9pZC8udGVzdChpWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT1hfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7bj5yO3IrKyl7dmFyIG89ZVtyXSxpPXRbcl07aWYobz5pKXJldHVybiAxO2lmKGk+bylyZXR1cm4tMX1yZXR1cm4gMH1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IkFNUyI7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGJ0b2E/YnRvYShEYXRlLm5vdygpKygiOyIrZSkpOiIifU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0WyJkZWZhdWx0Il09bjt0LkNPVVBPTl9UT0tFTl9NQUNSTz0iVlBDX0NTX01BQ1JPIn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXZhciBvPW4oMjUpLGk9cihvKSxhPW4oMjYpLHM9cihhKSx1PS9eLipcL1wvW15cL10rLztlLmV4cG9ydHM9e3N1cHBvcnQ6e2ZsZXhib3g6ZnVuY3Rpb24oKXtyZXR1cm4gTW9kZXJuaXpyJiYoTW9kZXJuaXpyLmZsZXhib3h8fE1vZGVybml6ci5mbGV4Ym94bGVnYWN5fHxNb2Rlcm5penIuZmxleGJveHR3ZWVuZXIpfX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuc3BsaXQoIi4iKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj10Lm1hdGNoKC8oLiopXFsoXGQqKVxdLykscj1uJiZuWzFdLG89biYmblsyXTtyZXR1cm4gciYmbz9lW3JdW3BhcnNlSW50KG8sMTApXTplW3RdfSxlKX0sZ2V0TWVkaWFDZW50cmFsSW1hZ2VTcmM6ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciBvPWlbImRlZmF1bHQiXS51cmxzLk1FRElBX0NFTlRSQUxfV1csYT1lLnJlcGxhY2UodSwiIiksbD1vKygwPT09YS5pbmRleE9mKCIvIik/IiI6Ii8iKSthLHA9e30sYz1yPzI6MTtyZXR1cm4gdC5hYyYmKHAuQUM9ITApLHQuc3gmJihwLlNYPXQuc3gqYyksdC5zeSYmKHAuU1k9dC5zeSpjKSx0LnFsJiYocC5RTD10LnFsKSx0LmZtJiYocC5GTT10LmZtKSxzWyJkZWZhdWx0Il0uc2V0VGFncyhsLHAsWyJBQyIsIlNYIiwiU1kiLCJGTSIsIlFMIl0sbil9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXt1cmxzOntNRURJQV9DRU5UUkFMX1dXOiJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbSIsTUVESUFfQ0VOVFJBTF9DTjoiaHR0cHM6Ly9pbWFnZXMtY24uc3NsLWltYWdlcy1hbWF6b24uY29tIn19fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e3NldFRhZ3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89L1wuXyhbXlwuXSspKD89X1wuXHcrJCkvLGk9by5leGVjKGUpLGE9aT9pWzFdLnNwbGl0KCJfIik6W10scz1PYmplY3QuYXNzaWduKHt9LHQpLHU9W107ciYmYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCIiIT09ZSl7dmFyIHQsbj1lLnN1YnN0cmluZygwLDIpOyJ1bmRlZmluZWQiIT10eXBlb2Ygc1tuXT8oc1tuXT09PSExJiYoc1tuXT1udWxsKSxuPW51bGwpOnQ9ZS5zdWJzdHJpbmcoMixlLmxlbmd0aCksbnVsbCE9PW4mJnUucHVzaChuK3QpfX0pLG4uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1zW2VdO3QmJnUucHVzaChlKyh0PT09ITA/IiI6dCkpfSk7dmFyIGw9LTE7dS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7IkNSIj09PWUuc3Vic3RyaW5nKDAsMikmJihsPXQpfSk7dmFyIHA9ITE7aWYobD49MCl7dmFyIGM9dS5zcGxpY2UobCwxKTt1LnVuc2hpZnQoY1swXSkscD0hMH12YXIgZj11LmluZGV4T2YoIkFDIik7aWYoZj4wKXt2YXIgZD11LnNwbGljZShmLDEpO3A/dS5zcGxpY2UoMSwwLGRbMF0pOnUudW5zaGlmdChkWzBdKX1yZXR1cm4gdS5sZW5ndGg+MCYmKGU9YS5sZW5ndGg+MD9lLnJlcGxhY2UobywiLl8iK3Uuam9pbigiXyIpKTplLnJlcGxhY2UoL1wuKD89XHcrJCkvLCIuXyIrdS5qb2luKCJfIikrIl8uIikpLGV9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDI0KSxjPXIocCksZj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe28odGhpcyx0KTt2YXIgbj1pKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc3RhdGU9e2Nsb2FrOm4uZXh0cmFjdE1ldGFkYXRhKGUuYmxvY2ssImNsb2FrIil9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2V0U3RhdGUoe2Nsb2FrOiExfSl9fSx7a2V5OiJnZXRDbGFzc05hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ImJsb2NrIix0PSIiO3RoaXMucHJvcHMuYmxvY2suY3NzQ2xhc3NlcyYmKHQ9dGhpcy5wcm9wcy5ibG9jay5jc3NDbGFzc2VzLmpvaW4oIiAiKSksIiIhPT10JiYoZSs9IiAiK3QpO3ZhciBuPXRoaXMucHJvcHMuYmxvY2subGF5b3V0O3JldHVybiBuJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPW5bdF07Imp1c3RpZnlDb250ZW50Ij09PXQmJiJmbGV4LXN0YXJ0IiE9PXI/ZSs9IiBibG9jay0tanVzdGlmeS0iK3I6ImFsaWduSXRlbXMiPT09dCYmInN0cmV0Y2giIT09cj9lKz0iIGJsb2NrLS1hbGlnbi0iK3I6ImZsZXhEaXJlY3Rpb24iPT09dCYmInJvdyIhPT1yJiYoZSs9IiBibG9jay0tZGlyZWN0aW9uLSIrcil9KSx0aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQmJnRoaXMucHJvcHMuYmxvY2suYmFja2dyb3VuZC5pZCYmKGUrPSIgYmxvY2stLWJhY2tncm91bmQiKSx0aGlzLnN0YXRlLmNsb2FrJiYoZSs9IiBoLWNsb2FrIiksZX19LHtrZXk6InByZXZlbnRQcm9wZXJ0eSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCYmIiIhPT10PyJqdXN0aWZ5Q29udGVudCI9PT1lfHwiYWxpZ25JdGVtcyI9PT1lfHwiZmxleERpcmVjdGlvbiI9PT1lOiEwfX0se2tleToiZ2V0QmxvY2tMYXlvdXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMucHJvcHMuYmxvY2subGF5b3V0LG49e307cmV0dXJuIHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIG89dFtyXTtlLnByZXZlbnRQcm9wZXJ0eShyLG8pfHwobltyXT1vKX0pLG59fSx7a2V5OiJnZXRCbG9ja1N0eWxlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMuYmxvY2suc3R5bGUsdD17fTtyZXR1cm4gZSYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPWUudmFsdWU7InVuZGVmaW5lZCIhPXR5cGVvZiB0W2UubmFtZV0mJihuPXRbZS5uYW1lXSsiOyIrZS5uYW1lKyI6IituKSx0W2UubmFtZV09bn0pLHR9fSx7a2V5OiJnZXRQcm9wVmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuInBhdGgiPT09dC50eXBlP2NbImRlZmF1bHQiXS5nZXQoZSx0LnZhbHVlKToiY29uc3RhbnQiPT09dC50eXBlP3QudmFsdWU6bnVsbH19LHtrZXk6ImdldENvbXBvbmVudFByb3BzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49e307cmV0dXJuIGUucHJvcHMmJmUucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtuW2UubmFtZV09dC5nZXRQcm9wVmFsdWUodC5wcm9wcy5yZW5kZXJpbmdDb250ZXh0LGUpfSksbn19LHtrZXk6ImV4dHJhY3RNZXRhZGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj12b2lkIDA7cmV0dXJuIGUubWV0YWRhdGEuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYobj1lLnZhbHVlKX0pLG59fSx7a2V5OiJzZXRSZWYiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssInJlZiIpO3QmJnRoaXMucHJvcHMuZG9tUmVmcyYmKHRoaXMucHJvcHMuZG9tUmVmc1t0XT1lKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dGhpcy5leHRyYWN0TWV0YWRhdGEodGhpcy5wcm9wcy5ibG9jaywiaGlkZSIpLHI9dGhpcy5leHRyYWN0TWV0YWRhdGEodGhpcy5wcm9wcy5ibG9jaywiaWQiKSxvPXZvaWQgMCxpPXZvaWQgMCxhPXZvaWQgMCxzPXZvaWQgMCx1PXZvaWQgMCxwPXZvaWQgMCxjPXZvaWQgMDtpZighbil7bz10aGlzLmdldENsYXNzTmFtZSgpO3ZhciBmPXRoaXMuZ2V0QmxvY2tMYXlvdXQoKSxkPXRoaXMuZ2V0QmxvY2tTdHlsZSgpO2k9T2JqZWN0LmFzc2lnbih7fSxmLGQpLGE9W107dmFyIGg9dGhpcy5wcm9wcy5ibG9jay5jaGlsZHJlbjtoJiZoLmZvckVhY2goZnVuY3Rpb24obil7YS5wdXNoKGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHQse3JlbmRlcmluZ0NvbnRleHQ6ZS5wcm9wcy5yZW5kZXJpbmdDb250ZXh0LGJsb2NrOm4sY29tcG9uZW50c01hcDplLnByb3BzLmNvbXBvbmVudHNNYXAsZG9tUmVmczplLnByb3BzLmRvbVJlZnMsa2V5Om4uaWR9KSl9KTt2YXIgeT10aGlzLnByb3BzLmJsb2NrLmNvbXBvbmVudDt5JiYodT10aGlzLnByb3BzLmNvbXBvbmVudHNNYXBbeS5pZF0scz10aGlzLmdldENvbXBvbmVudFByb3BzKHkpKTt2YXIgbT10aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQ7bSYmKGM9dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwW20uaWRdLHA9dGhpcy5nZXRDb21wb25lbnRQcm9wcyhtKSl9cmV0dXJuIW4mJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtpZDpyLGNsYXNzTmFtZTpvLHN0eWxlOmkscmVmOmZ1bmN0aW9uKHQpe2Uuc2V0UmVmKHQpfX0sYyYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYmxvY2tfX2JhY2tncm91bmQifSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjLHApKSxhLmxlbmd0aD4wP2E6dSYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQodSxzKSl9fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09ZixmLmRpc3BsYXlOYW1lPSJCbG9jayIsZi5wcm9wVHlwZXM9e3JlbmRlcmluZ0NvbnRleHQ6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsYmxvY2s6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY29tcG9uZW50c01hcDp1LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxkb21SZWZzOnUuUHJvcFR5cGVzLm9iamVjdH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz0xOTksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7bih0aGlzLGUpLHRoaXMubW9kZWw9dCx0aGlzLmJsb2Nrc01hcD17fSx0aGlzLl9idWlsZEJsb2Nrc01hcCgpfXJldHVybiByKGUsW3trZXk6Il9idWlsZEJsb2Nrc01hcCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXt9O2UucHVzaCh0aGlzLm1vZGVsKTtmb3IodmFyIG49MDtlLmxlbmd0aD4wOyl7dmFyIHI9ZS5zaGlmdCgpLGk9dGhpcy5fZ2V0UmVmSWQocik7aWYoIiIhPT1pJiYodGhpcy5ibG9ja3NNYXBbaV09ciksdFtyLmlkXXx8KHRbci5pZF09ITAsZT1lLmNvbmNhdChyLmNoaWxkcmVufHxbXSkpLG4rKyxuPm8pYnJlYWt9fX0se2tleToiX2dldFJlZklkIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD12b2lkIDA7cmV0dXJuIGUubWV0YWRhdGEuZm9yRWFjaChmdW5jdGlvbihlKXsicmVmIj09PWUubmFtZSYmKHQ9ZS52YWx1ZSl9KSx0fX0se2tleToiaGlkZUJsb2NrIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmxvY2tzTWFwW2VdO24mJm4ubWV0YWRhdGEuZm9yRWFjaChmdW5jdGlvbihlKXsiaGlkZSI9PT1lLm5hbWUmJihlLnZhbHVlPXQpfSl9fSx7a2V5OiJhZGRCbG9ja1N0eWxlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5ibG9ja3NNYXBbZV07ciYmKHIuc3R5bGU9ci5zdHlsZXx8W10sci5zdHlsZS5wdXNoKHtuYW1lOnQsdmFsdWU6bn0pKX19LHtrZXk6ImFkZENzc0NsYXNzIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmxvY2tzTWFwW2VdO24mJihuLmNzc0NsYXNzZXM9bi5jc3NDbGFzc2VzfHxbXSxuLmNzc0NsYXNzZXMucHVzaCh0KSl9fSx7a2V5OiJnZXRDb21wb25lbnRQcm9wIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmxvY2tzTWFwW2VdLHI9bnVsbDtyZXR1cm4gbiYmbi5jb21wb25lbnQmJm4uY29tcG9uZW50LnByb3BzJiZuLmNvbXBvbmVudC5wcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubmFtZT09PXQmJihyPWUpfSkscn19LHtrZXk6InNldENvbXBvbmVudFByb3AiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXMuYmxvY2tzTWFwW2VdO2lmKG8mJm8uY29tcG9uZW50KXt2YXIgaT0hMTtvLmNvbXBvbmVudC5wcm9wcz1vLmNvbXBvbmVudC5wcm9wc3x8W10sby5jb21wb25lbnQucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYoZS52YWx1ZT1uLGUudHlwZT1yLGk9ITApfSksaXx8by5jb21wb25lbnQucHJvcHMucHVzaCh7bmFtZTp0LHZhbHVlOm4sdHlwZTpyfSl9fX0se2tleToic2V0Q3NzQ2xhc3NlcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiYobi5jc3NDbGFzc2VzPW4uY3NzQ2xhc3Nlc3x8W10sQXJyYXkuaXNBcnJheSh0KT9uLmNzc0NsYXNzZXM9dDpuLmNzc0NsYXNzZXMucHVzaCh0KSl9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWl9LCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzQpLGM9cihwKSxmPW4oMzUpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtleHRlbmRDb250YWluZXJIZWlnaHQ6dGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQsYWxpZ25tZW50OnRoaXMucHJvcHMuYWxpZ25tZW50LG1heEhlaWdodDp0aGlzLnByb3BzLmhlaWdodH0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoZFsiZGVmYXVsdCJdLHthZGRpdGlvbmFsQ2xhc3M6dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3MscGF0aDp0aGlzLnByb3BzLnBhdGgsd2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsc3g6dGhpcy5wcm9wcy5zeCxzeTp0aGlzLnByb3BzLnN5LHFsOnRoaXMucHJvcHMucWwscmV0aW5hOnRoaXMucHJvcHMucmV0aW5hLGFjOnRoaXMucHJvcHMuYWMsZm06dGhpcy5wcm9wcy5mbSxtZXJnZVRhZ3M6dGhpcy5wcm9wcy5tZXJnZVRhZ3MsYWx0OnRoaXMucHJvcHMuYWx0LHNwcml0ZTp0aGlzLnByb3BzLnNwcml0ZSxyb2xlOnRoaXMucHJvcHMucm9sZSx0aXRsZTp0aGlzLnByb3BzLnRpdGxlLHN0eWxlOnRoaXMucHJvcHMuc3R5bGUsb25Mb2FkOnRoaXMucHJvcHMub25Mb2FkfSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJpbWFnZUNvbnRhaW5lciIsIm1lZGlhQ2VudHJhbEltYWdlIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJNZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIsaC5wcm9wVHlwZXM9e2FkZGl0aW9uYWxDbGFzczp1LlByb3BUeXBlcy5zdHJpbmcscGF0aDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxleHRlbmRDb250YWluZXJIZWlnaHQ6dS5Qcm9wVHlwZXMuYm9vbCxhbGlnbm1lbnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIscmV0aW5hOnUuUHJvcFR5cGVzLmJvb2wsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsZm06dS5Qcm9wVHlwZXMuc3RyaW5nLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGFsdDp1LlByb3BUeXBlcy5zdHJpbmcsc3ByaXRlOnUuUHJvcFR5cGVzLmJvb2wscm9sZTp1LlByb3BUeXBlcy5zdHJpbmcsdGl0bGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxvbkxvYWQ6dS5Qcm9wVHlwZXMuZnVuYyxtYXhIZWlnaHQ6dS5Qcm9wVHlwZXMubnVtYmVyfSxoLmRlZmF1bHRQcm9wcz17cmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ImltYWdlQ29udGFpbmVyIisodGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQ/IiBpbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0IjoiIik7dGhpcy5wcm9wcy5hbGlnbm1lbnQmJiIiIT09dGhpcy5wcm9wcy5hbGlnbm1lbnQmJihlKz0iIGltYWdlQ29udGFpbmVyLS0iK3RoaXMucHJvcHMuYWxpZ25tZW50KTt2YXIgdD17fTtyZXR1cm4gdGhpcy5wcm9wcy5tYXhIZWlnaHQmJk9iamVjdC5hc3NpZ24odCx7bWF4SGVpZ2h0OnRoaXMucHJvcHMubWF4SGVpZ2h0fSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTplLHN0eWxlOnR9LGxbImRlZmF1bHQiXS5jbG9uZUVsZW1lbnQodGhpcy5wcm9wcy5jaGlsZHJlbix7YWRkaXRpb25hbENsYXNzOiJpbWFnZUNvbnRhaW5lcl9faW1hZ2UifSkpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPXAscC5kaXNwbGF5TmFtZT0iSW1hZ2VDb250YWluZXIiLHAucHJvcFR5cGVzPXtleHRlbmRDb250YWluZXJIZWlnaHQ6dS5Qcm9wVHlwZXMuYm9vbCxhbGlnbm1lbnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLG1heEhlaWdodDp1LlByb3BUeXBlcy5udW1iZXJ9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzYpLGM9KHIocCksbigyNCkpLGY9cihjKSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImdldEltYWdlU3JjIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZlsiZGVmYXVsdCJdLmdldE1lZGlhQ2VudHJhbEltYWdlU3JjKGUse2FjOnRoaXMucHJvcHMuYWMsc3g6dGhpcy5wcm9wcy5zeCxzeTp0aGlzLnByb3BzLnN5LGZtOnRoaXMucHJvcHMuZm0scWw6dGhpcy5wcm9wcy5xbH0sdGhpcy5wcm9wcy5tZXJnZVRhZ3MsdGhpcy5wcm9wcy5yZXRpbmEpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLmdldEltYWdlU3JjKHRoaXMucHJvcHMucGF0aCksbj0ibWVkaWFDZW50cmFsSW1hZ2UiKyh0aGlzLnByb3BzLmFkZGl0aW9uYWxDbGFzcz8iICIrdGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M6IiIpO2lmKHRoaXMucHJvcHMuc3ByaXRlKXt2YXIgcj1PYmplY3QuYXNzaWduKHt3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxiYWNrZ3JvdW5kSW1hZ2U6InVybCgnIit0KyInKSJ9LHRoaXMucHJvcHMuc3R5bGUpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOm4sc3R5bGU6cix0aXRsZTp0aGlzLnByb3BzLnRpdGxlfSl9cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJpbWciLHtjbGFzc05hbWU6bixzcmM6dCx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxhbHQ6dGhpcy5wcm9wcy5hbHQscm9sZTp0aGlzLnByb3BzLnJvbGUsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDpmdW5jdGlvbih0KXtlLnByb3BzLm9uTG9hZCYmZS5wcm9wcy5vbkxvYWQodC50YXJnZXQpfX0pfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iTWVkaWFDZW50cmFsSW1hZ2UiLGQucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsd2lkdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLGhlaWdodDp1LlByb3BUeXBlcy5zdHJpbmcsc3g6dS5Qcm9wVHlwZXMubnVtYmVyLHN5OnUuUHJvcFR5cGVzLm51bWJlcixyZXRpbmE6dS5Qcm9wVHlwZXMuYm9vbCxhYzp1LlByb3BUeXBlcy5ib29sLHFsOnUuUHJvcFR5cGVzLm51bWJlcixmbTp1LlByb3BUeXBlcy5zdHJpbmcsbWVyZ2VUYWdzOnUuUHJvcFR5cGVzLmJvb2wsYWx0OnUuUHJvcFR5cGVzLnN0cmluZyxzcHJpdGU6dS5Qcm9wVHlwZXMuYm9vbCxyb2xlOnUuUHJvcFR5cGVzLnN0cmluZyx0aXRsZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LG9uTG9hZDp1LlByb3BUeXBlcy5mdW5jfSxkLmRlZmF1bHRQcm9wcz17cmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigicmV0aW5hIG1vZHVsZXMgZXhwZWN0cyBhIGZ1bmN0aW9uIG9uUmV0aW5hU3RhdGVDaGFuZ2UgYWNjZXB0aW5nIGJvb2xlYW4iKTtpZih3aW5kb3cubWF0Y2hNZWRpYSl7dmFyIHQ9d2luZG93Lm1hdGNoTWVkaWEoIigtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLChtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSIpLG49ZnVuY3Rpb24odCl7cmV0dXJuIGUodC5tYXRjaGVzKX07dCYmbih0KSx0LmFkZExpc3RlbmVyJiZ0LmFkZExpc3RlbmVyKG4pfWVsc2UgZSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz4xPyEwOiExKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzOCksYz1yKHApLGY9OTk5LGQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLl9zZXRTdGF0ZShlKSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX3NldFN0YXRlKHRoaXMucHJvcHMpLHRoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5faGFuZGxlVGV4dE92ZXJmbG93KCl9fSx7a2V5OiJjb21wb25lbnREaWRVcGRhdGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5faGFuZGxlVGV4dE92ZXJmbG93KCl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSJ0ZXh0Q29udGFpbmVyX190ZXh0Ijt0Kz10aGlzLnByb3BzLmFkZGl0aW9uYWxDbGFzcz8iICIrdGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M6IiI7dmFyIG49e2ZvbnRTaXplOnRoaXMuc3RhdGUuZm9udC5tYXhGb250UHh9O3JldHVybiBPYmplY3QuYXNzaWduKG4sdGhpcy5wcm9wcy5zdHlsZSksdGhpcy5wcm9wcy50ZXh0P2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtyZWY6ZnVuY3Rpb24odCl7ZS5ub2RlPXR9LHN0eWxlOm4sY2xhc3NOYW1lOiJ0ZXh0Q29udGFpbmVyIisodGhpcy5zdGF0ZS51c2VDc3NUcnVuY2F0aW9uPyIgaC1lbGxpcHNpcyI6IiIpfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse3JlZjpmdW5jdGlvbih0KXtlLnNwYW49dH0sY2xhc3NOYW1lOnQsaWQ6dGhpcy5wcm9wcy50ZXh0SWR9LHRoaXMucHJvcHMudGV4dCkpOm51bGx9fSx7a2V5OiJfc2V0U3RhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5hc3NpZ24oe30sZS5mb250KTt0aGlzLnN0YXRlPXtmb250OnQsdXNlQ3NzVHJ1bmNhdGlvbjp0Lm1heExpbmVzPzE9PT10Lm1heExpbmVzOiEwLG5lZWRzVGl0bGVBdHRyaWJ1dGU6ITEsb3JpZ2luYWxUZXh0OmUudGV4dH19fSx7a2V5OiJfc2hvd1Rvb2x0aXAiLHZhbHVlOmZ1bmN0aW9uKGUpe2U/KDAsY1siZGVmYXVsdCJdKSh0aGlzLnNwYW4pLmF0dHIoInRpdGxlIix0aGlzLnN0YXRlLm9yaWdpbmFsVGV4dCk6KDAsY1siZGVmYXVsdCJdKSh0aGlzLnNwYW4pLnJlbW92ZUF0dHIoInRpdGxlIil9fSx7a2V5OiJfaGFuZGxlVGV4dE92ZXJmbG93Iix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMubm9kZSlpZih0aGlzLnN0YXRlLnVzZUNzc1RydW5jYXRpb24pe3ZhciBlPSgwLGNbImRlZmF1bHQiXSkodGhpcy5ub2RlKTt0aGlzLl9zaG93VG9vbHRpcChlLnRleHRPdmVyZmxvdygpKX1lbHNlIHRoaXMuX3RydW5jYXRlTXVsdGlMaW5lVGV4dCgpfX0se2tleToiX3RydW5jYXRlTXVsdGlMaW5lVGV4dCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0iLi4uIix0PSgwLGNbImRlZmF1bHQiXSkodGhpcy5ub2RlKTt0aGlzLnNwYW4uaW5uZXJIVE1MPXRoaXMuc3RhdGUub3JpZ2luYWxUZXh0O3ZhciBuPSgwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5kZWNvZGVFbnRpdGllcygpO3RoaXMubm9kZS5zdHlsZS5mb250U2l6ZT10aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4KyJweCI7Zm9yKHZhciByPXRoaXMuc3Bhbi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCxvPXRoaXMuc3RhdGUuZm9udC5tYXhGb250UHgsaT0hMSxhPTA7cj50aGlzLnN0YXRlLmZvbnQubWF4TGluZXN8fHQuY2hpbGRyZW5PdmVyZmxvdygpOyl7aWYobzw9dGhpcy5zdGF0ZS5mb250Lm1pbkZvbnRQeCl7aXx8KG4rPWUsaT0hMCk7dmFyIHM9bi5sZW5ndGg7bj1uLnN1YnN0cigwLHMtZS5sZW5ndGgtMSkrZSx0aGlzLnNwYW4uaW5uZXJIVE1MPW59ZWxzZSBvLS0sdGhpcy5ub2RlLnN0eWxlLmZvbnRTaXplPW8rInB4IjtpZihyPXRoaXMuc3Bhbi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCxhKyssYT5mKWJyZWFrfXRoaXMuX3Nob3dUb29sdGlwKGkpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iVGV4dENvbnRhaW5lciIsZC5wcm9wVHlwZXM9e3RleHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFkZGl0aW9uYWxDbGFzczp1LlByb3BUeXBlcy5zdHJpbmcsZm9udDp1LlByb3BUeXBlcy5vYmplY3QsdGV4dElkOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7bih0aGlzLGUpLHRoaXMubm9kZT10fXJldHVybiByKGUsW3trZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubm9kZVtlXX19LHtrZXk6ImZpbmQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0aGlzLm5vZGUucXVlcnlTZWxlY3RvckFsbCh0KSl9fSx7a2V5OiJwYXJlbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMubm9kZS5wYXJlbnROb2RlKX19LHtrZXk6ImNoaWxkcmVuIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLm5vZGUuY2hpbGRyZW4pfX0se2tleToiY3NzIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubm9kZVswXXx8dGhpcy5ub2RlLHI9bi5nZXRBdHRyaWJ1dGUoInN0eWxlIiksbz1yP3Iuc3BsaXQoIjsiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BsaXQoIjoiKX0pOltdLGk9e307by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2VbMF0mJiIiIT09ZVswXSYmKGlbZVswXV09ZVsxXSl9KSxpW2VdPXQ7dmFyIGE9IiI7cmV0dXJuIE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7YSs9ZSsiOiIraVtlXSsiOyJ9KSxuLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpLHRoaXN9fSx7a2V5OiJhdHRyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdD8odGhpcy5ub2RlLnNldEF0dHJpYnV0ZShlLHQpLHRoaXMubm9kZSk6dGhpcy5ub2RlLmdldEF0dHJpYnV0ZShlKX19LHtrZXk6InJlbW92ZUF0dHIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGUucmVtb3ZlQXR0cmlidXRlKGUpLHRoaXMubm9kZX19LHtrZXk6Im91dGVySGVpZ2h0Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMubm9kZS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGUmJih0PWdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKSxuKz1wYXJzZUludCh0Lm1hcmdpblRvcCkrcGFyc2VJbnQodC5tYXJnaW5Cb3R0b20pKSxufX0se2tleToib3V0ZXJXaWR0aCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLm5vZGUub2Zmc2V0V2lkdGg7cmV0dXJuIGUmJih0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSksCm4rPXdpbmRvdy5wYXJzZUludCh0Lm1hcmdpbkxlZnQsMTApK3dpbmRvdy5wYXJzZUludCh0Lm1hcmdpblJpZ2h0LDEwKSksbn19LHtrZXk6InRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS50ZXh0Q29udGVudHx8dGhpcy5ub2RlLmlubmVySFRNTHx8IiJ9fSx7a2V5OiJjaGlsZHJlbk92ZXJmbG93Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3V0ZXJXaWR0aCghMCksbj0wO3JldHVybiB0aGlzLmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbih0KXtuKz1uZXcgZSh0KS5vdXRlcldpZHRoKCEwKX0pLC0xPnQtbn19LHtrZXk6InRleHRPdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdXRlcldpZHRoKCEwKTx0aGlzLm5vZGUuc2Nyb2xsV2lkdGh9fSx7a2V5OiJkZWNvZGVFbnRpdGllcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZih0aGlzLm5vZGUuaW5uZXJIVE1MKXt2YXIgdD10aGlzLm5vZGUuaW5uZXJIVE1MO3JldHVybiB0PXQucmVwbGFjZSgvPHNjcmlwdFtePl0qPihbXFNcc10qPyk8XC9zY3JpcHQ+L2dpbSwiIiksdD10LnJlcGxhY2UoLzxcLz9cdyg/OlteIic+XXwiW14iXSoifCdbXiddKicpKj4vZ2ltLCIiKSx0PXQucmVwbGFjZSgvXHUwMGEwL2csIiAiKSxlLmlubmVySFRNTD10LHQ9ZS50ZXh0Q29udGVudHx8ZS5pbm5lckhUTUx8fCIiLGUudGV4dENvbnRlbnQ9IiIsdH1yZXR1cm4iIn19XSksZX0oKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBvKGUpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM3KSxjPXIocCksZj1uKDcpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0idGV4dExpbmsiKyh0aGlzLnByb3BzLmRpc3BsYXlBc1RleHQ/IiB0ZXh0TGluay0tZGlzcGxheUFzVGV4dCI6IiIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZTplfX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtmb250OnRoaXMucHJvcHMuZm9udCx0ZXh0OnRoaXMucHJvcHMudGV4dCxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLHRleHRJZDp0aGlzLnByb3BzLnRleHRJZH0pKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsidGV4dENvbnRhaW5lciIsImNsaWNrdGhyb3VnaExpbmsiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRleHRMaW5rIixoLnByb3BUeXBlcz17dGV4dDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxmb250OnUuUHJvcFR5cGVzLm9iamVjdCx0ZXh0SWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGRpc3BsYXlBc1RleHQ6dS5Qcm9wVHlwZXMuYm9vbCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzMpLGM9cihwKSxmPW4oNyksZD1yKGYpLGg9bigzNykseT1yKGgpLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJhc2luSW1hZ2UiO3JldHVybiBlKz10aGlzLnByb3BzLmV4dGVuZENvbnRhaW5lckhlaWdodD8iIGFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0IjoiIixlKz10aGlzLnByb3BzLmRlc2NyaXB0aW9uPyIgYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb24iOiIiLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHsiZGF0YS1hc2luIjp0aGlzLnByb3BzLmFzaW4sY2xhc3NOYW1lOmV9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOmV9fSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3BhdGg6dGhpcy5wcm9wcy5wYXRoLGFsdDp0aGlzLnByb3BzLmFsdCxzcHJpdGU6dGhpcy5wcm9wcy5zcHJpdGUsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0LHdpZHRoOnRoaXMucHJvcHMud2lkdGgsaGVpZ2h0OnRoaXMucHJvcHMuaGVpZ2h0LHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxxbDp0aGlzLnByb3BzLnFsLHJldGluYTp0aGlzLnByb3BzLnJldGluYSxhYzp0aGlzLnByb3BzLmFjLG1lcmdlVGFnczp0aGlzLnByb3BzLm1lcmdlVGFncyx0aXRsZTp0aGlzLnByb3BzLnRpdGxlLHN0eWxlOnRoaXMucHJvcHMuc3R5bGUsb25Mb2FkOnRoaXMucHJvcHMub25Mb2FkfSksdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoeVsiZGVmYXVsdCJdLHt0ZXh0OnRoaXMucHJvcHMuZGVzY3JpcHRpb24sZm9udDp0aGlzLnByb3BzLmRlc2NyaXB0aW9uRm9udH0pKSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIm1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyIiwiY2xpY2t0aHJvdWdoTGluayIsInRleHRDb250YWluZXIiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1tLG0uZGlzcGxheU5hbWU9IkFzaW5JbWFnZSIsbS5wcm9wVHlwZXM9e2hyZWY6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQscGF0aDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxleHRlbmRDb250YWluZXJIZWlnaHQ6dS5Qcm9wVHlwZXMuYm9vbCxhbHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHNwcml0ZTp1LlByb3BUeXBlcy5ib29sLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIsd2lkdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLGhlaWdodDp1LlByb3BUeXBlcy5zdHJpbmcsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsbWVyZ2VUYWdzOnUuUHJvcFR5cGVzLmJvb2wsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLGRlc2NyaXB0aW9uOnUuUHJvcFR5cGVzLnN0cmluZyxkZXNjcmlwdGlvbkZvbnQ6dS5Qcm9wVHlwZXMub2JqZWN0LHRpdGxlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3Qsb25Mb2FkOnUuUHJvcFR5cGVzLmZ1bmMsYXNpbjp1LlByb3BUeXBlcy5zdHJpbmd9LG0uZGVmYXVsdFByb3BzPXthYzohMCxyZXRpbmE6ITB9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oNyksYz1yKHApLGY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJwcmljZSI7ZSs9dGhpcy5wcm9wcy5pc0p1bWJvPyIgcHJpY2UtLWp1bWJvIjoiIixlKz10aGlzLnByb3BzLmlzTGlzdD8iIHByaWNlLS1saXN0IjoiIixlKz10aGlzLnByb3BzLmFkZGl0aW9uYWxDbGFzcz8iICIrdGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M6IiI7dmFyIHQ9IiI7aWYodGhpcy5wcm9wcy5pc0p1bWJvKXt2YXIgbj10aGlzLnByb3BzLnByaWNlSW5mby53aG9sZUFtb3VudCxyPXRoaXMucHJvcHMucHJpY2VJbmZvLmRlY2ltYWxQYXJ0O3Q9bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvQ3VycmVuY3kifSx0aGlzLnByb3BzLmN1cnJlbmN5KSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvSW50ZWdlckFtb3VudCJ9LG4pLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZV9fanVtYm9EZWNpbWFsQW1vdW50In0scikpfWVsc2UgdD1sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZTplLHN0eWxlOnRoaXMucHJvcHMuc3R5bGV9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZV9fY3VycmVuY3kifSx0aGlzLnByb3BzLmN1cnJlbmN5KSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2Ftb3VudCJ9LHRoaXMucHJvcHMuYW1vdW50KSk7cmV0dXJuIHRoaXMucHJvcHMuaHJlZiYmdGhpcy5wcm9wcy5jbGlja1VybHM/bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InByaWNlIn19LHQpOnR9fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09ZixmLmRpc3BsYXlOYW1lPSJQcmljZSIsZi5wcm9wVHlwZXM9e2FkZGl0aW9uYWxDbGFzczp1LlByb3BUeXBlcy5zdHJpbmcsYW1vdW50OnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGN1cnJlbmN5OnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGlzSnVtYm86dS5Qcm9wVHlwZXMuYm9vbCxwcmljZUluZm86dS5Qcm9wVHlwZXMub2JqZWN0LGlzTGlzdDp1LlByb3BUeXBlcy5ib29sLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZyxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM1KSxjPXIocCksZj1uKDQzKSxkPXIoZiksaD1uKDcpLHk9cihoKSxtPSIvaW1hZ2VzL0cvJHttZWRpYX0vZGEvY3JlYXRpdmVzL3ByaW1lLTJ4LTIwMTcwNjE0LnBuZyIsYj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRQcmltZUxvZ29QYXRoIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZFsiZGVmYXVsdCJdLmNvbXBpbGUobSx7bWVkaWE6ZX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0UHJpbWVMb2dvUGF0aCh0aGlzLnByb3BzLm1lZGlhKSx0PWxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7cGF0aDplLHdpZHRoOiI0MyIsaGVpZ2h0OiIxMiIsYWx0OiJQcmltZSIsYWRkaXRpb25hbENsYXNzOiJwcmltZUxvZ28iLHN0eWxlOnRoaXMucHJvcHMuc3R5bGV9KTtyZXR1cm4gdGhpcy5wcm9wcy5ocmVmJiZ0aGlzLnByb3BzLmNsaWNrVXJscz9sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCh5WyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZToicHJpbWVMb2dvIn19LHQpOnR9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIm1lZGlhQ2VudHJhbEltYWdlIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09YixiLmRpc3BsYXlOYW1lPSJQcmltZUxvZ28iLGIucHJvcFR5cGVzPXttZWRpYTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZyxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX12YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe24odGhpcyxlKX1yZXR1cm4gcihlLFt7a2V5OiJjb21waWxlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QuaGFzT3duUHJvcGVydHkobikmJihlPWUucmVwbGFjZShuZXcgUmVnRXhwKCJcXCR7IituKyJ9IiwiZyIpLHRbbl0pKX0pLGV9fV0pLGV9KCk7ZS5leHBvcnRzPW5ldyBvfSwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDQxKSxjPXIocCksZj0hMSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnRheE1lc3NhZ2UmJiIiIT09dGhpcy5wcm9wcy50YXhNZXNzYWdlO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VCb3giLHN0eWxlOnRoaXMucHJvcHMuc3R5bGV9LHRoaXMucHJvcHMubGlzdEFtb3VudCYmZiYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHthbW91bnQ6dGhpcy5wcm9wcy5saXN0QW1vdW50LGN1cnJlbmN5OnRoaXMucHJvcHMuY3VycmVuY3ksaXNMaXN0OiEwLGFkZGl0aW9uYWxDbGFzczoicHJpY2VCb3hfX2xpc3QiLHN0eWxlOnRoaXMucHJvcHMubGlzdFByaWNlU3R5bGV9KSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se2Ftb3VudDp0aGlzLnByb3BzLmJ1eUFtb3VudCxjdXJyZW5jeTp0aGlzLnByb3BzLmN1cnJlbmN5LGFkZGl0aW9uYWxDbGFzczoicHJpY2VCb3hfX2J1eSIsc3R5bGU6dGhpcy5wcm9wcy5idXlQcmljZVN0eWxlfSksZSYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlQm94X190YXhNZXNzYWdlIn0sdGhpcy5wcm9wcy50YXhNZXNzYWdlKSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInByaWNlIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09ZCxkLmRpc3BsYXlOYW1lPSJQcmljZUJveCIsZC5wcm9wVHlwZXM9e2J1eUFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxsaXN0QW1vdW50OnUuUHJvcFR5cGVzLnN0cmluZyxjdXJyZW5jeTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCx0YXhNZXNzYWdlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsYnV5UHJpY2VTdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsbGlzdFByaWNlU3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sLCwsLCwsLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oNSksYz1yKHApLGY9bigyOCksZD1yKGYpLGg9bigzOCkseT1yKGgpLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0cnVjdHVyZT1uZXcgZFsiZGVmYXVsdCJdKG4uZ2V0U3RydWN0dXJlcygpKSxuLmluaXRTdHJ1Y3R1cmUoZSksbi5jb21wb25lbnRzTWFwPW4uZ2V0Q29tcG9uZW50c01hcCgpLG4uZG9tUmVmcz17fSxuLnN0YXRlPXtzaG93TGlzdFByaWNlOiEwfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJpbml0U3RydWN0dXJlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmZvcm1hdHRlZFByaWNlJiYiIiE9PWUuZm9ybWF0dGVkUHJpY2UmJiFlLmlzRGlnaXRhbDt0aGlzLnN0cnVjdHVyZS5oaWRlQmxvY2soInByaWNlQm94IiwhdCk7dmFyIG49dCYmZS5pc1ByaW1lO2lmKHRoaXMuc3RydWN0dXJlLmhpZGVCbG9jaygicHJpbWVMb2dvIiwhbiksIkpQIj09PXRoaXMucHJvcHMubWFya2V0UGxhY2Upe3ZhciByPXRoaXMuc3RydWN0dXJlLmdldENvbXBvbmVudFByb3AoImhlYWRsaW5lIiwic3R5bGUiKTtyJiYoci52YWx1ZS5mb250U3R5bGU9Im5vcm1hbCIsdGhpcy5zdHJ1Y3R1cmUuc2V0Q29tcG9uZW50UHJvcCgiaGVhZGxpbmUiLCJzdHlsZSIsci52YWx1ZSwiY29uc3RhbnQiKSl9ZS5tb2JpbGVIZWFkbGluZSYmdGhpcy5zdHJ1Y3R1cmUuc2V0Q29tcG9uZW50UHJvcCgiaGVhZGxpbmUiLCJ0ZXh0IiwibW9iaWxlSGVhZGxpbmUiLCJwYXRoIil9fSx7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRvbVJlZnMucHJpY2luZyYmdGhpcy5zZXRTdGF0ZSh7c2hvd0xpc3RQcmljZTohKDAseVsiZGVmYXVsdCJdKSh0aGlzLmRvbVJlZnMucHJpY2luZykuY2hpbGRyZW5PdmVyZmxvdygpfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zdGF0ZS5zaG93TGlzdFByaWNlP3RoaXMucHJvcHMuZm9ybWF0dGVkTGlzdFByaWNlOm51bGw7cmV0dXJuIHRoaXMuc3RydWN0dXJlLnNldENvbXBvbmVudFByb3AoInByaWNlQm94IiwibGlzdEFtb3VudCIsZSwiY29uc3RhbnQiKSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se2NsYXNzTmFtZToibW9iaWxlTXlzdGlxdWUiLHJlbmRlcmluZ0NvbnRleHQ6dGhpcy5wcm9wcyxzdHJ1Y3R1cmU6dGhpcy5zdHJ1Y3R1cmUubW9kZWwsY29tcG9uZW50c01hcDp0aGlzLmNvbXBvbmVudHNNYXAsZG9tUmVmczp0aGlzLmRvbVJlZnMsdXBkYXRlT25SZXNpemU6ITB9KX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1tLG0uVEVNUExBVEVfSUQ9Im1vYmlsZU15c3RpcXVlIixtLmRpc3BsYXlOYW1lPSJNb2JpbGVNeXN0aXF1ZSIsbS5wcm9wVHlwZXM9e319LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD0ocih1KSxuKDk5KSkscD1yKGwpLGM9bigxMDEpLGY9cihjKSxkPW4oMTAyKSxoPXIoZCkseT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRTdHJ1Y3R1cmVzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybigwLGZbImRlZmF1bHQiXSkoKX19LHtrZXk6ImdldENvbXBvbmVudHNNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuQ09NUE9ORU5UU19NQVB9fV0pLHR9KHBbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPXkseS5DT01QT05FTlRTX01BUD1oWyJkZWZhdWx0Il0seS5kaXNwbGF5TmFtZT0iTW9iaWxlTXlzdGlxdWVDb250cm9sIix5LnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJue2lkOiIwIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEyNXB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjAiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsd2lkdGg6IjE2MHB4IixoZWlnaHQ6IjEwMCUiLHBhZGRpbmc6IjVweCAxMHB4IDVweCAxMHB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJhc2luSW1hZ2UiLHByb3BzOlt7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToicGF0aCIsdmFsdWU6ImFzaW5JbWFnZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJhbHQiLHZhbHVlOiJwcm9kdWN0VGl0bGUiLHR5cGU6InBhdGgifSx7bmFtZToic3giLHZhbHVlOjgwLHR5cGU6ImNvbnN0YW50In1dfSxzdHlsZTpbe25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgMTI1cHgifV19LHtpZDoiMC4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHdpZHRoOiIxMDAlIixwYWRkaW5nOiIwIDEwcHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMC4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAwIDVweCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJoZWFkbGluZSJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InRleHRMaW5rIixwcm9wczpbe25hbWU6ImZvbnQiLHZhbHVlOnttYXhMaW5lczoyLG1pbkZvbnRQeDoxNixtYXhGb250UHg6MTh9LHR5cGU6ImNvbnN0YW50In0se25hbWU6InRleHQiLHZhbHVlOiJoZWFkbGluZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMCx0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJzdHlsZSIsdmFsdWU6e2ZvbnRTdHlsZToiaXRhbGljIixjb2xvcjoiIzU1NSIsbGluZUhlaWdodDoiMjBweCJ9LHR5cGU6ImNvbnN0YW50In1dfX0se2lkOiIwLjEuMC4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAwIDVweCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJ0ZXh0TGluayIscHJvcHM6W3tuYW1lOiJmb250Iix2YWx1ZTp7bWF4TGluZXM6MSxtaW5Gb250UHg6MTYsbWF4Rm9udFB4OjE2LHNpemU6MTZ9LHR5cGU6ImNvbnN0YW50In0se25hbWU6InRleHQiLHZhbHVlOiJwcm9kdWN0VGl0bGUiLHR5cGU6InBhdGgifSx7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToiZGlzcGxheUFzVGV4dCIsdmFsdWU6ITEsdHlwZToiY29uc3RhbnQifSx7bmFtZToic3R5bGUiLHZhbHVlOntmb250V2VpZ2h0OiI2MDAifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMiIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljaW5nIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAuMi4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCA1cHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljZUJveCJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaWNlQm94Iixwcm9wczpbe25hbWU6ImJ1eUFtb3VudCIsdmFsdWU6ImZvcm1hdHRlZFByaWNlIix0eXBlOiJwYXRoIn0se25hbWU6Imxpc3RBbW91bnQiLHZhbHVlOiJmb3JtYXR0ZWRMaXN0UHJpY2UiLHR5cGU6InBhdGgifSx7bmFtZToiY3VycmVuY3kiLHZhbHVlOiJjdXJyZW5jeVN5bWJvbCIsdHlwZToicGF0aCJ9LHtuYW1lOiJ0YXhNZXNzYWdlIix2YWx1ZToiaTE4bi50YXhNZXNzYWdlIix0eXBlOiJwYXRoIn0se25hbWU6ImJ1eVByaWNlU3R5bGUiLHZhbHVlOntmb250U2l6ZToiMTVweCJ9LHR5cGU6ImNvbnN0YW50In0se25hbWU6Imxpc3RQcmljZVN0eWxlIix2YWx1ZTp7Zm9udFNpemU6IjEzcHgifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMi4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3cifSxtZXRhZGF0YTpbe25hbWU6InJlZiIsdmFsdWU6InByaW1lTG9nbyJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaW1lTG9nbyIscHJvcHM6W3tuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7c3R5bGU6e3dpZHRoOiIyOXB4IixoZWlnaHQ6IjEzcHgifX1dfSxzdHlsZTpbe25hbWU6Im92ZXJmbG93Iix2YWx1ZToidmlzaWJsZSJ9XX1dLGNzc0NsYXNzZXM6WyJibG9jay0taW5saW5lIiwiIl0sc3R5bGU6W3tuYW1lOiJ3aGl0ZVNwYWNlIix2YWx1ZToibm9ybWFsIn1dfV19LHtpZDoiMC4xLjEiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsbWFyZ2luOiIwIDEwcHggMCAxMHB4IixoZWlnaHQ6IjEyM3B4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxzdHlsZTpbe25hbWU6Im9wYWNpdHkiLHZhbHVlOiIwLjY0In0se25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgOXB4In1dLGNvbXBvbmVudDp7aWQ6Im1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyIixwcm9wczpbe25hbWU6InBhdGgiLHZhbHVlOiIvaW1hZ2VzL0cvMDEvQW1hem9uQnJhbmRTdG9yZXNQbGF0Zm9ybS9ibGFja19hcnJvdy5wbmciLHR5cGU6ImNvbnN0YW50In0se25hbWU6ImFsdCIsdmFsdWU6IkdyYXkgQXJyb3ciLHR5cGU6ImNvbnN0YW50In0se25hbWU6InJvbGUiLHZhbHVlOiJwcmVzZW50YXRpb24iLHR5cGU6ImNvbnN0YW50In1dfX1dLHN0eWxlOlt7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6IiNGRkZGRkYifSx7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6Ii13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI0ZGRkZGRiwgI0VCRUJFQikifSx7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6Ii1vLWxpbmVhci1ncmFkaWVudChyaWdodCwgcmdiYSgyNTUsMjU1LDI1NSwxKSwgcmdiYSgyNTUsMjU1LDI1NSwwKSAyNSUsIHJnYmEoMjU1LDI1NSwyNTUsMCkpLCAtby1saW5lYXItZ3JhZGllbnQoI0ZGRkZGRiwgI0VCRUJFQikifSx7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6Ii1tb3otbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpIn1dfV0sc3R5bGU6W3tuYW1lOiJib3JkZXIiLHZhbHVlOiIxcHggc29saWQgI2RkZCJ9LHtuYW1lOiJiYWNrZ3JvdW5kIix2YWx1ZToiI0ZGRkZGRiJ9XX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dmFyIG89big0MCksaT1yKG8pLGE9bigzOSkscz1yKGEpLHU9big3OCksbD1yKHUpLHA9big0MiksYz1yKHApLGY9bigzMyksZD1yKGYpO2UuZXhwb3J0cz17YXNpbkltYWdlOmlbImRlZmF1bHQiXSx0ZXh0TGluazpzWyJkZWZhdWx0Il0scHJpY2VCb3g6bFsiZGVmYXVsdCJdLHByaW1lTG9nbzpjWyJkZWZhdWx0Il0sbWVkaWFDZW50cmFsSW1hZ2VDb250YWluZXI6ZFsiZGVmYXVsdCJdfX1dKTs7dmFyICRhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZCcpLHJlbmRlcmluZ0NvbnRleHQgPSB7Im1hcmtldFBsYWNlIjoiVVMiLCJhZExpbmsiOiJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FrRHFxTlFTV3lZV05LLWdKWlRUV3ZrQUFBRmhwSmtxU0FFQUFBR1FBVy00VFRnL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDk5NjM2NjczMz9hYXhpdGs9U2NiV1V3VlhvNnRPdkhidWRhVlMydyIsInJldmlld0xpbmsiOiJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FrRHFxTlFTV3lZV05LLWdKWlRUV3ZrQUFBRmhwSmtxU0FFQUFBR1FBVy00VFRnL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDk5NjM2NjczMz9hYXhpdGs9U2NiV1V3VlhvNnRPdkhidWRhVlMydyNjdXN0b21lclJldmlld3MiLCJjcmVhdGl2ZUlkIjoiNDk4Nzg1MDU1MDAwMSIsImFkSWQiOiI0NzU2NjgyNzMwOTAxIiwicHJvZHVjdFRpdGxlIjoiQnJpbmcgeW91ciB3ZWIgZGVzaWduIHRvIGxpZmUgd2l0aCBzaW1wbGlmaWVkIEphdmFTY3JpcHQgaW5zdHJ1Y3Rpb24iLCJoZWFkbGluZSI6IlJlYWR5IHRvIHdyaXRlIHRoZSBzY3JpcHQgdGhhdCBwb3dlcnMgdGhlIHdlYj8iLCJhc2luSW1hZ2UiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTE2ejcyaEZoWkwuX0FDX1NSMTI4LDE0NV8uanBnIiwidW5zcHJpdGVkSW1hZ2UiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTFyTVZRbjJRY0wuanBnIiwiY3VzdG9tZXJSZXZpZXdTdW1tYXJ5Ijp7InJhdGluZyI6NC4yMzg2MTkzODYsImNvdW50IjoxNiwiYXNpbiI6IjA5OTYzNjY3MzMifSwiYmFkZ2VJbmZvcm1hdGlvbk1hcCI6bnVsbCwiY3VycmVuY3lTeW1ib2wiOiIkIiwiZm9ybWF0dGVkTGlzdFByaWNlIjoiIiwiZm9ybWF0dGVkUHJpY2UiOiI3Ljk3IiwicHJpY2VJbmZvIjp7Indob2xlQW1vdW50IjoiNyIsImRlY2ltYWxQYXJ0IjoiOTcifSwicHJpY2VGb3JtYXR0aW5nRmxhZ3MiOnsiaXNTeW1ib2xTdXBlcnNjcmlwdCI6dHJ1ZSwic3ltYm9sUG9zaXRpb24iOiJwcmVmaXhlZCJ9LCJwcmljZVBlclVuaXRNZXNzYWdlIjoiIiwiaXNQcmltZSI6dHJ1ZSwiaXNEaWdpdGFsIjpmYWxzZSwiaTE4biI6eyJzZXR0aW5ncyI6eyJzZWxlY3Rpb25MYWJlbCI6IkVuZ2xpc2ggKFVTKSIsInJlZ2lvbiI6Im5hIiwiY3VycmVuY3kiOiIkIiwiZG9tYWluIjoiYW1hem9uLmNvbSIsIm1lZGlhIjoiMDEiLCJtZXJjaGFudElkIjoiQVRWUERLSUtYMERFUiIsIm1hcmtldHBsYWNlSWQiOiJBVFZQREtJS1gwREVSIiwibG9jYWxlTW9udGhzIjpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX0sInRheE1lc3NhZ2UiOiIiLCJzcG9uc29yZWRCeSI6IlNwb25zb3JlZCBieSIsInNob3BOb3ciOiJTaG9wIG5vdyIsImJlc3RTZWxsZXIiOiJCZXN0IFNlbGxlciIsIm5ld1JlbGVhc2UiOiJOZXcgUmVsZWFzZSIsImJhZGdlSW4iOiJpbiJ9LCJjbGlja1VybHMiOlsiaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20vaXUzP2Q9Zm9yZXN0ZXItZGlkJmV4LWZjaD00MTY3MzE2MTMmZXgtZmFyZ3M9P2klM0RRT3FvMUJKYkpoWTByNkFsbE5OYS1RJTI2YXNpJTNEJTNBMDEwMWIwZGQ5ZTllZDZlNGQxNGVlNTkyZDE0MzA3MmM1MDVhNTNlMWUzZTc2YTY1M2FiNjYzZmEwMTBmZWM5OTAzODYlMjZjbGljayUzRDEmY2I9MTUxODg4NDk1Njc3OSJdLCJicmFuZExvZ28iOiJpbWFnZXMvUy9hYnMtaW1hZ2UtdXBsb2FkLW5hLzQvQW1hem9uU3RvcmVzL0FUVlBES0lLWDBERVIvZmJjY2ZhYzZlMWYxOWM4NTA2ZmNkMzlhZThjNWU4OTAudzM1MC5oNzEuX0NSMCwwLDM1MCw3MV9TTDI4MF9TWTgwX19GTXBuZ18ucG5nIiwiYnJhbmROYW1lIjoiQ2x5ZGVCYW5rIE1lZGlhIExMQyIsInByb2R1Y3RJbWFnZSI6eyJ1cmwiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTFyTVZRbjJRY0wuanBnIiwiaGVpZ2h0Ijo1MDAsIndpZHRoIjo0MDF9fTtpZiAoJGFkKSB7UmVhY3RET00ucmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlicmFyeS5kZWZhdWx0LCByZW5kZXJpbmdDb250ZXh0KSwgJGFkKTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS5hZGRWaWV3YWJpbGl0eUxpc3RlbmVyKCRhZCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYWRkQ3JlYXRpdmVDbGlja0xpc3RlbmVyKCRhZCk7fTwvc2NyaXB0PjwvYm9keT48L2h0bWw+PC9kaXY+&quot;,&quot;serverSideFetchAd&quot;:&quot;true&quot;,&quot;enableAdBlockerDetector&quot;:true,&quot;disableResizeFunc&quot;:true,&quot;fallbackStaticAdImgUrl&quot;:&quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;:&quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;:&quot;&quot;,&quot;advertisementTextOnTop&quot;:false,&quot;viewabilityStandards&quot;:[{&quot;p&quot;:0,&quot;t&quot;:0,&quot;def&quot;:&quot;amzn&quot;},{&quot;p&quot;:50,&quot;t&quot;:1,&quot;def&quot;:&quot;iab&quot;},{&quot;p&quot;:100,&quot;t&quot;:0,&quot;def&quot;:&quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;:&quot;&quot;,&quot;hostDomain&quot;:&quot;https://www.amazon.com&quot;,&quot;userAgent&quot;:&quot;Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1&quot;,&quot;userConnectionInfo&quot;:{&quot;mobileConnectionType&quot;:null,&quot;connectionType&quot;:&quot;unknown&quot;},&quot;isAUIAvailable&quot;:&quot;3.18.2-2018-02-15&quot;,&quot;cookie&quot;:&quot;x-wl-uid=1WXBZ0Gt/NIjrMrKToWzqEoShlkbJFxXqK7d7eruyBHba3bx516TjY5FSIvziQCA3Gv7b0MffkZo=; aws_lang=en; aws-target-static-id=1485170961612-541803; aws-target-data=%7B%22support%22%3A%221%22%7D; aws-ubid-main=159-7441294-4671144; s_fid=5D55736E4E81630C-2BCB156C67276537; s_ppv=0; skin=noskin; session-token=GwmX9b8ErPr+y9/X4tOnH2NlakyrEB6uH0ndiwOgxZNJpv9EDYAzzTicJ2VkazGtd0qeseZAEF59w+otDIc1tgsjaHDIM9Ap01XspZFijLZnp4ZTcVlOy46T9mnipC6w67Im+F234XhEskN4jEHIOPuWvdjG6KieF9B1qlWzyY48ryzuxbHISWDfjFuLTn78ggiBueWBLjjxz8lfGNtReOgss5mLTZOaDB+7SUFgVbom2aIFlXb26PZ1UZQ04Ri1; ubid-main=131-2393016-1049709; session-id=147-0816675-1753153; aws-target-visitor-id=1485170961617-283514.26_17; aws-mkto-trk=id%3A112-TZM-766%26token%3A_mch-aws.amazon.com-1515491028950-95143; aws-session-id=140-3318658-9277840; aws-session-id-time=2146211066l; regStatus=registered; s_sq=%5B%5BB%5D%5D; __utmv=194891197.%22Y2eilR%401E0eaUd1y4Jy478UIiZmNGbRRjXHrbQvpCaiuGPXLvdZpy4%3FkXZ79EsvP%22; __utmc=194891197; pN=7; s_pers=%20s_vnum%3D1942562894050%2526vn%253D3%7C1942562894050%3B%20s_invisit%3Dtrue%7C1517331617155%3B%20s_nr%3D1517329817167-Repeat%7C1525105817167%3B; s_sess=%20s_cc%3Dtrue%3B%20s_sq%3D%3B; appstore-devportal-locale=en_US; AMCVS_4A8581745834114C0A495E2B%40AdobeOrg=1; AMCV_4A8581745834114C0A495E2B%40AdobeOrg=-1891778711%7CMCIDTS%7C17571%7CMCMID%7C11904074407816115763545700786442573624%7CMCOPTOUT-1518131239s%7CNONE%7CMCAID%7C2D04D1058530F5A2-6000030420009E4A%7CvVersion%7C2.4.0; s_lv=1518124039358; s_cc=true; c_m=undefinedwww.google.deNatural%20Search; session-id-time=2082787201l; s_vn=1549660061459%26vn%3D6; aws-userInfo=%7B%22arn%22%3A%22arn%3Aaws%3Aiam%3A%3A672413603088%3Aroot%22%2C%22alias%22%3A%22%22%2C%22username%22%3A%22Maja%2520Komel%22%2C%22keybase%22%3A%22%22%2C%22issuer%22%3A%22https%3A%2F%2Fwww.amazon.com%2Fap%2Fsignin%22%7D; aws-session-token=\&quot;+9lzzvGeCuRd2h296LsZD8fsOUkTpImyWpsvgPeqP6CutmWSJYNaJPpgFNd+LARPtdTJSouC444Vz/2kOOuvF9e1ccFSXb+ZnGkBaHuTY1xRGvDGe8RnwwC3J1w69hhrBu4Y1iWUo75hDCoOFI+QpavGp9nOhCVlx6xYEsCN0Y8s3pp1r/MWFsfmhN5pdiyZO1Lzcoc4isZiiTZLPz0Cuu8WoxHyC7I4ldZm8oIyCgM=\&quot;; __utma=194891197.1735141489.1485170987.1517331742.1518295984.26; __utmz=194891197.1518295984.26.19.utmccn=(referral)|utmcsr=console.aws.amazon.com|utmcct=/cloud9/home|utmcmd=referral; s_dslv=1518296040762; s_nr=1518296040774-Repeat; lc-main=en_US; p2dPopoverID_147-0816675-1753153=1; csm-hit=s-NDW9PCFNDRXWFHQVWR24|1518884955868&quot;,&quot;aPageStart&quot;:1518884955597,&quot;adStartTime&quot;:1518884957676}" id="ape_detail_btf_detail-mWeb_iframe" src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/msf-1.15._V488131532_.html" scrolling="no" height="125px" width="100%" class="" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="true" allowfullscreen="" mozallowfullscreen="" webkitallowfullscreen="" data-arid="5ba26b6b37fd4f0697e89fb00a56fc9d" style="width: 1px; min-width: 100%; display: none !important;"></iframe></div></div><script>(function(){function a(d,e){if(window.addEventListener){window.addEventListener(d,e,false);}else{if(window.attachEvent){window.attachEvent("on"+d,e);}}}function c(d,e){if(window.removeEventListener){window.removeEventListener(d,e,false);}else{if(window.detachEvent){window.detachEvent("on"+d,e);}}}var b=function(){(function(){(function(j,n){j.sfLogErrors=j.sfLogErrors||false;var o=o||function(s,r){r=r||new Error(s);if(j.ue&&typeof ue.count=="function"){ue.count("adplacements:safeFrameError",1);}if(!j.sfLogErrors){return;}if(j.ueLogError){j.ueLogError(r,{logLevel:"ERROR",attribution:"APE-safeframe",message:s+" "});}else{if(typeof console!=="undefined"&&console.error){console.error(s,r);}}};function d(){return j.innerHeight||n.documentElement.clientHeight;}function g(){return j.innerWidth||n.documentElement.clientWidth;}function e(t,r,s){if(t>0){return(s>t);}else{return(r>0);}}var f=function(){return(Date.now?Date.now():new Date().getTime());};throttle=function(s,u,y){var r,w,z;var x=null;var v=0;if(!y){y={};}var t=function(){v=y.leading===false?0:f();x=null;z=s.apply(r,w);if(!x){r=w=null;}};return function(){var B=f();if(!v&&y.leading===false){v=B;}var A=u-(B-v);r=this;w=arguments;if(A<=0||A>u){if(x){clearTimeout(x);x=null;}v=B;z=s.apply(r,w);if(!x){r=w=null;}}else{if(!x&&y.trailing!==false){x=setTimeout(t,A);}}return z;};};function l(u,w,v,r){try{var t=n.getElementById(u).getBoundingClientRect();if(e(t.top,t.bottom,d())&&e(t.left,t.right,g())){if(typeof uet=="function"){uet("bb","adplacements:viewablelatency:"+w,{wb:1});if(v){uet("bb","adplacements:viewablelatency:"+v,{wb:1});}}if(typeof uex=="function"&&j.ue&&typeof ue.count=="function"){if(j.apeViewableLatencyTrackers[r].loaded){uex("ld","adplacements:viewablelatency:"+w,{wb:1});if(v){uex("ld","adplacements:viewablelatency:"+v,{wb:1});}ue.count("adplacements:htmlviewed:loaded:"+w,1);if(v){ue.count("adplacements:htmlviewed:loaded:"+v,1);}}ue.count("adplacements:htmlviewed:"+w,1);if(v){ue.count("adplacements:htmlviewed:"+v,1);}}j.apeViewableLatencyTrackers[r].viewed=true;if(j.apeViewableLatencyTrackers[r].tracker){c("scroll",j.apeViewableLatencyTrackers[r].tracker);c("resize",j.apeViewableLatencyTrackers[r].tracker);}}}catch(s){j.apeViewableLatencyTrackers[r].valid=false;}}try{j.apeViewableLatencyTrackers=j.apeViewableLatencyTrackers||{};var q="ape_detail_btf_detail-mWeb_placement";var p="detail_btf_detail-mWeb".replace(/\_/g,":");var h="";var i="5ba26b6b37fd4f0697e89fb00a56fc9d";j.apeViewableLatencyTrackers[i]=j.apeViewableLatencyTrackers[i]||{};j.apeViewableLatencyTrackers[i].valid=true;l(q,p,h,i);if(j.apeViewableLatencyTrackers[i].valid&&!j.apeViewableLatencyTrackers[i].viewed){j.apeViewableLatencyTrackers[i].tracker=throttle(function(){l(q,p,h,i);},20);a("scroll",j.apeViewableLatencyTrackers[i].tracker);a("resize",j.apeViewableLatencyTrackers[i].tracker);}}catch(k){if(j.apeViewableLatencyTrackers&&j.apeViewableLatencyTrackers["5ba26b6b37fd4f0697e89fb00a56fc9d"]){j.apeViewableLatencyTrackers["5ba26b6b37fd4f0697e89fb00a56fc9d"].valid=false;}o("Error initializing viewable latency instrumentation",k);}try{j.btf={};j.btf.adStartTime=(new Date()).getTime();var m=j.DAsf||j.MAsf||null;if(m){m.loadAds();}else{m=n.createElement("script");m.type="text/javascript";m.async=true;m.setAttribute("crossorigin","anonymous");m.charset="utf-8";m.src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame";m.onerror=function(){o("Error loading SafeFrame library");};(n.getElementsByTagName("head")[0]||n.getElementsByTagName("body")[0]).appendChild(m);}}catch(k){o("Error appending MAsf library",k);}}(window,document));})();};b();})();</script>
</div>
<a></a>
<script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/G/01/AUIClients/CustomerReviewsMedleyAssets-d22f4f962f932cc6922bccca8b5b14475c306dc6._V2_.js#AUIClients/CustomerReviewsMedleyAssets.device_type-mobile.secure.weblab-DP_PROFILE_REVIEWS_GENOME_WIDGET_INTEG_112957-T1.min');
</script>
<div id="aw-udpv3-customer-reviews_feature_div" data-hook="reviews-mobile-widget" class="a-section a-spacing-large customerReviewsMobileFeature"><div class="a-row a-spacing-small"><h2 data-hook="reviews-mobile-title" class="a-spacing-micro customerReviewsTitle">Customer Reviews</h2><div class="a-box-group"><div class="a-box"><div class="a-box-inner"><a href="/gp/aw/reviews/B00AYQNR46/ref=cm_cr_dp_mb_top?ie=UTF8" data-hook="reviews-summary-mobile" class="a-touch-link a-box a-touch-link-noborder a-first reviewsSummary"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row"><span data-hook="total-review-count" class="a-size-medium totalReviewCount a-text-bold">58 customer reviews</span></div><div class="a-icon-row a-spacing-micro"><i data-hook="average-stars-rating-anywhere" class="a-icon a-icon-star a-star-4 averageStarRating"><span class="a-icon-alt">4.2 out of 5 stars</span></i><span data-hook="average-stars-rating-text" class="a-text-beside-button averageStarRatingText">4.2 out of 5 stars</span></div></div></a>
<hr class="a-divider-text">
<div id="cm_cr_skyfall" class="a-section celwidget">
<div class="a-row a-spacing-small">
<div class="a-column a-span8">
<span class="a-size-medium a-text-bold">
Rated by customers interested in
</span>
</div>
<div class="a-column a-span4 a-text-right a-span-last">
<span class="a-declarative" data-action="a-modal" data-a-modal="{&quot;name&quot;:&quot;skyfallWhatsThis&quot;,&quot;activate&quot;:&quot;onclick&quot;,&quot;header&quot;:&quot;What's this?&quot;,&quot;inlineContent&quot;:&quot;\u201cRated by customers interested in\u201d shows how the customers interested in a specific topic rated this product. Customers\u2019 interests are determined by Amazon based on the customers\u2019 past purchases.&quot;}"><a href="javascript:void(0)" class="a-popover-trigger a-declarative"><span data-hook="cm_cr_skyfall_medley_whatisthis" class="a-size-mini">What's this?</span><i class="a-icon a-icon-popover"></i></a></span>
</div>
</div>
<div aria-live="polite" data-a-expander-name="clique-ratings-read-more" data-a-expander-collapsed-height="120" class="a-expander-collapsed-height a-row a-expander-container a-spacing-base a-expander-partial-collapse-container" style="max-height: none; height: 120px;">
<div aria-expanded="false" class="a-expander-content a-expander-partial-collapse-content" style="padding-bottom: 20px;">
<div class="a-section a-spacing-small">
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_ttl" class="a-row a-spacing-none">
<span data-hook="cm_cr_skyfall_medley_group" class="a-text-bold">
Software Engineering Books
</span>
</div>
</span>
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_sr" class="a-row">
<i class="a-icon a-icon-star a-star-4 averageStarRating"><span class="a-icon-alt">4.0 out of 5 stars</span></i>
<span class="a-text-beside-button averageStarRatingText">
4.0 out of 5 stars
</span>
</div>
</span>
</div>
<div class="a-section a-spacing-small">
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_ttl" class="a-row a-spacing-none">
<span data-hook="cm_cr_skyfall_medley_group" class="a-text-bold">
Languages
</span>
</div>
</span>
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_sr" class="a-row">
<i class="a-icon a-icon-star a-star-4 averageStarRating"><span class="a-icon-alt">4.0 out of 5 stars</span></i>
<span class="a-text-beside-button averageStarRatingText">
4.0 out of 5 stars
</span>
</div>
</span>
</div>
<div class="a-section a-spacing-small">
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_ttl" class="a-row a-spacing-none">
<span data-hook="cm_cr_skyfall_medley_group" class="a-text-bold">
Computer Books
</span>
</div>
</span>
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_sr" class="a-row">
<i class="a-icon a-icon-star a-star-4 averageStarRating"><span class="a-icon-alt">4.0 out of 5 stars</span></i>
<span class="a-text-beside-button averageStarRatingText">
4.0 out of 5 stars
</span>
</div>
</span>
</div>
</div>
<div class="a-expander-header a-expander-partial-collapse-header" style="opacity: 1; display: block;"><div class="a-expander-content-fade"></div><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;Read more&quot;, &quot;collapse_prompt&quot;:&quot;Read less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">Read more</span></a></div>
</div>
<div class="a-section feedback-section">
<div class="a-row a-spacing-base is-feature-helpful-row">
<div class="a-column a-span6">
<span class="a-size-base">
Is this feature helpful?
</span>
</div>
<div class="a-column a-span3">
<span class="a-declarative" data-action="reviews:skyfall-feedback-click" data-reviews:skyfall-feedback-click="{}">
<span class="a-button a-button-beside-text a-button-small cr-feedback-helpful-yes" id="a-autoid-1"><span class="a-button-inner"><input data-reftag="cm_cr_dp_mb_hlp_yes" class="a-button-input" type="submit" aria-labelledby="a-autoid-1-announce"><span class="a-button-text a-text-center" aria-hidden="true" id="a-autoid-1-announce">
Yes
</span></span></span>
</span>
</div>
<div class="a-column a-span3 a-span-last">
<span class="a-declarative" data-action="reviews:skyfall-feedback-click" data-reviews:skyfall-feedback-click="{}">
<span class="a-button a-button-beside-text a-button-small cr-feedback-helpful-no" id="a-autoid-2"><span class="a-button-inner"><input data-reftag="cm_cr_dp_mb_hlp_no" class="a-button-input" type="submit" aria-labelledby="a-autoid-2-announce"><span class="a-button-text a-text-center" aria-hidden="true" id="a-autoid-2-announce">
No
</span></span></span>
</span>
</div>
</div>
<div class="a-section aok-hidden more-feedback-section">
<div class="a-box a-alert-inline a-alert-inline-success"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
<span class="a-size-base a-color-success">
Thank you for your feedback.
</span>
</div></div></div>
</div>
</div>
</div>
</div></div><div class="a-box mostHelpfulReviewsFeature"><div class="a-box-inner">
<span data-cr-weblab-trigger-on-scroll="{&quot;metricName&quot;:&quot;dp-scroll-down-to-reviews-widget-mobile&quot;,&quot;prefix&quot;:&quot;&quot;}"></span>
<h3 class="a-spacing-small mostHelpfulReviewsTitle">Top reviews</h3><div id="cm-cr-dp-aw-review-list" class="a-row a-spacing-medium celwidget"><style>
.reviewText, .reviewByLine {
word-wrap: break-word;
}
a.enthusiast-badge, a.enthusiast-badge:visited, a.enthusiast-badge:link
{
color: #538000; /*GREEN*/
text-decoration: none;
}
</style>
<div class="a-row"><a href="/gp/profile/amzn1.account.AGS3JT27HFELWIDRJAPU42DCENZA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">David J. Anderson</span></div></a></div><div id="R29YSPVB4QPPPZ" class="a-section a-spacing-medium"><div id="customer_review-R29YSPVB4QPPPZ" class="a-section celwidget"><a href="/gp/aw/review/B00AYQNR46/R29YSPVB4QPPPZ/ref=cm_cr_dp_mb_rvw_1?ie=UTF8&amp;cursor=1" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-4 review-rating aok-align-center"><span class="a-icon-alt">4.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">Seven Languages in Seven Weeks gives us a good overview of seven interesting languages. The book doesn't delve into the languages to the extent that I wish it did, but it...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AEWS7OTWH2JXSMKN445H3OWOUIVA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">SemioticLabyrinth</span></div></a></div><div id="R2SPV2IY5ASBK5" class="a-section a-spacing-medium"><div id="customer_review-R2SPV2IY5ASBK5" class="a-section celwidget"><a href="/gp/aw/review/B00AYQNR46/R2SPV2IY5ASBK5/ref=cm_cr_dp_mb_rvw_2?ie=UTF8&amp;cursor=2" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-5 review-rating aok-align-center"><span class="a-icon-alt">5.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">This has been one of my favorite programming books. I haven't worked through all of it, but I did enjoy playing with the Io language. I love how he compares the languages to...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AEZSSCKQIMN3SNYMJPRQ53MN4MQQ/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Yun-Peng Wang</span></div></a></div><div id="R3PTNRE4693B2O" class="a-section a-spacing-medium"><div id="customer_review-R3PTNRE4693B2O" class="a-section celwidget"><a href="/gp/aw/review/B00AYQNR46/R3PTNRE4693B2O/ref=cm_cr_dp_mb_rvw_3?ie=UTF8&amp;cursor=3" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-3 review-rating aok-align-center"><span class="a-icon-alt">3.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">There is one movie for each chapter and I think the idea of the author is to make readers fun. However, I think the real fun comes from what is covered in this book.<br>I...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AHF6FQ3DCLZDV4SGIEERNP33QAPA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/I/41aPGL4tEML._CR0,5.0,272,272_SX48_.jpg"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/I/41aPGL4tEML._CR0,5.0,272,272_SX48_.jpg"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Mark Livingstone</span></div></a></div><div id="R3BEMLU7G94UF9" class="a-section a-spacing-medium"><div id="customer_review-R3BEMLU7G94UF9" class="a-section celwidget"><a href="/gp/aw/review/B00AYQNR46/R3BEMLU7G94UF9/ref=cm_cr_dp_mb_rvw_4?ie=UTF8&amp;cursor=4" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-4 review-rating aok-align-center"><span class="a-icon-alt">4.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">While I have been programming for many years, there are any languages I still have not tried. Reading this book gave me some idea of where these various languages fit in the...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AFNMMUTDULUFBU2NZT3TQILISGTA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/I/51OSYUvAyRL._CR62,0,375,375_SX48_.jpg"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/I/51OSYUvAyRL._CR62,0,375,375_SX48_.jpg"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Amazon Customer</span></div></a></div><div id="R2RAZ7N2CGN3P0" class="a-section a-spacing-medium"><div id="customer_review-R2RAZ7N2CGN3P0" class="a-section celwidget"><a href="/gp/aw/review/B00AYQNR46/R2RAZ7N2CGN3P0/ref=cm_cr_dp_mb_rvw_5?ie=UTF8&amp;cursor=5" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-4 review-rating aok-align-center"><span class="a-icon-alt">4.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">I believe this book is already outdated because some of the languages are dead or dying. Still, enjoyable for programmers or anyone wanted to learn more about programming.</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AECB4IDRQCNNEJD4RLUSHZCVEZ4Q/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Amazon Customer</span></div></a></div><div id="R2RZ76QHNR9MBI" class="a-section a-spacing-medium"><div id="customer_review-R2RZ76QHNR9MBI" class="a-section celwidget"><a href="/gp/aw/review/B00AYQNR46/R2RZ76QHNR9MBI/ref=cm_cr_dp_mb_rvw_6?ie=UTF8&amp;cursor=6" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-4 review-rating aok-align-center"><span class="a-icon-alt">4.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">Great for beginners and new students. Easy to read and comprehend intros to several language fundamentals.</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AFHXLFOQAHV5LEQBTMXBJT74QA7A/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/I/41aB5H2yZ+L._CR0,0,392,392_SX48_.jpg"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/I/41aB5H2yZ+L._CR0,0,392,392_SX48_.jpg"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">R. Friesel Jr.</span></div></a></div><div id="R1RN6XSRMI652W" class="a-section a-spacing-medium"><div id="customer_review-R1RN6XSRMI652W" class="a-section celwidget"><a href="/gp/aw/review/B00AYQNR46/R1RN6XSRMI652W/ref=cm_cr_dp_mb_rvw_7?ie=UTF8&amp;cursor=7" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-3 review-rating aok-align-center"><span class="a-icon-alt">3.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">I like the idea of this book more than the book itself. Granted, Tate took on a daunting task: how do you introduce seven divergent languages with seven divergent styles and...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AGXFA7AR75DEVGWH653QKCL3ILPA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Scott Piper</span></div></a></div><div id="R2A1V60RUTRFGS" class="a-section a-spacing-medium"><div id="customer_review-R2A1V60RUTRFGS" class="a-section celwidget"><a href="/gp/aw/review/B00AYQNR46/R2A1V60RUTRFGS/ref=cm_cr_dp_mb_rvw_8?ie=UTF8&amp;cursor=8" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-5 review-rating aok-align-center"><span class="a-icon-alt">5.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">I find this book to be a lot like "Programming Collective Intelligence" in that it introduces you to new concepts for even experienced developers. You're expected to know a...</span></div></a></div></div></div></div></div><a href="/gp/aw/reviews/B00AYQNR46/ref=cm_cr_dp_mb_show_all_btm?ie=UTF8" data-hook="see-all-reviews-link-mobile" class="a-touch-link a-box seeMostRecentReviews a-text-bold"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>See all 58 reviews</div></a></div></div><span class="a-button a-button-supplemental writeReviewButton" id="a-autoid-3"><span class="a-button-inner"><i class="a-icon a-icon-supplemental"></i><a href="/review/create-review/ref=cm_cr_dp_mb_wr_but?ie=UTF8&amp;channel=awUDPv3&amp;asin=B00AYQNR46" data-hook="mobley-write-review" class="a-button-text" role="button" id="a-autoid-3-announce">Write a review</a></span></span></div>
<div id="sponsoredProducts2_feature_div" data-feature-name="sponsoredProducts2" data-template-name="sponsoredProducts2" class="a-section a-spacing-none feature">
</div>
<div class="aw-campaigns"></div><div class="aw-campaigns"></div><div id="p13n-m-mobile-session-sims-feature-2" class="celwidget" cel_widget_id="mobile-session-sims-feature-2">
<div id="sims-session" class="a-section a-spacing-large sims">
<h2 class="a-size-large a-spacing-base">Customers who viewed this also viewed</h2>
<div data-ajax-params="{&quot;auiDeviceType&quot;:&quot;mobile&quot;,&quot;featureId&quot;:&quot;SimilaritiesMobileCarousel&quot;,&quot;reftagPrefix&quot;:&quot;pd_aw_sbs_351&quot;,&quot;productDetailsTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::ProductDetails::Phone::Base&quot;,&quot;widgetTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::List::Static::Phone&quot;,&quot;faceoutTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::Product::Phone::ListFaceout&quot;}" data-ajax-url="/gp/p13n-shared/faceout-partial" data-p13n-feature-metadata="{&quot;baseAsin&quot;:&quot;B00AYQNR46&quot;}" data-p13n-feature-name="pd_aw_sbs_351" data-p13n-global="{&quot;auiDeviceType&quot;:&quot;mobile&quot;,&quot;marketplaceId&quot;:&quot;ATVPDKIKX0DER&quot;,&quot;requestId&quot;:&quot;NDW9PCFNDRXWFHQVWR24&quot;,&quot;marketplace&quot;:&quot;US&quot;,&quot;session&quot;:&quot;147-0816675-1753153&quot;}" class="a-section a-spacing-micro p13n-sc-static-list">
<div class="a-section p13n-sc-list-cells-container">
<ul class="a-unordered-list a-nostyle a-vertical p13n-sc-list-cells">
<li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sbs_351_1&quot;,&quot;asin&quot;:&quot;B00RW8XFUK&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL._SY200_QL15_.jpg" href="/gp/aw/d/B00RW8XFUK/ref=pd_aw_sbs_351_1?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=91X6qtR1pyL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven More Languages in Seven Weeks: Languages That Are Shaping the Future" src="https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg" data-fling-asin="B00RW8XFUK" data-fling-refmarker="pd_aw_sbs_351_1" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL.__BG0,0,0,0_FMpng_AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL.__BG0,0,0,0_FMpng_AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg&quot;:[200,200]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/91X6qtR1pyL._SY200_QL15_.jpg" href="/gp/aw/d/B00RW8XFUK/ref=pd_aw_sbs_351_1?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=91X6qtR1pyL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven More Languages in Seven Weeks: Languages That Are Shaping the Future
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4"><span class="a-icon-alt">3.8 out of 5 stars</span></i>&nbsp;<span aria-label="7 reviews" class="a-size-small">7</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$27.11</span></span> </div>
</a>
</div>
</div></div>
</span></li><li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sbs_351_2&quot;,&quot;asin&quot;:&quot;B00AYQNR50&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL._SY200_QL15_.jpg" href="/gp/aw/d/B00AYQNR50/ref=pd_aw_sbs_351_2?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=81x-u6F2zNL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement" src="https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg" data-fling-asin="B00AYQNR50" data-fling-refmarker="pd_aw_sbs_351_2" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL.__BG0,0,0,0_FMpng_AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL.__BG0,0,0,0_FMpng_AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL.__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg&quot;:[200,200]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/81x-u6F2zNL._SY200_QL15_.jpg" href="/gp/aw/d/B00AYQNR50/ref=pd_aw_sbs_351_2?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=81x-u6F2zNL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4-5"><span class="a-icon-alt">4.4 out of 5 stars</span></i>&nbsp;<span aria-label="45 reviews" class="a-size-small">45</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$18.26</span></span> </div>
</a>
</div>
</div></div>
</span></li><li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sbs_351_3&quot;,&quot;asin&quot;:&quot;B073X6GNJ1&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/81TVotMHgoL._SY200_QL15_.jpg" href="/gp/aw/d/B073X6GNJ1/ref=pd_aw_sbs_351_3?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=81TVotMHgoL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="The Complete Software Developer's Career Guide: How to Learn Your Next Programming Language, Ace Your Programming Interview, and Land The Coding Job Of Your Dreams" src="https://images-na.ssl-images-amazon.com/images/I/81TVotMHgoL._UX300_PJku-sticker-v7,TopRight,0,-50_OU01__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg" data-fling-asin="B073X6GNJ1" data-fling-refmarker="pd_aw_sbs_351_3" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/81TVotMHgoL._UX300_PJku-sticker-v7,TopRight,0,-50_OU01__BG0,0,0,0_FMpng_AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/81TVotMHgoL._UX300_PJku-sticker-v7,TopRight,0,-50_OU01__BG0,0,0,0_FMpng_AC_UL200_SR200,200_.jpg&quot;:[200,200],&quot;https://images-na.ssl-images-amazon.com/images/I/81TVotMHgoL._UX300_PJku-sticker-v7,TopRight,0,-50_OU01__BG0,0,0,0_FMpng_AC_UL100_SR100,100_.jpg&quot;:[100,100]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/81TVotMHgoL._SY200_QL15_.jpg" href="/gp/aw/d/B073X6GNJ1/ref=pd_aw_sbs_351_3?ie=UTF8&amp;psc=1&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;dpPl=1&amp;dpID=81TVotMHgoL" data-isdpimgcached="1">
<span class="p13n-sc-bestseller p13n-sc-badge-container a-spacing-micro">
<span class="p13n-sc-badge-body aok-float-left">
<span class="p13n-sc-badge-text">Best Seller</span>
</span>
<span class="p13n-sc-badge-triangle aok-float-left"></span>
</span>
<div class="p13n-sc-truncate p13n-sc-line-clamp-3" aria-hidden="true" data-rows="3">
The Complete Software Developer's Career Guide: How to Learn Your Next Programming Language, Ace Your Programming Interview, and Land The Coding Job Of Your Dreams
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4-5"><span class="a-icon-alt">4.7 out of 5 stars</span></i>&nbsp;<span aria-label="382 reviews" class="a-size-small">382</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$4.99</span></span> </div>
</a>
</div>
</div></div>
</span></li>
</ul>
</div>
<div class="a-section p13n-sc-static-list-buttons">
<a href="/gp/p13n-mobile/overflow?ie=UTF8&amp;asins=B00RW8XFUK%2CB00AYQNR50%2CB073X6GNJ1%2CB01GGPGO66%2CB01N2RTX9Q%2CB01M01YDQA%2CB00MH6EMN6%2CB00JDMPOSY%2CB0026OR3JO&amp;baseAsin=B00AYQNR46&amp;faceoutTemplateClass=PI%3A%3AP13N%3A%3AViewTemplates%3A%3AProduct%3A%3APhone%3A%3AListFaceout&amp;parentFeatureID=SimilaritiesMobileCarousel&amp;productDetailsTemplateClass=PI%3A%3AP13N%3A%3AViewTemplates%3A%3AProductDetails%3A%3APhone%3A%3ABase&amp;ref=pd_aw_sbs_351_l_of&amp;refRID=NDW9PCFNDRXWFHQVWR24&amp;reftagPrefix=pd_aw_sbs_351&amp;title=Customers%20who%20viewed%20this%20also%20viewed" class="a-touch-link a-box"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>Show all 9 items</div></a>
</div>
</div>
</div>
</div><div id="returnPolicy_feature_div" data-feature-name="returnPolicy" data-template-name="returnPolicy" class="a-section a-spacing-none feature t-prnt t-full">
</div><div class="aw-campaigns"><script>if (typeof uet === 'function' && typeof ues === 'function') {var scope = 'detail_encore_detail-mWeb';var placementId = '';ues('wb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); uet('bb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); if (placementId) {ues('wb', 'adplacements:' + placementId, {wb:1});uet('bb', 'adplacements:' + placementId, {wb:1});}}</script> <style>@media screen and (orientation:portrait){div[id$=ape_detail_encore_detail-mWeb_wrapper]{margin-left: -14px; margin-right: -14px; height: 132vw;} div[id$=ape_detail_encore_detail-mWeb_placement]{width: 100% !important; height: 100% !important;} [id$=ape_detail_encore_detail-mWeb_iframe]{width: 1px !important; min-width: 100% !important; height: 1px !important; min-height: 100% !important;border-top: 1px solid #ddd;}} @media screen and (orientation:landscape){ div[id$=ape_detail_encore_detail-mWeb_wrapper]{margin-left: -7px; margin-right: -7px; height: 54vw;} div[id$=ape_detail_encore_detail-mWeb_placement]{width: 100% !important; height: 100% !important;} [id$=ape_detail_encore_detail-mWeb_iframe]{width: 1px !important; min-width: 100% !important; height: 1px !important; min-height: 100% !important;}}</style> <div id="ape_detail_encore_detail-mWeb_wrapper" class="celwidget text/x-dacx-safeframe" data-ad-details="{&quot;slot&quot; :&quot;detail_encore_detail-mWeb&quot;,&quot;pageType&quot;: &quot;detail&quot;,&quot;subPageType&quot;: &quot;detail-mWeb&quot;,&quot;slotName&quot; :&quot;encore&quot;,&quot;src&quot; : &quot;prefetchEnabled&quot;,&quot;adServer&quot; :&quot;cs&quot;,&quot;campaignId&quot; : &quot;11605&quot;,&quot;arid&quot; :&quot;e4c976ccc7394296b583ace416a621b2&quot;, &quot;size&quot; :{&quot;width&quot; : &quot;300px&quot;,&quot;height&quot; : &quot;250px&quot;},&quot;maxAdWidth&quot;: &quot;&quot;,&quot;allowedSizes&quot; :[],&quot;allowedDomains&quot; : [],&quot;loadAfter&quot; : &quot;900px&quot;,&quot;extraDelay&quot; : 0,&quot;iframeExtraStyle&quot;: &quot;&quot;,&quot;iframeClass&quot;: &quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;: false,&quot;adLabelWrapperId&quot;: &quot;ape_detail_encore_detail-mWeb_text-wrapper&quot;,&quot;adLabelId&quot;: &quot;ape_detail_encore_detail-mWeb_text&quot;,&quot;advTextWrapperDivStyle&quot;: &quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;: &quot;font-size: 10px; color: #555; text-align: center; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;: &quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9lbmNvcmVfZGV0YWlsLW1XZWJfdGV4dC13cmFwcGVyIiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7IHRleHQtYWxpZ246Y2VudGVyOyBtYXJnaW4tbGVmdDogLTE0cHg7IG1hcmdpbi1yaWdodDogLTE0cHg7IGhlaWdodDogYXV0bzsiICA+PGRpdiBpZD0iYXBlX2RldGFpbF9lbmNvcmVfZGV0YWlsLW1XZWJfdGV4dCIgc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsgY29sb3I6ICM1NTU7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luOiAwcHggM3B4IDZweCAwOyIgID5BZHZlcnRpc2VtZW50PC9kaXY+PC9kaXY+&quot;,&quot;adPixels&quot;: [],&quot;adPixelDelay&quot;: &quot;0&quot;,&quot;aaxImpPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/e/xsp/imp?b=Qo5Z1mhwek6SrqQvJsX7rHYAAAFhpJkrJQEAAAGQAdU34OI&quot;,&quot;aaxInstrPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/x/px/Qo5Z1mhwek6SrqQvJsX7rHYAAAFhpJkrJQEAAAGQAdU34OI/&quot;,&quot;htmlContent&quot;: &quot;&quot;,&quot;htmlContentEncoded&quot;: &quot;IDxzdHlsZT5AbWVkaWEgc2NyZWVuIGFuZCAob3JpZW50YXRpb246cG9ydHJhaXQpe2RpdltpZCQ9YXBlX2RldGFpbF9lbmNvcmVfZGV0YWlsLW1XZWJfY3JlYXRpdmVXcmFwcGVyXXt3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDt9IFtpZCQ9bW9iaWxlLWFkcy1saW5rXXt3aWR0aDogMTc1JSAhaW1wb3J0YW50OyBtYXJnaW46IC0yMS41JSAtMzcuNSUgLTIxLjUlIC0zNy41JTt9fSBAbWVkaWEgc2NyZWVuIGFuZCAob3JpZW50YXRpb246bGFuZHNjYXBlKXtkaXZbaWQkPWFwZV9kZXRhaWxfZW5jb3JlX2RldGFpbC1tV2ViX2NyZWF0aXZlV3JhcHBlcl17d2lkdGg6IDEwMCUgIWltcG9ydGFudDsgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7fSBbaWQkPW1vYmlsZS1hZHMtbGlua117d2lkdGg6IDEwMCUgIWltcG9ydGFudDsgbWFyZ2luOiAtMjIuNSUgMCAtMjIuNSUgMDt9fTwvc3R5bGU+IDxkaXYgaWQ9ImFwZV9kZXRhaWxfZW5jb3JlX2RldGFpbC1tV2ViX2NyZWF0aXZlV3JhcHBlciIgICA+DQo8aGVhZD48c3R5bGU+LmFje2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjE4cHg7aGVpZ2h0OjE0cHg7ei1pbmRleDo5O3RvcDowO3JpZ2h0OjA7YmFja2dyb3VuZDp1cmwoaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9HLzAxL2RhL2FkY2hvaWNlcy9hYy10b3ByaWdodC1zcHJpdGUucG5nKX0jdnBjLWxvZ297cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJSAxMDAlO2hlaWdodDoxNXB4O3dpZHRoOjEwMCU7Ym90dG9tOjE2cHg7bGVmdDowO2Rpc3BsYXk6bm9uZX0uaGlkZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fSNtb2JpbGUtYWRzLWFke2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0jbW9iaWxlLWFkcy1saW5re3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbn0jbW9iaWxlLWFkLWltYWdle3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG99PC9zdHlsZT48L2hlYWQ+PGJvZHkgc3R5bGU9Im1hcmdpbjowcHg7cGFkZGluZzowcHg7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6aGlkZGVuOyI+PGRpdiBpZD0ibW9iaWxlLWFkcy1hZCI+PGEgaWQ9Im1vYmlsZS1hZHMtbGluayI+PGltZyBpZD0ibW9iaWxlLWFkLWltYWdlIj48L2E+PC9kaXY+PHNjcmlwdCBpZD0iaWZyYW1lX3NjcmlwdCIgdHlwZT0idGV4dC9wbGFpbiI+ZG9jdW1lbnQuYWQ9e2FpZDoiMzIyMzg2NTg5MDAwMSIsY2lkOiIzMjk4NzI2NTYwMjAxIix3OjI1NjAsaDoyNTYwLHRlbXBsYXRlOiJJbWFnZSAtIG1vYmlsZSBPJmFtcDtPLTEuNTQyIn0sd2luZG93LmFhblJlc3BvbnNlPXthZElkOmRvY3VtZW50LmFkLmFpZCxjcmVhdGl2ZUlkOmRvY3VtZW50LmFkLmNpZCxhZE5ldHdvcms6InBkYSIsc2hhemFtU3RhZ2U6InByb2QiLHNoYXphbUlkOiIxMTk4NDgzMSJ9O3RyeXtwYXJlbnQmJnBhcmVudC5hZF91dGlscyYmcGFyZW50LmFkX3V0aWxzLmV4cGFuZF9hZChmcmFtZUVsZW1lbnQpfWNhdGNoKGUpe31zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKCl7dmFyIGU9LjA1LHQ9ImNsbWV0IixuPWZ1bmN0aW9uKGksYSxyLG8sYyxzKXt0aGlzLnNhbXBsaW5nUmF0ZT1jfHxlLHRoaXMuc2hvdWxkRmlyZU1ldHJpY3M9TWF0aC5yYW5kb20oKTw9dGhpcy5zYW1wbGluZ1JhdGUsdGhpcy5jaGFubmVsTmFtZT1pLHRoaXMuaW1wcmVzc2lvbklkPWF8fG4uZ2VuZXJhdGVVVUlEKCksdGhpcy5zdGFnZT1yfHwicHJvZCIsdGhpcy5yZWdpb249b3x8Im5hIix0aGlzLmtpbmVzaXNBcHBJZD1zfHx0LHRoaXMubG9nX2VuZHBvaW50PW4uZ2VuZXJhdGVVcmwodGhpcy5zdGFnZSx0aGlzLnJlZ2lvbil9O3JldHVybiBuLmdlbmVyYXRlVVVJRD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gTWF0aC5mbG9vcig2NTUzNiooMStNYXRoLnJhbmRvbSgpKSkudG9TdHJpbmcoMTYpLnN1YnN0cigxLDQpfXJldHVybiBlKCkrZSgpK2UoKStlKCkrZSgpK2UoKStlKCkrZSgpfSxuLmdlbmVyYXRlVXJsPWZ1bmN0aW9uKGUsdCl7dmFyIG49IiIsaT0iIjt0PSJqcCI9PXQ/ImZlIjp0LHQ9dC50b0xvd2VyQ2FzZSgpO3ZhciBhPSJuYSI9PXQ/IiI6Ii0iK3Qscj1mdW5jdGlvbihlKXt2YXIgdD0oYT8iYWF4IjoicyIpK2ErZSxuPWE/Ii9zIjoiIjtyZXR1cm4gdCsiLmFtYXpvbi1hZHN5c3RlbS5jb20iK259O3N3aXRjaChlKXtjYXNlInByb2QiOmNhc2UicHJvZGxhYnMiOm49IkFOWSIsaT1yKCIiKTticmVhaztjYXNlImJldGEiOmNhc2UiZ2FtbWEiOm49Imh0dHA6IixpPXIoIm5hIj09dD8iLXByZXByb2QiOiItZ2FtbWEiKTticmVhaztjYXNlImxvY2FsIjpkZWZhdWx0Om49Imh0dHA6IixpPXIoIm5hIj09dD8iLXByZXByb2QiOiItZ2FtbWEiKX12YXIgbz0oIkFOWSI9PT1uP2xvY2F0aW9uLnByb3RvY29sOm4pKyIvLyIraTtyZXR1cm4gb30sbi5lYWNoPWZ1bmN0aW9uKGUsdCl7aWYoZSYmdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQpaWYoZS5sZW5ndGgpZm9yKHZhciBuPTAsaT1lLmxlbmd0aDtpPm47bisrKXQobixlW25dKTtlbHNlIGZvcih2YXIgYSBpbiBlKXQoYSxlW2FdKX0sbi5nZXRRdWVyeVN0cmluZz1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIGk9ImJvb2xlYW4iPT10eXBlb2YgdC5lc2NhcGU/dC5lc2NhcGU6ITAsYT1bXTtuLmVhY2goZSxmdW5jdGlvbihlLHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgdCYmKHQ9dC5jb25zdHJ1Y3Rvcj09PUFycmF5P3Quam9pbigiLCIpOnQsaSYmKHQ9ZW5jb2RlVVJJQ29tcG9uZW50KHQpKSxhLnB1c2goW2UsdF0uam9pbigiPSIpKSl9KTt2YXIgcj1hLmpvaW4oIiYiKTtyZXR1cm4gcn0sbi5wcm90b3R5cGUuZ2VuZXJhdGVQaXhlbFVybD1mdW5jdGlvbihlKXt2YXIgdD17fTtlPWV8fHt9LGUuaT1lbmNvZGVVUklDb21wb25lbnQodGhpcy5pbXByZXNzaW9uSWQpLGUuYXBwPWVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmtpbmVzaXNBcHBJZCk7dmFyIGk9e307cmV0dXJuIGkuZD0iZm9yZXN0ZXItZGlkIixpWyJleC1mY2giXT10aGlzLmNoYW5uZWxOYW1lLGlbImV4LWZhcmdzIl09Ij8iK2VuY29kZVVSSUNvbXBvbmVudChuLmdldFF1ZXJ5U3RyaW5nKGUpKSxpLmNiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHQuZXNjYXBlPSExLHRoaXMubG9nX2VuZHBvaW50KyIvaXVpMz8iK24uZ2V0UXVlcnlTdHJpbmcoaSx0KX0sbi5wcm90b3R5cGUuc2VuZFBpeGVsPWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2hvdWxkRmlyZU1ldHJpY3Mpe3ZhciB0PW5ldyBJbWFnZTtyZXR1cm4gdC5zcmM9dGhpcy5nZW5lcmF0ZVBpeGVsVXJsKGUpLHR9fSxuLnByb3RvdHlwZS5sb2dJbXByZXNzaW9uPWZ1bmN0aW9uKGUpe251bGwhPXRoaXMuY2hhbm5lbE5hbWUmJihlPWV8fHt9LGUuaW1wPTEsdGhpcy5zZW5kUGl4ZWwoZSkpfSxuLnByb3RvdHlwZS5sb2dFdmVudD1mdW5jdGlvbihlLHQsbil7aWYobnVsbCE9dGhpcy5jaGFubmVsTmFtZSl7dmFyIGk9e307aWYobnVsbCE9ZSYmbnVsbCE9dCl7dHJ5e24mJihpLnR5cGU9bik7dmFyIGE9SlNPTi5zdHJpbmdpZnkodCk7aS5lbj1lLGkuZXY9YX1jYXRjaChyKXtpLnN0cmluZ2lmeU5vdEF2YWlsYWJsZT0xfXRoaXMuc2VuZFBpeGVsKGkpfX19LG4ucHJvdG90eXBlLnNldEltcHJlc3Npb25JZD1mdW5jdGlvbihlKXt0aGlzLmltcHJlc3Npb25JZD1lfSxufSgpLG49LjA1LGk9ImRhLWN4LW1ldHJpY3MiLGE9ZnVuY3Rpb24ocixvLGMscyl7dmFyIGM9Y3x8bixvPW98fGk7dC5jYWxsKHRoaXMsbyxyLCJwcm9kIiwibmEiLGMscyk7dmFyIGw9dGhpczt0aGlzLnRpbWVycz17fSxhLmFkZExpc3RlbmVyKGUsImVycm9yIixmdW5jdGlvbihlKXtpZihlLmVycm9yJiZlLmVycm9yLnN0YWNrKXt2YXIgdD1lLm1lc3NhZ2UrIiA6ICIrZS5lcnJvci5zdGFjaztsLmFkZENvdW50KGEuTE9HX0VWRU5UX05BTUVTLlVOQ0FVR0hUX0VSUk9SLHQubGVuZ3RoPDUwMD90OnQuc3Vic3RyaW5nKDAsNTAwKSl9ZWxzZSBsLmFkZENvdW50KGEuTE9HX0VWRU5UX05BTUVTLlVOQ0FVR0hUX0VSUk9SLGUubWVzc2FnZSl9KX07cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5jcmVhdGUmJihPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlPWUsbmV3IHR9KSxhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hLGEuRVZFTlRfVFlQRVM9e1RJTUVSOiJ0aW1lciIsQ09VTlRFUjoiY291bnRlciIsSlNPTjoianNvbiJ9LGEuTE9HX0VWRU5UX05BTUVTPXtCVVlfQk9YX0xPQURfTEFURU5DWToiQnV5Qm94TG9hZExhdGVuY3kiLEFBTl9MQVRFTkNZOiJBYW5MYXRlbmN5IixBQU5fRVJST1I6IkFhbkVycm9yIixEUk9QX0RPV05fU0VMRUNUT1I6IkRyb3BEb3duU2VsZWN0b3IiLFVOQ0FVR0hUX0VSUk9SOiJVbmNhdWdodEVycm9yIixVTkRFRklORURfVFJBQ0tFUl9BUkc6IlVuZGVmaW5lZFRyYWNrZXJBcmciLENPT1JESU5BVE9SX1RSQUNLRVI6IkNvb3JkaW5hdG9yVHJhY2tlciIsSU1BR0VfTE9BRF9MQVRFTkNZOiJJbWFnZUxvYWRMYXRlbmN5IixDUkVBVElWRV9MT0FEX0xBVEVOQ1k6IkNyZWF0aXZlTG9hZExhdGVuY3kifSxhLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsbixpKXt2YXIgYT1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHxlLmV2ZW50LGkodCl9O3QuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIobixhLCEwKToobj0ib24iK24sdC5hdHRhY2hFdmVudD90LmF0dGFjaEV2ZW50KG4sYSk6dFtuXT1hKX0sYS5wcm90b3R5cGUubG9nSW1wcmVzc2lvbj1mdW5jdGlvbihlKXtzd2l0Y2goZT1lfHx7fSxlLnM9ZS5zaGF6YW1JZHx8IjExOTg0ODMxIixlLm49ZS50ZW1wbGF0ZU5hbWV8fCJJbWFnZSAtIG1vYmlsZSBPJk8iLGUubD1lLmxvY2FsZXx8IlVTIixlLmFzPWUuYWRTZXJ2ZXJ8fCJjb3JuZXJzdG9uZSIsZS50bWp2PWUudGVtcGxhdGVNYWpvclZlcnNpb258fCIxIixlLnRtbnY9ZS50ZW1wbGF0ZU1pbm9yVmVyc2lvbnx8IjU0MiIsZS5hcyl7Y2FzZSJkb3VibGVjbGljayI6ZS5haT1lLmFkSWR8fCIlZWFpZCEiLGUuY2k9ZS5jcmVhdGl2ZUlkfHwiJWVjaWQhIjticmVhaztjYXNlImNvcm5lcnN0b25lIjplLmFpPWUuYWRJZHx8IjMyMjM4NjU4OTAwMDEiLGUuY2k9ZS5jcmVhdGl2ZUlkfHwiMzI5ODcyNjU2MDIwMSI7YnJlYWs7Y2FzZSJwcmV2aWV3IjpjYXNlIkFkTGFiIjplLmFpPWUuYWRJZHx8IkFEX0lEIixlLmNpPWUuY3JlYXRpdmVJZHx8IkNSRUFUSVZFX0lEIjticmVhaztjYXNlIm1lZGlhY2VudHJhbCI6ZS5haT1lLmFkSWR8fHNwSW5mby5haWQsZS5jaT1lLmNyZWF0aXZlSWR8fHNwSW5mby5jaWQ7YnJlYWs7ZGVmYXVsdDplLmFpPWUuYWRJZHx8Ii0tIyNBRF9JRCMjLS0iLGUuY2k9ZS5jcmVhdGl2ZUlkfHwiLS0jI0NSRUFUSVZFX0lEIyMtLSJ9ZS51YT1uYXZpZ2F0b3IudXNlckFnZW50LHQucHJvdG90eXBlLmxvZ0ltcHJlc3Npb24uY2FsbCh0aGlzLGUpfSxhLnByb3RvdHlwZS5zdGFydFRpbWVyPWZ1bmN0aW9uKGUpe3RoaXMudGltZXJzW2VdPW5ldyBEYXRlfSxhLnByb3RvdHlwZS5lbmRUaW1lcj1mdW5jdGlvbihlKXtudWxsIT10aGlzLnRpbWVyc1tlXSYmKHRoaXMudGltZXJzW2VdPW5ldyBEYXRlLXRoaXMudGltZXJzW2VdLHRoaXMubG9nRXZlbnQoZSx0aGlzLnRpbWVyc1tlXSxhLkVWRU5UX1RZUEVTLlRJTUVSKSx0aGlzLnRpbWVyc1tlXT1udWxsKX0sYS5wcm90b3R5cGUuYWRkQ291bnQ9ZnVuY3Rpb24oZSx0KXt0PXR8fDEsdGhpcy5sb2dFdmVudChlLHQsYS5FVkVOVF9UWVBFUy5DT1VOVEVSKX0sYX0oKSxhPWZ1bmN0aW9uKCl7dmFyIHQ9e30saT0vXC5hbWF6b25cLmNvbSg6LiopPyQvLGE9InVuZGVmaW5lZCIhPXR5cGVvZiBJU18zUCYmSVNfM1B8fCExLHI9ITEsYz0hMTtpZighYSl7dmFyIHM9ZTt0cnl7Zm9yKDtzIT1zLnBhcmVudDspe2lmKCFzLnBhcmVudC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImNyb3NzLWRvbWFpbiBleGNlcHRpb24iKTtzPXMucGFyZW50fX1jYXRjaChsKXt9dHJ5e3I9InVuZGVmaW5lZCI9PXR5cGVvZiBNU0ZDbGllbnQ/cy5TRkNsaWVudD9zLlNGQ2xpZW50LmlzT25BbWF6b24oKTppLnRlc3Qocy5sb2NhdGlvbi5ob3N0KTohMH1jYXRjaChsKXt9bm90T25BZFN5c3RlbVBhdHRlcm49L14oPyFhbWF6b24tYWRzeXN0ZW1cLmFtYXpvblwuY29tKDouKik/JCkvO3RyeXtyPXImJm5vdE9uQWRTeXN0ZW1QYXR0ZXJuLnRlc3Qobi5sb2NhdGlvbi5ob3N0KX1jYXRjaChsKXt9ZS5pc05hdGl2ZVJlYWN0UGxhY2VtZW50JiYocj0hMCl9cmV0dXJuIGM9IWEmJiFyLGZ1bmN0aW9uKCl7dmFyIHQ9ITEsbj0zZTM7ZS5hZENob2ljZXNUYXBwZWQ9ZnVuY3Rpb24oaSl7ZnVuY3Rpb24gYSgpe3Q9ITAsaS5zdHlsZS53aWR0aD0iNzZweCIsaS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb249Ii0xOXB4IDAiLHNldFRpbWVvdXQocixuKX1mdW5jdGlvbiByKCl7dD0hMSxpLnN0eWxlLndpZHRoPSIxOHB4IixpLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbj0iMCAwIn1pZih0KXtpZigidW5kZWZpbmVkIj09dHlwZW9mIG1yYWlkKWUudG9wLmxvY2F0aW9uPSJodHRwczovL3d3dy5hbWF6b24uY29tL2dwL2F3L2FhcC8/dmlldz13ZWJ2aWV3JmNySWQ9MzI5ODcyNjU2MDIwMSI7ZWxzZXt2YXIgbz0iaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20vZ3AvYXcvYWFwL2FwcD9hZElkPUEzX2c2NWVobkRpc2thbU1rTVB0a2Y4JmFwcElkPSZjcklkPTMyOTg3MjY1NjAyMDEiO28rPSImYz1VUyIudG9Mb3dlckNhc2UoKSxtcmFpZC5vcGVuKG8pfXIoKX1lbHNlIGEoKTtyZXR1cm4hMX19KCksdC5nZXRMb2dvVXJsPWZ1bmN0aW9uKCl7cmV0dXJuIG8uZ2V0TWVkaWFVcmwoKSsiIn0sdC5pc09uQW1hem9uPWZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHQuaXNPblRoaXJkUGFydHk9ZnVuY3Rpb24oKXtyZXR1cm4gYX0sdC5pc09uU3Vic2lkaWFyeT1mdW5jdGlvbigpe3JldHVybiBjfSx0fSgpLHI9ZnVuY3Rpb24oKXt2YXIgdCxuLGkscixvPXt9LGM9ZnVuY3Rpb24oZSxhLG8sYyl7dD1lLG49YSxpPW8scj1jfTtjKCIzMjIzODY1ODkwMDAxIiwiMzI5ODcyNjU2MDIwMSIsJyR7cmVxdWVzdC5hcmlkfScsInBkYSIpO3ZhciBzPSExLGw9dm9pZCAwLHU9ITEsZD0hMSxmPSIiO3JldHVybiBzPSJ1bmRlZmluZWQiIT10eXBlb2YgbXJhaWQsZD0iMDI0MDI4MzI3OGE5NGUzNmFkNTY2MDU3ZjA5YjFmYjEiPT09Zix1PWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PWUudG9wLm5hdmlnYXRvci51c2VyQWdlbnQsbj10Lm1hdGNoKC9pUGFkL2kpLGk9dC5tYXRjaCgvQW5kcm9pZC9pKSYmIXQubWF0Y2goL21vYmlsZS9pKX1jYXRjaChhKXt9cmV0dXJuIG58fGl9KCksby5nZXRBZElkPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG8uZ2V0Q3JlYXRpdmVJZD1mdW5jdGlvbigpe3JldHVybiBufSxvLmdldEltcHJlc3Npb25JZD1mdW5jdGlvbigpe3JldHVybiBpfSxvLmdldEFkU2VydmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHJ9LG8uZ2V0M3BDbGlja1RyYWNrZXI9ZnVuY3Rpb24oKXtyZXR1cm4iIn0sby5pc0FtYW49ZnVuY3Rpb24oKXt2YXIgZT1hLmlzT25UaGlyZFBhcnR5KCksdD1hLmlzT25TdWJzaWRpYXJ5KCk7cmV0dXJuIGV8fHR9LG8uaXNNcmFpZEF2YWlsYWJsZT1mdW5jdGlvbigpe3JldHVybiBzfSxvLmlzTVNob3BOYXRpdmVBcHA9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sby5pc01hc2hBdmFpbGFibGU9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGwmJihsPSJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uJiYidW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbi5tYXNoKSxsfSxvLmlzVGFibGV0PWZ1bmN0aW9uKCl7cmV0dXJuIHV9LG8uaXNNb2JpbGU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sb30oKSxvPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT17fSxhPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUmVnRXhwKCIoXFxzfF4pIitlKyIoXFxzfCQpIil9O2kuRE9fTk9USElORz1mdW5jdGlvbigpe30saS5pc1NlY3VyZT1mdW5jdGlvbigpe3JldHVybi9zLy50ZXN0KGxvY2F0aW9uLnByb3RvY29sKX0saS5mb3JFYWNoPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsaT1lLmxlbmd0aDtpPm47bisrKXQoZVtuXSxuLGUpfSxpLmdldEVsZW1lbnRCeUlkPWZ1bmN0aW9uKGUpe3JldHVybiB0LmdldEVsZW1lbnRCeUlkKGUpfSxpLmluSWZyYW1lPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLnNlbGYhPT1lLnRvcH1jYXRjaCh0KXtyZXR1cm4hMH19LGkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1mdW5jdGlvbihlKXtpZih0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKTtpZih0LnF1ZXJ5U2VsZWN0b3JBbGwpcmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbCgiLiIrZSk7aWYodC5ldmFsdWF0ZSl7Zm9yKHZhciBuLGk9Ii4vLypbY29udGFpbnMoY29uY2F0KCcgJywgQGNsYXNzLCAnICcpLCAnICIrZSsiICcpXSIscj10LmV2YWx1YXRlKGksdCxudWxsLDAsbnVsbCksbz1bXTtuPXIuaXRlcmF0ZU5leHQoKTspby5wdXNoKG4pO3JldHVybiBvfWZvcih2YXIgcj10LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksaT1hKGUpLG89W10sbj0wO248ci5sZW5ndGg7bisrKWkudGVzdChyW25dLmNsYXNzTmFtZSkmJm8ucHVzaChyW25dKTtyZXR1cm4gb30saS5nZXRRdWVyeVN0cmluZz1mdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcih2YXIgaSBpbiBlKW4ucHVzaChpKyI9IitlW2ldKTt2YXIgYT1uLmpvaW4oIiYiKTtyZXR1cm4gdD9lbmNvZGVVUklDb21wb25lbnQoYSk6YX0saS5zZXRCYWNrZ3JvdW5kSW1hZ2U9ZnVuY3Rpb24oZSx0KXtlLnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKCIrdCsiKSJ9LGkuc2V0SHJlZj1mdW5jdGlvbihlLHQsbil7ZS5ocmVmPXQsZS50YXJnZXQ9bj8iX2JsYW5rIjoiX3RvcCJ9LGkuaGFzQ2xhc3M9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jbGFzc05hbWUubWF0Y2goYSh0KSl9LGkuYWRkQ2xhc3M9ZnVuY3Rpb24oZSx0KXtpLmhhc0NsYXNzKGUsdCl8fChlLmNsYXNzTmFtZSs9IiAiK3QpfSxpLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jbGFzc05hbWUuc3BsaXQoIiAiKSxpPW4uaW5kZXhPZih0KTstMSE9PWkmJihuLnNwbGljZShpLDEpLGUuY2xhc3NOYW1lPW4uam9pbigiICIpKX0saS5zaG93PWZ1bmN0aW9uKGUpe2kucmVtb3ZlQ2xhc3MoZSwiaGlkZSIpfSxpLmhpZGU9ZnVuY3Rpb24oZSl7aS5hZGRDbGFzcyhlLCJoaWRlIil9LGkudHJpbT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9eXHMrfFxzKyQvLCIiKX0saS5pc1NoYXphbVByZXZpZXc9ZnVuY3Rpb24oKXtyZXR1cm4hMX0saS5mYWRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixhKXtlLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiO3ZhciByPW5ldyBEYXRlO2E9YXx8MzAwO3ZhciBvPWZ1bmN0aW9uKCl7dmFyIGM9TWF0aC5taW4oKG5ldyBEYXRlLXIpL2EsMSk7dHx8KGM9MS1jKSxpLnNldE9wYWNpdHkoZSxjKSx0JiYxPmN8fCF0JiZjPjA/c2V0VGltZW91dChvLDI1KTooZS5zdHlsZS5maWx0ZXI9IiIsImZ1bmN0aW9uIj09dHlwZW9mIG4mJm4oKSl9O28oKX0saS5zZXRPcGFjaXR5PWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zdHlsZTtuLmRpc3BsYXk9ImJsb2NrIixuLm9wYWNpdHk9bi5tb3pPcGFjaXR5PXQsbi5maWx0ZXI9ImFscGhhKG9wYWNpdHk9IisxMDAqdCsiKSJ9LGkuaGV4VG9DaGFyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnRvU3RyaW5nKCksbj0iIixpPTA7aTx0Lmxlbmd0aDtpKz0yKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodC5zdWJzdHIoaSwyKSwxNikpO3JldHVybiBufSxpLnJlcGxhY2VMaW5lQnJlYWtzPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBSZWdFeHAoaS5oZXhUb0NoYXIoIjVjNmUiKSwiZyIpO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lLnJlcGxhY2UodCwiPGJyLz4iKTp2b2lkIDB9LGkuY2FsbEFhbj1mdW5jdGlvbihuLGEscil7dmFyIG89ImRhQWFuQ2FsbGJhY2siO24uSlNPTkNhbGxCYWNrPW87dmFyIGM9MCxzPTIsbD0xNTAwLHU9ITE7InVuZGVmaW5lZCIhPXR5cGVvZiBDbGllbnRNZXRyaWNzJiZDbGllbnRNZXRyaWNzLnN0YXJ0VGltZXIoQ2xpZW50TWV0cmljcy5ldmVudHMuQUFOX1RJTUUpLGVbb109ZnVuY3Rpb24odCl7dT0hMCxyPWVbb109aS5ET19OT1RISU5HLCJ1bmRlZmluZWQiIT10eXBlb2YgQ2xpZW50TWV0cmljcyYmKENsaWVudE1ldHJpY3MuZW5kVGltZXIoQ2xpZW50TWV0cmljcy5ldmVudHMuQUFOX1RJTUUpLENsaWVudE1ldHJpY3MubG9nRXZlbnQoQ2xpZW50TWV0cmljcy5ldmVudHMuTlVNX0FBTl9DQUxMUyxjKSksYSh0KX07dmFyIGQ9ZnVuY3Rpb24oKXtpZighdSYmcz5jKXt2YXIgZT10LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uuc3JjPSJodHRwczovL2Nkbi1kLmFtYXpvbi1hZHN5c3RlbS5jb20vYWFuL3VzPyIraS5nZXRRdWVyeVN0cmluZyhuKSx0LmJvZHkuYXBwZW5kQ2hpbGQoZSksYysrLHNldFRpbWVvdXQoZCxsKX1lbHNlIHV8fCJmdW5jdGlvbiIhPXR5cGVvZiByfHwocigpLCJ1bmRlZmluZWQiIT10eXBlb2YgQ2xpZW50TWV0cmljcyYmKENsaWVudE1ldHJpY3MuYWRkTWV0cmljKENsaWVudE1ldHJpY3MuZXZlbnRzLkZJTkFMX1NUQVRFLCJhYW5GYWlsIiksQ2xpZW50TWV0cmljcy5hZGRNZXRyaWMoQ2xpZW50TWV0cmljcy5ldmVudHMuTlVNX0FBTl9DQUxMUyxjKSxDbGllbnRNZXRyaWNzLmZsdXNoTWV0cmljcygpKSl9O2QoKX07aS5nZXRUcmFja2VyPWZ1bmN0aW9uKHQsbixpKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIFVybFV0aWxzJiYoZS5VcmxVdGlscz17aGFzUmVmVGFnOmZ1bmN0aW9uKGUpe3JldHVybi9bXC8mP11ccypyZWZfPz1bXiYjP1wvOl0qLy50ZXN0KGUpfSxpc0FtYXpvblVyaTpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjpcL1wvLywiIiksbj10LnNwbGl0KC9bXC8/IzpdLykuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwIT1lLmxlbmd0aH0pO3JldHVybiBuWzBdPy9hbWF6b25bLl0oW2EtekEtWl0rJHxbYS16QS1aXSsuW2EtekEtWl0rJCkvLnRlc3QoblswXSk6ITF9LGluamVjdFF1ZXJ5U3RyaW5nUGFyYW06ZnVuY3Rpb24oZSx0LG4pe2lmKCF0fHwhbilyZXR1cm4gZTt2YXIgaT0iPyIrdCsiPSIrbixhPWUuaW5kZXhPZigiIyIpLHI9ZS5pbmRleE9mKCI/Iiksbz1hPj0wLGM9cj49MDtpZihvJiZjJiYoYz1hPnIpLCFjJiYhbylyZXR1cm4gZStpO3ZhciBzPWM/Ij8iOiIjIixsPWUuc3BsaXQocyksdT1sLnNsaWNlKDEpLmpvaW4ocyk7YyYmKHM9IiYiKTt2YXIgZD1sWzBdK2k7cmV0dXJuIHUmJihkKz1zK3UpLGR9LGluamVjdEFhcFJlZlRhZzpmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIElTXzNQJiZJU18zUCxuPSIiO3JldHVybiBlJiZuJiZ0JiZ0aGlzLmlzQW1hem9uVXJpKGUpJiYhdGhpcy5oYXNSZWZUYWcoZSk/dGhpcy5pbmplY3RRdWVyeVN0cmluZ1BhcmFtKGUsInJlZiIsbik6ZX0sZ2V0Q291cG9uVG9rZW46ZnVuY3Rpb24oKXtyZXR1cm4gYnRvYSgobmV3IERhdGUpLmdldFRpbWUoKSsiO0FNRyIpfSxnZXRDb3Vwb25Ub2tlbk1hY3JvOmZ1bmN0aW9uKCl7cmV0dXJuIlZQQ19DU19UT0tFTl9NQUNSTyJ9fSksbj1VcmxVdGlscy5pbmplY3RBYXBSZWZUYWcobil9LGkuYXR0YWNoQXN5bmNBYXhUcmFja2VyPWZ1bmN0aW9uKGUpe30saS5zZXRUcmFja2VySHJlZj1mdW5jdGlvbihlLHQsbixhLHIpe2kuc2V0SHJlZihlLGkuZ2V0VHJhY2tlcih0LG4sciksYSl9LGkuYWRkQXN5bmNUcmFja2luZz1mdW5jdGlvbihlLHQsbil7InN0cmluZyIhPXR5cGVvZiB0JiYodD1yLmdldDNwQ2xpY2tUcmFja2VyKCkpLERBRFMuQW5hbHl0aWNzLnRyYWNrM1BDbGlja0FzeW5jKGUsdCxuKX0saS5nZXRBc2lucz1mdW5jdGlvbigpe3JldHVybltbXV1bMF18fFtdfSxpLmdldE1lZGlhVXJsPWZ1bmN0aW9uKGUpe3ZhciB0PSJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvIjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJih0Kz1lKSx0fTt2YXIgYz0iJCIscz0iLiIsbD0iLCI7aS5mb3JtYXRDdXJyZW5jeT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9KDEqZSkudG9GaXhlZCgyKSxuPWMrdC5yZXBsYWNlKCIuIixzKTtuIT10Oyl0PW4sbj10LnJlcGxhY2UoLyhcZCkoXGR7M31cRCkvLCIkMSIrbCsiJDIiKTtyZXR1cm4gbn0saS50cnVuY2F0ZVRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpLGE9ZS5pbm5lckhUTUwscj1hO2lmKHQub2Zmc2V0SGVpZ2h0Pm4pZm9yKDt0Lm9mZnNldEhlaWdodD5uOyl7dmFyIG89dC5vZmZzZXRIZWlnaHQ7aWYoaT1hLnJlcGxhY2UoL1xzK1xTK1xzKiQvLCIiKSxpLmxlbmd0aD09YS5sZW5ndGgpYnJlYWs7YT1pLGUuaW5uZXJIVE1MPWErIi4uLiIsdC5vZmZzZXRIZWlnaHQ8byYmKHI9ZS5pbm5lckhUTUwpfXJldHVybiBlLmlubmVySFRNTD1yLHQub2Zmc2V0SGVpZ2h0PD1ufSxpLmlzVmFsaWRBc2luPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYvXlx3ezEwfSQvLnRlc3QoZSk/ITA6ITF9LGkuZ2V0QXRjTGluaz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1lKyJncC9wcm9kdWN0LWFkcy9zaGFyZWQvdXRpbGl0eS9hZGQtdG8tY2FydC5odG1sPyIsYT17aWU6IlVURjgifSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPXRbcl0sYz1yPyIuIityOiIiO2FbInRva2VuIitjXT1vLnRva2VuLGFbInRpbWUiK2NdPW8udGltZSxhWyJtZXJjaGFudElkIitjXT1vLm1lcmNoYW50SWQsYVsiYXNpbiIrY109by5hc2luLGFbInByb2dyYW0iK2NdPSJkYWRzIixhWyJhZFByaWNlIitjXT1vLmJ1eWluZ1ByaWNlLnRvRml4ZWQoMil9cmV0dXJuIG4rPWkuZ2V0UXVlcnlTdHJpbmcoYSl9LGkuYmluZEV2ZW50PWZ1bmN0aW9uKG4saSxhKXtpZihuKXt2YXIgcj1mdW5jdGlvbih0KXtpZih0PXR8fGUuZXZlbnQsdC5wcmV2ZW50RGVmYXVsdD10LnByZXZlbnREZWZhdWx0fHxmdW5jdGlvbigpe3QucmV0dXJuVmFsdWU9ITF9LHQudGFyZ2V0PXQudGFyZ2V0fHx0LnNyY0VsZW1lbnQsdC5zdG9wUHJvcGFnYXRpb249dC5zdG9wUHJvcGFnYXRpb258fGZ1bmN0aW9uKCl7dC5jYW5jZWxCdWJibGU9ITB9LCF0LndoaWNoKXt2YXIgbj10LmJ1dHRvbjsxIT09biYmKG49Mj09PW4/Mzo0PT09bj8yOjEpLHQud2hpY2g9bn1yZXR1cm4gdC54fHwodC54PXQuY2xpZW50WCksdC55fHwodC55PXQuY2xpZW50WSksYSh0KX07aWYobj09PWUmJiJjb21wbGV0ZSI9PXQucmVhZHlTdGF0ZSlyZXR1cm4gYSgpO24uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoaSxyLCEwKTooaT0ib24iK2ksbi5hdHRhY2hFdmVudD9uLmF0dGFjaEV2ZW50KGkscik6bltpXT1yKX19LGkua2V5cz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3Ioa2V5IGluIGUpa2V5Lmhhc093blByb3BlcnR5LmNhbGwoZSxrZXkpJiZ0LnB1c2goa2V5KTtyZXR1cm4gdH0saS5nZXRUTEQ9ZnVuY3Rpb24oZSl7dmFyIHQ9e3VzOiJjb20iLHVrOiJjby51ayIsZnI6ImZyIixkZToiZGUiLGl0OiJpdCJ9O3JldHVybiB0W2UudG9Mb3dlckNhc2UoKV19LGkuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dPT09dClyZXR1cm4hMDtyZXR1cm4hMX07dmFyIHU9L2FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2kuaXNBbmRyb2lkRGV2aWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHV9O3ZhciBkPS9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpLmlzSW9zRGV2aWNlPWZ1bmN0aW9uKCl7cmV0dXJuIGR9LGkubW9iaWxlPWZ1bmN0aW9uKCl7dmFyIGU7ZT0idW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudD9NU0ZDbGllbnQuZ2V0VXNlckFnZW50SW5mbygpOm5hdmlnYXRvci51c2VyQWdlbnQ7dmFyIG4saSxhLHIsbz0vQW5kcm9pZCg/OiB8XC8pKFsuXGRdKikvaSxjPS9PUyAoW19cZF0qKSAvaSxzPS9cImF2XCI6XCIoWy5cZF0qKVwiL2k7cmV0dXJue2lzQW5kcm9pZE9zT2xkZXJUaGFuOmZ1bmN0aW9uKHQpe3ZhciBpPWYodCwiLiIpO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgbiYmKG49ZS5tYXRjaChvKSxudWxsIT09biYmKG49ZihuWzFdLCIuIikpKSxuP3AobixpKTohMX0saXNJb3NPbGRlclRoYW46ZnVuY3Rpb24odCl7dmFyIG49Zih0LCIuIik7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBpJiYoaT1lLm1hdGNoKGMpLG51bGwhPT1pJiYoaT1mKGlbMV0sIl8iKSkpLGk/cChpLG4pOiExfSxpc0FwcE9sZGVyVGhhbjpmdW5jdGlvbihlKXt2YXIgbj1mKGUsIi4iKTtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEmJihhPWRlY29kZVVSSUNvbXBvbmVudCh0LmNvb2tpZSkubWF0Y2gocyksbnVsbCE9PWEmJihhPWYoYVsxXSwiLiIpKSksYT9wKGEsbik6ITF9LGdldEtpbmRsZUdlbjpmdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgciYmKHI9L0tpbmRsZSBGaXJlfEtGT1R8S0ZUVHxLRkpXL2kudGVzdChlKT81Oi9LRlNPfEtGVEh8S0ZBUC9pLnRlc3QoZSk/NjovS0ZBUnxLRkFTfEtGU0F8S0ZTVC9pLnRlc3QoZSk/NzovS0ZGT3xLRlRCfEtGTUUvaS50ZXN0KGUpPzg6MCkscn0sb25Nc2hvcDpmdW5jdGlvbigpe3JldHVybiBzLnRlc3QoZGVjb2RlVVJJQ29tcG9uZW50KHQuY29va2llKSl9fX0oKTt2YXIgZj1mdW5jdGlvbihlLHQpe3Q9dHx8Ii4iO2Zvcih2YXIgbj1lLnNwbGl0KHQpLGk9MDtpPG4ubGVuZ3RoO2krKyluW2ldPXBhcnNlSW50KG5baV0sMTApfHwwO3JldHVybiBufSxwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF08dFswXXx8ZVswXT09dFswXSYmZVsxXTx0WzFdfHxlWzBdPT10WzBdJiZlWzFdPT10WzFdJiZlWzJdPHRbMl19O3JldHVybiBpLmlzQ2FzY2FkaW5nSW50ZW50PWZ1bmN0aW9uKGUpe3JldHVybiAwPT1lLmluZGV4T2YoImFtYXpvbm1vYmlsZTovL2ludGVudD9pbnRlbnQ9Iil9LGkuaXNLaW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4vS2luZGxlIEZpcmV8S0ZPVHxLRlRUfEtGSld8S0ZTT3xLRlRIfEtGQVB8S0ZBUnxLRkFTfEtGU0F8S0ZTVHxLRkZPfEtGVEJ8S0ZNRS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LGkuZG9lc1NES1N1cHBvcnRPcGVuSW5FeHRlcm5hbEJyb3dzZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9YW1hem9uLmdldFNES1ZlcnNpb24oKX1jYXRjaCh0KXtyZXR1cm4hMX1pZihvLmlzQW5kcm9pZERldmljZSgpKXt2YXIgbj1mKGUsIi4iKTtyZXR1cm4gblswXT41fHw1PT1uWzBdJiZuWzFdPjV8fDU9PW5bMF0mJjU9PW5bMV0mJm5bMl0+PTEzNX12YXIgaT1lLnNwbGl0KCItIilbMl0sbj1mKGksIi4iKTtyZXR1cm4gblswXT4yfHwyPT1uWzBdJiZuWzFdPjJ8fDI9PW5bMF0mJjI9PW5bMV0mJm5bMl0+PTEwfSxpfShlLHQpLGM9ZnVuY3Rpb24oKXt2YXIgdD17fTt0LmdldERldGFpbFBhZ2VVcmw9ZnVuY3Rpb24oZSl7dmFyIHQ9Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vZ3AvYXcvZC8iK2U7cmV0dXJuIHIuaXNNYXNoQXZhaWxhYmxlKCk/dD0iP2FwcC1hY3Rpb249ZGV0YWlsJmFzaW49IitlOnIuaXNNU2hvcE5hdGl2ZUFwcCgpJiYodD0iYW1hem9ubW9iaWxlOi8vc2hvcHBpbmc/Y2xpY2tzdHJlYW0tdGFnPWFkcyZhcHAtYWN0aW9uPWRldGFpbCZhc2luPSIrZSksci5pc0FtYW4oKSYmKHQ9bihhKCksdCkpLHR9LHQuZ2V0TW9iaWxlTmF2aWdhdGlvbj1mdW5jdGlvbigpe3JldHVybiByLmlzTWFzaEF2YWlsYWJsZSgpP2Z1bmN0aW9uKGUpe1Aud2hlbigibWFzaCIpLmV4ZWN1dGUoZnVuY3Rpb24odCl7dC5uYXZpZ2F0ZSh7dXJsOmV9KX0pfTpyLmlzTXJhaWRBdmFpbGFibGUoKSYmIXIuaXNNU2hvcE5hdGl2ZUFwcCgpP2Z1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uJiZvLmRvZXNTREtTdXBwb3J0T3BlbkluRXh0ZXJuYWxCcm93c2VyKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhbWF6b24ub3BlbkluRXh0ZXJuYWxCcm93c2VyP2FtYXpvbi5vcGVuSW5FeHRlcm5hbEJyb3dzZXIoZSk6bXJhaWQub3BlbihlKX06ZnVuY3Rpb24odCl7ZS5vcGVuKHQsIl90b3AiKX19O3QuZ2V0Q291cG9uUGFnZVVybD1mdW5jdGlvbih0LGMpe3ZhciBzPWkoKSxsPSJodHRwczovL3d3dy5hbWF6b24uY29tL2dwL2F3L2NvdXBvbi9jLyIrdCsiLyIrcztyZXR1cm4gYyYmKGwrPSI/IitvLmdldFF1ZXJ5U3RyaW5nKHtyZWRpcmVjdEFTSU46Y30pKSwidW5kZWZpbmVkIj09dHlwZW9mIFVybFV0aWxzJiYoZS5VcmxVdGlscz17aGFzUmVmVGFnOmZ1bmN0aW9uKGUpe3JldHVybi9bXC8mP11ccypyZWZfPz1bXiYjP1wvOl0qLy50ZXN0KGUpfSxpc0FtYXpvblVyaTpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjpcL1wvLywiIiksbj10LnNwbGl0KC9bXC8/IzpdLykuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwIT1lLmxlbmd0aH0pO3JldHVybiBuWzBdPy9hbWF6b25bLl0oW2EtekEtWl0rJHxbYS16QS1aXSsuW2EtekEtWl0rJCkvLnRlc3QoblswXSk6ITF9LGluamVjdFF1ZXJ5U3RyaW5nUGFyYW06ZnVuY3Rpb24oZSx0LG4pe2lmKCF0fHwhbilyZXR1cm4gZTt2YXIgaT0iPyIrdCsiPSIrbixhPWUuaW5kZXhPZigiIyIpLHI9ZS5pbmRleE9mKCI/Iiksbz1hPj0wLGM9cj49MDtpZihvJiZjJiYoYz1hPnIpLCFjJiYhbylyZXR1cm4gZStpO3ZhciBzPWM/Ij8iOiIjIixsPWUuc3BsaXQocyksdT1sLnNsaWNlKDEpLmpvaW4ocyk7YyYmKHM9IiYiKTt2YXIgZD1sWzBdK2k7cmV0dXJuIHUmJihkKz1zK3UpLGR9LGluamVjdEFhcFJlZlRhZzpmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIElTXzNQJiZJU18zUCxuPSIiO3JldHVybiBlJiZuJiZ0JiZ0aGlzLmlzQW1hem9uVXJpKGUpJiYhdGhpcy5oYXNSZWZUYWcoZSk/dGhpcy5pbmplY3RRdWVyeVN0cmluZ1BhcmFtKGUsInJlZiIsbik6ZX0sZ2V0Q291cG9uVG9rZW46ZnVuY3Rpb24oKXtyZXR1cm4gYnRvYSgobmV3IERhdGUpLmdldFRpbWUoKSsiO0FNRyIpfSxnZXRDb3Vwb25Ub2tlbk1hY3JvOmZ1bmN0aW9uKCl7cmV0dXJuIlZQQ19DU19UT0tFTl9NQUNSTyJ9fSksImZ1bmN0aW9uIj09dHlwZW9mIGUuYnRvYSYmKGw9VXJsVXRpbHMuaW5qZWN0UXVlcnlTdHJpbmdQYXJhbShsLCJ2cGNfY3MiLFVybFV0aWxzLmdldENvdXBvblRva2VuTWFjcm8oKSkpLHIuaXNBbWFuKCkmJihsPW4oYSgpLGwpKSxyLmlzTVNob3BOYXRpdmVBcHAoKT8iYW1hem9ubW9iaWxlOi8vc2hvcHBpbmc/Y2xpY2tzdHJlYW0tdGFnPWFkcyZhcHAtYWN0aW9uPXdlYnZpZXcmdXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwpOmx9O3ZhciBuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZigiPyIpPi0xP3QrIiYiK2U6dCsiPyIrZX0saT1mdW5jdGlvbigpe3ZhciBlPSJyZWY9YW1nX21vYmlsZV8iLHQ9Il8yNTYweDI1NjAvIjtyZXR1cm4gci5pc01hc2hBdmFpbGFibGUoKT9lKyJtb2JpbGUtd2ViIit0OmUrKHIuaXNNU2hvcE5hdGl2ZUFwcCgpPyJzaG9wcGluZyI6IkFNQU4iKSt0fSxhPWZ1bmN0aW9uKCl7cmV0dXJuImFheGl0az11NmRRYTdNWmVBRmZ6d1c1Lmpodml3In07cmV0dXJuIHQuYWRkQWF4SW1wcmVzc2lvblRva2VuVG9Vcmw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pbmRleE9mKCI/Iiksbj1lLmluZGV4T2YoIiMiKSxpPS0xPT09dD8iPyI6IiYiLHI9LTE9PT1uP2UubGVuZ3RoOm47cmV0dXJuIGUuc3Vic3RyaW5nKDAscikraSthKCkrZS5zdWJzdHJpbmcocil9LHQuaXNJbnRlcm5hbFVybD1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD0vXigoPzpodHRwcz86KVwvXC8pPyhbXHdcLVwuXSsoPzo6WzAtOV0rKT8pXC8/KC4qKSQvLG49ZS5tYXRjaCh0KSxpPW5bMl07cmV0dXJuL1wuYW1hem9uXC5jb20oOi4qKT8kLy50ZXN0KGkpfXJldHVybiExfSx0fSgpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt9ZnVuY3Rpb24gYShuLGksYSl7dmFyIHI9ZnVuY3Rpb24odCl7aWYodD10fHxlLmV2ZW50LHQucHJldmVudERlZmF1bHQ9dC5wcmV2ZW50RGVmYXVsdHx8ZnVuY3Rpb24oKXt0LnJldHVyblZhbHVlPSExfSx0LnRhcmdldD10LnRhcmdldHx8dC5zcmNFbGVtZW50LHQuc3RvcFByb3BhZ2F0aW9uPXQuc3RvcFByb3BhZ2F0aW9ufHxmdW5jdGlvbigpe3QuY2FuY2VsQnViYmxlPSEwfSwhdC53aGljaCl7dmFyIG49dC5idXR0b247MSE9PW4mJihuPTI9PT1uPzM6ND09PW4/MjoxKSx0LndoaWNoPW59cmV0dXJuIHQueD10Lnh8fHQuY2xpZW50WCx0Lnk9dC55fHx0LmNsaWVudFksYSh0KX07cmV0dXJuIG49PT1lJiYiY29tcGxldGUiPT10LnJlYWR5U3RhdGU/YSgpOnZvaWQobi5hZGRFdmVudExpc3RlbmVyP24uYWRkRXZlbnRMaXN0ZW5lcihpLHIsITApOihpPSJvbiIraSxuLmF0dGFjaEV2ZW50P24uYXR0YWNoRXZlbnQoaSxyKTpuW2ldPXIpKX1mdW5jdGlvbiByKHQscixvKXtmdW5jdGlvbiBzKGUpe3ZhciB0PWUubm9kZU5hbWV8fGUudGFnTmFtZTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5ocmVmJiYvXmEkL2kudGVzdCh0KX1mdW5jdGlvbiBsKGUpe3JldHVybiAxPT09ZS53aGljaH1mdW5jdGlvbiB1KGUpe2lmKHMoZS50YXJnZXQpJiZsKGUpKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIHQ9bmV3IEltYWdlO3Quc3JjPXJ9fWZ1bmN0aW9uIGQoZSl7dmFyIGk9dDtpZihsaW5rVGFyZ2V0PWkudGFyZ2V0LGwoZSkmJnMoaSkmJi9fc2VsZnxfdG9wL2dpLnRlc3QobGlua1RhcmdldCkpe2UucHJldmVudERlZmF1bHQoKTt2YXIgYT1pLmhyZWY7ImZ1bmN0aW9uIj09dHlwZW9mIGMubWFzaE5hdmlnYXRpb25PdmVycmlkZSYmKGE9Yy5tYXNoTmF2aWdhdGlvbk92ZXJyaWRlLHA9ZnVuY3Rpb24oZSl7ZSgpfSksc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlO3RyeXtlPW4ubG9jYXRpb24scChhLGkudGFyZ2V0KX1jYXRjaCh0KXtwKGEsIl9ibGFuayIpfX0sZil9fWlmKCF0fHwhcilyZXR1cm4gaSgiRXJyb3I6IEVpdGhlciBlbGVtZW50IG9yIGNsaWNrVHJhY2tlclVybCBub3QgcHJvdmlkZWQgdG8gdHJhY2szUENsaWNrQXN5bmMgbWV0aG9kIik7bz1vfHx7fTt2YXIgZj1vLmNsaWNrVHJhY2tlclRpbWVvdXR8fDE1MCxwPW8ubmF2aWdhdGV8fGUub3BlbixtPSJ1bmRlZmluZWQiPT10eXBlb2Ygby5kZWxheUNsaWNrfHxvLmRlbGF5Q2xpY2s9PT0hMDthKHQsIm1vdXNlZG93biIsdSksbSYmYSh0LCJjbGljayIsZCl9ZS5BRF9ERUJVRz0hMCxlLkRBRFM9ZS5EQURTfHx7fSxEQURTLkFuYWx5dGljcz17dHJhY2szUENsaWNrQXN5bmM6cn19KCk7dmFyIHM9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiExO3ZhciB0PS0xIT1lLmluZGV4T2YoIi5hbWF6b24uIikmJi0xIT1lLmluZGV4T2YoImlkPW1vYmlsZXNwb3RsaWdodCIpJiYtMSE9ZS5pbmRleE9mKCJjYW1wYWlnbj0iKSxuPS9cYmFtYXpvblwuW2Etel0rKFwuW2Etel0rKT9cL2dwXC9hZGxwXC9tb2JpbGVzcG90bGlnaHQvLnRlc3QoZSk7cmV0dXJuIHR8fG59LGw9ZnVuY3Rpb24oZSxuKXt2YXIgaT1mdW5jdGlvbihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG1yYWlkJiZtcmFpZCYmImZ1bmN0aW9uIj09dHlwZW9mIG1yYWlkLm9wZW4pbXJhaWQub3BlbihlKTtlbHNle3ZhciBuPXQuY3JlYXRlRWxlbWVudCgiYSIpO24uaHJlZj1lLG4udGFyZ2V0PSJfdG9wIixuLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBpPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGE9aVtpLmxlbmd0aC0xXS5wYXJlbnROb2RlO2EuYXBwZW5kQ2hpbGQobik7dmFyIHI9dC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIpO3IuaW5pdEV2ZW50KCJjbGljayIsITAsITApLG4uZGlzcGF0Y2hFdmVudChyKX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uKWlmKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQW5kcm9pZCIpPi0xfHxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoImFuZHJvaWQiKT4tMSkidW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbi5vcGVuSW5FeHRlcm5hbEJyb3dzZXI/YW1hem9uLm9wZW5JbkV4dGVybmFsQnJvd3NlcihlKTppKGUpO2Vsc2UgdHJ5e3ZhciBhPWFtYXpvbi5nZXRTREtWZXJzaW9uKCkscj1hLnNwbGl0KCItIilbMl0sbz1yLnNwbGl0KCIuIik7KG9bMF0+Mnx8Mj09b1swXSYmb1sxXT4yfHwyPT1vWzBdJiYyPT1vWzFdJiZvWzJdPj0xMCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uLm9wZW5JbkV4dGVybmFsQnJvd3Nlcj9hbWF6b24ub3BlbkluRXh0ZXJuYWxCcm93c2VyKGUpOmkoZSl9Y2F0Y2goYyl7aShlKX1lbHNle2lmKG4pcmV0dXJuIGkobik7aShlKX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgTVNGQ2xpZW50KXt2YXIgdT1NU0ZDbGllbnQuZ2V0UGxhY2VtZW50SW5mbygpLGQ9dS5zbG90TmFtZSxmPXUucGFnZVR5cGUscD11LnN1YlBhZ2VUeXBlLG09bXx8e307bS5jcmVhdGl2ZUlkPSIzMjk4NzI2NTYwMjAxIixtLmFkSWQ9IjMyMjM4NjU4OTAwMDEiLG0uaW1hZ2VVcmw9IiIsbS5hY3Rpb25UeXBlPSIiLG0uYWN0aW9uSW5mbz0iIixtLnBhZ2VUeXBlPWYsbS5zdWJQYWdlVHlwZT1wLG0uc2xvdE5hbWU9ZCxNU0ZDbGllbnQuc2VuZEFkSW5mbyhtKX12YXIgZz1vLmdldEVsZW1lbnRCeUlkKCJ2cGMtYWFwSW5mbyIpLHY9by5nZXRFbGVtZW50QnlJZCgibW9iaWxlLWFkcy1saW5rIiksaD1vLmdldEVsZW1lbnRCeUlkKCJtb2JpbGUtYWRzLWFkIikseT1vLmdldEVsZW1lbnRCeUlkKCJtb2JpbGUtYWQtaW1hZ2UiKSxBPW5ldyBpO0EubG9nSW1wcmVzc2lvbigpLEEuc3RhcnRUaW1lcihpLkxPR19FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpLGkuYWRkTGlzdGVuZXIoeSwibG9hZCIsZnVuY3Rpb24oKXtBLmVuZFRpbWVyKGkuTE9HX0VWRU5UX05BTUVTLklNQUdFX0xPQURfTEFURU5DWSksQS5lbmRUaW1lcihpLkxPR19FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpfSksbmF2aWdhdGlvblVybD0iaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9iP25vZGU9MjIzODE5MjAxMSZyZWY9aG91c2VhZHMwMS0yMCIsbmF2aWdhdGlvblVybD1uYXZpZ2F0aW9uVXJsLnJlcGxhY2UoL15odHRwOlwvXC93d3cuYW1hem9uLi9pLCJodHRwczovL3d3dy5hbWF6b24uIiksdi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGwobmF2aWdhdGlvblVybCksdC50cmFja0NsaWNrKCksXygpLCExfTt2YXIgVD0ic2hhemFtL2djLWJkYXktaG91c2UtMjU2MHgyNTYwLVl4UXJ2Ll9WNTEyMzUxOTA5Xy5qcGciO2tub3duVG9CZU9uVGhpcmRQYXJ0eT0hMTt2YXIgST1mdW5jdGlvbihpKXt2YXIgYT0vXigoPzpodHRwcz86KVwvXC8pPyhbXHdcLVwuXSsoPzo6WzAtOV0rKT8pXC8/KC4qKSQvLHI9ITE7dHJ5e3ZhciBsPWkubWF0Y2goYSksdT1sWzJdO3I9L1wuYW1hem9uXC5jb20oOi4qKT8kLy50ZXN0KHUpfWNhdGNoKGQpe31yPyhzKGkpP3YuaHJlZj1pKyImYWRJZD0zMjIzODY1ODkwMDAxJmNyZWF0aXZlSWQ9MzI5ODcyNjU2MDIwMSZleC1hYXhpdGs9dTZkUWE3TVplQUZmendXNS5qaHZpdyI6di5ocmVmPWksdi5vbmNsaWNrPWZ1bmN0aW9uKGUpe2lmKHQudHJhY2tDbGljaygpLF8oKSwidW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50Lm1hc2guaXNBVUlBdmFpbGFibGUoKSl7dmFyIG49TVNGQ2xpZW50LmdldFBsYWNlbWVudEluZm8oKS5zdWJQYWdlVHlwZTtpZigvLiptc2hvcC4qfGlQYWR8S2luZGxlLip8QW5kcm9pZHxkZWFscy1BbmRyb2lkfGRlYWxzLWlvcy9pLnRlc3QobikmJi9wcmltZW5vdy9pLnRlc3QodSkpdHJ5e01TRkNsaWVudC5tYXNoLm9wZW5JbkV4dGVybmFsQnJvd3Nlci5leGVjdXRlKHt1cmw6aX0pLGUucHJldmVudERlZmF1bHQoKX1jYXRjaChhKXt9fX0sdi50YXJnZXQ9Il90b3AiKToodi5ocmVmPSJqYXZhc2NyaXB0OjsiLHYub25jbGljaz1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgTVNGQ2xpZW50KWlmKE1TRkNsaWVudC5tYXNoLmlzQVVJQXZhaWxhYmxlKCkpe3ZhciBhPU1TRkNsaWVudC5nZXRQbGFjZW1lbnRJbmZvKCkuc3ViUGFnZVR5cGU7Ly4qbXNob3AuKnxpUGFkfEtpbmRsZS4qfEFuZHJvaWR8ZGVhbHMtQW5kcm9pZHxkZWFscy1pb3MvaS50ZXN0KGEpP28ubW9iaWxlLmlzSW9zT2xkZXJUaGFuKCI5LjAuMCIpP01TRkNsaWVudC5tYXNoLnNob3dBZHNCcm93c2VyLmV4ZWN1dGUoe3RhcmdldFVSTDppfSk6TVNGQ2xpZW50Lm1hc2gub3BlbkluRXh0ZXJuYWxCcm93c2VyLmV4ZWN1dGUoe3VybDppfSk6bi5sb2NhdGlvbj1pfWVsc2UgaWYoTVNGQ2xpZW50LmlzT25BbWF6b24oKSluLmxvY2F0aW9uPWk7ZWxzZXt2YXIgcj1lO3RyeXtlLnRvcCYmKHI9ZS50b3ApfWNhdGNoKHMpe31yLmxvY2F0aW9uPWl9ZWxzZXt0cnl7ZS5QPWUuUHx8bi5QfWNhdGNoKGwpe31pZigidW5kZWZpbmVkIiE9dHlwZW9mIGUuUClvLm1vYmlsZS5vbk1zaG9wKCk/by5tb2JpbGUuaXNJb3NPbGRlclRoYW4oIjkuMC4wIik/UC53aGVuKCJtYXNoIikuZXhlY3V0ZShmdW5jdGlvbihlKXtlLnNob3dBZHNCcm93c2VyKHt0YXJnZXRVUkw6aSxmYWlsQ2FsbGJhY2s6ZnVuY3Rpb24oKXtlLm9wZW5JbkV4dGVybmFsQnJvd3Nlcih7dXJsOml9KX19KX0pOlAud2hlbigibWFzaCIpLmV4ZWN1dGUoZnVuY3Rpb24oZSl7ZS5vcGVuSW5FeHRlcm5hbEJyb3dzZXIoe3VybDppfSl9KTpuLndpbmRvdy5sb2NhdGlvbj1pO2Vsc2UgaWYoZS5pc05hdGl2ZVJlYWN0UGxhY2VtZW50KWUubG9jYXRpb249aTtlbHNlIGlmKGMuaXNJbnRlcm5hbFVybChlLmxvY2F0aW9uLmhyZWYpKWUubG9jYXRpb249Ii8/YXBwLWFjdGlvbj1leHRlcm5hbCZ1cmw9IitlbmNvZGVVUklDb21wb25lbnQoaSk7ZWxzZXt2YXIgcj1lO3RyeXtlLnRvcCYmKHI9ZS50b3ApfWNhdGNoKHMpe31yLmxvY2F0aW9uPWl9fXJldHVybiB0LnRyYWNrQ2xpY2soKSxfKCksITF9KX07aWYocyhuYXZpZ2F0aW9uVXJsKSYmKG5hdmlnYXRpb25VcmwrPSImYWRJZD0zMjIzODY1ODkwMDAxJmNyZWF0aXZlSWQ9MzI5ODcyNjU2MDIwMSZleC1hYXhpdGs9dTZkUWE3TVplQUZmendXNS5qaHZpdyIsKG8ubW9iaWxlLmlzQW5kcm9pZE9zT2xkZXJUaGFuKCI0LjMuMCIpfHxvLm1vYmlsZS5pc0lvc09sZGVyVGhhbigiNy4wLjAiKXx8by5tb2JpbGUuZ2V0S2luZGxlR2VuKCkmJm8ubW9iaWxlLmdldEtpbmRsZUdlbigpPDcpJiYobmF2aWdhdGlvblVybD1uYXZpZ2F0aW9uVXJsLFQ9VCkpLEkobmF2aWdhdGlvblVybCksQS5zdGFydFRpbWVyKGkuTE9HX0VWRU5UX05BTUVTLklNQUdFX0xPQURfTEFURU5DWSksInVuZGVmaW5lZCIhPXR5cGVvZiBNU0ZDbGllbnQmJi8uKmRldGFpbC4qL2kudGVzdChNU0ZDbGllbnQuZ2V0UGxhY2VtZW50SW5mbygpLnBhZ2VUeXBlKSYmLy4qZW5jb3JlLiovaS50ZXN0KE1TRkNsaWVudC5nZXRQbGFjZW1lbnRJbmZvKCkuc2xvdE5hbWUpJiYoVD1ULnJlcGxhY2UoIi5qcGciLC8uKl9cLmpwZy4qLy50ZXN0KFQpPyJTTDEyODBfLmpwZyI6Il9TTDEyODBfLmpwZyIpKSxUKXt2YXIgRT0iaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9HLzAxLyIrVDt5LnNyYz1FLHYuc3R5bGUuZGlzcGxheT0iYmxvY2sifWcmJmtub3duVG9CZU9uVGhpcmRQYXJ0eSYmby5zaG93KGcpO3ZhciBDO2tub3duVG9CZU9uVGhpcmRQYXJ0eSYmKG8uYWRkQ2xhc3MoaCwiYWFwIiksdi50YXJnZXQ9Il9ibGFuayIpLEMmJm8uc2V0SHJlZihnLCJodHRwczovL3d3dy5hbWF6b24uY29tL2FkcHJlZnMiLCEwKTt2YXIgXz1mdW5jdGlvbigpe30sUz1mdW5jdGlvbihlLG4pe3ZhciBpPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYoIWkpe3ZhciBhPXQuY3JlYXRlRWxlbWVudCgiaW1nIik7YS5zZXRBdHRyaWJ1dGUoInNyYyIsbiksYS5zZXRBdHRyaWJ1dGUoImlkIixlKSxhLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQuYm9keS5hcHBlbmRDaGlsZChhKX19O3QudHJhY2tDbGljaz1mdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lJiZudWxsPT10P1MoImNsaWNrLWltcHJlc3Npb24iLCdodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FvNVoxbWh3ZWs2U3JxUXZKc1g3ckhZQUFBRmhwSmtySlFFQUFBR1FBZFUzNE9JL2h0dHBzOi8vaW1hZ2VzLW5hLnNzbC1pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9tb2JpbGUvYmxhbmtfcGl4ZWwuX1YxMzc4NzUwNzZfLmdpZicpOlMoZSx0KSwhMX07dmFyIE89IkFOWSIsdz0icy5hbWF6b24tYWRzeXN0ZW0uY29tIjsoIkFOWSI9PT1PP2xvY2F0aW9uLnByb3RvY29sOk8pKyIvLyIrdysiL2NsaWNrIn0od2luZG93LGRvY3VtZW50LHBhcmVudCl9LDApOzwvc2NyaXB0PjxhIGlkPSJ2cGMtbG9nbyI+PC9hPjxhIGlkPSJ2cGMtYWFwSW5mbyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJoaWRlIGFjIiBocmVmPSJodHRwczovL3d3dy5hbWF6b24uY29tL2FkcHJlZnMvcmVmPWNzX2FhcF8zMjk4NzI2NTYwMjAxIj48L2E+PHNjcmlwdD5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZXZhbChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaWZyYW1lX3NjcmlwdCIpLmlubmVySFRNTCl9LDApOzwvc2NyaXB0PjwvYm9keT4KDQoNCg0KICANCjwhLS0gY3JlYXRpdmVNb2REYXRlID0gMTUwOTY3MDY0ODAwMCAtLT48L2Rpdj4=&quot;,&quot;serverSideFetchAd&quot;: &quot;true&quot;,&quot;enableAdBlockerDetector&quot;: false,&quot;disableResizeFunc&quot;: true,&quot;fallbackStaticAdImgUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;: &quot;&quot;,&quot;advertisementTextOnTop&quot;: true,&quot;viewabilityStandards&quot;: [{&quot;p&quot;: 0, &quot;t&quot;: 0, &quot;def&quot;: &quot;amzn&quot;}, {&quot;p&quot;: 50, &quot;t&quot;: 1, &quot;def&quot;: &quot;iab&quot;}, {&quot;p&quot;: 100, &quot;t&quot;: 0, &quot;def&quot;: &quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;: &quot;&quot;}" title="Advertisement" data-arid="e4c976ccc7394296b583ace416a621b2"><div id="ape_detail_encore_detail-mWeb_placement" aria-hidden="true"></div></div><script>(function(){function a(d,e){if(window.addEventListener){window.addEventListener(d,e,false);}else{if(window.attachEvent){window.attachEvent("on"+d,e);}}}function c(d,e){if(window.removeEventListener){window.removeEventListener(d,e,false);}else{if(window.detachEvent){window.detachEvent("on"+d,e);}}}var b=function(){(function(){(function(j,n){j.sfLogErrors=j.sfLogErrors||false;var o=o||function(s,r){r=r||new Error(s);if(j.ue&&typeof ue.count=="function"){ue.count("adplacements:safeFrameError",1);}if(!j.sfLogErrors){return;}if(j.ueLogError){j.ueLogError(r,{logLevel:"ERROR",attribution:"APE-safeframe",message:s+" "});}else{if(typeof console!=="undefined"&&console.error){console.error(s,r);}}};function d(){return j.innerHeight||n.documentElement.clientHeight;}function g(){return j.innerWidth||n.documentElement.clientWidth;}function e(t,r,s){if(t>0){return(s>t);}else{return(r>0);}}var f=function(){return(Date.now?Date.now():new Date().getTime());};throttle=function(s,u,y){var r,w,z;var x=null;var v=0;if(!y){y={};}var t=function(){v=y.leading===false?0:f();x=null;z=s.apply(r,w);if(!x){r=w=null;}};return function(){var B=f();if(!v&&y.leading===false){v=B;}var A=u-(B-v);r=this;w=arguments;if(A<=0||A>u){if(x){clearTimeout(x);x=null;}v=B;z=s.apply(r,w);if(!x){r=w=null;}}else{if(!x&&y.trailing!==false){x=setTimeout(t,A);}}return z;};};function l(u,w,v,r){try{var t=n.getElementById(u).getBoundingClientRect();if(e(t.top,t.bottom,d())&&e(t.left,t.right,g())){if(typeof uet=="function"){uet("bb","adplacements:viewablelatency:"+w,{wb:1});if(v){uet("bb","adplacements:viewablelatency:"+v,{wb:1});}}if(typeof uex=="function"&&j.ue&&typeof ue.count=="function"){if(j.apeViewableLatencyTrackers[r].loaded){uex("ld","adplacements:viewablelatency:"+w,{wb:1});if(v){uex("ld","adplacements:viewablelatency:"+v,{wb:1});}ue.count("adplacements:htmlviewed:loaded:"+w,1);if(v){ue.count("adplacements:htmlviewed:loaded:"+v,1);}}ue.count("adplacements:htmlviewed:"+w,1);if(v){ue.count("adplacements:htmlviewed:"+v,1);}}j.apeViewableLatencyTrackers[r].viewed=true;if(j.apeViewableLatencyTrackers[r].tracker){c("scroll",j.apeViewableLatencyTrackers[r].tracker);c("resize",j.apeViewableLatencyTrackers[r].tracker);}}}catch(s){j.apeViewableLatencyTrackers[r].valid=false;}}try{j.apeViewableLatencyTrackers=j.apeViewableLatencyTrackers||{};var q="ape_detail_encore_detail-mWeb_placement";var p="detail_encore_detail-mWeb".replace(/\_/g,":");var h="";var i="e4c976ccc7394296b583ace416a621b2";j.apeViewableLatencyTrackers[i]=j.apeViewableLatencyTrackers[i]||{};j.apeViewableLatencyTrackers[i].valid=true;l(q,p,h,i);if(j.apeViewableLatencyTrackers[i].valid&&!j.apeViewableLatencyTrackers[i].viewed){j.apeViewableLatencyTrackers[i].tracker=throttle(function(){l(q,p,h,i);},20);a("scroll",j.apeViewableLatencyTrackers[i].tracker);a("resize",j.apeViewableLatencyTrackers[i].tracker);}}catch(k){if(j.apeViewableLatencyTrackers&&j.apeViewableLatencyTrackers.e4c976ccc7394296b583ace416a621b2){j.apeViewableLatencyTrackers.e4c976ccc7394296b583ace416a621b2.valid=false;}o("Error initializing viewable latency instrumentation",k);}try{j.encore={};j.encore.adStartTime=(new Date()).getTime();var m=j.DAsf||j.MAsf||null;if(m){m.loadAds();}else{m=n.createElement("script");m.type="text/javascript";m.async=true;m.setAttribute("crossorigin","anonymous");m.charset="utf-8";m.src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame";m.onerror=function(){o("Error loading SafeFrame library");};(n.getElementsByTagName("head")[0]||n.getElementsByTagName("body")[0]).appendChild(m);}}catch(k){o("Error appending MAsf library",k);}}(window,document));})();};b();})();</script>
</div>
<div id="KindleSearchMobile_feature_div" data-feature-name="KindleSearchMobile" data-template-name="KindleSearchMobile" class="a-section a-spacing-none feature">
</div>
</div>
</div>
<div id="WrapperDivToHideFooter" style="display: block;">
<script type="text/javascript">
'use strict';
(function () {
function install() {
var searchIconLink = document.getElementById('search-icon-link');
if (searchIconLink) {
searchIconLink.onclick = function(e) {
var refStartPos = this.href.lastIndexOf('#');
if (refStartPos > 0 && refStartPos < this.href.length - 1) {
var searchBox = document.getElementById(this.href.substring(refStartPos + 1));
if (searchBox) {
searchBox.focus();
e.preventDefault();
}
}
};
}
}
if (document.readyState === "complete") { install(); }
else { window.addEventListener('load', install); }
}());
</script>
<script type="text/javascript">
if(typeof performance!= "undefined" && typeof performance.getEntries != "undefined") {
var dpmaName = "DetailPageMobileWebMetaAsset";
if(dpmaName) {
for(i = 0 ; i < performance.getEntries().length; i++) {
var name = performance.getEntries()[i].name;
var res = name.match(/\.css\?AUIClients\/DetailPageMobileWebMetaAsset/);
var dpEntry = performance.getEntries()[i];
if(res && dpEntry.initiatorType && dpEntry.initiatorType == "link") {
var dpmaDuration = dpEntry.duration;
ue.count("dpma.duration", dpmaDuration);
if(dpmaDuration < 50) {
ue.tag("dpmaCached");
} else {
ue.tag("dpmaNotCached");
}
ue.count("dpma.startTime", dpEntry.startTime);
break;
}
}
}
for(i = 0 ; i < performance.getEntries().length ; i++){
var name = performance.getEntries()[i].name ;
var res = name.match(/\.css\?AUIClients\/AmazonUI/g);
var initiatorType = performance.getEntries()[i].initiatorType;
if(res && initiatorType && initiatorType == "link"){
var duration = performance.getEntries()[i].duration ;
ue.count("aui.duration", duration);
ue.count("aui.startTime", performance.getEntries()[i].startTime);
if(duration < 50){ csmTag = "auiCached";}
else{ csmTag = "auiNotCached";}
if(window.ue && ue.tag) { ue.tag(csmTag);}
break;
}
}
}
</script>
</div>
<!--&&&Portal&Delimiter&&&--><!-- sp:end-feature:host-atf -->
<!-- sp:feature:nav-btf -->
<!-- btf pilu -->
<script type="text/javascript">
var component = 'navCF';
try {
(window.AmazonUIPageJS ? AmazonUIPageJS : P).register(component);
}
catch(e) {
var error = e.message.toLowerCase();
var alreadyRegisteredMsg = component + ' already registered';
if (error.indexOf(alreadyRegisteredMsg.toLowerCase()) === -1) {
throw(e);
}
}
</script>
<!--NAVYAAN-HEADER-DATA-->
<div id="hmenu-container" class="nav-sprite-v3">
<div id="hmenu-canvas-background" class="hmenu-turn-transparent"></div>
<div id="hmenu-canvas" class="hmenu-hide-left">
<a href="https://www.amazon.com/ap/signin?_encoding=UTF8&amp;openid.assoc_handle=anywhere_v2_us&amp;openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.mode=checkid_setup&amp;openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&amp;openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&amp;openid.pape.max_auth_age=0&amp;openid.return_to=https%3A%2F%2Fwww.amazon.com%2FSeven-Languages-Weeks-Programming-Programmers-ebook%2Fdp%2FB00AYQNR46%2Fref%3Dmt_kindle%3F_encoding%3DUTF8%26ref_%3Dnavm_hdr_signin">
<div id="hmenu-customer-profile">
<div id="hmenu-customer-profile-left" class="hmenu-avatar-icon">
<div id="hmenu-customer-avatar-icon" class="nav-sprite"></div>
</div>
<div id="hmenu-customer-profile-right">
<div id="hmenu-customer-name">Hello. Sign in</div>
</div>
</div>
</a>
<div id="hmenu-top-section">
<ul>
<li><a href="/?ref=navm_mobile_menu_home">Home</a></li>
<li><a href="/gp/aw/ya/or/?ref=navm_mobile_menu_orders">Orders</a></li>
<li><a href="/gp/aw/ls/?ref=navm_mobile_menu_lists">Lists</a></li>
</ul>
</div>
<div id="hmenu-content">
<ul class="hmenu hmenu-hide-right" data-menu-id="3">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">AMAZON MUSIC</div></li>
<li>
<a href="/gp/dmusic/promotions/AmazonMusicUnlimited?ref=_mw_dmm_hf">
<div class="hmenu-item">
<div>
Amazon Music Unlimited
</div>
</div>
</a>
</li>
<li>
<a href="/gp/dmusic/promotions/PrimeMusic?ref=mw_dm_pm">
<div class="hmenu-item">
<div>
Prime Music
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=5174&amp;ref=_mw_cd_vinyl">
<div class="hmenu-item">
<div>
CDs &amp; Vinyl
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=163856011&amp;ref=_mw_dmusic">
<div class="hmenu-item">
<div>
Download Store
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="4">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">PRIME VIDEO</div></li>
<li>
<a href="/Amazon-Video/s/browse?node=2858778011&amp;ref=_aiv_mw">
<div class="hmenu-item">
<div>
All Videos
</div>
</div>
</a>
</li>
<li>
<a href="/Prime-Video/s/browse?node=2676882011&amp;ref=_aiv_mw_piv">
<div class="hmenu-item">
<div>
Included with Prime
</div>
</div>
</a>
</li>
<li>
<a href="/s/browse?filterId=OFFER_FILTER=SUBSCRIPTIONS&amp;node=2858778011&amp;ref=_nav_mw_sa_aos">
<div class="hmenu-item">
<div>
Amazon Channels
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=7589478011&amp;ref=_aiv_mw_shop">
<div class="hmenu-item">
<div>
Rent or Buy
</div>
</div>
</a>
</li>
<li>
<a href="/gp/video/watchlist/?ref=_aiv_mw_wlst">
<div class="hmenu-item">
<div>
Your Watchlist
</div>
</div>
</a>
</li>
<li>
<a href="/gp/video/library?ref=_aiv_mw_yvl">
<div class="hmenu-item">
<div>
Your Video Library
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="5">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">AMAZON RESTAURANTS</div></li>
<li>
<a href="https://www.amazon.com/restaurants?ref_=nav_shopall_amzrst_all">
<div class="hmenu-item">
<div>
See All Restaurants
</div>
</div>
</a>
</li>
<li>
<a href="https://www.amazon.com/restaurants/m/popular-restaurants?ref_=nav_shopall_amzrst_popular">
<div class="hmenu-item">
<div>
Popular Restaurants
</div>
</div>
</a>
</li>
<li>
<a href="https://www.amazon.com/restaurants/bp?flt_browse_node=14069585011&amp;ref_=nav_shopall_amzrst_thai">
<div class="hmenu-item">
<div>
Thai
</div>
</div>
</a>
</li>
<li>
<a href="https://www.amazon.com/restaurants/bp?flt_browse_node=14069577011&amp;ref_=nav_shopall_amzrst_indian">
<div class="hmenu-item">
<div>
Indian
</div>
</div>
</a>
</li>
<li>
<a href="https://www.amazon.com/restaurants/bp?flt_browse_node=14069538011&amp;ref_=nav_shopall_amzrst_chinese">
<div class="hmenu-item">
<div>
Chinese
</div>
</div>
</a>
</li>
<li>
<a href="https://www.amazon.com/restaurants/bp?flt_browse_node=14069464011&amp;ref_=nav_shopall_amzrst_american">
<div class="hmenu-item">
<div>
American
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="6">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">BOOKS</div></li>
<li>
<a href="/gp/browse.html?node=283155&amp;ref=_bo_mw">
<div class="hmenu-item">
<div>
Books
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=154606011&amp;ref=_k_kbo_mw">
<div class="hmenu-item">
<div>
Kindle Books
</div>
</div>
</a>
</li>
<li>
<a href="/gp/kindle/ku/sign-up/ui/rw/about?ref=_ods_mw_books_con_ku">
<div class="hmenu-item">
<div>
Kindle Unlimited
</div>
</div>
</a>
</li>
<li>
<a href="/kindle-dbs/fd/prime-pr?ref=_ods_mw_eink_con_pr">
<div class="hmenu-item">
<div>
NEW! Prime Reading
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=465600&amp;ref=_tb_mw">
<div class="hmenu-item">
<div>
Textbooks
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=599858&amp;ref=_magazines_mw">
<div class="hmenu-item">
<div>
Magazines
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2402172011&amp;ref=_ods_mw_ha_con_aud">
<div class="hmenu-item">
<div>
Audible Audiobooks
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="7">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">ECHO &amp; ALEXA</div></li>
<li>
<a href="/gp/aw/d/B06XCM9LJ4?ref=_k_ods_mw_ha_rr">
<div class="hmenu-item">
<div>
All-New Echo
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B075RWFCHB?ref=_k_ods_mw_ha_sr">
<div class="hmenu-item">
<div>
Introducing Echo Plus
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B01DFKC2SO?ref=_k_ods_mw_ha_dt">
<div class="hmenu-item">
<div>
Echo Dot
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B073SQYXTW?ref=_k_ods_mw_ha_rk">
<div class="hmenu-item">
<div>
Introducing Echo Spot
</div>
</div>
</a>
</li>
<li>
<a href="/dp/B01J24C0TI?ref=_k_ods_mw_echo_kt">
<div class="hmenu-item">
<div>
Echo Show
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B0186JAEWK?ref=_k_ods_mw_ha_hx">
<div class="hmenu-item">
<div>
Echo Look
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=9818047011&amp;ref=_ods_ha_echo_cp">
<div class="hmenu-item">
<div>
See all devices with Alexa
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=16067214011&amp;ref=_ods_ha_alexa_ug">
<div class="hmenu-item">
<div>
Learn About Alexa
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B074TTVQYP?ref=_k_ods_mw_ha_bl">
<div class="hmenu-item">
<div>
Alexa Calling with Echo Connect
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=6563140011&amp;ref=_ods_mw_ha_echo_ch">
<div class="hmenu-item">
<div>
Alexa Smart Home
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B01C4UY0JK?ref=_k_ods_mw_emrg_pe">
<div class="hmenu-item">
<div>
Introducing Amazon Cloud Cam
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=13727921011&amp;ref=nav_mobile_shopall_1_k_a2s_all">
<div class="hmenu-item">
<div>
Alexa Skills
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="8">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">FIRE TABLETS</div></li>
<li>
<a href="/gp/aw/d/B01GEW27DA?ref=_k_ods_mw_tab_an">
<div class="hmenu-item">
<div>
Fire 7
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B01J94SWWU?ref=_k_ods_mw_tab_ds">
<div class="hmenu-item">
<div>
Fire HD 8
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B01J6RPGKG?ref=_k_ods_mw_tab_sz">
<div class="hmenu-item">
<div>
All-New Fire HD 10
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B01J90MSDS?ref=_k_ods_mw_tab_afk">
<div class="hmenu-item">
<div>
Fire 7 Kids Edition
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B01J94SBEY?ref=_k_ods_mw_tab_dfk">
<div class="hmenu-item">
<div>
Fire HD 8 Kids Edition
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=370783011&amp;ref=_ods_mw_tab_acc">
<div class="hmenu-item">
<div>
Accessories
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=6669703011&amp;ref=_ods_mw_tab_catp">
<div class="hmenu-item">
<div>
See all Fire tablets
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="9">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">FIRE TV</div></li>
<li>
<a href="/gp/aw/d/B01N32NCPM?ref=_k_ods_mw_smp_ne">
<div class="hmenu-item">
<div>
All-New Fire TV
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B00ZV9RDKK?ref=_k_ods_mw_smp_tk">
<div class="hmenu-item">
<div>
Fire TV Stick
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B07592RZ8M?ref=_k_ods_mw_smp_ccb">
<div class="hmenu-item">
<div>
All-New Fire TV + HD Antenna
</div>
</div>
</a>
</li>
<li>
<a href="/dp/B06XDC9RBJ?ref=_k_ods_smp_ra">
<div class="hmenu-item">
<div>
Fire TV Edition Smart TVs
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=8946438011&amp;ref=_ods_smp_acc">
<div class="hmenu-item">
<div>
Accessories
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=8521791011&amp;ref=_ods_mw_smp_catp">
<div class="hmenu-item">
<div>
See Fire TV Family
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="10">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">KINDLE</div></li>
<li>
<a href="/gp/aw/d/B00ZV9PXP2?ref=_k_ods_mw_eink_bn">
<div class="hmenu-item">
<div>
Kindle
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B00OQVZDJM?ref=_k_ods_mw_eink_mt">
<div class="hmenu-item">
<div>
Kindle Paperwhite
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B00IOY8XWQ?ref=_k_ods_mw_eink_ie">
<div class="hmenu-item">
<div>
Kindle Voyage
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B06XD5YCKX?ref=_k_ods_mw_eink_cc">
<div class="hmenu-item">
<div>
All-New Kindle Oasis
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/d/B01KMSKNGU?ref=_k_ods_mw_eink_keb">
<div class="hmenu-item">
<div>
All-New Kindle for Kids Bundle
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=370783011&amp;ref=_ods_mw_eink_acc">
<div class="hmenu-item">
<div>
Accessories
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=6669702011&amp;ref=_ods_mw_eink_catp">
<div class="hmenu-item">
<div>
See all Kindle E-Readers
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=154606011&amp;ref=_ods_mw_eink_con_books">
<div class="hmenu-item">
<div>
Kindle Books
</div>
</div>
</a>
</li>
<li>
<a href="/gp/kindle/ku/sign-up/ui/rw/about?ref=_ods_mw_eink_con_ku">
<div class="hmenu-item">
<div>
Kindle Unlimited
</div>
</div>
</a>
</li>
<li>
<a href="/kindle-dbs/fd/prime-pr?ref=_ods_mw_eink_con_pr">
<div class="hmenu-item">
<div>
NEW! Prime Reading
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="11">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">CLOTHING, SHOES &amp; JEWELRY</div></li>
<li>
<a href="/gp/browse.html?node=7147440011&amp;ref=_sft_mw_women">
<div class="hmenu-item">
<div>
Women
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=7147441011&amp;ref=_sft_mw_men">
<div class="hmenu-item">
<div>
Men
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=7147442011&amp;ref=_sft_mw_girls">
<div class="hmenu-item">
<div>
Girls
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=7147443011&amp;ref=_sft_mw_boys">
<div class="hmenu-item">
<div>
Boys
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=7147444011&amp;ref=_sft_mw_baby">
<div class="hmenu-item">
<div>
Baby
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=9479199011&amp;ref=_sft_mw_luggage">
<div class="hmenu-item">
<div>
Luggage
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="12">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">ELECTRONICS</div></li>
<li>
<a href="/gp/browse.html?node=172282&amp;ref=_elec_mw_hub">
<div class="hmenu-item">
<div>
Electronics Showcase
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=1266092011&amp;ref=_mw_tv">
<div class="hmenu-item">
<div>
TV &amp; Video
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=667846011&amp;ref=_mw_hat">
<div class="hmenu-item">
<div>
Home Audio &amp; Theater
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=502394&amp;ref=_mw_p">
<div class="hmenu-item">
<div>
Camera, Photo &amp; Video
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2335752011&amp;ref=_mw_wi">
<div class="hmenu-item">
<div>
Cell Phones &amp; Accessories
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=468642&amp;ref=_mw_cvg_ce">
<div class="hmenu-item">
<div>
Video Games
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=1077068&amp;ref=_mw_gps_ce">
<div class="hmenu-item">
<div>
Car Electronics
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="13">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">MOVIES, MUSIC &amp; GAMES</div></li>
<li>
<a href="/gp/browse.html?node=2625373011&amp;ref=_mw_mov">
<div class="hmenu-item">
<div>
Movies &amp; TV
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2901953011&amp;ref=_mw_blu">
<div class="hmenu-item">
<div>
Blu-ray
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=163856011&amp;ref=_mw_dmusic">
<div class="hmenu-item">
<div>
Digital Music
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=5174&amp;ref=_mw_cd_vinyl">
<div class="hmenu-item">
<div>
CDs &amp; Vinyl
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11091801&amp;ref=_mw_mi">
<div class="hmenu-item">
<div>
Musical Instruments
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=5088769011&amp;ref=_mw_entcol">
<div class="hmenu-item">
<div>
Entertainment Collectibles
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=468642&amp;ref=_mw_cvg">
<div class="hmenu-item">
<div>
Video Games
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="14">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">COMPUTERS</div></li>
<li>
<a href="/gp/browse.html?node=541966&amp;ref=_mw_comptab">
<div class="hmenu-item">
<div>
Computers, Tablets, &amp; PC Products
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=1292115011&amp;ref=_mw_monitors">
<div class="hmenu-item">
<div>
Monitors
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=172456&amp;ref=_mw_accessories">
<div class="hmenu-item">
<div>
Accessories
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=172504&amp;ref=_mw_networking">
<div class="hmenu-item">
<div>
Networking
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=1292110011&amp;ref=_mw_data_storage">
<div class="hmenu-item">
<div>
Drives &amp; Storage
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=193870011&amp;ref=_mw_components">
<div class="hmenu-item">
<div>
Components
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=172635&amp;ref=_mw_printers">
<div class="hmenu-item">
<div>
Printers &amp; Ink
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=229534&amp;ref=_mw_sw">
<div class="hmenu-item">
<div>
Software
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=1064954&amp;ref=_mw_op">
<div class="hmenu-item">
<div>
Office &amp; School Supplies
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="15">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">HOME, GARDEN &amp; PETS</div></li>
<li>
<a href="/gp/browse.html?node=284507&amp;ref=_mw_ki">
<div class="hmenu-item">
<div>
Kitchen &amp; Dining
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=901590&amp;ref=_mw_ep">
<div class="hmenu-item">
<div>
Event &amp; Party Supplies
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=1063306&amp;ref=_mw_furn">
<div class="hmenu-item">
<div>
Furniture
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2619525011&amp;ref=_mw_ha">
<div class="hmenu-item">
<div>
Appliances
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=1057792&amp;ref=_mw_bb">
<div class="hmenu-item">
<div>
Bed &amp; Bath
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2972638011&amp;ref=_mw_lp">
<div class="hmenu-item">
<div>
Garden &amp; Outdoor
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=6685269011&amp;ref=_mw_fine_art">
<div class="hmenu-item">
<div>
Fine Art
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2619533011&amp;ref=_mw_ps">
<div class="hmenu-item">
<div>
Pet Supplies
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=328182011&amp;ref=_mw_hi">
<div class="hmenu-item">
<div>
Power &amp; Hand Tools
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=228013&amp;ref=_mw_hi2">
<div class="hmenu-item">
<div>
Home Improvement
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3754161&amp;ref=_mw_kbf">
<div class="hmenu-item">
<div>
Kitchen &amp; Bath Fixtures
</div>
</div>
</a>
</li>
<li>
<a href="/wedding/home?ref=_mw_weddingreg">
<div class="hmenu-item">
<div>
Wedding Registry
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="16">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">HANDMADE</div></li>
<li>
<a href="/gp/browse.html?node=11260432011&amp;ref=_HM_Home">
<div class="hmenu-item">
<div>
All Handmade
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11403480011&amp;ref=_HM_Jewelry">
<div class="hmenu-item">
<div>
Jewelry
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11403478011&amp;ref=_HM_kitchen">
<div class="hmenu-item">
<div>
Home &amp; Kitchen
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=16283289011&amp;ref=_HM_wedding">
<div class="hmenu-item">
<div>
Wedding
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11403468011&amp;ref=_HM_accessories">
<div class="hmenu-item">
<div>
Handbags &amp; Accessories
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11403472011&amp;ref=_HM_beauty">
<div class="hmenu-item">
<div>
Beauty &amp; Grooming
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11435470011&amp;ref=_HM_stationery">
<div class="hmenu-item">
<div>
Stationery &amp; Party Supplies
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11403495011&amp;ref=_HM_petsupplies">
<div class="hmenu-item">
<div>
Toys &amp; Games
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11403488011&amp;ref=_HM_petsupplies">
<div class="hmenu-item">
<div>
Pet Supplies
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="17">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">BEAUTY, HEALTH &amp; PERSONAL CARE</div></li>
<li>
<a href="/gp/browse.html?node=3760911&amp;ref=_mw_bty">
<div class="hmenu-item">
<div>
All Beauty
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=7175545011&amp;ref=_mw_luxury_bty">
<div class="hmenu-item">
<div>
Luxury Beauty
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=6682399011&amp;ref=_mw_mg">
<div class="hmenu-item">
<div>
Mens Grooming
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3777891&amp;ref=_mw_pc_sd">
<div class="hmenu-item">
<div>
Personal Care
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3760901&amp;ref=_mw_hpc">
<div class="hmenu-item">
<div>
Health, Household &amp; Baby Care
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3764441&amp;ref=_mw_vit_sd">
<div class="hmenu-item">
<div>
Vitamins &amp; Dietary Supplements
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="18">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=16310101&amp;ref=_mw_gro">
<div class="hmenu-item">
<div>
Grocery &amp; Gourmet Food
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=10529351011&amp;ref=_mw_gro_sd">
<div class="hmenu-item">
<div>
Specialty Diets
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=15342811&amp;ref=_mw_bty">
<div class="hmenu-item">
<div>
Household Supplies
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=7301146011&amp;ref=_mw_pantry_bty">
<div class="hmenu-item">
<div>
Prime Pantry
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/coupons/most-popular?ref=_mw_coupons">
<div class="hmenu-item">
<div>
Coupons
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="19">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">TOYS, KIDS &amp; BABY</div></li>
<li>
<a href="/gp/browse.html?node=165793011&amp;ref=_mw_tg">
<div class="hmenu-item">
<div>
Toys &amp; Games
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=165796011&amp;ref=_mw_ba">
<div class="hmenu-item">
<div>
Baby
</div>
</div>
</a>
</li>
<li>
<a href="/gp/family/signup?ref=_mw_family">
<div class="hmenu-item">
<div>
Amazon Family
</div>
</div>
</a>
</li>
<li>
<a href="/gp/baby/homepage?ref=_mw_babyreg">
<div class="hmenu-item">
<div>
Baby Registry
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=471306&amp;ref=_mw_cvg">
<div class="hmenu-item">
<div>
Video Games for Kids
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="20">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3407731&amp;ref=_mw_sa_sp_exfit">
<div class="hmenu-item">
<div>
Exercise &amp; Fitness
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=706813011&amp;ref=_mw_hntfsh">
<div class="hmenu-item">
<div>
Hunting &amp;amp; Fishing
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11444071011&amp;ref=_mw_sa_sp_athclg">
<div class="hmenu-item">
<div>
Athletic Clothing
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=706809011&amp;ref=_mw_sa_sp_team">
<div class="hmenu-item">
<div>
Team Sports
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3410851&amp;ref=_mw_sa_sp_golf">
<div class="hmenu-item">
<div>
Golf
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3386071&amp;ref=_mw_sa_sp_fan">
<div class="hmenu-item">
<div>
Fan Shop
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3250697011&amp;ref=_mw_sa_sp_sptcllct">
<div class="hmenu-item">
<div>
Sports Collectibles
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=10971181011&amp;ref=_mw_sa_sp_allsport">
<div class="hmenu-item">
<div>
All Sports &amp; Fitness
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="21">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">OUTDOORS</div></li>
<li>
<a href="/gp/browse.html?node=11443874011&amp;ref=_sa_out_mw_outcloth">
<div class="hmenu-item">
<div>
Outdoor Clothing
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3400371&amp;ref=_sa_out_mw_camphike">
<div class="hmenu-item">
<div>
Camping &amp; Hiking
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3402401&amp;ref=_sa_out_mw_climb">
<div class="hmenu-item">
<div>
Climbing
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=3403201&amp;ref=_sa_out_mw_cyc">
<div class="hmenu-item">
<div>
Cycling
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11051398011&amp;ref=_sa_out_mw_scooskate">
<div class="hmenu-item">
<div>
Scooters, Skateboards &amp; Skates
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11051399011&amp;ref=_sa_out_mw_water">
<div class="hmenu-item">
<div>
Water Sports
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2204518011&amp;ref=_sa_out_mw_wintersport">
<div class="hmenu-item">
<div>
Winter Sports
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=11051400011&amp;ref=_sa_out_mw_accout">
<div class="hmenu-item">
<div>
Accessories
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=706814011&amp;ref=_sa_out_mw_alloutrec">
<div class="hmenu-item">
<div>
All Outdoor Recreation
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="22">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">AUTOMOTIVE &amp; INDUSTRIAL</div></li>
<li>
<a href="/gp/browse.html?node=15684181&amp;ref=_apa">
<div class="hmenu-item">
<div>
Automotive Parts &amp; Accessories
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=15706941&amp;ref=_ate">
<div class="hmenu-item">
<div>
Automotive Tools &amp; Equipment
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=15706571&amp;ref=_wt">
<div class="hmenu-item">
<div>
Tires &amp; Wheels
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=346333011&amp;ref=_matv">
<div class="hmenu-item">
<div>
Motorcycle &amp; Powersports
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=10677469011&amp;ref=vdp_mob_shopall">
<div class="hmenu-item">
<div>
Vehicles
</div>
</div>
</a>
</li>
<li>
<a href="/gp/your-garage/?ref=gar_mobile_shopall">
<div class="hmenu-item">
<div>
Your Garage
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=16310091&amp;ref=_mh_ind_sup">
<div class="hmenu-item">
<div>
Industrial Supplies
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=317970011&amp;ref=_mh_ind_lab">
<div class="hmenu-item">
<div>
Lab &amp; Scientific
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=317971011&amp;ref=_mh_ind_jan">
<div class="hmenu-item">
<div>
Janitorial
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=318135011&amp;ref=_mh_ind_saf">
<div class="hmenu-item">
<div>
Safety
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=6054382011&amp;ref=_mh_ind_fs">
<div class="hmenu-item">
<div>
Food Service
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=256346011&amp;ref=_mh_ind_mh">
<div class="hmenu-item">
<div>
Material Handling
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="23">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="2">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
ALL DEPARTMENTS
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">HOME SERVICES</div></li>
<li>
<a href="/gp/browse.html?node=10192825011&amp;ref=_localsvs_mw_home">
<div class="hmenu-item">
<div>
Home Improvement &amp; Repair
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=10192831011&amp;ref=_localsvs_mw_lg">
<div class="hmenu-item">
<div>
Yard &amp; Outdoors
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=10192836011&amp;ref=_localsvs_mw_ce">
<div class="hmenu-item">
<div>
Computer &amp; Electronics
</div>
</div>
</a>
</li>
<li>
<a href="/services?ref=_localsvs_mw_all">
<div class="hmenu-item">
<div>
All Services
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="2">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="1">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
Main Menu
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">ALL DEPARTMENTS</div></li>
<li>
<a href="/gp/aw/gb/?ref=navm_genz_sd_deals">
<div class="hmenu-item">
<div>
Today's Deals
</div>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="3">
<div>
Amazon Music
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="4">
<div>
Prime Video
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="https://www.amazon.com/tt/webview">
<div class="hmenu-item">
<div>
Treasure Truck
</div>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="5">
<div>
Amazon Restaurants
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="6">
<div>
Books
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="7">
<div>
Echo &amp; Alexa
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="8">
<div>
Fire Tablets
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="9">
<div>
Fire TV
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="10">
<div>
Kindle
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="11">
<div>
Clothing, Shoes &amp; Jewelry
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="12">
<div>
Electronics
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2238192011&amp;ref=_mw_cs_gc">
<div class="hmenu-item">
<div>
Gift Cards
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2350149011&amp;ref=_mw_adr_app">
<div class="hmenu-item">
<div>
Appstore for Android
</div>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="13">
<div>
Movies, Music &amp; Games
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="14">
<div>
Computers
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="15">
<div>
Home, Garden &amp; Pets
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="16">
<div>
Handmade
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="17">
<div>
Beauty, Health &amp; Personal Care
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="18">
<div>
Grocery, Prime Pantry &amp; Household
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="19">
<div>
Toys, Kids &amp; Baby
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="20">
<div>
Sports
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="21">
<div>
Outdoors
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="22">
<div>
Automotive &amp; Industrial
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="23">
<div>
Home Services
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-hide-right" data-menu-id="24">
<li>
<a href="/">
<div class="hmenu-item hmenu-back-button" data-parent-menu-id="1">
<div style="align-items: center;">
<i class="nav-sprite hmenu-arrow-prev"></i>
Main Menu
</div>
</div>
</a>
</li>
<li><div class="hmenu-item hmenu-title">ALL PROGRAMS &amp; FEATURES</div></li>
<li>
<a href="/Amazon-Exclusives/b?node=11024013011&amp;ref=nav_em_allpf_exclusives">
<div class="hmenu-item">
<div>
Amazon Exclusives
</div>
</div>
</a>
</li>
<li>
<a href="/Amazon-Launchpad/b?node=12034488011&amp;ref=nav_em_allpf_launchpad">
<div class="hmenu-item">
<div>
Amazon Launchpad
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=14981443011&amp;ref=nav_em_allpf_music">
<div class="hmenu-item">
<div>
Amazon Music
</div>
</div>
</a>
</li>
<li>
<a href="/restaurants?ref=nav_em_allpf_restaurants">
<div class="hmenu-item">
<div>
Amazon Restaurants
</div>
</div>
</a>
</li>
<li>
<a href="/tradein?ref=nav_em_allpf_trade">
<div class="hmenu-item">
<div>
Amazon Trade-in
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=10329849011&amp;ref=navm_em_allpf_fresh_nonmember">
<div class="hmenu-item">
<div>
AmazonFresh
</div>
</div>
</a>
</li>
<li>
<a href="/Audible-Audiobooks/b?node=2402172011&amp;ref=nav_em_allpf_audible">
<div class="hmenu-item">
<div>
Audible
</div>
</div>
</a>
</li>
<li>
<a href="/baby-reg/homepage/?ref=breg">
<div class="hmenu-item">
<div>
Baby Registry
</div>
</div>
</a>
</li>
<li>
<a href="/compare-credit-card-offers/b?node=3561432011&amp;ref=nav_em_allpf_cc">
<div class="hmenu-item">
<div>
Credit &amp; Payment Products
</div>
</div>
</a>
</li>
<li>
<a href="/ddb/your-dash-buttons?ref=nav_em_allpf_db">
<div class="hmenu-item">
<div>
Dash Buttons
</div>
</div>
</a>
</li>
<li>
<a href="/gcx/-/gfhz/connections/?ref=nav_em_allpf_find_gift">
<div class="hmenu-item">
<div>
Find a Gift
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=2238192011&amp;ref=navm_em_gc">
<div class="hmenu-item">
<div>
Gift Cards
</div>
</div>
</a>
</li>
<li>
<a href="/b?node=13245981011&amp;ref=nav_em_allpf_gc_registry">
<div class="hmenu-item">
<div>
Gift Cards &amp; Registry
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html/?node=8098158011&amp;ref=nav_em_allpf_hs">
<div class="hmenu-item">
<div>
Home Services
</div>
</div>
</a>
</li>
<li>
<a href="/stream?ref=nav_em_allpf_ni">
<div class="hmenu-item">
<div>
Interesting Finds
</div>
</div>
</a>
</li>
<li>
<a href="/prime?ref=nav_em_allpf_prime_nonmember">
<div class="hmenu-item">
<div>
Prime
</div>
</div>
</a>
</li>
<li>
<a href="/b/?node=7301146011&amp;ref=nav_em_allpf_pantry">
<div class="hmenu-item">
<div>
Prime Pantry
</div>
</div>
</a>
</li>
<li>
<a href="/STRING-subnav-prime-photos/b?node=13234696011&amp;ref=nav_em_allpf_photo">
<div class="hmenu-item">
<div>
Prime Photos
</div>
</div>
</a>
</li>
<li>
<a href="/Prime-Video/b?node=2858778011&amp;ref=nav_em_allpf_video">
<div class="hmenu-item">
<div>
Prime Video
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=12766669011&amp;ref=nav_em_allpf_sell">
<div class="hmenu-item">
<div>
Sell on Amazon
</div>
</div>
</a>
</li>
<li>
<a href="/b?node=15283820011&amp;ref=nav_em_allpf_sns">
<div class="hmenu-item">
<div>
Subscribe &amp; Save
</div>
</div>
</a>
</li>
<li>
<a href="/gp/goldbox/?ref=nav_em_allpf_td">
<div class="hmenu-item">
<div>
Today's Deals
</div>
</div>
</a>
</li>
<li>
<a href="/tt/webview?ref=nav_em_allpf_tt">
<div class="hmenu-item">
<div>
Treasure Truck
</div>
</div>
</a>
</li>
<li>
<a href="/Low-Price-With-Free-Shipping/bbp/bb?category=%2F&amp;ref=nav_em_allpf_10under">
<div class="hmenu-item">
<div>
$10 &amp; Under
</div>
</div>
</a>
</li>
<li>
<a href="/wedding/home/?ref=wreg">
<div class="hmenu-item">
<div>
Wedding Registry
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
<ul class="hmenu hmenu-visible" data-menu-id="1">
<li>
<a href="/gp/aw/gb/?ref=navm_em_today_deals">
<div class="hmenu-item">
<div>
Today's Deals
</div>
</div>
</a>
</li>
<li>
<a href="/stream?ref=navm_em_intersting_finds">
<div class="hmenu-item">
<div>
Interesting Finds
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/recs/ys?ref=navm_em_recommendations">
<div class="hmenu-item">
<div>
Your Recommendations
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/ybh?ref=navm_ftr_ybh">
<div class="hmenu-item">
<div>
Your Browsing History
</div>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="2">
<div>
Shop By Department
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
<li><div class="hmenu-item hmenu-title">PROGRAMS &amp; FEATURES</div></li>
<li>
<a href="/gp/prime?ref=navm_em_prime">
<div class="hmenu-item">
<div>
Try Prime
</div>
</div>
</a>
</li>
<li>
<a href="/b?node=2858778011&amp;rh=i%3Ainstant-video%2Cn%3A2858778011&amp;ref=navm_em_video">
<div class="hmenu-item">
<div>
Prime Video
</div>
</div>
</a>
</li>
<li>
<a href="/gp/browse.html?node=14981443011&amp;ref=navm_music_btn">
<div class="hmenu-item">
<div>
Amazon Music
</div>
</div>
</a>
</li>
<li>
<a href="">
<div class="hmenu-item" data-menu-id="24">
<div>
See All Programs &amp; Features
</div>
<i class="nav-sprite hmenu-arrow-next"></i>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
<li><div class="hmenu-item hmenu-title">HELP &amp; SETTINGS</div></li>
<li>
<a href="/gp/aw/ya?ref=navm_em_ya">
<div class="hmenu-item">
<div>
Your Account
</div>
</div>
</a>
</li>
<li>
<a id="hmenu-icp-language" href="/gp/customer-preferences/select-language/?preferencesReturnUrl=%2FSeven-Languages-Weeks-Programming-Programmers-ebook%2Fdp%2FB00AYQNR46%2Fref%3Dmt_kindle%3F_encoding%3DUTF8%26me%3D&amp;ref=navm_em_mozart">
<div class="hmenu-item">
<div>
<div class="hmenu-icon-container">
<i class="icon-css-reset icp-nav-globe-img-2 icp-mobile-globe-2"></i>
</div>
English
</div>
</div>
</a>
</li>
<li>
<a href="/gp/navigation-country/select-country/?ref=navm_em_locale">
<div class="hmenu-item">
<div>
<div class="hmenu-icon-container">
<i class="icon-css-reset icp-flag-3 icp-flag-3-us"></i>
</div>
United States
</div>
</div>
</a>
</li>
<li>
<a href="/gp/aw/contact-us?ref=navm_em_cs">
<div class="hmenu-item">
<div>
Customer Service
</div>
</div>
</a>
</li>
<li>
<a href="https://www.amazon.com/ap/signin?_encoding=UTF8&amp;openid.assoc_handle=anywhere_v2_us&amp;openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.mode=checkid_setup&amp;openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&amp;openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&amp;openid.pape.max_auth_age=0&amp;openid.return_to=https%3A%2F%2Fwww.amazon.com%2FSeven-Languages-Weeks-Programming-Programmers-ebook%2Fdp%2FB00AYQNR46%2Fref%3Dmt_kindle%3F_encoding%3DUTF8%26ref_%3Dnavm_hdr_signin">
<div class="hmenu-item">
<div>
Sign In
</div>
</div>
</a>
</li>
<li class="hmenu-separator"></li>
</ul>
</div>
</div>
</div>
<script type="text/javascript">
/**
* This file contains JavaScript for managing click events on HamburgerMenuCard
*/
(function ($Nav) {
"use strict";
// Do not execute the JS if $Nav is not available
if (!$Nav) {
if (window.ue && window.ue.count) {
window.ue.count("Navm:Hmenu:NavManagerNotAvailable", 1);
}
return;
}
$Nav.when("$", "metrics").run("hamburgerMenuClickEvents", function ($, metrics) {
var menuContainer = $("#hmenu-container");
var menuCanvas = $("#hmenu-canvas");
var menuCanvasBkgd = $("#hmenu-canvas-background");
var menuContent = $("#hmenu-content");
var transitionEnd = "transitionend webkitTransitionEnd oTransitionEnd";
// Remove metric logger event listener set in ATF
var hmenu = document.getElementById("nav-hamburger-menu");
if (hmenu) {
hmenu.removeEventListener("click", window.navHamburgerMetricLogger);
}
// Activate menu button
$("#nav-hamburger-menu").click(function () {
// Backward compatible JS - START
menuContainer.show();
// Backward compatible JS - END
menuContainer.addClass("hmenu-visible");
menuCanvas.removeClass("hmenu-hide-left").addClass("hmenu-show");
menuCanvasBkgd
.removeClass("hmenu-turn-transparent")
.addClass("hmenu-turn-opaque");
$("body").addClass("lock-position");
metrics.increment("Navm:Hmenu:IconClickActionComplete");
return false;
});
if (window.ue_t0) {
metrics.count("Navm:Hmenu:MenuAccessibleLatency", Date.now() - window.ue_t0);
}
// Activate menu collapsing
menuCanvasBkgd.click(function (event) {
// Ensure that user has clicked on translucent canvas background
if (event.target !== this) {
return;
}
metrics.increment("Navm:Hmenu:MenuAbandon");
function goToMainMenu() {
menuContent
.children("ul.hmenu:not([data-menu-id='1'])")
.removeClass("hmenu-show hmenu-hide-left")
.addClass("hmenu-hide-right");
menuContent
.children("ul.hmenu[data-menu-id='1']")
.removeClass("hmenu-hide-left")
.addClass("hmenu-visible")
.scrollTop(0);
}
menuCanvasBkgd
.removeClass("hmenu-turn-opaque")
.addClass("hmenu-turn-transparent");
menuCanvas
.removeClass("hmenu-show")
.bind(transitionEnd, function() {
// Backward compatible JS - START
menuContainer.hide();
// Backward compatible JS - END
menuContainer.removeClass("hmenu-visible");
goToMainMenu();
menuCanvas.unbind(transitionEnd);
})
.addClass("hmenu-hide-left");
$("body").removeClass("lock-position");
});
// Activate hmenu-item click
$(".hmenu-item").click(function (event) {
var currentTarget = $(event.currentTarget);
function slideToAdjacentMenu(menuToHide, newMenuId, isNextMenu) {
var menuToShow = menuContent.children(
"ul.hmenu[data-menu-id=" + newMenuId + "]"
);
menuToHide
.removeClass("hmenu-show")
.bind(transitionEnd, function() {
menuToHide.removeClass("hmenu-visible");
menuToHide.unbind(transitionEnd);
})
.addClass("hmenu-hide-" + (isNextMenu ? "left" : "right"));
menuToShow
.removeClass("hmenu-hide-" + (isNextMenu ? "right" : "left"))
.addClass("hmenu-visible hmenu-show")
.scrollTop(0);
}
// Slide to next menu if menu-id exists
if (currentTarget.data("menu-id")) {
slideToAdjacentMenu(
currentTarget.closest("ul.hmenu"),
currentTarget.data("menu-id"),
true
);
return false;
}
// Slide to previous menu if parent-menu-id exists
if (currentTarget.data("parent-menu-id")) {
slideToAdjacentMenu(
currentTarget.closest("ul.hmenu"),
currentTarget.data("parent-menu-id")
);
return false;
}
});
});
}(window.$Nav));
</script>
<!--NAVYAAN-HEADER-DATA-END-->
<script type="text/javascript">
window.$Nav && $Nav.when('$').run('searchScoping', function($) {
$('#nav-search-keywords-data').attr('data-implicit-alias', 'aps' );
});
</script>
<form style="display: none;">
<input type="hidden" id="rwol-display-called" value="0">
</form>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;rw-dynamic-modal-bootstrap&quot;}">{"origSessionId":"147-0816675-1753153","subPageType":null,"pageType":"DetailAW","ASIN":"B00AYQNR46","path":"/Seven-Languages-Weeks-Programming-Programmers-ebook/dp/B00AYQNR46","isAUI":"1"}</script>
<script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('navCF').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/11QXqf0G81L.js?AUIClients/RetailWebsiteOverlayAUIAssets');
});
</script>
<!-- btf tilu -->
<!-- sp:feature:host-btf -->
<script type="text/javascript"> P.when('atf').execute(function() { document.getElementById('WrapperDivToHideFooter').style.display = 'block';}) </script>
</div>
<!-- htmlEndMarker -->
<!-- whfh-AOfqmn2/z10+J2VyaeXx1J4uv5SYipONWchak7v5UrKfgoTHNNqz5FJSwGn9+pkc rid-NDW9PCFNDRXWFHQVWR24 -->
<!-- sp:end-feature:host-btf -->
<!-- sp:feature:aui-preload -->
<!-- sp:feature:nav-footer -->
<!-- footer pilu -->
<footer class="nav-mobile nav-locale-us nav-lang-en nav-ftr-batmobile">
<div id="nav-ftr" class="nav-t-standard nav-sprite-v3">
<a id="nav-ftr-gototop" class="nav-a" href="#top"><i class="nav-icon"></i><b class="nav-b">Top of page</b></a>
<div id="search-ac-init-data" data-aliases="" data-ime="" data-mkt="" data-src="">
</div>
<div id="nav-search-keywords-data" data-implicit-alias="aps">
</div>
<div class="nav-searchbar-wrapper">
<form class="nav-searchbar" action="/gp/aw/s/ref=is_s" method="get" role="search" id="nav-search-form" accept-charset="utf-8">
<div class="nav-right">
<div class="nav-search-submit">
<input type="submit" class="nav-input" value="Go" aria-label="Go">
<i class="nav-icon nav-sprite"></i>
</div>
</div>
<div class="nav-fill" dir="auto">
<div class="nav-search-field">
<input type="text" class="nav-input" placeholder="Search" aria-label="Type search keywords" data-aria-clear-label="Clear search keywords" name="k" autocomplete="off" autocorrect="off" autocapitalize="off" dir="auto" value="" id="nav-search-keywords">
<a class="nav-icon nav-sprite nav-search-clear" tabindex="0" href="javascript:;" aria-label="Clear search keywords"></a></div>
</div>
</form>
</div>
<ul id="nav-ftr-links" class="nav-ftr-links-two-column"><li class="nav-li nav-li-right"><a class="nav-a" href="/gp/aw/c/ref=navm_ftr_cart"><span class="nav-ftr-text">Cart (<b class="nav-b nav-cart-count">0</b>)</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right"><a class="nav-a" href="/gp/aw/ls/ref=navm_ftr_wl"><span class="nav-ftr-text">Your Lists</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right"><a class="nav-a" href="/gcx/Gifts-for-Adults/gfhz/ref=navm_ftr_gf"><span class="nav-ftr-text">Find a Gift</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right"><a class="nav-a" href="/gp/aw/ybh/ref=navm_ftr_ybh"><span class="nav-ftr-text">Browsing History</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right aok-offscreen nav-hidden"><a class="nav-a" href="/gp/aw/contact-us/c2c/phone?ie=UTF8&amp;c2cId=f67f2578-98fb-4abd-a85d-ec8e1918eaca" aria-label="Click to call our Disability Customer Support line, or reach us directly at 1-888-283-1678 "><span class="nav-ftr-text">Disability Customer Support</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right"><a class="nav-a" href="/gp/anywhere/site-view.html/ref=navm_ftr_fullsite?ie=UTF8&amp;force-full-site=1&amp;opt=desktop&amp;url=http%3A%2F%2Fwww.amazon.com%2Fref%3Dnavm_ftr_fullsite"><span class="nav-ftr-text">Amazon.com Full Site</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/ref=navm_ftr_home"><span class="nav-ftr-text">Amazon.com</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/gp/aw/ya/or/ref=navm_ftr_yo"><span class="nav-ftr-text">Your Orders</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/b/ref=navm_ftr_reg_gc?ie=UTF8&amp;node=13245981011"><span class="nav-ftr-text">Gift Cards &amp; Registry</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/gp/aw/ya/ref=navm_ftr_ya"><span class="nav-ftr-text">Your Account</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/gp/aw/contact-us/ref=navm_ftr_cu"><span class="nav-ftr-text">Customer Service</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/gp/help/customer/display.html/ref=navm_ftr_help?ie=UTF8&amp;id=help"><span class="nav-ftr-text">Help</span><i class="nav-icon nav-sprite"></i></a></li></ul>
<div class="icp-container-mobile">
<style type="text/css">
#icp-touch-link-language { display: none; }
</style>
<a href="/gp/customer-preferences/select-language/ref=footer_lang?ie=UTF8&amp;preferencesReturnUrl=%2FSeven-Languages-Weeks-Programming-Programmers-ebook%2Fdp%2FB00AYQNR46%2Fref%3Dmt_kindle%3F_encoding%3DUTF8%26me%3D" class="icp-touch-link-2" id="icp-touch-link-language">
<div class="icp-nav-globe-img-2 icp-mobile-globe-2"></div><span class="icp-color-base">English</span><span class="nav-arrow icp-up-down-arrow"></span>
</a>
<style type="text/css">
#icp-touch-link-country { display: none; }
</style>
<a href="/gp/navigation-country/select-country/ref=?ie=UTF8&amp;preferencesReturnUrl=%2FSeven-Languages-Weeks-Programming-Programmers-ebook%2Fdp%2FB00AYQNR46%2Fref%3Dmt_kindle%3F_encoding%3DUTF8%26me%3D" class="icp-touch-link-2" id="icp-touch-link-country">
<span class="icp-flag-3 icp-flag-3-us"></span><span class="icp-color-base">United States</span>
</a>
</div>
<div id="nav-ftr-auth">
Already a customer?<a href="https://www.amazon.com/ap/signin?_encoding=UTF8&amp;openid.assoc_handle=usamazon&amp;openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.mode=checkid_setup&amp;openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&amp;openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&amp;openid.pape.max_auth_age=0&amp;openid.return_to=https%3A%2F%2Fwww.amazon.com%2FSeven-Languages-Weeks-Programming-Programmers-ebook%2Fdp%2FB00AYQNR46%2Fref%3Dmt_kindle%3F_encoding%3DUTF8%26me%3D%26pc_redir%3DT1%26ref_%3Dmt_kindle" class="nav-a">Sign In</a></div>
<ul class="nav-ftr-horiz "><li class="nav-li "><a href="/gp/aw/help/ref=navm_ftr_cou?ie=UTF8&amp;id=cou" class="nav-a">Conditions of Use</a></li><li class="nav-li "><a href="/gp/aw/help/ref=navm_ftr_mpa?ie=UTF8&amp;id=mpa" class="nav-a">Privacy Notice</a></li><li class="nav-li "><a href="/gp/aw/help/ref=navm_ftr_iba?ie=UTF8&amp;id=201308670" class="nav-a">Interest-Based Ads</a></li></ul>
<div id="nav-ftr-copyright">© 1996-2018, Amazon.com, Inc. or its affiliates</div>
</div>
</footer>
<!-- whfh-iSwfCZLQ7d9Te3l6MSD5dg+/S6W5xfqmjMXs9z3goZHS4X8mn/rLH3nFzk4v5wCPTyCS+NdB55w= rid-NDW9PCFNDRXWFHQVWR24 -->
<div id="sis_pixel_r2" aria-hidden="true" style="height:1px; position: absolute; left: -1000000px; top: -1000000px;"><iframe id="DAsis" src="//s.amazon-adsystem.com/iu3?d=amazon.com&amp;slot=navFooter&amp;a2=0101b0dd9e9ed6e4d14ee592d143072c505a53e1e3e76a653ab663fa010fec990386&amp;old_oo=0&amp;cb=1518884955469" width="1" height="1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="display: none !important;"></iframe></div><script>(function(a,b){a.attachEvent?a.attachEvent("onload",b):a.addEventListener&&a.addEventListener("load",b,!1)})(window,function(){setTimeout(function(){var el=document.getElementById("sis_pixel_r2");el&&(el.innerHTML='<iframe id="DAsis" src="//s.amazon-adsystem.com/iu3?d=amazon.com&slot=navFooter&a2=0101b0dd9e9ed6e4d14ee592d143072c505a53e1e3e76a653ab663fa010fec990386&old_oo=0&cb=1518884955469" width="1" height="1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>')},300)});</script><!-- footer tilu -->
<div id="be" style="display:none;visibility:hidden;"><form name="ue_backdetect" action="get"><input type="hidden" name="ue_back" value="2"></form>
<script type="text/javascript">
var ue_mbl=ue_csm.ue.exec(function(e,a){function l(f){b=f||{};a.AMZNPerformance=b;b.transition=b.transition||{};b.timing=b.timing||{};e.ue.exec(m,"csm-android-check")()&&b.tags instanceof Array&&(f=-1!=b.tags.indexOf("usesAppStartTime")||b.transition.type?!b.transition.type&&-1<b.tags.indexOf("usesAppStartTime")?"warm-start":void 0:"view-transition",f&&(b.transition.type=f));"reload"===c._nt&&e.ue_orct||"intrapage-transition"===c._nt?a.performance&&performance.timing&&performance.timing.navigationStart?
b.timing.transitionStart=a.performance.timing.navigationStart:delete b.timing.transitionStart:"undefined"===typeof c._nt&&a.performance&&performance.timing&&performance.timing.navigationStart&&a.history&&"function"===typeof a.History&&"object"===typeof a.history&&history.length&&1!=history.length&&(b.timing.transitionStart=a.performance.timing.navigationStart);f=b.transition;var d;d=c._nt?c._nt:void 0;f.subType=d;a.ue&&a.ue.tag&&a.ue.tag("has-AMZNPerformance");c.isl&&a.uex&&uex("at","csm-timing");
n()}function p(b){a.ue&&a.ue.count&&a.ue.count("csm-cordova-plugin-failed",1)}function m(){return a.webclient&&"function"===typeof a.webclient.getRealClickTime?a.cordova&&a.cordova.platformId&&"ios"==a.cordova.platformId?!1:!0:!1}function n(){try{P.register("AMZNPerformance",function(){return b})}catch(a){}}function h(){if(!b)return"";ue_mbl.cnt=null;for(var a=b.timing,d=b.transition,a=["mts",k(a.transitionStart),"mps",k(a.processStart),"mtt",d.type,"mtst",d.subType,"mtlt",d.launchType],d="",c=0;c<
a.length;c+=2){var e=a[c],g=a[c+1];"undefined"!==typeof g&&(d+="&"+e+"="+g)}return d}function k(a){if("undefined"!==typeof a&&"undefined"!==typeof g)return a-g}function q(a,c){b&&(g=c,b.timing.transitionStart=a,b.transition.type="view-transition",b.transition.subType="ajax-transition",b.transition.launchType="normal",ue_mbl.cnt=h)}var c=e.ue||{},g=e.ue_t0,b;if(a.P&&a.P.when&&a.P.register)return a.P.when("CSMPlugin").execute(function(a){a.buildAMZNPerformance&&a.buildAMZNPerformance({successCallback:l,
failCallback:p})}),{cnt:h,ajax:q}},"mobile-timing")(ue_csm,window);
(function(d){d._uess=function(){var a="";screen&&screen.width&&screen.height&&(a+="&sw="+screen.width+"&sh="+screen.height);var b=function(a){var b=document.documentElement["client"+a];return"CSS1Compat"===document.compatMode&&b||document.body["client"+a]||b},c=b("Width"),b=b("Height");c&&b&&(a+="&vw="+c+"&vh="+b);return a}})(ue_csm);
(function(a){var b=document.ue_backdetect;b&&b.ue_back&&a.ue&&(a.ue.bfini=b.ue_back.value);a.uet&&a.uet("be");a.onLdEnd&&(window.addEventListener?window.addEventListener("load",a.onLdEnd,!1):window.attachEvent&&window.attachEvent("onload",a.onLdEnd));a.ueh&&a.ueh(0,window,"load",a.onLd,1);a.ue&&a.ue.tag&&(a.ue_furl&&a.ue_furl.split?(b=a.ue_furl.split("."))&&b[0]&&a.ue.tag(b[0]):a.ue.tag("nofls"))})(ue_csm);
(function(g,h){function d(a,d){var b={};if(!e||!f)try{var c=h.sessionStorage;c?a&&("undefined"!==typeof d?c.setItem(a,d):b.val=c.getItem(a)):f=1}catch(g){e=1}e&&(b.e=1);return b}var b=g.ue||{},a="",f,e,c,a=d("csmtid");f?a="NA":a.e?a="ET":(a=a.val,a||(a=b.oid||"NI",d("csmtid",a)),c=d(b.oid),c.e||(c.val=c.val||0,d(b.oid,c.val+1)),b.ssw=d);b.tabid=a})(ue_csm,window);
ue_csm.ue.exec(function(e,f){var a=e.ue||{},b=a._wlo,d;if(a.ssw){d=a.ssw("CSM_previousURL").val;var c=f.location,b=b?b:c&&c.href?c.href.split("#")[0]:void 0;c=(b||"")===a.ssw("CSM_previousURL").val;!c&&b&&a.ssw("CSM_previousURL",b);d=c?"reload":d?"intrapage-transition":"first-view"}else d="unknown";a._nt=d},"NavTypeModule")(ue_csm,window);
(function(b,c){var a=c.images;a&&a.length&&b.ue.count("totalImages",a.length)})(ue_csm,document);
(function(b){function c(){var d=[];a.log&&a.log.isStub&&a.log.replay(function(a){e(d,a)});a.clog&&a.clog.isStub&&a.clog.replay(function(a){e(d,a)});d.length&&(a._flhs+=1,n(d),p(d))}function g(){a.log&&a.log.isStub&&(a.onflush&&a.onflush.replay&&a.onflush.replay(function(a){a[0]()}),a.onunload&&a.onunload.replay&&a.onunload.replay(function(a){a[0]()}),c())}function e(d,b){var c=b[1],f=b[0],e={};a._lpn[c]=(a._lpn[c]||0)+1;e[c]=f;d.push(e)}function n(b){q&&(a._lpn.csm=(a._lpn.csm||0)+1,b.push({csm:{k:"chk",
f:a._flhs,l:a._lpn,s:"inln"}}))}function p(a){if(h)a=k(a),b.navigator.sendBeacon(l,a);else{a=k(a);var c=new b[f];c.open("POST",l,!0);c.setRequestHeader&&c.setRequestHeader("Content-type","text/plain");c.send(a)}}function k(a){return JSON.stringify({rid:b.ue_id,sid:b.ue_sid,mid:b.ue_mid,mkt:b.ue_mkt,sn:b.ue_sn,reqs:a})}var f="XMLHttpRequest",q=1===b.ue_ddq,a=b.ue,r=b[f]&&"withCredentials"in new b[f],h=b.navigator&&b.navigator.sendBeacon,l="//"+b.ue_furl+"/1/batch/1/OE/",m=b.ue_fci_ft||5E3;a&&(r||h)&&
(a._flhs=a._flhs||0,a._lpn=a._lpn||{},a.attach&&(a.attach("beforeunload",g),a.attach("pagehide",g)),m&&b.setTimeout(c,m),a._ffci=c)})(window);
ue_csm.ue._rtn = 1;
(function(e,f){function h(a){a=a.split("?")[0]||a;a=a.replace("http://","").replace("https://","").replace("resource://","").replace("res://","").replace("undefined://","").replace("chrome://","").replace(/\*/g,"").replace(/!/g,"").replace(/~/g,"");var b=a.split("/");a=a.substr(a.lastIndexOf("/")+1);b.splice(-1);b=b.map(function(a){c[a]||(c[a]=(k++).toString(36));return c[a]});b.push(a);return b.join("!")}function l(){return f.getEntriesByType("resource").filter(function(a){return d._rre(a)<d._ld}).sort(function(a,
b){return a.responseEnd-b.responseEnd}).splice(0,m).map(function(a){var b=[],c;for(c in a)g[c]&&a[c]&&b.push(g[c]+Math.max(a[c]|0,-1).toString(36));b.push("i"+a.initiatorType);(1==d._rtn&&d._afjs>n||2==d._rtn)&&b.push("n"+h(a.name));return b.join("_")}).join("*")}function p(){var a="pm",b;for(b in c)c.hasOwnProperty(b)&&(a+="*"+c[b]+"_"+b);return a}function q(){d.log({k:"rtiming",value:l()+"~"+p()},"csm")}if(f&&f.getEntriesByType&&Array.prototype.map&&Array.prototype.filter&&e.ue&&e.ue.log){var g=
{connectStart:"c",connectEnd:"C",domainLookupStart:"d",domainLookupEnd:"D",duration:"z",encodedBodySize:"e",decodedBodySize:"E",fetchStart:"f",redirectStart:"r",redirectEnd:"R",requestStart:"q",responseStart:"s",responseEnd:"S",startTime:"a",transferSize:"t"},d=e.ue,c={},k=1,n=20,m=200;d&&d._rre&&(d._art=function(){d._ld&&window.setTimeout(q,0)})}})(ue_csm||{},window.performance);
(function(c,d){var b=c.ue,a=d.navigator;b&&b.tag&&a&&(a=a.connection||a.mozConnection||a.webkitConnection)&&a.type&&b.tag("netInfo:"+a.type)})(ue_csm,window);
(function(c,d){function h(a,b){for(var c=[],d=0;d<a.length;d++){var e=a[d],f=b.encode(e);if(e[k]){var g=b.metaSep,e=e[k],l=b.metaPairSep,h=[],m=void 0;for(m in e)e.hasOwnProperty(m)&&h.push(m+"="+e[m]);e=h.join(l);f+=g+e}c.push(f)}return c.join(b.resourceSep)}function s(a){var b=a[k]=a[k]||{};b[t]||(b[t]=c.ue_mid);b[u]||(b[u]=c.ue_sid);b[f]||(b[f]=c.ue_id);b.csm=1;a="//"+c.ue_furl+"/1/"+a[v]+"/1/OP/"+a[w]+"/"+a[x]+"/"+h([a],y);if(n)try{n.call(d[p],a)}catch(g){c.ue.sbf=1,(new Image).src=a}else(new Image).src=
a}function q(){g&&g.isStub&&g.replay(function(a,b,c){a=a[0];b=a[k]=a[k]||{};b[f]=b[f]||c;s(a)});l.impression=s;g=null}if(!(1<c.ueinit)){var k="metadata",x="impressionType",v="foresterChannel",w="programGroup",t="marketplaceId",u="session",f="requestId",p="navigator",l=c.ue||{},n=d[p]&&d[p].sendBeacon,r=function(a,b,c,d){return{encode:d,resourceSep:a,metaSep:b,metaPairSep:c}},y=r("","?","&",function(a){return h(a.impressionData,z)}),z=r("/",":",",",function(a){return a.featureName+":"+h(a.resources,
A)}),A=r(",","@","|",function(a){return a.id}),g=l.impression;n?q():(l.attach("load",q),l.attach("beforeunload",q));try{d.P&&d.P.register&&d.P.register("impression-client",function(){})}catch(B){c.ueLogError(B,{logLevel:"WARN"})}}})(ue_csm,window);
var ue_pty = "DetailAW";
var ue_spty = "kics";
var ue_pti = "B00AYQNR46";
var ue_adb = 4;
var ue_adb_rtla = 1;
ue_csm.ue.exec(function(w,a){function q(){if(d&&f){var a;a:{try{a=d.getItem(g);break a}catch(c){}a=void 0}if(a)return b=a,!0}return!1}function r(){b=h;k();if(f)try{d.setItem(g,b)}catch(a){}}function s(){b=1===a.ue_adb_chk?l:h;k();if(f)try{d.setItem(g,b)}catch(c){}}function m(){a.ue_adb_rtla&&c&&0<c.ec&&!1===n&&(c.elh=null,ueLogError({m:"Hit Info",fromOnError:1},{logLevel:"INFO",adb:b}),n=!0)}function k(){e.tag(b);e.isl&&a.uex&&uex("at",b);p&&p.updateCsmHit("adb",b);c&&0<c.ec?m():a.ue_adb_rtla&&c&&
(c.elh=m)}function t(){return b}if(a.ue_adb){var e=a.ue,h="adblk_yes",l="adblk_no",b="adblk_unk",d;a:{try{d=a.localStorage;break a}catch(x){}d=void 0}var g="csm:adb",c=a.ue_err,p=e.cookie,f=void 0!==a.localStorage,u=0.98<Math.random(),n=!1,v=q();u||!v?e.uels("https://m.media-amazon.com/images/G/01/csm/showads.v2.js",{onerror:r,onload:s}):k();a.ue_isAdb=t;a.ue_isAdb.unk="adblk_unk";a.ue_isAdb.no=l;a.ue_isAdb.yes=h}},"adb")(document,window);
(function(a,b){a.ue_cel||(a.ue_cel=function(){function k(a,c){c?c.r=v:c={r:v,c:1};c.clog&&h.clog?h.clog(a,c.ns||e,c):c.glog&&h.glog?h.glog(a,c.ns||e,c):h.log(a,c.ns||e,c)}function m(){var a=d.length;if(0<a){for(var c=[],b=0;b<a;b++){var g=d[b].api;g.ready()?(g.on({ts:h.d,ns:e}),f.push(d[b]),k({k:"mso",n:d[b].name,t:h.d()})):c.push(d[b])}d=c}}function g(){if(!g.executed){for(var a=0;a<f.length;a++)f[a].api.off&&f[a].api.off({ts:h.d,ns:e});q();k({k:"eod",t0:h.t0,t:h.d()},{c:1,il:1});g.executed=1;for(a=
0;a<f.length;a++)d.push(f[a]);f=[];clearTimeout(w);clearTimeout(r)}}function q(a){k({k:"hrt",t:h.d()},{c:1,il:1,n:a});B=Math.min(c,u*B);x()}function x(){clearTimeout(r);r=setTimeout(function(){q(!0)},B)}function t(){g.executed||q()}var u=1.5,c=b.ue_cel_max_hrt||3E4,d=[],f=[],e=a.ue_cel_ns||"cel",w,r,h=a.ue,n=a.uet,s=a.uex,v=h.rid,B=b.ue_cel_hrt_int||3E3,p=function(){var a=b.performance,c=h.ssw&&h.ssw(h.oid)||{},c="undefined"===typeof c.val||"1"!==c.val;return a&&a.navigation&&2===a.navigation.type&&
c}(),l=b.requestAnimationFrame||function(a){a()};if(p)k({k:"bft",t:h.d()});else{"function"==typeof n&&n("bb","csmCELLSframework",{wb:1});setTimeout(m,0);h.onunload(g);if(h.onflush)h.onflush(t);w=setTimeout(g,6E5);x();"function"==typeof s&&s("ld","csmCELLSframework",{wb:1});return{registerModule:function(a,c){d.push({name:a,api:c});k({k:"mrg",n:a,t:h.d()});m()},reset:function(a){k({k:"rst",t0:h.t0,t:h.d()});d=d.concat(f);f=[];for(var c=d.length,b=0;b<c;b++)d[b].api.off(),d[b].api.reset();v=a||h.rid;
m();clearTimeout(w);w=setTimeout(g,6E5);g.executed=0},timeout:function(a,c){return b.setTimeout(function(){l(function(){g.executed||a()})},c)},log:k,off:g}}}())})(ue_csm,window);
(function(a,b,k){a.ue_pdm||!a.ue_cel||ue.isBF||(a.ue_pdm=function(){function m(){var c={w:e.width,aw:e.availWidth,h:e.height,ah:e.availHeight,cd:e.colorDepth,pd:e.pixelDepth},b=k.body||{},d=k.documentElement||{},b={w:Math.max(b.scrollWidth||0,b.offsetWidth||0,d.clientWidth||0,d.scrollWidth||0,d.offsetWidth||0),h:Math.max(b.scrollHeight||0,b.offsetHeight||0,d.clientHeight||0,d.scrollHeight||0,d.offsetHeight||0)};n&&n.w==c.w&&n.h==c.h&&n.aw==c.aw&&n.ah==c.ah&&n.pd==c.pd&&n.cd==c.cd||(n=c,n.t=r(),n.k=
"sci",l(n));s&&s.w==b.w&&s.h==b.h||(s=b,s.t=r(),s.k="doi",l(s));w=a.ue_cel.timeout(m,h);B+=1}function g(){c("ebl","default",!1)}function q(){c("efo","default",!0)}function x(){c("ebl","app",!1)}function t(){c("efo","app",!0)}function u(){b.setTimeout(function(){k[J]?c("ebl","pageviz",!1):c("efo","pageviz",!0)},0)}function c(a,c,b){v!==b&&l({k:a,t:r(),s:c},{ff:!0===b?0:1});v=b}function d(){p.attach&&(y&&p.attach(D,u,k),C&&P.when("mash").execute(function(a){a&&a.addEventListener&&(a.addEventListener("appPause",
x),a.addEventListener("appResume",t))}),p.attach("blur",g,b),p.attach("focus",q,b))}function f(){p.detach&&(y&&p.detach(D,u,k),C&&P.when("mash").execute(function(a){a&&a.removeEventListener&&(a.removeEventListener("appPause",x),a.removeEventListener("appResume",t))}),p.detach("blur",g,b),p.detach("focus",q,b))}var e,w,r,h,n,s,v=null,B=0,p=a.ue,l=a.ue_cel.log,A=a.uet,z=a.uex,y=!!p.pageViz,D=y&&p.pageViz.event,J=y&&p.pageViz.propHid,C=b.P&&b.P.when;"function"==typeof A&&A("bb","csmCELLSpdm",{wb:1});
return{on:function(a){h=a.timespan||500;r=a.ts;e=b.screen;d();a=b.location;l({k:"pmd",o:a.origin,p:a.pathname,t:r()});m();"function"==typeof z&&z("ld","csmCELLSpdm",{wb:1})},off:function(a){clearTimeout(w);f();p.count&&p.count("cel.PDM.TotalExecutions",B)},ready:function(){return k.body&&a.ue_cel&&a.ue_cel.log},reset:function(){n=s=null}}}(),a.ue_cel&&a.ue_cel.registerModule("page module",a.ue_pdm))})(ue_csm,window,document);
(function(a,b){a.ue_vpm||!a.ue_cel||ue.isBF||(a.ue_vpm=function(){function k(){var a=t(),d={w:b.innerWidth,h:b.innerHeight,x:b.pageXOffset,y:b.pageYOffset};g&&g.w==d.w&&g.h==d.h&&g.x==d.x&&g.y==d.y||(d.t=a,d.k="vpi",g=d,f(g,{clog:1}));q=0;u=t()-a;c+=1}function m(){q||(q=a.ue_cel.timeout(k,x))}var g,q,x,t,u=0,c=0,d=a.ue,f=a.ue_cel.log,e=a.uet,w=a.uex,r=d.attach,h=d.detach;"function"==typeof e&&e("bb","csmCELLSvpm",{wb:1});return{on:function(a){t=a.ts;x=a.timespan||100;k();r&&(r("scroll",m),r("resize",
m));"function"==typeof w&&w("ld","csmCELLSvpm",{wb:1})},off:function(a){clearTimeout(q);h&&(h("scroll",m),h("resize",m));d.count&&(d.count("cel.VPI.TotalExecutions",c),d.count("cel.VPI.TotalExecutionTime",u),d.count("cel.VPI.AverageExecutionTime",u/c))},ready:function(){return a.ue_cel&&a.ue_cel.log},reset:function(){g=void 0},getVpi:function(){return g}}}(),a.ue_cel&&a.ue_cel.registerModule("viewport module",a.ue_vpm))})(ue_csm,window);
(function(a,b,k){if(!a.ue_fem&&a.ue_cel){var m=a.ue||{};!m.isBF&&!a.ue_fem&&k.querySelector&&b.getComputedStyle&&[].forEach&&(a.ue_fem=function(){function g(a,c){return a>c?3>a-c:3>c-a}function q(a,c){var d=b.pageXOffset,e=b.pageYOffset,f;a:{try{if(a){var h=a.getBoundingClientRect();f={x:h.left+d|0,y:h.top+e|0,w:h.width|0,h:h.height|0,d:(0===a.offsetWidth&&0===a.offsetHeight)|0}}else f=void 0;break a}catch(k){}f=void 0}if(f&&!a.cel_b)a.cel_b=f,p({n:a.cel_n,w:a.cel_b.w,h:a.cel_b.h,d:a.cel_b.d,x:a.cel_b.x,
y:a.cel_b.y,t:c,k:"ewi",cl:a.className},{clog:1});else{if(d=f)d=a.cel_b,e=f,d=e.d===d.d&&1===e.d?!1:!(g(d.x,e.x)&&g(d.y,e.y)&&g(d.w,e.w)&&g(d.h,e.h)&&d.d===e.d);d&&(a.cel_b=f,p({n:a.cel_n,w:a.cel_b.w,h:a.cel_b.h,d:a.cel_b.d,x:a.cel_b.x,y:a.cel_b.y,t:c,k:"ewi"},{clog:1}))}}function x(a,d){var b;b=a.c?k.getElementsByClassName(a.c):a.id?[k.getElementById(a.id)]:k.querySelectorAll(a.s);a.w=[];for(widgetIndex=0;widgetIndex<b.length;widgetIndex++){var e=b[widgetIndex];e&&(e.cel_n||(e.cel_n=e.getAttribute("cel_widget_id")||
(a.id_gen||B)(e,widgetIndex)||e.id),a.w.push(e),c(M,e,d))}}function t(a,c){l.contains(a)||p({n:a.cel_n,t:c,k:"ewd"},{clog:1})}function u(a){F.length&&ue_cel.timeout(function(){if(n){for(var c=N(),d=!1;N()-c<h&&!d;){for(d=O;0<d--&&0<F.length;){var b=F.shift();Q[b.type](b.elem,b.time)}d=0===F.length}R++;u(a)}},0)}function c(a,c,d){F.push({type:a,elem:c,time:d})}function d(a,d){for(var b=0;b<v.length;b++)for(var e=v[b].w||[],f=0;f<e.length;f++)c(a,e[f],d)}function f(){H||(H=a.ue_cel.timeout(function(){H=
null;var a=s();d(T,a);for(var b=0;b<v.length;b++)c(U,v[b],a);u(a)},r))}function e(){H||K||(K=a.ue_cel.timeout(function(){K=null;var a=s();d(M,a);u(a)},r))}function w(){return z&&y&&l&&l.contains&&l.getBoundingClientRect&&s}var r=50,h=4.5,n=!1,s,v=[],B=function(){},p=a.ue_cel.log,l,A,z,y,D=b.MutationObserver||b.WebKitMutationObserver||b.MozMutationObserver,J=!!D,C,E,L="DOMAttrModified",G="DOMNodeInserted",I="DOMNodeRemoved",K,H,F=[],R=0,O=null,T="removedWidget",U="updateWidgets",M="processWidget",
Q,S=b.performance||{},N=S.now&&function(){return S.now()}||function(){return Date.now()};"function"==typeof uet&&uet("bb","csmCELLSfem",{wb:1});return{on:function(c){function b(){if(w()){Q={removedWidget:t,updateWidgets:x,processWidget:q};if(J){var a={attributes:!0,subtree:!0};C=new D(e);E=new D(f);C.observe(l,a);E.observe(l,{childList:!0,subtree:!0});E.observe(A,a)}else z.call(l,L,e),z.call(l,G,f),z.call(l,I,f),z.call(A,G,e),z.call(A,I,e);f()}}l=k.body;A=k.head;z=l.addEventListener;y=l.removeEventListener;
s=c.ts;v=a.cel_widgets||[];O=c.bs||5;m.deffered?b():m.attach&&m.attach("load",b);"function"==typeof uex&&uex("ld","csmCELLSfem",{wb:1});n=!0},off:function(){w()&&(E&&(E.disconnect(),E=null),C&&(C.disconnect(),C=null),y.call(l,L,e),y.call(l,G,f),y.call(l,I,f),y.call(A,G,e),y.call(A,I,e));m.count&&m.count("cel.widgets.batchesProcessed",R);n=!1},ready:function(){return a.ue_cel&&a.ue_cel.log},reset:function(){v=a.cel_widgets||[]}}}(),a.ue_cel&&a.ue_fem&&a.ue_cel.registerModule("features module",a.ue_fem))}})(ue_csm,
window,document);
(function(a,b,k){a.ue_mcm||!a.ue_cel||a.ue.isBF||(a.ue_mcm=function(){function m(a){try{if(a.id)return"//*[@id='"+a.id+"']";var b,f=1,e;for(e=a.previousSibling;e;e=e.previousSibling)e.nodeName==a.nodeName&&(f+=1);b=f;var g=a.nodeName;1!=b&&(g+="["+b+"]");a.parentNode&&(g=m(a.parentNode)+"/"+g);return g}catch(k){return"DETACHED"}}function g(c,d){var f=c.srcElement||c.target||{},e={k:q,w:(d||{}).ow||(b.body||{}).scrollWidth,h:(d||{}).oh||(b.body||{}).scrollHeight,t:(d||{}).ots||x(),x:c.pageX,y:c.pageY,
p:m(f),n:f.nodeName};a.ue_cdt&&k&&"function"===typeof k.now&&c.timeStamp&&(e.dt=(d||{}).odt||k.now()-c.timeStamp,e.dt=parseFloat(e.dt.toFixed(2)));c.button&&(e.b=c.button);f.href&&(e.r=f.href);f.id&&(e.i=f.id);f.className&&f.className.split&&(e.c=f.className.split(/\s+/));u(e,{c:1})}var q="mcm",x,t=a.ue,u=a.ue_cel.log;return{on:function(c){x=c.ts;a.ue_cel_stub&&a.ue_cel_stub.replayModule(q,g);t.attach&&t.attach("click",g,b)},off:function(a){t.detach&&t.detach("click",g,b)},ready:function(){return a.ue_cel&&
a.ue_cel.log},reset:function(){}}}(),a.ue_cel&&a.ue_cel.registerModule("mouse click module",a.ue_mcm))})(ue_csm,document,window.performance);
ue_csm.ue_cmr = 1;
ue_csm.ue_unrt = 750;
(function(d,c,t){function p(a){try{if(a.id)return"//*[@id='"+a.id+"']";var d,c=1,g;for(g=a.previousSibling;g;g=g.previousSibling)g.nodeName===a.nodeName&&(c+=1);d=c;var b=a.nodeName;1!==d&&(b+="["+d+"]");a.parentNode&&(b=p(a.parentNode)+"/"+b);return b}catch(e){return"DETACHED"}}function u(a){l=!0;var f=h=d.ue.d(),k;d.ue_cdt&&m&&"function"===typeof m.now&&a.timeStamp&&(k=m.now()-a.timeStamp,k=parseFloat(k.toFixed(2)));q=c.setTimeout(function(){var c=k,b=a.srcElement||a.target||{},e={k:v,t:f,x:a.pageX,
y:a.pageY,p:p(b),n:b.nodeName};d.ue_cdt&&c&&(e.dt=c);a.button&&(e.b=a.button);b.type&&(e.ty=b.type);b.href&&(e.r=b.href);b.id&&(e.i=b.id);b.className&&b.className.split&&(e.c=b.className.split(/\s+/));d.ue.log(e,r)},w)}function x(a){n=!0;f=d.ue.d();l&&n&&(d.ue_cmr&&f&&h&&d.ue.log({k:y,t:h,m:Math.abs(f-h)},r),s(),n=!1,f=0)}function s(){l=!1;h=0;c.clearTimeout(q)}if(c.MutationObserver&&c.addEventListener&&d&&d.ue_unrt){var w=d.ue_unrt,r="cel",v="unr_mcm",y="res_mcm",m=c.performance,l=!1,h=0,q=0,n=!1,
f=0;c.addEventListener&&(c.addEventListener("mousedown",u,!0),c.addEventListener("beforeunload",s,!0));(new MutationObserver(x)).observe(t,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}})(ue_csm,window,document);
ue_csm.ue.exec(function(g,f){f.ue_err=f.ue_err||{};var e="";f.ue_err.addContextInfo=function(a){if(!a.logLevel||"FATAL"===a.logLevel)if(e=g.getElementsByTagName("html")[0].innerHTML){var b=e.indexOf("var ue_t0=ue_t0||+new Date();");if(-1!=b){var b=e.substr(0,b).split("\n"),d=Math.max(b.length-5-1,0),b=b.slice(d,b.length-1);a.fcsmln=b.length+1;a.cinfo=a.cinfo||{};for(var c=0;c<b.length;c++)a.cinfo[d+c+1+""]=b[c]}b=e.split("\n");a.cinfo=a.cinfo||{};if(!(a.f||void 0===a.l||a.l in a.cinfo))for(c=+a.l-
1,d=Math.max(c-2,0),c=Math.min(c+2,b.length-1);d<=c;d++)a.cinfo[d+1+""]=b[d]}}},"fatals-context")(document,window);
ue_csm.ue.exec(function(c,a){function g(a){a.run(function(e){d.tag("csm-feature-"+a.name+":"+e);d.isl&&c.uex("at")})}if(a.addEventListener)for(var d=c.ue||{},f=[{name:"touch-enabled",run:function(b){var e=function(){a.removeEventListener("touchstart",c,!0);a.removeEventListener("mousemove",d,!0)},c=function(){b("true");e()},d=function(){b("false");e()};a.addEventListener("touchstart",c,!0);a.addEventListener("mousemove",d,!0)}}],b=0;b<f.length;b++)g(f[b])},"csm-features")(ue_csm,window);
ue_csm.ue.exec(function(c){var d=[];c=c.ue;c.attach("load",function(){for(var b=500,a=0;a<d.length;a++)"function"===typeof d[a].handler&&(b+=500,setTimeout(d[a].handler,b))});c.guardrails={register:function(b,a){d.push({name:b,handler:a})}}},"guardrails")(window);
/* ◬ */
</script>
</div>
<noscript>
&lt;img height="1" width="1" style='display:none;visibility:hidden;' src='//fls-na.amazon.com/1/batch/1/OP/ATVPDKIKX0DER:147-0816675-1753153:NDW9PCFNDRXWFHQVWR24$uedata=s:%2Fgp%2Fuedata%3Fnoscript%26id%3DNDW9PCFNDRXWFHQVWR24:0' alt=""/&gt;
</noscript>
</div>
<!-- _
.__(.)< (MEOW)
\___)
~~~~~~~~~~~~~~~~~~-->
<!-- sp:eh:LyoAGDC51aUqacEwJycKkNDWTtcNyRPU8JWWSeHo7676G3RvZ+K08y8hT/MPpfa6dBu/TpWYXVU7zOdHev/zVpJ/sLlNPROeyJLkXtXDgG1cOBEk -->
<div id="vas-twister-loading" style="top: 118px; left: 0px; height: 667px; display: none;"><div id="vas-twister-spinner"></div></div><div id="a-white"></div><div id="a-popover-root" style="z-index:-1;position:absolute;"></div><script type="text/html" id="a9-suggestion-template"><div id='<#= suggestionId #>'class='suggest_row a9_suggestion'><div class='suggest_link2 isRTL' dir='auto'><span> <b><#= bprefix #></b><#= prefix #><b><#= suffix #></span></b></div></div></script><script type="text/html" id="suggestions-template"><div id='suggestions-template'><div id='suggestions2' class=''><# if (typeof suggestions !== 'undefined') { for(var i=0; i < suggestions.length; i++){ var displayString = suggestions[i].display; #><#= displayString #> <# } } #> </div> </div></script><script type="text/html" id="a9xc-suggestion-template"><div id='<#= suggestionId #>' class='suggest_row cross_category_suggestion'><div class='suggest_link isRTL' dir='auto'> <span> <#= bprefix #><b><#= prefix #></b><#= suffix #> </span><span class='suggestion_search_scope'><#= storeText #> </span></div><div class='suggest_delete suggest_builder'></div></div></script></body></html>