202 lines
230 KiB
JavaScript
202 lines
230 KiB
JavaScript
this.driver=this.driver||{},this.driver.js=(function(y){"use strict";let P={};function _(e={}){P={animate:!0,allowClose:!0,overlayOpacity:.7,smoothScroll:!1,disableActiveInteraction:!1,showProgress:!1,stagePadding:10,stageRadius:5,popoverOffset:10,showButtons:["next","previous","close"],disableButtons:[],overlayColor:"#000",...e}}function a(e){return e?P[e]:P}function c(e,t,i,s){return(e/=s/2)<1?i/2*e*e+t:-i/2*(--e*(e-2)-1)+t}function r(e){const t='a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])';return e.flatMap(i=>{const s=i.matches(t),o=Array.from(i.querySelectorAll(t));return[...s?[i]:[],...o]}).filter(i=>getComputedStyle(i).pointerEvents!=="none"&&k(i))}function n(e){if(!e||A(e))return;const t=a("smoothScroll");e.scrollIntoView({behavior:!t||v(e)?"auto":"smooth",inline:"center",block:"center"})}function v(e){if(!e||!e.parentElement)return;const t=e.parentElement;return t.scrollHeight>t.clientHeight}function A(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}function k(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}let m={};function C(e,t){m[e]=t}function l(e){return e?m[e]:m}function u(){m={}}let b={};function $(e,t){b[e]=t}function L(e){var t;(t=b[e])==null||t.call(b)}function R(){b={}}function j(e,t,i,s){let o=l("__activeStagePosition");const h=o||i.getBoundingClientRect(),T=s.getBoundingClientRect(),x=c(e,h.x,T.x-h.x,t),p=c(e,h.y,T.y-h.y,t),S=c(e,h.width,T.width-h.width,t),d=c(e,h.height,T.height-h.height,t);o={x,y:p,width:S,height:d},X(o),C("__activeStagePosition",o)}function Q(e){if(!e)return;const t=e.getBoundingClientRect(),i={x:t.x,y:t.y,width:t.width,height:t.height};C("__activeStagePosition",i),X(i)}function le(){const e=l("__activeStagePosition"),t=l("__overlaySvg");if(!e)return;if(!t){console.warn("No stage svg found.");return}const i=window.innerWidth,s=window.innerHeight;t.setAttribute("viewBox",`0 0 ${i} ${s}`)}function de(e){const t=pe(e);document.body.appendChild(t),re(t,i=>{i.target.tagName==="path"&&L("overlayClick")}),C("__overlaySvg",t)}function X(e){const t=l("__overlaySvg");if(!t){de(e);return}const i=t.firstElementChild;if(i?.tagName!=="path")throw new Error("no path element found in stage svg");i.setAttribute("d",Z(e))}function pe(e){const t=window.innerWidth,i=window.innerHeight,s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("driver-overlay","driver-overlay-animated"),s.setAttribute("viewBox",`0 0 ${t} ${i}`),s.setAttribute("xmlSpace","preserve"),s.setAttribute("xmlnsXlink","http://www.w3.org/1999/xlink"),s.setAttribute("version","1.1"),s.setAttribute("preserveAspectRatio","xMinYMin slice"),s.style.fillRule="evenodd",s.style.clipRule="evenodd",s.style.strokeLinejoin="round",s.style.strokeMiterlimit="2",s.style.zIndex="10000",s.style.position="fixed",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%";const o=document.createElementNS("http://www.w3.org/2000/svg","path");return o.setAttribute("d",Z(e)),o.style.fill=a("overlayColor")||"rgb(0,0,0)",o.style.opacity=`${a("overlayOpacity")}`,o.style.pointerEvents="auto",o.style.cursor="auto",s.appendChild(o),s}function Z(e){const t=window.innerWidth,i=window.innerHeight,s=a("stagePadding")||0,o=a("stageRadius")||0,h=e.width+s*2,T=e.height+s*2,x=Math.min(o,h/2,T/2),p=Math.floor(Math.max(x,0)),S=e.x-s+p,d=e.y-s,g=h-p*2,f=T-p*2;return`M${t},0L0,0L0,${i}L${t},${i}L${t},0Z
|
|
M${S},${d} h${g} a${p},${p} 0 0 1 ${p},${p} v${f} a${p},${p} 0 0 1 -${p},${p} h-${g} a${p},${p} 0 0 1 -${p},-${p} v-${f} a${p},${p} 0 0 1 ${p},-${p} z`}function ce(){const e=l("__overlaySvg");e&&e.remove()}function ue(){const e=document.getElementById("driver-dummy-element");if(e)return e;let t=document.createElement("div");return t.id="driver-dummy-element",t.style.width="0",t.style.height="0",t.style.pointerEvents="none",t.style.opacity="0",t.style.position="fixed",t.style.top="50%",t.style.left="50%",document.body.appendChild(t),t}function ee(e){const{element:t}=e;let i=typeof t=="string"?document.querySelector(t):t;i||(i=ue()),he(i,e)}function me(){const e=l("__activeElement"),t=l("__activeStep");e&&(Q(e),le(),ae(e,t))}function he(e,t){const i=Date.now(),s=l("__activeStep"),o=l("__activeElement")||e,h=!o||o===e,T=e.id==="driver-dummy-element",x=o.id==="driver-dummy-element",p=a("animate"),S=t.onHighlightStarted||a("onHighlightStarted"),d=t?.onHighlighted||a("onHighlighted"),g=s?.onDeselected||a("onDeselected"),f=a(),D=l();!h&&g&&g(x?void 0:o,s,{config:f,state:D}),S&&S(T?void 0:e,t,{config:f,state:D});const B=!h&&p;let E=!1;we(),C("previousStep",s),C("previousElement",o),C("activeStep",t),C("activeElement",e);const w=()=>{if(l("__transitionCallback")!==w)return;const I=Date.now()-i,O=400-I<=400/2;t.popover&&O&&!E&&B&&(oe(e,t),E=!0),a("animate")&&I<400?j(I,400,o,e):(Q(e),d&&d(T?void 0:e,t,{config:a(),state:l()}),C("__transitionCallback",void 0),C("__previousStep",s),C("__previousElement",o),C("__activeStep",t),C("__activeElement",e)),window.requestAnimationFrame(w)};C("__transitionCallback",w),window.requestAnimationFrame(w),n(e),!B&&t.popover&&oe(e,t),o.classList.remove("driver-active-element","driver-no-interaction"),o.removeAttribute("aria-haspopup"),o.removeAttribute("aria-expanded"),o.removeAttribute("aria-controls"),a("disableActiveInteraction")&&e.classList.add("driver-no-interaction"),e.classList.add("driver-active-element"),e.setAttribute("aria-haspopup","dialog"),e.setAttribute("aria-expanded","true"),e.setAttribute("aria-controls","driver-popover-content")}function ge(){var e;(e=document.getElementById("driver-dummy-element"))==null||e.remove(),document.querySelectorAll(".driver-active-element").forEach(t=>{t.classList.remove("driver-active-element","driver-no-interaction"),t.removeAttribute("aria-haspopup"),t.removeAttribute("aria-expanded"),t.removeAttribute("aria-controls")})}function U(){const e=l("__resizeTimeout");e&&window.cancelAnimationFrame(e),C("__resizeTimeout",window.requestAnimationFrame(me))}function ve(e){var t;if(!l("isInitialized")||!(e.key==="Tab"||e.keyCode===9))return;const i=l("__activeElement"),s=(t=l("popover"))==null?void 0:t.wrapper,o=r([...s?[s]:[],...i?[i]:[]]),h=o[0],T=o[o.length-1];if(e.preventDefault(),e.shiftKey){const x=o[o.indexOf(document.activeElement)-1]||T;x?.focus()}else{const x=o[o.indexOf(document.activeElement)+1]||h;x?.focus()}}function te(e){var t;((t=a("allowKeyboardControl"))==null||t)&&(e.key==="Escape"?L("escapePress"):e.key==="ArrowRight"?L("arrowRightPress"):e.key==="ArrowLeft"&&L("arrowLeftPress"))}function re(e,t,i){const s=(o,h)=>{const T=o.target;e.contains(T)&&((!i||i(T))&&(o.preventDefault(),o.stopPropagation(),o.stopImmediatePropagation()),h?.(o))};document.addEventListener("pointerdown",s,!0),document.addEventListener("mousedown",s,!0),document.addEventListener("pointerup",s,!0),document.addEventListener("mouseup",s,!0),document.addEventListener("click",o=>{s(o,t)},!0)}function fe(){window.addEventListener("keyup",te,!1),window.addEventListener("keydown",ve,!1),window.addEventListener("resize",U),window.addEventListener("scroll",U)}function ye(){window.removeEventListener("keyup",te),window.removeEventListener("resize",U),window.removeEventListener("scroll",U)}function we(){const e=l("popover");e&&(e.wrapper.style.display="none")}function oe(e,t){var i,s;let o=l("popover");o&&document.body.removeChild(o.wrapper),o=Se(),document.body.appendChild(o.wrapper);const{title:h,description:T,showButtons:x,disableButtons:p,showProgress:S,nextBtnText:d=a("nextBtnText")||"Next →",prevBtnText:g=a("prevBtnText")||"← Previous",progressText:f=a("progressText")||"{current} of {total}"}=t.popover||{};o.nextButton.innerHTML=d,o.previousButton.innerHTML=g,o.progress.innerHTML=f,h?(o.title.innerHTML=h,o.title.style.display="block"):o.title.style.display="none",T?(o.description.innerHTML=T,o.description.style.display="block"):o.description.style.display="none";const D=x||a("showButtons"),B=S||a("showProgress")||!1,E=D?.includes("next")||D?.includes("previous")||B;o.closeButton.style.display=D.includes("close")?"block":"none",E?(o.footer.style.display="flex",o.progress.style.display=B?"block":"none",o.nextButton.style.display=D.includes("next")?"block":"none",o.previousButton.style.display=D.includes("previous")?"block":"none"):o.footer.style.display="none";const w=p||a("disableButtons")||[];w!=null&&w.includes("next")&&(o.nextButton.disabled=!0,o.nextButton.classList.add("driver-popover-btn-disabled")),w!=null&&w.includes("previous")&&(o.previousButton.disabled=!0,o.previousButton.classList.add("driver-popover-btn-disabled")),w!=null&&w.includes("close")&&(o.closeButton.disabled=!0,o.closeButton.classList.add("driver-popover-btn-disabled"));const I=o.wrapper;I.style.display="block",I.style.left="",I.style.top="",I.style.bottom="",I.style.right="",I.id="driver-popover-content",I.setAttribute("role","dialog"),I.setAttribute("aria-labelledby","driver-popover-title"),I.setAttribute("aria-describedby","driver-popover-description");const O=o.arrow;O.className="driver-popover-arrow";const z=((i=t.popover)==null?void 0:i.popoverClass)||a("popoverClass")||"";I.className=`driver-popover ${z}`.trim(),re(o.wrapper,F=>{var V,G,q;const W=F.target,Y=((V=t.popover)==null?void 0:V.onNextClick)||a("onNextClick"),K=((G=t.popover)==null?void 0:G.onPrevClick)||a("onPrevClick"),J=((q=t.popover)==null?void 0:q.onCloseClick)||a("onCloseClick");if(W.classList.contains("driver-popover-next-btn"))return Y?Y(e,t,{config:a(),state:l()}):L("nextClick");if(W.classList.contains("driver-popover-prev-btn"))return K?K(e,t,{config:a(),state:l()}):L("prevClick");if(W.classList.contains("driver-popover-close-btn"))return J?J(e,t,{config:a(),state:l()}):L("closeClick")},F=>!(o!=null&&o.description.contains(F))&&!(o!=null&&o.title.contains(F))&&typeof F.className=="string"&&F.className.includes("driver-popover")),C("popover",o);const N=((s=t.popover)==null?void 0:s.onPopoverRender)||a("onPopoverRender");N&&N(o,{config:a(),state:l()}),ae(e,t),n(I);const M=e.classList.contains("driver-dummy-element"),H=r([I,...M?[]:[e]]);H.length>0&&H[0].focus()}function ie(){const e=l("popover");if(!(e!=null&&e.wrapper))return;const t=e.wrapper.getBoundingClientRect(),i=a("stagePadding")||0,s=a("popoverOffset")||0;return{width:t.width+i+s,height:t.height+i+s,realWidth:t.width,realHeight:t.height}}function ne(e,t){const{elementDimensions:i,popoverDimensions:s,popoverPadding:o,popoverArrowDimensions:h}=t;return e==="start"?Math.max(Math.min(i.top-o,window.innerHeight-s.realHeight-h.width),h.width):e==="end"?Math.max(Math.min(i.top-s?.realHeight+i.height+o,window.innerHeight-s?.realHeight-h.width),h.width):e==="center"?Math.max(Math.min(i.top+i.height/2-s?.realHeight/2,window.innerHeight-s?.realHeight-h.width),h.width):0}function se(e,t){const{elementDimensions:i,popoverDimensions:s,popoverPadding:o,popoverArrowDimensions:h}=t;return e==="start"?Math.max(Math.min(i.left-o,window.innerWidth-s.realWidth-h.width),h.width):e==="end"?Math.max(Math.min(i.left-s?.realWidth+i.width+o,window.innerWidth-s?.realWidth-h.width),h.width):e==="center"?Math.max(Math.min(i.left+i.width/2-s?.realWidth/2,window.innerWidth-s?.realWidth-h.width),h.width):0}function ae(e,t){const i=l("popover");if(!i)return;const{align:s="start",side:o="left"}=t?.popover||{},h=s,T=e.id==="driver-dummy-element"?"over":o,x=a("stagePadding")||0,p=ie(),S=i.arrow.getBoundingClientRect(),d=e.getBoundingClientRect(),g=d.top-p.height;let f=g>=0;const D=window.innerHeight-(d.bottom+p.height);let B=D>=0;const E=d.left-p.width;let w=E>=0;const I=window.innerWidth-(d.right+p.width);let O=I>=0;const z=!f&&!B&&!w&&!O;let N=T;if(T==="top"&&f?O=w=B=!1:T==="bottom"&&B?O=w=f=!1:T==="left"&&w?O=f=B=!1:T==="right"&&O&&(w=f=B=!1),T==="over"){const M=window.innerWidth/2-p.realWidth/2,H=window.innerHeight/2-p.realHeight/2;i.wrapper.style.left=`${M}px`,i.wrapper.style.right="auto",i.wrapper.style.top=`${H}px`,i.wrapper.style.bottom="auto"}else if(z){const M=window.innerWidth/2-p?.realWidth/2,H=10;i.wrapper.style.left=`${M}px`,i.wrapper.style.right="auto",i.wrapper.style.bottom=`${H}px`,i.wrapper.style.top="auto"}else if(w){const M=Math.min(E,window.innerWidth-p?.realWidth-S.width),H=ne(h,{elementDimensions:d,popoverDimensions:p,popoverPadding:x,popoverArrowDimensions:S});i.wrapper.style.left=`${M}px`,i.wrapper.style.top=`${H}px`,i.wrapper.style.bottom="auto",i.wrapper.style.right="auto",N="left"}else if(O){const M=Math.min(I,window.innerWidth-p?.realWidth-S.width),H=ne(h,{elementDimensions:d,popoverDimensions:p,popoverPadding:x,popoverArrowDimensions:S});i.wrapper.style.right=`${M}px`,i.wrapper.style.top=`${H}px`,i.wrapper.style.bottom="auto",i.wrapper.style.left="auto",N="right"}else if(f){const M=Math.min(g,window.innerHeight-p.realHeight-S.width);let H=se(h,{elementDimensions:d,popoverDimensions:p,popoverPadding:x,popoverArrowDimensions:S});i.wrapper.style.top=`${M}px`,i.wrapper.style.left=`${H}px`,i.wrapper.style.bottom="auto",i.wrapper.style.right="auto",N="top"}else if(B){const M=Math.min(D,window.innerHeight-p?.realHeight-S.width);let H=se(h,{elementDimensions:d,popoverDimensions:p,popoverPadding:x,popoverArrowDimensions:S});i.wrapper.style.left=`${H}px`,i.wrapper.style.bottom=`${M}px`,i.wrapper.style.top="auto",i.wrapper.style.right="auto",N="bottom"}z?i.arrow.classList.add("driver-popover-arrow-none"):be(h,N,e)}function be(e,t,i){const s=l("popover");if(!s)return;const o=i.getBoundingClientRect(),h=ie(),T=s.arrow,x=h.width,p=window.innerWidth,S=o.width,d=o.left,g=h.height,f=window.innerHeight,D=o.top,B=o.height;T.className="driver-popover-arrow";let E=t,w=e;t==="top"?(d+S<=0?(E="right",w="end"):d+S-x<=0&&(E="top",w="start"),d>=p?(E="left",w="end"):d+x>=p&&(E="top",w="end")):t==="bottom"?(d+S<=0?(E="right",w="start"):d+S-x<=0&&(E="bottom",w="start"),d>=p?(E="left",w="start"):d+x>=p&&(E="bottom",w="end")):t==="left"?(D+B<=0?(E="bottom",w="end"):D+B-g<=0&&(E="left",w="start"),D>=f?(E="top",w="end"):D+g>=f&&(E="left",w="end")):t==="right"&&(D+B<=0?(E="bottom",w="start"):D+B-g<=0&&(E="right",w="start"),D>=f?(E="top",w="start"):D+g>=f&&(E="right",w="end")),E?(T.classList.add(`driver-popover-arrow-side-${E}`),T.classList.add(`driver-popover-arrow-align-${w}`)):T.classList.add("driver-popover-arrow-none")}function Se(){const e=document.createElement("div");e.classList.add("driver-popover");const t=document.createElement("div");t.classList.add("driver-popover-arrow");const i=document.createElement("header");i.id="driver-popover-title",i.classList.add("driver-popover-title"),i.style.display="none",i.innerText="Popover Title";const s=document.createElement("div");s.id="driver-popover-description",s.classList.add("driver-popover-description"),s.style.display="none",s.innerText="Popover description is here";const o=document.createElement("button");o.type="button",o.classList.add("driver-popover-close-btn"),o.setAttribute("aria-label","Close"),o.innerHTML="×";const h=document.createElement("footer");h.classList.add("driver-popover-footer");const T=document.createElement("span");T.classList.add("driver-popover-progress-text"),T.innerText="";const x=document.createElement("span");x.classList.add("driver-popover-navigation-btns");const p=document.createElement("button");p.type="button",p.classList.add("driver-popover-prev-btn"),p.innerHTML="← Previous";const S=document.createElement("button");return S.type="button",S.classList.add("driver-popover-next-btn"),S.innerHTML="Next →",x.appendChild(p),x.appendChild(S),h.appendChild(T),h.appendChild(x),e.appendChild(o),e.appendChild(t),e.appendChild(i),e.appendChild(s),e.appendChild(h),{wrapper:e,arrow:t,title:i,description:s,footer:h,previousButton:p,nextButton:S,closeButton:o,footerButtons:x,progress:T}}function Te(){var e;const t=l("popover");t&&((e=t.wrapper.parentElement)==null||e.removeChild(t.wrapper))}const De="";function Ce(e={}){_(e);function t(){a("allowClose")&&S()}function i(){const d=l("activeIndex"),g=a("steps")||[];if(typeof d>"u")return;const f=d+1;g[f]?p(f):S()}function s(){const d=l("activeIndex"),g=a("steps")||[];if(typeof d>"u")return;const f=d-1;g[f]?p(f):S()}function o(d){(a("steps")||[])[d]?p(d):S()}function h(){var d;if(l("__transitionCallback"))return;const g=l("activeIndex"),f=l("__activeStep"),D=l("__activeElement");if(typeof g>"u"||typeof f>"u"||typeof l("activeIndex")>"u")return;const B=((d=f.popover)==null?void 0:d.onPrevClick)||a("onPrevClick");if(B)return B(D,f,{config:a(),state:l()});s()}function T(){var d;if(l("__transitionCallback"))return;const g=l("activeIndex"),f=l("__activeStep"),D=l("__activeElement");if(typeof g>"u"||typeof f>"u")return;const B=((d=f.popover)==null?void 0:d.onNextClick)||a("onNextClick");if(B)return B(D,f,{config:a(),state:l()});i()}function x(){l("isInitialized")||(C("isInitialized",!0),document.body.classList.add("driver-active",a("animate")?"driver-fade":"driver-simple"),fe(),$("overlayClick",t),$("escapePress",t),$("arrowLeftPress",h),$("arrowRightPress",T))}function p(d=0){var g,f,D,B,E,w,I,O;const z=a("steps");if(!z){console.error("No steps to drive through"),S();return}if(!z[d]){S();return}C("__activeOnDestroyed",document.activeElement),C("activeIndex",d);const N=z[d],M=z[d+1],H=z[d-1],F=((g=N.popover)==null?void 0:g.doneBtnText)||a("doneBtnText")||"Done",V=a("allowClose"),G=typeof((f=N.popover)==null?void 0:f.showProgress)<"u"?(D=N.popover)==null?void 0:D.showProgress:a("showProgress"),q=(((B=N.popover)==null?void 0:B.progressText)||a("progressText")||"{{current}} of {{total}}").replace("{{current}}",`${d+1}`).replace("{{total}}",`${z.length}`),W=((E=N.popover)==null?void 0:E.showButtons)||a("showButtons"),Y=["next","previous",...V?["close"]:[]].filter(xe=>!(W!=null&&W.length)||W.includes(xe)),K=((w=N.popover)==null?void 0:w.onNextClick)||a("onNextClick"),J=((I=N.popover)==null?void 0:I.onPrevClick)||a("onPrevClick"),ke=((O=N.popover)==null?void 0:O.onCloseClick)||a("onCloseClick");ee({...N,popover:{showButtons:Y,nextBtnText:M?void 0:F,disableButtons:[...H?[]:["previous"]],showProgress:G,progressText:q,onNextClick:K||(()=>{M?p(d+1):S()}),onPrevClick:J||(()=>{p(d-1)}),onCloseClick:ke||(()=>{S()}),...N?.popover||{}}})}function S(d=!0){const g=l("__activeElement"),f=l("__activeStep"),D=l("__activeOnDestroyed"),B=a("onDestroyStarted");if(d&&B){const I=!g||g?.id==="driver-dummy-element";B(I?void 0:g,f,{config:a(),state:l()});return}const E=f?.onDeselected||a("onDeselected"),w=a("onDestroyed");if(document.body.classList.remove("driver-active","driver-fade","driver-simple"),ye(),Te(),ge(),ce(),R(),u(),g&&f){const I=g.id==="driver-dummy-element";E&&E(I?void 0:g,f,{config:a(),state:l()}),w&&w(I?void 0:g,f,{config:a(),state:l()})}D&&D.focus()}return{isActive:()=>l("isInitialized")||!1,refresh:U,drive:(d=0)=>{x(),p(d)},setConfig:_,setSteps:d=>{u(),_({...a(),steps:d})},getConfig:a,getState:l,getActiveIndex:()=>l("activeIndex"),isFirstStep:()=>l("activeIndex")===0,isLastStep:()=>{const d=a("steps")||[],g=l("activeIndex");return g!==void 0&&g===d.length-1},getActiveStep:()=>l("activeStep"),getActiveElement:()=>l("activeElement"),getPreviousElement:()=>l("previousElement"),getPreviousStep:()=>l("previousStep"),moveNext:i,movePrevious:s,moveTo:o,hasNextStep:()=>{const d=a("steps")||[],g=l("activeIndex");return g!==void 0&&d[g+1]},hasPreviousStep:()=>{const d=a("steps")||[],g=l("activeIndex");return g!==void 0&&d[g-1]},highlight:d=>{x(),ee({...d,popover:d.popover?{showButtons:[],showProgress:!1,progressText:"",...d.popover}:void 0})},destroy:()=>{S(!1)}}}return y.driver=Ce,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"}),y})({}),(function(y){"use strict";const P=new ErrorHandler,_=(...c)=>{y.DASHCADDY_DEBUG&&console.log(...c)};class a{constructor(r="dashcaddy_onboarding"){this.storageKey=r,this.storageVersion="1.0",this.installOnboardingCompleted=typeof SITE<"u"&&SITE.onboardingCompleted===!0,this._initializeStorage(),this._updateLastVisit()}_initializeStorage(){const r=this._getStorage();if(!r||r.version!==this.storageVersion){const n={version:this.storageVersion,tourCompleted:!1,completedTooltips:[],currentStep:0,completionTimestamp:null,dnsSetupDeferred:!1,lastVisit:new Date().toISOString()};this._setStorage(n)}}_getStorage(){try{const r=localStorage.getItem(this.storageKey);return r?JSON.parse(r):null}catch(r){return P.logError("[ProgressTracker] Read Storage",r,{function:"_getStorage"}),null}}_setStorage(r){try{localStorage.setItem(this.storageKey,JSON.stringify(r))}catch(n){P.logError("[ProgressTracker] Write Storage",n,{function:"_setStorage"}),this._handleStorageError(n)}}_handleStorageError(r){try{sessionStorage.setItem(this.storageKey,JSON.stringify(this._getStorage())),console.warn("[ProgressTracker] Falling back to session storage")}catch(n){P.logError("[ProgressTracker] Session Storage Unavailable",n,{function:"_handleStorageError"})}}_updateLastVisit(){const r=this._getStorage();r&&(r.lastVisit=new Date().toISOString(),this._setStorage(r))}isTooltipCompleted(r){const n=this._getStorage();return n?n.completedTooltips.includes(r):!1}markTooltipCompleted(r){const n=this._getStorage();n&&(n.completedTooltips.includes(r)||(n.completedTooltips.push(r),n.tooltipTimestamps||(n.tooltipTimestamps={}),n.tooltipTimestamps[r]=new Date().toISOString(),this._setStorage(n)))}isTourCompleted(){const r=this._getStorage();return r?r.tourCompleted===!0:!1}isInstallOnboardingCompleted(){return this.installOnboardingCompleted===!0}async markInstallOnboardingCompleted(){if(!this.installOnboardingCompleted){this.installOnboardingCompleted=!0,typeof SITE<"u"&&(SITE.onboardingCompleted=!0);try{await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({onboardingCompleted:!0})})}catch(r){P.logError("[ProgressTracker] Persist Install Onboarding",r,{function:"markInstallOnboardingCompleted"})}}}markTourCompleted(){const r=this._getStorage();r&&(r.tourCompleted=!0,r.completionTimestamp=new Date().toISOString(),this._setStorage(r))}getCurrentStep(){const r=this._getStorage();return r&&r.currentStep||0}setCurrentStep(r){const n=this._getStorage();n&&(n.currentStep=r,this._setStorage(n))}resetProgress(){const r={version:this.storageVersion,tourCompleted:!1,completedTooltips:[],currentStep:0,completionTimestamp:null,dnsSetupDeferred:!1,lastVisit:new Date().toISOString()};this._setStorage(r)}getCompletionTimestamp(){const r=this._getStorage();return!r||!r.completionTimestamp?null:new Date(r.completionTimestamp)}isDnsSetupDeferred(){const r=this._getStorage();return r?r.dnsSetupDeferred===!0:!1}markDnsSetupDeferred(){const r=this._getStorage();r&&(r.dnsSetupDeferred=!0,this._setStorage(r))}getTooltipTimestamp(r){const n=this._getStorage();return!n||!n.tooltipTimestamps||!n.tooltipTimestamps[r]?null:new Date(n.tooltipTimestamps[r])}getCompletedTooltips(){const r=this._getStorage();return r?r.completedTooltips||[]:[]}getLastVisit(){const r=this._getStorage();return!r||!r.lastVisit?null:new Date(r.lastVisit)}}y.ProgressTracker=a,_("[ProgressTracker] Module loaded")})(window),(function(y){"use strict";const P=new ErrorHandler,_=(...r)=>{y.DASHCADDY_DEBUG&&console.log(...r)},a={dark:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(0, 0, 0, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},light:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent-strong)",overlayColor:"rgba(0, 0, 0, 0.5)",borderColor:"var(--border)",highlightColor:"var(--accent-strong)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},blue:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(25, 8, 172, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},nord:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(46, 52, 64, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},dracula:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(40, 42, 54, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},"solarized-dark":{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(0, 43, 54, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},"solarized-light":{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(253, 246, 227, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"}};class c{constructor(){this.currentTheme=this.getCurrentTheme(),this.themeChangeCallbacks=[],this._setupThemeChangeListener()}getCurrentTheme(){const n=document.documentElement,v=Array.from(n.classList);return(y.THEMES||[]).filter(m=>m!=="dark").find(m=>v.includes(m))||"dark"}getDriverTheme(){const n=this.getCurrentTheme(),v=a[n]||a.dark,A={};for(const[k,m]of Object.entries(v))if(typeof m=="string"&&m.startsWith("var(")){const C=m.match(/var\((--[^)]+)\)/)?.[1];if(C){const l=getComputedStyle(document.documentElement).getPropertyValue(C).trim();A[k]=l||m}else A[k]=m}else A[k]=m;return A}onThemeChange(n){typeof n=="function"&&this.themeChangeCallbacks.push(n)}_setupThemeChangeListener(){const n=document.documentElement;new MutationObserver(A=>{A.forEach(k=>{if(k.type==="attributes"&&k.attributeName==="class"){const m=this.getCurrentTheme();if(m!==this.currentTheme){const C=this.currentTheme;this.currentTheme=m,this._notifyThemeChange(m,C)}}})}).observe(n,{attributes:!0,attributeFilter:["class"]}),_("[ThemeAdapter] Theme change listener initialized")}_notifyThemeChange(n,v){_(`[ThemeAdapter] Theme changed: ${v} \u2192 ${n}`),this.themeChangeCallbacks.forEach(A=>{try{A(n,v)}catch(k){P.logError("[ThemeAdapter] Theme Change Callback",k,{function:"_notifyThemeChange"})}})}applyTheme(n){if(!n){console.warn("[ThemeAdapter] No driver instance provided");return}const v=this.getDriverTheme();this._injectDriverStyles(v),_("[ThemeAdapter] Theme applied to driver:",this.currentTheme)}_injectDriverStyles(n){const v=document.getElementById("driver-theme-styles");v&&v.remove();const A=document.createElement("style");A.id="driver-theme-styles",A.textContent=`
|
|
.driver-popover {
|
|
background: ${n.backgroundColor} !important;
|
|
color: ${n.textColor} !important;
|
|
border: 1px solid ${n.borderColor} !important;
|
|
border-radius: 12px !important;
|
|
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4) !important;
|
|
font-family: ${n.fontFamily} !important;
|
|
}
|
|
|
|
.driver-popover-title {
|
|
color: ${n.textColor} !important;
|
|
font-weight: 600 !important;
|
|
font-family: ${n.fontFamily} !important;
|
|
}
|
|
|
|
.driver-popover-description {
|
|
color: ${n.textColor} !important;
|
|
font-family: ${n.fontFamily} !important;
|
|
}
|
|
|
|
.driver-popover-footer button {
|
|
background: ${n.primaryColor} !important;
|
|
color: ${n.backgroundColor} !important;
|
|
border: none !important;
|
|
font-family: ${n.fontFamily} !important;
|
|
font-weight: 500 !important;
|
|
}
|
|
|
|
.driver-popover-footer button:hover {
|
|
opacity: 0.9 !important;
|
|
}
|
|
|
|
.driver-popover-close-btn {
|
|
color: ${n.textColor} !important;
|
|
}
|
|
|
|
.driver-overlay {
|
|
background: ${n.overlayColor} !important;
|
|
}
|
|
|
|
.driver-highlighted-element {
|
|
outline: 2px solid ${n.highlightColor} !important;
|
|
outline-offset: 4px !important;
|
|
}
|
|
|
|
.driver-popover-progress-text {
|
|
color: ${n.textColor} !important;
|
|
opacity: 0.7 !important;
|
|
font-family: ${n.fontFamily} !important;
|
|
}
|
|
`,document.head.appendChild(A)}getAvailableThemes(){return Object.keys(a)}isThemeAvailable(n){return a.hasOwnProperty(n)}}y.ThemeAdapter=c,_("[ThemeAdapter] Module loaded")})(window),(function(y){"use strict";const P=new ErrorHandler,_=(...u)=>{y.DASHCADDY_DEBUG&&console.log(...u)};function a(u){const b=[];if((!u.id||typeof u.id!="string")&&b.push("Tooltip must have a valid string id"),u.element||b.push("Tooltip must have an element selector or HTMLElement"),!u.popover||typeof u.popover!="object")b.push("Tooltip must have a popover object");else{if((!u.popover.title||typeof u.popover.title!="string")&&b.push("Tooltip popover must have a valid string title"),(!u.popover.description||typeof u.popover.description!="string")&&b.push("Tooltip popover must have a valid string description"),u.popover.position){const L=["top","bottom","left","right","center"];L.includes(u.popover.position)||b.push(`Invalid position: ${u.popover.position}. Must be one of: ${L.join(", ")}`)}if(u.popover.align){const L=["start","center","end"];L.includes(u.popover.align)||b.push(`Invalid align: ${u.popover.align}. Must be one of: ${L.join(", ")}`)}u.popover.showButtons&&!Array.isArray(u.popover.showButtons)&&b.push("showButtons must be an array"),["onNext","onPrevious","onClose","onSetupNow","onLater"].forEach(L=>{u.popover[L]&&typeof u.popover[L]!="function"&&b.push(`${L} must be a function`)})}return u.condition&&typeof u.condition!="function"&&b.push("condition must be a function"),u.priority!==void 0&&typeof u.priority!="number"&&b.push("priority must be a number"),{valid:b.length===0,errors:b}}function c(u){if(!Array.isArray(u))return{valid:!1,errors:[{tooltip:null,errors:["tooltips must be an array"]}]};const b=[],$=new Set;return u.forEach((L,R)=>{const j=a(L);j.valid||b.push({tooltip:L.id||`index ${R}`,errors:j.errors}),L.id&&($.has(L.id)&&b.push({tooltip:L.id,errors:[`Duplicate tooltip ID: ${L.id}`]}),$.add(L.id))}),{valid:b.length===0,errors:b}}class r extends Error{constructor(b,$=null){super(b),this.name="TooltipError",this.tooltipId=$}}function n(u){if(!u.valid){const b=u.errors.map($=>`${$.tooltip}: ${$.errors.join(", ")}`).join(`
|
|
`);throw P.logError("[TooltipDefinitions] Validation",b,{function:"validateTooltip"}),new r(`Tooltip validation failed:
|
|
${b}`)}}y.TooltipValidation={validateTooltipDefinition:a,validateTooltipDefinitions:c,handleValidationErrors:n,TooltipError:r},_("[TooltipDefinitions] Validation module loaded");const v=[{id:"welcome",element:"#brand",popover:{title:"Welcome to DashCaddy!",description:`
|
|
<p>Your unified control panel for <strong>Docker</strong>, <strong>Caddy</strong>, and <strong>DNS</strong> — all in one place.</p>
|
|
<p>This tour will walk you through every section so you know exactly where everything is.</p>
|
|
<p style="margin-top: 8px; font-size: 0.85rem; opacity: 0.7;">You can click your logo anytime to customize it.</p>
|
|
`,position:"bottom",align:"start",showButtons:["next"],showProgress:!0},priority:1},{id:"infrastructure",element:".top",popover:{title:"Infrastructure Overview",description:`
|
|
<p>This top row shows the backbone of your setup:</p>
|
|
<ul>
|
|
<li><strong>DNS1 / DNS2 / DNS3</strong> — your Technitium DNS servers</li>
|
|
<li><strong>Internet</strong> — live connectivity check with packet indicators</li>
|
|
<li><strong>Auth</strong> — TOTP authentication status</li>
|
|
<li><strong>DashCA</strong> — your certificate authority for your custom domain</li>
|
|
</ul>
|
|
<p style="font-size: 0.85rem; opacity: 0.7;">These core services are always pinned here, separate from your app grid.</p>
|
|
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:2},{id:"service-cards",element:"#cards",popover:{title:"Your App Grid",description:`
|
|
<p>Every app you deploy appears here as a card. Each one shows:</p>
|
|
<ul>
|
|
<li><strong>Status dot</strong> — green = online, red = offline (pulses when down)</li>
|
|
<li><strong>ON/OFF badge</strong> — current state at a glance</li>
|
|
<li><strong>Response time</strong> — how fast the service responds (color-coded)</li>
|
|
<li><strong>Uptime bar</strong> — historical uptime percentage</li>
|
|
</ul>
|
|
<p style="font-size: 0.85rem; opacity: 0.7;">Hover over a card to see action buttons: Logs, Restart, Update, Settings, and Open.</p>
|
|
`,position:"top",showButtons:["previous","next"],showProgress:!0},priority:3},{id:"app-selector",element:"#add-service-btn",popover:{title:"App Selector — Deploy in One Click",description:`
|
|
<p>Browse <strong>50+ self-hosted apps</strong> organized by category:</p>
|
|
<ul>
|
|
<li>Media (Plex, Jellyfin, Emby, Overseerr)</li>
|
|
<li>Downloads (*arr stack, qBittorrent, Transmission)</li>
|
|
<li>Productivity (Nextcloud, Vaultwarden, Gitea)</li>
|
|
<li>Monitoring (Uptime Kuma, Grafana, Prometheus)</li>
|
|
</ul>
|
|
<p>Each app deploys with Docker, Caddy reverse proxy, and DNS — fully configured automatically.</p>
|
|
<p style="margin-top: 6px; padding: 6px 10px; border-radius: 6px; background: rgba(241,196,15,0.12); border: 1px solid rgba(241,196,15,0.25); font-size: 0.85rem;">
|
|
<strong style="color: #f1c40f;">★ Premium:</strong> <strong>Recipes</strong> let you deploy entire stacks (e.g., full media server) in one click with pre-wired configs.
|
|
</p>
|
|
`,position:"top",showButtons:["previous","next"],showProgress:!0},priority:4,condition:()=>document.getElementById("add-service-btn")!==null},{id:"smart-arr",element:"#arr-setup-btn",popover:{title:"Smart Arr Connect",description:`
|
|
<p>Automatically wire up your entire media stack:</p>
|
|
<ul>
|
|
<li>Detects running Arr services (Radarr, Sonarr, Prowlarr, etc.)</li>
|
|
<li>Connects them together with the right API keys</li>
|
|
<li>Links Plex/Jellyfin to Overseerr for request management</li>
|
|
</ul>
|
|
<p style="font-size: 0.85rem; opacity: 0.7;">No manual API key copying — DashCaddy handles it all.</p>
|
|
`,position:"top",showButtons:["previous","next"],showProgress:!0},priority:5,condition:()=>document.getElementById("arr-setup-btn")!==null},{id:"add-manual",element:"#add-service",popover:{title:"Add App Manually",description:`
|
|
<p>Already have a service running? Add it to your dashboard manually.</p>
|
|
<p>You can add:</p>
|
|
<ul>
|
|
<li><strong>Docker containers</strong> — auto-detects running containers</li>
|
|
<li><strong>External services</strong> — any URL you want to monitor</li>
|
|
<li><strong>Test services</strong> — try the UI without deploying anything</li>
|
|
</ul>
|
|
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:6},{id:"theme-selector",element:"#theme",popover:{title:"Themes",description:`
|
|
<p>Switch between <strong>7 built-in themes</strong>:</p>
|
|
<p>Dark, Light, Blue, Nord, Dracula, Solarized Dark, and Solarized Light.</p>
|
|
<p>Your preference is saved automatically. You can also build custom themes with the Theme Builder (in Admin → settings).</p>
|
|
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:7},{id:"toolbar-status",element:'.tools-section[data-section="status"]',popover:{title:"Status Tools",description:`
|
|
<p>Click <strong>Status</strong> to expand these tools:</p>
|
|
<ul>
|
|
<li><strong>Monitor</strong> — live CPU, memory, and disk usage for every container</li>
|
|
<li><strong>Health</strong> — service health dashboard with uptime history and alerts</li>
|
|
<li><strong>Updates</strong> — check for and apply Docker image updates</li>
|
|
</ul>
|
|
<p style="font-size: 0.85rem; opacity: 0.7;">These sections remember whether you left them open or closed.</p>
|
|
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:8},{id:"toolbar-tools",element:'.tools-section[data-section="tools"]',popover:{title:"Operational Tools",description:`
|
|
<p>Click <strong>Tools</strong> for day-to-day operations:</p>
|
|
<ul>
|
|
<li><strong>Logs</strong> — view error logs from your API server and services</li>
|
|
<li><strong>Alerts</strong> — configure notification rules (email, webhook, etc.)</li>
|
|
<li><strong>Audit</strong> — full audit trail of every action taken in DashCaddy</li>
|
|
</ul>
|
|
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:9},{id:"toolbar-admin",element:'.tools-section[data-section="admin"]',popover:{title:"Admin & Configuration",description:`
|
|
<p>Click <strong>Admin</strong> for setup and maintenance:</p>
|
|
<ul>
|
|
<li><strong>Tokens</strong> — manage API keys for DNS and other integrations</li>
|
|
<li><strong>Export / Import</strong> — backup and restore your dashboard configuration</li>
|
|
<li><strong>Backup</strong> — full system backup and restore</li>
|
|
<li><strong>License</strong> — activate your license code to unlock premium features</li>
|
|
<li><strong>API</strong> — interactive API documentation (125+ endpoints)</li>
|
|
</ul>
|
|
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:10},{id:"weather",element:"#weather-widget",popover:{title:"Weather Widget",description:`
|
|
<p>Shows current conditions for your location. Click the <strong>gear icon</strong> to configure your city or switch temperature units.</p>
|
|
<p style="font-size: 0.85rem; opacity: 0.7;">Uses Open-Meteo — no API key required.</p>
|
|
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:11,condition:()=>document.getElementById("weather-widget")!==null},{id:"reload-caddy",element:"#reload-caddy-top",popover:{title:"Reload Caddy",description:`
|
|
<p>After changing Caddy configuration (adding reverse proxy rules, SSL settings, etc.), click here to apply the changes live.</p>
|
|
<p style="font-size: 0.85rem; opacity: 0.7;">This is a graceful reload — existing connections are not dropped.</p>
|
|
`,position:"bottom",align:"end",showButtons:["previous","next"],showProgress:!0},priority:12,condition:()=>document.getElementById("reload-caddy-top")!==null},{id:"tour-complete",element:"#brand",popover:{title:"You're All Set!",description:`
|
|
<p>That covers the essentials. A few tips to get the most out of DashCaddy:</p>
|
|
<ul>
|
|
<li><strong>Click any card</strong> to open that service directly</li>
|
|
<li><strong>Keyboard shortcuts</strong> — press <code>?</code> anytime to see them all</li>
|
|
<li><strong>DashCA</strong> — visit your CA page to install the root certificate on any device</li>
|
|
</ul>
|
|
<div style="margin-top: 10px; padding: 10px 12px; border-radius: 8px; background: linear-gradient(135deg, rgba(241,196,15,0.1), rgba(243,156,18,0.08)); border: 1px solid rgba(241,196,15,0.25);">
|
|
<p style="margin: 0 0 6px; font-weight: 600; color: #f1c40f;">★ Unlock Premium</p>
|
|
<p style="margin: 0; font-size: 0.85rem;">Premium adds powerful features for serious homelabbers:</p>
|
|
<ul style="margin: 6px 0 0; font-size: 0.85rem;">
|
|
<li><strong>Auto-Login SSO</strong> — sign into every app automatically, no more password juggling</li>
|
|
<li><strong>Recipes</strong> — deploy full stacks (media server, dev environment) in one click</li>
|
|
<li><strong>Docker Swarm</strong> — orchestrate multi-node clusters from your dashboard</li>
|
|
</ul>
|
|
<p style="margin: 8px 0 0; font-size: 0.82rem; opacity: 0.8;">Activate in <strong>Admin → License</strong></p>
|
|
</div>
|
|
<p style="margin-top: 10px; font-size: 0.85rem; opacity: 0.7;">You can restart this tour anytime from <strong>Admin → Help Tour</strong>.</p>
|
|
`,position:"bottom",align:"start",showButtons:["previous","close"],showProgress:!0},priority:13}];function A(){return v}function k(u){return v.find(b=>b.id===u)||null}function m(){return v.filter(u=>{if(u.condition&&typeof u.condition=="function")try{return u.condition()}catch(b){return P.logError("[TooltipDefinitions] Condition Eval",b,{function:"evaluateCondition",tooltipId:u.id}),!1}return!0})}function C(){return m().sort((b,$)=>{const L=b.priority||999,R=$.priority||999;return L-R})}function l(){return m().filter(b=>b.isNewFeature===!0).sort((b,$)=>{const L=b.priority||999,R=$.priority||999;return L-R})}y.TooltipDefinitions={TOOLTIP_DEFINITIONS:v,getTooltipDefinitions:A,getTooltipById:k,getActiveTooltips:m,getSortedTooltips:C,getNewFeatureTooltips:l},_("[TooltipDefinitions] Definitions loaded:",v.length,"tooltips")})(window),(function(y){"use strict";const P=(...a)=>{y.DASHCADDY_DEBUG&&console.log(...a)};class _{constructor(c){this.progressTracker=c,this.modal=null,this.onTemplateSelected=null,P("[DnsTemplateSelector] Module loaded")}getDnsTemplates(){return[{id:"technitium",name:"Technitium DNS Server",description:"Modern DNS server with web UI for managing private zones",icon:"\u{1F310}",difficulty:"Easy",features:["Web-based management interface","Private zone management for .sami domain","DHCP server integration","DNS-over-HTTPS and DNS-over-TLS support"],recommended:!0},{id:"bind9",name:"BIND9 DNS Server",description:"Industry-standard DNS server - powerful and flexible",icon:"\u{1F527}",difficulty:"Advanced",features:["Industry standard DNS server","Full RFC compliance","Advanced zone management","DNSSEC support"],recommended:!1},{id:"pihole",name:"Pi-hole",description:"Network-wide ad blocker with DNS capabilities",icon:"\u{1F6E1}\uFE0F",difficulty:"Intermediate",features:["Ad blocking at DNS level","Web interface for management","DHCP server included","Query logging and statistics"],recommended:!1},{id:"powerdns",name:"PowerDNS",description:"High-performance DNS server with SQL backend",icon:"\u26A1",difficulty:"Intermediate",features:["SQL database backend","RESTful API for automation","Geographic load balancing","DNSSEC support"],recommended:!1},{id:"coredns",name:"CoreDNS",description:"Cloud-native DNS server - lightweight and flexible",icon:"\u2601\uFE0F",difficulty:"Intermediate",features:["Plugin-based architecture","Kubernetes-native","Lightweight and fast","Prometheus metrics"],recommended:!1},{id:"cloudflare",name:"Cloudflare DNS",description:"Managed DNS with API access \u2014 no self-hosting needed",icon:"\u{1F536}",difficulty:"Easy",features:["Fully managed, no server needed","API for automated record management","Global anycast network","Free tier available"],recommended:!1,providerId:"cloudflare"},{id:"external",name:"External / Manual DNS",description:"Use your own DNS provider (cPanel, Route53, etc.)",icon:"\u{1F517}",difficulty:"Easy",features:["Works with any DNS provider","DashCaddy shows you what records to create","Propagation checking still works","No API credentials needed"],recommended:!1,providerId:"manual"}]}showTemplateSelector(){this.modal||this.createModal(),this.populateTemplates(),this.modal.style.display="flex",document.body.style.overflow="hidden"}createModal(){const c=document.createElement("div");c.id="dns-template-modal",c.className="dns-template-modal",c.innerHTML=`
|
|
<div class="dns-template-modal-content">
|
|
<div class="dns-template-header">
|
|
<h2>\u{1F310} Choose a DNS Server</h2>
|
|
<p>Setting up a DNS server is essential for managing your private .sami domain</p>
|
|
<button class="dns-template-close" aria-label="Close">×</button>
|
|
</div>
|
|
<div class="dns-template-grid" id="dns-template-grid">
|
|
<!-- Templates will be inserted here -->
|
|
</div>
|
|
<div class="dns-template-footer">
|
|
<button class="dns-template-later-btn" id="dns-setup-later">Set up later</button>
|
|
</div>
|
|
</div>
|
|
`,document.body.appendChild(c),this.modal=c,c.querySelector(".dns-template-close").addEventListener("click",()=>this.close()),c.querySelector("#dns-setup-later").addEventListener("click",()=>this.handleSetupLater()),c.addEventListener("click",r=>{r.target===c&&this.close()}),document.addEventListener("keydown",r=>{r.key==="Escape"&&c.style.display==="flex"&&this.close()})}populateTemplates(){const c=document.getElementById("dns-template-grid");if(!c)return;const r=this.getDnsTemplates();c.innerHTML="",r.forEach(n=>{const v=this.createTemplateCard(n);c.appendChild(v)})}createTemplateCard(c){const r=document.createElement("div");r.className="dns-template-card",c.recommended&&r.classList.add("recommended");const n=c.difficulty.toLowerCase();return r.innerHTML=`
|
|
${c.recommended?'<div class="recommended-badge">Recommended</div>':""}
|
|
<div class="dns-template-icon">${c.icon}</div>
|
|
<h3>${c.name}</h3>
|
|
<p class="dns-template-description">${c.description}</p>
|
|
<div class="dns-template-difficulty difficulty-${n}">
|
|
${c.difficulty}
|
|
</div>
|
|
<ul class="dns-template-features">
|
|
${c.features.slice(0,3).map(A=>`<li>${A}</li>`).join("")}
|
|
</ul>
|
|
<button class="dns-template-select-btn" data-template-id="${c.id}">
|
|
Select ${c.name}
|
|
</button>
|
|
`,r.querySelector(".dns-template-select-btn").addEventListener("click",()=>this.handleTemplateSelection(c)),r}handleTemplateSelection(c){P(`[DnsTemplateSelector] Template selected: ${c.id}`),this.close(),this.onTemplateSelected?this.onTemplateSelected(c):this.openAppSelector(c.id)}handleSetupLater(){P("[DnsTemplateSelector] DNS setup deferred"),this.progressTracker&&this.progressTracker.markDnsSetupDeferred(),this.close(),this.showNotification("DNS setup deferred. You can set it up later from the App Selector.")}openAppSelector(c){const r=document.querySelector('[onclick*="showAppSelector"]');r?(r.click(),setTimeout(()=>{const n=document.querySelector("#app-search");n&&(n.value=c,n.dispatchEvent(new Event("input",{bubbles:!0})))},300)):this.showNotification(`To deploy ${c}, use the App Selector and search for "${c}"`)}showNotification(c){const r=document.createElement("div");r.className="dns-template-notification",r.textContent=c,r.style.cssText=`
|
|
position: fixed;
|
|
top: 20px;
|
|
right: 20px;
|
|
background: var(--card-base);
|
|
color: var(--fg);
|
|
padding: 15px 20px;
|
|
border-radius: 8px;
|
|
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
|
|
z-index: 10001;
|
|
max-width: 300px;
|
|
`,document.body.appendChild(r),setTimeout(()=>{r.style.opacity="0",r.style.transition="opacity 0.3s",setTimeout(()=>r.remove(),300)},3e3)}close(){this.modal&&(this.modal.style.display="none",document.body.style.overflow="")}}y.DnsTemplateSelector=_,P("[DnsTemplateSelector] Module loaded")})(window),(function(y){"use strict";const P=new ErrorHandler,_=(...c)=>{y.DASHCADDY_DEBUG&&console.log(...c)};class a{constructor(r,n,v){this.progressTracker=r,this.themeAdapter=n,this.dnsTemplateSelector=v,this.driver=null,this.currentStepIndex=0,this.isActive=!1,this.resizeHandler=null,this.layoutChangeHandler=null}async initializeDriver(){const r=y.driver?.js?.driver||y.driver?.driver||y.driver;if(typeof r!="function")return P.logError("[TourManager] Driver.js Not Loaded",new Error("Driver.js not loaded or invalid"),{windowDriver:typeof y.driver}),!1;const n=this.themeAdapter.getDriverTheme();return this.driver=r({showProgress:!0,showButtons:["next","previous","close"],allowClose:!0,overlayClickNext:!1,overlayOpacity:.6,stagePadding:12,stageRadius:12,allowKeyboardControl:!0,popoverClass:"dashcaddy-popover",animate:!0,smoothScroll:!0,onDestroyed:()=>this.onTourComplete(),onDestroyStarted:()=>{this.progressTracker.isTourCompleted()||this.onTourSkip()}}),this.themeAdapter.applyTheme(this.driver),this.themeAdapter.onThemeChange(()=>{this.themeAdapter.applyTheme(this.driver)}),this.setupDynamicRepositioning(),!0}shouldAutoStart(){return!this.progressTracker.isInstallOnboardingCompleted()&&!this.progressTracker.isTourCompleted()&&this.progressTracker.getCurrentStep()===0}async startTour(){if(!this.driver&&!await this.initializeDriver())return;const r=y.TooltipDefinitions.getSortedTooltips(),n=this.progressTracker.getCompletedTooltips(),v=r.filter(k=>!n.includes(k.id));if(v.length===0){_("[TourManager] No tooltips to show"),this.progressTracker.markTourCompleted();return}const A=v.map((k,m)=>{const C=m===0,l=m===v.length-1,u={element:k.element,popover:{title:k.popover.title,description:k.popover.description,side:k.popover.position||"bottom",align:k.popover.align||"start",showButtons:this._getButtonsForStep(k,C,l),showProgress:k.popover.showProgress!==!1,onNextClick:()=>{this.progressTracker.markTooltipCompleted(k.id),this.progressTracker.setCurrentStep(m+1),this.currentStepIndex=m+1,this.driver.moveNext()},onPrevClick:()=>{this.progressTracker.setCurrentStep(Math.max(0,m-1)),this.currentStepIndex=Math.max(0,m-1),this.driver.movePrevious()},onCloseClick:()=>{this.skipTour()}}};return k.id==="dns-priority"&&this.dnsTemplateSelector&&(u.popover.onSetupNowClick=()=>{_("[TourManager] Opening DNS template selector"),this.dnsTemplateSelector.showTemplateSelector(),this.progressTracker.markTooltipCompleted(k.id),this.progressTracker.setCurrentStep(m+1),this.currentStepIndex=m+1,this.driver.moveNext()},u.popover.onLaterClick=()=>{_("[TourManager] DNS setup deferred"),this.progressTracker.markDnsSetupDeferred(),this.progressTracker.markTooltipCompleted(k.id),this.progressTracker.setCurrentStep(m+1),this.currentStepIndex=m+1,this.driver.moveNext()}),u});this.isActive=!0,this.driver.setSteps(A),this.driver.drive()}async resumeTour(){this.progressTracker.getCurrentStep()>0?await this.startTour():await this.startTour()}skipTour(){this.driver&&this.driver.destroy(),this.cleanupDynamicRepositioning(),this.isActive=!1}async restartTour(){this.progressTracker.resetProgress(),await this.startTour()}async showTooltip(r){const n=y.TooltipDefinitions.getTooltipById(r);if(!n){P.logError("[TourManager] Tooltip Not Found",new Error(`Tooltip not found: ${r}`),{tooltipId:r});return}this.driver||await this.initializeDriver();const v={element:n.element,popover:{title:n.popover.title,description:n.popover.description,side:n.popover.position||"bottom",align:n.popover.align||"start"}};this.driver.highlight(v)}async showWhatsNew(){if(!this.driver&&!await this.initializeDriver())return;const r=y.TooltipDefinitions.getNewFeatureTooltips();if(r.length===0){_("[TourManager] No new features to show");return}_(`[TourManager] Showing ${r.length} new features`);const n=r.map((v,A)=>{const k=A===0,m=A===r.length-1;return{element:v.element,popover:{title:`\u2728 NEW: ${v.popover.title}`,description:v.popover.description,side:v.popover.position||"bottom",align:v.popover.align||"start",showButtons:this._getButtonsForStep(v,k,m),showProgress:!0,onNextClick:()=>{this.driver.moveNext()},onPrevClick:()=>{this.driver.movePrevious()},onCloseClick:()=>{this.skipTour()}}}});this.isActive=!0,this.driver.setSteps(n),this.driver.drive()}setupDynamicRepositioning(){let r;this.resizeHandler=()=>{clearTimeout(r),r=setTimeout(()=>{this.isActive&&this.driver&&(_("[TourManager] Window resized, repositioning tooltip"),this.driver.refresh())},150)},this.layoutChangeHandler=()=>{this.isActive&&this.driver&&(_("[TourManager] Layout changed, repositioning tooltip"),setTimeout(()=>{this.driver&&this.driver.refresh()},100))},y.addEventListener("resize",this.resizeHandler),this.themeAdapter.onThemeChange(this.layoutChangeHandler)}cleanupDynamicRepositioning(){this.resizeHandler&&y.removeEventListener("resize",this.resizeHandler)}_getButtonsForStep(r,n,v){if(r.popover.showButtons)return r.popover.showButtons;const A=[];return n||A.push("previous"),v?A.push("close"):A.push("next"),A}onTourComplete(){this.progressTracker.markTourCompleted(),this.isActive=!1,_("[TourManager] Tour completed")}onTourSkip(){_("[TourManager] Tour skipped"),this.isActive=!1}}y.TourManager=a,_("[TourManager] Module loaded")})(window),(function(){"use strict";const y=(...m)=>{window.DASHCADDY_DEBUG&&console.log(...m)};let P,_,a,c,r;async function n(){try{if(y("[Onboarding] Initializing system..."),window.__dashcaddySiteConfigLoaded)try{await window.__dashcaddySiteConfigLoaded}catch{}if(r=new ErrorHandler,y("[Onboarding] Error Handler initialized"),P=new ProgressTracker("dashcaddy_onboarding"),y("[Onboarding] Progress Tracker initialized"),_=new ThemeAdapter,y("[Onboarding] Theme Adapter initialized"),c=new DnsTemplateSelector(P),y("[Onboarding] DNS Template Selector initialized"),a=new TourManager(P,_,c),y("[Onboarding] Tour Manager initialized"),a.shouldAutoStart())y("[Onboarding] Auto-starting tour for first-time install"),await P.markInstallOnboardingCompleted(),setTimeout(()=>{a.startTour()},1e3);else{const m=P.isTourCompleted(),C=P.getCurrentStep();y(`[Onboarding] Tour not auto-starting (completed: ${m}, step: ${C})`),!m&&C>0&&y("[Onboarding] Tour in progress, can be resumed manually")}v(),window.DashCaddyOnboarding={startTour:()=>a.startTour(),restartTour:()=>a.restartTour(),showTooltip:m=>a.showTooltip(m),showWhatsNew:()=>a.showWhatsNew(),resetProgress:()=>P.resetProgress(),getErrors:()=>r.getErrors(),getErrorStats:()=>r.getStatistics()},y("[Onboarding] System initialized successfully")}catch(m){r&&r.logError("[Onboarding] Initialization",m),console.warn("[Onboarding] System failed to initialize, dashboard will continue without onboarding")}}function v(){const m=document.querySelector(".tools-primary")||document.querySelector(".tools");if(!m)return;const C=()=>{a?(y("[Onboarding] Starting tour via button click"),a.restartTour()):(r&&r.logError("[Onboarding] Tour Manager Not Initialized",new Error("Tour manager not initialized")),alert(`Tour is not available. Check browser console for errors.
|
|
|
|
Possible issues:
|
|
- Driver.js library failed to load
|
|
- JavaScript errors during initialization`))},l=document.getElementById("restart-tour-btn");if(l){l.onclick=C;return}const u=document.createElement("button");u.id="restart-tour-btn",u.textContent="Help Tour",u.title="Restart the onboarding tour",u.onclick=C,m.appendChild(u)}function A(){return typeof(window.driver?.js?.driver||window.driver?.driver||window.driver)!="function"?(console.warn("[Onboarding] Driver.js not loaded yet, will retry... window.driver:",window.driver),!1):!0}function k(){let m=0;const C=10;function l(){A()?n():(m++,m<C?setTimeout(l,500):r?r.handleDriverLoadFailure():new ErrorHandler().handleDriverLoadFailure())}l()}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",k):k(),y("[Onboarding] System loaded")})();
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsidGhpcy5kcml2ZXI9dGhpcy5kcml2ZXJ8fHt9O3RoaXMuZHJpdmVyLmpzPWZ1bmN0aW9uKEQpe1widXNlIHN0cmljdFwiO2xldCBGPXt9O2Z1bmN0aW9uIHooZT17fSl7Rj17YW5pbWF0ZTohMCxhbGxvd0Nsb3NlOiEwLG92ZXJsYXlPcGFjaXR5Oi43LHNtb290aFNjcm9sbDohMSxkaXNhYmxlQWN0aXZlSW50ZXJhY3Rpb246ITEsc2hvd1Byb2dyZXNzOiExLHN0YWdlUGFkZGluZzoxMCxzdGFnZVJhZGl1czo1LHBvcG92ZXJPZmZzZXQ6MTAsc2hvd0J1dHRvbnM6W1wibmV4dFwiLFwicHJldmlvdXNcIixcImNsb3NlXCJdLGRpc2FibGVCdXR0b25zOltdLG92ZXJsYXlDb2xvcjpcIiMwMDBcIiwuLi5lfX1mdW5jdGlvbiBhKGUpe3JldHVybiBlP0ZbZV06Rn1mdW5jdGlvbiBXKGUsbyx0LGkpe3JldHVybihlLz1pLzIpPDE/dC8yKmUqZStvOi10LzIqKC0tZSooZS0yKS0xKStvfWZ1bmN0aW9uIHEoZSl7Y29uc3Qgbz0nYVtocmVmXTpub3QoW2Rpc2FibGVkXSksIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgaW5wdXRbdHlwZT1cInRleHRcIl06bm90KFtkaXNhYmxlZF0pLCBpbnB1dFt0eXBlPVwicmFkaW9cIl06bm90KFtkaXNhYmxlZF0pLCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KFtkaXNhYmxlZF0pLCBzZWxlY3Q6bm90KFtkaXNhYmxlZF0pJztyZXR1cm4gZS5mbGF0TWFwKHQ9Pntjb25zdCBpPXQubWF0Y2hlcyhvKSxwPUFycmF5LmZyb20odC5xdWVyeVNlbGVjdG9yQWxsKG8pKTtyZXR1cm5bLi4uaT9bdF06W10sLi4ucF19KS5maWx0ZXIodD0+Z2V0Q29tcHV0ZWRTdHlsZSh0KS5wb2ludGVyRXZlbnRzIT09XCJub25lXCImJmFlKHQpKX1mdW5jdGlvbiBWKGUpe2lmKCFlfHxzZShlKSlyZXR1cm47Y29uc3Qgbz1hKFwic21vb3RoU2Nyb2xsXCIpO2Uuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOiFvfHxyZShlKT9cImF1dG9cIjpcInNtb290aFwiLGlubGluZTpcImNlbnRlclwiLGJsb2NrOlwiY2VudGVyXCJ9KX1mdW5jdGlvbiByZShlKXtpZighZXx8IWUucGFyZW50RWxlbWVudClyZXR1cm47Y29uc3Qgbz1lLnBhcmVudEVsZW1lbnQ7cmV0dXJuIG8uc2Nyb2xsSGVpZ2h0Pm8uY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIHNlKGUpe2NvbnN0IG89ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gby50b3A+PTAmJm8ubGVmdD49MCYmby5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZvLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCl9ZnVuY3Rpb24gYWUoZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfWxldCBOPXt9O2Z1bmN0aW9uIGIoZSxvKXtOW2VdPW99ZnVuY3Rpb24gbChlKXtyZXR1cm4gZT9OW2VdOk59ZnVuY3Rpb24gSygpe049e319bGV0IEU9e307ZnVuY3Rpb24gTyhlLG8pe0VbZV09b31mdW5jdGlvbiBfKGUpe3ZhciBvOyhvPUVbZV0pPT1udWxsfHxvLmNhbGwoRSl9ZnVuY3Rpb24gY2UoKXtFPXt9fWZ1bmN0aW9uIGxlKGUsbyx0LGkpe2xldCBwPWwoXCJfX2FjdGl2ZVN0YWdlUG9zaXRpb25cIik7Y29uc3Qgbj1wfHx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx3PVcoZSxuLngsZi54LW4ueCxvKSxyPVcoZSxuLnksZi55LW4ueSxvKSx2PVcoZSxuLndpZHRoLGYud2lkdGgtbi53aWR0aCxvKSxzPVcoZSxuLmhlaWdodCxmLmhlaWdodC1uLmhlaWdodCxvKTtwPXt4OncseTpyLHdpZHRoOnYsaGVpZ2h0OnN9LFkocCksYihcIl9fYWN0aXZlU3RhZ2VQb3NpdGlvblwiLHApfWZ1bmN0aW9uIFgoZSl7aWYoIWUpcmV0dXJuO2NvbnN0IG89ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PXt4Om8ueCx5Om8ueSx3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodH07YihcIl9fYWN0aXZlU3RhZ2VQb3NpdGlvblwiLHQpLFkodCl9ZnVuY3Rpb24gZGUoKXtjb25zdCBlPWwoXCJfX2FjdGl2ZVN0YWdlUG9zaXRpb25cIiksbz1sKFwiX19vdmVybGF5U3ZnXCIpO2lmKCFlKXJldHVybjtpZighbyl7Y29uc29sZS53YXJuKFwiTm8gc3RhZ2Ugc3ZnIGZvdW5kLlwiKTtyZXR1cm59Y29uc3QgdD13aW5kb3cuaW5uZXJXaWR0aCxpPXdpbmRvdy5pbm5lckhlaWdodDtvLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIixgMCAwICR7dH0gJHtpfWApfWZ1bmN0aW9uIHBlKGUpe2NvbnN0IG89dWUoZSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvKSxHKG8sdD0+e3QudGFyZ2V0LnRhZ05hbWU9PT1cInBhdGhcIiYmXyhcIm92ZXJsYXlDbGlja1wiKX0pLGIoXCJfX292ZXJsYXlTdmdcIixvKX1mdW5jdGlvbiBZKGUpe2NvbnN0IG89bChcIl9fb3ZlcmxheVN2Z1wiKTtpZighbyl7cGUoZSk7cmV0dXJufWNvbnN0IHQ9by5maXJzdEVsZW1lbnRDaGlsZDtpZigodD09bnVsbD92b2lkIDA6dC50YWdOYW1lKSE9PVwicGF0aFwiKXRocm93IG5ldyBFcnJvcihcIm5vIHBhdGggZWxlbWVudCBmb3VuZCBpbiBzdGFnZSBzdmdcIik7dC5zZXRBdHRyaWJ1dGUoXCJkXCIsaihlKSl9ZnVuY3Rpb24gdWUoZSl7Y29uc3Qgbz13aW5kb3cuaW5uZXJXaWR0aCx0PXdpbmRvdy5pbm5lckhlaWdodCxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJzdmdcIik7aS5jbGFzc0xpc3QuYWRkKFwiZHJpdmVyLW92ZXJsYXlcIixcImRyaXZlci1vdmVybGF5LWFuaW1hdGVkXCIpLGkuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLGAwIDAgJHtvfSAke3R9YCksaS5zZXRBdHRyaWJ1dGUoXCJ4bWxTcGFjZVwiLFwicHJlc2VydmVcIiksaS5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1hsaW5rXCIsXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIpLGkuc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLFwiMS4xXCIpLGkuc2V0QXR0cmlidXRlKFwicHJlc2VydmVBc3BlY3RSYXRpb1wiLFwieE1pbllNaW4gc2xpY2VcIiksaS5zdHlsZS5maWxsUnVsZT1cImV2ZW5vZGRcIixpLnN0eWxlLmNsaXBSdWxlPVwiZXZlbm9kZFwiLGkuc3R5bGUuc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiLGkuc3R5bGUuc3Ryb2tlTWl0ZXJsaW1pdD1cIjJcIixpLnN0eWxlLnpJbmRleD1cIjEwMDAwXCIsaS5zdHlsZS5wb3NpdGlvbj1cImZpeGVkXCIsaS5zdHlsZS50b3A9XCIwXCIsaS5zdHlsZS5sZWZ0PVwiMFwiLGkuc3R5bGUud2lkdGg9XCIxMDAlXCIsaS5zdHlsZS5oZWlnaHQ9XCIxMDAlXCI7Y29uc3QgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFwicGF0aFwiKTtyZXR1cm4gcC5zZXRBdHRyaWJ1dGUoXCJkXCIsaihlKSkscC5zdHlsZS5maWxsPWEoXCJvdmVybGF5Q29sb3JcIil8fFwicmdiKDAsMCwwKVwiLHAuc3R5bGUub3BhY2l0eT1gJHthKFwib3ZlcmxheU9wYWNpdHlcIil9YCxwLnN0eWxlLnBvaW50ZXJFdmVudHM9XCJhdXRvXCIscC5zdHlsZS5jdXJzb3I9XCJhdXRvXCIsaS5hcHBlbmRDaGlsZChwKSxpfWZ1bmN0aW9uIGooZSl7Y29uc3Qgbz13aW5kb3cuaW5uZXJXaWR0aCx0PXdpbmRvdy5pbm5lckhlaWdodCxpPWEoXCJzdGFnZVBhZGRpbmdcIil8fDAscD1hKFwic3RhZ2VSYWRpdXNcIil8fDAsbj1lLndpZHRoK2kqMixmPWUuaGVpZ2h0K2kqMix3PU1hdGgubWluKHAsbi8yLGYvMikscj1NYXRoLmZsb29yKE1hdGgubWF4KHcsMCkpLHY9ZS54LWkrcixzPWUueS1pLGM9bi1yKjIsZD1mLXIqMjtyZXR1cm5gTSR7b30sMEwwLDBMMCwke3R9TCR7b30sJHt0fUwke299LDBaXG4gICAgTSR7dn0sJHtzfSBoJHtjfSBhJHtyfSwke3J9IDAgMCAxICR7cn0sJHtyfSB2JHtkfSBhJHtyfSwke3J9IDAgMCAxIC0ke3J9LCR7cn0gaC0ke2N9IGEke3J9LCR7cn0gMCAwIDEgLSR7cn0sLSR7cn0gdi0ke2R9IGEke3J9LCR7cn0gMCAwIDEgJHtyfSwtJHtyfSB6YH1mdW5jdGlvbiB2ZSgpe2NvbnN0IGU9bChcIl9fb3ZlcmxheVN2Z1wiKTtlJiZlLnJlbW92ZSgpfWZ1bmN0aW9uIGZlKCl7Y29uc3QgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRyaXZlci1kdW1teS1lbGVtZW50XCIpO2lmKGUpcmV0dXJuIGU7bGV0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gby5pZD1cImRyaXZlci1kdW1teS1lbGVtZW50XCIsby5zdHlsZS53aWR0aD1cIjBcIixvLnN0eWxlLmhlaWdodD1cIjBcIixvLnN0eWxlLnBvaW50ZXJFdmVudHM9XCJub25lXCIsby5zdHlsZS5vcGFjaXR5PVwiMFwiLG8uc3R5bGUucG9zaXRpb249XCJmaXhlZFwiLG8uc3R5bGUudG9wPVwiNTAlXCIsby5zdHlsZS5sZWZ0PVwiNTAlXCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvKSxvfWZ1bmN0aW9uIFEoZSl7Y29uc3R7ZWxlbWVudDpvfT1lO2xldCB0PXR5cGVvZiBvPT1cInN0cmluZ1wiP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iobyk6bzt0fHwodD1mZSgpKSxnZSh0LGUpfWZ1bmN0aW9uIGhlKCl7Y29uc3QgZT1sKFwiX19hY3RpdmVFbGVtZW50XCIpLG89bChcIl9fYWN0aXZlU3RlcFwiKTtlJiYoWChlKSxkZSgpLG9lKGUsbykpfWZ1bmN0aW9uIGdlKGUsbyl7Y29uc3QgaT1EYXRlLm5vdygpLHA9bChcIl9fYWN0aXZlU3RlcFwiKSxuPWwoXCJfX2FjdGl2ZUVsZW1lbnRcIil8fGUsZj0hbnx8bj09PWUsdz1lLmlkPT09XCJkcml2ZXItZHVtbXktZWxlbWVudFwiLHI9bi5pZD09PVwiZHJpdmVyLWR1bW15LWVsZW1lbnRcIix2PWEoXCJhbmltYXRlXCIpLHM9by5vbkhpZ2hsaWdodFN0YXJ0ZWR8fGEoXCJvbkhpZ2hsaWdodFN0YXJ0ZWRcIiksYz0obz09bnVsbD92b2lkIDA6by5vbkhpZ2hsaWdodGVkKXx8YShcIm9uSGlnaGxpZ2h0ZWRcIiksZD0ocD09bnVsbD92b2lkIDA6cC5vbkRlc2VsZWN0ZWQpfHxhKFwib25EZXNlbGVjdGVkXCIpLG09YSgpLGc9bCgpOyFmJiZkJiZkKHI/dm9pZCAwOm4scCx7Y29uZmlnOm0sc3RhdGU6Z30pLHMmJnModz92b2lkIDA6ZSxvLHtjb25maWc6bSxzdGF0ZTpnfSk7Y29uc3QgdT0hZiYmdjtsZXQgaD0hMTt4ZSgpLGIoXCJwcmV2aW91c1N0ZXBcIixwKSxiKFwicHJldmlvdXNFbGVtZW50XCIsbiksYihcImFjdGl2ZVN0ZXBcIixvKSxiKFwiYWN0aXZlRWxlbWVudFwiLGUpO2NvbnN0IFA9KCk9PntpZihsKFwiX190cmFuc2l0aW9uQ2FsbGJhY2tcIikhPT1QKXJldHVybjtjb25zdCB4PURhdGUubm93KCktaSx5PTQwMC14PD00MDAvMjtvLnBvcG92ZXImJnkmJiFoJiZ1JiYoSihlLG8pLGg9ITApLGEoXCJhbmltYXRlXCIpJiZ4PDQwMD9sZSh4LDQwMCxuLGUpOihYKGUpLGMmJmModz92b2lkIDA6ZSxvLHtjb25maWc6YSgpLHN0YXRlOmwoKX0pLGIoXCJfX3RyYW5zaXRpb25DYWxsYmFja1wiLHZvaWQgMCksYihcIl9fcHJldmlvdXNTdGVwXCIscCksYihcIl9fcHJldmlvdXNFbGVtZW50XCIsbiksYihcIl9fYWN0aXZlU3RlcFwiLG8pLGIoXCJfX2FjdGl2ZUVsZW1lbnRcIixlKSksd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShQKX07YihcIl9fdHJhbnNpdGlvbkNhbGxiYWNrXCIsUCksd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShQKSxWKGUpLCF1JiZvLnBvcG92ZXImJkooZSxvKSxuLmNsYXNzTGlzdC5yZW1vdmUoXCJkcml2ZXItYWN0aXZlLWVsZW1lbnRcIixcImRyaXZlci1uby1pbnRlcmFjdGlvblwiKSxuLnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIiksbi5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpLG4ucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSxhKFwiZGlzYWJsZUFjdGl2ZUludGVyYWN0aW9uXCIpJiZlLmNsYXNzTGlzdC5hZGQoXCJkcml2ZXItbm8taW50ZXJhY3Rpb25cIiksZS5jbGFzc0xpc3QuYWRkKFwiZHJpdmVyLWFjdGl2ZS1lbGVtZW50XCIpLGUuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLFwiZGlhbG9nXCIpLGUuc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLFwidHJ1ZVwiKSxlLnNldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIixcImRyaXZlci1wb3BvdmVyLWNvbnRlbnRcIil9ZnVuY3Rpb24gd2UoKXt2YXIgZTsoZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRyaXZlci1kdW1teS1lbGVtZW50XCIpKT09bnVsbHx8ZS5yZW1vdmUoKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmRyaXZlci1hY3RpdmUtZWxlbWVudFwiKS5mb3JFYWNoKG89PntvLmNsYXNzTGlzdC5yZW1vdmUoXCJkcml2ZXItYWN0aXZlLWVsZW1lbnRcIixcImRyaXZlci1uby1pbnRlcmFjdGlvblwiKSxvLnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIiksby5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpLG8ucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKX0pfWZ1bmN0aW9uIEEoKXtjb25zdCBlPWwoXCJfX3Jlc2l6ZVRpbWVvdXRcIik7ZSYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGUpLGIoXCJfX3Jlc2l6ZVRpbWVvdXRcIix3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGhlKSl9ZnVuY3Rpb24gbWUoZSl7dmFyIHI7aWYoIWwoXCJpc0luaXRpYWxpemVkXCIpfHwhKGUua2V5PT09XCJUYWJcInx8ZS5rZXlDb2RlPT09OSkpcmV0dXJuO2NvbnN0IGk9bChcIl9fYWN0aXZlRWxlbWVudFwiKSxwPShyPWwoXCJwb3BvdmVyXCIpKT09bnVsbD92b2lkIDA6ci53cmFwcGVyLG49cShbLi4ucD9bcF06W10sLi4uaT9baV06W11dKSxmPW5bMF0sdz1uW24ubGVuZ3RoLTFdO2lmKGUucHJldmVudERlZmF1bHQoKSxlLnNoaWZ0S2V5KXtjb25zdCB2PW5bbi5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLTFdfHx3O3Y9PW51bGx8fHYuZm9jdXMoKX1lbHNle2NvbnN0IHY9bltuLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkrMV18fGY7dj09bnVsbHx8di5mb2N1cygpfX1mdW5jdGlvbiBaKGUpe3ZhciB0OygodD1hKFwiYWxsb3dLZXlib2FyZENvbnRyb2xcIikpPT1udWxsfHx0KSYmKGUua2V5PT09XCJFc2NhcGVcIj9fKFwiZXNjYXBlUHJlc3NcIik6ZS5rZXk9PT1cIkFycm93UmlnaHRcIj9fKFwiYXJyb3dSaWdodFByZXNzXCIpOmUua2V5PT09XCJBcnJvd0xlZnRcIiYmXyhcImFycm93TGVmdFByZXNzXCIpKX1mdW5jdGlvbiBHKGUsbyx0KXtjb25zdCBpPShuLGYpPT57Y29uc3Qgdz1uLnRhcmdldDtlLmNvbnRhaW5zKHcpJiYoKCF0fHx0KHcpKSYmKG4ucHJldmVudERlZmF1bHQoKSxuLnN0b3BQcm9wYWdhdGlvbigpLG4uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpLGY9PW51bGx8fGYobikpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIixpLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsaSwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLGksITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsaSwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsbj0+e2kobixvKX0sITApfWZ1bmN0aW9uIHllKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLFosITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLG1lLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLEEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsQSl9ZnVuY3Rpb24gYmUoKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsWiksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixBKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLEEpfWZ1bmN0aW9uIHhlKCl7Y29uc3QgZT1sKFwicG9wb3ZlclwiKTtlJiYoZS53cmFwcGVyLnN0eWxlLmRpc3BsYXk9XCJub25lXCIpfWZ1bmN0aW9uIEooZSxvKXt2YXIgQyx5O2xldCB0PWwoXCJwb3BvdmVyXCIpO3QmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodC53cmFwcGVyKSx0PVBlKCksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0LndyYXBwZXIpO2NvbnN0e3RpdGxlOmksZGVzY3JpcHRpb246cCxzaG93QnV0dG9uczpuLGRpc2FibGVCdXR0b25zOmYsc2hvd1Byb2dyZXNzOncsbmV4dEJ0blRleHQ6cj1hKFwibmV4dEJ0blRleHRcIil8fFwiTmV4dCAmcmFycjtcIixwcmV2QnRuVGV4dDp2PWEoXCJwcmV2QnRuVGV4dFwiKXx8XCImbGFycjsgUHJldmlvdXNcIixwcm9ncmVzc1RleHQ6cz1hKFwicHJvZ3Jlc3NUZXh0XCIpfHxcIntjdXJyZW50fSBvZiB7dG90YWx9XCJ9PW8ucG9wb3Zlcnx8e307dC5uZXh0QnV0dG9uLmlubmVySFRNTD1yLHQucHJldmlvdXNCdXR0b24uaW5uZXJIVE1MPXYsdC5wcm9ncmVzcy5pbm5lckhUTUw9cyxpPyh0LnRpdGxlLmlubmVySFRNTD1pLHQudGl0bGUuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIpOnQudGl0bGUuc3R5bGUuZGlzcGxheT1cIm5vbmVcIixwPyh0LmRlc2NyaXB0aW9uLmlubmVySFRNTD1wLHQuZGVzY3JpcHRpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCIpOnQuZGVzY3JpcHRpb24uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtjb25zdCBjPW58fGEoXCJzaG93QnV0dG9uc1wiKSxkPXd8fGEoXCJzaG93UHJvZ3Jlc3NcIil8fCExLG09KGM9PW51bGw/dm9pZCAwOmMuaW5jbHVkZXMoXCJuZXh0XCIpKXx8KGM9PW51bGw/dm9pZCAwOmMuaW5jbHVkZXMoXCJwcmV2aW91c1wiKSl8fGQ7dC5jbG9zZUJ1dHRvbi5zdHlsZS5kaXNwbGF5PWMuaW5jbHVkZXMoXCJjbG9zZVwiKT9cImJsb2NrXCI6XCJub25lXCIsbT8odC5mb290ZXIuc3R5bGUuZGlzcGxheT1cImZsZXhcIix0LnByb2dyZXNzLnN0eWxlLmRpc3BsYXk9ZD9cImJsb2NrXCI6XCJub25lXCIsdC5uZXh0QnV0dG9uLnN0eWxlLmRpc3BsYXk9Yy5pbmNsdWRlcyhcIm5leHRcIik/XCJibG9ja1wiOlwibm9uZVwiLHQucHJldmlvdXNCdXR0b24uc3R5bGUuZGlzcGxheT1jLmluY2x1ZGVzKFwicHJldmlvdXNcIik/XCJibG9ja1wiOlwibm9uZVwiKTp0LmZvb3Rlci5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO2NvbnN0IGc9Znx8YShcImRpc2FibGVCdXR0b25zXCIpfHxbXTtnIT1udWxsJiZnLmluY2x1ZGVzKFwibmV4dFwiKSYmKHQubmV4dEJ1dHRvbi5kaXNhYmxlZD0hMCx0Lm5leHRCdXR0b24uY2xhc3NMaXN0LmFkZChcImRyaXZlci1wb3BvdmVyLWJ0bi1kaXNhYmxlZFwiKSksZyE9bnVsbCYmZy5pbmNsdWRlcyhcInByZXZpb3VzXCIpJiYodC5wcmV2aW91c0J1dHRvbi5kaXNhYmxlZD0hMCx0LnByZXZpb3VzQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJkcml2ZXItcG9wb3Zlci1idG4tZGlzYWJsZWRcIikpLGchPW51bGwmJmcuaW5jbHVkZXMoXCJjbG9zZVwiKSYmKHQuY2xvc2VCdXR0b24uZGlzYWJsZWQ9ITAsdC5jbG9zZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiZHJpdmVyLXBvcG92ZXItYnRuLWRpc2FibGVkXCIpKTtjb25zdCB1PXQud3JhcHBlcjt1LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHUuc3R5bGUubGVmdD1cIlwiLHUuc3R5bGUudG9wPVwiXCIsdS5zdHlsZS5ib3R0b209XCJcIix1LnN0eWxlLnJpZ2h0PVwiXCIsdS5pZD1cImRyaXZlci1wb3BvdmVyLWNvbnRlbnRcIix1LnNldEF0dHJpYnV0ZShcInJvbGVcIixcImRpYWxvZ1wiKSx1LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiLFwiZHJpdmVyLXBvcG92ZXItdGl0bGVcIiksdS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIsXCJkcml2ZXItcG9wb3Zlci1kZXNjcmlwdGlvblwiKTtjb25zdCBoPXQuYXJyb3c7aC5jbGFzc05hbWU9XCJkcml2ZXItcG9wb3Zlci1hcnJvd1wiO2NvbnN0IFA9KChDPW8ucG9wb3Zlcik9PW51bGw/dm9pZCAwOkMucG9wb3ZlckNsYXNzKXx8YShcInBvcG92ZXJDbGFzc1wiKXx8XCJcIjt1LmNsYXNzTmFtZT1gZHJpdmVyLXBvcG92ZXIgJHtQfWAudHJpbSgpLEcodC53cmFwcGVyLGs9Pnt2YXIgTSxSLEk7Y29uc3QgVD1rLnRhcmdldCxIPSgoTT1vLnBvcG92ZXIpPT1udWxsP3ZvaWQgMDpNLm9uTmV4dENsaWNrKXx8YShcIm9uTmV4dENsaWNrXCIpLCQ9KChSPW8ucG9wb3Zlcik9PW51bGw/dm9pZCAwOlIub25QcmV2Q2xpY2spfHxhKFwib25QcmV2Q2xpY2tcIiksQj0oKEk9by5wb3BvdmVyKT09bnVsbD92b2lkIDA6SS5vbkNsb3NlQ2xpY2spfHxhKFwib25DbG9zZUNsaWNrXCIpO2lmKFQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZHJpdmVyLXBvcG92ZXItbmV4dC1idG5cIikpcmV0dXJuIEg/SChlLG8se2NvbmZpZzphKCksc3RhdGU6bCgpfSk6XyhcIm5leHRDbGlja1wiKTtpZihULmNsYXNzTGlzdC5jb250YWlucyhcImRyaXZlci1wb3BvdmVyLXByZXYtYnRuXCIpKXJldHVybiAkPyQoZSxvLHtjb25maWc6YSgpLHN0YXRlOmwoKX0pOl8oXCJwcmV2Q2xpY2tcIik7aWYoVC5jbGFzc0xpc3QuY29udGFpbnMoXCJkcml2ZXItcG9wb3Zlci1jbG9zZS1idG5cIikpcmV0dXJuIEI/QihlLG8se2NvbmZpZzphKCksc3RhdGU6bCgpfSk6XyhcImNsb3NlQ2xpY2tcIil9LGs9PiEodCE9bnVsbCYmdC5kZXNjcmlwdGlvbi5jb250YWlucyhrKSkmJiEodCE9bnVsbCYmdC50aXRsZS5jb250YWlucyhrKSkmJnR5cGVvZiBrLmNsYXNzTmFtZT09XCJzdHJpbmdcIiYmay5jbGFzc05hbWUuaW5jbHVkZXMoXCJkcml2ZXItcG9wb3ZlclwiKSksYihcInBvcG92ZXJcIix0KTtjb25zdCBTPSgoeT1vLnBvcG92ZXIpPT1udWxsP3ZvaWQgMDp5Lm9uUG9wb3ZlclJlbmRlcil8fGEoXCJvblBvcG92ZXJSZW5kZXJcIik7UyYmUyh0LHtjb25maWc6YSgpLHN0YXRlOmwoKX0pLG9lKGUsbyksVih1KTtjb25zdCBMPWUuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZHJpdmVyLWR1bW15LWVsZW1lbnRcIikseD1xKFt1LC4uLkw/W106W2VdXSk7eC5sZW5ndGg+MCYmeFswXS5mb2N1cygpfWZ1bmN0aW9uIFUoKXtjb25zdCBlPWwoXCJwb3BvdmVyXCIpO2lmKCEoZSE9bnVsbCYmZS53cmFwcGVyKSlyZXR1cm47Y29uc3Qgbz1lLndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdD1hKFwic3RhZ2VQYWRkaW5nXCIpfHwwLGk9YShcInBvcG92ZXJPZmZzZXRcIil8fDA7cmV0dXJue3dpZHRoOm8ud2lkdGgrdCtpLGhlaWdodDpvLmhlaWdodCt0K2kscmVhbFdpZHRoOm8ud2lkdGgscmVhbEhlaWdodDpvLmhlaWdodH19ZnVuY3Rpb24gZWUoZSxvKXtjb25zdHtlbGVtZW50RGltZW5zaW9uczp0LHBvcG92ZXJEaW1lbnNpb25zOmkscG9wb3ZlclBhZGRpbmc6cCxwb3BvdmVyQXJyb3dEaW1lbnNpb25zOm59PW87cmV0dXJuIGU9PT1cInN0YXJ0XCI/TWF0aC5tYXgoTWF0aC5taW4odC50b3AtcCx3aW5kb3cuaW5uZXJIZWlnaHQtaS5yZWFsSGVpZ2h0LW4ud2lkdGgpLG4ud2lkdGgpOmU9PT1cImVuZFwiP01hdGgubWF4KE1hdGgubWluKHQudG9wLShpPT1udWxsP3ZvaWQgMDppLnJlYWxIZWlnaHQpK3QuaGVpZ2h0K3Asd2luZG93LmlubmVySGVpZ2h0LShpPT1udWxsP3ZvaWQgMDppLnJlYWxIZWlnaHQpLW4ud2lkdGgpLG4ud2lkdGgpOmU9PT1cImNlbnRlclwiP01hdGgubWF4KE1hdGgubWluKHQudG9wK3QuaGVpZ2h0LzItKGk9PW51bGw/dm9pZCAwOmkucmVhbEhlaWdodCkvMix3aW5kb3cuaW5uZXJIZWlnaHQtKGk9PW51bGw/dm9pZCAwOmkucmVhbEhlaWdodCktbi53aWR0aCksbi53aWR0aCk6MH1mdW5jdGlvbiB0ZShlLG8pe2NvbnN0e2VsZW1lbnREaW1lbnNpb25zOnQscG9wb3ZlckRpbWVuc2lvbnM6aSxwb3BvdmVyUGFkZGluZzpwLHBvcG92ZXJBcnJvd0RpbWVuc2lvbnM6bn09bztyZXR1cm4gZT09PVwic3RhcnRcIj9NYXRoLm1heChNYXRoLm1pbih0LmxlZnQtcCx3aW5kb3cuaW5uZXJXaWR0aC1pLnJlYWxXaWR0aC1uLndpZHRoKSxuLndpZHRoKTplPT09XCJlbmRcIj9NYXRoLm1heChNYXRoLm1pbih0LmxlZnQtKGk9PW51bGw/dm9pZCAwOmkucmVhbFdpZHRoKSt0LndpZHRoK3Asd2luZG93LmlubmVyV2lkdGgtKGk9PW51bGw/dm9pZCAwOmkucmVhbFdpZHRoKS1uLndpZHRoKSxuLndpZHRoKTplPT09XCJjZW50ZXJcIj9NYXRoLm1heChNYXRoLm1pbih0LmxlZnQrdC53aWR0aC8yLShpPT1udWxsP3ZvaWQgMDppLnJlYWxXaWR0aCkvMix3aW5kb3cuaW5uZXJXaWR0aC0oaT09bnVsbD92b2lkIDA6aS5yZWFsV2lkdGgpLW4ud2lkdGgpLG4ud2lkdGgpOjB9ZnVuY3Rpb24gb2UoZSxvKXtjb25zdCB0PWwoXCJwb3BvdmVyXCIpO2lmKCF0KXJldHVybjtjb25zdHthbGlnbjppPVwic3RhcnRcIixzaWRlOnA9XCJsZWZ0XCJ9PShvPT1udWxsP3ZvaWQgMDpvLnBvcG92ZXIpfHx7fSxuPWksZj1lLmlkPT09XCJkcml2ZXItZHVtbXktZWxlbWVudFwiP1wib3ZlclwiOnAsdz1hKFwic3RhZ2VQYWRkaW5nXCIpfHwwLHI9VSgpLHY9dC5hcnJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1zLnRvcC1yLmhlaWdodDtsZXQgZD1jPj0wO2NvbnN0IG09d2luZG93LmlubmVySGVpZ2h0LShzLmJvdHRvbStyLmhlaWdodCk7bGV0IGc9bT49MDtjb25zdCB1PXMubGVmdC1yLndpZHRoO2xldCBoPXU+PTA7Y29uc3QgUD13aW5kb3cuaW5uZXJXaWR0aC0ocy5yaWdodCtyLndpZHRoKTtsZXQgUz1QPj0wO2NvbnN0IEw9IWQmJiFnJiYhaCYmIVM7bGV0IHg9ZjtpZihmPT09XCJ0b3BcIiYmZD9TPWg9Zz0hMTpmPT09XCJib3R0b21cIiYmZz9TPWg9ZD0hMTpmPT09XCJsZWZ0XCImJmg/Uz1kPWc9ITE6Zj09PVwicmlnaHRcIiYmUyYmKGg9ZD1nPSExKSxmPT09XCJvdmVyXCIpe2NvbnN0IEM9d2luZG93LmlubmVyV2lkdGgvMi1yLnJlYWxXaWR0aC8yLHk9d2luZG93LmlubmVySGVpZ2h0LzItci5yZWFsSGVpZ2h0LzI7dC53cmFwcGVyLnN0eWxlLmxlZnQ9YCR7Q31weGAsdC53cmFwcGVyLnN0eWxlLnJpZ2h0PVwiYXV0b1wiLHQud3JhcHBlci5zdHlsZS50b3A9YCR7eX1weGAsdC53cmFwcGVyLnN0eWxlLmJvdHRvbT1cImF1dG9cIn1lbHNlIGlmKEwpe2NvbnN0IEM9d2luZG93LmlubmVyV2lkdGgvMi0ocj09bnVsbD92b2lkIDA6ci5yZWFsV2lkdGgpLzIseT0xMDt0LndyYXBwZXIuc3R5bGUubGVmdD1gJHtDfXB4YCx0LndyYXBwZXIuc3R5bGUucmlnaHQ9XCJhdXRvXCIsdC53cmFwcGVyLnN0eWxlLmJvdHRvbT1gJHt5fXB4YCx0LndyYXBwZXIuc3R5bGUudG9wPVwiYXV0b1wifWVsc2UgaWYoaCl7Y29uc3QgQz1NYXRoLm1pbih1LHdpbmRvdy5pbm5lcldpZHRoLShyPT1udWxsP3ZvaWQgMDpyLnJlYWxXaWR0aCktdi53aWR0aCkseT1lZShuLHtlbGVtZW50RGltZW5zaW9uczpzLHBvcG92ZXJEaW1lbnNpb25zOnIscG9wb3ZlclBhZGRpbmc6dyxwb3BvdmVyQXJyb3dEaW1lbnNpb25zOnZ9KTt0LndyYXBwZXIuc3R5bGUubGVmdD1gJHtDfXB4YCx0LndyYXBwZXIuc3R5bGUudG9wPWAke3l9cHhgLHQud3JhcHBlci5zdHlsZS5ib3R0b209XCJhdXRvXCIsdC53cmFwcGVyLnN0eWxlLnJpZ2h0PVwiYXV0b1wiLHg9XCJsZWZ0XCJ9ZWxzZSBpZihTKXtjb25zdCBDPU1hdGgubWluKFAsd2luZG93LmlubmVyV2lkdGgtKHI9PW51bGw/dm9pZCAwOnIucmVhbFdpZHRoKS12LndpZHRoKSx5PWVlKG4se2VsZW1lbnREaW1lbnNpb25zOnMscG9wb3ZlckRpbWVuc2lvbnM6cixwb3BvdmVyUGFkZGluZzp3LHBvcG92ZXJBcnJvd0RpbWVuc2lvbnM6dn0pO3Qud3JhcHBlci5zdHlsZS5yaWdodD1gJHtDfXB4YCx0LndyYXBwZXIuc3R5bGUudG9wPWAke3l9cHhgLHQud3JhcHBlci5zdHlsZS5ib3R0b209XCJhdXRvXCIsdC53cmFwcGVyLnN0eWxlLmxlZnQ9XCJhdXRvXCIseD1cInJpZ2h0XCJ9ZWxzZSBpZihkKXtjb25zdCBDPU1hdGgubWluKGMsd2luZG93LmlubmVySGVpZ2h0LXIucmVhbEhlaWdodC12LndpZHRoKTtsZXQgeT10ZShuLHtlbGVtZW50RGltZW5zaW9uczpzLHBvcG92ZXJEaW1lbnNpb25zOnIscG9wb3ZlclBhZGRpbmc6dyxwb3BvdmVyQXJyb3dEaW1lbnNpb25zOnZ9KTt0LndyYXBwZXIuc3R5bGUudG9wPWAke0N9cHhgLHQud3JhcHBlci5zdHlsZS5sZWZ0PWAke3l9cHhgLHQud3JhcHBlci5zdHlsZS5ib3R0b209XCJhdXRvXCIsdC53cmFwcGVyLnN0eWxlLnJpZ2h0PVwiYXV0b1wiLHg9XCJ0b3BcIn1lbHNlIGlmKGcpe2NvbnN0IEM9TWF0aC5taW4obSx3aW5kb3cuaW5uZXJIZWlnaHQtKHI9PW51bGw/dm9pZCAwOnIucmVhbEhlaWdodCktdi53aWR0aCk7bGV0IHk9dGUobix7ZWxlbWVudERpbWVuc2lvbnM6cyxwb3BvdmVyRGltZW5zaW9uczpyLHBvcG92ZXJQYWRkaW5nOncscG9wb3ZlckFycm93RGltZW5zaW9uczp2fSk7dC53cmFwcGVyLnN0eWxlLmxlZnQ9YCR7eX1weGAsdC53cmFwcGVyLnN0eWxlLmJvdHRvbT1gJHtDfXB4YCx0LndyYXBwZXIuc3R5bGUudG9wPVwiYXV0b1wiLHQud3JhcHBlci5zdHlsZS5yaWdodD1cImF1dG9cIix4PVwiYm90dG9tXCJ9TD90LmFycm93LmNsYXNzTGlzdC5hZGQoXCJkcml2ZXItcG9wb3Zlci1hcnJvdy1ub25lXCIpOkNlKG4seCxlKX1mdW5jdGlvbiBDZShlLG8sdCl7Y29uc3QgaT1sKFwicG9wb3ZlclwiKTtpZighaSlyZXR1cm47Y29uc3QgcD10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49VSgpLGY9aS5hcnJvdyx3PW4ud2lkdGgscj13aW5kb3cuaW5uZXJXaWR0aCx2PXAud2lkdGgscz1wLmxlZnQsYz1uLmhlaWdodCxkPXdpbmRvdy5pbm5lckhlaWdodCxtPXAudG9wLGc9cC5oZWlnaHQ7Zi5jbGFzc05hbWU9XCJkcml2ZXItcG9wb3Zlci1hcnJvd1wiO2xldCB1PW8saD1lO289PT1cInRvcFwiPyhzK3Y8PTA/KHU9XCJyaWdodFwiLGg9XCJlbmRcIik6cyt2LXc8PTAmJih1PVwidG9wXCIsaD1cInN0YXJ0XCIpLHM+PXI/KHU9XCJsZWZ0XCIsaD1cImVuZFwiKTpzK3c+PXImJih1PVwidG9wXCIsaD1cImVuZFwiKSk6bz09PVwiYm90dG9tXCI/KHMrdjw9MD8odT1cInJpZ2h0XCIsaD1cInN0YXJ0XCIpOnMrdi13PD0wJiYodT1cImJvdHRvbVwiLGg9XCJzdGFydFwiKSxzPj1yPyh1PVwibGVmdFwiLGg9XCJzdGFydFwiKTpzK3c+PXImJih1PVwiYm90dG9tXCIsaD1cImVuZFwiKSk6bz09PVwibGVmdFwiPyhtK2c8PTA/KHU9XCJib3R0b21cIixoPVwiZW5kXCIpOm0rZy1jPD0wJiYodT1cImxlZnRcIixoPVwic3RhcnRcIiksbT49ZD8odT1cInRvcFwiLGg9XCJlbmRcIik6bStjPj1kJiYodT1cImxlZnRcIixoPVwiZW5kXCIpKTpvPT09XCJyaWdodFwiJiYobStnPD0wPyh1PVwiYm90dG9tXCIsaD1cInN0YXJ0XCIpOm0rZy1jPD0wJiYodT1cInJpZ2h0XCIsaD1cInN0YXJ0XCIpLG0+PWQ/KHU9XCJ0b3BcIixoPVwic3RhcnRcIik6bStjPj1kJiYodT1cInJpZ2h0XCIsaD1cImVuZFwiKSksdT8oZi5jbGFzc0xpc3QuYWRkKGBkcml2ZXItcG9wb3Zlci1hcnJvdy1zaWRlLSR7dX1gKSxmLmNsYXNzTGlzdC5hZGQoYGRyaXZlci1wb3BvdmVyLWFycm93LWFsaWduLSR7aH1gKSk6Zi5jbGFzc0xpc3QuYWRkKFwiZHJpdmVyLXBvcG92ZXItYXJyb3ctbm9uZVwiKX1mdW5jdGlvbiBQZSgpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlLmNsYXNzTGlzdC5hZGQoXCJkcml2ZXItcG9wb3ZlclwiKTtjb25zdCBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7by5jbGFzc0xpc3QuYWRkKFwiZHJpdmVyLXBvcG92ZXItYXJyb3dcIik7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaGVhZGVyXCIpO3QuaWQ9XCJkcml2ZXItcG9wb3Zlci10aXRsZVwiLHQuY2xhc3NMaXN0LmFkZChcImRyaXZlci1wb3BvdmVyLXRpdGxlXCIpLHQuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix0LmlubmVyVGV4dD1cIlBvcG92ZXIgVGl0bGVcIjtjb25zdCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7aS5pZD1cImRyaXZlci1wb3BvdmVyLWRlc2NyaXB0aW9uXCIsaS5jbGFzc0xpc3QuYWRkKFwiZHJpdmVyLXBvcG92ZXItZGVzY3JpcHRpb25cIiksaS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLGkuaW5uZXJUZXh0PVwiUG9wb3ZlciBkZXNjcmlwdGlvbiBpcyBoZXJlXCI7Y29uc3QgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO3AudHlwZT1cImJ1dHRvblwiLHAuY2xhc3NMaXN0LmFkZChcImRyaXZlci1wb3BvdmVyLWNsb3NlLWJ0blwiKSxwLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixcIkNsb3NlXCIpLHAuaW5uZXJIVE1MPVwiJnRpbWVzO1wiO2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvb3RlclwiKTtuLmNsYXNzTGlzdC5hZGQoXCJkcml2ZXItcG9wb3Zlci1mb290ZXJcIik7Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtmLmNsYXNzTGlzdC5hZGQoXCJkcml2ZXItcG9wb3Zlci1wcm9ncmVzcy10ZXh0XCIpLGYuaW5uZXJUZXh0PVwiXCI7Y29uc3Qgdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt3LmNsYXNzTGlzdC5hZGQoXCJkcml2ZXItcG9wb3Zlci1uYXZpZ2F0aW9uLWJ0bnNcIik7Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO3IudHlwZT1cImJ1dHRvblwiLHIuY2xhc3NMaXN0LmFkZChcImRyaXZlci1wb3BvdmVyLXByZXYtYnRuXCIpLHIuaW5uZXJIVE1MPVwiJmxhcnI7IFByZXZpb3VzXCI7Y29uc3Qgdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO3JldHVybiB2LnR5cGU9XCJidXR0b25cIix2LmNsYXNzTGlzdC5hZGQoXCJkcml2ZXItcG9wb3Zlci1uZXh0LWJ0blwiKSx2LmlubmVySFRNTD1cIk5leHQgJnJhcnI7XCIsdy5hcHBlbmRDaGlsZChyKSx3LmFwcGVuZENoaWxkKHYpLG4uYXBwZW5kQ2hpbGQoZiksbi5hcHBlbmRDaGlsZCh3KSxlLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQobyksZS5hcHBlbmRDaGlsZCh0KSxlLmFwcGVuZENoaWxkKGkpLGUuYXBwZW5kQ2hpbGQobikse3dyYXBwZXI6ZSxhcnJvdzpvLHRpdGxlOnQsZGVzY3JpcHRpb246aSxmb290ZXI6bixwcmV2aW91c0J1dHRvbjpyLG5leHRCdXR0b246dixjbG9zZUJ1dHRvbjpwLGZvb3RlckJ1dHRvbnM6dyxwcm9ncmVzczpmfX1mdW5jdGlvbiBTZSgpe3ZhciBvO2NvbnN0IGU9bChcInBvcG92ZXJcIik7ZSYmKChvPWUud3JhcHBlci5wYXJlbnRFbGVtZW50KT09bnVsbHx8by5yZW1vdmVDaGlsZChlLndyYXBwZXIpKX1jb25zdCBMZT1cIlwiO2Z1bmN0aW9uIGtlKGU9e30pe3ooZSk7ZnVuY3Rpb24gbygpe2EoXCJhbGxvd0Nsb3NlXCIpJiZ2KCl9ZnVuY3Rpb24gdCgpe2NvbnN0IHM9bChcImFjdGl2ZUluZGV4XCIpLGM9YShcInN0ZXBzXCIpfHxbXTtpZih0eXBlb2Ygcz09XCJ1bmRlZmluZWRcIilyZXR1cm47Y29uc3QgZD1zKzE7Y1tkXT9yKGQpOnYoKX1mdW5jdGlvbiBpKCl7Y29uc3Qgcz1sKFwiYWN0aXZlSW5kZXhcIiksYz1hKFwic3RlcHNcIil8fFtdO2lmKHR5cGVvZiBzPT1cInVuZGVmaW5lZFwiKXJldHVybjtjb25zdCBkPXMtMTtjW2RdP3IoZCk6digpfWZ1bmN0aW9uIHAocyl7KGEoXCJzdGVwc1wiKXx8W10pW3NdP3Iocyk6digpfWZ1bmN0aW9uIG4oKXt2YXIgaDtpZihsKFwiX190cmFuc2l0aW9uQ2FsbGJhY2tcIikpcmV0dXJuO2NvbnN0IGM9bChcImFjdGl2ZUluZGV4XCIpLGQ9bChcIl9fYWN0aXZlU3RlcFwiKSxtPWwoXCJfX2FjdGl2ZUVsZW1lbnRcIik7aWYodHlwZW9mIGM9PVwidW5kZWZpbmVkXCJ8fHR5cGVvZiBkPT1cInVuZGVmaW5lZFwifHx0eXBlb2YgbChcImFjdGl2ZUluZGV4XCIpPT1cInVuZGVmaW5lZFwiKXJldHVybjtjb25zdCB1PSgoaD1kLnBvcG92ZXIpPT1udWxsP3ZvaWQgMDpoLm9uUHJldkNsaWNrKXx8YShcIm9uUHJldkNsaWNrXCIpO2lmKHUpcmV0dXJuIHUobSxkLHtjb25maWc6YSgpLHN0YXRlOmwoKX0pO2koKX1mdW5jdGlvbiBmKCl7dmFyIHU7aWYobChcIl9fdHJhbnNpdGlvbkNhbGxiYWNrXCIpKXJldHVybjtjb25zdCBjPWwoXCJhY3RpdmVJbmRleFwiKSxkPWwoXCJfX2FjdGl2ZVN0ZXBcIiksbT1sKFwiX19hY3RpdmVFbGVtZW50XCIpO2lmKHR5cGVvZiBjPT1cInVuZGVmaW5lZFwifHx0eXBlb2YgZD09XCJ1bmRlZmluZWRcIilyZXR1cm47Y29uc3QgZz0oKHU9ZC5wb3BvdmVyKT09bnVsbD92b2lkIDA6dS5vbk5leHRDbGljayl8fGEoXCJvbk5leHRDbGlja1wiKTtpZihnKXJldHVybiBnKG0sZCx7Y29uZmlnOmEoKSxzdGF0ZTpsKCl9KTt0KCl9ZnVuY3Rpb24gdygpe2woXCJpc0luaXRpYWxpemVkXCIpfHwoYihcImlzSW5pdGlhbGl6ZWRcIiwhMCksZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwiZHJpdmVyLWFjdGl2ZVwiLGEoXCJhbmltYXRlXCIpP1wiZHJpdmVyLWZhZGVcIjpcImRyaXZlci1zaW1wbGVcIikseWUoKSxPKFwib3ZlcmxheUNsaWNrXCIsbyksTyhcImVzY2FwZVByZXNzXCIsbyksTyhcImFycm93TGVmdFByZXNzXCIsbiksTyhcImFycm93UmlnaHRQcmVzc1wiLGYpKX1mdW5jdGlvbiByKHM9MCl7dmFyIEgsJCxCLE0sUixJLGllLG5lO2NvbnN0IGM9YShcInN0ZXBzXCIpO2lmKCFjKXtjb25zb2xlLmVycm9yKFwiTm8gc3RlcHMgdG8gZHJpdmUgdGhyb3VnaFwiKSx2KCk7cmV0dXJufWlmKCFjW3NdKXt2KCk7cmV0dXJufWIoXCJfX2FjdGl2ZU9uRGVzdHJveWVkXCIsZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksYihcImFjdGl2ZUluZGV4XCIscyk7Y29uc3QgZD1jW3NdLG09Y1tzKzFdLGc9Y1tzLTFdLHU9KChIPWQucG9wb3Zlcik9PW51bGw/dm9pZCAwOkguZG9uZUJ0blRleHQpfHxhKFwiZG9uZUJ0blRleHRcIil8fFwiRG9uZVwiLGg9YShcImFsbG93Q2xvc2VcIiksUD10eXBlb2YoKCQ9ZC5wb3BvdmVyKT09bnVsbD92b2lkIDA6JC5zaG93UHJvZ3Jlc3MpIT1cInVuZGVmaW5lZFwiPyhCPWQucG9wb3Zlcik9PW51bGw/dm9pZCAwOkIuc2hvd1Byb2dyZXNzOmEoXCJzaG93UHJvZ3Jlc3NcIiksTD0oKChNPWQucG9wb3Zlcik9PW51bGw/dm9pZCAwOk0ucHJvZ3Jlc3NUZXh0KXx8YShcInByb2dyZXNzVGV4dFwiKXx8XCJ7e2N1cnJlbnR9fSBvZiB7e3RvdGFsfX1cIikucmVwbGFjZShcInt7Y3VycmVudH19XCIsYCR7cysxfWApLnJlcGxhY2UoXCJ7e3RvdGFsfX1cIixgJHtjLmxlbmd0aH1gKSx4PSgoUj1kLnBvcG92ZXIpPT1udWxsP3ZvaWQgMDpSLnNob3dCdXR0b25zKXx8YShcInNob3dCdXR0b25zXCIpLEM9W1wibmV4dFwiLFwicHJldmlvdXNcIiwuLi5oP1tcImNsb3NlXCJdOltdXS5maWx0ZXIoX2U9PiEoeCE9bnVsbCYmeC5sZW5ndGgpfHx4LmluY2x1ZGVzKF9lKSkseT0oKEk9ZC5wb3BvdmVyKT09bnVsbD92b2lkIDA6SS5vbk5leHRDbGljayl8fGEoXCJvbk5leHRDbGlja1wiKSxrPSgoaWU9ZC5wb3BvdmVyKT09bnVsbD92b2lkIDA6aWUub25QcmV2Q2xpY2spfHxhKFwib25QcmV2Q2xpY2tcIiksVD0oKG5lPWQucG9wb3Zlcik9PW51bGw/dm9pZCAwOm5lLm9uQ2xvc2VDbGljayl8fGEoXCJvbkNsb3NlQ2xpY2tcIik7USh7Li4uZCxwb3BvdmVyOntzaG93QnV0dG9uczpDLG5leHRCdG5UZXh0Om0/dm9pZCAwOnUsZGlzYWJsZUJ1dHRvbnM6Wy4uLmc/W106W1wicHJldmlvdXNcIl1dLHNob3dQcm9ncmVzczpQLHByb2dyZXNzVGV4dDpMLG9uTmV4dENsaWNrOnl8fCgoKT0+e20/cihzKzEpOnYoKX0pLG9uUHJldkNsaWNrOmt8fCgoKT0+e3Iocy0xKX0pLG9uQ2xvc2VDbGljazpUfHwoKCk9Pnt2KCl9KSwuLi4oZD09bnVsbD92b2lkIDA6ZC5wb3BvdmVyKXx8e319fSl9ZnVuY3Rpb24gdihzPSEwKXtjb25zdCBjPWwoXCJfX2FjdGl2ZUVsZW1lbnRcIiksZD1sKFwiX19hY3RpdmVTdGVwXCIpLG09bChcIl9fYWN0aXZlT25EZXN0cm95ZWRcIiksZz1hKFwib25EZXN0cm95U3RhcnRlZFwiKTtpZihzJiZnKXtjb25zdCBQPSFjfHwoYz09bnVsbD92b2lkIDA6Yy5pZCk9PT1cImRyaXZlci1kdW1teS1lbGVtZW50XCI7ZyhQP3ZvaWQgMDpjLGQse2NvbmZpZzphKCksc3RhdGU6bCgpfSk7cmV0dXJufWNvbnN0IHU9KGQ9PW51bGw/dm9pZCAwOmQub25EZXNlbGVjdGVkKXx8YShcIm9uRGVzZWxlY3RlZFwiKSxoPWEoXCJvbkRlc3Ryb3llZFwiKTtpZihkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoXCJkcml2ZXItYWN0aXZlXCIsXCJkcml2ZXItZmFkZVwiLFwiZHJpdmVyLXNpbXBsZVwiKSxiZSgpLFNlKCksd2UoKSx2ZSgpLGNlKCksSygpLGMmJmQpe2NvbnN0IFA9Yy5pZD09PVwiZHJpdmVyLWR1bW15LWVsZW1lbnRcIjt1JiZ1KFA/dm9pZCAwOmMsZCx7Y29uZmlnOmEoKSxzdGF0ZTpsKCl9KSxoJiZoKFA/dm9pZCAwOmMsZCx7Y29uZmlnOmEoKSxzdGF0ZTpsKCl9KX1tJiZtLmZvY3VzKCl9cmV0dXJue2lzQWN0aXZlOigpPT5sKFwiaXNJbml0aWFsaXplZFwiKXx8ITEscmVmcmVzaDpBLGRyaXZlOihzPTApPT57dygpLHIocyl9LHNldENvbmZpZzp6LHNldFN0ZXBzOnM9PntLKCkseih7Li4uYSgpLHN0ZXBzOnN9KX0sZ2V0Q29uZmlnOmEsZ2V0U3RhdGU6bCxnZXRBY3RpdmVJbmRleDooKT0+bChcImFjdGl2ZUluZGV4XCIpLGlzRmlyc3RTdGVwOigpPT5sKFwiYWN0aXZlSW5kZXhcIik9PT0wLGlzTGFzdFN0ZXA6KCk9Pntjb25zdCBzPWEoXCJzdGVwc1wiKXx8W10sYz1sKFwiYWN0aXZlSW5kZXhcIik7cmV0dXJuIGMhPT12b2lkIDAmJmM9PT1zLmxlbmd0aC0xfSxnZXRBY3RpdmVTdGVwOigpPT5sKFwiYWN0aXZlU3RlcFwiKSxnZXRBY3RpdmVFbGVtZW50OigpPT5sKFwiYWN0aXZlRWxlbWVudFwiKSxnZXRQcmV2aW91c0VsZW1lbnQ6KCk9PmwoXCJwcmV2aW91c0VsZW1lbnRcIiksZ2V0UHJldmlvdXNTdGVwOigpPT5sKFwicHJldmlvdXNTdGVwXCIpLG1vdmVOZXh0OnQsbW92ZVByZXZpb3VzOmksbW92ZVRvOnAsaGFzTmV4dFN0ZXA6KCk9Pntjb25zdCBzPWEoXCJzdGVwc1wiKXx8W10sYz1sKFwiYWN0aXZlSW5kZXhcIik7cmV0dXJuIGMhPT12b2lkIDAmJnNbYysxXX0saGFzUHJldmlvdXNTdGVwOigpPT57Y29uc3Qgcz1hKFwic3RlcHNcIil8fFtdLGM9bChcImFjdGl2ZUluZGV4XCIpO3JldHVybiBjIT09dm9pZCAwJiZzW2MtMV19LGhpZ2hsaWdodDpzPT57dygpLFEoey4uLnMscG9wb3ZlcjpzLnBvcG92ZXI/e3Nob3dCdXR0b25zOltdLHNob3dQcm9ncmVzczohMSxwcm9ncmVzc1RleHQ6XCJcIiwuLi5zLnBvcG92ZXJ9OnZvaWQgMH0pfSxkZXN0cm95OigpPT57dighMSl9fX1yZXR1cm4gRC5kcml2ZXI9a2UsT2JqZWN0LmRlZmluZVByb3BlcnR5KEQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksRH0oe30pO1xuO1xuLyoqXG4gKiBQcm9ncmVzcyBUcmFja2VyXG4gKiBNYW5hZ2VzIHBlcnNpc3RlbnQgc3RvcmFnZSBvZiB1c2VyIHByb2dyZXNzIHRocm91Z2ggdGhlIG9uYm9hcmRpbmcgZmxvd1xuICogdXNpbmcgYnJvd3NlciBsb2NhbCBzdG9yYWdlLlxuICogXG4gKiBTdG9yYWdlIFNjaGVtYTpcbiAqIHtcbiAqICAgXCJ2ZXJzaW9uXCI6IFwiMS4wXCIsXG4gKiAgIFwidG91ckNvbXBsZXRlZFwiOiBmYWxzZSxcbiAqICAgXCJjb21wbGV0ZWRUb29sdGlwc1wiOiBbXCJ3ZWxjb21lXCIsIFwiZG5zLXByaW9yaXR5XCIsIC4uLl0sXG4gKiAgIFwiY3VycmVudFN0ZXBcIjogMyxcbiAqICAgXCJjb21wbGV0aW9uVGltZXN0YW1wXCI6IFwiMjAyNC0wMS0xNVQxMDozMDowMFpcIixcbiAqICAgXCJkbnNTZXR1cERlZmVycmVkXCI6IGZhbHNlLFxuICogICBcImxhc3RWaXNpdFwiOiBcIjIwMjQtMDEtMTVUMTA6MzA6MDBaXCJcbiAqIH1cbiAqL1xuXG4oZnVuY3Rpb24od2luZG93KSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG5cbiAgY29uc3QgZGVidWcgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh3aW5kb3cuREFTSENBRERZX0RFQlVHKSB7IGNvbnNvbGUubG9nKC4uLmFyZ3MpOyB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFByb2dyZXNzVHJhY2tlciBjbGFzc1xuICAgKiBNYW5hZ2VzIHBlcnNpc3RlbnQgc3RvcmFnZSBvZiBvbmJvYXJkaW5nIHByb2dyZXNzXG4gICAqIFxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0b3JhZ2VLZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgbG9jYWwgc3RvcmFnZSAoZGVmYXVsdDogJ2Rhc2hjYWRkeV9vbmJvYXJkaW5nJylcbiAgICovXG4gIGNsYXNzIFByb2dyZXNzVHJhY2tlciB7XG4gICAgY29uc3RydWN0b3Ioc3RvcmFnZUtleSA9ICdkYXNoY2FkZHlfb25ib2FyZGluZycpIHtcbiAgICAgIHRoaXMuc3RvcmFnZUtleSA9IHN0b3JhZ2VLZXk7XG4gICAgICB0aGlzLnN0b3JhZ2VWZXJzaW9uID0gJzEuMCc7XG4gICAgICB0aGlzLmluc3RhbGxPbmJvYXJkaW5nQ29tcGxldGVkID0gdHlwZW9mIFNJVEUgIT09ICd1bmRlZmluZWQnICYmIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCA9PT0gdHJ1ZTtcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdG9yYWdlIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIHRoaXMuX2luaXRpYWxpemVTdG9yYWdlKCk7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBsYXN0IHZpc2l0IHRpbWVzdGFtcFxuICAgICAgdGhpcy5fdXBkYXRlTGFzdFZpc2l0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBzdG9yYWdlIHdpdGggZGVmYXVsdCB2YWx1ZXMgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemVTdG9yYWdlKCkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9nZXRTdG9yYWdlKCk7XG4gICAgICBpZiAoIWV4aXN0aW5nIHx8IGV4aXN0aW5nLnZlcnNpb24gIT09IHRoaXMuc3RvcmFnZVZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFN0YXRlID0ge1xuICAgICAgICAgIHZlcnNpb246IHRoaXMuc3RvcmFnZVZlcnNpb24sXG4gICAgICAgICAgdG91ckNvbXBsZXRlZDogZmFsc2UsXG4gICAgICAgICAgY29tcGxldGVkVG9vbHRpcHM6IFtdLFxuICAgICAgICAgIGN1cnJlbnRTdGVwOiAwLFxuICAgICAgICAgIGNvbXBsZXRpb25UaW1lc3RhbXA6IG51bGwsXG4gICAgICAgICAgZG5zU2V0dXBEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgICAgbGFzdFZpc2l0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc2V0U3RvcmFnZShkZWZhdWx0U3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBzdG9yYWdlIHN0YXRlXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IFRoZSBzdG9yYWdlIHN0YXRlIG9yIG51bGwgaWYgdW5hdmFpbGFibGVcbiAgICAgKi9cbiAgICBfZ2V0U3RvcmFnZSgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSA/IEpTT04ucGFyc2UoZGF0YSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbUHJvZ3Jlc3NUcmFja2VyXSBSZWFkIFN0b3JhZ2UnLCBlcnJvciwgeyBmdW5jdGlvbjogJ19nZXRTdG9yYWdlJyB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzdG9yYWdlIHN0YXRlXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgLSBUaGUgc3RhdGUgdG8gc2F2ZVxuICAgICAqL1xuICAgIF9zZXRTdG9yYWdlKHN0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KHN0YXRlKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tQcm9ncmVzc1RyYWNrZXJdIFdyaXRlIFN0b3JhZ2UnLCBlcnJvciwgeyBmdW5jdGlvbjogJ19zZXRTdG9yYWdlJyB9KTtcbiAgICAgICAgLy8gSGFuZGxlIHF1b3RhIGV4Y2VlZGVkIG9yIHN0b3JhZ2UgdW5hdmFpbGFibGVcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHNlc3Npb24gc3RvcmFnZSBvciBpbi1tZW1vcnkgc3RvcmFnZVxuICAgICAgICB0aGlzLl9oYW5kbGVTdG9yYWdlRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBzdG9yYWdlIGVycm9ycyAocXVvdGEgZXhjZWVkZWQsIHVuYXZhaWxhYmxlLCBldGMuKVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZFxuICAgICAqL1xuICAgIF9oYW5kbGVTdG9yYWdlRXJyb3IoZXJyb3IpIHtcbiAgICAgIC8vIFRyeSBzZXNzaW9uIHN0b3JhZ2UgYXMgZmFsbGJhY2tcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeSh0aGlzLl9nZXRTdG9yYWdlKCkpKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdbUHJvZ3Jlc3NUcmFja2VyXSBGYWxsaW5nIGJhY2sgdG8gc2Vzc2lvbiBzdG9yYWdlJyk7XG4gICAgICB9IGNhdGNoIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbUHJvZ3Jlc3NUcmFja2VyXSBTZXNzaW9uIFN0b3JhZ2UgVW5hdmFpbGFibGUnLCBzZXNzaW9uRXJyb3IsIHsgZnVuY3Rpb246ICdfaGFuZGxlU3RvcmFnZUVycm9yJyB9KTtcbiAgICAgICAgLy8gQ291bGQgaW1wbGVtZW50IGluLW1lbW9yeSBmYWxsYmFjayBoZXJlIGlmIG5lZWRlZFxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgbGFzdCB2aXNpdCB0aW1lc3RhbXBcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91cGRhdGVMYXN0VmlzaXQoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2dldFN0b3JhZ2UoKTtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICBzdGF0ZS5sYXN0VmlzaXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuX3NldFN0b3JhZ2Uoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgc3BlY2lmaWMgdG9vbHRpcCBoYXMgYmVlbiBjb21wbGV0ZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9vbHRpcElkIC0gVGhlIElEIG9mIHRoZSB0b29sdGlwIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHRvb2x0aXAgaGFzIGJlZW4gY29tcGxldGVkXG4gICAgICovXG4gICAgaXNUb29sdGlwQ29tcGxldGVkKHRvb2x0aXBJZCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9nZXRTdG9yYWdlKCk7XG4gICAgICBpZiAoIXN0YXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gc3RhdGUuY29tcGxldGVkVG9vbHRpcHMuaW5jbHVkZXModG9vbHRpcElkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXJrIGEgdG9vbHRpcCBhcyBjb21wbGV0ZWQgd2l0aCB0aW1lc3RhbXBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9vbHRpcElkIC0gVGhlIElEIG9mIHRoZSB0b29sdGlwIHRvIG1hcmsgYXMgY29tcGxldGVkXG4gICAgICovXG4gICAgbWFya1Rvb2x0aXBDb21wbGV0ZWQodG9vbHRpcElkKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2dldFN0b3JhZ2UoKTtcbiAgICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgICAgLy8gQWRkIHRvb2x0aXAgdG8gY29tcGxldGVkIGxpc3QgaWYgbm90IGFscmVhZHkgdGhlcmVcbiAgICAgIGlmICghc3RhdGUuY29tcGxldGVkVG9vbHRpcHMuaW5jbHVkZXModG9vbHRpcElkKSkge1xuICAgICAgICBzdGF0ZS5jb21wbGV0ZWRUb29sdGlwcy5wdXNoKHRvb2x0aXBJZCk7XG4gICAgICAgIFxuICAgICAgICAvLyBTdG9yZSB0aW1lc3RhbXAgZm9yIHRoaXMgc3BlY2lmaWMgdG9vbHRpcFxuICAgICAgICBpZiAoIXN0YXRlLnRvb2x0aXBUaW1lc3RhbXBzKSB7XG4gICAgICAgICAgc3RhdGUudG9vbHRpcFRpbWVzdGFtcHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS50b29sdGlwVGltZXN0YW1wc1t0b29sdGlwSWRdID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fc2V0U3RvcmFnZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGVudGlyZSB0b3VyIGhhcyBiZWVuIGNvbXBsZXRlZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0b3VyIGlzIGNvbXBsZXRlZFxuICAgICAqL1xuICAgIGlzVG91ckNvbXBsZXRlZCgpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fZ2V0U3RvcmFnZSgpO1xuICAgICAgaWYgKCFzdGF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHN0YXRlLnRvdXJDb21wbGV0ZWQgPT09IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgb25ib2FyZGluZyBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkIGZvciB0aGlzIGluc3RhbGwuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYXV0by1vbmJvYXJkaW5nIHNob3VsZCBzdGF5IHN1cHByZXNzZWRcbiAgICAgKi9cbiAgICBpc0luc3RhbGxPbmJvYXJkaW5nQ29tcGxldGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFsbE9uYm9hcmRpbmdDb21wbGV0ZWQgPT09IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyc2lzdCBpbnN0YWxsLXdpZGUgb25ib2FyZGluZyBjb21wbGV0aW9uIHNvIGl0IG9ubHkgYXV0by1zdGFydHMgb25jZS5cbiAgICAgKiBNYW51YWwgSGVscCBUb3VyIHJlc3RhcnRzIGFyZSBzdGlsbCBhbGxvd2VkIHZpYSBsb2NhbCBzdGF0ZSByZXNldC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBhc3luYyBtYXJrSW5zdGFsbE9uYm9hcmRpbmdDb21wbGV0ZWQoKSB7XG4gICAgICBpZiAodGhpcy5pbnN0YWxsT25ib2FyZGluZ0NvbXBsZXRlZCkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmluc3RhbGxPbmJvYXJkaW5nQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0eXBlb2YgU0lURSAhPT0gJ3VuZGVmaW5lZCcpIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG9uYm9hcmRpbmdDb21wbGV0ZWQ6IHRydWUgfSlcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tQcm9ncmVzc1RyYWNrZXJdIFBlcnNpc3QgSW5zdGFsbCBPbmJvYXJkaW5nJywgZXJyb3IsIHsgZnVuY3Rpb246ICdtYXJrSW5zdGFsbE9uYm9hcmRpbmdDb21wbGV0ZWQnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhlIGVudGlyZSB0b3VyIGFzIGNvbXBsZXRlZFxuICAgICAqL1xuICAgIG1hcmtUb3VyQ29tcGxldGVkKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9nZXRTdG9yYWdlKCk7XG4gICAgICBpZiAoIXN0YXRlKSByZXR1cm47XG5cbiAgICAgIHN0YXRlLnRvdXJDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgc3RhdGUuY29tcGxldGlvblRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIHRoaXMuX3NldFN0b3JhZ2Uoc3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBzdGVwIGluZGV4XG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGN1cnJlbnQgc3RlcCBpbmRleCAoMC1iYXNlZClcbiAgICAgKi9cbiAgICBnZXRDdXJyZW50U3RlcCgpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fZ2V0U3RvcmFnZSgpO1xuICAgICAgaWYgKCFzdGF0ZSkgcmV0dXJuIDA7XG4gICAgICByZXR1cm4gc3RhdGUuY3VycmVudFN0ZXAgfHwgMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgc3RlcCBpbmRleFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwSW5kZXggLSBUaGUgc3RlcCBpbmRleCB0byBzZXQgKDAtYmFzZWQpXG4gICAgICovXG4gICAgc2V0Q3VycmVudFN0ZXAoc3RlcEluZGV4KSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2dldFN0b3JhZ2UoKTtcbiAgICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgICAgc3RhdGUuY3VycmVudFN0ZXAgPSBzdGVwSW5kZXg7XG4gICAgICB0aGlzLl9zZXRTdG9yYWdlKHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBhbGwgcHJvZ3Jlc3MgYW5kIGNsZWFyIHN0b3JhZ2VcbiAgICAgKi9cbiAgICByZXNldFByb2dyZXNzKCkge1xuICAgICAgY29uc3QgZGVmYXVsdFN0YXRlID0ge1xuICAgICAgICB2ZXJzaW9uOiB0aGlzLnN0b3JhZ2VWZXJzaW9uLFxuICAgICAgICB0b3VyQ29tcGxldGVkOiBmYWxzZSxcbiAgICAgICAgY29tcGxldGVkVG9vbHRpcHM6IFtdLFxuICAgICAgICBjdXJyZW50U3RlcDogMCxcbiAgICAgICAgY29tcGxldGlvblRpbWVzdGFtcDogbnVsbCxcbiAgICAgICAgZG5zU2V0dXBEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgIGxhc3RWaXNpdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICB9O1xuICAgICAgdGhpcy5fc2V0U3RvcmFnZShkZWZhdWx0U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29tcGxldGlvbiB0aW1lc3RhbXBcbiAgICAgKiBAcmV0dXJucyB7RGF0ZXxudWxsfSBUaGUgY29tcGxldGlvbiB0aW1lc3RhbXAgb3IgbnVsbCBpZiBub3QgY29tcGxldGVkXG4gICAgICovXG4gICAgZ2V0Q29tcGxldGlvblRpbWVzdGFtcCgpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fZ2V0U3RvcmFnZSgpO1xuICAgICAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29tcGxldGlvblRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gbmV3IERhdGUoc3RhdGUuY29tcGxldGlvblRpbWVzdGFtcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgRE5TIHNldHVwIHdhcyBkZWZlcnJlZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIEROUyBzZXR1cCB3YXMgZGVmZXJyZWRcbiAgICAgKi9cbiAgICBpc0Ruc1NldHVwRGVmZXJyZWQoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2dldFN0b3JhZ2UoKTtcbiAgICAgIGlmICghc3RhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBzdGF0ZS5kbnNTZXR1cERlZmVycmVkID09PSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcmsgRE5TIHNldHVwIGFzIGRlZmVycmVkXG4gICAgICovXG4gICAgbWFya0Ruc1NldHVwRGVmZXJyZWQoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2dldFN0b3JhZ2UoKTtcbiAgICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgICAgc3RhdGUuZG5zU2V0dXBEZWZlcnJlZCA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRTdG9yYWdlKHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRpbWVzdGFtcCBmb3IgYSBzcGVjaWZpYyB0b29sdGlwIGNvbXBsZXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9vbHRpcElkIC0gVGhlIElEIG9mIHRoZSB0b29sdGlwXG4gICAgICogQHJldHVybnMge0RhdGV8bnVsbH0gVGhlIHRpbWVzdGFtcCBvciBudWxsIGlmIG5vdCBjb21wbGV0ZWRcbiAgICAgKi9cbiAgICBnZXRUb29sdGlwVGltZXN0YW1wKHRvb2x0aXBJZCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9nZXRTdG9yYWdlKCk7XG4gICAgICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS50b29sdGlwVGltZXN0YW1wcyB8fCAhc3RhdGUudG9vbHRpcFRpbWVzdGFtcHNbdG9vbHRpcElkXSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgRGF0ZShzdGF0ZS50b29sdGlwVGltZXN0YW1wc1t0b29sdGlwSWRdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGNvbXBsZXRlZCB0b29sdGlwIElEc1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gQXJyYXkgb2YgY29tcGxldGVkIHRvb2x0aXAgSURzXG4gICAgICovXG4gICAgZ2V0Q29tcGxldGVkVG9vbHRpcHMoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2dldFN0b3JhZ2UoKTtcbiAgICAgIGlmICghc3RhdGUpIHJldHVybiBbXTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb21wbGV0ZWRUb29sdGlwcyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxhc3QgdmlzaXQgdGltZXN0YW1wXG4gICAgICogQHJldHVybnMge0RhdGV8bnVsbH0gVGhlIGxhc3QgdmlzaXQgdGltZXN0YW1wXG4gICAgICovXG4gICAgZ2V0TGFzdFZpc2l0KCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9nZXRTdG9yYWdlKCk7XG4gICAgICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5sYXN0VmlzaXQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0YXRlLmxhc3RWaXNpdCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3J0IHRvIGdsb2JhbCBzY29wZVxuICB3aW5kb3cuUHJvZ3Jlc3NUcmFja2VyID0gUHJvZ3Jlc3NUcmFja2VyO1xuXG4gIGRlYnVnKCdbUHJvZ3Jlc3NUcmFja2VyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vKipcbiAqIFRoZW1lIEFkYXB0ZXJcbiAqIEVuc3VyZXMgdG9vbHRpcHMgbWF0Y2ggdGhlIGN1cnJlbnQgZGFzaGJvYXJkIHRoZW1lXG4gKiBJbnRlZ3JhdGVzIHdpdGggRHJpdmVyLmpzIHRvIGFwcGx5IHRoZW1lLXNwZWNpZmljIHN0eWxpbmdcbiAqL1xuXG4oZnVuY3Rpb24od2luZG93KSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG5cbiAgY29uc3QgZGVidWcgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh3aW5kb3cuREFTSENBRERZX0RFQlVHKSB7IGNvbnNvbGUubG9nKC4uLmFyZ3MpOyB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZW1lIGNvbmZpZ3VyYXRpb24gbWFwcGluZyBmb3IgRHJpdmVyLmpzXG4gICAqIE1hcHMgZGFzaGJvYXJkIHRoZW1lcyB0byBEcml2ZXIuanMgc3R5bGluZ1xuICAgKi9cbiAgY29uc3QgVEhFTUVfQ09ORklHUyA9IHtcbiAgICBkYXJrOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jYXJkLWJhc2UpJyxcbiAgICAgIHRleHRDb2xvcjogJ3ZhcigtLWZnKScsXG4gICAgICBwcmltYXJ5Q29sb3I6ICd2YXIoLS1hY2NlbnQpJyxcbiAgICAgIG92ZXJsYXlDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC43KScsXG4gICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWJvcmRlciknLFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6ICd2YXIoLS1hY2NlbnQpJyxcbiAgICAgIGZvbnRGYW1pbHk6IFwiJ1NhbWkgR3JvdGVzaycsICdJbnRlcicsICdTRiBQcm8gRGlzcGxheScsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmXCJcbiAgICB9LFxuICAgIGxpZ2h0OiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jYXJkLWJhc2UpJyxcbiAgICAgIHRleHRDb2xvcjogJ3ZhcigtLWZnKScsXG4gICAgICBwcmltYXJ5Q29sb3I6ICd2YXIoLS1hY2NlbnQtc3Ryb25nKScsXG4gICAgICBvdmVybGF5Q29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuNSknLFxuICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1ib3JkZXIpJyxcbiAgICAgIGhpZ2hsaWdodENvbG9yOiAndmFyKC0tYWNjZW50LXN0cm9uZyknLFxuICAgICAgZm9udEZhbWlseTogXCInU2FtaSBHcm90ZXNrJywgJ0ludGVyJywgJ1NGIFBybyBEaXNwbGF5JywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWZcIlxuICAgIH0sXG4gICAgYmx1ZToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY2FyZC1iYXNlKScsXG4gICAgICB0ZXh0Q29sb3I6ICd2YXIoLS1mZyknLFxuICAgICAgcHJpbWFyeUNvbG9yOiAndmFyKC0tYWNjZW50KScsXG4gICAgICBvdmVybGF5Q29sb3I6ICdyZ2JhKDI1LCA4LCAxNzIsIDAuNyknLFxuICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1ib3JkZXIpJyxcbiAgICAgIGhpZ2hsaWdodENvbG9yOiAndmFyKC0tYWNjZW50KScsXG4gICAgICBmb250RmFtaWx5OiBcIidTYW1pIEdyb3Rlc2snLCAnSW50ZXInLCAnU0YgUHJvIERpc3BsYXknLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHN5c3RlbS11aSwgc2Fucy1zZXJpZlwiXG4gICAgfSxcbiAgICBub3JkOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jYXJkLWJhc2UpJyxcbiAgICAgIHRleHRDb2xvcjogJ3ZhcigtLWZnKScsXG4gICAgICBwcmltYXJ5Q29sb3I6ICd2YXIoLS1hY2NlbnQpJyxcbiAgICAgIG92ZXJsYXlDb2xvcjogJ3JnYmEoNDYsIDUyLCA2NCwgMC43KScsXG4gICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWJvcmRlciknLFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6ICd2YXIoLS1hY2NlbnQpJyxcbiAgICAgIGZvbnRGYW1pbHk6IFwiJ1NhbWkgR3JvdGVzaycsICdJbnRlcicsICdTRiBQcm8gRGlzcGxheScsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmXCJcbiAgICB9LFxuICAgIGRyYWN1bGE6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNhcmQtYmFzZSknLFxuICAgICAgdGV4dENvbG9yOiAndmFyKC0tZmcpJyxcbiAgICAgIHByaW1hcnlDb2xvcjogJ3ZhcigtLWFjY2VudCknLFxuICAgICAgb3ZlcmxheUNvbG9yOiAncmdiYSg0MCwgNDIsIDU0LCAwLjcpJyxcbiAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tYm9yZGVyKScsXG4gICAgICBoaWdobGlnaHRDb2xvcjogJ3ZhcigtLWFjY2VudCknLFxuICAgICAgZm9udEZhbWlseTogXCInU2FtaSBHcm90ZXNrJywgJ0ludGVyJywgJ1NGIFBybyBEaXNwbGF5JywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWZcIlxuICAgIH0sXG4gICAgJ3NvbGFyaXplZC1kYXJrJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY2FyZC1iYXNlKScsXG4gICAgICB0ZXh0Q29sb3I6ICd2YXIoLS1mZyknLFxuICAgICAgcHJpbWFyeUNvbG9yOiAndmFyKC0tYWNjZW50KScsXG4gICAgICBvdmVybGF5Q29sb3I6ICdyZ2JhKDAsIDQzLCA1NCwgMC43KScsXG4gICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWJvcmRlciknLFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6ICd2YXIoLS1hY2NlbnQpJyxcbiAgICAgIGZvbnRGYW1pbHk6IFwiJ1NhbWkgR3JvdGVzaycsICdJbnRlcicsICdTRiBQcm8gRGlzcGxheScsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmXCJcbiAgICB9LFxuICAgICdzb2xhcml6ZWQtbGlnaHQnOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jYXJkLWJhc2UpJyxcbiAgICAgIHRleHRDb2xvcjogJ3ZhcigtLWZnKScsXG4gICAgICBwcmltYXJ5Q29sb3I6ICd2YXIoLS1hY2NlbnQpJyxcbiAgICAgIG92ZXJsYXlDb2xvcjogJ3JnYmEoMjUzLCAyNDYsIDIyNywgMC43KScsXG4gICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWJvcmRlciknLFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6ICd2YXIoLS1hY2NlbnQpJyxcbiAgICAgIGZvbnRGYW1pbHk6IFwiJ1NhbWkgR3JvdGVzaycsICdJbnRlcicsICdTRiBQcm8gRGlzcGxheScsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmXCJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZW1lQWRhcHRlciBjbGFzc1xuICAgKiBNYW5hZ2VzIHRoZW1lIGludGVncmF0aW9uIGZvciB0aGUgdG9vbHRpcCBzeXN0ZW1cbiAgICovXG4gIGNsYXNzIFRoZW1lQWRhcHRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRUaGVtZSA9IHRoaXMuZ2V0Q3VycmVudFRoZW1lKCk7XG4gICAgICB0aGlzLnRoZW1lQ2hhbmdlQ2FsbGJhY2tzID0gW107XG4gICAgICB0aGlzLl9zZXR1cFRoZW1lQ2hhbmdlTGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdGhlbWUgbmFtZSBmcm9tIGRvY3VtZW50IHJvb3QgY2xhc3NcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDdXJyZW50IHRoZW1lIG5hbWUgKGUuZy4sICdkYXJrJywgJ2xpZ2h0JywgJ2JsdWUnKVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRUaGVtZSgpIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICBjb25zdCBjbGFzc0xpc3QgPSBBcnJheS5mcm9tKHJvb3QuY2xhc3NMaXN0KTtcblxuICAgICAgLy8gQ2hlY2sgYWxsIGtub3duIHRoZW1lcyAoYnVpbHQtaW4gKyB1c2VyKSBleGNlcHQgJ2RhcmsnIChubyBjbGFzcyA9IGRhcmspXG4gICAgICBjb25zdCBhbGxUaGVtZXMgPSAod2luZG93LlRIRU1FUyB8fCBbXSkuZmlsdGVyKHQgPT4gdCAhPT0gJ2RhcmsnKTtcbiAgICAgIGNvbnN0IGZvdW5kVGhlbWUgPSBhbGxUaGVtZXMuZmluZCh0aGVtZSA9PiBjbGFzc0xpc3QuaW5jbHVkZXModGhlbWUpKTtcblxuICAgICAgcmV0dXJuIGZvdW5kVGhlbWUgfHwgJ2RhcmsnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBEcml2ZXIuanMgdGhlbWUgY29uZmlndXJhdGlvbiBmb3IgY3VycmVudCB0aGVtZVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZW1lIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICovXG4gICAgZ2V0RHJpdmVyVGhlbWUoKSB7XG4gICAgICBjb25zdCB0aGVtZU5hbWUgPSB0aGlzLmdldEN1cnJlbnRUaGVtZSgpO1xuICAgICAgY29uc3QgY29uZmlnID0gVEhFTUVfQ09ORklHU1t0aGVtZU5hbWVdIHx8IFRIRU1FX0NPTkZJR1MuZGFyaztcbiAgICAgIFxuICAgICAgLy8gUmVzb2x2ZSBDU1MgdmFyaWFibGVzIHRvIGFjdHVhbCB2YWx1ZXNcbiAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ3ZhcignKSkge1xuICAgICAgICAgIC8vIEV4dHJhY3QgQ1NTIHZhcmlhYmxlIG5hbWVcbiAgICAgICAgICBjb25zdCB2YXJOYW1lID0gdmFsdWUubWF0Y2goL3ZhclxcKCgtLVteKV0rKVxcKS8pPy5bMV07XG4gICAgICAgICAgaWYgKHZhck5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkVmFsdWUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUodmFyTmFtZSlcbiAgICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgICAgIHJlc29sdmVkQ29uZmlnW2tleV0gPSBjb21wdXRlZFZhbHVlIHx8IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlZENvbmZpZ1trZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmVkQ29uZmlnW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gcmVzb2x2ZWRDb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgdGhlbWUgY2hhbmdlc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZW1lIGNoYW5nZXNcbiAgICAgKi9cbiAgICBvblRoZW1lQ2hhbmdlKGNhbGxiYWNrKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMudGhlbWVDaGFuZ2VDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0dXAgdGhlbWUgY2hhbmdlIGxpc3RlbmVyIHVzaW5nIE11dGF0aW9uT2JzZXJ2ZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9zZXR1cFRoZW1lQ2hhbmdlTGlzdGVuZXIoKSB7XG4gICAgICBjb25zdCByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgb2JzZXJ2ZXIgdG8gd2F0Y2ggZm9yIGNsYXNzIGNoYW5nZXMgb24gcm9vdCBlbGVtZW50XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUaGVtZSA9IHRoaXMuZ2V0Q3VycmVudFRoZW1lKCk7XG4gICAgICAgICAgICBpZiAobmV3VGhlbWUgIT09IHRoaXMuY3VycmVudFRoZW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9sZFRoZW1lID0gdGhpcy5jdXJyZW50VGhlbWU7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFRoZW1lID0gbmV3VGhlbWU7XG4gICAgICAgICAgICAgIHRoaXMuX25vdGlmeVRoZW1lQ2hhbmdlKG5ld1RoZW1lLCBvbGRUaGVtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBvYnNlcnZpbmdcbiAgICAgIG9ic2VydmVyLm9ic2VydmUocm9vdCwge1xuICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnXVxuICAgICAgfSk7XG5cbiAgICAgIGRlYnVnKCdbVGhlbWVBZGFwdGVyXSBUaGVtZSBjaGFuZ2UgbGlzdGVuZXIgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RpZnkgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIG9mIHRoZW1lIGNoYW5nZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld1RoZW1lIC0gTmV3IHRoZW1lIG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkVGhlbWUgLSBPbGQgdGhlbWUgbmFtZVxuICAgICAqL1xuICAgIF9ub3RpZnlUaGVtZUNoYW5nZShuZXdUaGVtZSwgb2xkVGhlbWUpIHtcbiAgICAgIGRlYnVnKGBbVGhlbWVBZGFwdGVyXSBUaGVtZSBjaGFuZ2VkOiAke29sZFRoZW1lfSBcdTIxOTIgJHtuZXdUaGVtZX1gKTtcbiAgICAgIFxuICAgICAgdGhpcy50aGVtZUNoYW5nZUNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYWxsYmFjayhuZXdUaGVtZSwgb2xkVGhlbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RoZW1lQWRhcHRlcl0gVGhlbWUgQ2hhbmdlIENhbGxiYWNrJywgZXJyb3IsIHsgZnVuY3Rpb246ICdfbm90aWZ5VGhlbWVDaGFuZ2UnIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSB0aGVtZSB0byBEcml2ZXIuanMgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZHJpdmVyIC0gRHJpdmVyLmpzIGluc3RhbmNlXG4gICAgICovXG4gICAgYXBwbHlUaGVtZShkcml2ZXIpIHtcbiAgICAgIGlmICghZHJpdmVyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1RoZW1lQWRhcHRlcl0gTm8gZHJpdmVyIGluc3RhbmNlIHByb3ZpZGVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGhlbWVDb25maWcgPSB0aGlzLmdldERyaXZlclRoZW1lKCk7XG4gICAgICBcbiAgICAgIC8vIEFwcGx5IHRoZW1lIGNvbmZpZ3VyYXRpb24gdG8gZHJpdmVyXG4gICAgICAvLyBOb3RlOiBEcml2ZXIuanMgdjEuMCsgdXNlcyBDU1MgdmFyaWFibGVzLCBzbyB3ZSBpbmplY3QgYSBzdHlsZSBlbGVtZW50XG4gICAgICB0aGlzLl9pbmplY3REcml2ZXJTdHlsZXModGhlbWVDb25maWcpO1xuICAgICAgXG4gICAgICBkZWJ1ZygnW1RoZW1lQWRhcHRlcl0gVGhlbWUgYXBwbGllZCB0byBkcml2ZXI6JywgdGhpcy5jdXJyZW50VGhlbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamVjdCBjdXN0b20gc3R5bGVzIGZvciBEcml2ZXIuanMgYmFzZWQgb24gdGhlbWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0aGVtZUNvbmZpZyAtIFRoZW1lIGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBfaW5qZWN0RHJpdmVyU3R5bGVzKHRoZW1lQ29uZmlnKSB7XG4gICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgdGhlbWUgc3R5bGVzXG4gICAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyaXZlci10aGVtZS1zdHlsZXMnKTtcbiAgICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBuZXcgc3R5bGUgZWxlbWVudFxuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUuaWQgPSAnZHJpdmVyLXRoZW1lLXN0eWxlcyc7XG4gICAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgICAgLmRyaXZlci1wb3BvdmVyIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAke3RoZW1lQ29uZmlnLmJhY2tncm91bmRDb2xvcn0gIWltcG9ydGFudDtcbiAgICAgICAgICBjb2xvcjogJHt0aGVtZUNvbmZpZy50ZXh0Q29sb3J9ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHt0aGVtZUNvbmZpZy5ib3JkZXJDb2xvcn0gIWltcG9ydGFudDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDYwcHggcmdiYSgwLCAwLCAwLCAwLjQpICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC1mYW1pbHk6ICR7dGhlbWVDb25maWcuZm9udEZhbWlseX0gIWltcG9ydGFudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kcml2ZXItcG9wb3Zlci10aXRsZSB7XG4gICAgICAgICAgY29sb3I6ICR7dGhlbWVDb25maWcudGV4dENvbG9yfSAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LWZhbWlseTogJHt0aGVtZUNvbmZpZy5mb250RmFtaWx5fSAhaW1wb3J0YW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLmRyaXZlci1wb3BvdmVyLWRlc2NyaXB0aW9uIHtcbiAgICAgICAgICBjb2xvcjogJHt0aGVtZUNvbmZpZy50ZXh0Q29sb3J9ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC1mYW1pbHk6ICR7dGhlbWVDb25maWcuZm9udEZhbWlseX0gIWltcG9ydGFudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kcml2ZXItcG9wb3Zlci1mb290ZXIgYnV0dG9uIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAke3RoZW1lQ29uZmlnLnByaW1hcnlDb2xvcn0gIWltcG9ydGFudDtcbiAgICAgICAgICBjb2xvcjogJHt0aGVtZUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3J9ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC1mYW1pbHk6ICR7dGhlbWVDb25maWcuZm9udEZhbWlseX0gIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAuZHJpdmVyLXBvcG92ZXItZm9vdGVyIGJ1dHRvbjpob3ZlciB7XG4gICAgICAgICAgb3BhY2l0eTogMC45ICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAuZHJpdmVyLXBvcG92ZXItY2xvc2UtYnRuIHtcbiAgICAgICAgICBjb2xvcjogJHt0aGVtZUNvbmZpZy50ZXh0Q29sb3J9ICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAuZHJpdmVyLW92ZXJsYXkge1xuICAgICAgICAgIGJhY2tncm91bmQ6ICR7dGhlbWVDb25maWcub3ZlcmxheUNvbG9yfSAhaW1wb3J0YW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLmRyaXZlci1oaWdobGlnaHRlZC1lbGVtZW50IHtcbiAgICAgICAgICBvdXRsaW5lOiAycHggc29saWQgJHt0aGVtZUNvbmZpZy5oaWdobGlnaHRDb2xvcn0gIWltcG9ydGFudDtcbiAgICAgICAgICBvdXRsaW5lLW9mZnNldDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAuZHJpdmVyLXBvcG92ZXItcHJvZ3Jlc3MtdGV4dCB7XG4gICAgICAgICAgY29sb3I6ICR7dGhlbWVDb25maWcudGV4dENvbG9yfSAhaW1wb3J0YW50O1xuICAgICAgICAgIG9wYWNpdHk6IDAuNyAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtZmFtaWx5OiAke3RoZW1lQ29uZmlnLmZvbnRGYW1pbHl9ICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYXZhaWxhYmxlIHRoZW1lIG5hbWVzXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfSBBcnJheSBvZiB0aGVtZSBuYW1lc1xuICAgICAqL1xuICAgIGdldEF2YWlsYWJsZVRoZW1lcygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhUSEVNRV9DT05GSUdTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHRoZW1lIGlzIGF2YWlsYWJsZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aGVtZU5hbWUgLSBUaGVtZSBuYW1lIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlbWUgaXMgYXZhaWxhYmxlXG4gICAgICovXG4gICAgaXNUaGVtZUF2YWlsYWJsZSh0aGVtZU5hbWUpIHtcbiAgICAgIHJldHVybiBUSEVNRV9DT05GSUdTLmhhc093blByb3BlcnR5KHRoZW1lTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3J0IHRvIGdsb2JhbCBzY29wZVxuICB3aW5kb3cuVGhlbWVBZGFwdGVyID0gVGhlbWVBZGFwdGVyO1xuXG4gIGRlYnVnKCdbVGhlbWVBZGFwdGVyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vKipcbiAqIFRvb2x0aXAgRGVmaW5pdGlvbnNcbiAqIERlZmluZXMgYWxsIHRvb2x0aXAgY29udGVudCwgcG9zaXRpb25pbmcsIGFuZCBiZWhhdmlvciBmb3IgdGhlIG9uYm9hcmRpbmcgc3lzdGVtXG4gKi9cblxuKGZ1bmN0aW9uKHdpbmRvdykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4gIGNvbnN0IGRlYnVnID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAod2luZG93LkRBU0hDQUREWV9ERUJVRykgeyBjb25zb2xlLmxvZyguLi5hcmdzKTsgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIHRvb2x0aXAgZGVmaW5pdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gdG9vbHRpcCAtIFRoZSB0b29sdGlwIGRlZmluaXRpb24gdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMge09iamVjdH0geyB2YWxpZDogYm9vbGVhbiwgZXJyb3JzOiBzdHJpbmdbXSB9XG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZVRvb2x0aXBEZWZpbml0aW9uKHRvb2x0aXApIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIC8vIFJlcXVpcmVkIGZpZWxkc1xuICAgIGlmICghdG9vbHRpcC5pZCB8fCB0eXBlb2YgdG9vbHRpcC5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdUb29sdGlwIG11c3QgaGF2ZSBhIHZhbGlkIHN0cmluZyBpZCcpO1xuICAgIH1cblxuICAgIGlmICghdG9vbHRpcC5lbGVtZW50KSB7XG4gICAgICBlcnJvcnMucHVzaCgnVG9vbHRpcCBtdXN0IGhhdmUgYW4gZWxlbWVudCBzZWxlY3RvciBvciBIVE1MRWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghdG9vbHRpcC5wb3BvdmVyIHx8IHR5cGVvZiB0b29sdGlwLnBvcG92ZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcnMucHVzaCgnVG9vbHRpcCBtdXN0IGhhdmUgYSBwb3BvdmVyIG9iamVjdCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBWYWxpZGF0ZSBwb3BvdmVyIGZpZWxkc1xuICAgICAgaWYgKCF0b29sdGlwLnBvcG92ZXIudGl0bGUgfHwgdHlwZW9mIHRvb2x0aXAucG9wb3Zlci50aXRsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ1Rvb2x0aXAgcG9wb3ZlciBtdXN0IGhhdmUgYSB2YWxpZCBzdHJpbmcgdGl0bGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0b29sdGlwLnBvcG92ZXIuZGVzY3JpcHRpb24gfHwgdHlwZW9mIHRvb2x0aXAucG9wb3Zlci5kZXNjcmlwdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ1Rvb2x0aXAgcG9wb3ZlciBtdXN0IGhhdmUgYSB2YWxpZCBzdHJpbmcgZGVzY3JpcHRpb24nKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgcG9zaXRpb24gaWYgcHJvdmlkZWRcbiAgICAgIGlmICh0b29sdGlwLnBvcG92ZXIucG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgdmFsaWRQb3NpdGlvbnMgPSBbJ3RvcCcsICdib3R0b20nLCAnbGVmdCcsICdyaWdodCcsICdjZW50ZXInXTtcbiAgICAgICAgaWYgKCF2YWxpZFBvc2l0aW9ucy5pbmNsdWRlcyh0b29sdGlwLnBvcG92ZXIucG9zaXRpb24pKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYEludmFsaWQgcG9zaXRpb246ICR7dG9vbHRpcC5wb3BvdmVyLnBvc2l0aW9ufS4gTXVzdCBiZSBvbmUgb2Y6ICR7dmFsaWRQb3NpdGlvbnMuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBhbGlnbiBpZiBwcm92aWRlZFxuICAgICAgaWYgKHRvb2x0aXAucG9wb3Zlci5hbGlnbikge1xuICAgICAgICBjb25zdCB2YWxpZEFsaWducyA9IFsnc3RhcnQnLCAnY2VudGVyJywgJ2VuZCddO1xuICAgICAgICBpZiAoIXZhbGlkQWxpZ25zLmluY2x1ZGVzKHRvb2x0aXAucG9wb3Zlci5hbGlnbikpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgSW52YWxpZCBhbGlnbjogJHt0b29sdGlwLnBvcG92ZXIuYWxpZ259LiBNdXN0IGJlIG9uZSBvZjogJHt2YWxpZEFsaWducy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHNob3dCdXR0b25zIGlmIHByb3ZpZGVkXG4gICAgICBpZiAodG9vbHRpcC5wb3BvdmVyLnNob3dCdXR0b25zICYmICFBcnJheS5pc0FycmF5KHRvb2x0aXAucG9wb3Zlci5zaG93QnV0dG9ucykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ3Nob3dCdXR0b25zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgY2FsbGJhY2tzIGlmIHByb3ZpZGVkXG4gICAgICBjb25zdCBjYWxsYmFja3MgPSBbJ29uTmV4dCcsICdvblByZXZpb3VzJywgJ29uQ2xvc2UnLCAnb25TZXR1cE5vdycsICdvbkxhdGVyJ107XG4gICAgICBjYWxsYmFja3MuZm9yRWFjaChjYWxsYmFjayA9PiB7XG4gICAgICAgIGlmICh0b29sdGlwLnBvcG92ZXJbY2FsbGJhY2tdICYmIHR5cGVvZiB0b29sdGlwLnBvcG92ZXJbY2FsbGJhY2tdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYCR7Y2FsbGJhY2t9IG11c3QgYmUgYSBmdW5jdGlvbmApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjb25kaXRpb24gaWYgcHJvdmlkZWRcbiAgICBpZiAodG9vbHRpcC5jb25kaXRpb24gJiYgdHlwZW9mIHRvb2x0aXAuY29uZGl0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcnMucHVzaCgnY29uZGl0aW9uIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHByaW9yaXR5IGlmIHByb3ZpZGVkXG4gICAgaWYgKHRvb2x0aXAucHJpb3JpdHkgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdG9vbHRpcC5wcmlvcml0eSAhPT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdwcmlvcml0eSBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBhcnJheSBvZiB0b29sdGlwIGRlZmluaXRpb25zXG4gICAqIEBwYXJhbSB7QXJyYXl9IHRvb2x0aXBzIC0gQXJyYXkgb2YgdG9vbHRpcCBkZWZpbml0aW9uc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IHZhbGlkOiBib29sZWFuLCBlcnJvcnM6IE9iamVjdFtdIH1cbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlVG9vbHRpcERlZmluaXRpb25zKHRvb2x0aXBzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRvb2x0aXBzKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcnM6IFt7IHRvb2x0aXA6IG51bGwsIGVycm9yczogWyd0b29sdGlwcyBtdXN0IGJlIGFuIGFycmF5J10gfV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgYWxsRXJyb3JzID0gW107XG4gICAgY29uc3QgaWRzID0gbmV3IFNldCgpO1xuXG4gICAgdG9vbHRpcHMuZm9yRWFjaCgodG9vbHRpcCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVRvb2x0aXBEZWZpbml0aW9uKHRvb2x0aXApO1xuICAgICAgXG4gICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgYWxsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRvb2x0aXA6IHRvb2x0aXAuaWQgfHwgYGluZGV4ICR7aW5kZXh9YCxcbiAgICAgICAgICBlcnJvcnM6IHZhbGlkYXRpb24uZXJyb3JzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIElEc1xuICAgICAgaWYgKHRvb2x0aXAuaWQpIHtcbiAgICAgICAgaWYgKGlkcy5oYXModG9vbHRpcC5pZCkpIHtcbiAgICAgICAgICBhbGxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICB0b29sdGlwOiB0b29sdGlwLmlkLFxuICAgICAgICAgICAgZXJyb3JzOiBbYER1cGxpY2F0ZSB0b29sdGlwIElEOiAke3Rvb2x0aXAuaWR9YF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZHMuYWRkKHRvb2x0aXAuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBhbGxFcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzOiBhbGxFcnJvcnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVycm9yIGhhbmRsZXIgZm9yIHRvb2x0aXAgc3lzdGVtXG4gICAqL1xuICBjbGFzcyBUb29sdGlwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgdG9vbHRpcElkID0gbnVsbCkge1xuICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICB0aGlzLm5hbWUgPSAnVG9vbHRpcEVycm9yJztcbiAgICAgIHRoaXMudG9vbHRpcElkID0gdG9vbHRpcElkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdG9vbHRpcCBkZWZpbml0aW9uIGVycm9yc1xuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsaWRhdGlvbiAtIFZhbGlkYXRpb24gcmVzdWx0XG4gICAqIEB0aHJvd3Mge1Rvb2x0aXBFcnJvcn0gSWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVmFsaWRhdGlvbkVycm9ycyh2YWxpZGF0aW9uKSB7XG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gdmFsaWRhdGlvbi5lcnJvcnMubWFwKGUgPT4gXG4gICAgICAgIGAke2UudG9vbHRpcH06ICR7ZS5lcnJvcnMuam9pbignLCAnKX1gXG4gICAgICApLmpvaW4oJ1xcbicpO1xuICAgICAgXG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUb29sdGlwRGVmaW5pdGlvbnNdIFZhbGlkYXRpb24nLCBlcnJvck1lc3NhZ2VzLCB7IGZ1bmN0aW9uOiAndmFsaWRhdGVUb29sdGlwJyB9KTtcbiAgICAgIHRocm93IG5ldyBUb29sdGlwRXJyb3IoYFRvb2x0aXAgdmFsaWRhdGlvbiBmYWlsZWQ6XFxuJHtlcnJvck1lc3NhZ2VzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV4cG9ydCB0byBnbG9iYWwgc2NvcGVcbiAgd2luZG93LlRvb2x0aXBWYWxpZGF0aW9uID0ge1xuICAgIHZhbGlkYXRlVG9vbHRpcERlZmluaXRpb24sXG4gICAgdmFsaWRhdGVUb29sdGlwRGVmaW5pdGlvbnMsXG4gICAgaGFuZGxlVmFsaWRhdGlvbkVycm9ycyxcbiAgICBUb29sdGlwRXJyb3JcbiAgfTtcblxuICBkZWJ1ZygnW1Rvb2x0aXBEZWZpbml0aW9uc10gVmFsaWRhdGlvbiBtb2R1bGUgbG9hZGVkJyk7XG5cbiAgLy8gKElJRkUgY2xvc2UgbW92ZWQgdG8gRU9GIFx1MjAxNCB0aGUgVE9PTFRJUF9ERUZJTklUSU9OUyBhcnJheSBhbmQgZ2V0dGVyXG4gIC8vIGhlbHBlcnMgYmVsb3cgbXVzdCBzdGF5IGluc2lkZSB0aGlzIElJRkUgc28gdGhleSBoYXZlIGFjY2VzcyB0byBgZGVidWdgXG4gIC8vIGFuZCBgZXJyb3JIYW5kbGVyYC4gVGhlIGVhcmx5IGB9KSh3aW5kb3cpO2AgaGVyZSB1c2VkIHRvIGZhbGwgb3V0IG9mXG4gIC8vIHNjb3BlLCBsZWF2aW5nIHRoZSBsYXRlciBgZGVidWcoLi4uKWAgY2FsbCByZWZlcmVuY2luZyBhbiB1bmRlZmluZWQgbmFtZS4pXG5cbi8qKlxuICogVG9vbHRpcCBEZWZpbml0aW9ucyBBcnJheVxuICogRGVmaW5lcyBhbGwgdG9vbHRpcHMgZm9yIHRoZSBvbmJvYXJkaW5nIHRvdXJcbiAqL1xuY29uc3QgVE9PTFRJUF9ERUZJTklUSU9OUyA9IFtcbiAgLy8gMS4gV2VsY29tZVxuICB7XG4gICAgaWQ6ICd3ZWxjb21lJyxcbiAgICBlbGVtZW50OiAnI2JyYW5kJyxcbiAgICBwb3BvdmVyOiB7XG4gICAgICB0aXRsZTogJ1dlbGNvbWUgdG8gRGFzaENhZGR5IScsXG4gICAgICBkZXNjcmlwdGlvbjogYFxuICAgICAgICA8cD5Zb3VyIHVuaWZpZWQgY29udHJvbCBwYW5lbCBmb3IgPHN0cm9uZz5Eb2NrZXI8L3N0cm9uZz4sIDxzdHJvbmc+Q2FkZHk8L3N0cm9uZz4sIGFuZCA8c3Ryb25nPkROUzwvc3Ryb25nPiAmbWRhc2g7IGFsbCBpbiBvbmUgcGxhY2UuPC9wPlxuICAgICAgICA8cD5UaGlzIHRvdXIgd2lsbCB3YWxrIHlvdSB0aHJvdWdoIGV2ZXJ5IHNlY3Rpb24gc28geW91IGtub3cgZXhhY3RseSB3aGVyZSBldmVyeXRoaW5nIGlzLjwvcD5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgb3BhY2l0eTogMC43O1wiPllvdSBjYW4gY2xpY2sgeW91ciBsb2dvIGFueXRpbWUgdG8gY3VzdG9taXplIGl0LjwvcD5cbiAgICAgIGAsXG4gICAgICBwb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICBhbGlnbjogJ3N0YXJ0JyxcbiAgICAgIHNob3dCdXR0b25zOiBbJ25leHQnXSxcbiAgICAgIHNob3dQcm9ncmVzczogdHJ1ZVxuICAgIH0sXG4gICAgcHJpb3JpdHk6IDFcbiAgfSxcblxuICAvLyAyLiBJbmZyYXN0cnVjdHVyZSByb3dcbiAge1xuICAgIGlkOiAnaW5mcmFzdHJ1Y3R1cmUnLFxuICAgIGVsZW1lbnQ6ICcudG9wJyxcbiAgICBwb3BvdmVyOiB7XG4gICAgICB0aXRsZTogJ0luZnJhc3RydWN0dXJlIE92ZXJ2aWV3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgXG4gICAgICAgIDxwPlRoaXMgdG9wIHJvdyBzaG93cyB0aGUgYmFja2JvbmUgb2YgeW91ciBzZXR1cDo8L3A+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5ETlMxIC8gRE5TMiAvIEROUzM8L3N0cm9uZz4gJm1kYXNoOyB5b3VyIFRlY2huaXRpdW0gRE5TIHNlcnZlcnM8L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPkludGVybmV0PC9zdHJvbmc+ICZtZGFzaDsgbGl2ZSBjb25uZWN0aXZpdHkgY2hlY2sgd2l0aCBwYWNrZXQgaW5kaWNhdG9yczwvbGk+XG4gICAgICAgICAgPGxpPjxzdHJvbmc+QXV0aDwvc3Ryb25nPiAmbWRhc2g7IFRPVFAgYXV0aGVudGljYXRpb24gc3RhdHVzPC9saT5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5EYXNoQ0E8L3N0cm9uZz4gJm1kYXNoOyB5b3VyIGNlcnRpZmljYXRlIGF1dGhvcml0eSBmb3IgeW91ciBjdXN0b20gZG9tYWluPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IG9wYWNpdHk6IDAuNztcIj5UaGVzZSBjb3JlIHNlcnZpY2VzIGFyZSBhbHdheXMgcGlubmVkIGhlcmUsIHNlcGFyYXRlIGZyb20geW91ciBhcHAgZ3JpZC48L3A+XG4gICAgICBgLFxuICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgc2hvd0J1dHRvbnM6IFsncHJldmlvdXMnLCAnbmV4dCddLFxuICAgICAgc2hvd1Byb2dyZXNzOiB0cnVlXG4gICAgfSxcbiAgICBwcmlvcml0eTogMlxuICB9LFxuXG4gIC8vIDMuIFNlcnZpY2UgY2FyZHNcbiAge1xuICAgIGlkOiAnc2VydmljZS1jYXJkcycsXG4gICAgZWxlbWVudDogJyNjYXJkcycsXG4gICAgcG9wb3Zlcjoge1xuICAgICAgdGl0bGU6ICdZb3VyIEFwcCBHcmlkJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgXG4gICAgICAgIDxwPkV2ZXJ5IGFwcCB5b3UgZGVwbG95IGFwcGVhcnMgaGVyZSBhcyBhIGNhcmQuIEVhY2ggb25lIHNob3dzOjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT48c3Ryb25nPlN0YXR1cyBkb3Q8L3N0cm9uZz4gJm1kYXNoOyBncmVlbiA9IG9ubGluZSwgcmVkID0gb2ZmbGluZSAocHVsc2VzIHdoZW4gZG93bik8L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPk9OL09GRiBiYWRnZTwvc3Ryb25nPiAmbWRhc2g7IGN1cnJlbnQgc3RhdGUgYXQgYSBnbGFuY2U8L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPlJlc3BvbnNlIHRpbWU8L3N0cm9uZz4gJm1kYXNoOyBob3cgZmFzdCB0aGUgc2VydmljZSByZXNwb25kcyAoY29sb3ItY29kZWQpPC9saT5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5VcHRpbWUgYmFyPC9zdHJvbmc+ICZtZGFzaDsgaGlzdG9yaWNhbCB1cHRpbWUgcGVyY2VudGFnZTwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBvcGFjaXR5OiAwLjc7XCI+SG92ZXIgb3ZlciBhIGNhcmQgdG8gc2VlIGFjdGlvbiBidXR0b25zOiBMb2dzLCBSZXN0YXJ0LCBVcGRhdGUsIFNldHRpbmdzLCBhbmQgT3Blbi48L3A+XG4gICAgICBgLFxuICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgc2hvd0J1dHRvbnM6IFsncHJldmlvdXMnLCAnbmV4dCddLFxuICAgICAgc2hvd1Byb2dyZXNzOiB0cnVlXG4gICAgfSxcbiAgICBwcmlvcml0eTogM1xuICB9LFxuXG4gIC8vIDQuIEFwcCBTZWxlY3RvclxuICB7XG4gICAgaWQ6ICdhcHAtc2VsZWN0b3InLFxuICAgIGVsZW1lbnQ6ICcjYWRkLXNlcnZpY2UtYnRuJyxcbiAgICBwb3BvdmVyOiB7XG4gICAgICB0aXRsZTogJ0FwcCBTZWxlY3RvciAmbWRhc2g7IERlcGxveSBpbiBPbmUgQ2xpY2snLFxuICAgICAgZGVzY3JpcHRpb246IGBcbiAgICAgICAgPHA+QnJvd3NlIDxzdHJvbmc+NTArIHNlbGYtaG9zdGVkIGFwcHM8L3N0cm9uZz4gb3JnYW5pemVkIGJ5IGNhdGVnb3J5OjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT5NZWRpYSAoUGxleCwgSmVsbHlmaW4sIEVtYnksIE92ZXJzZWVycik8L2xpPlxuICAgICAgICAgIDxsaT5Eb3dubG9hZHMgKCphcnIgc3RhY2ssIHFCaXR0b3JyZW50LCBUcmFuc21pc3Npb24pPC9saT5cbiAgICAgICAgICA8bGk+UHJvZHVjdGl2aXR5IChOZXh0Y2xvdWQsIFZhdWx0d2FyZGVuLCBHaXRlYSk8L2xpPlxuICAgICAgICAgIDxsaT5Nb25pdG9yaW5nIChVcHRpbWUgS3VtYSwgR3JhZmFuYSwgUHJvbWV0aGV1cyk8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8cD5FYWNoIGFwcCBkZXBsb3lzIHdpdGggRG9ja2VyLCBDYWRkeSByZXZlcnNlIHByb3h5LCBhbmQgRE5TICZtZGFzaDsgZnVsbHkgY29uZmlndXJlZCBhdXRvbWF0aWNhbGx5LjwvcD5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHJnYmEoMjQxLDE5NiwxNSwwLjEyKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNDEsMTk2LDE1LDAuMjUpOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiAjZjFjNDBmO1wiPiYjOTczMzsgUHJlbWl1bTo8L3N0cm9uZz4gPHN0cm9uZz5SZWNpcGVzPC9zdHJvbmc+IGxldCB5b3UgZGVwbG95IGVudGlyZSBzdGFja3MgKGUuZy4sIGZ1bGwgbWVkaWEgc2VydmVyKSBpbiBvbmUgY2xpY2sgd2l0aCBwcmUtd2lyZWQgY29uZmlncy5cbiAgICAgICAgPC9wPlxuICAgICAgYCxcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgIHNob3dCdXR0b25zOiBbJ3ByZXZpb3VzJywgJ25leHQnXSxcbiAgICAgIHNob3dQcm9ncmVzczogdHJ1ZVxuICAgIH0sXG4gICAgcHJpb3JpdHk6IDQsXG4gICAgY29uZGl0aW9uOiAoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXNlcnZpY2UtYnRuJykgIT09IG51bGxcbiAgfSxcblxuICAvLyA1LiBTbWFydCBBcnIgQ29ubmVjdFxuICB7XG4gICAgaWQ6ICdzbWFydC1hcnInLFxuICAgIGVsZW1lbnQ6ICcjYXJyLXNldHVwLWJ0bicsXG4gICAgcG9wb3Zlcjoge1xuICAgICAgdGl0bGU6ICdTbWFydCBBcnIgQ29ubmVjdCcsXG4gICAgICBkZXNjcmlwdGlvbjogYFxuICAgICAgICA8cD5BdXRvbWF0aWNhbGx5IHdpcmUgdXAgeW91ciBlbnRpcmUgbWVkaWEgc3RhY2s6PC9wPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpPkRldGVjdHMgcnVubmluZyBBcnIgc2VydmljZXMgKFJhZGFyciwgU29uYXJyLCBQcm93bGFyciwgZXRjLik8L2xpPlxuICAgICAgICAgIDxsaT5Db25uZWN0cyB0aGVtIHRvZ2V0aGVyIHdpdGggdGhlIHJpZ2h0IEFQSSBrZXlzPC9saT5cbiAgICAgICAgICA8bGk+TGlua3MgUGxleC9KZWxseWZpbiB0byBPdmVyc2VlcnIgZm9yIHJlcXVlc3QgbWFuYWdlbWVudDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBvcGFjaXR5OiAwLjc7XCI+Tm8gbWFudWFsIEFQSSBrZXkgY29weWluZyAmbWRhc2g7IERhc2hDYWRkeSBoYW5kbGVzIGl0IGFsbC48L3A+XG4gICAgICBgLFxuICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgc2hvd0J1dHRvbnM6IFsncHJldmlvdXMnLCAnbmV4dCddLFxuICAgICAgc2hvd1Byb2dyZXNzOiB0cnVlXG4gICAgfSxcbiAgICBwcmlvcml0eTogNSxcbiAgICBjb25kaXRpb246ICgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcnItc2V0dXAtYnRuJykgIT09IG51bGxcbiAgfSxcblxuICAvLyA2LiBBZGQgQXBwIE1hbnVhbGx5ICh0b29sYmFyKVxuICB7XG4gICAgaWQ6ICdhZGQtbWFudWFsJyxcbiAgICBlbGVtZW50OiAnI2FkZC1zZXJ2aWNlJyxcbiAgICBwb3BvdmVyOiB7XG4gICAgICB0aXRsZTogJ0FkZCBBcHAgTWFudWFsbHknLFxuICAgICAgZGVzY3JpcHRpb246IGBcbiAgICAgICAgPHA+QWxyZWFkeSBoYXZlIGEgc2VydmljZSBydW5uaW5nPyBBZGQgaXQgdG8geW91ciBkYXNoYm9hcmQgbWFudWFsbHkuPC9wPlxuICAgICAgICA8cD5Zb3UgY2FuIGFkZDo8L3A+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5Eb2NrZXIgY29udGFpbmVyczwvc3Ryb25nPiAmbWRhc2g7IGF1dG8tZGV0ZWN0cyBydW5uaW5nIGNvbnRhaW5lcnM8L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPkV4dGVybmFsIHNlcnZpY2VzPC9zdHJvbmc+ICZtZGFzaDsgYW55IFVSTCB5b3Ugd2FudCB0byBtb25pdG9yPC9saT5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5UZXN0IHNlcnZpY2VzPC9zdHJvbmc+ICZtZGFzaDsgdHJ5IHRoZSBVSSB3aXRob3V0IGRlcGxveWluZyBhbnl0aGluZzwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICBgLFxuICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgc2hvd0J1dHRvbnM6IFsncHJldmlvdXMnLCAnbmV4dCddLFxuICAgICAgc2hvd1Byb2dyZXNzOiB0cnVlXG4gICAgfSxcbiAgICBwcmlvcml0eTogNlxuICB9LFxuXG4gIC8vIDcuIFRoZW1lXG4gIHtcbiAgICBpZDogJ3RoZW1lLXNlbGVjdG9yJyxcbiAgICBlbGVtZW50OiAnI3RoZW1lJyxcbiAgICBwb3BvdmVyOiB7XG4gICAgICB0aXRsZTogJ1RoZW1lcycsXG4gICAgICBkZXNjcmlwdGlvbjogYFxuICAgICAgICA8cD5Td2l0Y2ggYmV0d2VlbiA8c3Ryb25nPjcgYnVpbHQtaW4gdGhlbWVzPC9zdHJvbmc+OjwvcD5cbiAgICAgICAgPHA+RGFyaywgTGlnaHQsIEJsdWUsIE5vcmQsIERyYWN1bGEsIFNvbGFyaXplZCBEYXJrLCBhbmQgU29sYXJpemVkIExpZ2h0LjwvcD5cbiAgICAgICAgPHA+WW91ciBwcmVmZXJlbmNlIGlzIHNhdmVkIGF1dG9tYXRpY2FsbHkuIFlvdSBjYW4gYWxzbyBidWlsZCBjdXN0b20gdGhlbWVzIHdpdGggdGhlIFRoZW1lIEJ1aWxkZXIgKGluIEFkbWluICZyYXJyOyBzZXR0aW5ncykuPC9wPlxuICAgICAgYCxcbiAgICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgICAgIHNob3dCdXR0b25zOiBbJ3ByZXZpb3VzJywgJ25leHQnXSxcbiAgICAgIHNob3dQcm9ncmVzczogdHJ1ZVxuICAgIH0sXG4gICAgcHJpb3JpdHk6IDdcbiAgfSxcblxuICAvLyA4LiBUb29sYmFyOiBTdGF0dXMgc2VjdGlvblxuICB7XG4gICAgaWQ6ICd0b29sYmFyLXN0YXR1cycsXG4gICAgZWxlbWVudDogJy50b29scy1zZWN0aW9uW2RhdGEtc2VjdGlvbj1cInN0YXR1c1wiXScsXG4gICAgcG9wb3Zlcjoge1xuICAgICAgdGl0bGU6ICdTdGF0dXMgVG9vbHMnLFxuICAgICAgZGVzY3JpcHRpb246IGBcbiAgICAgICAgPHA+Q2xpY2sgPHN0cm9uZz5TdGF0dXM8L3N0cm9uZz4gdG8gZXhwYW5kIHRoZXNlIHRvb2xzOjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT48c3Ryb25nPk1vbml0b3I8L3N0cm9uZz4gJm1kYXNoOyBsaXZlIENQVSwgbWVtb3J5LCBhbmQgZGlzayB1c2FnZSBmb3IgZXZlcnkgY29udGFpbmVyPC9saT5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5IZWFsdGg8L3N0cm9uZz4gJm1kYXNoOyBzZXJ2aWNlIGhlYWx0aCBkYXNoYm9hcmQgd2l0aCB1cHRpbWUgaGlzdG9yeSBhbmQgYWxlcnRzPC9saT5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5VcGRhdGVzPC9zdHJvbmc+ICZtZGFzaDsgY2hlY2sgZm9yIGFuZCBhcHBseSBEb2NrZXIgaW1hZ2UgdXBkYXRlczwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBvcGFjaXR5OiAwLjc7XCI+VGhlc2Ugc2VjdGlvbnMgcmVtZW1iZXIgd2hldGhlciB5b3UgbGVmdCB0aGVtIG9wZW4gb3IgY2xvc2VkLjwvcD5cbiAgICAgIGAsXG4gICAgICBwb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICBzaG93QnV0dG9uczogWydwcmV2aW91cycsICduZXh0J10sXG4gICAgICBzaG93UHJvZ3Jlc3M6IHRydWVcbiAgICB9LFxuICAgIHByaW9yaXR5OiA4XG4gIH0sXG5cbiAgLy8gOS4gVG9vbGJhcjogVG9vbHMgc2VjdGlvblxuICB7XG4gICAgaWQ6ICd0b29sYmFyLXRvb2xzJyxcbiAgICBlbGVtZW50OiAnLnRvb2xzLXNlY3Rpb25bZGF0YS1zZWN0aW9uPVwidG9vbHNcIl0nLFxuICAgIHBvcG92ZXI6IHtcbiAgICAgIHRpdGxlOiAnT3BlcmF0aW9uYWwgVG9vbHMnLFxuICAgICAgZGVzY3JpcHRpb246IGBcbiAgICAgICAgPHA+Q2xpY2sgPHN0cm9uZz5Ub29sczwvc3Ryb25nPiBmb3IgZGF5LXRvLWRheSBvcGVyYXRpb25zOjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT48c3Ryb25nPkxvZ3M8L3N0cm9uZz4gJm1kYXNoOyB2aWV3IGVycm9yIGxvZ3MgZnJvbSB5b3VyIEFQSSBzZXJ2ZXIgYW5kIHNlcnZpY2VzPC9saT5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5BbGVydHM8L3N0cm9uZz4gJm1kYXNoOyBjb25maWd1cmUgbm90aWZpY2F0aW9uIHJ1bGVzIChlbWFpbCwgd2ViaG9vaywgZXRjLik8L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPkF1ZGl0PC9zdHJvbmc+ICZtZGFzaDsgZnVsbCBhdWRpdCB0cmFpbCBvZiBldmVyeSBhY3Rpb24gdGFrZW4gaW4gRGFzaENhZGR5PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIGAsXG4gICAgICBwb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICBzaG93QnV0dG9uczogWydwcmV2aW91cycsICduZXh0J10sXG4gICAgICBzaG93UHJvZ3Jlc3M6IHRydWVcbiAgICB9LFxuICAgIHByaW9yaXR5OiA5XG4gIH0sXG5cbiAgLy8gMTAuIFRvb2xiYXI6IEFkbWluIHNlY3Rpb25cbiAge1xuICAgIGlkOiAndG9vbGJhci1hZG1pbicsXG4gICAgZWxlbWVudDogJy50b29scy1zZWN0aW9uW2RhdGEtc2VjdGlvbj1cImFkbWluXCJdJyxcbiAgICBwb3BvdmVyOiB7XG4gICAgICB0aXRsZTogJ0FkbWluICZhbXA7IENvbmZpZ3VyYXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246IGBcbiAgICAgICAgPHA+Q2xpY2sgPHN0cm9uZz5BZG1pbjwvc3Ryb25nPiBmb3Igc2V0dXAgYW5kIG1haW50ZW5hbmNlOjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT48c3Ryb25nPlRva2Vuczwvc3Ryb25nPiAmbWRhc2g7IG1hbmFnZSBBUEkga2V5cyBmb3IgRE5TIGFuZCBvdGhlciBpbnRlZ3JhdGlvbnM8L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPkV4cG9ydCAvIEltcG9ydDwvc3Ryb25nPiAmbWRhc2g7IGJhY2t1cCBhbmQgcmVzdG9yZSB5b3VyIGRhc2hib2FyZCBjb25maWd1cmF0aW9uPC9saT5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5CYWNrdXA8L3N0cm9uZz4gJm1kYXNoOyBmdWxsIHN5c3RlbSBiYWNrdXAgYW5kIHJlc3RvcmU8L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPkxpY2Vuc2U8L3N0cm9uZz4gJm1kYXNoOyBhY3RpdmF0ZSB5b3VyIGxpY2Vuc2UgY29kZSB0byB1bmxvY2sgcHJlbWl1bSBmZWF0dXJlczwvbGk+XG4gICAgICAgICAgPGxpPjxzdHJvbmc+QVBJPC9zdHJvbmc+ICZtZGFzaDsgaW50ZXJhY3RpdmUgQVBJIGRvY3VtZW50YXRpb24gKDEyNSsgZW5kcG9pbnRzKTwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICBgLFxuICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgc2hvd0J1dHRvbnM6IFsncHJldmlvdXMnLCAnbmV4dCddLFxuICAgICAgc2hvd1Byb2dyZXNzOiB0cnVlXG4gICAgfSxcbiAgICBwcmlvcml0eTogMTBcbiAgfSxcblxuICAvLyAxMS4gV2VhdGhlciB3aWRnZXRcbiAge1xuICAgIGlkOiAnd2VhdGhlcicsXG4gICAgZWxlbWVudDogJyN3ZWF0aGVyLXdpZGdldCcsXG4gICAgcG9wb3Zlcjoge1xuICAgICAgdGl0bGU6ICdXZWF0aGVyIFdpZGdldCcsXG4gICAgICBkZXNjcmlwdGlvbjogYFxuICAgICAgICA8cD5TaG93cyBjdXJyZW50IGNvbmRpdGlvbnMgZm9yIHlvdXIgbG9jYXRpb24uIENsaWNrIHRoZSA8c3Ryb25nPmdlYXIgaWNvbjwvc3Ryb25nPiB0byBjb25maWd1cmUgeW91ciBjaXR5IG9yIHN3aXRjaCB0ZW1wZXJhdHVyZSB1bml0cy48L3A+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBvcGFjaXR5OiAwLjc7XCI+VXNlcyBPcGVuLU1ldGVvICZtZGFzaDsgbm8gQVBJIGtleSByZXF1aXJlZC48L3A+XG4gICAgICBgLFxuICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgc2hvd0J1dHRvbnM6IFsncHJldmlvdXMnLCAnbmV4dCddLFxuICAgICAgc2hvd1Byb2dyZXNzOiB0cnVlXG4gICAgfSxcbiAgICBwcmlvcml0eTogMTEsXG4gICAgY29uZGl0aW9uOiAoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VhdGhlci13aWRnZXQnKSAhPT0gbnVsbFxuICB9LFxuXG4gIC8vIDEyLiBSZWxvYWQgQ2FkZHlcbiAge1xuICAgIGlkOiAncmVsb2FkLWNhZGR5JyxcbiAgICBlbGVtZW50OiAnI3JlbG9hZC1jYWRkeS10b3AnLFxuICAgIHBvcG92ZXI6IHtcbiAgICAgIHRpdGxlOiAnUmVsb2FkIENhZGR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgXG4gICAgICAgIDxwPkFmdGVyIGNoYW5naW5nIENhZGR5IGNvbmZpZ3VyYXRpb24gKGFkZGluZyByZXZlcnNlIHByb3h5IHJ1bGVzLCBTU0wgc2V0dGluZ3MsIGV0Yy4pLCBjbGljayBoZXJlIHRvIGFwcGx5IHRoZSBjaGFuZ2VzIGxpdmUuPC9wPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgb3BhY2l0eTogMC43O1wiPlRoaXMgaXMgYSBncmFjZWZ1bCByZWxvYWQgJm1kYXNoOyBleGlzdGluZyBjb25uZWN0aW9ucyBhcmUgbm90IGRyb3BwZWQuPC9wPlxuICAgICAgYCxcbiAgICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgICAgIGFsaWduOiAnZW5kJyxcbiAgICAgIHNob3dCdXR0b25zOiBbJ3ByZXZpb3VzJywgJ25leHQnXSxcbiAgICAgIHNob3dQcm9ncmVzczogdHJ1ZVxuICAgIH0sXG4gICAgcHJpb3JpdHk6IDEyLFxuICAgIGNvbmRpdGlvbjogKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKSAhPT0gbnVsbFxuICB9LFxuXG4gIC8vIDEzLiBGaW5pc2hcbiAge1xuICAgIGlkOiAndG91ci1jb21wbGV0ZScsXG4gICAgZWxlbWVudDogJyNicmFuZCcsXG4gICAgcG9wb3Zlcjoge1xuICAgICAgdGl0bGU6ICdZb3VcXCdyZSBBbGwgU2V0IScsXG4gICAgICBkZXNjcmlwdGlvbjogYFxuICAgICAgICA8cD5UaGF0IGNvdmVycyB0aGUgZXNzZW50aWFscy4gQSBmZXcgdGlwcyB0byBnZXQgdGhlIG1vc3Qgb3V0IG9mIERhc2hDYWRkeTo8L3A+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGk+PHN0cm9uZz5DbGljayBhbnkgY2FyZDwvc3Ryb25nPiB0byBvcGVuIHRoYXQgc2VydmljZSBkaXJlY3RseTwvbGk+XG4gICAgICAgICAgPGxpPjxzdHJvbmc+S2V5Ym9hcmQgc2hvcnRjdXRzPC9zdHJvbmc+ICZtZGFzaDsgcHJlc3MgPGNvZGU+PzwvY29kZT4gYW55dGltZSB0byBzZWUgdGhlbSBhbGw8L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPkRhc2hDQTwvc3Ryb25nPiAmbWRhc2g7IHZpc2l0IHlvdXIgQ0EgcGFnZSB0byBpbnN0YWxsIHRoZSByb290IGNlcnRpZmljYXRlIG9uIGFueSBkZXZpY2U8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjQxLDE5NiwxNSwwLjEpLCByZ2JhKDI0MywxNTYsMTgsMC4wOCkpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI0MSwxOTYsMTUsMC4yNSk7XCI+XG4gICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDAgMCA2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjZjFjNDBmO1wiPiYjOTczMzsgVW5sb2NrIFByZW1pdW08L3A+XG4gICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5QcmVtaXVtIGFkZHMgcG93ZXJmdWwgZmVhdHVyZXMgZm9yIHNlcmlvdXMgaG9tZWxhYmJlcnM6PC9wPlxuICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjogNnB4IDAgMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgPGxpPjxzdHJvbmc+QXV0by1Mb2dpbiBTU088L3N0cm9uZz4gJm1kYXNoOyBzaWduIGludG8gZXZlcnkgYXBwIGF1dG9tYXRpY2FsbHksIG5vIG1vcmUgcGFzc3dvcmQganVnZ2xpbmc8L2xpPlxuICAgICAgICAgICAgPGxpPjxzdHJvbmc+UmVjaXBlczwvc3Ryb25nPiAmbWRhc2g7IGRlcGxveSBmdWxsIHN0YWNrcyAobWVkaWEgc2VydmVyLCBkZXYgZW52aXJvbm1lbnQpIGluIG9uZSBjbGljazwvbGk+XG4gICAgICAgICAgICA8bGk+PHN0cm9uZz5Eb2NrZXIgU3dhcm08L3N0cm9uZz4gJm1kYXNoOyBvcmNoZXN0cmF0ZSBtdWx0aS1ub2RlIGNsdXN0ZXJzIGZyb20geW91ciBkYXNoYm9hcmQ8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDhweCAwIDA7IGZvbnQtc2l6ZTogMC44MnJlbTsgb3BhY2l0eTogMC44O1wiPkFjdGl2YXRlIGluIDxzdHJvbmc+QWRtaW4gJnJhcnI7IExpY2Vuc2U8L3N0cm9uZz48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgb3BhY2l0eTogMC43O1wiPllvdSBjYW4gcmVzdGFydCB0aGlzIHRvdXIgYW55dGltZSBmcm9tIDxzdHJvbmc+QWRtaW4gJnJhcnI7IEhlbHAgVG91cjwvc3Ryb25nPi48L3A+XG4gICAgICBgLFxuICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgYWxpZ246ICdzdGFydCcsXG4gICAgICBzaG93QnV0dG9uczogWydwcmV2aW91cycsICdjbG9zZSddLFxuICAgICAgc2hvd1Byb2dyZXNzOiB0cnVlXG4gICAgfSxcbiAgICBwcmlvcml0eTogMTNcbiAgfVxuXTtcblxuLyoqXG4gKiBHZXQgdG9vbHRpcCBkZWZpbml0aW9uc1xuICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiB0b29sdGlwIGRlZmluaXRpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFRvb2x0aXBEZWZpbml0aW9ucygpIHtcbiAgcmV0dXJuIFRPT0xUSVBfREVGSU5JVElPTlM7XG59XG5cbi8qKlxuICogR2V0IGEgc3BlY2lmaWMgdG9vbHRpcCBieSBJRFxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbHRpcCBJRFxuICogQHJldHVybnMge09iamVjdHxudWxsfSBUb29sdGlwIGRlZmluaXRpb24gb3IgbnVsbCBpZiBub3QgZm91bmRcbiAqL1xuZnVuY3Rpb24gZ2V0VG9vbHRpcEJ5SWQoaWQpIHtcbiAgcmV0dXJuIFRPT0xUSVBfREVGSU5JVElPTlMuZmluZCh0ID0+IHQuaWQgPT09IGlkKSB8fCBudWxsO1xufVxuXG4vKipcbiAqIEdldCB0b29sdGlwcyBmaWx0ZXJlZCBieSBjb25kaXRpb25cbiAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2YgdG9vbHRpcHMgdGhhdCBwYXNzIHRoZWlyIGNvbmRpdGlvbiBjaGVja1xuICovXG5mdW5jdGlvbiBnZXRBY3RpdmVUb29sdGlwcygpIHtcbiAgcmV0dXJuIFRPT0xUSVBfREVGSU5JVElPTlMuZmlsdGVyKHRvb2x0aXAgPT4ge1xuICAgIGlmICh0b29sdGlwLmNvbmRpdGlvbiAmJiB0eXBlb2YgdG9vbHRpcC5jb25kaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0b29sdGlwLmNvbmRpdGlvbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVG9vbHRpcERlZmluaXRpb25zXSBDb25kaXRpb24gRXZhbCcsIGVycm9yLCB7IGZ1bmN0aW9uOiAnZXZhbHVhdGVDb25kaXRpb24nLCB0b29sdGlwSWQ6IHRvb2x0aXAuaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0b29sdGlwcyBzb3J0ZWQgYnkgcHJpb3JpdHlcbiAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2YgdG9vbHRpcHMgc29ydGVkIGJ5IHByaW9yaXR5IChhc2NlbmRpbmcpXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRlZFRvb2x0aXBzKCkge1xuICBjb25zdCB0b29sdGlwcyA9IGdldEFjdGl2ZVRvb2x0aXBzKCk7XG4gIHJldHVybiB0b29sdGlwcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgcHJpb3JpdHlBID0gYS5wcmlvcml0eSB8fCA5OTk7XG4gICAgY29uc3QgcHJpb3JpdHlCID0gYi5wcmlvcml0eSB8fCA5OTk7XG4gICAgcmV0dXJuIHByaW9yaXR5QSAtIHByaW9yaXR5QjtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRvb2x0aXBzIG1hcmtlZCBhcyBuZXcgZmVhdHVyZXNcbiAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2YgdG9vbHRpcHMgbWFya2VkIHdpdGggaXNOZXdGZWF0dXJlIGZsYWdcbiAqL1xuZnVuY3Rpb24gZ2V0TmV3RmVhdHVyZVRvb2x0aXBzKCkge1xuICBjb25zdCB0b29sdGlwcyA9IGdldEFjdGl2ZVRvb2x0aXBzKCk7XG4gIHJldHVybiB0b29sdGlwcy5maWx0ZXIodG9vbHRpcCA9PiB0b29sdGlwLmlzTmV3RmVhdHVyZSA9PT0gdHJ1ZSlcbiAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgcHJpb3JpdHlBID0gYS5wcmlvcml0eSB8fCA5OTk7XG4gICAgICBjb25zdCBwcmlvcml0eUIgPSBiLnByaW9yaXR5IHx8IDk5OTtcbiAgICAgIHJldHVybiBwcmlvcml0eUEgLSBwcmlvcml0eUI7XG4gICAgfSk7XG59XG5cbi8vIEV4cG9ydCB0byBnbG9iYWwgc2NvcGVcbndpbmRvdy5Ub29sdGlwRGVmaW5pdGlvbnMgPSB7XG4gIFRPT0xUSVBfREVGSU5JVElPTlMsXG4gIGdldFRvb2x0aXBEZWZpbml0aW9ucyxcbiAgZ2V0VG9vbHRpcEJ5SWQsXG4gIGdldEFjdGl2ZVRvb2x0aXBzLFxuICBnZXRTb3J0ZWRUb29sdGlwcyxcbiAgZ2V0TmV3RmVhdHVyZVRvb2x0aXBzXG59O1xuXG5kZWJ1ZygnW1Rvb2x0aXBEZWZpbml0aW9uc10gRGVmaW5pdGlvbnMgbG9hZGVkOicsIFRPT0xUSVBfREVGSU5JVElPTlMubGVuZ3RoLCAndG9vbHRpcHMnKTtcblxufSkod2luZG93KTtcblxuO1xuLyoqXG4gKiBETlMgVGVtcGxhdGUgU2VsZWN0b3JcbiAqIFByZXNlbnRzIEROUyBzZXJ2ZXIgdGVtcGxhdGUgb3B0aW9ucyB3aGVuIHVzZXIgY2hvb3NlcyB0byBzZXQgdXAgRE5TXG4gKi9cblxuKGZ1bmN0aW9uKHdpbmRvdykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgZGVidWcgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh3aW5kb3cuREFTSENBRERZX0RFQlVHKSBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgfTtcblxuICBjbGFzcyBEbnNUZW1wbGF0ZVNlbGVjdG9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9ncmVzc1RyYWNrZXIpIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3NUcmFja2VyID0gcHJvZ3Jlc3NUcmFja2VyO1xuICAgICAgdGhpcy5tb2RhbCA9IG51bGw7XG4gICAgICB0aGlzLm9uVGVtcGxhdGVTZWxlY3RlZCA9IG51bGw7XG4gICAgICBkZWJ1ZygnW0Ruc1RlbXBsYXRlU2VsZWN0b3JdIE1vZHVsZSBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXZhaWxhYmxlIEROUyBzZXJ2ZXIgdGVtcGxhdGVzIGZyb20gYXBwIHRlbXBsYXRlc1xuICAgICAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2YgRE5TIHRlbXBsYXRlIG9iamVjdHNcbiAgICAgKi9cbiAgICBnZXREbnNUZW1wbGF0ZXMoKSB7XG4gICAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgd291bGQgZmV0Y2ggZnJvbSBhcHAtdGVtcGxhdGVzLmpzXG4gICAgICAvLyBGb3Igbm93LCByZXR1cm4gaGFyZGNvZGVkIHRlbXBsYXRlcyBtYXRjaGluZyB3aGF0IHdlIGFkZGVkXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICd0ZWNobml0aXVtJyxcbiAgICAgICAgICBuYW1lOiAnVGVjaG5pdGl1bSBETlMgU2VydmVyJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ01vZGVybiBETlMgc2VydmVyIHdpdGggd2ViIFVJIGZvciBtYW5hZ2luZyBwcml2YXRlIHpvbmVzJyxcbiAgICAgICAgICBpY29uOiAnXHVEODNDXHVERjEwJyxcbiAgICAgICAgICBkaWZmaWN1bHR5OiAnRWFzeScsXG4gICAgICAgICAgZmVhdHVyZXM6IFtcbiAgICAgICAgICAgICdXZWItYmFzZWQgbWFuYWdlbWVudCBpbnRlcmZhY2UnLFxuICAgICAgICAgICAgJ1ByaXZhdGUgem9uZSBtYW5hZ2VtZW50IGZvciAuc2FtaSBkb21haW4nLFxuICAgICAgICAgICAgJ0RIQ1Agc2VydmVyIGludGVncmF0aW9uJyxcbiAgICAgICAgICAgICdETlMtb3Zlci1IVFRQUyBhbmQgRE5TLW92ZXItVExTIHN1cHBvcnQnXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZWNvbW1lbmRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdiaW5kOScsXG4gICAgICAgICAgbmFtZTogJ0JJTkQ5IEROUyBTZXJ2ZXInLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW5kdXN0cnktc3RhbmRhcmQgRE5TIHNlcnZlciAtIHBvd2VyZnVsIGFuZCBmbGV4aWJsZScsXG4gICAgICAgICAgaWNvbjogJ1x1RDgzRFx1REQyNycsXG4gICAgICAgICAgZGlmZmljdWx0eTogJ0FkdmFuY2VkJyxcbiAgICAgICAgICBmZWF0dXJlczogW1xuICAgICAgICAgICAgJ0luZHVzdHJ5IHN0YW5kYXJkIEROUyBzZXJ2ZXInLFxuICAgICAgICAgICAgJ0Z1bGwgUkZDIGNvbXBsaWFuY2UnLFxuICAgICAgICAgICAgJ0FkdmFuY2VkIHpvbmUgbWFuYWdlbWVudCcsXG4gICAgICAgICAgICAnRE5TU0VDIHN1cHBvcnQnXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZWNvbW1lbmRlZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAncGlob2xlJyxcbiAgICAgICAgICBuYW1lOiAnUGktaG9sZScsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdOZXR3b3JrLXdpZGUgYWQgYmxvY2tlciB3aXRoIEROUyBjYXBhYmlsaXRpZXMnLFxuICAgICAgICAgIGljb246ICdcdUQ4M0RcdURFRTFcdUZFMEYnLFxuICAgICAgICAgIGRpZmZpY3VsdHk6ICdJbnRlcm1lZGlhdGUnLFxuICAgICAgICAgIGZlYXR1cmVzOiBbXG4gICAgICAgICAgICAnQWQgYmxvY2tpbmcgYXQgRE5TIGxldmVsJyxcbiAgICAgICAgICAgICdXZWIgaW50ZXJmYWNlIGZvciBtYW5hZ2VtZW50JyxcbiAgICAgICAgICAgICdESENQIHNlcnZlciBpbmNsdWRlZCcsXG4gICAgICAgICAgICAnUXVlcnkgbG9nZ2luZyBhbmQgc3RhdGlzdGljcydcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlY29tbWVuZGVkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdwb3dlcmRucycsXG4gICAgICAgICAgbmFtZTogJ1Bvd2VyRE5TJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0hpZ2gtcGVyZm9ybWFuY2UgRE5TIHNlcnZlciB3aXRoIFNRTCBiYWNrZW5kJyxcbiAgICAgICAgICBpY29uOiAnXHUyNkExJyxcbiAgICAgICAgICBkaWZmaWN1bHR5OiAnSW50ZXJtZWRpYXRlJyxcbiAgICAgICAgICBmZWF0dXJlczogW1xuICAgICAgICAgICAgJ1NRTCBkYXRhYmFzZSBiYWNrZW5kJyxcbiAgICAgICAgICAgICdSRVNUZnVsIEFQSSBmb3IgYXV0b21hdGlvbicsXG4gICAgICAgICAgICAnR2VvZ3JhcGhpYyBsb2FkIGJhbGFuY2luZycsXG4gICAgICAgICAgICAnRE5TU0VDIHN1cHBvcnQnXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZWNvbW1lbmRlZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnY29yZWRucycsXG4gICAgICAgICAgbmFtZTogJ0NvcmVETlMnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvdWQtbmF0aXZlIEROUyBzZXJ2ZXIgLSBsaWdodHdlaWdodCBhbmQgZmxleGlibGUnLFxuICAgICAgICAgIGljb246ICdcdTI2MDFcdUZFMEYnLFxuICAgICAgICAgIGRpZmZpY3VsdHk6ICdJbnRlcm1lZGlhdGUnLFxuICAgICAgICAgIGZlYXR1cmVzOiBbXG4gICAgICAgICAgICAnUGx1Z2luLWJhc2VkIGFyY2hpdGVjdHVyZScsXG4gICAgICAgICAgICAnS3ViZXJuZXRlcy1uYXRpdmUnLFxuICAgICAgICAgICAgJ0xpZ2h0d2VpZ2h0IGFuZCBmYXN0JyxcbiAgICAgICAgICAgICdQcm9tZXRoZXVzIG1ldHJpY3MnXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZWNvbW1lbmRlZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnY2xvdWRmbGFyZScsXG4gICAgICAgICAgbmFtZTogJ0Nsb3VkZmxhcmUgRE5TJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ01hbmFnZWQgRE5TIHdpdGggQVBJIGFjY2VzcyBcdTIwMTQgbm8gc2VsZi1ob3N0aW5nIG5lZWRlZCcsXG4gICAgICAgICAgaWNvbjogJ1x1RDgzRFx1REQzNicsXG4gICAgICAgICAgZGlmZmljdWx0eTogJ0Vhc3knLFxuICAgICAgICAgIGZlYXR1cmVzOiBbXG4gICAgICAgICAgICAnRnVsbHkgbWFuYWdlZCwgbm8gc2VydmVyIG5lZWRlZCcsXG4gICAgICAgICAgICAnQVBJIGZvciBhdXRvbWF0ZWQgcmVjb3JkIG1hbmFnZW1lbnQnLFxuICAgICAgICAgICAgJ0dsb2JhbCBhbnljYXN0IG5ldHdvcmsnLFxuICAgICAgICAgICAgJ0ZyZWUgdGllciBhdmFpbGFibGUnXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZWNvbW1lbmRlZDogZmFsc2UsXG4gICAgICAgICAgcHJvdmlkZXJJZDogJ2Nsb3VkZmxhcmUnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ2V4dGVybmFsJyxcbiAgICAgICAgICBuYW1lOiAnRXh0ZXJuYWwgLyBNYW51YWwgRE5TJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZSB5b3VyIG93biBETlMgcHJvdmlkZXIgKGNQYW5lbCwgUm91dGU1MywgZXRjLiknLFxuICAgICAgICAgIGljb246ICdcdUQ4M0RcdUREMTcnLFxuICAgICAgICAgIGRpZmZpY3VsdHk6ICdFYXN5JyxcbiAgICAgICAgICBmZWF0dXJlczogW1xuICAgICAgICAgICAgJ1dvcmtzIHdpdGggYW55IEROUyBwcm92aWRlcicsXG4gICAgICAgICAgICAnRGFzaENhZGR5IHNob3dzIHlvdSB3aGF0IHJlY29yZHMgdG8gY3JlYXRlJyxcbiAgICAgICAgICAgICdQcm9wYWdhdGlvbiBjaGVja2luZyBzdGlsbCB3b3JrcycsXG4gICAgICAgICAgICAnTm8gQVBJIGNyZWRlbnRpYWxzIG5lZWRlZCdcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlY29tbWVuZGVkOiBmYWxzZSxcbiAgICAgICAgICBwcm92aWRlcklkOiAnbWFudWFsJ1xuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgRE5TIHRlbXBsYXRlIHNlbGVjdGlvbiBtb2RhbFxuICAgICAqL1xuICAgIHNob3dUZW1wbGF0ZVNlbGVjdG9yKCkge1xuICAgICAgLy8gQ3JlYXRlIG1vZGFsIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGlmICghdGhpcy5tb2RhbCkge1xuICAgICAgICB0aGlzLmNyZWF0ZU1vZGFsKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBvcHVsYXRlIHdpdGggdGVtcGxhdGVzXG4gICAgICB0aGlzLnBvcHVsYXRlVGVtcGxhdGVzKCk7XG5cbiAgICAgIC8vIFNob3cgbW9kYWxcbiAgICAgIHRoaXMubW9kYWwuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIG1vZGFsIEhUTUwgc3RydWN0dXJlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjcmVhdGVNb2RhbCgpIHtcbiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtb2RhbC5pZCA9ICdkbnMtdGVtcGxhdGUtbW9kYWwnO1xuICAgICAgbW9kYWwuY2xhc3NOYW1lID0gJ2Rucy10ZW1wbGF0ZS1tb2RhbCc7XG4gICAgICBtb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkbnMtdGVtcGxhdGUtbW9kYWwtY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkbnMtdGVtcGxhdGUtaGVhZGVyXCI+XG4gICAgICAgICAgICA8aDI+XHVEODNDXHVERjEwIENob29zZSBhIEROUyBTZXJ2ZXI8L2gyPlxuICAgICAgICAgICAgPHA+U2V0dGluZyB1cCBhIEROUyBzZXJ2ZXIgaXMgZXNzZW50aWFsIGZvciBtYW5hZ2luZyB5b3VyIHByaXZhdGUgLnNhbWkgZG9tYWluPC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRucy10ZW1wbGF0ZS1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG5zLXRlbXBsYXRlLWdyaWRcIiBpZD1cImRucy10ZW1wbGF0ZS1ncmlkXCI+XG4gICAgICAgICAgICA8IS0tIFRlbXBsYXRlcyB3aWxsIGJlIGluc2VydGVkIGhlcmUgLS0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRucy10ZW1wbGF0ZS1mb290ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkbnMtdGVtcGxhdGUtbGF0ZXItYnRuXCIgaWQ9XCJkbnMtc2V0dXAtbGF0ZXJcIj5TZXQgdXAgbGF0ZXI8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1vZGFsKTtcbiAgICAgIHRoaXMubW9kYWwgPSBtb2RhbDtcblxuICAgICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcignLmRucy10ZW1wbGF0ZS1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJyNkbnMtc2V0dXAtbGF0ZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlU2V0dXBMYXRlcigpKTtcbiAgICAgIFxuICAgICAgLy8gQ2xvc2Ugb24gb3ZlcmxheSBjbGlja1xuICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQ2xvc2Ugb24gRXNjYXBlIGtleVxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuc3R5bGUuZGlzcGxheSA9PT0gJ2ZsZXgnKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSBtb2RhbCB3aXRoIEROUyB0ZW1wbGF0ZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBvcHVsYXRlVGVtcGxhdGVzKCkge1xuICAgICAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtdGVtcGxhdGUtZ3JpZCcpO1xuICAgICAgaWYgKCFncmlkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IHRoaXMuZ2V0RG5zVGVtcGxhdGVzKCk7XG4gICAgICBncmlkLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IGNhcmQgPSB0aGlzLmNyZWF0ZVRlbXBsYXRlQ2FyZCh0ZW1wbGF0ZSk7XG4gICAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoY2FyZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB0ZW1wbGF0ZSBjYXJkIGVsZW1lbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNyZWF0ZVRlbXBsYXRlQ2FyZCh0ZW1wbGF0ZSkge1xuICAgICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY2FyZC5jbGFzc05hbWUgPSAnZG5zLXRlbXBsYXRlLWNhcmQnO1xuICAgICAgaWYgKHRlbXBsYXRlLnJlY29tbWVuZGVkKSB7XG4gICAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgncmVjb21tZW5kZWQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlmZmljdWx0eUNsYXNzID0gdGVtcGxhdGUuZGlmZmljdWx0eS50b0xvd2VyQ2FzZSgpO1xuICAgICAgXG4gICAgICBjYXJkLmlubmVySFRNTCA9IGBcbiAgICAgICAgJHt0ZW1wbGF0ZS5yZWNvbW1lbmRlZCA/ICc8ZGl2IGNsYXNzPVwicmVjb21tZW5kZWQtYmFkZ2VcIj5SZWNvbW1lbmRlZDwvZGl2PicgOiAnJ31cbiAgICAgICAgPGRpdiBjbGFzcz1cImRucy10ZW1wbGF0ZS1pY29uXCI+JHt0ZW1wbGF0ZS5pY29ufTwvZGl2PlxuICAgICAgICA8aDM+JHt0ZW1wbGF0ZS5uYW1lfTwvaDM+XG4gICAgICAgIDxwIGNsYXNzPVwiZG5zLXRlbXBsYXRlLWRlc2NyaXB0aW9uXCI+JHt0ZW1wbGF0ZS5kZXNjcmlwdGlvbn08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkbnMtdGVtcGxhdGUtZGlmZmljdWx0eSBkaWZmaWN1bHR5LSR7ZGlmZmljdWx0eUNsYXNzfVwiPlxuICAgICAgICAgICR7dGVtcGxhdGUuZGlmZmljdWx0eX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx1bCBjbGFzcz1cImRucy10ZW1wbGF0ZS1mZWF0dXJlc1wiPlxuICAgICAgICAgICR7dGVtcGxhdGUuZmVhdHVyZXMuc2xpY2UoMCwgMykubWFwKGYgPT4gYDxsaT4ke2Z9PC9saT5gKS5qb2luKCcnKX1cbiAgICAgICAgPC91bD5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRucy10ZW1wbGF0ZS1zZWxlY3QtYnRuXCIgZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGUuaWR9XCI+XG4gICAgICAgICAgU2VsZWN0ICR7dGVtcGxhdGUubmFtZX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICBgO1xuXG4gICAgICAvLyBBZGQgY2xpY2sgaGFuZGxlciB0byBzZWxlY3QgYnV0dG9uXG4gICAgICBjb25zdCBzZWxlY3RCdG4gPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5kbnMtdGVtcGxhdGUtc2VsZWN0LWJ0bicpO1xuICAgICAgc2VsZWN0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5oYW5kbGVUZW1wbGF0ZVNlbGVjdGlvbih0ZW1wbGF0ZSkpO1xuXG4gICAgICByZXR1cm4gY2FyZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGVtcGxhdGUgc2VsZWN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBoYW5kbGVUZW1wbGF0ZVNlbGVjdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgZGVidWcoYFtEbnNUZW1wbGF0ZVNlbGVjdG9yXSBUZW1wbGF0ZSBzZWxlY3RlZDogJHt0ZW1wbGF0ZS5pZH1gKTtcbiAgICAgIFxuICAgICAgLy8gQ2xvc2UgbW9kYWxcbiAgICAgIHRoaXMuY2xvc2UoKTtcblxuICAgICAgLy8gVHJpZ2dlciBjYWxsYmFjayBpZiBzZXRcbiAgICAgIGlmICh0aGlzLm9uVGVtcGxhdGVTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLm9uVGVtcGxhdGVTZWxlY3RlZCh0ZW1wbGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBvcGVuIGFwcCBzZWxlY3RvciB3aXRoIEROUyBmaWx0ZXJcbiAgICAgICAgdGhpcy5vcGVuQXBwU2VsZWN0b3IodGVtcGxhdGUuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBcIlNldCB1cCBsYXRlclwiIGJ1dHRvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaGFuZGxlU2V0dXBMYXRlcigpIHtcbiAgICAgIGRlYnVnKCdbRG5zVGVtcGxhdGVTZWxlY3Rvcl0gRE5TIHNldHVwIGRlZmVycmVkJyk7XG4gICAgICBcbiAgICAgIC8vIE1hcmsgYXMgZGVmZXJyZWQgaW4gcHJvZ3Jlc3MgdHJhY2tlclxuICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NUcmFja2VyKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NUcmFja2VyLm1hcmtEbnNTZXR1cERlZmVycmVkKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsb3NlIG1vZGFsXG4gICAgICB0aGlzLmNsb3NlKCk7XG5cbiAgICAgIC8vIFNob3cgbm90aWZpY2F0aW9uXG4gICAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oJ0ROUyBzZXR1cCBkZWZlcnJlZC4gWW91IGNhbiBzZXQgaXQgdXAgbGF0ZXIgZnJvbSB0aGUgQXBwIFNlbGVjdG9yLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYXBwIHNlbGVjdG9yIHdpdGggc3BlY2lmaWMgdGVtcGxhdGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9wZW5BcHBTZWxlY3Rvcih0ZW1wbGF0ZUlkKSB7XG4gICAgICAvLyBUcnkgdG8gb3BlbiB0aGUgYXBwIHNlbGVjdG9yIG1vZGFsIGlmIGl0IGV4aXN0c1xuICAgICAgY29uc3QgYXBwU2VsZWN0b3JCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbb25jbGljayo9XCJzaG93QXBwU2VsZWN0b3JcIl0nKTtcbiAgICAgIGlmIChhcHBTZWxlY3RvckJ0bikge1xuICAgICAgICBhcHBTZWxlY3RvckJ0bi5jbGljaygpO1xuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBhIGJpdCB0aGVuIGZpbHRlciB0byB0aGUgc2VsZWN0ZWQgdGVtcGxhdGVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VhcmNoSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXBwLXNlYXJjaCcpO1xuICAgICAgICAgIGlmIChzZWFyY2hJbnB1dCkge1xuICAgICAgICAgICAgc2VhcmNoSW5wdXQudmFsdWUgPSB0ZW1wbGF0ZUlkO1xuICAgICAgICAgICAgc2VhcmNoSW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGYWxsYmFjazogc2hvdyBpbnN0cnVjdGlvbnNcbiAgICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKGBUbyBkZXBsb3kgJHt0ZW1wbGF0ZUlkfSwgdXNlIHRoZSBBcHAgU2VsZWN0b3IgYW5kIHNlYXJjaCBmb3IgXCIke3RlbXBsYXRlSWR9XCJgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IG5vdGlmaWNhdGlvbiBtZXNzYWdlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzaG93Tm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgIC8vIFNpbXBsZSBub3RpZmljYXRpb24gLSBjb3VsZCBiZSBlbmhhbmNlZFxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBub3RpZmljYXRpb24uY2xhc3NOYW1lID0gJ2Rucy10ZW1wbGF0ZS1ub3RpZmljYXRpb24nO1xuICAgICAgbm90aWZpY2F0aW9uLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICAgIG5vdGlmaWNhdGlvbi5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMjBweDtcbiAgICAgICAgcmlnaHQ6IDIwcHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1mZyk7XG4gICAgICAgIHBhZGRpbmc6IDE1cHggMjBweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsMC4zKTtcbiAgICAgICAgei1pbmRleDogMTAwMDE7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICBgO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vdGlmaWNhdGlvbik7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBub3RpZmljYXRpb24uc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgbm90aWZpY2F0aW9uLnN0eWxlLnRyYW5zaXRpb24gPSAnb3BhY2l0eSAwLjNzJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBub3RpZmljYXRpb24ucmVtb3ZlKCksIDMwMCk7XG4gICAgICB9LCAzMDAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgbW9kYWxcbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgIGlmICh0aGlzLm1vZGFsKSB7XG4gICAgICAgIHRoaXMubW9kYWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5EbnNUZW1wbGF0ZVNlbGVjdG9yID0gRG5zVGVtcGxhdGVTZWxlY3RvcjtcbiAgZGVidWcoJ1tEbnNUZW1wbGF0ZVNlbGVjdG9yXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vKipcbiAqIFRvdXIgTWFuYWdlclxuICogT3JjaGVzdHJhdGVzIHRoZSBvbmJvYXJkaW5nIHRvdXIgdXNpbmcgRHJpdmVyLmpzXG4gKi9cblxuKGZ1bmN0aW9uKHdpbmRvdykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4gIGNvbnN0IGRlYnVnID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAod2luZG93LkRBU0hDQUREWV9ERUJVRykgeyBjb25zb2xlLmxvZyguLi5hcmdzKTsgfVxuICB9O1xuXG4gIGNsYXNzIFRvdXJNYW5hZ2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9ncmVzc1RyYWNrZXIsIHRoZW1lQWRhcHRlciwgZG5zVGVtcGxhdGVTZWxlY3Rvcikge1xuICAgICAgdGhpcy5wcm9ncmVzc1RyYWNrZXIgPSBwcm9ncmVzc1RyYWNrZXI7XG4gICAgICB0aGlzLnRoZW1lQWRhcHRlciA9IHRoZW1lQWRhcHRlcjtcbiAgICAgIHRoaXMuZG5zVGVtcGxhdGVTZWxlY3RvciA9IGRuc1RlbXBsYXRlU2VsZWN0b3I7XG4gICAgICB0aGlzLmRyaXZlciA9IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSAwO1xuICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNpemVIYW5kbGVyID0gbnVsbDtcbiAgICAgIHRoaXMubGF5b3V0Q2hhbmdlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBEcml2ZXIuanMgd2l0aCB0aGVtZS1hd2FyZSBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYXN5bmMgaW5pdGlhbGl6ZURyaXZlcigpIHtcbiAgICAgIC8vIERyaXZlci5qcyB2MS54IElJRkU6IHdpbmRvdy5kcml2ZXIuanMuZHJpdmVyIGlzIHRoZSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgICBjb25zdCBkcml2ZXJGYWN0b3J5ID0gd2luZG93LmRyaXZlcj8uanM/LmRyaXZlciB8fCB3aW5kb3cuZHJpdmVyPy5kcml2ZXIgfHwgd2luZG93LmRyaXZlcjtcblxuICAgICAgaWYgKHR5cGVvZiBkcml2ZXJGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RvdXJNYW5hZ2VyXSBEcml2ZXIuanMgTm90IExvYWRlZCcsIG5ldyBFcnJvcignRHJpdmVyLmpzIG5vdCBsb2FkZWQgb3IgaW52YWxpZCcpLCB7IHdpbmRvd0RyaXZlcjogdHlwZW9mIHdpbmRvdy5kcml2ZXIgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGhlbWVDb25maWcgPSB0aGlzLnRoZW1lQWRhcHRlci5nZXREcml2ZXJUaGVtZSgpO1xuXG4gICAgICB0aGlzLmRyaXZlciA9IGRyaXZlckZhY3Rvcnkoe1xuICAgICAgICBzaG93UHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgIHNob3dCdXR0b25zOiBbJ25leHQnLCAncHJldmlvdXMnLCAnY2xvc2UnXSxcbiAgICAgICAgYWxsb3dDbG9zZTogdHJ1ZSxcbiAgICAgICAgb3ZlcmxheUNsaWNrTmV4dDogZmFsc2UsXG4gICAgICAgIG92ZXJsYXlPcGFjaXR5OiAwLjYsXG4gICAgICAgIHN0YWdlUGFkZGluZzogMTIsXG4gICAgICAgIHN0YWdlUmFkaXVzOiAxMixcbiAgICAgICAgYWxsb3dLZXlib2FyZENvbnRyb2w6IHRydWUsXG4gICAgICAgIHBvcG92ZXJDbGFzczogJ2Rhc2hjYWRkeS1wb3BvdmVyJyxcbiAgICAgICAgYW5pbWF0ZTogdHJ1ZSxcbiAgICAgICAgc21vb3RoU2Nyb2xsOiB0cnVlLFxuICAgICAgICBvbkRlc3Ryb3llZDogKCkgPT4gdGhpcy5vblRvdXJDb21wbGV0ZSgpLFxuICAgICAgICBvbkRlc3Ryb3lTdGFydGVkOiAoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnByb2dyZXNzVHJhY2tlci5pc1RvdXJDb21wbGV0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5vblRvdXJTa2lwKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQXBwbHkgdGhlbWVcbiAgICAgIHRoaXMudGhlbWVBZGFwdGVyLmFwcGx5VGhlbWUodGhpcy5kcml2ZXIpO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHRoZW1lIGNoYW5nZXNcbiAgICAgIHRoaXMudGhlbWVBZGFwdGVyLm9uVGhlbWVDaGFuZ2UoKCkgPT4ge1xuICAgICAgICB0aGlzLnRoZW1lQWRhcHRlci5hcHBseVRoZW1lKHRoaXMuZHJpdmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgZHluYW1pYyByZXBvc2l0aW9uaW5nXG4gICAgICB0aGlzLnNldHVwRHluYW1pY1JlcG9zaXRpb25pbmcoKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdG91ciBzaG91bGQgYXV0by1zdGFydFxuICAgICAqL1xuICAgIHNob3VsZEF1dG9TdGFydCgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5wcm9ncmVzc1RyYWNrZXIuaXNJbnN0YWxsT25ib2FyZGluZ0NvbXBsZXRlZCgpICYmXG4gICAgICAgICAgICAgIXRoaXMucHJvZ3Jlc3NUcmFja2VyLmlzVG91ckNvbXBsZXRlZCgpICYmIFxuICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NUcmFja2VyLmdldEN1cnJlbnRTdGVwKCkgPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIG9uYm9hcmRpbmcgdG91clxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0VG91cigpIHtcbiAgICAgIGlmICghdGhpcy5kcml2ZXIpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbGl6ZWQgPSBhd2FpdCB0aGlzLmluaXRpYWxpemVEcml2ZXIoKTtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgYWN0aXZlIHRvb2x0aXBzIChmaWx0ZXJlZCBieSBjb25kaXRpb25zKVxuICAgICAgY29uc3QgYWxsVG9vbHRpcHMgPSB3aW5kb3cuVG9vbHRpcERlZmluaXRpb25zLmdldFNvcnRlZFRvb2x0aXBzKCk7XG4gICAgICBcbiAgICAgIC8vIEZpbHRlciBvdXQgY29tcGxldGVkIHRvb2x0aXBzXG4gICAgICBjb25zdCBjb21wbGV0ZWRJZHMgPSB0aGlzLnByb2dyZXNzVHJhY2tlci5nZXRDb21wbGV0ZWRUb29sdGlwcygpO1xuICAgICAgY29uc3QgYWN0aXZlVG9vbHRpcHMgPSBhbGxUb29sdGlwcy5maWx0ZXIodCA9PiAhY29tcGxldGVkSWRzLmluY2x1ZGVzKHQuaWQpKTtcblxuICAgICAgaWYgKGFjdGl2ZVRvb2x0aXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWJ1ZygnW1RvdXJNYW5hZ2VyXSBObyB0b29sdGlwcyB0byBzaG93Jyk7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NUcmFja2VyLm1hcmtUb3VyQ29tcGxldGVkKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCB0byBEcml2ZXIuanMgc3RlcHMgd2l0aCBuYXZpZ2F0aW9uIGxvZ2ljXG4gICAgICBjb25zdCBzdGVwcyA9IGFjdGl2ZVRvb2x0aXBzLm1hcCgodG9vbHRpcCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgaXNGaXJzdCA9IGluZGV4ID09PSAwO1xuICAgICAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gYWN0aXZlVG9vbHRpcHMubGVuZ3RoIC0gMTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0ZXAgPSB7XG4gICAgICAgICAgZWxlbWVudDogdG9vbHRpcC5lbGVtZW50LFxuICAgICAgICAgIHBvcG92ZXI6IHtcbiAgICAgICAgICAgIHRpdGxlOiB0b29sdGlwLnBvcG92ZXIudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdG9vbHRpcC5wb3BvdmVyLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc2lkZTogdG9vbHRpcC5wb3BvdmVyLnBvc2l0aW9uIHx8ICdib3R0b20nLFxuICAgICAgICAgICAgYWxpZ246IHRvb2x0aXAucG9wb3Zlci5hbGlnbiB8fCAnc3RhcnQnLFxuICAgICAgICAgICAgc2hvd0J1dHRvbnM6IHRoaXMuX2dldEJ1dHRvbnNGb3JTdGVwKHRvb2x0aXAsIGlzRmlyc3QsIGlzTGFzdCksXG4gICAgICAgICAgICBzaG93UHJvZ3Jlc3M6IHRvb2x0aXAucG9wb3Zlci5zaG93UHJvZ3Jlc3MgIT09IGZhbHNlLFxuICAgICAgICAgICAgb25OZXh0Q2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1RyYWNrZXIubWFya1Rvb2x0aXBDb21wbGV0ZWQodG9vbHRpcC5pZCk7XG4gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NUcmFja2VyLnNldEN1cnJlbnRTdGVwKGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgICAgdGhpcy5kcml2ZXIubW92ZU5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblByZXZDbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzVHJhY2tlci5zZXRDdXJyZW50U3RlcChNYXRoLm1heCgwLCBpbmRleCAtIDEpKTtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gTWF0aC5tYXgoMCwgaW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgdGhpcy5kcml2ZXIubW92ZVByZXZpb3VzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbG9zZUNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2tpcFRvdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQWRkIGN1c3RvbSBoYW5kbGVycyBmb3IgRE5TIHRvb2x0aXBcbiAgICAgICAgaWYgKHRvb2x0aXAuaWQgPT09ICdkbnMtcHJpb3JpdHknICYmIHRoaXMuZG5zVGVtcGxhdGVTZWxlY3Rvcikge1xuICAgICAgICAgIHN0ZXAucG9wb3Zlci5vblNldHVwTm93Q2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZygnW1RvdXJNYW5hZ2VyXSBPcGVuaW5nIEROUyB0ZW1wbGF0ZSBzZWxlY3RvcicpO1xuICAgICAgICAgICAgdGhpcy5kbnNUZW1wbGF0ZVNlbGVjdG9yLnNob3dUZW1wbGF0ZVNlbGVjdG9yKCk7XG4gICAgICAgICAgICAvLyBNYXJrIHRvb2x0aXAgYXMgY29tcGxldGVkIGFuZCBtb3ZlIHRvIG5leHRcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NUcmFja2VyLm1hcmtUb29sdGlwQ29tcGxldGVkKHRvb2x0aXAuaWQpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1RyYWNrZXIuc2V0Q3VycmVudFN0ZXAoaW5kZXggKyAxKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLm1vdmVOZXh0KCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBcbiAgICAgICAgICBzdGVwLnBvcG92ZXIub25MYXRlckNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgZGVidWcoJ1tUb3VyTWFuYWdlcl0gRE5TIHNldHVwIGRlZmVycmVkJyk7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzVHJhY2tlci5tYXJrRG5zU2V0dXBEZWZlcnJlZCgpO1xuICAgICAgICAgICAgLy8gTWFyayB0b29sdGlwIGFzIGNvbXBsZXRlZCBhbmQgbW92ZSB0byBuZXh0XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzVHJhY2tlci5tYXJrVG9vbHRpcENvbXBsZXRlZCh0b29sdGlwLmlkKTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NUcmFja2VyLnNldEN1cnJlbnRTdGVwKGluZGV4ICsgMSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgICAgICB0aGlzLmRyaXZlci5tb3ZlTmV4dCgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgdGhpcy5kcml2ZXIuc2V0U3RlcHMoc3RlcHMpO1xuICAgICAgdGhpcy5kcml2ZXIuZHJpdmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdG91ciBmcm9tIGxhc3Qgc3RlcFxuICAgICAqL1xuICAgIGFzeW5jIHJlc3VtZVRvdXIoKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RlcCA9IHRoaXMucHJvZ3Jlc3NUcmFja2VyLmdldEN1cnJlbnRTdGVwKCk7XG4gICAgICBpZiAoY3VycmVudFN0ZXAgPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhcnRUb3VyKCk7XG4gICAgICAgIC8vIERyaXZlci5qcyB3aWxsIHN0YXJ0IGZyb20gYmVnaW5uaW5nLCB3ZSdkIG5lZWQgdG8gc2tpcCB0byBjdXJyZW50IHN0ZXBcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhcnRUb3VyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCB0aGUgZW50aXJlIHRvdXJcbiAgICAgKi9cbiAgICBza2lwVG91cigpIHtcbiAgICAgIGlmICh0aGlzLmRyaXZlcikge1xuICAgICAgICB0aGlzLmRyaXZlci5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNsZWFudXBEeW5hbWljUmVwb3NpdGlvbmluZygpO1xuICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RhcnQgdG91ciBmcm9tIGJlZ2lubmluZ1xuICAgICAqL1xuICAgIGFzeW5jIHJlc3RhcnRUb3VyKCkge1xuICAgICAgdGhpcy5wcm9ncmVzc1RyYWNrZXIucmVzZXRQcm9ncmVzcygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFRvdXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IGEgc3BlY2lmaWMgdG9vbHRpcCBieSBJRFxuICAgICAqL1xuICAgIGFzeW5jIHNob3dUb29sdGlwKHRvb2x0aXBJZCkge1xuICAgICAgY29uc3QgdG9vbHRpcCA9IHdpbmRvdy5Ub29sdGlwRGVmaW5pdGlvbnMuZ2V0VG9vbHRpcEJ5SWQodG9vbHRpcElkKTtcbiAgICAgIGlmICghdG9vbHRpcCkge1xuICAgICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUb3VyTWFuYWdlcl0gVG9vbHRpcCBOb3QgRm91bmQnLCBuZXcgRXJyb3IoYFRvb2x0aXAgbm90IGZvdW5kOiAke3Rvb2x0aXBJZH1gKSwgeyB0b29sdGlwSWQgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmRyaXZlcikge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVEcml2ZXIoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RlcCA9IHtcbiAgICAgICAgZWxlbWVudDogdG9vbHRpcC5lbGVtZW50LFxuICAgICAgICBwb3BvdmVyOiB7XG4gICAgICAgICAgdGl0bGU6IHRvb2x0aXAucG9wb3Zlci50aXRsZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdG9vbHRpcC5wb3BvdmVyLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNpZGU6IHRvb2x0aXAucG9wb3Zlci5wb3NpdGlvbiB8fCAnYm90dG9tJyxcbiAgICAgICAgICBhbGlnbjogdG9vbHRpcC5wb3BvdmVyLmFsaWduIHx8ICdzdGFydCdcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5kcml2ZXIuaGlnaGxpZ2h0KHN0ZXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgXCJXaGF0J3MgTmV3XCIgdG91ciAtIG9ubHkgdG9vbHRpcHMgbWFya2VkIGFzIG5ldyBmZWF0dXJlc1xuICAgICAqL1xuICAgIGFzeW5jIHNob3dXaGF0c05ldygpIHtcbiAgICAgIGlmICghdGhpcy5kcml2ZXIpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbGl6ZWQgPSBhd2FpdCB0aGlzLmluaXRpYWxpemVEcml2ZXIoKTtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgb25seSBuZXcgZmVhdHVyZSB0b29sdGlwc1xuICAgICAgY29uc3QgbmV3RmVhdHVyZVRvb2x0aXBzID0gd2luZG93LlRvb2x0aXBEZWZpbml0aW9ucy5nZXROZXdGZWF0dXJlVG9vbHRpcHMoKTtcblxuICAgICAgaWYgKG5ld0ZlYXR1cmVUb29sdGlwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVidWcoJ1tUb3VyTWFuYWdlcl0gTm8gbmV3IGZlYXR1cmVzIHRvIHNob3cnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWJ1ZyhgW1RvdXJNYW5hZ2VyXSBTaG93aW5nICR7bmV3RmVhdHVyZVRvb2x0aXBzLmxlbmd0aH0gbmV3IGZlYXR1cmVzYCk7XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gRHJpdmVyLmpzIHN0ZXBzXG4gICAgICBjb25zdCBzdGVwcyA9IG5ld0ZlYXR1cmVUb29sdGlwcy5tYXAoKHRvb2x0aXAsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzRmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IG5ld0ZlYXR1cmVUb29sdGlwcy5sZW5ndGggLSAxO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbGVtZW50OiB0b29sdGlwLmVsZW1lbnQsXG4gICAgICAgICAgcG9wb3Zlcjoge1xuICAgICAgICAgICAgdGl0bGU6IGBcdTI3MjggTkVXOiAke3Rvb2x0aXAucG9wb3Zlci50aXRsZX1gLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRvb2x0aXAucG9wb3Zlci5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHNpZGU6IHRvb2x0aXAucG9wb3Zlci5wb3NpdGlvbiB8fCAnYm90dG9tJyxcbiAgICAgICAgICAgIGFsaWduOiB0b29sdGlwLnBvcG92ZXIuYWxpZ24gfHwgJ3N0YXJ0JyxcbiAgICAgICAgICAgIHNob3dCdXR0b25zOiB0aGlzLl9nZXRCdXR0b25zRm9yU3RlcCh0b29sdGlwLCBpc0ZpcnN0LCBpc0xhc3QpLFxuICAgICAgICAgICAgc2hvd1Byb2dyZXNzOiB0cnVlLFxuICAgICAgICAgICAgb25OZXh0Q2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5kcml2ZXIubW92ZU5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblByZXZDbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmRyaXZlci5tb3ZlUHJldmlvdXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNsb3NlQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5za2lwVG91cigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZHJpdmVyLnNldFN0ZXBzKHN0ZXBzKTtcbiAgICAgIHRoaXMuZHJpdmVyLmRyaXZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHVwIGR5bmFtaWMgcmVwb3NpdGlvbmluZyBmb3Igd2luZG93IHJlc2l6ZSBhbmQgbGF5b3V0IGNoYW5nZXNcbiAgICAgKi9cbiAgICBzZXR1cER5bmFtaWNSZXBvc2l0aW9uaW5nKCkge1xuICAgICAgLy8gV2luZG93IHJlc2l6ZSBoYW5kbGVyIHdpdGggZGVib3VuY2luZ1xuICAgICAgbGV0IHJlc2l6ZVRpbWVvdXQ7XG4gICAgICB0aGlzLnJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dChyZXNpemVUaW1lb3V0KTtcbiAgICAgICAgcmVzaXplVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzQWN0aXZlICYmIHRoaXMuZHJpdmVyKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW1RvdXJNYW5hZ2VyXSBXaW5kb3cgcmVzaXplZCwgcmVwb3NpdGlvbmluZyB0b29sdGlwJyk7XG4gICAgICAgICAgICB0aGlzLmRyaXZlci5yZWZyZXNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxNTApOyAvLyBEZWJvdW5jZSBmb3IgMTUwbXNcbiAgICAgIH07XG5cbiAgICAgIC8vIExheW91dCBjaGFuZ2UgaGFuZGxlciAoZm9yIHRoZW1lIGNoYW5nZXMsIERPTSBtdXRhdGlvbnMpXG4gICAgICB0aGlzLmxheW91dENoYW5nZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlICYmIHRoaXMuZHJpdmVyKSB7XG4gICAgICAgICAgZGVidWcoJ1tUb3VyTWFuYWdlcl0gTGF5b3V0IGNoYW5nZWQsIHJlcG9zaXRpb25pbmcgdG9vbHRpcCcpO1xuICAgICAgICAgIC8vIFNtYWxsIGRlbGF5IHRvIGFsbG93IGxheW91dCB0byBzZXR0bGVcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlcikge1xuICAgICAgICAgICAgICB0aGlzLmRyaXZlci5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVzaXplSGFuZGxlcik7XG4gICAgICBcbiAgICAgIC8vIExpc3RlbiBmb3IgdGhlbWUgY2hhbmdlcyAoYWxyZWFkeSBoYW5kbGVkIGJ5IFRoZW1lQWRhcHRlciwgYnV0IGFsc28gdHJpZ2dlciByZXBvc2l0aW9uKVxuICAgICAgdGhpcy50aGVtZUFkYXB0ZXIub25UaGVtZUNoYW5nZSh0aGlzLmxheW91dENoYW5nZUhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFuIHVwIGR5bmFtaWMgcmVwb3NpdGlvbmluZyBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBjbGVhbnVwRHluYW1pY1JlcG9zaXRpb25pbmcoKSB7XG4gICAgICBpZiAodGhpcy5yZXNpemVIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlc2l6ZUhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBidXR0b25zIHRvIHNob3cgZm9yIGEgc3BlY2lmaWMgc3RlcFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldEJ1dHRvbnNGb3JTdGVwKHRvb2x0aXAsIGlzRmlyc3QsIGlzTGFzdCkge1xuICAgICAgLy8gQ2hlY2sgaWYgdG9vbHRpcCBoYXMgY3VzdG9tIGJ1dHRvbnMgZGVmaW5lZFxuICAgICAgaWYgKHRvb2x0aXAucG9wb3Zlci5zaG93QnV0dG9ucykge1xuICAgICAgICByZXR1cm4gdG9vbHRpcC5wb3BvdmVyLnNob3dCdXR0b25zO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEZWZhdWx0IGJ1dHRvbiBjb25maWd1cmF0aW9uXG4gICAgICBjb25zdCBidXR0b25zID0gW107XG4gICAgICBcbiAgICAgIGlmICghaXNGaXJzdCkge1xuICAgICAgICBidXR0b25zLnB1c2goJ3ByZXZpb3VzJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICghaXNMYXN0KSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCgnbmV4dCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKCdjbG9zZScpO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gYnV0dG9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91ciBjb21wbGV0aW9uXG4gICAgICovXG4gICAgb25Ub3VyQ29tcGxldGUoKSB7XG4gICAgICB0aGlzLnByb2dyZXNzVHJhY2tlci5tYXJrVG91ckNvbXBsZXRlZCgpO1xuICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgZGVidWcoJ1tUb3VyTWFuYWdlcl0gVG91ciBjb21wbGV0ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91ciBza2lwXG4gICAgICovXG4gICAgb25Ub3VyU2tpcCgpIHtcbiAgICAgIC8vIFNhdmUgY3VycmVudCBwcm9ncmVzcyBidXQgZG9uJ3QgbWFyayBhcyBjb21wbGV0ZWRcbiAgICAgIGRlYnVnKCdbVG91ck1hbmFnZXJdIFRvdXIgc2tpcHBlZCcpO1xuICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5Ub3VyTWFuYWdlciA9IFRvdXJNYW5hZ2VyO1xuICBkZWJ1ZygnW1RvdXJNYW5hZ2VyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vKipcbiAqIERhc2hDYWRkeSBVc2VyIE9uYm9hcmRpbmcgU3lzdGVtXG4gKiBNYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdG9vbHRpcC1iYXNlZCBvbmJvYXJkaW5nIGV4cGVyaWVuY2VcbiAqIFxuICogVGhpcyBmaWxlIGluaXRpYWxpemVzIHRoZSBvbmJvYXJkaW5nIHN5c3RlbSBhbmQgY29vcmRpbmF0ZXMgYmV0d2VlblxuICogdGhlIHZhcmlvdXMgY29tcG9uZW50cyAoVG91ck1hbmFnZXIsIFByb2dyZXNzVHJhY2tlciwgVGhlbWVBZGFwdGVyLCBldGMuKVxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IGRlYnVnID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAod2luZG93LkRBU0hDQUREWV9ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coLi4uYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIGxldCBwcm9ncmVzc1RyYWNrZXI7XG4gIGxldCB0aGVtZUFkYXB0ZXI7XG4gIGxldCB0b3VyTWFuYWdlcjtcbiAgbGV0IGRuc1RlbXBsYXRlU2VsZWN0b3I7XG4gIGxldCBlcnJvckhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIG9uYm9hcmRpbmcgc3lzdGVtXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplT25ib2FyZGluZygpIHtcbiAgICB0cnkge1xuICAgICAgZGVidWcoJ1tPbmJvYXJkaW5nXSBJbml0aWFsaXppbmcgc3lzdGVtLi4uJyk7XG5cbiAgICAgIGlmICh3aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZDtcbiAgICAgICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIEVycm9yIEhhbmRsZXIgZmlyc3RcbiAgICAgIGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgICAgIGRlYnVnKCdbT25ib2FyZGluZ10gRXJyb3IgSGFuZGxlciBpbml0aWFsaXplZCcpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIFByb2dyZXNzIFRyYWNrZXJcbiAgICAgIHByb2dyZXNzVHJhY2tlciA9IG5ldyBQcm9ncmVzc1RyYWNrZXIoJ2Rhc2hjYWRkeV9vbmJvYXJkaW5nJyk7XG4gICAgICBkZWJ1ZygnW09uYm9hcmRpbmddIFByb2dyZXNzIFRyYWNrZXIgaW5pdGlhbGl6ZWQnKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBUaGVtZSBBZGFwdGVyXG4gICAgICB0aGVtZUFkYXB0ZXIgPSBuZXcgVGhlbWVBZGFwdGVyKCk7XG4gICAgICBkZWJ1ZygnW09uYm9hcmRpbmddIFRoZW1lIEFkYXB0ZXIgaW5pdGlhbGl6ZWQnKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBETlMgVGVtcGxhdGUgU2VsZWN0b3JcbiAgICAgIGRuc1RlbXBsYXRlU2VsZWN0b3IgPSBuZXcgRG5zVGVtcGxhdGVTZWxlY3Rvcihwcm9ncmVzc1RyYWNrZXIpO1xuICAgICAgZGVidWcoJ1tPbmJvYXJkaW5nXSBETlMgVGVtcGxhdGUgU2VsZWN0b3IgaW5pdGlhbGl6ZWQnKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBUb3VyIE1hbmFnZXJcbiAgICAgIHRvdXJNYW5hZ2VyID0gbmV3IFRvdXJNYW5hZ2VyKHByb2dyZXNzVHJhY2tlciwgdGhlbWVBZGFwdGVyLCBkbnNUZW1wbGF0ZVNlbGVjdG9yKTtcbiAgICAgIGRlYnVnKCdbT25ib2FyZGluZ10gVG91ciBNYW5hZ2VyIGluaXRpYWxpemVkJyk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRvdXIgc2hvdWxkIGF1dG8tc3RhcnRcbiAgICAgIGlmICh0b3VyTWFuYWdlci5zaG91bGRBdXRvU3RhcnQoKSkge1xuICAgICAgICBkZWJ1ZygnW09uYm9hcmRpbmddIEF1dG8tc3RhcnRpbmcgdG91ciBmb3IgZmlyc3QtdGltZSBpbnN0YWxsJyk7XG4gICAgICAgIGF3YWl0IHByb2dyZXNzVHJhY2tlci5tYXJrSW5zdGFsbE9uYm9hcmRpbmdDb21wbGV0ZWQoKTtcbiAgICAgICAgLy8gV2FpdCBhIGJpdCBmb3IgcGFnZSB0byBmdWxseSBsb2FkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRvdXJNYW5hZ2VyLnN0YXJ0VG91cigpO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRvdXJDb21wbGV0ZWQgPSBwcm9ncmVzc1RyYWNrZXIuaXNUb3VyQ29tcGxldGVkKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gcHJvZ3Jlc3NUcmFja2VyLmdldEN1cnJlbnRTdGVwKCk7XG4gICAgICAgIGRlYnVnKGBbT25ib2FyZGluZ10gVG91ciBub3QgYXV0by1zdGFydGluZyAoY29tcGxldGVkOiAke3RvdXJDb21wbGV0ZWR9LCBzdGVwOiAke2N1cnJlbnRTdGVwfSlgKTtcbiAgICAgICAgXG4gICAgICAgIC8vIElmIHRvdXIgaXMgaW4gcHJvZ3Jlc3MsIG9mZmVyIHRvIHJlc3VtZVxuICAgICAgICBpZiAoIXRvdXJDb21wbGV0ZWQgJiYgY3VycmVudFN0ZXAgPiAwKSB7XG4gICAgICAgICAgZGVidWcoJ1tPbmJvYXJkaW5nXSBUb3VyIGluIHByb2dyZXNzLCBjYW4gYmUgcmVzdW1lZCBtYW51YWxseScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCByZXN0YXJ0IHRvdXIgYnV0dG9uIHRvIHRvb2xzIHJvd1xuICAgICAgYWRkUmVzdGFydFRvdXJCdXR0b24oKTtcblxuICAgICAgLy8gRXhwb3NlIHRvIGdsb2JhbCBzY29wZSBmb3IgbWFudWFsIHRyaWdnZXJpbmdcbiAgICAgIHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nID0ge1xuICAgICAgICBzdGFydFRvdXI6ICgpID0+IHRvdXJNYW5hZ2VyLnN0YXJ0VG91cigpLFxuICAgICAgICByZXN0YXJ0VG91cjogKCkgPT4gdG91ck1hbmFnZXIucmVzdGFydFRvdXIoKSxcbiAgICAgICAgc2hvd1Rvb2x0aXA6IChpZCkgPT4gdG91ck1hbmFnZXIuc2hvd1Rvb2x0aXAoaWQpLFxuICAgICAgICBzaG93V2hhdHNOZXc6ICgpID0+IHRvdXJNYW5hZ2VyLnNob3dXaGF0c05ldygpLFxuICAgICAgICByZXNldFByb2dyZXNzOiAoKSA9PiBwcm9ncmVzc1RyYWNrZXIucmVzZXRQcm9ncmVzcygpLFxuICAgICAgICBnZXRFcnJvcnM6ICgpID0+IGVycm9ySGFuZGxlci5nZXRFcnJvcnMoKSxcbiAgICAgICAgZ2V0RXJyb3JTdGF0czogKCkgPT4gZXJyb3JIYW5kbGVyLmdldFN0YXRpc3RpY3MoKVxuICAgICAgfTtcblxuICAgICAgZGVidWcoJ1tPbmJvYXJkaW5nXSBTeXN0ZW0gaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvckhhbmRsZXIpIHtcbiAgICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbT25ib2FyZGluZ10gSW5pdGlhbGl6YXRpb24nLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdyYWNlZnVsIGRlZ3JhZGF0aW9uIC0gZG9uJ3QgYnJlYWsgdGhlIGRhc2hib2FyZFxuICAgICAgY29uc29sZS53YXJuKCdbT25ib2FyZGluZ10gU3lzdGVtIGZhaWxlZCB0byBpbml0aWFsaXplLCBkYXNoYm9hcmQgd2lsbCBjb250aW51ZSB3aXRob3V0IG9uYm9hcmRpbmcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIHJlc3RhcnQgdG91ciBidXR0b24gdG8gdG9vbHMgcm93XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXN0YXJ0VG91ckJ1dHRvbigpIHtcbiAgICBjb25zdCB0b29sc1JvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b29scy1wcmltYXJ5JykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvb2xzJyk7XG4gICAgaWYgKCF0b29sc1JvdykgcmV0dXJuO1xuXG4gICAgY29uc3QgY2xpY2tIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgaWYgKHRvdXJNYW5hZ2VyKSB7XG4gICAgICAgIGRlYnVnKCdbT25ib2FyZGluZ10gU3RhcnRpbmcgdG91ciB2aWEgYnV0dG9uIGNsaWNrJyk7XG4gICAgICAgIHRvdXJNYW5hZ2VyLnJlc3RhcnRUb3VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZXJyb3JIYW5kbGVyKSB7XG4gICAgICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbT25ib2FyZGluZ10gVG91ciBNYW5hZ2VyIE5vdCBJbml0aWFsaXplZCcsIG5ldyBFcnJvcignVG91ciBtYW5hZ2VyIG5vdCBpbml0aWFsaXplZCcpKTtcbiAgICAgICAgfVxuICAgICAgICBhbGVydCgnVG91ciBpcyBub3QgYXZhaWxhYmxlLiBDaGVjayBicm93c2VyIGNvbnNvbGUgZm9yIGVycm9ycy5cXG5cXG5Qb3NzaWJsZSBpc3N1ZXM6XFxuLSBEcml2ZXIuanMgbGlicmFyeSBmYWlsZWQgdG8gbG9hZFxcbi0gSmF2YVNjcmlwdCBlcnJvcnMgZHVyaW5nIGluaXRpYWxpemF0aW9uJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIElmIGJ1dHRvbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgSFRNTCwganVzdCBhdHRhY2ggdGhlIGhhbmRsZXJcbiAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN0YXJ0LXRvdXItYnRuJyk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5vbmNsaWNrID0gY2xpY2tIYW5kbGVyO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ1dHRvbi5pZCA9ICdyZXN0YXJ0LXRvdXItYnRuJztcbiAgICBidXR0b24udGV4dENvbnRlbnQgPSAnSGVscCBUb3VyJztcbiAgICBidXR0b24udGl0bGUgPSAnUmVzdGFydCB0aGUgb25ib2FyZGluZyB0b3VyJztcbiAgICBidXR0b24ub25jbGljayA9IGNsaWNrSGFuZGxlcjtcbiAgICB0b29sc1Jvdy5hcHBlbmRDaGlsZChidXR0b24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIERyaXZlci5qcyBpcyBsb2FkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGNoZWNrRHJpdmVyTG9hZGVkKCkge1xuICAgIC8vIERyaXZlci5qcyB2MS54IElJRkU6IHdpbmRvdy5kcml2ZXIuanMuZHJpdmVyIGlzIHRoZSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgY29uc3QgZHJpdmVyRmFjdG9yeSA9IHdpbmRvdy5kcml2ZXI/LmpzPy5kcml2ZXIgfHwgd2luZG93LmRyaXZlcj8uZHJpdmVyIHx8IHdpbmRvdy5kcml2ZXI7XG4gICAgaWYgKHR5cGVvZiBkcml2ZXJGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPbmJvYXJkaW5nXSBEcml2ZXIuanMgbm90IGxvYWRlZCB5ZXQsIHdpbGwgcmV0cnkuLi4gd2luZG93LmRyaXZlcjonLCB3aW5kb3cuZHJpdmVyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgRHJpdmVyLmpzIHRvIGxvYWQsIHRoZW4gaW5pdGlhbGl6ZVxuICAgKi9cbiAgZnVuY3Rpb24gd2FpdEZvckRyaXZlcigpIHtcbiAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IDEwO1xuXG4gICAgZnVuY3Rpb24gYXR0ZW1wdEluaXQoKSB7XG4gICAgICBpZiAoY2hlY2tEcml2ZXJMb2FkZWQoKSkge1xuICAgICAgICBpbml0aWFsaXplT25ib2FyZGluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0cmllcysrO1xuICAgICAgICBpZiAocmV0cmllcyA8IG1heFJldHJpZXMpIHtcbiAgICAgICAgICAvLyBSZXRyeSBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgICAgc2V0VGltZW91dChhdHRlbXB0SW5pdCwgNTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYXggcmV0cmllcyByZWFjaGVkLCBzaG93IGZhbGxiYWNrXG4gICAgICAgICAgaWYgKGVycm9ySGFuZGxlcikge1xuICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmhhbmRsZURyaXZlckxvYWRGYWlsdXJlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0ZW1wb3JhcnkgZXJyb3IgaGFuZGxlciBmb3IgZmFsbGJhY2tcbiAgICAgICAgICAgIGNvbnN0IHRlbXBIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICAgICAgICAgICAgdGVtcEhhbmRsZXIuaGFuZGxlRHJpdmVyTG9hZEZhaWx1cmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRlbXB0SW5pdCgpO1xuICB9XG5cbiAgLy8gU3RhcnQgaW5pdGlhbGl6YXRpb24gd2hlbiBET00gaXMgcmVhZHlcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB3YWl0Rm9yRHJpdmVyKTtcbiAgfSBlbHNlIHtcbiAgICB3YWl0Rm9yRHJpdmVyKCk7XG4gIH1cblxuICBkZWJ1ZygnW09uYm9hcmRpbmddIFN5c3RlbSBsb2FkZWQnKTtcblxufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICJBQUFBLEtBQUssT0FBTyxLQUFLLFFBQVEsQ0FBQyxFQUFFLEtBQUssT0FBTyxJQUFHLFNBQVNBLEVBQUUsQ0FBQyxhQUFhLElBQUlDLEVBQUUsQ0FBQyxFQUFFLFNBQVNDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQ0QsRUFBRSxDQUFDLFFBQVEsR0FBRyxXQUFXLEdBQUcsZUFBZSxHQUFHLGFBQWEsR0FBRyx5QkFBeUIsR0FBRyxhQUFhLEdBQUcsYUFBYSxHQUFHLFlBQVksRUFBRSxjQUFjLEdBQUcsWUFBWSxDQUFDLE9BQU8sV0FBVyxPQUFPLEVBQUUsZUFBZSxDQUFDLEVBQUUsYUFBYSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUVBLEVBQUUsQ0FBQyxFQUFFQSxDQUFDLENBQUMsU0FBU0UsRUFBRSxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFLENBQUMsT0FBTyxHQUFHQSxFQUFFLEdBQUcsRUFBRUQsRUFBRSxFQUFFLEVBQUUsRUFBRUQsRUFBRSxDQUFDQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHRCxDQUFDLENBQUMsU0FBU0csRUFBRSxFQUFFLENBQUMsTUFBTUgsRUFBRSxxTkFBcU4sT0FBTyxFQUFFLFFBQVFDLEdBQUcsQ0FBQyxNQUFNQyxFQUFFRCxFQUFFLFFBQVFELENBQUMsRUFBRUksRUFBRSxNQUFNLEtBQUtILEVBQUUsaUJBQWlCRCxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBR0UsRUFBRSxDQUFDRCxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUdHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBT0gsR0FBRyxpQkFBaUJBLENBQUMsRUFBRSxnQkFBZ0IsUUFBUUksRUFBR0osQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBR0MsRUFBRyxDQUFDLEVBQUUsT0FBTyxNQUFNUCxFQUFFLEVBQUUsY0FBYyxFQUFFLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQ0EsR0FBR1EsRUFBRyxDQUFDLEVBQUUsT0FBTyxTQUFTLE9BQU8sU0FBUyxNQUFNLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBU0EsRUFBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGNBQWMsT0FBTyxNQUFNUixFQUFFLEVBQUUsY0FBYyxPQUFPQSxFQUFFLGFBQWFBLEVBQUUsWUFBWSxDQUFDLFNBQVNPLEVBQUcsRUFBRSxDQUFDLE1BQU1QLEVBQUUsRUFBRSxzQkFBc0IsRUFBRSxPQUFPQSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdBLEVBQUUsU0FBUyxPQUFPLGFBQWEsU0FBUyxnQkFBZ0IsZUFBZUEsRUFBRSxRQUFRLE9BQU8sWUFBWSxTQUFTLGdCQUFnQixZQUFZLENBQUMsU0FBU0ssRUFBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsSUFBSUksRUFBRSxDQUFDLEVBQUUsU0FBU0MsRUFBRSxFQUFFVixFQUFFLENBQUNTLEVBQUUsQ0FBQyxFQUFFVCxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUVTLEVBQUUsQ0FBQyxFQUFFQSxDQUFDLENBQUMsU0FBU0UsR0FBRyxDQUFDRixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUlHLEVBQUUsQ0FBQyxFQUFFLFNBQVNDLEVBQUUsRUFBRWIsRUFBRSxDQUFDWSxFQUFFLENBQUMsRUFBRVosQ0FBQyxDQUFDLFNBQVNjLEVBQUUsRUFBRSxDQUFDLElBQUlkLEdBQUdBLEVBQUVZLEVBQUUsQ0FBQyxJQUFJLE1BQU1aLEVBQUUsS0FBS1ksQ0FBQyxDQUFDLENBQUMsU0FBU0csR0FBSSxDQUFDSCxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVNJLEVBQUcsRUFBRWhCLEVBQUVDLEVBQUVDLEVBQUUsQ0FBQyxJQUFJRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsTUFBTWEsRUFBRWIsR0FBR0gsRUFBRSxzQkFBc0IsRUFBRWlCLEVBQUVoQixFQUFFLHNCQUFzQixFQUFFaUIsRUFBRXBCLEVBQUUsRUFBRWtCLEVBQUUsRUFBRUMsRUFBRSxFQUFFRCxFQUFFLEVBQUVqQixDQUFDLEVBQUVvQixFQUFFckIsRUFBRSxFQUFFa0IsRUFBRSxFQUFFQyxFQUFFLEVBQUVELEVBQUUsRUFBRWpCLENBQUMsRUFBRXFCLEVBQUV0QixFQUFFLEVBQUVrQixFQUFFLE1BQU1DLEVBQUUsTUFBTUQsRUFBRSxNQUFNakIsQ0FBQyxFQUFFc0IsRUFBRXZCLEVBQUUsRUFBRWtCLEVBQUUsT0FBT0MsRUFBRSxPQUFPRCxFQUFFLE9BQU9qQixDQUFDLEVBQUVJLEVBQUUsQ0FBQ2UsRUFBSSxFQUFFQyxFQUFFLE1BQU1DLEVBQUUsT0FBT0MsQ0FBQyxFQUFFQyxFQUFFbkIsQ0FBQyxFQUFFTSxFQUFFLHdCQUF3Qk4sQ0FBQyxDQUFDLENBQUMsU0FBU29CLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sTUFBTXhCLEVBQUUsRUFBRSxzQkFBc0IsRUFBRUMsRUFBRSxDQUFDLEVBQUVELEVBQUUsRUFBRSxFQUFFQSxFQUFFLEVBQUUsTUFBTUEsRUFBRSxNQUFNLE9BQU9BLEVBQUUsTUFBTSxFQUFFVSxFQUFFLHdCQUF3QlQsQ0FBQyxFQUFFc0IsRUFBRXRCLENBQUMsQ0FBQyxDQUFDLFNBQVN3QixJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsdUJBQXVCLEVBQUV6QixFQUFFLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDQSxFQUFFLENBQUMsUUFBUSxLQUFLLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxNQUFNQyxFQUFFLE9BQU8sV0FBV0MsRUFBRSxPQUFPLFlBQVlGLEVBQUUsYUFBYSxVQUFVLE9BQU9DLENBQUMsSUFBSUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTd0IsR0FBRyxFQUFFLENBQUMsTUFBTTFCLEVBQUUyQixHQUFHLENBQUMsRUFBRSxTQUFTLEtBQUssWUFBWTNCLENBQUMsRUFBRTRCLEdBQUU1QixFQUFFQyxHQUFHLENBQUNBLEVBQUUsT0FBTyxVQUFVLFFBQVFhLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRUosRUFBRSxlQUFlVixDQUFDLENBQUMsQ0FBQyxTQUFTdUIsRUFBRSxFQUFFLENBQUMsTUFBTXZCLEVBQUUsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDQSxFQUFFLENBQUMwQixHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTXpCLEVBQUVELEVBQUUsa0JBQWtCLEdBQW1CQyxHQUFFLFVBQVcsT0FBTyxNQUFNLElBQUksTUFBTSxvQ0FBb0MsRUFBRUEsRUFBRSxhQUFhLElBQUk0QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBU0YsR0FBRyxFQUFFLENBQUMsTUFBTTNCLEVBQUUsT0FBTyxXQUFXQyxFQUFFLE9BQU8sWUFBWUMsRUFBRSxTQUFTLGdCQUFnQiw2QkFBNkIsS0FBSyxFQUFFQSxFQUFFLFVBQVUsSUFBSSxpQkFBaUIseUJBQXlCLEVBQUVBLEVBQUUsYUFBYSxVQUFVLE9BQU9GLENBQUMsSUFBSUMsQ0FBQyxFQUFFLEVBQUVDLEVBQUUsYUFBYSxXQUFXLFVBQVUsRUFBRUEsRUFBRSxhQUFhLGFBQWEsOEJBQThCLEVBQUVBLEVBQUUsYUFBYSxVQUFVLEtBQUssRUFBRUEsRUFBRSxhQUFhLHNCQUFzQixnQkFBZ0IsRUFBRUEsRUFBRSxNQUFNLFNBQVMsVUFBVUEsRUFBRSxNQUFNLFNBQVMsVUFBVUEsRUFBRSxNQUFNLGVBQWUsUUFBUUEsRUFBRSxNQUFNLGlCQUFpQixJQUFJQSxFQUFFLE1BQU0sT0FBTyxRQUFRQSxFQUFFLE1BQU0sU0FBUyxRQUFRQSxFQUFFLE1BQU0sSUFBSSxJQUFJQSxFQUFFLE1BQU0sS0FBSyxJQUFJQSxFQUFFLE1BQU0sTUFBTSxPQUFPQSxFQUFFLE1BQU0sT0FBTyxPQUFPLE1BQU1FLEVBQUUsU0FBUyxnQkFBZ0IsNkJBQTZCLE1BQU0sRUFBRSxPQUFPQSxFQUFFLGFBQWEsSUFBSXlCLEVBQUUsQ0FBQyxDQUFDLEVBQUV6QixFQUFFLE1BQU0sS0FBSyxFQUFFLGNBQWMsR0FBRyxhQUFhQSxFQUFFLE1BQU0sUUFBUSxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsR0FBR0EsRUFBRSxNQUFNLGNBQWMsT0FBT0EsRUFBRSxNQUFNLE9BQU8sT0FBT0YsRUFBRSxZQUFZRSxDQUFDLEVBQUVGLENBQUMsQ0FBQyxTQUFTMkIsRUFBRSxFQUFFLENBQUMsTUFBTTdCLEVBQUUsT0FBTyxXQUFXQyxFQUFFLE9BQU8sWUFBWUMsRUFBRSxFQUFFLGNBQWMsR0FBRyxFQUFFRSxFQUFFLEVBQUUsYUFBYSxHQUFHLEVBQUVhLEVBQUUsRUFBRSxNQUFNZixFQUFFLEVBQUVnQixFQUFFLEVBQUUsT0FBT2hCLEVBQUUsRUFBRWlCLEVBQUUsS0FBSyxJQUFJZixFQUFFYSxFQUFFLEVBQUVDLEVBQUUsQ0FBQyxFQUFFRSxFQUFFLEtBQUssTUFBTSxLQUFLLElBQUlELEVBQUUsQ0FBQyxDQUFDLEVBQUVFLEVBQUUsRUFBRSxFQUFFbkIsRUFBRWtCLEVBQUVFLEVBQUUsRUFBRSxFQUFFcEIsRUFBRTRCLEVBQUViLEVBQUVHLEVBQUUsRUFBRVcsRUFBRWIsRUFBRUUsRUFBRSxFQUFFLE1BQU0sSUFBSXBCLENBQUMsWUFBWUMsQ0FBQyxJQUFJRCxDQUFDLElBQUlDLENBQUMsSUFBSUQsQ0FBQztBQUFBLE9BQzluSHFCLENBQUMsSUFBSUMsQ0FBQyxLQUFLUSxDQUFDLEtBQUtWLENBQUMsSUFBSUEsQ0FBQyxVQUFVQSxDQUFDLElBQUlBLENBQUMsS0FBS1csQ0FBQyxLQUFLWCxDQUFDLElBQUlBLENBQUMsV0FBV0EsQ0FBQyxJQUFJQSxDQUFDLE1BQU1VLENBQUMsS0FBS1YsQ0FBQyxJQUFJQSxDQUFDLFdBQVdBLENBQUMsS0FBS0EsQ0FBQyxNQUFNVyxDQUFDLEtBQUtYLENBQUMsSUFBSUEsQ0FBQyxVQUFVQSxDQUFDLEtBQUtBLENBQUMsSUFBSSxDQUFDLFNBQVNZLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVNDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxlQUFlLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSWpDLEVBQUUsU0FBUyxjQUFjLEtBQUssRUFBRSxPQUFPQSxFQUFFLEdBQUcsdUJBQXVCQSxFQUFFLE1BQU0sTUFBTSxJQUFJQSxFQUFFLE1BQU0sT0FBTyxJQUFJQSxFQUFFLE1BQU0sY0FBYyxPQUFPQSxFQUFFLE1BQU0sUUFBUSxJQUFJQSxFQUFFLE1BQU0sU0FBUyxRQUFRQSxFQUFFLE1BQU0sSUFBSSxNQUFNQSxFQUFFLE1BQU0sS0FBSyxNQUFNLFNBQVMsS0FBSyxZQUFZQSxDQUFDLEVBQUVBLENBQUMsQ0FBQyxTQUFTa0MsR0FBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVFsQyxDQUFDLEVBQUUsRUFBRSxJQUFJQyxFQUFFLE9BQU9ELEdBQUcsU0FBUyxTQUFTLGNBQWNBLENBQUMsRUFBRUEsRUFBRUMsSUFBSUEsRUFBRWdDLEdBQUcsR0FBR0UsR0FBR2xDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBU21DLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxpQkFBaUIsRUFBRXBDLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSXdCLEVBQUUsQ0FBQyxFQUFFQyxHQUFHLEVBQUVZLEdBQUcsRUFBRXJDLENBQUMsRUFBRSxDQUFDLFNBQVNtQyxHQUFHLEVBQUVuQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFSSxFQUFFLEVBQUUsY0FBYyxFQUFFYSxFQUFFLEVBQUUsaUJBQWlCLEdBQUcsRUFBRUMsRUFBRSxDQUFDRCxHQUFHQSxJQUFJLEVBQUVFLEVBQUUsRUFBRSxLQUFLLHVCQUF1QkMsRUFBRUgsRUFBRSxLQUFLLHVCQUF1QkksRUFBRSxFQUFFLFNBQVMsRUFBRUMsRUFBRXRCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUU4QixFQUFrQjlCLEdBQUUsZUFBZ0IsRUFBRSxlQUFlLEVBQUUrQixFQUFrQjNCLEdBQUUsY0FBZSxFQUFFLGNBQWMsRUFBRWtDLEVBQUUsRUFBRSxFQUFFQyxFQUFFLEVBQUUsRUFBRSxDQUFDckIsR0FBR2EsR0FBR0EsRUFBRVgsRUFBRSxPQUFPSCxFQUFFYixFQUFFLENBQUMsT0FBT2tDLEVBQUUsTUFBTUMsQ0FBQyxDQUFDLEVBQUVqQixHQUFHQSxFQUFFSCxFQUFFLE9BQU8sRUFBRW5CLEVBQUUsQ0FBQyxPQUFPc0MsRUFBRSxNQUFNQyxDQUFDLENBQUMsRUFBRSxNQUFNQyxFQUFFLENBQUN0QixHQUFHRyxFQUFFLElBQUlvQixFQUFFLEdBQUdDLEdBQUcsRUFBRWhDLEVBQUUsZUFBZU4sQ0FBQyxFQUFFTSxFQUFFLGtCQUFrQk8sQ0FBQyxFQUFFUCxFQUFFLGFBQWFWLENBQUMsRUFBRVUsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU1pQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLElBQUlBLEVBQUUsT0FBTyxNQUFNQyxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUVDLEVBQUUsSUFBSUQsR0FBRyxJQUFJLEVBQUU1QyxFQUFFLFNBQVM2QyxHQUFHLENBQUNKLEdBQUdELElBQUlNLEdBQUUsRUFBRTlDLENBQUMsRUFBRXlDLEVBQUUsSUFBSSxFQUFFLFNBQVMsR0FBR0csRUFBRSxJQUFJNUIsRUFBRzRCLEVBQUUsSUFBSTNCLEVBQUUsQ0FBQyxHQUFHTyxFQUFFLENBQUMsRUFBRU0sR0FBR0EsRUFBRVgsRUFBRSxPQUFPLEVBQUVuQixFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFVSxFQUFFLHVCQUF1QixNQUFNLEVBQUVBLEVBQUUsaUJBQWlCTixDQUFDLEVBQUVNLEVBQUUsb0JBQW9CTyxDQUFDLEVBQUVQLEVBQUUsZUFBZVYsQ0FBQyxFQUFFVSxFQUFFLGtCQUFrQixDQUFDLEdBQUcsT0FBTyxzQkFBc0JpQyxDQUFDLENBQUMsRUFBRWpDLEVBQUUsdUJBQXVCaUMsQ0FBQyxFQUFFLE9BQU8sc0JBQXNCQSxDQUFDLEVBQUVyQyxFQUFFLENBQUMsRUFBRSxDQUFDa0MsR0FBR3hDLEVBQUUsU0FBUzhDLEdBQUUsRUFBRTlDLENBQUMsRUFBRWlCLEVBQUUsVUFBVSxPQUFPLHdCQUF3Qix1QkFBdUIsRUFBRUEsRUFBRSxnQkFBZ0IsZUFBZSxFQUFFQSxFQUFFLGdCQUFnQixlQUFlLEVBQUVBLEVBQUUsZ0JBQWdCLGVBQWUsRUFBRSxFQUFFLDBCQUEwQixHQUFHLEVBQUUsVUFBVSxJQUFJLHVCQUF1QixFQUFFLEVBQUUsVUFBVSxJQUFJLHVCQUF1QixFQUFFLEVBQUUsYUFBYSxnQkFBZ0IsUUFBUSxFQUFFLEVBQUUsYUFBYSxnQkFBZ0IsTUFBTSxFQUFFLEVBQUUsYUFBYSxnQkFBZ0Isd0JBQXdCLENBQUMsQ0FBQyxTQUFTOEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLFNBQVMsZUFBZSxzQkFBc0IsSUFBSSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsaUJBQWlCLHdCQUF3QixFQUFFLFFBQVEvQyxHQUFHLENBQUNBLEVBQUUsVUFBVSxPQUFPLHdCQUF3Qix1QkFBdUIsRUFBRUEsRUFBRSxnQkFBZ0IsZUFBZSxFQUFFQSxFQUFFLGdCQUFnQixlQUFlLEVBQUVBLEVBQUUsZ0JBQWdCLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTZ0QsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsT0FBTyxxQkFBcUIsQ0FBQyxFQUFFdEMsRUFBRSxrQkFBa0IsT0FBTyxzQkFBc0IwQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVNhLEdBQUcsRUFBRSxDQUFDLElBQUk3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLGVBQWUsR0FBRyxFQUFFLEVBQUUsTUFBTSxPQUFPLEVBQUUsVUFBVSxHQUFHLE9BQU8sTUFBTSxFQUFFLEVBQUUsaUJBQWlCLEVBQUVoQixHQUFHZ0IsRUFBRSxFQUFFLFNBQVMsSUFBSSxLQUFLLE9BQU9BLEVBQUUsUUFBUUgsRUFBRWQsRUFBRSxDQUFDLEdBQUdDLEVBQUUsQ0FBQ0EsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRWMsRUFBRUQsRUFBRSxDQUFDLEVBQUVFLEVBQUVGLEVBQUVBLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxNQUFNSSxFQUFFSixFQUFFQSxFQUFFLFFBQVEsU0FBUyxhQUFhLEVBQUUsQ0FBQyxHQUFHRSxFQUFXRSxHQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTUEsRUFBRUosRUFBRUEsRUFBRSxRQUFRLFNBQVMsYUFBYSxFQUFFLENBQUMsR0FBR0MsRUFBV0csR0FBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM2QixHQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLHNCQUFzQixJQUFJLE1BQU0sS0FBSyxFQUFFLE1BQU0sU0FBU3BDLEVBQUUsYUFBYSxFQUFFLEVBQUUsTUFBTSxhQUFhQSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxhQUFhQSxFQUFFLGdCQUFnQixFQUFFLENBQUMsU0FBU2MsR0FBRSxFQUFFNUIsRUFBRUMsRUFBRSxDQUFDLE1BQU1DLEVBQUUsQ0FBQ2UsRUFBRUMsSUFBSSxDQUFDLE1BQU1DLEVBQUVGLEVBQUUsT0FBTyxFQUFFLFNBQVNFLENBQUMsS0FBSyxDQUFDbEIsR0FBR0EsRUFBRWtCLENBQUMsS0FBS0YsRUFBRSxlQUFlLEVBQUVBLEVBQUUsZ0JBQWdCLEVBQUVBLEVBQUUseUJBQXlCLEdBQVlDLElBQUVELENBQUMsRUFBRSxFQUFFLFNBQVMsaUJBQWlCLGNBQWNmLEVBQUUsRUFBRSxFQUFFLFNBQVMsaUJBQWlCLFlBQVlBLEVBQUUsRUFBRSxFQUFFLFNBQVMsaUJBQWlCLFlBQVlBLEVBQUUsRUFBRSxFQUFFLFNBQVMsaUJBQWlCLFVBQVVBLEVBQUUsRUFBRSxFQUFFLFNBQVMsaUJBQWlCLFFBQVFlLEdBQUcsQ0FBQ2YsRUFBRWUsRUFBRWpCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVNtRCxJQUFJLENBQUMsT0FBTyxpQkFBaUIsUUFBUUQsR0FBRSxFQUFFLEVBQUUsT0FBTyxpQkFBaUIsVUFBVUQsR0FBRyxFQUFFLEVBQUUsT0FBTyxpQkFBaUIsU0FBU0QsQ0FBQyxFQUFFLE9BQU8saUJBQWlCLFNBQVNBLENBQUMsQ0FBQyxDQUFDLFNBQVNJLElBQUksQ0FBQyxPQUFPLG9CQUFvQixRQUFRRixFQUFDLEVBQUUsT0FBTyxvQkFBb0IsU0FBU0YsQ0FBQyxFQUFFLE9BQU8sb0JBQW9CLFNBQVNBLENBQUMsQ0FBQyxDQUFDLFNBQVNOLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsTUFBTSxRQUFRLE9BQU8sQ0FBQyxTQUFTSSxHQUFFLEVBQUU5QyxFQUFFLENBQUMsSUFBSXFELEVBQUVSLEVBQUUsSUFBSTVDLEVBQUUsRUFBRSxTQUFTLEVBQUVBLEdBQUcsU0FBUyxLQUFLLFlBQVlBLEVBQUUsT0FBTyxFQUFFQSxFQUFFcUQsR0FBRyxFQUFFLFNBQVMsS0FBSyxZQUFZckQsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU1DLEVBQUUsWUFBWUUsRUFBRSxZQUFZYSxFQUFFLGVBQWVDLEVBQUUsYUFBYUMsRUFBRSxZQUFZQyxFQUFFLEVBQUUsYUFBYSxHQUFHLGNBQWMsWUFBWUMsRUFBRSxFQUFFLGFBQWEsR0FBRyxrQkFBa0IsYUFBYUMsRUFBRSxFQUFFLGNBQWMsR0FBRyxzQkFBc0IsRUFBRXRCLEVBQUUsU0FBUyxDQUFDLEVBQUVDLEVBQUUsV0FBVyxVQUFVbUIsRUFBRW5CLEVBQUUsZUFBZSxVQUFVb0IsRUFBRXBCLEVBQUUsU0FBUyxVQUFVcUIsRUFBRXBCLEdBQUdELEVBQUUsTUFBTSxVQUFVQyxFQUFFRCxFQUFFLE1BQU0sTUFBTSxRQUFRLFNBQVNBLEVBQUUsTUFBTSxNQUFNLFFBQVEsT0FBT0csR0FBR0gsRUFBRSxZQUFZLFVBQVVHLEVBQUVILEVBQUUsWUFBWSxNQUFNLFFBQVEsU0FBU0EsRUFBRSxZQUFZLE1BQU0sUUFBUSxPQUFPLE1BQU02QixFQUFFYixHQUFHLEVBQUUsYUFBYSxFQUFFYyxFQUFFWixHQUFHLEVBQUUsY0FBYyxHQUFHLEdBQUdtQixFQUFrQlIsR0FBRSxTQUFTLE1BQU0sR0FBb0JBLEdBQUUsU0FBUyxVQUFVLEdBQUlDLEVBQUU5QixFQUFFLFlBQVksTUFBTSxRQUFRNkIsRUFBRSxTQUFTLE9BQU8sRUFBRSxRQUFRLE9BQU9RLEdBQUdyQyxFQUFFLE9BQU8sTUFBTSxRQUFRLE9BQU9BLEVBQUUsU0FBUyxNQUFNLFFBQVE4QixFQUFFLFFBQVEsT0FBTzlCLEVBQUUsV0FBVyxNQUFNLFFBQVE2QixFQUFFLFNBQVMsTUFBTSxFQUFFLFFBQVEsT0FBTzdCLEVBQUUsZUFBZSxNQUFNLFFBQVE2QixFQUFFLFNBQVMsVUFBVSxFQUFFLFFBQVEsUUFBUTdCLEVBQUUsT0FBTyxNQUFNLFFBQVEsT0FBTyxNQUFNc0MsRUFBRXJCLEdBQUcsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUVxQixHQUFHLE1BQU1BLEVBQUUsU0FBUyxNQUFNLElBQUl0QyxFQUFFLFdBQVcsU0FBUyxHQUFHQSxFQUFFLFdBQVcsVUFBVSxJQUFJLDZCQUE2QixHQUFHc0MsR0FBRyxNQUFNQSxFQUFFLFNBQVMsVUFBVSxJQUFJdEMsRUFBRSxlQUFlLFNBQVMsR0FBR0EsRUFBRSxlQUFlLFVBQVUsSUFBSSw2QkFBNkIsR0FBR3NDLEdBQUcsTUFBTUEsRUFBRSxTQUFTLE9BQU8sSUFBSXRDLEVBQUUsWUFBWSxTQUFTLEdBQUdBLEVBQUUsWUFBWSxVQUFVLElBQUksNkJBQTZCLEdBQUcsTUFBTXVDLEVBQUV2QyxFQUFFLFFBQVF1QyxFQUFFLE1BQU0sUUFBUSxRQUFRQSxFQUFFLE1BQU0sS0FBSyxHQUFHQSxFQUFFLE1BQU0sSUFBSSxHQUFHQSxFQUFFLE1BQU0sT0FBTyxHQUFHQSxFQUFFLE1BQU0sTUFBTSxHQUFHQSxFQUFFLEdBQUcseUJBQXlCQSxFQUFFLGFBQWEsT0FBTyxRQUFRLEVBQUVBLEVBQUUsYUFBYSxrQkFBa0Isc0JBQXNCLEVBQUVBLEVBQUUsYUFBYSxtQkFBbUIsNEJBQTRCLEVBQUUsTUFBTUMsRUFBRXhDLEVBQUUsTUFBTXdDLEVBQUUsVUFBVSx1QkFBdUIsTUFBTUUsSUFBSVUsRUFBRXJELEVBQUUsVUFBVSxLQUFLLE9BQU9xRCxFQUFFLGVBQWUsRUFBRSxjQUFjLEdBQUcsR0FBR2IsRUFBRSxVQUFVLGtCQUFrQkcsQ0FBQyxHQUFHLEtBQUssRUFBRWYsR0FBRTNCLEVBQUUsUUFBUXNELEdBQUcsQ0FBQyxJQUFJQyxFQUFFQyxFQUFFQyxFQUFFLE1BQU1DLEVBQUVKLEVBQUUsT0FBT0ssSUFBSUosRUFBRXhELEVBQUUsVUFBVSxLQUFLLE9BQU93RCxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUVLLElBQUlKLEVBQUV6RCxFQUFFLFVBQVUsS0FBSyxPQUFPeUQsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFSyxJQUFJSixFQUFFMUQsRUFBRSxVQUFVLEtBQUssT0FBTzBELEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxHQUFHQyxFQUFFLFVBQVUsU0FBUyx5QkFBeUIsRUFBRSxPQUFPQyxFQUFFQSxFQUFFLEVBQUU1RCxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFYyxFQUFFLFdBQVcsRUFBRSxHQUFHNkMsRUFBRSxVQUFVLFNBQVMseUJBQXlCLEVBQUUsT0FBT0UsRUFBRUEsRUFBRSxFQUFFN0QsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRWMsRUFBRSxXQUFXLEVBQUUsR0FBRzZDLEVBQUUsVUFBVSxTQUFTLDBCQUEwQixFQUFFLE9BQU9HLEVBQUVBLEVBQUUsRUFBRTlELEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUVjLEVBQUUsWUFBWSxDQUFDLEVBQUV5QyxHQUFHLEVBQUV0RCxHQUFHLE1BQU1BLEVBQUUsWUFBWSxTQUFTc0QsQ0FBQyxJQUFJLEVBQUV0RCxHQUFHLE1BQU1BLEVBQUUsTUFBTSxTQUFTc0QsQ0FBQyxJQUFJLE9BQU9BLEVBQUUsV0FBVyxVQUFVQSxFQUFFLFVBQVUsU0FBUyxnQkFBZ0IsQ0FBQyxFQUFFN0MsRUFBRSxVQUFVVCxDQUFDLEVBQUUsTUFBTThELElBQUlsQixFQUFFN0MsRUFBRSxVQUFVLEtBQUssT0FBTzZDLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUVrQixHQUFHQSxFQUFFOUQsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRW9DLEdBQUcsRUFBRXJDLENBQUMsRUFBRU0sRUFBRWtDLENBQUMsRUFBRSxNQUFNd0IsRUFBRSxFQUFFLFVBQVUsU0FBUyxzQkFBc0IsRUFBRXBCLEVBQUV6QyxFQUFFLENBQUNxQyxFQUFFLEdBQUd3QixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVwQixFQUFFLE9BQU8sR0FBR0EsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBU3FCLElBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLFNBQVMsT0FBTyxNQUFNakUsRUFBRSxFQUFFLFFBQVEsc0JBQXNCLEVBQUVDLEVBQUUsRUFBRSxjQUFjLEdBQUcsRUFBRUMsRUFBRSxFQUFFLGVBQWUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNRixFQUFFLE1BQU1DLEVBQUVDLEVBQUUsT0FBT0YsRUFBRSxPQUFPQyxFQUFFQyxFQUFFLFVBQVVGLEVBQUUsTUFBTSxXQUFXQSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVNrRSxHQUFHLEVBQUVsRSxFQUFFLENBQUMsS0FBSyxDQUFDLGtCQUFrQkMsRUFBRSxrQkFBa0JDLEVBQUUsZUFBZUUsRUFBRSx1QkFBdUJhLENBQUMsRUFBRWpCLEVBQUUsT0FBTyxJQUFJLFFBQVEsS0FBSyxJQUFJLEtBQUssSUFBSUMsRUFBRSxJQUFJRyxFQUFFLE9BQU8sWUFBWUYsRUFBRSxXQUFXZSxFQUFFLEtBQUssRUFBRUEsRUFBRSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssSUFBSSxLQUFLLElBQUloQixFQUFFLElBQW9CQyxHQUFFLFdBQVlELEVBQUUsT0FBT0csRUFBRSxPQUFPLFlBQTRCRixHQUFFLFdBQVllLEVBQUUsS0FBSyxFQUFFQSxFQUFFLEtBQUssRUFBRSxJQUFJLFNBQVMsS0FBSyxJQUFJLEtBQUssSUFBSWhCLEVBQUUsSUFBSUEsRUFBRSxPQUFPLEVBQWtCQyxHQUFFLFdBQVksRUFBRSxPQUFPLFlBQTRCQSxHQUFFLFdBQVllLEVBQUUsS0FBSyxFQUFFQSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBU2tELEdBQUcsRUFBRW5FLEVBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCQyxFQUFFLGtCQUFrQkMsRUFBRSxlQUFlRSxFQUFFLHVCQUF1QmEsQ0FBQyxFQUFFakIsRUFBRSxPQUFPLElBQUksUUFBUSxLQUFLLElBQUksS0FBSyxJQUFJQyxFQUFFLEtBQUtHLEVBQUUsT0FBTyxXQUFXRixFQUFFLFVBQVVlLEVBQUUsS0FBSyxFQUFFQSxFQUFFLEtBQUssRUFBRSxJQUFJLE1BQU0sS0FBSyxJQUFJLEtBQUssSUFBSWhCLEVBQUUsS0FBcUJDLEdBQUUsVUFBV0QsRUFBRSxNQUFNRyxFQUFFLE9BQU8sV0FBMkJGLEdBQUUsVUFBV2UsRUFBRSxLQUFLLEVBQUVBLEVBQUUsS0FBSyxFQUFFLElBQUksU0FBUyxLQUFLLElBQUksS0FBSyxJQUFJaEIsRUFBRSxLQUFLQSxFQUFFLE1BQU0sRUFBa0JDLEdBQUUsVUFBVyxFQUFFLE9BQU8sV0FBMkJBLEdBQUUsVUFBV2UsRUFBRSxLQUFLLEVBQUVBLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTb0IsR0FBRyxFQUFFckMsRUFBRSxDQUFDLE1BQU1DLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDQSxFQUFFLE9BQU8sS0FBSyxDQUFDLE1BQU1DLEVBQUUsUUFBUSxLQUFLRSxFQUFFLE1BQU0sRUFBa0JKLEdBQUUsU0FBVSxDQUFDLEVBQUVpQixFQUFFZixFQUFFZ0IsRUFBRSxFQUFFLEtBQUssdUJBQXVCLE9BQU9kLEVBQUVlLEVBQUUsRUFBRSxjQUFjLEdBQUcsRUFBRUMsRUFBRTZDLEdBQUUsRUFBRTVDLEVBQUVwQixFQUFFLE1BQU0sc0JBQXNCLEVBQUVxQixFQUFFLEVBQUUsc0JBQXNCLEVBQUVRLEVBQUVSLEVBQUUsSUFBSUYsRUFBRSxPQUFPLElBQUlXLEVBQUVELEdBQUcsRUFBRSxNQUFNUSxFQUFFLE9BQU8sYUFBYWhCLEVBQUUsT0FBT0YsRUFBRSxRQUFRLElBQUltQixFQUFFRCxHQUFHLEVBQUUsTUFBTUUsRUFBRWxCLEVBQUUsS0FBS0YsRUFBRSxNQUFNLElBQUlxQixFQUFFRCxHQUFHLEVBQUUsTUFBTUcsRUFBRSxPQUFPLFlBQVlyQixFQUFFLE1BQU1GLEVBQUUsT0FBTyxJQUFJMkMsRUFBRXBCLEdBQUcsRUFBRSxNQUFNcUIsRUFBRSxDQUFDakMsR0FBRyxDQUFDUSxHQUFHLENBQUNFLEdBQUcsQ0FBQ3NCLEVBQUUsSUFBSW5CLEVBQUUxQixFQUFFLEdBQUdBLElBQUksT0FBT2EsRUFBRWdDLEVBQUV0QixFQUFFRixFQUFFLEdBQUdyQixJQUFJLFVBQVVxQixFQUFFd0IsRUFBRXRCLEVBQUVWLEVBQUUsR0FBR2IsSUFBSSxRQUFRdUIsRUFBRXNCLEVBQUVoQyxFQUFFUSxFQUFFLEdBQUdyQixJQUFJLFNBQVM2QyxJQUFJdEIsRUFBRVYsRUFBRVEsRUFBRSxJQUFJckIsSUFBSSxPQUFPLENBQUMsTUFBTW1DLEVBQUUsT0FBTyxXQUFXLEVBQUVqQyxFQUFFLFVBQVUsRUFBRXlCLEVBQUUsT0FBTyxZQUFZLEVBQUV6QixFQUFFLFdBQVcsRUFBRW5CLEVBQUUsUUFBUSxNQUFNLEtBQUssR0FBR29ELENBQUMsS0FBS3BELEVBQUUsUUFBUSxNQUFNLE1BQU0sT0FBT0EsRUFBRSxRQUFRLE1BQU0sSUFBSSxHQUFHNEMsQ0FBQyxLQUFLNUMsRUFBRSxRQUFRLE1BQU0sT0FBTyxNQUFNLFNBQVMrRCxFQUFFLENBQUMsTUFBTVgsRUFBRSxPQUFPLFdBQVcsRUFBa0JqQyxHQUFFLFVBQVcsRUFBRXlCLEVBQUUsR0FBRzVDLEVBQUUsUUFBUSxNQUFNLEtBQUssR0FBR29ELENBQUMsS0FBS3BELEVBQUUsUUFBUSxNQUFNLE1BQU0sT0FBT0EsRUFBRSxRQUFRLE1BQU0sT0FBTyxHQUFHNEMsQ0FBQyxLQUFLNUMsRUFBRSxRQUFRLE1BQU0sSUFBSSxNQUFNLFNBQVN3QyxFQUFFLENBQUMsTUFBTVksRUFBRSxLQUFLLElBQUliLEVBQUUsT0FBTyxXQUEyQnBCLEdBQUUsVUFBV0MsRUFBRSxLQUFLLEVBQUV3QixFQUFFcUIsR0FBR2pELEVBQUUsQ0FBQyxrQkFBa0JLLEVBQUUsa0JBQWtCRixFQUFFLGVBQWVELEVBQUUsdUJBQXVCRSxDQUFDLENBQUMsRUFBRXBCLEVBQUUsUUFBUSxNQUFNLEtBQUssR0FBR29ELENBQUMsS0FBS3BELEVBQUUsUUFBUSxNQUFNLElBQUksR0FBRzRDLENBQUMsS0FBSzVDLEVBQUUsUUFBUSxNQUFNLE9BQU8sT0FBT0EsRUFBRSxRQUFRLE1BQU0sTUFBTSxPQUFPMkMsRUFBRSxNQUFNLFNBQVNtQixFQUFFLENBQUMsTUFBTVYsRUFBRSxLQUFLLElBQUlWLEVBQUUsT0FBTyxXQUEyQnZCLEdBQUUsVUFBV0MsRUFBRSxLQUFLLEVBQUV3QixFQUFFcUIsR0FBR2pELEVBQUUsQ0FBQyxrQkFBa0JLLEVBQUUsa0JBQWtCRixFQUFFLGVBQWVELEVBQUUsdUJBQXVCRSxDQUFDLENBQUMsRUFBRXBCLEVBQUUsUUFBUSxNQUFNLE1BQU0sR0FBR29ELENBQUMsS0FBS3BELEVBQUUsUUFBUSxNQUFNLElBQUksR0FBRzRDLENBQUMsS0FBSzVDLEVBQUUsUUFBUSxNQUFNLE9BQU8sT0FBT0EsRUFBRSxRQUFRLE1BQU0sS0FBSyxPQUFPMkMsRUFBRSxPQUFPLFNBQVNiLEVBQUUsQ0FBQyxNQUFNc0IsRUFBRSxLQUFLLElBQUl2QixFQUFFLE9BQU8sWUFBWVYsRUFBRSxXQUFXQyxFQUFFLEtBQUssRUFBRSxJQUFJd0IsRUFBRXNCLEdBQUdsRCxFQUFFLENBQUMsa0JBQWtCSyxFQUFFLGtCQUFrQkYsRUFBRSxlQUFlRCxFQUFFLHVCQUF1QkUsQ0FBQyxDQUFDLEVBQUVwQixFQUFFLFFBQVEsTUFBTSxJQUFJLEdBQUdvRCxDQUFDLEtBQUtwRCxFQUFFLFFBQVEsTUFBTSxLQUFLLEdBQUc0QyxDQUFDLEtBQUs1QyxFQUFFLFFBQVEsTUFBTSxPQUFPLE9BQU9BLEVBQUUsUUFBUSxNQUFNLE1BQU0sT0FBTzJDLEVBQUUsS0FBSyxTQUFTTCxFQUFFLENBQUMsTUFBTWMsRUFBRSxLQUFLLElBQUlmLEVBQUUsT0FBTyxZQUE0QmxCLEdBQUUsV0FBWUMsRUFBRSxLQUFLLEVBQUUsSUFBSXdCLEVBQUVzQixHQUFHbEQsRUFBRSxDQUFDLGtCQUFrQkssRUFBRSxrQkFBa0JGLEVBQUUsZUFBZUQsRUFBRSx1QkFBdUJFLENBQUMsQ0FBQyxFQUFFcEIsRUFBRSxRQUFRLE1BQU0sS0FBSyxHQUFHNEMsQ0FBQyxLQUFLNUMsRUFBRSxRQUFRLE1BQU0sT0FBTyxHQUFHb0QsQ0FBQyxLQUFLcEQsRUFBRSxRQUFRLE1BQU0sSUFBSSxPQUFPQSxFQUFFLFFBQVEsTUFBTSxNQUFNLE9BQU8yQyxFQUFFLFFBQVEsQ0FBQ29CLEVBQUUvRCxFQUFFLE1BQU0sVUFBVSxJQUFJLDJCQUEyQixFQUFFbUUsR0FBR25ELEVBQUUyQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVN3QixHQUFHLEVBQUVwRSxFQUFFQyxFQUFFLENBQUMsTUFBTUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUNBLEVBQUUsT0FBTyxNQUFNRSxFQUFFSCxFQUFFLHNCQUFzQixFQUFFZ0IsRUFBRWdELEdBQUUsRUFBRS9DLEVBQUVoQixFQUFFLE1BQU1pQixFQUFFRixFQUFFLE1BQU1HLEVBQUUsT0FBTyxXQUFXQyxFQUFFakIsRUFBRSxNQUFNa0IsRUFBRWxCLEVBQUUsS0FBSzBCLEVBQUViLEVBQUUsT0FBT2MsRUFBRSxPQUFPLFlBQVlPLEVBQUVsQyxFQUFFLElBQUltQyxFQUFFbkMsRUFBRSxPQUFPYyxFQUFFLFVBQVUsdUJBQXVCLElBQUlzQixFQUFFeEMsRUFBRXlDLEVBQUUsRUFBRXpDLElBQUksT0FBT3NCLEVBQUVELEdBQUcsR0FBR21CLEVBQUUsUUFBUUMsRUFBRSxPQUFPbkIsRUFBRUQsRUFBRUYsR0FBRyxJQUFJcUIsRUFBRSxNQUFNQyxFQUFFLFNBQVNuQixHQUFHRixHQUFHb0IsRUFBRSxPQUFPQyxFQUFFLE9BQU9uQixFQUFFSCxHQUFHQyxJQUFJb0IsRUFBRSxNQUFNQyxFQUFFLFFBQVF6QyxJQUFJLFVBQVVzQixFQUFFRCxHQUFHLEdBQUdtQixFQUFFLFFBQVFDLEVBQUUsU0FBU25CLEVBQUVELEVBQUVGLEdBQUcsSUFBSXFCLEVBQUUsU0FBU0MsRUFBRSxTQUFTbkIsR0FBR0YsR0FBR29CLEVBQUUsT0FBT0MsRUFBRSxTQUFTbkIsRUFBRUgsR0FBR0MsSUFBSW9CLEVBQUUsU0FBU0MsRUFBRSxRQUFRekMsSUFBSSxRQUFRc0MsRUFBRUMsR0FBRyxHQUFHQyxFQUFFLFNBQVNDLEVBQUUsT0FBT0gsRUFBRUMsRUFBRVQsR0FBRyxJQUFJVSxFQUFFLE9BQU9DLEVBQUUsU0FBU0gsR0FBR1AsR0FBR1MsRUFBRSxNQUFNQyxFQUFFLE9BQU9ILEVBQUVSLEdBQUdDLElBQUlTLEVBQUUsT0FBT0MsRUFBRSxRQUFRekMsSUFBSSxVQUFVc0MsRUFBRUMsR0FBRyxHQUFHQyxFQUFFLFNBQVNDLEVBQUUsU0FBU0gsRUFBRUMsRUFBRVQsR0FBRyxJQUFJVSxFQUFFLFFBQVFDLEVBQUUsU0FBU0gsR0FBR1AsR0FBR1MsRUFBRSxNQUFNQyxFQUFFLFNBQVNILEVBQUVSLEdBQUdDLElBQUlTLEVBQUUsUUFBUUMsRUFBRSxRQUFRRCxHQUFHdEIsRUFBRSxVQUFVLElBQUksNkJBQTZCc0IsQ0FBQyxFQUFFLEVBQUV0QixFQUFFLFVBQVUsSUFBSSw4QkFBOEJ1QixDQUFDLEVBQUUsR0FBR3ZCLEVBQUUsVUFBVSxJQUFJLDJCQUEyQixDQUFDLENBQUMsU0FBU29DLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxjQUFjLEtBQUssRUFBRSxFQUFFLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxNQUFNdEQsRUFBRSxTQUFTLGNBQWMsS0FBSyxFQUFFQSxFQUFFLFVBQVUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNQyxFQUFFLFNBQVMsY0FBYyxRQUFRLEVBQUVBLEVBQUUsR0FBRyx1QkFBdUJBLEVBQUUsVUFBVSxJQUFJLHNCQUFzQixFQUFFQSxFQUFFLE1BQU0sUUFBUSxPQUFPQSxFQUFFLFVBQVUsZ0JBQWdCLE1BQU1DLEVBQUUsU0FBUyxjQUFjLEtBQUssRUFBRUEsRUFBRSxHQUFHLDZCQUE2QkEsRUFBRSxVQUFVLElBQUksNEJBQTRCLEVBQUVBLEVBQUUsTUFBTSxRQUFRLE9BQU9BLEVBQUUsVUFBVSw4QkFBOEIsTUFBTUUsRUFBRSxTQUFTLGNBQWMsUUFBUSxFQUFFQSxFQUFFLEtBQUssU0FBU0EsRUFBRSxVQUFVLElBQUksMEJBQTBCLEVBQUVBLEVBQUUsYUFBYSxhQUFhLE9BQU8sRUFBRUEsRUFBRSxVQUFVLFVBQVUsTUFBTWEsRUFBRSxTQUFTLGNBQWMsUUFBUSxFQUFFQSxFQUFFLFVBQVUsSUFBSSx1QkFBdUIsRUFBRSxNQUFNQyxFQUFFLFNBQVMsY0FBYyxNQUFNLEVBQUVBLEVBQUUsVUFBVSxJQUFJLDhCQUE4QixFQUFFQSxFQUFFLFVBQVUsR0FBRyxNQUFNQyxFQUFFLFNBQVMsY0FBYyxNQUFNLEVBQUVBLEVBQUUsVUFBVSxJQUFJLGdDQUFnQyxFQUFFLE1BQU1DLEVBQUUsU0FBUyxjQUFjLFFBQVEsRUFBRUEsRUFBRSxLQUFLLFNBQVNBLEVBQUUsVUFBVSxJQUFJLHlCQUF5QixFQUFFQSxFQUFFLFVBQVUsa0JBQWtCLE1BQU1DLEVBQUUsU0FBUyxjQUFjLFFBQVEsRUFBRSxPQUFPQSxFQUFFLEtBQUssU0FBU0EsRUFBRSxVQUFVLElBQUkseUJBQXlCLEVBQUVBLEVBQUUsVUFBVSxjQUFjRixFQUFFLFlBQVlDLENBQUMsRUFBRUQsRUFBRSxZQUFZRSxDQUFDLEVBQUVKLEVBQUUsWUFBWUMsQ0FBQyxFQUFFRCxFQUFFLFlBQVlFLENBQUMsRUFBRSxFQUFFLFlBQVlmLENBQUMsRUFBRSxFQUFFLFlBQVlKLENBQUMsRUFBRSxFQUFFLFlBQVlDLENBQUMsRUFBRSxFQUFFLFlBQVlDLENBQUMsRUFBRSxFQUFFLFlBQVllLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNakIsRUFBRSxNQUFNQyxFQUFFLFlBQVlDLEVBQUUsT0FBT2UsRUFBRSxlQUFlRyxFQUFFLFdBQVdDLEVBQUUsWUFBWWpCLEVBQUUsY0FBY2UsRUFBRSxTQUFTRCxDQUFDLENBQUMsQ0FBQyxTQUFTbUQsSUFBSSxDQUFDLElBQUlyRSxFQUFFLE1BQU1zRSxFQUFFLEVBQUUsU0FBUyxFQUFFQSxLQUFLdEUsRUFBRXNFLEVBQUUsUUFBUSxnQkFBZ0IsTUFBTXRFLEVBQUUsWUFBWXNFLEVBQUUsT0FBTyxFQUFFLENBQUMsTUFBTUMsR0FBRyxHQUFHLFNBQVNDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzFFLEVBQUUsQ0FBQyxFQUFFLFNBQVNFLEdBQUcsQ0FBQyxFQUFFLFlBQVksR0FBR3FCLEVBQUUsQ0FBQyxDQUFDLFNBQVNwQixHQUFHLENBQUMsTUFBTXFCLEVBQUUsRUFBRSxhQUFhLEVBQUVRLEVBQUUsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBT1IsRUFBRyxJQUFZLE9BQU8sTUFBTVMsRUFBRVQsRUFBRSxFQUFFUSxFQUFFQyxDQUFDLEVBQUVYLEVBQUVXLENBQUMsRUFBRVYsRUFBRSxDQUFDLENBQUMsU0FBU25CLEdBQUcsQ0FBQyxNQUFNb0IsRUFBRSxFQUFFLGFBQWEsRUFBRVEsRUFBRSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPUixFQUFHLElBQVksT0FBTyxNQUFNUyxFQUFFVCxFQUFFLEVBQUVRLEVBQUVDLENBQUMsRUFBRVgsRUFBRVcsQ0FBQyxFQUFFVixFQUFFLENBQUMsQ0FBQyxTQUFTakIsRUFBRWtCLEVBQUUsRUFBRSxFQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUdBLENBQUMsRUFBRUYsRUFBRUUsQ0FBQyxFQUFFRCxFQUFFLENBQUMsQ0FBQyxTQUFTSixHQUFHLENBQUMsSUFBSXdCLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sTUFBTVgsRUFBRSxFQUFFLGFBQWEsRUFBRUMsRUFBRSxFQUFFLGNBQWMsRUFBRU8sRUFBRSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsT0FBT1IsRUFBRyxLQUFhLE9BQU9DLEVBQUcsS0FBYSxPQUFPLEVBQUUsYUFBYSxFQUFHLElBQVksT0FBTyxNQUFNUyxJQUFJQyxFQUFFVixFQUFFLFVBQVUsS0FBSyxPQUFPVSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsR0FBR0QsRUFBRSxPQUFPQSxFQUFFRixFQUFFUCxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFN0IsRUFBRSxDQUFDLENBQUMsU0FBU2dCLEdBQUcsQ0FBQyxJQUFJc0IsRUFBRSxHQUFHLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxNQUFNVixFQUFFLEVBQUUsYUFBYSxFQUFFQyxFQUFFLEVBQUUsY0FBYyxFQUFFTyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxPQUFPUixFQUFHLEtBQWEsT0FBT0MsRUFBRyxJQUFZLE9BQU8sTUFBTVEsSUFBSUMsRUFBRVQsRUFBRSxVQUFVLEtBQUssT0FBT1MsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLEdBQUdELEVBQUUsT0FBT0EsRUFBRUQsRUFBRVAsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRTlCLEVBQUUsQ0FBQyxDQUFDLFNBQVNrQixHQUFHLENBQUMsRUFBRSxlQUFlLElBQUlULEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxTQUFTLEtBQUssVUFBVSxJQUFJLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxjQUFjLGVBQWUsRUFBRXlDLEdBQUcsRUFBRXRDLEVBQUUsZUFBZWIsQ0FBQyxFQUFFYSxFQUFFLGNBQWNiLENBQUMsRUFBRWEsRUFBRSxpQkFBaUJJLENBQUMsRUFBRUosRUFBRSxrQkFBa0JLLENBQUMsRUFBRSxDQUFDLFNBQVNFLEVBQUVFLEVBQUUsRUFBRSxDQUFDLElBQUlzQyxFQUFFQyxFQUFFQyxFQUFFTixFQUFFQyxFQUFFQyxFQUFFZSxFQUFHQyxFQUFHLE1BQU01QyxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQ0EsRUFBRSxDQUFDLFFBQVEsTUFBTSwyQkFBMkIsRUFBRVQsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUNTLEVBQUVSLENBQUMsRUFBRSxDQUFDRCxFQUFFLEVBQUUsTUFBTSxDQUFDWCxFQUFFLHNCQUFzQixTQUFTLGFBQWEsRUFBRUEsRUFBRSxjQUFjWSxDQUFDLEVBQUUsTUFBTVMsRUFBRUQsRUFBRVIsQ0FBQyxFQUFFZ0IsRUFBRVIsRUFBRVIsRUFBRSxDQUFDLEVBQUVpQixFQUFFVCxFQUFFUixFQUFFLENBQUMsRUFBRWtCLElBQUlvQixFQUFFN0IsRUFBRSxVQUFVLEtBQUssT0FBTzZCLEVBQUUsY0FBYyxFQUFFLGFBQWEsR0FBRyxPQUFPbkIsRUFBRSxFQUFFLFlBQVksRUFBRUUsRUFBRSxRQUFRa0IsRUFBRTlCLEVBQUUsVUFBVSxLQUFLLE9BQU84QixFQUFFLGNBQWUsS0FBYUMsRUFBRS9CLEVBQUUsVUFBVSxLQUFLLE9BQU8rQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUVFLEtBQUtSLEVBQUV6QixFQUFFLFVBQVUsS0FBSyxPQUFPeUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxHQUFHLDRCQUE0QixRQUFRLGNBQWMsR0FBR2xDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxZQUFZLEdBQUdRLEVBQUUsTUFBTSxFQUFFLEVBQUVjLElBQUlhLEVBQUUxQixFQUFFLFVBQVUsS0FBSyxPQUFPMEIsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFSixFQUFFLENBQUMsT0FBTyxXQUFXLEdBQUdaLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBT2tDLElBQUksRUFBRS9CLEdBQUcsTUFBTUEsRUFBRSxTQUFTQSxFQUFFLFNBQVMrQixFQUFFLENBQUMsRUFBRTlCLElBQUlhLEVBQUUzQixFQUFFLFVBQVUsS0FBSyxPQUFPMkIsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFSCxJQUFJa0IsRUFBRzFDLEVBQUUsVUFBVSxLQUFLLE9BQU8wQyxFQUFHLGNBQWMsRUFBRSxhQUFhLEVBQUVkLEtBQUllLEVBQUczQyxFQUFFLFVBQVUsS0FBSyxPQUFPMkMsRUFBRyxlQUFlLEVBQUUsY0FBYyxFQUFFeEMsR0FBRSxDQUFDLEdBQUdILEVBQUUsUUFBUSxDQUFDLFlBQVlzQixFQUFFLFlBQVlmLEVBQUUsT0FBT0UsRUFBRSxlQUFlLENBQUMsR0FBR0QsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxhQUFhSSxFQUFFLGFBQWFxQixFQUFFLFlBQVluQixJQUFJLElBQUksQ0FBQ1AsRUFBRWxCLEVBQUVFLEVBQUUsQ0FBQyxFQUFFRCxFQUFFLENBQUMsR0FBRyxZQUFZa0MsSUFBSSxJQUFJLENBQUNuQyxFQUFFRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGFBQWFxQyxLQUFJLElBQUksQ0FBQ3RDLEVBQUUsQ0FBQyxHQUFHLEdBQW1CVSxHQUFFLFNBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBU1YsRUFBRUMsRUFBRSxHQUFHLENBQUMsTUFBTVEsRUFBRSxFQUFFLGlCQUFpQixFQUFFQyxFQUFFLEVBQUUsY0FBYyxFQUFFTyxFQUFFLEVBQUUscUJBQXFCLEVBQUVDLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxHQUFHakIsR0FBR2lCLEVBQUUsQ0FBQyxNQUFNSSxFQUFFLENBQUNiLEdBQW1CQSxHQUFFLEtBQU0sdUJBQXVCUyxFQUFFSSxFQUFFLE9BQU9iLEVBQUVDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU1TLEVBQWtCVCxHQUFFLGNBQWUsRUFBRSxjQUFjLEVBQUVVLEVBQUUsRUFBRSxhQUFhLEVBQUUsR0FBRyxTQUFTLEtBQUssVUFBVSxPQUFPLGdCQUFnQixjQUFjLGVBQWUsRUFBRVcsR0FBRyxFQUFFaUIsR0FBRyxFQUFFdEIsR0FBRyxFQUFFZixHQUFHLEVBQUVqQixFQUFHLEVBQUVKLEVBQUUsRUFBRW1CLEdBQUdDLEVBQUUsQ0FBQyxNQUFNWSxFQUFFYixFQUFFLEtBQUssdUJBQXVCVSxHQUFHQSxFQUFFRyxFQUFFLE9BQU9iLEVBQUVDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUVVLEdBQUdBLEVBQUVFLEVBQUUsT0FBT2IsRUFBRUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDTyxHQUFHQSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxlQUFlLEdBQUcsR0FBRyxRQUFRVSxFQUFFLE1BQU0sQ0FBQzFCLEVBQUUsSUFBSSxDQUFDSCxFQUFFLEVBQUVDLEVBQUVFLENBQUMsQ0FBQyxFQUFFLFVBQVV4QixFQUFFLFNBQVN3QixHQUFHLENBQUNYLEVBQUUsRUFBRWIsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU13QixDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZUFBZSxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksSUFBSSxFQUFFLGFBQWEsSUFBSSxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU1BLEVBQUUsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFUSxFQUFFLEVBQUUsYUFBYSxFQUFFLE9BQU9BLElBQUksUUFBUUEsSUFBSVIsRUFBRSxPQUFPLENBQUMsRUFBRSxjQUFjLElBQUksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLElBQUksRUFBRSxlQUFlLEVBQUUsbUJBQW1CLElBQUksRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTckIsRUFBRSxhQUFhQyxFQUFFLE9BQU9FLEVBQUUsWUFBWSxJQUFJLENBQUMsTUFBTWtCLEVBQUUsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFUSxFQUFFLEVBQUUsYUFBYSxFQUFFLE9BQU9BLElBQUksUUFBUVIsRUFBRVEsRUFBRSxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLE1BQU1SLEVBQUUsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFUSxFQUFFLEVBQUUsYUFBYSxFQUFFLE9BQU9BLElBQUksUUFBUVIsRUFBRVEsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVUixHQUFHLENBQUNILEVBQUUsRUFBRWUsR0FBRSxDQUFDLEdBQUdaLEVBQUUsUUFBUUEsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsYUFBYSxHQUFHLGFBQWEsR0FBRyxHQUFHQSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsSUFBSSxDQUFDRCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPekIsRUFBRSxPQUFPNEUsR0FBRyxPQUFPLGVBQWU1RSxFQUFFLE9BQU8sWUFBWSxDQUFDLE1BQU0sUUFBUSxDQUFDLEVBQUVBLENBQUMsR0FBRSxDQUFDLENBQUMsR0FtQnB0Z0IsU0FBU2dGLEVBQVEsQ0FDaEIsYUFFQSxNQUFNQyxFQUFlLElBQUksYUFFbkJDLEVBQVEsSUFBSUMsSUFBUyxDQUNyQkgsRUFBTyxpQkFBbUIsUUFBUSxJQUFJLEdBQUdHLENBQUksQ0FDbkQsRUFTQSxNQUFNQyxDQUFnQixDQUNwQixZQUFZQyxFQUFhLHVCQUF3QixDQUMvQyxLQUFLLFdBQWFBLEVBQ2xCLEtBQUssZUFBaUIsTUFDdEIsS0FBSywyQkFBNkIsT0FBTyxLQUFTLEtBQWUsS0FBSyxzQkFBd0IsR0FHOUYsS0FBSyxtQkFBbUIsRUFHeEIsS0FBSyxpQkFBaUIsQ0FDeEIsQ0FNQSxvQkFBcUIsQ0FDbkIsTUFBTUMsRUFBVyxLQUFLLFlBQVksRUFDbEMsR0FBSSxDQUFDQSxHQUFZQSxFQUFTLFVBQVksS0FBSyxlQUFnQixDQUN6RCxNQUFNQyxFQUFlLENBQ25CLFFBQVMsS0FBSyxlQUNkLGNBQWUsR0FDZixrQkFBbUIsQ0FBQyxFQUNwQixZQUFhLEVBQ2Isb0JBQXFCLEtBQ3JCLGlCQUFrQixHQUNsQixVQUFXLElBQUksS0FBSyxFQUFFLFlBQVksQ0FDcEMsRUFDQSxLQUFLLFlBQVlBLENBQVksQ0FDL0IsQ0FDRixDQU9BLGFBQWMsQ0FDWixHQUFJLENBQ0YsTUFBTUMsRUFBTyxhQUFhLFFBQVEsS0FBSyxVQUFVLEVBQ2pELE9BQU9BLEVBQU8sS0FBSyxNQUFNQSxDQUFJLEVBQUksSUFDbkMsT0FBU0MsRUFBTyxDQUNkLE9BQUFSLEVBQWEsU0FBUyxpQ0FBa0NRLEVBQU8sQ0FBRSxTQUFVLGFBQWMsQ0FBQyxFQUNuRixJQUNULENBQ0YsQ0FPQSxZQUFZQyxFQUFPLENBQ2pCLEdBQUksQ0FDRixhQUFhLFFBQVEsS0FBSyxXQUFZLEtBQUssVUFBVUEsQ0FBSyxDQUFDLENBQzdELE9BQVNELEVBQU8sQ0FDZFIsRUFBYSxTQUFTLGtDQUFtQ1EsRUFBTyxDQUFFLFNBQVUsYUFBYyxDQUFDLEVBRzNGLEtBQUssb0JBQW9CQSxDQUFLLENBQ2hDLENBQ0YsQ0FPQSxvQkFBb0JBLEVBQU8sQ0FFekIsR0FBSSxDQUNGLGVBQWUsUUFBUSxLQUFLLFdBQVksS0FBSyxVQUFVLEtBQUssWUFBWSxDQUFDLENBQUMsRUFDMUUsUUFBUSxLQUFLLG1EQUFtRCxDQUNsRSxPQUFTRSxFQUFjLENBQ3JCVixFQUFhLFNBQVMsZ0RBQWlEVSxFQUFjLENBQUUsU0FBVSxxQkFBc0IsQ0FBQyxDQUUxSCxDQUNGLENBTUEsa0JBQW1CLENBQ2pCLE1BQU1ELEVBQVEsS0FBSyxZQUFZLEVBQzNCQSxJQUNGQSxFQUFNLFVBQVksSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUN6QyxLQUFLLFlBQVlBLENBQUssRUFFMUIsQ0FPQSxtQkFBbUJFLEVBQVcsQ0FDNUIsTUFBTUYsRUFBUSxLQUFLLFlBQVksRUFDL0IsT0FBS0EsRUFDRUEsRUFBTSxrQkFBa0IsU0FBU0UsQ0FBUyxFQUQ5QixFQUVyQixDQU1BLHFCQUFxQkEsRUFBVyxDQUM5QixNQUFNRixFQUFRLEtBQUssWUFBWSxFQUMxQkEsSUFHQUEsRUFBTSxrQkFBa0IsU0FBU0UsQ0FBUyxJQUM3Q0YsRUFBTSxrQkFBa0IsS0FBS0UsQ0FBUyxFQUdqQ0YsRUFBTSxvQkFDVEEsRUFBTSxrQkFBb0IsQ0FBQyxHQUU3QkEsRUFBTSxrQkFBa0JFLENBQVMsRUFBSSxJQUFJLEtBQUssRUFBRSxZQUFZLEVBRTVELEtBQUssWUFBWUYsQ0FBSyxHQUUxQixDQU1BLGlCQUFrQixDQUNoQixNQUFNQSxFQUFRLEtBQUssWUFBWSxFQUMvQixPQUFLQSxFQUNFQSxFQUFNLGdCQUFrQixHQURaLEVBRXJCLENBTUEsOEJBQStCLENBQzdCLE9BQU8sS0FBSyw2QkFBK0IsRUFDN0MsQ0FPQSxNQUFNLGdDQUFpQyxDQUNyQyxHQUFJLE1BQUssMkJBRVQsTUFBSywyQkFBNkIsR0FDOUIsT0FBTyxLQUFTLE1BQWEsS0FBSyxvQkFBc0IsSUFFNUQsR0FBSSxDQUNGLE1BQU0sWUFBWSxpQkFBa0IsQ0FDbEMsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxvQkFBcUIsRUFBSyxDQUFDLENBQ3BELENBQUMsQ0FDSCxPQUFTRCxFQUFPLENBQ2RSLEVBQWEsU0FBUywrQ0FBZ0RRLEVBQU8sQ0FBRSxTQUFVLGdDQUFpQyxDQUFDLENBQzdILEVBQ0YsQ0FLQSxtQkFBb0IsQ0FDbEIsTUFBTUMsRUFBUSxLQUFLLFlBQVksRUFDMUJBLElBRUxBLEVBQU0sY0FBZ0IsR0FDdEJBLEVBQU0sb0JBQXNCLElBQUksS0FBSyxFQUFFLFlBQVksRUFDbkQsS0FBSyxZQUFZQSxDQUFLLEVBQ3hCLENBTUEsZ0JBQWlCLENBQ2YsTUFBTUEsRUFBUSxLQUFLLFlBQVksRUFDL0IsT0FBS0EsR0FDRUEsRUFBTSxhQUFlLENBQzlCLENBTUEsZUFBZUcsRUFBVyxDQUN4QixNQUFNSCxFQUFRLEtBQUssWUFBWSxFQUMxQkEsSUFFTEEsRUFBTSxZQUFjRyxFQUNwQixLQUFLLFlBQVlILENBQUssRUFDeEIsQ0FLQSxlQUFnQixDQUNkLE1BQU1ILEVBQWUsQ0FDbkIsUUFBUyxLQUFLLGVBQ2QsY0FBZSxHQUNmLGtCQUFtQixDQUFDLEVBQ3BCLFlBQWEsRUFDYixvQkFBcUIsS0FDckIsaUJBQWtCLEdBQ2xCLFVBQVcsSUFBSSxLQUFLLEVBQUUsWUFBWSxDQUNwQyxFQUNBLEtBQUssWUFBWUEsQ0FBWSxDQUMvQixDQU1BLHdCQUF5QixDQUN2QixNQUFNRyxFQUFRLEtBQUssWUFBWSxFQUMvQixNQUFJLENBQUNBLEdBQVMsQ0FBQ0EsRUFBTSxvQkFBNEIsS0FDMUMsSUFBSSxLQUFLQSxFQUFNLG1CQUFtQixDQUMzQyxDQU1BLG9CQUFxQixDQUNuQixNQUFNQSxFQUFRLEtBQUssWUFBWSxFQUMvQixPQUFLQSxFQUNFQSxFQUFNLG1CQUFxQixHQURmLEVBRXJCLENBS0Esc0JBQXVCLENBQ3JCLE1BQU1BLEVBQVEsS0FBSyxZQUFZLEVBQzFCQSxJQUVMQSxFQUFNLGlCQUFtQixHQUN6QixLQUFLLFlBQVlBLENBQUssRUFDeEIsQ0FPQSxvQkFBb0JFLEVBQVcsQ0FDN0IsTUFBTUYsRUFBUSxLQUFLLFlBQVksRUFDL0IsTUFBSSxDQUFDQSxHQUFTLENBQUNBLEVBQU0sbUJBQXFCLENBQUNBLEVBQU0sa0JBQWtCRSxDQUFTLEVBQ25FLEtBRUYsSUFBSSxLQUFLRixFQUFNLGtCQUFrQkUsQ0FBUyxDQUFDLENBQ3BELENBTUEsc0JBQXVCLENBQ3JCLE1BQU1GLEVBQVEsS0FBSyxZQUFZLEVBQy9CLE9BQUtBLEVBQ0VBLEVBQU0sbUJBQXFCLENBQUMsRUFEaEIsQ0FBQyxDQUV0QixDQU1BLGNBQWUsQ0FDYixNQUFNQSxFQUFRLEtBQUssWUFBWSxFQUMvQixNQUFJLENBQUNBLEdBQVMsQ0FBQ0EsRUFBTSxVQUFrQixLQUNoQyxJQUFJLEtBQUtBLEVBQU0sU0FBUyxDQUNqQyxDQUNGLENBR0FWLEVBQU8sZ0JBQWtCSSxFQUV6QkYsRUFBTSxpQ0FBaUMsQ0FFekMsR0FBRyxNQUFNLEdBUVIsU0FBU0YsRUFBUSxDQUNoQixhQUVBLE1BQU1DLEVBQWUsSUFBSSxhQUVuQkMsRUFBUSxJQUFJQyxJQUFTLENBQ3JCSCxFQUFPLGlCQUFtQixRQUFRLElBQUksR0FBR0csQ0FBSSxDQUNuRCxFQU1NVyxFQUFnQixDQUNwQixLQUFNLENBQ0osZ0JBQWlCLG1CQUNqQixVQUFXLFlBQ1gsYUFBYyxnQkFDZCxhQUFjLHFCQUNkLFlBQWEsZ0JBQ2IsZUFBZ0IsZ0JBQ2hCLFdBQVksaUhBQ2QsRUFDQSxNQUFPLENBQ0wsZ0JBQWlCLG1CQUNqQixVQUFXLFlBQ1gsYUFBYyx1QkFDZCxhQUFjLHFCQUNkLFlBQWEsZ0JBQ2IsZUFBZ0IsdUJBQ2hCLFdBQVksaUhBQ2QsRUFDQSxLQUFNLENBQ0osZ0JBQWlCLG1CQUNqQixVQUFXLFlBQ1gsYUFBYyxnQkFDZCxhQUFjLHdCQUNkLFlBQWEsZ0JBQ2IsZUFBZ0IsZ0JBQ2hCLFdBQVksaUhBQ2QsRUFDQSxLQUFNLENBQ0osZ0JBQWlCLG1CQUNqQixVQUFXLFlBQ1gsYUFBYyxnQkFDZCxhQUFjLHdCQUNkLFlBQWEsZ0JBQ2IsZUFBZ0IsZ0JBQ2hCLFdBQVksaUhBQ2QsRUFDQSxRQUFTLENBQ1AsZ0JBQWlCLG1CQUNqQixVQUFXLFlBQ1gsYUFBYyxnQkFDZCxhQUFjLHdCQUNkLFlBQWEsZ0JBQ2IsZUFBZ0IsZ0JBQ2hCLFdBQVksaUhBQ2QsRUFDQSxpQkFBa0IsQ0FDaEIsZ0JBQWlCLG1CQUNqQixVQUFXLFlBQ1gsYUFBYyxnQkFDZCxhQUFjLHVCQUNkLFlBQWEsZ0JBQ2IsZUFBZ0IsZ0JBQ2hCLFdBQVksaUhBQ2QsRUFDQSxrQkFBbUIsQ0FDakIsZ0JBQWlCLG1CQUNqQixVQUFXLFlBQ1gsYUFBYyxnQkFDZCxhQUFjLDJCQUNkLFlBQWEsZ0JBQ2IsZUFBZ0IsZ0JBQ2hCLFdBQVksaUhBQ2QsQ0FDRixFQU1BLE1BQU1DLENBQWEsQ0FDakIsYUFBYyxDQUNaLEtBQUssYUFBZSxLQUFLLGdCQUFnQixFQUN6QyxLQUFLLHFCQUF1QixDQUFDLEVBQzdCLEtBQUssMEJBQTBCLENBQ2pDLENBTUEsaUJBQWtCLENBQ2hCLE1BQU1DLEVBQU8sU0FBUyxnQkFDaEJDLEVBQVksTUFBTSxLQUFLRCxFQUFLLFNBQVMsRUFNM0MsT0FIbUJoQixFQUFPLFFBQVUsQ0FBQyxHQUFHLE9BQU8zRSxHQUFLQSxJQUFNLE1BQU0sRUFDbkMsS0FBSzZGLEdBQVNELEVBQVUsU0FBU0MsQ0FBSyxDQUFDLEdBRS9DLE1BQ3ZCLENBTUEsZ0JBQWlCLENBQ2YsTUFBTUMsRUFBWSxLQUFLLGdCQUFnQixFQUNqQ0MsRUFBU04sRUFBY0ssQ0FBUyxHQUFLTCxFQUFjLEtBR25ETyxFQUFpQixDQUFDLEVBQ3hCLFNBQVcsQ0FBQ0MsRUFBS0MsQ0FBSyxJQUFLLE9BQU8sUUFBUUgsQ0FBTSxFQUM5QyxHQUFJLE9BQU9HLEdBQVUsVUFBWUEsRUFBTSxXQUFXLE1BQU0sRUFBRyxDQUV6RCxNQUFNQyxFQUFVRCxFQUFNLE1BQU0sa0JBQWtCLElBQUksQ0FBQyxFQUNuRCxHQUFJQyxFQUFTLENBQ1gsTUFBTUMsRUFBZ0IsaUJBQWlCLFNBQVMsZUFBZSxFQUM1RCxpQkFBaUJELENBQU8sRUFDeEIsS0FBSyxFQUNSSCxFQUFlQyxDQUFHLEVBQUlHLEdBQWlCRixDQUN6QyxNQUNFRixFQUFlQyxDQUFHLEVBQUlDLENBRTFCLE1BQ0VGLEVBQWVDLENBQUcsRUFBSUMsRUFJMUIsT0FBT0YsQ0FDVCxDQU1BLGNBQWNLLEVBQVUsQ0FDbEIsT0FBT0EsR0FBYSxZQUN0QixLQUFLLHFCQUFxQixLQUFLQSxDQUFRLENBRTNDLENBTUEsMkJBQTRCLENBQzFCLE1BQU1WLEVBQU8sU0FBUyxnQkFHTCxJQUFJLGlCQUFrQlcsR0FBYyxDQUNuREEsRUFBVSxRQUFTQyxHQUFhLENBQzlCLEdBQUlBLEVBQVMsT0FBUyxjQUFnQkEsRUFBUyxnQkFBa0IsUUFBUyxDQUN4RSxNQUFNQyxFQUFXLEtBQUssZ0JBQWdCLEVBQ3RDLEdBQUlBLElBQWEsS0FBSyxhQUFjLENBQ2xDLE1BQU1DLEVBQVcsS0FBSyxhQUN0QixLQUFLLGFBQWVELEVBQ3BCLEtBQUssbUJBQW1CQSxFQUFVQyxDQUFRLENBQzVDLENBQ0YsQ0FDRixDQUFDLENBQ0gsQ0FBQyxFQUdRLFFBQVFkLEVBQU0sQ0FDckIsV0FBWSxHQUNaLGdCQUFpQixDQUFDLE9BQU8sQ0FDM0IsQ0FBQyxFQUVEZCxFQUFNLGtEQUFrRCxDQUMxRCxDQVFBLG1CQUFtQjJCLEVBQVVDLEVBQVUsQ0FDckM1QixFQUFNLGlDQUFpQzRCLENBQVEsV0FBTUQsQ0FBUSxFQUFFLEVBRS9ELEtBQUsscUJBQXFCLFFBQVFILEdBQVksQ0FDNUMsR0FBSSxDQUNGQSxFQUFTRyxFQUFVQyxDQUFRLENBQzdCLE9BQVNyQixFQUFPLENBQ2RSLEVBQWEsU0FBUyx1Q0FBd0NRLEVBQU8sQ0FBRSxTQUFVLG9CQUFxQixDQUFDLENBQ3pHLENBQ0YsQ0FBQyxDQUNILENBTUEsV0FBV3NCLEVBQVEsQ0FDakIsR0FBSSxDQUFDQSxFQUFRLENBQ1gsUUFBUSxLQUFLLDRDQUE0QyxFQUN6RCxNQUNGLENBRUEsTUFBTUMsRUFBYyxLQUFLLGVBQWUsRUFJeEMsS0FBSyxvQkFBb0JBLENBQVcsRUFFcEM5QixFQUFNLDBDQUEyQyxLQUFLLFlBQVksQ0FDcEUsQ0FPQSxvQkFBb0I4QixFQUFhLENBRS9CLE1BQU1DLEVBQWdCLFNBQVMsZUFBZSxxQkFBcUIsRUFDL0RBLEdBQ0ZBLEVBQWMsT0FBTyxFQUl2QixNQUFNQyxFQUFRLFNBQVMsY0FBYyxPQUFPLEVBQzVDQSxFQUFNLEdBQUssc0JBQ1hBLEVBQU0sWUFBYztBQUFBO0FBQUEsd0JBRUZGLEVBQVksZUFBZTtBQUFBLG1CQUNoQ0EsRUFBWSxTQUFTO0FBQUEsOEJBQ1ZBLEVBQVksV0FBVztBQUFBO0FBQUE7QUFBQSx5QkFHNUJBLEVBQVksVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUk1QkEsRUFBWSxTQUFTO0FBQUE7QUFBQSx5QkFFZkEsRUFBWSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBSTVCQSxFQUFZLFNBQVM7QUFBQSx5QkFDZkEsRUFBWSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0JBSXZCQSxFQUFZLFlBQVk7QUFBQSxtQkFDN0JBLEVBQVksZUFBZTtBQUFBO0FBQUEseUJBRXJCQSxFQUFZLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBUzVCQSxFQUFZLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSx3QkFJaEJBLEVBQVksWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLCtCQUlqQkEsRUFBWSxjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFLdENBLEVBQVksU0FBUztBQUFBO0FBQUEseUJBRWZBLEVBQVksVUFBVTtBQUFBO0FBQUEsUUFJekMsU0FBUyxLQUFLLFlBQVlFLENBQUssQ0FDakMsQ0FNQSxvQkFBcUIsQ0FDbkIsT0FBTyxPQUFPLEtBQUtwQixDQUFhLENBQ2xDLENBT0EsaUJBQWlCSyxFQUFXLENBQzFCLE9BQU9MLEVBQWMsZUFBZUssQ0FBUyxDQUMvQyxDQUNGLENBR0FuQixFQUFPLGFBQWVlLEVBRXRCYixFQUFNLDhCQUE4QixDQUV0QyxHQUFHLE1BQU0sR0FPUixTQUFTRixFQUFRLENBQ2hCLGFBRUEsTUFBTUMsRUFBZSxJQUFJLGFBRW5CQyxFQUFRLElBQUlDLElBQVMsQ0FDckJILEVBQU8saUJBQW1CLFFBQVEsSUFBSSxHQUFHRyxDQUFJLENBQ25ELEVBT0EsU0FBU2dDLEVBQTBCQyxFQUFTLENBQzFDLE1BQU1DLEVBQVMsQ0FBQyxFQVdoQixJQVJJLENBQUNELEVBQVEsSUFBTSxPQUFPQSxFQUFRLElBQU8sV0FDdkNDLEVBQU8sS0FBSyxxQ0FBcUMsRUFHOUNELEVBQVEsU0FDWEMsRUFBTyxLQUFLLHNEQUFzRCxFQUdoRSxDQUFDRCxFQUFRLFNBQVcsT0FBT0EsRUFBUSxTQUFZLFNBQ2pEQyxFQUFPLEtBQUssb0NBQW9DLE1BQzNDLENBV0wsSUFUSSxDQUFDRCxFQUFRLFFBQVEsT0FBUyxPQUFPQSxFQUFRLFFBQVEsT0FBVSxXQUM3REMsRUFBTyxLQUFLLGdEQUFnRCxHQUcxRCxDQUFDRCxFQUFRLFFBQVEsYUFBZSxPQUFPQSxFQUFRLFFBQVEsYUFBZ0IsV0FDekVDLEVBQU8sS0FBSyxzREFBc0QsRUFJaEVELEVBQVEsUUFBUSxTQUFVLENBQzVCLE1BQU1FLEVBQWlCLENBQUMsTUFBTyxTQUFVLE9BQVEsUUFBUyxRQUFRLEVBQzdEQSxFQUFlLFNBQVNGLEVBQVEsUUFBUSxRQUFRLEdBQ25EQyxFQUFPLEtBQUsscUJBQXFCRCxFQUFRLFFBQVEsUUFBUSxxQkFBcUJFLEVBQWUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUU3RyxDQUdBLEdBQUlGLEVBQVEsUUFBUSxNQUFPLENBQ3pCLE1BQU1HLEVBQWMsQ0FBQyxRQUFTLFNBQVUsS0FBSyxFQUN4Q0EsRUFBWSxTQUFTSCxFQUFRLFFBQVEsS0FBSyxHQUM3Q0MsRUFBTyxLQUFLLGtCQUFrQkQsRUFBUSxRQUFRLEtBQUsscUJBQXFCRyxFQUFZLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FFcEcsQ0FHSUgsRUFBUSxRQUFRLGFBQWUsQ0FBQyxNQUFNLFFBQVFBLEVBQVEsUUFBUSxXQUFXLEdBQzNFQyxFQUFPLEtBQUssOEJBQThCLEVBSTFCLENBQUMsU0FBVSxhQUFjLFVBQVcsYUFBYyxTQUFTLEVBQ25FLFFBQVFYLEdBQVksQ0FDeEJVLEVBQVEsUUFBUVYsQ0FBUSxHQUFLLE9BQU9VLEVBQVEsUUFBUVYsQ0FBUSxHQUFNLFlBQ3BFVyxFQUFPLEtBQUssR0FBR1gsQ0FBUSxxQkFBcUIsQ0FFaEQsQ0FBQyxDQUNILENBR0EsT0FBSVUsRUFBUSxXQUFhLE9BQU9BLEVBQVEsV0FBYyxZQUNwREMsRUFBTyxLQUFLLDhCQUE4QixFQUl4Q0QsRUFBUSxXQUFhLFFBQWEsT0FBT0EsRUFBUSxVQUFhLFVBQ2hFQyxFQUFPLEtBQUssMkJBQTJCLEVBR2xDLENBQ0wsTUFBT0EsRUFBTyxTQUFXLEVBQ3pCLE9BQUFBLENBQ0YsQ0FDRixDQU9BLFNBQVNHLEVBQTJCQyxFQUFVLENBQzVDLEdBQUksQ0FBQyxNQUFNLFFBQVFBLENBQVEsRUFDekIsTUFBTyxDQUNMLE1BQU8sR0FDUCxPQUFRLENBQUMsQ0FBRSxRQUFTLEtBQU0sT0FBUSxDQUFDLDJCQUEyQixDQUFFLENBQUMsQ0FDbkUsRUFHRixNQUFNQyxFQUFZLENBQUMsRUFDYkMsRUFBTSxJQUFJLElBRWhCLE9BQUFGLEVBQVMsUUFBUSxDQUFDTCxFQUFTUSxJQUFVLENBQ25DLE1BQU1DLEVBQWFWLEVBQTBCQyxDQUFPLEVBRS9DUyxFQUFXLE9BQ2RILEVBQVUsS0FBSyxDQUNiLFFBQVNOLEVBQVEsSUFBTSxTQUFTUSxDQUFLLEdBQ3JDLE9BQVFDLEVBQVcsTUFDckIsQ0FBQyxFQUlDVCxFQUFRLEtBQ05PLEVBQUksSUFBSVAsRUFBUSxFQUFFLEdBQ3BCTSxFQUFVLEtBQUssQ0FDYixRQUFTTixFQUFRLEdBQ2pCLE9BQVEsQ0FBQyx5QkFBeUJBLEVBQVEsRUFBRSxFQUFFLENBQ2hELENBQUMsRUFFSE8sRUFBSSxJQUFJUCxFQUFRLEVBQUUsRUFFdEIsQ0FBQyxFQUVNLENBQ0wsTUFBT00sRUFBVSxTQUFXLEVBQzVCLE9BQVFBLENBQ1YsQ0FDRixDQUtBLE1BQU1JLFVBQXFCLEtBQU0sQ0FDL0IsWUFBWUMsRUFBU25DLEVBQVksS0FBTSxDQUNyQyxNQUFNbUMsQ0FBTyxFQUNiLEtBQUssS0FBTyxlQUNaLEtBQUssVUFBWW5DLENBQ25CLENBQ0YsQ0FPQSxTQUFTb0MsRUFBdUJILEVBQVksQ0FDMUMsR0FBSSxDQUFDQSxFQUFXLE1BQU8sQ0FDckIsTUFBTUksRUFBZ0JKLEVBQVcsT0FBTyxJQUFJbkQsR0FDMUMsR0FBR0EsRUFBRSxPQUFPLEtBQUtBLEVBQUUsT0FBTyxLQUFLLElBQUksQ0FBQyxFQUN0QyxFQUFFLEtBQUs7QUFBQSxDQUFJLEVBRVgsTUFBQU8sRUFBYSxTQUFTLGtDQUFtQ2dELEVBQWUsQ0FBRSxTQUFVLGlCQUFrQixDQUFDLEVBQ2pHLElBQUlILEVBQWE7QUFBQSxFQUErQkcsQ0FBYSxFQUFFLENBQ3ZFLENBQ0YsQ0FHQWpELEVBQU8sa0JBQW9CLENBQ3pCLDBCQUFBbUMsRUFDQSwyQkFBQUssRUFDQSx1QkFBQVEsRUFDQSxhQUFBRixDQUNGLEVBRUE1QyxFQUFNLCtDQUErQyxFQVd2RCxNQUFNZ0QsRUFBc0IsQ0FFMUIsQ0FDRSxHQUFJLFVBQ0osUUFBUyxTQUNULFFBQVMsQ0FDUCxNQUFPLHdCQUNQLFlBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUtiLFNBQVUsU0FDVixNQUFPLFFBQ1AsWUFBYSxDQUFDLE1BQU0sRUFDcEIsYUFBYyxFQUNoQixFQUNBLFNBQVUsQ0FDWixFQUdBLENBQ0UsR0FBSSxpQkFDSixRQUFTLE9BQ1QsUUFBUyxDQUNQLE1BQU8sMEJBQ1AsWUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQVViLFNBQVUsU0FDVixZQUFhLENBQUMsV0FBWSxNQUFNLEVBQ2hDLGFBQWMsRUFDaEIsRUFDQSxTQUFVLENBQ1osRUFHQSxDQUNFLEdBQUksZ0JBQ0osUUFBUyxTQUNULFFBQVMsQ0FDUCxNQUFPLGdCQUNQLFlBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFVYixTQUFVLE1BQ1YsWUFBYSxDQUFDLFdBQVksTUFBTSxFQUNoQyxhQUFjLEVBQ2hCLEVBQ0EsU0FBVSxDQUNaLEVBR0EsQ0FDRSxHQUFJLGVBQ0osUUFBUyxtQkFDVCxRQUFTLENBQ1AsTUFBTywyQ0FDUCxZQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBYWIsU0FBVSxNQUNWLFlBQWEsQ0FBQyxXQUFZLE1BQU0sRUFDaEMsYUFBYyxFQUNoQixFQUNBLFNBQVUsRUFDVixVQUFXLElBQU0sU0FBUyxlQUFlLGlCQUFpQixJQUFNLElBQ2xFLEVBR0EsQ0FDRSxHQUFJLFlBQ0osUUFBUyxpQkFDVCxRQUFTLENBQ1AsTUFBTyxvQkFDUCxZQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQVNiLFNBQVUsTUFDVixZQUFhLENBQUMsV0FBWSxNQUFNLEVBQ2hDLGFBQWMsRUFDaEIsRUFDQSxTQUFVLEVBQ1YsVUFBVyxJQUFNLFNBQVMsZUFBZSxlQUFlLElBQU0sSUFDaEUsRUFHQSxDQUNFLEdBQUksYUFDSixRQUFTLGVBQ1QsUUFBUyxDQUNQLE1BQU8sbUJBQ1AsWUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFTYixTQUFVLFNBQ1YsWUFBYSxDQUFDLFdBQVksTUFBTSxFQUNoQyxhQUFjLEVBQ2hCLEVBQ0EsU0FBVSxDQUNaLEVBR0EsQ0FDRSxHQUFJLGlCQUNKLFFBQVMsU0FDVCxRQUFTLENBQ1AsTUFBTyxTQUNQLFlBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUtiLFNBQVUsU0FDVixZQUFhLENBQUMsV0FBWSxNQUFNLEVBQ2hDLGFBQWMsRUFDaEIsRUFDQSxTQUFVLENBQ1osRUFHQSxDQUNFLEdBQUksaUJBQ0osUUFBUyx3Q0FDVCxRQUFTLENBQ1AsTUFBTyxlQUNQLFlBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBU2IsU0FBVSxTQUNWLFlBQWEsQ0FBQyxXQUFZLE1BQU0sRUFDaEMsYUFBYyxFQUNoQixFQUNBLFNBQVUsQ0FDWixFQUdBLENBQ0UsR0FBSSxnQkFDSixRQUFTLHVDQUNULFFBQVMsQ0FDUCxNQUFPLG9CQUNQLFlBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQVFiLFNBQVUsU0FDVixZQUFhLENBQUMsV0FBWSxNQUFNLEVBQ2hDLGFBQWMsRUFDaEIsRUFDQSxTQUFVLENBQ1osRUFHQSxDQUNFLEdBQUksZ0JBQ0osUUFBUyx1Q0FDVCxRQUFTLENBQ1AsTUFBTyw0QkFDUCxZQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBVWIsU0FBVSxTQUNWLFlBQWEsQ0FBQyxXQUFZLE1BQU0sRUFDaEMsYUFBYyxFQUNoQixFQUNBLFNBQVUsRUFDWixFQUdBLENBQ0UsR0FBSSxVQUNKLFFBQVMsa0JBQ1QsUUFBUyxDQUNQLE1BQU8saUJBQ1AsWUFBYTtBQUFBO0FBQUE7QUFBQSxRQUliLFNBQVUsU0FDVixZQUFhLENBQUMsV0FBWSxNQUFNLEVBQ2hDLGFBQWMsRUFDaEIsRUFDQSxTQUFVLEdBQ1YsVUFBVyxJQUFNLFNBQVMsZUFBZSxnQkFBZ0IsSUFBTSxJQUNqRSxFQUdBLENBQ0UsR0FBSSxlQUNKLFFBQVMsb0JBQ1QsUUFBUyxDQUNQLE1BQU8sZUFDUCxZQUFhO0FBQUE7QUFBQTtBQUFBLFFBSWIsU0FBVSxTQUNWLE1BQU8sTUFDUCxZQUFhLENBQUMsV0FBWSxNQUFNLEVBQ2hDLGFBQWMsRUFDaEIsRUFDQSxTQUFVLEdBQ1YsVUFBVyxJQUFNLFNBQVMsZUFBZSxrQkFBa0IsSUFBTSxJQUNuRSxFQUdBLENBQ0UsR0FBSSxnQkFDSixRQUFTLFNBQ1QsUUFBUyxDQUNQLE1BQU8sa0JBQ1AsWUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQW1CYixTQUFVLFNBQ1YsTUFBTyxRQUNQLFlBQWEsQ0FBQyxXQUFZLE9BQU8sRUFDakMsYUFBYyxFQUNoQixFQUNBLFNBQVUsRUFDWixDQUNGLEVBTUEsU0FBU0MsR0FBd0IsQ0FDL0IsT0FBT0QsQ0FDVCxDQU9BLFNBQVNFLEVBQWVDLEVBQUksQ0FDMUIsT0FBT0gsRUFBb0IsS0FBSzdILEdBQUtBLEVBQUUsS0FBT2dJLENBQUUsR0FBSyxJQUN2RCxDQU1BLFNBQVNDLEdBQW9CLENBQzNCLE9BQU9KLEVBQW9CLE9BQU9kLEdBQVcsQ0FDM0MsR0FBSUEsRUFBUSxXQUFhLE9BQU9BLEVBQVEsV0FBYyxXQUNwRCxHQUFJLENBQ0YsT0FBT0EsRUFBUSxVQUFVLENBQzNCLE9BQVMzQixFQUFPLENBQ2QsT0FBQVIsRUFBYSxTQUFTLHNDQUF1Q1EsRUFBTyxDQUFFLFNBQVUsb0JBQXFCLFVBQVcyQixFQUFRLEVBQUcsQ0FBQyxFQUNySCxFQUNULENBRUYsTUFBTyxFQUNULENBQUMsQ0FDSCxDQU1BLFNBQVNtQixHQUFvQixDQUUzQixPQURpQkQsRUFBa0IsRUFDbkIsS0FBSyxDQUFDRSxFQUFHMUgsSUFBTSxDQUM3QixNQUFNMkgsRUFBWUQsRUFBRSxVQUFZLElBQzFCRSxFQUFZNUgsRUFBRSxVQUFZLElBQ2hDLE9BQU8ySCxFQUFZQyxDQUNyQixDQUFDLENBQ0gsQ0FNQSxTQUFTQyxHQUF3QixDQUUvQixPQURpQkwsRUFBa0IsRUFDbkIsT0FBT2xCLEdBQVdBLEVBQVEsZUFBaUIsRUFBSSxFQUM1RCxLQUFLLENBQUNvQixFQUFHMUgsSUFBTSxDQUNkLE1BQU0ySCxFQUFZRCxFQUFFLFVBQVksSUFDMUJFLEVBQVk1SCxFQUFFLFVBQVksSUFDaEMsT0FBTzJILEVBQVlDLENBQ3JCLENBQUMsQ0FDTCxDQUdBMUQsRUFBTyxtQkFBcUIsQ0FDMUIsb0JBQUFrRCxFQUNBLHNCQUFBQyxFQUNBLGVBQUFDLEVBQ0Esa0JBQUFFLEVBQ0Esa0JBQUFDLEVBQ0Esc0JBQUFJLENBQ0YsRUFFQXpELEVBQU0sMkNBQTRDZ0QsRUFBb0IsT0FBUSxVQUFVLENBRXhGLEdBQUcsTUFBTSxHQVFSLFNBQVNsRCxFQUFRLENBQ2hCLGFBRUEsTUFBTUUsRUFBUSxJQUFJQyxJQUFTLENBQ3JCSCxFQUFPLGlCQUFpQixRQUFRLElBQUksR0FBR0csQ0FBSSxDQUNqRCxFQUVBLE1BQU15RCxDQUFvQixDQUN4QixZQUFZQyxFQUFpQixDQUMzQixLQUFLLGdCQUFrQkEsRUFDdkIsS0FBSyxNQUFRLEtBQ2IsS0FBSyxtQkFBcUIsS0FDMUIzRCxFQUFNLHFDQUFxQyxDQUM3QyxDQU1BLGlCQUFrQixDQUdoQixNQUFPLENBQ0wsQ0FDRSxHQUFJLGFBQ0osS0FBTSx3QkFDTixZQUFhLDJEQUNiLEtBQU0sWUFDTixXQUFZLE9BQ1osU0FBVSxDQUNSLGlDQUNBLDJDQUNBLDBCQUNBLHlDQUNGLEVBQ0EsWUFBYSxFQUNmLEVBQ0EsQ0FDRSxHQUFJLFFBQ0osS0FBTSxtQkFDTixZQUFhLHVEQUNiLEtBQU0sWUFDTixXQUFZLFdBQ1osU0FBVSxDQUNSLCtCQUNBLHNCQUNBLDJCQUNBLGdCQUNGLEVBQ0EsWUFBYSxFQUNmLEVBQ0EsQ0FDRSxHQUFJLFNBQ0osS0FBTSxVQUNOLFlBQWEsZ0RBQ2IsS0FBTSxrQkFDTixXQUFZLGVBQ1osU0FBVSxDQUNSLDJCQUNBLCtCQUNBLHVCQUNBLDhCQUNGLEVBQ0EsWUFBYSxFQUNmLEVBQ0EsQ0FDRSxHQUFJLFdBQ0osS0FBTSxXQUNOLFlBQWEsK0NBQ2IsS0FBTSxTQUNOLFdBQVksZUFDWixTQUFVLENBQ1IsdUJBQ0EsNkJBQ0EsNEJBQ0EsZ0JBQ0YsRUFDQSxZQUFhLEVBQ2YsRUFDQSxDQUNFLEdBQUksVUFDSixLQUFNLFVBQ04sWUFBYSxxREFDYixLQUFNLGVBQ04sV0FBWSxlQUNaLFNBQVUsQ0FDUiw0QkFDQSxvQkFDQSx1QkFDQSxvQkFDRixFQUNBLFlBQWEsRUFDZixFQUNBLENBQ0UsR0FBSSxhQUNKLEtBQU0saUJBQ04sWUFBYSw0REFDYixLQUFNLFlBQ04sV0FBWSxPQUNaLFNBQVUsQ0FDUixrQ0FDQSxzQ0FDQSx5QkFDQSxxQkFDRixFQUNBLFlBQWEsR0FDYixXQUFZLFlBQ2QsRUFDQSxDQUNFLEdBQUksV0FDSixLQUFNLHdCQUNOLFlBQWEsb0RBQ2IsS0FBTSxZQUNOLFdBQVksT0FDWixTQUFVLENBQ1IsOEJBQ0EsNkNBQ0EsbUNBQ0EsMkJBQ0YsRUFDQSxZQUFhLEdBQ2IsV0FBWSxRQUNkLENBQ0YsQ0FDRixDQUtBLHNCQUF1QixDQUVoQixLQUFLLE9BQ1IsS0FBSyxZQUFZLEVBSW5CLEtBQUssa0JBQWtCLEVBR3ZCLEtBQUssTUFBTSxNQUFNLFFBQVUsT0FDM0IsU0FBUyxLQUFLLE1BQU0sU0FBVyxRQUNqQyxDQU1BLGFBQWMsQ0FDWixNQUFNNEQsRUFBUSxTQUFTLGNBQWMsS0FBSyxFQUMxQ0EsRUFBTSxHQUFLLHFCQUNYQSxFQUFNLFVBQVkscUJBQ2xCQSxFQUFNLFVBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBZ0JsQixTQUFTLEtBQUssWUFBWUEsQ0FBSyxFQUMvQixLQUFLLE1BQVFBLEVBR2JBLEVBQU0sY0FBYyxxQkFBcUIsRUFBRSxpQkFBaUIsUUFBUyxJQUFNLEtBQUssTUFBTSxDQUFDLEVBQ3ZGQSxFQUFNLGNBQWMsa0JBQWtCLEVBQUUsaUJBQWlCLFFBQVMsSUFBTSxLQUFLLGlCQUFpQixDQUFDLEVBRy9GQSxFQUFNLGlCQUFpQixRQUFVcEUsR0FBTSxDQUNqQ0EsRUFBRSxTQUFXb0UsR0FDZixLQUFLLE1BQU0sQ0FFZixDQUFDLEVBR0QsU0FBUyxpQkFBaUIsVUFBWXBFLEdBQU0sQ0FDdENBLEVBQUUsTUFBUSxVQUFZb0UsRUFBTSxNQUFNLFVBQVksUUFDaEQsS0FBSyxNQUFNLENBRWYsQ0FBQyxDQUNILENBTUEsbUJBQW9CLENBQ2xCLE1BQU1DLEVBQU8sU0FBUyxlQUFlLG1CQUFtQixFQUN4RCxHQUFJLENBQUNBLEVBQU0sT0FFWCxNQUFNQyxFQUFZLEtBQUssZ0JBQWdCLEVBQ3ZDRCxFQUFLLFVBQVksR0FFakJDLEVBQVUsUUFBUUMsR0FBWSxDQUM1QixNQUFNQyxFQUFPLEtBQUssbUJBQW1CRCxDQUFRLEVBQzdDRixFQUFLLFlBQVlHLENBQUksQ0FDdkIsQ0FBQyxDQUNILENBTUEsbUJBQW1CRCxFQUFVLENBQzNCLE1BQU1DLEVBQU8sU0FBUyxjQUFjLEtBQUssRUFDekNBLEVBQUssVUFBWSxvQkFDYkQsRUFBUyxhQUNYQyxFQUFLLFVBQVUsSUFBSSxhQUFhLEVBR2xDLE1BQU1DLEVBQWtCRixFQUFTLFdBQVcsWUFBWSxFQUV4RCxPQUFBQyxFQUFLLFVBQVk7QUFBQSxVQUNiRCxFQUFTLFlBQWMsbURBQXFELEVBQUU7QUFBQSx5Q0FDL0NBLEVBQVMsSUFBSTtBQUFBLGNBQ3hDQSxFQUFTLElBQUk7QUFBQSw4Q0FDbUJBLEVBQVMsV0FBVztBQUFBLHlEQUNURSxDQUFlO0FBQUEsWUFDNURGLEVBQVMsVUFBVTtBQUFBO0FBQUE7QUFBQSxZQUduQkEsRUFBUyxTQUFTLE1BQU0sRUFBRyxDQUFDLEVBQUUsSUFBSTNILEdBQUssT0FBT0EsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFBQTtBQUFBLG9FQUVSMkgsRUFBUyxFQUFFO0FBQUEsbUJBQzVEQSxFQUFTLElBQUk7QUFBQTtBQUFBLFFBS1JDLEVBQUssY0FBYywwQkFBMEIsRUFDckQsaUJBQWlCLFFBQVMsSUFBTSxLQUFLLHdCQUF3QkQsQ0FBUSxDQUFDLEVBRXpFQyxDQUNULENBTUEsd0JBQXdCRCxFQUFVLENBQ2hDL0QsRUFBTSw0Q0FBNEMrRCxFQUFTLEVBQUUsRUFBRSxFQUcvRCxLQUFLLE1BQU0sRUFHUCxLQUFLLG1CQUNQLEtBQUssbUJBQW1CQSxDQUFRLEVBR2hDLEtBQUssZ0JBQWdCQSxFQUFTLEVBQUUsQ0FFcEMsQ0FNQSxrQkFBbUIsQ0FDakIvRCxFQUFNLDBDQUEwQyxFQUc1QyxLQUFLLGlCQUNQLEtBQUssZ0JBQWdCLHFCQUFxQixFQUk1QyxLQUFLLE1BQU0sRUFHWCxLQUFLLGlCQUFpQixvRUFBb0UsQ0FDNUYsQ0FNQSxnQkFBZ0JrRSxFQUFZLENBRTFCLE1BQU1DLEVBQWlCLFNBQVMsY0FBYyw4QkFBOEIsRUFDeEVBLEdBQ0ZBLEVBQWUsTUFBTSxFQUdyQixXQUFXLElBQU0sQ0FDZixNQUFNQyxFQUFjLFNBQVMsY0FBYyxhQUFhLEVBQ3BEQSxJQUNGQSxFQUFZLE1BQVFGLEVBQ3BCRSxFQUFZLGNBQWMsSUFBSSxNQUFNLFFBQVMsQ0FBRSxRQUFTLEVBQUssQ0FBQyxDQUFDLEVBRW5FLEVBQUcsR0FBRyxHQUdOLEtBQUssaUJBQWlCLGFBQWFGLENBQVUsMENBQTBDQSxDQUFVLEdBQUcsQ0FFeEcsQ0FNQSxpQkFBaUJyQixFQUFTLENBRXhCLE1BQU13QixFQUFlLFNBQVMsY0FBYyxLQUFLLEVBQ2pEQSxFQUFhLFVBQVksNEJBQ3pCQSxFQUFhLFlBQWN4QixFQUMzQndCLEVBQWEsTUFBTSxRQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQWE3QixTQUFTLEtBQUssWUFBWUEsQ0FBWSxFQUV0QyxXQUFXLElBQU0sQ0FDZkEsRUFBYSxNQUFNLFFBQVUsSUFDN0JBLEVBQWEsTUFBTSxXQUFhLGVBQ2hDLFdBQVcsSUFBTUEsRUFBYSxPQUFPLEVBQUcsR0FBRyxDQUM3QyxFQUFHLEdBQUksQ0FDVCxDQUtBLE9BQVEsQ0FDRixLQUFLLFFBQ1AsS0FBSyxNQUFNLE1BQU0sUUFBVSxPQUMzQixTQUFTLEtBQUssTUFBTSxTQUFXLEdBRW5DLENBQ0YsQ0FFQXZFLEVBQU8sb0JBQXNCNEQsRUFDN0IxRCxFQUFNLHFDQUFxQyxDQUU3QyxHQUFHLE1BQU0sR0FPUixTQUFTRixFQUFRLENBQ2hCLGFBRUEsTUFBTUMsRUFBZSxJQUFJLGFBRW5CQyxFQUFRLElBQUlDLElBQVMsQ0FDckJILEVBQU8saUJBQW1CLFFBQVEsSUFBSSxHQUFHRyxDQUFJLENBQ25ELEVBRUEsTUFBTXFFLENBQVksQ0FDaEIsWUFBWVgsRUFBaUJZLEVBQWNDLEVBQXFCLENBQzlELEtBQUssZ0JBQWtCYixFQUN2QixLQUFLLGFBQWVZLEVBQ3BCLEtBQUssb0JBQXNCQyxFQUMzQixLQUFLLE9BQVMsS0FDZCxLQUFLLGlCQUFtQixFQUN4QixLQUFLLFNBQVcsR0FDaEIsS0FBSyxjQUFnQixLQUNyQixLQUFLLG9CQUFzQixJQUM3QixDQUtBLE1BQU0sa0JBQW1CLENBRXZCLE1BQU1DLEVBQWdCM0UsRUFBTyxRQUFRLElBQUksUUFBVUEsRUFBTyxRQUFRLFFBQVVBLEVBQU8sT0FFbkYsR0FBSSxPQUFPMkUsR0FBa0IsV0FDM0IsT0FBQTFFLEVBQWEsU0FBUyxxQ0FBc0MsSUFBSSxNQUFNLGlDQUFpQyxFQUFHLENBQUUsYUFBYyxPQUFPRCxFQUFPLE1BQU8sQ0FBQyxFQUN6SSxHQUdULE1BQU1nQyxFQUFjLEtBQUssYUFBYSxlQUFlLEVBRXJELFlBQUssT0FBUzJDLEVBQWMsQ0FDMUIsYUFBYyxHQUNkLFlBQWEsQ0FBQyxPQUFRLFdBQVksT0FBTyxFQUN6QyxXQUFZLEdBQ1osaUJBQWtCLEdBQ2xCLGVBQWdCLEdBQ2hCLGFBQWMsR0FDZCxZQUFhLEdBQ2IscUJBQXNCLEdBQ3RCLGFBQWMsb0JBQ2QsUUFBUyxHQUNULGFBQWMsR0FDZCxZQUFhLElBQU0sS0FBSyxlQUFlLEVBQ3ZDLGlCQUFrQixJQUFNLENBQ2pCLEtBQUssZ0JBQWdCLGdCQUFnQixHQUN4QyxLQUFLLFdBQVcsQ0FFcEIsQ0FDRixDQUFDLEVBR0QsS0FBSyxhQUFhLFdBQVcsS0FBSyxNQUFNLEVBR3hDLEtBQUssYUFBYSxjQUFjLElBQU0sQ0FDcEMsS0FBSyxhQUFhLFdBQVcsS0FBSyxNQUFNLENBQzFDLENBQUMsRUFHRCxLQUFLLDBCQUEwQixFQUV4QixFQUNULENBS0EsaUJBQWtCLENBQ2hCLE1BQU8sQ0FBQyxLQUFLLGdCQUFnQiw2QkFBNkIsR0FDbkQsQ0FBQyxLQUFLLGdCQUFnQixnQkFBZ0IsR0FDdEMsS0FBSyxnQkFBZ0IsZUFBZSxJQUFNLENBQ25ELENBS0EsTUFBTSxXQUFZLENBQ2hCLEdBQUksQ0FBQyxLQUFLLFFBRUosQ0FEZ0IsTUFBTSxLQUFLLGlCQUFpQixFQUM5QixPQUlwQixNQUFNQyxFQUFjNUUsRUFBTyxtQkFBbUIsa0JBQWtCLEVBRzFENkUsRUFBZSxLQUFLLGdCQUFnQixxQkFBcUIsRUFDekRDLEVBQWlCRixFQUFZLE9BQU92SixHQUFLLENBQUN3SixFQUFhLFNBQVN4SixFQUFFLEVBQUUsQ0FBQyxFQUUzRSxHQUFJeUosRUFBZSxTQUFXLEVBQUcsQ0FDL0I1RSxFQUFNLG1DQUFtQyxFQUN6QyxLQUFLLGdCQUFnQixrQkFBa0IsRUFDdkMsTUFDRixDQUdBLE1BQU02RSxFQUFRRCxFQUFlLElBQUksQ0FBQzFDLEVBQVNRLElBQVUsQ0FDbkQsTUFBTW9DLEVBQVVwQyxJQUFVLEVBQ3BCcUMsRUFBU3JDLElBQVVrQyxFQUFlLE9BQVMsRUFFM0NJLEVBQU8sQ0FDWCxRQUFTOUMsRUFBUSxRQUNqQixRQUFTLENBQ1AsTUFBT0EsRUFBUSxRQUFRLE1BQ3ZCLFlBQWFBLEVBQVEsUUFBUSxZQUM3QixLQUFNQSxFQUFRLFFBQVEsVUFBWSxTQUNsQyxNQUFPQSxFQUFRLFFBQVEsT0FBUyxRQUNoQyxZQUFhLEtBQUssbUJBQW1CQSxFQUFTNEMsRUFBU0MsQ0FBTSxFQUM3RCxhQUFjN0MsRUFBUSxRQUFRLGVBQWlCLEdBQy9DLFlBQWEsSUFBTSxDQUNqQixLQUFLLGdCQUFnQixxQkFBcUJBLEVBQVEsRUFBRSxFQUNwRCxLQUFLLGdCQUFnQixlQUFlUSxFQUFRLENBQUMsRUFDN0MsS0FBSyxpQkFBbUJBLEVBQVEsRUFDaEMsS0FBSyxPQUFPLFNBQVMsQ0FDdkIsRUFDQSxZQUFhLElBQU0sQ0FDakIsS0FBSyxnQkFBZ0IsZUFBZSxLQUFLLElBQUksRUFBR0EsRUFBUSxDQUFDLENBQUMsRUFDMUQsS0FBSyxpQkFBbUIsS0FBSyxJQUFJLEVBQUdBLEVBQVEsQ0FBQyxFQUM3QyxLQUFLLE9BQU8sYUFBYSxDQUMzQixFQUNBLGFBQWMsSUFBTSxDQUNsQixLQUFLLFNBQVMsQ0FDaEIsQ0FDRixDQUNGLEVBR0EsT0FBSVIsRUFBUSxLQUFPLGdCQUFrQixLQUFLLHNCQUN4QzhDLEVBQUssUUFBUSxnQkFBa0IsSUFBTSxDQUNuQ2hGLEVBQU0sNkNBQTZDLEVBQ25ELEtBQUssb0JBQW9CLHFCQUFxQixFQUU5QyxLQUFLLGdCQUFnQixxQkFBcUJrQyxFQUFRLEVBQUUsRUFDcEQsS0FBSyxnQkFBZ0IsZUFBZVEsRUFBUSxDQUFDLEVBQzdDLEtBQUssaUJBQW1CQSxFQUFRLEVBQ2hDLEtBQUssT0FBTyxTQUFTLENBQ3ZCLEVBRUFzQyxFQUFLLFFBQVEsYUFBZSxJQUFNLENBQ2hDaEYsRUFBTSxrQ0FBa0MsRUFDeEMsS0FBSyxnQkFBZ0IscUJBQXFCLEVBRTFDLEtBQUssZ0JBQWdCLHFCQUFxQmtDLEVBQVEsRUFBRSxFQUNwRCxLQUFLLGdCQUFnQixlQUFlUSxFQUFRLENBQUMsRUFDN0MsS0FBSyxpQkFBbUJBLEVBQVEsRUFDaEMsS0FBSyxPQUFPLFNBQVMsQ0FDdkIsR0FHS3NDLENBQ1QsQ0FBQyxFQUVELEtBQUssU0FBVyxHQUNoQixLQUFLLE9BQU8sU0FBU0gsQ0FBSyxFQUMxQixLQUFLLE9BQU8sTUFBTSxDQUNwQixDQUtBLE1BQU0sWUFBYSxDQUNHLEtBQUssZ0JBQWdCLGVBQWUsRUFDdEMsRUFDaEIsTUFBTSxLQUFLLFVBQVUsRUFJckIsTUFBTSxLQUFLLFVBQVUsQ0FFekIsQ0FLQSxVQUFXLENBQ0wsS0FBSyxRQUNQLEtBQUssT0FBTyxRQUFRLEVBRXRCLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssU0FBVyxFQUNsQixDQUtBLE1BQU0sYUFBYyxDQUNsQixLQUFLLGdCQUFnQixjQUFjLEVBQ25DLE1BQU0sS0FBSyxVQUFVLENBQ3ZCLENBS0EsTUFBTSxZQUFZbkUsRUFBVyxDQUMzQixNQUFNd0IsRUFBVXBDLEVBQU8sbUJBQW1CLGVBQWVZLENBQVMsRUFDbEUsR0FBSSxDQUFDd0IsRUFBUyxDQUNabkMsRUFBYSxTQUFTLGtDQUFtQyxJQUFJLE1BQU0sc0JBQXNCVyxDQUFTLEVBQUUsRUFBRyxDQUFFLFVBQUFBLENBQVUsQ0FBQyxFQUNwSCxNQUNGLENBRUssS0FBSyxRQUNSLE1BQU0sS0FBSyxpQkFBaUIsRUFHOUIsTUFBTXNFLEVBQU8sQ0FDWCxRQUFTOUMsRUFBUSxRQUNqQixRQUFTLENBQ1AsTUFBT0EsRUFBUSxRQUFRLE1BQ3ZCLFlBQWFBLEVBQVEsUUFBUSxZQUM3QixLQUFNQSxFQUFRLFFBQVEsVUFBWSxTQUNsQyxNQUFPQSxFQUFRLFFBQVEsT0FBUyxPQUNsQyxDQUNGLEVBRUEsS0FBSyxPQUFPLFVBQVU4QyxDQUFJLENBQzVCLENBS0EsTUFBTSxjQUFlLENBQ25CLEdBQUksQ0FBQyxLQUFLLFFBRUosQ0FEZ0IsTUFBTSxLQUFLLGlCQUFpQixFQUM5QixPQUlwQixNQUFNQyxFQUFxQm5GLEVBQU8sbUJBQW1CLHNCQUFzQixFQUUzRSxHQUFJbUYsRUFBbUIsU0FBVyxFQUFHLENBQ25DakYsRUFBTSx1Q0FBdUMsRUFDN0MsTUFDRixDQUVBQSxFQUFNLHlCQUF5QmlGLEVBQW1CLE1BQU0sZUFBZSxFQUd2RSxNQUFNSixFQUFRSSxFQUFtQixJQUFJLENBQUMvQyxFQUFTUSxJQUFVLENBQ3ZELE1BQU1vQyxFQUFVcEMsSUFBVSxFQUNwQnFDLEVBQVNyQyxJQUFVdUMsRUFBbUIsT0FBUyxFQUVyRCxNQUFPLENBQ0wsUUFBUy9DLEVBQVEsUUFDakIsUUFBUyxDQUNQLE1BQU8sZUFBVUEsRUFBUSxRQUFRLEtBQUssR0FDdEMsWUFBYUEsRUFBUSxRQUFRLFlBQzdCLEtBQU1BLEVBQVEsUUFBUSxVQUFZLFNBQ2xDLE1BQU9BLEVBQVEsUUFBUSxPQUFTLFFBQ2hDLFlBQWEsS0FBSyxtQkFBbUJBLEVBQVM0QyxFQUFTQyxDQUFNLEVBQzdELGFBQWMsR0FDZCxZQUFhLElBQU0sQ0FDakIsS0FBSyxPQUFPLFNBQVMsQ0FDdkIsRUFDQSxZQUFhLElBQU0sQ0FDakIsS0FBSyxPQUFPLGFBQWEsQ0FDM0IsRUFDQSxhQUFjLElBQU0sQ0FDbEIsS0FBSyxTQUFTLENBQ2hCLENBQ0YsQ0FDRixDQUNGLENBQUMsRUFFRCxLQUFLLFNBQVcsR0FDaEIsS0FBSyxPQUFPLFNBQVNGLENBQUssRUFDMUIsS0FBSyxPQUFPLE1BQU0sQ0FDcEIsQ0FLQSwyQkFBNEIsQ0FFMUIsSUFBSUssRUFDSixLQUFLLGNBQWdCLElBQU0sQ0FDekIsYUFBYUEsQ0FBYSxFQUMxQkEsRUFBZ0IsV0FBVyxJQUFNLENBQzNCLEtBQUssVUFBWSxLQUFLLFNBQ3hCbEYsRUFBTSxxREFBcUQsRUFDM0QsS0FBSyxPQUFPLFFBQVEsRUFFeEIsRUFBRyxHQUFHLENBQ1IsRUFHQSxLQUFLLG9CQUFzQixJQUFNLENBQzNCLEtBQUssVUFBWSxLQUFLLFNBQ3hCQSxFQUFNLHFEQUFxRCxFQUUzRCxXQUFXLElBQU0sQ0FDWCxLQUFLLFFBQ1AsS0FBSyxPQUFPLFFBQVEsQ0FFeEIsRUFBRyxHQUFHLEVBRVYsRUFHQUYsRUFBTyxpQkFBaUIsU0FBVSxLQUFLLGFBQWEsRUFHcEQsS0FBSyxhQUFhLGNBQWMsS0FBSyxtQkFBbUIsQ0FDMUQsQ0FLQSw2QkFBOEIsQ0FDeEIsS0FBSyxlQUNQQSxFQUFPLG9CQUFvQixTQUFVLEtBQUssYUFBYSxDQUUzRCxDQU1BLG1CQUFtQm9DLEVBQVM0QyxFQUFTQyxFQUFRLENBRTNDLEdBQUk3QyxFQUFRLFFBQVEsWUFDbEIsT0FBT0EsRUFBUSxRQUFRLFlBSXpCLE1BQU1pRCxFQUFVLENBQUMsRUFFakIsT0FBS0wsR0FDSEssRUFBUSxLQUFLLFVBQVUsRUFHcEJKLEVBR0hJLEVBQVEsS0FBSyxPQUFPLEVBRnBCQSxFQUFRLEtBQUssTUFBTSxFQUtkQSxDQUNULENBS0EsZ0JBQWlCLENBQ2YsS0FBSyxnQkFBZ0Isa0JBQWtCLEVBQ3ZDLEtBQUssU0FBVyxHQUNoQm5GLEVBQU0sOEJBQThCLENBQ3RDLENBS0EsWUFBYSxDQUVYQSxFQUFNLDRCQUE0QixFQUNsQyxLQUFLLFNBQVcsRUFDbEIsQ0FDRixDQUVBRixFQUFPLFlBQWN3RSxFQUNyQnRFLEVBQU0sNkJBQTZCLENBRXJDLEdBQUcsTUFBTSxHQVVSLFVBQVcsQ0FDVixhQUVBLE1BQU1BLEVBQVEsSUFBSUMsSUFBUyxDQUNyQixPQUFPLGlCQUNULFFBQVEsSUFBSSxHQUFHQSxDQUFJLENBRXZCLEVBRUEsSUFBSTBELEVBQ0FZLEVBQ0FhLEVBQ0FaLEVBQ0F6RSxFQUtKLGVBQWVzRixHQUF1QixDQUNwQyxHQUFJLENBR0YsR0FGQXJGLEVBQU0scUNBQXFDLEVBRXZDLE9BQU8sNEJBQ1QsR0FBSSxDQUNGLE1BQU0sT0FBTywyQkFDZixNQUFZLENBQWUsQ0F3QjdCLEdBcEJBRCxFQUFlLElBQUksYUFDbkJDLEVBQU0sd0NBQXdDLEVBRzlDMkQsRUFBa0IsSUFBSSxnQkFBZ0Isc0JBQXNCLEVBQzVEM0QsRUFBTSwyQ0FBMkMsRUFHakR1RSxFQUFlLElBQUksYUFDbkJ2RSxFQUFNLHdDQUF3QyxFQUc5Q3dFLEVBQXNCLElBQUksb0JBQW9CYixDQUFlLEVBQzdEM0QsRUFBTSxnREFBZ0QsRUFHdERvRixFQUFjLElBQUksWUFBWXpCLEVBQWlCWSxFQUFjQyxDQUFtQixFQUNoRnhFLEVBQU0sdUNBQXVDLEVBR3pDb0YsRUFBWSxnQkFBZ0IsRUFDOUJwRixFQUFNLHdEQUF3RCxFQUM5RCxNQUFNMkQsRUFBZ0IsK0JBQStCLEVBRXJELFdBQVcsSUFBTSxDQUNmeUIsRUFBWSxVQUFVLENBQ3hCLEVBQUcsR0FBSSxNQUNGLENBQ0wsTUFBTUUsRUFBZ0IzQixFQUFnQixnQkFBZ0IsRUFDaEQ0QixFQUFjNUIsRUFBZ0IsZUFBZSxFQUNuRDNELEVBQU0sbURBQW1Ec0YsQ0FBYSxXQUFXQyxDQUFXLEdBQUcsRUFHM0YsQ0FBQ0QsR0FBaUJDLEVBQWMsR0FDbEN2RixFQUFNLHdEQUF3RCxDQUVsRSxDQUdBd0YsRUFBcUIsRUFHckIsT0FBTyxvQkFBc0IsQ0FDM0IsVUFBVyxJQUFNSixFQUFZLFVBQVUsRUFDdkMsWUFBYSxJQUFNQSxFQUFZLFlBQVksRUFDM0MsWUFBY2pDLEdBQU9pQyxFQUFZLFlBQVlqQyxDQUFFLEVBQy9DLGFBQWMsSUFBTWlDLEVBQVksYUFBYSxFQUM3QyxjQUFlLElBQU16QixFQUFnQixjQUFjLEVBQ25ELFVBQVcsSUFBTTVELEVBQWEsVUFBVSxFQUN4QyxjQUFlLElBQU1BLEVBQWEsY0FBYyxDQUNsRCxFQUVBQyxFQUFNLDhDQUE4QyxDQUN0RCxPQUFTTyxFQUFPLENBQ1ZSLEdBQ0ZBLEVBQWEsU0FBUyw4QkFBK0JRLENBQUssRUFJNUQsUUFBUSxLQUFLLHNGQUFzRixDQUNyRyxDQUNGLENBS0EsU0FBU2lGLEdBQXVCLENBQzlCLE1BQU1DLEVBQVcsU0FBUyxjQUFjLGdCQUFnQixHQUFLLFNBQVMsY0FBYyxRQUFRLEVBQzVGLEdBQUksQ0FBQ0EsRUFBVSxPQUVmLE1BQU1DLEVBQWUsSUFBTSxDQUNyQk4sR0FDRnBGLEVBQU0sNkNBQTZDLEVBQ25Eb0YsRUFBWSxZQUFZLElBRXBCckYsR0FDRkEsRUFBYSxTQUFTLDRDQUE2QyxJQUFJLE1BQU0sOEJBQThCLENBQUMsRUFFOUcsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLDBDQUE2SixFQUV2SyxFQUdNSyxFQUFXLFNBQVMsZUFBZSxrQkFBa0IsRUFDM0QsR0FBSUEsRUFBVSxDQUNaQSxFQUFTLFFBQVVzRixFQUNuQixNQUNGLENBRUEsTUFBTUMsRUFBUyxTQUFTLGNBQWMsUUFBUSxFQUM5Q0EsRUFBTyxHQUFLLG1CQUNaQSxFQUFPLFlBQWMsWUFDckJBLEVBQU8sTUFBUSw4QkFDZkEsRUFBTyxRQUFVRCxFQUNqQkQsRUFBUyxZQUFZRSxDQUFNLENBQzdCLENBS0EsU0FBU0MsR0FBb0IsQ0FHM0IsT0FBSSxPQURrQixPQUFPLFFBQVEsSUFBSSxRQUFVLE9BQU8sUUFBUSxRQUFVLE9BQU8sU0FDdEQsWUFDM0IsUUFBUSxLQUFLLHNFQUF1RSxPQUFPLE1BQU0sRUFDMUYsSUFFRixFQUNULENBS0EsU0FBU0MsR0FBZ0IsQ0FDdkIsSUFBSUMsRUFBVSxFQUNkLE1BQU1DLEVBQWEsR0FFbkIsU0FBU0MsR0FBYyxDQUNqQkosRUFBa0IsRUFDcEJQLEVBQXFCLEdBRXJCUyxJQUNJQSxFQUFVQyxFQUVaLFdBQVdDLEVBQWEsR0FBRyxFQUd2QmpHLEVBQ0ZBLEVBQWEsd0JBQXdCLEVBR2pCLElBQUksYUFBYSxFQUN6Qix3QkFBd0IsRUFJNUMsQ0FFQWlHLEVBQVksQ0FDZCxDQUdJLFNBQVMsYUFBZSxVQUMxQixTQUFTLGlCQUFpQixtQkFBb0JILENBQWEsRUFFM0RBLEVBQWMsRUFHaEI3RixFQUFNLDRCQUE0QixDQUVwQyxHQUFHIiwKICAibmFtZXMiOiBbIkQiLCAiRiIsICJ6IiwgIlciLCAibyIsICJ0IiwgImkiLCAicSIsICJwIiwgImFlIiwgIlYiLCAic2UiLCAicmUiLCAiTiIsICJiIiwgIksiLCAiRSIsICJPIiwgIl8iLCAiY2UiLCAibGUiLCAibiIsICJmIiwgInciLCAiciIsICJ2IiwgInMiLCAiWSIsICJYIiwgImRlIiwgInBlIiwgInVlIiwgIkciLCAiaiIsICJjIiwgImQiLCAidmUiLCAiZmUiLCAiUSIsICJnZSIsICJoZSIsICJvZSIsICJtIiwgImciLCAidSIsICJoIiwgInhlIiwgIlAiLCAieCIsICJ5IiwgIkoiLCAid2UiLCAiQSIsICJtZSIsICJaIiwgInllIiwgImJlIiwgIkMiLCAiUGUiLCAiayIsICJNIiwgIlIiLCAiSSIsICJUIiwgIkgiLCAiJCIsICJCIiwgIlMiLCAiTCIsICJVIiwgImVlIiwgInRlIiwgIkNlIiwgIlNlIiwgImUiLCAiTGUiLCAia2UiLCAiaWUiLCAibmUiLCAiX2UiLCAid2luZG93IiwgImVycm9ySGFuZGxlciIsICJkZWJ1ZyIsICJhcmdzIiwgIlByb2dyZXNzVHJhY2tlciIsICJzdG9yYWdlS2V5IiwgImV4aXN0aW5nIiwgImRlZmF1bHRTdGF0ZSIsICJkYXRhIiwgImVycm9yIiwgInN0YXRlIiwgInNlc3Npb25FcnJvciIsICJ0b29sdGlwSWQiLCAic3RlcEluZGV4IiwgIlRIRU1FX0NPTkZJR1MiLCAiVGhlbWVBZGFwdGVyIiwgInJvb3QiLCAiY2xhc3NMaXN0IiwgInRoZW1lIiwgInRoZW1lTmFtZSIsICJjb25maWciLCAicmVzb2x2ZWRDb25maWciLCAia2V5IiwgInZhbHVlIiwgInZhck5hbWUiLCAiY29tcHV0ZWRWYWx1ZSIsICJjYWxsYmFjayIsICJtdXRhdGlvbnMiLCAibXV0YXRpb24iLCAibmV3VGhlbWUiLCAib2xkVGhlbWUiLCAiZHJpdmVyIiwgInRoZW1lQ29uZmlnIiwgImV4aXN0aW5nU3R5bGUiLCAic3R5bGUiLCAidmFsaWRhdGVUb29sdGlwRGVmaW5pdGlvbiIsICJ0b29sdGlwIiwgImVycm9ycyIsICJ2YWxpZFBvc2l0aW9ucyIsICJ2YWxpZEFsaWducyIsICJ2YWxpZGF0ZVRvb2x0aXBEZWZpbml0aW9ucyIsICJ0b29sdGlwcyIsICJhbGxFcnJvcnMiLCAiaWRzIiwgImluZGV4IiwgInZhbGlkYXRpb24iLCAiVG9vbHRpcEVycm9yIiwgIm1lc3NhZ2UiLCAiaGFuZGxlVmFsaWRhdGlvbkVycm9ycyIsICJlcnJvck1lc3NhZ2VzIiwgIlRPT0xUSVBfREVGSU5JVElPTlMiLCAiZ2V0VG9vbHRpcERlZmluaXRpb25zIiwgImdldFRvb2x0aXBCeUlkIiwgImlkIiwgImdldEFjdGl2ZVRvb2x0aXBzIiwgImdldFNvcnRlZFRvb2x0aXBzIiwgImEiLCAicHJpb3JpdHlBIiwgInByaW9yaXR5QiIsICJnZXROZXdGZWF0dXJlVG9vbHRpcHMiLCAiRG5zVGVtcGxhdGVTZWxlY3RvciIsICJwcm9ncmVzc1RyYWNrZXIiLCAibW9kYWwiLCAiZ3JpZCIsICJ0ZW1wbGF0ZXMiLCAidGVtcGxhdGUiLCAiY2FyZCIsICJkaWZmaWN1bHR5Q2xhc3MiLCAidGVtcGxhdGVJZCIsICJhcHBTZWxlY3RvckJ0biIsICJzZWFyY2hJbnB1dCIsICJub3RpZmljYXRpb24iLCAiVG91ck1hbmFnZXIiLCAidGhlbWVBZGFwdGVyIiwgImRuc1RlbXBsYXRlU2VsZWN0b3IiLCAiZHJpdmVyRmFjdG9yeSIsICJhbGxUb29sdGlwcyIsICJjb21wbGV0ZWRJZHMiLCAiYWN0aXZlVG9vbHRpcHMiLCAic3RlcHMiLCAiaXNGaXJzdCIsICJpc0xhc3QiLCAic3RlcCIsICJuZXdGZWF0dXJlVG9vbHRpcHMiLCAicmVzaXplVGltZW91dCIsICJidXR0b25zIiwgInRvdXJNYW5hZ2VyIiwgImluaXRpYWxpemVPbmJvYXJkaW5nIiwgInRvdXJDb21wbGV0ZWQiLCAiY3VycmVudFN0ZXAiLCAiYWRkUmVzdGFydFRvdXJCdXR0b24iLCAidG9vbHNSb3ciLCAiY2xpY2tIYW5kbGVyIiwgImJ1dHRvbiIsICJjaGVja0RyaXZlckxvYWRlZCIsICJ3YWl0Rm9yRHJpdmVyIiwgInJldHJpZXMiLCAibWF4UmV0cmllcyIsICJhdHRlbXB0SW5pdCJdCn0K
|