diff --git a/dist/nodewarc.js b/dist/nodewarc.js new file mode 100644 index 0000000..2829842 --- /dev/null +++ b/dist/nodewarc.js @@ -0,0 +1,20 @@ +!function(e,t){for(var r in t)e[r]=t[r]}(self,function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=66)}([function(e,t,r){"use strict";(function(e){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +var n=r(69),i=r(70),s=r(38);function o(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|e}function p(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return z(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return M(e).length;default:if(n)return z(e).length;t=(""+t).toLowerCase(),n=!0}}function _(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function g(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=u.from(t,n)),u.isBuffer(t))return 0===t.length?-1:m(e,t,r,n,i);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):m(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function m(e,t,r,n,i){var s,o=1,a=e.length,u=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;o=2,a/=2,u/=2,r/=2}function h(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(i){var c=-1;for(s=r;sa&&(r=a-u),s=r;s>=0;s--){for(var f=!0,l=0;li&&(n=i):n=i;var s=t.length;if(s%2!=0)throw new TypeError("Invalid hex string");n>s/2&&(n=s/2);for(var o=0;o>8,i=r%256,s.push(i),s.push(n);return s}(t,e.length-r),e,r,n)}function E(e,t,r){return 0===t&&r===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,r))}function k(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i239?4:h>223?3:h>191?2:1;if(i+f<=r)switch(f){case 1:h<128&&(c=h);break;case 2:128==(192&(s=e[i+1]))&&(u=(31&h)<<6|63&s)>127&&(c=u);break;case 3:s=e[i+1],o=e[i+2],128==(192&s)&&128==(192&o)&&(u=(15&h)<<12|(63&s)<<6|63&o)>2047&&(u<55296||u>57343)&&(c=u);break;case 4:s=e[i+1],o=e[i+2],a=e[i+3],128==(192&s)&&128==(192&o)&&128==(192&a)&&(u=(15&h)<<18|(63&s)<<12|(63&o)<<6|63&a)>65535&&u<1114112&&(c=u)}null===c?(c=65533,f=1):c>65535&&(c-=65536,n.push(c>>>10&1023|55296),c=56320|1023&c),n.push(c),i+=f}return function(e){var t=e.length;if(t<=S)return String.fromCharCode.apply(String,e);var r="",n=0;for(;nthis.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return C(this,t,r);case"utf8":case"utf-8":return k(this,t,r);case"ascii":return A(this,t,r);case"latin1":case"binary":return T(this,t,r);case"base64":return E(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}.apply(this,arguments)},u.prototype.equals=function(e){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===u.compare(this,e)},u.prototype.inspect=function(){var e="",r=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(e+=" ... ")),""},u.prototype.compare=function(e,t,r,n,i){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var s=(i>>>=0)-(n>>>=0),o=(r>>>=0)-(t>>>=0),a=Math.min(s,o),h=this.slice(n,i),c=e.slice(t,r),f=0;fi)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var s=!1;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return y(this,e,t,r);case"ascii":return b(this,e,t,r);case"latin1":case"binary":return v(this,e,t,r);case"base64":return R(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return x(this,e,t,r);default:if(s)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),s=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function A(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;in)&&(r=n);for(var i="",s=t;sr)throw new RangeError("Trying to access beyond buffer length")}function L(e,t,r,n,i,s){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function q(e,t,r,n){t<0&&(t=65535+t+1);for(var i=0,s=Math.min(e.length-r,2);i>>8*(n?i:1-i)}function P(e,t,r,n){t<0&&(t=4294967295+t+1);for(var i=0,s=Math.min(e.length-r,4);i>>8*(n?i:3-i)&255}function B(e,t,r,n,i,s){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function j(e,t,r,n,s){return s||B(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function N(e,t,r,n,s){return s||B(e,0,r,8),i.write(e,t,r,n,52,8),r+8}u.prototype.slice=function(e,t){var r,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(i*=256);)n+=this[e+--t]*i;return n},u.prototype.readUInt8=function(e,t){return t||I(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||I(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||I(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||I(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||I(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||I(e,t,this.length);for(var n=this[e],i=1,s=0;++s=(i*=128)&&(n-=Math.pow(2,8*t)),n},u.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||I(e,t,this.length);for(var n=t,i=1,s=this[e+--n];n>0&&(i*=256);)s+=this[e+--n]*i;return s>=(i*=128)&&(s-=Math.pow(2,8*t)),s},u.prototype.readInt8=function(e,t){return t||I(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||I(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(e,t){t||I(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(e,t){return t||I(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||I(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||I(e,4,this.length),i.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||I(e,4,this.length),i.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||I(e,8,this.length),i.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||I(e,8,this.length),i.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t|=0,r|=0,n)||L(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,s=0;for(this[t]=255&e;++s=0&&(s*=256);)this[t+i]=e/s&255;return t+r},u.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):q(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):q(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):P(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):P(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);L(this,e,t,r,i-1,-i)}var s=0,o=1,a=0;for(this[t]=255&e;++s>0)-a&255;return t+r},u.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);L(this,e,t,r,i-1,-i)}var s=r-1,o=1,a=0;for(this[t+s]=255&e;--s>=0&&(o*=256);)e<0&&0===a&&0!==this[t+s+1]&&(a=1),this[t+s]=(e/o>>0)-a&255;return t+r},u.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):q(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):q(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):P(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||L(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):P(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,r){return j(this,e,t,!0,r)},u.prototype.writeFloatBE=function(e,t,r){return j(this,e,t,!1,r)},u.prototype.writeDoubleLE=function(e,t,r){return N(this,e,t,!0,r)},u.prototype.writeDoubleBE=function(e,t,r){return N(this,e,t,!1,r)},u.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--i)e[i+t]=this[i+r];else if(s<1e3||!u.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(s=t;s55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&s.push(239,191,189);continue}if(o+1===n){(t-=3)>-1&&s.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&s.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&s.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;s.push(r)}else if(r<2048){if((t-=2)<0)break;s.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;s.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return s}function M(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(D,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function W(e,t,r,n){for(var i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}}).call(this,r(1))},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t){var r,n,i=e.exports={};function s(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function a(e){if(r===setTimeout)return setTimeout(e,0);if((r===s||!r)&&setTimeout)return r=setTimeout,setTimeout(e,0);try{return r(e,0)}catch(t){try{return r.call(null,e,0)}catch(t){return r.call(this,e,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:s}catch(e){r=s}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(e){n=o}}();var u,h=[],c=!1,f=-1;function l(){c&&u&&(c=!1,u.length?h=u.concat(h):f=-1,h.length&&d())}function d(){if(!c){var e=a(l);c=!0;for(var t=h.length;t;){for(u=h,h=[];++f1)for(var r=1;r${r}`}function u(e){return`WARC-Date: ${e}${r}`}function h(e){return`WARC-Type: ${e}${r}`}function c(e){return`Content-Length: ${e}${r}`}function f(e){return`WARC-Concurrent-To: ${r}`}function l(e){return`WARC-Warcinfo-ID: ${r}`}function d(e,{rid:t,date:n,len:s,targetURI:o}){return null!=o?`${i}${h(e)}${a(t)}${u(n)}${function(e){return`WARC-Target-URI: ${e}${r}`}(o)}${c(s)}`:`${i}${h(e)}${a(t)}${u(n)}${c(s)}`}e.exports={requiredHeaderFields:d,warcInfoHeader:function(e){const t=`${d(s.warcinfo,e)}${o.warcFields}`;return null!=e.fileName?`${t}${n=e.fileName,`WARC-Filename: ${n}${r}`}`:t;var n},warcInfoContent:function(e){const t=[`format: WARC File Format ${n}${r}`];for(let n in e)t.push(`${n}: ${e[n]}${r}`);return t.join("")},warcRequestHeader:function({targetURI:e,now:t,concurrentTo:r,rid:n,len:i,wid:a}){const u=[d(s.request,{date:t,len:i,rid:n,targetURI:e}),o.httpRequest];return null!=r&&u.push(f(r)),null!=a&&u.push(l(a)),u.join("")},warcResponseHeader:function({targetURI:e,now:t,rid:r,len:n,wid:i}){const a=[d(s.response,{date:t,len:n,rid:r,targetURI:e}),o.httpResponse];return null!=i&&a.push(l(i)),a.join("")},warcMetadataHeader:function({targetURI:e,now:t,concurrentTo:r,rid:n,len:i,wid:a}){const u=[d(s.metadata,{date:t,len:i,rid:n,targetURI:e}),o.warcFields];return null!=r&&u.push(f(r)),null!=a&&u.push(l(a)),u.join("")},recordSeparator:"\r\n\r\n",CRLF:r,CRLF2x:"\r\n\r\n",WARCTypes:s,WARCV:n,WARCContentTypes:o}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}},function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)i(r,n)&&(e[n]=r[n])}}return e},t.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var s={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),i);else for(var s=0;s({timestamp:this._now,url:e})):[{timestamp:this._now,url:e}]})},i=t.from(c(n),"utf8"),s=t.from(h({date:this._now,fileName:this._fileName,len:i.length,rid:r}),"utf8"),o=s.length+i.length+b;return this.writeRecordBlock(t.concat([s,y,i,w],o))}writeWarcMetadataOutlinks(e,t){return this.writeWarcMetadata(e,t)}writeWarcMetadata(e,r){const n=t.isBuffer(r)?r:t.from(r,"utf8"),i=t.from(d({targetURI:e,now:this._now,len:n.length,concurrentTo:this._warcInfoId,rid:a()}),"utf8"),s=n.length+i.length+b;return this.writeRecordBlock(t.concat([i,y,n,w],s))}writeRequestRecord(e,t,r){return this._writeRequestRecord(e,null,t,r)}writeResponseRecord(e,t,r){return this._writeResponseRecord(e,a(),t,r)}writeRecordBlock(e){return new Promise((t,r)=>{this.opts.gzip&&(e=s.gzipSync(e)),this._warcOutStream.write(e,"utf8")?t():this._warcOutStream.once("drain",t)})}end(){null!=this._warcOutStream&&this._warcOutStream.end()}_writeRequestRecord(e,r,n,i){const s=v(n,i),o=t.from(f({targetURI:e,concurrentTo:r,now:this._now,rid:a(),wid:this._warcInfoId,len:s.length}),"utf8"),u=o.length+s.length+b;return this.writeRecordBlock(t.concat([o,y,s,w],u))}_writeResponseRecord(e,r,n,i){const s=v(n,i),o=t.from(l({targetURI:e,now:this._now,rid:r,wid:this._warcInfoId,len:s.length}),"utf8"),a=o.length+s.length+b;return this.writeRecordBlock(t.concat([o,y,s,w],a))}_onFinish(){let e=this._lastError;this._lastError=null,this._warcOutStream.removeAllListeners(),this._warcOutStream.destroy(),this._warcOutStream=null,this._now=null,this._fileName=null,this._warcInfoId=null,e?this.emit("finished",e):this.emit("finished")}_onError(e){this._lastError=e,this.emit("error",e)}}}).call(this,r(0).Buffer,r(2))},function(e,t,r){"use strict";e.exports={noGZ:/Content-Encoding.*(?:gzip|br|deflate)\r\n/gi,replaceContentLen:/Content-Length:.*\r\n/gi}},function(e,t,r){"use strict";r.r(t),r.d(t,"getStream",function(){return o}),r.d(t,"fs",function(){return n}),r.d(t,"untildify",function(){return i});let n=null,i=null,s=null;try{i=r(!function(){var e=new Error("Cannot find module 'untildify'");throw e.code="MODULE_NOT_FOUND",e}()),n=r(!function(){var e=new Error("Cannot find module 'fs-extra'");throw e.code="MODULE_NOT_FOUND",e}()),s=!0}catch(e){s=!1}function o(e,t){return s?(t&&(e=i(e)),n.createReadStream(e)):e}},function(e,t,r){(t=e.exports=r(39)).Stream=t,t.Readable=t,t.Writable=r(27),t.Duplex=r(7),t.Transform=r(43),t.PassThrough=r(77)},function(e,t,r){(function(e){function r(e){return Object.prototype.toString.call(e)}t.isArray=function(e){return Array.isArray?Array.isArray(e):"[object Array]"===r(e)},t.isBoolean=function(e){return"boolean"==typeof e},t.isNull=function(e){return null===e},t.isNullOrUndefined=function(e){return null==e},t.isNumber=function(e){return"number"==typeof e},t.isString=function(e){return"string"==typeof e},t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=function(e){return void 0===e},t.isRegExp=function(e){return"[object RegExp]"===r(e)},t.isObject=function(e){return"object"==typeof e&&null!==e},t.isDate=function(e){return"[object Date]"===r(e)},t.isError=function(e){return"[object Error]"===r(e)||e instanceof Error},t.isFunction=function(e){return"function"==typeof e},t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=e.isBuffer}).call(this,r(0).Buffer)},function(e,t,r){"use strict";(function(t){const{Transform:n}=r(25),i=r(88),{crlf:s}=r(32);e.exports=class extends n{constructor(){super({readableObjectMode:!0}),this.buffered=void 0,this.builder=new i,this.sepLen=s.length}_consumeChunk(e,t,r){let n,i,o=0,a=0,u=e.length;for(;;){if(!(-1!==(n=o>=u?-1:e.indexOf(s,o))&&n",'"',"`"," ","\r","\n","\t"]),c=["'"].concat(h),f=["%","/","?",";","#"].concat(c),l=["/","?","#"],d=/^[+a-z0-9A-Z_-]{0,63}$/,p=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,_={javascript:!0,"javascript:":!0},g={javascript:!0,"javascript:":!0},m={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},w=r(131);function y(e,t,r){if(e&&i.isObject(e)&&e instanceof s)return e;var n=new s;return n.parse(e,t,r),n}s.prototype.parse=function(e,t,r){if(!i.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var s=e.indexOf("?"),a=-1!==s&&s127?q+="x":q+=L[P];if(!q.match(d)){var j=O.slice(0,A),N=O.slice(A+1),D=L.match(p);D&&(j.push(D[1]),N.unshift(D[2])),N.length&&(y="/"+N.join(".")+y),this.hostname=j.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),C||(this.hostname=n.toASCII(this.hostname));var U=this.port?":"+this.port:"",z=this.hostname||"";this.host=z+U,this.href+=this.host,C&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==y[0]&&(y="/"+y))}if(!_[R])for(A=0,I=c.length;A0)&&r.host.split("@"))&&(r.auth=C.shift(),r.host=r.hostname=C.shift());return r.search=e.search,r.query=e.query,i.isNull(r.pathname)&&i.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.href=r.format(),r}if(!x.length)return r.pathname=null,r.search?r.path="/"+r.search:r.path=null,r.href=r.format(),r;for(var k=x.slice(-1)[0],S=(r.host||e.host||x.length>1)&&("."===k||".."===k)||""===k,A=0,T=x.length;T>=0;T--)"."===(k=x[T])?x.splice(T,1):".."===k?(x.splice(T,1),A++):A&&(x.splice(T,1),A--);if(!v&&!R)for(;A--;A)x.unshift("..");!v||""===x[0]||x[0]&&"/"===x[0].charAt(0)||x.unshift(""),S&&"/"!==x.join("/").substr(-1)&&x.push("");var C,O=""===x[0]||x[0]&&"/"===x[0].charAt(0);E&&(r.hostname=r.host=O?"":x.length?x.shift():"",(C=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@"))&&(r.auth=C.shift(),r.host=r.hostname=C.shift()));return(v=v||r.host&&x.length)&&!O&&x.unshift(""),x.length?r.pathname=x.join("/"):(r.pathname=null,r.path=null),i.isNull(r.pathname)&&i.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.auth=e.auth||r.auth,r.slashes=r.slashes||e.slashes,r.href=r.format(),r},s.prototype.parseHost=function(){var e=this.host,t=a.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,r){"use strict";(function(e){var n=r(0).Buffer,i=r(25).Transform,s=r(82),o=r(45),a=r(44).ok,u=r(0).kMaxLength,h="Cannot create final Buffer. It would be larger than 0x"+u.toString(16)+" bytes";s.Z_MIN_WINDOWBITS=8,s.Z_MAX_WINDOWBITS=15,s.Z_DEFAULT_WINDOWBITS=15,s.Z_MIN_CHUNK=64,s.Z_MAX_CHUNK=1/0,s.Z_DEFAULT_CHUNK=16384,s.Z_MIN_MEMLEVEL=1,s.Z_MAX_MEMLEVEL=9,s.Z_DEFAULT_MEMLEVEL=8,s.Z_MIN_LEVEL=-1,s.Z_MAX_LEVEL=9,s.Z_DEFAULT_LEVEL=s.Z_DEFAULT_COMPRESSION;for(var c=Object.keys(s),f=0;f=u?o=new RangeError(h):t=n.concat(i,s),i=[],e.close(),r(o,t)}e.on("error",function(t){e.removeListener("end",a),e.removeListener("readable",o),r(t)}),e.on("end",a),e.end(t),o()}function w(e,t){if("string"==typeof t&&(t=n.from(t)),!n.isBuffer(t))throw new TypeError("Not a string or buffer");var r=e._finishFlushFlag;return e._processChunk(t,r)}function y(e){if(!(this instanceof y))return new y(e);A.call(this,e,s.DEFLATE)}function b(e){if(!(this instanceof b))return new b(e);A.call(this,e,s.INFLATE)}function v(e){if(!(this instanceof v))return new v(e);A.call(this,e,s.GZIP)}function R(e){if(!(this instanceof R))return new R(e);A.call(this,e,s.GUNZIP)}function x(e){if(!(this instanceof x))return new x(e);A.call(this,e,s.DEFLATERAW)}function E(e){if(!(this instanceof E))return new E(e);A.call(this,e,s.INFLATERAW)}function k(e){if(!(this instanceof k))return new k(e);A.call(this,e,s.UNZIP)}function S(e){return e===s.Z_NO_FLUSH||e===s.Z_PARTIAL_FLUSH||e===s.Z_SYNC_FLUSH||e===s.Z_FULL_FLUSH||e===s.Z_FINISH||e===s.Z_BLOCK}function A(e,r){var o=this;if(this._opts=e=e||{},this._chunkSize=e.chunkSize||t.Z_DEFAULT_CHUNK,i.call(this,e),e.flush&&!S(e.flush))throw new Error("Invalid flush flag: "+e.flush);if(e.finishFlush&&!S(e.finishFlush))throw new Error("Invalid flush flag: "+e.finishFlush);if(this._flushFlag=e.flush||s.Z_NO_FLUSH,this._finishFlushFlag=void 0!==e.finishFlush?e.finishFlush:s.Z_FINISH,e.chunkSize&&(e.chunkSizet.Z_MAX_CHUNK))throw new Error("Invalid chunk size: "+e.chunkSize);if(e.windowBits&&(e.windowBitst.Z_MAX_WINDOWBITS))throw new Error("Invalid windowBits: "+e.windowBits);if(e.level&&(e.levelt.Z_MAX_LEVEL))throw new Error("Invalid compression level: "+e.level);if(e.memLevel&&(e.memLevelt.Z_MAX_MEMLEVEL))throw new Error("Invalid memLevel: "+e.memLevel);if(e.strategy&&e.strategy!=t.Z_FILTERED&&e.strategy!=t.Z_HUFFMAN_ONLY&&e.strategy!=t.Z_RLE&&e.strategy!=t.Z_FIXED&&e.strategy!=t.Z_DEFAULT_STRATEGY)throw new Error("Invalid strategy: "+e.strategy);if(e.dictionary&&!n.isBuffer(e.dictionary))throw new Error("Invalid dictionary: it should be a Buffer instance");this._handle=new s.Zlib(r);var a=this;this._hadError=!1,this._handle.onerror=function(e,r){T(a),a._hadError=!0;var n=new Error(e);n.errno=r,n.code=t.codes[r],a.emit("error",n)};var u=t.Z_DEFAULT_COMPRESSION;"number"==typeof e.level&&(u=e.level);var h=t.Z_DEFAULT_STRATEGY;"number"==typeof e.strategy&&(h=e.strategy),this._handle.init(e.windowBits||t.Z_DEFAULT_WINDOWBITS,u,e.memLevel||t.Z_DEFAULT_MEMLEVEL,h,e.dictionary),this._buffer=n.allocUnsafe(this._chunkSize),this._offset=0,this._level=u,this._strategy=h,this.once("end",this.close),Object.defineProperty(this,"_closed",{get:function(){return!o._handle},configurable:!0,enumerable:!0})}function T(t,r){r&&e.nextTick(r),t._handle&&(t._handle.close(),t._handle=null)}function C(e){e.emit("close")}Object.defineProperty(t,"codes",{enumerable:!0,value:Object.freeze(d),writable:!1}),t.Deflate=y,t.Inflate=b,t.Gzip=v,t.Gunzip=R,t.DeflateRaw=x,t.InflateRaw=E,t.Unzip=k,t.createDeflate=function(e){return new y(e)},t.createInflate=function(e){return new b(e)},t.createDeflateRaw=function(e){return new x(e)},t.createInflateRaw=function(e){return new E(e)},t.createGzip=function(e){return new v(e)},t.createGunzip=function(e){return new R(e)},t.createUnzip=function(e){return new k(e)},t.deflate=function(e,t,r){return"function"==typeof t&&(r=t,t={}),m(new y(t),e,r)},t.deflateSync=function(e,t){return w(new y(t),e)},t.gzip=function(e,t,r){return"function"==typeof t&&(r=t,t={}),m(new v(t),e,r)},t.gzipSync=function(e,t){return w(new v(t),e)},t.deflateRaw=function(e,t,r){return"function"==typeof t&&(r=t,t={}),m(new x(t),e,r)},t.deflateRawSync=function(e,t){return w(new x(t),e)},t.unzip=function(e,t,r){return"function"==typeof t&&(r=t,t={}),m(new k(t),e,r)},t.unzipSync=function(e,t){return w(new k(t),e)},t.inflate=function(e,t,r){return"function"==typeof t&&(r=t,t={}),m(new b(t),e,r)},t.inflateSync=function(e,t){return w(new b(t),e)},t.gunzip=function(e,t,r){return"function"==typeof t&&(r=t,t={}),m(new R(t),e,r)},t.gunzipSync=function(e,t){return w(new R(t),e)},t.inflateRaw=function(e,t,r){return"function"==typeof t&&(r=t,t={}),m(new E(t),e,r)},t.inflateRawSync=function(e,t){return w(new E(t),e)},o.inherits(A,i),A.prototype.params=function(r,n,i){if(rt.Z_MAX_LEVEL)throw new RangeError("Invalid compression level: "+r);if(n!=t.Z_FILTERED&&n!=t.Z_HUFFMAN_ONLY&&n!=t.Z_RLE&&n!=t.Z_FIXED&&n!=t.Z_DEFAULT_STRATEGY)throw new TypeError("Invalid strategy: "+n);if(this._level!==r||this._strategy!==n){var o=this;this.flush(s.Z_SYNC_FLUSH,function(){a(o._handle,"zlib binding closed"),o._handle.params(r,n),o._hadError||(o._level=r,o._strategy=n,i&&i())})}else e.nextTick(i)},A.prototype.reset=function(){return a(this._handle,"zlib binding closed"),this._handle.reset()},A.prototype._flush=function(e){this._transform(n.alloc(0),"",e)},A.prototype.flush=function(t,r){var i=this,o=this._writableState;("function"==typeof t||void 0===t&&!r)&&(r=t,t=s.Z_FULL_FLUSH),o.ended?r&&e.nextTick(r):o.ending?r&&this.once("end",r):o.needDrain?r&&this.once("drain",function(){return i.flush(t,r)}):(this._flushFlag=t,this.write(n.alloc(0),"",r))},A.prototype.close=function(t){T(this,t),e.nextTick(C,this)},A.prototype._transform=function(e,t,r){var i,o=this._writableState,a=(o.ending||o.ended)&&(!e||o.length===e.length);return null===e||n.isBuffer(e)?this._handle?(a?i=this._finishFlushFlag:(i=this._flushFlag,e.length>=o.length&&(this._flushFlag=this._opts.flush||s.Z_NO_FLUSH)),void this._processChunk(e,i,r)):r(new Error("zlib binding closed")):r(new Error("invalid input"))},A.prototype._processChunk=function(e,t,r){var i=e&&e.length,s=this._chunkSize-this._offset,o=0,c=this,f="function"==typeof r;if(!f){var l,d=[],p=0;this.on("error",function(e){l=e}),a(this._handle,"zlib binding closed");do{var _=this._handle.writeSync(t,e,o,i,this._buffer,this._offset,s)}while(!this._hadError&&w(_[0],_[1]));if(this._hadError)throw l;if(p>=u)throw T(this),new RangeError(h);var g=n.concat(d,p);return T(this),g}a(this._handle,"zlib binding closed");var m=this._handle.write(t,e,o,i,this._buffer,this._offset,s);function w(u,h){if(this&&(this.buffer=null,this.callback=null),!c._hadError){var l=s-h;if(a(l>=0,"have should not go down"),l>0){var _=c._buffer.slice(c._offset,c._offset+l);c._offset+=l,f?c.push(_):(d.push(_),p+=_.length)}if((0===h||c._offset>=c._chunkSize)&&(s=c._chunkSize,c._offset=0,c._buffer=n.allocUnsafe(c._chunkSize)),0===h){if(o+=i-u,i=u,!f)return!0;var g=c._handle.write(t,e,o,i,c._buffer,c._offset,c._chunkSize);return g.callback=w,void(g.buffer=e)}if(!f)return!1;r()}}m.buffer=e,m.callback=w},o.inherits(y,A),o.inherits(b,A),o.inherits(v,A),o.inherits(R,A),o.inherits(x,A),o.inherits(E,A),o.inherits(k,A)}).call(this,r(2))},function(e,t,r){"use strict";(function(t){!t.version||0===t.version.indexOf("v0.")||0===t.version.indexOf("v1.")&&0!==t.version.indexOf("v1.8.")?e.exports={nextTick:function(e,r,n,i){if("function"!=typeof e)throw new TypeError('"callback" argument must be a function');var s,o,a=arguments.length;switch(a){case 0:case 1:return t.nextTick(e);case 2:return t.nextTick(function(){e.call(null,r)});case 3:return t.nextTick(function(){e.call(null,r,n)});case 4:return t.nextTick(function(){e.call(null,r,n,i)});default:for(s=new Array(a-1),o=0;o0&&o.length>i&&!o.warned){o.warned=!0;var u=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");u.name="MaxListenersExceededWarning",u.emitter=e,u.type=t,u.count=o.length,a=u,console&&console.warn&&console.warn(a)}return e}function f(e,t,r){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},i=function(){for(var e=[],t=0;t0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var u=i[e];if(void 0===u)return!1;if("function"==typeof u)s(u,this,t);else{var h=u.length,c=p(u,h);for(r=0;r=0;s--)if(r[s]===t||r[s].listener===t){o=r[s].listener,i=s;break}if(i<0)return this;0===i?r.shift():function(e,t){for(;t+1=0;n--)this.removeListener(e,t[n]);return this},a.prototype.listeners=function(e){return l(this,e,!0)},a.prototype.rawListeners=function(e){return l(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):d.call(e,t)},a.prototype.listenerCount=d,a.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(e,t,r){"use strict";(function(t,n,i){var s=r(20);function o(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,r){var n=e.entry;e.entry=null;for(;n;){var i=n.callback;t.pendingcb--,i(r),n=n.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=w;var a,u=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?n:s.nextTick;w.WritableState=m;var h=r(12);h.inherits=r(4);var c={deprecate:r(76)},f=r(40),l=r(21).Buffer,d=i.Uint8Array||function(){};var p,_=r(41);function g(){}function m(e,t){a=a||r(7),e=e||{};var n=t instanceof a;this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var i=e.highWaterMark,h=e.writableHighWaterMark,c=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(h||0===h)?h:c,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var f=!1===e.decodeStrings;this.decodeStrings=!f,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var r=e._writableState,n=r.sync,i=r.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(r),t)!function(e,t,r,n,i){--t.pendingcb,r?(s.nextTick(i,n),s.nextTick(E,e,t),e._writableState.errorEmitted=!0,e.emit("error",n)):(i(n),e._writableState.errorEmitted=!0,e.emit("error",n),E(e,t))}(e,r,n,t,i);else{var o=R(r);o||r.corked||r.bufferProcessing||!r.bufferedRequest||v(e,r),n?u(b,e,r,o,i):b(e,r,o,i)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new o(this)}function w(e){if(a=a||r(7),!(p.call(w,this)||this instanceof a))return new w(e);this._writableState=new m(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),f.call(this)}function y(e,t,r,n,i,s,o){t.writelen=n,t.writecb=o,t.writing=!0,t.sync=!0,r?e._writev(i,t.onwrite):e._write(i,s,t.onwrite),t.sync=!1}function b(e,t,r,n){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,n(),E(e,t)}function v(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var n=t.bufferedRequestCount,i=new Array(n),s=t.corkedRequestsFree;s.entry=r;for(var a=0,u=!0;r;)i[a]=r,r.isBuf||(u=!1),r=r.next,a+=1;i.allBuffers=u,y(e,t,!0,t.length,i,"",s.finish),t.pendingcb++,t.lastBufferedRequest=null,s.next?(t.corkedRequestsFree=s.next,s.next=null):t.corkedRequestsFree=new o(t),t.bufferedRequestCount=0}else{for(;r;){var h=r.chunk,c=r.encoding,f=r.callback;if(y(e,t,!1,t.objectMode?1:h.length,h,c,f),r=r.next,t.bufferedRequestCount--,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequest=r,t.bufferProcessing=!1}function R(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function x(e,t){e._final(function(r){t.pendingcb--,r&&e.emit("error",r),t.prefinished=!0,e.emit("prefinish"),E(e,t)})}function E(e,t){var r=R(t);return r&&(!function(e,t){t.prefinished||t.finalCalled||("function"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,s.nextTick(x,e,t)):(t.prefinished=!0,e.emit("prefinish")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),r}h.inherits(w,f),m.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(m.prototype,"buffer",{get:c.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(p=Function.prototype[Symbol.hasInstance],Object.defineProperty(w,Symbol.hasInstance,{value:function(e){return!!p.call(this,e)||this===w&&(e&&e._writableState instanceof m)}})):p=function(e){return e instanceof this},w.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},w.prototype.write=function(e,t,r){var n,i=this._writableState,o=!1,a=!i.objectMode&&(n=e,l.isBuffer(n)||n instanceof d);return a&&!l.isBuffer(e)&&(e=function(e){return l.from(e)}(e)),"function"==typeof t&&(r=t,t=null),a?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=g),i.ended?function(e,t){var r=new Error("write after end");e.emit("error",r),s.nextTick(t,r)}(this,r):(a||function(e,t,r,n){var i=!0,o=!1;return null===r?o=new TypeError("May not write null values to stream"):"string"==typeof r||void 0===r||t.objectMode||(o=new TypeError("Invalid non-string/buffer chunk")),o&&(e.emit("error",o),s.nextTick(n,o),i=!1),i}(this,i,e,r))&&(i.pendingcb++,o=function(e,t,r,n,i,s){if(!r){var o=function(e,t,r){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=l.from(t,r));return t}(t,n,i);n!==o&&(r=!0,i="buffer",n=o)}var a=t.objectMode?1:n.length;t.length+=a;var u=t.length-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(w.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),w.prototype._write=function(e,t,r){r(new Error("_write() is not implemented"))},w.prototype._writev=null,w.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(e,t,r){t.ending=!0,E(e,t),r&&(t.finished?s.nextTick(r):e.once("finish",r));t.ended=!0,e.writable=!1}(this,n,r)},Object.defineProperty(w.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),w.prototype.destroy=_.destroy,w.prototype._undestroy=_.undestroy,w.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,r(2),r(74).setImmediate,r(1))},function(e,t,r){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},function(e,t,r){"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},function(e,t,r){"use strict";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},function(e,t){const r=new Set(["HTTP/0.9","HTTP/1.0","HTTP/1.1","DATA","data"]);e.exports={canReplayProtocols:r,SPACE:" ",H2Method:":method",H2path:":path",HTTP1D1:"HTTP/1.1",DASH:"-"}},function(e,t,r){"use strict";(function(t){e.exports={begin:t.from("574152432f","hex"),info:t.from("574152432d547970653a2077617263696e666f","hex"),mdata:t.from("574152432d547970653a206d65746164617461","hex"),req:t.from("574152432d547970653a2072657175657374","hex"),res:t.from("574152432d547970653a20726573706f6e7365","hex"),revisit:t.from("574152432d547970653a2072657669736974","hex"),resource:t.from("574152432d547970653a207265736f75726365","hex"),crlf:t.from("0d0a","hex"),empty:t.from("0d","hex")}}).call(this,r(0).Buffer)},function(e,t,r){var n=r(6).Symbol;e.exports=n},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,r){(function(e){var n=r(134),i=r(60),s=r(136),o=r(137),a=r(18),u=t;u.request=function(t,r){t="string"==typeof t?a.parse(t):s(t);var i=-1===e.location.protocol.search(/^https?:$/)?"http:":"",o=t.protocol||i,u=t.hostname||t.host,h=t.port,c=t.path||"/";u&&-1!==u.indexOf(":")&&(u="["+u+"]"),t.url=(u?o+"//"+u:"")+(h?":"+h:"")+c,t.method=(t.method||"GET").toUpperCase(),t.headers=t.headers||{};var f=new n(t);return r&&f.on("response",r),f},u.get=function(e,t){var r=u.request(e,t);return r.end(),r},u.ClientRequest=n,u.IncomingMessage=i.IncomingMessage,u.Agent=function(){},u.Agent.defaultMaxSockets=4,u.globalAgent=new u.Agent,u.STATUS_CODES=o,u.METHODS=["CHECKOUT","CONNECT","COPY","DELETE","GET","HEAD","LOCK","M-SEARCH","MERGE","MKACTIVITY","MKCOL","MOVE","NOTIFY","OPTIONS","PATCH","POST","PROPFIND","PROPPATCH","PURGE","PUT","REPORT","SEARCH","SUBSCRIBE","TRACE","UNLOCK","UNSUBSCRIBE"]}).call(this,r(1))},function(e,t,r){const n=r(138),{DASH:i}=r(31),{CRLF:s}=r(3),o=/\s/g;function a(e){return":"===e[0]?e:n(e).replace(o,i)}t.stringifyHeaders=function(e){let t,r=[];for(t in e)r.push(`${a(t)}: ${e[t]}${s}`);return r.join("")},t.stringifyRequestHeaders=function(e,t){let r,n=!1,i=[];for(r in e)"host"!==r&&"Host"!==r||(n=!0),i.push(`${a(r)}: ${e[r]}${s}`);return n||i.push(`Host: ${t}${s}`),i.join("")}},function(e,t,r){var n=r(144);e.exports=function(e){return null==e?"":n(e)}},function(e,t){var r={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},function(e,t,r){"use strict";(function(t,n){var i=r(20);e.exports=y;var s,o=r(38);y.ReadableState=w;r(26).EventEmitter;var a=function(e,t){return e.listeners(t).length},u=r(40),h=r(21).Buffer,c=t.Uint8Array||function(){};var f=r(12);f.inherits=r(4);var l=r(71),d=void 0;d=l&&l.debuglog?l.debuglog("stream"):function(){};var p,_=r(72),g=r(41);f.inherits(y,u);var m=["error","close","destroy","pause","resume"];function w(e,t){e=e||{};var n=t instanceof(s=s||r(7));this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var i=e.highWaterMark,o=e.readableHighWaterMark,a=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(o||0===o)?o:a,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new _,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(p||(p=r(42).StringDecoder),this.decoder=new p(e.encoding),this.encoding=e.encoding)}function y(e){if(s=s||r(7),!(this instanceof y))return new y(e);this._readableState=new w(e,this),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),u.call(this)}function b(e,t,r,n,i){var s,o=e._readableState;null===t?(o.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,E(e)}(e,o)):(i||(s=function(e,t){var r;n=t,h.isBuffer(n)||n instanceof c||"string"==typeof t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));var n;return r}(o,t)),s?e.emit("error",s):o.objectMode||t&&t.length>0?("string"==typeof t||o.objectMode||Object.getPrototypeOf(t)===h.prototype||(t=function(e){return h.from(e)}(t)),n?o.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):v(e,o,t,!0):o.ended?e.emit("error",new Error("stream.push() after EOF")):(o.reading=!1,o.decoder&&!r?(t=o.decoder.write(t),o.objectMode||0!==t.length?v(e,o,t,!1):S(e,o)):v(e,o,t,!1))):n||(o.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=R?e=R:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function E(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(d("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?i.nextTick(k,e):k(e))}function k(e){d("emit readable"),e.emit("readable"),O(e)}function S(e,t){t.readingMore||(t.readingMore=!0,i.nextTick(A,e,t))}function A(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=function(e,t,r){var n;es.length?s.length:e;if(o===s.length?i+=s:i+=s.slice(0,e),0===(e-=o)){o===s.length?(++n,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=s.slice(o));break}++n}return t.length-=n,i}(e,t):function(e,t){var r=h.allocUnsafe(e),n=t.head,i=1;n.data.copy(r),e-=n.data.length;for(;n=n.next;){var s=n.data,o=e>s.length?s.length:e;if(s.copy(r,r.length-e,0,o),0===(e-=o)){o===s.length?(++i,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=s.slice(o));break}++i}return t.length-=i,r}(e,t);return n}(e,t.buffer,t.decoder),r);var r}function L(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,i.nextTick(q,t,e))}function q(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function P(e,t){for(var r=0,n=e.length;r=t.highWaterMark||t.ended))return d("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?L(this):E(this),null;if(0===(e=x(e,t))&&t.ended)return 0===t.length&&L(this),null;var n,i=t.needReadable;return d("need readable",i),(0===t.length||t.length-e0?I(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&L(this)),null!==n&&this.emit("data",n),n},y.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},y.prototype.pipe=function(e,t){var r=this,s=this._readableState;switch(s.pipesCount){case 0:s.pipes=e;break;case 1:s.pipes=[s.pipes,e];break;default:s.pipes.push(e)}s.pipesCount+=1,d("pipe count=%d opts=%j",s.pipesCount,t);var u=(!t||!1!==t.end)&&e!==n.stdout&&e!==n.stderr?c:y;function h(t,n){d("onunpipe"),t===r&&n&&!1===n.hasUnpiped&&(n.hasUnpiped=!0,d("cleanup"),e.removeListener("close",m),e.removeListener("finish",w),e.removeListener("drain",f),e.removeListener("error",g),e.removeListener("unpipe",h),r.removeListener("end",c),r.removeListener("end",y),r.removeListener("data",_),l=!0,!s.awaitDrain||e._writableState&&!e._writableState.needDrain||f())}function c(){d("onend"),e.end()}s.endEmitted?i.nextTick(u):r.once("end",u),e.on("unpipe",h);var f=function(e){return function(){var t=e._readableState;d("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&a(e,"data")&&(t.flowing=!0,O(e))}}(r);e.on("drain",f);var l=!1;var p=!1;function _(t){d("ondata"),p=!1,!1!==e.write(t)||p||((1===s.pipesCount&&s.pipes===e||s.pipesCount>1&&-1!==P(s.pipes,e))&&!l&&(d("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,p=!0),r.pause())}function g(t){d("onerror",t),y(),e.removeListener("error",g),0===a(e,"error")&&e.emit("error",t)}function m(){e.removeListener("finish",w),y()}function w(){d("onfinish"),e.removeListener("close",m),y()}function y(){d("unpipe"),r.unpipe(e)}return r.on("data",_),function(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?o(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,"error",g),e.once("close",m),e.once("finish",w),e.emit("pipe",r),s.flowing||(d("pipe resume"),r.resume()),e},y.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,r),this);if(!e){var n=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var s=0;s>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function a(e){var t=this.lastTotal-this.lastNeed,r=function(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function u(e,t){if((e.length-t)%2==0){var r=e.toString("utf16le",t);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function h(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function c(e,t){var r=(e.length-t)%3;return 0===r?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function f(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function l(e){return e.toString(this.encoding)}function d(e){return e&&e.length?this.write(e):""}t.StringDecoder=s,s.prototype.write=function(e){if(0===e.length)return"";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(e.lastNeed=i-1),i;if(--n=0)return i>0&&(e.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:e.lastNeed=i-3),i;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var n=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,n),e.toString("utf8",t,n)},s.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,r){"use strict";e.exports=o;var n=r(7),i=r(12);function s(e,t){var r=this._transformState;r.transforming=!1;var n=r.writecb;if(!n)return this.emit("error",new Error("write callback called multiple times"));r.writechunk=null,r.writecb=null,null!=t&&this.push(t),n(e);var i=this._readableState;i.reading=!1,(i.needReadable||i.length + * @license MIT + */function i(e,t){if(e===t)return 0;for(var r=e.length,n=t.length,i=0,s=Math.min(r,n);i=0;h--)if(c[h]!==f[h])return!1;for(h=c.length-1;h>=0;h--)if(a=c[h],!y(e[a],t[a],r,n))return!1;return!0}(e,t,r,n))}return r?e===t:e==t}function b(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function v(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function R(e,t,r,n){var i;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(n=r,r=null),i=function(e){var t;try{e()}catch(e){t=e}return t}(t),n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),e&&!i&&m(i,r,"Missing expected exception"+n);var s="string"==typeof n,a=!e&&i&&!r;if((!e&&o.isError(i)&&s&&v(i,r)||a)&&m(i,r,"Got unwanted exception"+n),e&&i&&r&&!v(i,r)||!e&&i)throw i}l.AssertionError=function(e){this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=function(e){return _(g(e.actual),128)+" "+e.operator+" "+_(g(e.expected),128)}(this),this.generatedMessage=!0);var t=e.stackStartFunction||m;if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var r=new Error;if(r.stack){var n=r.stack,i=p(t),s=n.indexOf("\n"+i);if(s>=0){var o=n.indexOf("\n",s+1);n=n.substring(o+1)}this.stack=n}}},o.inherits(l.AssertionError,Error),l.fail=m,l.ok=w,l.equal=function(e,t,r){e!=t&&m(e,t,r,"==",l.equal)},l.notEqual=function(e,t,r){e==t&&m(e,t,r,"!=",l.notEqual)},l.deepEqual=function(e,t,r){y(e,t,!1)||m(e,t,r,"deepEqual",l.deepEqual)},l.deepStrictEqual=function(e,t,r){y(e,t,!0)||m(e,t,r,"deepStrictEqual",l.deepStrictEqual)},l.notDeepEqual=function(e,t,r){y(e,t,!1)&&m(e,t,r,"notDeepEqual",l.notDeepEqual)},l.notDeepStrictEqual=function e(t,r,n){y(t,r,!0)&&m(t,r,n,"notDeepStrictEqual",e)},l.strictEqual=function(e,t,r){e!==t&&m(e,t,r,"===",l.strictEqual)},l.notStrictEqual=function(e,t,r){e===t&&m(e,t,r,"!==",l.notStrictEqual)},l.throws=function(e,t,r){R(!0,e,t,r)},l.doesNotThrow=function(e,t,r){R(!1,e,t,r)},l.ifError=function(e){if(e)throw e},l.strict=n(function e(t,r){t||m(t,!0,r,"==",e)},l,{equal:l.strictEqual,deepEqual:l.deepStrictEqual,notEqual:l.notStrictEqual,notDeepEqual:l.notDeepStrictEqual}),l.strict.strict=l.strict;var x=Object.keys||function(e){var t=[];for(var r in e)a.call(e,r)&&t.push(r);return t}}).call(this,r(1))},function(e,t,r){(function(e){var n=Object.getOwnPropertyDescriptors||function(e){for(var t=Object.keys(e),r={},n=0;n=s)return e;switch(e){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(e){return"[Circular]"}default:return e}}),u=n[r];r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),p(r)?n.showHidden=r:r&&t._extend(n,r),w(n.showHidden)&&(n.showHidden=!1),w(n.depth)&&(n.depth=2),w(n.colors)&&(n.colors=!1),w(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=u),c(n,e,n.depth)}function u(e,t){var r=a.styles[t];return r?"["+a.colors[r][0]+"m"+e+"["+a.colors[r][1]+"m":e}function h(e,t){return e}function c(e,r,n){if(e.customInspect&&r&&x(r.inspect)&&r.inspect!==t.inspect&&(!r.constructor||r.constructor.prototype!==r)){var i=r.inspect(n,e);return m(i)||(i=c(e,i,n)),i}var s=function(e,t){if(w(t))return e.stylize("undefined","undefined");if(m(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}if(g(t))return e.stylize(""+t,"number");if(p(t))return e.stylize(""+t,"boolean");if(_(t))return e.stylize("null","null")}(e,r);if(s)return s;var o=Object.keys(r),a=function(e){var t={};return e.forEach(function(e,r){t[e]=!0}),t}(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),R(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return f(r);if(0===o.length){if(x(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(y(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(v(r))return e.stylize(Date.prototype.toString.call(r),"date");if(R(r))return f(r)}var h,b="",E=!1,k=["{","}"];(d(r)&&(E=!0,k=["[","]"]),x(r))&&(b=" [Function"+(r.name?": "+r.name:"")+"]");return y(r)&&(b=" "+RegExp.prototype.toString.call(r)),v(r)&&(b=" "+Date.prototype.toUTCString.call(r)),R(r)&&(b=" "+f(r)),0!==o.length||E&&0!=r.length?n<0?y(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special"):(e.seen.push(r),h=E?function(e,t,r,n,i){for(var s=[],o=0,a=t.length;o=0&&0,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60)return r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1];return r[0]+t+" "+e.join(", ")+" "+r[1]}(h,b,k)):k[0]+b+k[1]}function f(e){return"["+Error.prototype.toString.call(e)+"]"}function l(e,t,r,n,i,s){var o,a,u;if((u=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]}).get?a=u.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):u.set&&(a=e.stylize("[Setter]","special")),A(n,i)||(o="["+i+"]"),a||(e.seen.indexOf(u.value)<0?(a=_(r)?c(e,u.value,null):c(e,u.value,r-1)).indexOf("\n")>-1&&(a=s?a.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+a.split("\n").map(function(e){return" "+e}).join("\n")):a=e.stylize("[Circular]","special")),w(o)){if(s&&i.match(/^\d+$/))return a;(o=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=e.stylize(o,"string"))}return o+": "+a}function d(e){return Array.isArray(e)}function p(e){return"boolean"==typeof e}function _(e){return null===e}function g(e){return"number"==typeof e}function m(e){return"string"==typeof e}function w(e){return void 0===e}function y(e){return b(e)&&"[object RegExp]"===E(e)}function b(e){return"object"==typeof e&&null!==e}function v(e){return b(e)&&"[object Date]"===E(e)}function R(e){return b(e)&&("[object Error]"===E(e)||e instanceof Error)}function x(e){return"function"==typeof e}function E(e){return Object.prototype.toString.call(e)}function k(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(r){if(w(s)&&(s=e.env.NODE_DEBUG||""),r=r.toUpperCase(),!o[r])if(new RegExp("\\b"+r+"\\b","i").test(s)){var n=e.pid;o[r]=function(){var e=t.format.apply(t,arguments);console.error("%s %d: %s",r,n,e)}}else o[r]=function(){};return o[r]},t.inspect=a,a.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},a.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=d,t.isBoolean=p,t.isNull=_,t.isNullOrUndefined=function(e){return null==e},t.isNumber=g,t.isString=m,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=w,t.isRegExp=y,t.isObject=b,t.isDate=v,t.isError=R,t.isFunction=x,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=r(84);var S=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function A(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){var e,r;console.log("%s - %s",(e=new Date,r=[k(e.getHours()),k(e.getMinutes()),k(e.getSeconds())].join(":"),[e.getDate(),S[e.getMonth()],r].join(" ")),t.format.apply(t,arguments))},t.inherits=r(4),t._extend=function(e,t){if(!t||!b(t))return e;for(var r=Object.keys(t),n=r.length;n--;)e[r[n]]=t[r[n]];return e};var T="undefined"!=typeof Symbol?Symbol("util.promisify.custom"):void 0;function C(e,t){if(!e){var r=new Error("Promise was rejected with a falsy value");r.reason=e,e=r}return t(e)}t.promisify=function(e){if("function"!=typeof e)throw new TypeError('The "original" argument must be of type Function');if(T&&e[T]){var t;if("function"!=typeof(t=e[T]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(t,T,{value:t,enumerable:!1,writable:!1,configurable:!0}),t}function t(){for(var t,r,n=new Promise(function(e,n){t=e,r=n}),i=[],s=0;s4?9:0)}function Q(e){for(var t=e.length;--t>=0;)e[t]=0}function ee(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(i.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function te(e,t){s._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,ee(e.strm)}function re(e,t){e.pending_buf[e.pending++]=t}function ne(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function ie(e,t){var r,n,i=e.max_chain_length,s=e.strstart,o=e.prev_length,a=e.nice_match,u=e.strstart>e.w_size-N?e.strstart-(e.w_size-N):0,h=e.window,c=e.w_mask,f=e.prev,l=e.strstart+j,d=h[s+o-1],p=h[s+o];e.prev_length>=e.good_match&&(i>>=2),a>e.lookahead&&(a=e.lookahead);do{if(h[(r=t)+o]===p&&h[r+o-1]===d&&h[r]===h[s]&&h[++r]===h[s+1]){s+=2,r++;do{}while(h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&so){if(e.match_start=t,o=n,n>=a)break;d=h[s+o-1],p=h[s+o]}}}while((t=f[t&c])>u&&0!=--i);return o<=e.lookahead?o:e.lookahead}function se(e){var t,r,n,s,u,h,c,f,l,d,p=e.w_size;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=p+(p-N)){i.arraySet(e.window,e.window,p,p,0),e.match_start-=p,e.strstart-=p,e.block_start-=p,t=r=e.hash_size;do{n=e.head[--t],e.head[t]=n>=p?n-p:0}while(--r);t=r=p;do{n=e.prev[--t],e.prev[t]=n>=p?n-p:0}while(--r);s+=p}if(0===e.strm.avail_in)break;if(h=e.strm,c=e.window,f=e.strstart+e.lookahead,l=s,d=void 0,(d=h.avail_in)>l&&(d=l),r=0===d?0:(h.avail_in-=d,i.arraySet(c,h.input,h.next_in,d,f),1===h.state.wrap?h.adler=o(h.adler,c,d,f):2===h.state.wrap&&(h.adler=a(h.adler,c,d,f)),h.next_in+=d,h.total_in+=d,d),e.lookahead+=r,e.lookahead+e.insert>=B)for(u=e.strstart-e.insert,e.ins_h=e.window[u],e.ins_h=(e.ins_h<=B&&(e.ins_h=(e.ins_h<=B)if(n=s._tr_tally(e,e.strstart-e.match_start,e.match_length-B),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=B){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=B&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=B-1)),e.prev_length>=B&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-B,n=s._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-B),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=i&&(e.ins_h=(e.ins_h<15&&(a=2,n-=16),s<1||s>A||r!==S||n<8||n>15||t<0||t>9||o<0||o>x)return X(e,g);8===n&&(n=9);var u=new he;return e.state=u,u.strm=e,u.wrap=a,u.gzhead=null,u.w_bits=n,u.w_size=1<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(se(e),0===e.lookahead&&t===h)return $;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,te(e,!1),0===e.strm.avail_out))return $;if(e.strstart-e.block_start>=e.w_size-N&&(te(e,!1),0===e.strm.avail_out))return $}return e.insert=0,t===l?(te(e,!0),0===e.strm.avail_out?Y:K):(e.strstart>e.block_start&&(te(e,!1),e.strm.avail_out),$)}),new ue(4,4,8,4,oe),new ue(4,5,16,8,oe),new ue(4,6,32,32,oe),new ue(4,4,16,16,ae),new ue(8,16,32,32,ae),new ue(8,16,128,128,ae),new ue(8,32,128,256,ae),new ue(32,128,258,1024,ae),new ue(32,258,258,4096,ae)],t.deflateInit=function(e,t){return le(e,t,S,T,C,E)},t.deflateInit2=le,t.deflateReset=fe,t.deflateResetKeep=ce,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?g:(e.state.gzhead=t,p):g},t.deflate=function(e,t){var r,i,o,u;if(!e||!e.state||t>d||t<0)return e?X(e,g):g;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||i.status===Z&&t!==l)return X(e,0===e.avail_out?w:g);if(i.strm=e,r=i.last_flush,i.last_flush=t,i.status===U)if(2===i.wrap)e.adler=0,re(i,31),re(i,139),re(i,8),i.gzhead?(re(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),re(i,255&i.gzhead.time),re(i,i.gzhead.time>>8&255),re(i,i.gzhead.time>>16&255),re(i,i.gzhead.time>>24&255),re(i,9===i.level?2:i.strategy>=v||i.level<2?4:0),re(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(re(i,255&i.gzhead.extra.length),re(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=a(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=z):(re(i,0),re(i,0),re(i,0),re(i,0),re(i,0),re(i,9===i.level?2:i.strategy>=v||i.level<2?4:0),re(i,V),i.status=H);else{var m=S+(i.w_bits-8<<4)<<8;m|=(i.strategy>=v||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(m|=D),m+=31-m%31,i.status=H,ne(i,m),0!==i.strstart&&(ne(i,e.adler>>>16),ne(i,65535&e.adler)),e.adler=1}if(i.status===z)if(i.gzhead.extra){for(o=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),ee(e),o=i.pending,i.pending!==i.pending_buf_size));)re(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=M)}else i.status=M;if(i.status===M)if(i.gzhead.name){o=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),ee(e),o=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexo&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),0===u&&(i.gzindex=0,i.status=W)}else i.status=W;if(i.status===W)if(i.gzhead.comment){o=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),ee(e),o=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexo&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),0===u&&(i.status=F)}else i.status=F;if(i.status===F&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&ee(e),i.pending+2<=i.pending_buf_size&&(re(i,255&e.adler),re(i,e.adler>>8&255),e.adler=0,i.status=H)):i.status=H),0!==i.pending){if(ee(e),0===e.avail_out)return i.last_flush=-1,p}else if(0===e.avail_in&&J(t)<=J(r)&&t!==l)return X(e,w);if(i.status===Z&&0!==e.avail_in)return X(e,w);if(0!==e.avail_in||0!==i.lookahead||t!==h&&i.status!==Z){var y=i.strategy===v?function(e,t){for(var r;;){if(0===e.lookahead&&(se(e),0===e.lookahead)){if(t===h)return $;break}if(e.match_length=0,r=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(te(e,!1),0===e.strm.avail_out))return $}return e.insert=0,t===l?(te(e,!0),0===e.strm.avail_out?Y:K):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?$:G}(i,t):i.strategy===R?function(e,t){for(var r,n,i,o,a=e.window;;){if(e.lookahead<=j){if(se(e),e.lookahead<=j&&t===h)return $;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=B&&e.strstart>0&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){o=e.strstart+j;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&ie.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=B?(r=s._tr_tally(e,1,e.match_length-B),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(te(e,!1),0===e.strm.avail_out))return $}return e.insert=0,t===l?(te(e,!0),0===e.strm.avail_out?Y:K):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?$:G}(i,t):n[i.level].func(i,t);if(y!==Y&&y!==K||(i.status=Z),y===$||y===Y)return 0===e.avail_out&&(i.last_flush=-1),p;if(y===G&&(t===c?s._tr_align(i):t!==d&&(s._tr_stored_block(i,0,0,!1),t===f&&(Q(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),ee(e),0===e.avail_out))return i.last_flush=-1,p}return t!==l?p:i.wrap<=0?_:(2===i.wrap?(re(i,255&e.adler),re(i,e.adler>>8&255),re(i,e.adler>>16&255),re(i,e.adler>>24&255),re(i,255&e.total_in),re(i,e.total_in>>8&255),re(i,e.total_in>>16&255),re(i,e.total_in>>24&255)):(ne(i,e.adler>>>16),ne(i,65535&e.adler)),ee(e),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?p:_)},t.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==U&&t!==z&&t!==M&&t!==W&&t!==F&&t!==H&&t!==Z?X(e,g):(e.state=null,t===H?X(e,m):p):g},t.deflateSetDictionary=function(e,t){var r,n,s,a,u,h,c,f,l=t.length;if(!e||!e.state)return g;if(2===(a=(r=e.state).wrap)||1===a&&r.status!==U||r.lookahead)return g;for(1===a&&(e.adler=o(e.adler,t,l,0)),r.wrap=0,l>=r.w_size&&(0===a&&(Q(r.head),r.strstart=0,r.block_start=0,r.insert=0),f=new i.Buf8(r.w_size),i.arraySet(f,t,l-r.w_size,r.w_size,0),t=f,l=r.w_size),u=e.avail_in,h=e.next_in,c=e.input,e.avail_in=l,e.next_in=0,e.input=t,se(r);r.lookahead>=B;){n=r.strstart,s=r.lookahead-(B-1);do{r.ins_h=(r.ins_h<>>16&65535|0,o=0;0!==r;){r-=o=r>2e3?2e3:r;do{s=s+(i=i+t[n++]|0)|0}while(--o);i%=65521,s%=65521}return i|s<<16|0}},function(e,t,r){"use strict";var n=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();e.exports=function(e,t,r,i){var s=n,o=i+r;e^=-1;for(var a=i;a>>8^s[255&(e^t[a])];return-1^e}},function(e,t,r){"use strict";var n=r(5),i=r(47),s=r(48),o=r(86),a=r(87),u=0,h=1,c=2,f=4,l=5,d=6,p=0,_=1,g=2,m=-2,w=-3,y=-4,b=-5,v=8,R=1,x=2,E=3,k=4,S=5,A=6,T=7,C=8,O=9,I=10,L=11,q=12,P=13,B=14,j=15,N=16,D=17,U=18,z=19,M=20,W=21,F=22,H=23,Z=24,$=25,G=26,Y=27,K=28,V=29,X=30,J=31,Q=32,ee=852,te=592,re=15;function ne(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function ie(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function se(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=R,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(ee),t.distcode=t.distdyn=new n.Buf32(te),t.sane=1,t.back=-1,p):m}function oe(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,se(e)):m}function ae(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?m:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,oe(e))):m}function ue(e,t){var r,n;return e?(n=new ie,e.state=n,n.window=null,(r=ae(e,t))!==p&&(e.state=null),r):m}var he,ce,fe=!0;function le(e){if(fe){var t;for(he=new n.Buf32(512),ce=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(a(h,e.lens,0,288,he,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;a(c,e.lens,0,32,ce,0,e.work,{bits:5}),fe=!1}e.lencode=he,e.lenbits=9,e.distcode=ce,e.distbits=5}function de(e,t,r,i){var s,o=e.state;return null===o.window&&(o.wsize=1<=o.wsize?(n.arraySet(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):((s=o.wsize-o.wnext)>i&&(s=i),n.arraySet(o.window,t,r-i,s,o.wnext),(i-=s)?(n.arraySet(o.window,t,r-i,i,0),o.wnext=i,o.whave=o.wsize):(o.wnext+=s,o.wnext===o.wsize&&(o.wnext=0),o.whave>>8&255,r.check=s(r.check,Ae,2,0),ae=0,ue=0,r.mode=x;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&ae)<<8)+(ae>>8))%31){e.msg="incorrect header check",r.mode=X;break}if((15&ae)!==v){e.msg="unknown compression method",r.mode=X;break}if(ue-=4,Re=8+(15&(ae>>>=4)),0===r.wbits)r.wbits=Re;else if(Re>r.wbits){e.msg="invalid window size",r.mode=X;break}r.dmax=1<>8&1),512&r.flags&&(Ae[0]=255&ae,Ae[1]=ae>>>8&255,r.check=s(r.check,Ae,2,0)),ae=0,ue=0,r.mode=E;case E:for(;ue<32;){if(0===se)break e;se--,ae+=ee[re++]<>>8&255,Ae[2]=ae>>>16&255,Ae[3]=ae>>>24&255,r.check=s(r.check,Ae,4,0)),ae=0,ue=0,r.mode=k;case k:for(;ue<16;){if(0===se)break e;se--,ae+=ee[re++]<>8),512&r.flags&&(Ae[0]=255&ae,Ae[1]=ae>>>8&255,r.check=s(r.check,Ae,2,0)),ae=0,ue=0,r.mode=S;case S:if(1024&r.flags){for(;ue<16;){if(0===se)break e;se--,ae+=ee[re++]<>>8&255,r.check=s(r.check,Ae,2,0)),ae=0,ue=0}else r.head&&(r.head.extra=null);r.mode=A;case A:if(1024&r.flags&&((fe=r.length)>se&&(fe=se),fe&&(r.head&&(Re=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,ee,re,fe,Re)),512&r.flags&&(r.check=s(r.check,ee,fe,re)),se-=fe,re+=fe,r.length-=fe),r.length))break e;r.length=0,r.mode=T;case T:if(2048&r.flags){if(0===se)break e;fe=0;do{Re=ee[re+fe++],r.head&&Re&&r.length<65536&&(r.head.name+=String.fromCharCode(Re))}while(Re&&fe>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=q;break;case I:for(;ue<32;){if(0===se)break e;se--,ae+=ee[re++]<>>=7&ue,ue-=7&ue,r.mode=Y;break}for(;ue<3;){if(0===se)break e;se--,ae+=ee[re++]<>>=1)){case 0:r.mode=B;break;case 1:if(le(r),r.mode=M,t===d){ae>>>=2,ue-=2;break e}break;case 2:r.mode=D;break;case 3:e.msg="invalid block type",r.mode=X}ae>>>=2,ue-=2;break;case B:for(ae>>>=7&ue,ue-=7&ue;ue<32;){if(0===se)break e;se--,ae+=ee[re++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=X;break}if(r.length=65535&ae,ae=0,ue=0,r.mode=j,t===d)break e;case j:r.mode=N;case N:if(fe=r.length){if(fe>se&&(fe=se),fe>oe&&(fe=oe),0===fe)break e;n.arraySet(te,ee,re,fe,ie),se-=fe,re+=fe,oe-=fe,ie+=fe,r.length-=fe;break}r.mode=q;break;case D:for(;ue<14;){if(0===se)break e;se--,ae+=ee[re++]<>>=5,ue-=5,r.ndist=1+(31&ae),ae>>>=5,ue-=5,r.ncode=4+(15&ae),ae>>>=4,ue-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=X;break}r.have=0,r.mode=U;case U:for(;r.have>>=3,ue-=3}for(;r.have<19;)r.lens[Te[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,Ee={bits:r.lenbits},xe=a(u,r.lens,0,19,r.lencode,0,r.work,Ee),r.lenbits=Ee.bits,xe){e.msg="invalid code lengths set",r.mode=X;break}r.have=0,r.mode=z;case z:for(;r.have>>16&255,we=65535&Se,!((ge=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=ge,ue-=ge,r.lens[r.have++]=we;else{if(16===we){for(ke=ge+2;ue>>=ge,ue-=ge,0===r.have){e.msg="invalid bit length repeat",r.mode=X;break}Re=r.lens[r.have-1],fe=3+(3&ae),ae>>>=2,ue-=2}else if(17===we){for(ke=ge+3;ue>>=ge)),ae>>>=3,ue-=3}else{for(ke=ge+7;ue>>=ge)),ae>>>=7,ue-=7}if(r.have+fe>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=X;break}for(;fe--;)r.lens[r.have++]=Re}}if(r.mode===X)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=X;break}if(r.lenbits=9,Ee={bits:r.lenbits},xe=a(h,r.lens,0,r.nlen,r.lencode,0,r.work,Ee),r.lenbits=Ee.bits,xe){e.msg="invalid literal/lengths set",r.mode=X;break}if(r.distbits=6,r.distcode=r.distdyn,Ee={bits:r.distbits},xe=a(c,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,Ee),r.distbits=Ee.bits,xe){e.msg="invalid distances set",r.mode=X;break}if(r.mode=M,t===d)break e;case M:r.mode=W;case W:if(se>=6&&oe>=258){e.next_out=ie,e.avail_out=oe,e.next_in=re,e.avail_in=se,r.hold=ae,r.bits=ue,o(e,ce),ie=e.next_out,te=e.output,oe=e.avail_out,re=e.next_in,ee=e.input,se=e.avail_in,ae=r.hold,ue=r.bits,r.mode===q&&(r.back=-1);break}for(r.back=0;me=(Se=r.lencode[ae&(1<>>16&255,we=65535&Se,!((ge=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>ye)])>>>16&255,we=65535&Se,!(ye+(ge=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=ye,ue-=ye,r.back+=ye}if(ae>>>=ge,ue-=ge,r.back+=ge,r.length=we,0===me){r.mode=G;break}if(32&me){r.back=-1,r.mode=q;break}if(64&me){e.msg="invalid literal/length code",r.mode=X;break}r.extra=15&me,r.mode=F;case F:if(r.extra){for(ke=r.extra;ue>>=r.extra,ue-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=H;case H:for(;me=(Se=r.distcode[ae&(1<>>16&255,we=65535&Se,!((ge=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>ye)])>>>16&255,we=65535&Se,!(ye+(ge=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=ye,ue-=ye,r.back+=ye}if(ae>>>=ge,ue-=ge,r.back+=ge,64&me){e.msg="invalid distance code",r.mode=X;break}r.offset=we,r.extra=15&me,r.mode=Z;case Z:if(r.extra){for(ke=r.extra;ue>>=r.extra,ue-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=X;break}r.mode=$;case $:if(0===oe)break e;if(fe=ce-oe,r.offset>fe){if((fe=r.offset-fe)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=X;break}fe>r.wnext?(fe-=r.wnext,pe=r.wsize-fe):pe=r.wnext-fe,fe>r.length&&(fe=r.length),_e=r.window}else _e=te,pe=ie-r.offset,fe=r.length;fe>oe&&(fe=oe),oe-=fe,r.length-=fe;do{te[ie++]=_e[pe++]}while(--fe);0===r.length&&(r.mode=W);break;case G:if(0===oe)break e;te[ie++]=r.length,oe--,r.mode=W;break;case Y:if(r.wrap){for(;ue<32;){if(0===se)break e;se--,ae|=ee[re++]<a)&&void 0===e.nsecs&&(_=0),_>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=p,u=_,i=l;var m=(1e4*(268435455&(p+=122192928e5))+_)%4294967296;c[h++]=m>>>24&255,c[h++]=m>>>16&255,c[h++]=m>>>8&255,c[h++]=255&m;var w=p/4294967296*1e4&268435455;c[h++]=w>>>8&255,c[h++]=255&w,c[h++]=w>>>24&15|16,c[h++]=w>>>16&255,c[h++]=l>>>8|128,c[h++]=255&l;for(var y=0;y<6;++y)c[h+y]=f[y];return t||o(c)}},function(e,t){var r=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||r)}},function(e,t,r){var n=r(17),i=r(55),s="[object AsyncFunction]",o="[object Function]",a="[object GeneratorFunction]",u="[object Proxy]";e.exports=function(e){if(!i(e))return!1;var t=n(e);return t==o||t==a||t==s||t==u}},function(e,t,r){(function(t){var r="object"==typeof t&&t&&t.Object===Object&&t;e.exports=r}).call(this,r(1))},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t){var r=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return r.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},function(e,t){var r=Array.isArray;e.exports=r},function(e,t){var r=9007199254740991;e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=r}},function(e,t,r){(function(e){t.fetch=a(e.fetch)&&a(e.ReadableStream),t.writableStream=a(e.WritableStream),t.abortController=a(e.AbortController),t.blobConstructor=!1;try{new Blob([new ArrayBuffer(1)]),t.blobConstructor=!0}catch(e){}var r;function n(){if(void 0!==r)return r;if(e.XMLHttpRequest){r=new e.XMLHttpRequest;try{r.open("GET",e.XDomainRequest?"/":"https://example.com")}catch(e){r=null}}else r=null;return r}function i(e){var t=n();if(!t)return!1;try{return t.responseType=e,t.responseType===e}catch(e){}return!1}var s=void 0!==e.ArrayBuffer,o=s&&a(e.ArrayBuffer.prototype.slice);function a(e){return"function"==typeof e}t.arraybuffer=t.fetch||s&&i("arraybuffer"),t.msstream=!t.fetch&&o&&i("ms-stream"),t.mozchunkedarraybuffer=!t.fetch&&s&&i("moz-chunked-arraybuffer"),t.overrideMimeType=t.fetch||!!n()&&a(n().overrideMimeType),t.vbArray=a(e.VBArray),r=null}).call(this,r(1))},function(e,t,r){(function(e,n,i){var s=r(59),o=r(4),a=r(11),u=t.readyStates={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},h=t.IncomingMessage=function(t,r,o,u){var h=this;if(a.Readable.call(h),h._mode=o,h.headers={},h.rawHeaders=[],h.trailers={},h.rawTrailers=[],h.on("end",function(){e.nextTick(function(){h.emit("close")})}),"fetch"===o){if(h._fetchResponse=r,h.url=r.url,h.statusCode=r.status,h.statusMessage=r.statusText,r.headers.forEach(function(e,t){h.headers[t.toLowerCase()]=e,h.rawHeaders.push(t,e)}),s.writableStream){var c=new WritableStream({write:function(e){return new Promise(function(t,r){h._destroyed?r():h.push(new n(e))?t():h._resumeFetch=t})},close:function(){i.clearTimeout(u),h._destroyed||h.push(null)},abort:function(e){h._destroyed||h.emit("error",e)}});try{return void r.body.pipeTo(c).catch(function(e){i.clearTimeout(u),h._destroyed||h.emit("error",e)})}catch(e){}}var f=r.body.getReader();!function e(){f.read().then(function(t){if(!h._destroyed){if(t.done)return i.clearTimeout(u),void h.push(null);h.push(new n(t.value)),e()}}).catch(function(e){i.clearTimeout(u),h._destroyed||h.emit("error",e)})}()}else{if(h._xhr=t,h._pos=0,h.url=t.responseURL,h.statusCode=t.status,h.statusMessage=t.statusText,t.getAllResponseHeaders().split(/\r?\n/).forEach(function(e){var t=e.match(/^([^:]+):\s*(.*)/);if(t){var r=t[1].toLowerCase();"set-cookie"===r?(void 0===h.headers[r]&&(h.headers[r]=[]),h.headers[r].push(t[2])):void 0!==h.headers[r]?h.headers[r]+=", "+t[2]:h.headers[r]=t[2],h.rawHeaders.push(t[1],t[2])}}),h._charset="x-user-defined",!s.overrideMimeType){var l=h.rawHeaders["mime-type"];if(l){var d=l.match(/;\s*charset=([^;])(;|$)/);d&&(h._charset=d[1].toLowerCase())}h._charset||(h._charset="utf-8")}}};o(h,a.Readable),h.prototype._read=function(){var e=this._resumeFetch;e&&(this._resumeFetch=null,e())},h.prototype._onXHRProgress=function(){var e=this,t=e._xhr,r=null;switch(e._mode){case"text:vbarray":if(t.readyState!==u.DONE)break;try{r=new i.VBArray(t.responseBody).toArray()}catch(e){}if(null!==r){e.push(new n(r));break}case"text":try{r=t.responseText}catch(t){e._mode="text:vbarray";break}if(r.length>e._pos){var s=r.substr(e._pos);if("x-user-defined"===e._charset){for(var o=new n(s.length),a=0;ae._pos&&(e.push(new n(new Uint8Array(h.result.slice(e._pos)))),e._pos=h.result.byteLength)},h.onload=function(){e.push(null)},h.readAsArrayBuffer(r)}e._xhr.readyState===u.DONE&&"ms-stream"!==e._mode&&e.push(null)}}).call(this,r(2),r(0).Buffer,r(1))},function(e,t){var r=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return r.test(e)}},function(e,t,r){const{URL:n}=r(18);e.exports={httpRequestPath:function(e){return e instanceof n||(e=new n(e)),`${e.pathname}${e.search?`?${e.searchParams.toString()}`:""}${e.hash?e.hash:""}`}}},function(e,t,r){const{STATUS_CODES:n}=r(35),{URL:i}=r(18),{canReplayProtocols:s,SPACE:o,HTTP1D1:a,H2Method:u}=r(31),{httpRequestPath:h}=r(62),{CRLF:c}=r(3),{stringifyHeaders:f}=r(36),l=`${c}${c}`;class d{constructor(){this.requestId=void 0,this._url=void 0,this.urlFragment=void 0,this.method=void 0,this.protocol=void 0,this.status=void 0,this.statusText=void 0,this.postData=void 0,this.requestHeaders=void 0,this.requestHeaders_=void 0,this.requestHeadersText=void 0,this.responseHeaders=void 0,this.responseHeadersText=void 0,this.getBody=!1,this.hasPostData=!1}static fromRequest(e){const t=new d;return t.requestId=e.requestId,t._url=e.request.url,t.urlFragment=e.request.urlFragment,t.method=e.request.method,t.requestHeaders_=e.request.headers,t.postData=e.request.postData,t.hasPostData=e.request.hasPostData,t}static fromRedir(e){const t=new d;return t.requestId=e.requestId,t._url=e.redirectResponse.url,t.method=e.request.method,t.requestHeaders=e.redirectResponse.requestHeaders,t.requestHeadersText=e.redirectResponse.requestHeadersText,t.responseHeaders=e.redirectResponse.headers,t.responseHeadersText=e.redirectResponse.headersText,t.status=e.redirectResponse.status,t.statusText=e.redirectResponse.statusText,t.protocol=e.redirectResponse.protocol,t}static fromResponse(e){const t=new d;return t.requestId=e.requestId,t._url=e.response.url,t.requestHeaders=e.response.requestHeaders,t.requestHeadersText=e.response.requestHeadersText,t.responseHeaders=e.response.headers,t.responseHeadersText=e.response.headersText,t.status=e.response.status,t.statusText=e.response.statusText,t.protocol=e.response.protocol,t.getBody=!0,t}addResponse(e,t=!0){this._url=this._url||e.url,this.requestHeaders=e.requestHeaders,this.requestHeadersText=e.requestHeadersText,this.responseHeaders=e.headers,this.responseHeadersText=e.headersText,this.status=e.status,this.statusText=e.statusText,this.protocol=e.protocol,this.getBody=t}get url(){return null!=this.urlFragment?this._url+this.urlFragment:this._url}getParsedURL(){return new i(this.url)}_serializeRequestHeadersText(){const e=this.requestHeadersText.indexOf(c);let t=this.requestHeadersText.substring(0,e);const r=this.requestHeadersText.substring(e),n=t.substring(t.lastIndexOf(o)+1);return s.has(n)||(t=t.replace(n,a)),r.substring(r.length-4)===l?t+r:t+r+c}_getReqHeaderObj(){return null!=this.requestHeaders?this.requestHeaders:null!=this.requestHeaders_?this.requestHeaders_:null}_ensureProto(){null!=this.protocol&&s.has(this.protocol.toUpperCase())||(this.protocol=a)}_serializeRequestHeadersObj(){this._checkMethod(),this._ensureProto();const e=this.getParsedURL(),t=this._getReqHeaderObj(),r=h(e),n=`${this.method} ${r} ${this.protocol}${c}`;return null!=t?(null==t.host&&null==t.Host&&(t.Host=e.host),n+f(t)):n+`Host: ${e.host}${c}${c}`}serializeRequestHeaders(){return null!=this.requestHeadersText?this._serializeRequestHeadersText():this._serializeRequestHeadersObj()}serializeResponseHeaders(){let e;if(null!=this.responseHeadersText){const t=this.responseHeadersText.substring(0,this.responseHeadersText.indexOf(o));return(e=s.has(t)?this.responseHeadersText:this.responseHeadersText.replace(t,a)).substring(e.length-4)===l?e:e+c}return null!=this.responseHeaders&&(this._ensureProto(),this.statusText||(this.statusText=n[this.status]),e=`${this.protocol} ${this.status} ${this.statusText}${c}${f(this.responseHeaders)}`),e}canSerializeResponse(){return 0!==this.url.indexOf("data:")&&(null!=this.responseHeadersText||null!=this.status&&null!=this.protocol&&null!=this.responseHeaders)}_checkMethod(){if(!this.method){let e=!1;if(this.requestHeaders){let t=this.requestHeaders[u];t&&(this.method=t,e=!0)}if(this.responseHeaders){let t=this.responseHeaders[u];t&&(this.method=t,e=!0)}!e&&this.requestHeadersText&&this._methProtoFromReqHeadText(this.requestHeadersText),null==this.method&&(this.method=null!=this.postData||this.hasPostData?"POST":"GET")}}_methProtoFromReqHeadText(e){if(e){let t=e.substr(0,e.indexOf(c));if(t){let e=t.split(o);e&&(this.method=e[0],this.protocol||(this.protocol=this._correctProtocol(e[2])))}}}_correctProtocol(e){let t;return e?(t=e.toUpperCase(),t=s.has(t)?t:a):t=a,this.protocol||(this.protocol=t),t}}e.exports=d},function(e,t,r){const n=r(51),i=r(63),s=Symbol("is_request"),o=Symbol("is_redirection"),a=Symbol("is_response");function u(e){return null!=e.redirectResponse?o:null!=e.request?s:a}class h{constructor(e){this.requestId=e.requestId,this._reqs=new Map;let t=u(e);if(t===o){let t=i.fromRedir(e),r=i.fromRequest(e);this._reqs.set(t.url,t),this._reqs.set(r.url,r)}else t===s?this._reqs.set(e.request.url,i.fromRequest(e)):this._reqs.set(e.response.url,i.fromResponse(e))}static newOne(e){return new h(e)}addRequestInfo(e){let t=u(e);if(t===o){this._reqs.has(e.redirectResponse.url)?this._reqs.get(e.redirectResponse.url).addResponse(e.redirectResponse,!1):this._reqs.set(e.redirectResponse.url,i.fromRedir(e)),this._reqs.set(e.request.url,i.fromRequest(e))}else t===s?this._reqs.has(e.request.url)?this._reqs.set(`${e.request.url}${n()}`,i.fromRequest(e)):this._reqs.set(e.request.url,i.fromRequest(e)):this._reqs.has(e.response.url)?this._reqs.get(e.response.url).addResponse(e.response):this._reqs.set(e.response.url,i.fromResponse(e))}[Symbol.iterator](){return this._reqs.values()}url(){let e=Array.from(this._reqs.keys());return 1===e.length?e[0]:e}keys(){return this._reqs.keys()}values(){return this._reqs.values()}}e.exports=h},function(e,t,r){"use strict";var n=r(5),i=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(e){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){s=!1}for(var o=new n.Buf8(256),a=0;a<256;a++)o[a]=a>=252?6:a>=248?5:a>=240?4:a>=224?3:a>=192?2:1;function u(e,t){if(t<65534&&(e.subarray&&s||!e.subarray&&i))return String.fromCharCode.apply(null,n.shrinkBuf(e,t));for(var r="",o=0;o>>6,t[o++]=128|63&r):r<65536?(t[o++]=224|r>>>12,t[o++]=128|r>>>6&63,t[o++]=128|63&r):(t[o++]=240|r>>>18,t[o++]=128|r>>>12&63,t[o++]=128|r>>>6&63,t[o++]=128|63&r);return t},t.buf2binstring=function(e){return u(e,e.length)},t.binstring2buf=function(e){for(var t=new n.Buf8(e.length),r=0,i=t.length;r4)h[n++]=65533,r+=s-1;else{for(i&=2===s?31:3===s?15:7;s>1&&r1?h[n++]=65533:i<65536?h[n++]=i:(i-=65536,h[n++]=55296|i>>10&1023,h[n++]=56320|1023&i)}return u(h,n)},t.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;r>=0&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+o[e[r]]>t?r:t}},function(e,t,r){"use strict";const{WARCStreamTransform:n,AutoWARCParser:i,WARCGzParser:s,WARCParser:o}=r(67),{CRIExtraWARCGenerator:a,ElectronWARCWriter:u,PuppeteerCDPWARCGenerator:h,PuppeteerWARCGenerator:c,RemoteChromeWARCWriter:f,WARCWriterBase:l}=r(93),{CRIExtraCapturer:d,ElectronCapturer:p,PuppeteerCapturer:_,PuppeteerCDPCapturer:g,RemoteChromeCapturer:m,RequestHandler:w}=r(159);t.AutoWARCParser=i,t.CRIExtraCapturer=d,t.CRIExtraWARCGenerator=a,t.ElectronCapturer=p,t.ElectronWARCWriter=u,t.PuppeteerCDPCapturer=g,t.PuppeteerCDPWARCGenerator=h,t.PuppeteerCapturer=_,t.PuppeteerWARCGenerator=c,t.RemoteChromeCapturer=m,t.RemoteChromeWARCWriter=f,t.RequestHandler=w,t.WARCGzParser=s,t.WARCParser=o,t.WARCStreamTransform=n,t.WARCWriterBase=l,t.RequestLibWARCWriter=r(165),r(14)&&(t.recordIterator=r(15)),t.stream=r(25),t.zlib=r(19),t.pako=r(166)},function(e,t,r){t.AutoWARCParser=r(68),t.GzipDetector=r(50),t.WARCGzParser=r(91),t.WARCParser=r(92),t.WARCStreamTransform=r(13),r(14)&&(t.recordIterator=r(15))},function(e,t,r){const n=r(10).getStream,i=r(19),s=r(22),o=r(13),a=r(50),u=r(14);e.exports=class extends s{constructor(e){if(super(),this._wp=e,this._parsing=!1,this._onRecord=this._onRecord.bind(this),this._onEnd=this._onEnd.bind(this),this._onError=this._onError.bind(this),u){const e=r(15);this[Symbol.asyncIterator]=()=>e(this._getStream())}}start(){let e=!1;if(!this._parsing){if(null==this._wp)throw new Error("The supplied path to the WARC file is null/undefined");this._parsing=!0,this._getStream().pipe(new o).on("data",this._onRecord).on("error",this._onError).on("end",this._onEnd),e=!0}return e}parseWARC(e){return this._parsing||(this._wp=e||this._wp),this.start()}_onRecord(e){this.emit("record",e)}_onEnd(){this._parsing=!1,this.emit("done")}_onError(e){this.emit("error",e)}_getStream(){const e=a.isGzippedSync(this._wp),t=n(this._wp,!0);return e?t.pipe(i.createGunzip()):t}}},function(e,t,r){"use strict";t.byteLength=function(e){var t=h(e),r=t[0],n=t[1];return 3*(r+n)/4-n},t.toByteArray=function(e){for(var t,r=h(e),n=r[0],o=r[1],a=new s(function(e,t,r){return 3*(t+r)/4-r}(0,n,o)),u=0,c=o>0?n-4:n,f=0;f>16&255,a[u++]=t>>8&255,a[u++]=255&t;2===o&&(t=i[e.charCodeAt(f)]<<2|i[e.charCodeAt(f+1)]>>4,a[u++]=255&t);1===o&&(t=i[e.charCodeAt(f)]<<10|i[e.charCodeAt(f+1)]<<4|i[e.charCodeAt(f+2)]>>2,a[u++]=t>>8&255,a[u++]=255&t);return a},t.fromByteArray=function(e){for(var t,r=e.length,i=r%3,s=[],o=0,a=r-i;oa?a:o+16383));1===i?(t=e[r-1],s.push(n[t>>2]+n[t<<4&63]+"==")):2===i&&(t=(e[r-2]<<8)+e[r-1],s.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return s.join("")};for(var n=[],i=[],s="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=o.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function c(e,t,r){for(var i,s,o=[],a=t;a>18&63]+n[s>>12&63]+n[s>>6&63]+n[63&s]);return o.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,r,n,i){var s,o,a=8*i-n-1,u=(1<>1,c=-7,f=r?i-1:0,l=r?-1:1,d=e[t+f];for(f+=l,s=d&(1<<-c)-1,d>>=-c,c+=a;c>0;s=256*s+e[t+f],f+=l,c-=8);for(o=s&(1<<-c)-1,s>>=-c,c+=n;c>0;o=256*o+e[t+f],f+=l,c-=8);if(0===s)s=1-h;else{if(s===u)return o?NaN:1/0*(d?-1:1);o+=Math.pow(2,n),s-=h}return(d?-1:1)*o*Math.pow(2,s-n)},t.write=function(e,t,r,n,i,s){var o,a,u,h=8*s-i-1,c=(1<>1,l=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:s-1,p=n?1:-1,_=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,o=c):(o=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-o))<1&&(o--,u*=2),(t+=o+f>=1?l/u:l*Math.pow(2,1-f))*u>=2&&(o++,u/=2),o+f>=c?(a=0,o=c):o+f>=1?(a=(t*u-1)*Math.pow(2,i),o+=f):(a=t*Math.pow(2,f-1)*Math.pow(2,i),o=0));i>=8;e[r+d]=255&a,d+=p,a/=256,i-=8);for(o=o<0;e[r+d]=255&o,d+=p,o/=256,h-=8);e[r+d-p]|=128*_}},function(e,t){},function(e,t,r){"use strict";var n=r(21).Buffer,i=r(73);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},e.prototype.concat=function(e){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var t,r,i,s=n.allocUnsafe(e>>>0),o=this.head,a=0;o;)t=o.data,r=s,i=a,t.copy(r,i),a+=o.data.length,o=o.next;return s},e}(),i&&i.inspect&&i.inspect.custom&&(e.exports.prototype[i.inspect.custom]=function(){var e=i.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,r){(function(e){var n=void 0!==e&&e||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function s(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new s(i.call(setTimeout,n,arguments),clearTimeout)},t.setInterval=function(){return new s(i.call(setInterval,n,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},s.prototype.unref=s.prototype.ref=function(){},s.prototype.close=function(){this._clearFn.call(n,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},r(75),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,r(1))},function(e,t,r){(function(e,t){!function(e,r){"use strict";if(!e.setImmediate){var n,i,s,o,a,u=1,h={},c=!1,f=e.document,l=Object.getPrototypeOf&&Object.getPrototypeOf(e);l=l&&l.setTimeout?l:e,"[object process]"==={}.toString.call(e.process)?n=function(e){t.nextTick(function(){p(e)})}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,r=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=r,t}}()?e.MessageChannel?((s=new MessageChannel).port1.onmessage=function(e){p(e.data)},n=function(e){s.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(i=f.documentElement,n=function(e){var t=f.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):n=function(e){setTimeout(p,0,e)}:(o="setImmediate$"+Math.random()+"$",a=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(o)&&p(+t.data.slice(o.length))},e.addEventListener?e.addEventListener("message",a,!1):e.attachEvent("onmessage",a),n=function(t){e.postMessage(o+t,"*")}),l.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),r=0;rt.UNZIP)throw new TypeError("Bad argument");this.dictionary=null,this.err=0,this.flush=0,this.init_done=!1,this.level=0,this.memLevel=0,this.mode=e,this.strategy=0,this.windowBits=0,this.write_in_progress=!1,this.pending_close=!1,this.gzip_id_bytes_read=0}c.prototype.close=function(){this.write_in_progress?this.pending_close=!0:(this.pending_close=!1,i(this.init_done,"close before init"),i(this.mode<=t.UNZIP),this.mode===t.DEFLATE||this.mode===t.GZIP||this.mode===t.DEFLATERAW?o.deflateEnd(this.strm):this.mode!==t.INFLATE&&this.mode!==t.GUNZIP&&this.mode!==t.INFLATERAW&&this.mode!==t.UNZIP||a.inflateEnd(this.strm),this.mode=t.NONE,this.dictionary=null)},c.prototype.write=function(e,t,r,n,i,s,o){return this._write(!0,e,t,r,n,i,s,o)},c.prototype.writeSync=function(e,t,r,n,i,s,o){return this._write(!1,e,t,r,n,i,s,o)},c.prototype._write=function(r,s,o,a,u,h,c,f){if(i.equal(arguments.length,8),i(this.init_done,"write before init"),i(this.mode!==t.NONE,"already finalized"),i.equal(!1,this.write_in_progress,"write already in progress"),i.equal(!1,this.pending_close,"close is pending"),this.write_in_progress=!0,i.equal(!1,void 0===s,"must provide flush value"),this.write_in_progress=!0,s!==t.Z_NO_FLUSH&&s!==t.Z_PARTIAL_FLUSH&&s!==t.Z_SYNC_FLUSH&&s!==t.Z_FULL_FLUSH&&s!==t.Z_FINISH&&s!==t.Z_BLOCK)throw new Error("Invalid flush value");if(null==o&&(o=e.alloc(0),u=0,a=0),this.strm.avail_in=u,this.strm.input=o,this.strm.next_in=a,this.strm.avail_out=f,this.strm.output=h,this.strm.next_out=c,this.flush=s,!r)return this._process(),this._checkError()?this._afterSync():void 0;var l=this;return n.nextTick(function(){l._process(),l._after()}),this},c.prototype._afterSync=function(){var e=this.strm.avail_out,t=this.strm.avail_in;return this.write_in_progress=!1,[t,e]},c.prototype._process=function(){var e=null;switch(this.mode){case t.DEFLATE:case t.GZIP:case t.DEFLATERAW:this.err=o.deflate(this.strm,this.flush);break;case t.UNZIP:switch(this.strm.avail_in>0&&(e=this.strm.next_in),this.gzip_id_bytes_read){case 0:if(null===e)break;if(31!==this.strm.input[e]){this.mode=t.INFLATE;break}if(this.gzip_id_bytes_read=1,e++,1===this.strm.avail_in)break;case 1:if(null===e)break;139===this.strm.input[e]?(this.gzip_id_bytes_read=2,this.mode=t.GUNZIP):this.mode=t.INFLATE;break;default:throw new Error("invalid number of gzip magic number bytes read")}case t.INFLATE:case t.GUNZIP:case t.INFLATERAW:for(this.err=a.inflate(this.strm,this.flush),this.err===t.Z_NEED_DICT&&this.dictionary&&(this.err=a.inflateSetDictionary(this.strm,this.dictionary),this.err===t.Z_OK?this.err=a.inflate(this.strm,this.flush):this.err===t.Z_DATA_ERROR&&(this.err=t.Z_NEED_DICT));this.strm.avail_in>0&&this.mode===t.GUNZIP&&this.err===t.Z_STREAM_END&&0!==this.strm.next_in[0];)this.reset(),this.err=a.inflate(this.strm,this.flush);break;default:throw new Error("Unknown mode "+this.mode)}},c.prototype._checkError=function(){switch(this.err){case t.Z_OK:case t.Z_BUF_ERROR:if(0!==this.strm.avail_out&&this.flush===t.Z_FINISH)return this._error("unexpected end of file"),!1;break;case t.Z_STREAM_END:break;case t.Z_NEED_DICT:return null==this.dictionary?this._error("Missing dictionary"):this._error("Bad dictionary"),!1;default:return this._error("Zlib error"),!1}return!0},c.prototype._after=function(){if(this._checkError()){var e=this.strm.avail_out,t=this.strm.avail_in;this.write_in_progress=!1,this.callback(t,e),this.pending_close&&this.close()}},c.prototype._error=function(e){this.strm.msg&&(e=this.strm.msg),this.onerror(e,this.err),this.write_in_progress=!1,this.pending_close&&this.close()},c.prototype.init=function(e,r,n,s,o){i(4===arguments.length||5===arguments.length,"init(windowBits, level, memLevel, strategy, [dictionary])"),i(e>=8&&e<=15,"invalid windowBits"),i(r>=-1&&r<=9,"invalid compression level"),i(n>=1&&n<=9,"invalid memlevel"),i(s===t.Z_FILTERED||s===t.Z_HUFFMAN_ONLY||s===t.Z_RLE||s===t.Z_FIXED||s===t.Z_DEFAULT_STRATEGY,"invalid strategy"),this._init(r,e,n,s,o),this._setDictionary()},c.prototype.params=function(){throw new Error("deflateParams Not supported")},c.prototype.reset=function(){this._reset(),this._setDictionary()},c.prototype._init=function(e,r,n,i,u){switch(this.level=e,this.windowBits=r,this.memLevel=n,this.strategy=i,this.flush=t.Z_NO_FLUSH,this.err=t.Z_OK,this.mode!==t.GZIP&&this.mode!==t.GUNZIP||(this.windowBits+=16),this.mode===t.UNZIP&&(this.windowBits+=32),this.mode!==t.DEFLATERAW&&this.mode!==t.INFLATERAW||(this.windowBits=-1*this.windowBits),this.strm=new s,this.mode){case t.DEFLATE:case t.GZIP:case t.DEFLATERAW:this.err=o.deflateInit2(this.strm,this.level,t.Z_DEFLATED,this.windowBits,this.memLevel,this.strategy);break;case t.INFLATE:case t.GUNZIP:case t.INFLATERAW:case t.UNZIP:this.err=a.inflateInit2(this.strm,this.windowBits);break;default:throw new Error("Unknown mode "+this.mode)}this.err!==t.Z_OK&&this._error("Init error"),this.dictionary=u,this.write_in_progress=!1,this.init_done=!0},c.prototype._setDictionary=function(){if(null!=this.dictionary){switch(this.err=t.Z_OK,this.mode){case t.DEFLATE:case t.DEFLATERAW:this.err=o.deflateSetDictionary(this.strm,this.dictionary)}this.err!==t.Z_OK&&this._error("Failed to set dictionary")}},c.prototype._reset=function(){switch(this.err=t.Z_OK,this.mode){case t.DEFLATE:case t.DEFLATERAW:case t.GZIP:this.err=o.deflateReset(this.strm);break;case t.INFLATE:case t.INFLATERAW:case t.GUNZIP:this.err=a.inflateReset(this.strm)}this.err!==t.Z_OK&&this._error("Failed to reset stream")},t.Zlib=c}).call(this,r(0).Buffer,r(2))},function(e,t,r){"use strict"; +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/var n=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(e){n[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var r,o,a=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),u=1;u=0;)e[t]=0}var h=0,c=1,f=2,l=29,d=256,p=d+1+l,_=30,g=19,m=2*p+1,w=15,y=16,b=7,v=256,R=16,x=17,E=18,k=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],S=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],A=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],C=new Array(2*(p+2));u(C);var O=new Array(2*_);u(O);var I=new Array(512);u(I);var L=new Array(256);u(L);var q=new Array(l);u(q);var P,B,j,N=new Array(_);function D(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function U(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function z(e){return e<256?I[e]:I[256+(e>>>7)]}function M(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function W(e,t,r){e.bi_valid>y-r?(e.bi_buf|=t<>y-e.bi_valid,e.bi_valid+=r-y):(e.bi_buf|=t<>>=1,r<<=1}while(--t>0);return r>>>1}function Z(e,t,r){var n,i,s=new Array(w+1),o=0;for(n=1;n<=w;n++)s[n]=o=o+r[n-1]<<1;for(i=0;i<=t;i++){var a=e[2*i+1];0!==a&&(e[2*i]=H(s[a]++,a))}}function $(e){var t;for(t=0;t8?M(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function Y(e,t,r,n){var i=2*t,s=2*r;return e[i]>1;r>=1;r--)K(e,s,r);i=u;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],K(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,K(e,s,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,o,a,u=t.dyn_tree,h=t.max_code,c=t.stat_desc.static_tree,f=t.stat_desc.has_stree,l=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,_=0;for(s=0;s<=w;s++)e.bl_count[s]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;rp&&(s=p,_++),u[2*n+1]=s,n>h||(e.bl_count[s]++,o=0,n>=d&&(o=l[n-d]),a=u[2*n],e.opt_len+=a*(s+o),f&&(e.static_len+=a*(c[2*n+1]+o)));if(0!==_){do{for(s=p-1;0===e.bl_count[s];)s--;e.bl_count[s]--,e.bl_count[s+1]+=2,e.bl_count[p]--,_-=2}while(_>0);for(s=p;0!==s;s--)for(n=e.bl_count[s];0!==n;)(i=e.heap[--r])>h||(u[2*i+1]!==s&&(e.opt_len+=(s-u[2*i+1])*u[2*i],u[2*i+1]=s),n--)}}(e,t),Z(s,h,e.bl_count)}function J(e,t,r){var n,i,s=-1,o=t[1],a=0,u=7,h=4;for(0===o&&(u=138,h=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=o,o=t[2*(n+1)+1],++a>=7;n<_;n++)for(N[n]=i<<7,e=0;e<1<0?(e.strm.data_type===a&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return s;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return o;for(t=32;t=3&&0===e.bl_tree[2*T[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),u=e.opt_len+3+7>>>3,(h=e.static_len+3+7>>>3)<=u&&(u=h)):u=h=r+5,r+4<=u&&-1!==t?te(e,t,r,n):e.strategy===i||h===u?(W(e,(c<<1)+(n?1:0),3),V(e,C,O)):(W(e,(f<<1)+(n?1:0),3),function(e,t,r,n){var i;for(W(e,t-257,5),W(e,r-1,5),W(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(L[r]+d+1)]++,e.dyn_dtree[2*z(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){W(e,c<<1,3),F(e,v,C),function(e){16===e.bi_valid?(M(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},function(e,t,r){"use strict";e.exports=function(e,t){var r,n,i,s,o,a,u,h,c,f,l,d,p,_,g,m,w,y,b,v,R,x,E,k,S;r=e.state,n=e.next_in,k=e.input,i=n+(e.avail_in-5),s=e.next_out,S=e.output,o=s-(t-e.avail_out),a=s+(e.avail_out-257),u=r.dmax,h=r.wsize,c=r.whave,f=r.wnext,l=r.window,d=r.hold,p=r.bits,_=r.lencode,g=r.distcode,m=(1<>>=b=y>>>24,p-=b,0===(b=y>>>16&255))S[s++]=65535&y;else{if(!(16&b)){if(0==(64&b)){y=_[(65535&y)+(d&(1<>>=b,p-=b),p<15&&(d+=k[n++]<>>=b=y>>>24,p-=b,!(16&(b=y>>>16&255))){if(0==(64&b)){y=g[(65535&y)+(d&(1<u){e.msg="invalid distance too far back",r.mode=30;break e}if(d>>>=b,p-=b,R>(b=s-o)){if((b=R-b)>c&&r.sane){e.msg="invalid distance too far back",r.mode=30;break e}if(x=0,E=l,0===f){if(x+=h-b,b2;)S[s++]=E[x++],S[s++]=E[x++],S[s++]=E[x++],v-=3;v&&(S[s++]=E[x++],v>1&&(S[s++]=E[x++]))}else{x=s-R;do{S[s++]=S[x++],S[s++]=S[x++],S[s++]=S[x++],v-=3}while(v>2);v&&(S[s++]=S[x++],v>1&&(S[s++]=S[x++]))}break}}break}}while(n>3,d&=(1<<(p-=v<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n=1&&0===B[S];S--);if(A>S&&(A=S),0===S)return h[c++]=20971520,h[c++]=20971520,l.bits=1,0;for(k=1;k0&&(0===e||1!==S))return-1;for(j[1]=0,x=1;x<15;x++)j[x+1]=j[x]+B[x];for(E=0;E852||2===e&&I>592)return 1;for(;;){y=x-C,f[E]w?(b=N[D+f[E]],v=q[P+f[E]]):(b=96,v=0),d=1<>C)+(p-=d)]=y<<24|b<<16|v|0}while(0!==p);for(d=1<>=1;if(0!==d?(L&=d-1,L+=d):L=0,E++,0==--B[x]){if(x===S)break;x=t[r+f[E]]}if(x>A&&(L&g)!==_){for(0===C&&(C=A),m+=k,O=1<<(T=x-C);T+C852||2===e&&I>592)return 1;h[_=L&g]=A<<24|T<<16|m-c|0}}return 0!==L&&(h[m+L]=x-C<<24|64<<16|0),l.bits=A,0}},function(e,t,r){"use strict";const n=r(89),{crlf:i,begin:s}=r(32),o={header:Symbol("warc-parsing-header"),content1:Symbol("warc-parsing-content1"),content2:Symbol("warc-parsing-content2"),consumeCRLFHeader:Symbol("warc-parsing-comsume-crlf-header"),consumeCRLFContent1:Symbol("warc-parsing-comsume-crlf-c1"),consumeCRLFContent2:Symbol("warc-parsing-comsume-crlf-c2")},a=s.length;e.exports=class{constructor(){this._parts={header:[],c1:[],c2:[]},this._parsingState=o.header}buildRecord(){if(0===this._parts.header.length)return null;const e=new n(this._parts);return this._parts.header=[],this._parts.c1=[],this._parts.c2=[],e}consumeLine(e){let t=null;(function(e){if(e.length>11)return!1;let t=0;for(;te(n(this._wp).pipe(i.createGunzip()))}}start(){let e=!1;if(!this._parsing){if(null==this._wp)throw new Error("The path to the WARC file is null/undefined");this._parsing=!0,e=!0,n(this._wp,!0).pipe(i.createGunzip()).pipe(new o).on("data",this._onRecord).on("error",this._onError).on("end",this._onEnd)}return e}_onRecord(e){this.emit("record",e)}_onError(e){this.emit("error",e)}_onEnd(){this._parsing=!1,this.emit("done")}parseWARC(e){return this._parsing||(this._wp=e||this._wp),this.start()}}},function(e,t,r){const n=r(10).getStream,i=r(22),s=r(13),o=r(14);e.exports=class extends i{constructor(e){if(super(),this._wp=e,this._parsing=!1,this._onRecord=this._onRecord.bind(this),this._onError=this._onError.bind(this),this._onEnd=this._onEnd.bind(this),o){const e=r(15);this[Symbol.asyncIterator]=()=>e(n(this._wp))}}start(){let e=!1;if(!this._parsing){if(null==this._wp)throw new Error("The path to the WARC file is null/undefined");this._parsing=!0,e=!0,n(this._wp).pipe(new s).on("data",this._onRecord).on("error",this._onError).on("end",this._onEnd)}return e}_onRecord(e){this.emit("record",e)}_onError(e){this.emit("error",e)}_onEnd(){this._parsing=!1,this.emit("done")}parseWARC(e){return this._parsing||(this._wp=e||this._wp),this.start()}}},function(e,t,r){t.ElectronWARCWriter=r(94),t.RemoteChromeWARCWriter=r(126),t.PuppeteerCDPWARCGenerator=r(127),t.PuppeteerWARCGenerator=r(128),t.WARCWriterBase=r(8),t.CRIExtraWARCGenerator=r(158)},function(e,t,r){(function(t){const n=r(8),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(9),{getPostData:a,getResBody:u}=r(100);e.exports=class extends n{async generateWARC(e,t,r){const{warcOpts:n,winfo:i,metadata:s}=r;this.initWARC(n.warcPath,n),null!=i&&await this.writeWarcInfoRecord(i),r.pages&&await this.writeWebrecorderBookmarksInfoRecord(r.pages),null!=s&&await this.writeWarcMetadata(s.targetURI,s.content);for(let r of e.iterateRequests())try{await this.generateWarcEntry(r,t)}catch(e){console.error(e)}return new Promise(e=>{this.once("finished",e),this.end()})}async generateWarcEntry(e,r){if(0===e.url.indexOf("data:"))return;let n;if(e.postData)n=e.postData;else if(e.hasPostData)try{let i=await a(e.requestId,r);n=t.from(i.postData,"utf8")}catch(e){}if(e.canSerializeResponse()){let a,h=e.serializeResponseHeaders();if(e.getBody){let n=!1;try{let i=await u(e.requestId,r);a=i.base64Encoded?t.from(i.body,"base64"):t.from(i.body,"utf8")}catch(e){n=!0}h=n?h.replace(o,`Content-Length: 0${i}`):(h=h.replace(s,"")).replace(o,`Content-Length: ${t.byteLength(a,"utf8")}${i}`)}return this.writeRequestResponseRecords(e.url,{headers:e.serializeRequestHeaders(),data:n},{headers:h,data:a})}return this.writeRequestRecord(e.url,e.serializeRequestHeaders(),n)}}}).call(this,r(0).Buffer)},function(e,t,r){(function(e){function r(e,t){for(var r=0,n=e.length-1;n>=0;n--){var i=e[n];"."===i?e.splice(n,1):".."===i?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}var n=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,i=function(e){return n.exec(e).slice(1)};function s(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n=-1&&!n;i--){var o=i>=0?arguments[i]:e.cwd();if("string"!=typeof o)throw new TypeError("Arguments to path.resolve must be strings");o&&(t=o+"/"+t,n="/"===o.charAt(0))}return(n?"/":"")+(t=r(s(t.split("/"),function(e){return!!e}),!n).join("/"))||"."},t.normalize=function(e){var n=t.isAbsolute(e),i="/"===o(e,-1);return(e=r(s(e.split("/"),function(e){return!!e}),!n).join("/"))||n||(e="."),e&&i&&(e+="/"),(n?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(s(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},t.relative=function(e,r){function n(e){for(var t=0;t=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var i=n(e.split("/")),s=n(r.split("/")),o=Math.min(i.length,s.length),a=o,u=0;u>>((3&t)<<3)&255;return i}}},function(e,t){for(var r=[],n=0;n<256;++n)r[n]=(n+256).toString(16).substr(1);e.exports=function(e,t){var n=t||0,i=r;return[i[e[n++]],i[e[n++]],i[e[n++]],i[e[n++]],"-",i[e[n++]],i[e[n++]],"-",i[e[n++]],i[e[n++]],"-",i[e[n++]],i[e[n++]],"-",i[e[n++]],i[e[n++]],i[e[n++]],i[e[n++]],i[e[n++]],i[e[n++]]].join("")}},function(e,t){const r=/.*([.]warc)([.]gz)?/;e.exports=function(e,t=!1){if(null==e){throw new Error(`The supplied WARC filename was "${void 0===e?"undefined":"null"}", expecting a string`)}if("string"!=typeof e)throw new Error(`The supplied WARC filename was not a string it was "${typeof e}"`);const n=r.exec(e);if(!n)return`${e}.warc${t?".gz":""}`;if(!t&&null!=n[1]&&null==n[2])return e;if(t&&null!=n[1]&&null!=n[2])return e;const i=null!=n[1],s=null!=n[2];if(t){if(!i)return`${e}.warc.gz`;if(!s)return`${e}.gz`}else if(!i)return`${e}.warc`;return e}},function(e){e.exports={name:"node-warc",version:"3.3.1",description:"Parse And Write Web Archive Records (WARC) Files",main:"index.js",author:{name:"John Berlin",email:"n0tan3rd@gmail.com"},license:"MIT",repository:{type:"git",url:"https://github.com/N0taN3rd/node-warc.git"},bugs:{url:"https://github.com/N0taN3rd/node-warc/issues"},keywords:["warc","warc parsing","warc creation","web archiving","Electron","Chrome","puppeteer","request"],engines:{node:">=8.0.0"},scripts:{build:"webpack --mode production",lint:"standard | snazzy","fix-lint":"standard --fix",pretty:"prettier-standard lib/**/*.js",doc:"esdoc",test:"ava --verbose","test-report":"nyc ava --verbose","report-html":"nyc report --reporter=html","publish-docs":"gh-pages -d docs"},eslintConfig:{env:{node:!0}},dependencies:{eventemitter3:"^3.1.0","fs-extra":"^7.0.1",lodash:"^4.17.11",untildify:"^3.0.3",uuid:"^3.3.2",webpack:"^4.32.2"},devDependencies:{"@types/fs-extra":"^5.0.5","@types/node":"^11.9.5","@types/puppeteer":"^1.12.1",ava:"^1.2.1",chalk:"^2.4.2",esdoc:"^1.1.0","esdoc-ecmascript-proposal-plugin":"^1.0.0","esdoc-external-ecmascript-plugin":"^1.0.0","esdoc-inject-style-plugin":"^1.0.0","esdoc-node":"^1.0.4","esdoc-standard-plugin":"^1.0.0","gh-pages":"^2.0.1",microtime:"^3.0.0",nyc:"^13.3.0",perfy:"^1.1.5","prettier-standard":"^9.1.1","pretty-time":"^1.1.0",puppeteer:"^1.12.2",rxjs:"^6.4.0",snazzy:"^8.0.0",standard:"^12.0.1","webpack-cli":"^3.3.2"},ava:{files:["test/*.js"],sources:["lib/**/*"]},standard:{ignore:["test/**"]},resolutions:{"**/graceful-fs":"4.1.15","**/universalify":"0.1.2"}}},function(e,t,r){const n=r(101);e.exports={getResBody:function(e,t){return new Promise(r=>{t.sendCommand("Network.getResponseBody",{requestId:e},(e,t)=>{r(n(e)?t:null)})})},getPostData:function(e,t){return new Promise(r=>{t.sendCommand("Network.getRequestPostData",{requestId:e},(e,t)=>{r(n(e)?t:null)})})}}},function(e,t,r){var n=r(102),i=r(105),s=r(117),o=r(57),a=r(119),u=r(120),h=r(52),c=r(122),f="[object Map]",l="[object Set]",d=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(a(e)&&(o(e)||"string"==typeof e||"function"==typeof e.splice||u(e)||c(e)||s(e)))return!e.length;var t=i(e);if(t==f||t==l)return!e.size;if(h(e))return!n(e).length;for(var r in e)if(d.call(e,r))return!1;return!0}},function(e,t,r){var n=r(52),i=r(103),s=Object.prototype.hasOwnProperty;e.exports=function(e){if(!n(e))return i(e);var t=[];for(var r in Object(e))s.call(e,r)&&"constructor"!=r&&t.push(r);return t}},function(e,t,r){var n=r(104)(Object.keys,Object);e.exports=n},function(e,t){e.exports=function(e,t){return function(r){return e(t(r))}}},function(e,t,r){var n=r(106),i=r(113),s=r(114),o=r(115),a=r(116),u=r(17),h=r(56),c=h(n),f=h(i),l=h(s),d=h(o),p=h(a),_=u;(n&&"[object DataView]"!=_(new n(new ArrayBuffer(1)))||i&&"[object Map]"!=_(new i)||s&&"[object Promise]"!=_(s.resolve())||o&&"[object Set]"!=_(new o)||a&&"[object WeakMap]"!=_(new a))&&(_=function(e){var t=u(e),r="[object Object]"==t?e.constructor:void 0,n=r?h(r):"";if(n)switch(n){case c:return"[object DataView]";case f:return"[object Map]";case l:return"[object Promise]";case d:return"[object Set]";case p:return"[object WeakMap]"}return t}),e.exports=_},function(e,t,r){var n=r(16)(r(6),"DataView");e.exports=n},function(e,t,r){var n=r(53),i=r(110),s=r(55),o=r(56),a=/^\[object .+?Constructor\]$/,u=Function.prototype,h=Object.prototype,c=u.toString,f=h.hasOwnProperty,l=RegExp("^"+c.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!s(e)||i(e))&&(n(e)?l:a).test(o(e))}},function(e,t,r){var n=r(33),i=Object.prototype,s=i.hasOwnProperty,o=i.toString,a=n?n.toStringTag:void 0;e.exports=function(e){var t=s.call(e,a),r=e[a];try{e[a]=void 0;var n=!0}catch(e){}var i=o.call(e);return n&&(t?e[a]=r:delete e[a]),i}},function(e,t){var r=Object.prototype.toString;e.exports=function(e){return r.call(e)}},function(e,t,r){var n,i=r(111),s=(n=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";e.exports=function(e){return!!s&&s in e}},function(e,t,r){var n=r(6)["__core-js_shared__"];e.exports=n},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t,r){var n=r(16)(r(6),"Map");e.exports=n},function(e,t,r){var n=r(16)(r(6),"Promise");e.exports=n},function(e,t,r){var n=r(16)(r(6),"Set");e.exports=n},function(e,t,r){var n=r(16)(r(6),"WeakMap");e.exports=n},function(e,t,r){var n=r(118),i=r(23),s=Object.prototype,o=s.hasOwnProperty,a=s.propertyIsEnumerable,u=n(function(){return arguments}())?n:function(e){return i(e)&&o.call(e,"callee")&&!a.call(e,"callee")};e.exports=u},function(e,t,r){var n=r(17),i=r(23),s="[object Arguments]";e.exports=function(e){return i(e)&&n(e)==s}},function(e,t,r){var n=r(53),i=r(58);e.exports=function(e){return null!=e&&i(e.length)&&!n(e)}},function(e,t,r){(function(e){var n=r(6),i=r(121),s=t&&!t.nodeType&&t,o=s&&"object"==typeof e&&e&&!e.nodeType&&e,a=o&&o.exports===s?n.Buffer:void 0,u=(a?a.isBuffer:void 0)||i;e.exports=u}).call(this,r(34)(e))},function(e,t){e.exports=function(){return!1}},function(e,t,r){var n=r(123),i=r(124),s=r(125),o=s&&s.isTypedArray,a=o?i(o):n;e.exports=a},function(e,t,r){var n=r(17),i=r(58),s=r(23),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1,e.exports=function(e){return s(e)&&i(e.length)&&!!o[n(e)]}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,r){(function(e){var n=r(54),i=t&&!t.nodeType&&t,s=i&&"object"==typeof e&&e&&!e.nodeType&&e,o=s&&s.exports===i&&n.process,a=function(){try{var e=s&&s.require&&s.require("util").types;return e||o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=a}).call(this,r(34)(e))},function(e,t,r){(function(t){const n=r(8),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(9);e.exports=class extends n{async generateWARC(e,t,r){const{warcOpts:n,winfo:i,metadata:s}=r;this.initWARC(n.warcPath,n),null!=i&&await this.writeWarcInfoRecord(i),r.pages&&await this.writeWebrecorderBookmarksInfoRecord(r.pages),null!=s&&await this.writeWarcMetadata(s.targetURI,s.content);for(let r of e.iterateRequests())try{await this.generateWarcEntry(r,t)}catch(e){console.error(e)}return new Promise(e=>{this.once("finished",e),this.end()})}async generateWarcEntry(e,r){if(0===e.url.indexOf("data:"))return;let n;if(e.postData)n=e.postData;else if(e.hasPostData)try{let i=await r.getRequestPostData({requestId:e.requestId});n=t.from(i.postData,"utf8")}catch(e){}if(e.canSerializeResponse()){let a,u=e.serializeResponseHeaders();if(e.getBody){let n=!1;try{let i=await r.getResponseBody({requestId:e.requestId});a=i.base64Encoded?t.from(i.body,"base64"):t.from(i.body,"utf8")}catch(e){n=!0}u=n?u.replace(o,`Content-Length: 0${i}`):(u=u.replace(s,"")).replace(o,`Content-Length: ${t.byteLength(a,"utf8")}${i}`)}return this.writeRequestResponseRecords(e.url,{headers:e.serializeRequestHeaders(),data:n},{headers:u,data:a})}return this.writeRequestRecord(e.url,e.serializeRequestHeaders(),n)}}}).call(this,r(0).Buffer)},function(e,t,r){(function(t){const n=r(8),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(9);e.exports=class extends n{async generateWARC(e,t,r){const{winfo:n,metadata:i,warcOpts:s}=r;this.initWARC(s.warcPath,s),null!=n&&await this.writeWarcInfoRecord(n),r.pages&&await this.writeWebrecorderBookmarksInfoRecord(r.pages),null!=i&&await this.writeWarcMetadata(i.targetURI,i.content);for(let r of e.iterateRequests())try{await this.generateWarcEntry(r,t)}catch(e){console.error(e)}return new Promise(e=>{this.once("finished",e),this.end()})}async generateWarcEntry(e,r){if(0===e.url.indexOf("data:"))return;let n;if(e.postData)n=e.postData;else if(e.hasPostData)try{let i=await r.send("Network.getRequestPostData",{requestId:e.requestId});n=t.from(i.postData,"utf8")}catch(e){}if(e.canSerializeResponse()){let a,u=e.serializeResponseHeaders();if(e.getBody){let n=!1;try{let i=await r.send("Network.getResponseBody",{requestId:e.requestId});a=i.base64Encoded?t.from(i.body,"base64"):t.from(i.body,"utf8")}catch(e){n=!0}u=n?u.replace(o,`Content-Length: 0${i}`):(u=u.replace(s,"")).replace(o,`Content-Length: ${t.byteLength(a,"utf8")}${i}`)}return this.writeRequestResponseRecords(e.url,{headers:e.serializeRequestHeaders(),data:n},{headers:u,data:a})}return this.writeRequestRecord(e.url,e.serializeRequestHeaders(),n)}}}).call(this,r(0).Buffer)},function(e,t,r){(function(t){const{URL:n}=r(18),{STATUS_CODES:i}=r(35),{CRLF:s}=r(3),o=r(8),{stringifyHeaders:a,stringifyRequestHeaders:u}=r(36),{httpRequestPath:h}=r(62),{noGZ:c,replaceContentLen:f}=r(9);e.exports=class extends o{constructor(e){super(e),this._UP=new n("about:blank")}async generateWARC(e,t){const{warcOpts:r,winfo:n,metadata:i}=t;this.initWARC(r.warcPath,r),null!=n&&await this.writeWarcInfoRecord(n),t.pages&&await this.writeWebrecorderBookmarksInfoRecord(t.pages),null!=i&&await this.writeWarcMetadata(i.targetURI,i.content);for(let t of e.iterateRequests())try{await this.generateWarcEntry(t)}catch(e){console.error(e)}return new Promise(e=>{this.once("finished",e),this.end()})}async generateWarcEntry(e){if(0===e.url().indexOf("data:"))return;const r=e.response();this._UP.href=e.url();let n=`${e.method()} ${h(this._UP)} HTTP/1.1${s}${u(e.headers(),this._UP.host)}`;if(r){let o,u=`HTTP/1.1 ${r.status()} ${i[r.status()]} ${s}${a(r.headers())}`,h=!1;try{o=await r.buffer()}catch(e){h=!0}return u=h?u.replace(f,`Content-Length: 0${s}`):(u=u.replace(c,"")).replace(f,`Content-Length: ${t.byteLength(o,"utf8")}${s}`),this.writeRequestResponseRecords(this._UP.href,{headers:n,data:e.postData()},{headers:u,data:o})}return this.writeRequestRecord(this._UP.href,n,e.postData())}}}).call(this,r(0).Buffer)},function(e,t,r){(function(e,n){var i;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(s){t&&t.nodeType,e&&e.nodeType;var o="object"==typeof n&&n;o.global!==o&&o.window!==o&&o.self;var a,u=2147483647,h=36,c=1,f=26,l=38,d=700,p=72,_=128,g="-",m=/^xn--/,w=/[^\x20-\x7E]/,y=/[\x2E\u3002\uFF0E\uFF61]/g,b={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},v=h-c,R=Math.floor,x=String.fromCharCode;function E(e){throw new RangeError(b[e])}function k(e,t){for(var r=e.length,n=[];r--;)n[r]=t(e[r]);return n}function S(e,t){var r=e.split("@"),n="";return r.length>1&&(n=r[0]+"@",e=r[1]),n+k((e=e.replace(y,".")).split("."),t).join(".")}function A(e){for(var t,r,n=[],i=0,s=e.length;i=55296&&t<=56319&&i65535&&(t+=x((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=x(e)}).join("")}function C(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function O(e,t,r){var n=0;for(e=r?R(e/d):e>>1,e+=R(e/t);e>v*f>>1;n+=h)e=R(e/v);return R(n+(v+1)*e/(e+l))}function I(e){var t,r,n,i,s,o,a,l,d,m,w,y=[],b=e.length,v=0,x=_,k=p;for((r=e.lastIndexOf(g))<0&&(r=0),n=0;n=128&&E("not-basic"),y.push(e.charCodeAt(n));for(i=r>0?r+1:0;i=b&&E("invalid-input"),((l=(w=e.charCodeAt(i++))-48<10?w-22:w-65<26?w-65:w-97<26?w-97:h)>=h||l>R((u-v)/o))&&E("overflow"),v+=l*o,!(l<(d=a<=k?c:a>=k+f?f:a-k));a+=h)o>R(u/(m=h-d))&&E("overflow"),o*=m;k=O(v-s,t=y.length+1,0==s),R(v/t)>u-x&&E("overflow"),x+=R(v/t),v%=t,y.splice(v++,0,x)}return T(y)}function L(e){var t,r,n,i,s,o,a,l,d,m,w,y,b,v,k,S=[];for(y=(e=A(e)).length,t=_,r=0,s=p,o=0;o=t&&wR((u-r)/(b=n+1))&&E("overflow"),r+=(a-t)*b,t=a,o=0;ou&&E("overflow"),w==t){for(l=r,d=h;!(l<(m=d<=s?c:d>=s+f?f:d-s));d+=h)k=l-m,v=h-m,S.push(x(C(m+k%v,0))),l=R(k/v);S.push(x(C(l,0))),s=O(r,b,n==i),r=0,++n}++r,++t}return S.join("")}a={version:"1.4.1",ucs2:{decode:A,encode:T},decode:I,encode:L,toASCII:function(e){return S(e,function(e){return w.test(e)?"xn--"+L(e):e})},toUnicode:function(e){return S(e,function(e){return m.test(e)?I(e.slice(4).toLowerCase()):e})}},void 0===(i=function(){return a}.call(t,r,t,e))||(e.exports=i)}()}).call(this,r(34)(e),r(1))},function(e,t,r){"use strict";e.exports={isString:function(e){return"string"==typeof e},isObject:function(e){return"object"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t,r){"use strict";t.decode=t.parse=r(132),t.encode=t.stringify=r(133)},function(e,t,r){"use strict";function n(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,r,s){t=t||"&",r=r||"=";var o={};if("string"!=typeof e||0===e.length)return o;var a=/\+/g;e=e.split(t);var u=1e3;s&&"number"==typeof s.maxKeys&&(u=s.maxKeys);var h=e.length;u>0&&h>u&&(h=u);for(var c=0;c=0?(f=_.substr(0,g),l=_.substr(g+1)):(f=_,l=""),d=decodeURIComponent(f),p=decodeURIComponent(l),n(o,d)?i(o[d])?o[d].push(p):o[d]=[o[d],p]:o[d]=p}return o};var i=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},function(e,t,r){"use strict";var n=function(e){switch(typeof e){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}};e.exports=function(e,t,r,a){return t=t||"&",r=r||"=",null===e&&(e=void 0),"object"==typeof e?s(o(e),function(o){var a=encodeURIComponent(n(o))+r;return i(e[o])?s(e[o],function(e){return a+encodeURIComponent(n(e))}).join(t):a+encodeURIComponent(n(e[o]))}).join(t):a?encodeURIComponent(n(a))+r+encodeURIComponent(n(e)):""};var i=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};function s(e,t){if(e.map)return e.map(t);for(var r=[],n=0;n=i?e:n(e,t,r)}},function(e,t){e.exports=function(e,t,r){var n=-1,i=e.length;t<0&&(t=-t>i?0:i+t),(r=r>i?i:r)<0&&(r+=i),i=t>r?0:r-t>>>0,t>>>=0;for(var s=Array(i);++n{this.once("finished",e),this.end()})}async generateWarcEntry(e){const r=e.url();if(r.startsWith("data:"))return;const i=e.response();let a;if(e.postData())a=e.postData();else if(e.hasPostData())try{a=await e.getPostData()}catch(e){}const u=e.requestLineAndHeaders(!0);if(i){let e,h=i.statusLineAndHeaders(!0),c=!1;try{e=await i.buffer()}catch(e){c=!0}return h=c?h.replace(o,`Content-Length: 0${n}`):h.replace(s,"").replace(o,`Content-Length: ${t.byteLength(e,"utf8")}${n}`),this.writeRequestResponseRecords(r,{headers:u,data:a},{headers:h,data:e})}return this.writeRequestRecord(r,u,a)}}}).call(this,r(0).Buffer)},function(e,t,r){t.CDPRequestInfo=r(63),t.CRIExtraCapturer=r(160),t.CapturedRequest=r(64),t.ElectronCapturer=r(161),t.PuppeteerCDPCapturer=r(162),t.PuppeteerCapturer=r(163),t.RemoteChromeCapturer=r(164),t.RequestHandler=r(24)},function(e,t){e.exports=class{constructor(e,t="request"){this._capture=!0,this._requests=new Map,this._requestC=0,this.requestWillBeSent=this.requestWillBeSent.bind(this),e&&this.attach(e,t)}attach(e,t="request"){e.removeListener(t,this.requestWillBeSent),e.on(t,this.requestWillBeSent)}detach(e,t="request"){e.removeListener(t,this.requestWillBeSent)}startCapturing(){this._requestC=0,this._requests.clear(),this._capture=!0}stopCapturing(){this._capture=!1}[Symbol.iterator](){return this._requests.values()}clear(){this._requestC=0,this._requests.clear()}requests(){return Array.from(this._requests.values())}iterateRequests(){return this._requests.values()}requestWillBeSent(e){this._capture&&this._requests.set(this._requestC++,e)}}},function(e,t,r){const n=r(24);e.exports=class extends n{constructor(){super(),this.maybeNetworkMessage=this.maybeNetworkMessage.bind(this),this.attach=this.attach.bind(this),this.requestWillBeSent=this.requestWillBeSent.bind(this),this.responseReceived=this.responseReceived.bind(this)}attach(e){e.on("message",(e,t,r)=>{"Network.requestWillBeSent"===t?this.requestWillBeSent(r):"Network.responseReceived"===t&&this.responseReceived(r)})}maybeNetworkMessage(e,t){"Network.requestWillBeSent"===e?this.requestWillBeSent(t):"Network.responseReceived"===e&&this.responseReceived(t)}}},function(e,t,r){const n=r(24);e.exports=class extends n{constructor(e){super(),this.requestWillBeSent=this.requestWillBeSent.bind(this),this.responseReceived=this.responseReceived.bind(this),this.attach(e)}attach(e){e&&(e.on("Network.requestWillBeSent",this.requestWillBeSent),e.on("Network.responseReceived",this.responseReceived))}detach(e){e&&(e.removeListener("Network.requestWillBeSent",this.requestWillBeSent),e.removeListener("Network.responseReceived",this.responseReceived))}}},function(e,t){e.exports=class{constructor(e,t="request"){this._capture=!0,this._requests=new Map,this._requestC=0,this.requestWillBeSent=this.requestWillBeSent.bind(this),e&&this.attach(e,t)}attach(e,t="request"){e.removeListener(t,this.requestWillBeSent),e.on(t,this.requestWillBeSent)}detach(e,t="request"){e.removeListener(t,this.requestWillBeSent)}startCapturing(){this._requestC=0,this._requests.clear(),this._capture=!0}stopCapturing(){this._capture=!1}[Symbol.iterator](){return this._requests.values()}clear(){this._requestC=0,this._requests.clear()}requests(){return Array.from(this._requests.values())}iterateRequests(){return this._requests.values()}requestWillBeSent(e){this._capture&&this._requests.set(this._requestC++,e)}}},function(e,t,r){const n=r(24);e.exports=class extends n{constructor(e){super(),this.requestWillBeSent=this.requestWillBeSent.bind(this),this.responseReceived=this.responseReceived.bind(this),this.attach(e)}attach(e){e&&(e.requestWillBeSent(this.requestWillBeSent),e.responseReceived(this.responseReceived))}detach(e){e&&(e.removeListener("Network.requestWillBeSent",this.requestWillBeSent),e.removeListener("Network.responseReceived",this.responseReceived))}}},function(e,t,r){(function(t){const n=r(8),{STATUS_CODES:i}=r(35),{URL:s}=r(18),{CRLF:o}=r(3),{stringifyHeaders:a,stringifyRequestHeaders:u}=r(36),{noGZ:h,replaceContentLen:c}=r(9);e.exports=class extends n{constructor(e){super(e),this._UP=new s("about:blank")}async generateWarcEntry(e){let r="";this._UP.href=e.request.href,""!==this._UP.search?r+=`${e.request.method} ${this._UP.pathname}${this._UP.search[0]}${this._UP.searchParams} HTTP/1.1${o}`:r+=`${e.request.method} ${this._UP.pathname} HTTP/1.1${o}`,r+=u(e.request.headers,this._UP.host);const n="POST"===e.request.method?e.request.body:null;await this.writeRequestRecord(this._UP.href,r,n);let s=`HTTP/1.1 ${e.statusCode} ${i[e.statusCode]} ${o}${a(e.headers)}`,f=e.body;s=f?(s=s.replace(h,"")).replace(c,`Content-Length: ${t.byteLength(f,"utf8")}${o}`):s.replace(c,`Content-Length: 0${o}`),await this.writeResponseRecord(this._UP.href,s,f)}}}).call(this,r(0).Buffer)},function(e,t,r){"use strict";var n={};(0,r(5).assign)(n,r(167),r(168),r(30)),e.exports=n},function(e,t,r){"use strict";var n=r(46),i=r(5),s=r(65),o=r(29),a=r(28),u=Object.prototype.toString,h=0,c=-1,f=0,l=8;function d(e){if(!(this instanceof d))return new d(e);this.options=i.assign({level:c,method:l,chunkSize:16384,windowBits:15,memLevel:8,strategy:f,to:""},e||{});var t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new a,this.strm.avail_out=0;var r=n.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==h)throw new Error(o[r]);if(t.header&&n.deflateSetHeader(this.strm,t.header),t.dictionary){var p;if(p="string"==typeof t.dictionary?s.string2buf(t.dictionary):"[object ArrayBuffer]"===u.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,(r=n.deflateSetDictionary(this.strm,p))!==h)throw new Error(o[r]);this._dict_set=!0}}function p(e,t){var r=new d(t);if(r.push(e,!0),r.err)throw r.msg||o[r.err];return r.result}d.prototype.push=function(e,t){var r,o,a=this.strm,c=this.options.chunkSize;if(this.ended)return!1;o=t===~~t?t:!0===t?4:0,"string"==typeof e?a.input=s.string2buf(e):"[object ArrayBuffer]"===u.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;do{if(0===a.avail_out&&(a.output=new i.Buf8(c),a.next_out=0,a.avail_out=c),1!==(r=n.deflate(a,o))&&r!==h)return this.onEnd(r),this.ended=!0,!1;0!==a.avail_out&&(0!==a.avail_in||4!==o&&2!==o)||("string"===this.options.to?this.onData(s.buf2binstring(i.shrinkBuf(a.output,a.next_out))):this.onData(i.shrinkBuf(a.output,a.next_out)))}while((a.avail_in>0||0===a.avail_out)&&1!==r);return 4===o?(r=n.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===h):2!==o||(this.onEnd(h),a.avail_out=0,!0)},d.prototype.onData=function(e){this.chunks.push(e)},d.prototype.onEnd=function(e){e===h&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},t.Deflate=d,t.deflate=p,t.deflateRaw=function(e,t){return(t=t||{}).raw=!0,p(e,t)},t.gzip=function(e,t){return(t=t||{}).gzip=!0,p(e,t)}},function(e,t,r){"use strict";var n=r(49),i=r(5),s=r(65),o=r(30),a=r(29),u=r(28),h=r(169),c=Object.prototype.toString;function f(e){if(!(this instanceof f))return new f(e);this.options=i.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new u,this.strm.avail_out=0;var r=n.inflateInit2(this.strm,t.windowBits);if(r!==o.Z_OK)throw new Error(a[r]);if(this.header=new h,n.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=s.string2buf(t.dictionary):"[object ArrayBuffer]"===c.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(r=n.inflateSetDictionary(this.strm,t.dictionary))!==o.Z_OK))throw new Error(a[r])}function l(e,t){var r=new f(t);if(r.push(e,!0),r.err)throw r.msg||a[r.err];return r.result}f.prototype.push=function(e,t){var r,a,u,h,f,l=this.strm,d=this.options.chunkSize,p=this.options.dictionary,_=!1;if(this.ended)return!1;a=t===~~t?t:!0===t?o.Z_FINISH:o.Z_NO_FLUSH,"string"==typeof e?l.input=s.binstring2buf(e):"[object ArrayBuffer]"===c.call(e)?l.input=new Uint8Array(e):l.input=e,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new i.Buf8(d),l.next_out=0,l.avail_out=d),(r=n.inflate(l,o.Z_NO_FLUSH))===o.Z_NEED_DICT&&p&&(r=n.inflateSetDictionary(this.strm,p)),r===o.Z_BUF_ERROR&&!0===_&&(r=o.Z_OK,_=!1),r!==o.Z_STREAM_END&&r!==o.Z_OK)return this.onEnd(r),this.ended=!0,!1;l.next_out&&(0!==l.avail_out&&r!==o.Z_STREAM_END&&(0!==l.avail_in||a!==o.Z_FINISH&&a!==o.Z_SYNC_FLUSH)||("string"===this.options.to?(u=s.utf8border(l.output,l.next_out),h=l.next_out-u,f=s.buf2string(l.output,u),l.next_out=h,l.avail_out=d-h,h&&i.arraySet(l.output,l.output,u,h,0),this.onData(f)):this.onData(i.shrinkBuf(l.output,l.next_out)))),0===l.avail_in&&0===l.avail_out&&(_=!0)}while((l.avail_in>0||0===l.avail_out)&&r!==o.Z_STREAM_END);return r===o.Z_STREAM_END&&(a=o.Z_FINISH),a===o.Z_FINISH?(r=n.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===o.Z_OK):a!==o.Z_SYNC_FLUSH||(this.onEnd(o.Z_OK),l.avail_out=0,!0)},f.prototype.onData=function(e){this.chunks.push(e)},f.prototype.onEnd=function(e){e===o.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},t.Inflate=f,t.inflate=l,t.inflateRaw=function(e,t){return(t=t||{}).raw=!0,l(e,t)},t.ungzip=l},function(e,t,r){"use strict";e.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}}])); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dyaXRlcnMvd2FyY0ZpZWxkcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dyaXRlcnMvd2FyY1dyaXRlckJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dyaXRlcnMvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy9nZXRTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvd2FyY1N0cmVhbVRyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcGFyc2Vycy9fY2FuVXNlUmVjb3JkSXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvcmVjb3JkdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldFRhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXJsL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS16bGliL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL3JlcXVlc3RIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dhcmNSZWNvcmQvZmllbGRJZGVudGlmaWVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWxzL2hlYWRlclNlcmlhbGl6ZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1saWJzLWJyb3dzZXIvbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXNzZXJ0L2Fzc2VydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2RlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvYWRsZXIzMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL2d6aXBEZXRlY3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC92MS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvU291cmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL3Jlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWxzL3VybC1oZWxwZXJzLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2NkcFJlcXVlc3RJbmZvLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2NhcHR1cmVkUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcyIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcGFyc2Vycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcGFyc2Vycy9hdXRvV0FSQ1BhcnNlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2R1cGxleC1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vdHJhbnNmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktemxpYi9saWIvYmluZGluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIiwid2VicGFjazovLy8uL2xpYi93YXJjUmVjb3JkL2J1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dhcmNSZWNvcmQvcmVjb3JkLmpzIiwid2VicGFjazovLy8uL2xpYi93YXJjUmVjb3JkL3dhcmNDb250ZW50UGFyc2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcGFyc2Vycy93YXJjR3pQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvd2FyY1BhcnNlci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9lbGVjdHJvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGF0aC1icm93c2VyaWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2xpYi9ybmctYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9saWIvYnl0ZXNUb1V1aWQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWxzL2Vuc3VyZVdBUkNGaWxlbmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvZWxlY3Ryb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VtcHR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19XZWFrTWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9yZW1vdGVDaHJvbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dyaXRlcnMvcHVwcGV0ZWVyQ0RQLmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL3B1cHBldGVlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VybC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90by1hcnJheWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9idWlsdGluLXN0YXR1cy1jb2Rlcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc3RhcnRDYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUNvbXBvdW5kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJ1cnIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVidXJyTGV0dGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eU9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvd29yZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNjaWlXb3Jkcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlV29yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlV29yZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC91cHBlckZpcnN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUNhc2VGaXJzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0U2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNjaWlUb0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVUb0FycmF5LmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL2NyaUV4dHJhLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2NyaUV4dHJhLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2VsZWN0cm9uLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL3B1cHBldGVlckNEUC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcmVxdWVzdENhcHR1cmVycy9wdXBwZXRlZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3JlcXVlc3RDYXB0dXJlcnMvcmVtb3RlQ2hyb21lLmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL3JlcXVlc3RMaWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJnbG9iYWwiLCJiYXNlNjQiLCJpZWVlNzU0IiwiaXNBcnJheSIsImtNYXhMZW5ndGgiLCJCdWZmZXIiLCJUWVBFRF9BUlJBWV9TVVBQT1JUIiwiY3JlYXRlQnVmZmVyIiwidGhhdCIsImxlbmd0aCIsIlJhbmdlRXJyb3IiLCJVaW50OEFycmF5IiwiX19wcm90b19fIiwiYXJnIiwiZW5jb2RpbmdPck9mZnNldCIsInRoaXMiLCJFcnJvciIsImFsbG9jVW5zYWZlIiwiZnJvbSIsIlR5cGVFcnJvciIsIkFycmF5QnVmZmVyIiwiYXJyYXkiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInVuZGVmaW5lZCIsImZyb21BcnJheUxpa2UiLCJmcm9tQXJyYXlCdWZmZXIiLCJzdHJpbmciLCJlbmNvZGluZyIsImlzRW5jb2RpbmciLCJhY3R1YWwiLCJ3cml0ZSIsInNsaWNlIiwiZnJvbVN0cmluZyIsIm9iaiIsImlzQnVmZmVyIiwibGVuIiwiY2hlY2tlZCIsImNvcHkiLCJidWZmZXIiLCJ2YWwiLCJ0eXBlIiwiZGF0YSIsImZyb21PYmplY3QiLCJhc3NlcnRTaXplIiwic2l6ZSIsInRvU3RyaW5nIiwiaXNWaWV3IiwibG93ZXJlZENhc2UiLCJ1dGY4VG9CeXRlcyIsImJhc2U2NFRvQnl0ZXMiLCJ0b0xvd2VyQ2FzZSIsInN3YXAiLCJiIiwiYmlkaXJlY3Rpb25hbEluZGV4T2YiLCJkaXIiLCJpc05hTiIsImFycmF5SW5kZXhPZiIsImluZGV4T2YiLCJsYXN0SW5kZXhPZiIsImFyciIsImluZGV4U2l6ZSIsImFyckxlbmd0aCIsInZhbExlbmd0aCIsIlN0cmluZyIsInJlYWQiLCJidWYiLCJyZWFkVUludDE2QkUiLCJmb3VuZEluZGV4IiwiZm91bmQiLCJqIiwiaGV4V3JpdGUiLCJvZmZzZXQiLCJOdW1iZXIiLCJyZW1haW5pbmciLCJzdHJMZW4iLCJwYXJzZWQiLCJwYXJzZUludCIsInN1YnN0ciIsInV0ZjhXcml0ZSIsImJsaXRCdWZmZXIiLCJhc2NpaVdyaXRlIiwic3RyIiwiYnl0ZUFycmF5IiwicHVzaCIsImNoYXJDb2RlQXQiLCJhc2NpaVRvQnl0ZXMiLCJsYXRpbjFXcml0ZSIsImJhc2U2NFdyaXRlIiwidWNzMldyaXRlIiwidW5pdHMiLCJoaSIsImxvIiwidXRmMTZsZVRvQnl0ZXMiLCJiYXNlNjRTbGljZSIsInN0YXJ0IiwiZW5kIiwiZnJvbUJ5dGVBcnJheSIsInV0ZjhTbGljZSIsIk1hdGgiLCJtaW4iLCJyZXMiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJmaXJzdEJ5dGUiLCJjb2RlUG9pbnQiLCJieXRlc1BlclNlcXVlbmNlIiwiY29kZVBvaW50cyIsIk1BWF9BUkdVTUVOVFNfTEVOR1RIIiwiZnJvbUNoYXJDb2RlIiwiYXBwbHkiLCJkZWNvZGVDb2RlUG9pbnRzQXJyYXkiLCJTbG93QnVmZmVyIiwiYWxsb2MiLCJJTlNQRUNUX01BWF9CWVRFUyIsImZvbyIsInN1YmFycmF5IiwiZSIsInR5cGVkQXJyYXlTdXBwb3J0IiwicG9vbFNpemUiLCJfYXVnbWVudCIsInNwZWNpZXMiLCJjb25maWd1cmFibGUiLCJmaWxsIiwiYWxsb2NVbnNhZmVTbG93IiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsImEiLCJ4IiwieSIsImNvbmNhdCIsImxpc3QiLCJwb3MiLCJzd2FwMTYiLCJzd2FwMzIiLCJzd2FwNjQiLCJhcmd1bWVudHMiLCJoZXhTbGljZSIsImFzY2lpU2xpY2UiLCJsYXRpbjFTbGljZSIsInV0ZjE2bGVTbGljZSIsImVxdWFscyIsImluc3BlY3QiLCJtYXgiLCJtYXRjaCIsImpvaW4iLCJ0YXJnZXQiLCJ0aGlzU3RhcnQiLCJ0aGlzRW5kIiwidGhpc0NvcHkiLCJ0YXJnZXRDb3B5IiwiaW5jbHVkZXMiLCJpc0Zpbml0ZSIsInRvSlNPTiIsIkFycmF5IiwiX2FyciIsInJldCIsIm91dCIsInRvSGV4IiwiYnl0ZXMiLCJjaGVja09mZnNldCIsImV4dCIsImNoZWNrSW50Iiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJvYmplY3RXcml0ZVVJbnQzMiIsImNoZWNrSUVFRTc1NCIsIndyaXRlRmxvYXQiLCJub0Fzc2VydCIsIndyaXRlRG91YmxlIiwibmV3QnVmIiwic2xpY2VMZW4iLCJyZWFkVUludExFIiwibXVsIiwicmVhZFVJbnRCRSIsInJlYWRVSW50OCIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRJbnRMRSIsInBvdyIsInJlYWRJbnRCRSIsInJlYWRJbnQ4IiwicmVhZEludDE2TEUiLCJyZWFkSW50MTZCRSIsInJlYWRJbnQzMkxFIiwicmVhZEludDMyQkUiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwid3JpdGVVSW50TEUiLCJ3cml0ZVVJbnRCRSIsIndyaXRlVUludDgiLCJmbG9vciIsIndyaXRlVUludDE2TEUiLCJ3cml0ZVVJbnQxNkJFIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDMyQkUiLCJ3cml0ZUludExFIiwibGltaXQiLCJzdWIiLCJ3cml0ZUludEJFIiwid3JpdGVJbnQ4Iiwid3JpdGVJbnQxNkxFIiwid3JpdGVJbnQxNkJFIiwid3JpdGVJbnQzMkxFIiwid3JpdGVJbnQzMkJFIiwid3JpdGVGbG9hdExFIiwid3JpdGVGbG9hdEJFIiwid3JpdGVEb3VibGVMRSIsIndyaXRlRG91YmxlQkUiLCJ0YXJnZXRTdGFydCIsInNldCIsImNvZGUiLCJJTlZBTElEX0JBU0U2NF9SRSIsIkluZmluaXR5IiwibGVhZFN1cnJvZ2F0ZSIsInRvQnl0ZUFycmF5IiwidHJpbSIsInJlcGxhY2UiLCJzdHJpbmd0cmltIiwiYmFzZTY0Y2xlYW4iLCJzcmMiLCJkc3QiLCJnIiwiRnVuY3Rpb24iLCJ3aW5kb3ciLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwicHJvY2VzcyIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImRyYWluUXVldWUiLCJ0aW1lb3V0IiwicnVuIiwibWFya2VyIiwicnVuQ2xlYXJUaW1lb3V0IiwiSXRlbSIsIm5vb3AiLCJuZXh0VGljayIsImFyZ3MiLCJ0aXRsZSIsImJyb3dzZXIiLCJlbnYiLCJhcmd2IiwidmVyc2lvbiIsInZlcnNpb25zIiwib24iLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwidW1hc2siLCJDUkxGIiwiV0FSQ1YiLCJXQVJDU2xhc2hWIiwiV0FSQ1R5cGVzIiwid2FyY2luZm8iLCJtZXRhZGF0YSIsInJlcXVlc3QiLCJyZXNwb25zZSIsInJldmlzaXQiLCJyZXNvdXJjZSIsImNvbnZlcnNpb24iLCJ1bmtub3duIiwiY29udGludWF0aW9uIiwiV0FSQ0NvbnRlbnRUeXBlcyIsIndhcmNGaWVsZHMiLCJodHRwUmVxdWVzdCIsImh0dHBSZXNwb25zZSIsInJlY29yZElkIiwidXVpZCIsIndhcmNEYXRlIiwiZGF0ZSIsIndhcmNUeXBlIiwid2FyY0NvbnRlbnRMZW5ndGgiLCJjb250ZW50TGVuIiwid2FyY0NvbmN1cnJlbnRUbyIsImNvbmN1cnJlbnRUbyIsIndhcmNXYXJjSW5mb0lkIiwid2lkIiwicmVxdWlyZWRIZWFkZXJGaWVsZHMiLCJyaWQiLCJ0YXJnZXRVUkkiLCJ3YXJjVGFyZ2V0VVJJIiwid2FyY0luZm9IZWFkZXIiLCJpbmZvSGVhZGVyIiwicmVxdWlyZWQiLCJmaWxlTmFtZSIsIndhcmNJbmZvQ29udGVudCIsImluZm9Db250ZW50IiwiYmFzZSIsIndhcmNSZXF1ZXN0SGVhZGVyIiwibm93Iiwid2FyY1Jlc3BvbnNlSGVhZGVyIiwid2FyY01ldGFkYXRhSGVhZGVyIiwicmVjb3JkU2VwYXJhdG9yIiwiQ1JMRjJ4IiwiY3RvciIsInN1cGVyQ3RvciIsInN1cGVyXyIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJUZW1wQ3RvciIsIlRZUEVEX09LIiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiX2hhcyIsImFzc2lnbiIsInNvdXJjZXMiLCJzb3VyY2UiLCJzaGlmdCIsInNocmlua0J1ZiIsImZuVHlwZWQiLCJhcnJheVNldCIsImRlc3QiLCJzcmNfb2ZmcyIsImRlc3Rfb2ZmcyIsImZsYXR0ZW5DaHVua3MiLCJjaHVua3MiLCJjaHVuayIsInJlc3VsdCIsImZuVW50eXBlZCIsInNldFR5cGVkIiwiQnVmOCIsIkJ1ZjE2IiwiQnVmMzIiLCJmcmVlR2xvYmFsIiwiZnJlZVNlbGYiLCJzZWxmIiwicm9vdCIsInBuYSIsIm9iamVjdEtleXMiLCJrZXlzIiwiRHVwbGV4IiwidXRpbCIsImluaGVyaXRzIiwiUmVhZGFibGUiLCJXcml0YWJsZSIsInYiLCJtZXRob2QiLCJvcHRpb25zIiwicmVhZGFibGUiLCJhbGxvd0hhbGZPcGVuIiwib25lbmQiLCJfd3JpdGFibGVTdGF0ZSIsImVuZGVkIiwib25FbmROVCIsImhpZ2hXYXRlck1hcmsiLCJfcmVhZGFibGVTdGF0ZSIsImRlc3Ryb3llZCIsIl9kZXN0cm95IiwiZXJyIiwiY2IiLCJmcyIsInpsaWIiLCJQYXRoIiwiRXZlbnRFbWl0dGVyIiwiZW5zdXJlV0FSQ0ZpbGVOYW1lIiwicmVjb3JkU2VwYXJhdG9yQnVmZmVyIiwiQ1JMRkJ1ZmZlciIsIldBUkNTZXBUU2l6ZSIsIm1ha2VDb250ZW50QnVmZmVyIiwibWF5YmVCdWZmZXIiLCJzdHJCdWZmIiwiZW5kc1dpdGgiLCJjbnRCdWZmZXIiLCJlbnN1cmVPcHRpb25zIiwib3B0cyIsImFwcGVuZGluZyIsImd6aXAiLCJOT0RFV0FSQ19XUklURV9HWklQUEVEIiwiW29iamVjdCBPYmplY3RdIiwiZGVmYXVsdE9wdHMiLCJzdXBlciIsIl93YXJjT3V0U3RyZWFtIiwiX2xhc3RFcnJvciIsIl9ub3ciLCJfZmlsZU5hbWUiLCJfd2FyY0luZm9JZCIsIl92ZXJzaW9uIiwiX29uRmluaXNoIiwiX29uRXJyb3IiLCJ3YXJjUGF0aCIsIndmcCIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiZmxhZ3MiLCJEYXRlIiwidG9JU09TdHJpbmciLCJiYXNlbmFtZSIsInJlcURhdGEiLCJyZXNEYXRhIiwicmVzUmVjSWQiLCJfd3JpdGVSZXF1ZXN0UmVjb3JkIiwiaGVhZGVycyIsIl93cml0ZVJlc3BvbnNlUmVjb3JkIiwicmVjb3JkUGFydHMiLCJ3cml0ZVJlY29yZEJsb2NrIiwid2luZm8iLCJ3cml0ZVdhcmNSYXdJbmZvUmVjb3JkIiwic29mdHdhcmUiLCJyZWNJRCIsIndoY3QiLCJ3aCIsInRvdGFsTGVuZ3RoIiwicGFnZXMiLCJ3aW5mb0NvbnRlbnQiLCJqc29uLW1ldGFkYXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsImRlc2MiLCJhdXRvX3RpdGxlIiwibWFwIiwicGFnZSIsInRpbWVzdGFtcCIsInVybCIsIm91dGxpbmtzIiwid3JpdGVXYXJjTWV0YWRhdGEiLCJtZXRhRGF0YSIsIndtaGMiLCJ3bWgiLCJodHRwSGVhZGVyU3RyaW5nIiwicmVxdWVzdERhdGEiLCJyZXNwb25zZURhdGEiLCJyZWNvcmRCdWZmZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImd6aXBTeW5jIiwicmVzSWQiLCJyZXFIZWFkQ29udGVudEJ1ZmZlciIsInJlcVdIZWFkZXIiLCJyZXNIZWFkZXJDb250ZW50QnVmZmVyIiwicmVzcFdIZWFkZXIiLCJsZSIsImRlc3Ryb3kiLCJub0daIiwicmVwbGFjZUNvbnRlbnRMZW4iLCJ1bnRpbGRpZnkiLCJoYXNGUyIsImdldFN0cmVhbSIsIndwIiwidXNlVW50aWxkaWZ5IiwiY3JlYXRlUmVhZFN0cmVhbSIsIlN0cmVhbSIsIlRyYW5zZm9ybSIsIlBhc3NUaHJvdWdoIiwib2JqZWN0VG9TdHJpbmciLCJpc0Jvb2xlYW4iLCJpc051bGwiLCJpc051bGxPclVuZGVmaW5lZCIsImlzTnVtYmVyIiwiaXNTdHJpbmciLCJpc1N5bWJvbCIsImlzVW5kZWZpbmVkIiwiaXNSZWdFeHAiLCJyZSIsImlzT2JqZWN0IiwiaXNEYXRlIiwiaXNFcnJvciIsImlzRnVuY3Rpb24iLCJpc1ByaW1pdGl2ZSIsIlJlY29yZEJ1aWxkZXIiLCJjcmxmIiwicmVhZGFibGVPYmplY3RNb2RlIiwiYnVmZmVyZWQiLCJidWlsZGVyIiwic2VwTGVuIiwiZG9uZSIsInB1c2hMYXN0IiwiaWR4IiwibWF5YmVSZWNvcmQiLCJsYXN0TWF0Y2giLCJjaHVua0xlbiIsImNvbnN1bWVMaW5lIiwiYnVpbGRSZWNvcmQiLCJlbmMiLCJfY29uc3VtZUNodW5rIiwiYXN5bmNHZW5GbnMiLCJlcnJvciIsImFzeW5jSXRlcmF0b3IiLCJXQVJDU3RyZWFtVHJhbnNmb3JtIiwiYXN5bmMiLCJ3YXJjU3RyZWFtIiwicmVjb3JkSXRlcmF0b3IiLCJwaXBlIiwibmV4dFJlY29yZCIsIm5leHQiLCJiYXNlSXNOYXRpdmUiLCJnZXRWYWx1ZSIsImdldFJhd1RhZyIsIm51bGxUYWciLCJ1bmRlZmluZWRUYWciLCJzeW1Ub1N0cmluZ1RhZyIsInB1bnljb2RlIiwiVXJsIiwicHJvdG9jb2wiLCJzbGFzaGVzIiwiYXV0aCIsImhvc3QiLCJwb3J0IiwiaG9zdG5hbWUiLCJoYXNoIiwic2VhcmNoIiwicXVlcnkiLCJwYXRobmFtZSIsInBhdGgiLCJocmVmIiwicGFyc2UiLCJ1cmxQYXJzZSIsInJlbGF0aXZlIiwicmVzb2x2ZU9iamVjdCIsImZvcm1hdCIsInByb3RvY29sUGF0dGVybiIsInBvcnRQYXR0ZXJuIiwic2ltcGxlUGF0aFBhdHRlcm4iLCJ1bndpc2UiLCJhdXRvRXNjYXBlIiwibm9uSG9zdENoYXJzIiwiaG9zdEVuZGluZ0NoYXJzIiwiaG9zdG5hbWVQYXJ0UGF0dGVybiIsImhvc3RuYW1lUGFydFN0YXJ0IiwidW5zYWZlUHJvdG9jb2wiLCJqYXZhc2NyaXB0IiwiamF2YXNjcmlwdDoiLCJob3N0bGVzc1Byb3RvY29sIiwic2xhc2hlZFByb3RvY29sIiwiaHR0cCIsImh0dHBzIiwiZnRwIiwiZ29waGVyIiwiZmlsZSIsImh0dHA6IiwiaHR0cHM6IiwiZnRwOiIsImdvcGhlcjoiLCJmaWxlOiIsInF1ZXJ5c3RyaW5nIiwicGFyc2VRdWVyeVN0cmluZyIsInNsYXNoZXNEZW5vdGVIb3N0IiwidSIsInF1ZXJ5SW5kZXgiLCJzcGxpdHRlciIsInVTcGxpdCIsInNwbGl0IiwicmVzdCIsInNpbXBsZVBhdGgiLCJleGVjIiwicHJvdG8iLCJsb3dlclByb3RvIiwiYXRTaWduIiwiaG9zdEVuZCIsImhlYyIsImRlY29kZVVSSUNvbXBvbmVudCIsInBhcnNlSG9zdCIsImlwdjZIb3N0bmFtZSIsImhvc3RwYXJ0cyIsInBhcnQiLCJuZXdwYXJ0IiwiayIsInZhbGlkUGFydHMiLCJub3RIb3N0IiwiYml0IiwidW5zaGlmdCIsInRvQVNDSUkiLCJoIiwiYWUiLCJlc2MiLCJlbmNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJxbSIsImNoYXJBdCIsInJlbCIsInRrZXlzIiwidGsiLCJ0a2V5IiwicmtleXMiLCJyayIsInJrZXkiLCJyZWxQYXRoIiwiaXNTb3VyY2VBYnMiLCJpc1JlbEFicyIsIm11c3RFbmRBYnMiLCJyZW1vdmVBbGxEb3RzIiwic3JjUGF0aCIsInBzeWNob3RpYyIsInBvcCIsImF1dGhJbkhvc3QiLCJsYXN0IiwiaGFzVHJhaWxpbmdTbGFzaCIsInVwIiwic3BsaWNlIiwiaXNBYnNvbHV0ZSIsImFzc2VydCIsIm9rIiwia1JhbmdlRXJyb3JNZXNzYWdlIiwiWl9NSU5fV0lORE9XQklUUyIsIlpfTUFYX1dJTkRPV0JJVFMiLCJaX0RFRkFVTFRfV0lORE9XQklUUyIsIlpfTUlOX0NIVU5LIiwiWl9NQVhfQ0hVTksiLCJaX0RFRkFVTFRfQ0hVTksiLCJaX01JTl9NRU1MRVZFTCIsIlpfTUFYX01FTUxFVkVMIiwiWl9ERUZBVUxUX01FTUxFVkVMIiwiWl9NSU5fTEVWRUwiLCJaX01BWF9MRVZFTCIsIlpfREVGQVVMVF9MRVZFTCIsIlpfREVGQVVMVF9DT01QUkVTU0lPTiIsImJrZXlzIiwiYmsiLCJia2V5IiwiY29kZXMiLCJaX09LIiwiWl9TVFJFQU1fRU5EIiwiWl9ORUVEX0RJQ1QiLCJaX0VSUk5PIiwiWl9TVFJFQU1fRVJST1IiLCJaX0RBVEFfRVJST1IiLCJaX01FTV9FUlJPUiIsIlpfQlVGX0VSUk9SIiwiWl9WRVJTSU9OX0VSUk9SIiwiY2tleXMiLCJjayIsImNrZXkiLCJ6bGliQnVmZmVyIiwiZW5naW5lIiwiY2FsbGJhY2siLCJidWZmZXJzIiwibnJlYWQiLCJmbG93Iiwib25FbmQiLCJjbG9zZSIsInpsaWJCdWZmZXJTeW5jIiwiZmx1c2hGbGFnIiwiX2ZpbmlzaEZsdXNoRmxhZyIsIl9wcm9jZXNzQ2h1bmsiLCJEZWZsYXRlIiwiWmxpYiIsIkRFRkxBVEUiLCJJbmZsYXRlIiwiSU5GTEFURSIsIkd6aXAiLCJHWklQIiwiR3VuemlwIiwiR1VOWklQIiwiRGVmbGF0ZVJhdyIsIkRFRkxBVEVSQVciLCJJbmZsYXRlUmF3IiwiSU5GTEFURVJBVyIsIlVuemlwIiwiVU5aSVAiLCJpc1ZhbGlkRmx1c2hGbGFnIiwiZmxhZyIsIlpfTk9fRkxVU0giLCJaX1BBUlRJQUxfRkxVU0giLCJaX1NZTkNfRkxVU0giLCJaX0ZVTExfRkxVU0giLCJaX0ZJTklTSCIsIlpfQkxPQ0siLCJfdGhpcyIsIl9vcHRzIiwiX2NodW5rU2l6ZSIsImNodW5rU2l6ZSIsImZsdXNoIiwiZmluaXNoRmx1c2giLCJfZmx1c2hGbGFnIiwid2luZG93Qml0cyIsImxldmVsIiwibWVtTGV2ZWwiLCJzdHJhdGVneSIsIlpfRklMVEVSRUQiLCJaX0hVRkZNQU5fT05MWSIsIlpfUkxFIiwiWl9GSVhFRCIsIlpfREVGQVVMVF9TVFJBVEVHWSIsImRpY3Rpb25hcnkiLCJfaGFuZGxlIiwiX2hhZEVycm9yIiwib25lcnJvciIsIm1lc3NhZ2UiLCJlcnJubyIsIl9jbG9zZSIsImluaXQiLCJfYnVmZmVyIiwiX29mZnNldCIsIl9sZXZlbCIsIl9zdHJhdGVneSIsImVtaXRDbG9zZU5UIiwiZnJlZXplIiwiY3JlYXRlRGVmbGF0ZSIsImNyZWF0ZUluZmxhdGUiLCJjcmVhdGVEZWZsYXRlUmF3IiwiY3JlYXRlSW5mbGF0ZVJhdyIsImNyZWF0ZUd6aXAiLCJjcmVhdGVHdW56aXAiLCJjcmVhdGVVbnppcCIsImRlZmxhdGUiLCJkZWZsYXRlU3luYyIsImRlZmxhdGVSYXciLCJkZWZsYXRlUmF3U3luYyIsInVuemlwIiwidW56aXBTeW5jIiwiaW5mbGF0ZSIsImluZmxhdGVTeW5jIiwiZ3VuemlwIiwiZ3VuemlwU3luYyIsImluZmxhdGVSYXciLCJpbmZsYXRlUmF3U3luYyIsInBhcmFtcyIsInJlc2V0IiwiX2ZsdXNoIiwiX3RyYW5zZm9ybSIsImtpbmQiLCJfdGhpczIiLCJ3cyIsImVuZGluZyIsIm5lZWREcmFpbiIsImF2YWlsSW5CZWZvcmUiLCJhdmFpbE91dEJlZm9yZSIsImluT2ZmIiwiZXIiLCJ3cml0ZVN5bmMiLCJyZXEiLCJhdmFpbEluQWZ0ZXIiLCJhdmFpbE91dEFmdGVyIiwiaGF2ZSIsIm5ld1JlcSIsImZuIiwiYXJnMSIsImFyZzIiLCJhcmczIiwiY29weVByb3BzIiwiU2FmZUJ1ZmZlciIsImhhcyIsInByZWZpeCIsIkV2ZW50cyIsIkVFIiwiY29udGV4dCIsImVtaXR0ZXIiLCJldmVudCIsImxpc3RlbmVyIiwiZXZ0IiwiX2V2ZW50cyIsIl9ldmVudHNDb3VudCIsImNsZWFyRXZlbnQiLCJldmVudE5hbWVzIiwiZXZlbnRzIiwibmFtZXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJoYW5kbGVycyIsImVlIiwibGlzdGVuZXJDb3VudCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJwcmVmaXhlZCIsIkNhcHR1cmVkUmVxdWVzdCIsIl9jYXB0dXJlIiwiX3JlcXVlc3RzIiwiTWFwIiwiY2xlYXIiLCJpbmZvIiwicmVxdWVzdElkIiwiYWRkUmVxdWVzdEluZm8iLCJpdGVyYXRvciIsImVudHJpZXMiLCJ2YWx1ZXMiLCJpdGVyYXRlZSIsInRoaXNBcmciLCJmb3JFYWNoIiwiY3IiLCJyaSIsIm9uZGF0YSIsInBhdXNlIiwib25kcmFpbiIsInJlc3VtZSIsIl9pc1N0ZGlvIiwib25jbG9zZSIsImRpZE9uRW5kIiwiY2xlYW51cCIsIlJlZmxlY3RPd25LZXlzIiwiUiIsIlJlZmxlY3QiLCJSZWZsZWN0QXBwbHkiLCJyZWNlaXZlciIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiTnVtYmVySXNOYU4iLCJfbWF4TGlzdGVuZXJzIiwiZGVmYXVsdE1heExpc3RlbmVycyIsIiRnZXRNYXhMaXN0ZW5lcnMiLCJfYWRkTGlzdGVuZXIiLCJwcmVwZW5kIiwiZXhpc3RpbmciLCJ3YXJuaW5nIiwibmV3TGlzdGVuZXIiLCJ3YXJuZWQiLCJ3IiwiY291bnQiLCJjb25zb2xlIiwid2FybiIsIl9vbmNlV3JhcCIsInN0YXRlIiwiZmlyZWQiLCJ3cmFwRm4iLCJ3cmFwcGVkIiwiX2xpc3RlbmVycyIsInVud3JhcCIsImV2bGlzdGVuZXIiLCJ1bndyYXBMaXN0ZW5lcnMiLCJhcnJheUNsb25lIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJkb0Vycm9yIiwiaGFuZGxlciIsInBvc2l0aW9uIiwib3JpZ2luYWxMaXN0ZW5lciIsImluZGV4Iiwic3BsaWNlT25lIiwicmF3TGlzdGVuZXJzIiwic2V0SW1tZWRpYXRlIiwiQ29ya2VkUmVxdWVzdCIsImVudHJ5IiwiZmluaXNoIiwiY29ya1JlcSIsInBlbmRpbmdjYiIsImNvcmtlZFJlcXVlc3RzRnJlZSIsIm9uQ29ya2VkRmluaXNoIiwiYXN5bmNXcml0ZSIsIldyaXRhYmxlU3RhdGUiLCJpbnRlcm5hbFV0aWwiLCJkZXByZWNhdGUiLCJPdXJVaW50OEFycmF5IiwicmVhbEhhc0luc3RhbmNlIiwiZGVzdHJveUltcGwiLCJub3AiLCJzdHJlYW0iLCJpc0R1cGxleCIsIm9iamVjdE1vZGUiLCJ3cml0YWJsZU9iamVjdE1vZGUiLCJod20iLCJ3cml0YWJsZUh3bSIsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsImRlZmF1bHRId20iLCJmaW5hbENhbGxlZCIsImZpbmlzaGVkIiwibm9EZWNvZGUiLCJkZWNvZGVTdHJpbmdzIiwiZGVmYXVsdEVuY29kaW5nIiwid3JpdGluZyIsImNvcmtlZCIsInN5bmMiLCJidWZmZXJQcm9jZXNzaW5nIiwib253cml0ZSIsIndyaXRlY2IiLCJ3cml0ZWxlbiIsIm9ud3JpdGVTdGF0ZVVwZGF0ZSIsImZpbmlzaE1heWJlIiwiZXJyb3JFbWl0dGVkIiwib253cml0ZUVycm9yIiwibmVlZEZpbmlzaCIsImJ1ZmZlcmVkUmVxdWVzdCIsImNsZWFyQnVmZmVyIiwiYWZ0ZXJXcml0ZSIsImxhc3RCdWZmZXJlZFJlcXVlc3QiLCJwcmVmaW5pc2hlZCIsImJ1ZmZlcmVkUmVxdWVzdENvdW50IiwiX3dyaXRlIiwid3JpdGV2IiwiX3dyaXRldiIsImZpbmFsIiwiX2ZpbmFsIiwiZG9Xcml0ZSIsIm9ud3JpdGVEcmFpbiIsImhvbGRlciIsImFsbEJ1ZmZlcnMiLCJpc0J1ZiIsImNhbGxGaW5hbCIsIm5lZWQiLCJwcmVmaW5pc2giLCJnZXRCdWZmZXIiLCJjdXJyZW50IiwiXyIsImhhc0luc3RhbmNlIiwiX3VpbnQ4QXJyYXlUb0J1ZmZlciIsIndyaXRlQWZ0ZXJFbmQiLCJ2YWxpZCIsInZhbGlkQ2h1bmsiLCJuZXdDaHVuayIsImRlY29kZUNodW5rIiwid3JpdGVPckJ1ZmZlciIsImNvcmsiLCJ1bmNvcmsiLCJzZXREZWZhdWx0RW5jb2RpbmciLCJlbmRXcml0YWJsZSIsIl91bmRlc3Ryb3kiLCJ1bmRlc3Ryb3kiLCJpbnB1dCIsIm5leHRfaW4iLCJhdmFpbF9pbiIsInRvdGFsX2luIiwib3V0cHV0IiwibmV4dF9vdXQiLCJhdmFpbF9vdXQiLCJ0b3RhbF9vdXQiLCJtc2ciLCJkYXRhX3R5cGUiLCJhZGxlciIsIjIiLCIxIiwiMCIsIi0xIiwiLTIiLCItMyIsIi00IiwiLTUiLCItNiIsIlpfVFJFRVMiLCJaX05PX0NPTVBSRVNTSU9OIiwiWl9CRVNUX1NQRUVEIiwiWl9CRVNUX0NPTVBSRVNTSU9OIiwiWl9CSU5BUlkiLCJaX1RFWFQiLCJaX1VOS05PV04iLCJaX0RFRkxBVEVEIiwiY2FuUmVwbGF5UHJvdG9jb2xzIiwiU2V0IiwiU1BBQ0UiLCJIMk1ldGhvZCIsIkgycGF0aCIsIkhUVFAxRDEiLCJEQVNIIiwiYmVnaW4iLCJtZGF0YSIsImVtcHR5Iiwid2VicGFja1BvbHlmaWxsIiwicGF0aHMiLCJjaGlsZHJlbiIsIkNsaWVudFJlcXVlc3QiLCJleHRlbmQiLCJzdGF0dXNDb2RlcyIsImRlZmF1bHRQcm90b2NvbCIsImxvY2F0aW9uIiwidG9VcHBlckNhc2UiLCJJbmNvbWluZ01lc3NhZ2UiLCJBZ2VudCIsImRlZmF1bHRNYXhTb2NrZXRzIiwiZ2xvYmFsQWdlbnQiLCJTVEFUVVNfQ09ERVMiLCJNRVRIT0RTIiwic3RhcnRDYXNlIiwiU1BBQ0VSZSIsImVuc3VyZUhUVFAySGVhZGVycyIsImhlYWRlcktleSIsInN0cmluZ2lmeUhlYWRlcnMiLCJvdXRTdHJpbmciLCJzdHJpbmdpZnlSZXF1ZXN0SGVhZGVycyIsImhhc0hvc3QiLCJiYXNlVG9TdHJpbmciLCJSZWFkYWJsZVN0YXRlIiwiRUVsaXN0ZW5lckNvdW50IiwiZGVidWdVdGlsIiwiZGVidWciLCJkZWJ1Z2xvZyIsIlN0cmluZ0RlY29kZXIiLCJCdWZmZXJMaXN0Iiwia1Byb3h5RXZlbnRzIiwicmVhZGFibGVId20iLCJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLCJwaXBlcyIsInBpcGVzQ291bnQiLCJmbG93aW5nIiwiZW5kRW1pdHRlZCIsInJlYWRpbmciLCJuZWVkUmVhZGFibGUiLCJlbWl0dGVkUmVhZGFibGUiLCJyZWFkYWJsZUxpc3RlbmluZyIsInJlc3VtZVNjaGVkdWxlZCIsImF3YWl0RHJhaW4iLCJyZWFkaW5nTW9yZSIsImRlY29kZXIiLCJfcmVhZCIsInJlYWRhYmxlQWRkQ2h1bmsiLCJhZGRUb0Zyb250Iiwic2tpcENodW5rQ2hlY2siLCJlbWl0UmVhZGFibGUiLCJvbkVvZkNodW5rIiwiY2h1bmtJbnZhbGlkIiwiYWRkQ2h1bmsiLCJtYXliZVJlYWRNb3JlIiwibmVlZE1vcmVEYXRhIiwiaXNQYXVzZWQiLCJzZXRFbmNvZGluZyIsIk1BWF9IV00iLCJob3dNdWNoVG9SZWFkIiwiaGVhZCIsImNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrIiwiZW1pdFJlYWRhYmxlXyIsIm1heWJlUmVhZE1vcmVfIiwiblJlYWRpbmdOZXh0VGljayIsInJlc3VtZV8iLCJmcm9tTGlzdCIsImhhc1N0cmluZ3MiLCJuYiIsInRhaWwiLCJjb3B5RnJvbUJ1ZmZlclN0cmluZyIsImNvcHlGcm9tQnVmZmVyIiwiZnJvbUxpc3RQYXJ0aWFsIiwiZW5kUmVhZGFibGUiLCJlbmRSZWFkYWJsZU5UIiwieHMiLCJuT3JpZyIsImRvUmVhZCIsInBpcGVPcHRzIiwiZW5kRm4iLCJzdGRvdXQiLCJzdGRlcnIiLCJ1bnBpcGUiLCJvbnVucGlwZSIsInVucGlwZUluZm8iLCJoYXNVbnBpcGVkIiwib25maW5pc2giLCJjbGVhbmVkVXAiLCJwaXBlT25EcmFpbiIsImluY3JlYXNlZEF3YWl0RHJhaW4iLCJkZXN0cyIsImV2Iiwid3JhcCIsInBhdXNlZCIsIl9mcm9tTGlzdCIsImVtaXRFcnJvck5UIiwicmVhZGFibGVEZXN0cm95ZWQiLCJ3cml0YWJsZURlc3Ryb3llZCIsIm5lbmMiLCJyZXRyaWVkIiwiX25vcm1hbGl6ZUVuY29kaW5nIiwibm9ybWFsaXplRW5jb2RpbmciLCJ0ZXh0IiwidXRmMTZUZXh0IiwidXRmMTZFbmQiLCJmaWxsTGFzdCIsInV0ZjhGaWxsTGFzdCIsImJhc2U2NFRleHQiLCJiYXNlNjRFbmQiLCJzaW1wbGVXcml0ZSIsInNpbXBsZUVuZCIsImxhc3ROZWVkIiwibGFzdFRvdGFsIiwibGFzdENoYXIiLCJ1dGY4Q2hlY2tCeXRlIiwiYnl0ZSIsInV0ZjhDaGVja0V4dHJhQnl0ZXMiLCJ0b3RhbCIsInV0ZjhDaGVja0luY29tcGxldGUiLCJhZnRlclRyYW5zZm9ybSIsInRzIiwiX3RyYW5zZm9ybVN0YXRlIiwidHJhbnNmb3JtaW5nIiwid3JpdGVjaHVuayIsInJzIiwibmVlZFRyYW5zZm9ybSIsIndyaXRlZW5jb2RpbmciLCJ0cmFuc2Zvcm0iLCJlcnIyIiwib2JqZWN0QXNzaWduIiwiaGFzT3duIiwicFNsaWNlIiwiZnVuY3Rpb25zSGF2ZU5hbWVzIiwicFRvU3RyaW5nIiwiYXJyYnVmIiwiRGF0YVZpZXciLCJyZWdleCIsImdldE5hbWUiLCJmdW5jIiwidHJ1bmNhdGUiLCJzb21ldGhpbmciLCJyYXduYW1lIiwiZmFpbCIsImV4cGVjdGVkIiwib3BlcmF0b3IiLCJzdGFja1N0YXJ0RnVuY3Rpb24iLCJBc3NlcnRpb25FcnJvciIsIl9kZWVwRXF1YWwiLCJzdHJpY3QiLCJtZW1vcyIsImdldFRpbWUiLCJtdWx0aWxpbmUiLCJsYXN0SW5kZXgiLCJpZ25vcmVDYXNlIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiYWN0dWFsSW5kZXgiLCJhY3R1YWxWaXNpdGVkT2JqZWN0cyIsImFJc0FyZ3MiLCJpc0FyZ3VtZW50cyIsImJJc0FyZ3MiLCJrYSIsImtiIiwic29ydCIsIm9iakVxdWl2IiwiZXhwZWN0ZWRFeGNlcHRpb24iLCJ0ZXN0IiwiaXNQcm90b3R5cGVPZiIsIl90aHJvd3MiLCJzaG91bGRUaHJvdyIsImJsb2NrIiwiX3RyeUJsb2NrIiwidXNlclByb3ZpZGVkTWVzc2FnZSIsImlzVW5leHBlY3RlZEV4Y2VwdGlvbiIsImdlbmVyYXRlZE1lc3NhZ2UiLCJnZXRNZXNzYWdlIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJzdGFjayIsImZuX25hbWUiLCJuZXh0X2xpbmUiLCJzdWJzdHJpbmciLCJlcXVhbCIsIm5vdEVxdWFsIiwiZGVlcEVxdWFsIiwiZGVlcFN0cmljdEVxdWFsIiwibm90RGVlcEVxdWFsIiwibm90RGVlcFN0cmljdEVxdWFsIiwic3RyaWN0RXF1YWwiLCJub3RTdHJpY3RFcXVhbCIsInRocm93cyIsImRvZXNOb3RUaHJvdyIsImlmRXJyb3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVzY3JpcHRvcnMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJmb3JtYXRSZWdFeHAiLCJmIiwib2JqZWN0cyIsIm5vRGVwcmVjYXRpb24iLCJ0aHJvd0RlcHJlY2F0aW9uIiwidHJhY2VEZXByZWNhdGlvbiIsInRyYWNlIiwiZGVidWdFbnZpcm9uIiwiZGVidWdzIiwiY3R4Iiwic2VlbiIsInN0eWxpemUiLCJzdHlsaXplTm9Db2xvciIsImRlcHRoIiwiY29sb3JzIiwic2hvd0hpZGRlbiIsIl9leHRlbmQiLCJjdXN0b21JbnNwZWN0Iiwic3R5bGl6ZVdpdGhDb2xvciIsImZvcm1hdFZhbHVlIiwic3R5bGVUeXBlIiwic3R5bGUiLCJzdHlsZXMiLCJyZWN1cnNlVGltZXMiLCJwcmltaXRpdmUiLCJzaW1wbGUiLCJmb3JtYXRQcmltaXRpdmUiLCJ2aXNpYmxlS2V5cyIsImFycmF5VG9IYXNoIiwiZm9ybWF0RXJyb3IiLCJSZWdFeHAiLCJicmFjZXMiLCJ0b1VUQ1N0cmluZyIsImZvcm1hdFByb3BlcnR5IiwiZm9ybWF0QXJyYXkiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyIiwibnVtTGluZXNFc3QiLCJyZWR1Y2VUb1NpbmdsZVN0cmluZyIsImxpbmUiLCJhciIsInBhZCIsIk5PREVfREVCVUciLCJwaWQiLCJib2xkIiwiaXRhbGljIiwidW5kZXJsaW5lIiwiaW52ZXJzZSIsIndoaXRlIiwiZ3JleSIsImJsYWNrIiwiYmx1ZSIsImN5YW4iLCJncmVlbiIsIm1hZ2VudGEiLCJyZWQiLCJ5ZWxsb3ciLCJzcGVjaWFsIiwibnVtYmVyIiwiYm9vbGVhbiIsIm51bGwiLCJyZWdleHAiLCJtb250aHMiLCJwcm9wIiwibG9nIiwidGltZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJvcmlnaW4iLCJhZGQiLCJrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wiLCJjYWxsYmFja2lmeU9uUmVqZWN0ZWQiLCJyZWFzb24iLCJuZXdSZWFzb24iLCJwcm9taXNpZnkiLCJvcmlnaW5hbCIsInByb21pc2VSZXNvbHZlIiwicHJvbWlzZVJlamVjdCIsInByb21pc2UiLCJzZXRQcm90b3R5cGVPZiIsImRlZmluZVByb3BlcnRpZXMiLCJjdXN0b20iLCJjYWxsYmFja2lmeSIsImNhbGxiYWNraWZpZWQiLCJtYXliZUNiIiwidGhlbiIsInJlaiIsImNvbmZpZ3VyYXRpb25fdGFibGUiLCJ1dGlscyIsInRyZWVzIiwiYWRsZXIzMiIsImNyYzMyIiwiTUFYX01FTV9MRVZFTCIsIk1BWF9XQklUUyIsIkRFRl9NRU1fTEVWRUwiLCJMX0NPREVTIiwiTElURVJBTFMiLCJEX0NPREVTIiwiQkxfQ09ERVMiLCJIRUFQX1NJWkUiLCJNQVhfQklUUyIsIk1JTl9NQVRDSCIsIk1BWF9NQVRDSCIsIk1JTl9MT09LQUhFQUQiLCJQUkVTRVRfRElDVCIsIklOSVRfU1RBVEUiLCJFWFRSQV9TVEFURSIsIk5BTUVfU1RBVEUiLCJDT01NRU5UX1NUQVRFIiwiSENSQ19TVEFURSIsIkJVU1lfU1RBVEUiLCJGSU5JU0hfU1RBVEUiLCJCU19ORUVEX01PUkUiLCJCU19CTE9DS19ET05FIiwiQlNfRklOSVNIX1NUQVJURUQiLCJCU19GSU5JU0hfRE9ORSIsIk9TX0NPREUiLCJzdHJtIiwiZXJyb3JDb2RlIiwicmFuayIsInplcm8iLCJmbHVzaF9wZW5kaW5nIiwicGVuZGluZyIsInBlbmRpbmdfYnVmIiwicGVuZGluZ19vdXQiLCJmbHVzaF9ibG9ja19vbmx5IiwiX3RyX2ZsdXNoX2Jsb2NrIiwiYmxvY2tfc3RhcnQiLCJzdHJzdGFydCIsInB1dF9ieXRlIiwicHV0U2hvcnRNU0IiLCJsb25nZXN0X21hdGNoIiwiY3VyX21hdGNoIiwiY2hhaW5fbGVuZ3RoIiwibWF4X2NoYWluX2xlbmd0aCIsInNjYW4iLCJiZXN0X2xlbiIsInByZXZfbGVuZ3RoIiwibmljZV9tYXRjaCIsIndfc2l6ZSIsIl93aW4iLCJ3bWFzayIsIndfbWFzayIsInN0cmVuZCIsInNjYW5fZW5kMSIsInNjYW5fZW5kIiwiZ29vZF9tYXRjaCIsImxvb2thaGVhZCIsIm1hdGNoX3N0YXJ0IiwiZmlsbF93aW5kb3ciLCJtb3JlIiwiX3dfc2l6ZSIsIndpbmRvd19zaXplIiwiaGFzaF9zaXplIiwiaW5zZXJ0IiwiaW5zX2giLCJoYXNoX3NoaWZ0IiwiaGFzaF9tYXNrIiwiZGVmbGF0ZV9mYXN0IiwiaGFzaF9oZWFkIiwiYmZsdXNoIiwibWF0Y2hfbGVuZ3RoIiwiX3RyX3RhbGx5IiwibWF4X2xhenlfbWF0Y2giLCJsYXN0X2xpdCIsImRlZmxhdGVfc2xvdyIsIm1heF9pbnNlcnQiLCJwcmV2X21hdGNoIiwibWF0Y2hfYXZhaWxhYmxlIiwiQ29uZmlnIiwiZ29vZF9sZW5ndGgiLCJtYXhfbGF6eSIsIm5pY2VfbGVuZ3RoIiwibWF4X2NoYWluIiwiRGVmbGF0ZVN0YXRlIiwic3RhdHVzIiwicGVuZGluZ19idWZfc2l6ZSIsImd6aGVhZCIsImd6aW5kZXgiLCJsYXN0X2ZsdXNoIiwid19iaXRzIiwiaGFzaF9iaXRzIiwiZHluX2x0cmVlIiwiZHluX2R0cmVlIiwiYmxfdHJlZSIsImxfZGVzYyIsImRfZGVzYyIsImJsX2Rlc2MiLCJibF9jb3VudCIsImhlYXAiLCJoZWFwX2xlbiIsImhlYXBfbWF4IiwibF9idWYiLCJsaXRfYnVmc2l6ZSIsImRfYnVmIiwib3B0X2xlbiIsInN0YXRpY19sZW4iLCJtYXRjaGVzIiwiYmlfYnVmIiwiYmlfdmFsaWQiLCJkZWZsYXRlUmVzZXRLZWVwIiwiX3RyX2luaXQiLCJkZWZsYXRlUmVzZXQiLCJkZWZsYXRlSW5pdDIiLCJtYXhfYmxvY2tfc2l6ZSIsIm1heF9zdGFydCIsImRlZmxhdGVJbml0IiwiZGVmbGF0ZVNldEhlYWRlciIsIm9sZF9mbHVzaCIsImJlZyIsImhjcmMiLCJleHRyYSIsImNvbW1lbnQiLCJvcyIsImhlYWRlciIsImJzdGF0ZSIsImRlZmxhdGVfaHVmZiIsImRlZmxhdGVfcmxlIiwiX3RyX2FsaWduIiwiX3RyX3N0b3JlZF9ibG9jayIsImRlZmxhdGVFbmQiLCJkZWZsYXRlU2V0RGljdGlvbmFyeSIsImF2YWlsIiwidG1wRGljdCIsImRpY3RMZW5ndGgiLCJkZWZsYXRlSW5mbyIsInMxIiwiczIiLCJjcmNUYWJsZSIsInRhYmxlIiwibWFrZVRhYmxlIiwiY3JjIiwiaW5mbGF0ZV9mYXN0IiwiaW5mbGF0ZV90YWJsZSIsIkNPREVTIiwiTEVOUyIsIkRJU1RTIiwiSEVBRCIsIkZMQUdTIiwiVElNRSIsIk9TIiwiRVhMRU4iLCJFWFRSQSIsIk5BTUUiLCJDT01NRU5UIiwiSENSQyIsIkRJQ1RJRCIsIkRJQ1QiLCJUWVBFIiwiVFlQRURPIiwiU1RPUkVEIiwiQ09QWV8iLCJDT1BZIiwiVEFCTEUiLCJMRU5MRU5TIiwiQ09ERUxFTlMiLCJMRU5fIiwiTEVOIiwiTEVORVhUIiwiRElTVCIsIkRJU1RFWFQiLCJNQVRDSCIsIkxJVCIsIkNIRUNLIiwiTEVOR1RIIiwiRE9ORSIsIkJBRCIsIk1FTSIsIlNZTkMiLCJFTk9VR0hfTEVOUyIsIkVOT1VHSF9ESVNUUyIsIkRFRl9XQklUUyIsInpzd2FwMzIiLCJxIiwiSW5mbGF0ZVN0YXRlIiwiaGF2ZWRpY3QiLCJkbWF4IiwiY2hlY2siLCJ3Yml0cyIsIndzaXplIiwid2hhdmUiLCJ3bmV4dCIsImhvbGQiLCJiaXRzIiwibGVuY29kZSIsImRpc3Rjb2RlIiwibGVuYml0cyIsImRpc3RiaXRzIiwibmNvZGUiLCJubGVuIiwibmRpc3QiLCJsZW5zIiwid29yayIsImxlbmR5biIsImRpc3RkeW4iLCJzYW5lIiwiYmFjayIsIndhcyIsImluZmxhdGVSZXNldEtlZXAiLCJpbmZsYXRlUmVzZXQiLCJpbmZsYXRlUmVzZXQyIiwiaW5mbGF0ZUluaXQyIiwibGVuZml4IiwiZGlzdGZpeCIsInZpcmdpbiIsImZpeGVkdGFibGVzIiwic3ltIiwidXBkYXRld2luZG93IiwiZGlzdCIsImluZmxhdGVJbml0IiwicHV0IiwibGVmdCIsIl9pbiIsIl9vdXQiLCJmcm9tX3NvdXJjZSIsImhlcmVfYml0cyIsImhlcmVfb3AiLCJoZXJlX3ZhbCIsImxhc3RfYml0cyIsImxhc3Rfb3AiLCJsYXN0X3ZhbCIsImhlcmUiLCJoYnVmIiwib3JkZXIiLCJpbmZfbGVhdmUiLCJ4ZmxhZ3MiLCJleHRyYV9sZW4iLCJpbmZsYXRlRW5kIiwiaW5mbGF0ZUdldEhlYWRlciIsImluZmxhdGVTZXREaWN0aW9uYXJ5IiwiaW5mbGF0ZUluZm8iLCJncyIsImd6aXBNYWdpY051bSIsImd6aXBNYWdpY051bUxlbiIsImZpbGVQYXRoIiwiZmQiLCJvcGVuIiwiZmlsbE1lIiwiaXNHemlwcGVkIiwib3BlblN5bmMiLCJyZWFkU3luYyIsImNsb3NlU3luYyIsIl9ub2RlSWQiLCJfY2xvY2tzZXEiLCJybmciLCJieXRlc1RvVXVpZCIsIl9sYXN0TVNlY3MiLCJfbGFzdE5TZWNzIiwibm9kZSIsImNsb2Nrc2VxIiwic2VlZEJ5dGVzIiwibXNlY3MiLCJuc2VjcyIsImR0IiwidGwiLCJ0bWgiLCJvYmplY3RQcm90byIsIkN0b3IiLCJiYXNlR2V0VGFnIiwiYXN5bmNUYWciLCJmdW5jVGFnIiwiZ2VuVGFnIiwicHJveHlUYWciLCJ0YWciLCJmdW5jVG9TdHJpbmciLCJNQVhfU0FGRV9JTlRFR0VSIiwiZmV0Y2giLCJSZWFkYWJsZVN0cmVhbSIsIndyaXRhYmxlU3RyZWFtIiwiV3JpdGFibGVTdHJlYW0iLCJhYm9ydENvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJibG9iQ29uc3RydWN0b3IiLCJCbG9iIiwieGhyIiwiZ2V0WEhSIiwiWE1MSHR0cFJlcXVlc3QiLCJYRG9tYWluUmVxdWVzdCIsImNoZWNrVHlwZVN1cHBvcnQiLCJyZXNwb25zZVR5cGUiLCJoYXZlQXJyYXlCdWZmZXIiLCJoYXZlU2xpY2UiLCJhcnJheWJ1ZmZlciIsIm1zc3RyZWFtIiwibW96Y2h1bmtlZGFycmF5YnVmZmVyIiwib3ZlcnJpZGVNaW1lVHlwZSIsInZiQXJyYXkiLCJWQkFycmF5IiwiY2FwYWJpbGl0eSIsInJTdGF0ZXMiLCJyZWFkeVN0YXRlcyIsIlVOU0VOVCIsIk9QRU5FRCIsIkhFQURFUlNfUkVDRUlWRUQiLCJMT0FESU5HIiwiZmV0Y2hUaW1lciIsIl9tb2RlIiwicmF3SGVhZGVycyIsInRyYWlsZXJzIiwicmF3VHJhaWxlcnMiLCJfZmV0Y2hSZXNwb25zZSIsInN0YXR1c0NvZGUiLCJzdGF0dXNNZXNzYWdlIiwic3RhdHVzVGV4dCIsIl9kZXN0cm95ZWQiLCJfcmVzdW1lRmV0Y2giLCJhYm9ydCIsImJvZHkiLCJwaXBlVG8iLCJjYXRjaCIsInJlYWRlciIsImdldFJlYWRlciIsIl94aHIiLCJfcG9zIiwicmVzcG9uc2VVUkwiLCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiLCJfY2hhcnNldCIsIm1pbWVUeXBlIiwiY2hhcnNldE1hdGNoIiwiX29uWEhSUHJvZ3Jlc3MiLCJyZWFkeVN0YXRlIiwicmVzcG9uc2VCb2R5IiwidG9BcnJheSIsInJlc3BvbnNlVGV4dCIsIm5ld0RhdGEiLCJNU1N0cmVhbVJlYWRlciIsIm9ucHJvZ3Jlc3MiLCJvbmxvYWQiLCJyZWFkQXNBcnJheUJ1ZmZlciIsInJlSGFzVW5pY29kZSIsIlVSTCIsImh0dHBSZXF1ZXN0UGF0aCIsInNlYXJjaFBhcmFtcyIsIkhlYWRlclRyYWlsZXJzIiwiQ0RQUmVxdWVzdEluZm8iLCJfdXJsIiwidXJsRnJhZ21lbnQiLCJwb3N0RGF0YSIsInJlcXVlc3RIZWFkZXJzIiwicmVxdWVzdEhlYWRlcnNfIiwicmVxdWVzdEhlYWRlcnNUZXh0IiwicmVzcG9uc2VIZWFkZXJzIiwicmVzcG9uc2VIZWFkZXJzVGV4dCIsImdldEJvZHkiLCJoYXNQb3N0RGF0YSIsInJlZGlyQ1IiLCJyZWRpcmVjdFJlc3BvbnNlIiwiaGVhZGVyc1RleHQiLCJub3QzeHgiLCJmY3JsZmlkeCIsImZsaW5lIiwiX2NoZWNrTWV0aG9kIiwiX2Vuc3VyZVByb3RvIiwicHVybCIsImdldFBhcnNlZFVSTCIsIl9nZXRSZXFIZWFkZXJPYmoiLCJIb3N0IiwiX3NlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzVGV4dCIsIl9zZXJpYWxpemVSZXF1ZXN0SGVhZGVyc09iaiIsImdvb2QiLCJtYXliZU1ldGgiLCJfbWV0aFByb3RvRnJvbVJlcUhlYWRUZXh0IiwiaHR0cFN0cmluZyIsImh0dHBTdHJpbmdQYXJ0cyIsIl9jb3JyZWN0UHJvdG9jb2wiLCJvcmlnaW5hbFByb3RvY29sIiwibmV3UHJvdG9jb2wiLCJpc1JlcSIsImlzUmVkaXIiLCJpc1JlcyIsImRldGVybWluUmVxdWVzdFR5cGUiLCJfcmVxcyIsInJ0IiwiZnJvbVJlZGlyIiwiZnJvbVJlcXVlc3QiLCJmcm9tUmVzcG9uc2UiLCJhZGRSZXNwb25zZSIsInVybHMiLCJTVFJfQVBQTFlfT0siLCJTVFJfQVBQTFlfVUlBX09LIiwiX18iLCJfdXRmOGxlbiIsImJ1ZjJiaW5zdHJpbmciLCJzdHJpbmcyYnVmIiwiYzIiLCJtX3BvcyIsInN0cl9sZW4iLCJidWZfbGVuIiwiYmluc3RyaW5nMmJ1ZiIsImJ1ZjJzdHJpbmciLCJjX2xlbiIsInV0ZjE2YnVmIiwidXRmOGJvcmRlciIsIkF1dG9XQVJDUGFyc2VyIiwiV0FSQ0d6UGFyc2VyIiwiV0FSQ1BhcnNlciIsIkNSSUV4dHJhV0FSQ0dlbmVyYXRvciIsIkVsZWN0cm9uV0FSQ1dyaXRlciIsIlB1cHBldGVlckNEUFdBUkNHZW5lcmF0b3IiLCJQdXBwZXRlZXJXQVJDR2VuZXJhdG9yIiwiUmVtb3RlQ2hyb21lV0FSQ1dyaXRlciIsIldBUkNXcml0ZXJCYXNlIiwiQ1JJRXh0cmFDYXB0dXJlciIsIkVsZWN0cm9uQ2FwdHVyZXIiLCJQdXBwZXRlZXJDYXB0dXJlciIsIlB1cHBldGVlckNEUENhcHR1cmVyIiwiUmVtb3RlQ2hyb21lQ2FwdHVyZXIiLCJSZXF1ZXN0SGFuZGxlciIsIlJlcXVlc3RMaWJXQVJDV3JpdGVyIiwicGFrbyIsIkd6aXBEZXRlY3RvciIsImNhblVzZVJlY29yZEl0ZXJhdG9yIiwiX3dwIiwiX3BhcnNpbmciLCJfb25SZWNvcmQiLCJfb25FbmQiLCJfZ2V0U3RyZWFtIiwic3RhcnRlZFBhcnNpbmciLCJyZWNvcmQiLCJpc0d6IiwiaXNHemlwcGVkU3luYyIsImI2NCIsImdldExlbnMiLCJ2YWxpZExlbiIsInBsYWNlSG9sZGVyc0xlbiIsInRtcCIsIkFyciIsIl9ieXRlTGVuZ3RoIiwiY3VyQnl0ZSIsInJldkxvb2t1cCIsInVpbnQ4IiwiZXh0cmFCeXRlcyIsInBhcnRzIiwibGVuMiIsImVuY29kZUNodW5rIiwibG9va3VwIiwibnVtIiwiaXNMRSIsIm1MZW4iLCJuQnl0ZXMiLCJlTGVuIiwiZU1heCIsImVCaWFzIiwibkJpdHMiLCJOYU4iLCJhYnMiLCJMTjIiLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiX2NsYXNzQ2FsbENoZWNrIiwic2NvcGUiLCJUaW1lb3V0IiwiaWQiLCJjbGVhckZuIiwiX2lkIiwiX2NsZWFyRm4iLCJzZXRJbnRlcnZhbCIsImNsZWFySW50ZXJ2YWwiLCJ1bnJlZiIsInJlZiIsImVucm9sbCIsIml0ZW0iLCJfaWRsZVRpbWVvdXRJZCIsIl9pZGxlVGltZW91dCIsInVuZW5yb2xsIiwiX3VucmVmQWN0aXZlIiwiYWN0aXZlIiwiX29uVGltZW91dCIsImNsZWFySW1tZWRpYXRlIiwicmVnaXN0ZXJJbW1lZGlhdGUiLCJodG1sIiwiY2hhbm5lbCIsIm1lc3NhZ2VQcmVmaXgiLCJvbkdsb2JhbE1lc3NhZ2UiLCJuZXh0SGFuZGxlIiwidGFza3NCeUhhbmRsZSIsImN1cnJlbnRseVJ1bm5pbmdBVGFzayIsImRvYyIsImRvY3VtZW50IiwiYXR0YWNoVG8iLCJoYW5kbGUiLCJydW5JZlByZXNlbnQiLCJwb3N0TWVzc2FnZSIsImltcG9ydFNjcmlwdHMiLCJwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzIiwib2xkT25NZXNzYWdlIiwib25tZXNzYWdlIiwiY2FuVXNlUG9zdE1lc3NhZ2UiLCJNZXNzYWdlQ2hhbm5lbCIsInBvcnQxIiwicG9ydDIiLCJjcmVhdGVFbGVtZW50IiwiZG9jdW1lbnRFbGVtZW50Iiwic2NyaXB0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsInJhbmRvbSIsImFkZEV2ZW50TGlzdGVuZXIiLCJhdHRhY2hFdmVudCIsInRhc2siLCJjb25maWciLCJsb2NhbFN0b3JhZ2UiLCJac3RyZWFtIiwiemxpYl9kZWZsYXRlIiwiemxpYl9pbmZsYXRlIiwiY29uc3RhbnRzIiwiTk9ORSIsImluaXRfZG9uZSIsIndyaXRlX2luX3Byb2dyZXNzIiwicGVuZGluZ19jbG9zZSIsImd6aXBfaWRfYnl0ZXNfcmVhZCIsImluX29mZiIsImluX2xlbiIsIm91dF9vZmYiLCJvdXRfbGVuIiwiX3Byb2Nlc3MiLCJfY2hlY2tFcnJvciIsIl9hZnRlclN5bmMiLCJfYWZ0ZXIiLCJuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlIiwiX2Vycm9yIiwiX2luaXQiLCJfc2V0RGljdGlvbmFyeSIsIl9yZXNldCIsInByb3BJc0VudW1lcmFibGUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRlc3QxIiwidGVzdDIiLCJ0ZXN0MyIsImxldHRlciIsInNob3VsZFVzZU5hdGl2ZSIsInN5bWJvbHMiLCJ0byIsInRvT2JqZWN0IiwiU1RPUkVEX0JMT0NLIiwiU1RBVElDX1RSRUVTIiwiRFlOX1RSRUVTIiwiTEVOR1RIX0NPREVTIiwiQnVmX3NpemUiLCJNQVhfQkxfQklUUyIsIkVORF9CTE9DSyIsIlJFUF8zXzYiLCJSRVBaXzNfMTAiLCJSRVBaXzExXzEzOCIsImV4dHJhX2xiaXRzIiwiZXh0cmFfZGJpdHMiLCJleHRyYV9ibGJpdHMiLCJibF9vcmRlciIsInN0YXRpY19sdHJlZSIsInN0YXRpY19kdHJlZSIsIl9kaXN0X2NvZGUiLCJfbGVuZ3RoX2NvZGUiLCJiYXNlX2xlbmd0aCIsInN0YXRpY19sX2Rlc2MiLCJzdGF0aWNfZF9kZXNjIiwic3RhdGljX2JsX2Rlc2MiLCJiYXNlX2Rpc3QiLCJTdGF0aWNUcmVlRGVzYyIsInN0YXRpY190cmVlIiwiZXh0cmFfYml0cyIsImV4dHJhX2Jhc2UiLCJlbGVtcyIsIm1heF9sZW5ndGgiLCJoYXNfc3RyZWUiLCJUcmVlRGVzYyIsImR5bl90cmVlIiwic3RhdF9kZXNjIiwibWF4X2NvZGUiLCJkX2NvZGUiLCJwdXRfc2hvcnQiLCJzZW5kX2JpdHMiLCJzZW5kX2NvZGUiLCJ0cmVlIiwiYmlfcmV2ZXJzZSIsImdlbl9jb2RlcyIsIm5leHRfY29kZSIsImluaXRfYmxvY2siLCJiaV93aW5kdXAiLCJzbWFsbGVyIiwiX24yIiwiX20yIiwicHFkb3duaGVhcCIsImNvbXByZXNzX2Jsb2NrIiwibHRyZWUiLCJkdHJlZSIsImxjIiwibHgiLCJidWlsZF90cmVlIiwic3RyZWUiLCJ4Yml0cyIsIm92ZXJmbG93IiwiZ2VuX2JpdGxlbiIsInNjYW5fdHJlZSIsImN1cmxlbiIsInByZXZsZW4iLCJuZXh0bGVuIiwibWF4X2NvdW50IiwibWluX2NvdW50Iiwic2VuZF90cmVlIiwic3RhdGljX2luaXRfZG9uZSIsInN0b3JlZF9sZW4iLCJjb3B5X2Jsb2NrIiwidHJfc3RhdGljX2luaXQiLCJvcHRfbGVuYiIsInN0YXRpY19sZW5iIiwibWF4X2JsaW5kZXgiLCJibGFja19tYXNrIiwiZGV0ZWN0X2RhdGFfdHlwZSIsImJ1aWxkX2JsX3RyZWUiLCJsY29kZXMiLCJkY29kZXMiLCJibGNvZGVzIiwic2VuZF9hbGxfdHJlZXMiLCJiaV9mbHVzaCIsInNfd2luZG93IiwibGNvZGUiLCJkY29kZSIsImxtYXNrIiwiZG1hc2siLCJvcCIsInRvcCIsImRvbGVuIiwiZG9kaXN0IiwibGJhc2UiLCJsZXh0IiwiZGJhc2UiLCJkZXh0IiwibGVuc19pbmRleCIsInRhYmxlX2luZGV4IiwiaW5jciIsImxvdyIsIm1hc2siLCJjdXJyIiwiZHJvcCIsInVzZWQiLCJodWZmIiwiYmFzZV9pbmRleCIsIk1BWEJJVFMiLCJvZmZzIiwiZXh0cmFfaW5kZXgiLCJXQVJDUmVjb3JkIiwicGFyc2luZ1N0YXRlcyIsImNvbnRlbnQxIiwiY29udGVudDIiLCJjb25zdW1lQ1JMRkhlYWRlciIsImNvbnN1bWVDUkxGQ29udGVudDEiLCJjb25zdW1lQ1JMRkNvbnRlbnQyIiwiV0ZJQmVnaW5MZW4iLCJfcGFydHMiLCJjMSIsIl9wYXJzaW5nU3RhdGUiLCJuZXdSZWNvcmQiLCJpc1dBUkNSZXZpc2lvbkxpbmUiLCJpc1NlcCIsImlzSnVzdENSTEYiLCJDb250ZW50UGFyc2VyIiwid2FyY1BhcnRzIiwid2FyY0hlYWRlciIsInBhcnNlV2FyY1JlY29yZEhlYWRlciIsImh0dHBJbmZvIiwiY29udGVudCIsInd0IiwicGFyc2VIVFRQUG9ydGlvbiIsInBhcnNlUmVzSFRUUCIsInN0YXJ0c1dpdGgiLCJ3YXJjUmVjb3JkSUQiLCJ3YXJjQ29udGVudFR5cGUiLCJ3YXJjQmxvY2tEaWdlc3QiLCJ3YXJjUGF5bG9hZERpZ2VzdCIsIndhcmNJUEFkZHJlc3MiLCJ3YXJjUmVmZXJzVG8iLCJ3YXJjUmVmZXJzVG9UYXJnZXRVUkkiLCJ3YXJjUmVmZXJzVG9EYXRlIiwid2FyY1RydW5jYXRlZCIsIndhcmNXYXJjaW5mb0lEIiwid2FyY0ZpbGVuYW1lIiwid2FyY1Byb2ZpbGUiLCJ3YXJjSWRlbnRpZmllZFBheWxvYWRUeXBlIiwid2FyY1NlZ21lbnRPcmlnaW5JRCIsIndhcmNTZWdtZW50TnVtYmVyIiwid2FyY1NlZ21lbnRUb3RhbExlbmd0aCIsIldGSSIsIldBUkNWU2xhc2giLCJDb2xvblNwYWNlIiwiYnVmTGVuIiwiYnVmcyIsInBhcnNlUmVxSFRUUCIsImN1cnJlbnRCdWZmZXIiLCJjdXJMZW4iLCJzZXBQb3MiLCJoZWFkZXJWYWx1ZSIsInJoZWFkZXIiLCJ1dGY4QnVmZmVyU2xpY2UiLCJidWZFbmRQb3NOb0NSTEYiLCJvdXRsaW5rIiwidW5rZXllZCIsImhlYWRlckJ1ZmZzIiwicmVxdWVzdExpbmUiLCJodHRwVmVyc2lvbiIsInNwYWNlSURYIiwibGFzdElEWCIsIl9wYXJzZUhlYWRlcnMiLCJzdGF0dXNMaW5lIiwic3RhdHVzUmVhc29uIiwibGFzdEtleSIsImdldFBvc3REYXRhIiwiZ2V0UmVzQm9keSIsImNhcHR1cmVyIiwid2NEZWJ1Z2dlciIsImdlbk9wdHMiLCJ3YXJjT3B0cyIsImluaXRXQVJDIiwid3JpdGVXYXJjSW5mb1JlY29yZCIsIndyaXRlV2VicmVjb3JkZXJCb29rbWFya3NJbmZvUmVjb3JkIiwiaXRlcmF0ZVJlcXVlc3RzIiwiZ2VuZXJhdGVXYXJjRW50cnkiLCJucmVxIiwicG9zdCIsImNhblNlcmlhbGl6ZVJlc3BvbnNlIiwic2VyaWFsaXplUmVzcG9uc2VIZWFkZXJzIiwid2FzRXJyb3IiLCJyYm9keSIsImJhc2U2NEVuY29kZWQiLCJ3cml0ZVJlcXVlc3RSZXNwb25zZVJlY29yZHMiLCJzZXJpYWxpemVSZXF1ZXN0SGVhZGVycyIsIndyaXRlUmVxdWVzdFJlY29yZCIsIm5vcm1hbGl6ZUFycmF5IiwiYWxsb3dBYm92ZVJvb3QiLCJzcGxpdFBhdGhSZSIsInNwbGl0UGF0aCIsImZpbGVuYW1lIiwiZmlsdGVyIiwicmVzb2x2ZWRQYXRoIiwicmVzb2x2ZWRBYnNvbHV0ZSIsIm5vcm1hbGl6ZSIsInRyYWlsaW5nU2xhc2giLCJmcm9tUGFydHMiLCJ0b1BhcnRzIiwic2FtZVBhcnRzTGVuZ3RoIiwib3V0cHV0UGFydHMiLCJzZXAiLCJkZWxpbWl0ZXIiLCJkaXJuYW1lIiwiZXh0bmFtZSIsImdldFJhbmRvbVZhbHVlcyIsImNyeXB0byIsIm1zQ3J5cHRvIiwicm5kczgiLCJybmRzIiwiYnl0ZVRvSGV4IiwiYnRoIiwid2FyY1JFIiwiZ3ppcHBpbmciLCJoYXNXQVJDIiwiaGFzV0FSQ0daIiwiaXNFbXB0eSIsInNlbmRDb21tYW5kIiwiYmFzZUtleXMiLCJnZXRUYWciLCJpc0FycmF5TGlrZSIsImlzUHJvdG90eXBlIiwiaXNUeXBlZEFycmF5IiwibWFwVGFnIiwic2V0VGFnIiwibmF0aXZlS2V5cyIsIm92ZXJBcmciLCJXZWFrTWFwIiwidG9Tb3VyY2UiLCJkYXRhVmlld0N0b3JTdHJpbmciLCJtYXBDdG9yU3RyaW5nIiwicHJvbWlzZUN0b3JTdHJpbmciLCJzZXRDdG9yU3RyaW5nIiwid2Vha01hcEN0b3JTdHJpbmciLCJjdG9yU3RyaW5nIiwiZ2V0TmF0aXZlIiwiaXNNYXNrZWQiLCJyZUlzSG9zdEN0b3IiLCJmdW5jUHJvdG8iLCJyZUlzTmF0aXZlIiwibmF0aXZlT2JqZWN0VG9TdHJpbmciLCJpc093biIsInVubWFza2VkIiwidWlkIiwiY29yZUpzRGF0YSIsIm1hc2tTcmNLZXkiLCJJRV9QUk9UTyIsImJhc2VJc0FyZ3VtZW50cyIsImlzT2JqZWN0TGlrZSIsImFyZ3NUYWciLCJpc0xlbmd0aCIsInN0dWJGYWxzZSIsImZyZWVFeHBvcnRzIiwibm9kZVR5cGUiLCJmcmVlTW9kdWxlIiwiYmFzZUlzVHlwZWRBcnJheSIsImJhc2VVbmFyeSIsIm5vZGVVdGlsIiwibm9kZUlzVHlwZWRBcnJheSIsInR5cGVkQXJyYXlUYWdzIiwiZnJlZVByb2Nlc3MiLCJ0eXBlcyIsInJlcXVpcmUiLCJuZXR3b3JrIiwiZ2V0UmVxdWVzdFBvc3REYXRhIiwiZ2V0UmVzcG9uc2VCb2R5IiwiY2xpZW50Iiwic2VuZCIsIl9VUCIsInJlcUhUVFAiLCJyZXNIVFRQIiwiX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18iLCJtYXhJbnQiLCJ0TWluIiwidE1heCIsInNrZXciLCJkYW1wIiwiaW5pdGlhbEJpYXMiLCJpbml0aWFsTiIsInJlZ2V4UHVueWNvZGUiLCJyZWdleE5vbkFTQ0lJIiwicmVnZXhTZXBhcmF0b3JzIiwiZXJyb3JzIiwibm90LWJhc2ljIiwiaW52YWxpZC1pbnB1dCIsImJhc2VNaW51c1RNaW4iLCJzdHJpbmdGcm9tQ2hhckNvZGUiLCJtYXBEb21haW4iLCJ1Y3MyZGVjb2RlIiwiY291bnRlciIsInVjczJlbmNvZGUiLCJkaWdpdFRvQmFzaWMiLCJkaWdpdCIsImFkYXB0IiwiZGVsdGEiLCJudW1Qb2ludHMiLCJmaXJzdFRpbWUiLCJkZWNvZGUiLCJiYXNpYyIsIm9sZGkiLCJiYXNlTWludXNUIiwiaW5wdXRMZW5ndGgiLCJiaWFzIiwiZW5jb2RlIiwiaGFuZGxlZENQQ291bnQiLCJiYXNpY0xlbmd0aCIsImN1cnJlbnRWYWx1ZSIsImhhbmRsZWRDUENvdW50UGx1c09uZSIsInFNaW51c1QiLCJ1Y3MyIiwidG9Vbmljb2RlIiwicXMiLCJlcSIsIm1heEtleXMiLCJrc3RyIiwidnN0ciIsInN0cmluZ2lmeVByaW1pdGl2ZSIsImtzIiwidG9BcnJheUJ1ZmZlciIsInByZWZlckJpbmFyeSIsIl9ib2R5IiwiX2hlYWRlcnMiLCJzZXRIZWFkZXIiLCJ1c2VGZXRjaCIsImRlY2lkZU1vZGUiLCJfZmV0Y2hUaW1lciIsImxvd2VyTmFtZSIsInVuc2FmZUhlYWRlcnMiLCJnZXRIZWFkZXIiLCJyZW1vdmVIZWFkZXIiLCJoZWFkZXJzT2JqIiwiaGVhZGVyc0xpc3QiLCJrZXlOYW1lIiwic2lnbmFsIiwiY29udHJvbGxlciIsIl9mZXRjaEFib3J0Q29udHJvbGxlciIsInJlcXVlc3RUaW1lb3V0IiwiY3JlZGVudGlhbHMiLCJ3aXRoQ3JlZGVudGlhbHMiLCJfY29ubmVjdCIsIm9udGltZW91dCIsInNldFJlcXVlc3RIZWFkZXIiLCJfcmVzcG9uc2UiLCJzdGF0dXNWYWxpZCIsImZsdXNoSGVhZGVycyIsInNldE5vRGVsYXkiLCJzZXRTb2NrZXRLZWVwQWxpdmUiLCJhcnJheUNvcHkiLCIxMDAiLCIxMDEiLCIxMDIiLCIyMDAiLCIyMDEiLCIyMDIiLCIyMDMiLCIyMDQiLCIyMDUiLCIyMDYiLCIyMDciLCIyMDgiLCIyMjYiLCIzMDAiLCIzMDEiLCIzMDIiLCIzMDMiLCIzMDQiLCIzMDUiLCIzMDciLCIzMDgiLCI0MDAiLCI0MDEiLCI0MDIiLCI0MDMiLCI0MDQiLCI0MDUiLCI0MDYiLCI0MDciLCI0MDgiLCI0MDkiLCI0MTAiLCI0MTEiLCI0MTIiLCI0MTMiLCI0MTQiLCI0MTUiLCI0MTYiLCI0MTciLCI0MTgiLCI0MjEiLCI0MjIiLCI0MjMiLCI0MjQiLCI0MjUiLCI0MjYiLCI0MjgiLCI0MjkiLCI0MzEiLCI0NTEiLCI1MDAiLCI1MDEiLCI1MDIiLCI1MDMiLCI1MDQiLCI1MDUiLCI1MDYiLCI1MDciLCI1MDgiLCI1MDkiLCI1MTAiLCI1MTEiLCJjcmVhdGVDb21wb3VuZGVyIiwidXBwZXJGaXJzdCIsIndvcmQiLCJhcnJheVJlZHVjZSIsImRlYnVyciIsIndvcmRzIiwicmVBcG9zIiwiYWNjdW11bGF0b3IiLCJpbml0QWNjdW0iLCJkZWJ1cnJMZXR0ZXIiLCJyZUxhdGluIiwicmVDb21ib01hcmsiLCJiYXNlUHJvcGVydHlPZiIsIsOAIiwiw4EiLCLDgiIsIsODIiwiw4QiLCLDhSIsIsOgIiwiw6EiLCLDoiIsIsOjIiwiw6QiLCLDpSIsIsOHIiwiw6ciLCLDkCIsIsOwIiwiw4giLCLDiSIsIsOKIiwiw4siLCLDqCIsIsOpIiwiw6oiLCLDqyIsIsOMIiwiw40iLCLDjiIsIsOPIiwiw6wiLCLDrSIsIsOuIiwiw68iLCLDkSIsIsOxIiwiw5IiLCLDkyIsIsOUIiwiw5UiLCLDliIsIsOYIiwiw7IiLCLDsyIsIsO0Iiwiw7UiLCLDtiIsIsO4Iiwiw5kiLCLDmiIsIsObIiwiw5wiLCLDuSIsIsO6Iiwiw7siLCLDvCIsIsOdIiwiw70iLCLDvyIsIsOGIiwiw6YiLCLDniIsIsO+Iiwiw58iLCLEgCIsIsSCIiwixIQiLCLEgSIsIsSDIiwixIUiLCLEhiIsIsSIIiwixIoiLCLEjCIsIsSHIiwixIkiLCLEiyIsIsSNIiwixI4iLCLEkCIsIsSPIiwixJEiLCLEkiIsIsSUIiwixJYiLCLEmCIsIsSaIiwixJMiLCLElSIsIsSXIiwixJkiLCLEmyIsIsScIiwixJ4iLCLEoCIsIsSiIiwixJ0iLCLEnyIsIsShIiwixKMiLCLEpCIsIsSmIiwixKUiLCLEpyIsIsSoIiwixKoiLCLErCIsIsSuIiwixLAiLCLEqSIsIsSrIiwixK0iLCLEryIsIsSxIiwixLQiLCLEtSIsIsS2IiwixLciLCLEuCIsIsS5IiwixLsiLCLEvSIsIsS/IiwixYEiLCLEuiIsIsS8IiwixL4iLCLFgCIsIsWCIiwixYMiLCLFhSIsIsWHIiwixYoiLCLFhCIsIsWGIiwixYgiLCLFiyIsIsWMIiwixY4iLCLFkCIsIsWNIiwixY8iLCLFkSIsIsWUIiwixZYiLCLFmCIsIsWVIiwixZciLCLFmSIsIsWaIiwixZwiLCLFniIsIsWgIiwixZsiLCLFnSIsIsWfIiwixaEiLCLFoiIsIsWkIiwixaYiLCLFoyIsIsWlIiwixaciLCLFqCIsIsWqIiwixawiLCLFriIsIsWwIiwixbIiLCLFqSIsIsWrIiwixa0iLCLFryIsIsWxIiwixbMiLCLFtCIsIsW1IiwixbYiLCLFtyIsIsW4IiwixbkiLCLFuyIsIsW9IiwixboiLCLFvCIsIsW+IiwixLIiLCLEsyIsIsWSIiwixZMiLCLFiSIsIsW/IiwiYXJyYXlNYXAiLCJJTkZJTklUWSIsInN5bWJvbFByb3RvIiwic3ltYm9sVG9TdHJpbmciLCJzeW1ib2xUYWciLCJhc2NpaVdvcmRzIiwiaGFzVW5pY29kZVdvcmQiLCJ1bmljb2RlV29yZHMiLCJwYXR0ZXJuIiwiZ3VhcmQiLCJyZUFzY2lpV29yZCIsInJlSGFzVW5pY29kZVdvcmQiLCJyc0JyZWFrUmFuZ2UiLCJyc01hdGhPcFJhbmdlIiwicnNCcmVhayIsInJzRGlnaXRzIiwicnNEaW5nYmF0IiwicnNMb3dlciIsInJzTWlzYyIsInJzUmVnaW9uYWwiLCJyc1N1cnJQYWlyIiwicnNVcHBlciIsInJzTWlzY0xvd2VyIiwicnNNaXNjVXBwZXIiLCJyZU9wdE1vZCIsInJzTW9kaWZpZXIiLCJyc1NlcSIsInJzRW1vamkiLCJyZVVuaWNvZGVXb3JkIiwiY3JlYXRlQ2FzZUZpcnN0IiwiY2FzdFNsaWNlIiwiaGFzVW5pY29kZSIsInN0cmluZ1RvQXJyYXkiLCJtZXRob2ROYW1lIiwic3RyU3ltYm9scyIsImNociIsInRyYWlsaW5nIiwiYmFzZVNsaWNlIiwiYXNjaWlUb0FycmF5IiwidW5pY29kZVRvQXJyYXkiLCJyc0FzdHJhbCIsInJzQ29tYm8iLCJyc0ZpdHoiLCJyc05vbkFzdHJhbCIsInJzU3ltYm9sIiwicmVVbmljb2RlIiwicmVxdWVzdExpbmVBbmRIZWFkZXJzIiwic3RhdHVzTGluZUFuZEhlYWRlcnMiLCJyZXF1ZXN0RXZlbnQiLCJfcmVxdWVzdEMiLCJyZXF1ZXN0V2lsbEJlU2VudCIsImF0dGFjaCIsIm1heWJlTmV0d29ya01lc3NhZ2UiLCJyZXNwb25zZVJlY2VpdmVkIiwiY2RwQ2xpZW50IiwicmVzcCIsInBkIiwid3JpdGVSZXNwb25zZVJlY29yZCIsInN0cmluZ3MiLCJaU3RyZWFtIiwib3B0IiwicmF3IiwiZGljdCIsIl9kaWN0X3NldCIsImRlZmxhdG9yIiwib25EYXRhIiwiR1poZWFkZXIiLCJpbmZsYXRvciIsIm5leHRfb3V0X3V0ZjgiLCJ1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QUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxLQUFBQyxJQUFBLEtBQ0FDLElBQUEsS0FBQUMsSUFBQSxLQUNBQyxJQUFBLEtBRUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLEtBQUFDLElBQUEsS0FDQUMsSUFBQSxLQUFBQyxJQUFBLEtBQ0FDLElBQUEsS0FBQUMsSUFBQSxNQWFBMzRFLEVBQUFELFFBQUEyc0UsaUJDekRBMXNFLEVBQUFELFFBTkEsU0FBQTRCLEdBQ0EsZ0JBQUFILEdBQ0EsYUFB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QyxLQUFBLEVBRUF6MEMsS0FBQXlkLE1BQUEiLCJmaWxlIjoibm9kZXdhcmMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNjYpO1xuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nXG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQ1JMRjJ4ID0gJ1xcclxcblxcclxcbidcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCByZWNvcmRTZXBhcmF0b3IgPSAnXFxyXFxuXFxyXFxuJ1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFdBUkNWID0gJzEuMCdcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBXQVJDU2xhc2hWID0gYFdBUkMvJHtXQVJDVn0ke0NSTEZ9YFxuXG4vKipcbiAqIEB0eXBlIHt7d2FyY2luZm86IHN0cmluZywgbWV0YWRhdGE6IHN0cmluZywgcmVxdWVzdDogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nLCByZXZpc2l0OiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcsIGNvbnZlcnNpb246IHN0cmluZywgdW5rbm93bjogc3RyaW5nLCBjb250aW51YXRpb246IHN0cmluZ319XG4gKi9cbmNvbnN0IFdBUkNUeXBlcyA9IHtcbiAgd2FyY2luZm86ICd3YXJjaW5mbycsXG4gIG1ldGFkYXRhOiAnbWV0YWRhdGEnLFxuICByZXF1ZXN0OiAncmVxdWVzdCcsXG4gIHJlc3BvbnNlOiAncmVzcG9uc2UnLFxuICByZXZpc2l0OiAncmV2aXNpdCcsXG4gIHJlc291cmNlOiAncmVzb3VyY2UnLFxuICBjb252ZXJzaW9uOiAnY29udmVyc2lvbicsXG4gIHVua25vd246ICd1bmtub3duJyxcbiAgY29udGludWF0aW9uOiAnY29udGludWF0aW9uJ1xufVxuXG5jb25zdCBXQVJDQ29udGVudFR5cGVzID0ge1xuICB3YXJjRmllbGRzOiAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi93YXJjLWZpZWxkc1xcclxcbicsXG4gIGh0dHBSZXF1ZXN0OiAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9odHRwOyBtc2d0eXBlPXJlcXVlc3RcXHJcXG4nLFxuICBodHRwUmVzcG9uc2U6ICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2h0dHA7IG1zZ3R5cGU9cmVzcG9uc2VcXHJcXG4nXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHV1aWRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVjb3JkSWQgKHV1aWQpIHtcbiAgcmV0dXJuIGBXQVJDLVJlY29yZC1JRDogPHVybjp1dWlkOiR7dXVpZH0+JHtDUkxGfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjRGF0ZSAoZGF0ZSkge1xuICByZXR1cm4gYFdBUkMtRGF0ZTogJHtkYXRlfSR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldFVSSVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjVGFyZ2V0VVJJICh0YXJnZXRVUkkpIHtcbiAgcmV0dXJuIGBXQVJDLVRhcmdldC1VUkk6ICR7dGFyZ2V0VVJJfSR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY1R5cGUgKHR5cGUpIHtcbiAgcmV0dXJuIGBXQVJDLVR5cGU6ICR7dHlwZX0ke0NSTEZ9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjRmlsZW5hbWUgKGZpbGVOYW1lKSB7XG4gIHJldHVybiBgV0FSQy1GaWxlbmFtZTogJHtmaWxlTmFtZX0ke0NSTEZ9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gY29udGVudExlblxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjQ29udGVudExlbmd0aCAoY29udGVudExlbikge1xuICByZXR1cm4gYENvbnRlbnQtTGVuZ3RoOiAke2NvbnRlbnRMZW59JHtDUkxGfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFR5cGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY0NvbnRlbnRUeXBlIChjb250ZW50VHlwZSkge1xuICByZXR1cm4gYENvbnRlbnQtVHlwZTogJHtjb250ZW50VHlwZX0ke0NSTEZ9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25jdXJyZW50VG9cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY0NvbmN1cnJlbnRUbyAoY29uY3VycmVudFRvKSB7XG4gIHJldHVybiBgV0FSQy1Db25jdXJyZW50LVRvOiA8dXJuOnV1aWQ6JHtjb25jdXJyZW50VG99PiR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdpZFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjV2FyY0luZm9JZCAod2lkKSB7XG4gIHJldHVybiBgV0FSQy1XYXJjaW5mby1JRDogPHVybjp1dWlkOiR7d2lkfT4ke0NSTEZ9YFxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtPYmplY3R9IHJlcUZpZWxkc1xuICogQHBhcmFtIHtzdHJpbmd9IHJlcUZpZWxkcy5yaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXFGaWVsZHMuZGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlcUZpZWxkcy5sZW5cbiAqIEBwYXJhbSB7P3N0cmluZ30gW3JlcUZpZWxkcy50YXJnZXRVUkldXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVkSGVhZGVyRmllbGRzICh0eXBlLCB7IHJpZCwgZGF0ZSwgbGVuLCB0YXJnZXRVUkkgfSkge1xuICBpZiAodGFyZ2V0VVJJICE9IG51bGwpIHtcbiAgICByZXR1cm4gYCR7V0FSQ1NsYXNoVn0ke3dhcmNUeXBlKHR5cGUpfSR7cmVjb3JkSWQocmlkKX0ke3dhcmNEYXRlKFxuICAgICAgZGF0ZVxuICAgICl9JHt3YXJjVGFyZ2V0VVJJKHRhcmdldFVSSSl9JHt3YXJjQ29udGVudExlbmd0aChsZW4pfWBcbiAgfVxuICByZXR1cm4gYCR7V0FSQ1NsYXNoVn0ke3dhcmNUeXBlKHR5cGUpfSR7cmVjb3JkSWQocmlkKX0ke3dhcmNEYXRlKFxuICAgIGRhdGVcbiAgKX0ke3dhcmNDb250ZW50TGVuZ3RoKGxlbil9YFxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdBUkNJbmZvSGVhZGVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0ZSAtIFRoZSBkYXRlIHZhbHVlIGZvciBXQVJDLURhdGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gW2ZpbGVOYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSB3YXJjIGZpbGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gW3RhcmdldFVSSV0gLSBUaGUgdGFyZ2V0IFVSSSBmb3IgdGhlIHJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJpZCAtIFRoZSBpZCBvZiB0aGUgcmVjb3JkXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuIC0gVGhlIGxlbmd0aCBvZiB0aGUgcmVjb3JkcyBjb250ZW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1dBUkNJbmZvSGVhZGVyfSBpbmZvSGVhZGVyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNJbmZvSGVhZGVyIChpbmZvSGVhZGVyKSB7XG4gIGNvbnN0IHJlcXVpcmVkID0gYCR7cmVxdWlyZWRIZWFkZXJGaWVsZHMoV0FSQ1R5cGVzLndhcmNpbmZvLCBpbmZvSGVhZGVyKX0ke1xuICAgIFdBUkNDb250ZW50VHlwZXMud2FyY0ZpZWxkc1xuICB9YFxuICBpZiAoaW5mb0hlYWRlci5maWxlTmFtZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGAke3JlcXVpcmVkfSR7d2FyY0ZpbGVuYW1lKGluZm9IZWFkZXIuZmlsZU5hbWUpfWBcbiAgfVxuICByZXR1cm4gcmVxdWlyZWRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5mb0NvbnRlbnRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY0luZm9Db250ZW50IChpbmZvQ29udGVudCkge1xuICBjb25zdCBiYXNlID0gW2Bmb3JtYXQ6IFdBUkMgRmlsZSBGb3JtYXQgJHtXQVJDVn0ke0NSTEZ9YF1cbiAgZm9yIChsZXQga2V5IGluIGluZm9Db250ZW50KSB7XG4gICAgYmFzZS5wdXNoKGAke2tleX06ICR7aW5mb0NvbnRlbnRba2V5XX0ke0NSTEZ9YClcbiAgfVxuICByZXR1cm4gYmFzZS5qb2luKCcnKVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdBUkNNZXRhZGF0YUhlYWRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldFVSSSAtIFRoZSBVUkkgdGhlIHJlY29yZHMgYXJlIGZvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5vdyAtIFRoZSBkYXRlIHZhbHVlIGZvciBXQVJDLURhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb25jdXJyZW50VG8gLSBUaGUgcmVjb3JkIGlkIHRoaXMgbWV0YWRhdGEgcmVjb3JkIGlzIGFzc29jaWF0ZWQgd2l0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJpZCAtIFRoZSByZWNvcmQgaWQgb2YgdGhpcyByZWNvcmRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZW4gLSBUaGUgbGVuZ3RoIG9mIHRoaXMgcmVjb3JkcyBjb250ZW50XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHdpZCAtIFRoZSByZWNvcmQgaWQgb2YgdGhlIFdhcmNpbmZvIHJlY29yZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtXQVJDTWV0YWRhdGFIZWFkZXJ9IG1ldGFkYXRhSGVhZGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjTWV0YWRhdGFIZWFkZXIgKHsgdGFyZ2V0VVJJLCBub3csIGNvbmN1cnJlbnRUbywgcmlkLCBsZW4sIHdpZCB9KSB7XG4gIGNvbnN0IGJhc2UgPSBbXG4gICAgcmVxdWlyZWRIZWFkZXJGaWVsZHMoV0FSQ1R5cGVzLm1ldGFkYXRhLCB7XG4gICAgICBkYXRlOiBub3csXG4gICAgICBsZW4sXG4gICAgICByaWQsXG4gICAgICB0YXJnZXRVUklcbiAgICB9KSxcbiAgICBXQVJDQ29udGVudFR5cGVzLndhcmNGaWVsZHNcbiAgXVxuICBpZiAoY29uY3VycmVudFRvICE9IG51bGwpIHtcbiAgICBiYXNlLnB1c2god2FyY0NvbmN1cnJlbnRUbyhjb25jdXJyZW50VG8pKVxuICB9XG4gIGlmICh3aWQgIT0gbnVsbCkge1xuICAgIGJhc2UucHVzaCh3YXJjV2FyY0luZm9JZCh3aWQpKVxuICB9XG4gIHJldHVybiBiYXNlLmpvaW4oJycpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV0FSQ1JlcXVlc3RIZWFkZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXRVUkkgLSBUaGUgVVJJIHRoZSByZWNvcmQgaXMgZm9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm93IC0gVGhlIGRhdGUgdmFsdWUgZm9yIFdBUkMtRGF0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbmN1cnJlbnRUbyAtIFRoZSByZWNvcmQgaWQgb2YgdGhlIHJlY29yZCB0aGlzIHJlY29yZCBhc3NvY2lhdGVkIHdpdGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByaWQgLSBUaGUgcmVjb3JkIGlkIG9mIHRoaXMgcmVjb3JkXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuIC0gVGhlIGxlbmd0aCBvZiB0aGlzIHJlY29yZHMgY29udGVudFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB3aWQgLSBUaGUgcmVjb3JkIGlkIG9mIHRoZSBXYXJjaW5mbyByZWNvcmRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7V0FSQ1JlcXVlc3RIZWFkZXJ9IHJlcXVlc3RIZWFkZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNSZXF1ZXN0SGVhZGVyICh7IHRhcmdldFVSSSwgbm93LCBjb25jdXJyZW50VG8sIHJpZCwgbGVuLCB3aWQgfSkge1xuICBjb25zdCBiYXNlID0gW1xuICAgIHJlcXVpcmVkSGVhZGVyRmllbGRzKFdBUkNUeXBlcy5yZXF1ZXN0LCB7IGRhdGU6IG5vdywgbGVuLCByaWQsIHRhcmdldFVSSSB9KSxcbiAgICBXQVJDQ29udGVudFR5cGVzLmh0dHBSZXF1ZXN0XG4gIF1cbiAgaWYgKGNvbmN1cnJlbnRUbyAhPSBudWxsKSB7XG4gICAgYmFzZS5wdXNoKHdhcmNDb25jdXJyZW50VG8oY29uY3VycmVudFRvKSlcbiAgfVxuICBpZiAod2lkICE9IG51bGwpIHtcbiAgICBiYXNlLnB1c2god2FyY1dhcmNJbmZvSWQod2lkKSlcbiAgfVxuICByZXR1cm4gYmFzZS5qb2luKCcnKVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdBUkNSZXNwb25zZUhlYWRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldFVSSSAtIFRoZSBVUkkgdGhlIHJlY29yZCBpcyBmb3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub3cgLSBUaGUgZGF0ZSB2YWx1ZSBmb3IgV0FSQy1EYXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmlkIC0gVGhlIHJlY29yZCBpZCBvZiB0aGlzIHJlY29yZFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlbiAtIFRoZSBsZW5ndGggb2YgdGhpcyByZWNvcmRzIGNvbnRlbnRcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gd2lkIC0gVGhlIHJlY29yZCBpZCBvZiB0aGUgV2FyY2luZm8gcmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1dBUkNSZXNwb25zZUhlYWRlcn0gcmVzcG9uc2VIZWFkZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNSZXNwb25zZUhlYWRlciAoeyB0YXJnZXRVUkksIG5vdywgcmlkLCBsZW4sIHdpZCB9KSB7XG4gIGNvbnN0IGJhc2UgPSBbXG4gICAgcmVxdWlyZWRIZWFkZXJGaWVsZHMoV0FSQ1R5cGVzLnJlc3BvbnNlLCB7XG4gICAgICBkYXRlOiBub3csXG4gICAgICBsZW4sXG4gICAgICByaWQsXG4gICAgICB0YXJnZXRVUklcbiAgICB9KSxcbiAgICBXQVJDQ29udGVudFR5cGVzLmh0dHBSZXNwb25zZVxuICBdXG4gIGlmICh3aWQgIT0gbnVsbCkge1xuICAgIGJhc2UucHVzaCh3YXJjV2FyY0luZm9JZCh3aWQpKVxuICB9XG4gIHJldHVybiBiYXNlLmpvaW4oJycpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZXF1aXJlZEhlYWRlckZpZWxkcyxcbiAgLyoqXG4gICAqIEB0eXBlIHtmdW5jdGlvbihoZWFkZXJJbmZvOiBXQVJDSW5mb0hlYWRlcik6IHN0cmluZ31cbiAgICovXG4gIHdhcmNJbmZvSGVhZGVyLFxuICAvKipcbiAgICogQHR5cGUge2Z1bmN0aW9uKGluZm9Db250ZW50OiBPYmplY3QpOiBzdHJpbmd9XG4gICAqL1xuICB3YXJjSW5mb0NvbnRlbnQsXG4gIC8qKlxuICAgKiBAdHlwZSB7ZnVuY3Rpb24ocmVxaWVzdERhdGE6IFdBUkNSZXF1ZXN0SGVhZGVyKTogc3RyaW5nfVxuICAgKi9cbiAgd2FyY1JlcXVlc3RIZWFkZXIsXG4gIHdhcmNSZXNwb25zZUhlYWRlcixcbiAgd2FyY01ldGFkYXRhSGVhZGVyLFxuICByZWNvcmRTZXBhcmF0b3IsXG4gIENSTEYsXG4gIENSTEYyeCxcbiAgV0FSQ1R5cGVzLFxuICBXQVJDVixcbiAgV0FSQ0NvbnRlbnRUeXBlc1xufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbmZ1bmN0aW9uIF9oYXMob2JqLCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbntcbiAgLy8gYXZvaWQgc2NvcGUgY3JlZXAsIHRoZSBrZXlzIGFycmF5IGNhbiB0aGVuIGJlIGNvbGxlY3RlZFxuICB2YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbiAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gICAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xuICB9XG59XG5cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcblxuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcG5hLm5leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMucHVzaChudWxsKTtcbiAgdGhpcy5lbmQoKTtcblxuICBwbmEubmV4dFRpY2soY2IsIGVycik7XG59OyIsImNvbnN0IGZzID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJykuZnM7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpXG5jb25zdCBQYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB1dWlkID0gcmVxdWlyZSgndXVpZC92MScpXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJylcbmNvbnN0IHtcbiAgd2FyY0luZm9IZWFkZXIsXG4gIHdhcmNJbmZvQ29udGVudCxcbiAgd2FyY1JlcXVlc3RIZWFkZXIsXG4gIHdhcmNSZXNwb25zZUhlYWRlcixcbiAgd2FyY01ldGFkYXRhSGVhZGVyLFxuICByZWNvcmRTZXBhcmF0b3IsXG4gIENSTEYsXG4gIENSTEYyeFxufSA9IHJlcXVpcmUoJy4vd2FyY0ZpZWxkcycpXG5jb25zdCBlbnN1cmVXQVJDRmlsZU5hbWUgPSByZXF1aXJlKCcuLi91dGlscy9lbnN1cmVXQVJDRmlsZW5hbWUnKVxuXG4vKipcbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IHJlY29yZFNlcGFyYXRvckJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlY29yZFNlcGFyYXRvciwgJ3V0ZjgnKVxuXG4vKipcbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IENSTEZCdWZmZXIgPSBCdWZmZXIuZnJvbShDUkxGLCAndXRmOCcpXG5cbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuY29uc3QgV0FSQ1NlcFRTaXplID0gcmVjb3JkU2VwYXJhdG9yQnVmZmVyLmxlbmd0aCArIENSTEZCdWZmZXIubGVuZ3RoXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7P0J1ZmZlcnw/c3RyaW5nfSBtYXliZUJ1ZmZlclxuICogQHJldHVybiB7QnVmZmVyfVxuICovXG5mdW5jdGlvbiBtYWtlQ29udGVudEJ1ZmZlciAoc3RyaW5nLCBtYXliZUJ1ZmZlcikge1xuICBpZiAobWF5YmVCdWZmZXIgIT0gbnVsbCkge1xuICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgYnVmZmVyIGNvbnRhaW5zIENSTEYgMnggc2luY2Ugd2UgaGF2ZSBhIGJvZHlcbiAgICBjb25zdCBzdHJCdWZmID0gc3RyaW5nLmVuZHNXaXRoKENSTEYyeClcbiAgICAgID8gQnVmZmVyLmZyb20oc3RyaW5nLCAndXRmOCcpXG4gICAgICA6IEJ1ZmZlci5mcm9tKGAke3N0cmluZ30ke0NSTEZ9YCwgJ3V0ZjgnKVxuICAgIGNvbnN0IGNudEJ1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcihtYXliZUJ1ZmZlcilcbiAgICAgID8gbWF5YmVCdWZmZXJcbiAgICAgIDogQnVmZmVyLmZyb20obWF5YmVCdWZmZXIsICd1dGY4JylcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChcbiAgICAgIFtzdHJCdWZmLCBjbnRCdWZmZXJdLFxuICAgICAgc3RyQnVmZi5sZW5ndGggKyBjbnRCdWZmZXIubGVuZ3RoXG4gICAgKVxuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShzdHJpbmcsICd1dGY4Jylcbn1cblxuLyoqXG4gKiBAZGVzYyBEZWZhdWx0IG9wdGlvbnMgdGhhdCBjb250cm9sIGhvdyBXQVJDIHdyaXR0aW5nIGlzIGRvbmVcbiAqIEBwYXJhbSB7V0FSQ0ZpbGVPcHRzfSBbb3B0c11cbiAqIEByZXR1cm4ge1dBUkNGaWxlT3B0c31cbiAqL1xuZnVuY3Rpb24gZW5zdXJlT3B0aW9ucyAob3B0cykge1xuICBpZiAob3B0cyA9PSBudWxsKSB7XG4gICAgb3B0cyA9IHt9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhcHBlbmRpbmc6IG9wdHMuYXBwZW5kaW5nIHx8IGZhbHNlLFxuICAgIGd6aXA6IG9wdHMuZ3ppcCB8fCBwcm9jZXNzLmVudi5OT0RFV0FSQ19XUklURV9HWklQUEVEICE9IG51bGxcbiAgfVxufVxuXG4vKipcbiAqIEBleHRlbmRzIHtFdmVudEVtaXR0ZXJ9XG4gKiBAZGVzYyBCYXNlIGNsYXNzIHVzZWQgZm9yIHdyaXRpbmcgdG8gdGhlIFdBUkNcbiAqL1xuY2xhc3MgV0FSQ1dyaXRlckJhc2UgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQGRlc2MgQ3JlYXRlIGEgbmV3IFdBUkNXcml0ZXJcbiAgICogQHBhcmFtIHs/V0FSQ0ZpbGVPcHRzfSBbZGVmYXVsdE9wdHNdIC0gT3B0aW9uYWwgZGVmYXVsdCBXQVJDIGZpbGUgb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IgKGRlZmF1bHRPcHRzKSB7XG4gICAgc3VwZXIoKVxuICAgIC8qKlxuICAgICAqIEB0eXBlIHs/V3JpdGVTdHJlYW19XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl93YXJjT3V0U3RyZWFtID0gbnVsbFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHs/RXJyb3J9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9sYXN0RXJyb3IgPSBudWxsXG4gICAgLyoqXG4gICAgICogQHR5cGUgez9zdHJpbmd9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9ub3cgPSBudWxsXG4gICAgLyoqXG4gICAgICogQHR5cGUgez9zdHJpbmd9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9maWxlTmFtZSA9IG51bGxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7P3N0cmluZ31cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3dhcmNJbmZvSWQgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7P1dBUkNGaWxlT3B0c31cbiAgICAgKi9cbiAgICB0aGlzLm9wdHMgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7V0FSQ0ZpbGVPcHRzfVxuICAgICAqL1xuICAgIHRoaXMuZGVmYXVsdE9wdHMgPSBlbnN1cmVPcHRpb25zKGRlZmF1bHRPcHRzKVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3ZlcnNpb24gPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uXG4gICAgdGhpcy5fb25GaW5pc2ggPSB0aGlzLl9vbkZpbmlzaC5iaW5kKHRoaXMpXG4gICAgdGhpcy5fb25FcnJvciA9IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFNldCB0aGUgZGVmYXVsdCBXQVJDIGNyZWF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtXQVJDRmlsZU9wdHN9IGRlZmF1bHRPcHRzIC0gVGhlIG5ldyBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHNldERlZmF1bHRPcHRzIChkZWZhdWx0T3B0cykge1xuICAgIHRoaXMuZGVmYXVsdE9wdHMgPSBlbnN1cmVPcHRpb25zKGRlZmF1bHRPcHRzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEluaXRpYWxpemUgdGhlIHdyaXRlci4gVGhlIG9wdGlvbnMgb2JqZWN0IGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBgYXBwZW5kaW5nID0gZmFsc2VgIGFuZCBgZ3ppcCA9IHByb2Nlc3MuZW52Lk5PREVXQVJDX1dSSVRFX0daSVBQRUQgIT0gbnVsbGAuXG4gICAqIFdyaXRpbmcgZ3ppcHBlZCByZWNvcmRzIGlzIGFsc28gY29udHJvbGxhYmxlIGJ5IHNldHRpbmcgYE5PREVXQVJDX1dSSVRFX0daSVBQRURgIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgKiBPcHRpb25zIHN1cHBsaWVkIHRvIHRoaXMgbWV0aG9kIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3YXJjUGF0aCAtIHRoZSBwYXRoIGZvciB0aGUgV0FSQyBmaWxlIHRvIGJlIHdyaXR0ZW5cbiAgICogQHBhcmFtIHs/V0FSQ0ZpbGVPcHRzfSBbb3B0aW9uc10gLSB3cml0ZSBvcHRpb25zIGNvbnRyb2xsaW5nIGhvdyB0aGUgV0FSQyBzaG91bGQgYmUgd3JpdHRlblxuICAgKi9cbiAgaW5pdFdBUkMgKHdhcmNQYXRoLCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kZWZhdWx0T3B0cywgb3B0aW9ucyB8fCB7fSlcbiAgICBjb25zdCB3ZnAgPSBlbnN1cmVXQVJDRmlsZU5hbWUod2FyY1BhdGgsIHRoaXMub3B0cy5nemlwKVxuXG4gICAgaWYgKCFmcykge1xuICAgICAgdGhpcy5fd2FyY091dFN0cmVhbSA9IHdhcmNQYXRoXG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXBwZW5kaW5nKSB7XG4gICAgICB0aGlzLl93YXJjT3V0U3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0od2ZwLCB7XG4gICAgICAgIGZsYWdzOiAnYScsXG4gICAgICAgIGVuY29kaW5nOiAndXRmOCdcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dhcmNPdXRTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh3ZnAsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KVxuICAgIH1cbiAgICB0aGlzLl93YXJjT3V0U3RyZWFtLm9uKCdmaW5pc2gnLCB0aGlzLl9vbkZpbmlzaClcbiAgICB0aGlzLl93YXJjT3V0U3RyZWFtLm9uKCdlcnJvcicsIHRoaXMuX29uRXJyb3IpXG4gICAgbGV0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgIHRoaXMuX25vdyA9IG5vdy5zdWJzdHIoMCwgbm93LmluZGV4T2YoJy4nKSkgKyAnWidcbiAgICB0aGlzLl9maWxlTmFtZSA9IFBhdGguYmFzZW5hbWUod2ZwKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRVUkkgLSBUaGUgdGFyZ2V0IFVSSSBmb3IgdGhlIHJlcXVlc3QgcmVzcG9uc2UgcmVjb3JkIHBhaXJzXG4gICAqIEBwYXJhbSB7e2hlYWRlcnM6IHN0cmluZywgZGF0YT86IEJ1ZmZlcnxzdHJpbmd9fSByZXFEYXRhIC0gVGhlIHJlcXVlc3QgZGF0YVxuICAgKiBAcGFyYW0ge3toZWFkZXJzOiBzdHJpbmcsIGRhdGE/OiBCdWZmZXJ8c3RyaW5nfX0gcmVzRGF0YSAtIFRoZSByZXNwb25zZSBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3cml0ZVJlcXVlc3RSZXNwb25zZVJlY29yZHMgKHRhcmdldFVSSSwgcmVxRGF0YSwgcmVzRGF0YSkge1xuICAgIGNvbnN0IHJlc1JlY0lkID0gdXVpZCgpXG4gICAgYXdhaXQgdGhpcy5fd3JpdGVSZXF1ZXN0UmVjb3JkKFxuICAgICAgdGFyZ2V0VVJJLFxuICAgICAgcmVzUmVjSWQsXG4gICAgICByZXFEYXRhLmhlYWRlcnMsXG4gICAgICByZXFEYXRhLmRhdGFcbiAgICApXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlUmVzcG9uc2VSZWNvcmQoXG4gICAgICB0YXJnZXRVUkksXG4gICAgICByZXNSZWNJZCxcbiAgICAgIHJlc0RhdGEuaGVhZGVycyxcbiAgICAgIHJlc0RhdGEuZGF0YVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBXcml0ZSBhcmJpdHJhcnkgbnVtYmVyIG9mIGl0ZW1zIHRvIHRoZSBXQVJDXG4gICAqIEBwYXJhbSB7QnVmZmVyW119IHJlY29yZFBhcnRzIC0gQXJyYXkgb2YgYnVmZmVycyB0byBiZSB3cml0dGVyblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd3JpdGVSZWNvcmRDaHVua3MgKC4uLnJlY29yZFBhcnRzKSB7XG4gICAgZm9yIChsZXQgY2h1bmsgb2YgcmVjb3JkUGFydHMpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVSZWNvcmRCbG9jayhjaHVuaylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgV3JpdGUgb3V0IHRoZSBXQVJDLVR5cGU6IGluZm8gcmVjb3Jkcy5cbiAgICogSWYgdGhlIGNvbnRlbnRzIGZvciB0aGUgaW5mbyByZWNvcmQgaXMgYW4gb2JqZWN0IHRoZW4gdGhlIG9iamVjdHMgcHJvcGVydGllcyAocHJvcGVydHksIHByb3BlcnR5IHZhbHVlIHBhaXJzKVxuICAgKiBhcmUgd3JpdHRlbiBvdGhlcndpc2UgKHdoZW4gQnVmZmVyIG9yIHN0cmluZykgdGhlIGNvbnRlbnQgaXMgd3JpdHRlbiBhcyBpc1xuICAgKiBAcGFyYW0ge09iamVjdHxCdWZmZXJ8c3RyaW5nfSB3aW5mbyAtIFRoZSBjb250ZW50cyBmb3IgdGhlIFdBUkMgaW5mbyByZWNvcmRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHdyaXRlV2FyY0luZm9SZWNvcmQgKHdpbmZvKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih3aW5mbykgfHwgdHlwZW9mIHdpbmZvID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMud3JpdGVXYXJjUmF3SW5mb1JlY29yZCh3aW5mbylcbiAgICB9XG4gICAgaWYgKHdpbmZvLnNvZnR3YXJlID09IG51bGwpIHtcbiAgICAgIHdpbmZvLnNvZnR3YXJlID0gYG5vZGUtd2FyYy8ke3RoaXMuX3ZlcnNpb259YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy53cml0ZVdhcmNSYXdJbmZvUmVjb3JkKFxuICAgICAgQnVmZmVyLmZyb20od2FyY0luZm9Db250ZW50KHdpbmZvKSwgJ3V0ZjgnKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBXcml0ZSB3YXJjLWluZm8gcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfEJ1ZmZlcn0gd2FyY0luZm9Db250ZW50IC0gVGhlIGNvbnRlbnRzIG9mIHRoZSB3YXJjLWluZm8gcmVjb3JkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICB3cml0ZVdhcmNSYXdJbmZvUmVjb3JkICh3YXJjSW5mb0NvbnRlbnQpIHtcbiAgICBsZXQgcmVjSURcbiAgICBpZiAodGhpcy5fd2FyY0luZm9JZCkge1xuICAgICAgcmVjSUQgPSB1dWlkKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fd2FyY0luZm9JZCA9IHJlY0lEID0gdXVpZCgpXG4gICAgfVxuICAgIGNvbnN0IHdoY3QgPSBCdWZmZXIuaXNCdWZmZXIod2FyY0luZm9Db250ZW50KVxuICAgICAgPyB3YXJjSW5mb0NvbnRlbnRcbiAgICAgIDogQnVmZmVyLmZyb20od2FyY0luZm9Db250ZW50LCAndXRmOCcpXG4gICAgY29uc3Qgd2ggPSBCdWZmZXIuZnJvbShcbiAgICAgIHdhcmNJbmZvSGVhZGVyKHtcbiAgICAgICAgZGF0ZTogdGhpcy5fbm93LFxuICAgICAgICBmaWxlTmFtZTogdGhpcy5fZmlsZU5hbWUsXG4gICAgICAgIGxlbjogd2hjdC5sZW5ndGgsXG4gICAgICAgIHJpZDogcmVjSURcbiAgICAgIH0pLFxuICAgICAgJ3V0ZjgnXG4gICAgKVxuICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gd2gubGVuZ3RoICsgd2hjdC5sZW5ndGggKyBXQVJDU2VwVFNpemVcbiAgICByZXR1cm4gdGhpcy53cml0ZVJlY29yZEJsb2NrKFxuICAgICAgQnVmZmVyLmNvbmNhdChbd2gsIENSTEZCdWZmZXIsIHdoY3QsIHJlY29yZFNlcGFyYXRvckJ1ZmZlcl0sIHRvdGFsTGVuZ3RoKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBXcml0ZXMgYSBXQVJDIEluZm8gcmVjb3JkIGNvbnRhaW5pbmcgV2VicmVjb3JkZXIvV2VicmVjb3JkZXIgUGxheWVyIGJvb2ttYXJrIChwYWdlIGxpc3QpXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz59IHBhZ2VzIC0gVGhlIFVSTCBvZiB0aGUgcGFnZSB0aGlzIFdBUkMgY29udGFpbnMgb3IgYW4gQXJyYXkgb2YgVVJMcyBmb3IgdGhlIHBhZ2VzXG4gICAqIHRoaXMgV0FSQyBjb250YWluc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgd3JpdGVXZWJyZWNvcmRlckJvb2ttYXJrc0luZm9SZWNvcmQgKHBhZ2VzKSB7XG4gICAgbGV0IHJlY0lEXG4gICAgaWYgKHRoaXMuX3dhcmNJbmZvSWQpIHtcbiAgICAgIHJlY0lEID0gdXVpZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dhcmNJbmZvSWQgPSByZWNJRCA9IHV1aWQoKVxuICAgIH1cbiAgICBjb25zdCB3aW5mb0NvbnRlbnQgPSB7XG4gICAgICBzb2Z0d2FyZTogYG5vZGUtd2FyYy8ke3RoaXMuX3ZlcnNpb259YCxcbiAgICAgICdqc29uLW1ldGFkYXRhJzogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkZXNjOiAnJyxcbiAgICAgICAgYXV0b190aXRsZTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3JlY29yZGluZycsXG4gICAgICAgIHBhZ2VzOiBBcnJheS5pc0FycmF5KHBhZ2VzKVxuICAgICAgICAgID8gcGFnZXMubWFwKHBhZ2UgPT4gKHsgdGltZXN0YW1wOiB0aGlzLl9ub3csIHVybDogcGFnZSB9KSlcbiAgICAgICAgICA6IFt7IHRpbWVzdGFtcDogdGhpcy5fbm93LCB1cmw6IHBhZ2VzIH1dXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCB3aGN0ID0gQnVmZmVyLmZyb20od2FyY0luZm9Db250ZW50KHdpbmZvQ29udGVudCksICd1dGY4JylcbiAgICBjb25zdCB3aCA9IEJ1ZmZlci5mcm9tKFxuICAgICAgd2FyY0luZm9IZWFkZXIoe1xuICAgICAgICBkYXRlOiB0aGlzLl9ub3csXG4gICAgICAgIGZpbGVOYW1lOiB0aGlzLl9maWxlTmFtZSxcbiAgICAgICAgbGVuOiB3aGN0Lmxlbmd0aCxcbiAgICAgICAgcmlkOiByZWNJRFxuICAgICAgfSksXG4gICAgICAndXRmOCdcbiAgICApXG4gICAgY29uc3QgdG90YWxMZW5ndGggPSB3aC5sZW5ndGggKyB3aGN0Lmxlbmd0aCArIFdBUkNTZXBUU2l6ZVxuICAgIHJldHVybiB0aGlzLndyaXRlUmVjb3JkQmxvY2soXG4gICAgICBCdWZmZXIuY29uY2F0KFt3aCwgQ1JMRkJ1ZmZlciwgd2hjdCwgcmVjb3JkU2VwYXJhdG9yQnVmZmVyXSwgdG90YWxMZW5ndGgpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFdyaXRlIFdBUkMtVHlwZTogbWV0YWRhdGEgZm9yIG91dGxpbmtzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRVUkkgLSBUaGUgdGFyZ2V0IFVSSSBmb3IgdGhlIG1ldGFkYXRhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3V0bGlua3MgLSBBIHN0cmluZyBjb250YWluaW5nIG91dGxpbmsgbWV0YWRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHdyaXRlV2FyY01ldGFkYXRhT3V0bGlua3MgKHRhcmdldFVSSSwgb3V0bGlua3MpIHtcbiAgICByZXR1cm4gdGhpcy53cml0ZVdhcmNNZXRhZGF0YSh0YXJnZXRVUkksIG91dGxpbmtzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFdyaXRlIFdBUkMtVHlwZTogbWV0YWRhdGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRVUkkgLSBUaGUgVVJMIG9mIHRoZSBwYWdlIHRoZSB0aGlzIG1ldGFkYXRhIHJlY29yZCBpcyBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBtZXRhRGF0YSAtIEEgc3RyaW5nIG9yIGJ1ZmZlciBjb250YWluaW5nIG1ldGFkYXRhIGluZm9ybWF0aW9uIHRvIGJlIHVzZWQgYXMgdGhpcyByZWNvcmRzIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHdyaXRlV2FyY01ldGFkYXRhICh0YXJnZXRVUkksIG1ldGFEYXRhKSB7XG4gICAgY29uc3Qgd21oYyA9IEJ1ZmZlci5pc0J1ZmZlcihtZXRhRGF0YSlcbiAgICAgID8gbWV0YURhdGFcbiAgICAgIDogQnVmZmVyLmZyb20obWV0YURhdGEsICd1dGY4JylcbiAgICBjb25zdCB3bWggPSBCdWZmZXIuZnJvbShcbiAgICAgIHdhcmNNZXRhZGF0YUhlYWRlcih7XG4gICAgICAgIHRhcmdldFVSSSxcbiAgICAgICAgbm93OiB0aGlzLl9ub3csXG4gICAgICAgIGxlbjogd21oYy5sZW5ndGgsXG4gICAgICAgIGNvbmN1cnJlbnRUbzogdGhpcy5fd2FyY0luZm9JZCxcbiAgICAgICAgcmlkOiB1dWlkKClcbiAgICAgIH0pLFxuICAgICAgJ3V0ZjgnXG4gICAgKVxuICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gd21oYy5sZW5ndGggKyB3bWgubGVuZ3RoICsgV0FSQ1NlcFRTaXplXG4gICAgcmV0dXJuIHRoaXMud3JpdGVSZWNvcmRCbG9jayhcbiAgICAgIEJ1ZmZlci5jb25jYXQoW3dtaCwgQ1JMRkJ1ZmZlciwgd21oYywgcmVjb3JkU2VwYXJhdG9yQnVmZmVyXSwgdG90YWxMZW5ndGgpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFdyaXRlIEEgUmVxdWVzdCBSZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldFVSSSAtIFRoZSBVUkwgb2YgdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodHRwSGVhZGVyU3RyaW5nIC0gU3RyaW5naWZpZWQgSFRUUCBoZWFkZXJzXG4gICAqIEBwYXJhbSB7c3RyaW5nfEJ1ZmZlcn0gW3JlcXVlc3REYXRhXSAtIEJvZHkgb2YgdGhlIHJlcXVlc3QgaWYgYW55XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICB3cml0ZVJlcXVlc3RSZWNvcmQgKHRhcmdldFVSSSwgaHR0cEhlYWRlclN0cmluZywgcmVxdWVzdERhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGVSZXF1ZXN0UmVjb3JkKFxuICAgICAgdGFyZ2V0VVJJLFxuICAgICAgbnVsbCxcbiAgICAgIGh0dHBIZWFkZXJTdHJpbmcsXG4gICAgICByZXF1ZXN0RGF0YVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBXcml0ZSBBIFJlc3BvbnNlIFJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0VVJJIC0gVGhlIFVSTCBvZiB0aGUgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGh0dHBIZWFkZXJTdHJpbmcgLSBTdHJpbmdpZmllZCBIVFRQIGhlYWRlcnNcbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBbcmVzcG9uc2VEYXRhXSAtIFRoZSByZXNwb25zZSBib2R5IGlmIGl0IGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgd3JpdGVSZXNwb25zZVJlY29yZCAodGFyZ2V0VVJJLCBodHRwSGVhZGVyU3RyaW5nLCByZXNwb25zZURhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGVSZXNwb25zZVJlY29yZChcbiAgICAgIHRhcmdldFVSSSxcbiAgICAgIHV1aWQoKSxcbiAgICAgIGh0dHBIZWFkZXJTdHJpbmcsXG4gICAgICByZXNwb25zZURhdGFcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgV3JpdGUgYW4gcmVjb3JkIGJsb2NrIHRvIHRoZSBXQVJDXG4gICAqIEBwYXJhbSB7QnVmZmVyfSByZWNvcmRCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHdyaXRlUmVjb3JkQmxvY2sgKHJlY29yZEJ1ZmZlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRzLmd6aXApIHtcbiAgICAgICAgLy8gd2UncmUgaW4gZ3ppcHBlZCBtb2RlIC0gR1ppcCB0aGUgYnVmZmVyXG4gICAgICAgIHJlY29yZEJ1ZmZlciA9IHpsaWIuZ3ppcFN5bmMocmVjb3JkQnVmZmVyKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX3dhcmNPdXRTdHJlYW0ud3JpdGUocmVjb3JkQnVmZmVyLCAndXRmOCcpKSB7XG4gICAgICAgIHRoaXMuX3dhcmNPdXRTdHJlYW0ub25jZSgnZHJhaW4nLCByZXNvbHZlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBDbG9zZSAgdGhlIHVuZGVybHlpbmcgZmlsZXN0cmVhbSB0byB0aGUgV0FSQyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbi5cbiAgICogVGhlIGBmaW5pc2hlZGAgZXZlbnQgd2lsbCBub3QgYmUgZW1pdHRlZCB1bnRpbCB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWRcbiAgICovXG4gIGVuZCAoKSB7XG4gICAgaWYgKHRoaXMuX3dhcmNPdXRTdHJlYW0gIT0gbnVsbCkge1xuICAgICAgdGhpcy5fd2FyY091dFN0cmVhbS5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBXcml0ZSBBIFJlcXVlc3QgUmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRVUkkgLSBUaGUgVVJMIG9mIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHJlc0lkIC0gVGhlIGlkIG9mIHRoZSByZWNvcmQgdGhpcyByZXF1ZXN0IHJlY29ycmQgaXMgY29uY3VycmVudCB0bywgdHlwaWNhbGx5IGl0cyByZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaHR0cEhlYWRlclN0cmluZyAtIFN0cmluZ2lmaWVkIEhUVFAgaGVhZGVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IFtyZXF1ZXN0RGF0YV0gLSBCb2R5IG9mIHRoZSByZXF1ZXN0IGlmIGFueVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgX3dyaXRlUmVxdWVzdFJlY29yZCAodGFyZ2V0VVJJLCByZXNJZCwgaHR0cEhlYWRlclN0cmluZywgcmVxdWVzdERhdGEpIHtcbiAgICBjb25zdCByZXFIZWFkQ29udGVudEJ1ZmZlciA9IG1ha2VDb250ZW50QnVmZmVyKFxuICAgICAgaHR0cEhlYWRlclN0cmluZyxcbiAgICAgIHJlcXVlc3REYXRhXG4gICAgKVxuICAgIGNvbnN0IHJlcVdIZWFkZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIHdhcmNSZXF1ZXN0SGVhZGVyKHtcbiAgICAgICAgdGFyZ2V0VVJJLFxuICAgICAgICBjb25jdXJyZW50VG86IHJlc0lkLFxuICAgICAgICBub3c6IHRoaXMuX25vdyxcbiAgICAgICAgcmlkOiB1dWlkKCksXG4gICAgICAgIHdpZDogdGhpcy5fd2FyY0luZm9JZCxcbiAgICAgICAgbGVuOiByZXFIZWFkQ29udGVudEJ1ZmZlci5sZW5ndGhcbiAgICAgIH0pLFxuICAgICAgJ3V0ZjgnXG4gICAgKVxuICAgIGNvbnN0IHRvdGFsTGVuZ3RoID1cbiAgICAgIHJlcVdIZWFkZXIubGVuZ3RoICsgcmVxSGVhZENvbnRlbnRCdWZmZXIubGVuZ3RoICsgV0FSQ1NlcFRTaXplXG4gICAgcmV0dXJuIHRoaXMud3JpdGVSZWNvcmRCbG9jayhcbiAgICAgIEJ1ZmZlci5jb25jYXQoXG4gICAgICAgIFtyZXFXSGVhZGVyLCBDUkxGQnVmZmVyLCByZXFIZWFkQ29udGVudEJ1ZmZlciwgcmVjb3JkU2VwYXJhdG9yQnVmZmVyXSxcbiAgICAgICAgdG90YWxMZW5ndGhcbiAgICAgIClcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgV3JpdGUgQSBSZXNwb25zZSBSZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldFVSSSAtIFRoZSBVUkwgb2YgdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNJZCAtIFRoZSBpZCB0byBiZSB1c2VkIGZvciB0aGUgcmVzcG9uc2UgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodHRwSGVhZGVyU3RyaW5nIC0gU3RyaW5naWZpZWQgSFRUUCBoZWFkZXJzXG4gICAqIEBwYXJhbSB7c3RyaW5nfEJ1ZmZlcn0gW3Jlc3BvbnNlRGF0YV0gLSBUaGUgcmVzcG9uc2UgYm9keSBpZiBpdCBleGlzdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIF93cml0ZVJlc3BvbnNlUmVjb3JkICh0YXJnZXRVUkksIHJlc0lkLCBodHRwSGVhZGVyU3RyaW5nLCByZXNwb25zZURhdGEpIHtcbiAgICBjb25zdCByZXNIZWFkZXJDb250ZW50QnVmZmVyID0gbWFrZUNvbnRlbnRCdWZmZXIoXG4gICAgICBodHRwSGVhZGVyU3RyaW5nLFxuICAgICAgcmVzcG9uc2VEYXRhXG4gICAgKVxuICAgIGNvbnN0IHJlc3BXSGVhZGVyID0gQnVmZmVyLmZyb20oXG4gICAgICB3YXJjUmVzcG9uc2VIZWFkZXIoe1xuICAgICAgICB0YXJnZXRVUkksXG4gICAgICAgIG5vdzogdGhpcy5fbm93LFxuICAgICAgICByaWQ6IHJlc0lkLFxuICAgICAgICB3aWQ6IHRoaXMuX3dhcmNJbmZvSWQsXG4gICAgICAgIGxlbjogcmVzSGVhZGVyQ29udGVudEJ1ZmZlci5sZW5ndGhcbiAgICAgIH0pLFxuICAgICAgJ3V0ZjgnXG4gICAgKVxuICAgIGNvbnN0IHRvdGFsTGVuZ3RoID1cbiAgICAgIHJlc3BXSGVhZGVyLmxlbmd0aCArIHJlc0hlYWRlckNvbnRlbnRCdWZmZXIubGVuZ3RoICsgV0FSQ1NlcFRTaXplXG4gICAgcmV0dXJuIHRoaXMud3JpdGVSZWNvcmRCbG9jayhcbiAgICAgIEJ1ZmZlci5jb25jYXQoXG4gICAgICAgIFtcbiAgICAgICAgICByZXNwV0hlYWRlcixcbiAgICAgICAgICBDUkxGQnVmZmVyLFxuICAgICAgICAgIHJlc0hlYWRlckNvbnRlbnRCdWZmZXIsXG4gICAgICAgICAgcmVjb3JkU2VwYXJhdG9yQnVmZmVyXG4gICAgICAgIF0sXG4gICAgICAgIHRvdGFsTGVuZ3RoXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIENhbGxlZCB3aGVuIHRoZSBXQVJDIGdlbmVyYXRpb24gaXMgZmluaXNoZWRcbiAgICogQGVtaXRzIHtmaW5pc2hlZH0gZW1pdHRlZCB3aGVuIFdBUkMgZ2VuZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uRmluaXNoICgpIHtcbiAgICBsZXQgbGUgPSB0aGlzLl9sYXN0RXJyb3JcbiAgICB0aGlzLl9sYXN0RXJyb3IgPSBudWxsXG4gICAgdGhpcy5fd2FyY091dFN0cmVhbS5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgIHRoaXMuX3dhcmNPdXRTdHJlYW0uZGVzdHJveSgpXG4gICAgdGhpcy5fd2FyY091dFN0cmVhbSA9IG51bGxcbiAgICB0aGlzLl9ub3cgPSBudWxsXG4gICAgdGhpcy5fZmlsZU5hbWUgPSBudWxsXG4gICAgdGhpcy5fd2FyY0luZm9JZCA9IG51bGxcbiAgICBpZiAobGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZmluaXNoZWQnLCBsZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCdmaW5pc2hlZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEVtaXRzIGFuIGVycm9yIGlmIG9uZSBvY2N1cnNcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gICAqIEBlbWl0cyB7ZXJyb3J9IFRoZSBlcnJvciB0aGF0IG9jY3VycmVkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25FcnJvciAoZXJyKSB7XG4gICAgdGhpcy5fbGFzdEVycm9yID0gZXJyXG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDV3JpdGVyQmFzZX1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBXQVJDV3JpdGVyQmFzZVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdBUkNGaWxlT3B0c1xuICogQHByb3BlcnR5IHtib29sZWFufSBbYXBwZW5kaW5nXSAtIFNob3VsZCB0aGUgV0FSQyB3cml0ZXIgYXBwZW5kIHRvIGFuIGV4aXN0aW5nIHdhcmM/XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtnemlwXSAtIFNob3VsZCB0aGUgV0FSQyB3cml0ZXIgZ2VuZXJhdGUgZ3ppcGVkIHJlY29yZHM/XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXQVJDSW5pdE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3YXJjUGF0aCAtIFBhdGggdGhlIHdhcmMgZmlsZSB0byBiZSB3cml0dGVuIHRvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthcHBlbmRpbmddIC0gU2hvdWxkIHRoZSBXQVJDIHdyaXRlciBhcHBlbmQgdG8gYW4gZXhpc3Rpbmcgd2FyYz9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2d6aXBdIC0gU2hvdWxkIHRoZSBXQVJDIHdyaXRlciBnZW5lcmF0ZSBnemlwZWQgcmVjb3Jkcz9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0VVJJIC0gVGhlIHRhcmdldCBVUkkgZm9yIHRoZSBtZXRhZGF0YSByZWNvcmRcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xCdWZmZXJ9IFtjb250ZW50XSAtIFRoZSBjb250ZW50cyBvZiB0aGUgbWV0YWRhdGEgcmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXQVJDR2VuT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd8QXJyYXk8c3RyaW5nPn0gcGFnZXMgLSBUaGUgVVJMIG9mIHRoZSBwYWdlIHRoaXMgV0FSQyBjb250YWlucyBvciBhbiBBcnJheSBvZlxuICogVVJMcyBmb3IgdGhlIHBhZ2VzIHRoaXMgV0FSQyBjb250YWlucy4gVXNlZCB0byB3cml0ZSBhIFdBUkMgSW5mbyByZWNvcmQgY29udGFpbmluZ1xuICogV2VicmVjb3JkZXIgUGxheWVyIGNvbXBhdGlibGUgYm9va21hcmsgbGlzdFxuICogQHByb3BlcnR5IHtXQVJDSW5pdE9wdHN9IHdhcmNPcHRzIC0gT3B0aW9ucyBmb3IgdGhlIHdyaXRpbmcgb2YgdGhlIFdBUkMgZmlsZVxuICogQHByb3BlcnR5IHtPYmplY3R8QnVmZmVyfHN0cmluZ30gW3dpbmZvXSAtIE9wdGlvbmFsIGNvbnRlbnRzIGZvciB0aGUgV0FSQyBpbmZvIHJlY29yZFxuICogQHByb3BlcnR5IHtNZXRhZGF0YX0gW21ldGFkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIGNvbnRlbnRzXG4gKi9cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBkZXNjIFJlZ2V4IGZvciByZW1vdmluZyB0aGUgY29udGVudCBlbmNvZGluZyBIVFRQIGhlYWRlclxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuY29uc3Qgbm9HWiA9IC9Db250ZW50LUVuY29kaW5nLiooPzpnemlwfGJyfGRlZmxhdGUpXFxyXFxuL2dpXG5cbi8qKlxuICogQGRlc2MgUmVnZXggZm9yIHJld3JpdGluZyB0aGUgY29udGVudCBsZW5ndGggSFRUUCBoZWFkZXJcbiAqIEB0eXBlIHtSZWdFeHB9XG4gKi9cbmNvbnN0IHJlcGxhY2VDb250ZW50TGVuID0gL0NvbnRlbnQtTGVuZ3RoOi4qXFxyXFxuL2dpXG5cbi8qKlxuICogQHR5cGUge3tub0daOiBSZWdFeHAsIHJlcGxhY2VDb250ZW50TGVuOiBSZWdFeHB9fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbm9HWixcbiAgcmVwbGFjZUNvbnRlbnRMZW5cbn1cbiIsIlxubGV0IGZzID0gbnVsbDtcbmxldCB1bnRpbGRpZnkgPSBudWxsO1xubGV0IGhhc0ZTID0gbnVsbDtcblxudHJ5IHtcbiAgICB1bnRpbGRpZnkgPSByZXF1aXJlKCd1bnRpbGRpZnknKVxuICAgIGZzID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuICAgIGhhc0ZTID0gdHJ1ZTtcbn0gY2F0Y2ggKGUpIHtcbiAgICBoYXNGUyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJlYW0od3AsIHVzZVVudGlsZGlmeSkge1xuICAgIGlmIChoYXNGUykge1xuICAgICAgICBpZiAodXNlVW50aWxkaWZ5KSB7XG4gICAgICAgICAgICB3cCA9IHVudGlsZGlmeSh3cCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnMuY3JlYXRlUmVhZFN0cmVhbSh3cCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdwO1xufVxuXG4vL21vZHVsZS5leHBvcnRzID0gZ2V0U3RyZWFtO1xuZXhwb3J0IHsgZ2V0U3RyZWFtLCBmcywgdW50aWxkaWZ5IH07XG5cbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbmV4cG9ydHMuU3RyZWFtID0gZXhwb3J0cztcbmV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbmV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbmV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIndXNlIHN0cmljdCdcbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgUmVjb3JkQnVpbGRlciA9IHJlcXVpcmUoJy4uL3dhcmNSZWNvcmQvYnVpbGRlcicpXG5jb25zdCB7IGNybGYgfSA9IHJlcXVpcmUoJy4uL3dhcmNSZWNvcmQvZmllbGRJZGVudGlmaWVycycpXG5cbi8qKlxuICogQGRlc2MgVHJhbnNmb3JtcyBhIFdBUkMgZmlsZSBSZWFkU3RyZWFtIGludG8gaXRzIGluZGl2aWR1YWwge0BsaW5rIFdBUkNSZWNvcmR9c1xuICogQGV4dGVuZHMge1RyYW5zZm9ybX1cbiAqIEBleGFtcGxlXG4gKiAgZnMuY3JlYXRlUmVhZFN0cmVhbSgnc29tZVdBUkMud2FyYycpXG4gKiAgICAucGlwZShuZXcgV0FSQ1N0cmVhbVRyYW5zZm9ybSgpKVxuICogICAgLm9uKCdkYXRhJywgcmVjb3JkID0+IHsgY29uc29sZS5sb2cocmVjb3JkKSB9KVxuICogQGV4YW1wbGVcbiAqICBmcy5jcmVhdGVSZWFkU3RyZWFtKCdzb21lV0FSQy53YXJjLmd6JylcbiAqICAgIC5waXBlKHpsaWIuY3JlYXRlR3VuemlwKCkpXG4gKiAgICAucGlwZShuZXcgV0FSQ1N0cmVhbVRyYW5zZm9ybSgpKVxuICogICAgLm9uKCdkYXRhJywgcmVjb3JkID0+IHsgY29uc29sZS5sb2cocmVjb3JkKSB9KVxuICovXG5jbGFzcyBXQVJDU3RyZWFtVHJhbnNmb3JtIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIEBkZXNjIENyZWF0ZSBhIG5ldyBXQVJDU3RyZWFtVHJhbnNmb3JtXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgcmVhZGFibGVPYmplY3RNb2RlOiB0cnVlXG4gICAgfSlcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7P0J1ZmZlcn1cbiAgICAgKi9cbiAgICB0aGlzLmJ1ZmZlcmVkID0gdW5kZWZpbmVkXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVjb3JkQnVpbGRlcn1cbiAgICAgKi9cbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgUmVjb3JkQnVpbGRlcigpXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuc2VwTGVuID0gY3JsZi5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBQcm9jZXNzIHRoZSBzdXBwbGllZCBjaHVua1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgIC0gVGhlIGNodW5rIHRvIGJlIHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBkb25lIC0gRnVuY3Rpb24gdXNlZCB0byBpbmRpY2F0ZSB3ZSBhcmUgZG9uZSBwcm9jZXNzaW5nIHRoZSBjaHVua1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwdXNoTGFzdF0gLSBCb29sZWFuIGluZGljYXRpbmcgaWYgd2UgYXR0ZW1wdCB0byBidWlsZCBhIHJlY29yZCBhbmQgcHVzaCBpdCBvbmNlXG4gICAqIHdlIGFyZSBkb25lIHByb2Nlc3NpbmcgdGhlIGNodW5rIElGRiBhIHJlY29yZCB3YXMgYnVpbHQuIElzIG9ubHkgdHJ1ZSB3aGVuIGNhbGxlZCBmcm9tIHtAbGluayBfZmx1c2h9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY29uc3VtZUNodW5rIChjaHVuaywgZG9uZSwgcHVzaExhc3QpIHtcbiAgICBsZXQgb2Zmc2V0ID0gMFxuICAgIGxldCBsYXN0TWF0Y2ggPSAwXG4gICAgbGV0IGlkeFxuICAgIGxldCBtYXliZVJlY29yZFxuICAgIGxldCBjaHVua0xlbiA9IGNodW5rLmxlbmd0aFxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZHggPSBvZmZzZXQgPj0gY2h1bmtMZW4gPyAtMSA6IGNodW5rLmluZGV4T2YoY3JsZiwgb2Zmc2V0KVxuICAgICAgaWYgKGlkeCAhPT0gLTEgJiYgaWR4IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgIG1heWJlUmVjb3JkID0gdGhpcy5idWlsZGVyLmNvbnN1bWVMaW5lKFxuICAgICAgICAgIGNodW5rLnNsaWNlKGxhc3RNYXRjaCwgaWR4ICsgdGhpcy5zZXBMZW4pXG4gICAgICAgIClcbiAgICAgICAgaWYgKG1heWJlUmVjb3JkICE9IG51bGwpIHRoaXMucHVzaChtYXliZVJlY29yZClcbiAgICAgICAgb2Zmc2V0ID0gaWR4ICsgdGhpcy5zZXBMZW5cbiAgICAgICAgbGFzdE1hdGNoID0gb2Zmc2V0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1ZmZlcmVkID0gY2h1bmsuc2xpY2UobGFzdE1hdGNoKVxuICAgICAgICBpZiAocHVzaExhc3QpIHtcbiAgICAgICAgICBtYXliZVJlY29yZCA9IHRoaXMuYnVpbGRlci5jb25zdW1lTGluZSh0aGlzLmJ1ZmZlcmVkKVxuICAgICAgICAgIGlmIChtYXliZVJlY29yZCkge1xuICAgICAgICAgICAgdGhpcy5wdXNoKG1heWJlUmVjb3JkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBtYXliZVJlY29yZCA9IHRoaXMuYnVpbGRlci5idWlsZFJlY29yZCgpXG4gICAgICAgICAgaWYgKG1heWJlUmVjb3JkKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2gobWF5YmVSZWNvcmQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGRvbmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFByb2Nlc3MgYSBjaHVua1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmIC0gVGhlIGNodW5rIHRvIGJlIHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5jIC0gVGhlIGVuY29kaW5nIG9mIHRoZSBjaHVua1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBkb25lIC0gRnVuY3Rpb24gdXNlZCB0byBpbmRpY2F0ZSB3ZSBhcmUgZG9uZSBwcm9jZXNzaW5nIHRoZSBjaHVua1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RyYW5zZm9ybSAoYnVmLCBlbmMsIGRvbmUpIHtcbiAgICBsZXQgY2h1bmtcbiAgICBpZiAodGhpcy5idWZmZXJlZCkge1xuICAgICAgY2h1bmsgPSBCdWZmZXIuY29uY2F0KFxuICAgICAgICBbdGhpcy5idWZmZXJlZCwgYnVmXSxcbiAgICAgICAgdGhpcy5idWZmZXJlZC5sZW5ndGggKyBidWYubGVuZ3RoXG4gICAgICApXG4gICAgICB0aGlzLmJ1ZmZlcmVkID0gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIGNodW5rID0gYnVmXG4gICAgfVxuICAgIHRoaXMuX2NvbnN1bWVDaHVuayhjaHVuaywgZG9uZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBGbHVzaGVzIGFueSByZW1haW5pbmcgZGF0YVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBkb25lIC0gRnVuY3Rpb24gdXNlZCB0byBpbmRpY2F0ZSB3ZSBhcmUgZG9uZSBwcm9jZXNzaW5nIHRoZSBjaHVua1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZsdXNoIChkb25lKSB7XG4gICAgaWYgKHRoaXMuYnVmZmVyZWQpIHtcbiAgICAgIHRoaXMuX2NvbnN1bWVDaHVuayh0aGlzLmJ1ZmZlcmVkLCBkb25lLCB0cnVlKVxuICAgIH1cbiAgICBkb25lKClcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDU3RyZWFtVHJhbnNmb3JtfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IFdBUkNTdHJlYW1UcmFuc2Zvcm1cbiIsIi8qKlxuICogQHR5cGUge2Jvb2xlYW59XG4gKi9cbmxldCBhc3luY0dlbkZucyA9IHRydWVcbnRyeSB7XG4gIG5ldyBGdW5jdGlvbignYXN5bmMgZnVuY3Rpb24qIHRlc3QoKXt5aWVsZCBhd2FpdCBQcm9taXNlLnJlc29sdmUoMSl9Jylcbn0gY2F0Y2ggKGVycm9yKSB7XG4gIGFzeW5jR2VuRm5zID0gZmFsc2Vcbn1cblxuLyoqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhc3luY0dlbkZucyAmJiB0eXBlb2YgU3ltYm9sLmFzeW5jSXRlcmF0b3IgIT09ICd1bmRlZmluZWQnXG4iLCIndXNlIHN0cmljdCdcbmNvbnN0IFdBUkNTdHJlYW1UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL3dhcmNTdHJlYW1UcmFuc2Zvcm0nKVxuXG4vKipcbiAqIEBkZXNjIENyZWF0ZXMgYXN5bmMgaXRlcmF0b3IgdGhhdCB5aWVsZHMge0BsaW5rIFdBUkNSZWNvcmR9cyBnaXZlbiBhIHJlYWRhYmxlIHN0cmVhbSBvZiBhIFdBUkMgZmlsZVxuICogQHBhcmFtIHtSZWFkU3RyZWFtfEd1bnppcH0gd2FyY1N0cmVhbVxuICogQHJldHVybnMge0FzeW5jSXRlcmF0b3I8V0FSQ1JlY29yZD59XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgZnVuY3Rpb24gKiByZWNvcmRJdGVyYXRvciAod2FyY1N0cmVhbSkge1xuICBjb25zdCByZWNvcmRTdHJlYW0gPSB3YXJjU3RyZWFtLnBpcGUobmV3IFdBUkNTdHJlYW1UcmFuc2Zvcm0oKSlcbiAgY29uc3QgcmVjb3JkSXRlcmF0b3IgPSByZWNvcmRTdHJlYW1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgbGV0IG5leHRSZWNvcmRcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBuZXh0UmVjb3JkID0gYXdhaXQgcmVjb3JkSXRlcmF0b3IubmV4dCgpXG4gICAgaWYgKG5leHRSZWNvcmQuZG9uZSkgYnJlYWtcbiAgICB5aWVsZCBuZXh0UmVjb3JkLnZhbHVlXG4gIH1cbn1cbiIsInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwdW55Y29kZSA9IHJlcXVpcmUoJ3B1bnljb2RlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5leHBvcnRzLnBhcnNlID0gdXJsUGFyc2U7XG5leHBvcnRzLnJlc29sdmUgPSB1cmxSZXNvbHZlO1xuZXhwb3J0cy5yZXNvbHZlT2JqZWN0ID0gdXJsUmVzb2x2ZU9iamVjdDtcbmV4cG9ydHMuZm9ybWF0ID0gdXJsRm9ybWF0O1xuXG5leHBvcnRzLlVybCA9IFVybDtcblxuZnVuY3Rpb24gVXJsKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbDtcbiAgdGhpcy5zbGFzaGVzID0gbnVsbDtcbiAgdGhpcy5hdXRoID0gbnVsbDtcbiAgdGhpcy5ob3N0ID0gbnVsbDtcbiAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgdGhpcy5ob3N0bmFtZSA9IG51bGw7XG4gIHRoaXMuaGFzaCA9IG51bGw7XG4gIHRoaXMuc2VhcmNoID0gbnVsbDtcbiAgdGhpcy5xdWVyeSA9IG51bGw7XG4gIHRoaXMucGF0aG5hbWUgPSBudWxsO1xuICB0aGlzLnBhdGggPSBudWxsO1xuICB0aGlzLmhyZWYgPSBudWxsO1xufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxudmFyIHByb3RvY29sUGF0dGVybiA9IC9eKFthLXowLTkuKy1dKzopL2ksXG4gICAgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvLFxuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuICAgIHNpbXBsZVBhdGhQYXR0ZXJuID0gL14oXFwvXFwvPyg/IVxcLylbXlxcP1xcc10qKShcXD9bXlxcc10qKT8kLyxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4gICAgLy8gV2UgYWN0dWFsbHkganVzdCBhdXRvLWVzY2FwZSB0aGVzZS5cbiAgICBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXSxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGZvciB2YXJpb3VzIHJlYXNvbnMuXG4gICAgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpLFxuXG4gICAgLy8gQWxsb3dlZCBieSBSRkNzLCBidXQgY2F1c2Ugb2YgWFNTIGF0dGFja3MuICBBbHdheXMgZXNjYXBlIHRoZXNlLlxuICAgIGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpLFxuICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUuXG4gICAgLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuICAgIC8vIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuICAgIC8vIHRoZW0uXG4gICAgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSksXG4gICAgaG9zdEVuZGluZ0NoYXJzID0gWycvJywgJz8nLCAnIyddLFxuICAgIGhvc3RuYW1lTWF4TGVuID0gMjU1LFxuICAgIGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlsrYS16MC05QS1aXy1dezAsNjN9JC8sXG4gICAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbK2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4gICAgdW5zYWZlUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBuZXZlciBoYXZlIGEgaG9zdG5hbWUuXG4gICAgaG9zdGxlc3NQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuICAgIHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgICAgICdodHRwJzogdHJ1ZSxcbiAgICAgICdodHRwcyc6IHRydWUsXG4gICAgICAnZnRwJzogdHJ1ZSxcbiAgICAgICdnb3BoZXInOiB0cnVlLFxuICAgICAgJ2ZpbGUnOiB0cnVlLFxuICAgICAgJ2h0dHA6JzogdHJ1ZSxcbiAgICAgICdodHRwczonOiB0cnVlLFxuICAgICAgJ2Z0cDonOiB0cnVlLFxuICAgICAgJ2dvcGhlcjonOiB0cnVlLFxuICAgICAgJ2ZpbGU6JzogdHJ1ZVxuICAgIH0sXG4gICAgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG5mdW5jdGlvbiB1cmxQYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICh1cmwgJiYgdXRpbC5pc09iamVjdCh1cmwpICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybDtcblxuICB2YXIgdSA9IG5ldyBVcmw7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24odXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAoIXV0aWwuaXNTdHJpbmcodXJsKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHVybCk7XG4gIH1cblxuICAvLyBDb3B5IGNocm9tZSwgSUUsIG9wZXJhIGJhY2tzbGFzaC1oYW5kbGluZyBiZWhhdmlvci5cbiAgLy8gQmFjayBzbGFzaGVzIGJlZm9yZSB0aGUgcXVlcnkgc3RyaW5nIGdldCBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG4gIHZhciBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKSxcbiAgICAgIHNwbGl0dGVyID1cbiAgICAgICAgICAocXVlcnlJbmRleCAhPT0gLTEgJiYgcXVlcnlJbmRleCA8IHVybC5pbmRleE9mKCcjJykpID8gJz8nIDogJyMnLFxuICAgICAgdVNwbGl0ID0gdXJsLnNwbGl0KHNwbGl0dGVyKSxcbiAgICAgIHNsYXNoUmVnZXggPSAvXFxcXC9nO1xuICB1U3BsaXRbMF0gPSB1U3BsaXRbMF0ucmVwbGFjZShzbGFzaFJlZ2V4LCAnLycpO1xuICB1cmwgPSB1U3BsaXQuam9pbihzcGxpdHRlcik7XG5cbiAgdmFyIHJlc3QgPSB1cmw7XG5cbiAgLy8gdHJpbSBiZWZvcmUgcHJvY2VlZGluZy5cbiAgLy8gVGhpcyBpcyB0byBzdXBwb3J0IHBhcnNlIHN0dWZmIGxpa2UgXCIgIGh0dHA6Ly9mb28uY29tICBcXG5cIlxuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIHZhciBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgICBpZiAoc2ltcGxlUGF0aCkge1xuICAgICAgdGhpcy5wYXRoID0gcmVzdDtcbiAgICAgIHRoaXMuaHJlZiA9IHJlc3Q7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXTtcbiAgICAgIGlmIChzaW1wbGVQYXRoWzJdKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc2ltcGxlUGF0aFsyXTtcbiAgICAgICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2guc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgLy8gdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAvLyByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gIC8vIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAgIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG5cbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgIC8vIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpO1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIH1cblxuICAgIC8vIHRoZSBob3N0IGlzIHRoZSByZW1haW5pbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IG5vbi1ob3N0IGNoYXJcbiAgICBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSlcbiAgICAgIGhvc3RFbmQgPSByZXN0Lmxlbmd0aDtcblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG5cbiAgICAvLyBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgIC8vIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgIHZhciBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICB2YXIgbmV3cGFydCA9ICcnO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8vIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnljb2RlZCByZXByZXNlbnRhdGlvbiBvZiBcImRvbWFpblwiLlxuICAgICAgLy8gSXQgb25seSBjb252ZXJ0cyBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgdGhhdFxuICAgICAgLy8gaGF2ZSBub24tQVNDSUkgY2hhcmFjdGVycywgaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZlxuICAgICAgLy8geW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0IGFscmVhZHkgaXMgQVNDSUktb25seS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBwdW55Y29kZS50b0FTQ0lJKHRoaXMuaG9zdG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zdWJzdHIoMSwgdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIGlmIChyZXN0WzBdICE9PSAnLycpIHtcbiAgICAgICAgcmVzdCA9ICcvJyArIHJlc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJlc3QgaXMgc2V0IHRvIHRoZSBwb3N0LWhvc3Qgc3R1ZmYuXG4gIC8vIGNob3Agb2ZmIGFueSBkZWxpbSBjaGFycy5cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLy8gRmlyc3QsIG1ha2UgMTAwJSBzdXJlIHRoYXQgYW55IFwiYXV0b0VzY2FwZVwiIGNoYXJzIGdldFxuICAgIC8vIGVzY2FwZWQsIGV2ZW4gaWYgZW5jb2RlVVJJQ29tcG9uZW50IGRvZXNuJ3QgdGhpbmsgdGhleVxuICAgIC8vIG5lZWQgdG8gYmUuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhdXRvRXNjYXBlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGFlID0gYXV0b0VzY2FwZVtpXTtcbiAgICAgIGlmIChyZXN0LmluZGV4T2YoYWUpID09PSAtMSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YXIgZXNjID0gZW5jb2RlVVJJQ29tcG9uZW50KGFlKTtcbiAgICAgIGlmIChlc2MgPT09IGFlKSB7XG4gICAgICAgIGVzYyA9IGVzY2FwZShhZSk7XG4gICAgICB9XG4gICAgICByZXN0ID0gcmVzdC5zcGxpdChhZSkuam9pbihlc2MpO1xuICAgIH1cbiAgfVxuXG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgdmFyIGhhc2ggPSByZXN0LmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHRoaXMuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpO1xuICB9XG4gIHZhciBxbSA9IHJlc3QuaW5kZXhPZignPycpO1xuICBpZiAocW0gIT09IC0xKSB7XG4gICAgdGhpcy5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSk7XG4gICAgdGhpcy5xdWVyeSA9IHJlc3Quc3Vic3RyKHFtICsgMSk7XG4gICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnF1ZXJ5KTtcbiAgICB9XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgcW0pO1xuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICB9XG4gIGlmIChyZXN0KSB0aGlzLnBhdGhuYW1lID0gcmVzdDtcbiAgaWYgKHNsYXNoZWRQcm90b2NvbFtsb3dlclByb3RvXSAmJlxuICAgICAgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gIGlmICh0aGlzLnBhdGhuYW1lIHx8IHRoaXMuc2VhcmNoKSB7XG4gICAgdmFyIHAgPSB0aGlzLnBhdGhuYW1lIHx8ICcnO1xuICAgIHZhciBzID0gdGhpcy5zZWFyY2ggfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gcCArIHM7XG4gIH1cblxuICAvLyBmaW5hbGx5LCByZWNvbnN0cnVjdCB0aGUgaHJlZiBiYXNlZCBvbiB3aGF0IGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgdGhpcy5ocmVmID0gdGhpcy5mb3JtYXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBmb3JtYXQgYSBwYXJzZWQgb2JqZWN0IGludG8gYSB1cmwgc3RyaW5nXG5mdW5jdGlvbiB1cmxGb3JtYXQob2JqKSB7XG4gIC8vIGVuc3VyZSBpdCdzIGFuIG9iamVjdCwgYW5kIG5vdCBhIHN0cmluZyB1cmwuXG4gIC8vIElmIGl0J3MgYW4gb2JqLCB0aGlzIGlzIGEgbm8tb3AuXG4gIC8vIHRoaXMgd2F5LCB5b3UgY2FuIGNhbGwgdXJsX2Zvcm1hdCgpIG9uIHN0cmluZ3NcbiAgLy8gdG8gY2xlYW4gdXAgcG90ZW50aWFsbHkgd29ua3kgdXJscy5cbiAgaWYgKHV0aWwuaXNTdHJpbmcob2JqKSkgb2JqID0gdXJsUGFyc2Uob2JqKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgcmV0dXJuIFVybC5wcm90b3R5cGUuZm9ybWF0LmNhbGwob2JqKTtcbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGF1dGggPSB0aGlzLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICBhdXRoID0gYXV0aC5yZXBsYWNlKC8lM0EvaSwgJzonKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJycsXG4gICAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgICBoYXNoID0gdGhpcy5oYXNoIHx8ICcnLFxuICAgICAgaG9zdCA9IGZhbHNlLFxuICAgICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgOlxuICAgICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJlxuICAgICAgdXRpbC5pc09iamVjdCh0aGlzLnF1ZXJ5KSAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHByb3RvY29sICs9ICc6JztcblxuICAvLyBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgLy8gdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgaWYgKHRoaXMuc2xhc2hlcyB8fFxuICAgICAgKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSAmJiBob3N0ICE9PSBmYWxzZSkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpO1xuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZS5jaGFyQXQoMCkgIT09ICcvJykgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTtcbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckF0KDApICE9PSAnIycpIGhhc2ggPSAnIycgKyBoYXNoO1xuICBpZiAoc2VhcmNoICYmIHNlYXJjaC5jaGFyQXQoMCkgIT09ICc/Jykgc2VhcmNoID0gJz8nICsgc2VhcmNoO1xuXG4gIHBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvWz8jXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQobWF0Y2gpO1xuICB9KTtcbiAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoJyMnLCAnJTIzJyk7XG5cbiAgcmV0dXJuIHByb3RvY29sICsgaG9zdCArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmUoc291cmNlLCByZWxhdGl2ZSkge1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZShyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlT2JqZWN0KHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiByZWxhdGl2ZTtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmVPYmplY3QocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICBpZiAodXRpbC5pc1N0cmluZyhyZWxhdGl2ZSkpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLy8gaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gIC8vIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICByZXN1bHQuaGFzaCA9IHJlbGF0aXZlLmhhc2g7XG5cbiAgLy8gaWYgdGhlIHJlbGF0aXZlIHVybCBpcyBlbXB0eSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBoZXJlLlxuICBpZiAocmVsYXRpdmUuaHJlZiA9PT0gJycpIHtcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaHJlZnMgbGlrZSAvL2Zvby9iYXIgYWx3YXlzIGN1dCB0byB0aGUgcHJvdG9jb2wuXG4gIGlmIChyZWxhdGl2ZS5zbGFzaGVzICYmICFyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgIC8vIHRha2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIHByb3RvY29sIGZyb20gcmVsYXRpdmVcbiAgICB2YXIgcmtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgZm9yICh2YXIgcmsgPSAwOyByayA8IHJrZXlzLmxlbmd0aDsgcmsrKykge1xuICAgICAgdmFyIHJrZXkgPSBya2V5c1tya107XG4gICAgICBpZiAocmtleSAhPT0gJ3Byb3RvY29sJylcbiAgICAgICAgcmVzdWx0W3JrZXldID0gcmVsYXRpdmVbcmtleV07XG4gICAgfVxuXG4gICAgLy91cmxQYXJzZSBhcHBlbmRzIHRyYWlsaW5nIC8gdG8gdXJscyBsaWtlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgICBpZiAoc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF0gJiZcbiAgICAgICAgcmVzdWx0Lmhvc3RuYW1lICYmICFyZXN1bHQucGF0aG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gcmVzdWx0LnBhdGhuYW1lID0gJy8nO1xuICAgIH1cblxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAocmVsYXRpdmUucHJvdG9jb2wgJiYgcmVsYXRpdmUucHJvdG9jb2wgIT09IHJlc3VsdC5wcm90b2NvbCkge1xuICAgIC8vIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAvLyB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAvLyBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAvLyBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgIC8vIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAvLyBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgIC8vIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgIC8vIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1t2XTtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSk7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHJlbGF0aXZlLmhvc3QgPSAnJztcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7XG4gICAgICBpZiAocmVsUGF0aFswXSAhPT0gJycpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSAocmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyksXG4gICAgICBpc1JlbEFicyA9IChcbiAgICAgICAgICByZWxhdGl2ZS5ob3N0IHx8XG4gICAgICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgICAgICksXG4gICAgICBtdXN0RW5kQWJzID0gKGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSkpLFxuICAgICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcmVsUGF0aCA9IHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8vIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgLy8gbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAvLyB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gIC8vIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gIC8vIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7XG4gICAgICBlbHNlIHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7XG4gICAgfVxuICAgIHJlc3VsdC5ob3N0ID0gJyc7XG4gICAgaWYgKHJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA9IG51bGw7XG4gICAgICByZWxhdGl2ZS5wb3J0ID0gbnVsbDtcbiAgICAgIGlmIChyZWxhdGl2ZS5ob3N0KSB7XG4gICAgICAgIGlmIChyZWxQYXRoWzBdID09PSAnJykgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7XG4gICAgICAgIGVsc2UgcmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpO1xuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gKHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAocmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHNyY1BhdGggPSBbXTtcbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKCF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKHJlbGF0aXZlLnNlYXJjaCkpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIC8vIG5vIHBhdGggYXQgYWxsLiAgZWFzeS5cbiAgICAvLyB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIG90aGVyIHN0dWZmIGFib3ZlLlxuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQuc2VhcmNoKSB7XG4gICAgICByZXN1bHQucGF0aCA9ICcvJyArIHJlc3VsdC5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGlmIGEgdXJsIEVORHMgaW4gLiBvciAuLiwgdGhlbiBpdCBtdXN0IGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICAvLyBob3dldmVyLCBpZiBpdCBlbmRzIGluIGFueXRoaW5nIGVsc2Ugbm9uLXNsYXNoeSxcbiAgLy8gdGhlbiBpdCBtdXN0IE5PVCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgdmFyIGxhc3QgPSBzcmNQYXRoLnNsaWNlKC0xKVswXTtcbiAgdmFyIGhhc1RyYWlsaW5nU2xhc2ggPSAoXG4gICAgICAocmVzdWx0Lmhvc3QgfHwgcmVsYXRpdmUuaG9zdCB8fCBzcmNQYXRoLmxlbmd0aCA+IDEpICYmXG4gICAgICAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8IGxhc3QgPT09ICcnKTtcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAgIChzcmNQYXRoWzBdICYmIHNyY1BhdGhbMF0uY2hhckF0KDApID09PSAnLycpO1xuXG4gIC8vIHB1dCB0aGUgaG9zdCBiYWNrXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IGlzQWJzb2x1dGUgPyAnJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmxlbmd0aCA/IHNyY1BhdGguc2hpZnQoKSA6ICcnO1xuICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgcmVxdWVzdC5odHRwXG4gIGlmICghdXRpbC5pc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhdXRpbC5pc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgdGhpcy5ob3N0bmFtZSA9IGhvc3Q7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybTtcbnZhciBiaW5kaW5nID0gcmVxdWlyZSgnLi9iaW5kaW5nJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKS5vaztcbnZhciBrTWF4TGVuZ3RoID0gcmVxdWlyZSgnYnVmZmVyJykua01heExlbmd0aDtcbnZhciBrUmFuZ2VFcnJvck1lc3NhZ2UgPSAnQ2Fubm90IGNyZWF0ZSBmaW5hbCBCdWZmZXIuIEl0IHdvdWxkIGJlIGxhcmdlciAnICsgJ3RoYW4gMHgnICsga01heExlbmd0aC50b1N0cmluZygxNikgKyAnIGJ5dGVzJztcblxuLy8gemxpYiBkb2Vzbid0IHByb3ZpZGUgdGhlc2UsIHNvIGtsdWRnZSB0aGVtIGluIGZvbGxvd2luZyB0aGUgc2FtZVxuLy8gY29uc3QgbmFtaW5nIHNjaGVtZSB6bGliIHVzZXMuXG5iaW5kaW5nLlpfTUlOX1dJTkRPV0JJVFMgPSA4O1xuYmluZGluZy5aX01BWF9XSU5ET1dCSVRTID0gMTU7XG5iaW5kaW5nLlpfREVGQVVMVF9XSU5ET1dCSVRTID0gMTU7XG5cbi8vIGZld2VyIHRoYW4gNjQgYnl0ZXMgcGVyIGNodW5rIGlzIHN0dXBpZC5cbi8vIHRlY2huaWNhbGx5IGl0IGNvdWxkIHdvcmsgd2l0aCBhcyBmZXcgYXMgOCwgYnV0IGV2ZW4gNjQgYnl0ZXNcbi8vIGlzIGFic3VyZGx5IGxvdy4gIFVzdWFsbHkgYSBNQiBvciBtb3JlIGlzIGJlc3QuXG5iaW5kaW5nLlpfTUlOX0NIVU5LID0gNjQ7XG5iaW5kaW5nLlpfTUFYX0NIVU5LID0gSW5maW5pdHk7XG5iaW5kaW5nLlpfREVGQVVMVF9DSFVOSyA9IDE2ICogMTAyNDtcblxuYmluZGluZy5aX01JTl9NRU1MRVZFTCA9IDE7XG5iaW5kaW5nLlpfTUFYX01FTUxFVkVMID0gOTtcbmJpbmRpbmcuWl9ERUZBVUxUX01FTUxFVkVMID0gODtcblxuYmluZGluZy5aX01JTl9MRVZFTCA9IC0xO1xuYmluZGluZy5aX01BWF9MRVZFTCA9IDk7XG5iaW5kaW5nLlpfREVGQVVMVF9MRVZFTCA9IGJpbmRpbmcuWl9ERUZBVUxUX0NPTVBSRVNTSU9OO1xuXG4vLyBleHBvc2UgYWxsIHRoZSB6bGliIGNvbnN0YW50c1xudmFyIGJrZXlzID0gT2JqZWN0LmtleXMoYmluZGluZyk7XG5mb3IgKHZhciBiayA9IDA7IGJrIDwgYmtleXMubGVuZ3RoOyBiaysrKSB7XG4gIHZhciBia2V5ID0gYmtleXNbYmtdO1xuICBpZiAoYmtleS5tYXRjaCgvXlovKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBia2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogYmluZGluZ1tia2V5XSwgd3JpdGFibGU6IGZhbHNlXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gdHJhbnNsYXRpb24gdGFibGUgZm9yIHJldHVybiBjb2Rlcy5cbnZhciBjb2RlcyA9IHtcbiAgWl9PSzogYmluZGluZy5aX09LLFxuICBaX1NUUkVBTV9FTkQ6IGJpbmRpbmcuWl9TVFJFQU1fRU5ELFxuICBaX05FRURfRElDVDogYmluZGluZy5aX05FRURfRElDVCxcbiAgWl9FUlJOTzogYmluZGluZy5aX0VSUk5PLFxuICBaX1NUUkVBTV9FUlJPUjogYmluZGluZy5aX1NUUkVBTV9FUlJPUixcbiAgWl9EQVRBX0VSUk9SOiBiaW5kaW5nLlpfREFUQV9FUlJPUixcbiAgWl9NRU1fRVJST1I6IGJpbmRpbmcuWl9NRU1fRVJST1IsXG4gIFpfQlVGX0VSUk9SOiBiaW5kaW5nLlpfQlVGX0VSUk9SLFxuICBaX1ZFUlNJT05fRVJST1I6IGJpbmRpbmcuWl9WRVJTSU9OX0VSUk9SXG59O1xuXG52YXIgY2tleXMgPSBPYmplY3Qua2V5cyhjb2Rlcyk7XG5mb3IgKHZhciBjayA9IDA7IGNrIDwgY2tleXMubGVuZ3RoOyBjaysrKSB7XG4gIHZhciBja2V5ID0gY2tleXNbY2tdO1xuICBjb2Rlc1tjb2Rlc1tja2V5XV0gPSBja2V5O1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ2NvZGVzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogT2JqZWN0LmZyZWV6ZShjb2RlcyksIHdyaXRhYmxlOiBmYWxzZVxufSk7XG5cbmV4cG9ydHMuRGVmbGF0ZSA9IERlZmxhdGU7XG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5HemlwID0gR3ppcDtcbmV4cG9ydHMuR3VuemlwID0gR3VuemlwO1xuZXhwb3J0cy5EZWZsYXRlUmF3ID0gRGVmbGF0ZVJhdztcbmV4cG9ydHMuSW5mbGF0ZVJhdyA9IEluZmxhdGVSYXc7XG5leHBvcnRzLlVuemlwID0gVW56aXA7XG5cbmV4cG9ydHMuY3JlYXRlRGVmbGF0ZSA9IGZ1bmN0aW9uIChvKSB7XG4gIHJldHVybiBuZXcgRGVmbGF0ZShvKTtcbn07XG5cbmV4cG9ydHMuY3JlYXRlSW5mbGF0ZSA9IGZ1bmN0aW9uIChvKSB7XG4gIHJldHVybiBuZXcgSW5mbGF0ZShvKTtcbn07XG5cbmV4cG9ydHMuY3JlYXRlRGVmbGF0ZVJhdyA9IGZ1bmN0aW9uIChvKSB7XG4gIHJldHVybiBuZXcgRGVmbGF0ZVJhdyhvKTtcbn07XG5cbmV4cG9ydHMuY3JlYXRlSW5mbGF0ZVJhdyA9IGZ1bmN0aW9uIChvKSB7XG4gIHJldHVybiBuZXcgSW5mbGF0ZVJhdyhvKTtcbn07XG5cbmV4cG9ydHMuY3JlYXRlR3ppcCA9IGZ1bmN0aW9uIChvKSB7XG4gIHJldHVybiBuZXcgR3ppcChvKTtcbn07XG5cbmV4cG9ydHMuY3JlYXRlR3VuemlwID0gZnVuY3Rpb24gKG8pIHtcbiAgcmV0dXJuIG5ldyBHdW56aXAobyk7XG59O1xuXG5leHBvcnRzLmNyZWF0ZVVuemlwID0gZnVuY3Rpb24gKG8pIHtcbiAgcmV0dXJuIG5ldyBVbnppcChvKTtcbn07XG5cbi8vIENvbnZlbmllbmNlIG1ldGhvZHMuXG4vLyBjb21wcmVzcy9kZWNvbXByZXNzIGEgc3RyaW5nIG9yIGJ1ZmZlciBpbiBvbmUgc3RlcC5cbmV4cG9ydHMuZGVmbGF0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgcmV0dXJuIHpsaWJCdWZmZXIobmV3IERlZmxhdGUob3B0cyksIGJ1ZmZlciwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5kZWZsYXRlU3luYyA9IGZ1bmN0aW9uIChidWZmZXIsIG9wdHMpIHtcbiAgcmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBEZWZsYXRlKG9wdHMpLCBidWZmZXIpO1xufTtcblxuZXhwb3J0cy5nemlwID0gZnVuY3Rpb24gKGJ1ZmZlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICByZXR1cm4gemxpYkJ1ZmZlcihuZXcgR3ppcChvcHRzKSwgYnVmZmVyLCBjYWxsYmFjayk7XG59O1xuXG5leHBvcnRzLmd6aXBTeW5jID0gZnVuY3Rpb24gKGJ1ZmZlciwgb3B0cykge1xuICByZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IEd6aXAob3B0cyksIGJ1ZmZlcik7XG59O1xuXG5leHBvcnRzLmRlZmxhdGVSYXcgPSBmdW5jdGlvbiAoYnVmZmVyLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHJldHVybiB6bGliQnVmZmVyKG5ldyBEZWZsYXRlUmF3KG9wdHMpLCBidWZmZXIsIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydHMuZGVmbGF0ZVJhd1N5bmMgPSBmdW5jdGlvbiAoYnVmZmVyLCBvcHRzKSB7XG4gIHJldHVybiB6bGliQnVmZmVyU3luYyhuZXcgRGVmbGF0ZVJhdyhvcHRzKSwgYnVmZmVyKTtcbn07XG5cbmV4cG9ydHMudW56aXAgPSBmdW5jdGlvbiAoYnVmZmVyLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHJldHVybiB6bGliQnVmZmVyKG5ldyBVbnppcChvcHRzKSwgYnVmZmVyLCBjYWxsYmFjayk7XG59O1xuXG5leHBvcnRzLnVuemlwU3luYyA9IGZ1bmN0aW9uIChidWZmZXIsIG9wdHMpIHtcbiAgcmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBVbnppcChvcHRzKSwgYnVmZmVyKTtcbn07XG5cbmV4cG9ydHMuaW5mbGF0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgcmV0dXJuIHpsaWJCdWZmZXIobmV3IEluZmxhdGUob3B0cyksIGJ1ZmZlciwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGZ1bmN0aW9uIChidWZmZXIsIG9wdHMpIHtcbiAgcmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBJbmZsYXRlKG9wdHMpLCBidWZmZXIpO1xufTtcblxuZXhwb3J0cy5ndW56aXAgPSBmdW5jdGlvbiAoYnVmZmVyLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHJldHVybiB6bGliQnVmZmVyKG5ldyBHdW56aXAob3B0cyksIGJ1ZmZlciwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5ndW56aXBTeW5jID0gZnVuY3Rpb24gKGJ1ZmZlciwgb3B0cykge1xuICByZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IEd1bnppcChvcHRzKSwgYnVmZmVyKTtcbn07XG5cbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGZ1bmN0aW9uIChidWZmZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgcmV0dXJuIHpsaWJCdWZmZXIobmV3IEluZmxhdGVSYXcob3B0cyksIGJ1ZmZlciwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0cy5pbmZsYXRlUmF3U3luYyA9IGZ1bmN0aW9uIChidWZmZXIsIG9wdHMpIHtcbiAgcmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBJbmZsYXRlUmF3KG9wdHMpLCBidWZmZXIpO1xufTtcblxuZnVuY3Rpb24gemxpYkJ1ZmZlcihlbmdpbmUsIGJ1ZmZlciwgY2FsbGJhY2spIHtcbiAgdmFyIGJ1ZmZlcnMgPSBbXTtcbiAgdmFyIG5yZWFkID0gMDtcblxuICBlbmdpbmUub24oJ2Vycm9yJywgb25FcnJvcik7XG4gIGVuZ2luZS5vbignZW5kJywgb25FbmQpO1xuXG4gIGVuZ2luZS5lbmQoYnVmZmVyKTtcbiAgZmxvdygpO1xuXG4gIGZ1bmN0aW9uIGZsb3coKSB7XG4gICAgdmFyIGNodW5rO1xuICAgIHdoaWxlIChudWxsICE9PSAoY2h1bmsgPSBlbmdpbmUucmVhZCgpKSkge1xuICAgICAgYnVmZmVycy5wdXNoKGNodW5rKTtcbiAgICAgIG5yZWFkICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gICAgZW5naW5lLm9uY2UoJ3JlYWRhYmxlJywgZmxvdyk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkVycm9yKGVycikge1xuICAgIGVuZ2luZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25FbmQpO1xuICAgIGVuZ2luZS5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBmbG93KTtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25FbmQoKSB7XG4gICAgdmFyIGJ1ZjtcbiAgICB2YXIgZXJyID0gbnVsbDtcblxuICAgIGlmIChucmVhZCA+PSBrTWF4TGVuZ3RoKSB7XG4gICAgICBlcnIgPSBuZXcgUmFuZ2VFcnJvcihrUmFuZ2VFcnJvck1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWYgPSBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMsIG5yZWFkKTtcbiAgICB9XG5cbiAgICBidWZmZXJzID0gW107XG4gICAgZW5naW5lLmNsb3NlKCk7XG4gICAgY2FsbGJhY2soZXJyLCBidWYpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHpsaWJCdWZmZXJTeW5jKGVuZ2luZSwgYnVmZmVyKSB7XG4gIGlmICh0eXBlb2YgYnVmZmVyID09PSAnc3RyaW5nJykgYnVmZmVyID0gQnVmZmVyLmZyb20oYnVmZmVyKTtcblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdOb3QgYSBzdHJpbmcgb3IgYnVmZmVyJyk7XG5cbiAgdmFyIGZsdXNoRmxhZyA9IGVuZ2luZS5fZmluaXNoRmx1c2hGbGFnO1xuXG4gIHJldHVybiBlbmdpbmUuX3Byb2Nlc3NDaHVuayhidWZmZXIsIGZsdXNoRmxhZyk7XG59XG5cbi8vIGdlbmVyaWMgemxpYlxuLy8gbWluaW1hbCAyLWJ5dGUgaGVhZGVyXG5mdW5jdGlvbiBEZWZsYXRlKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLkRFRkxBVEUpO1xufVxuXG5mdW5jdGlvbiBJbmZsYXRlKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLklORkxBVEUpO1xufVxuXG4vLyBnemlwIC0gYmlnZ2VyIGhlYWRlciwgc2FtZSBkZWZsYXRlIGNvbXByZXNzaW9uXG5mdW5jdGlvbiBHemlwKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEd6aXApKSByZXR1cm4gbmV3IEd6aXAob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLkdaSVApO1xufVxuXG5mdW5jdGlvbiBHdW56aXAob3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR3VuemlwKSkgcmV0dXJuIG5ldyBHdW56aXAob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLkdVTlpJUCk7XG59XG5cbi8vIHJhdyAtIG5vIGhlYWRlclxuZnVuY3Rpb24gRGVmbGF0ZVJhdyhvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlUmF3KSkgcmV0dXJuIG5ldyBEZWZsYXRlUmF3KG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5ERUZMQVRFUkFXKTtcbn1cblxuZnVuY3Rpb24gSW5mbGF0ZVJhdyhvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBJbmZsYXRlUmF3KSkgcmV0dXJuIG5ldyBJbmZsYXRlUmF3KG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5JTkZMQVRFUkFXKTtcbn1cblxuLy8gYXV0by1kZXRlY3QgaGVhZGVyLlxuZnVuY3Rpb24gVW56aXAob3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVW56aXApKSByZXR1cm4gbmV3IFVuemlwKG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5VTlpJUCk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRGbHVzaEZsYWcoZmxhZykge1xuICByZXR1cm4gZmxhZyA9PT0gYmluZGluZy5aX05PX0ZMVVNIIHx8IGZsYWcgPT09IGJpbmRpbmcuWl9QQVJUSUFMX0ZMVVNIIHx8IGZsYWcgPT09IGJpbmRpbmcuWl9TWU5DX0ZMVVNIIHx8IGZsYWcgPT09IGJpbmRpbmcuWl9GVUxMX0ZMVVNIIHx8IGZsYWcgPT09IGJpbmRpbmcuWl9GSU5JU0ggfHwgZmxhZyA9PT0gYmluZGluZy5aX0JMT0NLO1xufVxuXG4vLyB0aGUgWmxpYiBjbGFzcyB0aGV5IGFsbCBpbmhlcml0IGZyb21cbi8vIFRoaXMgdGhpbmcgbWFuYWdlcyB0aGUgcXVldWUgb2YgcmVxdWVzdHMsIGFuZCByZXR1cm5zXG4vLyB0cnVlIG9yIGZhbHNlIGlmIHRoZXJlIGlzIGFueXRoaW5nIGluIHRoZSBxdWV1ZSB3aGVuXG4vLyB5b3UgY2FsbCB0aGUgLndyaXRlKCkgbWV0aG9kLlxuXG5mdW5jdGlvbiBabGliKG9wdHMsIG1vZGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLl9vcHRzID0gb3B0cyA9IG9wdHMgfHwge307XG4gIHRoaXMuX2NodW5rU2l6ZSA9IG9wdHMuY2h1bmtTaXplIHx8IGV4cG9ydHMuWl9ERUZBVUxUX0NIVU5LO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdHMpO1xuXG4gIGlmIChvcHRzLmZsdXNoICYmICFpc1ZhbGlkRmx1c2hGbGFnKG9wdHMuZmx1c2gpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZsdXNoIGZsYWc6ICcgKyBvcHRzLmZsdXNoKTtcbiAgfVxuICBpZiAob3B0cy5maW5pc2hGbHVzaCAmJiAhaXNWYWxpZEZsdXNoRmxhZyhvcHRzLmZpbmlzaEZsdXNoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmbHVzaCBmbGFnOiAnICsgb3B0cy5maW5pc2hGbHVzaCk7XG4gIH1cblxuICB0aGlzLl9mbHVzaEZsYWcgPSBvcHRzLmZsdXNoIHx8IGJpbmRpbmcuWl9OT19GTFVTSDtcbiAgdGhpcy5fZmluaXNoRmx1c2hGbGFnID0gdHlwZW9mIG9wdHMuZmluaXNoRmx1c2ggIT09ICd1bmRlZmluZWQnID8gb3B0cy5maW5pc2hGbHVzaCA6IGJpbmRpbmcuWl9GSU5JU0g7XG5cbiAgaWYgKG9wdHMuY2h1bmtTaXplKSB7XG4gICAgaWYgKG9wdHMuY2h1bmtTaXplIDwgZXhwb3J0cy5aX01JTl9DSFVOSyB8fCBvcHRzLmNodW5rU2l6ZSA+IGV4cG9ydHMuWl9NQVhfQ0hVTkspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaHVuayBzaXplOiAnICsgb3B0cy5jaHVua1NpemUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLndpbmRvd0JpdHMpIHtcbiAgICBpZiAob3B0cy53aW5kb3dCaXRzIDwgZXhwb3J0cy5aX01JTl9XSU5ET1dCSVRTIHx8IG9wdHMud2luZG93Qml0cyA+IGV4cG9ydHMuWl9NQVhfV0lORE9XQklUUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHdpbmRvd0JpdHM6ICcgKyBvcHRzLndpbmRvd0JpdHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLmxldmVsKSB7XG4gICAgaWYgKG9wdHMubGV2ZWwgPCBleHBvcnRzLlpfTUlOX0xFVkVMIHx8IG9wdHMubGV2ZWwgPiBleHBvcnRzLlpfTUFYX0xFVkVMKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICcgKyBvcHRzLmxldmVsKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5tZW1MZXZlbCkge1xuICAgIGlmIChvcHRzLm1lbUxldmVsIDwgZXhwb3J0cy5aX01JTl9NRU1MRVZFTCB8fCBvcHRzLm1lbUxldmVsID4gZXhwb3J0cy5aX01BWF9NRU1MRVZFTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbUxldmVsOiAnICsgb3B0cy5tZW1MZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMuc3RyYXRlZ3kpIHtcbiAgICBpZiAob3B0cy5zdHJhdGVneSAhPSBleHBvcnRzLlpfRklMVEVSRUQgJiYgb3B0cy5zdHJhdGVneSAhPSBleHBvcnRzLlpfSFVGRk1BTl9PTkxZICYmIG9wdHMuc3RyYXRlZ3kgIT0gZXhwb3J0cy5aX1JMRSAmJiBvcHRzLnN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9GSVhFRCAmJiBvcHRzLnN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyYXRlZ3k6ICcgKyBvcHRzLnN0cmF0ZWd5KTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5kaWN0aW9uYXJ5KSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIob3B0cy5kaWN0aW9uYXJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRpY3Rpb25hcnk6IGl0IHNob3VsZCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX2hhbmRsZSA9IG5ldyBiaW5kaW5nLlpsaWIobW9kZSk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9oYWRFcnJvciA9IGZhbHNlO1xuICB0aGlzLl9oYW5kbGUub25lcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBlcnJubykge1xuICAgIC8vIHRoZXJlIGlzIG5vIHdheSB0byBjbGVhbmx5IHJlY292ZXIuXG4gICAgLy8gY29udGludWluZyBvbmx5IG9ic2N1cmVzIHByb2JsZW1zLlxuICAgIF9jbG9zZShzZWxmKTtcbiAgICBzZWxmLl9oYWRFcnJvciA9IHRydWU7XG5cbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IuZXJybm8gPSBlcnJubztcbiAgICBlcnJvci5jb2RlID0gZXhwb3J0cy5jb2Rlc1tlcnJub107XG4gICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgfTtcblxuICB2YXIgbGV2ZWwgPSBleHBvcnRzLlpfREVGQVVMVF9DT01QUkVTU0lPTjtcbiAgaWYgKHR5cGVvZiBvcHRzLmxldmVsID09PSAnbnVtYmVyJykgbGV2ZWwgPSBvcHRzLmxldmVsO1xuXG4gIHZhciBzdHJhdGVneSA9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZO1xuICBpZiAodHlwZW9mIG9wdHMuc3RyYXRlZ3kgPT09ICdudW1iZXInKSBzdHJhdGVneSA9IG9wdHMuc3RyYXRlZ3k7XG5cbiAgdGhpcy5faGFuZGxlLmluaXQob3B0cy53aW5kb3dCaXRzIHx8IGV4cG9ydHMuWl9ERUZBVUxUX1dJTkRPV0JJVFMsIGxldmVsLCBvcHRzLm1lbUxldmVsIHx8IGV4cG9ydHMuWl9ERUZBVUxUX01FTUxFVkVMLCBzdHJhdGVneSwgb3B0cy5kaWN0aW9uYXJ5KTtcblxuICB0aGlzLl9idWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5fY2h1bmtTaXplKTtcbiAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgdGhpcy5fbGV2ZWwgPSBsZXZlbDtcbiAgdGhpcy5fc3RyYXRlZ3kgPSBzdHJhdGVneTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIHRoaXMuY2xvc2UpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2Nsb3NlZCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhX3RoaXMuX2hhbmRsZTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG51dGlsLmluaGVyaXRzKFpsaWIsIFRyYW5zZm9ybSk7XG5cblpsaWIucHJvdG90eXBlLnBhcmFtcyA9IGZ1bmN0aW9uIChsZXZlbCwgc3RyYXRlZ3ksIGNhbGxiYWNrKSB7XG4gIGlmIChsZXZlbCA8IGV4cG9ydHMuWl9NSU5fTEVWRUwgfHwgbGV2ZWwgPiBleHBvcnRzLlpfTUFYX0xFVkVMKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICcgKyBsZXZlbCk7XG4gIH1cbiAgaWYgKHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9GSUxURVJFRCAmJiBzdHJhdGVneSAhPSBleHBvcnRzLlpfSFVGRk1BTl9PTkxZICYmIHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9STEUgJiYgc3RyYXRlZ3kgIT0gZXhwb3J0cy5aX0ZJWEVEICYmIHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJhdGVneTogJyArIHN0cmF0ZWd5KTtcbiAgfVxuXG4gIGlmICh0aGlzLl9sZXZlbCAhPT0gbGV2ZWwgfHwgdGhpcy5fc3RyYXRlZ3kgIT09IHN0cmF0ZWd5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZmx1c2goYmluZGluZy5aX1NZTkNfRkxVU0gsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydChzZWxmLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gICAgICBzZWxmLl9oYW5kbGUucGFyYW1zKGxldmVsLCBzdHJhdGVneSk7XG4gICAgICBpZiAoIXNlbGYuX2hhZEVycm9yKSB7XG4gICAgICAgIHNlbGYuX2xldmVsID0gbGV2ZWw7XG4gICAgICAgIHNlbGYuX3N0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIGFzc2VydCh0aGlzLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gIHJldHVybiB0aGlzLl9oYW5kbGUucmVzZXQoKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIF9mbHVzaCBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRyYW5zZm9ybSBjbGFzcyxcbi8vIGludGVybmFsbHksIHdoZW4gdGhlIGxhc3QgY2h1bmsgaGFzIGJlZW4gd3JpdHRlbi5cblpsaWIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLl90cmFuc2Zvcm0oQnVmZmVyLmFsbG9jKDApLCAnJywgY2FsbGJhY2spO1xufTtcblxuWmxpYi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoa2luZCwgY2FsbGJhY2spIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIHdzID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGtpbmQgPT09ICdmdW5jdGlvbicgfHwga2luZCA9PT0gdW5kZWZpbmVkICYmICFjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0ga2luZDtcbiAgICBraW5kID0gYmluZGluZy5aX0ZVTExfRkxVU0g7XG4gIH1cblxuICBpZiAod3MuZW5kZWQpIHtcbiAgICBpZiAoY2FsbGJhY2spIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICB9IGVsc2UgaWYgKHdzLmVuZGluZykge1xuICAgIGlmIChjYWxsYmFjaykgdGhpcy5vbmNlKCdlbmQnLCBjYWxsYmFjayk7XG4gIH0gZWxzZSBpZiAod3MubmVlZERyYWluKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uY2UoJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmZsdXNoKGtpbmQsIGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9mbHVzaEZsYWcgPSBraW5kO1xuICAgIHRoaXMud3JpdGUoQnVmZmVyLmFsbG9jKDApLCAnJywgY2FsbGJhY2spO1xuICB9XG59O1xuXG5abGliLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICBfY2xvc2UodGhpcywgY2FsbGJhY2spO1xuICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULCB0aGlzKTtcbn07XG5cbmZ1bmN0aW9uIF9jbG9zZShlbmdpbmUsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjaykgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7XG5cbiAgLy8gQ2FsbGVyIG1heSBpbnZva2UgLmNsb3NlIGFmdGVyIGEgemxpYiBlcnJvciAod2hpY2ggd2lsbCBudWxsIF9oYW5kbGUpLlxuICBpZiAoIWVuZ2luZS5faGFuZGxlKSByZXR1cm47XG5cbiAgZW5naW5lLl9oYW5kbGUuY2xvc2UoKTtcbiAgZW5naW5lLl9oYW5kbGUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIHNlbGYuZW1pdCgnY2xvc2UnKTtcbn1cblxuWmxpYi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBmbHVzaEZsYWc7XG4gIHZhciB3cyA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBlbmRpbmcgPSB3cy5lbmRpbmcgfHwgd3MuZW5kZWQ7XG4gIHZhciBsYXN0ID0gZW5kaW5nICYmICghY2h1bmsgfHwgd3MubGVuZ3RoID09PSBjaHVuay5sZW5ndGgpO1xuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgcmV0dXJuIGNiKG5ldyBFcnJvcignaW52YWxpZCBpbnB1dCcpKTtcblxuICBpZiAoIXRoaXMuX2hhbmRsZSkgcmV0dXJuIGNiKG5ldyBFcnJvcignemxpYiBiaW5kaW5nIGNsb3NlZCcpKTtcblxuICAvLyBJZiBpdCdzIHRoZSBsYXN0IGNodW5rLCBvciBhIGZpbmFsIGZsdXNoLCB3ZSB1c2UgdGhlIFpfRklOSVNIIGZsdXNoIGZsYWdcbiAgLy8gKG9yIHdoYXRldmVyIGZsYWcgd2FzIHByb3ZpZGVkIHVzaW5nIG9wdHMuZmluaXNoRmx1c2gpLlxuICAvLyBJZiBpdCdzIGV4cGxpY2l0bHkgZmx1c2hpbmcgYXQgc29tZSBvdGhlciB0aW1lLCB0aGVuIHdlIHVzZVxuICAvLyBaX0ZVTExfRkxVU0guIE90aGVyd2lzZSwgdXNlIFpfTk9fRkxVU0ggZm9yIG1heGltdW0gY29tcHJlc3Npb25cbiAgLy8gZ29vZG5lc3MuXG4gIGlmIChsYXN0KSBmbHVzaEZsYWcgPSB0aGlzLl9maW5pc2hGbHVzaEZsYWc7ZWxzZSB7XG4gICAgZmx1c2hGbGFnID0gdGhpcy5fZmx1c2hGbGFnO1xuICAgIC8vIG9uY2Ugd2UndmUgZmx1c2hlZCB0aGUgbGFzdCBvZiB0aGUgcXVldWUsIHN0b3AgZmx1c2hpbmcgYW5kXG4gICAgLy8gZ28gYmFjayB0byB0aGUgbm9ybWFsIGJlaGF2aW9yLlxuICAgIGlmIChjaHVuay5sZW5ndGggPj0gd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9mbHVzaEZsYWcgPSB0aGlzLl9vcHRzLmZsdXNoIHx8IGJpbmRpbmcuWl9OT19GTFVTSDtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9wcm9jZXNzQ2h1bmsoY2h1bmssIGZsdXNoRmxhZywgY2IpO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX3Byb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaywgZmx1c2hGbGFnLCBjYikge1xuICB2YXIgYXZhaWxJbkJlZm9yZSA9IGNodW5rICYmIGNodW5rLmxlbmd0aDtcbiAgdmFyIGF2YWlsT3V0QmVmb3JlID0gdGhpcy5fY2h1bmtTaXplIC0gdGhpcy5fb2Zmc2V0O1xuICB2YXIgaW5PZmYgPSAwO1xuXG4gIHZhciBzZWxmID0gdGhpcztcblxuICB2YXIgYXN5bmMgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbic7XG5cbiAgaWYgKCFhc3luYykge1xuICAgIHZhciBidWZmZXJzID0gW107XG4gICAgdmFyIG5yZWFkID0gMDtcblxuICAgIHZhciBlcnJvcjtcbiAgICB0aGlzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcikge1xuICAgICAgZXJyb3IgPSBlcjtcbiAgICB9KTtcblxuICAgIGFzc2VydCh0aGlzLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuX2hhbmRsZS53cml0ZVN5bmMoZmx1c2hGbGFnLCBjaHVuaywgLy8gaW5cbiAgICAgIGluT2ZmLCAvLyBpbl9vZmZcbiAgICAgIGF2YWlsSW5CZWZvcmUsIC8vIGluX2xlblxuICAgICAgdGhpcy5fYnVmZmVyLCAvLyBvdXRcbiAgICAgIHRoaXMuX29mZnNldCwgLy9vdXRfb2ZmXG4gICAgICBhdmFpbE91dEJlZm9yZSk7IC8vIG91dF9sZW5cbiAgICB9IHdoaWxlICghdGhpcy5faGFkRXJyb3IgJiYgY2FsbGJhY2socmVzWzBdLCByZXNbMV0pKTtcblxuICAgIGlmICh0aGlzLl9oYWRFcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKG5yZWFkID49IGtNYXhMZW5ndGgpIHtcbiAgICAgIF9jbG9zZSh0aGlzKTtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGtSYW5nZUVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycywgbnJlYWQpO1xuICAgIF9jbG9zZSh0aGlzKTtcblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBhc3NlcnQodGhpcy5faGFuZGxlLCAnemxpYiBiaW5kaW5nIGNsb3NlZCcpO1xuICB2YXIgcmVxID0gdGhpcy5faGFuZGxlLndyaXRlKGZsdXNoRmxhZywgY2h1bmssIC8vIGluXG4gIGluT2ZmLCAvLyBpbl9vZmZcbiAgYXZhaWxJbkJlZm9yZSwgLy8gaW5fbGVuXG4gIHRoaXMuX2J1ZmZlciwgLy8gb3V0XG4gIHRoaXMuX29mZnNldCwgLy9vdXRfb2ZmXG4gIGF2YWlsT3V0QmVmb3JlKTsgLy8gb3V0X2xlblxuXG4gIHJlcS5idWZmZXIgPSBjaHVuaztcbiAgcmVxLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2soYXZhaWxJbkFmdGVyLCBhdmFpbE91dEFmdGVyKSB7XG4gICAgLy8gV2hlbiB0aGUgY2FsbGJhY2sgaXMgdXNlZCBpbiBhbiBhc3luYyB3cml0ZSwgdGhlIGNhbGxiYWNrJ3NcbiAgICAvLyBjb250ZXh0IGlzIHRoZSBgcmVxYCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4gVGhlIHJlcSBvYmplY3RcbiAgICAvLyBpcyA9PT0gdGhpcy5faGFuZGxlLCBhbmQgdGhhdCdzIHdoeSBpdCdzIGltcG9ydGFudCB0byBudWxsXG4gICAgLy8gb3V0IHRoZSB2YWx1ZXMgYWZ0ZXIgdGhleSBhcmUgZG9uZSBiZWluZyB1c2VkLiBgdGhpcy5faGFuZGxlYFxuICAgIC8vIGNhbiBzdGF5IGluIG1lbW9yeSBsb25nZXIgdGhhbiB0aGUgY2FsbGJhY2sgYW5kIGJ1ZmZlciBhcmUgbmVlZGVkLlxuICAgIGlmICh0aGlzKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5faGFkRXJyb3IpIHJldHVybjtcblxuICAgIHZhciBoYXZlID0gYXZhaWxPdXRCZWZvcmUgLSBhdmFpbE91dEFmdGVyO1xuICAgIGFzc2VydChoYXZlID49IDAsICdoYXZlIHNob3VsZCBub3QgZ28gZG93bicpO1xuXG4gICAgaWYgKGhhdmUgPiAwKSB7XG4gICAgICB2YXIgb3V0ID0gc2VsZi5fYnVmZmVyLnNsaWNlKHNlbGYuX29mZnNldCwgc2VsZi5fb2Zmc2V0ICsgaGF2ZSk7XG4gICAgICBzZWxmLl9vZmZzZXQgKz0gaGF2ZTtcbiAgICAgIC8vIHNlcnZlIHNvbWUgb3V0cHV0IHRvIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChhc3luYykge1xuICAgICAgICBzZWxmLnB1c2gob3V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlcnMucHVzaChvdXQpO1xuICAgICAgICBucmVhZCArPSBvdXQubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4aGF1c3RlZCB0aGUgb3V0cHV0IGJ1ZmZlciwgb3IgdXNlZCBhbGwgdGhlIGlucHV0IGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgaWYgKGF2YWlsT3V0QWZ0ZXIgPT09IDAgfHwgc2VsZi5fb2Zmc2V0ID49IHNlbGYuX2NodW5rU2l6ZSkge1xuICAgICAgYXZhaWxPdXRCZWZvcmUgPSBzZWxmLl9jaHVua1NpemU7XG4gICAgICBzZWxmLl9vZmZzZXQgPSAwO1xuICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKHNlbGYuX2NodW5rU2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKGF2YWlsT3V0QWZ0ZXIgPT09IDApIHtcbiAgICAgIC8vIE5vdCBhY3R1YWxseSBkb25lLiAgTmVlZCB0byByZXByb2Nlc3MuXG4gICAgICAvLyBBbHNvLCB1cGRhdGUgdGhlIGF2YWlsSW5CZWZvcmUgdG8gdGhlIGF2YWlsSW5BZnRlciB2YWx1ZSxcbiAgICAgIC8vIHNvIHRoYXQgaWYgd2UgaGF2ZSB0byBoaXQgaXQgYSB0aGlyZCAoZm91cnRoLCBldGMuKSB0aW1lLFxuICAgICAgLy8gaXQnbGwgaGF2ZSB0aGUgY29ycmVjdCBieXRlIGNvdW50cy5cbiAgICAgIGluT2ZmICs9IGF2YWlsSW5CZWZvcmUgLSBhdmFpbEluQWZ0ZXI7XG4gICAgICBhdmFpbEluQmVmb3JlID0gYXZhaWxJbkFmdGVyO1xuXG4gICAgICBpZiAoIWFzeW5jKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgdmFyIG5ld1JlcSA9IHNlbGYuX2hhbmRsZS53cml0ZShmbHVzaEZsYWcsIGNodW5rLCBpbk9mZiwgYXZhaWxJbkJlZm9yZSwgc2VsZi5fYnVmZmVyLCBzZWxmLl9vZmZzZXQsIHNlbGYuX2NodW5rU2l6ZSk7XG4gICAgICBuZXdSZXEuY2FsbGJhY2sgPSBjYWxsYmFjazsgLy8gdGhpcyBzYW1lIGZ1bmN0aW9uXG4gICAgICBuZXdSZXEuYnVmZmVyID0gY2h1bms7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhc3luYykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gZmluaXNoZWQgd2l0aCB0aGUgY2h1bmsuXG4gICAgY2IoKTtcbiAgfVxufTtcblxudXRpbC5pbmhlcml0cyhEZWZsYXRlLCBabGliKTtcbnV0aWwuaW5oZXJpdHMoSW5mbGF0ZSwgWmxpYik7XG51dGlsLmluaGVyaXRzKEd6aXAsIFpsaWIpO1xudXRpbC5pbmhlcml0cyhHdW56aXAsIFpsaWIpO1xudXRpbC5pbmhlcml0cyhEZWZsYXRlUmF3LCBabGliKTtcbnV0aWwuaW5oZXJpdHMoSW5mbGF0ZVJhdywgWmxpYik7XG51dGlsLmluaGVyaXRzKFVuemlwLCBabGliKTsiLCIndXNlIHN0cmljdCc7XG5cbmlmICghcHJvY2Vzcy52ZXJzaW9uIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpID09PSAwIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpID09PSAwICYmIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS44LicpICE9PSAwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0geyBuZXh0VGljazogbmV4dFRpY2sgfTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzc1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncywgaTtcbiAgc3dpdGNoIChsZW4pIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZm4pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxKTtcbiAgICB9KTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1R3bygpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMik7XG4gICAgfSk7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfSk7XG4gIGRlZmF1bHQ6XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59XG5cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgcHJlZml4ID0gJ34nO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIHN0b3JhZ2UgZm9yIG91ciBgRUVgIG9iamVjdHMuXG4gKiBBbiBgRXZlbnRzYCBpbnN0YW5jZSBpcyBhIHBsYWluIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBldmVudCBuYW1lcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cygpIHt9XG5cbi8vXG4vLyBXZSB0cnkgdG8gbm90IGluaGVyaXQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuIEluIHNvbWUgZW5naW5lcyBjcmVhdGluZyBhblxuLy8gaW5zdGFuY2UgaW4gdGhpcyB3YXkgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgZGlyZWN0bHkuXG4vLyBJZiBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaXMgbm90IHN1cHBvcnRlZCB3ZSBwcmVmaXggdGhlIGV2ZW50IG5hbWVzIHdpdGggYVxuLy8gY2hhcmFjdGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90XG4vLyBvdmVycmlkZGVuIG9yIHVzZWQgYXMgYW4gYXR0YWNrIHZlY3Rvci5cbi8vXG5pZiAoT2JqZWN0LmNyZWF0ZSkge1xuICBFdmVudHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvL1xuICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IGlzIHN0aWxsIGluaGVyaXRlZCBpblxuICAvLyBzb21lIG9sZCBicm93c2VycyBsaWtlIEFuZHJvaWQgNCwgaVBob25lIDUuMSwgT3BlcmEgMTEgYW5kIFNhZmFyaSA1LlxuICAvL1xuICBpZiAoIW5ldyBFdmVudHMoKS5fX3Byb3RvX18pIHByZWZpeCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvbmNlPWZhbHNlXSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFRShmbiwgY29udGV4dCwgb25jZSkge1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMub25jZSA9IG9uY2UgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCBlbWl0dGVyLCBvbmNlKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdKSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyLCBlbWl0dGVyLl9ldmVudHNDb3VudCsrO1xuICBlbHNlIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0uZm4pIGVtaXR0ZXIuX2V2ZW50c1tldnRdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gW2VtaXR0ZXIuX2V2ZW50c1tldnRdLCBsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIGVtaXR0ZXI7XG59XG5cbi8qKlxuICogQ2xlYXIgZXZlbnQgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2dCBUaGUgRXZlbnQgbmFtZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyRXZlbnQoZW1pdHRlciwgZXZ0KSB7XG4gIGlmICgtLWVtaXR0ZXIuX2V2ZW50c0NvdW50ID09PSAwKSBlbWl0dGVyLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIGVsc2UgZGVsZXRlIGVtaXR0ZXIuX2V2ZW50c1tldnRdO1xufVxuXG4vKipcbiAqIE1pbmltYWwgYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlIHRoYXQgaXMgbW9sZGVkIGFnYWluc3QgdGhlIE5vZGUuanNcbiAqIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZFxuICogbGlzdGVuZXJzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgdmFyIG5hbWVzID0gW11cbiAgICAsIGV2ZW50c1xuICAgICwgbmFtZTtcblxuICBpZiAodGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHJldHVybiBuYW1lcztcblxuICBmb3IgKG5hbWUgaW4gKGV2ZW50cyA9IHRoaXMuX2V2ZW50cykpIHtcbiAgICBpZiAoaGFzLmNhbGwoZXZlbnRzLCBuYW1lKSkgbmFtZXMucHVzaChwcmVmaXggPyBuYW1lLnNsaWNlKDEpIDogbmFtZSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHJldHVybiBuYW1lcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhldmVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lcztcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFoYW5kbGVycykgcmV0dXJuIFtdO1xuICBpZiAoaGFuZGxlcnMuZm4pIHJldHVybiBbaGFuZGxlcnMuZm5dO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoLCBlZSA9IG5ldyBBcnJheShsKTsgaSA8IGw7IGkrKykge1xuICAgIGVlW2ldID0gaGFuZGxlcnNbaV0uZm47XG4gIH1cblxuICByZXR1cm4gZWU7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gbGlzdGVuZXJDb3VudChldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiAwO1xuICBpZiAobGlzdGVuZXJzLmZuKSByZXR1cm4gMTtcbiAgcmV0dXJuIGxpc3RlbmVycy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIENhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBsaXN0ZW5lcnMsIGVsc2UgYGZhbHNlYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF1cbiAgICAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGFyZ3NcbiAgICAsIGk7XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG4gICAgICBjYXNlIDM6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG4gICAgICBjYXNlIDY6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQsIGE1KSwgdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgLCBqO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdGVuZXJzW2ldLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyc1tpXS5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgICAgc3dpdGNoIChsZW4pIHtcbiAgICAgICAgY2FzZSAxOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCk7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSk7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcbiAgICAgICAgY2FzZSA0OiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyLCBhMyk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghYXJncykgZm9yIChqID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpc3RlbmVyc1tpXS5mbi5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIHRoaXMgY29udGV4dC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBPbmx5IHJlbW92ZSBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG4gIGlmICghZm4pIHtcbiAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChcbiAgICAgIGxpc3RlbmVycy5mbiA9PT0gZm4gJiZcbiAgICAgICghb25jZSB8fCBsaXN0ZW5lcnMub25jZSkgJiZcbiAgICAgICghY29udGV4dCB8fCBsaXN0ZW5lcnMuY29udGV4dCA9PT0gY29udGV4dClcbiAgICApIHtcbiAgICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGV2ZW50cyA9IFtdLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGlzdGVuZXJzW2ldLmZuICE9PSBmbiB8fFxuICAgICAgICAob25jZSAmJiAhbGlzdGVuZXJzW2ldLm9uY2UpIHx8XG4gICAgICAgIChjb250ZXh0ICYmIGxpc3RlbmVyc1tpXS5jb250ZXh0ICE9PSBjb250ZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBSZXNldCB0aGUgYXJyYXksIG9yIHJlbW92ZSBpdCBjb21wbGV0ZWx5IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMuXG4gICAgLy9cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCkgdGhpcy5fZXZlbnRzW2V2dF0gPSBldmVudHMubGVuZ3RoID09PSAxID8gZXZlbnRzWzBdIDogZXZlbnRzO1xuICAgIGVsc2UgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBbZXZlbnRdIFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0O1xuXG4gIGlmIChldmVudCkge1xuICAgIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG4gICAgaWYgKHRoaXMuX2V2ZW50c1tldnRdKSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIEFsaWFzIG1ldGhvZHMgbmFtZXMgYmVjYXVzZSBwZW9wbGUgcm9sbCBsaWtlIHRoYXQuXG4vL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub247XG5cbi8vXG4vLyBFeHBvc2UgdGhlIHByZWZpeC5cbi8vXG5FdmVudEVtaXR0ZXIucHJlZml4ZWQgPSBwcmVmaXg7XG5cbi8vXG4vLyBBbGxvdyBgRXZlbnRFbWl0dGVyYCB0byBiZSBpbXBvcnRlZCBhcyBtb2R1bGUgbmFtZXNwYWNlLlxuLy9cbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbi8vXG4vLyBFeHBvc2UgdGhlIG1vZHVsZS5cbi8vXG5pZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBtb2R1bGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG59XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJjb25zdCBDYXB0dXJlZFJlcXVlc3QgPSByZXF1aXJlKCcuL2NhcHR1cmVkUmVxdWVzdCcpXG5cbi8qKlxuICogQ2xhc3MgUmVzcG9uc2libGUgRm9yIE1hbmFnaW5nIFRoZSBDYXB0dXJlZCBSZXF1ZXN0IC8gUmVzcG9uc2VzIEZvciBBIFBhZ2VcbiAqL1xuY2xhc3MgUmVxdWVzdEhhbmRsZXIge1xuICAvKipcbiAgICogQGRlc2MgQ3JlYXRlIEEgTmV3IFJlcXVlc3RIYW5kbGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVG8gQ2FwdHVyZSBSZXF1ZXN0cyBPciBOb3QgVG8gQ2FwdHVyZSBSZXF1ZXN0c1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fY2FwdHVyZSA9IHRydWVcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIEFzc29jaWF0aW9uIE9mIFJlcXVlc3RJZHMgVG8gQ2FwdHVyZWRSZXF1ZXN0c1xuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLENhcHR1cmVkUmVxdWVzdD59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9yZXF1ZXN0cyA9IG5ldyBNYXAoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFNldHMgYW4gaW50ZXJuYWwgZmxhZyB0byBiZWdpbiBjYXB0dXJpbmcgbmV0d29yayByZXF1ZXN0cy5cbiAgICogQ2xlYXJzIEFueSBQcmV2aW91c2x5IENhcHR1cmVkIFJlcXVlc3QgSW5mb3JtYXRpb25cbiAgICovXG4gIHN0YXJ0Q2FwdHVyaW5nICgpIHtcbiAgICB0aGlzLl9yZXF1ZXN0cy5jbGVhcigpXG4gICAgdGhpcy5fY2FwdHVyZSA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBTZXRzIGFuIGludGVybmFsIGZsYWcgdG8gc3RvcCB0aGUgY2FwdHVyaW5nIG5ldHdvcmsgcmVxdWVzdHNcbiAgICovXG4gIHN0b3BDYXB0dXJpbmcgKCkge1xuICAgIHRoaXMuX2NhcHR1cmUgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEhhbmRsZXMgZWl0aGVyIHRoZSBOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50IG9yIHRoZSBOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQgZXZlbnRzXG4gICAqIEBzZWUgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L05ldHdvcmsvI2V2ZW50LXJlcXVlc3RXaWxsQmVTZW50XG4gICAqIEBzZWUgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L05ldHdvcmsvI2V2ZW50LXJlc3BvbnNlUmVjZWl2ZWRcbiAgICogQHBhcmFtIHtPYmplY3R9IGluZm9cbiAgICovXG4gIGFkZFJlcXVlc3RJbmZvIChpbmZvKSB7XG4gICAgaWYgKHRoaXMuX2NhcHR1cmUpIHtcbiAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5oYXMoaW5mby5yZXF1ZXN0SWQpKSB7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RzLmdldChpbmZvLnJlcXVlc3RJZCkuYWRkUmVxdWVzdEluZm8oaW5mbylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RzLnNldChpbmZvLnJlcXVlc3RJZCwgbmV3IENhcHR1cmVkUmVxdWVzdChpbmZvKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgSGFuZGxlcyB0aGUgTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudCBldmVudFxuICAgKiBAc2VlIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9OZXR3b3JrLyNldmVudC1yZXF1ZXN0V2lsbEJlU2VudFxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5mb1xuICAgKi9cbiAgcmVxdWVzdFdpbGxCZVNlbnQgKGluZm8pIHtcbiAgICBpZiAodGhpcy5fY2FwdHVyZSkge1xuICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmhhcyhpbmZvLnJlcXVlc3RJZCkpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdHMuZ2V0KGluZm8ucmVxdWVzdElkKS5hZGRSZXF1ZXN0SW5mbyhpbmZvKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdHMuc2V0KGluZm8ucmVxdWVzdElkLCBuZXcgQ2FwdHVyZWRSZXF1ZXN0KGluZm8pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBIYW5kbGVzIHRoZSBOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQgZXZlbnRcbiAgICogQHNlZSBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvTmV0d29yay8jZXZlbnQtcmVzcG9uc2VSZWNlaXZlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5mb1xuICAgKi9cbiAgcmVzcG9uc2VSZWNlaXZlZCAoaW5mbykge1xuICAgIGlmICh0aGlzLl9jYXB0dXJlKSB7XG4gICAgICBpZiAoIXRoaXMuX3JlcXVlc3RzLmhhcyhpbmZvLnJlcXVlc3RJZCkpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdHMuc2V0KGluZm8ucmVxdWVzdElkLCBuZXcgQ2FwdHVyZWRSZXF1ZXN0KGluZm8pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdHMuZ2V0KGluZm8ucmVxdWVzdElkKS5hZGRSZXF1ZXN0SW5mbyhpbmZvKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcC9AQGl0ZXJhdG9yXG4gICAqIEBkZXNjIEdldCBBbiBJdGVyYXRvciBPdmVyIFRoZSBSZXF1ZXN0IElkLCBSZXF1ZXN0IE9iamVjdCBQYWlyc1xuICAgKiBAcmV0dXJucyB7SXRlcmF0b3J9XG4gICAqL1xuICBbU3ltYm9sLml0ZXJhdG9yXSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzW1N5bWJvbC5pdGVyYXRvcl0oKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJlbW92ZSBBbGwgUmVxdWVzdHNcbiAgICovXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzLl9yZXF1ZXN0cy5jbGVhcigpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgRG9lcyBUaGUgSW50ZXJjZXB0b3IgSGF2ZSBUaGUgUmVxdWVzdCBPYmplY3QgQXNzb2NpYXRlZCBXaXRoIEEgUmVxdWVzdCBJZFxuICAgKiBAcGFyYW0geyFzdHJpbmd9IHJlcXVlc3RJZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGhhcyAocmVxdWVzdElkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmV0cmlldmUgVGhlIENvcnJlc3BvbmRpbmcgUmVxdWVzdCBPYmplY3QgRm9yIEEgUmVxdWVzdCBJZFxuICAgKiBAcGFyYW0geyFzdHJpbmd9IHJlcXVlc3RJZFxuICAgKiBAcmV0dXJucyB7Q2FwdHVyZWRSZXF1ZXN0fVxuICAgKi9cbiAgZ2V0IChyZXF1ZXN0SWQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMuZ2V0KHJlcXVlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgc2l6ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzLnNpemVcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBHZXQgQW4gSXRlcmF0b3IgT3ZlciBUaGUgUmVxdWVzdCBJZCwgUmVxdWVzdCBPYmplY3QgUGFpcnNcbiAgICogQHJldHVybnMge0l0ZXJhdG9yfVxuICAgKi9cbiAgZW50cmllcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzLmVudHJpZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEdldCBBbiBJdGVyYXRvciBPdmVyIFRoZSBSZXF1ZXN0IElkc1xuICAgKiBAcmV0dXJucyB7SXRlcmF0b3I8c3RyaW5nPn1cbiAgICovXG4gIGtleXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0cy5rZXlzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBHZXQgQW4gSXRlcmF0b3IgT3ZlciBUaGUgUmVxdWVzdCBPYmplY3RzXG4gICAqIEByZXR1cm5zIHtJdGVyYXRvcjxDYXB0dXJlZFJlcXVlc3Q+fVxuICAgKi9cbiAgdmFsdWVzICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMudmFsdWVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBBcHBseSBBbiBJdGVyYXRlZSBPbmNlIEZvciBFYWNoIE1hcHBlZCBSZXF1ZXN0IElkLCBSZXF1ZXN0IE9iamVjdCBQYWlyXG4gICAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBpdGVyYXRlZSB0aGUgZnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBvcHRpb25hbCB0aGlzIGFyZ3VtZW50XG4gICAqL1xuICBmb3JFYWNoIChpdGVyYXRlZSwgdGhpc0FyZykge1xuICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goaXRlcmF0ZWUsIHRoaXNBcmcpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7SXRlcmF0b3I8Q0RQUmVxdWVzdEluZm8+fVxuICAgKi9cbiAgKiBpdGVyYXRlUmVxdWVzdHMgKCkge1xuICAgIGZvciAobGV0IGNyIG9mIHRoaXMuX3JlcXVlc3RzLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGxldCByaSBvZiBjci52YWx1ZXMoKSkge1xuICAgICAgICB5aWVsZCByaVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtSZXF1ZXN0SGFuZGxlcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZXF1ZXN0SGFuZGxlclxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5pbmhlcml0cyhTdHJlYW0sIEVFKTtcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcycpO1xuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzJyk7XG5TdHJlYW0uRHVwbGV4ID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcycpO1xuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMnKTtcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcycpO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcblxuXG5cbi8vIG9sZC1zdHlsZSBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoZSBwaXBlIG1ldGhvZCAodGhlIG9ubHkgcmVsZXZhbnRcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gJGdldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gJGdldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9ICRnZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBSZWZsZWN0QXBwbHkodGhpcy5saXN0ZW5lciwgdGhpcy50YXJnZXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyogPHJlcGxhY2VtZW50PiAqL1xuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBvbkNvcmtlZEZpbmlzaChfdGhpcywgc3RhdGUpO1xuICB9O1xufVxuLyogPC9yZXBsYWNlbWVudD4gKi9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBhc3luY1dyaXRlID0gIXByb2Nlc3MuYnJvd3NlciAmJiBbJ3YwLjEwJywgJ3YwLjkuJ10uaW5kZXhPZihwcm9jZXNzLnZlcnNpb24uc2xpY2UoMCwgNSkpID4gLTEgPyBzZXRJbW1lZGlhdGUgOiBwbmEubmV4dFRpY2s7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBEdXBsZXg7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpbnRlcm5hbFV0aWwgPSB7XG4gIGRlcHJlY2F0ZTogcmVxdWlyZSgndXRpbC1kZXByZWNhdGUnKVxufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgT3VyVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xufVxuZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IG9iaiBpbnN0YW5jZW9mIE91clVpbnQ4QXJyYXk7XG59XG5cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpO1xuXG51dGlsLmluaGVyaXRzKFdyaXRhYmxlLCBTdHJlYW0pO1xuXG5mdW5jdGlvbiBub3AoKSB7fVxuXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgdmFyIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciB3cml0YWJsZUh3bSA9IG9wdGlvbnMud3JpdGFibGVIaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuXG4gIGlmIChod20gfHwgaHdtID09PSAwKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod207ZWxzZSBpZiAoaXNEdXBsZXggJiYgKHdyaXRhYmxlSHdtIHx8IHdyaXRhYmxlSHdtID09PSAwKSkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gd3JpdGFibGVId207ZWxzZSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWRcbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlO1xuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nLCAnREVQMDAwMycpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHt9XG59KSgpO1xuXG4vLyBUZXN0IF93cml0YWJsZVN0YXRlIGZvciBpbmhlcml0YW5jZSB0byBhY2NvdW50IGZvciBEdXBsZXggc3RyZWFtcyxcbi8vIHdob3NlIHByb3RvdHlwZSBjaGFpbiBvbmx5IHBvaW50cyB0byBSZWFkYWJsZS5cbnZhciByZWFsSGFzSW5zdGFuY2U7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaGFzSW5zdGFuY2UgJiYgdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdID09PSAnZnVuY3Rpb24nKSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICBpZiAocmVhbEhhc0luc3RhbmNlLmNhbGwodGhpcywgb2JqZWN0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodGhpcyAhPT0gV3JpdGFibGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3QuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICByZWFsSGFzSW5zdGFuY2UgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRvby5cbiAgLy8gYHJlYWxIYXNJbnN0YW5jZWAgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdXNpbmcgcGxhaW4gYGluc3RhbmNlb2ZgXG4gIC8vIHdvdWxkIHJldHVybiBmYWxzZSwgYXMgbm8gYF93cml0YWJsZVN0YXRlYCBwcm9wZXJ0eSBpcyBhdHRhY2hlZC5cblxuICAvLyBUcnlpbmcgdG8gdXNlIHRoZSBjdXN0b20gYGluc3RhbmNlb2ZgIGZvciBXcml0YWJsZSBoZXJlIHdpbGwgYWxzbyBicmVhayB0aGVcbiAgLy8gTm9kZS5qcyBMYXp5VHJhbnNmb3JtIGltcGxlbWVudGF0aW9uLCB3aGljaCBoYXMgYSBub24tdHJpdmlhbCBnZXR0ZXIgZm9yXG4gIC8vIGBfd3JpdGFibGVTdGF0ZWAgdGhhdCB3b3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgaWYgKCFyZWFsSGFzSW5zdGFuY2UuY2FsbChXcml0YWJsZSwgdGhpcykgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkge1xuICAgIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG4gIH1cblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maW5hbCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmluYWwgPSBvcHRpb25zLmZpbmFsO1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlJykpO1xufTtcblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgcG5hLm5leHRUaWNrKGNiLCBlcik7XG59XG5cbi8vIENoZWNrcyB0aGF0IGEgdXNlci1zdXBwbGllZCBjaHVuayBpcyB2YWxpZCwgZXNwZWNpYWxseSBmb3IgdGhlIHBhcnRpY3VsYXJcbi8vIG1vZGUgdGhlIHN0cmVhbSBpcyBpbi4gQ3VycmVudGx5IHRoaXMgbWVhbnMgdGhhdCBgbnVsbGAgaXMgbmV2ZXIgYWNjZXB0ZWRcbi8vIGFuZCB1bmRlZmluZWQvbm9uLXN0cmluZyB2YWx1ZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBvYmplY3QgbW9kZS5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG4gIHZhciBlciA9IGZhbHNlO1xuXG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcG5hLm5leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcbiAgdmFyIGlzQnVmID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgX2lzVWludDhBcnJheShjaHVuayk7XG5cbiAgaWYgKGlzQnVmICYmICFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChpc0J1ZikgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAoaXNCdWYgfHwgdmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBzdGF0ZS5jb3JrZWQrKztcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcblxuICBpZiAoc3luYykge1xuICAgIC8vIGRlZmVyIHRoZSBjYWxsYmFjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyB0byBhdm9pZCBwaWxpbmcgdXAgdGhpbmdzIG9uIHRoZSBzdGFja1xuICAgIHBuYS5uZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwbmEubmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgYXN5bmNXcml0ZShhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS07XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ193cml0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkICYmICFzdGF0ZS5maW5hbENhbGxlZCkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLl9maW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwbmEubmV4dFRpY2soY2FsbEZpbmFsLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHBuYS5uZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG4gIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gY29ya1JlcTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMuZW5kKCk7XG4gIGNiKGVycik7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBaU3RyZWFtKCkge1xuICAvKiBuZXh0IGlucHV0IGJ5dGUgKi9cbiAgdGhpcy5pbnB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X2luID0gMDtcbiAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBpbnB1dCAqL1xuICB0aGlzLmF2YWlsX2luID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovXG4gIHRoaXMudG90YWxfaW4gPSAwO1xuICAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi9cbiAgdGhpcy5vdXRwdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9vdXQgPSAwO1xuICAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBvdXRwdXQgKi9cbiAgdGhpcy5hdmFpbF9vdXQgPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX291dCA9IDA7XG4gIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqL1xuICB0aGlzLm1zZyA9ICcnLypaX05VTEwqLztcbiAgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovXG4gIHRoaXMuc3RhdGUgPSBudWxsO1xuICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovXG4gIHRoaXMuZGF0YV90eXBlID0gMi8qWl9VTktOT1dOKi87XG4gIC8qIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovXG4gIHRoaXMuYWRsZXIgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFpTdHJlYW07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIDI6ICAgICAgJ25lZWQgZGljdGlvbmFyeScsICAgICAvKiBaX05FRURfRElDVCAgICAgICAyICAqL1xuICAxOiAgICAgICdzdHJlYW0gZW5kJywgICAgICAgICAgLyogWl9TVFJFQU1fRU5EICAgICAgMSAgKi9cbiAgMDogICAgICAnJywgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovXG4gICctMSc6ICAgJ2ZpbGUgZXJyb3InLCAgICAgICAgICAvKiBaX0VSUk5PICAgICAgICAgKC0xKSAqL1xuICAnLTInOiAgICdzdHJlYW0gZXJyb3InLCAgICAgICAgLyogWl9TVFJFQU1fRVJST1IgICgtMikgKi9cbiAgJy0zJzogICAnZGF0YSBlcnJvcicsICAgICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovXG4gICctNCc6ICAgJ2luc3VmZmljaWVudCBtZW1vcnknLCAvKiBaX01FTV9FUlJPUiAgICAgKC00KSAqL1xuICAnLTUnOiAgICdidWZmZXIgZXJyb3InLCAgICAgICAgLyogWl9CVUZfRVJST1IgICAgICgtNSkgKi9cbiAgJy02JzogICAnaW5jb21wYXRpYmxlIHZlcnNpb24nIC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIi8qKlxuICogQHR5cGUge1NldDxzdHJpbmc+fVxuICovXG5jb25zdCBjYW5SZXBsYXlQcm90b2NvbHMgPSBuZXcgU2V0KFtcbiAgJ0hUVFAvMC45JyxcbiAgJ0hUVFAvMS4wJyxcbiAgJ0hUVFAvMS4xJyxcbiAgJ0RBVEEnLFxuICAnZGF0YSdcbl0pXG5cbi8qKlxuICogQHR5cGUge3tjYW5SZXBsYXlQcm90b2NvbHM6IFNldDxzdHJpbmc+LCBTUEFDRTogc3RyaW5nLCBIMk1ldGhvZDogc3RyaW5nLCBIVFRQMUQxOiBzdHJpbmcsIERBU0g6IHN0cmluZywgSDJwYXRoOiBzdHJpbmd9fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY2FuUmVwbGF5UHJvdG9jb2xzLFxuICBTUEFDRTogJyAnLFxuICBIMk1ldGhvZDogJzptZXRob2QnLFxuICBIMnBhdGg6ICc6cGF0aCcsXG4gIEhUVFAxRDE6ICdIVFRQLzEuMScsXG4gIERBU0g6ICctJ1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQGRlc2MgQnVmZmVycyBmcm9tIGhleCBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgYSBXQVJDIHJlY29yZHMgV0FSQy1UWVBFIG9yIHJlY29yZC9yZWNvcmQtc2VjdGlvbiBzZXBhcmF0b3JcbiAqIGFzIHNlZW4gYnkgdGhlIHBhcnNlci4gRHVlIHRvIHRoZSBsYXJnZSBzaXplIG9mIFdBUkMgZmlsZXMgYW5kIHRoZSBiaW5hcnkgZGF0YSBjb250YWluZWQgd2l0aGluIGl0IGlzIG1vcmUgZWZmaWNpZW50XG4gKiB0byBwYXJzZSB0aGUgZmlsZXMgY29udGVudHMgbG9va2luZyBmb3IgdGhlc2Ugc2VudGluZWxzIHRoYW4gY29udmVydGluZyB0aGUgYnVmZmVyIHRvIGFuIFVURi04IHN0cmluZyBmaXJzdFxuICogQHR5cGUge3tiZWdpbjogQnVmZmVyLCBpbmZvOiBCdWZmZXIsIG1kYXRhOiBCdWZmZXIsIHJlcTogQnVmZmVyLCByZXM6IEJ1ZmZlciwgcmV2aXNpdDogQnVmZmVyLCByZXNvdXJjZTogQnVmZmVyLCBjcmxmOiBCdWZmZXIsIGVtcHR5OiBCdWZmZXJ9fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICBiZWdpbjogQnVmZmVyLmZyb20oJzU3NDE1MjQzMmYnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICBpbmZvOiBCdWZmZXIuZnJvbSgnNTc0MTUyNDMyZDU0Nzk3MDY1M2EyMDc3NjE3MjYzNjk2ZTY2NmYnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICBtZGF0YTogQnVmZmVyLmZyb20oJzU3NDE1MjQzMmQ1NDc5NzA2NTNhMjA2ZDY1NzQ2MTY0NjE3NDYxJywgJ2hleCcpLFxuXG4gIC8qKlxuICAgKiBAdHlwZSB7QnVmZmVyfVxuICAgKi9cbiAgcmVxOiBCdWZmZXIuZnJvbSgnNTc0MTUyNDMyZDU0Nzk3MDY1M2EyMDcyNjU3MTc1NjU3Mzc0JywgJ2hleCcpLFxuXG4gIC8qKlxuICAgKiBAdHlwZSB7QnVmZmVyfVxuICAgKi9cbiAgcmVzOiBCdWZmZXIuZnJvbSgnNTc0MTUyNDMyZDU0Nzk3MDY1M2EyMDcyNjU3MzcwNmY2ZTczNjUnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICByZXZpc2l0OiBCdWZmZXIuZnJvbSgnNTc0MTUyNDMyZDU0Nzk3MDY1M2EyMDcyNjU3NjY5NzM2OTc0JywgJ2hleCcpLFxuXG4gIC8qKlxuICAgKiBAdHlwZSB7QnVmZmVyfVxuICAgKi9cbiAgcmVzb3VyY2U6IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzI2NTczNmY3NTcyNjM2NScsICdoZXgnKSxcblxuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIGNybGY6IEJ1ZmZlci5mcm9tKCcwZDBhJywgJ2hleCcpLFxuXG4gIC8qKlxuICAgKiBAdHlwZSB7QnVmZmVyfVxuICAgKi9cbiAgZW1wdHk6IEJ1ZmZlci5mcm9tKCcwZCcsICdoZXgnKVxufVxuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiIsInZhciBDbGllbnRSZXF1ZXN0ID0gcmVxdWlyZSgnLi9saWIvcmVxdWVzdCcpXG52YXIgcmVzcG9uc2UgPSByZXF1aXJlKCcuL2xpYi9yZXNwb25zZScpXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgneHRlbmQnKVxudmFyIHN0YXR1c0NvZGVzID0gcmVxdWlyZSgnYnVpbHRpbi1zdGF0dXMtY29kZXMnKVxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG5cbnZhciBodHRwID0gZXhwb3J0c1xuXG5odHRwLnJlcXVlc3QgPSBmdW5jdGlvbiAob3B0cywgY2IpIHtcblx0aWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJylcblx0XHRvcHRzID0gdXJsLnBhcnNlKG9wdHMpXG5cdGVsc2Vcblx0XHRvcHRzID0gZXh0ZW5kKG9wdHMpXG5cblx0Ly8gTm9ybWFsbHksIHRoZSBwYWdlIGlzIGxvYWRlZCBmcm9tIGh0dHAgb3IgaHR0cHMsIHNvIG5vdCBzcGVjaWZ5aW5nIGEgcHJvdG9jb2xcblx0Ly8gd2lsbCByZXN1bHQgaW4gYSAodmFsaWQpIHByb3RvY29sLXJlbGF0aXZlIHVybC4gSG93ZXZlciwgdGhpcyB3b24ndCB3b3JrIGlmXG5cdC8vIHRoZSBwcm90b2NvbCBpcyBzb21ldGhpbmcgZWxzZSwgbGlrZSAnZmlsZTonXG5cdHZhciBkZWZhdWx0UHJvdG9jb2wgPSBnbG9iYWwubG9jYXRpb24ucHJvdG9jb2wuc2VhcmNoKC9eaHR0cHM/OiQvKSA9PT0gLTEgPyAnaHR0cDonIDogJydcblxuXHR2YXIgcHJvdG9jb2wgPSBvcHRzLnByb3RvY29sIHx8IGRlZmF1bHRQcm90b2NvbFxuXHR2YXIgaG9zdCA9IG9wdHMuaG9zdG5hbWUgfHwgb3B0cy5ob3N0XG5cdHZhciBwb3J0ID0gb3B0cy5wb3J0XG5cdHZhciBwYXRoID0gb3B0cy5wYXRoIHx8ICcvJ1xuXG5cdC8vIE5lY2Vzc2FyeSBmb3IgSVB2NiBhZGRyZXNzZXNcblx0aWYgKGhvc3QgJiYgaG9zdC5pbmRleE9mKCc6JykgIT09IC0xKVxuXHRcdGhvc3QgPSAnWycgKyBob3N0ICsgJ10nXG5cblx0Ly8gVGhpcyBtYXkgYmUgYSByZWxhdGl2ZSB1cmwuIFRoZSBicm93c2VyIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBpbnRlcnByZXQgaXQgY29ycmVjdGx5LlxuXHRvcHRzLnVybCA9IChob3N0ID8gKHByb3RvY29sICsgJy8vJyArIGhvc3QpIDogJycpICsgKHBvcnQgPyAnOicgKyBwb3J0IDogJycpICsgcGF0aFxuXHRvcHRzLm1ldGhvZCA9IChvcHRzLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKVxuXHRvcHRzLmhlYWRlcnMgPSBvcHRzLmhlYWRlcnMgfHwge31cblxuXHQvLyBBbHNvIHZhbGlkIG9wdHMuYXV0aCwgb3B0cy5tb2RlXG5cblx0dmFyIHJlcSA9IG5ldyBDbGllbnRSZXF1ZXN0KG9wdHMpXG5cdGlmIChjYilcblx0XHRyZXEub24oJ3Jlc3BvbnNlJywgY2IpXG5cdHJldHVybiByZXFcbn1cblxuaHR0cC5nZXQgPSBmdW5jdGlvbiBnZXQgKG9wdHMsIGNiKSB7XG5cdHZhciByZXEgPSBodHRwLnJlcXVlc3Qob3B0cywgY2IpXG5cdHJlcS5lbmQoKVxuXHRyZXR1cm4gcmVxXG59XG5cbmh0dHAuQ2xpZW50UmVxdWVzdCA9IENsaWVudFJlcXVlc3Rcbmh0dHAuSW5jb21pbmdNZXNzYWdlID0gcmVzcG9uc2UuSW5jb21pbmdNZXNzYWdlXG5cbmh0dHAuQWdlbnQgPSBmdW5jdGlvbiAoKSB7fVxuaHR0cC5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cyA9IDRcblxuaHR0cC5nbG9iYWxBZ2VudCA9IG5ldyBodHRwLkFnZW50KClcblxuaHR0cC5TVEFUVVNfQ09ERVMgPSBzdGF0dXNDb2Rlc1xuXG5odHRwLk1FVEhPRFMgPSBbXG5cdCdDSEVDS09VVCcsXG5cdCdDT05ORUNUJyxcblx0J0NPUFknLFxuXHQnREVMRVRFJyxcblx0J0dFVCcsXG5cdCdIRUFEJyxcblx0J0xPQ0snLFxuXHQnTS1TRUFSQ0gnLFxuXHQnTUVSR0UnLFxuXHQnTUtBQ1RJVklUWScsXG5cdCdNS0NPTCcsXG5cdCdNT1ZFJyxcblx0J05PVElGWScsXG5cdCdPUFRJT05TJyxcblx0J1BBVENIJyxcblx0J1BPU1QnLFxuXHQnUFJPUEZJTkQnLFxuXHQnUFJPUFBBVENIJyxcblx0J1BVUkdFJyxcblx0J1BVVCcsXG5cdCdSRVBPUlQnLFxuXHQnU0VBUkNIJyxcblx0J1NVQlNDUklCRScsXG5cdCdUUkFDRScsXG5cdCdVTkxPQ0snLFxuXHQnVU5TVUJTQ1JJQkUnXG5dIiwiY29uc3Qgc3RhcnRDYXNlID0gcmVxdWlyZSgnbG9kYXNoL3N0YXJ0Q2FzZScpXG5jb25zdCB7IERBU0ggfSA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbnN0YW50cycpXG5jb25zdCB7IENSTEYgfSA9IHJlcXVpcmUoJy4uL3dyaXRlcnMvd2FyY0ZpZWxkcycpXG5cbi8qKlxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuY29uc3QgU1BBQ0VSZSA9IC9cXHMvZ1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJLZXlcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZW5zdXJlSFRUUDJIZWFkZXJzIChoZWFkZXJLZXkpIHtcbiAgaWYgKGhlYWRlcktleVswXSA9PT0gJzonKSByZXR1cm4gaGVhZGVyS2V5XG4gIHJldHVybiBzdGFydENhc2UoaGVhZGVyS2V5KS5yZXBsYWNlKFNQQUNFUmUsIERBU0gpXG59XG5cbi8qKlxuICogQGRlc2MgQ29udmVydHMgYW4gSFRUUCBoZWFkZXJzIG9iamVjdCBpbnRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJzIC0gVGhlIEhUVFAgaGVhZGVyIG9iamVjdCB0byBiZSBzdHJpbmdpZmllZFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0cy5zdHJpbmdpZnlIZWFkZXJzID0gZnVuY3Rpb24gc3RyaW5naWZ5SGVhZGVycyAoaGVhZGVycykge1xuICBsZXQgaGVhZGVyS2V5XG4gIGxldCBvdXRTdHJpbmcgPSBbXVxuICBmb3IgKGhlYWRlcktleSBpbiBoZWFkZXJzKSB7XG4gICAgb3V0U3RyaW5nLnB1c2goYCR7ZW5zdXJlSFRUUDJIZWFkZXJzKGhlYWRlcktleSl9OiAke2hlYWRlcnNbaGVhZGVyS2V5XX0ke0NSTEZ9YClcbiAgfVxuICAvLyBqb2luIHVzZWQgdG8gZml4IG1lbW9yeSBpc3N1ZSBjYXVzZWQgYnkgY29uY2F0ZW5hdGlvbjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzE3NSNjNFxuICAvLyBhZmZlY3RzIG5vZGVcbiAgcmV0dXJuIG91dFN0cmluZy5qb2luKCcnKVxufVxuXG4vKipcbiAqIEBkZXNjIENvbnZlcnRzIGFuIEhUVFAgcmVxdWVzdCBoZWFkZXJzIG9iamVjdCBpbnRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJzIC0gVGhlIEhUVFAgaGVhZGVycyBvYmplY3QgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IGZvciB0aGUgcmVxdWVzdCB0byBiZSB1c2VkIGlmIHRoZSBIVFRQIGhlYWRlcnMgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIEhvc3QgZmllbGRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydHMuc3RyaW5naWZ5UmVxdWVzdEhlYWRlcnMgPSBmdW5jdGlvbiBzdHJpbmdpZnlSZXF1ZXN0SGVhZGVycyAoaGVhZGVycywgaG9zdCkge1xuICBsZXQgaGFzSG9zdCA9IGZhbHNlXG4gIGxldCBoZWFkZXJLZXlcbiAgbGV0IG91dFN0cmluZyA9IFtdXG4gIGZvciAoaGVhZGVyS2V5IGluIGhlYWRlcnMpIHtcbiAgICBpZiAoaGVhZGVyS2V5ID09PSAnaG9zdCcgfHwgaGVhZGVyS2V5ID09PSAnSG9zdCcpIHtcbiAgICAgIGhhc0hvc3QgPSB0cnVlXG4gICAgfVxuICAgIG91dFN0cmluZy5wdXNoKGAke2Vuc3VyZUhUVFAySGVhZGVycyhoZWFkZXJLZXkpfTogJHtoZWFkZXJzW2hlYWRlcktleV19JHtDUkxGfWApXG4gIH1cbiAgaWYgKCFoYXNIb3N0KSB7XG4gICAgb3V0U3RyaW5nLnB1c2goYEhvc3Q6ICR7aG9zdH0ke0NSTEZ9YClcbiAgfVxuICAvLyBqb2luIHVzZWQgdG8gZml4IG1lbW9yeSBpc3N1ZSBjYXVzZWQgYnkgY29uY2F0ZW5hdGlvbjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzE3NSNjNFxuICAvLyBhZmZlY3RzIG5vZGVcbiAgcmV0dXJuIG91dFN0cmluZy5qb2luKCcnKVxufVxuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIGtQcm94eUV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG5cbiAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgdmFyIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgcmVhZGFibGVId20gPSBvcHRpb25zLnJlYWRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmIChyZWFkYWJsZUh3bSB8fCByZWFkYWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHJlYWRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICBjYihlcnIpO1xufTtcblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBza2lwQ2h1bmtDaGVjaztcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250LCBza2lwQ2h1bmtDaGVjaykge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2h1bmspICE9PSBCdWZmZXIucHJvdG90eXBlKSB7XG4gICAgICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50JykpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyO1xuICBpZiAoIV9pc1VpbnQ4QXJyYXkoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBwbmEubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHBuYS5uZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdW5waXBlSW5mbyA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaW5kZXggPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHBuYS5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgX3RoaXMucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwga1Byb3h5RXZlbnRzLmxlbmd0aDsgbisrKSB7XG4gICAgc3RyZWFtLm9uKGtQcm94eUV2ZW50c1tuXSwgdGhpcy5lbWl0LmJpbmQodGhpcywga1Byb3h5RXZlbnRzW25dKSk7XG4gIH1cblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICB0aGlzLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICB2YXIgcmV0O1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0ID0gc3RhdGUuYnVmZmVyLnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBzdGF0ZS5sZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGxpc3RcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgcmV0ID0gc3RhdGUuYnVmZmVyLmpvaW4oJycpO2Vsc2UgaWYgKHN0YXRlLmJ1ZmZlci5sZW5ndGggPT09IDEpIHJldCA9IHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGE7ZWxzZSByZXQgPSBzdGF0ZS5idWZmZXIuY29uY2F0KHN0YXRlLmxlbmd0aCk7XG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBwYXJ0IG9mIGxpc3RcbiAgICByZXQgPSBmcm9tTGlzdFBhcnRpYWwobiwgc3RhdGUuYnVmZmVyLCBzdGF0ZS5kZWNvZGVyKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbi8vIEV4dHJhY3RzIG9ubHkgZW5vdWdoIGJ1ZmZlcmVkIGRhdGEgdG8gc2F0aXNmeSB0aGUgYW1vdW50IHJlcXVlc3RlZC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3RQYXJ0aWFsKG4sIGxpc3QsIGhhc1N0cmluZ3MpIHtcbiAgdmFyIHJldDtcbiAgaWYgKG4gPCBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5nc1xuICAgIHJldCA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKDAsIG4pO1xuICAgIGxpc3QuaGVhZC5kYXRhID0gbGlzdC5oZWFkLmRhdGEuc2xpY2Uobik7XG4gIH0gZWxzZSBpZiAobiA9PT0gbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gZmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc3VsdCBzcGFucyBtb3JlIHRoYW4gb25lIGJ1ZmZlclxuICAgIHJldCA9IGhhc1N0cmluZ3MgPyBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSA6IGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGFcbi8vIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkge1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICB2YXIgcmV0ID0gcC5kYXRhO1xuICBuIC09IHJldC5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gc3RyLmxlbmd0aCA/IHN0ci5sZW5ndGggOiBuO1xuICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkgcmV0ICs9IHN0cjtlbHNlIHJldCArPSBzdHIuc2xpY2UoMCwgbik7XG4gICAgbiAtPSBuYjtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IHN0ci5zbGljZShuYik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgKytjO1xuICB9XG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXIobiwgbGlzdCkge1xuICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICBwLmRhdGEuY29weShyZXQpO1xuICBuIC09IHAuZGF0YS5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIGJ1ZiA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gYnVmLmxlbmd0aCA/IGJ1Zi5sZW5ndGggOiBuO1xuICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gYnVmLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignXCJlbmRSZWFkYWJsZSgpXCIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8vIHVuZG9jdW1lbnRlZCBjYigpIEFQSSwgbmVlZGVkIGZvciBjb3JlLCBub3QgZm9yIHB1YmxpYyBBUElcbmZ1bmN0aW9uIGRlc3Ryb3koZXJyLCBjYikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciByZWFkYWJsZURlc3Ryb3llZCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIHZhciB3cml0YWJsZURlc3Ryb3llZCA9IHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG5cbiAgaWYgKHJlYWRhYmxlRGVzdHJveWVkIHx8IHdyaXRhYmxlRGVzdHJveWVkKSB7XG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH0gZWxzZSBpZiAoZXJyICYmICghdGhpcy5fd3JpdGFibGVTdGF0ZSB8fCAhdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpKSB7XG4gICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gd2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuXG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gaWYgdGhpcyBpcyBhIGR1cGxleCBzdHJlYW0gbWFyayB0aGUgd3JpdGFibGUgcGFydCBhcyBkZXN0cm95ZWQgYXMgd2VsbFxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuXG4gIHRoaXMuX2Rlc3Ryb3koZXJyIHx8IG51bGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoIWNiICYmIGVycikge1xuICAgICAgcG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULCBfdGhpcywgZXJyKTtcbiAgICAgIGlmIChfdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICBfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gdW5kZXN0cm95KCkge1xuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRFcnJvck5UKHNlbGYsIGVycikge1xuICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gIHVuZGVzdHJveTogdW5kZXN0cm95XG59OyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgaXNFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nIHx8IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICBlbmNvZGluZyA9ICcnICsgZW5jb2Rpbmc7XG4gIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6Y2FzZSAndXRmOCc6Y2FzZSAndXRmLTgnOmNhc2UgJ2FzY2lpJzpjYXNlICdiaW5hcnknOmNhc2UgJ2Jhc2U2NCc6Y2FzZSAndWNzMic6Y2FzZSAndWNzLTInOmNhc2UgJ3V0ZjE2bGUnOmNhc2UgJ3V0Zi0xNmxlJzpjYXNlICdyYXcnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX25vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICBpZiAoIWVuYykgcmV0dXJuICd1dGY4JztcbiAgdmFyIHJldHJpZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmMpIHtcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gJ3V0ZjgnO1xuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuICd1dGYxNmxlJztcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gJ2xhdGluMSc7XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGVuYztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChyZXRyaWVkKSByZXR1cm47IC8vIHVuZGVmaW5lZFxuICAgICAgICBlbmMgPSAoJycgKyBlbmMpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHJpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuLy8gRG8gbm90IGNhY2hlIGBCdWZmZXIuaXNFbmNvZGluZ2Agd2hlbiBjaGVja2luZyBlbmNvZGluZyBuYW1lcyBhcyBzb21lXG4vLyBtb2R1bGVzIG1vbmtleS1wYXRjaCBpdCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgZW5jb2RpbmdzXG5mdW5jdGlvbiBub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgdmFyIG5lbmMgPSBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKTtcbiAgaWYgKHR5cGVvZiBuZW5jICE9PSAnc3RyaW5nJyAmJiAoQnVmZmVyLmlzRW5jb2RpbmcgPT09IGlzRW5jb2RpbmcgfHwgIWlzRW5jb2RpbmcoZW5jKSkpIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuYyk7XG4gIHJldHVybiBuZW5jIHx8IGVuYztcbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLlxuZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gU3RyaW5nRGVjb2RlcjtcbmZ1bmN0aW9uIFN0cmluZ0RlY29kZXIoZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nKTtcbiAgdmFyIG5iO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIHRoaXMudGV4dCA9IHV0ZjE2VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gdXRmMTZFbmQ7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIHRoaXMuZmlsbExhc3QgPSB1dGY4RmlsbExhc3Q7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgdGhpcy50ZXh0ID0gYmFzZTY0VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gYmFzZTY0RW5kO1xuICAgICAgbmIgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBzaW1wbGVXcml0ZTtcbiAgICAgIHRoaXMuZW5kID0gc2ltcGxlRW5kO1xuICAgICAgcmV0dXJuO1xuICB9XG4gIHRoaXMubGFzdE5lZWQgPSAwO1xuICB0aGlzLmxhc3RUb3RhbCA9IDA7XG4gIHRoaXMubGFzdENoYXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobmIpO1xufVxuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHI7XG4gIHZhciBpO1xuICBpZiAodGhpcy5sYXN0TmVlZCkge1xuICAgIHIgPSB0aGlzLmZpbGxMYXN0KGJ1Zik7XG4gICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIGkgPSB0aGlzLmxhc3ROZWVkO1xuICAgIHRoaXMubGFzdE5lZWQgPSAwO1xuICB9IGVsc2Uge1xuICAgIGkgPSAwO1xuICB9XG4gIGlmIChpIDwgYnVmLmxlbmd0aCkgcmV0dXJuIHIgPyByICsgdGhpcy50ZXh0KGJ1ZiwgaSkgOiB0aGlzLnRleHQoYnVmLCBpKTtcbiAgcmV0dXJuIHIgfHwgJyc7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSB1dGY4RW5kO1xuXG4vLyBSZXR1cm5zIG9ubHkgY29tcGxldGUgY2hhcmFjdGVycyBpbiBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUudGV4dCA9IHV0ZjhUZXh0O1xuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIHBhcnRpYWwgbm9uLVVURi04IGNoYXJhY3RlciB1c2luZyBieXRlcyBmcm9tIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5maWxsTGFzdCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgdGhpcy5sYXN0TmVlZCk7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpO1xuICB9XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn07XG5cbi8vIENoZWNrcyB0aGUgdHlwZSBvZiBhIFVURi04IGJ5dGUsIHdoZXRoZXIgaXQncyBBU0NJSSwgYSBsZWFkaW5nIGJ5dGUsIG9yIGFcbi8vIGNvbnRpbnVhdGlvbiBieXRlLiBJZiBhbiBpbnZhbGlkIGJ5dGUgaXMgZGV0ZWN0ZWQsIC0yIGlzIHJldHVybmVkLlxuZnVuY3Rpb24gdXRmOENoZWNrQnl0ZShieXRlKSB7XG4gIGlmIChieXRlIDw9IDB4N0YpIHJldHVybiAwO2Vsc2UgaWYgKGJ5dGUgPj4gNSA9PT0gMHgwNikgcmV0dXJuIDI7ZWxzZSBpZiAoYnl0ZSA+PiA0ID09PSAweDBFKSByZXR1cm4gMztlbHNlIGlmIChieXRlID4+IDMgPT09IDB4MUUpIHJldHVybiA0O1xuICByZXR1cm4gYnl0ZSA+PiA2ID09PSAweDAyID8gLTEgOiAtMjtcbn1cblxuLy8gQ2hlY2tzIGF0IG1vc3QgMyBieXRlcyBhdCB0aGUgZW5kIG9mIGEgQnVmZmVyIGluIG9yZGVyIHRvIGRldGVjdCBhblxuLy8gaW5jb21wbGV0ZSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3Rlci4gVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyAoMiwgMywgb3IgNClcbi8vIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgVVRGLTggY2hhcmFjdGVyIChpZiBhcHBsaWNhYmxlKSBhcmUgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tJbmNvbXBsZXRlKHNlbGYsIGJ1ZiwgaSkge1xuICB2YXIgaiA9IGJ1Zi5sZW5ndGggLSAxO1xuICBpZiAoaiA8IGkpIHJldHVybiAwO1xuICB2YXIgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMTtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMjtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkge1xuICAgICAgaWYgKG5iID09PSAyKSBuYiA9IDA7ZWxzZSBzZWxmLmxhc3ROZWVkID0gbmIgLSAzO1xuICAgIH1cbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIFZhbGlkYXRlcyBhcyBtYW55IGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciBhc1xuLy8gbmVlZGVkIG9yIGFyZSBhdmFpbGFibGUuIElmIHdlIHNlZSBhIG5vbi1jb250aW51YXRpb24gYnl0ZSB3aGVyZSB3ZSBleHBlY3Rcbi8vIG9uZSwgd2UgXCJyZXBsYWNlXCIgdGhlIHZhbGlkYXRlZCBjb250aW51YXRpb24gYnl0ZXMgd2UndmUgc2VlbiBzbyBmYXIgd2l0aFxuLy8gYSBzaW5nbGUgVVRGLTggcmVwbGFjZW1lbnQgY2hhcmFjdGVyICgnXFx1ZmZmZCcpLCB0byBtYXRjaCB2OCdzIFVURi04IGRlY29kaW5nXG4vLyBiZWhhdmlvci4gVGhlIGNvbnRpbnVhdGlvbiBieXRlIGNoZWNrIGlzIGluY2x1ZGVkIHRocmVlIHRpbWVzIGluIHRoZSBjYXNlXG4vLyB3aGVyZSBhbGwgb2YgdGhlIGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBjaGFyYWN0ZXIgZXhpc3QgaW4gdGhlIHNhbWUgYnVmZmVyLlxuLy8gSXQgaXMgYWxzbyBkb25lIHRoaXMgd2F5IGFzIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIGluY3JlYXNlIGluc3RlYWQgb2YgdXNpbmcgYVxuLy8gbG9vcC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0V4dHJhQnl0ZXMoc2VsZiwgYnVmLCBwKSB7XG4gIGlmICgoYnVmWzBdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICBzZWxmLmxhc3ROZWVkID0gMDtcbiAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICB9XG4gIGlmIChzZWxmLmxhc3ROZWVkID4gMSAmJiBidWYubGVuZ3RoID4gMSkge1xuICAgIGlmICgoYnVmWzFdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgIHNlbGYubGFzdE5lZWQgPSAxO1xuICAgICAgcmV0dXJuICdcXHVmZmZkJztcbiAgICB9XG4gICAgaWYgKHNlbGYubGFzdE5lZWQgPiAyICYmIGJ1Zi5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAoKGJ1ZlsyXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgIHNlbGYubGFzdE5lZWQgPSAyO1xuICAgICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXIuXG5mdW5jdGlvbiB1dGY4RmlsbExhc3QoYnVmKSB7XG4gIHZhciBwID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmLCBwKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHI7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn1cblxuLy8gUmV0dXJucyBhbGwgY29tcGxldGUgVVRGLTggY2hhcmFjdGVycyBpbiBhIEJ1ZmZlci4gSWYgdGhlIEJ1ZmZlciBlbmRlZCBvbiBhXG4vLyBwYXJ0aWFsIGNoYXJhY3RlciwgdGhlIGNoYXJhY3RlcidzIGJ5dGVzIGFyZSBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWlyZWRcbi8vIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gdXRmOFRleHQoYnVmLCBpKSB7XG4gIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpKTtcbiAgaWYgKCF0aGlzLmxhc3ROZWVkKSByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSk7XG4gIHRoaXMubGFzdFRvdGFsID0gdG90YWw7XG4gIHZhciBlbmQgPSBidWYubGVuZ3RoIC0gKHRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpLCBlbmQpO1xufVxuXG4vLyBGb3IgVVRGLTgsIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGlzIGFkZGVkIHdoZW4gZW5kaW5nIG9uIGEgcGFydGlhbFxuLy8gY2hhcmFjdGVyLlxuZnVuY3Rpb24gdXRmOEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyAnXFx1ZmZmZCc7XG4gIHJldHVybiByO1xufVxuXG4vLyBVVEYtMTZMRSB0eXBpY2FsbHkgbmVlZHMgdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXIsIGJ1dCBldmVuIGlmIHdlIGhhdmUgYW4gZXZlblxuLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBlbmQgb24gYSBsZWFkaW5nL2hpZ2hcbi8vIHN1cnJvZ2F0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHR3byBieXRlcyBpbiBvcmRlciB0b1xuLy8gZGVjb2RlIHRoZSBsYXN0IGNoYXJhY3RlciBwcm9wZXJseS5cbmZ1bmN0aW9uIHV0ZjE2VGV4dChidWYsIGkpIHtcbiAgaWYgKChidWYubGVuZ3RoIC0gaSkgJSAyID09PSAwKSB7XG4gICAgdmFyIHIgPSBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpKTtcbiAgICBpZiAocikge1xuICAgICAgdmFyIGMgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmxhc3ROZWVkID0gMjtcbiAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0O1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDE7XG4gIHRoaXMubGFzdFRvdGFsID0gMjtcbiAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpLCBidWYubGVuZ3RoIC0gMSk7XG59XG5cbi8vIEZvciBVVEYtMTZMRSB3ZSBkbyBub3QgZXhwbGljaXRseSBhcHBlbmQgc3BlY2lhbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGlmIHdlXG4vLyBlbmQgb24gYSBwYXJ0aWFsIGNoYXJhY3Rlciwgd2Ugc2ltcGx5IGxldCB2OCBoYW5kbGUgdGhhdC5cbmZ1bmN0aW9uIHV0ZjE2RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgICByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ3V0ZjE2bGUnLCAwLCBlbmQpO1xuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaSkge1xuICB2YXIgbiA9IChidWYubGVuZ3RoIC0gaSkgJSAzO1xuICBpZiAobiA9PT0gMCkgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSk7XG4gIHRoaXMubGFzdE5lZWQgPSAzIC0gbjtcbiAgdGhpcy5sYXN0VG90YWwgPSAzO1xuICBpZiAobiA9PT0gMSkge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGksIGJ1Zi5sZW5ndGggLSBuKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ2Jhc2U2NCcsIDAsIDMgLSB0aGlzLmxhc3ROZWVkKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFBhc3MgYnl0ZXMgb24gdGhyb3VnaCBmb3Igc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChlLmcuIGFzY2lpLCBsYXRpbjEsIGhleClcbmZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1Zikge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFbmQoYnVmKSB7XG4gIHJldHVybiBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcblxuICB2YXIgY2IgPSB0cy53cml0ZWNiO1xuXG4gIGlmICghY2IpIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignd3JpdGUgY2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzJykpO1xuICB9XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9IG51bGwpIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHRoaXMucHVzaChkYXRhKTtcblxuICBjYihlcik7XG5cbiAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtcblxuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IHtcbiAgICBhZnRlclRyYW5zZm9ybTogYWZ0ZXJUcmFuc2Zvcm0uYmluZCh0aGlzKSxcbiAgICBuZWVkVHJhbnNmb3JtOiBmYWxzZSxcbiAgICB0cmFuc2Zvcm1pbmc6IGZhbHNlLFxuICAgIHdyaXRlY2I6IG51bGwsXG4gICAgd3JpdGVjaHVuazogbnVsbCxcbiAgICB3cml0ZWVuY29kaW5nOiBudWxsXG4gIH07XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdGhpcy5vbigncHJlZmluaXNoJywgcHJlZmluaXNoKTtcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLl9mbHVzaChmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICAgIGRvbmUoX3RoaXMsIGVyLCBkYXRhKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBkb25lKHRoaXMsIG51bGwsIG51bGwpO1xuICB9XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ190cmFuc2Zvcm0oKSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fCBycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB2YXIgX3RoaXMyID0gdGhpcztcblxuICBEdXBsZXgucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcywgZXJyLCBmdW5jdGlvbiAoZXJyMikge1xuICAgIGNiKGVycjIpO1xuICAgIF90aGlzMi5lbWl0KCdjbG9zZScpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGRvbmUoc3RyZWFtLCBlciwgZGF0YSkge1xuICBpZiAoZXIpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG5cbiAgaWYgKGRhdGEgIT0gbnVsbCkgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgaWYgKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG5cbiAgaWYgKHN0cmVhbS5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBjb21wYXJlIGFuZCBpc0J1ZmZlciB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2Jsb2IvNjgwZTllNWU0ODhmMjJhYWMyNzU5OWE1N2RjODQ0YTYzMTU5MjhkZC9pbmRleC5qc1xuLy8gb3JpZ2luYWwgbm90aWNlOlxuXG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciB4ID0gYS5sZW5ndGg7XG4gIHZhciB5ID0gYi5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV07XG4gICAgICB5ID0gYltpXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoeSA8IHgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlzQnVmZmVyKGIpIHtcbiAgaWYgKGdsb2JhbC5CdWZmZXIgJiYgdHlwZW9mIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihiKTtcbiAgfVxuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKTtcbn1cblxuLy8gYmFzZWQgb24gbm9kZSBhc3NlcnQsIG9yaWdpbmFsIG5vdGljZTpcbi8vIE5COiBUaGUgVVJMIHRvIHRoZSBDb21tb25KUyBzcGVjIGlzIGtlcHQganVzdCBmb3IgdHJhZGl0aW9uLlxuLy8gICAgIG5vZGUtYXNzZXJ0IGhhcyBldm9sdmVkIGEgbG90IHNpbmNlIHRoZW4sIGJvdGggaW4gQVBJIGFuZCBiZWhhdmlvci5cblxuLy8gaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvVW5pdF9UZXN0aW5nLzEuMFxuLy9cbi8vIFRISVMgSVMgTk9UIFRFU1RFRCBOT1IgTElLRUxZIFRPIFdPUksgT1VUU0lERSBWOCFcbi8vXG4vLyBPcmlnaW5hbGx5IGZyb20gbmFyd2hhbC5qcyAoaHR0cDovL25hcndoYWxqcy5vcmcpXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIFJvYmluc29uIDwyODBub3J0aC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbC8nKTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHBTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBmdW5jdGlvbnNIYXZlTmFtZXMgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9vKCkge30ubmFtZSA9PT0gJ2Zvbyc7XG59KCkpO1xuZnVuY3Rpb24gcFRvU3RyaW5nIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xufVxuZnVuY3Rpb24gaXNWaWV3KGFycmJ1Zikge1xuICBpZiAoaXNCdWZmZXIoYXJyYnVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYXJyYnVmKTtcbiAgfVxuICBpZiAoIWFycmJ1Zikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYXJyYnVmIGluc3RhbmNlb2YgRGF0YVZpZXcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYXJyYnVmLmJ1ZmZlciAmJiBhcnJidWYuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4vLyAxLiBUaGUgYXNzZXJ0IG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdCB0aHJvd1xuLy8gQXNzZXJ0aW9uRXJyb3IncyB3aGVuIHBhcnRpY3VsYXIgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4gVGhlXG4vLyBhc3NlcnQgbW9kdWxlIG11c3QgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIGludGVyZmFjZS5cblxudmFyIGFzc2VydCA9IG1vZHVsZS5leHBvcnRzID0gb2s7XG5cbi8vIDIuIFRoZSBBc3NlcnRpb25FcnJvciBpcyBkZWZpbmVkIGluIGFzc2VydC5cbi8vIG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IoeyBtZXNzYWdlOiBtZXNzYWdlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCB9KVxuXG52YXIgcmVnZXggPSAvXFxzKmZ1bmN0aW9uXFxzKyhbXlxcKFxcc10qKVxccyovO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9mdW5jdGlvbi5wcm90b3R5cGUubmFtZS9ibG9iL2FkZWVlZWM4YmZjYzYwNjhiMTg3ZDdkOWZiM2Q1YmIxZDNhMzA4OTkvaW1wbGVtZW50YXRpb24uanNcbmZ1bmN0aW9uIGdldE5hbWUoZnVuYykge1xuICBpZiAoIXV0aWwuaXNGdW5jdGlvbihmdW5jKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzKSB7XG4gICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgfVxuICB2YXIgc3RyID0gZnVuYy50b1N0cmluZygpO1xuICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2gocmVnZXgpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59XG5hc3NlcnQuQXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKSB7XG4gIHRoaXMubmFtZSA9ICdBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuYWN0dWFsID0gb3B0aW9ucy5hY3R1YWw7XG4gIHRoaXMuZXhwZWN0ZWQgPSBvcHRpb25zLmV4cGVjdGVkO1xuICB0aGlzLm9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvcjtcbiAgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBnZXRNZXNzYWdlKHRoaXMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0YWNrU3RhcnRGdW5jdGlvbiA9IG9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9uIHx8IGZhaWw7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gZ2V0TmFtZShzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICAgICAgdmFyIGlkeCA9IG91dC5pbmRleE9mKCdcXG4nICsgZm5fbmFtZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgLy8gb25jZSB3ZSBoYXZlIGxvY2F0ZWQgdGhlIGZ1bmN0aW9uIGZyYW1lXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RyaXAgb3V0IGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IChhbmQgaXRzIGxpbmUpXG4gICAgICAgIHZhciBuZXh0X2xpbmUgPSBvdXQuaW5kZXhPZignXFxuJywgaWR4ICsgMSk7XG4gICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcobmV4dF9saW5lICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhY2sgPSBvdXQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IgaW5zdGFuY2VvZiBFcnJvclxudXRpbC5pbmhlcml0cyhhc3NlcnQuQXNzZXJ0aW9uRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gdHJ1bmNhdGUocywgbikge1xuICBpZiAodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoIDwgbiA/IHMgOiBzLnNsaWNlKDAsIG4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzO1xuICB9XG59XG5mdW5jdGlvbiBpbnNwZWN0KHNvbWV0aGluZykge1xuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzIHx8ICF1dGlsLmlzRnVuY3Rpb24oc29tZXRoaW5nKSkge1xuICAgIHJldHVybiB1dGlsLmluc3BlY3Qoc29tZXRoaW5nKTtcbiAgfVxuICB2YXIgcmF3bmFtZSA9IGdldE5hbWUoc29tZXRoaW5nKTtcbiAgdmFyIG5hbWUgPSByYXduYW1lID8gJzogJyArIHJhd25hbWUgOiAnJztcbiAgcmV0dXJuICdbRnVuY3Rpb24nICsgIG5hbWUgKyAnXSc7XG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlKHNlbGYpIHtcbiAgcmV0dXJuIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5hY3R1YWwpLCAxMjgpICsgJyAnICtcbiAgICAgICAgIHNlbGYub3BlcmF0b3IgKyAnICcgK1xuICAgICAgICAgdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmV4cGVjdGVkKSwgMTI4KTtcbn1cblxuLy8gQXQgcHJlc2VudCBvbmx5IHRoZSB0aHJlZSBrZXlzIG1lbnRpb25lZCBhYm92ZSBhcmUgdXNlZCBhbmRcbi8vIHVuZGVyc3Rvb2QgYnkgdGhlIHNwZWMuIEltcGxlbWVudGF0aW9ucyBvciBzdWIgbW9kdWxlcyBjYW4gcGFzc1xuLy8gb3RoZXIga2V5cyB0byB0aGUgQXNzZXJ0aW9uRXJyb3IncyBjb25zdHJ1Y3RvciAtIHRoZXkgd2lsbCBiZVxuLy8gaWdub3JlZC5cblxuLy8gMy4gQWxsIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG11c3QgdGhyb3cgYW4gQXNzZXJ0aW9uRXJyb3Jcbi8vIHdoZW4gYSBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB3aXRoIGEgbWVzc2FnZSB0aGF0XG4vLyBtYXkgYmUgdW5kZWZpbmVkIGlmIG5vdCBwcm92aWRlZC4gIEFsbCBhc3NlcnRpb24gbWV0aG9kcyBwcm92aWRlXG4vLyBib3RoIHRoZSBhY3R1YWwgYW5kIGV4cGVjdGVkIHZhbHVlcyB0byB0aGUgYXNzZXJ0aW9uIGVycm9yIGZvclxuLy8gZGlzcGxheSBwdXJwb3Nlcy5cblxuZnVuY3Rpb24gZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvciwgc3RhY2tTdGFydEZ1bmN0aW9uKSB7XG4gIHRocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYWN0dWFsOiBhY3R1YWwsXG4gICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICBzdGFja1N0YXJ0RnVuY3Rpb246IHN0YWNrU3RhcnRGdW5jdGlvblxuICB9KTtcbn1cblxuLy8gRVhURU5TSU9OISBhbGxvd3MgZm9yIHdlbGwgYmVoYXZlZCBlcnJvcnMgZGVmaW5lZCBlbHNld2hlcmUuXG5hc3NlcnQuZmFpbCA9IGZhaWw7XG5cbi8vIDQuIFB1cmUgYXNzZXJ0aW9uIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0cnV0aHksIGFzIGRldGVybWluZWRcbi8vIGJ5ICEhZ3VhcmQuXG4vLyBhc3NlcnQub2soZ3VhcmQsIG1lc3NhZ2Vfb3B0KTtcbi8vIFRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gYXNzZXJ0LmVxdWFsKHRydWUsICEhZ3VhcmQsXG4vLyBtZXNzYWdlX29wdCk7LiBUbyB0ZXN0IHN0cmljdGx5IGZvciB0aGUgdmFsdWUgdHJ1ZSwgdXNlXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwodHJ1ZSwgZ3VhcmQsIG1lc3NhZ2Vfb3B0KTsuXG5cbmZ1bmN0aW9uIG9rKHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIGZhaWwodmFsdWUsIHRydWUsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5vayk7XG59XG5hc3NlcnQub2sgPSBvaztcblxuLy8gNS4gVGhlIGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzaGFsbG93LCBjb2VyY2l2ZSBlcXVhbGl0eSB3aXRoXG4vLyA9PS5cbi8vIGFzc2VydC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPSBleHBlY3RlZCkgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQuZXF1YWwpO1xufTtcblxuLy8gNi4gVGhlIG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbFxuLy8gd2l0aCAhPSBhc3NlcnQubm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiBub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPScsIGFzc2VydC5ub3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDcuIFRoZSBlcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgYSBkZWVwIGVxdWFsaXR5IHJlbGF0aW9uLlxuLy8gYXNzZXJ0LmRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5kZWVwRXF1YWwgPSBmdW5jdGlvbiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcEVxdWFsJywgYXNzZXJ0LmRlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBkZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwU3RyaWN0RXF1YWwnLCBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKSB7XG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgJiYgaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCkgPT09IDA7XG5cbiAgLy8gNy4yLiBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBEYXRlIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBEYXRlIG9iamVjdCB0aGF0IHJlZmVycyB0byB0aGUgc2FtZSB0aW1lLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNEYXRlKGFjdHVhbCkgJiYgdXRpbC5pc0RhdGUoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5nZXRUaW1lKCkgPT09IGV4cGVjdGVkLmdldFRpbWUoKTtcblxuICAvLyA3LjMgSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBSZWdFeHAgb2JqZWN0IHdpdGggdGhlIHNhbWUgc291cmNlIGFuZFxuICAvLyBwcm9wZXJ0aWVzIChgZ2xvYmFsYCwgYG11bHRpbGluZWAsIGBsYXN0SW5kZXhgLCBgaWdub3JlQ2FzZWApLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNSZWdFeHAoYWN0dWFsKSAmJiB1dGlsLmlzUmVnRXhwKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuc291cmNlID09PSBleHBlY3RlZC5zb3VyY2UgJiZcbiAgICAgICAgICAgYWN0dWFsLmdsb2JhbCA9PT0gZXhwZWN0ZWQuZ2xvYmFsICYmXG4gICAgICAgICAgIGFjdHVhbC5tdWx0aWxpbmUgPT09IGV4cGVjdGVkLm11bHRpbGluZSAmJlxuICAgICAgICAgICBhY3R1YWwubGFzdEluZGV4ID09PSBleHBlY3RlZC5sYXN0SW5kZXggJiZcbiAgICAgICAgICAgYWN0dWFsLmlnbm9yZUNhc2UgPT09IGV4cGVjdGVkLmlnbm9yZUNhc2U7XG5cbiAgLy8gNy40LiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKChhY3R1YWwgPT09IG51bGwgfHwgdHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcpICYmXG4gICAgICAgICAgICAgKGV4cGVjdGVkID09PSBudWxsIHx8IHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIHN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gSWYgYm90aCB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZiB0eXBlZCBhcnJheXMsIHdyYXAgdGhlaXIgdW5kZXJseWluZ1xuICAvLyBBcnJheUJ1ZmZlcnMgaW4gYSBCdWZmZXIgZWFjaCB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZVxuICAvLyBUaGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyB0aGUgYXJyYXlzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjaGVja2VkIGJ5XG4gIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgKGFrYSBwVG9TdHJpbmcpLiBOZXZlciBwZXJmb3JtIGJpbmFyeVxuICAvLyBjb21wYXJpc29ucyBmb3IgRmxvYXQqQXJyYXlzLCB0aG91Z2gsIHNpbmNlIGUuZy4gKzAgPT09IC0wIGJ1dCB0aGVpclxuICAvLyBiaXQgcGF0dGVybnMgYXJlIG5vdCBpZGVudGljYWwuXG4gIH0gZWxzZSBpZiAoaXNWaWV3KGFjdHVhbCkgJiYgaXNWaWV3KGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgIHBUb1N0cmluZyhhY3R1YWwpID09PSBwVG9TdHJpbmcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgIShhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICAgICAgICAgICAgIGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkpIHtcbiAgICByZXR1cm4gY29tcGFyZShuZXcgVWludDhBcnJheShhY3R1YWwuYnVmZmVyKSxcbiAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShleHBlY3RlZC5idWZmZXIpKSA9PT0gMDtcblxuICAvLyA3LjUgRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAvLyBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgLy8gd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAvLyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gIC8vIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gIC8vIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgIT09IGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBtZW1vcyA9IG1lbW9zIHx8IHthY3R1YWw6IFtdLCBleHBlY3RlZDogW119O1xuXG4gICAgdmFyIGFjdHVhbEluZGV4ID0gbWVtb3MuYWN0dWFsLmluZGV4T2YoYWN0dWFsKTtcbiAgICBpZiAoYWN0dWFsSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoYWN0dWFsSW5kZXggPT09IG1lbW9zLmV4cGVjdGVkLmluZGV4T2YoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9zLmFjdHVhbC5wdXNoKGFjdHVhbCk7XG4gICAgbWVtb3MuZXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG5cbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykge1xuICBpZiAoYSA9PT0gbnVsbCB8fCBhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBpZiBvbmUgaXMgYSBwcmltaXRpdmUsIHRoZSBvdGhlciBtdXN0IGJlIHNhbWVcbiAgaWYgKHV0aWwuaXNQcmltaXRpdmUoYSkgfHwgdXRpbC5pc1ByaW1pdGl2ZShiKSlcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgaWYgKHN0cmljdCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkgIT09IE9iamVjdC5nZXRQcm90b3R5cGVPZihiKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHZhciBhSXNBcmdzID0gaXNBcmd1bWVudHMoYSk7XG4gIHZhciBiSXNBcmdzID0gaXNBcmd1bWVudHMoYik7XG4gIGlmICgoYUlzQXJncyAmJiAhYklzQXJncykgfHwgKCFhSXNBcmdzICYmIGJJc0FyZ3MpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGFJc0FyZ3MpIHtcbiAgICBhID0gcFNsaWNlLmNhbGwoYSk7XG4gICAgYiA9IHBTbGljZS5jYWxsKGIpO1xuICAgIHJldHVybiBfZGVlcEVxdWFsKGEsIGIsIHN0cmljdCk7XG4gIH1cbiAgdmFyIGthID0gb2JqZWN0S2V5cyhhKTtcbiAgdmFyIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgdmFyIGtleSwgaTtcbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy90aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT09IGtiW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmRcbiAgLy9+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG4gICAgaWYgKCFfZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gOC4gVGhlIG5vbi1lcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgZm9yIGFueSBkZWVwIGluZXF1YWxpdHkuXG4vLyBhc3NlcnQubm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIG5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBFcXVhbCcsIGFzc2VydC5ub3REZWVwRXF1YWwpO1xuICB9XG59O1xuXG5hc3NlcnQubm90RGVlcFN0cmljdEVxdWFsID0gbm90RGVlcFN0cmljdEVxdWFsO1xuZnVuY3Rpb24gbm90RGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwU3RyaWN0RXF1YWwnLCBub3REZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59XG5cblxuLy8gOS4gVGhlIHN0cmljdCBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc3RyaWN0IGVxdWFsaXR5LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbi8vIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5zdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIHN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PT0nLCBhc3NlcnQuc3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG4vLyAxMC4gVGhlIHN0cmljdCBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciBzdHJpY3QgaW5lcXVhbGl0eSwgYXNcbi8vIGRldGVybWluZWQgYnkgIT09LiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gZnVuY3Rpb24gbm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9PScsIGFzc2VydC5ub3RTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChleHBlY3RlZCkgPT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQudGVzdChhY3R1YWwpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElnbm9yZS4gIFRoZSBpbnN0YW5jZW9mIGNoZWNrIGRvZXNuJ3Qgd29yayBmb3IgYXJyb3cgZnVuY3Rpb25zLlxuICB9XG5cbiAgaWYgKEVycm9yLmlzUHJvdG90eXBlT2YoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGV4cGVjdGVkLmNhbGwoe30sIGFjdHVhbCkgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIF90cnlCbG9jayhibG9jaykge1xuICB2YXIgZXJyb3I7XG4gIHRyeSB7XG4gICAgYmxvY2soKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yID0gZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbmZ1bmN0aW9uIF90aHJvd3Moc2hvdWxkVGhyb3csIGJsb2NrLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICB2YXIgYWN0dWFsO1xuXG4gIGlmICh0eXBlb2YgYmxvY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJsb2NrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJykge1xuICAgIG1lc3NhZ2UgPSBleHBlY3RlZDtcbiAgICBleHBlY3RlZCA9IG51bGw7XG4gIH1cblxuICBhY3R1YWwgPSBfdHJ5QmxvY2soYmxvY2spO1xuXG4gIG1lc3NhZ2UgPSAoZXhwZWN0ZWQgJiYgZXhwZWN0ZWQubmFtZSA/ICcgKCcgKyBleHBlY3RlZC5uYW1lICsgJykuJyA6ICcuJykgK1xuICAgICAgICAgICAgKG1lc3NhZ2UgPyAnICcgKyBtZXNzYWdlIDogJy4nKTtcblxuICBpZiAoc2hvdWxkVGhyb3cgJiYgIWFjdHVhbCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ01pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgdmFyIHVzZXJQcm92aWRlZE1lc3NhZ2UgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZyc7XG4gIHZhciBpc1Vud2FudGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIHV0aWwuaXNFcnJvcihhY3R1YWwpO1xuICB2YXIgaXNVbmV4cGVjdGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIGFjdHVhbCAmJiAhZXhwZWN0ZWQ7XG5cbiAgaWYgKChpc1Vud2FudGVkRXhjZXB0aW9uICYmXG4gICAgICB1c2VyUHJvdmlkZWRNZXNzYWdlICYmXG4gICAgICBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHxcbiAgICAgIGlzVW5leHBlY3RlZEV4Y2VwdGlvbikge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ0dvdCB1bndhbnRlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICBpZiAoKHNob3VsZFRocm93ICYmIGFjdHVhbCAmJiBleHBlY3RlZCAmJlxuICAgICAgIWV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fCAoIXNob3VsZFRocm93ICYmIGFjdHVhbCkpIHtcbiAgICB0aHJvdyBhY3R1YWw7XG4gIH1cbn1cblxuLy8gMTEuIEV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yOlxuLy8gYXNzZXJ0LnRocm93cyhibG9jaywgRXJyb3Jfb3B0LCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyh0cnVlLCBibG9jaywgZXJyb3IsIG1lc3NhZ2UpO1xufTtcblxuLy8gRVhURU5TSU9OISBUaGlzIGlzIGFubm95aW5nIHRvIHdyaXRlIG91dHNpZGUgdGhpcyBtb2R1bGUuXG5hc3NlcnQuZG9lc05vdFRocm93ID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MoZmFsc2UsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKGVycikgeyBpZiAoZXJyKSB0aHJvdyBlcnI7IH07XG5cbi8vIEV4cG9zZSBhIHN0cmljdCBvbmx5IHZhcmlhbnQgb2YgYXNzZXJ0XG5mdW5jdGlvbiBzdHJpY3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09Jywgc3RyaWN0KTtcbn1cbmFzc2VydC5zdHJpY3QgPSBvYmplY3RBc3NpZ24oc3RyaWN0LCBhc3NlcnQsIHtcbiAgZXF1YWw6IGFzc2VydC5zdHJpY3RFcXVhbCxcbiAgZGVlcEVxdWFsOiBhc3NlcnQuZGVlcFN0cmljdEVxdWFsLFxuICBub3RFcXVhbDogYXNzZXJ0Lm5vdFN0cmljdEVxdWFsLFxuICBub3REZWVwRXF1YWw6IGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWxcbn0pO1xuYXNzZXJ0LnN0cmljdC5zdHJpY3QgPSBhc3NlcnQuc3RyaWN0O1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXNPd24uY2FsbChvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIHx8XG4gIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIHZhciBkZXNjcmlwdG9ycyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgZGVzY3JpcHRvcnNba2V5c1tpXV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9ycztcbiAgfTtcblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG52YXIga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2woJ3V0aWwucHJvbWlzaWZ5LmN1c3RvbScpIDogdW5kZWZpbmVkO1xuXG5leHBvcnRzLnByb21pc2lmeSA9IGZ1bmN0aW9uIHByb21pc2lmeShvcmlnaW5hbCkge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9yaWdpbmFsXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7XG5cbiAgaWYgKGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCAmJiBvcmlnaW5hbFtrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2xdKSB7XG4gICAgdmFyIGZuID0gb3JpZ2luYWxba0N1c3RvbVByb21pc2lmaWVkU3ltYm9sXTtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ1dGlsLnByb21pc2lmeS5jdXN0b21cIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmbiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgZnVuY3Rpb24gZm4oKSB7XG4gICAgdmFyIHByb21pc2VSZXNvbHZlLCBwcm9taXNlUmVqZWN0O1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcHJvbWlzZVJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgcHJvbWlzZVJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cbiAgICBhcmdzLnB1c2goZnVuY3Rpb24gKGVyciwgdmFsdWUpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcHJvbWlzZVJlamVjdChlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZVJlc29sdmUodmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcHJvbWlzZVJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGZuLCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKTtcblxuICBpZiAoa0N1c3RvbVByb21pc2lmaWVkU3ltYm9sKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCwge1xuICAgIHZhbHVlOiBmbiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG4gICAgZm4sXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbClcbiAgKTtcbn1cblxuZXhwb3J0cy5wcm9taXNpZnkuY3VzdG9tID0ga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sXG5cbmZ1bmN0aW9uIGNhbGxiYWNraWZ5T25SZWplY3RlZChyZWFzb24sIGNiKSB7XG4gIC8vIGAhcmVhc29uYCBndWFyZCBpbnNwaXJlZCBieSBibHVlYmlyZCAoUmVmOiBodHRwczovL2dvby5nbC90NUlTNk0pLlxuICAvLyBCZWNhdXNlIGBudWxsYCBpcyBhIHNwZWNpYWwgZXJyb3IgdmFsdWUgaW4gY2FsbGJhY2tzIHdoaWNoIG1lYW5zIFwibm8gZXJyb3JcbiAgLy8gb2NjdXJyZWRcIiwgd2UgZXJyb3Itd3JhcCBzbyB0aGUgY2FsbGJhY2sgY29uc3VtZXIgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW5cbiAgLy8gXCJ0aGUgcHJvbWlzZSByZWplY3RlZCB3aXRoIG51bGxcIiBvciBcInRoZSBwcm9taXNlIGZ1bGZpbGxlZCB3aXRoIHVuZGVmaW5lZFwiLlxuICBpZiAoIXJlYXNvbikge1xuICAgIHZhciBuZXdSZWFzb24gPSBuZXcgRXJyb3IoJ1Byb21pc2Ugd2FzIHJlamVjdGVkIHdpdGggYSBmYWxzeSB2YWx1ZScpO1xuICAgIG5ld1JlYXNvbi5yZWFzb24gPSByZWFzb247XG4gICAgcmVhc29uID0gbmV3UmVhc29uO1xuICB9XG4gIHJldHVybiBjYihyZWFzb24pO1xufVxuXG5mdW5jdGlvbiBjYWxsYmFja2lmeShvcmlnaW5hbCkge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3JpZ2luYWxcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcbiAgfVxuXG4gIC8vIFdlIERPIE5PVCByZXR1cm4gdGhlIHByb21pc2UgYXMgaXQgZ2l2ZXMgdGhlIHVzZXIgYSBmYWxzZSBzZW5zZSB0aGF0XG4gIC8vIHRoZSBwcm9taXNlIGlzIGFjdHVhbGx5IHNvbWVob3cgcmVsYXRlZCB0byB0aGUgY2FsbGJhY2sncyBleGVjdXRpb25cbiAgLy8gYW5kIHRoYXQgdGhlIGNhbGxiYWNrIHRocm93aW5nIHdpbGwgcmVqZWN0IHRoZSBwcm9taXNlLlxuICBmdW5jdGlvbiBjYWxsYmFja2lmaWVkKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIHZhciBtYXliZUNiID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIG1heWJlQ2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO1xuICAgIH1cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbWF5YmVDYi5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgLy8gSW4gdHJ1ZSBub2RlIHN0eWxlIHdlIHByb2Nlc3MgdGhlIGNhbGxiYWNrIG9uIGBuZXh0VGlja2Agd2l0aCBhbGwgdGhlXG4gICAgLy8gaW1wbGljYXRpb25zIChzdGFjaywgYHVuY2F1Z2h0RXhjZXB0aW9uYCwgYGFzeW5jX2hvb2tzYClcbiAgICBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgLnRoZW4oZnVuY3Rpb24ocmV0KSB7IHByb2Nlc3MubmV4dFRpY2soY2IsIG51bGwsIHJldCkgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uKHJlaikgeyBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNraWZ5T25SZWplY3RlZCwgcmVqLCBjYikgfSk7XG4gIH1cblxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoY2FsbGJhY2tpZmllZCwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWdpbmFsKSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNhbGxiYWNraWZpZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpKTtcbiAgcmV0dXJuIGNhbGxiYWNraWZpZWQ7XG59XG5leHBvcnRzLmNhbGxiYWNraWZ5ID0gY2FsbGJhY2tpZnk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAxNikgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMjQpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQub3MgJiAweGZmKTtcbiAgICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhICYmIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmYpO1xuICAgICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC5leHRyYS5sZW5ndGggPj4gOCkgJiAweGZmKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcsIDApO1xuICAgICAgICB9XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gRVhUUkFfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgLy8gREVGTEFURSBoZWFkZXJcbiAgICB7XG4gICAgICB2YXIgaGVhZGVyID0gKFpfREVGTEFURUQgKyAoKHMud19iaXRzIC0gOCkgPDwgNCkpIDw8IDg7XG4gICAgICB2YXIgbGV2ZWxfZmxhZ3MgPSAtMTtcblxuICAgICAgaWYgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsIDwgNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPT09IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzO1xuICAgICAgfVxuICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTtcbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7IGhlYWRlciB8PSBQUkVTRVRfRElDVDsgfVxuICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTtcblxuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTtcblxuICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovXG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkge1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IDE7IC8vIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgfVxuICB9XG5cbi8vI2lmZGVmIEdaSVBcbiAgaWYgKHMuc3RhdHVzID09PSBFWFRSQV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5leHRyYS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG5cbiAgICAgIHdoaWxlIChzLmd6aW5kZXggPCAocy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZmZmKSkge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhW3MuZ3ppbmRleF0gJiAweGZmKTtcbiAgICAgICAgcy5nemluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aW5kZXggPT09IHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IE5BTUVfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQubmFtZS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLm5hbWUubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gQ09NTUVOVF9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5jb21tZW50LyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBIQ1JDX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyID4gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICB9XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA8PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICBzdHJtLmFkbGVyID0gMDsgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICB9XG4gIH1cbi8vI2VuZGlmXG5cbiAgLyogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZSAqL1xuICBpZiAocy5wZW5kaW5nICE9PSAwKSB7XG4gICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGhcbiAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kXG4gICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbyxcbiAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlXG4gICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6XG4gICAgICAgKi9cbiAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgcmV0dXJuIFpfT0s7XG4gICAgfVxuXG4gICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbyBhbmQgYXZvaWQgZHVwbGljYXRlIGNvbnNlY3V0aXZlXG4gICAgICogZmx1c2hlcy4gRm9yIHJlcGVhdGVkIGFuZCB1c2VsZXNzIGNhbGxzIHdpdGggWl9GSU5JU0gsIHdlIGtlZXBcbiAgICAgKiByZXR1cm5pbmcgWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWl9CVUZfRVJST1IuXG4gICAgICovXG4gIH0gZWxzZSBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiByYW5rKGZsdXNoKSA8PSByYW5rKG9sZF9mbHVzaCkgJiZcbiAgICBmbHVzaCAhPT0gWl9GSU5JU0gpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTtcbiAgfVxuXG4gIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovXG4gIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTtcbiAgfVxuXG4gIC8qIFN0YXJ0IGEgbmV3IGJsb2NrIG9yIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8XG4gICAgKGZsdXNoICE9PSBaX05PX0ZMVVNIICYmIHMuc3RhdHVzICE9PSBGSU5JU0hfU1RBVEUpKSB7XG4gICAgdmFyIGJzdGF0ZSA9IChzLnN0cmF0ZWd5ID09PSBaX0hVRkZNQU5fT05MWSkgPyBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIDpcbiAgICAgIChzLnN0cmF0ZWd5ID09PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6XG4gICAgICAgIGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZnVuYyhzLCBmbHVzaCkpO1xuXG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfRE9ORSkge1xuICAgICAgcy5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7XG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX05FRURfTU9SRSB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEKSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICAgIC8qIGF2b2lkIEJVRl9FUlJPUiBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsXG4gICAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZVxuICAgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuXG4gICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzb1xuICAgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0XG4gICAgICAgKiBvbmUgZW1wdHkgYmxvY2suXG4gICAgICAgKi9cbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfQkxPQ0tfRE9ORSkge1xuICAgICAgaWYgKGZsdXNoID09PSBaX1BBUlRJQUxfRkxVU0gpIHtcbiAgICAgICAgdHJlZXMuX3RyX2FsaWduKHMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0spIHsgLyogRlVMTF9GTFVTSCBvciBTWU5DX0ZMVVNIICovXG5cbiAgICAgICAgdHJlZXMuX3RyX3N0b3JlZF9ibG9jayhzLCAwLCAwLCBmYWxzZSk7XG4gICAgICAgIC8qIEZvciBhIGZ1bGwgZmx1c2gsIHRoaXMgZW1wdHkgYmxvY2sgd2lsbCBiZSByZWNvZ25pemVkXG4gICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfRlVMTF9GTFVTSCkge1xuICAgICAgICAgIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqLyAgICAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqL1xuICAgICAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICAgICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgICByZXR1cm4gWl9PSztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQoc3RybS0+YXZhaWxfb3V0ID4gMCwgXCJidWcyXCIpO1xuICAvL2lmIChzdHJtLmF2YWlsX291dCA8PSAwKSB7IHRocm93IG5ldyBFcnJvcihcImJ1ZzJcIik7fVxuXG4gIGlmIChmbHVzaCAhPT0gWl9GSU5JU0gpIHsgcmV0dXJuIFpfT0s7IH1cbiAgaWYgKHMud3JhcCA8PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FTkQ7IH1cblxuICAvKiBXcml0ZSB0aGUgdHJhaWxlciAqL1xuICBpZiAocy53cmFwID09PSAyKSB7XG4gICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMjQpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMjQpICYgMHhmZik7XG4gIH1cbiAgZWxzZVxuICB7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICB9XG5cbiAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpblxuICAgKiB0byBmbHVzaCB0aGUgcmVzdC5cbiAgICovXG4gIGlmIChzLndyYXAgPiAwKSB7IHMud3JhcCA9IC1zLndyYXA7IH1cbiAgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqL1xuICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUVuZChzdHJtKSB7XG4gIHZhciBzdGF0dXM7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0dXMgPSBzdHJtLnN0YXRlLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gSU5JVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRVhUUkFfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IE5BTUVfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IENPTU1FTlRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEhDUkNfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEJVU1lfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEZJTklTSF9TVEFURVxuICApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuXG4gIHJldHVybiBzdGF0dXMgPT09IEJVU1lfU1RBVEUgPyBlcnIoc3RybSwgWl9EQVRBX0VSUk9SKSA6IFpfT0s7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZVxuICogc2VxdWVuY2Ugd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBkZWZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHM7XG4gIHZhciBzdHIsIG47XG4gIHZhciB3cmFwO1xuICB2YXIgYXZhaWw7XG4gIHZhciBuZXh0O1xuICB2YXIgaW5wdXQ7XG4gIHZhciB0bXBEaWN0O1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHdyYXAgPSBzLndyYXA7XG5cbiAgaWYgKHdyYXAgPT09IDIgfHwgKHdyYXAgPT09IDEgJiYgcy5zdGF0dXMgIT09IElOSVRfU1RBVEUpIHx8IHMubG9va2FoZWFkKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogd2hlbiB1c2luZyB6bGliIHdyYXBwZXJzLCBjb21wdXRlIEFkbGVyLTMyIGZvciBwcm92aWRlZCBkaWN0aW9uYXJ5ICovXG4gIGlmICh3cmFwID09PSAxKSB7XG4gICAgLyogYWRsZXIzMihzdHJtLT5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gIH1cblxuICBzLndyYXAgPSAwOyAgIC8qIGF2b2lkIGNvbXB1dGluZyBBZGxlci0zMiBpbiByZWFkX2J1ZiAqL1xuXG4gIC8qIGlmIGRpY3Rpb25hcnkgd291bGQgZmlsbCB3aW5kb3csIGp1c3QgcmVwbGFjZSB0aGUgaGlzdG9yeSAqL1xuICBpZiAoZGljdExlbmd0aCA+PSBzLndfc2l6ZSkge1xuICAgIGlmICh3cmFwID09PSAwKSB7ICAgICAgICAgICAgLyogYWxyZWFkeSBlbXB0eSBvdGhlcndpc2UgKi9cbiAgICAgIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqL1xuICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICB9XG4gICAgLyogdXNlIHRoZSB0YWlsICovXG4gICAgLy8gZGljdGlvbmFyeSA9IGRpY3Rpb25hcnkuc2xpY2UoZGljdExlbmd0aCAtIHMud19zaXplKTtcbiAgICB0bXBEaWN0ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUpO1xuICAgIHV0aWxzLmFycmF5U2V0KHRtcERpY3QsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGggLSBzLndfc2l6ZSwgcy53X3NpemUsIDApO1xuICAgIGRpY3Rpb25hcnkgPSB0bXBEaWN0O1xuICAgIGRpY3RMZW5ndGggPSBzLndfc2l6ZTtcbiAgfVxuICAvKiBpbnNlcnQgZGljdGlvbmFyeSBpbnRvIHdpbmRvdyBhbmQgaGFzaCAqL1xuICBhdmFpbCA9IHN0cm0uYXZhaWxfaW47XG4gIG5leHQgPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGRpY3RMZW5ndGg7XG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uaW5wdXQgPSBkaWN0aW9uYXJ5O1xuICBmaWxsX3dpbmRvdyhzKTtcbiAgd2hpbGUgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgIHN0ciA9IHMuc3Ryc3RhcnQ7XG4gICAgbiA9IHMubG9va2FoZWFkIC0gKE1JTl9NQVRDSCAtIDEpO1xuICAgIGRvIHtcbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuXG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICBzdHIrKztcbiAgICB9IHdoaWxlICgtLW4pO1xuICAgIHMuc3Ryc3RhcnQgPSBzdHI7XG4gICAgcy5sb29rYWhlYWQgPSBNSU5fTUFUQ0ggLSAxO1xuICAgIGZpbGxfd2luZG93KHMpO1xuICB9XG4gIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0O1xuICBzLmluc2VydCA9IHMubG9va2FoZWFkO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5pbnB1dCA9IGlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gYXZhaWw7XG4gIHMud3JhcCA9IHdyYXA7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmV4cG9ydHMuZGVmbGF0ZUluaXQgPSBkZWZsYXRlSW5pdDtcbmV4cG9ydHMuZGVmbGF0ZUluaXQyID0gZGVmbGF0ZUluaXQyO1xuZXhwb3J0cy5kZWZsYXRlUmVzZXQgPSBkZWZsYXRlUmVzZXQ7XG5leHBvcnRzLmRlZmxhdGVSZXNldEtlZXAgPSBkZWZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5kZWZsYXRlU2V0SGVhZGVyID0gZGVmbGF0ZVNldEhlYWRlcjtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVFbmQgPSBkZWZsYXRlRW5kO1xuZXhwb3J0cy5kZWZsYXRlU2V0RGljdGlvbmFyeSA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5kZWZsYXRlSW5mbyA9ICdwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmRlZmxhdGVCb3VuZCA9IGRlZmxhdGVCb3VuZDtcbmV4cG9ydHMuZGVmbGF0ZUNvcHkgPSBkZWZsYXRlQ29weTtcbmV4cG9ydHMuZGVmbGF0ZVBhcmFtcyA9IGRlZmxhdGVQYXJhbXM7XG5leHBvcnRzLmRlZmxhdGVQZW5kaW5nID0gZGVmbGF0ZVBlbmRpbmc7XG5leHBvcnRzLmRlZmxhdGVQcmltZSA9IGRlZmxhdGVQcmltZTtcbmV4cG9ydHMuZGVmbGF0ZVR1bmUgPSBkZWZsYXRlVHVuZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGlzbid0IHdvcnRoIGl0IHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IHdlIGNhbid0IGdldCBzaWduaWZpY2FudCBzcGVlZCBib29zdCBoZXJlLlxuLy8gU28gd3JpdGUgY29kZSB0byBtaW5pbWl6ZSBzaXplIC0gbm8gcHJlZ2VuZXJhdGVkIHRhYmxlc1xuLy8gYW5kIGFycmF5IHRvb2xzIGRlcGVuZGVuY2llcy5cblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vLyBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZVxuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICB2YXIgYywgdGFibGUgPSBbXTtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7XG4gICAgYyA9IG47XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCA4OyBrKyspIHtcbiAgICAgIGMgPSAoKGMgJiAxKSA/ICgweEVEQjg4MzIwIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy8gQ3JlYXRlIHRhYmxlIG9uIGxvYWQuIEp1c3QgMjU1IHNpZ25lZCBsb25ncy4gTm90IGEgcHJvYmxlbS5cbnZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpO1xuXG5cbmZ1bmN0aW9uIGNyYzMyKGNyYywgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgdCA9IGNyY1RhYmxlLFxuICAgICAgZW5kID0gcG9zICsgbGVuO1xuXG4gIGNyYyBePSAtMTtcblxuICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKyspIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gY3JjMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgICAgY2FzZSBIRUFEOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoc3RhdGUud3JhcCAmIDIpICYmIGhvbGQgPT09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi9cbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cblxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShzdGF0ZS53cmFwICYgMSkgfHwgICAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovXG4gICAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChob2xkICYgMHgwZikvKkJJVFMoNCkqLyAhPT0gWl9ERUZMQVRFRCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgICBiaXRzIC09IDQ7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgbGVuID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgODtcbiAgICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmRtYXggPSAxIDw8IGxlbjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGTEFHUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmZsYWdzID0gaG9sZDtcbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHhlMDAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gKChob2xkID4+IDgpICYgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVElNRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDQsIDApO1xuICAgICAgICAgIC8vPT09XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBPUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhMRU46XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZDtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhUUkE6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW50IHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IEFycmF5KHN0YXRlLmhlYWQuZXh0cmFfbGVuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgaXMgbGltaXRlZCB0byA2NTUzNiBieXRlc1xuICAgICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgICAvKmxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA/IHN0YXRlLmhlYWQuZXh0cmFfbWF4IDogY29weSwqL1xuICAgICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvL3ptZW1jcHkoc3RhdGUuaGVhZC5leHRyYSArIGxlbiwgbmV4dCxcbiAgICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIFRPRE86IDIgb3IgMSBieXRlcz9cbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT01NRU5UOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBjb3B5ID0gMDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEhDUkM6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuaGNyYyA9ICgoc3RhdGUuZmxhZ3MgPj4gOSkgJiAxKTtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElDVElEOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0genN3YXAzMihob2xkKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJQ1Q6XG4gICAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRTpcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRZUEVETzpcbiAgICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxhc3QgPSAoaG9sZCAmIDB4MDEpLypCSVRTKDEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgICBiaXRzIC09IDE7XG4gICAgICAgIC8vLS0tLy9cblxuICAgICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTVE9SRUQ6XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFlfOlxuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT1BZOlxuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgICAgdXRpbHMuYXJyYXlTZXQob3V0cHV0LCBpbnB1dCwgbmV4dCwgY29weSwgcHV0KTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUQUJMRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAyNTc7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICAgIGlmIChzdGF0ZS5ubGVuID4gMjg2IHx8IHN0YXRlLm5kaXN0ID4gMzApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5MRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gNztcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGVyZV92YWwgPT09IDE2KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoNykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi9cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgICBpZiAoc3RhdGUubGVuc1syNTZdID09PSAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUubGVuYml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgICAgLy9zdGF0ZS5kaXN0Y29kZS5jb3B5KHN0YXRlLmNvZGVzKTtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUuZGlzdGJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOXzpcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU46XG4gICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgICAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgICAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgICAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gICAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgICAgLy8tLS1cblxuICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7XG4gICAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaGVyZV92YWw7XG4gICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNUOlxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgICBzdGF0ZS5leHRyYSA9IChoZXJlX29wKSAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNURVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gc3RhdGUuZG1heCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTUFUQ0g6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5O1xuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICBUcmFjZSgoc3RkZXJyLCBcImluZmxhdGUuYyB0b28gZmFyXFxuXCIpKTtcbi8vICAgICAgICAgIGNvcHkgLT0gc3RhdGUud2hhdmU7XG4vLyAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4vLyAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbi8vICAgICAgICAgIGxlZnQgLT0gY29weTtcbi8vICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuLy8gICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gMDtcbi8vICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4vLyAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbi8vICAgICAgICAgIGJyZWFrO1xuLy8jZW5kaWZcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuICAgICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMSVQ6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBsZWZ0LS07XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDSEVDSzpcbiAgICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAvLyBVc2UgJ3wnIGluc3RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgX291dCAtPSBsZWZ0O1xuICAgICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgICBpZiAoX291dCkge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkpO1xuXG4gICAgICAgICAgfVxuICAgICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIC8vIE5COiBjcmMzMiBzdG9yZWQgYXMgc2lnbmVkIDMyLWJpdCBpbnQsIHpzd2FwMzIgcmV0dXJucyBzaWduZWQgdG9vXG4gICAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5HVEg6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwICYmIHN0YXRlLmZsYWdzKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgMHhmZmZmZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRE9ORTpcbiAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIEJBRDpcbiAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIE1FTTpcbiAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgICAgY2FzZSBTWU5DOlxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5mX2xlYXZlIDwtIGhlcmUgaXMgcmVhbCBwbGFjZSBmb3IgXCJnb3RvIGluZl9sZWF2ZVwiLCBlbXVsYXRlZCB2aWEgXCJicmVhayBpbmZfbGVhdmVcIlxuXG4gIC8qXG4gICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLlxuICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyXG4gICAgIGVycm9yLiAgQ2FsbCB1cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLlxuICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuXG4gICAqL1xuXG4gIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAvLy0tLVxuXG4gIGlmIChzdGF0ZS53c2l6ZSB8fCAoX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJlxuICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIKSkpIHtcbiAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKSB7XG4gICAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIH1cbiAgfVxuICBfaW4gLT0gc3RybS5hdmFpbF9pbjtcbiAgX291dCAtPSBzdHJtLmF2YWlsX291dDtcbiAgc3RybS50b3RhbF9pbiArPSBfaW47XG4gIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHtcbiAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAvKlVQREFURShzdGF0ZS5jaGVjaywgc3RybS5uZXh0X291dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSk7XG4gIH1cbiAgc3RybS5kYXRhX3R5cGUgPSBzdGF0ZS5iaXRzICsgKHN0YXRlLmxhc3QgPyA2NCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IFRZUEUgPyAxMjggOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7XG4gIGlmICgoKF9pbiA9PT0gMCAmJiBfb3V0ID09PSAwKSB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykge1xuICAgIHJldCA9IFpfQlVGX0VSUk9SO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVFbmQoc3RybSkge1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSAvKnx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLndpbmRvdykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoKHN0YXRlLndyYXAgJiAyKSA9PT0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cblxuICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi9cbiAgc3RhdGUuaGVhZCA9IGhlYWQ7XG4gIGhlYWQuZG9uZSA9IGZhbHNlO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzdGF0ZTtcbiAgdmFyIGRpY3RpZDtcbiAgdmFyIHJldDtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gLyogPT0gWl9OVUxMICovIHx8ICFzdHJtLnN0YXRlIC8qID09IFpfTlVMTCAqLykgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIGlmIChzdGF0ZS53cmFwICE9PSAwICYmIHN0YXRlLm1vZGUgIT09IERJQ1QpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgKi9cbiAgaWYgKHN0YXRlLm1vZGUgPT09IERJQ1QpIHtcbiAgICBkaWN0aWQgPSAxOyAvKiBhZGxlcjMyKDAsIG51bGwsIDApKi9cbiAgICAvKiBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICAgIGlmIChkaWN0aWQgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SO1xuICAgIH1cbiAgfVxuICAvKiBjb3B5IGRpY3Rpb25hcnkgdG8gd2luZG93IHVzaW5nIHVwZGF0ZXdpbmRvdygpLCB3aGljaCB3aWxsIGFtZW5kIHRoZVxuICAgZXhpc3RpbmcgZGljdGlvbmFyeSBpZiBhcHByb3ByaWF0ZSAqL1xuICByZXQgPSB1cGRhdGV3aW5kb3coc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgZGljdExlbmd0aCk7XG4gIGlmIChyZXQpIHtcbiAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgfVxuICBzdGF0ZS5oYXZlZGljdCA9IDE7XG4gIC8vIFRyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSztcbn1cblxuZXhwb3J0cy5pbmZsYXRlUmVzZXQgPSBpbmZsYXRlUmVzZXQ7XG5leHBvcnRzLmluZmxhdGVSZXNldDIgPSBpbmZsYXRlUmVzZXQyO1xuZXhwb3J0cy5pbmZsYXRlUmVzZXRLZWVwID0gaW5mbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQgPSBpbmZsYXRlSW5pdDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQyID0gaW5mbGF0ZUluaXQyO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZUVuZCA9IGluZmxhdGVFbmQ7XG5leHBvcnRzLmluZmxhdGVHZXRIZWFkZXIgPSBpbmZsYXRlR2V0SGVhZGVyO1xuZXhwb3J0cy5pbmZsYXRlU2V0RGljdGlvbmFyeSA9IGluZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlSW5mbyA9ICdwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmluZmxhdGVDb3B5ID0gaW5mbGF0ZUNvcHk7XG5leHBvcnRzLmluZmxhdGVHZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZUdldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVNYXJrID0gaW5mbGF0ZU1hcms7XG5leHBvcnRzLmluZmxhdGVQcmltZSA9IGluZmxhdGVQcmltZTtcbmV4cG9ydHMuaW5mbGF0ZVN5bmMgPSBpbmZsYXRlU3luYztcbmV4cG9ydHMuaW5mbGF0ZVN5bmNQb2ludCA9IGluZmxhdGVTeW5jUG9pbnQ7XG5leHBvcnRzLmluZmxhdGVVbmRlcm1pbmUgPSBpbmZsYXRlVW5kZXJtaW5lO1xuKi9cbiIsIi8vaW1wb3J0IHsgZnMsIHVudGlsZGlmeSB9IGZyb20gJy4uL3V0aWxzL2dldFN0cmVhbSdcbmNvbnN0IGdzID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJyk7XG5jb25zdCBmcyA9IGdzLmZzO1xuY29uc3QgdW50aWxkaWZ5ID0gZ3MudW50aWxkaWZ5O1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3ppcFxuICogQGRlc2MgR2l6cGVkIHdhcmMgbWFnaWMgbnVtOlxuICogLSBCdWZmZXIuZnJvbSgnMWY4YjA4JywgJ2hleCcpXG4gKiAtIFVpbnQ4QXJyYXkgWyAzMSwgMTM5LCA4IF1cbiAqIE5vdCBnemlwZWQgd2FyYyBtYWdpYyBudW06XG4gKiAtIFVpbnQ4QXJyYXkgWyA4NywgNjUsIDgyIF1cbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IGd6aXBNYWdpY051bSA9IEJ1ZmZlci5mcm9tKCcxZjhiMDgnLCAnaGV4JylcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfSBsZW5ndGggb2YgdGhlIGd6aXAgbWFnaWMgbnVtYmVyIF9oZWFkZXIgMyBieXRlc1xuICovXG5jb25zdCBnemlwTWFnaWNOdW1MZW4gPSBnemlwTWFnaWNOdW0ubGVuZ3RoXG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBtZWFucyB0byBkZXRlY3QgaWYgYSBmaWxlIGlzIGd6aXBwZWQgb3Igbm90XG4gKi9cbmNsYXNzIEd6aXBEZXRlY3RvciB7XG4gIC8qKlxuICAgKiBAZGVzYyBEZXRlcm1pbmVzIGlmIGEgZmlsZSBpcyBnemlwcGVkIG9yIG5vdCBieSByZWFkaW5nIGl0cyB0aGUgbWFnaWMgbnVtYmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIHBhdGggdG8gdGhlIGZpbGUgdG8gZGV0ZWN0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBmaWxlIGlzIGd6aXBwZWQgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgZmlsZVBhdGggaXMgbnVsbCBvciB1bmRlZmluZWQgb3IgaWYgYW5vdGhlciBlcnJvciBvY2N1cnJlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGlzR3ppcHBlZCAoZmlsZVBhdGgpIHtcbiAgICBpZiAoZmlsZVBhdGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZmlsZVBhdGggcGF0aCBpcyAke2ZpbGVQYXRofWApXG4gICAgfVxuICAgIGZpbGVQYXRoID0gdW50aWxkaWZ5KGZpbGVQYXRoKVxuICAgIGNvbnN0IGZkID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKVxuICAgIGNvbnN0IGZpbGxNZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgzKVxuICAgIGF3YWl0IGZzLnJlYWQoZmQsIGZpbGxNZSwgMCwgMywgdW5kZWZpbmVkKVxuICAgIGF3YWl0IGZzLmNsb3NlKGZkKVxuICAgIGxldCBpID0gMFxuICAgIGxldCBpc0d6aXBwZWQgPSB0cnVlXG4gICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB3ZSBjcmVhdGUgdGhlIFVuaXQ4QXJyYXkgdG8gYmUgc2l6ZSAzXG4gICAgLy8gYnV0IGp1c3QgaW4gY2FzZVxuICAgIGlmIChnemlwTWFnaWNOdW1MZW4gIT09IGZpbGxNZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBmb3IgKDsgaSA8IGd6aXBNYWdpY051bUxlbjsgKytpKSB7XG4gICAgICBpZiAoZ3ppcE1hZ2ljTnVtW2ldICE9PSBmaWxsTWVbaV0pIHtcbiAgICAgICAgaXNHemlwcGVkID0gZmFsc2VcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzR3ppcHBlZFxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFN5bmNocm9ub3VzIHZlcnNpb24gb2Yge0BsaW5rIGlzR3ppcHBlZH1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gcGF0aCB0byB0aGUgZmlsZSB0byBkZXRlY3RcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBnemlwcGVkIGZhbHNlIG90aGVyd2lzZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGZpbGVQYXRoIGlzIG51bGwgb3IgdW5kZWZpbmVkIG9yIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJyZWRcbiAgICovXG4gIHN0YXRpYyBpc0d6aXBwZWRTeW5jIChmaWxlUGF0aCkge1xuICAgIGlmIChmaWxlUGF0aCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmaWxlUGF0aCBwYXRoIGlzICR7ZmlsZVBhdGh9YClcbiAgICB9XG4gICAgZmlsZVBhdGggPSB1bnRpbGRpZnkoZmlsZVBhdGgpXG4gICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhmaWxlUGF0aCwgJ3InKVxuICAgIGNvbnN0IGZpbGxNZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgzKVxuICAgIGZzLnJlYWRTeW5jKGZkLCBmaWxsTWUsIDAsIDMsIHVuZGVmaW5lZClcbiAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgbGV0IGkgPSAwXG4gICAgbGV0IGlzR3ppcHBlZCA9IHRydWVcbiAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHdlIGNyZWF0ZSB0aGUgVW5pdDhBcnJheSB0byBiZSBzaXplIDNcbiAgICAvLyBidXQganVzdCBpbiBjYXNlXG4gICAgaWYgKGd6aXBNYWdpY051bUxlbiAhPT0gZmlsbE1lLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGZvciAoOyBpIDwgZ3ppcE1hZ2ljTnVtTGVuOyArK2kpIHtcbiAgICAgIGlmIChnemlwTWFnaWNOdW1baV0gIT09IGZpbGxNZVtpXSkge1xuICAgICAgICBpc0d6aXBwZWQgPSBmYWxzZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNHemlwcGVkXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7R3ppcERldGVjdG9yfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IEd6aXBEZXRlY3RvclxuIiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLXV1aWQgZm9yIEFQSSBkZXRhaWxzXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgW107XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7XG5cbiAgLy8gbm9kZSBhbmQgY2xvY2tzZXEgbmVlZCB0byBiZSBpbml0aWFsaXplZCB0byByYW5kb20gdmFsdWVzIGlmIHRoZXkncmUgbm90XG4gIC8vIHNwZWNpZmllZC4gIFdlIGRvIHRoaXMgbGF6aWx5IHRvIG1pbmltaXplIGlzc3VlcyByZWxhdGVkIHRvIGluc3VmZmljaWVudFxuICAvLyBzeXN0ZW0gZW50cm9weS4gIFNlZSAjMTg5XG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBybmcoKTtcbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC41LCBjcmVhdGUgYW5kIDQ4LWJpdCBub2RlIGlkLCAoNDcgcmFuZG9tIGJpdHMgKyBtdWx0aWNhc3QgYml0ID0gMSlcbiAgICAgIG5vZGUgPSBfbm9kZUlkID0gW1xuICAgICAgICBzZWVkQnl0ZXNbMF0gfCAweDAxLFxuICAgICAgICBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XVxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9XG5cbiAgLy8gVVVJRCB0aW1lc3RhbXBzIGFyZSAxMDAgbmFuby1zZWNvbmQgdW5pdHMgc2luY2UgdGhlIEdyZWdvcmlhbiBlcG9jaCxcbiAgLy8gKDE1ODItMTAtMTUgMDA6MDApLiAgSlNOdW1iZXJzIGFyZW4ndCBwcmVjaXNlIGVub3VnaCBmb3IgdGhpcywgc29cbiAgLy8gdGltZSBpcyBoYW5kbGVkIGludGVybmFsbHkgYXMgJ21zZWNzJyAoaW50ZWdlciBtaWxsaXNlY29uZHMpIGFuZCAnbnNlY3MnXG4gIC8vICgxMDAtbmFub3NlY29uZHMgb2Zmc2V0IGZyb20gbXNlY3MpIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDAuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTtcblxuICAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG4gIHZhciBkdCA9IChtc2VjcyAtIF9sYXN0TVNlY3MpICsgKG5zZWNzIC0gX2xhc3ROU2VjcykvMTAwMDA7XG5cbiAgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9XG5cbiAgLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfVxuXG4gIC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1dWlkLnYxKCk6IENhblxcJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjJyk7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7XG5cbiAgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwO1xuXG4gIC8vIGB0aW1lX2xvd2BcbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjtcblxuICAvLyBgdGltZV9taWRgXG4gIHZhciB0bWggPSAobXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwKSAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjtcblxuICAvLyBgdGltZV9oaWdoX2FuZF92ZXJzaW9uYFxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmO1xuXG4gIC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7XG5cbiAgLy8gYGNsb2NrX3NlcV9sb3dgXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjtcblxuICAvLyBgbm9kZWBcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmID8gYnVmIDogYnl0ZXNUb1V1aWQoYik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdjE7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIiwiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmcmVlR2xvYmFsO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuIiwiZXhwb3J0cy5mZXRjaCA9IGlzRnVuY3Rpb24oZ2xvYmFsLmZldGNoKSAmJiBpc0Z1bmN0aW9uKGdsb2JhbC5SZWFkYWJsZVN0cmVhbSlcblxuZXhwb3J0cy53cml0YWJsZVN0cmVhbSA9IGlzRnVuY3Rpb24oZ2xvYmFsLldyaXRhYmxlU3RyZWFtKVxuXG5leHBvcnRzLmFib3J0Q29udHJvbGxlciA9IGlzRnVuY3Rpb24oZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcblxuZXhwb3J0cy5ibG9iQ29uc3RydWN0b3IgPSBmYWxzZVxudHJ5IHtcblx0bmV3IEJsb2IoW25ldyBBcnJheUJ1ZmZlcigxKV0pXG5cdGV4cG9ydHMuYmxvYkNvbnN0cnVjdG9yID0gdHJ1ZVxufSBjYXRjaCAoZSkge31cblxuLy8gVGhlIHhociByZXF1ZXN0IHRvIGV4YW1wbGUuY29tIG1heSB2aW9sYXRlIHNvbWUgcmVzdHJpY3RpdmUgQ1NQIGNvbmZpZ3VyYXRpb25zLFxuLy8gc28gaWYgd2UncmUgcnVubmluZyBpbiBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBgZmV0Y2hgLCBhdm9pZCBjYWxsaW5nIGdldFhIUigpXG4vLyBhbmQgYXNzdW1lIHN1cHBvcnQgZm9yIGNlcnRhaW4gZmVhdHVyZXMgYmVsb3cuXG52YXIgeGhyXG5mdW5jdGlvbiBnZXRYSFIgKCkge1xuXHQvLyBDYWNoZSB0aGUgeGhyIHZhbHVlXG5cdGlmICh4aHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHhoclxuXG5cdGlmIChnbG9iYWwuWE1MSHR0cFJlcXVlc3QpIHtcblx0XHR4aHIgPSBuZXcgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KClcblx0XHQvLyBJZiBYRG9tYWluUmVxdWVzdCBpcyBhdmFpbGFibGUgKGllIG9ubHksIHdoZXJlIHhociBtaWdodCBub3Qgd29ya1xuXHRcdC8vIGNyb3NzIGRvbWFpbiksIHVzZSB0aGUgcGFnZSBsb2NhdGlvbi4gT3RoZXJ3aXNlIHVzZSBleGFtcGxlLmNvbVxuXHRcdC8vIE5vdGU6IHRoaXMgZG9lc24ndCBhY3R1YWxseSBtYWtlIGFuIGh0dHAgcmVxdWVzdC5cblx0XHR0cnkge1xuXHRcdFx0eGhyLm9wZW4oJ0dFVCcsIGdsb2JhbC5YRG9tYWluUmVxdWVzdCA/ICcvJyA6ICdodHRwczovL2V4YW1wbGUuY29tJylcblx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdHhociA9IG51bGxcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gU2VydmljZSB3b3JrZXJzIGRvbid0IGhhdmUgWEhSXG5cdFx0eGhyID0gbnVsbFxuXHR9XG5cdHJldHVybiB4aHJcbn1cblxuZnVuY3Rpb24gY2hlY2tUeXBlU3VwcG9ydCAodHlwZSkge1xuXHR2YXIgeGhyID0gZ2V0WEhSKClcblx0aWYgKCF4aHIpIHJldHVybiBmYWxzZVxuXHR0cnkge1xuXHRcdHhoci5yZXNwb25zZVR5cGUgPSB0eXBlXG5cdFx0cmV0dXJuIHhoci5yZXNwb25zZVR5cGUgPT09IHR5cGVcblx0fSBjYXRjaCAoZSkge31cblx0cmV0dXJuIGZhbHNlXG59XG5cbi8vIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uLCBTYWZhcmkgNy4wIHJlcG9ydHMgdHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciA9PT0gJ29iamVjdCcuXG4vLyBTYWZhcmkgNy4xIGFwcGVhcnMgdG8gaGF2ZSBmaXhlZCB0aGlzIGJ1Zy5cbnZhciBoYXZlQXJyYXlCdWZmZXIgPSB0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJ1xudmFyIGhhdmVTbGljZSA9IGhhdmVBcnJheUJ1ZmZlciAmJiBpc0Z1bmN0aW9uKGdsb2JhbC5BcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpXG5cbi8vIElmIGZldGNoIGlzIHN1cHBvcnRlZCwgdGhlbiBhcnJheWJ1ZmZlciB3aWxsIGJlIHN1cHBvcnRlZCB0b28uIFNraXAgY2FsbGluZ1xuLy8gY2hlY2tUeXBlU3VwcG9ydCgpLCBzaW5jZSB0aGF0IGNhbGxzIGdldFhIUigpLlxuZXhwb3J0cy5hcnJheWJ1ZmZlciA9IGV4cG9ydHMuZmV0Y2ggfHwgKGhhdmVBcnJheUJ1ZmZlciAmJiBjaGVja1R5cGVTdXBwb3J0KCdhcnJheWJ1ZmZlcicpKVxuXG4vLyBUaGVzZSBuZXh0IHR3byB0ZXN0cyB1bmF2b2lkYWJseSBzaG93IHdhcm5pbmdzIGluIENocm9tZS4gU2luY2UgZmV0Y2ggd2lsbCBhbHdheXNcbi8vIGJlIHVzZWQgaWYgaXQncyBhdmFpbGFibGUsIGp1c3QgcmV0dXJuIGZhbHNlIGZvciB0aGVzZSB0byBhdm9pZCB0aGUgd2FybmluZ3MuXG5leHBvcnRzLm1zc3RyZWFtID0gIWV4cG9ydHMuZmV0Y2ggJiYgaGF2ZVNsaWNlICYmIGNoZWNrVHlwZVN1cHBvcnQoJ21zLXN0cmVhbScpXG5leHBvcnRzLm1vemNodW5rZWRhcnJheWJ1ZmZlciA9ICFleHBvcnRzLmZldGNoICYmIGhhdmVBcnJheUJ1ZmZlciAmJlxuXHRjaGVja1R5cGVTdXBwb3J0KCdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcicpXG5cbi8vIElmIGZldGNoIGlzIHN1cHBvcnRlZCwgdGhlbiBvdmVycmlkZU1pbWVUeXBlIHdpbGwgYmUgc3VwcG9ydGVkIHRvby4gU2tpcCBjYWxsaW5nXG4vLyBnZXRYSFIoKS5cbmV4cG9ydHMub3ZlcnJpZGVNaW1lVHlwZSA9IGV4cG9ydHMuZmV0Y2ggfHwgKGdldFhIUigpID8gaXNGdW5jdGlvbihnZXRYSFIoKS5vdmVycmlkZU1pbWVUeXBlKSA6IGZhbHNlKVxuXG5leHBvcnRzLnZiQXJyYXkgPSBpc0Z1bmN0aW9uKGdsb2JhbC5WQkFycmF5KVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG59XG5cbnhociA9IG51bGwgLy8gSGVscCBnY1xuIiwidmFyIGNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL2NhcGFiaWxpdHknKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpXG5cbnZhciByU3RhdGVzID0gZXhwb3J0cy5yZWFkeVN0YXRlcyA9IHtcblx0VU5TRU5UOiAwLFxuXHRPUEVORUQ6IDEsXG5cdEhFQURFUlNfUkVDRUlWRUQ6IDIsXG5cdExPQURJTkc6IDMsXG5cdERPTkU6IDRcbn1cblxudmFyIEluY29taW5nTWVzc2FnZSA9IGV4cG9ydHMuSW5jb21pbmdNZXNzYWdlID0gZnVuY3Rpb24gKHhociwgcmVzcG9uc2UsIG1vZGUsIGZldGNoVGltZXIpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHN0cmVhbS5SZWFkYWJsZS5jYWxsKHNlbGYpXG5cblx0c2VsZi5fbW9kZSA9IG1vZGVcblx0c2VsZi5oZWFkZXJzID0ge31cblx0c2VsZi5yYXdIZWFkZXJzID0gW11cblx0c2VsZi50cmFpbGVycyA9IHt9XG5cdHNlbGYucmF3VHJhaWxlcnMgPSBbXVxuXG5cdC8vIEZha2UgdGhlICdjbG9zZScgZXZlbnQsIGJ1dCBvbmx5IG9uY2UgJ2VuZCcgZmlyZXNcblx0c2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdC8vIFRoZSBuZXh0VGljayBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgJ3JlcXVlc3QnIG1vZHVsZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcFxuXHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0c2VsZi5lbWl0KCdjbG9zZScpXG5cdFx0fSlcblx0fSlcblxuXHRpZiAobW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZVxuXG5cdFx0c2VsZi51cmwgPSByZXNwb25zZS51cmxcblx0XHRzZWxmLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNcblx0XHRzZWxmLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0XG5cdFx0XG5cdFx0cmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIsIGtleSl7XG5cdFx0XHRzZWxmLmhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gaGVhZGVyXG5cdFx0XHRzZWxmLnJhd0hlYWRlcnMucHVzaChrZXksIGhlYWRlcilcblx0XHR9KVxuXG5cdFx0aWYgKGNhcGFiaWxpdHkud3JpdGFibGVTdHJlYW0pIHtcblx0XHRcdHZhciB3cml0YWJsZSA9IG5ldyBXcml0YWJsZVN0cmVhbSh7XG5cdFx0XHRcdHdyaXRlOiBmdW5jdGlvbiAoY2h1bmspIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZCkge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoKVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmKHNlbGYucHVzaChuZXcgQnVmZmVyKGNodW5rKSkpIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzZWxmLl9yZXN1bWVGZXRjaCA9IHJlc29sdmVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGdsb2JhbC5jbGVhclRpbWVvdXQoZmV0Y2hUaW1lcilcblx0XHRcdFx0XHRpZiAoIXNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24gKGVycikge1xuXHRcdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzcG9uc2UuYm9keS5waXBlVG8od3JpdGFibGUpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdFx0XHRnbG9iYWwuY2xlYXJUaW1lb3V0KGZldGNoVGltZXIpXG5cdFx0XHRcdFx0aWYgKCFzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0XHR9KVxuXHRcdFx0XHRyZXR1cm5cblx0XHRcdH0gY2F0Y2ggKGUpIHt9IC8vIHBpcGVUbyBtZXRob2QgaXNuJ3QgZGVmaW5lZC4gQ2FuJ3QgZmluZCBhIGJldHRlciB3YXkgdG8gZmVhdHVyZSB0ZXN0IHRoaXNcblx0XHR9XG5cdFx0Ly8gZmFsbGJhY2sgZm9yIHdoZW4gd3JpdGFibGVTdHJlYW0gb3IgcGlwZVRvIGFyZW4ndCBhdmFpbGFibGVcblx0XHR2YXIgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKVxuXHRcdGZ1bmN0aW9uIHJlYWQgKCkge1xuXHRcdFx0cmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcblx0XHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0aWYgKHJlc3VsdC5kb25lKSB7XG5cdFx0XHRcdFx0Z2xvYmFsLmNsZWFyVGltZW91dChmZXRjaFRpbWVyKVxuXHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3VsdC52YWx1ZSkpXG5cdFx0XHRcdHJlYWQoKVxuXHRcdFx0fSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuXHRcdFx0XHRnbG9iYWwuY2xlYXJUaW1lb3V0KGZldGNoVGltZXIpXG5cdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdH1cblx0XHRyZWFkKClcblx0fSBlbHNlIHtcblx0XHRzZWxmLl94aHIgPSB4aHJcblx0XHRzZWxmLl9wb3MgPSAwXG5cblx0XHRzZWxmLnVybCA9IHhoci5yZXNwb25zZVVSTFxuXHRcdHNlbGYuc3RhdHVzQ29kZSA9IHhoci5zdGF0dXNcblx0XHRzZWxmLnN0YXR1c01lc3NhZ2UgPSB4aHIuc3RhdHVzVGV4dFxuXHRcdHZhciBoZWFkZXJzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KC9cXHI/XFxuLylcblx0XHRoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuXHRcdFx0dmFyIG1hdGNoZXMgPSBoZWFkZXIubWF0Y2goL14oW146XSspOlxccyooLiopLylcblx0XHRcdGlmIChtYXRjaGVzKSB7XG5cdFx0XHRcdHZhciBrZXkgPSBtYXRjaGVzWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0aWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG5cdFx0XHRcdFx0aWYgKHNlbGYuaGVhZGVyc1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldID0gW11cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZi5oZWFkZXJzW2tleV0ucHVzaChtYXRjaGVzWzJdKVxuXHRcdFx0XHR9IGVsc2UgaWYgKHNlbGYuaGVhZGVyc1trZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzZWxmLmhlYWRlcnNba2V5XSArPSAnLCAnICsgbWF0Y2hlc1syXVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldID0gbWF0Y2hlc1syXVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKG1hdGNoZXNbMV0sIG1hdGNoZXNbMl0pXG5cdFx0XHR9XG5cdFx0fSlcblxuXHRcdHNlbGYuX2NoYXJzZXQgPSAneC11c2VyLWRlZmluZWQnXG5cdFx0aWYgKCFjYXBhYmlsaXR5Lm92ZXJyaWRlTWltZVR5cGUpIHtcblx0XHRcdHZhciBtaW1lVHlwZSA9IHNlbGYucmF3SGVhZGVyc1snbWltZS10eXBlJ11cblx0XHRcdGlmIChtaW1lVHlwZSkge1xuXHRcdFx0XHR2YXIgY2hhcnNldE1hdGNoID0gbWltZVR5cGUubWF0Y2goLztcXHMqY2hhcnNldD0oW147XSkoO3wkKS8pXG5cdFx0XHRcdGlmIChjaGFyc2V0TWF0Y2gpIHtcblx0XHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gY2hhcnNldE1hdGNoWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gJ3V0Zi04JyAvLyBiZXN0IGd1ZXNzXG5cdFx0fVxuXHR9XG59XG5cbmluaGVyaXRzKEluY29taW5nTWVzc2FnZSwgc3RyZWFtLlJlYWRhYmxlKVxuXG5JbmNvbWluZ01lc3NhZ2UucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHR2YXIgcmVzb2x2ZSA9IHNlbGYuX3Jlc3VtZUZldGNoXG5cdGlmIChyZXNvbHZlKSB7XG5cdFx0c2VsZi5fcmVzdW1lRmV0Y2ggPSBudWxsXG5cdFx0cmVzb2x2ZSgpXG5cdH1cbn1cblxuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0dmFyIHhociA9IHNlbGYuX3hoclxuXG5cdHZhciByZXNwb25zZSA9IG51bGxcblx0c3dpdGNoIChzZWxmLl9tb2RlKSB7XG5cdFx0Y2FzZSAndGV4dDp2YmFycmF5JzogLy8gRm9yIElFOVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkRPTkUpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUaGlzIGZhaWxzIGluIElFOFxuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBnbG9iYWwuVkJBcnJheSh4aHIucmVzcG9uc2VCb2R5KS50b0FycmF5KClcblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRpZiAocmVzcG9uc2UgIT09IG51bGwpIHtcblx0XHRcdFx0c2VsZi5wdXNoKG5ldyBCdWZmZXIocmVzcG9uc2UpKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdFx0Ly8gRmFsbHMgdGhyb3VnaCBpbiBJRThcdFxuXHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0dHJ5IHsgLy8gVGhpcyB3aWxsIGZhaWwgd2hlbiByZWFkeVN0YXRlID0gMyBpbiBJRTkuIFN3aXRjaCBtb2RlIGFuZCB3YWl0IGZvciByZWFkeVN0YXRlID0gNFxuXHRcdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHRcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0c2VsZi5fbW9kZSA9ICd0ZXh0OnZiYXJyYXknXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR9XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID4gc2VsZi5fcG9zKSB7XG5cdFx0XHRcdHZhciBuZXdEYXRhID0gcmVzcG9uc2Uuc3Vic3RyKHNlbGYuX3Bvcylcblx0XHRcdFx0aWYgKHNlbGYuX2NoYXJzZXQgPT09ICd4LXVzZXItZGVmaW5lZCcpIHtcblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcihuZXdEYXRhLmxlbmd0aClcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG5ld0RhdGEubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0XHRidWZmZXJbaV0gPSBuZXdEYXRhLmNoYXJDb2RlQXQoaSkgJiAweGZmXG5cblx0XHRcdFx0XHRzZWxmLnB1c2goYnVmZmVyKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXdEYXRhLCBzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuX3BvcyA9IHJlc3BvbnNlLmxlbmd0aFxuXHRcdFx0fVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuRE9ORSB8fCAheGhyLnJlc3BvbnNlKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJzogLy8gdGFrZSB3aG9sZVxuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gclN0YXRlcy5MT0FESU5HIHx8ICFyZXNwb25zZSlcblx0XHRcdFx0YnJlYWtcblx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgJ21zLXN0cmVhbSc6XG5cdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkxPQURJTkcpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR2YXIgcmVhZGVyID0gbmV3IGdsb2JhbC5NU1N0cmVhbVJlYWRlcigpXG5cdFx0XHRyZWFkZXIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aCA+IHNlbGYuX3Bvcykge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlYWRlci5yZXN1bHQuc2xpY2Uoc2VsZi5fcG9zKSkpKVxuXHRcdFx0XHRcdHNlbGYuX3BvcyA9IHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLnB1c2gobnVsbClcblx0XHRcdH1cblx0XHRcdC8vIHJlYWRlci5vbmVycm9yID0gPz8/IC8vIFRPRE86IHRoaXNcblx0XHRcdHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihyZXNwb25zZSlcblx0XHRcdGJyZWFrXG5cdH1cblxuXHQvLyBUaGUgbXMtc3RyZWFtIGNhc2UgaGFuZGxlcyBlbmQgc2VwYXJhdGVseSBpbiByZWFkZXIub25sb2FkKClcblx0aWYgKHNlbGYuX3hoci5yZWFkeVN0YXRlID09PSByU3RhdGVzLkRPTkUgJiYgc2VsZi5fbW9kZSAhPT0gJ21zLXN0cmVhbScpIHtcblx0XHRzZWxmLnB1c2gobnVsbClcblx0fVxufVxuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xudmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIFVuaWNvZGUgc3ltYm9scy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpIHtcbiAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzVW5pY29kZTtcbiIsImNvbnN0IHsgVVJMIH0gPSByZXF1aXJlKCd1cmwnKVxuXG4vKipcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb3Blcmx5IGZvcm1hdHRlZCBIVFRQIHJlcXVlc3QgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaHR0cFJlcXVlc3RQYXRoICh1cmwpIHtcbiAgaWYgKCEodXJsIGluc3RhbmNlb2YgVVJMKSkge1xuICAgIHVybCA9IG5ldyBVUkwodXJsKVxuICB9XG4gIHJldHVybiAoXG4gICAgYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaCA/IGA/JHt1cmwuc2VhcmNoUGFyYW1zLnRvU3RyaW5nKCl9YCA6ICcnfSR7dXJsLmhhc2ggPyB1cmwuaGFzaCA6ICcnfWBcbiAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaHR0cFJlcXVlc3RQYXRoXG59XG4iLCJjb25zdCB7IFNUQVRVU19DT0RFUyB9ID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCB7IFVSTCB9ID0gcmVxdWlyZSgndXJsJylcbmNvbnN0IHtcbiAgY2FuUmVwbGF5UHJvdG9jb2xzLFxuICBTUEFDRSxcbiAgSFRUUDFEMSxcbiAgSDJNZXRob2Rcbn0gPSByZXF1aXJlKCcuLi91dGlscy9jb25zdGFudHMnKVxuY29uc3QgeyBodHRwUmVxdWVzdFBhdGggfSA9IHJlcXVpcmUoJy4uL3V0aWxzL3VybC1oZWxwZXJzJylcbmNvbnN0IHsgQ1JMRiB9ID0gcmVxdWlyZSgnLi4vd3JpdGVycy93YXJjRmllbGRzJylcbmNvbnN0IHsgc3RyaW5naWZ5SGVhZGVycyB9ID0gcmVxdWlyZSgnLi4vdXRpbHMvaGVhZGVyU2VyaWFsaXplcnMnKVxuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEhlYWRlclRyYWlsZXJzID0gYCR7Q1JMRn0ke0NSTEZ9YFxuXG4vKipcbiAqIEBkZXNjIFJlcHJlc2VudHMgYSByZXF1ZXN0IGFuZCByZXNwb25zZVxuICovXG5jbGFzcyBDRFBSZXF1ZXN0SW5mbyB7XG4gIC8qKlxuICAgKiBAZGVzYyBDb25zdHJ1Y3QgYSBuZXcgQ0RQUmVxdWVzdEluZm9cbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgaWQgb2YgdGhlIHJlcXVlc3RcbiAgICAgKiBAdHlwZSB7P3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnJlcXVlc3RJZCA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIFVSTCBvZiB0aGUgcmVxdWVzdC4gTWF5IG5vdCBjb250YWluIHRoZSBmcmFnbWVudFxuICAgICAqIHBvcnRpb24gb2YgdGhlIHRoZSBVUkwgaWYgaXQgaGFkIGEgZnJhZ21lbnQgZGVwZW5kaW5nIG9uIGlmIHRoZVxuICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIFVSTCByZXR1cm5lZCBieSB0aGUgQ0RQIHNlcGFyYXRlcyBpdC5cbiAgICAgKiBAdHlwZSB7P3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLl91cmwgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBmcmFnbWVudCBwb3J0aW9uIG9mIHRoZSByZXF1ZXN0cyBVUkwuXG4gICAgICogT25seSBkZWZpbmVkIGlmIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkwgcmV0dXJuZWQgYnkgdGhlIENEUFxuICAgICAqIGhhcyB0aGlzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlIHs/c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudXJsRnJhZ21lbnQgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBIVFRQIG1ldGhvZCB1c2VkIHRvIG1ha2UgdGhpcyByZXF1ZXN0XG4gICAgICogQHR5cGUgez9zdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5tZXRob2QgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBIVFRQIHByb3RvY29sIHVzZWQgdG8gbWFrZSB0aGlzIHJlcXVlc3RcbiAgICAgKiBAdHlwZSB7P3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnByb3RvY29sID0gdW5kZWZpbmVkXG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgSFRUUCBzdGF0dXMgb2YgdGhlIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ3xudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5zdGF0dXMgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBIVFRQIHN0YXR1cyByZWFzb25zIHRleHQgb2YgdGhlIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnN0YXR1c1RleHQgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwb3N0IGRhdGEgb2YgdGhlIHJlcXVlc3QgaWYgYW55IHdhcyBzZW50XG4gICAgICogQHR5cGUgez9zdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5wb3N0RGF0YSA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHJlcXVlc3QgSFRUUCBoZWFkZXJzIG9iamVjdCBvbiB0aGUgQ0RQIFJlc3BvbnNlIG9iamVjdFxuICAgICAqIEB0eXBlIHs/T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSByZXF1ZXN0IEhUVFAgaGVhZGVycyBvYmplY3Qgb24gdGhlIENEUCBSZXF1ZXN0IG9iamVjdFxuICAgICAqIEB0eXBlIHs/T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMucmVxdWVzdEhlYWRlcnNfID0gdW5kZWZpbmVkXG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcmF3IHJlcXVlc3QgSFRUUCBoZWFkZXIgc3RyaW5nIG9uIHRoZSBDRFAgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnJlcXVlc3RIZWFkZXJzVGV4dCA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHJlc3BvbnNlIEhUVFAgaGVhZGVyIG9iamVjdCBvbiB0aGUgQ0RQIFJlc3BvbnNlIG9iamVjdFxuICAgICAqIEB0eXBlIHs/T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gdW5kZWZpbmVkXG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcmF3IHJlc3BvbnNlIEhUVFAgaGVhZGVyIHN0cmluZyBvbiB0aGUgQ0RQIFJlc3BvbnNlIG9iamVjdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHJlc3BvbnNlIGJvZHkgc2hvdWxkIGJlIHJldHJpZXZlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuZ2V0Qm9keSA9IGZhbHNlXG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHJlcXVlc3RzIHBvc3QgZGF0YSBzaG91bGQgYmUgcmV0cmlldmVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5oYXNQb3N0RGF0YSA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQ3JlYXRlIGEgbmV3IFJlcXVlc3RJbmZvIGZyb20gYSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIC0gVGhlIG9iamVjdCByZWNlaXZlZCBmcm9tIE5ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnRcbiAgICogQHJldHVybiB7Q0RQUmVxdWVzdEluZm99XG4gICAqL1xuICBzdGF0aWMgZnJvbVJlcXVlc3QgKGluZm8pIHtcbiAgICBjb25zdCBjciA9IG5ldyBDRFBSZXF1ZXN0SW5mbygpXG4gICAgY3IucmVxdWVzdElkID0gaW5mby5yZXF1ZXN0SWRcbiAgICBjci5fdXJsID0gaW5mby5yZXF1ZXN0LnVybFxuICAgIGNyLnVybEZyYWdtZW50ID0gaW5mby5yZXF1ZXN0LnVybEZyYWdtZW50XG4gICAgY3IubWV0aG9kID0gaW5mby5yZXF1ZXN0Lm1ldGhvZFxuICAgIGNyLnJlcXVlc3RIZWFkZXJzXyA9IGluZm8ucmVxdWVzdC5oZWFkZXJzXG4gICAgY3IucG9zdERhdGEgPSBpbmZvLnJlcXVlc3QucG9zdERhdGFcbiAgICBjci5oYXNQb3N0RGF0YSA9IGluZm8ucmVxdWVzdC5oYXNQb3N0RGF0YVxuICAgIHJldHVybiBjclxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIENyZWF0ZSBhIG5ldyBSZXF1ZXN0SW5mbyBmcm9tIGEgcmVxdWVzdCB0aGF0IHJlZGlyZWN0ZWRcbiAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gLSBUaGUgb2JqZWN0IHJlY2VpdmVkIGZyb20gTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudFxuICAgKiBAcmV0dXJuIHtDRFBSZXF1ZXN0SW5mb31cbiAgICovXG4gIHN0YXRpYyBmcm9tUmVkaXIgKGluZm8pIHtcbiAgICBjb25zdCByZWRpckNSID0gbmV3IENEUFJlcXVlc3RJbmZvKClcbiAgICByZWRpckNSLnJlcXVlc3RJZCA9IGluZm8ucmVxdWVzdElkXG4gICAgcmVkaXJDUi5fdXJsID0gaW5mby5yZWRpcmVjdFJlc3BvbnNlLnVybFxuICAgIHJlZGlyQ1IubWV0aG9kID0gaW5mby5yZXF1ZXN0Lm1ldGhvZFxuICAgIHJlZGlyQ1IucmVxdWVzdEhlYWRlcnMgPSBpbmZvLnJlZGlyZWN0UmVzcG9uc2UucmVxdWVzdEhlYWRlcnNcbiAgICByZWRpckNSLnJlcXVlc3RIZWFkZXJzVGV4dCA9IGluZm8ucmVkaXJlY3RSZXNwb25zZS5yZXF1ZXN0SGVhZGVyc1RleHRcbiAgICByZWRpckNSLnJlc3BvbnNlSGVhZGVycyA9IGluZm8ucmVkaXJlY3RSZXNwb25zZS5oZWFkZXJzXG4gICAgcmVkaXJDUi5yZXNwb25zZUhlYWRlcnNUZXh0ID0gaW5mby5yZWRpcmVjdFJlc3BvbnNlLmhlYWRlcnNUZXh0XG4gICAgcmVkaXJDUi5zdGF0dXMgPSBpbmZvLnJlZGlyZWN0UmVzcG9uc2Uuc3RhdHVzXG4gICAgcmVkaXJDUi5zdGF0dXNUZXh0ID0gaW5mby5yZWRpcmVjdFJlc3BvbnNlLnN0YXR1c1RleHRcbiAgICByZWRpckNSLnByb3RvY29sID0gaW5mby5yZWRpcmVjdFJlc3BvbnNlLnByb3RvY29sXG4gICAgcmV0dXJuIHJlZGlyQ1JcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBDcmVhdGUgYSBuZXcgUmVxdWVzdEluZm8gZnJvbSBhIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIC0gVGhlIG9iamVjdCByZWNlaXZlZCBmcm9tIE5ldHdvcmsucmVzcG9uc2VSZWNlaXZlZFxuICAgKiBAcmV0dXJuIHtDRFBSZXF1ZXN0SW5mb31cbiAgICovXG4gIHN0YXRpYyBmcm9tUmVzcG9uc2UgKGluZm8pIHtcbiAgICBjb25zdCBjciA9IG5ldyBDRFBSZXF1ZXN0SW5mbygpXG4gICAgY3IucmVxdWVzdElkID0gaW5mby5yZXF1ZXN0SWRcbiAgICBjci5fdXJsID0gaW5mby5yZXNwb25zZS51cmxcbiAgICBjci5yZXF1ZXN0SGVhZGVycyA9IGluZm8ucmVzcG9uc2UucmVxdWVzdEhlYWRlcnNcbiAgICBjci5yZXF1ZXN0SGVhZGVyc1RleHQgPSBpbmZvLnJlc3BvbnNlLnJlcXVlc3RIZWFkZXJzVGV4dFxuICAgIGNyLnJlc3BvbnNlSGVhZGVycyA9IGluZm8ucmVzcG9uc2UuaGVhZGVyc1xuICAgIGNyLnJlc3BvbnNlSGVhZGVyc1RleHQgPSBpbmZvLnJlc3BvbnNlLmhlYWRlcnNUZXh0XG4gICAgY3Iuc3RhdHVzID0gaW5mby5yZXNwb25zZS5zdGF0dXNcbiAgICBjci5zdGF0dXNUZXh0ID0gaW5mby5yZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgY3IucHJvdG9jb2wgPSBpbmZvLnJlc3BvbnNlLnByb3RvY29sXG4gICAgY3IuZ2V0Qm9keSA9IHRydWVcbiAgICByZXR1cm4gY3JcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBBZGQgdGhlIHJlcXVlc3RzIHJlc3BvbnNlIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXMgLSBUaGUgcmVzcG9uc2Ugb2JqZWN0IHJlY2VpdmVkIGZyb20gTmV0d29yay5yZXNwb25zZVJlY2VpdmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vdDN4eD10cnVlXVxuICAgKi9cbiAgYWRkUmVzcG9uc2UgKHJlcywgbm90M3h4ID0gdHJ1ZSkge1xuICAgIHRoaXMuX3VybCA9IHRoaXMuX3VybCB8fCByZXMudXJsXG4gICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHJlcy5yZXF1ZXN0SGVhZGVyc1xuICAgIHRoaXMucmVxdWVzdEhlYWRlcnNUZXh0ID0gcmVzLnJlcXVlc3RIZWFkZXJzVGV4dFxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzLmhlYWRlcnNcbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVyc1RleHQgPSByZXMuaGVhZGVyc1RleHRcbiAgICB0aGlzLnN0YXR1cyA9IHJlcy5zdGF0dXNcbiAgICB0aGlzLnN0YXR1c1RleHQgPSByZXMuc3RhdHVzVGV4dFxuICAgIHRoaXMucHJvdG9jb2wgPSByZXMucHJvdG9jb2xcbiAgICB0aGlzLmdldEJvZHkgPSBub3QzeHhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdXJsICgpIHtcbiAgICByZXR1cm4gdGhpcy51cmxGcmFnbWVudCAhPSBudWxsID8gdGhpcy5fdXJsICsgdGhpcy51cmxGcmFnbWVudCA6IHRoaXMuX3VybFxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJldHVybnMgYSBVUkwgb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHJlcXVlc3RzIFVSTFxuICAgKiBAcmV0dXJuIHtVUkx9XG4gICAqL1xuICBnZXRQYXJzZWRVUkwgKCkge1xuICAgIHJldHVybiBuZXcgVVJMKHRoaXMudXJsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJldHVybnMgdGhlIHJlcXVlc3QgaGVhZGVycyB0ZXh0IHRoYXQgaXMgcmVwbGF5IGFibGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzVGV4dCAoKSB7XG4gICAgY29uc3QgZmNybGZpZHggPSB0aGlzLnJlcXVlc3RIZWFkZXJzVGV4dC5pbmRleE9mKENSTEYpXG4gICAgbGV0IGZsaW5lID0gdGhpcy5yZXF1ZXN0SGVhZGVyc1RleHQuc3Vic3RyaW5nKDAsIGZjcmxmaWR4KVxuICAgIGNvbnN0IHJlc3QgPSB0aGlzLnJlcXVlc3RIZWFkZXJzVGV4dC5zdWJzdHJpbmcoZmNybGZpZHgpXG4gICAgY29uc3QgcHJvdG9jb2wgPSBmbGluZS5zdWJzdHJpbmcoZmxpbmUubGFzdEluZGV4T2YoU1BBQ0UpICsgMSlcbiAgICBpZiAoIWNhblJlcGxheVByb3RvY29scy5oYXMocHJvdG9jb2wpKSB7XG4gICAgICBmbGluZSA9IGZsaW5lLnJlcGxhY2UocHJvdG9jb2wsIEhUVFAxRDEpXG4gICAgfVxuICAgIGNvbnN0IHRyYWlsZXJzID0gcmVzdC5zdWJzdHJpbmcocmVzdC5sZW5ndGggLSA0KVxuICAgIHJldHVybiB0cmFpbGVycyA9PT0gSGVhZGVyVHJhaWxlcnMgPyBmbGluZSArIHJlc3QgOiBmbGluZSArIHJlc3QgKyBDUkxGXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmV0dXJucyB0aGUgY29ycmVjdCByZXF1ZXN0IGhlYWRlciBvYmplY3Qgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lXG4gICAqIEByZXR1cm4gez9PYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2V0UmVxSGVhZGVyT2JqICgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0SGVhZGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0SGVhZGVyc1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXF1ZXN0SGVhZGVyc18gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEhlYWRlcnNfXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9lbnN1cmVQcm90byAoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcm90b2NvbCA9PSBudWxsIHx8XG4gICAgICAhY2FuUmVwbGF5UHJvdG9jb2xzLmhhcyh0aGlzLnByb3RvY29sLnRvVXBwZXJDYXNlKCkpXG4gICAgKSB7XG4gICAgICB0aGlzLnByb3RvY29sID0gSFRUUDFEMVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBTZXJpYWxpemVzIHJlcXVlc3QgaGVhZGVycyBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzT2JqICgpIHtcbiAgICB0aGlzLl9jaGVja01ldGhvZCgpXG4gICAgdGhpcy5fZW5zdXJlUHJvdG8oKVxuICAgIGNvbnN0IHB1cmwgPSB0aGlzLmdldFBhcnNlZFVSTCgpXG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMuX2dldFJlcUhlYWRlck9iaigpXG4gICAgY29uc3QgcGF0aCA9IGh0dHBSZXF1ZXN0UGF0aChwdXJsKVxuICAgIGNvbnN0IG91dFN0cmluZyA9IGAke3RoaXMubWV0aG9kfSAke3BhdGh9ICR7dGhpcy5wcm90b2NvbH0ke0NSTEZ9YFxuICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHtcbiAgICAgIGlmIChoZWFkZXJzLmhvc3QgPT0gbnVsbCAmJiBoZWFkZXJzLkhvc3QgPT0gbnVsbCkge1xuICAgICAgICBoZWFkZXJzLkhvc3QgPSBwdXJsLmhvc3RcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRTdHJpbmcgKyBzdHJpbmdpZnlIZWFkZXJzKGhlYWRlcnMpXG4gICAgfVxuICAgIHJldHVybiBvdXRTdHJpbmcgKyBgSG9zdDogJHtwdXJsLmhvc3R9JHtDUkxGfSR7Q1JMRn1gXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcnMgZm9yIHRoZSBXQVJDIGVudHJ5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHNlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzICgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0SGVhZGVyc1RleHQgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzVGV4dCgpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVSZXF1ZXN0SGVhZGVyc09iaigpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgU2VyaWFsaXplIHRoZSByZXNwb25zZSBoZWFkZXJzIGZvciB0aGUgV0FSQyBlbnRyeVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBzZXJpYWxpemVSZXNwb25zZUhlYWRlcnMgKCkge1xuICAgIGxldCBvdXRTdHJpbmdcbiAgICBpZiAodGhpcy5yZXNwb25zZUhlYWRlcnNUZXh0ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5yZXNwb25zZUhlYWRlcnNUZXh0LnN1YnN0cmluZyhcbiAgICAgICAgMCxcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnNUZXh0LmluZGV4T2YoU1BBQ0UpXG4gICAgICApXG4gICAgICBvdXRTdHJpbmcgPSBjYW5SZXBsYXlQcm90b2NvbHMuaGFzKHByb3RvY29sKVxuICAgICAgICA/IHRoaXMucmVzcG9uc2VIZWFkZXJzVGV4dFxuICAgICAgICA6IHRoaXMucmVzcG9uc2VIZWFkZXJzVGV4dC5yZXBsYWNlKHByb3RvY29sLCBIVFRQMUQxKVxuICAgICAgY29uc3QgdHJhaWxlcnMgPSBvdXRTdHJpbmcuc3Vic3RyaW5nKG91dFN0cmluZy5sZW5ndGggLSA0KVxuICAgICAgcmV0dXJuIHRyYWlsZXJzID09PSBIZWFkZXJUcmFpbGVycyA/IG91dFN0cmluZyA6IG91dFN0cmluZyArIENSTEZcbiAgICB9IGVsc2UgaWYgKHRoaXMucmVzcG9uc2VIZWFkZXJzICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX2Vuc3VyZVByb3RvKClcbiAgICAgIGlmICghdGhpcy5zdGF0dXNUZXh0KSB7XG4gICAgICAgIHRoaXMuc3RhdHVzVGV4dCA9IFNUQVRVU19DT0RFU1t0aGlzLnN0YXR1c11cbiAgICAgIH1cbiAgICAgIG91dFN0cmluZyA9IGAke3RoaXMucHJvdG9jb2x9ICR7dGhpcy5zdGF0dXN9ICR7XG4gICAgICAgIHRoaXMuc3RhdHVzVGV4dFxuICAgICAgfSR7Q1JMRn0ke3N0cmluZ2lmeUhlYWRlcnModGhpcy5yZXNwb25zZUhlYWRlcnMpfWBcbiAgICB9XG4gICAgcmV0dXJuIG91dFN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIERldGVybWluZSBpZiB3ZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBzZXJpYWxpemUgdGhlIHJlc3BvbnNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBjYW5TZXJpYWxpemVSZXNwb25zZSAoKSB7XG4gICAgaWYgKHRoaXMudXJsLmluZGV4T2YoJ2RhdGE6JykgPT09IDApIHJldHVybiBmYWxzZVxuICAgIGlmICh0aGlzLnJlc3BvbnNlSGVhZGVyc1RleHQgIT0gbnVsbCkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdGF0dXMgIT0gbnVsbCAmJlxuICAgICAgdGhpcy5wcm90b2NvbCAhPSBudWxsICYmXG4gICAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyAhPSBudWxsXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0IGluZm8gb2JqZWN0IGhhcyBpdHMgbWV0aG9kIHByb3BlcnR5IHNldFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrTWV0aG9kICgpIHtcbiAgICBpZiAoIXRoaXMubWV0aG9kKSB7XG4gICAgICBsZXQgZ29vZCA9IGZhbHNlXG4gICAgICBpZiAodGhpcy5yZXF1ZXN0SGVhZGVycykge1xuICAgICAgICBsZXQgbWF5YmVNZXRoID0gdGhpcy5yZXF1ZXN0SGVhZGVyc1tIMk1ldGhvZF1cbiAgICAgICAgaWYgKG1heWJlTWV0aCkge1xuICAgICAgICAgIHRoaXMubWV0aG9kID0gbWF5YmVNZXRoXG4gICAgICAgICAgZ29vZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVzcG9uc2VIZWFkZXJzKSB7XG4gICAgICAgIGxldCBtYXliZU1ldGggPSB0aGlzLnJlc3BvbnNlSGVhZGVyc1tIMk1ldGhvZF1cbiAgICAgICAgaWYgKG1heWJlTWV0aCkge1xuICAgICAgICAgIHRoaXMubWV0aG9kID0gbWF5YmVNZXRoXG4gICAgICAgICAgZ29vZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFnb29kICYmIHRoaXMucmVxdWVzdEhlYWRlcnNUZXh0KSB7XG4gICAgICAgIHRoaXMuX21ldGhQcm90b0Zyb21SZXFIZWFkVGV4dCh0aGlzLnJlcXVlc3RIZWFkZXJzVGV4dClcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gdGhpcy5wb3N0RGF0YSAhPSBudWxsIHx8IHRoaXMuaGFzUG9zdERhdGEgPyAnUE9TVCcgOiAnR0VUJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBTZXQgVGhlIFJlcXVlc3RzIE1ldGhvZCBBbmQgUHJvdG9jb2wgRnJvbSBUaGUgUmVxdWVzdCBIZWFkZXJzIFRleHRcbiAgICogQHBhcmFtIHs/c3RyaW5nfSByZXF1ZXN0SGVhZGVyc1RleHQgLSBUaGUgRnVsbCBIVFRQIEhlYWRlcnMgU3RyaW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWV0aFByb3RvRnJvbVJlcUhlYWRUZXh0IChyZXF1ZXN0SGVhZGVyc1RleHQpIHtcbiAgICBpZiAocmVxdWVzdEhlYWRlcnNUZXh0KSB7XG4gICAgICBsZXQgaHR0cFN0cmluZyA9IHJlcXVlc3RIZWFkZXJzVGV4dC5zdWJzdHIoXG4gICAgICAgIDAsXG4gICAgICAgIHJlcXVlc3RIZWFkZXJzVGV4dC5pbmRleE9mKENSTEYpXG4gICAgICApXG4gICAgICBpZiAoaHR0cFN0cmluZykge1xuICAgICAgICBsZXQgaHR0cFN0cmluZ1BhcnRzID0gaHR0cFN0cmluZy5zcGxpdChTUEFDRSlcbiAgICAgICAgaWYgKGh0dHBTdHJpbmdQYXJ0cykge1xuICAgICAgICAgIHRoaXMubWV0aG9kID0gaHR0cFN0cmluZ1BhcnRzWzBdXG4gICAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKSB7XG4gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gdGhpcy5fY29ycmVjdFByb3RvY29sKGh0dHBTdHJpbmdQYXJ0c1syXSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3QgaW5mbyBvYmplY3QgaGFzIHRoZSBjb3JyZWN0IHByb3RvY29sIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmlnaW5hbFByb3RvY29sIC0gVGhlIG9yZGluYWwgcHJvdG9jb2wgb2YgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvcnJlY3RQcm90b2NvbCAob3JpZ2luYWxQcm90b2NvbCkge1xuICAgIGxldCBuZXdQcm90b2NvbFxuICAgIGlmIChvcmlnaW5hbFByb3RvY29sKSB7XG4gICAgICBuZXdQcm90b2NvbCA9IG9yaWdpbmFsUHJvdG9jb2wudG9VcHBlckNhc2UoKVxuICAgICAgbmV3UHJvdG9jb2wgPSBjYW5SZXBsYXlQcm90b2NvbHMuaGFzKG5ld1Byb3RvY29sKSA/IG5ld1Byb3RvY29sIDogSFRUUDFEMVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdQcm90b2NvbCA9IEhUVFAxRDFcbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb3RvY29sKSB7XG4gICAgICB0aGlzLnByb3RvY29sID0gbmV3UHJvdG9jb2xcbiAgICB9XG4gICAgcmV0dXJuIG5ld1Byb3RvY29sXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7Q0RQUmVxdWVzdEluZm99XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gQ0RQUmVxdWVzdEluZm9cbiIsImNvbnN0IHV1aWQgPSByZXF1aXJlKCd1dWlkL3YxJylcbmNvbnN0IENEUFJlcXVlc3RJbmZvID0gcmVxdWlyZSgnLi9jZHBSZXF1ZXN0SW5mbycpXG5cbi8qKlxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgaXNSZXEgPSBTeW1ib2woJ2lzX3JlcXVlc3QnKVxuLyoqXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpc1JlZGlyID0gU3ltYm9sKCdpc19yZWRpcmVjdGlvbicpXG4vKipcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGlzUmVzID0gU3ltYm9sKCdpc19yZXNwb25zZScpXG5cbi8qKlxuICogQGRlc2MgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gaW5mb1xuICogQHJldHVybiB7c3ltYm9sfVxuICovXG5mdW5jdGlvbiBkZXRlcm1pblJlcXVlc3RUeXBlIChpbmZvKSB7XG4gIGlmIChpbmZvLnJlZGlyZWN0UmVzcG9uc2UgIT0gbnVsbCkge1xuICAgIHJldHVybiBpc1JlZGlyXG4gIH0gZWxzZSBpZiAoaW5mby5yZXF1ZXN0ICE9IG51bGwpIHtcbiAgICByZXR1cm4gaXNSZXFcbiAgfVxuICByZXR1cm4gaXNSZXNcbn1cblxuLyoqXG4gKiBAZGVzYyBSZXByZXNlbnRzIEEgVW5pcXVlIFJlcXVlc3QgQW5kIFJlc3BvbnNlIENoYWluIEFzIE1hZGUgQnkgQSBQYWdlXG4gKiBDb25zb2xpZGF0ZXMgVGhlIE1vZGlmaWNhdGlvbiBPZiBIVFRQLzIgSW50byBIVFRQLzEuMVxuICogUHJvdmlkZXMgVXRpbGl0eSBGdW5jdGlvbmFsaXR5IEZvciBTZXJpYWxpemF0aW9uIFRvIFdBUkNcbiAqL1xuY2xhc3MgQ2FwdHVyZWRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIC0gVGhlIG9iamVjdCByZWNlaXZlZCBmcm9tIE5ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQgb3IgTmV0d29yay5yZXNwb25zZVJlY2VpdmVkXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoaW5mbykge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5yZXF1ZXN0SWQgPSBpbmZvLnJlcXVlc3RJZFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIENEUFJlcXVlc3RJbmZvPn1cbiAgICAgKi9cbiAgICB0aGlzLl9yZXFzID0gbmV3IE1hcCgpXG4gICAgbGV0IHJ0ID0gZGV0ZXJtaW5SZXF1ZXN0VHlwZShpbmZvKVxuICAgIGlmIChydCA9PT0gaXNSZWRpcikge1xuICAgICAgLy8gcmVkaXJlY3Rpb24gY3JlYXRlIHJlc3BvbnNlIFJlcXVlc3RJbmZvIGZvciByZWRpcmVjdCBhbmQgcmVxdWVzdFxuICAgICAgbGV0IHJlZGlyQ1IgPSBDRFBSZXF1ZXN0SW5mby5mcm9tUmVkaXIoaW5mbylcbiAgICAgIGxldCBjciA9IENEUFJlcXVlc3RJbmZvLmZyb21SZXF1ZXN0KGluZm8pXG4gICAgICB0aGlzLl9yZXFzLnNldChyZWRpckNSLnVybCwgcmVkaXJDUilcbiAgICAgIHRoaXMuX3JlcXMuc2V0KGNyLnVybCwgY3IpXG4gICAgfSBlbHNlIGlmIChydCA9PT0gaXNSZXEpIHtcbiAgICAgIHRoaXMuX3JlcXMuc2V0KGluZm8ucmVxdWVzdC51cmwsIENEUFJlcXVlc3RJbmZvLmZyb21SZXF1ZXN0KGluZm8pKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXFzLnNldChpbmZvLnJlc3BvbnNlLnVybCwgQ0RQUmVxdWVzdEluZm8uZnJvbVJlc3BvbnNlKGluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBDcmVhdGUgYSBuZXcgQ2FwdHVyZWRSZXF1ZXN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIC0gVGhlIG9iamVjdCByZWNlaXZlZCBmcm9tIE5ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQgb3IgTmV0d29yay5yZXNwb25zZVJlY2VpdmVkXG4gICAqIEByZXR1cm4ge0NhcHR1cmVkUmVxdWVzdH1cbiAgICovXG4gIHN0YXRpYyBuZXdPbmUgKGluZm8pIHtcbiAgICByZXR1cm4gbmV3IENhcHR1cmVkUmVxdWVzdChpbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEFkZCByZXF1ZXN0IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIC0gVGhlIG9iamVjdCByZWNlaXZlZCBmcm9tIE5ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQgb3IgTmV0d29yay5yZXNwb25zZVJlY2VpdmVkXG4gICAqL1xuICBhZGRSZXF1ZXN0SW5mbyAoaW5mbykge1xuICAgIGxldCBydCA9IGRldGVybWluUmVxdWVzdFR5cGUoaW5mbylcbiAgICBpZiAocnQgPT09IGlzUmVkaXIpIHtcbiAgICAgIGxldCBoYXZlUmVkaXIgPSB0aGlzLl9yZXFzLmhhcyhpbmZvLnJlZGlyZWN0UmVzcG9uc2UudXJsKVxuICAgICAgaWYgKGhhdmVSZWRpcikge1xuICAgICAgICB0aGlzLl9yZXFzXG4gICAgICAgICAgLmdldChpbmZvLnJlZGlyZWN0UmVzcG9uc2UudXJsKVxuICAgICAgICAgIC5hZGRSZXNwb25zZShpbmZvLnJlZGlyZWN0UmVzcG9uc2UsIGZhbHNlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVxcy5zZXQoXG4gICAgICAgICAgaW5mby5yZWRpcmVjdFJlc3BvbnNlLnVybCxcbiAgICAgICAgICBDRFBSZXF1ZXN0SW5mby5mcm9tUmVkaXIoaW5mbylcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5fcmVxcy5zZXQoaW5mby5yZXF1ZXN0LnVybCwgQ0RQUmVxdWVzdEluZm8uZnJvbVJlcXVlc3QoaW5mbykpXG4gICAgfSBlbHNlIGlmIChydCA9PT0gaXNSZXEpIHtcbiAgICAgIGlmICh0aGlzLl9yZXFzLmhhcyhpbmZvLnJlcXVlc3QudXJsKSkge1xuICAgICAgICB0aGlzLl9yZXFzLnNldChcbiAgICAgICAgICBgJHtpbmZvLnJlcXVlc3QudXJsfSR7dXVpZCgpfWAsXG4gICAgICAgICAgQ0RQUmVxdWVzdEluZm8uZnJvbVJlcXVlc3QoaW5mbylcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVxcy5zZXQoaW5mby5yZXF1ZXN0LnVybCwgQ0RQUmVxdWVzdEluZm8uZnJvbVJlcXVlc3QoaW5mbykpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5fcmVxcy5oYXMoaW5mby5yZXNwb25zZS51cmwpKSB7XG4gICAgICAgIHRoaXMuX3JlcXMuc2V0KGluZm8ucmVzcG9uc2UudXJsLCBDRFBSZXF1ZXN0SW5mby5mcm9tUmVzcG9uc2UoaW5mbykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXFzLmdldChpbmZvLnJlc3BvbnNlLnVybCkuYWRkUmVzcG9uc2UoaW5mby5yZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgSXRlcmF0ZSBvdmVyIHRoZSBSZXF1ZXN0SW5mbyBhc3NvY2lhdGVkIHdpdGggdGhlIENhcHR1cmVkUmVxdWVzdHMjcmVxdWVzdElkXG4gICAqIEByZXR1cm4ge0l0ZXJhdG9yPENEUFJlcXVlc3RJbmZvPn1cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxcy52YWx1ZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ3xBcnJheTxzdHJpbmc+fVxuICAgKi9cbiAgdXJsICgpIHtcbiAgICBsZXQgdXJscyA9IEFycmF5LmZyb20odGhpcy5fcmVxcy5rZXlzKCkpXG4gICAgaWYgKHVybHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdXJsc1swXVxuICAgIH1cbiAgICByZXR1cm4gdXJsc1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEl0ZXJhdGUgb3ZlciB0aGUgUmVxdWVzdEluZm8jdXJsIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ2FwdHVyZWRSZXF1ZXN0cyNyZXF1ZXN0SWRcbiAgICogQHJldHVybiB7SXRlcmF0b3I8c3RyaW5nPn1cbiAgICovXG4gIGtleXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXFzLmtleXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEl0ZXJhdGUgb3ZlciB0aGUgQ0RQUmVxdWVzdEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBDYXB0dXJlZFJlcXVlc3RzI3JlcXVlc3RJZFxuICAgKiBAcmV0dXJuIHtJdGVyYXRvcjxDRFBSZXF1ZXN0SW5mbz59XG4gICAqL1xuICB2YWx1ZXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXFzLnZhbHVlcygpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7Q2FwdHVyZWRSZXF1ZXN0fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IENhcHR1cmVkUmVxdWVzdFxuIiwiLy8gU3RyaW5nIGVuY29kZS9kZWNvZGUgaGVscGVyc1xuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuLy8gUXVpY2sgY2hlY2sgaWYgd2UgY2FuIHVzZSBmYXN0IGFycmF5IHRvIGJpbiBzdHJpbmcgY29udmVyc2lvblxuLy9cbi8vIC0gYXBwbHkoQXJyYXkpIGNhbiBmYWlsIG9uIEFuZHJvaWQgMi4yXG4vLyAtIGFwcGx5KFVpbnQ4QXJyYXkpIGNhbiBmYWlsIG9uIGlPUyA1LjEgU2FmYXJpXG4vL1xudmFyIFNUUl9BUFBMWV9PSyA9IHRydWU7XG52YXIgU1RSX0FQUExZX1VJQV9PSyA9IHRydWU7XG5cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgWyAwIF0pOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfT0sgPSBmYWxzZTsgfVxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsgfVxuXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxudmFyIF91dGY4bGVuID0gbmV3IHV0aWxzLkJ1ZjgoMjU2KTtcbmZvciAodmFyIHEgPSAwOyBxIDwgMjU2OyBxKyspIHtcbiAgX3V0ZjhsZW5bcV0gPSAocSA+PSAyNTIgPyA2IDogcSA+PSAyNDggPyA1IDogcSA+PSAyNDAgPyA0IDogcSA+PSAyMjQgPyAzIDogcSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdID0gX3V0ZjhsZW5bMjU0XSA9IDE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuXG4vLyBjb252ZXJ0IHN0cmluZyB0byBhcnJheSAodHlwZWQsIHdoZW4gcG9zc2libGUpXG5leHBvcnRzLnN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0ci5sZW5ndGgsIGJ1Zl9sZW4gPSAwO1xuXG4gIC8vIGNvdW50IGJpbmFyeSBzaXplXG4gIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGJ1Zl9sZW4gKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XG4gIH1cblxuICAvLyBhbGxvY2F0ZSBidWZmZXJcbiAgYnVmID0gbmV3IHV0aWxzLkJ1ZjgoYnVmX2xlbik7XG5cbiAgLy8gY29udmVydFxuICBmb3IgKGkgPSAwLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIC8qIG9uZSBieXRlICovXG4gICAgICBidWZbaSsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4ZjAgfCAoYyA+Pj4gMTgpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDEyICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmO1xufTtcblxuLy8gSGVscGVyICh1c2VkIGluIDIgcGxhY2VzKVxuZnVuY3Rpb24gYnVmMmJpbnN0cmluZyhidWYsIGxlbikge1xuICAvLyBPbiBDaHJvbWUsIHRoZSBhcmd1bWVudHMgaW4gYSBmdW5jdGlvbiBjYWxsIHRoYXQgYXJlIGFsbG93ZWQgaXMgYDY1NTM0YC5cbiAgLy8gSWYgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiB0aGF0LCB3ZSBjYW4gdXNlIHRoaXMgb3B0aW1pemF0aW9uLFxuICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCB0YWtlIGEgc2xvd2VyIHBhdGguXG4gIGlmIChsZW4gPCA2NTUzNCkge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIFZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgYnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCIndXNlIHN0cmljdCdcbmNvbnN0IHtcbiAgV0FSQ1N0cmVhbVRyYW5zZm9ybSxcbiAgQXV0b1dBUkNQYXJzZXIsXG4gIFdBUkNHelBhcnNlcixcbiAgV0FSQ1BhcnNlclxufSA9IHJlcXVpcmUoJy4vbGliL3BhcnNlcnMnKVxuXG5jb25zdCB7XG4gIENSSUV4dHJhV0FSQ0dlbmVyYXRvcixcbiAgRWxlY3Ryb25XQVJDV3JpdGVyLFxuICBQdXBwZXRlZXJDRFBXQVJDR2VuZXJhdG9yLFxuICBQdXBwZXRlZXJXQVJDR2VuZXJhdG9yLFxuICBSZW1vdGVDaHJvbWVXQVJDV3JpdGVyLFxuICBXQVJDV3JpdGVyQmFzZVxufSA9IHJlcXVpcmUoJy4vbGliL3dyaXRlcnMnKVxuXG5jb25zdCB7XG4gIENSSUV4dHJhQ2FwdHVyZXIsXG4gIEVsZWN0cm9uQ2FwdHVyZXIsXG4gIFB1cHBldGVlckNhcHR1cmVyLFxuICBQdXBwZXRlZXJDRFBDYXB0dXJlcixcbiAgUmVtb3RlQ2hyb21lQ2FwdHVyZXIsXG4gIFJlcXVlc3RIYW5kbGVyXG59ID0gcmVxdWlyZSgnLi9saWIvcmVxdWVzdENhcHR1cmVycycpXG5cbi8qKlxuICogQHR5cGUge0F1dG9XQVJDUGFyc2VyfVxuICovXG5leHBvcnRzLkF1dG9XQVJDUGFyc2VyID0gQXV0b1dBUkNQYXJzZXJcblxuLyoqXG4gKiBAdHlwZSB7Q1JJRXh0cmFSZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbmV4cG9ydHMuQ1JJRXh0cmFDYXB0dXJlciA9IENSSUV4dHJhQ2FwdHVyZXJcblxuLyoqXG4gKiBAdHlwZSB7Q1JJRXh0cmFXQVJDR2VuZXJhdG9yfVxuICovXG5leHBvcnRzLkNSSUV4dHJhV0FSQ0dlbmVyYXRvciA9IENSSUV4dHJhV0FSQ0dlbmVyYXRvclxuXG4vKipcbiAqIEB0eXBlIHtFbGVjdHJvblJlcXVlc3RDYXB0dXJlcn1cbiAqL1xuZXhwb3J0cy5FbGVjdHJvbkNhcHR1cmVyID0gRWxlY3Ryb25DYXB0dXJlclxuXG4vKipcbiAqIEB0eXBlIHtFbGVjdHJvbldBUkNHZW5lcmF0b3J9XG4gKi9cbmV4cG9ydHMuRWxlY3Ryb25XQVJDV3JpdGVyID0gRWxlY3Ryb25XQVJDV3JpdGVyXG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlckNEUFJlcXVlc3RDYXB0dXJlcn1cbiAqL1xuZXhwb3J0cy5QdXBwZXRlZXJDRFBDYXB0dXJlciA9IFB1cHBldGVlckNEUENhcHR1cmVyXG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlckNEUFdBUkNHZW5lcmF0b3J9XG4gKi9cbmV4cG9ydHMuUHVwcGV0ZWVyQ0RQV0FSQ0dlbmVyYXRvciA9IFB1cHBldGVlckNEUFdBUkNHZW5lcmF0b3JcblxuLyoqXG4gKiBAdHlwZSB7UHVwcGV0ZWVyUmVxdWVzdENhcHR1cmVyfVxuICovXG5leHBvcnRzLlB1cHBldGVlckNhcHR1cmVyID0gUHVwcGV0ZWVyQ2FwdHVyZXJcblxuLyoqXG4gKiBAdHlwZSB7UHVwcGV0ZWVyV0FSQ0dlbmVyYXRvcn1cbiAqL1xuZXhwb3J0cy5QdXBwZXRlZXJXQVJDR2VuZXJhdG9yID0gUHVwcGV0ZWVyV0FSQ0dlbmVyYXRvclxuXG4vKipcbiAqIEB0eXBlIHtSZW1vdGVDaHJvbWVSZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbmV4cG9ydHMuUmVtb3RlQ2hyb21lQ2FwdHVyZXIgPSBSZW1vdGVDaHJvbWVDYXB0dXJlclxuXG4vKipcbiAqIEB0eXBlIHtSZW1vdGVDaHJvbWVXQVJDR2VuZXJhdG9yfVxuICovXG5leHBvcnRzLlJlbW90ZUNocm9tZVdBUkNXcml0ZXIgPSBSZW1vdGVDaHJvbWVXQVJDV3JpdGVyXG5cbi8qKlxuICogQHR5cGUge1JlcXVlc3RIYW5kbGVyfVxuICovXG5leHBvcnRzLlJlcXVlc3RIYW5kbGVyID0gUmVxdWVzdEhhbmRsZXJcblxuLyoqXG4gKiBAdHlwZSB7V0FSQ0d6UGFyc2VyfVxuICovXG5leHBvcnRzLldBUkNHelBhcnNlciA9IFdBUkNHelBhcnNlclxuXG4vKipcbiAqIEB0eXBlIHtXQVJDUGFyc2VyfVxuICovXG5leHBvcnRzLldBUkNQYXJzZXIgPSBXQVJDUGFyc2VyXG5cbi8qKlxuICogQHR5cGUge1dBUkNTdHJlYW1UcmFuc2Zvcm19XG4gKi9cbmV4cG9ydHMuV0FSQ1N0cmVhbVRyYW5zZm9ybSA9IFdBUkNTdHJlYW1UcmFuc2Zvcm1cblxuLyoqXG4gKiBAdHlwZSB7V0FSQ1dyaXRlckJhc2V9XG4gKi9cbmV4cG9ydHMuV0FSQ1dyaXRlckJhc2UgPSBXQVJDV3JpdGVyQmFzZVxuXG4vKipcbiAqIEB0eXBlIHtSZXF1ZXN0TGliV0FSQ0dlbmVyYXRvcn1cbiAqL1xuZXhwb3J0cy5SZXF1ZXN0TGliV0FSQ1dyaXRlciA9IHJlcXVpcmUoJy4vbGliL3dyaXRlcnMvcmVxdWVzdExpYicpXG5cbmlmIChyZXF1aXJlKCcuL2xpYi9wYXJzZXJzL19jYW5Vc2VSZWNvcmRJdGVyYXRvcicpKSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7ZnVuY3Rpb24oUmVhZFN0cmVhbSk6IEFzeW5jSXRlcmF0b3I8V0FSQ1JlY29yZD59XG4gICAqL1xuICBleHBvcnRzLnJlY29yZEl0ZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvcGFyc2Vycy9yZWNvcmR0ZXJhdG9yJylcbn1cblxuLy8gVGVzdGluZyBmb3IgQnJvd3NlclxuZXhwb3J0cy5zdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuZXhwb3J0cy56bGliID0gcmVxdWlyZSgnemxpYicpXG5leHBvcnRzLnBha28gPSByZXF1aXJlKCdwYWtvJylcbiIsIi8qKlxuICogQHR5cGUge0F1dG9XQVJDUGFyc2VyfVxuICovXG5leHBvcnRzLkF1dG9XQVJDUGFyc2VyID0gcmVxdWlyZSgnLi9hdXRvV0FSQ1BhcnNlcicpXG5cbi8qKlxuICogQHR5cGUge0d6aXBEZXRlY3Rvcn1cbiAqL1xuZXhwb3J0cy5HemlwRGV0ZWN0b3IgPSByZXF1aXJlKCcuL2d6aXBEZXRlY3RvcicpXG5cbi8qKlxuICogQHR5cGUge1dBUkNHelBhcnNlcn1cbiAqL1xuZXhwb3J0cy5XQVJDR3pQYXJzZXIgPSByZXF1aXJlKCcuL3dhcmNHelBhcnNlcicpXG5cbi8qKlxuICogQHR5cGUge1dBUkNQYXJzZXJ9XG4gKi9cbmV4cG9ydHMuV0FSQ1BhcnNlciA9IHJlcXVpcmUoJy4vd2FyY1BhcnNlcicpXG5cbi8qKlxuICogQHR5cGUge1dBUkNTdHJlYW1UcmFuc2Zvcm19XG4gKi9cbmV4cG9ydHMuV0FSQ1N0cmVhbVRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vd2FyY1N0cmVhbVRyYW5zZm9ybScpXG5cbmlmIChyZXF1aXJlKCcuL19jYW5Vc2VSZWNvcmRJdGVyYXRvcicpKSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7ZnVuY3Rpb24od2FyY1N0cmVhbTogUmVhZFN0cmVhbXxHdW56aXApOiBBc3luY0l0ZXJhdG9yPFdBUkNSZWNvcmQ+fVxuICAgKi9cbiAgZXhwb3J0cy5yZWNvcmRJdGVyYXRvciA9IHJlcXVpcmUoJy4vcmVjb3JkdGVyYXRvcicpXG59XG4iLCJjb25zdCBnZXRTdHJlYW0gPSByZXF1aXJlKCcuLi91dGlscy9nZXRTdHJlYW0nKS5nZXRTdHJlYW1cbmNvbnN0IHpsaWIgPSByZXF1aXJlKCd6bGliJylcbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKVxuY29uc3QgV0FSQ1N0cmVhbVRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vd2FyY1N0cmVhbVRyYW5zZm9ybScpXG5jb25zdCBHemlwRGV0ZWN0b3IgPSByZXF1aXJlKCcuL2d6aXBEZXRlY3RvcicpXG5jb25zdCBjYW5Vc2VSZWNvcmRJdGVyYXRvciA9IHJlcXVpcmUoJy4vX2NhblVzZVJlY29yZEl0ZXJhdG9yJylcblxuLyoqXG4gKiBAZGVzYyBQYXJzZXMgYSBXQVJDIGZpbGUgYXV0b21hdGljYWxseSBkZXRlY3RpbmcgaWYgaXQgaXMgZ3ppcHBlZC5cbiAqIEBleHRlbmRzIHtFdmVudEVtaXR0ZXJ9XG4gKiBAZXhhbXBsZVxuICogIGNvbnN0IHBhcnNlciA9IG5ldyBBdXRvV0FSQ1BhcnNlcignPHBhdGgtdG8td2FyY2ZpbGU+JylcbiAqICBwYXJzZXIub24oJ3JlY29yZCcsIHJlY29yZCA9PiB7IGNvbnNvbGUubG9nKHJlY29yZCkgfSlcbiAqICBwYXJzZXIub24oJ2Vycm9yJywgZXJyb3IgPT4geyBjb25zb2xlLmVycm9yKGVycm9yKSB9KVxuICogIHBhcnNlci5zdGFydCgpXG4gKiBAZXhhbXBsZVxuICogIGNvbnN0IHBhcnNlciA9IG5ldyBBdXRvV0FSQ1BhcnNlcigpXG4gKiAgcGFyc2VyLm9uKCdyZWNvcmQnLCByZWNvcmQgPT4geyBjb25zb2xlLmxvZyhyZWNvcmQpIH0pXG4gKiAgcGFyc2VyLm9uKCdlcnJvcicsIGVycm9yID0+IHsgY29uc29sZS5lcnJvcihlcnJvcikgfSlcbiAqICBwYXJzZXIucGFyc2VXQVJDKCc8cGF0aC10by13YXJjZmlsZT4nKVxuICogIEBleGFtcGxlXG4gKiAgLy8gcmVxdWlyZXMgbm9kZSA+PSAxMFxuICogIGZvciBhd2FpdCAoY29uc3QgcmVjb3JkIG9mIG5ldyBBdXRvV0FSQ1BhcnNlcignPHBhdGgtdG8td2FyY2ZpbGU+JykpIHtcbiAqICAgIGNvbnNvbGUubG9nKHJlY29yZClcbiAqICB9XG4gKi9cbmNsYXNzIEF1dG9XQVJDUGFyc2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjIENyZWF0ZSBhIG5ldyBBdXRvV0FSQ1BhcnNlclxuICAgKiBAcGFyYW0gez9zdHJpbmd9IFt3cF0gLSBwYXRoIHRvIHRoZSB3YXJjIGZpbGUgdG8gYmUgcGFyc2VkXG4gICAqL1xuICBjb25zdHJ1Y3RvciAod3ApIHtcbiAgICBzdXBlcigpXG4gICAgLyoqXG4gICAgICogQHR5cGUgez9zdHJpbmd9IHRoZSBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgdG8gYmUgcGFyc2VkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl93cCA9IHdwXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gaXMgdGhlIHBhcnNlciBjdXJyZW50bHkgcGFyc2luZyB0aGUgV0FSQ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2luZyA9IGZhbHNlXG5cbiAgICB0aGlzLl9vblJlY29yZCA9IHRoaXMuX29uUmVjb3JkLmJpbmQodGhpcylcbiAgICB0aGlzLl9vbkVuZCA9IHRoaXMuX29uRW5kLmJpbmQodGhpcylcbiAgICB0aGlzLl9vbkVycm9yID0gdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpXG5cbiAgICBpZiAoY2FuVXNlUmVjb3JkSXRlcmF0b3IpIHtcbiAgICAgIGNvbnN0IHJlY29yZEl0ZXJhdG9yID0gcmVxdWlyZSgnLi9yZWNvcmR0ZXJhdG9yJylcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybnMge0FzeW5jSXRlcmF0b3I8V0FSQ1JlY29yZD59XG4gICAgICAgKi9cbiAgICAgIHRoaXNbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkSXRlcmF0b3IodGhpcy5fZ2V0U3RyZWFtKCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEJlZ2luIHBhcnNpbmcgdGhlIFdBUkMgZmlsZS4gT25jZSB0aGUgc3RhcnQgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB0aGUgcGFyc2VyIHdpbGwgYmVnaW4gZW1pdHRpbmdcbiAgICogQGVtaXRzIHtyZWNvcmR9IGVtaXR0ZWQgd2hlbiB0aGUgcGFyc2VyIGhhcyBwYXJzZWQgYSBmdWxsIHJlY29yZCwgdGhlIGFyZ3VtZW50IHN1cHBsaWVkIHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHRoZSBwYXJzZWQgcmVjb3JkXG4gICAqIEBlbWl0cyB7ZG9uZX0gZW1pdHRlZCB3aGVuIHRoZSBXQVJDIGZpbGUgaGFzIGJlZW4gY29tcGxldGVseSBwYXJzZWRcbiAgICogQGVtaXRzIHtlcnJvcn0gZW1pdHRlZCBpZiBhbiBleGNlcHRpb24gb2NjdXJzLCB0aGUgYXJndW1lbnQgc3VwcGxpZWQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIGVycm9yIHRoYXQgb2NjdXJyZWQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59ICBpZiB0aGUgcGFyc2VyIGhhcyBiZWd1biBvciBpcyBjdXJyZW50bHkgcGFyc2luZyBhIFdBUkMgZmlsZVxuICAgKiAtIHRydWU6IGluZGljYXRlcyB0aGUgcGFyc2VyIGhhcyBiZWd1biBwYXJzaW5nIHRoZSBXQVJDIGZpbGUgdHJ1ZVxuICAgKiAtIGZhbHNlOiBpbmRpY2F0ZWQgdGhlIHBhcnNlciBpcyBjdXJyZW50bHkgcGFyc2luZyBhIFdBUkMgZmlsZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHBhdGggdG8gdGhlIFdBUkMgZmlsZSBpcyBudWxsIG9yIHVuZGVmaW5lZCBvciBhbm90aGVyIGVycm9yIG9jY3VycmVkXG4gICAqL1xuICBzdGFydCAoKSB7XG4gICAgbGV0IHN0YXJ0ZWRQYXJzaW5nID0gZmFsc2VcbiAgICBpZiAoIXRoaXMuX3BhcnNpbmcpIHtcbiAgICAgIGlmICh0aGlzLl93cCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHN1cHBsaWVkIHBhdGggdG8gdGhlIFdBUkMgZmlsZSBpcyBudWxsL3VuZGVmaW5lZCcpXG4gICAgICB9XG4gICAgICB0aGlzLl9wYXJzaW5nID0gdHJ1ZVxuICAgICAgdGhpcy5fZ2V0U3RyZWFtKClcbiAgICAgICAgLnBpcGUobmV3IFdBUkNTdHJlYW1UcmFuc2Zvcm0oKSlcbiAgICAgICAgLm9uKCdkYXRhJywgdGhpcy5fb25SZWNvcmQpXG4gICAgICAgIC5vbignZXJyb3InLCB0aGlzLl9vbkVycm9yKVxuICAgICAgICAub24oJ2VuZCcsIHRoaXMuX29uRW5kKVxuICAgICAgc3RhcnRlZFBhcnNpbmcgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzdGFydGVkUGFyc2luZ1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEFsaWFzIGZvciB7QGxpbmsgc3RhcnR9IGV4Y2VwdCB0aGF0IHlvdSBjYW4gc3VwcGx5IHRoZSBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgdG8gYmUgcGFyc2VkXG4gICAqIGlmIG9uZSB3YXMgbm90IHN1cHBsaWVkIHZpYSB0aGUgY29uc3RydWN0b3Igb3IgdG8gcGFyc2UgYW5vdGhlciBXQVJDIGZpbGUuIElmIHRoZSBwYXRoIHRvIFdBUkMgZmlsZVxuICAgKiB0byBiZSBwYXJzZWQgd2FzIHN1cHBsaWVkIHZpYSB0aGUgY29uc3RydWN0b3IgYW5kIHlvdSBzdXBwbHkgYSBkaWZmZXJlbnQgcGF0aCB0byB0aGlzIG1ldGhvZC5cbiAgICogSXQgd2lsbCBvdmVycmlkZSB0aGUgb25lIHN1cHBsaWVkIHZpYSB0aGUgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBbd3BdIC0gcGF0aCB0byB0aGUgV0FSQyBmaWxlIHRvIGJlIHBhcnNlZFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBpbmRpY2F0aW9uIGlmIHRoZSBwYXJzZXIgaGFzIGJlZ3VuIG9yIGlzIGN1cnJlbnRseSBwYXJzaW5nIGEgV0FSQyBmaWxlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgcGF0aCB0byB0aGUgV0FSQyBmaWxlIGlzIG51bGwgb3IgdW5kZWZpbmVkIG9yIGFub3RoZXIgZXJyb3Igb2NjdXJyZWRcbiAgICovXG4gIHBhcnNlV0FSQyAod3ApIHtcbiAgICBpZiAoIXRoaXMuX3BhcnNpbmcpIHtcbiAgICAgIHRoaXMuX3dwID0gd3AgfHwgdGhpcy5fd3BcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIExpc3RlbmVyIGZvciBhIHBhcnNlcnMgcmVjb3JkIGV2ZW50XG4gICAqIEBwYXJhbSB7V0FSQ1JlY29yZH0gcmVjb3JkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25SZWNvcmQgKHJlY29yZCkge1xuICAgIHRoaXMuZW1pdCgncmVjb3JkJywgcmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIExpc3RlbmVyIGZvciBhIHBhcnNlcnMgZG9uZSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uRW5kICgpIHtcbiAgICB0aGlzLl9wYXJzaW5nID0gZmFsc2VcbiAgICB0aGlzLmVtaXQoJ2RvbmUnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIExpc3RlbmVyIGZvciBhIHBhcnNlcnMgZXJyb3IgZXZlbnRcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkVycm9yIChlcnJvcikge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBSZXR1cm5zIGEgUmVhZFN0cmVhbSBmb3IgdGhlIFdBUkMgdG8gYmUgcGFyc2VkLlxuICAgKiBJZiB0aGUgV0FSQyBmaWxlIGlzIGd6aXBlZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCB0aGVcbiAgICogcmVzdWx0cyBvZiBgYFJlYWRTdHJlYW0ucGlwZSh6bGliLmNyZWF0ZUd1bnppcCgpKWBgXG4gICAqIEByZXR1cm5zIHtSZWFkU3RyZWFtfEd1bnppcH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXRTdHJlYW0gKCkge1xuICAgIGNvbnN0IGlzR3ogPSBHemlwRGV0ZWN0b3IuaXNHemlwcGVkU3luYyh0aGlzLl93cClcbiAgICBjb25zdCBzdHJlYW0gPSBnZXRTdHJlYW0odGhpcy5fd3AsIHRydWUpXG4gICAgaWYgKGlzR3opIHJldHVybiBzdHJlYW0ucGlwZSh6bGliLmNyZWF0ZUd1bnppcCgpKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtBdXRvV0FSQ1BhcnNlcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBBdXRvV0FSQ1BhcnNlclxuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayhcbiAgICAgIHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aClcbiAgICApKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBjb3B5QnVmZmVyKHNyYywgdGFyZ2V0LCBvZmZzZXQpIHtcbiAgc3JjLmNvcHkodGFyZ2V0LCBvZmZzZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyTGlzdCk7XG5cbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2godikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogbnVsbCB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiB1bnNoaWZ0KHYpIHtcbiAgICB2YXIgZW50cnkgPSB7IGRhdGE6IHYsIG5leHQ6IHRoaXMuaGVhZCB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7ZWxzZSB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgICAtLXRoaXMubGVuZ3RoO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihzKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgICB9cmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQobikge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLmhlYWQuZGF0YTtcbiAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4gPj4+IDApO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAocCkge1xuICAgICAgY29weUJ1ZmZlcihwLmRhdGEsIHJldCwgaSk7XG4gICAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgICBwID0gcC5uZXh0O1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIHJldHVybiBCdWZmZXJMaXN0O1xufSgpO1xuXG5pZiAodXRpbCAmJiB1dGlsLmluc3BlY3QgJiYgdXRpbC5pbnNwZWN0LmN1c3RvbSkge1xuICBtb2R1bGUuZXhwb3J0cy5wcm90b3R5cGVbdXRpbC5pbnNwZWN0LmN1c3RvbV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9iaiA9IHV0aWwuaW5zcGVjdCh7IGxlbmd0aDogdGhpcy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSArICcgJyArIG9iajtcbiAgfTtcbn0iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3JlYWRhYmxlJykuVHJhbnNmb3JtXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKS5QYXNzVGhyb3VnaFxuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50IGNhbWVsY2FzZTogXCJvZmZcIiAqL1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5cbnZhciBac3RyZWFtID0gcmVxdWlyZSgncGFrby9saWIvemxpYi96c3RyZWFtJyk7XG52YXIgemxpYl9kZWZsYXRlID0gcmVxdWlyZSgncGFrby9saWIvemxpYi9kZWZsYXRlLmpzJyk7XG52YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZSgncGFrby9saWIvemxpYi9pbmZsYXRlLmpzJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgncGFrby9saWIvemxpYi9jb25zdGFudHMnKTtcblxuZm9yICh2YXIga2V5IGluIGNvbnN0YW50cykge1xuICBleHBvcnRzW2tleV0gPSBjb25zdGFudHNba2V5XTtcbn1cblxuLy8gemxpYiBtb2Rlc1xuZXhwb3J0cy5OT05FID0gMDtcbmV4cG9ydHMuREVGTEFURSA9IDE7XG5leHBvcnRzLklORkxBVEUgPSAyO1xuZXhwb3J0cy5HWklQID0gMztcbmV4cG9ydHMuR1VOWklQID0gNDtcbmV4cG9ydHMuREVGTEFURVJBVyA9IDU7XG5leHBvcnRzLklORkxBVEVSQVcgPSA2O1xuZXhwb3J0cy5VTlpJUCA9IDc7XG5cbnZhciBHWklQX0hFQURFUl9JRDEgPSAweDFmO1xudmFyIEdaSVBfSEVBREVSX0lEMiA9IDB4OGI7XG5cbi8qKlxuICogRW11bGF0ZSBOb2RlJ3MgemxpYiBDKysgbGF5ZXIgZm9yIHVzZSBieSB0aGUgSlMgbGF5ZXIgaW4gaW5kZXguanNcbiAqL1xuZnVuY3Rpb24gWmxpYihtb2RlKSB7XG4gIGlmICh0eXBlb2YgbW9kZSAhPT0gJ251bWJlcicgfHwgbW9kZSA8IGV4cG9ydHMuREVGTEFURSB8fCBtb2RlID4gZXhwb3J0cy5VTlpJUCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JhZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgdGhpcy5kaWN0aW9uYXJ5ID0gbnVsbDtcbiAgdGhpcy5lcnIgPSAwO1xuICB0aGlzLmZsdXNoID0gMDtcbiAgdGhpcy5pbml0X2RvbmUgPSBmYWxzZTtcbiAgdGhpcy5sZXZlbCA9IDA7XG4gIHRoaXMubWVtTGV2ZWwgPSAwO1xuICB0aGlzLm1vZGUgPSBtb2RlO1xuICB0aGlzLnN0cmF0ZWd5ID0gMDtcbiAgdGhpcy53aW5kb3dCaXRzID0gMDtcbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlO1xuICB0aGlzLnBlbmRpbmdfY2xvc2UgPSBmYWxzZTtcbiAgdGhpcy5nemlwX2lkX2J5dGVzX3JlYWQgPSAwO1xufVxuXG5abGliLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MpIHtcbiAgICB0aGlzLnBlbmRpbmdfY2xvc2UgPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMucGVuZGluZ19jbG9zZSA9IGZhbHNlO1xuXG4gIGFzc2VydCh0aGlzLmluaXRfZG9uZSwgJ2Nsb3NlIGJlZm9yZSBpbml0Jyk7XG4gIGFzc2VydCh0aGlzLm1vZGUgPD0gZXhwb3J0cy5VTlpJUCk7XG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gZXhwb3J0cy5ERUZMQVRFIHx8IHRoaXMubW9kZSA9PT0gZXhwb3J0cy5HWklQIHx8IHRoaXMubW9kZSA9PT0gZXhwb3J0cy5ERUZMQVRFUkFXKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09IGV4cG9ydHMuSU5GTEFURSB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuR1VOWklQIHx8IHRoaXMubW9kZSA9PT0gZXhwb3J0cy5JTkZMQVRFUkFXIHx8IHRoaXMubW9kZSA9PT0gZXhwb3J0cy5VTlpJUCkge1xuICAgIHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gIH1cblxuICB0aGlzLm1vZGUgPSBleHBvcnRzLk5PTkU7XG5cbiAgdGhpcy5kaWN0aW9uYXJ5ID0gbnVsbDtcbn07XG5cblpsaWIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGZsdXNoLCBpbnB1dCwgaW5fb2ZmLCBpbl9sZW4sIG91dCwgb3V0X29mZiwgb3V0X2xlbikge1xuICByZXR1cm4gdGhpcy5fd3JpdGUodHJ1ZSwgZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKTtcbn07XG5cblpsaWIucHJvdG90eXBlLndyaXRlU3luYyA9IGZ1bmN0aW9uIChmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pIHtcbiAgcmV0dXJuIHRoaXMuX3dyaXRlKGZhbHNlLCBmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGFzeW5jLCBmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pIHtcbiAgYXNzZXJ0LmVxdWFsKGFyZ3VtZW50cy5sZW5ndGgsIDgpO1xuXG4gIGFzc2VydCh0aGlzLmluaXRfZG9uZSwgJ3dyaXRlIGJlZm9yZSBpbml0Jyk7XG4gIGFzc2VydCh0aGlzLm1vZGUgIT09IGV4cG9ydHMuTk9ORSwgJ2FscmVhZHkgZmluYWxpemVkJyk7XG4gIGFzc2VydC5lcXVhbChmYWxzZSwgdGhpcy53cml0ZV9pbl9wcm9ncmVzcywgJ3dyaXRlIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgYXNzZXJ0LmVxdWFsKGZhbHNlLCB0aGlzLnBlbmRpbmdfY2xvc2UsICdjbG9zZSBpcyBwZW5kaW5nJyk7XG5cbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IHRydWU7XG5cbiAgYXNzZXJ0LmVxdWFsKGZhbHNlLCBmbHVzaCA9PT0gdW5kZWZpbmVkLCAnbXVzdCBwcm92aWRlIGZsdXNoIHZhbHVlJyk7XG5cbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IHRydWU7XG5cbiAgaWYgKGZsdXNoICE9PSBleHBvcnRzLlpfTk9fRkxVU0ggJiYgZmx1c2ggIT09IGV4cG9ydHMuWl9QQVJUSUFMX0ZMVVNIICYmIGZsdXNoICE9PSBleHBvcnRzLlpfU1lOQ19GTFVTSCAmJiBmbHVzaCAhPT0gZXhwb3J0cy5aX0ZVTExfRkxVU0ggJiYgZmx1c2ggIT09IGV4cG9ydHMuWl9GSU5JU0ggJiYgZmx1c2ggIT09IGV4cG9ydHMuWl9CTE9DSykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmbHVzaCB2YWx1ZScpO1xuICB9XG5cbiAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICBpbnB1dCA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICBpbl9sZW4gPSAwO1xuICAgIGluX29mZiA9IDA7XG4gIH1cblxuICB0aGlzLnN0cm0uYXZhaWxfaW4gPSBpbl9sZW47XG4gIHRoaXMuc3RybS5pbnB1dCA9IGlucHV0O1xuICB0aGlzLnN0cm0ubmV4dF9pbiA9IGluX29mZjtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IG91dF9sZW47XG4gIHRoaXMuc3RybS5vdXRwdXQgPSBvdXQ7XG4gIHRoaXMuc3RybS5uZXh0X291dCA9IG91dF9vZmY7XG4gIHRoaXMuZmx1c2ggPSBmbHVzaDtcblxuICBpZiAoIWFzeW5jKSB7XG4gICAgLy8gc3luYyB2ZXJzaW9uXG4gICAgdGhpcy5fcHJvY2VzcygpO1xuXG4gICAgaWYgKHRoaXMuX2NoZWNrRXJyb3IoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyU3luYygpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhc3luYyB2ZXJzaW9uXG4gIHZhciBzZWxmID0gdGhpcztcbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fcHJvY2VzcygpO1xuICAgIHNlbGYuX2FmdGVyKCk7XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX2FmdGVyU3luYyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGF2YWlsX291dCA9IHRoaXMuc3RybS5hdmFpbF9vdXQ7XG4gIHZhciBhdmFpbF9pbiA9IHRoaXMuc3RybS5hdmFpbF9pbjtcblxuICB0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG5cbiAgcmV0dXJuIFthdmFpbF9pbiwgYXZhaWxfb3V0XTtcbn07XG5cblpsaWIucHJvdG90eXBlLl9wcm9jZXNzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZSA9IG51bGw7XG5cbiAgLy8gSWYgdGhlIGF2YWlsX291dCBpcyBsZWZ0IGF0IDAsIHRoZW4gaXQgbWVhbnMgdGhhdCBpdCByYW4gb3V0XG4gIC8vIG9mIHJvb20uICBJZiB0aGVyZSB3YXMgYXZhaWxfb3V0IGxlZnQgb3ZlciwgdGhlbiBpdCBtZWFuc1xuICAvLyB0aGF0IGFsbCBvZiB0aGUgaW5wdXQgd2FzIGNvbnN1bWVkLlxuICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFOlxuICAgIGNhc2UgZXhwb3J0cy5HWklQOlxuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFUkFXOlxuICAgICAgdGhpcy5lcnIgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZSh0aGlzLnN0cm0sIHRoaXMuZmx1c2gpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBleHBvcnRzLlVOWklQOlxuICAgICAgaWYgKHRoaXMuc3RybS5hdmFpbF9pbiA+IDApIHtcbiAgICAgICAgbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZSA9IHRoaXMuc3RybS5uZXh0X2luO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHRoaXMuZ3ppcF9pZF9ieXRlc19yZWFkKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAobmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuc3RybS5pbnB1dFtuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlXSA9PT0gR1pJUF9IRUFERVJfSUQxKSB7XG4gICAgICAgICAgICB0aGlzLmd6aXBfaWRfYnl0ZXNfcmVhZCA9IDE7XG4gICAgICAgICAgICBuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlKys7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnN0cm0uYXZhaWxfaW4gPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgYXZhaWxhYmxlIGJ5dGUgd2FzIGFscmVhZHkgcmVhZC5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IGV4cG9ydHMuSU5GTEFURTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKG5leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnN0cm0uaW5wdXRbbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZV0gPT09IEdaSVBfSEVBREVSX0lEMikge1xuICAgICAgICAgICAgdGhpcy5nemlwX2lkX2J5dGVzX3JlYWQgPSAyO1xuICAgICAgICAgICAgdGhpcy5tb2RlID0gZXhwb3J0cy5HVU5aSVA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGFjdHVhbCBkaWZmZXJlbmNlIGJldHdlZW4gSU5GTEFURSBhbmQgSU5GTEFURVJBV1xuICAgICAgICAgICAgLy8gKGFmdGVyIGluaXRpYWxpemF0aW9uKS5cbiAgICAgICAgICAgIHRoaXMubW9kZSA9IGV4cG9ydHMuSU5GTEFURTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbnVtYmVyIG9mIGd6aXAgbWFnaWMgbnVtYmVyIGJ5dGVzIHJlYWQnKTtcbiAgICAgIH1cblxuICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgY2FzZSBleHBvcnRzLklORkxBVEU6XG4gICAgY2FzZSBleHBvcnRzLkdVTlpJUDpcbiAgICBjYXNlIGV4cG9ydHMuSU5GTEFURVJBVzpcbiAgICAgIHRoaXMuZXJyID0gemxpYl9pbmZsYXRlLmluZmxhdGUodGhpcy5zdHJtLCB0aGlzLmZsdXNoXG5cbiAgICAgIC8vIElmIGRhdGEgd2FzIGVuY29kZWQgd2l0aCBkaWN0aW9uYXJ5XG4gICAgICApO2lmICh0aGlzLmVyciA9PT0gZXhwb3J0cy5aX05FRURfRElDVCAmJiB0aGlzLmRpY3Rpb25hcnkpIHtcbiAgICAgICAgLy8gTG9hZCBpdFxuICAgICAgICB0aGlzLmVyciA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIHRoaXMuZGljdGlvbmFyeSk7XG4gICAgICAgIGlmICh0aGlzLmVyciA9PT0gZXhwb3J0cy5aX09LKSB7XG4gICAgICAgICAgLy8gQW5kIHRyeSB0byBkZWNvZGUgYWdhaW5cbiAgICAgICAgICB0aGlzLmVyciA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHRoaXMuc3RybSwgdGhpcy5mbHVzaCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lcnIgPT09IGV4cG9ydHMuWl9EQVRBX0VSUk9SKSB7XG4gICAgICAgICAgLy8gQm90aCBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGFuZCBpbmZsYXRlKCkgcmV0dXJuIFpfREFUQV9FUlJPUi5cbiAgICAgICAgICAvLyBNYWtlIGl0IHBvc3NpYmxlIGZvciBBZnRlcigpIHRvIHRlbGwgYSBiYWQgZGljdGlvbmFyeSBmcm9tIGJhZFxuICAgICAgICAgIC8vIGlucHV0LlxuICAgICAgICAgIHRoaXMuZXJyID0gZXhwb3J0cy5aX05FRURfRElDVDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKHRoaXMuc3RybS5hdmFpbF9pbiA+IDAgJiYgdGhpcy5tb2RlID09PSBleHBvcnRzLkdVTlpJUCAmJiB0aGlzLmVyciA9PT0gZXhwb3J0cy5aX1NUUkVBTV9FTkQgJiYgdGhpcy5zdHJtLm5leHRfaW5bMF0gIT09IDB4MDApIHtcbiAgICAgICAgLy8gQnl0ZXMgcmVtYWluIGluIGlucHV0IGJ1ZmZlci4gUGVyaGFwcyB0aGlzIGlzIGFub3RoZXIgY29tcHJlc3NlZFxuICAgICAgICAvLyBtZW1iZXIgaW4gdGhlIHNhbWUgYXJjaGl2ZSwgb3IganVzdCB0cmFpbGluZyBnYXJiYWdlLlxuICAgICAgICAvLyBUcmFpbGluZyB6ZXJvIGJ5dGVzIGFyZSBva2F5LCB0aG91Z2gsIHNpbmNlIHRoZXkgYXJlIGZyZXF1ZW50bHlcbiAgICAgICAgLy8gdXNlZCBmb3IgcGFkZGluZy5cblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZXJyID0gemxpYl9pbmZsYXRlLmluZmxhdGUodGhpcy5zdHJtLCB0aGlzLmZsdXNoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbW9kZSAnICsgdGhpcy5tb2RlKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUuX2NoZWNrRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIEFjY2VwdGFibGUgZXJyb3Igc3RhdGVzIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB6bGliIHN0cmVhbS5cbiAgc3dpdGNoICh0aGlzLmVycikge1xuICAgIGNhc2UgZXhwb3J0cy5aX09LOlxuICAgIGNhc2UgZXhwb3J0cy5aX0JVRl9FUlJPUjpcbiAgICAgIGlmICh0aGlzLnN0cm0uYXZhaWxfb3V0ICE9PSAwICYmIHRoaXMuZmx1c2ggPT09IGV4cG9ydHMuWl9GSU5JU0gpIHtcbiAgICAgICAgdGhpcy5fZXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBleHBvcnRzLlpfU1RSRUFNX0VORDpcbiAgICAgIC8vIG5vcm1hbCBzdGF0dXNlcywgbm90IGZhdGFsXG4gICAgICBicmVhaztcbiAgICBjYXNlIGV4cG9ydHMuWl9ORUVEX0RJQ1Q6XG4gICAgICBpZiAodGhpcy5kaWN0aW9uYXJ5ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fZXJyb3IoJ01pc3NpbmcgZGljdGlvbmFyeScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZXJyb3IoJ0JhZCBkaWN0aW9uYXJ5Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHNvbWV0aGluZyBlbHNlLlxuICAgICAgdGhpcy5fZXJyb3IoJ1psaWIgZXJyb3InKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX2FmdGVyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuX2NoZWNrRXJyb3IoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBhdmFpbF9vdXQgPSB0aGlzLnN0cm0uYXZhaWxfb3V0O1xuICB2YXIgYXZhaWxfaW4gPSB0aGlzLnN0cm0uYXZhaWxfaW47XG5cbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlO1xuXG4gIC8vIGNhbGwgdGhlIHdyaXRlKCkgY2JcbiAgdGhpcy5jYWxsYmFjayhhdmFpbF9pbiwgYXZhaWxfb3V0KTtcblxuICBpZiAodGhpcy5wZW5kaW5nX2Nsb3NlKSB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG59O1xuXG5abGliLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICBpZiAodGhpcy5zdHJtLm1zZykge1xuICAgIG1lc3NhZ2UgPSB0aGlzLnN0cm0ubXNnO1xuICB9XG4gIHRoaXMub25lcnJvcihtZXNzYWdlLCB0aGlzLmVyclxuXG4gIC8vIG5vIGhvcGUgb2YgcmVzY3VlLlxuICApO3RoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTtcbiAgaWYgKHRoaXMucGVuZGluZ19jbG9zZSkge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICh3aW5kb3dCaXRzLCBsZXZlbCwgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBkaWN0aW9uYXJ5KSB7XG4gIGFzc2VydChhcmd1bWVudHMubGVuZ3RoID09PSA0IHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDUsICdpbml0KHdpbmRvd0JpdHMsIGxldmVsLCBtZW1MZXZlbCwgc3RyYXRlZ3ksIFtkaWN0aW9uYXJ5XSknKTtcblxuICBhc3NlcnQod2luZG93Qml0cyA+PSA4ICYmIHdpbmRvd0JpdHMgPD0gMTUsICdpbnZhbGlkIHdpbmRvd0JpdHMnKTtcbiAgYXNzZXJ0KGxldmVsID49IC0xICYmIGxldmVsIDw9IDksICdpbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsJyk7XG5cbiAgYXNzZXJ0KG1lbUxldmVsID49IDEgJiYgbWVtTGV2ZWwgPD0gOSwgJ2ludmFsaWQgbWVtbGV2ZWwnKTtcblxuICBhc3NlcnQoc3RyYXRlZ3kgPT09IGV4cG9ydHMuWl9GSUxURVJFRCB8fCBzdHJhdGVneSA9PT0gZXhwb3J0cy5aX0hVRkZNQU5fT05MWSB8fCBzdHJhdGVneSA9PT0gZXhwb3J0cy5aX1JMRSB8fCBzdHJhdGVneSA9PT0gZXhwb3J0cy5aX0ZJWEVEIHx8IHN0cmF0ZWd5ID09PSBleHBvcnRzLlpfREVGQVVMVF9TVFJBVEVHWSwgJ2ludmFsaWQgc3RyYXRlZ3knKTtcblxuICB0aGlzLl9pbml0KGxldmVsLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksIGRpY3Rpb25hcnkpO1xuICB0aGlzLl9zZXREaWN0aW9uYXJ5KCk7XG59O1xuXG5abGliLnByb3RvdHlwZS5wYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IG5ldyBFcnJvcignZGVmbGF0ZVBhcmFtcyBOb3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5abGliLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fcmVzZXQoKTtcbiAgdGhpcy5fc2V0RGljdGlvbmFyeSgpO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAobGV2ZWwsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgZGljdGlvbmFyeSkge1xuICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIHRoaXMud2luZG93Qml0cyA9IHdpbmRvd0JpdHM7XG4gIHRoaXMubWVtTGV2ZWwgPSBtZW1MZXZlbDtcbiAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuXG4gIHRoaXMuZmx1c2ggPSBleHBvcnRzLlpfTk9fRkxVU0g7XG5cbiAgdGhpcy5lcnIgPSBleHBvcnRzLlpfT0s7XG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gZXhwb3J0cy5HWklQIHx8IHRoaXMubW9kZSA9PT0gZXhwb3J0cy5HVU5aSVApIHtcbiAgICB0aGlzLndpbmRvd0JpdHMgKz0gMTY7XG4gIH1cblxuICBpZiAodGhpcy5tb2RlID09PSBleHBvcnRzLlVOWklQKSB7XG4gICAgdGhpcy53aW5kb3dCaXRzICs9IDMyO1xuICB9XG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gZXhwb3J0cy5ERUZMQVRFUkFXIHx8IHRoaXMubW9kZSA9PT0gZXhwb3J0cy5JTkZMQVRFUkFXKSB7XG4gICAgdGhpcy53aW5kb3dCaXRzID0gLTEgKiB0aGlzLndpbmRvd0JpdHM7XG4gIH1cblxuICB0aGlzLnN0cm0gPSBuZXcgWnN0cmVhbSgpO1xuXG4gIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgY2FzZSBleHBvcnRzLkRFRkxBVEU6XG4gICAgY2FzZSBleHBvcnRzLkdaSVA6XG4gICAgY2FzZSBleHBvcnRzLkRFRkxBVEVSQVc6XG4gICAgICB0aGlzLmVyciA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLCB0aGlzLmxldmVsLCBleHBvcnRzLlpfREVGTEFURUQsIHRoaXMud2luZG93Qml0cywgdGhpcy5tZW1MZXZlbCwgdGhpcy5zdHJhdGVneSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGV4cG9ydHMuSU5GTEFURTpcbiAgICBjYXNlIGV4cG9ydHMuR1VOWklQOlxuICAgIGNhc2UgZXhwb3J0cy5JTkZMQVRFUkFXOlxuICAgIGNhc2UgZXhwb3J0cy5VTlpJUDpcbiAgICAgIHRoaXMuZXJyID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sIHRoaXMud2luZG93Qml0cyk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGUgJyArIHRoaXMubW9kZSk7XG4gIH1cblxuICBpZiAodGhpcy5lcnIgIT09IGV4cG9ydHMuWl9PSykge1xuICAgIHRoaXMuX2Vycm9yKCdJbml0IGVycm9yJyk7XG4gIH1cblxuICB0aGlzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5O1xuXG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTtcbiAgdGhpcy5pbml0X2RvbmUgPSB0cnVlO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX3NldERpY3Rpb25hcnkgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmRpY3Rpb25hcnkgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuZXJyID0gZXhwb3J0cy5aX09LO1xuXG4gIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgY2FzZSBleHBvcnRzLkRFRkxBVEU6XG4gICAgY2FzZSBleHBvcnRzLkRFRkxBVEVSQVc6XG4gICAgICB0aGlzLmVyciA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIHRoaXMuZGljdGlvbmFyeSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICBpZiAodGhpcy5lcnIgIT09IGV4cG9ydHMuWl9PSykge1xuICAgIHRoaXMuX2Vycm9yKCdGYWlsZWQgdG8gc2V0IGRpY3Rpb25hcnknKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVyciA9IGV4cG9ydHMuWl9PSztcblxuICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFOlxuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFUkFXOlxuICAgIGNhc2UgZXhwb3J0cy5HWklQOlxuICAgICAgdGhpcy5lcnIgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVJlc2V0KHRoaXMuc3RybSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGV4cG9ydHMuSU5GTEFURTpcbiAgICBjYXNlIGV4cG9ydHMuSU5GTEFURVJBVzpcbiAgICBjYXNlIGV4cG9ydHMuR1VOWklQOlxuICAgICAgdGhpcy5lcnIgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVJlc2V0KHRoaXMuc3RybSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICBpZiAodGhpcy5lcnIgIT09IGV4cG9ydHMuWl9PSykge1xuICAgIHRoaXMuX2Vycm9yKCdGYWlsZWQgdG8gcmVzZXQgc3RyZWFtJyk7XG4gIH1cbn07XG5cbmV4cG9ydHMuWmxpYiA9IFpsaWI7IiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLyogZXNsaW50LWRpc2FibGUgc3BhY2UtdW5hcnktb3BzICovXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vL3ZhciBaX0ZJTFRFUkVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfSFVGRk1BTl9PTkxZICAgICAgPSAyO1xuLy92YXIgWl9STEUgICAgICAgICAgICAgICA9IDM7XG52YXIgWl9GSVhFRCAgICAgICAgICAgICAgID0gNDtcbi8vdmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgPSAwO1xuXG4vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG52YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbnZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICA9IDE7IC8vID0gWl9URVhUXG52YXIgWl9VTktOT1dOICAgICAgICAgICAgID0gMjtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuLy8gRnJvbSB6dXRpbC5oXG5cbnZhciBTVE9SRURfQkxPQ0sgPSAwO1xudmFyIFNUQVRJQ19UUkVFUyA9IDE7XG52YXIgRFlOX1RSRUVTICAgID0gMjtcbi8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovXG5cbnZhciBNSU5fTUFUQ0ggICAgPSAzO1xudmFyIE1BWF9NQVRDSCAgICA9IDI1ODtcbi8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi9cblxuLy8gRnJvbSBkZWZsYXRlLmhcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuXG4gKi9cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xuXG52YXIgTElURVJBTFMgICAgICA9IDI1Njtcbi8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqL1xuXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xuXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG5cbnZhciBCTF9DT0RFUyAgICAgID0gMTk7XG4vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi9cblxudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xuXG52YXIgTUFYX0JJVFMgICAgICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBCdWZfc2l6ZSAgICAgID0gMTY7XG4vKiBzaXplIG9mIGJpdCBidWZmZXIgaW4gYmlfYnVmICovXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdGFudHNcbiAqL1xuXG52YXIgTUFYX0JMX0JJVFMgPSA3O1xuLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqL1xuXG52YXIgRU5EX0JMT0NLICAgPSAyNTY7XG4vKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovXG5cbnZhciBSRVBfM182ICAgICA9IDE2O1xuLyogcmVwZWF0IHByZXZpb3VzIGJpdCBsZW5ndGggMy02IHRpbWVzICgyIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8zXzEwICAgPSAxNztcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8xMV8xMzggPSAxODtcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbi8qIGVzbGludC1kaXNhYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG52YXIgZXh0cmFfbGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF07XG5cbnZhciBleHRyYV9kYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBkaXN0YW5jZSBjb2RlICovXG4gIFswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXTtcblxudmFyIGV4dHJhX2JsYml0cyA9ICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN107XG5cbnZhciBibF9vcmRlciA9XG4gIFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtcbi8qIGVzbGludC1lbmFibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cblxuLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZ1xuICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuXG4gKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBMb2NhbCBkYXRhLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlLlxuICovXG5cbi8vIFdlIHByZS1maWxsIGFycmF5cyB3aXRoIDAgdG8gYXZvaWQgdW5pbml0aWFsaXplZCBnYXBzXG5cbnZhciBESVNUX0NPREVfTEVOID0gNTEyOyAvKiBzZWUgZGVmaW5pdGlvbiBvZiBhcnJheSBkaXN0X2NvZGUgYmVsb3cgKi9cblxuLy8gISEhISBVc2UgZmxhdCBhcnJheSBpbnN0ZWFkIG9mIHN0cnVjdHVyZSwgRnJlcSA9IGkqMiwgTGVuID0gaSoyKzFcbnZhciBzdGF0aWNfbHRyZWUgID0gbmV3IEFycmF5KChMX0NPREVTICsgMikgKiAyKTtcbnplcm8oc3RhdGljX2x0cmVlKTtcbi8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vXG4gKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlclxuICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0XG4gKiBiZWxvdykuXG4gKi9cblxudmFyIHN0YXRpY19kdHJlZSAgPSBuZXcgQXJyYXkoRF9DT0RFUyAqIDIpO1xuemVybyhzdGF0aWNfZHRyZWUpO1xuLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlLiAoQWN0dWFsbHkgYSB0cml2aWFsIHRyZWUgc2luY2UgYWxsIGNvZGVzIHVzZVxuICogNSBiaXRzLilcbiAqL1xuXG52YXIgX2Rpc3RfY29kZSAgICA9IG5ldyBBcnJheShESVNUX0NPREVfTEVOKTtcbnplcm8oX2Rpc3RfY29kZSk7XG4vKiBEaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzXG4gKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mXG4gKiB0aGUgMTUgYml0IGRpc3RhbmNlcy5cbiAqL1xuXG52YXIgX2xlbmd0aF9jb2RlICA9IG5ldyBBcnJheShNQVhfTUFUQ0ggLSBNSU5fTUFUQ0ggKyAxKTtcbnplcm8oX2xlbmd0aF9jb2RlKTtcbi8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfbGVuZ3RoICAgPSBuZXcgQXJyYXkoTEVOR1RIX0NPREVTKTtcbnplcm8oYmFzZV9sZW5ndGgpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfZGlzdCAgICAgPSBuZXcgQXJyYXkoRF9DT0RFUyk7XG56ZXJvKGJhc2VfZGlzdCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqL1xuXG5cbmZ1bmN0aW9uIFN0YXRpY1RyZWVEZXNjKHN0YXRpY190cmVlLCBleHRyYV9iaXRzLCBleHRyYV9iYXNlLCBlbGVtcywgbWF4X2xlbmd0aCkge1xuXG4gIHRoaXMuc3RhdGljX3RyZWUgID0gc3RhdGljX3RyZWU7ICAvKiBzdGF0aWMgdHJlZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYml0cyAgID0gZXh0cmFfYml0czsgICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGNvZGUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2Jhc2UgICA9IGV4dHJhX2Jhc2U7ICAgLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqL1xuICB0aGlzLmVsZW1zICAgICAgICA9IGVsZW1zOyAgICAgICAgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHJlZSAqL1xuICB0aGlzLm1heF9sZW5ndGggICA9IG1heF9sZW5ndGg7ICAgLyogbWF4IGJpdCBsZW5ndGggZm9yIHRoZSBjb2RlcyAqL1xuXG4gIC8vIHNob3cgaWYgYHN0YXRpY190cmVlYCBoYXMgZGF0YSBvciBkdW1teSAtIG5lZWRlZCBmb3IgbW9ub21vcnBoaWMgb2JqZWN0c1xuICB0aGlzLmhhc19zdHJlZSAgICA9IHN0YXRpY190cmVlICYmIHN0YXRpY190cmVlLmxlbmd0aDtcbn1cblxuXG52YXIgc3RhdGljX2xfZGVzYztcbnZhciBzdGF0aWNfZF9kZXNjO1xudmFyIHN0YXRpY19ibF9kZXNjO1xuXG5cbmZ1bmN0aW9uIFRyZWVEZXNjKGR5bl90cmVlLCBzdGF0X2Rlc2MpIHtcbiAgdGhpcy5keW5fdHJlZSA9IGR5bl90cmVlOyAgICAgLyogdGhlIGR5bmFtaWMgdHJlZSAqL1xuICB0aGlzLm1heF9jb2RlID0gMDsgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdGhpcy5zdGF0X2Rlc2MgPSBzdGF0X2Rlc2M7ICAgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi9cbn1cblxuXG5cbmZ1bmN0aW9uIGRfY29kZShkaXN0KSB7XG4gIHJldHVybiBkaXN0IDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2ICsgKGRpc3QgPj4+IDcpXTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE91dHB1dCBhIHNob3J0IExTQiBmaXJzdCBvbiB0aGUgc3RyZWFtLlxuICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nQnVmLlxuICovXG5mdW5jdGlvbiBwdXRfc2hvcnQocywgdykge1xuLy8gICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpO1xuLy8gICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcgPj4+IDgpICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLlxuICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSB7XG4gIGlmIChzLmJpX3ZhbGlkID4gKEJ1Zl9zaXplIC0gbGVuZ3RoKSkge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gdmFsdWUgPj4gKEJ1Zl9zaXplIC0gcy5iaV92YWxpZCk7XG4gICAgcy5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTtcbiAgfSBlbHNlIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcy5iaV92YWxpZCArPSBsZW5ndGg7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzZW5kX2NvZGUocywgYywgdHJlZSkge1xuICBzZW5kX2JpdHMocywgdHJlZVtjICogMl0vKi5Db2RlKi8sIHRyZWVbYyAqIDIgKyAxXS8qLkxlbiovKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyXG4gKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpXG4gKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1XG4gKi9cbmZ1bmN0aW9uIGJpX3JldmVyc2UoY29kZSwgbGVuKSB7XG4gIHZhciByZXMgPSAwO1xuICBkbyB7XG4gICAgcmVzIHw9IGNvZGUgJiAxO1xuICAgIGNvZGUgPj4+PSAxO1xuICAgIHJlcyA8PD0gMTtcbiAgfSB3aGlsZSAoLS1sZW4gPiAwKTtcbiAgcmV0dXJuIHJlcyA+Pj4gMTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LlxuICovXG5mdW5jdGlvbiBiaV9mbHVzaChzKSB7XG4gIGlmIChzLmJpX3ZhbGlkID09PSAxNikge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSAwO1xuICAgIHMuYmlfdmFsaWQgPSAwO1xuXG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+PSA4KSB7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZiAmIDB4ZmY7XG4gICAgcy5iaV9idWYgPj49IDg7XG4gICAgcy5iaV92YWxpZCAtPSA4O1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aFxuICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmRcbiAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlXG4gKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguXG4gKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzXG4gKiAgICAgbm90IG51bGwuXG4gKi9cbmZ1bmN0aW9uIGdlbl9iaXRsZW4ocywgZGVzYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB0cmVlX2Rlc2MgKmRlc2M7ICAgIC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi9cbntcbiAgdmFyIHRyZWUgICAgICAgICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBtYXhfY29kZSAgICAgICAgPSBkZXNjLm1heF9jb2RlO1xuICB2YXIgc3RyZWUgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBleHRyYSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iaXRzO1xuICB2YXIgYmFzZSAgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYmFzZTtcbiAgdmFyIG1heF9sZW5ndGggICAgICA9IGRlc2Muc3RhdF9kZXNjLm1heF9sZW5ndGg7XG4gIHZhciBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqL1xuICB2YXIgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi9cbiAgdmFyIHhiaXRzOyAgICAgICAgICAvKiBleHRyYSBiaXRzICovXG4gIHZhciBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovXG4gIHZhciBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi9cblxuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBzLmJsX2NvdW50W2JpdHNdID0gMDtcbiAgfVxuXG4gIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5XG4gICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLlxuICAgKi9cbiAgdHJlZVtzLmhlYXBbcy5oZWFwX21heF0gKiAyICsgMV0vKi5MZW4qLyA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi9cblxuICBmb3IgKGggPSBzLmhlYXBfbWF4ICsgMTsgaCA8IEhFQVBfU0laRTsgaCsrKSB7XG4gICAgbiA9IHMuaGVhcFtoXTtcbiAgICBiaXRzID0gdHJlZVt0cmVlW24gKiAyICsgMV0vKi5EYWQqLyAqIDIgKyAxXS8qLkxlbiovICsgMTtcbiAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIHtcbiAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoO1xuICAgICAgb3ZlcmZsb3crKztcbiAgICB9XG4gICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovXG5cbiAgICBpZiAobiA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9IC8qIG5vdCBhIGxlYWYgbm9kZSAqL1xuXG4gICAgcy5ibF9jb3VudFtiaXRzXSsrO1xuICAgIHhiaXRzID0gMDtcbiAgICBpZiAobiA+PSBiYXNlKSB7XG4gICAgICB4Yml0cyA9IGV4dHJhW24gLSBiYXNlXTtcbiAgICB9XG4gICAgZiA9IHRyZWVbbiAqIDJdLyouRnJlcSovO1xuICAgIHMub3B0X2xlbiArPSBmICogKGJpdHMgKyB4Yml0cyk7XG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuICs9IGYgKiAoc3RyZWVbbiAqIDIgKyAxXS8qLkxlbiovICsgeGJpdHMpO1xuICAgIH1cbiAgfVxuICBpZiAob3ZlcmZsb3cgPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgLy8gVHJhY2UoKHN0ZGVycixcIlxcbmJpdCBsZW5ndGggb3ZlcmZsb3dcXG5cIikpO1xuICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqL1xuXG4gIC8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovXG4gIGRvIHtcbiAgICBiaXRzID0gbWF4X2xlbmd0aCAtIDE7XG4gICAgd2hpbGUgKHMuYmxfY291bnRbYml0c10gPT09IDApIHsgYml0cy0tOyB9XG4gICAgcy5ibF9jb3VudFtiaXRzXS0tOyAgICAgIC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqL1xuICAgIHMuYmxfY291bnRbYml0cyArIDFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi9cbiAgICBzLmJsX2NvdW50W21heF9sZW5ndGhdLS07XG4gICAgLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCxcbiAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF1cbiAgICAgKi9cbiAgICBvdmVyZmxvdyAtPSAyO1xuICB9IHdoaWxlIChvdmVyZmxvdyA+IDApO1xuXG4gIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAgICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbFxuICAgKiBsZW5ndGhzIGluc3RlYWQgb2YgZml4aW5nIG9ubHkgdGhlIHdyb25nIG9uZXMuIFRoaXMgaWRlYSBpcyB0YWtlblxuICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLilcbiAgICovXG4gIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT09IDA7IGJpdHMtLSkge1xuICAgIG4gPSBzLmJsX2NvdW50W2JpdHNdO1xuICAgIHdoaWxlIChuICE9PSAwKSB7XG4gICAgICBtID0gcy5oZWFwWy0taF07XG4gICAgICBpZiAobSA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAodHJlZVttICogMiArIDFdLyouTGVuKi8gIT09IGJpdHMpIHtcbiAgICAgICAgLy8gVHJhY2UoKHN0ZGVycixcImNvZGUgJWQgYml0cyAlZC0+JWRcXG5cIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTtcbiAgICAgICAgcy5vcHRfbGVuICs9IChiaXRzIC0gdHJlZVttICogMiArIDFdLyouTGVuKi8pICogdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgICAgIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAgIH1cbiAgICAgIG4tLTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZVxuICogb3B0aW1hbCkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvclxuICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uXG4gKiAgICAgemVybyBjb2RlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudClcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgICAgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbi8vICAgIHVzaGYgKmJsX2NvdW50OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi9cbntcbiAgdmFyIG5leHRfY29kZSA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpOyAvKiBuZXh0IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqL1xuICB2YXIgY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgLyogYml0IGluZGV4ICovXG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgaW5kZXggKi9cblxuICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXNcbiAgICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuXG4gICAqL1xuICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzIC0gMV0pIDw8IDE7XG4gIH1cbiAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZVxuICAgKiBtdXN0IGJlIGFsbCBvbmVzLlxuICAgKi9cbiAgLy9Bc3NlcnQgKGNvZGUgKyBibF9jb3VudFtNQVhfQklUU10tMSA9PSAoMTw8TUFYX0JJVFMpLTEsXG4gIC8vICAgICAgICBcImluY29uc2lzdGVudCBiaXQgY291bnRzXCIpO1xuICAvL1RyYWNldigoc3RkZXJyLFwiXFxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCBcIiwgbWF4X2NvZGUpKTtcblxuICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgdmFyIGxlbiA9IHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovO1xuICAgIGlmIChsZW4gPT09IDApIHsgY29udGludWU7IH1cbiAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqL1xuICAgIHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pO1xuXG4gICAgLy9UcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLFwiXFxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSBcIixcbiAgICAvLyAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwgbGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy5cbiAqL1xuZnVuY3Rpb24gdHJfc3RhdGljX2luaXQoKSB7XG4gIHZhciBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgLyogYml0IGNvdW50ZXIgKi9cbiAgdmFyIGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi9cbiAgdmFyIGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovXG4gIHZhciBkaXN0OyAgICAgLyogZGlzdGFuY2UgaW5kZXggKi9cbiAgdmFyIGJsX2NvdW50ID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vIGRvIGNoZWNrIGluIF90cl9pbml0KClcbiAgLy9pZiAoc3RhdGljX2luaXRfZG9uZSkgcmV0dXJuO1xuXG4gIC8qIEZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdCBpbml0aWFsaXplZDogKi9cbi8qI2lmZGVmIE5PX0lOSVRfR0xPQkFMX1BPSU5URVJTXG4gIHN0YXRpY19sX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfbHRyZWU7XG4gIHN0YXRpY19sX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2xiaXRzO1xuICBzdGF0aWNfZF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2R0cmVlO1xuICBzdGF0aWNfZF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9kYml0cztcbiAgc3RhdGljX2JsX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2JsYml0cztcbiNlbmRpZiovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBsZW5ndGggKDAuLjI1NSkgLT4gbGVuZ3RoIGNvZGUgKDAuLjI4KSAqL1xuICBsZW5ndGggPSAwO1xuICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgTEVOR1RIX0NPREVTIC0gMTsgY29kZSsrKSB7XG4gICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGxlbmd0aCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTZcIik7XG4gIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkXG4gICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlXG4gICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzpcbiAgICovXG4gIF9sZW5ndGhfY29kZVtsZW5ndGggLSAxXSA9IGNvZGU7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovXG4gIGRpc3QgPSAwO1xuICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgMTY7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2XCIpO1xuICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi9cbiAgZm9yICg7IGNvZGUgPCBEX0NPREVTOyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IChleHRyYV9kYml0c1tjb2RlXSAtIDcpKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IDI1NitkaXN0ICE9IDUxMlwiKTtcblxuICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIGJsX2NvdW50W2JpdHNdID0gMDtcbiAgfVxuXG4gIG4gPSAwO1xuICB3aGlsZSAobiA8PSAxNDMpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gODtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOF0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNTUpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gOTtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOV0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNzkpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNztcbiAgICBuKys7XG4gICAgYmxfY291bnRbN10rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyODcpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gODtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOF0rKztcbiAgfVxuICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGVcbiAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2FsIEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlXG4gICAqIGFsbCBvbmVzKVxuICAgKi9cbiAgZ2VuX2NvZGVzKHN0YXRpY19sdHJlZSwgTF9DT0RFUyArIDEsIGJsX2NvdW50KTtcblxuICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi9cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykge1xuICAgIHN0YXRpY19kdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA1O1xuICAgIHN0YXRpY19kdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG4sIDUpO1xuICB9XG5cbiAgLy8gTm93IGRhdGEgcmVhZHkgYW5kIHdlIGNhbiBpbml0IHN0YXRpYyB0cmVlc1xuICBzdGF0aWNfbF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19sdHJlZSwgZXh0cmFfbGJpdHMsIExJVEVSQUxTICsgMSwgTF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfZF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2JsX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2MobmV3IEFycmF5KDApLCBleHRyYV9ibGJpdHMsIDAsICAgICAgICAgQkxfQ09ERVMsIE1BWF9CTF9CSVRTKTtcblxuICAvL3N0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay5cbiAqL1xuZnVuY3Rpb24gaW5pdF9ibG9jayhzKSB7XG4gIHZhciBuOyAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHsgcy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgeyBzLmR5bl9kdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSB7IHMuYmxfdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG5cbiAgcy5keW5fbHRyZWVbRU5EX0JMT0NLICogMl0vKi5GcmVxKi8gPSAxO1xuICBzLm9wdF9sZW4gPSBzLnN0YXRpY19sZW4gPSAwO1xuICBzLmxhc3RfbGl0ID0gcy5tYXRjaGVzID0gMDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeVxuICovXG5mdW5jdGlvbiBiaV93aW5kdXAocylcbntcbiAgaWYgKHMuYmlfdmFsaWQgPiA4KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID4gMCkge1xuICAgIC8vcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmO1xuICB9XG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSBhIHN0b3JlZCBibG9jaywgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHNcbiAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiBjb3B5X2Jsb2NrKHMsIGJ1ZiwgbGVuLCBoZWFkZXIpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi9cbi8vdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqL1xuLy9pbnQgICAgICBoZWFkZXI7ICAvKiB0cnVlIGlmIGJsb2NrIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gKi9cbntcbiAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqL1xuXG4gIGlmIChoZWFkZXIpIHtcbiAgICBwdXRfc2hvcnQocywgbGVuKTtcbiAgICBwdXRfc2hvcnQocywgfmxlbik7XG4gIH1cbi8vICB3aGlsZSAobGVuLS0pIHtcbi8vICAgIHB1dF9ieXRlKHMsICpidWYrKyk7XG4vLyAgfVxuICB1dGlscy5hcnJheVNldChzLnBlbmRpbmdfYnVmLCBzLndpbmRvdywgYnVmLCBsZW4sIHMucGVuZGluZyk7XG4gIHMucGVuZGluZyArPSBsZW47XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW5cbiAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSB7XG4gIHZhciBfbjIgPSBuICogMjtcbiAgdmFyIF9tMiA9IG0gKiAyO1xuICByZXR1cm4gKHRyZWVbX24yXS8qLkZyZXEqLyA8IHRyZWVbX20yXS8qLkZyZXEqLyB8fFxuICAgICAgICAgKHRyZWVbX24yXS8qLkZyZXEqLyA9PT0gdHJlZVtfbTJdLyouRnJlcSovICYmIGRlcHRoW25dIDw9IGRlcHRoW21dKSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBub2RlIGssXG4gKiBleGNoYW5naW5nIGEgbm9kZSB3aXRoIHRoZSBzbWFsbGVzdCBvZiBpdHMgdHdvIHNvbnMgaWYgbmVjZXNzYXJ5LCBzdG9wcGluZ1xuICogd2hlbiB0aGUgaGVhcCBwcm9wZXJ0eSBpcyByZS1lc3RhYmxpc2hlZCAoZWFjaCBmYXRoZXIgc21hbGxlciB0aGFuIGl0c1xuICogdHdvIHNvbnMpLlxuICovXG5mdW5jdGlvbiBwcWRvd25oZWFwKHMsIHRyZWUsIGspXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgIC8qIHRoZSB0cmVlIHRvIHJlc3RvcmUgKi9cbi8vICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovXG57XG4gIHZhciB2ID0gcy5oZWFwW2tdO1xuICB2YXIgaiA9IGsgPDwgMTsgIC8qIGxlZnQgc29uIG9mIGsgKi9cbiAgd2hpbGUgKGogPD0gcy5oZWFwX2xlbikge1xuICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovXG4gICAgaWYgKGogPCBzLmhlYXBfbGVuICYmXG4gICAgICBzbWFsbGVyKHRyZWUsIHMuaGVhcFtqICsgMV0sIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHtcbiAgICAgIGorKztcbiAgICB9XG4gICAgLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi9cbiAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7IGJyZWFrOyB9XG5cbiAgICAvKiBFeGNoYW5nZSB2IHdpdGggdGhlIHNtYWxsZXN0IHNvbiAqL1xuICAgIHMuaGVhcFtrXSA9IHMuaGVhcFtqXTtcbiAgICBrID0gajtcblxuICAgIC8qIEFuZCBjb250aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsgKi9cbiAgICBqIDw8PSAxO1xuICB9XG4gIHMuaGVhcFtrXSA9IHY7XG59XG5cblxuLy8gaW5saW5lZCBtYW51YWxseVxuLy8gdmFyIFNNQUxMRVNUID0gMTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXNcbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGNvbnN0IGN0X2RhdGEgKmx0cmVlOyAvKiBsaXRlcmFsIHRyZWUgKi9cbi8vICAgIGNvbnN0IGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovXG57XG4gIHZhciBkaXN0OyAgICAgICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi9cbiAgdmFyIGx4ID0gMDsgICAgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG4gIHZhciBjb2RlOyAgICAgICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqL1xuICB2YXIgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi9cblxuICBpZiAocy5sYXN0X2xpdCAhPT0gMCkge1xuICAgIGRvIHtcbiAgICAgIGRpc3QgPSAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyXSA8PCA4KSB8IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDIgKyAxXSk7XG4gICAgICBsYyA9IHMucGVuZGluZ19idWZbcy5sX2J1ZiArIGx4XTtcbiAgICAgIGx4Kys7XG5cbiAgICAgIGlmIChkaXN0ID09PSAwKSB7XG4gICAgICAgIHNlbmRfY29kZShzLCBsYywgbHRyZWUpOyAvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAgIC8vVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0ZGVycixcIiAnJWMnIFwiLCBsYykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqL1xuICAgICAgICBjb2RlID0gX2xlbmd0aF9jb2RlW2xjXTtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUgKyBMSVRFUkFMUyArIDEsIGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovXG4gICAgICAgIH1cbiAgICAgICAgZGlzdC0tOyAvKiBkaXN0IGlzIG5vdyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7XG4gICAgICAgIC8vQXNzZXJ0IChjb2RlIDwgRF9DT0RFUywgXCJiYWQgZF9jb2RlXCIpO1xuXG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgZGlzdCAtPSBiYXNlX2Rpc3RbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsgICAvKiBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzICovXG4gICAgICAgIH1cbiAgICAgIH0gLyogbGl0ZXJhbCBvciBtYXRjaCBwYWlyID8gKi9cblxuICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgb3ZlcmxheSBiZXR3ZWVuIHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1ZiBpcyBvazogKi9cbiAgICAgIC8vQXNzZXJ0KCh1SW50KShzLT5wZW5kaW5nKSA8IHMtPmxpdF9idWZzaXplICsgMipseCxcbiAgICAgIC8vICAgICAgIFwicGVuZGluZ0J1ZiBvdmVyZmxvd1wiKTtcblxuICAgIH0gd2hpbGUgKGx4IDwgcy5sYXN0X2xpdCk7XG4gIH1cblxuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy5cbiAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoXG4gKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXNcbiAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX3RyZWUocywgZGVzYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB0cmVlX2Rlc2MgKmRlc2M7IC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi9cbntcbiAgdmFyIHRyZWUgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIHN0cmVlICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBlbGVtcyAgICA9IGRlc2Muc3RhdF9kZXNjLmVsZW1zO1xuICB2YXIgbiwgbTsgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi9cbiAgdmFyIG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB2YXIgbm9kZTsgICAgICAgICAgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqL1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgaW5pdGlhbCBoZWFwLCB3aXRoIGxlYXN0IGZyZXF1ZW50IGVsZW1lbnQgaW5cbiAgICogaGVhcFtTTUFMTEVTVF0uIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uXG4gICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuXG4gICAqL1xuICBzLmhlYXBfbGVuID0gMDtcbiAgcy5oZWFwX21heCA9IEhFQVBfU0laRTtcblxuICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykge1xuICAgIGlmICh0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgICAgcy5oZWFwWysrcy5oZWFwX2xlbl0gPSBtYXhfY29kZSA9IG47XG4gICAgICBzLmRlcHRoW25dID0gMDtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cyxcbiAgICogYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGJpdCBzaG91bGQgYmUgc2VudCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lXG4gICAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0XG4gICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuXG4gICAqL1xuICB3aGlsZSAocy5oZWFwX2xlbiA8IDIpIHtcbiAgICBub2RlID0gcy5oZWFwWysrcy5oZWFwX2xlbl0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApO1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gMTtcbiAgICBzLmRlcHRoW25vZGVdID0gMDtcbiAgICBzLm9wdF9sZW4tLTtcblxuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiAtPSBzdHJlZVtub2RlICogMiArIDFdLyouTGVuKi87XG4gICAgfVxuICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqL1xuICB9XG4gIGRlc2MubWF4X2NvZGUgPSBtYXhfY29kZTtcblxuICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsXG4gICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOlxuICAgKi9cbiAgZm9yIChuID0gKHMuaGVhcF9sZW4gPj4gMS8qaW50IC8yKi8pOyBuID49IDE7IG4tLSkgeyBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOyB9XG5cbiAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3b1xuICAgKiBmcmVxdWVudCBub2Rlcy5cbiAgICovXG4gIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqL1xuICBkbyB7XG4gICAgLy9wcXJlbW92ZShzLCB0cmVlLCBuKTsgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqL1xuICAgIC8qKiogcHFyZW1vdmUgKioqL1xuICAgIG4gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gcy5oZWFwW3MuaGVhcF9sZW4tLV07XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcbiAgICAvKioqL1xuXG4gICAgbSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi9cblxuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqL1xuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbTtcblxuICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovXG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSB0cmVlW24gKiAyXS8qLkZyZXEqLyArIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAocy5kZXB0aFtuXSA+PSBzLmRlcHRoW21dID8gcy5kZXB0aFtuXSA6IHMuZGVwdGhbbV0pICsgMTtcbiAgICB0cmVlW24gKiAyICsgMV0vKi5EYWQqLyA9IHRyZWVbbSAqIDIgKyAxXS8qLkRhZCovID0gbm9kZTtcblxuICAgIC8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovXG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gbm9kZSsrO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG5cbiAgfSB3aGlsZSAocy5oZWFwX2xlbiA+PSAyKTtcblxuICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcblxuICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LiBXZSBjYW4gbm93XG4gICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy5cbiAgICovXG4gIGdlbl9iaXRsZW4ocywgZGVzYyk7XG5cbiAgLyogVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcyAqL1xuICBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIHMuYmxfY291bnQpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2Rlc1xuICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS5cbiAqL1xuZnVuY3Rpb24gc2Nhbl90cmVlKHMsIHRyZWUsIG1heF9jb2RlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuICB0cmVlWyhtYXhfY29kZSArIDEpICogMiArIDFdLyouTGVuKi8gPSAweGZmZmY7IC8qIGd1YXJkICovXG5cbiAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgY3VybGVuID0gbmV4dGxlbjtcbiAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdLyouTGVuKi87XG5cbiAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkge1xuICAgICAgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovICs9IGNvdW50O1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcblxuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikgeyBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8rKzsgfVxuICAgICAgcy5ibF90cmVlW1JFUF8zXzYgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkge1xuICAgICAgcy5ibF90cmVlW1JFUFpfM18xMCAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcy5ibF90cmVlW1JFUFpfMTFfMTM4ICogMl0vKi5GcmVxKi8rKztcbiAgICB9XG5cbiAgICBjb3VudCA9IDA7XG4gICAgcHJldmxlbiA9IGN1cmxlbjtcblxuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpblxuICogYmxfdHJlZS5cbiAqL1xuZnVuY3Rpb24gc2VuZF90cmVlKHMsIHRyZWUsIG1heF9jb2RlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIC8qIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gLTE7ICovICAvKiBndWFyZCBhbHJlYWR5IHNldCAqL1xuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG5cbiAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgY3VybGVuID0gbmV4dGxlbjtcbiAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdLyouTGVuKi87XG5cbiAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkge1xuICAgICAgZG8geyBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpOyB9IHdoaWxlICgtLWNvdW50ICE9PSAwKTtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7XG4gICAgICAgIHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7XG4gICAgICAgIGNvdW50LS07XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChjb3VudCA+PSAzICYmIGNvdW50IDw9IDYsIFwiIDNfNj9cIik7XG4gICAgICBzZW5kX2NvZGUocywgUkVQXzNfNiwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDIpO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfM18xMCwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDExLCA3KTtcbiAgICB9XG5cbiAgICBjb3VudCA9IDA7XG4gICAgcHJldmxlbiA9IGN1cmxlbjtcbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW5cbiAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICovXG5mdW5jdGlvbiBidWlsZF9ibF90cmVlKHMpIHtcbiAgdmFyIG1heF9ibGluZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgc2Nhbl90cmVlKHMsIHMuZHluX2x0cmVlLCBzLmxfZGVzYy5tYXhfY29kZSk7XG4gIHNjYW5fdHJlZShzLCBzLmR5bl9kdHJlZSwgcy5kX2Rlc2MubWF4X2NvZGUpO1xuXG4gIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovXG4gIGJ1aWxkX3RyZWUocywgcy5ibF9kZXNjKTtcbiAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdFxuICAgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLlxuICAgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXRcbiAgICogcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXNcbiAgICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKVxuICAgKi9cbiAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTIC0gMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkge1xuICAgIGlmIChzLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdICogMiArIDFdLyouTGVuKi8gIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqL1xuICBzLm9wdF9sZW4gKz0gMyAqIChtYXhfYmxpbmRleCArIDEpICsgNSArIDUgKyA0O1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGRcIixcbiAgLy8gICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTtcblxuICByZXR1cm4gbWF4X2JsaW5kZXg7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGVcbiAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLlxuICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LlxuICovXG5mdW5jdGlvbiBzZW5kX2FsbF90cmVlcyhzLCBsY29kZXMsIGRjb2RlcywgYmxjb2Rlcylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovXG57XG4gIHZhciByYW5rOyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW4gYmxfb3JkZXIgKi9cblxuICAvL0Fzc2VydCAobGNvZGVzID49IDI1NyAmJiBkY29kZXMgPj0gMSAmJiBibGNvZGVzID49IDQsIFwibm90IGVub3VnaCBjb2Rlc1wiKTtcbiAgLy9Bc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsXG4gIC8vICAgICAgICBcInRvbyBtYW55IGNvZGVzXCIpO1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvdW50czogXCIpKTtcbiAgc2VuZF9iaXRzKHMsIGxjb2RlcyAtIDI1NywgNSk7IC8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBzZW5kX2JpdHMocywgZGNvZGVzIC0gMSwgICA1KTtcbiAgc2VuZF9iaXRzKHMsIGJsY29kZXMgLSA0LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykge1xuICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY29kZSAlMmQgXCIsIGJsX29yZGVyW3JhbmtdKSk7XG4gICAgc2VuZF9iaXRzKHMsIHMuYmxfdHJlZVtibF9vcmRlcltyYW5rXSAqIDIgKyAxXS8qLkxlbiovLCAzKTtcbiAgfVxuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9sdHJlZSwgbGNvZGVzIC0gMSk7IC8qIGxpdGVyYWwgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmxpdCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fZHRyZWUsIGRjb2RlcyAtIDEpOyAvKiBkaXN0YW5jZSB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZGlzdCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENoZWNrIGlmIHRoZSBkYXRhIHR5cGUgaXMgVEVYVCBvciBCSU5BUlksIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOlxuICogLSBURVhUIGlmIHRoZSB0d28gY29uZGl0aW9ucyBiZWxvdyBhcmUgc2F0aXNmaWVkOlxuICogICAgYSkgVGhlcmUgYXJlIG5vIG5vbi1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJibGFjayBsaXN0XCIgKDAuLjYsIDE0Li4yNSwgMjguLjMxKS5cbiAqICAgIGIpIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwcmludGFibGUgY2hhcmFjdGVyIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwid2hpdGUgbGlzdFwiICg5IHtUQUJ9LCAxMCB7TEZ9LCAxMyB7Q1J9LCAzMi4uMjU1KS5cbiAqIC0gQklOQVJZIG90aGVyd2lzZS5cbiAqIC0gVGhlIGZvbGxvd2luZyBwYXJ0aWFsbHktcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGZvcm0gYVxuICogICBcImdyYXkgbGlzdFwiIHRoYXQgaXMgaWdub3JlZCBpbiB0aGlzIGRldGVjdGlvbiBhbGdvcml0aG06XG4gKiAgICg3IHtCRUx9LCA4IHtCU30sIDExIHtWVH0sIDEyIHtGRn0sIDI2IHtTVUJ9LCAyNyB7RVNDfSkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgRnJlcSBvZiBkeW5fbHRyZWUgYXJlIHNldC5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0X2RhdGFfdHlwZShzKSB7XG4gIC8qIGJsYWNrX21hc2sgaXMgdGhlIGJpdCBtYXNrIG9mIGJsYWNrLWxpc3RlZCBieXRlc1xuICAgKiBzZXQgYml0cyAwLi42LCAxNC4uMjUsIGFuZCAyOC4uMzFcbiAgICogMHhmM2ZmYzA3ZiA9IGJpbmFyeSAxMTExMDAxMTExMTExMTExMTEwMDAwMDAwMTExMTExMVxuICAgKi9cbiAgdmFyIGJsYWNrX21hc2sgPSAweGYzZmZjMDdmO1xuICB2YXIgbjtcblxuICAvKiBDaGVjayBmb3Igbm9uLXRleHR1YWwgKFwiYmxhY2stbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDw9IDMxOyBuKyssIGJsYWNrX21hc2sgPj4+PSAxKSB7XG4gICAgaWYgKChibGFja19tYXNrICYgMSkgJiYgKHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkpIHtcbiAgICAgIHJldHVybiBaX0JJTkFSWTtcbiAgICB9XG4gIH1cblxuICAvKiBDaGVjayBmb3IgdGV4dHVhbCAoXCJ3aGl0ZS1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGlmIChzLmR5bl9sdHJlZVs5ICogMl0vKi5GcmVxKi8gIT09IDAgfHwgcy5keW5fbHRyZWVbMTAgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fFxuICAgICAgcy5keW5fbHRyZWVbMTMgKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgIHJldHVybiBaX1RFWFQ7XG4gIH1cbiAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUzsgbisrKSB7XG4gICAgaWYgKHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgICAgcmV0dXJuIFpfVEVYVDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGVyZSBhcmUgbm8gXCJibGFjay1saXN0ZWRcIiBvciBcIndoaXRlLWxpc3RlZFwiIGJ5dGVzOlxuICAgKiB0aGlzIHN0cmVhbSBlaXRoZXIgaXMgZW1wdHkgb3IgaGFzIHRvbGVyYXRlZCAoXCJncmF5LWxpc3RlZFwiKSBieXRlcyBvbmx5LlxuICAgKi9cbiAgcmV0dXJuIFpfQklOQVJZO1xufVxuXG5cbnZhciBzdGF0aWNfaW5pdF9kb25lID0gZmFsc2U7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBfdHJfaW5pdChzKVxue1xuXG4gIGlmICghc3RhdGljX2luaXRfZG9uZSkge1xuICAgIHRyX3N0YXRpY19pbml0KCk7XG4gICAgc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG4gIH1cblxuICBzLmxfZGVzYyAgPSBuZXcgVHJlZURlc2Mocy5keW5fbHRyZWUsIHN0YXRpY19sX2Rlc2MpO1xuICBzLmRfZGVzYyAgPSBuZXcgVHJlZURlc2Mocy5keW5fZHRyZWUsIHN0YXRpY19kX2Rlc2MpO1xuICBzLmJsX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5ibF90cmVlLCBzdGF0aWNfYmxfZGVzYyk7XG5cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcblxuICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi9cbiAgaW5pdF9ibG9jayhzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBzdG9yZWQgYmxvY2tcbiAqL1xuZnVuY3Rpb24gX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2sgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0sgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7ICAgIC8qIHNlbmQgYmxvY2sgdHlwZSAqL1xuICBjb3B5X2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgdHJ1ZSk7IC8qIHdpdGggaGVhZGVyICovXG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLlxuICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIF90cl9hbGlnbihzKSB7XG4gIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVMgPDwgMSwgMyk7XG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7XG4gIGJpX2ZsdXNoKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljXG4gKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICB2YXIgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAgLyogb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBpbiBieXRlcyAqL1xuICB2YXIgbWF4X2JsaW5kZXggPSAwOyAgICAgICAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqL1xuXG4gIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi9cbiAgaWYgKHMubGV2ZWwgPiAwKSB7XG5cbiAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBiaW5hcnkgb3IgdGV4dCAqL1xuICAgIGlmIChzLnN0cm0uZGF0YV90eXBlID09PSBaX1VOS05PV04pIHtcbiAgICAgIHMuc3RybS5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpO1xuICAgIH1cblxuICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgICBidWlsZF90cmVlKHMsIHMubF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuXG4gICAgYnVpbGRfdHJlZShzLCBzLmRfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG4gICAgLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mXG4gICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKi9cblxuICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4XG4gICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gICAgICovXG4gICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpO1xuXG4gICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqL1xuICAgIG9wdF9sZW5iID0gKHMub3B0X2xlbiArIDMgKyA3KSA+Pj4gMztcbiAgICBzdGF0aWNfbGVuYiA9IChzLnN0YXRpY19sZW4gKyAzICsgNykgPj4+IDM7XG5cbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBcIixcbiAgICAvLyAgICAgICAgb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLFxuICAgIC8vICAgICAgICBzLT5sYXN0X2xpdCkpO1xuXG4gICAgaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKSB7IG9wdF9sZW5iID0gc3RhdGljX2xlbmI7IH1cblxuICB9IGVsc2Uge1xuICAgIC8vIEFzc2VydChidWYgIT0gKGNoYXIqKTAsIFwibG9zdCBidWZcIik7XG4gICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqL1xuICB9XG5cbiAgaWYgKChzdG9yZWRfbGVuICsgNCA8PSBvcHRfbGVuYikgJiYgKGJ1ZiAhPT0gLTEpKSB7XG4gICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqL1xuXG4gICAgLyogVGhlIHRlc3QgYnVmICE9IE5VTEwgaXMgb25seSBuZWNlc3NhcnkgaWYgTElUX0JVRlNJWkUgPiBXU0laRS5cbiAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlXG4gICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuXG4gICAgICogc3VjY2Vzc2Z1bC4gSWYgTElUX0JVRlNJWkUgPD0gV1NJWkUsIGl0IGlzIG5ldmVyIHRvbyBsYXRlIHRvXG4gICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay5cbiAgICAgKi9cbiAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCk7XG5cbiAgfSBlbHNlIGlmIChzLnN0cmF0ZWd5ID09PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09PSBvcHRfbGVuYikge1xuXG4gICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7XG4gICAgY29tcHJlc3NfYmxvY2socywgc3RhdGljX2x0cmVlLCBzdGF0aWNfZHRyZWUpO1xuXG4gIH0gZWxzZSB7XG4gICAgc2VuZF9iaXRzKHMsIChEWU5fVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7XG4gICAgc2VuZF9hbGxfdHJlZXMocywgcy5sX2Rlc2MubWF4X2NvZGUgKyAxLCBzLmRfZGVzYy5tYXhfY29kZSArIDEsIG1heF9ibGluZGV4ICsgMSk7XG4gICAgY29tcHJlc3NfYmxvY2socywgcy5keW5fbHRyZWUsIHMuZHluX2R0cmVlKTtcbiAgfVxuICAvLyBBc3NlcnQgKHMtPmNvbXByZXNzZWRfbGVuID09IHMtPmJpdHNfc2VudCwgXCJiYWQgY29tcHJlc3NlZCBzaXplXCIpO1xuICAvKiBUaGUgYWJvdmUgY2hlY2sgaXMgbWFkZSBtb2QgMl4zMiwgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDUxMiBNQlxuICAgKiBhbmQgdUxvbmcgaW1wbGVtZW50ZWQgb24gMzIgYml0cy5cbiAgICovXG4gIGluaXRfYmxvY2socyk7XG5cbiAgaWYgKGxhc3QpIHtcbiAgICBiaV93aW5kdXAocyk7XG4gIH1cbiAgLy8gVHJhY2V2KChzdGRlcnIsXCJcXG5jb21wcmxlbiAlbHUoJWx1KSBcIiwgcy0+Y29tcHJlc3NlZF9sZW4+PjMsXG4gIC8vICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqbGFzdCkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZlxuICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLlxuICovXG5mdW5jdGlvbiBfdHJfdGFsbHkocywgZGlzdCwgbGMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdW5zaWduZWQgZGlzdDsgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4vLyAgICB1bnNpZ25lZCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1JTl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi9cbntcbiAgLy92YXIgb3V0X2xlbmd0aCwgaW5fbGVuZ3RoLCBkY29kZTtcblxuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMl0gICAgID0gKGRpc3QgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDIgKyAxXSA9IGRpc3QgJiAweGZmO1xuXG4gIHMucGVuZGluZ19idWZbcy5sX2J1ZiArIHMubGFzdF9saXRdID0gbGMgJiAweGZmO1xuICBzLmxhc3RfbGl0Kys7XG5cbiAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi9cbiAgICBzLmR5bl9sdHJlZVtsYyAqIDJdLyouRnJlcSovKys7XG4gIH0gZWxzZSB7XG4gICAgcy5tYXRjaGVzKys7XG4gICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqL1xuICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgIC8vQXNzZXJ0KCh1c2gpZGlzdCA8ICh1c2gpTUFYX0RJU1QocykgJiZcbiAgICAvLyAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmXG4gICAgLy8gICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICBcIl90cl90YWxseTogYmFkIG1hdGNoXCIpO1xuXG4gICAgcy5keW5fbHRyZWVbKF9sZW5ndGhfY29kZVtsY10gKyBMSVRFUkFMUyArIDEpICogMl0vKi5GcmVxKi8rKztcbiAgICBzLmR5bl9kdHJlZVtkX2NvZGUoZGlzdCkgKiAyXS8qLkZyZXEqLysrO1xuICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG5cbi8vI2lmZGVmIFRSVU5DQVRFX0JMT0NLXG4vLyAgLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovXG4vLyAgaWYgKChzLmxhc3RfbGl0ICYgMHgxZmZmKSA9PT0gMCAmJiBzLmxldmVsID4gMikge1xuLy8gICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovXG4vLyAgICBvdXRfbGVuZ3RoID0gcy5sYXN0X2xpdCo4O1xuLy8gICAgaW5fbGVuZ3RoID0gcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQ7XG4vL1xuLy8gICAgZm9yIChkY29kZSA9IDA7IGRjb2RlIDwgRF9DT0RFUzsgZGNvZGUrKykge1xuLy8gICAgICBvdXRfbGVuZ3RoICs9IHMuZHluX2R0cmVlW2Rjb2RlKjJdLyouRnJlcSovICogKDUgKyBleHRyYV9kYml0c1tkY29kZV0pO1xuLy8gICAgfVxuLy8gICAgb3V0X2xlbmd0aCA+Pj49IDM7XG4vLyAgICAvL1RyYWNldigoc3RkZXJyLFwiXFxubGFzdF9saXQgJXUsIGluICVsZCwgb3V0IH4lbGQoJWxkJSUpIFwiLFxuLy8gICAgLy8gICAgICAgcy0+bGFzdF9saXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCxcbi8vICAgIC8vICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwvaW5fbGVuZ3RoKSk7XG4vLyAgICBpZiAocy5tYXRjaGVzIDwgKHMubGFzdF9saXQ+PjEpLyppbnQgLzIqLyAmJiBvdXRfbGVuZ3RoIDwgKGluX2xlbmd0aD4+MSkvKmludCAvMiovKSB7XG4vLyAgICAgIHJldHVybiB0cnVlO1xuLy8gICAgfVxuLy8gIH1cbi8vI2VuZGlmXG5cbiAgcmV0dXJuIChzLmxhc3RfbGl0ID09PSBzLmxpdF9idWZzaXplIC0gMSk7XG4gIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0S1xuICAgKiBvbiAxNiBiaXQgbWFjaGluZXMgYW5kIGJlY2F1c2Ugc3RvcmVkIGJsb2NrcyBhcmUgcmVzdHJpY3RlZCB0b1xuICAgKiA2NEstMSBieXRlcy5cbiAgICovXG59XG5cbmV4cG9ydHMuX3RyX2luaXQgID0gX3RyX2luaXQ7XG5leHBvcnRzLl90cl9zdG9yZWRfYmxvY2sgPSBfdHJfc3RvcmVkX2Jsb2NrO1xuZXhwb3J0cy5fdHJfZmx1c2hfYmxvY2sgID0gX3RyX2ZsdXNoX2Jsb2NrO1xuZXhwb3J0cy5fdHJfdGFsbHkgPSBfdHJfdGFsbHk7XG5leHBvcnRzLl90cl9hbGlnbiA9IF90cl9hbGlnbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIF9pbjsgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaW5wdXQgKi9cbiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqL1xuICB2YXIgX291dDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGJlZzsgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqL1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgdmFyIGRtYXg7ICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqL1xuLy8jZW5kaWZcbiAgdmFyIHdzaXplOyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB2YXIgd2hhdmU7ICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIC8vIFVzZSBgc193aW5kb3dgIGluc3RlYWQgYHdpbmRvd2AsIGF2b2lkIGNvbmZsaWN0IHdpdGggaW5zdHJ1bWVudGF0aW9uIHRvb2xzXG4gIHZhciBzX3dpbmRvdzsgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5iaXRzICovXG4gIHZhciBsY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmxlbmNvZGUgKi9cbiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi9cbiAgdmFyIGxtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqL1xuICB2YXIgZG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi9cbiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgb3A7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi9cbiAgdmFyIGRpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuXG5cbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcblxuICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqL1xuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIC8vaGVyZSA9IHN0YXRlLmhlcmU7XG4gIF9pbiA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBsYXN0ID0gX2luICsgKHN0cm0uYXZhaWxfaW4gLSA1KTtcbiAgX291dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBiZWcgPSBfb3V0IC0gKHN0YXJ0IC0gc3RybS5hdmFpbF9vdXQpO1xuICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGRtYXggPSBzdGF0ZS5kbWF4O1xuLy8jZW5kaWZcbiAgd3NpemUgPSBzdGF0ZS53c2l6ZTtcbiAgd2hhdmUgPSBzdGF0ZS53aGF2ZTtcbiAgd25leHQgPSBzdGF0ZS53bmV4dDtcbiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqL1xuICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgY29udGludWUgZG9sZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxudmFyIE1BWEJJVFMgPSAxNTtcbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbnZhciBsYmFzZSA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi9cbiAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSxcbiAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDBcbl07XG5cbnZhciBsZXh0ID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsXG4gIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3MiwgNzhcbl07XG5cbnZhciBkYmFzZSA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqL1xuICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsXG4gIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSxcbiAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMFxuXTtcblxudmFyIGRleHQgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLFxuICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNyxcbiAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NFxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGxlbnNfaW5kZXgsIGNvZGVzLCB0YWJsZSwgdGFibGVfaW5kZXgsIHdvcmssIG9wdHMpXG57XG4gIHZhciBiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy9oZXJlID0gb3B0cy5oZXJlOyAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi9cblxuICB2YXIgbGVuID0gMDsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqL1xuICB2YXIgc3ltID0gMDsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi9cbiAgdmFyIG1pbiA9IDAsIG1heCA9IDA7ICAgICAgICAgIC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovXG4gIHZhciByb290ID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciByb290IHRhYmxlICovXG4gIHZhciBjdXJyID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovXG4gIHZhciBkcm9wID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi9cbiAgdmFyIGxlZnQgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqL1xuICB2YXIgdXNlZCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqL1xuICB2YXIgaHVmZiA9IDA7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi9cbiAgdmFyIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovXG4gIHZhciBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi9cbiAgdmFyIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovXG4gIHZhciBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqL1xuICB2YXIgbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi9cbiAgdmFyIGJhc2UgPSBudWxsOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGJhc2VfaW5kZXggPSAwO1xuLy8gIHZhciBzaG9leHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovXG4gIHZhciBjb3VudCA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqL1xuICB2YXIgb2ZmcyA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqL1xuICB2YXIgZXh0cmEgPSBudWxsO1xuICB2YXIgZXh0cmFfaW5kZXggPSAwO1xuXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsO1xuXG4gIC8qXG4gICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlXG4gICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGVcbiAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlXG4gICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlclxuICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0c1xuICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXJcbiAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoXG4gICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzXG4gICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlXG4gICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2Rlc1xuICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy5cblxuICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW5cbiAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuXG4gICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdFxuICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS5cblxuICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLFxuICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlXG4gICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWRcbiAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieVxuICAgdGhlIGNhbGxlci5cblxuICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZ1xuICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55XG4gICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZFxuICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlXG4gICBkZWNvZGluZyB0YWJsZXMuXG4gICAqL1xuXG4gIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqL1xuICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGNvdW50W2xlbl0gPSAwO1xuICB9XG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgY291bnRbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rKztcbiAgfVxuXG4gIC8qIGJvdW5kIGNvZGUgbGVuZ3RocywgZm9yY2Ugcm9vdCB0byBiZSB3aXRoaW4gY29kZSBsZW5ndGhzICovXG4gIHJvb3QgPSBiaXRzO1xuICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkge1xuICAgIGlmIChjb3VudFttYXhdICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPiBtYXgpIHtcbiAgICByb290ID0gbWF4O1xuICB9XG4gIGlmIChtYXggPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBubyBzeW1ib2xzIHRvIGNvZGUgYXQgYWxsICovXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OyAgLy9oZXJlLm9wID0gKHZhciBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTsgICAvL2hlcmUuYml0cyA9ICh2YXIgY2hhcikxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwOyAgIC8vaGVyZS52YWwgPSAodmFyIHNob3J0KTA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0O1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuICAgIG9wdHMuYml0cyA9IDE7XG4gICAgcmV0dXJuIDA7ICAgICAvKiBubyBzeW1ib2xzLCBidXQgd2FpdCBmb3IgZGVjb2RpbmcgdG8gcmVwb3J0IGVycm9yICovXG4gIH1cbiAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKSB7XG4gICAgaWYgKGNvdW50W21pbl0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA8IG1pbikge1xuICAgIHJvb3QgPSBtaW47XG4gIH1cblxuICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi9cbiAgbGVmdCA9IDE7XG4gIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgbGVmdCA8PD0gMTtcbiAgICBsZWZ0IC09IGNvdW50W2xlbl07XG4gICAgaWYgKGxlZnQgPCAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovXG4gIH1cbiAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyB8fCBtYXggIT09IDEpKSB7XG4gICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqL1xuICB9XG5cbiAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi9cbiAgb2Zmc1sxXSA9IDA7XG4gIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspIHtcbiAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTtcbiAgfVxuXG4gIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi9cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBpZiAobGVuc1tsZW5zX2luZGV4ICsgc3ltXSAhPT0gMCkge1xuICAgICAgd29ya1tvZmZzW2xlbnNbbGVuc19pbmRleCArIHN5bV1dKytdID0gc3ltO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmdcbiAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmXG4gICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3BcbiAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VycixcbiAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG9cbiAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLlxuXG4gICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzXG4gICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleFxuICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGFcbiAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpc1xuICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLlxuXG4gICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZVxuICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGhcbiAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlXG4gICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuXG5cbiAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlXG4gICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0XG4gICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluXG4gICB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUgY29uc3RhbnRzLiAgU2VlIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlblxuICAgYWxsIGNvZGVzIG9mIGxlbmd0aCBtYXgsIGkuZS4gYWxsIGNvZGVzLCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpc1xuICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxsc1xuICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLlxuICAgKi9cblxuICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqL1xuICAvLyBwb29yIG1hbiBvcHRpbWl6YXRpb24gLSB1c2UgaWYtZWxzZSBpbnN0ZWFkIG9mIHN3aXRjaCxcbiAgLy8gdG8gYXZvaWQgZGVvcHRzIGluIG9sZCB2OFxuICBpZiAodHlwZSA9PT0gQ09ERVMpIHtcbiAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi9cbiAgICBlbmQgPSAxOTtcblxuICB9IGVsc2UgaWYgKHR5cGUgPT09IExFTlMpIHtcbiAgICBiYXNlID0gbGJhc2U7XG4gICAgYmFzZV9pbmRleCAtPSAyNTc7XG4gICAgZXh0cmEgPSBsZXh0O1xuICAgIGV4dHJhX2luZGV4IC09IDI1NztcbiAgICBlbmQgPSAyNTY7XG5cbiAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIERJU1RTICovXG4gICAgYmFzZSA9IGRiYXNlO1xuICAgIGV4dHJhID0gZGV4dDtcbiAgICBlbmQgPSAtMTtcbiAgfVxuXG4gIC8qIGluaXRpYWxpemUgb3B0cyBmb3IgbG9vcCAqL1xuICBodWZmID0gMDsgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSAqL1xuICBzeW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBzeW1ib2wgKi9cbiAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovXG4gIG5leHQgPSB0YWJsZV9pbmRleDsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqL1xuICBjdXJyID0gcm9vdDsgICAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSBpbmRleCBiaXRzICovXG4gIGRyb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgdG8gZHJvcCBmcm9tIGNvZGUgZm9yIGluZGV4ICovXG4gIGxvdyA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovXG4gIHVzZWQgPSAxIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi9cbiAgbWFzayA9IHVzZWQgLSAxOyAgICAgICAgICAgIC8qIG1hc2sgZm9yIGNvbXBhcmluZyBsb3cgKi9cblxuICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi9cbiAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqL1xuICAgIGhlcmVfYml0cyA9IGxlbiAtIGRyb3A7XG4gICAgaWYgKHdvcmtbc3ltXSA8IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IDA7XG4gICAgICBoZXJlX3ZhbCA9IHdvcmtbc3ltXTtcbiAgICB9XG4gICAgZWxzZSBpZiAod29ya1tzeW1dID4gZW5kKSB7XG4gICAgICBoZXJlX29wID0gZXh0cmFbZXh0cmFfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgICAgaGVyZV92YWwgPSBiYXNlW2Jhc2VfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhlcmVfb3AgPSAzMiArIDY0OyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqL1xuICAgICAgaGVyZV92YWwgPSAwO1xuICAgIH1cblxuICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIGRyb3ApO1xuICAgIGZpbGwgPSAxIDw8IGN1cnI7XG4gICAgbWluID0gZmlsbDsgICAgICAgICAgICAgICAgIC8qIHNhdmUgb2Zmc2V0IHRvIG5leHQgdGFibGUgKi9cbiAgICBkbyB7XG4gICAgICBmaWxsIC09IGluY3I7XG4gICAgICB0YWJsZVtuZXh0ICsgKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IChoZXJlX2JpdHMgPDwgMjQpIHwgKGhlcmVfb3AgPDwgMTYpIHwgaGVyZV92YWwgfDA7XG4gICAgfSB3aGlsZSAoZmlsbCAhPT0gMCk7XG5cbiAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSAxKTtcbiAgICB3aGlsZSAoaHVmZiAmIGluY3IpIHtcbiAgICAgIGluY3IgPj49IDE7XG4gICAgfVxuICAgIGlmIChpbmNyICE9PSAwKSB7XG4gICAgICBodWZmICY9IGluY3IgLSAxO1xuICAgICAgaHVmZiArPSBpbmNyO1xuICAgIH0gZWxzZSB7XG4gICAgICBodWZmID0gMDtcbiAgICB9XG5cbiAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi9cbiAgICBzeW0rKztcbiAgICBpZiAoLS1jb3VudFtsZW5dID09PSAwKSB7XG4gICAgICBpZiAobGVuID09PSBtYXgpIHsgYnJlYWs7IH1cbiAgICAgIGxlbiA9IGxlbnNbbGVuc19pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuXG4gICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovXG4gICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPT0gbG93KSB7XG4gICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi9cbiAgICAgIGlmIChkcm9wID09PSAwKSB7XG4gICAgICAgIGRyb3AgPSByb290O1xuICAgICAgfVxuXG4gICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovXG4gICAgICBuZXh0ICs9IG1pbjsgICAgICAgICAgICAvKiBoZXJlIG1pbiBpcyAxIDw8IGN1cnIgKi9cblxuICAgICAgLyogZGV0ZXJtaW5lIGxlbmd0aCBvZiBuZXh0IHRhYmxlICovXG4gICAgICBjdXJyID0gbGVuIC0gZHJvcDtcbiAgICAgIGxlZnQgPSAxIDw8IGN1cnI7XG4gICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHtcbiAgICAgICAgbGVmdCAtPSBjb3VudFtjdXJyICsgZHJvcF07XG4gICAgICAgIGlmIChsZWZ0IDw9IDApIHsgYnJlYWs7IH1cbiAgICAgICAgY3VycisrO1xuICAgICAgICBsZWZ0IDw8PSAxO1xuICAgICAgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovXG4gICAgICB1c2VkICs9IDEgPDwgY3VycjtcbiAgICAgIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi9cbiAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrO1xuICAgICAgLyp0YWJsZS5vcFtsb3ddID0gY3VycjtcbiAgICAgIHRhYmxlLmJpdHNbbG93XSA9IHJvb3Q7XG4gICAgICB0YWJsZS52YWxbbG93XSA9IG5leHQgLSBvcHRzLnRhYmxlX2luZGV4OyovXG4gICAgICB0YWJsZVtsb3ddID0gKHJvb3QgPDwgMjQpIHwgKGN1cnIgPDwgMTYpIHwgKG5leHQgLSB0YWJsZV9pbmRleCkgfDA7XG4gICAgfVxuICB9XG5cbiAgLyogZmlsbCBpbiByZW1haW5pbmcgdGFibGUgZW50cnkgaWYgY29kZSBpcyBpbmNvbXBsZXRlIChndWFyYW50ZWVkIHRvIGhhdmVcbiAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlXG4gICBtYXhpbXVtIGNvZGUgbGVuZ3RoIHRoYXQgd2FzIGFsbG93ZWQgdG8gZ2V0IHRoaXMgZmFyIGlzIG9uZSBiaXQpICovXG4gIGlmIChodWZmICE9PSAwKSB7XG4gICAgLy90YWJsZS5vcFtuZXh0ICsgaHVmZl0gPSA2NDsgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW25leHQgKyBodWZmXSA9IGxlbiAtIGRyb3A7XG4gICAgLy90YWJsZS52YWxbbmV4dCArIGh1ZmZdID0gMDtcbiAgICB0YWJsZVtuZXh0ICsgaHVmZl0gPSAoKGxlbiAtIGRyb3ApIDw8IDI0KSB8ICg2NCA8PCAxNikgfDA7XG4gIH1cblxuICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi9cbiAgLy9vcHRzLnRhYmxlX2luZGV4ICs9IHVzZWQ7XG4gIG9wdHMuYml0cyA9IHJvb3Q7XG4gIHJldHVybiAwO1xufTtcbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgV0FSQ1JlY29yZCA9IHJlcXVpcmUoJy4vcmVjb3JkJylcbmNvbnN0IHsgY3JsZiwgYmVnaW4gfSA9IHJlcXVpcmUoJy4vZmllbGRJZGVudGlmaWVycycpXG5cbi8qKlxuICogQHR5cGUge3toZWFkZXI6IHN5bWJvbCwgY29udGVudDE6IHN5bWJvbCwgY29udGVudDI6IHN5bWJvbCwgY29uc3VtZUNSTEZIZWFkZXI6IHN5bWJvbCwgY29uc3VtZUNSTEZDb250ZW50MTogc3ltYm9sLCBjb25zdW1lQ1JMRkNvbnRlbnQyOiBzeW1ib2x9fVxuICovXG5jb25zdCBwYXJzaW5nU3RhdGVzID0ge1xuICBoZWFkZXI6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWhlYWRlcicpLFxuICBjb250ZW50MTogU3ltYm9sKCd3YXJjLXBhcnNpbmctY29udGVudDEnKSxcbiAgY29udGVudDI6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWNvbnRlbnQyJyksXG4gIGNvbnN1bWVDUkxGSGVhZGVyOiBTeW1ib2woJ3dhcmMtcGFyc2luZy1jb21zdW1lLWNybGYtaGVhZGVyJyksXG4gIGNvbnN1bWVDUkxGQ29udGVudDE6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWNvbXN1bWUtY3JsZi1jMScpLFxuICBjb25zdW1lQ1JMRkNvbnRlbnQyOiBTeW1ib2woJ3dhcmMtcGFyc2luZy1jb21zdW1lLWNybGYtYzInKVxufVxuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IFdGSUJlZ2luTGVuID0gYmVnaW4ubGVuZ3RoXG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJ9IGxpbmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0p1c3RDUkxGIChsaW5lKSB7XG4gIGlmIChsaW5lLmxlbmd0aCAhPT0gMikgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBsaW5lWzBdID09PSBjcmxmWzBdICYmIGxpbmVbMV0gPT09IGNybGZbMV1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbGluZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzV0FSQ1JldmlzaW9uTGluZSAobGluZSkge1xuICBpZiAobGluZS5sZW5ndGggPiAxMSkgcmV0dXJuIGZhbHNlXG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IFdGSUJlZ2luTGVuKSB7XG4gICAgaWYgKGJlZ2luW2ldICE9PSBsaW5lW2ldKSByZXR1cm4gZmFsc2VcbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBkZXNjIFByb2dyZXNzaXZlbHkgYnVpbGRzIHdhcmMgcmVjb3JkcyBieSBjb25zdW1pbmcgdGhlIGZpbGUgbGluZSBieSBsaW5lXG4gKi9cbmNsYXNzIFJlY29yZEJ1aWxkZXIge1xuICAvKipcbiAgICogQGRlc2MgQ3JlYXRlIGEgbmV3IFJlY29yZEJ1aWxkZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7e2hlYWRlcjogQnVmZmVyW10sIGMxOiBCdWZmZXJbXSwgYzI6IEJ1ZmZlcltdfX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3BhcnRzID0ge1xuICAgICAgaGVhZGVyOiBbXSxcbiAgICAgIGMxOiBbXSxcbiAgICAgIGMyOiBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzeW1ib2x9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9wYXJzaW5nU3RhdGUgPSBwYXJzaW5nU3RhdGVzLmhlYWRlclxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJldHVybnMgYSBuZXcgV0FSQyByZWNvcmQgaWYgb25lIGNhbiBiZSBjcmVhdGVkIG90aGVyd2lzZSByZXR1cm5zIG51bGxcbiAgICogQHJldHVybnMgez9XQVJDUmVjb3JkfVxuICAgKi9cbiAgYnVpbGRSZWNvcmQgKCkge1xuICAgIGlmICh0aGlzLl9wYXJ0cy5oZWFkZXIubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IG5ld1JlY29yZCA9IG5ldyBXQVJDUmVjb3JkKHRoaXMuX3BhcnRzKVxuICAgIHRoaXMuX3BhcnRzLmhlYWRlciA9IFtdXG4gICAgdGhpcy5fcGFydHMuYzEgPSBbXVxuICAgIHRoaXMuX3BhcnRzLmMyID0gW11cbiAgICByZXR1cm4gbmV3UmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQ29uc3VtZXMgYSBsaW5lIG9mIGEgV0FSQyBmaWxlLlxuICAgKiBJZiBhIHJlY29yZCBjYW4gYmUgYnVpbHQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IFdBUkNSZWNvcmQgb3RoZXJ3aXNlIG51bGxcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGxpbmUgLSBUaGUgbGluZSB0byBiZSBjb25zdW1lZFxuICAgKiBAcmV0dXJucyB7P1dBUkNSZWNvcmR9XG4gICAqL1xuICBjb25zdW1lTGluZSAobGluZSkge1xuICAgIGxldCBuZXdSZWNvcmQgPSBudWxsXG4gICAgaWYgKGlzV0FSQ1JldmlzaW9uTGluZShsaW5lKSkge1xuICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5oZWFkZXJcbiAgICAgIG5ld1JlY29yZCA9IHRoaXMuYnVpbGRSZWNvcmQoKVxuICAgIH1cbiAgICBjb25zdCBpc1NlcCA9IGlzSnVzdENSTEYobGluZSlcbiAgICBzd2l0Y2ggKHRoaXMuX3BhcnNpbmdTdGF0ZSkge1xuICAgICAgY2FzZSBwYXJzaW5nU3RhdGVzLmhlYWRlcjpcbiAgICAgICAgaWYgKCFpc1NlcCkge1xuICAgICAgICAgIHRoaXMuX3BhcnRzLmhlYWRlci5wdXNoKGxpbmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkhlYWRlclxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZIZWFkZXI6XG4gICAgICAgIGlmICghaXNTZXApIHtcbiAgICAgICAgICB0aGlzLl9wYXJ0cy5jMS5wdXNoKGxpbmUpXG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb250ZW50MVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29udGVudDE6XG4gICAgICAgIGlmICghaXNTZXApIHtcbiAgICAgICAgICB0aGlzLl9wYXJ0cy5jMS5wdXNoKGxpbmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkNvbnRlbnQxXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkNvbnRlbnQxOlxuICAgICAgICBpZiAoIWlzU2VwKSB7XG4gICAgICAgICAgdGhpcy5fcGFydHMuYzIucHVzaChsaW5lKVxuICAgICAgICAgIHRoaXMuX3BhcnNpbmdTdGF0ZSA9IHBhcnNpbmdTdGF0ZXMuY29udGVudDJcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBwYXJzaW5nU3RhdGVzLmNvbnRlbnQyOlxuICAgICAgICBpZiAoIWlzU2VwKSB7XG4gICAgICAgICAgdGhpcy5fcGFydHMuYzIucHVzaChsaW5lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3BhcnNpbmdTdGF0ZSA9IHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZDb250ZW50MlxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZDb250ZW50MjpcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JlY29yZFxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge1JlY29yZEJ1aWxkZXJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gUmVjb3JkQnVpbGRlclxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCBDb250ZW50UGFyc2VyID0gcmVxdWlyZSgnLi93YXJjQ29udGVudFBhcnNlcnMnKVxuY29uc3QgeyBXQVJDVHlwZXMgfSA9IHJlcXVpcmUoJy4uL3dyaXRlcnMvd2FyY0ZpZWxkcycpXG5cbi8qKlxuICogQGRlc2MgV0FSQyByZWNvcmQgY2xhc3MuIFRoZSBXQVJDIG5hbWVkIGZpZWxkcyBhcmUgcHJvcGVydGllcyBvbiB0aGlzIG9iamVjdFxuICovXG5jbGFzcyBXQVJDUmVjb3JkIHtcbiAgLyoqXG4gICAqIEBkZXNjIENyZWF0ZSBhIG5ldyBXQVJDUmVjb3JkXG4gICAqIEBwYXJhbSB7e2hlYWRlcjogQnVmZmVyW10sIGMxOiBCdWZmZXJbXSwgYzI6IEJ1ZmZlcltdfX0gd2FyY1BhcnRzIC0gVGhlIHBhcnRzIG9mIGEgd2FyYyByZWNvcmRcbiAgICovXG4gIGNvbnN0cnVjdG9yICh3YXJjUGFydHMpIHtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIFdBUkMgaGVhZGVyXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLndhcmNIZWFkZXIgPSBDb250ZW50UGFyc2VyLnBhcnNlV2FyY1JlY29yZEhlYWRlcih3YXJjUGFydHMuaGVhZGVyKVxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcnNlZCByZXF1ZXN0IG9yIHJlc3BvbnNlIHJlY29yZHMgSFRUUCBpbmZvcm1hdGlvblxuICAgICAqIEB0eXBlIHs/UmVxdWVzdEhUVFB8P1Jlc3BvbnNlSFRUUH1cbiAgICAgKi9cbiAgICB0aGlzLmh0dHBJbmZvID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNvbnRlbnQgb2YgdGhlIHJlY29yZC5cbiAgICAgKiBAdHlwZSB7QnVmZmVyfVxuICAgICAqL1xuICAgIHRoaXMuY29udGVudCA9IG51bGxcblxuICAgIGNvbnN0IHd0ID0gdGhpcy53YXJjVHlwZVxuICAgIHN3aXRjaCAod3QpIHtcbiAgICAgIGNhc2UgV0FSQ1R5cGVzLnJlcXVlc3Q6XG4gICAgICBjYXNlIFdBUkNUeXBlcy5yZXNwb25zZTpcbiAgICAgICAgdGhpcy5odHRwSW5mbyA9IENvbnRlbnRQYXJzZXIucGFyc2VIVFRQUG9ydGlvbihcbiAgICAgICAgICB3YXJjUGFydHMuYzEsXG4gICAgICAgICAgd3QgPT09IFdBUkNUeXBlcy5yZXF1ZXN0XG4gICAgICAgIClcbiAgICAgICAgdGhpcy5jb250ZW50ID0gQnVmZmVyLmNvbmNhdCh3YXJjUGFydHMuYzIgfHwgW10pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFdBUkNUeXBlcy5yZXZpc2l0OlxuICAgICAgICB0aGlzLmh0dHBJbmZvID0gQ29udGVudFBhcnNlci5wYXJzZVJlc0hUVFAod2FyY1BhcnRzLmMxKVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5jb250ZW50ID0gQnVmZmVyLmNvbmNhdCh3YXJjUGFydHMuYzEgfHwgW10pXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIERldGVybWluZSBpZiB0aGlzIHdhcmMgcmVjb3JkIGhlYWRlciBoYXMgdGhlIHN1cHBsaWVkIFdBUkMgbmFtZWQgZmllbGQuXG4gICAqIElmIHRoZSBzdXBwbGllZCBoZWFkZXIga2V5IGRvZXMgbm90IHN0YXJ0IHdpdGggV0FSQyB0aGVuIHRoaXMgaXQgd2lsbCBiZSBhZGRlZC5cbiAgICogQGV4YW1wbGVcbiAgICogIC8vIGJvdGggd2F5cyBhcmUgZXF1aXZhbGVudCB0byBkZXRlcm1pbmUgaWYgdGhlIHJlY29yZCBoYXMgdGhlIFdBUkMtVHlwZSBmaWVsZFxuICAgKiAgcmVjb3JkLmhhc1dBUkNIZWFkZXIoJ1dBUkMtVHlwZScpXG4gICAqICByZWNvcmQuaGFzV0FSQ0hlYWRlcignVHlwZScpXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gaGVhZGVyS2V5IC0gVGhlIFdBUkMgaGVhZGVyIGtleSAobmFtZWQgZmllbGQpXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBoYXNXQVJDSGVhZGVyIChoZWFkZXJLZXkpIHtcbiAgICBpZiAoIWhlYWRlcktleS5zdGFydHNXaXRoKCdXQVJDJykpIHtcbiAgICAgIGhlYWRlcktleSA9IGBXQVJDLSR7aGVhZGVyS2V5fWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlcltoZWFkZXJLZXldICE9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhpcyByZWNvcmRzIGhlYWRlciBmaWVsZC5cbiAgICogSWYgdGhlIHN1cHBsaWVkIGhlYWRlciBrZXkgZG9lcyBub3Qgc3RhcnQgd2l0aCBXQVJDIHRoZW4gdGhpcyBpdCB3aWxsIGJlIGFkZGVkLlxuICAgKiBAZXhhbXBsZVxuICAgKiAgLy8gYm90aCB3YXlzIGFyZSBlcXVpdmFsZW50IHRvIHJldHJpZXZlIFdBUkMtVHlwZSBmaWVsZFxuICAgKiAgcmVjb3JkLmdldFdBUkNIZWFkZXIoJ1dBUkMtVHlwZScpXG4gICAqICByZWNvcmQuZ2V0V0FSQ0hlYWRlcignVHlwZScpXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gaGVhZGVyS2V5IC0gVGhlIFdBUkMgaGVhZGVyIGtleSAobmFtZWQgZmllbGQpXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXRXQVJDSGVhZGVyIChoZWFkZXJLZXkpIHtcbiAgICBpZiAoIWhlYWRlcktleS5zdGFydHNXaXRoKCdXQVJDJykpIHtcbiAgICAgIGhlYWRlcktleSA9IGBXQVJDLSR7aGVhZGVyS2V5fWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlcltoZWFkZXJLZXldXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7P3N0cmluZ31cbiAgICovXG4gIGdldCB3YXJjVHlwZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1UeXBlJ11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdhcmNSZWNvcmRJRCAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1SZWNvcmQtSUQnXVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXQgd2FyY0RhdGUgKCkge1xuICAgIHJldHVybiB0aGlzLndhcmNIZWFkZXJbJ1dBUkMtRGF0ZSddXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7P3N0cmluZ31cbiAgICovXG4gIGdldCB3YXJjQ29udGVudExlbmd0aCAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnQ29udGVudC1MZW5ndGgnXVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXQgd2FyY0NvbnRlbnRUeXBlICgpIHtcbiAgICByZXR1cm4gdGhpcy53YXJjSGVhZGVyWydDb250ZW50LVR5cGUnXVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXQgd2FyY0NvbmN1cnJlbnRUbyAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1Db25jdXJyZW50LVRvJ11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdhcmNCbG9ja0RpZ2VzdCAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1CbG9jay1EaWdlc3QnXVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXQgd2FyY1BheWxvYWREaWdlc3QgKCkge1xuICAgIHJldHVybiB0aGlzLndhcmNIZWFkZXJbJ1dBUkMtUGF5bG9hZC1EaWdlc3QnXVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXQgd2FyY0lQQWRkcmVzcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1JUC1BZGRyZXNzJ11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdhcmNSZWZlcnNUbyAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1SZWZlcnMtVG8nXVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXQgd2FyY1JlZmVyc1RvVGFyZ2V0VVJJICgpIHtcbiAgICByZXR1cm4gdGhpcy53YXJjSGVhZGVyWydXQVJDLVJlZmVycy1Uby1UYXJnZXQtVVJJJ11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdhcmNSZWZlcnNUb0RhdGUgKCkge1xuICAgIHJldHVybiB0aGlzLndhcmNIZWFkZXJbJ1dBUkMtUmVmZXJzLVRvLURhdGUnXVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXQgd2FyY1RhcmdldFVSSSAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1UYXJnZXQtVVJJJ11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdhcmNUcnVuY2F0ZWQgKCkge1xuICAgIHJldHVybiB0aGlzLndhcmNIZWFkZXJbJ1dBUkMtVHJ1bmNhdGVkJ11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdhcmNXYXJjaW5mb0lEICgpIHtcbiAgICByZXR1cm4gdGhpcy53YXJjSGVhZGVyWydXQVJDLVdhcmNpbmZvLUlEJ11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdhcmNGaWxlbmFtZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1GaWxlbmFtZSddXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7P3N0cmluZ31cbiAgICovXG4gIGdldCB3YXJjUHJvZmlsZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1Qcm9maWxlJ11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdhcmNJZGVudGlmaWVkUGF5bG9hZFR5cGUgKCkge1xuICAgIHJldHVybiB0aGlzLndhcmNIZWFkZXJbJ1dBUkMtSWRlbnRpZmllZC1QYXlsb2FkLVR5cGUnXVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBnZXQgd2FyY1NlZ21lbnRPcmlnaW5JRCAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1TZWdtZW50LU9yaWdpbi1JRCddXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7P3N0cmluZ31cbiAgICovXG4gIGdldCB3YXJjU2VnbWVudE51bWJlciAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2FyY0hlYWRlclsnV0FSQy1TZWdtZW50LU51bWJlciddXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7P3N0cmluZ31cbiAgICovXG4gIGdldCB3YXJjU2VnbWVudFRvdGFsTGVuZ3RoICgpIHtcbiAgICByZXR1cm4gdGhpcy53YXJjSGVhZGVyWydXQVJDLVNlZ21lbnQtVG90YWwtTGVuZ3RoJ11cbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDUmVjb3JkfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IFdBUkNSZWNvcmRcbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgeyBTUEFDRSB9ID0gcmVxdWlyZSgnLi4vdXRpbHMvY29uc3RhbnRzJylcbmNvbnN0IFdGSSA9IHJlcXVpcmUoJy4vZmllbGRJZGVudGlmaWVycycpXG5cbi8qKlxuICogQHR5cGUge0J1ZmZlcn1cbiAqL1xuY29uc3QgV0FSQ1ZTbGFzaCA9IEJ1ZmZlci5mcm9tKCcvJylcblxuLyoqXG4gKiBAdHlwZSB7QnVmZmVyfVxuICovXG5jb25zdCBDb2xvblNwYWNlID0gQnVmZmVyLmZyb20oJzogJylcblxuLyoqXG4gKiBAdHlwZSB7QnVmZmVyfVxuICovXG5jb25zdCBDUkxGID0gV0ZJLmNybGZcblxuLyoqXG4gKiBAZGVzYyBVdGlsaXR5IGNsYXNzIGZvciBwYXJzaW5nIHBhcnRzIG9mIFdBUkMgcmVjb3Jkc1xuICovXG5jbGFzcyBDb250ZW50UGFyc2VyIHtcbiAgLyoqXG4gICAqIEBkZXNjIFNsaWNlcyB0aGUgc3VwcGxpZWQgYnVmZmVyIHJldHVybmluZyBhIFVURi04IHN0cmluZ1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmICAgLSBUaGUgYnVmZmVyIHRvIHNsaWNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc2xpY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCAgIC0gVGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgc2xpY2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIHV0ZjhCdWZmZXJTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIGJ1Zi5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZygndXRmOCcpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVuZCBvZiB0aGUgc3VwcGxpZWQgYnVmZmVyIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBgXFxyXFxuYFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmICAgIC0gVGhlIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBjb3JyZWN0IGVuZCBpbmRleCBmb3JcbiAgICogQHBhcmFtIHtudW1iZXJ9IGJ1ZkxlbiAtIFRoZSBmdWxsIGxlbmd0aCBvZiB0aGUgYnVmZmVyXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHN0YXRpYyBidWZFbmRQb3NOb0NSTEYgKGJ1ZiwgYnVmTGVuKSB7XG4gICAgaWYgKGJ1ZltidWZMZW4gLSAyXSA9PT0gQ1JMRlswXSAmJiBidWZbYnVmTGVuIC0gMV0gPT09IENSTEZbMV0pIHtcbiAgICAgIHJldHVybiBidWZMZW4gLSAyXG4gICAgfVxuICAgIHJldHVybiBidWZMZW5cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBQYXJzZXMgdGhlIEhUVFAgaW5mb3JtYXRpb24gb2YgV0FSQyByZXF1ZXN0IGFuZCByZXNwb25zZSByZWNvcmRzXG4gICAqIEBwYXJhbSB7QnVmZmVyW119IGJ1ZnMgLSBCdWZmZXJzIGNvbnRhaW5pbmcgdGhlIEhUVFAgaGVhZGVyIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxICAgLSBTaG91bGQgdGhlIGJ1ZmZlcnMgYmUgcGFyc2VkIGFzIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAgICogQHJldHVybnMge1JlcXVlc3RIVFRQfFJlc3BvbnNlSFRUUH1cbiAgICovXG4gIHN0YXRpYyBwYXJzZUhUVFBQb3J0aW9uIChidWZzLCByZXEpIHtcbiAgICBpZiAocmVxKSByZXR1cm4gQ29udGVudFBhcnNlci5wYXJzZVJlcUhUVFAoYnVmcylcbiAgICByZXR1cm4gQ29udGVudFBhcnNlci5wYXJzZVJlc0hUVFAoYnVmcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBQYXJzZSBhIFdBUkMgUmVjb3JkcyBoZWFkZXJzIG5vdCBIVFRQIEhlYWRlciBwYXJzZXJcbiAgICogQHBhcmFtIHtCdWZmZXJbXX0gYnVmcyAtIHRoZSBXQVJDIFJlY29yZHMgaGVhZGVyIGxpbmVzXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBwYXJzZVdhcmNSZWNvcmRIZWFkZXIgKGJ1ZnMpIHtcbiAgICBsZXQgcmhlYWRlciA9IHt9XG4gICAgbGV0IGxlbiA9IGJ1ZnMubGVuZ3RoXG4gICAgbGV0IGkgPSAwXG4gICAgbGV0IGN1cnJlbnRCdWZmZXJcbiAgICBsZXQgY3VyTGVuXG4gICAgbGV0IHNlcFBvc1xuICAgIGxldCBoZWFkZXJLZXlcbiAgICBsZXQgaGVhZGVyVmFsdWVcbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgY3VycmVudEJ1ZmZlciA9IGJ1ZnNbaV1cbiAgICAgIGN1ckxlbiA9IGN1cnJlbnRCdWZmZXIubGVuZ3RoXG4gICAgICBzZXBQb3MgPSBjdXJyZW50QnVmZmVyLmluZGV4T2YoQ29sb25TcGFjZSlcbiAgICAgIGlmIChzZXBQb3MgIT09IC0xKSB7XG4gICAgICAgIGhlYWRlcktleSA9IENvbnRlbnRQYXJzZXIudXRmOEJ1ZmZlclNsaWNlKGN1cnJlbnRCdWZmZXIsIDAsIHNlcFBvcylcbiAgICAgICAgaGVhZGVyVmFsdWUgPSBDb250ZW50UGFyc2VyLnV0ZjhCdWZmZXJTbGljZShcbiAgICAgICAgICBjdXJyZW50QnVmZmVyLFxuICAgICAgICAgIHNlcFBvcyArIDIsXG4gICAgICAgICAgQ29udGVudFBhcnNlci5idWZFbmRQb3NOb0NSTEYoY3VycmVudEJ1ZmZlciwgY3VyTGVuKVxuICAgICAgICApXG4gICAgICAgIHJoZWFkZXJbaGVhZGVyS2V5XSA9IGhlYWRlclZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByaGVhZGVyWydXQVJDJ10gPSBDb250ZW50UGFyc2VyLnV0ZjhCdWZmZXJTbGljZShcbiAgICAgICAgICBjdXJyZW50QnVmZmVyLFxuICAgICAgICAgIGN1cnJlbnRCdWZmZXIuaW5kZXhPZihXQVJDVlNsYXNoKSArIDEsXG4gICAgICAgICAgQ29udGVudFBhcnNlci5idWZFbmRQb3NOb0NSTEYoY3VycmVudEJ1ZmZlciwgY3VyTGVuKVxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpKytcbiAgICB9XG4gICAgcmV0dXJuIHJoZWFkZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBQYXJzZSBhIFdBUkMgTWV0YWRhdGEgcmVjb3JkcyBtZXRhZGF0YSBjb250ZW50XG4gICAqIEBwYXJhbSB7QnVmZmVyW119IGJ1ZnMgLSB0aGUgV0FSQyBNZXRhZGF0YSByZWNvcmRzIGNvbnRlbnQgbGluZXNcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIHBhcnNlV2FyY0luZm9NZXRhRGF0YUNvbnRlbnQgKGJ1ZnMpIHtcbiAgICBsZXQgY29udGVudCA9IHt9XG4gICAgbGV0IGxlbiA9IGJ1ZnMubGVuZ3RoXG4gICAgbGV0IGkgPSAwXG4gICAgbGV0IHNlcFBvc1xuICAgIGxldCBrZXlcbiAgICBsZXQgdmFsdWVcbiAgICBsZXQgY3VycmVudEJ1ZmZlclxuICAgIGxldCBjdXJMZW5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgY3VycmVudEJ1ZmZlciA9IGJ1ZnNbaV1cbiAgICAgIGN1ckxlbiA9IGN1cnJlbnRCdWZmZXIubGVuZ3RoXG4gICAgICBzZXBQb3MgPSBjdXJyZW50QnVmZmVyLmluZGV4T2YoQ29sb25TcGFjZSlcbiAgICAgIGlmIChzZXBQb3MgIT09IC0xKSB7XG4gICAgICAgIGtleSA9IENvbnRlbnRQYXJzZXIudXRmOEJ1ZmZlclNsaWNlKGN1cnJlbnRCdWZmZXIsIDAsIHNlcFBvcylcbiAgICAgICAgdmFsdWUgPSBDb250ZW50UGFyc2VyLnV0ZjhCdWZmZXJTbGljZShcbiAgICAgICAgICBjdXJyZW50QnVmZmVyLFxuICAgICAgICAgIHNlcFBvcyArIDIsXG4gICAgICAgICAgQ29udGVudFBhcnNlci5idWZFbmRQb3NOb0NSTEYoY3VycmVudEJ1ZmZlciwgY3VyTGVuKVxuICAgICAgICApXG4gICAgICAgIGlmIChrZXkgPT09ICdvdXRsaW5rJykge1xuICAgICAgICAgIGlmIChjb250ZW50Lm91dGxpbmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGVudC5vdXRsaW5rID0gW11cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGVudC5vdXRsaW5rLnB1c2godmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGVudFtrZXldID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBDb250ZW50UGFyc2VyLnV0ZjhCdWZmZXJTbGljZShcbiAgICAgICAgICBjdXJyZW50QnVmZmVyLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgQ29udGVudFBhcnNlci5idWZFbmRQb3NOb0NSTEYoY3VycmVudEJ1ZmZlciwgY3VyTGVuKVxuICAgICAgICApXG4gICAgICAgIGlmIChjb250ZW50LnVua2V5ZWQgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRlbnQudW5rZXllZCA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgY29udGVudC51bmtleWVkLnB1c2godmFsdWUpXG4gICAgICB9XG4gICAgICBpKytcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBQYXJzZXMgdGhlIHJlcXVlc3QgSFRUUCBoZWFkZXJzXG4gICAqIEBwYXJhbSB7QnVmZmVyW119IGhlYWRlckJ1ZmZzIC0gdGhlIHJlcXVlc3QgSFRUUCBoZWFkZXJzXG4gICAqIEByZXR1cm4ge1JlcXVlc3RIVFRQfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlUmVxSFRUUCAoaGVhZGVyQnVmZnMpIHtcbiAgICBjb25zdCBjb250ZW50ID0ge1xuICAgICAgcmVxdWVzdExpbmU6IG51bGwsXG4gICAgICBwYXRoOiBudWxsLFxuICAgICAgbWV0aG9kOiBudWxsLFxuICAgICAgaHR0cFZlcnNpb246IG51bGwsXG4gICAgICBoZWFkZXJzOiBudWxsXG4gICAgfVxuICAgIGlmIChoZWFkZXJCdWZmcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgfVxuICAgIGxldCBjdXJyZW50QnVmZmVyID0gaGVhZGVyQnVmZnNbMF1cbiAgICBsZXQgY3VyTGVuID0gY3VycmVudEJ1ZmZlci5sZW5ndGhcbiAgICBsZXQgcmVxdWVzdExpbmUgPSBDb250ZW50UGFyc2VyLnV0ZjhCdWZmZXJTbGljZShcbiAgICAgIGN1cnJlbnRCdWZmZXIsXG4gICAgICAwLFxuICAgICAgQ29udGVudFBhcnNlci5idWZFbmRQb3NOb0NSTEYoY3VycmVudEJ1ZmZlciwgY3VyTGVuKVxuICAgIClcbiAgICBjb250ZW50LnJlcXVlc3RMaW5lID0gcmVxdWVzdExpbmVcbiAgICBsZXQgc3BhY2VJRFggPSByZXF1ZXN0TGluZS5pbmRleE9mKFNQQUNFKVxuICAgIGNvbnRlbnQubWV0aG9kID0gcmVxdWVzdExpbmUuc3Vic3RyaW5nKDAsIHNwYWNlSURYKVxuICAgIGxldCBsYXN0SURYID0gc3BhY2VJRFggKyAxXG4gICAgc3BhY2VJRFggPSByZXF1ZXN0TGluZS5pbmRleE9mKFNQQUNFLCBsYXN0SURYKVxuICAgIGNvbnRlbnQucGF0aCA9IHJlcXVlc3RMaW5lLnN1YnN0cmluZyhsYXN0SURYLCBzcGFjZUlEWClcbiAgICBjb250ZW50Lmh0dHBWZXJzaW9uID0gcmVxdWVzdExpbmUuc3Vic3RyaW5nKHNwYWNlSURYICsgMSlcbiAgICBjb250ZW50LmhlYWRlcnMgPSBDb250ZW50UGFyc2VyLl9wYXJzZUhlYWRlcnMoaGVhZGVyQnVmZnMpXG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBQYXJzZXMgdGhlIHJlc3BvbnNlIEhUVFAgaGVhZGVyc1xuICAgKiBAcGFyYW0ge0J1ZmZlcltdfSBoZWFkZXJCdWZmcyAtIHRoZSByZXNwb25zZSBIVFRQIGhlYWRlcnNcbiAgICogQHJldHVybiB7UmVzcG9uc2VIVFRQfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlUmVzSFRUUCAoaGVhZGVyQnVmZnMpIHtcbiAgICBjb25zdCBjb250ZW50ID0ge1xuICAgICAgc3RhdHVzTGluZTogbnVsbCxcbiAgICAgIHN0YXR1c0NvZGU6IG51bGwsXG4gICAgICBzdGF0dXNSZWFzb246IG51bGwsXG4gICAgICBodHRwVmVyc2lvbjogbnVsbCxcbiAgICAgIGhlYWRlcnM6IG51bGxcbiAgICB9XG4gICAgaWYgKGhlYWRlckJ1ZmZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICB9XG4gICAgbGV0IGN1cnJlbnRCdWZmZXIgPSBoZWFkZXJCdWZmc1swXVxuICAgIGxldCBjdXJMZW4gPSBjdXJyZW50QnVmZmVyLmxlbmd0aFxuICAgIGxldCBzdGF0dXNMaW5lID0gQ29udGVudFBhcnNlci51dGY4QnVmZmVyU2xpY2UoXG4gICAgICBjdXJyZW50QnVmZmVyLFxuICAgICAgMCxcbiAgICAgIENvbnRlbnRQYXJzZXIuYnVmRW5kUG9zTm9DUkxGKGN1cnJlbnRCdWZmZXIsIGN1ckxlbilcbiAgICApXG4gICAgY29udGVudC5zdGF0dXNMaW5lID0gc3RhdHVzTGluZVxuICAgIGxldCBzcGFjZUlEWCA9IHN0YXR1c0xpbmUuaW5kZXhPZihTUEFDRSlcbiAgICBjb250ZW50Lmh0dHBWZXJzaW9uID0gc3RhdHVzTGluZS5zdWJzdHJpbmcoMCwgc3BhY2VJRFgpXG4gICAgbGV0IGxhc3RJRFggPSBzcGFjZUlEWCArIDFcbiAgICBzcGFjZUlEWCA9IHN0YXR1c0xpbmUuaW5kZXhPZihTUEFDRSwgbGFzdElEWClcbiAgICBjb250ZW50LnN0YXR1c0NvZGUgPSBzdGF0dXNMaW5lLnN1YnN0cmluZyhsYXN0SURYLCBzcGFjZUlEWClcbiAgICBjb250ZW50LnN0YXR1c1JlYXNvbiA9IHN0YXR1c0xpbmUuc3Vic3RyaW5nKHNwYWNlSURYICsgMSlcbiAgICBjb250ZW50LmhlYWRlcnMgPSBDb250ZW50UGFyc2VyLl9wYXJzZUhlYWRlcnMoaGVhZGVyQnVmZnMpXG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBQYXJzZXMgYW4gYXJyYXkgb2YgYnVmZmVycyBjb250YWluaW5nIEhUVFAgaGVhZGVyc1xuICAgKiBAcGFyYW0ge0J1ZmZlcltdfSBoZWFkZXJCdWZmcyAtIFRoZSBhcnJheSBvZiBidWZmZXJzIHJlcHJlc2VudGluZyBIVFRQIGhlYWRlcnNcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIF9wYXJzZUhlYWRlcnMgKGhlYWRlckJ1ZmZzKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgbGV0IGxlbiA9IGhlYWRlckJ1ZmZzLmxlbmd0aFxuICAgIGxldCBpID0gMVxuICAgIGxldCBrZXlcbiAgICBsZXQgbGFzdEtleSA9ICcnXG4gICAgbGV0IHNlcFBvc1xuICAgIGxldCBjdXJyZW50QnVmZmVyXG4gICAgbGV0IGN1ckxlblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjdXJyZW50QnVmZmVyID0gaGVhZGVyQnVmZnNbaV1cbiAgICAgIGN1ckxlbiA9IGN1cnJlbnRCdWZmZXIubGVuZ3RoXG4gICAgICBzZXBQb3MgPSBjdXJyZW50QnVmZmVyLmluZGV4T2YoQ29sb25TcGFjZSlcbiAgICAgIGlmIChzZXBQb3MgIT09IC0xKSB7XG4gICAgICAgIGtleSA9IENvbnRlbnRQYXJzZXIudXRmOEJ1ZmZlclNsaWNlKGN1cnJlbnRCdWZmZXIsIDAsIHNlcFBvcylcbiAgICAgICAgbGFzdEtleSA9IGtleVxuICAgICAgICBoZWFkZXJzW2tleV0gPSBDb250ZW50UGFyc2VyLnV0ZjhCdWZmZXJTbGljZShcbiAgICAgICAgICBjdXJyZW50QnVmZmVyLFxuICAgICAgICAgIHNlcFBvcyArIDIsXG4gICAgICAgICAgQ29udGVudFBhcnNlci5idWZFbmRQb3NOb0NSTEYoY3VycmVudEJ1ZmZlciwgY3VyTGVuKVxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFkZXJzW2xhc3RLZXldID0gQ29udGVudFBhcnNlci51dGY4QnVmZmVyU2xpY2UoXG4gICAgICAgICAgY3VycmVudEJ1ZmZlcixcbiAgICAgICAgICAwLFxuICAgICAgICAgIENvbnRlbnRQYXJzZXIuYnVmRW5kUG9zTm9DUkxGKGN1cnJlbnRCdWZmZXIsIGN1ckxlbilcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaSsrXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7Q29udGVudFBhcnNlcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBDb250ZW50UGFyc2VyXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUmVxdWVzdEhUVFBcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcmVxdWVzdExpbmUgLSBUaGUgSFRUUCByZXF1ZXN0IGxpbmVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSByZXF1ZXN0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1ldGhvZCAtIFRoZSBIVFRQIG1ldGhvZCB1c2VkXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGh0dHBWZXJzaW9uIC0gVGhlIEhUVFAgdmVyc2lvblxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIC0gVGhlIHBhcnNlZCBoZWFkZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZXNwb25zZUhUVFBcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gc3RhdHVzTGluZSAtIFRoZSBIVFRQIHJlc3BvbnNlIGxpbmVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gc3RhdHVzQ29kZSAtIFRoZSByZXNwb25zZSBjb2RlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHN0YXR1c1JlYXNvbiAtIFRoZSBzdGF0dXMgcmVhc29uXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGh0dHBWZXJzaW9uIC0gVGhlIEhUVFAgdmVyc2lvblxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIC0gVGhlIHBhcnNlZCBoZWFkZXJzXG4gKi9cbiIsImNvbnN0IGdldFN0cmVhbSA9IHJlcXVpcmUoJy4uL3V0aWxzL2dldFN0cmVhbScpLmdldFN0cmVhbVxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKVxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpXG5jb25zdCBXQVJDU3RyZWFtVHJhbnNmb3JtID0gcmVxdWlyZSgnLi93YXJjU3RyZWFtVHJhbnNmb3JtJylcbmNvbnN0IGNhblVzZVJlY29yZEl0ZXJhdG9yID0gcmVxdWlyZSgnLi9fY2FuVXNlUmVjb3JkSXRlcmF0b3InKVxuXG4vKipcbiAqIEBkZXNjIFBhcnNlIGEgV0FSQy5neiBmaWxlXG4gKiBAZXh0ZW5kcyB7RXZlbnRFbWl0dGVyfVxuICogQGV4YW1wbGVcbiAqICBjb25zdCBwYXJzZXIgPSBuZXcgV0FSQ0d6UGFyc2VyKCc8cGF0aC10by13YXJjZmlsZT4nKVxuICogIHBhcnNlci5vbigncmVjb3JkJywgcmVjb3JkID0+IHsgY29uc29sZS5sb2cocmVjb3JkKTsgfSlcbiAqICBwYXJzZXIub24oJ2RvbmUnLCAoKSA9PiB7IGNvbnNvbGUubG9nKCdmaW5pc2hlZCcpOyB9KVxuICogIHBhcnNlci5vbignZXJyb3InLCBlcnJvciA9PiB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpOyB9KVxuICogIHBhcnNlci5zdGFydCgpXG4gKiBAZXhhbXBsZVxuICogIGNvbnN0IHBhcnNlciA9IG5ldyBXQVJDR3pQYXJzZXIoKVxuICogIHBhcnNlci5vbigncmVjb3JkJywgcmVjb3JkID0+IHsgY29uc29sZS5sb2cocmVjb3JkKTsgfSlcbiAqICBwYXJzZXIub24oJ2RvbmUnLCAoKSA9PiB7IGNvbnNvbGUubG9nKCdmaW5pc2hlZCcpOyB9KVxuICogIHBhcnNlci5vbignZXJyb3InLCBlcnJvciA9PiB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpOyB9KVxuICogIHBhcnNlci5wYXJzZVdBUkMoJzxwYXRoLXRvLXdhcmNmaWxlPicpXG4gKiBAZXhhbXBsZVxuICogIC8vIHJlcXVpcmVzIG5vZGUgPj0gMTBcbiAqICBmb3IgYXdhaXQgKGNvbnN0IHJlY29yZCBvZiBuZXcgV0FSQ0d6UGFyc2VyKCc8cGF0aC10by13YXJjZmlsZT4nKSkge1xuICogICAgY29uc29sZS5sb2cocmVjb3JkKVxuICogIH1cbiAqL1xuY2xhc3MgV0FSQ0d6UGFyc2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjIENyZWF0ZSBhIG5ldyBXQVJDR3pQYXJzZXJcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBbd3BdIC0gcGF0aCB0byB0aGUgd2FyYy5neiBmaWxlIHRvIGJlIHBhcnNlZFxuICAgKi9cbiAgY29uc3RydWN0b3IgKHdwKSB7XG4gICAgc3VwZXIoKVxuICAgIC8qKlxuICAgICAqIEB0eXBlIHs/c3RyaW5nfSB0aGUgcGF0aCB0byB0aGUgV0FSQy5neiBmaWxlIHRvIGJlIHBhcnNlZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fd3AgPSB3cFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59IGlzIHRoZSBwYXJzZXIgY3VycmVudGx5IHBhcnNpbmcgdGhlIFdBUkMuZ3pcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNpbmcgPSBmYWxzZVxuICAgIHRoaXMuX29uUmVjb3JkID0gdGhpcy5fb25SZWNvcmQuYmluZCh0aGlzKVxuICAgIHRoaXMuX29uRXJyb3IgPSB0aGlzLl9vbkVycm9yLmJpbmQodGhpcylcbiAgICB0aGlzLl9vbkVuZCA9IHRoaXMuX29uRW5kLmJpbmQodGhpcylcbiAgICBpZiAoY2FuVXNlUmVjb3JkSXRlcmF0b3IpIHtcbiAgICAgIGNvbnN0IHJlY29yZEl0ZXJhdG9yID0gcmVxdWlyZSgnLi9yZWNvcmR0ZXJhdG9yJylcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybnMge0FzeW5jSXRlcmF0b3I8V0FSQ1JlY29yZD59XG4gICAgICAgKi9cbiAgICAgIHRoaXNbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkSXRlcmF0b3IoXG4gICAgICAgICAgZ2V0U3RyZWFtKHRoaXMuX3dwKS5waXBlKHpsaWIuY3JlYXRlR3VuemlwKCkpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQmVnaW4gcGFyc2luZyB0aGUgV0FSQy5neiBmaWxlLiBPbmNlIHRoZSBzdGFydCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHRoZSBwYXJzZXIgd2lsbCBiZWdpbiBlbWl0dGluZ1xuICAgKiBAZW1pdHMge3JlY29yZH0gZW1pdHRlZCB3aGVuIHRoZSBwYXJzZXIgaGFzIHBhcnNlZCBhIGZ1bGwgcmVjb3JkLCB0aGUgYXJndW1lbnQgc3VwcGxpZWQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIHBhcnNlZCByZWNvcmRcbiAgICogQGVtaXRzIHtkb25lfSBlbWl0dGVkIHdoZW4gdGhlIFdBUkMuZ3ogZmlsZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHBhcnNlZCwgdGhlIGFyZ3VtZW50IHN1cHBsaWVkIHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIGxhc3QgcmVjb3JkXG4gICAqIEBlbWl0cyB7ZXJyb3J9IGVtaXR0ZWQgaWYgYW4gZXhjZXB0aW9uIG9jY3VycywgdGhlIGFyZ3VtZW50IHN1cHBsaWVkIHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBpbmRpY2F0aW9uIGlmIHRoZSBwYXJzZXIgaGFzIGJlZ3VuIG9yIGlzIGN1cnJlbnRseSBwYXJzaW5nIGEgV0FSQy5neiBmaWxlXG4gICAqIC0gdHJ1ZTogaW5kaWNhdGVzIHRoZSBwYXJzZXIgaGFzIGJlZ3VuIHBhcnNpbmcgdGhlIFdBUkMuZ3ogZmlsZSB0cnVlXG4gICAqIC0gZmFsc2U6IGluZGljYXRlZCB0aGUgcGFyc2VyIGlzIGN1cnJlbnRseSBwYXJzaW5nIGEgV0FSQy5neiBmaWxlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgcGF0aCB0byB0aGUgV0FSQy5neiBmaWxlIGlzIG51bGwgb3IgdW5kZWZpbmVkIG9yIGFub3RoZXIgZXJyb3Igb2NjdXJyZWRcbiAgICovXG4gIHN0YXJ0ICgpIHtcbiAgICBsZXQgc3RhcnQgPSBmYWxzZVxuICAgIGlmICghdGhpcy5fcGFyc2luZykge1xuICAgICAgaWYgKHRoaXMuX3dwID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcGF0aCB0byB0aGUgV0FSQyBmaWxlIGlzIG51bGwvdW5kZWZpbmVkJylcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BhcnNpbmcgPSB0cnVlXG4gICAgICBzdGFydCA9IHRydWVcbiAgICAgIGdldFN0cmVhbSh0aGlzLl93cCwgdHJ1ZSlcbiAgICAgICAgLnBpcGUoemxpYi5jcmVhdGVHdW56aXAoKSlcbiAgICAgICAgLnBpcGUobmV3IFdBUkNTdHJlYW1UcmFuc2Zvcm0oKSlcbiAgICAgICAgLm9uKCdkYXRhJywgdGhpcy5fb25SZWNvcmQpXG4gICAgICAgIC5vbignZXJyb3InLCB0aGlzLl9vbkVycm9yKVxuICAgICAgICAub24oJ2VuZCcsIHRoaXMuX29uRW5kKVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBDYWxsYmFjayBmb3IgdGhlIHJlYWQgc3RyZWFtIGRhdGEgZXZlbnRcbiAgICogQHBhcmFtIHtXQVJDUmVjb3JkfSByZWNvcmRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vblJlY29yZCAocmVjb3JkKSB7XG4gICAgdGhpcy5lbWl0KCdyZWNvcmQnLCByZWNvcmQpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQ2FsbGJhY2sgZm9yIHRoZSByZWFkIHN0cmVhbSBlcnJvciBldmVudFxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uRXJyb3IgKGVycm9yKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIENhbGxiYWNrIGZvciB0aGUgcmVhZCBzdHJlYW0gZW5kIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25FbmQgKCkge1xuICAgIHRoaXMuX3BhcnNpbmcgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgnZG9uZScpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQWxpYXMgZm9yIHtAbGluayBzdGFydH0gZXhjZXB0IHRoYXQgeW91IGNhbiBzdXBwbHkgdGhlIHBhdGggdG8gdGhlIFdBUkMuZ3ogZmlsZSB0byBiZSBwYXJzZWRcbiAgICogaWYgb25lIHdhcyBub3Qgc3VwcGxpZWQgdmlhIHRoZSBjb25zdHJ1Y3RvciBvciB0byBwYXJzZSBhbm90aGVyIFdBUkMuZ3ogZmlsZS4gSWYgdGhlIHBhdGggdG8gV0FSQy5neiBmaWxlXG4gICAqIHRvIGJlIHBhcnNlZCB3YXMgc3VwcGxpZWQgdmlhIHRoZSBjb25zdHJ1Y3RvciBhbmQgeW91IHN1cHBseSBhIGRpZmZlcmVudCBwYXRoIHRvIHRoaXMgbWV0aG9kLlxuICAgKiBJdCB3aWxsIG92ZXJyaWRlIHRoZSBvbmUgc3VwcGxpZWQgdmlhIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gez9zdHJpbmd9IFt3cF0gLSBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgdG8gYmUgcGFyc2VkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGluZGljYXRpb24gaWYgdGhlIHBhcnNlciBoYXMgYmVndW4gb3IgaXMgY3VycmVudGx5IHBhcnNpbmcgYSBXQVJDLmd6IGZpbGVcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBwYXRoIHRvIHRoZSBXQVJDLmd6IGZpbGUgaXMgbnVsbCBvciB1bmRlZmluZWQgb3IgYW5vdGhlciBlcnJvciBvY2N1cnJlZFxuICAgKi9cbiAgcGFyc2VXQVJDICh3cCkge1xuICAgIGlmICghdGhpcy5fcGFyc2luZykge1xuICAgICAgdGhpcy5fd3AgPSB3cCB8fCB0aGlzLl93cFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGFydCgpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7V0FSQ0d6UGFyc2VyfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IFdBUkNHelBhcnNlclxuIiwiY29uc3QgZ2V0U3RyZWFtID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJykuZ2V0U3RyZWFtXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJylcbmNvbnN0IFdBUkNTdHJlYW1UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL3dhcmNTdHJlYW1UcmFuc2Zvcm0nKVxuY29uc3QgY2FuVXNlUmVjb3JkSXRlcmF0b3IgPSByZXF1aXJlKCcuL19jYW5Vc2VSZWNvcmRJdGVyYXRvcicpXG5cbi8qKlxuICogQGRlc2MgUGFyc2UgYSBXQVJDIGZpbGVcbiAqIEBleHRlbmRzIHtFdmVudEVtaXR0ZXJ9XG4gKiBAZXhhbXBsZVxuICogIGNvbnN0IHBhcnNlciA9IG5ldyBXQVJDUGFyc2VyKCc8cGF0aC10by13YXJjZmlsZT4nKVxuICogIHBhcnNlci5vbigncmVjb3JkJywgcmVjb3JkID0+IHsgY29uc29sZS5sb2cocmVjb3JkKSB9KVxuICogIHBhcnNlci5vbignZG9uZScsICgpID0+IHsgY29uc29sZS5sb2coJ2RvbmUnKSB9KVxuICogIHBhcnNlci5vbignZXJyb3InLCBlcnJvciA9PiB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpIH0pXG4gKiAgcGFyc2VyLnN0YXJ0KClcbiAqIEBleGFtcGxlXG4gKiAgY29uc3QgcGFyc2VyID0gbmV3IFdBUkNQYXJzZXIoKVxuICogIHBhcnNlci5vbigncmVjb3JkJywgcmVjb3JkID0+IHsgY29uc29sZS5sb2cocmVjb3JkKSB9KVxuICogIHBhcnNlci5vbignZG9uZScsICgpID0+IHsgY29uc29sZS5sb2coJ2RvbmUnKSB9KVxuICogIHBhcnNlci5vbignZXJyb3InLCBlcnJvciA9PiB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpIH0pXG4gKiAgcGFyc2VyLnBhcnNlV0FSQygnPHBhdGgtdG8td2FyY2ZpbGU+JylcbiAqIEBleGFtcGxlXG4gKiAgLy8gcmVxdWlyZXMgbm9kZSA+PSAxMFxuICogIGZvciBhd2FpdCAoY29uc3QgcmVjb3JkIG9mIG5ldyBXQVJDUGFyc2VyKCc8cGF0aC10by13YXJjZmlsZT4nKSkge1xuICogICAgY29uc29sZS5sb2cocmVjb3JkKVxuICogIH1cbiAqL1xuY2xhc3MgV0FSQ1BhcnNlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAZGVzYyBDcmVhdGUgYSBuZXcgV0FSQ1BhcnNlclxuICAgKiBAcGFyYW0gez9zdHJpbmd9IFt3cF0gLSBwYXRoIHRvIHRoZSB3YXJjIGZpbGUgdG8gYmUgcGFyc2VkXG4gICAqL1xuICBjb25zdHJ1Y3RvciAod3ApIHtcbiAgICBzdXBlcigpXG4gICAgLyoqXG4gICAgICogQHR5cGUgez9zdHJpbmd9IHRoZSBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgdG8gYmUgcGFyc2VkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl93cCA9IHdwXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gaXMgdGhlIHBhcnNlciBjdXJyZW50bHkgcGFyc2luZyB0aGUgV0FSQ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2luZyA9IGZhbHNlXG4gICAgdGhpcy5fb25SZWNvcmQgPSB0aGlzLl9vblJlY29yZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5fb25FcnJvciA9IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKVxuICAgIHRoaXMuX29uRW5kID0gdGhpcy5fb25FbmQuYmluZCh0aGlzKVxuICAgIGlmIChjYW5Vc2VSZWNvcmRJdGVyYXRvcikge1xuICAgICAgY29uc3QgcmVjb3JkSXRlcmF0b3IgPSByZXF1aXJlKCcuL3JlY29yZHRlcmF0b3InKVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJucyB7QXN5bmNJdGVyYXRvcjxXQVJDUmVjb3JkPn1cbiAgICAgICAqL1xuICAgICAgdGhpc1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiByZWNvcmRJdGVyYXRvcihnZXRTdHJlYW0odGhpcy5fd3ApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQmVnaW4gcGFyc2luZyB0aGUgV0FSQyBmaWxlLiBPbmNlIHRoZSBzdGFydCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHRoZSBwYXJzZXIgd2lsbCBiZWdpbiBlbWl0dGluZ1xuICAgKiBAZW1pdHMge3JlY29yZH0gZW1pdHRlZCB3aGVuIHRoZSBwYXJzZXIgaGFzIHBhcnNlZCBhIGZ1bGwgcmVjb3JkLCB0aGUgYXJndW1lbnQgc3VwcGxpZWQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIHBhcnNlZCByZWNvcmRcbiAgICogQGVtaXRzIHtkb25lfSBlbWl0dGVkIHdoZW4gdGhlIFdBUkMgZmlsZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHBhcnNlZCwgdGhlIGFyZ3VtZW50IHN1cHBsaWVkIHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIGxhc3QgcmVjb3JkXG4gICAqIEBlbWl0cyB7ZXJyb3J9IGVtaXR0ZWQgaWYgYW4gZXhjZXB0aW9uIG9jY3VycywgdGhlIGFyZ3VtZW50IHN1cHBsaWVkIHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBpbmRpY2F0aW9uIGlmIHRoZSBwYXJzZXIgaGFzIGJlZ3VuIG9yIGlzIGN1cnJlbnRseSBwYXJzaW5nIGEgV0FSQyBmaWxlXG4gICAqIC0gdHJ1ZTogaW5kaWNhdGVzIHRoZSBwYXJzZXIgaGFzIGJlZ3VuIHBhcnNpbmcgdGhlIFdBUkMgZmlsZSB0cnVlXG4gICAqIC0gZmFsc2U6IGluZGljYXRlZCB0aGUgcGFyc2VyIGlzIGN1cnJlbnRseSBwYXJzaW5nIGEgV0FSQyBmaWxlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgcGF0aCB0byB0aGUgV0FSQyBmaWxlIGlzIG51bGwgb3IgdW5kZWZpbmVkIG9yIGFub3RoZXIgZXJyb3Igb2NjdXJyZWRcbiAgICovXG4gIHN0YXJ0ICgpIHtcbiAgICBsZXQgc3RhcnQgPSBmYWxzZVxuICAgIGlmICghdGhpcy5fcGFyc2luZykge1xuICAgICAgaWYgKHRoaXMuX3dwID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcGF0aCB0byB0aGUgV0FSQyBmaWxlIGlzIG51bGwvdW5kZWZpbmVkJylcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BhcnNpbmcgPSB0cnVlXG4gICAgICBzdGFydCA9IHRydWVcbiAgICAgIGdldFN0cmVhbSh0aGlzLl93cClcbiAgICAgICAgLnBpcGUobmV3IFdBUkNTdHJlYW1UcmFuc2Zvcm0oKSlcbiAgICAgICAgLm9uKCdkYXRhJywgdGhpcy5fb25SZWNvcmQpXG4gICAgICAgIC5vbignZXJyb3InLCB0aGlzLl9vbkVycm9yKVxuICAgICAgICAub24oJ2VuZCcsIHRoaXMuX29uRW5kKVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBDYWxsYmFjayBmb3IgdGhlIHJlYWQgc3RyZWFtIGRhdGEgZXZlbnRcbiAgICogQHBhcmFtIHtXQVJDUmVjb3JkfSByZWNvcmRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vblJlY29yZCAocmVjb3JkKSB7XG4gICAgdGhpcy5lbWl0KCdyZWNvcmQnLCByZWNvcmQpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQ2FsbGJhY2sgZm9yIHRoZSByZWFkIHN0cmVhbSBlcnJvciBldmVudFxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uRXJyb3IgKGVycm9yKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIENhbGxiYWNrIGZvciB0aGUgcmVhZCBzdHJlYW0gZW5kIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25FbmQgKCkge1xuICAgIHRoaXMuX3BhcnNpbmcgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgnZG9uZScpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQWxpYXMgZm9yIHtAbGluayBzdGFydH0gZXhjZXB0IHRoYXQgeW91IGNhbiBzdXBwbHkgdGhlIHBhdGggdG8gdGhlIFdBUkMgZmlsZSB0byBiZSBwYXJzZWRcbiAgICogaWYgb25lIHdhcyBub3Qgc3VwcGxpZWQgdmlhIHRoZSBjb25zdHJ1Y3RvciBvciB0byBwYXJzZSBhbm90aGVyIFdBUkMgZmlsZS4gSWYgdGhlIHBhdGggdG8gV0FSQyBmaWxlXG4gICAqIHRvIGJlIHBhcnNlZCB3YXMgc3VwcGxpZWQgdmlhIHRoZSBjb25zdHJ1Y3RvciBhbmQgeW91IHN1cHBseSBhIGRpZmZlcmVudCBwYXRoIHRvIHRoaXMgbWV0aG9kLlxuICAgKiBJdCB3aWxsIG92ZXJyaWRlIHRoZSBvbmUgc3VwcGxpZWQgdmlhIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gez9zdHJpbmd9IFt3cF0gLSBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgdG8gYmUgcGFyc2VkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGluZGljYXRpb24gaWYgdGhlIHBhcnNlciBoYXMgYmVndW4gb3IgaXMgY3VycmVudGx5IHBhcnNpbmcgYSBXQVJDIGZpbGVcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgaXMgbnVsbCBvciB1bmRlZmluZWQgb3IgYW5vdGhlciBlcnJvciBvY2N1cnJlZFxuICAgKi9cbiAgcGFyc2VXQVJDICh3cCkge1xuICAgIGlmICghdGhpcy5fcGFyc2luZykge1xuICAgICAgdGhpcy5fd3AgPSB3cCB8fCB0aGlzLl93cFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGFydCgpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7V0FSQ1BhcnNlcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBXQVJDUGFyc2VyXG4iLCIvKipcbiAqIEB0eXBlIHtFbGVjdHJvbldBUkNHZW5lcmF0b3J9XG4gKi9cbmV4cG9ydHMuRWxlY3Ryb25XQVJDV3JpdGVyID0gcmVxdWlyZSgnLi9lbGVjdHJvbicpXG5cbi8qKlxuICogQHR5cGUge1JlbW90ZUNocm9tZVdBUkNHZW5lcmF0b3J9XG4gKi9cbmV4cG9ydHMuUmVtb3RlQ2hyb21lV0FSQ1dyaXRlciA9IHJlcXVpcmUoJy4vcmVtb3RlQ2hyb21lJylcblxuLyoqXG4gKiBAdHlwZSB7UHVwcGV0ZWVyQ0RQV0FSQ0dlbmVyYXRvcn1cbiAqL1xuZXhwb3J0cy5QdXBwZXRlZXJDRFBXQVJDR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9wdXBwZXRlZXJDRFAnKVxuXG4vKipcbiAqIEB0eXBlIHtQdXBwZXRlZXJXQVJDR2VuZXJhdG9yfVxuICovXG5leHBvcnRzLlB1cHBldGVlcldBUkNHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3B1cHBldGVlcicpXG5cbi8qKlxuICogQHR5cGUge1dBUkNXcml0ZXJCYXNlfVxuICovXG5leHBvcnRzLldBUkNXcml0ZXJCYXNlID0gcmVxdWlyZSgnLi93YXJjV3JpdGVyQmFzZScpXG5cbi8qKlxuICogQHR5cGUge0NSSUV4dHJhV0FSQ0dlbmVyYXRvcn1cbiAqL1xuZXhwb3J0cy5DUklFeHRyYVdBUkNHZW5lcmF0b3IgPSByZXF1aXJlKCcuL2NyaUV4dHJhJylcbiIsImNvbnN0IFdBUkNXcml0ZXJCYXNlID0gcmVxdWlyZSgnLi93YXJjV3JpdGVyQmFzZScpXG5jb25zdCB7IENSTEYgfSA9IHJlcXVpcmUoJy4vd2FyY0ZpZWxkcycpXG5jb25zdCB7IG5vR1osIHJlcGxhY2VDb250ZW50TGVuIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGdldFBvc3REYXRhLCBnZXRSZXNCb2R5IH0gPSByZXF1aXJlKCcuLi91dGlscy9lbGVjdHJvbicpXG5cbi8qKlxuICogQGRlc2MgV0FSQyBHZW5lcmF0b3IgZm9yIHVzZSB3aXRoIEVsZWN0cm9uXG4gKiBAc2VlIGh0dHBzOi8vZWxlY3Ryb24uYXRvbS5pby9kb2NzL1xuICogQHNlZSBodHRwczovL2VsZWN0cm9uLmF0b20uaW8vZG9jcy9hcGkvZGVidWdnZXIvXG4gKiBAZXh0ZW5kcyB7V0FSQ1dyaXRlckJhc2V9XG4gKi9cbmNsYXNzIEVsZWN0cm9uV0FSQ0dlbmVyYXRvciBleHRlbmRzIFdBUkNXcml0ZXJCYXNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlY3Ryb25SZXF1ZXN0Q2FwdHVyZXJ9IGNhcHR1cmVyIC0gVGhlIEVsZWN0cm9uIHJlcXVlc3QgY2FwdHVyZXIgdGhhdCBjb250YWlucyByZXF1ZXN0c1xuICAgKiB0byBiZSBzZXJpYWxpemVkIHRvIHRoZSBXQVJDXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB3Y0RlYnVnZ2VyIC0gdGhlIEVsZWN0cm9uIGRlYnVnZ2VyIHRvIHVzZSB0byBnZXQgdGhlIHJlc3BvbnNlIGJvZHlcbiAgICogQHBhcmFtIHtXQVJDR2VuT3B0c30gZ2VuT3B0cyAtIE9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIFdBUkMgYW5kIG9wdGlvbmFsbHkgZ2VuZXJhdGluZ1xuICAgKiBXQVJDIGluZm8sIFdBUkMgaW5mbyArIFdlYnJlY29yZGVyIFBsYXllciBib29rbWFyayBsaXN0LCBtZXRhZGF0YSByZWNvcmRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBXQVJDIGdlbmVyYXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV0FSQyAoY2FwdHVyZXIsIHdjRGVidWdnZXIsIGdlbk9wdHMpIHtcbiAgICBjb25zdCB7IHdhcmNPcHRzLCB3aW5mbywgbWV0YWRhdGEgfSA9IGdlbk9wdHNcbiAgICB0aGlzLmluaXRXQVJDKHdhcmNPcHRzLndhcmNQYXRoLCB3YXJjT3B0cylcbiAgICBpZiAod2luZm8gIT0gbnVsbCkge1xuICAgICAgYXdhaXQgdGhpcy53cml0ZVdhcmNJbmZvUmVjb3JkKHdpbmZvKVxuICAgIH1cbiAgICBpZiAoZ2VuT3B0cy5wYWdlcykge1xuICAgICAgYXdhaXQgdGhpcy53cml0ZVdlYnJlY29yZGVyQm9va21hcmtzSW5mb1JlY29yZChnZW5PcHRzLnBhZ2VzKVxuICAgIH1cbiAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkge1xuICAgICAgYXdhaXQgdGhpcy53cml0ZVdhcmNNZXRhZGF0YShtZXRhZGF0YS50YXJnZXRVUkksIG1ldGFkYXRhLmNvbnRlbnQpXG4gICAgfVxuICAgIGZvciAobGV0IHJlcXVlc3Qgb2YgY2FwdHVyZXIuaXRlcmF0ZVJlcXVlc3RzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVXYXJjRW50cnkocmVxdWVzdCwgd2NEZWJ1Z2dlcilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMub25jZSgnZmluaXNoZWQnLCByZXNvbHZlKVxuICAgICAgdGhpcy5lbmQoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgR2VuZXJhdGUgYSBXQVJDIHJlY29yZFxuICAgKiBAcGFyYW0ge0NEUFJlcXVlc3RJbmZvfSBucmVxIC0gVGhlIGNhcHR1cmVkIEhUVFAgaW5mb1xuICAgKiBAcGFyYW0ge09iamVjdH0gd2NEZWJ1Z2dlciAtIFRoZSBFbGVjdHJvbiB3ZWJjb250ZW50cyBkZWJ1Z2dlciBvYmplY3RcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV2FyY0VudHJ5IChucmVxLCB3Y0RlYnVnZ2VyKSB7XG4gICAgaWYgKG5yZXEudXJsLmluZGV4T2YoJ2RhdGE6JykgPT09IDApIHJldHVyblxuICAgIGxldCBwb3N0RGF0YVxuICAgIGlmIChucmVxLnBvc3REYXRhKSB7XG4gICAgICBwb3N0RGF0YSA9IG5yZXEucG9zdERhdGFcbiAgICB9IGVsc2UgaWYgKG5yZXEuaGFzUG9zdERhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBwb3N0ID0gYXdhaXQgZ2V0UG9zdERhdGEobnJlcS5yZXF1ZXN0SWQsIHdjRGVidWdnZXIpXG4gICAgICAgIHBvc3REYXRhID0gQnVmZmVyLmZyb20ocG9zdC5wb3N0RGF0YSwgJ3V0ZjgnKVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gICAgaWYgKG5yZXEuY2FuU2VyaWFsaXplUmVzcG9uc2UoKSkge1xuICAgICAgbGV0IHJlc0RhdGFcbiAgICAgIGxldCByZXNwb25zZUhlYWRlcnMgPSBucmVxLnNlcmlhbGl6ZVJlc3BvbnNlSGVhZGVycygpXG4gICAgICBpZiAobnJlcS5nZXRCb2R5KSB7XG4gICAgICAgIGxldCB3YXNFcnJvciA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJib2R5ID0gYXdhaXQgZ2V0UmVzQm9keShucmVxLnJlcXVlc3RJZCwgd2NEZWJ1Z2dlcilcbiAgICAgICAgICBpZiAocmJvZHkuYmFzZTY0RW5jb2RlZCkge1xuICAgICAgICAgICAgcmVzRGF0YSA9IEJ1ZmZlci5mcm9tKHJib2R5LmJvZHksICdiYXNlNjQnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNEYXRhID0gQnVmZmVyLmZyb20ocmJvZHkuYm9keSwgJ3V0ZjgnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgd2FzRXJyb3IgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF3YXNFcnJvcikge1xuICAgICAgICAgIHJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycy5yZXBsYWNlKG5vR1osICcnKVxuICAgICAgICAgIHJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycy5yZXBsYWNlKFxuICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnRMZW4sXG4gICAgICAgICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgocmVzRGF0YSwgJ3V0ZjgnKX0ke0NSTEZ9YFxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVjb3JkIGhhcyAwIGNvbnRlbnRcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMucmVwbGFjZShcbiAgICAgICAgICAgIHJlcGxhY2VDb250ZW50TGVuLFxuICAgICAgICAgICAgYENvbnRlbnQtTGVuZ3RoOiAwJHtDUkxGfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLndyaXRlUmVxdWVzdFJlc3BvbnNlUmVjb3JkcyhcbiAgICAgICAgbnJlcS51cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBucmVxLnNlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzKCksXG4gICAgICAgICAgZGF0YTogcG9zdERhdGFcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgICBkYXRhOiByZXNEYXRhXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud3JpdGVSZXF1ZXN0UmVjb3JkKFxuICAgICAgbnJlcS51cmwsXG4gICAgICBucmVxLnNlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzKCksXG4gICAgICBwb3N0RGF0YVxuICAgIClcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtFbGVjdHJvbldBUkNHZW5lcmF0b3J9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gRWxlY3Ryb25XQVJDR2VuZXJhdG9yXG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgc3BsaXRQYXRoID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufTtcblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuICgocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCkgfHwgJy4nO1xufTtcblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKSxcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBzdWJzdHIocGF0aCwgLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFpc0Fic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuam9pbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gZXhwb3J0cy5ub3JtYWxpemUoZmlsdGVyKHBhdGhzLCBmdW5jdGlvbihwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJykpO1xufTtcblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGZyb20gPSBleHBvcnRzLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IGV4cG9ydHMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xuXG4gIGZ1bmN0aW9uIHRyaW0oYXJyKSB7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBmb3IgKDsgc3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XG4gICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xuICB9XG5cbiAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICB9XG5cbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcblxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpO1xufTtcblxuZXhwb3J0cy5zZXAgPSAnLyc7XG5leHBvcnRzLmRlbGltaXRlciA9ICc6JztcblxuZXhwb3J0cy5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpLFxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcbiAgICAgIGRpciA9IHJlc3VsdFsxXTtcblxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgIHJldHVybiAnLic7XG4gIH1cblxuICBpZiAoZGlyKSB7XG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiByb290ICsgZGlyO1xufTtcblxuXG5leHBvcnRzLmJhc2VuYW1lID0gZnVuY3Rpb24ocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICAvLyBUT0RPOiBtYWtlIHRoaXMgY29tcGFyaXNvbiBjYXNlLWluc2Vuc2l0aXZlIG9uIHdpbmRvd3M/XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5cbmV4cG9ydHMuZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aChwYXRoKVszXTtcbn07XG5cbmZ1bmN0aW9uIGZpbHRlciAoeHMsIGYpIHtcbiAgICBpZiAoeHMuZmlsdGVyKSByZXR1cm4geHMuZmlsdGVyKGYpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmKHhzW2ldLCBpLCB4cykpIHJlcy5wdXNoKHhzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gU3RyaW5nLnByb3RvdHlwZS5zdWJzdHIgLSBuZWdhdGl2ZSBpbmRleCBkb24ndCB3b3JrIGluIElFOFxudmFyIHN1YnN0ciA9ICdhYicuc3Vic3RyKC0xKSA9PT0gJ2InXG4gICAgPyBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7IHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pIH1cbiAgICA6IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSBzdHIubGVuZ3RoICsgc3RhcnQ7XG4gICAgICAgIHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pO1xuICAgIH1cbjtcbiIsIi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuICBJbiB0aGVcbi8vIGJyb3dzZXIgdGhpcyBpcyBhIGxpdHRsZSBjb21wbGljYXRlZCBkdWUgdG8gdW5rbm93biBxdWFsaXR5IG9mIE1hdGgucmFuZG9tKClcbi8vIGFuZCBpbmNvbnNpc3RlbnQgc3VwcG9ydCBmb3IgdGhlIGBjcnlwdG9gIEFQSS4gIFdlIGRvIHRoZSBiZXN0IHdlIGNhbiB2aWFcbi8vIGZlYXR1cmUtZGV0ZWN0aW9uXG5cbi8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0b1xuLy8gaW1wbGVtZW50YXRpb24uIEFsc28sIGZpbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGNyeXB0byBvbiBJRTExLlxudmFyIGdldFJhbmRvbVZhbHVlcyA9ICh0eXBlb2YoY3J5cHRvKSAhPSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YobXNDcnlwdG8pICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09ICdmdW5jdGlvbicgJiYgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pKTtcblxuaWYgKGdldFJhbmRvbVZhbHVlcykge1xuICAvLyBXSEFUV0cgY3J5cHRvIFJORyAtIGh0dHA6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9DcnlwdG9cbiAgdmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3aGF0d2dSTkcoKSB7XG4gICAgZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbiAgICByZXR1cm4gcm5kczg7XG4gIH07XG59IGVsc2Uge1xuICAvLyBNYXRoLnJhbmRvbSgpLWJhc2VkIChSTkcpXG4gIC8vXG4gIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgTWF0aC5yYW5kb20oKS4gIEl0J3MgZmFzdCwgYnV0IGlzIG9mIHVuc3BlY2lmaWVkXG4gIC8vIHF1YWxpdHkuXG4gIHZhciBybmRzID0gbmV3IEFycmF5KDE2KTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1hdGhSTkcoKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHI7IGkgPCAxNjsgaSsrKSB7XG4gICAgICBpZiAoKGkgJiAweDAzKSA9PT0gMCkgciA9IE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMDtcbiAgICAgIHJuZHNbaV0gPSByID4+PiAoKGkgJiAweDAzKSA8PCAzKSAmIDB4ZmY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJuZHM7XG4gIH07XG59XG4iLCIvKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cbnZhciBieXRlVG9IZXggPSBbXTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4W2ldID0gKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKTtcbn1cblxuZnVuY3Rpb24gYnl0ZXNUb1V1aWQoYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBvZmZzZXQgfHwgMDtcbiAgdmFyIGJ0aCA9IGJ5dGVUb0hleDtcbiAgLy8gam9pbiB1c2VkIHRvIGZpeCBtZW1vcnkgaXNzdWUgY2F1c2VkIGJ5IGNvbmNhdGVuYXRpb246IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMxNzUjYzRcbiAgcmV0dXJuIChbYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgXG5cdGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcblx0YnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuXHRidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG5cdGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcblx0YnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSxcblx0YnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSxcblx0YnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXV0pLmpvaW4oJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ5dGVzVG9VdWlkO1xuIiwiLyoqXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCB3YXJjUkUgPSAvLiooWy5dd2FyYykoWy5dZ3opPy9cblxuLyoqXG4gKiBAZGVzYyBFbnN1cmUgdGhhdCB0aGUgc3VwcGxpZWQgbmFtZSBmb3IgdGhlIFdBUkMgaXMgY29ycmVjdFxuICogQHBhcmFtIHtzdHJpbmc/fSBmaWxlbmFtZVxuICogQHBhcmFtIHtib29sZWFufSBbZ3ppcHBpbmcgPSBmYWxzZV1cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbnN1cmVXQVJDRmlsZW5hbWUgKGZpbGVuYW1lLCBnemlwcGluZyA9IGZhbHNlKSB7XG4gIGlmIChmaWxlbmFtZSA9PSBudWxsKSB7XG4gICAgY29uc3Qgd2FzID0gZmlsZW5hbWUgPT09IHVuZGVmaW5lZCA/ICd1bmRlZmluZWQnIDogJ251bGwnXG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3VwcGxpZWQgV0FSQyBmaWxlbmFtZSB3YXMgXCIke3dhc31cIiwgZXhwZWN0aW5nIGEgc3RyaW5nYClcbiAgfVxuICBpZiAodHlwZW9mIGZpbGVuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHN1cHBsaWVkIFdBUkMgZmlsZW5hbWUgd2FzIG5vdCBhIHN0cmluZyBpdCB3YXMgXCIke3R5cGVvZiBmaWxlbmFtZX1cImApXG4gIH1cbiAgLy8gZ2V0IHRoZSBtYXRjaFxuICBjb25zdCBtYXRjaCA9IHdhcmNSRS5leGVjKGZpbGVuYW1lKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgLy8gbm8gd2FyYyBvciB3YXJjLmd6IGV4dCBjb3JyZWN0IHRoYXRcbiAgICByZXR1cm4gYCR7ZmlsZW5hbWV9LndhcmMke2d6aXBwaW5nID8gJy5neicgOiAnJ31gXG4gIH1cbiAgLy8gZWFybHkgb3V0IGZvciBub24tZ3ppcHBlZCB3YXJjIChlbmRzIHdpdGggLndhcmMgYW5kIGJ1dCBub3QgLmd6KVxuICBpZiAoIWd6aXBwaW5nICYmIG1hdGNoWzFdICE9IG51bGwgJiYgbWF0Y2hbMl0gPT0gbnVsbCkgcmV0dXJuIGZpbGVuYW1lXG4gIC8vIGVhcmx5IG91dCBmb3IgZ3ppcHBlZCB3YXJjIChlbmRzIHdpdGggYm90aCAud2FyYyBhbmQgLmd6KVxuICBpZiAoZ3ppcHBpbmcgJiYgbWF0Y2hbMV0gIT0gbnVsbCAmJiBtYXRjaFsyXSAhPSBudWxsKSByZXR1cm4gZmlsZW5hbWVcbiAgLy8gdGhlIHJlbWFpbmluZyBjaGVja3MgYXJlIGp1c3QgdG8gYmUgMTAwJSBzdXJlIHRoZSBmaWxlIGV4dGVuc2lvbiBpc3N1ZSB3YXMgY29ycmVjdGVkXG4gIGNvbnN0IGhhc1dBUkMgPSBtYXRjaFsxXSAhPSBudWxsXG4gIGNvbnN0IGhhc1dBUkNHWiA9IG1hdGNoWzJdICE9IG51bGxcbiAgaWYgKGd6aXBwaW5nKSB7XG4gICAgLy8gZmlsZXNuYW1lIGRvZXMgbm90IGVuZCB3aXRoIC53YXJjLmd6XG4gICAgaWYgKCFoYXNXQVJDKSByZXR1cm4gYCR7ZmlsZW5hbWV9LndhcmMuZ3pgXG4gICAgLy8gZmlsZW5hbWUgZW5kcyB3aXRoIC53YXJjIGJ1dCBub3QgLmd6XG4gICAgaWYgKCFoYXNXQVJDR1opIHJldHVybiBgJHtmaWxlbmFtZX0uZ3pgXG4gIH0gZWxzZSBpZiAoIWhhc1dBUkMpIHtcbiAgICAvLyBmaWxlbmFtZSBkb2VzIG5vdCBlbmQgd2l0aCAud2FyYyBidXQgd2h5IHdlIGFyZSBoZXJlIEkgZG8gbm90IGtub3dcbiAgICByZXR1cm4gYCR7ZmlsZW5hbWV9LndhcmNgXG4gIH1cbiAgLy8gd2F0Pz9cbiAgcmV0dXJuIGZpbGVuYW1lXG59XG4iLCJjb25zdCBpc0VtcHR5ID0gcmVxdWlyZSgnbG9kYXNoL2lzRW1wdHknKVxuXG4vKipcbiAqIEBkZXNjIEVsZWN0cm9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIGRlYnVnZ2VyIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0cyByZXNwb25zZSBib2R5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdElkIC0gdGhlIHJlcXVlc3QgdG8gZmV0Y2ggdGhlIHJlc3BvbnNlIGJvZHkgZm9yXG4gKiBAcGFyYW0ge09iamVjdH0gd2NEZWJ1Z2dlciAtIHRoZSBFbGVjdHJvbiBkZWJ1Z2dlciB0byB1c2UgdG8gZ2V0IHRoZSByZXNwb25zZSBib2R5XG4gKiBAc2VlIGh0dHBzOi8vZWxlY3Ryb24uYXRvbS5pby9kb2NzL2FwaS9kZWJ1Z2dlci9cbiAqIEByZXR1cm4ge1Byb21pc2U8P0J1ZmZlcj59IGJvZHkgLSB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIG5vZGUgYnVmZmVyXG4gKi9cbmZ1bmN0aW9uIGdldFJlc0JvZHkgKHJlcXVlc3RJZCwgd2NEZWJ1Z2dlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICB3Y0RlYnVnZ2VyLnNlbmRDb21tYW5kKFxuICAgICAgJ05ldHdvcmsuZ2V0UmVzcG9uc2VCb2R5JyxcbiAgICAgIHsgcmVxdWVzdElkIH0sXG4gICAgICAoZXJyb3IsIGJvZHkpID0+IHtcbiAgICAgICAgcmVzb2x2ZSghaXNFbXB0eShlcnJvcikgPyBudWxsIDogYm9keSlcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5cbi8qKlxuICogQGRlc2MgRWxlY3Ryb24gcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgZGVidWdnZXIgdG8gcmV0cmlldmUgdGhlIHJlcXVlc3RzIHBvc3QgZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RJZCAtIHRoZSByZXF1ZXN0IHRvIGZldGNoIHRoZSBwb3N0IGRhdGEgZm9yXG4gKiBAcGFyYW0ge09iamVjdH0gd2NEZWJ1Z2dlciAtIHRoZSBFbGVjdHJvbiBkZWJ1Z2dlciB0byB1c2UgdG8gZ2V0IHRoZSBwb3N0IGRhdGFcbiAqIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbi5hdG9tLmlvL2RvY3MvYXBpL2RlYnVnZ2VyL1xuICogQHJldHVybiB7UHJvbWlzZTw/QnVmZmVyPn0gYm9keSAtIHRoZSByZXNwb25zZSBib2R5IGFzIGEgbm9kZSBidWZmZXJcbiAqL1xuZnVuY3Rpb24gZ2V0UG9zdERhdGEgKHJlcXVlc3RJZCwgd2NEZWJ1Z2dlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICB3Y0RlYnVnZ2VyLnNlbmRDb21tYW5kKFxuICAgICAgJ05ldHdvcmsuZ2V0UmVxdWVzdFBvc3REYXRhJyxcbiAgICAgIHsgcmVxdWVzdElkIH0sXG4gICAgICAoZXJyb3IsIGJvZHkpID0+IHtcbiAgICAgICAgcmVzb2x2ZSghaXNFbXB0eShlcnJvcikgPyBudWxsIDogYm9keSlcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvKipcbiAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgT2JqZWN0KTogUHJvbWlzZTw/QnVmZmVyPn1cbiAgICovXG4gIGdldFJlc0JvZHksXG4gIC8qKlxuICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nLCBPYmplY3QpOiBQcm9taXNlPD9CdWZmZXI+fVxuICAgKi9cbiAgZ2V0UG9zdERhdGFcbn1cbiIsInZhciBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAqXG4gKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAqIHByb3BlcnRpZXMuXG4gKlxuICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRW1wdHkobnVsbCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KHRydWUpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSgxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgIChpc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgfVxuICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgfVxuICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgcmV0dXJuICFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO1xuICB9XG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRW1wdHk7XG4iLCJ2YXIgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIG5hdGl2ZUtleXMgPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5cztcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsIi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJBcmc7XG4iLCJ2YXIgRGF0YVZpZXcgPSByZXF1aXJlKCcuL19EYXRhVmlldycpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIFByb21pc2UgPSByZXF1aXJlKCcuL19Qcm9taXNlJyksXG4gICAgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgV2Vha01hcCA9IHJlcXVpcmUoJy4vX1dlYWtNYXAnKSxcbiAgICBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUYWc7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc01hc2tlZCA9IHJlcXVpcmUoJy4vX2lzTWFza2VkJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hdGl2ZTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmFsdWU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCA9IGdldE5hdGl2ZShyb290LCAnTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBQcm9taXNlID0gZ2V0TmF0aXZlKHJvb3QsICdQcm9taXNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFdlYWtNYXAgPSBnZXROYXRpdmUocm9vdCwgJ1dlYWtNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWFrTWFwO1xuIiwidmFyIGJhc2VJc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vX2Jhc2VJc0FyZ3VtZW50cycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNBcmd1bWVudHM7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpLFxuICAgIHN0dWJGYWxzZSA9IHJlcXVpcmUoJy4vc3R1YkZhbHNlJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZmZlcjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNUeXBlZEFycmF5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VVbmFyeTtcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vZGVVdGlsO1xuIiwiY29uc3QgV0FSQ1dyaXRlckJhc2UgPSByZXF1aXJlKCcuL3dhcmNXcml0ZXJCYXNlJylcbmNvbnN0IHsgQ1JMRiB9ID0gcmVxdWlyZSgnLi93YXJjRmllbGRzJylcbmNvbnN0IHsgbm9HWiwgcmVwbGFjZUNvbnRlbnRMZW4gfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcblxuLyoqXG4gKiBAZGVzYyBXQVJDIEdlbmVyYXRvciBmb3IgdXNlIHdpdGggY2hyb21lLXJlbW90ZS1pbnRlcmZhY2VcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2N5cnVzLWFuZC9jaHJvbWUtcmVtb3RlLWludGVyZmFjZVxuICogQGV4dGVuZHMge1dBUkNXcml0ZXJCYXNlfVxuICovXG5jbGFzcyBSZW1vdGVDaHJvbWVXQVJDR2VuZXJhdG9yIGV4dGVuZHMgV0FSQ1dyaXRlckJhc2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtSZW1vdGVDaHJvbWVSZXF1ZXN0Q2FwdHVyZXJ9IGNhcHR1cmVyIC0gVGhlIFJlbW90ZUNocm9tZSByZXF1ZXN0IGNhcHR1cmVyIHRoYXQgY29udGFpbnMgcmVxdWVzdHNcbiAgICogdG8gYmUgc2VyaWFsaXplZCB0byB0aGUgV0FSQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmV0d29yayAtIFRoZSBjaHJvbWUtcmVtb3RlLWludGVyZmFjZSBOZXR3b3JrIG9iamVjdFxuICAgKiBAcGFyYW0ge1dBUkNHZW5PcHRzfSBnZW5PcHRzIC0gT3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgV0FSQyBhbmQgb3B0aW9uYWxseSBnZW5lcmF0aW5nXG4gICAqIFdBUkMgaW5mbywgV0FSQyBpbmZvICsgV2VicmVjb3JkZXIgUGxheWVyIGJvb2ttYXJrIGxpc3QsIG1ldGFkYXRhIHJlY29yZHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIFdBUkMgZ2VuZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVXQVJDIChjYXB0dXJlciwgbmV0d29yaywgZ2VuT3B0cykge1xuICAgIGNvbnN0IHsgd2FyY09wdHMsIHdpbmZvLCBtZXRhZGF0YSB9ID0gZ2VuT3B0c1xuICAgIHRoaXMuaW5pdFdBUkMod2FyY09wdHMud2FyY1BhdGgsIHdhcmNPcHRzKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh3aW5mbyAhPSBudWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlV2FyY0luZm9SZWNvcmQod2luZm8pXG4gICAgfVxuICAgIGlmIChnZW5PcHRzLnBhZ2VzKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlV2VicmVjb3JkZXJCb29rbWFya3NJbmZvUmVjb3JkKGdlbk9wdHMucGFnZXMpXG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlV2FyY01ldGFkYXRhKG1ldGFkYXRhLnRhcmdldFVSSSwgbWV0YWRhdGEuY29udGVudClcbiAgICB9XG4gICAgZm9yIChsZXQgcmVxdWVzdCBvZiBjYXB0dXJlci5pdGVyYXRlUmVxdWVzdHMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZVdhcmNFbnRyeShyZXF1ZXN0LCBuZXR3b3JrKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5vbmNlKCdmaW5pc2hlZCcsIHJlc29sdmUpXG4gICAgICB0aGlzLmVuZCgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBHZW5lcmF0ZSBhIFdBUkMgcmVjb3JkXG4gICAqIEBwYXJhbSB7Q0RQUmVxdWVzdEluZm99IG5yZXEgLSBUaGUgY2FwdHVyZWQgSFRUUCBpbmZvXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZXR3b3JrIC0gVGhlIGNocm9tZS1yZW1vdGUtaW50ZXJmYWNlIE5ldHdvcmsgb2JqZWN0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVdhcmNFbnRyeSAobnJlcSwgbmV0d29yaykge1xuICAgIGlmIChucmVxLnVybC5pbmRleE9mKCdkYXRhOicpID09PSAwKSByZXR1cm5cbiAgICBsZXQgcG9zdERhdGFcbiAgICBpZiAobnJlcS5wb3N0RGF0YSkge1xuICAgICAgcG9zdERhdGEgPSBucmVxLnBvc3REYXRhXG4gICAgfSBlbHNlIGlmIChucmVxLmhhc1Bvc3REYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcG9zdCA9IGF3YWl0IG5ldHdvcmsuZ2V0UmVxdWVzdFBvc3REYXRhKHtcbiAgICAgICAgICByZXF1ZXN0SWQ6IG5yZXEucmVxdWVzdElkXG4gICAgICAgIH0pXG4gICAgICAgIHBvc3REYXRhID0gQnVmZmVyLmZyb20ocG9zdC5wb3N0RGF0YSwgJ3V0ZjgnKVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gICAgaWYgKG5yZXEuY2FuU2VyaWFsaXplUmVzcG9uc2UoKSkge1xuICAgICAgbGV0IHJlc0RhdGFcbiAgICAgIGxldCByZXNwb25zZUhlYWRlcnMgPSBucmVxLnNlcmlhbGl6ZVJlc3BvbnNlSGVhZGVycygpXG4gICAgICBpZiAobnJlcS5nZXRCb2R5KSB7XG4gICAgICAgIGxldCB3YXNFcnJvciA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJib2R5ID0gYXdhaXQgbmV0d29yay5nZXRSZXNwb25zZUJvZHkoe1xuICAgICAgICAgICAgcmVxdWVzdElkOiBucmVxLnJlcXVlc3RJZFxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKHJib2R5LmJhc2U2NEVuY29kZWQpIHtcbiAgICAgICAgICAgIHJlc0RhdGEgPSBCdWZmZXIuZnJvbShyYm9keS5ib2R5LCAnYmFzZTY0JylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzRGF0YSA9IEJ1ZmZlci5mcm9tKHJib2R5LmJvZHksICd1dGY4JylcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHdhc0Vycm9yID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIGlmICghd2FzRXJyb3IpIHtcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMucmVwbGFjZShub0daLCAnJylcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMucmVwbGFjZShcbiAgICAgICAgICAgIHJlcGxhY2VDb250ZW50TGVuLFxuICAgICAgICAgICAgYENvbnRlbnQtTGVuZ3RoOiAke0J1ZmZlci5ieXRlTGVuZ3RoKHJlc0RhdGEsICd1dGY4Jyl9JHtDUkxGfWBcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGlzIHJlY29yZCBoYXMgMCBjb250ZW50XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzLnJlcGxhY2UoXG4gICAgICAgICAgICByZXBsYWNlQ29udGVudExlbixcbiAgICAgICAgICAgIGBDb250ZW50LUxlbmd0aDogMCR7Q1JMRn1gXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy53cml0ZVJlcXVlc3RSZXNwb25zZVJlY29yZHMoXG4gICAgICAgIG5yZXEudXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbnJlcS5zZXJpYWxpemVSZXF1ZXN0SGVhZGVycygpLFxuICAgICAgICAgIGRhdGE6IHBvc3REYXRhXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgICAgZGF0YTogcmVzRGF0YVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLndyaXRlUmVxdWVzdFJlY29yZChcbiAgICAgIG5yZXEudXJsLFxuICAgICAgbnJlcS5zZXJpYWxpemVSZXF1ZXN0SGVhZGVycygpLFxuICAgICAgcG9zdERhdGFcbiAgICApXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7UmVtb3RlQ2hyb21lV0FSQ0dlbmVyYXRvcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZW1vdGVDaHJvbWVXQVJDR2VuZXJhdG9yXG4iLCJjb25zdCBXQVJDV3JpdGVyQmFzZSA9IHJlcXVpcmUoJy4vd2FyY1dyaXRlckJhc2UnKVxuY29uc3QgeyBDUkxGIH0gPSByZXF1aXJlKCcuL3dhcmNGaWVsZHMnKVxuY29uc3QgeyBub0daLCByZXBsYWNlQ29udGVudExlbiB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuXG4vKipcbiAqIEBkZXNjIFdBUkMgR2VuZXJhdG9yIGZvciB1c2Ugd2l0aCBwdXBwZXRlZXJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS9wdXBwZXRlZXJcbiAqIEBleHRlbmRzIHtXQVJDV3JpdGVyQmFzZX1cbiAqL1xuY2xhc3MgUHVwcGV0ZWVyQ0RQV0FSQ0dlbmVyYXRvciBleHRlbmRzIFdBUkNXcml0ZXJCYXNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UHVwcGV0ZWVyQ0RQUmVxdWVzdENhcHR1cmVyfSBjYXB0dXJlciAgLSBUaGUgUHVwcGV0ZWVyQ0RQIHJlcXVlc3QgY2FwdHVyZXIgdGhhdCBjb250YWlucyByZXF1ZXN0c1xuICAgKiB0byBiZSBzZXJpYWxpemVkIHRvIHRoZSBXQVJDXG4gICAqIEBwYXJhbSB7Q0RQU2Vzc2lvbn0gY2xpZW50IC0gQSBDRFBTZXNzaW9uIGNvbm5lY3RlZCB0byB0aGUgdGFyZ2V0IHRoZSByZXNwb25zZSBib2RpZXMgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbVxuICAgKiBAcGFyYW0ge1dBUkNHZW5PcHRzfSBnZW5PcHRzIC0gT3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgV0FSQyBhbmQgb3B0aW9uYWxseSBnZW5lcmF0aW5nXG4gICAqIFdBUkMgaW5mbywgV0FSQyBpbmZvICsgV2VicmVjb3JkZXIgUGxheWVyIGJvb2ttYXJrIGxpc3QsIG1ldGFkYXRhIHJlY29yZHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIFdBUkMgZ2VuZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVXQVJDIChjYXB0dXJlciwgY2xpZW50LCBnZW5PcHRzKSB7XG4gICAgY29uc3QgeyB3aW5mbywgbWV0YWRhdGEsIHdhcmNPcHRzIH0gPSBnZW5PcHRzXG4gICAgdGhpcy5pbml0V0FSQyh3YXJjT3B0cy53YXJjUGF0aCwgd2FyY09wdHMpXG4gICAgaWYgKHdpbmZvICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVXYXJjSW5mb1JlY29yZCh3aW5mbylcbiAgICB9XG4gICAgaWYgKGdlbk9wdHMucGFnZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVXZWJyZWNvcmRlckJvb2ttYXJrc0luZm9SZWNvcmQoZ2VuT3B0cy5wYWdlcylcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVXYXJjTWV0YWRhdGEobWV0YWRhdGEudGFyZ2V0VVJJLCBtZXRhZGF0YS5jb250ZW50KVxuICAgIH1cbiAgICBmb3IgKGxldCByZXF1ZXN0IG9mIGNhcHR1cmVyLml0ZXJhdGVSZXF1ZXN0cygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlV2FyY0VudHJ5KHJlcXVlc3QsIGNsaWVudClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMub25jZSgnZmluaXNoZWQnLCByZXNvbHZlKVxuICAgICAgdGhpcy5lbmQoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgR2VuZXJhdGUgYSBXQVJDIHJlY29yZFxuICAgKiBAcGFyYW0ge0NEUFJlcXVlc3RJbmZvfSBucmVxIC0gVGhlIGNhcHR1cmVkIEhUVFAgaW5mb1xuICAgKiBAcGFyYW0ge0NEUFNlc3Npb259IGNsaWVudCAtIEEgQ0RQU2Vzc2lvbiBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldCB0aGUgcmVzcG9uc2UgYm9kaWVzIHdpbGwgYmUgcmV0cmlldmVkIGZyb21cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV2FyY0VudHJ5IChucmVxLCBjbGllbnQpIHtcbiAgICBpZiAobnJlcS51cmwuaW5kZXhPZignZGF0YTonKSA9PT0gMCkgcmV0dXJuXG4gICAgbGV0IHBvc3REYXRhXG4gICAgaWYgKG5yZXEucG9zdERhdGEpIHtcbiAgICAgIHBvc3REYXRhID0gbnJlcS5wb3N0RGF0YVxuICAgIH0gZWxzZSBpZiAobnJlcS5oYXNQb3N0RGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHBvc3QgPSBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5nZXRSZXF1ZXN0UG9zdERhdGEnLCB7XG4gICAgICAgICAgcmVxdWVzdElkOiBucmVxLnJlcXVlc3RJZFxuICAgICAgICB9KVxuICAgICAgICBwb3N0RGF0YSA9IEJ1ZmZlci5mcm9tKHBvc3QucG9zdERhdGEsICd1dGY4JylcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICAgIGlmIChucmVxLmNhblNlcmlhbGl6ZVJlc3BvbnNlKCkpIHtcbiAgICAgIGxldCByZXNEYXRhXG4gICAgICBsZXQgcmVzcG9uc2VIZWFkZXJzID0gbnJlcS5zZXJpYWxpemVSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgaWYgKG5yZXEuZ2V0Qm9keSkge1xuICAgICAgICBsZXQgd2FzRXJyb3IgPSBmYWxzZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCByYm9keSA9IGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLmdldFJlc3BvbnNlQm9keScsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogbnJlcS5yZXF1ZXN0SWRcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChyYm9keS5iYXNlNjRFbmNvZGVkKSB7XG4gICAgICAgICAgICByZXNEYXRhID0gQnVmZmVyLmZyb20ocmJvZHkuYm9keSwgJ2Jhc2U2NCcpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc0RhdGEgPSBCdWZmZXIuZnJvbShyYm9keS5ib2R5LCAndXRmOCcpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB3YXNFcnJvciA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdhc0Vycm9yKSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzLnJlcGxhY2Uobm9HWiwgJycpXG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzLnJlcGxhY2UoXG4gICAgICAgICAgICByZXBsYWNlQ29udGVudExlbixcbiAgICAgICAgICAgIGBDb250ZW50LUxlbmd0aDogJHtCdWZmZXIuYnl0ZUxlbmd0aChyZXNEYXRhLCAndXRmOCcpfSR7Q1JMRn1gXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhpcyByZWNvcmQgaGFzIDAgY29udGVudFxuICAgICAgICAgIHJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycy5yZXBsYWNlKFxuICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnRMZW4sXG4gICAgICAgICAgICBgQ29udGVudC1MZW5ndGg6IDAke0NSTEZ9YFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMud3JpdGVSZXF1ZXN0UmVzcG9uc2VSZWNvcmRzKFxuICAgICAgICBucmVxLnVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5yZXEuc2VyaWFsaXplUmVxdWVzdEhlYWRlcnMoKSxcbiAgICAgICAgICBkYXRhOiBwb3N0RGF0YVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICAgIGRhdGE6IHJlc0RhdGFcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy53cml0ZVJlcXVlc3RSZWNvcmQoXG4gICAgICBucmVxLnVybCxcbiAgICAgIG5yZXEuc2VyaWFsaXplUmVxdWVzdEhlYWRlcnMoKSxcbiAgICAgIHBvc3REYXRhXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlckNEUFdBUkNHZW5lcmF0b3J9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gUHVwcGV0ZWVyQ0RQV0FSQ0dlbmVyYXRvclxuIiwiY29uc3QgeyBVUkwgfSA9IHJlcXVpcmUoJ3VybCcpXG5jb25zdCB7IFNUQVRVU19DT0RFUyB9ID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCB7IENSTEYgfSA9IHJlcXVpcmUoJy4vd2FyY0ZpZWxkcycpXG5jb25zdCBXQVJDV3JpdGVyQmFzZSA9IHJlcXVpcmUoJy4vd2FyY1dyaXRlckJhc2UnKVxuY29uc3Qge1xuICBzdHJpbmdpZnlIZWFkZXJzLFxuICBzdHJpbmdpZnlSZXF1ZXN0SGVhZGVyc1xufSA9IHJlcXVpcmUoJy4uL3V0aWxzL2hlYWRlclNlcmlhbGl6ZXJzJylcbmNvbnN0IHsgaHR0cFJlcXVlc3RQYXRoIH0gPSByZXF1aXJlKCcuLi91dGlscy91cmwtaGVscGVycycpXG5jb25zdCB7IG5vR1osIHJlcGxhY2VDb250ZW50TGVuIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbi8qKlxuICogQGV4dGVuZHMge1dBUkNXcml0ZXJCYXNlfVxuICogQGRlc2MgV0FSQyBHZW5lcmF0b3IgZm9yIHVzZSB3aXRoIHB1cHBldGVlclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lL3B1cHBldGVlclxuICovXG5jbGFzcyBQdXBwZXRlZXJXQVJDR2VuZXJhdG9yIGV4dGVuZHMgV0FSQ1dyaXRlckJhc2Uge1xuICAvKipcbiAgICogQGRlc2MgQ3JlYXRlIGEgbmV3IFB1cHBldGVlcldBUkNHZW5lcmF0b3JcbiAgICogQHBhcmFtIHs/V0FSQ0ZpbGVPcHRzfSBbZGVmYXVsdE9wdHNdXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGVmYXVsdE9wdHMpIHtcbiAgICBzdXBlcihkZWZhdWx0T3B0cylcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7VVJMfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fVVAgPSBuZXcgVVJMKCdhYm91dDpibGFuaycpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQdXBwZXRlZXJSZXF1ZXN0Q2FwdHVyZXJ9IGNhcHR1cmVyIC0gVGhlIFB1cHBldGVlciByZXF1ZXN0IGNhcHR1cmVyIHRoYXQgY29udGFpbnMgcmVxdWVzdHNcbiAgICogdG8gYmUgc2VyaWFsaXplZCB0byB0aGUgV0FSQ1xuICAgKiBAcGFyYW0ge1dBUkNHZW5PcHRzfSBnZW5PcHRzIC0gT3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgV0FSQyBhbmQgb3B0aW9uYWxseSBnZW5lcmF0aW5nXG4gICAqIFdBUkMgaW5mbywgV0FSQyBpbmZvICsgV2VicmVjb3JkZXIgUGxheWVyIGJvb2ttYXJrIGxpc3QsIG1ldGFkYXRhIHJlY29yZHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIFdBUkMgZ2VuZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVXQVJDIChjYXB0dXJlciwgZ2VuT3B0cykge1xuICAgIGNvbnN0IHsgd2FyY09wdHMsIHdpbmZvLCBtZXRhZGF0YSB9ID0gZ2VuT3B0c1xuICAgIHRoaXMuaW5pdFdBUkMod2FyY09wdHMud2FyY1BhdGgsIHdhcmNPcHRzKVxuICAgIGlmICh3aW5mbyAhPSBudWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlV2FyY0luZm9SZWNvcmQod2luZm8pXG4gICAgfVxuICAgIGlmIChnZW5PcHRzLnBhZ2VzKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlV2VicmVjb3JkZXJCb29rbWFya3NJbmZvUmVjb3JkKGdlbk9wdHMucGFnZXMpXG4gICAgfVxuICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlV2FyY01ldGFkYXRhKG1ldGFkYXRhLnRhcmdldFVSSSwgbWV0YWRhdGEuY29udGVudClcbiAgICB9XG4gICAgZm9yIChsZXQgcmVxdWVzdCBvZiBjYXB0dXJlci5pdGVyYXRlUmVxdWVzdHMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZVdhcmNFbnRyeShyZXF1ZXN0KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5vbmNlKCdmaW5pc2hlZCcsIHJlc29sdmUpXG4gICAgICB0aGlzLmVuZCgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBHZW5lcmF0ZSBhIFdBUkMgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdCAtIEEgUHVwcGV0ZWVyIFJlcXVlc3Qgb2JqZWN0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVdhcmNFbnRyeSAocmVxdWVzdCkge1xuICAgIGlmIChyZXF1ZXN0LnVybCgpLmluZGV4T2YoJ2RhdGE6JykgPT09IDApIHJldHVyblxuICAgIGNvbnN0IHJlc3BvbnNlID0gcmVxdWVzdC5yZXNwb25zZSgpXG4gICAgdGhpcy5fVVAuaHJlZiA9IHJlcXVlc3QudXJsKClcbiAgICBsZXQgcmVxSFRUUCA9IGAke3JlcXVlc3QubWV0aG9kKCl9ICR7aHR0cFJlcXVlc3RQYXRoKFxuICAgICAgdGhpcy5fVVBcbiAgICApfSBIVFRQLzEuMSR7Q1JMRn0ke3N0cmluZ2lmeVJlcXVlc3RIZWFkZXJzKFxuICAgICAgcmVxdWVzdC5oZWFkZXJzKCksXG4gICAgICB0aGlzLl9VUC5ob3N0XG4gICAgKX1gXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBsZXQgcmVzSFRUUCA9IGBIVFRQLzEuMSAke3Jlc3BvbnNlLnN0YXR1cygpfSAke1xuICAgICAgICBTVEFUVVNfQ09ERVNbcmVzcG9uc2Uuc3RhdHVzKCldXG4gICAgICB9ICR7Q1JMRn0ke3N0cmluZ2lmeUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycygpKX1gXG4gICAgICBsZXQgYm9keVxuICAgICAgbGV0IHdhc0Vycm9yID0gZmFsc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGJvZHkgPSBhd2FpdCByZXNwb25zZS5idWZmZXIoKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB3YXNFcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICghd2FzRXJyb3IpIHtcbiAgICAgICAgcmVzSFRUUCA9IHJlc0hUVFAucmVwbGFjZShub0daLCAnJylcbiAgICAgICAgcmVzSFRUUCA9IHJlc0hUVFAucmVwbGFjZShcbiAgICAgICAgICByZXBsYWNlQ29udGVudExlbixcbiAgICAgICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgJ3V0ZjgnKX0ke0NSTEZ9YFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVjb3JkIGhhcyAwIGNvbnRlbnRcbiAgICAgICAgcmVzSFRUUCA9IHJlc0hUVFAucmVwbGFjZShcbiAgICAgICAgICByZXBsYWNlQ29udGVudExlbixcbiAgICAgICAgICBgQ29udGVudC1MZW5ndGg6IDAke0NSTEZ9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy53cml0ZVJlcXVlc3RSZXNwb25zZVJlY29yZHMoXG4gICAgICAgIHRoaXMuX1VQLmhyZWYsXG4gICAgICAgIHsgaGVhZGVyczogcmVxSFRUUCwgZGF0YTogcmVxdWVzdC5wb3N0RGF0YSgpIH0sXG4gICAgICAgIHsgaGVhZGVyczogcmVzSFRUUCwgZGF0YTogYm9keSB9XG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLndyaXRlUmVxdWVzdFJlY29yZCh0aGlzLl9VUC5ocmVmLCByZXFIVFRQLCByZXF1ZXN0LnBvc3REYXRhKCkpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7UHVwcGV0ZWVyV0FSQ0dlbmVyYXRvcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBQdXBwZXRlZXJXQVJDR2VuZXJhdG9yXG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNTdHJpbmc6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZyc7XG4gIH0sXG4gIGlzT2JqZWN0OiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09PSBudWxsO1xuICB9LFxuICBpc051bGxPclVuZGVmaW5lZDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PSBudWxsO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBJZiBvYmouaGFzT3duUHJvcGVydHkgaGFzIGJlZW4gb3ZlcnJpZGRlbiwgdGhlbiBjYWxsaW5nXG4vLyBvYmouaGFzT3duUHJvcGVydHkocHJvcCkgd2lsbCBicmVhay5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzA3XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHFzLCBzZXAsIGVxLCBvcHRpb25zKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICB2YXIgb2JqID0ge307XG5cbiAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciByZWdleHAgPSAvXFwrL2c7XG4gIHFzID0gcXMuc3BsaXQoc2VwKTtcblxuICB2YXIgbWF4S2V5cyA9IDEwMDA7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7XG4gICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5cztcbiAgfVxuXG4gIHZhciBsZW4gPSBxcy5sZW5ndGg7XG4gIC8vIG1heEtleXMgPD0gMCBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbGltaXQga2V5cyBjb3VudFxuICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykge1xuICAgIGxlbiA9IG1heEtleXM7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLFxuICAgICAgICBpZHggPSB4LmluZGV4T2YoZXEpLFxuICAgICAgICBrc3RyLCB2c3RyLCBrLCB2O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTtcbiAgICAgIHZzdHIgPSB4LnN1YnN0cihpZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3N0ciA9IHg7XG4gICAgICB2c3RyID0gJyc7XG4gICAgfVxuXG4gICAgayA9IGRlY29kZVVSSUNvbXBvbmVudChrc3RyKTtcbiAgICB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShvYmosIGspKSB7XG4gICAgICBvYmpba10gPSB2O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICBvYmpba10ucHVzaCh2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tdID0gW29ialtrXSwgdl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG1hcChvYmplY3RLZXlzKG9iaiksIGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBtYXAob2JqW2tdLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZSh2KSk7XG4gICAgICAgIH0pLmpvaW4oc2VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7XG4gICAgICB9XG4gICAgfSkuam9pbihzZXApO1xuXG4gIH1cblxuICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUobmFtZSkpICsgZXEgK1xuICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5mdW5jdGlvbiBtYXAgKHhzLCBmKSB7XG4gIGlmICh4cy5tYXApIHJldHVybiB4cy5tYXAoZik7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy5wdXNoKGYoeHNbaV0sIGkpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHJlcy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJ2YXIgY2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vY2FwYWJpbGl0eScpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgcmVzcG9uc2UgPSByZXF1aXJlKCcuL3Jlc3BvbnNlJylcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKVxudmFyIHRvQXJyYXlCdWZmZXIgPSByZXF1aXJlKCd0by1hcnJheWJ1ZmZlcicpXG5cbnZhciBJbmNvbWluZ01lc3NhZ2UgPSByZXNwb25zZS5JbmNvbWluZ01lc3NhZ2VcbnZhciByU3RhdGVzID0gcmVzcG9uc2UucmVhZHlTdGF0ZXNcblxuZnVuY3Rpb24gZGVjaWRlTW9kZSAocHJlZmVyQmluYXJ5LCB1c2VGZXRjaCkge1xuXHRpZiAoY2FwYWJpbGl0eS5mZXRjaCAmJiB1c2VGZXRjaCkge1xuXHRcdHJldHVybiAnZmV0Y2gnXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5tb3pjaHVua2VkYXJyYXlidWZmZXIpIHtcblx0XHRyZXR1cm4gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkubXNzdHJlYW0pIHtcblx0XHRyZXR1cm4gJ21zLXN0cmVhbSdcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5LmFycmF5YnVmZmVyICYmIHByZWZlckJpbmFyeSkge1xuXHRcdHJldHVybiAnYXJyYXlidWZmZXInXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS52YkFycmF5ICYmIHByZWZlckJpbmFyeSkge1xuXHRcdHJldHVybiAndGV4dDp2YmFycmF5J1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAndGV4dCdcblx0fVxufVxuXG52YXIgQ2xpZW50UmVxdWVzdCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdHMpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHN0cmVhbS5Xcml0YWJsZS5jYWxsKHNlbGYpXG5cblx0c2VsZi5fb3B0cyA9IG9wdHNcblx0c2VsZi5fYm9keSA9IFtdXG5cdHNlbGYuX2hlYWRlcnMgPSB7fVxuXHRpZiAob3B0cy5hdXRoKVxuXHRcdHNlbGYuc2V0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBuZXcgQnVmZmVyKG9wdHMuYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpKVxuXHRPYmplY3Qua2V5cyhvcHRzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcblx0XHRzZWxmLnNldEhlYWRlcihuYW1lLCBvcHRzLmhlYWRlcnNbbmFtZV0pXG5cdH0pXG5cblx0dmFyIHByZWZlckJpbmFyeVxuXHR2YXIgdXNlRmV0Y2ggPSB0cnVlXG5cdGlmIChvcHRzLm1vZGUgPT09ICdkaXNhYmxlLWZldGNoJyB8fCAoJ3JlcXVlc3RUaW1lb3V0JyBpbiBvcHRzICYmICFjYXBhYmlsaXR5LmFib3J0Q29udHJvbGxlcikpIHtcblx0XHQvLyBJZiB0aGUgdXNlIG9mIFhIUiBzaG91bGQgYmUgcHJlZmVycmVkLiBOb3QgdHlwaWNhbGx5IG5lZWRlZC5cblx0XHR1c2VGZXRjaCA9IGZhbHNlXG5cdFx0cHJlZmVyQmluYXJ5ID0gdHJ1ZVxuXHR9IGVsc2UgaWYgKG9wdHMubW9kZSA9PT0gJ3ByZWZlci1zdHJlYW1pbmcnKSB7XG5cdFx0Ly8gSWYgc3RyZWFtaW5nIGlzIGEgaGlnaCBwcmlvcml0eSBidXQgYmluYXJ5IGNvbXBhdGliaWxpdHkgYW5kXG5cdFx0Ly8gdGhlIGFjY3VyYWN5IG9mIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXIgYXJlbid0XG5cdFx0cHJlZmVyQmluYXJ5ID0gZmFsc2Vcblx0fSBlbHNlIGlmIChvcHRzLm1vZGUgPT09ICdhbGxvdy13cm9uZy1jb250ZW50LXR5cGUnKSB7XG5cdFx0Ly8gSWYgc3RyZWFtaW5nIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gcHJlc2VydmluZyB0aGUgJ2NvbnRlbnQtdHlwZScgaGVhZGVyXG5cdFx0cHJlZmVyQmluYXJ5ID0gIWNhcGFiaWxpdHkub3ZlcnJpZGVNaW1lVHlwZVxuXHR9IGVsc2UgaWYgKCFvcHRzLm1vZGUgfHwgb3B0cy5tb2RlID09PSAnZGVmYXVsdCcgfHwgb3B0cy5tb2RlID09PSAncHJlZmVyLWZhc3QnKSB7XG5cdFx0Ly8gVXNlIGJpbmFyeSBpZiB0ZXh0IHN0cmVhbWluZyBtYXkgY29ycnVwdCBkYXRhIG9yIHRoZSBjb250ZW50LXR5cGUgaGVhZGVyLCBvciBmb3Igc3BlZWRcblx0XHRwcmVmZXJCaW5hcnkgPSB0cnVlXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBvcHRzLm1vZGUnKVxuXHR9XG5cdHNlbGYuX21vZGUgPSBkZWNpZGVNb2RlKHByZWZlckJpbmFyeSwgdXNlRmV0Y2gpXG5cdHNlbGYuX2ZldGNoVGltZXIgPSBudWxsXG5cblx0c2VsZi5vbignZmluaXNoJywgZnVuY3Rpb24gKCkge1xuXHRcdHNlbGYuX29uRmluaXNoKClcblx0fSlcbn1cblxuaW5oZXJpdHMoQ2xpZW50UmVxdWVzdCwgc3RyZWFtLldyaXRhYmxlKVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRIZWFkZXIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHZhciBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblx0Ly8gVGhpcyBjaGVjayBpcyBub3QgbmVjZXNzYXJ5LCBidXQgaXQgcHJldmVudHMgd2FybmluZ3MgZnJvbSBicm93c2VycyBhYm91dCBzZXR0aW5nIHVuc2FmZVxuXHQvLyBoZWFkZXJzLiBUbyBiZSBob25lc3QgSSdtIG5vdCBlbnRpcmVseSBzdXJlIGhpZGluZyB0aGVzZSB3YXJuaW5ncyBpcyBhIGdvb2QgdGhpbmcsIGJ1dFxuXHQvLyBodHRwLWJyb3dzZXJpZnkgZGlkIGl0LCBzbyBJIHdpbGwgdG9vLlxuXHRpZiAodW5zYWZlSGVhZGVycy5pbmRleE9mKGxvd2VyTmFtZSkgIT09IC0xKVxuXHRcdHJldHVyblxuXG5cdHNlbGYuX2hlYWRlcnNbbG93ZXJOYW1lXSA9IHtcblx0XHRuYW1lOiBuYW1lLFxuXHRcdHZhbHVlOiB2YWx1ZVxuXHR9XG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdHZhciBoZWFkZXIgPSB0aGlzLl9oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV1cblx0aWYgKGhlYWRlcilcblx0XHRyZXR1cm4gaGVhZGVyLnZhbHVlXG5cdHJldHVybiBudWxsXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnJlbW92ZUhlYWRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRkZWxldGUgc2VsZi5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRyZXR1cm5cblx0dmFyIG9wdHMgPSBzZWxmLl9vcHRzXG5cblx0dmFyIGhlYWRlcnNPYmogPSBzZWxmLl9oZWFkZXJzXG5cdHZhciBib2R5ID0gbnVsbFxuXHRpZiAob3B0cy5tZXRob2QgIT09ICdHRVQnICYmIG9wdHMubWV0aG9kICE9PSAnSEVBRCcpIHtcblx0XHRpZiAoY2FwYWJpbGl0eS5hcnJheWJ1ZmZlcikge1xuXHRcdFx0Ym9keSA9IHRvQXJyYXlCdWZmZXIoQnVmZmVyLmNvbmNhdChzZWxmLl9ib2R5KSlcblx0XHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkuYmxvYkNvbnN0cnVjdG9yKSB7XG5cdFx0XHRib2R5ID0gbmV3IGdsb2JhbC5CbG9iKHNlbGYuX2JvZHkubWFwKGZ1bmN0aW9uIChidWZmZXIpIHtcblx0XHRcdFx0cmV0dXJuIHRvQXJyYXlCdWZmZXIoYnVmZmVyKVxuXHRcdFx0fSksIHtcblx0XHRcdFx0dHlwZTogKGhlYWRlcnNPYmpbJ2NvbnRlbnQtdHlwZSddIHx8IHt9KS52YWx1ZSB8fCAnJ1xuXHRcdFx0fSlcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gZ2V0IHV0Zjggc3RyaW5nXG5cdFx0XHRib2R5ID0gQnVmZmVyLmNvbmNhdChzZWxmLl9ib2R5KS50b1N0cmluZygpXG5cdFx0fVxuXHR9XG5cblx0Ly8gY3JlYXRlIGZsYXR0ZW5lZCBsaXN0IG9mIGhlYWRlcnNcblx0dmFyIGhlYWRlcnNMaXN0ID0gW11cblx0T2JqZWN0LmtleXMoaGVhZGVyc09iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5TmFtZSkge1xuXHRcdHZhciBuYW1lID0gaGVhZGVyc09ialtrZXlOYW1lXS5uYW1lXG5cdFx0dmFyIHZhbHVlID0gaGVhZGVyc09ialtrZXlOYW1lXS52YWx1ZVxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0dmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodikge1xuXHRcdFx0XHRoZWFkZXJzTGlzdC5wdXNoKFtuYW1lLCB2XSlcblx0XHRcdH0pXG5cdFx0fSBlbHNlIHtcblx0XHRcdGhlYWRlcnNMaXN0LnB1c2goW25hbWUsIHZhbHVlXSlcblx0XHR9XG5cdH0pXG5cblx0aWYgKHNlbGYuX21vZGUgPT09ICdmZXRjaCcpIHtcblx0XHR2YXIgc2lnbmFsID0gbnVsbFxuXHRcdHZhciBmZXRjaFRpbWVyID0gbnVsbFxuXHRcdGlmIChjYXBhYmlsaXR5LmFib3J0Q29udHJvbGxlcikge1xuXHRcdFx0dmFyIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcblx0XHRcdHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsXG5cdFx0XHRzZWxmLl9mZXRjaEFib3J0Q29udHJvbGxlciA9IGNvbnRyb2xsZXJcblxuXHRcdFx0aWYgKCdyZXF1ZXN0VGltZW91dCcgaW4gb3B0cyAmJiBvcHRzLnJlcXVlc3RUaW1lb3V0ICE9PSAwKSB7XG5cdFx0XHRcdHNlbGYuX2ZldGNoVGltZXIgPSBnbG9iYWwuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi5lbWl0KCdyZXF1ZXN0VGltZW91dCcpXG5cdFx0XHRcdFx0aWYgKHNlbGYuX2ZldGNoQWJvcnRDb250cm9sbGVyKVxuXHRcdFx0XHRcdFx0c2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuXHRcdFx0XHR9LCBvcHRzLnJlcXVlc3RUaW1lb3V0KVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGdsb2JhbC5mZXRjaChzZWxmLl9vcHRzLnVybCwge1xuXHRcdFx0bWV0aG9kOiBzZWxmLl9vcHRzLm1ldGhvZCxcblx0XHRcdGhlYWRlcnM6IGhlYWRlcnNMaXN0LFxuXHRcdFx0Ym9keTogYm9keSB8fCB1bmRlZmluZWQsXG5cdFx0XHRtb2RlOiAnY29ycycsXG5cdFx0XHRjcmVkZW50aWFsczogb3B0cy53aXRoQ3JlZGVudGlhbHMgPyAnaW5jbHVkZScgOiAnc2FtZS1vcmlnaW4nLFxuXHRcdFx0c2lnbmFsOiBzaWduYWxcblx0XHR9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHRcdFx0c2VsZi5fZmV0Y2hSZXNwb25zZSA9IHJlc3BvbnNlXG5cdFx0XHRzZWxmLl9jb25uZWN0KClcblx0XHR9LCBmdW5jdGlvbiAocmVhc29uKSB7XG5cdFx0XHRnbG9iYWwuY2xlYXJUaW1lb3V0KHNlbGYuX2ZldGNoVGltZXIpXG5cdFx0XHRpZiAoIXNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIHJlYXNvbilcblx0XHR9KVxuXHR9IGVsc2Uge1xuXHRcdHZhciB4aHIgPSBzZWxmLl94aHIgPSBuZXcgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KClcblx0XHR0cnkge1xuXHRcdFx0eGhyLm9wZW4oc2VsZi5fb3B0cy5tZXRob2QsIHNlbGYuX29wdHMudXJsLCB0cnVlKVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0Ly8gQ2FuJ3Qgc2V0IHJlc3BvbnNlVHlwZSBvbiByZWFsbHkgb2xkIGJyb3dzZXJzXG5cdFx0aWYgKCdyZXNwb25zZVR5cGUnIGluIHhocilcblx0XHRcdHhoci5yZXNwb25zZVR5cGUgPSBzZWxmLl9tb2RlLnNwbGl0KCc6JylbMF1cblxuXHRcdGlmICgnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpXG5cdFx0XHR4aHIud2l0aENyZWRlbnRpYWxzID0gISFvcHRzLndpdGhDcmVkZW50aWFsc1xuXG5cdFx0aWYgKHNlbGYuX21vZGUgPT09ICd0ZXh0JyAmJiAnb3ZlcnJpZGVNaW1lVHlwZScgaW4geGhyKVxuXHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQnKVxuXG5cdFx0aWYgKCdyZXF1ZXN0VGltZW91dCcgaW4gb3B0cykge1xuXHRcdFx0eGhyLnRpbWVvdXQgPSBvcHRzLnJlcXVlc3RUaW1lb3V0XG5cdFx0XHR4aHIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLmVtaXQoJ3JlcXVlc3RUaW1lb3V0Jylcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoZWFkZXJzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcblx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuXHRcdH0pXG5cblx0XHRzZWxmLl9yZXNwb25zZSA9IG51bGxcblx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0c3dpdGNoICh4aHIucmVhZHlTdGF0ZSkge1xuXHRcdFx0XHRjYXNlIHJTdGF0ZXMuTE9BRElORzpcblx0XHRcdFx0Y2FzZSByU3RhdGVzLkRPTkU6XG5cdFx0XHRcdFx0c2VsZi5fb25YSFJQcm9ncmVzcygpXG5cdFx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTmVjZXNzYXJ5IGZvciBzdHJlYW1pbmcgaW4gRmlyZWZveCwgc2luY2UgeGhyLnJlc3BvbnNlIGlzIE9OTFkgZGVmaW5lZFxuXHRcdC8vIGluIG9ucHJvZ3Jlc3MsIG5vdCBpbiBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aCB4aHIucmVhZHlTdGF0ZSA9IDNcblx0XHRpZiAoc2VsZi5fbW9kZSA9PT0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJykge1xuXHRcdFx0eGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuX29uWEhSUHJvZ3Jlc3MoKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdYSFIgZXJyb3InKSlcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0eGhyLnNlbmQoYm9keSlcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0fSlcblx0XHRcdHJldHVyblxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB4aHIuc3RhdHVzIGlzIHJlYWRhYmxlIGFuZCBub24temVybywgaW5kaWNhdGluZyBubyBlcnJvci5cbiAqIEV2ZW4gdGhvdWdoIHRoZSBzcGVjIHNheXMgaXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiByZWFkeVN0YXRlIDMsXG4gKiBhY2Nlc3NpbmcgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBJRThcbiAqL1xuZnVuY3Rpb24gc3RhdHVzVmFsaWQgKHhocikge1xuXHR0cnkge1xuXHRcdHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzXG5cdFx0cmV0dXJuIChzdGF0dXMgIT09IG51bGwgJiYgc3RhdHVzICE9PSAwKVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX29uWEhSUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGlmICghc3RhdHVzVmFsaWQoc2VsZi5feGhyKSB8fCBzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cblx0aWYgKCFzZWxmLl9yZXNwb25zZSlcblx0XHRzZWxmLl9jb25uZWN0KClcblxuXHRzZWxmLl9yZXNwb25zZS5fb25YSFJQcm9ncmVzcygpXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl9jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHRpZiAoc2VsZi5fZGVzdHJveWVkKVxuXHRcdHJldHVyblxuXG5cdHNlbGYuX3Jlc3BvbnNlID0gbmV3IEluY29taW5nTWVzc2FnZShzZWxmLl94aHIsIHNlbGYuX2ZldGNoUmVzcG9uc2UsIHNlbGYuX21vZGUsIHNlbGYuX2ZldGNoVGltZXIpXG5cdHNlbGYuX3Jlc3BvbnNlLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuXHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdH0pXG5cblx0c2VsZi5lbWl0KCdyZXNwb25zZScsIHNlbGYuX3Jlc3BvbnNlKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHRzZWxmLl9ib2R5LnB1c2goY2h1bmspXG5cdGNiKClcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuYWJvcnQgPSBDbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0c2VsZi5fZGVzdHJveWVkID0gdHJ1ZVxuXHRnbG9iYWwuY2xlYXJUaW1lb3V0KHNlbGYuX2ZldGNoVGltZXIpXG5cdGlmIChzZWxmLl9yZXNwb25zZSlcblx0XHRzZWxmLl9yZXNwb25zZS5fZGVzdHJveWVkID0gdHJ1ZVxuXHRpZiAoc2VsZi5feGhyKVxuXHRcdHNlbGYuX3hoci5hYm9ydCgpXG5cdGVsc2UgaWYgKHNlbGYuX2ZldGNoQWJvcnRDb250cm9sbGVyKVxuXHRcdHNlbGYuX2ZldGNoQWJvcnRDb250cm9sbGVyLmFib3J0KClcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYikge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0aWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0Y2IgPSBkYXRhXG5cdFx0ZGF0YSA9IHVuZGVmaW5lZFxuXHR9XG5cblx0c3RyZWFtLldyaXRhYmxlLnByb3RvdHlwZS5lbmQuY2FsbChzZWxmLCBkYXRhLCBlbmNvZGluZywgY2IpXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmZsdXNoSGVhZGVycyA9IGZ1bmN0aW9uICgpIHt9XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkge31cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldE5vRGVsYXkgPSBmdW5jdGlvbiAoKSB7fVxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0U29ja2V0S2VlcEFsaXZlID0gZnVuY3Rpb24gKCkge31cblxuLy8gVGFrZW4gZnJvbSBodHRwOi8vd3d3LnczLm9yZy9UUi9YTUxIdHRwUmVxdWVzdC8jdGhlLXNldHJlcXVlc3RoZWFkZXIlMjglMjktbWV0aG9kXG52YXIgdW5zYWZlSGVhZGVycyA9IFtcblx0J2FjY2VwdC1jaGFyc2V0Jyxcblx0J2FjY2VwdC1lbmNvZGluZycsXG5cdCdhY2Nlc3MtY29udHJvbC1yZXF1ZXN0LWhlYWRlcnMnLFxuXHQnYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1tZXRob2QnLFxuXHQnY29ubmVjdGlvbicsXG5cdCdjb250ZW50LWxlbmd0aCcsXG5cdCdjb29raWUnLFxuXHQnY29va2llMicsXG5cdCdkYXRlJyxcblx0J2RudCcsXG5cdCdleHBlY3QnLFxuXHQnaG9zdCcsXG5cdCdrZWVwLWFsaXZlJyxcblx0J29yaWdpbicsXG5cdCdyZWZlcmVyJyxcblx0J3RlJyxcblx0J3RyYWlsZXInLFxuXHQndHJhbnNmZXItZW5jb2RpbmcnLFxuXHQndXBncmFkZScsXG5cdCd2aWEnXG5dXG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJ1Zikge1xuXHQvLyBJZiB0aGUgYnVmZmVyIGlzIGJhY2tlZCBieSBhIFVpbnQ4QXJyYXksIGEgZmFzdGVyIHZlcnNpb24gd2lsbCB3b3JrXG5cdGlmIChidWYgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG5cdFx0Ly8gSWYgdGhlIGJ1ZmZlciBpc24ndCBhIHN1YmFycmF5LCByZXR1cm4gdGhlIHVuZGVybHlpbmcgQXJyYXlCdWZmZXJcblx0XHRpZiAoYnVmLmJ5dGVPZmZzZXQgPT09IDAgJiYgYnVmLmJ5dGVMZW5ndGggPT09IGJ1Zi5idWZmZXIuYnl0ZUxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGJ1Zi5idWZmZXJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBidWYuYnVmZmVyLnNsaWNlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBnZXQgYSBwcm9wZXIgY29weVxuXHRcdFx0cmV0dXJuIGJ1Zi5idWZmZXIuc2xpY2UoYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlT2Zmc2V0ICsgYnVmLmJ5dGVMZW5ndGgpXG5cdFx0fVxuXHR9XG5cblx0aWYgKEJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG5cdFx0Ly8gVGhpcyBpcyB0aGUgc2xvdyB2ZXJzaW9uIHRoYXQgd2lsbCB3b3JrIHdpdGggYW55IEJ1ZmZlclxuXHRcdC8vIGltcGxlbWVudGF0aW9uIChldmVuIGluIG9sZCBicm93c2Vycylcblx0XHR2YXIgYXJyYXlDb3B5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmxlbmd0aClcblx0XHR2YXIgbGVuID0gYnVmLmxlbmd0aFxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGFycmF5Q29weVtpXSA9IGJ1ZltpXVxuXHRcdH1cblx0XHRyZXR1cm4gYXJyYXlDb3B5LmJ1ZmZlclxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG5cdH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgICB2YXIgdGFyZ2V0ID0ge31cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCIxMDBcIjogXCJDb250aW51ZVwiLFxuICBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgXCIxMDJcIjogXCJQcm9jZXNzaW5nXCIsXG4gIFwiMjAwXCI6IFwiT0tcIixcbiAgXCIyMDFcIjogXCJDcmVhdGVkXCIsXG4gIFwiMjAyXCI6IFwiQWNjZXB0ZWRcIixcbiAgXCIyMDNcIjogXCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICBcIjIwNFwiOiBcIk5vIENvbnRlbnRcIixcbiAgXCIyMDVcIjogXCJSZXNldCBDb250ZW50XCIsXG4gIFwiMjA2XCI6IFwiUGFydGlhbCBDb250ZW50XCIsXG4gIFwiMjA3XCI6IFwiTXVsdGktU3RhdHVzXCIsXG4gIFwiMjA4XCI6IFwiQWxyZWFkeSBSZXBvcnRlZFwiLFxuICBcIjIyNlwiOiBcIklNIFVzZWRcIixcbiAgXCIzMDBcIjogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gIFwiMzAxXCI6IFwiTW92ZWQgUGVybWFuZW50bHlcIixcbiAgXCIzMDJcIjogXCJGb3VuZFwiLFxuICBcIjMwM1wiOiBcIlNlZSBPdGhlclwiLFxuICBcIjMwNFwiOiBcIk5vdCBNb2RpZmllZFwiLFxuICBcIjMwNVwiOiBcIlVzZSBQcm94eVwiLFxuICBcIjMwN1wiOiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICBcIjMwOFwiOiBcIlBlcm1hbmVudCBSZWRpcmVjdFwiLFxuICBcIjQwMFwiOiBcIkJhZCBSZXF1ZXN0XCIsXG4gIFwiNDAxXCI6IFwiVW5hdXRob3JpemVkXCIsXG4gIFwiNDAyXCI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLFxuICBcIjQwM1wiOiBcIkZvcmJpZGRlblwiLFxuICBcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLFxuICBcIjQwNVwiOiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLFxuICBcIjQwNlwiOiBcIk5vdCBBY2NlcHRhYmxlXCIsXG4gIFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MDhcIjogXCJSZXF1ZXN0IFRpbWVvdXRcIixcbiAgXCI0MDlcIjogXCJDb25mbGljdFwiLFxuICBcIjQxMFwiOiBcIkdvbmVcIixcbiAgXCI0MTFcIjogXCJMZW5ndGggUmVxdWlyZWRcIixcbiAgXCI0MTJcIjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG4gIFwiNDEzXCI6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgXCI0MTRcIjogXCJVUkkgVG9vIExvbmdcIixcbiAgXCI0MTVcIjogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG4gIFwiNDE2XCI6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gIFwiNDE3XCI6IFwiRXhwZWN0YXRpb24gRmFpbGVkXCIsXG4gIFwiNDE4XCI6IFwiSSdtIGEgdGVhcG90XCIsXG4gIFwiNDIxXCI6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICBcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG4gIFwiNDIzXCI6IFwiTG9ja2VkXCIsXG4gIFwiNDI0XCI6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgXCI0MjVcIjogXCJVbm9yZGVyZWQgQ29sbGVjdGlvblwiLFxuICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcbiAgXCI0MjhcIjogXCJQcmVjb25kaXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MjlcIjogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICBcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgXCI0NTFcIjogXCJVbmF2YWlsYWJsZSBGb3IgTGVnYWwgUmVhc29uc1wiLFxuICBcIjUwMFwiOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICBcIjUwMVwiOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuICBcIjUwMlwiOiBcIkJhZCBHYXRld2F5XCIsXG4gIFwiNTAzXCI6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICBcIjUwNFwiOiBcIkdhdGV3YXkgVGltZW91dFwiLFxuICBcIjUwNVwiOiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCIsXG4gIFwiNTA2XCI6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcbiAgXCI1MDdcIjogXCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiLFxuICBcIjUwOFwiOiBcIkxvb3AgRGV0ZWN0ZWRcIixcbiAgXCI1MDlcIjogXCJCYW5kd2lkdGggTGltaXQgRXhjZWVkZWRcIixcbiAgXCI1MTBcIjogXCJOb3QgRXh0ZW5kZWRcIixcbiAgXCI1MTFcIjogXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCJcbn1cbiIsInZhciBjcmVhdGVDb21wb3VuZGVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQ29tcG91bmRlcicpLFxuICAgIHVwcGVyRmlyc3QgPSByZXF1aXJlKCcuL3VwcGVyRmlyc3QnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICogW3N0YXJ0IGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1N0eWxpc3RpY19vcl9zcGVjaWFsaXNlZF91c2FnZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjEuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gKiAvLyA9PiAnRm9vIEJhcidcbiAqXG4gKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gKiAvLyA9PiAnRm9vIEJhcidcbiAqXG4gKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAqIC8vID0+ICdGT08gQkFSJ1xuICovXG52YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhcnRDYXNlO1xuIiwidmFyIGFycmF5UmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXlSZWR1Y2UnKSxcbiAgICBkZWJ1cnIgPSByZXF1aXJlKCcuL2RlYnVycicpLFxuICAgIHdvcmRzID0gcmVxdWlyZSgnLi93b3JkcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCI7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xudmFyIHJlQXBvcyA9IFJlZ0V4cChyc0Fwb3MsICdnJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCAnJykpLCBjYWxsYmFjaywgJycpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNvbXBvdW5kZXI7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBhcnJheVsrK2luZGV4XTtcbiAgfVxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlSZWR1Y2U7XG4iLCJ2YXIgZGVidXJyTGV0dGVyID0gcmVxdWlyZSgnLi9fZGVidXJyTGV0dGVyJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xudmFyIHJlTGF0aW4gPSAvW1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHhmZlxcdTAxMDAtXFx1MDE3Zl0vZztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXSc7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcyBmb3Igc3ltYm9sc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzX2Zvcl9TeW1ib2xzKS5cbiAqL1xudmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbi8qKlxuICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gKiBbTGF0aW4tMSBTdXBwbGVtZW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbi0xX1N1cHBsZW1lbnRfKFVuaWNvZGVfYmxvY2spI0NoYXJhY3Rlcl90YWJsZSlcbiAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSlcbiAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZGVidXJyLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7XG4gKiAvLyA9PiAnZGVqYSB2dSdcbiAqL1xuZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYnVycjtcbiIsInZhciBiYXNlUHJvcGVydHlPZiA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eU9mJyk7XG5cbi8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbnZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gIC8vIExhdGluLTEgU3VwcGxlbWVudCBibG9jay5cbiAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAnXFx4YzcnOiAnQycsICAnXFx4ZTcnOiAnYycsXG4gICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgJ1xceGU4JzogJ2UnLCAgJ1xceGU5JzogJ2UnLCAnXFx4ZWEnOiAnZScsICdcXHhlYic6ICdlJyxcbiAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgJ1xceGQxJzogJ04nLCAgJ1xceGYxJzogJ24nLFxuICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICdcXHhkOSc6ICdVJywgICdcXHhkYSc6ICdVJywgJ1xceGRiJzogJ1UnLCAnXFx4ZGMnOiAnVScsXG4gICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAnXFx4YzYnOiAnQWUnLCAnXFx4ZTYnOiAnYWUnLFxuICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAnXFx4ZGYnOiAnc3MnLFxuICAvLyBMYXRpbiBFeHRlbmRlZC1BIGJsb2NrLlxuICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICdcXHUwMTA2JzogJ0MnLCAgJ1xcdTAxMDgnOiAnQycsICdcXHUwMTBhJzogJ0MnLCAnXFx1MDEwYyc6ICdDJyxcbiAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICdcXHUwMTEyJzogJ0UnLCAgJ1xcdTAxMTQnOiAnRScsICdcXHUwMTE2JzogJ0UnLCAnXFx1MDExOCc6ICdFJywgJ1xcdTAxMWEnOiAnRScsXG4gICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgJ1xcdTAxMWQnOiAnZycsICAnXFx1MDExZic6ICdnJywgJ1xcdTAxMjEnOiAnZycsICdcXHUwMTIzJzogJ2cnLFxuICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICdcXHUwMTI5JzogJ2knLCAgJ1xcdTAxMmInOiAnaScsICdcXHUwMTJkJzogJ2knLCAnXFx1MDEyZic6ICdpJywgJ1xcdTAxMzEnOiAnaScsXG4gICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAnXFx1MDEzOSc6ICdMJywgICdcXHUwMTNiJzogJ0wnLCAnXFx1MDEzZCc6ICdMJywgJ1xcdTAxM2YnOiAnTCcsICdcXHUwMTQxJzogJ0wnLFxuICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICdcXHUwMTQ0JzogJ24nLCAgJ1xcdTAxNDYnOiAnbicsICdcXHUwMTQ4JzogJ24nLCAnXFx1MDE0Yic6ICduJyxcbiAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAnXFx1MDE1NCc6ICdSJywgICdcXHUwMTU2JzogJ1InLCAnXFx1MDE1OCc6ICdSJyxcbiAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgJ1xcdTAxNWInOiAncycsICAnXFx1MDE1ZCc6ICdzJywgJ1xcdTAxNWYnOiAncycsICdcXHUwMTYxJzogJ3MnLFxuICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICdcXHUwMTY4JzogJ1UnLCAgJ1xcdTAxNmEnOiAnVScsICdcXHUwMTZjJzogJ1UnLCAnXFx1MDE2ZSc6ICdVJywgJ1xcdTAxNzAnOiAnVScsICdcXHUwMTcyJzogJ1UnLFxuICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgJ1xcdTAxNzYnOiAnWScsICAnXFx1MDE3Nyc6ICd5JywgJ1xcdTAxNzgnOiAnWScsXG4gICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgJ1xcdTAxMzInOiAnSUonLCAnXFx1MDEzMyc6ICdpaicsXG4gICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbn07XG5cbi8qKlxuICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BXG4gKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIGxldHRlci5cbiAqL1xudmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVidXJyTGV0dGVyO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eU9mO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheU1hcDtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsInZhciBhc2NpaVdvcmRzID0gcmVxdWlyZSgnLi9fYXNjaWlXb3JkcycpLFxuICAgIGhhc1VuaWNvZGVXb3JkID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZVdvcmQnKSxcbiAgICB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKSxcbiAgICB1bmljb2RlV29yZHMgPSByZXF1aXJlKCcuL191bmljb2RlV29yZHMnKTtcblxuLyoqXG4gKiBTcGxpdHMgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICpcbiAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJywgL1teLCBdKy9nKTtcbiAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAqL1xuZnVuY3Rpb24gd29yZHMoc3RyaW5nLCBwYXR0ZXJuLCBndWFyZCkge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICBwYXR0ZXJuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBwYXR0ZXJuO1xuXG4gIGlmIChwYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICB9XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybikgfHwgW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd29yZHM7XG4iLCIvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbnZhciByZUFzY2lpV29yZCA9IC9bXlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceDdmXSsvZztcblxuLyoqXG4gKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICovXG5mdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlQXNjaWlXb3JkKSB8fCBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaVdvcmRzO1xuIiwiLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xudmFyIHJlSGFzVW5pY29kZVdvcmQgPSAvW2Etel1bQS1aXXxbQS1aXXsyfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgYSB3b3JkIGNvbXBvc2VkIG9mIFVuaWNvZGUgc3ltYm9scy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSB3b3JkIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1VuaWNvZGVXb3JkKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzVW5pY29kZVdvcmQ7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgcnNMb3dlclJhbmdlID0gJ2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZicsXG4gICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgIHJzUHVuY3R1YXRpb25SYW5nZSA9ICdcXFxcdTIwMDAtXFxcXHUyMDZmJyxcbiAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJyxcbiAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0Fwb3MgPSBcIlsnXFx1MjAxOV1cIixcbiAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgcnNEaWdpdHMgPSAnXFxcXGQrJyxcbiAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgIHJzTWlzYyA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgcnNCcmVha1JhbmdlICsgcnNEaWdpdHMgKyByc0RpbmdiYXRSYW5nZSArIHJzTG93ZXJSYW5nZSArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNVcHBlciA9ICdbJyArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByc01pc2NMb3dlciA9ICcoPzonICsgcnNMb3dlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICByc09wdENvbnRyVXBwZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpEfExMfE18UkV8U3xUfFZFKSk/JyxcbiAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxO1xuXG4vKiogVXNlZCB0byBtYXRjaCBjb21wbGV4IG9yIGNvbXBvdW5kIHdvcmRzLiAqL1xudmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICByc01pc2NVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIgKyByc01pc2NMb3dlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgcnNPcmRVcHBlcixcbiAgcnNPcmRMb3dlcixcbiAgcnNEaWdpdHMsXG4gIHJzRW1vamlcbl0uam9pbignfCcpLCAnZycpO1xuXG4vKipcbiAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICovXG5mdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVdvcmRzO1xuIiwidmFyIGNyZWF0ZUNhc2VGaXJzdCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUNhc2VGaXJzdCcpO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gKiAvLyA9PiAnRnJlZCdcbiAqXG4gKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAqIC8vID0+ICdGUkVEJ1xuICovXG52YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1cHBlckZpcnN0O1xuIiwidmFyIGNhc3RTbGljZSA9IHJlcXVpcmUoJy4vX2Nhc3RTbGljZScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgc3RyaW5nVG9BcnJheSA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvQXJyYXknKSxcbiAgICB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5sb3dlckZpcnN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBTdHJpbmdgIGNhc2UgbWV0aG9kIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgdmFyIHN0clN5bWJvbHMgPSBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gc3RyaW5nVG9BcnJheShzdHJpbmcpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHZhciBjaHIgPSBzdHJTeW1ib2xzXG4gICAgICA/IHN0clN5bWJvbHNbMF1cbiAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgIHZhciB0cmFpbGluZyA9IHN0clN5bWJvbHNcbiAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDEpLmpvaW4oJycpXG4gICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgIHJldHVybiBjaHJbbWV0aG9kTmFtZV0oKSArIHRyYWlsaW5nO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNhc2VGaXJzdDtcbiIsInZhciBiYXNlU2xpY2UgPSByZXF1aXJlKCcuL19iYXNlU2xpY2UnKTtcblxuLyoqXG4gKiBDYXN0cyBgYXJyYXlgIHRvIGEgc2xpY2UgaWYgaXQncyBuZWVkZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBzbGljZS5cbiAqL1xuZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYXN0U2xpY2U7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gIH1cbiAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kO1xuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5ndGg7XG4gIH1cbiAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNsaWNlO1xuIiwidmFyIGFzY2lpVG9BcnJheSA9IHJlcXVpcmUoJy4vX2FzY2lpVG9BcnJheScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgdW5pY29kZVRvQXJyYXkgPSByZXF1aXJlKCcuL191bmljb2RlVG9BcnJheScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdUb0FycmF5O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaVRvQXJyYXk7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgcnNNb2RpZmllciA9ICcoPzonICsgcnNDb21ibyArICd8JyArIHJzRml0eiArICcpJyxcbiAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgcnNTdXJyUGFpciA9ICdbXFxcXHVkODAwLVxcXFx1ZGJmZl1bXFxcXHVkYzAwLVxcXFx1ZGZmZl0nLFxuICAgIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xudmFyIHJlT3B0TW9kID0gcnNNb2RpZmllciArICc/JyxcbiAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4vKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xudmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmljb2RlVG9BcnJheTtcbiIsImNvbnN0IHsgQ1JMRiB9ID0gcmVxdWlyZSgnLi93YXJjRmllbGRzJylcbmNvbnN0IFdBUkNXcml0ZXJCYXNlID0gcmVxdWlyZSgnLi93YXJjV3JpdGVyQmFzZScpXG5jb25zdCB7IG5vR1osIHJlcGxhY2VDb250ZW50TGVuIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbi8qKlxuICogQGV4dGVuZHMge1dBUkNXcml0ZXJCYXNlfVxuICogQGRlc2MgV0FSQyBHZW5lcmF0b3IgZm9yIHVzZSB3aXRoIHB1cHBldGVlclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vTjB0YU4zcmQvY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UtZXh0cmFcbiAqL1xuY2xhc3MgQ1JJRXh0cmFXQVJDR2VuZXJhdG9yIGV4dGVuZHMgV0FSQ1dyaXRlckJhc2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtDUklFeHRyYVJlcXVlc3RDYXB0dXJlcn0gY2FwdHVyZXIgLSBUaGUgUHVwcGV0ZWVyIHJlcXVlc3QgY2FwdHVyZXIgdGhhdCBjb250YWlucyByZXF1ZXN0c1xuICAgKiB0byBiZSBzZXJpYWxpemVkIHRvIHRoZSBXQVJDXG4gICAqIEBwYXJhbSB7V0FSQ0dlbk9wdHN9IGdlbk9wdHMgLSBPcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBXQVJDIGFuZCBvcHRpb25hbGx5IGdlbmVyYXRpbmdcbiAgICogV0FSQyBpbmZvLCBXQVJDIGluZm8gKyBXZWJyZWNvcmRlciBQbGF5ZXIgYm9va21hcmsgbGlzdCwgbWV0YWRhdGEgcmVjb3Jkc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gV0FSQyBnZW5lcmF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVdBUkMgKGNhcHR1cmVyLCBnZW5PcHRzKSB7XG4gICAgY29uc3QgeyB3YXJjT3B0cywgd2luZm8sIG1ldGFkYXRhIH0gPSBnZW5PcHRzXG4gICAgdGhpcy5pbml0V0FSQyh3YXJjT3B0cy53YXJjUGF0aCwgd2FyY09wdHMpXG4gICAgaWYgKHdpbmZvICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVXYXJjSW5mb1JlY29yZCh3aW5mbylcbiAgICB9XG4gICAgaWYgKGdlbk9wdHMucGFnZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVXZWJyZWNvcmRlckJvb2ttYXJrc0luZm9SZWNvcmQoZ2VuT3B0cy5wYWdlcylcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVXYXJjTWV0YWRhdGEobWV0YWRhdGEudGFyZ2V0VVJJLCBtZXRhZGF0YS5jb250ZW50KVxuICAgIH1cbiAgICBmb3IgKGxldCByZXF1ZXN0IG9mIGNhcHR1cmVyLml0ZXJhdGVSZXF1ZXN0cygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlV2FyY0VudHJ5KHJlcXVlc3QpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLm9uY2UoJ2ZpbmlzaGVkJywgcmVzb2x2ZSlcbiAgICAgIHRoaXMuZW5kKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEdlbmVyYXRlIGEgV0FSQyByZWNvcmRcbiAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXF1ZXN0IC0gQSBjaHJvbWUtcmVtb3RlLWludGVyZmFjZS1leHRyYSBSZXF1ZXN0IG9iamVjdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVXYXJjRW50cnkgKHJlcXVlc3QpIHtcbiAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybCgpXG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdkYXRhOicpKSByZXR1cm5cbiAgICBjb25zdCByZXNwb25zZSA9IHJlcXVlc3QucmVzcG9uc2UoKVxuICAgIGxldCBwb3N0RGF0YVxuICAgIGlmIChyZXF1ZXN0LnBvc3REYXRhKCkpIHtcbiAgICAgIHBvc3REYXRhID0gcmVxdWVzdC5wb3N0RGF0YSgpXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc1Bvc3REYXRhKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBvc3REYXRhID0gYXdhaXQgcmVxdWVzdC5nZXRQb3N0RGF0YSgpXG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICBjb25zdCByZXFIVFRQID0gcmVxdWVzdC5yZXF1ZXN0TGluZUFuZEhlYWRlcnModHJ1ZSlcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGxldCByZXNIVFRQID0gcmVzcG9uc2Uuc3RhdHVzTGluZUFuZEhlYWRlcnModHJ1ZSlcbiAgICAgIGxldCBib2R5XG4gICAgICBsZXQgd2FzRXJyb3IgPSBmYWxzZVxuICAgICAgdHJ5IHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmJ1ZmZlcigpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHdhc0Vycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKCF3YXNFcnJvcikge1xuICAgICAgICByZXNIVFRQID0gcmVzSFRUUFxuICAgICAgICAgIC5yZXBsYWNlKG5vR1osICcnKVxuICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnRMZW4sXG4gICAgICAgICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgJ3V0ZjgnKX0ke0NSTEZ9YFxuICAgICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhpcyByZWNvcmQgaGFzIDAgY29udGVudFxuICAgICAgICByZXNIVFRQID0gcmVzSFRUUC5yZXBsYWNlKHJlcGxhY2VDb250ZW50TGVuLCBgQ29udGVudC1MZW5ndGg6IDAke0NSTEZ9YClcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLndyaXRlUmVxdWVzdFJlc3BvbnNlUmVjb3JkcyhcbiAgICAgICAgdXJsLFxuICAgICAgICB7IGhlYWRlcnM6IHJlcUhUVFAsIGRhdGE6IHBvc3REYXRhIH0sXG4gICAgICAgIHsgaGVhZGVyczogcmVzSFRUUCwgZGF0YTogYm9keSB9XG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLndyaXRlUmVxdWVzdFJlY29yZCh1cmwsIHJlcUhUVFAsIHBvc3REYXRhKVxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge0NSSUV4dHJhV0FSQ0dlbmVyYXRvcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBDUklFeHRyYVdBUkNHZW5lcmF0b3JcbiIsIi8qKlxuICogQHR5cGUge0NEUFJlcXVlc3RJbmZvfVxuICovXG5leHBvcnRzLkNEUFJlcXVlc3RJbmZvID0gcmVxdWlyZSgnLi9jZHBSZXF1ZXN0SW5mbycpXG5cbi8qKlxuICogQHR5cGUge0NSSUV4dHJhUmVxdWVzdENhcHR1cmVyfVxuICovXG5leHBvcnRzLkNSSUV4dHJhQ2FwdHVyZXIgPSByZXF1aXJlKCcuL2NyaUV4dHJhJylcblxuLyoqXG4gKiBAdHlwZSB7Q2FwdHVyZWRSZXF1ZXN0fVxuICovXG5leHBvcnRzLkNhcHR1cmVkUmVxdWVzdCA9IHJlcXVpcmUoJy4vY2FwdHVyZWRSZXF1ZXN0JylcblxuLyoqXG4gKiBAdHlwZSB7RWxlY3Ryb25SZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbmV4cG9ydHMuRWxlY3Ryb25DYXB0dXJlciA9IHJlcXVpcmUoJy4vZWxlY3Ryb24nKVxuXG4vKipcbiAqIEB0eXBlIHtQdXBwZXRlZXJDRFBSZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbmV4cG9ydHMuUHVwcGV0ZWVyQ0RQQ2FwdHVyZXIgPSByZXF1aXJlKCcuL3B1cHBldGVlckNEUCcpXG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlclJlcXVlc3RDYXB0dXJlcn1cbiAqL1xuZXhwb3J0cy5QdXBwZXRlZXJDYXB0dXJlciA9IHJlcXVpcmUoJy4vcHVwcGV0ZWVyJylcblxuLyoqXG4gKiBAdHlwZSB7UmVtb3RlQ2hyb21lUmVxdWVzdENhcHR1cmVyfVxuICovXG5leHBvcnRzLlJlbW90ZUNocm9tZUNhcHR1cmVyID0gcmVxdWlyZSgnLi9yZW1vdGVDaHJvbWUnKVxuXG4vKipcbiAqIEB0eXBlIHtSZXF1ZXN0SGFuZGxlcn1cbiAqL1xuZXhwb3J0cy5SZXF1ZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vcmVxdWVzdEhhbmRsZXInKVxuIiwiLyoqXG4gKiBAZGVzYyBjaHJvbWUtcmVtb3RlLWludGVyZmFjZS1leHRyYSByZXF1ZXN0IGNhcHR1cmVyXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9OMHRhTjNyZC9jaHJvbWUtcmVtb3RlLWludGVyZmFjZS1leHRyYVxuICovXG5jbGFzcyBDUklFeHRyYVJlcXVlc3RDYXB0dXJlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gez9QYWdlfSBbcGFnZV0gLSBUaGUgY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UtZXh0cmEgcGFnZSBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZXF1ZXN0RXZlbnQgPSAncmVxdWVzdCddXG4gICAqL1xuICBjb25zdHJ1Y3RvciAocGFnZSwgcmVxdWVzdEV2ZW50ID0gJ3JlcXVlc3QnKSB7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVG8gQ2FwdHVyZSBSZXF1ZXN0cyBPciBOb3QgVG8gQ2FwdHVyZSBSZXF1ZXN0c1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fY2FwdHVyZSA9IHRydWVcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIEEgbGlzdCBvZiByZXF1ZXN0cyBtYWRlXG4gICAgICogQHR5cGUge01hcDxpbnQsUmVxdWVzdD59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9yZXF1ZXN0cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX3JlcXVlc3RDID0gMFxuICAgIC8qKiBAaWdub3JlICovXG4gICAgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudCA9IHRoaXMucmVxdWVzdFdpbGxCZVNlbnQuYmluZCh0aGlzKVxuICAgIGlmIChwYWdlKSB7XG4gICAgICB0aGlzLmF0dGFjaChwYWdlLCByZXF1ZXN0RXZlbnQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEF0dGFjaCAoc3RhcnQgbGlzdGVuaW5nIGZvciByZXF1ZXN0IGV2ZW50cykgdGhlIHJlcXVlc3QgY2FwdHVyZXJlciB0byB0aGUgcGFnZSBvYmplY3RcbiAgICogQHBhcmFtIHtQYWdlfSBwYWdlIC0gVGhlIGNocm9tZS1yZW1vdGUtaW50ZXJmYWNlLWV4dHJhIHBhZ2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVxdWVzdEV2ZW50ID0gJ3JlcXVlc3QnXVxuICAgKi9cbiAgYXR0YWNoIChwYWdlLCByZXF1ZXN0RXZlbnQgPSAncmVxdWVzdCcpIHtcbiAgICBwYWdlLnJlbW92ZUxpc3RlbmVyKHJlcXVlc3RFdmVudCwgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudClcbiAgICBwYWdlLm9uKHJlcXVlc3RFdmVudCwgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBEZXRhY2ggKHN0b3AgbGlzdGVuaW5nIGZvciByZXF1ZXN0IGV2ZW50cykgdGhlIHJlcXVlc3QgY2FwdHVyZXJlciBmcm9tIHRoZSBwYWdlIG9iamVjdFxuICAgKiBAcGFyYW0ge1BhZ2V9IHBhZ2UgLSBUaGUgcHVwcGV0ZWVyIHBhZ2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVxdWVzdEV2ZW50ID0gJ3JlcXVlc3QnXVxuICAgKi9cbiAgZGV0YWNoIChwYWdlLCByZXF1ZXN0RXZlbnQgPSAncmVxdWVzdCcpIHtcbiAgICBwYWdlLnJlbW92ZUxpc3RlbmVyKHJlcXVlc3RFdmVudCwgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBTZXRzIGFuIGludGVybmFsIGZsYWcgdG8gYmVnaW4gY2FwdHVyaW5nIG5ldHdvcmsgcmVxdWVzdHMuIENsZWFycyBBbnkgUHJldmlvdXNseSBDYXB0dXJlZCBSZXF1ZXN0IEluZm9ybWF0aW9uXG4gICAqL1xuICBzdGFydENhcHR1cmluZyAoKSB7XG4gICAgdGhpcy5fcmVxdWVzdEMgPSAwXG4gICAgdGhpcy5fcmVxdWVzdHMuY2xlYXIoKVxuICAgIHRoaXMuX2NhcHR1cmUgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgU2V0cyBhbiBpbnRlcm5hbCBmbGFnIHRvIHN0b3AgdGhlIGNhcHR1cmluZyBuZXR3b3JrIHJlcXVlc3RzXG4gICAqL1xuICBzdG9wQ2FwdHVyaW5nICgpIHtcbiAgICB0aGlzLl9jYXB0dXJlID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcC9AQGl0ZXJhdG9yXG4gICAqIEBkZXNjIEdldCBBbiBJdGVyYXRvciBPdmVyIFRoZSBSZXF1ZXN0cyBDYXB0dXJlZFxuICAgKiBAcmV0dXJucyB7SXRlcmF0b3I8UmVxdWVzdD59XG4gICAqL1xuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMudmFsdWVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBSZW1vdmUgQWxsIFJlcXVlc3RzXG4gICAqL1xuICBjbGVhciAoKSB7XG4gICAgdGhpcy5fcmVxdWVzdEMgPSAwXG4gICAgdGhpcy5fcmVxdWVzdHMuY2xlYXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtBcnJheTxSZXF1ZXN0Pn1cbiAgICovXG4gIHJlcXVlc3RzICgpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9yZXF1ZXN0cy52YWx1ZXMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtJdGVyYXRvcjxSZXF1ZXN0Pn1cbiAgICovXG4gIGl0ZXJhdGVSZXF1ZXN0cyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzLnZhbHVlcygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZXF1ZXN0fSByXG4gICAqL1xuICByZXF1ZXN0V2lsbEJlU2VudCAocikge1xuICAgIGlmICh0aGlzLl9jYXB0dXJlKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0cy5zZXQodGhpcy5fcmVxdWVzdEMrKywgcilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7Q1JJRXh0cmFSZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gQ1JJRXh0cmFSZXF1ZXN0Q2FwdHVyZXJcbiIsImNvbnN0IFJlcXVlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi9yZXF1ZXN0SGFuZGxlcicpXG5cbi8qKlxuICogQGV4dGVuZHMge1JlcXVlc3RIYW5kbGVyfVxuICogQGRlc2MgVGhlIHJlbW90ZSBlbGVjdHJvbiByZXF1ZXN0IGNoYXB0dXJlciB0byB1c2UgYWxvbmcgc2lkZSB7QGxpbmsgRWxlY3Ryb25XQVJDR2VuZXJhdG9yfVxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB7QGxpbmsgYXR0YWNofSBhbmQge0BsaW5rIG1heWJlTmV0d29ya01lc3NhZ2V9IGZvciBzZXR1cCBpbmZvcm1hdGlvblxuICogQ29udHJvbGxlZCB2aWEge0BsaW5rIHN0YXJ0Q2FwdHVyaW5nfSBhbmQge0BsaW5rIHN0b3BDYXB0dXJpbmd9XG4gKiBAc2VlIGh0dHBzOi8vZWxlY3Ryb24uYXRvbS5pby9kb2NzL2FwaS9kZWJ1Z2dlci9cbiAqIEBzZWUgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L05ldHdvcmtcbiAqL1xuY2xhc3MgRWxlY3Ryb25SZXF1ZXN0Q2FwdHVyZXIgZXh0ZW5kcyBSZXF1ZXN0SGFuZGxlciB7XG4gIC8qKlxuICAgKiBAZGVzYyBDcmVhdGUgYSBuZXcgRWxlY3Ryb25SZXF1ZXN0Q2FwdHVyZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICB0aGlzLm1heWJlTmV0d29ya01lc3NhZ2UgPSB0aGlzLm1heWJlTmV0d29ya01lc3NhZ2UuYmluZCh0aGlzKVxuICAgIC8qKiBAaWdub3JlICovXG4gICAgdGhpcy5hdHRhY2ggPSB0aGlzLmF0dGFjaC5iaW5kKHRoaXMpXG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICB0aGlzLnJlcXVlc3RXaWxsQmVTZW50ID0gdGhpcy5yZXF1ZXN0V2lsbEJlU2VudC5iaW5kKHRoaXMpXG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICB0aGlzLnJlc3BvbnNlUmVjZWl2ZWQgPSB0aGlzLnJlc3BvbnNlUmVjZWl2ZWQuYmluZCh0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEF0dGFjaCB0byB0aGUgZGVidWdnZXIge0BsaW5rIHJlcXVlc3RXaWxsQmVTZW50fSBhbmQge0BsaW5rIHJlc3BvbnNlUmVjZWl2ZWR9XG4gICAqIEBwYXJhbSB7T2JqZWN0fSB3Y0RlYnVnZ2VyIC0gdGhlIGRlYnVnZ2VyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbi5hdG9tLmlvL2RvY3MvYXBpL2RlYnVnZ2VyL1xuICAgKi9cbiAgYXR0YWNoICh3Y0RlYnVnZ2VyKSB7XG4gICAgd2NEZWJ1Z2dlci5vbignbWVzc2FnZScsIChldmVudCwgbWV0aG9kLCBwYXJhbXMpID0+IHtcbiAgICAgIGlmIChtZXRob2QgPT09ICdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50Jykge1xuICAgICAgICB0aGlzLnJlcXVlc3RXaWxsQmVTZW50KHBhcmFtcylcbiAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkJykge1xuICAgICAgICB0aGlzLnJlc3BvbnNlUmVjZWl2ZWQocGFyYW1zKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmF0aGVyIHRoYW4gYWRkaW5nIGFuIGFkZGl0aW9uYWwgbGlzdGVuZXIgdG8gdGhlIGRlYnVnZ2VyIHBhc3MgdGhlIHR3byByZWxldmFudCBwYXJhbWV0ZXJzXG4gICAqIG9mIHRoZSBsaXN0ZW5lciB0byB0aGlzIG1ldGhvZC4gVXNlZnVsIGlmIHlvdSBhcmUgYWxyZWFkeSBsaXN0ZW5pbmcgdG8gc29tZSBvdGhlciBldmVudC5cbiAgICoge0BsaW5rIGF0dGFjaH0sIHtAbGluayByZXF1ZXN0V2lsbEJlU2VudH0gYW5kIHtAbGluayByZXNwb25zZVJlY2VpdmVkfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIHRoZSBldmVudCBtZXRob2RcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnRcbiAgICogQHNlZSBodHRwczovL2VsZWN0cm9uLmF0b20uaW8vZG9jcy9hcGkvZGVidWdnZXIvXG4gICAqL1xuICBtYXliZU5ldHdvcmtNZXNzYWdlIChtZXRob2QsIHBhcmFtcykge1xuICAgIGlmIChtZXRob2QgPT09ICdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50Jykge1xuICAgICAgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudChwYXJhbXMpXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlUmVjZWl2ZWQocGFyYW1zKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtFbGVjdHJvblJlcXVlc3RDYXB0dXJlcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBFbGVjdHJvblJlcXVlc3RDYXB0dXJlclxuIiwiY29uc3QgUmVxdWVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3JlcXVlc3RIYW5kbGVyJylcblxuLyoqXG4gKiBAZXh0ZW5kcyB7UmVxdWVzdEhhbmRsZXJ9XG4gKi9cbmNsYXNzIFB1cHBldGVlckNEUFJlcXVlc3RDYXB0dXJlciBleHRlbmRzIFJlcXVlc3RIYW5kbGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P0NEUFNlc3Npb259IFtjbGllbnRdIC0gVGhlIENEUFNlc3Npb24gY2xpZW50IHRvIGJlIGF0dGFjaGVkIHRvXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoY2xpZW50KSB7XG4gICAgc3VwZXIoKVxuICAgIC8qKiBAaWdub3JlICovXG4gICAgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudCA9IHRoaXMucmVxdWVzdFdpbGxCZVNlbnQuYmluZCh0aGlzKVxuICAgIC8qKiBAaWdub3JlICovXG4gICAgdGhpcy5yZXNwb25zZVJlY2VpdmVkID0gdGhpcy5yZXNwb25zZVJlY2VpdmVkLmJpbmQodGhpcylcbiAgICB0aGlzLmF0dGFjaChjbGllbnQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtDRFBTZXNzaW9ufSBjbGllbnQgLSBUaGUgQ0RQU2Vzc2lvbiBjbGllbnQgdG8gYmUgYXR0YWNoZWQgdG9cbiAgICovXG4gIGF0dGFjaCAoY2xpZW50KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoY2xpZW50KSB7XG4gICAgICBjbGllbnQub24oJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQnLCB0aGlzLnJlcXVlc3RXaWxsQmVTZW50KVxuICAgICAgY2xpZW50Lm9uKCdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLCB0aGlzLnJlc3BvbnNlUmVjZWl2ZWQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Q0RQU2Vzc2lvbn0gY2xpZW50IC0gVGhlIENEUFNlc3Npb24gY2xpZW50IHRvIGRldGFjaCBmcm9tXG4gICAqL1xuICBkZXRhY2ggKGNsaWVudCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKCdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JywgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudClcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcignTmV0d29yay5yZXNwb25zZVJlY2VpdmVkJywgdGhpcy5yZXNwb25zZVJlY2VpdmVkKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtQdXBwZXRlZXJDRFBSZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gUHVwcGV0ZWVyQ0RQUmVxdWVzdENhcHR1cmVyXG4iLCIvKipcbiAqIEBkZXNjIFB1cHBldGVlciBSZXF1ZXN0IENhcHR1cmVyXG4gKi9cbmNsYXNzIFB1cHBldGVlclJlcXVlc3RDYXB0dXJlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gez9QYWdlfSBbcGFnZV0gLSBUaGUgcHVwcGV0ZWVyIHBhZ2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVxdWVzdEV2ZW50ID0gJ3JlcXVlc3QnXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKHBhZ2UsIHJlcXVlc3RFdmVudCA9ICdyZXF1ZXN0Jykge1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRvIENhcHR1cmUgUmVxdWVzdHMgT3IgTm90IFRvIENhcHR1cmUgUmVxdWVzdHNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX2NhcHR1cmUgPSB0cnVlXG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBBIGxpc3Qgb2YgcmVxdWVzdHMgbWFkZVxuICAgICAqIEB0eXBlIHtNYXA8aW50LFJlcXVlc3Q+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fcmVxdWVzdHMgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9yZXF1ZXN0QyA9IDBcblxuICAgIC8qKiBAaWdub3JlICovXG4gICAgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudCA9IHRoaXMucmVxdWVzdFdpbGxCZVNlbnQuYmluZCh0aGlzKVxuICAgIGlmIChwYWdlKSB7XG4gICAgICB0aGlzLmF0dGFjaChwYWdlLCByZXF1ZXN0RXZlbnQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEF0dGFjaCAoc3RhcnQgbGlzdGVuaW5nIGZvciByZXF1ZXN0IGV2ZW50cykgdGhlIHJlcXVlc3QgY2FwdHVyZXJlciB0byB0aGUgcGFnZSBvYmplY3RcbiAgICogQHBhcmFtIHtQYWdlfSBwYWdlIC0gVGhlIHB1cHBldGVlciBwYWdlIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlcXVlc3RFdmVudCA9ICdyZXF1ZXN0J11cbiAgICovXG4gIGF0dGFjaCAocGFnZSwgcmVxdWVzdEV2ZW50ID0gJ3JlcXVlc3QnKSB7XG4gICAgcGFnZS5yZW1vdmVMaXN0ZW5lcihyZXF1ZXN0RXZlbnQsIHRoaXMucmVxdWVzdFdpbGxCZVNlbnQpXG4gICAgcGFnZS5vbihyZXF1ZXN0RXZlbnQsIHRoaXMucmVxdWVzdFdpbGxCZVNlbnQpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgRGV0YWNoIChzdG9wIGxpc3RlbmluZyBmb3IgcmVxdWVzdCBldmVudHMpIHRoZSByZXF1ZXN0IGNhcHR1cmVyZXIgZnJvbSB0aGUgcGFnZSBvYmplY3RcbiAgICogQHBhcmFtIHtQYWdlfSBwYWdlIC0gVGhlIHB1cHBldGVlciBwYWdlIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlcXVlc3RFdmVudCA9ICdyZXF1ZXN0J11cbiAgICovXG4gIGRldGFjaCAocGFnZSwgcmVxdWVzdEV2ZW50ID0gJ3JlcXVlc3QnKSB7XG4gICAgcGFnZS5yZW1vdmVMaXN0ZW5lcihyZXF1ZXN0RXZlbnQsIHRoaXMucmVxdWVzdFdpbGxCZVNlbnQpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgU2V0cyBhbiBpbnRlcm5hbCBmbGFnIHRvIGJlZ2luIGNhcHR1cmluZyBuZXR3b3JrIHJlcXVlc3RzLiBDbGVhcnMgQW55IFByZXZpb3VzbHkgQ2FwdHVyZWQgUmVxdWVzdCBJbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhcnRDYXB0dXJpbmcgKCkge1xuICAgIHRoaXMuX3JlcXVlc3RDID0gMFxuICAgIHRoaXMuX3JlcXVlc3RzLmNsZWFyKClcbiAgICB0aGlzLl9jYXB0dXJlID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFNldHMgYW4gaW50ZXJuYWwgZmxhZyB0byBzdG9wIHRoZSBjYXB0dXJpbmcgbmV0d29yayByZXF1ZXN0c1xuICAgKi9cbiAgc3RvcENhcHR1cmluZyAoKSB7XG4gICAgdGhpcy5fY2FwdHVyZSA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXAvQEBpdGVyYXRvclxuICAgKiBAZGVzYyBHZXQgQW4gSXRlcmF0b3IgT3ZlciBUaGUgUmVxdWVzdHMgQ2FwdHVyZWRcbiAgICogQHJldHVybnMge0l0ZXJhdG9yPFJlcXVlc3Q+fVxuICAgKi9cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzLnZhbHVlcygpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmVtb3ZlIEFsbCBSZXF1ZXN0c1xuICAgKi9cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMuX3JlcXVlc3RDID0gMFxuICAgIHRoaXMuX3JlcXVlc3RzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8UmVxdWVzdD59XG4gICAqL1xuICByZXF1ZXN0cyAoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fcmVxdWVzdHMudmFsdWVzKCkpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7SXRlcmF0b3I8UmVxdWVzdD59XG4gICAqL1xuICBpdGVyYXRlUmVxdWVzdHMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0cy52YWx1ZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVxdWVzdH0gclxuICAgKi9cbiAgcmVxdWVzdFdpbGxCZVNlbnQgKHIpIHtcbiAgICBpZiAodGhpcy5fY2FwdHVyZSkge1xuICAgICAgdGhpcy5fcmVxdWVzdHMuc2V0KHRoaXMuX3JlcXVlc3RDKyssIHIpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlclJlcXVlc3RDYXB0dXJlcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBQdXBwZXRlZXJSZXF1ZXN0Q2FwdHVyZXJcbiIsImNvbnN0IFJlcXVlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi9yZXF1ZXN0SGFuZGxlcicpXG5cbi8qKlxuICogQGV4dGVuZHMge1JlcXVlc3RIYW5kbGVyfVxuICogQGRlc2MgVGhlIHJlbW90ZSBjaHJvbWUgcmVxdWVzdCBjaGFwdHVyZXIgdG8gdXNlIGFsb25nIHNpZGUge0BsaW5rIFJlbW90ZUNocm9tZVdBUkNHZW5lcmF0b3J9XG4gKiBUaGUgb25seSBzZXR1cCByZXF1aXJlZCBpcyB0byBwYXNzIHRoZSBjaHJvbWUtcmVtb3RlLWludGVyZmFjZSBOZXR3b3JrIG9iamVjdFxuICogQ29udHJvbGxlZCB2aWEge0BsaW5rIHN0YXJ0Q2FwdHVyaW5nfSBhbmQge0BsaW5rIHN0b3BDYXB0dXJpbmd9XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJ1cy1hbmQvY2hyb21lLXJlbW90ZS1pbnRlcmZhY2VcbiAqIEBzZWUgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L05ldHdvcmtcbiAqL1xuY2xhc3MgUmVtb3RlQ2hyb21lUmVxdWVzdENhcHR1cmVyIGV4dGVuZHMgUmVxdWVzdEhhbmRsZXIge1xuICAvKipcbiAgICogQHBhcmFtIHs/T2JqZWN0fSBbbmV0d29ya10gLSBUaGUgY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UgTmV0d29yayBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZXR3b3JrKSB7XG4gICAgc3VwZXIoKVxuICAgIC8qKiBAaWdub3JlICovXG4gICAgdGhpcy5yZXF1ZXN0V2lsbEJlU2VudCA9IHRoaXMucmVxdWVzdFdpbGxCZVNlbnQuYmluZCh0aGlzKVxuICAgIC8qKiBAaWdub3JlICovXG4gICAgdGhpcy5yZXNwb25zZVJlY2VpdmVkID0gdGhpcy5yZXNwb25zZVJlY2VpdmVkLmJpbmQodGhpcylcbiAgICB0aGlzLmF0dGFjaChuZXR3b3JrKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZXR3b3JrIC0gVGhlIGNocm9tZS1yZW1vdGUtaW50ZXJmYWNlIE5ldHdvcmsgb2JqZWN0IHRvIGJlIGF0dGFjaGVkIHRvXG4gICAqL1xuICBhdHRhY2ggKG5ldHdvcmspIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChuZXR3b3JrKSB7XG4gICAgICBuZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50KHRoaXMucmVxdWVzdFdpbGxCZVNlbnQpXG4gICAgICBuZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQodGhpcy5yZXNwb25zZVJlY2VpdmVkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gY2RwQ2xpZW50IC0gVGhlIGNocm9tZS1yZW1vdGUtaW50ZXJmYWNlIGNsaWVudCBvYmplY3QgdG8gZGV0YWNoIGZyb21cbiAgICovXG4gIGRldGFjaCAoY2RwQ2xpZW50KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoY2RwQ2xpZW50KSB7XG4gICAgICBjZHBDbGllbnQucmVtb3ZlTGlzdGVuZXIoJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQnLCB0aGlzLnJlcXVlc3RXaWxsQmVTZW50KVxuICAgICAgY2RwQ2xpZW50LnJlbW92ZUxpc3RlbmVyKCdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLCB0aGlzLnJlc3BvbnNlUmVjZWl2ZWQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge1JlbW90ZUNocm9tZVJlcXVlc3RDYXB0dXJlcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZW1vdGVDaHJvbWVSZXF1ZXN0Q2FwdHVyZXJcbiIsImNvbnN0IFdBUkNXcml0ZXJCYXNlID0gcmVxdWlyZSgnLi93YXJjV3JpdGVyQmFzZScpXG5jb25zdCB7IFNUQVRVU19DT0RFUyB9ID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCB7IFVSTCB9ID0gcmVxdWlyZSgndXJsJylcbmNvbnN0IHsgQ1JMRiB9ID0gcmVxdWlyZSgnLi93YXJjRmllbGRzJylcbmNvbnN0IHtcbiAgc3RyaW5naWZ5SGVhZGVycyxcbiAgc3RyaW5naWZ5UmVxdWVzdEhlYWRlcnNcbn0gPSByZXF1aXJlKCcuLi91dGlscy9oZWFkZXJTZXJpYWxpemVycycpXG5jb25zdCB7IG5vR1osIHJlcGxhY2VDb250ZW50TGVuIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbi8qKlxuICogQGRlc2MgV0FSQyBHZW5lcmF0b3IgZm9yIHVzZSB3aXRoIHJlcXVlc3RcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3QvcmVxdWVzdC1wcm9taXNlXG4gKiBAZXh0ZW5kcyB7V0FSQ1dyaXRlckJhc2V9XG4gKi9cbmNsYXNzIFJlcXVlc3RMaWJXQVJDR2VuZXJhdG9yIGV4dGVuZHMgV0FSQ1dyaXRlckJhc2Uge1xuICAvKipcbiAgICogQGRlc2MgQ3JlYXRlIGEgbmV3IFJlcXVlc3QgbGliIFdBUkMgZ2VuZXJhdG9yXG4gICAqIEBwYXJhbSB7P1dBUkNGaWxlT3B0c30gW2RlZmF1bHRPcHRzXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGRlZmF1bHRPcHRzKSB7XG4gICAgc3VwZXIoZGVmYXVsdE9wdHMpXG4gICAgLyoqXG4gICAgICogQHR5cGUge1VSTH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX1VQID0gbmV3IFVSTCgnYWJvdXQ6YmxhbmsnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEdlbmVyYXRlcyBhIFdBUkMgcmVjb3JkLiBOZWVkcyB0aGUgZm9sbG93aW5nIHJlcXVlc3QgbGliIGRlZmF1bHRzOlxuICAgKiBycC5kZWZhdWx0cyh7XG4gICAqICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWUsXG4gICAqICAgc2ltcGxlOiBmYWxzZVxuICAgKiB9KVxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV2FyY0VudHJ5IChyZXNwKSB7XG4gICAgLy8gZ2VuZXJhdGUgdGhlIEhUVFAgcmVxdWVzdCB0byBwdXQgaW4gdGhlIFdBUkMgaGVhZGVyc1xuICAgIGxldCByZXFIVFRQID0gJydcbiAgICB0aGlzLl9VUC5ocmVmID0gcmVzcC5yZXF1ZXN0LmhyZWZcbiAgICBpZiAodGhpcy5fVVAuc2VhcmNoICE9PSAnJykge1xuICAgICAgcmVxSFRUUCArPSBgJHtyZXNwLnJlcXVlc3QubWV0aG9kfSAke3RoaXMuX1VQLnBhdGhuYW1lfSR7XG4gICAgICAgIHRoaXMuX1VQLnNlYXJjaFswXVxuICAgICAgfSR7dGhpcy5fVVAuc2VhcmNoUGFyYW1zfSBIVFRQLzEuMSR7Q1JMRn1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcUhUVFAgKz0gYCR7cmVzcC5yZXF1ZXN0Lm1ldGhvZH0gJHt0aGlzLl9VUC5wYXRobmFtZX0gSFRUUC8xLjEke0NSTEZ9YFxuICAgIH1cbiAgICByZXFIVFRQICs9IHN0cmluZ2lmeVJlcXVlc3RIZWFkZXJzKHJlc3AucmVxdWVzdC5oZWFkZXJzLCB0aGlzLl9VUC5ob3N0KVxuXG4gICAgLy8gaWYgd2UgbWFkZSBhIFBPU1QgcmVxdWVzdCwgbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvbnRlbnRcbiAgICBjb25zdCBwZCA9IHJlc3AucmVxdWVzdC5tZXRob2QgPT09ICdQT1NUJyA/IHJlc3AucmVxdWVzdC5ib2R5IDogbnVsbFxuXG4gICAgLy8gbm93LCB3cml0ZSBvdXIgcmVxdWVzdCByZWNvcmRcbiAgICBhd2FpdCB0aGlzLndyaXRlUmVxdWVzdFJlY29yZCh0aGlzLl9VUC5ocmVmLCByZXFIVFRQLCBwZClcblxuICAgIC8vIHdyaXRlIHRoZSByZXNwb25zZSAtIHdlIHdvbid0IGhhdmUgYSByZXNwIGlmIHdlJ3ZlIG9ubHkgbWFkZSBhIHJlcXVlc3RcbiAgICBsZXQgcmVzSFRUUCA9IGBIVFRQLzEuMSAke3Jlc3Auc3RhdHVzQ29kZX0gJHtcbiAgICAgIFNUQVRVU19DT0RFU1tyZXNwLnN0YXR1c0NvZGVdXG4gICAgfSAke0NSTEZ9JHtzdHJpbmdpZnlIZWFkZXJzKHJlc3AuaGVhZGVycyl9YFxuICAgIGxldCBib2R5ID0gcmVzcC5ib2R5XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgcmVzSFRUUCA9IHJlc0hUVFAucmVwbGFjZShub0daLCAnJylcbiAgICAgIHJlc0hUVFAgPSByZXNIVFRQLnJlcGxhY2UoXG4gICAgICAgIHJlcGxhY2VDb250ZW50TGVuLFxuICAgICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgJ3V0ZjgnKX0ke0NSTEZ9YFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVjb3JkIGhhcyAwIGNvbnRlbnRcbiAgICAgIHJlc0hUVFAgPSByZXNIVFRQLnJlcGxhY2UocmVwbGFjZUNvbnRlbnRMZW4sIGBDb250ZW50LUxlbmd0aDogMCR7Q1JMRn1gKVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLndyaXRlUmVzcG9uc2VSZWNvcmQodGhpcy5fVVAuaHJlZiwgcmVzSFRUUCwgYm9keSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RMaWJXQVJDR2VuZXJhdG9yXG4iLCIvLyBUb3AgbGV2ZWwgZmlsZSBpcyBqdXN0IGEgbWl4aW4gb2Ygc3VibW9kdWxlcyAmIGNvbnN0YW50c1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduICAgID0gcmVxdWlyZSgnLi9saWIvdXRpbHMvY29tbW9uJykuYXNzaWduO1xuXG52YXIgZGVmbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvZGVmbGF0ZScpO1xudmFyIGluZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2luZmxhdGUnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuL2xpYi96bGliL2NvbnN0YW50cycpO1xuXG52YXIgcGFrbyA9IHt9O1xuXG5hc3NpZ24ocGFrbywgZGVmbGF0ZSwgaW5mbGF0ZSwgY29uc3RhbnRzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYWtvO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2RlZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvZGVmbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgbXNnICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gcmVxdWlyZSgnLi96bGliL3pzdHJlYW0nKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG5cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcblxudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxudmFyIFpfREVGTEFURUQgID0gODtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKipcbiAqIGNsYXNzIERlZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tkZWZsYXRlXV0sXG4gKiBbW2RlZmxhdGVSYXddXSBhbmQgW1tnemlwXV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBEZWZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tEZWZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gZGVmbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbRGVmbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgY29tcHJlc3NlZCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0RlZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0RlZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBhcnJheSBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGUoc3RybSwgX21vZGUpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gWl9GSU5JU0ggfHwgX21vZGUgPT09IFpfU1lOQ19GTFVTSCkpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLm9uRGF0YShzdHJpbmdzLmJ1ZjJiaW5zdHJpbmcodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKTtcblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBaX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IFpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IFpfU1lOQ19GTFVTSCkge1xuICAgIHRoaXMub25FbmQoWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3V0cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnIHx8IG1zZ1tkZWZsYXRvci5lcnJdOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG52YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96bGliL2d6aGVhZGVyJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGRlbi5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICpcbiAqIFVuY29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbSW5mbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbSW5mbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGluZmxhdGUgPSBuZXcgcGFrby5JbmZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBpbmZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBpbmZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChpbmZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBJbmZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDAsXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgLy8gRm9yY2Ugd2luZG93IHNpemUgZm9yIGByYXdgIGRhdGEsIGlmIG5vdCBzZXQgZGlyZWN0bHksXG4gIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMgPSAtMTU7IH1cbiAgfVxuXG4gIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikgJiZcbiAgICAgICEob3B0aW9ucyAmJiBvcHRpb25zLndpbmRvd0JpdHMpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7XG4gIH1cblxuICAvLyBHemlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHlcbiAgLy8gZm9yIGRlZmxhdGUuIFNvLCBpZiB3aW5kb3cgc2l6ZSBub3Qgc2V0LCBmb3JjZSBpdCB0byBtYXggd2hlbiBnemlwIHBvc3NpYmxlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPiAxNSkgJiYgKG9wdC53aW5kb3dCaXRzIDwgNDgpKSB7XG4gICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGFcbiAgICAvLyBiaXQgNCAoMzIpIC0+IGF1dG9kZXRlY3QgZ3ppcC9kZWZsYXRlXG4gICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkge1xuICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtICAgPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC53aW5kb3dCaXRzXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7XG5cbiAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG5cbiAgLy8gU2V0dXAgZGljdGlvbmFyeVxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdC5kaWN0aW9uYXJ5ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBvcHQuZGljdGlvbmFyeSA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9XG4gICAgaWYgKG9wdC5yYXcpIHsgLy9JbiByYXcgbW9kZSB3ZSBuZWVkIHRvIHNldCB0aGUgZGljdGlvbmFyeSBlYXJseVxuICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgb3B0LmRpY3Rpb25hcnkpO1xuICAgICAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGFcbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFucyBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0luZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG4gIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyO1xuXG4gIC8vIEZsYWcgdG8gcHJvcGVybHkgcHJvY2VzcyBaX0JVRl9FUlJPUiBvbiB0ZXN0aW5nIGluZmxhdGUgY2FsbFxuICAvLyB3aGVuIHdlIGNoZWNrIHRoYXQgYWxsIG91dHB1dCBkYXRhIHdhcyBmbHVzaGVkLlxuICB2YXIgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBjLlpfRklOSVNIIDogYy5aX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBPbmx5IGJpbmFyeSBzdHJpbmdzIGNhbiBiZSBkZWNvbXByZXNzZWQgb24gcHJhY3RpY2VcbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5iaW5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZShzdHJtLCBjLlpfTk9fRkxVU0gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzID09PSBjLlpfTkVFRF9ESUNUICYmIGRpY3Rpb25hcnkpIHtcbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3Rpb25hcnkpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gYy5aX09LO1xuICAgICAgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5uZXh0X291dCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBjLlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICAgIG5leHRfb3V0X3V0ZjggPSBzdHJpbmdzLnV0Zjhib3JkZXIoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpO1xuXG4gICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpO1xuXG4gICAgICAgICAgLy8gbW92ZSB0YWlsXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsO1xuICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH1cblxuICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vIG1vcmUgaW5wdXQgZGF0YSwgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaW50ZXJuYWwgaW5mbGF0ZSBidWZmZXJzXG4gICAgLy8gYXJlIGZsdXNoZWQuIFRoZSBvbmx5IHdheSB0byBkbyBpdCB3aGVuIGF2YWlsX291dCA9IDAgLSBydW4gb25lIG1vcmVcbiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JVRl9FUlJPUi5cbiAgICAvLyBIZXJlIHdlIHNldCBmbGFnIHRvIHByb2Nlc3MgdGhpcyBlcnJvciBwcm9wZXJseS5cbiAgICAvL1xuICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaFxuICAgIC8vIGxvZ2ljLlxuICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTtcblxuICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkge1xuICAgIF9tb2RlID0gYy5aX0ZJTklTSDtcbiAgfVxuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChjLlpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91dHB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBpbmZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBlaXRoZXIgYWZ0ZXIgeW91IHRlbGwgaW5mbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBjLlpfT0spIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gR2x1ZSAmIGNvbnZlcnQgaGVyZSwgdW50aWwgd2UgdGVhY2ggcGFrbyB0byBzZW5kXG4gICAgICAvLyB1dGY4IGFsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnIHx8IG1zZ1tpbmZsYXRvci5lcnJdOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..a349f4e --- /dev/null +++ b/index.html @@ -0,0 +1,54 @@ + + + + + + + + + Test WARC: + + + + + + diff --git a/index.js b/index.js index 98458e2..4761671 100755 --- a/index.js +++ b/index.js @@ -115,3 +115,5 @@ if (require('./lib/parsers/_canUseRecordIterator')) { */ exports.recordIterator = require('./lib/parsers/recordterator') } + + diff --git a/lib/parsers/autoWARCParser.js b/lib/parsers/autoWARCParser.js index 80a517e..33abb69 100644 --- a/lib/parsers/autoWARCParser.js +++ b/lib/parsers/autoWARCParser.js @@ -1,7 +1,6 @@ -const fs = require('fs-extra') +const getStream = require('../utils/getStream').getStream const zlib = require('zlib') const EventEmitter = require('eventemitter3') -const untildify = require('untildify') const WARCStreamTransform = require('./warcStreamTransform') const GzipDetector = require('./gzipDetector') const canUseRecordIterator = require('./_canUseRecordIterator') @@ -138,7 +137,7 @@ class AutoWARCParser extends EventEmitter { */ _getStream () { const isGz = GzipDetector.isGzippedSync(this._wp) - const stream = fs.createReadStream(untildify(this._wp)) + const stream = getStream(this._wp, true) if (isGz) return stream.pipe(zlib.createGunzip()) return stream } diff --git a/lib/parsers/gzipDetector.js b/lib/parsers/gzipDetector.js index 2e9b36a..9cafef9 100755 --- a/lib/parsers/gzipDetector.js +++ b/lib/parsers/gzipDetector.js @@ -1,5 +1,7 @@ -const fs = require('fs-extra') -const untildify = require('untildify') +//import { fs, untildify } from '../utils/getStream' +const gs = require('../utils/getStream'); +const fs = gs.fs; +const untildify = gs.untildify; /** * @see https://en.wikipedia.org/wiki/Gzip diff --git a/lib/parsers/warcGzParser.js b/lib/parsers/warcGzParser.js index e0ed68d..ddc59fe 100755 --- a/lib/parsers/warcGzParser.js +++ b/lib/parsers/warcGzParser.js @@ -1,5 +1,4 @@ -const untildify = require('untildify') -const fs = require('fs-extra') +const getStream = require('../utils/getStream').getStream const zlib = require('zlib') const EventEmitter = require('eventemitter3') const WARCStreamTransform = require('./warcStreamTransform') @@ -54,7 +53,7 @@ class WARCGzParser extends EventEmitter { */ this[Symbol.asyncIterator] = () => { return recordIterator( - fs.createReadStream(this._wp).pipe(zlib.createGunzip()) + getStream(this._wp).pipe(zlib.createGunzip()) ) } } @@ -78,8 +77,7 @@ class WARCGzParser extends EventEmitter { } this._parsing = true start = true - fs - .createReadStream(untildify(this._wp)) + getStream(this._wp, true) .pipe(zlib.createGunzip()) .pipe(new WARCStreamTransform()) .on('data', this._onRecord) diff --git a/lib/parsers/warcParser.js b/lib/parsers/warcParser.js index 82bb46a..eed037b 100755 --- a/lib/parsers/warcParser.js +++ b/lib/parsers/warcParser.js @@ -1,5 +1,4 @@ -const untildify = require('untildify') -const fs = require('fs-extra') +const getStream = require('../utils/getStream').getStream const EventEmitter = require('eventemitter3') const WARCStreamTransform = require('./warcStreamTransform') const canUseRecordIterator = require('./_canUseRecordIterator') @@ -52,7 +51,7 @@ class WARCParser extends EventEmitter { * @returns {AsyncIterator} */ this[Symbol.asyncIterator] = () => { - return recordIterator(fs.createReadStream(this._wp)) + return recordIterator(getStream(this._wp)); } } } @@ -75,8 +74,7 @@ class WARCParser extends EventEmitter { } this._parsing = true start = true - fs - .createReadStream(untildify(this._wp)) + getStream(this._wp) .pipe(new WARCStreamTransform()) .on('data', this._onRecord) .on('error', this._onError) diff --git a/lib/utils/getStream.js b/lib/utils/getStream.js new file mode 100644 index 0000000..f843f1f --- /dev/null +++ b/lib/utils/getStream.js @@ -0,0 +1,28 @@ + +let fs = null; +let untildify = null; +let hasFS = null; + +try { + untildify = require('untildify') + fs = require('fs-extra') + hasFS = true; +} catch (e) { + hasFS = false; +} + +function getStream(wp, useUntildify) { + if (hasFS) { + if (useUntildify) { + wp = untildify(wp); + } + + return fs.createReadStream(wp); + } + + return wp; +} + +//module.exports = getStream; +export { getStream, fs, untildify }; + diff --git a/lib/writers/warcWriterBase.js b/lib/writers/warcWriterBase.js index 77e8ee3..1910e17 100755 --- a/lib/writers/warcWriterBase.js +++ b/lib/writers/warcWriterBase.js @@ -1,4 +1,4 @@ -const fs = require('fs-extra') +const fs = require('../utils/getStream').fs; const zlib = require('zlib') const Path = require('path') const uuid = require('uuid/v1') @@ -142,7 +142,10 @@ class WARCWriterBase extends EventEmitter { initWARC (warcPath, options) { this.opts = Object.assign({}, this.defaultOpts, options || {}) const wfp = ensureWARCFileName(warcPath, this.opts.gzip) - if (this.opts.appending) { + + if (!fs) { + this._warcOutStream = warcPath + } else if (this.opts.appending) { this._warcOutStream = fs.createWriteStream(wfp, { flags: 'a', encoding: 'utf8' diff --git a/package.json b/package.json index dabba3e..60880fb 100755 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "node": ">=8.0.0" }, "scripts": { + "build": "webpack --mode production", "lint": "standard | snazzy", "fix-lint": "standard --fix", "pretty": "prettier-standard lib/**/*.js", @@ -48,7 +49,8 @@ "fs-extra": "^7.0.1", "lodash": "^4.17.11", "untildify": "^3.0.3", - "uuid": "^3.3.2" + "uuid": "^3.3.2", + "webpack": "^4.32.2" }, "devDependencies": { "@types/fs-extra": "^5.0.5", @@ -71,7 +73,8 @@ "puppeteer": "^1.12.2", "rxjs": "^6.4.0", "snazzy": "^8.0.0", - "standard": "^12.0.1" + "standard": "^12.0.1", + "webpack-cli": "^3.3.2" }, "ava": { "files": [ diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..9b02cef --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,21 @@ +const path = require('path'); +const webpack = require('webpack'); + +module.exports = { + mode: 'production', + entry: { + 'nodewarc': './index.js', + }, + devtool: 'inline-source-map', + output: { + path: path.resolve(__dirname, 'dist'), + filename: '[name].js', + libraryTarget: 'global', + globalObject: 'self' + }, + + plugins: [ + new webpack.IgnorePlugin(/fs/), + new webpack.IgnorePlugin(/untildify/), + ], +}; diff --git a/yarn.lock b/yarn.lock index 0aecd23..f0d0b7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -439,6 +439,162 @@ dependencies: "@types/node" "*" +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + abab@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -449,6 +605,11 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + acorn-globals@^1.0.4: version "1.0.9" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" @@ -471,6 +632,11 @@ acorn@^6.0.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.2.tgz#6a459041c320ab17592c6317abbfdf4bbaa98ca4" integrity sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg== +acorn@^6.0.5: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + agent-base@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" @@ -478,11 +644,21 @@ agent-base@^4.1.0: dependencies: es6-promisify "^5.0.0" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + ajv-keywords@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= +ajv-keywords@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -503,6 +679,16 @@ ajv@^6.0.1, ajv@^6.5.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.1.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -557,7 +743,7 @@ append-transform@^1.0.0: dependencies: default-require-extensions "^2.0.0" -aproba@^1.0.3: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== @@ -642,6 +828,15 @@ arrify@^1.0.0, arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -654,6 +849,14 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -664,6 +867,11 @@ async-each@^1.0.0: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" integrity sha1-GdOGodntxufByF04iu28xW0zYC0= +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -881,6 +1089,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -901,6 +1114,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary-extensions@^1.0.0: version "1.12.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" @@ -911,6 +1129,11 @@ bluebird@^3.5.3: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -937,7 +1160,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.0, braces@^2.3.1: +braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -953,16 +1176,119 @@ braces@^2.3.0, braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +cacache@^11.3.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1064,7 +1390,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^2.4.2: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1125,6 +1451,25 @@ cheerio@1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" +chokidar@^2.0.2: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + chokidar@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -1145,11 +1490,18 @@ chokidar@^2.0.4: optionalDependencies: fsevents "^1.2.2" -chownr@^1.0.1: +chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== +chrome-trace-event@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + chunkd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-1.0.0.tgz#4ead4a3704bcce510c4bb4d4a8be30c557836dd1" @@ -1170,6 +1522,14 @@ ci-parallel-vars@^1.0.0: resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" @@ -1298,6 +1658,11 @@ commander@^2.18.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +commander@^2.19.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -1362,11 +1727,23 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" @@ -1384,6 +1761,18 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -1399,6 +1788,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" @@ -1406,6 +1803,29 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-spawn@^4: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -1434,6 +1854,23 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -1473,6 +1910,11 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1480,6 +1922,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" @@ -1643,6 +2090,19 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + detect-indent@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" @@ -1664,6 +2124,15 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + dir-glob@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" @@ -1695,6 +2164,11 @@ dom-serializer@0, dom-serializer@~0.1.0: domelementtype "~1.1.1" entities "~1.1.1" +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + domelementtype@1: version "1.2.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479" @@ -1752,6 +2226,16 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -1760,6 +2244,19 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + email-addresses@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.0.2.tgz#a31280d19baf86669840a0aa45be1d7f6e7df315" @@ -1770,6 +2267,11 @@ emittery@^0.4.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d" integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ== +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + empower-core@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-1.2.0.tgz#ce3fb2484d5187fa29c23fba8344b0b2fdf5601c" @@ -1778,13 +2280,22 @@ empower-core@^1.2.0: call-signature "0.0.2" core-js "^2.0.0" -end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" @@ -1800,6 +2311,13 @@ equal-length@^1.0.0: resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" integrity sha1-IcoRLUirJLTh5//A5TOdMf38J0w= +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -2200,6 +2718,19 @@ eventemitter3@^3.1.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -2239,6 +2770,13 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -2334,6 +2872,11 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -2417,6 +2960,16 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -2427,6 +2980,14 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2461,6 +3022,14 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + fs-extra@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" @@ -2504,6 +3073,16 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2517,6 +3096,14 @@ fsevents@^1.2.2: nan "^2.9.2" node-pre-gyp "^0.10.0" +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -2626,6 +3213,26 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + globals@^11.1.0, globals@^11.7.0: version "11.8.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" @@ -2777,6 +3384,22 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + hasha@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39" @@ -2784,6 +3407,22 @@ hasha@^3.0.0: dependencies: is-stream "^1.0.1" +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" @@ -2821,6 +3460,11 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + https-proxy-agent@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" @@ -2852,6 +3496,16 @@ iconv-lite@^0.4.17, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + ignore-by-default@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -2897,6 +3551,11 @@ indent-string@^3.0.0, indent-string@^3.2.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2905,11 +3564,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -2934,6 +3598,11 @@ inquirer@^5.2.0: strip-ansi "^4.0.0" through "^2.3.6" +interpret@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -3224,11 +3893,16 @@ is-utf8@^0.2.1: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -3377,7 +4051,7 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-parse-better-errors@^1.0.1: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -3407,6 +4081,13 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" @@ -3518,6 +4199,20 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +loader-runner@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -3669,6 +4364,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + make-dir@^1.0.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -3676,6 +4378,11 @@ make-dir@^1.0.0, make-dir@^1.3.0: dependencies: pify "^3.0.0" +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -3729,6 +4436,15 @@ md5-o-matic@^0.1.1: resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + mem@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.1.0.tgz#aeb9be2d21f47e78af29e4ac5978e8afa2ca5b8a" @@ -3738,6 +4454,14 @@ mem@^4.0.0: mimic-fn "^1.0.0" p-is-promise "^2.0.0" +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" @@ -3760,7 +4484,7 @@ merge-source-map@^1.1.0: dependencies: source-map "^0.6.1" -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -3787,6 +4511,14 @@ microtime@^3.0.0: node-addon-api "^1.2.0" node-gyp-build "^3.8.0" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -3809,6 +4541,16 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -3854,6 +4596,22 @@ minizlib@^1.1.0: dependencies: minipass "^2.2.1" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -3862,13 +4620,25 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3894,6 +4664,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + nan@^2.9.2: version "2.11.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" @@ -3930,6 +4705,11 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" +neo-async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -3945,6 +4725,35 @@ node-gyp-build@^3.8.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.8.0.tgz#0f57efeb1971f404dfcbfab975c284de7c70f14a" integrity sha512-bYbpIHyRqZ7sVWXxGpz8QIRug5JZc/hzZH4GbdT9HTZi6WmKCZ8GLvP8OZ9TTiIBvwPFKgtGrlWQSXDAvYdsPw== +node-libs-browser@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" + integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "0.0.4" + node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" @@ -3961,6 +4770,22 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -3986,6 +4811,11 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-url@^1.0.0: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" @@ -4165,6 +4995,11 @@ ora@^3.0.0: strip-ansi "^4.0.0" wcwidth "^1.0.1" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -4270,6 +5105,32 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -4290,6 +5151,11 @@ parse-ms@^2.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.0.0.tgz#7b3640295100caf3fa0100ccceb56635b62f9d62" integrity sha512-AddiXFSLLCqj+tCRJ9MrUtHZB4DWojO3tk0NVZ+g5MaMQHF2+p2ktqxuoXyPFLljz/aUK0Nfhd/uGWnhXVXEyA== +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" @@ -4307,6 +5173,11 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -4358,6 +5229,17 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -4486,6 +5368,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + progress@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" @@ -4496,6 +5383,11 @@ progress@^2.0.1: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" @@ -4509,6 +5401,11 @@ proxy-from-env@^1.0.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4519,6 +5416,26 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -4527,7 +5444,21 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^1.4.1: +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -4564,11 +5495,36 @@ query-string@^4.1.0: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -4621,17 +5577,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@1.1: - version "1.1.13" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" - integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -4644,6 +5590,16 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^3.0.2, readable-stream@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a" @@ -4653,7 +5609,7 @@ readable-stream@^3.0.2, readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.0.0: +readdirp@^2.0.0, readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -4831,6 +5787,14 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" @@ -4878,13 +5842,21 @@ rimraf@^2.2.8, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.0.5" -rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -4897,6 +5869,13 @@ run-parallel@^1.1.2: resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + rxjs@^5.5.2: version "5.5.12" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" @@ -4911,7 +5890,7 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -4933,6 +5912,15 @@ sax@^1.1.4, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" @@ -4950,6 +5938,11 @@ serialize-error@^2.1.0: resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= +serialize-javascript@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" + integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -4975,6 +5968,19 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -5064,6 +6070,11 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" @@ -5083,6 +6094,14 @@ source-map-support@^0.5.10: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.10: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -5163,6 +6182,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + stack-utils@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" @@ -5208,6 +6234,33 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + stream-mock@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/stream-mock/-/stream-mock-1.2.0.tgz#f68b5523c0e1cfe619ea09d7d1097290f405b96a" @@ -5215,6 +6268,11 @@ stream-mock@1.2.0: dependencies: babel-runtime "^6.26.0" +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -5237,6 +6295,13 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string_decoder@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -5325,7 +6390,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -5381,6 +6446,11 @@ taffydb@2.7.3: resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.3.tgz#2ad37169629498fca5bc84243096d3cde0ec3a34" integrity sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ= +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + tar@^4: version "4.4.6" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" @@ -5401,6 +6471,31 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +terser-webpack-plugin@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4" + integrity sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg== + dependencies: + cacache "^11.3.2" + find-cache-dir "^2.0.0" + is-wsl "^1.1.0" + loader-utils "^1.2.3" + schema-utils "^1.0.0" + serialize-javascript "^1.7.0" + source-map "^0.6.1" + terser "^4.0.0" + webpack-sources "^1.3.0" + worker-farm "^1.7.0" + +terser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.0.0.tgz#ef356f6f359a963e2cc675517f21c1c382877374" + integrity sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + test-exclude@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" @@ -5416,6 +6511,14 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -5431,6 +6534,13 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + dependencies: + setimmediate "^1.0.4" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -5438,6 +6548,11 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -5513,6 +6628,11 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -5588,6 +6708,20 @@ uniq@^1.0.1: resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + dependencies: + imurmurhash "^0.1.4" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -5632,6 +6766,11 @@ upath@^1.0.5: resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" @@ -5667,6 +6806,14 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -5677,11 +6824,30 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +v8-compile-cache@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -5699,6 +6865,22 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= + dependencies: + indexof "0.0.1" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -5711,6 +6893,61 @@ webidl-conversions@^2.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY= +webpack-cli@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.2.tgz#aed2437b0db0a7faa2ad28484e166a5360014a91" + integrity sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA== + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.0" + findup-sync "^2.0.0" + global-modules "^1.0.0" + import-local "^2.0.0" + interpret "^1.1.0" + loader-utils "^1.1.0" + supports-color "^5.5.0" + v8-compile-cache "^2.0.2" + yargs "^12.0.5" + +webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.32.2: + version "4.32.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.32.2.tgz#3639375364a617e84b914ddb2c770aed511e5bc8" + integrity sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^1.0.0" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + well-known-symbols@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" @@ -5728,7 +6965,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.0: +which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -5759,6 +6996,13 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -5814,12 +7058,12 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= -xtend@^4.0.0, xtend@^4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -"y18n@^3.2.1 || ^4.0.0": +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==