-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy path4-81971fccea6f685db714.js
29 lines (26 loc) · 156 KB
/
4-81971fccea6f685db714.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{954:function(e,t,n){var r;
/*!
Holder - client side image placeholders
Version 2.9.4+cabil
© 2016 Ivan Malopinsky - http://imsky.co
Site: http://holderjs.com
Issues: https://github.com/imsky/holder/issues
License: MIT
*/!function(e){if(e.document){var t,n,r=e.document;r.querySelectorAll||(r.querySelectorAll=function(t){var n,i=r.createElement("style"),a=[];for(r.documentElement.firstChild.appendChild(i),r._qsa=[],i.styleSheet.cssText=t+"{x-qsa:expression(document._qsa && document._qsa.push(this))}",e.scrollBy(0,0),i.parentNode.removeChild(i);r._qsa.length;)(n=r._qsa.shift()).style.removeAttribute("x-qsa"),a.push(n);return r._qsa=null,a}),r.querySelector||(r.querySelector=function(e){var t=r.querySelectorAll(e);return t.length?t[0]:null}),r.getElementsByClassName||(r.getElementsByClassName=function(e){return e=String(e).replace(/^|\s+/g,"."),r.querySelectorAll(e)}),Object.keys||(Object.keys=function(e){if(e!==Object(e))throw TypeError("Object.keys called on non-object");var t,n=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.push(t);return n}),Array.prototype.forEach||(Array.prototype.forEach=function(e){if(void 0===this||null===this)throw TypeError();var t=Object(this),n=t.length>>>0;if("function"!=typeof e)throw TypeError();var r,i=arguments[1];for(r=0;r<n;r++)r in t&&e.call(i,t[r],r,t)}),n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",(t=e).atob=t.atob||function(e){var t=0,r=[],i=0,a=0;if((e=(e=String(e)).replace(/\s/g,"")).length%4==0&&(e=e.replace(/=+$/,"")),e.length%4==1)throw Error("InvalidCharacterError");if(/[^+/0-9A-Za-z]/.test(e))throw Error("InvalidCharacterError");for(;t<e.length;)i=i<<6|n.indexOf(e.charAt(t)),24===(a+=6)&&(r.push(String.fromCharCode(i>>16&255)),r.push(String.fromCharCode(i>>8&255)),r.push(String.fromCharCode(255&i)),a=0,i=0),t+=1;return 12===a?(i>>=4,r.push(String.fromCharCode(255&i))):18===a&&(i>>=2,r.push(String.fromCharCode(i>>8&255)),r.push(String.fromCharCode(255&i))),r.join("")},t.btoa=t.btoa||function(e){e=String(e);var t,r,i,a,o,s,l,h=0,d=[];if(/[^\x00-\xFF]/.test(e))throw Error("InvalidCharacterError");for(;h<e.length;)a=(t=e.charCodeAt(h++))>>2,o=(3&t)<<4|(r=e.charCodeAt(h++))>>4,s=(15&r)<<2|(i=e.charCodeAt(h++))>>6,l=63&i,h===e.length+2?(s=64,l=64):h===e.length+1&&(l=64),d.push(n.charAt(a),n.charAt(o),n.charAt(s),n.charAt(l));return d.join("")},Object.prototype.hasOwnProperty||(Object.prototype.hasOwnProperty=function(e){var t=this.__proto__||this.constructor.prototype;return e in this&&(!(e in t)||t[e]!==this[e])}),
// @license http://opensource.org/licenses/MIT
function(){if("performance"in e==0&&(e.performance={}),Date.now=Date.now||function(){return(new Date).getTime()},"now"in e.performance==0){var t=Date.now();performance.timing&&performance.timing.navigationStart&&(t=performance.timing.navigationStart),e.performance.now=function(){return Date.now()-t}}}(),e.requestAnimationFrame||(e.webkitRequestAnimationFrame&&e.webkitCancelAnimationFrame?function(e){e.requestAnimationFrame=function(t){return webkitRequestAnimationFrame(function(){t(e.performance.now())})},e.cancelAnimationFrame=e.webkitCancelAnimationFrame}(e):e.mozRequestAnimationFrame&&e.mozCancelAnimationFrame?function(e){e.requestAnimationFrame=function(t){return mozRequestAnimationFrame(function(){t(e.performance.now())})},e.cancelAnimationFrame=e.mozCancelAnimationFrame}(e):function(e){e.requestAnimationFrame=function(t){return e.setTimeout(t,1e3/60)},e.cancelAnimationFrame=e.clearTimeout}(e))}}(this),r=function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}return n.m=e,n.c=t,n.p="",n(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){(function(t){var r=n(2),i=n(3),a=n(6),o=n(7),s=n(8),l=n(9),h=n(10),d=n(11),c=n(12),u=n(15),f=o.extend,p=o.dimensionCheck,g=d.svg_ns,m={version:d.version,addTheme:function(e,t){return null!=e&&null!=t&&(v.settings.themes[e]=t),delete v.vars.cache.themeKeys,this},addImage:function(e,t){return l.getNodeArray(t).forEach(function(t){var n=l.newEl("img"),r={};r[v.setup.dataAttr]=e,l.setAttr(n,r),t.appendChild(n)}),this},setResizeUpdate:function(e,t){e.holderData&&(e.holderData.resizeUpdate=!!t,e.holderData.resizeUpdate&&S(e))},run:function(e){e=e||{};var n={},r=f(v.settings,e);v.vars.preempted=!0,v.vars.dataAttr=r.dataAttr||v.setup.dataAttr,n.renderer=r.renderer?r.renderer:v.setup.renderer,-1===v.setup.renderers.join(",").indexOf(n.renderer)&&(n.renderer=v.setup.supportsSVG?"svg":v.setup.supportsCanvas?"canvas":"html");var i=l.getNodeArray(r.images),a=l.getNodeArray(r.bgnodes),s=l.getNodeArray(r.stylenodes),h=l.getNodeArray(r.objects);return n.stylesheets=[],n.svgXMLStylesheet=!0,n.noFontFallback=!!r.noFontFallback,n.noBackgroundSize=!!r.noBackgroundSize,s.forEach(function(e){if(e.attributes.rel&&e.attributes.href&&"stylesheet"==e.attributes.rel.value){var t=e.attributes.href.value,r=l.newEl("a");r.href=t;var i=r.protocol+"//"+r.host+r.pathname+r.search;n.stylesheets.push(i)}}),a.forEach(function(e){if(t.getComputedStyle){var i=t.getComputedStyle(e,null).getPropertyValue("background-image"),a=e.getAttribute("data-background-src")||i,o=null,s=r.domain+"/",l=a.indexOf(s);if(0===l)o=a;else if(1===l&&"?"===a[0])o=a.slice(1);else{var h=a.substr(l).match(/([^\"]*)"?\)/);if(null!==h)o=h[1];else if(0===a.indexOf("url(http://github.com/"))throw"Holder: unable to parse background URL: "+a}if(o){var d=w(o,r);d&&b({mode:"background",el:e,flags:d,engineSettings:n})}}}),h.forEach(function(e){var t={};try{t.data=e.getAttribute("data"),t.dataSrc=e.getAttribute(v.vars.dataAttr)}catch(e){}var i=null!=t.data&&0===t.data.indexOf(r.domain),a=null!=t.dataSrc&&0===t.dataSrc.indexOf(r.domain);i?y(r,n,t.data,e):a&&y(r,n,t.dataSrc,e)}),i.forEach(function(e){var t={};try{t.src=e.getAttribute("src"),t.dataSrc=e.getAttribute(v.vars.dataAttr),t.rendered=e.getAttribute("data-holder-rendered")}catch(e){}var i=null!=t.src,a=null!=t.dataSrc&&0===t.dataSrc.indexOf(r.domain),s=null!=t.rendered&&"true"==t.rendered;i?0===t.src.indexOf(r.domain)?y(r,n,t.src,e):a&&(s?y(r,n,t.dataSrc,e):function(e,t,n,r,i){o.imageExists(e,function(e){e||y(t,n,r,i)})}(t.src,r,n,t.dataSrc,e)):a&&y(r,n,t.dataSrc,e)}),this}},v={settings:{domain:"holder.js",images:"img",objects:"object",bgnodes:"body .holderjs",stylenodes:"head link.holderjs",themes:{gray:{bg:"#EEEEEE",fg:"#AAAAAA"},social:{bg:"#3a5a97",fg:"#FFFFFF"},industrial:{bg:"#434A52",fg:"#C2F200"},sky:{bg:"#0D8FDB",fg:"#FFFFFF"},vine:{bg:"#39DBAC",fg:"#1E292C"},lava:{bg:"#F8591A",fg:"#1C2846"}}},defaults:{size:10,units:"pt",scale:1/16}};function y(e,t,n,r){var i=w(n.substr(n.lastIndexOf(e.domain)),e);i&&b({mode:null,el:r,flags:i,engineSettings:t})}function w(e,t){var n={theme:f(v.settings.themes.gray,null),stylesheets:t.stylesheets,instanceOptions:t},r=e.indexOf("?"),a=[e];-1!==r&&(a=[e.slice(0,r),e.slice(r+1)]);var s=a[0].split("/");n.holderURL=e;var l=s[1],h=l.match(/([\d]+p?)x([\d]+p?)/);if(!h)return!1;if(n.fluid=-1!==l.indexOf("p"),n.dimensions={width:h[1].replace("p","%"),height:h[2].replace("p","%")},2===a.length){var d=i.parse(a[1]);if(o.truthy(d.ratio)){n.fluid=!0;var c=parseFloat(n.dimensions.width.replace("%","")),u=parseFloat(n.dimensions.height.replace("%",""));u=Math.floor(u/c*100),c=100,n.dimensions.width=c+"%",n.dimensions.height=u+"%"}if(n.auto=o.truthy(d.auto),d.bg&&(n.theme.bg=o.parseColor(d.bg)),d.fg&&(n.theme.fg=o.parseColor(d.fg)),d.bg&&!d.fg&&(n.autoFg=!0),d.theme&&n.instanceOptions.themes.hasOwnProperty(d.theme)&&(n.theme=f(n.instanceOptions.themes[d.theme],null)),d.text&&(n.text=d.text),d.textmode&&(n.textmode=d.textmode),d.size&&(n.size=d.size),d.font&&(n.font=d.font),d.align&&(n.align=d.align),d.lineWrap&&(n.lineWrap=d.lineWrap),n.nowrap=o.truthy(d.nowrap),n.outline=o.truthy(d.outline),o.truthy(d.random)){v.vars.cache.themeKeys=v.vars.cache.themeKeys||Object.keys(n.instanceOptions.themes);var p=v.vars.cache.themeKeys[0|Math.random()*v.vars.cache.themeKeys.length];n.theme=f(n.instanceOptions.themes[p],null)}}return n}function b(e){var t=e.mode,n=e.el,r=e.flags,i=e.engineSettings,a=r.dimensions,s=r.theme,h=a.width+"x"+a.height;if(t=null==t?r.fluid?"fluid":"image":t,null!=r.text&&(s.text=r.text,"object"===n.nodeName.toLowerCase())){for(var d=s.text.split("\\n"),c=0;c<d.length;c++)d[c]=o.encodeHtmlEntity(d[c]);s.text=d.join("\\n")}if(s.text){var u=s.text.match(/holder_([a-z]+)/g);null!==u&&u.forEach(function(e){"holder_dimensions"===e&&(s.text=s.text.replace(e,h))})}var g=r.holderURL,m=f(i,null);if(r.font&&(s.font=r.font,!m.noFontFallback&&"img"===n.nodeName.toLowerCase()&&v.setup.supportsCanvas&&"svg"===m.renderer&&(m=f(m,{renderer:"canvas"}))),r.font&&"canvas"==m.renderer&&(m.reRender=!0),"background"==t)null==n.getAttribute("data-background-src")&&l.setAttr(n,{"data-background-src":g});else{var y={};y[v.vars.dataAttr]=g,l.setAttr(n,y)}r.theme=s,n.holderData={flags:r,engineSettings:m},"image"!=t&&"fluid"!=t||l.setAttr(n,{alt:s.text?s.text+" ["+h+"]":h});var w={mode:t,el:n,holderSettings:{dimensions:a,theme:s,flags:r},engineSettings:m};"image"==t?(r.auto||(n.style.width=a.width+"px",n.style.height=a.height+"px"),"html"==m.renderer?n.style.backgroundColor=s.bg:(x(w),"exact"==r.textmode&&(n.holderData.resizeUpdate=!0,v.vars.resizableImages.push(n),S(n)))):"background"==t&&"html"!=m.renderer?x(w):"fluid"==t&&(n.holderData.resizeUpdate=!0,"%"==a.height.slice(-1)?n.style.height=a.height:null!=r.auto&&r.auto||(n.style.height=a.height+"px"),"%"==a.width.slice(-1)?n.style.width=a.width:null!=r.auto&&r.auto||(n.style.width=a.width+"px"),"inline"!=n.style.display&&""!==n.style.display&&"none"!=n.style.display||(n.style.display="block"),function(e){if(e.holderData){var t=p(e);if(t){var n=e.holderData.flags,r={fluidHeight:"%"==n.dimensions.height.slice(-1),fluidWidth:"%"==n.dimensions.width.slice(-1),mode:null,initialDimensions:t};r.fluidWidth&&!r.fluidHeight?(r.mode="width",r.ratio=r.initialDimensions.width/parseFloat(n.dimensions.height)):!r.fluidWidth&&r.fluidHeight&&(r.mode="height",r.ratio=parseFloat(n.dimensions.width)/r.initialDimensions.height),e.holderData.fluidConfig=r}else A(e)}}(n),"html"==m.renderer?n.style.backgroundColor=s.bg:(v.vars.resizableImages.push(n),S(n)))}function x(e){var n,r=e.mode,i=e.el,o=e.holderSettings,s=e.engineSettings;switch(s.renderer){case"svg":if(!v.setup.supportsSVG)return;break;case"canvas":if(!v.setup.supportsCanvas)return;break;default:return}var d={width:o.dimensions.width,height:o.dimensions.height,theme:o.theme,flags:o.flags},f=function(e){var t=v.defaults.size;switch(parseFloat(e.theme.size)?t=e.theme.size:parseFloat(e.flags.size)&&(t=e.flags.size),e.font={family:e.theme.font?e.theme.font:"Arial, Helvetica, Open Sans, sans-serif",size:function(e,t,n,r){var i=parseInt(e,10),a=parseInt(t,10),o=Math.max(i,a),s=Math.min(i,a),l=.8*Math.min(s,o*r);return Math.round(Math.max(n,l))}(e.width,e.height,t,v.defaults.scale),units:e.theme.units?e.theme.units:v.defaults.units,weight:e.theme.fontweight?e.theme.fontweight:"bold"},e.text=e.theme.text||Math.floor(e.width)+"x"+Math.floor(e.height),e.noWrap=e.theme.nowrap||e.flags.nowrap,e.align=e.theme.align||e.flags.align||"center",e.flags.textmode){case"literal":e.text=e.flags.dimensions.width+"x"+e.flags.dimensions.height;break;case"exact":if(!e.flags.exactDimensions)break;e.text=Math.floor(e.flags.exactDimensions.width)+"x"+Math.floor(e.flags.exactDimensions.height)}var n=e.flags.lineWrap||v.setup.lineWrapRatio,r=e.width*n,i=r,o=new a({width:e.width,height:e.height}),s=o.Shape,l=new s.Rect("holderBg",{fill:e.theme.bg});if(l.resize(e.width,e.height),o.root.add(l),e.flags.outline){var d=new h(l.properties.fill);d=d.lighten(d.lighterThan("7f7f7f")?-.1:.1),l.properties.outline={fill:d.toHex(!0),width:2}}var c=e.theme.fg;if(e.flags.autoFg){var u=new h(l.properties.fill),f=new h("fff"),p=new h("000",{alpha:.285714});c=u.blendAlpha(u.lighterThan("7f7f7f")?p:f).toHex(!0)}var g=new s.Group("holderTextGroup",{text:e.text,align:e.align,font:e.font,fill:c});g.moveTo(null,null,1),o.root.add(g);var m=g.textPositionData=F(o);if(!m)throw"Holder: staging fallback not supported yet.";g.properties.leading=m.boundingBox.height;var y=null,w=null;function b(e,t,n,r){t.width=n,t.height=r,e.width=Math.max(e.width,t.width),e.height+=t.height}if(m.lineCount>1){var x,S=0,A=0,C=0;w=new s.Group("line"+C),"left"!==e.align&&"right"!==e.align||(i=e.width*(1-2*(1-n)));for(var E=0;E<m.words.length;E++){var k=m.words[E];y=new s.Text(k.text);var T="\\n"==k.text;!e.noWrap&&(S+k.width>=i||!0===T)&&(b(g,w,S,g.properties.leading),g.add(w),S=0,A+=g.properties.leading,C+=1,(w=new s.Group("line"+C)).y=A),!0!==T&&(y.moveTo(S,0),S+=m.spaceWidth+k.width,w.add(y))}if(b(g,w,S,g.properties.leading),g.add(w),"left"===e.align)g.moveTo(e.width-r,null,null);else if("right"===e.align){for(x in g.children)(w=g.children[x]).moveTo(e.width-w.width,null,null);g.moveTo(0-(e.width-r),null,null)}else{for(x in g.children)(w=g.children[x]).moveTo((g.width-w.width)/2,null,null);g.moveTo((e.width-g.width)/2,null,null)}g.moveTo(null,(e.height-g.height)/2,null),(e.height-g.height)/2<0&&g.moveTo(null,0,null)}else y=new s.Text(e.text),(w=new s.Group("line0")).add(y),g.add(w),"left"===e.align?g.moveTo(e.width-r,null,null):"right"===e.align?g.moveTo(0-(e.width-r),null,null):g.moveTo((e.width-m.boundingBox.width)/2,null,null),g.moveTo(null,(e.height-m.boundingBox.height)/2,null);return o}(d);function p(){var t=null;switch(s.renderer){case"canvas":t=u(f,e);break;case"svg":t=c(f,e);break;default:throw"Holder: invalid renderer: "+s.renderer}return t}if(null==(n=p()))throw"Holder: couldn't render placeholder";"background"==r?(i.style.backgroundImage="url(http://github.com/"+n+")",s.noBackgroundSize||(i.style.backgroundSize=d.width+"px "+d.height+"px")):("img"===i.nodeName.toLowerCase()?l.setAttr(i,{src:n}):"object"===i.nodeName.toLowerCase()&&l.setAttr(i,{data:n,type:"image/svg+xml"}),s.reRender&&t.setTimeout(function(){var e=p();if(null==e)throw"Holder: couldn't render placeholder";"img"===i.nodeName.toLowerCase()?l.setAttr(i,{src:e}):"object"===i.nodeName.toLowerCase()&&l.setAttr(i,{data:e,type:"image/svg+xml"})},150)),l.setAttr(i,{"data-holder-rendered":!0})}function S(e){for(var t,n=0,r=(t=null==e||null==e.nodeType?v.vars.resizableImages:[e]).length;n<r;n++){var i=t[n];if(i.holderData){var a=i.holderData.flags,o=p(i);if(o){if(!i.holderData.resizeUpdate)continue;if(a.fluid&&a.auto){var s=i.holderData.fluidConfig;switch(s.mode){case"width":o.height=o.width/s.ratio;break;case"height":o.width=o.height*s.ratio}}var l={mode:"image",holderSettings:{dimensions:o,theme:a.theme,flags:a},el:i,engineSettings:i.holderData.engineSettings};"exact"==a.textmode&&(a.exactDimensions=o,l.holderSettings.dimensions=a.dimensions),x(l)}else A(i)}}}function A(e){e.holderData.invisibleId||(v.vars.invisibleId+=1,v.vars.invisibleImages["i"+v.vars.invisibleId]=e,e.holderData.invisibleId=v.vars.invisibleId)}var C,E,k,T,F=(C=null,E=null,k=null,function(e){var t,n=e.root;if(v.setup.supportsSVG){var r=!1;null!=C&&C.parentNode===document.body||(r=!0),(C=s.initSVG(C,n.properties.width,n.properties.height)).style.display="block",r&&(E=l.newEl("text",g),t=null,k=document.createTextNode(t),l.setAttr(E,{x:0}),E.appendChild(k),C.appendChild(E),document.body.appendChild(C),C.style.visibility="hidden",C.style.position="absolute",C.style.top="-100%",C.style.left="-100%");var i=n.children.holderTextGroup.properties;l.setAttr(E,{y:i.font.size,style:o.cssProps({"font-weight":i.font.weight,"font-size":i.font.size+i.font.units,"font-family":i.font.family})}),k.nodeValue=i.text;var a=E.getBBox(),h=Math.ceil(a.width/n.properties.width),d=i.text.split(" "),c=i.text.match(/\\n/g);h+=null==c?0:c.length,k.nodeValue=i.text.replace(/[ ]+/g,"");var u=E.getComputedTextLength(),f=a.width-u,p=Math.round(f/Math.max(1,d.length-1)),m=[];if(h>1){k.nodeValue="";for(var y=0;y<d.length;y++)if(0!==d[y].length){k.nodeValue=o.decodeHtmlEntity(d[y]);var w=E.getBBox();m.push({text:d[y],width:w.width})}}return C.style.display="none",{spaceWidth:p,lineCount:h,boundingBox:a,words:m}}return!1});function O(){!function(e){v.vars.debounceTimer||e.call(this),v.vars.debounceTimer&&t.clearTimeout(v.vars.debounceTimer),v.vars.debounceTimer=t.setTimeout(function(){v.vars.debounceTimer=null,e.call(this)},v.setup.debounce)}(function(){S(null)})}for(var j in v.flags)v.flags.hasOwnProperty(j)&&(v.flags[j].match=function(e){return e.match(this.regex)});v.setup={renderer:"html",debounce:100,ratio:1,supportsCanvas:!1,supportsSVG:!1,lineWrapRatio:.9,dataAttr:"data-src",renderers:["html","canvas","svg"]},v.vars={preempted:!1,resizableImages:[],invisibleImages:{},invisibleId:0,visibilityCheckStarted:!1,debounceTimer:null,cache:{}},(T=l.newEl("canvas")).getContext&&-1!=T.toDataURL("image/png").indexOf("data:image/png")&&(v.setup.renderer="canvas",v.setup.supportsCanvas=!0),document.createElementNS&&document.createElementNS(g,"svg").createSVGRect&&(v.setup.renderer="svg",v.setup.supportsSVG=!0),v.vars.visibilityCheckStarted||(t.requestAnimationFrame(function e(){var n,r=[];Object.keys(v.vars.invisibleImages).forEach(function(e){n=v.vars.invisibleImages[e],p(n)&&"img"==n.nodeName.toLowerCase()&&(r.push(n),delete v.vars.invisibleImages[e])}),r.length&&m.run({images:r}),setTimeout(function(){t.requestAnimationFrame(e)},10)}),v.vars.visibilityCheckStarted=!0),r&&r(function(){v.vars.preempted||m.run(),t.addEventListener?(t.addEventListener("resize",O,!1),t.addEventListener("orientationchange",O,!1)):t.attachEvent("onresize",O),"object"==typeof t.Turbolinks&&t.document.addEventListener("page:change",function(){m.run()})}),e.exports=m}).call(t,function(){return this}())},function(e,t){e.exports="undefined"!=typeof window&&
/*!
* onDomReady.js 1.4.0 (c) 2013 Tubal Martin - MIT license
*
* Specially modified to work with Holder.js
*/
function(e){null==document.readyState&&document.addEventListener&&(document.addEventListener("DOMContentLoaded",function e(){document.removeEventListener("DOMContentLoaded",e,!1),document.readyState="complete"},!1),document.readyState="loading");var t=e.document,n=t.documentElement,r="load",i=!1,a="on"+r,o="complete",s="readyState",l="detachEvent",h="DOMContentLoaded",d="onreadystatechange",c="removeEventListener",u="addEventListener"in t,f=i,p=i,g=[];function m(e){if(!p){if(!t.body)return w(m);for(p=!0;e=g.shift();)w(e)}}function v(e){(u||e.type===r||t[s]===o)&&(y(),m())}function y(){u?(t[c](h,v,i),e[c](r,v,i)):(t[l](d,v),e[l](a,v))}function w(e,t){setTimeout(e,+t>=0?t:1)}if(t[s]===o)w(m);else if(u)t.addEventListener(h,v,i),e.addEventListener(r,v,i);else{t.attachEvent(d,v),e.attachEvent(a,v);try{f=null==e.frameElement&&n}catch(e){}f&&f.doScroll&&function e(){if(!p){try{f.doScroll("left")}catch(t){return w(e,50)}y(),m()}}()}function b(e){p?w(e):g.push(e)}return b.version="1.4.0",b.isReady=function(){return p},b}(window)},function(e,t,n){var r=encodeURIComponent,i=decodeURIComponent,a=n(4),o=n(5),s=/(\w+)\[(\d+)\]/,l=/\w+\.\w+/;t.parse=function(e){if("string"!=typeof e)return{};if(""===(e=a(e)))return{};"?"===e.charAt(0)&&(e=e.slice(1));for(var t={},n=e.split("&"),r=0;r<n.length;r++){var o,h,d,c=n[r].split("="),u=i(c[0]);if(o=s.exec(u))t[o[1]]=t[o[1]]||[],t[o[1]][o[2]]=i(c[1]);else if(o=l.test(u)){for(o=u.split("."),h=t;o.length;)if((d=o.shift()).length){if(h[d]){if(h[d]&&"object"!=typeof h[d])break}else h[d]={};o.length||(h[d]=i(c[1])),h=h[d]}}else t[c[0]]=null==c[1]?"":i(c[1])}return t},t.stringify=function(e){if(!e)return"";var t=[];for(var n in e){var i=e[n];if("array"!=o(i))t.push(r(n)+"="+r(e[n]));else for(var a=0;a<i.length;++a)t.push(r(n+"["+a+"]")+"="+r(i[a]))}return t.join("&")}},function(e,t){(t=e.exports=function(e){return e.replace(/^\s*|\s*$/g,"")}).left=function(e){return e.replace(/^\s*/,"")},t.right=function(e){return e.replace(/\s*$/,"")}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){switch(n.call(e)){case"[object Date]":return"date";case"[object RegExp]":return"regexp";case"[object Arguments]":return"arguments";case"[object Array]":return"array";case"[object Error]":return"error"}return null===e?"null":void 0===e?"undefined":e!=e?"nan":e&&1===e.nodeType?"element":null!=(t=e)&&(t._isBuffer||t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t))?"buffer":typeof(e=e.valueOf?e.valueOf():Object.prototype.valueOf.apply(e));var t}},function(e,t){e.exports=function(e){var t=1,n=function(e){t++,this.parent=null,this.children={},this.id=t,this.name="n"+t,void 0!==e&&(this.name=e),this.x=this.y=this.z=0,this.width=this.height=0};n.prototype.resize=function(e,t){null!=e&&(this.width=e),null!=t&&(this.height=t)},n.prototype.moveTo=function(e,t,n){this.x=null!=e?e:this.x,this.y=null!=t?t:this.y,this.z=null!=n?n:this.z},n.prototype.add=function(e){var t=e.name;if(void 0!==this.children[t])throw"SceneGraph: child already exists: "+t;this.children[t]=e,e.parent=this};var r=function(){n.call(this,"root"),this.properties=e};r.prototype=new n;var i=function(e,t){if(n.call(this,e),this.properties={fill:"#000000"},void 0!==t)!function(e,t){for(var n in t)e[n]=t[n]}(this.properties,t);else if(void 0!==e&&"string"!=typeof e)throw"SceneGraph: invalid node name"};i.prototype=new n;var a=function(){i.apply(this,arguments),this.type="group"};a.prototype=new i;var o=function(){i.apply(this,arguments),this.type="rect"};o.prototype=new i;var s=function(e){i.call(this),this.type="text",this.properties.text=e};s.prototype=new i;var l=new r;return this.Shape={Rect:o,Text:s,Group:a},this.root=l,this}},function(e,t){(function(e){t.extend=function(e,t){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);if(null!=t)for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);return n},t.cssProps=function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n+":"+e[n]);return t.join(";")},t.encodeHtmlEntity=function(e){for(var t=[],n=0,r=e.length-1;r>=0;r--)(n=e.charCodeAt(r))>128?t.unshift(["&#",n,";"].join("")):t.unshift(e[r]);return t.join("")},t.imageExists=function(e,t){var n=new Image;n.onerror=function(){t.call(this,!1)},n.onload=function(){t.call(this,!0)},n.src=e},t.decodeHtmlEntity=function(e){return e.replace(/&#(\d+);/g,function(e,t){return String.fromCharCode(t)})},t.dimensionCheck=function(e){var t={height:e.clientHeight,width:e.clientWidth};return!(!t.height||!t.width)&&t},t.truthy=function(e){return"string"==typeof e?"true"===e||"yes"===e||"1"===e||"on"===e||"✓"===e:!!e},t.parseColor=function(e){var t,n=e.match(/(^(?:#?)[0-9a-f]{6}$)|(^(?:#?)[0-9a-f]{3}$)/i);return null!==n?"#"!==(t=n[1]||n[2])[0]?"#"+t:t:null!==(n=e.match(/^rgb\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/))?t="rgb("+n.slice(1).join(",")+")":null!==(n=e.match(/^rgba\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0\.\d{1,}|1)\)$/))?t="rgba("+n.slice(1).join(",")+")":null},t.canvasRatio=function(){var t=1,n=1;if(e.document){var r=e.document.createElement("canvas");if(r.getContext){var i=r.getContext("2d");t=e.devicePixelRatio||1,n=i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1}}return t/n}}).call(t,function(){return this}())},function(e,t,n){(function(e){var r=n(9),i="http://www.w3.org/2000/svg";t.initSVG=function(e,t,n){var a,o,s=!1;e&&e.querySelector?null===(o=e.querySelector("style"))&&(s=!0):(e=r.newEl("svg",i),s=!0),s&&(a=r.newEl("defs",i),o=r.newEl("style",i),r.setAttr(o,{type:"text/css"}),a.appendChild(o),e.appendChild(a)),e.webkitMatchesSelector&&e.setAttribute("xmlns",i);for(var l=0;l<e.childNodes.length;l++)8===e.childNodes[l].nodeType&&e.removeChild(e.childNodes[l]);for(;o.childNodes.length;)o.removeChild(o.childNodes[0]);return r.setAttr(e,{width:t,height:n,viewBox:"0 0 "+t+" "+n,preserveAspectRatio:"none"}),e},t.svgStringToDataURI=function(t,n){return n?"data:image/svg+xml;charset=UTF-8;base64,"+btoa(e.unescape(encodeURIComponent(t))):"data:image/svg+xml;charset=UTF-8,"+encodeURIComponent(t)},t.serializeSVG=function(t,n){if(e.XMLSerializer){var i=new XMLSerializer,a="",o=n.stylesheets;if(n.svgXMLStylesheet){for(var s=r.createXML(),l=o.length-1;l>=0;l--){var h=s.createProcessingInstruction("xml-stylesheet",'href="'+o[l]+'" rel="stylesheet"');s.insertBefore(h,s.firstChild)}s.removeChild(s.documentElement),a=i.serializeToString(s)}var d=i.serializeToString(t);return a+d.replace(/\&(\#[0-9]{2,}\;)/g,"&$1")}}}).call(t,function(){return this}())},function(e,t){(function(e){t.newEl=function(t,n){if(e.document)return null==n?e.document.createElement(t):e.document.createElementNS(n,t)},t.setAttr=function(e,t){for(var n in t)e.setAttribute(n,t[n])},t.createXML=function(){if(e.DOMParser)return(new DOMParser).parseFromString("<xml />","application/xml")},t.getNodeArray=function(t){var n=null;return"string"==typeof t?n=document.querySelectorAll(t):e.NodeList&&t instanceof e.NodeList?n=t:e.Node&&t instanceof e.Node?n=[t]:e.HTMLCollection&&t instanceof e.HTMLCollection?n=t:t instanceof Array?n=t:null===t&&(n=[]),Array.prototype.slice.call(n)}}).call(t,function(){return this}())},function(e,t){var n=function(e,t){"string"==typeof e&&(this.original=e,"#"===e.charAt(0)&&(e=e.slice(1)),/[^a-f0-9]+/i.test(e)||(3===e.length&&(e=e.replace(/./g,"$&$&")),6===e.length&&(this.alpha=1,t&&t.alpha&&(this.alpha=t.alpha),this.set(parseInt(e,16)))))};n.rgb2hex=function(e,t,n){return[e,t,n].map(function(e){var t=(0|e).toString(16);return e<16&&(t="0"+t),t}).join("")},n.hsl2rgb=function(e,t,n){var r=e/60,i=(1-Math.abs(2*n-1))*t,a=i*(1-Math.abs(parseInt(r)%2-1)),o=n-i/2,s=0,l=0,h=0;return r>=0&&r<1?(s=i,l=a):r>=1&&r<2?(s=a,l=i):r>=2&&r<3?(l=i,h=a):r>=3&&r<4?(l=a,h=i):r>=4&&r<5?(s=a,h=i):r>=5&&r<6&&(s=i,h=a),s+=o,l+=o,h+=o,[s=parseInt(255*s),l=parseInt(255*l),h=parseInt(255*h)]},n.prototype.set=function(e){this.raw=e;var t=(16711680&this.raw)>>16,n=(65280&this.raw)>>8,r=255&this.raw,i=.2126*t+.7152*n+.0722*r,a=-.09991*t-.33609*n+.436*r,o=.615*t-.55861*n-.05639*r;return this.rgb={r:t,g:n,b:r},this.yuv={y:i,u:a,v:o},this},n.prototype.lighten=function(e){var t=Math.min(1,Math.max(0,Math.abs(e)))*(e<0?-1:1)*255|0,r=Math.min(255,Math.max(0,this.rgb.r+t)),i=Math.min(255,Math.max(0,this.rgb.g+t)),a=Math.min(255,Math.max(0,this.rgb.b+t)),o=n.rgb2hex(r,i,a);return new n(o)},n.prototype.toHex=function(e){return(e?"#":"")+this.raw.toString(16)},n.prototype.lighterThan=function(e){return e instanceof n||(e=new n(e)),this.yuv.y>e.yuv.y},n.prototype.blendAlpha=function(e){e instanceof n||(e=new n(e));var t=e,r=t.alpha*t.rgb.r+(1-t.alpha)*this.rgb.r,i=t.alpha*t.rgb.g+(1-t.alpha)*this.rgb.g,a=t.alpha*t.rgb.b+(1-t.alpha)*this.rgb.b;return new n(n.rgb2hex(r,i,a))},e.exports=n},function(e,t){e.exports={version:"2.9.4",svg_ns:"http://www.w3.org/2000/svg"}},function(e,t,n){var r=n(13),i=n(8),a=n(11),o=n(7),s=a.svg_ns,l=function(e){var t=e.tag,n=e.content||"";return delete e.tag,delete e.content,[t,n,e]};e.exports=function(e,t){var n,a=t.engineSettings.stylesheets.map(function(e){return'<?xml-stylesheet rel="stylesheet" href="'+e+'"?>'}).join("\n"),h="holder_"+Number(new Date).toString(16),d=e.root,c=d.children.holderTextGroup,u="#"+h+" text { "+(n=c.properties,o.cssProps({fill:n.fill,"font-weight":n.font.weight,"font-family":n.font.family+", monospace","font-size":n.font.size+n.font.units}))+" } ";c.y+=.8*c.textPositionData.boundingBox.height;var f=[];Object.keys(c.children).forEach(function(e){var t=c.children[e];Object.keys(t.children).forEach(function(e){var n=t.children[e],r=c.x+t.x+n.x,i=c.y+t.y+n.y,a=l({tag:"text",content:n.properties.text,x:r,y:i});f.push(a)})});var p,g,m,v,y=l({tag:"g",content:f}),w=null;if(d.children.holderBg.properties.outline){var b=d.children.holderBg.properties.outline;w=l({tag:"path",d:(p=d.children.holderBg.width,g=d.children.holderBg.height,m=b.width,v=m/2,["M",v,v,"H",p-v,"V",g-v,"H",v,"V",0,"M",0,v,"L",p,g-v,"M",0,g-v,"L",p,v].join(" ")),"stroke-width":b.width,stroke:b.fill,fill:"none"})}var x,S=(x=d.children.holderBg,l({tag:"rect",width:x.width,height:x.height,fill:x.properties.fill})),A=[];A.push(S),b&&A.push(w),A.push(y);var C=l({tag:"g",id:h,content:A}),E=l({tag:"style",content:u,type:"text/css"}),k=l({tag:"defs",content:E}),T=l({tag:"svg",content:[k,C],width:d.properties.width,height:d.properties.height,xmlns:s,viewBox:[0,0,d.properties.width,d.properties.height].join(" "),preserveAspectRatio:"none"}),F=r(T);return F=a+F[0],i.svgStringToDataURI(F,"background"===t.mode)}},function(e,t,n){n(14),e.exports=function e(t,n,r){"use strict";var i,a,o,s,l,h,d,c,u,f,p,g=1,m=!0;function v(e,t){if(null!==t&&!1!==t&&void 0!==t)return"string"!=typeof t&&"object"!=typeof t?String(t):t}function y(e){return e||0===e?String(e).replace(/&/g,"&").replace(/"/g,"""):""}if(r=r||{},"string"==typeof t[0])t[0]=(d={tag:(h=(l=t[0]).match(/^[\w-]+/))?h[0]:"div",attr:{},children:[]},c=l.match(/#([\w-]+)/),u=l.match(/\$([\w-]+)/),f=l.match(/\.[\w-]+/g),c&&(d.attr.id=c[1],r[c[1]]=d),u&&(r[u[1]]=d),f&&(d.attr.class=f.join(" ").replace(/\./g,"")),l.match(/&$/g)&&(m=!1),d);else{if(!Array.isArray(t[0]))throw new Error("First element of array must be a string, or an array and not "+JSON.stringify(t[0]));g=0}for(;g<t.length;g++){if(!1===t[g]||null===t[g]){t[0]=!1;break}if(void 0!==t[g]&&!0!==t[g])if("string"==typeof t[g])m&&(t[g]=(p=t[g],String(p).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">"))),t[0].children.push(t[g]);else if("number"==typeof t[g])t[0].children.push(t[g]);else if(Array.isArray(t[g])){if(Array.isArray(t[g][0])){if(t[g].reverse().forEach(function(e){t.splice(g+1,0,e)}),0!==g)continue;g++}e(t[g],n,r),t[g][0]&&t[0].children.push(t[g][0])}else if("function"==typeof t[g])o=t[g];else{if("object"!=typeof t[g])throw new TypeError('"'+t[g]+'" is not allowed as a value.');for(a in t[g])t[g].hasOwnProperty(a)&&null!==t[g][a]&&!1!==t[g][a]&&("style"===a&&"object"==typeof t[g][a]?t[0].attr[a]=JSON.stringify(t[g][a],v).slice(2,-2).replace(/","/g,";").replace(/":"/g,":").replace(/\\"/g,"'"):t[0].attr[a]=t[g][a])}}if(!1!==t[0]){for(s in i="<"+t[0].tag,t[0].attr)t[0].attr.hasOwnProperty(s)&&(i+=" "+s+'="'+y(t[0].attr[s])+'"');i+=">",t[0].children.forEach(function(e){i+=e}),i+="</"+t[0].tag+">",t[0]=i}return r[0]=t[0],o&&o(t[0]),r}},function(e,t){
/*!
* escape-html
* Copyright(c) 2012-2013 TJ Holowaychuk
* Copyright(c) 2015 Andreas Lubbe
* Copyright(c) 2015 Tiancheng "Timothy" Gu
* MIT Licensed
*/
"use strict";var n=/["'&<>]/;e.exports=function(e){var t,r=""+e,i=n.exec(r);if(!i)return r;var a="",o=0,s=0;for(o=i.index;o<r.length;o++){switch(r.charCodeAt(o)){case 34:t=""";break;case 38:t="&";break;case 39:t="'";break;case 60:t="<";break;case 62:t=">";break;default:continue}s!==o&&(a+=r.substring(s,o)),s=o+1,a+=t}return s!==o?a+r.substring(s,o):a}},function(e,t,n){var r,i,a=n(9),o=n(7);e.exports=(r=a.newEl("canvas"),i=null,function(e){null==i&&(i=r.getContext("2d"));var t=o.canvasRatio(),n=e.root;r.width=t*n.properties.width,r.height=t*n.properties.height,i.textBaseline="middle";var a=n.children.holderBg,s=t*a.width,l=t*a.height;i.fillStyle=a.properties.fill,i.fillRect(0,0,s,l),a.properties.outline&&(i.strokeStyle=a.properties.outline.fill,i.lineWidth=a.properties.outline.width,i.moveTo(1,1),i.lineTo(s-1,1),i.lineTo(s-1,l-1),i.lineTo(1,l-1),i.lineTo(1,1),i.moveTo(0,1),i.lineTo(s,l-1),i.moveTo(0,l-1),i.lineTo(s,1),i.stroke());var h=n.children.holderTextGroup;for(var d in i.font=h.properties.font.weight+" "+t*h.properties.font.size+h.properties.font.units+" "+h.properties.font.family+", monospace",i.fillStyle=h.properties.fill,h.children){var c=h.children[d];for(var u in c.children){var f=c.children[u],p=t*(h.x+c.x+f.x),g=t*(h.y+c.y+f.y+h.properties.leading/2);i.fillText(f.properties.text,p,g)}}return r.toDataURL("image/png")})}])},e.exports=r(),"undefined"!=typeof Meteor&&"undefined"!=typeof Package&&(Holder=this.Holder)}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC04MTk3MWZjY2VhNmY2ODVkYjcxNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ob2xkZXJqcy9ob2xkZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG5cbkhvbGRlciAtIGNsaWVudCBzaWRlIGltYWdlIHBsYWNlaG9sZGVyc1xuVmVyc2lvbiAyLjkuNCtjYWJpbFxuwqkgMjAxNiBJdmFuIE1hbG9waW5za3kgLSBodHRwOi8vaW1za3kuY29cblxuU2l0ZTogICAgIGh0dHA6Ly9ob2xkZXJqcy5jb21cbklzc3VlczogICBodHRwczovL2dpdGh1Yi5jb20vaW1za3kvaG9sZGVyL2lzc3Vlc1xuTGljZW5zZTogIE1JVFxuXG4qL1xuKGZ1bmN0aW9uICh3aW5kb3cpIHtcbiAgaWYgKCF3aW5kb3cuZG9jdW1lbnQpIHJldHVybjtcbiAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG4gIC8vaHR0cHM6Ly9naXRodWIuY29tL2luZXhvcmFibGV0YXNoL3BvbHlmaWxsL2Jsb2IvbWFzdGVyL3dlYi5qc1xuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCA9IGZ1bmN0aW9uIChzZWxlY3RvcnMpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSwgZWxlbWVudHMgPSBbXSwgZWxlbWVudDtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmZpcnN0Q2hpbGQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICBkb2N1bWVudC5fcXNhID0gW107XG5cbiAgICAgICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gc2VsZWN0b3JzICsgJ3t4LXFzYTpleHByZXNzaW9uKGRvY3VtZW50Ll9xc2EgJiYgZG9jdW1lbnQuX3FzYS5wdXNoKHRoaXMpKX0nO1xuICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgMCk7XG4gICAgICAgIHN0eWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuXG4gICAgICAgIHdoaWxlIChkb2N1bWVudC5fcXNhLmxlbmd0aCkge1xuICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5fcXNhLnNoaWZ0KCk7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVBdHRyaWJ1dGUoJ3gtcXNhJyk7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5fcXNhID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgPSBmdW5jdGlvbiAoc2VsZWN0b3JzKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKTtcbiAgICAgICAgcmV0dXJuIChlbGVtZW50cy5sZW5ndGgpID8gZWxlbWVudHNbMF0gOiBudWxsO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbiAoY2xhc3NOYW1lcykge1xuICAgICAgICBjbGFzc05hbWVzID0gU3RyaW5nKGNsYXNzTmFtZXMpLnJlcGxhY2UoL158XFxzKy9nLCAnLicpO1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjbGFzc05hbWVzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gIC8vaHR0cHM6Ly9naXRodWIuY29tL2luZXhvcmFibGV0YXNoL3BvbHlmaWxsXG4gIC8vIEVTNSAxNS4yLjMuMTQgT2JqZWN0LmtleXMgKCBPIClcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2tleXNcbiAgaWYgKCFPYmplY3Qua2V5cykge1xuICAgIE9iamVjdC5rZXlzID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIGlmIChvICE9PSBPYmplY3QobykpIHsgdGhyb3cgVHlwZUVycm9yKCdPYmplY3Qua2V5cyBjYWxsZWQgb24gbm9uLW9iamVjdCcpOyB9XG4gICAgICB2YXIgcmV0ID0gW10sIHA7XG4gICAgICBmb3IgKHAgaW4gbykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSB7XG4gICAgICAgICAgcmV0LnB1c2gocCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEVTNSAxNS40LjQuMTggQXJyYXkucHJvdG90eXBlLmZvckVhY2ggKCBjYWxsYmFja2ZuIFsgLCB0aGlzQXJnIF0gKVxuICAvLyBGcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2hcbiAgaWYgKCFBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGZ1biAvKiwgdGhpc3AgKi8pIHtcbiAgICAgIGlmICh0aGlzID09PSB2b2lkIDAgfHwgdGhpcyA9PT0gbnVsbCkgeyB0aHJvdyBUeXBlRXJyb3IoKTsgfVxuXG4gICAgICB2YXIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcbiAgICAgIGlmICh0eXBlb2YgZnVuICE9PSBcImZ1bmN0aW9uXCIpIHsgdGhyb3cgVHlwZUVycm9yKCk7IH1cblxuICAgICAgdmFyIHRoaXNwID0gYXJndW1lbnRzWzFdLCBpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChpIGluIHQpIHtcbiAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgdFtpXSwgaSwgdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy9odHRwczovL2dpdGh1Yi5jb20vaW5leG9yYWJsZXRhc2gvcG9seWZpbGwvYmxvYi9tYXN0ZXIvd2ViLmpzXG4gIChmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gICAgdmFyIEI2NF9BTFBIQUJFVCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG4gICAgZ2xvYmFsLmF0b2IgPSBnbG9iYWwuYXRvYiB8fCBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgIGlucHV0ID0gU3RyaW5nKGlucHV0KTtcbiAgICAgIHZhciBwb3NpdGlvbiA9IDAsXG4gICAgICAgICAgb3V0cHV0ID0gW10sXG4gICAgICAgICAgYnVmZmVyID0gMCwgYml0cyA9IDAsIG47XG5cbiAgICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgIGlmICgoaW5wdXQubGVuZ3RoICUgNCkgPT09IDApIHsgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC89KyQvLCAnJyk7IH1cbiAgICAgIGlmICgoaW5wdXQubGVuZ3RoICUgNCkgPT09IDEpIHsgdGhyb3cgRXJyb3IoJ0ludmFsaWRDaGFyYWN0ZXJFcnJvcicpOyB9XG4gICAgICBpZiAoL1teKy8wLTlBLVphLXpdLy50ZXN0KGlucHV0KSkgeyB0aHJvdyBFcnJvcignSW52YWxpZENoYXJhY3RlckVycm9yJyk7IH1cblxuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIG4gPSBCNjRfQUxQSEFCRVQuaW5kZXhPZihpbnB1dC5jaGFyQXQocG9zaXRpb24pKTtcbiAgICAgICAgYnVmZmVyID0gKGJ1ZmZlciA8PCA2KSB8IG47XG4gICAgICAgIGJpdHMgKz0gNjtcblxuICAgICAgICBpZiAoYml0cyA9PT0gMjQpIHtcbiAgICAgICAgICBvdXRwdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKChidWZmZXIgPj4gMTYpICYgMHhGRikpO1xuICAgICAgICAgIG91dHB1dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKGJ1ZmZlciA+PiAgOCkgJiAweEZGKSk7XG4gICAgICAgICAgb3V0cHV0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShidWZmZXIgJiAweEZGKSk7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgYnVmZmVyID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwb3NpdGlvbiArPSAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoYml0cyA9PT0gMTIpIHtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyID4+IDQ7XG4gICAgICAgIG91dHB1dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmZmVyICYgMHhGRikpO1xuICAgICAgfSBlbHNlIGlmIChiaXRzID09PSAxOCkge1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgPj4gMjtcbiAgICAgICAgb3V0cHV0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgoYnVmZmVyID4+IDgpICYgMHhGRikpO1xuICAgICAgICBvdXRwdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZmZlciAmIDB4RkYpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbiAgICB9O1xuXG4gICAgZ2xvYmFsLmJ0b2EgPSBnbG9iYWwuYnRvYSB8fCBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgIGlucHV0ID0gU3RyaW5nKGlucHV0KTtcbiAgICAgIHZhciBwb3NpdGlvbiA9IDAsXG4gICAgICAgICAgb3V0ID0gW10sXG4gICAgICAgICAgbzEsIG8yLCBvMyxcbiAgICAgICAgICBlMSwgZTIsIGUzLCBlNDtcblxuICAgICAgaWYgKC9bXlxceDAwLVxceEZGXS8udGVzdChpbnB1dCkpIHsgdGhyb3cgRXJyb3IoJ0ludmFsaWRDaGFyYWN0ZXJFcnJvcicpOyB9XG5cbiAgICAgIHdoaWxlIChwb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgICBvMSA9IGlucHV0LmNoYXJDb2RlQXQocG9zaXRpb24rKyk7XG4gICAgICAgIG8yID0gaW5wdXQuY2hhckNvZGVBdChwb3NpdGlvbisrKTtcbiAgICAgICAgbzMgPSBpbnB1dC5jaGFyQ29kZUF0KHBvc2l0aW9uKyspO1xuXG4gICAgICAgIC8vIDExMTExMSAxMTIyMjIgMjIyMjMzIDMzMzMzM1xuICAgICAgICBlMSA9IG8xID4+IDI7XG4gICAgICAgIGUyID0gKChvMSAmIDB4MykgPDwgNCkgfCAobzIgPj4gNCk7XG4gICAgICAgIGUzID0gKChvMiAmIDB4ZikgPDwgMikgfCAobzMgPj4gNik7XG4gICAgICAgIGU0ID0gbzMgJiAweDNmO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gaW5wdXQubGVuZ3RoICsgMikge1xuICAgICAgICAgIGUzID0gNjQ7IGU0ID0gNjQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9zaXRpb24gPT09IGlucHV0Lmxlbmd0aCArIDEpIHtcbiAgICAgICAgICBlNCA9IDY0O1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0LnB1c2goQjY0X0FMUEhBQkVULmNoYXJBdChlMSksXG4gICAgICAgICAgICAgICAgIEI2NF9BTFBIQUJFVC5jaGFyQXQoZTIpLFxuICAgICAgICAgICAgICAgICBCNjRfQUxQSEFCRVQuY2hhckF0KGUzKSxcbiAgICAgICAgICAgICAgICAgQjY0X0FMUEhBQkVULmNoYXJBdChlNCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3V0LmpvaW4oJycpO1xuICAgIH07XG4gIH0od2luZG93KSk7XG5cbiAgLy9odHRwczovL2dpc3QuZ2l0aHViLmNvbS9qaW1laC8zMzIzNTdcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KXtcbiAgICAgIC8qanNoaW50IC1XMDAxLCAtVzEwMyAqL1xuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgIHZhciBwcm90byA9IHRoaXMuX19wcm90b19fIHx8IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgICAgcmV0dXJuIChwcm9wIGluIHRoaXMpICYmICghKHByb3AgaW4gcHJvdG8pIHx8IHByb3RvW3Byb3BdICE9PSB0aGlzW3Byb3BdKTtcbiAgICB9O1xuICAgICAgLypqc2hpbnQgK1cwMDEsICtXMTAzICovXG4gIH1cblxuICAvLyBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gIC8vIGNvcHlyaWdodCBQYXVsIElyaXNoIDIwMTVcblxuXG4gIC8vIERhdGUubm93KCkgaXMgc3VwcG9ydGVkIGV2ZXJ5d2hlcmUgZXhjZXB0IElFOC4gRm9yIElFOCB3ZSB1c2UgdGhlIERhdGUubm93IHBvbHlmaWxsXG4gIC8vICAgZ2l0aHViLmNvbS9GaW5hbmNpYWwtVGltZXMvcG9seWZpbGwtc2VydmljZS9ibG9iL21hc3Rlci9wb2x5ZmlsbHMvRGF0ZS5ub3cvcG9seWZpbGwuanNcbiAgLy8gYXMgU2FmYXJpIDYgZG9lc24ndCBoYXZlIHN1cHBvcnQgZm9yIE5hdmlnYXRpb25UaW1pbmcsIHdlIHVzZSBhIERhdGUubm93KCkgdGltZXN0YW1wIGZvciByZWxhdGl2ZSB2YWx1ZXNcblxuICAvLyBpZiB5b3Ugd2FudCB2YWx1ZXMgc2ltaWxhciB0byB3aGF0IHlvdSdkIGdldCB3aXRoIHJlYWwgcGVyZi5ub3csIHBsYWNlIHRoaXMgdG93YXJkcyB0aGUgaGVhZCBvZiB0aGUgcGFnZVxuICAvLyBidXQgaW4gcmVhbGl0eSwgeW91J3JlIGp1c3QgZ2V0dGluZyB0aGUgZGVsdGEgYmV0d2VlbiBub3coKSBjYWxscywgc28gaXQncyBub3QgdGVycmlibHkgaW1wb3J0YW50IHdoZXJlIGl0J3MgcGxhY2VkXG5cblxuICAoZnVuY3Rpb24oKXtcblxuICAgIGlmICgncGVyZm9ybWFuY2UnIGluIHdpbmRvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgd2luZG93LnBlcmZvcm1hbmNlID0ge307XG4gICAgfVxuICAgIFxuICAgIERhdGUubm93ID0gKERhdGUubm93IHx8IGZ1bmN0aW9uICgpIHsgIC8vIHRoYW5rcyBJRThcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9KTtcblxuICAgIGlmICgnbm93JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UgPT09IGZhbHNlKXtcbiAgICAgIFxuICAgICAgdmFyIG5vd09mZnNldCA9IERhdGUubm93KCk7XG4gICAgICBcbiAgICAgIGlmIChwZXJmb3JtYW5jZS50aW1pbmcgJiYgcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCl7XG4gICAgICAgIG5vd09mZnNldCA9IHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3cgPSBmdW5jdGlvbiBub3coKXtcbiAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBub3dPZmZzZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICB9KSgpO1xuXG4gIC8vcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHBvbHlmaWxsIGZvciBvbGRlciBGaXJlZm94L0Nocm9tZSB2ZXJzaW9uc1xuICBpZiAoIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICBpZiAod2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSAmJiB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUpIHtcbiAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9GaW5hbmNpYWwtVGltZXMvcG9seWZpbGwtc2VydmljZS9ibG9iL21hc3Rlci9wb2x5ZmlsbHMvcmVxdWVzdEFuaW1hdGlvbkZyYW1lL3BvbHlmaWxsLXdlYmtpdC5qc1xuICAgIChmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gICAgICBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrKGdsb2JhbC5wZXJmb3JtYW5jZS5ub3coKSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgZ2xvYmFsLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZ2xvYmFsLndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lO1xuICAgIH0od2luZG93KSk7XG4gICAgfSBlbHNlIGlmICh3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lICYmIHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSkge1xuICAgICAgLy9odHRwczovL2dpdGh1Yi5jb20vRmluYW5jaWFsLVRpbWVzL3BvbHlmaWxsLXNlcnZpY2UvYmxvYi9tYXN0ZXIvcG9seWZpbGxzL3JlcXVlc3RBbmltYXRpb25GcmFtZS9wb2x5ZmlsbC1tb3ouanNcbiAgICAoZnVuY3Rpb24gKGdsb2JhbCkge1xuICAgICAgZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gbW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsYmFjayhnbG9iYWwucGVyZm9ybWFuY2Uubm93KCkpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGdsb2JhbC5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGdsb2JhbC5tb3pDYW5jZWxBbmltYXRpb25GcmFtZTtcbiAgICB9KHdpbmRvdykpO1xuICAgIH0gZWxzZSB7XG4gICAgKGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAgIGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbC5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xuICAgICAgfTtcblxuICAgICAgZ2xvYmFsLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZ2xvYmFsLmNsZWFyVGltZW91dDtcbiAgICB9KSh3aW5kb3cpO1xuICAgIH1cbiAgfVxufSkodGhpcyk7XG5cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkhvbGRlclwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJIb2xkZXJcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0SG9sZGVyLmpzIC0gY2xpZW50IHNpZGUgaW1hZ2UgcGxhY2Vob2xkZXJzXG5cdChjKSAyMDEyLTIwMTUgSXZhbiBNYWxvcGluc2t5IC0gaHR0cDovL2ltc2t5LmNvXG5cdCovXG5cblx0bW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5cbi8qKiovIH0sXG4vKiAxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7Lypcblx0SG9sZGVyLmpzIC0gY2xpZW50IHNpZGUgaW1hZ2UgcGxhY2Vob2xkZXJzXG5cdChjKSAyMDEyLTIwMTYgSXZhbiBNYWxvcGluc2t5IC0gaHR0cDovL2ltc2t5LmNvXG5cdCovXG5cblx0Ly9MaWJyYXJpZXMgYW5kIGZ1bmN0aW9uc1xuXHR2YXIgb25Eb21SZWFkeSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdHZhciBxdWVyeXN0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblx0dmFyIFNjZW5lR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHR2YXIgdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXHR2YXIgU1ZHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIERPTSA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdHZhciBDb2xvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXHR2YXIgY29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cblx0dmFyIHN2Z1JlbmRlcmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cdHZhciBzZ0NhbnZhc1JlbmRlcmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG5cblx0dmFyIGV4dGVuZCA9IHV0aWxzLmV4dGVuZDtcblx0dmFyIGRpbWVuc2lvbkNoZWNrID0gdXRpbHMuZGltZW5zaW9uQ2hlY2s7XG5cblx0Ly9Db25zdGFudHMgYW5kIGRlZmluaXRpb25zXG5cdHZhciBTVkdfTlMgPSBjb25zdGFudHMuc3ZnX25zO1xuXG5cdHZhciBIb2xkZXIgPSB7XG5cdCAgICB2ZXJzaW9uOiBjb25zdGFudHMudmVyc2lvbixcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBZGRzIGEgdGhlbWUgdG8gZGVmYXVsdCBzZXR0aW5nc1xuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZW1lIG5hbWVcblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0aGVtZSBUaGVtZSBvYmplY3QsIHdpdGggZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgc2l6ZSwgZm9udCwgYW5kIGZvbnR3ZWlnaHQgcHJvcGVydGllcy5cblx0ICAgICAqL1xuXHQgICAgYWRkVGhlbWU6IGZ1bmN0aW9uKG5hbWUsIHRoZW1lKSB7XG5cdCAgICAgICAgbmFtZSAhPSBudWxsICYmIHRoZW1lICE9IG51bGwgJiYgKEFwcC5zZXR0aW5ncy50aGVtZXNbbmFtZV0gPSB0aGVtZSk7XG5cdCAgICAgICAgZGVsZXRlIEFwcC52YXJzLmNhY2hlLnRoZW1lS2V5cztcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH0sXG5cblx0ICAgIC8qKlxuXHQgICAgICogQXBwZW5kcyBhIHBsYWNlaG9sZGVyIHRvIGFuIGVsZW1lbnRcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIFBsYWNlaG9sZGVyIFVSTCBzdHJpbmdcblx0ICAgICAqIEBwYXJhbSBlbCBBIHNlbGVjdG9yIG9yIGEgcmVmZXJlbmNlIHRvIGEgRE9NIG5vZGVcblx0ICAgICAqL1xuXHQgICAgYWRkSW1hZ2U6IGZ1bmN0aW9uKHNyYywgZWwpIHtcblx0ICAgICAgICAvL3RvZG86IHVzZSBqcXVlcnkgZmFsbGJhY2sgaWYgYXZhaWxhYmxlIGZvciBhbGwgUVNBIHJlZmVyZW5jZXNcblx0ICAgICAgICB2YXIgbm9kZXMgPSBET00uZ2V0Tm9kZUFycmF5KGVsKTtcblx0ICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICAgIHZhciBpbWcgPSBET00ubmV3RWwoJ2ltZycpO1xuXHQgICAgICAgICAgICB2YXIgZG9tUHJvcHMgPSB7fTtcblx0ICAgICAgICAgICAgZG9tUHJvcHNbQXBwLnNldHVwLmRhdGFBdHRyXSA9IHNyYztcblx0ICAgICAgICAgICAgRE9NLnNldEF0dHIoaW1nLCBkb21Qcm9wcyk7XG5cdCAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoaW1nKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH0sXG5cblx0ICAgIC8qKlxuXHQgICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCBhbiBpbWFnZSBpcyB1cGRhdGVkIG9uIHJlc2l6ZS5cblx0ICAgICAqIElmIGFuIGltYWdlIGlzIHNldCB0byBiZSB1cGRhdGVkLCBpdCBpcyBpbW1lZGlhdGVseSByZW5kZXJlZC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgSW1hZ2UgRE9NIGVsZW1lbnRcblx0ICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdmFsdWUgUmVzaXphYmxlIHVwZGF0ZSBmbGFnIHZhbHVlXG5cdCAgICAgKi9cblx0ICAgIHNldFJlc2l6ZVVwZGF0ZTogZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG5cdCAgICAgICAgaWYgKGVsLmhvbGRlckRhdGEpIHtcblx0ICAgICAgICAgICAgZWwuaG9sZGVyRGF0YS5yZXNpemVVcGRhdGUgPSAhIXZhbHVlO1xuXHQgICAgICAgICAgICBpZiAoZWwuaG9sZGVyRGF0YS5yZXNpemVVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHVwZGF0ZVJlc2l6YWJsZUVsZW1lbnRzKGVsKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cblx0ICAgIC8qKlxuXHQgICAgICogUnVucyBIb2xkZXIgd2l0aCBvcHRpb25zLiBCeSBkZWZhdWx0IHJ1bnMgSG9sZGVyIG9uIGFsbCBpbWFnZXMgd2l0aCBcImhvbGRlci5qc1wiIGluIHRoZWlyIHNvdXJjZSBhdHRyaWJ1dGVzLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1c2VyT3B0aW9ucyBPcHRpb25zIG9iamVjdCwgY2FuIGNvbnRhaW4gZG9tYWluLCB0aGVtZXMsIGltYWdlcywgYW5kIGJnbm9kZXMgcHJvcGVydGllc1xuXHQgICAgICovXG5cdCAgICBydW46IGZ1bmN0aW9uKHVzZXJPcHRpb25zKSB7XG5cdCAgICAgICAgLy90b2RvOiBzcGxpdCBwcm9jZXNzaW5nIGludG8gc2VwYXJhdGUgcXVldWVzXG5cdCAgICAgICAgdXNlck9wdGlvbnMgPSB1c2VyT3B0aW9ucyB8fCB7fTtcblx0ICAgICAgICB2YXIgZW5naW5lU2V0dGluZ3MgPSB7fTtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IGV4dGVuZChBcHAuc2V0dGluZ3MsIHVzZXJPcHRpb25zKTtcblxuXHQgICAgICAgIEFwcC52YXJzLnByZWVtcHRlZCA9IHRydWU7XG5cdCAgICAgICAgQXBwLnZhcnMuZGF0YUF0dHIgPSBvcHRpb25zLmRhdGFBdHRyIHx8IEFwcC5zZXR1cC5kYXRhQXR0cjtcblxuXHQgICAgICAgIGVuZ2luZVNldHRpbmdzLnJlbmRlcmVyID0gb3B0aW9ucy5yZW5kZXJlciA/IG9wdGlvbnMucmVuZGVyZXIgOiBBcHAuc2V0dXAucmVuZGVyZXI7XG5cdCAgICAgICAgaWYgKEFwcC5zZXR1cC5yZW5kZXJlcnMuam9pbignLCcpLmluZGV4T2YoZW5naW5lU2V0dGluZ3MucmVuZGVyZXIpID09PSAtMSkge1xuXHQgICAgICAgICAgICBlbmdpbmVTZXR0aW5ncy5yZW5kZXJlciA9IEFwcC5zZXR1cC5zdXBwb3J0c1NWRyA/ICdzdmcnIDogKEFwcC5zZXR1cC5zdXBwb3J0c0NhbnZhcyA/ICdjYW52YXMnIDogJ2h0bWwnKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgaW1hZ2VzID0gRE9NLmdldE5vZGVBcnJheShvcHRpb25zLmltYWdlcyk7XG5cdCAgICAgICAgdmFyIGJnbm9kZXMgPSBET00uZ2V0Tm9kZUFycmF5KG9wdGlvbnMuYmdub2Rlcyk7XG5cdCAgICAgICAgdmFyIHN0eWxlbm9kZXMgPSBET00uZ2V0Tm9kZUFycmF5KG9wdGlvbnMuc3R5bGVub2Rlcyk7XG5cdCAgICAgICAgdmFyIG9iamVjdHMgPSBET00uZ2V0Tm9kZUFycmF5KG9wdGlvbnMub2JqZWN0cyk7XG5cblx0ICAgICAgICBlbmdpbmVTZXR0aW5ncy5zdHlsZXNoZWV0cyA9IFtdO1xuXHQgICAgICAgIGVuZ2luZVNldHRpbmdzLnN2Z1hNTFN0eWxlc2hlZXQgPSB0cnVlO1xuXHQgICAgICAgIGVuZ2luZVNldHRpbmdzLm5vRm9udEZhbGxiYWNrID0gISFvcHRpb25zLm5vRm9udEZhbGxiYWNrO1xuXHQgICAgICAgIGVuZ2luZVNldHRpbmdzLm5vQmFja2dyb3VuZFNpemUgPSAhIW9wdGlvbnMubm9CYWNrZ3JvdW5kU2l6ZTtcblxuXHQgICAgICAgIHN0eWxlbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVOb2RlKSB7XG5cdCAgICAgICAgICAgIGlmIChzdHlsZU5vZGUuYXR0cmlidXRlcy5yZWwgJiYgc3R5bGVOb2RlLmF0dHJpYnV0ZXMuaHJlZiAmJiBzdHlsZU5vZGUuYXR0cmlidXRlcy5yZWwudmFsdWUgPT0gJ3N0eWxlc2hlZXQnKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgaHJlZiA9IHN0eWxlTm9kZS5hdHRyaWJ1dGVzLmhyZWYudmFsdWU7XG5cdCAgICAgICAgICAgICAgICAvL3RvZG86IHdyaXRlIGlzb21vcnBoaWMgcmVsYXRpdmUtdG8tYWJzb2x1dGUgVVJMIGZ1bmN0aW9uXG5cdCAgICAgICAgICAgICAgICB2YXIgcHJveHlMaW5rID0gRE9NLm5ld0VsKCdhJyk7XG5cdCAgICAgICAgICAgICAgICBwcm94eUxpbmsuaHJlZiA9IGhyZWY7XG5cdCAgICAgICAgICAgICAgICB2YXIgc3R5bGVzaGVldFVSTCA9IHByb3h5TGluay5wcm90b2NvbCArICcvLycgKyBwcm94eUxpbmsuaG9zdCArIHByb3h5TGluay5wYXRobmFtZSArIHByb3h5TGluay5zZWFyY2g7XG5cdCAgICAgICAgICAgICAgICBlbmdpbmVTZXR0aW5ncy5zdHlsZXNoZWV0cy5wdXNoKHN0eWxlc2hlZXRVUkwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICBiZ25vZGVzLmZvckVhY2goZnVuY3Rpb24gKGJnTm9kZSkge1xuXHQgICAgICAgICAgICAvL1NraXAgcHJvY2Vzc2luZyBiYWNrZ3JvdW5kIG5vZGVzIGlmIGdldENvbXB1dGVkU3R5bGUgaXMgdW5hdmFpbGFibGUsIHNpbmNlIG9ubHkgbW9kZXJuIGJyb3dzZXJzIHdvdWxkIGJlIGFibGUgdG8gdXNlIGNhbnZhcyBvciBTVkcgdG8gcmVuZGVyIHRvIGJhY2tncm91bmRcblx0ICAgICAgICAgICAgaWYgKCFnbG9iYWwuZ2V0Q29tcHV0ZWRTdHlsZSkgcmV0dXJuO1xuXHQgICAgICAgICAgICB2YXIgYmFja2dyb3VuZEltYWdlID0gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGUoYmdOb2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWltYWdlJyk7XG5cdCAgICAgICAgICAgIHZhciBkYXRhQmFja2dyb3VuZEltYWdlID0gYmdOb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1iYWNrZ3JvdW5kLXNyYycpO1xuXHQgICAgICAgICAgICB2YXIgcmF3VVJMID0gZGF0YUJhY2tncm91bmRJbWFnZSB8fCBiYWNrZ3JvdW5kSW1hZ2U7XG5cblx0ICAgICAgICAgICAgdmFyIGhvbGRlclVSTCA9IG51bGw7XG5cdCAgICAgICAgICAgIHZhciBob2xkZXJTdHJpbmcgPSBvcHRpb25zLmRvbWFpbiArICcvJztcblx0ICAgICAgICAgICAgdmFyIGhvbGRlclN0cmluZ0luZGV4ID0gcmF3VVJMLmluZGV4T2YoaG9sZGVyU3RyaW5nKTtcblxuXHQgICAgICAgICAgICBpZiAoaG9sZGVyU3RyaW5nSW5kZXggPT09IDApIHtcblx0ICAgICAgICAgICAgICAgIGhvbGRlclVSTCA9IHJhd1VSTDtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChob2xkZXJTdHJpbmdJbmRleCA9PT0gMSAmJiByYXdVUkxbMF0gPT09ICc/Jykge1xuXHQgICAgICAgICAgICAgICAgaG9sZGVyVVJMID0gcmF3VVJMLnNsaWNlKDEpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIGZyYWdtZW50ID0gcmF3VVJMLnN1YnN0cihob2xkZXJTdHJpbmdJbmRleCkubWF0Y2goLyhbXlxcXCJdKilcIj9cXCkvKTtcblx0ICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGhvbGRlclVSTCA9IGZyYWdtZW50WzFdO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyYXdVUkwuaW5kZXhPZigndXJsKCcpID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ0hvbGRlcjogdW5hYmxlIHRvIHBhcnNlIGJhY2tncm91bmQgVVJMOiAnICsgcmF3VVJMO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKGhvbGRlclVSTCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGhvbGRlckZsYWdzID0gcGFyc2VVUkwoaG9sZGVyVVJMLCBvcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgIGlmIChob2xkZXJGbGFncykge1xuXHQgICAgICAgICAgICAgICAgICAgIHByZXBhcmVET01FbGVtZW50KHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2JhY2tncm91bmQnLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbDogYmdOb2RlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczogaG9sZGVyRmxhZ3MsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVNldHRpbmdzOiBlbmdpbmVTZXR0aW5nc1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICBvYmplY3RzLmZvckVhY2goZnVuY3Rpb24gKG9iamVjdCkge1xuXHQgICAgICAgICAgICB2YXIgb2JqZWN0QXR0ciA9IHt9O1xuXG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBvYmplY3RBdHRyLmRhdGEgPSBvYmplY3QuZ2V0QXR0cmlidXRlKCdkYXRhJyk7XG5cdCAgICAgICAgICAgICAgICBvYmplY3RBdHRyLmRhdGFTcmMgPSBvYmplY3QuZ2V0QXR0cmlidXRlKEFwcC52YXJzLmRhdGFBdHRyKTtcblx0ICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuXHQgICAgICAgICAgICB2YXIgb2JqZWN0SGFzU3JjVVJMID0gb2JqZWN0QXR0ci5kYXRhICE9IG51bGwgJiYgb2JqZWN0QXR0ci5kYXRhLmluZGV4T2Yob3B0aW9ucy5kb21haW4pID09PSAwO1xuXHQgICAgICAgICAgICB2YXIgb2JqZWN0SGFzRGF0YVNyY1VSTCA9IG9iamVjdEF0dHIuZGF0YVNyYyAhPSBudWxsICYmIG9iamVjdEF0dHIuZGF0YVNyYy5pbmRleE9mKG9wdGlvbnMuZG9tYWluKSA9PT0gMDtcblxuXHQgICAgICAgICAgICBpZiAob2JqZWN0SGFzU3JjVVJMKSB7XG5cdCAgICAgICAgICAgICAgICBwcmVwYXJlSW1hZ2VFbGVtZW50KG9wdGlvbnMsIGVuZ2luZVNldHRpbmdzLCBvYmplY3RBdHRyLmRhdGEsIG9iamVjdCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0SGFzRGF0YVNyY1VSTCkge1xuXHQgICAgICAgICAgICAgICAgcHJlcGFyZUltYWdlRWxlbWVudChvcHRpb25zLCBlbmdpbmVTZXR0aW5ncywgb2JqZWN0QXR0ci5kYXRhU3JjLCBvYmplY3QpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICBpbWFnZXMuZm9yRWFjaChmdW5jdGlvbiAoaW1hZ2UpIHtcblx0ICAgICAgICAgICAgdmFyIGltYWdlQXR0ciA9IHt9O1xuXG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBpbWFnZUF0dHIuc3JjID0gaW1hZ2UuZ2V0QXR0cmlidXRlKCdzcmMnKTtcblx0ICAgICAgICAgICAgICAgIGltYWdlQXR0ci5kYXRhU3JjID0gaW1hZ2UuZ2V0QXR0cmlidXRlKEFwcC52YXJzLmRhdGFBdHRyKTtcblx0ICAgICAgICAgICAgICAgIGltYWdlQXR0ci5yZW5kZXJlZCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnZGF0YS1ob2xkZXItcmVuZGVyZWQnKTtcblx0ICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuXHQgICAgICAgICAgICB2YXIgaW1hZ2VIYXNTcmMgPSBpbWFnZUF0dHIuc3JjICE9IG51bGw7XG5cdCAgICAgICAgICAgIHZhciBpbWFnZUhhc0RhdGFTcmNVUkwgPSBpbWFnZUF0dHIuZGF0YVNyYyAhPSBudWxsICYmIGltYWdlQXR0ci5kYXRhU3JjLmluZGV4T2Yob3B0aW9ucy5kb21haW4pID09PSAwO1xuXHQgICAgICAgICAgICB2YXIgaW1hZ2VSZW5kZXJlZCA9IGltYWdlQXR0ci5yZW5kZXJlZCAhPSBudWxsICYmIGltYWdlQXR0ci5yZW5kZXJlZCA9PSAndHJ1ZSc7XG5cblx0ICAgICAgICAgICAgaWYgKGltYWdlSGFzU3JjKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoaW1hZ2VBdHRyLnNyYy5pbmRleE9mKG9wdGlvbnMuZG9tYWluKSA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHByZXBhcmVJbWFnZUVsZW1lbnQob3B0aW9ucywgZW5naW5lU2V0dGluZ3MsIGltYWdlQXR0ci5zcmMsIGltYWdlKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2VIYXNEYXRhU3JjVVJMKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9JbWFnZSBoYXMgYSB2YWxpZCBkYXRhLXNyYyBhbmQgYW4gaW52YWxpZCBzcmNcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VSZW5kZXJlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBwbGFjZWhvbGRlciBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlciwgcmUtcmVuZGVyIGl0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVJbWFnZUVsZW1lbnQob3B0aW9ucywgZW5naW5lU2V0dGluZ3MsIGltYWdlQXR0ci5kYXRhU3JjLCBpbWFnZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgcGxhY2Vob2xkZXIgaGFzIG5vdCBiZWVuIHJlbmRlcmVkLCBjaGVjayBpZiB0aGUgaW1hZ2UgZXhpc3RzIGFuZCByZW5kZXIgYSBmYWxsYmFjayBpZiBpdCBkb2Vzbid0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbihzcmMsIG9wdGlvbnMsIGVuZ2luZVNldHRpbmdzLCBkYXRhU3JjLCBpbWFnZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuaW1hZ2VFeGlzdHMoc3JjLCBmdW5jdGlvbihleGlzdHMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlSW1hZ2VFbGVtZW50KG9wdGlvbnMsIGVuZ2luZVNldHRpbmdzLCBkYXRhU3JjLCBpbWFnZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pKGltYWdlQXR0ci5zcmMsIG9wdGlvbnMsIGVuZ2luZVNldHRpbmdzLCBpbWFnZUF0dHIuZGF0YVNyYywgaW1hZ2UpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChpbWFnZUhhc0RhdGFTcmNVUkwpIHtcblx0ICAgICAgICAgICAgICAgIHByZXBhcmVJbWFnZUVsZW1lbnQob3B0aW9ucywgZW5naW5lU2V0dGluZ3MsIGltYWdlQXR0ci5kYXRhU3JjLCBpbWFnZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHR9O1xuXG5cdHZhciBBcHAgPSB7XG5cdCAgICBzZXR0aW5nczoge1xuXHQgICAgICAgIGRvbWFpbjogJ2hvbGRlci5qcycsXG5cdCAgICAgICAgaW1hZ2VzOiAnaW1nJyxcblx0ICAgICAgICBvYmplY3RzOiAnb2JqZWN0Jyxcblx0ICAgICAgICBiZ25vZGVzOiAnYm9keSAuaG9sZGVyanMnLFxuXHQgICAgICAgIHN0eWxlbm9kZXM6ICdoZWFkIGxpbmsuaG9sZGVyanMnLFxuXHQgICAgICAgIHRoZW1lczoge1xuXHQgICAgICAgICAgICAnZ3JheSc6IHtcblx0ICAgICAgICAgICAgICAgIGJnOiAnI0VFRUVFRScsXG5cdCAgICAgICAgICAgICAgICBmZzogJyNBQUFBQUEnXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICdzb2NpYWwnOiB7XG5cdCAgICAgICAgICAgICAgICBiZzogJyMzYTVhOTcnLFxuXHQgICAgICAgICAgICAgICAgZmc6ICcjRkZGRkZGJ1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAnaW5kdXN0cmlhbCc6IHtcblx0ICAgICAgICAgICAgICAgIGJnOiAnIzQzNEE1MicsXG5cdCAgICAgICAgICAgICAgICBmZzogJyNDMkYyMDAnXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICdza3knOiB7XG5cdCAgICAgICAgICAgICAgICBiZzogJyMwRDhGREInLFxuXHQgICAgICAgICAgICAgICAgZmc6ICcjRkZGRkZGJ1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAndmluZSc6IHtcblx0ICAgICAgICAgICAgICAgIGJnOiAnIzM5REJBQycsXG5cdCAgICAgICAgICAgICAgICBmZzogJyMxRTI5MkMnXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICdsYXZhJzoge1xuXHQgICAgICAgICAgICAgICAgYmc6ICcjRjg1OTFBJyxcblx0ICAgICAgICAgICAgICAgIGZnOiAnIzFDMjg0Nidcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBkZWZhdWx0czoge1xuXHQgICAgICAgIHNpemU6IDEwLFxuXHQgICAgICAgIHVuaXRzOiAncHQnLFxuXHQgICAgICAgIHNjYWxlOiAxIC8gMTZcblx0ICAgIH1cblx0fTtcblxuXHQvKipcblx0ICogUHJvY2Vzc2VzIHByb3ZpZGVkIHNvdXJjZSBhdHRyaWJ1dGUgYW5kIHNldHMgdXAgdGhlIGFwcHJvcHJpYXRlIHJlbmRlcmluZyB3b3JrZmxvd1xuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0gb3B0aW9ucyBJbnN0YW5jZSBvcHRpb25zIGZyb20gSG9sZGVyLnJ1blxuXHQgKiBAcGFyYW0gcmVuZGVyU2V0dGluZ3MgSW5zdGFuY2UgY29uZmlndXJhdGlvblxuXHQgKiBAcGFyYW0gc3JjIEltYWdlIFVSTFxuXHQgKiBAcGFyYW0gZWwgSW1hZ2UgRE9NIGVsZW1lbnRcblx0ICovXG5cdGZ1bmN0aW9uIHByZXBhcmVJbWFnZUVsZW1lbnQob3B0aW9ucywgZW5naW5lU2V0dGluZ3MsIHNyYywgZWwpIHtcblx0ICAgIHZhciBob2xkZXJGbGFncyA9IHBhcnNlVVJMKHNyYy5zdWJzdHIoc3JjLmxhc3RJbmRleE9mKG9wdGlvbnMuZG9tYWluKSksIG9wdGlvbnMpO1xuXHQgICAgaWYgKGhvbGRlckZsYWdzKSB7XG5cdCAgICAgICAgcHJlcGFyZURPTUVsZW1lbnQoe1xuXHQgICAgICAgICAgICBtb2RlOiBudWxsLFxuXHQgICAgICAgICAgICBlbDogZWwsXG5cdCAgICAgICAgICAgIGZsYWdzOiBob2xkZXJGbGFncyxcblx0ICAgICAgICAgICAgZW5naW5lU2V0dGluZ3M6IGVuZ2luZVNldHRpbmdzXG5cdCAgICAgICAgfSk7XG5cdCAgICB9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2Vzc2VzIGEgSG9sZGVyIFVSTCBhbmQgZXh0cmFjdHMgY29uZmlndXJhdGlvbiBmcm9tIHF1ZXJ5IHN0cmluZ1xuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0gdXJsIFVSTFxuXHQgKiBAcGFyYW0gaW5zdGFuY2VPcHRpb25zIEluc3RhbmNlIG9wdGlvbnMgZnJvbSBIb2xkZXIucnVuXG5cdCAqL1xuXHRmdW5jdGlvbiBwYXJzZVVSTCh1cmwsIGluc3RhbmNlT3B0aW9ucykge1xuXHQgICAgdmFyIGhvbGRlciA9IHtcblx0ICAgICAgICB0aGVtZTogZXh0ZW5kKEFwcC5zZXR0aW5ncy50aGVtZXMuZ3JheSwgbnVsbCksXG5cdCAgICAgICAgc3R5bGVzaGVldHM6IGluc3RhbmNlT3B0aW9ucy5zdHlsZXNoZWV0cyxcblx0ICAgICAgICBpbnN0YW5jZU9wdGlvbnM6IGluc3RhbmNlT3B0aW9uc1xuXHQgICAgfTtcblxuXHQgICAgdmFyIGZpcnN0UXVlc3Rpb25NYXJrID0gdXJsLmluZGV4T2YoJz8nKTtcblx0ICAgIHZhciBwYXJ0cyA9IFt1cmxdO1xuXG5cdCAgICBpZiAoZmlyc3RRdWVzdGlvbk1hcmsgIT09IC0xKSB7XG5cdCAgICAgICAgcGFydHMgPSBbdXJsLnNsaWNlKDAsIGZpcnN0UXVlc3Rpb25NYXJrKSwgdXJsLnNsaWNlKGZpcnN0UXVlc3Rpb25NYXJrICsgMSldO1xuXHQgICAgfVxuXG5cdCAgICB2YXIgYmFzaWNzID0gcGFydHNbMF0uc3BsaXQoJy8nKTtcblxuXHQgICAgaG9sZGVyLmhvbGRlclVSTCA9IHVybDtcblxuXHQgICAgdmFyIGRpbWVuc2lvbnMgPSBiYXNpY3NbMV07XG5cdCAgICB2YXIgZGltZW5zaW9uRGF0YSA9IGRpbWVuc2lvbnMubWF0Y2goLyhbXFxkXStwPyl4KFtcXGRdK3A/KS8pO1xuXG5cdCAgICBpZiAoIWRpbWVuc2lvbkRhdGEpIHJldHVybiBmYWxzZTtcblxuXHQgICAgaG9sZGVyLmZsdWlkID0gZGltZW5zaW9ucy5pbmRleE9mKCdwJykgIT09IC0xO1xuXG5cdCAgICBob2xkZXIuZGltZW5zaW9ucyA9IHtcblx0ICAgICAgICB3aWR0aDogZGltZW5zaW9uRGF0YVsxXS5yZXBsYWNlKCdwJywgJyUnKSxcblx0ICAgICAgICBoZWlnaHQ6IGRpbWVuc2lvbkRhdGFbMl0ucmVwbGFjZSgncCcsICclJylcblx0ICAgIH07XG5cblx0ICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHBhcnRzWzFdKTtcblxuXHQgICAgICAgIC8vIERpbWVuc2lvbnNcblxuXHQgICAgICAgIGlmICh1dGlscy50cnV0aHkob3B0aW9ucy5yYXRpbykpIHtcblx0ICAgICAgICAgICAgaG9sZGVyLmZsdWlkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgdmFyIHJhdGlvV2lkdGggPSBwYXJzZUZsb2F0KGhvbGRlci5kaW1lbnNpb25zLndpZHRoLnJlcGxhY2UoJyUnLCAnJykpO1xuXHQgICAgICAgICAgICB2YXIgcmF0aW9IZWlnaHQgPSBwYXJzZUZsb2F0KGhvbGRlci5kaW1lbnNpb25zLmhlaWdodC5yZXBsYWNlKCclJywgJycpKTtcblxuXHQgICAgICAgICAgICByYXRpb0hlaWdodCA9IE1hdGguZmxvb3IoMTAwICogKHJhdGlvSGVpZ2h0IC8gcmF0aW9XaWR0aCkpO1xuXHQgICAgICAgICAgICByYXRpb1dpZHRoID0gMTAwO1xuXG5cdCAgICAgICAgICAgIGhvbGRlci5kaW1lbnNpb25zLndpZHRoID0gcmF0aW9XaWR0aCArICclJztcblx0ICAgICAgICAgICAgaG9sZGVyLmRpbWVuc2lvbnMuaGVpZ2h0ID0gcmF0aW9IZWlnaHQgKyAnJSc7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaG9sZGVyLmF1dG8gPSB1dGlscy50cnV0aHkob3B0aW9ucy5hdXRvKTtcblxuXHQgICAgICAgIC8vIENvbG9yc1xuXG5cdCAgICAgICAgaWYgKG9wdGlvbnMuYmcpIHtcblx0ICAgICAgICAgICAgaG9sZGVyLnRoZW1lLmJnID0gdXRpbHMucGFyc2VDb2xvcihvcHRpb25zLmJnKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAob3B0aW9ucy5mZykge1xuXHQgICAgICAgICAgICBob2xkZXIudGhlbWUuZmcgPSB1dGlscy5wYXJzZUNvbG9yKG9wdGlvbnMuZmcpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vdG9kbzogYWRkIGF1dG9tYXRpYyBmb3JlZ3JvdW5kIHRvIHRoZW1lcyB3aXRob3V0IGZvcmVncm91bmRcblx0ICAgICAgICBpZiAob3B0aW9ucy5iZyAmJiAhb3B0aW9ucy5mZykge1xuXHQgICAgICAgICAgICBob2xkZXIuYXV0b0ZnID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAob3B0aW9ucy50aGVtZSAmJiBob2xkZXIuaW5zdGFuY2VPcHRpb25zLnRoZW1lcy5oYXNPd25Qcm9wZXJ0eShvcHRpb25zLnRoZW1lKSkge1xuXHQgICAgICAgICAgICBob2xkZXIudGhlbWUgPSBleHRlbmQoaG9sZGVyLmluc3RhbmNlT3B0aW9ucy50aGVtZXNbb3B0aW9ucy50aGVtZV0sIG51bGwpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIFRleHRcblxuXHQgICAgICAgIGlmIChvcHRpb25zLnRleHQpIHtcblx0ICAgICAgICAgICAgaG9sZGVyLnRleHQgPSBvcHRpb25zLnRleHQ7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dG1vZGUpIHtcblx0ICAgICAgICAgICAgaG9sZGVyLnRleHRtb2RlID0gb3B0aW9ucy50ZXh0bW9kZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICAgIGhvbGRlci5zaXplID0gb3B0aW9ucy5zaXplO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChvcHRpb25zLmZvbnQpIHtcblx0ICAgICAgICAgICAgaG9sZGVyLmZvbnQgPSBvcHRpb25zLmZvbnQ7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKG9wdGlvbnMuYWxpZ24pIHtcblx0ICAgICAgICAgICAgaG9sZGVyLmFsaWduID0gb3B0aW9ucy5hbGlnbjtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAob3B0aW9ucy5saW5lV3JhcCkge1xuXHQgICAgICAgICAgICBob2xkZXIubGluZVdyYXAgPSBvcHRpb25zLmxpbmVXcmFwO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGhvbGRlci5ub3dyYXAgPSB1dGlscy50cnV0aHkob3B0aW9ucy5ub3dyYXApO1xuXG5cdCAgICAgICAgLy8gTWlzY2VsbGFuZW91c1xuXG5cdCAgICAgICAgaG9sZGVyLm91dGxpbmUgPSB1dGlscy50cnV0aHkob3B0aW9ucy5vdXRsaW5lKTtcblxuXHQgICAgICAgIGlmICh1dGlscy50cnV0aHkob3B0aW9ucy5yYW5kb20pKSB7XG5cdCAgICAgICAgICAgIEFwcC52YXJzLmNhY2hlLnRoZW1lS2V5cyA9IEFwcC52YXJzLmNhY2hlLnRoZW1lS2V5cyB8fCBPYmplY3Qua2V5cyhob2xkZXIuaW5zdGFuY2VPcHRpb25zLnRoZW1lcyk7XG5cdCAgICAgICAgICAgIHZhciBfdGhlbWUgPSBBcHAudmFycy5jYWNoZS50aGVtZUtleXNbMCB8IE1hdGgucmFuZG9tKCkgKiBBcHAudmFycy5jYWNoZS50aGVtZUtleXMubGVuZ3RoXTtcblx0ICAgICAgICAgICAgaG9sZGVyLnRoZW1lID0gZXh0ZW5kKGhvbGRlci5pbnN0YW5jZU9wdGlvbnMudGhlbWVzW190aGVtZV0sIG51bGwpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIGhvbGRlcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb2RpZmllcyB0aGUgRE9NIHRvIGZpdCBwbGFjZWhvbGRlcnMgYW5kIHNldHMgdXAgcmVzaXphYmxlIGltYWdlIGNhbGxiYWNrcyAoZm9yIGZsdWlkIGFuZCBhdXRvbWF0aWNhbGx5IHNpemVkIHBsYWNlaG9sZGVycylcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHNldHRpbmdzIERPTSBwcmVwIHNldHRpbmdzXG5cdCAqL1xuXHRmdW5jdGlvbiBwcmVwYXJlRE9NRWxlbWVudChwcmVwU2V0dGluZ3MpIHtcblx0ICAgIHZhciBtb2RlID0gcHJlcFNldHRpbmdzLm1vZGU7XG5cdCAgICB2YXIgZWwgPSBwcmVwU2V0dGluZ3MuZWw7XG5cdCAgICB2YXIgZmxhZ3MgPSBwcmVwU2V0dGluZ3MuZmxhZ3M7XG5cdCAgICB2YXIgX2VuZ2luZVNldHRpbmdzID0gcHJlcFNldHRpbmdzLmVuZ2luZVNldHRpbmdzO1xuXHQgICAgdmFyIGRpbWVuc2lvbnMgPSBmbGFncy5kaW1lbnNpb25zLFxuXHQgICAgICAgIHRoZW1lID0gZmxhZ3MudGhlbWU7XG5cdCAgICB2YXIgZGltZW5zaW9uc0NhcHRpb24gPSBkaW1lbnNpb25zLndpZHRoICsgJ3gnICsgZGltZW5zaW9ucy5oZWlnaHQ7XG5cdCAgICBtb2RlID0gbW9kZSA9PSBudWxsID8gKGZsYWdzLmZsdWlkID8gJ2ZsdWlkJyA6ICdpbWFnZScpIDogbW9kZTtcblx0ICAgIHZhciBob2xkZXJUZW1wbGF0ZVJlID0gL2hvbGRlcl8oW2Etel0rKS9nO1xuXHQgICAgdmFyIGRpbWVuc2lvbnNJblRleHQgPSBmYWxzZTtcblxuXHQgICAgaWYgKGZsYWdzLnRleHQgIT0gbnVsbCkge1xuXHQgICAgICAgIHRoZW1lLnRleHQgPSBmbGFncy50ZXh0O1xuXG5cdCAgICAgICAgLy88b2JqZWN0PiBTVkcgZW1iZWRkaW5nIGRvZXNuJ3QgcGFyc2UgVW5pY29kZSBwcm9wZXJseVxuXHQgICAgICAgIGlmIChlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb2JqZWN0Jykge1xuXHQgICAgICAgICAgICB2YXIgdGV4dExpbmVzID0gdGhlbWUudGV4dC5zcGxpdCgnXFxcXG4nKTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0ZXh0TGluZXMubGVuZ3RoOyBrKyspIHtcblx0ICAgICAgICAgICAgICAgIHRleHRMaW5lc1trXSA9IHV0aWxzLmVuY29kZUh0bWxFbnRpdHkodGV4dExpbmVzW2tdKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGVtZS50ZXh0ID0gdGV4dExpbmVzLmpvaW4oJ1xcXFxuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBpZiAodGhlbWUudGV4dCkge1xuXHQgICAgICAgIHZhciBob2xkZXJUZW1wbGF0ZU1hdGNoZXMgPSB0aGVtZS50ZXh0Lm1hdGNoKGhvbGRlclRlbXBsYXRlUmUpO1xuXG5cdCAgICAgICAgaWYgKGhvbGRlclRlbXBsYXRlTWF0Y2hlcyAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAvL3RvZG86IG9wdGltaXplIHRlbXBsYXRlIHJlcGxhY2VtZW50XG5cdCAgICAgICAgICAgIGhvbGRlclRlbXBsYXRlTWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRjaCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKG1hdGNoID09PSAnaG9sZGVyX2RpbWVuc2lvbnMnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhlbWUudGV4dCA9IHRoZW1lLnRleHQucmVwbGFjZShtYXRjaCwgZGltZW5zaW9uc0NhcHRpb24pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHZhciBob2xkZXJVUkwgPSBmbGFncy5ob2xkZXJVUkw7XG5cdCAgICB2YXIgZW5naW5lU2V0dGluZ3MgPSBleHRlbmQoX2VuZ2luZVNldHRpbmdzLCBudWxsKTtcblxuXHQgICAgaWYgKGZsYWdzLmZvbnQpIHtcblx0ICAgICAgICAvKlxuXHQgICAgICAgIElmIGV4dGVybmFsIGZvbnRzIGFyZSB1c2VkIGluIGEgPGltZz4gcGxhY2Vob2xkZXIgcmVuZGVyZWQgd2l0aCBTVkcsIEhvbGRlciBmYWxscyBiYWNrIHRvIGNhbnZhcy5cblxuXHQgICAgICAgIFRoaXMgaXMgZG9uZSBiZWNhdXNlIEZpcmVmb3ggYW5kIENocm9tZSBkaXNhbGxvdyBlbWJlZGRlZCBTVkdzIGZyb20gcmVmZXJlbmNpbmcgZXh0ZXJuYWwgYXNzZXRzLlxuXHQgICAgICAgIFRoZSB3b3JrYXJvdW5kIGlzIGVpdGhlciB0byBjaGFuZ2UgdGhlIHBsYWNlaG9sZGVyIHRhZyBmcm9tIDxpbWc+IHRvIDxvYmplY3Q+IG9yIHRvIHVzZSB0aGUgY2FudmFzIHJlbmRlcmVyLlxuXHQgICAgICAgICovXG5cdCAgICAgICAgdGhlbWUuZm9udCA9IGZsYWdzLmZvbnQ7XG5cdCAgICAgICAgaWYgKCFlbmdpbmVTZXR0aW5ncy5ub0ZvbnRGYWxsYmFjayAmJiBlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW1nJyAmJiBBcHAuc2V0dXAuc3VwcG9ydHNDYW52YXMgJiYgZW5naW5lU2V0dGluZ3MucmVuZGVyZXIgPT09ICdzdmcnKSB7XG5cdCAgICAgICAgICAgIGVuZ2luZVNldHRpbmdzID0gZXh0ZW5kKGVuZ2luZVNldHRpbmdzLCB7XG5cdCAgICAgICAgICAgICAgICByZW5kZXJlcjogJ2NhbnZhcydcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICAvL0Nocm9tZSBhbmQgT3BlcmEgcmVxdWlyZSBhIHF1aWNrIDEwbXMgcmUtcmVuZGVyIGlmIHdlYiBmb250cyBhcmUgdXNlZCB3aXRoIGNhbnZhc1xuXHQgICAgaWYgKGZsYWdzLmZvbnQgJiYgZW5naW5lU2V0dGluZ3MucmVuZGVyZXIgPT0gJ2NhbnZhcycpIHtcblx0ICAgICAgICBlbmdpbmVTZXR0aW5ncy5yZVJlbmRlciA9IHRydWU7XG5cdCAgICB9XG5cblx0ICAgIGlmIChtb2RlID09ICdiYWNrZ3JvdW5kJykge1xuXHQgICAgICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFja2dyb3VuZC1zcmMnKSA9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIERPTS5zZXRBdHRyKGVsLCB7XG5cdCAgICAgICAgICAgICAgICAnZGF0YS1iYWNrZ3JvdW5kLXNyYyc6IGhvbGRlclVSTFxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAgIHZhciBkb21Qcm9wcyA9IHt9O1xuXHQgICAgICAgIGRvbVByb3BzW0FwcC52YXJzLmRhdGFBdHRyXSA9IGhvbGRlclVSTDtcblx0ICAgICAgICBET00uc2V0QXR0cihlbCwgZG9tUHJvcHMpO1xuXHQgICAgfVxuXG5cdCAgICBmbGFncy50aGVtZSA9IHRoZW1lO1xuXG5cdCAgICAvL3RvZG8gY29uc2lkZXIgdXNpbmcgYWxsIHJlbmRlclNldHRpbmdzIGluIGhvbGRlckRhdGFcblx0ICAgIGVsLmhvbGRlckRhdGEgPSB7XG5cdCAgICAgICAgZmxhZ3M6IGZsYWdzLFxuXHQgICAgICAgIGVuZ2luZVNldHRpbmdzOiBlbmdpbmVTZXR0aW5nc1xuXHQgICAgfTtcblxuXHQgICAgaWYgKG1vZGUgPT0gJ2ltYWdlJyB8fCBtb2RlID09ICdmbHVpZCcpIHtcblx0ICAgICAgICBET00uc2V0QXR0cihlbCwge1xuXHQgICAgICAgICAgICAnYWx0JzogdGhlbWUudGV4dCA/IChkaW1lbnNpb25zSW5UZXh0ID8gdGhlbWUudGV4dCA6IHRoZW1lLnRleHQgKyAnIFsnICsgZGltZW5zaW9uc0NhcHRpb24gKyAnXScpIDogZGltZW5zaW9uc0NhcHRpb25cblx0ICAgICAgICB9KTtcblx0ICAgIH1cblxuXHQgICAgdmFyIHJlbmRlclNldHRpbmdzID0ge1xuXHQgICAgICAgIG1vZGU6IG1vZGUsXG5cdCAgICAgICAgZWw6IGVsLFxuXHQgICAgICAgIGhvbGRlclNldHRpbmdzOiB7XG5cdCAgICAgICAgICAgIGRpbWVuc2lvbnM6IGRpbWVuc2lvbnMsXG5cdCAgICAgICAgICAgIHRoZW1lOiB0aGVtZSxcblx0ICAgICAgICAgICAgZmxhZ3M6IGZsYWdzXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBlbmdpbmVTZXR0aW5nczogZW5naW5lU2V0dGluZ3Ncblx0ICAgIH07XG5cblx0ICAgIGlmIChtb2RlID09ICdpbWFnZScpIHtcblx0ICAgICAgICBpZiAoIWZsYWdzLmF1dG8pIHtcblx0ICAgICAgICAgICAgZWwuc3R5bGUud2lkdGggPSBkaW1lbnNpb25zLndpZHRoICsgJ3B4Jztcblx0ICAgICAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQgKyAncHgnO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChlbmdpbmVTZXR0aW5ncy5yZW5kZXJlciA9PSAnaHRtbCcpIHtcblx0ICAgICAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhlbWUuYmc7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmVuZGVyKHJlbmRlclNldHRpbmdzKTtcblxuXHQgICAgICAgICAgICBpZiAoZmxhZ3MudGV4dG1vZGUgPT0gJ2V4YWN0Jykge1xuXHQgICAgICAgICAgICAgICAgZWwuaG9sZGVyRGF0YS5yZXNpemVVcGRhdGUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgQXBwLnZhcnMucmVzaXphYmxlSW1hZ2VzLnB1c2goZWwpO1xuXHQgICAgICAgICAgICAgICAgdXBkYXRlUmVzaXphYmxlRWxlbWVudHMoZWwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSBlbHNlIGlmIChtb2RlID09ICdiYWNrZ3JvdW5kJyAmJiBlbmdpbmVTZXR0aW5ncy5yZW5kZXJlciAhPSAnaHRtbCcpIHtcblx0ICAgICAgICByZW5kZXIocmVuZGVyU2V0dGluZ3MpO1xuXHQgICAgfSBlbHNlIGlmIChtb2RlID09ICdmbHVpZCcpIHtcblx0ICAgICAgICBlbC5ob2xkZXJEYXRhLnJlc2l6ZVVwZGF0ZSA9IHRydWU7XG5cblx0ICAgICAgICBpZiAoZGltZW5zaW9ucy5oZWlnaHQuc2xpY2UoLTEpID09ICclJykge1xuXHQgICAgICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSBkaW1lbnNpb25zLmhlaWdodDtcblx0ICAgICAgICB9IGVsc2UgaWYgKGZsYWdzLmF1dG8gPT0gbnVsbCB8fCAhZmxhZ3MuYXV0bykge1xuXHQgICAgICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSBkaW1lbnNpb25zLmhlaWdodCArICdweCc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChkaW1lbnNpb25zLndpZHRoLnNsaWNlKC0xKSA9PSAnJScpIHtcblx0ICAgICAgICAgICAgZWwuc3R5bGUud2lkdGggPSBkaW1lbnNpb25zLndpZHRoO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MuYXV0byA9PSBudWxsIHx8ICFmbGFncy5hdXRvKSB7XG5cdCAgICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gZGltZW5zaW9ucy53aWR0aCArICdweCc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChlbC5zdHlsZS5kaXNwbGF5ID09ICdpbmxpbmUnIHx8IGVsLnN0eWxlLmRpc3BsYXkgPT09ICcnIHx8IGVsLnN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnKSB7XG5cdCAgICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHNldEluaXRpYWxEaW1lbnNpb25zKGVsKTtcblxuXHQgICAgICAgIGlmIChlbmdpbmVTZXR0aW5ncy5yZW5kZXJlciA9PSAnaHRtbCcpIHtcblx0ICAgICAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhlbWUuYmc7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgQXBwLnZhcnMucmVzaXphYmxlSW1hZ2VzLnB1c2goZWwpO1xuXHQgICAgICAgICAgICB1cGRhdGVSZXNpemFibGVFbGVtZW50cyhlbCk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cblx0LyoqXG5cdCAqIENvcmUgZnVuY3Rpb24gdGhhdCB0YWtlcyBvdXRwdXQgZnJvbSByZW5kZXJlcnMgYW5kIHNldHMgaXQgYXMgdGhlIHNvdXJjZSBvciBiYWNrZ3JvdW5kLWltYWdlIG9mIHRoZSB0YXJnZXQgZWxlbWVudFxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0gcmVuZGVyU2V0dGluZ3MgUmVuZGVyZXIgc2V0dGluZ3Ncblx0ICovXG5cdGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJTZXR0aW5ncykge1xuXHQgICAgdmFyIGltYWdlID0gbnVsbDtcblx0ICAgIHZhciBtb2RlID0gcmVuZGVyU2V0dGluZ3MubW9kZTtcblx0ICAgIHZhciBlbCA9IHJlbmRlclNldHRpbmdzLmVsO1xuXHQgICAgdmFyIGhvbGRlclNldHRpbmdzID0gcmVuZGVyU2V0dGluZ3MuaG9sZGVyU2V0dGluZ3M7XG5cdCAgICB2YXIgZW5naW5lU2V0dGluZ3MgPSByZW5kZXJTZXR0aW5ncy5lbmdpbmVTZXR0aW5ncztcblxuXHQgICAgc3dpdGNoIChlbmdpbmVTZXR0aW5ncy5yZW5kZXJlcikge1xuXHQgICAgICAgIGNhc2UgJ3N2Zyc6XG5cdCAgICAgICAgICAgIGlmICghQXBwLnNldHVwLnN1cHBvcnRzU1ZHKSByZXR1cm47XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgJ2NhbnZhcyc6XG5cdCAgICAgICAgICAgIGlmICghQXBwLnNldHVwLnN1cHBvcnRzQ2FudmFzKSByZXR1cm47XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgIH1cblxuXHQgICAgLy90b2RvOiBtb3ZlIGdlbmVyYXRpb24gb2Ygc2NlbmUgdXAgdG8gZmxhZyBnZW5lcmF0aW9uIHRvIHJlZHVjZSBleHRyYSBvYmplY3QgY3JlYXRpb25cblx0ICAgIHZhciBzY2VuZSA9IHtcblx0ICAgICAgICB3aWR0aDogaG9sZGVyU2V0dGluZ3MuZGltZW5zaW9ucy53aWR0aCxcblx0ICAgICAgICBoZWlnaHQ6IGhvbGRlclNldHRpbmdzLmRpbWVuc2lvbnMuaGVpZ2h0LFxuXHQgICAgICAgIHRoZW1lOiBob2xkZXJTZXR0aW5ncy50aGVtZSxcblx0ICAgICAgICBmbGFnczogaG9sZGVyU2V0dGluZ3MuZmxhZ3Ncblx0ICAgIH07XG5cblx0ICAgIHZhciBzY2VuZUdyYXBoID0gYnVpbGRTY2VuZUdyYXBoKHNjZW5lKTtcblxuXHQgICAgZnVuY3Rpb24gZ2V0UmVuZGVyZWRJbWFnZSgpIHtcblx0ICAgICAgICB2YXIgaW1hZ2UgPSBudWxsO1xuXHQgICAgICAgIHN3aXRjaCAoZW5naW5lU2V0dGluZ3MucmVuZGVyZXIpIHtcblx0ICAgICAgICAgICAgY2FzZSAnY2FudmFzJzpcblx0ICAgICAgICAgICAgICAgIGltYWdlID0gc2dDYW52YXNSZW5kZXJlcihzY2VuZUdyYXBoLCByZW5kZXJTZXR0aW5ncyk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnc3ZnJzpcblx0ICAgICAgICAgICAgICAgIGltYWdlID0gc3ZnUmVuZGVyZXIoc2NlbmVHcmFwaCwgcmVuZGVyU2V0dGluZ3MpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICB0aHJvdyAnSG9sZGVyOiBpbnZhbGlkIHJlbmRlcmVyOiAnICsgZW5naW5lU2V0dGluZ3MucmVuZGVyZXI7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIGltYWdlO1xuXHQgICAgfVxuXG5cdCAgICBpbWFnZSA9IGdldFJlbmRlcmVkSW1hZ2UoKTtcblxuXHQgICAgaWYgKGltYWdlID09IG51bGwpIHtcblx0ICAgICAgICB0aHJvdyAnSG9sZGVyOiBjb3VsZG5cXCd0IHJlbmRlciBwbGFjZWhvbGRlcic7XG5cdCAgICB9XG5cblx0ICAgIC8vdG9kbzogYWRkIDxvYmplY3Q+IGNhbnZhcyByZW5kZXJpbmdcblx0ICAgIGlmIChtb2RlID09ICdiYWNrZ3JvdW5kJykge1xuXHQgICAgICAgIGVsLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoJyArIGltYWdlICsgJyknO1xuXG5cdCAgICAgICAgaWYgKCFlbmdpbmVTZXR0aW5ncy5ub0JhY2tncm91bmRTaXplKSB7XG5cdCAgICAgICAgICAgIGVsLnN0eWxlLmJhY2tncm91bmRTaXplID0gc2NlbmUud2lkdGggKyAncHggJyArIHNjZW5lLmhlaWdodCArICdweCc7XG5cdCAgICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBpZiAoZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ltZycpIHtcblx0ICAgICAgICAgICAgRE9NLnNldEF0dHIoZWwsIHtcblx0ICAgICAgICAgICAgICAgICdzcmMnOiBpbWFnZVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnKSB7XG5cdCAgICAgICAgICAgIERPTS5zZXRBdHRyKGVsLCB7XG5cdCAgICAgICAgICAgICAgICAnZGF0YSc6IGltYWdlLFxuXHQgICAgICAgICAgICAgICAgJ3R5cGUnOiAnaW1hZ2Uvc3ZnK3htbCdcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChlbmdpbmVTZXR0aW5ncy5yZVJlbmRlcikge1xuXHQgICAgICAgICAgICBnbG9iYWwuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSBnZXRSZW5kZXJlZEltYWdlKCk7XG5cdCAgICAgICAgICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93ICdIb2xkZXI6IGNvdWxkblxcJ3QgcmVuZGVyIHBsYWNlaG9sZGVyJztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vdG9kbzogcmVmYWN0b3IgdGhpcyBjb2RlIGludG8gYSBmdW5jdGlvblxuXHQgICAgICAgICAgICAgICAgaWYgKGVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbWcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgRE9NLnNldEF0dHIoZWwsIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYyc6IGltYWdlXG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgRE9NLnNldEF0dHIoZWwsIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiBpbWFnZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnaW1hZ2Uvc3ZnK3htbCdcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSwgMTUwKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvL3RvZG86IGFjY291bnQgZm9yIHJlLXJlbmRlcmluZ1xuXHQgICAgRE9NLnNldEF0dHIoZWwsIHtcblx0ICAgICAgICAnZGF0YS1ob2xkZXItcmVuZGVyZWQnOiB0cnVlXG5cdCAgICB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBIb2xkZXIgc2NlbmUgZGVzY3JpcHRpb24gYW5kIGJ1aWxkcyBhIHNjZW5lIGdyYXBoXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSBzY2VuZSBIb2xkZXIgc2NlbmUgb2JqZWN0XG5cdCAqL1xuXHQvL3RvZG86IG1ha2UgdGhpcyBmdW5jdGlvbiByZXVzYWJsZVxuXHQvL3RvZG86IG1lcmdlIGFwcCBkZWZhdWx0cyBhbmQgc2V0dXAgcHJvcGVydGllcyBpbnRvIHRoZSBzY2VuZSBhcmd1bWVudFxuXHRmdW5jdGlvbiBidWlsZFNjZW5lR3JhcGgoc2NlbmUpIHtcblx0ICAgIHZhciBmb250U2l6ZSA9IEFwcC5kZWZhdWx0cy5zaXplO1xuXHQgICAgaWYgKHBhcnNlRmxvYXQoc2NlbmUudGhlbWUuc2l6ZSkpIHtcblx0ICAgICAgICBmb250U2l6ZSA9IHNjZW5lLnRoZW1lLnNpemU7XG5cdCAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQoc2NlbmUuZmxhZ3Muc2l6ZSkpIHtcblx0ICAgICAgICBmb250U2l6ZSA9IHNjZW5lLmZsYWdzLnNpemU7XG5cdCAgICB9XG5cblx0ICAgIHNjZW5lLmZvbnQgPSB7XG5cdCAgICAgICAgZmFtaWx5OiBzY2VuZS50aGVtZS5mb250ID8gc2NlbmUudGhlbWUuZm9udCA6ICdBcmlhbCwgSGVsdmV0aWNhLCBPcGVuIFNhbnMsIHNhbnMtc2VyaWYnLFxuXHQgICAgICAgIHNpemU6IHRleHRTaXplKHNjZW5lLndpZHRoLCBzY2VuZS5oZWlnaHQsIGZvbnRTaXplLCBBcHAuZGVmYXVsdHMuc2NhbGUpLFxuXHQgICAgICAgIHVuaXRzOiBzY2VuZS50aGVtZS51bml0cyA/IHNjZW5lLnRoZW1lLnVuaXRzIDogQXBwLmRlZmF1bHRzLnVuaXRzLFxuXHQgICAgICAgIHdlaWdodDogc2NlbmUudGhlbWUuZm9udHdlaWdodCA/IHNjZW5lLnRoZW1lLmZvbnR3ZWlnaHQgOiAnYm9sZCdcblx0ICAgIH07XG5cblx0ICAgIHNjZW5lLnRleHQgPSBzY2VuZS50aGVtZS50ZXh0IHx8IE1hdGguZmxvb3Ioc2NlbmUud2lkdGgpICsgJ3gnICsgTWF0aC5mbG9vcihzY2VuZS5oZWlnaHQpO1xuXG5cdCAgICBzY2VuZS5ub1dyYXAgPSBzY2VuZS50aGVtZS5ub3dyYXAgfHwgc2NlbmUuZmxhZ3Mubm93cmFwO1xuXG5cdCAgICBzY2VuZS5hbGlnbiA9IHNjZW5lLnRoZW1lLmFsaWduIHx8IHNjZW5lLmZsYWdzLmFsaWduIHx8ICdjZW50ZXInO1xuXG5cdCAgICBzd2l0Y2ggKHNjZW5lLmZsYWdzLnRleHRtb2RlKSB7XG5cdCAgICAgICAgY2FzZSAnbGl0ZXJhbCc6XG5cdCAgICAgICAgICAgIHNjZW5lLnRleHQgPSBzY2VuZS5mbGFncy5kaW1lbnNpb25zLndpZHRoICsgJ3gnICsgc2NlbmUuZmxhZ3MuZGltZW5zaW9ucy5oZWlnaHQ7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgJ2V4YWN0Jzpcblx0ICAgICAgICAgICAgaWYgKCFzY2VuZS5mbGFncy5leGFjdERpbWVuc2lvbnMpIGJyZWFrO1xuXHQgICAgICAgICAgICBzY2VuZS50ZXh0ID0gTWF0aC5mbG9vcihzY2VuZS5mbGFncy5leGFjdERpbWVuc2lvbnMud2lkdGgpICsgJ3gnICsgTWF0aC5mbG9vcihzY2VuZS5mbGFncy5leGFjdERpbWVuc2lvbnMuaGVpZ2h0KTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICB9XG5cblx0ICAgIHZhciBsaW5lV3JhcCA9IHNjZW5lLmZsYWdzLmxpbmVXcmFwIHx8IEFwcC5zZXR1cC5saW5lV3JhcFJhdGlvO1xuXHQgICAgdmFyIHNjZW5lTWFyZ2luID0gc2NlbmUud2lkdGggKiBsaW5lV3JhcDtcblx0ICAgIHZhciBtYXhMaW5lV2lkdGggPSBzY2VuZU1hcmdpbjtcblxuXHQgICAgdmFyIHNjZW5lR3JhcGggPSBuZXcgU2NlbmVHcmFwaCh7XG5cdCAgICAgICAgd2lkdGg6IHNjZW5lLndpZHRoLFxuXHQgICAgICAgIGhlaWdodDogc2NlbmUuaGVpZ2h0XG5cdCAgICB9KTtcblxuXHQgICAgdmFyIFNoYXBlID0gc2NlbmVHcmFwaC5TaGFwZTtcblxuXHQgICAgdmFyIGhvbGRlckJnID0gbmV3IFNoYXBlLlJlY3QoJ2hvbGRlckJnJywge1xuXHQgICAgICAgIGZpbGw6IHNjZW5lLnRoZW1lLmJnXG5cdCAgICB9KTtcblxuXHQgICAgaG9sZGVyQmcucmVzaXplKHNjZW5lLndpZHRoLCBzY2VuZS5oZWlnaHQpO1xuXHQgICAgc2NlbmVHcmFwaC5yb290LmFkZChob2xkZXJCZyk7XG5cblx0ICAgIGlmIChzY2VuZS5mbGFncy5vdXRsaW5lKSB7XG5cdCAgICAgICAgdmFyIG91dGxpbmVDb2xvciA9IG5ldyBDb2xvcihob2xkZXJCZy5wcm9wZXJ0aWVzLmZpbGwpO1xuXHQgICAgICAgIG91dGxpbmVDb2xvciA9IG91dGxpbmVDb2xvci5saWdodGVuKG91dGxpbmVDb2xvci5saWdodGVyVGhhbignN2Y3ZjdmJykgPyAtMC4xIDogMC4xKTtcblx0ICAgICAgICBob2xkZXJCZy5wcm9wZXJ0aWVzLm91dGxpbmUgPSB7XG5cdCAgICAgICAgICAgIGZpbGw6IG91dGxpbmVDb2xvci50b0hleCh0cnVlKSxcblx0ICAgICAgICAgICAgd2lkdGg6IDJcblx0ICAgICAgICB9O1xuXHQgICAgfVxuXG5cdCAgICB2YXIgaG9sZGVyVGV4dENvbG9yID0gc2NlbmUudGhlbWUuZmc7XG5cblx0ICAgIGlmIChzY2VuZS5mbGFncy5hdXRvRmcpIHtcblx0ICAgICAgICB2YXIgaG9sZGVyQmdDb2xvciA9IG5ldyBDb2xvcihob2xkZXJCZy5wcm9wZXJ0aWVzLmZpbGwpO1xuXHQgICAgICAgIHZhciBsaWdodENvbG9yID0gbmV3IENvbG9yKCdmZmYnKTtcblx0ICAgICAgICB2YXIgZGFya0NvbG9yID0gbmV3IENvbG9yKCcwMDAnLCB7XG5cdCAgICAgICAgICAgICdhbHBoYSc6IDAuMjg1NzE0XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICBob2xkZXJUZXh0Q29sb3IgPSBob2xkZXJCZ0NvbG9yLmJsZW5kQWxwaGEoaG9sZGVyQmdDb2xvci5saWdodGVyVGhhbignN2Y3ZjdmJykgPyBkYXJrQ29sb3IgOiBsaWdodENvbG9yKS50b0hleCh0cnVlKTtcblx0ICAgIH1cblxuXHQgICAgdmFyIGhvbGRlclRleHRHcm91cCA9IG5ldyBTaGFwZS5Hcm91cCgnaG9sZGVyVGV4dEdyb3VwJywge1xuXHQgICAgICAgIHRleHQ6IHNjZW5lLnRleHQsXG5cdCAgICAgICAgYWxpZ246IHNjZW5lLmFsaWduLFxuXHQgICAgICAgIGZvbnQ6IHNjZW5lLmZvbnQsXG5cdCAgICAgICAgZmlsbDogaG9sZGVyVGV4dENvbG9yXG5cdCAgICB9KTtcblxuXHQgICAgaG9sZGVyVGV4dEdyb3VwLm1vdmVUbyhudWxsLCBudWxsLCAxKTtcblx0ICAgIHNjZW5lR3JhcGgucm9vdC5hZGQoaG9sZGVyVGV4dEdyb3VwKTtcblxuXHQgICAgdmFyIHRwZGF0YSA9IGhvbGRlclRleHRHcm91cC50ZXh0UG9zaXRpb25EYXRhID0gc3RhZ2luZ1JlbmRlcmVyKHNjZW5lR3JhcGgpO1xuXHQgICAgaWYgKCF0cGRhdGEpIHtcblx0ICAgICAgICB0aHJvdyAnSG9sZGVyOiBzdGFnaW5nIGZhbGxiYWNrIG5vdCBzdXBwb3J0ZWQgeWV0Lic7XG5cdCAgICB9XG5cdCAgICBob2xkZXJUZXh0R3JvdXAucHJvcGVydGllcy5sZWFkaW5nID0gdHBkYXRhLmJvdW5kaW5nQm94LmhlaWdodDtcblxuXHQgICAgdmFyIHRleHROb2RlID0gbnVsbDtcblx0ICAgIHZhciBsaW5lID0gbnVsbDtcblxuXHQgICAgZnVuY3Rpb24gZmluYWxpemVMaW5lKHBhcmVudCwgbGluZSwgd2lkdGgsIGhlaWdodCkge1xuXHQgICAgICAgIGxpbmUud2lkdGggPSB3aWR0aDtcblx0ICAgICAgICBsaW5lLmhlaWdodCA9IGhlaWdodDtcblx0ICAgICAgICBwYXJlbnQud2lkdGggPSBNYXRoLm1heChwYXJlbnQud2lkdGgsIGxpbmUud2lkdGgpO1xuXHQgICAgICAgIHBhcmVudC5oZWlnaHQgKz0gbGluZS5oZWlnaHQ7XG5cdCAgICB9XG5cblx0ICAgIGlmICh0cGRhdGEubGluZUNvdW50ID4gMSkge1xuXHQgICAgICAgIHZhciBvZmZzZXRYID0gMDtcblx0ICAgICAgICB2YXIgb2Zmc2V0WSA9IDA7XG5cdCAgICAgICAgdmFyIGxpbmVJbmRleCA9IDA7XG5cdCAgICAgICAgdmFyIGxpbmVLZXk7XG5cdCAgICAgICAgbGluZSA9IG5ldyBTaGFwZS5Hcm91cCgnbGluZScgKyBsaW5lSW5kZXgpO1xuXG5cdCAgICAgICAgLy9Eb3VibGUgbWFyZ2luIHNvIHRoYXQgbGVmdC9yaWdodC1hbGlnbmVkIG5leHQgaXMgbm90IGZsdXNoIHdpdGggZWRnZSBvZiBpbWFnZVxuXHQgICAgICAgIGlmIChzY2VuZS5hbGlnbiA9PT0gJ2xlZnQnIHx8IHNjZW5lLmFsaWduID09PSAncmlnaHQnKSB7XG5cdCAgICAgICAgICAgIG1heExpbmVXaWR0aCA9IHNjZW5lLndpZHRoICogKDEgLSAoMSAtIGxpbmVXcmFwKSAqIDIpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHBkYXRhLndvcmRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHZhciB3b3JkID0gdHBkYXRhLndvcmRzW2ldO1xuXHQgICAgICAgICAgICB0ZXh0Tm9kZSA9IG5ldyBTaGFwZS5UZXh0KHdvcmQudGV4dCk7XG5cdCAgICAgICAgICAgIHZhciBuZXdsaW5lID0gd29yZC50ZXh0ID09ICdcXFxcbic7XG5cdCAgICAgICAgICAgIGlmICghc2NlbmUubm9XcmFwICYmIChvZmZzZXRYICsgd29yZC53aWR0aCA+PSBtYXhMaW5lV2lkdGggfHwgbmV3bGluZSA9PT0gdHJ1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIGZpbmFsaXplTGluZShob2xkZXJUZXh0R3JvdXAsIGxpbmUsIG9mZnNldFgsIGhvbGRlclRleHRHcm91cC5wcm9wZXJ0aWVzLmxlYWRpbmcpO1xuXHQgICAgICAgICAgICAgICAgaG9sZGVyVGV4dEdyb3VwLmFkZChsaW5lKTtcblx0ICAgICAgICAgICAgICAgIG9mZnNldFggPSAwO1xuXHQgICAgICAgICAgICAgICAgb2Zmc2V0WSArPSBob2xkZXJUZXh0R3JvdXAucHJvcGVydGllcy5sZWFkaW5nO1xuXHQgICAgICAgICAgICAgICAgbGluZUluZGV4ICs9IDE7XG5cdCAgICAgICAgICAgICAgICBsaW5lID0gbmV3IFNoYXBlLkdyb3VwKCdsaW5lJyArIGxpbmVJbmRleCk7XG5cdCAgICAgICAgICAgICAgICBsaW5lLnkgPSBvZmZzZXRZO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChuZXdsaW5lID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0ZXh0Tm9kZS5tb3ZlVG8ob2Zmc2V0WCwgMCk7XG5cdCAgICAgICAgICAgIG9mZnNldFggKz0gdHBkYXRhLnNwYWNlV2lkdGggKyB3b3JkLndpZHRoO1xuXHQgICAgICAgICAgICBsaW5lLmFkZCh0ZXh0Tm9kZSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZmluYWxpemVMaW5lKGhvbGRlclRleHRHcm91cCwgbGluZSwgb2Zmc2V0WCwgaG9sZGVyVGV4dEdyb3VwLnByb3BlcnRpZXMubGVhZGluZyk7XG5cdCAgICAgICAgaG9sZGVyVGV4dEdyb3VwLmFkZChsaW5lKTtcblxuXHQgICAgICAgIGlmIChzY2VuZS5hbGlnbiA9PT0gJ2xlZnQnKSB7XG5cdCAgICAgICAgICAgIGhvbGRlclRleHRHcm91cC5tb3ZlVG8oc2NlbmUud2lkdGggLSBzY2VuZU1hcmdpbiwgbnVsbCwgbnVsbCk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChzY2VuZS5hbGlnbiA9PT0gJ3JpZ2h0Jykge1xuXHQgICAgICAgICAgICBmb3IgKGxpbmVLZXkgaW4gaG9sZGVyVGV4dEdyb3VwLmNoaWxkcmVuKSB7XG5cdCAgICAgICAgICAgICAgICBsaW5lID0gaG9sZGVyVGV4dEdyb3VwLmNoaWxkcmVuW2xpbmVLZXldO1xuXHQgICAgICAgICAgICAgICAgbGluZS5tb3ZlVG8oc2NlbmUud2lkdGggLSBsaW5lLndpZHRoLCBudWxsLCBudWxsKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGhvbGRlclRleHRHcm91cC5tb3ZlVG8oMCAtIChzY2VuZS53aWR0aCAtIHNjZW5lTWFyZ2luKSwgbnVsbCwgbnVsbCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgZm9yIChsaW5lS2V5IGluIGhvbGRlclRleHRHcm91cC5jaGlsZHJlbikge1xuXHQgICAgICAgICAgICAgICAgbGluZSA9IGhvbGRlclRleHRHcm91cC5jaGlsZHJlbltsaW5lS2V5XTtcblx0ICAgICAgICAgICAgICAgIGxpbmUubW92ZVRvKChob2xkZXJUZXh0R3JvdXAud2lkdGggLSBsaW5lLndpZHRoKSAvIDIsIG51bGwsIG51bGwpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaG9sZGVyVGV4dEdyb3VwLm1vdmVUbygoc2NlbmUud2lkdGggLSBob2xkZXJUZXh0R3JvdXAud2lkdGgpIC8gMiwgbnVsbCwgbnVsbCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaG9sZGVyVGV4dEdyb3VwLm1vdmVUbyhudWxsLCAoc2NlbmUuaGVpZ2h0IC0gaG9sZGVyVGV4dEdyb3VwLmhlaWdodCkgLyAyLCBudWxsKTtcblxuXHQgICAgICAgIC8vSWYgdGhlIHRleHQgZXhjZWVkcyB2ZXJ0aWNhbCBzcGFjZSwgbW92ZSBpdCBkb3duIHNvIHRoZSBmaXJzdCBsaW5lIGlzIHZpc2libGVcblx0ICAgICAgICBpZiAoKHNjZW5lLmhlaWdodCAtIGhvbGRlclRleHRHcm91cC5oZWlnaHQpIC8gMiA8IDApIHtcblx0ICAgICAgICAgICAgaG9sZGVyVGV4dEdyb3VwLm1vdmVUbyhudWxsLCAwLCBudWxsKTtcblx0ICAgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRleHROb2RlID0gbmV3IFNoYXBlLlRleHQoc2NlbmUudGV4dCk7XG5cdCAgICAgICAgbGluZSA9IG5ldyBTaGFwZS5Hcm91cCgnbGluZTAnKTtcblx0ICAgICAgICBsaW5lLmFkZCh0ZXh0Tm9kZSk7XG5cdCAgICAgICAgaG9sZGVyVGV4dEdyb3VwLmFkZChsaW5lKTtcblxuXHQgICAgICAgIGlmIChzY2VuZS5hbGlnbiA9PT0gJ2xlZnQnKSB7XG5cdCAgICAgICAgICAgIGhvbGRlclRleHRHcm91cC5tb3ZlVG8oc2NlbmUud2lkdGggLSBzY2VuZU1hcmdpbiwgbnVsbCwgbnVsbCk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChzY2VuZS5hbGlnbiA9PT0gJ3JpZ2h0Jykge1xuXHQgICAgICAgICAgICBob2xkZXJUZXh0R3JvdXAubW92ZVRvKDAgLSAoc2NlbmUud2lkdGggLSBzY2VuZU1hcmdpbiksIG51bGwsIG51bGwpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGhvbGRlclRleHRHcm91cC5tb3ZlVG8oKHNjZW5lLndpZHRoIC0gdHBkYXRhLmJvdW5kaW5nQm94LndpZHRoKSAvIDIsIG51bGwsIG51bGwpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGhvbGRlclRleHRHcm91cC5tb3ZlVG8obnVsbCwgKHNjZW5lLmhlaWdodCAtIHRwZGF0YS5ib3VuZGluZ0JveC5oZWlnaHQpIC8gMiwgbnVsbCk7XG5cdCAgICB9XG5cblx0ICAgIC8vdG9kbzogcmVuZGVybGlzdFxuXHQgICAgcmV0dXJuIHNjZW5lR3JhcGg7XG5cdH1cblxuXHQvKipcblx0ICogQWRhcHRpdmUgdGV4dCBzaXppbmcgZnVuY3Rpb25cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHdpZHRoIFBhcmVudCB3aWR0aFxuXHQgKiBAcGFyYW0gaGVpZ2h0IFBhcmVudCBoZWlnaHRcblx0ICogQHBhcmFtIGZvbnRTaXplIFJlcXVlc3RlZCB0ZXh0IHNpemVcblx0ICogQHBhcmFtIHNjYWxlIFByb3BvcnRpb25hbCBzY2FsZSBvZiB0ZXh0XG5cdCAqL1xuXHRmdW5jdGlvbiB0ZXh0U2l6ZSh3aWR0aCwgaGVpZ2h0LCBmb250U2l6ZSwgc2NhbGUpIHtcblx0ICAgIHZhciBzdGFnZVdpZHRoID0gcGFyc2VJbnQod2lkdGgsIDEwKTtcblx0ICAgIHZhciBzdGFnZUhlaWdodCA9IHBhcnNlSW50KGhlaWdodCwgMTApO1xuXG5cdCAgICB2YXIgYmlnU2lkZSA9IE1hdGgubWF4KHN0YWdlV2lkdGgsIHN0YWdlSGVpZ2h0KTtcblx0ICAgIHZhciBzbWFsbFNpZGUgPSBNYXRoLm1pbihzdGFnZVdpZHRoLCBzdGFnZUhlaWdodCk7XG5cblx0ICAgIHZhciBuZXdIZWlnaHQgPSAwLjggKiBNYXRoLm1pbihzbWFsbFNpZGUsIGJpZ1NpZGUgKiBzY2FsZSk7XG5cdCAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1heChmb250U2l6ZSwgbmV3SGVpZ2h0KSk7XG5cdH1cblxuXHQvKipcblx0ICogSXRlcmF0ZXMgb3ZlciByZXNpemFibGUgKGZsdWlkIG9yIGF1dG8pIHBsYWNlaG9sZGVycyBhbmQgcmVuZGVycyB0aGVtXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSBlbGVtZW50IE9wdGlvbmFsIGVsZW1lbnQgc2VsZWN0b3IsIHNwZWNpZmllZCBvbmx5IGlmIGEgc3BlY2lmaWMgZWxlbWVudCBuZWVkcyB0byBiZSByZS1yZW5kZXJlZFxuXHQgKi9cblx0ZnVuY3Rpb24gdXBkYXRlUmVzaXphYmxlRWxlbWVudHMoZWxlbWVudCkge1xuXHQgICAgdmFyIGltYWdlcztcblx0ICAgIGlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5ub2RlVHlwZSA9PSBudWxsKSB7XG5cdCAgICAgICAgaW1hZ2VzID0gQXBwLnZhcnMucmVzaXphYmxlSW1hZ2VzO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBpbWFnZXMgPSBbZWxlbWVudF07XG5cdCAgICB9XG5cdCAgICBmb3IgKHZhciBpID0gMCwgbCA9IGltYWdlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0ICAgICAgICB2YXIgZWwgPSBpbWFnZXNbaV07XG5cdCAgICAgICAgaWYgKGVsLmhvbGRlckRhdGEpIHtcblx0ICAgICAgICAgICAgdmFyIGZsYWdzID0gZWwuaG9sZGVyRGF0YS5mbGFncztcblx0ICAgICAgICAgICAgdmFyIGRpbWVuc2lvbnMgPSBkaW1lbnNpb25DaGVjayhlbCk7XG5cdCAgICAgICAgICAgIGlmIChkaW1lbnNpb25zKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIWVsLmhvbGRlckRhdGEucmVzaXplVXBkYXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGlmIChmbGFncy5mbHVpZCAmJiBmbGFncy5hdXRvKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGZsdWlkQ29uZmlnID0gZWwuaG9sZGVyRGF0YS5mbHVpZENvbmZpZztcblx0ICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZsdWlkQ29uZmlnLm1vZGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2lkdGgnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9ucy5oZWlnaHQgPSBkaW1lbnNpb25zLndpZHRoIC8gZmx1aWRDb25maWcucmF0aW87XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaGVpZ2h0Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbnMud2lkdGggPSBkaW1lbnNpb25zLmhlaWdodCAqIGZsdWlkQ29uZmlnLnJhdGlvO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2ltYWdlJyxcblx0ICAgICAgICAgICAgICAgICAgICBob2xkZXJTZXR0aW5nczoge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBkaW1lbnNpb25zLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZTogZmxhZ3MudGhlbWUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOiBmbGFnc1xuXHQgICAgICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgZWw6IGVsLFxuXHQgICAgICAgICAgICAgICAgICAgIGVuZ2luZVNldHRpbmdzOiBlbC5ob2xkZXJEYXRhLmVuZ2luZVNldHRpbmdzXG5cdCAgICAgICAgICAgICAgICB9O1xuXG5cdCAgICAgICAgICAgICAgICBpZiAoZmxhZ3MudGV4dG1vZGUgPT0gJ2V4YWN0Jykge1xuXHQgICAgICAgICAgICAgICAgICAgIGZsYWdzLmV4YWN0RGltZW5zaW9ucyA9IGRpbWVuc2lvbnM7XG5cdCAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuaG9sZGVyU2V0dGluZ3MuZGltZW5zaW9ucyA9IGZsYWdzLmRpbWVuc2lvbnM7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJlbmRlcihzZXR0aW5ncyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBzZXRJbnZpc2libGUoZWwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdXAgYXNwZWN0IHJhdGlvIG1ldGFkYXRhIGZvciBmbHVpZCBwbGFjZWhvbGRlcnMsIGluIG9yZGVyIHRvIHByZXNlcnZlIHByb3BvcnRpb25zIHdoZW4gcmVzaXppbmdcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIGVsIEltYWdlIERPTSBlbGVtZW50XG5cdCAqL1xuXHRmdW5jdGlvbiBzZXRJbml0aWFsRGltZW5zaW9ucyhlbCkge1xuXHQgICAgaWYgKGVsLmhvbGRlckRhdGEpIHtcblx0ICAgICAgICB2YXIgZGltZW5zaW9ucyA9IGRpbWVuc2lvbkNoZWNrKGVsKTtcblx0ICAgICAgICBpZiAoZGltZW5zaW9ucykge1xuXHQgICAgICAgICAgICB2YXIgZmxhZ3MgPSBlbC5ob2xkZXJEYXRhLmZsYWdzO1xuXG5cdCAgICAgICAgICAgIHZhciBmbHVpZENvbmZpZyA9IHtcblx0ICAgICAgICAgICAgICAgIGZsdWlkSGVpZ2h0OiBmbGFncy5kaW1lbnNpb25zLmhlaWdodC5zbGljZSgtMSkgPT0gJyUnLFxuXHQgICAgICAgICAgICAgICAgZmx1aWRXaWR0aDogZmxhZ3MuZGltZW5zaW9ucy53aWR0aC5zbGljZSgtMSkgPT0gJyUnLFxuXHQgICAgICAgICAgICAgICAgbW9kZTogbnVsbCxcblx0ICAgICAgICAgICAgICAgIGluaXRpYWxEaW1lbnNpb25zOiBkaW1lbnNpb25zXG5cdCAgICAgICAgICAgIH07XG5cblx0ICAgICAgICAgICAgaWYgKGZsdWlkQ29uZmlnLmZsdWlkV2lkdGggJiYgIWZsdWlkQ29uZmlnLmZsdWlkSGVpZ2h0KSB7XG5cdCAgICAgICAgICAgICAgICBmbHVpZENvbmZpZy5tb2RlID0gJ3dpZHRoJztcblx0ICAgICAgICAgICAgICAgIGZsdWlkQ29uZmlnLnJhdGlvID0gZmx1aWRDb25maWcuaW5pdGlhbERpbWVuc2lvbnMud2lkdGggLyBwYXJzZUZsb2F0KGZsYWdzLmRpbWVuc2lvbnMuaGVpZ2h0KTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmICghZmx1aWRDb25maWcuZmx1aWRXaWR0aCAmJiBmbHVpZENvbmZpZy5mbHVpZEhlaWdodCkge1xuXHQgICAgICAgICAgICAgICAgZmx1aWRDb25maWcubW9kZSA9ICdoZWlnaHQnO1xuXHQgICAgICAgICAgICAgICAgZmx1aWRDb25maWcucmF0aW8gPSBwYXJzZUZsb2F0KGZsYWdzLmRpbWVuc2lvbnMud2lkdGgpIC8gZmx1aWRDb25maWcuaW5pdGlhbERpbWVuc2lvbnMuaGVpZ2h0O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgZWwuaG9sZGVyRGF0YS5mbHVpZENvbmZpZyA9IGZsdWlkQ29uZmlnO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHNldEludmlzaWJsZShlbCk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cblx0LyoqXG5cdCAqIEl0ZXJhdGVzIHRocm91Z2ggYWxsIGN1cnJlbnQgaW52aXNpYmxlIGltYWdlcywgYW5kIGlmIHRoZXkncmUgdmlzaWJsZSwgcmVuZGVycyB0aGVtIGFuZCByZW1vdmVzIHRoZW0gZnJvbSBmdXJ0aGVyIGNoZWNrcy4gUnVucyBldmVyeSBhbmltYXRpb24gZnJhbWUuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiB2aXNpYmlsaXR5Q2hlY2soKSB7XG5cdCAgICB2YXIgcmVuZGVyYWJsZUltYWdlcyA9IFtdO1xuXHQgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhBcHAudmFycy5pbnZpc2libGVJbWFnZXMpO1xuXHQgICAgdmFyIGVsO1xuXG5cdCAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICAgIGVsID0gQXBwLnZhcnMuaW52aXNpYmxlSW1hZ2VzW2tleV07XG5cdCAgICAgICAgaWYgKGRpbWVuc2lvbkNoZWNrKGVsKSAmJiBlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdpbWcnKSB7XG5cdCAgICAgICAgICAgIHJlbmRlcmFibGVJbWFnZXMucHVzaChlbCk7XG5cdCAgICAgICAgICAgIGRlbGV0ZSBBcHAudmFycy5pbnZpc2libGVJbWFnZXNba2V5XTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgaWYgKHJlbmRlcmFibGVJbWFnZXMubGVuZ3RoKSB7XG5cdCAgICAgICAgSG9sZGVyLnJ1bih7XG5cdCAgICAgICAgICAgIGltYWdlczogcmVuZGVyYWJsZUltYWdlc1xuXHQgICAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICAvLyBEb25lIHRvIHByZXZlbnQgMTAwJSBDUFUgdXNhZ2UgdmlhIGFnZ3Jlc3NpdmUgY2FsbGluZyBvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcblx0ICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodmlzaWJpbGl0eUNoZWNrKTtcblx0ICAgIH0sIDEwKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydHMgY2hlY2tpbmcgZm9yIGludmlzaWJsZSBwbGFjZWhvbGRlcnMgaWYgbm90IGRvaW5nIHNvIHlldC4gRG9lcyBub3RoaW5nIG90aGVyd2lzZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIHN0YXJ0VmlzaWJpbGl0eUNoZWNrKCkge1xuXHQgICAgaWYgKCFBcHAudmFycy52aXNpYmlsaXR5Q2hlY2tTdGFydGVkKSB7XG5cdCAgICAgICAgZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSh2aXNpYmlsaXR5Q2hlY2spO1xuXHQgICAgICAgIEFwcC52YXJzLnZpc2liaWxpdHlDaGVja1N0YXJ0ZWQgPSB0cnVlO1xuXHQgICAgfVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSB1bmlxdWUgSUQgZm9yIGFuIGltYWdlIGRldGVjdGVkIHRvIGJlIGludmlzaWJsZSBhbmQgYWRkcyBpdCB0byB0aGUgbWFwIG9mIGludmlzaWJsZSBpbWFnZXMgY2hlY2tlZCBieSB2aXNpYmlsaXR5Q2hlY2tcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIGVsIEludmlzaWJsZSBET00gZWxlbWVudFxuXHQgKi9cblx0ZnVuY3Rpb24gc2V0SW52aXNpYmxlKGVsKSB7XG5cdCAgICBpZiAoIWVsLmhvbGRlckRhdGEuaW52aXNpYmxlSWQpIHtcblx0ICAgICAgICBBcHAudmFycy5pbnZpc2libGVJZCArPSAxO1xuXHQgICAgICAgIEFwcC52YXJzLmludmlzaWJsZUltYWdlc1snaScgKyBBcHAudmFycy5pbnZpc2libGVJZF0gPSBlbDtcblx0ICAgICAgICBlbC5ob2xkZXJEYXRhLmludmlzaWJsZUlkID0gQXBwLnZhcnMuaW52aXNpYmxlSWQ7XG5cdCAgICB9XG5cdH1cblxuXHQvL3RvZG86IHNlZSBpZiBwb3NzaWJsZSB0byBjb252ZXJ0IHN0YWdpbmdSZW5kZXJlciB0byB1c2UgSFRNTCBvbmx5XG5cdHZhciBzdGFnaW5nUmVuZGVyZXIgPSAoZnVuY3Rpb24oKSB7XG5cdCAgICB2YXIgc3ZnID0gbnVsbCxcblx0ICAgICAgICBzdGFnaW5nVGV4dCA9IG51bGwsXG5cdCAgICAgICAgc3RhZ2luZ1RleHROb2RlID0gbnVsbDtcblx0ICAgIHJldHVybiBmdW5jdGlvbihncmFwaCkge1xuXHQgICAgICAgIHZhciByb290Tm9kZSA9IGdyYXBoLnJvb3Q7XG5cdCAgICAgICAgaWYgKEFwcC5zZXR1cC5zdXBwb3J0c1NWRykge1xuXHQgICAgICAgICAgICB2YXIgZmlyc3RUaW1lU2V0dXAgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdmFyIHRub2RlID0gZnVuY3Rpb24odGV4dCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBpZiAoc3ZnID09IG51bGwgfHwgc3ZnLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmJvZHkpIHtcblx0ICAgICAgICAgICAgICAgIGZpcnN0VGltZVNldHVwID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHN2ZyA9IFNWRy5pbml0U1ZHKHN2Zywgcm9vdE5vZGUucHJvcGVydGllcy53aWR0aCwgcm9vdE5vZGUucHJvcGVydGllcy5oZWlnaHQpO1xuXHQgICAgICAgICAgICAvL1Nob3cgc3RhZ2luZyBlbGVtZW50IGJlZm9yZSBzdGFnaW5nXG5cdCAgICAgICAgICAgIHN2Zy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuXHQgICAgICAgICAgICBpZiAoZmlyc3RUaW1lU2V0dXApIHtcblx0ICAgICAgICAgICAgICAgIHN0YWdpbmdUZXh0ID0gRE9NLm5ld0VsKCd0ZXh0JywgU1ZHX05TKTtcblx0ICAgICAgICAgICAgICAgIHN0YWdpbmdUZXh0Tm9kZSA9IHRub2RlKG51bGwpO1xuXHQgICAgICAgICAgICAgICAgRE9NLnNldEF0dHIoc3RhZ2luZ1RleHQsIHtcblx0ICAgICAgICAgICAgICAgICAgICB4OiAwXG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIHN0YWdpbmdUZXh0LmFwcGVuZENoaWxkKHN0YWdpbmdUZXh0Tm9kZSk7XG5cdCAgICAgICAgICAgICAgICBzdmcuYXBwZW5kQ2hpbGQoc3RhZ2luZ1RleHQpO1xuXHQgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdmcpO1xuXHQgICAgICAgICAgICAgICAgc3ZnLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblx0ICAgICAgICAgICAgICAgIHN2Zy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdCAgICAgICAgICAgICAgICBzdmcuc3R5bGUudG9wID0gJy0xMDAlJztcblx0ICAgICAgICAgICAgICAgIHN2Zy5zdHlsZS5sZWZ0ID0gJy0xMDAlJztcblx0ICAgICAgICAgICAgICAgIC8vdG9kbzogd29ya2Fyb3VuZCBmb3IgemVyby1kaW1lbnNpb24gPHN2Zz4gdGFnIGluIE9wZXJhIDEyXG5cdCAgICAgICAgICAgICAgICAvL3N2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgMCk7XG5cdCAgICAgICAgICAgICAgICAvL3N2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIDApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIGhvbGRlclRleHRHcm91cCA9IHJvb3ROb2RlLmNoaWxkcmVuLmhvbGRlclRleHRHcm91cDtcblx0ICAgICAgICAgICAgdmFyIGh0Z1Byb3BzID0gaG9sZGVyVGV4dEdyb3VwLnByb3BlcnRpZXM7XG5cdCAgICAgICAgICAgIERPTS5zZXRBdHRyKHN0YWdpbmdUZXh0LCB7XG5cdCAgICAgICAgICAgICAgICAneSc6IGh0Z1Byb3BzLmZvbnQuc2l6ZSxcblx0ICAgICAgICAgICAgICAgICdzdHlsZSc6IHV0aWxzLmNzc1Byb3BzKHtcblx0ICAgICAgICAgICAgICAgICAgICAnZm9udC13ZWlnaHQnOiBodGdQcm9wcy5mb250LndlaWdodCxcblx0ICAgICAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogaHRnUHJvcHMuZm9udC5zaXplICsgaHRnUHJvcHMuZm9udC51bml0cyxcblx0ICAgICAgICAgICAgICAgICAgICAnZm9udC1mYW1pbHknOiBodGdQcm9wcy5mb250LmZhbWlseVxuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgfSk7XG5cblx0ICAgICAgICAgICAgLy9HZXQgYm91bmRpbmcgYm94IGZvciB0aGUgd2hvbGUgc3RyaW5nICh0b3RhbCB3aWR0aCBhbmQgaGVpZ2h0KVxuXHQgICAgICAgICAgICBzdGFnaW5nVGV4dE5vZGUubm9kZVZhbHVlID0gaHRnUHJvcHMudGV4dDtcblx0ICAgICAgICAgICAgdmFyIHN0YWdpbmdUZXh0QkJveCA9IHN0YWdpbmdUZXh0LmdldEJCb3goKTtcblxuXHQgICAgICAgICAgICAvL0dldCBsaW5lIGNvdW50IGFuZCBzcGxpdCB0aGUgc3RyaW5nIGludG8gd29yZHNcblx0ICAgICAgICAgICAgdmFyIGxpbmVDb3VudCA9IE1hdGguY2VpbChzdGFnaW5nVGV4dEJCb3gud2lkdGggLyByb290Tm9kZS5wcm9wZXJ0aWVzLndpZHRoKTtcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gaHRnUHJvcHMudGV4dC5zcGxpdCgnICcpO1xuXHQgICAgICAgICAgICB2YXIgbmV3bGluZXMgPSBodGdQcm9wcy50ZXh0Lm1hdGNoKC9cXFxcbi9nKTtcblx0ICAgICAgICAgICAgbGluZUNvdW50ICs9IG5ld2xpbmVzID09IG51bGwgPyAwIDogbmV3bGluZXMubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vR2V0IGJvdW5kaW5nIGJveCBmb3IgdGhlIHN0cmluZyB3aXRoIHNwYWNlcyByZW1vdmVkXG5cdCAgICAgICAgICAgIHN0YWdpbmdUZXh0Tm9kZS5ub2RlVmFsdWUgPSBodGdQcm9wcy50ZXh0LnJlcGxhY2UoL1sgXSsvZywgJycpO1xuXHQgICAgICAgICAgICB2YXIgY29tcHV0ZWROb1NwYWNlTGVuZ3RoID0gc3RhZ2luZ1RleHQuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCk7XG5cblx0ICAgICAgICAgICAgLy9Db21wdXRlIGF2ZXJhZ2Ugc3BhY2Ugd2lkdGhcblx0ICAgICAgICAgICAgdmFyIGRpZmZMZW5ndGggPSBzdGFnaW5nVGV4dEJCb3gud2lkdGggLSBjb21wdXRlZE5vU3BhY2VMZW5ndGg7XG5cdCAgICAgICAgICAgIHZhciBzcGFjZVdpZHRoID0gTWF0aC5yb3VuZChkaWZmTGVuZ3RoIC8gTWF0aC5tYXgoMSwgd29yZHMubGVuZ3RoIC0gMSkpO1xuXG5cdCAgICAgICAgICAgIC8vR2V0IHdpZHRocyBmb3IgZXZlcnkgd29yZCB3aXRoIHNwYWNlIG9ubHkgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBsaW5lXG5cdCAgICAgICAgICAgIHZhciB3b3JkV2lkdGhzID0gW107XG5cdCAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPiAxKSB7XG5cdCAgICAgICAgICAgICAgICBzdGFnaW5nVGV4dE5vZGUubm9kZVZhbHVlID0gJyc7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRzW2ldLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhZ2luZ1RleHROb2RlLm5vZGVWYWx1ZSA9IHV0aWxzLmRlY29kZUh0bWxFbnRpdHkod29yZHNbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBiYm94ID0gc3RhZ2luZ1RleHQuZ2V0QkJveCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHdvcmRXaWR0aHMucHVzaCh7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHdvcmRzW2ldLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYmJveC53aWR0aFxuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy9IaWRlIHN0YWdpbmcgZWxlbWVudCBhZnRlciBzdGFnaW5nXG5cdCAgICAgICAgICAgIHN2Zy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICBzcGFjZVdpZHRoOiBzcGFjZVdpZHRoLFxuXHQgICAgICAgICAgICAgICAgbGluZUNvdW50OiBsaW5lQ291bnQsXG5cdCAgICAgICAgICAgICAgICBib3VuZGluZ0JveDogc3RhZ2luZ1RleHRCQm94LFxuXHQgICAgICAgICAgICAgICAgd29yZHM6IHdvcmRXaWR0aHNcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvL3RvZG86IGNhbnZhcyBmYWxsYmFjayBmb3IgbWVhc3VyaW5nIHRleHQgb24gYW5kcm9pZCAyLjNcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdH0pKCk7XG5cblx0Ly9IZWxwZXJzXG5cblx0LyoqXG5cdCAqIFByZXZlbnRzIGEgZnVuY3Rpb24gZnJvbSBiZWluZyBjYWxsZWQgdG9vIG9mdGVuLCB3YWl0cyB1bnRpbCBhIHRpbWVyIGVsYXBzZXMgdG8gY2FsbCBpdCBhZ2FpblxuXHQgKlxuXHQgKiBAcGFyYW0gZm4gRnVuY3Rpb24gdG8gY2FsbFxuXHQgKi9cblx0ZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcblx0ICAgIGlmICghQXBwLnZhcnMuZGVib3VuY2VUaW1lcikgZm4uY2FsbCh0aGlzKTtcblx0ICAgIGlmIChBcHAudmFycy5kZWJvdW5jZVRpbWVyKSBnbG9iYWwuY2xlYXJUaW1lb3V0KEFwcC52YXJzLmRlYm91bmNlVGltZXIpO1xuXHQgICAgQXBwLnZhcnMuZGVib3VuY2VUaW1lciA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIEFwcC52YXJzLmRlYm91bmNlVGltZXIgPSBudWxsO1xuXHQgICAgICAgIGZuLmNhbGwodGhpcyk7XG5cdCAgICB9LCBBcHAuc2V0dXAuZGVib3VuY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhvbGRlci1zcGVjaWZpYyByZXNpemUvb3JpZW50YXRpb24gY2hhbmdlIGNhbGxiYWNrLCBkZWJvdW5jZWQgdG8gcHJldmVudCBleGNlc3NpdmUgZXhlY3V0aW9uXG5cdCAqL1xuXHRmdW5jdGlvbiByZXNpemVFdmVudCgpIHtcblx0ICAgIGRlYm91bmNlKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHVwZGF0ZVJlc2l6YWJsZUVsZW1lbnRzKG51bGwpO1xuXHQgICAgfSk7XG5cdH1cblxuXHQvL1NldCB1cCBmbGFnc1xuXG5cdGZvciAodmFyIGZsYWcgaW4gQXBwLmZsYWdzKSB7XG5cdCAgICBpZiAoIUFwcC5mbGFncy5oYXNPd25Qcm9wZXJ0eShmbGFnKSkgY29udGludWU7XG5cdCAgICBBcHAuZmxhZ3NbZmxhZ10ubWF0Y2ggPSBmdW5jdGlvbih2YWwpIHtcblx0ICAgICAgICByZXR1cm4gdmFsLm1hdGNoKHRoaXMucmVnZXgpO1xuXHQgICAgfTtcblx0fVxuXG5cdC8vUHJvcGVydGllcyBzZXQgb25jZSBvbiBzZXR1cFxuXG5cdEFwcC5zZXR1cCA9IHtcblx0ICAgIHJlbmRlcmVyOiAnaHRtbCcsXG5cdCAgICBkZWJvdW5jZTogMTAwLFxuXHQgICAgcmF0aW86IDEsXG5cdCAgICBzdXBwb3J0c0NhbnZhczogZmFsc2UsXG5cdCAgICBzdXBwb3J0c1NWRzogZmFsc2UsXG5cdCAgICBsaW5lV3JhcFJhdGlvOiAwLjksXG5cdCAgICBkYXRhQXR0cjogJ2RhdGEtc3JjJyxcblx0ICAgIHJlbmRlcmVyczogWydodG1sJywgJ2NhbnZhcycsICdzdmcnXVxuXHR9O1xuXG5cdC8vUHJvcGVydGllcyBtb2RpZmllZCBkdXJpbmcgcnVudGltZVxuXG5cdEFwcC52YXJzID0ge1xuXHQgICAgcHJlZW1wdGVkOiBmYWxzZSxcblx0ICAgIHJlc2l6YWJsZUltYWdlczogW10sXG5cdCAgICBpbnZpc2libGVJbWFnZXM6IHt9LFxuXHQgICAgaW52aXNpYmxlSWQ6IDAsXG5cdCAgICB2aXNpYmlsaXR5Q2hlY2tTdGFydGVkOiBmYWxzZSxcblx0ICAgIGRlYm91bmNlVGltZXI6IG51bGwsXG5cdCAgICBjYWNoZToge31cblx0fTtcblxuXHQvL1ByZS1mbGlnaHRcblxuXHQoZnVuY3Rpb24oKSB7XG5cdCAgICB2YXIgY2FudmFzID0gRE9NLm5ld0VsKCdjYW52YXMnKTtcblxuXHQgICAgaWYgKGNhbnZhcy5nZXRDb250ZXh0KSB7XG5cdCAgICAgICAgaWYgKGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpLmluZGV4T2YoJ2RhdGE6aW1hZ2UvcG5nJykgIT0gLTEpIHtcblx0ICAgICAgICAgICAgQXBwLnNldHVwLnJlbmRlcmVyID0gJ2NhbnZhcyc7XG5cdCAgICAgICAgICAgIEFwcC5zZXR1cC5zdXBwb3J0c0NhbnZhcyA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBpZiAoISFkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgJiYgISFkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCAnc3ZnJykuY3JlYXRlU1ZHUmVjdCkge1xuXHQgICAgICAgIEFwcC5zZXR1cC5yZW5kZXJlciA9ICdzdmcnO1xuXHQgICAgICAgIEFwcC5zZXR1cC5zdXBwb3J0c1NWRyA9IHRydWU7XG5cdCAgICB9XG5cdH0pKCk7XG5cblx0Ly9TdGFydHMgY2hlY2tpbmcgZm9yIGludmlzaWJsZSBwbGFjZWhvbGRlcnNcblx0c3RhcnRWaXNpYmlsaXR5Q2hlY2soKTtcblxuXHRpZiAob25Eb21SZWFkeSkge1xuXHQgICAgb25Eb21SZWFkeShmdW5jdGlvbigpIHtcblx0ICAgICAgICBpZiAoIUFwcC52YXJzLnByZWVtcHRlZCkge1xuXHQgICAgICAgICAgICBIb2xkZXIucnVuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuXHQgICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplRXZlbnQsIGZhbHNlKTtcblx0ICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgcmVzaXplRXZlbnQsIGZhbHNlKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoJ29ucmVzaXplJywgcmVzaXplRXZlbnQpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsLlR1cmJvbGlua3MgPT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgZ2xvYmFsLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2U6Y2hhbmdlJywgZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICBIb2xkZXIucnVuKCk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBIb2xkZXI7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0oKSkpKVxuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0LyohXG5cdCAqIG9uRG9tUmVhZHkuanMgMS40LjAgKGMpIDIwMTMgVHViYWwgTWFydGluIC0gTUlUIGxpY2Vuc2Vcblx0ICpcblx0ICogU3BlY2lhbGx5IG1vZGlmaWVkIHRvIHdvcmsgd2l0aCBIb2xkZXIuanNcblx0ICovXG5cblx0ZnVuY3Rpb24gX29uRG9tUmVhZHkod2luKSB7XG5cdCAgICAvL0xhenkgbG9hZGluZyBmaXggZm9yIEZpcmVmb3ggPCAzLjZcblx0ICAgIC8vaHR0cDovL3dlYnJlZmxlY3Rpb24uYmxvZ3Nwb3QuY29tLzIwMDkvMTEvMTk1LWNoYXJzLXRvLWhlbHAtbGF6eS1sb2FkaW5nLmh0bWxcblx0ICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09IG51bGwgJiYgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikge1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uIERPTUNvbnRlbnRMb2FkZWQoKSB7XG5cdCAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIERPTUNvbnRlbnRMb2FkZWQsIGZhbHNlKTtcblx0ICAgICAgICAgICAgZG9jdW1lbnQucmVhZHlTdGF0ZSA9IFwiY29tcGxldGVcIjtcblx0ICAgICAgICB9LCBmYWxzZSk7XG5cdCAgICAgICAgZG9jdW1lbnQucmVhZHlTdGF0ZSA9IFwibG9hZGluZ1wiO1xuXHQgICAgfVxuXHQgICAgXG5cdCAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50LFxuXHQgICAgICAgIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LFxuXHQgICAgXG5cdCAgICAgICAgTE9BRCA9IFwibG9hZFwiLFxuXHQgICAgICAgIEZBTFNFID0gZmFsc2UsXG5cdCAgICAgICAgT05MT0FEID0gXCJvblwiK0xPQUQsXG5cdCAgICAgICAgQ09NUExFVEUgPSBcImNvbXBsZXRlXCIsXG5cdCAgICAgICAgUkVBRFlTVEFURSA9IFwicmVhZHlTdGF0ZVwiLFxuXHQgICAgICAgIEFUVEFDSEVWRU5UID0gXCJhdHRhY2hFdmVudFwiLFxuXHQgICAgICAgIERFVEFDSEVWRU5UID0gXCJkZXRhY2hFdmVudFwiLFxuXHQgICAgICAgIEFEREVWRU5UTElTVEVORVIgPSBcImFkZEV2ZW50TGlzdGVuZXJcIixcblx0ICAgICAgICBET01DT05URU5UTE9BREVEID0gXCJET01Db250ZW50TG9hZGVkXCIsXG5cdCAgICAgICAgT05SRUFEWVNUQVRFQ0hBTkdFID0gXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIixcblx0ICAgICAgICBSRU1PVkVFVkVOVExJU1RFTkVSID0gXCJyZW1vdmVFdmVudExpc3RlbmVyXCIsXG5cdCAgICBcblx0ICAgICAgICAvLyBXM0MgRXZlbnQgbW9kZWxcblx0ICAgICAgICB3M2MgPSBBRERFVkVOVExJU1RFTkVSIGluIGRvYyxcblx0ICAgICAgICBfdG9wID0gRkFMU0UsXG5cdCAgICBcblx0ICAgICAgICAvLyBpc1JlYWR5OiBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHQgICAgICAgIGlzUmVhZHkgPSBGQUxTRSxcblx0ICAgIFxuXHQgICAgICAgIC8vIENhbGxiYWNrcyBwZW5kaW5nIGV4ZWN1dGlvbiB1bnRpbCBET00gaXMgcmVhZHlcblx0ICAgICAgICBjYWxsYmFja3MgPSBbXTtcblx0ICAgIFxuXHQgICAgLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeVxuXHQgICAgZnVuY3Rpb24gcmVhZHkoIGZuICkge1xuXHQgICAgICAgIGlmICggIWlzUmVhZHkgKSB7XG5cdCAgICBcblx0ICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGJvZHkgZXhpc3RzLCBhdCBsZWFzdCwgaW4gY2FzZSBJRSBnZXRzIGEgbGl0dGxlIG92ZXJ6ZWFsb3VzICh0aWNrZXQgIzU0NDMpLlxuXHQgICAgICAgICAgICBpZiAoICFkb2MuYm9keSApIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBkZWZlciggcmVhZHkgKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgXG5cdCAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHQgICAgICAgICAgICBpc1JlYWR5ID0gdHJ1ZTtcblx0ICAgIFxuXHQgICAgICAgICAgICAvLyBFeGVjdXRlIGFsbCBjYWxsYmFja3Ncblx0ICAgICAgICAgICAgd2hpbGUgKCBmbiA9IGNhbGxiYWNrcy5zaGlmdCgpICkge1xuXHQgICAgICAgICAgICAgICAgZGVmZXIoIGZuICk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBcblx0ICAgIC8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyXG5cdCAgICBmdW5jdGlvbiBjb21wbGV0ZWQoIGV2ZW50ICkge1xuXHQgICAgICAgIC8vIHJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiBpcyBnb29kIGVub3VnaCBmb3IgdXMgdG8gY2FsbCB0aGUgZG9tIHJlYWR5IGluIG9sZElFXG5cdCAgICAgICAgaWYgKCB3M2MgfHwgZXZlbnQudHlwZSA9PT0gTE9BRCB8fCBkb2NbUkVBRFlTVEFURV0gPT09IENPTVBMRVRFICkge1xuXHQgICAgICAgICAgICBkZXRhY2goKTtcblx0ICAgICAgICAgICAgcmVhZHkoKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBcblx0ICAgIC8vIENsZWFuLXVwIG1ldGhvZCBmb3IgZG9tIHJlYWR5IGV2ZW50c1xuXHQgICAgZnVuY3Rpb24gZGV0YWNoKCkge1xuXHQgICAgICAgIGlmICggdzNjICkge1xuXHQgICAgICAgICAgICBkb2NbUkVNT1ZFRVZFTlRMSVNURU5FUl0oIERPTUNPTlRFTlRMT0FERUQsIGNvbXBsZXRlZCwgRkFMU0UgKTtcblx0ICAgICAgICAgICAgd2luW1JFTU9WRUVWRU5UTElTVEVORVJdKCBMT0FELCBjb21wbGV0ZWQsIEZBTFNFICk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgZG9jW0RFVEFDSEVWRU5UXSggT05SRUFEWVNUQVRFQ0hBTkdFLCBjb21wbGV0ZWQgKTtcblx0ICAgICAgICAgICAgd2luW0RFVEFDSEVWRU5UXSggT05MT0FELCBjb21wbGV0ZWQgKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBcblx0ICAgIC8vIERlZmVycyBhIGZ1bmN0aW9uLCBzY2hlZHVsaW5nIGl0IHRvIHJ1biBhZnRlciB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLlxuXHQgICAgZnVuY3Rpb24gZGVmZXIoIGZuLCB3YWl0ICkge1xuXHQgICAgICAgIC8vIEFsbG93IDAgdG8gYmUgcGFzc2VkXG5cdCAgICAgICAgc2V0VGltZW91dCggZm4sICt3YWl0ID49IDAgPyB3YWl0IDogMSApO1xuXHQgICAgfVxuXHQgICAgXG5cdCAgICAvLyBBdHRhY2ggdGhlIGxpc3RlbmVyczpcblx0ICAgIFxuXHQgICAgLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgb25Eb21SZWFkeSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG5cdCAgICAvLyB3ZSBvbmNlIHRyaWVkIHRvIHVzZSByZWFkeVN0YXRlIFwiaW50ZXJhY3RpdmVcIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmVcblx0ICAgIC8vIGRpc2NvdmVyZWQgYnkgQ2hyaXNTIGhlcmU6IGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMjgyI2NvbW1lbnQ6MTVcblx0ICAgIGlmICggZG9jW1JFQURZU1RBVEVdID09PSBDT01QTEVURSApIHtcblx0ICAgICAgICAvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0ICAgICAgICBkZWZlciggcmVhZHkgKTtcblx0ICAgIFxuXHQgICAgLy8gU3RhbmRhcmRzLWJhc2VkIGJyb3dzZXJzIHN1cHBvcnQgRE9NQ29udGVudExvYWRlZFxuXHQgICAgfSBlbHNlIGlmICggdzNjICkge1xuXHQgICAgICAgIC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ICAgICAgICBkb2NbQURERVZFTlRMSVNURU5FUl0oIERPTUNPTlRFTlRMT0FERUQsIGNvbXBsZXRlZCwgRkFMU0UgKTtcblx0ICAgIFxuXHQgICAgICAgIC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdCAgICAgICAgd2luW0FEREVWRU5UTElTVEVORVJdKCBMT0FELCBjb21wbGV0ZWQsIEZBTFNFICk7XG5cdCAgICBcblx0ICAgIC8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWRcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgICAgLy8gRW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLCBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXNcblx0ICAgICAgICBkb2NbQVRUQUNIRVZFTlRdKCBPTlJFQURZU1RBVEVDSEFOR0UsIGNvbXBsZXRlZCApO1xuXHQgICAgXG5cdCAgICAgICAgLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0ICAgICAgICB3aW5bQVRUQUNIRVZFTlRdKCBPTkxPQUQsIGNvbXBsZXRlZCApO1xuXHQgICAgXG5cdCAgICAgICAgLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lXG5cdCAgICAgICAgLy8gY29udGludWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeVxuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIF90b3AgPSB3aW4uZnJhbWVFbGVtZW50ID09IG51bGwgJiYgZG9jRWxlbTtcblx0ICAgICAgICB9IGNhdGNoKGUpIHt9XG5cdCAgICBcblx0ICAgICAgICBpZiAoIF90b3AgJiYgX3RvcC5kb1Njcm9sbCApIHtcblx0ICAgICAgICAgICAgKGZ1bmN0aW9uIGRvU2Nyb2xsQ2hlY2soKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoICFpc1JlYWR5ICkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9JRUNvbnRlbnRMb2FkZWQvXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIF90b3AuZG9TY3JvbGwoXCJsZWZ0XCIpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXIoIGRvU2Nyb2xsQ2hlY2ssIDUwICk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gZGV0YWNoIGFsbCBkb20gcmVhZHkgZXZlbnRzXG5cdCAgICAgICAgICAgICAgICAgICAgZGV0YWNoKCk7XG5cdCAgICBcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnNcblx0ICAgICAgICAgICAgICAgICAgICByZWFkeSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KSgpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIFxuXHQgICAgZnVuY3Rpb24gb25Eb21SZWFkeSggZm4gKSB7XG5cdCAgICAgICAgLy8gSWYgRE9NIGlzIHJlYWR5LCBleGVjdXRlIHRoZSBmdW5jdGlvbiAoYXN5bmMpLCBvdGhlcndpc2Ugd2FpdFxuXHQgICAgICAgIGlzUmVhZHkgPyBkZWZlciggZm4gKSA6IGNhbGxiYWNrcy5wdXNoKCBmbiApO1xuXHQgICAgfVxuXHQgICAgXG5cdCAgICAvLyBBZGQgdmVyc2lvblxuXHQgICAgb25Eb21SZWFkeS52ZXJzaW9uID0gXCIxLjQuMFwiO1xuXHQgICAgLy8gQWRkIG1ldGhvZCB0byBjaGVjayBpZiBET00gaXMgcmVhZHlcblx0ICAgIG9uRG9tUmVhZHkuaXNSZWFkeSA9IGZ1bmN0aW9uKCl7XG5cdCAgICAgICAgcmV0dXJuIGlzUmVhZHk7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gb25Eb21SZWFkeTtcblx0fVxuXG5cdG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBfb25Eb21SZWFkeSh3aW5kb3cpO1xuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly9Nb2RpZmllZCB2ZXJzaW9uIG9mIGNvbXBvbmVudC9xdWVyeXN0cmluZ1xuXHQvL0NoYW5nZXM6IHVwZGF0ZWQgZGVwZW5kZW5jaWVzLCBkb3Qgbm90YXRpb24gcGFyc2luZywgSlNIaW50IGZpeGVzXG5cdC8vRm9yayBhdCBodHRwczovL2dpdGh1Yi5jb20vaW1za3kvcXVlcnlzdHJpbmdcblxuXHQvKipcblx0ICogTW9kdWxlIGRlcGVuZGVuY2llcy5cblx0ICovXG5cblx0dmFyIGVuY29kZSA9IGVuY29kZVVSSUNvbXBvbmVudDtcblx0dmFyIGRlY29kZSA9IGRlY29kZVVSSUNvbXBvbmVudDtcblx0dmFyIHRyaW0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgdHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cblx0dmFyIGFycmF5UmVnZXggPSAvKFxcdyspXFxbKFxcZCspXFxdLztcblx0dmFyIG9iamVjdFJlZ2V4ID0gL1xcdytcXC5cXHcrLztcblxuXHQvKipcblx0ICogUGFyc2UgdGhlIGdpdmVuIHF1ZXJ5IGBzdHJgLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG5cdCAqIEByZXR1cm4ge09iamVjdH1cblx0ICogQGFwaSBwdWJsaWNcblx0ICovXG5cblx0ZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uKHN0cil7XG5cdCAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2Ygc3RyKSByZXR1cm4ge307XG5cblx0ICBzdHIgPSB0cmltKHN0cik7XG5cdCAgaWYgKCcnID09PSBzdHIpIHJldHVybiB7fTtcblx0ICBpZiAoJz8nID09PSBzdHIuY2hhckF0KDApKSBzdHIgPSBzdHIuc2xpY2UoMSk7XG5cblx0ICB2YXIgb2JqID0ge307XG5cdCAgdmFyIHBhaXJzID0gc3RyLnNwbGl0KCcmJyk7XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuXHQgICAgdmFyIHBhcnRzID0gcGFpcnNbaV0uc3BsaXQoJz0nKTtcblx0ICAgIHZhciBrZXkgPSBkZWNvZGUocGFydHNbMF0pO1xuXHQgICAgdmFyIG0sIGN0eCwgcHJvcDtcblxuXHQgICAgaWYgKG0gPSBhcnJheVJlZ2V4LmV4ZWMoa2V5KSkge1xuXHQgICAgICBvYmpbbVsxXV0gPSBvYmpbbVsxXV0gfHwgW107XG5cdCAgICAgIG9ialttWzFdXVttWzJdXSA9IGRlY29kZShwYXJ0c1sxXSk7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXG5cdCAgICBpZiAobSA9IG9iamVjdFJlZ2V4LnRlc3Qoa2V5KSkge1xuXHQgICAgICBtID0ga2V5LnNwbGl0KCcuJyk7XG5cdCAgICAgIGN0eCA9IG9iajtcblx0ICAgICAgXG5cdCAgICAgIHdoaWxlIChtLmxlbmd0aCkge1xuXHQgICAgICAgIHByb3AgPSBtLnNoaWZ0KCk7XG5cblx0ICAgICAgICBpZiAoIXByb3AubGVuZ3RoKSBjb250aW51ZTtcblxuXHQgICAgICAgIGlmICghY3R4W3Byb3BdKSB7XG5cdCAgICAgICAgICBjdHhbcHJvcF0gPSB7fTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGN0eFtwcm9wXSAmJiB0eXBlb2YgY3R4W3Byb3BdICE9PSAnb2JqZWN0Jykge1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKCFtLmxlbmd0aCkge1xuXHQgICAgICAgICAgY3R4W3Byb3BdID0gZGVjb2RlKHBhcnRzWzFdKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBjdHggPSBjdHhbcHJvcF07XG5cdCAgICAgIH1cblxuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblxuXHQgICAgb2JqW3BhcnRzWzBdXSA9IG51bGwgPT0gcGFydHNbMV0gPyAnJyA6IGRlY29kZShwYXJ0c1sxXSk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIG9iajtcblx0fTtcblxuXHQvKipcblx0ICogU3RyaW5naWZ5IHRoZSBnaXZlbiBgb2JqYC5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IG9ialxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqIEBhcGkgcHVibGljXG5cdCAqL1xuXG5cdGV4cG9ydHMuc3RyaW5naWZ5ID0gZnVuY3Rpb24ob2JqKXtcblx0ICBpZiAoIW9iaikgcmV0dXJuICcnO1xuXHQgIHZhciBwYWlycyA9IFtdO1xuXG5cdCAgZm9yICh2YXIga2V5IGluIG9iaikge1xuXHQgICAgdmFyIHZhbHVlID0gb2JqW2tleV07XG5cblx0ICAgIGlmICgnYXJyYXknID09IHR5cGUodmFsdWUpKSB7XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICBwYWlycy5wdXNoKGVuY29kZShrZXkgKyAnWycgKyBpICsgJ10nKSArICc9JyArIGVuY29kZSh2YWx1ZVtpXSkpO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXG5cdCAgICBwYWlycy5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKG9ialtrZXldKSk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHBhaXJzLmpvaW4oJyYnKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRyaW07XG5cblx0ZnVuY3Rpb24gdHJpbShzdHIpe1xuXHQgIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xuXHR9XG5cblx0ZXhwb3J0cy5sZWZ0ID0gZnVuY3Rpb24oc3RyKXtcblx0ICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpO1xuXHR9O1xuXG5cdGV4cG9ydHMucmlnaHQgPSBmdW5jdGlvbihzdHIpe1xuXHQgIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qKlxuXHQgKiB0b1N0cmluZyByZWYuXG5cdCAqL1xuXG5cdHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgdHlwZSBvZiBgdmFsYC5cblx0ICpcblx0ICogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICogQGFwaSBwdWJsaWNcblx0ICovXG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwpe1xuXHQgIHN3aXRjaCAodG9TdHJpbmcuY2FsbCh2YWwpKSB7XG5cdCAgICBjYXNlICdbb2JqZWN0IERhdGVdJzogcmV0dXJuICdkYXRlJztcblx0ICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6IHJldHVybiAncmVnZXhwJztcblx0ICAgIGNhc2UgJ1tvYmplY3QgQXJndW1lbnRzXSc6IHJldHVybiAnYXJndW1lbnRzJztcblx0ICAgIGNhc2UgJ1tvYmplY3QgQXJyYXldJzogcmV0dXJuICdhcnJheSc7XG5cdCAgICBjYXNlICdbb2JqZWN0IEVycm9yXSc6IHJldHVybiAnZXJyb3InO1xuXHQgIH1cblxuXHQgIGlmICh2YWwgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG5cdCAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJ3VuZGVmaW5lZCc7XG5cdCAgaWYgKHZhbCAhPT0gdmFsKSByZXR1cm4gJ25hbic7XG5cdCAgaWYgKHZhbCAmJiB2YWwubm9kZVR5cGUgPT09IDEpIHJldHVybiAnZWxlbWVudCc7XG5cblx0ICBpZiAoaXNCdWZmZXIodmFsKSkgcmV0dXJuICdidWZmZXInO1xuXG5cdCAgdmFsID0gdmFsLnZhbHVlT2Zcblx0ICAgID8gdmFsLnZhbHVlT2YoKVxuXHQgICAgOiBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YuYXBwbHkodmFsKTtcblxuXHQgIHJldHVybiB0eXBlb2YgdmFsO1xuXHR9O1xuXG5cdC8vIGNvZGUgYm9ycm93ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2lzLWJ1ZmZlci9ibG9iL21hc3Rlci9pbmRleC5qc1xuXHRmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcblx0ICByZXR1cm4gISEob2JqICE9IG51bGwgJiZcblx0ICAgIChvYmouX2lzQnVmZmVyIHx8IC8vIEZvciBTYWZhcmkgNS03IChtaXNzaW5nIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpXG5cdCAgICAgIChvYmouY29uc3RydWN0b3IgJiZcblx0ICAgICAgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHQgICAgICBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSlcblx0ICAgICkpXG5cdH1cblxuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIFNjZW5lR3JhcGggPSBmdW5jdGlvbihzY2VuZVByb3BlcnRpZXMpIHtcblx0ICAgIHZhciBub2RlQ291bnQgPSAxO1xuXG5cdCAgICAvL3RvZG86IG1vdmUgbWVyZ2UgdG8gaGVscGVycyBzZWN0aW9uXG5cdCAgICBmdW5jdGlvbiBtZXJnZShwYXJlbnQsIGNoaWxkKSB7XG5cdCAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBjaGlsZCkge1xuXHQgICAgICAgICAgICBwYXJlbnRbcHJvcF0gPSBjaGlsZFtwcm9wXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHBhcmVudDtcblx0ICAgIH1cblxuXHQgICAgdmFyIFNjZW5lTm9kZSA9IGZ1bmN0aW9uKG5hbWUpIHtcblx0ICAgICAgICBub2RlQ291bnQrKztcblx0ICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHt9O1xuXHQgICAgICAgIHRoaXMuaWQgPSBub2RlQ291bnQ7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gJ24nICsgbm9kZUNvdW50O1xuXHQgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy54ID0gdGhpcy55ID0gdGhpcy56ID0gMDtcblx0ICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQgPSAwO1xuXHQgICAgfTtcblxuXHQgICAgU2NlbmVOb2RlLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICAgICAgaWYgKHdpZHRoICE9IG51bGwpIHtcblx0ICAgICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoaGVpZ2h0ICE9IG51bGwpIHtcblx0ICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgU2NlbmVOb2RlLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG5cdCAgICAgICAgdGhpcy54ID0geCAhPSBudWxsID8geCA6IHRoaXMueDtcblx0ICAgICAgICB0aGlzLnkgPSB5ICE9IG51bGwgPyB5IDogdGhpcy55O1xuXHQgICAgICAgIHRoaXMueiA9IHogIT0gbnVsbCA/IHogOiB0aGlzLno7XG5cdCAgICB9O1xuXG5cdCAgICBTY2VuZU5vZGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGNoaWxkKSB7XG5cdCAgICAgICAgdmFyIG5hbWUgPSBjaGlsZC5uYW1lO1xuXHQgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jaGlsZHJlbltuYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltuYW1lXSA9IGNoaWxkO1xuXHQgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRocm93ICdTY2VuZUdyYXBoOiBjaGlsZCBhbHJlYWR5IGV4aXN0czogJyArIG5hbWU7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgdmFyIFJvb3ROb2RlID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgU2NlbmVOb2RlLmNhbGwodGhpcywgJ3Jvb3QnKTtcblx0ICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBzY2VuZVByb3BlcnRpZXM7XG5cdCAgICB9O1xuXG5cdCAgICBSb290Tm9kZS5wcm90b3R5cGUgPSBuZXcgU2NlbmVOb2RlKCk7XG5cblx0ICAgIHZhciBTaGFwZSA9IGZ1bmN0aW9uKG5hbWUsIHByb3BzKSB7XG5cdCAgICAgICAgU2NlbmVOb2RlLmNhbGwodGhpcywgbmFtZSk7XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0ge1xuXHQgICAgICAgICAgICAnZmlsbCc6ICcjMDAwMDAwJ1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgaWYgKHR5cGVvZiBwcm9wcyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgbWVyZ2UodGhpcy5wcm9wZXJ0aWVzLCBwcm9wcyk7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgIHRocm93ICdTY2VuZUdyYXBoOiBpbnZhbGlkIG5vZGUgbmFtZSc7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgU2hhcGUucHJvdG90eXBlID0gbmV3IFNjZW5lTm9kZSgpO1xuXG5cdCAgICB2YXIgR3JvdXAgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICBTaGFwZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIHRoaXMudHlwZSA9ICdncm91cCc7XG5cdCAgICB9O1xuXG5cdCAgICBHcm91cC5wcm90b3R5cGUgPSBuZXcgU2hhcGUoKTtcblxuXHQgICAgdmFyIFJlY3QgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICBTaGFwZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIHRoaXMudHlwZSA9ICdyZWN0Jztcblx0ICAgIH07XG5cblx0ICAgIFJlY3QucHJvdG90eXBlID0gbmV3IFNoYXBlKCk7XG5cblx0ICAgIHZhciBUZXh0ID0gZnVuY3Rpb24odGV4dCkge1xuXHQgICAgICAgIFNoYXBlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy50eXBlID0gJ3RleHQnO1xuXHQgICAgICAgIHRoaXMucHJvcGVydGllcy50ZXh0ID0gdGV4dDtcblx0ICAgIH07XG5cblx0ICAgIFRleHQucHJvdG90eXBlID0gbmV3IFNoYXBlKCk7XG5cblx0ICAgIHZhciByb290ID0gbmV3IFJvb3ROb2RlKCk7XG5cblx0ICAgIHRoaXMuU2hhcGUgPSB7XG5cdCAgICAgICAgJ1JlY3QnOiBSZWN0LFxuXHQgICAgICAgICdUZXh0JzogVGV4dCxcblx0ICAgICAgICAnR3JvdXAnOiBHcm91cFxuXHQgICAgfTtcblxuXHQgICAgdGhpcy5yb290ID0gcm9vdDtcblx0ICAgIHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gU2NlbmVHcmFwaDtcblxuXG4vKioqLyB9LFxuLyogNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKGdsb2JhbCkgey8qKlxuXHQgKiBTaGFsbG93IG9iamVjdCBjbG9uZSBhbmQgbWVyZ2Vcblx0ICpcblx0ICogQHBhcmFtIGEgT2JqZWN0IEFcblx0ICogQHBhcmFtIGIgT2JqZWN0IEJcblx0ICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCB3aXRoIGFsbCBvZiBBJ3MgcHJvcGVydGllcywgYW5kIGFsbCBvZiBCJ3MgcHJvcGVydGllcywgb3ZlcndyaXRpbmcgQSdzIHByb3BlcnRpZXNcblx0ICovXG5cdGV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oYSwgYikge1xuXHQgICAgdmFyIGMgPSB7fTtcblx0ICAgIGZvciAodmFyIHggaW4gYSkge1xuXHQgICAgICAgIGlmIChhLmhhc093blByb3BlcnR5KHgpKSB7XG5cdCAgICAgICAgICAgIGNbeF0gPSBhW3hdO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChiICE9IG51bGwpIHtcblx0ICAgICAgICBmb3IgKHZhciB5IGluIGIpIHtcblx0ICAgICAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoeSkpIHtcblx0ICAgICAgICAgICAgICAgIGNbeV0gPSBiW3ldO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGM7XG5cdH07XG5cblx0LyoqXG5cdCAqIFRha2VzIGEgay92IGxpc3Qgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIHJldHVybnMgYSBydWxlXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wcyBDU1MgcHJvcGVydGllcyBvYmplY3Rcblx0ICovXG5cdGV4cG9ydHMuY3NzUHJvcHMgPSBmdW5jdGlvbihwcm9wcykge1xuXHQgICAgdmFyIHJldCA9IFtdO1xuXHQgICAgZm9yICh2YXIgcCBpbiBwcm9wcykge1xuXHQgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuXHQgICAgICAgICAgICByZXQucHVzaChwICsgJzonICsgcHJvcHNbcF0pO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiByZXQuam9pbignOycpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBFbmNvZGVzIEhUTUwgZW50aXRpZXMgaW4gYSBzdHJpbmdcblx0ICpcblx0ICogQHBhcmFtIHN0ciBJbnB1dCBzdHJpbmdcblx0ICovXG5cdGV4cG9ydHMuZW5jb2RlSHRtbEVudGl0eSA9IGZ1bmN0aW9uKHN0cikge1xuXHQgICAgdmFyIGJ1ZiA9IFtdO1xuXHQgICAgdmFyIGNoYXJDb2RlID0gMDtcblx0ICAgIGZvciAodmFyIGkgPSBzdHIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgICBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXHQgICAgICAgIGlmIChjaGFyQ29kZSA+IDEyOCkge1xuXHQgICAgICAgICAgICBidWYudW5zaGlmdChbJyYjJywgY2hhckNvZGUsICc7J10uam9pbignJykpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGJ1Zi51bnNoaWZ0KHN0cltpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKTtcblx0fTtcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGFuIGltYWdlIGV4aXN0c1xuXHQgKlxuXHQgKiBAcGFyYW0gc3JjIFVSTCBvZiBpbWFnZVxuXHQgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gY2FsbCBvbmNlIGltYWdlIHN0YXR1cyBoYXMgYmVlbiBmb3VuZFxuXHQgKi9cblx0ZXhwb3J0cy5pbWFnZUV4aXN0cyA9IGZ1bmN0aW9uKHNyYywgY2FsbGJhY2spIHtcblx0ICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuXHQgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZmFsc2UpO1xuXHQgICAgfTtcblx0ICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgdHJ1ZSk7XG5cdCAgICB9O1xuXHQgICAgaW1hZ2Uuc3JjID0gc3JjO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWNvZGVzIEhUTUwgZW50aXRpZXMgaW4gYSBzdHJpbmdcblx0ICpcblx0ICogQHBhcmFtIHN0ciBJbnB1dCBzdHJpbmdcblx0ICovXG5cdGV4cG9ydHMuZGVjb2RlSHRtbEVudGl0eSA9IGZ1bmN0aW9uKHN0cikge1xuXHQgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mIyhcXGQrKTsvZywgZnVuY3Rpb24obWF0Y2gsIGRlYykge1xuXHQgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGRlYyk7XG5cdCAgICB9KTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGVsZW1lbnQncyBkaW1lbnNpb25zIGlmIGl0J3MgdmlzaWJsZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbCBET00gZWxlbWVudFxuXHQgKi9cblx0ZXhwb3J0cy5kaW1lbnNpb25DaGVjayA9IGZ1bmN0aW9uKGVsKSB7XG5cdCAgICB2YXIgZGltZW5zaW9ucyA9IHtcblx0ICAgICAgICBoZWlnaHQ6IGVsLmNsaWVudEhlaWdodCxcblx0ICAgICAgICB3aWR0aDogZWwuY2xpZW50V2lkdGhcblx0ICAgIH07XG5cblx0ICAgIGlmIChkaW1lbnNpb25zLmhlaWdodCAmJiBkaW1lbnNpb25zLndpZHRoKSB7XG5cdCAgICAgICAgcmV0dXJuIGRpbWVuc2lvbnM7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0fTtcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgdHJ1dGh5IG9yIGlmIGl0IGlzIFwic2VtYW50aWNhbGx5IHRydXRoeVwiXG5cdCAqIEBwYXJhbSB2YWxcblx0ICovXG5cdGV4cG9ydHMudHJ1dGh5ID0gZnVuY3Rpb24odmFsKSB7XG5cdCAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICByZXR1cm4gdmFsID09PSAndHJ1ZScgfHwgdmFsID09PSAneWVzJyB8fCB2YWwgPT09ICcxJyB8fCB2YWwgPT09ICdvbicgfHwgdmFsID09PSAn4pyTJztcblx0ICAgIH1cblx0ICAgIHJldHVybiAhIXZhbDtcblx0fTtcblxuXHQvKipcblx0ICogUGFyc2VzIGlucHV0IGludG8gYSB3ZWxsLWZvcm1lZCBDU1MgY29sb3Jcblx0ICogQHBhcmFtIHZhbFxuXHQgKi9cblx0ZXhwb3J0cy5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsKSB7XG5cdCAgICB2YXIgaGV4cmUgPSAvKF4oPzojPylbMC05YS1mXXs2fSQpfCheKD86Iz8pWzAtOWEtZl17M30kKS9pO1xuXHQgICAgdmFyIHJnYnJlID0gL15yZ2JcXCgoXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqXFwpJC87XG5cdCAgICB2YXIgcmdiYXJlID0gL15yZ2JhXFwoKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKixcXHMqKDBcXC5cXGR7MSx9fDEpXFwpJC87XG5cblx0ICAgIHZhciBtYXRjaCA9IHZhbC5tYXRjaChoZXhyZSk7XG5cdCAgICB2YXIgcmV0dmFsO1xuXG5cdCAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcblx0ICAgICAgICByZXR2YWwgPSBtYXRjaFsxXSB8fCBtYXRjaFsyXTtcblx0ICAgICAgICBpZiAocmV0dmFsWzBdICE9PSAnIycpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICcjJyArIHJldHZhbDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgbWF0Y2ggPSB2YWwubWF0Y2gocmdicmUpO1xuXG5cdCAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcblx0ICAgICAgICByZXR2YWwgPSAncmdiKCcgKyBtYXRjaC5zbGljZSgxKS5qb2luKCcsJykgKyAnKSc7XG5cdCAgICAgICAgcmV0dXJuIHJldHZhbDtcblx0ICAgIH1cblxuXHQgICAgbWF0Y2ggPSB2YWwubWF0Y2gocmdiYXJlKTtcblxuXHQgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dmFsID0gJ3JnYmEoJyArIG1hdGNoLnNsaWNlKDEpLmpvaW4oJywnKSArICcpJztcblx0ICAgICAgICByZXR1cm4gcmV0dmFsO1xuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gbnVsbDtcblx0fTtcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIGNvcnJlY3Qgc2NhbGluZyByYXRpbyBmb3IgY2FudmFzIGRyYXdpbmcgb3BlcmF0aW9ucyBvbiBIaURQSSBzY3JlZW5zIChlLmcuIFJldGluYSBkaXNwbGF5cylcblx0ICovXG5cdGV4cG9ydHMuY2FudmFzUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgZGV2aWNlUGl4ZWxSYXRpbyA9IDE7XG5cdCAgICB2YXIgYmFja2luZ1N0b3JlUmF0aW8gPSAxO1xuXG5cdCAgICBpZiAoZ2xvYmFsLmRvY3VtZW50KSB7XG5cdCAgICAgICAgdmFyIGNhbnZhcyA9IGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblx0ICAgICAgICBpZiAoY2FudmFzLmdldENvbnRleHQpIHtcblx0ICAgICAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXHQgICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvID0gZ2xvYmFsLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblx0ICAgICAgICAgICAgYmFja2luZ1N0b3JlUmF0aW8gPSBjdHgud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHgubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHgubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGN0eC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHguYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCAxO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVSYXRpbztcblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0oKSkpKVxuXG4vKioqLyB9LFxuLyogOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKGdsb2JhbCkge3ZhciBET00gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5cdHZhciBTVkdfTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXHR2YXIgTk9ERV9UWVBFX0NPTU1FTlQgPSA4O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmljIFNWRyBlbGVtZW50IGNyZWF0aW9uIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwYXJhbSBzdmcgU1ZHIGNvbnRleHQsIHNldCB0byBudWxsIGlmIG5ld1xuXHQgKiBAcGFyYW0gd2lkdGggRG9jdW1lbnQgd2lkdGhcblx0ICogQHBhcmFtIGhlaWdodCBEb2N1bWVudCBoZWlnaHRcblx0ICovXG5cdGV4cG9ydHMuaW5pdFNWRyA9IGZ1bmN0aW9uKHN2Zywgd2lkdGgsIGhlaWdodCkge1xuXHQgICAgdmFyIGRlZnMsIHN0eWxlLCBpbml0aWFsaXplID0gZmFsc2U7XG5cblx0ICAgIGlmIChzdmcgJiYgc3ZnLnF1ZXJ5U2VsZWN0b3IpIHtcblx0ICAgICAgICBzdHlsZSA9IHN2Zy5xdWVyeVNlbGVjdG9yKCdzdHlsZScpO1xuXHQgICAgICAgIGlmIChzdHlsZSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICBpbml0aWFsaXplID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAgIHN2ZyA9IERPTS5uZXdFbCgnc3ZnJywgU1ZHX05TKTtcblx0ICAgICAgICBpbml0aWFsaXplID0gdHJ1ZTtcblx0ICAgIH1cblxuXHQgICAgaWYgKGluaXRpYWxpemUpIHtcblx0ICAgICAgICBkZWZzID0gRE9NLm5ld0VsKCdkZWZzJywgU1ZHX05TKTtcblx0ICAgICAgICBzdHlsZSA9IERPTS5uZXdFbCgnc3R5bGUnLCBTVkdfTlMpO1xuXHQgICAgICAgIERPTS5zZXRBdHRyKHN0eWxlLCB7XG5cdCAgICAgICAgICAgICd0eXBlJzogJ3RleHQvY3NzJ1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGRlZnMuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHQgICAgICAgIHN2Zy5hcHBlbmRDaGlsZChkZWZzKTtcblx0ICAgIH1cblxuXHQgICAgLy9JRSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoaXMgaXMgc2V0IGFuZCBDaHJvbWUgcmVxdWlyZXMgaXQgdG8gYmUgc2V0XG5cdCAgICBpZiAoc3ZnLndlYmtpdE1hdGNoZXNTZWxlY3Rvcikge1xuXHQgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgU1ZHX05TKTtcblx0ICAgIH1cblxuXHQgICAgLy9SZW1vdmUgY29tbWVudCBub2Rlc1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdmcuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIGlmIChzdmcuY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0NPTU1FTlQpIHtcblx0ICAgICAgICAgICAgc3ZnLnJlbW92ZUNoaWxkKHN2Zy5jaGlsZE5vZGVzW2ldKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIC8vUmVtb3ZlIENTU1xuXHQgICAgd2hpbGUgKHN0eWxlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdCAgICAgICAgc3R5bGUucmVtb3ZlQ2hpbGQoc3R5bGUuY2hpbGROb2Rlc1swXSk7XG5cdCAgICB9XG5cblx0ICAgIERPTS5zZXRBdHRyKHN2Zywge1xuXHQgICAgICAgICd3aWR0aCc6IHdpZHRoLFxuXHQgICAgICAgICdoZWlnaHQnOiBoZWlnaHQsXG5cdCAgICAgICAgJ3ZpZXdCb3gnOiAnMCAwICcgKyB3aWR0aCArICcgJyArIGhlaWdodCxcblx0ICAgICAgICAncHJlc2VydmVBc3BlY3RSYXRpbyc6ICdub25lJ1xuXHQgICAgfSk7XG5cblx0ICAgIHJldHVybiBzdmc7XG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHNlcmlhbGl6ZWQgU1ZHIHRvIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkYXRhIFVSSSB1c2Vcblx0ICogQHBhcmFtIHN2Z1N0cmluZyBTZXJpYWxpemVkIFNWRyBzdHJpbmdcblx0ICogQHBhcmFtIFtiYXNlNjRdIFVzZSBiYXNlNjQgZW5jb2RpbmcgZm9yIGRhdGEgVVJJXG5cdCAqL1xuXHRleHBvcnRzLnN2Z1N0cmluZ1RvRGF0YVVSSSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgdmFyIHJhd1ByZWZpeCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD1VVEYtOCwnO1xuXHQgICAgdmFyIGJhc2U2NFByZWZpeCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD1VVEYtODtiYXNlNjQsJztcblxuXHQgICAgcmV0dXJuIGZ1bmN0aW9uKHN2Z1N0cmluZywgYmFzZTY0KSB7XG5cdCAgICAgICAgaWYgKGJhc2U2NCkge1xuXHQgICAgICAgICAgICByZXR1cm4gYmFzZTY0UHJlZml4ICsgYnRvYShnbG9iYWwudW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN2Z1N0cmluZykpKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gcmF3UHJlZml4ICsgZW5jb2RlVVJJQ29tcG9uZW50KHN2Z1N0cmluZyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0fSgpO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHNlcmlhbGl6ZWQgU1ZHIHdpdGggWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zXG5cdCAqXG5cdCAqIEBwYXJhbSBzdmcgU1ZHIGNvbnRleHRcblx0ICogQHBhcmFtIHN0eWxlc2hlZXRzIENTUyBzdHlsZXNoZWV0cyB0byBpbmNsdWRlXG5cdCAqL1xuXHRleHBvcnRzLnNlcmlhbGl6ZVNWRyA9IGZ1bmN0aW9uKHN2ZywgZW5naW5lU2V0dGluZ3MpIHtcblx0ICAgIGlmICghZ2xvYmFsLlhNTFNlcmlhbGl6ZXIpIHJldHVybjtcblx0ICAgIHZhciBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcblx0ICAgIHZhciBzdmdDU1MgPSAnJztcblx0ICAgIHZhciBzdHlsZXNoZWV0cyA9IGVuZ2luZVNldHRpbmdzLnN0eWxlc2hlZXRzO1xuXG5cdCAgICAvL0V4dGVybmFsIHN0eWxlc2hlZXRzOiBQcm9jZXNzaW5nIEluc3RydWN0aW9uIG1ldGhvZFxuXHQgICAgaWYgKGVuZ2luZVNldHRpbmdzLnN2Z1hNTFN0eWxlc2hlZXQpIHtcblx0ICAgICAgICB2YXIgeG1sID0gRE9NLmNyZWF0ZVhNTCgpO1xuXHQgICAgICAgIC8vQWRkIDw/eG1sLXN0eWxlc2hlZXQgPz4gZGlyZWN0aXZlc1xuXHQgICAgICAgIGZvciAodmFyIGkgPSBzdHlsZXNoZWV0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHQgICAgICAgICAgICB2YXIgY3NzcGkgPSB4bWwuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCd4bWwtc3R5bGVzaGVldCcsICdocmVmPVwiJyArIHN0eWxlc2hlZXRzW2ldICsgJ1wiIHJlbD1cInN0eWxlc2hlZXRcIicpO1xuXHQgICAgICAgICAgICB4bWwuaW5zZXJ0QmVmb3JlKGNzc3BpLCB4bWwuZmlyc3RDaGlsZCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgeG1sLnJlbW92ZUNoaWxkKHhtbC5kb2N1bWVudEVsZW1lbnQpO1xuXHQgICAgICAgIHN2Z0NTUyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoeG1sKTtcblx0ICAgIH1cblxuXHQgICAgdmFyIHN2Z1RleHQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKHN2Zyk7XG5cdCAgICBzdmdUZXh0ID0gc3ZnVGV4dC5yZXBsYWNlKC9cXCZhbXA7KFxcI1swLTldezIsfVxcOykvZywgJyYkMScpO1xuXHQgICAgcmV0dXJuIHN2Z0NTUyArIHN2Z1RleHQ7XG5cdH07XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0oKSkpKVxuXG4vKioqLyB9LFxuLyogOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKGdsb2JhbCkgey8qKlxuXHQgKiBHZW5lcmljIG5ldyBET00gZWxlbWVudCBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcGFyYW0gdGFnIFRhZyB0byBjcmVhdGVcblx0ICogQHBhcmFtIG5hbWVzcGFjZSBPcHRpb25hbCBuYW1lc3BhY2UgdmFsdWVcblx0ICovXG5cdGV4cG9ydHMubmV3RWwgPSBmdW5jdGlvbih0YWcsIG5hbWVzcGFjZSkge1xuXHQgICAgaWYgKCFnbG9iYWwuZG9jdW1lbnQpIHJldHVybjtcblxuXHQgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAgIHJldHVybiBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgdGFnKTtcblx0ICAgIH1cblx0fTtcblxuXHQvKipcblx0ICogR2VuZXJpYyBzZXRBdHRyaWJ1dGUgZnVuY3Rpb25cblx0ICpcblx0ICogQHBhcmFtIGVsIFJlZmVyZW5jZSB0byBET00gZWxlbWVudFxuXHQgKiBAcGFyYW0gYXR0cnMgT2JqZWN0IHdpdGggYXR0cmlidXRlIGtleXMgYW5kIHZhbHVlc1xuXHQgKi9cblx0ZXhwb3J0cy5zZXRBdHRyID0gZnVuY3Rpb24gKGVsLCBhdHRycykge1xuXHQgICAgZm9yICh2YXIgYSBpbiBhdHRycykge1xuXHQgICAgICAgIGVsLnNldEF0dHJpYnV0ZShhLCBhdHRyc1thXSk7XG5cdCAgICB9XG5cdH07XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBYTUwgZG9jdW1lbnRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGV4cG9ydHMuY3JlYXRlWE1MID0gZnVuY3Rpb24oKSB7XG5cdCAgICBpZiAoIWdsb2JhbC5ET01QYXJzZXIpIHJldHVybjtcblx0ICAgIHJldHVybiBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKCc8eG1sIC8+JywgJ2FwcGxpY2F0aW9uL3htbCcpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHZhbHVlIGludG8gYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWwgQSBzdHJpbmcsIGEgTm9kZUxpc3QsIGEgTm9kZSwgb3IgYW4gSFRNTENvbGxlY3Rpb25cblx0ICovXG5cdGV4cG9ydHMuZ2V0Tm9kZUFycmF5ID0gZnVuY3Rpb24odmFsKSB7XG5cdCAgICB2YXIgcmV0dmFsID0gbnVsbDtcblx0ICAgIGlmICh0eXBlb2YodmFsKSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgIHJldHZhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodmFsKTtcblx0ICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk5vZGVMaXN0ICYmIHZhbCBpbnN0YW5jZW9mIGdsb2JhbC5Ob2RlTGlzdCkge1xuXHQgICAgICAgIHJldHZhbCA9IHZhbDtcblx0ICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk5vZGUgJiYgdmFsIGluc3RhbmNlb2YgZ2xvYmFsLk5vZGUpIHtcblx0ICAgICAgICByZXR2YWwgPSBbdmFsXTtcblx0ICAgIH0gZWxzZSBpZiAoZ2xvYmFsLkhUTUxDb2xsZWN0aW9uICYmIHZhbCBpbnN0YW5jZW9mIGdsb2JhbC5IVE1MQ29sbGVjdGlvbikge1xuXHQgICAgICAgIHJldHZhbCA9IHZhbDtcblx0ICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcblx0ICAgICAgICByZXR2YWwgPSB2YWw7XG5cdCAgICB9IGVsc2UgaWYgKHZhbCA9PT0gbnVsbCkge1xuXHQgICAgICAgIHJldHZhbCA9IFtdO1xuXHQgICAgfVxuXG5cdCAgICByZXR2YWwgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyZXR2YWwpO1xuXG5cdCAgICByZXR1cm4gcmV0dmFsO1xuXHR9O1xuXG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSlcblxuLyoqKi8gfSxcbi8qIDEwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgQ29sb3IgPSBmdW5jdGlvbihjb2xvciwgb3B0aW9ucykge1xuXHQgICAgLy90b2RvOiBzdXBwb3J0IHJnYmEsIGhzbGEsIGFuZCBycmdnYmJhYSBub3RhdGlvblxuXHQgICAgLy90b2RvOiB1c2UgQ0lFTEFCIGludGVybmFsbHlcblx0ICAgIC8vdG9kbzogYWRkIGNsYW1wIGZ1bmN0aW9uICh3aXRoIHNpZ24pXG5cdCAgICBpZiAodHlwZW9mIGNvbG9yICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG5cdCAgICB0aGlzLm9yaWdpbmFsID0gY29sb3I7XG5cblx0ICAgIGlmIChjb2xvci5jaGFyQXQoMCkgPT09ICcjJykge1xuXHQgICAgICAgIGNvbG9yID0gY29sb3Iuc2xpY2UoMSk7XG5cdCAgICB9XG5cblx0ICAgIGlmICgvW15hLWYwLTldKy9pLnRlc3QoY29sb3IpKSByZXR1cm47XG5cblx0ICAgIGlmIChjb2xvci5sZW5ndGggPT09IDMpIHtcblx0ICAgICAgICBjb2xvciA9IGNvbG9yLnJlcGxhY2UoLy4vZywgJyQmJCYnKTtcblx0ICAgIH1cblxuXHQgICAgaWYgKGNvbG9yLmxlbmd0aCAhPT0gNikgcmV0dXJuO1xuXG5cdCAgICB0aGlzLmFscGhhID0gMTtcblxuXHQgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbHBoYSkge1xuXHQgICAgICAgIHRoaXMuYWxwaGEgPSBvcHRpb25zLmFscGhhO1xuXHQgICAgfVxuXG5cdCAgICB0aGlzLnNldChwYXJzZUludChjb2xvciwgMTYpKTtcblx0fTtcblxuXHQvL3RvZG86IGpzZG9jc1xuXHRDb2xvci5yZ2IyaGV4ID0gZnVuY3Rpb24ociwgZywgYikge1xuXHQgICAgZnVuY3Rpb24gZm9ybWF0IChkZWNpbWFsKSB7XG5cdCAgICAgICAgdmFyIGhleCA9IChkZWNpbWFsIHwgMCkudG9TdHJpbmcoMTYpO1xuXHQgICAgICAgIGlmIChkZWNpbWFsIDwgMTYpIHtcblx0ICAgICAgICAgICAgaGV4ID0gJzAnICsgaGV4O1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gaGV4O1xuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gW3IsIGcsIGJdLm1hcChmb3JtYXQpLmpvaW4oJycpO1xuXHR9O1xuXG5cdC8vdG9kbzoganNkb2NzXG5cdENvbG9yLmhzbDJyZ2IgPSBmdW5jdGlvbiAoaCwgcywgbCkge1xuXHQgICAgdmFyIEggPSBoIC8gNjA7XG5cdCAgICB2YXIgQyA9ICgxIC0gTWF0aC5hYnMoMiAqIGwgLSAxKSkgKiBzO1xuXHQgICAgdmFyIFggPSBDICogKDEgLSBNYXRoLmFicyhwYXJzZUludChIKSAlIDIgLSAxKSk7XG5cdCAgICB2YXIgbSA9IGwgLSAoQyAvIDIpO1xuXG5cdCAgICB2YXIgciA9IDAsIGcgPSAwLCBiID0gMDtcblxuXHQgICAgaWYgKEggPj0gMCAmJiBIIDwgMSkge1xuXHQgICAgICAgIHIgPSBDO1xuXHQgICAgICAgIGcgPSBYO1xuXHQgICAgfSBlbHNlIGlmIChIID49IDEgJiYgSCA8IDIpIHtcblx0ICAgICAgICByID0gWDtcblx0ICAgICAgICBnID0gQztcblx0ICAgIH0gZWxzZSBpZiAoSCA+PSAyICYmIEggPCAzKSB7XG5cdCAgICAgICAgZyA9IEM7XG5cdCAgICAgICAgYiA9IFg7XG5cdCAgICB9IGVsc2UgaWYgKEggPj0gMyAmJiBIIDwgNCkge1xuXHQgICAgICAgIGcgPSBYO1xuXHQgICAgICAgIGIgPSBDO1xuXHQgICAgfSBlbHNlIGlmIChIID49IDQgJiYgSCA8IDUpIHtcblx0ICAgICAgICByID0gWDtcblx0ICAgICAgICBiID0gQztcblx0ICAgIH0gZWxzZSBpZiAoSCA+PSA1ICYmIEggPCA2KSB7XG5cdCAgICAgICAgciA9IEM7XG5cdCAgICAgICAgYiA9IFg7XG5cdCAgICB9XG5cblx0ICAgIHIgKz0gbTtcblx0ICAgIGcgKz0gbTtcblx0ICAgIGIgKz0gbTtcblxuXHQgICAgciA9IHBhcnNlSW50KHIgKiAyNTUpO1xuXHQgICAgZyA9IHBhcnNlSW50KGcgKiAyNTUpO1xuXHQgICAgYiA9IHBhcnNlSW50KGIgKiAyNTUpO1xuXG5cdCAgICByZXR1cm4gW3IsIGcsIGJdO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBjb2xvciBmcm9tIGEgcmF3IFJHQjg4OCBpbnRlZ2VyXG5cdCAqIEBwYXJhbSByYXcgUkdCODg4IHJlcHJlc2VudGF0aW9uIG9mIGNvbG9yXG5cdCAqL1xuXHQvL3RvZG86IHJlZmFjdG9yIGludG8gYSBzdGF0aWMgbWV0aG9kXG5cdC8vdG9kbzogZmFjdG9yIG91dCBpbmRpdmlkdWFsIGNvbG9yIHNwYWNlc1xuXHQvL3RvZG86IGFkZCBIU0wsIENJRUxBQiwgYW5kIENJRUxVVlxuXHRDb2xvci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgdGhpcy5yYXcgPSB2YWw7XG5cblx0ICAgIHZhciByID0gKHRoaXMucmF3ICYgMHhGRjAwMDApID4+IDE2O1xuXHQgICAgdmFyIGcgPSAodGhpcy5yYXcgJiAweDAwRkYwMCkgPj4gODtcblx0ICAgIHZhciBiID0gKHRoaXMucmF3ICYgMHgwMDAwRkYpO1xuXG5cdCAgICAvLyBCVC43MDlcblx0ICAgIHZhciB5ID0gMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiO1xuXHQgICAgdmFyIHUgPSAtMC4wOTk5MSAqIHIgLSAwLjMzNjA5ICogZyArIDAuNDM2ICogYjtcblx0ICAgIHZhciB2ID0gMC42MTUgKiByIC0gMC41NTg2MSAqIGcgLSAwLjA1NjM5ICogYjtcblxuXHQgICAgdGhpcy5yZ2IgPSB7XG5cdCAgICAgICAgcjogcixcblx0ICAgICAgICBnOiBnLFxuXHQgICAgICAgIGI6IGJcblx0ICAgIH07XG5cblx0ICAgIHRoaXMueXV2ID0ge1xuXHQgICAgICAgIHk6IHksXG5cdCAgICAgICAgdTogdSxcblx0ICAgICAgICB2OiB2XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gdGhpcztcblx0fTtcblxuXHQvKipcblx0ICogTGlnaHRlbiBvciBkYXJrZW4gYSBjb2xvclxuXHQgKiBAcGFyYW0gbXVsdGlwbGllciBBbW91bnQgdG8gbGlnaHRlbiBvciBkYXJrZW4gKC0xIHRvIDEpXG5cdCAqL1xuXHRDb2xvci5wcm90b3R5cGUubGlnaHRlbiA9IGZ1bmN0aW9uKG11bHRpcGxpZXIpIHtcblx0ICAgIHZhciBjbSA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIE1hdGguYWJzKG11bHRpcGxpZXIpKSkgKiAobXVsdGlwbGllciA8IDAgPyAtMSA6IDEpO1xuXHQgICAgdmFyIGJtID0gKDI1NSAqIGNtKSB8IDA7XG5cdCAgICB2YXIgY3IgPSBNYXRoLm1pbigyNTUsIE1hdGgubWF4KDAsIHRoaXMucmdiLnIgKyBibSkpO1xuXHQgICAgdmFyIGNnID0gTWF0aC5taW4oMjU1LCBNYXRoLm1heCgwLCB0aGlzLnJnYi5nICsgYm0pKTtcblx0ICAgIHZhciBjYiA9IE1hdGgubWluKDI1NSwgTWF0aC5tYXgoMCwgdGhpcy5yZ2IuYiArIGJtKSk7XG5cdCAgICB2YXIgaGV4ID0gQ29sb3IucmdiMmhleChjciwgY2csIGNiKTtcblx0ICAgIHJldHVybiBuZXcgQ29sb3IoaGV4KTtcblx0fTtcblxuXHQvKipcblx0ICogT3V0cHV0IGNvbG9yIGluIGhleCBmb3JtYXRcblx0ICogQHBhcmFtIGFkZEhhc2ggQWRkIGEgaGFzaCBjaGFyYWN0ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0XG5cdCAqL1xuXHRDb2xvci5wcm90b3R5cGUudG9IZXggPSBmdW5jdGlvbihhZGRIYXNoKSB7XG5cdCAgICByZXR1cm4gKGFkZEhhc2ggPyAnIycgOiAnJykgKyB0aGlzLnJhdy50b1N0cmluZygxNik7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciBvciBub3QgY3VycmVudCBjb2xvciBpcyBsaWdodGVyIHRoYW4gYW5vdGhlciBjb2xvclxuXHQgKiBAcGFyYW0gY29sb3IgQ29sb3IgdG8gY29tcGFyZSBhZ2FpbnN0XG5cdCAqL1xuXHRDb2xvci5wcm90b3R5cGUubGlnaHRlclRoYW4gPSBmdW5jdGlvbihjb2xvcikge1xuXHQgICAgaWYgKCEoY29sb3IgaW5zdGFuY2VvZiBDb2xvcikpIHtcblx0ICAgICAgICBjb2xvciA9IG5ldyBDb2xvcihjb2xvcik7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiB0aGlzLnl1di55ID4gY29sb3IueXV2Lnk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtaXhpbmcgY3VycmVudCBjb2xvciB3aXRoIGFub3RoZXIgY29sb3Jcblx0ICogQHBhcmFtIGNvbG9yIENvbG9yIHRvIG1peCB3aXRoXG5cdCAqIEBwYXJhbSBtdWx0aXBsaWVyIEhvdyBtdWNoIHRvIG1peCB3aXRoIHRoZSBvdGhlciBjb2xvclxuXHQgKi9cblx0Lypcblx0Q29sb3IucHJvdG90eXBlLm1peCA9IGZ1bmN0aW9uIChjb2xvciwgbXVsdGlwbGllcikge1xuXHQgICAgaWYgKCEoY29sb3IgaW5zdGFuY2VvZiBDb2xvcikpIHtcblx0ICAgICAgICBjb2xvciA9IG5ldyBDb2xvcihjb2xvcik7XG5cdCAgICB9XG5cblx0ICAgIHZhciByID0gdGhpcy5yZ2Iucjtcblx0ICAgIHZhciBnID0gdGhpcy5yZ2IuZztcblx0ICAgIHZhciBiID0gdGhpcy5yZ2IuYjtcblx0ICAgIHZhciBhID0gdGhpcy5hbHBoYTtcblxuXHQgICAgdmFyIG0gPSB0eXBlb2YgbXVsdGlwbGllciAhPT0gJ3VuZGVmaW5lZCcgPyBtdWx0aXBsaWVyIDogMC41O1xuXG5cdCAgICAvL3RvZG86IHdyaXRlIGEgbGVycCBmdW5jdGlvblxuXHQgICAgciA9IHIgKyBtICogKGNvbG9yLnJnYi5yIC0gcik7XG5cdCAgICBnID0gZyArIG0gKiAoY29sb3IucmdiLmcgLSBnKTtcblx0ICAgIGIgPSBiICsgbSAqIChjb2xvci5yZ2IuYiAtIGIpO1xuXHQgICAgYSA9IGEgKyBtICogKGNvbG9yLmFscGhhIC0gYSk7XG5cblx0ICAgIHJldHVybiBuZXcgQ29sb3IoQ29sb3IucmdiVG9IZXgociwgZywgYiksIHtcblx0ICAgICAgICAnYWxwaGEnOiBhXG5cdCAgICB9KTtcblx0fTtcblx0Ki9cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJsZW5kaW5nIGFub3RoZXIgY29sb3Igb24gdG9wIG9mIGN1cnJlbnQgY29sb3Igd2l0aCBhbHBoYVxuXHQgKiBAcGFyYW0gY29sb3IgQ29sb3IgdG8gYmxlbmQgb24gdG9wIG9mIGN1cnJlbnQgY29sb3IsIGkuZS4gXCJDYVwiXG5cdCAqL1xuXHQvL3RvZG86IHNlZSBpZiAuYmxlbmRBbHBoYSBjYW4gYmUgbWVyZ2VkIGludG8gLm1peFxuXHRDb2xvci5wcm90b3R5cGUuYmxlbmRBbHBoYSA9IGZ1bmN0aW9uKGNvbG9yKSB7XG5cdCAgICBpZiAoIShjb2xvciBpbnN0YW5jZW9mIENvbG9yKSkge1xuXHQgICAgICAgIGNvbG9yID0gbmV3IENvbG9yKGNvbG9yKTtcblx0ICAgIH1cblxuXHQgICAgdmFyIENhID0gY29sb3I7XG5cdCAgICB2YXIgQ2IgPSB0aGlzO1xuXG5cdCAgICAvL3RvZG86IHdyaXRlIGFscGhhIGJsZW5kaW5nIGZ1bmN0aW9uXG5cdCAgICB2YXIgciA9IENhLmFscGhhICogQ2EucmdiLnIgKyAoMSAtIENhLmFscGhhKSAqIENiLnJnYi5yO1xuXHQgICAgdmFyIGcgPSBDYS5hbHBoYSAqIENhLnJnYi5nICsgKDEgLSBDYS5hbHBoYSkgKiBDYi5yZ2IuZztcblx0ICAgIHZhciBiID0gQ2EuYWxwaGEgKiBDYS5yZ2IuYiArICgxIC0gQ2EuYWxwaGEpICogQ2IucmdiLmI7XG5cblx0ICAgIHJldHVybiBuZXcgQ29sb3IoQ29sb3IucmdiMmhleChyLCBnLCBiKSk7XG5cdH07XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBDb2xvcjtcblxuXG4vKioqLyB9LFxuLyogMTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICd2ZXJzaW9uJzogJzIuOS40Jyxcblx0ICAnc3ZnX25zJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzaGF2ZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblxuXHR2YXIgU1ZHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIGNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHR2YXIgdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXG5cdHZhciBTVkdfTlMgPSBjb25zdGFudHMuc3ZnX25zO1xuXG5cdHZhciB0ZW1wbGF0ZXMgPSB7XG5cdCAgJ2VsZW1lbnQnOiBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgdmFyIHRhZyA9IG9wdGlvbnMudGFnO1xuXHQgICAgdmFyIGNvbnRlbnQgPSBvcHRpb25zLmNvbnRlbnQgfHwgJyc7XG5cdCAgICBkZWxldGUgb3B0aW9ucy50YWc7XG5cdCAgICBkZWxldGUgb3B0aW9ucy5jb250ZW50O1xuXHQgICAgcmV0dXJuICBbdGFnLCBjb250ZW50LCBvcHRpb25zXTtcblx0ICB9XG5cdH07XG5cblx0Ly90b2RvOiBkZXByZWNhdGUgdGFnIGFyZywgaW5mZXIgdGFnIGZyb20gc2hhcGUgb2JqZWN0XG5cdGZ1bmN0aW9uIGNvbnZlcnRTaGFwZSAoc2hhcGUsIHRhZykge1xuXHQgIHJldHVybiB0ZW1wbGF0ZXMuZWxlbWVudCh7XG5cdCAgICAndGFnJzogdGFnLFxuXHQgICAgJ3dpZHRoJzogc2hhcGUud2lkdGgsXG5cdCAgICAnaGVpZ2h0Jzogc2hhcGUuaGVpZ2h0LFxuXHQgICAgJ2ZpbGwnOiBzaGFwZS5wcm9wZXJ0aWVzLmZpbGxcblx0ICB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRleHRDc3MgKHByb3BlcnRpZXMpIHtcblx0ICByZXR1cm4gdXRpbHMuY3NzUHJvcHMoe1xuXHQgICAgJ2ZpbGwnOiBwcm9wZXJ0aWVzLmZpbGwsXG5cdCAgICAnZm9udC13ZWlnaHQnOiBwcm9wZXJ0aWVzLmZvbnQud2VpZ2h0LFxuXHQgICAgJ2ZvbnQtZmFtaWx5JzogcHJvcGVydGllcy5mb250LmZhbWlseSArICcsIG1vbm9zcGFjZScsXG5cdCAgICAnZm9udC1zaXplJzogcHJvcGVydGllcy5mb250LnNpemUgKyBwcm9wZXJ0aWVzLmZvbnQudW5pdHNcblx0ICB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIG91dGxpbmVQYXRoIChiZ1dpZHRoLCBiZ0hlaWdodCwgb3V0bGluZVdpZHRoKSB7XG5cdCAgdmFyIG91dGxpbmVPZmZzZXRXaWR0aCA9IG91dGxpbmVXaWR0aCAvIDI7XG5cblx0ICByZXR1cm4gW1xuXHQgICAgJ00nLCBvdXRsaW5lT2Zmc2V0V2lkdGgsIG91dGxpbmVPZmZzZXRXaWR0aCxcblx0ICAgICdIJywgYmdXaWR0aCAtIG91dGxpbmVPZmZzZXRXaWR0aCxcblx0ICAgICdWJywgYmdIZWlnaHQgLSBvdXRsaW5lT2Zmc2V0V2lkdGgsXG5cdCAgICAnSCcsIG91dGxpbmVPZmZzZXRXaWR0aCxcblx0ICAgICdWJywgMCxcblx0ICAgICdNJywgMCwgb3V0bGluZU9mZnNldFdpZHRoLFxuXHQgICAgJ0wnLCBiZ1dpZHRoLCBiZ0hlaWdodCAtIG91dGxpbmVPZmZzZXRXaWR0aCxcblx0ICAgICdNJywgMCwgYmdIZWlnaHQgLSBvdXRsaW5lT2Zmc2V0V2lkdGgsXG5cdCAgICAnTCcsIGJnV2lkdGgsIG91dGxpbmVPZmZzZXRXaWR0aFxuXHQgIF0uam9pbignICcpO1xuXHR9XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2NlbmVHcmFwaCwgcmVuZGVyU2V0dGluZ3MpIHtcblx0ICB2YXIgZW5naW5lU2V0dGluZ3MgPSByZW5kZXJTZXR0aW5ncy5lbmdpbmVTZXR0aW5ncztcblx0ICB2YXIgc3R5bGVzaGVldHMgPSBlbmdpbmVTZXR0aW5ncy5zdHlsZXNoZWV0cztcblx0ICB2YXIgc3R5bGVzaGVldFhtbCA9IHN0eWxlc2hlZXRzLm1hcChmdW5jdGlvbiAoc3R5bGVzaGVldCkge1xuXHQgICAgcmV0dXJuICc8P3htbC1zdHlsZXNoZWV0IHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiJyArIHN0eWxlc2hlZXQgKyAnXCI/Pic7XG5cdCAgfSkuam9pbignXFxuJyk7XG5cblx0ICB2YXIgaG9sZGVySWQgPSAnaG9sZGVyXycgKyBOdW1iZXIobmV3IERhdGUoKSkudG9TdHJpbmcoMTYpO1xuXG5cdCAgdmFyIHJvb3QgPSBzY2VuZUdyYXBoLnJvb3Q7XG5cdCAgdmFyIHRleHRHcm91cCA9IHJvb3QuY2hpbGRyZW4uaG9sZGVyVGV4dEdyb3VwO1xuXG5cdCAgdmFyIGNzcyA9ICcjJyArIGhvbGRlcklkICsgJyB0ZXh0IHsgJyArIHRleHRDc3ModGV4dEdyb3VwLnByb3BlcnRpZXMpICsgJyB9ICc7XG5cblx0ICAvLyBwdXNoIHRleHQgZG93biB0byBiZSBlcXVhbGx5IHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoIGNhbnZhcyByZW5kZXJlclxuXHQgIHRleHRHcm91cC55ICs9IHRleHRHcm91cC50ZXh0UG9zaXRpb25EYXRhLmJvdW5kaW5nQm94LmhlaWdodCAqIDAuODtcblxuXHQgIHZhciB3b3JkVGFncyA9IFtdO1xuXG5cdCAgT2JqZWN0LmtleXModGV4dEdyb3VwLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lS2V5KSB7XG5cdCAgICB2YXIgbGluZSA9IHRleHRHcm91cC5jaGlsZHJlbltsaW5lS2V5XTtcblxuXHQgICAgT2JqZWN0LmtleXMobGluZS5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAod29yZEtleSkge1xuXHQgICAgICB2YXIgd29yZCA9IGxpbmUuY2hpbGRyZW5bd29yZEtleV07XG5cdCAgICAgIHZhciB4ID0gdGV4dEdyb3VwLnggKyBsaW5lLnggKyB3b3JkLng7XG5cdCAgICAgIHZhciB5ID0gdGV4dEdyb3VwLnkgKyBsaW5lLnkgKyB3b3JkLnk7XG5cblx0ICAgICAgdmFyIHdvcmRUYWcgPSB0ZW1wbGF0ZXMuZWxlbWVudCh7XG5cdCAgICAgICAgJ3RhZyc6ICd0ZXh0Jyxcblx0ICAgICAgICAnY29udGVudCc6IHdvcmQucHJvcGVydGllcy50ZXh0LFxuXHQgICAgICAgICd4JzogeCxcblx0ICAgICAgICAneSc6IHlcblx0ICAgICAgfSk7XG5cblx0ICAgICAgd29yZFRhZ3MucHVzaCh3b3JkVGFnKTtcblx0ICAgIH0pO1xuXHQgIH0pO1xuXG5cdCAgdmFyIHRleHQgPSB0ZW1wbGF0ZXMuZWxlbWVudCh7XG5cdCAgICAndGFnJzogJ2cnLFxuXHQgICAgJ2NvbnRlbnQnOiB3b3JkVGFnc1xuXHQgIH0pO1xuXG5cdCAgdmFyIG91dGxpbmUgPSBudWxsO1xuXG5cdCAgaWYgKHJvb3QuY2hpbGRyZW4uaG9sZGVyQmcucHJvcGVydGllcy5vdXRsaW5lKSB7XG5cdCAgICB2YXIgb3V0bGluZVByb3BlcnRpZXMgPSByb290LmNoaWxkcmVuLmhvbGRlckJnLnByb3BlcnRpZXMub3V0bGluZTtcblx0ICAgIG91dGxpbmUgPSB0ZW1wbGF0ZXMuZWxlbWVudCh7XG5cdCAgICAgICd0YWcnOiAncGF0aCcsXG5cdCAgICAgICdkJzogb3V0bGluZVBhdGgocm9vdC5jaGlsZHJlbi5ob2xkZXJCZy53aWR0aCwgcm9vdC5jaGlsZHJlbi5ob2xkZXJCZy5oZWlnaHQsIG91dGxpbmVQcm9wZXJ0aWVzLndpZHRoKSxcblx0ICAgICAgJ3N0cm9rZS13aWR0aCc6IG91dGxpbmVQcm9wZXJ0aWVzLndpZHRoLFxuXHQgICAgICAnc3Ryb2tlJzogb3V0bGluZVByb3BlcnRpZXMuZmlsbCxcblx0ICAgICAgJ2ZpbGwnOiAnbm9uZSdcblx0ICAgIH0pO1xuXHQgIH1cblxuXHQgIHZhciBiZyA9IGNvbnZlcnRTaGFwZShyb290LmNoaWxkcmVuLmhvbGRlckJnLCAncmVjdCcpO1xuXG5cdCAgdmFyIHNjZW5lQ29udGVudCA9IFtdO1xuXG5cdCAgc2NlbmVDb250ZW50LnB1c2goYmcpO1xuXHQgIGlmIChvdXRsaW5lUHJvcGVydGllcykge1xuXHQgICAgc2NlbmVDb250ZW50LnB1c2gob3V0bGluZSk7XG5cdCAgfVxuXHQgIHNjZW5lQ29udGVudC5wdXNoKHRleHQpO1xuXG5cdCAgdmFyIHNjZW5lID0gdGVtcGxhdGVzLmVsZW1lbnQoe1xuXHQgICAgJ3RhZyc6ICdnJyxcblx0ICAgICdpZCc6IGhvbGRlcklkLFxuXHQgICAgJ2NvbnRlbnQnOiBzY2VuZUNvbnRlbnRcblx0ICB9KTtcblxuXHQgIHZhciBzdHlsZSA9IHRlbXBsYXRlcy5lbGVtZW50KHtcblx0ICAgICd0YWcnOiAnc3R5bGUnLFxuXHQgICAgLy90b2RvOiBmaWd1cmUgb3V0IGhvdyB0byBhZGQgQ0RBVEEgZGlyZWN0aXZlXG5cdCAgICAnY29udGVudCc6IGNzcyxcblx0ICAgICd0eXBlJzogJ3RleHQvY3NzJ1xuXHQgIH0pO1xuXG5cdCAgdmFyIGRlZnMgPSB0ZW1wbGF0ZXMuZWxlbWVudCh7XG5cdCAgICAndGFnJzogJ2RlZnMnLFxuXHQgICAgJ2NvbnRlbnQnOiBzdHlsZVxuXHQgIH0pO1xuXG5cdCAgdmFyIHN2ZyA9IHRlbXBsYXRlcy5lbGVtZW50KHtcblx0ICAgICd0YWcnOiAnc3ZnJyxcblx0ICAgICdjb250ZW50JzogW2RlZnMsIHNjZW5lXSxcblx0ICAgICd3aWR0aCc6IHJvb3QucHJvcGVydGllcy53aWR0aCxcblx0ICAgICdoZWlnaHQnOiByb290LnByb3BlcnRpZXMuaGVpZ2h0LFxuXHQgICAgJ3htbG5zJzogU1ZHX05TLFxuXHQgICAgJ3ZpZXdCb3gnOiBbMCwgMCwgcm9vdC5wcm9wZXJ0aWVzLndpZHRoLCByb290LnByb3BlcnRpZXMuaGVpZ2h0XS5qb2luKCcgJyksXG5cdCAgICAncHJlc2VydmVBc3BlY3RSYXRpbyc6ICdub25lJ1xuXHQgIH0pO1xuXG5cdCAgdmFyIG91dHB1dCA9IHNoYXZlbihzdmcpO1xuXHQgIFxuXHQgIG91dHB1dCA9IHN0eWxlc2hlZXRYbWwgKyBvdXRwdXRbMF07XG5cblx0ICB2YXIgc3ZnU3RyaW5nID0gU1ZHLnN2Z1N0cmluZ1RvRGF0YVVSSShvdXRwdXQsIHJlbmRlclNldHRpbmdzLm1vZGUgPT09ICdiYWNrZ3JvdW5kJyk7XG5cdCAgcmV0dXJuIHN2Z1N0cmluZztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZXNjYXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblxuXHQvLyBUT0RPOiByZW1vdmUgbmFtZXNwYWNlXG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGF2ZW4gKGFycmF5LCBuYW1lc3BhY2UsIHJldHVybk9iamVjdCkge1xuXG5cdFx0J3VzZSBzdHJpY3QnXG5cblx0XHR2YXIgaSA9IDFcblx0XHR2YXIgZG9lc0VzY2FwZSA9IHRydWVcblx0XHR2YXIgSFRNTFN0cmluZ1xuXHRcdHZhciBhdHRyaWJ1dGVLZXlcblx0XHR2YXIgY2FsbGJhY2tcblx0XHR2YXIga2V5XG5cblxuXHRcdHJldHVybk9iamVjdCA9IHJldHVybk9iamVjdCB8fCB7fVxuXG5cblx0XHRmdW5jdGlvbiBjcmVhdGVFbGVtZW50IChzdWdhclN0cmluZykge1xuXG5cdFx0XHR2YXIgdGFncyA9IHN1Z2FyU3RyaW5nLm1hdGNoKC9eW1xcdy1dKy8pXG5cdFx0XHR2YXIgZWxlbWVudCA9IHtcblx0XHRcdFx0dGFnOiB0YWdzID8gdGFnc1swXSA6ICdkaXYnLFxuXHRcdFx0XHRhdHRyOiB7fSxcblx0XHRcdFx0Y2hpbGRyZW46IFtdXG5cdFx0XHR9XG5cdFx0XHR2YXIgaWQgPSBzdWdhclN0cmluZy5tYXRjaCgvIyhbXFx3LV0rKS8pXG5cdFx0XHR2YXIgcmVmZXJlbmNlID0gc3VnYXJTdHJpbmcubWF0Y2goL1xcJChbXFx3LV0rKS8pXG5cdFx0XHR2YXIgY2xhc3NOYW1lcyA9IHN1Z2FyU3RyaW5nLm1hdGNoKC9cXC5bXFx3LV0rL2cpXG5cblxuXHRcdFx0Ly8gQXNzaWduIGlkIGlmIGlzIHNldFxuXHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdGVsZW1lbnQuYXR0ci5pZCA9IGlkWzFdXG5cblx0XHRcdFx0Ly8gQWRkIGVsZW1lbnQgdG8gdGhlIHJldHVybiBvYmplY3Rcblx0XHRcdFx0cmV0dXJuT2JqZWN0W2lkWzFdXSA9IGVsZW1lbnRcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJlZmVyZW5jZSlcblx0XHRcdFx0cmV0dXJuT2JqZWN0W3JlZmVyZW5jZVsxXV0gPSBlbGVtZW50XG5cblx0XHRcdGlmIChjbGFzc05hbWVzKVxuXHRcdFx0XHRlbGVtZW50LmF0dHIuY2xhc3MgPSBjbGFzc05hbWVzLmpvaW4oJyAnKS5yZXBsYWNlKC9cXC4vZywgJycpXG5cblx0XHRcdGlmIChzdWdhclN0cmluZy5tYXRjaCgvJiQvZykpXG5cdFx0XHRcdGRvZXNFc2NhcGUgPSBmYWxzZVxuXG5cdFx0XHRyZXR1cm4gZWxlbWVudFxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHJlcGxhY2VyIChrZXksIHZhbHVlKSB7XG5cblx0XHRcdGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0cmV0dXJuXG5cblx0XHRcdGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpXG5cdFx0XHRcdHJldHVybiBTdHJpbmcodmFsdWUpXG5cblx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGVzY2FwZUF0dHJpYnV0ZSAoc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gKHN0cmluZyB8fCBzdHJpbmcgPT09IDApID9cblx0XHRcdFx0U3RyaW5nKHN0cmluZylcblx0XHRcdFx0XHQucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykgOlxuXHRcdFx0XHQnJ1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGVzY2FwZUhUTUwgKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIFN0cmluZyhzdHJpbmcpXG5cdFx0XHRcdC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG5cdFx0XHRcdC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jylcblx0XHRcdFx0LnJlcGxhY2UoLycvZywgJyZhcG9zOycpXG5cdFx0XHRcdC5yZXBsYWNlKC88L2csICcmbHQ7Jylcblx0XHRcdFx0LnJlcGxhY2UoLz4vZywgJyZndDsnKVxuXHRcdH1cblxuXG5cdFx0aWYgKHR5cGVvZiBhcnJheVswXSA9PT0gJ3N0cmluZycpXG5cdFx0XHRhcnJheVswXSA9IGNyZWF0ZUVsZW1lbnQoYXJyYXlbMF0pXG5cblx0XHRlbHNlIGlmIChBcnJheS5pc0FycmF5KGFycmF5WzBdKSlcblx0XHRcdGkgPSAwXG5cblx0XHRlbHNlXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdCdGaXJzdCBlbGVtZW50IG9mIGFycmF5IG11c3QgYmUgYSBzdHJpbmcsICcgK1xuXHRcdFx0XHQnb3IgYW4gYXJyYXkgYW5kIG5vdCAnICsgSlNPTi5zdHJpbmdpZnkoYXJyYXlbMF0pXG5cdFx0XHQpXG5cblxuXHRcdGZvciAoOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0Ly8gRG9uJ3QgcmVuZGVyIGVsZW1lbnQgaWYgdmFsdWUgaXMgZmFsc2Ugb3IgbnVsbFxuXHRcdFx0aWYgKGFycmF5W2ldID09PSBmYWxzZSB8fCBhcnJheVtpXSA9PT0gbnVsbCkge1xuXHRcdFx0XHRhcnJheVswXSA9IGZhbHNlXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRpbnVlIHdpdGggbmV4dCBhcnJheSB2YWx1ZSBpZiBjdXJyZW50IHZhbHVlIGlzIHVuZGVmaW5lZCBvciB0cnVlXG5cdFx0XHRlbHNlIGlmIChhcnJheVtpXSA9PT0gdW5kZWZpbmVkIHx8IGFycmF5W2ldID09PSB0cnVlKSB7XG5cdFx0XHRcdGNvbnRpbnVlXG5cdFx0XHR9XG5cblx0XHRcdGVsc2UgaWYgKHR5cGVvZiBhcnJheVtpXSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKGRvZXNFc2NhcGUpXG5cdFx0XHRcdFx0YXJyYXlbaV0gPSBlc2NhcGVIVE1MKGFycmF5W2ldKVxuXG5cdFx0XHRcdGFycmF5WzBdLmNoaWxkcmVuLnB1c2goYXJyYXlbaV0pXG5cdFx0XHR9XG5cblx0XHRcdGVsc2UgaWYgKHR5cGVvZiBhcnJheVtpXSA9PT0gJ251bWJlcicpIHtcblxuXHRcdFx0XHRhcnJheVswXS5jaGlsZHJlbi5wdXNoKGFycmF5W2ldKVxuXHRcdFx0fVxuXG5cdFx0XHRlbHNlIGlmIChBcnJheS5pc0FycmF5KGFycmF5W2ldKSkge1xuXG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGFycmF5W2ldWzBdKSkge1xuXHRcdFx0XHRcdGFycmF5W2ldLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdWJBcnJheSkge1xuXHRcdFx0XHRcdFx0YXJyYXkuc3BsaWNlKGkgKyAxLCAwLCBzdWJBcnJheSlcblx0XHRcdFx0XHR9KVxuXG5cdFx0XHRcdFx0aWYgKGkgIT09IDApXG5cdFx0XHRcdFx0XHRjb250aW51ZVxuXHRcdFx0XHRcdGkrK1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2hhdmVuKGFycmF5W2ldLCBuYW1lc3BhY2UsIHJldHVybk9iamVjdClcblxuXHRcdFx0XHRpZiAoYXJyYXlbaV1bMF0pXG5cdFx0XHRcdFx0YXJyYXlbMF0uY2hpbGRyZW4ucHVzaChhcnJheVtpXVswXSlcblx0XHRcdH1cblxuXHRcdFx0ZWxzZSBpZiAodHlwZW9mIGFycmF5W2ldID09PSAnZnVuY3Rpb24nKVxuXHRcdFx0XHRjYWxsYmFjayA9IGFycmF5W2ldXG5cblxuXHRcdFx0ZWxzZSBpZiAodHlwZW9mIGFycmF5W2ldID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRmb3IgKGF0dHJpYnV0ZUtleSBpbiBhcnJheVtpXSlcblx0XHRcdFx0XHRpZiAoYXJyYXlbaV0uaGFzT3duUHJvcGVydHkoYXR0cmlidXRlS2V5KSlcblx0XHRcdFx0XHRcdGlmIChhcnJheVtpXVthdHRyaWJ1dGVLZXldICE9PSBudWxsICYmXG5cdFx0XHRcdFx0XHRcdGFycmF5W2ldW2F0dHJpYnV0ZUtleV0gIT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0XHRpZiAoYXR0cmlidXRlS2V5ID09PSAnc3R5bGUnICYmXG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGFycmF5W2ldW2F0dHJpYnV0ZUtleV0gPT09ICdvYmplY3QnKVxuXHRcdFx0XHRcdFx0XHRcdGFycmF5WzBdLmF0dHJbYXR0cmlidXRlS2V5XSA9IEpTT05cblx0XHRcdFx0XHRcdFx0XHRcdC5zdHJpbmdpZnkoYXJyYXlbaV1bYXR0cmlidXRlS2V5XSwgcmVwbGFjZXIpXG5cdFx0XHRcdFx0XHRcdFx0XHQuc2xpY2UoMiwgLTIpXG5cdFx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXCIsXCIvZywgJzsnKVxuXHRcdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL1wiOlwiL2csICc6Jylcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXFxcXCIvZywgJ1xcJycpXG5cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGFycmF5WzBdLmF0dHJbYXR0cmlidXRlS2V5XSA9IGFycmF5W2ldW2F0dHJpYnV0ZUtleV1cblx0XHRcdH1cblxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdcIicgKyBhcnJheVtpXSArICdcIiBpcyBub3QgYWxsb3dlZCBhcyBhIHZhbHVlLicpXG5cdFx0fVxuXG5cblx0XHRpZiAoYXJyYXlbMF0gIT09IGZhbHNlKSB7XG5cblx0XHRcdEhUTUxTdHJpbmcgPSAnPCcgKyBhcnJheVswXS50YWdcblxuXHRcdFx0Zm9yIChrZXkgaW4gYXJyYXlbMF0uYXR0cilcblx0XHRcdFx0aWYgKGFycmF5WzBdLmF0dHIuaGFzT3duUHJvcGVydHkoa2V5KSlcblx0XHRcdFx0XHRIVE1MU3RyaW5nICs9ICcgJyArIGtleSArICc9XCInICtcblx0XHRcdFx0XHRcdGVzY2FwZUF0dHJpYnV0ZShhcnJheVswXS5hdHRyW2tleV0pICsgJ1wiJ1xuXG5cdFx0XHRIVE1MU3RyaW5nICs9ICc+J1xuXG5cdFx0XHRhcnJheVswXS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuXHRcdFx0XHRIVE1MU3RyaW5nICs9IGNoaWxkXG5cdFx0XHR9KVxuXG5cdFx0XHRIVE1MU3RyaW5nICs9ICc8LycgKyBhcnJheVswXS50YWcgKyAnPidcblxuXHRcdFx0YXJyYXlbMF0gPSBIVE1MU3RyaW5nXG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHJvb3QgZWxlbWVudCBvbiBpbmRleCAwXG5cdFx0cmV0dXJuT2JqZWN0WzBdID0gYXJyYXlbMF1cblxuXHRcdGlmIChjYWxsYmFjaylcblx0XHRcdGNhbGxiYWNrKGFycmF5WzBdKVxuXG5cdFx0Ly8gcmV0dXJucyBvYmplY3QgY29udGFpbmluZyBhbGwgZWxlbWVudHMgd2l0aCBhbiBpZCBhbmQgdGhlIHJvb3QgZWxlbWVudFxuXHRcdHJldHVybiByZXR1cm5PYmplY3Rcblx0fVxuXG5cbi8qKiovIH0sXG4vKiAxNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0LyohXG5cdCAqIGVzY2FwZS1odG1sXG5cdCAqIENvcHlyaWdodChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNodWtcblx0ICogQ29weXJpZ2h0KGMpIDIwMTUgQW5kcmVhcyBMdWJiZVxuXHQgKiBDb3B5cmlnaHQoYykgMjAxNSBUaWFuY2hlbmcgXCJUaW1vdGh5XCIgR3Vcblx0ICogTUlUIExpY2Vuc2VkXG5cdCAqL1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHQvKipcblx0ICogTW9kdWxlIHZhcmlhYmxlcy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cblx0dmFyIG1hdGNoSHRtbFJlZ0V4cCA9IC9bXCInJjw+XS87XG5cblx0LyoqXG5cdCAqIE1vZHVsZSBleHBvcnRzLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZXNjYXBlSHRtbDtcblxuXHQvKipcblx0ICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuXG5cdCAqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gZXNjYXBlIGZvciBpbnNlcnRpbmcgaW50byBIVE1MXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICogQHB1YmxpY1xuXHQgKi9cblxuXHRmdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykge1xuXHQgIHZhciBzdHIgPSAnJyArIHN0cmluZztcblx0ICB2YXIgbWF0Y2ggPSBtYXRjaEh0bWxSZWdFeHAuZXhlYyhzdHIpO1xuXG5cdCAgaWYgKCFtYXRjaCkge1xuXHQgICAgcmV0dXJuIHN0cjtcblx0ICB9XG5cblx0ICB2YXIgZXNjYXBlO1xuXHQgIHZhciBodG1sID0gJyc7XG5cdCAgdmFyIGluZGV4ID0gMDtcblx0ICB2YXIgbGFzdEluZGV4ID0gMDtcblxuXHQgIGZvciAoaW5kZXggPSBtYXRjaC5pbmRleDsgaW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7XG5cdCAgICBzd2l0Y2ggKHN0ci5jaGFyQ29kZUF0KGluZGV4KSkge1xuXHQgICAgICBjYXNlIDM0OiAvLyBcIlxuXHQgICAgICAgIGVzY2FwZSA9ICcmcXVvdDsnO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIDM4OiAvLyAmXG5cdCAgICAgICAgZXNjYXBlID0gJyZhbXA7Jztcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSAzOTogLy8gJ1xuXHQgICAgICAgIGVzY2FwZSA9ICcmIzM5Oyc7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgNjA6IC8vIDxcblx0ICAgICAgICBlc2NhcGUgPSAnJmx0Oyc7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgNjI6IC8vID5cblx0ICAgICAgICBlc2NhcGUgPSAnJmd0Oyc7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICB9XG5cblx0ICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7XG5cdCAgICAgIGh0bWwgKz0gc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsIGluZGV4KTtcblx0ICAgIH1cblxuXHQgICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuXHQgICAgaHRtbCArPSBlc2NhcGU7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXhcblx0ICAgID8gaHRtbCArIHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleClcblx0ICAgIDogaHRtbDtcblx0fVxuXG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIERPTSA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdHZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG5cdCAgICB2YXIgY2FudmFzID0gRE9NLm5ld0VsKCdjYW52YXMnKTtcblx0ICAgIHZhciBjdHggPSBudWxsO1xuXG5cdCAgICByZXR1cm4gZnVuY3Rpb24oc2NlbmVHcmFwaCkge1xuXHQgICAgICAgIGlmIChjdHggPT0gbnVsbCkge1xuXHQgICAgICAgICAgICBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgZHByID0gdXRpbHMuY2FudmFzUmF0aW8oKTtcblx0ICAgICAgICB2YXIgcm9vdCA9IHNjZW5lR3JhcGgucm9vdDtcblx0ICAgICAgICBjYW52YXMud2lkdGggPSBkcHIgKiByb290LnByb3BlcnRpZXMud2lkdGg7XG5cdCAgICAgICAgY2FudmFzLmhlaWdodCA9IGRwciAqIHJvb3QucHJvcGVydGllcy5oZWlnaHQgO1xuXHQgICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblxuXHQgICAgICAgIHZhciBiZyA9IHJvb3QuY2hpbGRyZW4uaG9sZGVyQmc7XG5cdCAgICAgICAgdmFyIGJnV2lkdGggPSBkcHIgKiBiZy53aWR0aDtcblx0ICAgICAgICB2YXIgYmdIZWlnaHQgPSBkcHIgKiBiZy5oZWlnaHQ7XG5cdCAgICAgICAgLy90b2RvOiBwYXJhbWV0cml6ZSBvdXRsaW5lIHdpZHRoIChlLmcuIGluIHNjZW5lIG9iamVjdClcblx0ICAgICAgICB2YXIgb3V0bGluZVdpZHRoID0gMjtcblx0ICAgICAgICB2YXIgb3V0bGluZU9mZnNldFdpZHRoID0gb3V0bGluZVdpZHRoIC8gMjtcblxuXHQgICAgICAgIGN0eC5maWxsU3R5bGUgPSBiZy5wcm9wZXJ0aWVzLmZpbGw7XG5cdCAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGJnV2lkdGgsIGJnSGVpZ2h0KTtcblxuXHQgICAgICAgIGlmIChiZy5wcm9wZXJ0aWVzLm91dGxpbmUpIHtcblx0ICAgICAgICAgICAgLy90b2RvOiBhYnN0cmFjdCB0aGlzIGludG8gYSBtZXRob2Rcblx0ICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gYmcucHJvcGVydGllcy5vdXRsaW5lLmZpbGw7XG5cdCAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBiZy5wcm9wZXJ0aWVzLm91dGxpbmUud2lkdGg7XG5cdCAgICAgICAgICAgIGN0eC5tb3ZlVG8ob3V0bGluZU9mZnNldFdpZHRoLCBvdXRsaW5lT2Zmc2V0V2lkdGgpO1xuXHQgICAgICAgICAgICAvLyBUTCwgVFIsIEJSLCBCTFxuXHQgICAgICAgICAgICBjdHgubGluZVRvKGJnV2lkdGggLSBvdXRsaW5lT2Zmc2V0V2lkdGgsIG91dGxpbmVPZmZzZXRXaWR0aCk7XG5cdCAgICAgICAgICAgIGN0eC5saW5lVG8oYmdXaWR0aCAtIG91dGxpbmVPZmZzZXRXaWR0aCwgYmdIZWlnaHQgLSBvdXRsaW5lT2Zmc2V0V2lkdGgpO1xuXHQgICAgICAgICAgICBjdHgubGluZVRvKG91dGxpbmVPZmZzZXRXaWR0aCwgYmdIZWlnaHQgLSBvdXRsaW5lT2Zmc2V0V2lkdGgpO1xuXHQgICAgICAgICAgICBjdHgubGluZVRvKG91dGxpbmVPZmZzZXRXaWR0aCwgb3V0bGluZU9mZnNldFdpZHRoKTtcblx0ICAgICAgICAgICAgLy8gRGlhZ29uYWxzXG5cdCAgICAgICAgICAgIGN0eC5tb3ZlVG8oMCwgb3V0bGluZU9mZnNldFdpZHRoKTtcblx0ICAgICAgICAgICAgY3R4LmxpbmVUbyhiZ1dpZHRoLCBiZ0hlaWdodCAtIG91dGxpbmVPZmZzZXRXaWR0aCk7XG5cdCAgICAgICAgICAgIGN0eC5tb3ZlVG8oMCwgYmdIZWlnaHQgLSBvdXRsaW5lT2Zmc2V0V2lkdGgpO1xuXHQgICAgICAgICAgICBjdHgubGluZVRvKGJnV2lkdGgsIG91dGxpbmVPZmZzZXRXaWR0aCk7XG5cdCAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgdGV4dEdyb3VwID0gcm9vdC5jaGlsZHJlbi5ob2xkZXJUZXh0R3JvdXA7XG5cdCAgICAgICAgY3R4LmZvbnQgPSB0ZXh0R3JvdXAucHJvcGVydGllcy5mb250LndlaWdodCArICcgJyArIChkcHIgKiB0ZXh0R3JvdXAucHJvcGVydGllcy5mb250LnNpemUpICsgdGV4dEdyb3VwLnByb3BlcnRpZXMuZm9udC51bml0cyArICcgJyArIHRleHRHcm91cC5wcm9wZXJ0aWVzLmZvbnQuZmFtaWx5ICsgJywgbW9ub3NwYWNlJztcblx0ICAgICAgICBjdHguZmlsbFN0eWxlID0gdGV4dEdyb3VwLnByb3BlcnRpZXMuZmlsbDtcblxuXHQgICAgICAgIGZvciAodmFyIGxpbmVLZXkgaW4gdGV4dEdyb3VwLmNoaWxkcmVuKSB7XG5cdCAgICAgICAgICAgIHZhciBsaW5lID0gdGV4dEdyb3VwLmNoaWxkcmVuW2xpbmVLZXldO1xuXHQgICAgICAgICAgICBmb3IgKHZhciB3b3JkS2V5IGluIGxpbmUuY2hpbGRyZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciB3b3JkID0gbGluZS5jaGlsZHJlblt3b3JkS2V5XTtcblx0ICAgICAgICAgICAgICAgIHZhciB4ID0gZHByICogKHRleHRHcm91cC54ICsgbGluZS54ICsgd29yZC54KTtcblx0ICAgICAgICAgICAgICAgIHZhciB5ID0gZHByICogKHRleHRHcm91cC55ICsgbGluZS55ICsgd29yZC55ICsgKHRleHRHcm91cC5wcm9wZXJ0aWVzLmxlYWRpbmcgLyAyKSk7XG5cblx0ICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dCh3b3JkLnByb3BlcnRpZXMudGV4dCwgeCwgeSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG5cdCAgICB9O1xuXHR9KSgpO1xuXG4vKioqLyB9XG4vKioqKioqLyBdKVxufSk7XG47XG4oZnVuY3Rpb24oY3R4LCBpc01ldGVvclBhY2thZ2UpIHtcbiAgICBpZiAoaXNNZXRlb3JQYWNrYWdlKSB7XG4gICAgICAgIEhvbGRlciA9IGN0eC5Ib2xkZXI7XG4gICAgfVxufSkodGhpcywgdHlwZW9mIE1ldGVvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFBhY2thZ2UgIT09ICd1bmRlZmluZWQnKTtcbiJdLCJtYXBwaW5ncyI6IkFBc1BBOzs7Ozs7Ozs7OztBQTNPQTs7QUE4S0E7Ozs7OztBQXd6Q0E7Ozs7Ozs7O0FBZzNDQSIsInNvdXJjZVJvb3QiOiIifQ==